diff --git a/.github/ISSUE_TEMPLATE/Bug_report.md b/.github/ISSUE_TEMPLATE/Bug_report.md index 24fd3c52d7..37f5895da5 100644 --- a/.github/ISSUE_TEMPLATE/Bug_report.md +++ b/.github/ISSUE_TEMPLATE/Bug_report.md @@ -1,7 +1,7 @@ --- name: Bug report about: Report an issue -labels: ":beetle: bug" +labels: ":mag: needs triage" --- **Describe your issue**: @@ -12,11 +12,13 @@ labels: ":beetle: bug" 2. 3. -**NETworkManager version**: +**NETworkManager version**: -**Windows version**: +- [ ] Portable -**.NET-Framework version**: +**Windows version** (like 10.0.x.x): + +**.NET version** (like 6.0.x): **Screenshots** diff --git a/.github/appveyor.yml b/.github/appveyor.yml deleted file mode 100644 index 46246d3f0c..0000000000 --- a/.github/appveyor.yml +++ /dev/null @@ -1,13 +0,0 @@ -image: Visual Studio 2022 -branches: - only: - - master -configuration: Release -platform: x64 -before_build: - - dotnet restore .\Source\NETworkManager.sln -build_script: - - dotnet build .\Source\NETworkManager.sln --configuration Release --no-restore -#install: -# - ps: Invoke-WebRequest -Uri 'https://dot.net/v1/dotnet-install.ps1' -UseBasicParsing -OutFile "$env:temp\dotnet-install.ps1" -# - ps: '& $env:temp\dotnet-install.ps1 -Architecture x64 -Version "5.0.302" -InstallDir "$env:ProgramFiles\dotnet"' diff --git a/.github/dependabot.yml b/.github/dependabot.yml index a41a294570..67cfdb6963 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,10 +1,27 @@ version: 2 updates: -- package-ecosystem: nuget +- package-ecosystem: "nuget" directory: "/Source" schedule: - interval: daily - open-pull-requests-limit: 25 - target-branch: master - labels: - - ":heavy_check_mark: dependencies" + interval: weekly + target-branch: main + commit-message: + prefix: "Dependency (dependabot/nuget):" +- package-ecosystem: "dotnet-sdk" + directory: "/Source" + ignore: + - dependency-name: dotnet-sdk + update-types: + - "version-update:semver-major" + schedule: + interval: weekly + target-branch: main + commit-message: + prefix: "Dependency (dependabot/dotnet-sdk):" +- package-ecosystem: "npm" + directory: "/Website" + schedule: + interval: weekly + target-branch: main + commit-message: + prefix: "Dependency (dependabot/npm):" diff --git a/.github/mergify.yml b/.github/mergify.yml index 8643658977..00b70a10ec 100644 --- a/.github/mergify.yml +++ b/.github/mergify.yml @@ -1,31 +1,29 @@ -pull_request_rules: - - name: automatic merge for pull request based on label +pull_request_rules: + - name: automatic merge for pull request based on label and ci success conditions: - label~=LGTM$ - - check-success=Analyze (csharp) - - check-success=CodeQL - check-success=continuous-integration/appveyor/pr actions: merge: - method: merge - - name: automatic merge for Dependabot pull requests + method: squash + - name: automatic merge for Dependabot pull requests based on ci success conditions: - - author=dependabot[bot] + - author=dependabot[bot] - check-success=continuous-integration/appveyor/pr actions: merge: - method: merge - - name: automatic merge for Transifex pull requests + method: squash + - name: automatic merge for Transifex pull requests based on ci success conditions: - author=transifex-integration[bot] - check-success=continuous-integration/appveyor/pr actions: merge: - method: merge - - name: automatic merge for ImgBot pull requests + method: squash + - name: automatic merge for ImgBot pull requests based on ci success conditions: - author=imgbot[bot] - check-success=continuous-integration/appveyor/pr actions: merge: - method: merge + method: squash diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 9edec4c0ea..c0570eda3a 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,15 +1,32 @@ -Fixes #{Replace this with the issue number} +## Changes proposed in this pull request -**Please provide some details about this pull request:** -- - - +## Related issue(s) + +- Fixes #{issue number} + +## Copilot generated summary + +Provide a Copilot generated summary of the changes in this pull request. + +
+Copilot summary + +{generated summary} + +
+ +## To-Do + +- [ ] Update [documentation](https://github.com/BornToBeRoot/NETworkManager/tree/main/Website/docs) to reflect this changes +- [ ] Update [changelog](https://github.com/BornToBeRoot/NETworkManager/tree/main/Website/docs/changelog) to reflect this changes ---- +## Contributing **By submitting this pull request, I confirm the following:** -- [ ] I have read and understood the [contributing guidelines](https://github.com/BornToBeRoot/NETworkManager/blob/master/CONTRIBUTING.md) and the [code of conduct](https://github.com/BornToBeRoot/NETworkManager/blob/master/CODE_OF_CONDUCT.md). -- [ ] I have have added my name, username or email to the [contributors](https://github.com/BornToBeRoot/NETworkManager/blob/master/Contributors.md) list or don't want to. -- [ ] The code or ressource is compatible with the [GNU General Public License v3.0](https://github.com/BornToBeRoot/NETworkManager/blob/master/LICENSE). \ No newline at end of file +- [ ] I have read and understood the [contributing guidelines](https://github.com/BornToBeRoot/NETworkManager/blob/main/CONTRIBUTING.md) and the [code of conduct](https://github.com/BornToBeRoot/NETworkManager/blob/main/CODE_OF_CONDUCT.md). +- [ ] I have have added my name, username or email to the [contributors](https://github.com/BornToBeRoot/NETworkManager/blob/main/CONTRIBUTORS.md) list or don't want to. +- [ ] The code or resource is compatible with the [GNU General Public License v3.0](https://github.com/BornToBeRoot/NETworkManager/blob/main/LICENSE). diff --git a/.github/stale.yml b/.github/stale.yml index 8a2cca3342..492b4d29ea 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -7,6 +7,7 @@ exemptLabels: - ":bug: bug" - ":rocket: feature-request" - ":book: documentation" + - ":hammer_and_wrench: code-cleanup" # Label to use when marking an issue as stale staleLabel: ":watch: stale" # Comment to post when marking an issue as stale. Set to `false` to disable diff --git a/.github/transifex.yml b/.github/transifex.yml new file mode 100644 index 0000000000..5d543e14ac --- /dev/null +++ b/.github/transifex.yml @@ -0,0 +1,30 @@ +git: + filters: + - filter_type: file + # all supported i18n types: https://docs.transifex.com/formats + file_format: RESX + source_language: en_US + source_file: Source/NETworkManager.Localization/Resources/Strings.resx + # path expression to translation files, must contain placeholder + translation_files_expression: "Source/NETworkManager.Localization/Resources/Strings..resx" + settings: + # https://www.codedigest.com/CodeDigest/207-Get-All-Language-Country-Code-List-for-all-Culture-in-C---ASP-Net.aspx + language_mapping: + cs_CZ: cs-CZ + de_DE: de-DE + es_ES: es-ES + fr_FR: fr-FR + hu_HU: hu-HU + it_IT: it-IT + ja_JP: ja-JP + ko_KR: ko-KR + lb: lb-LU + nl_NL: nl-NL + pl_PL: pl-PL + pt_BR: pt-BR + ru_RU: ru-RU + sl_SI: sl-SI + sv_SE: sv-SE + uk_UA: uk-UA + zh_CN: zh-CN + zh_TW: zh-TW diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml deleted file mode 100644 index c9bd3ea1e5..0000000000 --- a/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,39 +0,0 @@ -name: "CodeQL" - -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] - schedule: - - cron: '29 7 * * 1' - -jobs: - analyze: - name: Analyze - # runs-on: windows-latest - runs-on: windows-2019 - # Ignore dependabot, ImgBot and transifex-integration - if: github.actor!= 'dependabot[bot]' && - github.actor!= 'imgbot[bot]' && - github.actor!= 'transifex-integration[bot]' - - strategy: - fail-fast: false - matrix: - language: [ 'csharp' ] - - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - - name: Initialize CodeQL - uses: github/codeql-action/init@v1 - with: - languages: ${{ matrix.language }} - - - name: Autobuild - uses: github/codeql-action/autobuild@v1 - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 0000000000..12335a41d9 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,45 @@ +name: "CodeQL" + +on: + workflow_dispatch: + #push: + # branches: [ "main", "stable-*" ] + #pull_request: + # branches: [ "main", "stable-*" ] + schedule: + - cron: '38 21 * * 6' + +jobs: + analyze: + name: Analyze + runs-on: ${{ 'windows-latest' }} + timeout-minutes: ${{ 360 }} + permissions: + # required for all workflows + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'csharp', 'javascript-typescript' ] + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + submodules: 'true' + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + + # Autobuild attempts to build any compiled languages (C/C++, C#, Go, Java, or Swift). + - name: Autobuild + uses: github/codeql-action/autobuild@v3 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 + with: + category: "/language:${{matrix.language}}" diff --git a/.github/workflows/deploy_website.yml b/.github/workflows/deploy_website.yml new file mode 100644 index 0000000000..febc08c42e --- /dev/null +++ b/.github/workflows/deploy_website.yml @@ -0,0 +1,61 @@ +name: GitHub Pages + +on: + workflow_dispatch: + release: + # Rebuild so the download page picks up the newly published (pre-)release. + types: [published] + push: + branches: + - main + paths: + - '.github/workflows/deploy_website.yml' + - 'Website/**' + pull_request: + +jobs: + build-and-deploy-website: + name: "Build and Deploy Website" + runs-on: ubuntu-latest + permissions: + contents: write + concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + defaults: + run: + working-directory: Website + steps: + - uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 22 + + - name: Get yarn cache + id: yarn-cache + run: echo "YARN_CACHE_DIR=$(yarn cache dir)" >> "${GITHUB_OUTPUT}" + + - name: Cache dependencies + uses: actions/cache@v4 + with: + path: ${{ steps.yarn-cache.outputs.YARN_CACHE_DIR }} + key: ${{ runner.os }}-Website-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-Website- + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: Build website + run: yarn build + env: + # Used by scripts/fetch-release-data.mjs to raise the GitHub API rate limit. + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v4 + if: github.ref == 'refs/heads/main' + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./Website/build diff --git a/.github/workflows/label.yml b/.github/workflows/label.yml new file mode 100644 index 0000000000..7ff9c4fdf6 --- /dev/null +++ b/.github/workflows/label.yml @@ -0,0 +1,25 @@ +name: Assign label to PRs + +on: + pull_request_target: + types: [opened, reopened] + +jobs: + assign-dependencies-label: + name: Assign dependencies label + runs-on: ubuntu-latest + if: contains(fromJSON('["dependabot[bot]", "transifex-integration[bot]", "imgbot[bot]"]'), github.event.pull_request.user.login) + permissions: + issues: write + pull-requests: write + steps: + - name: Assign label + uses: actions/github-script@v7 + with: + script: | + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.payload.pull_request.number, + labels: [':heavy_check_mark: dependencies'] + }); diff --git a/.github/workflows/milestone.yml b/.github/workflows/milestone.yml new file mode 100644 index 0000000000..cf6abe3078 --- /dev/null +++ b/.github/workflows/milestone.yml @@ -0,0 +1,38 @@ +name: Assign milestone to PRs + +on: + pull_request_target: + types: [opened, reopened] + +jobs: + assign-milestone: + name: Assign next-release milestone + runs-on: ubuntu-latest + if: contains(fromJSON('["dependabot[bot]", "transifex-integration[bot]", "imgbot[bot]", "Copilot", "BornToBeRoot"]'), github.event.pull_request.user.login) + permissions: + issues: write + pull-requests: write + steps: + - name: Assign milestone + uses: actions/github-script@v7 + with: + script: | + const milestones = await github.rest.issues.listMilestones({ + owner: context.repo.owner, + repo: context.repo.repo, + state: 'open' + }); + + const milestone = milestones.data.find(m => m.title === 'next-release'); + + if (!milestone) { + core.warning('Milestone "next-release" not found'); + return; + } + + await github.rest.issues.update({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.payload.pull_request.number, + milestone: milestone.number + }); diff --git a/.gitignore b/.gitignore index 34a01d5371..69effb9625 100644 --- a/.gitignore +++ b/.gitignore @@ -254,4 +254,7 @@ paket-files/ # Custom Build/ -.vscode/ \ No newline at end of file +.vscode/ +*.exe +*.dll +ToDo.md \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000..9041dc8f9f --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "Source/3rdparty/Dragablz"] + path = Source/3rdparty/Dragablz + url = https://github.com/BornToBeRoot/Dragablz diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000000..cd2c49a3a9 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +# Ignore mdx files +**/*.mdx diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000000..91018c22a0 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,492 @@ +# NETworkManager - Repository Guide for AI Agents + +## Repository Overview + +**NETworkManager** is a comprehensive, enterprise-ready network management and troubleshooting application built with C# and WPF. It provides a unified interface for network administrators and IT professionals to manage, monitor, and troubleshoot network infrastructure using tools like Remote Desktop, PuTTY (SSH, Telnet, Serial, etc.), PowerShell (k9s, WSL, etc.), TigerVNC, network scanners (IP scanner, Port scanner, WiFi Analyzer), and diagnostic utilities (Ping monitor, traceroute, etc.). + +- **Repository**: https://github.com/BornToBeRoot/NETworkManager +- **License**: GNU General Public License v3 +- **Primary Language**: C# (.NET 10) +- **UI Framework**: WPF (Windows Presentation Foundation) with `MahApps.Metro` +- **Documentation**: Docusaurus-based website and documentation at https://borntoberoot.net/NETworkManager +- **Platform**: Windows (x64) + +## Project Structure + +### Source Code Organization + +The repository is organized into multiple C# projects following a modular architecture: + +``` +REPOSITORY_ROOT/ +├── Source/ # Main source code directory +│ ├── NETworkManager/ # Main WPF application (Views, ViewModels, Controls) +│ ├── NETworkManager.Models/ # Business logic and data models +│ ├── NETworkManager.Utilities/ # Helper classes and utilities +│ ├── NETworkManager.Utilities.WPF/ # WPF-specific utilities +│ ├── NETworkManager.Converters/ # WPF value converters +│ ├── NETworkManager.Validators/ # Input validation logic +│ ├── NETworkManager.Controls/ # Custom WPF controls +│ ├── NETworkManager.Localization/ # Internationalization resources +│ ├── NETworkManager.Settings/ # Application settings management +│ ├── NETworkManager.Profiles/ # Profile management +│ ├── NETworkManager.Update/ # Update functionality +│ ├── NETworkManager.Documentation/ # Documentation resources +│ ├── NETworkManager.Setup/ # WiX installer project +│ └── 3rdparty/ # Third-party dependencies (e.g., Dragablz) +│ └── (managed-manually) # NOTE: Maintained manually — AI agents MUST NOT modify this directory +├── Website/ # Docusaurus documentation website +├── Scripts/ # Build and automation scripts +│ ├── Create-FileHash.ps1 # Generate file hashes +│ ├── Create-FlagFromSVG.ps1 # Create flag images +│ ├── Create-OUIListFromWeb.ps1 # Update OUI (MAC vendor) list +│ ├── Create-PortListFromWeb.ps1 # Update port list database +│ ├── Create-WhoisServerListFromWebAndWhois.ps1 # Update WHOIS servers +│ └── PreBuildEventCommandLine.ps1 # Pre-build automation +├── Chocolatey/ # Chocolatey package definition +├── WinGet/ # WinGet package manifest +└── Images/ # Application icons and images +``` + +### Key Statistics + +- **650+ C# source files** across multiple projects +- **150+ XAML files** for UI definitions +- **12 distinct project modules** in the solution +- **64+ documentation pages** in Docusaurus format +- **17 supported languages** for localization + +## Technology Stack + +### Application (.NET/WPF) + +**Core Framework**: +- **.NET 10.0** (SDK version: 10.0.100) +- **WPF** (Windows Presentation Foundation) for UI +- **Windows Forms** integration for specific controls +- **Target**: Windows 10.0.22621.0 (Windows 11) + +**UI Framework & Design**: +- **MahApps.Metro** - Modern UI toolkit providing Metro-style controls and themes +- **MahApps.Metro.IconPacks** - Icon libraries (FontAwesome, Material, Modern, Octicons) +- **MahApps.Metro.SimpleChildWindow** - Dialog windows +- **Dragablz** - Tearable/draggable tab control +- **GongSolutions.Wpf.DragDrop** - Drag and drop framework +- **LoadingIndicators.WPF** - Loading animations +- **ControlzEx** - Shared WPF controls + +**Architecture Pattern**: +- **MVVM (Model-View-ViewModel)** pattern + - Views: XAML files in `Source/NETworkManager/Views/` + - ViewModels: C# classes in `Source/NETworkManager/ViewModels/` + - Models: Business logic in `Source/NETworkManager.Models/` + +**Key Libraries**: +- **Lextm.SharpSnmpLib** - SNMP protocol implementation +- **DnsClient** - DNS lookups +- **IPNetwork2** - Network and subnet calculations +- **PSDiscoveryProtocol** - LLDP/CDP network discovery (PowerShell module embedded) +- **AirspaceFixer** - WPF/WinForms interop fixes +- **log4net** - Logging framework +- **LiveCharts.Wpf** - Charts and graphs +- **Microsoft.Web.WebView2** - WebView2 control for web content +- **Microsoft.PowerShell.SDK** - PowerShell integration +- **Microsoft.Xaml.Behaviors.Wpf** - Behaviors for XAML +- **Newtonsoft.Json** - JSON serialization and deserialization + +**Build Tools**: +- **NetBeauty2** - Dependency organization +- **WiX Toolset** - MSI installer creation + +### Website (Docusaurus) + +**Documentation Stack**: +- **Docusaurus** - Static site generator +- **React** - UI framework +- **@mdx-js/react** - MDX support +- **react-image-gallery** - Image galleries +- **Prism** - Code syntax highlighting + +**Website Structure**: +``` +Website/ +├── docs/ # Documentation pages +│ ├── application/ # Feature documentation +│ ├── changelog/ # Version history +│ ├── faq/ # Frequently asked questions +│ └── settings/ # Settings documentation +├── blog/ # Blog posts +├── src/ # React components and pages +├── static/ # Static assets (images, files) +├── docusaurus.config.js # Site configuration +├── sidebars.js # Documentation sidebar structure +├── package.json # npm/yarn dependencies +└── yarn.lock # Yarn lockfile +``` + +## Development Setup + +### Prerequisites + +1. **For Application Development**: + - [.NET 10.x SDK](https://dotnet.microsoft.com/download/dotnet/10.0) + - [Visual Studio 2022](https://visualstudio.microsoft.com/) or later with: + - `.NET desktop development` workload + - `Universal Windows Platform development` workload + - Alternative: [JetBrains Rider](https://www.jetbrains.com/rider/) (still requires UWP workload via VS Installer) + +2. **For Website Development**: + - [Node.js](https://nodejs.org/) (LTS version recommended) + - npm or yarn package manager (yarn is used in CI/CD) + +### Building the Application + +**Clone with Submodules**: +```powershell +git clone https://github.com/BornToBeRoot/NETworkManager.git +cd NETworkManager +git submodule update --init --recursive +``` + +**Build via Visual Studio/Rider**: +- Open `Source/NETworkManager.sln` +- Build the solution (F6 or Build → Build Solution) + +**Build via Command Line**: +```powershell +dotnet restore .\Source\NETworkManager.sln +dotnet build .\Source\NETworkManager.sln --configuration Release --no-restore +``` + +### Building the Website + +```bash +cd Website +npm install # Install dependencies (or use yarn install) +npm start # Start development server (or use yarn start) +npm run build # Build for production (or use yarn build) +``` + +The website is deployed to GitHub Pages at: https://borntoberoot.net/NETworkManager + +## CI/CD Pipeline + +**Primary Build System**: AppVeyor (configuration in `appveyor.yml`) +- Builds on Visual Studio 2022 image +- Installs .NET 10.0.100 SDK +- Restores NuGet packages +- Builds Release configuration for x64 platform +- Version format: `yyyy.M.d.0` (date-based) +- Artifacts are signed via [SignPath.io](https://signpath.io/) +- Released to GitHub Releases + +**GitHub Actions Workflows**: +- **CodeQL Analysis** (`.github/workflows/codeql.yml`): + - Automated security scanning + - Analyzes C# and JavaScript/TypeScript code + - Runs weekly and on-demand via workflow_dispatch + +- **Website Deployment** (`.github/workflows/deploy_website.yml`): + - Builds and deploys Docusaurus website to GitHub Pages + - Triggers on changes to `Website/` directory + - Uses Node.js 20 with yarn for build + +**Automation & Bots**: +- **Dependabot** (`.github/dependabot.yml`): + - Weekly updates for NuGet packages, .NET SDK, and npm packages + - Automatic PR creation for dependency updates + +- **Mergify** (`.github/mergify.yml`): + - Auto-merges PRs with `LGTM` label after AppVeyor CI passes + - Auto-merges Dependabot, Transifex, and ImgBot PRs after CI success + +- **Transifex Integration** (`.github/transifex.yml`): + - Automated translation synchronization + - Syncs RESX files between GitHub and Transifex + +- **Stale Bot** (`.github/stale.yml`): + - Marks issues inactive for 30 days as stale + - Closes stale issues after 7 days + - Excludes bugs, feature requests, and documentation issues + +## Contributing Areas + +### Code Contributions + +**Primary Areas**: +1. **Network Tools** (`Source/NETworkManager.Models/`): + - IP Scanner, Port Scanner, Ping Monitor + - DNS Lookup, Traceroute, WHOIS + - WiFi Analyzer, LLDP/CDP Capture + +2. **Remote Access** (`Source/NETworkManager/Controls/`): + - Remote Desktop (RDP) integration + - PuTTY (SSH, Telnet, Serial) integration + - PowerShell and TigerVNC (VNC) controls + +3. **UI/UX** (`Source/NETworkManager/Views/` and `.xaml` files): + - WPF views following MVVM pattern + - MahApps.Metro styling + - Custom controls and converters + +4. **Settings & Profiles** (`Source/NETworkManager.Settings/`, `Source/NETworkManager.Profiles/`): + - Profile management and encryption + - Application settings + +### Documentation Contributions + +**Documentation Types**: +1. **User Documentation** (`Website/docs/`): + - Feature guides in `docs/application/` + - FAQ entries in `docs/faq/` + - Settings documentation in `docs/settings/` + +2. **Changelog** (`Website/docs/changelog/`): + - Version release notes + +3. **Code Documentation**: + - XML documentation comments in C# code + - README files in project directories + +### Translation + +- **Platform**: [Transifex](https://app.transifex.com/BornToBeRoot/NETworkManager/dashboard/) +- **Resources**: `Source/NETworkManager.Localization/` +- **17 languages supported**: cs-CZ, de-DE, es-ES, fr-FR, hu-HU, it-IT, ja-JP, ko-KR, nl-NL, pl-PL, pt-BR, ru-RU, sl-SI, sv-SE, uk-UA, zh-CN, zh-TW +- **Format**: RESX files +- **Integration**: Automated sync via `.github/transifex.yml` + +## Code Style and Conventions + +### C# Code Style + +- **EditorConfig**: `.editorconfig` in `Source/` directory defines coding standards +- **Naming Conventions**: + - PascalCase for classes, methods, properties + - camelCase for private fields + - Prefix interfaces with `I` + - Suffix ViewModels with `ViewModel` + +- **MVVM Pattern**: + - ViewModels inherit from `PropertyChangedBase` or implement `INotifyPropertyChanged` + - Commands use `RelayCommand` from utilities + - Views bind to ViewModels via DataContext + +### XAML Style + +- **MahApps.Metro Controls**: Use Metro-styled controls +- **Icon Packs**: Use `IconPacks` namespace for icons +- **Resource Dictionaries**: Shared styles in `Resources/` directory +- **Naming**: Use `x:Name` for elements that need code-behind access + +### Documentation Style + +- **Markdown**: All documentation in `.md` or `.mdx` format +- **Code Blocks**: Use syntax highlighting with language specifiers +- **Screenshots**: Place in `Website/static/img/` +- **Links**: Use relative links for internal documentation + +## Testing Strategy + +- **Manual Testing**: Primary testing approach +- **Build Verification**: AppVeyor CI ensures builds succeed +- **Real-World Testing**: Pre-release versions on GitHub Releases +- **Community Feedback**: GitHub Issues for bug reports + +## Package Distribution + +**Installation Methods**: +1. **Direct Download**: GitHub Releases (Setup, Portable, Archive) +2. **Chocolatey**: `choco install networkmanager` +3. **WinGet**: `winget install BornToBeRoot.NETworkManager` +4. **Evergreen**: PowerShell module for automation + +**Package Formats**: +- **Setup (MSI)**: WiX installer in `Source/NETworkManager.Setup/` +- **Portable**: ZIP file +- **Archive**: ZIP file + +## Security Considerations + +1. **Code Signing**: + - Free signing via SignPath.io and SignPath Foundation + - All official binaries and installers are signed + +2. **Profile Encryption**: + - Supports encrypted profile files + - Protects sensitive credentials and connection data + +3. **Privacy**: + - No telemetry or data collection by default + - Optional third-party services (GitHub API, ipify.org, ip-api.com) + +4. **Security Reports**: + - See `SECURITY.md` for vulnerability reporting process + +## Important Files + +- **`Source/NETworkManager.sln`**: Main Visual Studio solution +- **`Source/GlobalAssemblyInfo.cs`**: Shared assembly version info +- **`Source/global.json`**: .NET SDK version specification (10.0.100) +- **`Source/.editorconfig`**: C# code style configuration +- **`appveyor.yml`**: AppVeyor CI/CD configuration +- **`.github/workflows/codeql.yml`**: CodeQL security analysis workflow +- **`.github/workflows/deploy_website.yml`**: Website deployment workflow +- **`.github/dependabot.yml`**: Dependabot configuration +- **`.github/mergify.yml`**: Mergify auto-merge configuration +- **`.github/transifex.yml`**: Transifex translation sync configuration +- **`.github/stale.yml`**: Stale issue bot configuration +- **`.gitmodules`**: Git submodule configuration (Dragablz) +- **`Website/docusaurus.config.js`**: Documentation site configuration +- **`CONTRIBUTING.md`**: Contribution guidelines +- **`LICENSE`**: GPL v3 license +- **`README.md`**: Repository overview and quick start + +## Useful Commands + +### Application Development + +```powershell +# Restore dependencies +dotnet restore .\Source\NETworkManager.sln + +# Build (Release) +dotnet build .\Source\NETworkManager.sln --configuration Release + +# Clean solution +dotnet clean .\Source\NETworkManager.sln + +# Run application +.\Source\NETworkManager\bin\Release\net10.0-windows10.0.22621.0\win-x64\NETworkManager.exe +``` + +### Website Development + +```bash +# Install dependencies +cd Website && npm install # or yarn install + +# Start dev server (http://localhost:3000) +npm start # or yarn start + +# Build static site +npm run build # or yarn build + +# Serve production build +npm run serve # or yarn serve + +# Clear cache +npm run clear # or yarn clear +``` + +### Git Operations + +```powershell +# Update submodules +git submodule update --init --recursive + +# Check status +git status + +# View changes +git diff +``` + +## Common Development Scenarios + +### Adding a New Network Tool + +1. Create model in `Source/NETworkManager.Models/Network/` +2. Create ViewModel in `Source/NETworkManager/ViewModels/` +3. Create View (XAML) in `Source/NETworkManager/Views/` +4. Register in `MainWindow.xaml.cs` or appropriate host +5. Add localization strings +6. Update documentation in `Website/docs/application/` + +### Adding a New Setting + +1. Add property to settings model in `Source/NETworkManager.Settings/` +2. Update settings ViewModel +3. Add UI control in settings View +4. Add validation if needed +5. Update settings documentation + +### Updating Documentation + +1. Edit markdown files in `Website/docs/` +2. Add images to `Website/static/img/` +3. Update `Website/sidebars.js` if adding new sections +4. Test locally with `npm start` +5. Submit pull request + +## Resources + +- **Documentation**: https://borntoberoot.net/NETworkManager +- **GitHub Issues**: https://github.com/BornToBeRoot/NETworkManager/issues +- **GitHub Discussions**: https://github.com/BornToBeRoot/NETworkManager/discussions +- **Transifex**: https://app.transifex.com/BornToBeRoot/NETworkManager/dashboard/ +- **AppVeyor CI**: https://ci.appveyor.com/project/BornToBeRoot/NETworkManager + +## Key Contacts & Community + +- **Maintainer**: BornToBeRoot +- **Contributors**: See `CONTRIBUTORS.md` +- **Code of Conduct**: `CODE_OF_CONDUCT.md` (Contributor Covenant) +- **Support**: GitHub Issues and Discussions + +## Architecture Highlights + +### MVVM Implementation + +- **Data Binding**: Extensive use of WPF data binding +- **Commands**: `RelayCommand` pattern for user actions +- **Property Change Notification**: `INotifyPropertyChanged` via `PropertyChangedBase` +- **Dependency Injection**: Manual dependency management (no DI container) + +### UI Theming + +- **MahApps.Metro Themes**: Light/Dark theme support +- **Accent Colors**: Customizable accent colors +- **Resource Dictionaries**: Shared styles and templates +- **Live Theme Switching**: Runtime theme changes + +### Profile System + +- **Profile Files**: XML-based profile storage +- **Encryption**: AES encryption for sensitive data +- **Groups**: Hierarchical organization +- **Import/Export**: Profile sharing capabilities + +### Embedded Tools Integration + +- **Remote Desktop**: Native RDP using `AxMSTSCLib`, `AxMsRdpClient10NotSafeForScripting` and `WindowsFormsHost` +- **PuTTY**: PuTTY window embedding / process hosting with `WindowsFormsHost` +- **PowerShell**: PowerShell window embedding / process hosting with `WindowsFormsHost` +- **VNC**: TigerVNC window embedding / process hosting with `WindowsFormsHost` + +## Tips for AI Agents + +1. **Respect MVVM**: Keep business logic in ViewModels and Models, not in code-behind +2. **Use MahApps Controls**: Prefer Metro controls over standard WPF controls +3. **Localization**: Always use resource strings, never hardcode text +4. **Follow Existing Patterns**: Study similar features before implementing new ones +5. **Update Documentation**: Changes to features should include doc updates +6. **Test on Real Networks**: Network tools require real network testing +7. **Version Management**: Assembly version is auto-generated in CI/CD +8. **Submodules**: Remember to init/update submodules (Dragablz in `Source/3rdparty/`) +9. **DO NOT Modify 3rdparty**: The `Source/3rdparty/` directory contains the Dragablz submodule and is maintained manually — AI agents MUST NOT modify this directory +10. **Automation Scripts**: Use scripts in `Scripts/` directory for updating lists (OUI, ports, WHOIS servers) +11. **Check CI Status**: Both AppVeyor (main build) and GitHub Actions (CodeQL, website) must pass +12. **Dependency Updates**: Dependabot automatically creates PRs for dependency updates + +## Glossary + +- **MVVM**: Model-View-ViewModel architectural pattern +- **WPF**: Windows Presentation Foundation (Microsoft's UI framework) +- **MahApps.Metro**: Modern UI toolkit for WPF applications +- **Dragablz**: Third-party tab control with drag/drop support +- **LLDP/CDP**: Link Layer Discovery Protocol / Cisco Discovery Protocol +- **SNMP**: Simple Network Management Protocol +- **RDP**: Remote Desktop Protocol +- **Docusaurus**: React-based static site generator +- **SignPath**: Code signing service for open source projects diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000000..eccbda68b2 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +See [AGENTS.md](AGENTS.md) for project guidelines and conventions. diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 1e64d33305..3bc84f3051 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -14,22 +14,22 @@ appearance, race, religion, or sexual identity and orientation. Examples of behavior that contributes to creating a positive environment include: -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members Examples of unacceptable behavior by participants include: -* The use of sexualized language or imagery and unwelcome sexual attention or - advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic - address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting +- The use of sexualized language or imagery and unwelcome sexual attention or + advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic + address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting ## Our Responsibilities @@ -55,7 +55,7 @@ further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at borntoberoot@mailbox.org. All +reported by contacting the project team at dev@borntoberoot.net. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c3caa1a8f1..4840019614 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,17 +2,17 @@ - You found a bug or have a feature request? Feel free to create a [new issue](https://github.com/BornToBeRoot/NETworkManager/issues/new/choose). - General questions can be discussed in the [GitHub discussions](https://github.com/BornToBeRoot/NETworkManager/discussions). -- If you contribute to the code, documentation or translation, you can add your name to the [contributors](https://github.com/BornToBeRoot/NETworkManager/blob/master/Contributors.md) list with a pull request. +- If you contribute to the code, documentation or translation, you can add your name to the [contributors](https://github.com/BornToBeRoot/NETworkManager/blob/main/CONTRIBUTORS.md) list with a pull request. ## Code - If you want to fix a bug or implement a new features, let me know in the issues that you are work on it. - Fork the repo, do your changes and send me a [pull request](https://github.com/BornToBeRoot/NETworkManager/pulls). ## Documentation -- The documentation is based on [Just the docs](https://github.com/pmarsceill/just-the-docs), hosted on GitHub Pages and published [here](https://borntoberoot.net/NETworkManager/). -- Fork the repo, do your changes in the `docs` folder and send me a pull request. You can also click on the `Edit this page on GitHub` in the footer of each documentation page. +- The documentation is based on [Docusaurus](https://docusaurus.io/), hosted on GitHub Pages and published [here](https://borntoberoot.net/NETworkManager/). +- Fork the repo, do your changes in the `Website` folder and send me a pull request. You can also click on the `Edit this page` in the footer of each documentation page. ## Translation -- Translation is hosted on [Transifex](https://www.transifex.com/BornToBeRoot/NETworkManager/). +- Translation is hosted on [Transifex](https://app.transifex.com/BornToBeRoot/NETworkManager/dashboard/). - If you want to join the language team as translator or reviewer, you need to have a Transifex account and join the team on Transifex. -- You can request a new language via Transifex (or with a [new issue](https://github.com/BornToBeRoot/NETworkManager/issues/new/choose)). +- You can request a new language via Transifex (or create a [new issue](https://github.com/BornToBeRoot/NETworkManager/issues/new/choose)). diff --git a/Contributors.md b/CONTRIBUTORS.md similarity index 88% rename from Contributors.md rename to CONTRIBUTORS.md index 60bf3e490c..ebc3e3ceb5 100644 --- a/Contributors.md +++ b/CONTRIBUTORS.md @@ -3,6 +3,7 @@ List of all contributors. ## Code / documentation on GitHub + - BornToBeRoot - UmutComlekci - MS-PC @@ -11,56 +12,72 @@ List of all contributors. - Freeman2016 - EBWeist - mdawsonuk +- labre_rdc +- Tyrix ## Translators / reviewers on Transifex **English** + - BornToBeRoot **German** + - BornToBeRoot **Chinese (China)** -- Bonelol + +- Bonelol - ccstorm - dockernes - pedoc - pu2287643 **Chinese (Taiwan)** + - echoapus - superalpha2008 **Dutch** -- Get_r3kt_by_Me + +- Get_r3kt_by_Me **French** + - f4alm - logounet **Hungarian** + - zoozley **Italian** + - bovirus - simone.ferrari **Polish** + - RafalNiewinski - Tomirad **Portuguese (Brazil)** + - ghroll - igorruckert **Russian** + - laxe24 **Slovenian** + - Jadran Rudec **Spanish** + - MS_PC **Korean** -- VenusGirl_비너스걸 + +- VenusGirl\_비너스걸 diff --git a/Chocolatey/networkmanager.nuspec b/Chocolatey/networkmanager.nuspec index e1b03864ec..de51d49a84 100644 --- a/Chocolatey/networkmanager.nuspec +++ b/Chocolatey/networkmanager.nuspec @@ -3,25 +3,31 @@ NETworkManager - 2022.2.22.0 + 2026.7.7.0 BornToBeRoot NETworkManager BornToBeRoot https://borntoberoot.net/NETworkManager - https://raw.githubusercontent.com/BornToBeRoot/NETworkManager/master/Images/NETworkManager.svg - https://github.com/BornToBeRoot/NETworkManager/blob/master/LICENSE + https://raw.githubusercontent.com/BornToBeRoot/NETworkManager/main/Images/NETworkManager.svg + https://github.com/BornToBeRoot/NETworkManager/blob/main/LICENSE false https://github.com/BornToBeRoot/NETworkManager - https://borntoberoot.net/NETworkManager/Documentation + https://github.com/BornToBeRoot/NETworkManager/tree/main/Chocolatey + https://borntoberoot.net/NETworkManager/docs/introduction https://github.com/BornToBeRoot/NETworkManager/issues - wifi ipscanner portscanner traceroute pingmonitor dns remotedesktop putty lldp - A powerful tool for managing networks and troubleshoot network problems! - A powerful tool for managing networks and troubleshoot network problems! + https://borntoberoot.net/NETworkManager/docs/changelog/2026-7-7-0 + wifi ipscanner portscanner traceroute pingmonitor dns remotedesktop rdp putty ssh + A powerful open-source tool for managing networks and troubleshooting network problems! + + A powerful open-source tool for managing networks and troubleshooting network problems! + + More infos: https://borntoberoot.net/NETworkManager/ + - + - \ No newline at end of file + diff --git a/Chocolatey/tools/chocolateyinstall.ps1 b/Chocolatey/tools/chocolateyinstall.ps1 index 9bb585ce48..8f5296e5ef 100644 --- a/Chocolatey/tools/chocolateyinstall.ps1 +++ b/Chocolatey/tools/chocolateyinstall.ps1 @@ -1,19 +1,21 @@ $ErrorActionPreference = 'Stop' -$toolsDir = "$(Split-Path -parent $MyInvocation.MyCommand.Definition)" -$url = 'https://github.com/BornToBeRoot/NETworkManager/releases/download/2022.2.22.0/NETworkManager_2022.2.22.0_Setup.exe' + +$packageName = 'NETworkManager' +$toolsDir = "$(Split-Path -parent $MyInvocation.MyCommand.Definition)" $packageArgs = @{ - packageName = $env:ChocolateyPackageName - unzipLocation = $toolsDir - fileType = 'EXE' - url = $url - softwareName = 'NETworkManager*' + packageName = $packageName + unzipLocation = $toolsDir + fileType = 'MSI' + url = 'https://github.com/BornToBeRoot/NETworkManager/releases/download/2026.7.7.0/NETworkManager_2026.7.7.0_Setup.msi' + + softwareName = 'NETworkManager*' + + checksum = '26B4CED4ED8FF48ED10B484A7C25580F6FCE545C18643461428BBDB47D171824' + checksumType = 'sha256' - checksum = 'F0CF905B14622588E658977BC2E7B85042858FA4191CDAEF4F84C1BAE2DC9311' - checksumType = 'sha256' - - silentArgs = '/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /TASKS="desktopicon" /SP-' - validExitCodes= @(0) + silentArgs = "/qn /norestart /l*v `"$($env:TEMP)\$($packageName).$($env:chocolateyPackageVersion).MsiInstall.log`"" + validExitCodes = @(0, 3010, 1641) } Install-ChocolateyPackage @packageArgs diff --git a/Chocolatey/tools/chocolateyuninstall.ps1 b/Chocolatey/tools/chocolateyuninstall.ps1 index d5d8194285..4c4de01615 100644 --- a/Chocolatey/tools/chocolateyuninstall.ps1 +++ b/Chocolatey/tools/chocolateyuninstall.ps1 @@ -1,31 +1,45 @@ -$ErrorActionPreference = 'Stop'; -$packageArgs = @{ - packageName = $env:ChocolateyPackageName - softwareName = 'NETworkManager*' - fileType = 'EXE' - silentArgs = '/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-' - validExitCodes= @(0) -} +$ErrorActionPreference = 'Stop' + +$packageName = 'NETworkManager' +$softwareName = 'NETworkManager*' +$installerType = 'MSI' +$silentArgs = "/qn /norestart /l*v `"$($env:TEMP)\$($packageName).$($env:chocolateyPackageVersion).MsiUninstall.log`"" +# https://msdn.microsoft.com/en-us/library/aa376931(v=vs.85).aspx +$validExitCodes = @(0, 3010, 1605, 1614, 1641) $uninstalled = $false -[array]$key = Get-UninstallRegistryKey -SoftwareName $packageArgs['softwareName'] + +[array]$key = Get-UninstallRegistryKey -SoftwareName $softwareName if ($key.Count -eq 1) { - $key | % { - $packageArgs['file'] = "$($_.UninstallString)" - if ($packageArgs['fileType'] -eq 'MSI') { - $packageArgs['silentArgs'] = "$($_.PSChildName) $($packageArgs['silentArgs'])" - - $packageArgs['file'] = '' - } + $key | ForEach-Object { + $file = "$($_.UninstallString)" + + if ($installerType -eq 'MSI') { + # The Product Code GUID is all that should be passed for MSI, and very + # FIRST, because it comes directly after /x, which is already set in the + # Uninstall-ChocolateyPackage msiargs (facepalm). + $silentArgs = "$($_.PSChildName) $silentArgs" - Uninstall-ChocolateyPackage @packageArgs + # Don't pass anything for file, it is ignored for msi (facepalm number 2) + # Alternatively if you need to pass a path to an msi, determine that and + # use it instead of the above in silentArgs, still very first + $file = '' + } + + Uninstall-ChocolateyPackage -PackageName $packageName ` + -FileType $installerType ` + -SilentArgs "$silentArgs" ` + -ValidExitCodes $validExitCodes ` + -File "$file" } -} elseif ($key.Count -eq 0) { +} +elseif ($key.Count -eq 0) { Write-Warning "$packageName has already been uninstalled by other means." -} elseif ($key.Count -gt 1) { - Write-Warning "$($key.Count) matches found!" +} +elseif ($key.Count -gt 1) { + Write-Warning "$key.Count matches found!" Write-Warning "To prevent accidental data loss, no programs will be uninstalled." Write-Warning "Please alert package maintainer the following keys were matched:" - $key | % {Write-Warning "- $($_.DisplayName)"} + $key | ForEach-Object { Write-Warning "- $_.DisplayName" } } diff --git a/Images/NETworkManager.ico b/Images/NETworkManager.ico index 54ace0e188..14917c41bb 100644 Binary files a/Images/NETworkManager.ico and b/Images/NETworkManager.ico differ diff --git a/Images/NETworkManager.svg b/Images/NETworkManager.svg index 778f2520ee..f84869dcc0 100644 --- a/Images/NETworkManager.svg +++ b/Images/NETworkManager.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/Images/NETworkManager_128x128.png b/Images/NETworkManager_128x128.png index 8c376fa233..0c0869f931 100644 Binary files a/Images/NETworkManager_128x128.png and b/Images/NETworkManager_128x128.png differ diff --git a/Images/NETworkManager_16x16.png b/Images/NETworkManager_16x16.png index 08dfbe3a54..9e73fc4fc9 100644 Binary files a/Images/NETworkManager_16x16.png and b/Images/NETworkManager_16x16.png differ diff --git a/Images/NETworkManager_24x24.png b/Images/NETworkManager_24x24.png index 95677a0d5a..2e1a6688e2 100644 Binary files a/Images/NETworkManager_24x24.png and b/Images/NETworkManager_24x24.png differ diff --git a/Images/NETworkManager_256x256.png b/Images/NETworkManager_256x256.png index 8e41e69098..9b57953866 100644 Binary files a/Images/NETworkManager_256x256.png and b/Images/NETworkManager_256x256.png differ diff --git a/Images/NETworkManager_32x32.png b/Images/NETworkManager_32x32.png index 18ee99bbff..c83d69f2f8 100644 Binary files a/Images/NETworkManager_32x32.png and b/Images/NETworkManager_32x32.png differ diff --git a/Images/NETworkManager_48x48.png b/Images/NETworkManager_48x48.png index f74c793580..33d3135f26 100644 Binary files a/Images/NETworkManager_48x48.png and b/Images/NETworkManager_48x48.png differ diff --git a/Images/NETworkManager_512x512.png b/Images/NETworkManager_512x512.png index 47a0cb3cec..45f57b2738 100644 Binary files a/Images/NETworkManager_512x512.png and b/Images/NETworkManager_512x512.png differ diff --git a/Images/NETworkManager_64x64.png b/Images/NETworkManager_64x64.png index 229747614a..42128b750e 100644 Binary files a/Images/NETworkManager_64x64.png and b/Images/NETworkManager_64x64.png differ diff --git a/Images/NETworkManager_96x96.png b/Images/NETworkManager_96x96.png index fe792d12a5..fc19980a01 100644 Binary files a/Images/NETworkManager_96x96.png and b/Images/NETworkManager_96x96.png differ diff --git a/Images/NETworkManager_InnoSetup.bmp b/Images/NETworkManager_InnoSetup.bmp index 8bb0273cb0..ecf601c446 100644 Binary files a/Images/NETworkManager_InnoSetup.bmp and b/Images/NETworkManager_InnoSetup.bmp differ diff --git a/Images/v1/NETworkManager.ico b/Images/v1/NETworkManager.ico deleted file mode 100644 index ac9c999f7b..0000000000 Binary files a/Images/v1/NETworkManager.ico and /dev/null differ diff --git a/Images/v1/NETworkManager.svg b/Images/v1/NETworkManager.svg deleted file mode 100644 index 0cc82fbf45..0000000000 --- a/Images/v1/NETworkManager.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/Images/v1/NETworkManager48x48.png b/Images/v1/NETworkManager48x48.png deleted file mode 100644 index b018cc4321..0000000000 Binary files a/Images/v1/NETworkManager48x48.png and /dev/null differ diff --git a/Images/v1/NETworkManager_InnoSetup.bmp b/Images/v1/NETworkManager_InnoSetup.bmp deleted file mode 100644 index 3280688b54..0000000000 Binary files a/Images/v1/NETworkManager_InnoSetup.bmp and /dev/null differ diff --git a/Images/v1/SplashScreen.png b/Images/v1/SplashScreen.png deleted file mode 100644 index d78e3b0694..0000000000 Binary files a/Images/v1/SplashScreen.png and /dev/null differ diff --git a/Images/v1/SplashScreen.xcf b/Images/v1/SplashScreen.xcf deleted file mode 100644 index 7c03c7d171..0000000000 Binary files a/Images/v1/SplashScreen.xcf and /dev/null differ diff --git a/InnoSetup.iss b/InnoSetup.iss deleted file mode 100644 index 17db794981..0000000000 --- a/InnoSetup.iss +++ /dev/null @@ -1,71 +0,0 @@ -; Script generated by the Inno Setup Script Wizard. -; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! - -#define MyAppName "NETworkManager" -#define MyAppVersion "2022.2.22.0" -#define MyAppPublisher "BornToBeRoot" -#define MyAppURL "https://github.com/BornToBeRoot/NETworkManager/" -#define MyAppExeName "NETworkManager.exe" -#define MyAppCopyright "Copyright (C) 2016-2021 BornToBeRoot" - -[Setup] -; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications. -; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) -AppId={{8028080F-B785-4A74-A243-3D63467880A6} -AppName={#MyAppName} -AppVersion={#MyAppVersion} -VersionInfoVersion={#MyAppVersion} -AppCopyright={#MyAppCopyright} -;AppVerName={#MyAppName} {#MyAppVersion} -AppPublisher={#MyAppPublisher} -AppPublisherURL={#MyAppURL} -AppSupportURL={#MyAppURL} -AppUpdatesURL={#MyAppURL} -UninstallDisplayName={#MyAppName} -UninstallDisplayIcon={app}\{#MyAppExeName} -DefaultDirName={autopf}\{#MyAppName} -DisableProgramGroupPage=yes -LicenseFile=Build\NETworkManager\Licenses\NETworkManager.txt -; Uncomment the following line to run in non administrative install mode (install for current user only.) -;PrivilegesRequired=lowest -OutputDir=Build -OutputBaseFilename=NETworkManager_{#MyAppVersion}_Setup -Compression=lzma -SolidCompression=yes -WizardStyle=modern -ArchitecturesAllowed=x64 -ArchitecturesInstallIn64BitMode=x64 -WizardSmallImageFile=Images\NETworkManager_InnoSetup.bmp - -[Languages] -Name: "english"; MessagesFile: "compiler:Default.isl" -Name: "brasilian"; MessagesFile: "compiler:Languages\BrazilianPortuguese.isl" -Name: "chinesesimplified"; MessagesFile: "compiler:Languages\ChineseSimplified.isl" -Name: "chinesetraditional"; MessagesFile: "compiler:Languages\ChineseTraditional.isl" -Name: "czech"; MessagesFile: "compiler:Languages\Czech.isl" -Name: "dutch"; MessagesFile: "compiler:Languages\Dutch.isl" -Name: "french"; MessagesFile: "compiler:Languages\French.isl" -Name: "german"; MessagesFile: "compiler:Languages\German.isl" -Name: "italian"; MessagesFile: "compiler:Languages\Italian.isl" -Name: "japanese"; MessagesFile: "compiler:Languages\Japanese.isl" -Name: "polish"; MessagesFile: "compiler:Languages\Polish.isl" -Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl" -Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl" -Name: "slovenian"; MessagesFile: "compiler:Languages\Slovenian.isl" -Name: "turkish"; MessagesFile: "compiler:Languages\Turkish.isl" - -[Tasks] -Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}" - -[Files] -Source: "Build\NETworkManager\NETworkManager.exe"; DestDir: "{app}"; Flags: ignoreversion -Source: "Build\NETworkManager\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs -; NOTE: Don't use "Flags: ignoreversion" on any shared system files - -[Icons] -Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" -Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon - -[Run] -Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent - diff --git a/LICENSE b/LICENSE index 9cecc1d466..4de9a54296 100644 --- a/LICENSE +++ b/LICENSE @@ -1,674 +1,259 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 +GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - Preamble +Copyright (C) 2007 Free Software Foundation, Inc. +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to +PREAMBLE + +The GNU General Public License is a free, copyleft license for software and other kinds of works. + +The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. + +To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. + +For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. + +Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. +For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. + +Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. + +Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. + +The precise terms and conditions for copying, distribution and modification follow. + + +TERMS AND CONDITIONS + +0. Definitions. + +"This License" refers to version 3 of the GNU General Public License. + +"Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. + +"The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. + +To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. + + +A "covered work" means either the unmodified Program or a work based on the Program. + +To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your +To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. + +An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. + +1. Source Code. + +The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. + +A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. + +The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. + +The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. + +The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same work. + +2. Basic Permissions. + +All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means +You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. + +3. Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. + +When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. + +4. Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. + +5. Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: + +a) The work must carry prominent notices stating that you modified it, and giving a relevant date. +b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". +c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. +d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. +A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. + +6. Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: + +a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. +b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. +c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. +d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. +e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. + +A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. + +"Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. + +If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). + +The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. + +Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. + +7. Additional Terms. + +"Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: + +e) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or +b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or +c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or +d) Limiting the use for publicity purposes of names of licensors or authors of the material; or +e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or +f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. + +All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. + +8. Termination. + +You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). + +However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that +Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. + +Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. + +9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. + +10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. + +An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. + +11. Patents. + +A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". + +A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. + +In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. + +If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered +If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the +A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. + +12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. + +13. Use with the GNU Affero General Public License. + +Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - {one line to give the program's name and a brief idea of what it does.} - Copyright (C) {year} {name of author} - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . +14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. + +If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. + +Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. + +15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS + + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. + + +Copyright (C) + +This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - {project} Copyright (C) {year} {fullname} - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. +If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: + + Copyright (C) +This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. +This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". + +You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see . + +The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . diff --git a/README.md b/README.md index e325362a0c..062e8c98ab 100644 --- a/README.md +++ b/README.md @@ -1,71 +1,258 @@ -
+
+ NETworkManager Logo

NETworkManager

-

A powerful tool for managing networks and troubleshoot network problems!

- NETworkManager Preview -

- - All releases - - - Latest release - - - GitHub stars - - - GitHub forks - -

-

- - AppVeyor - - - AppVeyor - -

-

- - Transifex - - - Feature request - - - Bug report - +

+ A powerful open-source tool for managing networks and troubleshooting network problems!

+

+ Streamline and simplify your network administration and troubleshooting with NETworkManager. Connect, monitor, and troubleshoot your network and server infrastructure using built-in tools like Remote Desktop (RDP), PuTTY (SSH, Serial, etc.), PowerShell (WSL, K9s, etc.) and TigerVNC (VNC). Perform in-depth network diagnostics with features including WiFi Analyzer, IP Scanner, Port Scanner, Ping Monitor, Traceroute, DNS Lookup, LLDP/CDP Capture, and many more — all in a clean, unified interface. +

+

+ Organize hosts and networks in profiles with seamless access across all features. Profile files can be encrypted to protect your sensitive data and used to separate different customers or environments. NETworkManager is enterprise-ready with an MSI installer, signed binaries, system-wide policies for centralized configuration, and support for package managers like Chocolatey, Evergreen, and WinGet. Available in over 16 languages with customizable light/dark themes and accent colors. +

+

+ + Download Now + +

+

+ + GitHub Stars + + + GitHub Forks + + + Total Downloads + +

+

+ + Latest Release Downloads + + + Pre-release Downloads + +

+

+ + AppVeyor Build Status + + + License + +

+

+ + Transifex + + + Feature Request + + + Bug Report + +

+

+ DownloadDonateScreenshotsChangelogDocumentationContributingBuildThanksLicense +

+
+ +
+ NETworkManager Features Preview +
+ +## 🚀 Why NETworkManager? + +NETworkManager is your go-to tool for simplifying network administration and troubleshooting. Whether you're a sysadmin maintaining company network with multiple servers, a network engineer in a large enterprise, or an IT enthusiast running your home lab, NETworkManager provides a powerful suite of tools to manage and diagnose your network infrastructure efficiently. + +Here's why you'll love it: + +- 🧰 **Unified Experience** - All your essential network tools together in a clean, unified interface. +- 🖥️ **Remote System Management** - Seamlessly connect via Remote Desktop (RDP), PuTTY (SSH, Serial, etc.), PowerShell (WSL, K9s, etc.) or TigerVNC (VNC). +- 🔍 **Analyze & Troubleshoot** - Deep network diagnostics with WiFi Analyzer, IP Scanner, Port Scanners, Ping Monitor, Traceroute, DNS Lookup, LLDP/CDP Capture, and many more. +- 🔐 **Secure Profiles** - Organize hosts and networks in profiles with seamless access across all features. Encrypt profile files and separate them by customer or environment. +- 💎 **Open Source & Free** - No ads, no subscriptions, no selling your data, fully community-driven. +- 🏢 **Enterprise-Ready** - MSI installer, signed binaries, [system-wide policies](https://borntoberoot.net/NETworkManager/docs/system-wide-policies) for centralized configuration, and package manager support (Chocolatey, Evergreen, and WinGet). +- 🎨 **Personalized Experience** - Available in 16+ languages, with customizable light/dark themes and accent colors. + +📖 Explore all features in detail in our [documentation](https://borntoberoot.net/NETworkManager/docs/introduction). + +## 📦 Download + +Get started with NETworkManager today! Download pre-built, [signed](https://borntoberoot.net/NETworkManager/download#code-signing-policy) binaries (setup, portable, or archive) from our [download page](https://borntoberoot.net/NETworkManager/download) with detailed install instructions (e.g., silent install). Files are hosted on [GitHub Releases](https://github.com/BornToBeRoot/NETworkManager/releases/latest). + + -# More informations -- [Features](https://borntoberoot.net/NETworkManager/Features) -- [Download](https://borntoberoot.net/NETworkManager/Download) -- [Changelog](https://borntoberoot.net/NETworkManager/Changelog) -- [Documentation](https://borntoberoot.net/NETworkManager/Documentation/Application) -- [How to contribute, add a translation, write documentation or report a bug?](https://github.com/BornToBeRoot/NETworkManager/blob/master/CONTRIBUTING.md) -- [List of contributors](https://github.com/BornToBeRoot/NETworkManager/blob/master/Contributors.md) -- [How to report a security vulnerability?](https://github.com/BornToBeRoot/NETworkManager/blob/master/SECURITY.md) - -# Build -__Requirements__ -- [SDK .NET 6.x](https://dotnet.microsoft.com/download/dotnet/6.0) -- Visual Studio 2019 or later with `.NET desktop development` and `Universal Windows Platform development` - -__Optional__ -- [InnoSetup](https://jrsoftware.org/isinfo.php) (if you want to create an installer) - - Download `ChineseSimplified.isl` and `ChineseTraditional.isl` from the [official repo](https://github.com/jrsoftware/issrc/blob/main/Files/Languages/Unofficial/) and place them in the language folder of InnoSetup - -__Build__ -1. Clone or download the repository: `git clone https://github.com/BornToBeRoot/NETworkManager` -2. Run the `.\build.ps1` script with PowerShell to compile the solution and create a portable and a setup version (or open the file `Source/NETworkManager.sln` in Visual Studio to debug or build the solution) - -You can also copy & paste this command in your PowerShell console :smile: -```PowerShell -git clone https://github.com/BornToBeRoot/NETworkManager; Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass; .\NETworkManager\build.ps1 -``` - -# Code of Conduct -This project has adopted the [code of conduct](https://github.com/BornToBeRoot/NETworkManager/blob/master/CODE_OF_CONDUCT.md) defined by the [Contributor Covenant](http://contributor-covenant.org/). - -# License -NETworkManager is published under the [GNU General Public License v3](https://github.com/BornToBeRoot/NETworkManager/blob/master/LICENSE). The licenses of the used libraries can be found [here](https://github.com/BornToBeRoot/NETworkManager/tree/master/Source/NETworkManager.Documentation/Licenses). +> [!TIP] +> Pre-release versions with the latest features and fixes are (sometimes) available for testing on [GitHub Releases](https://github.com/BornToBeRoot/NETworkManager/releases). Please note that pre-release versions may be unstable and are not recommended for production use. Please report any issues you encounter on [GitHub Issues](https://github.com/BornToBeRoot/NETworkManager/issues/new/choose). + +Install and update via package managers for a hassle-free setup: + +- **Chocolatey**: + + ```powershell + choco install networkmanager + ``` + +- **WinGet**: + + ```powershell + winget install BornToBeRoot.NETworkManager + ``` + +- **Evergreen**: + + ```powershell + # Get latest release + Get-EvergreenApp -Name NETworkManager + # Save setup file + Get-EvergreenApp -Name NETworkManager | Save-EvergreenApp -Path C:\Users\$env:Username\Downloads\ + ``` + + Evergreen PowerShell module (e.g. to automate image building or SCCM/Intune updates): + +## 💖 Donate + +NETworkManager is open source, free and without ads — developed in my spare time for you. + +If you find it useful, here are ways to support the project: + +- 🌟 **Star the Repo** – Show your appreciation and stay updated with new features. +- 📢 **Share It** – Spread the word with friends, colleagues, or on social media. +- 🎥 **Create Content** – Write blog posts, make tutorials, or produce videos about NETworkManager. +- ☕🍺 **Donate** – Support the project with a coffe or beer! + + | Crypto | Address | + | --------------- | ---------------------------------------------- | + | Bitcoin (BTC) | `bc1qwv0pqgrylt38djhemxdtm0ek94uuup6srl3x9n` | + | Ethereum (ETH) | `0xB25926F4D4Cf4b1A84645EB71f2747808492c63D` | + | XRP (XRP) | `rw95DGpqwM4MC74rYiixtHugn8XpHtpxGK` | + | Solana (SOL) | `HXkCwZtoVcFEPkwurQPfeVfK3PckKkqo1E5xjDAtQYr2` | + | Dogecoin (DOGE) | `DURnrWRpoE4ypCjD9fVaVnDrXJ1hfZrPjj` | + +Thank you for helping keep NETworkManager thriving! + +## 📷 Screenshots + +
+ +NETworkManager tabs and drag & drop preview + +Encrypted profile files, group & profile management. + +--- + +NETworkManager tabs and drag & drop preview + +Tabs and drag & drop functionality. + +--- + +NETworkManager dark/light theme preview + +Customizable light/dark themes and accent colors. + +
+ +## 📃 Changelog + +Stay updated with the latest improvements and features. Check the full changelog [here](https://borntoberoot.net/NETworkManager/docs/category/changelog). + +## 📖 Documentation + +Explore everything you need to get the most out of **NETworkManager**: comprehensive guides, tutorials, blog posts, and FAQs — all on our website: [borntoberoot.net/NETworkManager](https://borntoberoot.net/NETworkManager). + +## ✨ Contributing + +Join our community to make NETworkManager even better! Here’s how you can contribute: + +- **🐞 Report Bugs / Request Features** – Share ideas or issues [here](CONTRIBUTING.md#contributing). +- **💻 Code Contributions** – Add features or fix bugs. See [guidelines](CONTRIBUTING.md#code). +- **🌍 Translations** – Help localize NETworkManager [here](CONTRIBUTING.md#translation). +- **📚 Documentation** – Improve docs and tutorials [here](CONTRIBUTING.md#documentation). +- **🔒 Security Reports** – Report vulnerabilities responsibly [here](https://github.com/BornToBeRoot/NETworkManager/blob/main/SECURITY.md). + +See all contributors [here](https://github.com/BornToBeRoot/NETworkManager/blob/main/CONTRIBUTORS.md). We follow the [Contributor Covenant Code of Conduct](https://github.com/BornToBeRoot/NETworkManager/blob/main/CODE_OF_CONDUCT.md). + +## 🔧 Build + +Build NETworkManager yourself with these steps: + +1. **Prerequisites**: + + - [.NET 10.x SDK](https://dotnet.microsoft.com/download/dotnet/10.0) + - [Visual Studio 2026](https://visualstudio.microsoft.com/) with `.NET desktop development` and `Universal Windows Platform development` (or [JetBrains Rider](https://www.jetbrains.com/rider/) - you still need to install the UWP workload via Visual Studio Installer) + +2. **Clone the Repository**: + + - Clone with submodules: + ```powershell + git clone https://github.com/BornToBeRoot/NETworkManager.git + cd NETworkManager + git submodule update --init --recursive + ``` + +3. **Build**: + - Open `.\Source\NETworkManager.sln` in Visual Studio or JetBrains Rider. + - Alternatively, build via command line: + ```powershell + dotnet restore .\Source\NETworkManager.sln + dotnet build .\Source\NETworkManager.sln --configuration Release --no-restore + ``` + +## 🙏 Thanks + +A huge thank you to our supporters and contributors who make NETworkManager possible: + +- **Services**: + + - [AppVeyor](https://www.appveyor.com/) - CI/CD for Windows, Linux, and macOS. + - [GitHub Pages](https://pages.github.com/) - Hosting our documentation. + - [ip-api.com](https://ip-api.com/) - IP geolocation API (free for non-commercial use). + - [JetBrains](https://www.jetbrains.com/) - Licenses for [Rider](https://www.jetbrains.com/rider/) and other tools. + - [SignPath.io](https://signpath.io/) & [SignPath Foundation](https://signpath.org/) - Free code signing service and certificate for open source projects. + - [Transifex](https://www.transifex.com/) - Localization platform. + +- **Libraries**: + - [#SNMP Library](https://github.com/lextudio/sharpsnmplib) - SNMP library for .NET. + - [AirspaceFixer](https://github.com/chris84948/AirspaceFixer) - AirspacePanel fixes all Airspace issues with WPF-hosted Winforms. + - [ControlzEx](https://github.com/ControlzEx/ControlzEx) - Shared Controlz for WPF and more. + - [DnsClient.NET](https://github.com/MichaCo/DnsClient.NET) - Powerful, high-performance open-source library for DNS lookups. + - [Docusaurus](https://docusaurus.io/) - Easy to maintain open source documentation websites. + - [Dragablz](https://dragablz.net/) - Tearable TabControl for WPF. + - [GongSolutions.Wpf.DragDrop](https://github.com/punker76/gong-wpf-dragdrop) - An easy to use drag'n'drop framework for WPF. + - [IPNetwork](https://github.com/lduchosal/ipnetwork) - .NET library for complex network, IP, and subnet calculations. + - [LiveCharts2](https://github.com/Live-Charts/LiveCharts2) - Beautiful, interactive charts, maps, and gauges. + - [LoadingIndicators.WPF](https://github.com/zeluisping/LoadingIndicators.WPF) - A collection of loading indicators for WPF. + - [MahApps.Metro](https://mahapps.com/) - UI toolkit for WPF applications. + - [MahApps.Metro.IconPacks](https://github.com/MahApps/MahApps.Metro.IconPacks) - Awesome icon packs for WPF and UWP in one library. + - [NetBeauty2](https://github.com/nulastudio/NetBeauty2) - Move .NET app runtime components and dependencies into a sub-directory. + - [PSDiscoveryProtocol](https://github.com/lahell/PSDiscoveryProtocol) - PowerShell module for LLDP/CDP discovery. + +Star these projects to show your support! + +## 🔒 Code Signing Policy + +NETworkManager uses free code signing services from [SignPath.io](https://signpath.io/) and a free code signing certificate provided by the [SignPath Foundation](https://signpath.org/) to sign all official binaries and installers, ensuring the authenticity and integrity. + +The binaries and installers are built on [AppVeyor](https://ci.appveyor.com/project/BornToBeRoot/networkmanager) directly from the [GitHub repository](https://github.com/BornToBeRoot/NETworkManager/blob/main/appveyor.yml). After each build, the artifacts are automatically sent to [SignPath.io](https://signpath.io/) via webhook, where they are signed following manual approval by the maintainer. Once signed, the binaries are uploaded to the [GitHub releases page](https://github.com/BornToBeRoot/NETworkManager/releases). + +## 🔐 Privacy Policy + +Your privacy matters. NETworkManager will not transfer any information to other networked systems unless specifically requested by the user or the person installing or operating it. + +NETworManager has integrated some **optional** third-party services to enhance functionality. You can choose to enable or disable these services at the first startup or later in the settings: + +- [api.github.com](https://docs.github.com/en/site-policy/privacy-policies/github-general-privacy-statement) - Check for application updates. +- [ipify.org](https://www.ipify.org/) - Retrieve the public IP address used by the client. +- [ip-api.com](https://ip-api.com/docs/legal) - Retrieve network information (e.g., geolocation, ISP, DNS resolver) used by the client. +- [speed.cloudflare.com](https://www.cloudflare.com/privacypolicy/) - Measure download/upload speed, latency and jitter. + +## 📝 License + +NETworkManager is licensed under the [GNU General Public License v3](https://github.com/BornToBeRoot/NETworkManager/blob/main/LICENSE). Library licenses are [here](https://github.com/BornToBeRoot/NETworkManager/tree/main/Source/NETworkManager.Documentation/Licenses). diff --git a/SECURITY.md b/SECURITY.md index 516840dfb4..455ba5435d 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,11 +1,60 @@ # Security Policy +> [!NOTE] +> NETworkManager is a free, open-source project maintained in my spare time. There is **no warranty**, **no paid support**, and **no guaranteed response time**. I do my best to address security issues, but please understand that fixes depend on my available free time. + ## Supported Versions -Only the current version (master) is supported. +Only the latest release is considered for security fixes. Please ensure you are using the most recent version before reporting a vulnerability. + +| Version | Supported | +| ------- | ------------------ | +| Latest | :white_check_mark: | +| Older | :x: | ## Reporting a Vulnerability -Contact me via GitHub Issues or via Twitter. We will find a secure way to exchange the details :) +> [!IMPORTANT] +> Please **do not** open a public GitHub issue for security vulnerabilities. + +If you discover a security vulnerability in NETworkManager, please report it responsibly through [GitHub Security Advisory](https://github.com/BornToBeRoot/NETworkManager/security/advisories/new). + +### What to Include + +To help us triage and resolve the issue quickly, please provide: + +- A clear description of the vulnerability +- Steps to reproduce the issue +- Affected version(s) +- Potential impact (e.g., data exposure, remote code execution) +- Any suggested fixes or mitigations (optional) + +### What to Expect + +This project is maintained on a **best-effort basis** in my free time. That said, I take security seriously and will do my best to: + +- Acknowledge your report as soon as I can. +- Work on a fix or mitigation when time permits. +- Credit you in the release notes (unless you prefer to remain anonymous). + +Please be patient — there are no guaranteed timelines. + +### Scope + +The following are in scope for security reports: + +- NETworkManager application code (all modules in `Source/`) +- Profile encryption and credential handling +- Network communication and protocol implementations +- Installer and update mechanisms +- Dependencies shipped with the application + +The following are **out of scope**: + +- Third-party tools launched by NETworkManager (e.g., PuTTY, TigerVNC) +- The documentation website ([borntoberoot.net/NETworkManager](https://borntoberoot.net/NETworkManager)) +- Social engineering attacks + +## Code Signing -I will try to fix it and publish an update ASAP! +Official releases are signed via [SignPath.io](https://signpath.io/) through the [SignPath Foundation](https://signpath.org/). Always verify that you are using a signed binary from the official [GitHub Releases](https://github.com/BornToBeRoot/NETworkManager/releases) page or a trusted package manager (`winget`, `choco`). diff --git a/Scripts/Create-FileHash.ps1 b/Scripts/Create-FileHash.ps1 new file mode 100644 index 0000000000..69d6c7ad76 --- /dev/null +++ b/Scripts/Create-FileHash.ps1 @@ -0,0 +1,39 @@ +[CmdletBinding()] + +param ( + [Parameter(Mandatory = $true)] + [string]$Path +) + +$Path = $Path.TrimEnd("\") + +if (-not (Test-Path -Path $Path -PathType Container)) { + Write-Error "Path does not exist or is not a directory: $Path" + return +} + +# Get current date as version +$Now = Get-Date +$Version = "$($Now.Year).$($Now.Month).$($Now.Day).0" + +# Create SHA256 file hashes +foreach ($Hash in Get-ChildItem -Path $Path | Where-Object { $_.Name.StartsWith("NETworkManager_") -and ($_.Name.EndsWith(".zip") -or $_.Name.EndsWith(".msi")) } | Sort-Object -Descending | Get-FileHash) { + "$($Hash.Hash) $([System.IO.Path]::GetFileName($Hash.Path))" | Out-File -FilePath "$Path\NETworkManager_$($Version)_SHA256SUMS" -Encoding utf8 -Append +} + +$SumFile = Join-Path $Path "NETworkManager_$($Version)_SHA256SUMS" + +if (Test-Path $SumFile) { + Remove-Item $SumFile +} + +Get-ChildItem -Path $Path | +Where-Object { $_.Name.StartsWith("NETworkManager_") -and ($_.Name.EndsWith(".zip") -or $_.Name.EndsWith(".msi")) } | +Sort-Object -Descending | +Get-FileHash -Algorithm SHA256 | +ForEach-Object { + # Format: + LF ending + $Line = "$($_.Hash) $([System.IO.Path]::GetFileName($_.Path))" + # Use UTF-8 without BOM and LF line endings + [System.IO.File]::AppendAllText($SumFile, "$Line`n", [System.Text.UTF8Encoding]::new($false)) +} diff --git a/Scripts/Create-FlagFromSVG.ps1 b/Scripts/Create-FlagFromSVG.ps1 new file mode 100644 index 0000000000..6819d94fe8 --- /dev/null +++ b/Scripts/Create-FlagFromSVG.ps1 @@ -0,0 +1,12 @@ +<# + Convert 4x3 country flags from SVG to PNG using ImageMagick. + + Flags source: https://github.com/lipis/flag-icon-css +#> + +$ConvertPath = "C:\Tools\ImageMagick-7.1.0-portable-Q16-x64\convert.exe" + +$SourcePath = "C:\Temp\lu.svg" +$DestinationPath = "C:\Temp\lb-LU.png" + +Start-Process -FilePath $ConvertPath -ArgumentList "-antialias -density 600 -background transparent -resize x48 ""$SourcePath"" ""$DestinationPath""" -NoNewWindow -Wait diff --git a/Scripts/Create-OUIListFromWeb.ps1 b/Scripts/Create-OUIListFromWeb.ps1 index 2228ff5d0b..9ee7306b21 100644 --- a/Scripts/Create-OUIListFromWeb.ps1 +++ b/Scripts/Create-OUIListFromWeb.ps1 @@ -1,8 +1,8 @@ # Filepath in the resources... [string]$OutFilePath = Join-Path -Path (Split-Path $PSScriptRoot -Parent) -ChildPath "Source\NETworkManager.Models\Resources\OUI.xml" -# Download cleanup IEEE oui version from linuxnet -$LatestOUIs = (Invoke-WebRequest -Uri "http://linuxnet.ca/ieee/oui.txt").Content +# Download oui list from ieee.org +$LatestOUIs = (Invoke-WebRequest -Uri "https://standards-oui.ieee.org/oui/oui.txt").Content # Create xml document [xml]$Document = New-Object System.Xml.XmlDocument @@ -21,10 +21,8 @@ Generated $(Get-Date) # Root node $RootNode = $Document.CreateNode("element", "OUIs", $null) -foreach($Line in $LatestOUIs -split '[\r\n]') -{ - if($Line -match "^[A-F0-9]{6}") - { +foreach ($Line in $LatestOUIs -split '[\r\n]') { + if ($Line -match "^[A-F0-9]{6}") { # Line looks like: 2405F5 (base 16) Integrated Device Technology (Malaysia) Sdn. Bhd. $OUIData = ($Line -replace '\s+', ' ').Replace(' (base 16) ', '|').Trim().Split('|') diff --git a/Scripts/Create-PortListFromWeb.ps1 b/Scripts/Create-PortListFromWeb.ps1 index b99bcd4d97..22427f263e 100644 --- a/Scripts/Create-PortListFromWeb.ps1 +++ b/Scripts/Create-PortListFromWeb.ps1 @@ -22,22 +22,18 @@ Generated $(Get-Date) $RootNode = $Document.CreateNode("element", "Ports", $null) # Create node for each port -foreach($Record in $ServiceNamePortNumbers.ChildNodes.record) -{ - if([string]::IsNullOrEmpty($Record.number) -or ([string]::IsNullOrEmpty($Record.protocol))) - { +foreach ($Record in $ServiceNamePortNumbers.ChildNodes.record) { + if ([string]::IsNullOrEmpty($Record.number) -or ([string]::IsNullOrEmpty($Record.protocol))) { continue } - $Description = ($Record.description -replace '`n','') -replace '\s+',' ' + $Description = ($Record.description -replace '`n', '') -replace '\s+', ' ' $Number = $Record.number - if($Number -like "*-*") - { + if ($Number -like "*-*") { $NumberArr = $Number.Split('-') - foreach($Number1 in $NumberArr[0]..$NumberArr[1]) - { + foreach ($Number1 in $NumberArr[0]..$NumberArr[1]) { $PortNode = $Document.CreateNode("element", "Port", $null) $NumberElement = $Document.CreateElement("Number") @@ -59,8 +55,7 @@ foreach($Record in $ServiceNamePortNumbers.ChildNodes.record) [void]$RootNode.AppendChild($PortNode) } } - else - { + else { $PortNode = $Document.CreateNode("element", "Port", $null) $NumberElement = $Document.CreateElement("Number") diff --git a/Scripts/Create-ReleaseTable.ps1 b/Scripts/Create-ReleaseTable.ps1 new file mode 100644 index 0000000000..86d544b724 --- /dev/null +++ b/Scripts/Create-ReleaseTable.ps1 @@ -0,0 +1,38 @@ +[CmdletBinding()] + +param ( + [Parameter(Mandatory = $true)] + [string]$Path +) + +$Path = $Path.TrimEnd("\") + +if (-not (Test-Path -Path $Path -PathType Container)) { + Write-Error "Path does not exist or is not a directory: $Path" + return +} + +$RepoUrl = "https://github.com/BornToBeRoot/NETworkManager" + +# Get current date as version +$Now = Get-Date +$Version = "$($Now.Year).$($Now.Month).$($Now.Day).0" + +$SumFile = Join-Path $Path "NETworkManager_$($Version)_SHA256SUMS" + +if (-not (Test-Path $SumFile)) { + Write-Error "SHA256SUMS file not found: $SumFile (run Create-FileHash.ps1 first)" + return +} + +Write-Output "| File | Checksum [SHA256] |" +Write-Output "|---|---|" + +Get-Content -Path $SumFile | ForEach-Object { + # Line format: + $Hash, $FileName = $_ -split " ", 2 + $DownloadUrl = "$RepoUrl/releases/download/$Version/$FileName" + + # Format: |[``]()| `` | + Write-Output "|[``$FileName``]($DownloadUrl)| ``$Hash`` |" +} diff --git a/Scripts/Create-WhoisServerListFromWebAndWhois.ps1 b/Scripts/Create-WhoisServerListFromWebAndWhois.ps1 index 5bdc669239..b5cdb48bd6 100644 --- a/Scripts/Create-WhoisServerListFromWebAndWhois.ps1 +++ b/Scripts/Create-WhoisServerListFromWebAndWhois.ps1 @@ -22,10 +22,8 @@ $RootNode = $Document.CreateNode("element", "WhoisServers", $null) $ProgressCount = 0 -foreach($Tld in $IANA_TLDs) -{ - if($Tld.StartsWith("#")) - { +foreach ($Tld in $IANA_TLDs) { + if ([string]::IsNullOrWhiteSpace($Tld) -or $Tld.TrimStart().StartsWith("#")) { continue } @@ -33,7 +31,7 @@ foreach($Tld in $IANA_TLDs) $tcpClient = New-Object System.Net.Sockets.TcpClient("whois.iana.org", 43) - $networkStream= $tcpClient.GetStream() + $networkStream = $tcpClient.GetStream() $bufferedStream = New-Object System.IO.BufferedStream($networkStream) @@ -46,8 +44,7 @@ foreach($Tld in $IANA_TLDs) $stringBuilder = New-Object System.Text.StringBuilder - while(!$streamReader.EndOfStream) - { + while (!$streamReader.EndOfStream) { $stringBuilder.Append($streamReader.ReadLine()) } @@ -66,7 +63,10 @@ foreach($Tld in $IANA_TLDs) [void]$RootNode.AppendChild($WhoisServerNode) Write-Host -Object "Progress: $ProgressCount from $($IANA_TLDs.Count)" - $ProgressCount ++ + $ProgressCount++ + + # Sleep 1 because there is a rate limit + Start-Sleep -Seconds 1 } [void]$Document.AppendChild($RootNode) diff --git a/Scripts/Create-WorldMapFromWeb.ps1 b/Scripts/Create-WorldMapFromWeb.ps1 new file mode 100644 index 0000000000..03b74d8ee9 --- /dev/null +++ b/Scripts/Create-WorldMapFromWeb.ps1 @@ -0,0 +1,79 @@ +# Filepath in the resources +[string]$OutFilePath = Join-Path -Path (Split-Path $PSScriptRoot -Parent) -ChildPath "Source\NETworkManager\Resources\Maps\world-map.json" +[string]$CitiesOutFilePath = Join-Path -Path (Split-Path $PSScriptRoot -Parent) -ChildPath "Source\NETworkManager\Resources\Maps\world-cities.json" + +# Resolution of the Natural Earth admin-0 countries / populated places dataset (110m, 50m or 10m - higher detail = larger file) +[string]$Resolution = "50m" + +# A city is included if it's a national capital, or its population is at least this high +[int]$CityMinPopulation = 500000 + +# Download countries as plain GeoJSON (pre-converted from Natural Earth shapefiles, no TopoJSON decoding required) +$GeoJson = (Invoke-WebRequest -Uri "https://raw.githubusercontent.com/martynafford/natural-earth-geojson/master/$Resolution/cultural/ne_${Resolution}_admin_0_countries.json").Content | ConvertFrom-Json + +# Rounds [lon, lat] pairs to 2 decimal places (~1.1 km), which is enough detail for an abstract, non-navigational map +function Get-RoundedRing { + param($Ring) + + $Points = [System.Collections.Generic.List[object]]::new() + + foreach ($Point in $Ring) { + $Points.Add(@([Math]::Round([double]$Point[0], 2), [Math]::Round([double]$Point[1], 2))) + } + + # Unary comma prevents PowerShell from unrolling the list when there is only a single ring/point + , $Points +} + +# Keeps only the outer ring of every polygon part (holes like inland lakes are not relevant for an abstract map) +function Get-OuterRings { + param($Geometry) + + $Rings = [System.Collections.Generic.List[object]]::new() + + switch ($Geometry.type) { + "Polygon" { + $Rings.Add((Get-RoundedRing -Ring $Geometry.coordinates[0])) + } + "MultiPolygon" { + foreach ($Part in $Geometry.coordinates) { + $Rings.Add((Get-RoundedRing -Ring $Part[0])) + } + } + } + + , $Rings +} + +$Countries = [System.Collections.Generic.List[object]]::new() + +foreach ($Feature in $GeoJson.features) { + $Countries.Add([PSCustomObject]@{ + n = $Feature.properties.ADMIN + r = Get-OuterRings -Geometry $Feature.geometry + }) +} + +ConvertTo-Json -InputObject $Countries -Depth 10 -Compress | Set-Content -Path $OutFilePath -Encoding utf8NoBOM + +# Download populated places (cities) as plain GeoJSON +$PlacesGeoJson = (Invoke-WebRequest -Uri "https://raw.githubusercontent.com/martynafford/natural-earth-geojson/master/$Resolution/cultural/ne_${Resolution}_populated_places_simple.json").Content | ConvertFrom-Json + +$Cities = [System.Collections.Generic.List[object]]::new() + +foreach ($Feature in $PlacesGeoJson.features) { + $Properties = $Feature.properties + + # Keep national capitals regardless of population, plus every other city above the threshold + if ($Properties.adm0cap -ne 1 -and $Properties.pop_max -lt $CityMinPopulation) { + continue + } + + $Cities.Add([PSCustomObject]@{ + n = $Properties.name + lat = [Math]::Round([double]$Properties.latitude, 2) + lon = [Math]::Round([double]$Properties.longitude, 2) + }) +} + +ConvertTo-Json -InputObject $Cities -Depth 5 -Compress | Set-Content -Path $CitiesOutFilePath -Encoding utf8NoBOM \ No newline at end of file diff --git a/Scripts/PreBuildEventCommandLine.ps1 b/Scripts/PreBuildEventCommandLine.ps1 index 974880e1fe..07aa4003b1 100644 --- a/Scripts/PreBuildEventCommandLine.ps1 +++ b/Scripts/PreBuildEventCommandLine.ps1 @@ -1,22 +1,32 @@ +# Visual Studio pre build event: +# PowerShell.exe -ExecutionPolicy Bypass -NoProfile -File "$(ProjectDir)..\..\Scripts\PreBuildEventCommandLine.ps1" "$(TargetDir)" + param( [Parameter( - Position=0, - Mandatory=$true)] + Position = 0, + Mandatory = $true)] [String]$OutPath ) -# VS prebuild event call: PowerShell.exe -ExecutionPolicy Bypass -NoProfile -File "$(ProjectDir)..\..\Scripts\PreBuildEventCommandLine.ps1" "$(TargetDir)" - -# Fix wrong path -# Quotation marks are required if a blank is in the path... If there is no blank space in the path, a quote will be add to the end... -if(-not($OutPath.StartsWith('"'))) -{ +# Fix wrong path (if there is no blank in the path, a quote will be added to the end...) +if (-not($OutPath.StartsWith('"'))) { $OutPath = $OutPath.TrimEnd('"') } +# NetBeauty will move all dependencies to the lib folder +$OutPath = $OutPath + "\lib" + +# Create folder +if (-not(Test-Path -Path $OutPath -PathType Container)) { + New-Item -ItemType Directory -Path $OutPath +} + +################################################ +### Generate MSTSCLib.dll and AxMSTSCLib.dll ### +################################################ + # Test if files are already there... -if((Test-Path -Path "$OutPath\MSTSCLib.dll") -and (Test-Path -Path "$OutPath\AxMSTSCLib.dll")) -{ +if ((Test-Path -Path "$OutPath\MSTSCLib.dll") -and (Test-Path -Path "$OutPath\AxMSTSCLib.dll")) { Write-Host "MSTSCLib.dll and AxMSTSCLib.dll exist! Continue..." return } @@ -24,8 +34,7 @@ if((Test-Path -Path "$OutPath\MSTSCLib.dll") -and (Test-Path -Path "$OutPath\AxM # Detect x86 or x64 $ProgramFiles_Path = ${Env:ProgramFiles(x86)} -if([String]::IsNullOrEmpty($ProgramFiles_Path)) -{ +if ([String]::IsNullOrEmpty($ProgramFiles_Path)) { $ProgramFiles_Path = $Env:ProgramFiles } @@ -34,10 +43,8 @@ $AximpPath = ((Get-ChildItem -Path "$ProgramFiles_Path\Microsoft SDKs\Windows" - $IldasmPath = ((Get-ChildItem -Path "$ProgramFiles_Path\Microsoft SDKs\Windows" -Recurse -Filter "ildasm.exe" -File) | Sort-Object CreationTime | Select-Object -First 1).FullName $IlasmPath = ((Get-ChildItem -Path "$($Env:windir)\Microsoft.NET\Framework\" -Recurse -Filter "ilasm.exe" -File) | Sort-Object CreationTime | Select-Object -First 1).FullName -if([String]::IsNullOrEmpty($AximpPath) -or [String]::IsNullOrEmpty($IldasmPath) -or [String]::IsNullOrEmpty($IlasmPath)) -{ - Write-Host "Could not find sdk tools:`naximp.exe`t$AximpPath`nildasm.exe`t$IldasmPath`nilasm.exe`t$IlasmPath" - +if ([String]::IsNullOrEmpty($AximpPath) -or [String]::IsNullOrEmpty($IldasmPath) -or [String]::IsNullOrEmpty($IlasmPath)) { + Write-Host "Could not find sdk tools:`naximp.exe`t=>`t$AximpPath`nildasm.exe`t=>`t$IldasmPath`nilasm.exe`t=>`t$IlasmPath" return } @@ -50,7 +57,7 @@ Write-Host "Build MSTSCLib.dll and AxMSTSCLib.dll..." Write-Host "Using aximp.exe from: $AximpPath" Start-Process -FilePath $AximpPath -ArgumentList "$($Env:windir)\system32\mstscax.dll" -Wait -NoNewWindow -# Modify MSTSCLib.ddl to fix an issue with SendKeys (See: https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/9095625c-4361-4e0b-bfcf-be15550b60a8/imsrdpclientnonscriptablesendkeys?forum=windowsgeneraldevelopmentissues&prof=required) +# Modify MSTSCLib.dll to fix an issue with SendKeys (See: https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/9095625c-4361-4e0b-bfcf-be15550b60a8/imsrdpclientnonscriptablesendkeys?forum=windowsgeneraldevelopmentissues&prof=required) Write-Host "Modify MSTSCLib.dll..." Write-Host "Using ildasm.exe from: $IldasmPath" @@ -67,5 +74,6 @@ Write-Host "Replace ""[in] int32& plKeyData"" with ""[in] int32[] marshal([+0]) Start-Process -FilePath $IlasmPath -ArgumentList "/dll ""$MSTSCLibILPath"" /output:""$MSTSCLibDllPath""" -Wait -NoNewWindow +Write-Host "Remove temporary files..." Remove-Item -Path "$MSTSCLibILPath" -Remove-Item -Path "$OutPath\MSTSCLib.res" \ No newline at end of file +Remove-Item -Path "$OutPath\MSTSCLib.res" diff --git a/Source/.editorconfig b/Source/.editorconfig new file mode 100644 index 0000000000..410e0c68e8 --- /dev/null +++ b/Source/.editorconfig @@ -0,0 +1,4 @@ +[*.cs] + +# CA1416: Plattformkompatibilität überprüfen +dotnet_diagnostic.CA1416.severity = silent diff --git a/Source/3rdparty/Dragablz b/Source/3rdparty/Dragablz new file mode 160000 index 0000000000..5045038306 --- /dev/null +++ b/Source/3rdparty/Dragablz @@ -0,0 +1 @@ +Subproject commit 5045038306c479eaf0e7073a51081905ff14b123 diff --git a/Source/AGENTS.md b/Source/AGENTS.md new file mode 100644 index 0000000000..3005b066e2 --- /dev/null +++ b/Source/AGENTS.md @@ -0,0 +1 @@ +See [AGENTS.md](../AGENTS.md) in the repository root for project guidelines and conventions. \ No newline at end of file diff --git a/Source/CLAUDE.md b/Source/CLAUDE.md new file mode 100644 index 0000000000..3005b066e2 --- /dev/null +++ b/Source/CLAUDE.md @@ -0,0 +1 @@ +See [AGENTS.md](../AGENTS.md) in the repository root for project guidelines and conventions. \ No newline at end of file diff --git a/Source/GlobalAssemblyInfo.cs b/Source/GlobalAssemblyInfo.cs index d6196a05ba..3e9b4307d7 100644 --- a/Source/GlobalAssemblyInfo.cs +++ b/Source/GlobalAssemblyInfo.cs @@ -2,9 +2,9 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] -[assembly: AssemblyCopyright("Copyright © 2016-2021 BornToBeRoot")] +[assembly: AssemblyCopyright("Copyright © 2016-2026 BornToBeRoot")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] -[assembly: AssemblyVersion("2022.2.22.0")] -[assembly: AssemblyFileVersion("2022.2.22.0")] +[assembly: AssemblyVersion("2026.7.12.0")] +[assembly: AssemblyFileVersion("2026.7.12.0")] diff --git a/Source/NETworkManager.Controls/GroupExpandedChangedArgs.cs b/Source/NETworkManager.Controls/GroupExpandedChangedArgs.cs new file mode 100644 index 0000000000..975ec5f6cf --- /dev/null +++ b/Source/NETworkManager.Controls/GroupExpandedChangedArgs.cs @@ -0,0 +1,10 @@ +using System; + +namespace NETworkManager.Controls +{ + public class GroupExpandedChangedArgs(string groupName, bool isExpanded) : EventArgs + { + public string GroupName { get; } = groupName; + public bool IsExpanded { get; } = isExpanded; + } +} diff --git a/Source/NETworkManager.Controls/GroupExpander.cs b/Source/NETworkManager.Controls/GroupExpander.cs new file mode 100644 index 0000000000..d5105f0908 --- /dev/null +++ b/Source/NETworkManager.Controls/GroupExpander.cs @@ -0,0 +1,88 @@ +using System.ComponentModel; +using System.Windows; +using System.Windows.Controls; + +namespace NETworkManager.Controls +{ + public class GroupExpander : Expander + { + public static readonly DependencyProperty StateStoreProperty = + DependencyProperty.Register( + nameof(StateStore), + typeof(GroupExpanderStateStore), + typeof(GroupExpander), + new PropertyMetadata(null, OnStateStoreChanged)); + + public GroupExpanderStateStore StateStore + { + get => (GroupExpanderStateStore)GetValue(StateStoreProperty); + set => SetValue(StateStoreProperty, value); + } + + public static readonly DependencyProperty GroupNameProperty = + DependencyProperty.Register( + nameof(GroupName), + typeof(string), + typeof(GroupExpander), + new PropertyMetadata(null, OnGroupNameChanged)); + + public string GroupName + { + get => (string)GetValue(GroupNameProperty); + set => SetValue(GroupNameProperty, value); + } + + static GroupExpander() + { + IsExpandedProperty.OverrideMetadata( + typeof(GroupExpander), + new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnIsExpandedChanged)); + } + + private static void OnIsExpandedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + var expander = (GroupExpander)d; + + if (expander.StateStore != null && expander.GroupName != null) + expander.StateStore[expander.GroupName] = (bool)e.NewValue; + } + + private static void OnStateStoreChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + var expander = (GroupExpander)d; + + if (e.OldValue is GroupExpanderStateStore oldStore) + oldStore.PropertyChanged -= expander.StateStore_PropertyChanged; + + if (e.NewValue is GroupExpanderStateStore newStore) + newStore.PropertyChanged += expander.StateStore_PropertyChanged; + + expander.UpdateIsExpanded(); + } + + private void StateStore_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + if (e.PropertyName == $"Item[{GroupName}]") + UpdateIsExpanded(); + } + + private static void OnGroupNameChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + var expander = (GroupExpander)d; + + expander.UpdateIsExpanded(); + } + + private void UpdateIsExpanded() + { + if (StateStore == null || GroupName == null) + return; + + // Prevent recursive updates + if (IsExpanded == StateStore[GroupName]) + return; + + IsExpanded = StateStore[GroupName]; + } + } +} diff --git a/Source/NETworkManager.Controls/GroupExpanderStateStore.cs b/Source/NETworkManager.Controls/GroupExpanderStateStore.cs new file mode 100644 index 0000000000..2aead547fe --- /dev/null +++ b/Source/NETworkManager.Controls/GroupExpanderStateStore.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; + +namespace NETworkManager.Controls +{ + public class GroupExpanderStateStore : INotifyPropertyChanged + { + public event PropertyChangedEventHandler PropertyChanged; + + /// + /// Occurs when a single group's expansion state changes via the indexer (not raised by ). + /// + public event EventHandler GroupExpandedChanged; + + protected void OnPropertyChanged(string propertyName) => + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + + /// + /// Stores the expansion state of each group by its name. + /// + private readonly Dictionary _states = []; + + /// + /// The indexer to get or set the expansion state of a group by its name. + /// + /// Name of the group. + /// True if expanded, false if collapsed. + public bool this[string groupName] + { + get + { + // Default to expanded if not set + if (!_states.TryGetValue(groupName, out var val)) + _states[groupName] = val = true; + + return val; + } + set + { + if (_states.TryGetValue(groupName, out var existing) && existing == value) + return; + + Debug.WriteLine("GroupExpanderStateStore: Setting state of '{0}' to {1}", groupName, value); + + _states[groupName] = value; + OnPropertyChanged($"Item[{groupName}]"); + GroupExpandedChanged?.Invoke(this, new GroupExpandedChangedArgs(groupName, value)); + } + } + + /// + /// Replaces all stored states with the given ones (e.g. bulk-loading previously persisted state). + /// Does not raise or - consumers + /// (e.g. ) read the current state fresh whenever they bind, so no + /// notification is needed, and this avoids a load-triggers-save feedback loop. + /// + public void LoadState(IReadOnlyDictionary state) + { + _states.Clear(); + + if (state == null) + return; + + foreach (var kvp in state) + _states[kvp.Key] = kvp.Value; + } + } +} diff --git a/Source/NETworkManager.Controls/MultiSelectDataGrid.cs b/Source/NETworkManager.Controls/MultiSelectDataGrid.cs index e096889df7..3aeaeaa4bb 100644 --- a/Source/NETworkManager.Controls/MultiSelectDataGrid.cs +++ b/Source/NETworkManager.Controls/MultiSelectDataGrid.cs @@ -1,27 +1,104 @@ using System.Collections; +using System.Collections.Specialized; using System.Windows; using System.Windows.Controls; -namespace NETworkManager.Controls +namespace NETworkManager.Controls; + +public class MultiSelectDataGrid : DataGrid { - public class MultiSelectDataGrid : DataGrid + private bool _isUpdatingSelection; + + public static readonly DependencyProperty SelectedItemsListProperty = + DependencyProperty.Register("SelectedItemsList", typeof(IList), typeof(MultiSelectDataGrid), + new PropertyMetadata(null, OnSelectedItemsListChanged)); + + public MultiSelectDataGrid() + { + SelectionChanged += DataGridMultiItemSelect_SelectionChanged; + } + + public IList SelectedItemsList + { + get => (IList)GetValue(SelectedItemsListProperty); + set => SetValue(SelectedItemsListProperty, value); + } + + private static void OnSelectedItemsListChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { - public MultiSelectDataGrid() + if (d is not MultiSelectDataGrid dataGrid) + return; + + dataGrid.UnsubscribeFromCollectionChanged(e.OldValue as IList); + dataGrid.SubscribeToCollectionChanged(e.NewValue as IList); + dataGrid.UpdateSelectedItems(); + } + + private void SubscribeToCollectionChanged(IList list) + { + if (list is INotifyCollectionChanged observableCollection) { - SelectionChanged += DataGridMultiItemSelect_SelectionChanged; + observableCollection.CollectionChanged += OnSelectedItemsListCollectionChanged; } + } - private void DataGridMultiItemSelect_SelectionChanged(object sender, SelectionChangedEventArgs e) + private void UnsubscribeFromCollectionChanged(IList list) + { + if (list is INotifyCollectionChanged observableCollection) { - SelectedItemsList = SelectedItems; + observableCollection.CollectionChanged -= OnSelectedItemsListCollectionChanged; } + } + + private void OnSelectedItemsListCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) + { + UpdateSelectedItems(); + } + + private void UpdateSelectedItems() + { + if (_isUpdatingSelection) + return; + + _isUpdatingSelection = true; - public IList SelectedItemsList + try { - get => (IList)GetValue(SelectedItemsListProperty); - set => SetValue(SelectedItemsListProperty, value); + SelectedItems.Clear(); + + if (SelectedItemsList != null) + { + foreach (var item in SelectedItemsList) + { + SelectedItems.Add(item); + } + } + } + finally + { + _isUpdatingSelection = false; } + } - public static readonly DependencyProperty SelectedItemsListProperty = DependencyProperty.Register("SelectedItemsList", typeof(IList), typeof(MultiSelectDataGrid), new PropertyMetadata(null)); + private void DataGridMultiItemSelect_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (_isUpdatingSelection || SelectedItemsList == null) + return; + + _isUpdatingSelection = true; + + try + { + SelectedItemsList.Clear(); + + foreach (var item in SelectedItems) + { + SelectedItemsList.Add(item); + } + } + finally + { + _isUpdatingSelection = false; + } } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Controls/MultiSelectScrollingDataGrid.cs b/Source/NETworkManager.Controls/MultiSelectScrollingDataGrid.cs index 7d94c1e296..d481d804f7 100644 --- a/Source/NETworkManager.Controls/MultiSelectScrollingDataGrid.cs +++ b/Source/NETworkManager.Controls/MultiSelectScrollingDataGrid.cs @@ -3,39 +3,40 @@ using System.Windows; using System.Windows.Controls; -namespace NETworkManager.Controls +namespace NETworkManager.Controls; + +public class MultiSelectScrollingDataGrid : DataGrid { - public class MultiSelectScrollingDataGrid : DataGrid - { - public MultiSelectScrollingDataGrid() - { - SelectionChanged += DataGridMultiItemSelect_SelectionChanged; - } + public static readonly DependencyProperty SelectedItemsListProperty = + DependencyProperty.Register("SelectedItemsList", typeof(IList), typeof(MultiSelectScrollingDataGrid), + new PropertyMetadata(null)); - private void DataGridMultiItemSelect_SelectionChanged(object sender, SelectionChangedEventArgs e) - { - SelectedItemsList = SelectedItems; - } + public MultiSelectScrollingDataGrid() + { + SelectionChanged += DataGridMultiItemSelect_SelectionChanged; + } - public IList SelectedItemsList - { - get => (IList)GetValue(SelectedItemsListProperty); - set => SetValue(SelectedItemsListProperty, value); - } + public IList SelectedItemsList + { + get => (IList)GetValue(SelectedItemsListProperty); + set => SetValue(SelectedItemsListProperty, value); + } - public static readonly DependencyProperty SelectedItemsListProperty = DependencyProperty.Register("SelectedItemsList", typeof(IList), typeof(MultiSelectScrollingDataGrid), new PropertyMetadata(null)); + private void DataGridMultiItemSelect_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + SelectedItemsList = SelectedItems; + } - protected override void OnItemsChanged(NotifyCollectionChangedEventArgs e) - { - if (e.NewItems == null) - return; + protected override void OnItemsChanged(NotifyCollectionChangedEventArgs e) + { + if (e.NewItems == null) + return; - var newItemCount = e.NewItems.Count; + var newItemCount = e.NewItems.Count; - if (newItemCount > 0) - ScrollIntoView(e.NewItems[newItemCount - 1]); + if (newItemCount > 0) + ScrollIntoView(e.NewItems[newItemCount - 1]); - base.OnItemsChanged(e); - } + base.OnItemsChanged(e); } } \ No newline at end of file diff --git a/Source/NETworkManager.Controls/NETworkManager.Controls.csproj b/Source/NETworkManager.Controls/NETworkManager.Controls.csproj index 5b61241616..4de1ff2b59 100644 --- a/Source/NETworkManager.Controls/NETworkManager.Controls.csproj +++ b/Source/NETworkManager.Controls/NETworkManager.Controls.csproj @@ -1,22 +1,16 @@ - - - {95EA884C-E498-4A47-A316-DC890BF7F0D2} - Library - NETworkManager.Controls - NETworkManager.Controls - net6.0-windows10.0.17763.0 - win10-x64 - false - true - false - - - - - - - - - \ No newline at end of file + + + {95EA884C-E498-4A47-A316-DC890BF7F0D2} + Library + NETworkManager.Controls + NETworkManager.Controls + net10.0-windows10.0.22621.0 + false + true + false + false + + + + + diff --git a/Source/NETworkManager.Controls/ObservableSetCollection.cs b/Source/NETworkManager.Controls/ObservableSetCollection.cs index 48825552ff..8d1a6f8068 100644 --- a/Source/NETworkManager.Controls/ObservableSetCollection.cs +++ b/Source/NETworkManager.Controls/ObservableSetCollection.cs @@ -1,42 +1,37 @@ using System.Collections.Generic; using System.Collections.ObjectModel; +namespace NETworkManager.Controls; -namespace NETworkManager.Controls +public class ObservableSetCollection : ObservableCollection { - public class ObservableSetCollection : ObservableCollection - { - public ObservableSetCollection() - { - - } - - public ObservableSetCollection(List list) : base(list) - { - - } + public ObservableSetCollection() + { + } - public ObservableSetCollection(IEnumerable collection) : base(collection) - { + public ObservableSetCollection(List list) : base(list) + { + } - } + public ObservableSetCollection(IEnumerable collection) : base(collection) + { + } - protected override void InsertItem(int index, T item) - { - if (Contains(item)) - return; // Item already exists + protected override void InsertItem(int index, T item) + { + if (Contains(item)) + return; // Item already exists - base.InsertItem(index, item); - } + base.InsertItem(index, item); + } - protected override void SetItem(int index, T item) - { - int i = IndexOf(item); + protected override void SetItem(int index, T item) + { + var i = IndexOf(item); - if (i >= 0 && i != index) - return; // Item already exists + if (i >= 0 && i != index) + return; // Item already exists - base.SetItem(index, item); - } + base.SetItem(index, item); } } \ No newline at end of file diff --git a/Source/NETworkManager.Controls/Properties/AssemblyInfo.cs b/Source/NETworkManager.Controls/Properties/AssemblyInfo.cs index 956e029bc4..bdcb6c8374 100644 --- a/Source/NETworkManager.Controls/Properties/AssemblyInfo.cs +++ b/Source/NETworkManager.Controls/Properties/AssemblyInfo.cs @@ -4,7 +4,5 @@ [assembly: AssemblyTitle("NETworkManager.Controls")] [assembly: AssemblyDescription("Library contains NETworkManager controls.")] [assembly: AssemblyProduct("NETworkManager.Controls")] - [assembly: ComVisible(false)] - -[assembly: Guid("95ea884c-e498-4a47-a316-dc890bf7f0d2")] +[assembly: Guid("95ea884c-e498-4a47-a316-dc890bf7f0d2")] \ No newline at end of file diff --git a/Source/NETworkManager.Converters/AccentToStringConverter.cs b/Source/NETworkManager.Converters/AccentToStringConverter.cs index f48e4f4cb7..1197301bf1 100644 --- a/Source/NETworkManager.Converters/AccentToStringConverter.cs +++ b/Source/NETworkManager.Converters/AccentToStringConverter.cs @@ -1,44 +1,38 @@ using System; using System.Globalization; using System.Windows.Data; -using NETworkManager.Localization.Translators; -using NETworkManager.Models.Appearance; +using NETworkManager.Localization; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +/// +/// Convert to translated or wise versa. +/// +public sealed class AccentToStringConverter : IValueConverter { /// - /// Convert to translated or wise versa. + /// Convert to translated . /// - public sealed class AccentToStringConverter : IValueConverter + /// Object from type . + /// + /// + /// + /// Translated . + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { + return value is not string accent ? "-/-" : ResourceTranslator.Translate(ResourceIdentifier.Accent, accent); + } - /// - /// Convert to translated . - /// - /// Object from type . - /// - /// - /// - /// Translated . - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is string accent)) - return "-/-"; - - return AccentTranslator.GetInstance().Translate(accent); - } - - /// - /// !!! Method not implemented !!! - /// - /// - /// - /// - /// - /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + /// + /// !!! Method not implemented !!! + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/ApplicationNameToIconConverter.cs b/Source/NETworkManager.Converters/ApplicationNameToIconConverter.cs index 19f52f54a6..29f8e1bef7 100644 --- a/Source/NETworkManager.Converters/ApplicationNameToIconConverter.cs +++ b/Source/NETworkManager.Converters/ApplicationNameToIconConverter.cs @@ -4,40 +4,36 @@ using System.Windows.Data; using NETworkManager.Models; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +/// +/// Convert to icon () or wise versa. +/// +public sealed class ApplicationNameToIconConverter : IValueConverter { /// - /// Convert to icon () or wise versa. + /// Convert to icon (). /// - public sealed class ApplicationNameToIconConverter : IValueConverter + /// Object from type . + /// + /// + /// + /// Icon (cref="Canvas"/>). + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - /// - /// Convert to icon (). - /// - /// Object from type . - /// - /// - /// - /// Icon (cref="Canvas"/>). - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is ApplicationName name)) - return null; + return value is not ApplicationName name ? null : ApplicationManager.GetIcon(name); + } - return ApplicationManager.GetIcon(name); - } - - /// - /// !!! Method not implemented !!! - /// - /// - /// - /// - /// - /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + /// + /// !!! Method not implemented !!! + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/ApplicationNameToTranslatedStringConverter.cs b/Source/NETworkManager.Converters/ApplicationNameToTranslatedStringConverter.cs index b8e5647741..63fed8cd8e 100644 --- a/Source/NETworkManager.Converters/ApplicationNameToTranslatedStringConverter.cs +++ b/Source/NETworkManager.Converters/ApplicationNameToTranslatedStringConverter.cs @@ -1,43 +1,41 @@ -using NETworkManager.Localization.Translators; -using NETworkManager.Models; -using System; +using System; using System.Globalization; using System.Windows.Data; +using NETworkManager.Localization; +using NETworkManager.Models; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +/// +/// Convert to translated or wise versa. +/// +public sealed class ApplicationNameToTranslatedStringConverter : IValueConverter { /// - /// Convert to translated or wise versa. + /// Convert to translated . /// - public sealed class ApplicationNameToTranslatedStringConverter : IValueConverter + /// Object from type . + /// + /// + /// + /// Translated . + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - /// - /// Convert to translated . - /// - /// Object from type . - /// - /// - /// - /// Translated . - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is ApplicationName name)) - return "-/-"; + return value is not ApplicationName name + ? "-/-" + : ResourceTranslator.Translate(ResourceIdentifier.ApplicationName, name); + } - return ApplicationNameTranslator.GetInstance().Translate(name); - } - - /// - /// !!! Method not implemented !!! - /// - /// - /// - /// - /// - /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + /// + /// !!! Method not implemented !!! + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/AutoRefreshTimeToStringConverter.cs b/Source/NETworkManager.Converters/AutoRefreshTimeToStringConverter.cs index 5aedca1896..559f5c6c2d 100644 --- a/Source/NETworkManager.Converters/AutoRefreshTimeToStringConverter.cs +++ b/Source/NETworkManager.Converters/AutoRefreshTimeToStringConverter.cs @@ -1,43 +1,41 @@ using System; using System.Globalization; using System.Windows.Data; -using NETworkManager.Localization.Translators; +using NETworkManager.Localization; using NETworkManager.Utilities; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +/// +/// Convert to translated or wise versa. +/// +public sealed class AutoRefreshTimeToStringConverter : IValueConverter { /// - /// Convert to translated or wise versa. + /// Convert to translated . /// - public sealed class AutoRefreshTimeToStringConverter : IValueConverter + /// Object from type . + /// + /// + /// + /// Translated . + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - /// - /// Convert to translated . - /// - /// Object from type . - /// - /// - /// - /// Translated . - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is TimeUnit timeUnit)) - return "-/-"; - - return TimeUnitTranslator.GetInstance().Translate(timeUnit); - } + return value is not TimeUnit timeUnit + ? "-/-" + : ResourceTranslator.Translate(ResourceIdentifier.TimeUnit, timeUnit); + } - /// - /// !!! Method not implemented !!! - /// - /// - /// - /// - /// - /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + /// + /// !!! Method not implemented !!! + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } } \ No newline at end of file diff --git a/Source/NETworkManager.Converters/BandwidthBytesToSpeedConverter.cs b/Source/NETworkManager.Converters/BandwidthBytesToSpeedConverter.cs index c5451d8dc6..1f6d2a02cf 100644 --- a/Source/NETworkManager.Converters/BandwidthBytesToSpeedConverter.cs +++ b/Source/NETworkManager.Converters/BandwidthBytesToSpeedConverter.cs @@ -1,20 +1,31 @@ -using System; +using System; using System.Globalization; using System.Windows.Data; using NETworkManager.Utilities; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +/// +/// Converts a byte-per-second value to a human-readable speed string. +/// Pass the converter parameter "bytes" to format as byte/s (e.g. "1.54 MB/s"); +/// any other value (default) formats as bit/s (e.g. "12.3 Mbit/s") to match the chart axis. +/// +public sealed class BandwidthBytesToSpeedConverter : IValueConverter { - public sealed class BandwidthBytesToSpeedConverter : IValueConverter + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return value != null ? $"{FileSizeConverter.GetBytesReadable((long)value * 8)}it/s ({FileSizeConverter.GetBytesReadable((long)value)}/s)" : "-/-"; - } + if (value == null) + return "-/-"; + + var bytesPerSecond = (long)value; - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + return parameter as string == "bytes" + ? $"{FileSizeConverter.GetBytesReadable(bytesPerSecond)}/s" + : $"{FileSizeConverter.GetBytesReadable(bytesPerSecond * 8)}it/s"; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } } diff --git a/Source/NETworkManager.Converters/BandwidthBytesWithSizeConverter.cs b/Source/NETworkManager.Converters/BandwidthBytesWithSizeConverter.cs deleted file mode 100644 index c080ac2061..0000000000 --- a/Source/NETworkManager.Converters/BandwidthBytesWithSizeConverter.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Globalization; -using System.Windows.Data; -using NETworkManager.Utilities; - -namespace NETworkManager.Converters -{ - public sealed class BandwidthBytesWithSizeConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return value != null ? $"{(long)value} ({FileSizeConverter.GetBytesReadable((long)value)})" : "-/-"; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Source/NETworkManager.Converters/BigIntegerToStringConverter.cs b/Source/NETworkManager.Converters/BigIntegerToStringConverter.cs index 406cff3baa..503baada57 100644 --- a/Source/NETworkManager.Converters/BigIntegerToStringConverter.cs +++ b/Source/NETworkManager.Converters/BigIntegerToStringConverter.cs @@ -5,21 +5,20 @@ using System.Windows; using System.Windows.Data; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class BigIntegerToStringConverter : IValueConverter { - public sealed class BigIntegerToStringConverter : IValueConverter + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (DesignerProperties.GetIsInDesignMode(new DependencyObject())) - return "-/-"; + if (DesignerProperties.GetIsInDesignMode(new DependencyObject())) + return "-/-"; - return value != null ? ((BigInteger) value).ToString() : "-/-"; - } + return value != null ? ((BigInteger)value).ToString() : "-/-"; + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/BooleanReverseConverter.cs b/Source/NETworkManager.Converters/BooleanReverseConverter.cs index ece7ddcd05..44952c0e12 100644 --- a/Source/NETworkManager.Converters/BooleanReverseConverter.cs +++ b/Source/NETworkManager.Converters/BooleanReverseConverter.cs @@ -2,18 +2,17 @@ using System.Globalization; using System.Windows.Data; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class BooleanReverseConverter : IValueConverter { - public sealed class BooleanReverseConverter : IValueConverter + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return value != null && !(bool)value; - } + return value != null && !(bool)value; + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/BooleanReverseToVisibilityCollapsedConverter.cs b/Source/NETworkManager.Converters/BooleanReverseToVisibilityCollapsedConverter.cs index d926252bac..90e9ced8ee 100644 --- a/Source/NETworkManager.Converters/BooleanReverseToVisibilityCollapsedConverter.cs +++ b/Source/NETworkManager.Converters/BooleanReverseToVisibilityCollapsedConverter.cs @@ -3,18 +3,17 @@ using System.Windows; using System.Windows.Data; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class BooleanReverseToVisibilityCollapsedConverter : IValueConverter { - public sealed class BooleanReverseToVisibilityCollapsedConverter : IValueConverter + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return value is bool visible && visible ? Visibility.Collapsed : Visibility.Visible; - } + return value is true ? Visibility.Collapsed : Visibility.Visible; + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/BooleanReverseToVisibilityHiddenConverter.cs b/Source/NETworkManager.Converters/BooleanReverseToVisibilityHiddenConverter.cs index c7ddd1a41b..43f82cc0e0 100644 --- a/Source/NETworkManager.Converters/BooleanReverseToVisibilityHiddenConverter.cs +++ b/Source/NETworkManager.Converters/BooleanReverseToVisibilityHiddenConverter.cs @@ -3,18 +3,17 @@ using System.Windows; using System.Windows.Data; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class BooleanReverseToVisibilityHiddenConverter : IValueConverter { - public sealed class BooleanReverseToVisibilityHiddenConverter : IValueConverter + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return value is bool visible && visible ? Visibility.Hidden : Visibility.Visible; - } + return value is true ? Visibility.Hidden : Visibility.Visible; + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/BooleanToStringConverter.cs b/Source/NETworkManager.Converters/BooleanToStringConverter.cs index 90a1901f99..b63a53381c 100644 --- a/Source/NETworkManager.Converters/BooleanToStringConverter.cs +++ b/Source/NETworkManager.Converters/BooleanToStringConverter.cs @@ -1,22 +1,22 @@ using System; using System.Globalization; using System.Windows.Data; +using NETworkManager.Localization.Resources; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class BooleanToStringConverter : IValueConverter { - public sealed class BooleanToStringConverter : IValueConverter + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (value != null && (bool) value) - return Localization.Resources.Strings.Yes; + if (value != null && (bool)value) + return Strings.Yes; - return Localization.Resources.Strings.No; - } + return Strings.No; + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/BooleanToVisibilityCollapsedConverter.cs b/Source/NETworkManager.Converters/BooleanToVisibilityCollapsedConverter.cs index aded844365..52a6585f94 100644 --- a/Source/NETworkManager.Converters/BooleanToVisibilityCollapsedConverter.cs +++ b/Source/NETworkManager.Converters/BooleanToVisibilityCollapsedConverter.cs @@ -3,18 +3,17 @@ using System.Windows; using System.Windows.Data; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class BooleanToVisibilityCollapsedConverter : IValueConverter { - public sealed class BooleanToVisibilityCollapsedConverter : IValueConverter + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return value is bool visible && visible ? Visibility.Visible : Visibility.Collapsed; - } + return value is true ? Visibility.Visible : Visibility.Collapsed; + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/BooleanToVisibilityHiddenConverter.cs b/Source/NETworkManager.Converters/BooleanToVisibilityHiddenConverter.cs index 5282d355de..306b3c7dc8 100644 --- a/Source/NETworkManager.Converters/BooleanToVisibilityHiddenConverter.cs +++ b/Source/NETworkManager.Converters/BooleanToVisibilityHiddenConverter.cs @@ -3,18 +3,17 @@ using System.Windows; using System.Windows.Data; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class BooleanToVisibilityHiddenConverter : IValueConverter { - public sealed class BooleanToVisibilityHiddenConverter : IValueConverter + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return value is bool visible && visible ? Visibility.Visible : Visibility.Hidden; - } + return value is true ? Visibility.Visible : Visibility.Hidden; + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/BooleansAndToVisibilityCollapsedConverter.cs b/Source/NETworkManager.Converters/BooleansAndToVisibilityCollapsedConverter.cs new file mode 100644 index 0000000000..27f1a39ca4 --- /dev/null +++ b/Source/NETworkManager.Converters/BooleansAndToVisibilityCollapsedConverter.cs @@ -0,0 +1,20 @@ +using System; +using System.Globalization; +using System.Linq; +using System.Windows; +using System.Windows.Data; + +namespace NETworkManager.Converters; + +public sealed class BooleansAndToVisibilityCollapsedConverter : IMultiValueConverter +{ + public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) + { + return values.OfType().All(b => b) ? Visibility.Visible : Visibility.Collapsed; + } + + public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/BooleansOrConverter.cs b/Source/NETworkManager.Converters/BooleansOrConverter.cs index a5cd475aa3..1c78fee710 100644 --- a/Source/NETworkManager.Converters/BooleansOrConverter.cs +++ b/Source/NETworkManager.Converters/BooleansOrConverter.cs @@ -3,18 +3,17 @@ using System.Linq; using System.Windows.Data; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class BooleansOrConverter : IMultiValueConverter { - public sealed class BooleansOrConverter : IMultiValueConverter + public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) - { - return values.Any(value => (bool) value); - } + return values?.OfType().Any(value => value) ?? false; + } - public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/BooleansOrToVisibilityCollapsedConverter.cs b/Source/NETworkManager.Converters/BooleansOrToVisibilityCollapsedConverter.cs new file mode 100644 index 0000000000..c9b4403798 --- /dev/null +++ b/Source/NETworkManager.Converters/BooleansOrToVisibilityCollapsedConverter.cs @@ -0,0 +1,20 @@ +using System; +using System.Globalization; +using System.Linq; +using System.Windows; +using System.Windows.Data; + +namespace NETworkManager.Converters; + +public sealed class BooleansOrToVisibilityCollapsedConverter : IMultiValueConverter +{ + public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) + { + return values.OfType().Any(b => b) ? Visibility.Visible : Visibility.Collapsed; + } + + public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/Bytes1000ToSizeConverter.cs b/Source/NETworkManager.Converters/Bytes1000ToSizeConverter.cs index 82d19b99da..68d3c7308e 100644 --- a/Source/NETworkManager.Converters/Bytes1000ToSizeConverter.cs +++ b/Source/NETworkManager.Converters/Bytes1000ToSizeConverter.cs @@ -3,18 +3,17 @@ using System.Windows.Data; using NETworkManager.Utilities; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class Bytes1000ToSizeConverter : IValueConverter { - public sealed class Bytes1000ToSizeConverter : IValueConverter + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return value != null ? $"{FileSizeConverter.GetBytesReadable((long)value)}" : "-/-"; - } + return value != null ? $"{FileSizeConverter.GetBytesReadable((long)value)}" : "-/-"; + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/Bytes1000ToSpeedConverter.cs b/Source/NETworkManager.Converters/Bytes1000ToSpeedConverter.cs index 927e872b31..39c36914ba 100644 --- a/Source/NETworkManager.Converters/Bytes1000ToSpeedConverter.cs +++ b/Source/NETworkManager.Converters/Bytes1000ToSpeedConverter.cs @@ -2,30 +2,30 @@ using System.Globalization; using System.Windows.Data; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class Bytes1000ToSpeedConverter : IValueConverter { - public sealed class Bytes1000ToSpeedConverter : IValueConverter - { - private readonly string[] _sizes = { "Bit/s", "KBit/s", "MBit/s", "GBit/s", "Tbit/s" }; + private readonly string[] _sizes = { "Bit/s", "KBit/s", "MBit/s", "GBit/s", "TBit/s" }; - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (value == null) - return "-/-"; + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value == null) + return "-/-"; - double.TryParse(value.ToString(), out var bits); + if (!double.TryParse(value.ToString(), out var bits)) + return "-/-"; - var sizeCount = 0; + var sizeCount = 0; - while (bits >= 1000 && ++sizeCount < _sizes.Length) - bits /= 1000; + while (bits >= 1000 && ++sizeCount < _sizes.Length) + bits /= 1000; - return $"{bits} {_sizes[sizeCount]}"; - } + return $"{bits} {_sizes[sizeCount]}"; + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/BytesToExactStringConverter.cs b/Source/NETworkManager.Converters/BytesToExactStringConverter.cs new file mode 100644 index 0000000000..062dad8cb0 --- /dev/null +++ b/Source/NETworkManager.Converters/BytesToExactStringConverter.cs @@ -0,0 +1,23 @@ +using System; +using System.Globalization; +using System.Windows.Data; +using NETworkManager.Localization.Resources; + +namespace NETworkManager.Converters; + +/// +/// Converts a byte count to its exact value with thousands separators and a "Bytes" unit +/// (e.g. "6,783,176,192 Bytes"). Intended for tooltips that complement a human-readable size. +/// +public sealed class BytesToExactStringConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return value != null ? string.Format(culture, "{0:N0} {1}", (long)value, Strings.Bytes) : "-/-"; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} diff --git a/Source/NETworkManager.Converters/ChildWindowIconToRectangleStyleConverter.cs b/Source/NETworkManager.Converters/ChildWindowIconToRectangleStyleConverter.cs new file mode 100644 index 0000000000..70a230222f --- /dev/null +++ b/Source/NETworkManager.Converters/ChildWindowIconToRectangleStyleConverter.cs @@ -0,0 +1,35 @@ +using NETworkManager.Utilities; +using System; +using System.Globalization; +using System.Windows; +using System.Windows.Data; + +namespace NETworkManager.Converters; + +public sealed class ChildWindowIconToRectangleStyleConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is not ChildWindowIcon icon) + return null; + + switch (icon) + { + case ChildWindowIcon.Info: + return Application.Current.FindResource("InfoImageRectangle"); + case ChildWindowIcon.Question: + return Application.Current.FindResource("QuestionImageRectangle"); + case ChildWindowIcon.Warn: + return Application.Current.FindResource("WarnImageRectangle"); + case ChildWindowIcon.Error: + return Application.Current.FindResource("ErrorImageRectangle"); + default: + return null; + } + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/ConnectionStateToRectangleStyleConverter.cs b/Source/NETworkManager.Converters/ConnectionStateToRectangleStyleConverter.cs index b9de369148..abf4c7eb2c 100644 --- a/Source/NETworkManager.Converters/ConnectionStateToRectangleStyleConverter.cs +++ b/Source/NETworkManager.Converters/ConnectionStateToRectangleStyleConverter.cs @@ -4,37 +4,36 @@ using System.Windows.Data; using NETworkManager.Models.Network; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class ConnectionStateToRectangleStyleConverter : IValueConverter { - public sealed class ConnectionStateToRectangleStyleConverter : IValueConverter + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (value != null && value is ConnectionState state) - { - switch (state) - { - case ConnectionState.None: - break; - case ConnectionState.OK: - return Application.Current.Resources["CheckRectangle"] as Style; - case ConnectionState.Warning: - return Application.Current.Resources["AlertRectangle"] as Style; - case ConnectionState.Critical: - return Application.Current.Resources["ErrorRectangle"] as Style; - case ConnectionState.Info: - return Application.Current.Resources["InfoRectangle"] as Style; - default: - throw new ArgumentOutOfRangeException(); - } - } - + if (value is not ConnectionState state) return Application.Current.Resources["HiddenRectangle"] as Style; - } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + switch (state) { - throw new NotImplementedException(); + case ConnectionState.None: + break; + case ConnectionState.OK: + return Application.Current.Resources["CheckRectangle"] as Style; + case ConnectionState.Warning: + return Application.Current.Resources["AlertRectangle"] as Style; + case ConnectionState.Critical: + return Application.Current.Resources["ErrorRectangle"] as Style; + case ConnectionState.Info: + return Application.Current.Resources["InfoRectangle"] as Style; + default: + throw new ArgumentOutOfRangeException(); } + + return Application.Current.Resources["HiddenRectangle"] as Style; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/ConnectionStateToStringConverter.cs b/Source/NETworkManager.Converters/ConnectionStateToStringConverter.cs deleted file mode 100644 index 60ad07e8b0..0000000000 --- a/Source/NETworkManager.Converters/ConnectionStateToStringConverter.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Globalization; -using System.Windows.Data; -using NETworkManager.Localization.Translators; -using NETworkManager.Models.Network; - -namespace NETworkManager.Converters -{ - /// - /// Convert to translated or wise versa. - /// - public sealed class ConnectionStateToStringConverter : IValueConverter - { - /// - /// Convert to translated . - /// - /// Object from type . - /// - /// - /// - /// Translated . - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is ConnectionState connectionState)) - return "-/-"; - - return ConnectionStateTranslator.GetInstance().Translate(connectionState); - } - - /// - /// !!! Method not implemented !!! - /// - /// - /// - /// - /// - /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/DNSServerInfoToString.cs b/Source/NETworkManager.Converters/DNSServerInfoToString.cs deleted file mode 100644 index 7d4924bc22..0000000000 --- a/Source/NETworkManager.Converters/DNSServerInfoToString.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Globalization; -using System.Windows.Data; -using NETworkManager.Models.Network; -using NETworkManager.Localization.Resources; - -namespace NETworkManager.Converters -{ - public sealed class DNSServerInfoToString : IValueConverter - { - /* Convert an MahApps.Metro.Accent (from wpf/xaml-binding) to a Brush to fill rectangle with color in a ComboBox */ - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is DNSServerInfo dnsServerInfo)) - return "-/-"; - - return dnsServerInfo.UseWindowsDNSServer ? $"[{Strings.WindowsDNSSettings}]" : dnsServerInfo.Name; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Source/NETworkManager.Converters/DateTimeToStringConverter.cs b/Source/NETworkManager.Converters/DateTimeToStringConverter.cs new file mode 100644 index 0000000000..7fa3376fc2 --- /dev/null +++ b/Source/NETworkManager.Converters/DateTimeToStringConverter.cs @@ -0,0 +1,19 @@ +using System; +using System.Globalization; +using System.Windows.Data; +using NETworkManager.Utilities; + +namespace NETworkManager.Converters; + +public sealed class DateTimeToStringConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return value is DateTime dateTime ? DateTimeHelper.DateTimeToFullDateTimeString(dateTime) : "-/-"; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/DiscoveryProtocolToStringConverter.cs b/Source/NETworkManager.Converters/DiscoveryProtocolToStringConverter.cs index af943e3dd2..47874862a7 100644 --- a/Source/NETworkManager.Converters/DiscoveryProtocolToStringConverter.cs +++ b/Source/NETworkManager.Converters/DiscoveryProtocolToStringConverter.cs @@ -1,44 +1,42 @@ using System; using System.Globalization; using System.Windows.Data; -using NETworkManager.Localization.Translators; +using NETworkManager.Localization; using NETworkManager.Models.Network; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +/// +/// Convert to translated or wise versa. +/// +public sealed class DiscoveryProtocolToStringConverter : IValueConverter { /// - /// Convert to translated or wise versa. + /// Convert to translated . /// - public sealed class DiscoveryProtocolToStringConverter : IValueConverter + /// Object from type . + /// + /// + /// + /// Translated . + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - /// - /// Convert to translated . - /// - /// Object from type . - /// - /// - /// - /// Translated . - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is DiscoveryProtocol.Protocol discoveryProtocol)) - return "-/-"; - - return DiscoveryProtocolTranslator.GetInstance().Translate(discoveryProtocol); - } - - /// - /// !!! Method not implemented !!! - /// - /// - /// - /// - /// - /// + return value is not DiscoveryProtocol discoveryProtocol + ? "-/-" + : ResourceTranslator.Translate(ResourceIdentifier.DiscoveryProtocol, + discoveryProtocol); + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + /// + /// !!! Method not implemented !!! + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/DoubleToMillisecondsStringConverter.cs b/Source/NETworkManager.Converters/DoubleToMillisecondsStringConverter.cs new file mode 100644 index 0000000000..240215b58c --- /dev/null +++ b/Source/NETworkManager.Converters/DoubleToMillisecondsStringConverter.cs @@ -0,0 +1,18 @@ +using System; +using System.Globalization; +using System.Windows.Data; + +namespace NETworkManager.Converters; + +public sealed class DoubleToMillisecondsStringConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return value is double milliseconds ? $"{milliseconds} ms" : "-/-"; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/DoubleToSecondsStringConverter.cs b/Source/NETworkManager.Converters/DoubleToSecondsStringConverter.cs new file mode 100644 index 0000000000..6654400436 --- /dev/null +++ b/Source/NETworkManager.Converters/DoubleToSecondsStringConverter.cs @@ -0,0 +1,18 @@ +using System; +using System.Globalization; +using System.Windows.Data; + +namespace NETworkManager.Converters; + +public sealed class IntToSecondsStringConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return value is double seconds ? $"{seconds} s" : "-/-"; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/DoubleToStringConverter.cs b/Source/NETworkManager.Converters/DoubleToStringConverter.cs new file mode 100644 index 0000000000..83df09b01f --- /dev/null +++ b/Source/NETworkManager.Converters/DoubleToStringConverter.cs @@ -0,0 +1,20 @@ +using System; +using System.Globalization; +using System.Windows.Data; + +namespace NETworkManager.Converters; + +public sealed class DoubleToStringConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return value is double doubleValue + ? doubleValue == 0 ? "-/-" : doubleValue.ToString(CultureInfo.CurrentCulture) + : "-/-"; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/FirewallInterfaceTypeToStringConverter.cs b/Source/NETworkManager.Converters/FirewallInterfaceTypeToStringConverter.cs new file mode 100644 index 0000000000..f15e2ac52b --- /dev/null +++ b/Source/NETworkManager.Converters/FirewallInterfaceTypeToStringConverter.cs @@ -0,0 +1,41 @@ +using System; +using System.Globalization; +using System.Windows.Data; +using NETworkManager.Localization; +using NETworkManager.Models.Firewall; + +namespace NETworkManager.Converters; + +/// +/// Convert to translated or vice versa. +/// +public sealed class FirewallInterfaceTypeToStringConverter : IValueConverter +{ + /// + /// Convert to translated . + /// + /// Object from type . + /// + /// + /// + /// Translated . + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return value is not FirewallInterfaceType interfaceType + ? "-/-" + : ResourceTranslator.Translate(ResourceIdentifier.FirewallInterfaceType, interfaceType); + } + + /// + /// !!! Method not implemented !!! + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/FirewallNetworkProfilesToStringConverter.cs b/Source/NETworkManager.Converters/FirewallNetworkProfilesToStringConverter.cs new file mode 100644 index 0000000000..5e5225bad9 --- /dev/null +++ b/Source/NETworkManager.Converters/FirewallNetworkProfilesToStringConverter.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Windows.Data; +using NETworkManager.Localization.Resources; + +namespace NETworkManager.Converters; + +/// +/// Convert a array (Domain, Private, Public) representing firewall network +/// profiles to a localized , or vice versa. +/// +public sealed class FirewallNetworkProfilesToStringConverter : IValueConverter +{ + /// + /// Convert a array (Domain, Private, Public) to a localized . + /// Returns the localized "Any" label when all three profiles are active or none are active, + /// since both cases are treated as "Any" by the Windows Firewall PowerShell layer. + /// + /// A array with exactly three elements. + /// + /// + /// + /// Localized, comma-separated profile list (e.g. "Domain, Private, Public"), or "Any". + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is not bool[] { Length: 3 } profiles) + return "-/-"; + + if ((profiles[0] && profiles[1] && profiles[2]) || (!profiles[0] && !profiles[1] && !profiles[2])) + return Strings.Any; + + var names = new List(3); + if (profiles[0]) names.Add(Strings.Domain); + if (profiles[1]) names.Add(Strings.Private); + if (profiles[2]) names.Add(Strings.Public); + + return string.Join(", ", names); + } + + /// + /// !!! Method not implemented !!! + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} diff --git a/Source/NETworkManager.Converters/FirewallProtocolToStringConverter.cs b/Source/NETworkManager.Converters/FirewallProtocolToStringConverter.cs new file mode 100644 index 0000000000..daced724af --- /dev/null +++ b/Source/NETworkManager.Converters/FirewallProtocolToStringConverter.cs @@ -0,0 +1,41 @@ +using System; +using System.Globalization; +using System.Windows.Data; +using NETworkManager.Localization; +using NETworkManager.Models.Firewall; + +namespace NETworkManager.Converters; + +/// +/// Convert to translated or vice versa. +/// +public sealed class FirewallProtocolToStringConverter : IValueConverter +{ + /// + /// Convert to translated . + /// + /// Object from type . + /// + /// + /// + /// Translated . + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return value is not FirewallProtocol protocol + ? "-/-" + : ResourceTranslator.Translate(ResourceIdentifier.FirewallProtocol, protocol); + } + + /// + /// !!! Method not implemented !!! + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/FirewallRuleActionToStringConverter.cs b/Source/NETworkManager.Converters/FirewallRuleActionToStringConverter.cs new file mode 100644 index 0000000000..052932ab47 --- /dev/null +++ b/Source/NETworkManager.Converters/FirewallRuleActionToStringConverter.cs @@ -0,0 +1,41 @@ +using System; +using System.Globalization; +using System.Windows.Data; +using NETworkManager.Localization; +using NETworkManager.Models.Firewall; + +namespace NETworkManager.Converters; + +/// +/// Convert to translated or vice versa. +/// +public sealed class FirewallRuleActionToStringConverter : IValueConverter +{ + /// + /// Convert to translated . + /// + /// Object from type . + /// + /// + /// + /// Translated . + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return value is not FirewallRuleAction action + ? "-/-" + : ResourceTranslator.Translate(ResourceIdentifier.FirewallRuleAction, action); + } + + /// + /// !!! Method not implemented !!! + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/FirewallRuleDirectionToStringConverter.cs b/Source/NETworkManager.Converters/FirewallRuleDirectionToStringConverter.cs new file mode 100644 index 0000000000..a180ff65c7 --- /dev/null +++ b/Source/NETworkManager.Converters/FirewallRuleDirectionToStringConverter.cs @@ -0,0 +1,41 @@ +using System; +using System.Globalization; +using System.Windows.Data; +using NETworkManager.Localization; +using NETworkManager.Models.Firewall; + +namespace NETworkManager.Converters; + +/// +/// Convert to translated or vice versa. +/// +public sealed class FirewallRuleDirectionToStringConverter : IValueConverter +{ + /// + /// Convert to translated . + /// + /// Object from type . + /// + /// + /// + /// Translated . + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return value is not FirewallRuleDirection direction + ? "-/-" + : ResourceTranslator.Translate(ResourceIdentifier.FirewallRuleDirection, direction); + } + + /// + /// !!! Method not implemented !!! + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/GroupViewNameToTranslatedStringConverter.cs b/Source/NETworkManager.Converters/GroupViewNameToTranslatedStringConverter.cs deleted file mode 100644 index 735b94dbc2..0000000000 --- a/Source/NETworkManager.Converters/GroupViewNameToTranslatedStringConverter.cs +++ /dev/null @@ -1,43 +0,0 @@ -using NETworkManager.Localization.Translators; -using NETworkManager.Profiles; -using System; -using System.Globalization; -using System.Windows.Data; - -namespace NETworkManager.Converters -{ - /// - /// Convert to translated or wise versa. - /// - public sealed class GroupViewNameToTranslatedStringConverter : IValueConverter - { - /// - /// Convert to translated . - /// - /// Object from type . - /// - /// - /// - /// Translated . - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is GroupViewName name)) - return "-/-"; - - return GroupViewNameTranslator.GetInstance().Translate(name); - } - - /// - /// !!! Method not implemented !!! - /// - /// - /// - /// - /// - /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Source/NETworkManager.Converters/HostUpStyleConverter.cs b/Source/NETworkManager.Converters/HostUpStyleConverter.cs new file mode 100644 index 0000000000..68ec01a10e --- /dev/null +++ b/Source/NETworkManager.Converters/HostUpStyleConverter.cs @@ -0,0 +1,24 @@ +using System; +using System.Globalization; +using System.Windows; +using System.Windows.Data; + +namespace NETworkManager.Converters; + +public sealed class HostUpStyleConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is not bool isReachable) + return null; + + return isReachable + ? Application.Current.FindResource("HostUpRectangle") + : Application.Current.FindResource("HostDownRectangle"); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/IPAddressArrayToStringConverter.cs b/Source/NETworkManager.Converters/IPAddressArrayToStringConverter.cs index a6ebc532da..b8c360a5c3 100644 --- a/Source/NETworkManager.Converters/IPAddressArrayToStringConverter.cs +++ b/Source/NETworkManager.Converters/IPAddressArrayToStringConverter.cs @@ -4,35 +4,25 @@ using System.Net; using System.Windows; using System.Windows.Data; +using NETworkManager.Models.Network; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class IPAddressArrayToStringConverter : IValueConverter { - public sealed class IPAddressArrayToStringConverter : IValueConverter + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (DesignerProperties.GetIsInDesignMode(new DependencyObject())) - return "-/-"; - - if (!(value is IPAddress[] ipAddresses)) - return "-/-"; - - var result = string.Empty; + if (DesignerProperties.GetIsInDesignMode(new DependencyObject())) + return "-/-"; - foreach (var ipAddr in ipAddresses) - { - if (!string.IsNullOrEmpty(result)) - result += Environment.NewLine; + if (value is not IPAddress[] ipAddresses) + return "-/-"; - result += ipAddr.ToString(); - } - - return result; - } + return IPv4Address.ConvertIPAddressListToString(ipAddresses); + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/IPAddressSubnetmaskTupleArrayToStringConverter.cs b/Source/NETworkManager.Converters/IPAddressSubnetmaskTupleArrayToStringConverter.cs index 22aca67e78..2e529ca47a 100644 --- a/Source/NETworkManager.Converters/IPAddressSubnetmaskTupleArrayToStringConverter.cs +++ b/Source/NETworkManager.Converters/IPAddressSubnetmaskTupleArrayToStringConverter.cs @@ -1,39 +1,28 @@ -using NETworkManager.Models.Network; -using System; +using System; using System.ComponentModel; using System.Globalization; using System.Net; using System.Windows; using System.Windows.Data; +using NETworkManager.Models.Network; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class IPAddressSubnetmaskTupleArrayToStringConverter : IValueConverter { - public sealed class IPAddressSubnetmaskTupleArrayToStringConverter : IValueConverter + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (DesignerProperties.GetIsInDesignMode(new DependencyObject())) - return "-/-"; - - if (!(value is Tuple[] ipAddresses)) - return "-/-"; - - var result = string.Empty; + if (DesignerProperties.GetIsInDesignMode(new DependencyObject())) + return "-/-"; - foreach (var ipAddr in ipAddresses) - { - if (!string.IsNullOrEmpty(result)) - result += Environment.NewLine; + if (value is not Tuple[] ipAddresses) + return "-/-"; - result += ipAddr.Item1.ToString() + "/" + Subnetmask.ConvertSubnetmaskToCidr(ipAddr.Item2); - } - - return result; - } + return IPv4Address.ConvertIPAddressWithSubnetmaskListToString(ipAddresses); + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/IPAddressToStringConverter.cs b/Source/NETworkManager.Converters/IPAddressToStringConverter.cs index 595accd4f0..73170e2822 100644 --- a/Source/NETworkManager.Converters/IPAddressToStringConverter.cs +++ b/Source/NETworkManager.Converters/IPAddressToStringConverter.cs @@ -3,18 +3,17 @@ using System.Net; using System.Windows.Data; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class IPAddressToStringConverter : IValueConverter { - public sealed class IPAddressToStringConverter : IValueConverter + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return !(value is IPAddress) ? "-/-" : ((IPAddress)value).ToString(); - } + return value is IPAddress address ? address.ToString() : "-/-"; + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/IPStatusToStringConverter.cs b/Source/NETworkManager.Converters/IPStatusToStringConverter.cs index edb77fec78..ee468ce99f 100644 --- a/Source/NETworkManager.Converters/IPStatusToStringConverter.cs +++ b/Source/NETworkManager.Converters/IPStatusToStringConverter.cs @@ -1,43 +1,41 @@ -using NETworkManager.Localization.Translators; -using System; +using System; using System.Globalization; using System.Net.NetworkInformation; using System.Windows.Data; +using NETworkManager.Localization; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +/// +/// Convert to translated or wise versa. +/// +public sealed class IPStatusToStringConverter : IValueConverter { /// - /// Convert to translated or wise versa. + /// Convert to translated . /// - public sealed class IPStatusToStringConverter : IValueConverter + /// Object from type . + /// + /// + /// + /// Translated . + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - /// - /// Convert to translated . - /// - /// Object from type . - /// - /// - /// - /// Translated . - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is IPStatus ipStatus)) - return "-/-"; - - return IPStatusTranslator.GetInstance().Translate(ipStatus); - } + return value is not IPStatus ipStatus + ? "-/-" + : ResourceTranslator.Translate(ResourceIdentifier.IPStatus, ipStatus); + } - /// - /// !!! Method not implemented !!! - /// - /// - /// - /// - /// - /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + /// + /// !!! Method not implemented !!! + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/IntGreater1ToBooleanConverter.cs b/Source/NETworkManager.Converters/IntGreater1ToBooleanConverter.cs deleted file mode 100644 index 6eaf69c9fd..0000000000 --- a/Source/NETworkManager.Converters/IntGreater1ToBooleanConverter.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Diagnostics; -using System.Globalization; -using System.Windows.Data; - -namespace NETworkManager.Converters -{ - public sealed class IntGreater1ToBooleanConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - var x = value is int count && count > 1; - - return x; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Source/NETworkManager.Converters/IntNotZeroToVisibilityCollapsedConverter.cs b/Source/NETworkManager.Converters/IntNotZeroToVisibilityCollapsedConverter.cs new file mode 100644 index 0000000000..e4a3ba97de --- /dev/null +++ b/Source/NETworkManager.Converters/IntNotZeroToVisibilityCollapsedConverter.cs @@ -0,0 +1,19 @@ +using System; +using System.Globalization; +using System.Windows; +using System.Windows.Data; + +namespace NETworkManager.Converters; + +public sealed class IntNotZeroToVisibilityCollapsedConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return value is > 0 ? Visibility.Visible : Visibility.Collapsed; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/IntToStringConverter.cs b/Source/NETworkManager.Converters/IntToStringConverter.cs index 0fce872f0f..db11fa3903 100644 --- a/Source/NETworkManager.Converters/IntToStringConverter.cs +++ b/Source/NETworkManager.Converters/IntToStringConverter.cs @@ -2,23 +2,17 @@ using System.Globalization; using System.Windows.Data; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class IntToStringConverter : IValueConverter { - public sealed class IntToStringConverter : IValueConverter + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (value == null) - return "-/-"; - - long.TryParse(value.ToString(), out var intValue); - - return intValue == 0 ? "-/-" : intValue.ToString(); - } + return value is int intValue ? intValue == 0 ? "-/-" : intValue.ToString() : "-/-"; + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/IntZeroReverseToVisibilityCollapsedConverter.cs b/Source/NETworkManager.Converters/IntZeroReverseToVisibilityCollapsedConverter.cs deleted file mode 100644 index 418df6ddd0..0000000000 --- a/Source/NETworkManager.Converters/IntZeroReverseToVisibilityCollapsedConverter.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Globalization; -using System.Windows; -using System.Windows.Data; - -namespace NETworkManager.Converters -{ - public sealed class IntZeroReverseToVisibilityCollapsedConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return value is int count && count > 0 ? Visibility.Visible : Visibility.Collapsed; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Source/NETworkManager.Converters/IntZeroToVisibilityCollapsedConverter.cs b/Source/NETworkManager.Converters/IntZeroToVisibilityCollapsedConverter.cs index 116329f2bf..0bdb4e08a5 100644 --- a/Source/NETworkManager.Converters/IntZeroToVisibilityCollapsedConverter.cs +++ b/Source/NETworkManager.Converters/IntZeroToVisibilityCollapsedConverter.cs @@ -3,18 +3,17 @@ using System.Windows; using System.Windows.Data; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class IntZeroToVisibilityCollapsedConverter : IValueConverter { - public sealed class IntZeroToVisibilityCollapsedConverter : IValueConverter + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return value is int count && count == 0 ? Visibility.Visible : Visibility.Collapsed; - } + return value is 0 ? Visibility.Visible : Visibility.Collapsed; + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/IsDefaultProfilesLocationToBooleanConverter.cs b/Source/NETworkManager.Converters/IsDefaultProfilesLocationToBooleanConverter.cs deleted file mode 100644 index 093f8d4007..0000000000 --- a/Source/NETworkManager.Converters/IsDefaultProfilesLocationToBooleanConverter.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Globalization; -using System.Windows.Data; -using NETworkManager.Profiles; - -namespace NETworkManager.Converters -{ - public sealed class IsDefaultProfilesLocationToBooleanConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return value as string == ProfileManager.GetDefaultProfilesLocation(); - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Source/NETworkManager.Converters/IsDefaultSettingsLocationToBooleanConverter.cs b/Source/NETworkManager.Converters/IsDefaultSettingsLocationToBooleanConverter.cs deleted file mode 100644 index ed0bbe8210..0000000000 --- a/Source/NETworkManager.Converters/IsDefaultSettingsLocationToBooleanConverter.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Globalization; -using System.Windows.Data; -using NETworkManager.Settings; - -namespace NETworkManager.Converters -{ - public sealed class IsDefaultSettingsLocationToBooleanConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return value as string == SettingsManager.GetDefaultSettingsLocation(); - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Source/NETworkManager.Converters/IsDynamicProfileToBooleanConverter.cs b/Source/NETworkManager.Converters/IsDynamicProfileToBooleanConverter.cs new file mode 100644 index 0000000000..61a76b3b77 --- /dev/null +++ b/Source/NETworkManager.Converters/IsDynamicProfileToBooleanConverter.cs @@ -0,0 +1,21 @@ +using System; +using System.Globalization; +using System.Windows.Data; + +namespace NETworkManager.Converters; + +public sealed class IsDynamicProfileToBooleanConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is string name) + return name.StartsWith("~"); + + return false; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/IsProfilesLocationToBooleanConverter.cs b/Source/NETworkManager.Converters/IsProfilesLocationToBooleanConverter.cs deleted file mode 100644 index c211493fbd..0000000000 --- a/Source/NETworkManager.Converters/IsProfilesLocationToBooleanConverter.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Globalization; -using System.Windows.Data; -using NETworkManager.Profiles; - -namespace NETworkManager.Converters -{ - public sealed class IsProfilesLocationToBooleanConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return value as string == ProfileManager.GetProfilesLocation(); - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Source/NETworkManager.Converters/IsSettingsLocationToBooleanConverter.cs b/Source/NETworkManager.Converters/IsSettingsLocationToBooleanConverter.cs deleted file mode 100644 index 5f199f6df0..0000000000 --- a/Source/NETworkManager.Converters/IsSettingsLocationToBooleanConverter.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Globalization; -using System.Windows.Data; -using NETworkManager.Settings; - -namespace NETworkManager.Converters -{ - public sealed class IsSettingsLocationToBooleanConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return value as string == SettingsManager.GetSettingsLocation(); - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Source/NETworkManager.Converters/ListServerConnectionInfoToStringConverter.cs b/Source/NETworkManager.Converters/ListServerConnectionInfoToStringConverter.cs new file mode 100644 index 0000000000..25da145130 --- /dev/null +++ b/Source/NETworkManager.Converters/ListServerConnectionInfoToStringConverter.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using System.Windows.Data; +using NETworkManager.Models.Network; + +namespace NETworkManager.Converters; + +public sealed class ListServerConnectionInfoToStringConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value == null) + return string.Empty; + + StringBuilder stringBuilder = new(); + + foreach (var server in (List)value) + { + if (stringBuilder.Length > 0) + stringBuilder.Append("; "); + + stringBuilder.Append(server); + } + + return stringBuilder.ToString(); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/ListToStringConverter.cs b/Source/NETworkManager.Converters/ListToStringConverter.cs deleted file mode 100644 index 8e687afa52..0000000000 --- a/Source/NETworkManager.Converters/ListToStringConverter.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Windows.Data; - -namespace NETworkManager.Converters -{ - public sealed class ListToStringConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return value == null ? string.Empty : string.Join("; ", (List)value); - - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Source/NETworkManager.Converters/LvlChartsBandwidthValueConverter.cs b/Source/NETworkManager.Converters/LvlChartsBandwidthValueConverter.cs deleted file mode 100644 index 7868dd6cc8..0000000000 --- a/Source/NETworkManager.Converters/LvlChartsBandwidthValueConverter.cs +++ /dev/null @@ -1,32 +0,0 @@ -using NETworkManager.Utilities; -using System; -using System.Globalization; -using System.Windows.Data; - -namespace NETworkManager.Converters -{ - public sealed class LvlChartsBandwidthValueConverter : IValueConverter - { - - /// - /// - /// - /// ChartPoint.Instance (object) - /// - /// - /// - /// - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (value != null && value is LvlChartsDefaultInfo info) - return $"{FileSizeConverter.GetBytesReadable((long)info.Value * 8)}it/s"; - - return "-/-"; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Source/NETworkManager.Converters/LvlChartsHeaderConverter.cs b/Source/NETworkManager.Converters/LvlChartsHeaderConverter.cs deleted file mode 100644 index a69744ac94..0000000000 --- a/Source/NETworkManager.Converters/LvlChartsHeaderConverter.cs +++ /dev/null @@ -1,30 +0,0 @@ -using LiveCharts.Wpf; -using System; -using System.Globalization; -using System.Windows.Data; - -namespace NETworkManager.Converters -{ - public sealed class LvlChartsHeaderConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (value is TooltipData info) - { - double index = info.SharedValue ?? -1; - - if (index == -1) - return "-/-"; - - return info.XFormatter.Invoke(index) as string; - } - - return "-/-"; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Source/NETworkManager.Converters/LvlChartsPingTimeValueConverter.cs b/Source/NETworkManager.Converters/LvlChartsPingTimeValueConverter.cs index 07388e676a..4394cff0c9 100644 --- a/Source/NETworkManager.Converters/LvlChartsPingTimeValueConverter.cs +++ b/Source/NETworkManager.Converters/LvlChartsPingTimeValueConverter.cs @@ -1,32 +1,29 @@ -using NETworkManager.Utilities; -using System; +using System; using System.Globalization; using System.Windows.Data; +using NETworkManager.Utilities; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class LvlChartsPingTimeValueConverter : IValueConverter { - public sealed class LvlChartsPingTimeValueConverter : IValueConverter + /// + /// + /// ChartPoint.Instance (object) + /// + /// + /// + /// + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - - /// - /// - /// - /// ChartPoint.Instance (object) - /// - /// - /// - /// - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (value != null && value is LvlChartsDefaultInfo info) - return $"{info.Value} ms"; + if (value is LvlChartsDefaultInfo info) + return $"{info.Value} ms"; - return "-/-"; - } + return "-/-"; + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/MACAddressToVendorConverter.cs b/Source/NETworkManager.Converters/MACAddressToVendorConverter.cs index 724b52c9aa..9ae4584ad1 100644 --- a/Source/NETworkManager.Converters/MACAddressToVendorConverter.cs +++ b/Source/NETworkManager.Converters/MACAddressToVendorConverter.cs @@ -1,24 +1,22 @@ -using NETworkManager.Models.Lookup; -using System; +using System; using System.Globalization; using System.Linq; using System.Windows.Data; +using NETworkManager.Models.Lookup; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class MACAddressToVendorConverter : IValueConverter { - public sealed class MACAddressToVendorConverter : IValueConverter + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is string macAddress)) - return "-/-"; - - return OUILookup.Lookup(macAddress).FirstOrDefault()?.Vendor; - } + return value is not string macAddress + ? "-/-" + : OUILookup.LookupByMacAddress(macAddress).FirstOrDefault()?.Vendor; + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/NETworkManager.Converters.csproj b/Source/NETworkManager.Converters/NETworkManager.Converters.csproj index e004e1e71d..28eebd6520 100644 --- a/Source/NETworkManager.Converters/NETworkManager.Converters.csproj +++ b/Source/NETworkManager.Converters/NETworkManager.Converters.csproj @@ -1,38 +1,30 @@ - - - {BD4DDC21-7B64-41B2-BAC7-8173E0FE84BE} - Library - Properties - NETworkManager.Converters - NETworkManager.Converters - net6.0-windows10.0.17763.0 - win10-x64 - false - true - false - bin\Debug\NETworkManager.Converters.xml - - - - 1701;1702;CS1591 - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + {BD4DDC21-7B64-41B2-BAC7-8173E0FE84BE} + Library + Properties + NETworkManager.Converters + NETworkManager.Converters + net10.0-windows10.0.22621.0 + false + true + false + false + + + 1701;1702;CS1591 + + + + + + + + + + + + + + + diff --git a/Source/NETworkManager.Converters/NeighborStateToStringConverter.cs b/Source/NETworkManager.Converters/NeighborStateToStringConverter.cs new file mode 100644 index 0000000000..d738ac7c59 --- /dev/null +++ b/Source/NETworkManager.Converters/NeighborStateToStringConverter.cs @@ -0,0 +1,31 @@ +using System; +using System.Globalization; +using System.Windows.Data; +using NETworkManager.Localization; +using NETworkManager.Models.Network; + +namespace NETworkManager.Converters; + +/// +/// Convert to a translated . +/// +public sealed class NeighborStateToStringConverter : IValueConverter +{ + /// + /// Convert to a translated . + /// + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return value is not NeighborState state + ? "-/-" + : ResourceTranslator.Translate(ResourceIdentifier.NeighborState, state); + } + + /// + /// !!! Method not implemented !!! + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} diff --git a/Source/NETworkManager.Converters/NetworkProfileToStringConverter.cs b/Source/NETworkManager.Converters/NetworkProfileToStringConverter.cs new file mode 100644 index 0000000000..fe16a6b95a --- /dev/null +++ b/Source/NETworkManager.Converters/NetworkProfileToStringConverter.cs @@ -0,0 +1,42 @@ +using System; +using System.Globalization; +using System.Windows.Data; +using NETworkManager.Localization.Resources; +using NETworkManager.Models.Network; + +namespace NETworkManager.Converters; + +/// +/// Convert to a localized or vice versa. +/// +public sealed class NetworkProfileToStringConverter : IValueConverter +{ + /// + /// Convert to a localized . + /// + /// Object from type . + /// + /// + /// + /// Localized representing the network profile. + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return value is not NetworkProfile profile + ? "-/-" + : profile switch + { + NetworkProfile.Domain => Strings.Domain, + NetworkProfile.Private => Strings.Private, + NetworkProfile.Public => Strings.Public, + _ => "-/-" + }; + } + + /// + /// !!! Method not implemented !!! + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} diff --git a/Source/NETworkManager.Converters/NullOrEmptyToBoolConverter.cs b/Source/NETworkManager.Converters/NullOrEmptyToBoolConverter.cs deleted file mode 100644 index e218942724..0000000000 --- a/Source/NETworkManager.Converters/NullOrEmptyToBoolConverter.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Globalization; -using System.Windows.Data; - -namespace NETworkManager.Converters -{ - public sealed class NullOrEmptyToBoolConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return string.IsNullOrEmpty(value as string); - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Source/NETworkManager.Converters/NullOrEmptyToStringConverter.cs b/Source/NETworkManager.Converters/NullOrEmptyToStringConverter.cs deleted file mode 100644 index 7a41837103..0000000000 --- a/Source/NETworkManager.Converters/NullOrEmptyToStringConverter.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Globalization; -using System.Windows.Data; - -namespace NETworkManager.Converters -{ - public sealed class NullOrEmptyToStringConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - var str = value as string; - - return string.IsNullOrEmpty(str) ? "-/-" : str; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Source/NETworkManager.Converters/NullToFalseConverter.cs b/Source/NETworkManager.Converters/NullToFalseConverter.cs deleted file mode 100644 index 92d2ec2644..0000000000 --- a/Source/NETworkManager.Converters/NullToFalseConverter.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Globalization; -using System.Windows.Data; - -namespace NETworkManager.Converters -{ - public sealed class NullToFalseConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return value != null; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Source/NETworkManager.Converters/NullableDateTimeToStringConverter.cs b/Source/NETworkManager.Converters/NullableDateTimeToStringConverter.cs deleted file mode 100644 index 53de1907ee..0000000000 --- a/Source/NETworkManager.Converters/NullableDateTimeToStringConverter.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Globalization; -using System.Windows.Data; - -namespace NETworkManager.Converters -{ - public sealed class NullableDateTimeToStringConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (value is DateTime time) - return time; - - return "-/-"; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Source/NETworkManager.Converters/NullableDoubleToStringConverter.cs b/Source/NETworkManager.Converters/NullableDoubleToStringConverter.cs new file mode 100644 index 0000000000..dd83917813 --- /dev/null +++ b/Source/NETworkManager.Converters/NullableDoubleToStringConverter.cs @@ -0,0 +1,32 @@ +using System; +using System.Globalization; +using System.Windows.Data; + +namespace NETworkManager.Converters; + +/// +/// Converts a nullable to a formatted string, returning "-/-" for null. +/// Pass a ConverterParameter of the form "F0|ms" or "F1|Mbps" to control the numeric format +/// specifier and the unit suffix, separated by '|'. +/// +public sealed class NullableDoubleToStringConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is not double d) + return "-/-"; + + if (parameter is string fmt) + { + var parts = fmt.Split('|'); + var format = parts.Length > 0 ? parts[0] : "G"; + var unit = parts.Length > 1 ? " " + parts[1] : string.Empty; + return d.ToString(format, culture) + unit; + } + + return d.ToString(culture); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => + throw new NotImplementedException(); +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/OperationalStatusToStringConverter.cs b/Source/NETworkManager.Converters/OperationalStatusToStringConverter.cs index 10dbbe50d5..a299d816f4 100644 --- a/Source/NETworkManager.Converters/OperationalStatusToStringConverter.cs +++ b/Source/NETworkManager.Converters/OperationalStatusToStringConverter.cs @@ -3,21 +3,17 @@ using System.Net.NetworkInformation; using System.Windows.Data; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class OperationalStatusToStringConverter : IValueConverter { - public sealed class OperationalStatusToStringConverter : IValueConverter + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is OperationalStatus operationalStatus)) - return "-/-"; - - return operationalStatus.ToString(); - } + return value is not OperationalStatus operationalStatus ? "-/-" : operationalStatus.ToString(); + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/PercentConverter.cs b/Source/NETworkManager.Converters/PercentConverter.cs deleted file mode 100644 index d05425c756..0000000000 --- a/Source/NETworkManager.Converters/PercentConverter.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Globalization; -using System.Windows.Data; - -namespace NETworkManager.Converters -{ - public sealed class PercentConverter : IMultiValueConverter - { - public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) - { - if ((int)values[0] == 0) - return 0; - - return Math.Round(((float)((int)values[1]) / (int)values[0]) * 100, 2); - } - - public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Source/NETworkManager.Converters/PhysicalAddressToStringConverter.cs b/Source/NETworkManager.Converters/PhysicalAddressToStringConverter.cs index cdfe309015..86a9784db0 100644 --- a/Source/NETworkManager.Converters/PhysicalAddressToStringConverter.cs +++ b/Source/NETworkManager.Converters/PhysicalAddressToStringConverter.cs @@ -1,26 +1,25 @@ using System; using System.Globalization; +using System.Net.NetworkInformation; using System.Windows.Data; using NETworkManager.Utilities; -using System.Net.NetworkInformation; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class PhysicalAddressToStringConverter : IValueConverter { - public sealed class PhysicalAddressToStringConverter : IValueConverter + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is PhysicalAddress physicalAddress)) - return string.Empty; + if (value is not PhysicalAddress physicalAddress) + return "-/-"; - string macAddress = physicalAddress.ToString(); + var macAddress = physicalAddress.ToString(); - return string.IsNullOrEmpty(macAddress) ? string.Empty : MACAddressHelper.GetDefaultFormat(macAddress); - } + return string.IsNullOrEmpty(macAddress) ? "-/-" : MACAddressHelper.GetDefaultFormat(macAddress); + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/PingStatusToBooleanConverter.cs b/Source/NETworkManager.Converters/PingStatusToBooleanConverter.cs deleted file mode 100644 index f48a8caa04..0000000000 --- a/Source/NETworkManager.Converters/PingStatusToBooleanConverter.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Globalization; -using System.Net.NetworkInformation; -using System.Windows.Data; - -namespace NETworkManager.Converters -{ - public sealed class PingStatusToBooleanConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return value != null && (IPStatus) value == IPStatus.Success; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Source/NETworkManager.Converters/PingTimeToStringConverter.cs b/Source/NETworkManager.Converters/PingTimeToStringConverter.cs index 1d91a48295..935914bad9 100644 --- a/Source/NETworkManager.Converters/PingTimeToStringConverter.cs +++ b/Source/NETworkManager.Converters/PingTimeToStringConverter.cs @@ -2,19 +2,19 @@ using System.Globalization; using System.Net.NetworkInformation; using System.Windows.Data; +using Ping = NETworkManager.Models.Network.Ping; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class PingTimeToStringConverter : IMultiValueConverter { - public sealed class PingTimeToStringConverter : IMultiValueConverter + public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) - { - return Models.Network.Ping.TimeToString((IPStatus)values[0], (long)values[1]); - } + return Ping.TimeToString((IPStatus)values[0], (long)values[1]); + } - public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/PortOpenStyleConverter.cs b/Source/NETworkManager.Converters/PortOpenStyleConverter.cs new file mode 100644 index 0000000000..c7b4fef9c9 --- /dev/null +++ b/Source/NETworkManager.Converters/PortOpenStyleConverter.cs @@ -0,0 +1,25 @@ +using System; +using System.Globalization; +using System.Windows; +using System.Windows.Data; +using NETworkManager.Models.Network; + +namespace NETworkManager.Converters; + +public sealed class PortOpenStyleConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is not PortState portState) + return null; + + return portState == PortState.Open + ? Application.Current.FindResource("PortOpenRectangle") + : Application.Current.FindResource("PortClosedRectangle"); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/PortOpenToStringConverter.cs b/Source/NETworkManager.Converters/PortOpenToStringConverter.cs new file mode 100644 index 0000000000..e35fb6663f --- /dev/null +++ b/Source/NETworkManager.Converters/PortOpenToStringConverter.cs @@ -0,0 +1,41 @@ +using System; +using System.Globalization; +using System.Windows.Data; +using NETworkManager.Localization; +using NETworkManager.Models.Network; + +namespace NETworkManager.Converters; + +/// +/// Convert a that indicates if a port is open to a translated or wise versa. +/// +public sealed class PortOpenToStringConverter : IValueConverter +{ + /// + /// Convert a that indicates if a port is open to a translated . + /// + /// Port up as . + /// + /// + /// + /// Translated . + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return value is not bool portState + ? "-/-" + : ResourceTranslator.Translate(ResourceIdentifier.PortState, portState ? PortState.Open : PortState.Closed); + } + + /// + /// !!! Method not implemented !!! + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/PortStateToStringConverter.cs b/Source/NETworkManager.Converters/PortStateToStringConverter.cs index 0227b52f06..1077d2fa5c 100644 --- a/Source/NETworkManager.Converters/PortStateToStringConverter.cs +++ b/Source/NETworkManager.Converters/PortStateToStringConverter.cs @@ -1,43 +1,41 @@ using System; using System.Globalization; using System.Windows.Data; -using NETworkManager.Localization.Translators; +using NETworkManager.Localization; using NETworkManager.Models.Network; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +/// +/// Convert to translated or wise versa. +/// +public sealed class PortStateToStringConverter : IValueConverter { /// - /// Convert to translated or wise versa. + /// Convert to translated . /// - public sealed class PortStateToStringConverter : IValueConverter + /// Object from type . + /// + /// + /// + /// Translated . + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - /// - /// Convert to translated . - /// - /// Object from type . - /// - /// - /// - /// Translated . - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is PortState portState)) - return "-/-"; + return value is not PortState portState + ? "-/-" + : ResourceTranslator.Translate(ResourceIdentifier.PortState, portState); + } - return PortStateTranslator.GetInstance().Translate(portState); - } - - /// - /// !!! Method not implemented !!! - /// - /// - /// - /// - /// - /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + /// + /// !!! Method not implemented !!! + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/ProfileGroupToTranslatedStringConverter.cs b/Source/NETworkManager.Converters/ProfileGroupToTranslatedStringConverter.cs new file mode 100644 index 0000000000..63b684a9cf --- /dev/null +++ b/Source/NETworkManager.Converters/ProfileGroupToTranslatedStringConverter.cs @@ -0,0 +1,41 @@ +using System; +using System.Globalization; +using System.Windows.Data; +using NETworkManager.Localization; +using NETworkManager.Profiles; + +namespace NETworkManager.Converters; + +/// +/// Convert to translated or wise versa. +/// +public sealed class ProfileGroupToTranslatedStringConverter : IValueConverter +{ + /// + /// Convert to translated . + /// + /// Object from type . + /// + /// + /// + /// Translated . + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return value is not GroupViewName name + ? "-/-" + : ResourceTranslator.Translate(ResourceIdentifier.ProfileGroup, name); + } + + /// + /// !!! Method not implemented !!! + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/ProfileNameToTranslatedStringConverter.cs b/Source/NETworkManager.Converters/ProfileNameToTranslatedStringConverter.cs new file mode 100644 index 0000000000..cd96ddf417 --- /dev/null +++ b/Source/NETworkManager.Converters/ProfileNameToTranslatedStringConverter.cs @@ -0,0 +1,42 @@ +using System; +using System.Globalization; +using System.Windows.Data; +using NETworkManager.Localization; +using NETworkManager.Profiles; + +namespace NETworkManager.Converters; + +/// +/// Convert to translated or wise versa. +/// +public sealed class ProfileNameToTranslatedStringConverter : IValueConverter +{ + /// + /// Convert to translated . + /// + /// Object from type . + /// + /// + /// + /// Translated . + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return value is not ProfileName name + ? "-/-" + : ResourceTranslator.Translate(new[] { ResourceIdentifier.ProfileName, ResourceIdentifier.ApplicationName }, + name); + } + + /// + /// !!! Method not implemented !!! + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/ProfileViewNameToTranslatedStringConverter.cs b/Source/NETworkManager.Converters/ProfileViewNameToTranslatedStringConverter.cs deleted file mode 100644 index ffb398b9c9..0000000000 --- a/Source/NETworkManager.Converters/ProfileViewNameToTranslatedStringConverter.cs +++ /dev/null @@ -1,43 +0,0 @@ -using NETworkManager.Localization.Translators; -using NETworkManager.Profiles; -using System; -using System.Globalization; -using System.Windows.Data; - -namespace NETworkManager.Converters -{ - /// - /// Convert to translated or wise versa. - /// - public sealed class ProfileViewNameToTranslatedStringConverter : IValueConverter - { - /// - /// Convert to translated . - /// - /// Object from type . - /// - /// - /// - /// Translated . - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is ProfileViewName name)) - return "-/-"; - - return ProfileViewNameTranslator.GetInstance().Translate(name); - } - - /// - /// !!! Method not implemented !!! - /// - /// - /// - /// - /// - /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Source/NETworkManager.Converters/Properties/AssemblyInfo.cs b/Source/NETworkManager.Converters/Properties/AssemblyInfo.cs index 36ff79f2a6..25b8b6eb8f 100644 --- a/Source/NETworkManager.Converters/Properties/AssemblyInfo.cs +++ b/Source/NETworkManager.Converters/Properties/AssemblyInfo.cs @@ -4,7 +4,5 @@ [assembly: AssemblyTitle("NETworkManager.Converters")] [assembly: AssemblyDescription("Library contains NETworkManager converters.")] [assembly: AssemblyProduct("NETworkManager.Converters")] - [assembly: ComVisible(false)] - -[assembly: Guid("bd4ddc21-7b64-41b2-bac7-8173e0fe84be")] +[assembly: Guid("bd4ddc21-7b64-41b2-bac7-8173e0fe84be")] \ No newline at end of file diff --git a/Source/NETworkManager.Converters/PuTTYLogModeToStringConverter.cs b/Source/NETworkManager.Converters/PuTTYLogModeToStringConverter.cs index 46265abf9a..4c22a529c5 100644 --- a/Source/NETworkManager.Converters/PuTTYLogModeToStringConverter.cs +++ b/Source/NETworkManager.Converters/PuTTYLogModeToStringConverter.cs @@ -1,43 +1,41 @@ using System; using System.Globalization; using System.Windows.Data; -using NETworkManager.Localization.Translators; +using NETworkManager.Localization; using NETworkManager.Models.PuTTY; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +/// +/// Convert to translated or wise versa. +/// +public sealed class PuTTYLogModeToStringConverter : IValueConverter { /// - /// Convert to translated or wise versa. + /// Convert to translated . /// - public sealed class PuTTYLogModeToStringConverter : IValueConverter + /// Object from type . + /// + /// + /// + /// Translated . + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - /// - /// Convert to translated . - /// - /// Object from type . - /// - /// - /// - /// Translated . - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is LogMode audioRedirectionMode)) - return "-/-"; - - return PuTTYLogModeTranslator.GetInstance().Translate(audioRedirectionMode); - } + return value is not LogMode logMode + ? "-/-" + : ResourceTranslator.Translate(ResourceIdentifier.PuTTYLogMode, logMode); + } - /// - /// !!! Method not implemented !!! - /// - /// - /// - /// - /// - /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + /// + /// !!! Method not implemented !!! + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/RemoteDesktopAudioCaptureRedirectionModeToStringConverter.cs b/Source/NETworkManager.Converters/RemoteDesktopAudioCaptureRedirectionModeToStringConverter.cs index d1f5af41a8..3dcfd08c98 100644 --- a/Source/NETworkManager.Converters/RemoteDesktopAudioCaptureRedirectionModeToStringConverter.cs +++ b/Source/NETworkManager.Converters/RemoteDesktopAudioCaptureRedirectionModeToStringConverter.cs @@ -1,43 +1,42 @@ -using NETworkManager.Localization.Translators; -using NETworkManager.Models.RemoteDesktop; -using System; +using System; using System.Globalization; using System.Windows.Data; +using NETworkManager.Localization; +using NETworkManager.Models.RemoteDesktop; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +/// +/// Convert to translated or wise versa. +/// +public sealed class RemoteDesktopAudioCaptureRedirectionModeToStringConverter : IValueConverter { /// - /// Convert to translated or wise versa. + /// Convert to translated . /// - public sealed class RemoteDesktopAudioCaptureRedirectionModeToStringConverter : IValueConverter + /// Object from type . + /// + /// + /// + /// Translated . + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - /// - /// Convert to translated . - /// - /// Object from type . - /// - /// - /// - /// Translated . - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is AudioCaptureRedirectionMode audioCaptureRedirectionMode)) - return "-/-"; - - return RemoteDesktopAudioCaptureRedirectionModeTranslator.GetInstance().Translate(audioCaptureRedirectionMode); - } + return value is not AudioCaptureRedirectionMode audioCaptureRedirectionMode + ? "-/-" + : ResourceTranslator.Translate(ResourceIdentifier.RemoteDesktopAudioCaptureRedirectionMode, + audioCaptureRedirectionMode); + } - /// - /// !!! Method not implemented !!! - /// - /// - /// - /// - /// - /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + /// + /// !!! Method not implemented !!! + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/RemoteDesktopAudioRedirectionModeToStringConverter.cs b/Source/NETworkManager.Converters/RemoteDesktopAudioRedirectionModeToStringConverter.cs index e250376e9a..56642fb78c 100644 --- a/Source/NETworkManager.Converters/RemoteDesktopAudioRedirectionModeToStringConverter.cs +++ b/Source/NETworkManager.Converters/RemoteDesktopAudioRedirectionModeToStringConverter.cs @@ -1,43 +1,41 @@ using System; using System.Globalization; using System.Windows.Data; -using NETworkManager.Localization.Translators; +using NETworkManager.Localization; using NETworkManager.Models.RemoteDesktop; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +/// +/// Convert to translated or wise versa. +/// +public sealed class RemoteDesktopAudioRedirectionModeToStringConverter : IValueConverter { /// - /// Convert to translated or wise versa. + /// Convert to translated . /// - public sealed class RemoteDesktopAudioRedirectionModeToStringConverter : IValueConverter + /// Object from type . + /// + /// + /// + /// Translated . + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - /// - /// Convert to translated . - /// - /// Object from type . - /// - /// - /// - /// Translated . - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is AudioRedirectionMode audioRedirectionMode)) - return "-/-"; - - return RemoteDesktopAudioRedirectionModeTranslator.GetInstance().Translate(audioRedirectionMode); - } + return value is not AudioRedirectionMode audioRedirectionMode + ? "-/-" + : ResourceTranslator.Translate(ResourceIdentifier.RemoteDesktopAudioRedirectionMode, audioRedirectionMode); + } - /// - /// !!! Method not implemented !!! - /// - /// - /// - /// - /// - /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + /// + /// !!! Method not implemented !!! + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/RemoteDesktopGatewayServerLogonMethodToStringConverter.cs b/Source/NETworkManager.Converters/RemoteDesktopGatewayServerLogonMethodToStringConverter.cs new file mode 100644 index 0000000000..2f1a0ff46b --- /dev/null +++ b/Source/NETworkManager.Converters/RemoteDesktopGatewayServerLogonMethodToStringConverter.cs @@ -0,0 +1,42 @@ +using System; +using System.Globalization; +using System.Windows.Data; +using NETworkManager.Localization; +using NETworkManager.Models.RemoteDesktop; + +namespace NETworkManager.Converters; + +/// +/// Convert to translated or wise versa. +/// +public sealed class RemoteDesktopGatewayServerLogonMethodToStringConverter : IValueConverter +{ + /// + /// Convert to translated . + /// + /// Object from type . + /// + /// + /// + /// Translated . + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return value is not GatewayUserSelectedCredsSource gatewayUserSelectedCredsSource + ? "-/-" + : ResourceTranslator.Translate(ResourceIdentifier.RemoteDesktopGatewayServerLogonMethod, + gatewayUserSelectedCredsSource); + } + + /// + /// !!! Method not implemented !!! + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/RemoteDesktopKeyboardHookModeToStringConverter.cs b/Source/NETworkManager.Converters/RemoteDesktopKeyboardHookModeToStringConverter.cs index 17cbaeaa56..e463efd288 100644 --- a/Source/NETworkManager.Converters/RemoteDesktopKeyboardHookModeToStringConverter.cs +++ b/Source/NETworkManager.Converters/RemoteDesktopKeyboardHookModeToStringConverter.cs @@ -1,43 +1,41 @@ using System; using System.Globalization; using System.Windows.Data; -using NETworkManager.Localization.Translators; +using NETworkManager.Localization; using NETworkManager.Models.RemoteDesktop; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +/// +/// Convert to translated or wise versa. +/// +public sealed class RemoteDesktopKeyboardHookModeToStringConverter : IValueConverter { /// - /// Convert to translated or wise versa. + /// Convert to translated . /// - public sealed class RemoteDesktopKeyboardHookModeToStringConverter : IValueConverter + /// Object from type . + /// + /// + /// + /// Translated . + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - /// - /// Convert to translated . - /// - /// Object from type . - /// - /// - /// - /// Translated . - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is KeyboardHookMode keyboardHookMode)) - return "-/-"; - - return RemoteDesktopKeyboardHookModeTranslator.GetInstance().Translate(keyboardHookMode); - } + return value is not KeyboardHookMode keyboardHookMode + ? "-/-" + : ResourceTranslator.Translate(ResourceIdentifier.RemoteDesktopKeyboardHookMode, keyboardHookMode); + } - /// - /// !!! Method not implemented !!! - /// - /// - /// - /// - /// - /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + /// + /// !!! Method not implemented !!! + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/RemoteDesktopNetworkConnectionTypeToStringConverter.cs b/Source/NETworkManager.Converters/RemoteDesktopNetworkConnectionTypeToStringConverter.cs index 0b52566923..2800cae95d 100644 --- a/Source/NETworkManager.Converters/RemoteDesktopNetworkConnectionTypeToStringConverter.cs +++ b/Source/NETworkManager.Converters/RemoteDesktopNetworkConnectionTypeToStringConverter.cs @@ -1,43 +1,42 @@ using System; using System.Globalization; using System.Windows.Data; -using NETworkManager.Localization.Translators; +using NETworkManager.Localization; using NETworkManager.Models.RemoteDesktop; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +/// +/// Convert to translated or wise versa. +/// +public sealed class RemoteDesktopNetworkConnectionTypeToStringConverter : IValueConverter { /// - /// Convert to translated or wise versa. + /// Convert to translated . /// - public sealed class RemoteDesktopNetworkConnectionTypeToStringConverter : IValueConverter + /// Object from type . + /// + /// + /// + /// Translated . + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - /// - /// Convert to translated . - /// - /// Object from type . - /// - /// - /// - /// Translated . - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is NetworkConnectionType networkConnectionType)) - return "-/-"; - - return RemoteDesktopNetworkConnectionTypeTranslator.GetInstance().Translate(networkConnectionType); - } + return value is not NetworkConnectionType networkConnectionType + ? "-/-" + : ResourceTranslator.Translate(ResourceIdentifier.RemoteDesktopNetworkConnectionType, + networkConnectionType); + } - /// - /// !!! Method not implemented !!! - /// - /// - /// - /// - /// - /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + /// + /// !!! Method not implemented !!! + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/SelectedItemsToBooleanConverter.cs b/Source/NETworkManager.Converters/SelectedItemsToBooleanConverter.cs index 049309c4c6..0fa809b77a 100644 --- a/Source/NETworkManager.Converters/SelectedItemsToBooleanConverter.cs +++ b/Source/NETworkManager.Converters/SelectedItemsToBooleanConverter.cs @@ -3,18 +3,17 @@ using System.Globalization; using System.Windows.Data; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class SelectedItemsToBooleanConverter : IValueConverter { - public sealed class SelectedItemsToBooleanConverter : IValueConverter + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return value != null && ((IList) value).Count > 0; - } + return value != null && ((IList)value).Count > 0; + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/SettingsGroupToTranslatedStringConverter.cs b/Source/NETworkManager.Converters/SettingsGroupToTranslatedStringConverter.cs new file mode 100644 index 0000000000..13c601f656 --- /dev/null +++ b/Source/NETworkManager.Converters/SettingsGroupToTranslatedStringConverter.cs @@ -0,0 +1,41 @@ +using System; +using System.Globalization; +using System.Windows.Data; +using NETworkManager.Localization; +using NETworkManager.Settings; + +namespace NETworkManager.Converters; + +/// +/// Convert to translated or wise versa. +/// +public sealed class SettingsGroupToTranslatedStringConverter : IValueConverter +{ + /// + /// Convert to translated . + /// + /// Object from type . + /// + /// + /// + /// Translated . + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return value is not SettingsGroup group + ? "-/-" + : ResourceTranslator.Translate(ResourceIdentifier.SettingsGroup, group); + } + + /// + /// !!! Method not implemented !!! + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/SettingsNameToTranslatedStringConverter.cs b/Source/NETworkManager.Converters/SettingsNameToTranslatedStringConverter.cs new file mode 100644 index 0000000000..64d74977e1 --- /dev/null +++ b/Source/NETworkManager.Converters/SettingsNameToTranslatedStringConverter.cs @@ -0,0 +1,42 @@ +using System; +using System.Globalization; +using System.Windows.Data; +using NETworkManager.Localization; +using NETworkManager.Settings; + +namespace NETworkManager.Converters; + +/// +/// Convert to translated or wise versa. +/// +public sealed class SettingsNameToTranslatedStringConverter : IValueConverter +{ + /// + /// Convert to translated . + /// + /// Object from type . + /// + /// + /// + /// Translated . + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return value is not SettingsName name + ? "-/-" + : ResourceTranslator.Translate( + new[] { ResourceIdentifier.SettingsName, ResourceIdentifier.ApplicationName }, name); + } + + /// + /// !!! Method not implemented !!! + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/SettingsViewGroupToTranslatedStringConverter.cs b/Source/NETworkManager.Converters/SettingsViewGroupToTranslatedStringConverter.cs deleted file mode 100644 index 5c982c67f5..0000000000 --- a/Source/NETworkManager.Converters/SettingsViewGroupToTranslatedStringConverter.cs +++ /dev/null @@ -1,43 +0,0 @@ -using NETworkManager.Localization.Translators; -using NETworkManager.Settings; -using System; -using System.Globalization; -using System.Windows.Data; - -namespace NETworkManager.Converters -{ - /// - /// Convert to translated or wise versa. - /// - public sealed class SettingsViewGroupToTranslatedStringConverter : IValueConverter - { - /// - /// Convert to translated . - /// - /// Object from type . - /// - /// - /// - /// Translated . - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is SettingsViewGroup group)) - return "-/-"; - - return SettingsViewGroupTranslator.GetInstance().Translate(group); - } - - /// - /// !!! Method not implemented !!! - /// - /// - /// - /// - /// - /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Source/NETworkManager.Converters/SettingsViewNameToTranslatedStringConverter.cs b/Source/NETworkManager.Converters/SettingsViewNameToTranslatedStringConverter.cs deleted file mode 100644 index 3f7f699194..0000000000 --- a/Source/NETworkManager.Converters/SettingsViewNameToTranslatedStringConverter.cs +++ /dev/null @@ -1,43 +0,0 @@ -using NETworkManager.Localization.Translators; -using NETworkManager.Settings; -using System; -using System.Globalization; -using System.Windows.Data; - -namespace NETworkManager.Converters -{ - /// - /// Convert to translated or wise versa. - /// - public sealed class SettingsViewNameToTranslatedStringConverter : IValueConverter - { - /// - /// Convert to translated . - /// - /// Object from type . - /// - /// - /// - /// Translated . - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is SettingsViewName name)) - return "-/-"; - - return SettingsViewNameTranslator.GetInstance().Translate(name); - } - - /// - /// !!! Method not implemented !!! - /// - /// - /// - /// - /// - /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Source/NETworkManager.Converters/StringIsNotNullOrEmptyOrIPv4AddressToBooleanConverter.cs b/Source/NETworkManager.Converters/StringIsNotNullOrEmptyOrIPv4AddressToBooleanConverter.cs index 23a3f66834..a118a33030 100644 --- a/Source/NETworkManager.Converters/StringIsNotNullOrEmptyOrIPv4AddressToBooleanConverter.cs +++ b/Source/NETworkManager.Converters/StringIsNotNullOrEmptyOrIPv4AddressToBooleanConverter.cs @@ -1,21 +1,19 @@ -using System; +using NETworkManager.Utilities; +using System; using System.Globalization; -using System.Text.RegularExpressions; using System.Windows.Data; -using NETworkManager.Utilities; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class StringIsNotNullOrEmptyOrIPv4AddressToBooleanConverter : IValueConverter { - public sealed class StringIsNotNullOrEmptyOrIPv4AddressToBooleanConverter : IValueConverter + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return !string.IsNullOrEmpty(value as string) && !Regex.IsMatch((string) value, RegexHelper.IPv4AddressRegex); - } + return !string.IsNullOrEmpty(value as string) && !RegexHelper.IPv4AddressRegex().IsMatch((string)value); + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/StringIsNotNullOrEmptyToBooleanConverter.cs b/Source/NETworkManager.Converters/StringIsNotNullOrEmptyToBooleanConverter.cs index 64eb1b74b4..d1b76760e3 100644 --- a/Source/NETworkManager.Converters/StringIsNotNullOrEmptyToBooleanConverter.cs +++ b/Source/NETworkManager.Converters/StringIsNotNullOrEmptyToBooleanConverter.cs @@ -2,18 +2,17 @@ using System.Globalization; using System.Windows.Data; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class StringIsNotNullOrEmptyToBooleanConverter : IValueConverter { - public sealed class StringIsNotNullOrEmptyToBooleanConverter : IValueConverter + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return !string.IsNullOrEmpty(value as string); - } + return !string.IsNullOrEmpty(value as string); + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/StringIsNotNullOrEmptyToVisibilityCollapsedConverter.cs b/Source/NETworkManager.Converters/StringIsNotNullOrEmptyToVisibilityCollapsedConverter.cs index 751b07fa55..791ae8471d 100644 --- a/Source/NETworkManager.Converters/StringIsNotNullOrEmptyToVisibilityCollapsedConverter.cs +++ b/Source/NETworkManager.Converters/StringIsNotNullOrEmptyToVisibilityCollapsedConverter.cs @@ -3,18 +3,17 @@ using System.Windows; using System.Windows.Data; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class StringIsNotNullOrEmptyToVisibilityCollapsedConverter : IValueConverter { - public sealed class StringIsNotNullOrEmptyToVisibilityCollapsedConverter : IValueConverter + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return string.IsNullOrEmpty(value as string) ? Visibility.Collapsed : Visibility.Visible; - } + return string.IsNullOrEmpty(value as string) ? Visibility.Collapsed : Visibility.Visible; + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/StringNullOrEmptyToBoolConverter.cs b/Source/NETworkManager.Converters/StringNullOrEmptyToBoolConverter.cs new file mode 100644 index 0000000000..ef7cfa7d63 --- /dev/null +++ b/Source/NETworkManager.Converters/StringNullOrEmptyToBoolConverter.cs @@ -0,0 +1,18 @@ +using System; +using System.Globalization; +using System.Windows.Data; + +namespace NETworkManager.Converters; + +public sealed class StringNullOrEmptyToBoolConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return string.IsNullOrEmpty(value as string); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/StringNullOrEmptyToStringConverter.cs b/Source/NETworkManager.Converters/StringNullOrEmptyToStringConverter.cs new file mode 100644 index 0000000000..366f6752c3 --- /dev/null +++ b/Source/NETworkManager.Converters/StringNullOrEmptyToStringConverter.cs @@ -0,0 +1,18 @@ +using System; +using System.Globalization; +using System.Windows.Data; + +namespace NETworkManager.Converters; + +public sealed class StringNullOrEmptyToStringConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return value is string stringValue && !string.IsNullOrEmpty(stringValue) ? stringValue : "-/-"; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/TcpStateToStringConverter.cs b/Source/NETworkManager.Converters/TcpStateToStringConverter.cs index 55a715211a..4c8e6d69b3 100644 --- a/Source/NETworkManager.Converters/TcpStateToStringConverter.cs +++ b/Source/NETworkManager.Converters/TcpStateToStringConverter.cs @@ -2,43 +2,40 @@ using System.Globalization; using System.Net.NetworkInformation; using System.Windows.Data; -using NETworkManager.Localization.Translators; +using NETworkManager.Localization; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +/// +/// Convert to translated or wise versa. +/// +public sealed class TcpStateToStringConverter : IValueConverter { /// - /// Convert to translated or wise versa. + /// Convert to translated . /// - public sealed class TcpStateToStringConverter : IValueConverter + /// Object from type . + /// + /// + /// + /// Translated . + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { + return value is not TcpState tcpState + ? "-/-" + : ResourceTranslator.Translate(ResourceIdentifier.TcpState, tcpState); + } - /// - /// Convert to translated . - /// - /// Object from type . - /// - /// - /// - /// Translated . - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is TcpState tcpState)) - return "-/-"; - - return TcpStateTranslator.GetInstance().Translate(tcpState); - } - - /// - /// !!! Method not implemented !!! - /// - /// - /// - /// - /// - /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + /// + /// !!! Method not implemented !!! + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/ThemeToStringConverter.cs b/Source/NETworkManager.Converters/ThemeToStringConverter.cs index 0173a180fa..0f76f5dab6 100644 --- a/Source/NETworkManager.Converters/ThemeToStringConverter.cs +++ b/Source/NETworkManager.Converters/ThemeToStringConverter.cs @@ -1,44 +1,38 @@ using System; using System.Globalization; using System.Windows.Data; -using NETworkManager.Localization.Translators; -using NETworkManager.Models.Appearance; +using NETworkManager.Localization; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +/// +/// Convert to translated or wise versa. +/// +public sealed class ThemeToStringConverter : IValueConverter { /// - /// Convert to translated or wise versa. + /// Convert to translated . /// - public sealed class ThemeToStringConverter : IValueConverter + /// Object from type . + /// + /// + /// + /// Translated . + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { + return value is not string theme ? "-/-" : ResourceTranslator.Translate(ResourceIdentifier.Theme, theme); + } - /// - /// Convert to translated . - /// - /// Object from type . - /// - /// - /// - /// Translated . - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is string theme)) - return "-/-"; - - return ThemeTranslator.GetInstance().Translate(theme); - } - - /// - /// !!! Method not implemented !!! - /// - /// - /// - /// - /// - /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + /// + /// !!! Method not implemented !!! + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/TimeSpanToMillisecondConverter.cs b/Source/NETworkManager.Converters/TimeSpanToMillisecondConverter.cs index 470fbb9c25..a31776de81 100644 --- a/Source/NETworkManager.Converters/TimeSpanToMillisecondConverter.cs +++ b/Source/NETworkManager.Converters/TimeSpanToMillisecondConverter.cs @@ -2,23 +2,17 @@ using System.Globalization; using System.Windows.Data; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class TimeSpanToMillisecondConverter : IValueConverter { - public sealed class TimeSpanToMillisecondConverter : IValueConverter + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - /* Translate the name of the accent */ - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is TimeSpan timeSpan)) - return "-/-"; - - - return $"{timeSpan.TotalMilliseconds} ms"; - } + return value is not TimeSpan timeSpan ? "-/-" : $"{timeSpan.TotalMilliseconds} ms"; + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/TimeSpanToStringConverter.cs b/Source/NETworkManager.Converters/TimeSpanToStringConverter.cs index bf2bba2194..465690cf46 100644 --- a/Source/NETworkManager.Converters/TimeSpanToStringConverter.cs +++ b/Source/NETworkManager.Converters/TimeSpanToStringConverter.cs @@ -2,22 +2,19 @@ using System.Globalization; using System.Windows.Data; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class TimeSpanToStringConverter : IValueConverter { - public sealed class TimeSpanToStringConverter : IValueConverter + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - /* Translate the name of the accent */ - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is TimeSpan timeSpan)) - return "-/-"; - - return $"{Math.Floor(timeSpan.TotalDays)}d {timeSpan.Hours}h {timeSpan.Minutes}m {timeSpan.Seconds}s"; - } + return value is not TimeSpan timeSpan + ? "-/-" + : $"{Math.Floor(timeSpan.TotalDays)}d {timeSpan.Hours}h {timeSpan.Minutes}m {timeSpan.Seconds}s"; + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/TimeUnitToStringConverter.cs b/Source/NETworkManager.Converters/TimeUnitToStringConverter.cs index 80d404d97f..818e2a2214 100644 --- a/Source/NETworkManager.Converters/TimeUnitToStringConverter.cs +++ b/Source/NETworkManager.Converters/TimeUnitToStringConverter.cs @@ -1,43 +1,41 @@ -using NETworkManager.Localization.Translators; -using NETworkManager.Utilities; -using System; +using System; using System.Globalization; using System.Windows.Data; +using NETworkManager.Localization; +using NETworkManager.Utilities; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +/// +/// Convert to translated or wise versa. +/// +public sealed class TimeUnitToStringConverter : IValueConverter { /// - /// Convert to translated or wise versa. + /// Convert to translated . /// - public sealed class TimeUnitToStringConverter : IValueConverter + /// Object from type . + /// + /// + /// + /// Translated . + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - /// - /// Convert to translated . - /// - /// Object from type . - /// - /// - /// - /// Translated . - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is TimeUnit timeUnit)) - return "-/-" ; - - return TimeUnitTranslator.GetInstance().Translate(timeUnit); - } + return value is not TimeUnit timeUnit + ? "-/-" + : ResourceTranslator.Translate(ResourceIdentifier.TimeUnit, timeUnit); + } - /// - /// !!! Method not implemented !!! - /// - /// - /// - /// - /// - /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + /// + /// !!! Method not implemented !!! + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/TimestampToStringConverter.cs b/Source/NETworkManager.Converters/TimestampToStringConverter.cs index ff98b674ab..895bfc4d06 100644 --- a/Source/NETworkManager.Converters/TimestampToStringConverter.cs +++ b/Source/NETworkManager.Converters/TimestampToStringConverter.cs @@ -2,18 +2,17 @@ using System.Globalization; using System.Windows.Data; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class TimestampToStringConverter : IValueConverter { - public sealed class TimestampToStringConverter : IValueConverter + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return value == null ? string.Empty : ((DateTime)value).ToLongTimeString(); - } + return value == null ? string.Empty : ((DateTime)value).ToLongTimeString(); + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/ValidateNetworkInterfaceConfigConverter.cs b/Source/NETworkManager.Converters/ValidateNetworkInterfaceConfigConverter.cs index d3fb884a98..f48023fdb7 100644 --- a/Source/NETworkManager.Converters/ValidateNetworkInterfaceConfigConverter.cs +++ b/Source/NETworkManager.Converters/ValidateNetworkInterfaceConfigConverter.cs @@ -2,18 +2,18 @@ using System.Globalization; using System.Windows.Data; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class ValidateNetworkInterfaceConfigConverter : IMultiValueConverter { - public sealed class ValidateNetworkInterfaceConfigConverter : IMultiValueConverter + public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) - { - return ((bool)values[0] || (bool)values[1] && !(bool)values[2] && !(bool)values[3] && !(bool)values[4]) && ((bool)values[5] || (bool)values[6] && !(bool)values[7] && !(bool)values[8]); - } + return ((bool)values[0] || ((bool)values[1] && !(bool)values[2] && !(bool)values[3] && !(bool)values[4])) && + ((bool)values[5] || ((bool)values[6] && !(bool)values[7] && !(bool)values[8])); + } - public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/ValidateSubnetCalculatorSubnettingConverter.cs b/Source/NETworkManager.Converters/ValidateSubnetCalculatorSubnettingConverter.cs index 008530f863..3b5eccf929 100644 --- a/Source/NETworkManager.Converters/ValidateSubnetCalculatorSubnettingConverter.cs +++ b/Source/NETworkManager.Converters/ValidateSubnetCalculatorSubnettingConverter.cs @@ -1,63 +1,54 @@ -using NETworkManager.Models.Network; -using NETworkManager.Utilities; -using System; +using System; using System.Globalization; using System.Net; -using System.Text.RegularExpressions; +using System.Net.Sockets; using System.Windows.Data; +using NETworkManager.Models.Network; +using NETworkManager.Utilities; + +namespace NETworkManager.Converters; -namespace NETworkManager.Converters +public sealed class ValidateSubnetCalculatorSubnettingConverter : IMultiValueConverter { - public sealed class ValidateSubnetCalculatorSubnettingConverter : IMultiValueConverter + public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) - { - // if Validation.HasError is true... - if ((bool)values[0] || (bool)values[1]) - return false; - - var subnet = values[2] as string; - var newSubnetmaskOrCidr = values[3] as string; - - // Catch null exceptions... - if (string.IsNullOrEmpty(subnet) || string.IsNullOrEmpty(newSubnetmaskOrCidr)) - return false; - - // Get the cidr to compare... - var subnetData = subnet.Split('/'); - - var ipAddress = IPAddress.Parse(subnetData[0]); - var subnetmaskOrCidr = subnetData[1]; - int cidr; - - switch (ipAddress.AddressFamily) - { - case System.Net.Sockets.AddressFamily.InterNetwork when subnetmaskOrCidr.Length < 3: - cidr = int.Parse(subnetmaskOrCidr); - break; - case System.Net.Sockets.AddressFamily.InterNetwork: - cidr = Subnetmask.ConvertSubnetmaskToCidr(IPAddress.Parse(subnetmaskOrCidr)); - break; - default: - cidr = int.Parse(subnetmaskOrCidr); - break; - } - - int newCidr; - - // Support subnetmask like 255.255.255.0 - if (Regex.IsMatch(newSubnetmaskOrCidr, RegexHelper.SubnetmaskRegex)) - newCidr = System.Convert.ToByte(Subnetmask.ConvertSubnetmaskToCidr(IPAddress.Parse(newSubnetmaskOrCidr))); - else - newCidr = System.Convert.ToByte(newSubnetmaskOrCidr.TrimStart('/')); - - // Compare - return newCidr > cidr; - } - - public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) + // if Validation.HasError is true... + if ((bool)values[0] || (bool)values[1]) + return false; + + var subnet = (values[2] as string)?.Trim(); + var newSubnetmaskOrCidr = (values[3] as string)?.Trim(); + + // Catch null exceptions... + if (string.IsNullOrEmpty(subnet) || string.IsNullOrEmpty(newSubnetmaskOrCidr)) + return false; + + // Get the cidr to compare... + var subnetData = subnet.Split('/'); + + var ipAddress = IPAddress.Parse(subnetData[0]); + var subnetmaskOrCidr = subnetData[1]; + + var cidr = ipAddress.AddressFamily switch { - throw new NotImplementedException(); - } + AddressFamily.InterNetwork when subnetmaskOrCidr.Length < 3 => int.Parse( + subnetmaskOrCidr), + AddressFamily.InterNetwork => Subnetmask.ConvertSubnetmaskToCidr( + IPAddress.Parse(subnetmaskOrCidr)), + _ => int.Parse(subnetmaskOrCidr) + }; + + // Support subnetmask like 255.255.255.0 + int newCidr = RegexHelper.SubnetmaskRegex().IsMatch(newSubnetmaskOrCidr) + ? System.Convert.ToByte(Subnetmask.ConvertSubnetmaskToCidr(IPAddress.Parse(newSubnetmaskOrCidr))) + : System.Convert.ToByte(newSubnetmaskOrCidr.TrimStart('/')); + + // Compare + return newCidr > cidr; + } + + public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/ValidateSubnetCalculatorSupernettingConverter.cs b/Source/NETworkManager.Converters/ValidateSubnetCalculatorSupernettingConverter.cs index b3a5f3e4dc..6b675fb48a 100644 --- a/Source/NETworkManager.Converters/ValidateSubnetCalculatorSupernettingConverter.cs +++ b/Source/NETworkManager.Converters/ValidateSubnetCalculatorSupernettingConverter.cs @@ -3,39 +3,38 @@ using System.Net; using System.Windows.Data; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class ValidateSubnetCalculatorSupernettingConverter : IMultiValueConverter { - public sealed class ValidateSubnetCalculatorSupernettingConverter : IMultiValueConverter + public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) - { - // if Validation.HasError is true... - if ((bool)values[0] || (bool)values[1]) - return false; + // if Validation.HasError is true... + if ((bool)values[0] || (bool)values[1]) + return false; - var subnet1 = values[2] as string; - var subnet2 = values[3] as string; + var subnet1 = values[2] as string; + var subnet2 = values[3] as string; - // Catch null exceptions... - if (string.IsNullOrEmpty(subnet1) || string.IsNullOrEmpty(subnet2)) - return false; + // Catch null exceptions... + if (string.IsNullOrEmpty(subnet1) || string.IsNullOrEmpty(subnet2)) + return false; - // Compare... - var subnet1Data = subnet1.Split('/'); - var subnet2Data = subnet2.Split('/'); + // Compare... + var subnet1Data = subnet1.Split('/'); + var subnet2Data = subnet2.Split('/'); - var subnet1Ip = IPAddress.Parse(subnet1Data[0]); - var subnet2Ip = IPAddress.Parse(subnet2Data[0]); + var subnet1Ip = IPAddress.Parse(subnet1Data[0]); + var subnet2Ip = IPAddress.Parse(subnet2Data[0]); - if (subnet1Ip.AddressFamily == subnet2Ip.AddressFamily) - return subnet1Data[1] == subnet2Data[1]; + if (subnet1Ip.AddressFamily == subnet2Ip.AddressFamily) + return subnet1Data[1] == subnet2Data[1]; - return false; - } + return false; + } - public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/WiFiAuthenticationTypeToHumanReadableStringConverter.cs b/Source/NETworkManager.Converters/WiFiAuthenticationTypeToHumanReadableStringConverter.cs deleted file mode 100644 index 8c849bbc6c..0000000000 --- a/Source/NETworkManager.Converters/WiFiAuthenticationTypeToHumanReadableStringConverter.cs +++ /dev/null @@ -1,25 +0,0 @@ -using NETworkManager.Models.Network; -using System; -using System.Globalization; -using System.Windows.Data; -using Windows.Networking.Connectivity; - -namespace NETworkManager.Converters -{ - public sealed class WiFiAuthenticationTypeToHumanReadableStringConverter : IValueConverter - { - /* Translate the name of the accent */ - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is NetworkAuthenticationType type)) - return "-/-"; - - return $"{WiFi.GetHumanReadableNetworkAuthenticationType(type)}"; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Source/NETworkManager.Converters/WiFiChannelBandwidthToStringConverter.cs b/Source/NETworkManager.Converters/WiFiChannelBandwidthToStringConverter.cs new file mode 100644 index 0000000000..eed8d891e1 --- /dev/null +++ b/Source/NETworkManager.Converters/WiFiChannelBandwidthToStringConverter.cs @@ -0,0 +1,18 @@ +using System; +using System.Globalization; +using System.Windows.Data; + +namespace NETworkManager.Converters; + +public sealed class WiFiChannelBandwidthToStringConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return value is not int bandwidth ? "-/-" : $"{bandwidth} MHz"; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/WiFiChannelCenterFrequencyToChannelStringConvertert.cs b/Source/NETworkManager.Converters/WiFiChannelCenterFrequencyToChannelStringConvertert.cs deleted file mode 100644 index fc1ba07187..0000000000 --- a/Source/NETworkManager.Converters/WiFiChannelCenterFrequencyToChannelStringConvertert.cs +++ /dev/null @@ -1,23 +0,0 @@ -using NETworkManager.Models.Network; -using System; -using System.Globalization; -using System.Windows.Data; - -namespace NETworkManager.Converters -{ - public sealed class WiFiChannelCenterFrequencyToChannelStringConvertert : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is int channelCenterFrequencyInKilohertz)) - return "-/-"; - - return $"{WiFi.GetChannelFromChannelFrequency(channelCenterFrequencyInKilohertz)}"; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Source/NETworkManager.Converters/WiFiChannelCenterFrequencyToFrequencyStringConverter.cs b/Source/NETworkManager.Converters/WiFiChannelCenterFrequencyToFrequencyStringConverter.cs index 36ba04cd4a..36848846bb 100644 --- a/Source/NETworkManager.Converters/WiFiChannelCenterFrequencyToFrequencyStringConverter.cs +++ b/Source/NETworkManager.Converters/WiFiChannelCenterFrequencyToFrequencyStringConverter.cs @@ -1,23 +1,18 @@ -using NETworkManager.Models.Network; -using System; +using System; using System.Globalization; using System.Windows.Data; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class WiFiChannelCenterFrequencyToFrequencyStringConverter : IValueConverter { - public sealed class WiFiChannelCenterFrequencyToFrequencyStringConverter : IValueConverter + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is int channelCenterFrequencyInKilohertz)) - return "-/-"; - - return $"{WiFi.ConvertChannelFrequencyToGigahertz(channelCenterFrequencyInKilohertz)} GHz"; - } + return value is not double frequency ? "-/-" : $"{frequency} GHz"; + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/WiFiDBMReverseConverter.cs b/Source/NETworkManager.Converters/WiFiDBMReverseConverter.cs deleted file mode 100644 index a29a242d87..0000000000 --- a/Source/NETworkManager.Converters/WiFiDBMReverseConverter.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Globalization; -using System.Windows.Data; - -namespace NETworkManager.Converters -{ - public sealed class WiFiDBMReverseConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is double)) - return "-/-"; - - return $"-{100 - (double)value} dBm"; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Source/NETworkManager.Converters/WiFiNetworkRssiInDecibelMilliwattsToSignalStrengthStringConverter.cs b/Source/NETworkManager.Converters/WiFiNetworkRssiInDecibelMilliwattsToSignalStrengthStringConverter.cs index 74dcdcdbb8..bf1b64e4c5 100644 --- a/Source/NETworkManager.Converters/WiFiNetworkRssiInDecibelMilliwattsToSignalStrengthStringConverter.cs +++ b/Source/NETworkManager.Converters/WiFiNetworkRssiInDecibelMilliwattsToSignalStrengthStringConverter.cs @@ -2,21 +2,17 @@ using System.Globalization; using System.Windows.Data; -namespace NETworkManager.Converters +namespace NETworkManager.Converters; + +public sealed class WiFiNetworkRssiInDecibelMilliwattsToSignalStrengthStringConverter : IValueConverter { - public sealed class WiFiNetworkRssiInDecibelMilliwattsToSignalStrengthStringConverter : IValueConverter + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is double networkRssiInDecibelMilliwatts)) - return "-/-"; - - return $"{networkRssiInDecibelMilliwatts} dBm"; - } + return value is not double networkRssiInDecibelMilliwatts ? "-/-" : $"{networkRssiInDecibelMilliwatts} dBm"; + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/WiFiPhyKindToStringConverter.cs b/Source/NETworkManager.Converters/WiFiPhyKindToStringConverter.cs deleted file mode 100644 index c1522ec168..0000000000 --- a/Source/NETworkManager.Converters/WiFiPhyKindToStringConverter.cs +++ /dev/null @@ -1,24 +0,0 @@ -using NETworkManager.Models.Network; -using System; -using System.Globalization; -using System.Windows.Data; -using Windows.Devices.WiFi; - -namespace NETworkManager.Converters -{ - public sealed class WiFiPhyKindToStringConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (!(value is WiFiPhyKind phyKind)) - return "-/-"; - - return $"{WiFi.GetHumandReadablePhyKind(phyKind)}"; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Source/NETworkManager.Converters/app.config b/Source/NETworkManager.Converters/app.config deleted file mode 100644 index f6e7dca8dc..0000000000 --- a/Source/NETworkManager.Converters/app.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/Source/NETworkManager.Documentation/BaseInfo.cs b/Source/NETworkManager.Documentation/BaseInfo.cs index 06e4a3680d..4d6aaa4582 100644 --- a/Source/NETworkManager.Documentation/BaseInfo.cs +++ b/Source/NETworkManager.Documentation/BaseInfo.cs @@ -1,17 +1,35 @@ -namespace NETworkManager.Documentation -{ +namespace NETworkManager.Documentation; - public abstract class BaseInfo +/// +/// Base class to hold information's about a library, service or resource. +/// +public abstract class BaseInfo +{ + /// + /// Create an instance of with parameters. + /// + /// Name of the library, service or resource. + /// Url of the library, service or resource. + /// Description of the library, service or resource. + protected BaseInfo(string name, string websiteUrl, string description) { - public string Name { get; set; } - public string WebsiteUrl { get; set; } - public string Description { get; set; } - - protected BaseInfo(string name, string websiteUrl, string description) - { - Name = name; - WebsiteUrl = websiteUrl; - Description = description; - } + Name = name; + WebsiteUrl = websiteUrl; + Description = description; } -} + + /// + /// Name of the library, service or resource. + /// + public string Name { get; set; } + + /// + /// Url of the library, service or resource. + /// + public string WebsiteUrl { get; set; } + + /// + /// Description of the library, service or resource. + /// + public string Description { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Documentation/DocumentationIdentifier.cs b/Source/NETworkManager.Documentation/DocumentationIdentifier.cs index 1e3f7be9b7..6ae1c6c742 100644 --- a/Source/NETworkManager.Documentation/DocumentationIdentifier.cs +++ b/Source/NETworkManager.Documentation/DocumentationIdentifier.cs @@ -1,128 +1,217 @@ -namespace NETworkManager.Documentation -{ - /// - /// Enum to identify documentation page entries. - /// - public enum DocumentationIdentifier - { - /// - /// Default documentation page. - /// - Default, - - /// - /// Dashbaord documentation page. - /// - ApplicationDashboard, - - /// - /// Network interface documentation page. - /// - ApplicationNetworkInterface, - - /// - /// WiFi documentation page. - /// - ApplicationWiFi, - - /// - /// IP scanner documentation page. - /// - ApplicationIPScanner, - - /// - /// Port scanner documentation page. - /// - ApplicationPortScanner, - - /// - /// Ping monitor documentation page. - /// - ApplicationPingMonitor, - - /// - /// Traceroute documentation page. - /// - ApplicationTraceroute, - - /// - /// DNS lookup documentation page. - /// - ApplicationDnsLookup, - - /// - /// Remote desktop documentation page. - /// - ApplicationRemoteDesktop, - - /// - /// PowerShell documentation page. - /// - ApplicationPowerShell, - - /// - /// PuTTY documentation page. - /// - ApplicationPutty, - - /// - /// TigerVNC documentation page. - /// - ApplicationTigerVNC, - - /// - /// Web Console documentation page. - /// - ApplicationWebConsole, - - /// - /// SNMP documentation page. - /// - ApplicationSnmp, - - /// - /// Discovery Protocol documentation page. - /// - ApplicationDiscoveryProtocol, - - /// - /// Wake on LAN documentation page. - /// - ApplicationWakeOnLan, - - /// - /// Whois documentation page. - /// - ApplicationWhois, - - /// - /// Subnet Calculator documentation page. - /// - ApplicationSubnetCalculator, - - /// - /// Lookup documentation page. - /// - ApplicationLookup, - - /// - /// Connections documentation page. - /// - ApplicationConnections, - - /// - /// Listeners documentation page. - /// - ApplicationListeners, - - /// - /// ARP Table documentation page. - /// - ApplicationArpTable, - - /// - /// Command line arguments. - /// - CommandLineArguments - } -} +namespace NETworkManager.Documentation; + +/// +/// Enum to identify documentation page entries. +/// +public enum DocumentationIdentifier +{ + /// + /// Default documentation page. + /// + Default, + + /// + /// Dashboard documentation page. + /// + ApplicationDashboard, + + /// + /// Network interface documentation page. + /// + ApplicationNetworkInterface, + + /// + /// WiFi documentation page. + /// + ApplicationWiFi, + + /// + /// IP scanner documentation page. + /// + ApplicationIPScanner, + + /// + /// Port scanner documentation page. + /// + ApplicationPortScanner, + + /// + /// Ping monitor documentation page. + /// + ApplicationPingMonitor, + + /// + /// Traceroute documentation page. + /// + ApplicationTraceroute, + + /// + /// DNS lookup documentation page. + /// + ApplicationDnsLookup, + + /// + /// Remote desktop documentation page. + /// + ApplicationRemoteDesktop, + + /// + /// PowerShell documentation page. + /// + ApplicationPowerShell, + + /// + /// PuTTY documentation page. + /// + ApplicationPutty, + + /// + /// TigerVNC documentation page. + /// + ApplicationTigerVNC, + + /// + /// Web Console documentation page. + /// + ApplicationWebConsole, + + /// + /// SNMP documentation page. + /// + ApplicationSnmp, + + /// + /// SNTP Lookup documentation page. + /// + ApplicationSntpLookup, + + /// + /// Hosts File Editor documentation page. + /// + ApplicationHostsFileEditor, + + /// + /// Firewall documentation page. + /// + ApplicationFirewall, + + /// + /// Discovery Protocol documentation page. + /// + ApplicationDiscoveryProtocol, + + /// + /// Wake on LAN documentation page. + /// + ApplicationWakeOnLan, + + /// + /// Whois documentation page. + /// + ApplicationWhois, + + /// + /// IP geolocation documentation page. + /// + ApplicationIPGeolocation, + + /// + /// Subnet Calculator documentation page. + /// + ApplicationSubnetCalculator, + + /// + /// Bit Calculator documentation page. + /// + ApplicationBitCalculator, + + /// + /// Lookup documentation page. + /// + ApplicationLookup, + + /// + /// Connections documentation page. + /// + ApplicationConnections, + + /// + /// Listeners documentation page. + /// + ApplicationListeners, + + /// + /// Neighbor Table documentation page. + /// + ApplicationNeighborTable, + + /// + /// Settings\General documentation page. + /// + SettingsGeneral, + + /// + /// Settings\Window documentation page. + /// + SettingsWindow, + + /// + /// Settings\Appearance documentation page. + /// + SettingsAppearance, + + /// + /// Settings\Language documentation page. + /// + SettingsLanguage, + + /// + /// Settings\Network documentation page. + /// + SettingsNetwork, + + /// + /// Settings\Status documentation page. + /// + SettingsStatus, + + /// + /// Settings\HotKeys documentation page. + /// + SettingsHotKeys, + + /// + /// Settings\Autostart documentation page. + /// + SettingsAutostart, + + /// + /// Settings\Update documentation page. + /// + SettingsUpdate, + + /// + /// Settings\Profiles documentation page. + /// + SettingsProfiles, + + /// + /// Settings\Settings documentation page. + /// + SettingsSettings, + + /// + /// Profiles documentation page. + /// + Profiles, + + /// + /// Command line arguments. + /// + CommandLineArguments, + + /// + /// Changelog base documentation page. + /// + ChangelogBase +} \ No newline at end of file diff --git a/Source/NETworkManager.Documentation/DocumentationInfo.cs b/Source/NETworkManager.Documentation/DocumentationInfo.cs index 2104e94fa4..7c1bde1495 100644 --- a/Source/NETworkManager.Documentation/DocumentationInfo.cs +++ b/Source/NETworkManager.Documentation/DocumentationInfo.cs @@ -1,29 +1,28 @@ -namespace NETworkManager.Documentation +namespace NETworkManager.Documentation; + +/// +/// Class to hold information's about a documentation entry. +/// +public class DocumentationInfo { /// - /// Class to hold all informations about a localization. + /// Create an instance of with all parameters. /// - public class DocumentationInfo + /// of the documentation entry. + /// to the documentation page. + public DocumentationInfo(DocumentationIdentifier identifier, string path) { - /// - /// Identifier for identifying a documentation entry. - /// - public DocumentationIdentifier Identifier { get; set; } - - /// - /// Path to the documentation, which is combined with the base path of the documentation. - /// - public string Path { get; set; } - - /// - /// Create an instance of with all parameters. - /// - /// of the documentation entry. - /// to the documentation page. - public DocumentationInfo(DocumentationIdentifier identifier, string path) - { - Identifier = identifier; - Path = path; - } + Identifier = identifier; + Path = path; } -} + + /// + /// Identifier for identifying a documentation entry. + /// + public DocumentationIdentifier Identifier { get; set; } + + /// + /// Path to the documentation, which is combined with the base path of the documentation. + /// + public string Path { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Documentation/DocumentationManager.cs b/Source/NETworkManager.Documentation/DocumentationManager.cs index 39a7ee0b6a..f1631e0a45 100644 --- a/Source/NETworkManager.Documentation/DocumentationManager.cs +++ b/Source/NETworkManager.Documentation/DocumentationManager.cs @@ -1,151 +1,276 @@ -using NETworkManager.Models; -using NETworkManager.Utilities; -using System.Collections.Generic; -using System.Diagnostics; +using System.Collections.Generic; using System.Linq; -using System.Windows.Input; +using NETworkManager.Models; +using NETworkManager.Settings; +using NETworkManager.Utilities; + +namespace NETworkManager.Documentation; -namespace NETworkManager.Documentation +/// +/// This class is designed to interact with the documentation at https://borntoberoot.net/NETworkManager/. +/// +public static class DocumentationManager { /// - /// This class is designed to interact with the documentation at https://borntoberoot.net/NETworkManager/. + /// Base path of the documentation. + /// + private const string DocumentationBaseUrl = @"https://borntoberoot.net/NETworkManager/"; + + /// + /// List with all known documentation entries. /// - public static class DocumentationManager + private static IEnumerable List => + [ + new DocumentationInfo(DocumentationIdentifier.ApplicationDashboard, + @"docs/application/dashboard"), + + new DocumentationInfo(DocumentationIdentifier.ApplicationNetworkInterface, + @"docs/application/network-interface"), + + new DocumentationInfo(DocumentationIdentifier.ApplicationWiFi, + @"docs/application/wifi"), + + new DocumentationInfo(DocumentationIdentifier.ApplicationIPScanner, + @"docs/application/ip-scanner"), + + new DocumentationInfo(DocumentationIdentifier.ApplicationPortScanner, + @"docs/application/port-scanner"), + + new DocumentationInfo(DocumentationIdentifier.ApplicationPingMonitor, + @"docs/application/ping-monitor"), + + new DocumentationInfo(DocumentationIdentifier.ApplicationTraceroute, + @"docs/application/traceroute"), + + new DocumentationInfo(DocumentationIdentifier.ApplicationDnsLookup, + @"docs/application/dns-lookup"), + + new DocumentationInfo(DocumentationIdentifier.ApplicationRemoteDesktop, + @"docs/application/remote-desktop"), + + new DocumentationInfo(DocumentationIdentifier.ApplicationPowerShell, + @"docs/application/powershell"), + + new DocumentationInfo(DocumentationIdentifier.ApplicationPutty, + @"docs/application/putty"), + + new DocumentationInfo(DocumentationIdentifier.ApplicationTigerVNC, + @"docs/application/tigervnc"), + + new DocumentationInfo(DocumentationIdentifier.ApplicationWebConsole, + @"docs/application/web-console"), + + new DocumentationInfo(DocumentationIdentifier.ApplicationSnmp, + @"docs/application/snmp"), + + new DocumentationInfo(DocumentationIdentifier.ApplicationSntpLookup, + @"docs/application/sntp-lookup"), + + new DocumentationInfo(DocumentationIdentifier.ApplicationHostsFileEditor, + @"docs/application/hosts-file-editor"), + + new DocumentationInfo(DocumentationIdentifier.ApplicationFirewall, + @"docs/application/firewall"), + + new DocumentationInfo(DocumentationIdentifier.ApplicationDiscoveryProtocol, + @"docs/application/discovery-protocol"), + + new DocumentationInfo(DocumentationIdentifier.ApplicationWakeOnLan, + @"docs/application/wake-on-lan"), + + new DocumentationInfo(DocumentationIdentifier.ApplicationWhois, + @"docs/application/whois"), + + new DocumentationInfo(DocumentationIdentifier.ApplicationIPGeolocation, + @"docs/application/ip-geolocation"), + + new DocumentationInfo(DocumentationIdentifier.ApplicationSubnetCalculator, + @"docs/application/subnet-calculator"), + + new DocumentationInfo(DocumentationIdentifier.ApplicationBitCalculator, + @"docs/application/bit-calculator"), + + new DocumentationInfo(DocumentationIdentifier.ApplicationLookup, + @"docs/application/lookup"), + + new DocumentationInfo(DocumentationIdentifier.ApplicationConnections, + @"docs/application/connection"), + + new DocumentationInfo(DocumentationIdentifier.ApplicationListeners, + @"docs/application/listeners"), + + new DocumentationInfo(DocumentationIdentifier.ApplicationNeighborTable, + @"docs/application/neighbor-table"), + + new DocumentationInfo(DocumentationIdentifier.SettingsGeneral, + @"docs/settings/general"), + + new DocumentationInfo(DocumentationIdentifier.SettingsWindow, + @"docs/settings/window"), + + new DocumentationInfo(DocumentationIdentifier.SettingsAppearance, + @"docs/settings/appearance"), + + new DocumentationInfo(DocumentationIdentifier.SettingsLanguage, + @"docs/settings/language"), + + new DocumentationInfo(DocumentationIdentifier.SettingsNetwork, + @"docs/settings/network"), + + new DocumentationInfo(DocumentationIdentifier.SettingsStatus, + @"docs/settings/status"), + + new DocumentationInfo(DocumentationIdentifier.SettingsHotKeys, + @"docs/settings/hotkeys"), + + new DocumentationInfo(DocumentationIdentifier.SettingsAutostart, + @"docs/settings/autostart"), + + new DocumentationInfo(DocumentationIdentifier.SettingsUpdate, + @"docs/settings/update"), + + new DocumentationInfo(DocumentationIdentifier.SettingsProfiles, + @"docs/settings/profiles"), + + new DocumentationInfo(DocumentationIdentifier.SettingsSettings, + @"docs/settings/settings"), + + new DocumentationInfo(DocumentationIdentifier.Profiles, + @"Documentation/profiles"), + + new DocumentationInfo(DocumentationIdentifier.CommandLineArguments, + @"docs/commandline-arguments"), + + new DocumentationInfo(DocumentationIdentifier.ChangelogBase, + @"docs/changelog") + ]; + + /// + /// Method to create the documentation url from . + /// + /// + /// of the documentation page you want to + /// open. + /// + /// URL of the documentation page. + private static string CreateUrl(DocumentationIdentifier documentationIdentifier) { - /// - /// Base path of the documentation. - /// - public const string DocumentationBaseUrl = @"https://borntoberoot.net/NETworkManager/"; - - /// - /// List with all known documentation entries. - /// - private static List List => new List - { - new DocumentationInfo(DocumentationIdentifier.ApplicationDashboard, @"Documentation/Application/Dashboard"), - new DocumentationInfo(DocumentationIdentifier.ApplicationNetworkInterface, @"Documentation/Application/NetworkInterface"), - new DocumentationInfo(DocumentationIdentifier.ApplicationWiFi, @"Documentation/Application/WiFi"), - new DocumentationInfo(DocumentationIdentifier.ApplicationIPScanner, @"Documentation/Application/IPScanner"), - new DocumentationInfo(DocumentationIdentifier.ApplicationPortScanner, @"Documentation/Application/PortScanner"), - new DocumentationInfo(DocumentationIdentifier.ApplicationPingMonitor, @"Documentation/Application/PingMonitor"), - new DocumentationInfo(DocumentationIdentifier.ApplicationTraceroute, @"Documentation/Application/Traceroute"), - new DocumentationInfo(DocumentationIdentifier.ApplicationDnsLookup, @"Documentation/Application/DNSLookup"), - new DocumentationInfo(DocumentationIdentifier.ApplicationRemoteDesktop, @"Documentation/Application/RemoteDesktop"), - new DocumentationInfo(DocumentationIdentifier.ApplicationPowerShell, @"Documentation/Application/PowerShell"), - new DocumentationInfo(DocumentationIdentifier.ApplicationPutty, @"Documentation/Application/PuTTY"), - new DocumentationInfo(DocumentationIdentifier.ApplicationTigerVNC, @"Documentation/Application/TigerVNC"), - new DocumentationInfo(DocumentationIdentifier.ApplicationWebConsole, @"Documentation/Application/WebConsole"), - new DocumentationInfo(DocumentationIdentifier.ApplicationSnmp, @"Documentation/Application/SNMP"), - new DocumentationInfo(DocumentationIdentifier.ApplicationDiscoveryProtocol, @"Documentation/Application/DiscoveryProtocol"), - new DocumentationInfo(DocumentationIdentifier.ApplicationWakeOnLan, @"Documentation/Application/WakeOnLAN"), - new DocumentationInfo(DocumentationIdentifier.ApplicationWhois, @"Documentation/Application/Whois"), - new DocumentationInfo(DocumentationIdentifier.ApplicationSubnetCalculator, @"Documentation/Application/SubnetCalculator"), - new DocumentationInfo(DocumentationIdentifier.ApplicationLookup, @"Documentation/Application/Lookup"), - new DocumentationInfo(DocumentationIdentifier.ApplicationConnections, @"Documentation/Application/Connection"), - new DocumentationInfo(DocumentationIdentifier.ApplicationListeners, @"Documentation/Application/Listeners"), - new DocumentationInfo(DocumentationIdentifier.ApplicationArpTable, @"Documentation/Application/ARPTable"), - new DocumentationInfo(DocumentationIdentifier.CommandLineArguments, @"Documentation/CommandLine/CommandLineArguments"), - }; + var info = List.FirstOrDefault(x => x.Identifier == documentationIdentifier); - /// - /// Method to create the documentation url from . - /// - /// of the documentation page you want to open. - /// URL of the documentation page. - private static string CreateUrl(DocumentationIdentifier documentationIdentifier) - { - var info = List.FirstOrDefault(x => x.Identifier == documentationIdentifier); + var url = DocumentationBaseUrl; - var url = DocumentationBaseUrl; + if (info != null) + url += info.Path; - if (info != null) - url += info.Path; + return url; + } - return url; - } + /// + /// Method for opening a documentation page with the default web browser based on the + /// . + /// + /// + /// of the documentation page you want to + /// open. + /// + public static void OpenDocumentation(DocumentationIdentifier documentationIdentifier) + { + ExternalProcessStarter.OpenUrl(CreateUrl(documentationIdentifier)); + } - /// - /// Method for opening a documentation page with the default webbrowser based on the . - /// - /// of the documentation page you want to open. - public static void OpenDocumentation(DocumentationIdentifier documentationIdentifier) - { - ExternalProcessStarter.OpenUrl(CreateUrl(documentationIdentifier)); - } - - /// - /// Command to open a documentation page based on . - /// - public static ICommand OpenDocumentationCommand => new RelayCommand(OpenDocumentationAction); - - /// - /// Method to open a documentation page based on . - /// - /// - private static void OpenDocumentationAction(object documentationIdentifier) + /// + /// Method to open the current changelog in the default web browser. + /// + public static void OpenChangelog() + { + var url = CreateUrl(DocumentationIdentifier.ChangelogBase); + + url += $"/{AssemblyManager.Current.Version.ToString().Replace('.', '-')}"; + + ExternalProcessStarter.OpenUrl(url); + } + + /// + /// Method to get the from an . + /// + /// + /// from which you want to get the + /// . + /// + /// of the application. + public static DocumentationIdentifier GetIdentifierByApplicationName(ApplicationName name) + { + return name switch { - if (documentationIdentifier != null) - OpenDocumentation((DocumentationIdentifier)documentationIdentifier); - } - - /// - /// Method to get the from an . - /// - /// from which you want to get the . - /// of the application. - public static DocumentationIdentifier GetIdentifierByAppliactionName(ApplicationName name) + ApplicationName.Dashboard => DocumentationIdentifier.ApplicationDashboard, + ApplicationName.NetworkInterface => DocumentationIdentifier.ApplicationNetworkInterface, + ApplicationName.WiFi => DocumentationIdentifier.ApplicationWiFi, + ApplicationName.IPScanner => DocumentationIdentifier.ApplicationIPScanner, + ApplicationName.PortScanner => DocumentationIdentifier.ApplicationPortScanner, + ApplicationName.PingMonitor => DocumentationIdentifier.ApplicationPingMonitor, + ApplicationName.Traceroute => DocumentationIdentifier.ApplicationTraceroute, + ApplicationName.DNSLookup => DocumentationIdentifier.ApplicationDnsLookup, + ApplicationName.RemoteDesktop => DocumentationIdentifier.ApplicationRemoteDesktop, + ApplicationName.PowerShell => DocumentationIdentifier.ApplicationPowerShell, + ApplicationName.PuTTY => DocumentationIdentifier.ApplicationPutty, + ApplicationName.TigerVNC => DocumentationIdentifier.ApplicationTigerVNC, + ApplicationName.WebConsole => DocumentationIdentifier.ApplicationWebConsole, + ApplicationName.SNMP => DocumentationIdentifier.ApplicationSnmp, + ApplicationName.SNTPLookup => DocumentationIdentifier.ApplicationSntpLookup, + ApplicationName.HostsFileEditor => DocumentationIdentifier.ApplicationHostsFileEditor, + ApplicationName.DiscoveryProtocol => DocumentationIdentifier.ApplicationDiscoveryProtocol, + ApplicationName.Firewall => DocumentationIdentifier.ApplicationFirewall, + ApplicationName.WakeOnLAN => DocumentationIdentifier.ApplicationWakeOnLan, + ApplicationName.Whois => DocumentationIdentifier.ApplicationWhois, + ApplicationName.IPGeolocation => DocumentationIdentifier.ApplicationIPGeolocation, + ApplicationName.SubnetCalculator => DocumentationIdentifier.ApplicationSubnetCalculator, + ApplicationName.BitCalculator => DocumentationIdentifier.ApplicationBitCalculator, + ApplicationName.Lookup => DocumentationIdentifier.ApplicationLookup, + ApplicationName.Connections => DocumentationIdentifier.ApplicationConnections, + ApplicationName.Listeners => DocumentationIdentifier.ApplicationListeners, + ApplicationName.NeighborTable => DocumentationIdentifier.ApplicationNeighborTable, + ApplicationName.None => DocumentationIdentifier.Default, + _ => DocumentationIdentifier.Default + }; + } + + /// + /// Method to get the from an . + /// + /// from which you want to get the . + /// of the application or settings page. + public static DocumentationIdentifier GetIdentifierBySettingsName(SettingsName name) + { + return name switch { - switch (name) - { - case ApplicationName.Dashboard: - return DocumentationIdentifier.ApplicationDashboard; - case ApplicationName.NetworkInterface: - return DocumentationIdentifier.ApplicationNetworkInterface; - case ApplicationName.WiFi: - return DocumentationIdentifier.ApplicationWiFi; - case ApplicationName.IPScanner: - return DocumentationIdentifier.ApplicationIPScanner; - case ApplicationName.PortScanner: - return DocumentationIdentifier.ApplicationPortScanner; - case ApplicationName.PingMonitor: - return DocumentationIdentifier.ApplicationPingMonitor; - case ApplicationName.Traceroute: - return DocumentationIdentifier.ApplicationTraceroute; - case ApplicationName.DNSLookup: - return DocumentationIdentifier.ApplicationDnsLookup; - case ApplicationName.RemoteDesktop: - return DocumentationIdentifier.ApplicationRemoteDesktop; - case ApplicationName.PowerShell: - return DocumentationIdentifier.ApplicationPowerShell; - case ApplicationName.PuTTY: - return DocumentationIdentifier.ApplicationPutty; - case ApplicationName.TigerVNC: - return DocumentationIdentifier.ApplicationTigerVNC; - case ApplicationName.WebConsole: - return DocumentationIdentifier.ApplicationWebConsole; - case ApplicationName.SNMP: - return DocumentationIdentifier.ApplicationSnmp; - case ApplicationName.DiscoveryProtocol: - return DocumentationIdentifier.ApplicationDiscoveryProtocol; - case ApplicationName.WakeOnLAN: - return DocumentationIdentifier.ApplicationWakeOnLan; - case ApplicationName.Whois: - return DocumentationIdentifier.ApplicationWhois; - case ApplicationName.SubnetCalculator: - return DocumentationIdentifier.ApplicationSubnetCalculator; - case ApplicationName.Lookup: - return DocumentationIdentifier.ApplicationLookup; - case ApplicationName.Connections: - return DocumentationIdentifier.ApplicationConnections; - case ApplicationName.Listeners: - return DocumentationIdentifier.ApplicationListeners; - case ApplicationName.ARPTable: - return DocumentationIdentifier.ApplicationArpTable; - case ApplicationName.None: - return DocumentationIdentifier.Default; - default: - return DocumentationIdentifier.Default; - } - } + SettingsName.General => DocumentationIdentifier.SettingsGeneral, + SettingsName.Window => DocumentationIdentifier.SettingsWindow, + SettingsName.Appearance => DocumentationIdentifier.SettingsAppearance, + SettingsName.Language => DocumentationIdentifier.SettingsLanguage, + SettingsName.Network => DocumentationIdentifier.SettingsNetwork, + SettingsName.Status => DocumentationIdentifier.SettingsStatus, + SettingsName.HotKeys => DocumentationIdentifier.SettingsHotKeys, + SettingsName.Autostart => DocumentationIdentifier.SettingsAutostart, + SettingsName.Update => DocumentationIdentifier.SettingsUpdate, + SettingsName.Profiles => DocumentationIdentifier.SettingsProfiles, + SettingsName.Settings => DocumentationIdentifier.SettingsSettings, + SettingsName.Dashboard => GetIdentifierByApplicationName(ApplicationName.Dashboard), + SettingsName.NetworkInterface => GetIdentifierByApplicationName(ApplicationName.NetworkInterface), + SettingsName.IPScanner => GetIdentifierByApplicationName(ApplicationName.IPScanner), + SettingsName.PortScanner => GetIdentifierByApplicationName(ApplicationName.PortScanner), + SettingsName.PingMonitor => GetIdentifierByApplicationName(ApplicationName.PingMonitor), + SettingsName.Traceroute => GetIdentifierByApplicationName(ApplicationName.Traceroute), + SettingsName.DNSLookup => GetIdentifierByApplicationName(ApplicationName.DNSLookup), + SettingsName.RemoteDesktop => GetIdentifierByApplicationName(ApplicationName.RemoteDesktop), + SettingsName.PowerShell => GetIdentifierByApplicationName(ApplicationName.PowerShell), + SettingsName.PuTTY => GetIdentifierByApplicationName(ApplicationName.PuTTY), + SettingsName.TigerVNC => GetIdentifierByApplicationName(ApplicationName.TigerVNC), + SettingsName.WebConsole => GetIdentifierByApplicationName(ApplicationName.WebConsole), + SettingsName.SNMP => GetIdentifierByApplicationName(ApplicationName.SNMP), + SettingsName.SNTPLookup => GetIdentifierByApplicationName(ApplicationName.SNTPLookup), + SettingsName.WakeOnLAN => GetIdentifierByApplicationName(ApplicationName.WakeOnLAN), + SettingsName.BitCalculator => GetIdentifierByApplicationName(ApplicationName.BitCalculator), + _ => DocumentationIdentifier.Default + }; } } diff --git a/Source/NETworkManager.Documentation/ExternalServicesInfo.cs b/Source/NETworkManager.Documentation/ExternalServicesInfo.cs index 9fe5059712..5987523014 100644 --- a/Source/NETworkManager.Documentation/ExternalServicesInfo.cs +++ b/Source/NETworkManager.Documentation/ExternalServicesInfo.cs @@ -1,11 +1,18 @@ -namespace NETworkManager.Documentation +namespace NETworkManager.Documentation; + +/// +/// Class to hold information's about an external service. +/// +public class ExternalServicesInfo : BaseInfo { - public class ExternalServicesInfo : BaseInfo + /// + /// Create an instance of with parameters. + /// + /// Name of the external service. + /// Url of the external service. + /// Description of the external service. + public ExternalServicesInfo(string name, string websiteUrl, string description) : base(name, websiteUrl, + description) { - public ExternalServicesInfo(string name, string websiteUrl, string description) : base(name, websiteUrl, - description) - { - - } } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Documentation/ExternalServicesManager.cs b/Source/NETworkManager.Documentation/ExternalServicesManager.cs index 01c84143a1..6970f872bf 100644 --- a/Source/NETworkManager.Documentation/ExternalServicesManager.cs +++ b/Source/NETworkManager.Documentation/ExternalServicesManager.cs @@ -1,18 +1,23 @@ using System.Collections.Generic; +using NETworkManager.Localization.Resources; -namespace NETworkManager.Documentation +namespace NETworkManager.Documentation; + +/// +/// This class provides information's about external services used within the program. +/// +public static class ExternalServicesManager { /// - /// This class provides information about external services used within the program. + /// Static list with all external services that are used. /// - public static class ExternalServicesManager + public static List List => new() { - /// - /// Static list with all external services that are used. - /// - public static List List => new List - { - new ExternalServicesInfo("ipify", "https://www.ipify.org/", Localization.Resources.Strings.ExternalService_ipify_Description) - }; - } -} + new ExternalServicesInfo("ip-api.com", "https://ip-api.com/", + Strings.ExternalService_ip_api_Description), + new ExternalServicesInfo("ipify.org", "https://www.ipify.org/", + Strings.ExternalService_ipify_Description), + new ExternalServicesInfo("speed.cloudflare.com", "https://speed.cloudflare.com/", + Strings.ExternalService_speed_cloudflare_Description) + }; +} \ No newline at end of file diff --git a/Source/NETworkManager.Documentation/LibraryInfo.cs b/Source/NETworkManager.Documentation/LibraryInfo.cs index 81fac20dce..a8d7d8bfd1 100644 --- a/Source/NETworkManager.Documentation/LibraryInfo.cs +++ b/Source/NETworkManager.Documentation/LibraryInfo.cs @@ -1,14 +1,32 @@ -namespace NETworkManager.Documentation +namespace NETworkManager.Documentation; + +/// +/// Class to hold information's about a library. +/// +public class LibraryInfo : BaseInfo { - public class LibraryInfo : BaseInfo + /// + /// Create an instance of with parameters. + /// + /// Name of the library. + /// Url of the library. + /// Description of the library. + /// License which is used by the library. + /// Url of the license which is used by the library. + public LibraryInfo(string name, string websiteUrl, string description, string license, string licenseUrl) : base( + name, websiteUrl, description) { - public string License { get; set; } - public string LicenseUrl { get; set; } - - public LibraryInfo(string name, string websiteUrl, string description, string license, string licenseUrl) : base(name, websiteUrl, description) - { - License = license; - LicenseUrl = licenseUrl; - } + License = license; + LicenseUrl = licenseUrl; } -} + + /// + /// License which is used by the library. + /// + public string License { get; set; } + + /// + /// Url of the license which is used by the library. + /// + public string LicenseUrl { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Documentation/LibraryManager.cs b/Source/NETworkManager.Documentation/LibraryManager.cs index 7d9103bb78..5844e094ac 100644 --- a/Source/NETworkManager.Documentation/LibraryManager.cs +++ b/Source/NETworkManager.Documentation/LibraryManager.cs @@ -1,50 +1,118 @@ using System.Collections.Generic; using System.IO; using System.Reflection; +using NETworkManager.Localization.Resources; -namespace NETworkManager.Documentation +namespace NETworkManager.Documentation; + +/// +/// This class provides information's about libraries used within the program. +/// +public static class LibraryManager { /// - /// This class provides information about libraries used within the program. + /// Name of the license folder. /// - public static class LibraryManager - { - /// - /// Name of the license folder. - /// - private const string LicenseFolderName = "Licenses"; + private const string LicenseFolderName = "Licenses"; + + /// + /// Static list with all libraries that are used. + /// + public static List List => + [ + new("#SNMP Library", "https://github.com/lextudio/sharpsnmplib", + Strings.Library_SharpSNMP_Description, + Strings.License_MITLicense, + "https://github.com/lextudio/sharpsnmplib/blob/master/LICENSE"), + new("AirspaceFixer", "https://github.com/chris84948/AirspaceFixer", + Strings.Library_AirspaceFixer_Description, + Strings.License_MITLicense, + "https://github.com/chris84948/AirspaceFixer/blob/master/LICENSE"), + new("ControlzEx", "https://github.com/ControlzEx/ControlzEx", + Strings.Library_ControlzEx_Description, + Strings.License_MITLicense, + "https://github.com/ButchersBoy/Dragablz/blob/master/LICENSE"), + new("DnsClient.NET", "https://github.com/MichaCo/DnsClient.NET", + Strings.Library_DnsClientNET_Description, + Strings.License_ApacheLicense2dot0, + "https://github.com/MichaCo/DnsClient.NET/blob/dev/LICENSE"), + new("Dragablz", "https://github.com/ButchersBoy/Dragablz", + Strings.Library_Dragablz_Description, + Strings.License_MITLicense, + "https://github.com/ButchersBoy/Dragablz/blob/master/LICENSE"), + new("GongSolutions.Wpf.DragDrop", "https://github.com/punker76/gong-wpf-dragdrop", + Strings.Library_GongSolutionsWpfDragDrop_Description, + Strings.License_BDS3Clause, + "https://github.com/punker76/gong-wpf-dragdrop/blob/develop/LICENSE"), + new("IPNetwork", "https://github.com/lduchosal/ipnetwork", + Strings.Library_IPNetwork_Description, + Strings.License_BDS2Clause, + "https://github.com/lduchosal/ipnetwork/blob/master/LICENSE"), + new("LiveCharts2", "https://github.com/Live-Charts/LiveCharts2", + Strings.Library_LiveCharts_Description, + Strings.License_MITLicense, + "https://github.com/Live-Charts/LiveCharts2/blob/master/LICENSE"), + new("LoadingIndicators.WPF", "https://github.com/zeluisping/LoadingIndicators.WPF", + Strings.Library_LoadingIndicatorsWPF_Description, + Strings.License_Unlicense, + "https://github.com/zeluisping/LoadingIndicators.WPF/blob/master/LICENSE"), + new("log4net", "https://logging.apache.org/log4net/", + Strings.Library_log4net_Description, + Strings.License_ApacheLicense2dot0, + "https://github.com/apache/logging-log4net/blob/master/LICENSE"), + new("MahApps.Metro", "https://github.com/mahapps/mahapps.metro", + Strings.Library_MahAppsMetro_Description, + Strings.License_MITLicense, + "https://github.com/MahApps/MahApps.Metro/blob/master/LICENSE"), + new("MahApps.Metro.IconPacks", "https://github.com/MahApps/MahApps.Metro.IconPacks", + Strings.Library_MahAppsMetroIconPacks_Description, + Strings.License_MITLicense, + "https://github.com/MahApps/MahApps.Metro.IconPacks/blob/master/LICENSE"), + new("Microsoft.PowerShell.SDK", "https://github.com/PowerShell/PowerShell", + Strings.Library_PowerShellSDK_Description, + Strings.License_MITLicense, + "https://github.com/PowerShell/PowerShell/blob/master/LICENSE.txt"), + new("Microsoft.Web.WebView2", "https://docs.microsoft.com/en-us/microsoft-edge/webview2/", + Strings.Library_WebView2_Description, + Strings.License_MicrosoftWebView2License, + "https://www.nuget.org/packages/Microsoft.Web.WebView2/1.0.824-prerelease/License"), + new("Microsoft.Windows.CsWinRT", "https://github.com/microsoft/cswinrt/tree/master/", + Strings.Library_CsWinRT_Description, + Strings.License_MITLicense, + "https://github.com/microsoft/CsWinRT/blob/master/LICENSE"), + new("Microsoft.Xaml.Behaviors.Wpf", "https://github.com/microsoft/XamlBehaviorsWpf", + Strings.Library_XamlBehaviorsWpf_Description, + Strings.License_MITLicense, + "https://github.com/microsoft/XamlBehaviorsWpf/blob/master/LICENSE"), + new("Newtonsoft.Json", "https://github.com/JamesNK/Newtonsoft.Json", + Strings.Library_NewtonsoftJson_Description, + Strings.License_MITLicense, + "https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md"), + new("nulastudio.NetBeauty", "https://github.com/nulastudio/NetBeauty2", + Strings.Library_nulastudioNetBeauty_Description, + Strings.License_MITLicense, + "https://github.com/nulastudio/NetBeauty2/blob/master/LICENSE"), + new("Octokit", "https://github.com/octokit/octokit.net", + Strings.Library_Octokit_Description, + Strings.License_MITLicense, + "https://github.com/octokit/octokit.net/blob/master/LICENSE.txt"), + new("PSDiscoveryProtocol", "https://github.com/lahell/PSDiscoveryProtocol", + Strings.Library_PSDicoveryProtocol_Description, + Strings.License_MITLicense, + "https://github.com/lahell/PSDiscoveryProtocol/blob/master/LICENSE") + ]; - /// - /// Method to get the license folder location. - /// - /// Location of the license folder. - public static string GetLicenseLocation() - { - return Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? throw new DirectoryNotFoundException("Program execution directory not found, while trying to build path to license directory!"), LicenseFolderName); - } - /// - /// Static list with all libraries that are used. - /// - public static List List => new List - { - new LibraryInfo("MahApps.Metro", "https://github.com/mahapps/mahapps.metro", Localization.Resources.Strings.Library_MahAppsMetro_Description, Localization.Resources.Strings.License_MITLicense, "https://github.com/MahApps/MahApps.Metro/blob/master/LICENSE"), - new LibraryInfo("MahApps.Metro.IconPacks", "https://github.com/MahApps/MahApps.Metro.IconPacks", Localization.Resources.Strings.Library_MahAppsMetroIconPacks_Description, Localization.Resources.Strings.License_MITLicense, "https://github.com/MahApps/MahApps.Metro.IconPacks/blob/master/LICENSE"), - new LibraryInfo("ControlzEx", "https://github.com/ControlzEx/ControlzEx", Localization.Resources.Strings.Library_ControlzEx_Description, Localization.Resources.Strings.License_MITLicense, "https://github.com/ButchersBoy/Dragablz/blob/master/LICENSE"), - new LibraryInfo("Octokit", "https://github.com/octokit/octokit.net", Localization.Resources.Strings.Library_Octokit_Description, Localization.Resources.Strings.License_MITLicense, "https://github.com/octokit/octokit.net/blob/master/LICENSE.txt"), - new LibraryInfo("#SNMP Libary", "https://github.com/lextudio/sharpsnmplib", Localization.Resources.Strings.Library_SharpSNMP_Description, Localization.Resources.Strings.License_MITLicense, "https://github.com/lextudio/sharpsnmplib/blob/master/LICENSE"), - new LibraryInfo("Dragablz", "https://github.com/ButchersBoy/Dragablz", Localization.Resources.Strings.Library_Dragablz_Description, Localization.Resources.Strings.License_MITLicense,"https://github.com/ButchersBoy/Dragablz/blob/master/LICENSE"), - new LibraryInfo("IPNetwork", "https://github.com/lduchosal/ipnetwork", Localization.Resources.Strings.Library_IPNetwork_Description, Localization.Resources.Strings.License_BDS2Clause, "https://github.com/lduchosal/ipnetwork/blob/master/LICENSE"), - new LibraryInfo("AirspaceFixer" ,"https://github.com/chris84948/AirspaceFixer", Localization.Resources.Strings.Library_AirspaceFixer_Description, Localization.Resources.Strings.License_MITLicense, "https://github.com/chris84948/AirspaceFixer/blob/master/LICENSE"), - new LibraryInfo("Newtonsoft.Json", "https://github.com/JamesNK/Newtonsoft.Json", Localization.Resources.Strings.Library_NewtonsoftJson_Description, Localization.Resources.Strings.License_MITLicense,"https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md"), - new LibraryInfo("LiveCharts", "https://github.com/Live-Charts/Live-Charts", Localization.Resources.Strings.Library_LiveCharts_Description, Localization.Resources.Strings.License_MITLicense,"https://github.com/Live-Charts/Live-Charts/blob/master/LICENSE.TXT"), - new LibraryInfo("LoadingIndicators.WPF", "https://github.com/zeluisping/LoadingIndicators.WPF", Localization.Resources.Strings.Library_LoadingIndicatorsWPF_Description, Localization.Resources.Strings.License_Unlicense, "https://github.com/zeluisping/LoadingIndicators.WPF/blob/master/LICENSE"), - new LibraryInfo("DnsClient.NET", "https://github.com/MichaCo/DnsClient.NET",Localization.Resources.Strings.Library_DnsClientNET_Description, Localization.Resources.Strings.License_ApacheLicense2dot0, "https://github.com/MichaCo/DnsClient.NET/blob/dev/LICENSE"), - new LibraryInfo("PSDiscoveryProtocol", "https://github.com/lahell/PSDiscoveryProtocol",Localization.Resources.Strings.Library_PSDicoveryProtocol_Description, Localization.Resources.Strings.License_MITLicense, "https://github.com/lahell/PSDiscoveryProtocol/blob/master/LICENSE"), - new LibraryInfo("Microsoft.PowerShell.SDK", "https://github.com/PowerShell/PowerShell", Localization.Resources.Strings.Library_PowerShellSDK_Description, Localization.Resources.Strings.License_MITLicense, "https://github.com/PowerShell/PowerShell/blob/master/LICENSE.txt"), - new LibraryInfo("Microsoft.Web.WebView2", "https://docs.microsoft.com/en-us/microsoft-edge/webview2/", Localization.Resources.Strings.Library_WebView2_Description, Localization.Resources.Strings.License_MicrosoftWebView2License, "https://www.nuget.org/packages/Microsoft.Web.WebView2/1.0.824-prerelease/License"), - new LibraryInfo("Microsoft.Windows.CsWinRT", "https://github.com/microsoft/cswinrt/tree/master/", Localization.Resources.Strings.Library_CsWinRT_Description, Localization.Resources.Strings.License_MITLicense, "https://github.com/microsoft/CsWinRT/blob/master/LICENSE"), - new LibraryInfo("Microsoft.Xaml.Behaviors.Wpf", "https://github.com/microsoft/XamlBehaviorsWpf", Localization.Resources.Strings.Library_XamlBehaviorsWpf_Description, Localization.Resources.Strings.License_MITLicense, "https://github.com/microsoft/XamlBehaviorsWpf/blob/master/LICENSE"), - }; + /// + /// Method to get the license folder location. + /// + /// Location of the license folder. + public static string GetLicenseLocation() + { + return Path.Combine( + Path.GetDirectoryName(Assembly.GetEntryAssembly()?.Location) ?? + throw new DirectoryNotFoundException( + "Program execution directory not found, while trying to build path to license directory!"), + LicenseFolderName); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Documentation/Licenses/ControlsEx.txt b/Source/NETworkManager.Documentation/Licenses/ControlzEx.txt similarity index 100% rename from Source/NETworkManager.Documentation/Licenses/ControlsEx.txt rename to Source/NETworkManager.Documentation/Licenses/ControlzEx.txt diff --git a/Source/NETworkManager.Documentation/Licenses/GongSolutions.Wpf.DragDrop.txt b/Source/NETworkManager.Documentation/Licenses/GongSolutions.Wpf.DragDrop.txt new file mode 100644 index 0000000000..761d7d528e --- /dev/null +++ b/Source/NETworkManager.Documentation/Licenses/GongSolutions.Wpf.DragDrop.txt @@ -0,0 +1,28 @@ +BSD 3-Clause License + +Copyright (c) Jan Karger, Steven Kirk and Contributors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of gong-wpf-dragdrop nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/Source/NETworkManager.Documentation/Licenses/LiveCharts.txt b/Source/NETworkManager.Documentation/Licenses/LiveCharts2.txt similarity index 92% rename from Source/NETworkManager.Documentation/Licenses/LiveCharts.txt rename to Source/NETworkManager.Documentation/Licenses/LiveCharts2.txt index 65c8efe372..bf5cc2e5ea 100644 --- a/Source/NETworkManager.Documentation/Licenses/LiveCharts.txt +++ b/Source/NETworkManager.Documentation/Licenses/LiveCharts2.txt @@ -1,6 +1,6 @@ -The MIT License (MIT) +MIT License -Copyright (c) 2016 Alberto Rodriguez & LiveCharts contributors +Copyright (c) 2021 Alberto Rodriguez Orozco Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Source/NETworkManager.Documentation/Licenses/NETworkManager.txt b/Source/NETworkManager.Documentation/Licenses/NETworkManager.txt index 785f246ce9..4de9a54296 100644 --- a/Source/NETworkManager.Documentation/Licenses/NETworkManager.txt +++ b/Source/NETworkManager.Documentation/Licenses/NETworkManager.txt @@ -1,674 +1,259 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 +GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - Preamble +Copyright (C) 2007 Free Software Foundation, Inc. +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to +PREAMBLE + +The GNU General Public License is a free, copyleft license for software and other kinds of works. + +The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. + +To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. + +For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. + +Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. +For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. + +Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. + +Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. + +The precise terms and conditions for copying, distribution and modification follow. + + +TERMS AND CONDITIONS + +0. Definitions. + +"This License" refers to version 3 of the GNU General Public License. + +"Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. + +"The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. + +To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. + + +A "covered work" means either the unmodified Program or a work based on the Program. + +To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your +To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. + +An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. + +1. Source Code. + +The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. + +A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. + +The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. + +The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. + +The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same work. + +2. Basic Permissions. + +All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into posProfile of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of posProfile and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means +You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. + +3. Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. + +When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. + +4. Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. + +5. Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: + +a) The work must carry prominent notices stating that you modified it, and giving a relevant date. +b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". +c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. +d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. +A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. + +6. Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: + +a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. +b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. +c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. +d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. +e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. + +A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. + +"Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. + +If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). + +The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. + +Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. + +7. Additional Terms. + +"Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: + +e) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or +b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or +c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or +d) Limiting the use for publicity purposes of names of licensors or authors of the material; or +e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or +f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. + +All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. + +8. Termination. + +You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). + +However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to posProfile of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that +Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. + +Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. + +9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. + +10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. + +An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. + +11. Patents. + +A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". + +A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. + +In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. + +If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered +If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the +A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. + +12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. + +13. Use with the GNU Affero General Public License. + +Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - {one line to give the program's name and a brief idea of what it does.} - Copyright (C) {year} {name of author} - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . +14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. + +If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. + +Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. + +15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS + + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. + + +Copyright (C) + +This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - {project} Copyright (C) {year} {fullname} - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. +If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: + + Copyright (C) +This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. +This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". + +You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see . + +The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . diff --git a/Source/NETworkManager.Documentation/Licenses/log4net.txt b/Source/NETworkManager.Documentation/Licenses/log4net.txt new file mode 100644 index 0000000000..1528e22e03 --- /dev/null +++ b/Source/NETworkManager.Documentation/Licenses/log4net.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Source/NETworkManager.Documentation/Licenses/nulastudio.NetBeauty.txt b/Source/NETworkManager.Documentation/Licenses/nulastudio.NetBeauty.txt new file mode 100644 index 0000000000..d9fbe226de --- /dev/null +++ b/Source/NETworkManager.Documentation/Licenses/nulastudio.NetBeauty.txt @@ -0,0 +1,7 @@ +Copyright © 2022 nulastudio + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Source/NETworkManager.Documentation/NETworkManager.Documentation.csproj b/Source/NETworkManager.Documentation/NETworkManager.Documentation.csproj index 5d55a1c438..723ad29bf9 100644 --- a/Source/NETworkManager.Documentation/NETworkManager.Documentation.csproj +++ b/Source/NETworkManager.Documentation/NETworkManager.Documentation.csproj @@ -1,94 +1,113 @@  - - {95CE4AD5-14C0-4486-9C11-5D6A5EC48176} - Library - Properties - NETworkManager.Documentation - NETworkManager.Documentation - net6.0-windows10.0.17763.0 - win10-x64 - false - true - false - bin\Debug\NETworkManager.Documentation.xml - - - - - - - - - - - - - - - - - - - - - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - - - PreserveNewest - - - \ No newline at end of file + + {95CE4AD5-14C0-4486-9C11-5D6A5EC48176} + Library + Properties + NETworkManager.Documentation + NETworkManager.Documentation + net10.0-windows10.0.22621.0 + false + true + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + + + + + + + + diff --git a/Source/NETworkManager.Documentation/Properties/AssemblyInfo.cs b/Source/NETworkManager.Documentation/Properties/AssemblyInfo.cs index dca89ffb11..9c2d7e4a2f 100644 --- a/Source/NETworkManager.Documentation/Properties/AssemblyInfo.cs +++ b/Source/NETworkManager.Documentation/Properties/AssemblyInfo.cs @@ -4,7 +4,5 @@ [assembly: AssemblyTitle("NETworkManager.Documentation")] [assembly: AssemblyDescription("Library contains NETworkManager documentation.")] [assembly: AssemblyProduct("NETworkManager.Documentation")] - [assembly: ComVisible(false)] - [assembly: Guid("95ce4ad5-14c0-4486-9c11-5d6a5ec48176")] \ No newline at end of file diff --git a/Source/NETworkManager.Documentation/ResourceInfo.cs b/Source/NETworkManager.Documentation/ResourceInfo.cs index 3ab9755273..08edccb62e 100644 --- a/Source/NETworkManager.Documentation/ResourceInfo.cs +++ b/Source/NETworkManager.Documentation/ResourceInfo.cs @@ -1,10 +1,17 @@ -namespace NETworkManager.Documentation +namespace NETworkManager.Documentation; + +/// +/// Class to hold all information's about a resource. +/// +public class ResourceInfo : BaseInfo { - public class ResourceInfo : BaseInfo + /// + /// Create an instance of with parameters. + /// + /// Name of the resource. + /// Url of the resource. + /// Description of the resource. + public ResourceInfo(string name, string websiteUrl, string description) : base(name, websiteUrl, description) { - public ResourceInfo(string name, string websiteUrl, string description) : base(name, websiteUrl, description) - { - - } } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Documentation/ResourceManager.cs b/Source/NETworkManager.Documentation/ResourceManager.cs index f218cfd940..9fdb827a05 100644 --- a/Source/NETworkManager.Documentation/ResourceManager.cs +++ b/Source/NETworkManager.Documentation/ResourceManager.cs @@ -1,21 +1,32 @@ using System.Collections.Generic; +using NETworkManager.Localization.Resources; -namespace NETworkManager.Documentation +namespace NETworkManager.Documentation; + +/// +/// This class provides information's about resources used within the program. +/// +public static class ResourceManager { /// - /// This class provides information about resources used within the program. + /// Static list with all resources that are used. /// - public static class ResourceManager - { - /// - /// Static list with all resources that are used. - /// - public static List List => new List - { - new ResourceInfo("Organizationally unique identifier", "https://linuxnet.ca/ieee/oui/", Localization.Resources.Strings.Resource_OUI_Description), - new ResourceInfo("Service names and port numbers", "https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml", Localization.Resources.Strings.Resource_ServiceNamePortNumber_Description), - new ResourceInfo("flag-icon-css","https://github.com/lipis/flag-icon-css", Localization.Resources.Strings.Resource_Flag_Description), - new ResourceInfo("List of Top-Level-Domains", "https://data.iana.org/TLD/tlds-alpha-by-domain.txt", Localization.Resources.Strings.Resource_ListTLD_Description) - }; - } -} + public static List List => + [ + new("Organizationally unique identifier", "https://standards-oui.ieee.org/oui/oui.txt", + Strings.Resource_OUI_Description), + + new("Service names and port numbers", + "https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml", + Strings.Resource_ServiceNamePortNumber_Description), + + new("flag-icon-css", "https://github.com/lipis/flag-icon-css", + Strings.Resource_Flag_Description), + + new("List of Top-Level-Domains", "https://data.iana.org/TLD/tlds-alpha-by-domain.txt", + Strings.Resource_ListTLD_Description), + + new("natural-earth-geojson", "https://github.com/martynafford/natural-earth-geojson", + Strings.Resource_NaturalEarth_Description) + ]; +} \ No newline at end of file diff --git a/Source/NETworkManager.Localization/ILocalizationStringTranslator.cs b/Source/NETworkManager.Localization/ILocalizationStringTranslator.cs deleted file mode 100644 index b92454c66e..0000000000 --- a/Source/NETworkManager.Localization/ILocalizationStringTranslator.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace NETworkManager.Localization -{ - /// - /// Interface to translate strings. - /// - interface ILocalizationStringTranslator - { - /// - /// Method to translate strings. - /// - /// Original string to translate. - /// Translated string. - string Translate(string value); - } -} diff --git a/Source/NETworkManager.Localization/LocalizationInfo.cs b/Source/NETworkManager.Localization/LocalizationInfo.cs index 136591d29e..3469fb6f9c 100644 --- a/Source/NETworkManager.Localization/LocalizationInfo.cs +++ b/Source/NETworkManager.Localization/LocalizationInfo.cs @@ -1,69 +1,59 @@ using System; -namespace NETworkManager.Localization +namespace NETworkManager.Localization; + +/// +/// Class to hold all information's about a localization. +/// +public class LocalizationInfo { /// - /// Class to hold all informations about a localization. + /// Create an empty instance of . /// - public class LocalizationInfo + public LocalizationInfo() { - /// - /// Name of the Language. - /// - public string Name { get; set; } - /// - /// Native name of the language. - /// - public string NativeName { get; set; } + } - /// - /// Uri of the country flag. - /// - public Uri FlagUri { get; set; } + /// + /// Create an instance of with all parameters. + /// + /// . + /// . + /// . + /// . + /// . + public LocalizationInfo(string name, string nativeName, Uri flagUri, string code, bool isOfficial = false) + { + Name = name; + NativeName = nativeName; + FlagUri = flagUri; + Code = code; + IsOfficial = isOfficial; + } - /// - /// Culture code of the language. - /// - public string Code { get; set; } + /// + /// Name of the Language. + /// + public string Name { get; set; } - /// - /// Indicates whether the language has been translated by the maintainer or the community - /// - public bool IsOfficial { get; set; } - - /// - /// Create an empty instance of . - /// - public LocalizationInfo() - { + /// + /// Native name of the language. + /// + public string NativeName { get; set; } - } + /// + /// Uri of the country flag. + /// + public Uri FlagUri { get; set; } - /// - /// Create an instance of with a culture code. - /// - /// Culture code (like "en-US") - public LocalizationInfo(string code) - { - Code = code; - } + /// + /// Culture code of the language. + /// + public string Code { get; set; } - /// - /// Create an instance of with all parameters. - /// - /// . - /// . - /// . - /// . - /// . - public LocalizationInfo(string name, string nativeName, Uri flagUri, string code, bool isOfficial = false) - { - Name = name; - NativeName = nativeName; - FlagUri = flagUri; - Code = code; - IsOfficial = isOfficial; - } - } -} + /// + /// Indicates whether the language has been translated by the maintainer or the community + /// + public bool IsOfficial { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Localization/LocalizationManager.cs b/Source/NETworkManager.Localization/LocalizationManager.cs index f1e335f721..32557ba21f 100644 --- a/Source/NETworkManager.Localization/LocalizationManager.cs +++ b/Source/NETworkManager.Localization/LocalizationManager.cs @@ -3,129 +3,134 @@ using System.Globalization; using System.Linq; -namespace NETworkManager.Localization +namespace NETworkManager.Localization; + +/// +/// Class provides variables/methods to manage localization. +/// +public class LocalizationManager { /// - /// Class provides variables/methods to manage localization. + /// Constant for the default culture code. /// - public class LocalizationManager - { - /// - /// Constant for the default culture code. - /// - private const string _defaultCultureCode = "en-US"; - - /// - /// Constant with the path to the flag images. - /// - private const string _baseFlagImageUri = @"pack://application:,,,/NETworkManager.Localization;component/Resources/Flags/"; - - /// - /// Variable for the instance of the class. - /// - private static LocalizationManager _instance = null; - - /// - /// Returns the current instance of the class. - /// The language can be set on creation (first call), by passing a culture code (like "en-US") as parameter. - /// Use to change it later. - /// - /// Culture code (default is "en-US"). See also . - /// Instance of the class. - public static LocalizationManager GetInstance(string cultureCode = _defaultCultureCode) - { - if (_instance == null) - _instance = new LocalizationManager(cultureCode); + private const string DefaultCultureCode = "en-US"; - return _instance; - } + /// + /// Constant with the path to the flag images. + /// + private const string BaseFlagImageUri = + @"pack://application:,,,/NETworkManager.Localization;component/Resources/Flags/"; - /// - /// Method to build the uri for a flag image based on the culture code. - /// - /// Culture code like "en-US". - /// Uri of the flag image. - public static Uri GetImageUri(string cultureCode) - { - return new Uri(_baseFlagImageUri + cultureCode + ".png"); - } + /// + /// Variable for the instance of the class. + /// + private static LocalizationManager _instance; - /// - /// List with all s. - /// - public static List List => new List - { - // Offical - new LocalizationInfo("English", "English", GetImageUri("en-US"), "en-US", true), - new LocalizationInfo("German (Germany)", "Deutsch", GetImageUri("de-DE"), "de-DE", true), - - // Community - new LocalizationInfo("Chinese (China)", "大陆简体", GetImageUri("zh-CN"), "zh-CN"), - new LocalizationInfo("Chinese (Taiwan)", "台灣正體", GetImageUri("zh-TW"), "zh-TW"), - new LocalizationInfo("Czech (Czech Republic)", "Čeština", GetImageUri("cs-CZ"), "cs-CZ"), - new LocalizationInfo("Dutch (Netherlands)", "Nederlands", GetImageUri("nl-NL"), "nl-NL"), - new LocalizationInfo("French (France)", "Français", GetImageUri("fr-FR"), "fr-FR"), - new LocalizationInfo("Hungarian (Hungary)", "Magyar", GetImageUri("hu-HU"), "hu-HU"), - new LocalizationInfo("Italian (Italy)", "Italiano", GetImageUri("it-IT"), "it-IT"), - new LocalizationInfo("Korean (Korea)", "한국어",GetImageUri("ko-KR"),"ko-KR"), - new LocalizationInfo("Polish (Poland)", "Język polski", GetImageUri("pl-PL"), "pl-PL"), - new LocalizationInfo("Portuguese (Brazil)", "português brasileiro", GetImageUri("pt-BR"), "pt-BR"), - new LocalizationInfo("Russian (Russia)", "Русский", GetImageUri("ru-RU"), "ru-RU"), - new LocalizationInfo("Slovenian (Slovenia)", "slovenski jezik", GetImageUri("sl-SI"), "sl-SI"), - new LocalizationInfo("Spanish (Spain)", "Español", GetImageUri("es-ES"), "es-ES") - }; - - /// - /// Variable with the currently used . - /// - public LocalizationInfo Current { get; private set; } = new LocalizationInfo(); - - /// - /// Variable with the currently used . - /// - public CultureInfo Culture { get; private set; } - - /// - /// Create an instance and load the language based on the culture code. - /// - /// Culture code (default is "en-US"). See also . - private LocalizationManager(string cultureCode = _defaultCultureCode) - { - if (string.IsNullOrEmpty(cultureCode)) - cultureCode = CultureInfo.CurrentCulture.Name; - - var info = GetLocalizationInfoBasedOnCode(cultureCode) ?? List.First(); - - if (info.Code != List.First().Code) - { - Change(info); - } - else - { - Current = info; - Culture = new CultureInfo(info.Code); - } - } + /// + /// Create an instance and load the language based on the culture code. + /// + /// Culture code (default is "en-US"). See also . + private LocalizationManager(string cultureCode = DefaultCultureCode) + { + if (string.IsNullOrEmpty(cultureCode)) + cultureCode = CultureInfo.CurrentCulture.Name; - /// - /// Method to get the based on the culture code. - /// - /// - /// Return the or if not found. - public static LocalizationInfo GetLocalizationInfoBasedOnCode(string cultureCode) + var info = GetLocalizationInfoBasedOnCode(cultureCode) ?? List.First(); + + if (info.Code != List.First().Code) { - return List.FirstOrDefault(x => x.Code == cultureCode) ?? null; + Change(info); } - - /// - /// Method to change the langauge. - /// - /// - public void Change(LocalizationInfo info) + else { Current = info; - Culture = new CultureInfo(info.Code); } } -} + + /// + /// List with all s. + /// + public static List List => + [ + // Official + new("English", "English", GetImageUri("en-US"), "en-US", true), + new("German (Germany)", "Deutsch", GetImageUri("de-DE"), "de-DE", true), + new("Luxembourgish (Luxembourg)", "Lëtzebuergesch", GetImageUri("lb-LU"), "lb-LU", true), + + + // Community + new("Chinese (China)", "大陆简体", GetImageUri("zh-CN"), "zh-CN"), + new("Chinese (Taiwan)", "台灣正體", GetImageUri("zh-TW"), "zh-TW"), + new("Czech (Czech Republic)", "Čeština", GetImageUri("cs-CZ"), "cs-CZ"), + new("Dutch (Netherlands)", "Nederlands", GetImageUri("nl-NL"), "nl-NL"), + new("French (France)", "Français", GetImageUri("fr-FR"), "fr-FR"), + new("Hungarian (Hungary)", "Magyar", GetImageUri("hu-HU"), "hu-HU"), + new("Italian (Italy)", "Italiano", GetImageUri("it-IT"), "it-IT"), + new("Japanese (Japan)", "日本語", GetImageUri("ja-JP"), "ja-JP"), + new("Korean (Korea)", "한국어", GetImageUri("ko-KR"), "ko-KR"), + new("Polish (Poland)", "Język polski", GetImageUri("pl-PL"), "pl-PL"), + new("Portuguese (Brazil)", "português brasileiro", GetImageUri("pt-BR"), "pt-BR"), + new("Russian (Russia)", "Русский", GetImageUri("ru-RU"), "ru-RU"), + new("Slovenian (Slovenia)", "slovenski jezik", GetImageUri("sl-SI"), "sl-SI"), + new("Spanish (Spain)", "Español", GetImageUri("es-ES"), "es-ES"), + new("Ukrainian (Ukraine)", "Українська", GetImageUri("uk-UA"), "uk-UA"), + ]; + + /// + /// Variable with the currently used . + /// + public LocalizationInfo Current { get; private set; } = new(); + + /// + /// Variable with the currently used . + /// + public CultureInfo Culture { get; private set; } + + /// + /// Returns the current instance of the class. + /// The language can be set on creation (first call), by passing a culture code (like "en-US") as parameter. + /// Use to change it later. + /// + /// Culture code (default is "en-US"). See also . + /// Instance of the class. + public static LocalizationManager GetInstance(string cultureCode = DefaultCultureCode) + { + _instance ??= new LocalizationManager(cultureCode); + + return _instance; + } + + /// + /// Method to build the uri for a flag image based on the culture code. + /// + /// Culture code like "en-US". + /// Uri of the flag image. + private static Uri GetImageUri(string cultureCode) + { + return new Uri($"{BaseFlagImageUri}{cultureCode}.png"); + } + + /// + /// Method to get the based on the culture code. + /// + /// + /// Return the or null if not found. + private static LocalizationInfo GetLocalizationInfoBasedOnCode(string cultureCode) + { + return List.FirstOrDefault(x => x.Code == cultureCode); + } + + /// + /// Method to change the language. + /// + /// + /// + /// + public void Change(LocalizationInfo info) + { + Current = info; + + Culture = new CultureInfo(info.Code); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Localization/NETworkManager.Localization.csproj b/Source/NETworkManager.Localization/NETworkManager.Localization.csproj index eacfaac9a5..d8dbca1399 100644 --- a/Source/NETworkManager.Localization/NETworkManager.Localization.csproj +++ b/Source/NETworkManager.Localization/NETworkManager.Localization.csproj @@ -1,92 +1,92 @@ - - - {FF225C2E-AA67-4B10-939A-6C046CEF8697} - Library - NETworkManager.Localization - NETworkManager.Localization - net6.0-windows10.0.17763.0 - win10-x64 - false - true - false - 1701;1702;CA1712 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + {FF225C2E-AA67-4B10-939A-6C046CEF8697} + Library + NETworkManager.Localization + NETworkManager.Localization + net10.0-windows10.0.22621.0 + false + true + false + false + 1701;1702;CA1712 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + - - - - - + + + + + - - - True - True - StaticStrings.resx - - - True - True - Strings.resx - - + + + True + True + StaticStrings.resx + + + True + True + Strings.resx + + - - - PublicResXFileCodeGenerator - StaticStrings.Designer.cs - - - PublicResXFileCodeGenerator - Strings.Designer.cs - - - - \ No newline at end of file + + + PublicResXFileCodeGenerator + StaticStrings.Designer.cs + + + PublicResXFileCodeGenerator + Strings.Designer.cs + + + diff --git a/Source/NETworkManager.Localization/Properties/AssemblyInfo.cs b/Source/NETworkManager.Localization/Properties/AssemblyInfo.cs index dcc4875070..d8e5619f6e 100644 --- a/Source/NETworkManager.Localization/Properties/AssemblyInfo.cs +++ b/Source/NETworkManager.Localization/Properties/AssemblyInfo.cs @@ -4,7 +4,5 @@ [assembly: AssemblyTitle("NETworkManager.Localization")] [assembly: AssemblyDescription("Library contains NETworkManager documentation.")] [assembly: AssemblyProduct("NETworkManager.Localization")] - [assembly: ComVisible(false)] - [assembly: Guid("ff225c2e-aa67-4b10-939a-6c046cef8697")] \ No newline at end of file diff --git a/Source/NETworkManager.Localization/ResourceIdentifier.cs b/Source/NETworkManager.Localization/ResourceIdentifier.cs new file mode 100644 index 0000000000..a174e82a2d --- /dev/null +++ b/Source/NETworkManager.Localization/ResourceIdentifier.cs @@ -0,0 +1,31 @@ +namespace NETworkManager.Localization; + +public enum ResourceIdentifier +{ + Accent, + ApplicationName, + DiscoveryProtocol, + IPStatus, + PortState, + ProfileName, + ProfileGroup, + PuTTYLogMode, + RemoteDesktopAudioCaptureRedirectionMode, + RemoteDesktopAudioRedirectionMode, + RemoteDesktopGatewayServerLogonMethod, + RemoteDesktopKeyboardHookMode, + RemoteDesktopNetworkConnectionType, + SettingsGroup, + SettingsName, + SNMPErrorCode, + SNMPV3ErrorCode, + TcpState, + Theme, + TimeUnit, + WiFiConnectionStatus, + FirewallProtocol, + FirewallInterfaceType, + FirewallRuleDirection, + FirewallRuleAction, + NeighborState +} \ No newline at end of file diff --git a/Source/NETworkManager.Localization/ResourceTranslator.cs b/Source/NETworkManager.Localization/ResourceTranslator.cs new file mode 100644 index 0000000000..b9a3db8551 --- /dev/null +++ b/Source/NETworkManager.Localization/ResourceTranslator.cs @@ -0,0 +1,39 @@ +using System.Collections.Generic; +using NETworkManager.Localization.Resources; + +namespace NETworkManager.Localization; + +public static class ResourceTranslator +{ + /// + /// Translate the resource name to the localized value. Returns the value if no translation is found. + /// + /// Identifier of the resource to translate. + /// Value of the resource to translate. + /// Localized value of the resource. Returns the value if no translation is found. + public static string Translate(ResourceIdentifier identifier, object value) + { + return Strings.ResourceManager.GetString($"{identifier}_{value}", + LocalizationManager.GetInstance().Culture) ?? value.ToString(); + } + + /// + /// Translate the resource name to the localized value. Returns the value if no translation is found. + /// + /// List of identifiers of the resource to translate. + /// Value of the resource to translate. + /// Localized value of the resource. Returns the value if no translation is found. + public static string Translate(IEnumerable identifiers, object value) + { + foreach (var identifier in identifiers) + { + var foundResource = Strings.ResourceManager.GetString($"{identifier}_{value}", + LocalizationManager.GetInstance().Culture); + + if (foundResource != null) + return foundResource; + } + + return value.ToString(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Localization/Resources/Flags/ja-JP.png b/Source/NETworkManager.Localization/Resources/Flags/ja-JP.png new file mode 100644 index 0000000000..c8018d8c87 Binary files /dev/null and b/Source/NETworkManager.Localization/Resources/Flags/ja-JP.png differ diff --git a/Source/NETworkManager.Localization/Resources/Flags/lb-LU.png b/Source/NETworkManager.Localization/Resources/Flags/lb-LU.png new file mode 100644 index 0000000000..95985dd190 Binary files /dev/null and b/Source/NETworkManager.Localization/Resources/Flags/lb-LU.png differ diff --git a/Source/NETworkManager.Localization/Resources/Flags/uk-UA.png b/Source/NETworkManager.Localization/Resources/Flags/uk-UA.png new file mode 100644 index 0000000000..a92448d055 Binary files /dev/null and b/Source/NETworkManager.Localization/Resources/Flags/uk-UA.png differ diff --git a/Source/NETworkManager.Localization/Resources/StaticStrings.Designer.cs b/Source/NETworkManager.Localization/Resources/StaticStrings.Designer.cs index 31386a0c09..08636974d6 100644 --- a/Source/NETworkManager.Localization/Resources/StaticStrings.Designer.cs +++ b/Source/NETworkManager.Localization/Resources/StaticStrings.Designer.cs @@ -19,7 +19,7 @@ namespace NETworkManager.Localization.Resources { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "18.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class StaticStrings { @@ -60,6 +60,15 @@ internal StaticStrings() { } } + /// + /// Looks up a localized string similar to OU=Computers,DC=borntoberoot,DC=net. + /// + public static string ActiveDirectorySearchBase { + get { + return ResourceManager.GetString("ActiveDirectorySearchBase", resourceCulture); + } + } + /// /// Looks up a localized string similar to CSV. /// @@ -69,6 +78,24 @@ public static string CSV { } } + /// + /// Looks up a localized string similar to 636. + /// + public static string ExampleActiveDirectoryPort { + get { + return ResourceManager.GetString("ExampleActiveDirectoryPort", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to (name=SRV-*). + /// + public static string ExampleActiveDirectorySearchFilter { + get { + return ResourceManager.GetString("ExampleActiveDirectorySearchFilter", resourceCulture); + } + } + /// /// Looks up a localized string similar to 9600. /// @@ -78,6 +105,15 @@ public static string ExampleBaud9600 { } } + /// + /// Looks up a localized string similar to 1024. + /// + public static string ExampleBits { + get { + return ResourceManager.GetString("ExampleBits", resourceCulture); + } + } + /// /// Looks up a localized string similar to Windows-Testuser. /// @@ -97,7 +133,7 @@ public static string ExampleCustomCommandVariableHostname { } /// - /// Looks up a localized string similar to example.com. + /// Looks up a localized string similar to borntoberoot.net. /// public static string ExampleDomain { get { @@ -105,6 +141,51 @@ public static string ExampleDomain { } } + /// + /// Looks up a localized string similar to 10.0.0.0/8; LocalSubnet. + /// + public static string ExampleFirewallAddresses { + get { + return ResourceManager.GetString("ExampleFirewallAddresses", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MyApp - HTTP. + /// + public static string ExampleFirewallRuleName { + get { + return ResourceManager.GetString("ExampleFirewallRuleName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to server-01.borntoberoot.net. + /// + public static string ExampleFqdn { + get { + return ResourceManager.GetString("ExampleFqdn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to borntoberoot.net or 1.1.1.1. + /// + public static string ExampleFqdnOrIPAddressPublic { + get { + return ResourceManager.GetString("ExampleFqdnOrIPAddressPublic", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to gw.borntoberoot.net. + /// + public static string ExampleGatewayDomain { + get { + return ResourceManager.GetString("ExampleGatewayDomain", resourceCulture); + } + } + /// /// Looks up a localized string similar to Servers. /// @@ -123,6 +204,15 @@ public static string ExampleGroupSwitche { } } + /// + /// Looks up a localized string similar to 71:b8:f2:6e..., 13:59:a7.... + /// + public static string ExampleHostkey { + get { + return ResourceManager.GetString("ExampleHostkey", resourceCulture); + } + } + /// /// Looks up a localized string similar to SERVER-01. /// @@ -133,7 +223,7 @@ public static string ExampleHostname { } /// - /// Looks up a localized string similar to 192.168.178.1; example.com. + /// Looks up a localized string similar to SERVER-01; 10.0.0.10. /// public static string ExampleHostnameAndOrIPAddress { get { @@ -142,7 +232,7 @@ public static string ExampleHostnameAndOrIPAddress { } /// - /// Looks up a localized string similar to SERVER-01 or 172.16.0.100. + /// Looks up a localized string similar to SERVER-01 or 10.0.0.10. /// public static string ExampleHostnameOrIPAddress { get { @@ -151,7 +241,7 @@ public static string ExampleHostnameOrIPAddress { } /// - /// Looks up a localized string similar to 192.168.1.0/24; 192.168.178.1 - 192.168.178.128; 192.168.[178-179].[1,100,150-200]; example.com/24. + /// Looks up a localized string similar to 192.168.178.0/24; 10.0.0.0 - 10.0.0.9; 10.0.[0-9,20].[1-2]; server-01.borntoberoot.net/24. /// public static string ExampleHostRange { get { @@ -160,7 +250,16 @@ public static string ExampleHostRange { } /// - /// Looks up a localized string similar to 192.168.178.55. + /// Looks up a localized string similar to server-01.borntoberoot.net:3389. + /// + public static string ExampleHostWithRDPPort { + get { + return ResourceManager.GetString("ExampleHostWithRDPPort", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 10.0.0.10. /// public static string ExampleIPv4Address { get { @@ -169,7 +268,7 @@ public static string ExampleIPv4Address { } /// - /// Looks up a localized string similar to 192.168.178.255. + /// Looks up a localized string similar to 10.0.0.255. /// public static string ExampleIPv4Broadcast { get { @@ -178,7 +277,7 @@ public static string ExampleIPv4Broadcast { } /// - /// Looks up a localized string similar to 8.8.8.8. + /// Looks up a localized string similar to 1.1.1.1. /// public static string ExampleIPv4DNSServer { get { @@ -187,7 +286,7 @@ public static string ExampleIPv4DNSServer { } /// - /// Looks up a localized string similar to 192.168.178.1; 8.8.8.8; 8.8.4.4. + /// Looks up a localized string similar to 10.0.0.1; 1.1.1.1; 8.8.8.8. /// public static string ExampleIPv4DNSServers { get { @@ -196,7 +295,7 @@ public static string ExampleIPv4DNSServers { } /// - /// Looks up a localized string similar to 192.168.178.1. + /// Looks up a localized string similar to 10.0.0.1. /// public static string ExampleIPv4Gateway { get { @@ -205,7 +304,7 @@ public static string ExampleIPv4Gateway { } /// - /// Looks up a localized string similar to 192.168.178.133/255.255.255.0 or 2001:0db8::/64. + /// Looks up a localized string similar to 10.0.0.13/255.255.255.0 or 2001:0db8::/64. /// public static string ExampleIPv4IPv6Subnet { get { @@ -214,7 +313,7 @@ public static string ExampleIPv4IPv6Subnet { } /// - /// Looks up a localized string similar to 192.168.178.134/255.255.255.0 or 2001:0db9::/64. + /// Looks up a localized string similar to 10.0.0.14/255.255.255.0 or 2001:0db9::/64. /// public static string ExampleIPv4IPv6Subnet2 { get { @@ -222,15 +321,6 @@ public static string ExampleIPv4IPv6Subnet2 { } } - /// - /// Looks up a localized string similar to 192.168.180.0/24 or 2001:0db9::/54. - /// - public static string ExampleIPv4IPv6Subnet3 { - get { - return ResourceManager.GetString("ExampleIPv4IPv6Subnet3", resourceCulture); - } - } - /// /// Looks up a localized string similar to 192.168.178.0/24 or 192.168.178.0/255.255.255.0. /// @@ -277,7 +367,7 @@ public static string ExampleIPv4SubnetmaskIPv6CIDR { } /// - /// Looks up a localized string similar to 192.168.100.0/24. + /// Looks up a localized string similar to 10.0.0.0/24. /// public static string ExampleIPv4SubnetWithCIDR { get { @@ -312,6 +402,15 @@ public static string ExampleMACAddressesOrVendor { } } + /// + /// Looks up a localized string similar to S3cr3t_P4ssw0rd%. + /// + public static string ExamplePassword { + get { + return ResourceManager.GetString("ExamplePassword", resourceCulture); + } + } + /// /// Looks up a localized string similar to 161. /// @@ -385,7 +484,7 @@ public static string ExamplePort7 { } /// - /// Looks up a localized string similar to 22; 80; https; ldaps; 777 - 999; 8080. + /// Looks up a localized string similar to 22/tcp; 80; 161-162/udp; 1-1024; https; ldaps; Domain Name Server. /// public static string ExamplePortPortRangeOrService { get { @@ -411,6 +510,24 @@ public static string ExamplePortScanRange { } } + /// + /// Looks up a localized string similar to C:\Program Files\PowerShell\7\pwsh.exe. + /// + public static string ExamplePowerShellPath { + get { + return ResourceManager.GetString("ExamplePowerShellPath", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Webserver. + /// + public static string ExampleProfileName { + get { + return ResourceManager.GetString("ExampleProfileName", resourceCulture); + } + } + /// /// Looks up a localized string similar to https://api.ipify.org. /// @@ -430,11 +547,20 @@ public static string ExamplePublicIPv6AddressAPI { } /// - /// Looks up a localized string similar to Webserver. + /// Looks up a localized string similar to C:\Program Files\PuTTY\putty.exe. + /// + public static string ExamplePuTTYPath { + get { + return ResourceManager.GetString("ExamplePuTTYPath", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to NETworkManager. /// - public static string ExampleRemoteDesktopProfileName { + public static string ExamplePuTTYProfile { get { - return ResourceManager.GetString("ExampleRemoteDesktopProfileName", resourceCulture); + return ResourceManager.GetString("ExamplePuTTYProfile", resourceCulture); } } @@ -447,6 +573,15 @@ public static string ExampleSerialLine { } } + /// + /// Looks up a localized string similar to 4uth_S3cr3t!. + /// + public static string ExampleSNMPAuthSecret { + get { + return ResourceManager.GetString("ExampleSNMPAuthSecret", resourceCulture); + } + } + /// /// Looks up a localized string similar to public. /// @@ -456,12 +591,39 @@ public static string ExampleSNMPCommunity { } } + /// + /// Looks up a localized string similar to system. + /// + public static string ExampleSNMPMIB { + get { + return ResourceManager.GetString("ExampleSNMPMIB", resourceCulture); + } + } + /// /// Looks up a localized string similar to 1.3.6.1.2.1.1. /// - public static string ExampleSNMPOID { + public static string ExampleSnmpOid { + get { + return ResourceManager.GetString("ExampleSnmpOid", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 1.3.6.1.2.1.1; 1.3.6.1.2.1.2. + /// + public static string ExampleSnmpOids { get { - return ResourceManager.GetString("ExampleSNMPOID", resourceCulture); + return ResourceManager.GetString("ExampleSnmpOids", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pr1v_S3cr3t%. + /// + public static string ExampleSNMPPrivSecret { + get { + return ResourceManager.GetString("ExampleSNMPPrivSecret", resourceCulture); } } @@ -474,6 +636,15 @@ public static string ExampleSNMPUsername { } } + /// + /// Looks up a localized string similar to IoT-Devices. + /// + public static string ExampleSsid { + get { + return ResourceManager.GetString("ExampleSsid", resourceCulture); + } + } + /// /// Looks up a localized string similar to example.com. /// @@ -492,6 +663,15 @@ public static string ExampleTags { } } + /// + /// Looks up a localized string similar to C:\Tools\TigerVNC\vncviewer64-1.12.0.exe. + /// + public static string ExampleTigerVNCPath { + get { + return ResourceManager.GetString("ExampleTigerVNCPath", resourceCulture); + } + } + /// /// Looks up a localized string similar to Admin. /// @@ -511,7 +691,7 @@ public static string ExampleWebserverPorts { } /// - /// Looks up a localized string similar to http(s)://example.com/index.html. + /// Looks up a localized string similar to http(s)://borntoberoot.net/index.html. /// public static string ExampleWebsiteUri { get { @@ -572,7 +752,16 @@ public static string PrivateKeyFileLocationDots { return ResourceManager.GetString("PrivateKeyFileLocationDots", resourceCulture); } } - + + /// + /// Looks up a localized string similar to C:\Data\profiles.csv. + /// + public static string CsvImportFileLocationDots { + get { + return ResourceManager.GetString("CsvImportFileLocationDots", resourceCulture); + } + } + /// /// Looks up a localized string similar to NETworkManager. /// diff --git a/Source/NETworkManager.Localization/Resources/StaticStrings.resx b/Source/NETworkManager.Localization/Resources/StaticStrings.resx index 3b20e07bd1..897bf115a8 100644 --- a/Source/NETworkManager.Localization/Resources/StaticStrings.resx +++ b/Source/NETworkManager.Localization/Resources/StaticStrings.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 CSV @@ -127,7 +127,7 @@ Windows-Testuser - example.com + borntoberoot.net Servers @@ -139,37 +139,34 @@ SERVER-01 - 192.168.178.1; example.com + SERVER-01; 10.0.0.10 - SERVER-01 or 172.16.0.100 + SERVER-01 or 10.0.0.10 - 192.168.1.0/24; 192.168.178.1 - 192.168.178.128; 192.168.[178-179].[1,100,150-200]; example.com/24 + 192.168.178.0/24; 10.0.0.0 - 10.0.0.9; 10.0.[0-9,20].[1-2]; server-01.borntoberoot.net/24 - 192.168.178.55 + 10.0.0.10 - 192.168.178.255 + 10.0.0.255 - 8.8.8.8 + 1.1.1.1 - 192.168.178.1; 8.8.8.8; 8.8.4.4 + 10.0.0.1; 1.1.1.1; 8.8.8.8 - 192.168.178.1 + 10.0.0.1 - 192.168.178.133/255.255.255.0 or 2001:0db8::/64 + 10.0.0.13/255.255.255.0 or 2001:0db8::/64 - 192.168.178.134/255.255.255.0 or 2001:0db9::/64 - - - 192.168.180.0/24 or 2001:0db9::/54 + 10.0.0.14/255.255.255.0 or 2001:0db9::/64 192.168.178.0/24 or 192.168.178.0/255.255.255.0 @@ -187,7 +184,7 @@ 255.255.255.0 or /64 - 192.168.100.0/24 + 10.0.0.0/24 00:F1:21:AB:0B:35 @@ -220,12 +217,12 @@ 7 - 22; 80; https; ldaps; 777 - 999; 8080 + 22/tcp; 80; 161-162/udp; 1-1024; https; ldaps; Domain Name Server 22; 80; 443; 500 - 999; 8080 - + Webserver @@ -234,7 +231,7 @@ public - + 1.3.6.1.2.1.1 @@ -253,7 +250,7 @@ 80; 443; 8080; 8443 - http(s)://example.com/index.html + http(s)://borntoberoot.net/index.html GitHub @@ -280,7 +277,7 @@ iexplore.exe - https://$$HOSTNAME$$/ + https://{{Hostname}}/ Internet Explorer @@ -288,6 +285,9 @@ C:\Data\Keys\private_ssh.ppk + + C:\Data\profiles.csv + 22; 80; 443 @@ -297,4 +297,67 @@ https://api6.ipify.org + + 1024 + + + C:\Program Files\PowerShell\7\pwsh.exe + + + C:\Program Files\PuTTY\putty.exe + + + C:\Tools\TigerVNC\vncviewer64-1.12.0.exe + + + 71:b8:f2:6e..., 13:59:a7... + + + NETworkManager + + + server-01.borntoberoot.net + + + gw.borntoberoot.net + + + server-01.borntoberoot.net:3389 + + + IoT-Devices + + + system + + + 1.3.6.1.2.1.1; 1.3.6.1.2.1.2 + + + S3cr3t_P4ssw0rd% + + + 4uth_S3cr3t! + + + Pr1v_S3cr3t% + + + borntoberoot.net or 1.1.1.1 + + + MyApp - HTTP + + + 10.0.0.0/8; LocalSubnet + + + OU=Computers,DC=borntoberoot,DC=net + + + 636 + + + (name=SRV-*) + \ No newline at end of file diff --git a/Source/NETworkManager.Localization/Resources/Strings.Designer.cs b/Source/NETworkManager.Localization/Resources/Strings.Designer.cs index a70229ec20..d0d46edfd2 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.Designer.cs +++ b/Source/NETworkManager.Localization/Resources/Strings.Designer.cs @@ -1,10 +1,9 @@ -//------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ // -// Dieser Code wurde von einem Tool generiert. -// Laufzeitversion:4.0.30319.42000 +// This code was generated by a tool. // -// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn -// der Code erneut generiert wird. +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. // //------------------------------------------------------------------------------ @@ -13,13 +12,13 @@ namespace NETworkManager.Localization.Resources { /// - /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. + /// A strongly-typed resource class, for looking up localized strings, etc. /// - // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert - // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. - // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen - // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "18.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class Strings { @@ -33,7 +32,7 @@ internal Strings() { } /// - /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. + /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { @@ -47,8 +46,8 @@ internal Strings() { } /// - /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle - /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { @@ -61,7 +60,7 @@ internal Strings() { } /// - /// Sucht eine lokalisierte Zeichenfolge, die About ähnelt. + /// Looks up a localized string similar to About. /// public static string About { get { @@ -70,7 +69,7 @@ public static string About { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Steel ähnelt. + /// Looks up a localized string similar to Steel. /// public static string Accen_Steel { get { @@ -79,7 +78,7 @@ public static string Accen_Steel { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Accent ähnelt. + /// Looks up a localized string similar to Accent. /// public static string Accent { get { @@ -88,7 +87,7 @@ public static string Accent { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Amber ähnelt. + /// Looks up a localized string similar to Amber. /// public static string Accent_Amber { get { @@ -97,7 +96,7 @@ public static string Accent_Amber { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Black ähnelt. + /// Looks up a localized string similar to Black. /// public static string Accent_Black { get { @@ -106,7 +105,7 @@ public static string Accent_Black { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Blue ähnelt. + /// Looks up a localized string similar to Blue. /// public static string Accent_Blue { get { @@ -115,7 +114,7 @@ public static string Accent_Blue { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Brown ähnelt. + /// Looks up a localized string similar to Brown. /// public static string Accent_Brown { get { @@ -124,7 +123,7 @@ public static string Accent_Brown { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Cobalt ähnelt. + /// Looks up a localized string similar to Cobalt. /// public static string Accent_Cobalt { get { @@ -133,7 +132,7 @@ public static string Accent_Cobalt { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Crimson ähnelt. + /// Looks up a localized string similar to Crimson. /// public static string Accent_Crimson { get { @@ -142,7 +141,7 @@ public static string Accent_Crimson { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Cyan ähnelt. + /// Looks up a localized string similar to Cyan. /// public static string Accent_Cyan { get { @@ -151,7 +150,7 @@ public static string Accent_Cyan { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Emerald ähnelt. + /// Looks up a localized string similar to Emerald. /// public static string Accent_Emerald { get { @@ -160,7 +159,7 @@ public static string Accent_Emerald { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Green ähnelt. + /// Looks up a localized string similar to Green. /// public static string Accent_Green { get { @@ -169,7 +168,7 @@ public static string Accent_Green { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Indigo ähnelt. + /// Looks up a localized string similar to Indigo. /// public static string Accent_Indigo { get { @@ -178,7 +177,7 @@ public static string Accent_Indigo { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Lime ähnelt. + /// Looks up a localized string similar to Lime. /// public static string Accent_Lime { get { @@ -187,7 +186,7 @@ public static string Accent_Lime { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Magenta ähnelt. + /// Looks up a localized string similar to Magenta. /// public static string Accent_Magenta { get { @@ -196,7 +195,7 @@ public static string Accent_Magenta { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Mauve ähnelt. + /// Looks up a localized string similar to Mauve. /// public static string Accent_Mauve { get { @@ -205,7 +204,7 @@ public static string Accent_Mauve { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Olive ähnelt. + /// Looks up a localized string similar to Olive. /// public static string Accent_Olive { get { @@ -214,7 +213,7 @@ public static string Accent_Olive { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Orange ähnelt. + /// Looks up a localized string similar to Orange. /// public static string Accent_Orange { get { @@ -223,7 +222,7 @@ public static string Accent_Orange { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Purple ähnelt. + /// Looks up a localized string similar to Purple. /// public static string Accent_Purple { get { @@ -232,7 +231,7 @@ public static string Accent_Purple { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Red ähnelt. + /// Looks up a localized string similar to Red. /// public static string Accent_Red { get { @@ -241,7 +240,7 @@ public static string Accent_Red { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Sienna ähnelt. + /// Looks up a localized string similar to Sienna. /// public static string Accent_Sienna { get { @@ -250,7 +249,16 @@ public static string Accent_Sienna { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Taupe ähnelt. + /// Looks up a localized string similar to Steel. + /// + public static string Accent_Steel { + get { + return ResourceManager.GetString("Accent_Steel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Taupe. /// public static string Accent_Taupe { get { @@ -259,7 +267,7 @@ public static string Accent_Taupe { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Teal ähnelt. + /// Looks up a localized string similar to Teal. /// public static string Accent_Teal { get { @@ -268,7 +276,7 @@ public static string Accent_Teal { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Pink ähnelt. + /// Looks up a localized string similar to Pink. /// public static string Accent_Violet { get { @@ -277,7 +285,7 @@ public static string Accent_Violet { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Yellow ähnelt. + /// Looks up a localized string similar to Yellow. /// public static string Accent_Yellow { get { @@ -286,7 +294,106 @@ public static string Accent_Yellow { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add ähnelt. + /// Looks up a localized string similar to Action. + /// + public static string Action { + get { + return ResourceManager.GetString("Action", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Imported from Active Directory on {0}. + /// + public static string ActiveDirectory_ImportDescription { + get { + return ResourceManager.GetString("ActiveDirectory_ImportDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Additional LDAP filter. + /// + public static string ActiveDirectoryAdditionalLdapFilter { + get { + return ResourceManager.GetString("ActiveDirectoryAdditionalLdapFilter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Filter must be a valid LDAP expression starting with '(' and ending with ')'.. + /// + public static string ActiveDirectoryAdditionalLdapFilterInvalid { + get { + return ResourceManager.GetString("ActiveDirectoryAdditionalLdapFilterInvalid", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Active Directory import failed.. + /// + public static string ActiveDirectoryImportFailed { + get { + return ResourceManager.GetString("ActiveDirectoryImportFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Options. + /// + public static string ActiveDirectoryImportOptions { + get { + return ResourceManager.GetString("ActiveDirectoryImportOptions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Uses your current Windows credentials to read from Active Directory. The account must be allowed to enumerate computer objects under the search base (subtree).. + /// + public static string ActiveDirectoryImportUsesCurrentCredentials { + get { + return ResourceManager.GetString("ActiveDirectoryImportUsesCurrentCredentials", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No computers found for the given search base and filter.. + /// + public static string ActiveDirectoryNoComputersFound { + get { + return ResourceManager.GetString("ActiveDirectoryNoComputersFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to If your computer is not joined to the domain, specify the domain controller (hostname or IP) and use custom credentials.. + /// + public static string ActiveDirectoryNonDomainHint { + get { + return ResourceManager.GetString("ActiveDirectoryNonDomainHint", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Search base (DN). + /// + public static string ActiveDirectorySearchBase { + get { + return ResourceManager.GetString("ActiveDirectorySearchBase", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Search base must be a valid LDAP distinguished name (e.g. DC=example,DC=com).. + /// + public static string ActiveDirectorySearchBaseInvalid { + get { + return ResourceManager.GetString("ActiveDirectorySearchBaseInvalid", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add. /// public static string Add { get { @@ -295,7 +402,7 @@ public static string Add { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add a host to monitor ähnelt. + /// Looks up a localized string similar to Add a host to monitor. /// public static string AddAHostToMonitor { get { @@ -304,7 +411,7 @@ public static string AddAHostToMonitor { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add a tab to perform a DNS lookup... ähnelt. + /// Looks up a localized string similar to Add a tab to perform a DNS lookup.... /// public static string AddATabToPerformADNSLookup { get { @@ -313,7 +420,7 @@ public static string AddATabToPerformADNSLookup { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add a tab to perform a network scan... ähnelt. + /// Looks up a localized string similar to Add a tab to perform a network scan.... /// public static string AddATabToPerformANetworkScan { get { @@ -322,7 +429,7 @@ public static string AddATabToPerformANetworkScan { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add a tab to perform an SNMP action... ähnelt. + /// Looks up a localized string similar to Add a tab to perform an SNMP action.... /// public static string AddATabToPerformAnSNMPAction { get { @@ -331,7 +438,7 @@ public static string AddATabToPerformAnSNMPAction { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add a tab to perform a ping... ähnelt. + /// Looks up a localized string similar to Add a tab to perform a ping.... /// public static string AddATabToPerformAPing { get { @@ -340,7 +447,7 @@ public static string AddATabToPerformAPing { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add a tab to perform a port scan... ähnelt. + /// Looks up a localized string similar to Add a tab to perform a port scan.... /// public static string AddATabToPerformAPortScan { get { @@ -349,7 +456,16 @@ public static string AddATabToPerformAPortScan { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add a tab to perform a trace... ähnelt. + /// Looks up a localized string similar to Add a tab to perform a SNTP lookup.... + /// + public static string AddATabToPerformASNTPLookup { + get { + return ResourceManager.GetString("AddATabToPerformASNTPLookup", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add a tab to perform a trace.... /// public static string AddATabToPerformATrace { get { @@ -358,16 +474,16 @@ public static string AddATabToPerformATrace { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add a tab to query the HTTP headers... ähnelt. + /// Looks up a localized string similar to Add a tab to query the IP geolocation.... /// - public static string AddATabToQueryTheHTTPHeaders { + public static string AddATabToQueryTheIPGeolocation { get { - return ResourceManager.GetString("AddATabToQueryTheHTTPHeaders", resourceCulture); + return ResourceManager.GetString("AddATabToQueryTheIPGeolocation", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add a tab to query whois... ähnelt. + /// Looks up a localized string similar to Add a tab to query whois.... /// public static string AddATabToQueryWhois { get { @@ -376,7 +492,7 @@ public static string AddATabToQueryWhois { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add credentials ähnelt. + /// Looks up a localized string similar to Add credentials. /// public static string AddCredentials { get { @@ -385,7 +501,7 @@ public static string AddCredentials { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add custom command ähnelt. + /// Looks up a localized string similar to Add custom command. /// public static string AddCustomCommand { get { @@ -394,7 +510,7 @@ public static string AddCustomCommand { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add DNS server ähnelt. + /// Looks up a localized string similar to Add DNS server. /// public static string AddDNSServer { get { @@ -403,7 +519,7 @@ public static string AddDNSServer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add DNS suffix (primary) to hostname ähnelt. + /// Looks up a localized string similar to Add DNS suffix (primary) to hostname. /// public static string AddDNSSuffixToHostname { get { @@ -412,7 +528,7 @@ public static string AddDNSSuffixToHostname { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add... ähnelt. + /// Looks up a localized string similar to Add.... /// public static string AddDots { get { @@ -421,7 +537,7 @@ public static string AddDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add entry ähnelt. + /// Looks up a localized string similar to Add entry. /// public static string AddEntry { get { @@ -430,7 +546,7 @@ public static string AddEntry { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add entry... ähnelt. + /// Looks up a localized string similar to Add entry.... /// public static string AddEntryDots { get { @@ -439,7 +555,7 @@ public static string AddEntryDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add group ähnelt. + /// Looks up a localized string similar to Add group. /// public static string AddGroup { get { @@ -448,7 +564,16 @@ public static string AddGroup { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add host ähnelt. + /// Looks up a localized string similar to Add group.... + /// + public static string AddGroupDots { + get { + return ResourceManager.GetString("AddGroupDots", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add host. /// public static string AddHost { get { @@ -457,7 +582,7 @@ public static string AddHost { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add IPv4 address ähnelt. + /// Looks up a localized string similar to Add IPv4 address. /// public static string AddIPv4Address { get { @@ -466,7 +591,7 @@ public static string AddIPv4Address { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add IPv4 address... ähnelt. + /// Looks up a localized string similar to Add IPv4 address.... /// public static string AddIPv4AddressDots { get { @@ -475,7 +600,7 @@ public static string AddIPv4AddressDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Additional command line ähnelt. + /// Looks up a localized string similar to Additional command line. /// public static string AdditionalCommandLine { get { @@ -484,7 +609,7 @@ public static string AdditionalCommandLine { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Additional config... ähnelt. + /// Looks up a localized string similar to Additional config.... /// public static string AdditionalConfigDots { get { @@ -493,7 +618,7 @@ public static string AdditionalConfigDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Additionals ähnelt. + /// Looks up a localized string similar to Additionals. /// public static string Additionals { get { @@ -502,7 +627,16 @@ public static string Additionals { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add port profile ähnelt. + /// Looks up a localized string similar to Add OID profile. + /// + public static string AddOIDProfile { + get { + return ResourceManager.GetString("AddOIDProfile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add port profile. /// public static string AddPortProfile { get { @@ -511,7 +645,7 @@ public static string AddPortProfile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add profile ähnelt. + /// Looks up a localized string similar to Add profile. /// public static string AddProfile { get { @@ -520,7 +654,7 @@ public static string AddProfile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add profile... ähnelt. + /// Looks up a localized string similar to Add profile.... /// public static string AddProfileDots { get { @@ -529,7 +663,7 @@ public static string AddProfileDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add profile file ähnelt. + /// Looks up a localized string similar to Add profile file. /// public static string AddProfileFile { get { @@ -538,7 +672,52 @@ public static string AddProfileFile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add tab... ähnelt. + /// Looks up a localized string similar to Add rule. + /// + public static string AddRule { + get { + return ResourceManager.GetString("AddRule", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add rule.... + /// + public static string AddRuleDots { + get { + return ResourceManager.GetString("AddRuleDots", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add server. + /// + public static string AddServer { + get { + return ResourceManager.GetString("AddServer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add SNTP server. + /// + public static string AddSNTPServer { + get { + return ResourceManager.GetString("AddSNTPServer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add tab. + /// + public static string AddTab { + get { + return ResourceManager.GetString("AddTab", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add tab.... /// public static string AddTabDots { get { @@ -547,7 +726,16 @@ public static string AddTabDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Adjust screen ähnelt. + /// Looks up a localized string similar to Add tag. + /// + public static string AddTag { + get { + return ResourceManager.GetString("AddTag", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Adjust screen. /// public static string AdjustScreen { get { @@ -556,7 +744,7 @@ public static string AdjustScreen { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Adjust screen automatically ähnelt. + /// Looks up a localized string similar to Adjust screen automatically. /// public static string AdjustScreenAutomatically { get { @@ -565,7 +753,16 @@ public static string AdjustScreenAutomatically { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Administrator ähnelt. + /// Looks up a localized string similar to Admin (console) session. + /// + public static string AdminConsoleSession { + get { + return ResourceManager.GetString("AdminConsoleSession", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Administrator. /// public static string Administrator { get { @@ -574,7 +771,16 @@ public static string Administrator { } /// - /// Sucht eine lokalisierte Zeichenfolge, die All ähnelt. + /// Looks up a localized string similar to Advanced. + /// + public static string Advanced { + get { + return ResourceManager.GetString("Advanced", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All. /// public static string All { get { @@ -583,7 +789,16 @@ public static string All { } /// - /// Sucht eine lokalisierte Zeichenfolge, die All settings can be changed later in the settings ähnelt. + /// Looks up a localized string similar to Allow. + /// + public static string Allow { + get { + return ResourceManager.GetString("Allow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All settings can be changed later in the settings!. /// public static string AllSettingsCanBeChangedLaterInTheSettings { get { @@ -592,7 +807,7 @@ public static string AllSettingsCanBeChangedLaterInTheSettings { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Always show icon in tray ähnelt. + /// Looks up a localized string similar to Always show icon in tray. /// public static string AlwaysShowIconInTray { get { @@ -601,7 +816,7 @@ public static string AlwaysShowIconInTray { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Amber ähnelt. + /// Looks up a localized string similar to Amber. /// public static string Amber { get { @@ -610,7 +825,7 @@ public static string Amber { } /// - /// Sucht eine lokalisierte Zeichenfolge, die An error occurred while exporting the data. See error message for details: ähnelt. + /// Looks up a localized string similar to An error occurred while exporting the data. See error message for details:. /// public static string AnErrorOccurredWhileExportingTheData { get { @@ -619,7 +834,7 @@ public static string AnErrorOccurredWhileExportingTheData { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Answers ähnelt. + /// Looks up a localized string similar to Answers. /// public static string Answers { get { @@ -628,7 +843,16 @@ public static string Answers { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Appearance ähnelt. + /// Looks up a localized string similar to Any. + /// + public static string Any { + get { + return ResourceManager.GetString("Any", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Appearance. /// public static string Appearance { get { @@ -637,16 +861,16 @@ public static string Appearance { } /// - /// Sucht eine lokalisierte Zeichenfolge, die ARP Table ähnelt. + /// Looks up a localized string similar to Bit Calculator. /// - public static string ApplicationName_ARPTable { + public static string ApplicationName_BitCalculator { get { - return ResourceManager.GetString("ApplicationName_ARPTable", resourceCulture); + return ResourceManager.GetString("ApplicationName_BitCalculator", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Connections ähnelt. + /// Looks up a localized string similar to Connections. /// public static string ApplicationName_Connections { get { @@ -655,7 +879,7 @@ public static string ApplicationName_Connections { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Dashboard ähnelt. + /// Looks up a localized string similar to Dashboard. /// public static string ApplicationName_Dashboard { get { @@ -664,7 +888,7 @@ public static string ApplicationName_Dashboard { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Discovery Protocol ähnelt. + /// Looks up a localized string similar to Discovery Protocol. /// public static string ApplicationName_DiscoveryProtocol { get { @@ -673,7 +897,7 @@ public static string ApplicationName_DiscoveryProtocol { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DNS Lookup ähnelt. + /// Looks up a localized string similar to DNS Lookup. /// public static string ApplicationName_DNSLookup { get { @@ -682,7 +906,16 @@ public static string ApplicationName_DNSLookup { } /// - /// Sucht eine lokalisierte Zeichenfolge, die HTTP Headers ähnelt. + /// Looks up a localized string similar to Hosts File Editor. + /// + public static string ApplicationName_HostsFileEditor { + get { + return ResourceManager.GetString("ApplicationName_HostsFileEditor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to HTTP Headers. /// public static string ApplicationName_HTTPHeaders { get { @@ -691,7 +924,16 @@ public static string ApplicationName_HTTPHeaders { } /// - /// Sucht eine lokalisierte Zeichenfolge, die IP Scanner ähnelt. + /// Looks up a localized string similar to IP Geolocation. + /// + public static string ApplicationName_IPGeolocation { + get { + return ResourceManager.GetString("ApplicationName_IPGeolocation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IP Scanner. /// public static string ApplicationName_IPScanner { get { @@ -700,7 +942,7 @@ public static string ApplicationName_IPScanner { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Listeners ähnelt. + /// Looks up a localized string similar to Listeners. /// public static string ApplicationName_Listeners { get { @@ -709,7 +951,7 @@ public static string ApplicationName_Listeners { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Lookup ähnelt. + /// Looks up a localized string similar to Lookup. /// public static string ApplicationName_Lookup { get { @@ -718,7 +960,16 @@ public static string ApplicationName_Lookup { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Network Interface ähnelt. + /// Looks up a localized string similar to Neighbor Table. + /// + public static string ApplicationName_NeighborTable { + get { + return ResourceManager.GetString("ApplicationName_NeighborTable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Network Interface. /// public static string ApplicationName_NetworkInterface { get { @@ -727,7 +978,7 @@ public static string ApplicationName_NetworkInterface { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Ping ähnelt. + /// Looks up a localized string similar to Ping. /// public static string ApplicationName_Ping { get { @@ -736,7 +987,7 @@ public static string ApplicationName_Ping { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Ping Monitor ähnelt. + /// Looks up a localized string similar to Ping Monitor. /// public static string ApplicationName_PingMonitor { get { @@ -745,7 +996,7 @@ public static string ApplicationName_PingMonitor { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Port Scanner ähnelt. + /// Looks up a localized string similar to Port Scanner. /// public static string ApplicationName_PortScanner { get { @@ -754,7 +1005,7 @@ public static string ApplicationName_PortScanner { } /// - /// Sucht eine lokalisierte Zeichenfolge, die PowerShell ähnelt. + /// Looks up a localized string similar to PowerShell. /// public static string ApplicationName_PowerShell { get { @@ -763,7 +1014,7 @@ public static string ApplicationName_PowerShell { } /// - /// Sucht eine lokalisierte Zeichenfolge, die PuTTY ähnelt. + /// Looks up a localized string similar to PuTTY. /// public static string ApplicationName_PuTTY { get { @@ -772,7 +1023,7 @@ public static string ApplicationName_PuTTY { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remote Desktop ähnelt. + /// Looks up a localized string similar to Remote Desktop. /// public static string ApplicationName_RemoteDesktop { get { @@ -781,7 +1032,7 @@ public static string ApplicationName_RemoteDesktop { } /// - /// Sucht eine lokalisierte Zeichenfolge, die SNMP ähnelt. + /// Looks up a localized string similar to SNMP. /// public static string ApplicationName_SNMP { get { @@ -790,7 +1041,16 @@ public static string ApplicationName_SNMP { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Subnet Calculator ähnelt. + /// Looks up a localized string similar to SNTP Lookup. + /// + public static string ApplicationName_SNTPLookup { + get { + return ResourceManager.GetString("ApplicationName_SNTPLookup", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Subnet Calculator. /// public static string ApplicationName_SubnetCalculator { get { @@ -799,7 +1059,7 @@ public static string ApplicationName_SubnetCalculator { } /// - /// Sucht eine lokalisierte Zeichenfolge, die TigerVNC ähnelt. + /// Looks up a localized string similar to TigerVNC. /// public static string ApplicationName_TigerVNC { get { @@ -808,7 +1068,7 @@ public static string ApplicationName_TigerVNC { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Traceroute ähnelt. + /// Looks up a localized string similar to Traceroute. /// public static string ApplicationName_Traceroute { get { @@ -817,7 +1077,7 @@ public static string ApplicationName_Traceroute { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Wake on LAN ähnelt. + /// Looks up a localized string similar to Wake on LAN. /// public static string ApplicationName_WakeOnLAN { get { @@ -826,7 +1086,7 @@ public static string ApplicationName_WakeOnLAN { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Web Console ähnelt. + /// Looks up a localized string similar to Web Console. /// public static string ApplicationName_WebConsole { get { @@ -835,7 +1095,7 @@ public static string ApplicationName_WebConsole { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Whois ähnelt. + /// Looks up a localized string similar to Whois. /// public static string ApplicationName_Whois { get { @@ -844,7 +1104,7 @@ public static string ApplicationName_Whois { } /// - /// Sucht eine lokalisierte Zeichenfolge, die WiFi ähnelt. + /// Looks up a localized string similar to WiFi. /// public static string ApplicationName_WiFi { get { @@ -853,7 +1113,7 @@ public static string ApplicationName_WiFi { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Applications ähnelt. + /// Looks up a localized string similar to Applications. /// public static string Applications { get { @@ -862,7 +1122,7 @@ public static string Applications { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The application will be restarted afterwards! ähnelt. + /// Looks up a localized string similar to The application will be restarted afterwards!. /// public static string ApplicationWillBeRestartedAfterwards { get { @@ -871,7 +1131,7 @@ public static string ApplicationWillBeRestartedAfterwards { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Apply ähnelt. + /// Looks up a localized string similar to Apply. /// public static string Apply { get { @@ -880,7 +1140,25 @@ public static string Apply { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Apply Windows key combinations ähnelt. + /// Looks up a localized string similar to Apply filter. + /// + public static string ApplyFilter { + get { + return ResourceManager.GetString("ApplyFilter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Apply theme to PowerShell console. + /// + public static string ApplyThemeToPowerShellConsole { + get { + return ResourceManager.GetString("ApplyThemeToPowerShellConsole", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Apply Windows key combinations. /// public static string ApplyWindowsKeyCombinations { get { @@ -889,7 +1167,7 @@ public static string ApplyWindowsKeyCombinations { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Apply Windows key combinations (e.g. ALT+TAB): ähnelt. + /// Looks up a localized string similar to Apply Windows key combinations (e.g., ALT+TAB):. /// public static string ApplyWindowsKeyCombinationsLikeAltTab { get { @@ -898,7 +1176,7 @@ public static string ApplyWindowsKeyCombinationsLikeAltTab { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Are you sure? ähnelt. + /// Looks up a localized string similar to Are you sure?. /// public static string AreYouSure { get { @@ -907,7 +1185,7 @@ public static string AreYouSure { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Arguments ähnelt. + /// Looks up a localized string similar to Arguments. /// public static string Arguments { get { @@ -916,7 +1194,7 @@ public static string Arguments { } /// - /// Sucht eine lokalisierte Zeichenfolge, die ARP ähnelt. + /// Looks up a localized string similar to ARP. /// public static string ARP { get { @@ -925,16 +1203,25 @@ public static string ARP { } /// - /// Sucht eine lokalisierte Zeichenfolge, die ARP Table ähnelt. + /// Looks up a localized string similar to ASN. + /// + public static string ASN { + get { + return ResourceManager.GetString("ASN", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to AS Name. /// - public static string ARPTable { + public static string ASName { get { - return ResourceManager.GetString("ARPTable", resourceCulture); + return ResourceManager.GetString("ASName", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die At least one application must be visible! ähnelt. + /// Looks up a localized string similar to At least one application must be visible!. /// public static string AtLeastOneApplicationMustBeVisible { get { @@ -943,7 +1230,7 @@ public static string AtLeastOneApplicationMustBeVisible { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Attempts ähnelt. + /// Looks up a localized string similar to Attempts. /// public static string Attempts { get { @@ -952,7 +1239,7 @@ public static string Attempts { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Auth ähnelt. + /// Looks up a localized string similar to Auth. /// public static string Auth { get { @@ -961,7 +1248,7 @@ public static string Auth { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Authentication ähnelt. + /// Looks up a localized string similar to Authentication. /// public static string Authentication { get { @@ -970,7 +1257,7 @@ public static string Authentication { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Authentication level ähnelt. + /// Looks up a localized string similar to Authentication level. /// public static string AuthenticationLevel { get { @@ -979,7 +1266,7 @@ public static string AuthenticationLevel { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Authorities ähnelt. + /// Looks up a localized string similar to Authorities. /// public static string Authorities { get { @@ -988,7 +1275,7 @@ public static string Authorities { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Automatically update every ähnelt. + /// Looks up a localized string similar to Automatically update every. /// public static string AutomaticallyUpdateEvery { get { @@ -997,7 +1284,7 @@ public static string AutomaticallyUpdateEvery { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Autostart ähnelt. + /// Looks up a localized string similar to Autostart. /// public static string Autostart { get { @@ -1006,7 +1293,7 @@ public static string Autostart { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Average time ähnelt. + /// Looks up a localized string similar to Average time. /// public static string AverageTime { get { @@ -1015,7 +1302,7 @@ public static string AverageTime { } /// - /// Sucht eine lokalisierte Zeichenfolge, die back ähnelt. + /// Looks up a localized string similar to back. /// public static string Back { get { @@ -1024,7 +1311,7 @@ public static string Back { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Background job ähnelt. + /// Looks up a localized string similar to Background job. /// public static string BackgroundJob { get { @@ -1033,7 +1320,7 @@ public static string BackgroundJob { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Backup ähnelt. + /// Looks up a localized string similar to Backup. /// public static string Backup { get { @@ -1042,7 +1329,7 @@ public static string Backup { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Bandwidth ähnelt. + /// Looks up a localized string similar to Bandwidth. /// public static string Bandwidth { get { @@ -1051,7 +1338,7 @@ public static string Bandwidth { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Baud ähnelt. + /// Looks up a localized string similar to Baud. /// public static string Baud { get { @@ -1060,7 +1347,7 @@ public static string Baud { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Baud rate ähnelt. + /// Looks up a localized string similar to Baud rate. /// public static string BaudRate { get { @@ -1069,7 +1356,7 @@ public static string BaudRate { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Beacon interval ähnelt. + /// Looks up a localized string similar to Beacon interval. /// public static string BeaconInterval { get { @@ -1078,7 +1365,25 @@ public static string BeaconInterval { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Black ähnelt. + /// Looks up a localized string similar to Bit Calculator. + /// + public static string BitCalculator { + get { + return ResourceManager.GetString("BitCalculator", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bits. + /// + public static string Bits { + get { + return ResourceManager.GetString("Bits", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Black. /// public static string Black { get { @@ -1087,7 +1392,16 @@ public static string Black { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Blue ähnelt. + /// Looks up a localized string similar to Block. + /// + public static string Block { + get { + return ResourceManager.GetString("Block", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Blue. /// public static string Blue { get { @@ -1096,7 +1410,7 @@ public static string Blue { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Broadcast ähnelt. + /// Looks up a localized string similar to Broadcast. /// public static string Broadcast { get { @@ -1105,7 +1419,7 @@ public static string Broadcast { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Brown ähnelt. + /// Looks up a localized string similar to Brown. /// public static string Brown { get { @@ -1114,7 +1428,7 @@ public static string Brown { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Browser ähnelt. + /// Looks up a localized string similar to Browser. /// public static string Browser { get { @@ -1123,7 +1437,43 @@ public static string Browser { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Buffer ähnelt. + /// Looks up a localized string similar to Browsing Data. + /// + public static string BrowsingData { + get { + return ResourceManager.GetString("BrowsingData", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to An error occurred while deleting browsing data. Feel free to report this issue on GitHub.. + /// + public static string BrowsingDataErrorMessage { + get { + return ResourceManager.GetString("BrowsingDataErrorMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Browsing data successfully deleted!. + /// + public static string BrowsingDataSuccessfullyDeletedMessage { + get { + return ResourceManager.GetString("BrowsingDataSuccessfullyDeletedMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to BSSID. + /// + public static string BSSID { + get { + return ResourceManager.GetString("BSSID", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Buffer. /// public static string Buffer { get { @@ -1132,7 +1482,16 @@ public static string Buffer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Bytes ähnelt. + /// Looks up a localized string similar to Bypass for local addresses. + /// + public static string BypassForLocalAddresses { + get { + return ResourceManager.GetString("BypassForLocalAddresses", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bytes. /// public static string Bytes { get { @@ -1141,7 +1500,7 @@ public static string Bytes { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Calculate ähnelt. + /// Looks up a localized string similar to Calculate. /// public static string Calculate { get { @@ -1150,7 +1509,7 @@ public static string Calculate { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Calculator ähnelt. + /// Looks up a localized string similar to Calculator. /// public static string Calculator { get { @@ -1159,7 +1518,7 @@ public static string Calculator { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Cancel ähnelt. + /// Looks up a localized string similar to Cancel. /// public static string Cancel { get { @@ -1168,7 +1527,7 @@ public static string Cancel { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The operation has been canceled by the user! ähnelt. + /// Looks up a localized string similar to The operation has been canceled by the user!. /// public static string CanceledByUserMessage { get { @@ -1177,7 +1536,16 @@ public static string CanceledByUserMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Caps lock is enabled! ähnelt. + /// Looks up a localized string similar to Host cannot be set while other hosts are being added. Please wait until the process is complete and try again.. + /// + public static string CannotSetHostWhileRunningMessage { + get { + return ResourceManager.GetString("CannotSetHostWhileRunningMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Caps lock is enabled!. /// public static string CapsLockIsEnabled { get { @@ -1186,7 +1554,7 @@ public static string CapsLockIsEnabled { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Capture ähnelt. + /// Looks up a localized string similar to Capture. /// public static string Capture { get { @@ -1195,7 +1563,7 @@ public static string Capture { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Capture network packets to view LLDP or CDP information! ähnelt. + /// Looks up a localized string similar to Capture network packets to view LLDP or CDP information!. /// public static string CaptureNetworkPacketsToViewLLDPorCDPInformation { get { @@ -1204,7 +1572,7 @@ public static string CaptureNetworkPacketsToViewLLDPorCDPInformation { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Capturing network packages... ähnelt. + /// Looks up a localized string similar to Capturing network packages.... /// public static string CapturingNetworkPackagesDots { get { @@ -1213,7 +1581,7 @@ public static string CapturingNetworkPackagesDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Change ähnelt. + /// Looks up a localized string similar to Change. /// public static string Change { get { @@ -1222,43 +1590,101 @@ public static string Change { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Change master password ähnelt. + /// Looks up a localized string similar to Change location?. /// - public static string ChangeMasterPassword { + public static string ChangeLocationQuestion { get { - return ResourceManager.GetString("ChangeMasterPassword", resourceCulture); + return ResourceManager.GetString("ChangeLocationQuestion", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Change Master Password... ähnelt. + /// Looks up a localized string similar to Changelog. /// - public static string ChangeMasterPasswordDots { + public static string Changelog { get { - return ResourceManager.GetString("ChangeMasterPasswordDots", resourceCulture); + return ResourceManager.GetString("Changelog", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Channel ähnelt. + /// Looks up a localized string similar to Change master password. /// - public static string Channel { + public static string ChangeMasterPassword { get { - return ResourceManager.GetString("Channel", resourceCulture); + return ResourceManager.GetString("ChangeMasterPassword", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Channels ähnelt. + /// Looks up a localized string similar to Change Master Password.... /// - public static string Channels { + public static string ChangeMasterPasswordDots { + get { + return ResourceManager.GetString("ChangeMasterPasswordDots", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The profiles location is changed and the application is restarted afterwards. + /// + ///You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten.. + /// + public static string ChangeProfilesLocationMessage { + get { + return ResourceManager.GetString("ChangeProfilesLocationMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The settings location is changed and the application is restarted afterwards. + /// + ///You can copy the “settings.json” file from "{0}" to "{1}" to migrate your previous settings, if necessary. The application must be closed for this to prevent the settings from being overwritten.. + /// + public static string ChangeSettingsLocationMessage { + get { + return ResourceManager.GetString("ChangeSettingsLocationMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Channel. + /// + public static string Channel { + get { + return ResourceManager.GetString("Channel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Channels. + /// + public static string Channels { get { return ResourceManager.GetString("Channels", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Chassis Id ähnelt. + /// Looks up a localized string similar to Channel width. + /// + public static string ChannelWidth { + get { + return ResourceManager.GetString("ChannelWidth", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Chart time (seconds). + /// + public static string ChartTimeInSeconds { + get { + return ResourceManager.GetString("ChartTimeInSeconds", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Chassis Id. /// public static string ChassisId { get { @@ -1267,7 +1693,7 @@ public static string ChassisId { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Check ähnelt. + /// Looks up a localized string similar to Check. /// public static string Check { get { @@ -1276,7 +1702,25 @@ public static string Check { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Check for updates ähnelt. + /// Looks up a localized string similar to Check DNS resolver. + /// + public static string CheckDNSResolver { + get { + return ResourceManager.GetString("CheckDNSResolver", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Check for pre-releases. + /// + public static string CheckForPreReleases { + get { + return ResourceManager.GetString("CheckForPreReleases", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Check for updates. /// public static string CheckForUpdates { get { @@ -1285,7 +1729,7 @@ public static string CheckForUpdates { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Check for updates at startup ähnelt. + /// Looks up a localized string similar to Check for updates at startup. /// public static string CheckForUpdatesAtStartup { get { @@ -1294,7 +1738,43 @@ public static string CheckForUpdatesAtStartup { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Check is disabled! ähnelt. + /// Looks up a localized string similar to Checking DNS resolver.... + /// + public static string CheckingDNSResolverDots { + get { + return ResourceManager.GetString("CheckingDNSResolverDots", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Checking IP geolocation.... + /// + public static string CheckingIPGeolocationDots { + get { + return ResourceManager.GetString("CheckingIPGeolocationDots", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Checking WPS.... + /// + public static string CheckingWPSDots { + get { + return ResourceManager.GetString("CheckingWPSDots", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Check IP geolocation. + /// + public static string CheckIPGeolocation { + get { + return ResourceManager.GetString("CheckIPGeolocation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Check is disabled!. /// public static string CheckIsDisabled { get { @@ -1303,7 +1783,7 @@ public static string CheckIsDisabled { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Check your network adapter configuration (dns) and if your dns server is configured correctly. ähnelt. + /// Looks up a localized string similar to Check your network adapter configuration (dns) and if your dns server is configured correctly.. /// public static string CheckNetworkAdapterConfigurationAndDNSServerConfigurationMessage { get { @@ -1312,7 +1792,7 @@ public static string CheckNetworkAdapterConfigurationAndDNSServerConfigurationMe } /// - /// Sucht eine lokalisierte Zeichenfolge, die Check your network adapter configuration (dhcp, static ip) and if you are connected to a network. ähnelt. + /// Looks up a localized string similar to Check your network adapter configuration (dhcp, static ip) and if you are connected to a network.. /// public static string CheckNetworkAdapterConfigurationAndNetworkConnectionMessage { get { @@ -1321,7 +1801,16 @@ public static string CheckNetworkAdapterConfigurationAndNetworkConnectionMessage } /// - /// Sucht eine lokalisierte Zeichenfolge, die Check public IP address ähnelt. + /// Looks up a localized string similar to Check your network connection and try again in a few seconds.. + /// + public static string CheckNetworkConnectionTryAgainMessage { + get { + return ResourceManager.GetString("CheckNetworkConnectionTryAgainMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Check public IP address. /// public static string CheckPublicIPAddress { get { @@ -1330,7 +1819,7 @@ public static string CheckPublicIPAddress { } /// - /// Sucht eine lokalisierte Zeichenfolge, die CIDR ähnelt. + /// Looks up a localized string similar to CIDR. /// public static string CIDR { get { @@ -1339,7 +1828,16 @@ public static string CIDR { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Class ähnelt. + /// Looks up a localized string similar to City. + /// + public static string City { + get { + return ResourceManager.GetString("City", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Class. /// public static string Class { get { @@ -1348,7 +1846,7 @@ public static string Class { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Clear filter ähnelt. + /// Looks up a localized string similar to Clear filter. /// public static string ClearFilter { get { @@ -1357,7 +1855,7 @@ public static string ClearFilter { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Client ähnelt. + /// Looks up a localized string similar to Client. /// public static string Client { get { @@ -1366,7 +1864,7 @@ public static string Client { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Close ähnelt. + /// Looks up a localized string similar to Close. /// public static string Close { get { @@ -1375,7 +1873,16 @@ public static string Close { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Closed ähnelt. + /// Looks up a localized string similar to Close all. + /// + public static string CloseAll { + get { + return ResourceManager.GetString("CloseAll", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Closed. /// public static string Closed { get { @@ -1384,7 +1891,16 @@ public static string Closed { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Closing in {0} seconds... ähnelt. + /// Looks up a localized string similar to Close group. + /// + public static string CloseGroup { + get { + return ResourceManager.GetString("CloseGroup", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Closing in {0} seconds.... /// public static string ClosingInXSecondsDots { get { @@ -1393,7 +1909,7 @@ public static string ClosingInXSecondsDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not export file! See error message: "{0}" ähnelt. + /// Looks up a localized string similar to Could not export file! See error message: "{0}". /// public static string ClouldNotExportFileSeeErrorMessageXX { get { @@ -1402,7 +1918,7 @@ public static string ClouldNotExportFileSeeErrorMessageXX { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not import file! See error message: "{0}" ähnelt. + /// Looks up a localized string similar to Could not import file! See error message: "{0}". /// public static string ClouldNotImportFileSeeErrorMessageXX { get { @@ -1411,7 +1927,7 @@ public static string ClouldNotImportFileSeeErrorMessageXX { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Cobalt ähnelt. + /// Looks up a localized string similar to Cobalt. /// public static string Cobalt { get { @@ -1420,7 +1936,16 @@ public static string Cobalt { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Color depth (bit) ähnelt. + /// Looks up a localized string similar to Collapse all. + /// + public static string CollapseAll { + get { + return ResourceManager.GetString("CollapseAll", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Color depth (bit). /// public static string ColorDepthBit { get { @@ -1429,7 +1954,16 @@ public static string ColorDepthBit { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Command Line Arguments ähnelt. + /// Looks up a localized string similar to Command. + /// + public static string Command { + get { + return ResourceManager.GetString("Command", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Command Line Arguments. /// public static string CommandLineArguments { get { @@ -1438,7 +1972,16 @@ public static string CommandLineArguments { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Community ähnelt. + /// Looks up a localized string similar to Comment. + /// + public static string Comment { + get { + return ResourceManager.GetString("Comment", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Community. /// public static string Community { get { @@ -1447,7 +1990,7 @@ public static string Community { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Computer ähnelt. + /// Looks up a localized string similar to Computer. /// public static string Computer { get { @@ -1456,7 +1999,16 @@ public static string Computer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Configure ähnelt. + /// Looks up a localized string similar to Computer name. + /// + public static string ComputerName { + get { + return ResourceManager.GetString("ComputerName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Configure. /// public static string Configure { get { @@ -1465,7 +2017,7 @@ public static string Configure { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Configure the path to PowerShell in the settings... ähnelt. + /// Looks up a localized string similar to Configure the path to PowerShell in the settings.... /// public static string ConfigureThePathToPowerShellInTheSettingsDots { get { @@ -1474,7 +2026,7 @@ public static string ConfigureThePathToPowerShellInTheSettingsDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Configure the path to PuTTY in the settings... ähnelt. + /// Looks up a localized string similar to Configure the path to PuTTY in the settings.... /// public static string ConfigureThePathToPuTTYInTheSettingsDots { get { @@ -1483,7 +2035,7 @@ public static string ConfigureThePathToPuTTYInTheSettingsDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Configure the path to TigerVNC in the settings... ähnelt. + /// Looks up a localized string similar to Configure the path to TigerVNC in the settings.... /// public static string ConfigureThePathToTigerVNCInTheSettingsDots { get { @@ -1492,7 +2044,7 @@ public static string ConfigureThePathToTigerVNCInTheSettingsDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Confirm ähnelt. + /// Looks up a localized string similar to Confirm. /// public static string Confirm { get { @@ -1501,7 +2053,7 @@ public static string Confirm { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Confirm close ähnelt. + /// Looks up a localized string similar to Confirm close. /// public static string ConfirmClose { get { @@ -1510,7 +2062,7 @@ public static string ConfirmClose { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Are you sure you want to close the application? ähnelt. + /// Looks up a localized string similar to Are you sure you want to close the application?. /// public static string ConfirmCloseMessage { get { @@ -1519,7 +2071,7 @@ public static string ConfirmCloseMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Connect ähnelt. + /// Looks up a localized string similar to Connect. /// public static string Connect { get { @@ -1528,7 +2080,7 @@ public static string Connect { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Connect as ähnelt. + /// Looks up a localized string similar to Connect as. /// public static string ConnectAs { get { @@ -1537,7 +2089,7 @@ public static string ConnectAs { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Connect as... ähnelt. + /// Looks up a localized string similar to Connect as.... /// public static string ConnectAsDots { get { @@ -1546,7 +2098,34 @@ public static string ConnectAsDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Connect external ähnelt. + /// Looks up a localized string similar to Connect automatically. + /// + public static string ConnectAutomatically { + get { + return ResourceManager.GetString("ConnectAutomatically", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Connect.... + /// + public static string ConnectDots { + get { + return ResourceManager.GetString("ConnectDots", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Connected. + /// + public static string Connected { + get { + return ResourceManager.GetString("Connected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Connect external. /// public static string ConnectExternal { get { @@ -1555,7 +2134,7 @@ public static string ConnectExternal { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Connecting... ähnelt. + /// Looks up a localized string similar to Connecting.... /// public static string ConnectingDots { get { @@ -1564,7 +2143,16 @@ public static string ConnectingDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Connection ähnelt. + /// Looks up a localized string similar to Connecting to {0}.... + /// + public static string ConnectingToXXX { + get { + return ResourceManager.GetString("ConnectingToXXX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Connection. /// public static string Connection { get { @@ -1573,7 +2161,7 @@ public static string Connection { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Connections ähnelt. + /// Looks up a localized string similar to Connections. /// public static string Connections { get { @@ -1582,7 +2170,7 @@ public static string Connections { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Error ähnelt. + /// Looks up a localized string similar to Error. /// public static string ConnectionState_Error { get { @@ -1591,7 +2179,7 @@ public static string ConnectionState_Error { } /// - /// Sucht eine lokalisierte Zeichenfolge, die OK ähnelt. + /// Looks up a localized string similar to OK. /// public static string ConnectionState_OK { get { @@ -1600,7 +2188,7 @@ public static string ConnectionState_OK { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Warning ähnelt. + /// Looks up a localized string similar to Warning. /// public static string ConnectionState_Warning { get { @@ -1609,7 +2197,7 @@ public static string ConnectionState_Warning { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Connect the network card to a network to configure it! ähnelt. + /// Looks up a localized string similar to Connect the network card to a network to configure it!. /// public static string ConnectTheNetworkCardToConfigureIt { get { @@ -1618,7 +2206,34 @@ public static string ConnectTheNetworkCardToConfigureIt { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Continue ähnelt. + /// Looks up a localized string similar to Connect to {0}. + /// + public static string ConnectToXXX { + get { + return ResourceManager.GetString("ConnectToXXX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Follow or contact me via X.. + /// + public static string ContactOrContactMeViaX { + get { + return ResourceManager.GetString("ContactOrContactMeViaX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Continent. + /// + public static string Continent { + get { + return ResourceManager.GetString("Continent", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Continue. /// public static string Continue { get { @@ -1627,7 +2242,7 @@ public static string Continue { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Copy ähnelt. + /// Looks up a localized string similar to Copy. /// public static string Copy { get { @@ -1636,7 +2251,7 @@ public static string Copy { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Copy as... ähnelt. + /// Looks up a localized string similar to Copy as.... /// public static string CopyAsDots { get { @@ -1645,7 +2260,7 @@ public static string CopyAsDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Copy... ähnelt. + /// Looks up a localized string similar to Copy.... /// public static string CopyDots { get { @@ -1654,7 +2269,7 @@ public static string CopyDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Copy ähnelt. + /// Looks up a localized string similar to Copy. /// public static string CopyNoun { get { @@ -1663,7 +2278,7 @@ public static string CopyNoun { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Copy profile ähnelt. + /// Looks up a localized string similar to Copy profile. /// public static string CopyProfile { get { @@ -1672,7 +2287,7 @@ public static string CopyProfile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not connect to "{0}"! ähnelt. + /// Looks up a localized string similar to Could not connect to "{0}"!. /// public static string CouldNotConnectToXXXMessage { get { @@ -1681,7 +2296,16 @@ public static string CouldNotConnectToXXXMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not detect gateway ip address! ähnelt. + /// Looks up a localized string similar to Could not connect to {0} ({1})!. + /// + public static string CouldNotConnectToXXXReasonXXX { + get { + return ResourceManager.GetString("CouldNotConnectToXXXReasonXXX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Could not detect gateway ip address!. /// public static string CouldNotDetectGatewayIPAddressMessage { get { @@ -1690,7 +2314,7 @@ public static string CouldNotDetectGatewayIPAddressMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not detect local ip address! ähnelt. + /// Looks up a localized string similar to Could not detect local ip address!. /// public static string CouldNotDetectLocalIPAddressMessage { get { @@ -1699,7 +2323,7 @@ public static string CouldNotDetectLocalIPAddressMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not detect subnetmask! ähnelt. + /// Looks up a localized string similar to Could not detect subnetmask!. /// public static string CouldNotDetectSubnetmask { get { @@ -1708,7 +2332,16 @@ public static string CouldNotDetectSubnetmask { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not get public ip address via WebRequest (http/https) from "{0}"! Check your network connection (firewall, proxy, etc.). ähnelt. + /// Looks up a localized string similar to Could not find the application "{0}". Maybe the application was hidden in the settings?. + /// + public static string CouldNotFindApplicationXXXMessage { + get { + return ResourceManager.GetString("CouldNotFindApplicationXXXMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Could not get public ip address via WebRequest (http/https) from "{0}"! Check your network connection (firewall, proxy, etc.).. /// public static string CouldNotGetPublicIPAddressFromXXXMessage { get { @@ -1717,7 +2350,16 @@ public static string CouldNotGetPublicIPAddressFromXXXMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not parse public ip address from "{0}"! Try another service or use the default... ähnelt. + /// Looks up a localized string similar to Could not parse or resolve any of the specified DNS servers.. + /// + public static string CouldNotParseOrResolveDNSServers { + get { + return ResourceManager.GetString("CouldNotParseOrResolveDNSServers", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Could not parse public ip address from "{0}"! Try another service or use the default... . /// public static string CouldNotParsePublicIPAddressFromXXXMessage { get { @@ -1726,7 +2368,16 @@ public static string CouldNotParsePublicIPAddressFromXXXMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not resolve hostname for: "{0}" ähnelt. + /// Looks up a localized string similar to Could not parse "{0}".. + /// + public static string CouldNotParseX { + get { + return ResourceManager.GetString("CouldNotParseX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Could not resolve hostname for: "{0}". /// public static string CouldNotResolveHostnameFor { get { @@ -1735,7 +2386,7 @@ public static string CouldNotResolveHostnameFor { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not resolve ip address for: "{0}" ähnelt. + /// Looks up a localized string similar to Could not resolve ip address for: "{0}". /// public static string CouldNotResolveIPAddressFor { get { @@ -1744,7 +2395,7 @@ public static string CouldNotResolveIPAddressFor { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not send keystroke! ähnelt. + /// Looks up a localized string similar to Could not send keystroke!. /// public static string CouldNotSendKeystroke { get { @@ -1753,7 +2404,25 @@ public static string CouldNotSendKeystroke { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Credential ähnelt. + /// Looks up a localized string similar to Country. + /// + public static string Country { + get { + return ResourceManager.GetString("Country", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Create daily backup. + /// + public static string CreateDailyBackup { + get { + return ResourceManager.GetString("CreateDailyBackup", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Credential. /// public static string Credential { get { @@ -1762,7 +2431,7 @@ public static string Credential { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Credentials ähnelt. + /// Looks up a localized string similar to Credentials. /// public static string Credentials { get { @@ -1771,7 +2440,7 @@ public static string Credentials { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Credential Security Support Provider ähnelt. + /// Looks up a localized string similar to Credential Security Support Provider. /// public static string CredentialSecuritySupportProvider { get { @@ -1780,7 +2449,7 @@ public static string CredentialSecuritySupportProvider { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Crimson ähnelt. + /// Looks up a localized string similar to Crimson. /// public static string Crimson { get { @@ -1789,16 +2458,70 @@ public static string Crimson { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Ctrl+Alt+Del ähnelt. + /// Looks up a localized string similar to Ctrl+Alt+Del. /// public static string CtrlAltDel { get { return ResourceManager.GetString("CtrlAltDel", resourceCulture); } } + + /// + /// Looks up a localized string similar to Task Manager (Ctrl+Shift+Esc). + /// + public static string TaskManager { + get { + return ResourceManager.GetString("TaskManager", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Lock (Win+L). + /// + public static string Lock { + get { + return ResourceManager.GetString("Lock", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show Desktop (Win+D). + /// + public static string ShowDesktop { + get { + return ResourceManager.GetString("ShowDesktop", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Explorer (Win+E). + /// + public static string Explorer { + get { + return ResourceManager.GetString("Explorer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Run dialog (Win+R). + /// + public static string RunDialog { + get { + return ResourceManager.GetString("RunDialog", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Currency. + /// + public static string Currency { + get { + return ResourceManager.GetString("Currency", resourceCulture); + } + } /// - /// Sucht eine lokalisierte Zeichenfolge, die Current download speed ähnelt. + /// Looks up a localized string similar to Current download speed. /// public static string CurrentDownloadSpeed { get { @@ -1807,7 +2530,7 @@ public static string CurrentDownloadSpeed { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Currently downloaded ähnelt. + /// Looks up a localized string similar to Currently downloaded. /// public static string CurrentlyDownloaded { get { @@ -1816,7 +2539,7 @@ public static string CurrentlyDownloaded { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Currently uploaded ähnelt. + /// Looks up a localized string similar to Currently uploaded. /// public static string CurrentlyUploaded { get { @@ -1825,7 +2548,7 @@ public static string CurrentlyUploaded { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Current password ähnelt. + /// Looks up a localized string similar to Current password. /// public static string CurrentPassword { get { @@ -1834,7 +2557,7 @@ public static string CurrentPassword { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Current upload speed ähnelt. + /// Looks up a localized string similar to Current upload speed. /// public static string CurrentUploadSpeed { get { @@ -1843,7 +2566,7 @@ public static string CurrentUploadSpeed { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Custom ähnelt. + /// Looks up a localized string similar to Custom. /// public static string Custom { get { @@ -1852,7 +2575,7 @@ public static string Custom { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Custom: ähnelt. + /// Looks up a localized string similar to Custom:. /// public static string CustomColon { get { @@ -1861,7 +2584,7 @@ public static string CustomColon { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Custom commands ähnelt. + /// Looks up a localized string similar to Custom commands. /// public static string CustomCommands { get { @@ -1870,7 +2593,7 @@ public static string CustomCommands { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Custom screen size: ähnelt. + /// Looks up a localized string similar to Custom screen size:. /// public static string CustomScreenSize { get { @@ -1879,7 +2602,16 @@ public static string CustomScreenSize { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Cut ähnelt. + /// Looks up a localized string similar to Custom themes. + /// + public static string CustomThemes { + get { + return ResourceManager.GetString("CustomThemes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cut. /// public static string Cut { get { @@ -1888,7 +2620,7 @@ public static string Cut { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Cyan ähnelt. + /// Looks up a localized string similar to Cyan. /// public static string Cyan { get { @@ -1897,7 +2629,7 @@ public static string Cyan { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Dashboard ähnelt. + /// Looks up a localized string similar to Dashboard. /// public static string Dashboard { get { @@ -1906,7 +2638,7 @@ public static string Dashboard { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Data ähnelt. + /// Looks up a localized string similar to Data. /// public static string Data { get { @@ -1915,7 +2647,7 @@ public static string Data { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Data has been updated! ähnelt. + /// Looks up a localized string similar to Data has been updated!. /// public static string DataHasBeenUpdated { get { @@ -1924,7 +2656,7 @@ public static string DataHasBeenUpdated { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Credentials must be decrypted and loaded to manage them. ähnelt. + /// Looks up a localized string similar to Credentials must be decrypted and loaded to manage them.. /// public static string DecryptAndLoadCredentialsMessage { get { @@ -1933,7 +2665,7 @@ public static string DecryptAndLoadCredentialsMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Decrypt and load... ähnelt. + /// Looks up a localized string similar to Decrypt and load.... /// public static string DecryptAndLoadDots { get { @@ -1942,7 +2674,7 @@ public static string DecryptAndLoadDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Decryption error ähnelt. + /// Looks up a localized string similar to Decryption error. /// public static string DecryptionError { get { @@ -1951,7 +2683,7 @@ public static string DecryptionError { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not decrypt file. You may report this issue on GitHub. ähnelt. + /// Looks up a localized string similar to Could not decrypt file. You may report this issue on GitHub.. /// public static string DecryptionErrorMessage { get { @@ -1960,7 +2692,7 @@ public static string DecryptionErrorMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Default ähnelt. + /// Looks up a localized string similar to Default. /// public static string Default { get { @@ -1969,7 +2701,7 @@ public static string Default { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Default application ähnelt. + /// Looks up a localized string similar to Default application. /// public static string DefaultApplication { get { @@ -1978,7 +2710,7 @@ public static string DefaultApplication { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Default-Gateway ähnelt. + /// Looks up a localized string similar to Default-Gateway. /// public static string DefaultGateway { get { @@ -1987,7 +2719,7 @@ public static string DefaultGateway { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Default port: ähnelt. + /// Looks up a localized string similar to Default port:. /// public static string DefaultPort { get { @@ -1996,43 +2728,79 @@ public static string DefaultPort { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delete ähnelt. + /// Looks up a localized string similar to Default profile. /// - public static string Delete { + public static string DefaultProfile { get { - return ResourceManager.GetString("Delete", resourceCulture); + return ResourceManager.GetString("DefaultProfile", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die The selected credential will be deleted permanently. ähnelt. + /// Looks up a localized string similar to Default region. /// - public static string DeleteCredentialMessage { + public static string DefaultRegion { get { - return ResourceManager.GetString("DeleteCredentialMessage", resourceCulture); + return ResourceManager.GetString("DefaultRegion", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delete credentials ähnelt. + /// Looks up a localized string similar to Delete. /// - public static string DeleteCredentials { + public static string Delete { get { - return ResourceManager.GetString("DeleteCredentials", resourceCulture); + return ResourceManager.GetString("Delete", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delete custom command ähnelt. + /// Looks up a localized string similar to Delete browsing data. /// - public static string DeleteCustomCommand { + public static string DeleteBrowsingData { get { - return ResourceManager.GetString("DeleteCustomCommand", resourceCulture); + return ResourceManager.GetString("DeleteBrowsingData", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die The selected custom command will be deleted permanently. ähnelt. + /// Looks up a localized string similar to Permanently delete browsing data (history, cookies, cache, credentials, etc.) for the current WebView2 profile.. + /// + public static string DeleteBrowsingDataMessage { + get { + return ResourceManager.GetString("DeleteBrowsingDataMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The selected credential will be deleted permanently.. + /// + public static string DeleteCredentialMessage { + get { + return ResourceManager.GetString("DeleteCredentialMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Delete credentials. + /// + public static string DeleteCredentials { + get { + return ResourceManager.GetString("DeleteCredentials", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Delete custom command. + /// + public static string DeleteCustomCommand { + get { + return ResourceManager.GetString("DeleteCustomCommand", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The selected custom command will be deleted permanently.. /// public static string DeleteCustomCommandMessage { get { @@ -2041,7 +2809,7 @@ public static string DeleteCustomCommandMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delete DNS server ähnelt. + /// Looks up a localized string similar to Delete DNS server. /// public static string DeleteDNSServer { get { @@ -2050,7 +2818,7 @@ public static string DeleteDNSServer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The selected DNS server will be deleted permanently. ähnelt. + /// Looks up a localized string similar to The selected DNS server will be deleted permanently.. /// public static string DeleteDNSServerMessage { get { @@ -2059,7 +2827,7 @@ public static string DeleteDNSServerMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delete... ähnelt. + /// Looks up a localized string similar to Delete.... /// public static string DeleteDots { get { @@ -2068,7 +2836,7 @@ public static string DeleteDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delete entry ähnelt. + /// Looks up a localized string similar to Delete entry. /// public static string DeleteEntry { get { @@ -2077,7 +2845,18 @@ public static string DeleteEntry { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delete group ähnelt. + /// Looks up a localized string similar to The selected firewall rule is permanently deleted: + /// + ///{0}. + /// + public static string DeleteFirewallRuleMessage { + get { + return ResourceManager.GetString("DeleteFirewallRuleMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Delete group. /// public static string DeleteGroup { get { @@ -2086,7 +2865,7 @@ public static string DeleteGroup { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Selected group and all profiles inside this group will be deleted permanently. ähnelt. + /// Looks up a localized string similar to Selected group and all profiles inside this group will be deleted permanently.. /// public static string DeleteGroupMessage { get { @@ -2095,7 +2874,36 @@ public static string DeleteGroupMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delete port profile ähnelt. + /// Looks up a localized string similar to The selected entry is permanently deleted: + /// + ///{0} {1} {2}. + /// + public static string DeleteHostsFileEntryMessage { + get { + return ResourceManager.GetString("DeleteHostsFileEntryMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Delete OID profile. + /// + public static string DeleteOIDProfile { + get { + return ResourceManager.GetString("DeleteOIDProfile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The selected OID profile will be deleted permanently.. + /// + public static string DeleteOIDProfileMessage { + get { + return ResourceManager.GetString("DeleteOIDProfileMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Delete port profile. /// public static string DeletePortProfile { get { @@ -2104,7 +2912,7 @@ public static string DeletePortProfile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The selected port profile will be deleted permanently. ähnelt. + /// Looks up a localized string similar to The selected port profile will be deleted permanently.. /// public static string DeletePortProfileMessage { get { @@ -2113,7 +2921,7 @@ public static string DeletePortProfileMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delete profile ähnelt. + /// Looks up a localized string similar to Delete profile. /// public static string DeleteProfile { get { @@ -2122,7 +2930,7 @@ public static string DeleteProfile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delete profile file ähnelt. + /// Looks up a localized string similar to Delete profile file. /// public static string DeleteProfileFile { get { @@ -2131,16 +2939,16 @@ public static string DeleteProfileFile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Selected profile file will be deleted permanently. ähnelt. + /// Looks up a localized string similar to Profile file "{0}" will be deleted permanently.. /// - public static string DeleteProfileFileMessage { + public static string DeleteProfileFileXMessage { get { - return ResourceManager.GetString("DeleteProfileFileMessage", resourceCulture); + return ResourceManager.GetString("DeleteProfileFileXMessage", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Selected profile will be deleted permanently. ähnelt. + /// Looks up a localized string similar to Selected profile will be deleted permanently.. /// public static string DeleteProfileMessage { get { @@ -2149,7 +2957,7 @@ public static string DeleteProfileMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delete profiles ähnelt. + /// Looks up a localized string similar to Delete profiles. /// public static string DeleteProfiles { get { @@ -2158,7 +2966,7 @@ public static string DeleteProfiles { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Selected profiles will be deleted permanently. ähnelt. + /// Looks up a localized string similar to Selected profiles will be deleted permanently.. /// public static string DeleteProfilesMessage { get { @@ -2167,7 +2975,34 @@ public static string DeleteProfilesMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delete table ähnelt. + /// Looks up a localized string similar to Delete rule. + /// + public static string DeleteRule { + get { + return ResourceManager.GetString("DeleteRule", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Delete SNTP server. + /// + public static string DeleteSNTPServer { + get { + return ResourceManager.GetString("DeleteSNTPServer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The selected SNTP server will be deleted permanently.. + /// + public static string DeleteSNTPServerMessage { + get { + return ResourceManager.GetString("DeleteSNTPServerMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Delete table. /// public static string DeleteTable { get { @@ -2176,16 +3011,61 @@ public static string DeleteTable { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Description ähnelt. + /// Looks up a localized string similar to Description. /// public static string Description { get { return ResourceManager.GetString("Description", resourceCulture); } } + + /// + /// Looks up a localized string similar to Placeholder. + /// + public static string Placeholder { + get { + return ResourceManager.GetString("Placeholder", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Path to the file or executable to run. The following placeholders can be used:. + /// + public static string HelpMessage_CustomCommandFilePath { + get { + return ResourceManager.GetString("HelpMessage_CustomCommandFilePath", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Arguments passed to the file or executable. The following placeholders can be used:. + /// + public static string HelpMessage_CustomCommandArguments { + get { + return ResourceManager.GetString("HelpMessage_CustomCommandArguments", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The following placeholder can be used:. + /// + public static string HelpMessage_ProfileHostPlaceholder { + get { + return ResourceManager.GetString("HelpMessage_ProfileHostPlaceholder", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Deselect all. + /// + public static string DeselectAll { + get { + return ResourceManager.GetString("DeselectAll", resourceCulture); + } + } /// - /// Sucht eine lokalisierte Zeichenfolge, die Design ähnelt. + /// Looks up a localized string similar to Design. /// public static string Design { get { @@ -2194,7 +3074,7 @@ public static string Design { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Desktop background ähnelt. + /// Looks up a localized string similar to Desktop background. /// public static string DesktopBackground { get { @@ -2203,7 +3083,7 @@ public static string DesktopBackground { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Desktop composition ähnelt. + /// Looks up a localized string similar to Desktop composition. /// public static string DesktopComposition { get { @@ -2212,7 +3092,7 @@ public static string DesktopComposition { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Destination ähnelt. + /// Looks up a localized string similar to Destination. /// public static string Destination { get { @@ -2221,7 +3101,7 @@ public static string Destination { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Details ähnelt. + /// Looks up a localized string similar to Details. /// public static string Details { get { @@ -2230,7 +3110,7 @@ public static string Details { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Detecting network... ähnelt. + /// Looks up a localized string similar to Detecting network.... /// public static string DetectingNetworkDots { get { @@ -2239,7 +3119,7 @@ public static string DetectingNetworkDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Detect local ip address and subnetmask ähnelt. + /// Looks up a localized string similar to Detect local ip address and subnetmask. /// public static string DetectLocalIPAddressAndSubnetmask { get { @@ -2248,7 +3128,7 @@ public static string DetectLocalIPAddressAndSubnetmask { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Developed and maintained by {0} with the help of the ähnelt. + /// Looks up a localized string similar to Developed and maintained by {0} with the help of the. /// public static string DevelopedAndMaintainedByX { get { @@ -2257,7 +3137,7 @@ public static string DevelopedAndMaintainedByX { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Device ähnelt. + /// Looks up a localized string similar to Device. /// public static string Device { get { @@ -2266,7 +3146,7 @@ public static string Device { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Device description ähnelt. + /// Looks up a localized string similar to Device description. /// public static string DeviceDescription { get { @@ -2275,7 +3155,7 @@ public static string DeviceDescription { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DHCP enabled ähnelt. + /// Looks up a localized string similar to DHCP enabled. /// public static string DHCPEnabled { get { @@ -2284,7 +3164,7 @@ public static string DHCPEnabled { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DHCP lease expires ähnelt. + /// Looks up a localized string similar to DHCP lease expires. /// public static string DHCPLeaseExpires { get { @@ -2293,7 +3173,7 @@ public static string DHCPLeaseExpires { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DHCP lease obtained ähnelt. + /// Looks up a localized string similar to DHCP lease obtained. /// public static string DHCPLeaseObtained { get { @@ -2302,7 +3182,7 @@ public static string DHCPLeaseObtained { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DHCP server ähnelt. + /// Looks up a localized string similar to DHCP server. /// public static string DHCPServer { get { @@ -2311,7 +3191,25 @@ public static string DHCPServer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Disable encryption... ähnelt. + /// Looks up a localized string similar to Direction. + /// + public static string Direction { + get { + return ResourceManager.GetString("Direction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disable. + /// + public static string Disable { + get { + return ResourceManager.GetString("Disable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disable encryption.... /// public static string DisableEncryptionDots { get { @@ -2320,7 +3218,25 @@ public static string DisableEncryptionDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Disclaimer ähnelt. + /// Looks up a localized string similar to Disable entry. + /// + public static string DisableEntry { + get { + return ResourceManager.GetString("DisableEntry", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disable rule. + /// + public static string DisableRule { + get { + return ResourceManager.GetString("DisableRule", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disclaimer. /// public static string Disclaimer { get { @@ -2329,7 +3245,7 @@ public static string Disclaimer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Disconnect ähnelt. + /// Looks up a localized string similar to Disconnect. /// public static string Disconnect { get { @@ -2338,7 +3254,7 @@ public static string Disconnect { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Disconnected ähnelt. + /// Looks up a localized string similar to Disconnected. /// public static string Disconnected { get { @@ -2347,7 +3263,7 @@ public static string Disconnected { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Discovery Protocol ähnelt. + /// Looks up a localized string similar to Discovery Protocol. /// public static string DiscoveryProtocol { get { @@ -2356,34 +3272,34 @@ public static string DiscoveryProtocol { } /// - /// Sucht eine lokalisierte Zeichenfolge, die CDP ähnelt. + /// Looks up a localized string similar to CDP. /// - public static string DiscoveryProtocolIdentifier_CDP { + public static string DiscoveryProtocol_Cdp { get { - return ResourceManager.GetString("DiscoveryProtocolIdentifier_CDP", resourceCulture); + return ResourceManager.GetString("DiscoveryProtocol_Cdp", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die LLDP ähnelt. + /// Looks up a localized string similar to LLDP. /// - public static string DiscoveryProtocolIdentifier_LLDP { + public static string DiscoveryProtocol_Lldp { get { - return ResourceManager.GetString("DiscoveryProtocolIdentifier_LLDP", resourceCulture); + return ResourceManager.GetString("DiscoveryProtocol_Lldp", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die LLDP / CDP ähnelt. + /// Looks up a localized string similar to LLDP / CDP. /// - public static string DiscoveryProtocolIdentifier_LLDP_CDP { + public static string DiscoveryProtocol_LldpCdp { get { - return ResourceManager.GetString("DiscoveryProtocolIdentifier_LLDP_CDP", resourceCulture); + return ResourceManager.GetString("DiscoveryProtocol_LldpCdp", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Display ähnelt. + /// Looks up a localized string similar to Display. /// public static string Display { get { @@ -2392,7 +3308,16 @@ public static string Display { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DNS ähnelt. + /// Looks up a localized string similar to District. + /// + public static string District { + get { + return ResourceManager.GetString("District", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DNS. /// public static string DNS { get { @@ -2401,7 +3326,7 @@ public static string DNS { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DNS autconfiguration ähnelt. + /// Looks up a localized string similar to DNS autconfiguration. /// public static string DNSAutoconfiguration { get { @@ -2410,7 +3335,7 @@ public static string DNSAutoconfiguration { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DNS Lookup ähnelt. + /// Looks up a localized string similar to DNS Lookup. /// public static string DNSLookup { get { @@ -2419,7 +3344,7 @@ public static string DNSLookup { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DNS Lookup... ähnelt. + /// Looks up a localized string similar to DNS Lookup.... /// public static string DNSLookupDots { get { @@ -2428,7 +3353,16 @@ public static string DNSLookupDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DNS server ähnelt. + /// Looks up a localized string similar to DNS resolver. + /// + public static string DNSResolver { + get { + return ResourceManager.GetString("DNSResolver", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DNS server. /// public static string DNSServer { get { @@ -2437,7 +3371,7 @@ public static string DNSServer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DNS server(s) ähnelt. + /// Looks up a localized string similar to DNS server(s). /// public static string DNSServers { get { @@ -2446,7 +3380,7 @@ public static string DNSServers { } /// - /// Sucht eine lokalisierte Zeichenfolge, die A DNS server with this name already exists! ähnelt. + /// Looks up a localized string similar to A DNS server with this name already exists!. /// public static string DNSServerWithThisNameAlreadyExists { get { @@ -2455,7 +3389,7 @@ public static string DNSServerWithThisNameAlreadyExists { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DNS suffix ähnelt. + /// Looks up a localized string similar to DNS suffix. /// public static string DNSSuffix { get { @@ -2464,7 +3398,7 @@ public static string DNSSuffix { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Domain ähnelt. + /// Looks up a localized string similar to Domain. /// public static string Domain { get { @@ -2473,7 +3407,7 @@ public static string Domain { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Domain name ähnelt. + /// Looks up a localized string similar to Domain name. /// public static string DomainName { get { @@ -2482,7 +3416,16 @@ public static string DomainName { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Don't fragment ähnelt. + /// Looks up a localized string similar to Donate. + /// + public static string Donate { + get { + return ResourceManager.GetString("Donate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Don't fragment. /// public static string DontFragment { get { @@ -2491,7 +3434,7 @@ public static string DontFragment { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Download ähnelt. + /// Looks up a localized string similar to Download. /// public static string Download { get { @@ -2500,7 +3443,7 @@ public static string Download { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Download Microsoft Edge WebView2 Runtime ähnelt. + /// Looks up a localized string similar to Download Microsoft Edge WebView2 Runtime. /// public static string DownloadMicrosoftEdgeWebView2Runtime { get { @@ -2509,7 +3452,17 @@ public static string DownloadMicrosoftEdgeWebView2Runtime { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Duration ähnelt. + /// Looks up a localized string similar to Drag and drop the applications to reorder them. + ///Right-click for more options.. + /// + public static string DragDropApplicationsToReorderRightClickForMoreOptions { + get { + return ResourceManager.GetString("DragDropApplicationsToReorderRightClickForMoreOptions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Duration. /// public static string Duration { get { @@ -2518,7 +3471,7 @@ public static string Duration { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Duration (s) ähnelt. + /// Looks up a localized string similar to Duration (s). /// public static string DurationS { get { @@ -2527,7 +3480,7 @@ public static string DurationS { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Dynamic IPv4 address ähnelt. + /// Looks up a localized string similar to Dynamic IPv4 address. /// public static string DynamicIPv4Address { get { @@ -2536,7 +3489,7 @@ public static string DynamicIPv4Address { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Dynamic IPv4 DNS server ähnelt. + /// Looks up a localized string similar to Dynamic IPv4 DNS server. /// public static string DynamicIPv4DNSServer { get { @@ -2545,7 +3498,7 @@ public static string DynamicIPv4DNSServer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Edit credentials ähnelt. + /// Looks up a localized string similar to Edit credentials. /// public static string EditCredentials { get { @@ -2554,7 +3507,7 @@ public static string EditCredentials { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Edit custom command ähnelt. + /// Looks up a localized string similar to Edit custom command. /// public static string EditCustomCommand { get { @@ -2563,7 +3516,7 @@ public static string EditCustomCommand { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Edit DNS server ähnelt. + /// Looks up a localized string similar to Edit DNS server. /// public static string EditDNSServer { get { @@ -2572,7 +3525,7 @@ public static string EditDNSServer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Edit... ähnelt. + /// Looks up a localized string similar to Edit.... /// public static string EditDots { get { @@ -2581,7 +3534,25 @@ public static string EditDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Edit group ähnelt. + /// Looks up a localized string similar to Edit entry. + /// + public static string EditEntry { + get { + return ResourceManager.GetString("EditEntry", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Edit entry.... + /// + public static string EditEntryDots { + get { + return ResourceManager.GetString("EditEntryDots", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Edit group. /// public static string EditGroup { get { @@ -2590,7 +3561,7 @@ public static string EditGroup { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Edit group... ähnelt. + /// Looks up a localized string similar to Edit group.... /// public static string EditGroupDots { get { @@ -2599,7 +3570,16 @@ public static string EditGroupDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Edit port profile ähnelt. + /// Looks up a localized string similar to Edit OID profile. + /// + public static string EditOIDProfile { + get { + return ResourceManager.GetString("EditOIDProfile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Edit port profile. /// public static string EditPortProfile { get { @@ -2608,7 +3588,7 @@ public static string EditPortProfile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Edit profile ähnelt. + /// Looks up a localized string similar to Edit profile. /// public static string EditProfile { get { @@ -2617,7 +3597,7 @@ public static string EditProfile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Edit profile file ähnelt. + /// Looks up a localized string similar to Edit profile file. /// public static string EditProfileFile { get { @@ -2626,5041 +3606,7788 @@ public static string EditProfileFile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Emerald ähnelt. + /// Looks up a localized string similar to Edit rule. /// - public static string Emerald { + public static string EditRule { get { - return ResourceManager.GetString("Emerald", resourceCulture); + return ResourceManager.GetString("EditRule", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enable ähnelt. + /// Looks up a localized string similar to Edit rule.... /// - public static string Enable { + public static string EditRuleDots { get { - return ResourceManager.GetString("Enable", resourceCulture); + return ResourceManager.GetString("EditRuleDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enable Credential Security Support Provider ähnelt. + /// Looks up a localized string similar to Edit SNTP server. /// - public static string EnableCredentialSecuritySupportProvider { + public static string EditSNTPServer { get { - return ResourceManager.GetString("EnableCredentialSecuritySupportProvider", resourceCulture); + return ResourceManager.GetString("EditSNTPServer", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enable encryption... ähnelt. + /// Looks up a localized string similar to EDNS. /// - public static string EnableEncryptionDots { + public static string EDNS { get { - return ResourceManager.GetString("EnableEncryptionDots", resourceCulture); + return ResourceManager.GetString("EDNS", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enable log ähnelt. + /// Looks up a localized string similar to Emerald. /// - public static string EnableLog { + public static string Emerald { get { - return ResourceManager.GetString("EnableLog", resourceCulture); + return ResourceManager.GetString("Emerald", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Encryption ähnelt. + /// Looks up a localized string similar to Enable. /// - public static string Encryption { + public static string Enable { get { - return ResourceManager.GetString("Encryption", resourceCulture); + return ResourceManager.GetString("Enable", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Encryption... ähnelt. + /// Looks up a localized string similar to Enable Credential Security Support Provider. /// - public static string EncryptionDots { + public static string EnableCredentialSecuritySupportProvider { get { - return ResourceManager.GetString("EncryptionDots", resourceCulture); + return ResourceManager.GetString("EnableCredentialSecuritySupportProvider", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Encryption error ähnelt. + /// Looks up a localized string similar to Enabled. /// - public static string EncryptionError { + public static string Enabled { get { - return ResourceManager.GetString("EncryptionError", resourceCulture); + return ResourceManager.GetString("Enabled", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not encrpyt file. You may report this issue on GitHub. ähnelt. + /// Looks up a localized string similar to Enable encryption.... /// - public static string EncryptionErrorMessage { + public static string EnableEncryptionDots { get { - return ResourceManager.GetString("EncryptionErrorMessage", resourceCulture); + return ResourceManager.GetString("EnableEncryptionDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die End time ähnelt. + /// Looks up a localized string similar to Do you want to enable profile file encryption to protect sensitive data such as hosts, IP addresses, URLs, and stored credentials? + /// + ///You can enable or disable encryption later at any time by right-clicking the profile file to manage encryption settings. + ///If you click Cancel, the profile file will remain unencrypted.. /// - public static string EndTime { + public static string EnableEncryptionForProfileFileMessage { get { - return ResourceManager.GetString("EndTime", resourceCulture); + return ResourceManager.GetString("EnableEncryptionForProfileFileMessage", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a subnet to calculate it... ähnelt. + /// Looks up a localized string similar to Enable encryption?. /// - public static string EnterASubnetToCalculateIt { + public static string EnableEncryptionQuestion { get { - return ResourceManager.GetString("EnterASubnetToCalculateIt", resourceCulture); + return ResourceManager.GetString("EnableEncryptionQuestion", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter location... ähnelt. + /// Looks up a localized string similar to Enable entry. /// - public static string EnterLocationDots { + public static string EnableEntry { get { - return ResourceManager.GetString("EnterLocationDots", resourceCulture); + return ResourceManager.GetString("EnableEntry", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter one or more valid IP addresses! ähnelt. + /// Looks up a localized string similar to Enable for. /// - public static string EnterOneOrMoreValidIPAddresses { + public static string EnableFor { get { - return ResourceManager.GetString("EnterOneOrMoreValidIPAddresses", resourceCulture); + return ResourceManager.GetString("EnableFor", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter subnet and a new subnet mask to create subnets... ähnelt. + /// Looks up a localized string similar to Enable gateway server. /// - public static string EnterSubnetAndANewSubnetmaskToCreateSubnets { + public static string EnableGatewayServer { get { - return ResourceManager.GetString("EnterSubnetAndANewSubnetmaskToCreateSubnets", resourceCulture); + return ResourceManager.GetString("EnableGatewayServer", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter subnets to create a wide subnet... ähnelt. + /// Looks up a localized string similar to Enable log. /// - public static string EnterSubnetsToCreateAWideSubnet { + public static string EnableLog { get { - return ResourceManager.GetString("EnterSubnetsToCreateAWideSubnet", resourceCulture); + return ResourceManager.GetString("EnableLog", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid baud! ähnelt. + /// Looks up a localized string similar to Enable rule. /// - public static string EnterValidBaud { + public static string EnableRule { get { - return ResourceManager.GetString("EnterValidBaud", resourceCulture); + return ResourceManager.GetString("EnableRule", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid domain (like "example.com")! ähnelt. + /// Looks up a localized string similar to Encryption. /// - public static string EnterValidDomain { + public static string Encryption { get { - return ResourceManager.GetString("EnterValidDomain", resourceCulture); + return ResourceManager.GetString("Encryption", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid file name! ähnelt. + /// Looks up a localized string similar to Encryption.... /// - public static string EnterValidFileName { + public static string EncryptionDots { get { - return ResourceManager.GetString("EnterValidFileName", resourceCulture); + return ResourceManager.GetString("EncryptionDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid file path! ähnelt. + /// Looks up a localized string similar to Encryption error. /// - public static string EnterValidFilePath { + public static string EncryptionError { get { - return ResourceManager.GetString("EnterValidFilePath", resourceCulture); + return ResourceManager.GetString("EncryptionError", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid hostname! ähnelt. + /// Looks up a localized string similar to Could not encrpyt file. You may report this issue on GitHub.. /// - public static string EnterValidHostname { + public static string EncryptionErrorMessage { get { - return ResourceManager.GetString("EnterValidHostname", resourceCulture); + return ResourceManager.GetString("EncryptionErrorMessage", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid hostname and port! ähnelt. + /// Looks up a localized string similar to End time. /// - public static string EnterValidHostnameAndPort { + public static string EndTime { get { - return ResourceManager.GetString("EnterValidHostnameAndPort", resourceCulture); + return ResourceManager.GetString("EndTime", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter valid hosts (multiple hosts can not end with ";")! ähnelt. + /// Looks up a localized string similar to Enter a domain to query whois.... /// - public static string EnterValidHosts { + public static string EnterADomainToQueryWhoisDots { get { - return ResourceManager.GetString("EnterValidHosts", resourceCulture); + return ResourceManager.GetString("EnterADomainToQueryWhoisDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid IP address! ähnelt. + /// Looks up a localized string similar to Enter a number and select a unit to calculate the units.... /// - public static string EnterValidIPAddress { + public static string EnterANumberAndSelectAUnitToCalculateTheUnitsDots { get { - return ResourceManager.GetString("EnterValidIPAddress", resourceCulture); + return ResourceManager.GetString("EnterANumberAndSelectAUnitToCalculateTheUnitsDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid ip range! ähnelt. + /// Looks up a localized string similar to Enter a subnet to calculate it.... /// - public static string EnterValidIPScanRange { + public static string EnterASubnetToCalculateItDots { get { - return ResourceManager.GetString("EnterValidIPScanRange", resourceCulture); + return ResourceManager.GetString("EnterASubnetToCalculateItDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid IPv4 address! ähnelt. + /// Looks up a localized string similar to Enter host to query IP geolocation.... /// - public static string EnterValidIPv4Address { + public static string EnterHostToQueryIPGeolocationDots { get { - return ResourceManager.GetString("EnterValidIPv4Address", resourceCulture); + return ResourceManager.GetString("EnterHostToQueryIPGeolocationDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid IPv6 address! ähnelt. + /// Looks up a localized string similar to Enter location.... /// - public static string EnterValidIPv6Address { + public static string EnterLocationDots { get { - return ResourceManager.GetString("EnterValidIPv6Address", resourceCulture); + return ResourceManager.GetString("EnterLocationDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid MAC address (like 00:F1:23:AB:F2:35)! ähnelt. + /// Looks up a localized string similar to Enter master password to unlock the profile file:. /// - public static string EnterValidMACAddress { + public static string EnterMasterPasswordToUnlockProfile { get { - return ResourceManager.GetString("EnterValidMACAddress", resourceCulture); + return ResourceManager.GetString("EnterMasterPasswordToUnlockProfile", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid number! ähnelt. + /// Looks up a localized string similar to Enter one or more valid IP addresses!. /// - public static string EnterValidNumber { + public static string EnterOneOrMoreValidIPAddresses { get { - return ResourceManager.GetString("EnterValidNumber", resourceCulture); + return ResourceManager.GetString("EnterOneOrMoreValidIPAddresses", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid OID! ähnelt. + /// Looks up a localized string similar to Enter password.... /// - public static string EnterValidOID { + public static string EnterPasswordDots { get { - return ResourceManager.GetString("EnterValidOID", resourceCulture); + return ResourceManager.GetString("EnterPasswordDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid port (1 - 65535)! ähnelt. + /// Looks up a localized string similar to Enter subnet and a new subnet mask to create subnets.... /// - public static string EnterValidPort { + public static string EnterSubnetAndANewSubnetmaskToCreateSubnets { get { - return ResourceManager.GetString("EnterValidPort", resourceCulture); + return ResourceManager.GetString("EnterSubnetAndANewSubnetmaskToCreateSubnets", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid port and/or port range (1 - 65535)! ähnelt. + /// Looks up a localized string similar to Enter subnets to create a wide subnet.... /// - public static string EnterValidPortOrPortRange { + public static string EnterSubnetsToCreateAWideSubnet { get { - return ResourceManager.GetString("EnterValidPortOrPortRange", resourceCulture); + return ResourceManager.GetString("EnterSubnetsToCreateAWideSubnet", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid subnet (like 192.168.178.133/26)! ähnelt. + /// Looks up a localized string similar to Enter a valid baud!. /// - public static string EnterValidSubnet { + public static string EnterValidBaud { get { - return ResourceManager.GetString("EnterValidSubnet", resourceCulture); + return ResourceManager.GetString("EnterValidBaud", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid subnetmask (like 255.255.255.0)! ähnelt. + /// Looks up a localized string similar to Enter a valid domain (e.g., "example.com")!. /// - public static string EnterValidSubnetmask { + public static string EnterValidDomain { get { - return ResourceManager.GetString("EnterValidSubnetmask", resourceCulture); + return ResourceManager.GetString("EnterValidDomain", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid subnetmask or CIDR (like 255.255.255.0 or /24)! ähnelt. + /// Looks up a localized string similar to Enter a valid file name!. /// - public static string EnterValidSubnetmaskOrCIDR { + public static string EnterValidFileName { get { - return ResourceManager.GetString("EnterValidSubnetmaskOrCIDR", resourceCulture); + return ResourceManager.GetString("EnterValidFileName", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid value between 25 and 100! ähnelt. + /// Looks up a localized string similar to Enter a valid file path!. /// - public static string EnterValidValueBetween25and100 { + public static string EnterValidFilePath { get { - return ResourceManager.GetString("EnterValidValueBetween25and100", resourceCulture); + return ResourceManager.GetString("EnterValidFilePath", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid website (like https://example.com/index.html) ähnelt. + /// Looks up a localized string similar to Enter a valid IP address, subnet (e.g. 10.0.0.0/8), range (e.g. 10.0.0.1-10.0.0.10), or keyword (Any, LocalSubnet, DNS, DHCP, WINS, DefaultGateway, Internet, Intranet, IntranetRemoteAccess, PlayToDevice, CaptivePortal). /// - public static string EnterValidWebsiteUri { + public static string EnterValidFirewallAddress { get { - return ResourceManager.GetString("EnterValidWebsiteUri", resourceCulture); + return ResourceManager.GetString("EnterValidFirewallAddress", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Error ähnelt. + /// Looks up a localized string similar to Enter a valid folder path!. /// - public static string Error { + public static string EnterValidFolderPath { get { - return ResourceManager.GetString("Error", resourceCulture); + return ResourceManager.GetString("EnterValidFolderPath", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Couldn't connect to 'api.github.com', check your network connection! ähnelt. + /// Looks up a localized string similar to Enter a valid hostname!. /// - public static string ErrorCheckingApiGithubComVerifyYourNetworkConnection { + public static string EnterValidHostname { get { - return ResourceManager.GetString("ErrorCheckingApiGithubComVerifyYourNetworkConnection", resourceCulture); + return ResourceManager.GetString("EnterValidHostname", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Error in response! ähnelt. + /// Looks up a localized string similar to Enter a valid hostname and port!. /// - public static string ErrorInResponse { + public static string EnterValidHostnameAndPort { get { - return ResourceManager.GetString("ErrorInResponse", resourceCulture); + return ResourceManager.GetString("EnterValidHostnameAndPort", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Error in response! Check if you have write permissions. ähnelt. + /// Looks up a localized string similar to Enter a valid hostname (e.g., "server-01" or "example.com") or a valid IP address (e.g., 192.168.178.1)!. /// - public static string ErrorInResponseCheckIfYouHaveWritePermissions { + public static string EnterValidHostnameOrIPAddress { get { - return ResourceManager.GetString("ErrorInResponseCheckIfYouHaveWritePermissions", resourceCulture); + return ResourceManager.GetString("EnterValidHostnameOrIPAddress", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die The name is already used! ähnelt. + /// Looks up a localized string similar to Enter valid hosts (multiple hosts can not end with ";")!. /// - public static string ErrorMessage_NameIsAlreadyUsed { + public static string EnterValidHosts { get { - return ResourceManager.GetString("ErrorMessage_NameIsAlreadyUsed", resourceCulture); + return ResourceManager.GetString("EnterValidHosts", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Everything ähnelt. + /// Looks up a localized string similar to Enter a valid hostname (e.g., "server-01" or "example.com")! Multiple hostnames can be separated with a space.. /// - public static string Everything { + public static string EnterValidHostsFileEntryHostname { get { - return ResourceManager.GetString("Everything", resourceCulture); + return ResourceManager.GetString("EnterValidHostsFileEntryHostname", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Customer 1 ähnelt. + /// Looks up a localized string similar to Enter a valid IP address!. /// - public static string ExampleProfileFileName { + public static string EnterValidIPAddress { get { - return ResourceManager.GetString("ExampleProfileFileName", resourceCulture); + return ResourceManager.GetString("EnterValidIPAddress", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Execution Policy ähnelt. + /// Looks up a localized string similar to Enter a valid IP range!. /// - public static string ExecutionPolicy { + public static string EnterValidIPScanRange { get { - return ResourceManager.GetString("ExecutionPolicy", resourceCulture); + return ResourceManager.GetString("EnterValidIPScanRange", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Expand ähnelt. + /// Looks up a localized string similar to Enter a valid IPv4 address!. /// - public static string Expand { + public static string EnterValidIPv4Address { get { - return ResourceManager.GetString("Expand", resourceCulture); + return ResourceManager.GetString("EnterValidIPv4Address", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Experience ähnelt. + /// Looks up a localized string similar to Enter a valid IPv6 address!. /// - public static string Experience { + public static string EnterValidIPv6Address { get { - return ResourceManager.GetString("Experience", resourceCulture); + return ResourceManager.GetString("EnterValidIPv6Address", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Export ähnelt. + /// Looks up a localized string similar to Enter a valid MAC address (e.g., 00:F1:23:AB:F2:35)!. /// - public static string Export { + public static string EnterValidMACAddress { get { - return ResourceManager.GetString("Export", resourceCulture); + return ResourceManager.GetString("EnterValidMACAddress", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Export all ähnelt. + /// Looks up a localized string similar to Enter a valid number!. /// - public static string ExportAll { + public static string EnterValidNumber { get { - return ResourceManager.GetString("ExportAll", resourceCulture); + return ResourceManager.GetString("EnterValidNumber", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Export... ähnelt. + /// Looks up a localized string similar to Enter a valid OID!. /// - public static string ExportDots { + public static string EnterValidOID { get { - return ResourceManager.GetString("ExportDots", resourceCulture); + return ResourceManager.GetString("EnterValidOID", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Export selected ähnelt. + /// Looks up a localized string similar to Enter a valid port (1 - 65535)!. /// - public static string ExportSelected { + public static string EnterValidPort { get { - return ResourceManager.GetString("ExportSelected", resourceCulture); + return ResourceManager.GetString("EnterValidPort", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die A Simple Public IP Address API ähnelt. + /// Looks up a localized string similar to Enter a valid port and/or port range (1 - 65535)!. /// - public static string ExternalService_ipify_Description { + public static string EnterValidPortOrPortRange { get { - return ResourceManager.GetString("ExternalService_ipify_Description", resourceCulture); + return ResourceManager.GetString("EnterValidPortOrPortRange", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die External services ähnelt. + /// Looks up a localized string similar to Enter a valid subnet (e.g., 192.168.178.133/26)!. /// - public static string ExternalServices { + public static string EnterValidSubnet { get { - return ResourceManager.GetString("ExternalServices", resourceCulture); + return ResourceManager.GetString("EnterValidSubnet", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Field cannot be empty! ähnelt. + /// Looks up a localized string similar to Enter a valid subnetmask (e.g., 255.255.255.0)!. /// - public static string FieldCannotBeEmpty { + public static string EnterValidSubnetmask { get { - return ResourceManager.GetString("FieldCannotBeEmpty", resourceCulture); + return ResourceManager.GetString("EnterValidSubnetmask", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die File ähnelt. + /// Looks up a localized string similar to Enter a valid subnetmask or CIDR (e.g., 255.255.255.0 or /24)!. /// - public static string File { + public static string EnterValidSubnetmaskOrCIDR { get { - return ResourceManager.GetString("File", resourceCulture); + return ResourceManager.GetString("EnterValidSubnetmaskOrCIDR", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die File does not exists! ähnelt. + /// Looks up a localized string similar to Enter a valid Windows username (e.g., "user", "DOMAIN\user" or "user@domain.com")!. /// - public static string FileDoesNotExist { + public static string EnterValidUsername { get { - return ResourceManager.GetString("FileDoesNotExist", resourceCulture); + return ResourceManager.GetString("EnterValidUsername", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die File exported to "{0}"! ähnelt. + /// Looks up a localized string similar to Enter a valid website (e.g., https://example.com/index.html). /// - public static string FileExportedToXX { + public static string EnterValidWebsiteUri { get { - return ResourceManager.GetString("FileExportedToXX", resourceCulture); + return ResourceManager.GetString("EnterValidWebsiteUri", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die File path ähnelt. + /// Looks up a localized string similar to Entries. /// - public static string FilePath { + public static string Entries { get { - return ResourceManager.GetString("FilePath", resourceCulture); + return ResourceManager.GetString("Entries", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Filter ähnelt. + /// Looks up a localized string similar to Error. /// - public static string Filter { + public static string Error { get { - return ResourceManager.GetString("Filter", resourceCulture); + return ResourceManager.GetString("Error", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Filter... ähnelt. + /// Looks up a localized string similar to Couldn't connect to 'api.github.com', check your network connection!. /// - public static string FilterDots { + public static string ErrorCheckingApiGithubComVerifyYourNetworkConnection { get { - return ResourceManager.GetString("FilterDots", resourceCulture); + return ResourceManager.GetString("ErrorCheckingApiGithubComVerifyYourNetworkConnection", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Thanks for using NETworkManager! - /// - ///To provide additional features the application uses services on the Internet that are not operated by me. No data will be sent to me at any time. ähnelt. + /// Looks up a localized string similar to Error in response!. /// - public static string FirstRunMessage { + public static string ErrorInResponse { get { - return ResourceManager.GetString("FirstRunMessage", resourceCulture); + return ResourceManager.GetString("ErrorInResponse", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die First usable IP address ähnelt. + /// Looks up a localized string similar to Error in response! Check if you have write permissions.. /// - public static string FirstUsableIPAddress { + public static string ErrorInResponseCheckIfYouHaveWritePermissions { get { - return ResourceManager.GetString("FirstUsableIPAddress", resourceCulture); + return ResourceManager.GetString("ErrorInResponseCheckIfYouHaveWritePermissions", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Fixed screen size: ähnelt. + /// Looks up a localized string similar to The name is already used!. /// - public static string FixedScreenSize { + public static string ErrorMessage_NameIsAlreadyUsed { get { - return ResourceManager.GetString("FixedScreenSize", resourceCulture); + return ResourceManager.GetString("ErrorMessage_NameIsAlreadyUsed", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Flush DNS cache ähnelt. + /// Looks up a localized string similar to The settings on this page contain errors. Correct them to be able to save.. /// - public static string FlushDNSCache { + public static string ErrorMessage_TabPageHasError { get { - return ResourceManager.GetString("FlushDNSCache", resourceCulture); + return ResourceManager.GetString("ErrorMessage_TabPageHasError", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Folder does not exists! ähnelt. + /// Looks up a localized string similar to Error while scanning WiFi adapter "{0}" with error: "{1}". /// - public static string FolderDoesNotExist { + public static string ErrorWhileScanningWiFiAdapterXXXWithErrorXXX { get { - return ResourceManager.GetString("FolderDoesNotExist", resourceCulture); + return ResourceManager.GetString("ErrorWhileScanningWiFiAdapterXXXWithErrorXXX", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Font smoothing ähnelt. + /// Looks up a localized string similar to Everything. /// - public static string FontSmoothing { + public static string Everything { get { - return ResourceManager.GetString("FontSmoothing", resourceCulture); + return ResourceManager.GetString("Everything", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Format ähnelt. + /// Looks up a localized string similar to Linux servers running in AWS.... /// - public static string Format { + public static string ExampleGroupDescription { get { - return ResourceManager.GetString("Format", resourceCulture); + return ResourceManager.GetString("ExampleGroupDescription", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Found ähnelt. + /// Looks up a localized string similar to Primary DNS server. /// - public static string Found { + public static string ExampleHostsFileEntryComment { get { - return ResourceManager.GetString("Found", resourceCulture); + return ResourceManager.GetString("ExampleHostsFileEntryComment", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Frequency ähnelt. + /// Looks up a localized string similar to Ubuntu Server running Docker with Nextcloud and Traefik.... /// - public static string Frequency { + public static string ExampleProfileDescription { get { - return ResourceManager.GetString("Frequency", resourceCulture); + return ResourceManager.GetString("ExampleProfileDescription", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Fullscreen ähnelt. + /// Looks up a localized string similar to Customer 1. /// - public static string Fullscreen { + public static string ExampleProfileFileName { get { - return ResourceManager.GetString("Fullscreen", resourceCulture); + return ResourceManager.GetString("ExampleProfileFileName", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Gateway ähnelt. + /// Looks up a localized string similar to production. /// - public static string Gateway { + public static string ExampleTag { get { - return ResourceManager.GetString("Gateway", resourceCulture); + return ResourceManager.GetString("ExampleTag", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Gateway / Router ähnelt. + /// Looks up a localized string similar to Exclude disabled accounts. /// - public static string GatewayRouter { + public static string ExcludeDisabledAccounts { get { - return ResourceManager.GetString("GatewayRouter", resourceCulture); + return ResourceManager.GetString("ExcludeDisabledAccounts", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die General ähnelt. + /// Looks up a localized string similar to Execution Policy. /// - public static string General { + public static string ExecutionPolicy { get { - return ResourceManager.GetString("General", resourceCulture); + return ResourceManager.GetString("ExecutionPolicy", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die 2.4 GHz ähnelt. + /// Looks up a localized string similar to Existing or new group name. /// - public static string GHz2dot4 { + public static string ExistingOrNewGroupDots { get { - return ResourceManager.GetString("GHz2dot4", resourceCulture); + return ResourceManager.GetString("ExistingOrNewGroupDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die 5 GHz ähnelt. + /// Looks up a localized string similar to Expand. /// - public static string GHz5 { + public static string Expand { get { - return ResourceManager.GetString("GHz5", resourceCulture); + return ResourceManager.GetString("Expand", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Got "{0}" as public ip address from "{1}"! ähnelt. + /// Looks up a localized string similar to Expand all. /// - public static string GotXXXAsPublicIPAddressFromXXXMessage { + public static string ExpandAll { get { - return ResourceManager.GetString("GotXXXAsPublicIPAddressFromXXXMessage", resourceCulture); + return ResourceManager.GetString("ExpandAll", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Green ähnelt. + /// Looks up a localized string similar to Expand and open search.... /// - public static string Green { + public static string ExpandAndOpenSearchDots { get { - return ResourceManager.GetString("Green", resourceCulture); + return ResourceManager.GetString("ExpandAndOpenSearchDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Group ähnelt. + /// Looks up a localized string similar to Expand host view. /// - public static string Group { + public static string ExpandHostView { get { - return ResourceManager.GetString("Group", resourceCulture); + return ResourceManager.GetString("ExpandHostView", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Groups ähnelt. + /// Looks up a localized string similar to Expand map view. /// - public static string Groups { + public static string ExpandMapView { get { - return ResourceManager.GetString("Groups", resourceCulture); + return ResourceManager.GetString("ExpandMapView", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Headers ähnelt. + /// Looks up a localized string similar to Experience. /// - public static string Headers { + public static string Experience { get { - return ResourceManager.GetString("Headers", resourceCulture); + return ResourceManager.GetString("Experience", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Height ähnelt. + /// Looks up a localized string similar to Experimental. /// - public static string Height { + public static string Experimental { get { - return ResourceManager.GetString("Height", resourceCulture); + return ResourceManager.GetString("Experimental", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Help ähnelt. + /// Looks up a localized string similar to Experimental features. /// - public static string Help { + public static string ExperimentalFeatures { get { - return ResourceManager.GetString("Help", resourceCulture); + return ResourceManager.GetString("ExperimentalFeatures", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die The background job will save settings, profiles and credentials every x-minutes. - /// - ///Value 0 will disable this feature. - /// - ///Changing this value requires a restart of the application to take effect. ähnelt. + /// Looks up a localized string similar to Export. /// - public static string HelpMessage_BackgroundJob { + public static string Export { get { - return ResourceManager.GetString("HelpMessage_BackgroundJob", resourceCulture); + return ResourceManager.GetString("Export", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die When starting the program, it checks in the background whether a new program version is available on GitHub. - /// - ///URL: https://api.github.com/ ähnelt. + /// Looks up a localized string similar to Export all. /// - public static string HelpMessage_CheckForUpdatesAtStartup { + public static string ExportAll { get { - return ResourceManager.GetString("HelpMessage_CheckForUpdatesAtStartup", resourceCulture); + return ResourceManager.GetString("ExportAll", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die The public IP address is determined via ipify.org. - /// - ///URL: https://api.ipify.org and https://api6.ipify.org ähnelt. + /// Looks up a localized string similar to Export.... /// - public static string HelpMessage_CheckPublicIPAddress { + public static string ExportDots { get { - return ResourceManager.GetString("HelpMessage_CheckPublicIPAddress", resourceCulture); + return ResourceManager.GetString("ExportDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Decrypt and load your credentials to select them. ähnelt. + /// Looks up a localized string similar to Export selected. /// - public static string HelpMessage_Credentials { + public static string ExportSelected { get { - return ResourceManager.GetString("HelpMessage_Credentials", resourceCulture); + return ResourceManager.GetString("ExportSelected", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die The following variables are available: - /// - ///$$ipaddress$$ --> IP adresse - ///$$hostname$$ --> Hostname ähnelt. + /// Looks up a localized string similar to IP Geolocation API - Fast, accurate, reliable. /// - public static string HelpMessage_CustomCommandVariables { + public static string ExternalService_ip_api_Description { get { - return ResourceManager.GetString("HelpMessage_CustomCommandVariables", resourceCulture); + return ResourceManager.GetString("ExternalService_ip_api_Description", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die URL to a web service that can be reached via http or https and returns an IP address as response. ähnelt. + /// Looks up a localized string similar to A Simple Public IP Address API. /// - public static string HelpMessage_CustomPublicIPAddressAPI { + public static string ExternalService_ipify_Description { get { - return ResourceManager.GetString("HelpMessage_CustomPublicIPAddressAPI", resourceCulture); + return ResourceManager.GetString("ExternalService_ipify_Description", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Application that is displayed at startup. ähnelt. + /// Looks up a localized string similar to Speed test service used to measure download speed, upload speed, latency, and jitter.. /// - public static string HelpMessage_ParameterApplication { + public static string ExternalService_speed_cloudflare_Description { get { - return ResourceManager.GetString("HelpMessage_ParameterApplication", resourceCulture); + return ResourceManager.GetString("ExternalService_speed_cloudflare_Description", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Displays this dialog. ähnelt. + /// Looks up a localized string similar to External services. /// - public static string HelpMessage_ParameterHelp { + public static string ExternalServices { get { - return ResourceManager.GetString("HelpMessage_ParameterHelp", resourceCulture); + return ResourceManager.GetString("ExternalServices", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Resets all application settings. ähnelt. + /// Looks up a localized string similar to Failed to load firewall rules. {0}. /// - public static string HelpMessage_ParameterResetSettings { + public static string FailedToLoadFirewallRulesMessage { get { - return ResourceManager.GetString("HelpMessage_ParameterResetSettings", resourceCulture); + return ResourceManager.GetString("FailedToLoadFirewallRulesMessage", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die The password is not displayed when editing, but can be overwritten. ähnelt. + /// Looks up a localized string similar to Failed to load hosts file: {0}. /// - public static string HelpMessage_PasswordNotDisplayedCanBeOverwritten { + public static string FailedToLoadHostsFileMessage { get { - return ResourceManager.GetString("HelpMessage_PasswordNotDisplayedCanBeOverwritten", resourceCulture); + return ResourceManager.GetString("FailedToLoadHostsFileMessage", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Public accessible IPv4 address. ähnelt. + /// Looks up a localized string similar to Fetching metadata.... /// - public static string HelpMessage_PublicIPv4Address { + public static string FetchingMetadataDots { get { - return ResourceManager.GetString("HelpMessage_PublicIPv4Address", resourceCulture); + return ResourceManager.GetString("FetchingMetadataDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Public accessible IPv6 address. ähnelt. + /// Looks up a localized string similar to Field cannot be empty!. /// - public static string HelpMessage_PublicIPv6Address { + public static string FieldCannotBeEmpty { get { - return ResourceManager.GetString("HelpMessage_PublicIPv6Address", resourceCulture); + return ResourceManager.GetString("FieldCannotBeEmpty", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die [0] If server authentication fails, connect to the computer without warning. - ///[1] If server authentication fails, do not establish a connection. - ///[2] If server authentication fails, show a warning and allow me to connect or refuse the connection. - ///[3] No authentication requirement is specified. ähnelt. + /// Looks up a localized string similar to File. /// - public static string HelpMessage_RDPAuthenticationLevel { + public static string File { get { - return ResourceManager.GetString("HelpMessage_RDPAuthenticationLevel", resourceCulture); + return ResourceManager.GetString("File", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Tags help you organize profiles/Profiles by topics/projects. Multiple tags can be used with ";" be separated. Search by tags with "tag=xxx". ähnelt. + /// Looks up a localized string similar to File does not exists!. /// - public static string HelpMessage_Tags { + public static string FileDoesNotExist { get { - return ResourceManager.GetString("HelpMessage_Tags", resourceCulture); + return ResourceManager.GetString("FileDoesNotExist", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Hidden applications ähnelt. + /// Looks up a localized string similar to File exported to "{0}"!. /// - public static string HiddenApplications { + public static string FileExportedToXX { get { - return ResourceManager.GetString("HiddenApplications", resourceCulture); + return ResourceManager.GetString("FileExportedToXX", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Hidden Network ähnelt. + /// Looks up a localized string similar to File path. /// - public static string HiddenNetwork { + public static string FilePath { get { - return ResourceManager.GetString("HiddenNetwork", resourceCulture); + return ResourceManager.GetString("FilePath", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Hide ähnelt. + /// Looks up a localized string similar to Filter. /// - public static string Hide { + public static string Filter { get { - return ResourceManager.GetString("Hide", resourceCulture); + return ResourceManager.GetString("Filter", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Highlight timeouts ähnelt. + /// Looks up a localized string similar to Filter by tags. /// - public static string HighlightTimeouts { + public static string FilterByTags { get { - return ResourceManager.GetString("HighlightTimeouts", resourceCulture); + return ResourceManager.GetString("FilterByTags", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die History ähnelt. + /// Looks up a localized string similar to Filter.... /// - public static string History { + public static string FilterDots { get { - return ResourceManager.GetString("History", resourceCulture); + return ResourceManager.GetString("FilterDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Hop ähnelt. + /// Looks up a localized string similar to Filter profiles.... /// - public static string Hop { + public static string FilterProfilesDots { get { - return ResourceManager.GetString("Hop", resourceCulture); + return ResourceManager.GetString("FilterProfilesDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Hops ähnelt. + /// Looks up a localized string similar to Firewall. /// - public static string Hops { + public static string Firewall { get { - return ResourceManager.GetString("Hops", resourceCulture); + return ResourceManager.GetString("Firewall", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Host ähnelt. + /// Looks up a localized string similar to Read-only mode. Modifying firewall rules requires elevated rights!. /// - public static string Host { + public static string FirewallAdminMessage { get { - return ResourceManager.GetString("Host", resourceCulture); + return ResourceManager.GetString("FirewallAdminMessage", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Hostname ähnelt. + /// Looks up a localized string similar to Any. /// - public static string Hostname { + public static string FirewallInterfaceType_Any { get { - return ResourceManager.GetString("Hostname", resourceCulture); + return ResourceManager.GetString("FirewallInterfaceType_Any", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Hostname or IP address ähnelt. + /// Looks up a localized string similar to Remote access. /// - public static string HostnameOrIPAddress { + public static string FirewallInterfaceType_RemoteAccess { get { - return ResourceManager.GetString("HostnameOrIPAddress", resourceCulture); + return ResourceManager.GetString("FirewallInterfaceType_RemoteAccess", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Hosts ähnelt. + /// Looks up a localized string similar to Wired. /// - public static string Hosts { + public static string FirewallInterfaceType_Wired { get { - return ResourceManager.GetString("Hosts", resourceCulture); + return ResourceManager.GetString("FirewallInterfaceType_Wired", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Host threads ähnelt. + /// Looks up a localized string similar to Wireless. /// - public static string HostThreads { + public static string FirewallInterfaceType_Wireless { get { - return ResourceManager.GetString("HostThreads", resourceCulture); + return ResourceManager.GetString("FirewallInterfaceType_Wireless", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die HotKeys ähnelt. + /// Looks up a localized string similar to Any. /// - public static string HotKeys { + public static string FirewallProtocol_Any { get { - return ResourceManager.GetString("HotKeys", resourceCulture); + return ResourceManager.GetString("FirewallProtocol_Any", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die HTTP Headers ähnelt. + /// Looks up a localized string similar to GRE. /// - public static string HTTPHeaders { + public static string FirewallProtocol_GRE { get { - return ResourceManager.GetString("HTTPHeaders", resourceCulture); + return ResourceManager.GetString("FirewallProtocol_GRE", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die ICMPv4 ähnelt. + /// Looks up a localized string similar to HOPOPT. /// - public static string ICMPv4 { + public static string FirewallProtocol_HOPOPT { get { - return ResourceManager.GetString("ICMPv4", resourceCulture); + return ResourceManager.GetString("FirewallProtocol_HOPOPT", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die ICMPv6 ähnelt. + /// Looks up a localized string similar to ICMPv4. /// - public static string ICMPv6 { + public static string FirewallProtocol_ICMPv4 { get { - return ResourceManager.GetString("ICMPv6", resourceCulture); + return ResourceManager.GetString("FirewallProtocol_ICMPv4", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die ID ähnelt. + /// Looks up a localized string similar to ICMPv6. /// - public static string ID { + public static string FirewallProtocol_ICMPv6 { get { - return ResourceManager.GetString("ID", resourceCulture); + return ResourceManager.GetString("FirewallProtocol_ICMPv6", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Import ähnelt. + /// Looks up a localized string similar to IPv6. /// - public static string Import { + public static string FirewallProtocol_IPv6 { get { - return ResourceManager.GetString("Import", resourceCulture); + return ResourceManager.GetString("FirewallProtocol_IPv6", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Import / Export ähnelt. + /// Looks up a localized string similar to IPv6-Frag. /// - public static string ImportExport { + public static string FirewallProtocol_IPv6_Frag { get { - return ResourceManager.GetString("ImportExport", resourceCulture); + return ResourceManager.GetString("FirewallProtocol_IPv6_Frag", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Indigo ähnelt. + /// Looks up a localized string similar to IPv6-NoNxt. /// - public static string Indigo { + public static string FirewallProtocol_IPv6_NoNxt { get { - return ResourceManager.GetString("Indigo", resourceCulture); + return ResourceManager.GetString("FirewallProtocol_IPv6_NoNxt", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Information ähnelt. + /// Looks up a localized string similar to IPv6-Opts. /// - public static string Information { + public static string FirewallProtocol_IPv6_Opts { get { - return ResourceManager.GetString("Information", resourceCulture); + return ResourceManager.GetString("FirewallProtocol_IPv6_Opts", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Infrastructure ähnelt. + /// Looks up a localized string similar to IPv6-Route. /// - public static string Infrastructure { + public static string FirewallProtocol_IPv6_Route { get { - return ResourceManager.GetString("Infrastructure", resourceCulture); + return ResourceManager.GetString("FirewallProtocol_IPv6_Route", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Inherit host from general ähnelt. + /// Looks up a localized string similar to L2TP. /// - public static string InheritHostFromGeneral { + public static string FirewallProtocol_L2TP { get { - return ResourceManager.GetString("InheritHostFromGeneral", resourceCulture); + return ResourceManager.GetString("FirewallProtocol_L2TP", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Interface ähnelt. + /// Looks up a localized string similar to PGM. /// - public static string Interface { + public static string FirewallProtocol_PGM { get { - return ResourceManager.GetString("Interface", resourceCulture); + return ResourceManager.GetString("FirewallProtocol_PGM", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Internet ähnelt. + /// Looks up a localized string similar to TCP. /// - public static string Internet { + public static string FirewallProtocol_TCP { get { - return ResourceManager.GetString("Internet", resourceCulture); + return ResourceManager.GetString("FirewallProtocol_TCP", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die IP address ähnelt. + /// Looks up a localized string similar to UDP. /// - public static string IPAddress { + public static string FirewallProtocol_UDP { get { - return ResourceManager.GetString("IPAddress", resourceCulture); + return ResourceManager.GetString("FirewallProtocol_UDP", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die IP addresses ähnelt. + /// Looks up a localized string similar to VRRP. /// - public static string IPAddresses { + public static string FirewallProtocol_VRRP { get { - return ResourceManager.GetString("IPAddresses", resourceCulture); + return ResourceManager.GetString("FirewallProtocol_VRRP", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die IP address to detect local ip address based on routing ähnelt. + /// Looks up a localized string similar to Allow. /// - public static string IPAddressToDetectLocalIPAddressBasedOnRouting { + public static string FirewallRuleAction_Allow { get { - return ResourceManager.GetString("IPAddressToDetectLocalIPAddressBasedOnRouting", resourceCulture); + return ResourceManager.GetString("FirewallRuleAction_Allow", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die IP range ähnelt. + /// Looks up a localized string similar to Block. /// - public static string IPRange { + public static string FirewallRuleAction_Block { get { - return ResourceManager.GetString("IPRange", resourceCulture); + return ResourceManager.GetString("FirewallRuleAction_Block", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die IP Scanner ähnelt. + /// Looks up a localized string similar to Inbound. /// - public static string IPScanner { + public static string FirewallRuleDirection_Inbound { get { - return ResourceManager.GetString("IPScanner", resourceCulture); + return ResourceManager.GetString("FirewallRuleDirection_Inbound", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Destination host unreachable. ähnelt. + /// Looks up a localized string similar to Outbound. /// - public static string IPStatus_DestinationHostUnreachable { + public static string FirewallRuleDirection_Outbound { get { - return ResourceManager.GetString("IPStatus_DestinationHostUnreachable", resourceCulture); + return ResourceManager.GetString("FirewallRuleDirection_Outbound", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Destination network unreachable. ähnelt. + /// Looks up a localized string similar to Firewall rules. /// - public static string IPStatus_DestinationNetworkUnreachable { + public static string FirewallRules { get { - return ResourceManager.GetString("IPStatus_DestinationNetworkUnreachable", resourceCulture); + return ResourceManager.GetString("FirewallRules", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Destination port unreachable. ähnelt. + /// Looks up a localized string similar to First usable IP address. /// - public static string IPStatus_DestinationPortUnreachable { + public static string FirstUsableIPAddress { get { - return ResourceManager.GetString("IPStatus_DestinationPortUnreachable", resourceCulture); + return ResourceManager.GetString("FirstUsableIPAddress", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Success ähnelt. + /// Looks up a localized string similar to Fixed screen size:. /// - public static string IPStatus_Success { + public static string FixedScreenSize { get { - return ResourceManager.GetString("IPStatus_Success", resourceCulture); + return ResourceManager.GetString("FixedScreenSize", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Request timed out. ähnelt. + /// Looks up a localized string similar to Flush DNS cache. /// - public static string IPStatus_TimedOut { + public static string FlushDNSCache { get { - return ResourceManager.GetString("IPStatus_TimedOut", resourceCulture); + return ResourceManager.GetString("FlushDNSCache", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die TTL expired in transit. ähnelt. + /// Looks up a localized string similar to DNS cache flushed. /// - public static string IPStatus_TtlExpired { + public static string FlushDNSCacheSuccessfully { get { - return ResourceManager.GetString("IPStatus_TtlExpired", resourceCulture); + return ResourceManager.GetString("FlushDNSCacheSuccessfully", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die IPv4 ähnelt. + /// Looks up a localized string similar to Folder does not exists!. /// - public static string IPv4 { + public static string FolderDoesNotExist { get { - return ResourceManager.GetString("IPv4", resourceCulture); + return ResourceManager.GetString("FolderDoesNotExist", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die IPv4 address ähnelt. + /// Looks up a localized string similar to Font smoothing. /// - public static string IPv4Address { + public static string FontSmoothing { get { - return ResourceManager.GetString("IPv4Address", resourceCulture); + return ResourceManager.GetString("FontSmoothing", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die IPv4-Default-Gateway ähnelt. + /// Looks up a localized string similar to Format. /// - public static string IPv4DefaultGateway { + public static string Format { get { - return ResourceManager.GetString("IPv4DefaultGateway", resourceCulture); + return ResourceManager.GetString("Format", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die IPv4 protocol available ähnelt. + /// Looks up a localized string similar to Found. /// - public static string IPv4ProtocolAvailable { + public static string Found { get { - return ResourceManager.GetString("IPv4ProtocolAvailable", resourceCulture); + return ResourceManager.GetString("Found", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die IPv6 ähnelt. + /// Looks up a localized string similar to Frequency. /// - public static string IPv6 { + public static string Frequency { get { - return ResourceManager.GetString("IPv6", resourceCulture); + return ResourceManager.GetString("Frequency", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die IPv6 address ähnelt. + /// Looks up a localized string similar to (from profile). /// - public static string IPv6Address { + public static string FromProfile { get { - return ResourceManager.GetString("IPv6Address", resourceCulture); + return ResourceManager.GetString("FromProfile", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Link-local IPv6 address ähnelt. + /// Looks up a localized string similar to Fullscreen. /// - public static string IPv6AddressLinkLocal { + public static string Fullscreen { get { - return ResourceManager.GetString("IPv6AddressLinkLocal", resourceCulture); + return ResourceManager.GetString("Fullscreen", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die IPv6-Default-Gateway ähnelt. + /// Looks up a localized string similar to Gateway. /// - public static string IPv6DefaultGateway { + public static string Gateway { get { - return ResourceManager.GetString("IPv6DefaultGateway", resourceCulture); + return ResourceManager.GetString("Gateway", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die IPv6 protocol available ähnelt. + /// Looks up a localized string similar to Gateway / Router. /// - public static string IPv6ProtocolAvailable { + public static string GatewayRouter { get { - return ResourceManager.GetString("IPv6ProtocolAvailable", resourceCulture); + return ResourceManager.GetString("GatewayRouter", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Is encrypted ähnelt. + /// Looks up a localized string similar to Gateway server. /// - public static string IsEncrypted { + public static string GatewayServer { get { - return ResourceManager.GetString("IsEncrypted", resourceCulture); + return ResourceManager.GetString("GatewayServer", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Keyboard ähnelt. + /// Looks up a localized string similar to General. /// - public static string Keyboard { + public static string General { get { - return ResourceManager.GetString("Keyboard", resourceCulture); + return ResourceManager.GetString("General", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Keyboard shortcuts ähnelt. + /// Looks up a localized string similar to Geolocation. /// - public static string KeyboardShortcuts { + public static string Geolocation { get { - return ResourceManager.GetString("KeyboardShortcuts", resourceCulture); + return ResourceManager.GetString("Geolocation", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Key must have 8 characters or more! ähnelt. + /// Looks up a localized string similar to 2.4 GHz. /// - public static string KeyMustHave8CharactersOrMore { + public static string GHz2dot4 { get { - return ResourceManager.GetString("KeyMustHave8CharactersOrMore", resourceCulture); + return ResourceManager.GetString("GHz2dot4", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Language ähnelt. + /// Looks up a localized string similar to 2.4 & 5 GHz. /// - public static string Language { + public static string GHz2dot4And5 { get { - return ResourceManager.GetString("Language", resourceCulture); + return ResourceManager.GetString("GHz2dot4And5", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Last scan at {0} ähnelt. + /// Looks up a localized string similar to 5 GHz. /// - public static string LastScanAtX { + public static string GHz5 { get { - return ResourceManager.GetString("LastScanAtX", resourceCulture); + return ResourceManager.GetString("GHz5", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Last usable IP address ähnelt. + /// Looks up a localized string similar to 6 GHz. /// - public static string LastUsableIPAddress { + public static string GHz6 { get { - return ResourceManager.GetString("LastUsableIPAddress", resourceCulture); + return ResourceManager.GetString("GHz6", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Libraries ähnelt. + /// Looks up a localized string similar to Gigabits. /// - public static string Libraries { + public static string Gigabits { get { - return ResourceManager.GetString("Libraries", resourceCulture); + return ResourceManager.GetString("Gigabits", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die AirspacePanel fixes all Airspace issues with WPF-hosted Winforms. ähnelt. + /// Looks up a localized string similar to Gigabytes. /// - public static string Library_AirspaceFixer_Description { + public static string Gigabytes { get { - return ResourceManager.GetString("Library_AirspaceFixer_Description", resourceCulture); + return ResourceManager.GetString("Gigabytes", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Shared Controlz for WPF and ... more ähnelt. + /// Looks up a localized string similar to Got "{0}" as public ip address from "{1}"!. /// - public static string Library_ControlzEx_Description { + public static string GotXXXAsPublicIPAddressFromXXXMessage { get { - return ResourceManager.GetString("Library_ControlzEx_Description", resourceCulture); + return ResourceManager.GetString("GotXXXAsPublicIPAddressFromXXXMessage", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die C#/WinRT provides packaged WinRT projection support for the C# language. ähnelt. + /// Looks up a localized string similar to Green. /// - public static string Library_CsWinRT_Description { + public static string Green { get { - return ResourceManager.GetString("Library_CsWinRT_Description", resourceCulture); + return ResourceManager.GetString("Green", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die DnsClient.NET is a simple yet very powerful and high performant open source library for the .NET Framework to do DNS lookups ähnelt. + /// Looks up a localized string similar to Group. /// - public static string Library_DnsClientNET_Description { + public static string Group { get { - return ResourceManager.GetString("Library_DnsClientNET_Description", resourceCulture); + return ResourceManager.GetString("Group", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Dragable and tearable tab control for WPF ähnelt. + /// Looks up a localized string similar to Group / domain. /// - public static string Library_Dragablz_Description { + public static string GroupDomain { get { - return ResourceManager.GetString("Library_Dragablz_Description", resourceCulture); + return ResourceManager.GetString("GroupDomain", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die C# library take care of complex network, IP, IPv4, IPv6, netmask, CIDR, subnet, subnetting, supernet, and supernetting calculation for .NET developers. ähnelt. + /// Looks up a localized string similar to Group name cannot start with "{0}"!. /// - public static string Library_IPNetwork_Description { + public static string GroupNameCannotStartWithX { get { - return ResourceManager.GetString("Library_IPNetwork_Description", resourceCulture); + return ResourceManager.GetString("GroupNameCannotStartWithX", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Simple, flexible, interactive & powerful charts, maps and gauges for .Net ähnelt. + /// Looks up a localized string similar to Groups. /// - public static string Library_LiveCharts_Description { + public static string Groups { get { - return ResourceManager.GetString("Library_LiveCharts_Description", resourceCulture); + return ResourceManager.GetString("Groups", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die A collection of loading indicators for WPF ähnelt. + /// Looks up a localized string similar to Headers. /// - public static string Library_LoadingIndicatorsWPF_Description { + public static string Headers { get { - return ResourceManager.GetString("Library_LoadingIndicatorsWPF_Description", resourceCulture); + return ResourceManager.GetString("Headers", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die A toolkit for creating Metro / Modern UI styled WPF apps. ähnelt. + /// Looks up a localized string similar to Height. /// - public static string Library_MahAppsMetro_Description { + public static string Height { get { - return ResourceManager.GetString("Library_MahAppsMetro_Description", resourceCulture); + return ResourceManager.GetString("Height", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Some awesome icons for WPF and UWP all together... ähnelt. + /// Looks up a localized string similar to Help. /// - public static string Library_MahAppsMetroIconPacks_Description { + public static string Help { get { - return ResourceManager.GetString("Library_MahAppsMetroIconPacks_Description", resourceCulture); + return ResourceManager.GetString("Help", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Json.NET is a popular high-performance JSON framework for .NET ähnelt. + /// Looks up a localized string similar to If you enable this option, the default PowerShell console settings in the registry under HKCU:\Console are overridden so that the PowerShell console window matches the application theme. This is a global system setting that may affect the appearance of the normal PowerShell window. + /// + ///Only the PowerShell consoles configured in the PowerShell settings are modified. Both Windows PowerShell and PWSH (PowerShell 7 and higher) are supported. + /// + ///Click in the upper right corner on the help / documentation button ( [rest of string was truncated]";. /// - public static string Library_NewtonsoftJson_Description { + public static string HelpMessage_ApplyThemeToPowerShellConsole { get { - return ResourceManager.GetString("Library_NewtonsoftJson_Description", resourceCulture); + return ResourceManager.GetString("HelpMessage_ApplyThemeToPowerShellConsole", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die A GitHub API client library for .NET ähnelt. + /// Looks up a localized string similar to The background job will save settings and profiles every x-minutes. + /// + ///Value 0 will disable this feature. + /// + ///Changes to this value will take effect after restarting the application.. /// - public static string Library_Octokit_Description { + public static string HelpMessage_BackgroundJob { get { - return ResourceManager.GetString("Library_Octokit_Description", resourceCulture); + return ResourceManager.GetString("HelpMessage_BackgroundJob", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Runtime for hosting PowerShell ähnelt. + /// Looks up a localized string similar to The DNS resolver is determined via ip-api.com. + /// + ///URL: https://edns.ip-api.com/. /// - public static string Library_PowerShellSDK_Description { + public static string HelpMessage_CheckDNSResolver { get { - return ResourceManager.GetString("Library_PowerShellSDK_Description", resourceCulture); + return ResourceManager.GetString("HelpMessage_CheckDNSResolver", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Capture and parse CDP and LLDP packets on local or remote computers ähnelt. + /// Looks up a localized string similar to When starting the program, it checks in the background whether a new program version is available on GitHub. + /// + ///URL: https://api.github.com/. /// - public static string Library_PSDicoveryProtocol_Description { + public static string HelpMessage_CheckForUpdatesAtStartup { get { - return ResourceManager.GetString("Library_PSDicoveryProtocol_Description", resourceCulture); + return ResourceManager.GetString("HelpMessage_CheckForUpdatesAtStartup", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Sharp SNMP Library - Open Source SNMP for .NET and Mono ähnelt. + /// Looks up a localized string similar to The IP geolocation is determined via ip-api.com. + /// + ///URL: http://ip-api.com/. /// - public static string Library_SharpSNMP_Description { + public static string HelpMessage_CheckIPGeolocation { get { - return ResourceManager.GetString("Library_SharpSNMP_Description", resourceCulture); + return ResourceManager.GetString("HelpMessage_CheckIPGeolocation", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die The WebView2 control enables you to embed web technologies (HTML, CSS, and JavaScript) in your native applications powered by Microsoft Edge (Chromium). ähnelt. + /// Looks up a localized string similar to The public IP address is determined via ipify.org. + /// + ///URL: https://api.ipify.org and https://api6.ipify.org. /// - public static string Library_WebView2_Description { + public static string HelpMessage_CheckPublicIPAddress { get { - return ResourceManager.GetString("Library_WebView2_Description", resourceCulture); + return ResourceManager.GetString("HelpMessage_CheckPublicIPAddress", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Easily add interactivity to your apps using XAML Behaviors for WPF. ähnelt. + /// Looks up a localized string similar to Decrypt and load your credentials to select them.. /// - public static string Library_XamlBehaviorsWpf_Description { + public static string HelpMessage_Credentials { get { - return ResourceManager.GetString("Library_XamlBehaviorsWpf_Description", resourceCulture); + return ResourceManager.GetString("HelpMessage_Credentials", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die License ähnelt. + /// Looks up a localized string similar to URL to a web service that can be reached via http or https and returns an IPv4 address e.g., "xx.xx.xx.xx" as response.. /// - public static string License { + public static string HelpMessage_CustomPublicIPv4AddressAPI { get { - return ResourceManager.GetString("License", resourceCulture); + return ResourceManager.GetString("HelpMessage_CustomPublicIPv4AddressAPI", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Apache License 2.0 ähnelt. + /// Looks up a localized string similar to URL to a web service that can be reached via http or https and returns an IPv6 address e.g., "xxxx:xx:xxx::xx" as response.. /// - public static string License_ApacheLicense2dot0 { + public static string HelpMessage_CustomPublicIPv6AddressAPI { get { - return ResourceManager.GetString("License_ApacheLicense2dot0", resourceCulture); + return ResourceManager.GetString("HelpMessage_CustomPublicIPv6AddressAPI", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die BSD-2-Clause ähnelt. + /// Looks up a localized string similar to Enable experimental features to test new functions. These are not yet complete, contain bugs, can crash the application and may change again until release.. /// - public static string License_BDS2Clause { + public static string HelpMessage_ExperimentalFeatures { get { - return ResourceManager.GetString("License_BDS2Clause", resourceCulture); + return ResourceManager.GetString("HelpMessage_ExperimentalFeatures", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Microsoft WebView2 License ähnelt. + /// Looks up a localized string similar to Number of backups that are retained before the oldest one is deleted.. /// - public static string License_MicrosoftWebView2License { + public static string HelpMessage_MaximumNumberOfBackups { get { - return ResourceManager.GetString("License_MicrosoftWebView2License", resourceCulture); + return ResourceManager.GetString("HelpMessage_MaximumNumberOfBackups", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die MIT License ähnelt. + /// Looks up a localized string similar to Number of consecutive failed pings (timeouts) required before a "Host is down" notification is shown. Higher values reduce noise from flapping hosts.. /// - public static string License_MITLicense { + public static string HelpMessage_NotificationFailureThreshold { get { - return ResourceManager.GetString("License_MITLicense", resourceCulture); + return ResourceManager.GetString("HelpMessage_NotificationFailureThreshold", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Unlicense ähnelt. + /// Looks up a localized string similar to Number of consecutive successful pings required before a "Host is up" notification is shown. Higher values reduce noise from flapping hosts.. /// - public static string License_Unlicense { + public static string HelpMessage_NotificationSuccessThreshold { get { - return ResourceManager.GetString("License_Unlicense", resourceCulture); + return ResourceManager.GetString("HelpMessage_NotificationSuccessThreshold", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Lime ähnelt. + /// Looks up a localized string similar to Application that is displayed at startup.. /// - public static string Lime { + public static string HelpMessage_ParameterApplication { get { - return ResourceManager.GetString("Lime", resourceCulture); + return ResourceManager.GetString("HelpMessage_ParameterApplication", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Listeners ähnelt. + /// Looks up a localized string similar to Displays this dialog.. /// - public static string Listeners { + public static string HelpMessage_ParameterHelp { get { - return ResourceManager.GetString("Listeners", resourceCulture); + return ResourceManager.GetString("HelpMessage_ParameterHelp", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die LLDP / CDP ähnelt. + /// Looks up a localized string similar to Resets all application settings.. /// - public static string LldpCdp { + public static string HelpMessage_ParameterResetSettings { get { - return ResourceManager.GetString("LldpCdp", resourceCulture); + return ResourceManager.GetString("HelpMessage_ParameterResetSettings", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Local devices and resources ähnelt. + /// Looks up a localized string similar to The password is not displayed when editing, but can be overwritten.. /// - public static string LocalDevicesAndResources { + public static string HelpMessage_PasswordNotDisplayedCanBeOverwritten { get { - return ResourceManager.GetString("LocalDevicesAndResources", resourceCulture); + return ResourceManager.GetString("HelpMessage_PasswordNotDisplayedCanBeOverwritten", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Local IP address ähnelt. + /// Looks up a localized string similar to Public IPv4 address reachable via ICMP.. /// - public static string LocalIPAddress { + public static string HelpMessage_PublicIPv4Address { get { - return ResourceManager.GetString("LocalIPAddress", resourceCulture); + return ResourceManager.GetString("HelpMessage_PublicIPv4Address", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Local port ähnelt. + /// Looks up a localized string similar to Public IPv6 address reachable via ICMP.. /// - public static string LocalPort { + public static string HelpMessage_PublicIPv6Address { get { - return ResourceManager.GetString("LocalPort", resourceCulture); + return ResourceManager.GetString("HelpMessage_PublicIPv6Address", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Location ähnelt. + /// Looks up a localized string similar to SSH hostkey to use for the connection (e.g., "71:b8:f2:6e..."). Only available if the mode is "SSH".. /// - public static string Location { + public static string HelpMessage_PuTTYHostkey { get { - return ResourceManager.GetString("Location", resourceCulture); + return ResourceManager.GetString("HelpMessage_PuTTYHostkey", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Location cannot be changed in portable version! ähnelt. + /// Looks up a localized string similar to Full path to the private key file (e.g., "C:\Users\BornToBeRoot\SSH\private_key.ppk"). Only available if the mode is "SSH".. /// - public static string LocationCannotBeChangedInThePortableVersion { + public static string HelpMessage_PuTTYPrivateKeyFile { get { - return ResourceManager.GetString("LocationCannotBeChangedInThePortableVersion", resourceCulture); + return ResourceManager.GetString("HelpMessage_PuTTYPrivateKeyFile", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Location... ähnelt. + /// Looks up a localized string similar to Username that will be passed into the PuTTY session. Only available if the mode is "SSH", "Telnet" or "Rlogin".. /// - public static string LocationDots { + public static string HelpMessage_PuTTYUsername { get { - return ResourceManager.GetString("LocationDots", resourceCulture); + return ResourceManager.GetString("HelpMessage_PuTTYUsername", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Location of the import file... ähnelt. + /// Looks up a localized string similar to [0] If server authentication fails, connect to the computer without warning. + ///[1] If server authentication fails, do not establish a connection. + ///[2] If server authentication fails, show a warning and allow me to connect or refuse the connection. + ///[3] No authentication requirement is specified.. /// - public static string LocationOfTheImport { + public static string HelpMessage_RDPAuthenticationLevel { get { - return ResourceManager.GetString("LocationOfTheImport", resourceCulture); + return ResourceManager.GetString("HelpMessage_RDPAuthenticationLevel", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Log ähnelt. + /// Looks up a localized string similar to Displays a dialog to save credentials after a successful sign-in.. /// - public static string Log { + public static string HelpMessage_SaveCredentials { get { - return ResourceManager.GetString("Log", resourceCulture); + return ResourceManager.GetString("HelpMessage_SaveCredentials", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Log file name ähnelt. + /// Looks up a localized string similar to Displays the status bar in the bottom-left of the WebView when hovering over a link.. /// - public static string LogFileName { + public static string HelpMessage_ShowStatusBar { get { - return ResourceManager.GetString("LogFileName", resourceCulture); + return ResourceManager.GetString("HelpMessage_ShowStatusBar", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Log mode ähnelt. + /// Looks up a localized string similar to Tags help you organize profiles/Profiles by topics/projects. Multiple tags can be used with ";" be separated. Search by tags with "tag=xxx".. /// - public static string LogMode { + public static string HelpMessage_Tags { get { - return ResourceManager.GetString("LogMode", resourceCulture); + return ResourceManager.GetString("HelpMessage_Tags", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Log path ähnelt. + /// Looks up a localized string similar to This setting specifies the minimum number of threads that will be created from the application's ThreadPool on demand. This can improve the performance for example of the IP scanner or port scanner. + /// + ///The value is added to the default min. threads (number of CPU threads). The value 0 leaves the default settings. If the value is higher than the default max. threads of the ThreadPool, this value is used. + /// + ///If the value is too high, performance problems may occur. + /// + ///Changes to this value will take effect a [rest of string was truncated]";. /// - public static string LogPath { + public static string HelpMessage_ThreadPoolAdditionalMinThreads { get { - return ResourceManager.GetString("LogPath", resourceCulture); + return ResourceManager.GetString("HelpMessage_ThreadPoolAdditionalMinThreads", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Lookup ähnelt. + /// Looks up a localized string similar to Use custom themes to personalize the appearance of the application. You can edit or add theme in the "Program Folder > Themes" directory. For more details, refer to the documentation.. /// - public static string Lookup { + public static string HelpMessage_UseCustomThemes { get { - return ResourceManager.GetString("Lookup", resourceCulture); + return ResourceManager.GetString("HelpMessage_UseCustomThemes", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Lost ähnelt. + /// Looks up a localized string similar to Help translate the project on Transifex.. /// - public static string Lost { + public static string HelpTranslateOnTransifex { get { - return ResourceManager.GetString("Lost", resourceCulture); + return ResourceManager.GetString("HelpTranslateOnTransifex", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die MAC Address ähnelt. + /// Looks up a localized string similar to Hidden applications. /// - public static string MACAddress { + public static string HiddenApplications { get { - return ResourceManager.GetString("MACAddress", resourceCulture); + return ResourceManager.GetString("HiddenApplications", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die MAC address or vendor ähnelt. + /// Looks up a localized string similar to Hidden Network. /// - public static string MACAddressOrVendor { + public static string HiddenNetwork { get { - return ResourceManager.GetString("MACAddressOrVendor", resourceCulture); + return ResourceManager.GetString("HiddenNetwork", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Magenta ähnelt. + /// Looks up a localized string similar to Hide. /// - public static string Magenta { + public static string Hide { get { - return ResourceManager.GetString("Magenta", resourceCulture); + return ResourceManager.GetString("Hide", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Magic packet successfully sent! ähnelt. + /// Looks up a localized string similar to Highlight timeouts. /// - public static string MagicPacketSentMessage { + public static string HighlightTimeouts { get { - return ResourceManager.GetString("MagicPacketSentMessage", resourceCulture); + return ResourceManager.GetString("HighlightTimeouts", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Management ähnelt. + /// Looks up a localized string similar to History. /// - public static string Management { + public static string History { get { - return ResourceManager.GetString("Management", resourceCulture); + return ResourceManager.GetString("History", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Master Password ähnelt. + /// Looks up a localized string similar to Hop. /// - public static string MasterPassword { + public static string Hop { get { - return ResourceManager.GetString("MasterPassword", resourceCulture); + return ResourceManager.GetString("Hop", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Mauve ähnelt. + /// Looks up a localized string similar to Hops. /// - public static string Mauve { + public static string Hops { get { - return ResourceManager.GetString("Mauve", resourceCulture); + return ResourceManager.GetString("Hops", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Maximum ähnelt. + /// Looks up a localized string similar to Host. /// - public static string Maximum { + public static string Host { get { - return ResourceManager.GetString("Maximum", resourceCulture); + return ResourceManager.GetString("Host", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Maximum hops/router ähnelt. + /// Looks up a localized string similar to Hosting. /// - public static string MaximumHopsRouter { + public static string Hosting { get { - return ResourceManager.GetString("MaximumHopsRouter", resourceCulture); + return ResourceManager.GetString("Hosting", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Maximum number ({0}) of hops/router reached! ähnelt. + /// Looks up a localized string similar to Host is down. /// - public static string MaximumNumberOfHopsReached { + public static string HostIsDown { get { - return ResourceManager.GetString("MaximumNumberOfHopsReached", resourceCulture); + return ResourceManager.GetString("HostIsDown", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Measured time ähnelt. + /// Looks up a localized string similar to Host is up. /// - public static string MeasuredTime { + public static string HostIsUp { get { - return ResourceManager.GetString("MeasuredTime", resourceCulture); + return ResourceManager.GetString("HostIsUp", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Menu and window animation ähnelt. + /// Looks up a localized string similar to Hostkey. /// - public static string MenuAndWindowAnimation { + public static string Hostkey { get { - return ResourceManager.GetString("MenuAndWindowAnimation", resourceCulture); + return ResourceManager.GetString("Hostkey", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Merge ähnelt. + /// Looks up a localized string similar to Hostname. /// - public static string Merge { + public static string Hostname { get { - return ResourceManager.GetString("Merge", resourceCulture); + return ResourceManager.GetString("Hostname", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die The destination folder already contains files. If you click Merge, the current profiles are copied to the folder. ähnelt. + /// Looks up a localized string similar to Hostname or IP address. /// - public static string MergeProfileFilesInDestinationFolderMessage { + public static string HostnameOrIPAddress { get { - return ResourceManager.GetString("MergeProfileFilesInDestinationFolderMessage", resourceCulture); + return ResourceManager.GetString("HostnameOrIPAddress", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Message size ähnelt. + /// Looks up a localized string similar to Hosts. /// - public static string MessageSize { + public static string Hosts { get { - return ResourceManager.GetString("MessageSize", resourceCulture); + return ResourceManager.GetString("Hosts", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Microsoft Edge WebView2 Runtime is not available! ähnelt. + /// Looks up a localized string similar to A backup of the "hosts" file could not be created! See log file for more details.. /// - public static string MicrosoftEdgeWebView2RuntimeIsNotAvailable { + public static string HostsFileBackupErrorMessage { get { - return ResourceManager.GetString("MicrosoftEdgeWebView2RuntimeIsNotAvailable", resourceCulture); + return ResourceManager.GetString("HostsFileBackupErrorMessage", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Microsoft.Windows.SDK.Contracts is required for this feature but not available on this system (e.g. on Windows Server). ähnelt. + /// Looks up a localized string similar to Hosts File Editor. /// - public static string MicrosoftWindowsSDKContractsIsNotAvailable { + public static string HostsFileEditor { get { - return ResourceManager.GetString("MicrosoftWindowsSDKContractsIsNotAvailable", resourceCulture); + return ResourceManager.GetString("HostsFileEditor", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Migrate ähnelt. + /// Looks up a localized string similar to Read-only mode. Modifying the hosts file requires elevated rights!. /// - public static string Migrate { + public static string HostsFileEditorAdminMessage { get { - return ResourceManager.GetString("Migrate", resourceCulture); + return ResourceManager.GetString("HostsFileEditorAdminMessage", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Minimize main window instead of terminating the application ähnelt. + /// Looks up a localized string similar to The entry was not found in the "hosts" file! Maybe the file has been modified.. /// - public static string MinimizeInsteadOfTerminating { + public static string HostsFileEntryNotFoundMessage { get { - return ResourceManager.GetString("MinimizeInsteadOfTerminating", resourceCulture); + return ResourceManager.GetString("HostsFileEntryNotFoundMessage", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Minimize to tray instead of taskbar ähnelt. + /// Looks up a localized string similar to The "hosts" file could not be read! See log file for more details.. /// - public static string MinimizeToTrayInsteadOfTaskbar { + public static string HostsFileReadErrorMessage { get { - return ResourceManager.GetString("MinimizeToTrayInsteadOfTaskbar", resourceCulture); + return ResourceManager.GetString("HostsFileReadErrorMessage", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Minimum ähnelt. + /// Looks up a localized string similar to The "hosts" file could not be written to. See log file for more details.. /// - public static string Minimum { + public static string HostsFileWriteErrorMessage { get { - return ResourceManager.GetString("Minimum", resourceCulture); + return ResourceManager.GetString("HostsFileWriteErrorMessage", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Mode ähnelt. + /// Looks up a localized string similar to HotKeys. /// - public static string Mode { + public static string HotKeys { get { - return ResourceManager.GetString("Mode", resourceCulture); + return ResourceManager.GetString("HotKeys", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Model ähnelt. + /// Looks up a localized string similar to HTTP Headers. /// - public static string Model { + public static string HTTPHeaders { get { - return ResourceManager.GetString("Model", resourceCulture); + return ResourceManager.GetString("HTTPHeaders", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Move ähnelt. + /// Looks up a localized string similar to HTTP status code. /// - public static string Move { + public static string HTTPStatusCode { get { - return ResourceManager.GetString("Move", resourceCulture); + return ResourceManager.GetString("HTTPStatusCode", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Move & Restart ähnelt. + /// Looks up a localized string similar to ICMPv4. /// - public static string MoveAndRestart { + public static string ICMPv4 { get { - return ResourceManager.GetString("MoveAndRestart", resourceCulture); + return ResourceManager.GetString("ICMPv4", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Multicast ähnelt. + /// Looks up a localized string similar to ICMPv6. /// - public static string Multicast { + public static string ICMPv6 { get { - return ResourceManager.GetString("Multicast", resourceCulture); + return ResourceManager.GetString("ICMPv6", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Multiple instances ähnelt. + /// Looks up a localized string similar to ID. /// - public static string MultipleInstances { + public static string ID { get { - return ResourceManager.GetString("MultipleInstances", resourceCulture); + return ResourceManager.GetString("ID", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Multithreading ähnelt. + /// Looks up a localized string similar to Import. /// - public static string Multithreading { + public static string Import { get { - return ResourceManager.GetString("Multithreading", resourceCulture); + return ResourceManager.GetString("Import", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Name ähnelt. + /// Looks up a localized string similar to Import computers from Active Directory. /// - public static string Name { + public static string ImportComputersFromActiveDirectory { get { - return ResourceManager.GetString("Name", resourceCulture); + return ResourceManager.GetString("ImportComputersFromActiveDirectory", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Network ähnelt. + /// Looks up a localized string similar to Import computers from Active Directory.... /// - public static string Network { + public static string ImportComputersFromActiveDirectoryDots { get { - return ResourceManager.GetString("Network", resourceCulture); + return ResourceManager.GetString("ImportComputersFromActiveDirectoryDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Network address ähnelt. + /// Looks up a localized string similar to Import / Export. /// - public static string NetworkAddress { + public static string ImportExport { get { - return ResourceManager.GetString("NetworkAddress", resourceCulture); + return ResourceManager.GetString("ImportExport", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Network connections.... ähnelt. + /// Looks up a localized string similar to Import profiles. /// - public static string NetworkConnectionsDots { + public static string ImportProfiles { get { - return ResourceManager.GetString("NetworkConnectionsDots", resourceCulture); + return ResourceManager.GetString("ImportProfiles", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Network connection type ähnelt. + /// Looks up a localized string similar to Active Directory. /// - public static string NetworkConnectionType { + public static string ImportProfiles_Method_ActiveDirectory { get { - return ResourceManager.GetString("NetworkConnectionType", resourceCulture); + return ResourceManager.GetString("ImportProfiles_Method_ActiveDirectory", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Network Interface ähnelt. + /// Looks up a localized string similar to Active Directory. /// - public static string NetworkInterface { + public static string ImportProfiles_Source_ActiveDirectory { get { - return ResourceManager.GetString("NetworkInterface", resourceCulture); + return ResourceManager.GetString("ImportProfiles_Source_ActiveDirectory", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Network kind ähnelt. + /// Looks up a localized string similar to CSV file. /// - public static string NetworkKind { + public static string ImportProfiles_Source_Csv { get { - return ResourceManager.GetString("NetworkKind", resourceCulture); + return ResourceManager.GetString("ImportProfiles_Source_Csv", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die The network address cannot be reached. Check if your computer is connected to the network. For information about network troubleshooting, see Windows Help. ähnelt. + /// Looks up a localized string similar to CSV file. /// - public static string NetworkLocationCannotBeReachedMessage { + public static string ImportProfiles_Method_Csv { get { - return ResourceManager.GetString("NetworkLocationCannotBeReachedMessage", resourceCulture); + return ResourceManager.GetString("ImportProfiles_Method_Csv", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die To analyze network packets, the application must be started with elevated rights! ähnelt. + /// Looks up a localized string similar to Import profiles from CSV file. /// - public static string NetworkPacketsCaptureAdminMessage { + public static string ImportProfilesFromCsvFile { get { - return ResourceManager.GetString("NetworkPacketsCaptureAdminMessage", resourceCulture); + return ResourceManager.GetString("ImportProfilesFromCsvFile", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Networks ähnelt. + /// Looks up a localized string similar to Imported from CSV file on {0}. /// - public static string Networks { + public static string Csv_ImportDescription { get { - return ResourceManager.GetString("Networks", resourceCulture); + return ResourceManager.GetString("Csv_ImportDescription", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Network unavailable! ähnelt. + /// Looks up a localized string similar to No entries were found in the CSV file.. /// - public static string NetworkUnavailable { + public static string CsvNoEntriesFound { get { - return ResourceManager.GetString("NetworkUnavailable", resourceCulture); + return ResourceManager.GetString("CsvNoEntriesFound", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Network usage ähnelt. + /// Looks up a localized string similar to Expected CSV format — one profile per line:. /// - public static string NetworkUsage { + public static string CsvImportFormatHint { get { - return ResourceManager.GetString("NetworkUsage", resourceCulture); + return ResourceManager.GetString("CsvImportFormatHint", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die New connection... ähnelt. + /// Looks up a localized string similar to A header row and the delimiter (semicolon, comma or tab) are detected automatically. The description column is optional. Entries without a host cannot be imported.. /// - public static string NewConnectionDots { + public static string CsvImportFormatNote { get { - return ResourceManager.GetString("NewConnectionDots", resourceCulture); + return ResourceManager.GetString("CsvImportFormatNote", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die New password ähnelt. + /// Looks up a localized string similar to Imported. /// - public static string NewPassword { + public static string ImportProfiles_StatusImported { get { - return ResourceManager.GetString("NewPassword", resourceCulture); + return ResourceManager.GetString("ImportProfiles_StatusImported", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die New subnetmask or CIDR ähnelt. + /// Looks up a localized string similar to New. /// - public static string NewSubnetmaskOrCIDR { + public static string ImportProfiles_StatusNew { get { - return ResourceManager.GetString("NewSubnetmaskOrCIDR", resourceCulture); + return ResourceManager.GetString("ImportProfiles_StatusNew", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die New tab ähnelt. + /// Looks up a localized string similar to No host. /// - public static string NewTab { + public static string ImportProfiles_StatusNoHost { get { - return ResourceManager.GetString("NewTab", resourceCulture); + return ResourceManager.GetString("ImportProfiles_StatusNoHost", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die No ähnelt. + /// Looks up a localized string similar to Import profiles.... /// - public static string No { + public static string ImportProfilesDots { get { - return ResourceManager.GetString("No", resourceCulture); + return ResourceManager.GetString("ImportProfilesDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die No A dns records resolved for "{0}"! ähnelt. + /// Looks up a localized string similar to Import results. /// - public static string NoADNSRecordsResolvedForXXXMessage { + public static string ImportResults { get { - return ResourceManager.GetString("NoADNSRecordsResolvedForXXXMessage", resourceCulture); + return ResourceManager.GetString("ImportResults", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die No discovery protocol packages received! ähnelt. + /// Looks up a localized string similar to {0} · {1} result(s). /// - public static string NoDiscoveryProtocolPackagesReceived { + public static string ImportResultsHeader { get { - return ResourceManager.GetString("NoDiscoveryProtocolPackagesReceived", resourceCulture); + return ResourceManager.GetString("ImportResultsHeader", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die No DNS record found for "{0}"! Check your input and the settings. ähnelt. + /// Looks up a localized string similar to Inbound. /// - public static string NoDNSRecordFoundCheckYourInputAndSettings { + public static string Inbound { get { - return ResourceManager.GetString("NoDNSRecordFoundCheckYourInputAndSettings", resourceCulture); + return ResourceManager.GetString("Inbound", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die No enabled network adapters found! ähnelt. + /// Looks up a localized string similar to Indigo. /// - public static string NoEnabledNetworkAdaptersFound { + public static string Indigo { get { - return ResourceManager.GetString("NoEnabledNetworkAdaptersFound", resourceCulture); + return ResourceManager.GetString("Indigo", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die No ports found. Check your input! ähnelt. + /// Looks up a localized string similar to Information. /// - public static string NoPortsFoundCheckYourInput { + public static string Information { get { - return ResourceManager.GetString("NoPortsFoundCheckYourInput", resourceCulture); + return ResourceManager.GetString("Information", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die No profiles found! - ///Create one... ähnelt. + /// Looks up a localized string similar to Infrastructure. /// - public static string NoProfilesFoundCreateOne { + public static string Infrastructure { get { - return ResourceManager.GetString("NoProfilesFoundCreateOne", resourceCulture); + return ResourceManager.GetString("Infrastructure", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die No PTR dns record resolved for "{0}"! ähnelt. + /// Looks up a localized string similar to Inherit host from general. /// - public static string NoPTRDNSRecordResolvedForXXXMessage { + public static string InheritHostFromGeneral { get { - return ResourceManager.GetString("NoPTRDNSRecordResolvedForXXXMessage", resourceCulture); + return ResourceManager.GetString("InheritHostFromGeneral", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die (not changed) ähnelt. + /// Looks up a localized string similar to Input. /// - public static string NotChanged { + public static string Input { get { - return ResourceManager.GetString("NotChanged", resourceCulture); + return ResourceManager.GetString("Input", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Note ähnelt. + /// Looks up a localized string similar to Input cannot end with a ";"!. /// - public static string Note { + public static string InputCannotEndWithSemicolon { get { - return ResourceManager.GetString("Note", resourceCulture); + return ResourceManager.GetString("InputCannotEndWithSemicolon", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Nothing found! ähnelt. + /// Looks up a localized string similar to Input does not contain any text!. /// - public static string NothingFound { + public static string InputDoesNotContainAnyText { get { - return ResourceManager.GetString("NothingFound", resourceCulture); + return ResourceManager.GetString("InputDoesNotContainAnyText", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Nothing to do. Check your input! ähnelt. + /// Looks up a localized string similar to Instance ID. /// - public static string NothingToDoCheckYourInput { + public static string InstanceId { get { - return ResourceManager.GetString("NothingToDoCheckYourInput", resourceCulture); + return ResourceManager.GetString("InstanceId", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die No update available! ähnelt. + /// Looks up a localized string similar to Interface. /// - public static string NoUpdateAvailable { + public static string Interface { get { - return ResourceManager.GetString("NoUpdateAvailable", resourceCulture); + return ResourceManager.GetString("Interface", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die No valid file found to import. ähnelt. + /// Looks up a localized string similar to Interface type. /// - public static string NoValidFileFoundToImport { + public static string InterfaceType { get { - return ResourceManager.GetString("NoValidFileFoundToImport", resourceCulture); + return ResourceManager.GetString("InterfaceType", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die No vendor found. Check your input! ähnelt. + /// Looks up a localized string similar to Internet. /// - public static string NoVendorFoundCheckYourInput { + public static string Internet { get { - return ResourceManager.GetString("NoVendorFoundCheckYourInput", resourceCulture); + return ResourceManager.GetString("Internet", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die No WiFi adapters found! ähnelt. + /// Looks up a localized string similar to IP address. /// - public static string NoWiFiAdaptersFound { + public static string IPAddress { get { - return ResourceManager.GetString("NoWiFiAdaptersFound", resourceCulture); + return ResourceManager.GetString("IPAddress", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die No WiFi networks found! ähnelt. + /// Looks up a localized string similar to IP addresses. /// - public static string NoWiFiNetworksFound { + public static string IPAddresses { get { - return ResourceManager.GetString("NoWiFiNetworksFound", resourceCulture); + return ResourceManager.GetString("IPAddresses", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Number of errors after which is canceled: ähnelt. + /// Looks up a localized string similar to IP address to detect local ip address based on routing. /// - public static string NumberOfErrorsAfterWhichIsCanceled { + public static string IPAddressToDetectLocalIPAddressBasedOnRouting { get { - return ResourceManager.GetString("NumberOfErrorsAfterWhichIsCanceled", resourceCulture); + return ResourceManager.GetString("IPAddressToDetectLocalIPAddressBasedOnRouting", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Number of stored entries ähnelt. + /// Looks up a localized string similar to ip-api.com rate limit reached (too many requests from your network)! + ///Try again in a few seconds.. /// - public static string NumberOfStoredEntries { + public static string IPApiRateLimitMessage { get { - return ResourceManager.GetString("NumberOfStoredEntries", resourceCulture); + return ResourceManager.GetString("IPApiRateLimitMessage", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Obtain an IP address automatically ähnelt. + /// Looks up a localized string similar to IP endpoint. /// - public static string ObtainAnIPAddressAutomatically { + public static string IPEndPoint { get { - return ResourceManager.GetString("ObtainAnIPAddressAutomatically", resourceCulture); + return ResourceManager.GetString("IPEndPoint", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Obtain DNS server address automatically ähnelt. + /// Looks up a localized string similar to IP geolocation. /// - public static string ObtainDNSServerAddressAutomatically { + public static string IPGeolocation { get { - return ResourceManager.GetString("ObtainDNSServerAddressAutomatically", resourceCulture); + return ResourceManager.GetString("IPGeolocation", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Off ähnelt. + /// Looks up a localized string similar to IP range. /// - public static string Off { + public static string IPRange { get { - return ResourceManager.GetString("Off", resourceCulture); + return ResourceManager.GetString("IPRange", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Official ähnelt. + /// Looks up a localized string similar to IP Scanner. /// - public static string Official { + public static string IPScanner { get { - return ResourceManager.GetString("Official", resourceCulture); + return ResourceManager.GetString("IPScanner", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die OID ähnelt. + /// Looks up a localized string similar to Destination host unreachable.. /// - public static string OID { + public static string IPStatus_DestinationHostUnreachable { get { - return ResourceManager.GetString("OID", resourceCulture); + return ResourceManager.GetString("IPStatus_DestinationHostUnreachable", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die OK ähnelt. + /// Looks up a localized string similar to Destination network unreachable.. /// - public static string OK { + public static string IPStatus_DestinationNetworkUnreachable { get { - return ResourceManager.GetString("OK", resourceCulture); + return ResourceManager.GetString("IPStatus_DestinationNetworkUnreachable", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Olive ähnelt. + /// Looks up a localized string similar to Destination port unreachable.. /// - public static string Olive { + public static string IPStatus_DestinationPortUnreachable { get { - return ResourceManager.GetString("Olive", resourceCulture); + return ResourceManager.GetString("IPStatus_DestinationPortUnreachable", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die On ähnelt. + /// Looks up a localized string similar to Success. /// - public static string On { + public static string IPStatus_Success { get { - return ResourceManager.GetString("On", resourceCulture); + return ResourceManager.GetString("IPStatus_Success", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Only numbers can be entered! ähnelt. + /// Looks up a localized string similar to Request timed out.. /// - public static string OnlyNumbersCanBeEntered { + public static string IPStatus_TimedOut { get { - return ResourceManager.GetString("OnlyNumbersCanBeEntered", resourceCulture); + return ResourceManager.GetString("IPStatus_TimedOut", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Only when using the full screen ähnelt. + /// Looks up a localized string similar to TTL expired in transit.. /// - public static string OnlyWhenUsingTheFullScreen { + public static string IPStatus_TtlExpired { get { - return ResourceManager.GetString("OnlyWhenUsingTheFullScreen", resourceCulture); + return ResourceManager.GetString("IPStatus_TtlExpired", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Open ähnelt. + /// Looks up a localized string similar to IPv4. /// - public static string Open { + public static string IPv4 { get { - return ResourceManager.GetString("Open", resourceCulture); + return ResourceManager.GetString("IPv4", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Open documentation ähnelt. + /// Looks up a localized string similar to IPv4 address. /// - public static string OpenDocumentation { + public static string IPv4Address { get { - return ResourceManager.GetString("OpenDocumentation", resourceCulture); + return ResourceManager.GetString("IPv4Address", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Open license ähnelt. + /// Looks up a localized string similar to IPv4 address added. /// - public static string OpenLicense { + public static string IPv4AddressAddedSuccessfully { get { - return ResourceManager.GetString("OpenLicense", resourceCulture); + return ResourceManager.GetString("IPv4AddressAddedSuccessfully", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Open location ähnelt. + /// Looks up a localized string similar to IPv4 address released and renewed. /// - public static string OpenLocation { + public static string IPv4AddressReleasedAndRenewedSuccessfully { get { - return ResourceManager.GetString("OpenLocation", resourceCulture); + return ResourceManager.GetString("IPv4AddressReleasedAndRenewedSuccessfully", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Open port profiles... ähnelt. + /// Looks up a localized string similar to IPv4 address released. /// - public static string OpenPortProfilesDots { + public static string IPv4AddressReleasedSuccessfully { get { - return ResourceManager.GetString("OpenPortProfilesDots", resourceCulture); + return ResourceManager.GetString("IPv4AddressReleasedSuccessfully", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Open project ähnelt. + /// Looks up a localized string similar to IPv4 address renewed. /// - public static string OpenProject { + public static string IPv4AddressRenewedSuccessfully { get { - return ResourceManager.GetString("OpenProject", resourceCulture); + return ResourceManager.GetString("IPv4AddressRenewedSuccessfully", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Open settings ähnelt. + /// Looks up a localized string similar to IPv6 address released and renewed. /// - public static string OpenSettings { + public static string IPv6AddressReleasedAndRenewedSuccessfully { get { - return ResourceManager.GetString("OpenSettings", resourceCulture); + return ResourceManager.GetString("IPv6AddressReleasedAndRenewedSuccessfully", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Open website ähnelt. + /// Looks up a localized string similar to IPv6 address released. /// - public static string OpenWebsite { + public static string IPv6AddressReleasedSuccessfully { get { - return ResourceManager.GetString("OpenWebsite", resourceCulture); + return ResourceManager.GetString("IPv6AddressReleasedSuccessfully", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Orange ähnelt. + /// Looks up a localized string similar to IPv6 address renewed. /// - public static string Orange { + public static string IPv6AddressRenewedSuccessfully { get { - return ResourceManager.GetString("Orange", resourceCulture); + return ResourceManager.GetString("IPv6AddressRenewedSuccessfully", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die OUI ähnelt. + /// Looks up a localized string similar to IPv4 address removed. /// - public static string OUI { + public static string IPv4AddressRemovedSuccessfully { get { - return ResourceManager.GetString("OUI", resourceCulture); + return ResourceManager.GetString("IPv4AddressRemovedSuccessfully", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die override ähnelt. + /// Looks up a localized string similar to IPv4-Default-Gateway. /// - public static string Override { + public static string IPv4DefaultGateway { get { - return ResourceManager.GetString("Override", resourceCulture); + return ResourceManager.GetString("IPv4DefaultGateway", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Override default settings ähnelt. + /// Looks up a localized string similar to IPv4 protocol available. /// - public static string OverrideDefaultSettings { + public static string IPv4ProtocolAvailable { get { - return ResourceManager.GetString("OverrideDefaultSettings", resourceCulture); + return ResourceManager.GetString("IPv4ProtocolAvailable", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Overwrite ähnelt. + /// Looks up a localized string similar to IPv6. /// - public static string Overwrite { + public static string IPv6 { get { - return ResourceManager.GetString("Overwrite", resourceCulture); + return ResourceManager.GetString("IPv6", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Overwrite profiles in destination folder? - /// - ///"Overwrite" will copy the profile files to the destination folder and overwrite existing profile files. - ///"Merge" will copy the profile files to the destination folder, but won't overwrite exitsting profile files. - ///"Use other folder" will use the existing profile files in the destination folder. ähnelt. + /// Looks up a localized string similar to IPv6 address. /// - public static string OverwriteProfilesInDestinationFolderMessage { + public static string IPv6Address { get { - return ResourceManager.GetString("OverwriteProfilesInDestinationFolderMessage", resourceCulture); + return ResourceManager.GetString("IPv6Address", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Overwrite? ähnelt. + /// Looks up a localized string similar to Link-local IPv6 address. /// - public static string OverwriteQuestion { + public static string IPv6AddressLinkLocal { get { - return ResourceManager.GetString("OverwriteQuestion", resourceCulture); + return ResourceManager.GetString("IPv6AddressLinkLocal", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Overwrite settings in the destination folder? - /// - ///"Overwrite" will overwrite the file in the destination folder. - ///"Use other" will use the existing settings file in the destination and restart the application. ähnelt. + /// Looks up a localized string similar to IPv6-Default-Gateway. /// - public static string OverwriteSettingsInDestinationFolderMessage { + public static string IPv6DefaultGateway { get { - return ResourceManager.GetString("OverwriteSettingsInDestinationFolderMessage", resourceCulture); + return ResourceManager.GetString("IPv6DefaultGateway", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Packet loss ähnelt. + /// Looks up a localized string similar to IPv6 protocol available. /// - public static string PacketLoss { + public static string IPv6ProtocolAvailable { get { - return ResourceManager.GetString("PacketLoss", resourceCulture); + return ResourceManager.GetString("IPv6ProtocolAvailable", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Packets transmitted ähnelt. + /// Looks up a localized string similar to Is encrypted. /// - public static string PacketsTransmitted { + public static string IsEncrypted { get { - return ResourceManager.GetString("PacketsTransmitted", resourceCulture); + return ResourceManager.GetString("IsEncrypted", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Parameter ähnelt. + /// Looks up a localized string similar to ISP. /// - public static string Parameter { + public static string ISP { get { - return ResourceManager.GetString("Parameter", resourceCulture); + return ResourceManager.GetString("ISP", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Password ähnelt. + /// Looks up a localized string similar to Jitter. /// - public static string Password { + public static string Jitter { get { - return ResourceManager.GetString("Password", resourceCulture); + return ResourceManager.GetString("Jitter", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Passwords do not match! ähnelt. + /// Looks up a localized string similar to Keyboard. /// - public static string PasswordsDoNotMatch { + public static string Keyboard { get { - return ResourceManager.GetString("PasswordsDoNotMatch", resourceCulture); + return ResourceManager.GetString("Keyboard", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Paste ähnelt. + /// Looks up a localized string similar to Keyboard shortcuts. /// - public static string Paste { + public static string KeyboardShortcuts { get { - return ResourceManager.GetString("Paste", resourceCulture); + return ResourceManager.GetString("KeyboardShortcuts", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Patch ähnelt. + /// Looks up a localized string similar to Key must have 8 characters or more!. /// - public static string Patch { + public static string KeyMustHave8CharactersOrMore { get { - return ResourceManager.GetString("Patch", resourceCulture); + return ResourceManager.GetString("KeyMustHave8CharactersOrMore", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Path ähnelt. + /// Looks up a localized string similar to Kilobits. /// - public static string Path { + public static string Kilobits { get { - return ResourceManager.GetString("Path", resourceCulture); + return ResourceManager.GetString("Kilobits", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Pause ähnelt. + /// Looks up a localized string similar to Kilobytes. /// - public static string Pause { + public static string Kilobytes { get { - return ResourceManager.GetString("Pause", resourceCulture); + return ResourceManager.GetString("Kilobytes", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Performance ähnelt. + /// Looks up a localized string similar to Language. /// - public static string Performance { + public static string Language { get { - return ResourceManager.GetString("Performance", resourceCulture); + return ResourceManager.GetString("Language", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Persistent bitmap caching ähnelt. + /// Looks up a localized string similar to Last scan at {0}. /// - public static string PersistentBitmapCaching { + public static string LastScanAtX { get { - return ResourceManager.GetString("PersistentBitmapCaching", resourceCulture); + return ResourceManager.GetString("LastScanAtX", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Phy kind ähnelt. + /// Looks up a localized string similar to Last usable IP address. /// - public static string PhyKind { + public static string LastUsableIPAddress { get { - return ResourceManager.GetString("PhyKind", resourceCulture); + return ResourceManager.GetString("LastUsableIPAddress", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die PhysicalAddress ähnelt. + /// Looks up a localized string similar to Latency. /// - public static string PhysicalAddress { + public static string Latency { get { - return ResourceManager.GetString("PhysicalAddress", resourceCulture); + return ResourceManager.GetString("Latency", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Ping ähnelt. + /// Looks up a localized string similar to Latitude. /// - public static string Ping { + public static string Latitude { get { - return ResourceManager.GetString("Ping", resourceCulture); + return ResourceManager.GetString("Latitude", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Ping Monitor ähnelt. + /// Looks up a localized string similar to Port (optional). /// - public static string PingMonitor { + public static string LdapPort { get { - return ResourceManager.GetString("PingMonitor", resourceCulture); + return ResourceManager.GetString("LdapPort", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Pink ähnelt. + /// Looks up a localized string similar to Server (optional). /// - public static string Pink { + public static string LdapServer { get { - return ResourceManager.GetString("Pink", resourceCulture); + return ResourceManager.GetString("LdapServer", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Port ähnelt. + /// Looks up a localized string similar to Libraries. /// - public static string Port { + public static string Libraries { get { - return ResourceManager.GetString("Port", resourceCulture); + return ResourceManager.GetString("Libraries", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Portable ähnelt. + /// Looks up a localized string similar to AirspacePanel fixes all Airspace issues with WPF-hosted Winforms.. /// - public static string Portable { + public static string Library_AirspaceFixer_Description { get { - return ResourceManager.GetString("Portable", resourceCulture); + return ResourceManager.GetString("Library_AirspaceFixer_Description", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Port description ähnelt. + /// Looks up a localized string similar to Shared Controlz for WPF and ... more. /// - public static string PortDescription { + public static string Library_ControlzEx_Description { get { - return ResourceManager.GetString("PortDescription", resourceCulture); + return ResourceManager.GetString("Library_ControlzEx_Description", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Port or service ähnelt. + /// Looks up a localized string similar to C#/WinRT provides packaged WinRT projection support for the C# language.. /// - public static string PortOrService { + public static string Library_CsWinRT_Description { get { - return ResourceManager.GetString("PortOrService", resourceCulture); + return ResourceManager.GetString("Library_CsWinRT_Description", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Port profiles ähnelt. + /// Looks up a localized string similar to DnsClient.NET is a simple yet very powerful and high performant open source library for the .NET Framework to do DNS lookups. /// - public static string PortProfiles { + public static string Library_DnsClientNET_Description { get { - return ResourceManager.GetString("PortProfiles", resourceCulture); + return ResourceManager.GetString("Library_DnsClientNET_Description", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Ports ähnelt. + /// Looks up a localized string similar to Dragable and tearable tab control for WPF. /// - public static string Ports { + public static string Library_Dragablz_Description { get { - return ResourceManager.GetString("Ports", resourceCulture); + return ResourceManager.GetString("Library_Dragablz_Description", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Port Scanner ähnelt. + /// Looks up a localized string similar to An easy to use drag'n'drop framework for WPF.. /// - public static string PortScanner { + public static string Library_GongSolutionsWpfDragDrop_Description { get { - return ResourceManager.GetString("PortScanner", resourceCulture); + return ResourceManager.GetString("Library_GongSolutionsWpfDragDrop_Description", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Closed ähnelt. + /// Looks up a localized string similar to C# library take care of complex network, IP, IPv4, IPv6, netmask, CIDR, subnet, subnetting, supernet, and supernetting calculation for .NET developers.. /// - public static string PortState_Closed { + public static string Library_IPNetwork_Description { get { - return ResourceManager.GetString("PortState_Closed", resourceCulture); + return ResourceManager.GetString("Library_IPNetwork_Description", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Open ähnelt. + /// Looks up a localized string similar to Beautiful, interactive charts, maps, and gauges.. /// - public static string PortState_Open { + public static string Library_LiveCharts_Description { get { - return ResourceManager.GetString("PortState_Open", resourceCulture); + return ResourceManager.GetString("Library_LiveCharts_Description", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Port threads ähnelt. + /// Looks up a localized string similar to A collection of loading indicators for WPF. /// - public static string PortThreads { + public static string Library_LoadingIndicatorsWPF_Description { get { - return ResourceManager.GetString("PortThreads", resourceCulture); + return ResourceManager.GetString("Library_LoadingIndicatorsWPF_Description", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die PowerShell ähnelt. + /// Looks up a localized string similar to log4net is a tool to help the programmer output log statements to a variety of output targets.. /// - public static string PowerShell { + public static string Library_log4net_Description { get { - return ResourceManager.GetString("PowerShell", resourceCulture); + return ResourceManager.GetString("Library_log4net_Description", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die PowerShell location... ähnelt. + /// Looks up a localized string similar to A toolkit for creating Metro / Modern UI styled WPF apps.. /// - public static string PowerShellLocationDots { + public static string Library_MahAppsMetro_Description { get { - return ResourceManager.GetString("PowerShellLocationDots", resourceCulture); + return ResourceManager.GetString("Library_MahAppsMetro_Description", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die PowerShell process has ended! ähnelt. + /// Looks up a localized string similar to Some awesome icons for WPF and UWP all together.... /// - public static string PowerShellProcessHasEnded { + public static string Library_MahAppsMetroIconPacks_Description { get { - return ResourceManager.GetString("PowerShellProcessHasEnded", resourceCulture); + return ResourceManager.GetString("Library_MahAppsMetroIconPacks_Description", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Preferred protocol when resolving hostname: ähnelt. + /// Looks up a localized string similar to Json.NET is a popular high-performance JSON framework for .NET. /// - public static string PreferredProtocolWhenResolvingHostname { + public static string Library_NewtonsoftJson_Description { get { - return ResourceManager.GetString("PreferredProtocolWhenResolvingHostname", resourceCulture); + return ResourceManager.GetString("Library_NewtonsoftJson_Description", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Preview ähnelt. + /// Looks up a localized string similar to Move a .NET Framework/.NET Core app runtime components and dependencies into a sub-directory and make it beauty.. /// - public static string Preview { + public static string Library_nulastudioNetBeauty_Description { get { - return ResourceManager.GetString("Preview", resourceCulture); + return ResourceManager.GetString("Library_nulastudioNetBeauty_Description", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Primary DNS server ähnelt. + /// Looks up a localized string similar to A GitHub API client library for .NET. /// - public static string PrimaryDNSServer { + public static string Library_Octokit_Description { get { - return ResourceManager.GetString("PrimaryDNSServer", resourceCulture); + return ResourceManager.GetString("Library_Octokit_Description", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Priv ähnelt. + /// Looks up a localized string similar to Runtime for hosting PowerShell. /// - public static string Priv { + public static string Library_PowerShellSDK_Description { get { - return ResourceManager.GetString("Priv", resourceCulture); + return ResourceManager.GetString("Library_PowerShellSDK_Description", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Privacy ähnelt. + /// Looks up a localized string similar to Capture and parse CDP and LLDP packets on local or remote computers. /// - public static string Privacy { + public static string Library_PSDicoveryProtocol_Description { get { - return ResourceManager.GetString("Privacy", resourceCulture); + return ResourceManager.GetString("Library_PSDicoveryProtocol_Description", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Private key file ähnelt. + /// Looks up a localized string similar to Sharp SNMP Library - Open Source SNMP for .NET and Mono. /// - public static string PrivateKeyFile { + public static string Library_SharpSNMP_Description { get { - return ResourceManager.GetString("PrivateKeyFile", resourceCulture); + return ResourceManager.GetString("Library_SharpSNMP_Description", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Profile ähnelt. + /// Looks up a localized string similar to The WebView2 control enables you to embed web technologies (HTML, CSS, and JavaScript) in your native applications powered by Microsoft Edge (Chromium).. /// - public static string Profile { + public static string Library_WebView2_Description { get { - return ResourceManager.GetString("Profile", resourceCulture); + return ResourceManager.GetString("Library_WebView2_Description", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Profile could not be loaded! ähnelt. + /// Looks up a localized string similar to Easily add interactivity to your apps using XAML Behaviors for WPF.. /// - public static string ProfileCouldNotBeLoaded { + public static string Library_XamlBehaviorsWpf_Description { get { - return ResourceManager.GetString("ProfileCouldNotBeLoaded", resourceCulture); + return ResourceManager.GetString("Library_XamlBehaviorsWpf_Description", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die If this happened after an update, you may need to migrate the profiles to a newer version. When you click "Migrate", a PowerShell window opens with the migration script. Check the path and press Enter. - /// - ///Otherwise, the profile may be corrupted and you want to report the issue on GitHub. ähnelt. + /// Looks up a localized string similar to License. /// - public static string ProfileCouldNotBeLoadedMessage { + public static string License { get { - return ResourceManager.GetString("ProfileCouldNotBeLoadedMessage", resourceCulture); + return ResourceManager.GetString("License", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Profile files are encrypted on disk using AES with a key size of 256 bits and a block size of 128 bits in CBC mode. The encryption key is derived from a master password using Rfc2898DeriveBytes (PBKDF2) with 1,000,000 iterations. At runtime, passwords are stored as SecureString once the profile file is loaded. For some functions, the password must be converted to a normal string and remains unencrypted in memory until the garbage collector cleans them up. - /// - ///First make a backup copy of your profile files be [Rest der Zeichenfolge wurde abgeschnitten]"; ähnelt. + /// Looks up a localized string similar to Apache License 2.0. /// - public static string ProfileEncryptionDisclaimer { + public static string License_ApacheLicense2dot0 { get { - return ResourceManager.GetString("ProfileEncryptionDisclaimer", resourceCulture); + return ResourceManager.GetString("License_ApacheLicense2dot0", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Profile files will be moved to the selected destination folder. ähnelt. + /// Looks up a localized string similar to BSD-2-Clause. /// - public static string ProfileFilesWillBeMovedMessage { + public static string License_BDS2Clause { get { - return ResourceManager.GetString("ProfileFilesWillBeMovedMessage", resourceCulture); + return ResourceManager.GetString("License_BDS2Clause", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Profile name already exists! ähnelt. + /// Looks up a localized string similar to BSD-3-Clause. /// - public static string ProfileNameAlreadyExists { + public static string License_BDS3Clause { get { - return ResourceManager.GetString("ProfileNameAlreadyExists", resourceCulture); + return ResourceManager.GetString("License_BDS3Clause", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Profiles ähnelt. + /// Looks up a localized string similar to Microsoft WebView2 License. /// - public static string Profiles { + public static string License_MicrosoftWebView2License { get { - return ResourceManager.GetString("Profiles", resourceCulture); + return ResourceManager.GetString("License_MicrosoftWebView2License", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Profiles reloaded ähnelt. + /// Looks up a localized string similar to MIT License. /// - public static string ProfilesReloaded { + public static string License_MITLicense { get { - return ResourceManager.GetString("ProfilesReloaded", resourceCulture); + return ResourceManager.GetString("License_MITLicense", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die DNS Lookup ähnelt. + /// Looks up a localized string similar to Unlicense. /// - public static string ProfileViewName_DNSLookup { + public static string License_Unlicense { get { - return ResourceManager.GetString("ProfileViewName_DNSLookup", resourceCulture); + return ResourceManager.GetString("License_Unlicense", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die General ähnelt. + /// Looks up a localized string similar to Lime. /// - public static string ProfileViewName_General { + public static string Lime { get { - return ResourceManager.GetString("ProfileViewName_General", resourceCulture); + return ResourceManager.GetString("Lime", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die HTTP Headers ähnelt. + /// Looks up a localized string similar to Listeners. /// - public static string ProfileViewName_HTTPHeaders { + public static string Listeners { get { - return ResourceManager.GetString("ProfileViewName_HTTPHeaders", resourceCulture); + return ResourceManager.GetString("Listeners", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die IP Scanner ähnelt. + /// Looks up a localized string similar to Live. /// - public static string ProfileViewName_IP_Scanner { + public static string Live { get { - return ResourceManager.GetString("ProfileViewName_IP Scanner", resourceCulture); + return ResourceManager.GetString("Live", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Network Interface ähnelt. + /// Looks up a localized string similar to LLDP / CDP. /// - public static string ProfileViewName_NetworkInterface { + public static string LldpCdp { get { - return ResourceManager.GetString("ProfileViewName_NetworkInterface", resourceCulture); + return ResourceManager.GetString("LldpCdp", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Ping ähnelt. + /// Looks up a localized string similar to Local addresses. /// - public static string ProfileViewName_Ping { + public static string LocalAddresses { get { - return ResourceManager.GetString("ProfileViewName_Ping", resourceCulture); + return ResourceManager.GetString("LocalAddresses", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Ping Monitor ähnelt. + /// Looks up a localized string similar to Local connection. /// - public static string ProfileViewName_PingMonitor { + public static string LocalConnection { get { - return ResourceManager.GetString("ProfileViewName_PingMonitor", resourceCulture); + return ResourceManager.GetString("LocalConnection", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Port Scanner ähnelt. + /// Looks up a localized string similar to Local devices and resources. /// - public static string ProfileViewName_PortScanner { + public static string LocalDevicesAndResources { get { - return ResourceManager.GetString("ProfileViewName_PortScanner", resourceCulture); + return ResourceManager.GetString("LocalDevicesAndResources", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die PowerShell ähnelt. + /// Looks up a localized string similar to Local end time. /// - public static string ProfileViewName_PowerShell { + public static string LocalEndTime { get { - return ResourceManager.GetString("ProfileViewName_PowerShell", resourceCulture); + return ResourceManager.GetString("LocalEndTime", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die PuTTY ähnelt. + /// Looks up a localized string similar to Local interface. /// - public static string ProfileViewName_PuTTY { + public static string LocalInterface { get { - return ResourceManager.GetString("ProfileViewName_PuTTY", resourceCulture); + return ResourceManager.GetString("LocalInterface", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remote Desktop ähnelt. + /// Looks up a localized string similar to Local IP address. /// - public static string ProfileViewName_RemoteDesktop { + public static string LocalIPAddress { get { - return ResourceManager.GetString("ProfileViewName_RemoteDesktop", resourceCulture); + return ResourceManager.GetString("LocalIPAddress", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die TigerVNC ähnelt. + /// Looks up a localized string similar to Local port. /// - public static string ProfileViewName_TigerVNC { + public static string LocalPort { get { - return ResourceManager.GetString("ProfileViewName_TigerVNC", resourceCulture); + return ResourceManager.GetString("LocalPort", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Traceroute ähnelt. + /// Looks up a localized string similar to Local ports. /// - public static string ProfileViewName_Traceroute { + public static string LocalPorts { get { - return ResourceManager.GetString("ProfileViewName_Traceroute", resourceCulture); + return ResourceManager.GetString("LocalPorts", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Wake on LAN ähnelt. + /// Looks up a localized string similar to Local start time. /// - public static string ProfileViewName_WakeOnLAN { + public static string LocalStartTime { get { - return ResourceManager.GetString("ProfileViewName_WakeOnLAN", resourceCulture); + return ResourceManager.GetString("LocalStartTime", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Web Console ähnelt. + /// Looks up a localized string similar to Location. /// - public static string ProfileViewName_WebConsole { + public static string Location { get { - return ResourceManager.GetString("ProfileViewName_WebConsole", resourceCulture); + return ResourceManager.GetString("Location", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Whois ähnelt. + /// Looks up a localized string similar to Location cannot be changed in portable version!. /// - public static string ProfileViewName_Whois { + public static string LocationCannotBeChangedInThePortableVersion { get { - return ResourceManager.GetString("ProfileViewName_Whois", resourceCulture); + return ResourceManager.GetString("LocationCannotBeChangedInThePortableVersion", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die A profile with this name already exists! ähnelt. + /// Looks up a localized string similar to Location.... /// - public static string ProfileWithThisNameAlreadyExists { + public static string LocationDots { get { - return ResourceManager.GetString("ProfileWithThisNameAlreadyExists", resourceCulture); + return ResourceManager.GetString("LocationDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Program ähnelt. + /// Looks up a localized string similar to Location of the import file.... /// - public static string Program { + public static string LocationOfTheImport { get { - return ResourceManager.GetString("Program", resourceCulture); + return ResourceManager.GetString("LocationOfTheImport", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Protocol ähnelt. + /// Looks up a localized string similar to Log. /// - public static string Protocol { + public static string Log { get { - return ResourceManager.GetString("Protocol", resourceCulture); + return ResourceManager.GetString("Log", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die PTR dns record resolved for "{0}"! ähnelt. + /// Looks up a localized string similar to Log file name. /// - public static string PTRDNSRecordResolvedForXXXMessage { + public static string LogFileName { get { - return ResourceManager.GetString("PTRDNSRecordResolvedForXXXMessage", resourceCulture); + return ResourceManager.GetString("LogFileName", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Public IP address check - ///is disabled! ähnelt. + /// Looks up a localized string similar to Log mode. /// - public static string PublicIPAddressCheckIsDisabled { + public static string LogMode { get { - return ResourceManager.GetString("PublicIPAddressCheckIsDisabled", resourceCulture); + return ResourceManager.GetString("LogMode", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Public IPv4 address ähnelt. + /// Looks up a localized string similar to Logon method. /// - public static string PublicIPv4Address { + public static string LogonMethod { get { - return ResourceManager.GetString("PublicIPv4Address", resourceCulture); + return ResourceManager.GetString("LogonMethod", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Public IPv6 address ähnelt. + /// Looks up a localized string similar to Log path. /// - public static string PublicIPv6Address { + public static string LogPath { get { - return ResourceManager.GetString("PublicIPv6Address", resourceCulture); + return ResourceManager.GetString("LogPath", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Purple ähnelt. + /// Looks up a localized string similar to Longitude. /// - public static string Purple { + public static string Longitude { get { - return ResourceManager.GetString("Purple", resourceCulture); + return ResourceManager.GetString("Longitude", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die PuTTY ähnelt. + /// Looks up a localized string similar to Lookup. /// - public static string PuTTY { + public static string Lookup { get { - return ResourceManager.GetString("PuTTY", resourceCulture); + return ResourceManager.GetString("Lookup", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die C:\Program Files\PuTTY\putty.exe ähnelt. + /// Looks up a localized string similar to Lost. /// - public static string PuTTYLocationDots { + public static string Lost { get { - return ResourceManager.GetString("PuTTYLocationDots", resourceCulture); + return ResourceManager.GetString("Lost", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Session log ähnelt. + /// Looks up a localized string similar to MAC Address. /// - public static string PuTTYLogMode_SessionLog { + public static string MACAddress { get { - return ResourceManager.GetString("PuTTYLogMode_SessionLog", resourceCulture); + return ResourceManager.GetString("MACAddress", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die SSH log ähnelt. + /// Looks up a localized string similar to MAC address or vendor. /// - public static string PuTTYLogMode_SSHLog { + public static string MACAddressOrVendor { get { - return ResourceManager.GetString("PuTTYLogMode_SSHLog", resourceCulture); + return ResourceManager.GetString("MACAddressOrVendor", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die SSH and Raw Log ähnelt. + /// Looks up a localized string similar to Magenta. /// - public static string PuTTYLogMode_SSHRawLog { + public static string Magenta { get { - return ResourceManager.GetString("PuTTYLogMode_SSHRawLog", resourceCulture); + return ResourceManager.GetString("Magenta", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die PuTTY process has ended! ähnelt. + /// Looks up a localized string similar to Magic packet successfully sent!. /// - public static string PuTTYProcessHasEnded { + public static string MagicPacketSentMessage { get { - return ResourceManager.GetString("PuTTYProcessHasEnded", resourceCulture); + return ResourceManager.GetString("MagicPacketSentMessage", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die PuTTY profile ähnelt. + /// Looks up a localized string similar to Management. /// - public static string PuTTYProfile { + public static string Management { get { - return ResourceManager.GetString("PuTTYProfile", resourceCulture); + return ResourceManager.GetString("Management", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Query ähnelt. + /// Looks up a localized string similar to Master Password. /// - public static string Query { + public static string MasterPassword { get { - return ResourceManager.GetString("Query", resourceCulture); + return ResourceManager.GetString("MasterPassword", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Query class ähnelt. + /// Looks up a localized string similar to Match. /// - public static string QueryClass { + public static string Match { get { - return ResourceManager.GetString("QueryClass", resourceCulture); + return ResourceManager.GetString("Match", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Questions ähnelt. + /// Looks up a localized string similar to Mauve. /// - public static string Questions { + public static string Mauve { get { - return ResourceManager.GetString("Questions", resourceCulture); + return ResourceManager.GetString("Mauve", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die RAW ähnelt. + /// Looks up a localized string similar to Max. concurrent host threads. /// - public static string RAW { + public static string MaxHostThreads { get { - return ResourceManager.GetString("RAW", resourceCulture); + return ResourceManager.GetString("MaxHostThreads", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Received ähnelt. + /// Looks up a localized string similar to Map. /// - public static string Received { + public static string Map { get { - return ResourceManager.GetString("Received", resourceCulture); + return ResourceManager.GetString("Map", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Received / Lost ähnelt. + /// Looks up a localized string similar to Scroll = Zoom, Drag = Pan. /// - public static string ReceivedLost { + public static string ScrollToZoomDragToPan { get { - return ResourceManager.GetString("ReceivedLost", resourceCulture); + return ResourceManager.GetString("ScrollToZoomDragToPan", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Reconnect ähnelt. + /// Looks up a localized string similar to Unknown. /// - public static string Reconnect { + public static string Unknown { get { - return ResourceManager.GetString("Reconnect", resourceCulture); + return ResourceManager.GetString("Unknown", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Reconnect if the connection is dropped ähnelt. + /// Looks up a localized string similar to Maximum. /// - public static string ReconnectIfTheConnectionIsDropped { + public static string Maximum { get { - return ResourceManager.GetString("ReconnectIfTheConnectionIsDropped", resourceCulture); + return ResourceManager.GetString("Maximum", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Recursion ähnelt. + /// Looks up a localized string similar to Maximum hops. /// - public static string Recursion { + public static string MaximumHops { get { - return ResourceManager.GetString("Recursion", resourceCulture); + return ResourceManager.GetString("MaximumHops", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Red ähnelt. + /// Looks up a localized string similar to Maximum number of backups. /// - public static string Red { + public static string MaximumNumberOfBackups { get { - return ResourceManager.GetString("Red", resourceCulture); + return ResourceManager.GetString("MaximumNumberOfBackups", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Redirect clipboard ähnelt. + /// Looks up a localized string similar to Maximum number ({0}) of hops/router reached!. /// - public static string RedirectClipboard { + public static string MaximumNumberOfHopsReached { get { - return ResourceManager.GetString("RedirectClipboard", resourceCulture); + return ResourceManager.GetString("MaximumNumberOfHopsReached", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Redirect devices ähnelt. + /// Looks up a localized string similar to Max. concurrent port threads. /// - public static string RedirectDevices { + public static string MaxPortThreads { get { - return ResourceManager.GetString("RedirectDevices", resourceCulture); + return ResourceManager.GetString("MaxPortThreads", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Redirect drives ähnelt. + /// Looks up a localized string similar to These settings only change the maximum number of concurrently executed threads per host/port scan. Go to Settings > General > General to adjust the (min) threads of the application.. /// - public static string RedirectDrives { + public static string MaxThreadsOnlyGoToSettingsGeneralGeneral { get { - return ResourceManager.GetString("RedirectDrives", resourceCulture); + return ResourceManager.GetString("MaxThreadsOnlyGoToSettingsGeneralGeneral", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Redirect ports ähnelt. + /// Looks up a localized string similar to Measured time. /// - public static string RedirectPorts { + public static string MeasuredTime { get { - return ResourceManager.GetString("RedirectPorts", resourceCulture); + return ResourceManager.GetString("MeasuredTime", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Redirect printers ähnelt. + /// Looks up a localized string similar to Measuring download speed.... /// - public static string RedirectPrinters { + public static string MeasuringDownloadSpeedDots { get { - return ResourceManager.GetString("RedirectPrinters", resourceCulture); + return ResourceManager.GetString("MeasuringDownloadSpeedDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Redirect smartcards ähnelt. + /// Looks up a localized string similar to Measuring latency.... /// - public static string RedirectSmartcards { + public static string MeasuringLatencyDots { get { - return ResourceManager.GetString("RedirectSmartcards", resourceCulture); + return ResourceManager.GetString("MeasuringLatencyDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Refresh ähnelt. + /// Looks up a localized string similar to Measuring upload speed.... /// - public static string Refresh { + public static string MeasuringUploadSpeedDots { get { - return ResourceManager.GetString("Refresh", resourceCulture); + return ResourceManager.GetString("MeasuringUploadSpeedDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Release ähnelt. + /// Looks up a localized string similar to Megabits. /// - public static string Release { + public static string Megabits { get { - return ResourceManager.GetString("Release", resourceCulture); + return ResourceManager.GetString("Megabits", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Release & Renew ähnelt. + /// Looks up a localized string similar to Megabytes. /// - public static string ReleaseRenew { + public static string Megabytes { get { - return ResourceManager.GetString("ReleaseRenew", resourceCulture); + return ResourceManager.GetString("Megabytes", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Reload ähnelt. + /// Looks up a localized string similar to Menu and window animation. /// - public static string Reload { + public static string MenuAndWindowAnimation { get { - return ResourceManager.GetString("Reload", resourceCulture); + return ResourceManager.GetString("MenuAndWindowAnimation", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remaining time ähnelt. + /// Looks up a localized string similar to Merge. /// - public static string RemainingTime { + public static string Merge { get { - return ResourceManager.GetString("RemainingTime", resourceCulture); + return ResourceManager.GetString("Merge", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remote audio ähnelt. + /// Looks up a localized string similar to Message size. /// - public static string RemoteAudio { + public static string MessageSize { get { - return ResourceManager.GetString("RemoteAudio", resourceCulture); + return ResourceManager.GetString("MessageSize", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remote audio playback ähnelt. + /// Looks up a localized string similar to MIB. /// - public static string RemoteAudioPlayback { + public static string MIB { get { - return ResourceManager.GetString("RemoteAudioPlayback", resourceCulture); + return ResourceManager.GetString("MIB", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remote audio recording ähnelt. + /// Looks up a localized string similar to Microsoft Edge WebView2 Runtime is not available!. /// - public static string RemoteAudioRecording { + public static string MicrosoftEdgeWebView2RuntimeIsNotAvailable { get { - return ResourceManager.GetString("RemoteAudioRecording", resourceCulture); + return ResourceManager.GetString("MicrosoftEdgeWebView2RuntimeIsNotAvailable", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remote console ähnelt. + /// Looks up a localized string similar to Microsoft.Windows.SDK.Contracts is required for this feature but not available on this system (e.g. on Windows Server).. /// - public static string RemoteConsole { + public static string MicrosoftWindowsSDKContractsIsNotAvailable { get { - return ResourceManager.GetString("RemoteConsole", resourceCulture); + return ResourceManager.GetString("MicrosoftWindowsSDKContractsIsNotAvailable", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remote Desktop ähnelt. + /// Looks up a localized string similar to Migrate. /// - public static string RemoteDesktop { + public static string Migrate { get { - return ResourceManager.GetString("RemoteDesktop", resourceCulture); + return ResourceManager.GetString("Migrate", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Do not record ähnelt. + /// Looks up a localized string similar to Minimize main window instead of terminating the application. /// - public static string RemoteDesktopAudioCaptureRedirectionMode_DoNotRecord { + public static string MinimizeInsteadOfTerminating { get { - return ResourceManager.GetString("RemoteDesktopAudioCaptureRedirectionMode_DoNotRecord", resourceCulture); + return ResourceManager.GetString("MinimizeInsteadOfTerminating", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Record from this computer ähnelt. + /// Looks up a localized string similar to Minimize to tray instead of taskbar. /// - public static string RemoteDesktopAudioCaptureRedirectionMode_RecordFromThisComputer { + public static string MinimizeToTrayInsteadOfTaskbar { get { - return ResourceManager.GetString("RemoteDesktopAudioCaptureRedirectionMode_RecordFromThisComputer", resourceCulture); + return ResourceManager.GetString("MinimizeToTrayInsteadOfTaskbar", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Do not play ähnelt. + /// Looks up a localized string similar to Minimum. /// - public static string RemoteDesktopAudioRedirectionMode_DoNotPlay { + public static string Minimum { get { - return ResourceManager.GetString("RemoteDesktopAudioRedirectionMode_DoNotPlay", resourceCulture); + return ResourceManager.GetString("Minimum", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Play on remote computer ähnelt. + /// Looks up a localized string similar to Mobile. /// - public static string RemoteDesktopAudioRedirectionMode_PlayOnRemoteComputer { + public static string Mobile { get { - return ResourceManager.GetString("RemoteDesktopAudioRedirectionMode_PlayOnRemoteComputer", resourceCulture); + return ResourceManager.GetString("Mobile", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Play on this computer ähnelt. + /// Looks up a localized string similar to Mode. /// - public static string RemoteDesktopAudioRedirectionMode_PlayOnThisComputer { + public static string Mode { get { - return ResourceManager.GetString("RemoteDesktopAudioRedirectionMode_PlayOnThisComputer", resourceCulture); + return ResourceManager.GetString("Mode", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Socket closed. ähnelt. + /// Looks up a localized string similar to Model. /// - public static string RemoteDesktopDisconnectReason_AtClientWinsockFDCLOSE { + public static string Model { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_AtClientWinsockFDCLOSE", resourceCulture); + return ResourceManager.GetString("Model", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remote disconnect by server. ähnelt. + /// Looks up a localized string similar to Move. /// - public static string RemoteDesktopDisconnectReason_ByServer { + public static string Move { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_ByServer", resourceCulture); + return ResourceManager.GetString("Move", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Decompression error. ähnelt. + /// Looks up a localized string similar to Move & Restart. /// - public static string RemoteDesktopDisconnectReason_ClientDecompressionError { + public static string MoveAndRestart { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_ClientDecompressionError", resourceCulture); + return ResourceManager.GetString("MoveAndRestart", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Connection timed out. ähnelt. + /// Looks up a localized string similar to Multicast. /// - public static string RemoteDesktopDisconnectReason_ConnectionTimedOut { + public static string Multicast { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_ConnectionTimedOut", resourceCulture); + return ResourceManager.GetString("Multicast", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Decryption error. ähnelt. + /// Looks up a localized string similar to Multiple instances. /// - public static string RemoteDesktopDisconnectReason_DecryptionError { + public static string MultipleInstances { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_DecryptionError", resourceCulture); + return ResourceManager.GetString("MultipleInstances", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die DNS name lookup failure. ähnelt. + /// Looks up a localized string similar to Multithreading. /// - public static string RemoteDesktopDisconnectReason_DNSLookupFailed { + public static string Multithreading { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_DNSLookupFailed", resourceCulture); + return ResourceManager.GetString("Multithreading", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die DNS lookup failed. ähnelt. + /// Looks up a localized string similar to Name. /// - public static string RemoteDesktopDisconnectReason_DNSLookupFailed2 { + public static string Name { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_DNSLookupFailed2", resourceCulture); + return ResourceManager.GetString("Name", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Encryption error. ähnelt. + /// Looks up a localized string similar to Delay. /// - public static string RemoteDesktopDisconnectReason_EncryptionError { + public static string NeighborState_Delay { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_EncryptionError", resourceCulture); + return ResourceManager.GetString("NeighborState_Delay", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Windows Sockets gethostbyname call failed. ähnelt. + /// Looks up a localized string similar to Incomplete. /// - public static string RemoteDesktopDisconnectReason_GetHostByNameFailed { + public static string NeighborState_Incomplete { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_GetHostByNameFailed", resourceCulture); + return ResourceManager.GetString("NeighborState_Incomplete", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Host not found. ähnelt. + /// Looks up a localized string similar to Permanent. /// - public static string RemoteDesktopDisconnectReason_HostNotFound { + public static string NeighborState_Permanent { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_HostNotFound", resourceCulture); + return ResourceManager.GetString("NeighborState_Permanent", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Internal error. ähnelt. + /// Looks up a localized string similar to Probe. /// - public static string RemoteDesktopDisconnectReason_InternalError { + public static string NeighborState_Probe { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_InternalError", resourceCulture); + return ResourceManager.GetString("NeighborState_Probe", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Internal security error. ähnelt. + /// Looks up a localized string similar to Reachable. /// - public static string RemoteDesktopDisconnectReason_InternalSecurityError { + public static string NeighborState_Reachable { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_InternalSecurityError", resourceCulture); + return ResourceManager.GetString("NeighborState_Reachable", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Internal security error. ähnelt. + /// Looks up a localized string similar to Stale. /// - public static string RemoteDesktopDisconnectReason_InternalSecurityError2 { + public static string NeighborState_Stale { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_InternalSecurityError2", resourceCulture); + return ResourceManager.GetString("NeighborState_Stale", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die The encryption method specified is not valid. ähnelt. + /// Looks up a localized string similar to Unreachable. /// - public static string RemoteDesktopDisconnectReason_InvalidEncryption { + public static string NeighborState_Unreachable { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_InvalidEncryption", resourceCulture); + return ResourceManager.GetString("NeighborState_Unreachable", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Bad IP address specified. ähnelt. + /// Looks up a localized string similar to Neighbor Table. /// - public static string RemoteDesktopDisconnectReason_InvalidIP { + public static string NeighborTable { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_InvalidIP", resourceCulture); + return ResourceManager.GetString("NeighborTable", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die The IP address specified is not valid. ähnelt. + /// Looks up a localized string similar to Read-only mode. Modifying the neighbor table requires elevated rights!. /// - public static string RemoteDesktopDisconnectReason_InvalidIPAddr { + public static string NeighborTableAdminMessage { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_InvalidIPAddr", resourceCulture); + return ResourceManager.GetString("NeighborTableAdminMessage", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Security data is not valid. ähnelt. + /// Looks up a localized string similar to NetBIOS. /// - public static string RemoteDesktopDisconnectReason_InvalidSecurityData { + public static string NetBIOS { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_InvalidSecurityData", resourceCulture); + return ResourceManager.GetString("NetBIOS", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Server security data is not valid. ähnelt. + /// Looks up a localized string similar to NetBIOS scan is disabled!. /// - public static string RemoteDesktopDisconnectReason_InvalidServerSecurityInfo { + public static string NetBIOSIsDisabled { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_InvalidServerSecurityInfo", resourceCulture); + return ResourceManager.GetString("NetBIOSIsDisabled", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die License negotiation failed. ähnelt. + /// Looks up a localized string similar to NetBIOS reachable. /// - public static string RemoteDesktopDisconnectReason_LicensingFailed { + public static string NetBIOSReachable { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_LicensingFailed", resourceCulture); + return ResourceManager.GetString("NetBIOSReachable", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Licensing time-out. ähnelt. + /// Looks up a localized string similar to Network. /// - public static string RemoteDesktopDisconnectReason_LicensingTimeout { + public static string Network { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_LicensingTimeout", resourceCulture); + return ResourceManager.GetString("Network", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Local disconnection. ähnelt. + /// Looks up a localized string similar to Network address. /// - public static string RemoteDesktopDisconnectReason_LocalNotError { + public static string NetworkAddress { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_LocalNotError", resourceCulture); + return ResourceManager.GetString("NetworkAddress", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die No information is available. ähnelt. + /// Looks up a localized string similar to Network connection. /// - public static string RemoteDesktopDisconnectReason_NoInfo { + public static string NetworkConnection { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_NoInfo", resourceCulture); + return ResourceManager.GetString("NetworkConnection", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Out of memory. ähnelt. + /// Looks up a localized string similar to Network connections..... /// - public static string RemoteDesktopDisconnectReason_OutOfMemory { + public static string NetworkConnectionsDots { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_OutOfMemory", resourceCulture); + return ResourceManager.GetString("NetworkConnectionsDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Out of memory. ähnelt. + /// Looks up a localized string similar to Network connection type. /// - public static string RemoteDesktopDisconnectReason_OutOfMemory2 { + public static string NetworkConnectionType { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_OutOfMemory2", resourceCulture); + return ResourceManager.GetString("NetworkConnectionType", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Out of memory. ähnelt. + /// Looks up a localized string similar to Network Interface. /// - public static string RemoteDesktopDisconnectReason_OutOfMemory3 { + public static string NetworkInterface { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_OutOfMemory3", resourceCulture); + return ResourceManager.GetString("NetworkInterface", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Remote disconnect by user. ähnelt. + /// Looks up a localized string similar to Configuration applied. /// - public static string RemoteDesktopDisconnectReason_RemoteByUser { + public static string NetworkInterfaceConfigurationAppliedSuccessfully { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_RemoteByUser", resourceCulture); + return ResourceManager.GetString("NetworkInterfaceConfigurationAppliedSuccessfully", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Failed to unpack server certificate. ähnelt. + /// Looks up a localized string similar to Configuring the network interface requires elevated rights!. /// - public static string RemoteDesktopDisconnectReason_ServerCertificateUnpackErr { + public static string NetworkInterfaceConfigureAdminMessage { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_ServerCertificateUnpackErr", resourceCulture); + return ResourceManager.GetString("NetworkInterfaceConfigureAdminMessage", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Windows Sockets connect failed. ähnelt. + /// Looks up a localized string similar to Network kind. /// - public static string RemoteDesktopDisconnectReason_SocketConnectFailed { + public static string NetworkKind { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_SocketConnectFailed", resourceCulture); + return ResourceManager.GetString("NetworkKind", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Windows Sockets recv call failed. ähnelt. + /// Looks up a localized string similar to The network address cannot be reached. Check if your computer is connected to the network. For information about network troubleshooting, see Windows Help.. /// - public static string RemoteDesktopDisconnectReason_SocketRecvFailed { + public static string NetworkLocationCannotBeReachedMessage { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_SocketRecvFailed", resourceCulture); + return ResourceManager.GetString("NetworkLocationCannotBeReachedMessage", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die The account is disabled. ähnelt. + /// Looks up a localized string similar to Analysing network packets requires elevated rights!. /// - public static string RemoteDesktopDisconnectReason_SslErrAccountDisabled { + public static string NetworkPacketsCaptureAdminMessage { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrAccountDisabled", resourceCulture); + return ResourceManager.GetString("NetworkPacketsCaptureAdminMessage", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die The account is expired. ähnelt. + /// Looks up a localized string similar to Network profile. /// - public static string RemoteDesktopDisconnectReason_SslErrAccountExpired { + public static string NetworkProfile { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrAccountExpired", resourceCulture); + return ResourceManager.GetString("NetworkProfile", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die The account is locked out. ähnelt. + /// Looks up a localized string similar to Network profiles. /// - public static string RemoteDesktopDisconnectReason_SslErrAccountLockedOut { + public static string NetworkProfiles { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrAccountLockedOut", resourceCulture); + return ResourceManager.GetString("NetworkProfiles", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die The account is restricted. ähnelt. + /// Looks up a localized string similar to Networks. /// - public static string RemoteDesktopDisconnectReason_SslErrAccountRestriction { + public static string Networks { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrAccountRestriction", resourceCulture); + return ResourceManager.GetString("Networks", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die The received certificate is expired. ähnelt. + /// Looks up a localized string similar to Network Status. /// - public static string RemoteDesktopDisconnectReason_SslErrCertExpired { + public static string NetworkStatus { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrCertExpired", resourceCulture); + return ResourceManager.GetString("NetworkStatus", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die The policy does not support delegation of credentials to the target server. ähnelt. + /// Looks up a localized string similar to Network time. /// - public static string RemoteDesktopDisconnectReason_SslErrDelegationPolicy { + public static string NetworkTime { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrDelegationPolicy", resourceCulture); + return ResourceManager.GetString("NetworkTime", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die The server authentication policy does not allow connection requests using saved credentials. The user must enter new credentials. ähnelt. + /// Looks up a localized string similar to Network unavailable!. /// - public static string RemoteDesktopDisconnectReason_SslErrFreshCredRequiredByServer { + public static string NetworkUnavailable { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrFreshCredRequiredByServer", resourceCulture); + return ResourceManager.GetString("NetworkUnavailable", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Login failed. ähnelt. + /// Looks up a localized string similar to Network usage. /// - public static string RemoteDesktopDisconnectReason_SslErrLogonFailure { + public static string NetworkUsage { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrLogonFailure", resourceCulture); + return ResourceManager.GetString("NetworkUsage", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die No authority could be contacted for authentication. The domain name of the authenticating party could be wrong, the domain could be unreachable, or there might have been a trust relationship failure. ähnelt. + /// Looks up a localized string similar to New connection.... /// - public static string RemoteDesktopDisconnectReason_SslErrNoAuthenticatingAuthority { + public static string NewConnectionDots { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrNoAuthenticatingAuthority", resourceCulture); + return ResourceManager.GetString("NewConnectionDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die The specified user has no account. ähnelt. + /// Looks up a localized string similar to New password. /// - public static string RemoteDesktopDisconnectReason_SslErrNoSuchUser { + public static string NewPassword { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrNoSuchUser", resourceCulture); + return ResourceManager.GetString("NewPassword", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die The password is expired. ähnelt. + /// Looks up a localized string similar to New subnet mask. /// - public static string RemoteDesktopDisconnectReason_SslErrPasswordExpired { + public static string NewSubnetMask { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrPasswordExpired", resourceCulture); + return ResourceManager.GetString("NewSubnetMask", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die The user password must be changed before logging on for the first time. ähnelt. + /// Looks up a localized string similar to New subnetmask or CIDR. /// - public static string RemoteDesktopDisconnectReason_SslErrPasswordMustChange { + public static string NewSubnetmaskOrCIDR { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrPasswordMustChange", resourceCulture); + return ResourceManager.GetString("NewSubnetmaskOrCIDR", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delegation of credentials to the target server is not allowed unless mutual authentication has been achieved. ähnelt. + /// Looks up a localized string similar to New tab. /// - public static string RemoteDesktopDisconnectReason_SslErrPolicyNTLMOnly { + public static string NewTab { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrPolicyNTLMOnly", resourceCulture); + return ResourceManager.GetString("NewTab", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die The smart card is blocked. ähnelt. + /// Looks up a localized string similar to Next. /// - public static string RemoteDesktopDisconnectReason_SslErrSmartcardCardBlocked { + public static string Next { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrSmartcardCardBlocked", resourceCulture); + return ResourceManager.GetString("Next", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die An incorrect PIN was presented to the smart card. ähnelt. + /// Looks up a localized string similar to No. /// - public static string RemoteDesktopDisconnectReason_SslErrSmartcardWrongPIN { + public static string No { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrSmartcardWrongPIN", resourceCulture); + return ResourceManager.GetString("No", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Timeout occurred. ähnelt. + /// Looks up a localized string similar to No A dns records resolved for "{0}"!. /// - public static string RemoteDesktopDisconnectReason_TimeoutOccurred { + public static string NoADNSRecordsResolvedForXXXMessage { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_TimeoutOccurred", resourceCulture); + return ResourceManager.GetString("NoADNSRecordsResolvedForXXXMessage", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Internal timer error. ähnelt. + /// Looks up a localized string similar to No discovery protocol packages received!. /// - public static string RemoteDesktopDisconnectReason_TimerError { + public static string NoDiscoveryProtocolPackagesReceived { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_TimerError", resourceCulture); + return ResourceManager.GetString("NoDiscoveryProtocolPackagesReceived", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die The remote session ended because the total login time limit was reached. This limit is set by the server administrator or by network policies. ähnelt. + /// Looks up a localized string similar to No DNS record found for "{0}"! Check your input and the settings.. /// - public static string RemoteDesktopDisconnectReason_TotalLoginTimeLimitReached { + public static string NoDNSRecordFoundCheckYourInputAndSettings { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_TotalLoginTimeLimitReached", resourceCulture); + return ResourceManager.GetString("NoDNSRecordFoundCheckYourInputAndSettings", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Unable to reconnect to the remote session. ähnelt. + /// Looks up a localized string similar to No enabled network adapters found!. /// - public static string RemoteDesktopDisconnectReason_UnableToReconnectToRemoteSession { + public static string NoEnabledNetworkAdaptersFound { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_UnableToReconnectToRemoteSession", resourceCulture); + return ResourceManager.GetString("NoEnabledNetworkAdaptersFound", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Windows Sockets send call failed. ähnelt. + /// Looks up a localized string similar to No matching commands!. /// - public static string RemoteDesktopDisconnectReason_WinsockSendFailed { + public static string NoMatchingCommands { get { - return ResourceManager.GetString("RemoteDesktopDisconnectReason_WinsockSendFailed", resourceCulture); + return ResourceManager.GetString("NoMatchingCommands", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die On the remote computer ähnelt. + /// Looks up a localized string similar to No open ports found!. /// - public static string RemoteDesktopKeyboardHookMode_OnTheRemoteComputer { + public static string NoOpenPortsFound { get { - return ResourceManager.GetString("RemoteDesktopKeyboardHookMode_OnTheRemoteComputer", resourceCulture); + return ResourceManager.GetString("NoOpenPortsFound", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die On this computer ähnelt. + /// Looks up a localized string similar to No ports found. Check your input!. /// - public static string RemoteDesktopKeyboardHookMode_OnThisComputer { + public static string NoPortsFoundCheckYourInput { get { - return ResourceManager.GetString("RemoteDesktopKeyboardHookMode_OnThisComputer", resourceCulture); + return ResourceManager.GetString("NoPortsFoundCheckYourInput", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die High-speed broadband (2 Mbps - 10 Mbps) ähnelt. + /// Looks up a localized string similar to No profiles found! + ///Create one.... /// - public static string RemoteDesktopNetworkConnectionType_BroadbandHigh { + public static string NoProfilesFoundCreateOne { get { - return ResourceManager.GetString("RemoteDesktopNetworkConnectionType_BroadbandHigh", resourceCulture); + return ResourceManager.GetString("NoProfilesFoundCreateOne", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Low-speed broadband (256 kbps - 2 Mbps) ähnelt. + /// Looks up a localized string similar to No PTR dns record resolved for "{0}"!. /// - public static string RemoteDesktopNetworkConnectionType_BroadbandLow { + public static string NoPTRDNSRecordResolvedForXXXMessage { get { - return ResourceManager.GetString("RemoteDesktopNetworkConnectionType_BroadbandLow", resourceCulture); + return ResourceManager.GetString("NoPTRDNSRecordResolvedForXXXMessage", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Detect connection quality automatically ähnelt. + /// Looks up a localized string similar to No reachable hosts found!. /// - public static string RemoteDesktopNetworkConnectionType_DetectAutomatically { + public static string NoReachableHostsFound { get { - return ResourceManager.GetString("RemoteDesktopNetworkConnectionType_DetectAutomatically", resourceCulture); + return ResourceManager.GetString("NoReachableHostsFound", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die LAN (10 Mbps or higher) ähnelt. + /// Looks up a localized string similar to No tags found!. /// - public static string RemoteDesktopNetworkConnectionType_LAN { + public static string NoTagsFound { get { - return ResourceManager.GetString("RemoteDesktopNetworkConnectionType_LAN", resourceCulture); + return ResourceManager.GetString("NoTagsFound", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Modem (56 kbps) ähnelt. + /// Looks up a localized string similar to Notation. /// - public static string RemoteDesktopNetworkConnectionType_Modem { + public static string Notation { get { - return ResourceManager.GetString("RemoteDesktopNetworkConnectionType_Modem", resourceCulture); + return ResourceManager.GetString("Notation", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Satellite (2 Mbps - 16 Mbps with high latency) ähnelt. + /// Looks up a localized string similar to (not changed). /// - public static string RemoteDesktopNetworkConnectionType_Satellite { + public static string NotChanged { get { - return ResourceManager.GetString("RemoteDesktopNetworkConnectionType_Satellite", resourceCulture); + return ResourceManager.GetString("NotChanged", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die WAN (10 Mbps or higher with high latency) ähnelt. + /// Looks up a localized string similar to Note. /// - public static string RemoteDesktopNetworkConnectionType_WAN { + public static string Note { get { - return ResourceManager.GetString("RemoteDesktopNetworkConnectionType_WAN", resourceCulture); + return ResourceManager.GetString("Note", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remote IP address ähnelt. + /// Looks up a localized string similar to Nothing found!. /// - public static string RemoteIPAddress { + public static string NothingFound { get { - return ResourceManager.GetString("RemoteIPAddress", resourceCulture); + return ResourceManager.GetString("NothingFound", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remote port ähnelt. + /// Looks up a localized string similar to Nothing to do. Check your input!. /// - public static string RemotePort { + public static string NothingToDoCheckYourInput { + get { + return ResourceManager.GetString("NothingToDoCheckYourInput", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Display duration (seconds). + /// + public static string NotificationDurationInSeconds { + get { + return ResourceManager.GetString("NotificationDurationInSeconds", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failure threshold. + /// + public static string NotificationFailureThreshold { + get { + return ResourceManager.GetString("NotificationFailureThreshold", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Success threshold. + /// + public static string NotificationSuccessThreshold { + get { + return ResourceManager.GetString("NotificationSuccessThreshold", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No update available!. + /// + public static string NoUpdateAvailable { + get { + return ResourceManager.GetString("NoUpdateAvailable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No valid file found to import.. + /// + public static string NoValidFileFoundToImport { + get { + return ResourceManager.GetString("NoValidFileFoundToImport", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A valid path to PowerShell should end with "pwsh.exe" or "powershell.exe"!. + /// + public static string NoValidPowerShellPath { + get { + return ResourceManager.GetString("NoValidPowerShellPath", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A valid path to PuTTY should end with "PuTTY.exe"!. + /// + public static string NoValidPuTTYPath { + get { + return ResourceManager.GetString("NoValidPuTTYPath", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A valid path to TigerVNC should end with "vncviewer-*.exe" or "vncviewer64-*.exe"!. + /// + public static string NoValidTigerVNCPath { + get { + return ResourceManager.GetString("NoValidTigerVNCPath", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No vendor found. Check your input!. + /// + public static string NoVendorFoundCheckYourInput { + get { + return ResourceManager.GetString("NoVendorFoundCheckYourInput", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No WiFi adapters found!. + /// + public static string NoWiFiAdaptersFound { + get { + return ResourceManager.GetString("NoWiFiAdaptersFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No WiFi networks found!. + /// + public static string NoWiFiNetworksFound { + get { + return ResourceManager.GetString("NoWiFiNetworksFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Number of errors after which is canceled:. + /// + public static string NumberOfErrorsAfterWhichIsCanceled { + get { + return ResourceManager.GetString("NumberOfErrorsAfterWhichIsCanceled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Number of stored entries. + /// + public static string NumberOfStoredEntries { + get { + return ResourceManager.GetString("NumberOfStoredEntries", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Obtain an IP address automatically. + /// + public static string ObtainAnIPAddressAutomatically { + get { + return ResourceManager.GetString("ObtainAnIPAddressAutomatically", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Obtain DNS server address automatically. + /// + public static string ObtainDNSServerAddressAutomatically { + get { + return ResourceManager.GetString("ObtainDNSServerAddressAutomatically", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Off. + /// + public static string Off { + get { + return ResourceManager.GetString("Off", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Official. + /// + public static string Official { + get { + return ResourceManager.GetString("Official", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Offset. + /// + public static string Offset { + get { + return ResourceManager.GetString("Offset", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to OID. + /// + public static string OID { + get { + return ResourceManager.GetString("OID", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to OID profiles. + /// + public static string OIDProfiles { + get { + return ResourceManager.GetString("OIDProfiles", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to OK. + /// + public static string OK { + get { + return ResourceManager.GetString("OK", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Olive. + /// + public static string Olive { + get { + return ResourceManager.GetString("Olive", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to On. + /// + public static string On { + get { + return ResourceManager.GetString("On", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Only numbers can be entered!. + /// + public static string OnlyNumbersCanBeEntered { + get { + return ResourceManager.GetString("OnlyNumbersCanBeEntered", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Only CSV files are allowed!. + /// + public static string OnlyCsvFilesAllowed { + get { + return ResourceManager.GetString("OnlyCsvFilesAllowed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Only when using the full screen. + /// + public static string OnlyWhenUsingTheFullScreen { + get { + return ResourceManager.GetString("OnlyWhenUsingTheFullScreen", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open. + /// + public static string Open { + get { + return ResourceManager.GetString("Open", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open documentation. + /// + public static string OpenDocumentation { + get { + return ResourceManager.GetString("OpenDocumentation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open hosts file. + /// + public static string OpenHostsFile { + get { + return ResourceManager.GetString("OpenHostsFile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open license. + /// + public static string OpenLicense { + get { + return ResourceManager.GetString("OpenLicense", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open location. + /// + public static string OpenLocation { + get { + return ResourceManager.GetString("OpenLocation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open OID profiles.... + /// + public static string OpenOIDProfilesDots { + get { + return ResourceManager.GetString("OpenOIDProfilesDots", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open port profiles.... + /// + public static string OpenPortProfilesDots { + get { + return ResourceManager.GetString("OpenPortProfilesDots", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open project. + /// + public static string OpenProject { + get { + return ResourceManager.GetString("OpenProject", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open settings. + /// + public static string OpenSettings { + get { + return ResourceManager.GetString("OpenSettings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open settings.... + /// + public static string OpenSettingsDots { + get { + return ResourceManager.GetString("OpenSettingsDots", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open the documentation.. + /// + public static string OpenTheDocumentation { + get { + return ResourceManager.GetString("OpenTheDocumentation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open website. + /// + public static string OpenWebsite { + get { + return ResourceManager.GetString("OpenWebsite", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Options. + /// + public static string Options { + get { + return ResourceManager.GetString("Options", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Orange. + /// + public static string Orange { + get { + return ResourceManager.GetString("Orange", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Organization. + /// + public static string Organization { + get { + return ResourceManager.GetString("Organization", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to OUI. + /// + public static string OUI { + get { + return ResourceManager.GetString("OUI", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Outbound. + /// + public static string Outbound { + get { + return ResourceManager.GetString("Outbound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to override. + /// + public static string Override { + get { + return ResourceManager.GetString("Override", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Override default settings. + /// + public static string OverrideDefaultSettings { + get { + return ResourceManager.GetString("OverrideDefaultSettings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Overwrite. + /// + public static string Overwrite { + get { + return ResourceManager.GetString("Overwrite", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Overwrite?. + /// + public static string OverwriteQuestion { + get { + return ResourceManager.GetString("OverwriteQuestion", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Packet loss. + /// + public static string PacketLoss { + get { + return ResourceManager.GetString("PacketLoss", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Packets transmitted. + /// + public static string PacketsTransmitted { + get { + return ResourceManager.GetString("PacketsTransmitted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Parameter. + /// + public static string Parameter { + get { + return ResourceManager.GetString("Parameter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Password. + /// + public static string Password { + get { + return ResourceManager.GetString("Password", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Passwords do not match!. + /// + public static string PasswordsDoNotMatch { + get { + return ResourceManager.GetString("PasswordsDoNotMatch", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Parse. + /// + public static string Parse { + get { + return ResourceManager.GetString("Parse", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Paste. + /// + public static string Paste { + get { + return ResourceManager.GetString("Paste", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Patch. + /// + public static string Patch { + get { + return ResourceManager.GetString("Patch", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Path. + /// + public static string Path { + get { + return ResourceManager.GetString("Path", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pause. + /// + public static string Pause { + get { + return ResourceManager.GetString("Pause", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Performance. + /// + public static string Performance { + get { + return ResourceManager.GetString("Performance", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Persistent bitmap caching. + /// + public static string PersistentBitmapCaching { + get { + return ResourceManager.GetString("PersistentBitmapCaching", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Petabits. + /// + public static string Petabits { + get { + return ResourceManager.GetString("Petabits", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Petabytes. + /// + public static string Petabytes { + get { + return ResourceManager.GetString("Petabytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Phy kind. + /// + public static string PhyKind { + get { + return ResourceManager.GetString("PhyKind", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PhysicalAddress. + /// + public static string PhysicalAddress { + get { + return ResourceManager.GetString("PhysicalAddress", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ping. + /// + public static string Ping { + get { + return ResourceManager.GetString("Ping", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ping details. + /// + public static string PingDetails { + get { + return ResourceManager.GetString("PingDetails", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ping Monitor. + /// + public static string PingMonitor { + get { + return ResourceManager.GetString("PingMonitor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Notification. + /// + public static string PingMonitorNotification { + get { + return ResourceManager.GetString("PingMonitorNotification", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ping status. + /// + public static string PingStatus { + get { + return ResourceManager.GetString("PingStatus", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pink. + /// + public static string Pink { + get { + return ResourceManager.GetString("Pink", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Play sound on status change. + /// + public static string PlaySoundOnStatusChange { + get { + return ResourceManager.GetString("PlaySoundOnStatusChange", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to (+{0} more). + /// + public static string PlusXMore { + get { + return ResourceManager.GetString("PlusXMore", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Port. + /// + public static string Port { + get { + return ResourceManager.GetString("Port", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Portable. + /// + public static string Portable { + get { + return ResourceManager.GetString("Portable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Port description. + /// + public static string PortDescription { + get { + return ResourceManager.GetString("PortDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Port or service. + /// + public static string PortOrService { + get { + return ResourceManager.GetString("PortOrService", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Port profiles. + /// + public static string PortProfiles { + get { + return ResourceManager.GetString("PortProfiles", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ports. + /// + public static string Ports { + get { + return ResourceManager.GetString("Ports", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Port scan is disabled!. + /// + public static string PortScanIsDisabled { + get { + return ResourceManager.GetString("PortScanIsDisabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Port Scanner. + /// + public static string PortScanner { + get { + return ResourceManager.GetString("PortScanner", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Closed. + /// + public static string PortState_Closed { + get { + return ResourceManager.GetString("PortState_Closed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open. + /// + public static string PortState_Open { + get { + return ResourceManager.GetString("PortState_Open", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Timed out. + /// + public static string PortState_TimedOut { + get { + return ResourceManager.GetString("PortState_TimedOut", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Port status. + /// + public static string PortStatus { + get { + return ResourceManager.GetString("PortStatus", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PowerShell. + /// + public static string PowerShell { + get { + return ResourceManager.GetString("PowerShell", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The color of the PowerShell console can be changed to the application theme under Settings > General > Appearance. + /// + public static string PowerShellConsoleColorCanBeChangedUnderSettingsGeneralApperance { + get { + return ResourceManager.GetString("PowerShellConsoleColorCanBeChangedUnderSettingsGeneralApperance", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PowerShell process has ended!. + /// + public static string PowerShellProcessHasEnded { + get { + return ResourceManager.GetString("PowerShellProcessHasEnded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Preferred protocol when resolving hostname:. + /// + public static string PreferredProtocolWhenResolvingHostname { + get { + return ResourceManager.GetString("PreferredProtocolWhenResolvingHostname", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pre-shared key. + /// + public static string PreSharedKey { + get { + return ResourceManager.GetString("PreSharedKey", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Preview. + /// + public static string Preview { + get { + return ResourceManager.GetString("Preview", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Primary DNS server. + /// + public static string PrimaryDNSServer { + get { + return ResourceManager.GetString("PrimaryDNSServer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Priv. + /// + public static string Priv { + get { + return ResourceManager.GetString("Priv", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Privacy. + /// + public static string Privacy { + get { + return ResourceManager.GetString("Privacy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Private. + /// + public static string Private { + get { + return ResourceManager.GetString("Private", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Private key file. + /// + public static string PrivateKeyFile { + get { + return ResourceManager.GetString("PrivateKeyFile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Process ID. + /// + public static string ProcessID { + get { + return ResourceManager.GetString("ProcessID", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Process name. + /// + public static string ProcessName { + get { + return ResourceManager.GetString("ProcessName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Process path. + /// + public static string ProcessPath { + get { + return ResourceManager.GetString("ProcessPath", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Profile. + /// + public static string Profile { + get { + return ResourceManager.GetString("Profile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Profile files are encrypted on disk using AES with a key size of 256 bits and a block size of 128 bits in CBC mode. The encryption key is derived from a master password using Rfc2898DeriveBytes (PBKDF2) with 1,000,000 iterations. At runtime, passwords are stored as SecureString once the profile file is loaded. For some functions, the password must be converted to a normal string and remains unencrypted in memory until the garbage collector cleans them up. + /// + ///First make a backup copy of your profile files be [rest of string was truncated]";. + /// + public static string ProfileEncryptionDisclaimer { + get { + return ResourceManager.GetString("ProfileEncryptionDisclaimer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Profile file. + /// + public static string ProfileFile { + get { + return ResourceManager.GetString("ProfileFile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Profile file could not be loaded!. + /// + public static string ProfileFileCouldNotBeLoaded { + get { + return ResourceManager.GetString("ProfileFileCouldNotBeLoaded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The profile file could not be loaded and may be corrupted. You can try to restore the file from a backup or delete it. + /// + ///If this happens unexpectedly or after an update, please report the error on GitHub. + /// + /// + ///Error message: + ///"{0}". + /// + public static string ProfileFileCouldNotBeLoadedMessage { + get { + return ResourceManager.GetString("ProfileFileCouldNotBeLoadedMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Profile files. + /// + public static string ProfileFiles { + get { + return ResourceManager.GetString("ProfileFiles", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Profile group. + /// + public static string ProfileGroup { + get { + return ResourceManager.GetString("ProfileGroup", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Application. + /// + public static string ProfileGroup_Application { + get { + return ResourceManager.GetString("ProfileGroup_Application", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to General. + /// + public static string ProfileGroup_General { + get { + return ResourceManager.GetString("ProfileGroup_General", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} profile(s) imported. + ///{1} duplicate entries skipped. + ///{2} without a host skipped.. + /// + public static string ProfileImportSummary { + get { + return ResourceManager.GetString("ProfileImportSummary", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to General. + /// + public static string ProfileName_General { + get { + return ResourceManager.GetString("ProfileName_General", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Profile name already exists!. + /// + public static string ProfileNameAlreadyExists { + get { + return ResourceManager.GetString("ProfileNameAlreadyExists", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Profiles. + /// + public static string Profiles { + get { + return ResourceManager.GetString("Profiles", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Profiles and regions to synchronize. + /// + public static string ProfilesAndRegionsToSync { + get { + return ResourceManager.GetString("ProfilesAndRegionsToSync", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Profiles reloaded. + /// + public static string ProfilesReloaded { + get { + return ResourceManager.GetString("ProfilesReloaded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A profile with this name already exists!. + /// + public static string ProfileWithThisNameAlreadyExists { + get { + return ResourceManager.GetString("ProfileWithThisNameAlreadyExists", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Program. + /// + public static string Program { + get { + return ResourceManager.GetString("Program", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Protocol. + /// + public static string Protocol { + get { + return ResourceManager.GetString("Protocol", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Proxy. + /// + public static string Proxy { + get { + return ResourceManager.GetString("Proxy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PTR dns record resolved for "{0}"!. + /// + public static string PTRDNSRecordResolvedForXXXMessage { + get { + return ResourceManager.GetString("PTRDNSRecordResolvedForXXXMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PTR record. + /// + public static string PTRRecord { + get { + return ResourceManager.GetString("PTRRecord", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Public. + /// + public static string Public { + get { + return ResourceManager.GetString("Public", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Public IP address check + ///is disabled!. + /// + public static string PublicIPAddressCheckIsDisabled { + get { + return ResourceManager.GetString("PublicIPAddressCheckIsDisabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Public IPv4 address. + /// + public static string PublicIPv4Address { + get { + return ResourceManager.GetString("PublicIPv4Address", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Public IPv6 address. + /// + public static string PublicIPv6Address { + get { + return ResourceManager.GetString("PublicIPv6Address", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Purple. + /// + public static string Purple { + get { + return ResourceManager.GetString("Purple", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PuTTY. + /// + public static string PuTTY { + get { + return ResourceManager.GetString("PuTTY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session log. + /// + public static string PuTTYLogMode_SessionLog { + get { + return ResourceManager.GetString("PuTTYLogMode_SessionLog", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SSH log. + /// + public static string PuTTYLogMode_SSHLog { + get { + return ResourceManager.GetString("PuTTYLogMode_SSHLog", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SSH and Raw log. + /// + public static string PuTTYLogMode_SSHRawLog { + get { + return ResourceManager.GetString("PuTTYLogMode_SSHRawLog", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PuTTY process has ended!. + /// + public static string PuTTYProcessHasEnded { + get { + return ResourceManager.GetString("PuTTYProcessHasEnded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Query. + /// + public static string Query { + get { + return ResourceManager.GetString("Query", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Query class. + /// + public static string QueryClass { + get { + return ResourceManager.GetString("QueryClass", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Questions. + /// + public static string Questions { + get { + return ResourceManager.GetString("Questions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Rate limit reached! Try again in {0} seconds.... + /// + public static string RateLimitReachedTryAgainInXSeconds { + get { + return ResourceManager.GetString("RateLimitReachedTryAgainInXSeconds", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to RAW. + /// + public static string RAW { + get { + return ResourceManager.GetString("RAW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Received. + /// + public static string Received { + get { + return ResourceManager.GetString("Received", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Received / Lost. + /// + public static string ReceivedLost { + get { + return ResourceManager.GetString("ReceivedLost", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reconnect. + /// + public static string Reconnect { + get { + return ResourceManager.GetString("Reconnect", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reconnect if the connection is dropped. + /// + public static string ReconnectIfTheConnectionIsDropped { + get { + return ResourceManager.GetString("ReconnectIfTheConnectionIsDropped", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Recursion. + /// + public static string Recursion { + get { + return ResourceManager.GetString("Recursion", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Red. + /// + public static string Red { + get { + return ResourceManager.GetString("Red", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Redirect clipboard. + /// + public static string RedirectClipboard { + get { + return ResourceManager.GetString("RedirectClipboard", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Redirect devices. + /// + public static string RedirectDevices { + get { + return ResourceManager.GetString("RedirectDevices", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Redirect drives. + /// + public static string RedirectDrives { + get { + return ResourceManager.GetString("RedirectDrives", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Redirect ports. + /// + public static string RedirectPorts { + get { + return ResourceManager.GetString("RedirectPorts", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Redirect printers. + /// + public static string RedirectPrinters { + get { + return ResourceManager.GetString("RedirectPrinters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Redirect smartcards. + /// + public static string RedirectSmartcards { + get { + return ResourceManager.GetString("RedirectSmartcards", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Refresh. + /// + public static string Refresh { + get { + return ResourceManager.GetString("Refresh", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Refreshing.... + /// + public static string RefreshingDots { + get { + return ResourceManager.GetString("RefreshingDots", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Region. + /// + public static string Region { + get { + return ResourceManager.GetString("Region", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Release. + /// + public static string Release { + get { + return ResourceManager.GetString("Release", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Release & Renew. + /// + public static string ReleaseRenew { + get { + return ResourceManager.GetString("ReleaseRenew", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reload. + /// + public static string Reload { + get { + return ResourceManager.GetString("Reload", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reloaded at {0}. + /// + public static string ReloadedAtX { + get { + return ResourceManager.GetString("ReloadedAtX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remaining time. + /// + public static string RemainingTime { + get { + return ResourceManager.GetString("RemainingTime", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remote addresses. + /// + public static string RemoteAddresses { + get { + return ResourceManager.GetString("RemoteAddresses", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remote audio. + /// + public static string RemoteAudio { + get { + return ResourceManager.GetString("RemoteAudio", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remote audio playback. + /// + public static string RemoteAudioPlayback { + get { + return ResourceManager.GetString("RemoteAudioPlayback", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remote audio recording. + /// + public static string RemoteAudioRecording { + get { + return ResourceManager.GetString("RemoteAudioRecording", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remote console. + /// + public static string RemoteConsole { + get { + return ResourceManager.GetString("RemoteConsole", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remote Desktop. + /// + public static string RemoteDesktop { + get { + return ResourceManager.GetString("RemoteDesktop", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Do not record. + /// + public static string RemoteDesktopAudioCaptureRedirectionMode_DoNotRecord { + get { + return ResourceManager.GetString("RemoteDesktopAudioCaptureRedirectionMode_DoNotRecord", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Record from this computer. + /// + public static string RemoteDesktopAudioCaptureRedirectionMode_RecordFromThisComputer { + get { + return ResourceManager.GetString("RemoteDesktopAudioCaptureRedirectionMode_RecordFromThisComputer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Do not play. + /// + public static string RemoteDesktopAudioRedirectionMode_DoNotPlay { + get { + return ResourceManager.GetString("RemoteDesktopAudioRedirectionMode_DoNotPlay", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Play on remote computer. + /// + public static string RemoteDesktopAudioRedirectionMode_PlayOnRemoteComputer { + get { + return ResourceManager.GetString("RemoteDesktopAudioRedirectionMode_PlayOnRemoteComputer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Play on this computer. + /// + public static string RemoteDesktopAudioRedirectionMode_PlayOnThisComputer { + get { + return ResourceManager.GetString("RemoteDesktopAudioRedirectionMode_PlayOnThisComputer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your computer can't connect to the remote computer due to one of the following reasons: 1) The requested Remote Desktop Gateway server address and the server SSL certificate subject name do not match. 2) The certificate is expired or revoked. 3) The certificate root authority does not trust the certificate. Contact your network administrator for assistance.. + /// + public static string RemoteDesktopDisconnectReason_50331651 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331651", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This computer can't verify the identity of the RD Gateway "". It's not safe to connect to servers that can't be identified. Contact your network administrator for assistance.. + /// + public static string RemoteDesktopDisconnectReason_50331653 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331653", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your computer can't connect to the remote computer because the Remote Desktop Gateway server address requested and the certificate subject name do not match. Contact your network administrator for assistance.. + /// + public static string RemoteDesktopDisconnectReason_50331654 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331654", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your computer can't connect to the remote computer because the Remote Desktop Gateway server's certificate has expired or has been revoked. Contact your network administrator for assistance.. + /// + public static string RemoteDesktopDisconnectReason_50331655 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331655", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to An error occurred while sending data to the Remote Desktop Gateway server. The server is temporarily unavailable or a network connection is down. Try again later, or contact your network administrator for assistance.. + /// + public static string RemoteDesktopDisconnectReason_50331657 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331657", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to An error occurred while receiving data from the Remote Desktop Gateway server. Either the server is temporarily unavailable or a network connection is down. Try again later, or contact your network administrator for assistance.. + /// + public static string RemoteDesktopDisconnectReason_50331658 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331658", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your computer can't connect to the remote computer because the Remote Desktop Gateway server address is unreachable or incorrect. Type a valid Remote Desktop Gateway server address.. + /// + public static string RemoteDesktopDisconnectReason_50331660 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331660", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your computer can't connect to the remote computer because the Remote Desktop Gateway server is temporarily unavailable. Try reconnecting later or contact your network administrator for assistance.. + /// + public static string RemoteDesktopDisconnectReason_50331661 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331661", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your computer can't connect to the remote computer because the Remote Desktop Gateway server is running low on server resources and is temporarily unavailable. Try reconnecting later or contact your network administrator for assistance.. + /// + public static string RemoteDesktopDisconnectReason_50331663 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331663", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The Remote Desktop Gateway server has ended the connection. Try reconnecting later or contact your network administrator for assistance.. + /// + public static string RemoteDesktopDisconnectReason_50331672 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331672", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The Remote Desktop Gateway server administrator has ended the connection. Try reconnecting later or contact your network administrator for assistance.. + /// + public static string RemoteDesktopDisconnectReason_50331673 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331673", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remote Desktop can't connect to the remote computer "" for one of these reasons: 1) Your user account is not listed in the RD Gateway's permission list 2) You might have specified the remote computer in NetBIOS format (for example, computer1), but the RD Gateway is expecting an FQDN or IP address format (for example, computer1.fabrikam.com or 157.60.0.1). Contact your network administrator for assistance.. + /// + public static string RemoteDesktopDisconnectReason_50331675 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331675", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remote Desktop can't connect to the remote computer "" for one of these reasons: 1) Your user account is not authorized to access the RD Gateway "" 2) Your computer is not authorized to access the RD Gateway "" 3) You are using an incompatible authentication method (for example, the RD Gateway might be expecting a smart card but you provided a password) Contact your network administrator for assistance.. + /// + public static string RemoteDesktopDisconnectReason_50331676 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331676", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your computer can't connect to the remote computer because your network administrator has restricted access to this RD Gateway server. Contact your network administrator for assistance.. + /// + public static string RemoteDesktopDisconnectReason_50331679 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331679", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your computer can't connect to the remote computer because the web proxy server requires authentication. To allow unauthenticated traffic to an RD Gateway server through your web proxy server, contact your network administrator.. + /// + public static string RemoteDesktopDisconnectReason_50331680 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331680", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your computer can't connect to the remote computer because the Remote Desktop Gateway server reached its maximum allowed connections. Try reconnecting later or contact your network administrator for assistance.. + /// + public static string RemoteDesktopDisconnectReason_50331682 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331682", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your computer can't connect to the remote computer because the Remote Desktop Gateway server does not support the request. Contact your network administrator for assistance.. + /// + public static string RemoteDesktopDisconnectReason_50331683 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331683", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your computer can't connect to the remote computer because the client does not support one of the Remote Desktop Gateway's capabilities. Contact your network administrator for assistance.. + /// + public static string RemoteDesktopDisconnectReason_50331684 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331684", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your computer can't connect to the remote computer because the Remote Desktop Gateway server and this computer are incompatible. Contact your network administrator for assistance.. + /// + public static string RemoteDesktopDisconnectReason_50331685 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331685", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your computer can't connect to the remote computer because no certificate was configured to use at the Remote Desktop Gateway server. Contact your network administrator for assistance.. + /// + public static string RemoteDesktopDisconnectReason_50331688 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331688", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your computer can't connect to the remote computer because the RD Gateway server that you are trying to connect to is not allowed by your computer administrator. If you are the administrator, add this Remote Desktop Gateway server name to the trusted Remote Desktop Gateway server list on your computer and then try connecting again.. + /// + public static string RemoteDesktopDisconnectReason_50331689 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331689", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your computer can't connect to the remote computer because your computer or device did not meet the Network Access Protection requirements set by your network administrator, for one of the following reasons: 1) The Remote Desktop Gateway server name and the server's public key certificate subject name do not match. 2) The certificate has expired or has been revoked. 3) The certificate root authority does not trust the certificate. 4) The certificate key extension does not support encryption. 5) Your comput [rest of string was truncated]";. + /// + public static string RemoteDesktopDisconnectReason_50331690 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331690", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your computer can't connect to the remote computer because a user name and password are required to authenticate to the Remote Desktop Gateway server instead of smart card credentials.. + /// + public static string RemoteDesktopDisconnectReason_50331691 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331691", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your computer can't connect to the remote computer because smart card credentials are required to authenticate to the Remote Desktop Gateway server instead of a user name and password.. + /// + public static string RemoteDesktopDisconnectReason_50331692 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331692", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your computer can't connect to the remote computer because an invalid cookie was sent to the Remote Desktop Gateway server. Contact your network administrator for assistance.. + /// + public static string RemoteDesktopDisconnectReason_50331700 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331700", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your computer can't connect to the remote computer because the cookie was rejected by the Remote Desktop Gateway server. Contact your network administrator for assistance.. + /// + public static string RemoteDesktopDisconnectReason_50331701 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331701", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your computer can't connect to the remote computer because the Remote Desktop Gateway server is expecting an authentication method different from the one attempted. Contact your network administrator for assistance.. + /// + public static string RemoteDesktopDisconnectReason_50331703 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331703", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The RD Gateway connection ended because periodic user authentication failed. Try reconnecting with a correct user name and password. If the reconnection fails, contact your network administrator for further assistance.. + /// + public static string RemoteDesktopDisconnectReason_50331704 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331704", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The RD Gateway connection ended because periodic user authorization failed. Try reconnecting with a correct user name and password. If the reconnection fails, contact your network administrator for further assistance.. + /// + public static string RemoteDesktopDisconnectReason_50331705 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331705", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your computer can't connect to the remote computer because the Remote Desktop Gateway and the remote computer are unable to exchange policies. This could happen due to one of the following reasons: 1. The remote computer is not capable of exchanging policies with the Remote Desktop Gateway. 2. The remote computer's configuration does not permit a new connection. 3. The connection between the Remote Desktop Gateway and the remote computer ended. Contact your network administrator for assistanc [rest of string was truncated]";. + /// + public static string RemoteDesktopDisconnectReason_50331707 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331707", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The RD Gateway connection ended because periodic user authorization failed. Your computer or device didn't pass the Network Access Protection (NAP) requirements set by your network administrator. Contact your network administrator for assistance.. + /// + public static string RemoteDesktopDisconnectReason_50331713 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_50331713", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Socket closed.. + /// + public static string RemoteDesktopDisconnectReason_AtClientWinsockFDCLOSE { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_AtClientWinsockFDCLOSE", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remote disconnect by server.. + /// + public static string RemoteDesktopDisconnectReason_ByServer { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_ByServer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Decompression error.. + /// + public static string RemoteDesktopDisconnectReason_ClientDecompressionError { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_ClientDecompressionError", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Connection timed out.. + /// + public static string RemoteDesktopDisconnectReason_ConnectionTimedOut { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_ConnectionTimedOut", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Decryption error.. + /// + public static string RemoteDesktopDisconnectReason_DecryptionError { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_DecryptionError", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DNS name lookup failure.. + /// + public static string RemoteDesktopDisconnectReason_DNSLookupFailed { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_DNSLookupFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DNS lookup failed.. + /// + public static string RemoteDesktopDisconnectReason_DNSLookupFailed2 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_DNSLookupFailed2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Encryption error.. + /// + public static string RemoteDesktopDisconnectReason_EncryptionError { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_EncryptionError", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Windows Sockets gethostbyname call failed.. + /// + public static string RemoteDesktopDisconnectReason_GetHostByNameFailed { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_GetHostByNameFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Host not found.. + /// + public static string RemoteDesktopDisconnectReason_HostNotFound { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_HostNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Internal error.. + /// + public static string RemoteDesktopDisconnectReason_InternalError { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_InternalError", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Internal security error.. + /// + public static string RemoteDesktopDisconnectReason_InternalSecurityError { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_InternalSecurityError", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Internal security error.. + /// + public static string RemoteDesktopDisconnectReason_InternalSecurityError2 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_InternalSecurityError2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The encryption method specified is not valid.. + /// + public static string RemoteDesktopDisconnectReason_InvalidEncryption { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_InvalidEncryption", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bad IP address specified.. + /// + public static string RemoteDesktopDisconnectReason_InvalidIP { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_InvalidIP", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The IP address specified is not valid.. + /// + public static string RemoteDesktopDisconnectReason_InvalidIPAddr { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_InvalidIPAddr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Security data is not valid.. + /// + public static string RemoteDesktopDisconnectReason_InvalidSecurityData { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_InvalidSecurityData", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Server security data is not valid.. + /// + public static string RemoteDesktopDisconnectReason_InvalidServerSecurityInfo { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_InvalidServerSecurityInfo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to License negotiation failed.. + /// + public static string RemoteDesktopDisconnectReason_LicensingFailed { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_LicensingFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Licensing time-out.. + /// + public static string RemoteDesktopDisconnectReason_LicensingTimeout { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_LicensingTimeout", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Local disconnection.. + /// + public static string RemoteDesktopDisconnectReason_LocalNotError { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_LocalNotError", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No information is available.. + /// + public static string RemoteDesktopDisconnectReason_NoInfo { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_NoInfo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Out of memory.. + /// + public static string RemoteDesktopDisconnectReason_OutOfMemory { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_OutOfMemory", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Out of memory.. + /// + public static string RemoteDesktopDisconnectReason_OutOfMemory2 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_OutOfMemory2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Out of memory.. + /// + public static string RemoteDesktopDisconnectReason_OutOfMemory3 { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_OutOfMemory3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remote disconnect by user.. + /// + public static string RemoteDesktopDisconnectReason_RemoteByUser { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_RemoteByUser", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failed to unpack server certificate.. + /// + public static string RemoteDesktopDisconnectReason_ServerCertificateUnpackErr { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_ServerCertificateUnpackErr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Windows Sockets connect failed.. + /// + public static string RemoteDesktopDisconnectReason_SocketConnectFailed { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_SocketConnectFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Windows Sockets recv call failed.. + /// + public static string RemoteDesktopDisconnectReason_SocketRecvFailed { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_SocketRecvFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The account is disabled.. + /// + public static string RemoteDesktopDisconnectReason_SslErrAccountDisabled { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrAccountDisabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The account is expired.. + /// + public static string RemoteDesktopDisconnectReason_SslErrAccountExpired { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrAccountExpired", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The account is locked out.. + /// + public static string RemoteDesktopDisconnectReason_SslErrAccountLockedOut { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrAccountLockedOut", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The account is restricted.. + /// + public static string RemoteDesktopDisconnectReason_SslErrAccountRestriction { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrAccountRestriction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The received certificate is expired.. + /// + public static string RemoteDesktopDisconnectReason_SslErrCertExpired { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrCertExpired", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The policy does not support delegation of credentials to the target server.. + /// + public static string RemoteDesktopDisconnectReason_SslErrDelegationPolicy { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrDelegationPolicy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The server authentication policy does not allow connection requests using saved credentials. The user must enter new credentials.. + /// + public static string RemoteDesktopDisconnectReason_SslErrFreshCredRequiredByServer { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrFreshCredRequiredByServer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Login failed.. + /// + public static string RemoteDesktopDisconnectReason_SslErrLogonFailure { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrLogonFailure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No authority could be contacted for authentication. The domain name of the authenticating party could be wrong, the domain could be unreachable, or there might have been a trust relationship failure.. + /// + public static string RemoteDesktopDisconnectReason_SslErrNoAuthenticatingAuthority { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrNoAuthenticatingAuthority", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The specified user has no account.. + /// + public static string RemoteDesktopDisconnectReason_SslErrNoSuchUser { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrNoSuchUser", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The password is expired.. + /// + public static string RemoteDesktopDisconnectReason_SslErrPasswordExpired { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrPasswordExpired", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The user password must be changed before logging on for the first time.. + /// + public static string RemoteDesktopDisconnectReason_SslErrPasswordMustChange { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrPasswordMustChange", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Delegation of credentials to the target server is not allowed unless mutual authentication has been achieved.. + /// + public static string RemoteDesktopDisconnectReason_SslErrPolicyNTLMOnly { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrPolicyNTLMOnly", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The smart card is blocked.. + /// + public static string RemoteDesktopDisconnectReason_SslErrSmartcardCardBlocked { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrSmartcardCardBlocked", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to An incorrect PIN was presented to the smart card.. + /// + public static string RemoteDesktopDisconnectReason_SslErrSmartcardWrongPIN { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_SslErrSmartcardWrongPIN", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Timeout occurred.. + /// + public static string RemoteDesktopDisconnectReason_TimeoutOccurred { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_TimeoutOccurred", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Internal timer error.. + /// + public static string RemoteDesktopDisconnectReason_TimerError { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_TimerError", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The remote session ended because the total login time limit was reached. This limit is set by the server administrator or by network policies.. + /// + public static string RemoteDesktopDisconnectReason_TotalLoginTimeLimitReached { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_TotalLoginTimeLimitReached", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to reconnect to the remote session.. + /// + public static string RemoteDesktopDisconnectReason_UnableToReconnectToRemoteSession { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_UnableToReconnectToRemoteSession", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Windows Sockets send call failed.. + /// + public static string RemoteDesktopDisconnectReason_WinsockSendFailed { + get { + return ResourceManager.GetString("RemoteDesktopDisconnectReason_WinsockSendFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Allow me to select later. + /// + public static string RemoteDesktopGatewayServerLogonMethod_Any { + get { + return ResourceManager.GetString("RemoteDesktopGatewayServerLogonMethod_Any", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Smart card or Windows Hello for Business. + /// + public static string RemoteDesktopGatewayServerLogonMethod_Smartcard { + get { + return ResourceManager.GetString("RemoteDesktopGatewayServerLogonMethod_Smartcard", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ask for password (NTLM). + /// + public static string RemoteDesktopGatewayServerLogonMethod_Userpass { + get { + return ResourceManager.GetString("RemoteDesktopGatewayServerLogonMethod_Userpass", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to On the remote computer. + /// + public static string RemoteDesktopKeyboardHookMode_OnTheRemoteComputer { + get { + return ResourceManager.GetString("RemoteDesktopKeyboardHookMode_OnTheRemoteComputer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to On this computer. + /// + public static string RemoteDesktopKeyboardHookMode_OnThisComputer { + get { + return ResourceManager.GetString("RemoteDesktopKeyboardHookMode_OnThisComputer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to High-speed broadband (2 Mbps - 10 Mbps). + /// + public static string RemoteDesktopNetworkConnectionType_BroadbandHigh { + get { + return ResourceManager.GetString("RemoteDesktopNetworkConnectionType_BroadbandHigh", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Low-speed broadband (256 kbps - 2 Mbps). + /// + public static string RemoteDesktopNetworkConnectionType_BroadbandLow { + get { + return ResourceManager.GetString("RemoteDesktopNetworkConnectionType_BroadbandLow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Detect connection quality automatically. + /// + public static string RemoteDesktopNetworkConnectionType_DetectAutomatically { + get { + return ResourceManager.GetString("RemoteDesktopNetworkConnectionType_DetectAutomatically", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LAN (10 Mbps or higher). + /// + public static string RemoteDesktopNetworkConnectionType_LAN { + get { + return ResourceManager.GetString("RemoteDesktopNetworkConnectionType_LAN", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Modem (56 kbps). + /// + public static string RemoteDesktopNetworkConnectionType_Modem { + get { + return ResourceManager.GetString("RemoteDesktopNetworkConnectionType_Modem", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Satellite (2 Mbps - 16 Mbps with high latency). + /// + public static string RemoteDesktopNetworkConnectionType_Satellite { + get { + return ResourceManager.GetString("RemoteDesktopNetworkConnectionType_Satellite", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to WAN (10 Mbps or higher with high latency). + /// + public static string RemoteDesktopNetworkConnectionType_WAN { + get { + return ResourceManager.GetString("RemoteDesktopNetworkConnectionType_WAN", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remote hostname. + /// + public static string RemoteHostname { + get { + return ResourceManager.GetString("RemoteHostname", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remote IP address. + /// + public static string RemoteIPAddress { + get { + return ResourceManager.GetString("RemoteIPAddress", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remote port. + /// + public static string RemotePort { + get { + return ResourceManager.GetString("RemotePort", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remote ports. + /// + public static string RemotePorts { + get { + return ResourceManager.GetString("RemotePorts", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remove IPv4 address. + /// + public static string RemoveIPv4Address { + get { + return ResourceManager.GetString("RemoveIPv4Address", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remove IPv4 address.... + /// + public static string RemoveIPv4AddressDots { + get { + return ResourceManager.GetString("RemoveIPv4AddressDots", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Rename. + /// + public static string Rename { + get { + return ResourceManager.GetString("Rename", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Renew. + /// + public static string Renew { + get { + return ResourceManager.GetString("Renew", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Repeat. + /// + public static string Repeat { + get { + return ResourceManager.GetString("Repeat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Report an issue or create a feature request.. + /// + public static string ReportIssueOrCreateFeatureRequest { + get { + return ResourceManager.GetString("ReportIssueOrCreateFeatureRequest", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Report on GitHub. + /// + public static string ReportOnGitHub { + get { + return ResourceManager.GetString("ReportOnGitHub", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reset. + /// + public static string Reset { + get { + return ResourceManager.GetString("Reset", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All profiles in this profile file will be permanently deleted!. + /// + public static string ResetProfilesMessage { get { - return ResourceManager.GetString("RemotePort", resourceCulture); + return ResourceManager.GetString("ResetProfilesMessage", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remove IPv4 address ähnelt. + /// Looks up a localized string similar to Reset settings?. /// - public static string RemoveIPv4Address { + public static string ResetSettingsQuestion { get { - return ResourceManager.GetString("RemoveIPv4Address", resourceCulture); + return ResourceManager.GetString("ResetSettingsQuestion", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Resize. + /// + public static string Resize { + get { + return ResourceManager.GetString("Resize", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Resolve CNAME on ANY requests. + /// + public static string ResolveCNAMEOnANYRequests { + get { + return ResourceManager.GetString("ResolveCNAMEOnANYRequests", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Resolved "{0}" as hostname for ip address "{1}"!. + /// + public static string ResolvedXXXAsHostnameForIPAddressXXXMessage { + get { + return ResourceManager.GetString("ResolvedXXXAsHostnameForIPAddressXXXMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Resolve hostname. + /// + public static string ResolveHostname { + get { + return ResourceManager.GetString("ResolveHostname", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Resolve Hostname is disabled!. + /// + public static string ResolveHostnameIsDisabled { + get { + return ResourceManager.GetString("ResolveHostnameIsDisabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Resolve IP address for this host (IPv4 is preferred). + /// + public static string ResolveIPAddressForThisHost { + get { + return ResourceManager.GetString("ResolveIPAddressForThisHost", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Resolve IPv4 address for this host. + /// + public static string ResolveIPv4AddressForThisHost { + get { + return ResourceManager.GetString("ResolveIPv4AddressForThisHost", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Resolve MAC address and vendor. + /// + public static string ResolveMACAddressAndVendor { + get { + return ResourceManager.GetString("ResolveMACAddressAndVendor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Resolve MAC address is disabled!. + /// + public static string ResolveMACAddressIsDisabled { + get { + return ResourceManager.GetString("ResolveMACAddressIsDisabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Resolve PTR. + /// + public static string ResolvePTR { + get { + return ResourceManager.GetString("ResolvePTR", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A collection of all country flags in SVG. + /// + public static string Resource_Flag_Description { + get { + return ResourceManager.GetString("Resource_Flag_Description", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to List of Top-Level-Domains from iana.org, which is used to query whois servers of the TLD from whois.iana.org via port 43. + /// + public static string Resource_ListTLD_Description { + get { + return ResourceManager.GetString("Resource_ListTLD_Description", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to GeoJSON conversion of Natural Earth vector map data (CC0-1.0).. + /// + public static string Resource_NaturalEarth_Description { + get { + return ResourceManager.GetString("Resource_NaturalEarth_Description", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to OUI data from ieee.org.. + /// + public static string Resource_OUI_Description { + get { + return ResourceManager.GetString("Resource_OUI_Description", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Service Name and Transport Protocol Port Number Registry from iana.org.. + /// + public static string Resource_ServiceNamePortNumber_Description { + get { + return ResourceManager.GetString("Resource_ServiceNamePortNumber_Description", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Resources. + /// + public static string Resources { + get { + return ResourceManager.GetString("Resources", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Responses. + /// + public static string Responses { + get { + return ResourceManager.GetString("Responses", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Restart. + /// + public static string Restart { + get { + return ResourceManager.GetString("Restart", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Restart as Administrator. + /// + public static string RestartAsAdmin { + get { + return ResourceManager.GetString("RestartAsAdmin", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Restart now. + /// + public static string RestartNow { + get { + return ResourceManager.GetString("RestartNow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Restart required. + /// + public static string RestartRequired { + get { + return ResourceManager.GetString("RestartRequired", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A restart is required to apply changes such as language settings.. + /// + public static string RestartRequiredMessage { + get { + return ResourceManager.GetString("RestartRequiredMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Restart session. + /// + public static string RestartSession { + get { + return ResourceManager.GetString("RestartSession", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Restart the application to change the language!. + /// + public static string RestartTheApplicationToChangeTheLanguage { + get { + return ResourceManager.GetString("RestartTheApplicationToChangeTheLanguage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Restore. + /// + public static string Restore { + get { + return ResourceManager.GetString("Restore", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Restore default location. + /// + public static string RestoreDefaultLocation { + get { + return ResourceManager.GetString("RestoreDefaultLocation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Restore default location?. + /// + public static string RestoreDefaultLocationQuestion { + get { + return ResourceManager.GetString("RestoreDefaultLocationQuestion", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The default profiles location is restored and the application is restarted afterwards. + /// + ///You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten.. + /// + public static string RestoreDefaultProfilesLocationMessage { + get { + return ResourceManager.GetString("RestoreDefaultProfilesLocationMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Restore defaults. + /// + public static string RestoreDefaults { + get { + return ResourceManager.GetString("RestoreDefaults", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The default settings location is restored and the application is restarted afterwards. + /// + ///You can copy the “settings.json” file from "{0}" to "{1}" to migrate your previous settings, if necessary. The application must be closed for this to prevent the settings from being overwritten.. + /// + public static string RestoreDefaultSettingsLocationMessage { + get { + return ResourceManager.GetString("RestoreDefaultSettingsLocationMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Result. + /// + public static string Result { + get { + return ResourceManager.GetString("Result", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Resume. + /// + public static string Resume { + get { + return ResourceManager.GetString("Resume", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Retries. + /// + public static string Retries { + get { + return ResourceManager.GetString("Retries", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Retrying in {0} seconds.... + /// + public static string RetryingInXSecondsDots { + get { + return ResourceManager.GetString("RetryingInXSecondsDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remove IPv4 address... ähnelt. + /// Looks up a localized string similar to Rlogin. /// - public static string RemoveIPv4AddressDots { + public static string Rlogin { get { - return ResourceManager.GetString("RemoveIPv4AddressDots", resourceCulture); + return ResourceManager.GetString("Rlogin", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Rename ähnelt. + /// Looks up a localized string similar to Rlogin port. /// - public static string Rename { + public static string RloginPort { get { - return ResourceManager.GetString("Rename", resourceCulture); + return ResourceManager.GetString("RloginPort", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Renew ähnelt. + /// Looks up a localized string similar to Round trip delay. /// - public static string Renew { + public static string RoundTripDelay { get { - return ResourceManager.GetString("Renew", resourceCulture); + return ResourceManager.GetString("RoundTripDelay", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Repeat ähnelt. + /// Looks up a localized string similar to Route. /// - public static string Repeat { + public static string Route { get { - return ResourceManager.GetString("Repeat", resourceCulture); + return ResourceManager.GetString("Route", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Report an issue or create a feature request ähnelt. + /// Looks up a localized string similar to Routing. /// - public static string ReportAnIssueOrCreateAFeatureRequest { + public static string Routing { get { - return ResourceManager.GetString("ReportAnIssueOrCreateAFeatureRequest", resourceCulture); + return ResourceManager.GetString("Routing", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Report on GitHub ähnelt. + /// Looks up a localized string similar to Run background job every x-minute. /// - public static string ReportOnGitHub { + public static string RunBackgroundJobEveryXMinute { get { - return ResourceManager.GetString("ReportOnGitHub", resourceCulture); + return ResourceManager.GetString("RunBackgroundJobEveryXMinute", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Reset ähnelt. + /// Looks up a localized string similar to Run command.... /// - public static string Reset { + public static string RunCommandDots { get { - return ResourceManager.GetString("Reset", resourceCulture); + return ResourceManager.GetString("RunCommandDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die All profiles in this profile file will be permanently deleted! ähnelt. + /// Looks up a localized string similar to Run command... (Ctrl+Shift+P). /// - public static string ResetProfilesMessage { + public static string RunCommandDotsWithHotKey { get { - return ResourceManager.GetString("ResetProfilesMessage", resourceCulture); + return ResourceManager.GetString("RunCommandDotsWithHotKey", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Resize ähnelt. + /// Looks up a localized string similar to Run speed test. /// - public static string Resize { + public static string RunSpeedTest { get { - return ResourceManager.GetString("Resize", resourceCulture); + return ResourceManager.GetString("RunSpeedTest", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Resolve CNAME on ANY requests ähnelt. + /// Looks up a localized string similar to Save. /// - public static string ResolveCNAMEOnANYRequests { + public static string Save { get { - return ResourceManager.GetString("ResolveCNAMEOnANYRequests", resourceCulture); + return ResourceManager.GetString("Save", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Resolved "{0}" as hostname for ip address "{1}"! ähnelt. + /// Looks up a localized string similar to Save credentials. /// - public static string ResolvedXXXAsHostnameForIPAddressXXXMessage { + public static string SaveCredentials { get { - return ResourceManager.GetString("ResolvedXXXAsHostnameForIPAddressXXXMessage", resourceCulture); + return ResourceManager.GetString("SaveCredentials", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Resolve hostname ähnelt. + /// Looks up a localized string similar to Save settings in the application folder. /// - public static string ResolveHostname { + public static string SaveSettingsInApplicationFolder { get { - return ResourceManager.GetString("ResolveHostname", resourceCulture); + return ResourceManager.GetString("SaveSettingsInApplicationFolder", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Resolve IPv4 address for this host ähnelt. + /// Looks up a localized string similar to Scan. /// - public static string ResolveIPv4AddressForThisHost { + public static string Scan { get { - return ResourceManager.GetString("ResolveIPv4AddressForThisHost", resourceCulture); + return ResourceManager.GetString("Scan", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Resolve MAC address and vendor ähnelt. + /// Looks up a localized string similar to Scan for NetBIOS. /// - public static string ResolveMACAddressAndVendor { + public static string ScanForNetBIOS { get { - return ResourceManager.GetString("ResolveMACAddressAndVendor", resourceCulture); + return ResourceManager.GetString("ScanForNetBIOS", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Resolve PTR ähnelt. + /// Looks up a localized string similar to Scanned. /// - public static string ResolvePTR { + public static string Scanned { get { - return ResourceManager.GetString("ResolvePTR", resourceCulture); + return ResourceManager.GetString("Scanned", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die A collection of all country flags in SVG ähnelt. + /// Looks up a localized string similar to Scan ports. /// - public static string Resource_Flag_Description { + public static string ScanPorts { get { - return ResourceManager.GetString("Resource_Flag_Description", resourceCulture); + return ResourceManager.GetString("ScanPorts", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die List of Top-Level-Domains from iana.org, which is used to query whois servers of the TLD from whois.iana.org via port 43 ähnelt. + /// Looks up a localized string similar to Search. /// - public static string Resource_ListTLD_Description { + public static string Search { get { - return ResourceManager.GetString("Resource_ListTLD_Description", resourceCulture); + return ResourceManager.GetString("Search", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Sanitized IEEE OUI Data from linuxnet.ca. ähnelt. + /// Looks up a localized string similar to Search.... /// - public static string Resource_OUI_Description { + public static string SearchDots { get { - return ResourceManager.GetString("Resource_OUI_Description", resourceCulture); + return ResourceManager.GetString("SearchDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Service Name and Transport Protocol Port Number Registry from iana.org. ähnelt. + /// Looks up a localized string similar to Searched application not found!. /// - public static string Resource_ServiceNamePortNumber_Description { + public static string SearchedApplicationNotFound { get { - return ResourceManager.GetString("Resource_ServiceNamePortNumber_Description", resourceCulture); + return ResourceManager.GetString("SearchedApplicationNotFound", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Resources ähnelt. + /// Looks up a localized string similar to Searched language not found!. /// - public static string Resources { + public static string SearchedLanguageNotFound { get { - return ResourceManager.GetString("Resources", resourceCulture); + return ResourceManager.GetString("SearchedLanguageNotFound", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Responses ähnelt. + /// Looks up a localized string similar to Searched setting not found!. /// - public static string Responses { + public static string SearchedSettingNotFound { get { - return ResourceManager.GetString("Responses", resourceCulture); + return ResourceManager.GetString("SearchedSettingNotFound", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Restart ähnelt. + /// Looks up a localized string similar to Searching Active Directory.... /// - public static string Restart { + public static string SearchingActiveDirectoryDots { get { - return ResourceManager.GetString("Restart", resourceCulture); + return ResourceManager.GetString("SearchingActiveDirectoryDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Restart as Administrator ähnelt. + /// Looks up a localized string similar to Searching for networks.... /// - public static string RestartAsAdmin { + public static string SearchingForNetworksDots { get { - return ResourceManager.GetString("RestartAsAdmin", resourceCulture); + return ResourceManager.GetString("SearchingForNetworksDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Restart now ähnelt. + /// Looks up a localized string similar to Searching for WiFi adapters.... /// - public static string RestartNow { + public static string SearchingWiFiAdaptersDots { get { - return ResourceManager.GetString("RestartNow", resourceCulture); + return ResourceManager.GetString("SearchingWiFiAdaptersDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Restart required ähnelt. + /// Looks up a localized string similar to Secondary DNS server. /// - public static string RestartRequired { + public static string SecondaryDNSServer { get { - return ResourceManager.GetString("RestartRequired", resourceCulture); + return ResourceManager.GetString("SecondaryDNSServer", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Some settings are applied only after restarting the application! ähnelt. + /// Looks up a localized string similar to Security. /// - public static string RestartRequiredSettingsChangedMessage { + public static string Security { get { - return ResourceManager.GetString("RestartRequiredSettingsChangedMessage", resourceCulture); + return ResourceManager.GetString("Security", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Restart session ähnelt. + /// Looks up a localized string similar to Select all. /// - public static string RestartSession { + public static string SelectAll { get { - return ResourceManager.GetString("RestartSession", resourceCulture); + return ResourceManager.GetString("SelectAll", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Restart the application to change the language! ähnelt. + /// Looks up a localized string similar to Select a profile.... /// - public static string RestartTheApplicationToChangeTheLanguage { + public static string SelectAProfileDots { get { - return ResourceManager.GetString("RestartTheApplicationToChangeTheLanguage", resourceCulture); + return ResourceManager.GetString("SelectAProfileDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Result ähnelt. + /// Looks up a localized string similar to Select a screen resolution. /// - public static string Result { + public static string SelectAScreenResolution { get { - return ResourceManager.GetString("Result", resourceCulture); + return ResourceManager.GetString("SelectAScreenResolution", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Resume ähnelt. + /// Looks up a localized string similar to Selected. /// - public static string Resume { + public static string Selected { get { - return ResourceManager.GetString("Resume", resourceCulture); + return ResourceManager.GetString("Selected", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Retries ähnelt. + /// Looks up a localized string similar to Select OID profile. /// - public static string Retries { + public static string SelectOIDProfile { get { - return ResourceManager.GetString("Retries", resourceCulture); + return ResourceManager.GetString("SelectOIDProfile", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Rlogin ähnelt. + /// Looks up a localized string similar to Select port profile. /// - public static string Rlogin { + public static string SelectPortProfile { get { - return ResourceManager.GetString("Rlogin", resourceCulture); + return ResourceManager.GetString("SelectPortProfile", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Rlogin port ähnelt. + /// Looks up a localized string similar to Send. /// - public static string RloginPort { + public static string Send { get { - return ResourceManager.GetString("RloginPort", resourceCulture); + return ResourceManager.GetString("Send", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Route ähnelt. + /// Looks up a localized string similar to Serial. /// - public static string Route { + public static string Serial { get { - return ResourceManager.GetString("Route", resourceCulture); + return ResourceManager.GetString("Serial", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Routing ähnelt. + /// Looks up a localized string similar to Serial line. /// - public static string Routing { + public static string SerialLine { get { - return ResourceManager.GetString("Routing", resourceCulture); + return ResourceManager.GetString("SerialLine", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Run background job every x-minute ähnelt. + /// Looks up a localized string similar to Server. /// - public static string RunBackgroundJobEveryXMinute { + public static string Server { get { - return ResourceManager.GetString("RunBackgroundJobEveryXMinute", resourceCulture); + return ResourceManager.GetString("Server", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Save ähnelt. + /// Looks up a localized string similar to Server name. /// - public static string Save { + public static string ServerName { get { - return ResourceManager.GetString("Save", resourceCulture); + return ResourceManager.GetString("ServerName", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Save settings in the application folder ähnelt. + /// Looks up a localized string similar to Server(s). /// - public static string SaveSettingsInApplicationFolder { + public static string Servers { get { - return ResourceManager.GetString("SaveSettingsInApplicationFolder", resourceCulture); + return ResourceManager.GetString("Servers", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Scan ähnelt. + /// Looks up a localized string similar to Service. /// - public static string Scan { + public static string Service { get { - return ResourceManager.GetString("Scan", resourceCulture); + return ResourceManager.GetString("Service", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Scanned ähnelt. + /// Looks up a localized string similar to Set default. /// - public static string Scanned { + public static string SetDefault { get { - return ResourceManager.GetString("Scanned", resourceCulture); + return ResourceManager.GetString("SetDefault", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Search ähnelt. + /// Looks up a localized string similar to Set Master Password. /// - public static string Search { + public static string SetMasterPassword { get { - return ResourceManager.GetString("Search", resourceCulture); + return ResourceManager.GetString("SetMasterPassword", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Search... ähnelt. + /// Looks up a localized string similar to Set Master Password.... /// - public static string SearchDots { + public static string SetMasterPasswordDots { get { - return ResourceManager.GetString("SearchDots", resourceCulture); + return ResourceManager.GetString("SetMasterPasswordDots", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Searched application not found! ähnelt. + /// Looks up a localized string similar to This setting is managed by your administrator.. /// - public static string SearchedApplicationNotFound { + public static string SettingManagedByAdministrator { get { - return ResourceManager.GetString("SearchedApplicationNotFound", resourceCulture); + return ResourceManager.GetString("SettingManagedByAdministrator", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Searched language not found! ähnelt. + /// Looks up a localized string similar to Settings. /// - public static string SearchedLanguageNotFound { + public static string Settings { get { - return ResourceManager.GetString("SearchedLanguageNotFound", resourceCulture); + return ResourceManager.GetString("Settings", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Searched setting not found! ähnelt. + /// Looks up a localized string similar to The settings will be reset and the application will be restarted afterwards!. /// - public static string SearchedSettingNotFound { + public static string SettingsAreResetAndApplicationWillBeRestartedMessage { get { - return ResourceManager.GetString("SearchedSettingNotFound", resourceCulture); + return ResourceManager.GetString("SettingsAreResetAndApplicationWillBeRestartedMessage", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Searching for networks... ähnelt. + /// Looks up a localized string similar to The found settings file was corrupted or is not compatible with this version! You may report this issue on GitHub. + /// + ///A backup of the settings file was created in the settings folder and the settings were reset. + /// + ///Profile files are not affected!. /// - public static string SearchingForNetworksDots { + public static string SettingsFileFoundWasCorruptOrNotCompatibleMessage { get { - return ResourceManager.GetString("SearchingForNetworksDots", resourceCulture); + return ResourceManager.GetString("SettingsFileFoundWasCorruptOrNotCompatibleMessage", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Searching for WiFi adapters... ähnelt. + /// Looks up a localized string similar to Applications. /// - public static string SearchingWiFiAdaptersDots { + public static string SettingsGroup_Application { get { - return ResourceManager.GetString("SearchingWiFiAdaptersDots", resourceCulture); + return ResourceManager.GetString("SettingsGroup_Application", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Secondary DNS server ähnelt. + /// Looks up a localized string similar to General. /// - public static string SecondaryDNSServer { + public static string SettingsGroup_General { get { - return ResourceManager.GetString("SecondaryDNSServer", resourceCulture); + return ResourceManager.GetString("SettingsGroup_General", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Security ähnelt. + /// Looks up a localized string similar to Settings have been reset!. /// - public static string Security { + public static string SettingsHaveBeenReset { get { - return ResourceManager.GetString("Security", resourceCulture); + return ResourceManager.GetString("SettingsHaveBeenReset", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Select a profile... ähnelt. + /// Looks up a localized string similar to Appearance. /// - public static string SelectAProfileDots { + public static string SettingsName_Appearance { get { - return ResourceManager.GetString("SelectAProfileDots", resourceCulture); + return ResourceManager.GetString("SettingsName_Appearance", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Select a screen resolution ähnelt. + /// Looks up a localized string similar to Autostart. /// - public static string SelectAScreenResolution { + public static string SettingsName_Autostart { get { - return ResourceManager.GetString("SelectAScreenResolution", resourceCulture); + return ResourceManager.GetString("SettingsName_Autostart", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Selected ähnelt. + /// Looks up a localized string similar to General. /// - public static string Selected { + public static string SettingsName_General { get { - return ResourceManager.GetString("Selected", resourceCulture); + return ResourceManager.GetString("SettingsName_General", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die The selected settings are overwritten! ähnelt. + /// Looks up a localized string similar to HotKeys. /// - public static string SelectedSettingsAreOverwritten { + public static string SettingsName_HotKeys { get { - return ResourceManager.GetString("SelectedSettingsAreOverwritten", resourceCulture); + return ResourceManager.GetString("SettingsName_HotKeys", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die The selected settings are reset. ähnelt. + /// Looks up a localized string similar to Language. /// - public static string SelectedSettingsAreReset { + public static string SettingsName_Language { get { - return ResourceManager.GetString("SelectedSettingsAreReset", resourceCulture); + return ResourceManager.GetString("SettingsName_Language", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Select port profile ähnelt. + /// Looks up a localized string similar to Network. /// - public static string SelectPortProfile { + public static string SettingsName_Network { get { - return ResourceManager.GetString("SelectPortProfile", resourceCulture); + return ResourceManager.GetString("SettingsName_Network", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Select the settings you want to export: ähnelt. + /// Looks up a localized string similar to Profiles. /// - public static string SelectTheSettingsYouWantToExport { + public static string SettingsName_Profiles { get { - return ResourceManager.GetString("SelectTheSettingsYouWantToExport", resourceCulture); + return ResourceManager.GetString("SettingsName_Profiles", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Select the settings you want to import: ähnelt. + /// Looks up a localized string similar to Settings. /// - public static string SelectTheSettingsYouWantToImport { + public static string SettingsName_Settings { get { - return ResourceManager.GetString("SelectTheSettingsYouWantToImport", resourceCulture); + return ResourceManager.GetString("SettingsName_Settings", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Send ähnelt. + /// Looks up a localized string similar to Status. /// - public static string Send { + public static string SettingsName_Status { get { - return ResourceManager.GetString("Send", resourceCulture); + return ResourceManager.GetString("SettingsName_Status", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Serial ähnelt. + /// Looks up a localized string similar to Update. /// - public static string Serial { + public static string SettingsName_Update { get { - return ResourceManager.GetString("Serial", resourceCulture); + return ResourceManager.GetString("SettingsName_Update", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die SerialLine ähnelt. + /// Looks up a localized string similar to Window. /// - public static string SerialLine { + public static string SettingsName_Window { get { - return ResourceManager.GetString("SerialLine", resourceCulture); + return ResourceManager.GetString("SettingsName_Window", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Service ähnelt. + /// Looks up a localized string similar to Settings reset!. /// - public static string Service { + public static string SettingsResetExclamationMark { get { - return ResourceManager.GetString("Service", resourceCulture); + return ResourceManager.GetString("SettingsResetExclamationMark", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Set Master Password ähnelt. + /// Looks up a localized string similar to Share Gateway credentials with remote computer. /// - public static string SetMasterPassword { + public static string ShareGatewayCredentialsWithRemoteComputer { get { - return ResourceManager.GetString("SetMasterPassword", resourceCulture); + return ResourceManager.GetString("ShareGatewayCredentialsWithRemoteComputer", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Set Master Password... ähnelt. + /// Looks up a localized string similar to Show. /// - public static string SetMasterPasswordDots { + public static string Show { get { - return ResourceManager.GetString("SetMasterPasswordDots", resourceCulture); + return ResourceManager.GetString("Show", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Settings ähnelt. + /// Looks up a localized string similar to Show address bar. /// - public static string Settings { + public static string ShowAddressBar { get { - return ResourceManager.GetString("Settings", resourceCulture); + return ResourceManager.GetString("ShowAddressBar", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die The settings file found was corrupted or is not compatible with this version. All settings have been reset! - ///(Profile files are not affected!) ähnelt. + /// Looks up a localized string similar to Show closed ports. /// - public static string SettingsFileFoundWasCorruptOrNotCompatibleMessage { + public static string ShowClosedPorts { get { - return ResourceManager.GetString("SettingsFileFoundWasCorruptOrNotCompatibleMessage", resourceCulture); + return ResourceManager.GetString("ShowClosedPorts", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Settings have been reset! ähnelt. + /// Looks up a localized string similar to Show current application title. /// - public static string SettingsHaveBeenReset { + public static string ShowCurrentApplicationTitle { get { - return ResourceManager.GetString("SettingsHaveBeenReset", resourceCulture); + return ResourceManager.GetString("ShowCurrentApplicationTitle", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Settings successfully exported! ähnelt. + /// Looks up a localized string similar to Show error message. /// - public static string SettingsSuccessfullyExported { + public static string ShowErrorMessage { get { - return ResourceManager.GetString("SettingsSuccessfullyExported", resourceCulture); + return ResourceManager.GetString("ShowErrorMessage", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Settings successfully imported! ähnelt. + /// Looks up a localized string similar to Show local licenses. /// - public static string SettingsSuccessfullyImported { + public static string ShowLocalLicenses { get { - return ResourceManager.GetString("SettingsSuccessfullyImported", resourceCulture); + return ResourceManager.GetString("ShowLocalLicenses", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Settings successfully reset! ähnelt. + /// Looks up a localized string similar to Show map. /// - public static string SettingsSuccessfullyReset { + public static string ShowMap { get { - return ResourceManager.GetString("SettingsSuccessfullyReset", resourceCulture); + return ResourceManager.GetString("ShowMap", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Applications ähnelt. + /// Looks up a localized string similar to Show notification popup on status change. /// - public static string SettingsViewGroup_Applications { + public static string ShowNotificationPopupOnStatusChange { get { - return ResourceManager.GetString("SettingsViewGroup_Applications", resourceCulture); + return ResourceManager.GetString("ShowNotificationPopupOnStatusChange", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die General ähnelt. + /// Looks up a localized string similar to Show only most common query types. /// - public static string SettingsViewGroup_General { + public static string ShowOnlyMostCommonQueryTypes { get { - return ResourceManager.GetString("SettingsViewGroup_General", resourceCulture); + return ResourceManager.GetString("ShowOnlyMostCommonQueryTypes", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Appearance ähnelt. + /// Looks up a localized string similar to Show SplashScreen on start. /// - public static string SettingsViewName_Appearance { + public static string ShowSplashScreenOnStart { get { - return ResourceManager.GetString("SettingsViewName_Appearance", resourceCulture); + return ResourceManager.GetString("ShowSplashScreenOnStart", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Autostart ähnelt. + /// Looks up a localized string similar to Show statistics. /// - public static string SettingsViewName_Autostart { + public static string ShowStatistics { get { - return ResourceManager.GetString("SettingsViewName_Autostart", resourceCulture); + return ResourceManager.GetString("ShowStatistics", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Dashboard ähnelt. + /// Looks up a localized string similar to Show status bar. /// - public static string SettingsViewName_Dashboard { + public static string ShowStatusBar { get { - return ResourceManager.GetString("SettingsViewName_Dashboard", resourceCulture); + return ResourceManager.GetString("ShowStatusBar", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die DNS Lookup ähnelt. + /// Looks up a localized string similar to Show status window on network change. /// - public static string SettingsViewName_DNSLookup { + public static string ShowStatusWindowOnNetworkChange { get { - return ResourceManager.GetString("SettingsViewName_DNSLookup", resourceCulture); + return ResourceManager.GetString("ShowStatusWindowOnNetworkChange", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die General ähnelt. + /// Looks up a localized string similar to Show the following application on startup:. /// - public static string SettingsViewName_General { + public static string ShowTheFollowingApplicationOnStartup { get { - return ResourceManager.GetString("SettingsViewName_General", resourceCulture); + return ResourceManager.GetString("ShowTheFollowingApplicationOnStartup", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die HotKeys ähnelt. + /// Looks up a localized string similar to Show unreachable IP addresses and ports. /// - public static string SettingsViewName_HotKeys { + public static string ShowUnreachableIPAddressesAndPorts { get { - return ResourceManager.GetString("SettingsViewName_HotKeys", resourceCulture); + return ResourceManager.GetString("ShowUnreachableIPAddressesAndPorts", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die HTTP Headers ähnelt. + /// Looks up a localized string similar to Show window contents while dragging. /// - public static string SettingsViewName_HTTPHeaders { + public static string ShowWindowContentsWhileDragging { get { - return ResourceManager.GetString("SettingsViewName_HTTPHeaders", resourceCulture); + return ResourceManager.GetString("ShowWindowContentsWhileDragging", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die IP Scanner ähnelt. + /// Looks up a localized string similar to Sienna. /// - public static string SettingsViewName_IPScanner { + public static string Sienna { get { - return ResourceManager.GetString("SettingsViewName_IPScanner", resourceCulture); + return ResourceManager.GetString("Sienna", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Language ähnelt. + /// Looks up a localized string similar to Signal strength. /// - public static string SettingsViewName_Language { + public static string SignalStrength { get { - return ResourceManager.GetString("SettingsViewName_Language", resourceCulture); + return ResourceManager.GetString("SignalStrength", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Ping Monitor ähnelt. + /// Looks up a localized string similar to Skip already imported. /// - public static string SettingsViewName_PingMonitor { + public static string SkipAlreadyImported { get { - return ResourceManager.GetString("SettingsViewName_PingMonitor", resourceCulture); + return ResourceManager.GetString("SkipAlreadyImported", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Port Scanner ähnelt. + /// Looks up a localized string similar to A powerful open-source tool for managing networks and troubleshooting network problems!. /// - public static string SettingsViewName_PortScanner { + public static string Slogan { get { - return ResourceManager.GetString("SettingsViewName_PortScanner", resourceCulture); + return ResourceManager.GetString("Slogan", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die PowerShell ähnelt. + /// Looks up a localized string similar to SNMP. /// - public static string SettingsViewName_PowerShell { + public static string SNMP { get { - return ResourceManager.GetString("SettingsViewName_PowerShell", resourceCulture); + return ResourceManager.GetString("SNMP", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Profiles ähnelt. + /// Looks up a localized string similar to Authentication failed. Please check the community string!. /// - public static string SettingsViewName_Profiles { + public static string SNMPErrorCode_AuthorizationError { get { - return ResourceManager.GetString("SettingsViewName_Profiles", resourceCulture); + return ResourceManager.GetString("SNMPErrorCode_AuthorizationError", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die PuTTY ähnelt. + /// Looks up a localized string similar to A read-write or write-only object was set to an inconsistent value!. /// - public static string SettingsViewName_PuTTY { + public static string SNMPErrorCode_BadValue { get { - return ResourceManager.GetString("SettingsViewName_PuTTY", resourceCulture); + return ResourceManager.GetString("SNMPErrorCode_BadValue", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remote Desktop ähnelt. + /// Looks up a localized string similar to An error occurred during the set operation!. /// - public static string SettingsViewName_RemoteDesktop { + public static string SNMPErrorCode_CommitFailed { get { - return ResourceManager.GetString("SettingsViewName_RemoteDesktop", resourceCulture); + return ResourceManager.GetString("SNMPErrorCode_CommitFailed", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Settings ähnelt. + /// Looks up a localized string similar to An error occurred for which no specific message is available!. /// - public static string SettingsViewName_Settings { + public static string SNMPErrorCode_GenError { get { - return ResourceManager.GetString("SettingsViewName_Settings", resourceCulture); + return ResourceManager.GetString("SNMPErrorCode_GenError", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die SNMP ähnelt. + /// Looks up a localized string similar to The object's state is inconsistent, preventing the set operation!. /// - public static string SettingsViewName_SNMP { + public static string SNMPErrorCode_InconsistentName { get { - return ResourceManager.GetString("SettingsViewName_SNMP", resourceCulture); + return ResourceManager.GetString("SNMPErrorCode_InconsistentName", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Status ähnelt. + /// Looks up a localized string similar to The MIB variable is currently in an inconsistent state and cannot be modified!. /// - public static string SettingsViewName_Status { + public static string SNMPErrorCode_InconsistentValue { get { - return ResourceManager.GetString("SettingsViewName_Status", resourceCulture); + return ResourceManager.GetString("SNMPErrorCode_InconsistentValue", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die TigerVNC ähnelt. + /// Looks up a localized string similar to The requested object is not accessible for modification!. /// - public static string SettingsViewName_TigerVNC { + public static string SNMPErrorCode_NoAccess { get { - return ResourceManager.GetString("SettingsViewName_TigerVNC", resourceCulture); + return ResourceManager.GetString("SNMPErrorCode_NoAccess", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Traceroute ähnelt. + /// Looks up a localized string similar to The requested object does not exist and cannot be created!. /// - public static string SettingsViewName_Traceroute { + public static string SNMPErrorCode_NoCreation { get { - return ResourceManager.GetString("SettingsViewName_Traceroute", resourceCulture); + return ResourceManager.GetString("SNMPErrorCode_NoCreation", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Update ähnelt. + /// Looks up a localized string similar to The operation was successful without any errors.. /// - public static string SettingsViewName_Update { + public static string SNMPErrorCode_NoError { get { - return ResourceManager.GetString("SettingsViewName_Update", resourceCulture); + return ResourceManager.GetString("SNMPErrorCode_NoError", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Wake On LAN ähnelt. + /// Looks up a localized string similar to The requested OID could not be found!. /// - public static string SettingsViewName_WakeOnLAN { + public static string SNMPErrorCode_NoSuchName { get { - return ResourceManager.GetString("SettingsViewName_WakeOnLAN", resourceCulture); + return ResourceManager.GetString("SNMPErrorCode_NoSuchName", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Whois ähnelt. + /// Looks up a localized string similar to The requested object is not writable and cannot be modified!. /// - public static string SettingsViewName_Whois { + public static string SNMPErrorCode_NotWritable { get { - return ResourceManager.GetString("SettingsViewName_Whois", resourceCulture); + return ResourceManager.GetString("SNMPErrorCode_NotWritable", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Window ähnelt. + /// Looks up a localized string similar to The requested OID does not exist and is not writable!. /// - public static string SettingsViewName_Window { + public static string SNMPErrorCode_ReadOnly { get { - return ResourceManager.GetString("SettingsViewName_Window", resourceCulture); + return ResourceManager.GetString("SNMPErrorCode_ReadOnly", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Show ähnelt. + /// Looks up a localized string similar to There are no available system resources to perform the requested operation!. /// - public static string Show { + public static string SNMPErrorCode_ResourceUnavailable { get { - return ResourceManager.GetString("Show", resourceCulture); + return ResourceManager.GetString("SNMPErrorCode_ResourceUnavailable", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Show closed ports ähnelt. + /// Looks up a localized string similar to The response to your request was too large to fit into a single response!. /// - public static string ShowClosedPorts { + public static string SNMPErrorCode_TooBig { get { - return ResourceManager.GetString("ShowClosedPorts", resourceCulture); + return ResourceManager.GetString("SNMPErrorCode_TooBig", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Show current application title ähnelt. + /// Looks up a localized string similar to A set operation failed, and previous changes could not be rolled back!. /// - public static string ShowCurrentApplicationTitle { + public static string SNMPErrorCode_UndoFailed { get { - return ResourceManager.GetString("ShowCurrentApplicationTitle", resourceCulture); + return ResourceManager.GetString("SNMPErrorCode_UndoFailed", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Show error message ähnelt. + /// Looks up a localized string similar to The encoding used for the object is incorrect!. /// - public static string ShowErrorMessage { + public static string SNMPErrorCode_WrongEncoding { get { - return ResourceManager.GetString("ShowErrorMessage", resourceCulture); + return ResourceManager.GetString("SNMPErrorCode_WrongEncoding", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Show local licenses ähnelt. + /// Looks up a localized string similar to The value assigned to the object exceeds its maximum length!. /// - public static string ShowLocalLicenses { + public static string SNMPErrorCode_WrongLength { get { - return ResourceManager.GetString("ShowLocalLicenses", resourceCulture); + return ResourceManager.GetString("SNMPErrorCode_WrongLength", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Show only most common query types ähnelt. + /// Looks up a localized string similar to The object was set to an incompatible data type!. /// - public static string ShowOnlyMostCommonQueryTypes { + public static string SNMPErrorCode_WrongType { get { - return ResourceManager.GetString("ShowOnlyMostCommonQueryTypes", resourceCulture); + return ResourceManager.GetString("SNMPErrorCode_WrongType", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Show scan result for all IP addresses ähnelt. + /// Looks up a localized string similar to The value assigned to the object is not a valid choice!. /// - public static string ShowScanResultForAllIPAddresses { + public static string SNMPErrorCode_WrongValue { get { - return ResourceManager.GetString("ShowScanResultForAllIPAddresses", resourceCulture); + return ResourceManager.GetString("SNMPErrorCode_WrongValue", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Show SplashScreen on start ähnelt. + /// Looks up a localized string similar to Authentication failure (incorrect password, community or key).. /// - public static string ShowSplashScreenOnStart { + public static string SNMPV3ErrorCode_AuthenticationFailed { get { - return ResourceManager.GetString("ShowSplashScreenOnStart", resourceCulture); + return ResourceManager.GetString("SNMPV3ErrorCode_AuthenticationFailed", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Show statistics ähnelt. + /// Looks up a localized string similar to Unknown user name.. /// - public static string ShowStatistics { + public static string SNMPV3ErrorCode_UnknownUserName { get { - return ResourceManager.GetString("ShowStatistics", resourceCulture); + return ResourceManager.GetString("SNMPV3ErrorCode_UnknownUserName", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Show status window on network change ähnelt. + /// Looks up a localized string similar to SNTP Lookup. /// - public static string ShowStatusWindowOnNetworkChange { + public static string SNTPLookup { get { - return ResourceManager.GetString("ShowStatusWindowOnNetworkChange", resourceCulture); + return ResourceManager.GetString("SNTPLookup", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Show the following application on startup: ähnelt. + /// Looks up a localized string similar to SNTP server. /// - public static string ShowTheFollowingApplicationOnStartup { + public static string SNTPServer { get { - return ResourceManager.GetString("ShowTheFollowingApplicationOnStartup", resourceCulture); + return ResourceManager.GetString("SNTPServer", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Show window contents while dragging ähnelt. + /// Looks up a localized string similar to SNTP server(s). /// - public static string ShowWindowContentsWhileDragging { + public static string SNTPServers { get { - return ResourceManager.GetString("ShowWindowContentsWhileDragging", resourceCulture); + return ResourceManager.GetString("SNTPServers", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Sienna ähnelt. + /// Looks up a localized string similar to An SNTP server with this name already exists!. /// - public static string Sienna { + public static string SNTPServerWithThisNameAlreadyExists { get { - return ResourceManager.GetString("Sienna", resourceCulture); + return ResourceManager.GetString("SNTPServerWithThisNameAlreadyExists", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Signal strength ähnelt. + /// Looks up a localized string similar to Socket. /// - public static string SignalStrength { + public static string Socket { get { - return ResourceManager.GetString("SignalStrength", resourceCulture); + return ResourceManager.GetString("Socket", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die A powerful tool for managing networks and troubleshoot network problems! ähnelt. + /// Looks up a localized string similar to Source. /// - public static string Slogan { + public static string Source { get { - return ResourceManager.GetString("Slogan", resourceCulture); + return ResourceManager.GetString("Source", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die SNMP ähnelt. + /// Looks up a localized string similar to Spaces are not allowed!. /// - public static string SNMP { + public static string SpacesAreNotAllowed { get { - return ResourceManager.GetString("SNMP", resourceCulture); + return ResourceManager.GetString("SpacesAreNotAllowed", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Socket ähnelt. + /// Looks up a localized string similar to Speed. /// - public static string Socket { + public static string Speed { get { - return ResourceManager.GetString("Socket", resourceCulture); + return ResourceManager.GetString("Speed", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Spaces are not allowed! ähnelt. + /// Looks up a localized string similar to Speed Test. /// - public static string SpacesAreNotAllowed { + public static string SpeedTest { get { - return ResourceManager.GetString("SpacesAreNotAllowed", resourceCulture); + return ResourceManager.GetString("SpeedTest", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Speed ähnelt. + /// Looks up a localized string similar to Measure download and upload speeds, latency, and jitter with speed.cloudflare.com. + ///Cloudflare may log your IP address and network information. See Cloudflare's privacy policy for details.. /// - public static string Speed { + public static string SpeedTestDisclaimerMessage { get { - return ResourceManager.GetString("Speed", resourceCulture); + return ResourceManager.GetString("SpeedTestDisclaimerMessage", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die SplashScreen ähnelt. + /// Looks up a localized string similar to SplashScreen. /// public static string SplashScreen { get { @@ -7669,7 +11396,7 @@ public static string SplashScreen { } /// - /// Sucht eine lokalisierte Zeichenfolge, die SSH ähnelt. + /// Looks up a localized string similar to SSH. /// public static string SSH { get { @@ -7678,7 +11405,7 @@ public static string SSH { } /// - /// Sucht eine lokalisierte Zeichenfolge, die SSH log ähnelt. + /// Looks up a localized string similar to SSH log. /// public static string SSHLog { get { @@ -7687,7 +11414,7 @@ public static string SSHLog { } /// - /// Sucht eine lokalisierte Zeichenfolge, die SSH port ähnelt. + /// Looks up a localized string similar to SSH port. /// public static string SSHPort { get { @@ -7696,7 +11423,7 @@ public static string SSHPort { } /// - /// Sucht eine lokalisierte Zeichenfolge, die SSH Raw log ähnelt. + /// Looks up a localized string similar to SSH Raw log. /// public static string SSHRawLog { get { @@ -7705,7 +11432,7 @@ public static string SSHRawLog { } /// - /// Sucht eine lokalisierte Zeichenfolge, die SSID ähnelt. + /// Looks up a localized string similar to SSID. /// public static string SSID { get { @@ -7714,16 +11441,16 @@ public static string SSID { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Star/Fork the Project on GitHub ähnelt. + /// Looks up a localized string similar to Star/Fork the Project on GitHub.. /// - public static string StarForkTheProjectOnGitHub { + public static string StarForkProjectOnGitHub { get { - return ResourceManager.GetString("StarForkTheProjectOnGitHub", resourceCulture); + return ResourceManager.GetString("StarForkProjectOnGitHub", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Start minimized in tray ähnelt. + /// Looks up a localized string similar to Start minimized in tray. /// public static string StartMinimizedInTray { get { @@ -7732,7 +11459,7 @@ public static string StartMinimizedInTray { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Start time ähnelt. + /// Looks up a localized string similar to Start time. /// public static string StartTime { get { @@ -7741,7 +11468,7 @@ public static string StartTime { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Start with Windows (current user) ähnelt. + /// Looks up a localized string similar to Start with Windows (current user). /// public static string StartWithWindows { get { @@ -7750,7 +11477,7 @@ public static string StartWithWindows { } /// - /// Sucht eine lokalisierte Zeichenfolge, die State ähnelt. + /// Looks up a localized string similar to State. /// public static string State { get { @@ -7759,7 +11486,7 @@ public static string State { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Static IPv4 address ähnelt. + /// Looks up a localized string similar to Static IPv4 address. /// public static string StaticIPv4Address { get { @@ -7768,7 +11495,7 @@ public static string StaticIPv4Address { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Static IPv4 DNS server ähnelt. + /// Looks up a localized string similar to Static IPv4 DNS server. /// public static string StaticIPv4DNSServer { get { @@ -7777,7 +11504,7 @@ public static string StaticIPv4DNSServer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Statistics ähnelt. + /// Looks up a localized string similar to Statistics. /// public static string Statistics { get { @@ -7786,7 +11513,7 @@ public static string Statistics { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Status ähnelt. + /// Looks up a localized string similar to Status. /// public static string Status { get { @@ -7795,7 +11522,7 @@ public static string Status { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Status change ähnelt. + /// Looks up a localized string similar to Status change. /// public static string StatusChange { get { @@ -7804,7 +11531,16 @@ public static string StatusChange { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Steel ähnelt. + /// Looks up a localized string similar to Status window. + /// + public static string StatusWindow { + get { + return ResourceManager.GetString("StatusWindow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Steel. /// public static string Steel { get { @@ -7813,7 +11549,16 @@ public static string Steel { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Subnet ähnelt. + /// Looks up a localized string similar to Stop. + /// + public static string Stop { + get { + return ResourceManager.GetString("Stop", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Subnet. /// public static string Subnet { get { @@ -7822,7 +11567,7 @@ public static string Subnet { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Subnet 1 ähnelt. + /// Looks up a localized string similar to Subnet 1. /// public static string Subnet1 { get { @@ -7831,7 +11576,7 @@ public static string Subnet1 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Subnet 2 ähnelt. + /// Looks up a localized string similar to Subnet 2. /// public static string Subnet2 { get { @@ -7840,7 +11585,7 @@ public static string Subnet2 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Subnet Calculator ähnelt. + /// Looks up a localized string similar to Subnet Calculator. /// public static string SubnetCalculator { get { @@ -7849,43 +11594,61 @@ public static string SubnetCalculator { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Subnetmask ähnelt. + /// Looks up a localized string similar to Subnet mask. /// - public static string Subnetmask { + public static string SubnetMask { get { - return ResourceManager.GetString("Subnetmask", resourceCulture); + return ResourceManager.GetString("SubnetMask", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Subnetmask or CIDR ähnelt. + /// Looks up a localized string similar to Subnetting. /// - public static string SubnetmaskOrCIDR { + public static string Subnetting { get { - return ResourceManager.GetString("SubnetmaskOrCIDR", resourceCulture); + return ResourceManager.GetString("Subnetting", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Subnetting ähnelt. + /// Looks up a localized string similar to Success!. /// - public static string Subnetting { + public static string Success { get { - return ResourceManager.GetString("Subnetting", resourceCulture); + return ResourceManager.GetString("Success", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Success! ähnelt. + /// Looks up a localized string similar to Successfully connected to {0}!. /// - public static string Success { + public static string SuccessfullyConnectedToXXX { get { - return ResourceManager.GetString("Success", resourceCulture); + return ResourceManager.GetString("SuccessfullyConnectedToXXX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Support this project with a donation.. + /// + public static string SupportThisProjectWithADonation { + get { + return ResourceManager.GetString("SupportThisProjectWithADonation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Synchronization is disabled!. + /// + public static string SyncIsDisabled { + get { + return ResourceManager.GetString("SyncIsDisabled", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Tags ähnelt. + /// Looks up a localized string similar to Tags. /// public static string Tags { get { @@ -7894,7 +11657,7 @@ public static string Tags { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Taupe ähnelt. + /// Looks up a localized string similar to Taupe. /// public static string Taupe { get { @@ -7903,7 +11666,7 @@ public static string Taupe { } /// - /// Sucht eine lokalisierte Zeichenfolge, die TCP/IP stack is available. "{0}" is reachable via ICMP! ähnelt. + /// Looks up a localized string similar to TCP/IP stack is available. "{0}" is reachable via ICMP!. /// public static string TCPIPStackIsAvailableMessage { get { @@ -7912,7 +11675,7 @@ public static string TCPIPStackIsAvailableMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die TCP/IP stack is not available... "{0}" is not reachable via ICMP! ähnelt. + /// Looks up a localized string similar to TCP/IP stack is not available... "{0}" is not reachable via ICMP!. /// public static string TCPIPStackIsNotAvailableMessage { get { @@ -7921,7 +11684,7 @@ public static string TCPIPStackIsNotAvailableMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Closed ähnelt. + /// Looks up a localized string similar to Closed. /// public static string TcpState_Closed { get { @@ -7930,7 +11693,7 @@ public static string TcpState_Closed { } /// - /// Sucht eine lokalisierte Zeichenfolge, die CloseWait ähnelt. + /// Looks up a localized string similar to CloseWait. /// public static string TcpState_CloseWait { get { @@ -7939,7 +11702,7 @@ public static string TcpState_CloseWait { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Closing ähnelt. + /// Looks up a localized string similar to Closing. /// public static string TcpState_Closing { get { @@ -7948,7 +11711,7 @@ public static string TcpState_Closing { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DeleteTcb ähnelt. + /// Looks up a localized string similar to DeleteTcb. /// public static string TcpState_DeleteTcb { get { @@ -7957,7 +11720,7 @@ public static string TcpState_DeleteTcb { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Established ähnelt. + /// Looks up a localized string similar to Established. /// public static string TcpState_Established { get { @@ -7966,7 +11729,7 @@ public static string TcpState_Established { } /// - /// Sucht eine lokalisierte Zeichenfolge, die FinWait1 ähnelt. + /// Looks up a localized string similar to FinWait1. /// public static string TcpState_FinWait1 { get { @@ -7975,7 +11738,7 @@ public static string TcpState_FinWait1 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die FinWait2 ähnelt. + /// Looks up a localized string similar to FinWait2. /// public static string TcpState_FinWait2 { get { @@ -7984,7 +11747,7 @@ public static string TcpState_FinWait2 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die LastAck ähnelt. + /// Looks up a localized string similar to LastAck. /// public static string TcpState_LastAck { get { @@ -7993,7 +11756,7 @@ public static string TcpState_LastAck { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Listen ähnelt. + /// Looks up a localized string similar to Listen. /// public static string TcpState_Listen { get { @@ -8002,7 +11765,7 @@ public static string TcpState_Listen { } /// - /// Sucht eine lokalisierte Zeichenfolge, die SynReceived ähnelt. + /// Looks up a localized string similar to SynReceived. /// public static string TcpState_SynReceived { get { @@ -8011,7 +11774,7 @@ public static string TcpState_SynReceived { } /// - /// Sucht eine lokalisierte Zeichenfolge, die SynSent ähnelt. + /// Looks up a localized string similar to SynSent. /// public static string TcpState_SynSent { get { @@ -8020,7 +11783,7 @@ public static string TcpState_SynSent { } /// - /// Sucht eine lokalisierte Zeichenfolge, die TimeWait ähnelt. + /// Looks up a localized string similar to TimeWait. /// public static string TcpState_TimeWait { get { @@ -8029,7 +11792,7 @@ public static string TcpState_TimeWait { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Unkown ähnelt. + /// Looks up a localized string similar to Unkown. /// public static string TcpState_Unknown { get { @@ -8038,7 +11801,7 @@ public static string TcpState_Unknown { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Teal ähnelt. + /// Looks up a localized string similar to Teal. /// public static string Teal { get { @@ -8047,7 +11810,7 @@ public static string Teal { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Telnet ähnelt. + /// Looks up a localized string similar to Telnet. /// public static string Telnet { get { @@ -8056,7 +11819,7 @@ public static string Telnet { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Telnet port ähnelt. + /// Looks up a localized string similar to Telnet port. /// public static string TelnetPort { get { @@ -8065,7 +11828,25 @@ public static string TelnetPort { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The application can be started without parameters! ähnelt. + /// Looks up a localized string similar to Terabits. + /// + public static string Terabits { + get { + return ResourceManager.GetString("Terabits", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Terabytes. + /// + public static string Terabytes { + get { + return ResourceManager.GetString("Terabytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The application can be started without parameters!. /// public static string TheApplicationCanBeStartedWithoutParameters { get { @@ -8074,7 +11855,7 @@ public static string TheApplicationCanBeStartedWithoutParameters { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The application will be restarted... ähnelt. + /// Looks up a localized string similar to The application will be restarted.... /// public static string TheApplicationWillBeRestarted { get { @@ -8083,7 +11864,7 @@ public static string TheApplicationWillBeRestarted { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The following hostnames could not be resolved: ähnelt. + /// Looks up a localized string similar to The following hostnames could not be resolved:. /// public static string TheFollowingHostnamesCouldNotBeResolved { get { @@ -8092,7 +11873,7 @@ public static string TheFollowingHostnamesCouldNotBeResolved { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The following parameters are available: ähnelt. + /// Looks up a localized string similar to The following parameters are available:. /// public static string TheFollowingParametersAreAvailable { get { @@ -8101,7 +11882,7 @@ public static string TheFollowingParametersAreAvailable { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The following parameters can not be processed: ähnelt. + /// Looks up a localized string similar to The following parameters can not be processed:. /// public static string TheFollowingParametersCanNotBeProcesses { get { @@ -8110,7 +11891,7 @@ public static string TheFollowingParametersCanNotBeProcesses { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Theme ähnelt. + /// Looks up a localized string similar to Theme. /// public static string Theme { get { @@ -8119,7 +11900,7 @@ public static string Theme { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Dark ähnelt. + /// Looks up a localized string similar to Dark. /// public static string Theme_Dark { get { @@ -8128,7 +11909,7 @@ public static string Theme_Dark { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Light ähnelt. + /// Looks up a localized string similar to Light. /// public static string Theme_Light { get { @@ -8137,7 +11918,7 @@ public static string Theme_Light { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The process can take up some time and resources (CPU / RAM). ähnelt. + /// Looks up a localized string similar to The process can take up some time and resources (CPU / RAM).. /// public static string TheProcessCanTakeUpSomeTimeAndResources { get { @@ -8146,7 +11927,7 @@ public static string TheProcessCanTakeUpSomeTimeAndResources { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The settings location is not affected ähnelt. + /// Looks up a localized string similar to The settings location is not affected!. /// public static string TheSettingsLocationIsNotAffected { get { @@ -8155,7 +11936,7 @@ public static string TheSettingsLocationIsNotAffected { } /// - /// Sucht eine lokalisierte Zeichenfolge, die This will reset all settings! ähnelt. + /// Looks up a localized string similar to This will reset all settings!. /// public static string ThisWillResetAllSettings { get { @@ -8164,34 +11945,34 @@ public static string ThisWillResetAllSettings { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Threads ähnelt. + /// Looks up a localized string similar to ThreadPool additional min. threads. /// - public static string Threads { + public static string ThreadPoolAdditionalMinThreads { get { - return ResourceManager.GetString("Threads", resourceCulture); + return ResourceManager.GetString("ThreadPoolAdditionalMinThreads", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die TigerVNC ähnelt. + /// Looks up a localized string similar to Threads. /// - public static string TigerVNC { + public static string Threads { get { - return ResourceManager.GetString("TigerVNC", resourceCulture); + return ResourceManager.GetString("Threads", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die TigerVNC location... ähnelt. + /// Looks up a localized string similar to TigerVNC. /// - public static string TigerVNCLocationDots { + public static string TigerVNC { get { - return ResourceManager.GetString("TigerVNCLocationDots", resourceCulture); + return ResourceManager.GetString("TigerVNC", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die TigerVNC process has ended! ähnelt. + /// Looks up a localized string similar to TigerVNC process has ended!. /// public static string TigerVNCProcessHasEnded { get { @@ -8200,7 +11981,7 @@ public static string TigerVNCProcessHasEnded { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Time ähnelt. + /// Looks up a localized string similar to Time. /// public static string Time { get { @@ -8209,7 +11990,7 @@ public static string Time { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Time 1 ähnelt. + /// Looks up a localized string similar to Time 1. /// public static string Time1 { get { @@ -8218,7 +11999,7 @@ public static string Time1 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Time 2 ähnelt. + /// Looks up a localized string similar to Time 2. /// public static string Time2 { get { @@ -8227,7 +12008,7 @@ public static string Time2 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Time 3 ähnelt. + /// Looks up a localized string similar to Time 3. /// public static string Time3 { get { @@ -8236,16 +12017,25 @@ public static string Time3 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Time in seconds how long the window should be displayed ähnelt. + /// Looks up a localized string similar to Time in seconds how long the status window is shown. /// - public static string TimeInSecondsHowLongTheWindowShouldBeDisplayed { + public static string TimeInSecondsHowLongTheStatusWindowIsShown { get { - return ResourceManager.GetString("TimeInSecondsHowLongTheWindowShouldBeDisplayed", resourceCulture); + return ResourceManager.GetString("TimeInSecondsHowLongTheStatusWindowIsShown", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Timeout ähnelt. + /// Looks up a localized string similar to Time (ms) to wait between each ping. + /// + public static string TimeMSToWaitBetweenEachPing { + get { + return ResourceManager.GetString("TimeMSToWaitBetweenEachPing", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Timeout. /// public static string Timeout { get { @@ -8254,7 +12044,7 @@ public static string Timeout { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Timeout (ms) ähnelt. + /// Looks up a localized string similar to Timeout (ms). /// public static string TimeoutMS { get { @@ -8263,7 +12053,7 @@ public static string TimeoutMS { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Timeout on SNMP query. ähnelt. + /// Looks up a localized string similar to Timeout on SNMP query. Maybe the host is not reachable or the community / password is wrong.. /// public static string TimeoutOnSNMPQuery { get { @@ -8272,7 +12062,7 @@ public static string TimeoutOnSNMPQuery { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Timeout (s) ähnelt. + /// Looks up a localized string similar to Timeout (s). /// public static string TimeoutS { get { @@ -8281,7 +12071,7 @@ public static string TimeoutS { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Timeout when querying the DNS server with the IP address "{0}"! ähnelt. + /// Looks up a localized string similar to Timeout when querying the DNS server with the IP address "{0}"!. /// public static string TimeoutWhenQueryingDNSServerMessage { get { @@ -8290,7 +12080,7 @@ public static string TimeoutWhenQueryingDNSServerMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Timestamp ähnelt. + /// Looks up a localized string similar to Timestamp. /// public static string Timestamp { get { @@ -8299,7 +12089,7 @@ public static string Timestamp { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Time to live ähnelt. + /// Looks up a localized string similar to Time to live. /// public static string TimeToLive { get { @@ -8308,16 +12098,7 @@ public static string TimeToLive { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Time to wait between each ping ähnelt. - /// - public static string TimeToWaitBetweenEachPing { - get { - return ResourceManager.GetString("TimeToWaitBetweenEachPing", resourceCulture); - } - } - - /// - /// Sucht eine lokalisierte Zeichenfolge, die Hour(s) ähnelt. + /// Looks up a localized string similar to Hour(s). /// public static string TimeUnit_Hour { get { @@ -8326,7 +12107,7 @@ public static string TimeUnit_Hour { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Minute(s) ähnelt. + /// Looks up a localized string similar to Minute(s). /// public static string TimeUnit_Minute { get { @@ -8335,7 +12116,7 @@ public static string TimeUnit_Minute { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Second(s) ähnelt. + /// Looks up a localized string similar to Second(s). /// public static string TimeUnit_Second { get { @@ -8344,52 +12125,16 @@ public static string TimeUnit_Second { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Open documentation on GitHub. ähnelt. - /// - public static string ToolTip_GithubDocumentationUrl { - get { - return ResourceManager.GetString("ToolTip_GithubDocumentationUrl", resourceCulture); - } - } - - /// - /// Sucht eine lokalisierte Zeichenfolge, die Report an issue or create a feature request. ähnelt. - /// - public static string ToolTip_GithubNewIssueUrl { - get { - return ResourceManager.GetString("ToolTip_GithubNewIssueUrl", resourceCulture); - } - } - - /// - /// Sucht eine lokalisierte Zeichenfolge, die Star/Fork the Project on GitHub. ähnelt. + /// Looks up a localized string similar to Timezone. /// - public static string ToolTip_GitHubProjectUrl { + public static string Timezone { get { - return ResourceManager.GetString("ToolTip_GitHubProjectUrl", resourceCulture); + return ResourceManager.GetString("Timezone", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Help translate the project on Transifex. ähnelt. - /// - public static string ToolTip_TransifexProjectUrl { - get { - return ResourceManager.GetString("ToolTip_TransifexProjectUrl", resourceCulture); - } - } - - /// - /// Sucht eine lokalisierte Zeichenfolge, die Contact via Twitter. ähnelt. - /// - public static string ToolTip_TwitterContactUrl { - get { - return ResourceManager.GetString("ToolTip_TwitterContactUrl", resourceCulture); - } - } - - /// - /// Sucht eine lokalisierte Zeichenfolge, die Total bytes received ähnelt. + /// Looks up a localized string similar to Total bytes received. /// public static string TotalBytesReceived { get { @@ -8398,7 +12143,7 @@ public static string TotalBytesReceived { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Total bytes sent ähnelt. + /// Looks up a localized string similar to Total bytes sent. /// public static string TotalBytesSent { get { @@ -8407,7 +12152,7 @@ public static string TotalBytesSent { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Total download ähnelt. + /// Looks up a localized string similar to Total download. /// public static string TotalDownload { get { @@ -8416,7 +12161,7 @@ public static string TotalDownload { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Total upload ähnelt. + /// Looks up a localized string similar to Total upload. /// public static string TotalUpload { get { @@ -8425,7 +12170,7 @@ public static string TotalUpload { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Trace ähnelt. + /// Looks up a localized string similar to Trace. /// public static string Trace { get { @@ -8434,7 +12179,7 @@ public static string Trace { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Traceroute ähnelt. + /// Looks up a localized string similar to Traceroute. /// public static string Traceroute { get { @@ -8443,7 +12188,7 @@ public static string Traceroute { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Tray ähnelt. + /// Looks up a localized string similar to Tray. /// public static string Tray { get { @@ -8452,7 +12197,7 @@ public static string Tray { } /// - /// Sucht eine lokalisierte Zeichenfolge, die TTL ähnelt. + /// Looks up a localized string similar to TTL. /// public static string TTL { get { @@ -8461,7 +12206,7 @@ public static string TTL { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Type ähnelt. + /// Looks up a localized string similar to Type. /// public static string Type { get { @@ -8470,7 +12215,16 @@ public static string Type { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Unkown error! ähnelt. + /// Looks up a localized string similar to Unit. + /// + public static string Unit { + get { + return ResourceManager.GetString("Unit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unkown error!. /// public static string UnkownError { get { @@ -8479,7 +12233,7 @@ public static string UnkownError { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Unlock profile ähnelt. + /// Looks up a localized string similar to Unlock profile. /// public static string UnlockProfile { get { @@ -8488,34 +12242,34 @@ public static string UnlockProfile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Unlock the profile file to use the profiles! ähnelt. + /// Looks up a localized string similar to Unlock profile file. /// - public static string UnlockTheProfileFileMessage { + public static string UnlockProfileFile { get { - return ResourceManager.GetString("UnlockTheProfileFileMessage", resourceCulture); + return ResourceManager.GetString("UnlockProfileFile", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Unlock the profile file to add, change or delete a profile! ähnelt. + /// Looks up a localized string similar to Unlock the profile file to use the profiles!. /// - public static string UnlockTheProfileFileMessage2 { + public static string UnlockTheProfileFileMessage { get { - return ResourceManager.GetString("UnlockTheProfileFileMessage2", resourceCulture); + return ResourceManager.GetString("UnlockTheProfileFileMessage", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Untray / Bring window to front ähnelt. + /// Looks up a localized string similar to Untray / Bring window to foreground. /// - public static string UntrayBringWindowToFront { + public static string UntrayBringWindowToForeground { get { - return ResourceManager.GetString("UntrayBringWindowToFront", resourceCulture); + return ResourceManager.GetString("UntrayBringWindowToForeground", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Update ähnelt. + /// Looks up a localized string similar to Update. /// public static string Update { get { @@ -8524,7 +12278,7 @@ public static string Update { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Update available! ähnelt. + /// Looks up a localized string similar to Update available!. /// public static string UpdateAvailable { get { @@ -8533,7 +12287,16 @@ public static string UpdateAvailable { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Upload ähnelt. + /// Looks up a localized string similar to Upgraded to {0}. + /// + public static string UpgradedToXXX { + get { + return ResourceManager.GetString("UpgradedToXXX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Upload. /// public static string Upload { get { @@ -8542,7 +12305,7 @@ public static string Upload { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Uptime ähnelt. + /// Looks up a localized string similar to Uptime. /// public static string Uptime { get { @@ -8551,7 +12314,7 @@ public static string Uptime { } /// - /// Sucht eine lokalisierte Zeichenfolge, die URL ähnelt. + /// Looks up a localized string similar to URL. /// public static string URL { get { @@ -8560,7 +12323,7 @@ public static string URL { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Use cache ähnelt. + /// Looks up a localized string similar to Use cache. /// public static string UseCache { get { @@ -8569,7 +12332,7 @@ public static string UseCache { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Use credentials ähnelt. + /// Looks up a localized string similar to Use credentials. /// public static string UseCredentials { get { @@ -8578,7 +12341,7 @@ public static string UseCredentials { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Use the current view size as the screen size ähnelt. + /// Looks up a localized string similar to Use the current view size as the screen size. /// public static string UseCurrentViewSize { get { @@ -8587,7 +12350,16 @@ public static string UseCurrentViewSize { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Use custom DNS server ähnelt. + /// Looks up a localized string similar to Use current Windows credentials. + /// + public static string UseCurrentWindowsCredentials { + get { + return ResourceManager.GetString("UseCurrentWindowsCredentials", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use custom DNS server. /// public static string UseCustomDNSServer { get { @@ -8596,7 +12368,7 @@ public static string UseCustomDNSServer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Use custom DNS suffix ähnelt. + /// Looks up a localized string similar to Use custom DNS suffix. /// public static string UseCustomDNSSuffix { get { @@ -8605,7 +12377,7 @@ public static string UseCustomDNSSuffix { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Use custom IPv4 address API ähnelt. + /// Looks up a localized string similar to Use custom IPv4 address API. /// public static string UseCustomIPv4AddressAPI { get { @@ -8614,7 +12386,7 @@ public static string UseCustomIPv4AddressAPI { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Use custom IPv6 address API ähnelt. + /// Looks up a localized string similar to Use custom IPv6 address API. /// public static string UseCustomIPv6AddressAPI { get { @@ -8623,34 +12395,43 @@ public static string UseCustomIPv6AddressAPI { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Use only TCP ähnelt. + /// Looks up a localized string similar to Use custom themes. /// - public static string UseOnlyTCP { + public static string UseCustomThemes { get { - return ResourceManager.GetString("UseOnlyTCP", resourceCulture); + return ResourceManager.GetString("UseCustomThemes", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Use other ähnelt. + /// Looks up a localized string similar to Use gateway credentials. /// - public static string UseOther { + public static string UseGatewayCredentials { get { - return ResourceManager.GetString("UseOther", resourceCulture); + return ResourceManager.GetString("UseGatewayCredentials", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use only TCP. + /// + public static string UseOnlyTCP { + get { + return ResourceManager.GetString("UseOnlyTCP", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Use other folder ähnelt. + /// Looks up a localized string similar to Use other. /// - public static string UseOtherFolder { + public static string UseOther { get { - return ResourceManager.GetString("UseOtherFolder", resourceCulture); + return ResourceManager.GetString("UseOther", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die Use resolver cache ähnelt. + /// Looks up a localized string similar to Use resolver cache. /// public static string UseResolverCache { get { @@ -8659,7 +12440,7 @@ public static string UseResolverCache { } /// - /// Sucht eine lokalisierte Zeichenfolge, die User interface locked! ähnelt. + /// Looks up a localized string similar to User interface locked!. /// public static string UserInterfaceLocked { get { @@ -8668,7 +12449,7 @@ public static string UserInterfaceLocked { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Username ähnelt. + /// Looks up a localized string similar to Username. /// public static string Username { get { @@ -8677,7 +12458,16 @@ public static string Username { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Use the following DNS server addresses: ähnelt. + /// Looks up a localized string similar to Use SSL (LDAPS). + /// + public static string UseSsl { + get { + return ResourceManager.GetString("UseSsl", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use the following DNS server addresses:. /// public static string UseTheFollowingDNSServerAddresses { get { @@ -8686,7 +12476,7 @@ public static string UseTheFollowingDNSServerAddresses { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Use the following IP address: ähnelt. + /// Looks up a localized string similar to Use the following IP address:. /// public static string UseTheFollowingIPAddress { get { @@ -8695,7 +12485,16 @@ public static string UseTheFollowingIPAddress { } /// - /// Sucht eine lokalisierte Zeichenfolge, die v1/v2c ähnelt. + /// Looks up a localized string similar to Use these credentials. + /// + public static string UseTheseCredentials { + get { + return ResourceManager.GetString("UseTheseCredentials", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to v1/v2c. /// public static string v1v2c { get { @@ -8704,7 +12503,7 @@ public static string v1v2c { } /// - /// Sucht eine lokalisierte Zeichenfolge, die v3 ähnelt. + /// Looks up a localized string similar to v3. /// public static string v3 { get { @@ -8713,7 +12512,7 @@ public static string v3 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Validate ähnelt. + /// Looks up a localized string similar to Validate. /// public static string Validate { get { @@ -8722,7 +12521,7 @@ public static string Validate { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Validation failed! ähnelt. + /// Looks up a localized string similar to Validation failed!. /// public static string ValidationFailed { get { @@ -8731,7 +12530,7 @@ public static string ValidationFailed { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Value ähnelt. + /// Looks up a localized string similar to Value. /// public static string Value { get { @@ -8740,7 +12539,7 @@ public static string Value { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Vendor ähnelt. + /// Looks up a localized string similar to Vendor. /// public static string Vendor { get { @@ -8749,7 +12548,7 @@ public static string Vendor { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Version ähnelt. + /// Looks up a localized string similar to Version. /// public static string Version { get { @@ -8758,7 +12557,7 @@ public static string Version { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Version {0} is available! ähnelt. + /// Looks up a localized string similar to Version {0} is available!. /// public static string VersionxxIsAvailable { get { @@ -8767,7 +12566,25 @@ public static string VersionxxIsAvailable { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Violet ähnelt. + /// Looks up a localized string similar to View only. + /// + public static string ViewOnly { + get { + return ResourceManager.GetString("ViewOnly", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Block keyboard and mouse input to the remote session. + /// + public static string ViewOnlyDescription { + get { + return ResourceManager.GetString("ViewOnlyDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Violet. /// public static string Violet { get { @@ -8776,7 +12593,7 @@ public static string Violet { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Visible applications ähnelt. + /// Looks up a localized string similar to Visible applications. /// public static string VisibleApplications { get { @@ -8785,7 +12602,7 @@ public static string VisibleApplications { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Visible applications in the bar: ähnelt. + /// Looks up a localized string similar to Visible applications in the bar:. /// public static string VisibleApplicationsInTheBar { get { @@ -8794,7 +12611,7 @@ public static string VisibleApplicationsInTheBar { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Visual styles ähnelt. + /// Looks up a localized string similar to Visual styles. /// public static string VisualStyles { get { @@ -8803,7 +12620,7 @@ public static string VisualStyles { } /// - /// Sucht eine lokalisierte Zeichenfolge, die VLAN ähnelt. + /// Looks up a localized string similar to VLAN. /// public static string VLAN { get { @@ -8812,7 +12629,7 @@ public static string VLAN { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Wake on LAN ähnelt. + /// Looks up a localized string similar to Wake on LAN. /// public static string WakeOnLAN { get { @@ -8821,7 +12638,7 @@ public static string WakeOnLAN { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Wake up ähnelt. + /// Looks up a localized string similar to Wake up. /// public static string WakeUp { get { @@ -8830,7 +12647,7 @@ public static string WakeUp { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Walk mode ähnelt. + /// Looks up a localized string similar to Walk mode. /// public static string WalkMode { get { @@ -8839,18 +12656,18 @@ public static string WalkMode { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not resolve ip address for hostname! ähnelt. + /// Looks up a localized string similar to Could not resolve ip address for hostname!. /// - public static string WarningMessage_CouldNotResolvIPAddressForHostname { + public static string WarningMessage_CouldNotResolveIPAddressForHostname { get { - return ResourceManager.GetString("WarningMessage_CouldNotResolvIPAddressForHostname", resourceCulture); + return ResourceManager.GetString("WarningMessage_CouldNotResolveIPAddressForHostname", resourceCulture); } } /// - /// Sucht eine lokalisierte Zeichenfolge, die The current profile file is not encrypted and passwords will stored unencrypted on disk! + /// Looks up a localized string similar to The current profile file is not encrypted and passwords will stored unencrypted on disk! /// - ///Enable profile file encryption in Settings>Profile to store credentials securely. ähnelt. + ///Enable profile file encryption in Settings>Profile to store credentials securely.. /// public static string WarningMessage_ProfileFileNotEncryptedStoringPasswords { get { @@ -8859,7 +12676,16 @@ public static string WarningMessage_ProfileFileNotEncryptedStoringPasswords { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Web Console ähnelt. + /// Looks up a localized string similar to Enabling this setting is not recommended. Multiple instances of the application share the same settings and profile files. The last instance to be closed may overwrite changes made by other instances.. + /// + public static string WarnMessage_MultipleInstances { + get { + return ResourceManager.GetString("WarnMessage_MultipleInstances", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Web Console. /// public static string WebConsole { get { @@ -8868,7 +12694,7 @@ public static string WebConsole { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Website ähnelt. + /// Looks up a localized string similar to Website. /// public static string Website { get { @@ -8877,7 +12703,7 @@ public static string Website { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The WebView control (Microsoft Edge) cannot connect to websites with an invalid certificate! ähnelt. + /// Looks up a localized string similar to The WebView control (Microsoft Edge) cannot connect to websites with an invalid certificate!. /// public static string WebViewControlCertificateIsInvalidMessage { get { @@ -8886,7 +12712,7 @@ public static string WebViewControlCertificateIsInvalidMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Welcome ähnelt. + /// Looks up a localized string similar to Welcome. /// public static string Welcome { get { @@ -8895,7 +12721,45 @@ public static string Welcome { } /// - /// Sucht eine lokalisierte Zeichenfolge, die White ähnelt. + /// Looks up a localized string similar to Thank you for using NETworkManager! + /// + ///If you enjoy it, please consider supporting its development — whether by leaving a star on GitHub, making a donation, or simply sharing it with others. Your support helps keep the project going and growing.. + /// + public static string WelcomeMessage { + get { + return ResourceManager.GetString("WelcomeMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to To provide additional features, third party services are used that are not operated by me. You can deselect them below. No data is transferred to me at any time.. + /// + public static string WelcomePrivacyMessage { + get { + return ResourceManager.GetString("WelcomePrivacyMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to What's new?. + /// + public static string WhatsNew { + get { + return ResourceManager.GetString("WhatsNew", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This release includes new features, improvements, and bug fixes. Check out the changelog for all the details!. + /// + public static string WhatsNewMessage { + get { + return ResourceManager.GetString("WhatsNewMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to White. /// public static string White { get { @@ -8904,7 +12768,7 @@ public static string White { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Whois ähnelt. + /// Looks up a localized string similar to Whois. /// public static string Whois { get { @@ -8913,7 +12777,7 @@ public static string Whois { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Whois server not found for the domain: "{0}" ähnelt. + /// Looks up a localized string similar to Whois server not found for the domain: "{0}". /// public static string WhoisServerNotFoundForTheDomain { get { @@ -8922,7 +12786,7 @@ public static string WhoisServerNotFoundForTheDomain { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Wide Subnet ähnelt. + /// Looks up a localized string similar to Wide Subnet. /// public static string WideSubnet { get { @@ -8931,7 +12795,7 @@ public static string WideSubnet { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Width ähnelt. + /// Looks up a localized string similar to Width. /// public static string Width { get { @@ -8940,7 +12804,7 @@ public static string Width { } /// - /// Sucht eine lokalisierte Zeichenfolge, die WiFi ähnelt. + /// Looks up a localized string similar to WiFi. /// public static string WiFi { get { @@ -8949,7 +12813,81 @@ public static string WiFi { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Window ähnelt. + /// Looks up a localized string similar to Starting with Windows 11 24H2, you’ll need to allow access to the Wi-Fi adapter. + /// + ///Open Windows Settings > Privacy & security > Location, enable access for Desktop Apps / NETworkManager, then restart the application.. + /// + public static string WiFiAccessNotAvailableMessage { + get { + return ResourceManager.GetString("WiFiAccessNotAvailableMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Access to the network has been revoked. + /// + public static string WiFiConnectionStatus_AccessRevoked { + get { + return ResourceManager.GetString("WiFiConnectionStatus_AccessRevoked", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid credentials. + /// + public static string WiFiConnectionStatus_InvalidCredential { + get { + return ResourceManager.GetString("WiFiConnectionStatus_InvalidCredential", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Network not available. + /// + public static string WiFiConnectionStatus_NetworkNotAvailable { + get { + return ResourceManager.GetString("WiFiConnectionStatus_NetworkNotAvailable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Successful. + /// + public static string WiFiConnectionStatus_Success { + get { + return ResourceManager.GetString("WiFiConnectionStatus_Success", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Connection attempt timed out. + /// + public static string WiFiConnectionStatus_Timeout { + get { + return ResourceManager.GetString("WiFiConnectionStatus_Timeout", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to -/-. + /// + public static string WiFiConnectionStatus_UnspecifiedFailure { + get { + return ResourceManager.GetString("WiFiConnectionStatus_UnspecifiedFailure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Authentication protocol is not supported!. + /// + public static string WiFiConnectionStatus_UnsupportedAuthenticationProtocol { + get { + return ResourceManager.GetString("WiFiConnectionStatus_UnsupportedAuthenticationProtocol", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Window. /// public static string Window { get { @@ -8958,7 +12896,7 @@ public static string Window { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Windows DNS settings ähnelt. + /// Looks up a localized string similar to Windows DNS settings. /// public static string WindowsDNSSettings { get { @@ -8967,7 +12905,25 @@ public static string WindowsDNSSettings { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Wrong password! ähnelt. + /// Looks up a localized string similar to Windows Firewall settings. + /// + public static string WindowsFirewallSettings { + get { + return ResourceManager.GetString("WindowsFirewallSettings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to WPS. + /// + public static string WPS { + get { + return ResourceManager.GetString("WPS", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Wrong password!. /// public static string WrongPassword { get { @@ -8976,7 +12932,7 @@ public static string WrongPassword { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Profile file could not be decrypted with the given password. ähnelt. + /// Looks up a localized string similar to Profile file could not be decrypted with the given password.. /// public static string WrongPasswordDecryptionFailedMessage { get { @@ -8985,7 +12941,7 @@ public static string WrongPasswordDecryptionFailedMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The entered password is wrong. ähnelt. + /// Looks up a localized string similar to The entered password is wrong.. /// public static string WrongPasswordMessage { get { @@ -8994,7 +12950,7 @@ public static string WrongPasswordMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die "{0}" A dns records resolved for "{1}"! ähnelt. + /// Looks up a localized string similar to "{0}" A dns records resolved for "{1}"!. /// public static string XADNSRecordsResolvedForXXXMessage { get { @@ -9003,7 +12959,7 @@ public static string XADNSRecordsResolvedForXXXMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die {0} seconds remaining... ähnelt. + /// Looks up a localized string similar to {0} seconds remaining.... /// public static string XXSecondsRemainingDots { get { @@ -9012,7 +12968,7 @@ public static string XXSecondsRemainingDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die "{0}" detected as gateway ip address! ähnelt. + /// Looks up a localized string similar to "{0}" detected as gateway ip address!. /// public static string XXXDetectedAsGatewayIPAddress { get { @@ -9021,7 +12977,7 @@ public static string XXXDetectedAsGatewayIPAddress { } /// - /// Sucht eine lokalisierte Zeichenfolge, die "{0}" detected as local ip address! ähnelt. + /// Looks up a localized string similar to "{0}" detected as local ip address!. /// public static string XXXDetectedAsLocalIPAddressMessage { get { @@ -9030,7 +12986,16 @@ public static string XXXDetectedAsLocalIPAddressMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die "{0}" is not reachable via ICMP! ähnelt. + /// Looks up a localized string similar to {0} disconnected!. + /// + public static string XXXDisconnected { + get { + return ResourceManager.GetString("XXXDisconnected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to "{0}" is not reachable via ICMP!. /// public static string XXXIsNotReachableViaICMPMessage { get { @@ -9039,7 +13004,7 @@ public static string XXXIsNotReachableViaICMPMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die "{0}" is reachable via ICMP! ähnelt. + /// Looks up a localized string similar to "{0}" is reachable via ICMP!. /// public static string XXXIsReachableViaICMPMessage { get { @@ -9048,7 +13013,7 @@ public static string XXXIsReachableViaICMPMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Yellow ähnelt. + /// Looks up a localized string similar to Yellow. /// public static string Yellow { get { @@ -9057,7 +13022,7 @@ public static string Yellow { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Yes ähnelt. + /// Looks up a localized string similar to Yes. /// public static string Yes { get { @@ -9066,12 +13031,21 @@ public static string Yes { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Your system OS is incompatible with the latest release! ähnelt. + /// Looks up a localized string similar to Your system OS is incompatible with the latest release!. /// public static string YourSystemOSIsIncompatibleWithTheLatestRelease { get { return ResourceManager.GetString("YourSystemOSIsIncompatibleWithTheLatestRelease", resourceCulture); } } + + /// + /// Looks up a localized string similar to Zip. + /// + public static string ZipCode { + get { + return ResourceManager.GetString("ZipCode", resourceCulture); + } + } } } diff --git a/Source/NETworkManager.Localization/Resources/Strings.cs-CZ.resx b/Source/NETworkManager.Localization/Resources/Strings.cs-CZ.resx index cd34513e21..2634774c7e 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.cs-CZ.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.cs-CZ.resx @@ -138,8 +138,32 @@ ARP - - ARP tabulka + + Neighbor Table + + + Read-only mode. Modifying the neighbor table requires elevated rights! + + + Unreachable + + + Incomplete + + + Probe + + + Delay + + + Stale + + + Reachable + + + Permanent Ověření @@ -285,12 +309,24 @@ Síťový adapter + + Configuration applied + + + Configuring the network interface requires elevated rights! + Nová karta + + Next + OUI + + Options + Přepsat? @@ -348,9 +384,6 @@ Nastavení - - Nastavení vynulováno - SNMP @@ -444,6 +477,18 @@ Popis + + Placeholder + + + Path to the file or executable to run. The following placeholders can be used: + + + Arguments passed to the file or executable. The following placeholders can be used: + + + The following placeholder can be used: + DHCP zapnuto @@ -489,6 +534,30 @@ IPv4 adresy + + IPv4 address added + + + IPv4 address removed + + + IPv4 address released and renewed + + + IPv4 address released + + + IPv4 address renewed + + + IPv6 address released and renewed + + + IPv6 address released + + + IPv6 address renewed + IPv4 výchozí brána @@ -504,11 +573,23 @@ IPv6 výchozí brána + + Map + + + (+{0} more) + + + Scroll = Zoom, Drag = Pan + + + Unknown + Maximum - - Maximální počet skoků/routerů + + Maximum hops Neukončovat, ale minimalizovat do Tray @@ -561,9 +642,6 @@ Vyžadován restart aplikace - - Některá nastavení se aplikují až po novém spuštění aplikace! - Uložit nastavení do složky aplikace @@ -577,7 +655,7 @@ Zobrazit následující aplikace během startu: - Výkonný nástroj pro správu sítí a řešení problémů se sítí! + A powerful open-source tool for managing networks and troubleshooting network problems! Rychlost @@ -594,11 +672,8 @@ Statická IPv4 adresa DNS serverů - - Maska podsítě - - - Maska podsítě nebo CIDR + + Subnet mask Vlákna @@ -621,8 +696,8 @@ Časový limit (ms) - - Časová prodleva mezi pingy + + Time (ms) to wait between each ping TTL @@ -663,9 +738,6 @@ Přidat kartu pro provedení trasování... - - Přidat kartu pro provedení dotau na HTTP hlavičku... - Přidat DNS příponu (primární) k názvu hosta @@ -691,7 +763,7 @@ Použít - Použít kombinaci kláves Windows (např. Alt + Tab): + Apply Windows key combinations (e.g., ALT+TAB): Autorizace @@ -720,6 +792,9 @@ CapsLock je zapnut! + + Chart time (seconds) + Ověřit aktualizaci po spuštění @@ -821,9 +896,6 @@ First make a backup copy of your profile files before enabling encryption! DNS server - - Otevřít dokumentaci - Doména @@ -842,8 +914,8 @@ First make a backup copy of your profile files before enabling encryption! Čas ukončení - - Vložit podsíť pro výpočet... + + Enter a subnet to calculate it... Vložit podsíť a novou masku k vytvoření podsítě... @@ -866,9 +938,6 @@ First make a backup copy of your profile files before enabling encryption! Trvalý rozměr obrazovky: - - Přidej hvězdičku pro tento projekt na GitHubu - Nalezeno @@ -885,7 +954,7 @@ First make a backup copy of your profile files before enabling encryption!Název hosta nebo IP adresa - Hosti + Hosts ID @@ -969,6 +1038,9 @@ First make a backup copy of your profile files before enabling encryption! OID + + Only CSV files are allowed! + Pouze při zobrazení na celou obrazovku @@ -993,12 +1065,6 @@ First make a backup copy of your profile files before enabling encryption! Přepsat - - Přepsat nastavení v cílové složce? - -"Přepsat" přepíše soubor v cílové složce. -Možnost "Použít jiné" použije existující soubor nastavení v cíli a restartuje aplikaci. - Heslo @@ -1029,9 +1095,6 @@ Možnost "Použít jiné" použije existující soubor nastavení v cíli a rest Proces PuTTY ukončen! - - PuTTY profil - Otázka @@ -1098,18 +1161,6 @@ Možnost "Použít jiné" použije existující soubor nastavení v cíli a rest Vyběr rozlišení obrazovky - - Vybrané nastavení přepsáno! - - - Vybrané nastavení vynulováno. - - - Výběr nastavení pro export: - - - Výběr nastavení pro import: - Toto vynuluje všechny nastavení! @@ -1123,17 +1174,11 @@ Možnost "Použít jiné" použije existující soubor nastavení v cíli a rest Služba - Soubor nastavení je poškozen a nebo je nekompatibilní s touto verzí. Všechny nastavení byly vynulovány! -(Soubory profilů zůstaly v pořádku!) - - - Nastavení byly vyexportovány! - - - Nastavení byly naimportovány! - - - Nastavení byly vynujovány! + The found settings file was corrupted or is not compatible with this version! You may report this issue on GitHub. + +A backup of the settings file was created in the settings folder and the settings were reset. + +Profile files are not affected! Zobrazit uzamčené porty @@ -1144,8 +1189,8 @@ Možnost "Použít jiné" použije existující soubor nastavení v cíli a rest Zobrazit pouze nejpoužívanější dotazy - - Zobrazit výsledky pro všechny IP adresy + + Show unreachable IP addresses and ports Zabrazit statistiky @@ -1187,10 +1232,10 @@ Možnost "Použít jiné" použije existující soubor nastavení v cíli a rest Operace může trvat delší dobu a spotřebovat více prostředků (CPU / RAM). - Umístění nastavení nenarušena + The settings location is not affected! - Časový limit SNMP dotazu. + Timeout on SNMP query. Maybe the host is not reachable or the community / password is wrong. Došlo k časovému limitu dotazu DNS serveru "{0}"! @@ -1204,8 +1249,8 @@ Možnost "Použít jiné" použije existující soubor nastavení v cíli a rest Neznámá chyba! - - Obnovit okno do popředí + + Untray / Bring window to foreground URL @@ -1309,6 +1354,9 @@ Možnost "Použít jiné" použije existující soubor nastavení v cíli a rest Vyčistit mezipaměť DNS + + DNS cache flushed + Dešivrovat a zavést pověření pro vyběr. @@ -1366,12 +1414,12 @@ Možnost "Použít jiné" použije existující soubor nastavení v cíli a rest Přepsat + + Parse + Vložit - - C:\Program Files\PuTTY\putty.exe - Obnovit připojení @@ -1409,22 +1457,22 @@ Možnost "Použít jiné" použije existující soubor nastavení v cíli a rest Připojení - Vložit správný rozsah adres! + Enter a valid IP range! Vložit správnou IPv4 adresu! - Vložit správnou MAC adresu (např. 00:F1:23:AB:F2:35)! + Enter a valid MAC address (e.g., 00:F1:23:AB:F2:35)! Vložit správný port (1 - 65535)! - Vložit správnou masku sítě (např. 255.255.255.0)! + Enter a valid subnetmask (e.g., 255.255.255.0)! - Vložit správnou masku sítě nebo CIDR (např. 255.255.255.0 nebo /24)! + Enter a valid subnetmask or CIDR (e.g., 255.255.255.0 or /24)! Pole nemůže být prázdné! @@ -1496,10 +1544,10 @@ Možnost "Použít jiné" použije existující soubor nastavení v cíli a rest Vložit správný port nebo rozsah (1-65535)! - Vložit správnou podsíť (např. 192.168.178.133/26)! + Enter a valid subnet (e.g., 192.168.178.133/26)! - Vložit správnou adresu WWW (např. https://example.com/index.html)! + Enter a valid website (e.g., https://example.com/index.html) Zelený @@ -1534,6 +1582,9 @@ Možnost "Použít jiné" použije existující soubor nastavení v cíli a rest Limetkový + + Live + Purpurový @@ -1762,9 +1813,6 @@ Možnost "Použít jiné" použije existující soubor nastavení v cíli a rest Žlutý - - Vložit správnou hodnotu v rozmezí 25 - 100! - Profil s tímto názvem již existuje! @@ -1793,7 +1841,10 @@ Možnost "Použít jiné" použije existující soubor nastavení v cíli a rest Přidat kartu s dotazem Whois... - Vložit správnou doménu (např.example.com)! + Enter a valid domain (e.g., "example.com")! + + + Enter a valid Windows username (e.g., "user", "DOMAIN\user" or "user@domain.com")! Server Whois nenalezen pro domény: "{0}" @@ -1837,9 +1888,6 @@ Možnost "Použít jiné" použije existující soubor nastavení v cíli a rest Nastavení cesty k aplikaci TigerVNC... - - Umístění TigerVNC... - Proces TigerVNC byk ukončen! @@ -1903,11 +1951,11 @@ Možnost "Použít jiné" použije existující soubor nastavení v cíli a rest Vložit adresu IPv4 - - Host vlákna + + Max. concurrent host threads - - Port vlákna + + Max. concurrent port threads PowerShell @@ -1924,9 +1972,6 @@ Možnost "Použít jiné" použije existující soubor nastavení v cíli a rest Vzdálená konzola - - Umístění PowerShell... - Cesta k souboru @@ -1964,11 +2009,11 @@ Možnost "Použít jiné" použije existující soubor nastavení v cíli a rest Úloha na pozadí - Úloha na pozadí uloží každých x-minut všechna nastavení, profily i pověření. + The background job will save settings and profiles every x-minutes. -Hodnota 0 vypne tuto funkci. +Value 0 will disable this feature. -Změna této hodnoty bude viditelné po dalším spuštění aplikace. +Changes to this value will take effect after restarting the application. Spustit úlohu na pozadí každých x-minut @@ -1980,15 +2025,15 @@ Změna této hodnoty bude viditelné po dalším spuštění aplikace. Nástěnka - Všechno nastavení může být později upraveno v Nastavení + All settings can be changed later in the settings! Ověřit veřejnou IP adresu - - Děkujeme za používání NETworkManager! + + Thank you for using NETworkManager! -Pro zabezpečení přídavných funkcí využívá aplikace služby v intenretu, které nejsou mnou řízené. Žádná data mi nebudou přeposlána +If you enjoy it, please consider supporting its development — whether by leaving a star on GitHub, making a donation, or simply sharing it with others. Your support helps keep the project going and growing. Během spouštění aplikace kontroluje, zda-li není k dispozici novější verze na GitHubu. @@ -2009,14 +2054,14 @@ URL: https://api.ipify.org/ Externí služba - - Navštiv projekt na GitHubu. + + Star/Fork the Project on GitHub. - - Pomáhej s překlady pomocí Transifex. + + Help translate the project on Transifex. - - Spoj se pomocí Twitteru. + + Follow or contact me via X. Připojení @@ -2036,15 +2081,6 @@ URL: https://api.ipify.org/ Zkontroluj nastavení síťového adaptéru (DHCP, pevnou IP) a zda-li je správně připojen k síti. - - Chyba - - - OK - - - Varování - Nelze detekovat IP adresu síťové brány! @@ -2096,8 +2132,8 @@ URL: https://api.ipify.org/ Use custom IPv4 address API - - URL webové služby dosažitelné přes http nebo https, která jako odpověď vrátí IP adresu. + + URL to a web service that can be reached via http or https and returns an IPv4 address e.g., "xx.xx.xx.xx" as response. Nelze přečíst veřejnou IP adresu z „{0}“! Použijte jinou službu nebo vyberte výchozí... @@ -2171,6 +2207,12 @@ URL: https://api.ipify.org/ Vizuální styly + + View only + + + Block keyboard and mouse input to the remote session + Vzdálený zvuk @@ -2216,24 +2258,39 @@ URL: https://api.ipify.org/ Programy + + Private + + + Public + Vybraný vlastní příkaz bude trvale odstraněn. - - K dispozici jsou následující proměnné: - -$$ipaddress$$ --> IP adresa -$$hostname$$ --> Název hosta - Restart - - Nelze přeložit IP adresu na název hosta! + + Could not resolve ip address for hostname! Ctrl+Alt+Del + + Task Manager (Ctrl+Shift+Esc) + + + Lock (Win+L) + + + Show Desktop (Win+D) + + + Explorer (Win+E) + + + Run dialog (Win+R) + Klávesové zkratky @@ -2270,8 +2327,8 @@ $$hostname$$ --> Název hosta Zobrazit okno stavu při změně stavu sítě - - Čas v sec, jak dlouho má být okno zobrazeno + + Time in seconds how long the status window is shown WiFi @@ -2297,12 +2354,18 @@ $$hostname$$ --> Název hosta Kanál + + Channel width + 2,4 Ghz 5 GHz + + 2.4 & 5 GHz + Síla signálu @@ -2342,11 +2405,8 @@ $$hostname$$ --> Název hosta Časový limit (s) - - Nahlásit chybu nebo vytvořit návrh funkce. - - - Nahlásit chybu na GitHub nebo vytvořit návrh funkce. + + Report an issue or create a feature request. Beacon interval @@ -2387,12 +2447,39 @@ $$hostname$$ --> Název hosta Nelze přeložit IP adresu pro: "{0}" + + Notification + + + Show notification popup on status change + + + Play sound on status change + + + Success threshold + + + Number of consecutive successful pings required before a "Host is up" notification is shown. Higher values reduce noise from flapping hosts. + + + Failure threshold + + + Number of consecutive failed pings (timeouts) required before a "Host is down" notification is shown. Higher values reduce noise from flapping hosts. + + + Display duration (seconds) + + + Host is up + + + Host is down + Aplikace bude znovu spuštena - - Použít jinou složku - Soubor nelze exportovat! Prohlédní chybová hlášení: "{0}" @@ -2408,8 +2495,8 @@ $$hostname$$ --> Název hosta Je zašifrováno - - Otevřít dokumentaci na GitHubu. + + Open the documentation. Klient 1 @@ -2438,9 +2525,6 @@ $$hostname$$ --> Název hosta Odstranit soubor profilů - - Vybraný profil bude trvale odstraněn. - Všechny profily v tomto souboru profilů budou nenávratně odstraněny! @@ -2463,7 +2547,7 @@ $$hostname$$ --> Název hosta Spustit znovu "Jako administrátor" - Aby bylo možné analyzovat síťové pakety, musí být aplikace spuštěna se zvýšenými oprávněními! + Analysing network packets requires elevated rights! Zachytit @@ -2492,13 +2576,13 @@ $$hostname$$ --> Název hosta Discovery protokol - + CDP - + LLDP - + LLDP / CDP @@ -2531,8 +2615,8 @@ $$hostname$$ --> Název hosta K použití této funkce je vyžadován Microsoft.Windows.SDK.Contracts, ale v tomto systému není k dispozici (např. Windows Server). - - Tabulka ARP + + Neighbor Table Připojení @@ -2669,134 +2753,47 @@ $$hostname$$ --> Název hosta Žlutý - - Ocelový - - - Obecné - - - Prohledávání DNS - - - Hlavičky HTTP - - - Skener IP adres - - - Síťový adapter - - - Ping - - - Monitor pingů - - - Skener portů - - - PowerShell - - - PuTTY - - - Vzdálená plocha - - - TigerVNC - - - Traceroute - - - Wake On LAN - - - Web konzola + + Steel - - Whois + + General - - Aplikace + + Applications - - Obecné + + General - - Vzhled + + Appearance - + Autostart - - Hlavní obrazovka - - - Prohledávání DNS - - - Obecné - - - Klávesové zkratky - - - Hlavičky HTTP - - - Skener IP adres - - - Jazyk - - - Monitor pingů - - - Skener portů - - - PowerShell - - - Profily - - - PuTTY - - - Vzdálená plocha - - - Nastavení - - - SNMP + + General - - Stav + + HotKeys - - TigerVNC + + Language - - Traceroute + + Profiles - - Aktualizace + + Settings - - Wako On LAN + + Status - - Whois + + Update - - Okno + + Window Povolit protokolování @@ -2826,7 +2823,7 @@ $$hostname$$ --> Název hosta Protokol SSH - Nezpracovaný protokol SSH + SSH and Raw log Vlož správný název souboru! @@ -2888,13 +2885,17 @@ $$hostname$$ --> Název hosta SSID - - Profil se nepodařilo načíst! + + Profile file could not be loaded! - - If this happened after an update, you may need to migrate the profiles to a newer version. When you click "Migrate", a PowerShell window opens with the migration script. Check the path and press Enter. + + The profile file could not be loaded and may be corrupted. You can try to restore the file from a backup or delete it. -Otherwise, the profile may be corrupted and you want to report the issue on GitHub. +If this happens unexpectedly or after an update, please report the error on GitHub. + + +Error message: +"{0}" Upravit skupinu... @@ -2932,25 +2933,12 @@ Otherwise, the profile may be corrupted and you want to report the issue on GitH Sloučit - - Cílová složka již obsahuje soubory. Pokud kliknete na Sloučit, aktuální profily se zkopírují do složky. - - - Overwrite profiles in destination folder? - -"Overwrite" will copy the profile files to the destination folder and overwrite existing profile files. -"Merge" will copy the profile files to the destination folder, but won't overwrite exitsting profile files. -"Use other folder" will use the existing profile files in the destination folder. - Použít jiné Přesunout - - Soubory profilů přesunuty do cílové složky. - Poslední sken v {0} @@ -2979,7 +2967,7 @@ Otherwise, the profile may be corrupted and you want to report the issue on GitH C # knihovna se postará o výpočet složité sítě, IP, IPv4, IPv6, síťové masky, CIDR, podsítě, podsíťování, supernetu a supernetování pro vývojáře .NET. - Jednoduché, flexibilní, interaktivní & výkonné grafy, mapy a měřidla pro .Net + Beautiful, interactive charts, maps, and gauges. Kolekce indikátorů načítání pro WPF @@ -3008,8 +2996,11 @@ Otherwise, the profile may be corrupted and you want to report the issue on GitH Seznam domén nejvyšší úrovně z iana.org, který se používá k dotazování Whois serverů TLD z whois.iana.org přes port 43 + + GeoJSON conversion of Natural Earth vector map data (CC0-1.0). + - Sanitizovaná data IEEE OUI z linuxnet.ca. + OUI data from ieee.org. Název služby a číslo portu transportního protokolu z registru iana.org. @@ -3060,10 +3051,10 @@ Pověření v profilu budou bezpečnější. Enter a valid IPv6 address! - Public accessible IPv4 address. + Public IPv4 address reachable via ICMP. - Public accessible IPv6 address. + Public IPv6 address reachable via ICMP. Public IPv4 address @@ -3140,7 +3131,1366 @@ Pověření v profilu budou bezpečnější. Selected profiles will be deleted permanently. - - Unlock the profile file to add, change or delete a profile! + + Use custom themes + + + Custom themes + + + Reset settings? + + + Settings reset! + + + Instance ID + + + Local connection + + + Local interface + + + log4net is a tool to help the programmer output log statements to a variety of output targets. + + + Enabled + + + Region + + + Profiles and regions to synchronize + + + Default profile + + + Default region + + + Group name cannot start with "{0}"! + + + Check for pre-releases + + + Synchronization is disabled! + + + Command + + + Apply theme to PowerShell console + + + The color of the PowerShell console can be changed to the application theme under Settings > General > Appearance + + + If you enable this option, the default PowerShell console settings in the registry under HKCU:\Console are overridden so that the PowerShell console window matches the application theme. This is a global system setting that may affect the appearance of the normal PowerShell window. + +Only the PowerShell consoles configured in the PowerShell settings are modified. Both Windows PowerShell and PWSH (PowerShell 7 and higher) are supported. + +Click in the upper right corner on the help / documentation button (left of the minimize button) or navigate to https://borntoberoot.net/NETworkManager/Documentation/Settings/Appearance for more details. Here are the values documented which will be adjusted. + +If the option is disabled again, the values are no longer modified. However, the original values are NOT restored. + + + Input cannot end with a ";"! + + + Input does not contain any text! + + + Bit Calculator + + + Bit Calculator + + + Notation + + + Input + + + Unit + + + Bits + + + Gigabits + + + Gigabytes + + + Kilobits + + + Kilobytes + + + Megabits + + + Megabytes + + + Petabits + + + Petabytes + + + Terabits + + + Terabytes + + + Enter a number and select a unit to calculate the units... + + + Network + + + Proxy + + + Resolve IP address for this host (IPv4 is preferred) + + + A valid path to PowerShell should end with "pwsh.exe" or "powershell.exe"! + + + A valid path to PuTTY should end with "PuTTY.exe"! + + + A valid path to TigerVNC should end with "vncviewer-*.exe" or "vncviewer64-*.exe"! + + + SNTP Lookup + + + Move a .NET Framework/.NET Core app runtime components and dependencies into a sub-directory and make it beauty. + + + Add a tab to perform a SNTP lookup... + + + SNTP server(s) + + + URL to a web service that can be reached via http or https and returns an IPv6 address e.g., "xxxx:xx:xxx::xx" as response. + + + IP endpoint + + + Local end time + + + Local start time + + + Network time + + + Offset + + + Round trip delay + + + Server + + + SNTP Lookup + + + Add SNTP server + + + Delete SNTP server + + + The selected SNTP server will be deleted permanently. + + + Edit SNTP server + + + An SNTP server with this name already exists! + + + Enter a valid hostname (e.g., "server-01" or "example.com") or a valid IP address (e.g., 192.168.178.1)! + + + Server(s) + + + Enter master password to unlock the profile file: + + + Unlock profile file + + + Timed out + + + Hostkey + + + The settings will be reset and the application will be restarted afterwards! + + + Nastavení vynulováno + + + Ping status + + + ThreadPool additional min. threads + + + This setting specifies the minimum number of threads that will be created from the application's ThreadPool on demand. This can improve the performance for example of the IP scanner or port scanner. + +The value is added to the default min. threads (number of CPU threads). The value 0 leaves the default settings. If the value is higher than the default max. threads of the ThreadPool, this value is used. + +If the value is too high, performance problems may occur. + +Changes to this value will take effect after the application is restarted. Whether the value was set successfully can be seen in the log file under %LocalAppData%\NETworkManager\NETworkManager.log + + + These settings only change the maximum number of concurrently executed threads per host/port scan. Go to Settings > General > General to adjust the (min) threads of the application. + + + Port status + + + Ping details + + + No open ports found! + + + Port scan is disabled! + + + Scan ports + + + Could not find the application "{0}". Maybe the application was hidden in the settings? + + + Status window + + + Show address bar + + + Enabling this setting is not recommended. Multiple instances of the application share the same settings and profile files. The last instance to be closed may overwrite changes made by other instances. + + + Bypass for local addresses + + + Enable gateway server + + + Logon method + + + Gateway server + + + Server name + + + Share Gateway credentials with remote computer + + + Allow me to select later + + + Smart card or Windows Hello for Business + + + Ask for password (NTLM) + + + Use gateway credentials + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server is temporarily unavailable. Try reconnecting later or contact your network administrator for assistance. + + + Your computer can't connect to the remote computer due to one of the following reasons: 1) The requested Remote Desktop Gateway server address and the server SSL certificate subject name do not match. 2) The certificate is expired or revoked. 3) The certificate root authority does not trust the certificate. Contact your network administrator for assistance. + + + This computer can't verify the identity of the RD Gateway "". It's not safe to connect to servers that can't be identified. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server address requested and the certificate subject name do not match. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server's certificate has expired or has been revoked. Contact your network administrator for assistance. + + + An error occurred while sending data to the Remote Desktop Gateway server. The server is temporarily unavailable or a network connection is down. Try again later, or contact your network administrator for assistance. + + + An error occurred while receiving data from the Remote Desktop Gateway server. Either the server is temporarily unavailable or a network connection is down. Try again later, or contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server address is unreachable or incorrect. Type a valid Remote Desktop Gateway server address. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server is running low on server resources and is temporarily unavailable. Try reconnecting later or contact your network administrator for assistance. + + + The Remote Desktop Gateway server has ended the connection. Try reconnecting later or contact your network administrator for assistance. + + + The Remote Desktop Gateway server administrator has ended the connection. Try reconnecting later or contact your network administrator for assistance. + + + Remote Desktop can't connect to the remote computer "" for one of these reasons: 1) Your user account is not listed in the RD Gateway's permission list 2) You might have specified the remote computer in NetBIOS format (for example, computer1), but the RD Gateway is expecting an FQDN or IP address format (for example, computer1.fabrikam.com or 157.60.0.1). Contact your network administrator for assistance. + + + Remote Desktop can't connect to the remote computer "" for one of these reasons: 1) Your user account is not authorized to access the RD Gateway "" 2) Your computer is not authorized to access the RD Gateway "" 3) You are using an incompatible authentication method (for example, the RD Gateway might be expecting a smart card but you provided a password) Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because your network administrator has restricted access to this RD Gateway server. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the web proxy server requires authentication. To allow unauthenticated traffic to an RD Gateway server through your web proxy server, contact your network administrator. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server reached its maximum allowed connections. Try reconnecting later or contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server does not support the request. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the client does not support one of the Remote Desktop Gateway's capabilities. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server and this computer are incompatible. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because no certificate was configured to use at the Remote Desktop Gateway server. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the RD Gateway server that you are trying to connect to is not allowed by your computer administrator. If you are the administrator, add this Remote Desktop Gateway server name to the trusted Remote Desktop Gateway server list on your computer and then try connecting again. + + + Your computer can't connect to the remote computer because your computer or device did not meet the Network Access Protection requirements set by your network administrator, for one of the following reasons: 1) The Remote Desktop Gateway server name and the server's public key certificate subject name do not match. 2) The certificate has expired or has been revoked. 3) The certificate root authority does not trust the certificate. 4) The certificate key extension does not support encryption. 5) Your computer cannot verify the certificate revocation list. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because a user name and password are required to authenticate to the Remote Desktop Gateway server instead of smart card credentials. + + + Your computer can't connect to the remote computer because smart card credentials are required to authenticate to the Remote Desktop Gateway server instead of a user name and password. + + + Your computer can't connect to the remote computer because an invalid cookie was sent to the Remote Desktop Gateway server. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the cookie was rejected by the Remote Desktop Gateway server. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server is expecting an authentication method different from the one attempted. Contact your network administrator for assistance. + + + The RD Gateway connection ended because periodic user authentication failed. Try reconnecting with a correct user name and password. If the reconnection fails, contact your network administrator for further assistance. + + + The RD Gateway connection ended because periodic user authorization failed. Try reconnecting with a correct user name and password. If the reconnection fails, contact your network administrator for further assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway and the remote computer are unable to exchange policies. This could happen due to one of the following reasons: 1. The remote computer is not capable of exchanging policies with the Remote Desktop Gateway. 2. The remote computer's configuration does not permit a new connection. 3. The connection between the Remote Desktop Gateway and the remote computer ended. Contact your network administrator for assistance. + + + The RD Gateway connection ended because periodic user authorization failed. Your computer or device didn't pass the Network Access Protection (NAP) requirements set by your network administrator. Contact your network administrator for assistance. + + + Connected + + + Error while scanning WiFi adapter "{0}" with error: "{1}" + + + Connect... + + + {0} disconnected! + + + Connect to {0} + + + WPS + + + Connect automatically + + + Pre-shared key + + + Connecting to {0}... + + + Could not connect to {0} ({1})! + + + Successfully connected to {0}! + + + Access to the network has been revoked + + + Invalid credentials + + + Network not available + + + Successful + + + Connection attempt timed out + + + -/- + + + Authentication protocol is not supported! + + + Checking WPS... + + + Open OID profiles... + + + MIB + + + OID profiles + + + Select OID profile + + + Add OID profile + + + Delete OID profile + + + The selected OID profile will be deleted permanently. + + + Edit OID profile + + + Enter password... + + + Add tab + + + (from profile) + + + New subnet mask + + + Add server + + + SNTP server + + + The settings on this page contain errors. Correct them to be able to save. + + + SSH hostkey to use for the connection (e.g., "71:b8:f2:6e..."). Only available if the mode is "SSH". + + + Full path to the private key file (e.g., "C:\Users\BornToBeRoot\SSH\private_key.ppk"). Only available if the mode is "SSH". + + + Username that will be passed into the PuTTY session. Only available if the mode is "SSH", "Telnet" or "Rlogin". + + + ASN + + + AS Name + + + City + + + Continent + + + Country + + + Currency + + + District + + + DNS resolver + + + EDNS + + + Geolocation + + + Hosting + + + IP geolocation + + + ISP + + + Latitude + + + Longitude + + + Mobile + + + Organization + + + PTR record + + + Timezone + + + Zip + + + IP Geolocation API - Fast, accurate, reliable + + + Check DNS resolver + + + Check IP geolocation + + + Show map + + + The DNS resolver is determined via ip-api.com. + +URL: https://edns.ip-api.com/ + + + The IP geolocation is determined via ip-api.com. + +URL: http://ip-api.com/ + + + To provide additional features, third party services are used that are not operated by me. You can deselect them below. No data is transferred to me at any time. + + + Checking DNS resolver... + + + Checking IP geolocation... + + + Check your network connection and try again in a few seconds. + + + ip-api.com rate limit reached (too many requests from your network)! +Try again in a few seconds. + + + HTTP status code + + + Steel + + + Rate limit reached! Try again in {0} seconds... + + + General + + + BSSID + + + No reachable hosts found! + + + Application + + + Enable experimental features to test new functions. These are not yet complete, contain bugs, can crash the application and may change again until release. + + + Experimental features + + + Experimental + + + Run command... + + + IP Geolocation + + + Add a tab to query the IP geolocation... + + + Enter a domain to query whois... + + + Enter host to query IP geolocation... + + + Unknown user name. + + + Authentication failure (incorrect password, community or key). + + + The operation was successful without any errors. + + + The response to your request was too large to fit into a single response! + + + The requested OID could not be found! + + + A read-write or write-only object was set to an inconsistent value! + + + The requested OID does not exist and is not writable! + + + An error occurred for which no specific message is available! + + + The requested object is not accessible for modification! + + + The object was set to an incompatible data type! + + + The value assigned to the object exceeds its maximum length! + + + The encoding used for the object is incorrect! + + + The value assigned to the object is not a valid choice! + + + The requested object does not exist and cannot be created! + + + The MIB variable is currently in an inconsistent state and cannot be modified! + + + There are no available system resources to perform the requested operation! + + + An error occurred during the set operation! + + + A set operation failed, and previous changes could not be rolled back! + + + Authentication failed. Please check the community string! + + + The requested object is not writable and cannot be modified! + + + The object's state is inconsistent, preventing the set operation! + + + Close all + + + Expand host view + + + Expand map view + + + Host cannot be set while other hosts are being added. Please wait until the process is complete and try again. + + + No matching commands! + + + Remote hostname + + + Process ID + + + Process path + + + Process name + + + NetBIOS + + + Computer name + + + Error + + + OK + + + Warning + + + Group / domain + + + NetBIOS reachable + + + Scan for NetBIOS + + + NetBIOS scan is disabled! + + + Resolve Hostname is disabled! + + + Resolve MAC address is disabled! + + + Close group + + + Run command... (Ctrl+Shift+P) + + + Profile files + + + Open settings... + + + Expand and open search... + + + Starting with Windows 11 24H2, you’ll need to allow access to the Wi-Fi adapter. + +Open Windows Settings > Privacy & security > Location, enable access for Desktop Apps / NETworkManager, then restart the application. + + + Drag and drop the applications to reorder them. +Right-click for more options. + + + Restore defaults + + + An easy to use drag'n'drop framework for WPF. + + + BSD-3-Clause + + + Set default + + + Ubuntu Server running Docker with Nextcloud and Traefik... + + + Linux servers running in AWS... + + + 6 GHz + + + Support this project with a donation. + + + Otevřít dokumentaci + + + Donate + + + Profile file + + + Hosts File Editor + + + Hosts File Editor + + + Read-only mode. Modifying the hosts file requires elevated rights! + + + Open hosts file + + + Comment + + + Disable + + + Edit entry + + + Edit entry... + + + Enable entry + + + Disable entry + + + Refreshing... + + + Reloaded at {0} + + + Failed to load hosts file: {0} + + + Retrying in {0} seconds... + + + What's new? + + + Changelog + + + Upgraded to {0} + + + This release includes new features, improvements, and bug fixes. Check out the changelog for all the details! + + + Entries + + + The selected entry is permanently deleted: + +{0} {1} {2} + + + Primary DNS server + + + Enter a valid hostname (e.g., "server-01" or "example.com")! Multiple hostnames can be separated with a space. + + + The "hosts" file could not be read! See log file for more details. + + + The "hosts" file could not be written to. See log file for more details. + + + The entry was not found in the "hosts" file! Maybe the file has been modified. + + + A backup of the "hosts" file could not be created! See log file for more details. + + + Show status bar + + + Displays the status bar in the bottom-left of the WebView when hovering over a link. + + + Save credentials + + + Displays a dialog to save credentials after a successful sign-in. + + + Delete browsing data + + + Permanently delete browsing data (history, cookies, cache, credentials, etc.) for the current WebView2 profile. + + + Browsing Data + + + Browsing data successfully deleted! + + + An error occurred while deleting browsing data. Feel free to report this issue on GitHub. + + + production + + + Add tag + + + Apply filter + + + Filter profiles... + + + Filter by tags + + + No tags found! + + + Match + + + Any + + + Add group... + + + Expand all + + + Collapse all + + + Use custom themes to personalize the appearance of the application. You can edit or add theme in the "Program Folder > Themes" directory. For more details, refer to the documentation. + + + Admin (console) session + + + Profile file "{0}" will be deleted permanently. + + + Enable encryption? + + + Do you want to enable profile file encryption to protect sensitive data such as hosts, IP addresses, URLs, and stored credentials? + +You can enable or disable encryption later at any time by right-clicking the profile file to manage encryption settings. +If you click Cancel, the profile file will remain unencrypted. + + + A restart is required to apply changes such as language settings. + + + Could not parse or resolve any of the specified DNS servers. + + + Could not parse "{0}". + + + Maximum number of backups + + + Create daily backup + + + Number of backups that are retained before the oldest one is deleted. + + + This setting is managed by your administrator. + + + Restore default location + + + Restore + + + Restore default location? + + + The default settings location is restored and the application is restarted afterwards. + +You can copy the “settings.json” file from "{0}" to "{1}" to migrate your previous settings, if necessary. The application must be closed for this to prevent the settings from being overwritten. + + + Change location? + + + The settings location is changed and the application is restarted afterwards. + +You can copy the “settings.json” file from "{0}" to "{1}" to migrate your previous settings, if necessary. The application must be closed for this to prevent the settings from being overwritten. + + + Enter a valid folder path! + + + The profiles location is changed and the application is restarted afterwards. + +You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. + + + The default profiles location is restored and the application is restarted afterwards. + +You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. + + + Network connection + + + Network Status + + + Active Directory import failed. + + + Options + + + + Uses your current Windows credentials to read from Active Directory. The account must be allowed to enumerate computer objects under the search base (subtree). + + + Search base (DN) + + + Additional LDAP filter + + + Filter must be a valid LDAP expression starting with '(' and ending with ')'. + + + Search base must be a valid LDAP distinguished name (e.g. DC=example,DC=com). + + + Imported from Active Directory on {0} + + + No computers found for the given search base and filter. + + + Searching Active Directory... + + + If your computer is not joined to the domain, specify the domain controller (hostname or IP) and use custom credentials. + + + Server (optional) + + + Port (optional) + + + Use SSL (LDAPS) + + + Use current Windows credentials + + + Use these credentials + + + Advanced + + + Select all + + + Deselect all + + + Enable for + + + Skip already imported + + + {0} · {1} result(s) + + + {0} profile(s) imported. +{1} duplicate entries skipped. +{2} without a host skipped. + + + Active Directory + + + CSV file + + + CSV file + + + Import profiles from CSV file + + + Imported from CSV file on {0} + + + No entries were found in the CSV file. + + + Expected CSV format — one profile per line: + + + A header row and the delimiter (semicolon, comma or tab) are detected automatically. The description column is optional. Entries without a host cannot be imported. + + + Import results + + + New + + + Imported + + + No host + + + Exclude disabled accounts + + + Import computers from Active Directory + + + Import computers from Active Directory... + + + Import profiles + + + Source + + + Active Directory + + + Profile group + + + Existing or new group name + + + Firewall + + + Firewall rules + + + Windows Firewall settings + + + Direction + + + Inbound + + + Outbound + + + Action + + + Allow + + + Block + + + Network profile + + + Network profiles + + + Interface type + + + Failed to load firewall rules. {0} + + + The selected firewall rule is permanently deleted: + +{0} + + + Any + + + TCP + + + UDP + + + ICMPv4 + + + ICMPv6 + + + HOPOPT + + + GRE + + + IPv6 + + + IPv6-Route + + + IPv6-Frag + + + IPv6-NoNxt + + + IPv6-Opts + + + VRRP + + + PGM + + + L2TP + + + Any + + + Wired + + + Wireless + + + Remote access + + + Read-only mode. Modifying firewall rules requires elevated rights! + + + Inbound + + + Outbound + + + Block + + + Allow + + + Local ports + + + Remote ports + + + Local addresses + + + Remote addresses + + + Enter a valid IP address, subnet (e.g. 10.0.0.0/8), range (e.g. 10.0.0.1-10.0.0.10), or keyword (Any, LocalSubnet, DNS, DHCP, WINS, DefaultGateway, Internet, Intranet, IntranetRemoteAccess, PlayToDevice, CaptivePortal) + + + Add rule + + + Add rule... + + + Edit rule + + + Edit rule... + + + Delete rule + + + Enable rule + + + Disable rule + + + Import profiles... + + + Speed Test + + + Run speed test + + + Fetching metadata... + + + Measuring latency... + + + Measuring download speed... + + + Measuring upload speed... + + + Measure download and upload speeds, latency, and jitter with speed.cloudflare.com. +Cloudflare may log your IP address and network information. See Cloudflare's privacy policy for details. + + + Latency + + + Jitter + + + Speed test service used to measure download speed, upload speed, latency, and jitter. + + + Stop diff --git a/Source/NETworkManager.Localization/Resources/Strings.de-DE.resx b/Source/NETworkManager.Localization/Resources/Strings.de-DE.resx index 7b22b9298a..abc1ba20bc 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.de-DE.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.de-DE.resx @@ -138,8 +138,32 @@ ARP - - ARP-Tabelle + + Neighbor Table + + + Schreibgeschützter Modus. Das Ändern der Tabelle erfordert erhöhte Rechte! + + + Nicht erreichbar + + + Unvollständig + + + Prüfung + + + Verzögerung + + + Veraltet + + + Erreichbar + + + Dauerhaft Authentifizierung @@ -285,12 +309,24 @@ Netzwerkinterface + + Konfiguration angewendet + + + Konfiguration von Netzwerkschnittstellen erfordert erhöhte Rechte! + Neuer Tab + + Weiter + OUI + + Optionen + Überschreiben? @@ -348,9 +384,6 @@ Einstellungen - - Einstellungen wurden zurückgesetzt! - SNMP @@ -444,6 +477,18 @@ Beschreibung + + Platzhalter + + + Pfad zum auszuführenden Programm oder zur ausführbaren Datei. Die folgenden Platzhalter können verwendet werden: + + + Argumente, die an die Datei oder ausführbare Datei übergeben werden. Die folgenden Platzhalter können verwendet werden: + + + Der folgende Platzhalter kann verwendet werden: + DHCP aktiviert @@ -489,6 +534,30 @@ IPv4-Adresse + + IPv4-Adresse hinzugefügt + + + IPv4-Adresse entfernt + + + IPv4-Adresse freigegeben und erneuert + + + IPv4-Adresse freigegeben + + + IPv4-Adresse erneuert + + + IPv6-Adresse freigegeben und erneuert + + + IPv6-Adresse freigegeben + + + IPv6-Adresse erneuert + IPv4-Standardgateway @@ -504,11 +573,23 @@ IPv6-Standardgateway + + Karte + + + (+{0} weitere) + + + Scrollen = Zoomen, Ziehen = Verschieben + + + Unbekannt + Maximum - - Maximale Hops/Router + + Maximale Hops Hauptfenster minimieren anstatt die Anwendung zu schließen @@ -561,9 +642,6 @@ Neustart Erforderlich - - Einige Einstellungen werden erst nach einem Neustart der Anwendung angewendet! - Einstellungen im Anwendungsordner speichern @@ -577,7 +655,7 @@ Zeige die folgende Anwendung beim starten: - Ein leistungsstarkes Tool zum Verwalten von Netzwerken und zur Behebung von Netzwerkproblemen! + Ein leistungsstarkes Open-Source-Tool zur Netzwerkverwaltung und zur Behebung von Netzwerkproblemen! Geschwindigkeit @@ -594,12 +672,9 @@ Statischer IPv4-DNS-Server - + Subnetzmaske - - Subnetzmaske oder CIDR - Threads @@ -621,8 +696,8 @@ Timeout (ms) - - Zeit wie lange gewartet wird zwischen jedem Ping + + Zeit (MS) wie lange gewartet wird zwischen jedem Ping TTL @@ -663,9 +738,6 @@ Füge eine Registerkarte hinzu, um eine Ablaufverfolgung durchzuführen... - - Füge eine Registerkarte hinzu, um die HTTP Headers abzufragen... - DNS-Suffix (primär) zum Hostnamen hinzufügen @@ -691,7 +763,7 @@ Anwenden - Windows Tastenkombinationen anwenden (z.B. ALT+TAB): + Windows-Tastenkombinationen anwenden (z. B. ALT+TAB): Auth @@ -720,6 +792,9 @@ Feststelltaste ist aktiviert! + + Chart Zeit (Sekunden) + Beim Start auf Updates prüfen @@ -771,7 +846,7 @@ Profildateien werden auf der Festplatte mit AES mit einer Schlüsselgröße von 256 Bit und einer Blockgröße von 128 Bit im CBC-Modus verschlüsselt. Der Verschlüsselungsschlüssel wird aus einem Master-Passwort mit Rfc2898DeriveBytes (PBKDF2) mit 1.000.000 Iterationen abgeleitet. Zur Laufzeit werden die Passwörter als SecureString gespeichert, sobald die Profildatei geladen ist. Bei einigen Funktionen muss das Kennwort in einen normalen String konvertiert werden und verbleibt unverschlüsselt im Speicher, bis der Garbage Collector sie aufräumt. -Erstelle zuerst ein Backup der Profildatei bevor du die Verschlüsselung aktivieren! +Erstellen Sie zunächst eine Sicherungskopie Ihrer Profildateien, bevor Sie die Verschlüsselung aktivieren! Benutzerdefiniert @@ -821,9 +896,6 @@ Erstelle zuerst ein Backup der Profildatei bevor du die Verschlüsselung aktivie DNS-Server - - Dokumentation öffnen - Domäne @@ -842,7 +914,7 @@ Erstelle zuerst ein Backup der Profildatei bevor du die Verschlüsselung aktivie Endzeit - + Geben Sie ein Subnetz ein, um es zu berechnen... @@ -866,9 +938,6 @@ Erstelle zuerst ein Backup der Profildatei bevor du die Verschlüsselung aktivie Feste Bildschirmgröße: - - Star/Fork das Projekt auf GitHub - Gefunden @@ -969,11 +1038,14 @@ Erstelle eins... OID + + Nur CSV-Dateien sind erlaubt! + Nur bei Vollbild anwenden - Auf dem Remote-Computer + Auf dem Remotecomputer Auf diesem Computer @@ -993,12 +1065,6 @@ Erstelle eins... überschreiben - - Einstellungen im Zielordner überschreiben? - -Mit "Überschreiben" wird die Datei im Zielordner überschrieben. -"Andere verwenden" verwendet die vorhandene Einstellungsdatei im Zielordner und startet die Anwendung neu. - Passwort @@ -1029,9 +1095,6 @@ Mit "Überschreiben" wird die Datei im Zielordner überschrieben. PuTTY-Prozess wurde beendet! - - PuTTY-Profil - Anfragen @@ -1098,42 +1161,24 @@ Mit "Überschreiben" wird die Datei im Zielordner überschrieben. Wählen Sie eine Bildschirmauflösung - - Die gewählten Einstellungen werden überschrieben! - - - Die ausgewählten Einstellungen werden zurückgesetzt. - - - Wählen Sie die Einstellungen aus, die Sie exportieren möchten: - - - Wählen Sie die Einstellungen aus, die Sie importieren möchten: - - Dadurch werden alle Einstellungen zurückgesetzt! + Hierdurch werden alle Einstellungen zurückgesetzt! Seriell - Serielle Schnittstelle + Serial line Dienst - Die gefundene Einstellungsdatei ist beschädigt oder mit dieser Version nicht kompatibel. Alle Einstellungen wurden zurückgesetzt! -(Profile sind nicht betroffen!) - - - Einstellungen erfolgreich exportiert! - - - Einstellungen erfolgreich importiert! - - - Einstellungen erfolgreich zurückgesetzt! + Die gefundene Einstellungsdatei war beschädigt oder ist mit dieser Version nicht kompatibel! Sie können dieses Problem auf GitHub melden. + +Es wurde ein Backup der Einstellungsdatei im Einstellungsordner erstellt und die Einstellungen wurden zurückgesetzt. + +Profildateien sind nicht betroffen! Geschlossene Ports anzeigen @@ -1144,8 +1189,8 @@ Mit "Überschreiben" wird die Datei im Zielordner überschrieben. Nur die häufigsten Abfragetypen anzeigen - - Zeige Scan-Ergebnis für alle IP-Adressen + + Nicht erreichbare IP-Adressen und Ports anzeigen Statistiken anzeigen @@ -1187,10 +1232,10 @@ Mit "Überschreiben" wird die Datei im Zielordner überschrieben. Der Vorgang kann einige Zeit und Ressourcen in Anspruch nehmen (CPU / RAM). - Der Speicherpfad ist hiervon nicht betroffen + Der Speicherort der Einstellungen ist davon nicht betroffen! - Zeitüberschreitung bei SNMP-Abfrage. + Zeitüberschreitung bei SNMP-Abfrage. Der Host ist möglicherweise nicht erreichbar oder die Community / das Passwort ist falsch. Timeout beim Abfragen des DNS-Servers mit der IP-Adresse "{0}"! @@ -1204,7 +1249,7 @@ Mit "Überschreiben" wird die Datei im Zielordner überschrieben. Unbekannter Fehler! - + Untray / Fenster in den Vordergrund bringen @@ -1309,6 +1354,9 @@ Mit "Überschreiben" wird die Datei im Zielordner überschrieben. DNS-Cache leeren + + DNS-Cache geleert + Entschlüsseln und laden Sie Ihre Anmeldedaten, um sie auszuwählen. @@ -1366,12 +1414,12 @@ Mit "Überschreiben" wird die Datei im Zielordner überschrieben. Überschreiben + + Parsen + Einfügen - - C:\Program Files\PuTTY\putty.exe - Wiederverbinden @@ -1415,7 +1463,7 @@ Mit "Überschreiben" wird die Datei im Zielordner überschrieben. Geben Sie eine gültige IPv4-Adresse ein! - Geben Sie eine gültige MAC-Addresse (z.B. 00:F1:23:AB:F2:35) ein! + Geben Sie eine gültige MAC-Adresse ein (z. B. 00:F1:23:AB:F2:35)! Geben Sie einen gültigen Port ein (1 - 65535)! @@ -1424,7 +1472,7 @@ Mit "Überschreiben" wird die Datei im Zielordner überschrieben. Geben Sie eine gültige Subnetzmaske ein (z.B. 255.255.255.0)! - Geben Sie eine gültige Subnetzmaske oder CIDR ein (z.B. 255.255.255.0 oder /24)! + Geben Sie eine gültige Subnetzmaske oder CIDR ein (z. B. 255.255.255.0 oder /24)! Feld darf nicht leer sein! @@ -1499,7 +1547,7 @@ Mit "Überschreiben" wird die Datei im Zielordner überschrieben. Geben Sie ein gültiges Subnetz ein (z.B. 192.168.178.133/26)! - Geben Sie eine gültige Webseite ein (z.B. https://example.com/index.html) + Geben Sie eine gültige Website ein (z. B. https://example.com/index.html) Grün @@ -1534,6 +1582,9 @@ Mit "Überschreiben" wird die Datei im Zielordner überschrieben. Kalk + + Live + Magenta @@ -1762,9 +1813,6 @@ Mit "Überschreiben" wird die Datei im Zielordner überschrieben. Gelb - - Geben Sie einen gültigen Wert ein zwischen 25 und 100! - Ein Profil mit diesem Namen existiert bereits! @@ -1790,10 +1838,13 @@ Mit "Überschreiben" wird die Datei im Zielordner überschrieben. Whois - Füge eine Registerkarte hinzu, um eine Whois abfrage durchzuführen... + Füge eine Registerkarte hinzu, um eine Whois-Abfrage durchzuführen... - Geben Sie eine gültige Domain ein (z.B. "example.com")! + Geben Sie eine gültige Domäne ein (z. B. "example.com")! + + + Geben Sie einen gültigen Windows-Benutzernamen ein (z. B. „user“, „DOMAIN\user“ oder „user@domain.com“)! Whois-Server nicht gefunden für die Domain: "{0}" @@ -1837,9 +1888,6 @@ Mit "Überschreiben" wird die Datei im Zielordner überschrieben. Konfiguriere den Pfad zu TigerVNC in den Einstellungen... - - TigerVNC-Speicherort... - TigerVNC-Prozess wurde beendet! @@ -1903,11 +1951,11 @@ Mit "Überschreiben" wird die Datei im Zielordner überschrieben. IPv4-Adresse hinzufügen - - Host Threads + + Max. gleichzeitige Host-Threads - - Port Threads + + Max. gleichzeitige Port-Threads PowerShell @@ -1924,9 +1972,6 @@ Mit "Überschreiben" wird die Datei im Zielordner überschrieben. Remote-Konsole - - PowerShell-Speicherort... - Dateipfad @@ -1964,11 +2009,11 @@ Mit "Überschreiben" wird die Datei im Zielordner überschrieben. Hintergrundjob - Der Hintergrundjob speichert alle x-Minuten die Einstellungen, Profile und Anmeldeinformationen. + Der Hintergrundjob speichert Einstellungen und Profile alle x-Minuten. -Wert 0 deaktiviert dieses Feature. +Der Wert 0 deaktiviert diese Funktion. -Wenn der Wert geändert wird, muss die Anwendung muss neu gestartet werden, damit dieser angewandt werden. +Änderungen an diesem Wert werden erst nach einem Neustart der Anwendung wirksam. Hintergrundjob alle x-Minuten ausführen @@ -1980,15 +2025,15 @@ Wenn der Wert geändert wird, muss die Anwendung muss neu gestartet werden, dami Dashboard - Alle Einstellungen können später in den Einstellungen geändert werden + Alle Einstellungen können später in den Einstellungen geändert werden! Überprüfen der öffentlichen IP-Adresse - - Vielen Dank, dass Sie NETworkManager verwenden! + + Vielen Dank, dass du NETworkManager verwendest! -Um zusätzliche Funktionen bereitzustellen, verwendet die Anwendung Dienste im Internet, die nicht von mir betrieben werden. Es werden zu keinem Zeitpunkt Daten an mich gesendet. +Wenn dir das Tool gefällt, kannst du die Entwicklung unterstützen – durch einen Stern auf GitHub, eine Spende oder indem du es mit anderen teilst. Deine Unterstützung hilft dabei, das Projekt am Leben zu halten und weiterzuentwickeln. Beim Programmstart wird im Hintergrund geprüft, ob eine neue Programmversion auf GitHub verfügbar ist. @@ -1998,7 +2043,7 @@ URL: https://api.github.com/ Die öffentliche IP-Adresse wird über ipify.org ermittelt. -URL: https://api.ipify.org/ +URL: https://api.ipify.org und https://api6.ipify.org Privatsphäre @@ -2009,14 +2054,14 @@ URL: https://api.ipify.org/ Externe Dienste - - Star/Fork das Projekt auf GitHub. + + Star/Forke das Projekt auf GitHub. - - Helfen Sie bei der Übersetzung des Projects auf Transifex. + + Hilf dabei, das Projekt auf Transifex zu übersetzen. - - Kontakt über Twitter. + + Folge mir oder kontaktiere mich über X. Verbindung @@ -2036,15 +2081,6 @@ URL: https://api.ipify.org/ Überprüfen Sie die Konfiguration Ihres Netzwerkadapters (DHCP, statische IP) und ob Sie mit dem Netzwerk verbunden sind. - - Fehler - - - OK - - - Warnung - Die IP-Adresse des Gateways konnte nicht ermittelt werden! @@ -2097,8 +2133,8 @@ ist deaktiviert! Benutzerdefinierte IPv4-Adressen-API verwenden - - URL zu einem Webdienst, der über http oder https erreichbar ist und eine IP-Adresse als Antwort zurückgibt. + + URL zu einem Webdienst, der über http oder https erreichbar ist und eine IPv4-Adresse, z. B. "xx.xx.xx.xx", als Antwort zurückgibt. Öffentliche IP-Adresse von "{0}" konnte nicht geparsed! Versuchen Sie es mit einem anderen Dienst oder verwenden Sie die Standardeinstellung ... @@ -2172,6 +2208,12 @@ ist deaktiviert! Visuelle Stile + + Nur anzeigen + + + Tastatur- und Mauseingaben für die Remote-Sitzung blockieren + Remoteaudio @@ -2217,24 +2259,39 @@ ist deaktiviert! Programm + + Privat + + + Öffentlich + Der ausgewählte benutzerdefinierte Befehl wird unwiederbringlich gelöscht. - - Die folgenden Variablen sind verfügbar: - -$$ipaddress$$ --> IP-Adresse -$$hostname$$ --> Hostname - Neustart - + IP-Adresse für Hostname konnte nicht aufgelöst werden! Strg+Alt+Entf + + Task-Manager (Strg+Umschalt+Esc) + + + Sperren (Win+L) + + + Desktop anzeigen (Win+D) + + + Explorer (Win+E) + + + Ausführen-Dialog (Win+R) + Tastenkombinationen @@ -2271,8 +2328,8 @@ $$hostname$$ --> Hostname Statusfenster bei Netzwerkwechsel anzeigen - - Zeit in Sekunden, wie lange das Fenster angezeigt werden soll + + Zeit in Sekunden, wie lange das Statusfenster angezeigt wird WLAN @@ -2298,12 +2355,18 @@ $$hostname$$ --> Hostname Kanal + + Kanalbreite + 2.4 GHz 5 GHz + + 2.4 & 5 GHz + Signalstärke @@ -2343,11 +2406,8 @@ $$hostname$$ --> Hostname Timeout (s) - - Problem melden oder einen Feature-Request erstellen - - - Ein Problem melden oder eine Feature-Anfrage erstellen. + + Melde ein Problem oder erstelle einen Feature-Request. Beacon-Intervall @@ -2388,12 +2448,39 @@ $$hostname$$ --> Hostname Konnte die IP-Adresse nicht auflösen für: "{0}" + + Benachrichtigung + + + Bei Statusänderung ein Benachrichtigungsfenster anzeigen + + + Ton bei Statusänderung abspielen + + + Erfolgsschwelle + + + Anzahl aufeinanderfolgender erfolgreicher Pings, die erforderlich sind, bevor eine "Host ist erreichbar"-Benachrichtigung angezeigt wird. Höhere Werte reduzieren Rauschen durch flappernde Hosts. + + + Fehlerschwelle + + + Anzahl aufeinanderfolgender fehlgeschlagener Pings (Timeouts), die erforderlich sind, bevor eine "Host ist nicht erreichbar"-Benachrichtigung angezeigt wird. Höhere Werte reduzieren Rauschen durch flappernde Hosts. + + + Anzeigedauer (Sekunden) + + + Host ist erreichbar + + + Host ist nicht erreichbar + Die Anwendung wird neu gestartet... - - Anderen Ordner verwenden - Datei konnte nicht exportiert werden! Siehe Fehlermeldung: "{0}" @@ -2409,8 +2496,8 @@ $$hostname$$ --> Hostname Ist Verschlüsselt - - Dokumentation auf GitHub öffnen. + + Dokumentation öffnen. Kunde 1 @@ -2439,9 +2526,6 @@ $$hostname$$ --> Hostname Profildatei löschen - - Die ausgewählte Profildatei wird dauerhaft gelöscht. - Alle Profile in dieser Profildatei werden dauerhaft gelöscht! @@ -2464,7 +2548,7 @@ $$hostname$$ --> Hostname Neustart als Administrator - Um Netzwerkpakete analysieren zu können, muss die Anwendung mit erhöhten Rechten gestartet werden! + Analysieren von Netzwerkpaketen erfordert erhöhte Rechte! Aufnehmen @@ -2493,13 +2577,13 @@ $$hostname$$ --> Hostname Discovery Protokoll - + CDP - + LLDP - + LLDP / CDP @@ -2532,8 +2616,8 @@ $$hostname$$ --> Hostname Microsoft.Windows.SDK.Contracts ist für diese Funktion erforderlich, auf diesem System jedoch nicht verfügbar (z. B. unter Windows Server). - - ARP-Tabelle + + Neighbor Table Verbindungen @@ -2670,133 +2754,46 @@ $$hostname$$ --> Hostname Gelb - + Stahl - + Allgemein - - DNS-Lookup - - - HTTP-Headers - - - IP-Scanner - - - Netzwerkinterface - - - Ping - - - Ping-Monitor - - - Port-Scanner - - - PowerShell - - - PuTTY - - - Remote Desktop - - - TigerVNC - - - Traceroute - - - Wake on LAN - - - Web-Konsole - - - Whois - - - Anwendungen + + Anwendung - + Allgemein - + Aussehen - + Autostart - - Dashboard - - - DNS-Lookup - - + Allgemein - + HotKeys - - HTTP-Headers - - - IP-Scanner - - + Sprache - - Ping-Monitor - - - Port-Scanner - - - PowerShell - - + Profile - - PuTTY - - - Remote Desktop - - + Einstellungen - - SNMP - - + Status - - TigerVNC - - - Traceroute - - + Update - - Wake on LAN - - - Whois - - + Fenster @@ -2827,7 +2824,7 @@ $$hostname$$ --> Hostname SSH-Log - SSH und RAW-Log + SSH und Raw-Log Geben Sie einen gültigen Dateinamen ein! @@ -2863,7 +2860,7 @@ $$hostname$$ --> Hostname Port-Profil bearbeiten - Das ausgewählte Port-Profile wird unwiederbringlich gelöscht. + Das ausgewählte Port-Profil wird unwiederbringlich gelöscht. Port-Profil anzeigen @@ -2889,13 +2886,17 @@ $$hostname$$ --> Hostname SSID - - Profil konnte nicht geladen werden! + + Profildatei konnte nicht geladen werden! - - Wenn dies nach einem Update passiert ist, müssen Sie die Profile möglicherweise auf eine neuere Version migrieren. Wenn Sie auf "Migrieren" klicken, öffnet sich ein PowerShell-Fenster mit dem Migrationsskript. Überprüfen Sie den Pfad und drücken Sie die Eingabetaste. + + Die Profildatei konnte nicht geladen werden und ist möglicherweise beschädigt. Sie können versuchen, die Datei aus einer Sicherungskopie wiederherzustellen oder sie zu löschen. -Ansonsten kann das Profil beschädigt sein und Sie können das Problem auf GitHub melden. +Wenn dies unerwartet oder nach einem Update auftritt, melden Sie den Fehler bitte auf GitHub. + + +Fehlermeldung: +"{0}" Gruppe bearbeiten... @@ -2919,7 +2920,7 @@ Ansonsten kann das Profil beschädigt sein und Sie können das Problem auf GitHu Neues Passwort - Master-Kennwort ändern + Masterpasswort ändern Profil entsperren @@ -2933,25 +2934,12 @@ Ansonsten kann das Profil beschädigt sein und Sie können das Problem auf GitHu Zusammenführen - - Der Zielordner enthält bereits Dateien. Wenn Sie auf Zusammenführen klicken, werden die aktuellen Profile in den Ordner kopiert. - - - Profile im Zielordner überschreiben? - -Mit "Überschreiben" werden die Profildateien in den Zielordner kopiert und die vorhandenen Profildateien überschrieben. -"Zusammenführen" kopiert die Profildateien in den Zielordner, überschreibt aber nicht die vorhandenen Profildateien. -Mit "Anderen Ordner verwenden" werden die vorhandenen Profildateien im Zielordner verwendet. - Anderen Verwenden Verschieben - - Die Profildateien werden in den ausgewählten Zielordner verschoben. - Letzter Scan um {0} @@ -2980,7 +2968,7 @@ Mit "Anderen Ordner verwenden" werden die vorhandenen Profildateien im Zielordne Die C#-Bibliothek kümmert sich um komplexe Netzwerk-, IP-, IPv4-, IPv6-, Netzmasken-, CIDR-, Subnetz-, Subnetz-, Supernetz- und Supernetzberechnungen für .NET-Entwickler. - Einfache, flexible, interaktive und leistungsstarke Diagramme, Karten und Messgeräte für .NET + Schöne, interaktive Diagramme, Karten und Messgeräte. Eine Sammlung von Ladeindikatoren für WPF @@ -3007,10 +2995,13 @@ Mit "Anderen Ordner verwenden" werden die vorhandenen Profildateien im Zielordne Eine Sammlung aller Länderflaggen in SVG - Liste der Top-Level-Domains von iana.org, die zur Abfrage von whois-Servern der TLD von whois.iana.org über Port 43 verwendet wird + Liste der Top-Level-Domains von iana.org, die zur Abfrage von Whois-Servern der TLD von whois.iana.org über Port 43 verwendet wird + + + GeoJSON-Konvertierung der Vektorkartendaten von Natural Earth (CC0-1.0). - Bereinigte IEEE OUI-Daten von linuxnet.ca. + OUI-Daten von ieee.org. Service Name and Transport Protocol Port Number Registry von iana.org. @@ -3060,10 +3051,10 @@ Aktivieren Sie die Verschlüsselung der Profildatei in Einstellungen>Profile, Geben Sie eine gültige IPv6-Adresse ein! - Öffentlich verfügbare IPv4-Adresse. + Öffentliche IPv4-Adresse, die über ICMP erreichbar ist. - Öffentlich verfügbare IPv6-Adresse. + Öffentliche IPv6-Adresse, die über ICMP erreichbar ist. Öffentliche IPv4-Adresse @@ -3140,7 +3131,1366 @@ Aktivieren Sie die Verschlüsselung der Profildatei in Einstellungen>Profile, Die ausgewählten Profile werden unwiederbringlich gelöscht. - - Entsperren Sie die Profildatei, um ein Profil hinzuzufügen, zu ändern oder zu löschen! + + Verwende benutzerdefinierte Themes + + + Benutzerdefinierte Themes + + + Einstellungen zurücksetzen? + + + Einstellungen zurückgesetzt! + + + Instanz ID + + + Lokale Verbindung + + + Lokales Interface + + + log4net ist ein Tool, das den Programmierer bei der Ausgabe von Log-Statements an eine Vielzahl von Ausgabezielen unterstützt. + + + Aktiviert + + + Region + + + Zu synchronisierende Profile und Regionen + + + Standard-Profil + + + Standard-Region + + + Der Gruppenname darf nicht mit "{0}" beginnen! + + + Nach Vorabversionen suchen + + + Synchronisation ist deaktiviert! + + + Befehl + + + Thema auf PowerShell-Konsole anwenden + + + Die Farbe der PowerShell-Konsole kann unter Einstellungen > Allgemein > Aussehen an das Anwendungsthema angepasst werden + + + Wenn Sie diese Option aktivieren, werden die Standardeinstellungen für die PowerShell-Konsole in der Registrierung unter HKCU:\Console überschrieben, sodass das PowerShell-Konsolenfenster dem Anwendungsthema entspricht. Dies ist eine globale Systemeinstellung, die sich auf das Aussehen des normalen PowerShell-Fensters auswirken kann. + +Es werden nur die PowerShell-Konsolen geändert, die in den PowerShell-Einstellungen konfiguriert sind. Sowohl Windows PowerShell als auch PWSH (PowerShell 7 und höher) werden unterstützt. + +Klicken Sie in der oberen rechten Ecke auf den Button Hilfe/Dokumentation (links neben dem Minimieren-Button) oder navigieren Sie zu https://borntoberoot.net/NETworkManager/Documentation/Settings/Appearance für weitere Details. Hier sind die Werte dokumentiert, die angepasst werden. + +Wenn die Option wieder deaktiviert wird, werden die Werte nicht mehr verändert. Die ursprünglichen Werte werden jedoch NICHT wiederhergestellt. + + + Eingabe darf nicht mit einem ";" enden! + + + Eingabe enthält keinen Text! + + + Bit Rechner + + + Bit Rechner + + + Notation + + + Eingabe + + + Einheit + + + Bits + + + Gigabits + + + Gigabytes + + + Kilobits + + + Kilobytes + + + Megabits + + + Megabytes + + + Petabits + + + Petabytes + + + Terabits + + + Terabytes + + + Geben Sie eine Zahl ein und wählen Sie eine Einheit, um die Einheiten zu berechnen... + + + Netzwerk + + + Proxy + + + IP-Adresse für diesen Host auflösen (IPv4 wird bevorzugt) + + + Ein gültiger Pfad zu PowerShell sollte mit "pwsh.exe" oder "powershell.exe" enden! + + + Ein gültiger Pfad zu PuTTY sollte mit "PuTTY.exe" enden! + + + Ein gültiger Pfad zu TigerVNC sollte mit "vncviewer-*.exe" oder "vncviewer64-*.exe" enden! + + + SNTP-Lookup + + + Verschieben Sie die Laufzeitkomponenten und Abhängigkeiten einer .NET Framework/.NET Core-Anwendung in ein Unterverzeichnis und machen Sie es schön. + + + Füge eine Registerkarte hinzu, um eine SNTP-Suche durchzuführen... + + + SNTP-Server(s) + + + URL zu einem Webdienst, der über http oder https erreichbar ist und eine IPv6-Adresse als Antwort zurückgibt, z. B. "xxxx:xx:xxx::xx". + + + IP-Endpunkt + + + Lokale Endzeit + + + Lokale Startzeit + + + Netzwerkzeit + + + Offset + + + Round trip delay + + + Server + + + SNTP-Lookup + + + SNTP-Server hinzufügen + + + SNTP-Server löschen + + + Der ausgewählte SNTP-Server wird unwiederbringlich gelöscht. + + + SNTP-Server bearbeiten + + + Ein SNTP-Server mit diesem Namen existiert bereits! + + + Geben Sie einen gültigen Hostnamen (z. B. "server-01" oder "example.com") oder eine gültige IP-Adresse (z. B. 192.168.178.1) ein! + + + Server(s) + + + Geben Sie das Masterpasswort ein, um die Profildatei zu entsperren: + + + Profildatei entsperren + + + Zeitüberschreitung + + + Hostkey + + + Die Einstellungen werden zurückgesetzt und die Anwendung wird anschließend neu gestartet! + + + Einstellungen wurden zurückgesetzt! + + + Ping-Status + + + ThreadPool zusätzliche min. Threads + + + Diese Einstellung legt die Mindestanzahl von Threads fest, die bei Bedarf aus dem ThreadPool der Anwendung erstellt werden. Dies kann die Leistung z.B. des IP-Scanners oder Port-Scanners verbessern. + +Der Wert wird zum Standardwert min. Threads (Anzahl der CPU-Threads) addiert. Der Wert 0 belässt die Standardeinstellungen. Ist der Wert höher als die standardmäßige Anzahl der Threads des ThreadPools, wird dieser Wert verwendet. + +Wenn der Wert zu hoch ist, können Leistungsprobleme auftreten. + +Änderungen an diesem Wert werden erst nach einem Neustart der Anwendung wirksam. Ob der Wert erfolgreich gesetzt wurde, kann in der Protokolldatei unter %LocalAppData%\NETworkManager\NETworkManager.log eingesehen werden + + + Diese Einstellungen ändern nur die maximale Anzahl der gleichzeitig ausgeführten Threads pro Host-/Port-Scan. Gehen Sie zu Einstellungen > Allgemein > Allgemein, um die (minimalen) Threads der Anwendung anzupassen. + + + Port-Status + + + Ping-Details + + + Keine offenen Ports gefunden! + + + Port-Scan ist deaktiviert! + + + Scan Ports + + + Die Anwendung "{0}" konnte nicht gefunden werden. Eventuell wurde die Anwendung in den Einstellungen ausgeblendet? + + + Status-Fenster + + + Adressleiste anzeigen + + + Es wird nicht empfohlen, diese Einstellung zu aktivieren. Mehrere Instanzen der Anwendung teilen sich die gleichen Einstellungen und Profildateien. Die letzte Instanz, die geschlossen wird, kann Änderungen überschreiben, die von anderen Instanzen vorgenommen wurden. + + + Für lokale Adressen umgangen + + + Gatewayserver aktivieren + + + Anmeldemethode + + + Gatewayserver + + + Servername + + + Gateway-Zugangsdaten mit Remotecomputer teilen + + + Auswahl später durchführen + + + Smartcard oder Windows Hello for Business + + + Kennwort anfordern (NTLM) + + + Gateway-Zugangsdaten verwenden + + + Ihr Computer kann keine Verbindung zum Remotecomputer herstellen, da der Remote Desktop Gateway-Server vorübergehend nicht verfügbar ist. Versuchen Sie, die Verbindung später wiederherzustellen, oder wenden Sie sich an Ihren Netzwerkadministrator, um Hilfe zu erhalten. + + + Ihr Computer kann aus einem der folgenden Gründe keine Verbindung mit dem Remotecomputer herstellen: 1) Die angeforderte Remotedesktop-Gateway-Serveradresse und der Betreff des SSL-Zertifikats des Servers stimmen nicht überein. 2) Das Zertifikat ist abgelaufen oder widerrufen. 3) Die Stammzertifizierungsstelle traut dem Zertifikat nicht. Wenden Sie sich an Ihren Netzwerkadministrator, um Hilfe zu erhalten. + + + Dieser Computer kann die Identität des RD-Gateways "" nicht verifizieren. Es ist nicht sicher, eine Verbindung zu Servern herzustellen, die nicht identifiziert werden können. Wenden Sie sich an Ihren Netzwerkadministrator, um Hilfe zu erhalten. + + + Ihr Computer kann keine Verbindung zum Remotecomputer herstellen, weil die angeforderte Remote Desktop Gateway-Serveradresse und der Zertifikatsbetreffsname nicht übereinstimmen. Wenden Sie sich an Ihren Netzwerkadministrator, um Hilfe zu erhalten. + + + Ihr Computer kann keine Verbindung zum Remotecomputer herstellen, weil das Zertifikat des Remotedesktop-Gatewayservers abgelaufen ist oder widerrufen wurde. Wenden Sie sich an Ihren Netzwerkadministrator, um Hilfe zu erhalten. + + + Beim Senden von Daten an den Remotedesktop-Gateway-Server ist ein Fehler aufgetreten. Der Server ist vorübergehend nicht verfügbar oder eine Netzwerkverbindung ist gestört. Versuchen Sie es später noch einmal, oder wenden Sie sich an Ihren Netzwerkadministrator, um Hilfe zu erhalten. + + + Beim Empfang von Daten vom Remotedesktop-Gatewayserver ist ein Fehler aufgetreten. Entweder ist der Server vorübergehend nicht verfügbar oder eine Netzwerkverbindung ist gestört. Versuchen Sie es später noch einmal, oder wenden Sie sich an Ihren Netzwerkadministrator, um Hilfe zu erhalten. + + + Ihr Computer kann keine Verbindung zum Remotecomputer herstellen, weil die Adresse des Remotedesktop-Gatewayservers unerreichbar oder falsch ist. Geben Sie eine gültige Remotedesktop-Gateway-Serveradresse ein. + + + Ihr Computer kann keine Verbindung zum Remotecomputer herstellen, da der Remotedesktop-Gatewayserver nur über geringe Serverressourcen verfügt und vorübergehend nicht verfügbar ist. Versuchen Sie, die Verbindung später wiederherzustellen, oder wenden Sie sich an Ihren Netzwerkadministrator, um Hilfe zu erhalten. + + + Der Remotedesktop-Gatewayserver hat die Verbindung beendet. Versuchen Sie, die Verbindung später wiederherzustellen, oder wenden Sie sich an Ihren Netzwerkadministrator, um Hilfe zu erhalten. + + + Der Remote Desktop Gateway-Serveradministrator hat die Verbindung beendet. Versuchen Sie, die Verbindung später wiederherzustellen, oder wenden Sie sich an Ihren Netzwerkadministrator, um Hilfe zu erhalten. + + + Remotedesktop kann aus einem der folgenden Gründe keine Verbindung mit dem entfernten Computer herstellen "": 1) Ihr Benutzerkonto ist nicht in der Berechtigungsliste des RD-Gateways aufgeführt. 2) Sie haben den Remotecomputer möglicherweise im NetBIOS-Format angegeben (z. B. computer1), aber das RD-Gateway erwartet ein FQDN- oder IP-Adressformat (z. B. computer1.fabrikam.com oder 157.60.0.1). Wenden Sie sich an Ihren Netzwerkadministrator, um Hilfe zu erhalten. + + + Remotedesktop kann aus einem der folgenden Gründe keine Verbindung mit dem entfernten Computer herstellen "": 1) Ihr Benutzerkonto ist nicht für den Zugriff auf den RD-Gateway autorisiert "" 2) Ihr Computer ist nicht für den Zugriff auf den RD-Gateway autorisiert "" 3) Sie verwenden eine inkompatible Authentifizierungsmethode (z. B. erwartet der RD-Gateway eine Smartcard, Sie haben jedoch ein Kennwort angegeben). Wenden Sie sich an Ihren Netzwerkadministrator. + + + Ihr Computer kann keine Verbindung zum Remotecomputer herstellen, weil der Netzwerkadministrator den Zugriff auf diesen RD Gatewayserver eingeschränkt hat. Wenden Sie sich an Ihren Netzwerkadministrator, um Hilfe zu erhalten. + + + Ihr Computer kann keine Verbindung zum Remotecomputer herstellen, da der Web-Proxy-Server eine Authentifizierung erfordert. Wenden Sie sich an Ihren Netzwerkadministrator, um unauthentifizierten Datenverkehr zu einem RD-Gatewayserver über Ihren Webproxyserver zuzulassen. + + + Ihr Computer kann keine Verbindung zum Remotecomputer herstellen, weil der Remotedesktop-Gatewayserver die maximal zulässige Anzahl von Verbindungen erreicht hat. Versuchen Sie, die Verbindung später wieder herzustellen, oder wenden Sie sich an Ihren Netzwerkadministrator. + + + Ihr Computer kann keine Verbindung zum Remotecomputer herstellen, da der Remotedesktop Gatewayserver die Anforderung nicht unterstützt. Wenden Sie sich an Ihren Netzwerkadministrator, um Hilfe zu erhalten. + + + Ihr Computer kann keine Verbindung zum Remotecomputer herstellen, weil der Client eine der Funktionen von Remote Desktop Gateway nicht unterstützt. Wenden Sie sich an Ihren Netzwerkadministrator, um Hilfe zu erhalten. + + + Ihr Computer kann keine Verbindung zum Remotecomputer herstellen, weil der Remotedesktop-Gatewayserver und dieser Computer nicht kompatibel sind. Wenden Sie sich an Ihren Netzwerkadministrator, um Hilfe zu erhalten. + + + Ihr Computer kann keine Verbindung zum Remotecomputer herstellen, da kein Zertifikat für die Verwendung auf dem Remotedesktop-Gatewayserver konfiguriert wurde. Wenden Sie sich an Ihren Netzwerkadministrator, um Hilfe zu erhalten. + + + Ihr Computer kann keine Verbindung zum Remotecomputer herstellen, weil der RD-Gatewayserver, zu dem Sie eine Verbindung herstellen möchten, vom Computeradministrator nicht zugelassen ist. Wenn Sie der Administrator sind, fügen Sie den Namen dieses Remotedesktop-Gatewayservers zur Liste der vertrauenswürdigen Remotedesktop-Gatewayserver auf Ihrem Computer hinzu und versuchen Sie dann erneut, eine Verbindung herzustellen. + + + Ihr Computer kann keine Verbindung zum Remotecomputer herstellen, weil Ihr Computer oder Gerät die vom Netzwerkadministrator festgelegten Anforderungen für den Netzwerkzugriffsschutz aus einem der folgenden Gründe nicht erfüllt: 1) Der Name des Remotedesktop-Gatewayservers und der Betreff des Zertifikats für den öffentlichen Schlüssel des Servers stimmen nicht überein. 2) Das Zertifikat ist abgelaufen oder wurde widerrufen. 3) Die Stammzertifizierungsstelle vertraut dem Zertifikat nicht. 4) Die Schlüsselerweiterung des Zertifikats unterstützt keine Verschlüsselung. 5) Ihr Computer kann die Zertifikatswiderrufsliste nicht verifizieren. Wenden Sie sich an Ihren Netzwerkadministrator, um Hilfe zu erhalten. + + + Ihr Computer kann keine Verbindung zum Remotecomputer herstellen, da für die Authentifizierung beim Remotedesktop-Gatewayserver ein Benutzername und ein Kennwort anstelle von Smartcard-Anmeldeinformationen erforderlich sind. + + + Ihr Computer kann keine Verbindung zum Remotecomputer herstellen, weil für die Authentifizierung beim Remotedesktop-Gatewayserver Smartcard-Anmeldeinformationen anstelle eines Benutzernamens und Kennworts erforderlich sind. + + + Ihr Computer kann keine Verbindung zum Remotecomputer herstellen, da ein ungültiges Cookie an den Remotedesktop-Gatewayderver gesendet wurde. Wenden Sie sich an Ihren Netzwerkadministrator, um Hilfe zu erhalten. + + + Ihr Computer kann keine Verbindung zum Remotecomputer herstellen, da das Cookie vom Remotedesktop-Gatewayserver abgelehnt wurde. Wenden Sie sich an Ihren Netzwerkadministrator, um Hilfe zu erhalten. + + + Ihr Computer kann keine Verbindung zum Remotecomputer herstellen, weil der Remotedesktop-Gatewayserver eine andere Authentifizierungsmethode erwartet als die, die versucht wurde. Wenden Sie sich an Ihren Netzwerkadministrator, um Hilfe zu erhalten. + + + Die RD-Gateway-Verbindung wurde beendet, weil die periodische Benutzerauthentifizierung fehlgeschlagen ist. Versuchen Sie, die Verbindung mit einem korrekten Benutzernamen und Kennwort wiederherzustellen. Wenn die Wiederherstellung der Verbindung fehlschlägt, wenden Sie sich an Ihren Netzwerkadministrator, um weitere Unterstützung zu erhalten. + + + Die RD-Gateway-Verbindung wurde beendet, weil die periodische Benutzerautorisierung fehlgeschlagen ist. Versuchen Sie, die Verbindung mit einem korrekten Benutzernamen und Kennwort wiederherzustellen. Wenn die erneute Verbindung fehlschlägt, wenden Sie sich an Ihren Netzwerkadministrator, um weitere Unterstützung zu erhalten. + + + Ihr Computer kann keine Verbindung mit dem Remotecomputer herstellen, weil Remotedesktop-Gateway und der Remotecomputer keine Richtlinien austauschen können. Dies kann aus einem der folgenden Gründe geschehen: 1. Der Remotecomputer ist nicht in der Lage, Richtlinien mit dem Remotedesktop-Gateway auszutauschen. 2. Die Konfiguration des Remotecomputers lässt eine neue Verbindung nicht zu. 3. Die Verbindung zwischen dem Remotedesktop-Gateway und dem Remotecomputer wurde beendet. Wenden Sie sich an Ihren Netzwerkadministrator, um Hilfe zu erhalten. + + + Die RD-Gateway-Verbindung wurde beendet, weil die periodische Benutzerautorisierung fehlgeschlagen ist. Ihr Computer oder Gerät hat die vom Netzwerkadministrator festgelegten NAP-Anforderungen (Network Access Protection) nicht erfüllt. Wenden Sie sich an Ihren Netzwerkadministrator, um Hilfe zu erhalten. + + + Verbunden + + + Fehler beim Scannen des WiFi-Adapters "{0}" mit Fehler: "{1}" + + + Verbinden... + + + {0} getrennt! + + + Verbinden mit {0} + + + WPS + + + Automatisch verbinden + + + Pre-shared Key + + + Verbinden mit {0}... + + + Konnte keine Verbindung zu {0} ({1}) herstellen! + + + Erfolgreich verbunden mit {0}! + + + Der Zugang zum Netz wurde gesperrt + + + Ungültige Anmeldeinformationen + + + Netzwerk nicht verfügbar + + + Erfolgreich + + + Zeitüberschreitung beim Verbindungsversuch + + + -/- + + + Das Authentifizierungsprotokoll wird nicht unterstützt! + + + Prüfe WPS... + + + OID-Profile öffnen... + + + MIB + + + OID-Profile + + + OID-Profil auswählen + + + OID-Profil hinzufügen + + + OID-Profil löschen + + + Das ausgewählte OID-Profil wird unwiederbringlich gelöscht. + + + OID-Profil bearbeiten + + + Passwort eingeben... + + + Tab hinzufügen + + + (aus Profil) + + + Neue Subnetzmaske + + + Server hinzufügen + + + SNTP-Server + + + Die Einstellungen auf dieser Seite enthalten Fehler. Korrigieren Sie diese, um speichern zu können. + + + SSH-Hostkey, der für die Verbindung verwendet werden soll (z. B. "71:b8:f2:6e..."). Nur verfügbar, wenn der Modus "SSH" ist. + + + Vollständiger Pfad zur privaten Schlüsseldatei (z. B. „C:\Users\BornToBeRoot\SSH\private_key.ppk“). Nur verfügbar, wenn der Modus "SSH" ist. + + + Benutzername, der an die PuTTY-Sitzung übergeben wird. Nur verfügbar, wenn der Modus "SSH", "Telnet" oder "Rlogin" ist. + + + ASN + + + AS-Name + + + Stadt + + + Kontinent + + + Land + + + Währung + + + Landkreis + + + DNS-Resolver + + + EDNS + + + Geolokation + + + Hosting + + + IP-Geolokation + + + ISP + + + Breitengrad + + + Längengrad + + + Mobil + + + Organisation + + + PTR-Record + + + Zeitzone + + + Postleitzahl + + + IP Geolocation API - Fast, accurate, reliable + + + Prüfe DNS-Resolver + + + Prüfe IP-Geolokation + + + Karte anzeigen + + + Der DNS-Resolver wird über ip-api.com ermittelt. + +URL: https://edns.ip-api.com/ + + + Die IP-Geolokation wird über ip-api.com ermittelt. + +URL: http://ip-api.com/ + + + Zur Bereitstellung zusätzlicher Funktionen werden Dienste von Drittanbietern genutzt, die nicht von mir betrieben werden. Sie können diese unten abwählen. Es werden zu keinem Zeitpunkt Daten an mich übermittelt. + + + Prüfe DNS-Resolver... + + + Prüfe IP-Geolokation... + + + Überprüfen Sie Ihre Netzwerkverbindung und versuchen Sie es in einigen Sekunden erneut. + + + ip-api.com Ratelimit erreicht (zu viele Anfragen aus Ihrem Netzwerk)! +Versuchen Sie es in einigen Sekunden erneut. + + + HTTP-Statuscode + + + Stahl + + + Rate Limit erreicht! Versuchen Sie es in {0} Sekunden erneut... + + + Allgemein + + + BSSID + + + Keine erreichbaren Hosts gefunden! + + + Anwendung + + + Aktivieren Sie experimentelle Features, um neue Funktionen zu testen. Diese sind noch nicht vollständig, enthalten Fehler, können die Anwendung zum Absturz bringen und können sich bis zur Veröffentlichung noch ändern. + + + Experimentelle Features + + + Experimental + + + Befehl ausführen… + + + IP-Geolokation + + + Fügen Sie eine Registerkarte zur Abfrage der IP-Geolokalisierung hinzu... + + + Geben Sie eine Domain zur Whois-Abfrage ein... + + + Geben Sie einen Host ein, um die IP-Geolokation abzufragen... + + + Unbekannter Benutzername. + + + Authentifizierungsfehler (falsches Passwort, Community oder Key). + + + Der Vorgang war erfolgreich und ohne Fehler. + + + Die Antwort auf Ihre Anfrage war zu groß, um in eine einzige Antwort zu passen! + + + Die angeforderte OID konnte nicht gefunden werden! + + + Ein schreib- oder lesegeschütztes Objekt wurde auf einen inkonsistenten Wert gesetzt! + + + Die angeforderte OID existiert nicht und ist nicht beschreibbar! + + + Es ist ein Fehler aufgetreten, für den es keine spezifische Meldung gibt! + + + Das angeforderte Objekt kann nicht geändert werden! + + + Das Objekt wurde auf einen inkompatiblen Datentyp gesetzt! + + + Der dem Objekt zugewiesene Wert überschreitet seine maximale Länge! + + + Die für das Objekt verwendete Kodierung ist falsch! + + + Der dem Objekt zugewiesene Wert ist keine gültige Option! + + + Das angeforderte Objekt existiert nicht und kann nicht erstellt werden! + + + Die MIB-Variable befindet sich in einem inkonsistenten Zustand und kann nicht geändert werden! + + + Es sind keine verfügbaren Systemressourcen vorhanden, um die angeforderte Operation auszuführen! + + + Ein Fehler ist während der Set-Operation aufgetreten! + + + Eine Set-Operation ist fehlgeschlagen, und frühere Änderungen konnten nicht zurückgenommen werden! + + + Authentifizierung fehlgeschlagen. Bitte überprüfen Sie die Community-Zeichenfolge! + + + Das angeforderte Objekt ist nicht beschreibbar und kann nicht geändert werden! + + + Der Zustand des Objekts ist inkonsistent und verhindert die Set-Operation! + + + Alle schließen + + + Hostansicht ausklappen + + + Kartenansicht vergrößern + + + Host kann nicht gesetzt werden, während andere Hosts hinzugefügt werden. Bitte warten Sie, bis der Vorgang abgeschlossen ist, und versuchen Sie es erneut. + + + Keine übereinstimmenden Befehle! + + + Remote Hostname + + + Prozess-ID + + + Prozesspfad + + + Prozessname + + + NetBIOS + + + Computername + + + Fehler + + + OK + + + Warnung + + + Gruppe / Domäne + + + NetBIOS erreichbar + + + Scan nach NetBIOS + + + NetBIOS-Scan ist deaktiviert! + + + Hostname auflösen ist deaktiviert! + + + MAC-Adresse auflösen ist deaktiviert! + + + Gruppe schließen + + + Befehl ausführen… (Strg+Shift+P) + + + Profildateien + + + Einstellungen öffnen... + + + Erweitern und Suche öffnen... + + + Ab Windows 11 24H2 müssen Sie den Zugriff auf den WLAN-Adapter erlauben. + +Öffnen Sie Windows-Einstellungen > Datenschutz & Sicherheit > Standort, aktivieren Sie den Zugriff für Desktop-Apps / NETworkManager und starten Sie die Anwendung anschließend neu. + + + Mit Drag & Drop können Sie die Anwendungen neu anordnen. +Rechtsklick für weitere Optionen. + + + Standards wiederherstellen + + + Ein einfach zu bedienendes Drag'n'Drop-Framework für WPF. + + + BSD-3-Clause + + + Standard festlegen + + + Ubuntu Server mit Docker, Nextcloud und Traefik... + + + Linux-Server, die in AWS laufen... + + + 6 GHz + + + Unterstütze dieses Projekt mit einer Spende. + + + Dokumentation öffnen + + + Spenden + + + Profildatei + + + Hosts File Editor + + + Hosts File Editor + + + Schreibgeschützter Modus. Das Ändern der hosts Datei erfordert erhöhte Rechte! + + + Hosts-Datei öffnen + + + Kommentar + + + Deaktivieren + + + Eintrag bearbeiten + + + Eintrag bearbeiten... + + + Eintrag aktivieren + + + Eintrag deaktivieren + + + Aktualisieren... + + + Aktualisiert um {0} + + + Hosts-Datei konnte nicht geladen werden: {0} + + + Wiederholung in {0} Sekunden... + + + Was ist neu? + + + Changelog + + + Aktualisiert auf {0} + + + Diese Version enthält neue Funktionen, Verbesserungen und Fehlerbehebungen. Alle Details findest du im Changelog! + + + Einträge + + + Der ausgewählte Eintrag wird endgültig gelöscht: + +{0} {1} {2} + + + Primärer DNS-Server + + + Geben Sie einen gültigen Hostnamen ein (z.B. "server-01" oder "example.com")! Mehrere Hostnamen können durch ein Leerzeichen getrennt werden. + + + Die Datei "hosts" konnte nicht gelesen werden! Siehe Protokolldatei für weitere Details. + + + In die Datei „hosts“ konnte nicht geschrieben werden. Siehe Protokolldatei für weitere Details. + + + Der Eintrag wurde nicht in der Datei "hosts" gefunden! Möglicherweise wurde die Datei geändert. + + + Ein Backup der Datei "hosts" konnte nicht erstellt werden! Siehe Protokolldatei für weitere Details. + + + Statusleiste anzeigen + + + Die Statusleiste wird unten links im WebView angezeigt, wenn Sie mit der Maus über einen Link fahren. + + + Zugangsdaten speichern + + + Zeigt nach erfolgreicher Anmeldung ein Dialogfeld zum Speichern der Zugangsdaten an. + + + Browsing-Daten löschen + + + Die Browserdaten (Verlauf, Cookies, Cache, Anmeldedaten usw.) für das aktuelle WebView2-Profil dauerhaft löschen. + + + Browsing-Daten + + + Browsing-Daten erfolgreich gelöscht! + + + Beim Löschen der Browsing-Daten ist ein Fehler aufgetreten. Sie können dieses Problem gerne auf GitHub melden. + + + Produktion + + + Tag hinzufügen + + + Filter anwenden + + + Profile filtern... + + + Filter nach Tags + + + Keine Tags gefunden! + + + Match + + + Any + + + Gruppe hinzufügen... + + + Alle erweitern + + + Alle einklappen + + + Verwenden Sie benutzerdefinierte Themes, um das Erscheinungsbild der Anwendung anzupassen. Sie können Themes im Verzeichnis „Program Folder > Themes“ bearbeiten oder hinzufügen. Weitere Informationen finden Sie in der Dokumentation. + + + Admin-Sitzung (Konsole) + + + Die Profildatei "{0}" wird dauerhaft gelöscht. + + + Verschlüsselung aktivieren? + + + Möchten Sie die Verschlüsselung von Profildateien aktivieren, um sensible Daten wie Hosts, IP-Adressen, URLs und gespeicherte Anmeldedaten zu schützen? + +Sie können die Verschlüsselung später jederzeit aktivieren oder deaktivieren, indem Sie mit der rechten Maustaste auf die Profildatei klicken, um die Verschlüsselungseinstellungen zu verwalten. +Wenn Sie auf „Abbrechen“ klicken, bleibt die Profildatei unverschlüsselt. + + + Ein Neustart ist erforderlich, um Änderungen wie Spracheinstellungen zu übernehmen. + + + Keiner der angegebenen DNS-Server konnte geparst oder aufgelöst werden. + + + "{0}" konnte nicht geparst werden. + + + Maximale Anzahl von Backups + + + Tägliches Backup erstellen + + + Anzahl der Backups, die aufbewahrt werden, bevor das älteste gelöscht wird. + + + Diese Einstellung wird von Ihrem Administrator verwaltet. + + + Standard-Speicherort wiederherstellen + + + Wiederherstellen + + + Standard-Speicherort wiederherstellen? + + + Der Standardspeicherort für Einstellungen wird wiederhergestellt und die Anwendung anschließend neu gestartet. + +Bei Bedarf können Sie die Datei „settings.json“ von „{0}“ nach „{1}“ kopieren, um Ihre bisherigen Einstellungen zu migrieren. Dazu muss die Anwendung geschlossen sein, damit die Einstellungen nicht überschrieben werden. + + + Pfad ändern? + + + Der Speicherort für Einstellungen wird geändert und die Anwendung anschließend neu gestartet. + +Bei Bedarf können Sie die Datei „settings.json“ von „{0}“ nach „{1}“ kopieren, um Ihre bisherigen Einstellungen zu migrieren. Dazu muss die Anwendung geschlossen sein, damit die Einstellungen nicht überschrieben werden. + + + Geben Sie einen gültigen Ordnerpfad ein! + + + Der Speicherort für Profile wird geändert und die Anwendung anschließend neu gestartet. + +Bei Bedarf können Sie die Profiledateien von „{0}“ nach „{1}“ kopieren, um Ihre bisherigen Profile zu migrieren. Dazu muss die Anwendung geschlossen sein, damit die Profile nicht überschrieben werden. + + + Der Standardspeicherort für Profile wird wiederhergestellt und die Anwendung anschließend neu gestartet. + +Bei Bedarf können Sie die Profildateien von „{0}“ nach „{1}“ kopieren, um Ihre bisherigen Profile zu migrieren. Dazu muss die Anwendung geschlossen sein, damit die Profile nicht überschrieben werden. + + + Netzwerkverbindung + + + Netzwerkstatus + + + Active Directory-Import fehlgeschlagen. + + + Optionen + + + + Verwendet Ihre aktuellen Windows-Anmeldeinformationen, um aus dem Active Directory zu lesen. Das Konto muss berechtigt sein, Computerobjekte unterhalb der Suchbasis (Teilbaum) aufzulisten. + + + Suchbasis (DN) + + + Zusätzlicher LDAP-Filter + + + Der Filter muss ein gültiger LDAP-Ausdruck sein, der mit '(' beginnt und mit ')' endet. + + + Die Suchbasis muss ein gültiger LDAP-Distinguished-Name sein (z. B. DC=example,DC=com). + + + Aus Active Directory importiert am {0} + + + Keine Computer für die angegebene Suchbasis und den Filter gefunden. + + + Active Directory wird durchsucht… + + + Wenn Ihr Computer nicht zur Domäne gehört, geben Sie den Domänencontroller (Hostname oder IP) an und verwenden Sie benutzerdefinierte Anmeldeinformationen. + + + Server (optional) + + + Port (optional) + + + SSL verwenden (LDAPS) + + + Aktuelle Windows-Anmeldeinformationen verwenden + + + Diese Anmeldeinformationen verwenden + + + Erweitert + + + Alle auswählen + + + Alle abwählen + + + Aktivieren für + + + Bereits importierte überspringen + + + {0} · {1} Ergebnis(se) + + + {0} Profil(e) importiert. +{1} doppelte Einträge übersprungen. +{2} ohne Host übersprungen. + + + Active Directory + + + CSV-Datei + + + CSV-Datei + + + Profile aus CSV-Datei importieren + + + Am {0} aus CSV-Datei importiert + + + In der CSV-Datei wurden keine Einträge gefunden. + + + Erwartetes CSV-Format – ein Profil pro Zeile: + + + Eine Kopfzeile und das Trennzeichen (Semikolon, Komma oder Tabulator) werden automatisch erkannt. Die Beschreibungsspalte ist optional. Einträge ohne Host können nicht importiert werden. + + + Importergebnisse + + + Neu + + + Importiert + + + Kein Host + + + Deaktivierte Konten ausschließen + + + Computer aus Active Directory importieren + + + Computer aus Active Directory importieren… + + + Profile importieren + + + Quelle + + + Active Directory + + + Profilgruppe + + + Vorhandener oder neuer Gruppenname + + + Firewall + + + Firewall-Regeln + + + Windows Firewall Einstellungen + + + Richtung + + + Eingehend + + + Ausgehend + + + Aktion + + + Zulassen + + + Blockieren + + + Netzwerkprofil + + + Netzwerkprofile + + + Schnittstellentyp + + + Firewall-Regeln konnten nicht geladen werden. {0} + + + Die ausgewählte Firewall-Regel wird endgültig gelöscht: + +{0} + + + Beliebig + + + TCP + + + UDP + + + ICMPv4 + + + ICMPv6 + + + HOPOPT + + + GRE + + + IPv6 + + + IPv6-Route + + + IPv6-Frag + + + IPv6-NoNxt + + + IPv6-Opts + + + VRRP + + + PGM + + + L2TP + + + Beliebig + + + LAN + + + Drahtlos + + + Remotezugriff + + + Schreibgeschützter Modus. Zum Ändern von Firewall-Regeln sind erweiterte Rechte erforderlich! + + + Eingehend + + + Ausgehend + + + Blockieren + + + Zulassen + + + Lokale Ports + + + Remote Ports + + + Lokale Adressen + + + Remote Adressen + + + Geben Sie eine gültige IP-Adresse, ein Subnetz (z. B. 10.0.0.0/8), einen Bereich (z. B. 10.0.0.1–10.0.0.10) oder ein Schlüsselwort ein (Any, LocalSubnet, DNS, DHCP, WINS, DefaultGateway, Internet, Intranet, IntranetRemoteAccess, PlayToDevice, CaptivePortal) + + + Regel hinzufügen + + + Regel hinzufügen... + + + Regel bearbeiten + + + Regel bearbeiten... + + + Regel löschen + + + Regel aktivieren + + + Regel deaktivieren + + + Profile importieren… + + + Speedtest + + + Run Speedtest + + + Metadaten abrufen... + + + Latenz messen... + + + Download-Geschwindigkeit messen... + + + Upload-Geschwindigkeit messen... + + + Messen Sie Download- und Upload-Geschwindigkeiten, Latenz und Jitter mit speed.cloudflare.com. +Cloudflare speichert möglicherweise Ihre IP-Adresse und Netzwerkinformationen. Weitere Informationen finden Sie in der Datenschutzerklärung von Cloudflare. + + + Latenz + + + Jitter + + + Ein Speedtest-Dienst, mit dem Download- und Upload-Geschwindigkeit, Latenz und Jitter gemessen werden können. + + + Stoppen diff --git a/Source/NETworkManager.Localization/Resources/Strings.es-ES.resx b/Source/NETworkManager.Localization/Resources/Strings.es-ES.resx index 7870661095..b20a4eba30 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.es-ES.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.es-ES.resx @@ -138,8 +138,32 @@ ARP - - Tabla ARP + + Neighbor Table + + + Read-only mode. Modifying the neighbor table requires elevated rights! + + + Unreachable + + + Incomplete + + + Probe + + + Delay + + + Stale + + + Reachable + + + Permanent Autenticación @@ -285,12 +309,24 @@ Interfaz de red + + Configuration applied + + + Configuring the network interface requires elevated rights! + Nueva pestaña + + Next + OUI + + Options + ¿Sobrescribir? @@ -348,9 +384,6 @@ Configuración - - ¡La configuración ha sido restablecida! - SNMP @@ -444,6 +477,18 @@ Descripción + + Placeholder + + + Path to the file or executable to run. The following placeholders can be used: + + + Arguments passed to the file or executable. The following placeholders can be used: + + + The following placeholder can be used: + DHCP habilitado @@ -489,6 +534,30 @@ Dirección IPv4 + + IPv4 address added + + + IPv4 address removed + + + IPv4 address released and renewed + + + IPv4 address released + + + IPv4 address renewed + + + IPv6 address released and renewed + + + IPv6 address released + + + IPv6 address renewed + Puerta de enlace predeterminada IPv4 @@ -504,11 +573,23 @@ Puerta de enlace predeterminada IPv6 + + Map + + + (+{0} more) + + + Scroll = Zoom, Drag = Pan + + + Unknown + Máximo - - Máximo de saltos/router + + Maximum hops Minimizar la ventana principal en lugar de terminar la aplicación @@ -561,9 +642,6 @@ Reinicio requerido - - ¡Algunas configuraciones se aplican solo después de reiniciar la aplicación! - Guardar configuración en la directorio de la aplicación @@ -577,7 +655,7 @@ Mostrar la siguiente aplicación al inicio: - ¡Una potente herramienta para gestionar redes y solucionar problemas de red! + A powerful open-source tool for managing networks and troubleshooting network problems! Velocidad @@ -594,12 +672,9 @@ Servidor DNS estático IPv4 - + Máscara de subred - - Máscara de subred o CIDR - Hilos @@ -621,8 +696,8 @@ Tiempo de espera (ms) - - Tiempo de espera entre cada ping + + Time (ms) to wait between each ping TTL @@ -663,9 +738,6 @@ Añadir una pestaña para realizar un rastreo... - - Añadir una pestaña para consultar los encabezados HTTP... - Añadir sufijo de DNS (primario) al nombre del host @@ -691,7 +763,7 @@ Aplicar - Aplicar combinaciones de teclas de Windows (ej. ALT+TAB): + Apply Windows key combinations (e.g., ALT+TAB): Aute. @@ -720,6 +792,9 @@ ¡Bloq Mayús está habilitado! + + Chart time (seconds) + Buscar actualizaciones al inicio @@ -769,9 +844,9 @@ Credencial - Profile files are encrypted on disk using AES with a key size of 256 bits and a block size of 128 bits in CBC mode. The encryption key is derived from a master password using Rfc2898DeriveBytes (PBKDF2) with 1,000,000 iterations. At runtime, passwords are stored as SecureString once the profile file is loaded. For some functions, the password must be converted to a normal string and remains unencrypted in memory until the garbage collector cleans them up. + Los archivos de perfil se cifran en el disco utilizando AES con un tamaño de clave de 256 bits y un tamaño de bloque de 128 bits en modo CBC. La clave de cifrado se deriva de una contraseña maestra utilizando Rfc2898DeriveBytes (PBKDF2) con 1.000.000 de iteraciones. En tiempo de ejecución, las contraseñas se almacenan como SecureString una vez cargado el archivo de perfil. Para algunas funciones, la contraseña debe convertirse en una cadena normal y permanece sin cifrar en la memoria hasta que el recolector de basura las limpia. -First make a backup copy of your profile files before enabling encryption! +¡Primero haz un respaldo de tus archivos de perfil antes de habilitar el cifrado! Personalizado @@ -810,7 +885,7 @@ First make a backup copy of your profile files before enabling encryption!Eliminar entrada - Selected profile will be deleted permanently. + El perfil seleccionado será eliminado de forma permanente. Configuración automática de DNS @@ -821,9 +896,6 @@ First make a backup copy of your profile files before enabling encryption! Servidor DNS - - Ver documentación - Dominio @@ -842,8 +914,8 @@ First make a backup copy of your profile files before enabling encryption! Fecha/hora de finalización - - Ingresa una subred para calcularla... + + Escriba una subred para calcular... Ingresa la subred y una nueva máscara de subred para crear subredes... @@ -866,9 +938,6 @@ First make a backup copy of your profile files before enabling encryption! Tamaño de pantalla fijo: - - El proyecto en GitHub - Encontrado @@ -891,7 +960,7 @@ First make a backup copy of your profile files before enabling encryption!ID - Inherit host from general + Heredar host de general Rango de IP @@ -969,6 +1038,9 @@ Crear uno... OID + + Only CSV files are allowed! + Solo cuando se usa la pantalla completa @@ -993,12 +1065,6 @@ Crear uno... anular - - ¿Sobrescribir la configuración en la carpeta de destino? - -"Sobrescribir" sobrescribirá el archivo en la carpeta de destino. -"Usar otro" usará el archivo de configuración existente en el destino y reiniciará la aplicación. - Contraseña @@ -1029,9 +1095,6 @@ Crear uno... ¡El proceso de PuTTY ha finalizado! - - Perfil PuTTY - Consultas @@ -1098,18 +1161,6 @@ Crear uno... Seleccione una resolución de pantalla - - ¡Los ajustes seleccionados se sobrescriben! - - - La configuración seleccionada se restablecerá. - - - Seleccione la configuración que desea exportar: - - - Seleccione la configuración que desea importar: - ¡Esto restablecerá toda la configuración! @@ -1117,7 +1168,7 @@ Crear uno... Serial - Línea serial + Serial line Servicio @@ -1126,15 +1177,6 @@ Crear uno... El archivo de configuración encontrado está dañado o no es compatible con esta versión. ¡Se ha restablecido toda la configuración! (¡Los archivos de perfil no están afectados!) - - ¡Configuración exportada correctamente! - - - ¡Configuración importada correctamente! - - - ¡Configuración restablecida correctamente! - Mostrar puertos cerrados @@ -1144,8 +1186,8 @@ Crear uno... Mostrar solo los tipos de consulta más comunes - - Mostrar el resultado del escaneo para todas las direcciones IP + + Mostrar direcciones IP y puertos inaccesibles Mostrar estadísticas @@ -1190,7 +1232,7 @@ Crear uno... La ubicación de configuración no está afectada - Tiempo de espera de consulta SNMP. + Timeout on SNMP query. Maybe the host is not reachable or the community / password is wrong. ¡Tiempo de espera al consultar el servidor DNS con la dirección IP "{0}"! @@ -1204,8 +1246,8 @@ Crear uno... ¡Error desconocido! - - Desfijar / Traer ventana al frente + + Untray / Bring window to foreground URL @@ -1247,7 +1289,7 @@ Crear uno... Ancho - Profile file could not be decrypted with the given password. + El archivo de perfil no se pudo descifrar con la contraseña proporcionada. La contraseña introducida no es correcta. @@ -1309,6 +1351,9 @@ Crear uno... Limpiar caché DNS + + DNS cache flushed + Desencriptar y cargar tus credenciales para seleccionarlas. @@ -1366,12 +1411,12 @@ Crear uno... Sobrescribir + + Parse + Pegar - - C:\Program Files\PuTTY\putty.exe - Reconectar @@ -1409,22 +1454,22 @@ Crear uno... Conexiones - ¡Ingresa un rango IP válido! + ¡Ingresa un rango de IP válido! ¡Ingresa una dirección IPv4 válida! - ¡Ingresa una dirección MAC válida (como 00:F1:23:AB:F2:35)! + Enter a valid MAC address (e.g., 00:F1:23:AB:F2:35)! ¡Ingresa un puerto válido (1 - 65535)! - ¡Ingresa una máscara de subred válida (como 255.255.255.0)! + Enter a valid subnetmask (e.g., 255.255.255.0)! - ¡Ingresa una máscara de subred o CIDR válida (como 255.255.255.0 o /24)! + Enter a valid subnetmask or CIDR (e.g., 255.255.255.0 or /24)! ¡El campo no puede estar vacío! @@ -1496,10 +1541,10 @@ Crear uno... ¡Ingresa un puerto válido y/o un rango de puertos (1 - 65535)! - ¡Ingresa una subred válida (como 192.168.178.133/26)! + Enter a valid subnet (e.g., 192.168.178.133/26)! - Ingresa un sitio web válida (como https://ejemplo.com/index.html) + Enter a valid website (e.g., https://example.com/index.html) Verde @@ -1534,6 +1579,9 @@ Crear uno... Lima + + Live + Magenta @@ -1762,9 +1810,6 @@ Crear uno... Amarillo - - ¡Ingresa un valor válido entre 25 y 100! - ¡Ya existe un perfil con este nombre! @@ -1793,7 +1838,10 @@ Crear uno... Añadir una pestaña para consultar whois... - ¡Ingresa un dominio válido (como "ejemplo.com")! + Enter a valid domain (e.g., "example.com")! + + + Enter a valid Windows username (e.g., "user", "DOMAIN\user" or "user@domain.com")! El servidor Whois no encuentró el dominio: "{0}" @@ -1837,9 +1885,6 @@ Crear uno... Configure la ruta de TigerVNC en la configuración... - - Ubicación de TigerVNC... - ¡El proceso de TigerVNC ha finalizado! @@ -1903,11 +1948,11 @@ Crear uno... Añadir dirección IPv4 - - Hilos de host + + Max. concurrent host threads - - Hilos de puerto + + Max. concurrent port threads PowerShell @@ -1924,9 +1969,6 @@ Crear uno... Consola remota - - Ubicación de PowerShell... - Ruta de archivo @@ -1964,11 +2006,11 @@ Crear uno... Trabajo en segundo plano - El trabajo en segundo plano guardará la configuración, los perfiles y las credenciales cada x-minutos. + The background job will save settings and profiles every x-minutes. -El valor 0 deshabilitará esta característica. +Value 0 will disable this feature. -Cambiar este valor requiere el reinicio de la aplicación para que tenga efecto. +Changes to this value will take effect after restarting the application. Ejecutar trabajo en segundo plano cada x-minutos @@ -1980,15 +2022,15 @@ Cambiar este valor requiere el reinicio de la aplicación para que tenga efecto. Panel de control - Todas las configuraciones se pueden cambiar más adelante en configuración + All settings can be changed later in the settings! Comprobar dirección IP pública - - ¡Gracias por utilizar NETworkManager! + + Thank you for using NETworkManager! -Para proporcionar características adicionales, la aplicación utiliza servicios en Internet que no son operados por mí. No se me enviarán datos en ningún momento. +If you enjoy it, please consider supporting its development — whether by leaving a star on GitHub, making a donation, or simply sharing it with others. Your support helps keep the project going and growing. Al iniciar el programa, comprueba en segundo plano si está disponible una nueva versión del programa en GitHub. @@ -2009,14 +2051,14 @@ URL: https://api.ipify.org/ Servicios externos - - El proyecto en GitHub. + + Star/Fork the Project on GitHub. - - Ayuda a traducir el proyecto en Transifex. + + Help translate the project on Transifex. - - Contacto vía Twitter. + + Follow or contact me via X. Conexión @@ -2036,15 +2078,6 @@ URL: https://api.ipify.org/ Comprueba la configuración de tu adaptador de red (DHCP, IP estático) y si está conectado a una red. - - Error - - - Aceptar - - - Advertencia - ¡No se pudo detectar la dirección IP de la puerta de enlace! @@ -2097,8 +2130,8 @@ está deshabilitada! Usar la API de dirección IPv4 personalizada - - URL para un servicio web al que se puede acceder a través de http o https y que devuelve una dirección IP como respuesta. + + URL to a web service that can be reached via http or https and returns an IPv4 address e.g., "xx.xx.xx.xx" as response. ¡No se pudo analizar la dirección IP pública de "{0}"! Pruebe otro servicio o utilice el predeterminado... @@ -2172,6 +2205,12 @@ está deshabilitada! Estilos visuales + + View only + + + Block keyboard and mouse input to the remote session + Audio remoto @@ -2217,24 +2256,39 @@ está deshabilitada! Programa + + Private + + + Public + El comando personalizado seleccionado será eliminado permanentemente. - - Las siguientes variables están disponibles: - -$$ipaddress$$ --> Dirección IP -$$hostname$$ --> Nombre del host - Reiniciar - - ¡No se pudo resolver la dirección IP para el nombre del host! + + Could not resolve ip address for hostname! Ctrl+Alt+Supr + + Task Manager (Ctrl+Shift+Esc) + + + Lock (Win+L) + + + Show Desktop (Win+D) + + + Explorer (Win+E) + + + Run dialog (Win+R) + Atajos de teclado @@ -2271,8 +2325,8 @@ $$hostname$$ --> Nombre del host Mostrar la ventana de estado en el cambio de red - - Tiempo en segundos durante cuánto se debe mostrar la ventana + + Time in seconds how long the status window is shown Wi-Fi @@ -2298,12 +2352,18 @@ $$hostname$$ --> Nombre del host Canal + + Channel width + 2.4 GHz 5 GHz + + 2.4 & 5 GHz + Intensidad de señal @@ -2343,11 +2403,8 @@ $$hostname$$ --> Nombre del host Tiempo de espera (s) - - Informar de un problema o crear una solicitud de función - - - Informar de un problema o crear una solicitud de función. + + Report an issue or create a feature request. Intervalo de señal @@ -2388,12 +2445,39 @@ $$hostname$$ --> Nombre del host No se pudo resolver la dirección IP para: "{0}" + + Notification + + + Show notification popup on status change + + + Play sound on status change + + + Success threshold + + + Number of consecutive successful pings required before a "Host is up" notification is shown. Higher values reduce noise from flapping hosts. + + + Failure threshold + + + Number of consecutive failed pings (timeouts) required before a "Host is down" notification is shown. Higher values reduce noise from flapping hosts. + + + Display duration (seconds) + + + Host is up + + + Host is down + La aplicación se reiniciará... - - Usar otra carpeta - ¡No se pudo exportar el archivo! Ver mensaje de error: "{0}" @@ -2409,8 +2493,8 @@ $$hostname$$ --> Nombre del host Está cifrado - - Abrir documentación en GitHub. + + Open the documentation. Cliente 1 @@ -2439,9 +2523,6 @@ $$hostname$$ --> Nombre del host Eliminar archivo de perfil - - El archivo de perfil seleccionado será eliminado permanentemente. - ¡Todos los perfiles en este archivo de perfil serán eliminados permanentemente! @@ -2464,7 +2545,7 @@ $$hostname$$ --> Nombre del host Reiniciar como administrador - ¡Para analizar los paquetes de red, la aplicación debe iniciarse con derechos elevados! + Analysing network packets requires elevated rights! Capturar @@ -2493,13 +2574,13 @@ $$hostname$$ --> Nombre del host Protocolo de descubrimiento - + CDP - + LLDP - + LLDP / CDP @@ -2532,8 +2613,8 @@ $$hostname$$ --> Nombre del host Se requiere Microsoft.Windows.SDK.Contracts para esta característica, pero no está disponible en este sistema (ej. en Windows Server). - - Tabla ARP + + Neighbor Table Conexiones @@ -2670,134 +2751,47 @@ $$hostname$$ --> Nombre del host Amarillo - - Acero + + Steel - + General - - Búsqueda DNS - - - Encabezados HTTP - - - Escáner de IP - - - Interfaz de red - - - Ping - - - Monitoreador de ping - - - Escáner de puertos - - - PowerShell - - - PuTTY - - - Escritorio remoto - - - TigerVNC - - - Rastrear ruta - - - Wake on LAN - - - Consola web - - - Whois - - - Aplicaciones + + Applications - + General - - Apariencia - - - Inicio automático - - - Panel de control + + Appearance - - Búsqueda DNS + + Autostart - + General - - Atajos de teclado - - - Encabezados HTTP - - - Escáner de IP - - - Idioma - - - Monitoreador de ping - - - Escáner de puertos - - - PowerShell - - - Perfiles - - - PuTTY - - - Escritorio remoto - - - Configuración - - - SNMP - - - Estado + + HotKeys - - TigerVNC + + Language - - Rastrear ruta + + Profiles - - Actualizar + + Settings - - Wake On LAN + + Status - - Whois + + Update - - Ventana + + Window Habilitar registro @@ -2827,7 +2821,7 @@ $$hostname$$ --> Nombre del host Registro SSH - SSH y registro sin procesar + SSH and Raw log ¡Ingresa un nombre de archivo válido! @@ -2889,13 +2883,17 @@ $$hostname$$ --> Nombre del host SSID - - ¡No se pudo cargar el perfil! + + Profile file could not be loaded! - - If this happened after an update, you may need to migrate the profiles to a newer version. When you click "Migrate", a PowerShell window opens with the migration script. Check the path and press Enter. + + The profile file could not be loaded and may be corrupted. You can try to restore the file from a backup or delete it. + +If this happens unexpectedly or after an update, please report the error on GitHub. -Otherwise, the profile may be corrupted and you want to report the issue on GitHub. + +Error message: +"{0}" Editar grupo... @@ -2925,7 +2923,7 @@ Otherwise, the profile may be corrupted and you want to report the issue on GitH Desbloquear perfil - Unlock the profile file to use the profiles! + ¡Desbloquear el archivo de perfil para usar los perfiles! Descargo de responsabilidad @@ -2933,25 +2931,12 @@ Otherwise, the profile may be corrupted and you want to report the issue on GitH Fusionar - - La carpeta de destino ya contiene archivos. Si hace clic en Fusionar, los perfiles actuales se copiaran a la carpeta. - - - Overwrite profiles in destination folder? - -"Overwrite" will copy the profile files to the destination folder and overwrite existing profile files. -"Merge" will copy the profile files to the destination folder, but won't overwrite exitsting profile files. -"Use other folder" will use the existing profile files in the destination folder. - Usar otro Mover - - Los archivos de perfil se moverán a la carpeta de destino seleccionada. - Último escaneo {0} @@ -2980,7 +2965,7 @@ Otherwise, the profile may be corrupted and you want to report the issue on GitH La biblioteca C# se encarga de la red compleja, IP, IPv4, IPv6, máscara de red, CIDR, subred y cálculo de superred para desarrolladores de .NET. - Gráficos, mapas y medidores sencillos, flexibles, interactivos y potentes para .Net + Beautiful, interactive charts, maps, and gauges. Una colección de indicadores de carga para WPF @@ -3009,8 +2994,11 @@ Otherwise, the profile may be corrupted and you want to report the issue on GitH Lista de dominios de nivel superior de iana.org, que se utiliza para consultar los servidores whois TLD de whois.iana.org a través del puerto 43 + + GeoJSON conversion of Natural Earth vector map data (CC0-1.0). + - Datos IEEE OUI saneados de linuxnet.ca. + Datos OUI de ieee.org. Registro de nombres de servicio y números de puerto de protocolo de transporte de iana.org. @@ -3060,10 +3048,10 @@ Habilita el cifrado de archivos de perfil en Configuración > Perfil para alm ¡Ingresa una dirección IPv6 válida! - Dirección IPv4 de acceso público. + Dirección IPv4 pública accesible a través de ICMP. - Dirección IPv6 de acceso público. + Dirección IPv6 pública accesible a través de ICMP. Dirección IPv4 pública @@ -3111,36 +3099,1395 @@ Habilita el cifrado de archivos de perfil en Configuración > Perfil para alm No se puede reconectar a la sesión remota. - Migrate + Migrar - Report on GitHub + Informar en GitHub - Groups + Grupos - Add group + Añadir grupo - Delete group + Eliminar grupo - Selected group and all profiles inside this group will be deleted permanently. + El grupo seleccionado y todos los perfiles dentro de este grupo serán eliminados permanentemente. - The name is already used! + ¡El nombre ya está en uso! - Resize + Redimensionar - Delete profiles + Eliminar perfiles - Selected profiles will be deleted permanently. + Los perfiles seleccionados serán eliminados permanentemente. + + + Use custom themes + + + Custom themes + + + Reset settings? + + + Settings reset! + + + ID de instancia + + + Conexión local + + + Interfaz local + + + log4net is a tool to help the programmer output log statements to a variety of output targets. + + + Habilitado + + + Región + + + Perfiles y regiones para sincronizar + + + Perfil predeterminado + + + Región predeterminada + + + Group name cannot start with "{0}"! + + + Check for pre-releases + + + Synchronization is disabled! + + + Comando + + + Apply theme to PowerShell console + + + The color of the PowerShell console can be changed to the application theme under Settings > General > Appearance + + + If you enable this option, the default PowerShell console settings in the registry under HKCU:\Console are overridden so that the PowerShell console window matches the application theme. This is a global system setting that may affect the appearance of the normal PowerShell window. + +Only the PowerShell consoles configured in the PowerShell settings are modified. Both Windows PowerShell and PWSH (PowerShell 7 and higher) are supported. + +Click in the upper right corner on the help / documentation button (left of the minimize button) or navigate to https://borntoberoot.net/NETworkManager/Documentation/Settings/Appearance for more details. Here are the values documented which will be adjusted. + +If the option is disabled again, the values are no longer modified. However, the original values are NOT restored. + + + Input cannot end with a ";"! + + + Input does not contain any text! + + + Bit Calculator + + + Bit Calculator + + + Notation + + + Entrada + + + Unit + + + Bits + + + Gigabits + + + Gigabytes + + + Kilobits + + + Kilobytes + + + Megabits + + + Megabytes + + + Petabits + + + Petabytes + + + Terabits + + + Terabytes + + + Enter a number and select a unit to calculate the units... + + + Network + + + Proxy + + + Resolve IP address for this host (IPv4 is preferred) + + + A valid path to PowerShell should end with "pwsh.exe" or "powershell.exe"! + + + A valid path to PuTTY should end with "PuTTY.exe"! + + + A valid path to TigerVNC should end with "vncviewer-*.exe" or "vncviewer64-*.exe"! + + + SNTP Lookup + + + Move a .NET Framework/.NET Core app runtime components and dependencies into a sub-directory and make it beauty. + + + Add a tab to perform a SNTP lookup... + + + Servidor/es SNTP + + + URL to a web service that can be reached via http or https and returns an IPv6 address e.g., "xxxx:xx:xxx::xx" as response. + + + IP endpoint + + + Local end time + + + Local start time + + + Network time + + + Offset + + + Round trip delay + + + Server + + + SNTP Lookup + + + Add SNTP server + + + Delete SNTP server + + + El servidor SNTP seleccionado será eliminado permanentemente. + + + Edit SNTP server + + + An SNTP server with this name already exists! + + + Enter a valid hostname (e.g., "server-01" or "example.com") or a valid IP address (e.g., 192.168.178.1)! + + + Servidor/es + + + Ingresa la contraseña maestra para desbloquear el archivo de perfil: + + + Desbloquear archivo de perfil + + + Timed out + + + Hostkey + + + The settings will be reset and the application will be restarted afterwards! + + + ¡La configuración ha sido restablecida! + + + Ping status + + + ThreadPool additional min. threads + + + This setting specifies the minimum number of threads that will be created from the application's ThreadPool on demand. This can improve the performance for example of the IP scanner or port scanner. + +The value is added to the default min. threads (number of CPU threads). The value 0 leaves the default settings. If the value is higher than the default max. threads of the ThreadPool, this value is used. + +If the value is too high, performance problems may occur. + +Changes to this value will take effect after the application is restarted. Whether the value was set successfully can be seen in the log file under %LocalAppData%\NETworkManager\NETworkManager.log + + + These settings only change the maximum number of concurrently executed threads per host/port scan. Go to Settings > General > General to adjust the (min) threads of the application. + + + Port status + + + Ping details + + + No open ports found! + + + Port scan is disabled! + + + Scan ports + + + Could not find the application "{0}". Maybe the application was hidden in the settings? + + + Status window + + + Show address bar + + + Enabling this setting is not recommended. Multiple instances of the application share the same settings and profile files. The last instance to be closed may overwrite changes made by other instances. + + + Bypass for local addresses + + + Enable gateway server + + + Logon method + + + Gateway server + + + Server name + + + Share Gateway credentials with remote computer + + + Allow me to select later + + + Smart card or Windows Hello for Business + + + Ask for password (NTLM) + + + Use gateway credentials + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server is temporarily unavailable. Try reconnecting later or contact your network administrator for assistance. + + + Your computer can't connect to the remote computer due to one of the following reasons: 1) The requested Remote Desktop Gateway server address and the server SSL certificate subject name do not match. 2) The certificate is expired or revoked. 3) The certificate root authority does not trust the certificate. Contact your network administrator for assistance. + + + This computer can't verify the identity of the RD Gateway "". It's not safe to connect to servers that can't be identified. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server address requested and the certificate subject name do not match. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server's certificate has expired or has been revoked. Contact your network administrator for assistance. + + + An error occurred while sending data to the Remote Desktop Gateway server. The server is temporarily unavailable or a network connection is down. Try again later, or contact your network administrator for assistance. + + + An error occurred while receiving data from the Remote Desktop Gateway server. Either the server is temporarily unavailable or a network connection is down. Try again later, or contact your network administrator for assistance. + + + Tu computadora no puede conectarse a la computadora remota porque la dirección del servidor Remote Desktop Gateway es inaccesible o incorrecta. Escribe una dirección de servidor Remote Desktop Gateway válida. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server is running low on server resources and is temporarily unavailable. Try reconnecting later or contact your network administrator for assistance. + + + The Remote Desktop Gateway server has ended the connection. Try reconnecting later or contact your network administrator for assistance. + + + The Remote Desktop Gateway server administrator has ended the connection. Try reconnecting later or contact your network administrator for assistance. + + + Remote Desktop can't connect to the remote computer "" for one of these reasons: 1) Your user account is not listed in the RD Gateway's permission list 2) You might have specified the remote computer in NetBIOS format (for example, computer1), but the RD Gateway is expecting an FQDN or IP address format (for example, computer1.fabrikam.com or 157.60.0.1). Contact your network administrator for assistance. + + + Remote Desktop can't connect to the remote computer "" for one of these reasons: 1) Your user account is not authorized to access the RD Gateway "" 2) Your computer is not authorized to access the RD Gateway "" 3) You are using an incompatible authentication method (for example, the RD Gateway might be expecting a smart card but you provided a password) Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because your network administrator has restricted access to this RD Gateway server. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the web proxy server requires authentication. To allow unauthenticated traffic to an RD Gateway server through your web proxy server, contact your network administrator. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server reached its maximum allowed connections. Try reconnecting later or contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server does not support the request. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the client does not support one of the Remote Desktop Gateway's capabilities. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server and this computer are incompatible. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because no certificate was configured to use at the Remote Desktop Gateway server. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the RD Gateway server that you are trying to connect to is not allowed by your computer administrator. If you are the administrator, add this Remote Desktop Gateway server name to the trusted Remote Desktop Gateway server list on your computer and then try connecting again. + + + Your computer can't connect to the remote computer because your computer or device did not meet the Network Access Protection requirements set by your network administrator, for one of the following reasons: 1) The Remote Desktop Gateway server name and the server's public key certificate subject name do not match. 2) The certificate has expired or has been revoked. 3) The certificate root authority does not trust the certificate. 4) The certificate key extension does not support encryption. 5) Your computer cannot verify the certificate revocation list. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because a user name and password are required to authenticate to the Remote Desktop Gateway server instead of smart card credentials. + + + Your computer can't connect to the remote computer because smart card credentials are required to authenticate to the Remote Desktop Gateway server instead of a user name and password. + + + Your computer can't connect to the remote computer because an invalid cookie was sent to the Remote Desktop Gateway server. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the cookie was rejected by the Remote Desktop Gateway server. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server is expecting an authentication method different from the one attempted. Contact your network administrator for assistance. + + + The RD Gateway connection ended because periodic user authentication failed. Try reconnecting with a correct user name and password. If the reconnection fails, contact your network administrator for further assistance. + + + The RD Gateway connection ended because periodic user authorization failed. Try reconnecting with a correct user name and password. If the reconnection fails, contact your network administrator for further assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway and the remote computer are unable to exchange policies. This could happen due to one of the following reasons: 1. The remote computer is not capable of exchanging policies with the Remote Desktop Gateway. 2. The remote computer's configuration does not permit a new connection. 3. The connection between the Remote Desktop Gateway and the remote computer ended. Contact your network administrator for assistance. + + + The RD Gateway connection ended because periodic user authorization failed. Your computer or device didn't pass the Network Access Protection (NAP) requirements set by your network administrator. Contact your network administrator for assistance. + + + Connected + + + Error while scanning WiFi adapter "{0}" with error: "{1}" + + + Connect... + + + {0} disconnected! + + + Connect to {0} + + + WPS + + + Connect automatically + + + Pre-shared key + + + Connecting to {0}... + + + Could not connect to {0} ({1})! + + + Successfully connected to {0}! + + + Access to the network has been revoked + + + Invalid credentials + + + Network not available + + + Successful + + + Connection attempt timed out + + + -/- + + + Authentication protocol is not supported! + + + Checking WPS... + + + Open OID profiles... + + + MIB + + + OID profiles + + + Select OID profile + + + Add OID profile + + + Delete OID profile + + + The selected OID profile will be deleted permanently. + + + Edit OID profile + + + Enter password... + + + Add tab + + + (from profile) + + + New subnet mask + + + Add server + + + SNTP server + + + The settings on this page contain errors. Correct them to be able to save. + + + SSH hostkey to use for the connection (e.g., "71:b8:f2:6e..."). Only available if the mode is "SSH". + + + Full path to the private key file (e.g., "C:\Users\BornToBeRoot\SSH\private_key.ppk"). Only available if the mode is "SSH". + + + Username that will be passed into the PuTTY session. Only available if the mode is "SSH", "Telnet" or "Rlogin". + + + ASN + + + AS Name + + + City + + + Continent + + + Country + + + Currency + + + District + + + DNS resolver + + + EDNS + + + Geolocation + + + Hosting + + + IP geolocation + + + ISP + + + Latitude + + + Longitude + + + Mobile + + + Organization + + + PTR record + + + Timezone + + + Zip + + + IP Geolocation API - Fast, accurate, reliable + + + Check DNS resolver + + + Check IP geolocation + + + Show map + + + The DNS resolver is determined via ip-api.com. + +URL: https://edns.ip-api.com/ + + + The IP geolocation is determined via ip-api.com. + +URL: http://ip-api.com/ + + + To provide additional features, third party services are used that are not operated by me. You can deselect them below. No data is transferred to me at any time. + + + Checking DNS resolver... + + + Checking IP geolocation... + + + Check your network connection and try again in a few seconds. + + + ip-api.com rate limit reached (too many requests from your network)! +Try again in a few seconds. + + + HTTP status code + + + Steel + + + Rate limit reached! Try again in {0} seconds... + + + General + + + BSSID + + + No reachable hosts found! + + + Application + + + Enable experimental features to test new functions. These are not yet complete, contain bugs, can crash the application and may change again until release. + + + Experimental features + + + Experimental + + + Run command... + + + IP Geolocation + + + Add a tab to query the IP geolocation... + + + Enter a domain to query whois... + + + Enter host to query IP geolocation... + + + Unknown user name. + + + Authentication failure (incorrect password, community or key). + + + The operation was successful without any errors. + + + The response to your request was too large to fit into a single response! + + + The requested OID could not be found! + + + A read-write or write-only object was set to an inconsistent value! + + + The requested OID does not exist and is not writable! + + + An error occurred for which no specific message is available! + + + The requested object is not accessible for modification! + + + The object was set to an incompatible data type! + + + The value assigned to the object exceeds its maximum length! + + + The encoding used for the object is incorrect! + + + The value assigned to the object is not a valid choice! + + + The requested object does not exist and cannot be created! + + + The MIB variable is currently in an inconsistent state and cannot be modified! + + + There are no available system resources to perform the requested operation! + + + An error occurred during the set operation! + + + A set operation failed, and previous changes could not be rolled back! + + + Authentication failed. Please check the community string! + + + The requested object is not writable and cannot be modified! + + + The object's state is inconsistent, preventing the set operation! + + + Close all + + + Expand host view + + + Expand map view + + + Host cannot be set while other hosts are being added. Please wait until the process is complete and try again. + + + No matching commands! + + + Remote hostname + + + Process ID + + + Process path + + + Process name + + + NetBIOS + + + Computer name + + + Error + + + OK + + + Warning + + + Group / domain + + + NetBIOS reachable + + + Scan for NetBIOS + + + NetBIOS scan is disabled! + + + Resolve Hostname is disabled! + + + Resolve MAC address is disabled! + + + Close group + + + Run command... (Ctrl+Shift+P) + + + Profile files + + + Open settings... + + + Expand and open search... + + + Starting with Windows 11 24H2, you’ll need to allow access to the Wi-Fi adapter. + +Open Windows Settings > Privacy & security > Location, enable access for Desktop Apps / NETworkManager, then restart the application. + + + Drag and drop the applications to reorder them. +Right-click for more options. + + + Restore defaults + + + An easy to use drag'n'drop framework for WPF. + + + BSD-3-Clause + + + Set default + + + Ubuntu Server running Docker with Nextcloud and Traefik... + + + Linux servers running in AWS... + + + 6 GHz + + + Support this project with a donation. + + + Ver documentación + + + Donate + + + Profile file + + + Hosts File Editor + + + Hosts File Editor + + + Read-only mode. Modifying the hosts file requires elevated rights! + + + Open hosts file + + + Comment + + + Disable + + + Edit entry + + + Edit entry... + + + Enable entry + + + Disable entry + + + Refreshing... + + + Reloaded at {0} + + + Failed to load hosts file: {0} + + + Retrying in {0} seconds... + + + What's new? + + + Changelog + + + Upgraded to {0} + + + This release includes new features, improvements, and bug fixes. Check out the changelog for all the details! + + + Entries + + + The selected entry is permanently deleted: + +{0} {1} {2} + + + Primary DNS server + + + Enter a valid hostname (e.g., "server-01" or "example.com")! Multiple hostnames can be separated with a space. + + + The "hosts" file could not be read! See log file for more details. + + + The "hosts" file could not be written to. See log file for more details. + + + The entry was not found in the "hosts" file! Maybe the file has been modified. + + + A backup of the "hosts" file could not be created! See log file for more details. + + + Show status bar + + + Displays the status bar in the bottom-left of the WebView when hovering over a link. + + + Save credentials + + + Displays a dialog to save credentials after a successful sign-in. + + + Delete browsing data + + + Permanently delete browsing data (history, cookies, cache, credentials, etc.) for the current WebView2 profile. + + + Browsing Data + + + Browsing data successfully deleted! + + + An error occurred while deleting browsing data. Feel free to report this issue on GitHub. + + + production + + + Add tag + + + Apply filter + + + Filter profiles... + + + Filter by tags + + + No tags found! + + + Match + + + Any + + + Add group... + + + Expand all + + + Collapse all + + + Use custom themes to personalize the appearance of the application. You can edit or add theme in the "Program Folder > Themes" directory. For more details, refer to the documentation. + + + Admin (console) session + + + Profile file "{0}" will be deleted permanently. + + + Enable encryption? + + + Do you want to enable profile file encryption to protect sensitive data such as hosts, IP addresses, URLs, and stored credentials? + +You can enable or disable encryption later at any time by right-clicking the profile file to manage encryption settings. +If you click Cancel, the profile file will remain unencrypted. + + + A restart is required to apply changes such as language settings. + + + Could not parse or resolve any of the specified DNS servers. + + + Could not parse "{0}". + + + Maximum number of backups + + + Create daily backup + + + Number of backups that are retained before the oldest one is deleted. + + + This setting is managed by your administrator. + + + Restore default location + + + Restore + + + Restore default location? + + + The default settings location is restored and the application is restarted afterwards. + +You can copy the “settings.json” file from "{0}" to "{1}" to migrate your previous settings, if necessary. The application must be closed for this to prevent the settings from being overwritten. + + + Change location? + + + The settings location is changed and the application is restarted afterwards. + +You can copy the “settings.json” file from "{0}" to "{1}" to migrate your previous settings, if necessary. The application must be closed for this to prevent the settings from being overwritten. + + + Enter a valid folder path! + + + The profiles location is changed and the application is restarted afterwards. + +You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. + + + The default profiles location is restored and the application is restarted afterwards. + +You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. + + + Network connection + + + Network Status + + + Active Directory import failed. + + + Options + + + + Uses your current Windows credentials to read from Active Directory. The account must be allowed to enumerate computer objects under the search base (subtree). + + + Search base (DN) + + + Additional LDAP filter + + + Filter must be a valid LDAP expression starting with '(' and ending with ')'. + + + Search base must be a valid LDAP distinguished name (e.g. DC=example,DC=com). + + + Imported from Active Directory on {0} + + + No computers found for the given search base and filter. + + + Searching Active Directory... + + + If your computer is not joined to the domain, specify the domain controller (hostname or IP) and use custom credentials. + + + Server (optional) + + + Port (optional) + + + Use SSL (LDAPS) + + + Use current Windows credentials + + + Use these credentials + + + Advanced + + + Select all + + + Deselect all + + + Enable for + + + Skip already imported + + + {0} · {1} result(s) + + + {0} profile(s) imported. +{1} duplicate entries skipped. +{2} without a host skipped. + + + Active Directory + + + CSV file + + + CSV file + + + Import profiles from CSV file + + + Imported from CSV file on {0} + + + No entries were found in the CSV file. + + + Expected CSV format — one profile per line: + + + A header row and the delimiter (semicolon, comma or tab) are detected automatically. The description column is optional. Entries without a host cannot be imported. + + + Import results + + + New + + + Imported + + + No host + + + Exclude disabled accounts + + + Import computers from Active Directory + + + Import computers from Active Directory... + + + Import profiles + + + Source + + + Active Directory + + + Profile group + + + Existing or new group name + + + Firewall + + + Firewall rules + + + Windows Firewall settings + + + Direction + + + Inbound + + + Outbound + + + Action + + + Allow + + + Block + + + Network profile + + + Network profiles + + + Interface type + + + Failed to load firewall rules. {0} + + + The selected firewall rule is permanently deleted: + +{0} + + + Any + + + TCP + + + UDP + + + ICMPv4 + + + ICMPv6 + + + HOPOPT + + + GRE + + + IPv6 + + + IPv6-Route + + + IPv6-Frag + + + IPv6-NoNxt + + + IPv6-Opts + + + VRRP + + + PGM + + + L2TP + + + Any + + + Wired + + + Wireless + + + Remote access + + + Read-only mode. Modifying firewall rules requires elevated rights! + + + Inbound + + + Outbound + + + Block + + + Allow + + + Local ports + + + Remote ports + + + Local addresses + + + Remote addresses + + + Enter a valid IP address, subnet (e.g. 10.0.0.0/8), range (e.g. 10.0.0.1-10.0.0.10), or keyword (Any, LocalSubnet, DNS, DHCP, WINS, DefaultGateway, Internet, Intranet, IntranetRemoteAccess, PlayToDevice, CaptivePortal) + + + Add rule + + + Add rule... + + + Edit rule + + + Edit rule... + + + Delete rule + + + Enable rule + + + Disable rule + + + Import profiles... + + + Speed Test + + + Run speed test + + + Fetching metadata... + + + Measuring latency... + + + Measuring download speed... + + + Measuring upload speed... + + + Measure download and upload speeds, latency, and jitter with speed.cloudflare.com. +Cloudflare may log your IP address and network information. See Cloudflare's privacy policy for details. + + + Latency + + + Jitter + + + Speed test service used to measure download speed, upload speed, latency, and jitter. - - Unlock the profile file to add, change or delete a profile! + + Stop diff --git a/Source/NETworkManager.Localization/Resources/Strings.fa_IR.resx b/Source/NETworkManager.Localization/Resources/Strings.fa_IR.resx new file mode 100644 index 0000000000..ee7abad71b --- /dev/null +++ b/Source/NETworkManager.Localization/Resources/Strings.fa_IR.resx @@ -0,0 +1,4000 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + درباره + + + لهجه + + + افزودن داده های احراز هویت + + + افزودن ورودی + + + افزودن پروفایل + + + آیا مطمئن هستید؟ + + + ARP + + + جدول ARP + + + احراز هویت + + + شروع خودکار + + + ماشین حساب + + + پارامترهای خط فرمان + + + پیکربندی + + + تایید + + + اتصال + + + اتصال به عنوان + + + نسخه برداری پروفایل + + + داده های احراز هویت + + + داده + + + برنامه پیش فرض + + + حذف داده های احراز هویت + + + Delete profile + + + مقصد + + + جزئیات + + + قطع شده + + + نمایش + + + DNS + + + پرس و جوی DNS + + + تکه تکه نکنید + + + ویرایش داده های احراز هویت + + + ویرایش گروه + + + Edit profile + + + خطا + + + صادر کردن + + + پالایش + + + عمومی + + + سرآمدها + + + تاریخچه + + + کلیدهای میانبر + + + سرآمدهای HTTP + + + وارد کردن + + + اطلاعات + + + رابط + + + پویشگر IP + + + صفحه کلید + + + زبان + + + کتابخانه ها + + + مجوز + + + دستگاه ها و منابع محلی + + + موقعیت + + + پرس و جو + + + نشانی MAC + + + گذرواژه اصلی + + + چند نخی + + + شبکه + + + رابط شبکه + + + سربرگ جدید + + + OUI + + + رونویسی؟ + + + پینگ + + + درگاه + + + جابجایی پذیر + + + پویشگر درگاه + + + Profiles + + + PuTTY + + + Query + + + Remote Desktop + + + راه اندازی مجدد + + + Resolve PTR + + + منابع + + + نتیجه + + + مسیریابی + + + پویش + + + جستجو + + + Select a profile... + + + تنظیم گذرواژه اصلی + + + تنظیمات + + + SNMP + + + سوکت + + + آمار + + + وضعیت + + + زیر شبکه + + + تقسیم شبکه + + + موفقیت! + + + شمایل + + + Traceroute + + + سینی + + + بروز رسانی + + + v1/v2c + + + v3 + + + اعتبار سنجی نا موفق بود! + + + بیدار شدن با شبکه + + + پایگاه وب + + + پنجره + + + گذرواژه اشتباه + + + مشتری + + + مدیر + + + همیشه آیکن را در سینی نشان بده + + + تلاش ها + + + زمان میانگین + + + پخش + + + میانگیر + + + بایت ها + + + CIDR + + + بسته + + + دروازه پیش فرض + + + حذف... + + + توضیحات + + + DHCP فعال + + + اجاره DHCP منقضی می شود + + + اجاره DHCP اخذ شده است + + + کارگزار DHCP + + + کارگزار(های) DHCP + + + پسوند DNS + + + نشانی IPv4 پویا + + + کارگزار DNS متعلق به IPv4 پویا + + + گام + + + گام ها + + + نام میزبان + + + نشانی IP + + + نشانی های IP + + + IPv4 + + + نشانی IPv4 + + + دروازه-پیش فرض-IPv4 + + + IPv6 + + + نشانی IPv6 + + + Link-local IPv6 address + + + دروازه-پیش فرض-IPv6 + + + بیشینه + + + بیشینه گام ها + + + کمینه کردن پنجره به جای خاتمه دادن برنامه + + + کمینه در سینی به جای نوار وظیفه + + + کمینه + + + نام + + + نشانی شبکه + + + نقاب زیر شبکه جدید یا CIDR + + + خیر + + + اخذ نشانی IP به طور خودکار + + + اخذ نشانی کارگزار DNS به طور خودکار + + + از دست دادن بسته + + + بسته ها منتقل شدند + + + نشانی فیزیکی + + + پروتکل ترجیحی هنگام بازیابی نام میزبان: + + + کارگزار DNS اصلی + + + دریافت شده / از دست رفته + + + بازیابی نام میزبان + + + راه اندازی مجدد نیاز است + + + ذخیره تنظیمات در پوشه برنامه + + + کارگزار DNS ثانویه + + + نمایش + + + برنامه های زیر را هنگام راه اندازی نمایش بده: + + + ابزاری قدرتمند برای مدیریت شبکه ها و عیب یابی مشکلات شبکه! + + + سرعت + + + شروع به صورت کمینه در سینی + + + شروع با ویندوز (کاربر جاری) + + + Static IPv4 address + + + Static IPv4 DNS server + + + Subnet mask + + + Threads + + + زمان + + + زمان 1 + + + زمان 2 + + + زمان 3 + + + Timeout + + + Timeout (ms) + + + زمان (م.ث) انتظار بین هر پینگ + + + TTL + + + Type + + + Use the following DNS server addresses: + + + Use the following IP address: + + + Wake up + + + Yes + + + Add + + + Add a tab to perform a DNS lookup... + + + Add a tab to perform a network scan... + + + Add a tab to perform an SNMP action... + + + اضافه کردن یک سربرگ برای انجام پینگ + + + Add a tab to perform a port scan... + + + Add a tab to perform a trace... + + + Add DNS suffix (primary) to hostname + + + Additional command line + + + Additionals + + + Add profile... + + + Adjust screen automatically + + + Answers + + + The application will be restarted afterwards! + + + Apply + + + Apply Windows key combinations (e.g., ALT+TAB): + + + Auth + + + Authentication level + + + Authorities + + + Automatically update every + + + back + + + Backup + + + Baud + + + The operation has been canceled by the user! + + + Caps lock is enabled! + + + Check for updates at startup + + + Class + + + Clear filter + + + Color depth (bit) + + + Community + + + Configure the path to PuTTY in the settings... + + + Confirm close + + + Are you sure you want to close the application? + + + Connect as... + + + Connect external + + + Connect the network card to a network to configure it! + + + نسخه برداری + + + نسخه برداری به عنوان + + + نسخه برداری... + + + Could not resolve hostname for: "{0}" + + + داده احراز هویت + + + فایل های پروفایل بر روی دیسک با استفاده از پروتکل AES و اندازه کلید 256 بیت و اندازه بلوک 128 بیت در حالت CBC رمزنگاری می شوند. کلید رمزنگاری از گذرواژه اصلی با استفاده از Rfc2898DeriveBytes (PBKDF2) به همراه 1,000,000 تکرار منتج می شود. در زمان اجرا، پس از بارگذاری فایل پروفایل گذرواژه ها به عنوان رشته امن SecureString ذخیره می شوند. برای برخی از توابع، رمز عبور باید به یک رشته معمولی تبدیل شود و تا زمانی که زباله جمع کن آنها را پاک کند، رمزگذاری نشده در حافظه باقی می ماند. + + + سفارشی + + + اندازه صفحه سفارشی: + + + داده ها بروز رسانی شد! + + + داده های احراز هویت باید رمزنگاری گردیده و برای مدیریت آنها بارگذاری شوند. + + + پیش فرض + + + Baud rate + + + درگاه پیش فرض: + + + درگاه RLogin: + + + درگاه SSH + + + درگاه Telnet + + + داده احراز هویت منتخب بطور دائم حذف خواهد شد. + + + حذف ورودی + + + پروفایل منتخب به طور دائمی حذف میگردد. + + + پیکربندی خودکار DNS + + + پرس و جوی DNS + + + کارگزار DNS + + + دامنه + + + جریان + + + ویرایش... + + + فعال سازی + + + فعال سازی فراهم کننده پشتیبانی ایمنی داده احراز هویت + + + End time + + + Enter a subnet to calculate it... + + + Enter subnet and a new subnet mask to create subnets... + + + Couldn't connect to 'api.github.com', check your network connection! + + + Error in response! + + + Error in response! Check if you have write permissions. + + + Expand + + + First usable IP address + + + Fixed screen size: + + + Found + + + Group + + + Height + + + Host + + + Hostname or IP address + + + Hosts + + + ID + + + Inherit host from general + + + IP range + + + Last usable IP address + + + Local IP address + + + Local port + + + MAC address or vendor + + + Magic packet successfully sent! + + + Maximum number ({0}) of hops/router reached! + + + Message size + + + Mode + + + Multicast + + + Multiple instances + + + The network address cannot be reached. Check if your computer is connected to the network. For information about network troubleshooting, see Windows Help. + + + New connection... + + + No DNS record found for "{0}"! Check your input and the settings. + + + No enabled network adapters found! + + + No ports found. Check your input! + + + No profiles found! +Create one... + + + Nothing found! + + + Nothing to do. Check your input! + + + No update available! + + + No valid file found to import. + + + No vendor found. Check your input! + + + Number of errors after which is canceled: + + + Number of stored entries + + + OID + + + Only when using the full screen + + + On the remote computer + + + On this computer + + + Open + + + Open license + + + Open project + + + Open website + + + override + + + Password + + + Passwords do not match! + + + Path + + + Port or service + + + Ports + + + Priv + + + Profile + + + Profiles reloaded + + + Protocol + + + PuTTY process has ended! + + + Questions + + + RAW + + + Recursion + + + Redirect clipboard + + + Redirect devices + + + Redirect drives + + + Redirect ports + + + Redirect printers + + + Redirect smartcards + + + Remaining time + + + Remote IP address + + + Remote port + + + Repeat + + + Resolve CNAME on ANY requests + + + Responses + + + Rlogin + + + Scanned + + + Searched application not found! + + + Searched language not found! + + + Searched setting not found! + + + Security + + + Select a screen resolution + + + This will reset all settings! + + + Serial + + + Serial line + + + Service + + + The found settings file was corrupted or is not compatible with this version! You may report this issue on GitHub. + +A backup of the settings file was created in the settings folder and the settings were reset. + +Profile files are not affected! + + + Show closed ports + + + Show current application title + + + Show only most common query types + + + Show unreachable IP addresses and ports + + + Show statistics + + + SSH + + + Start time + + + State + + + Subnet 1 + + + Subnet 2 + + + Tags + + + Telnet + + + The application can be started without parameters! + + + The following hostnames could not be resolved: + + + The following parameters are available: + + + The following parameters can not be processed: + + + The process can take up some time and resources (CPU / RAM). + + + The settings location is not affected! + + + Timeout on SNMP query. Maybe the host is not reachable or the community / password is wrong. + + + Timeout when querying the DNS server with the IP address "{0}"! + + + Timestamp + + + Trace + + + Unkown error! + + + Untray / Bring window to foreground + + + URL + + + استفاده از داده های احراز هویت + + + Use the current view size as the screen size + + + Use custom DNS server + + + Use custom DNS suffix + + + Use resolver cache + + + User interface locked! + + + Username + + + Vendor + + + Version + + + Version {0} is available! + + + Walk mode + + + Width + + + Profile file could not be decrypted with the given password. + + + The entered password is wrong. + + + Add... + + + Add entry... + + + Calculate + + + Cancel + + + Change + + + Change Master Password... + + + Check + + + Check for updates + + + Closed + + + Continue + + + Custom: + + + Cut + + + Decrypt and load... + + + Delete + + + Delete table + + + Enter location... + + + Everything + + + Filter... + + + Flush DNS cache + + + رمزگشایی و بارگذاری داده های احراز هویت شما برای انتخاب آنها + + + Displays this dialog. + + + Resets all application settings. + + + The password is not displayed when editing, but can be overwritten. + + + [0] If server authentication fails, connect to the computer without warning. +[1] If server authentication fails, do not establish a connection. +[2] If server authentication fails, show a warning and allow me to connect or refuse the connection. +[3] No authentication requirement is specified. + + + Tags help you organize profiles/Profiles by topics/projects. Multiple tags can be used with ";" be separated. Search by tags with "tag=xxx". + + + Hour(s) + + + Location of the import file... + + + Minute(s) + + + Move & Restart + + + Network connections.... + + + (not changed) + + + Off + + + OK + + + On + + + Open location + + + Open settings + + + Overwrite + + + Paste + + + Reconnect + + + Refresh + + + Restart now + + + Save + + + Search... + + + Second(s) + + + Send + + + Set Master Password... + + + Show local licenses + + + Subnet Calculator + + + Validate + + + Connections + + + Enter a valid IP range! + + + Enter a valid IPv4 address! + + + Enter a valid MAC address (e.g., 00:F1:23:AB:F2:35)! + + + Enter a valid port (1 - 65535)! + + + Enter a valid subnetmask (e.g., 255.255.255.0)! + + + Enter a valid subnetmask or CIDR (e.g., 255.255.255.0 or /24)! + + + Field cannot be empty! + + + File does not exists! + + + Folder does not exists! + + + Listeners + + + Amber + + + Appearance + + + Applications + + + Dark + + + Light + + + Black + + + Blue + + + Brown + + + Cobalt + + + Crimson + + + Cyan + + + Emerald + + + Enter one or more valid IP addresses! + + + Enter a valid baud! + + + Enter valid hosts (multiple hosts can not end with ";")! + + + Enter a valid IP address! + + + Enter a valid number! + + + Enter a valid OID! + + + Enter a valid port and/or port range (1 - 65535)! + + + Enter a valid subnet (e.g., 192.168.178.133/26)! + + + Enter a valid website (e.g., https://example.com/index.html) + + + Green + + + Import / Export + + + Indigo + + + Destination host unreachable. + + + Destination network unreachable. + + + Destination port unreachable. + + + Success + + + Request timed out. + + + TTL expired in transit. + + + Key must have 8 characters or more! + + + Lime + + + Magenta + + + Mauve + + + Olive + + + Only numbers can be entered! + + + Orange + + + Pink + + + Purple + + + Red + + + Socket closed. + + + Remote disconnect by server. + + + Decompression error. + + + Connection timed out. + + + Decryption error. + + + DNS name lookup failure. + + + DNS lookup failed. + + + Encryption error. + + + Windows Sockets gethostbyname call failed. + + + Host not found. + + + Internal error. + + + Internal security error. + + + Internal security error. + + + The encryption method specified is not valid. + + + Bad IP address specified. + + + The IP address specified is not valid. + + + Security data is not valid. + + + Server security data is not valid. + + + License negotiation failed. + + + Licensing time-out. + + + Local disconnection. + + + No information is available. + + + Out of memory. + + + Out of memory. + + + Out of memory. + + + Remote disconnect by user. + + + Failed to unpack server certificate. + + + Windows Sockets connect failed. + + + Windows Sockets recv call failed. + + + The account is disabled. + + + The account is expired. + + + The account is locked out. + + + The account is restricted. + + + The received certificate is expired. + + + این سیاست از تفویض داده های احراز هویت به کارگزار مقصد پشیبانی نمی کند. + + + The server authentication policy does not allow connection requests using saved credentials. The user must enter new credentials. + + + Login failed. + + + No authority could be contacted for authentication. The domain name of the authenticating party could be wrong, the domain could be unreachable, or there might have been a trust relationship failure. + + + The specified user has no account. + + + The password is expired. + + + The user password must be changed before logging on for the first time. + + + Delegation of credentials to the target server is not allowed unless mutual authentication has been achieved. + + + The smart card is blocked. + + + An incorrect PIN was presented to the smart card. + + + Timeout occurred. + + + Internal timer error. + + + Windows Sockets send call failed. + + + Sienna + + + Spaces are not allowed! + + + Steel + + + Taupe + + + Closed + + + CloseWait + + + Closing + + + DeleteTcb + + + Established + + + FinWait1 + + + FinWait2 + + + LastAck + + + Listen + + + SynReceived + + + SynSent + + + TimeWait + + + Unkown + + + Teal + + + Violet + + + White + + + Yellow + + + A profile with this name already exists! + + + Closed + + + Open + + + At least one application must be visible! + + + Hidden applications + + + Visible applications + + + Visible applications in the bar: + + + Whois + + + Add a tab to query whois... + + + Enter a valid domain (e.g., "example.com")! + + + Whois server not found for the domain: "{0}" + + + Routing + + + Release + + + Release & Renew + + + Renew + + + Windows DNS settings + + + Delete DNS server + + + The selected DNS server will be deleted permanently. + + + Add DNS server + + + Edit DNS server + + + A DNS server with this name already exists! + + + Restart session + + + TigerVNC + + + Configure the path to TigerVNC in the settings... + + + TigerVNC process has ended! + + + Connecting... + + + Resolve MAC address and vendor + + + Note + + + Export all + + + Export... + + + Export selected + + + Location... + + + File + + + Enter a valid file path! + + + All + + + Format + + + Selected + + + An error occurred while exporting the data. See error message for details: + + + Design + + + Highlight timeouts + + + Enter subnets to create a wide subnet... + + + Wide Subnet + + + Add tab... + + + Add IPv4 address... + + + Add IPv4 address + + + Max. concurrent host threads + + + Max. concurrent port threads + + + PowerShell + + + Configure the path to PowerShell in the settings... + + + PowerShell process has ended! + + + Execution Policy + + + Remote console + + + File path + + + Override default settings + + + Resolve IPv4 address for this host + + + Hide + + + Total bytes received + + + Total bytes sent + + + Download + + + Bandwidth + + + Upload + + + Apply Windows key combinations + + + فراهم کننده پشتیبانی ایمنی داده احراز هویت + + + Background job + + + The background job will save settings and profiles every x-minutes. + +Value 0 will disable this feature. + +Changes to this value will take effect after restarting the application. + + + Run background job every x-minute + + + Your system OS is incompatible with the latest release! + + + Dashboard + + + All settings can be changed later in the settings! + + + Check public IP address + + + Thank you for using NETworkManager! + +If you enjoy it, please consider supporting its development — whether by leaving a star on GitHub, making a donation, or simply sharing it with others. Your support helps keep the project going and growing. + + + When starting the program, it checks in the background whether a new program version is available on GitHub. + +URL: https://api.github.com/ + + + The public IP address is determined via ipify.org. + +URL: https://api.ipify.org and https://api6.ipify.org + + + Privacy + + + Welcome + + + External services + + + Star/Fork the Project on GitHub. + + + Help translate the project on Transifex. + + + Follow or contact me via X. + + + Connection + + + Computer + + + Gateway / Router + + + Internet + + + Check your network adapter configuration (dns) and if your dns server is configured correctly. + + + Check your network adapter configuration (dhcp, static ip) and if you are connected to a network. + + + Could not detect gateway ip address! + + + Could not detect local ip address! + + + Could not get public ip address via WebRequest (http/https) from "{0}"! Check your network connection (firewall, proxy, etc.). + + + No A dns records resolved for "{0}"! + + + No PTR dns record resolved for "{0}"! + + + "{0}" A dns records resolved for "{1}"! + + + PTR dns record resolved for "{0}"! + + + Got "{0}" as public ip address from "{1}"! + + + Resolved "{0}" as hostname for ip address "{1}"! + + + Public IP address check +is disabled! + + + TCP/IP stack is available. "{0}" is reachable via ICMP! + + + TCP/IP stack is not available... "{0}" is not reachable via ICMP! + + + "{0}" detected as gateway ip address! + + + "{0}" detected as local ip address! + + + "{0}" is not reachable via ICMP! + + + "{0}" is reachable via ICMP! + + + Use custom IPv4 address API + + + URL to a web service that can be reached via http or https and returns an IPv4 address e.g., "xx.xx.xx.xx" as response. + + + Could not parse public ip address from "{0}"! Try another service or use the default... + + + Could not connect to "{0}"! + + + IPv4 protocol available + + + IPv6 protocol available + + + نسخه برداری + + + Official + + + Network connection type + + + Desktop background + + + Desktop composition + + + Experience + + + Font smoothing + + + Menu and window animation + + + Performance + + + Persistent bitmap caching + + + Reconnect if the connection is dropped + + + High-speed broadband (2 Mbps - 10 Mbps) + + + Low-speed broadband (256 kbps - 2 Mbps) + + + Detect connection quality automatically + + + LAN (10 Mbps or higher) + + + Modem (56 kbps) + + + Satellite (2 Mbps - 16 Mbps with high latency) + + + WAN (10 Mbps or higher with high latency) + + + Show window contents while dragging + + + Visual styles + + + Remote audio + + + Remote audio playback + + + Remote audio recording + + + Do not record + + + Record from this computer + + + Do not play + + + Play on remote computer + + + Play on this computer + + + Gateway + + + Custom commands + + + Add custom command + + + Arguments + + + Delete custom command + + + Edit custom command + + + Program + + + The selected custom command will be deleted permanently. + + + The following variables are available: + +$$ipaddress$$ --> IP adresse +$$hostname$$ --> Hostname + + + Restart + + + Could not resolve ip address for hostname! + + + Ctrl+Alt+Del + + + Keyboard shortcuts + + + Adjust screen + + + Fullscreen + + + Could not send keystroke! + + + Disconnect + + + Detect local ip address and subnetmask + + + Could not detect subnetmask! + + + Detecting network... + + + Closing in {0} seconds... + + + Network unavailable! + + + IP address to detect local ip address based on routing + + + Show status window on network change + + + Time in seconds how long the status window is shown + + + WiFi + + + Networks + + + Searching for networks... + + + No WiFi adapters found! + + + Searching for WiFi adapters... + + + No WiFi networks found! + + + Channels + + + Channel + + + 2.4 GHz + + + 5 GHz + + + Signal strength + + + Current download speed + + + Current upload speed + + + Measured time + + + Network usage + + + مجموع دانلود + + + مجموع بارگذاری + + + تلاش ها + + + از میانگیر استفاده کن + + + فقط از TCP استفاده کن + + + کلاس پرس و جو + + + نام دامنه + + + مهلت زمانی (ث) + + + Report an issue or create a feature request. + + + Beacon interval + + + رمزنگاری + + + زیرساخت + + + نوع شبکه + + + Phy kind + + + زمان فعال بودن + + + نمایش پیغام خطا + + + نمایش پینگ + + + افزودن میزبان + + + افزودن یک میزبان جهت نمایش + + + مکث + + + ادامه + + + عدم امکان بازیابی نشانی IP برای:"{0}" + + + برنامه راه اندازی مجدد خواهد شد... + + + امکان صدور فایل نیست! پیغام خطا را ببینید:"{0}" + + + فایل به "{0}" صادر شد! + + + امکان ورود فایل نیست! پیغام خطا را ببینید:"{0}" + + + موقعیت در نسخه قابل جابجایی نمی تواند تغییر کند! + + + آیا رمزنگاری شده + + + Open the documentation. + + + مشتری 1 + + + افزودن فایل پروفایل + + + Disable encryption... + + + Edit profile file + + + Enable encryption... + + + Encryption... + + + Profile name already exists! + + + Rename + + + Delete profile file + + + All profiles in this profile file will be permanently deleted! + + + Patch + + + Restart the application to change the language! + + + Currently downloaded + + + Currently uploaded + + + LLDP / CDP + + + Restart as Administrator + + + Analysing network packets requires elevated rights! + + + Capture + + + Device + + + Duration (s) + + + Model + + + VLAN + + + Capture network packets to view LLDP or CDP information! + + + No discovery protocol packages received! + + + Capturing network packages... + + + Discovery Protocol + + + CDP + + + LLDP + + + LLDP / CDP + + + {0} seconds remaining... + + + Help + + + Application that is displayed at startup. + + + Parameter + + + Value + + + Web Console + + + Reload + + + Browser + + + The WebView control (Microsoft Edge) cannot connect to websites with an invalid certificate! + + + Microsoft.Windows.SDK.Contracts is required for this feature but not available on this system (e.g. on Windows Server). + + + ARP Table + + + Connections + + + Dashboard + + + Discovery Protocol + + + DNS Lookup + + + HTTP Headers + + + IP Scanner + + + Listeners + + + Lookup + + + Network Interface + + + پینگ + + + نمایش پینگ + + + Port Scanner + + + PowerShell + + + PuTTY + + + Remote Desktop + + + SNMP + + + Subnet Calculator + + + TigerVNC + + + Traceroute + + + Wake on LAN + + + Web Console + + + Whois + + + WiFi + + + Amber + + + Black + + + Blue + + + Brown + + + Cobalt + + + Crimson + + + Cyan + + + Emerald + + + Green + + + Indigo + + + Lime + + + Magenta + + + Mauve + + + Olive + + + Orange + + + Purple + + + Red + + + Sienna + + + Taupe + + + Teal + + + Pink + + + Yellow + + + Steel + + + General + + + Applications + + + General + + + Appearance + + + Autostart + + + General + + + HotKeys + + + Language + + + Profiles + + + Settings + + + Status + + + Update + + + Window + + + Enable log + + + Log file name + + + Log path + + + Log mode + + + Log + + + SSH log + + + SSH Raw log + + + Session log + + + SSH log + + + SSH and Raw log + + + Enter a valid file name! + + + Lost + + + Received + + + Status change + + + Update available! + + + Private key file + + + Preview + + + Port profiles + + + Add port profile + + + Delete port profile + + + Edit port profile + + + The selected port profile will be deleted permanently. + + + Select port profile + + + Open port profiles... + + + Show SplashScreen on start + + + SplashScreen + + + Download Microsoft Edge WebView2 Runtime + + + Microsoft Edge WebView2 Runtime is not available! + + + Frequency + + + SSID + + + Profile file could not be loaded! + + + The profile file could not be loaded and may be corrupted. You can try to restore the file from a backup or delete it. + +If this happens unexpectedly or after an update, please report the error on GitHub. + + +Error message: +"{0}" + + + Edit group... + + + Decryption error + + + Could not decrypt file. You may report this issue on GitHub. + + + Encryption error + + + Could not encrpyt file. You may report this issue on GitHub. + + + Current password + + + New password + + + Change master password + + + Unlock profile + + + Unlock the profile file to use the profiles! + + + Disclaimer + + + Merge + + + Use other + + + Move + + + Last scan at {0} + + + Hidden Network + + + Developed and maintained by {0} with the help of the + + + A Simple Public IP Address API + + + AirspacePanel fixes all Airspace issues with WPF-hosted Winforms. + + + Shared Controlz for WPF and ... more + + + DnsClient.NET is a simple yet very powerful and high performant open source library for the .NET Framework to do DNS lookups + + + Dragable and tearable tab control for WPF + + + C# library take care of complex network, IP, IPv4, IPv6, netmask, CIDR, subnet, subnetting, supernet, and supernetting calculation for .NET developers. + + + Simple, flexible, interactive & powerful charts, maps and gauges for .Net + + + A collection of loading indicators for WPF + + + Some awesome icons for WPF and UWP all together... + + + A toolkit for creating Metro / Modern UI styled WPF apps. + + + Json.NET is a popular high-performance JSON framework for .NET + + + A GitHub API client library for .NET + + + Capture and parse CDP and LLDP packets on local or remote computers + + + Sharp SNMP Library - Open Source SNMP for .NET and Mono + + + A collection of all country flags in SVG + + + List of Top-Level-Domains from iana.org, which is used to query whois servers of the TLD from whois.iana.org via port 43 + + + OUI data from ieee.org. + + + Service Name and Transport Protocol Port Number Registry from iana.org. + + + Apache License 2.0 + + + BSD-2-Clause + + + MIT License + + + Unlicense + + + C#/WinRT provides packaged WinRT projection support for the C# language. + + + Runtime for hosting PowerShell + + + The WebView2 control enables you to embed web technologies (HTML, CSS, and JavaScript) in your native applications powered by Microsoft Edge (Chromium). + + + Easily add interactivity to your apps using XAML Behaviors for WPF. + + + Microsoft WebView2 License + + + The current profile file is not encrypted and passwords will stored unencrypted on disk! + +Enable profile file encryption in Settings>Profile to store credentials securely. + + + ICMPv4 + + + ICMPv6 + + + Check is disabled! + + + Enter a valid IPv6 address! + + + Public IPv4 address reachable via ICMP. + + + Public IPv6 address reachable via ICMP. + + + Public IPv4 address + + + Public IPv6 address + + + Use custom IPv6 address API + + + Time to live + + + Chassis Id + + + Management + + + Device description + + + Port description + + + Remove IPv4 address + + + Additional config... + + + Remove IPv4 address... + + + The remote session ended because the total login time limit was reached. This limit is set by the server administrator or by network policies. + + + Enter a valid hostname! + + + Enter a valid hostname and port! + + + Unable to reconnect to the remote session. + + + Migrate + + + Report on GitHub + + + Groups + + + Add group + + + Delete group + + + Selected group and all profiles inside this group will be deleted permanently. + + + The name is already used! + + + Resize + + + Delete profiles + + + Selected profiles will be deleted permanently. + + + Use custom themes + + + Custom themes + + + Reset settings? + + + Settings reset! + + + Instance ID + + + Local connection + + + Local interface + + + log4net is a tool to help the programmer output log statements to a variety of output targets. + + + Enabled + + + Region + + + Profiles and regions to synchronize + + + Default profile + + + Default region + + + Group name cannot start with "{0}"! + + + Check for pre-releases + + + Synchronization is disabled! + + + Command + + + Apply theme to PowerShell console + + + The color of the PowerShell console can be changed to the application theme under Settings > General > Appearance + + + If you enable this option, the default PowerShell console settings in the registry under HKCU:\Console are overridden so that the PowerShell console window matches the application theme. This is a global system setting that may affect the appearance of the normal PowerShell window. + +Only the PowerShell consoles configured in the PowerShell and AWS Session Manager settings are modified. Both Windows PowerShell and PWSH (PowerShell 7 and higher) are supported. + +Click in the upper right corner on the help / documentation button (left of the minimize button) or navigate to https://borntoberoot.net/NETworkManager/Documentation/Settings/Appearance for more details. Here are the values documented which will be adjusted. + +If the option is disabled again, the values are no longer modified. However, the original values are NOT restored. + + + Input cannot end with a ";"! + + + Input does not contain any text! + + + Bit Calculator + + + Bit Calculator + + + Notation + + + Input + + + Unit + + + Bits + + + Gigabits + + + Gigabytes + + + Kilobits + + + Kilobytes + + + Megabits + + + Megabytes + + + Petabits + + + Petabytes + + + Terabits + + + Terabytes + + + Enter a number and select a unit to calculate the units... + + + Network + + + Proxy + + + Resolve IP address for this host (IPv4 is preferred) + + + A valid path to PowerShell should end with "pwsh.exe" or "powershell.exe"! + + + A valid path to PuTTY should end with "PuTTY.exe"! + + + A valid path to TigerVNC should end with "vncviewer-*.exe" or "vncviewer64-*.exe"! + + + SNTP Lookup + + + Move a .NET Framework/.NET Core app runtime components and dependencies into a sub-directory and make it beauty. + + + Add a tab to perform a SNTP lookup... + + + SNTP server(s) + + + URL to a web service that can be reached via http or https and returns an IPv6 address e.g., "xxxx:xx:xxx::xx" as response. + + + IP endpoint + + + Local end time + + + Local start time + + + Network time + + + Offset + + + Round trip delay + + + Server + + + SNTP Lookup + + + Add SNTP server + + + Delete SNTP server + + + The selected SNTP server will be deleted permanently. + + + Edit SNTP server + + + An SNTP server with this name already exists! + + + Enter a valid hostname (e.g., "server-01" or "example.com") or a valid IP address (e.g., 192.168.178.1)! + + + Server(s) + + + Enter master password to unlock the profile file: + + + Unlock profile file + + + Timed out + + + Hostkey + + + The settings will be reset and the application will be restarted afterwards! + + + Settings have been reset! + + + وضعیت پینگ + + + ThreadPool additional min. threads + + + این پیکربندی کمینه تعداد نخ هایی که در استخر نخ برنامه بر حسب تقاضا ایجاد می شوند را مشخص می کند. این می تواند باعث بهبود راندمان گردد به عنوان مثال پویشگر IP یا پویشگر درگاه. + +این مقدار به مقدار پیش فرض کمینه نخ ها (تعداد نخ های پردازشگر مرکزی) اضافه می گردد. مقدار 0 پیکربندی پیش فرض را تغییری نمی دهد. اگر مقدار بیشتر از بیشنه پیش فرض نخ های استخر نخ ها باشد ، این مقدار امورد استفاده قرار میگیرد. + +اگر مقدار بسیار بالا باشد، مشکلات راندمان پیش می آید. + +تغییرات در این مقدار بعد از راه اندازی مجدد برنامه اثر خواهند گذاشت. اینکه آیا مقدار با موفقیت تنظیم شده است را می توان در فایل گزارش زیر مشاهده کرد. + %LocalAppData%\NETworkManager\NETworkManager.log + + + These settings only change the maximum number of concurrently executed threads per host/port scan. Go to Settings > General > General to adjust the (min) threads of the application. + + + Port status + + + جزئیات پینگ + + + No open ports found! + + + Port scan is disabled! + + + Scan ports + + + برنامه "{0}" پیدا نشد. شاید برنامه در تنظیمات مخفی شده باشد؟ + + + پنجره وضعیت + + + نمایش نوار آدرس + + + فعال کردن این پیکربندی پیشنهاد نمی شود. اجرای های مختلف برنامه همان پیکربندی ها و فایل های پروفایل را استفاده می کنند. با بسته شدن آخرین نسخه در حال اجرا ممکن است تغییرات ایجاد شده توسط سایر اجرا ها رونویسی شود. + + + نادیده گرفتن نشانی های محلی + + + فعال کردن کارگزار دروازه + + + روش ورود + + + کارگزار دروازه + + + نام کارگزار + + + اشتراک گذاری داده های احراز هویت دروازه با کامپیوتر راه دور + + + اجازه بده بعداً انتخاب کنم + + + کارت هوشمند یا Windows Hello برای مشتریان تجاری + + + درخواست برای کلمه عبور (NTLM) + + + استفاده از داده های احراز هویت دروازه + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server is temporarily unavailable. Try reconnecting later or contact your network administrator for assistance. + + + Your computer can't connect to the remote computer due to one of the following reasons: 1) The requested Remote Desktop Gateway server address and the server SSL certificate subject name do not match. 2) The certificate is expired or revoked. 3) The certificate root authority does not trust the certificate. Contact your network administrator for assistance. + + + This computer can't verify the identity of the RD Gateway "". It's not safe to connect to servers that can't be identified. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server address requested and the certificate subject name do not match. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server's certificate has expired or has been revoked. Contact your network administrator for assistance. + + + An error occurred while sending data to the Remote Desktop Gateway server. The server is temporarily unavailable or a network connection is down. Try again later, or contact your network administrator for assistance. + + + An error occurred while receiving data from the Remote Desktop Gateway server. Either the server is temporarily unavailable or a network connection is down. Try again later, or contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server address is unreachable or incorrect. Type a valid Remote Desktop Gateway server address. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server is running low on server resources and is temporarily unavailable. Try reconnecting later or contact your network administrator for assistance. + + + The Remote Desktop Gateway server has ended the connection. Try reconnecting later or contact your network administrator for assistance. + + + The Remote Desktop Gateway server administrator has ended the connection. Try reconnecting later or contact your network administrator for assistance. + + + Remote Desktop can't connect to the remote computer "" for one of these reasons: 1) Your user account is not listed in the RD Gateway's permission list 2) You might have specified the remote computer in NetBIOS format (for example, computer1), but the RD Gateway is expecting an FQDN or IP address format (for example, computer1.fabrikam.com or 157.60.0.1). Contact your network administrator for assistance. + + + Remote Desktop can't connect to the remote computer "" for one of these reasons: 1) Your user account is not authorized to access the RD Gateway "" 2) Your computer is not authorized to access the RD Gateway "" 3) You are using an incompatible authentication method (for example, the RD Gateway might be expecting a smart card but you provided a password) Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because your network administrator has restricted access to this RD Gateway server. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the web proxy server requires authentication. To allow unauthenticated traffic to an RD Gateway server through your web proxy server, contact your network administrator. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server reached its maximum allowed connections. Try reconnecting later or contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server does not support the request. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the client does not support one of the Remote Desktop Gateway's capabilities. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server and this computer are incompatible. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because no certificate was configured to use at the Remote Desktop Gateway server. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the RD Gateway server that you are trying to connect to is not allowed by your computer administrator. If you are the administrator, add this Remote Desktop Gateway server name to the trusted Remote Desktop Gateway server list on your computer and then try connecting again. + + + Your computer can't connect to the remote computer because your computer or device did not meet the Network Access Protection requirements set by your network administrator, for one of the following reasons: 1) The Remote Desktop Gateway server name and the server's public key certificate subject name do not match. 2) The certificate has expired or has been revoked. 3) The certificate root authority does not trust the certificate. 4) The certificate key extension does not support encryption. 5) Your computer cannot verify the certificate revocation list. Contact your network administrator for assistance. + + + رایانه شما امکان اتصال به رایانه راه دور را ندارد زیرا نام کاربری و گذرواژه مورد نیاز است برای احراز هویت کارگزار دروازه Remote Desktop به جای داده های احراز هویت کارت هوشمند. + + + رایانه شما امکان اتصال به رایانه راه دور را ندارد زیرا داده های احراز هویت کارت هوشمند مورد نیاز است برای احراز هویت کارگزار دروازه Remote Desktop به جای نام کاربری و گذرواژه. + + + Your computer can't connect to the remote computer because an invalid cookie was sent to the Remote Desktop Gateway server. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the cookie was rejected by the Remote Desktop Gateway server. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server is expecting an authentication method different from the one attempted. Contact your network administrator for assistance. + + + The RD Gateway connection ended because periodic user authentication failed. Try reconnecting with a correct user name and password. If the reconnection fails, contact your network administrator for further assistance. + + + The RD Gateway connection ended because periodic user authorization failed. Try reconnecting with a correct user name and password. If the reconnection fails, contact your network administrator for further assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway and the remote computer are unable to exchange policies. This could happen due to one of the following reasons: 1. The remote computer is not capable of exchanging policies with the Remote Desktop Gateway. 2. The remote computer's configuration does not permit a new connection. 3. The connection between the Remote Desktop Gateway and the remote computer ended. Contact your network administrator for assistance. + + + The RD Gateway connection ended because periodic user authorization failed. Your computer or device didn't pass the Network Access Protection (NAP) requirements set by your network administrator. Contact your network administrator for assistance. + + + Connected + + + Error while scanning WiFi adapter "{0}" with error: "{1}" + + + Connect... + + + {0} disconnected! + + + Connect to {0} + + + WPS + + + Connect automatically + + + Pre-shared key + + + Connecting to {0}... + + + Could not connect to {0} ({1})! + + + Successfully connected to {0}! + + + Access to the network has been revoked + + + داده های احراز هویت بی اعتبار + + + Network not available + + + Successful + + + Connection attempt timed out + + + -/- + + + Authentication protocol is not supported! + + + Checking WPS... + + + Open OID profiles... + + + MIB + + + OID profiles + + + Select OID profile + + + Add OID profile + + + Delete OID profile + + + The selected OID profile will be deleted permanently. + + + Edit OID profile + + + Enter password... + + + Add tab + + + (from profile) + + + New subnet mask + + + Add server + + + SNTP server + + + The settings on this page contain errors. Correct them to be able to save. + + + SSH hostkey to use for the connection (e.g., "71:b8:f2:6e..."). Only available if the mode is "SSH". + + + Full path to the private key file (e.g., "C:\Users\BornToBeRoot\SSH\private_key.ppk"). Only available if the mode is "SSH". + + + Username that will be passed into the PuTTY session. Only available if the mode is "SSH", "Telnet" or "Rlogin". + + + ASN + + + AS Name + + + City + + + Continent + + + Country + + + Currency + + + District + + + DNS resolver + + + EDNS + + + Geolocation + + + Hosting + + + IP geolocation + + + ISP + + + Latitude + + + Longitude + + + Mobile + + + Organization + + + PTR record + + + ناحیه زمانی + + + Zip + + + IP Geolocation API - Fast, accurate, reliable + + + Check DNS resolver + + + Check IP geolocation + + + The DNS resolver is determined via ip-api.com. + +URL: https://edns.ip-api.com/ + + + The IP geolocation is determined via ip-api.com. + +URL: http://ip-api.com/ + + + To provide additional features, third party services are used that are not operated by me. You can deselect them below. No data is transferred to me at any time. + + + Checking DNS resolver... + + + Checking IP geolocation... + + + Check your network connection and try again in a few seconds. + + + ip-api.com rate limit reached (too many requests from your network)! +Try again in a few seconds. + + + HTTP status code + + + Steel + + + Rate limit reached! Try again in {0} seconds... + + + عمومی + + + BSSID + + + No reachable hosts found! + + + Application + + + Enable experimental features to test new functions. These are not yet complete, contain bugs, can crash the application and may change again until release. + + + Experimental features + + + Experimental + + + Run command... + + + IP Geolocation + + + Add a tab to query the IP geolocation... + + + Enter a domain to query whois... + + + Enter host to query IP geolocation... + + + Unknown user name. + + + Authentication failure (incorrect password, community or key). + + + The operation was successful without any errors. + + + The response to your request was too large to fit into a single response! + + + The requested OID could not be found! + + + A read-write or write-only object was set to an inconsistent value! + + + The requested OID does not exist and is not writable! + + + An error occurred for which no specific message is available! + + + The requested object is not accessible for modification! + + + The object was set to an incompatible data type! + + + The value assigned to the object exceeds its maximum length! + + + The encoding used for the object is incorrect! + + + The value assigned to the object is not a valid choice! + + + The requested object does not exist and cannot be created! + + + The MIB variable is currently in an inconsistent state and cannot be modified! + + + There are no available system resources to perform the requested operation! + + + An error occurred during the set operation! + + + A set operation failed, and previous changes could not be rolled back! + + + Authentication failed. Please check the community string! + + + The requested object is not writable and cannot be modified! + + + The object's state is inconsistent, preventing the set operation! + + + Close all + + + Expand host view + + + Host cannot be set while other hosts are being added. Please wait until the process is complete and try again. + + + Run command... (Ctrl+Shift+P) + + + No matching commands! + + + Remote hostname + + + Process ID + + + Process path + + + Process name + + + NetBIOS + + + Computer name + + + Error + + + OK + + + Warning + + + Group / domain name + + + NetBIOS reachable + + + Scan for NetBIOS + + + NetBIOS scan is disabled! + + + Resolve Hostname is disabled! + + + Resolve MAC address is disabled! + + + Close group + + + Run command... (Ctrl+Shift+P) + + + Profile files + + + Open settings... + + + Expand and open search... + + + Starting with Windows 11 24H2, you’ll need to allow access to the Wi-Fi adapter. + +Open Windows Settings > Privacy & security > Location, enable access for Desktop Apps / NETworkManager, then restart the application. + + + Drag and drop the applications to reorder them. +Right-click for more options. + + + Restore defaults + + + An easy to use drag'n'drop framework for WPF. + + + BSD-3-Clause + + + Set default + + + Ubuntu Server running Docker with Nextcloud and Traefik... + + + Linux servers running in AWS... + + + 6 GHz + + + Support this project with a donation. + + + بازکردن اسناد + + + Donate + + + Profile file + + + Hosts File Editor + + + Hosts File Editor + + + Read-only mode. Modifying the hosts file requires elevated rights! + + + Comment + + + Disable + + + Edit entry + + + Edit entry... + + + Enable entry + + + Disable entry + + + Refreshing... + + + Reloaded at {0} + + + Failed to load hosts file: {0} + + + Retrying in {0} seconds... + + + What's new? + + + Changelog + + + Upgraded to {0} + + + This release includes new features, improvements, and bug fixes. Check out the changelog for all the details! + + + Entries + + + The selected entry is permanently deleted: + +{0} {1} {2} + + + Primary DNS server + + + Enter a valid hostname (e.g., "server-01" or "example.com")! Multiple hostnames can be separated with a space. + + + The "hosts" file could not be read! See log file for more details. + + + The "hosts" file could not be written to. See log file for more details. + + + The entry was not found in the "hosts" file! Maybe the file has been modified. + + + A backup of the "hosts" file could not be created! See log file for more details. + + + Show status bar + + + Displays the status bar in the bottom-left of the WebView when hovering over a link. + + + Save credentials + + + Displays a dialog to save credentials after a successful sign-in. + + + Delete browsing data + + + Permanently delete browsing data (history, cookies, cache, credentials, etc.) for the current WebView2 profile. + + + Browsing Data + + + Browsing data successfully deleted! + + + An error occurred while deleting browsing data. Feel free to report this issue on GitHub. + + + production + + + Add tag + + + Apply filter + + + Filter profiles... + + + Filter by tags + + + No tags found! + + + Match + + + Any + + + Add group... + + + Expand all + + + Collapse all + + + Use custom themes to personalize the appearance of the application. You can edit or add theme in the "Program Folder > Themes" directory. For more details, refer to the documentation. + + + Admin (console) session + + + Profile file "{0}" will be deleted permanently. + + + Enable encryption? + + + Do you want to enable profile file encryption to protect sensitive data such as hosts, IP addresses, URLs, and stored credentials? + +You can enable or disable encryption later at any time by right-clicking the profile file to manage encryption settings. +If you click Cancel, the profile file will remain unencrypted. + + + A restart is required to apply changes such as language settings. + + + Could not parse or resolve any of the specified DNS servers. + + + Could not parse "{0}". + + + Maximum number of backups + + + Create daily backup + + + Number of backups that are retained before the oldest one is deleted. + + + This setting is managed by your administrator. + + + Restore default location + + + Restore + + + Restore default location? + + + The default settings location is restored and the application is restarted afterwards. + +You can copy the “settings.json” file from "{0}" to "{1}" to migrate your previous settings, if necessary. The application must be closed for this to prevent the settings from being overwritten. + + + Change location? + + + The settings location is changed and the application is restarted afterwards. + +You can copy the “settings.json” file from "{0}" to "{1}" to migrate your previous settings, if necessary. The application must be closed for this to prevent the settings from being overwritten. + + + Enter a valid folder path! + + + The profiles location is changed and the application is restarted afterwards. + +You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. + + + The default profiles location is restored and the application is restarted afterwards. + +You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. + + diff --git a/Source/NETworkManager.Localization/Resources/Strings.fr-FR.resx b/Source/NETworkManager.Localization/Resources/Strings.fr-FR.resx index ddf921a044..dcdd807222 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.fr-FR.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.fr-FR.resx @@ -138,8 +138,32 @@ ARP - - Table ARP + + Neighbor Table + + + Read-only mode. Modifying the neighbor table requires elevated rights! + + + Unreachable + + + Incomplete + + + Probe + + + Delay + + + Stale + + + Reachable + + + Permanent Authentification @@ -285,12 +309,24 @@ Interface réseau + + Configuration applied + + + Configuring the network interface requires elevated rights! + Nouvel onglet + + Next + OUI + + Options + Écraser? @@ -348,9 +384,6 @@ Paramètres - - Les paramètres ont été mis à zéro - SNMP @@ -444,6 +477,18 @@ Description + + Placeholder + + + Path to the file or executable to run. The following placeholders can be used: + + + Arguments passed to the file or executable. The following placeholders can be used: + + + The following placeholder can be used: + DHCP activé @@ -489,6 +534,30 @@ Adresse IPv4 + + IPv4 address added + + + IPv4 address removed + + + IPv4 address released and renewed + + + IPv4 address released + + + IPv4 address renewed + + + IPv6 address released and renewed + + + IPv6 address released + + + IPv6 address renewed + Adresse par défaut IPv4 @@ -504,11 +573,23 @@ Passerelle par défaut IPv6 + + Map + + + (+{0} more) + + + Scroll = Zoom, Drag = Pan + + + Unknown + Maximum - - Maximum de sauts/routage + + Sauts maximums Minimiser la fenêtre principale au lieu de mettre fin à l'application @@ -561,9 +642,6 @@ Redémarrage requis - - Certains paramètres ne sont appliqués qu'après redémarrage de l'application! - Enregistrer les paramètres dans le dossier d'application @@ -577,7 +655,7 @@ Affichez l'application suivante au démarrage: - Un outil puissant pour gérer les réseaux et résoudre les problèmes de réseau! + A powerful open-source tool for managing networks and troubleshooting network problems! Vitesse @@ -594,12 +672,9 @@ Serveur DNS IPv4 statique - + Masque de sous-réseau - - Masque de sous-réseau ou CIDR - Fils de Discussions @@ -621,8 +696,8 @@ Délai d'attente (ms) - - Temps d'attente entre chaque ping + + Temps (ms) d'attente entre chaque ping TTL @@ -663,9 +738,6 @@ Ajouter un onglet pour effectuer une trace… - - Ajouter un onglet pour interroger les en-têtes HTTP… - Ajouter suffixe DNS (principal) au nom d'hôte @@ -691,7 +763,7 @@ Appliquer - Appliquer combinaisons de touches Windows (par ex: ALT+TAB): + Appliquer les combinaisons de touches Windows (par ex: ALT+TAB): Auth @@ -720,6 +792,9 @@ Verrouillage des majuscules est activé! + + Chart time (seconds) + Vérifiez mises à jour au démarrage @@ -810,7 +885,7 @@ First make a backup copy of your profile files before enabling encryption!Supprimer l'entrée - Selected profile will be deleted permanently. + Le profil choisi sera supprimé définitivement. Auto-configuration DNS @@ -821,9 +896,6 @@ First make a backup copy of your profile files before enabling encryption! Serveur DNS - - Ouvrir la documentation - Domaine @@ -842,8 +914,8 @@ First make a backup copy of your profile files before enabling encryption! Heure de fin - - Entrez un sous-réseau pour le calculer… + + Entrez un sous-réseau pour le calculer... Entrez sous-réseau et un nouveau masque de sous-réseau pour créer des sous-réseaux … @@ -866,9 +938,6 @@ First make a backup copy of your profile files before enabling encryption! Taille d'écran fixe: - - Lancer/faire aboutir le projet sur GitHub - Trouvé @@ -891,7 +960,7 @@ First make a backup copy of your profile files before enabling encryption!ID - Inherit host from general + Hériter d'un hôte général Plage IP @@ -969,6 +1038,9 @@ Créez-en un… OID + + Only CSV files are allowed! + Uniquement en utilisant le plein écran @@ -993,12 +1065,6 @@ Créez-en un… passer outre - - Écraser les paramètres dans le dossier de destination? - -"Écraser" écrasera le fichier dans le dossier de destination. -"Utiliser autre" utilisera le fichier de paramètres existant dans la destination et redémarrera l'application. - Mots de passe @@ -1029,9 +1095,6 @@ Créez-en un… Le processus PuTTY est terminé! - - Profil PuTTY - Questions @@ -1045,7 +1108,7 @@ Créez-en un… Rediriger le presse-papiers - Rediriger les dispositifs + Rediriger les périphériques Rediriger les lecteurs @@ -1098,18 +1161,6 @@ Créez-en un… Sélectionnez une résolution d'écran - - Les paramètres sélectionnés sont écrasés! - - - Les paramètres sélectionnés sont réinitialisés. - - - Sélectionnez les paramètres que vous souhaitez exporter: - - - Sélectionnez les paramètres que vous souhaitez importer: - Cela réinitialisera tous les paramètres! @@ -1117,23 +1168,17 @@ Créez-en un… Série - Ligne de série + Ligne série Service - Le fichier de paramètres trouvé était corrompu ou n'est pas compatible avec cette version. Tous les paramètres ont été réinitialisés! -(Les fichiers de profil ne sont pas affectés!) - - - Paramètres exportés avec succès! - - - Paramètres importés avec succès! - - - Réinitialisation des paramètres réussie! + Le fichier de paramètres trouvé était corrompu ou n'est pas compatible avec cette version ! Vous pouvez signaler ce problème sur GitHub. + + Une sauvegarde du fichier de paramètres a été créée dans le dossier Paramètres et les paramètres ont été réinitialisés. + +Les fichiers de profil ne sont pas affectés! Afficher les ports fermés @@ -1144,8 +1189,8 @@ Créez-en un… Afficher uniquement les types de requête les plus courants - - Afficher le résultat de l'analyse pour toutes les adresses IP + + Afficher les adresses IP et les ports inaccessibles Afficher les statistiques @@ -1190,7 +1235,7 @@ Créez-en un… L'emplacement des paramètres n'est pas affecté - Délai d'attente sur requête SNMP. + Délai d'expiration sur la requête SNMP. Peut-être que l'hôte n'est pas joignable ou que la communauté/le mot de passe est erroné. Délai d'attente lors de l'interrogation du serveur DNS avec l'adresse IP "{0}"! @@ -1204,8 +1249,8 @@ Créez-en un… Erreur inconnue! - - Démonter/Mettre la fenêtre en avant + + Détacher / Mettre la fenêtre au premier plan URL @@ -1309,6 +1354,9 @@ Créez-en un… Vider le cache DNS + + DNS cache flushed + Décryptez et chargez vos justificatifs d'identité pour les sélectionner. @@ -1366,12 +1414,12 @@ Créez-en un… Écraser + + Parse + Coller - - C:\Program Files\PuTTY\putty.exe - Reconnectez-vous @@ -1415,16 +1463,16 @@ Créez-en un… Entrez une adresse IPv4 valide! - Entrez une adresse MAC valide (comme 00: F1: 23: AB: F2: 35)! + Entrez une adresse MAC valide (par ex: 00:F1:23:AB:F2:35)! Entrez un port valide (1 - 65535)! - Entrez un masque de sous-réseau valide (comme 255.255.255.0)! + Entrez un masque de sous-réseau valide (par ex: 255.255.255.0)! - Entrez un masque de sous-réseau ou CIDR valide (comme 255.255.255.0 ou / 24)! + Entrez un masque de sous-réseau ou un CIDR valide (par ex: 255.255.255.0 ou /24)! Le champ ne peut pas être vide! @@ -1496,10 +1544,10 @@ Créez-en un… Entrez un port et/ou une plage de ports valide (1 - 65535)! - Entrez un sous-réseau valide (comme 192.168.178.133/26)! + Entrez un sous-réseau valide (par ex: 192.168.178.133/26)! - Entrez un site web valide (comme https://example.com/index.html) + Entrez un site web valide (ex: https://example.com/index.html) Vert @@ -1534,6 +1582,9 @@ Créez-en un… Citron vert + + Live + Magenta @@ -1762,9 +1813,6 @@ Créez-en un… Jaune - - Entrez une valeur valide entre 25 et 100! - Un profil avec ce nom existe déjà! @@ -1793,7 +1841,10 @@ Créez-en un… Ajouter un onglet pour interroger whois… - Entrez un domaine valide (comme "exemple.com")! + Entrez un domaine valide (ex: "exemple.com")! + + + Enter a valid Windows username (e.g., "user", "DOMAIN\user" or "user@domain.com")! Serveur Whois non trouvé pour le domaine: "{0}" @@ -1837,9 +1888,6 @@ Créez-en un… Configurez chemin d'accès à TigerVNC dans paramètres… - - Emplacement TigerVNC… - Le processus TigerVNC est terminé! @@ -1903,11 +1951,11 @@ Créez-en un… Ajouter une adresse IPv4 - - Fil de discussion de l'hôte + + Max. threads hôtes simultanés - - Ports fils de discussion + + Max. threads de port simultanés PowerShell @@ -1924,9 +1972,6 @@ Créez-en un… Console à distance - - Emplacement de PowerShell… - Chemin du fichier @@ -1964,11 +2009,11 @@ Créez-en un… Travail de fond - Le travail en arrière-plan permettra de sauvegarder les paramètres, les profils et les informations d'identification toutes les x minutes. + La tâche en arrière-plan enregistrera les paramètres et les profils toutes les x minutes. La valeur 0 désactivera cette fonction. -Modification de cette valeur nécessite un redémarrage de l'application pour prendre effet. +Les modifications de cette valeur prendront effet après le redémarrage de l'application. Exécuter un travail en arrière-plan toutes les x minutes @@ -1980,15 +2025,15 @@ Modification de cette valeur nécessite un redémarrage de l'application pour pr Tableau de bord - Tous paramètres peuvent être modifiés ultérieurement dans paramètres + Tous les paramètres peuvent être modifiés plus tard dans les paramètres ! Vérifier l'adresse IP publique - - Merci d'utiliser NETworkManager! + + Merci d'utiliser NETworkManager ! -Pour offrir des fonctionnalités supplémentaires, l'application utilise des services sur Internet qui ne sont pas exploités par moi. Aucune donnée ne me sera envoyée à aucun moment. +Si vous appréciez cet outil, pensez à soutenir son développement, que ce soit en lui attribuant une étoile sur GitHub, en faisant un don ou simplement en le partageant avec d'autres. Votre soutien contribue à la poursuite et au développement du projet. Lors du démarrage du programme, il vérifie en arrière-plan si une nouvelle version du programme est disponible sur GitHub. @@ -1998,7 +2043,7 @@ URL: https://api.github.com/ L'adresse IP publique est déterminée via ipify.org. -URL: https://api.ipify.org/ +URL: https://api.ipify.org ou https://api6.ipify.org Vie privée @@ -2009,14 +2054,14 @@ URL: https://api.ipify.org/ Services extérieurs - - Star/Fork le Projet sur GitHub. + + Star/Fork the Project on GitHub. - - Aidez à traduire le projet sur Transifex. + + Help translate the project on Transifex. - - Contact via Twitter. + + Follow or contact me via X. Connexion @@ -2036,15 +2081,6 @@ URL: https://api.ipify.org/ Vérifiez la configuration de votre carte réseau (DHCP, IP statique) et si vous êtes connecté à un réseau. - - Erreur - - - OK - - - Attention - Impossible de détecter l'adresse IP de la passerelle! @@ -2097,8 +2133,8 @@ est désactivée! Utiliser API d'adresse IPv4 personnalisée - - URL vers un service Web accessible via http ou https et renvoie une adresse IP en réponse. + + URL vers un service Web accessible via http ou https et renvoyant une adresse IPv4, par ex: "xx.xx.xx.xx" en réponse. Impossible d'analyser l'adresse IP publique depuis "{0}"! Essayez un autre service ou utilisez la valeur par défaut… @@ -2172,6 +2208,12 @@ est désactivée! Styles visuels + + View only + + + Block keyboard and mouse input to the remote session + Audio à distance @@ -2217,24 +2259,39 @@ est désactivée! Programme + + Private + + + Public + Commande personnalisée sélectionnée sera supprimée définitivement. - - Variables suivantes sont disponibles: - -$$ipaddress$$ --> IP adresse -$$hostname$$ --> Hostname - Redémarrer - - Impossible de résoudre l'adresse IP pour le nom d'hôte! + + Impossible de résoudre l'adresse IP du nom d'hôte ! Ctrl+Alt+Sup + + Task Manager (Ctrl+Shift+Esc) + + + Lock (Win+L) + + + Show Desktop (Win+D) + + + Explorer (Win+E) + + + Run dialog (Win+R) + Raccourcis clavier @@ -2271,8 +2328,8 @@ $$hostname$$ --> Hostname Afficher fenêtre d'état lors d'un changement de réseau - - Temps en secondes pendant combien de temps la fenêtre doit être affichée + + Durée en secondes d'affichage de la fenêtre d'état Wi-Fi @@ -2298,12 +2355,18 @@ $$hostname$$ --> Hostname Canal + + Channel width + 2.4 GHz 5 GHz + + 2.4 & 5 GHz + Intensité du signal @@ -2343,11 +2406,8 @@ $$hostname$$ --> Hostname Délai (s) - - Signaler un problème ou créer une demande de fonctionnalité - - - Signaler un problème ou créer une demande de fonctionnalité. + + Report an issue or create a feature request. Intervalle des balises @@ -2388,12 +2448,39 @@ $$hostname$$ --> Hostname Impossible de résoudre l'adresse IP pour: "{0}" + + Notification + + + Show notification popup on status change + + + Play sound on status change + + + Success threshold + + + Number of consecutive successful pings required before a "Host is up" notification is shown. Higher values reduce noise from flapping hosts. + + + Failure threshold + + + Number of consecutive failed pings (timeouts) required before a "Host is down" notification is shown. Higher values reduce noise from flapping hosts. + + + Display duration (seconds) + + + Host is up + + + Host is down + L'application sera relancée… - - Utiliser un autre dossier - Impossible d'exporter fichier! Voir message d'erreur: "{0}" @@ -2409,8 +2496,8 @@ $$hostname$$ --> Hostname Est crypté - - Ouvrir la documentation sur GitHub. + + Open the documentation. Client 1 @@ -2439,9 +2526,6 @@ $$hostname$$ --> Hostname Supprimer le fichier de profil - - Fichier de profil sélectionné sera supprimé définitivement. - Tous profils du fichier de profil seront supprimés définitivement! @@ -2464,7 +2548,7 @@ $$hostname$$ --> Hostname Redémarrer en tant qu'administrateur - Pour analyser les paquets du réseau, l'application doit être lancée avec des droits élevés! + L'analyse des paquets réseau nécessite des droits élevés! Capture @@ -2493,13 +2577,13 @@ $$hostname$$ --> Hostname Protocole de découverte - + CDP - + LLDP - + LLDP / CDP @@ -2532,8 +2616,8 @@ $$hostname$$ --> Hostname Microsoft.Windows.SDK.Contracts est requis pour cette fonctionnalité mais n'est pas disponible sur ce système (par ex: sur Windows Server). - - Table ARP + + Neighbor Table Connexions @@ -2670,133 +2754,46 @@ $$hostname$$ --> Hostname Jaune - + Acier - + Général - - Recherche DNS - - - En-têtes HTTP - - - Scanner IP - - - Interface réseau - - - Ping - - - Ping Moniteur - - - Port Scanner - - - PowerShell - - - PuTTY - - - Bureau à distance - - - TigerVNC - - - Traceroute - - - Wake on LAN - - - Console Web - - - Whois - - + Applications - + Général - + Apparence - + Démarrage auto - - Tableau de bord - - - Recherche DNS - - + Général - - Raccourcis - - - En-têtes HTTP - - - Scanner IP + + Raccourcis clavier - + Langage - - Ping Moniteur - - - Port Scanner - - - PowerShell - - + Profils - - PuTTY - - - Bureau à distance - - + Paramètres - - SNMP - - + Statut - - TigerVNC - - - Traceroute - - + Mise à jour - - Wake On LAN - - - Whois - - + Fenêtre @@ -2889,13 +2886,17 @@ $$hostname$$ --> Hostname SSID - - Profil n'a pas pu être chargé! + + Le fichier de profil n’a pas pu être chargé ! - - If this happened after an update, you may need to migrate the profiles to a newer version. When you click "Migrate", a PowerShell window opens with the migration script. Check the path and press Enter. + + Le fichier de profil n'a pas pu être chargé et est peut-être corrompu. Vous pouvez tenter de restaurer le fichier à partir d'une sauvegarde ou de le supprimer. + +Si cela se produit de manière inattendue ou après une mise à jour, signalez l'erreur sur GitHub. + -Otherwise, the profile may be corrupted and you want to report the issue on GitHub. + Message d'erreur : +"{0}" Éditer le groupe... @@ -2925,7 +2926,7 @@ Otherwise, the profile may be corrupted and you want to report the issue on GitH Déverrouiller le profil - Unlock the profile file to use the profiles! + Débloquez le fichier de profil pour utiliser les profils ! Clause de non-responsabilité @@ -2933,25 +2934,12 @@ Otherwise, the profile may be corrupted and you want to report the issue on GitH Fusionner - - Le dossier de destination contient déjà des fichiers. Si vous cliquez sur Fusionner, les profils actuels sont copiés dans le dossier. - - - Overwrite profiles in destination folder? - -"Overwrite" will copy the profile files to the destination folder and overwrite existing profile files. -"Merge" will copy the profile files to the destination folder, but won't overwrite exitsting profile files. -"Use other folder" will use the existing profile files in the destination folder. - Utiliser autre Déplacer - - Les fichiers de profil seront déplacés vers dossier de destination sélectionné. - Dernier scan à {0} @@ -2980,7 +2968,7 @@ Otherwise, the profile may be corrupted and you want to report the issue on GitH La bibliothèque C# prend en charge les calculs complexes de réseau, IP, IPv4, IPv6, masque de réseau, CIDR, sous-réseau, sous-réseau, sur-réseau et sur-réseau pour les développeurs .NET. - Graphiques, cartes et jauges simples, flexibles, interactifs et puissants pour .Net + Beautiful, interactive charts, maps, and gauges. Une collection d'indicateurs de chargement pour WPF @@ -3009,8 +2997,11 @@ Otherwise, the profile may be corrupted and you want to report the issue on GitH Liste des domaines de premier niveau de iana.org, qui est utilisée pour interroger les serveurs whois du TLD à partir de whois.iana.org via le port 43 + + GeoJSON conversion of Natural Earth vector map data (CC0-1.0). + - Données IEEE OUI désinfectées de linuxnet.ca. + Données OUI provenant de ieee.org. Registre des noms de service et des numéros de port du protocole de transport sur iana.org. @@ -3060,10 +3051,10 @@ Activez le cryptage des fichiers de profil dans Paramètres> Profil pour stoc Entrez une adresse IPv6 valide! - Adresse IPv4 accessible au public. + Adresse publique IPv4 accessible via ICMP. - Adresse IPv6 accessible au public. + Adresse publique IPv6 accessible via ICMP. Adresse IPv4 publique @@ -3111,36 +3102,1395 @@ Activez le cryptage des fichiers de profil dans Paramètres> Profil pour stoc Impossible de se reconnecter à la session distante. - Migrate + Migrer - Report on GitHub + Rapport sur GitHub - Groups + Groupes - Add group + Ajouter un groupe - Delete group + Supprimer le groupe - Selected group and all profiles inside this group will be deleted permanently. + Le groupe sélectionné et tous les profils de ce groupe seront définitivement supprimés. - The name is already used! + Le nom est déjà utilisé ! - Resize + Redimensionner - Delete profiles + Supprimer des profils - Selected profiles will be deleted permanently. + Les profils sélectionnés seront définitivement supprimés. + + + Utiliser des thèmes personnalisés + + + Thèmes personnalisés + + + Réinitialiser les paramètres ? + + + Paramètres réinitialisés ! + + + ID d'instance + + + Connexion locale + + + Interface locale + + + log4net est un outil pour aider le programmeur à produire des instructions de journal vers une variété de cibles de sortie. + + + Activée + + + Région + + + Profils et régions à synchroniser + + + Profil par défaut + + + Région par défaut + + + Le nom du groupe ne peut pas commencer par "{0}"! + + + Vérifiez les pré-versions + + + La synchronisation est désactivée! + + + Commande + + + Appliquer le thème à la console PowerShell + + + La couleur de la console PowerShell peut être changée en thème d'application sous Paramètres > Général > Apparence + + + If you enable this option, the default PowerShell console settings in the registry under HKCU:\Console are overridden so that the PowerShell console window matches the application theme. This is a global system setting that may affect the appearance of the normal PowerShell window. + +Only the PowerShell consoles configured in the PowerShell settings are modified. Both Windows PowerShell and PWSH (PowerShell 7 and higher) are supported. + +Click in the upper right corner on the help / documentation button (left of the minimize button) or navigate to https://borntoberoot.net/NETworkManager/Documentation/Settings/Appearance for more details. Here are the values documented which will be adjusted. + +If the option is disabled again, the values are no longer modified. However, the original values are NOT restored. + + + La saisie ne peut pas se terminer par un ";"! + + + L'entrée ne contient aucun texte! + + + Calculatrice de bits + + + Calculatrice de bits + + + Notation + + + Entrée + + + Unité + + + Bits + + + Gigabits + + + Gigaoctets + + + Kilobits + + + Kilooctets + + + Megabits + + + Megaoctets + + + Petabits + + + Petaoctets + + + Terabits + + + Teraoctets + + + Entrez un nombre et sélectionnez une unité pour calculer les unités... + + + Réseau + + + Proxy + + + Résoudre l'adresse IP de cet hôte (IPv4 est préféré) + + + Un chemin valide vers PowerShell doit se finir par "pwsh.exe" ou "powershell.exe"! + + + Un chemin valide vers PuTTY doit se finir par "PuTTY.exe"! + + + Un chemin valide vers TigerVNC doit se finir par "vncviewer-*.exe" ou "vncviewer64-*.exe"! + + + SNTP Lookup + + + Déplacez les composants et les dépendances d'exécution d'une application .NET Framework/.NET Core dans un sous-répertoire et embellissez-le. + + + Ajouter un onglet pour effectuer une recherche SNTP... + + + Serveur(s) SNTP + + + URL vers un service Web accessible via http ou https et renvoyant une adresse IPv6, par ex: "xxxx:xx:xxx::xx" en réponse. + + + Point final IP + + + Heure de fin locale + + + Heure de début locale + + + Heure du réseau + + + Compensation + + + Retard aller-retour + + + Serveur + + + SNTP Lookup + + + Ajouter un serveur SNTP + + + Supprimer un serveur SNTP + + + Le serveur SNTP sélectionné sera supprimé définitivement. + + + Modifier le serveur SNTP + + + Un serveur SNTP portant ce nom existe déjà! + + + Entrez un nom d'hôte valide (par ex: "server-01" ou "example.com") ou une adresse IP valide (par exemple, 192.168.178.1)! + + + Serveur(s) + + + Entrez le mot de passe principal pour débloquer le fichier de profil: + + + Débloquez le fichier de profil + + + Délai expiré + + + Clé d'hôte + + + Les paramètres seront réinitialisés et l'application sera redémarrée ensuite! + + + Les paramètres ont été mis à zéro + + + État du ping + + + ThreadPool supplémentaire min. fils + + + Ce paramètre spécifie le nombre minimum de threads qui seront créés à la demande depuis ThreadPool de l'application. Cela peut améliorer les performances, par exemple, du scanner IP ou du scanner de port. + +La valeur est ajoutée au nombre minimum de threads par défaut (nombre de threads CPU). La valeur 0 laisse les paramètres par défaut. Si la valeur est supérieure au nombre maximum de threads par défaut du ThreadPool, cette valeur est utilisée. + +Si la valeur est trop élevée, des problèmes de performances peuvent survenir. + +Les modifications apportées à cette valeur prendront effet après le redémarrage de l'application. La définition réussie de la valeur peut être vérifiée dans le fichier journal sous %LocalAppData%\NETworkManager\NETworkManager.log + + + Ces paramètres modifient seulement le nombre maximal de threads exécutés simultanément par analyse d'hôte/port. Accédez à Paramètres > Général > Général pour ajuster les (min) threads de l’application. + + + État du port + + + Détails du ping + + + Aucun port ouvert trouvé! + + + Analyse des ports est désactivée! + + + Scanner les ports + + + Impossible de trouver l'application "{0}". Peut-être que l'application était masquée dans les paramètres ? + + + État de la fenêtre + + + Afficher la barre d'adresse + + + Il n’est pas recommandé d’activer ce paramètre. Plusieurs instances de l'application partagent les mêmes paramètres et fichiers de profil. La dernière instance fermée peut écraser les modifications apportées par d'autres instances. + + + Contourner les adresses locales + + + Activer le serveur de passerelle + + + Méthode de connexion + + + Serveur passerelle + + + Nom du serveur + + + Partager les identifiants de la passerelle avec un ordinateur distant + + + Laissez-moi choisir plus tard + + + Carte à puce ou Windows Hello Entreprise + + + Demander mot de passe (NTLM) + + + Utiliser les identifiants de passerelle + + + Votre ordinateur ne peut pas se connecter à l'ordinateur distant car le serveur de passerelle Bureau à distance est temporairement indisponible. Essayez de vous reconnecter plus tard ou contactez votre administrateur réseau pour obtenir de l'aide. + + + Votre ordinateur ne peut pas se connecter à l'ordinateur distant pour l'une des raisons suivantes: 1) L'adresse du serveur de passerelle Bureau à distance demandée et le nom du sujet du certificat SSL du serveur ne correspondent pas. 2) Le certificat est expiré ou révoqué. 3) L'autorité racine du certificat ne fait pas confiance au certificat. Contactez votre administrateur réseau pour avoir de l'aide. + + + Cet ordinateur ne peut pas vérifier l'identité de la passerelle RD "". Il n'est pas sûr de se connecter à des serveurs qui ne peuvent pas être identifiés. Contactez votre administrateur réseau pour avoir de l'aide. + + + Votre ordinateur ne peut pas se connecter à l'ordinateur distant car l'adresse du serveur de passerelle Bureau à distance demandée et le nom du sujet du certificat ne correspondent pas. Contactez votre administrateur réseau pour avoir de l'aide. + + + Votre ordinateur ne peut pas se connecter à l'ordinateur distant car le certificat du serveur de passerelle Bureau à distance a expiré ou a été révoqué. Contactez votre administrateur réseau pour avoir de l'aide. + + + Une erreur s'est produite lors de l'envoi de données au serveur de passerelle Bureau à distance. Le serveur est temporairement indisponible ou une connexion réseau est en panne. Réessayez plus tard ou contactez votre administrateur réseau pour avoir de l'aide. + + + Une erreur s'est produite lors de la réception des données du serveur de passerelle Bureau à distance. Soit le serveur est temporairement indisponible, soit une connexion réseau est en panne. Réessayez plus tard ou contactez votre administrateur réseau pour avoirde l'aide. + + + Votre ordinateur ne peut pas se connecter à l'ordinateur distant car l'adresse du serveur de passerelle Bureau à distance est inaccessible ou incorrecte. Tapez une adresse de serveur de passerelle Bureau à distance valide. + + + Votre ordinateur ne peut pas se connecter à l'ordinateur distant car le serveur de passerelle Bureau à distance manque de ressources serveur et est temporairement indisponible. Essayez de vous reconnecter plus tard ou contactez votre administrateur réseau pour avoir de l'aide. + + + Le serveur de passerelle Bureau à distance a mis fin à la connexion. Essayez de vous reconnecter plus tard ou contactez votre administrateur réseau pour avoir de l'aide. + + + L'administrateur du serveur de passerelle Bureau à distance a mis fin à la connexion. Essayez de vous reconnecter plus tard ou contactez votre administrateur réseau pour avoir de l'aide. + + + Le Bureau à distance ne peut pas se connecter à l'ordinateur distant "" pour l'une des raisons suivantes: 1) Votre compte utilisateur n'est pas répertorié dans la liste des autorisations de RD Gateway. 2) Vous avez peut-être spécifié l'ordinateur distant au format NetBIOS (par exemple, ordinateur1), mais la passerelle RD attend un nom de domaine complet ou un format d'adresse IP (par exemple, ordinateur1.fabrikam.com ou 157.60.0.1). Contactez votre administrateur réseau pour avoir de l'aide. + + + Le Bureau à distance ne peut pas se connecter à l'ordinateur distant "" pour l'une de ces raisons: 1) Votre compte utilisateur n'est pas autorisé à accéder à la passerelle RD "" 2) Votre ordinateur n'est pas autorisé à accéder à la passerelle RD "" 3) Vous vous utilisez une méthode d'authentification incompatible (par exemple, la RD Gateway attend peut-être une carte à puce mais vous avez fourni un mot de passe). Contactez votre administrateur réseau pour avoir de l'aide. + + + Votre ordinateur ne peut pas se connecter à l'ordinateur distant car votre administrateur réseau a limité l'accès à ce serveur RD Gateway. Contactez votre administrateur réseau pour avoir de l'aide. + + + Votre ordinateur ne peut pas se connecter à l'ordinateur distant car le serveur proxy Web requiert une authentification. Pour autoriser le trafic non authentifié vers un serveur RD Gateway via votre serveur proxy Web, contactez votre administrateur réseau. + + + Votre ordinateur ne peut pas se connecter à l'ordinateur distant, car le serveur de passerelle Bureau à distance a atteint son nombre maximal de connexions autorisées. Essayez de vous reconnecter ultérieurement ou contactez votre administrateur réseau pour avoir de l'aide. + + + Votre ordinateur ne peut pas se connecter à l'ordinateur distant car le serveur de passerelle Bureau à distance ne prend pas en charge la demande. Contactez votre administrateur réseau pour avoir de l'aide. + + + Votre ordinateur ne peut pas se connecter à l'ordinateur distant car le client ne prend pas en charge l'une des fonctionnalités de la passerelle Bureau à distance. Contactez votre administrateur réseau pour avoir de l'aide. + + + Votre ordinateur ne peut pas se connecter à l'ordinateur distant car le serveur de passerelle Bureau à distance et cet ordinateur sont incompatibles. Contactez votre administrateur réseau pour avoir de l'aide. + + + Votre ordinateur ne peut pas se connecter à l'ordinateur distant car aucun certificat n'a été configuré pour être utilisé sur le serveur de passerelle Bureau à distance. Contactez votre administrateur réseau pour avoir de l'aide. + + + Votre ordinateur ne peut pas se connecter à l'ordinateur distant car le serveur RD Gateway auquel vous essayez de vous connecter n'est pas autorisé par l'administrateur de votre ordinateur. Si vous êtes l'administrateur, ajoutez ce nom de serveur de passerelle Bureau à distance à la liste des serveurs de passerelle Bureau à distance approuvés sur votre ordinateur, puis essayez de vous connecter à nouveau. + + + Votre ordinateur ne peut pas se connecter à l'ordinateur distant car votre ordinateur ou périphérique ne répond pas aux exigences de protection d'accès réseau définies par votre administrateur réseau, pour l'une des raisons suivantes: 1) Le nom du serveur de passerelle Bureau à distance et le nom du sujet du certificat de clé publique du serveur ne correspondent pas. 2) Le certificat a expiré ou a été révoqué. 3) L'autorité racine du certificat ne fait pas confiance au certificat. 4) L'extension de clé de certificat ne prend pas en charge le cryptage. 5) Votre ordinateur ne peut pas vérifier la liste de révocation des certificats. Contactez votre administrateur réseau pour avoir de l'aide. + + + Votre ordinateur ne peut pas se connecter à l’ordinateur distant car nom d’utilisateur et mot de passe sont requis pour s’authentifier auprès du serveur de passerelle Bureau à distance au lieu des infos d’identification de carte à puce. + + + Votre ordinateur ne peut pas se connecter à l'ordinateur distant car des infos d'identification de carte à puce sont requises pour s'authentifier auprès du serveur de passerelle Bureau à distance au lieu du nom d'utilisateur et mot de passe. + + + Votre ordinateur ne peut pas se connecter à l'ordinateur distant car un cookie non valide a été envoyé au serveur de passerelle Bureau à distance. Contactez votre administrateur réseau pour avoir de l'aide. + + + Votre ordinateur ne peut pas se connecter à l'ordinateur distant car le cookie a été rejeté par le serveur de passerelle Bureau à distance. Contactez votre administrateur réseau pour avoir de l'aide. + + + Votre ordinateur ne peut pas se connecter à l'ordinateur distant car le serveur de passerelle Bureau à distance attend une méthode d'authentification différente de celle tentée. Contactez votre administrateur réseau pour avoir de l'aide. + + + La connexion RD Gateway a pris fin car l'authentification périodique des utilisateurs a échoué. Essayez de vous connecter avec un nom d'utilisateur et mot de passe corrects. Si la reconnexion échoue, contactez votre administrateur réseau pour avoir de l'aide. + + + La connexion RD Gateway a pris fin car l'autorisation périodique de l'utilisateur a échoué. Essayez de vous connecter avec un nom d'utilisateur et mot de passe corrects. Si la reconnexion échoue, contactez votre administrateur réseau pour avoir de l'aide. + + + Votre ordinateur ne peut pas se connecter à l'ordinateur distant car la passerelle Bureau à distance et l'ordinateur distant ne peuvent pas échanger de stratégies. Cela peut se produire pour l'une des raisons suivantes: 1. L'ordinateur distant n'est pas capable d'échanger des stratégies avec la passerelle Bureau à distance. 2. La configuration de l'ordinateur distant ne permet pas de nouvelle connexion. 3. La connexion entre la passerelle Bureau à distance et l'ordinateur distant a pris fin. Contactez votre administrateur réseau pour avoir de l'aide. + + + La connexion RD Gateway a pris fin car l'autorisation périodique de l'utilisateur a échoué. Votre ordinateur ou appareil ne répond pas aux exigences de protection d'accès réseau (NAP) définies par votre administrateur réseau. Contactez votre administrateur réseau pour avoir de l'aide. + + + Connecté + + + Erreur lors de l'analyse de l'adaptateur WiFi "{0}" avec l'erreur : "{1}" + + + Connecter... + + + {0} déconnecté! + + + Connecter à {0} + + + WPS + + + Connexion auto + + + Clé pré-partagée + + + Connexion à {0}... + + + Connexion impossible à {0} ({1})! + + + Connexion réussie à {0}! + + + L'accès au réseau a été révoqué + + + Identifiants invalides + + + Réseau indisponible + + + Réussi + + + Tentative de connexion a expirée + + + -/- + + + Le protocole d'authentification est non supporté! + + + Vérification du WPS... + + + Ouvrir les profils OID... + + + MIB + + + Profils OID + + + Choisir un profil OID + + + Ajouter un profil OID + + + Supprimer le profil OID + + + Le profil OID choisi sera définitivement supprimé. + + + Modifier le profil OID + + + Entrez le mot de passe... + + + Ajouter un onglet + + + (depuis profil) + + + Nouveau masque de sous-réseau + + + Ajouter un serveur + + + Serveur SNTP + + + Les réglages de cette page comportent des erreurs. Corrigez-les pour pouvoir sauvegarder. + + + Clé d'hôte SSH à utiliser pour la connexion (par ex: "71:b8:f2:6e..."). Seulement disponible si le mode est "SSH". + + + Chemin d'accès complet au fichier de clé privée (par exemple, "C:\Users\BornToBeRoot\SSH\private_key.ppk"). Disponible seulement si le mode est "SSH". + + + Nom d'utilisateur qui sera transmis à la session PuTTY. Seulement disponible si le mode est "SSH", "Telnet" ou "Rlogin". + + + ASN + + + Nom AS + + + Ville + + + Continent + + + Pays + + + Devise + + + District + + + Résolveur DNS + + + EDNS + + + Géolocalisation + + + Hébergement + + + Géolocalisation IP + + + ISP + + + Latitude + + + Longitude + + + Mobile + + + Organisation + + + Enregistrement PTR + + + Fuseau horaire + + + Code postal + + + API de géolocalisation IP - Rapide, précise et fiable + + + Vérifier le résolveur DNS + + + Vérifier la géolocalisation IP + + + Show map + + + Le résolveur DNS est défini via ip-api.com. + +URL: https://edns.ip-api.com/ + + + La géolocalisation IP est établie via ip-api.com. + +URL: http://ip-api.com/ + + + Pour fournir des fonctionnalités supplémentaires, nous utilisons des services tiers qui ne sont pas gérés par moi. Vous pouvez les décocher ci-dessous. Aucune donnée ne m'est transmise à aucun moment. + + + Vérification du résolveur DNS... + + + Vérification de la géolocalisation IP... + + + Vérifiez votre connexion réseau et réessayez dans quelques secondes. + + + Limite de débit ip-api.com atteinte (trop de requêtes de votre réseau)! +Réessayez dans quelques secondes. + + + Code de statut HTTP + + + Acier + + + Limite de débit atteinte! Réessayez dans quelques {0} secondes... + + + Général + + + BSSID + + + Aucun hôte accessible trouvé! + + + Application + + + Activez les fonctionnalités expérimentales pour tester de nouvelles fonctions. Celles-ci sont encore incomplètes, contiennent des bugs, peuvent faire planter l'application et peuvent encore changer jusqu'à la sortie. + + + Fonctionnalités expérimentales + + + Expérimentale + + + Run command... + + + Géolocalisation IP + + + Ajout d'un onglet pour interroger la géolocalisation IP... + + + Entrez un domaine pour interroger whois... + + + Entrez l'hôte pour interroger la géolocalisation IP... + + + Nom d'utilisateur inconnu. + + + Échec d'authentification (mot de passe, communauté ou clé incorrect). + + + L'opération a réussi sans aucune erreur. + + + La réponse à votre demande était trop longue pour tenir dans une seule réponse! + + + L'OID demandé est introuvable! + + + Objet en lecture-écriture ou écriture seule a été défini sur une valeur incohérente! + + + L'OID demandé n'existe pas et n'est pas accessible en écriture! + + + Une erreur est survenue pour laquelle aucun message spécifique n'est disponible! + + + L'objet demandé n'est pas accessible en modification! + + + L'objet a été défini sur un type de données incompatible! + + + La valeur assignée à l'objet dépasse sa longueur maximale! + + + L'encodage utilisé pour l'objet est incorrect! + + + La valeur attribuée à l'objet est un choix invalide! + + + L'objet demandé n'existe pas et ne peut être créé! + + + La variable MIB est actuellement dans un état incohérent et non modifiable! + + + Aucune ressource système n'est disponible pour effectuer l'opération demandée! + + + Une erreur s'est produite lors de l'opération de réglage! + + + Une opération définie a échoué et les changements précédents n'ont pas pu être annulés! + + + L'authentification a échoué. Veuillez vérifier la chaîne de communauté! + + + L'objet demandé est inaccessible en écriture et non modifiable! + + + L'état de l'objet est incohérent, empêchant l'opération définie! + + + Fermer tout + + + Développer la vue de l'hôte + + + Expand map view + + + L'hôte ne peut pas être défini pendant l'ajout d'autres hôtes. Veuillez attendre la fin du processus et réessayer. + + + Aucune commande correspondante! + + + Nom d'hôte distant + + + ID du processus + + + Chemin du processus + + + Nom du processus + + + NetBIOS + + + Nom de l'ordinateur + + + Erreur + + + OK + + + Attention + + + Group / domain + + + NetBIOS joignable + + + Scanner NetBIOS + + + L'analyse NetBIOS est désactivée! + + + Résoudre le nom d'hôte est désactivé! + + + Résoudre l'adresse MAC est désactivé! + + + Fermer groupe + + + Run command... (Ctrl+Shift+P) + + + Fichiers de profil + + + Ouvrir paramètres... + + + Développer et ouvrir la recherche... + + + À partir de Windows 11 24H2, vous devrez autoriser l’accès à l’adaptateur Wi-Fi. + +Ouvrir les paramètres Windows > Confidentialité et sécurité > Emplacement, activer l'accès pour les applications de bureau / NETworkManager, puis redémarrez l'application. + + + Glissez-déposez les applications pour les réorganiser. +Clic droit pour plus d'options. + + + Restaurer les valeurs par défaut + + + Un framework glisser-déposer facile à utiliser pour WPF. + + + BSD-3-Clause + + + Définir par défaut + + + Serveur Ubuntu exécutant Docker avec Nextcloud et Traefik... + + + Serveurs Linux exécutés dans AWS... + + + 6 GHz + + + Support this project with a donation. + + + Ouvrir la documentation + + + Don + + + Fichier de profil + + + Hosts File Editor + + + Hosts File Editor + + + Mode lecture seule. La modification du fichier hosts nécessite des droits élevés! + + + Open hosts file + + + Commentaire + + + Désactiver + + + Éditer l'entrée + + + Éditer l'entrée... + + + Activer l'entrée + + + Désactiver l'entrée + + + Actualisation... + + + Rechargé à {0} + + + Échec du chargement du fichier hosts: {0} + + + Réessayer dans {0} secondes... + + + Quoi de neuf? + + + Journal des modifs + + + Mise à niveau vers {0} + + + Cette version inclut de nouvelles fonctionnalités, des améliorations et des corrections de bugs. Consultez le journal des modifications pour plus de détails! + + + Entrées + + + L'entrée sélectionnée est définitivement supprimée: + +{0}{1}{2} + + + Serveur DNS principal + + + Entrez un nom d'hôte valide (par ex: "server-01" ou "example.com")! Plusieurs noms d'hôtes peuvent être séparés par un espace. + + + Fichier "hosts" est illisible! Consultez le fichier journal pour plus de détails. + + + Impossible d'écrire dans le fichier "hosts". Consultez le fichier journal pour plus de détails. + + + Entrée introuvable dans le fichier "hosts"! Le fichier a peut-être été modifié. + + + Sauvegarde du fichier "hosts" n'a pas pu être créée! Consultez le fichier journal pour plus de détails. + + + Afficher la barre d'état + + + Affiche la barre d'état en bas à gauche de WebView lorsque vous survolez un lien. + + + Enregistrer les identifiants + + + Affiche une boîte de dialogue pour sauver les infos d'identification après une connexion réussie. + + + Supprimer les données de navigation + + + Supprimez définitivement les données de navigation (historique, cookies, cache, infos d'identification, etc.) pour le profil WebView2 actuel. + + + Données de navigation + + + Données de navigation supprimées avec succès! + + + Une erreur s'est produite lors de la suppression des données de navigation. N'hésitez pas à signaler ce problème sur GitHub. + + + production + + + Add tag + + + Apply filter + + + Filter profiles... + + + Filter by tags + + + No tags found! + + + Match + + + Any + + + Add group... + + + Expand all + + + Collapse all + + + Use custom themes to personalize the appearance of the application. You can edit or add theme in the "Program Folder > Themes" directory. For more details, refer to the documentation. + + + Admin (console) session + + + Profile file "{0}" will be deleted permanently. + + + Enable encryption? + + + Do you want to enable profile file encryption to protect sensitive data such as hosts, IP addresses, URLs, and stored credentials? + +You can enable or disable encryption later at any time by right-clicking the profile file to manage encryption settings. +If you click Cancel, the profile file will remain unencrypted. + + + A restart is required to apply changes such as language settings. + + + Could not parse or resolve any of the specified DNS servers. + + + Could not parse "{0}". + + + Maximum number of backups + + + Create daily backup + + + Number of backups that are retained before the oldest one is deleted. + + + This setting is managed by your administrator. + + + Restore default location + + + Restore + + + Restore default location? + + + The default settings location is restored and the application is restarted afterwards. + +You can copy the “settings.json” file from "{0}" to "{1}" to migrate your previous settings, if necessary. The application must be closed for this to prevent the settings from being overwritten. + + + Change location? + + + The settings location is changed and the application is restarted afterwards. + +You can copy the “settings.json” file from "{0}" to "{1}" to migrate your previous settings, if necessary. The application must be closed for this to prevent the settings from being overwritten. + + + Enter a valid folder path! + + + The profiles location is changed and the application is restarted afterwards. + +You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. + + + The default profiles location is restored and the application is restarted afterwards. + +You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. + + + Network connection + + + Network Status + + + Active Directory import failed. + + + Options + + + + Uses your current Windows credentials to read from Active Directory. The account must be allowed to enumerate computer objects under the search base (subtree). + + + Search base (DN) + + + Additional LDAP filter + + + Filter must be a valid LDAP expression starting with '(' and ending with ')'. + + + Search base must be a valid LDAP distinguished name (e.g. DC=example,DC=com). + + + Imported from Active Directory on {0} + + + No computers found for the given search base and filter. + + + Searching Active Directory... + + + If your computer is not joined to the domain, specify the domain controller (hostname or IP) and use custom credentials. + + + Server (optional) + + + Port (optional) + + + Use SSL (LDAPS) + + + Use current Windows credentials + + + Use these credentials + + + Advanced + + + Select all + + + Deselect all + + + Enable for + + + Skip already imported + + + {0} · {1} result(s) + + + {0} profile(s) imported. +{1} duplicate entries skipped. +{2} without a host skipped. + + + Active Directory + + + CSV file + + + CSV file + + + Import profiles from CSV file + + + Imported from CSV file on {0} + + + No entries were found in the CSV file. + + + Expected CSV format — one profile per line: + + + A header row and the delimiter (semicolon, comma or tab) are detected automatically. The description column is optional. Entries without a host cannot be imported. + + + Import results + + + New + + + Imported + + + No host + + + Exclude disabled accounts + + + Import computers from Active Directory + + + Import computers from Active Directory... + + + Import profiles + + + Source + + + Active Directory + + + Profile group + + + Existing or new group name + + + Firewall + + + Firewall rules + + + Windows Firewall settings + + + Direction + + + Inbound + + + Outbound + + + Action + + + Allow + + + Block + + + Network profile + + + Network profiles + + + Interface type + + + Failed to load firewall rules. {0} + + + The selected firewall rule is permanently deleted: + +{0} + + + Any + + + TCP + + + UDP + + + ICMPv4 + + + ICMPv6 + + + HOPOPT + + + GRE + + + IPv6 + + + IPv6-Route + + + IPv6-Frag + + + IPv6-NoNxt + + + IPv6-Opts + + + VRRP + + + PGM + + + L2TP + + + Any + + + Wired + + + Wireless + + + Remote access + + + Read-only mode. Modifying firewall rules requires elevated rights! + + + Inbound + + + Outbound + + + Block + + + Allow + + + Local ports + + + Remote ports + + + Local addresses + + + Remote addresses + + + Enter a valid IP address, subnet (e.g. 10.0.0.0/8), range (e.g. 10.0.0.1-10.0.0.10), or keyword (Any, LocalSubnet, DNS, DHCP, WINS, DefaultGateway, Internet, Intranet, IntranetRemoteAccess, PlayToDevice, CaptivePortal) + + + Add rule + + + Add rule... + + + Edit rule + + + Edit rule... + + + Delete rule + + + Enable rule + + + Disable rule + + + Import profiles... + + + Speed Test + + + Run speed test + + + Fetching metadata... + + + Measuring latency... + + + Measuring download speed... + + + Measuring upload speed... + + + Measure download and upload speeds, latency, and jitter with speed.cloudflare.com. +Cloudflare may log your IP address and network information. See Cloudflare's privacy policy for details. + + + Latency + + + Jitter + + + Speed test service used to measure download speed, upload speed, latency, and jitter. - - Unlock the profile file to add, change or delete a profile! + + Stop diff --git a/Source/NETworkManager.Localization/Resources/Strings.hu-HU.resx b/Source/NETworkManager.Localization/Resources/Strings.hu-HU.resx index e45608c2d6..07a6bea438 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.hu-HU.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.hu-HU.resx @@ -121,13 +121,13 @@ Névjegy - Accent + Kiemelés Hitelesítő adatok hozzáadása - Add entry + Bejegyzés hozzáadása Profil hozzáadása @@ -138,23 +138,47 @@ ARP - - ARP tábla + + Neighbor Table + + + Read-only mode. Modifying the neighbor table requires elevated rights! + + + Unreachable + + + Incomplete + + + Probe + + + Delay + + + Stale + + + Reachable + + + Permanent Hitelesítés - Autostart + Automatikus indítás Számológép - Command Line Arguments + Parancssori argumentumok - Configure + Konfigurálás Megerősítés @@ -193,16 +217,16 @@ Szétkapcsolva - Display + Megjelenítés DNS - DNS Lookup + DNS-címkeresés - Don't fragment + Tilos tördelni Hitelesítő adatok szerkesztése @@ -223,19 +247,19 @@ Szűrő - General + Általános - Headers + Fejlécek - History + Történet - HotKeys + Gyorsbillentyűk - HTTP Headers + HTTP-fejlécek Importálás @@ -247,7 +271,7 @@ Interfész - IP Scanner + IP szkenner Billentyűzet @@ -256,43 +280,55 @@ Nyelv - Libraries + Könyvtárak Licenc - Local devices and resources + Helyi eszközök és erőforrások - Location + Hely - Lookup + Keresés - MAC Address + MAC-cím - Master Password + Mesterjelszó - Multithreading + Többszálúság - Network + Hálózat - Network Interface + Hálózati illesztő + + + Configuration applied + + + Configuring the network interface requires elevated rights! - New tab + Új lap + + + Next OUI + + Options + - Overwrite? + Felülírja? Ping @@ -301,88 +337,85 @@ Port - Portable + Hordozható - Port Scanner + Port szkenner - Profiles + Profilok PuTTY - Query + Lekérdezés - Remote Desktop + Távoli asztal - Reset + Visszaállítás - Resolve PTR + PTR feloldása - Resources + Erőforrások - Result + Eredmény - Route + Útvonal - Scan + Szkennelés - Search + Keresés - Select a profile... + Válasszon ki egy profilt... - Set Master Password + Állítsa be a mesterjelszót - Settings - - - Settings have been reset! + Beállítások SNMP - Socket + Szoftvercsatorna - Statistics + Statisztika - Status + Státusz - Subnet + Alhálózat - Subnetting + Alhálózatbeosztás - Success! + Sikeres! - Theme + Téma Traceroute - Tray + Tálca - Update + Frissítés v1/v2c @@ -391,7 +424,7 @@ v3 - Validation failed! + Ellenőrzés sikertelen! Wake on LAN @@ -444,6 +477,18 @@ Description + + Placeholder + + + Path to the file or executable to run. The following placeholders can be used: + + + Arguments passed to the file or executable. The following placeholders can be used: + + + The following placeholder can be used: + DHCP enabled @@ -489,6 +534,30 @@ IPv4 address + + IPv4 address added + + + IPv4 address removed + + + IPv4 address released and renewed + + + IPv4 address released + + + IPv4 address renewed + + + IPv6 address released and renewed + + + IPv6 address released + + + IPv6 address renewed + IPv4-Default-Gateway @@ -504,11 +573,23 @@ IPv6-Default-Gateway + + Map + + + (+{0} more) + + + Scroll = Zoom, Drag = Pan + + + Unknown + Maximum - - Maximum hops/router + + Maximum hops Minimize main window instead of terminating the application @@ -561,9 +642,6 @@ Restart required - - Some settings are applied only after restarting the application! - Save settings in the application folder @@ -577,7 +655,7 @@ Show the following application on startup: - A powerful tool for managing networks and troubleshoot network problems! + A powerful open-source tool for managing networks and troubleshooting network problems! Speed @@ -594,11 +672,8 @@ Static IPv4 DNS server - - Subnetmask - - - Subnetmask or CIDR + + Subnet mask Threads @@ -621,8 +696,8 @@ Timeout (ms) - - Time to wait between each ping + + Time (ms) to wait between each ping TTL @@ -663,9 +738,6 @@ Add a tab to perform a trace... - - Add a tab to query the HTTP headers... - Add DNS suffix (primary) to hostname @@ -691,7 +763,7 @@ Apply - Apply Windows key combinations (e.g. ALT+TAB): + Apply Windows key combinations (e.g., ALT+TAB): Auth @@ -720,6 +792,9 @@ Caps lock is enabled! + + Chart time (seconds) + Check for updates at startup @@ -821,9 +896,6 @@ First make a backup copy of your profile files before enabling encryption! DNS server - - Open documentation - Domain @@ -842,7 +914,7 @@ First make a backup copy of your profile files before enabling encryption! End time - + Enter a subnet to calculate it... @@ -866,9 +938,6 @@ First make a backup copy of your profile files before enabling encryption! Fixed screen size: - - Star/Fork the Project on GitHub - Found @@ -969,6 +1038,9 @@ Create one... OID + + Only CSV files are allowed! + Only when using the full screen @@ -993,12 +1065,6 @@ Create one... override - - Overwrite settings in the destination folder? - -"Overwrite" will overwrite the file in the destination folder. -"Use other" will use the existing settings file in the destination and restart the application. - Password @@ -1029,9 +1095,6 @@ Create one... PuTTY process has ended! - - PuTTY profile - Questions @@ -1098,18 +1161,6 @@ Create one... Select a screen resolution - - The selected settings are overwritten! - - - The selected settings are reset. - - - Select the settings you want to export: - - - Select the settings you want to import: - This will reset all settings! @@ -1117,23 +1168,17 @@ Create one... Serial - SerialLine + Serial line Service - The settings file found was corrupted or is not compatible with this version. All settings have been reset! -(Profile files are not affected!) - - - Settings successfully exported! - - - Settings successfully imported! - - - Settings successfully reset! + The found settings file was corrupted or is not compatible with this version! You may report this issue on GitHub. + +A backup of the settings file was created in the settings folder and the settings were reset. + +Profile files are not affected! Show closed ports @@ -1144,8 +1189,8 @@ Create one... Show only most common query types - - Show scan result for all IP addresses + + Show unreachable IP addresses and ports Show statistics @@ -1187,10 +1232,10 @@ Create one... The process can take up some time and resources (CPU / RAM). - The settings location is not affected + The settings location is not affected! - Timeout on SNMP query. + Timeout on SNMP query. Maybe the host is not reachable or the community / password is wrong. Timeout when querying the DNS server with the IP address "{0}"! @@ -1204,8 +1249,8 @@ Create one... Unkown error! - - Untray / Bring window to front + + Untray / Bring window to foreground URL @@ -1309,6 +1354,9 @@ Create one... Flush DNS cache + + DNS cache flushed + Decrypt and load your credentials to select them. @@ -1366,12 +1414,12 @@ Create one... Overwrite + + Parse + Paste - - C:\Program Files\PuTTY\putty.exe - Reconnect @@ -1409,22 +1457,22 @@ Create one... Connections - Enter a valid ip range! + Enter a valid IP range! Enter a valid IPv4 address! - Enter a valid MAC address (like 00:F1:23:AB:F2:35)! + Enter a valid MAC address (e.g., 00:F1:23:AB:F2:35)! Enter a valid port (1 - 65535)! - Enter a valid subnetmask (like 255.255.255.0)! + Enter a valid subnetmask (e.g., 255.255.255.0)! - Enter a valid subnetmask or CIDR (like 255.255.255.0 or /24)! + Enter a valid subnetmask or CIDR (e.g., 255.255.255.0 or /24)! Field cannot be empty! @@ -1496,10 +1544,10 @@ Create one... Enter a valid port and/or port range (1 - 65535)! - Enter a valid subnet (like 192.168.178.133/26)! + Enter a valid subnet (e.g., 192.168.178.133/26)! - Enter a valid website (like https://example.com/index.html) + Enter a valid website (e.g., https://example.com/index.html) Green @@ -1534,6 +1582,9 @@ Create one... Lime + + Live + Magenta @@ -1762,9 +1813,6 @@ Create one... Yellow - - Enter a valid value between 25 and 100! - A profile with this name already exists! @@ -1793,7 +1841,10 @@ Create one... Add a tab to query whois... - Enter a valid domain (like "example.com")! + Enter a valid domain (e.g., "example.com")! + + + Enter a valid Windows username (e.g., "user", "DOMAIN\user" or "user@domain.com")! Whois server not found for the domain: "{0}" @@ -1837,9 +1888,6 @@ Create one... Configure the path to TigerVNC in the settings... - - TigerVNC location... - TigerVNC process has ended! @@ -1903,11 +1951,11 @@ Create one... Add IPv4 address - - Host threads + + Max. concurrent host threads - - Port threads + + Max. concurrent port threads PowerShell @@ -1924,9 +1972,6 @@ Create one... Remote console - - PowerShell location... - File path @@ -1964,11 +2009,11 @@ Create one... Background job - The background job will save settings, profiles and credentials every x-minutes. + The background job will save settings and profiles every x-minutes. Value 0 will disable this feature. -Changing this value requires a restart of the application to take effect. +Changes to this value will take effect after restarting the application. Run background job every x-minute @@ -1980,15 +2025,15 @@ Changing this value requires a restart of the application to take effect.Dashboard - All settings can be changed later in the settings + All settings can be changed later in the settings! Check public IP address - - Thanks for using NETworkManager! + + Thank you for using NETworkManager! -To provide additional features the application uses services on the Internet that are not operated by me. No data will be sent to me at any time. +If you enjoy it, please consider supporting its development — whether by leaving a star on GitHub, making a donation, or simply sharing it with others. Your support helps keep the project going and growing. When starting the program, it checks in the background whether a new program version is available on GitHub. @@ -2009,14 +2054,14 @@ URL: https://api.ipify.org/ External services - + Star/Fork the Project on GitHub. - + Help translate the project on Transifex. - - Contact via Twitter. + + Follow or contact me via X. Connection @@ -2036,15 +2081,6 @@ URL: https://api.ipify.org/ Check your network adapter configuration (dhcp, static ip) and if you are connected to a network. - - Error - - - OK - - - Warning - Could not detect gateway ip address! @@ -2097,8 +2133,8 @@ is disabled! Use custom IPv4 address API - - URL to a web service that can be reached via http or https and returns an IP address as response. + + URL to a web service that can be reached via http or https and returns an IPv4 address e.g., "xx.xx.xx.xx" as response. Could not parse public ip address from "{0}"! Try another service or use the default... @@ -2172,6 +2208,12 @@ is disabled! Visual styles + + View only + + + Block keyboard and mouse input to the remote session + Remote audio @@ -2217,24 +2259,39 @@ is disabled! Program + + Private + + + Public + A kiválasztott egyedi parancs véglegesen törlésre kerül. - - Az alábbi változók elérhetők: - -$$ipaddress$$ --> IP-cím -$$hostname$$ --> Állomásnév - Újraindítás - - Nem sikerült az IP-cím feloldása állomásnévre! + + Could not resolve ip address for hostname! Ctrl+Alt+Del + + Task Manager (Ctrl+Shift+Esc) + + + Lock (Win+L) + + + Show Desktop (Win+D) + + + Explorer (Win+E) + + + Run dialog (Win+R) + Billentyűparancsok @@ -2271,8 +2328,8 @@ $$hostname$$ --> Állomásnév Show status window on network change - - Time in seconds how long the window should be displayed + + Time in seconds how long the status window is shown WiFi @@ -2298,12 +2355,18 @@ $$hostname$$ --> Állomásnév Csatorna + + Channel width + 2,4 GHz 5 GHz + + 2.4 & 5 GHz + Jelerősség @@ -2343,10 +2406,7 @@ $$hostname$$ --> Állomásnév Timeout (s) - - Report an issue or create a feature request - - + Report an issue or create a feature request. @@ -2388,12 +2448,39 @@ $$hostname$$ --> Állomásnév Could not resolve ip address for: "{0}" + + Notification + + + Show notification popup on status change + + + Play sound on status change + + + Success threshold + + + Number of consecutive successful pings required before a "Host is up" notification is shown. Higher values reduce noise from flapping hosts. + + + Failure threshold + + + Number of consecutive failed pings (timeouts) required before a "Host is down" notification is shown. Higher values reduce noise from flapping hosts. + + + Display duration (seconds) + + + Host is up + + + Host is down + The application will be restarted... - - Use other folder - Could not export file! See error message: "{0}" @@ -2409,8 +2496,8 @@ $$hostname$$ --> Állomásnév Is encrypted - - Open documentation on GitHub. + + Open the documentation. Customer 1 @@ -2439,9 +2526,6 @@ $$hostname$$ --> Állomásnév Delete profile file - - Selected profile file will be deleted permanently. - All profiles in this profile file will be permanently deleted! @@ -2464,7 +2548,7 @@ $$hostname$$ --> Állomásnév Restart as Administrator - To analyze network packets, the application must be started with elevated rights! + Analysing network packets requires elevated rights! Capture @@ -2493,13 +2577,13 @@ $$hostname$$ --> Állomásnév Discovery Protocol - + CDP - + LLDP - + LLDP / CDP @@ -2532,8 +2616,8 @@ $$hostname$$ --> Állomásnév Microsoft.Windows.SDK.Contracts is required for this feature but not available on this system (e.g. on Windows Server). - - ARP Table + + Neighbor Table Connections @@ -2670,133 +2754,46 @@ $$hostname$$ --> Állomásnév Yellow - + Steel - + General - - DNS Lookup - - - HTTP Headers - - - IP Scanner - - - Network Interface - - - Ping - - - Ping Monitor - - - Port Scanner - - - PowerShell - - - PuTTY - - - Remote Desktop - - - TigerVNC - - - Traceroute - - - Wake on LAN - - - Web Console - - - Whois - - + Applications - + General - + Appearance - + Autostart - - Dashboard - - - DNS Lookup - - + General - + HotKeys - - HTTP Headers - - - IP Scanner - - + Language - - Ping Monitor - - - Port Scanner - - - PowerShell - - + Profiles - - PuTTY - - - Remote Desktop - - + Settings - - SNMP - - + Status - - TigerVNC - - - Traceroute - - + Update - - Wake On LAN - - - Whois - - + Window @@ -2827,7 +2824,7 @@ $$hostname$$ --> Állomásnév SSH log - SSH and Raw Log + SSH and Raw log Enter a valid file name! @@ -2889,13 +2886,17 @@ $$hostname$$ --> Állomásnév SSID - - Profile could not be loaded! + + Profile file could not be loaded! - - If this happened after an update, you may need to migrate the profiles to a newer version. When you click "Migrate", a PowerShell window opens with the migration script. Check the path and press Enter. + + The profile file could not be loaded and may be corrupted. You can try to restore the file from a backup or delete it. + +If this happens unexpectedly or after an update, please report the error on GitHub. -Otherwise, the profile may be corrupted and you want to report the issue on GitHub. + +Error message: +"{0}" Edit group... @@ -2933,25 +2934,12 @@ Otherwise, the profile may be corrupted and you want to report the issue on GitH Merge - - The destination folder already contains files. If you click Merge, the current profiles are copied to the folder. - - - Overwrite profiles in destination folder? - -"Overwrite" will copy the profile files to the destination folder and overwrite existing profile files. -"Merge" will copy the profile files to the destination folder, but won't overwrite exitsting profile files. -"Use other folder" will use the existing profile files in the destination folder. - Use other Move - - Profile files will be moved to the selected destination folder. - Last scan at {0} @@ -2980,7 +2968,7 @@ Otherwise, the profile may be corrupted and you want to report the issue on GitH C# library take care of complex network, IP, IPv4, IPv6, netmask, CIDR, subnet, subnetting, supernet, and supernetting calculation for .NET developers. - Simple, flexible, interactive & powerful charts, maps and gauges for .Net + Beautiful, interactive charts, maps, and gauges. A collection of loading indicators for WPF @@ -3009,8 +2997,11 @@ Otherwise, the profile may be corrupted and you want to report the issue on GitH List of Top-Level-Domains from iana.org, which is used to query whois servers of the TLD from whois.iana.org via port 43 + + GeoJSON conversion of Natural Earth vector map data (CC0-1.0). + - Sanitized IEEE OUI Data from linuxnet.ca. + OUI data from ieee.org. Service Name and Transport Protocol Port Number Registry from iana.org. @@ -3060,10 +3051,10 @@ Enable profile file encryption in Settings>Profile to store credentials secur Enter a valid IPv6 address! - Public accessible IPv4 address. + Public IPv4 address reachable via ICMP. - Public accessible IPv6 address. + Public IPv6 address reachable via ICMP. Public IPv4 address @@ -3140,7 +3131,1366 @@ Enable profile file encryption in Settings>Profile to store credentials secur Selected profiles will be deleted permanently. - - Unlock the profile file to add, change or delete a profile! + + Use custom themes + + + Custom themes + + + Reset settings? + + + Settings reset! + + + Instance ID + + + Local connection + + + Local interface + + + log4net is a tool to help the programmer output log statements to a variety of output targets. + + + Enabled + + + Region + + + Profiles and regions to synchronize + + + Default profile + + + Default region + + + Group name cannot start with "{0}"! + + + Check for pre-releases + + + Synchronization is disabled! + + + Command + + + Apply theme to PowerShell console + + + The color of the PowerShell console can be changed to the application theme under Settings > General > Appearance + + + If you enable this option, the default PowerShell console settings in the registry under HKCU:\Console are overridden so that the PowerShell console window matches the application theme. This is a global system setting that may affect the appearance of the normal PowerShell window. + +Only the PowerShell consoles configured in the PowerShell settings are modified. Both Windows PowerShell and PWSH (PowerShell 7 and higher) are supported. + +Click in the upper right corner on the help / documentation button (left of the minimize button) or navigate to https://borntoberoot.net/NETworkManager/Documentation/Settings/Appearance for more details. Here are the values documented which will be adjusted. + +If the option is disabled again, the values are no longer modified. However, the original values are NOT restored. + + + Input cannot end with a ";"! + + + Input does not contain any text! + + + Bit Calculator + + + Bit Calculator + + + Notation + + + Input + + + Unit + + + Bits + + + Gigabits + + + Gigabytes + + + Kilobits + + + Kilobytes + + + Megabits + + + Megabytes + + + Petabits + + + Petabytes + + + Terabits + + + Terabytes + + + Enter a number and select a unit to calculate the units... + + + Network + + + Proxy + + + Resolve IP address for this host (IPv4 is preferred) + + + A valid path to PowerShell should end with "pwsh.exe" or "powershell.exe"! + + + A valid path to PuTTY should end with "PuTTY.exe"! + + + A valid path to TigerVNC should end with "vncviewer-*.exe" or "vncviewer64-*.exe"! + + + SNTP Lookup + + + Move a .NET Framework/.NET Core app runtime components and dependencies into a sub-directory and make it beauty. + + + Add a tab to perform a SNTP lookup... + + + SNTP server(s) + + + URL to a web service that can be reached via http or https and returns an IPv6 address e.g., "xxxx:xx:xxx::xx" as response. + + + IP endpoint + + + Local end time + + + Local start time + + + Network time + + + Offset + + + Round trip delay + + + Server + + + SNTP Lookup + + + Add SNTP server + + + Delete SNTP server + + + The selected SNTP server will be deleted permanently. + + + Edit SNTP server + + + An SNTP server with this name already exists! + + + Enter a valid hostname (e.g., "server-01" or "example.com") or a valid IP address (e.g., 192.168.178.1)! + + + Server(s) + + + Enter master password to unlock the profile file: + + + Unlock profile file + + + Timed out + + + Hostkey + + + The settings will be reset and the application will be restarted afterwards! + + + A beállítások vissza lettek állítva! + + + Ping status + + + ThreadPool additional min. threads + + + This setting specifies the minimum number of threads that will be created from the application's ThreadPool on demand. This can improve the performance for example of the IP scanner or port scanner. + +The value is added to the default min. threads (number of CPU threads). The value 0 leaves the default settings. If the value is higher than the default max. threads of the ThreadPool, this value is used. + +If the value is too high, performance problems may occur. + +Changes to this value will take effect after the application is restarted. Whether the value was set successfully can be seen in the log file under %LocalAppData%\NETworkManager\NETworkManager.log + + + These settings only change the maximum number of concurrently executed threads per host/port scan. Go to Settings > General > General to adjust the (min) threads of the application. + + + Port status + + + Ping details + + + No open ports found! + + + Port scan is disabled! + + + Scan ports + + + Could not find the application "{0}". Maybe the application was hidden in the settings? + + + Status window + + + Show address bar + + + Enabling this setting is not recommended. Multiple instances of the application share the same settings and profile files. The last instance to be closed may overwrite changes made by other instances. + + + Bypass for local addresses + + + Enable gateway server + + + Logon method + + + Gateway server + + + Server name + + + Share Gateway credentials with remote computer + + + Allow me to select later + + + Smart card or Windows Hello for Business + + + Ask for password (NTLM) + + + Use gateway credentials + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server is temporarily unavailable. Try reconnecting later or contact your network administrator for assistance. + + + Your computer can't connect to the remote computer due to one of the following reasons: 1) The requested Remote Desktop Gateway server address and the server SSL certificate subject name do not match. 2) The certificate is expired or revoked. 3) The certificate root authority does not trust the certificate. Contact your network administrator for assistance. + + + This computer can't verify the identity of the RD Gateway "". It's not safe to connect to servers that can't be identified. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server address requested and the certificate subject name do not match. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server's certificate has expired or has been revoked. Contact your network administrator for assistance. + + + An error occurred while sending data to the Remote Desktop Gateway server. The server is temporarily unavailable or a network connection is down. Try again later, or contact your network administrator for assistance. + + + An error occurred while receiving data from the Remote Desktop Gateway server. Either the server is temporarily unavailable or a network connection is down. Try again later, or contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server address is unreachable or incorrect. Type a valid Remote Desktop Gateway server address. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server is running low on server resources and is temporarily unavailable. Try reconnecting later or contact your network administrator for assistance. + + + The Remote Desktop Gateway server has ended the connection. Try reconnecting later or contact your network administrator for assistance. + + + The Remote Desktop Gateway server administrator has ended the connection. Try reconnecting later or contact your network administrator for assistance. + + + Remote Desktop can't connect to the remote computer "" for one of these reasons: 1) Your user account is not listed in the RD Gateway's permission list 2) You might have specified the remote computer in NetBIOS format (for example, computer1), but the RD Gateway is expecting an FQDN or IP address format (for example, computer1.fabrikam.com or 157.60.0.1). Contact your network administrator for assistance. + + + Remote Desktop can't connect to the remote computer "" for one of these reasons: 1) Your user account is not authorized to access the RD Gateway "" 2) Your computer is not authorized to access the RD Gateway "" 3) You are using an incompatible authentication method (for example, the RD Gateway might be expecting a smart card but you provided a password) Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because your network administrator has restricted access to this RD Gateway server. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the web proxy server requires authentication. To allow unauthenticated traffic to an RD Gateway server through your web proxy server, contact your network administrator. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server reached its maximum allowed connections. Try reconnecting later or contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server does not support the request. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the client does not support one of the Remote Desktop Gateway's capabilities. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server and this computer are incompatible. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because no certificate was configured to use at the Remote Desktop Gateway server. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the RD Gateway server that you are trying to connect to is not allowed by your computer administrator. If you are the administrator, add this Remote Desktop Gateway server name to the trusted Remote Desktop Gateway server list on your computer and then try connecting again. + + + Your computer can't connect to the remote computer because your computer or device did not meet the Network Access Protection requirements set by your network administrator, for one of the following reasons: 1) The Remote Desktop Gateway server name and the server's public key certificate subject name do not match. 2) The certificate has expired or has been revoked. 3) The certificate root authority does not trust the certificate. 4) The certificate key extension does not support encryption. 5) Your computer cannot verify the certificate revocation list. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because a user name and password are required to authenticate to the Remote Desktop Gateway server instead of smart card credentials. + + + Your computer can't connect to the remote computer because smart card credentials are required to authenticate to the Remote Desktop Gateway server instead of a user name and password. + + + Your computer can't connect to the remote computer because an invalid cookie was sent to the Remote Desktop Gateway server. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the cookie was rejected by the Remote Desktop Gateway server. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server is expecting an authentication method different from the one attempted. Contact your network administrator for assistance. + + + The RD Gateway connection ended because periodic user authentication failed. Try reconnecting with a correct user name and password. If the reconnection fails, contact your network administrator for further assistance. + + + The RD Gateway connection ended because periodic user authorization failed. Try reconnecting with a correct user name and password. If the reconnection fails, contact your network administrator for further assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway and the remote computer are unable to exchange policies. This could happen due to one of the following reasons: 1. The remote computer is not capable of exchanging policies with the Remote Desktop Gateway. 2. The remote computer's configuration does not permit a new connection. 3. The connection between the Remote Desktop Gateway and the remote computer ended. Contact your network administrator for assistance. + + + The RD Gateway connection ended because periodic user authorization failed. Your computer or device didn't pass the Network Access Protection (NAP) requirements set by your network administrator. Contact your network administrator for assistance. + + + Connected + + + Error while scanning WiFi adapter "{0}" with error: "{1}" + + + Connect... + + + {0} disconnected! + + + Connect to {0} + + + WPS + + + Connect automatically + + + Pre-shared key + + + Connecting to {0}... + + + Could not connect to {0} ({1})! + + + Successfully connected to {0}! + + + Access to the network has been revoked + + + Invalid credentials + + + Network not available + + + Successful + + + Connection attempt timed out + + + -/- + + + Authentication protocol is not supported! + + + Checking WPS... + + + Open OID profiles... + + + MIB + + + OID profiles + + + Select OID profile + + + Add OID profile + + + Delete OID profile + + + The selected OID profile will be deleted permanently. + + + Edit OID profile + + + Enter password... + + + Add tab + + + (from profile) + + + New subnet mask + + + Add server + + + SNTP server + + + The settings on this page contain errors. Correct them to be able to save. + + + SSH hostkey to use for the connection (e.g., "71:b8:f2:6e..."). Only available if the mode is "SSH". + + + Full path to the private key file (e.g., "C:\Users\BornToBeRoot\SSH\private_key.ppk"). Only available if the mode is "SSH". + + + Username that will be passed into the PuTTY session. Only available if the mode is "SSH", "Telnet" or "Rlogin". + + + ASN + + + AS Name + + + City + + + Continent + + + Country + + + Currency + + + District + + + DNS resolver + + + EDNS + + + Geolocation + + + Hosting + + + IP geolocation + + + ISP + + + Latitude + + + Longitude + + + Mobile + + + Organization + + + PTR record + + + Timezone + + + Zip + + + IP Geolocation API - Fast, accurate, reliable + + + Check DNS resolver + + + Check IP geolocation + + + Show map + + + The DNS resolver is determined via ip-api.com. + +URL: https://edns.ip-api.com/ + + + The IP geolocation is determined via ip-api.com. + +URL: http://ip-api.com/ + + + To provide additional features, third party services are used that are not operated by me. You can deselect them below. No data is transferred to me at any time. + + + Checking DNS resolver... + + + Checking IP geolocation... + + + Check your network connection and try again in a few seconds. + + + ip-api.com rate limit reached (too many requests from your network)! +Try again in a few seconds. + + + HTTP status code + + + Steel + + + Rate limit reached! Try again in {0} seconds... + + + General + + + BSSID + + + No reachable hosts found! + + + Application + + + Enable experimental features to test new functions. These are not yet complete, contain bugs, can crash the application and may change again until release. + + + Experimental features + + + Experimental + + + Run command... + + + IP Geolocation + + + Add a tab to query the IP geolocation... + + + Enter a domain to query whois... + + + Enter host to query IP geolocation... + + + Unknown user name. + + + Authentication failure (incorrect password, community or key). + + + The operation was successful without any errors. + + + The response to your request was too large to fit into a single response! + + + The requested OID could not be found! + + + A read-write or write-only object was set to an inconsistent value! + + + The requested OID does not exist and is not writable! + + + An error occurred for which no specific message is available! + + + The requested object is not accessible for modification! + + + The object was set to an incompatible data type! + + + The value assigned to the object exceeds its maximum length! + + + The encoding used for the object is incorrect! + + + The value assigned to the object is not a valid choice! + + + The requested object does not exist and cannot be created! + + + The MIB variable is currently in an inconsistent state and cannot be modified! + + + There are no available system resources to perform the requested operation! + + + An error occurred during the set operation! + + + A set operation failed, and previous changes could not be rolled back! + + + Authentication failed. Please check the community string! + + + The requested object is not writable and cannot be modified! + + + The object's state is inconsistent, preventing the set operation! + + + Close all + + + Expand host view + + + Expand map view + + + Host cannot be set while other hosts are being added. Please wait until the process is complete and try again. + + + No matching commands! + + + Remote hostname + + + Process ID + + + Process path + + + Process name + + + NetBIOS + + + Computer name + + + Error + + + OK + + + Warning + + + Group / domain + + + NetBIOS reachable + + + Scan for NetBIOS + + + NetBIOS scan is disabled! + + + Resolve Hostname is disabled! + + + Resolve MAC address is disabled! + + + Close group + + + Run command... (Ctrl+Shift+P) + + + Profile files + + + Open settings... + + + Expand and open search... + + + Starting with Windows 11 24H2, you’ll need to allow access to the Wi-Fi adapter. + +Open Windows Settings > Privacy & security > Location, enable access for Desktop Apps / NETworkManager, then restart the application. + + + Drag and drop the applications to reorder them. +Right-click for more options. + + + Restore defaults + + + An easy to use drag'n'drop framework for WPF. + + + BSD-3-Clause + + + Set default + + + Ubuntu Server running Docker with Nextcloud and Traefik... + + + Linux servers running in AWS... + + + 6 GHz + + + Support this project with a donation. + + + Open documentation + + + Donate + + + Profile file + + + Hosts File Editor + + + Hosts File Editor + + + Read-only mode. Modifying the hosts file requires elevated rights! + + + Open hosts file + + + Comment + + + Disable + + + Edit entry + + + Edit entry... + + + Enable entry + + + Disable entry + + + Refreshing... + + + Reloaded at {0} + + + Failed to load hosts file: {0} + + + Retrying in {0} seconds... + + + What's new? + + + Changelog + + + Upgraded to {0} + + + This release includes new features, improvements, and bug fixes. Check out the changelog for all the details! + + + Entries + + + The selected entry is permanently deleted: + +{0} {1} {2} + + + Primary DNS server + + + Enter a valid hostname (e.g., "server-01" or "example.com")! Multiple hostnames can be separated with a space. + + + The "hosts" file could not be read! See log file for more details. + + + The "hosts" file could not be written to. See log file for more details. + + + The entry was not found in the "hosts" file! Maybe the file has been modified. + + + A backup of the "hosts" file could not be created! See log file for more details. + + + Show status bar + + + Displays the status bar in the bottom-left of the WebView when hovering over a link. + + + Save credentials + + + Displays a dialog to save credentials after a successful sign-in. + + + Delete browsing data + + + Permanently delete browsing data (history, cookies, cache, credentials, etc.) for the current WebView2 profile. + + + Browsing Data + + + Browsing data successfully deleted! + + + An error occurred while deleting browsing data. Feel free to report this issue on GitHub. + + + production + + + Add tag + + + Apply filter + + + Filter profiles... + + + Filter by tags + + + No tags found! + + + Match + + + Any + + + Add group... + + + Expand all + + + Collapse all + + + Use custom themes to personalize the appearance of the application. You can edit or add theme in the "Program Folder > Themes" directory. For more details, refer to the documentation. + + + Admin (console) session + + + Profile file "{0}" will be deleted permanently. + + + Enable encryption? + + + Do you want to enable profile file encryption to protect sensitive data such as hosts, IP addresses, URLs, and stored credentials? + +You can enable or disable encryption later at any time by right-clicking the profile file to manage encryption settings. +If you click Cancel, the profile file will remain unencrypted. + + + A restart is required to apply changes such as language settings. + + + Could not parse or resolve any of the specified DNS servers. + + + Could not parse "{0}". + + + Maximum number of backups + + + Create daily backup + + + Number of backups that are retained before the oldest one is deleted. + + + This setting is managed by your administrator. + + + Restore default location + + + Restore + + + Restore default location? + + + The default settings location is restored and the application is restarted afterwards. + +You can copy the “settings.json” file from "{0}" to "{1}" to migrate your previous settings, if necessary. The application must be closed for this to prevent the settings from being overwritten. + + + Change location? + + + The settings location is changed and the application is restarted afterwards. + +You can copy the “settings.json” file from "{0}" to "{1}" to migrate your previous settings, if necessary. The application must be closed for this to prevent the settings from being overwritten. + + + Enter a valid folder path! + + + The profiles location is changed and the application is restarted afterwards. + +You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. + + + The default profiles location is restored and the application is restarted afterwards. + +You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. + + + Network connection + + + Network Status + + + Active Directory import failed. + + + Options + + + + Uses your current Windows credentials to read from Active Directory. The account must be allowed to enumerate computer objects under the search base (subtree). + + + Search base (DN) + + + Additional LDAP filter + + + Filter must be a valid LDAP expression starting with '(' and ending with ')'. + + + Search base must be a valid LDAP distinguished name (e.g. DC=example,DC=com). + + + Imported from Active Directory on {0} + + + No computers found for the given search base and filter. + + + Searching Active Directory... + + + If your computer is not joined to the domain, specify the domain controller (hostname or IP) and use custom credentials. + + + Server (optional) + + + Port (optional) + + + Use SSL (LDAPS) + + + Use current Windows credentials + + + Use these credentials + + + Advanced + + + Select all + + + Deselect all + + + Enable for + + + Skip already imported + + + {0} · {1} result(s) + + + {0} profile(s) imported. +{1} duplicate entries skipped. +{2} without a host skipped. + + + Active Directory + + + CSV file + + + CSV file + + + Import profiles from CSV file + + + Imported from CSV file on {0} + + + No entries were found in the CSV file. + + + Expected CSV format — one profile per line: + + + A header row and the delimiter (semicolon, comma or tab) are detected automatically. The description column is optional. Entries without a host cannot be imported. + + + Import results + + + New + + + Imported + + + No host + + + Exclude disabled accounts + + + Import computers from Active Directory + + + Import computers from Active Directory... + + + Import profiles + + + Source + + + Active Directory + + + Profile group + + + Existing or new group name + + + Firewall + + + Firewall rules + + + Windows Firewall settings + + + Direction + + + Inbound + + + Outbound + + + Action + + + Allow + + + Block + + + Network profile + + + Network profiles + + + Interface type + + + Failed to load firewall rules. {0} + + + The selected firewall rule is permanently deleted: + +{0} + + + Any + + + TCP + + + UDP + + + ICMPv4 + + + ICMPv6 + + + HOPOPT + + + GRE + + + IPv6 + + + IPv6-Route + + + IPv6-Frag + + + IPv6-NoNxt + + + IPv6-Opts + + + VRRP + + + PGM + + + L2TP + + + Any + + + Wired + + + Wireless + + + Remote access + + + Read-only mode. Modifying firewall rules requires elevated rights! + + + Inbound + + + Outbound + + + Block + + + Allow + + + Local ports + + + Remote ports + + + Local addresses + + + Remote addresses + + + Enter a valid IP address, subnet (e.g. 10.0.0.0/8), range (e.g. 10.0.0.1-10.0.0.10), or keyword (Any, LocalSubnet, DNS, DHCP, WINS, DefaultGateway, Internet, Intranet, IntranetRemoteAccess, PlayToDevice, CaptivePortal) + + + Add rule + + + Add rule... + + + Edit rule + + + Edit rule... + + + Delete rule + + + Enable rule + + + Disable rule + + + Import profiles... + + + Speed Test + + + Run speed test + + + Fetching metadata... + + + Measuring latency... + + + Measuring download speed... + + + Measuring upload speed... + + + Measure download and upload speeds, latency, and jitter with speed.cloudflare.com. +Cloudflare may log your IP address and network information. See Cloudflare's privacy policy for details. + + + Latency + + + Jitter + + + Speed test service used to measure download speed, upload speed, latency, and jitter. + + + Stop diff --git a/Source/NETworkManager.Localization/Resources/Strings.it-IT.resx b/Source/NETworkManager.Localization/Resources/Strings.it-IT.resx index 57795a66a3..8b99389d63 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.it-IT.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.it-IT.resx @@ -138,8 +138,33 @@ ARP - - Tabella ARP + + Elenco router + + + Modalità di sola lettura. +La modifica dell'elenco router richiede diritti elevati! + + + Non raggiungibile + + + Incompleto + + + Sonda + + + Ritardo + + + Stalo + + + Raggiungibile + + + Permanente Autenticazione @@ -285,12 +310,24 @@ Interfaccia di rete + + Configurazione applicata + + + La configurazione dell'interfaccia di rete richiede diritti elevati! + Nuova scheda + + Avanti + OUI + + Opzioni + Vuoi sovrascrivere? @@ -348,9 +385,6 @@ Impostazioni - - Le impostazioni sono state ripristinate! - SNMP @@ -412,7 +446,7 @@ Amministratore - Visualizza sempre l'icona nella'area di notifica + Visualizza sempre l'icona nell'area di notifica Tentativi @@ -444,6 +478,18 @@ Descrizione + + Segnaposto + + + Percorso del file o dell'eseguibile da eseguire. È possibile usare i seguenti segnaposto: + + + Argomenti passati al file o all'eseguibile. È possibile usare i seguenti segnaposto: + + + È possibile usare il seguente segnaposto: + DHCP abilitato @@ -489,6 +535,30 @@ Indirizzo IPv4 + + Aggiunto indirizzo IPv4 + + + Rimosso indirizzo IPv4 + + + Indirizzo IPv4 rilasciato e rinnovato + + + Rilasciato indirizzo IPv4 + + + Rinnovato indirizzo IPv4 + + + Indirizzo IPv6 rilasciato e rinnovato + + + Rilasciato indirizzo IPv6 + + + Rinnovato indirizzo IPv6 + Gateway IPv4 predefinito @@ -504,11 +574,23 @@ Gateway IPv6 predefinito + + Mappa + + + (altri +{0}) + + + Scorri = Zoom, Trascina = Panoramica + + + Sconosciuto + Massimo - - Hop max per router + + Hop masssimi Minimizza la finestra principale invece di chiudere l'applicazione @@ -561,9 +643,6 @@ Necessario riavvio - - Alcune impostazioni verranno applicate solo dopo aver riavviato l'applicazione! - Salva le impostazioni nella cartella dell'applicazione @@ -577,7 +656,7 @@ Visualizza la seguente applicazione all'avvio: - Un potente strumento per la gestione delle reti e la risoluzione dei problemi di rete! + Un potente strumento open source per la gestione delle reti e la risoluzione dei problemi di rete! Velocità @@ -594,11 +673,8 @@ Indirizzo statico server DNS IPv4 - - Maschera di sottorete - - - Maschera di sottorete o CIDR + + Maschera sottorete Thread @@ -621,8 +697,8 @@ Time out (ms) - - Tempo di attesa tra ogni ping + + Tempo (ms) di attesa tra ogni ping TTL @@ -663,9 +739,6 @@ Aggiungi una scheda per eseguire un trace... - - Aggiungi una scheda per interrogare le intestazioni HTTP ... - Aggiungi il suffisso DNS (primario) al nome host @@ -691,7 +764,7 @@ Applica - Applica le combinazioni di tasti Windows (ad esempio ALT + TAB): + Applica combinazioni tasti Windows (ad es. ALT+Tab): Aut @@ -720,6 +793,9 @@ Il blocco maiuscole è abilitato! + + Tempo grafico (secondi) + Controllo aggiornamenti all'avvio @@ -815,7 +891,7 @@ Per alcune funzioni, la password deve essere convertita in una stringa normale e Il profilo selezionato verrà eliminato definitivamente. - Autoconfigurazione DNS + Configurazione automatica DNS Ricerca DNS... @@ -823,9 +899,6 @@ Per alcune funzioni, la password deve essere convertita in una stringa normale e Server DNS - - Apri documentazione - Dominio @@ -844,8 +917,8 @@ Per alcune funzioni, la password deve essere convertita in una stringa normale e Tempo di fine - - Inserisci una sottorete per calcolarla ... + + Inserisci una sottorete per calcolarlo... Per creare sottoreti inserisci la sottorete e una nuova maschera di sottorete... @@ -870,9 +943,6 @@ Verifica se disponi delle autorizzazioni di scrittura. Dimensione dello schermo fissa: - - Star/fork del progetto su GitHub - Trovato @@ -979,6 +1049,9 @@ Controlla i parametri! OID + + Sono consentiti solo file CSV! + Solo quando si usa lo schermo intero @@ -1003,12 +1076,6 @@ Controlla i parametri! sostituisci - - Vuoi sovrascrivere le impostazioni nella cartella di destinazione? - -'Sovrascrivi' sovrascriverà il file nella cartella di destinazione. -'Usa altro' userà il file delle impostazioni esistente nella destinazione e riavvierà l'applicazione. - Password @@ -1039,9 +1106,6 @@ Controlla i parametri! Il processo PuTTY è terminato! - - Profilo PuTTY - Domande @@ -1052,7 +1116,7 @@ Controlla i parametri! Ricorsione - Reindirizza la clipboard + Reindirizza gli appunti Reindirizza dispositivi @@ -1108,18 +1172,6 @@ Controlla i parametri! Seleziona una risoluzione dello schermo - - Le seguenti impostazioni verranno sovrascritte! - - - Le impostazioni selezionate sono state ripristinate. - - - Seleziona le impostazioni da esportare: - - - Seleziona le impostazioni da importare: - Selezionando questo verranno ripristinate tutte le impostazioni! @@ -1127,23 +1179,17 @@ Controlla i parametri! Seriale - Liena seriale + Linea seriale Servizio - Il file delle impostazioni trovato è danneggiato o non è compatibile con questa versione. -Tutte le impostazioni sono state ripristinate (i file di profilo non sono interessati)! - - - Esportazione impostazioni completata! - - - Importazioni impostazioni completata! - - - Ripristino impostazioni completato! + Il file delle impostazioni trovato è danneggiato o non è compatibile con questa versione! +Puoi segnalare questo problema su GitHub. +È stato creato un backup del file delle impostazioni nella cartella delle impostazioni e le impostazioni sono state ripristinate. + +I file del profilo non sono interessati dal problema! Visualizza porte chiuse @@ -1154,8 +1200,8 @@ Tutte le impostazioni sono state ripristinate (i file di profilo non sono intere Visualizza solo i tipi di interrogazione più comuni - - Visualizza risultati scansione per tutti gli indirizzi IP + + Visualizza indirizzi IP e porte non raggiungibili Visualizza statistiche @@ -1197,10 +1243,11 @@ Tutte le impostazioni sono state ripristinate (i file di profilo non sono intere Il processo può richiedere del tempo e delle risorse (CPU / RAM). - Il percorso delle impostazioni non ha subito modifiche + I file delle impostazioni non sono interessati dal problema! - Time out interrogazione SNMP + Timeout sulla query SNMP. +Forse l'host non è raggiungibile oppure la community/password è sbagliata. Time out durante l'interrogazione del server DNS con l'indirizzo IP "{0}" @@ -1214,8 +1261,8 @@ Tutte le impostazioni sono state ripristinate (i file di profilo non sono intere Errore sconosciuto! - - Rimuovi dall'area di notifica / porta in primo piano + + Porta la finestra in primo piano URL @@ -1319,6 +1366,9 @@ Tutte le impostazioni sono state ripristinate (i file di profilo non sono intere Svuota la cache DNS + + Cache DNS svuotata + Decodifica e carica le credenziali per selezionarle. @@ -1378,12 +1428,12 @@ Cerca per tag con "tag = xxx". Sovrascrivi + + Analizza + Incolla - - C:\Program Files\PuTTY\putty.exe - Ricollega @@ -1391,7 +1441,7 @@ Cerca per tag con "tag = xxx". Aggiorna - Riavvia addesso + Riavvia Salva @@ -1427,16 +1477,16 @@ Cerca per tag con "tag = xxx". Inserisci un indirizzo IPv4 valido! - Inserisci un indirizzo MAC valido (es. 00: F1: 23: AB: F2: 35)! + Inserisci un indirizzo MAC valido (ad es. 00: F1: 23: AB: F2: 35)! Inserisci una porta valida (1 - 65535)! - Inserisci una sottorete valida (per esempio 255.255.255.0)! + Inserisci una maschera sottorete valida (ad es. 255.255.255.0)! - Inserisci una sottorete o CIDR validi (per esempio 255.255.255.0 o /24)! + Inserisci una maschera sottorete o CIDR valida (ad es. 255.255.255.0 o /24)! Il campo non può essere vuoto! @@ -1508,10 +1558,10 @@ Cerca per tag con "tag = xxx". Inserisci una porta e/o intervallo di porte validi (1 - 65535)! - Inserisci una sottorete valida (es. 192.168.178.133/26)! + Inserisci una sottorete valida (ad es. 192.168.178.133/26)! - Inserisci un sito web valido (es. https://example.com/index.html) + Inserisci n sito web valido (ad es. https://example.com/index.html) Verde @@ -1546,6 +1596,9 @@ Cerca per tag con "tag = xxx". Lime + + Live + Magenta @@ -1732,7 +1785,7 @@ Il nome di dominio della parte di autenticazione potrebbe essere errato, il domi Attesa chiusura - Chisura + Chiusura Elimina Tcb @@ -1741,7 +1794,7 @@ Il nome di dominio della parte di autenticazione potrebbe essere errato, il domi Stabilita - Atetsa finale 1 + Attesa finale 1 Attesa finale 2 @@ -1776,9 +1829,6 @@ Il nome di dominio della parte di autenticazione potrebbe essere errato, il domi Giallo - - Inserisci un valore valido tra 25 e 100! - Esiste già un profilo con questo nome! @@ -1807,7 +1857,10 @@ Il nome di dominio della parte di autenticazione potrebbe essere errato, il domi Aggiungi una scheda per interrogare whois... - Inserisci un dominio valido (come "esempio.com")! + Inserisci un dominio valido (ad es. "esempio.com")! + + + Inserisci un nome utente Windows valido (ad esempio "utente", "DOMINIO\utente" o "utente@dominio.com")! Server Whois non trovato per il dominio: "{0}" @@ -1851,9 +1904,6 @@ Il nome di dominio della parte di autenticazione potrebbe essere errato, il domi Configura nelle impostazioni il percorso di TigerVNC... - - Percorso TigerVNC... - Il processo TigerVNC è terminato! @@ -1918,11 +1968,11 @@ Per ulteriori dettagli visualizza il messaggio di errore: Aggiungi indirizzo IPv4... - - Thread host + + N. max thread host simultanei - - Thread porta + + N. amx thread porta simultanei PowerShell @@ -1939,14 +1989,11 @@ Per ulteriori dettagli visualizza il messaggio di errore: Console remota - - Percorso PowerShell... - Percorso file - Sovarscrivi le impostazioni predefinite + Sovrascrivi impostazioni predefinite Risolvi l'indirizzo IPv4 per questo host @@ -1979,11 +2026,11 @@ Per ulteriori dettagli visualizza il messaggio di errore: Attività in background - L'attività in background salverà modifiche, profili e credenziali ogni x minuti. + l'attività in background salverà impostazioni e profili ogni x minuti. -Un valore 0 disabiliterà questa funzione. +Il valore 0 disabiliterà questa funzione. -Per avere effetto la modifica di questo valore richiede il riavvio dell'applicazione. +Le modifiche a questo valore avranno effetto dopo il riavvio dell'applicazione. Esegui le attività in background ogni x minuti @@ -1995,16 +2042,16 @@ Per avere effetto la modifica di questo valore richiede il riavvio dell'applicaz Pannello di controllo - Tutte le impostazioni possono essere modificate successivamente nelle impostazioni + Tutte le impostazioni possono essere modificate successivamente nelle impostazioni! Controlla l'indirizzo IP pubblico - - Grazie per l'uso di NETworkManager! + + Grazie per aver usato NetworkManager! -Per fornire funzionalità aggiuntive l'applicazione usa servizi su Internet che non sono gestiti da me. -In qualsiasi momento non mi verrà inviato nessun dato personale. +Se ti piace, per favore considera di supportare il suo sviluppo, lasciando una stella su GitHub, facendo una donazione o semplicemente condividendola con gli altri. +Il tuo supporto aiuta il progetto a continuare e a crescere. Quando parte, il programma verifica in background se sono disponibili nuove versioni su GitHub. @@ -2025,14 +2072,14 @@ URL: https://api.ipify.org e https://api6.ipify.org Servizi esterni - - Start/fork progetto su Github. + + Star/fork del progetto su GitHub. - - Aiutaci nella traduzione del programma su Transiflex. + + Aiutaci a tradurre il progetto su Transifex. - - Contattami su Twitter. + + Seguimi o contattami tramite X. Connessione @@ -2052,15 +2099,6 @@ URL: https://api.ipify.org e https://api6.ipify.org Controlla la configurazione della scheda di rete (DHCP, IP statico) e se sei connesso ad una rete. - - Errore - - - OK - - - Avviso - Impossibile rilevare l'indirizzo IP del gateway! @@ -2115,8 +2153,8 @@ Controlla la connessione di rete (firewall, proxy, ecc.). Usa API indirizzo IPv4 personalizzato - - URL ad un servizio Web che può essere raggiunto tramite HTTP o HTTPS e restituisce un indirizzo IP come risposta. + + URL ad un servizio web che può essere raggiunto tramite HTTP o HTTPS e restituisce un indirizzo IPv4, ad es. "xx.xx.xx.xx" come risposta. Impossibile analizzare l'indirizzo IP pubblico da "{0}"! @@ -2191,6 +2229,12 @@ Prova un altro servizio o usa quello predefinito... Stili visivi + + Solo visualizzazione + + + Nella sessione remota blocca input da tastiera e mouse + Audio remoto @@ -2236,24 +2280,39 @@ Prova un altro servizio o usa quello predefinito... Programma + + Privata + + + Pubblica + Il comando personalizzato selezionato verrà eliminato definitivamente. - - Sono disponibili le seguenti variabili: - -$$ipaddress$$ --> Indirizzo IP -$$hostname$$ --> Nome host - Riavvia - - Impossibile risolvere l'indirizzo IP nome host! + + Impossibile risolvere l'indirizzo IP per il nome host! Ctrl+Alt+Canc + + Gestione attività (Ctrl+Maiusc+Esc) + + + Blocca (Win+L) + + + Visualizza desktop (Win+D) + + + Explorer (Win+E) + + + Finestra Esegui (Win+R) + Tasti rapidi @@ -2290,8 +2349,8 @@ $$hostname$$ --> Nome host Visualizza la finestra di stato al cambio della rete - - Tempo in secondi per quanto tempo deve essere visualizzata la finestra + + Tempo in secondi di visualizzazione della finestra di stato WiFi @@ -2317,12 +2376,18 @@ $$hostname$$ --> Nome host Canale + + Larghezza canale + 2.4 GHz 5 GHz + + 2.4 GHz e 5 GHz + Livello segnale @@ -2362,11 +2427,8 @@ $$hostname$$ --> Nome host Timeout (s) - - Segnala un problema o richiedi nuova funzionalità - - - Segnala un problema o richiedi nuova funzionalità. + + Segnala un problema o crea una richiesta di funzionalità. Intervallo Beacon @@ -2407,12 +2469,39 @@ $$hostname$$ --> Nome host Impossibile risolvere indirizzo IP per: "{0}" + + Notifiche + + + Al cambiamento di stato visualizza popup notifica + + + Al cambiamento di stato riproduci suono + + + Soglia successo operazione + + + Numero ping consecutivi riusciti necessari prima che venga visualizzata la notifica 'Host attivo'. Valori più alti riducono il rumore prodotto dallo collisione degli host. + + + Soglia fallimento operazione + + + Numero ping consecutivi non riusciti (timeout) necessari prima che venga visualizzata la notifica 'Host non attivo'. Valori più alti riducono il rumore prodotto dalla collisione degli host. + + + Durata visualizzazione (secondi) + + + Host attivo + + + Host non attivo + L'applicazione verrà riavviata... - - Usa altra cartella - Impossibile esportare il file! Vedi messaggio errore: "{0}" @@ -2430,8 +2519,8 @@ Vedi messaggio errore: "{0}" È criptato - - Apri documentazione su Github + + Apri la documentazione. Personale 1 @@ -2460,9 +2549,6 @@ Vedi messaggio errore: "{0}" Elimina file profilo - - Il file profilo selezionato verra eliminato permanentemente. - Tutti profili in questo file profilo verranno permanentemente eliminati! @@ -2485,7 +2571,7 @@ Vedi messaggio errore: "{0}" Riavvia come amministratore - Per analizzare i pacchetti di rete l'applicazione deve essere avviata con privilegi elevati! + L'analisi dei pacchetti di rete richiede diritti elevati! Cattura @@ -2514,14 +2600,14 @@ Vedi messaggio errore: "{0}" Protocollo discovery - + CDP - + LLDP - - LLDP/CDP + + LLDP / CDP {0} secondi rimanenti... @@ -2553,8 +2639,8 @@ Vedi messaggio errore: "{0}" Per questa funzione è richiesto Microsoft.Windows.SDK.Contracts che non è disponibile nel sistema (es. Windows Server) - - Tabella ARP + + Elenco router Connessioni @@ -2611,7 +2697,7 @@ Vedi messaggio errore: "{0}" TigerVNC - Tarceroute + Traceroute WakeOnLAN @@ -2691,134 +2777,47 @@ Vedi messaggio errore: "{0}" Giallo - + Acciaio - + Generale - - Intestazioni HTTP - - - Consultazione DNS - - - Scansione IP - - - Interfacce di rete - - - Ping - - - Monitor ping - - - Scansione porte - - - PowerShell - - - PuTTY - - - Desktop remoto - - - TigerVNC - - - Traceroute - - - Wake On LAN - - - Console web - - - Whois - - + Applicazioni - + Generale - - Aspetto + + Apparenza - + Avvio automatico - - Pannello di controllo - - - Consultazione DNS - - + Generale - + Tasti rapidi - - Intestazioni HTTP - - - Scansione IP - - + Lingua - - Monitor ping> - - - Scansione porte - - - PowerShell - - + Profili - - PuTTY - - - Desktop remoto - - + Impostazioni - - SNMP - - + Stato - - TigerVNC - - - Traceroute - - - Aggiorna programma - - - Wake On LAN - - - Whois + + Aggiorna - - Finestra + + Finestre Abilita registro eventi @@ -2848,7 +2847,7 @@ Vedi messaggio errore: "{0}" Registro eventi SSH - Registro eventi SSH e RAW + Registro SSH e RAW Inserisci un nome di file valido! @@ -2893,7 +2892,7 @@ Vedi messaggio errore: "{0}" Apri profilo porte... - Visualizza schermata benvevuto all'avvio + All'avvio visualizza schermata benvenuto Schermata benvenuto @@ -2910,14 +2909,18 @@ Vedi messaggio errore: "{0}" SSID - - Il profilo non può essere caricato! + + Impossibile caricare il file del profilo! - - Se ciò si è verificato dopo un aggiornamento, potrebbe essere necessario migrare i profili ad una versione più recente. -Quando selezioni "Migra", si apre una finestra di PowerShell con lo script di migrazione. -Controlla il percorso e premi 'Invio'. -In caso contrario, il profilo potrebbe essere danneggiato e se vuoi puoi segnalare il problema su GitHub. + + Impossibile caricare il file del profilo, potrebbe essere danneggiato. +Puoi provare a ripristinare il file da un backup o eliminarlo. + +Se ciò accade inaspettatamente o dopo un aggiornamento, segnala l'errore su GitHub. + + +Messaggio di errore: +"{0}" Modifica gruppo... @@ -2957,26 +2960,12 @@ Segnala questo problema su Github. Unisci - - La cartella destinazione contiene già dei file. -Se selezioni 'Unisci', i profili attuali verranno copiati nella cartella. - - - Vuoi sovrascrivre i profili nella cartella destinazione? - -"Sovrascrivi" copierà i file dei profili nella cartella destinazione e sovrascriverà i file profilo esistenti. -"Unisci" copierà i file profilo nella cartella di destinazione, ma non sovrascriverà i file profilo esistenti. -"Usa altra cartella" userà i file profilo esistenti nella cartella destinazione. - Usa altri Sposta - - I file del profilo verranno spostati nella cartella destinazione selezionata. - Ultima scansione il {0} @@ -3005,7 +2994,7 @@ Se selezioni 'Unisci', i profili attuali verranno copiati nella cartella.La libreria C # si occupa di reti complesse, IP, IPv4, IPv6, maschere di rete, CIDR, sottoreti, subnetting, supernet e supernetting per gli sviluppatori .NET. - Grafici, mappe e indicatori semplici, flessibili, interattivi e potenti per .Net + Grafici, mappe e indicatori belli e interattivi. Una raccolta di indicatori di carico per WPF @@ -3034,8 +3023,11 @@ Se selezioni 'Unisci', i profili attuali verranno copiati nella cartella. Elenco dei domini di primo livello da iana.org, usato per interrogare i server whois del TLD da whois.iana.org tramite la porta 43 + + Conversione GeoJSON dati mappa vettoriale Terra naturale (CC0-1.0). + - Dati IEEE OUI ripuliti da linuxnet.ca. + Dati OUI da ieee.org. Registro del nome del servizio e del numero di porta del protocollo di trasporto da iana.org. @@ -3085,10 +3077,10 @@ Per archiviare le credenziali in modo sicuro abilita la crittografia del file de Inserisci un indirizzo IPv6 valido! - Indirizzo IPv4 accessibile al pubblico. + Indirizzo IPv4 pubblico raggiungibile tramite ICMP. - Indirizzo IPv6 accessibile al pubblico. + Indirizzo IPv6 pubblico raggiungibile tramite ICMP. Indirizzo IPv4 pubblico @@ -3166,7 +3158,1440 @@ Questo limite è impostato dall'amministratore del server o dai criteri di rete. I profili selezionati verranno eliminati definitivamente. - - Per aggiungere, modificare o eliminare un profilo sblocca il file del profilo! + + Usa temi personalizzati + + + Temi personalizzati + + + Vuoi ripristinare le impostazioni? + + + Impostazioni ripristinate! + + + ID istanza + + + Connessione locale + + + Interfaccia locale + + + log4net è uno strumento per creare un registro delle istruzioni di output del programmatore per una varietà di destinazioni di output. + + + Abilitato + + + Regione + + + Profili e regioni da sincronizzare + + + Profilo predefinito + + + Regione predefinita + + + Il nome gruppo non può iniziare con "{0}"! + + + Controlla disponibilità pre-release + + + La sincronizzazione è disabilitata! + + + Comando + + + Applica tema alla console PowerShell + + + Il colore della console di PowerShell può essere modificato nel tema dell'applicazione in Impostazioni > Generale > Aspetto + + + Se abiliti questa opzione, le impostazioni predefinite della console PowerShell nel registro in HKCU:\Console verranno sovrascritte in modo che la finestra della console PowerShell corrisponda al tema dell'applicazione. Si tratta di un'impostazione di sistema globale che potrebbe influire sull'aspetto della normale finestra di PowerShell. + +Verranno modificate solo le console PowerShell configurate nelle impostazioni di PowerShell. Sono supportati sia Windows PowerShell che PWSH (PowerShell 7 e versioni successive). + +Per maggiori dettagli fai clic nell'angolo in alto a destra sul pulsante 'Guida/Documentazione' (a sinistra del pulsante 'Riduci a icona') o accedi a https://borntoberoot.net/NETworkManager/Documentation/Settings/Appearance. Ecco i valori documentati che verranno adeguati. + +Se l'opzione viene nuovamente disabilitata, i valori non verranno più modificati. Tuttavia, NON verranno ripristinati i valori originali. + + + L'input non può terminare con un ";"! + + + L'input non contiene testo! + + + Calcolatore bit + + + Calcolatore bit + + + Notazione + + + Input + + + Unità + + + Bit + + + Gigabit + + + Gigabyte + + + Kilobit + + + Kilobyte + + + Megabit + + + Megabyte + + + Petabit + + + Petabyte + + + Terabit + + + Terabyte + + + Inserisci un numero e seleziona un'unità per calcolare le unità... + + + Rete + + + Proxy + + + Risolvi l'indirizzo IP per questo host (è preferibile IPv4) + + + Un percorso valido per PowerShell dovrebbe terminare con "pwsh.exe" o "powershell.exe"! + + + Un percorso valido per PuTTY dovrebbe terminare con "PuTTY.exe"! + + + Un percorso valido per TigerVNC dovrebbe terminare con "vncviewer-*.exe" o "vncviewer64-*.exe"! + + + Ricerca SNTP + + + Sposta i componenti e le dipendenze di runtime di un'app .NET Framework/.NET Core in una sotto cartella. + + + Aggiungi una scheda per eseguire una ricerca SNTP... + + + Server SNTP + + + URL ad un servizio web che può essere raggiunto tramite HTTP o HTTPS e restituisce un indirizzo IPv6, ad es. "XXXX: XX: XXX :: XX" come risposta. + + + Terminale IP + + + Orario locale finale + + + Orario locale finale + + + Orario di rete + + + Offset + + + Ritardo andata e ritorno + + + Server + + + Ricerca SNTP + + + Aggiungi server SNTP + + + Elimina server SNTP + + + Il server SNTP selezionato verrà definitivamente eliminato. + + + Modifica server SNTP + + + Esiste già un server SNTP con questo nome! + + + Inserisci un nome host valido (ad es. "server-01" o "esempio.com") o un indirizzo IP valido (ad es. 192.168.178.1)! + + + Server + + + Per sbloccare il file del profilo inserisci la password principale: + + + Sblocca file profilo + + + Timeout + + + Tasto rapido + + + Le impostazioni verranno ripristinate e l'applicazione successivamente verrà riavviata! + + + Le impostazioni sono state ripristinate! + + + Stato ping + + + ThreadPool aggiuntivo min. thread + + + Questa impostazione specifica il numero minimo di thread che verranno creati dal ThreadPool dell'applicazione su richiesta. +Ciò può migliorare le prestazioni, ad esempio, dello scanner IP o del port scanner. +Il valore viene aggiunto al n. min. predefinito thread (numero thread CPU). +Il valore 0 lascia le impostazioni predefinite. +Se il valore è superiore a quello predefinito max. thread del ThreadPool, verrà usato questo valore. +Se il valore è troppo alto, potrebbero verificarsi problemi di prestazioni. +Le modifiche a questo valore avranno effetto dopo il riavvio dell'applicazione. +Se il valore è stato impostato correttamente, è possibile verificarlo nel file registro in %LocalAppData%\NETworkManager\NETworkManager.log + + + Queste impostazioni modificano solo il numero massimo di thread eseguiti contemporaneamente per scansione host/porta. +Vai in Impostazioni > Generali > Generali per regolare i thread minimi dell'applicazione. + + + Stato porta + + + Dettagli ping + + + Nessuna porta aperta trovata! + + + La scansione delle porte è disabilitata! + + + Scansione porte + + + Impossibile trovare l'applicazione "{0}". +Forse l'applicazione era nascosta nelle impostazioni? + + + Finestra di stato + + + Visualizza barra indirizzi + + + L'attivazione di questa impostazione non è consigliata. +Più istanze dell'applicazione condividono le stesse impostazioni e file di profilo. +L'ultima istanza da chiudere potrebbe sovrascrivere le modifiche apportate da altre istanze. + + + Bypass per indirizzi locali + + + Abilita server gateway + + + Metodo accesso + + + Server gateway + + + Nome server + + + Condividi le credenziali del gateway con il computer remoto + + + Consenti di selezionarlo più tardi + + + Smart card o Windows Hello for Business + + + Richiedi password (NTLM) + + + Usa credenziali gateway + + + Questo computer non può connettersi al computer remoto perché il server gateway desktop remoto è temporaneamente non disponibile. +Prova a riconnetterti più tardi o contatta per assistenza l'amministratore di rete. + + + Questo computer non può connettersi al computer remoto a causa di uno dei seguenti motivi: +1) L'indirizzo del server gateway desktop remoto richiesto ed il nome del soggetto del certificato SSL del server non corrispondono. +2) Il certificato è scaduto o revocato. +3) L'autorità del certificato principale non considera attendibile il certificato. Per assistenza contatta l'amministratore di rete. + + + Questo computer non è in grado di verificare l'identità del gateway desktop remoto. +Non è sicuro connettersi a server che non possono essere identificati. +Per assistenza contatta l'amministratore di rete. + + + Questo computer non può connettersi al computer remoto perché l'indirizzo del server gateway desktop remoto richiesto e il nome del soggetto del certificato non corrispondono. +Per assistenza contatta l'amministratore di rete. + + + Questo computer non può connettersi al computer remoto perché il certificato del server gateway desktop remoto è scaduto o è stato revocato. +Per assistenza contatta l'amministratore di rete. + + + Si è verificato un errore durante l'invio dei dati al server gateway desktop remoto. +Il server è temporaneamente non disponibile o una connessione di rete non è attiva. +Riprova più tardi o contatta l'amministratore di rete per assistenza. + + + Si è verificato un errore durante la ricezione dei dati dal server gateway desktop remoto. +Il server è temporaneamente non disponibile o una connessione di rete non è attiva. +Riprova più tardi o contatta l'amministratore di rete per assistenza. + + + Questo computer non può connettersi al computer remoto perché l'indirizzo del server gateway desktop remoto non è raggiungibile o non è corretto. +Inserisci un indirizzo valido del server gateway desktop remoto. + + + Questo computer non può connettersi al computer remoto perché il server gateway desktop remoto sta esaurendo le risorse del server ed è temporaneamente non disponibile. +Prova a riconnetterti più tardi o contatta l'amministratore di rete per assistenza. + + + Il server gateway desktop remoto ha terminato la connessione. +Prova a riconnetterti più tardi o contatta l'amministratore di rete per assistenza. + + + L'amministratore del server gateway desktop remoto ha terminato la connessione. +Prova a riconnetterti più tardi o contatta l'amministratore di rete per assistenza. + + + Il desktop remoto non può connettersi al computer remoto per uno di questi motivi: +1) L'account utente non è elencato nell'elenco delle autorizzazioni del gateway desktop remoto +2) Potresti aver specificato il computer remoto in formato NetBIOS (ad esempio, computer1) , ma il gateway desktop remoto prevede un nome di dominio completo o un formato di indirizzo IP (ad esempio, computer1.fabrikam.com o 157.60.0.1). +Per assistenza contatta l'amministratore di rete. + + + Desktop remoto non può connettersi al computer remoto per uno di questi motivi: +1) L'account utente non è autorizzato ad accedere al gateway RD +2) Il computer non è autorizzato ad accedere al Gateway RD +3) Stai usano un metodo di autenticazione non compatibile (ad esempio, il gateway desktop remoto potrebbe essere in attesa di una smart card ma hai fornito una password). +Per assistenza contatta l'amministratore di rete. + + + Questo computer non può connettersi al computer remoto perché l'amministratore di rete ha limitato l'accesso a questo server gateway desktop remoto. +Per assistenza contatta l'amministratore di rete. + + + Questo computer non può connettersi al computer remoto perché il server proxy web richiede l'autenticazione. +Per consentire il traffico non autenticato ad un server gateway desktop remoto tramite il server proxy Web, contatta l'amministratore di rete. + + + Questo computer non può connettersi al computer remoto perché il server gateway desktop remoto ha raggiunto il numero massimo di connessioni consentite. +Prova a riconnetterti più tardi o contatta l'amministratore di rete per assistenza. + + + Questo computer non può connettersi al computer remoto perché il server gateway desktop remoto non supporta la richiesta. +Per assistenza contatta l'amministratore di rete. + + + Questo computer non può connettersi al computer remoto perché il client non supporta una delle funzionalità del gateway desktop remoto. +Per assistenza contatta l'amministratore di rete. + + + Questo computer non può connettersi al computer remoto perché il server gateway desktop remoto e questo computer non sono compatibili. +Per assistenza contatta l'amministratore di rete. + + + Questo computer non può connettersi al computer remoto perché non è stato configurato un certificato per l'uso nel server gateway desktop remoto. +Per assistenza contatta l'amministratore di rete. + + + Questo computer non può connettersi al computer remoto perché il server gateway desktop remoto a cui stai tentando di connetterti non è autorizzato dall'amministratore del computer. +Se sei l'amministratore, aggiungi nel computer il nome del server gateway desktop remoto all'elenco dei server gateway desktop remoto attendibili, quindi riprova a connetterti. + + + Questo computer non può connettersi al computer remoto perché questo computer o dispositivo non soddisfa i requisiti di protezione accesso alla rete impostati dall'amministratore di rete, per uno dei seguenti motivi: +1) Il nome del server gateway desktop remoto e il certificato della chiave pubblica del server il nome del soggetto non corrispondono. +2) Il certificato è scaduto o è stato revocato. +3) L'autorità del certificato principale non considera attendibile il certificato. +4) L'estensione della chiave del certificato non supporta la crittografia. +5) Il computer non è in grado di verificare l'elenco di revoca dei certificati. +Per assistenza contatta l'amministratore di rete. + + + Questo computer non può connettersi al computer remoto perché sono necessari un nome utente e una password per l'autenticazione al server gateway desktop remoto anziché le credenziali della smart card. + + + Questo computer non può connettersi al computer remoto perché sono necessarie per l'autenticazione al server gateway desktop remoto le credenziali della smart card invece di un nome utente e una password. + + + Questo computer non può connettersi al computer remoto perché è stato inviato un cookie non valido al server gateway desktop remoto. +Per assistenza contatta l'amministratore di rete. + + + Questo computer non può connettersi al computer remoto perché il cookie è stato rifiutato dal server gateway desktop remoto. +Per assistenza contatta l'amministratore di rete. + + + Questo computer non può connettersi al computer remoto perché il server gateway desktop remoto prevede un metodo di autenticazione diverso da quello usato. +Per assistenza contatta l'amministratore di rete. + + + La connessione al gateway desktop remoto è terminata perché l'autenticazione utente periodica non è riuscita. +Prova a riconnetterti con un nome utente e una password corretti. +Se la riconnessione non riesce, contatta l'amministratore di rete per ulteriore assistenza. + + + La connessione al gateway desktop remoto è terminata perché l'autorizzazione utente periodica non è riuscita. +Prova a riconnetterti con un nome utente e una password corretti. +Se la riconnessione non riesce, contattare l'amministratore di rete per ulteriore assistenza. + + + Questo computer non può connettersi al computer remoto perché il gateway desktop remoto ed il computer remoto non sono in grado di scambiare i criteri. +Ciò potrebbe verificarsi a causa di uno dei seguenti motivi: +1. Il computer remoto non è in grado di scambiare criteri con il gateway desktop remoto. +2. La configurazione del computer remoto non consente una nuova connessione. +3. La connessione tra gateway desktop remoto ed il computer remoto è terminata. +Per assistenza contatta l'amministratore di rete. + + + La connessione al gateway desktop remoto è terminata perché l'autorizzazione utente periodica non è riuscita. +Questo computer o dispositivo non ha superato i requisiti NAP (Network Access Protection) impostati dall'amministratore di rete. +Per assistenza contattare l'amministratore di rete. + + + Connesso + + + Errore durante la scansione della scheda WiFi "{0}" - errore: "{1}" + + + Connessione... + + + {0} disconnesso! + + + Connesso a {0} + + + WPS + + + Connetti automaticamente + + + Chiave condivisa in precedenza + + + Connessione a {0}... + + + Impossibile connettersi a {0} ({1})! + + + Completata connessione a {0}! + + + L'accesso alla rete è stato revocato + + + Credenziali non valide + + + Rete non disponibile + + + Completato + + + Tentativo di connessione scaduto + + + -/- + + + Il protocollo di autenticazione non è supportato! + + + Controllo WPS... + + + Apri profili OID... + + + MIB + + + Profili OID + + + Seleziona profilo OID + + + Aggiungi profilo OID + + + Elimina profilo OID + + + Il profilo OID selezionato verrà eliminato definitivamente. + + + Modifica profilo OID + + + Inserisci password... + + + Aggiungi scheda + + + (dal profilo) + + + Nuova maschera sottorete + + + Aggiungi server + + + Server SNTP + + + Le impostazioni in questa pagina contengono errori. Correggili per poter salvare. + + + Chiave host SSH da usare per la connessione (ad es. "71: B8: F2: 6E ..."). +Disponibile solo se la modalità è "SSH". + + + Percorso completo file chiave privato (ad es. "C:\Users\Borntoberoot\ssh\private_key.ppk"). +Disponibile solo se la modalità è "SSH". + + + Nome utente che verrà passato alla sessione PuTTY. +Disponibile solo se la modalità è "SSH", "Telnet" o "Rlogin". + + + ASN + + + Nome AS + + + Città + + + Continente + + + Nazione + + + Valuta + + + Dsitretto + + + Risolutore DNS + + + EDNS + + + Geolocalizzazione + + + Hosting + + + Geolocalizzazione IP + + + ISP + + + Latitudine + + + Longitudine + + + Cellulare + + + Organizzazione + + + Record PTR + + + Fuso orario + + + CAP + + + API geolocalizzazione IP: veloce, precisa, affidabile + + + Verifica risolutore DNS + + + Verifica geolocalizzazione IP + + + Visualizza mappa + + + Il risolutore DNS viene determinato tramite ip-api.com. + +URL: https://edns.ip-api.com/ + + + La geolocalizzazione IP viene determinata tramite ip-api.com. + +URL: http://ip-api.com/ + + + Per fornire funzionalità aggiuntive, vengono utilizzati servizi di terze parti che non sono gestiti da me. +Puoi deselezionarli di seguito. +Nessun dato viene inviato ll'autore in nessun momento. + + + Verifica risolutore DNS... + + + Verifica geolocalizzazione IP... + + + Controlla la connessione di rete e riprova tra qualche secondo. + + + Raggiunto limite ip-api.com (troppe richieste dal questa rete)! +Riprova tra qualche secondo. + + + Codice stato HTTP + + + Acciaio + + + Raggiunto limite rapporto! +Riprova dentro {0} secondi... + + + Generale + + + BSSID + + + Nessun host raggiungibile trovato! + + + Applicazione + + + Abilita le funzionalità sperimentali per testare nuove funzioni. +Questi non sono ancora completi, contengono bug, possono mandare in crash l'applicazione e potrebbero cambiare di nuovo fino al rilascio. + + + Funzioni sperimentali + + + Sperimentale + + + Esegui comando... + + + Geolocalizzazione IP + + + Aggiungi una scheda per l'interrogazione della geolocalizzazione IP... + + + Inserisci un dominio per interrogare whois... + + + Inserisci un host per interrogare la geolocalizzazione IP... + + + Nome utente sconosciuto. + + + Errore autenticazione (password, comunità o chiave errati). + + + L'operazione è andata a buon fine senza alcun errore. + + + La risposta alla richiesta era troppo grande per essere contenuta in un'unica risposta! + + + L'OID richiesto non è stato trovato! + + + Un oggetto di lettura-scrittura o di sola scrittura è stato impostato su un valore non coerente! + + + L'OID richiesto non esiste e non è scrivibile! + + + Si è verificato un errore per il quale non è disponibile alcun messaggio specifico! + + + L'oggetto richiesto non è accessibile per la modifica! + + + L'oggetto è stato impostato su un tipo di dati non compatibile! + + + Il valore assegnato all'oggetto supera la sua lunghezza massima! + + + La codifica usata per l'oggetto non è corretta! + + + Il valore assegnato all'oggetto non è una scelta valida! + + + L'oggetto richiesto non esiste e non può essere creato! + + + La variabile MIB è attualmente in uno stato non coerente e non può essere modificata! + + + Non ci sono risorse di sistema disponibili per eseguire l'operazione richiesta! + + + Si è verificato un errore durante l'operazione di impostazione! + + + Un'operazione di impostazione non è riuscita e non è stato possibile ripristinare le modifiche precedenti! + + + Autenticazione fallita. Controlla la stringa comunità! + + + L'oggetto richiesto non è scrivibile e non può essere modificato! + + + Lo stato dell'oggetto non è coerente ed impedisce l'operazione di impostazione! + + + Chiudi tutto + + + Espandi visualizzazione host + + + Espandi vista mappa + + + Non è possibile impostare l'host mentre vengono aggiunti altri host. +Attendi il completamento del processo e riprova. + + + Nessun comando corrispondente! + + + Nome host remoto + + + ID processo + + + Percorso processo + + + Nome processo + + + NetBIOS + + + Nome computer + + + Errore + + + OK + + + Avviso + + + Groppo/dominio + + + NetBIOS raggiungibile + + + Scansione per NetBIOS + + + La scansione NetBIOS è disabilitata! + + + La risoluzione dei nomi host è disabilitata! + + + La risoluzione degli indirizzi MAC è disabilitata! + + + Chiudi gruppo + + + Esegui comando... (Ctrl+Maiusc+P) + + + File profili + + + Apri impostazioni... + + + Espandi e apri ricerca... + + + A partire da Windows 11 24H2, dovrai consentire l'accesso all'adattatore Wi-Fi. + +Apri 'Impostazioni Windows' -> 'Privacy e sicurezza'-> 'Posizione', abilita l'accesso per le app desktop / NetworkManager, quindi riavvia l'applicazione. + + + Trascina e rilascia le applicazioni per riordinarle. +Clic con il tasto destro per ulteriori opzioni. + + + Ripristina predefiniti + + + Un framework drag'n'drop facile da usare per WPF. + + + BSD-3-Clause + + + Imposta predefinito + + + Server Ubuntu che esegue Docker con Nextcloud e Traefik... + + + Server Linux in esecuzione in AWS... + + + 6 GHz + + + Sostieni questo progetto con una donazione. + + + Apri documentazione + + + Dona + + + Nome profilo + + + Editor file hosts + + + Editor file hosts + + + Modalità di sola lettura. +La modifica del file hosta richiede diritti elevati! + + + Apri file host + + + Commento + + + Disabilita + + + Modifica voce + + + Modifica voce... + + + Abilita voce + + + Disabilita voce + + + Aggiornamento... + + + Ricaricato al {0} + + + Impossibile caricare file hosts: {0} + + + Ritentativo tra {0} secondi... + + + Quali sono le novità? + + + Elenco modifiche + + + Aggiorna a {0} + + + Questa versione include nuove funzionalità, miglioramenti e correzioni di bug. +Per tutti i dettagli consulta l'elenco modifiche + + + Voci + + + La voce selezionata è stata eliminata permanentemente: + +{0} {1} {2} + + + Server DNS primario + + + Inserisci un nome host valido (ad es. "server-01" o "esempio.com")! +Più nomi host possono essere separati con uno spazio. + + + Il file "host" non può essere letto! +Per maggiori dettagli consulta il file registro. + + + Il file "host" non può essere scritto. +Per maggiori dettagli consulta il file registro. + + + La voce non è stata trovata nel file "host"! +Forse il file è stato modificato. + + + Non è stato possibile creare un backup del file "host"! +Per maggiori dettagli consulta il file registro. + + + Visualizza barra di stato + + + Quando si passa su un collegamento visualizza la barra di stato in basso a sinistra del webview. + + + Salva credenziali + + + Dopo un accesso riuscito visualizza una finestra di dialogo per salvare le credenziali. + + + Elimina dati di navigazione + + + Elimina permanentemente i dati di navigazione (cronologia, cookie, cache, credenziali, ecc.) Ppr il profilo WebView2 attuale. + + + Dati di navigazione + + + Cancellazione dati di navigazione completata! + + + Si è verificato un errore durante l'eliminazione dei dati di navigazione. Sentiti libero di segnalare questo problema su GitHub. + + + produzione + + + Aggiungi etichetta + + + Applica filtro + + + Profili filtro... + + + Filtra per etichetta + + + Nessuna etichetta trovata! + + + Corrispondenza + + + Qualsiasi + + + Aggiungi gruppo... + + + Espandi tutto + + + Riduci tutto + + + Per personalizzare l'aspetto dell'applicazione usa i temi personalizzati . È possibile modificare o aggiungere temi nella cartella "Cartella programmi > Temi". Per maggiori dettagli fai riferimento alla documentazione. + + + Sessione amministrazione (console). + + + Il file profilo "{0}" verrà aggiunto permanentemente. + + + Vuoi abilitare la crittografia? + + + Vuoi abilitare la crittografia dei file del profilo per proteggere i dati sensibili come host, indirizzi IP, URL e credenziali archiviate? + +Puoi abilitare/disabilitare la crittografia in qualsiasi momento facendo clic con il pulsante destro del mouse sul file del profilo e gestire le impostazioni di crittografia. +Se selezioni 'Annulla', il file del profilo non verrà crittografato. + + + Per applicare modifiche come le impostazioni della lingua è necessario un riavvio dell'applicazione. + + + Impossibile analizzare o risolvere nessuno dei server DNS specificati. + + + Impossibile analizzare "{0}". + + + Numero massimo di backup + + + Crea backup giornaliero + + + Numero di backup conservati prima che quello più vecchio venga eliminato. + + + Questa impostazione è gestita dall'amministratore. + + + Ripristina percorso predefinito + + + Ripristina + + + Vuoi ripristinare il percorso predefinito? + + + Il percorso predefinito delle impostazioni verrà ripristinato e successivamente l'applicazione viene riavviata. + +Per migrare le impostazioni precedenti, se necessario, è possibile copiare il file "settings.json" da "{0}" a "{1}". A questo scopo è necessario prima chiudere l'applicazione per evitare che le impostazioni vengano sovrascritte. + + + Vuoi modificare il percorso? + + + Il percorso delle impostazioni verrà modificato e successivamente l'applicazione verrà riavviata. + +Per migrare le impostazioni precedenti, se necessario, è possibile copiare il file "settings.json" da "{0}" a "{1}". A questo scopo è necessario prima chiudere l'applicazione per evitare che le impostazioni vengano sovrascritte. + + + Inserisci un percorso valido! + + + Il percorso dei profili verrà modificato e successivamente l'applicazione verrà riavviata. + +Per migrare le impostazioni precedenti, se necessario, è possibile copiare il file "settings.json" da "{0}" a "{1}". A questo scopo è necessario prima chiudere l'applicazione per evitare che le impostazioni vengano sovrascritte. + + + Il percorso predefinito dei profili verrà ripristinato e successivamente l'applicazione verrrà riavviata. + +er migrare le impostazioni precedenti, se necessario, è possibile copiare il file "settings.json" da "{0}" a "{1}". A questo scopo è necessario prima chiudere l'applicazione per evitare che le impostazioni vengano sovrascritte. + + + Connessione di rete + + + Stato rete + + + L'importazione da Active Directory è fallita. + + + Opzioni + + + + Per leggere l'Active Directory usa le credenziali Windows attuali. +All'account deve essere consentito enumerare gli oggetti del computer nella base di ricerca (sotto struttura). + + + Base ricerca (DN) + + + Filtro LDAP aggiuntivo + + + Il filtro deve essere un'espressione LDAP valida che inizia con "(" e termina con ")". + + + La base ricerca deve essere un nome distinto LDAP valido (ad esempio DC=esempio,DC=com). + + + Importato da Active Directory su {0} + + + Nessun computer trovato per la base ricerca e il filtro specificati. + + + Ricerca in Active Directory... + + + Se il computer non fa parte del dominio, specifica il controller del dominio (nome host o IP) e usa credenziali personalizzate. + + + Server (facoltativo) + + + Porta (facoltativa) + + + Usa SSL (LDAPS) + + + Usa credenziali Windows attuali + + + Usa queste credenziali + + + Avanzate + + + Seleziona tutto + + + Deseleziona tutto + + + Abilita per + + + Salta già importati + + + {0} · {1} risultati + + + {0} profili importati. +{1} voci duplicate ignorate. +{2} senza che un host venga saltato. + + + Active Directory + + + File CSV + + + File CSV + + + Importa profili da file CSV + + + Importato dal file CSV in {0} + + + Nessuna voce trovata nel file CSV. + + + Formato CSV - un profilo per riga: + + + Vengono rilevati automaticamente la riga di intestazione e il delimitatore (punto e virgola, virgola o tabulazione). La colonna della descrizione è facoltativa. Le voci senza host non possono essere importate. + + + Risultati importazione + + + Nuovo + + + Importati + + + Nessun host + + + Escludi account disabilitati + + + Importa computer da Active Directory + + + Importa computer da Active Directory... + + + Importa profili + + + Sorgente + + + Active Directory + + + Gruppo profilo + + + Nome gruppo esistente o nuovo + + + Firewall + + + Regole firewall + + + Impostazioni firewall di Windows + + + Direzione + + + In ingresso + + + In uscita + + + Azione + + + Consenti + + + Blocca + + + Profilo rete + + + Profili di rete + + + Tipo scheda + + + Impossibile caricare le regole del firewall. {0} + + + È stata permanentemente eliminata la regola firewall selezionata: + +{0} + + + Qualsiasi + + + TCP + + + UDP + + + ICMPv4 + + + ICMPv6 + + + HOPOPT + + + GRE + + + IPv6 + + + IPv6-Route + + + IPv6-Frag + + + IPv6-NoNxt + + + IPv6-Opts + + + VRRP + + + PGM + + + L2TP + + + Qualsiasi + + + Cablata + + + Senza fili + + + Accesso remoto + + + Modalità di sola lettura. +La modifica delle regole del firewall richiede diritti elevati! + + + In entrata + + + In uscita + + + Blocca + + + Consenti + + + Porte locali + + + Porte remote + + + Indirizzi locali + + + Indirizzi remoti + + + Inserisci un indirizzo IP, una sottorete (ad esempio 10.0.0.0/8), un intervallo (ad esempio 10.0.0.1-10.0.0.10) o una parola chiave valida (Qualsiasi, LocalSubnet, DNS, DHCP, WINS, DefaultGateway, Internet, Intranet, IntranetRemoteAccess, PlayToDevice, CaptivePortal) + + + Aggiungi regola + + + Aggiungi regola... + + + Modifica regola + + + Modifica regola... + + + Elimina regola + + + Elimina regola... + + + Disabilita regola + + + Importa profili... + + + Test velocità + + + Esegui test velocità + + + Recupero metadati... + + + Misura latenza... + + + Misura velocità download... + + + Misura velocità upload... + + + Misura velocità download e upload, latenza e jitter con speed.cloudflare.com. +Cloudflare potrebbe registrare l'indirizzo IP e le informazioni di rete. +Per i dettagli consulta l'informativa sulla privacy di Cloudflare. + + + Latenza + + + Jitter + + + Servizio test di velocità usato per misurare la velocità download/upload, latenza e jitter. + + + Stop diff --git a/Source/NETworkManager.Localization/Resources/Strings.ja-JP.resx b/Source/NETworkManager.Localization/Resources/Strings.ja-JP.resx new file mode 100644 index 0000000000..2c4b83fb5a --- /dev/null +++ b/Source/NETworkManager.Localization/Resources/Strings.ja-JP.resx @@ -0,0 +1,4496 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NETworkManager について + + + 強調 + + + 資格情報の追加 + + + エントリの追加 + + + プロファイルの追加 + + + よろしいですか? + + + ARP + + + 近隣テーブル + + + 読み取り専用モードです。近隣テーブルを変更するには、管理者権限が必要です。 + + + 到達不能 + + + 未完了 + + + 確認中 + + + 遅延 + + + 古い + + + 到達可能 + + + 固定 + + + 認証 + + + 自動起動 + + + 計算機 + + + コマンドライン引数 + + + 設定 + + + 確認 + + + 接続 + + + 連絡先 + + + プロファイルのコピー + + + 資格 + + + データ + + + 既定のアプリ + + + 資格情報の削除 + + + プロファイルの削除 + + + 対象 + + + 詳細 + + + 切断 + + + 表示 + + + DNS + + + DNS Lookup + + + 断片化しない + + + 資格情報の編集 + + + グループの編集 + + + プロファイルの編集 + + + エラー + + + エクスポート + + + フィルター + + + 全般 + + + ヘッダ + + + 履歴 + + + ホットキー + + + HTTP ヘッダ + + + インポート + + + 情報 + + + インタフェース + + + IP スキャナ + + + キーボード + + + 言語 + + + ライブラリ + + + ライセンス + + + ローカルデバイスとリソース + + + 場所 + + + Lookup + + + MAC アドレス + + + マスター パスワード + + + マルチスレッド + + + ネットワーク + + + ネットワーク インタフェース + + + 設定が適用されました + + + ネットワークインターフェースの設定には、昇格された権限が必要です! + + + 新しいタブ + + + 次へ + + + OUI + + + オプション + + + 上書きしますか? + + + Ping + + + ポート + + + ポータブル + + + ポート スキャナ + + + プロファイル + + + PuTTY + + + クエリ + + + リモートデスクトップ Desktop + + + リセット + + + PTRの解決 + + + リソース + + + 結果 + + + ルート + + + スキャン + + + 検索 + + + プロファイルの選択... + + + マスター パスワードの設定 + + + 設定 + + + SNMP + + + ソケット + + + 統計 + + + 状態 + + + サブネット + + + サブネット化 + + + 成功! + + + テーマ + + + トレースルート + + + トレイ + + + 更新 + + + v1/v2c + + + v3 + + + 検証失敗! + + + Wake on LAN + + + ウェブサイト + + + Window + + + パスワードが違います! + + + クライアント + + + Administrator + + + トレイにアイコンを常に表示 + + + 試行回数 + + + 平均時間 + + + ブロードキャスト + + + バッファ + + + バイト + + + CIDR + + + 閉じる + + + デフォルト ゲートウェイ + + + 削除... + + + 説明 + + + プレースホルダー + + + 実行するファイルまたは実行可能ファイルへのパス。次のプレースホルダーを使用できます : + + + ファイルまたは実行可能ファイルに渡される引数。次のプレースホルダーを使用できます : + + + 次のプレースホルダーを使用できます : + + + DHCP 有効 + + + DHCP リースの有効期限 + + + DHCP リースの取得 + + + DHCP サーバー + + + DNS サーバー + + + DNS サフィックス + + + 動的 IPv4 アドレス + + + 動的 IPv4 DNS サーバー + + + ホップ + + + ホップ + + + ホスト名 + + + IP アドレス + + + IP アドレス + + + IPv4 + + + IPv4 アドレス + + + IPv4 アドレスが追加されました + + + IPv4 アドレスが削除されました + + + IPv4 アドレスが解放され、更新されました。 + + + IPv4 アドレスが解放されました + + + IPv4 アドレスが更新されました + + + IPv6 アドレスが解放され、更新されました。 + + + IPv6 アドレスが解放されました + + + IPv6 アドレスが更新されました + + + IPv4-デフォルト-ゲートウェイ + + + IPv6 + + + IPv6 アドレス + + + リンク-ローカル IPv6 アドレス + + + IPv6-デフォルト-ゲートウェイ + + + マップ + + + (+{0} 以上) + + + スクロール = ズーム, ドラッグ = パン + + + 不明 + + + 最大 + + + 最大 ホップ + + + アプリケーションを終了せずにメインウィンドウを最小化 + + + タスクバーではなくトレイに最小化 + + + 最小 + + + 名前 + + + ネットワーク アドレス + + + 新しいサブネットマスクまたは CIDR + + + いいえ + + + IPアドレスを自動的に取得 + + + DNSサーバーのアドレスを自動的に取得 + + + パケット損失 + + + 送信済パケット + + + 物理アドレス + + + ホスト名解決時の優先プロトコル : + + + プライマリ DNS サーバー + + + 受信 / 損失 + + + ホスト名の解決 + + + 要再起動 + + + アプリケーションフォルダーに設定を保存 + + + セカンダリ DNS サーバー + + + 表示 + + + 起動時に次のアプリを表示 : + + + ネットワーク管理とトラブルシューティングのための強力なオープンソースツール! + + + 速度 + + + トレイに最小化状態で起動 + + + ウィンドウで起動 (現在のユーザー) + + + 静的 IPv4 アドレス + + + 静的 IPv4 DNS サーバー + + + サブネットマスク + + + スレッド + + + 時間 + + + 時間 1 + + + 時間 2 + + + 時間 3 + + + タイムアウト + + + タイムアウト (ミリ秒) + + + 各ping間の待機時間 (ミリ秒) + + + TTL + + + 種類 + + + 次の DNS サーバーアドレスを使用 : + + + 次の IP アドレスを使用 : + + + ウェイクアップ + + + はい + + + 追加 + + + DNS Lookupを実行するタブの追加... + + + ネットワークスキャンを実行するタブの追加... + + + SNMPアクションを実行するタブの追加... + + + pingを実行するタブの追加... + + + ポートスキャンを実行するタブの追加... + + + トレースを実行するタブの追加... + + + ホスト名にDNSサフィックス(プライマリ)を追加 + + + 追加のコマンドライン + + + 追加 + + + プロファイルの追加... + + + 画面の自動調整 + + + 応答 + + + アプリケーションは後で再起動されます! + + + 適用 + + + Windows のキー割り当てを適用 (例: ALT+TAB) : + + + 認証 + + + 認証レベル + + + 権限 + + + 自動更新の間隔 + + + 戻る + + + バックアップ + + + ボーレート + + + 操作はユーザーによってキャンセルされました! + + + Caps Lockが有効になりました! + + + グラフ時間 (秒) + + + 起動時に更新を確認 + + + クラス + + + フィルターの消去 + + + 色深度 (bit) + + + コミュニティ + + + PuTTYへのパスを設定... + + + 閉じるの確認 + + + アプリケーションを閉じますか? + + + 接続形式... + + + 外部接続 + + + ネットワークカードをネットワークに接続して設定! + + + コピー + + + コピー形式... + + + コピー... + + + 解決できなかったホスト名 : "{0}" + + + 資格情報 + + + プロファイルファイルは、ディスク上でAES(鍵長256ビット、ブロックサイズ128ビット、CBCモード)を使用して暗号化されます。暗号化鍵は、マスターパスワードからRFC2898DeriveBytes(PBKDF2)を用いて1,000,000回の反復処理で生成されます。実行時には、プロファイルファイルが読み込まれると、パスワードはSecureStringとして保存されます。一部の関数では、パスワードを通常の文字列に変換する必要があり、ガベージコレクタによってクリーンアップされるまで、暗号化されていない状態でメモリ内に残ります。 + +暗号化を有効にする前に、まずプロファイル ファイルのバックアップ コピーを作成してください! + + + カスタム + + + カスタム 画面サイズ : + + + データが更新されました! + + + 資格情報を管理するには、それを復号化して読み込む必要があります。 + + + 既定 + + + ボーレート + + + 既定のポート : + + + Rlogin ポート + + + SSH ポート + + + Telnet ポート + + + 選択した資格情報は完全に削除されます。 + + + エントリを削除 + + + 選択したプロファイルは完全に削除されます。 + + + DNS 自動設定 + + + DNS Lookup... + + + DNS サーバー + + + ドメイン + + + 間隔 + + + 編集... + + + 有効 + + + 資格情報セキュリティサポートプロバイダーを有効にする + + + 終了時間 + + + 計算するサブネットの入力... + + + サブネットと新しいサブネットマスクを入力してサブネットを作成... + + + 'api.github.com' に接続できませんでした。ネットワーク接続を確認してください! + + + 応答エラー! + + + 応答エラー! 書き込み権限があるか確認してください。 + + + 拡張 + + + 最初の使用可能なIPアドレス + + + 固定画面サイズ : + + + 検索 + + + グループ + + + 高さ + + + ホスト + + + ホスト名 または IP アップ + + + ホスト + + + ID + + + 一般からホストを継承 + + + IP 範囲 + + + 利用可能な最後の IP アドレス + + + ローカル IP アドレス + + + ローカル ポート + + + MAC アドレス または ベンダー + + + マジックパケットが正常に送信されました! + + + ルーターあたりの最大ホップ数 ({0}) に達しました! + + + メッセージ サイズ + + + モード + + + マルチキャスト + + + 複数インスタンス + + + ネットワークアドレスにアクセスできません。コンピュータがネットワークに接続されているかどうかを確認してください。ネットワークのトラブルシューティングについては、Windowsヘルプを参照してください。 + + + 新しい接続... + + + "{0}" の DNS レコードが見つかりません! 入力内容と設定を確認してください。 + + + 有効なネットワーク アダプターが見つかりません! + + + ポートが見つかりません。入力内容を確認してください! + + + プロファイルが見つかりません! +作成... + + + 何も見つかりません! + + + 何もすることはありません。入力を確認してください。 + + + 更新プログラムはありません! + + + インポートする有効なファイルが見つかりません。 + + + ベンダーが見つかりません。入力内容を確認してください! + + + キャンセルされるまでのエラー数 : + + + 保存されたエントリの数 + + + OID + + + CSV ファイルのみ許可されています! + + + 全画面表示時のみ + + + リモートコンピューター上 + + + このコンピューター + + + 開く + + + ライセンスを開く + + + プロジェクトを開く + + + ウェブサイトを開く + + + 上書き + + + パスワード + + + パスワードが一致しません! + + + パス + + + ポート または サービス + + + ポート + + + プライベート + + + プロファイル + + + 再読み込みされたプロファイル + + + プロトコル + + + PuTTYプロセスが終了しました! + + + 質問 + + + RAW + + + 再帰 + + + クリップボードのリダイレクト + + + デバイスのリダイレクト + + + ドライブのリダイレクト + + + ポートのリダイレクト + + + プリンタのリダイレクト + + + スマートカードのリダイレクト + + + 残り時間 + + + リモート IP アドレス + + + リモート ポート + + + 繰り返し + + + すべてのリクエストでCNAMEを解決 + + + 応答 + + + Rlogin + + + スキャン済み + + + 検索したアプリが見つかりません! + + + 検索した言語が見つかりません! + + + 検索した設定が見つかりません! + + + セキュリティ + + + 画面解像度の選択 + + + すべての設定がリセットされます! + + + シリアル + + + シリアル回線 + + + サービス + + + 見つかった設定ファイルは破損しているか、このバージョンと互換性がありません! この問題は GitHub で報告できます。 + +設定ファイルのバックアップを設定フォルダに作成し、設定をリセットしました。 + +プロファイルファイルは影響を受けません! + + + 閉じたポートを表示 + + + 現在のアプリのタイトルを表示 + + + 最も一般的なクエリタイプのみを表示 + + + 到達不能なIPアドレスとポートを表示 + + + 統計を表示 + + + SSH + + + 開始時間 + + + 状態 + + + サブネット 1 + + + サブネット 2 + + + タグ + + + Telnet + + + アプリはパラメータなしで起動できます! + + + 解決できなかったホスト名 : + + + 使用可能なパラメータ : + + + 処理できないパラメータ : + + + このプロセスには時間とリソースがかかる場合があります。 (CPU / RAM) + + + 設定場所は影響を受けません! + + + SNMPクエリがタイムアウトしました。ホストにアクセスできないか、コミュニティ/パスワードが間違っている可能性があります。 + + + IP アドレス "{0}" で DNS サーバーにクエリを実行中にタイムアウトが発生しました! + + + タイムスタンプ + + + トレース + + + 不明なエラー! + + + トレイ解除/ウィンドウを前面に移動 + + + URL + + + 資格情報の使用 + + + 現在の表示サイズを画面サイズとして使用 + + + カスタム DNS サーバーを使用 + + + カスタム DNS サフィックスを使用 + + + リゾルバーキャッシュを使用 + + + ユーザーインタフェースがロックされました! + + + ユーザー名 + + + ベンダー + + + バージョン + + + バージョン {0} が利用可能です! + + + ウォークモード + + + + + + 指定されたパスワードではプロファイル ファイルを復号化できませんでした。 + + + 入力したパスワードが間違っています。 + + + 追加... + + + エントリの追加... + + + 計算 + + + キャンセル + + + 変更 + + + マスターパスワードの変更... + + + 確認 + + + 更新の確認 + + + 閉じる + + + 続行 + + + カスタム : + + + 切り取り + + + 復号化と読み込み... + + + 削除 + + + テーブルの削除 + + + 場所の入力... + + + すべて + + + フィルター... + + + DNS キャッシュの消去 + + + DNS キャッシュがフラッシュされました + + + 資格情報を復号化して読み込み、選択します。 + + + このダイアログを表示。 + + + すべてのアプリケーション設定をリセット。 + + + 編集時にパスワードは表示されませんが、上書きすることは可能です。 + + + [0] サーバー認証に失敗した場合は、警告なしでコンピューターに接続する。 +[1] サーバー認証に失敗した場合は、接続を確立しない。 +[2] サーバー認証に失敗した場合は警告を表示し、接続を許可するか接続を拒否する。 +[3] 認証要件は指定されていません。 + + + タグは、トピックやプロジェクトごとにプロフィールを整理するのに役立ちます。複数のタグを使用する場合は、";"で区切ります。 "tag=xxx"でタグ検索します。 + + + 時間 + + + インポート ファイルの場所... + + + + + + 移動と再起動 + + + ネットワーク接続.... + + + (変更なし) + + + Off + + + OK + + + On + + + 場所を開く + + + 設定を開く + + + 上書き + + + 解析 + + + 貼り付け + + + 再接続 + + + 更新 + + + 今すぐ再起動 + + + 保存 + + + 検索... + + + + + + 送信 + + + マスター パスワードの設定... + + + ローカル ライセンスの表示 + + + サブネット計算機 + + + 検証 + + + 接続 + + + 有効な IP 範囲を入力してください! + + + 有効な IPv4 アドレスを入力してください! + + + 有効な MACアドレスを入力してください (例: 00:F1:23:AB:F2:35)! + + + 有効なポートを入力してください (1 - 65535)! + + + 有効なサブネットマスクを入力してください (例: 255.255.255.0)! + + + 有効なサブネットマスクまたは CIDR を入力してください (例: 255.255.255.0 または /24)! + + + フィールドを空にすることはできません! + + + ファイルが存在しません! + + + フォルダーが存在しません! + + + リスナー + + + アンバー + + + 外観 + + + アプリ + + + ダーク + + + ライト + + + + + + + + + + + + コバルト + + + クリムゾン + + + シアン + + + エメラルド + + + 有効な IP アドレスを 1 つ以上入力してください! + + + 有効なボーレートを入力してください! + + + 有効なホストを入力してください (複数のホストは";"で終わることはできません)! + + + 有効な IP アドレスを入力してください! + + + 有効な数値を入力してください! + + + 有効な OID を入力してください! + + + 有効なポートまたはポート範囲を入力してください (1 - 65535)! + + + 有効なサブネットを入力してください (例: 192.168.178.133/26)! + + + 有効なウェブサイトを入力してください (例: https://example.com/index.html) + + + + + + インポート / エクスポート + + + インディゴ + + + 宛先ホストに到達できません。 + + + 宛先ネットワークに到達できません。 + + + 宛先ポートに到達できません。 + + + 成功 + + + リクエストがタイムアウトしました。 + + + 転送中にTTLが期限切れになりました。 + + + キーは 8 文字以上である必要があります! + + + ライム + + + ライブ + + + マゼンタ + + + モーブ + + + オリーブ + + + 数字のみ入力できます! + + + オレンジ + + + ピンク + + + + + + + + + ソケットが閉じられました。 + + + サーバーによるリモート切断。 + + + 解凍エラー。 + + + 接続がタイムアウトしました。 + + + 復号化エラー。 + + + DNS 名 Lookupに失敗しました。 + + + DNS Lookupに失敗しました。 + + + 暗号化エラー。 + + + Windows Sockets gethostbyname 呼び出しに失敗しました。 + + + ホストが見つかりません。 + + + 内部エラーです。 + + + 内部セキュリティ エラー。 + + + 内部セキュリティ エラー。 + + + 指定された暗号化方法が無効です。 + + + 指定された IP アドレスが間違っています。 + + + 指定された IP アドレスは無効です。 + + + セキュリティデータが無効です。 + + + サーバー セキュリティ データが無効です。 + + + ライセンスネゴシエーションに失敗しました。 + + + ライセンスのタイムアウト。 + + + ローカル切断。 + + + 情報はありません。 + + + メモリ不足です。 + + + メモリ不足です。 + + + メモリ不足です。 + + + ユーザーによるリモート切断。 + + + サーバー証明書の解凍に失敗しました。 + + + Windows ソケットの接続に失敗しました。 + + + Windows Sockets の recv 呼び出しに失敗しました。 + + + アカウントは無効です。 + + + アカウントの有効期限が切れています。 + + + アカウントがロックアウトされています。 + + + アカウントが制限されています。 + + + 受信した証明書の有効期限が切れています。 + + + ポリシーは、ターゲット サーバーへの資格情報の委任をサポートしていません。 + + + サーバーの認証ポリシーにより、保存された資格情報を使用した接続要求は許可されません。ユーザーは新しい資格情報を入力する必要があります。 + + + ログインに失敗しました。 + + + 認証のために認証機関に接続できませんでした。認証側のドメイン名が間違っているか、ドメインにアクセスできないか、信頼関係に問題がある可能性があります。 + + + 指定されたユーザーにはアカウントがありません。 + + + パスワードの有効期限が切れています。 + + + 初めてログオンする前に、ユーザー パスワードを変更する必要があります。 + + + 相互認証が達成されない限り、ターゲット サーバーへの資格情報の委任は許可されません。 + + + スマートカードがブロックされています。 + + + スマート カードに誤った PIN が提示されました。 + + + タイムアウトが発生しました。 + + + 内部タイマー エラー。 + + + Windows ソケットの送信呼び出しに失敗しました。 + + + シエナ + + + スペースは使用できません! + + + スチール + + + トープ + + + Closed + + + CloseWait + + + Closing + + + DeleteTcb + + + Established + + + FinWait1 + + + FinWait2 + + + LastAck + + + Listen + + + SynReceived + + + SynSent + + + TimeWait + + + 不明 + + + ティール + + + バイオレット + + + + + + + + + この名前のプロファイルは既に存在します! + + + 閉じる + + + 開く + + + 少なくとも 1 つのアプリケーションが表示されている必要があります! + + + 非表示のアプリ + + + 表示のアプリ + + + バーに表示するアプリ : + + + Whois + + + whois を照会するためのタブを追加... + + + 有効なドメインを入力してください (例: "example.com")! + + + 有効なWindowsユーザー名を入力してください (例 : "user"、"DOMAIN\user"、または"user@domain.com")! + + + ドメインのWhoisサーバーが見つかりません : "{0}" + + + ルーティング + + + リリース + + + リリースと更新 + + + 更新 + + + Windows DNS 設定 + + + DNS サーバーの削除 + + + 選択した DNS サーバーは完全に削除されます。 + + + DNS サーバーの追加 + + + DNS サーバーの編集 + + + この名前の DNS サーバーは既に存在します! + + + セッションの再起動 + + + TigerVNC + + + TigerVNC へのパスを設定... + + + TigerVNCプロセスが終了しました! + + + 接続中... + + + MACアドレスとベンダーを解決 + + + 注記 + + + すべてエクスポート + + + エクスポート... + + + 選択項目をエクスポート + + + 場所... + + + File + + + 有効なファイル パスを入力してください! + + + すべて + + + 形式 + + + 選択済み + + + データのエクスポート中にエラーが発生しました。詳細はエラーメッセージをご覧ください : + + + デザイン + + + タイムアウトの強調表示 + + + サブネットを入力してワイドサブネットを作成... + + + ワイドサブネット + + + タブの追加... + + + IPv4 アドレスの追加... + + + IPv4 アドレスの追加 + + + 最大同時ホスト スレッド数 + + + 最大同時ポート スレッド数 + + + PowerShell + + + PowerShellへのパスを設定... + + + PowerShell プロセスが終了しました! + + + 実行ポリシー + + + リモート コンソール + + + ファイルのパス + + + 既定の設定を上書き + + + このホストの IPv4 アドレスを解決 + + + 非表示 + + + 受信した合計バイト数 + + + 送信した合計バイト数 + + + ダウンロード + + + 帯域幅 + + + アップロード + + + Windowsキーの組み合わせを適用 + + + 認証情報セキュリティサポートプロバイダー + + + バックグラウンド ジョブ + + + バックグラウンド ジョブは、x 分ごとに設定とプロファイルを保存します。 + +値が 0 の場合、この機能は無効になります。 + +この値の変更は、アプリを再起動した後に有効になります。 + + + x 分ごとにバックグラウンドジョブを実行する + + + お使いのシステム OS は最新リリースと互換性がありません! + + + ダッシュボード + + + すべての設定は後から設定で変更できます! + + + パブリックIPアドレスの確認 + + + NETworkManager をご利用いただきありがとうございます! + +もし気に入っていただけましたら、GitHub でスターを付けたり、寄付をしたり、あるいは他の人と共有したりして、開発へのご支援をお願いいたします。皆様のご支援は、プロジェクトの継続と成長につながります。 + + + プログラムを起動すると、バックグラウンドで GitHub 上に新しいバージョンがあるかどうかがチェックされます。 + +URL: https://api.github.com/ + + + パブリック IP アドレスは ipify.org によって決定されます。 + +URL: https://api.ipify.org and https://api6.ipify.org + + + プライバシー + + + ようこそ + + + 外部サービス + + + GitHubでプロジェクトをスター登録/フォークしてください。 + + + Transifexでプロジェクトの翻訳を手伝ってください。 + + + X経由で私をフォローまたは連絡してください。 + + + 接続 + + + コンピューター + + + ゲートウェイ / ルーター + + + インターネット + + + ネットワーク アダプターの構成 (DNS) を確認し、DNS サーバーが正しく構成されているか確認する。 + + + ネットワークアダプターの設定(dhcp、static ip)と、ネットワークに接続されているかどうかを確認してください。 + + + ゲートウェイ IP アドレスを検出できませんでした! + + + ローカル IP アドレスを検出できませんでした! + + + "{0}" から WebRequest (http/https) 経由でパブリック IP アドレスを取得できませんでした! ネットワーク接続 (ファイアウォール、プロキシなど) を確認してください。 + + + "{0}" の DNS レコードが解決されませんでした! + + + "{0}" の PTR DNS レコードが解決されません! + + + "{0}" DNS レコードが "{1}" に対して解決されました! + + + "{0}" の PTR DNS レコードが解決されました! + + + "{1}" からパブリック IP アドレスとして "{0}" を取得しました! + + + "{0}" を IP アドレス "{1}" のホスト名として解決しました! + + + パブリックIPアドレスのチェック +は無効になっています! + + + TCP/IP スタックが利用可能です。"{0}" は ICMP 経由で到達可能です! + + + TCP/IP スタックが利用できません... "{0}" は ICMP 経由では到達できません! + + + ゲートウェイ IP アドレスとして "{0}" が検出されました! + + + "{0}" がローカル IP アドレスとして検出されました! + + + "{0}" は ICMP 経由では到達できません! + + + "{0}" は ICMP 経由で到達可能です! + + + カスタム IPv4 アドレス API を使用する + + + http または https経由でアクセスでき、応答として IPv4アドレス 例: "xx.xx.xx.xx" を返す Webサービスの URL。 + + + "{0}" からパブリック IP アドレスを解析できませんでした! 別のサービスを試すか、デフォルトを使用してください... + + + 「{0}」に接続できませんでした! + + + IPv4プロトコルが利用可能 + + + IPv6プロトコルが利用可能 + + + コピー + + + 公式 + + + ネットワーク接続タイプ + + + デスクトップの背景 + + + デスクトップ構成 + + + 経験 + + + フォントスムージング + + + メニューとウィンドウのアニメーション + + + パフォーマンス + + + 永続的なビットマップキャッシュ + + + 接続が切断された場合は再接続する + + + 高速ブロードバンド (2 Mbps - 10 Mbps) + + + 低速ブロードバンド (256 kbps - 2 Mbps) + + + 接続品質を自動的に検出 + + + LAN (10 Mbps または それ以上) + + + Modem (56 kbps) + + + サテライト (2 Mbps - 16 Mbps with high latency) + + + WAN (10 Mbps or higher with high latency) + + + ドラッグ中にウィンドウの内容を表示する + + + ビジュアルスタイル + + + 表示のみ + + + リモートセッションへのキーボードとマウスの入力をブロックする + + + リモート オーディオ + + + リモート オーディオ再生 + + + リモート オーディオ録音 + + + 記録しない + + + このコンピューターから録音する + + + 再生しない + + + リモートコンピュータで再生 + + + このコンピュータで再生 + + + ゲートウェイ + + + カスタム コマンド + + + カスタム コマンドの追加 + + + 引数 + + + カスタムコマンドの削除 + + + カスタムコマンドの編集 + + + プログラム + + + プライベート + + + パブリック + + + 選択したカスタム コマンドは完全に削除されます。 + + + 再起動 + + + ホスト名の IP アドレスを解決できませんでした! + + + Ctrl+Alt+Del + + + タスク マネージャー (Ctrl+Shift+Esc) + + + ロック (Win+L) + + + デスクトップを表示 (Win+D) + + + エクスプローラー (Win+E) + + + ダイアログの実行 (Win+R) + + + キーボード ショートカット + + + 画面の調整 + + + 全画面 + + + キーストロークを送信できませんでした! + + + 切断 + + + ローカルIPアドレスとサブネットマスクの検出 + + + サブネットマスクを検出できませんでした! + + + ネットワークの検出... + + + {0} 秒後に終了... + + + ネットワークが利用できません! + + + ルーティングに基づいてローカルIPアドレスを検出するIPアドレス + + + ネットワーク変更時にステータスウィンドウを表示する + + + ステータスウィンドウの表示時間(秒) + + + WiFi + + + ネットワーク + + + ネットワークを検索しています... + + + WiFi アダプターが見つかりません! + + + WiFi アダプターを検索しています... + + + WiFi ネットワークが見つかりません! + + + チャンネル + + + チャンネル + + + チャンネル幅 + + + 2.4 GHz + + + 5 GHz + + + 2.4 & 5 GHz + + + 信号強度 + + + 現在のダウンロード速度 + + + 現在のアップロード速度 + + + 測定時間 + + + ネットワークの使用状況 + + + 合計ダウンロード数 + + + 合計アップロード + + + 再試行 + + + キャッシュを使用 + + + TCPのみ使用 + + + クエリ クラス + + + ドメイン名 + + + タイムアウト (秒) + + + 問題を報告するか、機能リクエストを作成してください。 + + + ビーコン間隔 + + + 暗号化 + + + インフラストラクチャー + + + ネットワークの種類 + + + Phy の種類 + + + 稼働時間 + + + エラーメッセージを表示 + + + Ping モニター + + + ホストの追加 + + + 監視するホストの追加 + + + 一時停止 + + + 再開 + + + IPアドレスを解決できませんでした : "{0}" + + + 通知 + + + ステータス変更時に通知ポップアップを表示する + + + ステータス変更時にサウンドを再生する + + + 成功しきい値 + + + 「ホストが起動しました」という通知が表示されるまでに必要な、連続した正常なpingの回数。値が大きいほど、ホストの不安定な動作によるノイズが軽減されます。 + + + 失敗しきい値 + + + 「ホストがダウンしています」という通知が表示されるまでに連続して発生するping失敗(タイムアウト)の回数。値が大きいほど、ホストの応答が不安定になることによるノイズが軽減されます。 + + + 表示時間 (秒) + + + ホストが起動しました + + + ホストがダウンしています + + + アプリケーションが再起動されます... + + + ファイルをエクスポートできませんでした! エラーメッセージを参照してください : "{0}" + + + ファイルが"{0}"にエクスポートされました! + + + ファイルをインポートできませんでした! エラーメッセージを参照してください : "{0}" + + + ポータブル版では場所を変更できません! + + + 暗号化されています + + + ドキュメントを開く。 + + + カスタマー 1 + + + プロファイルファイルの追加 + + + 暗号化を無効... + + + プロファイルファイルの編集 + + + 暗号化を有効... + + + 暗号化... + + + プロファイル名は既に存在します! + + + 名前の変更 + + + プロファイルファイルを削除 + + + このプロファイル ファイル内のすべてのプロファイルは完全に削除されます! + + + パッチ + + + 言語を変更するには、アプリケーションを再起動してください! + + + 現在ダウンロード済み + + + 現在アップロード済み + + + LLDP / CDP + + + 管理者として再起動 + + + ネットワーク パケットを分析するには昇格した権限が必要です! + + + キャプチャ + + + デバイス + + + 間隔 (秒) + + + モデル + + + VLAN + + + ネットワークパケットをキャプチャしてLLDPまたはCDP情報を表示! + + + 検出プロトコル パッケージを受信できませんでした! + + + ネットワーク パッケージをキャプチャしています... + + + 検出プロトコル + + + CDP + + + LLDP + + + LLDP / CDP + + + 残り{0}秒... + + + ヘルプ + + + 起動時に表示されるアプリケーション。 + + + パラメータ + + + + + + Web コンソール + + + 再読み込み + + + ブラウザ + + + WebView コントロール (Microsoft Edge) は、証明書が無効な Web サイトに接続できません! + + + この機能には Microsoft.Windows.SDK.Contracts が必要ですが、このシステム (Windows Server など) では使用できません。 + + + 近隣テーブル + + + 接続 + + + ダッシュボード + + + 検出プロトコル + + + DNS Lookup + + + HTTP ヘッダ + + + IP スキャナ + + + リスナー + + + Lookup + + + ネットワーク インターフェース + + + Ping + + + Ping モニター + + + ポート スキャナ + + + PowerShell + + + PuTTY + + + リモート デスクトップ + + + SNMP + + + サブネット 計算機 + + + TigerVNC + + + トレースルート + + + Wake on LAN + + + Web コンソール + + + Whois + + + WiFi + + + アンバー + + + + + + + + + + + + コバルト + + + クリムゾン + + + シアン + + + エメラルド + + + + + + インディゴ + + + ライム + + + マゼンタ + + + モーブ + + + オリーブ + + + オレンジ + + + + + + + + + シエナ + + + トープ + + + ティール + + + ピンク + + + + + + スチール + + + 全般 + + + アプリケーション + + + 全般 + + + 外観 + + + 自動起動 + + + 全般 + + + ホットキー + + + 言語 + + + プロファイ + + + 設定 + + + 状態 + + + 更新 + + + ウィンドウ + + + ログを有効 + + + ログファイル名 + + + ログのパス + + + ログ モード + + + ログ + + + SSH ログ + + + SSH Raw ログ + + + セッション ログ + + + SSH ログ + + + SSH and Raw ログ + + + 有効なファイル名を入力してください! + + + 損失 + + + 受信済み + + + 状態の変更 + + + 更新が利用可能です! + + + プライベート キー ファイル + + + プレビュー + + + ポートのプロファイル + + + ポートのプロファイルを追加 + + + ポートのプロファイルを削除 + + + ポートのプロファイルを編集 + + + 選択したポート プロファイルは完全に削除されます。 + + + ポートプロファイルの選択 + + + ポート プロファイルを開く... + + + 起動時にスプラッシュスクリーンを表示 + + + スプラッシュスクリーン + + + Microsoft Edge WebView2 Runtime をダウンロード + + + Microsoft Edge WebView2 ランタイムは利用できません! + + + 周波数 + + + SSID + + + プロファイルファイルを読み込めませんでした! + + + プロファイルファイルを読み込めませんでした。破損している可能性があります。バックアップからファイルを復元するか、削除してください。 + +これが予期せず発生した場合、またはアップデート後に発生した場合は、GitHub でエラーを報告してください。 + + +エラーメッセージ : +"{0}" + + + グループの編集... + + + 復号化エラー + + + ファイルを復号できませんでした。この問題はGitHubで報告できます。 + + + 暗号化エラー + + + ファイルを暗号化できませんでした。この問題はGitHubで報告できます。 + + + 現在のパスワード + + + 新しいパスワード + + + マスターパスワードの変更 + + + プロファイルのロック解除 + + + プロファイルを使用するには、プロファイル ファイルをロック解除してください! + + + 免責事項 + + + 結合 + + + その他を使用 + + + 移動 + + + 最終スキャン : {0} + + + 非表示のネットワーク + + + {0}によって開発および保守 + + + シンプルなパブリックIPアドレスAPI + + + AirspacePanel は、WPF でホストされる Winforms のすべての Airspace の問題を修正します。 + + + WPF 用の Shared Controlz および ... 詳細 + + + DnsClient.NETは、.NET FrameworkでDNS Lookupsを行うためのシンプルでありながら非常に強力で高性能なオープンソースライブラリです + + + WPF 用のドラッグおよび切り取り可能なタブ コントロール + + + C# ライブラリは、.NET 開発者向けに、複雑なネットワーク、IP、IPv4、IPv6、ネットマスク、CIDR、サブネット、サブネット化、スーパーネット、スーパーネット化の計算を処理します。 + + + 美しく、インタラクティブなグラフ、地図、ゲージ。 + + + WPF の読み込みインジケーターのコレクション + + + WPF と UWP 用のすばらしいアイコン集... + + + Metro / Modern UI スタイルの WPF アプリを作成するためのツールキット。 + + + Json.NETは、.NET向けの人気の高い高性能JSONフレームワークです。 + + + .NET 用の GitHub API クライアント ライブラリ + + + ローカルまたはリモート コンピュータ上の CDP および LLDP パケットをキャプチャして解析します + + + Sharp SNMP ライブラリ - .NET および Mono 用のオープンソース SNMP + + + SVG形式のすべての国旗のコレクション + + + iana.org のトップレベルドメインのリスト。これは、ポート 43 経由で whois.iana.org から TLD の whois サーバーを照会するために使用されます。 + + + Natural Earth のベクトル地図データ (CC0-1.0) の GeoJSON 変換。 + + + ieee.org からの OUI データ。 + + + iana.org からのサービス名およびトランスポート プロトコル ポート番号レジストリ。 + + + Apache License 2.0 + + + BSD-2-Clause + + + MIT License + + + Unlicense + + + C#/WinRT は、C# 言語用のパッケージ化された WinRT プロジェクション サポートを提供します。 + + + Runtime for hosting PowerShell + + + WebView2 コントロールを使用すると、Microsoft Edge (Chromium) を搭載したネイティブ アプリケーションに Web テクノロジ (HTML、CSS、JavaScript) を埋め込むことができます。 + + + WPF の XAML ビヘイビアを使用して、アプリにインタラクティブ機能を簡単に追加できます。 + + + Microsoft WebView2 License + + + 現在のプロファイル ファイルは暗号化されておらず、パスワードは暗号化されずにディスクに保存されます! + +資格情報を安全に保存するには、[設定] > [プロファイル] でプロファイル ファイルの暗号化を有効にします。 + + + ICMPv4 + + + ICMPv6 + + + チェックは無効です! + + + 有効な IPv6 アドレスを入力してください! + + + ICMP 経由で到達可能なパブリック IPv4 アドレス。 + + + ICMP 経由で到達可能なパブリック IPv6 アドレス。 + + + パブリック IPv4 アドレス + + + パブリック IPv6 アドレス + + + カスタム IPv6 アドレス API を使用 + + + 有効期限 + + + シャーシ ID + + + 管理 + + + デバイスの説明 + + + ポートの説明 + + + IPv4 アドレスを削除 + + + 追加設定... + + + IPv4 アドレスを削除... + + + ログイン時間制限に達したため、リモートセッションが終了しました。この制限は、サーバー管理者またはネットワークポリシーによって設定されています。 + + + 有効なホスト名を入力してください! + + + 有効なホスト名とポートを入力してください! + + + リモート セッションに再接続できません。 + + + 移行 + + + GitHubで報告 + + + グループ + + + グループの追加 + + + グループを削除 + + + 選択したグループと、このグループ内のすべてのプロファイルが完全に削除されます。 + + + この名前はすでに使用されています! + + + サイズ変更 + + + プロファイルを削除 + + + 選択したプロファイルは完全に削除されます。 + + + カスタムテーマの使用 + + + カスタムテーマ + + + 設定をリセットしますか? + + + 設定をリセットしました! + + + インスタンスID + + + ローカル接続 + + + ローカル インターフェース + + + log4net は、プログラマがさまざまな出力ターゲットにログ ステートメントを出力するのに役立つツールです。 + + + 有効 + + + 地域 + + + 同期するプロファイルと地域 + + + 既定のプロファイル + + + 既定の地域 + + + グループ名は"{0}"で始めることはできません! + + + プレリリース版をチェックする + + + 同期が無効になっています! + + + コマンド + + + PowerShellコンソールにテーマを適用する + + + PowerShellコンソールの色は、「設定」>「全般」>「外観」でアプリケーションテーマに変更できます。 + + + このオプションを有効にすると、レジストリの HKCU:\Console にある PowerShell コンソールの既定の設定が上書きされ、PowerShell コンソール ウィンドウがアプリケーションのテーマに合わせて表示されるようになります。これはシステム全体の設定であり、通常の PowerShell ウィンドウの外観にも影響を与える可能性があります。 + +変更されるのは、PowerShell の設定で構成された PowerShell コンソールのみです。Windows PowerShell および PWSH (PowerShell 7 以降) の両方がサポートされています。 + +詳細については、右上隅のヘルプ/ドキュメントボタン(最小化ボタンの左側)をクリックするか、https://borntoberoot.net/NETworkManager/Documentation/Settings/Appearance にアクセスしてください。以下に、調整される値のドキュメントを記載します。 + +このオプションを再度無効にすると、値は変更されなくなります。ただし、元の値は復元されません。 + + + 入力は";"で終わることはできません! + + + 入力にテキストが含まれていません! + + + ビット計算機 + + + ビット計算機 + + + 表記 + + + 入力 + + + 単位 + + + Bits + + + Gigabits + + + Gigabytes + + + Kilobits + + + Kilobytes + + + Megabits + + + Megabytes + + + Petabits + + + Petabytes + + + Terabits + + + Terabytes + + + 数値を入力し、単位を選択して単位を計算... + + + ネットワーク + + + プロキシ + + + このホストのIPアドレスを解決します(IPv4が推奨されます) + + + PowerShell への有効なパスは、「pwsh.exe」または「powershell.exe」で終わる必要があります! + + + PuTTY への有効なパスは「PuTTY.exe」で終わる必要があります! + + + TigerVNC への有効なパスは、「vncviewer-*.exe」または「vncviewer64-*.exe」で終わる必要があります! + + + SNTP Lookup + + + .NET Framework/.NET Core アプリのランタイム コンポーネントと依存関係をサブディレクトリに移動して整理します。 + + + SNTP Lookupを実行するためのタブを追加... + + + SNTP サーバー(s) + + + http または https経由でアクセスでき、応答として IPv6アドレス 例: "xxxx:xx:xxx::xx" を返す Webサービスへの URL。 + + + IPエンドポイント + + + ローカル終了時刻 + + + ローカル開始時刻 + + + ネットワーク時刻 + + + オフセット + + + Round trip delay + + + Server + + + SNTP Lookup + + + SNTP サーバーの追加 + + + SNTP サーバーを削除 + + + 選択した SNTP サーバーは完全に削除されます。 + + + SNTP サーバーの編集 + + + この名前の SNTP サーバーは既に存在します! + + + 有効なホスト名 (例: "server-01" または "example.com") または有効な IPアドレス (例: 192.168.178.1) を入力してください! + + + サーバー + + + プロファイルファイルのロックを解除するにはマスターパスワードを入力してください : + + + プロファイルファイルのロック解除 + + + タイムアウト + + + ホストキー + + + 設定がリセットされ、その後アプリケーションが再起動されます! + + + 設定がリセットされました! + + + Pingの状態 + + + ThreadPool 追加最小スレッド数 + + + この設定は、アプリケーションのスレッドプールからオンデマンドで作成されるスレッドの最小数を指定します。これにより、例えばIPスキャナーやポートスキャナーのパフォーマンスが向上します。 + +この値はデフォルトの最小スレッド数(CPUスレッド数)に追加されます。値が0の場合、デフォルト設定のままとなります。この値がThreadPoolのデフォルトの最大スレッド数よりも大きい場合は、この値が使用されます。 + +値が高すぎると、パフォーマンスの問題が発生する可能性があります。 + +この値の変更は、アプリケーションの再起動後に有効になります。値が正常に設定されたかどうかは、%LocalAppData%\NETworkManager\NETworkManager.log のログファイルで確認できます。 + + + これらの設定は、ホスト/ポートスキャンごとに同時に実行されるスレッドの最大数のみを変更します。アプリケーションのスレッド数(最小)を調整するには、「設定」>「一般」>「一般」に移動してください。 + + + ポートの状態 + + + Ping の詳細 + + + 開いているポートが見つかりません! + + + ポートスキャンは無効です! + + + スキャン ポート + + + アプリケーション"{0}"が見つかりませんでした。設定でアプリケーションが非表示になっている可能性があります。 + + + 状態ウィンドウ + + + アドレスバーを表示 + + + この設定を有効にすることは推奨されません。アプリケーションの複数のインスタンスは同じ設定とプロファイルファイルを共有します。最後に閉じられたインスタンスによって、他のインスタンスによる変更が上書きされる可能性があります。 + + + ローカルアドレスのバイパス + + + ゲートウェイサーバーを有効にする + + + ログオン方法 + + + ゲートウェイ サーバー + + + サーバー名 + + + ゲートウェイの資格情報をリモート コンピュータと共有する + + + 後で選択できるようにする + + + スマートカードまたはWindows Hello for Business + + + パスワードを要求する(NTLM) + + + ゲートウェイ資格情報を使用する + + + リモートデスクトップゲートウェイサーバーが一時的に利用できないため、お使いのコンピューターはリモートコンピューターに接続できません。しばらくしてから再接続するか、ネットワーク管理者にお問い合わせください。 + + + お使いのコンピューターは、次のいずれかの理由によりリモートコンピューターに接続できません。1) 要求されたリモートデスクトップゲートウェイサーバーのアドレスとサーバーのSSL証明書のサブジェクト名が一致しません。2) 証明書の有効期限が切れているか、失効しています。3) 証明機関が証明書を信頼していません。ネットワーク管理者にお問い合わせください。 + + + このコンピューターはRDゲートウェイ「」のIDを確認できません。識別できないサーバーへの接続は安全ではありません。ネットワーク管理者にお問い合わせください。 + + + 要求されたリモートデスクトップゲートウェイサーバーのアドレスと証明書のサブジェクト名が一致しないため、コンピューターはリモートコンピューターに接続できません。ネットワーク管理者にお問い合わせください。 + + + リモートデスクトップゲートウェイサーバーの証明書の有効期限が切れているか失効しているため、お使いのコンピューターはリモートコンピューターに接続できません。ネットワーク管理者にお問い合わせください。 + + + リモートデスクトップゲートウェイサーバーへのデータ送信中にエラーが発生しました。サーバーが一時的に利用できないか、ネットワーク接続がダウンしています。しばらくしてからもう一度お試しいただくか、ネットワーク管理者にお問い合わせください。 + + + リモートデスクトップゲートウェイサーバーからデータを受信中にエラーが発生しました。サーバーが一時的に利用できないか、ネットワーク接続がダウンしています。しばらくしてからもう一度お試しいただくか、ネットワーク管理者にお問い合わせください。 + + + リモートデスクトップゲートウェイサーバーのアドレスが到達不能または正しくないため、コンピューターはリモートコンピューターに接続できません。有効なリモートデスクトップゲートウェイサーバーのアドレスを入力してください。 + + + リモートデスクトップゲートウェイサーバーのサーバーリソースが不足しており、一時的に利用できないため、コンピューターはリモートコンピューターに接続できません。しばらくしてから再接続するか、ネットワーク管理者にお問い合わせください。 + + + リモートデスクトップゲートウェイサーバーは接続を終了しました。しばらくしてから再接続するか、ネットワーク管理者にお問い合わせください。 + + + リモートデスクトップゲートウェイサーバーの管理者が接続を終了しました。しばらくしてから再接続するか、ネットワーク管理者にお問い合わせください。 + + + リモートデスクトップは、次のいずれかの理由により、リモートコンピューター "" に接続できません。1) RDゲートウェイのアクセス許可リストにユーザーアカウントが登録されていない。2) リモートコンピューターをNetBIOS形式(例:computer1)で指定したが、RDゲートウェイではFQDNまたはIPアドレス形式(例:computer1.fabrikam.comまたは157.60.0.1)が想定されている。ネットワーク管理者にお問い合わせください。 + + + リモート デスクトップは、次のいずれかの理由により、リモート コンピューター "" に接続できません。1) ユーザー アカウントに RD ゲートウェイ "" へのアクセスが許可されていません。2) コンピューターに RD ゲートウェイ "" へのアクセスが許可されていません。3) 互換性のない認証方法を使用しています (たとえば、RD ゲートウェイがスマート カードを必要としているのに、パスワードを入力したなど)。サポートについては、ネットワーク管理者に問い合わせてください。 + + + ネットワーク管理者がこのRDゲートウェイサーバーへのアクセスを制限しているため、お使いのコンピューターはリモートコンピューターに接続できません。ネットワーク管理者にお問い合わせください。 + + + Webプロキシサーバーが認証を必要とするため、お使いのコンピューターはリモートコンピューターに接続できません。Webプロキシサーバー経由でRDゲートウェイサーバーへの認証されていないトラフィックを許可するには、ネットワーク管理者にお問い合わせください。 + + + リモートデスクトップゲートウェイサーバーの接続数が上限に達したため、お使いのコンピューターはリモートコンピューターに接続できません。しばらくしてから再接続するか、ネットワーク管理者にお問い合わせください。 + + + リモートデスクトップゲートウェイサーバーが要求をサポートしていないため、お使いのコンピューターはリモートコンピューターに接続できません。ネットワーク管理者にお問い合わせください。 + + + クライアントがリモートデスクトップゲートウェイの機能の1つをサポートしていないため、コンピューターはリモートコンピューターに接続できません。ネットワーク管理者にお問い合わせください。 + + + リモートデスクトップゲートウェイサーバーとこのコンピューターに互換性がないため、このコンピューターはリモートコンピューターに接続できません。ネットワーク管理者にお問い合わせください。 + + + リモートデスクトップゲートウェイサーバーで使用する証明書が構成されていないため、コンピューターはリモートコンピューターに接続できません。ネットワーク管理者にお問い合わせください。 + + + 接続しようとしているRDゲートウェイサーバーがコンピューターの管理者によって許可されていないため、コンピューターはリモートコンピューターに接続できません。管理者の場合は、このリモートデスクトップゲートウェイサーバー名をコンピューターの信頼できるリモートデスクトップゲートウェイサーバー一覧に追加してから、再度接続してください。 + + + お使いのコンピューターまたはデバイスがネットワーク管理者によって設定されたネットワークアクセス保護の要件を満たしていないため、リモートコンピューターに接続できません。原因としては、次のいずれかが挙げられます。1) リモートデスクトップゲートウェイのサーバー名とサーバーの公開キー証明書のサブジェクト名が一致しません。2) 証明書の有効期限が切れているか、失効しています。3) 証明書ルート証明機関が証明書を信頼していません。4) 証明書キーの拡張が暗号化をサポートしていません。5) お使いのコンピューターが証明書失効リストを検証できません。ネットワーク管理者にお問い合わせください。 + + + リモート デスクトップ ゲートウェイ サーバーへの認証にはスマート カードの資格情報ではなくユーザー名とパスワードが必要なため、コンピューターはリモート コンピューターに接続できません。 + + + リモート デスクトップ ゲートウェイ サーバーに認証するには、ユーザー名とパスワードではなく、スマート カードの資格情報が必要であるため、コンピューターはリモート コンピューターに接続できません。 + + + リモートデスクトップゲートウェイサーバーに無効なCookieが送信されたため、お使いのコンピューターはリモートコンピューターに接続できません。ネットワーク管理者にお問い合わせください。 + + + リモートデスクトップゲートウェイサーバーによってCookieが拒否されたため、コンピューターはリモートコンピューターに接続できません。ネットワーク管理者にお問い合わせください。 + + + リモートデスクトップゲートウェイサーバーが、試行した認証方法とは異なる認証方法を要求しているため、お使いのコンピューターはリモートコンピューターに接続できません。ネットワーク管理者にお問い合わせください。 + + + 定期的なユーザー認証に失敗したため、RDゲートウェイ接続が終了しました。正しいユーザー名とパスワードで再接続してください。再接続に失敗した場合は、ネットワーク管理者にお問い合わせください。 + + + 定期的なユーザー認証に失敗したため、RDゲートウェイ接続が終了しました。正しいユーザー名とパスワードで再接続してください。再接続に失敗した場合は、ネットワーク管理者にお問い合わせください。 + + + リモートデスクトップゲートウェイとリモートコンピュータがポリシーを交換できないため、コンピュータはリモートコンピュータに接続できません。これは、次のいずれかの理由により発生する可能性があります。1. リモートコンピュータがリモートデスクトップゲートウェイとポリシーを交換できない。2. リモートコンピュータの構成で新しい接続が許可されていない。3. リモートデスクトップゲートウェイとリモートコンピュータ間の接続が終了している。ネットワーク管理者に問い合わせてください。 + + + 定期的なユーザー認証に失敗したため、RDゲートウェイ接続が終了しました。お使いのコンピューターまたはデバイスは、ネットワーク管理者が設定したネットワークアクセス保護(NAP)の要件を満たしていませんでした。ネットワーク管理者にお問い合わせください。 + + + 接続済み + + + WiFi アダプタ"{0}"のスキャン中にエラー : "{1}" + + + 接続... + + + {0} 切断されました! + + + {0} に接続 + + + WPS + + + 自動的に接続 + + + Pre-shared キー + + + {0} に接続しています... + + + {0} ({1}) に接続できませんでした! + + + {0} に正常に接続しました! + + + ネットワークへのアクセスが取り消されました + + + 無効な資格情報 + + + ネットワークが利用できません + + + 成功 + + + 接続試行がタイムアウトしました + + + -/- + + + 認証プロトコルはサポートされていません! + + + WPS を確認しています... + + + OID プロファイルを開く... + + + MIB + + + OID プロファイル + + + OID プロファイルの選択 + + + OID プロファイルの追加 + + + OID プロファイルを削除 + + + 選択した OID プロファイルは完全に削除されます。 + + + OID プロファイルの編集 + + + パスワードの入力... + + + タブの追加 + + + (プロファイルから) + + + 新しいサブネットマスク + + + サーバーの追加 + + + SNTP サーバー + + + このページの設定にはエラーがあります。修正して保存してください。 + + + 接続に使用するSSHホストキー (例:"71:b8:f2:6e...")。モードが "SSH" の場合にのみ使用できます。 + + + 秘密鍵ファイルへのフルパス (例: "C:\Users\BornToBeRoot\SSH\private_key.ppk")。モードが "SSH" の場合のみ使用できます。 + + + PuTTYセッションに渡されるユーザー名。モードが「SSH」、「Telnet」、または「Rlogin」の場合にのみ使用できます。 + + + ASN + + + AS 名 + + + + + + 大陸 + + + + + + 通貨 + + + + + + DNS resolver + + + EDNS + + + Geolocation + + + Hosting + + + IP geolocation + + + ISP + + + Latitude + + + Longitude + + + モバイル + + + 組織 + + + PTRレコード + + + タイムゾーン + + + 郵便番号 + + + IP位置情報API - 高速、正確、信頼性 + + + DNSリゾルバの確認 + + + IP位置情報の確認 + + + マップを表示 + + + DNS リゾルバは ip-api.com によって決定されます。 + +URL: https://edns.ip-api.com/ + + + IP の地理位置は ip-api.com によって決定されます。 + +URL: http://ip-api.com/ + + + 追加機能を提供するために、私が運営していないサードパーティのサービスが利用されています。以下の選択を解除できます。いかなる場合も、私にデータが転送されることはありません。 + + + DNS リゾルバを確認しています... + + + IP 地理位置情報を確認しています... + + + ネットワーク接続を確認し、数秒後にもう一度お試しください。 + + + ip-api.com のレート制限に達しました (ネットワークからのリクエストが多すぎます)! +数秒後にもう一度お試しください。 + + + HTTP 状態コード + + + スチール + + + レート制限に達しました。{0} 秒後にもう一度お試しください... + + + 全般 + + + BSSID + + + アクセス可能なホストが見つかりません! + + + アプリケーション + + + 新しい機能をテストするために、試験的な機能を有効にしてください。これらの機能はまだ完成しておらず、バグが含まれており、アプリケーションをクラッシュさせる可能性があり、リリースまでに変更される可能性があります。 + + + 実験的な機能 + + + 実験的 + + + コマンドを実行... + + + IP 位置情報 + + + IP 位置情報を照会するためのタブを追加... + + + whois を照会するドメインの入力... + + + IP 位置情報を照会するにはホストの入力... + + + ユーザー名が不明です。 + + + 認証に失敗しました (パスワード、コミュニティ、またはキーが正しくありません)。 + + + 操作はエラーなく成功しました。 + + + リクエストに対する応答が大きすぎて、1 つの応答に収まりきりません。 + + + 要求された OID が見つかりませんでした! + + + 読み取り/書き込みまたは書き込み専用オブジェクトに矛盾した値が設定されました! + + + 要求された OID は存在せず、書き込み可能ではありません! + + + 特定のメッセージがないエラーが発生しました! + + + 要求されたオブジェクトは変更のためにアクセスできません! + + + オブジェクトが互換性のないデータ型に設定されました! + + + オブジェクトに割り当てられた値が最大長を超えています! + + + オブジェクトに使用されているエンコーディングが正しくありません! + + + オブジェクトに割り当てられた値は有効な選択ではありません! + + + 要求されたオブジェクトは存在しないため、作成できません! + + + MIB 変数は現在不整合な状態にあるため、変更できません! + + + 要求された操作を実行するために利用可能なシステム リソースがありません! + + + 設定操作中にエラーが発生しました! + + + 設定操作が失敗し、以前の変更をロールバックできませんでした! + + + 認証に失敗しました。コミュニティ文字列を確認してください! + + + 要求されたオブジェクトは書き込み可能ではなく、変更もできません! + + + オブジェクトの状態が矛盾しているため、設定操作を実行できません! + + + すべて閉じる + + + ホストビューを展開 + + + マップビューを展開 + + + 他のホストを追加している間は、ホストを設定できません。処理が完了するまでお待ちいただき、もう一度お試しください。 + + + 一致するコマンドがありません! + + + リモートホスト名 + + + プロセス ID + + + プロセスのパス + + + プロセス名 + + + NetBIOS + + + コンピューター名 + + + エラー + + + OK + + + 警告 + + + グループ / ドメイン + + + NetBIOS 到達可能 + + + NetBIOS のスキャン + + + NetBIOS スキャンが無効です! + + + ホスト名の解決が無効です! + + + MAC アドレスの解決が無効です! + + + グループを閉じる + + + コマンドを実行... (Ctrl+Shift+P) + + + プロファイル ファイル + + + 設定を開く... + + + 展開して検索を開く... + + + Windows 11 24H2 以降では、Wi-Fi アダプターへのアクセスを許可する必要があります。 + +Windows の「設定」>「プライバシーとセキュリティ」>「位置情報」を開き、デスクトップ アプリ / NETworkManager へのアクセスを有効にして、アプリケーションを再起動してください。 + + + アプリケーションをドラッグ アンド ドロップして順序を変更します。 +右クリックすると、さらにオプションが表示されます。 + + + デフォルトに戻す + + + WPF 用の使いやすいドラッグ アンド ドロップ フレームワーク。 + + + BSD-3-Clause + + + デフォルトの設定 + + + Nextcloud と Traefik を使って Docker を実行する Ubuntu Server... + + + AWS で実行されている Linux サーバー... + + + 6 GHz + + + このプロジェクトを寄付で支援してください。 + + + ドキュメントを開く + + + 寄付 + + + プロファイル ファイル + + + Hosts ファイルエディタ + + + Hosts ファイルエディタ + + + 読み取り専用モードです。hosts ファイルを変更するには、昇格された権限が必要です! + + + hostsファイルを開く + + + コメント + + + 無効 + + + エントリの編集 + + + エントリの編集... + + + エントリの有効化 + + + エントリの無効化 + + + 更新中... + + + 再読み込み {0} + + + hosts ファイルの読み込みに失敗 : {0} + + + {0} 秒後に再試行... + + + 更新されたものは? + + + 変更ログ + + + {0} へアップグレード + + + このリリースには新機能、改善、バグ修正が含まれています。詳細は変更ログをご覧ください! + + + エントリ + + + 選択したエントリは完全に削除されます : + +{0} {1} {2} + + + プライマリ DNS サーバー + + + 有効なホスト名を入力してください (例: "server-01" または "example.com")! 複数のホスト名はスペースで区切ることができます。 + + + "hosts" ファイルを読み取ることができませんでした! 詳細についてはログファイルを参照してください。 + + + "hosts" ファイルに書き込めませんでした。詳細はログファイルを参照してください。 + + + "hosts" ファイルにエントリが見つかりませんでした! ファイルが変更されている可能性があります。 + + + "hosts" ファイルのバックアップを作成できませんでした! 詳細についてはログファイルを参照してください。 + + + ステータスバーを表示 + + + リンクの上にマウスを移動すると、WebView の左下にステータス バーが表示されます。 + + + 資格情報の保存 + + + サインインが成功した後に資格情報を保存するためのダイアログを表示します。 + + + 閲覧データの削除 + + + 現在の WebView2 プロファイルの閲覧データ (履歴、Cookie、キャッシュ、資格情報など) を完全に削除します。 + + + 閲覧データ + + + 閲覧データが正常に削除されました! + + + 閲覧データの削除中にエラーが発生しました。この問題はGitHubでご報告ください。 + + + 制作 + + + タグの追加 + + + フィルターを適用 + + + フィルターのプロファイル... + + + タグでフィルタリング + + + タグが見つかりません! + + + 一致 + + + どれでも + + + グループの追加... + + + すべて展開 + + + すべて折りたたむ + + + カスタムテーマを使用して、アプリケーションの外観をカスタマイズできます。テーマは「プログラムフォルダー > テーマ」ディレクトリで編集または追加できます。詳細についてはドキュメントをご覧ください。 + + + 管理者 (コンソール) セッション + + + プロファイルファイル "{0}" は完全に削除されます。 + + + 暗号化を有効にしますか? + + + hosts、IPアドレス、URL、保存された認証情報などの機密データを保護するために、プロファイルファイルの暗号化を有効にしますか? + +プロファイルファイルを右クリックして暗号化設定を管理することで、いつでも暗号化を有効または無効にすることができます。 +「キャンセル」をクリックすると、プロファイルファイルは暗号化されません。 + + + 言語設定などの変更を反映するには、再起動が必要です。 + + + 指定された DNS サーバーを解析または解決できませんでした。 + + + "{0}" を解析できませんでした。 + + + バックアップの最大数 + + + 毎日バックアップを作成する + + + 最も古いものが削除されるまで保持されるバックアップの数。 + + + この設定は管理者によって管理されています。 + + + 既定の場所を復元 + + + 復元 + + + 既定の場所を復元しますか? + + + デフォルトの設定場所が復元され、その後アプリケーションが再起動されます。 + +必要に応じて、"settings.json"ファイルを "{0}" から "{1}" にコピーして、以前の設定を移行できます。設定が上書きされないように、この操作を行うにはアプリケーションを閉じる必要があります。 + + + 場所を変更しますか? + + + デフォルトの設定場所が復元され、その後アプリケーションが再起動されます。 + +必要に応じて、"settings.json"ファイルを "{0}" から "{1}" にコピーして、以前の設定を移行できます。設定が上書きされないように、この操作を行うにはアプリケーションを閉じる必要があります。 + + + 有効なフォルダーパスを入力してください! + + + プロファイルの場所が変更され、その後アプリケーションが再起動されます。 + +必要に応じて、プロファイルファイルを “{0}” から “{1}” にコピーして既存のプロファイルを移行できます。プロファイルが上書きされないように、この操作を行うにはアプリケーションを終了してください。 + + + プロファイルの既定の場所が復元され、その後アプリケーションが再起動されます。 + +必要に応じて、プロファイルファイルを “{0}” から “{1}” にコピーして、既存のプロファイルを移行できます。プロファイルが上書きされないように、この操作を行うにはアプリケーションを終了してください。 + + + ネットワーク接続 + + + ネットワーク状態 + + + Active Directoryのインポートに失敗しました。 + + + オプション + + + + 現在使用しているWindowsの認証情報を使用してActive Directoryから読み取ります。このアカウントには、検索ベース (サブツリー) の下にあるコンピューターオブジェクトを列挙する権限が必要です。 + + + 検索ベース (DN) + + + 追加の LDAP フィルター + + + フィルターは、'(' で始まり ')' で終わる有効なLDAP式でなければなりません。 + + + 検索ベースは、有効なLDAP識別名 (例 : DC=example,DC=com) でなければなりません。 + + + Active Directoryからインポートされました : {0} + + + 指定された検索条件とフィルターに一致するコンピュータは見つかりませんでした。 + + + Active Directory を検索中... + + + コンピュータがドメインに参加していない場合は、ドメイン コントローラー (ホスト名またはIPアドレス) を指定し、カスタム認証情報を使用してください。 + + + サーバー (任意) + + + ポート (任意) + + + SSL を使用 (LDAPS) + + + 現在のWindowsの認証情報を使用する + + + これらの認証情報を使用する + + + 高度 + + + すべて選択 + + + すべて選択解除 + + + 有効化 + + + すでにインポート済みのものはスキップ + + + {0} · {1} 結果 + + + {0} プロファイルがインポート済み。 +{1} 重複エントリをスキップ。 +{2} ホストなしをスキップ。 + + + Active Directory + + + CSV ファイル + + + CSV ファイル + + + CSV ファイルからプロファイルをインポート + + + {0} の CSV ファイルからインポート済み + + + CSV ファイルにエントリが見つかりませんでした。 + + + 期待される CSV 形式 - 1行につき1つのプロファイル : + + + ヘッダ行と区切り文字 (セミコロン、カンマ、またはタブ) は自動的に検出されます。「説明」列は任意です。ホストが指定されていないエントリはインポートできません。 + + + インポート結果 + + + 新規 + + + インポート済み + + + ホストなし + + + 無効なアカウントを除外する + + + Active Directory からコンピューターをインポート + + + Active Directory からコンピューターをインポート...... + + + プロファイルのインポート + + + ソース + + + Active Directory + + + プロファイルグループ + + + 既存または新しいグループ名 + + + ファイアウォール + + + ファイアウォールの規則 + + + Windows ファイアウォールの設定 + + + 方向 + + + 受信 + + + 送信 + + + 操作 + + + 許可 + + + ブロック + + + ネットワーク プロファイル + + + ネットワーク プロファイル + + + インタフェース + + + ファイアウォール規則の読み込みに失敗しました。 {0} + + + 選択されたファイアウォールルールは完全に削除されます : + +{0} + + + すべて + + + TCP + + + UDP + + + ICMPv4 + + + ICMPv6 + + + HOPOPT + + + GRE + + + IPv6 + + + IPv6-Route + + + IPv6-Frag + + + IPv6-NoNxt + + + IPv6-Opts + + + VRRP + + + PGM + + + L2TP + + + すべて + + + 有線 + + + 無線 + + + リモートアクセス + + + 読み取り専用モードです。ファイアウォールルールを変更するには、管理者権限が必要です! + + + 受信 + + + 送信 + + + ブロック + + + 許可 + + + ローカルポート + + + リモートポート + + + ローカルアドレス + + + リモートアドレス + + + 有効なIPアドレス、サブネット (例:10.0.0.0/8)、範囲 (例:10.0.0.1-10.0.0.10)、またはキーワード (Any、LocalSubnet、DNS、DHCP、WINS、DefaultGateway、Internet、Intranet、IntranetRemoteAccess、PlayToDevice、CaptivePortal) を入力してください。 + + + ルールの追加 + + + ルールの追加... + + + ルールの編集 + + + ルールの編集... + + + ルールの削除 + + + ルールの有効化 + + + ルールの無効化 + + + プロファイルのインポート... + + + スピードテスト + + + スピードテストを実行 + + + メタデータの取得中... + + + レイテンシの測定中... + + + ダウンロード速度を測定中... + + + アップロード速度を測定中... + + + speed.cloudflare.comでダウンロード速度、アップロード速度、レイテンシ、ジッターを測定できます。 +Cloudflareは、お客様のIPアドレスおよびネットワーク情報を記録する場合があります。詳細はCloudflareのプライバシーポリシーをご覧ください。 + + + レイテンシ + + + ジッター + + + ダウンロード速度、アップロード速度、レイテンシ、ジッターを測定するために使用される速度テストサービス。 + + + 停止 + + diff --git a/Source/NETworkManager.Localization/Resources/Strings.ko-KR.resx b/Source/NETworkManager.Localization/Resources/Strings.ko-KR.resx index 354841fc6e..1e172c2e59 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.ko-KR.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.ko-KR.resx @@ -138,8 +138,32 @@ ARP - - ARP 테이블 + + 인접 테이블 + + + 읽기 전용 모드입니다. 인접 테이블을 수정하려면 권한 상승이 필요합니다! + + + 접근 불가 + + + 미완성 + + + 조사 + + + 지연 + + + 오래된 + + + 접근 가능 + + + 상시 인증 @@ -259,7 +283,7 @@ 라이브러리 - 라이센스 + 라이선스 로컬 장치 및 리소스 @@ -285,12 +309,24 @@ 네트워크 인터페이스 + + Configuration applied + + + Configuring the network interface requires elevated rights! + 새 탭 + + Next + OUI + + Options + 덮어쓰시겠습니까? @@ -348,9 +384,6 @@ 설정 - - 설정이 재설정되었습니다! - SNMP @@ -376,7 +409,7 @@ 테마 - 추적 경로 + 경로 추적 트레이 @@ -444,6 +477,18 @@ 설명 + + Placeholder + + + Path to the file or executable to run. The following placeholders can be used: + + + Arguments passed to the file or executable. The following placeholders can be used: + + + The following placeholder can be used: + DHCP 사용 @@ -489,6 +534,30 @@ IPv4 주소 + + IPv4 address added + + + IPv4 address removed + + + IPv4 address released and renewed + + + IPv4 address released + + + IPv4 address renewed + + + IPv6 address released and renewed + + + IPv6 address released + + + IPv6 address renewed + IPv4 기본 게이트웨이 @@ -504,11 +573,23 @@ IPv6 기본 게이트웨이 + + Map + + + (+{0} more) + + + Scroll = Zoom, Drag = Pan + + + Unknown + 최대화 - - 최대 홉/라우터 + + 최대 홉 응용 프로그램을 종료하는 대신 기본 창 최소화 @@ -529,7 +610,7 @@ 새 서브넷 마스크 또는 CIDR - 아니오 + 아니요 자동으로 IP 주소 가져오기 @@ -561,9 +642,6 @@ 재시작 필요 - - 일부 설정은 응용 프로그램을 다시 시작한 후에만 적용됩니다! - 응용 프로그램 폴더에 설정 저장 @@ -577,7 +655,7 @@ 시작할 때 다음 응용 프로그램을 표시: - 네트워크를 관리하고 네트워크 문제를 해결하는 강력한 도구입니다! + 네트워크 관리와 네트워크 문제 해결을 위한 강력한 오픈 소스 도구! 속도 @@ -594,12 +672,9 @@ 정적 IPv4 DNS 서버 - + 서브넷 마스크 - - 서브넷 마스크 또는 CIDR - 스레드 @@ -621,8 +696,8 @@ 시간 초과 (ms) - - 각 핑 간 대기 시간 + + 각 핑 사이의 대기 시간 (ms) TTL @@ -663,9 +738,6 @@ 추적을 수행할 탭 추가... - - HTTP 헤더를 쿼리할 탭을 추가... - 호스트 이름에 DNS 접미사 (기본) 추가 @@ -691,7 +763,7 @@ 적용 - Windows 키 조합 적용 (예: Alt+Tab) : + Windows 키 조합 (예: ALT+TAB) 적용: 인증 @@ -720,6 +792,9 @@ Caps Lock이 활성화되었습니다! + + Chart time (seconds) + 시작할 때 업데이트 확인 @@ -769,15 +844,15 @@ 자격 증명 - Profile files are encrypted on disk using AES with a key size of 256 bits and a block size of 128 bits in CBC mode. The encryption key is derived from a master password using Rfc2898DeriveBytes (PBKDF2) with 1,000,000 iterations. At runtime, passwords are stored as SecureString once the profile file is loaded. For some functions, the password must be converted to a normal string and remains unencrypted in memory until the garbage collector cleans them up. + 프로필 파일은 CBC 모드에서 키 크기 256비트, 블록 크기 128비트의 AES를 사용하여 디스크에서 암호화됩니다. 암호화 키는 1,000,000회 반복하는 Rfc2898DeriveBytes (PBKDF2)를 사용하는 마스터 암호에서 파생됩니다. 런타임에 프로필 파일이 로드되면 암호가 SecureString으로 저장됩니다. 일부 함수의 경우 암호를 일반 문자열로 변환해야 하며 가비지 수집기가 암호를 정리할 때까지 메모리에 암호화되지 않은 상태로 남아 있습니다. -First make a backup copy of your profile files before enabling encryption! +암호화를 활성화하기 전에 먼저 프로필 파일의 백업 복사본을 만드십시오! - 사용자 정의 + 사용자 지정 - 사용자 정의 화면 크기: + 사용자 지정 화면 크기: 데이터가 업데이트되었습니다! @@ -821,9 +896,6 @@ First make a backup copy of your profile files before enabling encryption! DNS 서버 - - 문서 열기 - 도메인 @@ -842,8 +914,8 @@ First make a backup copy of your profile files before enabling encryption! 종료시간 - - 계산할 서브넷을 입력하십시오... + + 계산할 서브넷을 입력하세요... 서브넷과 새 서브넷 마스크를 입력하여 서브넷을 만듭니다... @@ -866,9 +938,6 @@ First make a backup copy of your profile files before enabling encryption! 고정 화면 크기: - - GitHub 프로젝트 스타/포크 - 찾음 @@ -906,7 +975,7 @@ First make a backup copy of your profile files before enabling encryption!로컬 포트 - MAC 주소 또는 공급 업체 + MAC 주소 또는 공급업체 매직 패킷이 성공적으로 전송되었습니다! @@ -969,6 +1038,9 @@ First make a backup copy of your profile files before enabling encryption! OID + + Only CSV files are allowed! + 전체 화면을 사용할 때만 @@ -982,7 +1054,7 @@ First make a backup copy of your profile files before enabling encryption!열기 - 오픈 라이센스 + 오픈 라이선스 프로젝트 열기 @@ -993,12 +1065,6 @@ First make a backup copy of your profile files before enabling encryption! 무효 - - 대상 폴더의 설정을 덮어쓰시겠습니까? - -"덮어쓰기"는 대상 폴더의 파일을 덮어씁니다. -"기타 사용"은 대상에 있는 기존 설정 파일을 사용하고 응용프로그램을 다시 시작합니다. - 암호 @@ -1029,9 +1095,6 @@ First make a backup copy of your profile files before enabling encryption! PuTTY 프로세스가 종료되었습니다! - - PuTTY 프로필 - 질문 @@ -1098,18 +1161,6 @@ First make a backup copy of your profile files before enabling encryption! 화면 해상도 선택 - - 선택한 설정을 덮어씁니다! - - - 선택한 설정이 재설정됩니다. - - - 내보낼 설정을 선택: - - - 가져올 설정을 선택: - 이렇게 하면 모든 설정이 재설정됩니다! @@ -1126,15 +1177,6 @@ First make a backup copy of your profile files before enabling encryption!발견된 설정 파일이 손상되었거나 이 버전과 호환되지 않습니다. 모든 설정이 재설정되었습니다! (프로필에는 영향을 주지 않습니다!) - - 설정을 성공적으로 내보냈습니다! - - - 설정을 성공적으로 가져왔습니다! - - - 설정이 성공적으로 재설정되었습니다! - 닫힌 포트 표시 @@ -1144,8 +1186,8 @@ First make a backup copy of your profile files before enabling encryption! 가장 일반적인 쿼리 유형만 표시 - - 모든 IP 주소에 대한 검색 결과 표시 + + 도달할 수 없는 IP 주소 및 포트 표시 통계 표시 @@ -1190,7 +1232,7 @@ First make a backup copy of your profile files before enabling encryption!설정 위치는 영향을 받지 않습니다 - SNMP 쿼리의 시간 초과입니다. + SNMP 쿼리에서 시간 초과. 호스트에 연결할 수 없거나 커뮤니티/비밀번호가 잘못되었을 수 있습니다. IP 주소 "{0}"으로 DNS 서버를 쿼리할 때 시간이 초과되었습니다! @@ -1204,8 +1246,8 @@ First make a backup copy of your profile files before enabling encryption! 알 수 없는 오류! - - 트레이 해제 / 창을 전면에 가져오기 + + 트레이 제거 / 창을 전경으로 가져오기 URL @@ -1232,7 +1274,7 @@ First make a backup copy of your profile files before enabling encryption!사용자 이름 - 공급 업체 + 공급업체 버전 @@ -1247,7 +1289,7 @@ First make a backup copy of your profile files before enabling encryption!너비 - Profile file could not be decrypted with the given password. + 지정된 암호로 프로필 파일의 암호를 해독할 수 없습니다. 입력한 암호가 잘못되었습니다. @@ -1309,6 +1351,9 @@ First make a backup copy of your profile files before enabling encryption! DNS 캐시 플러시 + + DNS cache flushed + 자격 증명을 해독하고 불러와서 선택합니다. @@ -1366,12 +1411,12 @@ First make a backup copy of your profile files before enabling encryption! 덮어쓰기 + + Parse + 붙여넣기 - - C:\Program Files\PuTTY\putty.exe - 다시 연결 @@ -1397,7 +1442,7 @@ First make a backup copy of your profile files before enabling encryption!마스터 암호 설정... - 로컬 라이센스 표시 + 로컬 라이선스 표시 서브넷 계산기 @@ -1409,22 +1454,22 @@ First make a backup copy of your profile files before enabling encryption!연결 - 유효한 IP 범위를 입력하십시오! + 유효한 IP 범위를 입력하세요! 유효한 IPv4 주소를 입력하십시오! - 유효한 MAC 주소를 입력하십시오 (00:F1:23:AB:F2:35 같은)! + 유효한 MAC 주소 (예: 00:F1:23:AB:F2:35)를 입력하세요! 유효한 포트를 입력하십시오 (1 - 65535)! - 유효한 서브넷 마스크를 입력하십시오 (255.255.255.0 같은)! + 유효한 서브넷 마스크 (예: 255.255.255.0)를 입력하세요! - CIDR의 유효한 서브넷 마스크를 입력하십시오 (255.255.255.0 또는 /24 같은)! + 유효한 서브마스크 또는 CIDR (예: 255.255.255.0 또는 /24)을 입력하세요! 필드는 비어있을 수 없습니다! @@ -1496,10 +1541,10 @@ First make a backup copy of your profile files before enabling encryption!유효한 포트 및/또는 포트 범위를 입력하십시오 (1 - 65535)! - 유효한 서브넷을 입력하십시오 (192.168.178.133/26 같은)! + 유효한 서브넷 (예: 192.168.178.133/26)을 입력하세요! - 유효한 웹 사이트를 입력하십시오 (https://example.com/index.html 같은) + 유효한 웹사이트 (예: https://example.com/index.html) )를 입력하세요 녹색 @@ -1534,6 +1579,9 @@ First make a backup copy of your profile files before enabling encryption! 라임 + + Live + 자홍 @@ -1613,10 +1661,10 @@ First make a backup copy of your profile files before enabling encryption!서버 보안 데이터가 잘못되었습니다. - 라이센스 협상에 실패했습니다. + 라이선스 협상에 실패했습니다. - 라이센스 제한 시간이 초과되었습니다. + 라이선스 제한 시간이 초과되었습니다. 로컬 연결이 끊어졌습니다. @@ -1762,9 +1810,6 @@ First make a backup copy of your profile files before enabling encryption! 노랑 - - 25에서 100 사이의 올바른 값을 입력하십시오! - 같은 이름의 프로필이 이미 있습니다! @@ -1793,7 +1838,10 @@ First make a backup copy of your profile files before enabling encryption!Whois를 쿼리할 탭을 추가... - 유효한 도메인을 입력하십시오 ("example.com" 과 같은)! + 유효한 도메인 (예: "example.com ")을 입력하세요! + + + Enter a valid Windows username (e.g., "user", "DOMAIN\user" or "user@domain.com")! Whois 서버는 도메인에 대해 찾을 수 없습니다: "{0}" @@ -1837,9 +1885,6 @@ First make a backup copy of your profile files before enabling encryption! 설정에서 TigerVNC 경로 구성... - - TigerVNC 위치... - TigerVNC 프로세스가 종료되었습니다! @@ -1903,11 +1948,11 @@ First make a backup copy of your profile files before enabling encryption! IPv4 주소 추가 - - 호스트 스레드 + + 최대 동시 호스트 스레드 수 - - 포트 스레드 + + 최대 동시 포트 스레드 수 PowerShell @@ -1924,9 +1969,6 @@ First make a backup copy of your profile files before enabling encryption! 원격 콘솔 - - PowerShell 위치... - 파일 경로 @@ -1964,11 +2006,11 @@ First make a backup copy of your profile files before enabling encryption!백그라운드 작업 - 백그라운드 작업은 설정, 프로필 및 자격 증명을 x분마다 저장합니다. + 백그라운드 작업은 매 x분마다 설정과 프로필을 저장합니다. -값 0은 이 기능을 비활성화합니다. +값이 0이면 이 기능이 비활성화됩니다. -이 값을 변경하려면 응용 프로그램을 다시 시작해야 합니다. +이 값의 변경 사항은 애플리케이션을 재시작한 후에 적용됩니다. x분마다 백그라운드 작업 실행 @@ -1980,15 +2022,15 @@ First make a backup copy of your profile files before enabling encryption!대시보드 - 모든 설정은 나중에 변경할 수 있습니다 + 모든 설정은 나중에 설정에서 변경할 수 있습니다! 공용 IP 주소 확인 - - Network Manager를 사용해 주셔서 감사합니다! + + NETworkManager를 이용해 주셔서 감사합니다! -추가 기능을 제공하기 위해 응용프로그램은 제가 운영하지 않는 인터넷 서비스를 사용합니다. 어떤 자료도 나에게 보내지지 않을 것입니다. +GitHub에 별을 남기거나 기부를 하거나 단순히 다른 사람들과 공유하는 등 개발을 지원하는 것을 고려해 보세요. 여러분의 지원은 프로젝트가 계속 성장할 수 있도록 도와줍니다. 프로그램을 시작할 때 GitHub에서 새 프로그램 버전을 사용할 수 있는지 백그라운드에서 확인합니다. @@ -2009,14 +2051,14 @@ URL: https://api.ipify.org/ 외부 서비스 - - GitHub에 프로젝트를 Star/Fork합니다. + + Star/Fork the Project on GitHub. - - Transifex에서 프로젝트 번역을 도와줍니다. + + Help translate the project on Transifex. - - Twitter로 연락합니다. + + Follow or contact me via X. 연결 @@ -2036,15 +2078,6 @@ URL: https://api.ipify.org/ 네트워크 어댑터 구성 (dhcp, 정적 IP)과 네트워크에 연결되어 있는지 확인합니다. - - 오류 - - - 확인 - - - 경고 - 게이트웨이 IP 주소를 검색할 수 없습니다! @@ -2097,8 +2130,8 @@ URL: https://api.ipify.org/ Use custom IPv4 address API - - http 또는 https를 통해 연결할 수 있는 웹 서비스에 대한 URL이며 응답으로 IP 주소를 반환합니다. + + http 또는 https를 통해 접속할 수 있는 웹 서비스의 URL이며 응답으로 IPv4 주소 (예: "xx.xx.xx.xx")를 반환합니다. "{0}"에서 공용 IP 주소를 구문 분석할 수 없습니다! 다른 서비스를 시도하거나 기본값을 사용합니다... @@ -2172,6 +2205,12 @@ URL: https://api.ipify.org/ 시각적 스타일 + + View only + + + Block keyboard and mouse input to the remote session + 원격 오디오 @@ -2217,24 +2256,39 @@ URL: https://api.ipify.org/ 프로그램 + + 비공개 + + + 공개 + 선택한 사용자 지정 명령이 영구적으로 삭제됩니다. - - 다음 변수를 사용할 수 있습니다: - -$$ipaddress$$ --> IP 주소 -$$hostname$$ --> 호스트이름 - 다시 시작 - - 호스트 이름의 IP 주소를 확인할 수 없습니다! + + 호스트 이름에 대한 IP 주소를 확인할 수 없습니다! Ctrl+Alt+Del + + Task Manager (Ctrl+Shift+Esc) + + + Lock (Win+L) + + + Show Desktop (Win+D) + + + Explorer (Win+E) + + + Run dialog (Win+R) + 키보드 단축키 @@ -2271,8 +2325,8 @@ $$hostname$$ --> 호스트이름 네트워크 변경시 상태 창 표시 - - 창을 표시해야 하는 초 단위 시간 + + 상태 창이 표시되는 시간 (초) WiFi @@ -2298,12 +2352,18 @@ $$hostname$$ --> 호스트이름 채널 + + Channel width + 2.4 GHz 5 GHz + + 2.4 & 5 GHz + 신호 세기 @@ -2343,11 +2403,8 @@ $$hostname$$ --> 호스트이름 시간 초과 - - 문제를 보고하거나 기능 요청을 만듭니다 - - - 문제를 보고하거나 기능 요청을 만듭니다. + + Report an issue or create a feature request. 신호 간격 @@ -2388,12 +2445,39 @@ $$hostname$$ --> 호스트이름 IP 주소를 확인할 수 없습니다: "{0}" + + Notification + + + Show notification popup on status change + + + Play sound on status change + + + Success threshold + + + Number of consecutive successful pings required before a "Host is up" notification is shown. Higher values reduce noise from flapping hosts. + + + Failure threshold + + + Number of consecutive failed pings (timeouts) required before a "Host is down" notification is shown. Higher values reduce noise from flapping hosts. + + + Display duration (seconds) + + + Host is up + + + Host is down + 응용 프로그램이 다시 시작됩니다... - - 다른 폴더 사용 - 파일을 내보낼 수 없습니다! 오류 메시지 참조: "{0}" @@ -2409,8 +2493,8 @@ $$hostname$$ --> 호스트이름 암호화됨 - - GitHub에서 문서를 엽니다. + + Open the documentation. 고객 1 @@ -2439,9 +2523,6 @@ $$hostname$$ --> 호스트이름 프로필 파일 삭제 - - 선택한 프로필 파일이 영구적으로 삭제됩니다. - 이 프로필 파일의 모든 프로필이 영구적으로 삭제됩니다! @@ -2464,7 +2545,7 @@ $$hostname$$ --> 호스트이름 관리자로 재시작 - 네트워크 패킷을 분석하려면 응용 프로그램을 상승된 권한으로 시작해야 합니다! + 네트워크 패킷을 분석하려면 높은 권한이 필요합니다! 캡쳐 @@ -2493,13 +2574,13 @@ $$hostname$$ --> 호스트이름 탐색 프로토콜 - + CDP - + LLDP - + LLDP / CDP @@ -2532,8 +2613,8 @@ $$hostname$$ --> 호스트이름 이 기능에 대해서는 Microsoft.Windows.SDK.Contracts가 필요하지만 이 시스템에서는 사용할 수 없습니다 (예: Windows 서버에서). - - ARP 테이블 + + 인접 테이블 연결 @@ -2590,7 +2671,7 @@ $$hostname$$ --> 호스트이름 TigerVNC - 추적 경로 + 경로 추적 Wake on LAN @@ -2670,133 +2751,46 @@ $$hostname$$ --> 호스트이름 노랑 - - 철색 + + 스틸 - + 일반 - - DNS 조회 - - - HTTP 헤더 - - - IP 스캐너 - - - 네트워크 인터페이스 - - - - - - 핑 모니터 - - - 포트 스캐너 - - - PowerShell - - - PuTTY - - - 원격 데스크탑 - - - TigerVNC - - - 추적 경로 - - - Wake on LAN - - - 웹 콘솔 - - - Whois - - + 응용 프로그램 - + 일반 - + 모양 - + 자동 시작 - - 대시보드 - - - DNS 조회 - - + 일반 - + 단축키 - - HTTP 헤더 - - - IP 스캐너 - - + 언어 - - 핑 모니터 - - - 포트 스캐너 - - - PowerShell - - + 프로필 - - PuTTY - - - 원격 데스크탑 - - + 설정 - - SNMP - - + 상태 - - TigerVNC - - - 추적 경로 - - + 업데이트 - - Wake On LAN - - - Whois - - + @@ -2827,7 +2821,7 @@ $$hostname$$ --> 호스트이름 SSH 로그 - SSH 및 Raw 로그 + SSH 및 원시 로그 유효한 파일 이름을 입력하십시오! @@ -2889,13 +2883,17 @@ $$hostname$$ --> 호스트이름 SSID - - 프로필을 불러올 수 없습니다! + + 프로필 파일을 로드할 수 없습니다! - - 업데이트 후 이러한 문제가 발생한 경우 프로파일을 최신 버전으로 마이그레이션해야 할 수 있습니다. "마이그레이션"을 클릭하면 마이그레이션 스크립트가 포함된 PowerShell 창이 열립니다. 경로를 확인하고 Enter 키를 누릅니다. + + 프로필 파일을 로드할 수 없으며 손상되었을 수 있습니다. 백업에서 파일을 복원하거나 삭제할 수 있습니다. + +예기치 않게 또는 업데이트 후에 이런 일이 발생하면 GitHub에서 오류를 보고해 주시기 바랍니다. + -그렇지 않으면 프로필이 손상되어 GitHub에 문제를 보고하고자 할 수 있습니다. +오류 메시지: +"{0}" 그룹 편집... @@ -2933,25 +2931,12 @@ $$hostname$$ --> 호스트이름 병합 - - 대상 폴더에 파일이 이미 있습니다. 병합을 클릭하면 현재 프로파일이 폴더에 복사됩니다. - - - 대상 폴더에서 프로필을 덮어쓰시겠습니까? - -"덮어쓰기"는 프로필 파일을 대상 폴더에 복사하고 기존 프로필 파일을 덮어씁니다. -"병합"은 프로필 파일을 대상 폴더에 복사하지만 종료 프로필 파일은 덮어쓰지 않습니다. -"다른 폴더 사용"은 대상 폴더에 있는 기존 프로필 파일을 사용합니다. - 기타 사용 이동 - - 프로필 파일이 선택한 대상 폴더로 이동합니다. - {0}에 마지막 검색 @@ -2980,7 +2965,7 @@ $$hostname$$ --> 호스트이름 C# 라이브러리는 복잡한 네트워크, IP, IPv4, IPv6, NetMask, CIDR, 서브넷, 서브넷, 슈퍼넷 및 .NET 개발자를 위한 슈퍼넷팅 계산을 처리합니다. - 간편하고 유연하며 대화형 강력한 .Net용 차트, 지도 및 게이지 + Beautiful, interactive charts, maps, and gauges. WPF에 대한 부하 지시기 모음 @@ -3009,23 +2994,26 @@ $$hostname$$ --> 호스트이름 포트 43을 통해 whois.iana.org에서 TLD의 서버를 쿼리하는 데 사용되는 iana.org의 최상위 도메인 목록 + + GeoJSON conversion of Natural Earth vector map data (CC0-1.0). + - linuxnet.ca에서 IEEE OUI 데이터를 삭제했습니다. + ieee.org의 OUI 데이터입니다. iana.org의 서비스 이름 및 전송 프로토콜 포트 번호 레지스트리 - Apache 라이센스 2.0 + Apache 라이선스 2.0 BSD-2-조항 - MIT 라이센스 + MIT 라이선스 - 라이센스 취소 + 라이선스 취소 C#/WinRT는 C# 언어에 대한 패키지 WinRT 예상 지원을 제공합니다. @@ -3040,7 +3028,7 @@ $$hostname$$ --> 호스트이름 WPF의 XAML 동작을 사용하여 앱에 상호 작용을 쉽게 추가할 수 있습니다. - Microsoft WebView2 라이센스 + Microsoft WebView2 라이선스 현재 프로파일 파일은 암호화되지 않고 암호가 디스크에 암호화되지 않은 상태로 저장됩니다! @@ -3060,10 +3048,10 @@ $$hostname$$ --> 호스트이름 Enter a valid IPv6 address! - Public accessible IPv4 address. + ICMP를 통해 공용 IPv4 주소에 도달할 수 있습니다. - Public accessible IPv6 address. + ICMP를 통해 공용 IPv6 주소에 도달할 수 있습니다. Public IPv4 address @@ -3140,7 +3128,1366 @@ $$hostname$$ --> 호스트이름 선택한 프로필은 영구적으로 삭제됩니다. - - 프로필을 추가, 변경 또는 삭제하려면 프로필 파일의 잠금을 해제하십시오! + + 사용자 지정 테마 사용 + + + 사용자 지정 테마 + + + 설정을 재설정하시겠습니까? + + + 설정이 재설정되었습니다! + + + 인스턴스 ID + + + 로컬 연결 + + + 로컬 인터페이스 + + + log4net은 프로그래머가 다양한 출력 대상에 로그 문장을 출력하는 데 도움이 되는 도구입니다. + + + 사용함 + + + 지역 + + + 동기화할 프로필 및 지역 + + + 기본 프로필 + + + 기본 지역 + + + 그룹 이름은 "{0}"로 시작할 수 없습니다! + + + 사전 릴리스 확인 + + + 동기화가 비활성화되었습니다! + + + 명령 + + + PowerShell 콘솔에 테마 적용 + + + PowerShell 콘솔의 색상은 설정 > 일반 > 모양에서 응용 프로그램 테마로 변경할 수 있습니다. + + + If you enable this option, the default PowerShell console settings in the registry under HKCU:\Console are overridden so that the PowerShell console window matches the application theme. This is a global system setting that may affect the appearance of the normal PowerShell window. + +Only the PowerShell consoles configured in the PowerShell settings are modified. Both Windows PowerShell and PWSH (PowerShell 7 and higher) are supported. + +Click in the upper right corner on the help / documentation button (left of the minimize button) or navigate to https://borntoberoot.net/NETworkManager/Documentation/Settings/Appearance for more details. Here are the values documented which will be adjusted. + +If the option is disabled again, the values are no longer modified. However, the original values are NOT restored. + + + 입력은 ";"로 끝날 수 없습니다! + + + 입력 내용에 텍스트가 없습니다! + + + 비트 계산기 + + + 비트 계산기 + + + 표기법 + + + 입력 + + + 단위 + + + 비트 + + + 기가비트 + + + 기가바이트 + + + 킬로비트 + + + 킬로바이트 + + + 메가비트 + + + 메가바이트 + + + 페타비트 + + + 페타바이트 + + + 테라비트 + + + 테라바이트 + + + 계산할 숫자를 입력하고 단위를 선택하세요... + + + 네트워크 + + + 프록시 + + + 이 호스트의 IP 주소를 확인합니다 (IPv4가 권장됨) + + + PowerShell의 유효한 경로는 "pwsh.exe" 또는 "powershell.exe"로 끝나야 합니다! + + + PuTTY의 유효한 경로는 "PuTTY.exe"로 끝나야 합니다! + + + TigerVNC의 유효한 경로는 "vncviewer-*.exe" 또는 "vncviewer64-*.exe"로 끝나야 합니다! + + + SNTP 조회 + + + .NET Framework/.NET Core 앱 런타임 구성 요소와 종속성을 하위 디렉터리로 옮겨서 보기 좋게 만듭니다. + + + SNTP 조회를 수행하려면 탭을 추가하세요... + + + SNTP 서버 + + + http 또는 https를 통해 접속할 수 있는 웹 서비스의 URL이며 응답으로 IPv6 주소 (예: "xxxx:xx:xxx::xx")를 반환합니다. + + + IP 엔드포인트 + + + 로컬 종료 시간 + + + 로컬 시작 시간 + + + 네트워크 시간 + + + 오프셋 + + + 왕복 지연 + + + 서버 + + + SNTP 조회 + + + SNTP 서버 추가 + + + SNTP 서버 삭제 + + + 선택한 SNTP 서버가 영구적으로 삭제됩니다. + + + SNTP 서버 편집 + + + 이 이름을 가진 SNTP 서버가 이미 존재합니다! + + + 유효한 호스트 이름 (예: "server-01" 또는 "example.com ") 또는 유효한 IP 주소 (예: 192.168.178.1)를 입력하세요! + + + 서버 + + + 마스터 비밀번호를 입력하여 프로필 파일을 잠금 해제합니다: + + + 프로필 파일 잠금 해제 + + + 시간 초과 + + + 호스트키 + + + 설정이 재설정되고 나중에 응용 프로그램 재시작됩니다! + + + 설정이 재설정되었습니다! + + + 핑 상태 + + + 스레드풀 추가 최소 스레드 + + + 이 설정은 요청 시 응용 프로그램의 스레드풀에서 생성될 최소 스레드 수를 지정합니다. 이렇게 하면 IP 스캐너나 포트 스캐너와 같은 성능이 향상될 수 있습니다. + +이 값은 기본 최소 스레드 (CPU 스레드 수)에 추가됩니다. 값 0은 기본 설정을 남깁니다. 이 값이 스레드풀의 기본 최대값보다 높으면 이 값이 사용됩니다. + +값이 너무 높으면 성능 문제가 발생할 수 있습니다. + +이 값의 변경 사항은 응용 프로그램이 재시작된 후에 적용됩니다. 값이 성공적으로 설정되었는지 여부는 로그 파일의 %LocalAppData%\\NETWORKManager\\NETWORKManager.log에서 확인할 수 있습니다 + + + 이 설정은 호스트/포트 스캔당 동시에 실행되는 스레드의 최대 수만 변경합니다. 응용 프로그램의 (최소) 스레드를 조정하려면 설정 > 일반 > 일반으로 이동합니다. + + + 포트 상태 + + + 핑 세부 정보 + + + 열린 포트를 찾을 수 없습니다! + + + 포트 검색이 비활성화되었습니다! + + + 포트 검색 + + + "{0}" 응용 프로그램을 찾을 수 없습니다. 설정에 응용 프로그램이 숨겨져 있었던 것은 아닐까요? + + + 상태 창 + + + 주소 표시줄 표시 + + + 이 설정을 활성화하는 것은 권장되지 않습니다. 응용 프로그램의 여러 인스턴스가 동일한 설정과 프로필 파일을 공유합니다. 마지막으로 닫히는 인스턴스는 다른 인스턴스의 변경 사항을 덮어쓸 수 있습니다. + + + 로컬 주소 우회 + + + 게이트웨이 서버 사용 + + + 로그인 방법 + + + 게이트웨이 서버 + + + 서버 이름 + + + 원격 컴퓨터와 게이트웨이 자격 증명 공유 + + + 나중에 선택하도록 허용 + + + 비즈니스용 스마트 카드 또는 Windows Hello + + + 비밀번호 요청 (NTLM) + + + 게이트웨이 자격 증명 사용 + + + 원격 데스크톱 게이트웨이 서버를 일시적으로 사용할 수 없기 때문에 컴퓨터가 원격 컴퓨터에 연결할 수 없습니다. 나중에 다시 연결하거나 네트워크 관리자에게 도움을 요청하세요. + + + 다음 이유 중 하나로 인해 컴퓨터가 원격 컴퓨터에 연결할 수 없습니다: 1) 요청한 원격 데스크톱 게이트웨이 서버 주소와 서버 SSL 인증서 주체 이름이 일치하지 않습니다. 2) 인증서가 만료되었거나 취소되었습니다. 3) 인증서 루트 권한이 인증서를 신뢰하지 않습니다. 네트워크 관리자에게 문의하여 도움을 요청하세요. + + + 이 컴퓨터는 RD 게이트웨이의 신원을 확인할 수 없습니다. 식별할 수 없는 서버에 연결하는 것은 안전하지 않습니다. 네트워크 관리자에게 문의하여 도움을 요청하세요. + + + 요청한 원격 데스크톱 게이트웨이 서버 주소와 인증서 주체 이름이 일치하지 않아 컴퓨터가 원격 컴퓨터에 연결할 수 없습니다. 네트워크 관리자에게 문의하여 도움을 요청하세요. + + + 원격 데스크톱 게이트웨이 서버의 인증서가 만료되었거나 취소되었기 때문에 컴퓨터가 원격 컴퓨터에 연결할 수 없습니다. 네트워크 관리자에게 문의하여 도움을 요청하세요. + + + 원격 데스크톱 게이트웨이 서버로 데이터를 전송하는 동안 오류가 발생했습니다. 서버를 일시적으로 사용할 수 없거나 네트워크 연결이 중단되었습니다. 나중에 다시 시도하거나 네트워크 관리자에게 도움을 요청하세요. + + + 원격 데스크톱 게이트웨이 서버에서 데이터를 수신하는 동안 오류가 발생했습니다. 서버를 일시적으로 사용할 수 없거나 네트워크 연결이 중단되었습니다. 나중에 다시 시도하거나 네트워크 관리자에게 도움을 요청하세요. + + + 원격 데스크톱 게이트웨이 서버 주소가 연결할 수 없거나 잘못되어 컴퓨터가 원격 컴퓨터에 연결할 수 없습니다. 올바른 원격 데스크톱 게이트웨이 서버 주소를 입력합니다. + + + 원격 데스크톱 게이트웨이 서버의 서버 리소스가 부족하여 일시적으로 사용할 수 없기 때문에 컴퓨터가 원격 컴퓨터에 연결할 수 없습니다. 나중에 다시 연결하거나 네트워크 관리자에게 도움을 요청하세요. + + + 원격 데스크톱 게이트웨이 서버가 연결을 종료했습니다. 나중에 다시 연결해 보거나 네트워크 관리자에게 도움을 요청하세요. + + + 원격 데스크톱 게이트웨이 서버 관리자가 연결을 종료했습니다. 나중에 다시 연결해 보거나 네트워크 관리자에게 도움을 요청하세요. + + + 원격 데스크톱이 원격 컴퓨터에 연결할 수 없는 이유 중 하나입니다: 1) 사용자 계정이 RD 게이트웨이의 권한 목록에 없습니다 2) 원격 컴퓨터를 NetBIOS 형식(예: computer1)으로 지정했을 수도 있지만 RD 게이트웨이는 FQDN 또는 IP 주소 형식 (예: computer1.fabrikam.com 또는 157.60.0.1)을 기대하고 있습니다. 네트워크 관리자에게 문의하여 도움을 요청하세요. + + + 원격 데스크톱이 원격 컴퓨터에 연결할 수 없는 이유 중 하나입니다: 1) 사용자 계정이 RD 게이트웨이에 액세스할 권한이 없습니다. 2) 컴퓨터가 RD 게이트웨이에 액세스할 권한이 없습니다. 3) 호환되지 않는 인증 방법을 사용 중입니다(예: RD 게이트웨이가 스마트 카드를 기대하고 있지만 비밀번호를 제공한 경우). 네트워크 관리자에게 문의하여 도움을 요청하세요. + + + 네트워크 관리자가 이 RD 게이트웨이 서버에 대한 액세스를 제한했기 때문에 컴퓨터가 원격 컴퓨터에 연결할 수 없습니다. 네트워크 관리자에게 문의하여 도움을 요청하세요. + + + 웹 프록시 서버에 인증이 필요하기 때문에 컴퓨터가 원격 컴퓨터에 연결할 수 없습니다. 웹 프록시 서버를 통해 RD 게이트웨이 서버로 인증되지 않은 트래픽을 허용하려면 네트워크 관리자에게 문의하세요. + + + 원격 데스크톱 게이트웨이 서버가 허용된 최대 연결 수에 도달했기 때문에 컴퓨터가 원격 컴퓨터에 연결할 수 없습니다. 나중에 다시 연결해 보거나 네트워크 관리자에게 도움을 요청하세요. + + + 원격 데스크톱 게이트웨이 서버가 요청을 지원하지 않기 때문에 컴퓨터가 원격 컴퓨터에 연결할 수 없습니다. 네트워크 관리자에게 문의하여 도움을 요청하세요. + + + 클라이언트가 원격 데스크톱 게이트웨이의 기능 중 하나를 지원하지 않기 때문에 컴퓨터가 원격 컴퓨터에 연결할 수 없습니다. 네트워크 관리자에게 문의하여 도움을 요청하세요. + + + 원격 데스크톱 게이트웨이 서버와 이 컴퓨터가 호환되지 않아 컴퓨터가 원격 컴퓨터에 연결할 수 없습니다. 네트워크 관리자에게 문의하여 도움을 요청하세요. + + + 원격 데스크톱 게이트웨이 서버에서 사용하도록 인증서가 구성되어 있지 않아 컴퓨터가 원격 컴퓨터에 연결할 수 없습니다. 네트워크 관리자에게 문의하여 도움을 요청하세요. + + + 컴퓨터 관리자가 연결하려는 RD 게이트웨이 서버가 허용되지 않아 컴퓨터가 원격 컴퓨터에 연결할 수 없습니다. 관리자인 경우 이 원격 데스크톱 게이트웨이 서버 이름을 컴퓨터의 신뢰할 수 있는 원격 데스크톱 게이트웨이 서버 목록에 추가한 다음 다시 연결해 보세요. + + + 컴퓨터나 장치가 네트워크 관리자가 설정한 네트워크 접근 보호 요구 사항을 충족하지 못했기 때문에 다음과 같은 이유로 원격 컴퓨터에 연결할 수 없습니다: 1) 원격 데스크톱 게이트웨이 서버 이름과 서버의 공용 키 인증서 주체 이름이 일치하지 않습니다. 2) 인증서가 만료되었거나 취소되었습니다. 3) 인증서 루트 권한이 인증서를 신뢰하지 않습니다. 4) 인증서 키 확장이 암호화를 지원하지 않습니다. 5) 컴퓨터가 인증서 해지 목록을 확인할 수 없습니다. 네트워크 관리자에게 문의하여 도움을 요청하세요. + + + 스마트 카드 자격 증명 대신 원격 데스크톱 게이트웨이 서버에 인증하려면 사용자 이름과 비밀번호가 필요하므로 컴퓨터가 원격 컴퓨터에 연결할 수 없습니다. + + + 원격 데스크톱 게이트웨이 서버에 인증하려면 사용자 이름과 비밀번호 대신 스마트 카드 자격 증명이 필요하므로 컴퓨터가 원격 컴퓨터에 연결할 수 없습니다. + + + 잘못된 쿠키가 원격 데스크톱 게이트웨이 서버로 전송되어 컴퓨터가 원격 컴퓨터에 연결할 수 없습니다. 네트워크 관리자에게 도움을 요청하세요. + + + 쿠키가 원격 데스크톱 게이트웨이 서버에서 거부되어 컴퓨터가 원격 컴퓨터에 연결할 수 없습니다. 네트워크 관리자에게 도움을 요청하세요. + + + 원격 데스크톱 게이트웨이 서버가 시도한 인증 방법과 다른 인증 방법을 기대하고 있기 때문에 컴퓨터가 원격 컴퓨터에 연결할 수 없습니다. 네트워크 관리자에게 문의하여 도움을 요청하세요. + + + 주기적인 사용자 인증에 실패하여 RD 게이트웨이 연결이 종료되었습니다. 올바른 사용자 이름과 비밀번호로 다시 연결해 보세요. 재연결에 실패하면 네트워크 관리자에게 연락하여 추가 지원을 요청하세요. + + + 주기적인 사용자 승인에 실패하여 RD 게이트웨이 연결이 종료되었습니다. 올바른 사용자 이름과 비밀번호로 다시 연결해 보세요. 재연결에 실패하면 네트워크 관리자에게 연락하여 추가 지원을 요청하세요. + + + 원격 데스크톱 게이트웨이와 원격 컴퓨터가 정책을 교환할 수 없기 때문에 컴퓨터가 원격 컴퓨터에 연결할 수 없습니다. 이는 다음과 같은 이유 중 하나로 인해 발생할 수 있습니다: 1. 원격 컴퓨터가 원격 데스크톱 게이트웨이와 정책을 교환할 수 없습니다. 2. 원격 컴퓨터의 구성이 새 연결을 허용하지 않습니다. 3. 원격 데스크톱 게이트웨이와 원격 컴퓨터 간의 연결이 종료되었습니다. 네트워크 관리자에게 문의하여 도움을 요청하세요. + + + 주기적인 사용자 승인에 실패하여 RD 게이트웨이 연결이 종료되었습니다. 컴퓨터나 장치가 네트워크 관리자가 설정한 네트워크 액세스 보호(NAP) 요구 사항을 통과하지 못했습니다. 도움을 받으려면 네트워크 관리자에게 문의하세요. + + + 연결됨 + + + WiFi 어댑터 "{0}" 을 스캔하는 동안 오류가 발생했습니다: "{1}" + + + 연결... + + + {0} 연결 끊김! + + + {0}에 연결 + + + WPS + + + 자동으로 연결 + + + 사전 공유 키 + + + {0}에 연결... + + + {0} ({1})에 연결할 수 없습니다! + + + {0}에 성공적으로 연결되었습니다!! + + + 네트워크에 대한 액세스가 취소되었습니다 + + + 잘못된 자격 증명 + + + 네트워크를 사용할 수 없습니다 + + + 성공 + + + 연결 시도가 시간 초과되었습니다 + + + -/- + + + 인증 프로토콜이 지원되지 않습니다! + + + WPS 확인 중... + + + OID 프로필 열기... + + + MIB + + + OID 프로필 + + + OID 프로필 선택 + + + OID 프로필 추가 + + + OID 프로필 삭제 + + + 선택한 OID 프로필은 영구적으로 삭제됩니다. + + + OID 프로필 편집 + + + 비밀번호 입력... + + + 탭 추가 + + + (프로필에서) + + + 새 서브넷 마스크 + + + 서버 추가 + + + SNTP 서버 + + + 이 페이지의 설정에 오류가 있습니다. 저장할 수 있도록 수정하세요. + + + 연결에 사용할 SSH 호스트키입니다 (예: "71:b8:f2:6e..."). 모드가 "SSH"인 경우에만 사용할 수 있습니다. + + + 개인 키 파일의 전체 경로입니다 (예: "C:\\Users\\BornToBeRoot\\SSH\\private_key.ppk"). 모드가 "SSH"인 경우에만 사용할 수 있습니다. + + + PuTTY 세션에 전달될 사용자 이름입니다. 모드가 "SSH", "Telnet" 또는 "Rlogin"일 때만 사용할 수 있습니다. + + + ASN + + + AS 이름 + + + 도시 + + + 대륙 + + + 국가 + + + 통화 + + + 지역 + + + DNS 해결사 + + + EDNS + + + 지리적 위치 + + + 호스팅 + + + IP 지리적 위치 + + + ISP + + + 위도 + + + 경도 + + + 모바일 + + + 조직 + + + PTR 레코드 + + + 시간대 + + + 우편번호 + + + IP 지리적 위치 API - 빠르고, 정확하며, 신뢰할 수 있음 + + + DNS 확인 확인 + + + IP 지리적 위치 확인 + + + Show map + + + DNS 해결기는 ip-api.com 을 통해 결정됩니다. + +URL: https://edns.ip-api.com/ + + + IP 지리적 위치는 ip-api.com 을 통해 확인할 수 있습니다. + +URL: http://ip-api.com/ + + + 추가 기능을 제공하기 위해 제가 운영하지 않는 타사 서비스가 사용됩니다. 아래에서 선택을 해제할 수 있습니다. 어떠한 데이터도 저에게 전송되지 않습니다. + + + DNS 해결기를 확인하는 중... + + + IP 위치 확인 중... + + + 네트워크 연결을 확인한 후 몇 초 후에 다시 시도해 보세요. + + + ip-api.com 요금 제한에 도달했습니다 (네트워크에서 요청이 너무 많습니다)! +몇 초 후에 다시 시도해 보세요. + + + HTTP 상태 코드 + + + 스틸 + + + 속도 제한에 도달했습니다! {0} 초 후에 다시 시도하세요... + + + 일반 + + + BSSID + + + 연결 가능한 호스트를 찾을 수 없습니다! + + + 응용 프로그램 + + + 실험 기능을 활성화하여 새 기능을 테스트합니다. 아직 완료되지 않았고 버그가 포함되어 있으며 응용 프로그램이 크래시될 수 있으며 출시될 때까지 다시 변경될 수 있습니다. + + + 실험적 기능 + + + 실험적 + + + Run command... + + + IP 지리적 위치 + + + IP 지리적 위치를 쿼리하기 위해 탭을 추가합니다... + + + whois를 쿼리하려면 도메인을 입력하세요... + + + IP 지리적 위치를 쿼리할 호스트 입력... + + + 알 수 없는 사용자 이름입니다. + + + 인증 실패 (잘못된 비밀번호, 커뮤니티 또는 키)입니다. + + + 작업은 오류 없이 성공적으로 완료되었습니다. + + + 요청에 대한 응답이 너무 커서 단일 응답에 적합하지 않았습니다! + + + 요청한 OID를 찾을 수 없습니다! + + + 읽기-쓰기 또는 쓰기 전용 객체가 일관되지 않은 값으로 설정되었습니다! + + + 요청한 OID가 존재하지 않으며 쓸 수 없습니다! + + + 특정 메시지를 사용할 수 없는 오류가 발생했습니다! + + + 요청된 객체는 수정할 수 없습니다! + + + 객체가 호환되지 않는 데이터 유형으로 설정되었습니다! + + + 객체에 할당된 값이 최대 길이를 초과합니다! + + + 객체에 사용된 인코딩이 잘못되었습니다! + + + 객체에 할당된 값은 유효한 선택이 아닙니다! + + + 요청한 객체가 존재하지 않으며 생성할 수 없습니다! + + + MIB 변수가 현재 일관되지 않은 상태에 있으며 수정할 수 없습니다! + + + 요청된 작업을 수행할 수 있는 시스템 리소스가 없습니다! + + + 설정 작업 중에 오류가 발생했습니다! + + + 설정 작업이 실패하여 이전 변경 사항을 롤백할 수 없습니다! + + + 인증에 실패했습니다. 커뮤니티 문자열을 확인해 주세요! + + + 요청한 객체는 쓸 수 없으며 수정할 수 없습니다! + + + 객체의 상태가 일관되지 않아 설정 작업을 방해합니다! + + + 모두 닫기 + + + 호스트 보기 확장 + + + Expand map view + + + 다른 호스트를 추가하는 동안에는 호스트를 설정할 수 없습니다. 프로세스가 완료될 때까지 기다렸다가 다시 시도해 주세요. + + + 일치하는 명령이 없습니다! + + + 원격 호스트 이름 + + + 프로세스 ID + + + 프로세스 경로 + + + 프로세스 이름 + + + NetBIOS + + + 컴퓨터 이름 + + + 오류 + + + 확인 + + + 경고 + + + 그룹 / 도메인 + + + NetBIOS에 도달 가능 + + + NetBIOS 검색 + + + NetBIOS 검색이 비활성화되었습니다! + + + 호스트 이름 해결이 비활성화되었습니다! + + + MAC 주소 해결이 비활성화되었습니다! + + + 그룹 닫기 + + + Run command... (Ctrl+Shift+P) + + + 프로필 파일 + + + 설정 열기... + + + 검색을 확장하고 열기... + + + Windows 11 24H2부터는 Wi-Fi 어댑터에 대한 액세스를 허용해야 합니다. + +Windows 설정 > 개인정보 보호 및 보안 > 위치를 열고 데스크톱 앱 / NETworkManager에 대한 액세스를 활성화한 다음 응용 프로그램을 재시작하세요. + + + 응용 프로그램을 끌어서 놓기하여 재정렬합니다. +더 많은 옵션을 보려면 마우스 오른쪽 버튼을 클릭하세요. + + + 기본값 복원 + + + WPF를 위한 사용하기 쉬운 끌어서 놓기 프레임워크입니다. + + + BSD 3조항 + + + 기본 설정 + + + Nextcloud 및 Traefik을 사용하여 도커를 실행하는 우분투 서버... + + + AWS에서 실행 중인 리눅스 서버... + + + 6 GHz + + + Support this project with a donation. + + + 문서 열기 + + + 기부 + + + 프로필 파일 + + + 호스트 파일 편집기 + + + 호스트 파일 편집기 + + + 읽기 전용 모드입니다. 호스트 파일을 수정하려면 권한 상승이 필요합니다! + + + 호스트 파일 열기 + + + 주석 + + + 사용 안 함 + + + 항목 편집 + + + 항목 편집... + + + 항목 활성화 + + + 항목 비활성화 + + + 새로 고치는 중... + + + {0}에서 다시 로드됨 + + + 호스트 파일을 로드하지 못했습니다: {0} + + + {0} 초 후에 다시 시도... + + + 새로운 소식은? + + + 변경 로그 + + + {0}로 업그레이드됨 + + + 이번 릴리스에는 새로운 기능, 개선 사항 및 버그 수정 사항이 포함되어 있습니다. 자세한 내용은 Changelog에서 확인하세요! + + + 항목 + + + 선택한 항목이 영구적으로 삭제됩니다: + +{0} {1} {2} + + + 기본 DNS 서버 + + + 유효한 호스트 이름 (예: "server-01" 또는 "example.com ")을 입력하세요! 여러 호스트 이름을 공백으로 구분할 수 있습니다. + + + "hosts" 파일을 읽을 수 없습니다! 자세한 내용은 로그 파일을 참조하세요. + + + "hosts" 파일을 쓸 수 없습니다. 자세한 내용은 로그 파일을 참조하세요. + + + "hosts" 파일에서 항목을 찾을 수 없습니다! 파일이 수정되었을 수도 있습니다. + + + "hosts" 파일의 백업을 만들 수 없습니다! 자세한 내용은 로그 파일을 참조하세요. + + + 상태 표시줄 표시 + + + 링크를 탐색할 때 WebView의 왼쪽 하단에 상태 표시줄을 표시합니다. + + + 자격 증명 저장 + + + 성공적으로 로그인한 후 자격 증명을 저장하는 대화 상자를 표시합니다. + + + 브라우징 데이터 삭제 + + + 현재 WebView2 프로필의 브라우징 데이터 (기록, 쿠키, 캐시, 자격 증명 등)를 영구적으로 삭제합니다. + + + 브라우징 데이터 + + + 브라우징 데이터가 성공적으로 삭제되었습니다! + + + 브라우징 데이터를 삭제하는 동안 오류가 발생했습니다. 이 문제를 GitHub에 자유롭게 신고해 주세요. + + + 제품 + + + 태그 추가 + + + 필터 적용 + + + 필터 프로필... + + + 태그로 필터링 + + + 태그를 찾을 수 없습니다! + + + 일치 + + + 모든 + + + 그룹 추가... + + + 모두 확장 + + + 모두 축소 + + + 사용자 지정 테마를 사용하여 응용 프로그램의 모양을 개인화합니다. "프로그램 폴더 > 테마" 디렉터리에서 테마를 편집하거나 추가할 수 있습니다. 자세한 내용은 설명서를 참조하세요. + + + 관리자 (콘솔) 세션 + + + 프로필 파일 "{0}"이 영구적으로 삭제됩니다. + + + 암호화를 활성화하시겠습니까? + + + 호스트, IP 주소, URL, 저장된 자격 증명과 같은 민감한 데이터를 보호하기 위해 프로필 파일 암호화를 활성화하시겠습니까? + +나중에 언제든지 프로필 파일을 마우스 오른쪽 버튼으로 클릭하여 암호화 설정을 관리하여 암호화를 활성화 또는 비활성화할 수 있습니다. +"취소"를 클릭하면 프로필 파일은 암호화되지 않은 상태로 유지됩니다. + + + A restart is required to apply changes such as language settings. + + + 지정된 DNS 서버를 분석하거나 확인할 수 없습니다. + + + "{0}"을 구문 분석할 수 없습니다.. + + + 최대 백업 수 + + + 일일 백업 생성 + + + 가장 오래된 백업이 삭제되기 전에 유지되는 백업 수입니다. + + + 이 설정은 관리자가 관리합니다. + + + 기본 위치 복원 + + + 복원 + + + 기본 위치로 복원하시겠습니까? + + + 기본 설정 위치가 복원되고 이후에 응용 프로그램이 재시작됩니다. + +필요한 경우 "setings.json" 파일을 "{0}"에서 "{1}"로 복사하여 이전 설정을 마이그레이션할 수 있습니다. 이를 위해 응용 프로그램을 닫아야 설정이 덮어쓰이지 않습니다. + + + 위치를 변경하시겠습니까? + + + 설정 위치가 변경되고 이후 응용 프로그램이 재시작됩니다.. + +필요한 경우 "setings.json" 파일을 "{0}"에서 "{1}"로 복사하여 이전 설정을 마이그레이션할 수 있습니다. 이를 위해 응용 프로그램을 닫아야 설정이 덮어쓰이지 않습니다. + + + 유효한 폴더 경로를 입력하세요! + + + 프로필 위치가 변경되고 이후 응용 프로그램이 재시작됩니다 + +필요한 경우 프로필 파일을 “{0}”에서 “{1}”로 복사하여 기존 프로필을 마이그레이션할 수 있습니다. 프로필을 덮어쓰지 않으려면 응용 프로그램을 닫아야 합니다. + + + 기본 프로필 위치가 복원되고 이후에 애플리케이션이 재시작됩니다. + +필요한 경우 프로필 파일을 “{0}”에서 “{1}”로 복사하여 기존 프로필을 마이그레이션할 수 있습니다. 프로필을 덮어쓰지 않으려면 애플리케이션을 닫아야 합니다. + + + 네트워크 연결 + + + 네트워크 상태 + + + Active Directory import failed. + + + Options + + + + Uses your current Windows credentials to read from Active Directory. The account must be allowed to enumerate computer objects under the search base (subtree). + + + Search base (DN) + + + Additional LDAP filter + + + Filter must be a valid LDAP expression starting with '(' and ending with ')'. + + + Search base must be a valid LDAP distinguished name (e.g. DC=example,DC=com). + + + Imported from Active Directory on {0} + + + No computers found for the given search base and filter. + + + Searching Active Directory... + + + If your computer is not joined to the domain, specify the domain controller (hostname or IP) and use custom credentials. + + + Server (optional) + + + Port (optional) + + + Use SSL (LDAPS) + + + Use current Windows credentials + + + Use these credentials + + + Advanced + + + Select all + + + Deselect all + + + Enable for + + + Skip already imported + + + {0} · {1} result(s) + + + {0} profile(s) imported. +{1} duplicate entries skipped. +{2} without a host skipped. + + + Active Directory + + + CSV file + + + CSV file + + + Import profiles from CSV file + + + Imported from CSV file on {0} + + + No entries were found in the CSV file. + + + Expected CSV format — one profile per line: + + + A header row and the delimiter (semicolon, comma or tab) are detected automatically. The description column is optional. Entries without a host cannot be imported. + + + Import results + + + New + + + Imported + + + No host + + + Exclude disabled accounts + + + Import computers from Active Directory + + + Import computers from Active Directory... + + + Import profiles + + + Source + + + Active Directory + + + Profile group + + + Existing or new group name + + + 방화벽 + + + 방화벽 규칙 + + + Windows 방화벽 설정 + + + 방향 + + + 인바운드 + + + 아웃바운드 + + + 동작 + + + 허용 + + + 차단 + + + 네트워크 프로필 + + + 네트워크 프로필 + + + 인터페이스 유형 + + + 방화벽 규칙을 불러오지 못했습니다. {0} + + + 선택한 방화벽 규칙이 영구적으로 삭제되었습니다: + +{0} + + + 모두 + + + TCP + + + UDP + + + ICMPv4 + + + ICMPv6 + + + HOPOPT + + + GRE + + + IPv6 + + + IPv6 경로 + + + IPv6 분할 + + + IPv6-NoNxt + + + IPv6 옵션 + + + VRRP + + + PGM + + + L2TP + + + 모두 + + + 유선 + + + 무선 + + + 원격 접속 + + + 읽기 전용 모드입니다. 방화벽 규칙을 수정하려면 관리자 권한이 필요합니다! + + + 인바운드 + + + 아웃바운드 + + + 차단 + + + 허용 + + + 로컬 포트 + + + 원격 포트 + + + 로컬 주소 + + + 원격 주소 + + + 유효한 IP 주소, 서브넷 (예: 10.0.0.0/8), 범위 (예: 10.0.0.1-10.0.0.10) 또는 키워드(Any, LocalSubnet, DNS, DHCP, WINS, DefaultGateway, Internet, Intranet, IntranetRemoteAccess, PlayToDevice, CaptivePortal)를 입력하세요. + + + 규칙 추가 + + + 규칙 추가... + + + 규칙 편집 + + + 규칙 편집... + + + 규칙 삭제 + + + 규칙 사용함 + + + 규칙 사용 안 함 + + + Import profiles... + + + Speed Test + + + Run speed test + + + Fetching metadata... + + + Measuring latency... + + + Measuring download speed... + + + Measuring upload speed... + + + Measure download and upload speeds, latency, and jitter with speed.cloudflare.com. +Cloudflare may log your IP address and network information. See Cloudflare's privacy policy for details. + + + Latency + + + Jitter + + + Speed test service used to measure download speed, upload speed, latency, and jitter. + + + Stop diff --git a/Source/NETworkManager.Localization/Resources/Strings.lb-LU.resx b/Source/NETworkManager.Localization/Resources/Strings.lb-LU.resx new file mode 100644 index 0000000000..c0171882ce --- /dev/null +++ b/Source/NETworkManager.Localization/Resources/Strings.lb-LU.resx @@ -0,0 +1,4496 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Iwwert + + + Akzent + + + Umeldungsdaten bäifügen + + + Entrée bäifügen + + + Profil bäifügen + + + Sidd Dir sécher? + + + ARP + + + Neighbor Table + + + Schreifgeschützte Modus. D'Ännere vun der Neighbor Table erfuerdert erhéicht Rechter! + + + Net erreechbar + + + Onvollstänneg + + + Iwwerpréiwung + + + Verzögerung + + + Veroudert + + + Erreechbar + + + Permanent + + + Authentifizéierung + + + Autostart + + + Rechner + + + Kommandozeilenargumenter + + + Konfiguréieren + + + Bestätegen + + + Verbannen + + + Verbannen als + + + Profil kopéieren + + + Umeldungsdaten + + + Daten + + + Standardapplikatioun + + + Umeldungsdaten läschen + + + Profil läschen + + + Zil + + + Detailer + + + Getrennt + + + Bildschirm + + + DNS + + + DNS-Lookup + + + Net fragmentéieren + + + Umeldungsdaten beaarbechten + + + Grupp beaarbechten + + + Profil beaarbechten + + + Feeler + + + Exportéieren + + + Filter + + + Allgemeng + + + Headers + + + History + + + HotKeys + + + HTTP-Headers + + + Importéieren + + + Informatiounen + + + Interface + + + IP-Scanner + + + Tastatur + + + Sprooch + + + Bibliothéiken + + + Lizenz + + + Lokal Apparater a Ressourcen + + + Späicherplaz + + + Lookup + + + MAC-Adress + + + Masterpasswuert + + + Multithreading + + + Netzwierk + + + Netzwierkinterface + + + Konfiguratioun ugewannt + + + D'Konfiguréiere vun der Netzwierk-Schnëttstell erfuerdert erhéicht Rechter! + + + Neien Tab + + + Weider + + + OUI + + + Optiounen + + + Iwwerschreiwen? + + + Ping + + + Port + + + Portable + + + Port-Scanner + + + Profiler + + + PuTTY + + + Ufro + + + Remote Desktop + + + Zerécksetzen + + + PTR opléisen + + + Ressourcen + + + Resultat + + + Route + + + Scannen + + + Sich + + + Wielt e Profil... + + + Masterpasswuert setzen + + + Astellungen + + + SNMP + + + Socket + + + Statistiken + + + Status + + + Subnet + + + Subnetting + + + Erfollegräich! + + + Thema + + + Traceroute + + + Tray + + + Update + + + v1/v2c + + + v3 + + + Validéierung feelgeschloen! + + + Wake on LAN + + + Websäit + + + Fënster + + + Falscht Passwuert! + + + Client + + + Administrator + + + Icon ëmmer am Tray uweisen + + + Versich + + + Duerchschnëttlech Zäit + + + Broadcast + + + Buffer + + + Bytes + + + CIDR + + + Zoumaachen + + + Default-Gateway + + + Läschen... + + + Beschreiwung + + + Placeholder + + + De Pad zum Fichier oder zum ausféierbaren Programm dat soll lafen. Follgend Placeholder kënne benotzt ginn: + + + Argumenter, déi un de Fichier oder un dat ausféierbaart Programm iwwerginn ginn. Follgend Placeholder kënne benotzt ginn: + + + Follgend Placeholder kann benotzt ginn: + + + DHCP aktivéiert + + + DHCP-Lease leeft of + + + DHCP-Lease kritt + + + DHCP-Server + + + DNS-Server + + + DNS-Suffix + + + Dynamesch IPv4-Adress + + + Dynameschen IPv4-DNS-Server + + + Hop + + + Hops + + + Hostname + + + IP-Adress + + + IP-Adressen + + + IPv4 + + + IPv4-Adress + + + IPv4-Adress dobäigesat + + + IPv4-Adress ewechgeholl + + + IPv4-Adress fräigelooss a erneiert + + + IPv4-Adress fräigelooss + + + IPv4-Adress erneiert + + + IPv6-Adress fräigelooss a erneiert + + + IPv6-Adress fräigelooss + + + IPv6-Adress erneiert + + + IPv4-Default-Gateway + + + IPv6 + + + IPv6-Adress + + + Link-lokal IPv6-Adress + + + IPv6-Default-Gateway + + + Map + + + (+{0} more) + + + Scroll = Zoom, Drag = Pan + + + Unknown + + + Maximum + + + Maximal Hops + + + Haaptfënster miniméieren amplaz d'Applikatioun zoumaachen + + + An den Tray miniméieren amplaz an d'Taskbar + + + Minimum + + + Numm + + + Netzwierkadress + + + Nei Subnetmask oder CIDR + + + Neen + + + IP-Adress automatesch bezéien + + + DNS-Server-Adress automatesch bezéien + + + Paketverloscht + + + Pakete iwwermëttelt + + + Physesch Adress + + + Bevorzugt Protokoll beim Opléise vum Hostname: + + + Primäre DNS-Server + + + Empfaangen / Verluer + + + Hostname opléisen + + + Neistart erfuerderlech + + + Astellungen am Applikatiounsuerdner späicheren + + + Sekundäre DNS-Server + + + Uweisen + + + Déi folgend Applikatioun beim Start uweisen: + + + E mächtegt Open-Source-Tool fir Netzwierker ze verwalten an Netzwierkprobleemer ze léisen! + + + Geschwindegkeet + + + Miniméiert am Tray starten + + + Mat Windows starten (aktuelle Benotzer) + + + Statesch IPv4-Adress + + + Stateschen IPv4-DNS-Server + + + Subnetmask + + + Threads + + + Zäit + + + Zäit 1 + + + Zäit 2 + + + Zäit 3 + + + Timeout + + + Timeout (ms) + + + Zäit (ms) déi tëscht all Ping gewaart gëtt + + + TTL + + + Typ + + + Folgend DNS-Server-Adressen benotzen: + + + Folgend IP-Adress benotzen: + + + Opwecken + + + Jo + + + Bäifügen + + + E Tab bäifügen fir en DNS-Lookup duerchzeféieren... + + + E Tab bäifügen fir en Netzwierk-Scan duerchzeféieren... + + + E Tab bäifügen fir eng SNMP-Aktioun duerchzeféieren... + + + E Tab bäifügen fir e Ping duerchzeféieren... + + + E Tab bäifügen fir e Port-Scan duerchzeféieren... + + + E Tab bäifügen fir eng Verfollegung duerchzeféieren... + + + DNS-Suffix (primär) zum Hostname bäifügen + + + Zousätzlech Kommandozeil + + + Additionals + + + Profil bäifügen... + + + Bildschirm automatesch upassen + + + Äntwerten + + + D'Applikatioun gëtt duerno nei gestart! + + + Uwenden + + + Windows-Tastekombinatiounen uwenden (z. B. ALT+TAB): + + + Auth + + + Authentifizéierungsniveau + + + Authorities + + + Automatesch aktualiséieren all + + + zréck + + + Sécherung + + + Baud + + + De Virgang gouf vum Benotzer ofgebrach! + + + Caps Lock ass aktivéiert! + + + Chart-Zäit (Sekonnen) + + + Beim Start op Updates iwwerpréiwen + + + Klass + + + Filter läschen + + + Faarftéift (Bit) + + + Community + + + Konfiguréiert de Pad zu PuTTY an den Astellungen... + + + Zoumaache bestätegen + + + Sidd Dir sécher, datt Dir d'Applikatioun zoumaache wëllt? + + + Verbannen als... + + + Extern verbannen + + + Verbannt d'Netzwierkkaart mat engem Netzwierk fir se ze konfiguréieren! + + + Kopéieren + + + Kopéieren als... + + + Kopéieren... + + + Hostname konnt net opgeléist ginn fir: "{0}" + + + Umeldungsdaten + + + Profildateie ginn op der Festplack mat AES mat enger Schlësselgréisst vun 256 Bit an enger Blockgréisst vun 128 Bit am CBC-Modus verschlësselt. De Verschlësselungsschlëssel gëtt aus engem Masterpasswuert mat Rfc2898DeriveBytes (PBKDF2) mat 1.000.000 Iteratiounen ofgeleet. Zur Laafzäit ginn d'Passwierder als SecureString gespäichert, soubal d'Profildatei gelueden ass. Bei e puer Funktioune muss d'Passwuert an en normale String konvertéiert ginn a bleift onverschlësselt am Speicher, bis de Garbage Collector se opraumt. + +Maacht als éischt eng Sécherungskopie vun ären Profildateien, ier Dir d'Verschlësselung aktivéiert! + + + Benotzerdefinéiert + + + Benotzerdefinéiert Bildschirmgréisst: + + + D'Daten goufen aktualiséiert! + + + Umeldungsdaten musse entschlësselt a gelueden ginn fir se ze verwalten. + + + Standard + + + Baudrate + + + Standard-Port: + + + Rlogin-Port + + + SSH-Port + + + Telnet-Port + + + Déi ausgewielten Umeldungsdate ginn onwidderbréiflech geläscht. + + + Entrée läschen + + + Dat ausgewielt Profil gëtt onwidderbréiflech geläscht. + + + DNS-Autokonfiguratioun + + + DNS-Lookup... + + + DNS-Server + + + Domän + + + Dauer + + + Beaarbechten... + + + Aktivéieren + + + Credential Security Support Provider aktivéieren + + + Endzäit + + + Gitt e Subnet an fir et ze berechnen... + + + Gitt e Subnet an eng nei Subnetmask an fir Subnete ze erstellen... + + + Verbindung zu 'api.github.com' net méiglech, iwwerpréift är Netzwierkverbindung! + + + Feeler an der Äntwert! + + + Feeler an der Äntwert! Iwwerpréift, ob Dir Schreifrechter hutt. + + + Erweideren + + + Éischt benotzbar IP-Adress + + + Fest Bildschirmgréisst: + + + Fonnt + + + Grupp + + + Héicht + + + Host + + + Hostname oder IP-Adress + + + Hosts + + + ID + + + Host vun Allgemeng ierwen + + + IP-Beräich + + + Lescht benotzbar IP-Adress + + + Lokal IP-Adress + + + Lokale Port + + + MAC-Adress oder Hiersteller + + + Magic Packet erfollegräich geschéckt! + + + Maximal Unzuel ({0}) u Hops/Router erreecht! + + + Noriichtegréisst + + + Modus + + + Multicast + + + Méi Instanzen + + + D'Netzwierkadress kann net erreecht ginn. Iwwerpréift, ob Äre Computer mam Netzwierk verbonnen ass. Informatiounen zur Netzwierk-Feelersich fannt Dir an der Windows-Hëllef. + + + Nei Verbindung... + + + Keen DNS-Entrée fir "{0}" fonnt! Iwwerpréift är Agab an d'Astellungen. + + + Keng aktivéiert Netzwierkadapter fonnt! + + + Keng Ports fonnt. Iwwerpréift är Agab! + + + Keng Profiler fonnt! +Erstellt een... + + + Näischt fonnt! + + + Näischt ze maachen. Iwwerpréift är Agab! + + + Keen Update verfügbar! + + + Keng gülteg Datei fir z'importéiere fonnt. + + + Keen Hiersteller fonnt. Iwwerpréift är Agab! + + + Unzuel u Feeler no deenen ofgebrach gëtt: + + + Unzuel gespäichert Entréen + + + OID + + + Nëmmen CSV-Fichieren sinn erlaabt! + + + Nëmme beim Vollbild uwenden + + + Um Remotecomputer + + + Op dësem Computer + + + Op + + + Lizenz opmaachen + + + Projekt opmaachen + + + Websäit opmaachen + + + iwwerschreiwen + + + Passwuert + + + Passwierder stëmmen net iwwereneen! + + + Pad + + + Port oder Déngscht + + + Ports + + + Priv + + + Profil + + + Profiler nei gelueden + + + Protokoll + + + De PuTTY-Prozess gouf beendegt! + + + Ufroen + + + RAW + + + Rekursioun + + + Zwëschenoflag ëmleeden + + + Apparater ëmleeden + + + Laafwierker ëmleeden + + + Ports ëmleeden + + + Drécker ëmleeden + + + Smartcarte ëmleeden + + + Verbleiwend Zäit + + + Remote IP-Adress + + + Remote Port + + + Widderhuelen + + + CNAME bei ANY-Ufroen opléisen + + + Äntwerten + + + Rlogin + + + Gescannt + + + Gesicht Applikatioun net fonnt! + + + Gesicht Sprooch net fonnt! + + + Gesicht Astellung net fonnt! + + + Sécherheet + + + Wielt eng Bildschirmopléisung + + + Doduerch ginn all Astellunge zerécksat! + + + Seriell + + + Serial line + + + Déngscht + + + Déi fonnten Astellungsdatei war beschiedegt oder ass net mat dëser Versioun kompatibel! Dir kënnt dëse Problem op GitHub mellen. + +Et gouf e Backup vun der Astellungsdatei am Astellungsuerdner erstallt an d'Astellunge goufe zerécksat. + +Profildateie sinn net betraff! + + + Zou Ports uweisen + + + Titel vun der aktueller Applikatioun uweisen + + + Nëmmen déi heefegst Ufro-Typen uweisen + + + Net erreechbar IP-Adressen a Ports uweisen + + + Statistiken uweisen + + + SSH + + + Startzäit + + + Status + + + Subnet 1 + + + Subnet 2 + + + Tags + + + Telnet + + + D'Applikatioun kann ouni Parameter gestart ginn! + + + Déi folgend Hostnamme konnten net opgeléist ginn: + + + Déi folgend Parameter stinn zur Verfügung: + + + Déi folgend Parameter kënnen net verschafft ginn: + + + De Virgang ka bëssen Zäit a Ressourcen an Usproch huelen (CPU / RAM). + + + De Späicherplaz vun den Astellungen ass dovun net betraff! + + + Zäitiwwerschreidung bei der SNMP-Ufro. De Host ass méiglecherweis net erreechbar oder d'Community / d'Passwuert ass falsch. + + + Timeout beim Offroe vum DNS-Server mat der IP-Adress "{0}"! + + + Timestamp + + + Verfollegen + + + Onbekannte Feeler! + + + Untray / Fënster an de Virdergrond bréngen + + + URL + + + Umeldungsdaten benotzen + + + Déi aktuell Usiichtsgréisst als Bildschirmgréisst benotzen + + + Benotzerdefinéierten DNS-Server benotzen + + + Benotzerdefinéierten DNS-Suffix benotzen + + + Resolver-Cache benotzen + + + Benotzeruewerfläch gespaart! + + + Benotzernumm + + + Hiersteller + + + Versioun + + + Versioun {0} ass verfügbar! + + + Walk-Modus + + + Breet + + + D'Profildatei konnt mam aginnene Passwuert net entschlësselt ginn. + + + Dat aginnent Passwuert ass falsch. + + + Bäifügen... + + + Entrée bäifügen... + + + Berechnen + + + Ofbriechen + + + Änneren + + + Masterpasswuert änneren... + + + Iwwerpréiwen + + + Op Updates iwwerpréiwen + + + Zou + + + Weider + + + Benotzerdefinéiert: + + + Ausschneiden + + + Entschlësselen a lueden... + + + Läschen + + + Tabell läschen + + + Späicherplaz aginn... + + + Alles + + + Filter... + + + DNS-Cache eidelmaachen + + + DNS-Cache geläscht + + + Entschlësselt a luet är Umeldungsdaten fir se auszewielen. + + + Weist dëse Dialog un. + + + Setzt all Astellunge vun der Applikatioun zeréck. + + + D'Passwuert gëtt beim Beaarbechten net ugewisen, kann awer iwwerschriwwe ginn. + + + [0] Wann d'Serverauthentifizéierung feelschléit, gëtt ouni Warnung eng Verbindung mam Computer hiergestallt. +[1] Wann d'Serverauthentifizéierung feelschléit, gëtt keng Verbindung hiergestallt. +[2] Wann d'Serverauthentifizéierung feelschléit, gëtt eng Warnung ugewisen, déi et erlaabt d'Verbindung hierzestellen oder ofzeleenen. +[3] Et ass keng Authentifizéierungsufuerderung uginn. + + + Mat Tags kënnt Dir Profiler no Themen/Projekter organiséieren. Méi Tags kënne mat ";" getrennt ginn. No Tags sichen mat "tag=xxx". + + + Stonn(en) + + + Späicherplaz vun der Importdatei... + + + Minutt(en) + + + Verréckelen & nei starten + + + Netzwierkverbindungen... + + + (net geännert) + + + Aus + + + OK + + + Un + + + Späicherplaz opmaachen + + + Astellungen opmaachen + + + Iwwerschreiwen + + + Parséieren + + + Afügen + + + Nei verbannen + + + Aktualiséieren + + + Elo nei starten + + + Späicheren + + + Sichen... + + + Sekonn(en) + + + Schécken + + + Masterpasswuert setzen... + + + Lokal Lizenzen uweisen + + + Subnet-Rechner + + + Validéieren + + + Verbindungen + + + Gitt e gültegen IP-Beräich an! + + + Gitt eng gülteg IPv4-Adress an! + + + Gitt eng gülteg MAC-Adress an (z. B. 00:F1:23:AB:F2:35)! + + + Gitt e gültege Port an (1 - 65535)! + + + Gitt eng gülteg Subnetmask an (z. B. 255.255.255.0)! + + + Gitt eng gülteg Subnetmask oder CIDR an (z. B. 255.255.255.0 oder /24)! + + + D'Feld dierf net eidel sinn! + + + Datei existéiert net! + + + Uerdner existéiert net! + + + Listeners + + + Bernstein + + + Aussinn + + + Applikatiounen + + + Donkel + + + Hell + + + Schwaarz + + + Blo + + + Brong + + + Kobalt + + + Purpur + + + Türkis + + + Smaragd + + + Gitt eng oder méi gülteg IP-Adressen an! + + + Gitt eng gülteg Baud an! + + + Gitt gülteg Hosts an (méi Hosts däerfen net mat ";" ophalen)! + + + Gitt eng gülteg IP-Adress an! + + + Gitt eng gülteg Zuel an! + + + Gitt eng gülteg OID an! + + + Gitt e gültege Port an/oder Port-Beräich an (1 - 65535)! + + + Gitt e gültegt Subnet an (z. B. 192.168.178.133/26)! + + + Gitt eng gülteg Websäit an (z. B. https://example.com/index.html) + + + Gréng + + + Import / Export + + + Indigo + + + Zilhost net erreechbar. + + + Zilnetz net erreechbar. + + + Zilport net erreechbar. + + + Erfollegräich + + + Zäitiwwerschreidung vun der Ufro. + + + D'Gültegkeetsdauer gouf bei der Iwwerdroung iwwerschratt. + + + De Schlëssel muss op d'mannst 8 Zeechen laang sinn! + + + Limett + + + Live + + + Magenta + + + Mauve + + + Oliv + + + Et däerfen nëmmen Zuelen aginn ginn! + + + Orange + + + Rosa + + + Lila + + + Rout + + + Socket zougemaach. + + + Remote-Trennung duerch de Server. + + + Dekompressiounsfeeler. + + + Zäitiwwerschreidung vun der Verbindung. + + + Dekodéierungsfeeler. + + + DNS-Nummopléisung feelgeschloen. + + + DNS-Lookup-Feeler. + + + Verschlësselungsfeeler. + + + Gethostbyname-Opruff vu Windows Sockets feelgeschloen. + + + Host net fonnt. + + + Interne Feeler. + + + Interne Sécherheetsfeeler. + + + Interne Sécherheetsfeeler. + + + Déi uginn Verschlësselungsmethod ass ongülteg. + + + Ongülteg IP-Adress uginn. + + + Déi uginn IP-Adress ass ongülteg. + + + D'Sécherheetsdate sinn ongülteg. + + + D'Server-Sécherheetsdate sinn ongülteg. + + + Lizenzaushandlung feelgeschloen. + + + Lizenz-Timeout. + + + Lokal Trennung. + + + Et sinn keng Informatiounen verfügbar. + + + Net genuch Aarbechtsspeicher. + + + Net genuch Aarbechtsspeicher. + + + Net genuch Aarbechtsspeicher. + + + Remote-Trennung duerch de Benotzer. + + + D'Serverzertifikat konnt net entpaakt ginn. + + + Windows-Sockets-Verbindung feelgeschloen. + + + De Windows-Sockets-Opruff recv ass feelgeschloen. + + + De Konto ass deaktivéiert. + + + De Konto ass ofgelaf. + + + De Konto ass gespaart. + + + De Konto ass ageschränkt. + + + Dat empfaangent Zertifikat ass ofgelaf. + + + D'Richtlinn ënnerstëtzt keng Delegatioun vun Umeldungsdaten un den Zilserver. + + + D'Serverauthentifizéierungsrichtlinn léisst keng Verbindungsufroe mat gespäicherten Umeldungsdaten zou. De Benotzer muss nei Umeldungsdaten aginn. + + + Umeldung feelgeschloen. + + + Et konnt keng Autoritéit fir d'Authentifizéierung kontaktéiert ginn. Den Domännumm vum authentifizéierenden Deelnehmer kéint falsch sinn, d'Domän kéint net erreechbar sinn, oder et ass e Vertrauensverhältnisfeeler opgetrueden. + + + De uginne Benotzer huet kee Konto. + + + D'Passwuert ass ofgelaf. + + + D'Benotzerpasswuert muss geännert ginn, ier Dir Iech fir d'éischt umellt. + + + D'Delegatioun vun Umeldungsdaten un den Zilserver ass nëmmen erlaabt, wann eng géigesäiteg Authentifizéierung erreecht gouf. + + + D'Smartcard ass blockéiert. + + + Eng falsch PIN gouf der Smartcard iwwergi. + + + Zäitiwwerschreidung ass opgetrueden. + + + Interne Timer-Feeler. + + + De Windows-Sockets-Opruff send ass feelgeschloen. + + + Siena + + + Eidelzeechen sinn net erlaabt! + + + Stol + + + Taupe + + + Closed + + + CloseWait + + + Closing + + + DeleteTcb + + + Established + + + FinWait1 + + + FinWait2 + + + LastAck + + + Listen + + + SynReceived + + + SynSent + + + TimeWait + + + Unknown + + + Teal + + + Violett + + + Wäiss + + + Giel + + + E Profil mat dësem Numm existéiert schonn! + + + Zou + + + Op + + + Op d'mannst eng Applikatioun muss sichtbar sinn! + + + Verstoppt Applikatiounen + + + Sichtbar Applikatiounen + + + Sichtbar Applikatiounen an der Leescht: + + + Whois + + + E Tab bäifügen fir eng Whois-Ufro duerchzeféieren... + + + Gitt eng gülteg Domän an (z. B. "example.com")! + + + Gitt e gültege Windows-Benotzernumm an (z. B. "user", "DOMAIN\user" oder "user@domain.com")! + + + Whois-Server net fonnt fir d'Domän: "{0}" + + + Routing + + + Release + + + Release & Renew + + + Renew + + + Windows-DNS-Astellungen + + + DNS-Server läschen + + + De ausgewielten DNS-Server gëtt onwidderbréiflech geläscht. + + + DNS-Server bäifügen + + + DNS-Server beaarbechten + + + En DNS-Server mat dësem Numm existéiert schonn! + + + Session nei starten + + + TigerVNC + + + Konfiguréiert de Pad zu TigerVNC an den Astellungen... + + + De TigerVNC-Prozess gouf beendegt! + + + Verbannen... + + + MAC-Adress an Hiersteller opléisen + + + Hiweis + + + Alles exportéieren + + + Exportéieren... + + + Ausgewielter exportéieren + + + Späicherplaz... + + + Datei + + + Gitt e gültege Dateipad an! + + + All + + + Format + + + Ausgewielt + + + Beim Exportéiere vun den Daten ass e Feeler opgetrueden. Kuckt d'Feelermeldung fir Detailer: + + + Design + + + Timeouts ervirhiewen + + + Gitt Subnete an fir e Wide Subnet ze erstellen... + + + Wide Subnet + + + Tab bäifügen... + + + IPv4-Adress bäifügen... + + + IPv4-Adress bäifügen + + + Max. gläichzäiteg Host-Threads + + + Max. gläichzäiteg Port-Threads + + + PowerShell + + + Konfiguréiert de Pad zu PowerShell an den Astellungen... + + + De PowerShell-Prozess gouf beendegt! + + + Execution Policy + + + Remote-Konsole + + + Dateipad + + + Standardastellungen iwwerschreiwen + + + IPv4-Adress fir dëse Host opléisen + + + Verstoppen + + + Unzuel un empfaangene Bytes + + + Unzuel u geschéckte Bytes + + + Download + + + Bandbreet + + + Upload + + + Windows-Tastekombinatiounen uwenden + + + Credential Security Support Provider + + + Hannergrondjob + + + De Hannergrondjob späichert Astellungen a Profiler all x-Minutten. + +De Wäert 0 deaktivéiert dës Funktioun. + +Ännerungen un dësem Wäert gi réischt no engem Neistart vun der Applikatioun wierksam. + + + Hannergrondjob all x-Minutt ausféieren + + + Äert Betribssystem ass net mat der neister Versioun kompatibel! + + + Dashboard + + + All Astellunge kënne méi spéit an den Astellunge geännert ginn! + + + Ëffentlech IP-Adress iwwerpréiwen + + + Merci, datt Dir NETworkManager benotzt! + +Wann en Iech gefält, kënnt Dir d'Entwécklung ënnerstëtzen – mat engem Stär op GitHub, enger Spende oder andeems Dir en mat aneren deelt. Är Ënnerstëtzung hëlleft, d'Projekt um Liewen ze halen a weiderzentwéckelen. + + + Beim Programmstart gëtt am Hannergrond gepréift, ob eng nei Programmversioun op GitHub verfügbar ass. + +URL: https://api.github.com/ + + + D'ëffentlech IP-Adress gëtt iwwer ipify.org ermëttelt. + +URL: https://api.ipify.org an https://api6.ipify.org + + + Privatsphär + + + Wëllkomm + + + Extern Déngschter + + + Star/Fork d'Projekt op GitHub. + + + Hëlleft, d'Projekt op Transifex ze iwwersetzen. + + + Follegt mir oder kontaktéiert mech iwwer X. + + + Verbindung + + + Computer + + + Gateway / Router + + + Internet + + + Iwwerpréift d'Konfiguratioun vun ärem Netzwierkadapter (DNS) an ob Äre DNS-Server richteg konfiguréiert ass. + + + Iwwerpréift d'Konfiguratioun vun ärem Netzwierkadapter (DHCP, statesch IP) an ob Dir mam Netzwierk verbonne sidd. + + + D'IP-Adress vum Gateway konnt net ermëttelt ginn! + + + D'lokal IP-Adress konnt net ermëttelt ginn! + + + Ëffentlech IP-Adress konnt net iwwer WebRequest (http/https) vu "{0}" ofgeruff ginn! Iwwerpréift är Netzwierkverbindung (Firewall, Proxy asw.). + + + Keen A-DNS-Entrée opgeléist fir "{0}"! + + + Keen PTR-DNS-Entrée opgeléist fir "{0}"! + + + "{0}" A-DNS-Entréen opgeléist fir "{1}"! + + + PTR-DNS-Entrée opgeléist fir "{0}"! + + + "{0}" als ëffentlech IP-Adress vu "{1}" kritt! + + + "{0}" als Hostname fir IP-Adress "{1}" opgeléist! + + + Iwwerpréiwung vun der ëffentlecher IP-Adress +ass deaktivéiert! + + + TCP/IP-Stack ass verfügbar. "{0}" ass iwwer ICMP erreechbar! + + + TCP/IP-Stack ass net verfügbar... "{0}" ass iwwer ICMP net erreechbar! + + + "{0}" als Gateway-IP-Adress erkannt! + + + "{0}" als lokal IP-Adress erkannt! + + + "{0}" ass iwwer ICMP net erreechbar! + + + "{0}" ass iwwer ICMP erreechbar! + + + Benotzerdefinéiert IPv4-Adressen-API benotzen + + + URL zu engem Webdéngscht, deen iwwer http oder https erreechbar ass an eng IPv4-Adress, z. B. "xx.xx.xx.xx", als Äntwert zréckgëtt. + + + Ëffentlech IP-Adress vu "{0}" konnt net geparst ginn! Probéiert en anere Déngscht oder benotzt d'Standardastellung... + + + Verbindung zu "{0}" konnt net hiergestallt ginn! + + + IPv4-Protokoll ass verfügbar + + + IPv6-Protokoll ass verfügbar + + + Kopie + + + Offiziell + + + Netzwierkverbindungstyp + + + Desktophannergrond + + + Desktopgestaltung + + + Leeschtung + + + Schrëftglättung + + + Menü- a Fensteranimatioun + + + Leeschtung + + + Dauerhaft Bitmap-Zwëschespäicherung + + + Verbindung nei hierstellen, falls se getrennt gëtt + + + Breetband mat héijer Iwwerdroungsrate (2 Mbit/s - 10 Mbit/s) + + + Breetband mat nidderegen Iwwerdroungsrate (256 Kbit/s - 2 Mbit/s) + + + Verbindungsqualitéit automatesch erkennen + + + LAN (10 Mbit/s oder méi héich) + + + Modem (56 Kbit/s) + + + Satellit (2 Mbit/s - 16 Mbit/s mat héijer Latenz) + + + WAN (10 Mbit/s oder méi héich mat héijer Latenz) + + + Fensterinhalt beim Zéien uweisen + + + Visuell Stiler + + + View only + + + Tastatur- a Mausagaben un d'Remote-Sessioun blockéieren + + + Remote-Audio + + + Remote-Audiowiddergab + + + Remote-Audio-Opnam + + + Net opzeechnen + + + Vun dësem Computer opzeechnen + + + Net ofspillen + + + Um Remotecomputer ofspillen + + + Op dësem Computer ofspillen + + + Gateway + + + Benotzerdefinéiert Befeeler + + + Benotzerdefinéierte Befeel bäifügen + + + Argumenter + + + Benotzerdefinéierte Befeel läschen + + + Benotzerdefinéierte Befeel beaarbechten + + + Programm + + + Privat + + + Ëffentlech + + + De ausgewielte benotzerdefinéierte Befeel gëtt onwidderbréiflech geläscht. + + + Neistart + + + IP-Adress fir den Hostname konnt net opgeléist ginn! + + + Ctrl+Alt+Del + + + Task Manager (Ctrl+Shift+Esc) + + + Spären (Win+L) + + + Desktop uweisen (Win+D) + + + Explorer (Win+E) + + + Ausféiere-Dialog (Win+R) + + + Tastekombinatiounen + + + Bildschirm upassen + + + Vollbild + + + Tastekombinatioun konnt net geschéckt ginn! + + + Trennen + + + Lokal IP-Adress a Subnetmask ermëttelen + + + Subnetmask konnt net ermëttelt ginn! + + + Netzwierk gëtt erkannt... + + + Zoumaachen an {0} Sekonnen... + + + Netzwierk net verfügbar! + + + IP-Adress fir d'lokal IP-Adress baséierend um Routing z'erkennen + + + Statusfenster bei Netzwierkwiessel uweisen + + + Zäit a Sekonnen, wéi laang d'Statusfenster ugewise gëtt + + + WLAN + + + Netzwierker + + + Sich no Netzwierker... + + + Keng WLAN-Adapter fonnt! + + + Sich no WLAN-Adapter... + + + Keng WLAN-Netzwierker fonnt! + + + Kanäl + + + Kanal + + + Kanalbreet + + + 2.4 GHz + + + 5 GHz + + + 2.4 & 5 GHz + + + Signalstäerkt + + + Aktuell Download-Geschwindegkeet + + + Aktuell Upload-Geschwindegkeet + + + Gemoss Zäit + + + Netzwierknotzung + + + Download am Ganzen + + + Upload am Ganzen + + + Widderhuelungen + + + Cache benotzen + + + Nëmmen TCP benotzen + + + Ufroklass + + + Domännumm + + + Timeout (s) + + + Mellt e Problem oder erstellt e Feature-Request. + + + Beacon-Intervall + + + Verschlësselung + + + Infrastruktur + + + Netzwierk-Aart + + + Phy-Aart + + + Betribszäit + + + Feelermeldung uweisen + + + Ping-Monitor + + + Host bäifügen + + + Host fir z'iwwerwaachen bäifügen + + + Paus + + + Fortsetzen + + + Konnt d'IP-Adress net opléise fir: "{0}" + + + Notifikatioun + + + Bei Statusännerung e Notifikatiounsfenster uweisen + + + Toun bei Statusännerung ofspillen + + + Erfollegsschwell + + + Unzuel u openeanerfollegend erfollegräiche Pings, déi erfuerderlech sinn, ier eng "Host ass erreechbar"-Notifikatioun ugewise gëtt. Méi héich Wäerter reduzéieren d'Rauschen duerch flappend Hosts. + + + Feelerschwell + + + Unzuel u openeanerfollegend feelgeschloene Pings (Timeouts), déi erfuerderlech sinn, ier eng "Host ass net erreechbar"-Notifikatioun ugewise gëtt. Méi héich Wäerter reduzéieren d'Rauschen duerch flappend Hosts. + + + Uweisungsdauer (Sekonnen) + + + Host ass erreechbar + + + Host ass net erreechbar + + + D'Applikatioun gëtt nei gestart... + + + Datei konnt net exportéiert ginn! Kuckt d'Feelermeldung: "{0}" + + + Datei no "{0}" exportéiert! + + + Datei konnt net importéiert ginn! Kuckt d'Feelermeldung: "{0}" + + + De Späicherplaz kann an der portabeler Versioun net geännert ginn! + + + Ass verschlësselt + + + Dokumentatioun opmaachen. + + + Client 1 + + + Profildatei bäifügen + + + Verschlësselung deaktivéieren... + + + Profildatei beaarbechten + + + Verschlësselung aktivéieren... + + + Verschlësselung... + + + Profilnumm existéiert schonn! + + + Ëmbenennen + + + Profildatei läschen + + + All Profiler an dëser Profildatei ginn dauerhaft geläscht! + + + Patch + + + Start d'Applikatioun nei fir d'Sprooch z'änneren! + + + Aktuell erofgelueden + + + Aktuell eropgelueden + + + LLDP / CDP + + + Neistart als Administrator + + + D'Analyse vun Netzwierkpäck erfuerdert erhéicht Rechter! + + + Ophuelen + + + Apparat + + + Dauer (s) + + + Modell + + + VLAN + + + Huelt Netzwierkpäck op fir LLDP- oder CDP-Informatiounen unzeweisen! + + + Keng Discovery-Protokoll-Päck empfaangen! + + + Netzwierkpäck gi opgeholl... + + + Discovery-Protokoll + + + CDP + + + LLDP + + + LLDP / CDP + + + {0} Sekonne verbleiwend... + + + Hëllef + + + Applikatioun déi no dem Start ugewise gëtt. + + + Parameter + + + Wäert + + + Web-Konsole + + + Nei lueden + + + Browser + + + D'WebView-Steierelement (Microsoft Edge) kann keng Verbindung zu Websäite mat engem ongültege Zertifikat hierstellen! + + + Microsoft.Windows.SDK.Contracts ass fir dës Funktioun erfuerderlech, awer op dësem System net verfügbar (z. B. ënner Windows Server). + + + Neighbor Table + + + Verbindungen + + + Dashboard + + + Discovery-Protokoll + + + DNS-Lookup + + + HTTP-Headers + + + IP-Scanner + + + Listeners + + + Lookup + + + Netzwierkinterface + + + Ping + + + Ping-Monitor + + + Port-Scanner + + + PowerShell + + + PuTTY + + + Remote Desktop + + + SNMP + + + Subnet-Rechner + + + TigerVNC + + + Traceroute + + + Wake on LAN + + + Web-Konsole + + + Whois + + + WLAN + + + Bernstein + + + Schwaarz + + + Blo + + + Brong + + + Kobalt + + + Purpur + + + Türkis + + + Smaragd + + + Gréng + + + Indigo + + + Limett + + + Magenta + + + Mauve + + + Oliv + + + Orange + + + Lila + + + Rout + + + Siena + + + Taupe + + + Teal + + + Rosa + + + Giel + + + Stol + + + Allgemeng + + + Applikatiounen + + + Allgemeng + + + Aussinn + + + Autostart + + + Allgemeng + + + HotKeys + + + Sprooch + + + Profiler + + + Astellungen + + + Status + + + Update + + + Fënster + + + Log aktivéieren + + + Log-Dateinumm + + + Log-Pad + + + Log-Modus + + + Log + + + SSH-Log + + + SSH-Raw-Log + + + Session-Log + + + SSH-Log + + + SSH- a Raw-Log + + + Gitt e gültegen Dateinumm an! + + + Verluer + + + Empfaangen + + + Status geännert + + + Update verfügbar! + + + Privat Schlësseldatei + + + Virschau + + + Port-Profiler + + + Port-Profil bäifügen + + + Port-Profil läschen + + + Port-Profil beaarbechten + + + Dat ausgewielt Port-Profil gëtt onwidderbréiflech geläscht. + + + Port-Profil auswielen + + + Port-Profiler opmaachen... + + + SplashScreen beim Starten uweisen + + + SplashScreen + + + Microsoft Edge WebView2 Runtime eroflueden + + + Microsoft Edge WebView2 Runtime ass net verfügbar! + + + Frequenz + + + SSID + + + Profildatei konnt net gelueden ginn! + + + D'Profildatei konnt net gelueden ginn an ass méiglecherweis beschiedegt. Dir kënnt probéieren, d'Datei aus enger Sécherungskopie erëmherzestellen oder se ze läschen. + +Wann dat onerwaart oder no engem Update geschitt, mellt de Feeler w.e.g. op GitHub. + + +Feelermeldung: +"{0}" + + + Grupp beaarbechten... + + + Entschlësselungsfeeler + + + D'Datei konnt net entschlësselt ginn. Dir kënnt dëse Problem op GitHub mellen. + + + Verschlësselungsfeeler + + + D'Datei konnt net verschlësselt ginn. Dir kënnt dëse Problem op GitHub mellen. + + + Aktuellt Passwuert + + + Neit Passwuert + + + Masterpasswuert änneren + + + Profil entspären + + + Entspaart d'Profildatei fir d'Profiler ze benotzen! + + + Disclaimer + + + Zesummeféieren + + + Aneren benotzen + + + Verréckelen + + + Leschte Scan um {0} + + + Verstoppt Netzwierk + + + Entwéckelt a geflegt vu {0} mat der Hëllef vun der + + + Eng einfach API fir ëffentlech IP-Adressen + + + AirspacePanel behieft all Airspace-Problemer mat WPF-gehoste Winforms. + + + Shared Controlz fir WPF an ... méi + + + DnsClient.NET ass eng einfach, awer ganz leeschtungsfäeg an héichperformant Open-Source-Bibliothéik fir d'.NET Framework, fir DNS-Lookups duerchzeféieren + + + Dragable an tearable Tab-Control fir WPF + + + Déi C#-Bibliothéik këmmert sech ëm komplex Netzwierk-, IP-, IPv4-, IPv6-, Netzmask-, CIDR-, Subnet-, Subnetting-, Supernet- a Supernetting-Berechnunge fir .NET-Entwéckler. + + + Schéin, interaktiv Diagrammer, Kaarten a Messgeräter. + + + Eng Sammlung vu Lued-Indikatoren fir WPF + + + E puer fantastesch Icone fir WPF an UWP all zesummen... + + + En Toolkit fir WPF-Apps am Metro-/Modern-UI-Stil ze erstellen. + + + Json.NET ass e populär Héichleeschtungs-JSON-Framework fir .NET + + + Eng GitHub-API-Client-Bibliothéik fir .NET + + + CDP- an LLDP-Päck op lokalen oder Remote-Computeren erfaassen an analyséieren + + + Sharp SNMP Library - Open Source SNMP fir .NET a Mono + + + Eng Sammlung vun all Länderfändele am SVG + + + Lëscht vun den Top-Level-Domains vun iana.org, déi benotzt gëtt fir Whois-Server vun der TLD vu whois.iana.org iwwer Port 43 ofzefroen + + + GeoJSON conversion of Natural Earth vector map data (CC0-1.0). + + + OUI-Daten vun ieee.org. + + + Service Name and Transport Protocol Port Number Registry vun iana.org. + + + Apache Lizenz 2.0 + + + BSD-2-Clause + + + MIT-Lizenz + + + Onlizenzéiert + + + C#/WinRT bitt Ënnerstëtzung fir déi gepackt WinRT-Projektioun fir d'C#-Sprooch. + + + Laafzäit fir d'Hosting vu PowerShell + + + Mam WebView2-Steierelement kënnt Dir Webtechnologien (HTML, CSS a JavaScript) an är native Applikatiounen abetten, déi vu Microsoft Edge (Chromium) bedriwwe ginn. + + + Füügt ären Applikatioune mat XAML Behaviors fir WPF op eng einfach Manéier Interaktivitéit bäi. + + + Microsoft WebView2 Lizenz + + + Déi aktuell Profildatei ass net verschlësselt a Passwierder ginn onverschlësselt op der Festplack gespäichert! + +Aktivéiert d'Verschlësselung vun der Profildatei an Astellungen>Profil fir d'Umeldungsdate sécher ze späicheren. + + + ICMPv4 + + + ICMPv6 + + + Check ass deaktivéiert! + + + Gitt eng gülteg IPv6-Adress an! + + + Ëffentlech IPv4-Adress déi iwwer ICMP erreechbar ass. + + + Ëffentlech IPv6-Adress déi iwwer ICMP erreechbar ass. + + + Ëffentlech IPv4-Adress + + + Ëffentlech IPv6-Adress + + + Benotzerdefinéiert IPv6-Adressen-API benotzen + + + Time to live + + + Chassis-Id + + + Management + + + Apparatbeschreiwung + + + Portbeschreiwung + + + IPv4-Adress ewechhuelen + + + Zousätzlech Konfig... + + + IPv4-Adress ewechhuelen... + + + D'Remote-Sessioun gouf beendegt, well d'Gesamt-Umeldungszäitlimit erreecht gouf. Dëst Limit gëtt vum Serveradministrator oder duerch Netzwierkrichtlinne festgeluecht. + + + Gitt e gültegen Hostname an! + + + Gitt e gültegen Hostname a Port an! + + + D'Verbindung zur Remote-Sessioun kann net erëmhiergestallt ginn. + + + Migréieren + + + Op GitHub mellen + + + Gruppen + + + Grupp bäifügen + + + Grupp läschen + + + Déi ausgewielte Grupp an all Profiler an dëser Grupp ginn dauerhaft geläscht. + + + De Numm gëtt schonn benotzt! + + + Gréisst upassen + + + Profiler läschen + + + Déi ausgewielt Profiler ginn onwidderbréiflech geläscht. + + + Benotzerdefinéiert Themes benotzen + + + Benotzerdefinéiert Themes + + + Astellunge zerécksetzen? + + + Astellunge zerécksat! + + + Instanz-ID + + + Lokal Verbindung + + + Lokaalt Interface + + + log4net ass en Tool dat de Programméierer beim Ausgi vu Log-Statements un eng Vielfalt vun Ausgabezile ënnerstëtzt. + + + Aktivéiert + + + Regioun + + + Ze synchroniséierend Profiler a Regiounen + + + Standard-Profil + + + Standard-Regioun + + + De Gruppennumm dierf net mat "{0}" ufänken! + + + No Virofversioune sichen + + + Synchronisatioun ass deaktivéiert! + + + Befeel + + + Thema op PowerShell-Konsole uwenden + + + D'Faarf vun der PowerShell-Konsole kann ënner Astellungen > Allgemeng > Aussinn un d'Applikatiounsthema ugepasst ginn + + + Wann Dir dës Optioun aktivéiert, ginn d'Standardastellunge fir d'PowerShell-Konsole an der Registry ënner HKCU:\Console iwwerschriwwen, sou datt d'PowerShell-Konsolefenster dem Applikatiounsthema entsprécht. Dat ass eng global Systemastellung, déi sech op d'Aussinn vum normale PowerShell-Fenster auswierke kann. + +Et ginn nëmmen d'PowerShell-Konsole geännert, déi an den PowerShell-Astellunge konfiguréiert sinn. Souwuel Windows PowerShell wéi och PWSH (PowerShell 7 an héijer) ginn ënnerstëtzt. + +Klickt riets uewen op de Hëllef-/Dokumentatiounsknapp (lénks niewent dem Miniméiere-Knapp) oder navigéiert op https://borntoberoot.net/NETworkManager/Documentation/Settings/Appearance fir méi Detailer. Hei sinn d'Wäerter dokumentéiert, déi ugepasst ginn. + +Wann d'Optioun erëm deaktivéiert gëtt, ginn d'Wäerter net méi geännert. Déi ursprénglech Wäerter ginn awer NET erëmhiergestallt. + + + D'Agab dierf net mat engem ";" ophalen! + + + D'Agab enthält keen Text! + + + Bit-Rechner + + + Bit-Rechner + + + Notatioun + + + Agab + + + Eenheet + + + Bits + + + Gigabits + + + Gigabytes + + + Kilobits + + + Kilobytes + + + Megabits + + + Megabytes + + + Petabits + + + Petabytes + + + Terabits + + + Terabytes + + + Gitt eng Zuel an a wielt eng Eenheet fir d'Eenheeten ze berechnen... + + + Netzwierk + + + Proxy + + + IP-Adress fir dëse Host opléisen (IPv4 gëtt bevorzugt) + + + E gültege Pad zu PowerShell sollt mat "pwsh.exe" oder "powershell.exe" ophalen! + + + E gültege Pad zu PuTTY sollt mat "PuTTY.exe" ophalen! + + + E gültege Pad zu TigerVNC sollt mat "vncviewer-*.exe" oder "vncviewer64-*.exe" ophalen! + + + SNTP-Lookup + + + Verréckelt d'Laafzäitkomponenten an Ofhängegkeete vun enger .NET-Framework-/.NET-Core-Applikatioun an en Ënnerverzeechnes a maacht et schéin. + + + E Tab bäifügen fir en SNTP-Lookup duerchzeféieren... + + + SNTP-Server + + + URL zu engem Webdéngscht, deen iwwer http oder https erreechbar ass an eng IPv6-Adress, z. B. "xxxx:xx:xxx::xx", als Äntwert zréckgëtt. + + + IP-Endpunkt + + + Lokal Endzäit + + + Lokal Startzäit + + + Netzwierkzäit + + + Offset + + + Round trip delay + + + Server + + + SNTP-Lookup + + + SNTP-Server bäifügen + + + SNTP-Server läschen + + + De ausgewielten SNTP-Server gëtt onwidderbréiflech geläscht. + + + SNTP-Server beaarbechten + + + En SNTP-Server mat dësem Numm existéiert schonn! + + + Gitt e gültegen Hostname (z. B. "server-01" oder "example.com") oder eng gülteg IP-Adress (z. B. 192.168.178.1) an! + + + Server + + + Gitt d'Masterpasswuert an fir d'Profildatei z'entspären: + + + Profildatei entspären + + + Zäitiwwerschreidung + + + Hostkey + + + D'Astellunge ginn zerécksat an d'Applikatioun gëtt duerno nei gestart! + + + Astellunge goufe zerécksat! + + + Ping-Status + + + ThreadPool zousätzlech min. Threads + + + Dës Astellung leet d'Mindestzuel u Threads fest, déi bei Bedarf aus dem ThreadPool vun der Applikatioun erstallt ginn. Dat kann d'Leeschtung z. B. vum IP-Scanner oder Port-Scanner verbesseren. + +De Wäert gëtt zum Standardwäert min. Threads (Unzuel un CPU-Threads) bäigerechent. De Wäert 0 léisst d'Standardastellungen. Ass de Wäert méi héich wéi déi standardméisseg max. Threads vum ThreadPool, gëtt dëse Wäert benotzt. + +Wann de Wäert ze héich ass, kënne Leeschtungsproblemer optrieden. + +Ännerungen un dësem Wäert gi réischt no engem Neistart vun der Applikatioun wierksam. Ob de Wäert erfollegräich gesat gouf, kann an der Logdatei ënner %LocalAppData%\NETworkManager\NETworkManager.log gekuckt ginn + + + Dës Astellunge änneren nëmmen d'maximal Unzuel un gläichzäiteg ausgefouerten Threads pro Host-/Port-Scan. Gitt op Astellungen > Allgemeng > Allgemeng fir déi (minimal) Threads vun der Applikatioun unzepassen. + + + Port-Status + + + Ping-Detailer + + + Keng oppe Ports fonnt! + + + Port-Scan ass deaktivéiert! + + + Ports scannen + + + D'Applikatioun "{0}" konnt net fonnt ginn. Vläicht gouf d'Applikatioun an den Astellunge verstoppt? + + + Status-Fenster + + + Adressleescht uweisen + + + Et gëtt net recommandéiert, dës Astellung z'aktivéieren. Méi Instanze vun der Applikatioun deelen sech déiselwecht Astellungen a Profildateien. Déi lescht Instanz, déi zougemaach gëtt, kann Ännerungen iwwerschreiwen, déi vun anere Instanze gemaach goufen. + + + Fir lokal Adressen ëmgoen + + + Gatewayserver aktivéieren + + + Umeldungsmethod + + + Gatewayserver + + + Servernumm + + + Gateway-Umeldungsdaten mam Remotecomputer deelen + + + Auswiel méi spéit maachen + + + Smartcard oder Windows Hello for Business + + + Passwuert ufroen (NTLM) + + + Gateway-Umeldungsdaten benotzen + + + Äre Computer kann keng Verbindung mam Remotecomputer hierstellen, well de Remote-Desktop-Gateway-Server temporär net verfügbar ass. Probéiert méi spéit erëm ze verbannen oder wennt Iech un Äre Netzwierkadministrator fir Hëllef. + + + Äre Computer kann aus engem vun de folgende Grënn keng Verbindung mam Remotecomputer hierstellen: 1) Déi ugefrote Remote-Desktop-Gateway-Serveradress an den Numm am Sujet vum SSL-Zertifikat vum Server stëmmen net iwwereneen. 2) D'Zertifikat ass ofgelaf oder zréckgezunn. 3) D'Stammzertifizéierungsstell vertraut dem Zertifikat net. Wennt Iech un Äre Netzwierkadministrator fir Hëllef. + + + Dëse Computer kann d'Identitéit vum RD-Gateway "" net iwwerpréiwen. Et ass net sécher, sech mat Server ze verbannen, déi net identifizéiert kënne ginn. Wennt Iech un Äre Netzwierkadministrator fir Hëllef. + + + Äre Computer kann keng Verbindung mam Remotecomputer hierstellen, well déi ugefrote Remote-Desktop-Gateway-Serveradress an den Numm am Zertifikatssujet net iwwereneen stëmmen. Wennt Iech un Äre Netzwierkadministrator fir Hëllef. + + + Äre Computer kann keng Verbindung mam Remotecomputer hierstellen, well d'Zertifikat vum Remote-Desktop-Gateway-Server ofgelaf oder zréckgezunn ass. Wennt Iech un Äre Netzwierkadministrator fir Hëllef. + + + Beim Schécke vun Daten un de Remote-Desktop-Gateway-Server ass e Feeler opgetrueden. De Server ass temporär net verfügbar oder eng Netzwierkverbindung ass gestéiert. Probéiert et méi spéit erëm oder wennt Iech un Äre Netzwierkadministrator fir Hëllef. + + + Beim Empfaange vun Daten vum Remote-Desktop-Gateway-Server ass e Feeler opgetrueden. Entweder ass de Server temporär net verfügbar oder eng Netzwierkverbindung ass gestéiert. Probéiert et méi spéit erëm oder wennt Iech un Äre Netzwierkadministrator fir Hëllef. + + + Äre Computer kann keng Verbindung mam Remotecomputer hierstellen, well d'Adress vum Remote-Desktop-Gateway-Server net erreechbar oder falsch ass. Gitt eng gülteg Remote-Desktop-Gateway-Serveradress an. + + + Äre Computer kann keng Verbindung mam Remotecomputer hierstellen, well de Remote-Desktop-Gateway-Server nëmmen iwwer wéineg Serverressourcen verfügt an temporär net verfügbar ass. Probéiert méi spéit erëm ze verbannen oder wennt Iech un Äre Netzwierkadministrator fir Hëllef. + + + De Remote-Desktop-Gateway-Server huet d'Verbindung beendegt. Probéiert méi spéit erëm ze verbannen oder wennt Iech un Äre Netzwierkadministrator fir Hëllef. + + + De Remote-Desktop-Gateway-Serveradministrator huet d'Verbindung beendegt. Probéiert méi spéit erëm ze verbannen oder wennt Iech un Äre Netzwierkadministrator fir Hëllef. + + + Remote Desktop kann aus engem vun de folgende Grënn keng Verbindung mam Remotecomputer "" hierstellen: 1) Äre Benotzerkont ass net an der Berechtegungslëscht vum RD-Gateway opgelëscht. 2) Dir hutt de Remotecomputer méiglecherweis am NetBIOS-Format uginn (z. B. computer1), awer d'RD-Gateway erwaart en FQDN- oder IP-Adressformat (z. B. computer1.fabrikam.com oder 157.60.0.1). Wennt Iech un Äre Netzwierkadministrator fir Hëllef. + + + Remote Desktop kann aus engem vun de folgende Grënn keng Verbindung mam Remotecomputer "" hierstellen: 1) Äre Benotzerkont ass net autoriséiert, op d'RD-Gateway "" zouzegräifen. 2) Äre Computer ass net autoriséiert, op d'RD-Gateway "" zouzegräifen. 3) Dir benotzt eng inkompatibel Authentifizéierungsmethod (z. B. erwaart d'RD-Gateway eng Smartcard, Dir hutt awer e Passwuert uginn). Wennt Iech un Äre Netzwierkadministrator fir Hëllef. + + + Äre Computer kann keng Verbindung mam Remotecomputer hierstellen, well Äre Netzwierkadministrator den Zougang zu dësem RD-Gateway-Server ageschränkt huet. Wennt Iech un Äre Netzwierkadministrator fir Hëllef. + + + Äre Computer kann keng Verbindung mam Remotecomputer hierstellen, well de Web-Proxy-Server eng Authentifizéierung erfuerdert. Wennt Iech un Äre Netzwierkadministrator, fir net-authentifizéierten Datentrafic zu engem RD-Gateway-Server iwwer Äre Web-Proxy-Server zouzeloossen. + + + Äre Computer kann keng Verbindung mam Remotecomputer hierstellen, well de Remote-Desktop-Gateway-Server seng maximal zoulässeg Unzuel u Verbindungen erreecht huet. Probéiert méi spéit erëm ze verbannen oder wennt Iech un Äre Netzwierkadministrator fir Hëllef. + + + Äre Computer kann keng Verbindung mam Remotecomputer hierstellen, well de Remote-Desktop-Gateway-Server d'Ufro net ënnerstëtzt. Wennt Iech un Äre Netzwierkadministrator fir Hëllef. + + + Äre Computer kann keng Verbindung mam Remotecomputer hierstellen, well de Client eng vun de Funktioune vum Remote Desktop Gateway net ënnerstëtzt. Wennt Iech un Äre Netzwierkadministrator fir Hëllef. + + + Äre Computer kann keng Verbindung mam Remotecomputer hierstellen, well de Remote-Desktop-Gateway-Server an dëse Computer net kompatibel sinn. Wennt Iech un Äre Netzwierkadministrator fir Hëllef. + + + Äre Computer kann keng Verbindung mam Remotecomputer hierstellen, well kee Zertifikat fir d'Benotzung um Remote-Desktop-Gateway-Server konfiguréiert gouf. Wennt Iech un Äre Netzwierkadministrator fir Hëllef. + + + Äre Computer kann keng Verbindung mam Remotecomputer hierstellen, well de RD-Gateway-Server, mat deem Dir Iech verbanne wëllt, vun Ärem Computeradministrator net zougelooss ass. Wann Dir den Administrator sidd, fügt den Numm vun dësem Remote-Desktop-Gateway-Server zu der Lëscht vun de vertrauenswürdege Remote-Desktop-Gateway-Server op Ärem Computer bäi a probéiert dann erëm ze verbannen. + + + Äre Computer kann keng Verbindung mam Remotecomputer hierstellen, well Äre Computer oder Apparat aus engem vun de folgende Grënn d'Ufuerderunge fir den Netzwierkzougangsschutz, déi vun Ärem Netzwierkadministrator festgeluecht goufen, net erfëllt: 1) Den Numm vum Remote-Desktop-Gateway-Server an de Sujet vum ëffentleche Schlësselzertifikat vum Server stëmmen net iwwereneen. 2) D'Zertifikat ass ofgelaf oder zréckgezunn. 3) D'Stammzertifizéierungsstell vertraut dem Zertifikat net. 4) D'Schlësselerweiderung vum Zertifikat ënnerstëtzt keng Verschlësselung. 5) Äre Computer kann d'Zertifikatszréckruff-Lëscht net iwwerpréiwen. Wennt Iech un Äre Netzwierkadministrator fir Hëllef. + + + Äre Computer kann keng Verbindung mam Remotecomputer hierstellen, well fir d'Authentifizéierung um Remote-Desktop-Gateway-Server e Benotzernumm an e Passwuert amplaz vu Smartcard-Umeldungsdaten erfuerderlech sinn. + + + Äre Computer kann keng Verbindung mam Remotecomputer hierstellen, well fir d'Authentifizéierung um Remote-Desktop-Gateway-Server Smartcard-Umeldungsdaten amplaz vun engem Benotzernumm an engem Passwuert erfuerderlech sinn. + + + Äre Computer kann keng Verbindung mam Remotecomputer hierstellen, well e ongültegt Cookie un de Remote-Desktop-Gateway-Server geschéckt gouf. Wennt Iech un Äre Netzwierkadministrator fir Hëllef. + + + Äre Computer kann keng Verbindung mam Remotecomputer hierstellen, well d'Cookie vum Remote-Desktop-Gateway-Server ofgeleent gouf. Wennt Iech un Äre Netzwierkadministrator fir Hëllef. + + + Äre Computer kann keng Verbindung mam Remotecomputer hierstellen, well de Remote-Desktop-Gateway-Server eng aner Authentifizéierungsmethod erwaart wéi déi, déi probéiert gouf. Wennt Iech un Äre Netzwierkadministrator fir Hëllef. + + + D'RD-Gateway-Verbindung gouf beendegt, well déi periodesch Benotzerauthentifizéierung feelgeschloen ass. Probéiert mat engem korrekte Benotzernumm a Passwuert erëm ze verbannen. Wann d'Reverbindung feelschléit, wennt Iech un Äre Netzwierkadministrator fir weider Hëllef. + + + D'RD-Gateway-Verbindung gouf beendegt, well déi periodesch Benotzerautoriséierung feelgeschloen ass. Probéiert mat engem korrekte Benotzernumm a Passwuert erëm ze verbannen. Wann d'Reverbindung feelschléit, wennt Iech un Äre Netzwierkadministrator fir weider Hëllef. + + + Äre Computer kann keng Verbindung mam Remotecomputer hierstellen, well d'Remote-Desktop-Gateway an de Remotecomputer keng Richtlinnen austausche kënnen. Dat kann aus engem vun de folgende Grënn geschéien: 1. De Remotecomputer ass net fäeg, Richtlinne mat der Remote-Desktop-Gateway auszetauschen. 2. D'Konfiguratioun vum Remotecomputer léisst keng nei Verbindung zou. 3. D'Verbindung tëscht der Remote-Desktop-Gateway an dem Remotecomputer gouf beendegt. Wennt Iech un Äre Netzwierkadministrator fir Hëllef. + + + D'RD-Gateway-Verbindung gouf beendegt, well déi periodesch Benotzerautoriséierung feelgeschloen ass. Äre Computer oder Apparat huet d'NAP-Ufuerderungen (Network Access Protection), déi vun Ärem Netzwierkadministrator festgeluecht goufen, net erfëllt. Wennt Iech un Äre Netzwierkadministrator fir Hëllef. + + + Verbonnen + + + Feeler beim Scanne vum WLAN-Adapter "{0}" mam Feeler: "{1}" + + + Verbannen... + + + {0} getrennt! + + + Verbannen mat {0} + + + WPS + + + Automatesch verbannen + + + Pre-shared Key + + + Verbannen mat {0}... + + + Konnt keng Verbindung mat {0} ({1}) hierstellen! + + + Erfollegräich verbonne mat {0}! + + + Den Zougang zum Netzwierk gouf gespaart + + + Ongülteg Umeldungsdaten + + + Netzwierk net verfügbar + + + Erfollegräich + + + Zäitiwwerschreidung beim Verbindungsversuch + + + -/- + + + D'Authentifizéierungsprotokoll gëtt net ënnerstëtzt! + + + WPS gëtt gepréift... + + + OID-Profiler opmaachen... + + + MIB + + + OID-Profiler + + + OID-Profil auswielen + + + OID-Profil bäifügen + + + OID-Profil läschen + + + Dat ausgewielt OID-Profil gëtt onwidderbréiflech geläscht. + + + OID-Profil beaarbechten + + + Passwuert aginn... + + + Tab bäifügen + + + (aus Profil) + + + Nei Subnetmask + + + Server bäifügen + + + SNTP-Server + + + D'Astellungen op dëser Säit enthalen Feeler. Korrigéiert se fir späichere kënnen. + + + SSH-Hostkey, deen fir d'Verbindung benotzt soll ginn (z. B. "71:b8:f2:6e..."). Nëmme verfügbar, wann de Modus "SSH" ass. + + + Vollstännege Pad zur privater Schlësseldatei (z. B. "C:\Users\BornToBeRoot\SSH\private_key.ppk"). Nëmme verfügbar, wann de Modus "SSH" ass. + + + Benotzernumm, deen un d'PuTTY-Session iwwergi gëtt. Nëmme verfügbar, wann de Modus "SSH", "Telnet" oder "Rlogin" ass. + + + ASN + + + AS-Numm + + + Stad + + + Kontinent + + + Land + + + Währung + + + Distrikt + + + DNS-Resolver + + + EDNS + + + Geolokatioun + + + Hosting + + + IP-Geolokatioun + + + ISP + + + Breedegrad + + + Längegrad + + + Mobil + + + Organisatioun + + + PTR-Record + + + Zäitzon + + + Postleitzuel + + + IP Geolocation API - Fast, accurate, reliable + + + DNS-Resolver iwwerpréiwen + + + IP-Geolokatioun iwwerpréiwen + + + Show map + + + De DNS-Resolver gëtt iwwer ip-api.com ermëttelt. + +URL: https://edns.ip-api.com/ + + + D'IP-Geolokatioun gëtt iwwer ip-api.com ermëttelt. + +URL: http://ip-api.com/ + + + Fir zousätzlech Funktiounen ze bidden, gi Servicer vun Drëttubidder benotzt, déi net vu mir bedriwwe ginn. Dir kënnt se hei ënnen ofwielen. Et ginn zu kengem Zäitpunkt Daten un mech iwwermëttelt. + + + DNS-Resolver gëtt gepréift... + + + IP-Geolokatioun gëtt gepréift... + + + Iwwerpréift är Netzwierkverbindung a probéiert et an e puer Sekonnen erëm. + + + ip-api.com Ratelimit erreecht (ze vill Ufroe vun ärem Netzwierk)! +Probéiert et an e puer Sekonnen erëm. + + + HTTP-Statuscode + + + Stol + + + Ratelimit erreecht! Probéiert et an {0} Sekonnen erëm... + + + Allgemeng + + + BSSID + + + Keng erreechbar Hosts fonnt! + + + Applikatioun + + + Aktivéiert experimentell Features fir nei Funktiounen ze testen. Dës sinn nach net vollstänneg, enthalen Feeler, kënnen d'Applikatioun zum Ofstuerz bréngen a kënne sech bis zur Verëffentlechung nach änneren. + + + Experimentell Features + + + Experimental + + + Befeel ausféieren… + + + IP-Geolokatioun + + + E Tab bäifügen fir d'IP-Geolokatioun ofzefroen... + + + Gitt eng Domän an fir Whois ofzefroen... + + + Gitt en Host an fir d'IP-Geolokatioun ofzefroen... + + + Onbekannte Benotzernumm. + + + Authentifizéierungsfeeler (falscht Passwuert, Community oder Key). + + + De Virgang war erfollegräich an ouni Feeler. + + + D'Äntwert op är Ufro war ze grouss fir an eng eenzeg Äntwert ze passen! + + + Déi ugefrot OID konnt net fonnt ginn! + + + E schreif- oder liesgeschützt Objet gouf op e inkonsistente Wäert gesat! + + + Déi ugefrot OID existéiert net an ass net beschreifbar! + + + Et ass e Feeler opgetrueden, fir deen et keng spezifesch Meldung gëtt! + + + Dat ugefrot Objet kann net geännert ginn! + + + D'Objet gouf op en inkompatibelen Datentyp gesat! + + + De Wäert, deen dem Objet zougewise gouf, iwwerschreit seng maximal Längt! + + + D'Kodéierung, déi fir d'Objet benotzt gouf, ass falsch! + + + De Wäert, deen dem Objet zougewise gouf, ass keng gülteg Optioun! + + + Dat ugefrot Objet existéiert net a kann net erstallt ginn! + + + D'MIB-Variabel befënnt sech an engem inkonsistente Status a kann net geännert ginn! + + + Et sinn keng verfügbar Systemressourcen do, fir déi ugefrot Operatioun auszeféieren! + + + Wärend der Set-Operatioun ass e Feeler opgetrueden! + + + Eng Set-Operatioun ass feelgeschloen, a fréier Ännerunge konnten net zréckgeholl ginn! + + + Authentifizéierung feelgeschloen. Iwwerpréift w.e.g. de Community-String! + + + Dat ugefrot Objet ass net beschreifbar a kann net geännert ginn! + + + De Status vum Objet ass inkonsistent a verhënnert d'Set-Operatioun! + + + All zoumaachen + + + Hostusiicht opklappen + + + Expand map view + + + Den Host kann net gesat ginn, wärend aner Hosts bäigefüügt ginn. Waart w.e.g. bis de Virgang ofgeschloss ass a probéiert et erëm. + + + Keng iwwereneestëmmend Befeeler! + + + Remote-Hostname + + + Prozess-ID + + + Prozesspad + + + Prozessnumm + + + NetBIOS + + + Computernumm + + + Feeler + + + OK + + + Warnung + + + Grupp / Domän + + + NetBIOS erreechbar + + + Scan no NetBIOS + + + NetBIOS-Scan ass deaktivéiert! + + + Hostname opléisen ass deaktivéiert! + + + MAC-Adress opléisen ass deaktivéiert! + + + Grupp zoumaachen + + + Befeel ausféieren… (Ctrl+Shift+P) + + + Profildateien + + + Astellungen opmaachen... + + + Erweideren a Sich opmaachen... + + + Ab Windows 11 24H2 musst Dir den Zougang op de WLAN-Adapter erlaben. + +Maacht Windows-Astellungen > Dateschutz & Sécherheet > Standuert op, aktivéiert den Zougang fir Desktop-Apps / NETworkManager a start d'Applikatioun duerno nei. + + + Mat Drag & Drop kënnt Dir d'Applikatioune nei uerdnen. +Rietsklick fir weider Optiounen. + + + Standarde widderhierstellen + + + En einfach ze benotzen Drag'n'Drop-Framework fir WPF. + + + BSD-3-Clause + + + Als Standard festleeën + + + Ubuntu Server mat Docker, Nextcloud an Traefik... + + + Linux-Server, déi an AWS lafen... + + + 6 GHz + + + Ënnerstëtzt dëst Projekt mat enger Spende. + + + Dokumentatioun opmaachen + + + Spenden + + + Profildatei + + + Hosts File Editor + + + Hosts File Editor + + + Schreifgeschützte Modus. D'Ännere vun der Hosts-Datei erfuerdert erhéicht Rechter! + + + Hosts-Datei opmaachen + + + Kommentar + + + Deaktivéieren + + + Entrée beaarbechten + + + Entrée beaarbechten... + + + Entrée aktivéieren + + + Entrée deaktivéieren + + + Aktualiséieren... + + + Aktualiséiert um {0} + + + Hosts-Datei konnt net gelueden ginn: {0} + + + Widderhuelung an {0} Sekonnen... + + + Wat ass nei? + + + Changelog + + + Aktualiséiert op {0} + + + Dës Versioun enthält nei Funktiounen, Verbesserungen a Feelerbehiewungen. All Detailer fannt Dir am Changelog! + + + Entréen + + + Déi ausgewielten Entrée gëtt endgülteg geläscht: + +{0} {1} {2} + + + Primäre DNS-Server + + + Gitt e gültegen Hostname an (z. B. "server-01" oder "example.com")! Méi Hostnamme kënne mat engem Eidelzeechen getrennt ginn. + + + D'Datei "hosts" konnt net gelies ginn! Kuckt d'Logdatei fir méi Detailer. + + + An d'Datei "hosts" konnt net geschriwwe ginn. Kuckt d'Logdatei fir méi Detailer. + + + D'Entrée gouf net an der Datei "hosts" fonnt! Méiglecherweis gouf d'Datei geännert. + + + E Backup vun der Datei "hosts" konnt net erstallt ginn! Kuckt d'Logdatei fir méi Detailer. + + + Statusleescht uweisen + + + Weist d'Statusleescht ënnen lénks am WebView un, wann Dir mat der Maus iwwer e Link fuert. + + + Umeldungsdaten späicheren + + + Weist no enger erfollegräicher Umeldung en Dialog fir d'Umeldungsdaten ze späicheren. + + + Browsing-Daten läschen + + + D'Browsing-Daten (History, Cookies, Cache, Umeldungsdaten asw.) fir dat aktuellt WebView2-Profil dauerhaft läschen. + + + Browsing-Daten + + + Browsing-Daten erfollegräich geläscht! + + + Beim Läsche vun de Browsing-Daten ass e Feeler opgetrueden. Dir kënnt dëse Problem gär op GitHub mellen. + + + Produktioun + + + Tag bäifügen + + + Filter uwenden + + + Profiler filteren... + + + No Tags filteren + + + Keng Tags fonnt! + + + Match + + + Any + + + Grupp bäifügen... + + + All erweideren + + + All anklappen + + + Benotzt benotzerdefinéiert Themes fir d'Aussinn vun der Applikatioun ze personaliséieren. Dir kënnt Themes am Verzeechnes "Program Folder > Themes" beaarbechten oder bäifügen. Méi Informatioune fannt Dir an der Dokumentatioun. + + + Admin-Session (Konsole) + + + D'Profildatei "{0}" gëtt dauerhaft geläscht. + + + Verschlësselung aktivéieren? + + + Wëllt Dir d'Verschlësselung vun der Profildatei aktivéieren fir sensibel Daten wéi Hosts, IP-Adressen, URLen a gespäichert Umeldungsdaten ze schützen? + +Dir kënnt d'Verschlësselung méi spéit zu all Moment aktivéieren oder deaktivéieren, andeems Dir mat der rietser Maustaste op d'Profildatei klickt fir d'Verschlësselungsastellungen ze verwalten. +Wann Dir op „Ofbriechen" klickt, bleift d'Profildatei onverschlësselt. + + + En Neistart ass erfuerderlech, fir Ännerunge wéi d'Sproochastellungen z'iwwerhuelen. + + + Keen vun den uginnenen DNS-Server konnt geparst oder opgeléist ginn. + + + "{0}" konnt net geparst ginn. + + + Maximal Unzuel u Backups + + + Deeglecht Backup erstellen + + + Unzuel u Backups, déi behale ginn, ier dat eelst geläscht gëtt. + + + Dës Astellung gëtt vun Ärem Administrator verwalt. + + + Standard-Späicherplaz widderhierstellen + + + Widderhierstellen + + + Standard-Späicherplaz widderhierstellen? + + + De Standard-Späicherplaz fir d'Astellunge gëtt widderhiergestallt an d'Applikatioun gëtt duerno nei gestart. + +Bei Bedarf kënnt Dir d'Datei „settings.json" vu "{0}" no "{1}" kopéieren fir är bisherég Astellungen ze migréieren. Dofir muss d'Applikatioun zougemaach sinn, fir datt d'Astellungen net iwwerschriwwe ginn. + + + Späicherplaz änneren? + + + De Späicherplaz fir d'Astellunge gëtt geännert an d'Applikatioun gëtt duerno nei gestart. + +Bei Bedarf kënnt Dir d'Datei „settings.json" vu "{0}" no "{1}" kopéieren fir är bisherég Astellungen ze migréieren. Dofir muss d'Applikatioun zougemaach sinn, fir datt d'Astellungen net iwwerschriwwe ginn. + + + Gitt e gültegen Uerdnerpad an! + + + De Späicherplaz fir d'Profiler gëtt geännert an d'Applikatioun gëtt duerno nei gestart. + +Bei Bedarf kënnt Dir är Profildateie vu "{0}" no "{1}" kopéieren fir är bisherég Profiler ze migréieren. Dofir muss d'Applikatioun zougemaach sinn, fir datt d'Profiler net iwwerschriwwe ginn. + + + De Standard-Späicherplaz fir d'Profiler gëtt widderhiergestallt an d'Applikatioun gëtt duerno nei gestart. + +Bei Bedarf kënnt Dir är Profildateie vu "{0}" no "{1}" kopéieren fir är bisherég Profiler ze migréieren. Dofir muss d'Applikatioun zougemaach sinn, fir datt d'Profiler net iwwerschriwwe ginn. + + + Netzwierkverbindung + + + Netzwierkstatus + + + Active-Directory-Import feelgeschloen. + + + Optiounen + + + + Benotzt är aktuell Windows-Umeldungsdaten fir aus dem Active Directory ze liesen. De Kont muss berechtegt sinn, Computerobjeten ënnerhalb vun der Sichbasis (Deelbaum) opzelëschten. + + + Sichbasis (DN) + + + Zousätzleche LDAP-Filter + + + De Filter muss e gültegen LDAP-Ausdrock sinn, deen mat '(' ufänkt a mat ')' ophält. + + + D'Sichbasis muss e gültegen LDAP-Distinguished-Name sinn (z. B. DC=example,DC=com). + + + Aus Active Directory importéiert den {0} + + + Keng Computer fir déi uginn Sichbasis an de Filter fonnt. + + + Active Directory gëtt duerchsicht… + + + Wann Äre Computer net zur Domän gehéiert, gitt de Domänecontroller (Hostname oder IP) un a benotzt benotzerdefinéiert Umeldungsdaten. + + + Server (optional) + + + Port (optional) + + + SSL benotzen (LDAPS) + + + Aktuell Windows-Umeldungsdaten benotzen + + + Dës Umeldungsdaten benotzen + + + Erweidert + + + All auswielen + + + All ofwielen + + + Aktivéieren fir + + + Schonn importéiert iwwersprangen + + + {0} · {1} Resultat(er) + + + {0} Profil(er) importéiert. +{1} duebel Entréen iwwersprangen. +{2} ouni Host iwwersprangen. + + + Active Directory + + + CSV-Fichier + + + CSV-Fichier + + + Profiler aus enger CSV-Fichier importéieren + + + Importéiert aus enger CSV-Fichier den {0} + + + Et goufen keng Aträg an der CSV-Fichier fonnt. + + + Erwaart CSV-Format — een Profil pro Zeil: + + + Eng Header-Zeil an den Trennzeechen (Semikolon, Komma oder Tab) ginn automatesch erkannt. D'Beschreiwungs-Kolonn ass optional. Aträg ouni Host kënnen net importéiert ginn. + + + Importresultater + + + Nei + + + Importéiert + + + Keen Host + + + Deaktivéiert Konten ausschléissen + + + Computer aus Active Directory importéieren + + + Computer aus Active Directory importéieren… + + + Profiler importéieren + + + Quell + + + Active Directory + + + Profilgrupp + + + Bestoende oder neie Gruppennumm + + + Firewall + + + Firewall-Reegelen + + + Windows-Firewall-Astellungen + + + Richtung + + + Erakommend + + + Erausgoend + + + Aktioun + + + Zoulossen + + + Blockéieren + + + Netzwierkprofil + + + Netzwierkprofiler + + + Schnëttstellentyp + + + Firewall-Reegele konnten net gelueden ginn. {0} + + + Déi ausgewielte Firewall-Reegel gëtt endgülteg geläscht: + +{0} + + + Beléiweg + + + TCP + + + UDP + + + ICMPv4 + + + ICMPv6 + + + HOPOPT + + + GRE + + + IPv6 + + + IPv6-Route + + + IPv6-Frag + + + IPv6-NoNxt + + + IPv6-Opts + + + VRRP + + + PGM + + + L2TP + + + Beléiweg + + + Kabelgebonnen + + + Kabellos + + + Remote-Zougang + + + Schreifgeschützte Modus. Fir Firewall-Reegelen z'änneren sinn erweidert Rechter erfuerderlech! + + + Erakommend + + + Erausgoend + + + Blockéieren + + + Zoulossen + + + Lokal Ports + + + Remote Ports + + + Lokal Adressen + + + Remote Adressen + + + Gitt eng gülteg IP-Adress, e Subnet (z. B. 10.0.0.0/8), e Beräich (z. B. 10.0.0.1-10.0.0.10) oder e Schlësselwuert an (Any, LocalSubnet, DNS, DHCP, WINS, DefaultGateway, Internet, Intranet, IntranetRemoteAccess, PlayToDevice, CaptivePortal) + + + Reegel bäifügen + + + Reegel bäifügen... + + + Reegel beaarbechten + + + Reegel beaarbechten... + + + Reegel läschen + + + Reegel aktivéieren + + + Reegel deaktivéieren + + + Profiler importéieren… + + + Speedtest + + + Speedtest ausféieren + + + Metadaten ofruffen... + + + Latenz moossen... + + + Download-Geschwindegkeet moossen... + + + Upload-Geschwindegkeet moossen... + + + Moosst Download- an Upload-Geschwindegkeeten, Latenz a Jitter mat speed.cloudflare.com. +Cloudflare späichert méiglecherweis är IP-Adress an Netzwierkinformatiounen. Méi Informatioune fannt Dir an der Dateschutzerklärung vu Cloudflare. + + + Latenz + + + Jitter + + + E Speedtest-Déngscht, mat deem Download- an Upload-Geschwindegkeet, Latenz a Jitter gemooss kënne ginn. + + + Stoppen + + diff --git a/Source/NETworkManager.Localization/Resources/Strings.nl-NL.resx b/Source/NETworkManager.Localization/Resources/Strings.nl-NL.resx index 6fb5c9782c..753ff3c947 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.nl-NL.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.nl-NL.resx @@ -138,8 +138,32 @@ ARP - - ARP Tafel + + Neighbor Table + + + Read-only mode. Modifying the neighbor table requires elevated rights! + + + Unreachable + + + Incomplete + + + Probe + + + Delay + + + Stale + + + Reachable + + + Permanent Authenticatie @@ -285,12 +309,24 @@ Netwerkinterface + + Configuration applied + + + Configuring the network interface requires elevated rights! + Nieuw tabblad + + Next + OUI + + Options + Overschrijven? @@ -348,9 +384,6 @@ Instellingen - - Instellingen zijn gereset! - SNMP @@ -444,6 +477,18 @@ Beschrijving + + Placeholder + + + Path to the file or executable to run. The following placeholders can be used: + + + Arguments passed to the file or executable. The following placeholders can be used: + + + The following placeholder can be used: + DHCP ingeschakeld @@ -489,6 +534,30 @@ IPv4 adres + + IPv4 address added + + + IPv4 address removed + + + IPv4 address released and renewed + + + IPv4 address released + + + IPv4 address renewed + + + IPv6 address released and renewed + + + IPv6 address released + + + IPv6 address renewed + IPv4-Default-Gateway @@ -504,11 +573,23 @@ IPv6-Default-Gateway + + Map + + + (+{0} more) + + + Scroll = Zoom, Drag = Pan + + + Unknown + Maximaal - - Maximum hops/router + + Maximum hops Minimize main window instead of terminating the application @@ -561,9 +642,6 @@ Opnieuw opstarten vereist - - Some settings are applied only after restarting the application! - Save settings in the application folder @@ -577,7 +655,7 @@ Toon de volgende applicatie bij het opstarten: - Een krachtig hulpmiddel voor het beheren van netwerken en het oplossen van netwerkproblemen! + A powerful open-source tool for managing networks and troubleshooting network problems! Snelheid @@ -594,11 +672,8 @@ Static IPv4 DNS server - - Subnetmask - - - Subnetmask or CIDR + + Subnet mask Draden @@ -621,8 +696,8 @@ Timeout (ms) - - Time to wait between each ping + + Time (ms) to wait between each ping TTL @@ -663,9 +738,6 @@ Voeg een tabblad toe om een trace uit te voeren... - - Add a tab to query the HTTP headers... - Add DNS suffix (primary) to hostname @@ -691,7 +763,7 @@ Van toepassing zijn - Apply Windows key combinations (e.g. ALT+TAB): + Apply Windows key combinations (e.g., ALT+TAB): Auth @@ -720,6 +792,9 @@ Caps lock is ingeschakeld! + + Chart time (seconds) + Controleren op updates bij het opstarten @@ -821,9 +896,6 @@ First make a backup copy of your profile files before enabling encryption! DNS server - - Open documentatie - Domain @@ -842,7 +914,7 @@ First make a backup copy of your profile files before enabling encryption! Eindtijd - + Enter a subnet to calculate it... @@ -866,9 +938,6 @@ First make a backup copy of your profile files before enabling encryption! Vaste schermgrootte: - - Star/Fork the Project on GitHub - Gevonden @@ -969,6 +1038,9 @@ Creëer er een... OID + + Only CSV files are allowed! + Alleen bij gebruik van het volledige scherm @@ -993,12 +1065,6 @@ Creëer er een... override - - Overwrite settings in the destination folder? - -"Overwrite" will overwrite the file in the destination folder. -"Use other" will use the existing settings file in the destination and restart the application. - Wachtwoord @@ -1029,9 +1095,6 @@ Creëer er een... PuTTY process has ended! - - PuTTY profiel - Vragen @@ -1098,18 +1161,6 @@ Creëer er een... Select a screen resolution - - The selected settings are overwritten! - - - The selected settings are reset. - - - Select the settings you want to export: - - - Select the settings you want to import: - This will reset all settings! @@ -1117,7 +1168,7 @@ Creëer er een... Serial - SerialLine + Serial line Service @@ -1126,15 +1177,6 @@ Creëer er een... The settings file found was corrupted or is not compatible with this version. All settings have been reset! (Profile files are not affected!) - - Settings successfully exported! - - - Settings successfully imported! - - - Settings successfully reset! - Show closed ports @@ -1144,8 +1186,8 @@ Creëer er een... Show only most common query types - - Show scan result for all IP addresses + + Show unreachable IP addresses and ports Show statistics @@ -1190,7 +1232,7 @@ Creëer er een... The settings location is not affected - Timeout on SNMP query. + Timeout on SNMP query. Maybe the host is not reachable or the community / password is wrong. Timeout when querying the DNS server with the IP address "{0}"! @@ -1204,8 +1246,8 @@ Creëer er een... Unkown error! - - Untray / Bring window to front + + Untray / Bring window to foreground URL @@ -1309,6 +1351,9 @@ Creëer er een... Lege DNS-cache + + DNS cache flushed + Decrypt and load your credentials to select them. @@ -1366,12 +1411,12 @@ Creëer er een... Overschrijven + + Parse + Invoegen - - C:\Program Files\PuTTY\putty.exe - Reconnect @@ -1409,22 +1454,22 @@ Creëer er een... Aansluitingen - Voer een geldig ip-bereik in! + Enter a valid IP range! Voer een geldig IPv4-adres in! - Voer een geldig MAC-adres in (zoals 00:F1:23:AB:F2:35)! + Enter a valid MAC address (e.g., 00:F1:23:AB:F2:35)! Voer een geldige poort in (1 - 65535)! - Voer een geldig subnetmasker in (zoals 255.255.255.0)! + Enter a valid subnetmask (e.g., 255.255.255.0)! - Voer een geldig subnetmask of CIDR in (zoals 255.255.255.0 of / 24)! + Enter a valid subnetmask or CIDR (e.g., 255.255.255.0 or /24)! Veld kan niet leeg zijn! @@ -1496,10 +1541,10 @@ Creëer er een... Voer een geldige poort en/of poortbereik in (1 - 65535)! - Voer een geldig subnet in (zoals 192.168.178.133/26)! + Enter a valid subnet (e.g., 192.168.178.133/26)! - Voer een geldige website in (zoals https://example.com/index.html) + Enter a valid website (e.g., https://example.com/index.html) Groen @@ -1534,6 +1579,9 @@ Creëer er een... Limoen + + Live + Magenta @@ -1762,9 +1810,6 @@ Creëer er een... Geel - - Enter a valid value between 25 and 100! - A profile with this name already exists! @@ -1793,7 +1838,10 @@ Creëer er een... Add a tab to query whois... - Enter a valid domain (like "example.com")! + Enter a valid domain (e.g., "example.com")! + + + Enter a valid Windows username (e.g., "user", "DOMAIN\user" or "user@domain.com")! Whois server not found for the domain: "{0}" @@ -1837,9 +1885,6 @@ Creëer er een... Configure the path to TigerVNC in the settings... - - TigerVNC locatie... - TigerVNC process has ended! @@ -1903,11 +1948,11 @@ Creëer er een... IPv4-adres toevoegen - - Host threads + + Max. concurrent host threads - - Port threads + + Max. concurrent port threads PowerShell @@ -1924,9 +1969,6 @@ Creëer er een... Remote console - - PowerShell-locatie... - Bestandspad @@ -1964,11 +2006,11 @@ Creëer er een... Achtergrond baan - The background job will save settings, profiles and credentials every x-minutes. + The background job will save settings and profiles every x-minutes. Value 0 will disable this feature. -Changing this value requires a restart of the application to take effect. +Changes to this value will take effect after restarting the application. Run background job every x-minute @@ -1980,15 +2022,15 @@ Changing this value requires a restart of the application to take effect.Dashboard - All settings can be changed later in the settings + All settings can be changed later in the settings! Controleer openbaar IP adres - - Bedankt voor het gebruik van NETworkManager! + + Thank you for using NETworkManager! -Om extra functies te bieden, gebruikt de applicatie diensten op internet die niet door mij worden beheerd. Er worden op geen enkel moment gegevens aan mij verzonden. +If you enjoy it, please consider supporting its development — whether by leaving a star on GitHub, making a donation, or simply sharing it with others. Your support helps keep the project going and growing. When starting the program, it checks in the background whether a new program version is available on GitHub. @@ -2009,14 +2051,14 @@ URL: https://api.ipify.org/ Externe dienstverlening - + Star/Fork the Project on GitHub. - + Help translate the project on Transifex. - - Contact via Twitter. + + Follow or contact me via X. Aansluiting @@ -2036,15 +2078,6 @@ URL: https://api.ipify.org/ Check your network adapter configuration (dhcp, static ip) and if you are connected to a network. - - Fout - - - OK - - - Waarschuwing - Could not detect gateway ip address! @@ -2097,8 +2130,8 @@ is disabled! Use custom IPv4 address API - - URL to a web service that can be reached via http or https and returns an IP address as response. + + URL to a web service that can be reached via http or https and returns an IPv4 address e.g., "xx.xx.xx.xx" as response. Could not parse public ip address from "{0}"! Try another service or use the default... @@ -2172,6 +2205,12 @@ is disabled! Visuele stijlen + + View only + + + Block keyboard and mouse input to the remote session + Remote audio @@ -2217,24 +2256,39 @@ is disabled! Program + + Private + + + Public + The selected custom command will be deleted permanently. - - The following variables are available: - -$$ipaddress$$ --> IP adresse -$$hostname$$ --> Hostname - Restart - + Could not resolve ip address for hostname! Ctrl+Alt+Del + + Task Manager (Ctrl+Shift+Esc) + + + Lock (Win+L) + + + Show Desktop (Win+D) + + + Explorer (Win+E) + + + Run dialog (Win+R) + Keyboard shortcuts @@ -2271,8 +2325,8 @@ $$hostname$$ --> Hostname Show status window on network change - - Time in seconds how long the window should be displayed + + Time in seconds how long the status window is shown WiFi @@ -2298,12 +2352,18 @@ $$hostname$$ --> Hostname Channel + + Channel width + 2.4 GHz 5 GHz + + 2.4 & 5 GHz + Signal strength @@ -2343,10 +2403,7 @@ $$hostname$$ --> Hostname Timeout (s) - - Report an issue or create a feature request - - + Report an issue or create a feature request. @@ -2388,12 +2445,39 @@ $$hostname$$ --> Hostname Could not resolve ip address for: "{0}" + + Notification + + + Show notification popup on status change + + + Play sound on status change + + + Success threshold + + + Number of consecutive successful pings required before a "Host is up" notification is shown. Higher values reduce noise from flapping hosts. + + + Failure threshold + + + Number of consecutive failed pings (timeouts) required before a "Host is down" notification is shown. Higher values reduce noise from flapping hosts. + + + Display duration (seconds) + + + Host is up + + + Host is down + The application will be restarted... - - Use other folder - Could not export file! See error message: "{0}" @@ -2409,8 +2493,8 @@ $$hostname$$ --> Hostname Is encrypted - - Open documentation on GitHub. + + Open the documentation. Customer 1 @@ -2439,9 +2523,6 @@ $$hostname$$ --> Hostname Delete profile file - - Selected profile file will be deleted permanently. - All profiles in this profile file will be permanently deleted! @@ -2464,7 +2545,7 @@ $$hostname$$ --> Hostname Restart as Administrator - To analyze network packets, the application must be started with elevated rights! + Analysing network packets requires elevated rights! Capture @@ -2493,13 +2574,13 @@ $$hostname$$ --> Hostname Discovery Protocol - + CDP - + LLDP - + LLDP / CDP @@ -2532,8 +2613,8 @@ $$hostname$$ --> Hostname Microsoft.Windows.SDK.Contracts is required for this feature but not available on this system (e.g. on Windows Server). - - ARP Table + + Neighbor Table Connections @@ -2670,133 +2751,46 @@ $$hostname$$ --> Hostname Yellow - + Steel - + General - - DNS Lookup - - - HTTP Headers - - - IP Scanner - - - Network Interface - - - Ping - - - Ping Monitor - - - Port Scanner - - - PowerShell - - - PuTTY - - - Remote Desktop - - - TigerVNC - - - Traceroute - - - Wake on LAN - - - Web Console - - - Whois - - + Applications - + General - + Appearance - + Autostart - - Dashboard - - - DNS Lookup - - + General - + HotKeys - - HTTP Headers - - - IP Scanner - - + Language - - Ping Monitor - - - Port Scanner - - - PowerShell - - + Profiles - - PuTTY - - - Remote Desktop - - + Settings - - SNMP - - + Status - - TigerVNC - - - Traceroute - - + Update - - Wake On LAN - - - Whois - - + Window @@ -2827,7 +2821,7 @@ $$hostname$$ --> Hostname SSH log - SSH and Raw Log + SSH and Raw log Enter a valid file name! @@ -2889,13 +2883,17 @@ $$hostname$$ --> Hostname SSID - - Profile could not be loaded! + + Profile file could not be loaded! - - If this happened after an update, you may need to migrate the profiles to a newer version. When you click "Migrate", a PowerShell window opens with the migration script. Check the path and press Enter. + + The profile file could not be loaded and may be corrupted. You can try to restore the file from a backup or delete it. + +If this happens unexpectedly or after an update, please report the error on GitHub. + -Otherwise, the profile may be corrupted and you want to report the issue on GitHub. +Error message: +"{0}" Edit group... @@ -2933,25 +2931,12 @@ Otherwise, the profile may be corrupted and you want to report the issue on GitH Merge - - The destination folder already contains files. If you click Merge, the current profiles are copied to the folder. - - - Overwrite profiles in destination folder? - -"Overwrite" will copy the profile files to the destination folder and overwrite existing profile files. -"Merge" will copy the profile files to the destination folder, but won't overwrite exitsting profile files. -"Use other folder" will use the existing profile files in the destination folder. - Use other Move - - Profile files will be moved to the selected destination folder. - Last scan at {0} @@ -2980,7 +2965,7 @@ Otherwise, the profile may be corrupted and you want to report the issue on GitH C# library take care of complex network, IP, IPv4, IPv6, netmask, CIDR, subnet, subnetting, supernet, and supernetting calculation for .NET developers. - Simple, flexible, interactive & powerful charts, maps and gauges for .Net + Beautiful, interactive charts, maps, and gauges. A collection of loading indicators for WPF @@ -3009,8 +2994,11 @@ Otherwise, the profile may be corrupted and you want to report the issue on GitH List of Top-Level-Domains from iana.org, which is used to query whois servers of the TLD from whois.iana.org via port 43 + + GeoJSON conversion of Natural Earth vector map data (CC0-1.0). + - Sanitized IEEE OUI Data from linuxnet.ca. + OUI data from ieee.org. Service Name and Transport Protocol Port Number Registry from iana.org. @@ -3060,10 +3048,10 @@ Enable profile file encryption in Settings>Profile to store credentials secur Enter a valid IPv6 address! - Public accessible IPv4 address. + Public IPv4 address reachable via ICMP. - Public accessible IPv6 address. + Public IPv6 address reachable via ICMP. Public IPv4 address @@ -3140,7 +3128,1366 @@ Enable profile file encryption in Settings>Profile to store credentials secur Selected profiles will be deleted permanently. - - Unlock the profile file to add, change or delete a profile! + + Use custom themes + + + Custom themes + + + Reset settings? + + + Settings reset! + + + Instance ID + + + Local connection + + + Local interface + + + log4net is a tool to help the programmer output log statements to a variety of output targets. + + + Enabled + + + Region + + + Profiles and regions to synchronize + + + Default profile + + + Default region + + + Group name cannot start with "{0}"! + + + Check for pre-releases + + + Synchronization is disabled! + + + Command + + + Apply theme to PowerShell console + + + The color of the PowerShell console can be changed to the application theme under Settings > General > Appearance + + + If you enable this option, the default PowerShell console settings in the registry under HKCU:\Console are overridden so that the PowerShell console window matches the application theme. This is a global system setting that may affect the appearance of the normal PowerShell window. + +Only the PowerShell consoles configured in the PowerShell settings are modified. Both Windows PowerShell and PWSH (PowerShell 7 and higher) are supported. + +Click in the upper right corner on the help / documentation button (left of the minimize button) or navigate to https://borntoberoot.net/NETworkManager/Documentation/Settings/Appearance for more details. Here are the values documented which will be adjusted. + +If the option is disabled again, the values are no longer modified. However, the original values are NOT restored. + + + Input cannot end with a ";"! + + + Input does not contain any text! + + + Bit Calculator + + + Bit Calculator + + + Notation + + + Input + + + Unit + + + Bits + + + Gigabits + + + Gigabytes + + + Kilobits + + + Kilobytes + + + Megabits + + + Megabytes + + + Petabits + + + Petabytes + + + Terabits + + + Terabytes + + + Enter a number and select a unit to calculate the units... + + + Network + + + Proxy + + + Resolve IP address for this host (IPv4 is preferred) + + + A valid path to PowerShell should end with "pwsh.exe" or "powershell.exe"! + + + A valid path to PuTTY should end with "PuTTY.exe"! + + + A valid path to TigerVNC should end with "vncviewer-*.exe" or "vncviewer64-*.exe"! + + + SNTP Lookup + + + Move a .NET Framework/.NET Core app runtime components and dependencies into a sub-directory and make it beauty. + + + Add a tab to perform a SNTP lookup... + + + SNTP server(s) + + + URL to a web service that can be reached via http or https and returns an IPv6 address e.g., "xxxx:xx:xxx::xx" as response. + + + IP endpoint + + + Local end time + + + Local start time + + + Network time + + + Offset + + + Round trip delay + + + Server + + + SNTP Lookup + + + Add SNTP server + + + Delete SNTP server + + + The selected SNTP server will be deleted permanently. + + + Edit SNTP server + + + An SNTP server with this name already exists! + + + Enter a valid hostname (e.g., "server-01" or "example.com") or a valid IP address (e.g., 192.168.178.1)! + + + Server(s) + + + Enter master password to unlock the profile file: + + + Unlock profile file + + + Timed out + + + Hostkey + + + The settings will be reset and the application will be restarted afterwards! + + + Instellingen zijn gereset! + + + Ping status + + + ThreadPool additional min. threads + + + This setting specifies the minimum number of threads that will be created from the application's ThreadPool on demand. This can improve the performance for example of the IP scanner or port scanner. + +The value is added to the default min. threads (number of CPU threads). The value 0 leaves the default settings. If the value is higher than the default max. threads of the ThreadPool, this value is used. + +If the value is too high, performance problems may occur. + +Changes to this value will take effect after the application is restarted. Whether the value was set successfully can be seen in the log file under %LocalAppData%\NETworkManager\NETworkManager.log + + + These settings only change the maximum number of concurrently executed threads per host/port scan. Go to Settings > General > General to adjust the (min) threads of the application. + + + Port status + + + Ping details + + + No open ports found! + + + Port scan is disabled! + + + Scan ports + + + Could not find the application "{0}". Maybe the application was hidden in the settings? + + + Status window + + + Show address bar + + + Enabling this setting is not recommended. Multiple instances of the application share the same settings and profile files. The last instance to be closed may overwrite changes made by other instances. + + + Bypass for local addresses + + + Enable gateway server + + + Logon method + + + Gateway server + + + Server name + + + Share Gateway credentials with remote computer + + + Allow me to select later + + + Smart card or Windows Hello for Business + + + Ask for password (NTLM) + + + Use gateway credentials + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server is temporarily unavailable. Try reconnecting later or contact your network administrator for assistance. + + + Your computer can't connect to the remote computer due to one of the following reasons: 1) The requested Remote Desktop Gateway server address and the server SSL certificate subject name do not match. 2) The certificate is expired or revoked. 3) The certificate root authority does not trust the certificate. Contact your network administrator for assistance. + + + This computer can't verify the identity of the RD Gateway "". It's not safe to connect to servers that can't be identified. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server address requested and the certificate subject name do not match. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server's certificate has expired or has been revoked. Contact your network administrator for assistance. + + + An error occurred while sending data to the Remote Desktop Gateway server. The server is temporarily unavailable or a network connection is down. Try again later, or contact your network administrator for assistance. + + + An error occurred while receiving data from the Remote Desktop Gateway server. Either the server is temporarily unavailable or a network connection is down. Try again later, or contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server address is unreachable or incorrect. Type a valid Remote Desktop Gateway server address. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server is running low on server resources and is temporarily unavailable. Try reconnecting later or contact your network administrator for assistance. + + + The Remote Desktop Gateway server has ended the connection. Try reconnecting later or contact your network administrator for assistance. + + + The Remote Desktop Gateway server administrator has ended the connection. Try reconnecting later or contact your network administrator for assistance. + + + Remote Desktop can't connect to the remote computer "" for one of these reasons: 1) Your user account is not listed in the RD Gateway's permission list 2) You might have specified the remote computer in NetBIOS format (for example, computer1), but the RD Gateway is expecting an FQDN or IP address format (for example, computer1.fabrikam.com or 157.60.0.1). Contact your network administrator for assistance. + + + Remote Desktop can't connect to the remote computer "" for one of these reasons: 1) Your user account is not authorized to access the RD Gateway "" 2) Your computer is not authorized to access the RD Gateway "" 3) You are using an incompatible authentication method (for example, the RD Gateway might be expecting a smart card but you provided a password) Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because your network administrator has restricted access to this RD Gateway server. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the web proxy server requires authentication. To allow unauthenticated traffic to an RD Gateway server through your web proxy server, contact your network administrator. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server reached its maximum allowed connections. Try reconnecting later or contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server does not support the request. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the client does not support one of the Remote Desktop Gateway's capabilities. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server and this computer are incompatible. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because no certificate was configured to use at the Remote Desktop Gateway server. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the RD Gateway server that you are trying to connect to is not allowed by your computer administrator. If you are the administrator, add this Remote Desktop Gateway server name to the trusted Remote Desktop Gateway server list on your computer and then try connecting again. + + + Your computer can't connect to the remote computer because your computer or device did not meet the Network Access Protection requirements set by your network administrator, for one of the following reasons: 1) The Remote Desktop Gateway server name and the server's public key certificate subject name do not match. 2) The certificate has expired or has been revoked. 3) The certificate root authority does not trust the certificate. 4) The certificate key extension does not support encryption. 5) Your computer cannot verify the certificate revocation list. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because a user name and password are required to authenticate to the Remote Desktop Gateway server instead of smart card credentials. + + + Your computer can't connect to the remote computer because smart card credentials are required to authenticate to the Remote Desktop Gateway server instead of a user name and password. + + + Your computer can't connect to the remote computer because an invalid cookie was sent to the Remote Desktop Gateway server. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the cookie was rejected by the Remote Desktop Gateway server. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server is expecting an authentication method different from the one attempted. Contact your network administrator for assistance. + + + The RD Gateway connection ended because periodic user authentication failed. Try reconnecting with a correct user name and password. If the reconnection fails, contact your network administrator for further assistance. + + + The RD Gateway connection ended because periodic user authorization failed. Try reconnecting with a correct user name and password. If the reconnection fails, contact your network administrator for further assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway and the remote computer are unable to exchange policies. This could happen due to one of the following reasons: 1. The remote computer is not capable of exchanging policies with the Remote Desktop Gateway. 2. The remote computer's configuration does not permit a new connection. 3. The connection between the Remote Desktop Gateway and the remote computer ended. Contact your network administrator for assistance. + + + The RD Gateway connection ended because periodic user authorization failed. Your computer or device didn't pass the Network Access Protection (NAP) requirements set by your network administrator. Contact your network administrator for assistance. + + + Connected + + + Error while scanning WiFi adapter "{0}" with error: "{1}" + + + Connect... + + + {0} disconnected! + + + Connect to {0} + + + WPS + + + Connect automatically + + + Pre-shared key + + + Connecting to {0}... + + + Could not connect to {0} ({1})! + + + Successfully connected to {0}! + + + Access to the network has been revoked + + + Invalid credentials + + + Network not available + + + Successful + + + Connection attempt timed out + + + -/- + + + Authentication protocol is not supported! + + + Checking WPS... + + + Open OID profiles... + + + MIB + + + OID profiles + + + Select OID profile + + + Add OID profile + + + Delete OID profile + + + The selected OID profile will be deleted permanently. + + + Edit OID profile + + + Enter password... + + + Add tab + + + (from profile) + + + New subnet mask + + + Add server + + + SNTP server + + + The settings on this page contain errors. Correct them to be able to save. + + + SSH hostkey to use for the connection (e.g., "71:b8:f2:6e..."). Only available if the mode is "SSH". + + + Full path to the private key file (e.g., "C:\Users\BornToBeRoot\SSH\private_key.ppk"). Only available if the mode is "SSH". + + + Username that will be passed into the PuTTY session. Only available if the mode is "SSH", "Telnet" or "Rlogin". + + + ASN + + + AS Name + + + City + + + Continent + + + Country + + + Currency + + + District + + + DNS resolver + + + EDNS + + + Geolocation + + + Hosting + + + IP geolocation + + + ISP + + + Latitude + + + Longitude + + + Mobile + + + Organization + + + PTR record + + + Timezone + + + Zip + + + IP Geolocation API - Fast, accurate, reliable + + + Check DNS resolver + + + Check IP geolocation + + + Show map + + + The DNS resolver is determined via ip-api.com. + +URL: https://edns.ip-api.com/ + + + The IP geolocation is determined via ip-api.com. + +URL: http://ip-api.com/ + + + To provide additional features, third party services are used that are not operated by me. You can deselect them below. No data is transferred to me at any time. + + + Checking DNS resolver... + + + Checking IP geolocation... + + + Check your network connection and try again in a few seconds. + + + ip-api.com rate limit reached (too many requests from your network)! +Try again in a few seconds. + + + HTTP status code + + + Steel + + + Rate limit reached! Try again in {0} seconds... + + + General + + + BSSID + + + No reachable hosts found! + + + Application + + + Enable experimental features to test new functions. These are not yet complete, contain bugs, can crash the application and may change again until release. + + + Experimental features + + + Experimental + + + Run command... + + + IP Geolocation + + + Add a tab to query the IP geolocation... + + + Enter a domain to query whois... + + + Enter host to query IP geolocation... + + + Unknown user name. + + + Authentication failure (incorrect password, community or key). + + + The operation was successful without any errors. + + + The response to your request was too large to fit into a single response! + + + The requested OID could not be found! + + + A read-write or write-only object was set to an inconsistent value! + + + The requested OID does not exist and is not writable! + + + An error occurred for which no specific message is available! + + + The requested object is not accessible for modification! + + + The object was set to an incompatible data type! + + + The value assigned to the object exceeds its maximum length! + + + The encoding used for the object is incorrect! + + + The value assigned to the object is not a valid choice! + + + The requested object does not exist and cannot be created! + + + The MIB variable is currently in an inconsistent state and cannot be modified! + + + There are no available system resources to perform the requested operation! + + + An error occurred during the set operation! + + + A set operation failed, and previous changes could not be rolled back! + + + Authentication failed. Please check the community string! + + + The requested object is not writable and cannot be modified! + + + The object's state is inconsistent, preventing the set operation! + + + Close all + + + Expand host view + + + Expand map view + + + Host cannot be set while other hosts are being added. Please wait until the process is complete and try again. + + + No matching commands! + + + Remote hostname + + + Process ID + + + Process path + + + Process name + + + NetBIOS + + + Computer name + + + Error + + + OK + + + Warning + + + Group / domain + + + NetBIOS reachable + + + Scan for NetBIOS + + + NetBIOS scan is disabled! + + + Resolve Hostname is disabled! + + + Resolve MAC address is disabled! + + + Close group + + + Run command... (Ctrl+Shift+P) + + + Profile files + + + Open settings... + + + Expand and open search... + + + Starting with Windows 11 24H2, you’ll need to allow access to the Wi-Fi adapter. + +Open Windows Settings > Privacy & security > Location, enable access for Desktop Apps / NETworkManager, then restart the application. + + + Drag and drop the applications to reorder them. +Right-click for more options. + + + Restore defaults + + + An easy to use drag'n'drop framework for WPF. + + + BSD-3-Clause + + + Set default + + + Ubuntu Server running Docker with Nextcloud and Traefik... + + + Linux servers running in AWS... + + + 6 GHz + + + Support this project with a donation. + + + Open documentatie + + + Donate + + + Profile file + + + Hosts File Editor + + + Hosts File Editor + + + Read-only mode. Modifying the hosts file requires elevated rights! + + + Open hosts file + + + Comment + + + Disable + + + Edit entry + + + Edit entry... + + + Enable entry + + + Disable entry + + + Refreshing... + + + Reloaded at {0} + + + Failed to load hosts file: {0} + + + Retrying in {0} seconds... + + + What's new? + + + Changelog + + + Upgraded to {0} + + + This release includes new features, improvements, and bug fixes. Check out the changelog for all the details! + + + Entries + + + The selected entry is permanently deleted: + +{0} {1} {2} + + + Primary DNS server + + + Enter a valid hostname (e.g., "server-01" or "example.com")! Multiple hostnames can be separated with a space. + + + The "hosts" file could not be read! See log file for more details. + + + The "hosts" file could not be written to. See log file for more details. + + + The entry was not found in the "hosts" file! Maybe the file has been modified. + + + A backup of the "hosts" file could not be created! See log file for more details. + + + Show status bar + + + Displays the status bar in the bottom-left of the WebView when hovering over a link. + + + Save credentials + + + Displays a dialog to save credentials after a successful sign-in. + + + Delete browsing data + + + Permanently delete browsing data (history, cookies, cache, credentials, etc.) for the current WebView2 profile. + + + Browsing Data + + + Browsing data successfully deleted! + + + An error occurred while deleting browsing data. Feel free to report this issue on GitHub. + + + production + + + Add tag + + + Apply filter + + + Filter profiles... + + + Filter by tags + + + No tags found! + + + Match + + + Any + + + Add group... + + + Expand all + + + Collapse all + + + Use custom themes to personalize the appearance of the application. You can edit or add theme in the "Program Folder > Themes" directory. For more details, refer to the documentation. + + + Admin (console) session + + + Profile file "{0}" will be deleted permanently. + + + Enable encryption? + + + Do you want to enable profile file encryption to protect sensitive data such as hosts, IP addresses, URLs, and stored credentials? + +You can enable or disable encryption later at any time by right-clicking the profile file to manage encryption settings. +If you click Cancel, the profile file will remain unencrypted. + + + A restart is required to apply changes such as language settings. + + + Could not parse or resolve any of the specified DNS servers. + + + Could not parse "{0}". + + + Maximum number of backups + + + Create daily backup + + + Number of backups that are retained before the oldest one is deleted. + + + This setting is managed by your administrator. + + + Restore default location + + + Restore + + + Restore default location? + + + The default settings location is restored and the application is restarted afterwards. + +You can copy the “settings.json” file from "{0}" to "{1}" to migrate your previous settings, if necessary. The application must be closed for this to prevent the settings from being overwritten. + + + Change location? + + + The settings location is changed and the application is restarted afterwards. + +You can copy the “settings.json” file from "{0}" to "{1}" to migrate your previous settings, if necessary. The application must be closed for this to prevent the settings from being overwritten. + + + Enter a valid folder path! + + + The profiles location is changed and the application is restarted afterwards. + +You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. + + + The default profiles location is restored and the application is restarted afterwards. + +You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. + + + Network connection + + + Network Status + + + Active Directory import failed. + + + Options + + + + Uses your current Windows credentials to read from Active Directory. The account must be allowed to enumerate computer objects under the search base (subtree). + + + Search base (DN) + + + Additional LDAP filter + + + Filter must be a valid LDAP expression starting with '(' and ending with ')'. + + + Search base must be a valid LDAP distinguished name (e.g. DC=example,DC=com). + + + Imported from Active Directory on {0} + + + No computers found for the given search base and filter. + + + Searching Active Directory... + + + If your computer is not joined to the domain, specify the domain controller (hostname or IP) and use custom credentials. + + + Server (optional) + + + Port (optional) + + + Use SSL (LDAPS) + + + Use current Windows credentials + + + Use these credentials + + + Advanced + + + Select all + + + Deselect all + + + Enable for + + + Skip already imported + + + {0} · {1} result(s) + + + {0} profile(s) imported. +{1} duplicate entries skipped. +{2} without a host skipped. + + + Active Directory + + + CSV file + + + CSV file + + + Import profiles from CSV file + + + Imported from CSV file on {0} + + + No entries were found in the CSV file. + + + Expected CSV format — one profile per line: + + + A header row and the delimiter (semicolon, comma or tab) are detected automatically. The description column is optional. Entries without a host cannot be imported. + + + Import results + + + New + + + Imported + + + No host + + + Exclude disabled accounts + + + Import computers from Active Directory + + + Import computers from Active Directory... + + + Import profiles + + + Source + + + Active Directory + + + Profile group + + + Existing or new group name + + + Firewall + + + Firewall rules + + + Windows Firewall settings + + + Direction + + + Inbound + + + Outbound + + + Action + + + Allow + + + Block + + + Network profile + + + Network profiles + + + Interface type + + + Failed to load firewall rules. {0} + + + The selected firewall rule is permanently deleted: + +{0} + + + Any + + + TCP + + + UDP + + + ICMPv4 + + + ICMPv6 + + + HOPOPT + + + GRE + + + IPv6 + + + IPv6-Route + + + IPv6-Frag + + + IPv6-NoNxt + + + IPv6-Opts + + + VRRP + + + PGM + + + L2TP + + + Any + + + Wired + + + Wireless + + + Remote access + + + Read-only mode. Modifying firewall rules requires elevated rights! + + + Inbound + + + Outbound + + + Block + + + Allow + + + Local ports + + + Remote ports + + + Local addresses + + + Remote addresses + + + Enter a valid IP address, subnet (e.g. 10.0.0.0/8), range (e.g. 10.0.0.1-10.0.0.10), or keyword (Any, LocalSubnet, DNS, DHCP, WINS, DefaultGateway, Internet, Intranet, IntranetRemoteAccess, PlayToDevice, CaptivePortal) + + + Add rule + + + Add rule... + + + Edit rule + + + Edit rule... + + + Delete rule + + + Enable rule + + + Disable rule + + + Import profiles... + + + Speed Test + + + Run speed test + + + Fetching metadata... + + + Measuring latency... + + + Measuring download speed... + + + Measuring upload speed... + + + Measure download and upload speeds, latency, and jitter with speed.cloudflare.com. +Cloudflare may log your IP address and network information. See Cloudflare's privacy policy for details. + + + Latency + + + Jitter + + + Speed test service used to measure download speed, upload speed, latency, and jitter. + + + Stop diff --git a/Source/NETworkManager.Localization/Resources/Strings.pl-PL.resx b/Source/NETworkManager.Localization/Resources/Strings.pl-PL.resx index 643510b88e..d26b00bb39 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.pl-PL.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.pl-PL.resx @@ -138,8 +138,32 @@ ARP - - Tablica ARP + + Neighbor Table + + + Read-only mode. Modifying the neighbor table requires elevated rights! + + + Unreachable + + + Incomplete + + + Probe + + + Delay + + + Stale + + + Reachable + + + Permanent Uwierzytelnianie @@ -285,12 +309,24 @@ Interfejs sieciowy + + Configuration applied + + + Configuring the network interface requires elevated rights! + Nowa karta + + Next + OUI + + Options + Nadpisać? @@ -348,9 +384,6 @@ Ustawienia - - Ustawienia zostały zresetowane! - SNMP @@ -444,6 +477,18 @@ Opis + + Placeholder + + + Path to the file or executable to run. The following placeholders can be used: + + + Arguments passed to the file or executable. The following placeholders can be used: + + + The following placeholder can be used: + DHCP Włączone @@ -489,6 +534,30 @@ Adresy IPv4 + + IPv4 address added + + + IPv4 address removed + + + IPv4 address released and renewed + + + IPv4 address released + + + IPv4 address renewed + + + IPv6 address released and renewed + + + IPv6 address released + + + IPv6 address renewed + Brama-Domyślna-IPv4 @@ -504,11 +573,23 @@ Brama-Domyślna-IPv6 + + Map + + + (+{0} more) + + + Scroll = Zoom, Drag = Pan + + + Unknown + Maksymalny - - Maksymalna liczba skoków/routerów + + Maximum hops Zminimalizuj okno główne, zamiast zamykać aplikację @@ -561,9 +642,6 @@ Wymagane jest ponowne uruchomienie - - Niektóre ustawienia są stosowane dopiero po ponownym uruchomieniu aplikacji! - Zapisz ustawienia w folderze aplikacji @@ -577,7 +655,7 @@ Pokaż następującą aplikację podczas uruchamiania: - Potężne narzędzie do zarządzania sieciami i rozwiązywania problemów z siecią! + A powerful open-source tool for managing networks and troubleshooting network problems! Prędkość @@ -594,12 +672,9 @@ Statyczny serwer DNS IPv4 - + Maska podsieci - - Maska podsieci lub CIDR - Wątki @@ -621,8 +696,8 @@ Limit czasu (ms) - - Czas oczekiwania między żądaniami ping + + Time (ms) to wait between each ping TTL @@ -663,9 +738,6 @@ Dodaj kartę, aby wykonać śledzenie... - - Dodaj kartę, aby wysyłać zapytania o nagłówki HTTP... - Dodaj sufiks DNS (podstawowy) do nazwy hosta @@ -691,7 +763,7 @@ Zastosuj - Zastosuj kombinacje klawiszy Windows (np. ALT + TAB): + Apply Windows key combinations (e.g., ALT+TAB): Autoryzacja @@ -720,6 +792,9 @@ Caps Lock jest włączony! + + Chart time (seconds) + Sprawdź aktualizacje podczas uruchamiania @@ -821,9 +896,6 @@ First make a backup copy of your profile files before enabling encryption! Serwer DNS - - Otwórz dokumentację - Domena @@ -842,8 +914,8 @@ First make a backup copy of your profile files before enabling encryption! Koniec czasu - - Wprowadź podsieć, aby ją obliczyć... + + Enter a subnet to calculate it... Wprowadź podsieć i nową maskę podsieci, aby utworzyć podsieci... @@ -866,9 +938,6 @@ First make a backup copy of your profile files before enabling encryption! Stały rozmiar ekranu: - - Daj gwiazdkę dla projektu na GitHub - Znaleziony @@ -885,7 +954,7 @@ First make a backup copy of your profile files before enabling encryption!Nazwa hosta lub adres IP - Hosty + Hosts ID @@ -969,6 +1038,9 @@ Stwórz jeden... OID + + Only CSV files are allowed! + Tylko gdy użyto pełnego ekranu @@ -993,12 +1065,6 @@ Stwórz jeden... nadpisz - - Overwrite settings in the destination folder? - -"Overwrite" will overwrite the file in the destination folder. -"Use other" will use the existing settings file in the destination and restart the application. - Hasło @@ -1029,9 +1095,6 @@ Stwórz jeden... Proces PuTTY zakończył się! - - Profil PuTTY - Pytania @@ -1098,18 +1161,6 @@ Stwórz jeden... Wybierz rozdzielczość ekranu - - The selected settings are overwritten! - - - Wybrana ustawienia są resetowane. - - - Wybierz ustawienia które chcesz wyeksportować: - - - Wybierze ustawienia które chcesz zaimportować: - To zresetuje wszystkie ustawienia! @@ -1117,7 +1168,7 @@ Stwórz jeden... Serial - SeriaLine + Serial line Usługa @@ -1126,15 +1177,6 @@ Stwórz jeden... Plik ustawień jest uszkodzony lub niekompatybilny z bieżącą wersją. Wszystkie ustawienia zostały zresetowane! (Pliki profili nie zostały naruszone!) - - Ustawienia zostały wyeksportowane! - - - Ustawienia zostały zaimportowane! - - - Ustawienia zostały zresetowane! - Pokaż zamknięte porty @@ -1144,8 +1186,8 @@ Stwórz jeden... Pokaż tylko najczęściej spotykane typy zapytań - - Wyświetl wynik skanowania dla wszystkich adresów IP + + Show unreachable IP addresses and ports Pokaż statystyki @@ -1190,7 +1232,7 @@ Stwórz jeden... Lokalizacja ustawień jest nienaruszona - Limit czasu na zapytaniu SNMP. + Timeout on SNMP query. Maybe the host is not reachable or the community / password is wrong. Osiągnięto limit czasu odpytując serwer DNS "{0}"! @@ -1204,8 +1246,8 @@ Stwórz jeden... Nieznany błąd! - - Przełącz okno na wierzch + + Untray / Bring window to foreground URL @@ -1309,6 +1351,9 @@ Stwórz jeden... Wyczyść pamięć podręczną DNS + + DNS cache flushed + Odszyfruj i załaduj poświadczenia aby jest wybrać. @@ -1366,12 +1411,12 @@ Stwórz jeden... Nadpisz + + Parse + Wklej - - C:\Program Files\PuTTY\putty.exe - Połącz ponownie @@ -1409,22 +1454,22 @@ Stwórz jeden... Połączenia - Wprowadź poprawny zakres IP! + Enter a valid IP range! Wprowadź poprawny adres IPv4! - Wprowadź poprawny adres MAC (np. 00:F1:23:AB:F2:35)! + Enter a valid MAC address (e.g., 00:F1:23:AB:F2:35)! Wprowadź poprawny port (1 - 65535)! - Wprowadź poprawną maskę podsieci (np. 255.255.255.0)! + Enter a valid subnetmask (e.g., 255.255.255.0)! - Wprowadź poprawną maskę podsieci lub CIDR (np. 255.255.255.0 lub /24)! + Enter a valid subnetmask or CIDR (e.g., 255.255.255.0 or /24)! Pole nie może być puste! @@ -1496,10 +1541,10 @@ Stwórz jeden... Wprowadź prawidłowy port lub zakres (1-65535)! - Wprowadź prawidłową podsieć (np. 192.168.178.133/26)! + Enter a valid subnet (e.g., 192.168.178.133/26)! - Wprowadź prawidłowy adres WWW (np. https://example.com/index.html) + Enter a valid website (e.g., https://example.com/index.html) Zielony @@ -1534,6 +1579,9 @@ Stwórz jeden... Limonkowy + + Live + Magenta @@ -1762,9 +1810,6 @@ Stwórz jeden... Żółty - - Wprowadź prawidłową wartość z zakresu 25 - 100! - Profil o tej nazwie już istnieje! @@ -1793,7 +1838,10 @@ Stwórz jeden... Dodaj kartę aby odpytać whois... - Wprowadź prawidłową domenę (np. "example.com")! + Enter a valid domain (e.g., "example.com")! + + + Enter a valid Windows username (e.g., "user", "DOMAIN\user" or "user@domain.com")! Nie znaleziono serwera Whois dla domeny: "{0}" @@ -1837,9 +1885,6 @@ Stwórz jeden... Ustaw ścieżkę do aplikacji TigerVNC w ustawieniach... - - Lokalizacja TigerVNC... - Proces TigerVNC zakończył się! @@ -1903,11 +1948,11 @@ Stwórz jeden... Dodaj adres IPv4 - - Wątki hosta + + Max. concurrent host threads - - Wątki portu + + Max. concurrent port threads PowerShell @@ -1924,9 +1969,6 @@ Stwórz jeden... Konsola zdalna - - Lokalizacja PowerShell... - Ścieżka pliku @@ -1964,11 +2006,11 @@ Stwórz jeden... Zadanie w tle - Zadanie w tle zapisze wszystkie ustawienia, profile i poświadczenie co x-minut. + The background job will save settings and profiles every x-minutes. -Wartość 0 wyłączy tę funkcję, +Value 0 will disable this feature. -Zmiana tej wartości widoczna będzie po ponownym uruchomieniu aplikacji. +Changes to this value will take effect after restarting the application. Uruchom zadanie w tle co x-minut @@ -1980,15 +2022,15 @@ Zmiana tej wartości widoczna będzie po ponownym uruchomieniu aplikacji.Ekran główny - Wszystkie opcje mogą być później zmienione w ustawieniach + All settings can be changed later in the settings! Sprawdź publiczny adres IP - - Dzięki za używanie NETworkManager! + + Thank you for using NETworkManager! -Aby zapewnić dodatkowe funkcje, aplikacja używa usług w internecie, które nie są przeze mnie obsługiwane. Żadne dane nie zostaną mi przesłane w żadnym momencie. +If you enjoy it, please consider supporting its development — whether by leaving a star on GitHub, making a donation, or simply sharing it with others. Your support helps keep the project going and growing. Podczas uruchamiania, aplikacja sprawdza w tle czy nie jest dostępna nowa wersja na GitHub. @@ -2009,14 +2051,14 @@ URL: https://api.ipify.org/ Zewnętrzne usługi - - Odwiedź projekt na GitHub'ie. + + Star/Fork the Project on GitHub. - - Pomóż w tłumaczeniach za pomocą Transifex. + + Help translate the project on Transifex. - - Połącz za pomocą Twitter'a. + + Follow or contact me via X. Połączenie @@ -2036,15 +2078,6 @@ URL: https://api.ipify.org/ Sprawdź konfigurację karty sieciowej (dhcp, statyczne ip) oraz czy jesteś podłączony do sieci. - - Błąd - - - OK - - - Ostrzeżenie - Nie można wykryć adres IP bramy sieciowej! @@ -2097,8 +2130,8 @@ jest wyłączone! Use custom IPv4 address API - - URL do usługi web osiągalnej za pomocą http lub https, która zwraca adres IP jako odpowiedź. + + URL to a web service that can be reached via http or https and returns an IPv4 address e.g., "xx.xx.xx.xx" as response. Nie można odczytać publicznego adresu ip z "{0}"! Użyj innej usługi lub wybierz domyślną... @@ -2172,6 +2205,12 @@ jest wyłączone! Style wizualne + + View only + + + Block keyboard and mouse input to the remote session + Zdalny dźwięk @@ -2217,24 +2256,39 @@ jest wyłączone! Program + + Private + + + Public + Wybrana komenda niestandardowa zostanie trwale usunięta. - - Następujące zmienne są dostępne: - -$$ipaddress$$ --> Adres IP -$$hostname$$ --> Nazwa hosta - Uruchom ponownie - - Nie można rozwiązać adresu ip do nazwy hosta! + + Could not resolve ip address for hostname! Ctrl+Alt+Del + + Task Manager (Ctrl+Shift+Esc) + + + Lock (Win+L) + + + Show Desktop (Win+D) + + + Explorer (Win+E) + + + Run dialog (Win+R) + Skróty klawiaturowe @@ -2271,8 +2325,8 @@ $$hostname$$ --> Nazwa hosta Pokaż okno statusu przy zmianie stanu sieci - - Czas w sekundach jak długo okno powinno być wyświetlane + + Time in seconds how long the status window is shown WiFi @@ -2298,12 +2352,18 @@ $$hostname$$ --> Nazwa hosta Kanał + + Channel width + 2.4 GHz 5 GHz + + 2.4 & 5 GHz + Siła sygnału @@ -2343,11 +2403,8 @@ $$hostname$$ --> Nazwa hosta Limit czasu (s) - - Zgłoś błąd lub utwórz propozycję funkcji - - - Zgłoś błąd lub utwórz propozycję funkcji. + + Report an issue or create a feature request. Interwał beacon'a @@ -2388,12 +2445,39 @@ $$hostname$$ --> Nazwa hosta Nie można rozwiązać adresu ip dla: "{0}" + + Notification + + + Show notification popup on status change + + + Play sound on status change + + + Success threshold + + + Number of consecutive successful pings required before a "Host is up" notification is shown. Higher values reduce noise from flapping hosts. + + + Failure threshold + + + Number of consecutive failed pings (timeouts) required before a "Host is down" notification is shown. Higher values reduce noise from flapping hosts. + + + Display duration (seconds) + + + Host is up + + + Host is down + Aplikacja zostanie uruchomiona ponownie - - Use other folder - Nie można wyeksportować pliku! Zobacz komunikat błędu: "{0}" @@ -2409,8 +2493,8 @@ $$hostname$$ --> Nazwa hosta Jest zaszyfrowane - - Otwórz dokumentację na GitHub'ie. + + Open the documentation. Klient 1 @@ -2439,9 +2523,6 @@ $$hostname$$ --> Nazwa hosta Usuń plik profilu - - Wybrany profil zostanie trwale usunięty. - Wszystkie profile w tym pliku profili zostaną bezpowrotnie usunięte! @@ -2464,7 +2545,7 @@ $$hostname$$ --> Nazwa hosta Uruchom ponownie jako Administrator - Aby analizować pakiety sieciowe, aplikacja musi być uruchomiona z podniesionymi uprawnieniami! + Analysing network packets requires elevated rights! Przechwytuj @@ -2493,13 +2574,13 @@ $$hostname$$ --> Nazwa hosta Discovery Protocol - + CDP - + LLDP - + LLDP / CDP @@ -2532,8 +2613,8 @@ $$hostname$$ --> Nazwa hosta Microsoft.Windows.SDK.Contracts jest wymagane do użycia tej funkcji ale nie jest dostępne na tym systemie (np. na Windows Server). - - Tablica ARP + + Neighbor Table Połączenia @@ -2670,134 +2751,47 @@ $$hostname$$ --> Nazwa hosta Żółty - - Stal - - - Ogólne - - - Wyszukiwanie DNS - - - Nagłówki HTTP - - - Skaner IP - - - Interfejs sieciowy - - - Ping - - - Monitor Ping - - - Skaner portów - - - PowerShell - - - PuTTY - - - Zdalny Pulpit - - - TigerVNC - - - Traceroute - - - Wake on LAN - - - Konsola Web + + Steel - - Whois + + General - - Aplikacje + + Applications - - Ogólne + + General - - Wygląd + + Appearance - + Autostart - - Ekran główny - - - Wyszukiwanie DNS - - - Ogólne - - - Skróty klawiszowe - - - Nagłówki HTTP - - - Skaner IP - - - Język - - - Monitor Ping - - - Skaner portów - - - PowerShell + + General - - Profile + + HotKeys - - PuTTY + + Language - - Zdalny Pulpit + + Profiles - + Ustawienia - - SNMP - - + Status - - TigerVNC - - - Traceroute - - - Aktualizuj - - - Wake On LAN - - - Whois + + Update - - Okno + + Window Włącz dziennik @@ -2827,7 +2821,7 @@ $$hostname$$ --> Nazwa hosta Dziennik SSH - Surowy dziennik SSH + SSH and Raw log Wprowadź prawidłową nazwę pliku! @@ -2889,13 +2883,17 @@ $$hostname$$ --> Nazwa hosta SSID - - Profile could not be loaded! + + Profile file could not be loaded! - - If this happened after an update, you may need to migrate the profiles to a newer version. When you click "Migrate", a PowerShell window opens with the migration script. Check the path and press Enter. + + The profile file could not be loaded and may be corrupted. You can try to restore the file from a backup or delete it. + +If this happens unexpectedly or after an update, please report the error on GitHub. -Otherwise, the profile may be corrupted and you want to report the issue on GitHub. + +Error message: +"{0}" Edit group... @@ -2933,25 +2931,12 @@ Otherwise, the profile may be corrupted and you want to report the issue on GitH Merge - - The destination folder already contains files. If you click Merge, the current profiles are copied to the folder. - - - Overwrite profiles in destination folder? - -"Overwrite" will copy the profile files to the destination folder and overwrite existing profile files. -"Merge" will copy the profile files to the destination folder, but won't overwrite exitsting profile files. -"Use other folder" will use the existing profile files in the destination folder. - Użyj innych Move - - Profile files will be moved to the selected destination folder. - Last scan at {0} @@ -2980,7 +2965,7 @@ Otherwise, the profile may be corrupted and you want to report the issue on GitH C# library take care of complex network, IP, IPv4, IPv6, netmask, CIDR, subnet, subnetting, supernet, and supernetting calculation for .NET developers. - Simple, flexible, interactive & powerful charts, maps and gauges for .Net + Beautiful, interactive charts, maps, and gauges. A collection of loading indicators for WPF @@ -3009,8 +2994,11 @@ Otherwise, the profile may be corrupted and you want to report the issue on GitH List of Top-Level-Domains from iana.org, which is used to query whois servers of the TLD from whois.iana.org via port 43 + + GeoJSON conversion of Natural Earth vector map data (CC0-1.0). + - Sanitized IEEE OUI Data from linuxnet.ca. + OUI data from ieee.org. Service Name and Transport Protocol Port Number Registry from iana.org. @@ -3060,10 +3048,10 @@ Enable profile file encryption in Settings>Profile to store credentials secur Enter a valid IPv6 address! - Public accessible IPv4 address. + Public IPv4 address reachable via ICMP. - Public accessible IPv6 address. + Public IPv6 address reachable via ICMP. Public IPv4 address @@ -3140,7 +3128,1366 @@ Enable profile file encryption in Settings>Profile to store credentials secur Selected profiles will be deleted permanently. - - Unlock the profile file to add, change or delete a profile! + + Use custom themes + + + Custom themes + + + Reset settings? + + + Settings reset! + + + Instance ID + + + Local connection + + + Local interface + + + log4net is a tool to help the programmer output log statements to a variety of output targets. + + + Enabled + + + Region + + + Profiles and regions to synchronize + + + Default profile + + + Default region + + + Group name cannot start with "{0}"! + + + Check for pre-releases + + + Synchronization is disabled! + + + Command + + + Apply theme to PowerShell console + + + The color of the PowerShell console can be changed to the application theme under Settings > General > Appearance + + + If you enable this option, the default PowerShell console settings in the registry under HKCU:\Console are overridden so that the PowerShell console window matches the application theme. This is a global system setting that may affect the appearance of the normal PowerShell window. + +Only the PowerShell consoles configured in the PowerShell settings are modified. Both Windows PowerShell and PWSH (PowerShell 7 and higher) are supported. + +Click in the upper right corner on the help / documentation button (left of the minimize button) or navigate to https://borntoberoot.net/NETworkManager/Documentation/Settings/Appearance for more details. Here are the values documented which will be adjusted. + +If the option is disabled again, the values are no longer modified. However, the original values are NOT restored. + + + Input cannot end with a ";"! + + + Input does not contain any text! + + + Bit Calculator + + + Bit Calculator + + + Notation + + + Input + + + Unit + + + Bits + + + Gigabits + + + Gigabytes + + + Kilobits + + + Kilobytes + + + Megabits + + + Megabytes + + + Petabits + + + Petabytes + + + Terabits + + + Terabytes + + + Enter a number and select a unit to calculate the units... + + + Network + + + Proxy + + + Resolve IP address for this host (IPv4 is preferred) + + + A valid path to PowerShell should end with "pwsh.exe" or "powershell.exe"! + + + A valid path to PuTTY should end with "PuTTY.exe"! + + + A valid path to TigerVNC should end with "vncviewer-*.exe" or "vncviewer64-*.exe"! + + + SNTP Lookup + + + Move a .NET Framework/.NET Core app runtime components and dependencies into a sub-directory and make it beauty. + + + Add a tab to perform a SNTP lookup... + + + SNTP server(s) + + + URL to a web service that can be reached via http or https and returns an IPv6 address e.g., "xxxx:xx:xxx::xx" as response. + + + IP endpoint + + + Local end time + + + Local start time + + + Network time + + + Offset + + + Round trip delay + + + Server + + + SNTP Lookup + + + Add SNTP server + + + Delete SNTP server + + + The selected SNTP server will be deleted permanently. + + + Edit SNTP server + + + An SNTP server with this name already exists! + + + Enter a valid hostname (e.g., "server-01" or "example.com") or a valid IP address (e.g., 192.168.178.1)! + + + Server(s) + + + Enter master password to unlock the profile file: + + + Unlock profile file + + + Timed out + + + Hostkey + + + The settings will be reset and the application will be restarted afterwards! + + + Ustawienia zostały zresetowane! + + + Ping status + + + ThreadPool additional min. threads + + + This setting specifies the minimum number of threads that will be created from the application's ThreadPool on demand. This can improve the performance for example of the IP scanner or port scanner. + +The value is added to the default min. threads (number of CPU threads). The value 0 leaves the default settings. If the value is higher than the default max. threads of the ThreadPool, this value is used. + +If the value is too high, performance problems may occur. + +Changes to this value will take effect after the application is restarted. Whether the value was set successfully can be seen in the log file under %LocalAppData%\NETworkManager\NETworkManager.log + + + These settings only change the maximum number of concurrently executed threads per host/port scan. Go to Settings > General > General to adjust the (min) threads of the application. + + + Port status + + + Ping details + + + No open ports found! + + + Port scan is disabled! + + + Scan ports + + + Could not find the application "{0}". Maybe the application was hidden in the settings? + + + Status window + + + Show address bar + + + Enabling this setting is not recommended. Multiple instances of the application share the same settings and profile files. The last instance to be closed may overwrite changes made by other instances. + + + Bypass for local addresses + + + Enable gateway server + + + Logon method + + + Gateway server + + + Server name + + + Share Gateway credentials with remote computer + + + Allow me to select later + + + Smart card or Windows Hello for Business + + + Ask for password (NTLM) + + + Use gateway credentials + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server is temporarily unavailable. Try reconnecting later or contact your network administrator for assistance. + + + Your computer can't connect to the remote computer due to one of the following reasons: 1) The requested Remote Desktop Gateway server address and the server SSL certificate subject name do not match. 2) The certificate is expired or revoked. 3) The certificate root authority does not trust the certificate. Contact your network administrator for assistance. + + + This computer can't verify the identity of the RD Gateway "". It's not safe to connect to servers that can't be identified. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server address requested and the certificate subject name do not match. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server's certificate has expired or has been revoked. Contact your network administrator for assistance. + + + An error occurred while sending data to the Remote Desktop Gateway server. The server is temporarily unavailable or a network connection is down. Try again later, or contact your network administrator for assistance. + + + An error occurred while receiving data from the Remote Desktop Gateway server. Either the server is temporarily unavailable or a network connection is down. Try again later, or contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server address is unreachable or incorrect. Type a valid Remote Desktop Gateway server address. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server is running low on server resources and is temporarily unavailable. Try reconnecting later or contact your network administrator for assistance. + + + The Remote Desktop Gateway server has ended the connection. Try reconnecting later or contact your network administrator for assistance. + + + The Remote Desktop Gateway server administrator has ended the connection. Try reconnecting later or contact your network administrator for assistance. + + + Remote Desktop can't connect to the remote computer "" for one of these reasons: 1) Your user account is not listed in the RD Gateway's permission list 2) You might have specified the remote computer in NetBIOS format (for example, computer1), but the RD Gateway is expecting an FQDN or IP address format (for example, computer1.fabrikam.com or 157.60.0.1). Contact your network administrator for assistance. + + + Remote Desktop can't connect to the remote computer "" for one of these reasons: 1) Your user account is not authorized to access the RD Gateway "" 2) Your computer is not authorized to access the RD Gateway "" 3) You are using an incompatible authentication method (for example, the RD Gateway might be expecting a smart card but you provided a password) Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because your network administrator has restricted access to this RD Gateway server. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the web proxy server requires authentication. To allow unauthenticated traffic to an RD Gateway server through your web proxy server, contact your network administrator. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server reached its maximum allowed connections. Try reconnecting later or contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server does not support the request. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the client does not support one of the Remote Desktop Gateway's capabilities. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server and this computer are incompatible. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because no certificate was configured to use at the Remote Desktop Gateway server. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the RD Gateway server that you are trying to connect to is not allowed by your computer administrator. If you are the administrator, add this Remote Desktop Gateway server name to the trusted Remote Desktop Gateway server list on your computer and then try connecting again. + + + Your computer can't connect to the remote computer because your computer or device did not meet the Network Access Protection requirements set by your network administrator, for one of the following reasons: 1) The Remote Desktop Gateway server name and the server's public key certificate subject name do not match. 2) The certificate has expired or has been revoked. 3) The certificate root authority does not trust the certificate. 4) The certificate key extension does not support encryption. 5) Your computer cannot verify the certificate revocation list. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because a user name and password are required to authenticate to the Remote Desktop Gateway server instead of smart card credentials. + + + Your computer can't connect to the remote computer because smart card credentials are required to authenticate to the Remote Desktop Gateway server instead of a user name and password. + + + Your computer can't connect to the remote computer because an invalid cookie was sent to the Remote Desktop Gateway server. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the cookie was rejected by the Remote Desktop Gateway server. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server is expecting an authentication method different from the one attempted. Contact your network administrator for assistance. + + + The RD Gateway connection ended because periodic user authentication failed. Try reconnecting with a correct user name and password. If the reconnection fails, contact your network administrator for further assistance. + + + The RD Gateway connection ended because periodic user authorization failed. Try reconnecting with a correct user name and password. If the reconnection fails, contact your network administrator for further assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway and the remote computer are unable to exchange policies. This could happen due to one of the following reasons: 1. The remote computer is not capable of exchanging policies with the Remote Desktop Gateway. 2. The remote computer's configuration does not permit a new connection. 3. The connection between the Remote Desktop Gateway and the remote computer ended. Contact your network administrator for assistance. + + + The RD Gateway connection ended because periodic user authorization failed. Your computer or device didn't pass the Network Access Protection (NAP) requirements set by your network administrator. Contact your network administrator for assistance. + + + Connected + + + Error while scanning WiFi adapter "{0}" with error: "{1}" + + + Connect... + + + {0} disconnected! + + + Connect to {0} + + + WPS + + + Connect automatically + + + Pre-shared key + + + Connecting to {0}... + + + Could not connect to {0} ({1})! + + + Successfully connected to {0}! + + + Access to the network has been revoked + + + Invalid credentials + + + Network not available + + + Successful + + + Connection attempt timed out + + + -/- + + + Authentication protocol is not supported! + + + Checking WPS... + + + Open OID profiles... + + + MIB + + + OID profiles + + + Select OID profile + + + Add OID profile + + + Delete OID profile + + + The selected OID profile will be deleted permanently. + + + Edit OID profile + + + Enter password... + + + Add tab + + + (from profile) + + + New subnet mask + + + Dodaj serwer + + + Serwer SNTP + + + The settings on this page contain errors. Correct them to be able to save. + + + SSH hostkey to use for the connection (e.g., "71:b8:f2:6e..."). Only available if the mode is "SSH". + + + Full path to the private key file (e.g., "C:\Users\BornToBeRoot\SSH\private_key.ppk"). Only available if the mode is "SSH". + + + Username that will be passed into the PuTTY session. Only available if the mode is "SSH", "Telnet" or "Rlogin". + + + ASN + + + AS Name + + + Miasto + + + Kontynent + + + Kraj + + + Currency + + + District + + + DNS resolver + + + EDNS + + + Geolocation + + + Hosting + + + IP geolocation + + + ISP + + + Latitude + + + Longitude + + + Mobile + + + Organization + + + PTR record + + + Strefa czasowa + + + Zip + + + IP Geolocation API - Fast, accurate, reliable + + + Check DNS resolver + + + Check IP geolocation + + + Show map + + + The DNS resolver is determined via ip-api.com. + +URL: https://edns.ip-api.com/ + + + The IP geolocation is determined via ip-api.com. + +URL: http://ip-api.com/ + + + To provide additional features, third party services are used that are not operated by me. You can deselect them below. No data is transferred to me at any time. + + + Checking DNS resolver... + + + Checking IP geolocation... + + + Check your network connection and try again in a few seconds. + + + ip-api.com rate limit reached (too many requests from your network)! +Try again in a few seconds. + + + HTTP status code + + + Steel + + + Rate limit reached! Try again in {0} seconds... + + + General + + + BSSID + + + No reachable hosts found! + + + Application + + + Enable experimental features to test new functions. These are not yet complete, contain bugs, can crash the application and may change again until release. + + + Experimental features + + + Experimental + + + Run command... + + + IP Geolocation + + + Add a tab to query the IP geolocation... + + + Enter a domain to query whois... + + + Enter host to query IP geolocation... + + + Unknown user name. + + + Authentication failure (incorrect password, community or key). + + + The operation was successful without any errors. + + + The response to your request was too large to fit into a single response! + + + The requested OID could not be found! + + + A read-write or write-only object was set to an inconsistent value! + + + The requested OID does not exist and is not writable! + + + An error occurred for which no specific message is available! + + + The requested object is not accessible for modification! + + + The object was set to an incompatible data type! + + + The value assigned to the object exceeds its maximum length! + + + The encoding used for the object is incorrect! + + + The value assigned to the object is not a valid choice! + + + The requested object does not exist and cannot be created! + + + The MIB variable is currently in an inconsistent state and cannot be modified! + + + There are no available system resources to perform the requested operation! + + + An error occurred during the set operation! + + + A set operation failed, and previous changes could not be rolled back! + + + Authentication failed. Please check the community string! + + + The requested object is not writable and cannot be modified! + + + The object's state is inconsistent, preventing the set operation! + + + Close all + + + Expand host view + + + Expand map view + + + Host cannot be set while other hosts are being added. Please wait until the process is complete and try again. + + + No matching commands! + + + Remote hostname + + + Process ID + + + Process path + + + Process name + + + NetBIOS + + + Nazwa komputera + + + Błąd + + + OK + + + Warning + + + Group / domain + + + NetBIOS reachable + + + Scan for NetBIOS + + + NetBIOS scan is disabled! + + + Resolve Hostname is disabled! + + + Resolve MAC address is disabled! + + + Close group + + + Run command... (Ctrl+Shift+P) + + + Profile files + + + Open settings... + + + Expand and open search... + + + Starting with Windows 11 24H2, you’ll need to allow access to the Wi-Fi adapter. + +Open Windows Settings > Privacy & security > Location, enable access for Desktop Apps / NETworkManager, then restart the application. + + + Drag and drop the applications to reorder them. +Right-click for more options. + + + Restore defaults + + + An easy to use drag'n'drop framework for WPF. + + + BSD-3-Clause + + + Set default + + + Ubuntu Server running Docker with Nextcloud and Traefik... + + + Linux servers running in AWS... + + + 6 GHz + + + Support this project with a donation. + + + Otwórz dokumentację + + + Donate + + + Profile file + + + Hosts File Editor + + + Hosts File Editor + + + Read-only mode. Modifying the hosts file requires elevated rights! + + + Open hosts file + + + Comment + + + Disable + + + Edit entry + + + Edit entry... + + + Enable entry + + + Disable entry + + + Refreshing... + + + Reloaded at {0} + + + Failed to load hosts file: {0} + + + Retrying in {0} seconds... + + + What's new? + + + Changelog + + + Upgraded to {0} + + + This release includes new features, improvements, and bug fixes. Check out the changelog for all the details! + + + Entries + + + The selected entry is permanently deleted: + +{0} {1} {2} + + + Primary DNS server + + + Enter a valid hostname (e.g., "server-01" or "example.com")! Multiple hostnames can be separated with a space. + + + The "hosts" file could not be read! See log file for more details. + + + The "hosts" file could not be written to. See log file for more details. + + + The entry was not found in the "hosts" file! Maybe the file has been modified. + + + A backup of the "hosts" file could not be created! See log file for more details. + + + Show status bar + + + Displays the status bar in the bottom-left of the WebView when hovering over a link. + + + Save credentials + + + Displays a dialog to save credentials after a successful sign-in. + + + Delete browsing data + + + Permanently delete browsing data (history, cookies, cache, credentials, etc.) for the current WebView2 profile. + + + Browsing Data + + + Browsing data successfully deleted! + + + An error occurred while deleting browsing data. Feel free to report this issue on GitHub. + + + production + + + Add tag + + + Apply filter + + + Filter profiles... + + + Filter by tags + + + No tags found! + + + Match + + + Any + + + Add group... + + + Expand all + + + Collapse all + + + Use custom themes to personalize the appearance of the application. You can edit or add theme in the "Program Folder > Themes" directory. For more details, refer to the documentation. + + + Admin (console) session + + + Profile file "{0}" will be deleted permanently. + + + Enable encryption? + + + Do you want to enable profile file encryption to protect sensitive data such as hosts, IP addresses, URLs, and stored credentials? + +You can enable or disable encryption later at any time by right-clicking the profile file to manage encryption settings. +If you click Cancel, the profile file will remain unencrypted. + + + A restart is required to apply changes such as language settings. + + + Could not parse or resolve any of the specified DNS servers. + + + Could not parse "{0}". + + + Maximum number of backups + + + Create daily backup + + + Number of backups that are retained before the oldest one is deleted. + + + This setting is managed by your administrator. + + + Restore default location + + + Restore + + + Restore default location? + + + The default settings location is restored and the application is restarted afterwards. + +You can copy the “settings.json” file from "{0}" to "{1}" to migrate your previous settings, if necessary. The application must be closed for this to prevent the settings from being overwritten. + + + Change location? + + + The settings location is changed and the application is restarted afterwards. + +You can copy the “settings.json” file from "{0}" to "{1}" to migrate your previous settings, if necessary. The application must be closed for this to prevent the settings from being overwritten. + + + Enter a valid folder path! + + + The profiles location is changed and the application is restarted afterwards. + +You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. + + + The default profiles location is restored and the application is restarted afterwards. + +You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. + + + Network connection + + + Network Status + + + Active Directory import failed. + + + Options + + + + Uses your current Windows credentials to read from Active Directory. The account must be allowed to enumerate computer objects under the search base (subtree). + + + Search base (DN) + + + Additional LDAP filter + + + Filter must be a valid LDAP expression starting with '(' and ending with ')'. + + + Search base must be a valid LDAP distinguished name (e.g. DC=example,DC=com). + + + Imported from Active Directory on {0} + + + No computers found for the given search base and filter. + + + Searching Active Directory... + + + If your computer is not joined to the domain, specify the domain controller (hostname or IP) and use custom credentials. + + + Server (optional) + + + Port (optional) + + + Use SSL (LDAPS) + + + Use current Windows credentials + + + Use these credentials + + + Advanced + + + Select all + + + Deselect all + + + Enable for + + + Skip already imported + + + {0} · {1} result(s) + + + {0} profile(s) imported. +{1} duplicate entries skipped. +{2} without a host skipped. + + + Active Directory + + + CSV file + + + CSV file + + + Import profiles from CSV file + + + Imported from CSV file on {0} + + + No entries were found in the CSV file. + + + Expected CSV format — one profile per line: + + + A header row and the delimiter (semicolon, comma or tab) are detected automatically. The description column is optional. Entries without a host cannot be imported. + + + Import results + + + New + + + Imported + + + No host + + + Exclude disabled accounts + + + Import computers from Active Directory + + + Import computers from Active Directory... + + + Import profiles + + + Source + + + Active Directory + + + Profile group + + + Existing or new group name + + + Firewall + + + Firewall rules + + + Windows Firewall settings + + + Direction + + + Inbound + + + Outbound + + + Action + + + Allow + + + Block + + + Network profile + + + Network profiles + + + Interface type + + + Failed to load firewall rules. {0} + + + The selected firewall rule is permanently deleted: + +{0} + + + Any + + + TCP + + + UDP + + + ICMPv4 + + + ICMPv6 + + + HOPOPT + + + GRE + + + IPv6 + + + IPv6-Route + + + IPv6-Frag + + + IPv6-NoNxt + + + IPv6-Opts + + + VRRP + + + PGM + + + L2TP + + + Any + + + Wired + + + Wireless + + + Remote access + + + Read-only mode. Modifying firewall rules requires elevated rights! + + + Inbound + + + Outbound + + + Block + + + Allow + + + Local ports + + + Remote ports + + + Local addresses + + + Remote addresses + + + Enter a valid IP address, subnet (e.g. 10.0.0.0/8), range (e.g. 10.0.0.1-10.0.0.10), or keyword (Any, LocalSubnet, DNS, DHCP, WINS, DefaultGateway, Internet, Intranet, IntranetRemoteAccess, PlayToDevice, CaptivePortal) + + + Add rule + + + Add rule... + + + Edit rule + + + Edit rule... + + + Delete rule + + + Enable rule + + + Disable rule + + + Import profiles... + + + Speed Test + + + Run speed test + + + Fetching metadata... + + + Measuring latency... + + + Measuring download speed... + + + Measuring upload speed... + + + Measure download and upload speeds, latency, and jitter with speed.cloudflare.com. +Cloudflare may log your IP address and network information. See Cloudflare's privacy policy for details. + + + Latency + + + Jitter + + + Speed test service used to measure download speed, upload speed, latency, and jitter. + + + Stop diff --git a/Source/NETworkManager.Localization/Resources/Strings.pt-BR.resx b/Source/NETworkManager.Localization/Resources/Strings.pt-BR.resx index 056416c7ca..93595700bf 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.pt-BR.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.pt-BR.resx @@ -138,8 +138,32 @@ ARP - - Tabela ARP + + Tabela de vizinhança + + + Modo somente leitura. Modificar a tabela de vizinhança requer direitos elevados! + + + Inacessível + + + Incompleto + + + Sondar + + + Atraso + + + Obsoleto + + + Acessível + + + Permanente Autenticação @@ -285,12 +309,24 @@ Interface de rede + + Configuração aplicada + + + Configurar a interface de rede requer direitos elevados! + Nova aba + + Avançar + OUI + + Opções + Substituir? @@ -348,9 +384,6 @@ Configurações - - As configurações foram redefinidas! - SNMP @@ -444,6 +477,18 @@ Descrição + + Espaço reservado + + + Caminho do arquivo ou executável para executar. Os seguintes espaços reservados podem ser usados: + + + Argumentos passados para o arquivo ou executável. Os seguintes espaços reservados podem ser usados: + + + O seguinte espaço reservado pode ser usado: + DHCP ativado @@ -489,6 +534,30 @@ Endereço IPv4 + + Endereço IPv4 adicionado + + + Endereço IPv4 removido + + + Endereço IPv4 liberado e renovado + + + Endereço IPv4 liberado + + + Endereço IPv4 renovado + + + Endereço IPv6 liberado e renovado + + + Endereço IPv6 liberado + + + Endereço IPv6 renovado + Gateway Padrão IPv4 @@ -504,11 +573,23 @@ Gateway Padrão IPv6 + + Mapa + + + (mais {0}) + + + Rolar = Zoom, Arrastar = Panorâmica + + + Desconhecido + Máximo - - Saltos máximos/roteador + + Máximo de saltos Minimizar janela principal em vez de finalizar o aplicativo @@ -561,9 +642,6 @@ Necessário reiniciar - - Algumas configurações são aplicadas somente após a reinicialização do aplicativo! - Salvar configurações na pasta do aplicativo @@ -577,7 +655,7 @@ Exibir seguinte aplicativo ao iniciar: - Uma ferramenta poderosa para gerenciar redes e solucionar problemas de rede! + Uma poderosa ferramenta de código aberto para gerenciar e solucionar problemas de rede! Velocidade @@ -594,11 +672,8 @@ Servidor DNS IPv4 estático - - Máscara de sub-rede - - - Máscara de sub-rede ou CIDR + + Máscara de sub-rede Segmentos @@ -621,8 +696,8 @@ Tempo limite (ms) - - Tempo para esperar entre cada ping + + Tempo para esperar (ms) entre cada ping TTL @@ -663,9 +738,6 @@ Adicionar aba para realizar trace... - - Adicionar aba para consultar cabeçalhos HTTP... - Adicionar sufixo DNS (primário) ao nome do host @@ -720,6 +792,9 @@ Capslock está ativado! + + Tempo do gráfico (segundos) + Verificar atualizações na inicialização @@ -821,9 +896,6 @@ Primeiro faça uma cópia de backup dos seus arquivos de perfil antes de habilit Servidor DNS - - Abrir documentação - Domínio @@ -842,7 +914,7 @@ Primeiro faça uma cópia de backup dos seus arquivos de perfil antes de habilit Hora final - + Insira uma sub-rede para calculá-la... @@ -866,9 +938,6 @@ Primeiro faça uma cópia de backup dos seus arquivos de perfil antes de habilit Tamanho fixo da tela: - - Star/Fork Projeto no GirHub - Encontrado @@ -969,6 +1038,9 @@ Crie um... OID + + Apenas arquivos CSV são permitidos! + Somente ao usar a tela cheia @@ -993,12 +1065,6 @@ Crie um... sobrepor - - Substituir as configurações na pasta de destino? - -"Substituir" substituirá o arquivo na pasta de destino. -"Usar outro" usará o arquivo de configurações existente no destino e reiniciará o aplicativo. - Senha @@ -1029,9 +1095,6 @@ Crie um... Processo PuTTY foi finalizado! - - Perfil PuTTY - Perguntas @@ -1098,18 +1161,6 @@ Crie um... Selecione uma resolução de tela - - As configurações selecionadas serão substituídas! - - - As configurações selecionadas foram redefinidas. - - - Selecione as configurações que deseja exportar: - - - Selecione as configurações que deseja importar: - Isto irá redefinir todas as configurações! @@ -1117,23 +1168,17 @@ Crie um... Serial - SerialLine + Linha de série Serviço - O arquivo de configurações encontrado está corrompido ou não é compatível com esta versão. Todas as configurações foram redefinidas. -(Arquivos de perfil não foram afetados!) - - - Configurações exportadas com sucesso! - - - Configurações importadas com sucesso! - - - Configurações redefinidas com sucesso! + O arquivo de configurações encontrado está corrompido ou não é compatível com esta versão! Você pode reportar este problema no GitHub. + +Um backup do arquivo de configurações foi criado na pasta de configurações e as configurações foram redefinidas. + +Os arquivos do perfil não foram afetados! Mostrar portas fechadas @@ -1144,8 +1189,8 @@ Crie um... Mostrar apenas os tipos de consulta mais comuns - - Mostrar resultado da varredura para todos os endereços IP + + Mostrar endereços IP e portas inacessíveis Mostre estatisticas @@ -1187,10 +1232,10 @@ Crie um... O processo pode levar algum tempo e recursos (CPU / RAM). - O local das configurações não é afetado + A pasta de configurações não é afetada! - Tempo limite na consulta SNMP. + Tempo limite na consulta SNMP. Talvez o host não esteja acessível ou a comunidade/senha esteja errada. Tempo limite ao consultar o servidor DNS com o endereço IP "{0}"! @@ -1204,7 +1249,7 @@ Crie um... Erro desconhecido! - + Trazer janela para a frente @@ -1309,6 +1354,9 @@ Crie um... Limpar cache DNS + + Cache DNS limpo + Descriptografa e carrega suas credenciais para selecioná-las. @@ -1366,12 +1414,12 @@ Crie um... Substituir + + Analisar + Colar - - C:\Program Files\PuTTY\putty.exe - Reconectar @@ -1409,22 +1457,22 @@ Crie um... Conexões - Entre um intervalo de IP válido! + Digite um intervalo de IPs válido! Entre um endereço IPv4 válido! - Entre um endereço MAC válido (como 00:F1:23:AB:F2:35)! + Entre um endereço MAC válido (ex.: 00:F1:23:AB:F2:35)! Entre uma porta válida (1 - 65535)! - Entre uma máscara de sub-rede válida (como 255.255.255.0)! + Entre uma máscara de sub-rede válida (ex.: 255.255.255.0)! - Digite uma sub-máscara de rede ou CIDR válido (como 255.255.255.0 ou /24)! + Digite uma sub-máscara de rede ou CIDR válido (ex.: 255.255.255.0 ou /24)! O campo não pode estar vazio! @@ -1496,10 +1544,10 @@ Crie um... Digite uma porta válida e/ou intervalo de portas (1 - 65535)! - Digite uma sub-rede válida (como 192.168.178.133/26)! + Digite uma sub-rede válida (ex.: 192.168.178.133/26)! - Insira um site válido (como https://exemplo.com/index.html) + Insira um site válido (ex.: https://exemplo.com/index.html) Verde @@ -1534,6 +1582,9 @@ Crie um... Lima + + Tempo real + Magenta @@ -1762,9 +1813,6 @@ Crie um... Amarelo - - Entre um valor válido entre 25 e 100! - Um perfil com este nome já existe! @@ -1793,7 +1841,10 @@ Crie um... Adicionar aba para consultar whois... - Entre um domínio válido (como "exemplo.com")! + Entre um domínio válido (ex.: "exemplo.com")! + + + Insira um nome de usuário válido do Windows (ex.: "user", "DOMAIN\user" ou user@domain.com")! Servidor whois não encontrado para o domínio: "{0}" @@ -1837,9 +1888,6 @@ Crie um... Configure o caminho para o TigerVNC nas configurações ... - - Local do TigerVNC... - Processo TigerVNC foi finalizado! @@ -1903,11 +1951,11 @@ Crie um... Adicionar endereço IPv4 - - Segmentos do host + + Máx. threads de host simultâneos - - Segmento de porta + + Máx. threads de portas concorrentes PowerShell @@ -1924,9 +1972,6 @@ Crie um... Console remoto - - Local do PowerShell... - Caminho do arquivo @@ -1964,7 +2009,7 @@ Crie um... Tarefa em segundo plano - A tarefa em segundo plano irá salvar configurações, perfis e credenciais a cada x minutos. + A tarefa em segundo plano irá salvar configurações e perfis a cada x minutos. Valor 0 desabilita este recurso. @@ -1980,15 +2025,15 @@ Alterar esse valor requer uma reinicialização do aplicativo para entrar em vig Painel de Controle - Todas as configurações podem ser alteradas mais tarde nas Configurações + Todas as configurações podem ser alteradas mais tarde nas configurações! Verificar endereço de IP público - + Obrigado por usar o NETworkManager! -Para fornecer recursos adicionais, o aplicativo usa serviços na Internet que não são operados por mim. Nenhum dado será enviado a mim a qualquer momento. +Se você gostou, considere apoiar o desenvolvimento — seja deixando uma estrela no GitHub, fazendo uma doação ou simplesmente compartilhando com outras pessoas. Seu apoio ajuda a manter o projeto funcionando e crescendo. Ao iniciar o programa, ele verifica em segundo plano se uma nova versão do programa está disponível no GitHub. @@ -2009,14 +2054,14 @@ URL: https://api.ipify.org/ Serviços externos - + Star/Fork Projeto no GirHub. - + Ajude a traduzir o projeto no Transifex. - - Contato pelo Twitter. + + Siga ou contate-me no X. Conexão @@ -2036,15 +2081,6 @@ URL: https://api.ipify.org/ Verifica a configuração do adaptador de rede (DHCP, IP estático) e se você está conectado em uma rede. - - Error - - - OK - - - Aviso - Não foi possível detectar o endereço IP do gateway! @@ -2097,8 +2133,8 @@ público está desabilitada! Usar API de endereço IPv4 personalizado - - URL para um serviço da web que pode ser acessado via http ou https e retorna um endereço IP como resposta. + + URL para um serviço da web que pode ser acessado via http ou https e retorna um endereço IPv4, exemplo: "xx.xx.xx.xx" como resposta. Não foi possível analisar o endereço IP público de "{0}"! Tente outro serviço ou use o padrão... @@ -2172,6 +2208,12 @@ público está desabilitada! Estilos visuais + + Somente visualização + + + Bloquear teclado e mouse na sessão remota + Áudio remoto @@ -2217,24 +2259,39 @@ público está desabilitada! Programa + + Privado + + + Público + O comando personalizado selecionado será excluído permanentemente. - - As seguintes variáveis estão disponíveis: - -$$ipaddress$$-->Endereço IP -$$hostname$$-->Nome do host - Reiniciar - + Não foi possível resolver o endereço IP do nome do host! Ctrl+Alt+Del + + Gerenciador de Tarefas (Ctrl+Shift+Esc) + + + Bloquear (Win+L) + + + Mostrar Área de Trabalho (Win+D) + + + Explorer (Win+E) + + + Diálogo Executar (Win+R) + Atalhos de teclado @@ -2271,8 +2328,8 @@ $$hostname$$-->Nome do host Mostrar janela de status ao alterar rede - - Tempo em segundos de quanto tempo a janela deve ser exibida + + Tempo em segundos de quanto tempo a janela de status deve ser exibida Wi-Fi @@ -2298,12 +2355,18 @@ $$hostname$$-->Nome do host Canal + + Largura do canal + 2.4 GHz 5 GHz + + 2.4 & 5 GHz + Potência do sinal @@ -2343,10 +2406,7 @@ $$hostname$$-->Nome do host Tempo limite (s) - - Reporte um erro ou crie um pedido de recurso - - + Reporte um erro ou crie um pedido de recurso. @@ -2388,12 +2448,39 @@ $$hostname$$-->Nome do host Não foi possível resolver o endereço IP para: "{0}" + + Notificação + + + Mostrar popup de notificação ao alterar status + + + Tocar som ao alterar status + + + Limite de sucesso + + + Número de pings consecutivos bem-sucedidos necessários antes que uma notificação de "Host ativo" seja mostrada. Valores mais altos reduzem o ruído de hosts oscilantes. + + + Limite de falha + + + Número de pings consecutivos com falha (tempo esgotado) necessários antes que uma notificação de "Host inativo" seja mostrada. Valores mais altos reduzem o ruído de hosts oscilantes. + + + Tempo de exibição (segundos) + + + Host ativo + + + Host inativo + O aplicativo será reiniciado... - - Usar outra pasta - Não foi possível exportar o arquivo! Veja a mensagem de erro: "{0}" @@ -2409,8 +2496,8 @@ $$hostname$$-->Nome do host Está criptografado - - Abrir documentação no GitHub. + + Abrir a documentação. Cliente 1 @@ -2439,9 +2526,6 @@ $$hostname$$-->Nome do host Excluir arquivo de perfil - - O arquivo de perfil selecionado será excluído permanentemente. - Todos os perfis neste arquivo de perfil serão excluídos permanentemente! @@ -2464,7 +2548,7 @@ $$hostname$$-->Nome do host Reiniciar como Administrador - Para analisar pacotes de rede, o aplicativo deve ser iniciado com direitos elevados! + Analisar pacotes de rede requer direitos elevados! Capturar @@ -2493,13 +2577,13 @@ $$hostname$$-->Nome do host Protocolo de Descoberta - + CDP - + LLDP - + LLDP / CDP @@ -2532,8 +2616,8 @@ $$hostname$$-->Nome do host O Microsoft.Windows.SDK.Contracts é necessário para esse recurso, mas não está disponível neste sistema (por exemplo, no Windows Server). - - Tabela ARP + + Tabela de vizinhança Conexões @@ -2670,133 +2754,46 @@ $$hostname$$-->Nome do host Amarelo - + Aço - + Geral - - Pesquisa de DNS - - - Cabeçalhos HTTP - - - Scanner de IP - - - Interface de Rede - - - Ping - - - Monitor de Ping - - - Scanner de Portas - - - PowerShell - - - PuTTY - - - Área de Trabalho Remota - - - TigerVNC - - - Traceroute - - - Wake on LAN - - - Console Web - - - Whois - - + Aplicativos - + Geral - + Aparência - + Iniciar automático - - Painel de Controle - - - Pesquisa de DNS - - + Geral - + Teclas de Atalho - - Cabeçalhos HTTP - - - Scanner de IP - - + Idioma - - Monitor de Ping - - - Scanner de Portas - - - PowerShell - - + Perfis - - PuTTY - - - Área de Trabalho Remota - - + Configurações - - SNMP - - + Status - - TigerVNC - - - Traceroute - - + Atualizar - - Wake On LAN - - - Whois - - + Janela @@ -2889,13 +2886,17 @@ $$hostname$$-->Nome do host SSID - + O perfil não pôde ser carregado! - - Se isso aconteceu após uma atualização, talvez seja necessário migrar os perfis para uma versão mais recente. Quando você clica em "Migrar", uma janela do PowerShell é aberta com o script de migração. Verifique o caminho e pressione Enter. + + O arquivo de perfil não pôde ser carregado e pode estar corrompido. Você pode tentar restaurar o arquivo de um backup ou excluí-lo. + +Se isso acontecer inesperadamente ou após uma atualização, relate o erro no GitHub. -Caso contrário, o perfil pode estar corrompido e você pode relatar o problema no GitHub. + +Mensagem de erro: +"{0}" Editar grupo... @@ -2933,25 +2934,12 @@ Caso contrário, o perfil pode estar corrompido e você pode relatar o problema Unir - - O arquivo de destino ainda contém arquivos. Se você clicar em Unir, os perfis atuais serão copiados para a pasta. - - - Substituir perfis na pasta de destino? - -"Substituir" copiará os arquivos de perfil para a pasta de destino e substituirá os arquivos de perfil existentes. -"Unir" copiará os arquivos de perfil para a pasta de destino, mas não substituirá os arquivos de perfil de saída. -"Usar outra pasta" usará os arquivos de perfil existentes na pasta de destino. - Usar outro Mover - - Os arquivos do perfil serão movidos para a pasta de destino selecionada. - Última verificação às {0} @@ -2980,7 +2968,7 @@ Caso contrário, o perfil pode estar corrompido e você pode relatar o problema A biblioteca C# cuida de redes complexas, IP, IPv4, IPv6, máscara de rede, CIDR, sub-rede, supernet e cálculo de super-rede para desenvolvedores .NET. - Gráficos, mapas e medidores simples, flexíveis, interativos e poderosos para .NET + Gráficos, mapas e indicadores interativos e belíssimos. Uma coleção de indicadores de carregamento para WPF @@ -3009,8 +2997,11 @@ Caso contrário, o perfil pode estar corrompido e você pode relatar o problema Lista de domínios de nível superior de iana.org, que é usada para consultar servidores whois do TLD de whois.iana.org por meio da porta 43 + + Conversão GeoJSON de dados de mapas vetoriais da Terra Natural (CC0-1.0). + - Dados Sanitized IEEE OUI de linuxnet.ca. + Dados OUI de ieee.org Registro de Nome de Serviço e Número de Porta de Protocolo de Transporte de iana.org. @@ -3060,10 +3051,10 @@ Habilite a criptografia do arquivo de perfil em Configurações > Perfil para Entre um endereço IPv6 válido! - Endereço IPv4 acessível ao público. + Endereço IPv4 público acessível via ICMP. - Endereço IPv6 acessível ao público. + Endereço IPv6 público acessível via ICMP. Endereço IPv4 público @@ -3140,7 +3131,1366 @@ Habilite a criptografia do arquivo de perfil em Configurações > Perfil para Os perfis selecionados serão excluídos permanentemente. - - Desbloqueie o perfil para adicionar, alterar ou excluir um perfil! + + Usar temas personalizados + + + Temas personalizados + + + Redefinir configurações? + + + Configurações redefinidas! + + + ID da instância + + + Conexão local + + + Interface local + + + log4net é uma ferramenta para ajudar o programador a enviar instruções de log para uma variedade de destinos de saída. + + + Habilitado + + + Região + + + Perfis e regiões para sincronizar + + + Perfil padrão + + + Região padrão + + + O nome do grupo não pode iniciar com "{0}"! + + + Verificar por pré-lançamentos + + + Sincronização desativada! + + + Comando + + + Aplicar tema ao console do PowerShell + + + A cor do console do PowerShell pode ser alterada para o tema do aplicativo em Configurações > Geral > Aparência + + + Se você habilitar esta opção, as configurações padrão do console do PowerShell no registro em HKCU:\Console serão substituídas para que a janela do console do PowerShell corresponda ao tema do aplicativo. Esta é uma configuração global do sistema que pode afetar a aparência da janela normal do PowerShell. + +Somente os consoles do PowerShell configurados nas configurações do PowerShell serão modificados. Tanto o Windows PowerShell quanto o PWSH (PowerShell 7 e versões posteriores) são compatíveis. + +Clique no botão de ajuda/documentação no canto superior direito (à esquerda do botão minimizar) ou acesse https://borntoberoot.net/NETworkManager/Documentation/Settings/Appearance para obter mais detalhes. Os valores que serão ajustados estão documentados a seguir. + +Se a opção for desabilitada novamente, os valores não serão mais modificados. No entanto, os valores originais NÃO serão restaurados. + + + A entrada não pode terminar com ";"! + + + A entrada não contém nenhum texto! + + + Calculadora de bits + + + Calculadora de bits + + + Nota + + + Entrada + + + Unidade + + + Bits + + + Gigabits + + + Gigabytes + + + Kilobits + + + Kilobytes + + + Megabits + + + Megabytes + + + Petabits + + + Petabytes + + + Terabits + + + Terabytes + + + Digite um número e selecione uma unidade para calcular as unidades... + + + Rede + + + Proxy + + + Resolver endereço IP para este host (IPv4 é o preferido) + + + Um caminho válido para o PowerShell deve terminar com "pwsh.exe" ou "powershell.exe"! + + + Um caminho válido para o PuTTY deve terminar com "PuTTY.exe"! + + + Um caminho válido para TigerVNC deve terminar com "vncviewer-*.exe" ou "vncviewer64-*.exe"! + + + Pesquisa de SNTP + + + Mova os componentes e dependências de tempo de execução de um aplicativo .NET Framework/.NET Core para uma subpasta e torne-o atraente. + + + Adicionar aba para realizar pesquisa de SNTP... + + + Servidor(es) SNTP + + + URL para um serviço da web que pode ser acessado via http ou https e retorna um endereço IPv6, exemplo: "xxxx:xx:xxx::xx" como resposta. + + + Ponto final de IP + + + Horário de término local + + + Hora de início local + + + Hora da rede + + + Compensação + + + Atraso de ida e volta + + + Servidor + + + Pesquisa de SNTP + + + Adicionar servidor SNTP + + + Excluir servidor SNTP + + + O servidor SNTP selecionado será excluído permanentemente. + + + Editar servidor SNTP + + + Um servidor SNTP com este nome já existe! + + + Digite um nome de host válido (ex.: "servidor-01.com" ou "exemplo.com") ou um endereço de IP válido (ex.: 192.168.178.1)! + + + Servidor(es) + + + Digite a senha mestre para desbloquear o arquivo de perfil: + + + Desbloquear arquivo de perfil + + + Tempo esgotado + + + Hostkey + + + As configurações serão redefinidas e o aplicativo será reiniciado em seguida! + + + As configurações foram redefinidas! + + + Status do ping + + + Threads mínimos adicionais ThreadPool + + + Essa configuração especifica o número mínimo de threads que serão criados a partir do ThreadPool do aplicativo sob demanda. Isso pode melhorar o desempenho, por exemplo, do scanner IP ou do scanner de porta. + +O valor é adicionado ao threads mínimo padrão (número de threads da CPU). O valor 0 deixa as configurações padrão. Se o valor for maior que o padrão máximo de threads do ThreadPool, esse valor é usado. + +Se o valor for muito alto, podem ocorrer problemas de desempenho. + +As alterações nesse valor entrarão em vigor depois que o aplicativo for reiniciado. Se o valor foi definido com sucesso pode ser visto no arquivo de log em %LocalAppData%\NETworkManager\NETworkManager.log + + + Essas configurações alteram apenas o número máximo de threads executados simultaneamente por verificação de host/porta. Vá para Configurações > Geral > Geral para ajustar os threads (mín.) do aplicativo. + + + Status da porta + + + Detalhes do ping + + + Nenhuma porta aberta encontrada! + + + A verificação de porta está desativada! + + + Verificar portas + + + Não foi possível encontrar o aplicativo "{0}". Talvez o aplicativo foi ocultado nas configurações? + + + Janela de status + + + Mostrar barra de endereço + + + Ativar esta configuração não é recomendado. Várias instâncias do aplicativo compartilham as mesmas configurações e arquivos de perfil. A última instância a ser fechada pode substituir as alterações feitas por outras instâncias. + + + Ignorar para endereços locais + + + Habilitar servidor gateway + + + Método de logon + + + Servidor gateway + + + Nome do servidor + + + Compartilhar credenciais do gateway com computador remoto + + + Permitir selecionar mais tarde + + + Cartão inteligente ou Windows Hello para Empresas + + + Solicitar senha (NTLM) + + + Usar credenciais do gateway + + + Seu computador não consegue se conectar ao computador remoto porque o servidor Remote Desktop Gateway está temporariamente indisponível. Tente reconectar mais tarde ou entre em contato com o administrador da rede para obter assistência. + + + Seu computador não consegue se conectar ao computador remoto devido a um dos seguintes motivos: 1) O endereço do servidor Gateway de Área de Trabalho Remota solicitado e o nome da entidade do certificado SSL do servidor não correspondem. 2) O certificado expirou ou foi revogado. 3) A autoridade raiz do certificado não confia no certificado. Entre em contato com o administrador da rede para obter assistência. + + + Este computador não consegue verificar a identidade do Gateway RD "". Não é seguro conectar-se a servidores que não podem ser identificados. Entre em contato com o administrador da rede para obter assistência. + + + Seu computador não pode se conectar ao computador remoto porque o endereço do servidor Gateway de Área de Trabalho Remota solicitado e o nome da entidade do certificado não correspondem. Entre em contato com o administrador da rede para obter assistência. + + + Seu computador não consegue se conectar ao computador remoto porque o certificado do servidor Gateway de Área de Trabalho Remota expirou ou foi revogado. Entre em contato com o administrador da rede para obter assistência. + + + Ocorreu um erro ao enviar dados para o servidor Remote Desktop Gateway. O servidor está temporariamente indisponível ou a conexão de rede está indisponível. Tente novamente mais tarde ou entre em contato com o administrador da rede para obter assistência. + + + Ocorreu um erro ao receber dados do servidor Remote Desktop Gateway. O servidor está temporariamente indisponível ou a conexão de rede está inoperante. Tente novamente mais tarde ou entre em contato com o administrador da rede para obter assistência. + + + Seu computador não consegue se conectar ao computador remoto porque o endereço do servidor Remote Desktop Gateway está inacessível ou incorreto. Digite um endereço de servidor Gateway de Área de Trabalho Remota válido. + + + Seu computador não consegue se conectar ao computador remoto porque o servidor Gateway de Área de Trabalho Remota está com poucos recursos do servidor e está temporariamente indisponível. Tente reconectar mais tarde ou entre em contato com o administrador da rede para obter assistência. + + + O servidor Gateway de Área de Trabalho Remota encerrou a conexão. Tente reconectar mais tarde ou entre em contato com o administrador da rede para obter assistência. + + + O administrador do servidor Remote Desktop Gateway encerrou a conexão. Tente reconectar mais tarde ou entre em contato com o administrador da rede para obter assistência. + + + A Área de Trabalho Remota não pode se conectar ao computador remoto "" por um destes motivos: 1) Sua conta de usuário não está listada na lista de permissões do Gateway RD 2) Você pode ter especificado o computador remoto no formato NetBIOS (por exemplo, computador1) , mas o Gateway RD espera um formato de endereço IP ou FQDN (por exemplo, computer1.fabrikam.com ou 157.60.0.1). Entre em contato com o administrador da rede para obter assistência. + + + A Área de Trabalho Remota não consegue se conectar ao computador remoto "" por um destes motivos: 1) Sua conta de usuário não está autorizada a acessar o Gateway RD "" 2) Seu computador não está autorizado a acessar o Gateway RD "" 3) Você estiver usando um método de autenticação incompatível (por exemplo, o gateway RD pode estar esperando um cartão inteligente, mas você forneceu uma senha). Entre em contato com o administrador da rede para obter assistência. + + + Seu computador não consegue se conectar ao computador remoto porque o administrador da rede restringiu o acesso a este servidor Gateway RD. Entre em contato com o administrador da rede para obter assistência. + + + Seu computador não consegue se conectar ao computador remoto porque o servidor proxy da web requer autenticação. Para permitir o tráfego não autenticado para um servidor Gateway RD através do seu servidor proxy da Web, entre em contato com o administrador da rede. + + + Seu computador não consegue se conectar ao computador remoto porque o servidor Remote Desktop Gateway atingiu o máximo de conexões permitidas. Tente reconectar mais tarde ou entre em contato com o administrador da rede para obter assistência. + + + Seu computador não consegue se conectar ao computador remoto porque o servidor Remote Desktop Gateway não oferece suporte à solicitação. Entre em contato com o administrador da rede para obter assistência. + + + Seu computador não consegue se conectar ao computador remoto porque o cliente não oferece suporte a um dos recursos do Gateway de Área de Trabalho Remota. Entre em contato com o administrador da rede para obter assistência. + + + Seu computador não consegue se conectar ao computador remoto porque o servidor Remote Desktop Gateway e este computador são incompatíveis. Entre em contato com o administrador da rede para obter assistência. + + + Seu computador não consegue se conectar ao computador remoto porque nenhum certificado foi configurado para uso no servidor Gateway de Área de Trabalho Remota. Entre em contato com o administrador da rede para obter assistência. + + + Seu computador não consegue se conectar ao computador remoto porque o servidor Gateway RD ao qual você está tentando se conectar não é permitido pelo administrador do computador. Se você for o administrador, adicione este nome de servidor Gateway de Área de Trabalho Remota à lista confiável de servidores Gateway de Área de Trabalho Remota em seu computador e tente conectar-se novamente. + + + Seu computador não pode se conectar ao computador remoto porque seu computador ou dispositivo não atendeu aos requisitos de proteção de acesso à rede definidos pelo administrador de rede, por um dos seguintes motivos: 1) O nome do servidor Remote Desktop Gateway e o certificado de chave pública do servidor o nome do assunto não corresponde. 2) O certificado expirou ou foi revogado. 3) A autoridade raiz do certificado não confia no certificado. 4) A extensão da chave do certificado não oferece suporte à criptografia. 5) Seu computador não consegue verificar a lista de certificados revogados. Entre em contato com o administrador da rede para obter assistência. + + + Seu computador não pode se conectar ao computador remoto porque são necessários um nome de usuário e uma senha para autenticar no servidor Gateway de Área de Trabalho Remota em vez de credenciais de cartão inteligente. + + + Seu computador não pode se conectar ao computador remoto porque são necessárias credenciais de cartão inteligente para autenticação no servidor Gateway de Área de Trabalho Remota, em vez de um nome de usuário e senha. + + + Seu computador não consegue se conectar ao computador remoto porque um cookie inválido foi enviado ao servidor Remote Desktop Gateway. Entre em contato com o administrador da rede para obter assistência. + + + Seu computador não consegue se conectar ao computador remoto porque o cookie foi rejeitado pelo servidor Remote Desktop Gateway. Entre em contato com o administrador da rede para obter assistência. + + + Seu computador não consegue se conectar ao computador remoto porque o servidor Gateway de Área de Trabalho Remota espera um método de autenticação diferente daquele tentado. Entre em contato com o administrador da rede para obter assistência. + + + A conexão do Gateway RD foi encerrada porque a autenticação periódica do usuário falhou. Tente se reconectar com um nome de usuário e senha corretos. Se a reconexão falhar, entre em contato com o administrador da rede para obter mais assistência. + + + A conexão do Gateway RD foi encerrada porque a autorização periódica do usuário falhou. Tente se reconectar com um nome de usuário e senha corretos. Se a reconexão falhar, entre em contato com o administrador da rede para obter mais assistência. + + + Seu computador não consegue se conectar ao computador remoto porque o Gateway de Área de Trabalho Remota e o computador remoto não conseguem trocar políticas. Isso pode acontecer por um dos seguintes motivos: 1. O computador remoto não é capaz de trocar políticas com o Gateway de Área de Trabalho Remota. 2. A configuração do computador remoto não permite uma nova conexão. 3. A conexão entre o Gateway de Área de Trabalho Remota e o computador remoto foi encerrada. Entre em contato com o administrador da rede para obter assistência. + + + A conexão do Gateway RD foi encerrada porque a autorização periódica do usuário falhou. Seu computador ou dispositivo não atendeu aos requisitos de proteção de acesso à rede (NAP) definidos pelo administrador da rede. Entre em contato com o administrador da rede para obter assistência. + + + Conectad + + + Erro ao examinar adaptador Wi-Fi "{0}" com erro: "{1}" + + + Conectar... + + + {0} desconectado! + + + Conectar à {0} + + + WPS + + + Conectar automaticamente + + + Chave pré-compartilhada + + + Conectando à {0}... + + + Não foi possível conectar-se a "{0}({1})"! + + + Conectado com sucesso a {0}! + + + O acesso à rede foi revogado + + + Credenciais inválidas + + + Rede não disponível + + + Sucesso + + + A tentativa de conexão expirou + + + -/- + + + Protocolo de autenticação não suportado! + + + Verificando WPS... + + + Abrir perfil OID... + + + MIB + + + Perfis OID + + + Selecionar perfi OID + + + Adicionar perfil OID + + + Excluir perfil OID + + + O perfil OID selecionado será excluído permanentemente. + + + Editar perfil OID + + + Inserir senha... + + + Adicionar aba + + + (do perfil) + + + Nova máscara de sub-rede + + + Adicionar servidor + + + Servidor SNTP + + + As configurações nesta página contêm erros. Corrija-os para poder salvar. + + + Chave de host SSH a ser usada para a conexão (ex.: "71:b8:f2:6e..."). Disponível apenas se o modo for "SSH". + + + Caminho completo para o arquivo de chave privada (ex.: "C:\Users\BornToBeRoot\SSH\private_key.ppk"). Disponível apenas se o modo for "SSH". + + + Nome de usuário que será passado para a sessão PuTTY. Disponível apenas se o modo for "SSH", "Telnet" ou "Rlogin". + + + ASN + + + Nome AS + + + Cidade + + + Continente + + + País + + + Moeda + + + Distrito + + + Resolvedor DNS + + + EDNS + + + Geolocalização + + + Hospedagem + + + Geolocalização por IP + + + ISP + + + Latitude + + + Longitude + + + Móvel + + + Organização + + + Registro PTR + + + Fuso horário + + + CEP + + + API de geolocalização por IP – rápida, precisa e confiável + + + Verificar resolvedor DNS + + + Verificar geolocalização por IP + + + Mostrar mapa + + + O resolvedor DNS é determinado via ip-api.com. + +URL: https://edns.ip-api.com/ + + + A geolocalização por IP é determinada via ip-api.com. + +URL: http://ip-api.com/ + + + Para fornecer recursos adicionais, são utilizados serviços de terceiros que não são operados por mim. Você pode desmarcá-los abaixo. Nenhum dado é transferido para mim em nenhum momento. + + + Verificando resolvedor DNS + + + Verificando geolocalização por IP + + + Verifique sua conexão de rede e tente novamente em alguns segundos. + + + Limite de taxa ip-api.com atingido (muitas solicitações da sua rede)! +Tente novamente em alguns segundos. + + + Código de status HTTP + + + Aço + + + Limite de taxa atingido! Tente novamente em {0} segundos... + + + Geral + + + BSSID + + + Nenhum host acessível encontrado! + + + Aplicativo + + + Habilite recursos experimentais para testar novas funções. Eles ainda não estão completos, contêm bugs, podem travar o aplicativo e podem mudar novamente até o lançamento. + + + Recursos experimentais + + + Experimental + + + Executar comando... + + + Geolocalização por IP + + + Adicionar aba para consultar geolocalização por IP... + + + Adicionar domínio para consultar whois... + + + Adicionar host para consultar geolocalização por IP... + + + Nome de usuário desconhecido. + + + Falha de autenticação (senha, comunidade ou chave incorreta). + + + A operação foi bem-sucedida sem erros. + + + A resposta à sua solicitação era muito grande para caber em uma única resposta! + + + O OID solicitado não foi encontrado! + + + Um objeto de leitura-gravação ou somente gravação foi definido com um valor inconsistente! + + + O OID solicitado não existe e não é gravável! + + + Ocorreu um erro para o qual nenhuma mensagem específica está disponível! + + + O objeto solicitado não está acessível para modificação! + + + O objeto foi definido como um tipo de dados incompatível! + + + O valor atribuído ao objeto excede seu comprimento máximo! + + + A codificação usada para o objeto está incorreta! + + + O valor atribuído ao objeto não é uma escolha válida! + + + O objeto solicitado não existe e não pode ser criado! + + + A variável MIB está atualmente em um estado inconsistente e não pode ser modificada! + + + Não há recursos de sistema disponíveis para realizar a operação solicitada! + + + Ocorreu um erro durante a operação definida! + + + Uma operação definida falhou e as alterações anteriores não puderam ser revertidas! + + + Falha na autenticação. Por favor, verifique a string da comunidade! + + + O objeto solicitado não é gravável e não pode ser modificado! + + + O estado do objeto é inconsistente, impedindo a operação definida! + + + Fechar todos + + + Expandir visualização do host + + + Expandir visualização do mapa + + + O host não pode ser definido enquanto outros hosts estão sendo adicionados. Aguarde até que o processo seja concluído e tente novamente. + + + Nenhum comando correspondente! + + + Nome do host remoto + + + ID do processo + + + Caminho do processo + + + Nome do processo + + + NetBIOS + + + Nome do computador + + + Erro + + + OK + + + Aviso + + + Grupo / domínio + + + NetBIOS acessível + + + Verificar por NetBIOS + + + A verificação NetBIOS está desativada! + + + A resolução de nome de host está desativada! + + + A resolução de endereço MAC está desativada! + + + Fechar grupo + + + Executar comando... (Ctrl+Shift+P) + + + Arquivos do perfil + + + Abrir configurações... + + + Expandir e abrir pesquisa... + + + A partir do Windows 11 24H2, você precisará permitir o acesso ao adaptador Wi-Fi. + +Abra Configurações do Windows > Privacidade e segurança > Localização, habilite o acesso para Aplicativos da Área de Trabalho / NETworkManager e reinicie o aplicativo. + + + Arraste e solte os aplicativos para reordená-los. +Clique direito para mais opções. + + + Restaurar padrões + + + Uma framework de arrastar e soltar para WPF fácil de usar. + + + BSD-3-Clause + + + Definir padrão + + + Ubuntu Server rodando Docker com Nextcloud e Traefik... + + + Servidores Linux rodando em AWS... + + + 6 GHz + + + Apoie o projeto com uma doação. + + + Abrir documentação + + + Doar + + + Arquivo de perfil + + + Editor de arquivo hosts + + + Editor de arquivo hosts + + + Modo somente leitura. Modificar o arquivo hosts requer direitos elevados! + + + Abrir arquivo hosts + + + Comentário + + + Desativar + + + Editar entrada + + + Editar entrada... + + + Ativar entrada + + + Desativar entrada + + + Atualizando... + + + Recarregado às {0} + + + Falha ao carregar o arquivo hosts: {0} + + + Repetindo em {0} segundos... + + + O que há de novo? + + + Registro de alterações + + + Atualizado para {0} + + + Esta versão inclui novos recursos, melhorias e correções de erros. Confira o registro de alterações para todos os detalhes! + + + Entradas + + + A entrada selecionada será excluída permanentemente: + +{0} {1} {2} + + + Servidor DNS primário + + + Digite um nome de host válido (ex.: "servidor-01.com" ou "exemplo.com")! Vários nomes de hosts podem ser separados por espaços. + + + O arquivo "hosts" não pôde ser lido! Veja o log para maiores detalhes + + + O arquivo "hosts" não pôde ser escrito. Veja o log para maiores detalhes + + + A entrada não foi encontrada no arquivo "hosts"! Talvez o arquivo tenha sido modificado. + + + Um backup do arquivo "hosts" não pôde ser criado! Veja o arquivo de log para maiores detalhes. + + + Mostrar barra de status + + + Exibe a barra de status no canto inferior esquerdo do WebView ao passar o mouse sobre um link. + + + Salvar credenciais + + + Exibe uma caixa de diálogo para salvar credenciais após um login bem-sucedido. + + + Excluir dados de navegação + + + Exclua permanentemente os dados de navegação (histórico, cookies, cache, credenciais, etc.) para o perfil WebView2 atual. + + + Dados de navegação + + + Dados de navegação excluídos com sucesso! + + + Ocorreu um erro ao excluir dados de navegação. Sinta-se à vontade para relatar o problema no GitHub. + + + produção + + + Adicionar etiqueta + + + Aplicar filtro + + + Filtrar perfis... + + + Filtrar por etiquetas + + + Nenhuma etiqueta encontrada! + + + Corresponder + + + Qualquer + + + Adicionar grupo... + + + Exportar tudo + + + Fechar todos + + + Use temas personalizados para personalizar a aparência do aplicativo. Você pode editar ou adicionar temas na pasta "Temas" dentro da pasta do programa. Para mais detalhes, consulte a documentação. + + + Sessão de administração (console) + + + O arquivo de perfil "{0}" será excluído permanentemente. + + + Habilitar criptografia? + + + Deseja ativar a criptografia do arquivo de perfil para proteger dados confidenciais, como hosts, endereços IP, URLs e credenciais armazenadas? + +Você pode ativar ou desativar a criptografia posteriormente, a qualquer momento, clicando com o botão direito do mouse no arquivo de perfil para gerenciar as configurações de criptografia. +Se clicar em Cancelar, o arquivo de perfil permanecerá descriptografado. + + + É necessário reiniciar para que as alterações, como as configurações de idioma, sejam aplicadas. + + + Não foi possível analisar ou resolver nenhum dos servidores DNS especificados. + + + Não foi possível analisar "{0}" + + + Número máximo de backups + + + Criar backup diário + + + Número de backups que são mantidos antes que o mais antigo seja excluído. + + + Esta configuração é gerenciada pelo seu administrador. + + + Restaurar local padrão + + + Restaurar + + + Restaurar local padrão? + + + O caminho padrão das configurações é restaurado e o aplicativo é reiniciado em seguida. + +Você pode copiar o arquivo "settings.json" de "{0}" para "{1}" para migar suas configurações anteriores, se necessário. O aplicativo precisa ser fechado para prevenir que as configurações sejam sobrescritas. + + + Alterar local? + + + O local das configurações é alterado e o aplicativo é reiniciado em seguida. + +Você pode copiar o arquivo "settings.json" de "{0}" para "{1}" para migar suas configurações anteriores, se necessário. O aplicativo precisa ser fechado para prevenir que as configurações sejam sobrescritas. + + + Entre um caminho válido para uma pasta! + + + O local dos perfis é alterado e o aplicativo é reiniciado em seguida. + +Você pode copiar seus arquivos de perfil de "{0}" para "{1}" para migrar seus perfis existentes, se necessário. O aplicativo precisa ser fechado para prevenir que os perfis sejam sobrescritos. + + + O local padrão dos perfis é alterado e o aplicativo é reiniciado em seguida. + +Você pode copiar seus arquivos de perfil de "{0}" para "{1}" para migrar seus perfis existentes, se necessário. O aplicativo precisa ser fechado para prevenir que os perfis sejam sobrescritos. + + + Conexão de rede + + + Status da rede + + + Falha ao importar Active Directory. + + + Opções + + + + Usa suas credenciais atuais do Windows para ler o Active Directory. A conta deve ter permissão para enumerar objetos de computador na base de pesquisa (subárvore). + + + Base de pesquisa (DN) + + + Filtro LDAP adicional + + + O filtro deve ser uma expressão LDAP válida começando com '(' e terminando com ')'. + + + A base de pesquisa deve ser um nome distinto LDAP válido (por exemplo, DC=example,DC=com). + + + Importado do Active Directory em {0} + + + Nenhum computador encontrado para a base de pesquisa e filtro fornecidos. + + + Procurando Active Directory... + + + Se o seu computador não estiver associado ao domínio, especifique o controlador de domínio (nome do host ou IP) e use credenciais personalizadas. + + + Servidor (opcional) + + + Porta (opcional) + + + Usar SSL (LDAPS) + + + Usar credenciais atuais do Windows + + + Usar estas credenciais + + + Avançado + + + Selecionar tudo + + + Desmarcar tudo + + + Habilitar para + + + Ignorar já importados + + + {0} · {1} resultado(s) + + + {0} perfis importados. +{1} entradas duplicadas ignoradas. +{2} sem um host ignorados. + + + Active Directory + + + Arquivo CSV + + + Arquivo CSV + + + Importar perfis do arquivo CSV + + + Importado do arquivo CSV em {0} + + + Nenhuma entrada encontrada no arquivo CSV. + + + Formato CSV esperado - um perfil por linha: + + + A linha de cabeçalho e o delimitador (ponto e vírgula, vírgula ou tabulação) são detectados automaticamente. A coluna de descrição é opcional. Entradas sem host não podem ser importadas. + + + Importar resultados + + + Novo + + + Importado + + + Nenhum host + + + Excluir contas desativadas + + + Importar computadores do Active Directory + + + Importar computadores do Active Directory... + + + Importar perfis + + + Fonte + + + Active Directory + + + Grupo de perfis + + + Nome de grupo existente ou novo + + + Firewall + + + Regras do firewall + + + Configurações do firewall do Windows + + + Direção + + + Entrada + + + Saída + + + Ação + + + Permitir + + + Bloquear + + + Perfil de rede + + + Perfis de rede + + + Tipo de interface + + + Falha ao carregar regras do firewall. {0} + + + A regra do firewall selecionada foi excluída permanentemente: + +{0} + + + Qualquer + + + TCP + + + UDP + + + ICMPv4 + + + ICMPv6 + + + HOPOPT + + + GRE + + + IPv6 + + + IPv6-Route + + + IPv6-Frag + + + IPv6-NoNxt + + + IPv6-Opts + + + VRRP + + + PGM + + + L2TP + + + Qualquer + + + Com fio + + + Sem fio + + + Acesso remoto + + + Modo somente leitura. Modificar as regras do forewall requer direitos elevados! + + + Entrada + + + Saída + + + Bloquear + + + Permitir + + + Portas locais + + + Portas remotas + + + Endereços locais + + + Endereços remotos + + + Insira um endereço IP válido, sub-rede (por exemplo, 10.0.0.0/8), intervalo (por exemplo, 10.0.0.1-10.0.0.10) ou palavra-chave (Any, LocalSubnet, DNS, DHCP, WINS, DefaultGateway, Internet, Intranet, IntranetRemoteAccess, PlayToDevice, CaptivePortal) + + + Adicionar regra + + + Adicionar regra... + + + Editar regra + + + Editar regra... + + + Excluir regra + + + Habilitar regra + + + Desabilitar regra + + + Importar perfis... + + + Teste de velocidade + + + Executar teste de velocidade + + + Buscando metadados... + + + Medindo latência... + + + Medindo velocidade de download... + + + Medindo velocidade de upload... + + + Meça as velocidades de download e upload, a latência e o jitter com speed.cloudflare.com. +A Cloudflare pode registrar seu endereço IP e informações de rede. Consulte a política de privacidade da Cloudflare para obter detalhes. + + + Latência + + + Jitter + + + Serviço de teste de velocidade usado para medir a velocidade de download, a velocidade de upload, a latência e o jitter. + + + Parar diff --git a/Source/NETworkManager.Localization/Resources/Strings.resx b/Source/NETworkManager.Localization/Resources/Strings.resx index 3f2115733d..1157005191 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.resx @@ -1,4 +1,4 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Щодо + + + Тон + + + Додати облікові дані + + + Додати запис + + + Додати профіль + + + Ви впевненні? + + + ARP + + + ARP Таблиця + + + Автентифікація + + + Автозапуск + + + Калькулятор + + + Аргументи командного рядка + + + Налаштувати + + + Підтвердити + + + Підключити + + + Підключити як + + + Копіювати профіль + + + Облікові дані + + + Дані + + + Додаток по замовчуванні + + + Видалити облікові дані + + + Видалити профіль + + + Ціль + + + Деталі + + + Відключенний + + + Дисплей + + + DNS + + + Пошук DNS + + + Не фрагментувати + + + Змінити облікові дані + + + Редагувати групу + + + Редагувати профіль + + + Помилка + + + Експорт + + + Фільтр + + + Загальні + + + Заголовки + + + Історія + + + Гарячі клавіші + + + HTTP Заголовки + + + Імпорт + + + Information + + + Interface + + + IP Scanner + + + Keyboard + + + Language + + + Libraries + + + License + + + Local devices and resources + + + Location + + + Lookup + + + MAC Address + + + Master Password + + + Multithreading + + + Network + + + Network Interface + + + New tab + + + OUI + + + Overwrite? + + + Ping + + + Port + + + Portable + + + Port Scanner + + + Profiles + + + PuTTY + + + Query + + + Remote Desktop + + + Reset + + + Resolve PTR + + + Resources + + + Result + + + Route + + + Scan + + + Search + + + Select a profile... + + + Set Master Password + + + Settings + + + SNMP + + + Socket + + + Statistics + + + Status + + + Subnet + + + Subnetting + + + Success! + + + Theme + + + Traceroute + + + Tray + + + Update + + + v1/v2c + + + v3 + + + Validation failed! + + + Wake on LAN + + + Website + + + Window + + + Wrong password! + + + Client + + + Administrator + + + Always show icon in tray + + + Attempts + + + Average time + + + Broadcast + + + Buffer + + + Bytes + + + CIDR + + + Close + + + Default-Gateway + + + Delete... + + + Description + + + DHCP enabled + + + DHCP lease expires + + + DHCP lease obtained + + + DHCP server + + + DNS server(s) + + + DNS suffix + + + Dynamic IPv4 address + + + Dynamic IPv4 DNS server + + + Hop + + + Hops + + + Hostname + + + IP address + + + IP addresses + + + IPv4 + + + IPv4 address + + + IPv4-Default-Gateway + + + IPv6 + + + IPv6 address + + + Link-local IPv6 address + + + IPv6-Default-Gateway + + + Maximum + + + Maximum hops + + + Minimize main window instead of terminating the application + + + Minimize to tray instead of taskbar + + + Minimum + + + Name + + + Network address + + + New subnetmask or CIDR + + + No + + + Obtain an IP address automatically + + + Obtain DNS server address automatically + + + Packet loss + + + Packets transmitted + + + PhysicalAddress + + + Preferred protocol when resolving hostname: + + + Primary DNS server + + + Received / Lost + + + Resolve hostname + + + Restart required + + + Save settings in the application folder + + + Secondary DNS server + + + Show + + + Show the following application on startup: + + + A powerful tool for managing networks and troubleshoot network problems! + + + Speed + + + Start minimized in tray + + + Start with Windows (current user) + + + Static IPv4 address + + + Static IPv4 DNS server + + + Subnet mask + + + Threads + + + Time + + + Time 1 + + + Time 2 + + + Time 3 + + + Timeout + + + Timeout (ms) + + + Time (ms) to wait between each ping + + + TTL + + + Type + + + Use the following DNS server addresses: + + + Use the following IP address: + + + Wake up + + + Yes + + + Add + + + Add a tab to perform a DNS lookup... + + + Add a tab to perform a network scan... + + + Add a tab to perform an SNMP action... + + + Add a tab to perform a ping... + + + Add a tab to perform a port scan... + + + Add a tab to perform a trace... + + + Add DNS suffix (primary) to hostname + + + Additional command line + + + Additionals + + + Add profile... + + + Adjust screen automatically + + + Answers + + + The application will be restarted afterwards! + + + Apply + + + Apply Windows key combinations (e.g., ALT+TAB): + + + Auth + + + Authentication level + + + Authorities + + + Automatically update every + + + back + + + Backup + + + Baud + + + The operation has been canceled by the user! + + + Caps lock is enabled! + + + Check for updates at startup + + + Class + + + Clear filter + + + Color depth (bit) + + + Community + + + Configure the path to PuTTY in the settings... + + + Confirm close + + + Are you sure you want to close the application? + + + Connect as... + + + Connect external + + + Connect the network card to a network to configure it! + + + Copy + + + Copy as... + + + Copy... + + + Could not resolve hostname for: "{0}" + + + Credential + + + Profile files are encrypted on disk using AES with a key size of 256 bits and a block size of 128 bits in CBC mode. The encryption key is derived from a master password using Rfc2898DeriveBytes (PBKDF2) with 1,000,000 iterations. At runtime, passwords are stored as SecureString once the profile file is loaded. For some functions, the password must be converted to a normal string and remains unencrypted in memory until the garbage collector cleans them up. + +First make a backup copy of your profile files before enabling encryption! + + + Custom + + + Custom screen size: + + + Data has been updated! + + + Credentials must be decrypted and loaded to manage them. + + + Default + + + Baud rate + + + Default port: + + + Rlogin port + + + SSH port + + + Telnet port + + + The selected credential will be deleted permanently. + + + Delete entry + + + Selected profile will be deleted permanently. + + + DNS autconfiguration + + + DNS Lookup... + + + DNS server + + + Domain + + + Duration + + + Edit... + + + Enable + + + Enable Credential Security Support Provider + + + End time + + + Enter a subnet to calculate it... + + + Enter subnet and a new subnet mask to create subnets... + + + Couldn't connect to 'api.github.com', check your network connection! + + + Error in response! + + + Error in response! Check if you have write permissions. + + + Expand + + + First usable IP address + + + Fixed screen size: + + + Found + + + Group + + + Height + + + Host + + + Hostname or IP address + + + Hosts + + + ID + + + Inherit host from general + + + IP range + + + Last usable IP address + + + Local IP address + + + Local port + + + MAC address or vendor + + + Magic packet successfully sent! + + + Maximum number ({0}) of hops/router reached! + + + Message size + + + Mode + + + Multicast + + + Multiple instances + + + The network address cannot be reached. Check if your computer is connected to the network. For information about network troubleshooting, see Windows Help. + + + New connection... + + + No DNS record found for "{0}"! Check your input and the settings. + + + No enabled network adapters found! + + + No ports found. Check your input! + + + No profiles found! +Create one... + + + Nothing found! + + + Nothing to do. Check your input! + + + No update available! + + + No valid file found to import. + + + No vendor found. Check your input! + + + Number of errors after which is canceled: + + + Number of stored entries + + + OID + + + Only when using the full screen + + + On the remote computer + + + On this computer + + + Open + + + Open license + + + Open project + + + Open website + + + override + + + Password + + + Passwords do not match! + + + Path + + + Port or service + + + Ports + + + Priv + + + Profile + + + Profiles reloaded + + + Protocol + + + PuTTY process has ended! + + + Questions + + + RAW + + + Recursion + + + Redirect clipboard + + + Redirect devices + + + Redirect drives + + + Redirect ports + + + Redirect printers + + + Redirect smartcards + + + Remaining time + + + Remote IP address + + + Remote port + + + Repeat + + + Resolve CNAME on ANY requests + + + Responses + + + Rlogin + + + Scanned + + + Searched application not found! + + + Searched language not found! + + + Searched setting not found! + + + Security + + + Select a screen resolution + + + This will reset all settings! + + + Serial + + + Serial line + + + Service + + + The found settings file was corrupted or is not compatible with this version! You may report this issue on GitHub. + +A backup of the settings file was created in the settings folder and the settings were reset. + +Profile files are not affected! + + + Show closed ports + + + Show current application title + + + Show only most common query types + + + Show unreachable IP addresses and ports + + + Show statistics + + + SSH + + + Start time + + + State + + + Subnet 1 + + + Subnet 2 + + + Tags + + + Telnet + + + The application can be started without parameters! + + + The following hostnames could not be resolved: + + + The following parameters are available: + + + The following parameters can not be processed: + + + The process can take up some time and resources (CPU / RAM). + + + The settings location is not affected! + + + Timeout on SNMP query. Maybe the host is not reachable or the community / password is wrong. + + + Timeout when querying the DNS server with the IP address "{0}"! + + + Timestamp + + + Trace + + + Unkown error! + + + Untray / Bring window to foreground + + + URL + + + Use credentials + + + Use the current view size as the screen size + + + Use custom DNS server + + + Use custom DNS suffix + + + Use resolver cache + + + User interface locked! + + + Username + + + Vendor + + + Version + + + Version {0} is available! + + + Walk mode + + + Width + + + Profile file could not be decrypted with the given password. + + + The entered password is wrong. + + + Add... + + + Add entry... + + + Calculate + + + Cancel + + + Change + + + Change Master Password... + + + Check + + + Check for updates + + + Closed + + + Continue + + + Custom: + + + Cut + + + Decrypt and load... + + + Delete + + + Delete table + + + Enter location... + + + Everything + + + Filter... + + + Flush DNS cache + + + Decrypt and load your credentials to select them. + + + Displays this dialog. + + + Resets all application settings. + + + The password is not displayed when editing, but can be overwritten. + + + [0] If server authentication fails, connect to the computer without warning. +[1] If server authentication fails, do not establish a connection. +[2] If server authentication fails, show a warning and allow me to connect or refuse the connection. +[3] No authentication requirement is specified. + + + Tags help you organize profiles/Profiles by topics/projects. Multiple tags can be used with ";" be separated. Search by tags with "tag=xxx". + + + Hour(s) + + + Location of the import file... + + + Minute(s) + + + Move & Restart + + + Network connections.... + + + (not changed) + + + Off + + + OK + + + On + + + Open location + + + Open settings + + + Overwrite + + + Paste + + + Reconnect + + + Refresh + + + Restart now + + + Save + + + Search... + + + Second(s) + + + Send + + + Set Master Password... + + + Show local licenses + + + Subnet Calculator + + + Validate + + + Connections + + + Enter a valid IP range! + + + Enter a valid IPv4 address! + + + Enter a valid MAC address (e.g., 00:F1:23:AB:F2:35)! + + + Enter a valid port (1 - 65535)! + + + Enter a valid subnetmask (e.g., 255.255.255.0)! + + + Enter a valid subnetmask or CIDR (e.g., 255.255.255.0 or /24)! + + + Field cannot be empty! + + + File does not exists! + + + Folder does not exists! + + + Listeners + + + Amber + + + Appearance + + + Applications + + + Dark + + + Light + + + Black + + + Blue + + + Brown + + + Cobalt + + + Crimson + + + Cyan + + + Emerald + + + Enter one or more valid IP addresses! + + + Enter a valid baud! + + + Enter valid hosts (multiple hosts can not end with ";")! + + + Enter a valid IP address! + + + Enter a valid number! + + + Enter a valid OID! + + + Enter a valid port and/or port range (1 - 65535)! + + + Enter a valid subnet (e.g., 192.168.178.133/26)! + + + Enter a valid website (e.g., https://example.com/index.html) + + + Green + + + Import / Export + + + Indigo + + + Destination host unreachable. + + + Destination network unreachable. + + + Destination port unreachable. + + + Success + + + Request timed out. + + + TTL expired in transit. + + + Key must have 8 characters or more! + + + Lime + + + Magenta + + + Mauve + + + Olive + + + Only numbers can be entered! + + + Orange + + + Pink + + + Purple + + + Red + + + Socket closed. + + + Remote disconnect by server. + + + Decompression error. + + + Connection timed out. + + + Decryption error. + + + DNS name lookup failure. + + + DNS lookup failed. + + + Encryption error. + + + Windows Sockets gethostbyname call failed. + + + Host not found. + + + Internal error. + + + Internal security error. + + + Internal security error. + + + The encryption method specified is not valid. + + + Bad IP address specified. + + + The IP address specified is not valid. + + + Security data is not valid. + + + Server security data is not valid. + + + License negotiation failed. + + + Licensing time-out. + + + Local disconnection. + + + No information is available. + + + Out of memory. + + + Out of memory. + + + Out of memory. + + + Remote disconnect by user. + + + Failed to unpack server certificate. + + + Windows Sockets connect failed. + + + Windows Sockets recv call failed. + + + The account is disabled. + + + The account is expired. + + + The account is locked out. + + + The account is restricted. + + + The received certificate is expired. + + + The policy does not support delegation of credentials to the target server. + + + The server authentication policy does not allow connection requests using saved credentials. The user must enter new credentials. + + + Login failed. + + + No authority could be contacted for authentication. The domain name of the authenticating party could be wrong, the domain could be unreachable, or there might have been a trust relationship failure. + + + The specified user has no account. + + + The password is expired. + + + The user password must be changed before logging on for the first time. + + + Delegation of credentials to the target server is not allowed unless mutual authentication has been achieved. + + + The smart card is blocked. + + + An incorrect PIN was presented to the smart card. + + + Timeout occurred. + + + Internal timer error. + + + Windows Sockets send call failed. + + + Sienna + + + Spaces are not allowed! + + + Steel + + + Taupe + + + Closed + + + CloseWait + + + Closing + + + DeleteTcb + + + Established + + + FinWait1 + + + FinWait2 + + + LastAck + + + Listen + + + SynReceived + + + SynSent + + + TimeWait + + + Unkown + + + Teal + + + Violet + + + White + + + Yellow + + + A profile with this name already exists! + + + Closed + + + Open + + + At least one application must be visible! + + + Hidden applications + + + Visible applications + + + Visible applications in the bar: + + + Whois + + + Add a tab to query whois... + + + Enter a valid domain (e.g., "example.com")! + + + Whois server not found for the domain: "{0}" + + + Routing + + + Release + + + Release & Renew + + + Renew + + + Windows DNS settings + + + Delete DNS server + + + The selected DNS server will be deleted permanently. + + + Add DNS server + + + Edit DNS server + + + A DNS server with this name already exists! + + + Restart session + + + TigerVNC + + + Configure the path to TigerVNC in the settings... + + + TigerVNC process has ended! + + + Connecting... + + + Resolve MAC address and vendor + + + Note + + + Export all + + + Export... + + + Export selected + + + Location... + + + File + + + Enter a valid file path! + + + All + + + Format + + + Selected + + + An error occurred while exporting the data. See error message for details: + + + Design + + + Highlight timeouts + + + Enter subnets to create a wide subnet... + + + Wide Subnet + + + Add tab... + + + Add IPv4 address... + + + Add IPv4 address + + + Max. concurrent host threads + + + Max. concurrent port threads + + + PowerShell + + + Configure the path to PowerShell in the settings... + + + PowerShell process has ended! + + + Execution Policy + + + Remote console + + + File path + + + Override default settings + + + Resolve IPv4 address for this host + + + Hide + + + Total bytes received + + + Total bytes sent + + + Download + + + Bandwidth + + + Upload + + + Apply Windows key combinations + + + Credential Security Support Provider + + + Background job + + + The background job will save settings and profiles every x-minutes. + +Value 0 will disable this feature. + +Changes to this value will take effect after restarting the application. + + + Run background job every x-minute + + + Your system OS is incompatible with the latest release! + + + Dashboard + + + All settings can be changed later in the settings! + + + Check public IP address + + + Thank you for using NETworkManager! + +If you enjoy it, please consider supporting its development — whether by leaving a star on GitHub, making a donation, or simply sharing it with others. Your support helps keep the project going and growing. + + + When starting the program, it checks in the background whether a new program version is available on GitHub. + +URL: https://api.github.com/ + + + The public IP address is determined via ipify.org. + +URL: https://api.ipify.org and https://api6.ipify.org + + + Privacy + + + Welcome + + + External services + + + Star/Fork the Project on GitHub. + + + Help translate the project on Transifex. + + + Follow or contact me via X. + + + Connection + + + Computer + + + Gateway / Router + + + Internet + + + Check your network adapter configuration (dns) and if your dns server is configured correctly. + + + Check your network adapter configuration (dhcp, static ip) and if you are connected to a network. + + + Could not detect gateway ip address! + + + Could not detect local ip address! + + + Could not get public ip address via WebRequest (http/https) from "{0}"! Check your network connection (firewall, proxy, etc.). + + + No A dns records resolved for "{0}"! + + + No PTR dns record resolved for "{0}"! + + + "{0}" A dns records resolved for "{1}"! + + + PTR dns record resolved for "{0}"! + + + Got "{0}" as public ip address from "{1}"! + + + Resolved "{0}" as hostname for ip address "{1}"! + + + Public IP address check +is disabled! + + + TCP/IP stack is available. "{0}" is reachable via ICMP! + + + TCP/IP stack is not available... "{0}" is not reachable via ICMP! + + + "{0}" detected as gateway ip address! + + + "{0}" detected as local ip address! + + + "{0}" is not reachable via ICMP! + + + "{0}" is reachable via ICMP! + + + Use custom IPv4 address API + + + URL to a web service that can be reached via http or https and returns an IPv4 address e.g., "xx.xx.xx.xx" as response. + + + Could not parse public ip address from "{0}"! Try another service or use the default... + + + Could not connect to "{0}"! + + + IPv4 protocol available + + + IPv6 protocol available + + + Copy + + + Official + + + Network connection type + + + Desktop background + + + Desktop composition + + + Experience + + + Font smoothing + + + Menu and window animation + + + Performance + + + Persistent bitmap caching + + + Reconnect if the connection is dropped + + + High-speed broadband (2 Mbps - 10 Mbps) + + + Low-speed broadband (256 kbps - 2 Mbps) + + + Detect connection quality automatically + + + LAN (10 Mbps or higher) + + + Modem (56 kbps) + + + Satellite (2 Mbps - 16 Mbps with high latency) + + + WAN (10 Mbps or higher with high latency) + + + Show window contents while dragging + + + Visual styles + + + Remote audio + + + Remote audio playback + + + Remote audio recording + + + Do not record + + + Record from this computer + + + Do not play + + + Play on remote computer + + + Play on this computer + + + Gateway + + + Custom commands + + + Add custom command + + + Arguments + + + Delete custom command + + + Edit custom command + + + Program + + + The selected custom command will be deleted permanently. + + + The following variables are available: + +$$ipaddress$$ --> IP adresse +$$hostname$$ --> Hostname + + + Restart + + + Could not resolve ip address for hostname! + + + Ctrl+Alt+Del + + + Keyboard shortcuts + + + Adjust screen + + + Fullscreen + + + Could not send keystroke! + + + Disconnect + + + Detect local ip address and subnetmask + + + Could not detect subnetmask! + + + Detecting network... + + + Closing in {0} seconds... + + + Network unavailable! + + + IP address to detect local ip address based on routing + + + Show status window on network change + + + Time in seconds how long the status window is shown + + + WiFi + + + Networks + + + Searching for networks... + + + No WiFi adapters found! + + + Searching for WiFi adapters... + + + No WiFi networks found! + + + Channels + + + Channel + + + 2.4 GHz + + + 5 GHz + + + Signal strength + + + Current download speed + + + Current upload speed + + + Measured time + + + Network usage + + + Total download + + + Total upload + + + Retries + + + Use cache + + + Use only TCP + + + Query class + + + Domain name + + + Timeout (s) + + + Report an issue or create a feature request. + + + Beacon interval + + + Encryption + + + Infrastructure + + + Network kind + + + Phy kind + + + Uptime + + + Show error message + + + Ping Monitor + + + Add host + + + Add a host to monitor + + + Pause + + + Resume + + + Could not resolve ip address for: "{0}" + + + The application will be restarted... + + + Could not export file! See error message: "{0}" + + + File exported to "{0}"! + + + Could not import file! See error message: "{0}" + + + Location cannot be changed in portable version! + + + Is encrypted + + + Open the documentation. + + + Customer 1 + + + Add profile file + + + Disable encryption... + + + Edit profile file + + + Enable encryption... + + + Encryption... + + + Profile name already exists! + + + Rename + + + Delete profile file + + + All profiles in this profile file will be permanently deleted! + + + Patch + + + Restart the application to change the language! + + + Currently downloaded + + + Currently uploaded + + + LLDP / CDP + + + Restart as Administrator + + + Analysing network packets requires elevated rights! + + + Capture + + + Device + + + Duration (s) + + + Model + + + VLAN + + + Capture network packets to view LLDP or CDP information! + + + No discovery protocol packages received! + + + Capturing network packages... + + + Discovery Protocol + + + CDP + + + LLDP + + + LLDP / CDP + + + {0} seconds remaining... + + + Help + + + Application that is displayed at startup. + + + Parameter + + + Value + + + Web Console + + + Reload + + + Browser + + + The WebView control (Microsoft Edge) cannot connect to websites with an invalid certificate! + + + Microsoft.Windows.SDK.Contracts is required for this feature but not available on this system (e.g. on Windows Server). + + + ARP Table + + + Connections + + + Dashboard + + + Discovery Protocol + + + DNS Lookup + + + HTTP Headers + + + IP Scanner + + + Listeners + + + Lookup + + + Network Interface + + + Ping + + + Ping Monitor + + + Port Scanner + + + PowerShell + + + PuTTY + + + Remote Desktop + + + SNMP + + + Subnet Calculator + + + TigerVNC + + + Traceroute + + + Wake on LAN + + + Web Console + + + Whois + + + WiFi + + + Amber + + + Black + + + Blue + + + Brown + + + Cobalt + + + Crimson + + + Cyan + + + Emerald + + + Green + + + Indigo + + + Lime + + + Magenta + + + Mauve + + + Olive + + + Orange + + + Purple + + + Red + + + Sienna + + + Taupe + + + Teal + + + Pink + + + Yellow + + + Steel + + + General + + + Applications + + + General + + + Appearance + + + Autostart + + + General + + + HotKeys + + + Language + + + Profiles + + + Settings + + + Status + + + Update + + + Window + + + Enable log + + + Log file name + + + Log path + + + Log mode + + + Log + + + SSH log + + + SSH Raw log + + + Session log + + + SSH log + + + SSH and Raw log + + + Enter a valid file name! + + + Lost + + + Received + + + Status change + + + Update available! + + + Private key file + + + Preview + + + Port profiles + + + Add port profile + + + Delete port profile + + + Edit port profile + + + The selected port profile will be deleted permanently. + + + Select port profile + + + Open port profiles... + + + Show SplashScreen on start + + + SplashScreen + + + Download Microsoft Edge WebView2 Runtime + + + Microsoft Edge WebView2 Runtime is not available! + + + Frequency + + + SSID + + + Profile file could not be loaded! + + + The profile file could not be loaded and may be corrupted. You can try to restore the file from a backup or delete it. + +If this happens unexpectedly or after an update, please report the error on GitHub. + + +Error message: +"{0}" + + + Edit group... + + + Decryption error + + + Could not decrypt file. You may report this issue on GitHub. + + + Encryption error + + + Could not encrpyt file. You may report this issue on GitHub. + + + Current password + + + New password + + + Change master password + + + Unlock profile + + + Unlock the profile file to use the profiles! + + + Disclaimer + + + Merge + + + Use other + + + Move + + + Last scan at {0} + + + Hidden Network + + + Developed and maintained by {0} with the help of the + + + A Simple Public IP Address API + + + AirspacePanel fixes all Airspace issues with WPF-hosted Winforms. + + + Shared Controlz for WPF and ... more + + + DnsClient.NET is a simple yet very powerful and high performant open source library for the .NET Framework to do DNS lookups + + + Dragable and tearable tab control for WPF + + + C# library take care of complex network, IP, IPv4, IPv6, netmask, CIDR, subnet, subnetting, supernet, and supernetting calculation for .NET developers. + + + Simple, flexible, interactive & powerful charts, maps and gauges for .Net + + + A collection of loading indicators for WPF + + + Some awesome icons for WPF and UWP all together... + + + A toolkit for creating Metro / Modern UI styled WPF apps. + + + Json.NET is a popular high-performance JSON framework for .NET + + + A GitHub API client library for .NET + + + Capture and parse CDP and LLDP packets on local or remote computers + + + Sharp SNMP Library - Open Source SNMP for .NET and Mono + + + A collection of all country flags in SVG + + + List of Top-Level-Domains from iana.org, which is used to query whois servers of the TLD from whois.iana.org via port 43 + + + OUI data from ieee.org. + + + Service Name and Transport Protocol Port Number Registry from iana.org. + + + Apache License 2.0 + + + BSD-2-Clause + + + MIT License + + + Unlicense + + + C#/WinRT provides packaged WinRT projection support for the C# language. + + + Runtime for hosting PowerShell + + + The WebView2 control enables you to embed web technologies (HTML, CSS, and JavaScript) in your native applications powered by Microsoft Edge (Chromium). + + + Easily add interactivity to your apps using XAML Behaviors for WPF. + + + Microsoft WebView2 License + + + The current profile file is not encrypted and passwords will stored unencrypted on disk! + +Enable profile file encryption in Settings>Profile to store credentials securely. + + + ICMPv4 + + + ICMPv6 + + + Check is disabled! + + + Enter a valid IPv6 address! + + + Public IPv4 address reachable via ICMP. + + + Public IPv6 address reachable via ICMP. + + + Public IPv4 address + + + Public IPv6 address + + + Use custom IPv6 address API + + + Time to live + + + Chassis Id + + + Management + + + Device description + + + Port description + + + Remove IPv4 address + + + Additional config... + + + Remove IPv4 address... + + + The remote session ended because the total login time limit was reached. This limit is set by the server administrator or by network policies. + + + Enter a valid hostname! + + + Enter a valid hostname and port! + + + Unable to reconnect to the remote session. + + + Migrate + + + Report on GitHub + + + Groups + + + Add group + + + Delete group + + + Selected group and all profiles inside this group will be deleted permanently. + + + The name is already used! + + + Resize + + + Delete profiles + + + Selected profiles will be deleted permanently. + + + Use custom themes + + + Custom themes + + + Reset settings? + + + Settings reset! + + + Instance ID + + + Local connection + + + Local interface + + + log4net is a tool to help the programmer output log statements to a variety of output targets. + + + Enabled + + + Регіон + + + Profiles and regions to synchronize + + + Default profile + + + Default region + + + Group name cannot start with "{0}"! + + + Check for pre-releases + + + Synchronization is disabled! + + + Command + + + Apply theme to PowerShell console + + + The color of the PowerShell console can be changed to the application theme under Settings > General > Appearance + + + If you enable this option, the default PowerShell console settings in the registry under HKCU:\Console are overridden so that the PowerShell console window matches the application theme. This is a global system setting that may affect the appearance of the normal PowerShell window. + +Only the PowerShell consoles configured in the PowerShell and AWS Session Manager settings are modified. Both Windows PowerShell and PWSH (PowerShell 7 and higher) are supported. + +Click in the upper right corner on the help / documentation button (left of the minimize button) or navigate to https://borntoberoot.net/NETworkManager/Documentation/Settings/Appearance for more details. Here are the values documented which will be adjusted. + +If the option is disabled again, the values are no longer modified. However, the original values are NOT restored. + + + Input cannot end with a ";"! + + + Input does not contain any text! + + + Bit Calculator + + + Bit Calculator + + + Notation + + + Input + + + Unit + + + Bits + + + Gigabits + + + Gigabytes + + + Kilobits + + + Kilobytes + + + Megabits + + + Megabytes + + + Petabits + + + Petabytes + + + Terabits + + + Terabytes + + + Enter a number and select a unit to calculate the units... + + + Network + + + Proxy + + + Resolve IP address for this host (IPv4 is preferred) + + + A valid path to PowerShell should end with "pwsh.exe" or "powershell.exe"! + + + A valid path to PuTTY should end with "PuTTY.exe"! + + + A valid path to TigerVNC should end with "vncviewer-*.exe" or "vncviewer64-*.exe"! + + + SNTP Lookup + + + Move a .NET Framework/.NET Core app runtime components and dependencies into a sub-directory and make it beauty. + + + Add a tab to perform a SNTP lookup... + + + SNTP server(s) + + + URL to a web service that can be reached via http or https and returns an IPv6 address e.g., "xxxx:xx:xxx::xx" as response. + + + IP endpoint + + + Local end time + + + Local start time + + + Network time + + + Offset + + + Round trip delay + + + Server + + + SNTP Lookup + + + Add SNTP server + + + Delete SNTP server + + + The selected SNTP server will be deleted permanently. + + + Edit SNTP server + + + An SNTP server with this name already exists! + + + Enter a valid hostname (e.g., "server-01" or "example.com") or a valid IP address (e.g., 192.168.178.1)! + + + Server(s) + + + Enter master password to unlock the profile file: + + + Unlock profile file + + + Timed out + + + Hostkey + + + The settings will be reset and the application will be restarted afterwards! + + + Settings have been reset! + + + Ping status + + + ThreadPool additional min. threads + + + This setting specifies the minimum number of threads that will be created from the application's ThreadPool on demand. This can improve the performance for example of the IP scanner or port scanner. + +The value is added to the default min. threads (number of CPU threads). The value 0 leaves the default settings. If the value is higher than the default max. threads of the ThreadPool, this value is used. + +If the value is too high, performance problems may occur. + +Changes to this value will take effect after the application is restarted. Whether the value was set successfully can be seen in the log file under %LocalAppData%\NETworkManager\NETworkManager.log + + + These settings only change the maximum number of concurrently executed threads per host/port scan. Go to Settings > General > General to adjust the (min) threads of the application. + + + Port status + + + Ping details + + + No open ports found! + + + Port scan is disabled! + + + Scan ports + + + Could not find the application "{0}". Maybe the application was hidden in the settings? + + + Status window + + + Show address bar + + + Enabling this setting is not recommended. Multiple instances of the application share the same settings and profile files. The last instance to be closed may overwrite changes made by other instances. + + + Bypass for local addresses + + + Enable gateway server + + + Logon method + + + Gateway server + + + Server name + + + Share Gateway credentials with remote computer + + + Allow me to select later + + + Smart card or Windows Hello for Business + + + Ask for password (NTLM) + + + Use gateway credentials + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server is temporarily unavailable. Try reconnecting later or contact your network administrator for assistance. + + + Your computer can't connect to the remote computer due to one of the following reasons: 1) The requested Remote Desktop Gateway server address and the server SSL certificate subject name do not match. 2) The certificate is expired or revoked. 3) The certificate root authority does not trust the certificate. Contact your network administrator for assistance. + + + This computer can't verify the identity of the RD Gateway "". It's not safe to connect to servers that can't be identified. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server address requested and the certificate subject name do not match. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server's certificate has expired or has been revoked. Contact your network administrator for assistance. + + + An error occurred while sending data to the Remote Desktop Gateway server. The server is temporarily unavailable or a network connection is down. Try again later, or contact your network administrator for assistance. + + + An error occurred while receiving data from the Remote Desktop Gateway server. Either the server is temporarily unavailable or a network connection is down. Try again later, or contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server address is unreachable or incorrect. Type a valid Remote Desktop Gateway server address. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server is running low on server resources and is temporarily unavailable. Try reconnecting later or contact your network administrator for assistance. + + + The Remote Desktop Gateway server has ended the connection. Try reconnecting later or contact your network administrator for assistance. + + + The Remote Desktop Gateway server administrator has ended the connection. Try reconnecting later or contact your network administrator for assistance. + + + Remote Desktop can't connect to the remote computer "" for one of these reasons: 1) Your user account is not listed in the RD Gateway's permission list 2) You might have specified the remote computer in NetBIOS format (for example, computer1), but the RD Gateway is expecting an FQDN or IP address format (for example, computer1.fabrikam.com or 157.60.0.1). Contact your network administrator for assistance. + + + Remote Desktop can't connect to the remote computer "" for one of these reasons: 1) Your user account is not authorized to access the RD Gateway "" 2) Your computer is not authorized to access the RD Gateway "" 3) You are using an incompatible authentication method (for example, the RD Gateway might be expecting a smart card but you provided a password) Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because your network administrator has restricted access to this RD Gateway server. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the web proxy server requires authentication. To allow unauthenticated traffic to an RD Gateway server through your web proxy server, contact your network administrator. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server reached its maximum allowed connections. Try reconnecting later or contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server does not support the request. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the client does not support one of the Remote Desktop Gateway's capabilities. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server and this computer are incompatible. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because no certificate was configured to use at the Remote Desktop Gateway server. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the RD Gateway server that you are trying to connect to is not allowed by your computer administrator. If you are the administrator, add this Remote Desktop Gateway server name to the trusted Remote Desktop Gateway server list on your computer and then try connecting again. + + + Your computer can't connect to the remote computer because your computer or device did not meet the Network Access Protection requirements set by your network administrator, for one of the following reasons: 1) The Remote Desktop Gateway server name and the server's public key certificate subject name do not match. 2) The certificate has expired or has been revoked. 3) The certificate root authority does not trust the certificate. 4) The certificate key extension does not support encryption. 5) Your computer cannot verify the certificate revocation list. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because a user name and password are required to authenticate to the Remote Desktop Gateway server instead of smart card credentials. + + + Your computer can't connect to the remote computer because smart card credentials are required to authenticate to the Remote Desktop Gateway server instead of a user name and password. + + + Your computer can't connect to the remote computer because an invalid cookie was sent to the Remote Desktop Gateway server. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the cookie was rejected by the Remote Desktop Gateway server. Contact your network administrator for assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway server is expecting an authentication method different from the one attempted. Contact your network administrator for assistance. + + + The RD Gateway connection ended because periodic user authentication failed. Try reconnecting with a correct user name and password. If the reconnection fails, contact your network administrator for further assistance. + + + The RD Gateway connection ended because periodic user authorization failed. Try reconnecting with a correct user name and password. If the reconnection fails, contact your network administrator for further assistance. + + + Your computer can't connect to the remote computer because the Remote Desktop Gateway and the remote computer are unable to exchange policies. This could happen due to one of the following reasons: 1. The remote computer is not capable of exchanging policies with the Remote Desktop Gateway. 2. The remote computer's configuration does not permit a new connection. 3. The connection between the Remote Desktop Gateway and the remote computer ended. Contact your network administrator for assistance. + + + The RD Gateway connection ended because periodic user authorization failed. Your computer or device didn't pass the Network Access Protection (NAP) requirements set by your network administrator. Contact your network administrator for assistance. + + + Connected + + + Error while scanning WiFi adapter "{0}" with error: "{1}" + + + Connect... + + + {0} disconnected! + + + Connect to {0} + + + WPS + + + Connect automatically + + + Pre-shared key + + + Connecting to {0}... + + + Could not connect to {0} ({1})! + + + Successfully connected to {0}! + + + Access to the network has been revoked + + + Invalid credentials + + + Network not available + + + Successful + + + Connection attempt timed out + + + -/- + + + Authentication protocol is not supported! + + + Checking WPS... + + + Open OID profiles... + + + MIB + + + OID profiles + + + Select OID profile + + + Add OID profile + + + Delete OID profile + + + The selected OID profile will be deleted permanently. + + + Edit OID profile + + + Enter password... + + + Add tab + + + (from profile) + + + New subnet mask + + + Add server + + + SNTP server + + + The settings on this page contain errors. Correct them to be able to save. + + + SSH hostkey to use for the connection (e.g., "71:b8:f2:6e..."). Only available if the mode is "SSH". + + + Full path to the private key file (e.g., "C:\Users\BornToBeRoot\SSH\private_key.ppk"). Only available if the mode is "SSH". + + + Username that will be passed into the PuTTY session. Only available if the mode is "SSH", "Telnet" or "Rlogin". + + + ASN + + + AS Name + + + City + + + Continent + + + Country + + + Currency + + + District + + + DNS resolver + + + EDNS + + + Geolocation + + + Hosting + + + IP geolocation + + + ISP + + + Latitude + + + Longitude + + + Mobile + + + Organization + + + PTR record + + + Timezone + + + Zip + + + IP Geolocation API - Fast, accurate, reliable + + + Check DNS resolver + + + Check IP geolocation + + + The DNS resolver is determined via ip-api.com. + +URL: https://edns.ip-api.com/ + + + The IP geolocation is determined via ip-api.com. + +URL: http://ip-api.com/ + + + To provide additional features, third party services are used that are not operated by me. You can deselect them below. No data is transferred to me at any time. + + + Checking DNS resolver... + + + Checking IP geolocation... + + + Check your network connection and try again in a few seconds. + + + ip-api.com rate limit reached (too many requests from your network)! +Try again in a few seconds. + + + HTTP status code + + + Steel + + + Rate limit reached! Try again in {0} seconds... + + + General + + + BSSID + + + No reachable hosts found! + + + Application + + + Enable experimental features to test new functions. These are not yet complete, contain bugs, can crash the application and may change again until release. + + + Experimental features + + + Experimental + + + Run command... + + + IP Geolocation + + + Add a tab to query the IP geolocation... + + + Enter a domain to query whois... + + + Enter host to query IP geolocation... + + + Unknown user name. + + + Authentication failure (incorrect password, community or key). + + + The operation was successful without any errors. + + + The response to your request was too large to fit into a single response! + + + The requested OID could not be found! + + + A read-write or write-only object was set to an inconsistent value! + + + The requested OID does not exist and is not writable! + + + An error occurred for which no specific message is available! + + + The requested object is not accessible for modification! + + + The object was set to an incompatible data type! + + + The value assigned to the object exceeds its maximum length! + + + The encoding used for the object is incorrect! + + + The value assigned to the object is not a valid choice! + + + The requested object does not exist and cannot be created! + + + The MIB variable is currently in an inconsistent state and cannot be modified! + + + There are no available system resources to perform the requested operation! + + + An error occurred during the set operation! + + + A set operation failed, and previous changes could not be rolled back! + + + Authentication failed. Please check the community string! + + + The requested object is not writable and cannot be modified! + + + The object's state is inconsistent, preventing the set operation! + + + Close all + + + Expand host view + + + Host cannot be set while other hosts are being added. Please wait until the process is complete and try again. + + + Run command... (Ctrl+Shift+P) + + + No matching commands! + + + Remote hostname + + + Process ID + + + Process path + + + Process name + + + NetBIOS + + + Computer name + + + Error + + + OK + + + Warning + + + Group / domain name + + + NetBIOS reachable + + + Scan for NetBIOS + + + NetBIOS scan is disabled! + + + Resolve Hostname is disabled! + + + Resolve MAC address is disabled! + + + Close group + + + Run command... (Ctrl+Shift+P) + + + Profile files + + + Open settings... + + + Expand and open search... + + + Starting with Windows 11 24H2, you’ll need to allow access to the Wi-Fi adapter. + +Open Windows Settings > Privacy & security > Location, enable access for Desktop Apps / NETworkManager, then restart the application. + + + Drag and drop the applications to reorder them. +Right-click for more options. + + + Restore defaults + + + An easy to use drag'n'drop framework for WPF. + + + BSD-3-Clause + + + Set default + + + Ubuntu Server running Docker with Nextcloud and Traefik... + + + Linux servers running in AWS... + + + 6 GHz + + + Support this project with a donation. + + + Open documentation + + + Donate + + + Profile file + + + Hosts File Editor + + + Hosts File Editor + + + Read-only mode. Modifying the hosts file requires elevated rights! + + + Comment + + + Disable + + + Edit entry + + + Edit entry... + + + Enable entry + + + Disable entry + + + Refreshing... + + + Reloaded at {0} + + + Failed to load hosts file: {0} + + + Retrying in {0} seconds... + + + What's new? + + + Changelog + + + Upgraded to {0} + + + This release includes new features, improvements, and bug fixes. Check out the changelog for all the details! + + + Entries + + + The selected entry is permanently deleted: + +{0} {1} {2} + + + Primary DNS server + + + Enter a valid hostname (e.g., "server-01" or "example.com")! Multiple hostnames can be separated with a space. + + + The "hosts" file could not be read! See log file for more details. + + + The "hosts" file could not be written to. See log file for more details. + + + The entry was not found in the "hosts" file! Maybe the file has been modified. + + + A backup of the "hosts" file could not be created! See log file for more details. + + + Show status bar + + + Displays the status bar in the bottom-left of the WebView when hovering over a link. + + + Save credentials + + + Displays a dialog to save credentials after a successful sign-in. + + + Delete browsing data + + + Permanently delete browsing data (history, cookies, cache, credentials, etc.) for the current WebView2 profile. + + + Browsing Data + + + Browsing data successfully deleted! + + + An error occurred while deleting browsing data. Feel free to report this issue on GitHub. + + + production + + + Add tag + + + Apply filter + + + Filter profiles... + + + Filter by tags + + + No tags found! + + + Match + + + Any + + + Add group... + + + Expand all + + + Collapse all + + + Use custom themes to personalize the appearance of the application. You can edit or add theme in the "Program Folder > Themes" directory. For more details, refer to the documentation. + + + Admin (console) session + + + Profile file "{0}" will be deleted permanently. + + + Enable encryption? + + + Do you want to enable profile file encryption to protect sensitive data such as hosts, IP addresses, URLs, and stored credentials? + +You can enable or disable encryption later at any time by right-clicking the profile file to manage encryption settings. +If you click Cancel, the profile file will remain unencrypted. + + + A restart is required to apply changes such as language settings. + + diff --git a/Source/NETworkManager.Localization/Resources/Strings.zh-CN.resx b/Source/NETworkManager.Localization/Resources/Strings.zh-CN.resx index dc7c25e182..9502e363fa 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.zh-CN.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.zh-CN.resx @@ -121,7 +121,7 @@ 关于 - 焦点 + 强调 新增凭据 @@ -138,8 +138,32 @@ ARP - - ARP 表 + + Neighbor Table + + + Read-only mode. Modifying the neighbor table requires elevated rights! + + + Unreachable + + + Incomplete + + + Probe + + + Delay + + + Stale + + + Reachable + + + Permanent 认证 @@ -199,7 +223,7 @@ DNS - DNS查找 + DNS 查询 不分段 @@ -226,7 +250,7 @@ 全局 - 头信息 + 标头 历史 @@ -285,12 +309,24 @@ 网络接口 + + Configuration applied + + + Configuring the network interface requires elevated rights! + 新标签 + + Next + OUI + + Options + 是否覆盖? @@ -348,9 +384,6 @@ 设置 - - 设置将被重置! - SNMP @@ -444,6 +477,18 @@ 说明 + + Placeholder + + + Path to the file or executable to run. The following placeholders can be used: + + + Arguments passed to the file or executable. The following placeholders can be used: + + + The following placeholder can be used: + DHCP已启用 @@ -469,10 +514,10 @@ 动态IPv4 DNS地址 - 路由 + 跃点 - 路由数 + 跃点数 主机名 @@ -489,29 +534,65 @@ IPv4 地址 + + IPv4 address added + + + IPv4 address removed + + + IPv4 address released and renewed + + + IPv4 address released + + + IPv4 address renewed + + + IPv6 address released and renewed + + + IPv6 address released + + + IPv6 address renewed + - IPv4默认路由 + IPv4 默认路由 - IPv6地址 + IPv6 地址 IPv6 地址 - IPv6链路地址 + IPv6 链路地址 - IPv6默认网关 + IPv6 默认网关 + + + Map + + + (+{0} more) + + + Scroll = Zoom, Drag = Pan + + + Unknown 最大值 - - 最大跳数/路由 + + 最大跃点数 - 最小化窗口不退出 + 最小化主窗口而不是终止应用程序 最小化到任务栏托盘 @@ -526,16 +607,16 @@ 网络地址 - 新的子网掩码或CIDR + 新的子网掩码或 CIDR - 自动获取IP地址 + 自动获取 IP 地址 - 自动获取DNS + 自动获取 DNS 丢包 @@ -550,7 +631,7 @@ 解析主机名时的首选协议: - 主DNS服务器 + 主 DNS 服务器 接收 / 丢失 @@ -561,14 +642,11 @@ 需要重新启动 - - 某些设置需要重启后生效! - 保存设置到应用文件夹 - 辅助DNS服务器 + 辅助 DNS 服务器 显示 @@ -577,7 +655,7 @@ 在启动后显示以下应用: - 一个强大的网络运维管理工具! + A powerful open-source tool for managing networks and troubleshooting network problems! 速度 @@ -589,17 +667,14 @@ 开始菜单(当前用户) - 静态IPv4地址 + 静态 IPv4 地址 - 静态IPv4 DNS服务器 + 静态 IPv4 DNS 服务器 - + 子网掩码 - - 子网掩码或CIDR - 线程 @@ -621,11 +696,11 @@ 超时(毫秒) - - 每次 Ping 之间等待的时间 + + 每次 Ping 之间的等待时间(毫秒) - 生存周期 + TTL 类型 @@ -646,16 +721,16 @@ 添加 - 添加一个DNS查找页... + 添加一个 DNS 查询页... 添加一个网络扫描页... - 添加一个SNMP动作页... + 添加一个 SNMP 动作页... - 添加一个Ping操作页... + 添加一个 Ping 操作页... 添加一个端口扫描页... @@ -663,11 +738,8 @@ 添加一个路由追踪页... - - 添加一个HTTP头查询页... - - 主机名后添加DNS后缀(主) + 主机名后添加 DNS 后缀(主) 附加到命令行 @@ -691,7 +763,7 @@ 应用 - 应用Windows键组合(例如ALT + TAB): + Apply Windows key combinations (e.g., ALT+TAB): 验证 @@ -712,7 +784,7 @@ 备份 - 波特 + 波特率 该操作已被用户取消! @@ -720,6 +792,9 @@ 大写锁定已启用! + + Chart time (seconds) + 启动后检查更新 @@ -736,7 +811,7 @@ 社区 - 配置PuTTY程序路径 + 配置 PuTTY 程序路径 确认关闭... @@ -748,10 +823,10 @@ 连接方式... - 使用Windows连接 + 连接外部 - 请配置网卡的网络连接! + 请将网卡连接到网络进行配置! 复制 @@ -769,9 +844,9 @@ 凭据 - Profile files are encrypted on disk using AES with a key size of 256 bits and a block size of 128 bits in CBC mode. The encryption key is derived from a master password using Rfc2898DeriveBytes (PBKDF2) with 1,000,000 iterations. At runtime, passwords are stored as SecureString once the profile file is loaded. For some functions, the password must be converted to a normal string and remains unencrypted in memory until the garbage collector cleans them up. + 配置文件在磁盘上使用 AES 加密,密钥大小为 256 位,块大小为 128 位,采用 CBC 模式。加密密钥使用 Rfc2898DeriveBytes (PBKDF2) 从主密码中提取,迭代次数为 1,000,000 次。运行时,一旦加载配置文件,密码就会以 SecureString 的形式存储。对于某些函数,密码必须转换为普通字符串,并在内存中保持未加密状态,直到垃圾回收器将其清理干净。 -First make a backup copy of your profile files before enabling encryption! +启用加密前,请先备份一份配置文件! 自定义 @@ -783,7 +858,7 @@ First make a backup copy of your profile files before enabling encryption!数据已更新! - 必须解密并加载凭据才能进行管理. + 必须解密并加载凭据才能进行管理。 默认 @@ -795,34 +870,31 @@ First make a backup copy of your profile files before enabling encryption!默认端口: - Rlogin端口 + Rlogin 端口 - SSH端口 + SSH 端口 - Telnet端口 + Telnet 端口 - 被选择的凭据将被永久删除. + 选定的凭据将被永久删除。 删除条目 - Selected profile will be deleted permanently. + 所选配置文件将被永久删除。 - DNS配置 + DNS 配置 - DNS查询 + DNS 查询 - DNS服务器 - - - 打开文档 + DNS 服务器 域名 @@ -842,14 +914,14 @@ First make a backup copy of your profile files before enabling encryption! 结束时间 - - 输入一个子网进行计算 + + 输入子网进行计算… 输入子网和子网掩码以创建子网 - 不能连接到'api.github.com',请检查网络状态 + 无法连接到“api.github.com”,请检查网络连接! 响应出错! @@ -866,9 +938,6 @@ First make a backup copy of your profile files before enabling encryption! 固定屏幕大小: - - 在Github上对项目关注或创建分支 - 查找 @@ -882,7 +951,7 @@ First make a backup copy of your profile files before enabling encryption!主机 - 主机名或IP地址 + 主机名或 IP 地址 主机 @@ -891,7 +960,7 @@ First make a backup copy of your profile files before enabling encryption!ID - Inherit host from general + 从常规继承主机 IP范围 @@ -912,7 +981,7 @@ First make a backup copy of your profile files before enabling encryption!唤醒数据包发送成功! - 达到最大跳数/路由器限制({0})! + 达到最大跃点数/路由器限制({0})! 消息大小 @@ -927,7 +996,7 @@ First make a backup copy of your profile files before enabling encryption!多实例 - 无法访问此地址,请确认你的计算机已连接到此网络。有关网络故障排除的信息,请参阅Windows帮助。 + 无法访问此地址,请确认你的计算机已连接到此网络。有关网络故障排除的信息,请参阅 Windows 帮助。 创建新连接 @@ -969,6 +1038,9 @@ First make a backup copy of your profile files before enabling encryption! OID + + Only CSV files are allowed! + 仅在全屏模式可用 @@ -993,13 +1065,6 @@ First make a backup copy of your profile files before enabling encryption! 覆盖 - - 是否覆盖目标文件夹中的设置? - -“覆盖”将覆盖目标文件夹中的文件。 - -“使用其他”将使用目标中的现有设置文件并重新启动应用程序。 - 密码 @@ -1016,7 +1081,7 @@ First make a backup copy of your profile files before enabling encryption!端口 - Priv + 私有 配置文件 @@ -1030,9 +1095,6 @@ First make a backup copy of your profile files before enabling encryption! PuTTY 进程已终止! - - PuTTY 配置 - 问题 @@ -1073,7 +1135,7 @@ First make a backup copy of your profile files before enabling encryption!重复 - 解析所有请求的CNAME + 解析所有请求的 CNAME 响应 @@ -1099,18 +1161,6 @@ First make a backup copy of your profile files before enabling encryption! 选择一个分辨率 - - 所选设置被覆盖! - - - 选中的设置将被重置。 - - - 选择你想导出的设置: - - - 选择你想导入的设置: - 这将重置所有设置! @@ -1118,24 +1168,17 @@ First make a backup copy of your profile files before enabling encryption!串口 - 串行 + 串行线 服务 - 发现的设置文件已损坏或与此版本不兼容。所有设置已重置! -  -(配置文件不受影响!) - - - 设置已成功导出! - - - 设置已成功导入! - - - 设置已成功重置! + 找到的设置文件已损坏或与此版本不兼容!您可以在GitHub上报告此问题。 + +在设置文件夹中创建了设置文件的备份,并重置了设置。 + +配置文件不受影响! 显示已关闭端口 @@ -1146,8 +1189,8 @@ First make a backup copy of your profile files before enabling encryption! 仅显示最常见的查询类型 - - 显示所有IP地址的扫描结果 + + 显示不可达的 IP 地址和端口 显示统计 @@ -1189,10 +1232,10 @@ First make a backup copy of your profile files before enabling encryption!此进程将耗费一些时间和资源(CPU/RAM)。 - 此设置位置无效 + 此设置位置无效! - SNMP查询超时。 + SNMP 查询超时。可能是主机无法访问或社区字符串/密码错误。 从DNS服务器查询IP地址“{0}”超时! @@ -1206,8 +1249,8 @@ First make a backup copy of your profile files before enabling encryption! 未知错误! - - 托盘/窗口移到前面 + + 打开托盘/将窗口放到前台 URL @@ -1243,13 +1286,13 @@ First make a backup copy of your profile files before enabling encryption!新版本可用:{0}! - Walk模式 + Walk 模式 宽度 - Profile file could not be decrypted with the given password. + 无法用给定的密码解密配置文件。 输入密码有误。 @@ -1291,7 +1334,7 @@ First make a backup copy of your profile files before enabling encryption!剪切 - 解密并加载 + 解密并加载... 删除 @@ -1300,7 +1343,7 @@ First make a backup copy of your profile files before enabling encryption!删除表单 - 输入位置 + 输入位置... 所有 @@ -1309,7 +1352,10 @@ First make a backup copy of your profile files before enabling encryption!过滤器... - 清理DNS缓存 + 清理 DNS 缓存 + + + DNS cache flushed 解密并载入你选择的的凭据。 @@ -1324,14 +1370,10 @@ First make a backup copy of your profile files before enabling encryption!编辑时将不会显示密码明文,但你可以重置它。 - [0]如果服务器身份验证失败,连接到计算机,没有警告。 -  -[1]如果服务器认证失败,不建立连接。 -  -[2]如果服务器身份验证失败,显示一个警告并允许我连接或拒绝连接。 -  - -[3] 不指定认证要求。。 + [0]如果服务器身份验证失败,请在没有警告的情况下连接到计算机。 +[1] 如果服务器身份验证失败,请不要建立连接。 +[2] 如果服务器身份验证失败,则显示警告并允许我连接或拒绝连接。 +[3] 未指定身份验证要求。 标签帮助您按照主题/项目组织概要文件/概要文件。多个标签可以用";"隔开。通过标签“tag=xxx”进行搜索。 @@ -1358,7 +1400,7 @@ First make a backup copy of your profile files before enabling encryption!关 - 确认 + 确定 @@ -1372,12 +1414,12 @@ First make a backup copy of your profile files before enabling encryption! 覆盖 + + Parse + 粘贴 - - C:\Program Files\PuTTY\putty.exe - 重连 @@ -1391,7 +1433,7 @@ First make a backup copy of your profile files before enabling encryption!保存 - 搜索 + 搜索... 秒(s) @@ -1415,22 +1457,22 @@ First make a backup copy of your profile files before enabling encryption!连接 - 输入有效的IP范围! + 输入有效的 IP 范围! - 输入有效的IPv4地址! + 輸入有效的 IPv4 地址! - 输入有效的MAC地址(如 00:F1:23:AB:F2:35)! + Enter a valid MAC address (e.g., 00:F1:23:AB:F2:35)! 输入有效端口(1-65535)! - 输入有效子网掩码(如 255.255.255.0)! + Enter a valid subnetmask (e.g., 255.255.255.0)! - 输入有效子网掩码或CIDR(如 255.255.255.0 或 /24)! + Enter a valid subnetmask or CIDR (e.g., 255.255.255.0 or /24)! 字段不能为空! @@ -1445,7 +1487,7 @@ First make a backup copy of your profile files before enabling encryption!监听器 - Amber + 琥珀色 外观 @@ -1454,34 +1496,34 @@ First make a backup copy of your profile files before enabling encryption!应用 - Dark + 深色 - Light + 浅色 - + 黑色 - + 蓝色 - + 棕色 - Cobalt + 深蓝色 - Crimson + 深红色 - Cyan + 青色 - Emerald + 深绿色 - 输入一个或多个有效的IP地址! + 输入一个或多个有效的 IP 地址! 输入有效的波特率! @@ -1496,28 +1538,28 @@ First make a backup copy of your profile files before enabling encryption!输入有效数字! - 输入有效的OID! + 输入有效的 OID! 输入有效的端口或端口范围(1 - 65535)! - 输入有效的子网(如192.168.178.133/26)! + Enter a valid subnet (e.g., 192.168.178.133/26)! - 输入有效的网址(例如 https://example.com/index.html) + Enter a valid website (e.g., https://example.com/index.html) - 绿 + 绿色 导入/导出 - Indigo + 靛蓝色 - 目标主机不可达。 + 目标主机无法访问。 目标网络无法访问。 @@ -1532,37 +1574,40 @@ First make a backup copy of your profile files before enabling encryption!请求超时。 - TTL在传输途中过期。 + TTL 在传输过程中过期。 - 密钥必须有8个字符或更多! + 密钥必须有 8 个字符或更多! - Lime + 亮绿色 + + + Live - Magenta + 洋红色 - Mauve + 紫红色 - Olive + 橄榄色 只能输入数字! - Orange + 橙色 - + 粉红色 - Purple + 紫色 - Red + 红色 套接字已关闭。 @@ -1580,10 +1625,10 @@ First make a backup copy of your profile files before enabling encryption!解密出错。 - DNS名称查找失败。 + DNS 名称查询失败。 - DNS查找失败。 + DNS 查询失败。 加密出错。 @@ -1592,7 +1637,7 @@ First make a backup copy of your profile files before enabling encryption!Windows 套接字 gethostbyname 调用失败。 - 主机未找到。 + 找不到主机。 内部错误。 @@ -1646,10 +1691,10 @@ First make a backup copy of your profile files before enabling encryption!无法识别服务器证书。 - Windows套接字连接失败。 + Windows 套接字连接失败。 - Windows套接字接收失败。 + Windows 套接字接收失败。 此账户已禁用。 @@ -1695,7 +1740,7 @@ First make a backup copy of your profile files before enabling encryption!智能卡已禁用。 - 向智能卡提供了错误的PIN。 + 向智能卡提供了错误的 PIN。 发生超时。 @@ -1704,34 +1749,34 @@ First make a backup copy of your profile files before enabling encryption!内部定时器错误。 - Windows套接字 send 调用失败。 + Windows 套接字 send 调用失败。 - Sienna + 赭色 不允许有空格! - Steel + 铁灰色 - Taupe + 褐灰色 - Closed + 已关闭 CloseWait - Closing + 正在关闭 DeleteTcb - Established + 已建立 FinWait1 @@ -1758,19 +1803,16 @@ First make a backup copy of your profile files before enabling encryption!未知 - Teal + 蓝绿色 - Violet + 紫罗兰色 - White + 白色 - Yellow - - - 输入25到100之间的有效值! + 黄色 已存在具有此名称的配置! @@ -1800,10 +1842,13 @@ First make a backup copy of your profile files before enabling encryption!添加 whois 查询页... - 输入有效的域名(例如“example.com”)! + Enter a valid domain (e.g., "example.com")! + + + Enter a valid Windows username (e.g., "user", "DOMAIN\user" or "user@domain.com")! - 没有找到该域名的Whois服务器: "{0}" + 未找到该域名的 Whois 服务器:“{0}” 路由 @@ -1821,19 +1866,19 @@ First make a backup copy of your profile files before enabling encryption!Windows DNS 设置 - 删除DNS服务器 + 删除 DNS 服务器 - 选定的DNS服务器将永久删除。 + 选定的 DNS 服务器将永久删除。 - 添加DNS服务器 + 添加 DNS 服务器 - 编辑DNS服务器 + 编辑 DNS 服务器 - 已存在具有此名称的DNS服务器! + 已存在具有此名称的 DNS 服务器! 重启会话 @@ -1842,10 +1887,7 @@ First make a backup copy of your profile files before enabling encryption!TigerVNC - 配置TigerVNC程序路径 - - - TigerVNC 位置 + 配置 TigerVNC 程序路径 TigerVNC 进程已终止! @@ -1854,16 +1896,16 @@ First make a backup copy of your profile files before enabling encryption!正在连接... - 解析MAC地址和供应商 + 解析 MAC 地址和供应商 - Note + 注意事项 导出全部 - 导出 + 导出... 导出所选 @@ -1906,22 +1948,22 @@ First make a backup copy of your profile files before enabling encryption!添加标签... - 添加IPv4地址 + 添加 IPv4 地址 - 添加IPv4地址 + 添加 IPv4 地址 - - 主机线程 + + 最大并发主机线程 - - 端口线程 + + 最大并发端口线程 PowerShell - 在设置中配置PowerShell的路径… + 在设置中配置 PowerShell 的路径… PowerShell 进程已终止! @@ -1932,9 +1974,6 @@ First make a backup copy of your profile files before enabling encryption! 远程控制台 - - PowerShell 位置 - 文件路径 @@ -1942,7 +1981,7 @@ First make a backup copy of your profile files before enabling encryption!覆盖默认设置 - 解析此主机的IPv4地址 + 解析此主机的 IPv4 地址 隐藏 @@ -1963,7 +2002,7 @@ First make a backup copy of your profile files before enabling encryption!上行 - 应用Windows组合键 + 应用 Windows 组合键 凭据安全支持提供程序 @@ -1972,14 +2011,14 @@ First make a backup copy of your profile files before enabling encryption!后台任务 - 后台作业将每隔x分钟保存设置、配置文件和凭据。 -  -值为0时将禁用此特性。 -  -更改这个值需要重新启动应用程序才能生效。 + 后台作业将每隔 x 分钟保存一次设置和配置文件。 + +值为 0 将禁用此特性。 + +对该值的修改将在重新启动应用程序后生效。 - 每隔x分钟运行后台任务 + 每隔 x 分钟运行后台任务 您的操作系统与最新版本不兼容! @@ -1991,12 +2030,12 @@ First make a backup copy of your profile files before enabling encryption!以后可以在程序设置中更改所有设置值 - 检查公网IP地址 + 检查公网 IP 地址 - - 感谢您使用NETworkManager! + + Thank you for using NETworkManager! -此程序使用网络上一些公开的服务以提供众多附加功能,我不会收集您的任何数据。 +If you enjoy it, please consider supporting its development — whether by leaving a star on GitHub, making a donation, or simply sharing it with others. Your support helps keep the project going and growing. 启动程序时,它会在后台检查GitHub上是否有新的程序版本。 @@ -2017,20 +2056,20 @@ URL: https://api.github.com/ 第三方服务 - - 在Github上对项目关注或创建分支 + + Star/Fork the Project on GitHub. - - 帮助翻译Transifex上的项目。 + + Help translate the project on Transifex. - - 通过Twitter联系。 + + Follow or contact me via X. 连接 - Computer + 计算机 网关/路由 @@ -2042,46 +2081,37 @@ URL: https://api.github.com/ 检查网络适配器配置(dns)以及是否正确配置了dns服务器。 - 检查网络适配器配置(dhcp,静态IP)以及是否已连接到网络。 - - - 错误 - - - 确定 - - - 警告 + 检查网络适配器配置(dhcp,静态 IP)以及是否已连接到网络。 - 无法检测网关IP地址! + 无法检测网关 IP 地址! - 无法检测本地IP地址! + 无法检测本地 IP 地址! - 无法通过WebRequest(http/https)从"{0}"获得公共ip地址! 检查你的网络连接(防火墙、代理等)。 + 无法通过 WebRequest(http/https)从"{0}"获得公网 IP 地址! 检查你的网络连接(防火墙、代理等)。 - 无法解析“{0}”的A记录! + 无法解析“{0}”的 A 记录! - 无法解析“{0}”的PTR记录! + 无法解析“{0}”的 PTR 记录! - "{0}" 解析的dns记录 "{1}"! + "{0}" 解析的 dns 记录 "{1}"! - 解析的PTR dns记录"{0}"! + 解析的 PTR dns 记录"{0}"! - 获得“{0}”作为公共ip地址"{1}"! + 获得“{0}”作为公网 IP 地址"{1}"! 解析“{0}”为ip地址主机名"{1}"! - 已禁用公网IP地址检测! + 已禁用公网 IP 地址检测! TCP/IP 堆栈可用。"{0}" 可通过 ICMP 访问! @@ -2104,20 +2134,20 @@ URL: https://api.github.com/ 使用自定义 IPv4 地址 API - - 可以通过http或https到达的网络服务的URL,并返回一个IP地址作为响应。 + + URL to a web service that can be reached via http or https and returns an IPv4 address e.g., "xx.xx.xx.xx" as response. - 无法解析公共ip地址"{0}"! 尝试其他服务或使用默认的... + 无法解析公网 IP 地址"{0}"! 尝试其他服务或使用默认的... 不能连接到“{0}”! - IPv4协议可用 + IPv4 协议可用 - IPv6协议可用 + IPv6 协议可用 复制 @@ -2179,6 +2209,12 @@ URL: https://api.github.com/ 视觉样式 + + View only + + + Block keyboard and mouse input to the remote session + 远程音频 @@ -2224,24 +2260,39 @@ URL: https://api.github.com/ 程序 + + Private + + + Public + 所选自定义命令将被永久删除。 - - 有以下变量可供选择: - -$$ipaddress$$ --> IP 地址 -$$hostname$$ --> 主机名 - 重启 - - 无法解析主机名的ip地址! + + 无法解析主机名的 ip 地址! Ctrl+Alt+Del + + Task Manager (Ctrl+Shift+Esc) + + + Lock (Win+L) + + + Show Desktop (Win+D) + + + Explorer (Win+E) + + + Run dialog (Win+R) + 键盘快捷键 @@ -2270,7 +2321,7 @@ $$hostname$$ --> 主机名 将在 “{0}” 秒后关闭 - 网络不可用 + 网络不可用! 基于路由检测本地IP地址 @@ -2278,8 +2329,8 @@ $$hostname$$ --> 主机名 网络变化时显示状态窗口 - - 窗口应显示多少秒 + + 状态窗口显示的时间(以秒为单位) WiFi @@ -2305,12 +2356,18 @@ $$hostname$$ --> 主机名 信道 + + Channel width + 2.4 GHz 5 GHz + + 2.4 & 5 GHz + 信号强度 @@ -2350,11 +2407,8 @@ $$hostname$$ --> 主机名 超时 - - 报告一个问题或创建一个功能请求 - - - 报告一个问题或创建一个功能请求. + + Report an issue or create a feature request. 信标间隔 @@ -2395,12 +2449,39 @@ $$hostname$$ --> 主机名 无法解析主机名ip地址:"{0}" + + Notification + + + Show notification popup on status change + + + Play sound on status change + + + Success threshold + + + Number of consecutive successful pings required before a "Host is up" notification is shown. Higher values reduce noise from flapping hosts. + + + Failure threshold + + + Number of consecutive failed pings (timeouts) required before a "Host is down" notification is shown. Higher values reduce noise from flapping hosts. + + + Display duration (seconds) + + + Host is up + + + Host is down + 应用程序将重新启动... - - 使用其他文件夹 - 无法导出文件! 查看错误信息: "{0}" @@ -2416,11 +2497,11 @@ $$hostname$$ --> 主机名 已加密 - - 在GitHub上打开文档。 + + Open the documentation. - 客户1 + 客户 1 添加配置文件 @@ -2446,9 +2527,6 @@ $$hostname$$ --> 主机名 删除配置文件 - - 所选配置文件将永久删除。 - 此配置文件中的所有配置文件将被永久删除! @@ -2471,7 +2549,7 @@ $$hostname$$ --> 主机名 以管理员身份启动 - 要分析网络数据包,必须以高权限启动该应用程序! + Analysing network packets requires elevated rights! 捕获 @@ -2483,7 +2561,7 @@ $$hostname$$ --> 主机名 持续时间(s) - Model + 型号 VLAN @@ -2500,13 +2578,13 @@ $$hostname$$ --> 主机名 发现协议 - + CDP - + LLDP - + LLDP / CDP @@ -2539,8 +2617,8 @@ $$hostname$$ --> 主机名 Microsoft.Windows.SDK.Contracts是该功能的必要条件,但在该系统上不可用(例如在Windows Server上)。 - - ARP 列表 + + Neighbor Table 连接 @@ -2552,10 +2630,10 @@ $$hostname$$ --> 主机名 发现协议 - DNS 查找 + DNS 查询 - HTTP 信息 + HTTP 头 IP 扫描器 @@ -2567,7 +2645,7 @@ $$hostname$$ --> 主机名 查找 - 网络界面 + 网络接口 Ping @@ -2606,205 +2684,118 @@ $$hostname$$ --> 主机名 Web 控制台 - 域名查询 + Whois WiFi - Amber + 琥珀色 - Black + 黑色 - Blue + 蓝色 - Brown + 棕色 - Cobalt + 深蓝色 - Crimson + 深红色 - Cyan + 青色 - Emerald + 深绿色 - Green + 绿色 - Indigo + 靛蓝色 - Lime + 亮绿色 - Magenta + 洋红色 - Mauve + 紫红色 - Olive + 橄榄色 - Orange + 橙色 - Purple + 紫色 - Red + 红色 - Sienna + 赭色 - Taupe + 褐灰色 - Teal + 蓝绿色 - Pink + 粉红色 - Yellow + 黄色 - - Steel + + 铁灰色 - + 常规 - - DNS 查找 - - - HTTP 头 - - - IP 扫描器 - - - 网络界面 - - - Ping - - - Ping 监视器 - - - 端口扫描器 - - - 命令行 - - - PuTTY - - - 远程桌面 - - - TigerVNC - - - 路由跟踪 - - - 局域网唤醒 - - - Web 控制台 - - - 域名查询 - - + 应用 - + 常规 - + 外观 - + 自动启动 - - 仪表盘 - - - DNS 查找 - - + 常规 - - 快捷键 - - - HTTP 信息 - - - IP 扫描器 + + 热键 - + 语言 - - Ping 监控 - - - 端口扫描器 - - - 命令行 - - - 简介 - - - PuTTY - - - 远程桌面 + + 配置文件 - + 设置 - - SNMP - - + 状态 - - TigerVNC - - - 路由跟踪 - - + 更新 - - 局域网唤醒 - - - 域名查询 - - - Window + + 窗口 启用日志 @@ -2825,7 +2816,7 @@ $$hostname$$ --> 主机名 SSH 日志 - SSH原始日志 + SSH 原始日志 会话日志 @@ -2834,7 +2825,7 @@ $$hostname$$ --> 主机名 SSH 日志 - SSH和原始日志 + SSH 和原始日志 输入一个有效的文件名! @@ -2849,7 +2840,7 @@ $$hostname$$ --> 主机名 状态更改 - 更新可用! + 有可用的更新! 私钥文件 @@ -2885,36 +2876,40 @@ $$hostname$$ --> 主机名 启动画面 - 下载微软Edge WebView2 Runtime + 下载 Microsoft Edge WebView2 Runtime - Microsoft Edge WebView2 Runtime不可用! + Microsoft Edge WebView2 Runtime 不可用! - 頻率 + 频率 SSID - + 配置文件无法加载! - - If this happened after an update, you may need to migrate the profiles to a newer version. When you click "Migrate", a PowerShell window opens with the migration script. Check the path and press Enter. + + 配置文件无法加载,可能已损坏。您可以尝试从备份中还原该文件,也可以将其删除。 + +如果这种情况意外发生或在更新后发生,请在GitHub上报告错误。 -Otherwise, the profile may be corrupted and you want to report the issue on GitHub. + +错误消息: +"{0}" - 编辑组 + 编辑组... - 解密出错。 + 解密出错 无法解密文件。您可以在GitHub上报告此问题。 - 解密出错。 + 加密出错 无法加密文件。您可以在GitHub上报告此问题。 @@ -2932,7 +2927,7 @@ Otherwise, the profile may be corrupted and you want to report the issue on GitH 打开配置文件 - Unlock the profile file to use the profiles! + 解锁配置文件以使用配置文件! 免责声明 @@ -2940,25 +2935,12 @@ Otherwise, the profile may be corrupted and you want to report the issue on GitH 合并 - - 目标文件夹已经包含文件。如果单击“合并”,当前配置文件将复制到文件夹中。 - - - Overwrite profiles in destination folder? - -"Overwrite" will copy the profile files to the destination folder and overwrite existing profile files. -"Merge" will copy the profile files to the destination folder, but won't overwrite exitsting profile files. -"Use other folder" will use the existing profile files in the destination folder. - 使用其他 移动 - - 配置文件将被移动到选定的目标文件夹。 - 最后一次扫描在{0} @@ -2966,28 +2948,28 @@ Otherwise, the profile may be corrupted and you want to report the issue on GitH 隐藏网络 - Developed and maintained by {0} with the help of the + 由 {0}在以下机构的帮助下开发和维护 - 一个简单的公共IP地址 API + 一个简单的公网 IP 地址 API - AirspacePanel修复了所有Airspace与WPF-hosted Winforms的问题。 + AirspacePanel 修复了所有 Airspace 与 WPF-hosted Winforms 的问题。 - 共享控件的WPF和…更多的 + 强大的 WPF 共享控件库 - DnsClient。NET是一个简单但非常强大和高性能的开放源码库,用于。NET框架进行DNS查找 + DnsClient.NET 是一个简单但功能强大且高性能的开源库,用于在 .NET Framework 中执行 DNS 查询 - 适用于WPF的可拖动和可撕裂的标签控件 + 适用于 WPF 的可拖拽标签控件 - C#库为.NET开发人员的复杂网络,IP, IPv4, IPv6, netmask, CIDR,子网,子网,超网和超网计算。 + C# 库为 .NET 开发人员处理复杂的网络、IP、IPv4、IPv6、子网掩码、CIDR、子网、子网划分、超网和超网划分计算。 - 适用于.Net的简单、灵活、互动和强大的图表、地图和仪表 + Beautiful, interactive charts, maps, and gauges. WPF的加载指示器集合 @@ -2999,28 +2981,31 @@ Otherwise, the profile may be corrupted and you want to report the issue on GitH 一个用于创建Metro / Modern UI风格的WPF应用程序的工具包。 - Json。NET是。NET的一个流行的高性能JSON框架 + Json.NET 是一款适用于 .NET 的流行的高性能 JSON 框架 - 用于.NET的GitHub API客户端库 + 适用于 .NET 的 GitHub API 客户端库 在本地或远端计算机上抓取CDP、LLDP报文并解析 - 夏普SNMP库 - 适用于.NET和Mono的开源SNMP + Sharp SNMP 库 - 适用于 .NET 和 Mono 的开源 SNMP - SVG中所有国家标志的集合 + 所有 SVG 国旗的集合 - 来自iana.org的顶级域名列表,用于从whois.iana.org通过43端口查询顶级域名的whois服务器。 + 来自 iana.org 的顶级域名列表,用于从 whois.iana.org 通过 43 端口查询顶级域名的 whois 服务器 + + + GeoJSON conversion of Natural Earth vector map data (CC0-1.0). - 来自linuxnet.ca的经过净化的IEEE OUI数据。 + OUI 数据来自 ieee.org。 - 服务名称和传输协议端口号注册从iana.org。 + 来自 iana.org 的服务名称和传输协议端口号注册表 Apache 2.0许可 @@ -3035,19 +3020,19 @@ Otherwise, the profile may be corrupted and you want to report the issue on GitH 未授权 - c# /WinRT为c#语言提供了打包的WinRT投影支持。 + C#/WinRT 为 C# 语言提供了封装的 WinRT 投射支持。 - 运行时托管PowerShell + 用于承载PowerShell的运行时环境 - WebView2控件允许你在由Microsoft Edge (Chromium)支持的原生应用程序中嵌入web技术(HTML、CSS和JavaScript)。 + WebView2 控件使您能够在由 Microsoft Edge (Chromium) 驱动的原生应用中嵌入网页技术 (HTML、CSS 和 JavaScript)。 - 使用XAML behavior for WPF可以轻松地为您的应用程序添加交互性。 + 使用 XAML Behaviors for WPF 为您的应用程序轻松添加交互性 - 微软WebView2许可 + Microsoft WebView2 许可 当前配置文件未加密,密码将不加密存储在磁盘上! @@ -3064,22 +3049,22 @@ Otherwise, the profile may be corrupted and you want to report the issue on GitH 检查被禁用! - 请输入合法的IPv6地址! + 请输入有效的 IPv6 地址! - 公网可访问的IPv4地址 + 可通过 ICMP 到达的公网 IPv4 地址。 - 公网可访问IPv6地址。 + 可通过 ICMP 到达的公网 IPv6 地址。 - 公共 IPv4 地址 + 公网 IPv4 地址 - 公共 IPv6 地址 + 公网 IPv6 地址 - 使用自定义IPv6地址API + 使用自定义 IPv6 地址 API 存活时间 @@ -3097,13 +3082,13 @@ Otherwise, the profile may be corrupted and you want to report the issue on GitH 端口描述 - 删除IPv4地址 + 删除 IPv4 地址 - 额外的配置 + 额外的配置... - 删除IPv4地址 + 删除 IPv4 地址... 远程会话已结束,因为已达到总登录时间限制。此限制由服务器管理员或网络策略设置。 @@ -3118,36 +3103,1395 @@ Otherwise, the profile may be corrupted and you want to report the issue on GitH 无法重新连接远程会话。 - Migrate + 迁移 - Report on GitHub + 在 GitHub 上提交报告 - Groups + - Add group + 添加组 - Delete group + 删除组 - Selected group and all profiles inside this group will be deleted permanently. + 所选组和组内所有配置文件将被永久删除。 - The name is already used! + 该名称已被使用! - Resize + 缩放 - Delete profiles + 删除配置文件 - Selected profiles will be deleted permanently. + 所选配置文件将永久删除。 + + + 使用自定义主题 + + + 自定义主题 + + + 重置设置? + + + 设置已重置! + + + 实例 ID + + + 本地连接 + + + 本地接口 + + + log4net 是一款帮助程序员向各种输出目标输出日志语句的工具。 + + + 启用 + + + 区域 + + + 要同步的配置文件和区域 + + + 默认配置文件 + + + 默认区域 + + + 组名不能以“{0}”开头! + + + 检查预发布版本 + + + 同步已禁用! + + + 命令 + + + 将主题应用到 PowerShell 控制台 + + + PowerShell控制台的颜色可以更改为“设置”>“常规”>“外观”下的应用程序主题 + + + If you enable this option, the default PowerShell console settings in the registry under HKCU:\Console are overridden so that the PowerShell console window matches the application theme. This is a global system setting that may affect the appearance of the normal PowerShell window. + +Only the PowerShell consoles configured in the PowerShell settings are modified. Both Windows PowerShell and PWSH (PowerShell 7 and higher) are supported. + +Click in the upper right corner on the help / documentation button (left of the minimize button) or navigate to https://borntoberoot.net/NETworkManager/Documentation/Settings/Appearance for more details. Here are the values documented which will be adjusted. + +If the option is disabled again, the values are no longer modified. However, the original values are NOT restored. + + + 输入不能以"; "结束! + + + 输入不包含任何文本! + + + 位计算器 + + + 位计算器 + + + 符号 + + + 输入 + + + 单位 + + + 比特 + + + 吉比特 + + + 吉字节 + + + 千比特 + + + 千字节 + + + 兆比特 + + + 兆字节 + + + 拍比特 + + + 拍字节 + + + 太比特 + + + 太字节 + + + 输入数字并选择单位以计算单位... + + + 网络 + + + 代理 + + + 解析该主机的 IP 地址(首选 IPv4) + + + PowerShell 的有效路径应以“pwsh.exe”或“powershell.exe”结尾! + + + PuTTY 的有效路径应以“PuTTY.exe”结尾! + + + TigerVNC 的有效路径应以“vncviewer-*.exe”或“vncviewer64-*.exe”结尾! + + + SNTP 查询 + + + 将 .NET Framework/.NET Core 应用程序运行时组件和依赖项移至子目录,并使其美观。 + + + 添加执行 SNTP 查询的选项卡... + + + SNTP 服务器 + + + URL to a web service that can be reached via http or https and returns an IPv6 address e.g., "xxxx:xx:xxx::xx" as response. + + + IP 端点 + + + 本地结束时间 + + + 本地开始时间 + + + 网络时间 + + + 偏移 + + + 往返延迟 + + + 服务器 + + + SNTP 查询 + + + 添加 SNTP 服务器 + + + 删除 SNTP 服务器 + + + 选中的 SNTP 服务器将被永久删除。 + + + 编辑 SNTP 服务器 + + + 已经存在此名称的 SNTP 服务器! + + + Enter a valid hostname (e.g., "server-01" or "example.com") or a valid IP address (e.g., 192.168.178.1)! + + + 服务器 + + + 输入主密码解锁配置文件: + + + 解锁配置文件 + + + 超时 + + + 主机密钥 + + + 设置将被重置,然后应用程序将重新启动! + + + 设置将被重置! + + + Ping 状态 + + + 线程池额外的最小线程数 + + + 该设置指定了根据需要从应用程序的线程池中创建的线程的最小数量。例如,这可以提高 IP 扫描仪或端口扫描程序的性能。 + +该值与默认的最小线程数(CPU 线程数)相加。值 0 则保留默认设置。如果该值高于 ThreadPool 的默认最大线程数,则使用该值。 + +如果该值过高,可能会出现性能问题。 + +对该值的更改将在重启应用程序后生效。该值是否设置成功,可在 %LocalAppData%\NETworkManager\NETworkManager.log 下的日志文件中查看。 + + + 这些设置只更改每个主机/端口扫描并发执行线程的最大数量。转到设置 > 常规 > 常规调整应用程序的(最小)线程数。 + + + 端口状态 + + + Ping 详细信息 + + + 找不到打开的端口! + + + 端口扫描被禁用! + + + 扫描端口 + + + 找不到应用程序"{0}"。也许应用程序在设置中被隐藏了? + + + 状态窗口 + + + 显示地址栏 + + + 不建议启用此设置。应用程序的多个实例共享相同的设置和配置文件。最后关闭的实例可能会覆盖其他实例所做的更改。 + + + 绕过本地地址 + + + 启用网关服务器 + + + 登录方法 + + + 网关服务器 + + + 服务器名称 + + + 与远程计算机共享网关凭据 + + + 请允许我稍后选择 + + + 智能卡或 Windows Hello 商业版 + + + 询问密码(NTLM) + + + 使用网关凭据 + + + 由于 Remote Desktop Gateway 服务器暂时不可用,您的计算机无法连接到远程计算机。请稍后再尝试重新连接,或联系网络管理员寻求帮助。 + + + 由于以下原因之一,您的计算机无法连接到远程计算机: 1) 请求的 Remote Desktop Gateway 服务器地址和服务器 SSL 证书主题名不匹配。2) 证书已过期或被撤销。3) 证书根授权机构不信任该证书。 请联系网络管理员寻求帮助。 + + + 此计算机无法验证 RD Gateway "" 的身份。连接到无法识别的服务器是不安全的。请联系网络管理员寻求帮助。 + + + 由于请求的 Remote Desktop Gateway 服务器地址和证书主题名不匹配,您的计算机无法连接到远程计算机。请联系网络管理员寻求帮助。 + + + 由于 Remote Desktop Gateway 服务器的证书已过期或被撤销,您的计算机无法连接到远程计算机。请联系网络管理员寻求帮助。 + + + 向 Remote Desktop Gateway 服务器发送数据时发生错误。服务器暂时不可用或网络连接中断。请稍后再试,或联系网络管理员寻求帮助。 + + + 从 Remote Desktop Gateway 服务器接收数据时发生错误。要么是服务器暂时不可用,要么是网络连接出现故障。请稍后再试,或联系网络管理员寻求帮助。 + + + 由于 Remote Desktop Gateway 服务器地址不可达或不正确,您的计算机无法连接到远程计算机。输入有效的 Remote Desktop Gateway 服务器地址。 + + + 您的计算机无法连接到远程计算机,因为 Remote Desktop Gateway 服务器资源不足,暂时无法使用。请稍后再尝试重新连接,或联系网络管理员寻求帮助。 + + + Remote Desktop Gateway 服务器已结束连接。请稍后再尝试重新连接,或联系网络管理员寻求帮助。 + + + Remote Desktop Gateway 服务器管理员已结束连接。请稍后再尝试重新连接,或联系网络管理员寻求帮助。 + + + 远程桌面无法连接到远程计算机“”,原因如下:1) 您的用户帐户未在 RD 网关的权限列表中列出 2) 您可能已经以 NetBIOS 格式(例如:computer1)指定了远程计算机,但 RD 网关需要 FQDN 或 IP 地址格式(例如:computer1.fabrikam.com 或 157.60.0.1)。 请联系您的网络管理员以获取帮助。 + + + 远程桌面无法连接到远程计算机“”,原因如下:1) 你的用户帐户没有权限访问 RD 网关 “” 2) 你的计算机没有权限访问 RD 网关 “” 3) 您正在使用不兼容的身份验证方式(例如:RD 网关可能需要智能卡,但您提供了密码)。请联系您的网络管理员以获取帮助。 + + + 您的计算机无法连接到远程计算机,因为您的网络管理员已限制对此 RD 网关服务器的访问。请联系您的网络管理员以获取帮助。 + + + 您的计算机无法连接到远程计算机,因为 Web 代理服务器需要身份验证。若要允许通过 Web 代理服务器向 RD 网关服务器发送未经身份验证的流量,请与您的网络管理员联系。 + + + 您的计算机无法连接到远程计算机,因为远程桌面网关服务器已达到其允许的最大连接数。请稍后尝试重新连接或联系您的网络管理员以获取帮助。 + + + 您的计算机无法连接到远程计算机,因为远程桌面网关服务器不支持该请求。请联系您的网络管理员以获取帮助。 + + + 您的计算机无法连接到远程计算机,因为客户端不支持远程桌面网关的某项功能。请联系您的网络管理员以获取帮助。 + + + 您的计算机无法连接到远程计算机,因为远程桌面网关服务器和此计算机不兼容。请联系您的网络管理员以获取帮助。 + + + 您的计算机无法连接到远程计算机,因为没有配置在远程桌面网关服务器上使用的证书。请联系您的网络管理员以获取帮助。 + + + 您的计算机无法连接到远程计算机,因为您尝试连接到的 RD 网关服务器未被您的计算机管理员允许。如果您是管理员,请将此远程桌面网关服务器名称添加到计算机上受信任的远程桌面网关服务器列表中,然后再次尝试连接。 + + + 由于以下原因之一,您的计算机无法连接到远程计算机,因为您的计算机或设备不符合网络管理员设置的网络访问保护要求:1) 远程桌面网关服务器名称和服务器的公钥证书使用者名称不匹配。2)证书已过期或已被吊销。3) 证书根颁发机构不信任该证书。4)证书密钥扩展不支持加密。5) 您的计算机无法验证证书吊销列表。请联系您的网络管理员以获取帮助。 + + + 您的计算机无法连接到远程计算机,因为需要用户名和密码才能对远程桌面网关服务器进行身份验证,而不是智能卡凭据。 + + + 您的计算机无法连接到远程计算机,因为需要智能卡凭据才能向远程桌面网关服务器进行身份验证,而不是用户名和密码。 + + + 您的计算机无法连接到远程计算机,因为向远程桌面网关服务器发送了无效的 Cookie。请联系您的网络管理员以获取帮助。 + + + 您的计算机无法连接到远程计算机,因为远程桌面网关服务器拒绝了该 Cookie。请联系您的网络管理员以获取帮助。 + + + 您的计算机无法连接到远程计算机,因为远程桌面网关服务器需要的身份验证方法与尝试的身份验证方法不同。请联系您的网络管理员以获取帮助。 + + + RD 网关连接已结束,因为间歇性或定期用户身份验证失败。请尝试使用正确的用户名和密码重新连接。如果重新连接仍失败,请联系您的网络管理员以获得进一步的帮助。 + + + RD 网关连接已结束,因为间歇性或定期用户身份验证失败。请尝试使用正确的用户名和密码重新连接。如果重新连接仍失败,请联系您的网络管理员以获得进一步的帮助。 + + + 您的计算机无法连接到远程计算机,因为远程桌面网关和远程计算机无法交换策略。这可能是由于以下原因造成的: 1. 远程计算机无法与远程桌面网关交换策略。 2. 远程计算机的配置不允许新连接。 3. 远程桌面网关与远程计算机之间的连接已结束。请联系您的网络管理员以获取帮助。 + + + RD 网关连接已结束,因为间歇性或定期用户身份验证失败。您的计算机或设备未通过网络管理员设置的网络访问保护 (NAP) 要求。请联系您的网络管理员以获取帮助。 + + + 已连接 + + + 扫描WiFi适配器“{0}”时出错,错误:“{1}”。 + + + 正在连接... + + + {0} 已断开连接! + + + 连接到{0} + + + WPS + + + 自动连接 + + + 预共享密钥 + + + 正在连接到 {0}…… + + + 无法连接到 {0}({1})! + + + 已成功连接到 {0}! + + + 网络访问已被取消 + + + 凭据无效 + + + 网络不可用 + + + 成功 + + + 尝试连接超时 + + + -/- + + + 不支持身份验证协议! + + + 正在检查 WPS…… + + + 打开 OID 配置文件... + + + MIB + + + OID 配置文件 + + + 选择 OID 配置文件 + + + 添加 OID 配置文件 + + + 删除 OID 配置文件 + + + 选定的 OID 配置文件将被永久删除。 + + + 编辑 OID 配置文件 + + + 输入密码... + + + 添加标签 + + + (从配置文件) + + + 新建子网掩码 + + + 添加服务器 + + + SNTP 服务器 + + + 本页面的设置包含错误,须更正后才能保存。 + + + SSH hostkey to use for the connection (e.g., "71:b8:f2:6e..."). Only available if the mode is "SSH". + + + Full path to the private key file (e.g., "C:\Users\BornToBeRoot\SSH\private_key.ppk"). Only available if the mode is "SSH". + + + 将传入 PuTTY 会话的用户名。仅当模式为“SSH”、“Telnet”或“Rlogin”时可用。 + + + ASN + + + AS 名称 + + + 城市 + + + + + + 国家 + + + 货币 + + + 地区 + + + DNS 解析器 + + + EDNS + + + 地理位置 + + + 托管 + + + IP 地理位置 + + + ISP + + + 纬度 + + + 经度 + + + 移动 + + + 组织 + + + PTR 记录 + + + 时区 + + + 压缩 + + + IP 地理位置 API - 快速、准确、可靠 + + + 检查 DNS 解析器 + + + 检查 IP 地理位置 + + + Show map + + + DNS 解析通过 ip-api.com 确定。 + +URL: https://edns.ip-api.com/ + + + P 地理位置通过 ip-api.com 确定。 + +URL: http://ip-api.com/ + + + 为了提供更多功能,我们使用了非我运营的第三方服务。您可以在下面取消选择。任何时候都不会向我传输数据。 + + + 正在检查 DNS 解析... + + + 检查 IP 地理位置... + + + 请检查您的网络连接,稍后再试。 + + + 已达到 ip-api.com 的速率限制(请求过多)! +请稍后再试。 + + + HTTP 状态码 + + + 铁灰色 + + + 达到速率限制!请{0}秒钟后再试... + + + 常规 + + + BSSID + + + 未找到可连接的主机! + + + 应用程序 + + + 启用实验功能来测试新功能。这些功能尚未完成,会包含错误,可能导致应用程序崩溃,并可能在发布前再次更改。 + + + 实验功能 + + + 实验性 + + + Run command... + + + IP 地理位置 + + + 添加一个 IP 地理位置查询页... + + + 输入要查询 whois 的域名... + + + 输入主机名以查询 IP 地理位置... + + + 未知用户名。 + + + 认证失败(密码、社区字符串或密钥不正确)。 + + + 操作成功,未出现任何错误。 + + + 对您请求的响应数据过大,无法一次性完整装入单个响应中! + + + 无法找到所请求的 OID! + + + 一个允许读写或仅允许写入的对象被赋予了不相符的值! + + + 请求的 OID 不存在且不可写! + + + 发生了一个错误,但没有可用的具体错误信息! + + + 请求的对象不可访问,无法修改! + + + 对象被设置为一个不兼容的数据类型! + + + 分配给对象的值超过其最大长度! + + + 对象使用的编码不正确! + + + 分配给对象的值不是一个有效的选择! + + + 请求的对象不存在,无法创建! + + + MIB 变量当前处于不一致状态,无法修改! + + + 没有可用的系统资源来执行请求的操作! + + + 设置操作过程中发生错误! + + + 设置操作失败,无法回滚之前的更改! + + + 验证失败。请检查社区字符串! + + + 请求的对象不可写,不能修改! + + + 对象的状态不一致,阻止了设置操作的执行! + + + 关闭全部 + + + 展开主机视图 + + + Expand map view + + + 正在添加其他主机时无法设置主机。请等待进程完成后再试。 + + + 没有匹配的命令! + + + 远程主机名 + + + 进程 ID + + + 进程路径 + + + 进程名 + + + NetBIOS + + + 计算机名 + + + 错误 + + + 确定 + + + 警告 + + + Group / domain + + + NetBIOS 可访问 + + + 扫描 NetBIOS + + + NetBIOS 扫描被禁用! + + + 解析主机名被禁用! + + + 解析 MAC 地址被禁用! + + + 关闭组 + + + Run command... (Ctrl+Shift+P) + + + 配置文件 + + + 打开设置... + + + 展开并打开搜索... + + + Starting with Windows 11 24H2, you’ll need to allow access to the Wi-Fi adapter. + +Open Windows Settings > Privacy & security > Location, enable access for Desktop Apps / NETworkManager, then restart the application. + + + 拖放应用程序以重新排序它们。 +右键单击可查看更多选项。 + + + 恢复默认 + + + 一个易于使用的 WPF 拖放框架。 + + + BSD-3-条款 + + + 设为默认 + + + 运行 Docker 并部署 Nextcloud 和 Traefik 的 Ubuntu Server + + + 在 AWS 运行的 Linux 服务器 + + + 6 GHz + + + Support this project with a donation. + + + 打开文档 + + + 捐款 + + + Profile file + + + Hosts File Editor + + + Hosts File Editor + + + Read-only mode. Modifying the hosts file requires elevated rights! + + + Open hosts file + + + Comment + + + Disable + + + Edit entry + + + Edit entry... + + + Enable entry + + + Disable entry + + + Refreshing... + + + Reloaded at {0} + + + Failed to load hosts file: {0} + + + Retrying in {0} seconds... + + + What's new? + + + Changelog + + + Upgraded to {0} + + + This release includes new features, improvements, and bug fixes. Check out the changelog for all the details! + + + Entries + + + The selected entry is permanently deleted: + +{0} {1} {2} + + + Primary DNS server + + + Enter a valid hostname (e.g., "server-01" or "example.com")! Multiple hostnames can be separated with a space. + + + The "hosts" file could not be read! See log file for more details. + + + The "hosts" file could not be written to. See log file for more details. + + + The entry was not found in the "hosts" file! Maybe the file has been modified. + + + A backup of the "hosts" file could not be created! See log file for more details. + + + Show status bar + + + Displays the status bar in the bottom-left of the WebView when hovering over a link. + + + Save credentials + + + Displays a dialog to save credentials after a successful sign-in. + + + Delete browsing data + + + Permanently delete browsing data (history, cookies, cache, credentials, etc.) for the current WebView2 profile. + + + Browsing Data + + + Browsing data successfully deleted! + + + An error occurred while deleting browsing data. Feel free to report this issue on GitHub. + + + production + + + Add tag + + + Apply filter + + + Filter profiles... + + + Filter by tags + + + No tags found! + + + Match + + + Any + + + Add group... + + + Expand all + + + Collapse all + + + Use custom themes to personalize the appearance of the application. You can edit or add theme in the "Program Folder > Themes" directory. For more details, refer to the documentation. + + + Admin (console) session + + + Profile file "{0}" will be deleted permanently. + + + Enable encryption? + + + Do you want to enable profile file encryption to protect sensitive data such as hosts, IP addresses, URLs, and stored credentials? + +You can enable or disable encryption later at any time by right-clicking the profile file to manage encryption settings. +If you click Cancel, the profile file will remain unencrypted. + + + A restart is required to apply changes such as language settings. + + + Could not parse or resolve any of the specified DNS servers. + + + Could not parse "{0}". + + + Maximum number of backups + + + Create daily backup + + + Number of backups that are retained before the oldest one is deleted. + + + This setting is managed by your administrator. + + + Restore default location + + + Restore + + + Restore default location? + + + The default settings location is restored and the application is restarted afterwards. + +You can copy the “settings.json” file from "{0}" to "{1}" to migrate your previous settings, if necessary. The application must be closed for this to prevent the settings from being overwritten. + + + Change location? + + + The settings location is changed and the application is restarted afterwards. + +You can copy the “settings.json” file from "{0}" to "{1}" to migrate your previous settings, if necessary. The application must be closed for this to prevent the settings from being overwritten. + + + Enter a valid folder path! + + + The profiles location is changed and the application is restarted afterwards. + +You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. + + + The default profiles location is restored and the application is restarted afterwards. + +You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. + + + Network connection + + + Network Status + + + Active Directory import failed. + + + Options + + + + Uses your current Windows credentials to read from Active Directory. The account must be allowed to enumerate computer objects under the search base (subtree). + + + Search base (DN) + + + Additional LDAP filter + + + Filter must be a valid LDAP expression starting with '(' and ending with ')'. + + + Search base must be a valid LDAP distinguished name (e.g. DC=example,DC=com). + + + Imported from Active Directory on {0} + + + No computers found for the given search base and filter. + + + Searching Active Directory... + + + If your computer is not joined to the domain, specify the domain controller (hostname or IP) and use custom credentials. + + + Server (optional) + + + Port (optional) + + + Use SSL (LDAPS) + + + Use current Windows credentials + + + Use these credentials + + + Advanced + + + Select all + + + Deselect all + + + Enable for + + + Skip already imported + + + {0} · {1} result(s) + + + {0} profile(s) imported. +{1} duplicate entries skipped. +{2} without a host skipped. + + + Active Directory + + + CSV file + + + CSV file + + + Import profiles from CSV file + + + Imported from CSV file on {0} + + + No entries were found in the CSV file. + + + Expected CSV format — one profile per line: + + + A header row and the delimiter (semicolon, comma or tab) are detected automatically. The description column is optional. Entries without a host cannot be imported. + + + Import results + + + New + + + Imported + + + No host + + + Exclude disabled accounts + + + Import computers from Active Directory + + + Import computers from Active Directory... + + + Import profiles + + + Source + + + Active Directory + + + Profile group + + + Existing or new group name + + + Firewall + + + Firewall rules + + + Windows Firewall settings + + + Direction + + + Inbound + + + Outbound + + + Action + + + Allow + + + Block + + + Network profile + + + Network profiles + + + Interface type + + + Failed to load firewall rules. {0} + + + The selected firewall rule is permanently deleted: + +{0} + + + Any + + + TCP + + + UDP + + + ICMPv4 + + + ICMPv6 + + + HOPOPT + + + GRE + + + IPv6 + + + IPv6-Route + + + IPv6-Frag + + + IPv6-NoNxt + + + IPv6-Opts + + + VRRP + + + PGM + + + L2TP + + + Any + + + Wired + + + Wireless + + + Remote access + + + Read-only mode. Modifying firewall rules requires elevated rights! + + + Inbound + + + Outbound + + + Block + + + Allow + + + Local ports + + + Remote ports + + + Local addresses + + + Remote addresses + + + Enter a valid IP address, subnet (e.g. 10.0.0.0/8), range (e.g. 10.0.0.1-10.0.0.10), or keyword (Any, LocalSubnet, DNS, DHCP, WINS, DefaultGateway, Internet, Intranet, IntranetRemoteAccess, PlayToDevice, CaptivePortal) + + + Add rule + + + Add rule... + + + Edit rule + + + Edit rule... + + + Delete rule + + + Enable rule + + + Disable rule + + + Import profiles... + + + Speed Test + + + Run speed test + + + Fetching metadata... + + + Measuring latency... + + + Measuring download speed... + + + Measuring upload speed... + + + Measure download and upload speeds, latency, and jitter with speed.cloudflare.com. +Cloudflare may log your IP address and network information. See Cloudflare's privacy policy for details. + + + Latency + + + Jitter + + + Speed test service used to measure download speed, upload speed, latency, and jitter. - - Unlock the profile file to add, change or delete a profile! + + Stop diff --git a/Source/NETworkManager.Localization/Resources/Strings.zh-TW.resx b/Source/NETworkManager.Localization/Resources/Strings.zh-TW.resx index 3548245c12..81942319c6 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.zh-TW.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.zh-TW.resx @@ -124,7 +124,7 @@ 醒目 - 新增認證 + 新增憑證 新增項目 @@ -133,25 +133,49 @@ 新增設定檔 - 是否確定? + 您確定嗎? ARP - - ARP 表格 + + 鄰居表單 + + + 唯讀模式。若要修改鄰居表單,需要提升權限! + + + 無法抵達 + + + 不完整 + + + 探測器 + + + 延遲 + + + 過時 + + + 可抵達 + + + 永久性 - 驗證 + 身份驗證 自動啟動 - 計算機 + 計算器 - 命令列引數 + 命令列參數 配置 @@ -169,7 +193,7 @@ 複製設定檔 - 認證 + 憑證 資料 @@ -178,7 +202,7 @@ 預設應用程式 - 刪除認證 + 刪除憑證 刪除設定檔 @@ -199,13 +223,13 @@ DNS - DNS 查閱 + DNS 查詢 - 不要片段 + 不要分段 - 編輯認證 + 編輯憑證 編輯群組 @@ -253,7 +277,7 @@ 鍵盤 - 語系 + 語言 程式庫 @@ -268,7 +292,7 @@ 位置 - 查閱 + 查詢 MAC 位址 @@ -285,14 +309,26 @@ 網路介面 + + 設定已套用 + + + 設定網路介面需要管理員權限! + 新標籤 + + 下一步 + OUI + + 選項 + - 覆寫? + 覆寫? Ping @@ -304,7 +340,7 @@ 可攜式 - Port 掃瞄器 + 連接埠掃描器 設定檔 @@ -334,7 +370,7 @@ 路由 - 掃瞄 + 掃描 搜尋 @@ -348,9 +384,6 @@ 設定 - - 設定已經重設! - SNMP @@ -370,7 +403,7 @@ 子網路 - 成功! + 成功! 主題 @@ -391,10 +424,10 @@ v3 - 驗證失敗! + 驗證失敗! - 網路喚醒 + LAN 遠端喚醒 網站 @@ -403,7 +436,7 @@ 視窗 - 密碼錯誤! + 密碼錯誤! 用戶端 @@ -415,7 +448,7 @@ 永遠顯示系統匣中圖示 - 嘗試 + 嘗試次數 平均時間 @@ -444,6 +477,18 @@ 描述 + + 佔位符 + + + 要執行的檔案或執行檔路徑。可使用下列佔位符: + + + 傳遞給檔案或執行檔的參數。可使用下列佔位符: + + + 可使用下列佔位符: + DHCP 已啟用 @@ -466,7 +511,7 @@ 動態 IPv4 位址 - 動態 IPv4 伺服器 + 動態 IPv4 DNS 伺服器 躍點 @@ -489,6 +534,30 @@ IPv4 位址 + + IPv4 位址已新增 + + + IPv4 位址已移除 + + + IPv4 位址已釋放並更新 + + + IPv4 位址已釋放 + + + IPv4 位址已更新 + + + IPv6 位址已釋放並更新 + + + IPv6 位址已釋放 + + + IPv6 位址已更新 + IPv4 預設閘道 @@ -504,17 +573,29 @@ IPv6 預設閘道 + + 映射 + + + (+ {0}更多) + + + 滾動 = 縮放,拖曳 = 平移 + + + 未知 + 最大 - - 最大躍點/路由器 + + 最大跳點 - 最小化視窗而不關閉 + 將主視窗最小化,而非結束應用程式 - Minimize to tray instead of taskbar + 最小化至系統匣,而非工作列 最小 @@ -547,7 +628,7 @@ 實體位址 - Preferred protocol when resolving hostname: + 解析主機名稱時的首選協定: 主要 DNS 伺服器 @@ -561,9 +642,6 @@ 需要重新啟動 - - Some settings are applied only after restarting the application! - 在應用程式的資料夾中儲存檔案 @@ -574,19 +652,19 @@ 顯示 - Show the following application on startup: + 啟動時顯示以下應用程式: - A powerful tool for managing networks and troubleshoot network problems! + 一個用於管理網路並排除網路問題的強大開源工具! 速度 - 在系統匣啟動最小化 + 啟動時最小化至系統匣 - 隨 Windows 啟動 (目前使用者) + 隨 Windows 啟動 (目前使用者) 靜態 IPv4 位址 @@ -594,35 +672,32 @@ 動態 IPv4 DNS 伺服器 - + 子網路遮罩 - - 子網路遮罩或 CIDR - 執行緒 - + 時間 - 1 次 + 時間 1 - 2 次 + 時間 2 - 3 次 + 時間 3 逾時 - 逾時 (ms) + 逾時(毫秒) - - 每次 ping 之間的等待時間 + + 每次 Ping 之間等待時間(毫秒) TTL @@ -631,10 +706,10 @@ 類型 - 使用下列的 DNS 伺服器位址: + 使用下列的 DNS 伺服器位址: - 使用下列的 IP 位址: + 使用下列的 IP 位址: 喚醒 @@ -646,10 +721,10 @@ 新增 - 新增標籤執行來 DNS 查閱... + 新增分頁以執行 DNS 查詢... - 新增標籤執行來網路掃瞄... + 新增標籤執行來網路掃描... 新增標籤執行來 SNMP 動作... @@ -658,16 +733,13 @@ 新增標籤執行來 ping... - 新增標籤執行來連接埠掃瞄... + 新增標籤執行來連接埠掃描... 新增標籤執行來追蹤... - - Add a tab to query the HTTP headers... - - Add DNS suffix (primary) to hostname + 為主機名稱加入 DNS 後綴(主要) 其他命令列 @@ -685,25 +757,25 @@ 答案 - The application will be restarted afterwards! + 應用程式將在此後重新啟動! 套用 - 套用 Windows 按鍵組合 (例如 ALT+TAB): + 套用 Windows 快捷鍵組合(例如 ALT+TAB): - 驗證 + 身份驗證 - 驗證等級 + 身份驗證等級 - 法律 + 授權伺服器 - 每次自動更新 + 自動更新,每 返回 @@ -718,7 +790,10 @@ 使用者已取消作業。 - Caps lock 已啟用! + Caps lock 已啟用! + + + 圖表時間(秒) 在啟動時檢查更新 @@ -730,19 +805,19 @@ 清除篩選 - 色彩深度 (位元) + 色彩深度(位元) 社群 - Configure the path to PuTTY in the settings... + 在設定中配置 PuTTY 的路徑… 確認關閉 - 你確定要關閉應用程式嗎? + 你確定要關閉應用程式嗎? 連線身分... @@ -751,7 +826,7 @@ 連線外部 - Connect the network card to a network to configure it! + 將網路卡連接到網路以進行配置! 複製 @@ -763,27 +838,27 @@ 複製... - Could not resolve hostname for: "{0}" + 無法解析主機名稱:"{0}" 認證 - Profile files are encrypted on disk using AES with a key size of 256 bits and a block size of 128 bits in CBC mode. The encryption key is derived from a master password using Rfc2898DeriveBytes (PBKDF2) with 1,000,000 iterations. At runtime, passwords are stored as SecureString once the profile file is loaded. For some functions, the password must be converted to a normal string and remains unencrypted in memory until the garbage collector cleans them up. + 設定檔會以 AES 加密,256‑bit 金鑰、128‑bit 塊長,CBC 模式,存放於磁碟。加密金鑰由主密碼透過 Rfc2898DeriveBytes(PBKDF2)經 1,000,000 次迭代所推導。執行時,密碼會在設定檔載入後以 SecureString 儲存;但某些功能需要將其轉成普通字串,在此期間內密碼會保持未加密狀態,直至垃圾回收器清理。 -First make a backup copy of your profile files before enabling encryption! +請先備份您的設定檔,再啟用加密! 自訂 - 自訂螢幕尺寸: + 自訂螢幕尺寸: - 資料已更新! + 資料已更新! - Credentials must be decrypted and loaded to manage them. + 必須先將憑證解密並載入,才能進行管理。 預設值 @@ -792,7 +867,7 @@ First make a backup copy of your profile files before enabling encryption!傳輸速率 - 預設連接埠: + 預設連接埠: Rlogin 連接埠 @@ -804,26 +879,23 @@ First make a backup copy of your profile files before enabling encryption!Telnet 連接埠 - The selected credential will be deleted permanently. + 所選擇的憑證將被永久刪除。 刪除項目 - Selected profile will be deleted permanently. + 所選擇的設定檔將被永久刪除。 DNS 自動配置 - DNS 查閱... + DNS 查詢... DNS 伺服器 - - 打開文件 - 網域 @@ -837,25 +909,25 @@ First make a backup copy of your profile files before enabling encryption!啟用 - Enable Credential Security Support Provider + 啟用憑證安全支援提供者 結束時間 - - Enter a subnet to calculate it... + + 輸入子網路以進行計算… - Enter subnet and a new subnet mask to create subnets... + 輸入子網路及新子網遮罩以產生子網路… - Couldn't connect to 'api.github.com', check your network connection! + 無法連線至 'api.github.com',請檢查您的網路連線! - 回應發生錯誤! + 回應發生錯誤! - Error in response! Check if you have write permissions. + 回應出現錯誤!請檢查您是否擁有寫入權限。 展開 @@ -864,10 +936,7 @@ First make a backup copy of your profile files before enabling encryption!首先可使用 IP 位址 - 固定螢幕尺寸: - - - Star/Fork the Project on GitHub + 固定螢幕尺寸: 找到了 @@ -891,7 +960,7 @@ First make a backup copy of your profile files before enabling encryption!ID - Inherit host from general + 從一般設定繼承主機 IP 範圍 @@ -909,10 +978,10 @@ First make a backup copy of your profile files before enabling encryption!MAC 位址或廠商 - Magic 封包傳送成功! + Magic 封包傳送成功! - Maximum number ({0}) of hops/router reached! + 已達到最大跳數({0})或路由器! 訊息大小 @@ -927,48 +996,51 @@ First make a backup copy of your profile files before enabling encryption!多重執行個體 - The network address cannot be reached. Check if your computer is connected to the network. For information about network troubleshooting, see Windows Help. + 無法連線至網路位址。請檢查您的電腦是否已連接到網路。如需了解網路疑難排解資訊,請參閱 Windows 幫助。 新連線... - No DNS record found for "{0}"! Check your input and the settings. + 未找到「{0}」的 DNS 記錄!請檢查您的輸入與設定。 - 找不到啟用網路介面卡! + 找不到啟用網路介面卡! - 找不到連接埠。檢查您的輸入! + 找不到連接埠。檢查您的輸入! - No profiles found! -Create one... + 未找到任何設定檔! +請先建立一個… - 沒有找到! + 沒有找到! - 不執行任何動作。檢查您的輸入! + 不執行任何動作。檢查您的輸入! - 沒有可用的更新! + 沒有可用的更新! - No valid file found to import. + 找不到任何有效的檔案可供匯入。 - 找不到廠商。檢查您的輸入! + 找不到廠商。檢查您的輸入! - Number of errors after which is canceled: + 錯誤次數超過此值即取消: - Number of stored entries + 已儲存項目數 OID + + 僅允許 CSV 檔案! + 只有在使用全螢幕時 @@ -993,17 +1065,11 @@ Create one... 覆寫 - - Overwrite settings in the destination folder? - -"Overwrite" will overwrite the file in the destination folder. -"Use other" will use the existing settings file in the destination and restart the application. - 密碼 - 密碼不相符! + 密碼不相符! 路徑 @@ -1027,10 +1093,7 @@ Create one... 通訊協定 - PuTTY 處理程序已經結束! - - - PuTTY 設定檔 + PuTTY 程式已結束! 問題 @@ -1072,25 +1135,25 @@ Create one... 重複 - Resolve CNAME on ANY requests + 對 ANY 請求解析 CNAME 回應 - Rlogin + 遠端登入 已掃描 - 已搜尋應用程式未找到! + 已搜尋應用程式未找到! - 已搜尋語系未找到! + 未找到搜尋語言! - 已搜尋設定未找到! + 未找到搜尋設定! 安全性 @@ -1098,42 +1161,24 @@ Create one... 選擇螢幕解析度 - - The selected settings are overwritten! - - - 此已選擇設定被重置。 - - - Select the settings you want to export: - - - Select the settings you want to import: - - 此將重置所有設定! + 此將重置所有設定! 序列 - 序列線路 + 序列埠 服務 - The settings file found was corrupted or is not compatible with this version. All settings have been reset! -(Profile files are not affected!) - - - 設定已成功匯出! - - - 設定已成功匯入! - - - 設定已成功重置! + 找到的設定檔已損毀或與此版本不相容!您可在 GitHub 上回報此問題。 + +已在設定資料夾中建立設定檔備份,並將設定重置。 + +設定檔案未受到任何影響! 顯示關閉連接埠 @@ -1142,10 +1187,10 @@ Create one... 顯示目前應用程式標題 - Show only most common query types + 僅顯示最常見的查詢類型 - - 顯示所有 IP 位址的結果 + + 顯示不可達的 IP 位址與連接埠。 顯示統計資料 @@ -1157,7 +1202,7 @@ Create one... 開始時間 - State + 狀態 子網路 1 @@ -1166,34 +1211,34 @@ Create one... 子網路 2 - 標籤​​ + 標籤​ Telnet - The application can be started without parameters! + 此應用程式可以在未提供任何參數時啟動! - The following hostnames could not be resolved: + 以下主機名稱無法解析: - The following parameters are available: + 以下參數可用: - The following parameters can not be processed: + 以下參數無法處理: - The process can take up some time and resources (CPU / RAM). + 此過程可能會佔用較長時間及系統資源(CPU/RAM)。 - The settings location is not affected + 設定位置不會被改動! - SNMP 查詢逾時 + SNMP 查詢逾時。可能主機無法連線,或社群字串/密碼錯誤。 - Timeout when querying the DNS server with the IP address "{0}"! + 使用 IP 位址「{0}」查詢 DNS 伺服器時逾時! 時間戳記 @@ -1202,10 +1247,10 @@ Create one... 追蹤 - 不明錯誤! + 未知錯誤! - - Untray / Bring window to front + + 從托盤移除/將視窗提升至前景 網址 @@ -1214,7 +1259,7 @@ Create one... 使用認證 - Use the current view size as the screen size + 以目前的檢視尺寸作為螢幕尺寸 使用自訂 DNS 伺服器 @@ -1226,7 +1271,7 @@ Create one... 使用解析快取 - 使用已鎖定介面! + 使用已鎖定介面! 使用者名稱 @@ -1238,19 +1283,19 @@ Create one... 版本 - 有新的 {0} 版本! + 「{0}」版本現已可用! - 步行模式 + 行走模式 寬度 - Profile file could not be decrypted with the given password. + 無法使用所給的密碼解密設定檔。 - 輸入密碼有錯。 + 輸入的密碼不正確。 新增... @@ -1259,7 +1304,7 @@ Create one... 新增項目... - 計算機 + 計算 取消 @@ -1283,7 +1328,7 @@ Create one... 繼續 - 自訂: + 自訂: 剪下 @@ -1301,16 +1346,19 @@ Create one... 輸入位置... - 所有內容 + 所有事物 篩選... - 排清 DNS 快取 + 清除 DNS 快取 + + + DNS 快取已清除 - Decrypt and load your credentials to select them. + 請先將憑證解密並載入,然後再進行選取。 顯示這個對話方塊。 @@ -1319,25 +1367,25 @@ Create one... 重置所有應用程式的設定。 - The password is not displayed when editing, but can be overwritten. + 在編輯時密碼不會被顯示,但可進行覆寫。 - [0] If server authentication fails, connect to the computer without warning. -[1] If server authentication fails, do not establish a connection. -[2] If server authentication fails, show a warning and allow me to connect or refuse the connection. -[3] No authentication requirement is specified. + [0] 若伺服器身份驗證失敗,將不顯示警告直接連線至電腦。 +[1] 若伺服器身份驗證失敗,不建立任何連線。 +[2] 若伺服器身份驗證失敗,會顯示警告並允許使用者選擇「連線」或「拒絕」。 +[3] 未設定任何身份驗證要求。 - Tags help you organize profiles/Profiles by topics/projects. Multiple tags can be used with ";" be separated. Search by tags with "tag=xxx". + 標籤可協助您依主題/專案組織設定檔。多個標籤以分號 ";" 分隔。使用 'tag=xxx' 進行搜尋。 - 小時 + 小時(H) 匯出檔案的位置... - 分鐘 + 分鐘(M) 移動 & 重新啟動 @@ -1346,7 +1394,7 @@ Create one... 網路連線... - (未變更) + (未變更) @@ -1366,12 +1414,12 @@ Create one... 覆寫 + + 解析 + 貼上 - - C:\Program Files\PuTTY\putty.exe - 重新連線 @@ -1388,7 +1436,7 @@ Create one... 搜尋... - + 秒(S) 發送 @@ -1400,7 +1448,7 @@ Create one... 使用本地授權 - IP 子網路計算機 + 子網路計算器 驗證 @@ -1409,34 +1457,34 @@ Create one... 連線 - 輸入有效的 IP 範圍! + 輸入有效的 IP 範圍! - 輸入有效的 IPv4 位置! + 輸入有效的 IPv4 位址! - 輸入有效的 MAC 位址 (如 00:F1:23:AB:F2:35)! + 輸入有效的 MAC 位址(例如:00:F1:23:AB:F2:35)! - 輸入有效的連接埠 (1 - 65535)! + 輸入有效的連接埠 (1 - 65535)! - 輸入有效的子網路遮罩 (如 255.255.255.0)! + 輸入有效的子網遮罩(例如:255.255.255.0)! - 輸入有效的子網路遮罩或 CIDR (如 255.255.255.0 或 /24)! + 輸入有效的子網遮罩或 CIDR(例如:255.255.255.0 或 /24)! - 欄位不可空白! + 欄位不可空白! - 檔案不存在! + 檔案不存在! - 資料夾不存在! + 資料夾不存在! - 接聽程式 + 監聽器 琥珀色 @@ -1448,10 +1496,10 @@ Create one... 應用程式 - Dark + 深色 - Light + 淺色 黑色 @@ -1475,28 +1523,28 @@ Create one... 深綠色 - 輸入一或多個有效的 IP 位址! + 輸入一或多個有效的 IP 位址! - 輸入有效的傳輸速率! + 輸入有效的傳輸速率! - 輸入有效的主機 (多主機不能以 ";" 結尾)! + 輸入有效的主機 (多主機不能以 ";" 結尾)! - 輸入有效的 IP 位址! + 輸入有效的 IP 位址! - 輸入有效的數量! + 輸入有效的數量! - 輸入有效的 OID! + 輸入有效的 OID! - 輸入有效的連接埠和/或連接埠範圍 (1 - 65535)! + 輸入有效的連接埠和 / 或連接埠範圍 (1 - 65535)! - 輸入有效的子網路 (如 192.168.178.133/26)! + 輸入有效的子網路 (如 192.168.178.133/26)! 輸入有效的網站 (如 https://example.com/index.html) @@ -1505,7 +1553,7 @@ Create one... 綠色 - 匯入/匯出 + 匯入 / 匯出 靛藍色 @@ -1526,14 +1574,17 @@ Create one... 要求已逾時。 - TTL expired in transit. + TTL 在傳輸途中已逾時。 - 金鑰必須有8個字元或以上! + 金鑰必須有 8 個字元或以上! 亮綠色 + + 即時 + 洋紅色 @@ -1544,7 +1595,7 @@ Create one... 橄欖色 - 只能輸入數字! + 只能輸入數字! 橙色 @@ -1562,7 +1613,7 @@ Create one... 通訊端已關閉。 - 遠端中斷連線由伺服器 + 遠端中斷連線由伺服器。 解壓縮錯誤。 @@ -1574,16 +1625,16 @@ Create one... 解密錯誤。 - DNS 名稱查閱失敗 + DNS 名稱查詢失敗。 - DNS 查閱失敗。 + DNS 查詢失敗。 加密錯誤。 - Windows Sockets gethostbyname call failed. + Windows Sockets 的 gethostbyname 呼叫失敗。 找不到主機。 @@ -1598,7 +1649,7 @@ Create one... 內部安全性錯誤。 - The encryption method specified is not valid. + 所指定的加密方式無效。 指定了錯誤的 IP 位址。 @@ -1613,7 +1664,7 @@ Create one... 伺服器安全性資料無效。 - License negotiation failed. + 授權協商失敗。 授權逾時。 @@ -1637,13 +1688,13 @@ Create one... 遠端中斷連線由使用者。 - Failed to unpack server certificate. + 無法解壓伺服器憑證。 Windows Sockets 連線失敗了。 - Windows Sockets recv call failed. + Windows Sockets 的 recv 呼叫失敗。 此帳戶已停用。 @@ -1658,37 +1709,37 @@ Create one... 此帳戶已限制。 - The received certificate is expired. + 收到的證書已過期。 - The policy does not support delegation of credentials to the target server. + 此政策不支援將憑證委派至目標伺服器。 - The server authentication policy does not allow connection requests using saved credentials. The user must enter new credentials. + 伺服器身份驗證政策不允許使用已儲存的憑證進行連線請求。使用者必須輸入新的憑證。 登入失敗。 - No authority could be contacted for authentication. The domain name of the authenticating party could be wrong, the domain could be unreachable, or there might have been a trust relationship failure. + 無法連線至授權機構進行驗證。認證方的網域名稱可能錯誤、網域不可達,或信任關係失敗。 - The specified user has no account. + 指定使用者沒有帳號。 此密碼已到期。 - The user password must be changed before logging on for the first time. + 使用者密碼必須在第一次登入前先更改。 - Delegation of credentials to the target server is not allowed unless mutual authentication has been achieved. + 除非已完成雙向驗證,否則不允許將憑證委派至目標伺服器。 智慧卡被封鎖。 - An incorrect PIN was presented to the smart card. + 提供給智慧卡的 PIN 不正確。 發生逾時。 @@ -1697,13 +1748,13 @@ Create one... 內部計時器錯誤。 - Windows Sockets send call failed. + Windows Sockets 的 send 呼叫失敗。 赭色 - 不允許有空格! + 不允許有空格! 鐵灰色 @@ -1736,7 +1787,7 @@ Create one... LastAck - 接聽 + 監聽 SynReceived @@ -1762,11 +1813,8 @@ Create one... 黃色 - - 輸入 25 到 100 之間的有效值! - - A profile with this name already exists! + 已存在同名設定檔! 已關閉 @@ -1775,7 +1823,7 @@ Create one... 打開 - At least one application must be visible! + 至少要有一個應用程式可見! 隱藏應用程式 @@ -1784,19 +1832,22 @@ Create one... 可見應用程式 - Visible applications in the bar: + 工具列中可見的應用程式: Whois - Add a tab to query whois... + 新增「Whois 查詢」分頁 - 輸入有效的網域 (如 "example.com")! + 輸入有效的網域名稱(例如 example.com)以進行檢查! + + + 請輸入有效的 Windows 使用者名稱(例如:「user」、「DOMAIN\user」或「user@domain.com」)! - Whois server not found for the domain: "{0}" + 無法為域名「{0}」找到對應的 Whois 伺服器。 路由 @@ -1817,7 +1868,7 @@ Create one... 刪除 DNS 伺服器 - The selected DNS server will be deleted permanently. + 所選的 DNS 伺服器將被永久刪除。 新增 DNS 伺服器 @@ -1826,7 +1877,7 @@ Create one... 編輯 DNS 伺服器 - A DNS server with this name already exists! + 已存在此名稱的 DNS 伺服器! 重新啟動工作階段 @@ -1835,10 +1886,7 @@ Create one... TigerVNC - Configure the path to TigerVNC in the settings... - - - TigerVNC 位置... + 在設定中配置 TigerVNC 的路徑。 TigerVNC 處理程序已經結束! @@ -1868,7 +1916,7 @@ Create one... 檔案 - 輸入有效的檔案路徑! + 輸入有效的檔案路徑! 全部 @@ -1880,7 +1928,7 @@ Create one... 已選擇 - An error occurred while exporting the data. See error message for details: + 匯出資料時發生錯誤,請參閱以下錯誤訊息以了解詳細資訊: 設計 @@ -1889,10 +1937,10 @@ Create one... 醒目提示逾時 - Enter subnets to create a wide subnet... + 輸入子網路以建立廣域子網... - Wide Subnet + 廣域子網路 新增標籤... @@ -1903,20 +1951,20 @@ Create one... 新增 IPv4 位址 - - 主機執行緒 + + 最大同時主機執行緒數 - - 連接埠執行緒 + + 最大同時連接埠執行緒數 PowerShell - Configure the path to PowerShell in the settings... + 在設定中配置 PowerShell 的路徑。 - PowerShell 處理程序已經結束! + PowerShell 程式已結束! 執行原則 @@ -1924,9 +1972,6 @@ Create one... 遠端主控台 - - PowerShell 位置... - 檔案路徑 @@ -1934,71 +1979,71 @@ Create one... 覆寫預設設定 - Resolve IPv4 address for this host + 為此主機解析 IPv4 位址。 隱藏 - 接收的位元組總數 + 已接收總位元組數 - 傳送的位元組總數 + 已傳送總位元組數 - 下載 + 已下載 頻寬 - 上傳 + 已上傳 套用 Windows 按鍵組合 - Credential Security Support Provider + 憑證安全支援提供者 背景工作 - The background job will save settings, profiles and credentials every x-minutes. + 背景工作程式會每隔 x 分鐘 自動儲存設定與使用者檔。 -Value 0 will disable this feature. +設定為 0 時,將停用此功能。 -Changing this value requires a restart of the application to take effect. +變更此值後,必須重新啟動應用程式才能生效。 - Run background job every x-minute + 每隔 x 分鐘 執行背景工作 - Your system OS is incompatible with the latest release! + 您的作業系統與最新版本不相容! 儀表板 - All settings can be changed later in the settings + 所有設定都可以稍後在設定頁面中更改! 檢查公用 IP 位址 - - Thanks for using NETworkManager! + + 感謝您使用 NETworkManager! -To provide additional features the application uses services on the Internet that are not operated by me. No data will be sent to me at any time. +如果您喜歡這個專案,請考慮支持它的開發——無論是於 GitHub 上留下星標、捐款,或僅僅將它分享給他人。您的支援能幫助專案持續運行並不斷成長。 - When starting the program, it checks in the background whether a new program version is available on GitHub. + 啟動程式時,背景會檢查 GitHub 上是否有新版本可供下載。 -URL: https://api.github.com/ +網址:https://api.github.com/ - The public IP address is determined via ipify.org. + 公共 IP 位址是透過 ipify.org 確定的。 -URL: https://api.ipify.org/ +網址:https://api.ipify.org 和 https://api6.ipify.org 隱私權 @@ -2009,14 +2054,14 @@ URL: https://api.ipify.org/ 外部服務 - - Star/Fork the Project on GitHub. + + 在 GitHub 上星標/分叉此專案。 - - Help translate the project on Transifex. + + 在 Transifex 上協助翻譯此專案。 - - Contact via Twitter. + + 透過 X 追蹤我或與我聯絡。 連線 @@ -2031,80 +2076,71 @@ URL: https://api.ipify.org/ 網際網路 - Check your network adapter configuration (dns) and if your dns server is configured correctly. + 請檢查您的網路介面卡設定(DNS),並確認 DNS 伺服器已正確配置。 - Check your network adapter configuration (dhcp, static ip) and if you are connected to a network. - - - 錯誤 - - - 確定 - - - 警告 + 請檢查您的網路介面卡設定(DHCP、靜態 IP),以及您是否已連接至網路。 - 無法偵測閘道 IP 位址! + 無法偵測閘道 IP 位址! - 無法偵測本機 IP 位址! + 無法偵測本機 IP 位址! - Could not get public ip address via WebRequest (http/https) from "{0}"! Check your network connection (firewall, proxy, etc.). + 無法透過 WebRequest(HTTP/HTTPS)從「{0}」取得公共 IP 位址!請檢查您的網路連線(防火牆、代理伺服器等)。 - No A dns records resolved for "{0}"! + 未解析出任何 A 類 DNS 記錄於「{0}」! - No PTR dns record resolved for "{0}"! + 未解析出任何 PTR DNS 記錄於「{0}」! - "{0}" A dns records resolved for "{1}"! + 「{0}」A 類 DNS 記錄已解析為「{1}」! - PTR dns record resolved for "{0}"! + PTR DNS 記錄已解析為「{0}」! - Got "{0}" as public ip address from "{1}"! + 已從「{1}」取得公共 IP 位址:「{0}」! - Resolved "{0}" as hostname for ip address "{1}"! + 已將「{1}」解析為主機名稱:「{0}」! 公共 IP 位址檢查 -已停用! +已停用! - TCP/IP stack is available. "{0}" is reachable via ICMP! + TCP/IP 堆疊可用。「{0}」能透過 ICMP 連通! - TCP/IP stack is not available... "{0}" is not reachable via ICMP! + TCP/IP 堆疊不可用…「{0}」無法透過 ICMP 連通! - "{0}" detected as gateway ip address! + 已偵測到「{0}」為閘道器 IP 位址! - "{0}" detected as local ip address! + 已偵測到「{0}」為本機 IP 位址! - "{0}" is not reachable via ICMP! + 「{0}」無法透過 ICMP 連通! - "{0}" is reachable via ICMP! + 「{0}」能透過 ICMP 連通! - Use custom IPv4 address API + 使用自訂 IPv4 位址 API - - URL to a web service that can be reached via http or https and returns an IP address as response. + + 可透過 HTTP 或 HTTPS 連線的網路服務 URL,回傳一個 IPv4 位址「例如 "xx.xx.xx.xx"」作為回應。 - Could not parse public ip address from "{0}"! Try another service or use the default... + 無法從「{0}」解析出公共 IP 位址!請嘗試其他服務或使用預設設定… - 無法連線到 "{0}"! + 無法連線到 "{0}"! IPv4 通訊協定可用 @@ -2172,6 +2208,12 @@ URL: https://api.ipify.org/ 視覺樣式 + + 僅供檢視 + + + 攔截遠端連線的鍵盤與滑鼠輸入 + 遠端音訊 @@ -2206,7 +2248,7 @@ URL: https://api.ipify.org/ 新增自訂命令 - 引數 + 參數 刪除自訂命令 @@ -2217,26 +2259,41 @@ URL: https://api.ipify.org/ 程式 - - The selected custom command will be deleted permanently. + + 私密 - - The following variables are available: - -$$ipaddress$$ --> IP adresse -$$hostname$$ --> Hostname + + 公開 + + + 所選的自訂命令將被永久刪除。 重新啟動 - - Could not resolve ip address for hostname! + + 無法為主機名稱解析 IP 位址! Ctrl+Alt+Del + + 工作管理員 (Ctrl+Shift+Esc) + + + 鎖定 (Win+L) + + + 顯示桌面 (Win+D) + + + 檔案總管 (Win+E) + + + 執行對話框 (Win+R) + - 鍵盤快速鍵 + 鍵盤快捷鍵 調整螢幕 @@ -2245,7 +2302,7 @@ $$hostname$$ --> Hostname 全螢幕 - 無法傳送按鍵輸入! + 無法傳送按鍵輸入! 已中斷連線 @@ -2254,7 +2311,7 @@ $$hostname$$ --> Hostname 偵測本機 IP 位址和子網路遮罩 - 無法偵測子網路遮罩! + 無法偵測子網路遮罩! 偵測網路中... @@ -2266,13 +2323,13 @@ $$hostname$$ --> Hostname 網路無法使用! - IP address to detect local ip address based on routing + 根據路由偵測本機 IP 位址 - Show status window on network change + 在網路變更時顯示狀態視窗 - - Time in seconds how long the window should be displayed + + 以秒為單位,表示狀態窗口顯示的時長。 WiFi @@ -2284,13 +2341,13 @@ $$hostname$$ --> Hostname 正在搜尋網路... - 找不到 WiFi 介面卡! + 找不到 WiFi 介面卡! 正在搜尋 WiFi 介面卡... - 找不到 WiFi 網路! + 找不到 WiFi 網路! 頻道 @@ -2298,12 +2355,18 @@ $$hostname$$ --> Hostname 頻道 + + 通道寬度 + 2.4 GHz 5 GHz + + 2.4 & 5 GHz + 訊號強度 @@ -2332,7 +2395,7 @@ $$hostname$$ --> Hostname 使用快取 - 使用唯 TCP + 僅使用 TCP。 查詢類別 @@ -2341,16 +2404,13 @@ $$hostname$$ --> Hostname 網域名稱 - 逾時 (s) + 逾時(秒) - - Report an issue or create a feature request - - - Report an issue or create a feature request. + + 回報問題或提出功能需求。 - Beacon interval + 信號發送間隔 加密 @@ -2359,13 +2419,13 @@ $$hostname$$ --> Hostname 基礎結構 - Network kind + 網路種類 - Phy kind + 物理層類型 - Uptime + 上線時長 顯示錯誤訊息 @@ -2377,7 +2437,7 @@ $$hostname$$ --> Hostname 新增主機 - Add a host to monitor + 新增主機進行監控 暫停 @@ -2386,31 +2446,58 @@ $$hostname$$ --> Hostname 繼續 - 無法解析 ip 位址: "{0}" + 無法解析 ip 位址:"{0}" + + + 通知 + + + 在狀態變更時顯示通知彈窗 + + + 在狀態變更時播放聲音 + + + 成功門檻 + + + 顯示「主機已連線」通知前所需的連續成功 Ping 次數。較高的值可減少因主機狀態頻繁變動所產生的雜訊。 + + + 失敗門檻 + + + 顯示「主機已斷線」通知前所需的連續失敗 Ping 次數(逾時)。較高的值可減少因主機狀態頻繁變動所產生的雜訊。 + + + 顯示時間(秒) + + + 主機已連線 + + + 主機已斷線 應用程式將重新啟動... - - Use other folder - - 不能匯出檔案! 參閱錯誤訊息: "{0}" + 不能匯出檔案!參閱錯誤訊息:"{0}" - 檔案已匯出到 "{0}"! + 檔案已匯出到 "{0}"! - 不能匯入檔案! 參閱錯誤訊息: "{0}" + 不能匯入檔案!參閱錯誤訊息:"{0}" - Location cannot be changed in portable version! + 可攜版中無法變更位置! 已加密 - - Open documentation on GitHub. + + 開啟文件。 客戶 1 @@ -2431,7 +2518,7 @@ $$hostname$$ --> Hostname 加密... - 設定檔名稱已經存在! + 設定檔名稱已經存在! 重新命名 @@ -2439,17 +2526,14 @@ $$hostname$$ --> Hostname 刪除設定檔檔案 - - Selected profile file will be deleted permanently. - - All profiles in this profile file will be permanently deleted! + 此設定檔中的所有設定檔將被永久刪除! 修補 - 重新啟動應用程式來變更語系! + 重新啟動應用程式來變更語言! 目前已下載 @@ -2464,7 +2548,7 @@ $$hostname$$ --> Hostname 系統管理員身分重新啟動 - To analyze network packets, the application must be started with elevated rights! + 分析網路封包需要提升權限! 擷取 @@ -2473,7 +2557,7 @@ $$hostname$$ --> Hostname 裝置 - 期間 + 持續時間(秒) 型號 @@ -2482,10 +2566,10 @@ $$hostname$$ --> Hostname VLAN - Capture network packets to view LLDP or CDP information! + 捕捉網路封包以檢視 LLDP 或 CDP 資訊! - No discovery protocol packages received! + 未收到任何探測協定封包! 正在擷取網路封包... @@ -2493,23 +2577,23 @@ $$hostname$$ --> Hostname Discovery 通訊協定 - + CDP - + LLDP - + LLDP / CDP - 剩下 {0} 秒鐘... + {0} 秒數剩餘... 說明 - Application that is displayed at startup. + 啟動時顯示的應用程式 參數 @@ -2527,13 +2611,13 @@ $$hostname$$ --> Hostname 瀏覽器 - The WebView control (Microsoft Edge) cannot connect to websites with an invalid certificate! + WebView 控制項(Microsoft Edge)無法連線到使用不正確憑證的網站! - Microsoft.Windows.SDK.Contracts is required for this feature but not available on this system (e.g. on Windows Server). + 此功能需使用 Microsoft.Windows.SDK.Contracts,但該套件在此系統(如 Windows Server)中無法取得。 - - ARP 表格 + + 鄰居表單 連線 @@ -2545,7 +2629,7 @@ $$hostname$$ --> Hostname Discovery 通訊協定 - DNS 查閱 + DNS 查詢 HTTP 標頭 @@ -2554,10 +2638,10 @@ $$hostname$$ --> Hostname IP 掃描器 - 接聽程式 + 監聽器 - 查閱 + 查詢 網路介面 @@ -2566,10 +2650,10 @@ $$hostname$$ --> Hostname Ping - Ping 監視器 + Ping 監控 - Port 掃瞄器 + Port 掃描器 PowerShell @@ -2584,7 +2668,7 @@ $$hostname$$ --> Hostname SNMP - IP 子網路計算機 + 子網路計算器 TigerVNC @@ -2670,133 +2754,46 @@ $$hostname$$ --> Hostname 黃色 - + 鐵灰色 - + 一般 - - DNS 查閱 - - - HTTP 標頭 - - - IP 掃描器 - - - 網路介面 - - - Ping - - - Ping 監視器 - - - Port 掃瞄器 - - - PowerShell - - - PuTTY - - - 遠端桌面 - - - TigerVNC - - - 路徑追蹤 - - - 網路喚醒 - - - 網頁主控台 - - - Whois - - + 應用程式 - + 一般 - + 外觀 - + 自動啟動 - - 儀表板 - - - DNS 查閱 - - + 一般 - + 熱鍵 - - HTTP 標頭 - - - IP 掃描器 - - - 語系 - - - Ping 監視器 - - - Port 掃瞄器 + + 語言 - - PowerShell - - + 設定檔 - - PuTTY - - - 遠端桌面 - - + 設定 - - SNMP - - + 狀態 - - TigerVNC - - - 路徑追蹤 - - + 更新 - - 網路喚醒 - - - Whois - - + 視窗 @@ -2821,7 +2818,7 @@ $$hostname$$ --> Hostname SSH 原始記錄 - Session 記錄 + 會話記錄 SSH 記錄 @@ -2830,10 +2827,10 @@ $$hostname$$ --> Hostname SSH 和原始記錄 - 輸入有效的檔案名稱! + 輸入有效的檔案名稱! - 失敗 + 遺失 已接收 @@ -2842,210 +2839,204 @@ $$hostname$$ --> Hostname 狀態變更 - 有可用的更新! + 有可用的更新! 私密金鑰檔案 - Preview + 預覽 - Port profiles + 連接埠設定檔 - Add port profile + 新增連接埠設定檔 - Delete port profile + 刪除連接埠設定檔 - Edit port profile + 編輯連接埠設定檔 - The selected port profile will be deleted permanently. + 所選的連接埠設定檔將被永久刪除。 - Select port profile + 選擇連接埠設定檔 - Open port profiles... + 開啟連接埠設定檔... - Show SplashScreen on start + 啟動時顯示啟動畫面 - SplashScreen + 啟動畫面 - Download Microsoft Edge WebView2 Runtime + 下載 Microsoft Edge WebView2 Runtime - Microsoft Edge WebView2 Runtime is not available! + Microsoft Edge WebView2 Runtime 無法使用! - Frequency + 頻率 SSID - - Profile could not be loaded! + + 無法載入設定檔! - - If this happened after an update, you may need to migrate the profiles to a newer version. When you click "Migrate", a PowerShell window opens with the migration script. Check the path and press Enter. + + 設定檔無法載入,可能已損毀。您可以嘗試從備份還原該檔案或將其刪除。 -Otherwise, the profile may be corrupted and you want to report the issue on GitHub. +如果此情況在未預期時發生,或於更新後出現,請至 GitHub 報告錯誤。 + + +錯誤訊息: +「{0}」 - Edit group... + 編輯群組... - Decryption error + 解密錯誤 - Could not decrypt file. You may report this issue on GitHub. + 無法解密檔案。您可至 GitHub 報告此問題。 - Encryption error + 加密錯誤 - Could not encrpyt file. You may report this issue on GitHub. + 無法加密檔案。您可至 GitHub 報告此問題。 - Current password + 目前密碼 - New password + 新密碼 - Change master password + 更改主密碼 - Unlock profile + 解鎖設定檔 - Unlock the profile file to use the profiles! + 請先解鎖設定檔案才能使用設定檔! - Disclaimer + 免責聲明 - Merge - - - The destination folder already contains files. If you click Merge, the current profiles are copied to the folder. - - - Overwrite profiles in destination folder? - -"Overwrite" will copy the profile files to the destination folder and overwrite existing profile files. -"Merge" will copy the profile files to the destination folder, but won't overwrite exitsting profile files. -"Use other folder" will use the existing profile files in the destination folder. + 合併 使用其他 - Move - - - Profile files will be moved to the selected destination folder. + 移動 - Last scan at {0} + 上一次掃描時間:{0} - Hidden Network + 隱藏網路 - Developed and maintained by {0} with the help of the + 由 {0} 進行開發與維護,並在此感謝… - A Simple Public IP Address API + 簡易公共 IP 位址 API - AirspacePanel fixes all Airspace issues with WPF-hosted Winforms. + AirspacePanel 可解決在 WPF 主機中使用 WinForms 時所遇到的所有 Airspace 問題。 - Shared Controlz for WPF and ... more + 為 WPF 共享的 Controlz 和…更多 - DnsClient.NET is a simple yet very powerful and high performant open source library for the .NET Framework to do DNS lookups + DnsClient.NET 是一個簡潔而又強大、效能極佳的開源函式庫,為 .NET Framework 設計,可用於執行 DNS 查詢 - Dragable and tearable tab control for WPF + WPF 可拖曳與分離標籤控制項 - C# library take care of complex network, IP, IPv4, IPv6, netmask, CIDR, subnet, subnetting, supernet, and supernetting calculation for .NET developers. + 這是一個 C# 函式庫,為 .NET 開發者提供複雜網路、IP、IPv4 / IPv6、子網遮罩、CIDR、子網、分割子網、超網及其計算等功能。 - Simple, flexible, interactive & powerful charts, maps and gauges for .Net + 美觀且具互動性的圖表、地圖與儀表。 - A collection of loading indicators for WPF + WPF 載入指示器集合 - Some awesome icons for WPF and UWP all together... + WPF 與 UWP 統一套的優秀圖示集... - A toolkit for creating Metro / Modern UI styled WPF apps. + Metro / Modern UI 樣式 WPF 應用程式開發工具包。 - Json.NET is a popular high-performance JSON framework for .NET + Json.NET 是一款流行且極速的 JSON 框架,供 .NET 開發使用 - A GitHub API client library for .NET + 用於 .NET 的 GitHub API 客戶端函式庫 - Capture and parse CDP and LLDP packets on local or remote computers + 捕捉並解析本機或遠端電腦上的 CDP 與 LLDP 封包 - Sharp SNMP Library - Open Source SNMP for .NET and Mono + Sharp SNMP 函式庫 — 供 .NET 與 Mono 使用的開源 SNMP - A collection of all country flags in SVG + SVG 格式的全球國旗圖集。 - List of Top-Level-Domains from iana.org, which is used to query whois servers of the TLD from whois.iana.org via port 43 + 來自 iana.org 的頂級網域列表,用於從 whois.iana.org 通過連接埠 43 查詢各 TLD 的 whois 伺服器 + + + Natural Earth 向量地圖資料的 GeoJSON 轉換 (CC0-1.0)。 - Sanitized IEEE OUI Data from linuxnet.ca. + 來自 IEEE.org 的 OUI 資料。 - Service Name and Transport Protocol Port Number Registry from iana.org. + 由 iana.org 所維護之「服務名稱及傳輸協議埠號註冊表」。 - Apache License 2.0 + Apache 許可證 2.0 - BSD-2-Clause + BSD-2-條款 - MIT License + MIT 授權協議 - Unlicense + 未授權 - C#/WinRT provides packaged WinRT projection support for the C# language. + C#/WinRT 為 C# 語言提供打包好的 WinRT 投影支援 - Runtime for hosting PowerShell + PowerShell 主機執行環境 - The WebView2 control enables you to embed web technologies (HTML, CSS, and JavaScript) in your native applications powered by Microsoft Edge (Chromium). + WebView2 控制項允許您在本機應用程式中嵌入 Web 技術(HTML、CSS 和 JavaScript),並由 Microsoft Edge(Chromium)提供支援。 - Easily add interactivity to your apps using XAML Behaviors for WPF. + 使用 WPF 的 XAML 行為輕鬆為您的應用程式添加互動性。 - Microsoft WebView2 License + Microsoft WebView2 許可協議 - The current profile file is not encrypted and passwords will stored unencrypted on disk! + 目前的設定檔未加密,密碼將以純文字形式存放於磁碟上! -Enable profile file encryption in Settings>Profile to store credentials securely. +請至 設定 > Profile 啟用設定檔加密,以安全方式儲存憑證。 ICMPv4 @@ -3054,93 +3045,1452 @@ Enable profile file encryption in Settings>Profile to store credentials secur ICMPv6 - Check is disabled! + 檢查已停用! - Enter a valid IPv6 address! + 輸入有效的 IPv6 位址! - Public accessible IPv4 address. + 可通過 ICMP 連線的公開 IPv4 位址。 - Public accessible IPv6 address. + 可通過 ICMP 連線的公開 IPv6 位址。 - Public IPv4 address + 公開 IPv4 位址 - Public IPv6 address + 公開 IPv6 位址 - Use custom IPv6 address API + 使用自訂 IPv6 位址 API - Time to live + 存活時間 - Chassis Id + 機箱 Id - Management + 管理 - Device description + 裝置描述 - Port description + 連接埠描述 - Remove IPv4 address + 移除 IPv4 位址 - Additional config... + 額外設定... - Remove IPv4 address... + 移除 IPv4 位址… - The remote session ended because the total login time limit was reached. This limit is set by the server administrator or by network policies. + 遠端會話因達到總登入時長上限而結束。此限制由伺服器管理員或網路政策設定。 - Enter a valid hostname! + 輸入有效的主機名稱! - Enter a valid hostname and port! + 輸入有效的主機名稱與埠號! - Unable to reconnect to the remote session. + 無法重新連線至遠端會話。 - Migrate + 遷移 - Report on GitHub + 在 GitHub 上回報問題 - Groups + 群組 - Add group + 新增群組 - Delete group + 刪除群組 - Selected group and all profiles inside this group will be deleted permanently. + 所選的群組與其中所有設定檔將被永久刪除。 - The name is already used! + 此名稱已被使用! - Resize + 調整大小 - Delete profiles + 刪除設定檔 - Selected profiles will be deleted permanently. + 所選的設定檔將被永久刪除。 + + + 使用自訂主題 + + + 自訂主題 + + + 重設設定? + + + 已重設設定! + + + 實例編號 + + + 本地連線 + + + 本地介面 + + + log4net 是一款協助程式開發者將記錄輸出至多種目標的工具。 + + + 已啟用 + + + 區域 + + + 要同步的設定檔與區域 + + + 預設設定檔 + + + 預設區域 + + + 群組名稱不能以「{0}」開頭! + + + 檢查預發佈版本 + + + 同步已停用! + + + 命令 + + + 將主題套用至 PowerShell 主控台 + + + PowerShell 控制台的配色可以在「設定 > 一般 > 外觀」中,改成與應用程式主題相同。 + + + 若您啟用此選項,註冊表中 HKCU:\Console 下的預設 PowerShell 控制台設定將會被覆寫,以使 PowerShell 控制台視窗符合應用程式的主題。這是一個全域系統設定,可能會影響一般 PowerShell 視窗的外觀。 + +僅會修改在「PowerShell 設定」中配置的 PowerShell 控制台。同時支援 Windows PowerShell 與 PWSH(PowerShell 7 及以上版本)。 + +請點擊右上角的說明/文件按鈕(位於最小化按鈕左側)或前往 https://borntoberoot.net/NETworkManager/Documentation/Settings/Appearance 以瞭解更多詳細資訊。以下是將會被調整的相關文件數值。 + +若再次停用此選項,這些數值將不再進行修改。然而,原始數值並不會被恢復。 + + + 輸入不能以「;」結尾! + + + 輸入不包含任何文字! + + + 位元計算器 + + + 位元計算器 + + + 符號表記 + + + 輸入 + + + 單位 + + + 位元 + + + 十億位元 Gb + + + 十億位元組 GB + + + 千位元 Kb + + + 千位元組 KB + + + 百萬位元 Mb + + + 百萬位元組 MB + + + 千兆位元 Pb + + + 千兆位元組 PB + + + 兆位元 Tb + + + 兆位元組 TB + + + 輸入一個數值並選擇單位以進行單位換算… + + + 網路 + + + 代理 + + + 為此主機解析 IP 位址(首選 IPv4)。 + + + 有效的 PowerShell 路徑必須以「pwsh.exe」或「powershell.exe」結尾! + + + 有效的 PuTTY 路徑必須以「PuTTY.exe」結尾! + + + 有效的 TigerVNC 路徑必須以「vncviewer-*.exe」或「vncviewer64-*.exe」結尾! + + + SNTP 查詢 + + + 將 .NET Framework / .NET Core 應用程式的執行元件及其相依套件搬到子目錄中,提升結構整潔與外觀。 + + + 新增一個分頁以執行 SNTP 查詢…… + + + SNTP 伺服器(s) + + + 可透過 HTTP/HTTPS 訪問、且回傳 IPv6 位址「如 xxxx:xx:xxx::xx」的網路服務 URL。 + + + IP 終端點 + + + 本地結束時間 + + + 本地開始時間 + + + 網路時間 + + + 偏移 + + + 往返延遲 + + + 伺服器 + + + SNTP 查詢 + + + 新增 SNTP 伺服器 + + + 刪除 SNTP 伺服器 + + + 所選的 SNTP 伺服器將被永久刪除。 + + + 編輯 SNTP 伺服器 + + + 已存在此名稱的 SNTP 伺服器! + + + 輸入有效的主機名稱(例如 server-01 或 example.com),或是有效的 IP 位址(例如 192.168.178.1)。 + + + 伺服器(數) + + + 輸入主密碼以解鎖設定檔: + + + 解鎖設定檔案 + + + 逾時 + + + 主機金鑰 + + + 設定將被重設,之後程式會重新啟動! + + + 設定已經重設! + + + Ping 狀態 + + + 執行緒池額外最小執行緒數。 + + + 此設定指定應用程式 ThreadPool 在需要時所產生的最小執行緒數。對於 IP 掃描器或埠掃描器等功能,調整此值可提升效能。 + +此值會加到預設的「最小執行緒」上(即 CPU 執行緒數)。設為 0 時使用系統預設設定。若該值高於 ThreadPool 的預設最大執行緒,則以此值作為最大值。 + +過度調整可能會造成效能下降。 + +更改後需重新啟動程式才能生效;是否成功設定可在 %LocalAppData%\NETworkManager\NETworkManager.log 中查閱。 + + + 此設定僅調整每個主機/埠掃描時同時執行的最大執行緒數。請至 設定 > 一般 > 一般,調整應用程式的(最小)執行緒數。 + + + 連接埠狀態 + + + Ping 詳情 + + + 未發現開啟的連接埠! + + + 連接埠掃描已被停用! + + + 掃描連接埠 + + + 未能找到「{0}」此應用程式。也許該項目已被隱藏於設定內? + + + 狀態視窗 + + + 顯示地址列 + + + 不建議啟用此設定。多個程式實例會共用相同的設定與使用者檔;最後關閉的實例可能覆蓋其他實例所作的更改。 + + + 本機位址的繞過 + + + 啟用閘道伺服器 + + + 登入方式 + + + 閘道伺服器 + + + 伺服器名稱 + + + 與遠端電腦共用網關憑證。 + + + 允許我稍後再選擇 + + + 智慧卡或 Windows Hello 商業版 + + + 請求密碼(NTLM) + + + 使用網關憑證。 + + + 由於遠端桌面閘道伺服器暫時無法使用,您的電腦無法連線至遠端主機。請稍後再試或聯絡網路管理員尋求協助。 + + + 您的電腦無法連線至遠端主機,原因可能為下列之一:1) 請求的遠端桌面閘道伺服器位址與其 SSL 憑證主旨名稱不符。2) 憑證已過期或被吊銷。3) 根憑證機構不信任該憑證。 請聯絡網路管理員以獲得協助。 + + + 此電腦無法驗證 RD Gateway "" 的身份。連線至無法確認身分的伺服器並不安全,請聯絡網路管理員以獲得協助。 + + + 您的電腦無法連線至遠端主機,因為請求的遠端桌面閘道伺服器位址與憑證主旨名稱不符。請聯絡網路管理員以獲得協助。 + + + 您的電腦無法連線至遠端主機,因為遠端桌面閘道伺服器的憑證已過期或被吊銷。請聯絡網路管理員以獲得協助。 + + + 發送資料至遠端桌面閘道伺服器時出錯。伺服器暫時無法使用,或網路連線中斷。請稍後重試,或聯絡網路管理員以獲得協助。 + + + 從遠端桌面閘道伺服器接收資料時發生錯誤。伺服器可能暫時無法使用,或網路連線中斷。請稍後再試,或聯絡網路管理員以獲得協助。 + + + 您的電腦無法連線至遠端主機,因為遠端桌面閘道伺服器位址不可達或不正確。輸入有效的遠端桌面閘道伺服器位址。 + + + 由於遠端桌面閘道伺服器資源不足,暫時無法使用,您的電腦無法連線至遠端主機。請稍後再試或聯絡網路管理員以獲得協助。 + + + 遠端桌面閘道伺服器已終止連線。請稍後再嘗試重新連線,或聯絡網路管理員以獲得協助。 + + + 遠端桌面閘道伺服器的管理員已終止連線。請稍後再嘗試重新連線,或聯絡網路管理員以獲得協助。 + + + 遠端桌面無法連線至 "" 主機,原因可能為下列之一:1) 您的帳號不在 RD 閘道的授權清單中。2) 您以 NetBIOS 格式(如 computer1)指定了遠端主機,但 RD 閘道預期使用 FQDN 或 IP 位址格式(例如 computer1.fabrikam.com 或 157.60.0.1)。 請聯絡網路管理員以獲得協助。 + + + 遠端桌面無法連線至 "" 主機,原因可能為下列之一:1) 您的帳號未被授權存取 RD 閘道 ""。2) 您的電腦未被授權存取 RD 閘道 ""。3) 您使用了不相容的驗證方式(例如,RD 閘道可能要求智慧卡,但您提供的是密碼)。 請聯絡網路管理員以獲得協助。 + + + 您的電腦無法連線至遠端主機,因為網路管理員已限制存取此 RD 閘道伺服器。請聯絡網路管理員以獲得協助。 + + + 您的電腦無法連線至遠端主機,因為網頁代理伺服器需要驗證。若要允許未經驗證的流量透過網頁代理到 RD 閘道伺服器,請聯絡網路管理員。 + + + 由於遠端桌面閘道伺服器已達到允許的最大連線數,您的電腦無法連線至遠端主機。請稍後再試或聯絡網路管理員以獲得協助。 + + + 您的電腦無法連線至遠端主機,因為遠端桌面閘道伺服器不支援此請求。請聯絡網路管理員以獲得協助。 + + + 您的電腦無法連線至遠端主機,因為客戶端不支援遠端桌面閘道的某項功能。請聯絡網路管理員以獲得協助。 + + + 您的電腦無法連線至遠端主機,因為遠端桌面閘道伺服器與此電腦不相容。請聯絡網路管理員以獲得協助。 + + + 您的電腦無法連線至遠端主機,因為在遠端桌面閘道伺服器上未設定任何憑證可供使用。請聯絡網路管理員以獲得協助。 + + + 您的電腦無法連線至遠端主機,因為您嘗試存取的 RD 閘道伺服器未被此電腦管理員允許。若您是該管理員,請將此遠端桌面閘道伺服器名稱加入電腦上「受信任的遠端桌面閘道伺服器」清單,再重新嘗試連線。 + + + 您的電腦無法連線至遠端主機,因為您的電腦或裝置未符合網路存取保護設定的要求,原因可能為下列之一:1) RD 閘道伺服器名稱與其公開金鑰憑證主旨不符。2) 憑證已過期或被吊銷。3) 根憑證機構不信任該憑證。4) 憑證關鍵延伸不支援加密。5) 您的電腦無法驗證憑證撤銷清單。 請聯絡網路管理員以獲得協助。 + + + 您的電腦無法連線至遠端主機,因為需使用帳號與密碼以驗證至 RD 閘道伺服器,而非智慧卡憑證。 + + + 您的電腦無法連線至遠端主機,因為需要使用智慧卡憑證以驗證至 RD 閘道伺服器,而非帳號與密碼。 + + + 您的電腦無法連線至遠端主機,因為送往 RD 閘道伺服器的 Cookie 無效。請聯絡網路管理員以獲得協助。 + + + 您的電腦無法連線至遠端主機,因為 RD 閘道伺服器拒絕了 Cookie。請聯絡網路管理員以獲得協助。 + + + 您的電腦無法連線至遠端主機,因為 RD 閘道伺服器預期的驗證方式與您所使用的不符。請聯絡網路管理員以獲得協助。 + + + RD 閘道連線已結束,原因是周期性使用者驗證失敗。請重新以正確的帳號與密碼進行連線;若仍無法成功,請聯絡網路管理員進一步協助。 + + + RD 閘道連線已結束,原因是周期性使用者授權失敗。請重新以正確的帳號與密碼進行連線;若仍無法成功,請聯絡網路管理員進一步協助。 + + + 您的電腦無法連線至遠端主機,因為 RD 閘道與遠端主機未能交換政策。可能的原因包括: 1. 遠端主機不支援與 RD 閘道交換政策。 2. 遠端主機設定不允許建立新連線。 3. RD 閘道與遠端主機之間的連線已中斷。 請聯絡網路管理員以獲得協助。 + + + RD 閘道連線已結束,原因是周期性使用者授權失敗。您的電腦或裝置未符合網路存取保護(NAP)設定的要求。請聯絡網路管理員以獲得協助。 + + + 已連接 + + + 掃描 WiFi 介面「{0}」時發生錯誤:「{1}」。 + + + 連接… + + + {0}已斷開連線! + + + 連接至{0} + + + WPS + + + 自動連線 + + + 預共享金鑰 + + + 正在連接到 {0}… + + + 無法連接到 {0}({1})! + + + 已成功連接到 {0}! + + + 已撤銷對網路的存取權限 + + + 無效憑證 + + + 網路不可用 + + + 成功 + + + 連線嘗試逾時 + + + -/- + + + 不支援此驗證協定! + + + 正在檢查 WPS... + + + 開啟 OID 設定檔… + + + MIB + + + OID 設定檔 + + + 選擇 OID 設定檔 + + + 新增 OID 設定檔 + + + 刪除 OID 設定檔 + + + 所選的 OID 設定檔將被永久刪除。 + + + 編輯 OID 設定檔 + + + 輸入密碼... + + + 新增標籤 + + + (從設定檔) + + + 新子網遮罩 + + + 新增伺服器 + + + SNTP 伺服器 + + + 此頁面的設定有錯誤。請先更正,以便能夠儲存。 + + + SSH 主機金鑰(如 71:b8:f2:6e...) 只能於「SSH」模式下使用。 + + + 私鑰檔案的完整路徑(如 C:\Users\BornToBeRoot\SSH\private_key.ppk) 僅於「SSH」模式下可使用。 + + + PuTTY 會話所使用的帳號。僅於「SSH」、「Telnet」或「Rlogin」模式下可設定。 + + + ASN + + + 自治系統名稱 + + + 城市 + + + 大陸 + + + 國家 + + + 貨幣 + + + 行政區 + + + DNS 解析器 + + + EDNS + + + 地理位置定位 + + + 託管 + + + IP 地理位置定位 + + + ISP + + + 緯度 + + + 經度 + + + 行動 + + + 機構 + + + PTR 記錄 + + + 時區 + + + 郵遞區號 + + + IP 地理位置定位 API — 快速、精確、可靠 + + + 檢查 DNS 解析器 + + + 檢查 IP 地理位置定位 + + + 顯示地圖 + + + DNS 解析器由 ip‑api.com 決定。 + +網址:https://edns.ip-api.com/ + + + IP 地理位置定位是透過 ip‑api.com 確定的。 + +網址:http://ip-api.com/ + + + 為提供額外功能,我會使用第三方服務,並非由我運營。您可以在下方取消選取它們。我永遠不會將任何資料傳送給我。 + + + 正在檢查 DNS 解析器... + + + 正在檢查 IP 地理位置定位… + + + 請檢查您的網路連線,稍後再嘗試幾秒鐘。 + + + 已超過 ip‑api.com 的速率上限(來自您所在網路的請求數量過多)。 +請等候數秒後再重試。 + + + HTTP 狀態碼 + + + 鐵灰色 + + + 已達到速率限制!請在 {0} 秒後重試… + + + 一般 + + + BSSID + + + 未發現可連線的主機! + + + 應用程式 + + + 啟用實驗功能以測試新功能。這些尚未完成,可能含錯誤、可能導致應用程式崩潰,並且在正式發佈前可能再次更改。 + + + 實驗性功能 + + + 實驗性 + + + 執行指令... + + + IP 地理位置定位 + + + 新增一個分頁以查詢 IP 地理位置… + + + 輸入要查詢 WhoIs 的網域名稱... + + + 輸入要查詢 IP 地理位置的主機名稱... + + + 未知的使用者名稱。 + + + 驗證失敗(密碼、社群或金鑰不正確)。 + + + 操作成功,未發生任何錯誤。 + + + 您的請求回應內容過大,無法一次完整顯示! + + + 所請求的 OID 無法找到! + + + 一個可讀寫或僅可寫的物件被設定為不一致的值! + + + 所請求的 OID 不存在且不可寫入! + + + 發生了無法提供具體訊息的錯誤! + + + 所請求的對象不可被修改! + + + 該物件被設定為不相容的資料型別! + + + 所設定的值超過物件允許的最大長度! + + + 物件使用的編碼不正確! + + + 所設定的值不是有效選項! + + + 所請求的物件不存在且無法建立! + + + MIB 變數目前處於不一致狀態,無法進行修改! + + + 目前尚無足夠系統資源以完成此項操作! + + + 目前尚無足夠系統資源以完成此項操作! + + + 設定操作失敗,且無法還原至之前的狀態! + + + 驗證失敗,請確認社區字串是否正確! + + + 所請求的對象不可寫入,無法進行修改! + + + 物件狀態不一致,導致設定操作失敗! + + + 關閉全部 + + + 展開主機檢視 + + + 展開地圖檢視 + + + 在其他主機正在被加入時,無法設定此主機。請等候流程完成後再試一次。 + + + 未找到符合的命令! + + + 遠端主機名稱 + + + 進程 ID + + + 進程路徑 + + + 進程名稱 + + + NetBIOS + + + 電腦名稱 + + + 錯誤 + + + 確定 + + + 警告 + + + 群組 / 網域 + + + 可達的 NetBIOS + + + 掃描 NetBIOS + + + NetBIOS 掃描已停用! + + + 解析主機名稱已停用! + + + 解析 MAC 位址已停用! + + + 關閉群組 + + + 執行指令... (Ctrl+Shift+P) + + + 設定檔案 + + + 打開設定 + + + 展開並打開搜尋功能... + + + 自 Windows 11 24H2 起,您需要允許對 Wi‑Fi 介面卡的存取。 + +開啟 Windows 設定 > 隱私與安全性 > 位置,將桌面應用程式 / NETworkManager 的存取權限打勾,重新啟動本程式。 + + + 將程式拖曳至重新排序。 +右鍵單擊即可查看其他選項。 + + + 恢復預設值 + + + 一個易於使用的拖曳式框架,適用於 WPF。 + + + BSD-3-條款 + + + 設定為預設 + + + 在 Ubuntu Server 上執行 Docker,搭配 Nextcloud 與 Traefik… + + + 執行於 AWS 的 Linux 伺服器... + + + 6 GHz + + + 透過捐贈來支援此專案。 + + + 打開文件 + + + 捐贈 + + + 設定檔案 + + + 主機檔編輯器 + + + 主機檔編輯器 + + + 只讀模式。修改 hosts 檔案需要提升權限! + + + 開啟 hosts 檔案 + + + 註解 + + + 停用 + + + 編輯項目 + + + 編輯項目... + + + 啟用項目 + + + 停用項目 + + + 重新整理中... + + + 重新載入於{0} + + + 無法載入 hosts 檔案:{0} + + + 將於 {0} 秒後重試... + + + 有什麼新功能? + + + 變更記錄 + + + 升級至 {0} + + + 此版本包含新功能、改進及錯誤修正。請檢閱更新日誌以取得完整資訊! + + + 項目 + + + 所選項目已永久刪除: + +{0}{1}{2} + + + 主要 DNS 伺服器 + + + 輸入有效的主機名稱(如 server-01 或 example.com)!若有多個主機名稱,請以空格分隔。 + + + 無法閱讀「hosts」檔案!請參閱記錄檔以獲得更詳細資訊。 + + + 無法將資料寫入「hosts」檔案!請參閱記錄檔以取得更詳細資訊。 + + + 在「hosts」檔案中未找到此項目!可能是檔案已被更動。 + + + 無法建立「hosts」檔案的備份!請參閱記錄檔以取得更詳細資訊。 + + + 顯示狀態列 + + + 當滑鼠懸停在連結上時,在 WebView 的左下角顯示狀態列。 + + + 儲存憑證 + + + 在成功登入後顯示對話框以儲存憑證。 + + + 刪除瀏覽資料 + + + 永久刪除當前 WebView2 配置檔中的瀏覽資料(歷史紀錄、Cookies、快取、憑證等)。 + + + 瀏覽資料 + + + 瀏覽資料已成功刪除! + + + 刪除瀏覽資料時發生錯誤。歡迎在 GitHub 上回報此問題。 + + + 生產 + + + 新增標籤 + + + 套用篩選 + + + 篩選設定檔... + + + 依標籤篩選 + + + 找不到標籤! + + + 匹配 + + + 任何 + + + 新增群組... + + + 擴展全部 + + + 全部摺疊 + + + 使用自定義主題來個性化應用程式的外觀。您可以在「程式資料夾 > 主題」目錄中編輯或新增主題。更多詳情請參閱文件。 + + + 管理員 (控制台) 工作階段 + + + 「{0}」設定檔將被永久刪除。 + + + 啟用加密? + + + 您是否想要啟用設定檔加密,以保護主機、IP 位址、URL 以及儲存的憑證等敏感資料? + +您可以隨時透過右鍵點擊設定檔來管理加密設定,進而開啟或關閉加密。 +如果您點擊「取消」,該設定檔將維持未加密狀態。 + + + 必須重新啟動才能套用語言設定等變更。 + + + 無法解析或連線至任何指定的 DNS 伺服器。 + + + 無法解析「{0}」。 + + + 最大備份數量 + + + 建立每日備份 + + + 在刪除最舊的備份前所保留的備份數量。 + + + 此設定由您的管理員管理。 + + + 還原預設位置 + + + 還原 + + + 還原預設位置? + + + 預設設定位置已還原,且應用程式隨後會重新啟動。 + +如有需要,您可以將「settings.json」檔案從「{0}」複製到「{1}」以遷移先前的設定。在此過程中必須關閉應用程式,以防止設定被覆寫。 + + + 更改位置? + + + 設定位置已更改,且應用程式隨後會重新啟動。 + +如有需要,您可以將「settings.json」檔案從「{0}」複製到「{1}」以遷移先前的設定。在此過程中必須關閉應用程式,以防止設定被覆寫。 + + + 請輸入有效的資料夾路徑! + + + 設定檔位置已更改,且應用程式隨後會重新啟動。 + +如有需要,您可以將現有的設定檔從「{0}」複製到「{1}」以遷移您的設定檔。在此過程中必須關閉應用程式,以防止設定檔被覆寫。 + + + 預設設定檔位置已還原,且應用程式隨後會重新啟動。 + +如有需要,您可以將現有的設定檔從「{0}」複製到「{1}」以遷移您的設定檔。在此過程中必須關閉應用程式,以防止設定檔被覆寫。 + + + 網路連線 + + + 網路狀態 + + + Active Directory 匯入失敗。 + + + 選項 + + + + 使用您目前的 Windows 憑證從 Active Directory 讀取資料。該帳戶必須獲准列舉搜尋基底(子樹)下的電腦物件。 + + + 搜尋基底(DN) + + + 額外 LDAP 篩選器 + + + 篩選器必須是有效的 LDAP 表達式,且須以 '(' 開頭並以 ')' 結尾。 + + + 搜尋基底必須是有效的 LDAP 辨別名稱(例如:DC=example,DC=com)。 + + + 已於{0} 從 Active Directory 匯入 + + + 在指定的搜尋基底與篩選條件下,找不到電腦。 + + + 正在搜尋 Active Directory... + + + 如果您的電腦未加入網域,請指定網域控制器(主機名稱或 IP),並使用自定義憑證。 + + + 伺服器(選填) + + + 連接埠(選填) + + + 使用 SSL (LDAPS) + + + 使用目前的 Windows 憑證 + + + 使用這些憑證 + + + 進階設定 + + + 全選 + + + 取消全選 + + + 啟用於 + + + 跳過已匯入的項目 + + + {0}· {1}結果(s) + + + {0}已匯入設定檔(s)。 +{1}跳過重複項目。 +{2}因缺少主機而跳過。 + + + Active Directory + + + CSV 檔案 + + + CSV 檔案 + + + 從 CSV 檔案匯入設定檔 + + + 從 CSV 檔案於{0}匯入 + + + CSV 檔案中找不到任何條目。 + + + 預期的 CSV 格式 — 每行一個設定檔: + + + 標題列與分隔符號(分號、逗號或 Tab)將自動偵測。描述欄位為選填。不含主機資訊的條目無法匯入。 + + + 匯入結果 + + + 新增 + + + 已匯入 + + + 無主機 + + + 排除已停用的帳戶 + + + 從 Active Directory 匯入電腦 + + + 從 Active Directory 匯入電腦... + + + 匯入設定檔 + + + 來源 + + + Active Directory + + + 設定檔群組 + + + 現有或新的群組名稱 + + + 防火牆 + + + 防火牆規則 + + + Windows 防火牆設定 + + + 方向 + + + 輸入 + + + 外流 + + + 動作 + + + 允許 + + + 封鎖 + + + 網路設定檔 + + + 網路設定檔 + + + 介面類型 + + + 無法載入防火牆規則。{0} + + + 所選的防火牆規則已被永久刪除: + +{0} + + + 任何 + + + TCP + + + UDP + + + ICMPv4 + + + ICMPv6 + + + HOPOPT + + + GRE + + + IPv6 + + + IPv6 路由 + + + IPv6 分段 + + + IPv6 無下一跳 + + + IPv6 選項 + + + VRRP + + + PGM + + + L2TP + + + 任何 + + + 有線網路 + + + 無線網路 + + + 遠端存取 + + + 唯讀模式。若要修改防火牆規則,需要提升權限! + + + 輸入 + + + 外流 + + + 封鎖 + + + 允許 + + + 本機連接埠 + + + 遠端連接埠 + + + 本機 IP 位址 + + + 遠端 IP 位址 + + + 請輸入有效的 IP 位址、子網路(例如 10.0.0.0/8)、範圍(例如 10.0.0.1-10.0.0.10)或關鍵字(Any, LocalSubnet, DNS, DHCP, WINS, DefaultGateway, Internet, Intranet, IntranetRemoteAccess, PlayToDevice, CaptivePortal)。 + + + 新增規則 + + + 新增規則... + + + 編輯規則 + + + 編輯規則... + + + 刪除規則 + + + 啟用規則 + + + 停用規則 + + + 匯入設定檔... + + + 速度測試 + + + 執行速度測試 + + + 正在擷取中繼資料... + + + 正在測量延遲... + + + 正在測量下載速度... + + + 正在測量上傳速度... + + + 使用 speed.cloudflare.com 測量下載、上傳速度、延遲與抖動。 +Cloudflare 可能會記錄您的 IP 位址與網路資訊。詳情請參閱 Cloudflare 的隱私權政策。 + + + 延遲 + + + 抖動 + + + 用於測量下載、上傳速度、延遲與抖動的速度測試服務。 - - Unlock the profile file to add, change or delete a profile! + + 停止 diff --git a/Source/NETworkManager.Localization/Translators/AccentTranslator.cs b/Source/NETworkManager.Localization/Translators/AccentTranslator.cs deleted file mode 100644 index 132794fd09..0000000000 --- a/Source/NETworkManager.Localization/Translators/AccentTranslator.cs +++ /dev/null @@ -1,29 +0,0 @@ -using NETworkManager.Models.Appearance; -using NETworkManager.Utilities; - -namespace NETworkManager.Localization.Translators -{ - - /// - /// Class to translate . - /// - public class AccentTranslator : SingletonBase, ILocalizationStringTranslator - { - /// - /// Constant to identify the strings in the language files. - /// - private const string _identifier = "Accent_"; - - /// - /// Method to translate . - /// - /// as . - /// Translated . - public string Translate(string value) - { - var translation = Resources.Strings.ResourceManager.GetString(_identifier + value, LocalizationManager.GetInstance().Culture); - - return string.IsNullOrEmpty(translation) ? value : translation; - } - } -} \ No newline at end of file diff --git a/Source/NETworkManager.Localization/Translators/ApplicationNameTranslator.cs b/Source/NETworkManager.Localization/Translators/ApplicationNameTranslator.cs deleted file mode 100644 index 061888b2f4..0000000000 --- a/Source/NETworkManager.Localization/Translators/ApplicationNameTranslator.cs +++ /dev/null @@ -1,38 +0,0 @@ -using NETworkManager.Models; -using NETworkManager.Utilities; - -namespace NETworkManager.Localization.Translators -{ - /// - /// Class to translate . - /// - public class ApplicationNameTranslator : SingletonBase, ILocalizationStringTranslator - { - /// - /// Constant to identify the strings in the language files. - /// - private const string _identifier = "ApplicationName_"; - - /// - /// Method to translate . - /// - /// as . - /// Translated . - public string Translate(string value) - { - var translation = Resources.Strings.ResourceManager.GetString(_identifier + value, LocalizationManager.GetInstance().Culture); - - return string.IsNullOrEmpty(translation) ? value : translation; - } - - /// - /// Method to translate . - /// - /// . - /// Translated . - public string Translate(ApplicationName name) - { - return Translate(name.ToString()); - } - } -} \ No newline at end of file diff --git a/Source/NETworkManager.Localization/Translators/ConnectionStateTranslator.cs b/Source/NETworkManager.Localization/Translators/ConnectionStateTranslator.cs deleted file mode 100644 index 941ffdabc8..0000000000 --- a/Source/NETworkManager.Localization/Translators/ConnectionStateTranslator.cs +++ /dev/null @@ -1,38 +0,0 @@ -using NETworkManager.Models.Network; -using NETworkManager.Utilities; - -namespace NETworkManager.Localization.Translators -{ - /// - /// Class to translate . - /// - public class ConnectionStateTranslator : SingletonBase, ILocalizationStringTranslator - { - /// - /// Constant to identify the strings in the language files. - /// - private const string _identifier = "ConnectionState_"; - - /// - /// Method to translate . - /// - /// as . - /// Translated . - public string Translate(string value) - { - var translation = Resources.Strings.ResourceManager.GetString(_identifier + value, LocalizationManager.GetInstance().Culture); - - return string.IsNullOrEmpty(translation) ? value : translation; - } - - /// - /// Method to translate . - /// - /// . - /// Translated . - public string Translate(ConnectionState connectionState) - { - return Translate(connectionState.ToString()); - } - } -} diff --git a/Source/NETworkManager.Localization/Translators/DiscoveryProtocolTranslator.cs b/Source/NETworkManager.Localization/Translators/DiscoveryProtocolTranslator.cs deleted file mode 100644 index 12ac251ee6..0000000000 --- a/Source/NETworkManager.Localization/Translators/DiscoveryProtocolTranslator.cs +++ /dev/null @@ -1,38 +0,0 @@ -using NETworkManager.Models.Network; -using NETworkManager.Utilities; - -namespace NETworkManager.Localization.Translators -{ - /// - /// Class to translate . - /// - public class DiscoveryProtocolTranslator : SingletonBase, ILocalizationStringTranslator - { - /// - /// Constant to identify the strings in the language files. - /// - private const string _identifier = "DiscoveryProtocolIdentifier_"; - - /// - /// Method to translate . - /// - /// . - /// Translated . - public string Translate(string value) - { - var translation = Resources.Strings.ResourceManager.GetString(_identifier + value, LocalizationManager.GetInstance().Culture); - - return string.IsNullOrEmpty(translation) ? value : translation; - } - - /// - /// Method to translate . - /// - /// . - /// Translated . - public string Translate(DiscoveryProtocol.Protocol discoveryProtocol) - { - return Translate(discoveryProtocol.ToString()); - } - } -} diff --git a/Source/NETworkManager.Localization/Translators/GroupViewNameTranslator.cs b/Source/NETworkManager.Localization/Translators/GroupViewNameTranslator.cs deleted file mode 100644 index 8b5477bad0..0000000000 --- a/Source/NETworkManager.Localization/Translators/GroupViewNameTranslator.cs +++ /dev/null @@ -1,39 +0,0 @@ -using NETworkManager.Profiles; -using NETworkManager.Utilities; - -namespace NETworkManager.Localization.Translators -{ - /// - /// Class to translate . - /// - public class GroupViewNameTranslator : SingletonBase, ILocalizationStringTranslator - { - /// - /// Constant to identify the strings in the language files. - /// For groups this is the same identifier as for the profiles. - /// - private const string _identifier = "ProfileViewName_"; - - /// - /// Method to translate . - /// - /// as . - /// Translated . - public string Translate(string value) - { - var translation = Resources.Strings.ResourceManager.GetString(_identifier + value, LocalizationManager.GetInstance().Culture); - - return string.IsNullOrEmpty(translation) ? value : translation; - } - - /// - /// Method to translate . - /// - /// . - /// Translated . - public string Translate(GroupViewName name) - { - return Translate(name.ToString()); - } - } -} \ No newline at end of file diff --git a/Source/NETworkManager.Localization/Translators/IPStatusTranslator.cs b/Source/NETworkManager.Localization/Translators/IPStatusTranslator.cs deleted file mode 100644 index 6920da1459..0000000000 --- a/Source/NETworkManager.Localization/Translators/IPStatusTranslator.cs +++ /dev/null @@ -1,38 +0,0 @@ -using NETworkManager.Utilities; -using System.Net.NetworkInformation; - -namespace NETworkManager.Localization.Translators -{ - /// - /// Class to translate . - /// - public class IPStatusTranslator : SingletonBase, ILocalizationStringTranslator - { - /// - /// Constant to identify the strings in the language files. - /// - private const string _identifier = "IPStatus_"; - - /// - /// Method to translate . - /// - /// . - /// Translated . - public string Translate(string value) - { - var translation = Resources.Strings.ResourceManager.GetString(_identifier + value, LocalizationManager.GetInstance().Culture); - - return string.IsNullOrEmpty(translation) ? value : translation; - } - - /// - /// Method to translate . - /// - /// . - /// Translated . - public string Translate(IPStatus ipStatus) - { - return Translate(ipStatus.ToString()); - } - } -} diff --git a/Source/NETworkManager.Localization/Translators/PortStateTranslator.cs b/Source/NETworkManager.Localization/Translators/PortStateTranslator.cs deleted file mode 100644 index e1387cc9d9..0000000000 --- a/Source/NETworkManager.Localization/Translators/PortStateTranslator.cs +++ /dev/null @@ -1,38 +0,0 @@ -using NETworkManager.Models.Network; -using NETworkManager.Utilities; - -namespace NETworkManager.Localization.Translators -{ - /// - /// Class to translate . - /// - public class PortStateTranslator : SingletonBase, ILocalizationStringTranslator - { - /// - /// Constant to identify the strings in the language files - /// - private const string _identifier = "PortState_"; - - /// - /// Method to translate . - /// - /// . - /// Translated . - public string Translate(string value) - { - var translation = Resources.Strings.ResourceManager.GetString(_identifier + value, LocalizationManager.GetInstance().Culture); - - return string.IsNullOrEmpty(translation) ? value : translation; - } - - /// - /// Method to translate . - /// - /// . - /// Translated . - public string Translate(PortState portState) - { - return Translate(portState.ToString()); - } - } -} diff --git a/Source/NETworkManager.Localization/Translators/ProfileViewNameTranslator.cs b/Source/NETworkManager.Localization/Translators/ProfileViewNameTranslator.cs deleted file mode 100644 index 35a50dc440..0000000000 --- a/Source/NETworkManager.Localization/Translators/ProfileViewNameTranslator.cs +++ /dev/null @@ -1,38 +0,0 @@ -using NETworkManager.Profiles; -using NETworkManager.Utilities; - -namespace NETworkManager.Localization.Translators -{ - /// - /// Class to translate . - /// - public class ProfileViewNameTranslator : SingletonBase, ILocalizationStringTranslator - { - /// - /// Constant to identify the strings in the language files. - /// - private const string _identifier = "ProfileViewName_"; - - /// - /// Method to translate . - /// - /// as . - /// Translated . - public string Translate(string value) - { - var translation = Resources.Strings.ResourceManager.GetString(_identifier + value, LocalizationManager.GetInstance().Culture); - - return string.IsNullOrEmpty(translation) ? value : translation; - } - - /// - /// Method to translate . - /// - /// . - /// Translated . - public string Translate(ProfileViewName name) - { - return Translate(name.ToString()); - } - } -} \ No newline at end of file diff --git a/Source/NETworkManager.Localization/Translators/PuTTYLogModeTranslator.cs b/Source/NETworkManager.Localization/Translators/PuTTYLogModeTranslator.cs deleted file mode 100644 index 08f195959a..0000000000 --- a/Source/NETworkManager.Localization/Translators/PuTTYLogModeTranslator.cs +++ /dev/null @@ -1,38 +0,0 @@ -using NETworkManager.Models.PuTTY; -using NETworkManager.Utilities; - -namespace NETworkManager.Localization.Translators -{ - /// - /// Class to translate . - /// - public class PuTTYLogModeTranslator : SingletonBase, ILocalizationStringTranslator - { - /// - /// Constant to identify the strings in the language files. - /// - private const string _identifier = "PuTTYLogMode_"; - - /// - /// Method to translate . - /// - /// . - /// Translated . - public string Translate(string value) - { - var translation = Resources.Strings.ResourceManager.GetString(_identifier + value, LocalizationManager.GetInstance().Culture); - - return string.IsNullOrEmpty(translation) ? value : translation; - } - - /// - /// Method to translate . - /// - /// . - /// Translated . - public string Translate(LogMode logMode) - { - return Translate(logMode.ToString()); - } - } -} \ No newline at end of file diff --git a/Source/NETworkManager.Localization/Translators/RemoteDesktopAudioCaptureRedirectionModeTranslator.cs b/Source/NETworkManager.Localization/Translators/RemoteDesktopAudioCaptureRedirectionModeTranslator.cs deleted file mode 100644 index 9c780ad4ed..0000000000 --- a/Source/NETworkManager.Localization/Translators/RemoteDesktopAudioCaptureRedirectionModeTranslator.cs +++ /dev/null @@ -1,38 +0,0 @@ -using NETworkManager.Models.RemoteDesktop; -using NETworkManager.Utilities; - -namespace NETworkManager.Localization.Translators -{ - /// - /// Class to translate . - /// - public class RemoteDesktopAudioCaptureRedirectionModeTranslator : SingletonBase, ILocalizationStringTranslator - { - /// - /// Constant to identify the strings in the language files. - /// - private const string _identifier = "RemoteDesktopAudioCaptureRedirectionMode_"; - - /// - /// Method to translate . - /// - /// . - /// Translated . - public string Translate(string value) - { - var translation = Resources.Strings.ResourceManager.GetString(_identifier + value, LocalizationManager.GetInstance().Culture); - - return string.IsNullOrEmpty(translation) ? value : translation; - } - - /// - /// Method to translate . - /// - /// . - /// Translated . - public string Translate(AudioCaptureRedirectionMode audioCaptureRedirectionMode) - { - return Translate(audioCaptureRedirectionMode.ToString()); - } - } -} \ No newline at end of file diff --git a/Source/NETworkManager.Localization/Translators/RemoteDesktopAudioRedirectionModeTranslator.cs b/Source/NETworkManager.Localization/Translators/RemoteDesktopAudioRedirectionModeTranslator.cs deleted file mode 100644 index 5fec98edc9..0000000000 --- a/Source/NETworkManager.Localization/Translators/RemoteDesktopAudioRedirectionModeTranslator.cs +++ /dev/null @@ -1,38 +0,0 @@ -using NETworkManager.Models.RemoteDesktop; -using NETworkManager.Utilities; - -namespace NETworkManager.Localization.Translators -{ - /// - /// Class to translate . - /// - public class RemoteDesktopAudioRedirectionModeTranslator : SingletonBase, ILocalizationStringTranslator - { - /// - /// Constant to identify the strings in the language files. - /// - private const string _identifier = "RemoteDesktopAudioRedirectionMode_"; - - /// - /// Method to translate . - /// - /// . - /// Translated . - public string Translate(string value) - { - var translation = Resources.Strings.ResourceManager.GetString(_identifier + value, LocalizationManager.GetInstance().Culture); - - return string.IsNullOrEmpty(translation) ? value : translation; - } - - /// - /// Method to translate . - /// - /// . - /// Translated . - public string Translate(AudioRedirectionMode audioRedirectionMode) - { - return Translate(audioRedirectionMode.ToString()); - } - } -} diff --git a/Source/NETworkManager.Localization/Translators/RemoteDesktopKeyboardHookModeTranslator.cs b/Source/NETworkManager.Localization/Translators/RemoteDesktopKeyboardHookModeTranslator.cs deleted file mode 100644 index 78b6caacae..0000000000 --- a/Source/NETworkManager.Localization/Translators/RemoteDesktopKeyboardHookModeTranslator.cs +++ /dev/null @@ -1,38 +0,0 @@ -using NETworkManager.Models.RemoteDesktop; -using NETworkManager.Utilities; - -namespace NETworkManager.Localization.Translators -{ - /// - /// Class to translate . - /// - public class RemoteDesktopKeyboardHookModeTranslator : SingletonBase, ILocalizationStringTranslator - { - /// - /// Constant to identify the strings in the language files. - /// - private const string _identifier = "RemoteDesktopKeyboardHookMode_"; - - /// - /// Method to translate . - /// - /// . - /// Translated . - public string Translate(string value) - { - var translation = Resources.Strings.ResourceManager.GetString(_identifier + value, LocalizationManager.GetInstance().Culture); - - return string.IsNullOrEmpty(translation) ? value : translation; - } - - /// - /// Method to translate . - /// - /// . - /// Translated . - public string Translate(KeyboardHookMode keyboardHookMode) - { - return Translate(keyboardHookMode.ToString()); - } - } -} diff --git a/Source/NETworkManager.Localization/Translators/RemoteDesktopNetworkConnectionTypeTranslator.cs b/Source/NETworkManager.Localization/Translators/RemoteDesktopNetworkConnectionTypeTranslator.cs deleted file mode 100644 index 4ea1978895..0000000000 --- a/Source/NETworkManager.Localization/Translators/RemoteDesktopNetworkConnectionTypeTranslator.cs +++ /dev/null @@ -1,38 +0,0 @@ -using NETworkManager.Models.RemoteDesktop; -using NETworkManager.Utilities; - -namespace NETworkManager.Localization.Translators -{ - /// - /// Class to translate . - /// - public class RemoteDesktopNetworkConnectionTypeTranslator : SingletonBase, ILocalizationStringTranslator - { - /// - /// Constant to identify the strings in the language files. - /// - private const string _identifier = "RemoteDesktopNetworkConnectionType_"; - - /// - /// Method to translate . - /// - /// . - /// Translated . - public string Translate(string value) - { - var translation = Resources.Strings.ResourceManager.GetString(_identifier + value, LocalizationManager.GetInstance().Culture); - - return string.IsNullOrEmpty(translation) ? value : translation; - } - - /// - /// Method to translate . - /// - /// . - /// Translated . - public string Translate(NetworkConnectionType networkConnectionType) - { - return Translate(networkConnectionType.ToString()); - } - } -} diff --git a/Source/NETworkManager.Localization/Translators/SettingsViewGroupTranslator.cs b/Source/NETworkManager.Localization/Translators/SettingsViewGroupTranslator.cs deleted file mode 100644 index e10af1bf38..0000000000 --- a/Source/NETworkManager.Localization/Translators/SettingsViewGroupTranslator.cs +++ /dev/null @@ -1,38 +0,0 @@ -using NETworkManager.Settings; -using NETworkManager.Utilities; - -namespace NETworkManager.Localization.Translators -{ - /// - /// Class to translate . - /// - public class SettingsViewGroupTranslator : SingletonBase, ILocalizationStringTranslator - { - /// - /// Constant to identify the strings in the language files. - /// - private const string _identifier = "SettingsViewGroup_"; - - /// - /// Method to translate . - /// - /// as . - /// Translated . - public string Translate(string value) - { - var translation = Resources.Strings.ResourceManager.GetString(_identifier + value, LocalizationManager.GetInstance().Culture); - - return string.IsNullOrEmpty(translation) ? value : translation; - } - - /// - /// Method to translate . - /// - /// . - /// Translated . - public string Translate(SettingsViewGroup group) - { - return Translate(group.ToString()); - } - } -} \ No newline at end of file diff --git a/Source/NETworkManager.Localization/Translators/SettingsViewNameTranslator.cs b/Source/NETworkManager.Localization/Translators/SettingsViewNameTranslator.cs deleted file mode 100644 index 0bd3231667..0000000000 --- a/Source/NETworkManager.Localization/Translators/SettingsViewNameTranslator.cs +++ /dev/null @@ -1,38 +0,0 @@ -using NETworkManager.Settings; -using NETworkManager.Utilities; - -namespace NETworkManager.Localization.Translators -{ - /// - /// Class to translate . - /// - public class SettingsViewNameTranslator : SingletonBase, ILocalizationStringTranslator - { - /// - /// Constant to identify the strings in the language files. - /// - private const string _identifier = "SettingsViewName_"; - - /// - /// Method to translate . - /// - /// as . - /// Translated . - public string Translate(string value) - { - var translation = Resources.Strings.ResourceManager.GetString(_identifier + value, LocalizationManager.GetInstance().Culture); - - return string.IsNullOrEmpty(translation) ? value : translation; - } - - /// - /// Method to translate . - /// - /// . - /// Translated . - public string Translate(SettingsViewName name) - { - return Translate(name.ToString()); - } - } -} \ No newline at end of file diff --git a/Source/NETworkManager.Localization/Translators/TcpStateTranslator.cs b/Source/NETworkManager.Localization/Translators/TcpStateTranslator.cs deleted file mode 100644 index 9848c85e3b..0000000000 --- a/Source/NETworkManager.Localization/Translators/TcpStateTranslator.cs +++ /dev/null @@ -1,39 +0,0 @@ -using NETworkManager.Utilities; -using System.Net.NetworkInformation; - -namespace NETworkManager.Localization.Translators -{ - /// - /// Class to translate . - /// - public class TcpStateTranslator : SingletonBase, ILocalizationStringTranslator - { - /// - /// Constant to identify the strings in the language files. - /// - private const string _identifier = "TcpState_"; - - - /// - /// Method to translate . - /// - /// . - /// Translated . - public string Translate(string value) - { - var translation = Resources.Strings.ResourceManager.GetString(_identifier + value, LocalizationManager.GetInstance().Culture); - - return string.IsNullOrEmpty(translation) ? value : translation; - } - - /// - /// Method to translate . - /// - /// . - /// Translated . - public string Translate(TcpState tcpState) - { - return Translate(tcpState.ToString()); - } - } -} \ No newline at end of file diff --git a/Source/NETworkManager.Localization/Translators/ThemeTranslator.cs b/Source/NETworkManager.Localization/Translators/ThemeTranslator.cs deleted file mode 100644 index ab38e5741f..0000000000 --- a/Source/NETworkManager.Localization/Translators/ThemeTranslator.cs +++ /dev/null @@ -1,28 +0,0 @@ -using NETworkManager.Models.Appearance; -using NETworkManager.Utilities; - -namespace NETworkManager.Localization.Translators -{ - /// - /// Class to translate . - /// - public class ThemeTranslator : SingletonBase, ILocalizationStringTranslator - { - /// - /// Constant to identify the strings in the language files. - /// - private const string _identifier = "Theme_"; - - /// - /// Method to translate . - /// - /// as . - /// Translated . - public string Translate(string value) - { - var translation = Resources.Strings.ResourceManager.GetString(_identifier + value, LocalizationManager.GetInstance().Culture); - - return string.IsNullOrEmpty(translation) ? value : translation; - } - } -} \ No newline at end of file diff --git a/Source/NETworkManager.Localization/Translators/TimeUnitTranslator.cs b/Source/NETworkManager.Localization/Translators/TimeUnitTranslator.cs deleted file mode 100644 index b06acc2cea..0000000000 --- a/Source/NETworkManager.Localization/Translators/TimeUnitTranslator.cs +++ /dev/null @@ -1,37 +0,0 @@ -using NETworkManager.Utilities; - -namespace NETworkManager.Localization.Translators -{ - /// - /// Class to translate - /// - public class TimeUnitTranslator : SingletonBase, ILocalizationStringTranslator - { - /// - /// Constant to identify the strings in the language files. - /// - private const string _identifier = "TimeUnit_"; - - /// - /// Method to translate . - /// - /// as . - /// Translated . - public string Translate(string value) - { - var translation = Resources.Strings.ResourceManager.GetString(_identifier + value, LocalizationManager.GetInstance().Culture); - - return string.IsNullOrEmpty(translation) ? value : translation; - } - - /// - /// Method to translate . - /// - /// . - /// Translated . - public string Translate(TimeUnit timeUnit) - { - return Translate(timeUnit.ToString()); - } - } -} \ No newline at end of file diff --git a/Source/NETworkManager.Localization/app.config b/Source/NETworkManager.Localization/app.config deleted file mode 100644 index f6e7dca8dc..0000000000 --- a/Source/NETworkManager.Localization/app.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/Source/NETworkManager.Models/Appearance/AccentColorInfo.cs b/Source/NETworkManager.Models/Appearance/AccentColorInfo.cs index f049728642..cf80f167de 100644 --- a/Source/NETworkManager.Models/Appearance/AccentColorInfo.cs +++ b/Source/NETworkManager.Models/Appearance/AccentColorInfo.cs @@ -1,10 +1,8 @@ - -namespace NETworkManager.Models.Appearance +namespace NETworkManager.Models.Appearance; + +/// +/// Class contains information's about MahApps.Metro accents. +/// +public class AccentColorInfo : BaseColorInfo { - /// - /// Class contains informations about MahApps.Metro accents. - /// - public class AccentColorInfo : BaseColorInfo - { - } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Appearance/BaseColorInfo.cs b/Source/NETworkManager.Models/Appearance/BaseColorInfo.cs index b8701490ee..02f69794a2 100644 --- a/Source/NETworkManager.Models/Appearance/BaseColorInfo.cs +++ b/Source/NETworkManager.Models/Appearance/BaseColorInfo.cs @@ -1,13 +1,19 @@ using System.Windows.Media; -namespace NETworkManager.Models.Appearance +namespace NETworkManager.Models.Appearance; + +/// +/// Base class for MahApps.Metro theme/accent information's. +/// +public abstract class BaseColorInfo { /// - /// Base class for MahApps.Metro theme/accent informations. + /// Name of the theme/accent. + /// + public string Name { get; set; } + + /// + /// Color of the theme/accent. /// - public abstract class BaseColorInfo - { - public string Name { get; set; } - public Brush Color { get; set; } - } -} + public Brush Color { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Appearance/ThemeColorInfo.cs b/Source/NETworkManager.Models/Appearance/ThemeColorInfo.cs index 6951974f3e..cb7aa18c7b 100644 --- a/Source/NETworkManager.Models/Appearance/ThemeColorInfo.cs +++ b/Source/NETworkManager.Models/Appearance/ThemeColorInfo.cs @@ -1,9 +1,8 @@ -namespace NETworkManager.Models.Appearance +namespace NETworkManager.Models.Appearance; + +/// +/// Class contains information's about MahApps.Metro themes. +/// +public class ThemeColorInfo : BaseColorInfo { - /// - /// Class contains informations about MahApps.Metro themes. - /// - public class ThemeColorInfo : BaseColorInfo - { - } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Appearance/ThemeInfo.cs b/Source/NETworkManager.Models/Appearance/ThemeInfo.cs new file mode 100644 index 0000000000..36487c5312 --- /dev/null +++ b/Source/NETworkManager.Models/Appearance/ThemeInfo.cs @@ -0,0 +1,28 @@ +namespace NETworkManager.Models.Appearance; + +/// +/// Class contains information's about MahApps.Metro custom theme. +/// +public class ThemeInfo +{ + /// + /// Initializes a new instance of the class with properties. + /// + /// Name of of the MahApps.Metro custom theme. + /// Display name of the MahApps.Metro custom theme. + public ThemeInfo(string name, string displayName) + { + Name = name; + DisplayName = displayName; + } + + /// + /// Name of the MahApps.Metro custom theme. + /// + public string Name { get; set; } + + /// + /// Display name of the MahApps.Metro custom theme. + /// + public string DisplayName { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/ApplicationInfo.cs b/Source/NETworkManager.Models/ApplicationInfo.cs index 69f619a835..cde875c63d 100644 --- a/Source/NETworkManager.Models/ApplicationInfo.cs +++ b/Source/NETworkManager.Models/ApplicationInfo.cs @@ -1,77 +1,108 @@ -namespace NETworkManager.Models +using NETworkManager.Utilities; + +namespace NETworkManager.Models; + +/// +/// Stores information's about an application. +/// +public class ApplicationInfo : PropertyChangedBase { /// - /// Stores informations about an application. + /// Initializes a new instance of the class. /// - public class ApplicationInfo + public ApplicationInfo() { - /// - /// Name of the application. - /// - public ApplicationName Name { get; set; } + } - /// - /// Indicates that the application is visible to the user. - /// - public bool IsVisible { get; set; } + /// + /// Initializes a new instance of the class with parameters. + /// + /// Name of the application. + /// Indicates that the application is visible to the user. + /// Indicates that the application is the default application. + public ApplicationInfo(ApplicationName name, bool isVisible = true, bool isDefault = false) + { + Name = name; + IsVisible = isVisible; + IsDefault = isDefault; + } + + /// + /// Name of the application. + /// + public ApplicationName Name { get; set; } - /// - /// Initializes a new instance of the class. - /// - public ApplicationInfo() + /// + /// Indicates that the application is visible to the user. + /// + public bool IsVisible + { + get; + set { + if (value == field) + return; + field = value; + OnPropertyChanged(); } + } - /// - /// Initializes a new instance of the class and passes the as paramteter. - /// - /// - public ApplicationInfo(ApplicationName name) + /// + /// Indicates that the application is the default application. + /// + public bool IsDefault + { + get; + set { - Name = name; - IsVisible = true; + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - /// - /// Method to check if an object is equal to this object. - /// - /// Object to check. - /// Equality as . - public bool Equals(ApplicationInfo info) - { - if (info == null) - return false; + /// + /// Method to check if an object is equal to this object. + /// + /// Object to check. + /// Equality as . + private bool Equals(ApplicationInfo info) + { + if (info == null) + return false; - return Name == info.Name; - } + return Name == info.Name; + } - /// - /// Method to check if an object is equal to this object. - /// - /// Object from type to check. - /// Equality as . - public override bool Equals(object obj) - { - if (obj is null) - return false; + /// + /// Method to check if an object is equal to this object. + /// + /// Object from type to check. + /// Equality as . + public override bool Equals(object obj) + { + if (obj is null) + return false; - if (ReferenceEquals(this, obj)) - return true; + if (ReferenceEquals(this, obj)) + return true; - if (obj.GetType() != GetType()) - return false; + if (obj.GetType() != GetType()) + return false; - return Equals(obj as ApplicationInfo); - } + return Equals(obj as ApplicationInfo); + } - /// - /// Method to return the hash code of this object. - /// - /// Hashcode as . - public override int GetHashCode() - { - return Name.GetHashCode(); - } + /// + /// Method to return the hash code of this object. + /// + /// Hashcode as . + public override int GetHashCode() + { + // ReSharper disable once NonReadonlyMemberInGetHashCode + return Name.GetHashCode(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/ApplicationManager.cs b/Source/NETworkManager.Models/ApplicationManager.cs index 1c4153370e..f4dac25830 100644 --- a/Source/NETworkManager.Models/ApplicationManager.cs +++ b/Source/NETworkManager.Models/ApplicationManager.cs @@ -4,117 +4,138 @@ using System.Linq; using System.Windows.Controls; -namespace NETworkManager.Models +namespace NETworkManager.Models; + +/// +/// Provides methods to manage applications. +/// +public static class ApplicationManager { /// - /// Provides methods to manage networkmanger applications. + /// Method to return all available applications in. /// - public static class ApplicationManager + /// IEnumerable with . + public static IEnumerable GetNames() { - /// - /// Method to return all available applications in. - /// - /// All names as array. - public static ApplicationName[] GetNames() => (ApplicationName[])Enum.GetValues(typeof(ApplicationName)); + return Enum.GetValues(); + } - /// - /// Method returns a list with all . - /// - /// IEnumerable with - public static IEnumerable GetList() - { - var list = new List(); + /// + /// Method returns a default list with all and sets + /// the default properties for each application. + /// + /// IEnumerable with . + public static IEnumerable GetDefaultList() + { +#pragma warning disable CS0618 + return [.. GetNames().Where(x => x != ApplicationName.None && x != ApplicationName.AWSSessionManager && x != ApplicationName.ARPTable).Select(name => new ApplicationInfo(name, true, name == ApplicationName.Dashboard))]; +#pragma warning restore CS0618 + } - foreach (var name in GetNames().Where(x => x != ApplicationName.None)) - list.Add(new ApplicationInfo(name)); - - return list; - } + /// + /// Method will return the icon based on . + /// + /// + /// + /// + /// Application icon as . + public static Canvas GetIcon(ApplicationName name) + { + var canvas = new Canvas(); - /// - /// Method will return the icon based on . - /// - /// - /// Application icon as . - public static Canvas GetIcon(ApplicationName name) + switch (name) { - var canvas = new Canvas(); - - switch (name) - { - case ApplicationName.Dashboard: - canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.ViewDashboardVariant }); - break; - case ApplicationName.NetworkInterface: - canvas.Children.Add(new PackIconModern { Kind = PackIconModernKind.Network }); - break; - case ApplicationName.WiFi: - canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.AccessPointNetwork }); - break; - case ApplicationName.IPScanner: - canvas.Children.Add(new PackIconFontAwesome { Kind = PackIconFontAwesomeKind.NetworkWiredSolid }); - break; - case ApplicationName.PortScanner: - canvas.Children.Add(new PackIconModern { Kind = PackIconModernKind.NetworkPort }); - break; - case ApplicationName.PingMonitor: - canvas.Children.Add(new PackIconModern { Kind = PackIconModernKind.RadarScreen }); - break; - case ApplicationName.Traceroute: - canvas.Children.Add(new PackIconModern { Kind = PackIconModernKind.TransitConnection }); - break; - case ApplicationName.DNSLookup: - canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.SearchWeb }); - break; - case ApplicationName.RemoteDesktop: - canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.RemoteDesktop }); - break; - case ApplicationName.PowerShell: - canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.Powershell }); - break; - case ApplicationName.PuTTY: - canvas.Children.Add(new PackIconFontAwesome { Kind = PackIconFontAwesomeKind.TerminalSolid }); - break; - case ApplicationName.TigerVNC: - canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.EyeOutline }); - break; - case ApplicationName.WebConsole: - canvas.Children.Add(new PackIconPicolIcons { Kind = PackIconPicolIconsKind.Website }); - break; - case ApplicationName.SNMP: - canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.Switch }); - break; - case ApplicationName.DiscoveryProtocol: - canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.SwapHorizontal }); - break; - case ApplicationName.WakeOnLAN: - canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.Power }); - break; - case ApplicationName.Whois: - canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.CloudSearchOutline }); - break; - case ApplicationName.SubnetCalculator: - canvas.Children.Add(new PackIconModern { Kind = PackIconModernKind.Calculator }); - break; - case ApplicationName.Lookup: - canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.DatabaseSearch }); - break; - case ApplicationName.Connections: - canvas.Children.Add(new PackIconModern { Kind = PackIconModernKind.Connect }); - break; - case ApplicationName.Listeners: - canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.Wan }); - break; - case ApplicationName.ARPTable: - canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.TableOfContents }); - break; - case ApplicationName.None: - default: - canvas.Children.Add(new PackIconModern { Kind = PackIconModernKind.SmileyFrown }); - break; - } - - return canvas; + case ApplicationName.Dashboard: + canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.ViewDashboardVariant }); + break; + case ApplicationName.NetworkInterface: + canvas.Children.Add(new PackIconModern { Kind = PackIconModernKind.Network }); + break; + case ApplicationName.WiFi: + canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.AccessPointNetwork }); + break; + case ApplicationName.IPScanner: + canvas.Children.Add(new PackIconFontAwesome { Kind = PackIconFontAwesomeKind.NetworkWiredSolid }); + break; + case ApplicationName.PortScanner: + canvas.Children.Add(new PackIconModern { Kind = PackIconModernKind.NetworkPort }); + break; + case ApplicationName.PingMonitor: + canvas.Children.Add(new PackIconModern { Kind = PackIconModernKind.RadarScreen }); + break; + case ApplicationName.Traceroute: + canvas.Children.Add(new PackIconModern { Kind = PackIconModernKind.TransitConnection }); + break; + case ApplicationName.DNSLookup: + canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.SearchWeb }); + break; + case ApplicationName.RemoteDesktop: + canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.RemoteDesktop }); + break; + case ApplicationName.PowerShell: + canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.Powershell }); + break; + case ApplicationName.PuTTY: + canvas.Children.Add(new PackIconFontAwesome { Kind = PackIconFontAwesomeKind.TerminalSolid }); + break; + case ApplicationName.TigerVNC: + canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.EyeOutline }); + break; + case ApplicationName.WebConsole: + canvas.Children.Add(new PackIconModern { Kind = PackIconModernKind.Browser }); + break; + case ApplicationName.SNMP: + canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.Switch }); + break; + case ApplicationName.SNTPLookup: + canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.ClockCheckOutline }); + break; + case ApplicationName.HostsFileEditor: + canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.FileEditOutline }); + break; + case ApplicationName.DiscoveryProtocol: + canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.SwapHorizontal }); + break; + case ApplicationName.WakeOnLAN: + canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.Power }); + break; + case ApplicationName.Whois: + canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.CloudSearchOutline }); + break; + case ApplicationName.IPGeolocation: + canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.MapSearchOutline }); + break; + case ApplicationName.SubnetCalculator: + canvas.Children.Add(new PackIconModern { Kind = PackIconModernKind.Calculator }); + break; + case ApplicationName.BitCalculator: + canvas.Children.Add(new PackIconModern { Kind = PackIconModernKind.TypeBit }); + break; + case ApplicationName.Lookup: + canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.DatabaseSearch }); + break; + case ApplicationName.Connections: + canvas.Children.Add(new PackIconModern { Kind = PackIconModernKind.Connect }); + break; + case ApplicationName.Listeners: + canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.Wan }); + break; + case ApplicationName.NeighborTable: +#pragma warning disable CS0618 + case ApplicationName.ARPTable: +#pragma warning restore CS0618 + canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.TableOfContents }); + break; + case ApplicationName.Firewall: + canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.WallFire }); + break; + case ApplicationName.None: + case ApplicationName.AWSSessionManager: + default: + canvas.Children.Add(new PackIconModern { Kind = PackIconModernKind.SmileyFrown }); + break; } + + return canvas; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/ApplicationName.cs b/Source/NETworkManager.Models/ApplicationName.cs index 144d2bd34a..20bd63710c 100644 --- a/Source/NETworkManager.Models/ApplicationName.cs +++ b/Source/NETworkManager.Models/ApplicationName.cs @@ -1,123 +1,161 @@ -namespace NETworkManager.Models +using Windows.Foundation.Metadata; + +namespace NETworkManager.Models; + +/// +/// Represents all available applications. +/// +public enum ApplicationName { /// - /// Represents all available applications. - /// - public enum ApplicationName - { - /// - /// No application. - /// - None, - - /// - /// Dashboard application. - /// - Dashboard, - - /// - /// Network interface application. - /// - NetworkInterface, - - /// - /// WiFi application. - /// - WiFi, - - /// - /// IP scanner application. - /// - IPScanner, - - /// - /// Port scanner application. - /// - PortScanner, - - /// - /// Ping monitor application. - /// - PingMonitor, - - /// - /// Traceroute application. - /// - Traceroute, - - /// - /// DNS lookup application. - /// - DNSLookup, - - /// - /// Remote Desktop application. - /// - RemoteDesktop, - - /// - /// PowerShell application. - /// - PowerShell, - - /// - /// PuTTY application. - /// - PuTTY, - - /// - /// TigerVNC application. - /// - TigerVNC, - - /// - /// WebConsole application. - /// - WebConsole, - - /// - /// SNMP application. - /// - SNMP, - - /// - /// Discovery protocol application. - /// - DiscoveryProtocol, - - /// - /// Wake on LAN application. - /// - WakeOnLAN, - - /// - /// Whois application. - /// - Whois, - - /// - /// Subnet calculator application. - /// - SubnetCalculator, - - /// - /// Lookup application. - /// - Lookup, - - /// - /// Connections application. - /// - Connections, - - /// - /// Listeners application. - /// - Listeners, - - /// - /// ARP table application. - /// - ARPTable - } + /// No application. + /// + None, + + /// + /// Dashboard application. + /// + Dashboard, + + /// + /// Network interface application. + /// + NetworkInterface, + + /// + /// WiFi application. + /// + WiFi, + + /// + /// IP scanner application. + /// + IPScanner, + + /// + /// Port scanner application. + /// + PortScanner, + + /// + /// Ping monitor application. + /// + PingMonitor, + + /// + /// Traceroute application. + /// + Traceroute, + + /// + /// DNS lookup application. + /// + DNSLookup, + + /// + /// Remote Desktop application. + /// + RemoteDesktop, + + /// + /// PowerShell application. + /// + PowerShell, + + /// + /// PuTTY application. + /// + PuTTY, + + /// + /// AWS Session Manager application. + /// + AWSSessionManager, + + /// + /// TigerVNC application. + /// + TigerVNC, + + /// + /// WebConsole application. + /// + WebConsole, + + /// + /// SNMP application. + /// + SNMP, + + /// + /// SNTP lookup application. + /// + SNTPLookup, + + /// + /// Hosts file editor application. + /// + HostsFileEditor, + + /// + /// Firewall application. + /// + Firewall, + + /// + /// Discovery protocol application. + /// + DiscoveryProtocol, + + /// + /// Wake on LAN application. + /// + WakeOnLAN, + + /// + /// Whois application. + /// + Whois, + + /// + /// IP geolocation application. + /// + IPGeolocation, + + /// + /// Subnet calculator application. + /// + SubnetCalculator, + + /// + /// Bit calculator application. + /// + BitCalculator, + + /// + /// Lookup application. + /// + Lookup, + + /// + /// Connections application. + /// + Connections, + + /// + /// Listeners application. + /// + Listeners, + + /// + /// Neighbor table application (IPv4 ARP + IPv6 NDP). + /// + NeighborTable, + + /// + /// Obsolete: renamed to . Kept so that old settings files + /// with "ARPTable" can still be deserialized; migrated in SettingsManager.Upgrade(). + /// + [System.Obsolete("Use NeighborTable instead.")] + ARPTable } \ No newline at end of file diff --git a/Source/NETworkManager.Models/Cloudflare/SpeedTestMetaInfo.cs b/Source/NETworkManager.Models/Cloudflare/SpeedTestMetaInfo.cs new file mode 100644 index 0000000000..36faa18d8a --- /dev/null +++ b/Source/NETworkManager.Models/Cloudflare/SpeedTestMetaInfo.cs @@ -0,0 +1,73 @@ +using Newtonsoft.Json; + +namespace NETworkManager.Models.Cloudflare; + +/// +/// Cloudflare PoP (Point of Presence) information returned by the +/// speed.cloudflare.com/meta endpoint. +/// +public class SpeedTestMetaColo +{ + /// + /// IATA airport code of the PoP (e.g. "FRA"). + /// + [JsonProperty("iata")] + public string Iata { get; set; } + + /// + /// City of the PoP (e.g. "Frankfurt-am-Main"). + /// + [JsonProperty("city")] + public string City { get; set; } + + /// + /// ISO 3166-1 alpha-2 country code of the PoP (e.g. "DE"). + /// + [JsonProperty("cca2")] + public string Cca2 { get; set; } +} + +/// +/// Deserialized response of the speed.cloudflare.com/meta endpoint. +/// Provides client and Cloudflare PoP metadata used to enrich the speed +/// test result. Requires the Origin: https://speed.cloudflare.com +/// header on the request, otherwise an empty object is returned. +/// +public class SpeedTestMetaInfo +{ + /// + /// Public IP address of the requesting client as seen by Cloudflare. + /// + [JsonProperty("clientIp")] + public string ClientIp { get; set; } + + /// + /// Autonomous System Number of the client's ISP. + /// + [JsonProperty("asn")] + public int Asn { get; set; } + + /// + /// Human-readable ISP name (e.g. "innogy TelNet"). + /// + [JsonProperty("asOrganization")] + public string AsOrganization { get; set; } + + /// + /// ISO 3166-1 alpha-2 country code of the client (e.g. "DE"). + /// + [JsonProperty("country")] + public string Country { get; set; } + + /// + /// City of the client (e.g. "Bochum"). + /// + [JsonProperty("city")] + public string City { get; set; } + + /// + /// Cloudflare PoP (Point of Presence) details. + /// + [JsonProperty("colo")] + public SpeedTestMetaColo Colo { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Cloudflare/SpeedTestProgress.cs b/Source/NETworkManager.Models/Cloudflare/SpeedTestProgress.cs new file mode 100644 index 0000000000..b7e7585f11 --- /dev/null +++ b/Source/NETworkManager.Models/Cloudflare/SpeedTestProgress.cs @@ -0,0 +1,46 @@ +namespace NETworkManager.Models.Cloudflare; + +/// +/// Phase of a Cloudflare speed test run, reported by +/// via . +/// +public enum SpeedTestPhase +{ + FetchingMetadata, + MeasuringLatency, + MeasuringDownload, + MeasuringUpload +} + +/// +/// Progress event passed by to update the UI +/// with the currently running measurement phase and the latest live estimate +/// of each metric. Values are null until the first sample for that +/// metric has been collected. +/// +/// Current measurement phase. +/// Live download throughput estimate (Mbps). +/// Live upload throughput estimate (Mbps). +/// Live latency estimate (50th percentile of probes). +/// Live jitter estimate (average consecutive delta). +/// +/// Set when this emission marks a freshly completed download sample (one HTTP +/// request finished). Mid-stream live updates leave this null. +/// +/// +/// Set when this emission marks a freshly completed upload sample. +/// +/// +/// Cloudflare /meta response, emitted once after metadata is fetched +/// so ISP / location / server details can be displayed before the bandwidth +/// measurements complete. +/// +public record SpeedTestProgress( + SpeedTestPhase Phase, + double? DownloadMbps = null, + double? UploadMbps = null, + double? LatencyMs = null, + double? JitterMs = null, + double? NewDownloadSampleMbps = null, + double? NewUploadSampleMbps = null, + SpeedTestMetaInfo Meta = null); diff --git a/Source/NETworkManager.Models/Cloudflare/SpeedTestResult.cs b/Source/NETworkManager.Models/Cloudflare/SpeedTestResult.cs new file mode 100644 index 0000000000..e584eba9e4 --- /dev/null +++ b/Source/NETworkManager.Models/Cloudflare/SpeedTestResult.cs @@ -0,0 +1,71 @@ +namespace NETworkManager.Models.Cloudflare; + +/// +/// Final result of a Cloudflare speed test run. +/// +public class SpeedTestResult +{ + /// + /// Download throughput in megabits per second (Mbps). null when no + /// samples were collected (e.g. test cancelled before any download). + /// + public double? DownloadMbps { get; set; } + + /// + /// Upload throughput in megabits per second (Mbps). null when no + /// samples were collected. + /// + public double? UploadMbps { get; set; } + + /// + /// Unloaded latency in milliseconds (50th percentile of latency probes). + /// null when no probes were collected. + /// + public double? LatencyMs { get; set; } + + /// + /// Average consecutive delta between latency samples, in milliseconds. + /// null when fewer than two probes were collected. + /// + public double? JitterMs { get; set; } + + /// + /// ISP name (Cloudflare meta asOrganization). + /// + public string Isp { get; set; } + + /// + /// City of the client (Cloudflare meta city). + /// + public string ClientCity { get; set; } + + /// + /// ISO 3166-1 alpha-2 country code of the client (Cloudflare meta country). + /// + public string ClientCountry { get; set; } + + /// + /// City of the Cloudflare PoP serving the test, e.g. "Frankfurt-am-Main". + /// + public string ServerCity { get; set; } + + /// + /// ISO 3166-1 alpha-2 country code of the Cloudflare PoP, e.g. "DE". + /// + public string ServerCountry { get; set; } + + /// + /// IATA code of the Cloudflare PoP, e.g. "FRA". + /// + public string ServerIata { get; set; } + + /// + /// Indicates that the speed test run failed. + /// + public bool HasError { get; set; } + + /// + /// Error message when is true. + /// + public string ErrorMessage { get; set; } +} diff --git a/Source/NETworkManager.Models/Cloudflare/SpeedTestService.cs b/Source/NETworkManager.Models/Cloudflare/SpeedTestService.cs new file mode 100644 index 0000000000..1c5b097be3 --- /dev/null +++ b/Source/NETworkManager.Models/Cloudflare/SpeedTestService.cs @@ -0,0 +1,438 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; +using Newtonsoft.Json; + +namespace NETworkManager.Models.Cloudflare; + +/// +/// Runs a network speed test against speed.cloudflare.com, modeled +/// after the official cloudflare/speedtest +/// JavaScript library. The full network logic is reimplemented in C#; no +/// telemetry is sent to aim.cloudflare.com. +/// +public class SpeedTestService +{ + private const string BaseUrl = "https://speed.cloudflare.com"; + private const string Origin = "https://speed.cloudflare.com"; + + private const double DefaultEstimatedServerTimeMs = 10.0; + private const double BandwidthFinishRequestDurationMs = 1000.0; + private const double BandwidthMinRequestDurationMs = 10.0; + private const double EstimatedHeaderFraction = 1.005; + + /// + /// Minimum gap between mid-stream live throughput emissions, in ms. + /// + private const double LiveProgressIntervalMs = 250.0; + + private static readonly Regex ServerTimingRegex = new(@"(?:^|;)\s*dur=([0-9.]+)", RegexOptions.Compiled); + + private enum StepDirection { Download, Upload } + + /// + /// Interleaved download/upload sequence from defaultConfig.js of the + /// official cloudflare/speedtest library. The initial 100 KB download + /// (bypassMinDuration) is executed separately between the two latency phases. + /// + private static readonly (StepDirection Direction, int Bytes, int Count)[] Steps = + { + (StepDirection.Download, 100_000, 9), + (StepDirection.Download, 1_000_000, 8), + (StepDirection.Upload, 100_000, 8), + (StepDirection.Upload, 1_000_000, 6), + (StepDirection.Download, 10_000_000, 6), + (StepDirection.Upload, 10_000_000, 4), + (StepDirection.Download, 25_000_000, 4), + (StepDirection.Upload, 25_000_000, 4), + (StepDirection.Download, 100_000_000, 3), + (StepDirection.Upload, 50_000_000, 3), + (StepDirection.Download, 250_000_000, 2), + }; + + private const int LatencyInitialProbes = 1; + private const int LatencyMeasurementProbes = 20; + + private static readonly HttpClient _client = CreateClient(); + + private static HttpClient CreateClient() + { + var client = new HttpClient { Timeout = Timeout.InfiniteTimeSpan }; + client.DefaultRequestHeaders.Add("Origin", Origin); + client.DefaultRequestHeaders.UserAgent.ParseAdd("NETworkManager"); + return client; + } + + /// + /// Runs a full speed test sequence (metadata, latency, download, upload). + /// Live estimates for each metric are reported via + /// as samples accumulate. The returned + /// contains the final aggregated values. + /// + public async Task RunAsync(IProgress progress, CancellationToken cancellationToken) + { + var pings = new List(); + var downloadBps = new List(); + var uploadBps = new List(); + + // 1. Metadata + Emit(progress, SpeedTestPhase.FetchingMetadata, pings, downloadBps, uploadBps, null, null); + var meta = await FetchMetaAsync(cancellationToken).ConfigureAwait(false); + progress?.Report(new SpeedTestProgress(SpeedTestPhase.FetchingMetadata, Meta: meta)); + + // 2. Initial latency probe (server-time estimation) + Emit(progress, SpeedTestPhase.MeasuringLatency, pings, downloadBps, uploadBps, null, null); + for (var i = 0; i < LatencyInitialProbes; i++) + { + await MeasureLatencyAsync(pings, cancellationToken).ConfigureAwait(false); + Emit(progress, SpeedTestPhase.MeasuringLatency, pings, downloadBps, uploadBps, null, null); + } + + // 3. Initial download estimate (100 KB × 1 — bypassMinDuration, between the two latency phases) + Emit(progress, SpeedTestPhase.MeasuringDownload, pings, downloadBps, uploadBps, null, null); + { + var (bps, durationMs) = await MeasureDownloadAsync(100_000, cancellationToken, + liveBps => Emit(progress, SpeedTestPhase.MeasuringDownload, + pings, downloadBps, uploadBps, liveBps, null)).ConfigureAwait(false); + if (durationMs >= BandwidthMinRequestDurationMs) + { + downloadBps.Add(bps); + Emit(progress, SpeedTestPhase.MeasuringDownload, + pings, downloadBps, uploadBps, null, null, + newDownloadSampleBps: bps); + } + } + + // 4. Proper unloaded latency measurement (20 probes) + Emit(progress, SpeedTestPhase.MeasuringLatency, pings, downloadBps, uploadBps, null, null); + for (var i = 0; i < LatencyMeasurementProbes; i++) + { + await MeasureLatencyAsync(pings, cancellationToken).ConfigureAwait(false); + Emit(progress, SpeedTestPhase.MeasuringLatency, pings, downloadBps, uploadBps, null, null); + } + + // 5. Interleaved download / upload (official cloudflare/speedtest sequence) + var downloadStopped = false; + var uploadStopped = false; + var currentPhase = SpeedTestPhase.MeasuringDownload; + Emit(progress, currentPhase, pings, downloadBps, uploadBps, null, null); + + foreach (var step in Steps) + { + if (step.Direction == StepDirection.Download && downloadStopped) continue; + if (step.Direction == StepDirection.Upload && uploadStopped) continue; + + var stepPhase = step.Direction == StepDirection.Download + ? SpeedTestPhase.MeasuringDownload + : SpeedTestPhase.MeasuringUpload; + if (stepPhase != currentPhase) + { + currentPhase = stepPhase; + Emit(progress, currentPhase, pings, downloadBps, uploadBps, null, null); + } + + for (var i = 0; i < step.Count; i++) + { + if (step.Direction == StepDirection.Download) + { + + var phaseSnapshot = currentPhase; + var (bps, durationMs) = await MeasureDownloadAsync(step.Bytes, cancellationToken, + liveBps => Emit(progress, phaseSnapshot, + pings, downloadBps, uploadBps, liveBps, null)).ConfigureAwait(false); + if (durationMs >= BandwidthMinRequestDurationMs) + { + downloadBps.Add(bps); + Emit(progress, currentPhase, + pings, downloadBps, uploadBps, null, null, + newDownloadSampleBps: bps); + } + if (durationMs >= BandwidthFinishRequestDurationMs) + { + downloadStopped = true; + break; + } + } + else + { + var (bps, durationMs) = await MeasureUploadAsync(step.Bytes, cancellationToken) + .ConfigureAwait(false); + if (durationMs >= BandwidthMinRequestDurationMs) + { + uploadBps.Add(bps); + Emit(progress, currentPhase, + pings, downloadBps, uploadBps, null, null, + newUploadSampleBps: bps); + } + if (durationMs >= BandwidthFinishRequestDurationMs) + { + uploadStopped = true; + break; + } + } + } + } + + // 6. Result + return new SpeedTestResult + { + DownloadMbps = downloadBps.Count > 0 ? Percentile(downloadBps, 0.9) / 1_000_000.0 : null, + UploadMbps = uploadBps.Count > 0 ? Percentile(uploadBps, 0.9) / 1_000_000.0 : null, + LatencyMs = pings.Count > 0 ? Percentile(pings, 0.5) : null, + JitterMs = pings.Count >= 2 ? Jitter(pings) : null, + Isp = meta?.AsOrganization, + ClientCity = meta?.City, + ClientCountry = meta?.Country, + ServerCity = meta?.Colo?.City, + ServerCountry = meta?.Colo?.Cca2, + ServerIata = meta?.Colo?.Iata + }; + } + + /// + /// Builds and emits a using current + /// sample lists. and + /// let mid-stream callers + /// report an instantaneous estimate even before the first completed + /// sample is in the list. + /// + private static void Emit(IProgress progress, SpeedTestPhase phase, + List pings, List downloadBps, List uploadBps, + double? liveDownloadBpsOverride, double? liveUploadBpsOverride, + double? newDownloadSampleBps = null, double? newUploadSampleBps = null) + { + if (progress == null) + return; + + // P90 of completed samples ⊔ current live instantaneous — consistent with + // the final result formula; live override applies only before the first sample. + double? downloadMbps = null; + if (downloadBps.Count > 0 || liveDownloadBpsOverride.HasValue) + { + var p90Bps = downloadBps.Count > 0 ? Percentile(downloadBps, 0.9) : 0.0; + if (liveDownloadBpsOverride.HasValue && liveDownloadBpsOverride.Value > p90Bps) + p90Bps = liveDownloadBpsOverride.Value; + downloadMbps = p90Bps / 1_000_000.0; + } + + double? uploadMbps = null; + if (uploadBps.Count > 0 || liveUploadBpsOverride.HasValue) + { + var p90Bps = uploadBps.Count > 0 ? Percentile(uploadBps, 0.9) : 0.0; + if (liveUploadBpsOverride.HasValue && liveUploadBpsOverride.Value > p90Bps) + p90Bps = liveUploadBpsOverride.Value; + uploadMbps = p90Bps / 1_000_000.0; + } + + double? latencyMs = pings.Count > 0 ? Percentile(pings, 0.5) : null; + double? jitterMs = pings.Count >= 2 ? Jitter(pings) : null; + + var newDownloadSampleMbps = newDownloadSampleBps / 1_000_000.0; + var newUploadSampleMbps = newUploadSampleBps / 1_000_000.0; + + progress.Report(new SpeedTestProgress(phase, downloadMbps, uploadMbps, latencyMs, jitterMs, + newDownloadSampleMbps, newUploadSampleMbps)); + } + + #region Measurement primitives + + private async Task FetchMetaAsync(CancellationToken cancellationToken) + { + using var response = await _client.GetAsync($"{BaseUrl}/meta", cancellationToken) + .ConfigureAwait(false); + response.EnsureSuccessStatusCode(); + var json = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false); + return JsonConvert.DeserializeObject(json); + } + + private async Task MeasureLatencyAsync(List pings, CancellationToken cancellationToken) + { + var sw = Stopwatch.StartNew(); + using var request = new HttpRequestMessage(HttpMethod.Get, $"{BaseUrl}/__down?bytes=0"); + using var response = await _client + .SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken) + .ConfigureAwait(false); + sw.Stop(); + var ttfb = sw.Elapsed.TotalMilliseconds; + response.EnsureSuccessStatusCode(); + await response.Content.CopyToAsync(Stream.Null, cancellationToken).ConfigureAwait(false); + + var serverTime = ParseServerTiming(response) ?? DefaultEstimatedServerTimeMs; + var ping = ttfb - serverTime; + if (ping < 0) ping = 0; + pings.Add(ping); + } + + private async Task<(double Bps, double DurationMs)> MeasureDownloadAsync(int bytes, + CancellationToken cancellationToken, Action onLiveBps) + { + var sw1 = Stopwatch.StartNew(); + using var request = new HttpRequestMessage(HttpMethod.Get, $"{BaseUrl}/__down?bytes={bytes}"); + using var response = await _client + .SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken) + .ConfigureAwait(false); + sw1.Stop(); + var ttfb = sw1.Elapsed.TotalMilliseconds; + response.EnsureSuccessStatusCode(); + var serverTime = ParseServerTiming(response) ?? DefaultEstimatedServerTimeMs; + var ping = ttfb - serverTime; + if (ping < 0) ping = 0; + + var sw2 = Stopwatch.StartNew(); + long bodyBytes; + double lastProgressMs = 0; + long lastProgressBytes = 0; + await using (var stream = await response.Content + .ReadAsStreamAsync(cancellationToken).ConfigureAwait(false)) + { + var buffer = new byte[81920]; + long total = 0; + int read; + while ((read = await stream.ReadAsync(buffer, cancellationToken) + .ConfigureAwait(false)) > 0) + { + total += read; + var elapsedMs = sw2.Elapsed.TotalMilliseconds; + if (onLiveBps != null && elapsedMs - lastProgressMs >= LiveProgressIntervalMs + && elapsedMs > 0) + { + // Instantaneous throughput over the last interval (delta-based) + var deltaBytes = total - lastProgressBytes; + var deltaMs = elapsedMs - lastProgressMs; + var liveBps = 8.0 * deltaBytes / (deltaMs / 1000.0); + onLiveBps(liveBps); + lastProgressMs = elapsedMs; + lastProgressBytes = total; + } + } + bodyBytes = total; + } + sw2.Stop(); + var bodyMs = sw2.Elapsed.TotalMilliseconds; + var contentLength = response.Content.Headers.ContentLength ?? bodyBytes; + + var downloadDurationMs = ping + bodyMs; + if (downloadDurationMs <= 0) + return (0.0, downloadDurationMs); + + var bps = 8.0 * contentLength / (downloadDurationMs / 1000.0); + return (bps, downloadDurationMs); + } + + private async Task<(double Bps, double DurationMs)> MeasureUploadAsync(int bytes, + CancellationToken cancellationToken) + { + using var request = new HttpRequestMessage(HttpMethod.Post, $"{BaseUrl}/__up"); + using var content = new ZeroStreamContent(bytes); + request.Content = content; + + var sw = Stopwatch.StartNew(); + using var response = await _client + .SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken) + .ConfigureAwait(false); + sw.Stop(); + var ttfb = sw.Elapsed.TotalMilliseconds; + response.EnsureSuccessStatusCode(); + await response.Content.CopyToAsync(Stream.Null, cancellationToken).ConfigureAwait(false); + + var uploadDurationMs = ttfb; + if (uploadDurationMs <= 0) + return (0.0, uploadDurationMs); + + var bps = 8.0 * bytes * EstimatedHeaderFraction / (uploadDurationMs / 1000.0); + return (bps, uploadDurationMs); + } + + #endregion + + #region Helpers + + private static double? ParseServerTiming(HttpResponseMessage response) + { + if (!response.Headers.TryGetValues("server-timing", out var values)) + return null; + foreach (var value in values) + { + var match = ServerTimingRegex.Match(value); + if (match.Success && double.TryParse(match.Groups[1].Value, + System.Globalization.NumberStyles.Float, + System.Globalization.CultureInfo.InvariantCulture, out var dur)) + return dur; + } + return null; + } + + private static double Percentile(List values, double p) + { + if (values == null || values.Count == 0) + return 0.0; + var sorted = values.OrderBy(v => v).ToList(); + if (sorted.Count == 1) + return sorted[0]; + var rank = p * (sorted.Count - 1); + var lower = (int)Math.Floor(rank); + var upper = (int)Math.Ceiling(rank); + if (lower == upper) + return sorted[lower]; + var weight = rank - lower; + return sorted[lower] * (1 - weight) + sorted[upper] * weight; + } + + private static double Jitter(List pings) + { + if (pings == null || pings.Count < 2) + return 0.0; + double sum = 0; + for (var i = 1; i < pings.Count; i++) + sum += Math.Abs(pings[i] - pings[i - 1]); + return sum / (pings.Count - 1); + } + + #endregion + + /// + /// Streams zero bytes as HTTP content without allocating + /// a full-sized buffer. A single small shared chunk is reused across all writes. + /// + private sealed class ZeroStreamContent : HttpContent + { + private readonly int _length; + private static readonly byte[] _chunk = new byte[81920]; + + internal ZeroStreamContent(int length) + { + _length = length; + Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); + Headers.ContentLength = length; + } + + protected override Task SerializeToStreamAsync(Stream stream, TransportContext? context) => + SerializeToStreamAsync(stream, context, CancellationToken.None); + + protected override async Task SerializeToStreamAsync(Stream stream, TransportContext? context, + CancellationToken cancellationToken) + { + var remaining = _length; + while (remaining > 0) + { + var toWrite = Math.Min(_chunk.Length, remaining); + await stream.WriteAsync(_chunk.AsMemory(0, toWrite), cancellationToken).ConfigureAwait(false); + remaining -= toWrite; + } + } + + protected override bool TryComputeLength(out long length) + { + length = _length; + return true; + } + } +} diff --git a/Source/NETworkManager.Models/EventSystem/EventSystem.cs b/Source/NETworkManager.Models/EventSystem/EventSystem.cs index 18e295ac39..a5f6617773 100644 --- a/Source/NETworkManager.Models/EventSystem/EventSystem.cs +++ b/Source/NETworkManager.Models/EventSystem/EventSystem.cs @@ -1,23 +1,22 @@ using System; -namespace NETworkManager.Models.EventSystem +namespace NETworkManager.Models.EventSystem; + +public static class EventSystem { - public class EventSystem - { - // This will notify the mail window, to change the view to another application and redirect some data (hostname, ip) - public static event EventHandler OnRedirectDataToApplicationEvent; + // This will notify the main window, to change the view to another application and redirect some data (hostname, ip) + public static event EventHandler OnRedirectDataToApplicationEvent; - public static void RedirectToApplication(ApplicationName application, string data) - { - OnRedirectDataToApplicationEvent?.Invoke(null, new EventSystemRedirectArgs(application, data)); - } + public static void RedirectToApplication(ApplicationName application, string data) + { + OnRedirectDataToApplicationEvent?.Invoke(null, new EventSystemRedirectArgs(application, data)); + } - // This will notify the main window, to change the view to the settings... - public static event EventHandler OnRedirectToSettingsEvent; + // This will notify the main window, to change the view to the settings... + public static event EventHandler OnRedirectToSettingsEvent; - public static void RedirectToSettings() - { - OnRedirectToSettingsEvent?.Invoke(null, EventArgs.Empty); - } + public static void RedirectToSettings() + { + OnRedirectToSettingsEvent?.Invoke(null, EventArgs.Empty); } } \ No newline at end of file diff --git a/Source/NETworkManager.Models/EventSystem/EventSystemRedirectArgs.cs b/Source/NETworkManager.Models/EventSystem/EventSystemRedirectArgs.cs index 818d99ed50..42c47ece31 100644 --- a/Source/NETworkManager.Models/EventSystem/EventSystemRedirectArgs.cs +++ b/Source/NETworkManager.Models/EventSystem/EventSystemRedirectArgs.cs @@ -1,17 +1,15 @@ using System; -namespace NETworkManager.Models.EventSystem +namespace NETworkManager.Models.EventSystem; + +public class EventSystemRedirectArgs : EventArgs { - public class EventSystemRedirectArgs : EventArgs + public EventSystemRedirectArgs(ApplicationName application, string args) { - public ApplicationName Application { get; set; } - public string Args { get; set; } - - - public EventSystemRedirectArgs(ApplicationName application, string args) - { - Application = application; - Args = args; - } + Application = application; + Args = args; } -} + + public ApplicationName Application { get; set; } + public string Args { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Export/ExportFileType.cs b/Source/NETworkManager.Models/Export/ExportFileType.cs new file mode 100644 index 0000000000..0c5a32345c --- /dev/null +++ b/Source/NETworkManager.Models/Export/ExportFileType.cs @@ -0,0 +1,27 @@ +namespace NETworkManager.Models.Export; + +/// +/// Enum for the export file type. +/// +public enum ExportFileType +{ + /// + /// Csv file. + /// + Csv, + + /// + /// Xml file. + /// + Xml, + + /// + /// Json file. + /// + Json, + + /// + /// Text file. + /// + Txt +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Export/ExportManager.BitCaluclatorInfo.cs b/Source/NETworkManager.Models/Export/ExportManager.BitCaluclatorInfo.cs new file mode 100644 index 0000000000..a5c01c2e38 --- /dev/null +++ b/Source/NETworkManager.Models/Export/ExportManager.BitCaluclatorInfo.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Xml.Linq; +using NETworkManager.Models.Network; +using Newtonsoft.Json; + +namespace NETworkManager.Models.Export; + +public static partial class ExportManager +{ + /// + /// Method to export objects from type to a file. + /// + /// Path to the export file. + /// Allowed are CSV, XML or JSON. + /// Objects as to export. + public static void Export(string filePath, ExportFileType fileType, IReadOnlyList collection) + { + switch (fileType) + { + case ExportFileType.Csv: + CreateCsv(collection, filePath); + break; + case ExportFileType.Xml: + CreateXml(collection, filePath); + break; + case ExportFileType.Json: + CreateJson(collection, filePath); + break; + case ExportFileType.Txt: + default: + throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); + } + } + + /// + /// Creates a CSV file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateCsv(IEnumerable collection, string filePath) + { + var stringBuilder = new StringBuilder(); + + stringBuilder.AppendLine( + $"{nameof(BitCaluclatorInfo.Bits)},{nameof(BitCaluclatorInfo.Bytes)},{nameof(BitCaluclatorInfo.Kilobits)},{nameof(BitCaluclatorInfo.Kilobytes)},{nameof(BitCaluclatorInfo.Megabits)},{nameof(BitCaluclatorInfo.Megabytes)},{nameof(BitCaluclatorInfo.Gigabits)},{nameof(BitCaluclatorInfo.Gigabytes)},{nameof(BitCaluclatorInfo.Terabits)},{nameof(BitCaluclatorInfo.Terabytes)},{nameof(BitCaluclatorInfo.Petabits)},{nameof(BitCaluclatorInfo.Petabytes)}"); + + foreach (var info in collection) + stringBuilder.AppendLine( + $"{info.Bits},{info.Bytes},{info.Kilobits},{info.Kilobytes},{info.Megabits},{info.Megabytes},{info.Gigabits},{info.Gigabytes},{info.Terabits},{info.Terabytes},{info.Petabits},{info.Petabytes}"); + + File.WriteAllText(filePath, stringBuilder.ToString()); + } + + /// + /// Creates a XML file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateXml(IEnumerable collection, string filePath) + { + var document = new XDocument(DefaultXDeclaration, + new XElement(ApplicationName.BitCalculator.ToString(), + new XElement(nameof(BitCaluclatorInfo) + "s", + from info in collection + select + new XElement(nameof(BitCaluclatorInfo), + new XElement(nameof(BitCaluclatorInfo.Bits), info.Bits), + new XElement(nameof(BitCaluclatorInfo.Bytes), info.Bytes), + new XElement(nameof(BitCaluclatorInfo.Kilobits), info.Kilobits), + new XElement(nameof(BitCaluclatorInfo.Kilobytes), info.Kilobytes), + new XElement(nameof(BitCaluclatorInfo.Megabits), info.Megabits), + new XElement(nameof(BitCaluclatorInfo.Megabytes), info.Megabytes), + new XElement(nameof(BitCaluclatorInfo.Gigabits), info.Gigabits), + new XElement(nameof(BitCaluclatorInfo.Gigabytes), info.Gigabytes), + new XElement(nameof(BitCaluclatorInfo.Terabits), info.Terabits), + new XElement(nameof(BitCaluclatorInfo.Terabytes), info.Terabytes), + new XElement(nameof(BitCaluclatorInfo.Petabits), info.Petabits), + new XElement(nameof(BitCaluclatorInfo.Petabytes), info.Petabytes))))); + + document.Save(filePath); + } + + /// + /// Creates a JSON file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateJson(IReadOnlyList collection, string filePath) + { + var jsonData = new object[collection.Count]; + + for (var i = 0; i < collection.Count; i++) + jsonData[i] = new + { + collection[i].Bits, + collection[i].Bytes, + collection[i].Kilobits, + collection[i].Kilobytes, + collection[i].Megabits, + collection[i].Megabytes, + collection[i].Gigabits, + collection[i].Gigabytes, + collection[i].Terabits, + collection[i].Terabytes, + collection[i].Petabits, + collection[i].Petabytes + }; + + File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Export/ExportManager.ConnectionInfo.cs b/Source/NETworkManager.Models/Export/ExportManager.ConnectionInfo.cs new file mode 100644 index 0000000000..9458949fb2 --- /dev/null +++ b/Source/NETworkManager.Models/Export/ExportManager.ConnectionInfo.cs @@ -0,0 +1,114 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Xml.Linq; +using NETworkManager.Models.Network; +using NETworkManager.Utilities; +using Newtonsoft.Json; + +namespace NETworkManager.Models.Export; + +public static partial class ExportManager +{ + /// + /// Method to export objects from type to a file. + /// + /// Path to the export file. + /// Allowed are CSV, XML or JSON. + /// Objects as to export. + public static void Export(string filePath, ExportFileType fileType, IReadOnlyList collection) + { + switch (fileType) + { + case ExportFileType.Csv: + CreateCsv(collection, filePath); + break; + case ExportFileType.Xml: + CreateXml(collection, filePath); + break; + case ExportFileType.Json: + CreateJson(collection, filePath); + break; + case ExportFileType.Txt: + default: + throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); + } + } + + /// + /// Creates a CSV file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateCsv(IEnumerable collection, string filePath) + { + var stringBuilder = new StringBuilder(); + + stringBuilder.AppendLine( + $"{nameof(ConnectionInfo.Protocol)},{nameof(ConnectionInfo.LocalIPAddress)},{nameof(ConnectionInfo.LocalPort)},{nameof(ConnectionInfo.RemoteIPAddress)},{nameof(ConnectionInfo.RemotePort)},{nameof(ConnectionInfo.RemoteHostname)},{nameof(ConnectionInfo.TcpState)},{nameof(ConnectionInfo.ProcessId)},{nameof(ConnectionInfo.ProcessName)},{nameof(ConnectionInfo.ProcessPath)}" + ); + + foreach (var info in collection) + stringBuilder.AppendLine( + $"{info.Protocol},{info.LocalIPAddress},{info.LocalPort},{info.RemoteIPAddress},{info.RemotePort},{CsvHelper.QuoteString(info.RemoteHostname)},{info.TcpState},{info.ProcessId},{CsvHelper.QuoteString(info.ProcessName)},{CsvHelper.QuoteString(info.ProcessPath)}"); + + File.WriteAllText(filePath, stringBuilder.ToString()); + } + + /// + /// Creates a XML file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateXml(IEnumerable collection, string filePath) + { + var document = new XDocument(DefaultXDeclaration, + new XElement(ApplicationName.Connections.ToString(), + new XElement(nameof(ConnectionInfo) + "s", + from info in collection + select + new XElement(nameof(ConnectionInfo), + new XElement(nameof(ConnectionInfo.Protocol), info.Protocol), + new XElement(nameof(ConnectionInfo.LocalIPAddress), info.LocalIPAddress), + new XElement(nameof(ConnectionInfo.LocalPort), info.LocalPort), + new XElement(nameof(ConnectionInfo.RemoteIPAddress), info.RemoteIPAddress), + new XElement(nameof(ConnectionInfo.RemotePort), info.RemotePort), + new XElement(nameof(ConnectionInfo.RemoteHostname), info.RemoteHostname), + new XElement(nameof(ConnectionInfo.TcpState), info.TcpState), + new XElement(nameof(ConnectionInfo.ProcessId), info.ProcessId), + new XElement(nameof(ConnectionInfo.ProcessName), info.ProcessName), + new XElement(nameof(ConnectionInfo.ProcessPath), info.ProcessPath) + )))); + + document.Save(filePath); + } + + /// + /// Creates a JSON file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateJson(IReadOnlyList collection, string filePath) + { + var jsonData = new object[collection.Count]; + + for (var i = 0; i < collection.Count; i++) + jsonData[i] = new + { + Protocol = collection[i].Protocol.ToString(), + LocalIPAddress = collection[i].LocalIPAddress.ToString(), + collection[i].LocalPort, + RemoteIPAddress = collection[i].RemoteIPAddress.ToString(), + collection[i].RemotePort, + collection[i].RemoteHostname, + TcpState = collection[i].TcpState.ToString(), + collection[i].ProcessId, + collection[i].ProcessName, + collection[i].ProcessPath + }; + + File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Export/ExportManager.DNSLookupRecordInfo.cs b/Source/NETworkManager.Models/Export/ExportManager.DNSLookupRecordInfo.cs new file mode 100644 index 0000000000..7e56e5bc40 --- /dev/null +++ b/Source/NETworkManager.Models/Export/ExportManager.DNSLookupRecordInfo.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Xml.Linq; +using NETworkManager.Models.Network; +using Newtonsoft.Json; + +namespace NETworkManager.Models.Export; + +public static partial class ExportManager +{ + /// + /// Method to export objects from type to a file. + /// + /// Path to the export file. + /// Allowed are CSV, XML or JSON. + /// Objects as to export. + public static void Export(string filePath, ExportFileType fileType, + IReadOnlyList collection) + { + switch (fileType) + { + case ExportFileType.Csv: + CreateCsv(collection, filePath); + break; + case ExportFileType.Xml: + CreateXml(collection, filePath); + break; + case ExportFileType.Json: + CreateJson(collection, filePath); + break; + case ExportFileType.Txt: + default: + throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); + } + } + + /// + /// Creates a CSV file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateCsv(IEnumerable collection, string filePath) + { + var stringBuilder = new StringBuilder(); + + stringBuilder.AppendLine( + $"{nameof(DNSLookupRecordInfo.DomainName)},{nameof(DNSLookupRecordInfo.TTL)},{nameof(DNSLookupRecordInfo.RecordClass)},{nameof(DNSLookupRecordInfo.RecordType)},{nameof(DNSLookupRecordInfo.Result)},{nameof(DNSLookupRecordInfo.NameServerIPAddress)},{nameof(DNSLookupRecordInfo.NameServerHostName)},{nameof(DNSLookupRecordInfo.NameServerPort)}"); + + foreach (var info in collection) + stringBuilder.AppendLine( + $"{info.DomainName},{info.TTL},{info.RecordClass},{info.RecordType},{info.Result},{info.NameServerIPAddress},{info.NameServerHostName},{info.NameServerPort}"); + + File.WriteAllText(filePath, stringBuilder.ToString()); + } + + /// + /// Creates a XML file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateXml(IEnumerable collection, string filePath) + { + var document = new XDocument(DefaultXDeclaration, + new XElement(ApplicationName.DNSLookup.ToString(), + new XElement(nameof(DNSLookupRecordInfo) + "s", + from info in collection + select + new XElement(nameof(DNSLookupRecordInfo), + new XElement(nameof(DNSLookupRecordInfo.DomainName), info.DomainName), + new XElement(nameof(DNSLookupRecordInfo.TTL), info.TTL), + new XElement(nameof(DNSLookupRecordInfo.RecordClass), info.RecordClass), + new XElement(nameof(DNSLookupRecordInfo.RecordType), info.RecordType), + new XElement(nameof(DNSLookupRecordInfo.Result), info.Result), + new XElement(nameof(DNSLookupRecordInfo.NameServerIPAddress), info.NameServerIPAddress), + new XElement(nameof(DNSLookupRecordInfo.NameServerHostName), info.NameServerHostName), + new XElement(nameof(DNSLookupRecordInfo.NameServerPort), info.NameServerPort))))); + + document.Save(filePath); + } + + /// + /// Creates a JSON file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateJson(IReadOnlyList collection, string filePath) + { + var jsonData = new object[collection.Count]; + + for (var i = 0; i < collection.Count; i++) + jsonData[i] = new + { + collection[i].DomainName, + collection[i].TTL, + collection[i].RecordClass, + collection[i].RecordType, + collection[i].Result, + collection[i].NameServerIPAddress, + collection[i].NameServerHostName, + collection[i].NameServerPort + }; + + File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Export/ExportManager.DiscoveryProtocolPackageInfo.cs b/Source/NETworkManager.Models/Export/ExportManager.DiscoveryProtocolPackageInfo.cs new file mode 100644 index 0000000000..9e58a7f136 --- /dev/null +++ b/Source/NETworkManager.Models/Export/ExportManager.DiscoveryProtocolPackageInfo.cs @@ -0,0 +1,112 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Xml.Linq; +using NETworkManager.Models.Network; +using Newtonsoft.Json; + +namespace NETworkManager.Models.Export; + +public static partial class ExportManager +{ + /// + /// Method to export objects from type to a file. + /// + /// Path to the export file. + /// Allowed are CSV, XML or JSON. + /// Objects as to export. + public static void Export(string filePath, ExportFileType fileType, + IReadOnlyList collection) + { + switch (fileType) + { + case ExportFileType.Csv: + CreateCsv(collection, filePath); + break; + case ExportFileType.Xml: + CreateXml(collection, filePath); + break; + case ExportFileType.Json: + CreateJson(collection, filePath); + break; + case ExportFileType.Txt: + default: + throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); + } + } + + /// + /// Creates a CSV file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateCsv(IEnumerable collection, string filePath) + { + var stringBuilder = new StringBuilder(); + + + stringBuilder.AppendLine( + $"{nameof(DiscoveryProtocolPackageInfo.Device)},{nameof(DiscoveryProtocolPackageInfo.DeviceDescription)},{nameof(DiscoveryProtocolPackageInfo.Port)},{nameof(DiscoveryProtocolPackageInfo.PortDescription)},{nameof(DiscoveryProtocolPackageInfo.Model)},{nameof(DiscoveryProtocolPackageInfo.VLAN)},{nameof(DiscoveryProtocolPackageInfo.IPAddress)},{nameof(DiscoveryProtocolPackageInfo.Protocol)},{nameof(DiscoveryProtocolPackageInfo.TimeToLive)}"); + + foreach (var info in collection) + stringBuilder.AppendLine( + $"{info.Device},{info.DeviceDescription},{info.Port},{info.PortDescription},{info.Model},{info.VLAN},{info.IPAddress},{info.Protocol},{info.TimeToLive}"); + + File.WriteAllText(filePath, stringBuilder.ToString()); + } + + /// + /// Creates a XML file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateXml(IEnumerable collection, string filePath) + { + var document = new XDocument(DefaultXDeclaration, + new XElement(ApplicationName.DiscoveryProtocol.ToString(), + new XElement(nameof(DiscoveryProtocolPackageInfo) + "s", + from info in collection + select + new XElement(nameof(DiscoveryProtocolPackageInfo), + new XElement(nameof(DiscoveryProtocolPackageInfo.Device), info.Device), + new XElement(nameof(DiscoveryProtocolPackageInfo.DeviceDescription), + info.DeviceDescription), + new XElement(nameof(DiscoveryProtocolPackageInfo.Port), info.Port), + new XElement(nameof(DiscoveryProtocolPackageInfo.PortDescription), info.PortDescription), + new XElement(nameof(DiscoveryProtocolPackageInfo.Model), info.Model), + new XElement(nameof(DiscoveryProtocolPackageInfo.VLAN), info.VLAN), + new XElement(nameof(DiscoveryProtocolPackageInfo.IPAddress), info.IPAddress), + new XElement(nameof(DiscoveryProtocolPackageInfo.Protocol), info.Protocol), + new XElement(nameof(DiscoveryProtocolPackageInfo.TimeToLive), info.TimeToLive))))); + + document.Save(filePath); + } + + /// + /// Creates a JSON file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateJson(IReadOnlyList collection, string filePath) + { + var jsonData = new object[collection.Count]; + + for (var i = 0; i < collection.Count; i++) + jsonData[i] = new + { + collection[i].Device, + collection[i].DeviceDescription, + collection[i].Port, + collection[i].PortDescription, + collection[i].Model, + collection[i].VLAN, + collection[i].IPAddress, + collection[i].Protocol, + collection[i].TimeToLive + }; + + File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Export/ExportManager.ExportFileType.cs b/Source/NETworkManager.Models/Export/ExportManager.ExportFileType.cs deleted file mode 100644 index ed61ef2bd5..0000000000 --- a/Source/NETworkManager.Models/Export/ExportManager.ExportFileType.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace NETworkManager.Models.Export -{ - public static partial class ExportManager - { - public enum ExportFileType - { - CSV, - XML, - JSON, - TXT - } - } -} diff --git a/Source/NETworkManager.Models/Export/ExportManager.FirewallRule.cs b/Source/NETworkManager.Models/Export/ExportManager.FirewallRule.cs new file mode 100644 index 0000000000..ec8cb81f8f --- /dev/null +++ b/Source/NETworkManager.Models/Export/ExportManager.FirewallRule.cs @@ -0,0 +1,138 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Xml.Linq; +using NETworkManager.Models.Firewall; +using NETworkManager.Utilities; +using Newtonsoft.Json; + +namespace NETworkManager.Models.Export; + +public static partial class ExportManager +{ + /// + /// Method to export objects from type to a file. + /// + /// Path to the export file. + /// Allowed are CSV, XML or JSON. + /// Objects as to export. + public static void Export(string filePath, ExportFileType fileType, IReadOnlyList collection) + { + switch (fileType) + { + case ExportFileType.Csv: + CreateCsv(collection, filePath); + break; + case ExportFileType.Xml: + CreateXml(collection, filePath); + break; + case ExportFileType.Json: + CreateJson(collection, filePath); + break; + case ExportFileType.Txt: + default: + throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); + } + } + + /// + /// Creates a CSV file from the given collection. + /// + private static void CreateCsv(IEnumerable collection, string filePath) + { + var sb = new StringBuilder(); + + sb.AppendLine( + $"{nameof(FirewallRule.Name)}," + + $"{nameof(FirewallRule.IsEnabled)}," + + $"{nameof(FirewallRule.Direction)}," + + $"{nameof(FirewallRule.Action)}," + + $"{nameof(FirewallRule.Protocol)}," + + $"{nameof(FirewallRule.LocalPorts)}," + + $"{nameof(FirewallRule.RemotePorts)}," + + $"{nameof(FirewallRule.LocalAddresses)}," + + $"{nameof(FirewallRule.RemoteAddresses)}," + + $"{nameof(FirewallRule.NetworkProfiles)}," + + $"{nameof(FirewallRule.InterfaceType)}," + + $"{nameof(FirewallRule.Program)}," + + $"{nameof(FirewallRule.Description)}"); + + foreach (var rule in collection) + sb.AppendLine( + $"{CsvHelper.QuoteString(rule.Name)}," + + $"{rule.IsEnabled}," + + $"{rule.Direction}," + + $"{rule.Action}," + + $"{rule.Protocol}," + + $"{CsvHelper.QuoteString(rule.LocalPortsDisplay)}," + + $"{CsvHelper.QuoteString(rule.RemotePortsDisplay)}," + + $"{CsvHelper.QuoteString(rule.LocalAddressesDisplay)}," + + $"{CsvHelper.QuoteString(rule.RemoteAddressesDisplay)}," + + $"{CsvHelper.QuoteString(rule.NetworkProfilesDisplay)}," + + $"{rule.InterfaceType}," + + $"{CsvHelper.QuoteString(rule.ProgramDisplay)}," + + $"{CsvHelper.QuoteString(rule.Description)}"); + + File.WriteAllText(filePath, sb.ToString()); + } + + /// + /// Creates an XML file from the given collection. + /// + private static void CreateXml(IEnumerable collection, string filePath) + { + var document = new XDocument(DefaultXDeclaration, + new XElement(nameof(ApplicationName.Firewall), + new XElement(nameof(FirewallRule) + "s", + from rule in collection + select new XElement(nameof(FirewallRule), + new XElement(nameof(FirewallRule.Name), rule.Name), + new XElement(nameof(FirewallRule.IsEnabled), rule.IsEnabled), + new XElement(nameof(FirewallRule.Direction), rule.Direction), + new XElement(nameof(FirewallRule.Action), rule.Action), + new XElement(nameof(FirewallRule.Protocol), rule.Protocol), + new XElement(nameof(FirewallRule.LocalPorts), rule.LocalPortsDisplay), + new XElement(nameof(FirewallRule.RemotePorts), rule.RemotePortsDisplay), + new XElement(nameof(FirewallRule.LocalAddresses), rule.LocalAddressesDisplay), + new XElement(nameof(FirewallRule.RemoteAddresses), rule.RemoteAddressesDisplay), + new XElement(nameof(FirewallRule.NetworkProfiles), rule.NetworkProfilesDisplay), + new XElement(nameof(FirewallRule.InterfaceType), rule.InterfaceType), + new XElement(nameof(FirewallRule.Program), rule.ProgramDisplay), + new XElement(nameof(FirewallRule.Description), rule.Description))))); + + document.Save(filePath); + } + + /// + /// Creates a JSON file from the given collection. + /// + private static void CreateJson(IReadOnlyList collection, string filePath) + { + var jsonData = new object[collection.Count]; + + for (var i = 0; i < collection.Count; i++) + { + var rule = collection[i]; + jsonData[i] = new + { + rule.Name, + rule.IsEnabled, + Direction = rule.Direction.ToString(), + Action = rule.Action.ToString(), + Protocol = rule.Protocol.ToString(), + LocalPorts = rule.LocalPortsDisplay, + RemotePorts = rule.RemotePortsDisplay, + LocalAddresses = rule.LocalAddressesDisplay, + RemoteAddresses = rule.RemoteAddressesDisplay, + NetworkProfiles = rule.NetworkProfilesDisplay, + InterfaceType = rule.InterfaceType.ToString(), + Program = rule.ProgramDisplay, + rule.Description + }; + } + + File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Export/ExportManager.HostsFileEntry.cs b/Source/NETworkManager.Models/Export/ExportManager.HostsFileEntry.cs new file mode 100644 index 0000000000..2eb7ae3e58 --- /dev/null +++ b/Source/NETworkManager.Models/Export/ExportManager.HostsFileEntry.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Xml.Linq; +using NETworkManager.Models.HostsFileEditor; +using Newtonsoft.Json; + +namespace NETworkManager.Models.Export; + +public static partial class ExportManager +{ + /// + /// Method to export objects from type to a file. + /// + /// Path to the export file. + /// Allowed are CSV, XML or JSON. + /// Objects as to export. + public static void Export(string filePath, ExportFileType fileType, IReadOnlyList collection) + { + switch (fileType) + { + case ExportFileType.Csv: + CreateCsv(collection, filePath); + break; + case ExportFileType.Xml: + CreateXml(collection, filePath); + break; + case ExportFileType.Json: + CreateJson(collection, filePath); + break; + case ExportFileType.Txt: + default: + throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); + } + } + + /// + /// Creates a CSV file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateCsv(IEnumerable collection, string filePath) + { + var stringBuilder = new StringBuilder(); + + stringBuilder.AppendLine( + $"{nameof(HostsFileEntry.IsEnabled)},{nameof(HostsFileEntry.IPAddress)},{nameof(HostsFileEntry.Hostname)},{nameof(HostsFileEntry.Comment)}"); + + foreach (var info in collection) + stringBuilder.AppendLine($"{info.IsEnabled},{info.IPAddress},{info.Hostname},{info.Comment}"); + + File.WriteAllText(filePath, stringBuilder.ToString()); + } + + /// + /// Creates a XML file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateXml(IEnumerable collection, string filePath) + { + var document = new XDocument(DefaultXDeclaration, + new XElement(ApplicationName.HostsFileEditor.ToString(), + new XElement(nameof(HostsFileEntry) + "s", + from info in collection + select + new XElement(nameof(HostsFileEntry), + new XElement(nameof(HostsFileEntry.IsEnabled), info.IsEnabled), + new XElement(nameof(HostsFileEntry.IPAddress), info.IPAddress), + new XElement(nameof(HostsFileEntry.Hostname), info.Hostname), + new XElement(nameof(HostsFileEntry.Comment), info.Comment))))); + + document.Save(filePath); + } + + /// + /// Creates a JSON file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateJson(IReadOnlyList collection, string filePath) + { + var jsonData = new object[collection.Count]; + + for (var i = 0; i < collection.Count; i++) + jsonData[i] = new + { + collection[i].IsEnabled, + collection[i].IPAddress, + collection[i].Hostname, + collection[i].Comment + }; + + File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); + } +} diff --git a/Source/NETworkManager.Models/Export/ExportManager.IPGeolocationInfo.cs b/Source/NETworkManager.Models/Export/ExportManager.IPGeolocationInfo.cs new file mode 100644 index 0000000000..b54a3cb185 --- /dev/null +++ b/Source/NETworkManager.Models/Export/ExportManager.IPGeolocationInfo.cs @@ -0,0 +1,139 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Xml.Linq; +using NETworkManager.Models.IPApi; +using Newtonsoft.Json; + +namespace NETworkManager.Models.Export; + +public static partial class ExportManager +{ + /// + /// Method to export objects from type to a file. + /// + /// Path to the export file. + /// Allowed are CSV, XML or JSON. + /// Objects as to export. + public static void Export(string filePath, ExportFileType fileType, IReadOnlyList collection) + { + switch (fileType) + { + case ExportFileType.Csv: + CreateCsv(collection, filePath); + break; + case ExportFileType.Xml: + CreateXml(collection, filePath); + break; + case ExportFileType.Json: + CreateJson(collection, filePath); + break; + case ExportFileType.Txt: + default: + throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); + } + } + + /// + /// Creates a CSV file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateCsv(IEnumerable collection, string filePath) + { + var stringBuilder = new StringBuilder(); + + stringBuilder.AppendLine( + $"{nameof(IPGeolocationInfo.Status)},{nameof(IPGeolocationInfo.Continent)},{nameof(IPGeolocationInfo.ContinentCode)},{nameof(IPGeolocationInfo.Country)},{nameof(IPGeolocationInfo.CountryCode)},{nameof(IPGeolocationInfo.Region)},{nameof(IPGeolocationInfo.RegionName)},{nameof(IPGeolocationInfo.City)},{nameof(IPGeolocationInfo.District)},{nameof(IPGeolocationInfo.Zip)},{nameof(IPGeolocationInfo.Lat)},{nameof(IPGeolocationInfo.Lon)},{nameof(IPGeolocationInfo.Timezone)},{nameof(IPGeolocationInfo.Offset)},{nameof(IPGeolocationInfo.Currency)},{nameof(IPGeolocationInfo.Isp)},{nameof(IPGeolocationInfo.Org)},{nameof(IPGeolocationInfo.As)},{nameof(IPGeolocationInfo.Asname)},{nameof(IPGeolocationInfo.Reverse)},{nameof(IPGeolocationInfo.Mobile)},{nameof(IPGeolocationInfo.Proxy)},{nameof(IPGeolocationInfo.Hosting)},{nameof(IPGeolocationInfo.Query)}"); + + foreach (var info in collection) + stringBuilder.AppendLine( + $"{info.Status},{info.Continent},{info.ContinentCode},{info.Country},{info.CountryCode},{info.Region},{info.RegionName},{info.City},{info.District},{info.Zip},{info.Lat},{info.Lon},{info.Timezone},{info.Offset},{info.Currency},{info.Isp},{info.Org},{info.As},{info.Asname},{info.Reverse},{info.Mobile},{info.Proxy},{info.Hosting},{info.Query}"); + + File.WriteAllText(filePath, stringBuilder.ToString()); + } + + /// + /// Creates a XML file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateXml(IEnumerable collection, string filePath) + { + var document = new XDocument(DefaultXDeclaration, + new XElement(ApplicationName.IPGeolocation.ToString(), + new XElement(nameof(IPGeolocationInfo) + "s", + from info in collection + select + new XElement(nameof(IPGeolocationInfo), + new XElement(nameof(IPGeolocationInfo.Status), info.Status), + new XElement(nameof(IPGeolocationInfo.Continent), info.Continent), + new XElement(nameof(IPGeolocationInfo.ContinentCode), info.ContinentCode), + new XElement(nameof(IPGeolocationInfo.Country), info.Country), + new XElement(nameof(IPGeolocationInfo.CountryCode), info.CountryCode), + new XElement(nameof(IPGeolocationInfo.Region), info.Region), + new XElement(nameof(IPGeolocationInfo.RegionName), info.RegionName), + new XElement(nameof(IPGeolocationInfo.City), info.City), + new XElement(nameof(IPGeolocationInfo.District), info.District), + new XElement(nameof(IPGeolocationInfo.Zip), info.Zip), + new XElement(nameof(IPGeolocationInfo.Lat), info.Lat), + new XElement(nameof(IPGeolocationInfo.Lon), info.Lon), + new XElement(nameof(IPGeolocationInfo.Timezone), info.Timezone), + new XElement(nameof(IPGeolocationInfo.Offset), info.Offset), + new XElement(nameof(IPGeolocationInfo.Currency), info.Currency), + new XElement(nameof(IPGeolocationInfo.Isp), info.Isp), + new XElement(nameof(IPGeolocationInfo.Org), info.Org), + new XElement(nameof(IPGeolocationInfo.As), info.As), + new XElement(nameof(IPGeolocationInfo.Asname), info.Asname), + new XElement(nameof(IPGeolocationInfo.Reverse), info.Reverse), + new XElement(nameof(IPGeolocationInfo.Mobile), info.Mobile), + new XElement(nameof(IPGeolocationInfo.Proxy), info.Proxy), + new XElement(nameof(IPGeolocationInfo.Hosting), info.Hosting), + new XElement(nameof(IPGeolocationInfo.Query), info.Query))))); + + document.Save(filePath); + } + + /// + /// Creates a JSON file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateJson(IReadOnlyList collection, string filePath) + { + var jsonData = new object[collection.Count]; + + for (var i = 0; i < collection.Count; i++) + jsonData[i] = new + { + collection[i].Status, + collection[i].Continent, + collection[i].ContinentCode, + collection[i].Country, + collection[i].CountryCode, + collection[i].Region, + collection[i].RegionName, + collection[i].City, + collection[i].District, + collection[i].Zip, + collection[i].Lat, + collection[i].Lon, + collection[i].Timezone, + collection[i].Offset, + collection[i].Currency, + collection[i].Isp, + collection[i].Org, + collection[i].As, + collection[i].Asname, + collection[i].Reverse, + collection[i].Mobile, + collection[i].Proxy, + collection[i].Hosting, + collection[i].Query + }; + + File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Export/ExportManager.IPNetworkInfo.cs b/Source/NETworkManager.Models/Export/ExportManager.IPNetworkInfo.cs new file mode 100644 index 0000000000..7af1f7de6b --- /dev/null +++ b/Source/NETworkManager.Models/Export/ExportManager.IPNetworkInfo.cs @@ -0,0 +1,107 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Xml.Linq; +using NETworkManager.Models.Network; +using Newtonsoft.Json; + +namespace NETworkManager.Models.Export; + +public static partial class ExportManager +{ + /// + /// Method to export objects from type to a file. + /// + /// Path to the export file. + /// Allowed are CSV, XML or JSON. + /// Objects as to export. + public static void Export(string filePath, ExportFileType fileType, IReadOnlyList collection) + { + switch (fileType) + { + case ExportFileType.Csv: + CreateCsv(collection, filePath); + break; + case ExportFileType.Xml: + CreateXml(collection, filePath); + break; + case ExportFileType.Json: + CreateJson(collection, filePath); + break; + case ExportFileType.Txt: + default: + throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); + } + } + + /// + /// Creates a CSV file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateCsv(IEnumerable collection, string filePath) + { + var stringBuilder = new StringBuilder(); + + stringBuilder.AppendLine( + $"{nameof(IPNetworkInfo.Network)},{nameof(IPNetworkInfo.Broadcast)},{nameof(IPNetworkInfo.Total)},{nameof(IPNetworkInfo.Netmask)},{nameof(IPNetworkInfo.Cidr)},{nameof(IPNetworkInfo.FirstUsable)},{nameof(IPNetworkInfo.LastUsable)},{nameof(IPNetworkInfo.Usable)}"); + + foreach (var info in collection) + stringBuilder.AppendLine( + $"{info.Network},{info.Broadcast},{info.Total},{info.Netmask},{info.Cidr},{info.FirstUsable},{info.LastUsable},{info.Usable}"); + + File.WriteAllText(filePath, stringBuilder.ToString()); + } + + /// + /// Creates a XML file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateXml(IEnumerable collection, string filePath) + { + var document = new XDocument(DefaultXDeclaration, + new XElement(ApplicationName.SubnetCalculator.ToString(), + new XElement(nameof(IPNetworkInfo) + "s", + from info in collection + select + new XElement(nameof(IPNetworkInfo), + new XElement(nameof(IPNetworkInfo.Network), info.Network), + new XElement(nameof(IPNetworkInfo.Broadcast), info.Broadcast), + new XElement(nameof(IPNetworkInfo.Total), info.Total), + new XElement(nameof(IPNetworkInfo.Netmask), info.Netmask), + new XElement(nameof(IPNetworkInfo.Cidr), info.Cidr), + new XElement(nameof(IPNetworkInfo.FirstUsable), info.FirstUsable), + new XElement(nameof(IPNetworkInfo.LastUsable), info.LastUsable), + new XElement(nameof(IPNetworkInfo.Usable), info.Usable))))); + + document.Save(filePath); + } + + /// + /// Creates a JSON file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateJson(IReadOnlyList collection, string filePath) + { + var jsonData = new object[collection.Count]; + + for (var i = 0; i < collection.Count; i++) + jsonData[i] = new + { + Network = collection[i].Network.ToString(), + Broadcast = collection[i].Broadcast.ToString(), + collection[i].Total, + Netmask = collection[i].Netmask.ToString(), + collection[i].Cidr, + FirstUsable = collection[i].FirstUsable.ToString(), + LastUsable = collection[i].LastUsable.ToString(), + collection[i].Usable + }; + + File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Export/ExportManager.IPScannerHostInfo.cs b/Source/NETworkManager.Models/Export/ExportManager.IPScannerHostInfo.cs new file mode 100644 index 0000000000..07ab949f82 --- /dev/null +++ b/Source/NETworkManager.Models/Export/ExportManager.IPScannerHostInfo.cs @@ -0,0 +1,224 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Xml.Linq; +using NETworkManager.Models.Network; +using NETworkManager.Utilities; +using Newtonsoft.Json; + +namespace NETworkManager.Models.Export; + +public static partial class ExportManager +{ + /// + /// Method to export objects from type to a file. + /// + /// Path to the export file. + /// Allowed are CSV, XML or JSON. + /// Objects as to export. + public static void Export(string filePath, ExportFileType fileType, + IReadOnlyList collection) + { + switch (fileType) + { + case ExportFileType.Csv: + CreateCsv(collection, filePath); + break; + case ExportFileType.Xml: + CreateXml(collection, filePath); + break; + case ExportFileType.Json: + CreateJson(collection, filePath); + break; + case ExportFileType.Txt: + default: + throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); + } + } + + /// + /// Creates a CSV file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateCsv(IEnumerable collection, string filePath) + { + var stringBuilder = new StringBuilder(); + + stringBuilder.AppendLine( + $"{nameof(IPScannerHostInfo.IsReachable)}," + + $"{nameof(PingInfo.IPAddress)}," + + $"{nameof(IPScannerHostInfo.Hostname)}," + + $"PingStatus," + + $"{nameof(PingInfo.Timestamp)}," + + $"{nameof(PingInfo.Time)}," + + $"{nameof(PingInfo.TTL)}," + + $"{nameof(PingInfo.Bytes)}," + + $"PortStatus," + + $"{nameof(IPScannerHostInfo.Ports)}," + + $"NetBIOSIsReachable," + + $"NetBIOSIPAddress," + + $"NetBIOSComputerName," + + $"NetBIOSUserName," + + $"NetBIOSGroupName," + + $"NetBIOSMACAddress," + + $"NetBIOSVendor," + + $"{nameof(IPScannerHostInfo.MACAddress)}," + + $"{nameof(IPScannerHostInfo.Vendor)}" + ); + + foreach (var info in collection) + { + // Skip if critical data is null + if (info?.PingInfo == null) + continue; + + var stringBuilderPorts = new StringBuilder(); + + if (info.Ports != null) + { + foreach (var port in info.Ports) + stringBuilderPorts.Append( + $"{port.Port}/{port.LookupInfo.Protocol}/{port.LookupInfo.Service}/{port.LookupInfo.Description}/{port.State};"); + } + + stringBuilder.AppendLine( + $"{info.IsReachable}," + + $"{info.PingInfo.IPAddress}," + + $"{CsvHelper.QuoteString(info.Hostname)}," + + $"{info.PingInfo.Status}," + + $"{DateTimeHelper.DateTimeToFullDateTimeString(info.PingInfo.Timestamp)}," + + $"{Ping.TimeToString(info.PingInfo.Status, info.PingInfo.Time, true)}," + + $"{info.PingInfo.TTL}," + + $"{info.PingInfo.Bytes}," + + $"{(info.IsAnyPortOpen ? PortState.Open : PortState.Closed)}," + + $"{CsvHelper.QuoteString(stringBuilderPorts.ToString().TrimEnd(';'))}," + + $"{info.NetBIOSInfo?.IsReachable}," + + $"{info.NetBIOSInfo?.IPAddress}," + + $"{CsvHelper.QuoteString(info.NetBIOSInfo?.ComputerName)}," + + $"{CsvHelper.QuoteString(info.NetBIOSInfo?.UserName)}," + + $"{CsvHelper.QuoteString(info.NetBIOSInfo?.GroupName)}," + + $"{info.NetBIOSInfo?.MACAddress}," + + $"{CsvHelper.QuoteString(info.NetBIOSInfo?.Vendor)}," + + $"{info.MACAddress}," + + $"{CsvHelper.QuoteString(info.Vendor)}" + ); + } + + File.WriteAllText(filePath, stringBuilder.ToString()); + } + + /// + /// Creates a XML file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateXml(IEnumerable collection, string filePath) + { + var document = new XDocument(DefaultXDeclaration, + new XElement(ApplicationName.IPScanner.ToString(), + new XElement(nameof(IPScannerHostInfo) + "s", + from info in collection + where info?.PingInfo != null + select + new XElement(nameof(IPScannerHostInfo), + new XElement(nameof(IPScannerHostInfo.IsReachable), info.IsReachable), + new XElement(nameof(PingInfo.IPAddress), info.PingInfo.IPAddress), + new XElement(nameof(IPScannerHostInfo.Hostname), info.Hostname), + new XElement("PingStatus", info.PingInfo.Status), + new XElement(nameof(PingInfo.Timestamp), + DateTimeHelper.DateTimeToFullDateTimeString(info.PingInfo.Timestamp)), + new XElement(nameof(PingInfo.Time), + Ping.TimeToString(info.PingInfo.Status, info.PingInfo.Time, true)), + new XElement(nameof(PingInfo.TTL), info.PingInfo.TTL), + new XElement(nameof(PingInfo.Bytes), info.PingInfo.Bytes), + new XElement("PortStatus", info.IsAnyPortOpen ? PortState.Open : PortState.Closed), + info.Ports != null + ? from port in info.Ports + select new XElement(nameof(PortInfo), + new XElement(nameof(PortInfo.Port), port.Port), + new XElement(nameof(PortInfo.LookupInfo.Protocol), port.LookupInfo.Protocol), + new XElement(nameof(PortInfo.LookupInfo.Service), port.LookupInfo.Service), + new XElement(nameof(PortInfo.LookupInfo.Description), port.LookupInfo.Description), + new XElement(nameof(PortInfo.State), port.State)) + : Enumerable.Empty(), + new XElement("NetBIOSIsReachable", info.NetBIOSInfo?.IsReachable), + new XElement("NetBIOSIPAddress", info.NetBIOSInfo?.IPAddress), + new XElement("NetBIOSComputerName", info.NetBIOSInfo?.ComputerName), + new XElement("NetBIOSUserName", info.NetBIOSInfo?.UserName), + new XElement("NetBIOSGroupName", info.NetBIOSInfo?.GroupName), + new XElement("NetBIOSMACAddress", info.NetBIOSInfo?.MACAddress), + new XElement("NetBIOSVendor", info.NetBIOSInfo?.Vendor), + new XElement(nameof(IPScannerHostInfo.MACAddress), info.MACAddress), + new XElement(nameof(IPScannerHostInfo.Vendor), info.Vendor) + ) + ) + ) + ); + + document.Save(filePath); + } + + /// + /// Creates a JSON file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateJson(IReadOnlyList collection, string filePath) + { + var validCollection = collection.Where(info => info?.PingInfo != null).ToList(); + var jsonData = new object[validCollection.Count]; + + for (var i = 0; i < validCollection.Count; i++) + { + var info = validCollection[i]; + object[] jsonDataPorts; + + if (info.Ports != null && info.Ports.Count > 0) + { + jsonDataPorts = new object[info.Ports.Count]; + for (var j = 0; j < info.Ports.Count; j++) + jsonDataPorts[j] = new + { + info.Ports[j].Port, + Protocol = info.Ports[j].LookupInfo.Protocol.ToString(), + info.Ports[j].LookupInfo.Service, + info.Ports[j].LookupInfo.Description, + State = info.Ports[j].State.ToString() + }; + } + else + { + jsonDataPorts = Array.Empty(); + } + + jsonData[i] = new + { + info.IsReachable, + IPAddress = info.PingInfo.IPAddress.ToString(), + info.Hostname, + PingStatus = info.PingInfo.Status.ToString(), + Timestamp = DateTimeHelper.DateTimeToFullDateTimeString(info.PingInfo.Timestamp), + Time = Ping.TimeToString(info.PingInfo.Status, info.PingInfo.Time, true), + info.PingInfo.TTL, + info.PingInfo.Bytes, + info.DNSHostname, + PortStatus = info.IsAnyPortOpen ? PortState.Open.ToString() : PortState.Closed.ToString(), + Ports = jsonDataPorts, + NetBIOSIsReachable = info.NetBIOSInfo?.IsReachable, + NetBIOSIPAddress = info.NetBIOSInfo?.IPAddress?.ToString(), + NetBIOSComputerName = info.NetBIOSInfo?.ComputerName, + NetBIOSUserName = info.NetBIOSInfo?.UserName, + NetBIOSGroupName = info.NetBIOSInfo?.GroupName, + NetBIOSMACAddress = info.NetBIOSInfo?.MACAddress, + NetBIOSVendor = info.NetBIOSInfo?.Vendor, + info.MACAddress, + info.Vendor + }; + } + + File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Export/ExportManager.ListenerInfo.cs b/Source/NETworkManager.Models/Export/ExportManager.ListenerInfo.cs new file mode 100644 index 0000000000..3ddf23c2f9 --- /dev/null +++ b/Source/NETworkManager.Models/Export/ExportManager.ListenerInfo.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Xml.Linq; +using NETworkManager.Models.Network; +using Newtonsoft.Json; + +namespace NETworkManager.Models.Export; + +public static partial class ExportManager +{ + /// + /// Method to export objects from type to a file. + /// + /// Path to the export file. + /// Allowed are CSV, XML or JSON. + /// Objects as to export. + public static void Export(string filePath, ExportFileType fileType, IReadOnlyList collection) + { + switch (fileType) + { + case ExportFileType.Csv: + CreateCsv(collection, filePath); + break; + case ExportFileType.Xml: + CreateXml(collection, filePath); + break; + case ExportFileType.Json: + CreateJson(collection, filePath); + break; + case ExportFileType.Txt: + default: + throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); + } + } + + /// + /// Creates a CSV file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateCsv(IEnumerable collection, string filePath) + { + var stringBuilder = new StringBuilder(); + + stringBuilder.AppendLine( + $"{nameof(ListenerInfo.Protocol)},{nameof(ListenerInfo.IPAddress)},{nameof(ListenerInfo.Port)}"); + + foreach (var info in collection) + stringBuilder.AppendLine($"{info.Protocol},{info.IPAddress},{info.Port}"); + + File.WriteAllText(filePath, stringBuilder.ToString()); + } + + /// + /// Creates a XML file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateXml(IEnumerable collection, string filePath) + { + var document = new XDocument(DefaultXDeclaration, + new XElement(ApplicationName.Listeners.ToString(), + new XElement(nameof(ListenerInfo) + "s", + from info in collection + select + new XElement(nameof(ListenerInfo), + new XElement(nameof(ListenerInfo.Protocol), info.Protocol), + new XElement(nameof(ListenerInfo.IPAddress), info.IPAddress), + new XElement(nameof(ListenerInfo.Port), info.Port))))); + + document.Save(filePath); + } + + /// + /// Creates a JSON file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateJson(IReadOnlyList collection, string filePath) + { + var jsonData = new object[collection.Count]; + + for (var i = 0; i < collection.Count; i++) + jsonData[i] = new + { + Protocol = collection[i].Protocol.ToString(), + IPAddress = collection[i].IPAddress.ToString(), + collection[i].Port + }; + + File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Export/ExportManager.NeighborInfo.cs b/Source/NETworkManager.Models/Export/ExportManager.NeighborInfo.cs new file mode 100644 index 0000000000..af6e501d11 --- /dev/null +++ b/Source/NETworkManager.Models/Export/ExportManager.NeighborInfo.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Xml.Linq; +using NETworkManager.Models.Network; +using NETworkManager.Utilities; +using Newtonsoft.Json; + +namespace NETworkManager.Models.Export; + +public static partial class ExportManager +{ + /// + /// Method to export objects from type to a file. + /// + /// Path to the export file. + /// Allowed are CSV, XML or JSON. + /// Objects as to export. + public static void Export(string filePath, ExportFileType fileType, IReadOnlyList collection) + { + switch (fileType) + { + case ExportFileType.Csv: + CreateCsv(collection, filePath); + break; + case ExportFileType.Xml: + CreateXml(collection, filePath); + break; + case ExportFileType.Json: + CreateJson(collection, filePath); + break; + case ExportFileType.Txt: + default: + throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); + } + } + + /// + /// Creates a CSV file from the given collection. + /// + private static void CreateCsv(IEnumerable collection, string filePath) + { + var stringBuilder = new StringBuilder(); + + stringBuilder.AppendLine( + $"{nameof(NeighborInfo.IPAddress)},{nameof(NeighborInfo.MACAddress)},{nameof(NeighborInfo.InterfaceAlias)},{nameof(NeighborInfo.InterfaceIndex)},{nameof(NeighborInfo.State)},{nameof(NeighborInfo.AddressFamily)},{nameof(NeighborInfo.IsMulticast)}"); + + foreach (var info in collection) + stringBuilder.AppendLine( + $"{info.IPAddress},{info.MACAddress},{CsvHelper.QuoteString(info.InterfaceAlias)},{info.InterfaceIndex},{info.State},{info.AddressFamily},{info.IsMulticast}"); + + File.WriteAllText(filePath, stringBuilder.ToString()); + } + + /// + /// Creates an XML file from the given collection. + /// + private static void CreateXml(IEnumerable collection, string filePath) + { + var document = new XDocument(DefaultXDeclaration, + new XElement(ApplicationName.NeighborTable.ToString(), + new XElement(nameof(NeighborInfo) + "s", + from info in collection + select + new XElement(nameof(NeighborInfo), + new XElement(nameof(NeighborInfo.IPAddress), info.IPAddress), + new XElement(nameof(NeighborInfo.MACAddress), info.MACAddress), + new XElement(nameof(NeighborInfo.InterfaceAlias), info.InterfaceAlias), + new XElement(nameof(NeighborInfo.InterfaceIndex), info.InterfaceIndex), + new XElement(nameof(NeighborInfo.State), info.State), + new XElement(nameof(NeighborInfo.AddressFamily), info.AddressFamily), + new XElement(nameof(NeighborInfo.IsMulticast), info.IsMulticast))))); + + document.Save(filePath); + } + + /// + /// Creates a JSON file from the given collection. + /// + private static void CreateJson(IReadOnlyList collection, string filePath) + { + var jsonData = new object[collection.Count]; + + for (var i = 0; i < collection.Count; i++) + jsonData[i] = new + { + IPAddress = collection[i].IPAddress.ToString(), + MACAddress = collection[i].MACAddress.ToString(), + collection[i].InterfaceAlias, + collection[i].InterfaceIndex, + State = collection[i].State.ToString(), + AddressFamily = collection[i].AddressFamily.ToString(), + collection[i].IsMulticast + }; + + File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); + } +} diff --git a/Source/NETworkManager.Models/Export/ExportManager.NetworkInterface.cs b/Source/NETworkManager.Models/Export/ExportManager.NetworkInterface.cs new file mode 100644 index 0000000000..6b28e6b4f9 --- /dev/null +++ b/Source/NETworkManager.Models/Export/ExportManager.NetworkInterface.cs @@ -0,0 +1,146 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Xml.Linq; +using NETworkManager.Models.Network; +using Newtonsoft.Json; + +namespace NETworkManager.Models.Export; + +public static partial class ExportManager +{ + /// + /// Method to export objects from type to a file. + /// + /// Path to the export file. + /// Allowed are CSV, XML or JSON. + /// Objects as to export. + public static void Export(string filePath, ExportFileType fileType, IReadOnlyList collection) + { + switch (fileType) + { + case ExportFileType.Csv: + CreateCsv(collection, filePath); + break; + case ExportFileType.Xml: + CreateXml(collection, filePath); + break; + case ExportFileType.Json: + CreateJson(collection, filePath); + break; + case ExportFileType.Txt: + default: + throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); + } + } + + /// + /// Creates a CSV file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateCsv(IEnumerable collection, string filePath) + { + var stringBuilder = new StringBuilder(); + + stringBuilder.AppendLine( + $"{nameof(NetworkInterfaceInfo.Id)},{nameof(NetworkInterfaceInfo.Name)},{nameof(NetworkInterfaceInfo.Description)},{nameof(NetworkInterfaceInfo.Type)},{nameof(NetworkInterfaceInfo.PhysicalAddress)},{nameof(NetworkInterfaceInfo.Status)},{nameof(NetworkInterfaceInfo.IsOperational)},{nameof(NetworkInterfaceInfo.Speed)},{nameof(NetworkInterfaceInfo.IPv4ProtocolAvailable)},{nameof(NetworkInterfaceInfo.IPv4Address)},{nameof(NetworkInterfaceInfo.IPv4Gateway)},{nameof(NetworkInterfaceInfo.DhcpEnabled)},{nameof(NetworkInterfaceInfo.DhcpServer)},{nameof(NetworkInterfaceInfo.DhcpLeaseObtained)},{nameof(NetworkInterfaceInfo.DhcpLeaseExpires)},{nameof(NetworkInterfaceInfo.IPv6ProtocolAvailable)},{nameof(NetworkInterfaceInfo.IPv6Address)},{nameof(NetworkInterfaceInfo.IPv6AddressLinkLocal)},{nameof(NetworkInterfaceInfo.IPv6Gateway)},{nameof(NetworkInterfaceInfo.DNSAutoconfigurationEnabled)},{nameof(NetworkInterfaceInfo.DNSSuffix)},{nameof(NetworkInterfaceInfo.DNSServer)}"); + + foreach (var info in collection) + stringBuilder.AppendLine( + $"{info.Id},{info.Name},{info.Description},{info.Type},{info.PhysicalAddress},{info.Status},{info.IsOperational},{info.Speed},{info.IPv4ProtocolAvailable},{IPv4Address.ConvertIPAddressWithSubnetmaskListToString(info.IPv4Address, ";")},{IPv4Address.ConvertIPAddressListToString(info.IPv4Gateway, ";")},{info.DhcpEnabled},{IPv4Address.ConvertIPAddressListToString(info.DhcpServer, ";")},{info.DhcpLeaseObtained},{info.DhcpLeaseExpires},{info.IPv6ProtocolAvailable},{IPv4Address.ConvertIPAddressListToString(info.IPv6Address, ";")},{IPv4Address.ConvertIPAddressListToString(info.IPv6AddressLinkLocal, ";")},{IPv4Address.ConvertIPAddressListToString(info.IPv6Gateway, ";")},{info.DNSAutoconfigurationEnabled},{info.DNSSuffix},{IPv4Address.ConvertIPAddressListToString(info.DNSServer, ";")}"); + + File.WriteAllText(filePath, stringBuilder.ToString()); + } + + /// + /// Creates a XML file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateXml(IEnumerable collection, string filePath) + { + var document = new XDocument(DefaultXDeclaration, + new XElement(ApplicationName.NetworkInterface.ToString(), + new XElement(nameof(NetworkInterfaceInfo) + "s", + from info in collection + select + new XElement(nameof(NetworkInterfaceInfo), + new XElement(nameof(NetworkInterfaceInfo.Id), info.Id), + new XElement(nameof(NetworkInterfaceInfo.Name), info.Name), + new XElement(nameof(NetworkInterfaceInfo.Description), info.Description), + new XElement(nameof(NetworkInterfaceInfo.Type), info.Type), + new XElement(nameof(NetworkInterfaceInfo.PhysicalAddress), info.PhysicalAddress), + new XElement(nameof(NetworkInterfaceInfo.Status), info.Status), + new XElement(nameof(NetworkInterfaceInfo.IsOperational), info.IsOperational), + new XElement(nameof(NetworkInterfaceInfo.Speed), info.Speed), + new XElement(nameof(NetworkInterfaceInfo.IPv4ProtocolAvailable), + info.IPv4ProtocolAvailable), + new XElement(nameof(NetworkInterfaceInfo.IPv4Address), + IPv4Address.ConvertIPAddressWithSubnetmaskListToString(info.IPv4Address, ";")), + new XElement(nameof(NetworkInterfaceInfo.IPv4Gateway), + IPv4Address.ConvertIPAddressListToString(info.IPv4Gateway, ";")), + new XElement(nameof(NetworkInterfaceInfo.DhcpEnabled), info.DhcpEnabled), + new XElement(nameof(NetworkInterfaceInfo.DhcpServer), + IPv4Address.ConvertIPAddressListToString(info.DhcpServer, ";")), + new XElement(nameof(NetworkInterfaceInfo.DhcpLeaseObtained), info.DhcpLeaseObtained), + new XElement(nameof(NetworkInterfaceInfo.DhcpLeaseExpires), info.DhcpLeaseExpires), + new XElement(nameof(NetworkInterfaceInfo.IPv6ProtocolAvailable), + info.IPv6ProtocolAvailable), + new XElement(nameof(NetworkInterfaceInfo.IPv6Address), + IPv4Address.ConvertIPAddressListToString(info.IPv6Address, ";")), + new XElement(nameof(NetworkInterfaceInfo.IPv6AddressLinkLocal), + IPv4Address.ConvertIPAddressListToString(info.IPv6AddressLinkLocal, ";")), + new XElement(nameof(NetworkInterfaceInfo.IPv6Gateway), + IPv4Address.ConvertIPAddressListToString(info.IPv6Gateway, ";")), + new XElement(nameof(NetworkInterfaceInfo.DNSAutoconfigurationEnabled), + info.DNSAutoconfigurationEnabled), + new XElement(nameof(NetworkInterfaceInfo.DNSSuffix), info.DNSSuffix), + new XElement(nameof(NetworkInterfaceInfo.DNSServer), + IPv4Address.ConvertIPAddressListToString(info.DNSServer, ";")))))); + + document.Save(filePath); + } + + /// + /// Creates a JSON file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateJson(IReadOnlyList collection, string filePath) + { + var jsonData = new object[collection.Count]; + + for (var i = 0; i < collection.Count; i++) + jsonData[i] = new + { + collection[i].Id, + collection[i].Name, + collection[i].Description, + collection[i].Type, + collection[i].PhysicalAddress, + collection[i].Status, + collection[i].IsOperational, + collection[i].Speed, + collection[i].IPv4ProtocolAvailable, + IPv4Address = IPv4Address.ConvertIPAddressWithSubnetmaskListToString(collection[i].IPv4Address, ";"), + IPv4Gateway = IPv4Address.ConvertIPAddressListToString(collection[i].IPv4Gateway, ";"), + collection[i].DhcpEnabled, + DhcpServer = IPv4Address.ConvertIPAddressListToString(collection[i].DhcpServer, ";"), + collection[i].DhcpLeaseObtained, + collection[i].DhcpLeaseExpires, + collection[i].IPv6ProtocolAvailable, + IPv6Address = IPv4Address.ConvertIPAddressListToString(collection[i].IPv6Address, ";"), + IPv6AddressLinkLocal = + IPv4Address.ConvertIPAddressListToString(collection[i].IPv6AddressLinkLocal, ";"), + IPv6Gateway = IPv4Address.ConvertIPAddressListToString(collection[i].IPv6Gateway, ";"), + collection[i].DNSAutoconfigurationEnabled, + collection[i].DNSSuffix, + DNSServer = IPv4Address.ConvertIPAddressListToString(collection[i].DNSServer, ";") + }; + + File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Export/ExportManager.OUIInfo.cs b/Source/NETworkManager.Models/Export/ExportManager.OUIInfo.cs new file mode 100644 index 0000000000..f68e80df71 --- /dev/null +++ b/Source/NETworkManager.Models/Export/ExportManager.OUIInfo.cs @@ -0,0 +1,94 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Xml.Linq; +using NETworkManager.Models.Lookup; +using NETworkManager.Utilities; +using Newtonsoft.Json; + +namespace NETworkManager.Models.Export; + +public static partial class ExportManager +{ + /// + /// Method to export objects from type to a file. + /// + /// Path to the export file. + /// Allowed are CSV, XML or JSON. + /// Objects as to export. + public static void Export(string filePath, ExportFileType fileType, IReadOnlyList collection) + { + switch (fileType) + { + case ExportFileType.Csv: + CreateCsv(collection, filePath); + break; + case ExportFileType.Xml: + CreateXml(collection, filePath); + break; + case ExportFileType.Json: + CreateJson(collection, filePath); + break; + case ExportFileType.Txt: + default: + throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); + } + } + + /// + /// Creates a CSV file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateCsv(IEnumerable collection, string filePath) + { + var stringBuilder = new StringBuilder(); + + stringBuilder.AppendLine($"{nameof(OUIInfo.MACAddress)},{nameof(OUIInfo.Vendor)}"); + + foreach (var info in collection) + stringBuilder.AppendLine($"{info.MACAddress},{CsvHelper.QuoteString(info.Vendor)}"); + + File.WriteAllText(filePath, stringBuilder.ToString()); + } + + /// + /// Creates a XML file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateXml(IEnumerable collection, string filePath) + { + var document = new XDocument(DefaultXDeclaration, + new XElement(ApplicationName.Lookup.ToString(), + new XElement(nameof(OUIInfo) + "s", + from info in collection + select + new XElement(nameof(OUIInfo), + new XElement(nameof(OUIInfo.MACAddress), info.MACAddress), + new XElement(nameof(OUIInfo.Vendor), info.Vendor))))); + + document.Save(filePath); + } + + /// + /// Creates a JSON file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateJson(IReadOnlyList collection, string filePath) + { + var jsonData = new object[collection.Count]; + + for (var i = 0; i < collection.Count; i++) + jsonData[i] = new + { + collection[i].MACAddress, + collection[i].Vendor + }; + + File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Export/ExportManager.PingInfo.cs b/Source/NETworkManager.Models/Export/ExportManager.PingInfo.cs new file mode 100644 index 0000000000..be2027702a --- /dev/null +++ b/Source/NETworkManager.Models/Export/ExportManager.PingInfo.cs @@ -0,0 +1,107 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Xml.Linq; +using NETworkManager.Models.Network; +using NETworkManager.Utilities; +using Newtonsoft.Json; + +namespace NETworkManager.Models.Export; + +public static partial class ExportManager +{ + /// + /// Method to export objects from type to a file. + /// + /// Path to the export file. + /// Allowed are CSV, XML or JSON. + /// Objects as to export. + public static void Export(string filePath, ExportFileType fileType, IReadOnlyList collection) + { + switch (fileType) + { + case ExportFileType.Csv: + CreateCsv(collection, filePath); + break; + case ExportFileType.Xml: + CreateXml(collection, filePath); + break; + case ExportFileType.Json: + CreateJson(collection, filePath); + break; + case ExportFileType.Txt: + default: + throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); + } + } + + /// + /// Creates a CSV file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateCsv(IEnumerable collection, string filePath) + { + var stringBuilder = new StringBuilder(); + + stringBuilder.AppendLine( + $"{nameof(PingInfo.Timestamp)},{nameof(PingInfo.IPAddress)},{nameof(PingInfo.Hostname)},{nameof(PingInfo.Bytes)},{nameof(PingInfo.Time)},{nameof(PingInfo.TTL)},{nameof(PingInfo.Status)}"); + + foreach (var info in collection) + stringBuilder.AppendLine( + $"{DateTimeHelper.DateTimeToFullDateTimeString(info.Timestamp)},{info.IPAddress},{info.Hostname},{info.Bytes},{Ping.TimeToString(info.Status, info.Time, true)},{info.TTL},{info.Status}"); + + File.WriteAllText(filePath, stringBuilder.ToString()); + } + + /// + /// Creates a XML file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateXml(IEnumerable collection, string filePath) + { + var document = new XDocument(DefaultXDeclaration, + new XElement(ApplicationName.PingMonitor.ToString(), + new XElement(nameof(PingInfo) + "s", + from info in collection + select + new XElement(nameof(PingInfo), + new XElement(nameof(PingInfo.Timestamp), + DateTimeHelper.DateTimeToFullDateTimeString(info.Timestamp)), + new XElement(nameof(PingInfo.IPAddress), info.IPAddress), + new XElement(nameof(PingInfo.Hostname), info.Hostname), + new XElement(nameof(PingInfo.Bytes), info.Bytes), + new XElement(nameof(PingInfo.Time), Ping.TimeToString(info.Status, info.Time, true)), + new XElement(nameof(PingInfo.TTL), info.TTL), + new XElement(nameof(PingInfo.Status), info.Status))))); + + document.Save(filePath); + } + + /// + /// Creates a JSON file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateJson(IReadOnlyList collection, string filePath) + { + var jsonData = new object[collection.Count]; + + for (var i = 0; i < collection.Count; i++) + jsonData[i] = new + { + Timestamp = DateTimeHelper.DateTimeToFullDateTimeString(collection[i].Timestamp), + IPAddress = collection[i].IPAddress.ToString(), + collection[i].Hostname, + collection[i].Bytes, + Time = Ping.TimeToString(collection[i].Status, collection[i].Time, true), + collection[i].TTL, + Status = collection[i].Status.ToString() + }; + + File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Export/ExportManager.PortLookupInfo.cs b/Source/NETworkManager.Models/Export/ExportManager.PortLookupInfo.cs new file mode 100644 index 0000000000..5568d0c315 --- /dev/null +++ b/Source/NETworkManager.Models/Export/ExportManager.PortLookupInfo.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Xml.Linq; +using NETworkManager.Models.Lookup; +using NETworkManager.Utilities; +using Newtonsoft.Json; + +namespace NETworkManager.Models.Export; + +public static partial class ExportManager +{ + /// + /// Method to export objects from type to a file. + /// + /// Path to the export file. + /// Allowed are CSV, XML or JSON. + /// Objects as to export. + public static void Export(string filePath, ExportFileType fileType, IReadOnlyList collection) + { + switch (fileType) + { + case ExportFileType.Csv: + CreateCsv(collection, filePath); + break; + case ExportFileType.Xml: + CreateXml(collection, filePath); + break; + case ExportFileType.Json: + CreateJson(collection, filePath); + break; + case ExportFileType.Txt: + default: + throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); + } + } + + /// + /// Creates a CSV file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateCsv(IEnumerable collection, string filePath) + { + var stringBuilder = new StringBuilder(); + + stringBuilder.AppendLine( + $"{nameof(PortLookupInfo.Number)},{nameof(PortLookupInfo.Protocol)},{nameof(PortLookupInfo.Service)},{nameof(PortLookupInfo.Description)}"); + + foreach (var info in collection) + stringBuilder.AppendLine($"{info.Number},{info.Protocol},{CsvHelper.QuoteString(info.Service)},{CsvHelper.QuoteString(info.Description)}"); + + File.WriteAllText(filePath, stringBuilder.ToString()); + } + + /// + /// Creates a XML file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateXml(IEnumerable collection, string filePath) + { + var document = new XDocument(DefaultXDeclaration, + new XElement(ApplicationName.Lookup.ToString(), + new XElement(nameof(PortLookupInfo) + "s", + from info in collection + select + new XElement(nameof(PortLookupInfo), + new XElement(nameof(PortLookupInfo.Number), info.Number), + new XElement(nameof(PortLookupInfo.Protocol), info.Protocol), + new XElement(nameof(PortLookupInfo.Service), info.Service), + new XElement(nameof(PortLookupInfo.Description), info.Description))))); + + document.Save(filePath); + } + + /// + /// Creates a JSON file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateJson(IReadOnlyList collection, string filePath) + { + var jsonData = new object[collection.Count]; + + for (var i = 0; i < collection.Count; i++) + jsonData[i] = new + { + collection[i].Number, + Protocol = collection[i].Protocol.ToString(), + collection[i].Service, + collection[i].Description + }; + + File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Export/ExportManager.PortScannerInfo.cs b/Source/NETworkManager.Models/Export/ExportManager.PortScannerInfo.cs new file mode 100644 index 0000000000..2299851c84 --- /dev/null +++ b/Source/NETworkManager.Models/Export/ExportManager.PortScannerInfo.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Xml.Linq; +using NETworkManager.Models.Lookup; +using NETworkManager.Models.Network; +using NETworkManager.Utilities; +using Newtonsoft.Json; + +namespace NETworkManager.Models.Export; + +public static partial class ExportManager +{ + /// + /// Method to export objects from type to a file. + /// + /// Path to the export file. + /// Allowed are CSV, XML or JSON. + /// Objects as to export. + public static void Export(string filePath, ExportFileType fileType, + IReadOnlyList collection) + { + switch (fileType) + { + case ExportFileType.Csv: + CreateCsv(collection, filePath); + break; + case ExportFileType.Xml: + CreateXml(collection, filePath); + break; + case ExportFileType.Json: + CreateJson(collection, filePath); + break; + case ExportFileType.Txt: + default: + throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); + } + } + + /// + /// Creates a CSV file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateCsv(IEnumerable collection, string filePath) + { + var stringBuilder = new StringBuilder(); + + stringBuilder.AppendLine( + $"{nameof(PortScannerPortInfo.IPAddress)},{nameof(PortScannerPortInfo.Hostname)},{nameof(PortScannerPortInfo.Port)},{nameof(PortLookupInfo.Protocol)},{nameof(PortLookupInfo.Service)},{nameof(PortLookupInfo.Description)},{nameof(PortScannerPortInfo.State)}"); + + foreach (var info in collection) + stringBuilder.AppendLine( + $"{info.IPAddress},{CsvHelper.QuoteString(info.Hostname)},{info.Port},{info.LookupInfo.Protocol},{CsvHelper.QuoteString(info.LookupInfo.Service)},{CsvHelper.QuoteString(info.LookupInfo.Description)},{info.State}"); + + File.WriteAllText(filePath, stringBuilder.ToString()); + } + + /// + /// Creates a XML file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateXml(IEnumerable collection, string filePath) + { + var document = new XDocument(DefaultXDeclaration, + new XElement(ApplicationName.PortScanner.ToString(), + new XElement(nameof(PortScannerPortInfo) + "s", + from info in collection + select + new XElement(nameof(PortScannerPortInfo), + new XElement(nameof(PortScannerPortInfo.IPAddress), info.IPAddress), + new XElement(nameof(PortScannerPortInfo.Hostname), info.Hostname), + new XElement(nameof(PortScannerPortInfo.Port), info.Port), + new XElement(nameof(PortLookupInfo.Protocol), info.LookupInfo.Protocol), + new XElement(nameof(PortLookupInfo.Service), info.LookupInfo.Service), + new XElement(nameof(PortLookupInfo.Description), info.LookupInfo.Description), + new XElement(nameof(PortScannerPortInfo.State), info.State))))); + + document.Save(filePath); + } + + /// + /// Creates a JSON file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateJson(IReadOnlyList collection, string filePath) + { + var jsonData = new object[collection.Count]; + + for (var i = 0; i < collection.Count; i++) + jsonData[i] = new + { + IPAddress = collection[i].IPAddress.ToString(), + collection[i].Hostname, + collection[i].Port, + Protocol = collection[i].LookupInfo.Protocol.ToString(), + collection[i].LookupInfo.Service, + collection[i].LookupInfo.Description, + Status = collection[i].State.ToString() + }; + + File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Export/ExportManager.SNMPReceivedInfo.cs b/Source/NETworkManager.Models/Export/ExportManager.SNMPReceivedInfo.cs new file mode 100644 index 0000000000..7e3aaa7704 --- /dev/null +++ b/Source/NETworkManager.Models/Export/ExportManager.SNMPReceivedInfo.cs @@ -0,0 +1,94 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Xml.Linq; +using NETworkManager.Models.Network; +using Newtonsoft.Json; + +namespace NETworkManager.Models.Export; + +public static partial class ExportManager +{ + /// + /// Method to export objects from type to a file. + /// + /// Path to the export file. + /// Allowed are CSV, XML or JSON. + /// Objects as to export. + public static void Export(string filePath, ExportFileType fileType, + IReadOnlyList collection) + { + switch (fileType) + { + case ExportFileType.Csv: + CreateCsv(collection, filePath); + break; + case ExportFileType.Xml: + CreateXml(collection, filePath); + break; + case ExportFileType.Json: + CreateJson(collection, filePath); + break; + case ExportFileType.Txt: + default: + throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); + } + } + + /// + /// Creates a CSV file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateCsv(IEnumerable collection, string filePath) + { + var stringBuilder = new StringBuilder(); + + stringBuilder.AppendLine($"{nameof(SNMPInfo.OID)},{nameof(SNMPInfo.Data)}"); + + foreach (var info in collection) + stringBuilder.AppendLine($"{info.OID},{info.Data}"); + + File.WriteAllText(filePath, stringBuilder.ToString()); + } + + /// + /// Creates a XML file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateXml(IEnumerable collection, string filePath) + { + var document = new XDocument(DefaultXDeclaration, + new XElement(ApplicationName.SNMP.ToString(), + new XElement(nameof(SNMPInfo) + "s", + from info in collection + select + new XElement(nameof(SNMPInfo), + new XElement(nameof(SNMPInfo.OID), info.OID), + new XElement(nameof(SNMPInfo.Data), info.Data))))); + + document.Save(filePath); + } + + /// + /// Creates a JSON file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateJson(IReadOnlyList collection, string filePath) + { + var jsonData = new object[collection.Count]; + + for (var i = 0; i < collection.Count; i++) + jsonData[i] = new + { + collection[i].OID, + collection[i].Data + }; + + File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Export/ExportManager.SNTPLookupResultInfo.cs b/Source/NETworkManager.Models/Export/ExportManager.SNTPLookupResultInfo.cs new file mode 100644 index 0000000000..d2b9a16064 --- /dev/null +++ b/Source/NETworkManager.Models/Export/ExportManager.SNTPLookupResultInfo.cs @@ -0,0 +1,111 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Xml.Linq; +using NETworkManager.Models.Network; +using NETworkManager.Utilities; +using Newtonsoft.Json; + +namespace NETworkManager.Models.Export; + +public static partial class ExportManager +{ + /// + /// Method to export objects from type to a file. + /// + /// Path to the export file. + /// Allowed are CSV, XML or JSON. + /// Objects as to export. + public static void Export(string filePath, ExportFileType fileType, + IReadOnlyList collection) + { + switch (fileType) + { + case ExportFileType.Csv: + CreateCsv(collection, filePath); + break; + case ExportFileType.Xml: + CreateXml(collection, filePath); + break; + case ExportFileType.Json: + CreateJson(collection, filePath); + break; + case ExportFileType.Txt: + default: + throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); + } + } + + /// + /// Creates a CSV file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateCsv(IEnumerable collection, string filePath) + { + var stringBuilder = new StringBuilder(); + + stringBuilder.AppendLine( + $"{nameof(SNTPLookupInfo.Server)},{nameof(SNTPLookupInfo.IPEndPoint)},{nameof(SNTPLookupInfo.DateTime.NetworkTime)},{nameof(SNTPLookupInfo.DateTime.LocalStartTime)},{nameof(SNTPLookupInfo.DateTime.LocalEndTime)},{nameof(SNTPLookupInfo.DateTime.Offset)},{nameof(SNTPLookupInfo.DateTime.RoundTripDelay)}"); + + foreach (var info in collection) + stringBuilder.AppendLine( + $"{info.Server},{info.IPEndPoint},{DateTimeHelper.DateTimeToFullDateTimeString(info.DateTime.NetworkTime)},{DateTimeHelper.DateTimeToFullDateTimeString(info.DateTime.LocalStartTime)},{DateTimeHelper.DateTimeToFullDateTimeString(info.DateTime.LocalEndTime)},{info.DateTime.Offset} s,{info.DateTime.RoundTripDelay} ms"); + + File.WriteAllText(filePath, stringBuilder.ToString()); + } + + /// + /// Creates a XML file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateXml(IEnumerable collection, string filePath) + { + var document = new XDocument(DefaultXDeclaration, + new XElement(ApplicationName.SNTPLookup.ToString(), + new XElement(nameof(SNTPLookupInfo) + "s", + from info in collection + select + new XElement(nameof(SNTPLookupInfo), + new XElement(nameof(SNTPLookupInfo.Server), info.Server), + new XElement(nameof(SNTPLookupInfo.IPEndPoint), info.IPEndPoint), + new XElement(nameof(SNTPLookupInfo.DateTime.NetworkTime), + DateTimeHelper.DateTimeToFullDateTimeString(info.DateTime.NetworkTime)), + new XElement(nameof(SNTPLookupInfo.DateTime.LocalStartTime), + DateTimeHelper.DateTimeToFullDateTimeString(info.DateTime.LocalStartTime)), + new XElement(nameof(SNTPLookupInfo.DateTime.LocalEndTime), + DateTimeHelper.DateTimeToFullDateTimeString(info.DateTime.LocalEndTime)), + new XElement(nameof(SNTPLookupInfo.DateTime.Offset), $"{info.DateTime.Offset} s"), + new XElement(nameof(SNTPLookupInfo.DateTime.RoundTripDelay), + $"{info.DateTime.RoundTripDelay} ms"))))); + + document.Save(filePath); + } + + /// + /// Creates a JSON file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateJson(IReadOnlyList collection, string filePath) + { + var jsonData = new object[collection.Count]; + + for (var i = 0; i < collection.Count; i++) + jsonData[i] = new + { + collection[i].Server, + collection[i].IPEndPoint, + NetworkTime = DateTimeHelper.DateTimeToFullDateTimeString(collection[i].DateTime.NetworkTime), + LocalStartTime = DateTimeHelper.DateTimeToFullDateTimeString(collection[i].DateTime.LocalStartTime), + LocalEndTime = DateTimeHelper.DateTimeToFullDateTimeString(collection[i].DateTime.LocalEndTime), + Offset = $"{collection[i].DateTime.Offset} s", + RoundTripDelay = $"{collection[i].DateTime.RoundTripDelay} ms" + }; + + File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Export/ExportManager.TracerouteHopInfo.cs b/Source/NETworkManager.Models/Export/ExportManager.TracerouteHopInfo.cs new file mode 100644 index 0000000000..d02e220bcc --- /dev/null +++ b/Source/NETworkManager.Models/Export/ExportManager.TracerouteHopInfo.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Xml.Linq; +using NETworkManager.Models.Network; +using NETworkManager.Utilities; +using Newtonsoft.Json; + +namespace NETworkManager.Models.Export; + +public static partial class ExportManager +{ + /// + /// Method to export objects from type to a file. + /// + /// Path to the export file. + /// Allowed are CSV, XML or JSON. + /// Objects as to export. + public static void Export(string filePath, ExportFileType fileType, + IReadOnlyList collection) + { + switch (fileType) + { + case ExportFileType.Csv: + CreateCsv(collection, filePath); + break; + case ExportFileType.Xml: + CreateXml(collection, filePath); + break; + case ExportFileType.Json: + CreateJson(collection, filePath); + break; + case ExportFileType.Txt: + default: + throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); + } + } + + /// + /// Creates a CSV file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateCsv(IEnumerable collection, string filePath) + { + var stringBuilder = new StringBuilder(); + + stringBuilder.AppendLine( + $"{nameof(TracerouteHopInfo.Hop)},{nameof(TracerouteHopInfo.Status1)},{nameof(TracerouteHopInfo.Time1)},{nameof(TracerouteHopInfo.Status2)},{nameof(TracerouteHopInfo.Time2)},{nameof(TracerouteHopInfo.Status3)},{nameof(TracerouteHopInfo.Time3)},{nameof(TracerouteHopInfo.IPAddress)},{nameof(TracerouteHopInfo.Hostname)},{nameof(TracerouteHopInfo.IPGeolocationResult.Info.Continent)},{nameof(TracerouteHopInfo.IPGeolocationResult.Info.Country)},{nameof(TracerouteHopInfo.IPGeolocationResult.Info.Region)},{nameof(TracerouteHopInfo.IPGeolocationResult.Info.City)},{nameof(TracerouteHopInfo.IPGeolocationResult.Info.District)},{nameof(TracerouteHopInfo.IPGeolocationResult.Info.Isp)},{nameof(TracerouteHopInfo.IPGeolocationResult.Info.Org)},{nameof(TracerouteHopInfo.IPGeolocationResult.Info.As)},{nameof(TracerouteHopInfo.IPGeolocationResult.Info.Asname)},{nameof(TracerouteHopInfo.IPGeolocationResult.Info.Hosting)},{nameof(TracerouteHopInfo.IPGeolocationResult.Info.Proxy)},{nameof(TracerouteHopInfo.IPGeolocationResult.Info.Mobile)}"); + + foreach (var info in collection) + stringBuilder.AppendLine( + $"{info.Hop},{info.Status1},{Ping.TimeToString(info.Status1, info.Time1, true)},{info.Status2},{Ping.TimeToString(info.Status2, info.Time2, true)},{info.Status3},{Ping.TimeToString(info.Status3, info.Time3, true)},{info.IPAddress}," + + $"{CsvHelper.QuoteString(info.Hostname)},{CsvHelper.QuoteString(info.IPGeolocationResult?.Info?.Continent)},{CsvHelper.QuoteString(info.IPGeolocationResult?.Info?.Country)}," + + $"{CsvHelper.QuoteString(info.IPGeolocationResult?.Info?.Region)},{CsvHelper.QuoteString(info.IPGeolocationResult?.Info?.City)},{CsvHelper.QuoteString(info.IPGeolocationResult?.Info?.District)}," + + $"{CsvHelper.QuoteString(info.IPGeolocationResult?.Info?.Isp)},{CsvHelper.QuoteString(info.IPGeolocationResult?.Info?.Org)},{CsvHelper.QuoteString(info.IPGeolocationResult?.Info?.As)},{CsvHelper.QuoteString(info.IPGeolocationResult?.Info?.Asname)}," + + $"{info.IPGeolocationResult?.Info?.Hosting},{info.IPGeolocationResult?.Info?.Proxy},{info.IPGeolocationResult?.Info?.Mobile}"); + + File.WriteAllText(filePath, stringBuilder.ToString()); + } + + /// + /// Creates a XML file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateXml(IEnumerable collection, string filePath) + { + var document = new XDocument(DefaultXDeclaration, + new XElement(ApplicationName.Traceroute.ToString(), + new XElement(nameof(TracerouteHopInfo) + "s", + from info in collection + select + new XElement(nameof(TracerouteHopInfo), + new XElement(nameof(TracerouteHopInfo.Hop), info.Hop), + new XElement(nameof(TracerouteHopInfo.Status1), info.Status1), + new XElement(nameof(TracerouteHopInfo.Time1), + Ping.TimeToString(info.Status1, info.Time1, true)), + new XElement(nameof(TracerouteHopInfo.Status2), info.Status2), + new XElement(nameof(TracerouteHopInfo.Time2), + Ping.TimeToString(info.Status2, info.Time2, true)), + new XElement(nameof(TracerouteHopInfo.Status3), info.Status3), + new XElement(nameof(TracerouteHopInfo.Time3), + Ping.TimeToString(info.Status3, info.Time3, true)), + new XElement(nameof(TracerouteHopInfo.IPAddress), info.IPAddress), + new XElement(nameof(TracerouteHopInfo.Hostname), info.Hostname), + new XElement(nameof(TracerouteHopInfo.IPGeolocationResult.Info.Continent), + info.IPGeolocationResult?.Info?.Continent), + new XElement(nameof(TracerouteHopInfo.IPGeolocationResult.Info.Country), + info.IPGeolocationResult?.Info?.Country), + new XElement(nameof(TracerouteHopInfo.IPGeolocationResult.Info.Region), + info.IPGeolocationResult?.Info?.Region), + new XElement(nameof(TracerouteHopInfo.IPGeolocationResult.Info.City), + info.IPGeolocationResult?.Info?.City), + new XElement(nameof(TracerouteHopInfo.IPGeolocationResult.Info.District), + info.IPGeolocationResult?.Info?.District), + new XElement(nameof(TracerouteHopInfo.IPGeolocationResult.Info.Isp), + info.IPGeolocationResult?.Info?.Isp), + new XElement(nameof(TracerouteHopInfo.IPGeolocationResult.Info.Org), + info.IPGeolocationResult?.Info?.Org), + new XElement(nameof(TracerouteHopInfo.IPGeolocationResult.Info.As), + info.IPGeolocationResult?.Info?.As), + new XElement(nameof(TracerouteHopInfo.IPGeolocationResult.Info.Asname), + info.IPGeolocationResult?.Info?.Asname), + new XElement(nameof(TracerouteHopInfo.IPGeolocationResult.Info.Hosting), + info.IPGeolocationResult?.Info?.Hosting), + new XElement(nameof(TracerouteHopInfo.IPGeolocationResult.Info.Proxy), + info.IPGeolocationResult?.Info?.Proxy), + new XElement(nameof(TracerouteHopInfo.IPGeolocationResult.Info.Mobile), + info.IPGeolocationResult?.Info?.Mobile))))); + + document.Save(filePath); + } + + /// + /// Creates a JSON file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateJson(IReadOnlyList collection, string filePath) + { + var jsonData = new object[collection.Count]; + + for (var i = 0; i < collection.Count; i++) + jsonData[i] = new + { + collection[i].Hop, + Status1 = collection[i].Status1.ToString(), + Time1 = Ping.TimeToString(collection[i].Status1, collection[i].Time1, true), + Status2 = collection[i].Status2.ToString(), + Time2 = Ping.TimeToString(collection[i].Status2, collection[i].Time2, true), + Status3 = collection[i].Status3.ToString(), + Time3 = Ping.TimeToString(collection[i].Status3, collection[i].Time3, true), + IPAddress = collection[i].IPAddress?.ToString(), + collection[i].Hostname, + Continent = collection[i].IPGeolocationResult?.Info?.Continent, + Country = collection[i].IPGeolocationResult?.Info?.Country, + Region = collection[i].IPGeolocationResult?.Info?.Region, + City = collection[i].IPGeolocationResult?.Info?.City, + District = collection[i].IPGeolocationResult?.Info?.District, + Isp = collection[i].IPGeolocationResult?.Info?.Isp, + Org = collection[i].IPGeolocationResult?.Info?.Org, + As = collection[i].IPGeolocationResult?.Info?.As, + Asname = collection[i].IPGeolocationResult?.Info?.Asname, + Hosting = collection[i].IPGeolocationResult?.Info?.Hosting, + Proxy = collection[i].IPGeolocationResult?.Info?.Proxy, + Mobile = collection[i].IPGeolocationResult?.Info?.Mobile + }; + + File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Export/ExportManager.WiFiNetworkInfo.cs b/Source/NETworkManager.Models/Export/ExportManager.WiFiNetworkInfo.cs new file mode 100644 index 0000000000..78e866df04 --- /dev/null +++ b/Source/NETworkManager.Models/Export/ExportManager.WiFiNetworkInfo.cs @@ -0,0 +1,131 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Xml.Linq; +using NETworkManager.Models.Network; +using Newtonsoft.Json; + +namespace NETworkManager.Models.Export; + +public static partial class ExportManager +{ + /// + /// Method to export objects from type to a file. + /// + /// Path to the export file. + /// Allowed are CSV, XML or JSON. + /// Objects as to export. + public static void Export(string filePath, ExportFileType fileType, IReadOnlyList collection) + { + switch (fileType) + { + case ExportFileType.Csv: + CreateCsv(collection, filePath); + break; + case ExportFileType.Xml: + CreateXml(collection, filePath); + break; + case ExportFileType.Json: + CreateJson(collection, filePath); + break; + case ExportFileType.Txt: + default: + throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); + } + } + + /// + /// Creates a CSV file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateCsv(IEnumerable collection, string filePath) + { + var stringBuilder = new StringBuilder(); + + stringBuilder.AppendLine( + $"{nameof(WiFiNetworkInfo.AvailableNetwork.Bssid)},{nameof(WiFiNetworkInfo.AvailableNetwork.Ssid)},{nameof(WiFiNetworkInfo.AvailableNetwork.ChannelCenterFrequencyInKilohertz)},{nameof(WiFiNetworkInfo.AvailableNetwork.SignalBars)},{nameof(WiFiNetworkInfo.AvailableNetwork.IsWiFiDirect)},{nameof(WiFiNetworkInfo.AvailableNetwork.NetworkRssiInDecibelMilliwatts)},{nameof(WiFiNetworkInfo.AvailableNetwork.PhyKind)},{nameof(WiFiNetworkInfo.AvailableNetwork.NetworkKind)},{nameof(WiFiNetworkInfo.AvailableNetwork.SecuritySettings.NetworkAuthenticationType)},{nameof(WiFiNetworkInfo.AvailableNetwork.SecuritySettings.NetworkEncryptionType)},{nameof(WiFiNetworkInfo.AvailableNetwork.BeaconInterval)},{nameof(WiFiNetworkInfo.AvailableNetwork.Uptime)}"); + + foreach (var info in collection) + stringBuilder.AppendLine( + $"{info.AvailableNetwork.Bssid},{info.AvailableNetwork.Ssid},{info.AvailableNetwork.ChannelCenterFrequencyInKilohertz},{info.AvailableNetwork.SignalBars},{info.AvailableNetwork.IsWiFiDirect},{info.AvailableNetwork.NetworkRssiInDecibelMilliwatts},{info.AvailableNetwork.PhyKind},{info.AvailableNetwork.NetworkKind},{info.AvailableNetwork.SecuritySettings.NetworkAuthenticationType},{info.AvailableNetwork.SecuritySettings.NetworkEncryptionType},{info.AvailableNetwork.BeaconInterval},{info.AvailableNetwork.Uptime}"); + + File.WriteAllText(filePath, stringBuilder.ToString()); + } + + /// + /// Creates a XML file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateXml(IEnumerable collection, string filePath) + { + var document = new XDocument(DefaultXDeclaration, + new XElement(ApplicationName.WiFi.ToString(), + new XElement(nameof(WiFiNetworkInfo) + "s", + from info in collection + select + new XElement(nameof(WiFiNetworkInfo), + new XElement(nameof(WiFiNetworkInfo.AvailableNetwork.Bssid), info.AvailableNetwork.Bssid), + new XElement(nameof(WiFiNetworkInfo.AvailableNetwork.Ssid), info.AvailableNetwork.Ssid), + new XElement(nameof(WiFiNetworkInfo.AvailableNetwork.ChannelCenterFrequencyInKilohertz), + info.AvailableNetwork.ChannelCenterFrequencyInKilohertz), + new XElement(nameof(WiFiNetworkInfo.AvailableNetwork.SignalBars), + info.AvailableNetwork.SignalBars), + new XElement(nameof(WiFiNetworkInfo.AvailableNetwork.IsWiFiDirect), + info.AvailableNetwork.IsWiFiDirect), + new XElement(nameof(WiFiNetworkInfo.AvailableNetwork.NetworkRssiInDecibelMilliwatts), + info.AvailableNetwork.NetworkRssiInDecibelMilliwatts), + new XElement(nameof(WiFiNetworkInfo.AvailableNetwork.PhyKind), + info.AvailableNetwork.PhyKind), + new XElement(nameof(WiFiNetworkInfo.AvailableNetwork.NetworkKind), + info.AvailableNetwork.NetworkKind), + new XElement( + nameof(WiFiNetworkInfo.AvailableNetwork.SecuritySettings.NetworkAuthenticationType), + info.AvailableNetwork.SecuritySettings.NetworkAuthenticationType), + new XElement( + nameof(WiFiNetworkInfo.AvailableNetwork.SecuritySettings.NetworkEncryptionType), + info.AvailableNetwork.SecuritySettings.NetworkEncryptionType), + new XElement(nameof(WiFiNetworkInfo.AvailableNetwork.BeaconInterval), + info.AvailableNetwork.BeaconInterval), + new XElement(nameof(WiFiNetworkInfo.AvailableNetwork.Uptime), + info.AvailableNetwork.Uptime))))); + + document.Save(filePath); + } + + /// + /// Creates a JSON file from the given collection. + /// + /// Objects as to export. + /// Path to the export file. + private static void CreateJson(IReadOnlyList collection, string filePath) + { + var jsonData = new object[collection.Count]; + + for (var i = 0; i < collection.Count; i++) + jsonData[i] = new + { + collection[i].AvailableNetwork.Bssid, + collection[i].AvailableNetwork.Ssid, + collection[i].AvailableNetwork.ChannelCenterFrequencyInKilohertz, + SignalBars = collection[i].AvailableNetwork.SignalBars.ToString(), + IsWiFiDirect = collection[i].AvailableNetwork.IsWiFiDirect.ToString(), + NetworkRssiInDecibelMilliwatts = collection[i].AvailableNetwork.NetworkRssiInDecibelMilliwatts + .ToString(CultureInfo.CurrentCulture), + PhyKind = collection[i].AvailableNetwork.PhyKind.ToString(), + NetworkKind = collection[i].AvailableNetwork.NetworkKind.ToString(), + NetworkAuthenticationType = + collection[i].AvailableNetwork.SecuritySettings.NetworkAuthenticationType.ToString(), + NetworkEncryptionType = + collection[i].AvailableNetwork.SecuritySettings.NetworkEncryptionType.ToString(), + BeaconInterval = collection[i].AvailableNetwork.BeaconInterval.ToString(), + Uptime = collection[i].AvailableNetwork.Uptime.ToString() + }; + + File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Export/ExportManager.cs b/Source/NETworkManager.Models/Export/ExportManager.cs index 89a1364871..d502f50509 100644 --- a/Source/NETworkManager.Models/Export/ExportManager.cs +++ b/Source/NETworkManager.Models/Export/ExportManager.cs @@ -1,1060 +1,52 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.Text; +using System.IO; using System.Xml.Linq; -using Newtonsoft.Json; -using NETworkManager.Models.Lookup; -using NETworkManager.Models.Network; -namespace NETworkManager.Models.Export +namespace NETworkManager.Models.Export; + +/// +/// This class will provide methods to export text or objects to files like csv, xml, json or plain text. +/// +public static partial class ExportManager { /// - /// This class will provide methods to export text or objects to files like csv, xml, json or plain text. + /// Default declaration for XML documents. /// - public static partial class ExportManager - { - #region Variables - /// - /// Default declaration for XML documents. - /// - private static readonly XDeclaration DefaultXDeclaration = new XDeclaration("1.0", "utf-8", "yes"); - #endregion - - #region Methods - - #region Export - /// - /// Method to export objects from type to a file. - /// - /// Path to the export file. - /// Allowed are CSV, XML or JSON. - /// Objects as to export. - public static void Export(string filePath, ExportFileType fileType, ObservableCollection collection) - { - switch (fileType) - { - case ExportFileType.CSV: - CreateCSV(collection, filePath); - break; - case ExportFileType.XML: - CreateXML(collection, filePath); - break; - case ExportFileType.JSON: - CreateJSON(collection, filePath); - break; - default: - throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); - } - } - - /// - /// Method to export objects from type to a file. - /// - /// Path to the export file. - /// Allowed are CSV, XML or JSON. - /// Objects as to export. - public static void Export(string filePath, ExportFileType fileType, ObservableCollection collection) - { - switch (fileType) - { - case ExportFileType.CSV: - CreateCSV(collection, filePath); - break; - case ExportFileType.XML: - CreateXML(collection, filePath); - break; - case ExportFileType.JSON: - CreateJSON(collection, filePath); - break; - default: - throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); - } - } - - /// - /// Method to export objects from type to a file. - /// - /// Path to the export file. - /// Allowed are CSV, XML or JSON. - /// Objects as to export. - public static void Export(string filePath, ExportFileType fileType, ObservableCollection collection) - { - switch (fileType) - { - case ExportFileType.CSV: - CreateCSV(collection, filePath); - break; - case ExportFileType.XML: - CreateXML(collection, filePath); - break; - case ExportFileType.JSON: - CreateJSON(collection, filePath); - break; - default: - throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); - } - } - - /// - /// Method to export objects from type to a file. - /// - /// Path to the export file. - /// Allowed are CSV, XML or JSON. - /// Objects as to export. - public static void Export(string filePath, ExportFileType fileType, ObservableCollection collection) - { - switch (fileType) - { - case ExportFileType.CSV: - CreateCSV(collection, filePath); - break; - case ExportFileType.XML: - CreateXML(collection, filePath); - break; - case ExportFileType.JSON: - CreateJSON(collection, filePath); - break; - default: - throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); - } - } - - /// - /// Method to export objects from type to a file. - /// - /// Path to the export file. - /// Allowed are CSV, XML or JSON. - /// Objects as to export. - public static void Export(string filePath, ExportFileType fileType, ObservableCollection collection) - { - switch (fileType) - { - case ExportFileType.CSV: - CreateCSV(collection, filePath); - break; - case ExportFileType.XML: - CreateXML(collection, filePath); - break; - case ExportFileType.JSON: - CreateJSON(collection, filePath); - break; - default: - throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); - } - } - - /// - /// Method to export objects from type to a file. - /// - /// Path to the export file. - /// Allowed are CSV, XML or JSON. - /// Objects as to export. - public static void Export(string filePath, ExportFileType fileType, ObservableCollection collection) - { - switch (fileType) - { - case ExportFileType.CSV: - CreateCSV(collection, filePath); - break; - case ExportFileType.XML: - CreateXML(collection, filePath); - break; - case ExportFileType.JSON: - CreateJSON(collection, filePath); - break; - default: - throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); - } - } - - /// - /// Method to export objects from type to a file. - /// - /// Path to the export file. - /// Allowed are CSV, XML or JSON. - /// Objects as to export. - public static void Export(string filePath, ExportFileType fileType, ObservableCollection collection) - { - switch (fileType) - { - case ExportFileType.CSV: - CreateCSV(collection, filePath); - break; - case ExportFileType.XML: - CreateXML(collection, filePath); - break; - case ExportFileType.JSON: - CreateJSON(collection, filePath); - break; - default: - throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); - } - } - - /// - /// Method to export objects from type to a file. - /// - /// Path to the export file. - /// Allowed are CSV, XML or JSON. - /// Objects as to export. - public static void Export(string filePath, ExportFileType fileType, ObservableCollection collection) - { - switch (fileType) - { - case ExportFileType.CSV: - CreateCSV(collection, filePath); - break; - case ExportFileType.XML: - CreateXML(collection, filePath); - break; - case ExportFileType.JSON: - CreateJSON(collection, filePath); - break; - default: - throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); - } - } - - /// - /// Method to export objects from type to a file. - /// - /// Path to the export file. - /// Allowed are CSV, XML or JSON. - /// Objects as to export. - public static void Export(string filePath, ExportFileType fileType, ObservableCollection collection) - { - switch (fileType) - { - case ExportFileType.CSV: - CreateCSV(collection, filePath); - break; - case ExportFileType.XML: - CreateXML(collection, filePath); - break; - case ExportFileType.JSON: - CreateJSON(collection, filePath); - break; - default: - throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); - } - } - - /// - /// Method to export objects from type to a file. - /// - /// Path to the export file. - /// Allowed are CSV, XML or JSON. - /// Objects as to export. - public static void Export(string filePath, ExportFileType fileType, ObservableCollection collection) - { - switch (fileType) - { - case ExportFileType.CSV: - CreateCSV(collection, filePath); - break; - case ExportFileType.XML: - CreateXML(collection, filePath); - break; - case ExportFileType.JSON: - CreateJSON(collection, filePath); - break; - default: - throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); - } - } - - /// - /// Method to export objects from type to a file. - /// - /// Path to the export file. - /// Allowed are CSV, XML or JSON. - /// Objects as to export. - public static void Export(string filePath, ExportFileType fileType, ObservableCollection collection) - { - switch (fileType) - { - case ExportFileType.CSV: - CreateCSV(collection, filePath); - break; - case ExportFileType.XML: - CreateXML(collection, filePath); - break; - case ExportFileType.JSON: - CreateJSON(collection, filePath); - break; - default: - throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); - } - } - - /// - /// Method to export objects from type to a file. - /// - /// Path to the export file. - /// Allowed are CSV, XML or JSON. - /// Objects as to export. - public static void Export(string filePath, ExportFileType fileType, ObservableCollection collection) - { - switch (fileType) - { - case ExportFileType.CSV: - CreateCSV(collection, filePath); - break; - case ExportFileType.XML: - CreateXML(collection, filePath); - break; - case ExportFileType.JSON: - CreateJSON(collection, filePath); - break; - default: - throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); - } - } - - /// - /// Method to export objects from type to a file. - /// - /// Path to the export file. - /// Allowed are CSV, XML or JSON. - /// Objects as to export. - public static void Export(string filePath, ExportFileType fileType, ObservableCollection collection) - { - switch (fileType) - { - case ExportFileType.CSV: - CreateCSV(collection, filePath); - break; - case ExportFileType.XML: - CreateXML(collection, filePath); - break; - case ExportFileType.JSON: - CreateJSON(collection, filePath); - break; - default: - throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); - } - } - - /// - /// Method to export text to a file. - /// - /// Path to the export file. - /// Text to export. - public static void Export(string filePath, string content) - { - CreateTXT(content, filePath); - } - #endregion - - #region CreateCSV - private static void CreateCSV(IEnumerable collection, string filePath) - { - var stringBuilder = new StringBuilder(); - - stringBuilder.AppendLine($"{nameof(WiFiNetworkInfo.BSSID)},{nameof(WiFiNetworkInfo.SSID)},{nameof(WiFiNetworkInfo.ChannelCenterFrequencyInKilohertz)},{nameof(WiFiNetworkInfo.SignalBars)},{nameof(WiFiNetworkInfo.IsWiFiDirect)},{nameof(WiFiNetworkInfo.NetworkRssiInDecibelMilliwatts)},{nameof(WiFiNetworkInfo.PhyKind)},{nameof(WiFiNetworkInfo.NetworkKind)},{nameof(WiFiNetworkInfo.AuthenticationType)},{nameof(WiFiNetworkInfo.EncryptionType)},{nameof(WiFiNetworkInfo.BeaconInterval)}.{nameof(WiFiNetworkInfo.Uptime)}"); - - foreach (var info in collection) - stringBuilder.AppendLine($"{info.BSSID},{info.SSID},{info.ChannelCenterFrequencyInKilohertz},{info.SignalBars},{info.IsWiFiDirect},{info.NetworkRssiInDecibelMilliwatts},{info.PhyKind},{info.NetworkKind},{info.AuthenticationType},{info.EncryptionType},{info.BeaconInterval},{info.Uptime}"); - - System.IO.File.WriteAllText(filePath, stringBuilder.ToString()); - } - - private static void CreateCSV(IEnumerable collection, string filePath) - { - var stringBuilder = new StringBuilder(); - - stringBuilder.AppendLine($"{nameof(PingInfo.IPAddress)},{nameof(HostInfo.Hostname)},{nameof(HostInfo.MACAddress)},{nameof(HostInfo.Vendor)},{nameof(PingInfo.Bytes)},{nameof(PingInfo.Time)},{nameof(PingInfo.TTL)},{nameof(PingInfo.Status)}"); - - foreach (var info in collection) - stringBuilder.AppendLine($"{info.PingInfo.IPAddress},{info.Hostname},{info.MACAddress},{info.Vendor},{info.PingInfo.Bytes},{Ping.TimeToString(info.PingInfo.Status, info.PingInfo.Time, true)},{info.PingInfo.TTL},{info.PingInfo.Status}"); - - System.IO.File.WriteAllText(filePath, stringBuilder.ToString()); - } - - private static void CreateCSV(IEnumerable collection, string filePath) - { - var stringBuilder = new StringBuilder(); - - stringBuilder.AppendLine($"{nameof(PortInfo.IPAddress)},{nameof(PortInfo.Hostname)},{nameof(PortInfo.Port)},{nameof(PortLookupInfo.Protocol)},{nameof(PortLookupInfo.Service)},{nameof(PortLookupInfo.Description)},{nameof(PortInfo.State)}"); - - foreach (var info in collection) - stringBuilder.AppendLine($"{info.IPAddress},{info.Hostname},{info.Port},{info.LookupInfo.Protocol},{info.LookupInfo.Service},{info.LookupInfo.Description},{info.State}"); - - System.IO.File.WriteAllText(filePath, stringBuilder.ToString()); - } - - private static void CreateCSV(IEnumerable collection, string filePath) - { - var stringBuilder = new StringBuilder(); - - stringBuilder.AppendLine($"{nameof(PingInfo.Timestamp)},{nameof(PingInfo.IPAddress)},{nameof(PingInfo.Hostname)},{nameof(PingInfo.Bytes)},{nameof(PingInfo.Time)},{nameof(PingInfo.TTL)},{nameof(PingInfo.Status)}"); - - foreach (var info in collection) - stringBuilder.AppendLine($"{info.Timestamp},{info.IPAddress},{info.Hostname},{info.Bytes},{Ping.TimeToString(info.Status, info.Time, true)},{info.TTL},{info.Status}"); - - System.IO.File.WriteAllText(filePath, stringBuilder.ToString()); - } - - private static void CreateCSV(IEnumerable collection, string filePath) - { - var stringBuilder = new StringBuilder(); - - stringBuilder.AppendLine($"{nameof(TracerouteHopInfo.Hop)},{nameof(TracerouteHopInfo.Time1)},{nameof(TracerouteHopInfo.Time2)},{nameof(TracerouteHopInfo.Time3)},{nameof(TracerouteHopInfo.IPAddress)},{nameof(TracerouteHopInfo.Hostname)},{nameof(TracerouteHopInfo.Status1)},{nameof(TracerouteHopInfo.Status2)},{nameof(TracerouteHopInfo.Status3)}"); - - foreach (var info in collection) - stringBuilder.AppendLine($"{info.Hop},{Ping.TimeToString(info.Status1, info.Time1, true)},{Ping.TimeToString(info.Status2, info.Time2, true)},{Ping.TimeToString(info.Status3, info.Time3, true)},{info.IPAddress},{info.Hostname},{info.Status1},{info.Status2},{info.Status3}"); - - System.IO.File.WriteAllText(filePath, stringBuilder.ToString()); - } - - private static void CreateCSV(IEnumerable collection, string filePath) - { - var stringBuilder = new StringBuilder(); - - stringBuilder.AppendLine($"{nameof(DNSLookupRecordInfo.DomainName)},{nameof(DNSLookupRecordInfo.TTL)},{nameof(DNSLookupRecordInfo.Class)},{nameof(DNSLookupRecordInfo.Type)},{nameof(DNSLookupRecordInfo.Result)},{nameof(DNSLookupRecordInfo.DNSServer)},{nameof(DNSLookupRecordInfo.Port)}"); - - foreach (var info in collection) - stringBuilder.AppendLine($"{info.DomainName},{info.TTL},{info.Class},{info.Type},{info.Result},{info.DNSServer},{info.Port}"); - - System.IO.File.WriteAllText(filePath, stringBuilder.ToString()); - } - - private static void CreateCSV(IEnumerable collection, string filePath) - { - var stringBuilder = new StringBuilder(); - - stringBuilder.AppendLine($"{nameof(SNMPReceivedInfo.OID)},{nameof(SNMPReceivedInfo.Data)}"); - - foreach (var info in collection) - stringBuilder.AppendLine($"{info.OID},{info.Data}"); - - System.IO.File.WriteAllText(filePath, stringBuilder.ToString()); - } - - private static void CreateCSV(IEnumerable collection, string filePath) - { - var stringBuilder = new StringBuilder(); - - stringBuilder.AppendLine($"{nameof(IPNetworkInfo.Network)},{nameof(IPNetworkInfo.Broadcast)},{nameof(IPNetworkInfo.Total)},{nameof(IPNetworkInfo.Netmask)},{nameof(IPNetworkInfo.Cidr)},{nameof(IPNetworkInfo.FirstUsable)},{nameof(IPNetworkInfo.LastUsable)},{nameof(IPNetworkInfo.Usable)}"); - - foreach (var info in collection) - stringBuilder.AppendLine($"{info.Network},{info.Broadcast},{info.Total},{info.Netmask},{info.Cidr},{info.FirstUsable},{info.LastUsable},{info.Usable}"); - - System.IO.File.WriteAllText(filePath, stringBuilder.ToString()); - } - - private static void CreateCSV(IEnumerable collection, string filePath) - { - var stringBuilder = new StringBuilder(); - - stringBuilder.AppendLine($"{nameof(OUIInfo.MACAddress)},{nameof(OUIInfo.Vendor)}"); - - foreach (var info in collection) - stringBuilder.AppendLine($"{info.MACAddress},{info.Vendor}"); - - System.IO.File.WriteAllText(filePath, stringBuilder.ToString()); - } - - private static void CreateCSV(IEnumerable collection, string filePath) - { - var stringBuilder = new StringBuilder(); - - stringBuilder.AppendLine($"{nameof(PortLookupInfo.Number)},{nameof(PortLookupInfo.Protocol)},{nameof(PortLookupInfo.Service)},{nameof(PortLookupInfo.Description)}"); - - foreach (var info in collection) - stringBuilder.AppendLine($"{info.Number},{info.Protocol},{info.Service},{info.Description}"); - - System.IO.File.WriteAllText(filePath, stringBuilder.ToString()); - } - - private static void CreateCSV(IEnumerable collection, string filePath) - { - var stringBuilder = new StringBuilder(); - - stringBuilder.AppendLine($"{nameof(ConnectionInfo.Protocol)},{nameof(ConnectionInfo.LocalIPAddress)},{nameof(ConnectionInfo.LocalPort)},{nameof(ConnectionInfo.RemoteIPAddress)},{nameof(ConnectionInfo.RemotePort)},{nameof(ConnectionInfo.TcpState)}"); - - foreach (var info in collection) - stringBuilder.AppendLine($"{info.Protocol},{info.LocalIPAddress},{info.LocalPort},{info.RemoteIPAddress},{info.RemotePort},{info.TcpState}"); - - System.IO.File.WriteAllText(filePath, stringBuilder.ToString()); - } - - private static void CreateCSV(IEnumerable collection, string filePath) - { - var stringBuilder = new StringBuilder(); - - stringBuilder.AppendLine($"{nameof(ListenerInfo.Protocol)},{nameof(ListenerInfo.IPAddress)},{nameof(ListenerInfo.Port)}"); - - foreach (var info in collection) - stringBuilder.AppendLine($"{info.Protocol},{info.IPAddress},{info.Port}"); - - System.IO.File.WriteAllText(filePath, stringBuilder.ToString()); - } - - private static void CreateCSV(IEnumerable collection, string filePath) - { - var stringBuilder = new StringBuilder(); - - stringBuilder.AppendLine($"{nameof(ARPInfo.IPAddress)},{nameof(ARPInfo.MACAddress)},{nameof(ARPInfo.IsMulticast)}"); - - foreach (var info in collection) - stringBuilder.AppendLine($"{info.IPAddress},{info.MACAddress},{info.IsMulticast}"); - - System.IO.File.WriteAllText(filePath, stringBuilder.ToString()); - } - #endregion - - #region CreateXML - public static void CreateXML(IEnumerable collection, string filePath) - { - var document = new XDocument(DefaultXDeclaration, - - new XElement(ApplicationName.IPScanner.ToString(), - new XElement(nameof(HostInfo) + "s", - - from info in collection - select - new XElement(nameof(HostInfo), - new XElement(nameof(WiFiNetworkInfo.BSSID), info.BSSID), - new XElement(nameof(WiFiNetworkInfo.SSID), info.SSID), - new XElement(nameof(WiFiNetworkInfo.ChannelCenterFrequencyInKilohertz), info.ChannelCenterFrequencyInKilohertz), - new XElement(nameof(WiFiNetworkInfo.SignalBars), info.SignalBars), - new XElement(nameof(WiFiNetworkInfo.IsWiFiDirect), info.IsWiFiDirect), - new XElement(nameof(WiFiNetworkInfo.NetworkRssiInDecibelMilliwatts), info.NetworkRssiInDecibelMilliwatts), - new XElement(nameof(WiFiNetworkInfo.PhyKind), info.PhyKind), - new XElement(nameof(WiFiNetworkInfo.NetworkKind), info.NetworkKind), - new XElement(nameof(WiFiNetworkInfo.AuthenticationType), info.AuthenticationType), - new XElement(nameof(WiFiNetworkInfo.EncryptionType), info.EncryptionType), - new XElement(nameof(WiFiNetworkInfo.BeaconInterval), info.BeaconInterval), - new XElement(nameof(WiFiNetworkInfo.Uptime), info.Uptime))))); - - document.Save(filePath); - } - - public static void CreateXML(IEnumerable collection, string filePath) - { - var document = new XDocument(DefaultXDeclaration, - - new XElement(ApplicationName.IPScanner.ToString(), - new XElement(nameof(HostInfo) + "s", - - from info in collection - select - new XElement(nameof(HostInfo), - new XElement(nameof(PingInfo.IPAddress), info.PingInfo.IPAddress), - new XElement(nameof(HostInfo.Hostname), info.Hostname), - new XElement(nameof(HostInfo.MACAddress), info.MACAddress), - new XElement(nameof(HostInfo.Vendor), info.Vendor), - new XElement(nameof(PingInfo.Bytes), info.PingInfo.Bytes), - new XElement(nameof(PingInfo.Time), Ping.TimeToString(info.PingInfo.Status, info.PingInfo.Time, true)), - new XElement(nameof(PingInfo.TTL), info.PingInfo.TTL), - new XElement(nameof(PingInfo.Status), info.PingInfo.Status))))); - - document.Save(filePath); - } - - public static void CreateXML(IEnumerable collection, string filePath) - { - var document = new XDocument(DefaultXDeclaration, - - new XElement(ApplicationName.PortScanner.ToString(), - new XElement(nameof(PortInfo) + "s", - - from info in collection - select - new XElement(nameof(PortInfo), - new XElement(nameof(PortInfo.IPAddress), info.IPAddress), - new XElement(nameof(PortInfo.Hostname), info.Hostname), - new XElement(nameof(PortInfo.Port), info.Port), - new XElement(nameof(PortLookupInfo.Protocol), info.LookupInfo.Protocol), - new XElement(nameof(PortLookupInfo.Service), info.LookupInfo.Service), - new XElement(nameof(PortLookupInfo.Description), info.LookupInfo.Description), - new XElement(nameof(PortInfo.State), info.State))))); - - document.Save(filePath); - } - - public static void CreateXML(IEnumerable collection, string filePath) - { - var document = new XDocument(DefaultXDeclaration, + private static readonly XDeclaration DefaultXDeclaration = new("1.0", "utf-8", "yes"); - new XElement(ApplicationName.PingMonitor.ToString(), - new XElement(nameof(PingInfo) + "s", - - from info in collection - select - new XElement(nameof(PingInfo), - new XElement(nameof(PingInfo.Timestamp), info.Timestamp), - new XElement(nameof(PingInfo.IPAddress), info.IPAddress), - new XElement(nameof(PingInfo.Hostname), info.Hostname), - new XElement(nameof(PingInfo.Bytes), info.Bytes), - new XElement(nameof(PingInfo.Time), Ping.TimeToString(info.Status, info.Time, true)), - new XElement(nameof(PingInfo.TTL), info.TTL), - new XElement(nameof(PingInfo.Status), info.Status))))); - - document.Save(filePath); - } - - public static void CreateXML(IEnumerable collection, string filePath) - { - var document = new XDocument(DefaultXDeclaration, - - new XElement(ApplicationName.Traceroute.ToString(), - new XElement(nameof(TracerouteHopInfo) + "s", - - from info in collection - select - new XElement(nameof(TracerouteHopInfo), - new XElement(nameof(TracerouteHopInfo.Hop), info.Hop), - new XElement(nameof(TracerouteHopInfo.Time1), Ping.TimeToString(info.Status1, info.Time1, true)), - new XElement(nameof(TracerouteHopInfo.Time2), Ping.TimeToString(info.Status2, info.Time2, true)), - new XElement(nameof(TracerouteHopInfo.Time3), Ping.TimeToString(info.Status3, info.Time3, true)), - new XElement(nameof(TracerouteHopInfo.IPAddress), info.IPAddress), - new XElement(nameof(TracerouteHopInfo.Hostname), info.Hostname), - new XElement(nameof(TracerouteHopInfo.Status1), info.Status1), - new XElement(nameof(TracerouteHopInfo.Status2), info.Status2), - new XElement(nameof(TracerouteHopInfo.Status3), info.Status3))))); - - document.Save(filePath); - } - - public static void CreateXML(IEnumerable collection, string filePath) - { - var document = new XDocument(DefaultXDeclaration, - - new XElement(ApplicationName.DNSLookup.ToString(), - new XElement(nameof(DNSLookupRecordInfo) + "s", - - from info in collection - select - new XElement(nameof(DNSLookupRecordInfo), - new XElement(nameof(DNSLookupRecordInfo.DomainName), info.DomainName), - new XElement(nameof(DNSLookupRecordInfo.TTL), info.TTL), - new XElement(nameof(DNSLookupRecordInfo.Class), info.Class), - new XElement(nameof(DNSLookupRecordInfo.Type), info.Type), - new XElement(nameof(DNSLookupRecordInfo.Result), info.Result), - new XElement(nameof(DNSLookupRecordInfo.DNSServer), info.DNSServer), - new XElement(nameof(DNSLookupRecordInfo.Port), info.Port))))); - - document.Save(filePath); - } - - public static void CreateXML(IEnumerable collection, string filePath) - { - var document = new XDocument(DefaultXDeclaration, - - new XElement(ApplicationName.SNMP.ToString(), - new XElement(nameof(SNMPReceivedInfo) + "s", - - from info in collection - select - new XElement(nameof(SNMPReceivedInfo), - new XElement(nameof(SNMPReceivedInfo.OID), info.OID), - new XElement(nameof(SNMPReceivedInfo.Data), info.Data))))); - - document.Save(filePath); - } - - public static void CreateXML(IEnumerable collection, string filePath) - { - var document = new XDocument(DefaultXDeclaration, - - new XElement(ApplicationName.SNMP.ToString(), - new XElement(nameof(IPNetworkInfo) + "s", - - from info in collection - select - new XElement(nameof(IPNetworkInfo), - new XElement(nameof(IPNetworkInfo.Network), info.Network), - new XElement(nameof(IPNetworkInfo.Broadcast), info.Broadcast), - new XElement(nameof(IPNetworkInfo.Total), info.Total), - new XElement(nameof(IPNetworkInfo.Netmask), info.Netmask), - new XElement(nameof(IPNetworkInfo.Cidr), info.Cidr), - new XElement(nameof(IPNetworkInfo.FirstUsable), info.FirstUsable), - new XElement(nameof(IPNetworkInfo.LastUsable), info.LastUsable), - new XElement(nameof(IPNetworkInfo.Usable), info.Usable))))); - - document.Save(filePath); - } - - public static void CreateXML(IEnumerable collection, string filePath) - { - var document = new XDocument(DefaultXDeclaration, - - new XElement(ApplicationName.Lookup.ToString(), - new XElement(nameof(OUIInfo) + "s", - - from info in collection - select - new XElement(nameof(OUIInfo), - new XElement(nameof(OUIInfo.MACAddress), info.MACAddress), - new XElement(nameof(OUIInfo.Vendor), info.Vendor))))); - - document.Save(filePath); - } - - public static void CreateXML(IEnumerable collection, string filePath) - { - var document = new XDocument(DefaultXDeclaration, - - new XElement(ApplicationName.Lookup.ToString(), - new XElement(nameof(PortLookupInfo) + "s", - - from info in collection - select - new XElement(nameof(PortLookupInfo), - new XElement(nameof(PortLookupInfo.Number), info.Number), - new XElement(nameof(PortLookupInfo.Protocol), info.Protocol), - new XElement(nameof(PortLookupInfo.Service), info.Service), - new XElement(nameof(PortLookupInfo.Description), info.Description))))); - - document.Save(filePath); - } - - public static void CreateXML(IEnumerable collection, string filePath) - { - var document = new XDocument(DefaultXDeclaration, - - new XElement(ApplicationName.Connections.ToString(), - new XElement(nameof(ConnectionInfo) + "s", - - from info in collection - select - new XElement(nameof(ConnectionInfo), - new XElement(nameof(ConnectionInfo.Protocol), info.Protocol), - new XElement(nameof(ConnectionInfo.LocalIPAddress), info.LocalIPAddress), - new XElement(nameof(ConnectionInfo.LocalPort), info.LocalPort), - new XElement(nameof(ConnectionInfo.RemoteIPAddress), info.RemoteIPAddress), - new XElement(nameof(ConnectionInfo.RemotePort), info.RemotePort), - new XElement(nameof(ConnectionInfo.TcpState), info.TcpState))))); - - document.Save(filePath); - } - - public static void CreateXML(IEnumerable collection, string filePath) - { - var document = new XDocument(DefaultXDeclaration, - - new XElement(ApplicationName.Listeners.ToString(), - new XElement(nameof(ListenerInfo) + "s", - - from info in collection - select - new XElement(nameof(ListenerInfo), - new XElement(nameof(ListenerInfo.Protocol), info.Protocol), - new XElement(nameof(ListenerInfo.IPAddress), info.IPAddress), - new XElement(nameof(ListenerInfo.Port), info.Port))))); - - document.Save(filePath); - } - - public static void CreateXML(IEnumerable collection, string filePath) - { - var document = new XDocument(DefaultXDeclaration, - - new XElement(ApplicationName.ARPTable.ToString(), - new XElement(nameof(ARPInfo) + "s", - - from info in collection - select - new XElement(nameof(ARPInfo), - new XElement(nameof(ARPInfo.IPAddress), info.IPAddress), - new XElement(nameof(ARPInfo.MACAddress), info.MACAddress), - new XElement(nameof(ARPInfo.IsMulticast), info.IsMulticast))))); - - document.Save(filePath); - } - #endregion - - #region CreateJSON - // This might be a horror to maintain, but i have no other idea... - public static void CreateJSON(ObservableCollection collection, string filePath) - { - var jsonData = new object[collection.Count]; - - for (var i = 0; i < collection.Count; i++) - { - jsonData[i] = new - { - collection[i].BSSID, - collection[i].SSID, - ChannelCenterFrequencyInKilohertz = collection[i].SSID.ToString(), - SignalBars = collection[i].SignalBars.ToString(), - IsWiFiDirect = collection[i].IsWiFiDirect.ToString(), - NetworkRssiInDecibelMilliwatts = collection[i].NetworkRssiInDecibelMilliwatts.ToString(), - PhyKind = collection[i].PhyKind.ToString(), - NetworkKind = collection[i].NetworkKind.ToString(), - AuthenticationType = collection[i].AuthenticationType.ToString(), - EncryptionType = collection[i].EncryptionType.ToString(), - BeaconInterval = collection[i].BeaconInterval.ToString(), - Uptime = collection[i].Uptime.ToString() - }; - } - - System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); - } - - public static void CreateJSON(ObservableCollection collection, string filePath) - { - var jsonData = new object[collection.Count]; - - for (var i = 0; i < collection.Count; i++) - { - jsonData[i] = new - { - IPAddress = collection[i].PingInfo.IPAddress.ToString(), - collection[i].Hostname, - MACAddress = collection[i].MACAddress?.ToString(), - collection[i].Vendor, - collection[i].PingInfo.Bytes, - Time = Ping.TimeToString(collection[i].PingInfo.Status, collection[i].PingInfo.Time, true), - collection[i].PingInfo.TTL, - Status = collection[i].PingInfo.Status.ToString() - }; - } - - System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); - } - - public static void CreateJSON(ObservableCollection collection, string filePath) - { - var jsonData = new object[collection.Count]; - - for (var i = 0; i < collection.Count; i++) - { - jsonData[i] = new - { - IPAddress = collection[i].IPAddress.ToString(), - collection[i].Hostname, - collection[i].Port, - Protocol = collection[i].LookupInfo.Protocol.ToString(), - collection[i].LookupInfo.Service, - collection[i].LookupInfo.Description, - Status = collection[i].State.ToString() - }; - } - - System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); - } - - public static void CreateJSON(ObservableCollection collection, string filePath) - { - var jsonData = new object[collection.Count]; - - for (var i = 0; i < collection.Count; i++) - { - jsonData[i] = new - { - collection[i].Timestamp, - IPAddress = collection[i].IPAddress.ToString(), - collection[i].Hostname, - collection[i].Bytes, - Time = Ping.TimeToString(collection[i].Status, collection[i].Time, true), - collection[i].TTL, - Status = collection[i].Status.ToString() - }; - } - - System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); - } - - public static void CreateJSON(ObservableCollection collection, string filePath) - { - var jsonData = new object[collection.Count]; - - for (var i = 0; i < collection.Count; i++) - { - jsonData[i] = new - { - collection[i].Hop, - Time1 = Ping.TimeToString(collection[i].Status1, collection[i].Time1, true), - Time2 = Ping.TimeToString(collection[i].Status2, collection[i].Time2, true), - Time3 = Ping.TimeToString(collection[i].Status3, collection[i].Time3, true), - IPAddress = collection[i].IPAddress.ToString(), - collection[i].Hostname, - Status1 = collection[i].Status1.ToString(), - Status2 = collection[i].Status2.ToString(), - Status3 = collection[i].Status3.ToString() - }; - } - - System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); - } - - public static void CreateJSON(ObservableCollection collection, string filePath) - { - var jsonData = new object[collection.Count]; - - for (var i = 0; i < collection.Count; i++) - { - jsonData[i] = new - { - collection[i].DomainName, - collection[i].TTL, - collection[i].Class, - collection[i].Type, - collection[i].Result, - collection[i].DNSServer, - collection[i].Port - }; - } - - System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); - } - - public static void CreateJSON(ObservableCollection collection, string filePath) - { - var jsonData = new object[collection.Count]; - - for (var i = 0; i < collection.Count; i++) - { - jsonData[i] = new - { - collection[i].OID, - collection[i].Data - }; - } - - System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); - } - - public static void CreateJSON(ObservableCollection collection, string filePath) - { - var jsonData = new object[collection.Count]; - - for (var i = 0; i < collection.Count; i++) - { - jsonData[i] = new - { - Network = collection[i].Network.ToString(), - Broadcast = collection[i].Broadcast.ToString(), - collection[i].Total, - Netmask = collection[i].Netmask.ToString(), - collection[i].Cidr, - FirstUsable = collection[i].FirstUsable.ToString(), - LastUsable = collection[i].LastUsable.ToString(), - collection[i].Usable - }; - } - - System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); - } - - public static void CreateJSON(ObservableCollection collection, string filePath) - { - var jsonData = new object[collection.Count]; - - for (var i = 0; i < collection.Count; i++) - { - jsonData[i] = new - { - collection[i].MACAddress, - collection[i].Vendor - }; - } - - System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); - } - - public static void CreateJSON(ObservableCollection collection, string filePath) - { - var jsonData = new object[collection.Count]; - - for (var i = 0; i < collection.Count; i++) - { - jsonData[i] = new - { - collection[i].Number, - Protocol = collection[i].Protocol.ToString(), - collection[i].Service, - collection[i].Description - }; - } - - System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); - } - - public static void CreateJSON(ObservableCollection collection, string filePath) - { - var jsonData = new object[collection.Count]; - - for (var i = 0; i < collection.Count; i++) - { - jsonData[i] = new - { - Protocol = collection[i].Protocol.ToString(), - LocalIPAddress = collection[i].LocalIPAddress.ToString(), - collection[i].LocalPort, - RemoteIPAddress = collection[i].RemoteIPAddress.ToString(), - collection[i].RemotePort, - TcpState = collection[i].TcpState.ToString() - }; - } - - System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); - } - - public static void CreateJSON(ObservableCollection collection, string filePath) - { - var jsonData = new object[collection.Count]; - - for (var i = 0; i < collection.Count; i++) - { - jsonData[i] = new - { - Protocol = collection[i].Protocol.ToString(), - IPAddress = collection[i].IPAddress.ToString(), - collection[i].Port - }; - } - - System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); - } - - public static void CreateJSON(ObservableCollection collection, string filePath) - { - var jsonData = new object[collection.Count]; - - for (var i = 0; i < collection.Count; i++) - { - jsonData[i] = new - { - IPAddress = collection[i].IPAddress.ToString(), - MACAddress = collection[i].MACAddress.ToString(), - collection[i].IsMulticast - }; - } - - System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(jsonData, Formatting.Indented)); - } - #endregion - - #region CreateTXT + /// + /// Method to export text to a file. + /// + /// Path to the export file. + /// Text to export. + public static void Export(string filePath, string content) + { + CreateTxt(content, filePath); + } - public static void CreateTXT(string content, string filePath) - { - System.IO.File.WriteAllText(filePath, content); - } - #endregion + /// + /// Create a text file from the given content. + /// + /// Content of the text file. + /// Path to the export file. + private static void CreateTxt(string content, string filePath) + { + File.WriteAllText(filePath, content); + } - public static string GetFileExtensionAsString(ExportFileType fileExtension) - { - switch (fileExtension) - { - case ExportFileType.CSV: - return "CSV"; - case ExportFileType.XML: - return "XML"; - case ExportFileType.JSON: - return "JSON"; - case ExportFileType.TXT: - return "TXT"; - default: - return string.Empty; - } - } - #endregion + /// + /// Get the file extension as string from the given . + /// + /// File extension as . + /// File extension as string. + public static string GetFileExtensionAsString(ExportFileType fileExtension) + { + return fileExtension switch + { + ExportFileType.Csv => "CSV", + ExportFileType.Xml => "XML", + ExportFileType.Json => "JSON", + ExportFileType.Txt => "TXT", + _ => string.Empty + }; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Firewall/Firewall.cs b/Source/NETworkManager.Models/Firewall/Firewall.cs new file mode 100644 index 0000000000..915692d24c --- /dev/null +++ b/Source/NETworkManager.Models/Firewall/Firewall.cs @@ -0,0 +1,562 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Management.Automation.Runspaces; +using System.Net; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using NETworkManager.Models.Network; +using NETworkManager.Utilities; +using SMA = System.Management.Automation; +using log4net; + +namespace NETworkManager.Models.Firewall; + +/// +/// Provides static methods to read and modify Windows Firewall rules via PowerShell. +/// All operations share a single that is lazily initialized on +/// first use with the required execution policy and the NetSecurity module imported, +/// reducing per-call overhead. A serializes access so the +/// runspace is never used concurrently. +/// +public class Firewall +{ + #region Variables + + /// + /// The logger for this class. + /// + private static readonly ILog Log = LogManager.GetLogger(typeof(Firewall)); + + /// + /// Prefix applied to the DisplayName of every rule managed by NETworkManager. + /// Used to scope Get-NetFirewallRule queries to only our own rules. + /// + private const string RuleIdentifier = "NETworkManager_"; + + /// + /// Ensures that only one PowerShell pipeline runs on at a time. + /// + private static readonly SemaphoreSlim RunspaceLock = new(1, 1); + + /// + /// Lazily initialized PowerShell runspace. Created and configured on first access so that + /// simply navigating to the Firewall view does not start a PowerShell process unless a + /// modifying operation is actually performed. + /// + private static readonly Lazy _sharedRunspace = new(() => + { + var runspace = RunspaceFactory.CreateRunspace(); + runspace.Open(); + + using var ps = SMA.PowerShell.Create(); + ps.Runspace = runspace; + ps.AddScript(@" +Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process +Import-Module NetSecurity -ErrorAction Stop").Invoke(); + + return runspace; + }); + + /// Returns the shared runspace, initializing it on first access. + private static Runspace SharedRunspace => _sharedRunspace.Value; + + #endregion + + #region Methods + + /// + /// Retrieves all Windows Firewall rules whose display name starts with + /// and maps each one to a object. + /// PowerShell errors during the query are logged as warnings; errors for individual + /// rules are caught so a single malformed rule does not abort the entire load. + /// + /// + /// A list of objects representing the matching rules. + /// + public static async Task> GetRulesAsync() + { + await RunspaceLock.WaitAsync(); + try + { + return await Task.Run(() => + { + var rules = new List(); + + using var ps = SMA.PowerShell.Create(); + ps.Runspace = SharedRunspace; + + ps.AddScript($@" +Get-NetFirewallRule -DisplayName '{RuleIdentifier}*' | ForEach-Object {{ + $rule = $_ + $portFilter = $rule | Get-NetFirewallPortFilter + $addressFilter = $rule | Get-NetFirewallAddressFilter + $appFilter = $rule | Get-NetFirewallApplicationFilter + $ifTypeFilter = $rule | Get-NetFirewallInterfaceTypeFilter + [PSCustomObject]@{{ + Id = $rule.ID + DisplayName = $rule.DisplayName + Enabled = ($rule.Enabled -eq 'True') + Description = $rule.Description + Direction = [string]$rule.Direction + Action = [string]$rule.Action + Protocol = $portFilter.Protocol + LocalPort = ($portFilter.LocalPort -join ',') + RemotePort = ($portFilter.RemotePort -join ',') + LocalAddress = ($addressFilter.LocalAddress -join ',') + RemoteAddress = ($addressFilter.RemoteAddress -join ',') + Profile = [string]$rule.Profile + InterfaceType = [string]$ifTypeFilter.InterfaceType + Program = $appFilter.Program + }} +}}"); + + var results = ps.Invoke(); + + if (ps.Streams.Error.Count > 0) + { + foreach (var error in ps.Streams.Error) + Log.Warn($"PowerShell error: {error}"); + } + + foreach (var result in results) + { + try + { + var displayName = result.Properties["DisplayName"]?.Value?.ToString() ?? string.Empty; + + var rule = new FirewallRule + { + Id = result.Properties["Id"]?.Value?.ToString() ?? string.Empty, + IsEnabled = result.Properties["Enabled"]?.Value as bool? == true, + Name = displayName.StartsWith(RuleIdentifier, StringComparison.Ordinal) + ? displayName[RuleIdentifier.Length..] + : displayName, + Description = result.Properties["Description"]?.Value?.ToString() ?? string.Empty, + Direction = ParseDirection(result.Properties["Direction"]?.Value?.ToString()), + Action = ParseAction(result.Properties["Action"]?.Value?.ToString()), + Protocol = ParseProtocol(result.Properties["Protocol"]?.Value?.ToString()), + LocalPorts = ParsePorts(result.Properties["LocalPort"]?.Value?.ToString()), + RemotePorts = ParsePorts(result.Properties["RemotePort"]?.Value?.ToString()), + LocalAddresses = ParseAddresses(result.Properties["LocalAddress"]?.Value?.ToString()), + RemoteAddresses = ParseAddresses(result.Properties["RemoteAddress"]?.Value?.ToString()), + NetworkProfiles = ParseProfile(result.Properties["Profile"]?.Value?.ToString()), + InterfaceType = ParseInterfaceType(result.Properties["InterfaceType"]?.Value?.ToString()), + }; + + var program = result.Properties["Program"]?.Value as string; + + if (!string.IsNullOrWhiteSpace(program) && !program.Equals("Any", StringComparison.OrdinalIgnoreCase)) + rule.Program = new FirewallRuleProgram(program); + + rules.Add(rule); + } + catch (Exception ex) + { + Log.Warn($"Failed to parse firewall rule: {ex.Message}"); + } + } + + return rules; + }); + } + finally + { + RunspaceLock.Release(); + } + } + + /// + /// Enables or disables the given by running + /// Enable-NetFirewallRule or Disable-NetFirewallRule against + /// the rule's internal . + /// + /// + /// The firewall rule to modify. + /// + /// + /// to enable the rule; to disable it. + /// + /// + /// Thrown when the PowerShell pipeline reports one or more errors. + /// + public static async Task SetRuleEnabledAsync(FirewallRule rule, bool enabled) + { + await RunspaceLock.WaitAsync(); + try + { + await Task.Run(() => + { + using var ps = SMA.PowerShell.Create(); + ps.Runspace = SharedRunspace; + + ps.AddScript($@"{(enabled ? "Enable" : "Disable")}-NetFirewallRule -Name '{rule.Id}'"); + ps.Invoke(); + + if (ps.Streams.Error.Count > 0) + throw new Exception(string.Join("; ", ps.Streams.Error)); + }); + } + finally + { + RunspaceLock.Release(); + } + } + + /// + /// Permanently removes the given by running + /// Remove-NetFirewallRule against the rule's internal . + /// + /// + /// The firewall rule to delete. + /// + /// + /// Thrown when the PowerShell pipeline reports one or more errors. + /// + public static async Task DeleteRuleAsync(FirewallRule rule) + { + await RunspaceLock.WaitAsync(); + try + { + await Task.Run(() => + { + using var ps = SMA.PowerShell.Create(); + ps.Runspace = SharedRunspace; + + ps.AddScript($@"Remove-NetFirewallRule -Name '{rule.Id}'"); + ps.Invoke(); + + if (ps.Streams.Error.Count > 0) + throw new Exception(string.Join("; ", ps.Streams.Error)); + }); + } + finally + { + RunspaceLock.Release(); + } + } + + /// + /// Creates a new Windows Firewall rule with the properties specified in . + /// The rule's is prefixed with so + /// it is picked up by on the next refresh. + /// + /// + /// The firewall rule to create. + /// + /// + /// Thrown when the PowerShell pipeline reports one or more errors. + /// + public static async Task AddRuleAsync(FirewallRule rule) + { + await RunspaceLock.WaitAsync(); + try + { + await Task.Run(() => + { + using var ps = SMA.PowerShell.Create(); + ps.Runspace = SharedRunspace; + + ps.AddScript(BuildAddScript(rule)); + ps.Invoke(); + + if (ps.Streams.Error.Count > 0) + throw new Exception(string.Join("; ", ps.Streams.Error)); + }); + } + finally + { + RunspaceLock.Release(); + } + } + + /// + /// Builds the PowerShell script that calls New-NetFirewallRule with all + /// properties from . + /// + /// + /// The firewall rule whose properties are used to build the script. + /// + private static string BuildAddScript(FirewallRule rule) + { + var sb = new StringBuilder(); + sb.AppendLine("$params = @{"); + sb.AppendLine($" DisplayName = '{RuleIdentifier}{PowerShellHelper.EscapeSingleQuotes(rule.Name)}'"); + sb.AppendLine($" Enabled = '{(rule.IsEnabled ? "True" : "False")}'"); + sb.AppendLine($" Direction = '{rule.Direction}'"); + sb.AppendLine($" Action = '{rule.Action}'"); + sb.AppendLine($" Protocol = '{GetProtocolString(rule.Protocol)}'"); + sb.AppendLine($" InterfaceType = '{GetInterfaceTypeString(rule.InterfaceType)}'"); + sb.AppendLine($" Profile = '{GetProfileString(rule.NetworkProfiles)}'"); + sb.AppendLine("}"); + + if (!string.IsNullOrWhiteSpace(rule.Description)) + sb.AppendLine($"$params['Description'] = '{PowerShellHelper.EscapeSingleQuotes(rule.Description)}'"); + + if (rule.Protocol is FirewallProtocol.TCP or FirewallProtocol.UDP) + { + if (rule.LocalPorts.Count > 0) + sb.AppendLine($"$params['LocalPort'] = {ToPsArray(rule.LocalPorts.Select(p => p.ToString()))}"); + + if (rule.RemotePorts.Count > 0) + sb.AppendLine($"$params['RemotePort'] = {ToPsArray(rule.RemotePorts.Select(p => p.ToString()))}"); + } + + if (rule.LocalAddresses.Count > 0) + sb.AppendLine($"$params['LocalAddress'] = {ToPsArray(rule.LocalAddresses)}"); + + if (rule.RemoteAddresses.Count > 0) + sb.AppendLine($"$params['RemoteAddress'] = {ToPsArray(rule.RemoteAddresses)}"); + + if (rule.Program != null && !string.IsNullOrWhiteSpace(rule.Program.Name)) + sb.AppendLine($"$params['Program'] = '{PowerShellHelper.EscapeSingleQuotes(rule.Program.Name)}'"); + + sb.AppendLine("New-NetFirewallRule @params"); + + return sb.ToString(); + } + + /// + /// Builds a PowerShell array literal (e.g. @('80','443','8080-8090')) from the given values. + /// New-NetFirewallRule parameters such as -LocalPort and -LocalAddress are typed as + /// String[]; passing a single comma-joined string would be interpreted as one + /// element and rejected, so we emit a real array. + /// + /// The values to embed into the array literal. + private static string ToPsArray(IEnumerable values) => + $"@({string.Join(",", values.Select(v => $"'{PowerShellHelper.EscapeSingleQuotes(v)}'"))})"; + + /// + /// Maps a value to the string accepted by + /// New-NetFirewallRule -Protocol. + /// + /// The protocol to convert. + private static string GetProtocolString(FirewallProtocol protocol) => protocol switch + { + FirewallProtocol.Any => "Any", + FirewallProtocol.TCP => "TCP", + FirewallProtocol.UDP => "UDP", + FirewallProtocol.ICMPv4 => "ICMPv4", + FirewallProtocol.ICMPv6 => "ICMPv6", + FirewallProtocol.GRE => "GRE", + FirewallProtocol.L2TP => "L2TP", + _ => ((int)protocol).ToString() + }; + + /// + /// Maps a value to the string accepted by + /// New-NetFirewallRule -InterfaceType. + /// + /// The interface type to convert. + private static string GetInterfaceTypeString(FirewallInterfaceType interfaceType) => interfaceType switch + { + FirewallInterfaceType.Wired => "Wired", + FirewallInterfaceType.Wireless => "Wireless", + FirewallInterfaceType.RemoteAccess => "RemoteAccess", + _ => "Any" + }; + + /// + /// Converts the three-element network-profile boolean array (Domain, Private, Public) + /// to the comma-separated profile string accepted by New-NetFirewallRule -Profile. + /// All-false or all-true both map to "Any". + /// + /// Three-element boolean array (Domain=0, Private=1, Public=2). + private static string GetProfileString(bool[] profiles) + { + if (profiles == null || profiles.Length < 3 || profiles.All(p => p) || profiles.All(p => !p)) + return "Any"; + + var parts = new List(3); + if (profiles[0]) parts.Add("Domain"); + if (profiles[1]) parts.Add("Private"); + if (profiles[2]) parts.Add("Public"); + + return parts.Count == 0 ? "Any" : string.Join(",", parts); + } + + /// + /// Parses a PowerShell direction string (e.g. "Outbound") to a + /// value. Defaults to . + /// + /// + /// The raw string value returned by PowerShell. + /// + private static FirewallRuleDirection ParseDirection(string value) + { + return value switch + { + "Outbound" => FirewallRuleDirection.Outbound, + _ => FirewallRuleDirection.Inbound, + }; + } + + /// + /// Parses a PowerShell action string (e.g. "Allow") to a + /// value. Defaults to . + /// + /// + /// The raw string value returned by PowerShell. + /// + private static FirewallRuleAction ParseAction(string value) + { + return value switch + { + "Allow" => FirewallRuleAction.Allow, + _ => FirewallRuleAction.Block, + }; + } + + /// + /// Parses a PowerShell protocol string (e.g. "TCP", "Any") to a + /// value. Numeric protocol numbers are also accepted. + /// Defaults to for unrecognized values. + /// + /// + /// The raw string value returned by PowerShell. + /// + private static FirewallProtocol ParseProtocol(string value) + { + if (string.IsNullOrWhiteSpace(value) || value.Equals("Any", StringComparison.OrdinalIgnoreCase)) + return FirewallProtocol.Any; + + return value.ToUpperInvariant() switch + { + "TCP" => FirewallProtocol.TCP, + "UDP" => FirewallProtocol.UDP, + "ICMPV4" => FirewallProtocol.ICMPv4, + "ICMPV6" => FirewallProtocol.ICMPv6, + "GRE" => FirewallProtocol.GRE, + "L2TP" => FirewallProtocol.L2TP, + _ => int.TryParse(value, out var proto) ? (FirewallProtocol)proto : FirewallProtocol.Any, + }; + } + + /// + /// Parses a comma-separated port string (e.g. "80,443,8080-8090") to a list of + /// objects. + /// Returns an empty list when the value is blank or "Any". + /// + /// + /// The raw comma-separated port string returned by PowerShell. + /// + private static List ParsePorts(string value) + { + var list = new List(); + + if (string.IsNullOrWhiteSpace(value) || value.Equals("Any", StringComparison.OrdinalIgnoreCase)) + return list; + + foreach (var token in value.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)) + { + var dashIndex = token.IndexOf('-'); + + if (dashIndex > 0 && + int.TryParse(token[..dashIndex], out var start) && + int.TryParse(token[(dashIndex + 1)..], out var end)) + { + list.Add(new FirewallPortSpecification(start, end)); + } + else if (int.TryParse(token, out var port)) + { + list.Add(new FirewallPortSpecification(port)); + } + } + + return list; + } + + /// + /// Parses a PowerShell profile string (e.g. "Domain, Private") to a + /// three-element boolean array in the order Domain, Private, Public. + /// "Any" and "All" set all three entries to . + /// + /// + /// The raw profile string returned by PowerShell. + /// + private static bool[] ParseProfile(string value) + { + var profiles = new bool[3]; + + if (string.IsNullOrWhiteSpace(value)) + return profiles; + + if (value.Equals("Any", StringComparison.OrdinalIgnoreCase) || + value.Equals("All", StringComparison.OrdinalIgnoreCase)) + { + profiles[0] = profiles[1] = profiles[2] = true; + return profiles; + } + + foreach (var token in value.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)) + { + switch (token) + { + case "Domain": profiles[0] = true; break; + case "Private": profiles[1] = true; break; + case "Public": profiles[2] = true; break; + } + } + + return profiles; + } + + /// + /// Parses a comma-separated address string (e.g. "192.168.1.0/24,LocalSubnet") to a + /// list of address strings. PowerShell returns IPv4 subnets in subnet-mask notation + /// (e.g. 10.8.0.0/255.255.0.0); these are normalized back to CIDR. IPv6 subnets + /// are already returned in CIDR notation by PowerShell and are passed through unchanged. + /// Returns an empty list when the value is blank or "Any". + /// + /// + /// The raw comma-separated address string returned by PowerShell. + /// + private static List ParseAddresses(string value) + { + if (string.IsNullOrWhiteSpace(value) || value.Equals("Any", StringComparison.OrdinalIgnoreCase)) + return []; + + var addresses = new List(); + + foreach (var token in value.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)) + { + var slashIndex = token.IndexOf('/'); + + if (slashIndex > 0) + { + var maskPart = token[(slashIndex + 1)..]; + + if (RegexHelper.SubnetmaskRegex().IsMatch(maskPart) && IPAddress.TryParse(maskPart, out var mask)) + { + addresses.Add($"{token[..slashIndex]}/{Subnetmask.ConvertSubnetmaskToCidr(mask)}"); + continue; + } + } + + addresses.Add(token); + } + + return addresses; + } + + /// + /// Parses a PowerShell interface-type string (e.g. "Wired") to a + /// value. Defaults to . + /// + /// + /// The raw string value returned by PowerShell. + /// + private static FirewallInterfaceType ParseInterfaceType(string value) + { + return value switch + { + "Wired" => FirewallInterfaceType.Wired, + "Wireless" => FirewallInterfaceType.Wireless, + "RemoteAccess" => FirewallInterfaceType.RemoteAccess, + _ => FirewallInterfaceType.Any, + }; + } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Firewall/FirewallInterfaceType.cs b/Source/NETworkManager.Models/Firewall/FirewallInterfaceType.cs new file mode 100644 index 0000000000..c607dc3524 --- /dev/null +++ b/Source/NETworkManager.Models/Firewall/FirewallInterfaceType.cs @@ -0,0 +1,27 @@ +namespace NETworkManager.Models.Firewall; + +/// +/// Defines the types of network interfaces that can be used in firewall rules. +/// +public enum FirewallInterfaceType +{ + /// + /// Any interface type. + /// + Any = -1, + + /// + /// Wired interface types, e.g. Ethernet. + /// + Wired, + + /// + /// Wireless interface types, e.g. Wi-Fi. + /// + Wireless, + + /// + /// Remote interface types, e.g. VPN, L2TP, OpenVPN, etc. + /// + RemoteAccess +} diff --git a/Source/NETworkManager.Models/Firewall/FirewallPortLocation.cs b/Source/NETworkManager.Models/Firewall/FirewallPortLocation.cs new file mode 100644 index 0000000000..874cabec2e --- /dev/null +++ b/Source/NETworkManager.Models/Firewall/FirewallPortLocation.cs @@ -0,0 +1,17 @@ +namespace NETworkManager.Models.Firewall; + +/// +/// Ports of local host or remote host. +/// +public enum FirewallPortLocation +{ + /// + /// Ports of local host. + /// + LocalPorts, + + /// + /// Ports of remote host. + /// + RemotePorts +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Firewall/FirewallPortSpecification.cs b/Source/NETworkManager.Models/Firewall/FirewallPortSpecification.cs new file mode 100644 index 0000000000..f15d818c57 --- /dev/null +++ b/Source/NETworkManager.Models/Firewall/FirewallPortSpecification.cs @@ -0,0 +1,66 @@ +// ReSharper disable MemberCanBePrivate.Global +// Needed for serialization. +namespace NETworkManager.Models.Firewall; + +/// +/// Represents a specification for defining and validating firewall ports. +/// +/// +/// This class is used to encapsulate rules and configurations for +/// managing firewall port restrictions or allowances. It provides +/// properties and methods to define a range of acceptable ports or +/// individual port specifications. +/// +public class FirewallPortSpecification +{ + /// + /// Gets or sets the start point or initial value of a process, range, or operation. + /// + /// + /// The Start property typically represents the beginning state or position for sequential + /// processing or iteration. The exact usage of this property may vary depending on the context of + /// the class or object it belongs to. + /// + public int Start { get; set; } + + /// + /// Gets or sets the endpoint or final state of a process, range, or operation. + /// + /// + /// This property typically represents the termination position, time, or value + /// in a sequence, operation, or any bounded context. Its specific meaning may vary + /// depending on the context in which it is used. + /// + public int End { get; set; } + + /// + /// For serializing. + /// + public FirewallPortSpecification() + { + Start = -1; + End = -1; + } + + /// + /// Represents the specification for a firewall port, detailing its configuration + /// and rules for inbound or outbound network traffic. + /// + public FirewallPortSpecification(int start, int end = -1) + { + Start = start; + End = end; + } + + /// + /// Returns a string that represents the current object. + /// + /// A string that represents the current instance of the object. + public override string ToString() + { + if (Start is 0) + return string.Empty; + + return End is -1 or 0 ? $"{Start}" : $"{Start}-{End}"; + } +} diff --git a/Source/NETworkManager.Models/Firewall/FirewallProtocol.cs b/Source/NETworkManager.Models/Firewall/FirewallProtocol.cs new file mode 100644 index 0000000000..da54f95e6e --- /dev/null +++ b/Source/NETworkManager.Models/Firewall/FirewallProtocol.cs @@ -0,0 +1,122 @@ +// ReSharper disable InconsistentNaming +namespace NETworkManager.Models.Firewall; + +/// +/// Specifies the network protocols supported by the firewall configuration. +/// Each protocol is represented by its respective protocol number as defined in +/// the Internet Assigned Numbers Authority (IANA) protocol registry. +/// This enumeration is used to identify traffic based on its protocol type +/// for filtering or access control purposes in the firewall. +/// +public enum FirewallProtocol +{ + /// + /// Denotes the Transmission Control Protocol (TCP) used in firewall configurations. + /// TCP is a fundamental protocol within the Internet Protocol Suite, ensuring reliable + /// communication by delivering a stream of data packets in sequence with error checking + /// between networked devices. + /// + TCP = 6, + + /// + /// Represents the User Datagram Protocol (UDP) in the context of firewall rules. + /// UDP is a connectionless protocol within the Internet Protocol (IP) suite that + /// allows for minimal latency by transmitting datagrams without guaranteeing delivery, + /// order, or error recovery. + /// + UDP = 17, + + /// + /// Represents the Internet Control Message Protocol (ICMPv4) in the context of firewall rules. + /// ICMP is used by network devices, such as routers, to send error messages and operational + /// information, indicating issues like unreachable network destinations. + /// + ICMPv4 = 1, + + /// + /// Represents the Internet Control Message Protocol for IPv6 (ICMPv6) in the context of firewall rules. + /// ICMPv6 is a supporting protocol in the Internet Protocol version 6 (IPv6) suite and is used for + /// diagnostic and error-reporting purposes, as well as for functions such as Neighbor Discovery Protocol (NDP). + /// + ICMPv6 = 58, + + /// + /// Represents the IPv6 Hop-by-Hop Option (HOPOPT) protocol in the context of firewall rules. + /// HOPOPT is a special protocol used in IPv6 for carrying optional information that must be examined + /// by each node along the packet's delivery path. + /// + HOPOPT = 0, + + /// + /// Represents the Generic Routing Encapsulation (GRE) protocol in the context of firewall rules. + /// GRE is a tunneling protocol developed to encapsulate a wide variety of network layer protocols + /// inside virtual point-to-point links. It is commonly used in creating VPNs and enabling the + /// transport of multicast traffic and non-IP protocols across IP networks. + /// + GRE = 47, + + /// + /// Represents the Internet Protocol Version 6 (IPv6) in the context of firewall rules. + /// IPv6 is the most recent version of the Internet Protocol (IP) and provides identification + /// and location addressing for devices across networks, enabling communication over the internet. + /// + IPv6 = 41, + + /// + /// Represents the IPv6-Route protocol in the context of firewall rules. + /// IPv6-Route is used for routing header information in IPv6 packets, which + /// specifies the list of one or more intermediate nodes a packet should pass + /// through before reaching its destination. + /// + IPv6_Route = 43, + + /// + /// Represents the IPv6 Fragmentation Header (IPv6_Frag) in the context of firewall rules. + /// The IPv6 Fragmentation Header is used to support fragmentation and reassembly of + /// packets in IPv6 networks. It facilitates handling packets that are too large to + /// fit in the path MTU (Maximum Transmission Unit) of the network segment. + /// + IPv6_Frag = 44, + + /// + /// Represents the IPv6 No Next Header protocol in the context of firewall rules. + /// This protocol indicates that there is no next header following the current header in the IPv6 packet. + /// It is primarily used in cases where the payload does not require a specific transport protocol header. + /// + IPv6_NoNxt = 59, + + /// + /// Represents the IPv6 Options (IPv6_Opts) protocol in the context of firewall rules. + /// IPv6 Options is a part of the IPv6 suite used for carrying optional internet-layer information + /// and additional headers for specific purposes, providing extensibility in IPv6 communication. + /// + IPv6_Opts = 60, + + /// + /// Represents the Virtual Router Redundancy Protocol (VRRP) in the context of firewall rules. + /// VRRP is a network protocol that provides automatic assignment of available routers to + /// participating hosts, ensuring redundancy and high availability of router services. + /// + VRRP = 112, + + /// + /// Represents the Pragmatic General Multicast (PGM) protocol in the context of firewall rules. + /// PGM is a reliable multicast transport protocol that ensures ordered, duplicate-free, + /// and scalable delivery of data in multicast-enabled networks. + /// + PGM = 113, + + /// + /// Represents the Layer 2 Tunneling Protocol (L2TP) in the context of firewall rules. + /// L2TP is a tunneling protocol used to support virtual private networks (VPNs) or + /// as part of the delivery of services by Internet Service Providers (ISPs). + /// + L2TP = 115, + + /// + /// Represents a wildcard protocol option to match any protocol in the context of firewall rules. + /// The "Any" value can be used to specify that the rule applies to all network protocols + /// without restriction or specificity. + /// + Any = 255 +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Firewall/FirewallRule.cs b/Source/NETworkManager.Models/Firewall/FirewallRule.cs new file mode 100644 index 0000000000..bb3ea76d36 --- /dev/null +++ b/Source/NETworkManager.Models/Firewall/FirewallRule.cs @@ -0,0 +1,216 @@ +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace NETworkManager.Models.Firewall; + +/// +/// Represents a security rule used within a firewall to control network traffic based on +/// specific conditions such as IP addresses, ports, and protocols. +/// +public class FirewallRule +{ + #region Variables + + /// + /// Internal unique identifier of the rule (i.e. the value of $rule.Id in PowerShell). + /// Used to target the rule in Set-NetFirewallRule / Remove-NetFirewallRule calls. + /// + public string Id { get; set; } + + /// + /// Human-readable display name of the firewall rule. Used for display purposes + /// or as an identifier in various contexts. + /// + public string Name { get; set; } + + /// + /// Indicates whether the firewall rule is enabled. + /// + public bool IsEnabled { get; set; } = true; + + /// + /// Represents a text-based explanation or information associated with an object. + /// + public string Description { get; set; } + + /// + /// Represents the communication protocol to be used in the network configuration. + /// + public FirewallProtocol Protocol { get; set; } = FirewallProtocol.TCP; + + /// + /// Defines the direction of traffic impacted by the rule or configuration. + /// + public FirewallRuleDirection Direction { get; set; } = FirewallRuleDirection.Inbound; + + /// + /// Represents the entry point and core execution logic for an application. + /// + public FirewallRuleProgram Program { get; set; } + + /// + /// Local IP addresses or address specifiers (e.g. "192.168.1.0/24", "LocalSubnet"). + /// An empty list means "Any". + /// + public List LocalAddresses + { + get; + set + { + if (value is null) + { + field = []; + return; + } + field = value; + } + } = []; + + /// + /// Remote IP addresses or address specifiers (e.g. "10.0.0.0/8", "Internet"). + /// An empty list means "Any". + /// + public List RemoteAddresses + { + get; + set + { + if (value is null) + { + field = []; + return; + } + field = value; + } + } = []; + + /// + /// Defines the local ports associated with the firewall rule. + /// + public List LocalPorts + { + get; + set + { + if (value is null) + { + field = []; + return; + } + field = value; + } + } = []; + + /// + /// Defines the range of remote ports associated with the firewall rule. + /// + public List RemotePorts + { + get; + set + { + if (value is null) + { + field = []; + return; + } + field = value; + } + } = []; + + /// + /// Network profiles in order Domain, Private, Public. + /// + public bool[] NetworkProfiles + { + get; + set + { + if (value?.Length is not 3) + return; + field = value; + } + } = new bool[3]; + + public FirewallInterfaceType InterfaceType { get; set; } = FirewallInterfaceType.Any; + + /// + /// Represents the operation to be performed or executed. + /// + public FirewallRuleAction Action { get; set; } = FirewallRuleAction.Block; + + #endregion + + #region Constructors + + /// + /// Represents a rule within the firewall configuration. + /// Used to control network traffic based on specified criteria, such as + /// ports, protocols, the interface type, network profiles, and the used programs. + /// + public FirewallRule() + { + + } + #endregion + + #region Display properties + + /// Program path, or null when no program restriction is set. + public string ProgramDisplay => Program?.ToString(); + + /// Local addresses as a human-readable string (e.g. "192.168.1.0/24; LocalSubnet"). Returns null when unrestricted. + public string LocalAddressesDisplay => LocalAddresses.Count == 0 ? null : string.Join("; ", LocalAddresses); + + /// Local ports as a human-readable string (e.g. "80; 443; 8080-8090"). Returns null when unrestricted. + public string LocalPortsDisplay => LocalPorts.Count == 0 ? null : PortsToString(LocalPorts); + + /// Remote addresses as a human-readable string (e.g. "10.0.0.0/8"). Returns null when unrestricted. + public string RemoteAddressesDisplay => RemoteAddresses.Count == 0 ? null : string.Join("; ", RemoteAddresses); + + /// Remote ports as a human-readable string (e.g. "80; 443"). Returns null when unrestricted. + public string RemotePortsDisplay => RemotePorts.Count == 0 ? null : PortsToString(RemotePorts); + + /// + /// Network profiles (Domain / Private / Public) as a comma-separated string. + /// Returns "Any" when all three are set. + /// + public string NetworkProfilesDisplay + { + get + { + if (NetworkProfiles.Length == 3 && NetworkProfiles.All(x => x)) + return "Any"; + + var names = new List(3); + if (NetworkProfiles.Length > 0 && NetworkProfiles[0]) names.Add("Domain"); + if (NetworkProfiles.Length > 1 && NetworkProfiles[1]) names.Add("Private"); + if (NetworkProfiles.Length > 2 && NetworkProfiles[2]) names.Add("Public"); + + return names.Count == 0 ? "Any" : string.Join(", ", names); + } + } + + #endregion + + #region Methods + + /// + /// Converts a collection of port numbers to a single, comma-separated string representation. + /// + /// A collection of integers representing port numbers. + /// Separator character to use + /// Separate entries with a space. + /// A separated string containing all the port numbers from the input collection. + public static string PortsToString(List ports, char separator = ';', bool spacing = true) + { + if (ports.Count is 0) + return string.Empty; + + var delimiter = spacing ? $"{separator} " : separator.ToString(); + + return string.Join(delimiter, ports.Select(port => port.ToString())); + } + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Firewall/FirewallRuleAction.cs b/Source/NETworkManager.Models/Firewall/FirewallRuleAction.cs new file mode 100644 index 0000000000..cbb9d91887 --- /dev/null +++ b/Source/NETworkManager.Models/Firewall/FirewallRuleAction.cs @@ -0,0 +1,20 @@ +namespace NETworkManager.Models.Firewall; + +/// +/// Represents the action, if the rule filter applies. +/// +public enum FirewallRuleAction +{ + /// + /// Represents the action to block network traffic in a firewall rule. + /// + Block, + + /// + /// Represents the action to allow network traffic. + /// + Allow, + + // Unsupported for now + //AllowIPsec +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Firewall/FirewallRuleDirection.cs b/Source/NETworkManager.Models/Firewall/FirewallRuleDirection.cs new file mode 100644 index 0000000000..ddd72c116f --- /dev/null +++ b/Source/NETworkManager.Models/Firewall/FirewallRuleDirection.cs @@ -0,0 +1,18 @@ +namespace NETworkManager.Models.Firewall; + +/// +/// Represents a firewall rule direction that allows or processes network traffic +/// incoming to the system or network from external sources. +/// +public enum FirewallRuleDirection +{ + /// + /// Inbound packets. + /// + Inbound, + + /// + /// Outbound packets. + /// + Outbound +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Firewall/FirewallRuleProgram.cs b/Source/NETworkManager.Models/Firewall/FirewallRuleProgram.cs new file mode 100644 index 0000000000..46cb44d6c3 --- /dev/null +++ b/Source/NETworkManager.Models/Firewall/FirewallRuleProgram.cs @@ -0,0 +1,101 @@ +using System; +using System.IO; +using System.Text.Json.Serialization; +using System.Xml.Serialization; + +namespace NETworkManager.Models.Firewall; + +/// +/// Represents a program associated with a firewall rule. +/// +public class FirewallRuleProgram : ICloneable +{ + #region Variables + /// + /// Program to apply rule to. + /// + [JsonIgnore] + [XmlIgnore] + public FileInfo Executable + { + private set; + get + { + if (field is null && Name is not null) + field = new FileInfo(Name); + + return field; + } + } + + /// + /// Represents the name associated with the object. + /// + public string Name + { + get; + // Public modifier required for deserialization + // ReSharper disable once MemberCanBePrivate.Global + // ReSharper disable once PropertyCanBeMadeInitOnly.Global + set + { + if (string.IsNullOrWhiteSpace(value)) + return; + + Executable = new FileInfo(value); + field = value; + } + } + #endregion + + #region Constructor + /// + /// Public empty constructor is required for de-/serialization. + /// + // ReSharper disable once MemberCanBePrivate.Global + public FirewallRuleProgram() + { + } + + /// + /// Construct program reference for firewall rule. + /// + /// + public FirewallRuleProgram(string pathToExe) + { + ArgumentNullException.ThrowIfNull(pathToExe); + var exe = new FileInfo(pathToExe); + Executable = exe; + Name = exe.FullName; + } + #endregion + + #region Methods + /// + /// Convert the full file path to string. + /// + /// + public override string ToString() + { + return Executable?.FullName; + } + + /// + /// Clone instance. + /// + /// An instance clone. + public object Clone() + { + try + { + return new FirewallRuleProgram(Executable?.FullName); + } + catch (ArgumentNullException) + { + return new FirewallRuleProgram(); + } + + } + + #endregion +} diff --git a/Source/NETworkManager.Models/Generated Files/CsWinRT/WinRTEventHelpers.cs b/Source/NETworkManager.Models/Generated Files/CsWinRT/WinRTEventHelpers.cs new file mode 100644 index 0000000000..41efc07a13 --- /dev/null +++ b/Source/NETworkManager.Models/Generated Files/CsWinRT/WinRTEventHelpers.cs @@ -0,0 +1,13 @@ +//------------------------------------------------------------------------------ +// +// This file was generated by cswinrt.exe version 2.1.3.240909.1 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ +using System; +namespace WinRT +{ + +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Generated Files/WinRTEventHelpers.cs b/Source/NETworkManager.Models/Generated Files/WinRTEventHelpers.cs new file mode 100644 index 0000000000..87dba1a3c4 --- /dev/null +++ b/Source/NETworkManager.Models/Generated Files/WinRTEventHelpers.cs @@ -0,0 +1,13 @@ +//------------------------------------------------------------------------------ +// +// This file was generated by cswinrt.exe version 2.0.3.230608.1 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ +using System; +namespace WinRT +{ + +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/HostsFileEditor/HostsFileEditor.cs b/Source/NETworkManager.Models/HostsFileEditor/HostsFileEditor.cs new file mode 100644 index 0000000000..2a211c638c --- /dev/null +++ b/Source/NETworkManager.Models/HostsFileEditor/HostsFileEditor.cs @@ -0,0 +1,606 @@ +using log4net; +using NETworkManager.Utilities; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace NETworkManager.Models.HostsFileEditor; + +public static class HostsFileEditor +{ + #region Events + + public static event EventHandler HostsFileChanged; + + private static void OnHostsFileChanged() + { + Log.Debug("OnHostsFileChanged - Hosts file changed."); + HostsFileChanged?.Invoke(null, EventArgs.Empty); + } + + #endregion + + #region Variables + + private static readonly ILog Log = LogManager.GetLogger(typeof(HostsFileEditor)); + + private static readonly FileSystemWatcher HostsFileWatcher; + + /// + /// Path to the hosts folder. + /// + private static string HostsFolderPath => Path.Combine(Environment.SystemDirectory, "drivers", "etc"); + + /// + /// Path to the hosts file. + /// + public static string HostsFilePath => Path.Combine(HostsFolderPath, "hosts"); + + /// + /// Identifier for the hosts file backup. + /// + private static string HostsFileBackupIdentifier => "hosts_backup_NETworkManager"; + + /// + /// Number of backups to keep. + /// + private static int HostsFileBackupsToKeep => 5; + + /// + /// Last time a backup was created. + /// + private static DateTime _lastBackupTime = DateTime.MinValue; + + /// + /// Example values in the hosts file that should be ignored. + /// + private static readonly HashSet<(string IPAddress, string Hostname)> ExampleValuesToIgnore = + [ + ("102.54.94.97", "rhino.acme.com"), + ("38.25.63.10", "x.acme.com") + ]; + + /// + /// Regex to match a hosts file entry with optional comments, supporting IPv4, IPv6, and hostnames + /// + private static readonly Regex HostsFileEntryRegex = new(RegexHelper.HostsEntryRegex); + + #endregion + + #region Constructor + + static HostsFileEditor() + { + // Create a file system watcher to monitor changes to the hosts file + try + { + Log.Debug("HostsFileEditor - Creating file system watcher for hosts file..."); + + // Create the file system watcher + HostsFileWatcher = new FileSystemWatcher(); + HostsFileWatcher.Path = Path.GetDirectoryName(HostsFilePath) ?? + throw new InvalidOperationException("Hosts file path is invalid."); + HostsFileWatcher.Filter = Path.GetFileName(HostsFilePath) ?? + throw new InvalidOperationException("Hosts file name is invalid."); + HostsFileWatcher.NotifyFilter = NotifyFilters.LastWrite; + + // Maybe fired twice. This is a known bug/feature. + // See: https://stackoverflow.com/questions/1764809/filesystemwatcher-changed-event-is-raised-twice + HostsFileWatcher.Changed += (_, _) => OnHostsFileChanged(); + + // Enable the file system watcher + HostsFileWatcher.EnableRaisingEvents = true; + + Log.Debug("HostsFileEditor - File system watcher for hosts file created."); + } + catch (Exception ex) + { + Log.Error("Failed to create file system watcher for hosts file.", ex); + } + } + + #endregion + + #region Methods + + /// + /// Gets the entries from the hosts file asynchronously. + /// + /// A task that represents the asynchronous operation, containing all entries from the hosts file. + public static Task> GetHostsFileEntriesAsync() + { + return Task.Run(GetHostsFileEntries); + } + + /// + /// Gets the entries from the hosts file. + /// + /// All entries from the hosts file. + private static IEnumerable GetHostsFileEntries() + { + var hostsFileLines = File.ReadAllLines(HostsFilePath); + + // Parse the hosts file content + var entries = new List(); + + foreach (var line in hostsFileLines) + { + var result = HostsFileEntryRegex.Match(line.Trim()); + + if (result.Success) + { + Log.Debug($"GetHostsFileEntries - Line matched: {line}"); + + var entry = new HostsFileEntry + ( + !result.Groups[1].Value.Equals("#"), + result.Groups[2].Value, + result.Groups[3].Value.Replace(@"\s", "").Trim(), + result.Groups[4].Value.TrimStart('#', ' '), + line + ); + + // Skip example entries + if (!entry.IsEnabled) + { + if (ExampleValuesToIgnore.Contains((entry.IPAddress, entry.Hostname))) + { + Log.Debug("GetHostsFileEntries - Matched example entry. Skipping..."); + continue; + } + } + + entries.Add(entry); + } + else + { + Log.Debug($"GetHostsFileEntries - Line not matched: {line}"); + } + } + + return entries; + } + + /// + /// Enable a hosts file entry asynchronously. + /// + /// Entry to enable. + /// if the entry was enabled successfully, otherwise an error result. + public static Task EnableEntryAsync(HostsFileEntry entry) + { + return Task.Run(() => EnableEntry(entry)); + } + + /// + /// Enable a hosts file entry. + /// + /// Entry to enable. + /// if the entry was enabled successfully, otherwise an error result. + private static HostsFileEntryModifyResult EnableEntry(HostsFileEntry entry) + { + // Create a backup of the hosts file before making changes + if (CreateBackup() == false) + { + Log.Error("EnableEntry - Failed to create backup before enabling entry."); + return HostsFileEntryModifyResult.BackupError; + } + + // Enable the entry in the hosts file + List hostsFileLines; + + try + { + hostsFileLines = [.. File.ReadAllLines(HostsFilePath)]; + } + catch (Exception ex) + { + Log.Error($"EnableEntry - Failed to read hosts file: {HostsFilePath}", ex); + return HostsFileEntryModifyResult.ReadError; + } + + var entryFound = false; + + for (var i = 0; i < hostsFileLines.Count; i++) + { + if (hostsFileLines[i] != entry.Line) + continue; + + entryFound = true; + + Log.Debug($"EnableEntry - Found entry: {hostsFileLines[i]}"); + hostsFileLines.RemoveAt(i); + + var newEntry = new HostsFileEntry( + true, + entry.IPAddress, + entry.Hostname, + entry.Comment + ); + + Log.Debug($"EnableEntry - Enabling entry: {newEntry.Line}"); + hostsFileLines.Insert(i, newEntry.Line); + + break; + } + + if (!entryFound) + { + Log.Warn($"EnableEntry - Entry not found in hosts file: {entry}"); + + return HostsFileEntryModifyResult.NotFound; + } + + try + { + Log.Debug($"EnableEntry - Writing changes to hosts file: {HostsFilePath}"); + File.WriteAllLines(HostsFilePath, hostsFileLines); + } + catch (Exception ex) + { + Log.Error($"EnableEntry - Failed to write changes to hosts file: {HostsFilePath}", ex); + return HostsFileEntryModifyResult.WriteError; + } + + return HostsFileEntryModifyResult.Success; + } + + /// + /// Disable a hosts file entry asynchronously. + /// + /// Entry to disable. + /// if the entry was enabled successfully, otherwise an error result. + public static Task DisableEntryAsync(HostsFileEntry entry) + { + return Task.Run(() => DisableEntry(entry)); + } + + /// + /// Disable a hosts file entry. + /// + /// Entry to disable. + /// if the entry was enabled successfully, otherwise an error result. + private static HostsFileEntryModifyResult DisableEntry(HostsFileEntry entry) + { + // Create a backup of the hosts file before making changes + if (CreateBackup() == false) + { + Log.Error("DisableEntry - Failed to create backup before disabling entry."); + return HostsFileEntryModifyResult.BackupError; + } + + // Disable the entry in the hosts file + List hostsFileLines; + + try + { + hostsFileLines = [.. File.ReadAllLines(HostsFilePath)]; + } + catch (Exception ex) + { + Log.Error($"DisableEntry - Failed to read hosts file: {HostsFilePath}", ex); + return HostsFileEntryModifyResult.ReadError; + } + + var entryFound = false; + + for (var i = 0; i < hostsFileLines.Count; i++) + { + if (hostsFileLines[i] != entry.Line) + continue; + + entryFound = true; + + Log.Debug($"DisableEntry - Found entry: {hostsFileLines[i]}"); + hostsFileLines.RemoveAt(i); + + var newEntry = new HostsFileEntry( + false, + entry.IPAddress, + entry.Hostname, + entry.Comment + ); + + Log.Debug($"DisableEntry - Disabling entry: {newEntry.Line}"); + hostsFileLines.Insert(i, newEntry.Line); + + break; + } + + if (!entryFound) + { + Log.Warn($"DisableEntry - Entry not found in hosts file: {entry.Line}"); + return HostsFileEntryModifyResult.NotFound; + } + + try + { + Log.Debug($"DisableEntry - Writing changes to hosts file: {HostsFilePath}"); + File.WriteAllLines(HostsFilePath, hostsFileLines); + } + catch (Exception ex) + { + Log.Error($"DisableEntry - Failed to write changes to hosts file: {HostsFilePath}", ex); + return HostsFileEntryModifyResult.WriteError; + } + + return HostsFileEntryModifyResult.Success; + } + + /// + /// Add a hosts file entry asynchronously. + /// + /// Entry to add. + /// if the entry was added successfully, otherwise an error result."/> + public static Task AddEntryAsync(HostsFileEntry entry) + { + return Task.Run(() => AddEntry(entry)); + } + + /// + /// Add a hosts file entry. + /// + /// Entry to add. + /// if the entry was added successfully, otherwise an error result."/> + private static HostsFileEntryModifyResult AddEntry(HostsFileEntry entry) + { + // Create a backup of the hosts file before making changes + if (CreateBackup() == false) + { + Log.Error("AddEntry - Failed to create backup before adding entry."); + return HostsFileEntryModifyResult.BackupError; + } + + // Add the entry to the hosts file + List hostsFileLines; + + try + { + hostsFileLines = [.. File.ReadAllLines(HostsFilePath)]; + } + catch (Exception ex) + { + Log.Error($"AddEntry - Failed to read hosts file: {HostsFilePath}", ex); + return HostsFileEntryModifyResult.ReadError; + } + + Log.Debug($"AddEntry - Adding entry: {entry.Line}"); + hostsFileLines.Add(entry.Line); + + try + { + Log.Debug($"AddEntry - Writing changes to hosts file: {HostsFilePath}"); + File.WriteAllLines(HostsFilePath, hostsFileLines); + } + catch (Exception ex) + { + Log.Error($"AddEntry - Failed to write changes to hosts file: {HostsFilePath}", ex); + return HostsFileEntryModifyResult.WriteError; + } + + return HostsFileEntryModifyResult.Success; + } + + /// + /// Edit a hosts file entry asynchronously. + /// + /// Entry to edit. + /// New entry to replace the old one. + /// if the entry was edited successfully, otherwise an error result."/> + public static Task EditEntryAsync(HostsFileEntry entry, HostsFileEntry newEntry) + { + return Task.Run(() => EditEntry(entry, newEntry)); + } + + /// + /// Edit a hosts file entry. + /// + /// Entry to edit. + /// New entry to replace the old one. + /// if the entry was edited successfully, otherwise an error result."/> + private static HostsFileEntryModifyResult EditEntry(HostsFileEntry entry, HostsFileEntry newEntry) + { + // Create a backup of the hosts file before making changes + if (CreateBackup() == false) + { + Log.Error("EditEntry - Failed to create backup before editing entry."); + return HostsFileEntryModifyResult.BackupError; + } + + // Replace the entry from the hosts file + List hostsFileLines; + + try + { + hostsFileLines = [.. File.ReadAllLines(HostsFilePath)]; + } + catch (Exception ex) + { + Log.Error($"EditEntry - Failed to read hosts file: {HostsFilePath}", ex); + return HostsFileEntryModifyResult.ReadError; + } + + var entryFound = false; + + for (var i = 0; i < hostsFileLines.Count; i++) + { + if (hostsFileLines[i] != entry.Line) + continue; + + entryFound = true; + + Log.Debug($"EditEntry - Found entry: {hostsFileLines[i]}"); + hostsFileLines.RemoveAt(i); + + Log.Debug($"EditEntry - Editing entry: {newEntry.Line}"); + hostsFileLines.Insert(i, newEntry.Line); + + break; + } + + if (!entryFound) + { + Log.Warn($"EditEntry - Entry not found in hosts file: {entry.Line}"); + return HostsFileEntryModifyResult.NotFound; + } + + try + { + Log.Debug($"EditEntry - Writing changes to hosts file: {HostsFilePath}"); + File.WriteAllLines(HostsFilePath, hostsFileLines); + } + catch (Exception ex) + { + Log.Error($"EditEntry - Failed to write changes to hosts file: {HostsFilePath}", ex); + return HostsFileEntryModifyResult.WriteError; + } + + return HostsFileEntryModifyResult.Success; + } + + /// + /// Delete a hosts file entry asynchronously. + /// + /// Entry to delete."/> + /// if the entry was enabled successfully, otherwise an error result.s + public static Task DeleteEntryAsync(HostsFileEntry entry) + { + return Task.Run(() => DeleteEntry(entry)); + } + + /// + /// Delete a hosts file entry. + /// + /// Entry to delete."/> + /// if the entry was enabled successfully, otherwise an error result. + private static HostsFileEntryModifyResult DeleteEntry(HostsFileEntry entry) + { + // Create a backup of the hosts file before making changes + if (CreateBackup() == false) + { + Log.Error("DeleteEntry - Failed to create backup before deleting entry."); + return HostsFileEntryModifyResult.BackupError; + } + + // Remove the entry from the hosts file + List hostsFileLines; + + try + { + hostsFileLines = [.. File.ReadAllLines(HostsFilePath)]; + } + catch (Exception ex) + { + Log.Error($"DeleteEntry - Failed to read hosts file: {HostsFilePath}", ex); + return HostsFileEntryModifyResult.ReadError; + } + + var entryFound = false; + + for (var i = 0; i < hostsFileLines.Count; i++) + { + if (hostsFileLines[i] != entry.Line) + continue; + + entryFound = true; + + Log.Debug($"DeleteEntry - Found entry: {hostsFileLines[i]}"); + hostsFileLines.RemoveAt(i); + + break; + } + + if (!entryFound) + { + Log.Warn($"DeleteEntry - Entry not found in hosts file: {entry.Line}"); + return HostsFileEntryModifyResult.NotFound; + } + + try + { + Log.Debug($"DeleteEntry - Writing changes to hosts file: {HostsFilePath}"); + File.WriteAllLines(HostsFilePath, hostsFileLines); + } + catch (Exception ex) + { + Log.Error($"DeleteEntry - Failed to write changes to hosts file: {HostsFilePath}", ex); + return HostsFileEntryModifyResult.WriteError; + } + + return HostsFileEntryModifyResult.Success; + } + + /// + /// Create a "daily" backup of the hosts file (before making a change). + /// + private static bool CreateBackup() + { + Log.Debug($"CreateBackup - Creating backup of hosts file: {HostsFilePath}"); + + var dateTimeNow = DateTime.Now; + + // Check if a daily backup has already been created today (in the current running instance) + if (_lastBackupTime.Date == dateTimeNow.Date) + { + Log.Debug("CreateBackup - Daily backup already created today. Skipping..."); + return true; + } + + // Get existing backup files + var backupFiles = Directory.GetFiles(HostsFolderPath, $"{HostsFileBackupIdentifier}_*") + .OrderByDescending(f => f).ToList(); + + Log.Debug($"CreateBackup - Found {backupFiles.Count} backup files in {HostsFolderPath}"); + + // Cleanup old backups if they exceed the limit + if (backupFiles.Count > HostsFileBackupsToKeep) + { + for (var i = HostsFileBackupsToKeep; i < backupFiles.Count; i++) + { + try + { + Log.Debug($"CreateBackup - Deleting old backup file: {backupFiles[i]}"); + File.Delete(backupFiles[i]); + } + catch (Exception ex) + { + Log.Error($"CreateBackup - Failed to delete old backup file: {backupFiles[i]}", ex); + } + } + } + + // Check if a daily backup already exists on disk (from previous instances) + var dailyBackupFound = backupFiles.Count > 0 && + backupFiles[0].Contains($"{HostsFileBackupIdentifier}_{dateTimeNow:yyyyMMdd}"); + + if (dailyBackupFound) + { + Log.Debug("CreateBackup - Daily backup already exists on disk. Skipping..."); + + _lastBackupTime = dateTimeNow; + + return true; + } + + // Create a new backup file with the current date + try + { + Log.Debug($"CreateBackup - Creating new backup file: {HostsFileBackupIdentifier}_{dateTimeNow:yyyyMMdd}"); + File.Copy(HostsFilePath, + Path.Combine(HostsFolderPath, $"{HostsFileBackupIdentifier}_{dateTimeNow:yyyyMMdd}")); + + _lastBackupTime = dateTimeNow; + } + catch (Exception ex) + { + Log.Error($"CreateBackup - Failed to create backup file: {HostsFilePath}", ex); + return false; + } + + return true; + } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/HostsFileEditor/HostsFileEntry.cs b/Source/NETworkManager.Models/HostsFileEditor/HostsFileEntry.cs new file mode 100644 index 0000000000..6fd4c80e9e --- /dev/null +++ b/Source/NETworkManager.Models/HostsFileEditor/HostsFileEntry.cs @@ -0,0 +1,91 @@ +namespace NETworkManager.Models.HostsFileEditor; + +/// +/// Class that represents a single entry in the hosts file. +/// +public class HostsFileEntry +{ + /// + /// Indicates whether the entry is enabled or not. + /// + public bool IsEnabled { get; init; } + + /// + /// IP address of the host. + /// + public string IPAddress { get; init; } + + /// + /// Host name(s) of the host. Multiple host names are separated by a + /// space (equal to the hosts file format). + /// + public string Hostname { get; init; } + + /// + /// Comment of the host. + /// + public string Comment { get; init; } + + /// + /// Line of the entry in the hosts file. + /// + public string Line { get; init; } + + /// + /// Creates a new instance of . + /// + public HostsFileEntry() + { + + } + + /// + /// Creates a new instance of with parameters. + /// + /// Indicates whether the entry is enabled or not. + /// IP address of the host. + /// Host name(s) of the host. + /// Comment of the host. + public HostsFileEntry(bool isEnabled, string ipAddress, string hostname, string comment) + { + IsEnabled = isEnabled; + IPAddress = ipAddress; + Hostname = hostname; + Comment = comment; + + var line = isEnabled ? "" : "# "; + + line += $"{ipAddress} {hostname}"; + + if (!string.IsNullOrWhiteSpace(comment)) + line += $" # {comment}"; + + Line = line; + } + + /// + /// Creates a new instance of with parameters. + /// + /// Indicates whether the entry is enabled or not. + /// IP address of the host. + /// Host name(s) of the host. + /// Comment of the host. + /// Line of the entry in the hosts file. + public HostsFileEntry(bool isEnabled, string ipAddress, string hostname, string comment, string line) + { + IsEnabled = isEnabled; + IPAddress = ipAddress; + Hostname = hostname; + Comment = comment; + Line = line; + } + + /// + /// Overrides the ToString method to return the line of the entry in the hosts file. + /// + /// Line of the entry in the hosts file. + public override string ToString() + { + return Line; + } +} diff --git a/Source/NETworkManager.Models/HostsFileEditor/HostsFileEntryModifyResult.cs b/Source/NETworkManager.Models/HostsFileEditor/HostsFileEntryModifyResult.cs new file mode 100644 index 0000000000..8daf80a882 --- /dev/null +++ b/Source/NETworkManager.Models/HostsFileEditor/HostsFileEntryModifyResult.cs @@ -0,0 +1,33 @@ +namespace NETworkManager.Models.HostsFileEditor +{ + /// + /// Represents the result of an attempt to modify a hosts file entry. + /// + public enum HostsFileEntryModifyResult + { + /// + /// The entry was modified successfully and the hosts file was updated. + /// + Success, + + /// + /// The entry was not found in the hosts file. + /// + NotFound, + + /// + /// An error occurred while reading the hosts file. + /// + ReadError, + + /// + /// An error occurred while writing to the hosts file. + /// + WriteError, + + /// + /// An error occurred while backing up the hosts file. + /// + BackupError, + } +} diff --git a/Source/NETworkManager.Models/IPApi/DNSResolverDeserializationBaseInfo.cs b/Source/NETworkManager.Models/IPApi/DNSResolverDeserializationBaseInfo.cs new file mode 100644 index 0000000000..1f4ae665f5 --- /dev/null +++ b/Source/NETworkManager.Models/IPApi/DNSResolverDeserializationBaseInfo.cs @@ -0,0 +1,17 @@ +namespace NETworkManager.Models.IPApi; + +/// +/// Base class for (E)DNS server data used for deserialization. +/// +public class DNSResolverDeserializationBaseInfo +{ + /// + /// IP address of the (E)DNS server. + /// + public string Ip { get; set; } + + /// + /// Geographic location of the (E)DNS server. + /// + public string Geo { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/IPApi/DNSResolverDeserializationInfo.cs b/Source/NETworkManager.Models/IPApi/DNSResolverDeserializationInfo.cs new file mode 100644 index 0000000000..4dff2fb795 --- /dev/null +++ b/Source/NETworkManager.Models/IPApi/DNSResolverDeserializationInfo.cs @@ -0,0 +1,17 @@ +namespace NETworkManager.Models.IPApi; + +/// +/// Class for (E)DNS server data used for deserialization. +/// +public class DNSResolverDeserializationInfo +{ + /// + /// DNS server data. + /// + public DNSResolverDeserializationBaseInfo Dns { get; set; } + + /// + /// EDNS server data. + /// + public DNSResolverDeserializationBaseInfo Edns { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/IPApi/DNSResolverInfo.cs b/Source/NETworkManager.Models/IPApi/DNSResolverInfo.cs new file mode 100644 index 0000000000..c54b7a4265 --- /dev/null +++ b/Source/NETworkManager.Models/IPApi/DNSResolverInfo.cs @@ -0,0 +1,54 @@ +namespace NETworkManager.Models.IPApi; + +/// +/// Class contains the DNS resolver information. +/// +public class DNSResolverInfo +{ + /// + /// Create an instance of with parameters. + /// + /// IP address of the DNS server. + /// Geographic location of the DNS server. + /// IP address of the EDNS server. + /// Geographic location of the EDNS server. + private DNSResolverInfo(string dnsIp, string dnsGeo, string ednsIp, string ednsGeo) + { + DnsIp = dnsIp; + DnsGeo = dnsGeo; + EdnsIp = ednsIp; + EdnsGeo = ednsGeo; + } + + /// + /// IP address of the DNS server. + /// + public string DnsIp { get; set; } + + /// + /// Geographic location of the DNS server. + /// + public string DnsGeo { get; set; } + + + /// + /// IP address of the Edns server. + /// + public string EdnsIp { get; set; } + + /// + /// Geographic location of the Edns server. + /// + public string EdnsGeo { get; set; } + + /// + /// Parses the DNS resolver from the deserialization info. + /// + /// to parse to . + /// New instance of from data. + public static DNSResolverInfo Parse(DNSResolverDeserializationInfo info) + { + // Strings can be null if no data is available. + return new DNSResolverInfo(info.Dns?.Ip, info.Dns?.Geo, info.Edns?.Ip, info.Edns?.Geo); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/IPApi/DNSResolverResult.cs b/Source/NETworkManager.Models/IPApi/DNSResolverResult.cs new file mode 100644 index 0000000000..f23b2a54ab --- /dev/null +++ b/Source/NETworkManager.Models/IPApi/DNSResolverResult.cs @@ -0,0 +1,58 @@ +namespace NETworkManager.Models.IPApi; + +/// +/// Class contains the result of the DNS resolver information retrieval. +/// +public class DNSResolverResult +{ + /// + /// Creates a new instance of with the DNS resolver information. + /// + /// DNS resolver information retrieved from the API. + public DNSResolverResult(DNSResolverInfo info) + { + Info = info; + } + + /// + /// Create a new instance of with an error message. + /// + /// Indicates if the DNS resolver information retrieval has failed. + /// Error message if the DNS resolver information retrieval has failed. + public DNSResolverResult(bool hasError, string errorMessage) + { + HasError = hasError; + ErrorMessage = errorMessage; + } + + /// + /// Create a new instance of with an error message and an error code. + /// + /// Indicates if the DNS resolver information retrieval has failed. + /// Error message if the DNS resolver information retrieval has failed. + /// Error code if the DNS resolver information retrieval has failed. + public DNSResolverResult(bool hasError, string errorMessage, int errorCode) : this(hasError, errorMessage) + { + ErrorCode = errorCode; + } + + /// + /// DNS resolver information retrieved from the API. + /// + public DNSResolverInfo Info { get; } + + /// + /// Indicates if the DNS resolver information retrieval has failed. + /// + public bool HasError { get; set; } + + /// + /// Error message if the DNS resolver information retrieval has failed. + /// + public string ErrorMessage { get; set; } + + /// + /// Error code if the DNS resolver information retrieval has failed. + /// + public int ErrorCode { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/IPApi/DNSResolverService.cs b/Source/NETworkManager.Models/IPApi/DNSResolverService.cs new file mode 100644 index 0000000000..67c86d04f4 --- /dev/null +++ b/Source/NETworkManager.Models/IPApi/DNSResolverService.cs @@ -0,0 +1,47 @@ +using System; +using System.Net.Http; +using System.Threading.Tasks; +using NETworkManager.Utilities; +using Newtonsoft.Json; + +namespace NETworkManager.Models.IPApi; + +/// +/// Class to interact with the DNS resolver API from ip-api.com. +/// Documentation is available at https://ip-api.com/docs +/// +public class DNSResolverService : SingletonBase +{ + /// + /// Base URL fo the edns.ip-api. + /// + private const string BaseUrl = "https://edns.ip-api.com/json"; + + private readonly HttpClient _client = new(); + + /// + /// Gets the IP DNS details from the API asynchronously. + /// + /// IP DNS information's as . + public async Task GetDNSResolverAsync() + { + try + { + var response = await _client.GetAsync(BaseUrl); + + if (response.IsSuccessStatusCode) + { + var json = await response.Content.ReadAsStringAsync(); + var info = JsonConvert.DeserializeObject(json); + + return new DNSResolverResult(DNSResolverInfo.Parse(info)); + } + + return new DNSResolverResult(true, response.ReasonPhrase, (int)response.StatusCode); + } + catch (Exception ex) + { + return new DNSResolverResult(true, ex.Message); + } + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/IPApi/IPGeolocationInfo.cs b/Source/NETworkManager.Models/IPApi/IPGeolocationInfo.cs new file mode 100644 index 0000000000..7901ea2d24 --- /dev/null +++ b/Source/NETworkManager.Models/IPApi/IPGeolocationInfo.cs @@ -0,0 +1,127 @@ +namespace NETworkManager.Models.IPApi; + +/// +/// Class contains the IP geolocation information. +/// +public class IPGeolocationInfo +{ + /// + /// Status of the IP geolocation information retrieval. + /// + public string Status { get; set; } + + /// + /// Continent where the IP address is located. + /// + public string Continent { get; set; } + + /// + /// Continent code where the IP address is located. + /// + public string ContinentCode { get; set; } + + /// + /// Country where the IP address is located. + /// + public string Country { get; set; } + + /// + /// Country code where the IP address is located. + /// + public string CountryCode { get; set; } + + /// + /// Region where the IP address is located. + /// + public string Region { get; set; } + + /// + /// Region name where the IP address is located. + /// + public string RegionName { get; set; } + + /// + /// City where the IP address is located. + /// + public string City { get; set; } + + /// + /// District where the IP address is located. + /// + public string District { get; set; } + + /// + /// Zip code of the location where the IP address is located. + /// + public string Zip { get; set; } + + /// + /// Latitude of the location where the IP address is located. + /// + public double Lat { get; set; } + + /// + /// Longitude of the location where the IP address is located. + /// + public double Lon { get; set; } + + /// + /// Timezone of the location where the IP address is located. + /// + public string Timezone { get; set; } + + /// + /// Offset from UTC in seconds for the location where the IP address is located. + /// + public int Offset { get; set; } + + /// + /// Currency used in the country where the IP address is located. + /// + public string Currency { get; set; } + + /// + /// Internet Service Provider (ISP) of the IP address. + /// + public string Isp { get; set; } + + /// + /// Organization associated with the IP address. + /// + public string Org { get; set; } + + /// + /// Autonomous System (AS) number and name associated with the IP address. + /// + public string As { get; set; } + + /// + /// Name of the Autonomous System (AS) associated with the IP address. + /// + public string Asname { get; set; } + + /// + /// Reverse DNS hostname associated with the IP address. + /// + public string Reverse { get; set; } + + /// + /// Indicates whether the IP address is associated with a mobile network. + /// + public bool Mobile { get; set; } + + /// + /// Indicates whether the IP address is a proxy server. + /// + public bool Proxy { get; set; } + + /// + /// Indicates whether the IP address is associated with hosting services. + /// + public bool Hosting { get; set; } + + /// + /// IP address used for the query. + /// + public string Query { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/IPApi/IPGeolocationResult.cs b/Source/NETworkManager.Models/IPApi/IPGeolocationResult.cs new file mode 100644 index 0000000000..ba573767bc --- /dev/null +++ b/Source/NETworkManager.Models/IPApi/IPGeolocationResult.cs @@ -0,0 +1,81 @@ +namespace NETworkManager.Models.IPApi; + +/// +/// Class contains the result of the IP geolocation information retrieval. +/// +public class IPGeolocationResult +{ + /// + /// Creates a new instance of . + /// + public IPGeolocationResult() + { + } + + /// + /// Creates a new instance of with the IP geolocation information. + /// + /// IP geolocation information retrieved from the API. + public IPGeolocationResult(IPGeolocationInfo info) + { + Info = info; + } + + /// + /// Create a new instance of that indicates that the rate limit + /// of the API is reached. + /// + /// Indicates if the rate limit of the API is reached. + /// Remaining time in seconds until the rate limit window resets. + public IPGeolocationResult(bool isRateLimitReached, int rateLimitRemainingTime) + { + RateLimitIsReached = isRateLimitReached; + RateLimitRemainingTime = rateLimitRemainingTime; + } + + /// + /// Create a new instance of with an error message and an error code. + /// + /// Indicates if the IP geolocation information retrieval has failed. + /// Error message if the IP geolocation information retrieval has failed. + /// + /// Error code if the IP geolocation information retrieval has failed (or -1 if exception was + /// thrown). + /// + public IPGeolocationResult(bool hasError, string errorMessage, int errorCode) + { + HasError = hasError; + ErrorMessage = errorMessage; + ErrorCode = errorCode; + } + + /// + /// IP geolocation information retrieved from the API. + /// + public IPGeolocationInfo Info { get; set; } = new(); + + /// + /// Indicates if the rate limit of the API is reached. + /// + public bool RateLimitIsReached { get; set; } + + /// + /// Remaining time in seconds until the rate limit window resets. + /// + public int RateLimitRemainingTime { get; set; } + + /// + /// Indicates if the IP geolocation information retrieval has failed. + /// + public bool HasError { get; set; } + + /// + /// Error message if the IP geolocation information retrieval has failed. + /// + public string ErrorMessage { get; set; } + + /// + /// Error code if the IP geolocation information retrieval has failed. + /// + public int ErrorCode { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/IPApi/IPGeolocationService.cs b/Source/NETworkManager.Models/IPApi/IPGeolocationService.cs new file mode 100644 index 0000000000..02ef1f96d5 --- /dev/null +++ b/Source/NETworkManager.Models/IPApi/IPGeolocationService.cs @@ -0,0 +1,163 @@ +using System; +using System.Linq; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Threading.Tasks; +using NETworkManager.Utilities; +using Newtonsoft.Json; + +namespace NETworkManager.Models.IPApi; + +/// +/// Class to interact with the IP geolocation API from ip-api.com. +/// Documentation is available at https://ip-api.com/docs +/// +public class IPGeolocationService : SingletonBase +{ + /// + /// Base URL fo the ip-api free endpoint. + /// + private const string BaseUrl = "http://ip-api.com/json/"; + + /// + /// Fields to be returned by the API. See documentation for more details. + /// + private const string Fields = + "status,message,continent,continentCode,country,countryCode,region,regionName,city,district,zip,lat,lon,timezone,offset,currency,isp,org,as,asname,reverse,mobile,proxy,hosting,query"; + + private readonly HttpClient _client = new(); + + /// + /// Indicates whether we have reached the rate limit. + /// + private bool _rateLimitIsReached; + + /// + /// Last time the rate limit was reached. + /// + private DateTime _rateLimitLastReached = DateTime.MinValue; + + /// + /// Remaining requests that can be processed until the rate limit window is reset. + /// This value is updated by Header "X-Rl". Default is 45 requests. + /// + private int _rateLimitRemainingRequests = 45; + + /// + /// Remaining time in seconds until the rate limit window resets. + /// This value is updated by Header "X-Ttl". Default is 60 seconds. + /// + private int _rateLimitRemainingTime = 60; + + /// + /// Gets the IP geolocation details from the API asynchronously. + /// + /// IP address or FQDN to get the geolocation information's from. + /// IP geolocation information's as . + public async Task GetIPGeolocationAsync(string ipAddressOrFqdn = "") + { + if (IsInRateLimit()) + return new IPGeolocationResult(true, _rateLimitRemainingTime); + + // If the url is empty, the current IP address from which the request is made is used. + var url = $"{BaseUrl}/{ipAddressOrFqdn}?fields={Fields}"; + + try + { + var response = await _client.GetAsync(url); + + // Check if the request was successful. + if (response.IsSuccessStatusCode) + { + // Update rate limit values. + if (!UpdateRateLimit(response.Headers)) + return new IPGeolocationResult(true, + "The rate limit values couldn't be extracted from the http header. The request was probably corrupted. Try again in a few seconds.", + -1); + + var json = await response.Content.ReadAsStringAsync(); + var info = JsonConvert.DeserializeObject(json); + + return new IPGeolocationResult(info); + } + + // Consider the request as failed if the status code is not successful or 429. + if ((int)response.StatusCode != 429) + return new IPGeolocationResult(true, response.ReasonPhrase, (int)response.StatusCode); + + // Code 429 + // We have already reached the rate limit (on the network) + // Since we don't get any information about the remaining time, we set it to the default value. + _rateLimitIsReached = true; + _rateLimitRemainingTime = 60; + _rateLimitRemainingRequests = 0; + _rateLimitLastReached = DateTime.Now; + + return new IPGeolocationResult(true, _rateLimitRemainingTime); + } + catch (Exception ex) + { + return new IPGeolocationResult(true, ex.Message, -1); + } + } + + /// + /// Checks whether the rate limit is reached. + /// + /// True if the rate limit is reached, false otherwise. + private bool IsInRateLimit() + { + // If the rate limit is not reached, return false. + if (!_rateLimitIsReached) + return false; + + // The rate limit time window is reset when the remaining time is over. + var lastReached = _rateLimitLastReached; + + // We are still in the rate limit + if (lastReached.AddSeconds(_rateLimitRemainingTime + 1) >= DateTime.Now) + return true; + + // We are not in the rate limit anymore + _rateLimitIsReached = false; + + return false; + } + + /// + /// Updates the rate limit values. + /// + /// Headers from the response. + /// True if the update was successful, false otherwise. + private bool UpdateRateLimit(HttpHeaders headers) + { + // Parse header data + if (!headers.TryGetValues("X-Rl", out var xRl)) + return false; + + if (!int.TryParse(xRl.ToArray()[0], out var remainingRequests)) + return false; + + if (!headers.TryGetValues("X-Ttl", out var xTtl)) + return false; + + if (!int.TryParse(xTtl.ToArray()[0], out var remainingTime)) + return false; + + _rateLimitRemainingTime = remainingTime; + _rateLimitRemainingRequests = remainingRequests; + + // Only allow 40 requests... to prevent a 429 error if other + // devices or tools on the network (e.g. another NETworkManager + // instance) doing requests against ip-api.com. + if (_rateLimitRemainingRequests >= 5) + return true; + + // We have reached the rate limit (on the network) + // Disable the service and store the time when the rate limit was reached. + _rateLimitIsReached = true; + _rateLimitLastReached = DateTime.Now; + + return true; + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Lookup/OUIInfo.cs b/Source/NETworkManager.Models/Lookup/OUIInfo.cs index d268317500..5f38da3d0b 100644 --- a/Source/NETworkManager.Models/Lookup/OUIInfo.cs +++ b/Source/NETworkManager.Models/Lookup/OUIInfo.cs @@ -1,17 +1,28 @@ -namespace NETworkManager.Models.Lookup +namespace NETworkManager.Models.Lookup; + +/// +/// Class to hold OUI information. +/// +public class OUIInfo { - public class OUIInfo + /// + /// Creates a new instance of the class with the specified parameters. + /// + /// MAC address. + /// Name of the vendor. + public OUIInfo(string macAddress, string vendor) { - public string MACAddress { get; set; } - public string Vendor { get; set; } - - public string MACAddressString => MACAddress.Replace("-", "").Replace(":", ""); - - public OUIInfo(string macAddress, string vendor) - { - MACAddress = macAddress; - Vendor = vendor; - } + MACAddress = macAddress; + Vendor = vendor; } -} + /// + /// MAC address. + /// + public string MACAddress { get; set; } + + /// + /// Name of the vendor. + /// + public string Vendor { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Lookup/OUILookup.cs b/Source/NETworkManager.Models/Lookup/OUILookup.cs index 6692021c91..20cc8e4654 100644 --- a/Source/NETworkManager.Models/Lookup/OUILookup.cs +++ b/Source/NETworkManager.Models/Lookup/OUILookup.cs @@ -1,74 +1,134 @@ -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.IO; +using System.Linq; +using System.Reflection; using System.Text.RegularExpressions; -using System; +using System.Threading.Tasks; using System.Xml; -using System.Reflection; -namespace NETworkManager.Models.Lookup +namespace NETworkManager.Models.Lookup; + +/// +/// Class for looking up OUI information. +/// +public static class OUILookup { - public static class OUILookup + #region Constructor + + /// + /// Loads the OUI XML file and creates the lookup. + /// + static OUILookup() + { + OUIInfoList = []; + + var document = new XmlDocument(); + document.Load(OuiFilePath); + + foreach (XmlNode node in document.SelectNodes("/OUIs/OUI")!) + if (node != null) + OUIInfoList.Add(new OUIInfo(node.SelectSingleNode("MACAddress")?.InnerText, + node.SelectSingleNode("Vendor")?.InnerText)); + + OUIInfoLookup = (Lookup)OUIInfoList.ToLookup(x => x.MACAddress); + } + + #endregion + + #region Variables + + /// + /// Path to the xml file with the oui information's located in the resources folder. + /// + private static readonly string OuiFilePath = + Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly()?.Location)!, "Resources", "OUI.xml"); + + /// + /// List of with OUI information. + /// + private static readonly List OUIInfoList; + + /// + /// Lookup of with OUI information. Key is the MAC address. + /// + private static readonly Lookup OUIInfoLookup; + + #endregion + + #region Methods + + /// + /// Get the for the given MAC address async. + /// + /// MAC address to get the OUI information's for. + /// List of . Empty if nothing was found. + public static Task> LookupByMacAddressAsync(string macAddress) + { + return Task.Run(() => LookupByMacAddress(macAddress)); + } + + /// + /// Get the for the given MAC address. + /// + /// MAC address to get the OUI information's for. + /// List of . Empty if nothing was found. + public static List LookupByMacAddress(string macAddress) { - #region Variables - private static readonly string OuiFilePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Resources", "OUI.xml"); - - private static readonly List OUIInfoList; - private static readonly Lookup OUIInfoLookup; - #endregion - - #region Constructor - static OUILookup() - { - OUIInfoList = new List(); - - var document = new XmlDocument(); - document.Load(OuiFilePath); - - foreach (XmlNode node in document.SelectNodes("/OUIs/OUI")) - { - if (node != null) - OUIInfoList.Add(new OUIInfo(node.SelectSingleNode("MACAddress")?.InnerText, node.SelectSingleNode("Vendor")?.InnerText)); - } - - OUIInfoLookup = (Lookup)OUIInfoList.ToLookup(x => x.MACAddress); - } - #endregion - - #region Methods - public static Task> LookupAsync(string macAddress) - { - return Task.Run(() => Lookup(macAddress)); - } - - public static List Lookup(string macAddress) - { - var ouiKey = Regex.Replace(macAddress, "[-|:|.]", "").Substring(0, 6).ToUpper(); - - return OUIInfoLookup[ouiKey].ToList(); - } - - public static Task> LookupByVendorAsync(List vendors) - { - return Task.Run(() => LookupByVendor(vendors)); - } - - public static List LookupByVendor(List vendors) - { - var list = new List(); - - foreach (var info in OUIInfoList) - { - foreach (var vendor in vendors) - { - if (info.Vendor.IndexOf(vendor, StringComparison.OrdinalIgnoreCase) > -1) - list.Add(info); - } - } - - return list; - } - #endregion + var ouiKey = Regex.Replace(macAddress, "[-|:|.]", "")[..6].ToUpper(); + + return OUIInfoLookup[ouiKey].ToList(); } -} + + /// + /// Search by the given vendor async. + /// + /// Vendor to look up. + /// or null if not found. + public static Task> SearchByVendorAsync(string vendor) + { + return Task.Run(() => SearchByVendor(vendor)); + } + + /// + /// Search by the given vendor. + /// + /// Vendor to look up. + /// or null if not found. + [SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] + public static List SearchByVendor(string vendor) + { + return (from info in OUIInfoList + where info.Vendor.IndexOf(vendor, StringComparison.OrdinalIgnoreCase) > -1 + select info + ).ToList(); + } + + /// + /// Search by the given vendors async. + /// + /// Vendors to look up. + /// List of . Empty if nothing was found. + public static Task> SearchByVendorsAsync(IReadOnlyCollection vendors) + { + return Task.Run(() => SearchByVendors(vendors)); + } + + /// + /// Search by the given vendors. + /// + /// Vendors to look up. + /// List of . Empty if nothing was found. + [SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] + public static List SearchByVendors(IReadOnlyCollection vendors) + { + return (from info in OUIInfoList + from vendor in vendors + where info.Vendor.IndexOf(vendor, StringComparison.OrdinalIgnoreCase) > -1 + select info + ).ToList(); + } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Lookup/PortLookup.Protocol.cs b/Source/NETworkManager.Models/Lookup/PortLookup.Protocol.cs deleted file mode 100644 index c89fa9942b..0000000000 --- a/Source/NETworkManager.Models/Lookup/PortLookup.Protocol.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace NETworkManager.Models.Lookup -{ - public static partial class PortLookup - { - public enum Protocol - { - Tcp, - Udp, - Sctp, - Dccp - } - } -} diff --git a/Source/NETworkManager.Models/Lookup/PortLookup.cs b/Source/NETworkManager.Models/Lookup/PortLookup.cs index 4476f2da9f..cef648b1cc 100644 --- a/Source/NETworkManager.Models/Lookup/PortLookup.cs +++ b/Source/NETworkManager.Models/Lookup/PortLookup.cs @@ -1,78 +1,139 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.IO; using System.Linq; +using System.Reflection; using System.Threading.Tasks; -using System; using System.Xml; -using System.IO; -using System.Reflection; +using NETworkManager.Models.Network; -namespace NETworkManager.Models.Lookup +namespace NETworkManager.Models.Lookup; + +public static class PortLookup { - public static partial class PortLookup + #region Constructor + + /// + /// Loads the ports XML file and creates the lookup. + /// + static PortLookup() { - #region Variables - private static readonly string PortsFilePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Resources", "Ports.xml"); + PortList = []; - private static readonly List PortList; - private static readonly Lookup Ports; - #endregion + var document = new XmlDocument(); + document.Load(PortsFilePath); - #region Constructor - static PortLookup() + foreach (XmlNode node in document.SelectNodes("/Ports/Port")!) { - PortList = new List(); + if (node == null) + continue; - var document = new XmlDocument(); - document.Load(PortsFilePath); + if (int.TryParse(node.SelectSingleNode("Number")?.InnerText, out var port) && + Enum.TryParse(node.SelectSingleNode("Protocol")?.InnerText, true, out var protocol)) + PortList.Add(new PortLookupInfo(port, protocol, node.SelectSingleNode("Name")?.InnerText, + node.SelectSingleNode("Description")?.InnerText)); + } - foreach (XmlNode node in document.SelectNodes("/Ports/Port")) - { - if (node == null) - continue; + Ports = (Lookup)PortList.ToLookup(x => x.Number); + } - int.TryParse(node.SelectSingleNode("Number")?.InnerText, out var port); - Enum.TryParse(node.SelectSingleNode("Protocol")?.InnerText, true, out var protocol); + #endregion - PortList.Add(new PortLookupInfo(port, protocol, node.SelectSingleNode("Name")?.InnerText, node.SelectSingleNode("Description")?.InnerText)); - } + #region Variables - Ports = (Lookup)PortList.ToLookup(x => x.Number); - } - #endregion + /// + /// Path to the xml file with all ports, protocols and services located in the resources folder. + /// + private static readonly string PortsFilePath = + Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly()?.Location)!, "Resources", "Ports.xml"); - #region Methods - public static Task> LookupAsync(int port) - { - return Task.Run(() => Lookup(port)); - } + /// + /// List of with all ports, protocols and services. + /// + private static readonly List PortList; - public static List Lookup(int port) - { - return Ports[port].ToList(); - } + /// + /// Lookup of with all ports, protocols and services. Key is the port number. + /// + private static readonly Lookup Ports; - public static Task> LookupByServiceAsync(List portsByService) - { - return Task.Run(() => LookupByService(portsByService)); - } + #endregion - public static List LookupByService(List portsByService) - { - var list = new List(); + #region Methods - foreach (var info in PortList) - { - foreach (var portByService in portsByService) - { - if (info.Service.IndexOf(portByService, StringComparison.OrdinalIgnoreCase) > -1 || info.Description.IndexOf(portByService, StringComparison.OrdinalIgnoreCase) > -1) - list.Add(info); - } - } + /// + /// Get by port number async. + /// For e.g. port 22 will return 22/tcp, 22/udp and 22/sctp. + /// + /// Port number to get. + /// List of . Empty if nothing was found. + public static Task> LookupByPortAsync(int port) + { + return Task.Run(() => LookupByPort(port)); + } - return list; + /// + /// Get by port number. + /// For e.g. port 22 will return 22/tcp, 22/udp and 22/sctp. + /// + /// Port number to get. + /// List of . Empty if nothing was found. + [SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] + public static List LookupByPort(int port) + { + return Ports[port].ToList(); + } - } + /// + /// Search for by service or description async. + /// For e.g. "ssh" will return 22/tcp, 22/udp and 22/sctp. + /// + /// Service or description to search for. + /// List of . Empty if nothing was found. + public static Task> SearchByServiceAsync(string search) + { + return Task.Run(() => SearchByService(search)); + } -#endregion + /// + /// Search for by service or description. + /// For e.g. "ssh" will return 22/tcp, 22/udp and 22/sctp. + /// + /// Service or description to search for. + /// List of . Empty if nothing was found. + [SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] + public static List SearchByService(string search) + { + return PortList.Where(info => + info.Service.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1 || + info.Description.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1 + ).ToList(); } -} + + /// + /// Get by port and protocol async. + /// + /// Port number to get. + /// Port protocol to get. Default is . + /// Port and protocol as . Empty if nothing was found. + public static Task LookupByPortAndProtocolAsync(int port, + TransportProtocol protocol = TransportProtocol.Tcp) + { + return Task.Run(() => LookupByPortAndProtocol(port, protocol)); + } + + /// + /// Get by port and protocol async. + /// + /// Port number to get. + /// Port protocol to get. Default is . + /// Port and protocol as . Empty if nothing was found. + public static PortLookupInfo LookupByPortAndProtocol(int port, TransportProtocol protocol = TransportProtocol.Tcp) + { + return Ports[port].ToList().FirstOrDefault(x => x.Protocol.Equals(protocol)) ?? + new PortLookupInfo(port, protocol, "-/-", "-/-"); + } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Lookup/PortLookupInfo.cs b/Source/NETworkManager.Models/Lookup/PortLookupInfo.cs index c876b5074c..c3ca96459c 100644 --- a/Source/NETworkManager.Models/Lookup/PortLookupInfo.cs +++ b/Source/NETworkManager.Models/Lookup/PortLookupInfo.cs @@ -1,18 +1,56 @@ -namespace NETworkManager.Models.Lookup +using System.Diagnostics.CodeAnalysis; +using NETworkManager.Models.Network; + +namespace NETworkManager.Models.Lookup; + +/// +/// Class with information about a port, protocol and service. +/// +public class PortLookupInfo { - public class PortLookupInfo + /// + /// Create an instance of with parameters. + /// + /// Port number. + /// Port protocol. + [SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] + public PortLookupInfo(int number, TransportProtocol protocol) { - public int Number { get; set; } - public PortLookup.Protocol Protocol { get; set; } - public string Service { get; set; } - public string Description { get; set; } + Number = number; + Protocol = protocol; + } - public PortLookupInfo(int number, PortLookup.Protocol protocol, string service, string description) - { - Number = number; - Protocol = protocol; - Service = service; - Description = description; - } + /// + /// Create an instance of with parameters. + /// + /// Port number. + /// Port protocol. + /// Service associated with the port number and protocol. + /// Description of the service associated with the port number and protocol. + public PortLookupInfo(int number, TransportProtocol protocol, string service, string description) : this(number, + protocol) + { + Service = service; + Description = description; } -} + + /// + /// Port number. + /// + public int Number { get; set; } + + /// + /// Port protocol. + /// + public TransportProtocol Protocol { get; set; } + + /// + /// Service associated with the port number and protocol. + /// + public string Service { get; set; } + + /// + /// Description of the service associated with the port number and protocol. + /// + public string Description { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/NETworkManager.Models.csproj b/Source/NETworkManager.Models/NETworkManager.Models.csproj index 3ca65a1c35..df4cb4fbe7 100644 --- a/Source/NETworkManager.Models/NETworkManager.Models.csproj +++ b/Source/NETworkManager.Models/NETworkManager.Models.csproj @@ -1,62 +1,66 @@ - - - {8A2859DC-38B6-4E9D-A6B2-1828DC6641B3} - Library - NETworkManager.Models - NETworkManager.Models - net6.0-windows10.0.17763.0 - win10-x64 - false - sdk - true - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + {8A2859DC-38B6-4E9D-A6B2-1828DC6641B3} + Library + NETworkManager.Models + NETworkManager.Models + net10.0-windows10.0.22621.0 + false + sdk + true + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - - PreserveNewest - - + + + PreserveNewest + + - - - PreserveNewest - - - PreserveNewest - - - \ No newline at end of file + + + PreserveNewest + + + PreserveNewest + + + + + + + diff --git a/Source/NETworkManager.Models/Network/ARP.cs b/Source/NETworkManager.Models/Network/ARP.cs deleted file mode 100644 index 01406684d2..0000000000 --- a/Source/NETworkManager.Models/Network/ARP.cs +++ /dev/null @@ -1,217 +0,0 @@ -// Contains code from: https://stackoverflow.com/a/1148861/4986782 -// Modified by BornToBeRoot - -using NETworkManager.Utilities; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics.CodeAnalysis; -using System.Net; -using System.Net.NetworkInformation; -using System.Runtime.InteropServices; -using System.Threading.Tasks; - -namespace NETworkManager.Models.Network -{ - public class ARP - { - #region Variables - // The max number of physical addresses. - private const int MAXLEN_PHYSADDR = 8; - - // Define the MIB_IPNETROW structure. - [StructLayout(LayoutKind.Sequential)] - private struct MIB_IPNETROW - { - [MarshalAs(UnmanagedType.U4)] - public int dwIndex; - [MarshalAs(UnmanagedType.U4)] - public int dwPhysAddrLen; - [MarshalAs(UnmanagedType.U1)] - public byte mac0; - [MarshalAs(UnmanagedType.U1)] - public byte mac1; - [MarshalAs(UnmanagedType.U1)] - public byte mac2; - [MarshalAs(UnmanagedType.U1)] - public byte mac3; - [MarshalAs(UnmanagedType.U1)] - public byte mac4; - [MarshalAs(UnmanagedType.U1)] - public byte mac5; - [MarshalAs(UnmanagedType.U1)] - public byte mac6; - [MarshalAs(UnmanagedType.U1)] - public byte mac7; - [MarshalAs(UnmanagedType.U4)] - public int dwAddr; - [MarshalAs(UnmanagedType.U4)] - public int dwType; - } - - // Declare the GetIpNetTable function. - [DllImport("IpHlpApi.dll")] - [return: MarshalAs(UnmanagedType.U4)] - static extern int GetIpNetTable(IntPtr pIpNetTable, [MarshalAs(UnmanagedType.U4)] ref int pdwSize, bool bOrder); - - [DllImport("IpHlpApi.dll", SetLastError = true, CharSet = CharSet.Auto)] - internal static extern int FreeMibTable(IntPtr plpNetTable); - - // The insufficient buffer error. - const int ERROR_INSUFFICIENT_BUFFER = 122; - #endregion - - #region Events - public event EventHandler UserHasCanceled; - - protected virtual void OnUserHasCanceled() - { - UserHasCanceled?.Invoke(this, EventArgs.Empty); - } - #endregion - - #region Methods - public static Task> GetTableAsync() - { - return Task.Run(() => GetTable()); - } - - public static List GetTable() - { - var list = new List(); - - // The number of bytes needed. - var bytesNeeded = 0; - - // The result from the API call. - var result = GetIpNetTable(IntPtr.Zero, ref bytesNeeded, false); - - // Call the function, expecting an insufficient buffer. - if (result != ERROR_INSUFFICIENT_BUFFER) - { - // Throw an exception. - throw new Win32Exception(result); - } - - // Allocate the memory, do it in a try/finally block, to ensure - // that it is released. - var buffer = IntPtr.Zero; - - // Try/finally. - try - { - // Allocate the memory. - buffer = Marshal.AllocCoTaskMem(bytesNeeded); - - // Make the call again. If it did not succeed, then - // raise an error. - result = GetIpNetTable(buffer, ref bytesNeeded, false); - - // If the result is not 0 (no error), then throw an exception. - if (result != 0) - { - // Throw an exception. - throw new Win32Exception(result); - } - - // Now we have the buffer, we have to marshal it. We can read - // the first 4 bytes to get the length of the buffer. - var entries = Marshal.ReadInt32(buffer); - - // Increment the memory pointer by the size of the int. - var currentBuffer = new IntPtr(buffer.ToInt64() + - Marshal.SizeOf(typeof(int))); - - // Allocate an array of entries. - var table = new MIB_IPNETROW[entries]; - - // Cycle through the entries. - for (var i = 0; i < entries; i++) - { - // Call PtrToStructure, getting the structure information. - table[i] = (MIB_IPNETROW)Marshal.PtrToStructure(new - IntPtr(currentBuffer.ToInt64() + (i * Marshal.SizeOf(typeof(MIB_IPNETROW)))), typeof(MIB_IPNETROW)); - } - - var virtualMAC = new PhysicalAddress(new byte[] { 0, 0, 0, 0, 0, 0 }); - var broadcastMAC = new PhysicalAddress(new byte[] { 255, 255, 255, 255, 255, 255 }); - - for (var i = 0; i < entries; i++) - { - var row = table[i]; - - var ipAddress = new IPAddress(BitConverter.GetBytes(row.dwAddr)); - var macAddress = new PhysicalAddress(new[] { row.mac0, row.mac1, row.mac2, row.mac3, row.mac4, row.mac5 }); - - // Filter 0.0.0.0.0.0, 255.255.255.255.255.255 - if (!macAddress.Equals(virtualMAC) && !macAddress.Equals(broadcastMAC)) - list.Add(new ARPInfo(ipAddress, macAddress, ipAddress.IsIPv6Multicast || IPv4Address.IsMulticast(ipAddress))); - } - - return list; - } - finally - { - // Release the memory. - FreeMibTable(buffer); - } - } - - private void RunPSCommand(string command) - { - try - { - PowerShellHelper.ExecuteCommand(command, true); - } - catch (Win32Exception win32Ex) - { - switch (win32Ex.NativeErrorCode) - { - case 1223: - OnUserHasCanceled(); - break; - default: - throw; - } - } - } - - // MAC separated with "-" - public Task AddEntryAsync(string ipAddress, string macAddress) - { - return Task.Run(() => AddEntry(ipAddress, macAddress)); - } - - private void AddEntry(string ipAddress, string macAddress) - { - var command = $"arp -s {ipAddress} {macAddress}"; - - RunPSCommand(command); - } - - public Task DeleteEntryAsync(string ipAddress) - { - return Task.Run(() => DeleteEntry(ipAddress)); - } - - private void DeleteEntry(string ipAddress) - { - var command = $"arp -d {ipAddress}"; - - RunPSCommand(command); - } - - public Task DeleteTableAsync() - { - return Task.Run(() => DeleteTable()); - } - - private void DeleteTable() - { - const string command = "netsh interface ip delete arpcache"; - - RunPSCommand(command); - } - #endregion - } -} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/ARPInfo.cs b/Source/NETworkManager.Models/Network/ARPInfo.cs deleted file mode 100644 index 4704b2a2e0..0000000000 --- a/Source/NETworkManager.Models/Network/ARPInfo.cs +++ /dev/null @@ -1,28 +0,0 @@ -using NETworkManager.Utilities; -using System.Net; -using System.Net.NetworkInformation; - -namespace NETworkManager.Models.Network -{ - public class ARPInfo - { - public IPAddress IPAddress { get; set; } - public PhysicalAddress MACAddress { get; set; } - public bool IsMulticast { get; set; } - - public int IPAddressInt32 => IPAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork ? IPv4Address.ToInt32(IPAddress) : 0; - public string MACAddressString => MACAddress.ToString().Replace("-","").Replace("-",""); - - public ARPInfo() - { - - } - - public ARPInfo(IPAddress ipAddress, PhysicalAddress macAddress, bool isMulticast) - { - IPAddress = ipAddress; - MACAddress = macAddress; - IsMulticast = isMulticast; - } - } -} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/BandwidthMeter.cs b/Source/NETworkManager.Models/Network/BandwidthMeter.cs index fd834a4f75..33018b3634 100644 --- a/Source/NETworkManager.Models/Network/BandwidthMeter.cs +++ b/Source/NETworkManager.Models/Network/BandwidthMeter.cs @@ -1,98 +1,144 @@ -using System; +using System; +using System.Diagnostics; using System.Linq; +using System.Net.NetworkInformation; using System.Windows.Threading; -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +public class BandwidthMeter { - public class BandwidthMeter + #region Constructor + + public BandwidthMeter(string id) { - #region Variables - private double _updateInterval = 1000; - public double UpdateInterval - { - get => _updateInterval; - set - { - if (value == _updateInterval) - return; + _timer.Interval = TimeSpan.FromMilliseconds(UpdateInterval); + _timer.Tick += Timer_Tick; - _timer.Interval = TimeSpan.FromMilliseconds(value); + _networkInterface = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces() + .FirstOrDefault(x => x.Id == id); + } - _updateInterval = value; - } - } - public bool IsRunning => _timer.IsEnabled; + #endregion - private DispatcherTimer _timer = new DispatcherTimer(); - private readonly System.Net.NetworkInformation.NetworkInterface _networkInterface; - private long _previousBytesSent; - private long _previousBytesReceived; - private bool _canUpdate; // Collect initial data for correct calculation - #endregion + #region Events - #region Public events - public event EventHandler UpdateSpeed; + private void Timer_Tick(object sender, EventArgs e) + { + Update(); + } - protected virtual void OnUpdateSpeed(BandwidthMeterSpeedArgs e) - { - UpdateSpeed?.Invoke(this, e); - } - #endregion + #endregion - #region Constructor - public BandwidthMeter(string id) - { - _timer.Interval = TimeSpan.FromMilliseconds(UpdateInterval); - _timer.Tick += Timer_Tick; + #region Variables - _networkInterface = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(x => x.Id == id); - } - #endregion + /// + /// The default sample interval in milliseconds. Kept as a constant because the speed + /// calculation and the consuming view model derive timing from it. + /// + public const double DefaultUpdateInterval = 1000; - #region Methods - public void Start() + public double UpdateInterval + { + get; + set { - _timer.Start(); - } + if (value == field) + return; - public void Stop() - { - _timer.Stop(); + _timer.Interval = TimeSpan.FromMilliseconds(value); - // Reset - _canUpdate = false; + field = value; } + } = DefaultUpdateInterval; - private void Update() - { - var stats = _networkInterface.GetIPv4Statistics(); + public bool IsRunning => _timer.IsEnabled; - var totalBytesSent = stats.BytesSent; - var totalBytesReceived = stats.BytesReceived; + private readonly DispatcherTimer _timer = new(); + private readonly System.Net.NetworkInformation.NetworkInterface _networkInterface; + private readonly Stopwatch _stopwatch = new(); + private long _previousBytesSent; + private long _previousBytesReceived; + private bool _canUpdate; // Collect initial data for correct calculation - var byteSentSpeed = totalBytesSent - _previousBytesSent; - var byteReceivedSpeed = totalBytesReceived - _previousBytesReceived; + #endregion - _previousBytesSent = stats.BytesSent; - _previousBytesReceived = stats.BytesReceived; + #region Public events - // Need to collect initial data for correct calculation... - if (!_canUpdate) - { - _canUpdate = true; + public event EventHandler UpdateSpeed; - return; - } + protected virtual void OnUpdateSpeed(BandwidthMeterSpeedArgs e) + { + UpdateSpeed?.Invoke(this, e); + } + + #endregion + + #region Methods - OnUpdateSpeed(new BandwidthMeterSpeedArgs(DateTime.Now, totalBytesReceived, totalBytesSent, byteReceivedSpeed, byteSentSpeed)); + public void Start() + { + _timer.Start(); + } + + public void Stop() + { + _timer.Stop(); + + // Reset, so the next sample re-seeds the baseline (avoids a speed spike after a pause). + _canUpdate = false; + } + + private void Update() + { + // The interface may have been removed/disabled after this meter was created. + if (_networkInterface == null) + return; + + IPInterfaceStatistics stats; + + try + { + // IPStatistics covers both IPv4 and IPv6 traffic on the interface. + stats = _networkInterface.GetIPStatistics(); } - #endregion + catch (NetworkInformationException) + { + // Transient failure (e.g. adapter going down) - skip this tick. + return; + } + + var totalBytesSent = stats.BytesSent; + var totalBytesReceived = stats.BytesReceived; - #region Events - private void Timer_Tick(object sender, EventArgs e) + // First sample after start/resume: seed the baseline and start timing, no speed yet. + if (!_canUpdate) { - Update(); + _previousBytesSent = totalBytesSent; + _previousBytesReceived = totalBytesReceived; + _stopwatch.Restart(); + _canUpdate = true; + + return; } - #endregion + + var elapsedSeconds = _stopwatch.Elapsed.TotalSeconds; + _stopwatch.Restart(); + + // Clamp negative deltas: cumulative counters can reset/wrap (driver reset, disable/enable). + var deltaSent = Math.Max(0, totalBytesSent - _previousBytesSent); + var deltaReceived = Math.Max(0, totalBytesReceived - _previousBytesReceived); + + // Derive a true per-second rate from the measured elapsed time (robust against timer jitter). + var byteSentSpeed = elapsedSeconds > 0 ? (long)(deltaSent / elapsedSeconds) : 0; + var byteReceivedSpeed = elapsedSeconds > 0 ? (long)(deltaReceived / elapsedSeconds) : 0; + + _previousBytesSent = totalBytesSent; + _previousBytesReceived = totalBytesReceived; + + OnUpdateSpeed(new BandwidthMeterSpeedArgs(DateTime.Now, totalBytesReceived, totalBytesSent, + byteReceivedSpeed, byteSentSpeed)); } + + #endregion } diff --git a/Source/NETworkManager.Models/Network/BandwidthMeterSpeedArgs.cs b/Source/NETworkManager.Models/Network/BandwidthMeterSpeedArgs.cs index 3ff491db5e..856b7e584c 100644 --- a/Source/NETworkManager.Models/Network/BandwidthMeterSpeedArgs.cs +++ b/Source/NETworkManager.Models/Network/BandwidthMeterSpeedArgs.cs @@ -1,22 +1,22 @@ using System; -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +public class BandwidthMeterSpeedArgs : EventArgs { - public class BandwidthMeterSpeedArgs : EventArgs + public BandwidthMeterSpeedArgs(DateTime dateTime, long totoTotalBytesReceived, long totalBytesSent, + long byteReceivedSpeed, long byteSentSpeed) { - public DateTime DateTime { get; } - public long TotalBytesReceived { get; } - public long TotalBytesSent { get; } - public long ByteReceivedSpeed { get; } - public long ByteSentSpeed { get; } - - public BandwidthMeterSpeedArgs(DateTime dateTime, long totoTotalBytesReceived, long totalBytesSent, long byteReceivedSpeed, long byteSentSpeed) - { - DateTime = dateTime; - TotalBytesReceived = totoTotalBytesReceived; - TotalBytesSent = totalBytesSent; - ByteReceivedSpeed = byteReceivedSpeed; - ByteSentSpeed = byteSentSpeed; - } + DateTime = dateTime; + TotalBytesReceived = totoTotalBytesReceived; + TotalBytesSent = totalBytesSent; + ByteReceivedSpeed = byteReceivedSpeed; + ByteSentSpeed = byteSentSpeed; } -} + + public DateTime DateTime { get; } + public long TotalBytesReceived { get; } + public long TotalBytesSent { get; } + public long ByteReceivedSpeed { get; } + public long ByteSentSpeed { get; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/BitCaluclator.cs b/Source/NETworkManager.Models/Network/BitCaluclator.cs new file mode 100644 index 0000000000..4e5e8adcbf --- /dev/null +++ b/Source/NETworkManager.Models/Network/BitCaluclator.cs @@ -0,0 +1,69 @@ +using System; +using System.Threading.Tasks; + +namespace NETworkManager.Models.Network; + +public static class BitCaluclator +{ + public static Task CalculateAsync(double input, BitCaluclatorUnit unit, + BitCaluclatorNotation notation) + { + return Task.Run(() => Calculate(input, unit, notation)); + } + + public static BitCaluclatorInfo Calculate(double input, BitCaluclatorUnit unit, BitCaluclatorNotation notation) + { + // Get bits from input + var u = GetUnitBase(unit); + var n = GetNotationBase(notation); + + double bits; + + if (unit.ToString().EndsWith("Bits", StringComparison.OrdinalIgnoreCase)) + bits = input * Math.Pow(n, u); + else + bits = input * 8 * Math.Pow(n, u); + + // Return caculation + return new BitCaluclatorInfo + { + Bits = bits / Math.Pow(n, GetUnitBase(BitCaluclatorUnit.Bits)), + Bytes = bits / 8 / Math.Pow(n, GetUnitBase(BitCaluclatorUnit.Bytes)), + Kilobits = bits / Math.Pow(n, GetUnitBase(BitCaluclatorUnit.Kilobits)), + Kilobytes = bits / 8 / Math.Pow(n, GetUnitBase(BitCaluclatorUnit.Kilobytes)), + Megabits = bits / Math.Pow(n, GetUnitBase(BitCaluclatorUnit.Megabits)), + Megabytes = bits / 8 / Math.Pow(n, GetUnitBase(BitCaluclatorUnit.Megabytes)), + Gigabits = bits / Math.Pow(n, GetUnitBase(BitCaluclatorUnit.Gigabits)), + Gigabytes = bits / 8 / Math.Pow(n, GetUnitBase(BitCaluclatorUnit.Gigabytes)), + Terabits = bits / Math.Pow(n, GetUnitBase(BitCaluclatorUnit.Terabits)), + Terabytes = bits / 8 / Math.Pow(n, GetUnitBase(BitCaluclatorUnit.Terabytes)), + Petabits = bits / Math.Pow(n, GetUnitBase(BitCaluclatorUnit.Petabits)), + Petabytes = bits / 8 / Math.Pow(n, GetUnitBase(BitCaluclatorUnit.Petabytes)) + }; + } + + private static int GetNotationBase(BitCaluclatorNotation notation) + { + return notation == BitCaluclatorNotation.Binary ? 1024 : 1000; + } + + private static int GetUnitBase(BitCaluclatorUnit unit) + { + return unit switch + { + BitCaluclatorUnit.Bits => 0, + BitCaluclatorUnit.Bytes => 0, + BitCaluclatorUnit.Kilobits => 1, + BitCaluclatorUnit.Kilobytes => 1, + BitCaluclatorUnit.Megabits => 2, + BitCaluclatorUnit.Megabytes => 2, + BitCaluclatorUnit.Gigabits => 3, + BitCaluclatorUnit.Gigabytes => 3, + BitCaluclatorUnit.Terabits => 4, + BitCaluclatorUnit.Terabytes => 4, + BitCaluclatorUnit.Petabits => 5, + BitCaluclatorUnit.Petabytes => 5, + _ => -1 + }; + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/BitCaluclatorInfo.cs b/Source/NETworkManager.Models/Network/BitCaluclatorInfo.cs new file mode 100644 index 0000000000..78effe15b6 --- /dev/null +++ b/Source/NETworkManager.Models/Network/BitCaluclatorInfo.cs @@ -0,0 +1,50 @@ +namespace NETworkManager.Models.Network; + +public class BitCaluclatorInfo +{ + public BitCaluclatorInfo() + { + } + + public BitCaluclatorInfo(double bits, double bytes, double kilobits, double kilobytes, double megabits, + double megabytes, double gigabits, double gigabytes, double terabits, double terabytes, double petabits, + double petabytes) + { + Bits = bits; + Bytes = bytes; + Kilobits = kilobits; + Kilobytes = kilobytes; + Megabits = megabits; + Megabytes = megabytes; + Gigabits = gigabits; + Gigabytes = gigabytes; + Terabits = terabits; + Terabytes = terabytes; + Petabits = petabits; + Petabytes = petabytes; + } + + public double Bits { get; set; } + + public double Bytes { get; set; } + + public double Kilobits { get; set; } + + public double Kilobytes { get; set; } + + public double Megabits { get; set; } + + public double Megabytes { get; set; } + + public double Gigabits { get; set; } + + public double Gigabytes { get; set; } + + public double Terabits { get; set; } + + public double Terabytes { get; set; } + + public double Petabits { get; set; } + + public double Petabytes { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/BitCaluclatorNotation.cs b/Source/NETworkManager.Models/Network/BitCaluclatorNotation.cs new file mode 100644 index 0000000000..9b0d718c98 --- /dev/null +++ b/Source/NETworkManager.Models/Network/BitCaluclatorNotation.cs @@ -0,0 +1,17 @@ +namespace NETworkManager.Models.Network; + +/// +/// Represents the notation which is used to calculate. +/// +public enum BitCaluclatorNotation +{ + /// + /// Binary base is 1024. + /// + Binary, + + /// + /// Decimal base is 1000. + /// + Decimal +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/BitCaluclatorUnit.cs b/Source/NETworkManager.Models/Network/BitCaluclatorUnit.cs new file mode 100644 index 0000000000..6a1ee40eef --- /dev/null +++ b/Source/NETworkManager.Models/Network/BitCaluclatorUnit.cs @@ -0,0 +1,67 @@ +namespace NETworkManager.Models.Network; + +/// +/// Represents the notation which is used to calculate. +/// +public enum BitCaluclatorUnit +{ + /// + /// Unit bits. + /// + Bits, + + /// + /// Unit bytes. + /// + Bytes, + + /// + /// Unit kilobits + /// + Kilobits, + + /// + /// Unit kilobytes + /// + Kilobytes, + + /// + /// Unit megabits + /// + Megabits, + + /// + /// Unit megabytes + /// + Megabytes, + + /// + /// Unit gigabits + /// + Gigabits, + + /// + /// Unit gigabytes + /// + Gigabytes, + + /// + /// Unit terabits + /// + Terabits, + + /// + /// Unit terabytes + /// + Terabytes, + + /// + /// Unit petabits + /// + Petabits, + + /// + /// Unit petabytes + /// + Petabytes +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/Connection.Protocol.cs b/Source/NETworkManager.Models/Network/Connection.Protocol.cs deleted file mode 100644 index d89d2df331..0000000000 --- a/Source/NETworkManager.Models/Network/Connection.Protocol.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace NETworkManager.Models.Network -{ - public partial class Connection - { - public enum Protocol - { - TCP - } - } -} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/Connection.cs b/Source/NETworkManager.Models/Network/Connection.cs index d9d714ad4f..866772d0a1 100644 --- a/Source/NETworkManager.Models/Network/Connection.cs +++ b/Source/NETworkManager.Models/Network/Connection.cs @@ -1,22 +1,159 @@ -using System.Collections.Generic; -using System.Linq; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Net; using System.Net.NetworkInformation; +using System.Runtime.InteropServices; using System.Threading.Tasks; +using NETworkManager.Utilities; -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +public static class Connection { - public partial class Connection + #region Variables + + [DllImport("iphlpapi.dll", SetLastError = true)] + public static extern uint GetExtendedTcpTable(IntPtr pTcpTable, ref int dwSize, bool bOrder, int ulAf, + TcpTableClass tableClass, uint reserved); + + #endregion + + [StructLayout(LayoutKind.Sequential)] + public struct MibTcpRowOwnerPid + { + public uint state; + public uint localAddr; + public byte localPort1; + public byte localPort2; + public byte localPort3; + public byte localPort4; + public uint remoteAddr; + public byte remotePort1; + public byte remotePort2; + public byte remotePort3; + public byte remotePort4; + public uint owningPid; + } + + #region Enums + + public enum TcpTableClass { - #region Methods - public static Task> GetActiveTcpConnectionsAsync() + TCP_TABLE_BASIC_LISTENER, + TCP_TABLE_BASIC_CONNECTIONS, + TCP_TABLE_BASIC_ALL, + TCP_TABLE_OWNER_PID_LISTENER, + TCP_TABLE_OWNER_PID_CONNECTIONS, + TCP_TABLE_OWNER_PID_ALL, + TCP_TABLE_OWNER_MODULE_LISTENER, + TCP_TABLE_OWNER_MODULE_CONNECTIONS, + TCP_TABLE_OWNER_MODULE_ALL + } + + // Cache for remote host names with some default values + private static readonly Dictionary RemoteHostNames = new() + { + { IPAddress.Parse("127.0.0.1"), "localhost" }, + { IPAddress.Parse("::1"), "localhost" }, + { IPAddress.Parse("0.0.0.0"), "-/-" }, + { IPAddress.Parse("::"), "-/-" } + }; + + #endregion + + #region Methods + + public static Task> GetActiveTcpConnectionsAsync() + { + return Task.Run(GetActiveTcpConnections); + } + + private static List GetActiveTcpConnections() + { + var result = new List(); + + var size = 0; + // ReSharper disable once RedundantAssignment - size is get by reference + var dwResult = GetExtendedTcpTable(IntPtr.Zero, ref size, false, 2, TcpTableClass.TCP_TABLE_OWNER_PID_ALL, 0); + + var tcpTable = Marshal.AllocHGlobal(size); + + try { - return Task.Run(() => GetActiveTcpConnections()); - } + dwResult = GetExtendedTcpTable(tcpTable, ref size, false, 2, TcpTableClass.TCP_TABLE_OWNER_PID_ALL, 0); + + if (dwResult != 0) + throw new Exception("Error while retrieving TCP table"); + + var tableRows = Marshal.ReadInt32(tcpTable); + var rowPtr = tcpTable + 4; + + for (var i = 0; i < tableRows; i++) + { + var row = (MibTcpRowOwnerPid)Marshal.PtrToStructure(rowPtr, typeof(MibTcpRowOwnerPid))!; + + var localAddress = new IPAddress(row.localAddr); + var localPort = BitConverter.ToUInt16([row.localPort2, row.localPort1], 0); + var remoteAddress = new IPAddress(row.remoteAddr); + var remotePort = BitConverter.ToUInt16([row.remotePort2, row.remotePort1], 0); + var state = (TcpState)row.state; + + // Get process info by PID + var processId = (int)row.owningPid; + var processName = "-/-"; + var processPath = "-/-"; + + try + { + var process = Process.GetProcessById(processId); + processName = process.ProcessName; + processPath = process.MainModule?.FileName; + } + catch (Exception) + { + // ignored - process not found + } - public static List GetActiveTcpConnections() + // Resolve remote host name if not cached + if (!RemoteHostNames.ContainsKey(remoteAddress)) + { + var dnsResolverTask = DNSClient.GetInstance().ResolvePtrAsync(remoteAddress); + + dnsResolverTask.Wait(); + + // Cache the result + RemoteHostNames.Add(remoteAddress, + !dnsResolverTask.Result.HasError ? dnsResolverTask.Result.Value : "-/-"); + } + + result.Add(new ConnectionInfo( + TransportProtocol.Tcp, + localAddress, + localPort, + remoteAddress, + remotePort, + RemoteHostNames.GetValueOrDefault(remoteAddress, "-/-"), + state, + processId, + processName, + processPath) + ); + + rowPtr = (IntPtr)((long)rowPtr + Marshal.SizeOf(typeof(MibTcpRowOwnerPid))); + } + } + catch (Exception) { - return IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpConnections().Select(tcpInfo => new ConnectionInfo(Protocol.TCP, tcpInfo.LocalEndPoint.Address, tcpInfo.LocalEndPoint.Port, tcpInfo.RemoteEndPoint.Address, tcpInfo.RemoteEndPoint.Port, tcpInfo.State)).ToList(); + return null; } - #endregion + finally + { + Marshal.FreeHGlobal(tcpTable); + } + + return result; } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/ConnectionInfo.cs b/Source/NETworkManager.Models/Network/ConnectionInfo.cs index 3217835dbf..9ffa824d97 100644 --- a/Source/NETworkManager.Models/Network/ConnectionInfo.cs +++ b/Source/NETworkManager.Models/Network/ConnectionInfo.cs @@ -1,34 +1,68 @@ using System.Net; using System.Net.NetworkInformation; -using static NETworkManager.Models.Network.Connection; -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +public class ConnectionInfo( + TransportProtocol protocol, + IPAddress localIPAddress, + int localPort, + IPAddress remoteIPAddress, + int remotePort, + string remoteHostname, + TcpState tcpState, + int processId, + string processName, + string processPath +) { - public class ConnectionInfo - { - public Connection.Protocol Protocol { get; set; } - public IPAddress LocalIPAddress { get; set; } - public int LocalPort { get; set; } - public IPAddress RemoteIPAddress { get; set; } - public int RemotePort { get; set; } - public TcpState TcpState { get; set; } - - public int LocalIPAddressInt32 => LocalIPAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork ? IPv4Address.ToInt32(LocalIPAddress) : 0; - public int RemoteIPAddressInt32 => LocalIPAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork ? IPv4Address.ToInt32(RemoteIPAddress) : 0; - - public ConnectionInfo() - { - - } - - public ConnectionInfo(Protocol protocol, IPAddress localIPAddress, int localPort, IPAddress remoteIPAddress, int remotePort, TcpState tcpState) - { - Protocol = protocol; - LocalIPAddress = localIPAddress; - LocalPort = localPort; - RemoteIPAddress = remoteIPAddress; - RemotePort = remotePort; - TcpState = tcpState; - } - } + /// + /// Protocol used by the connection. Only TCP is supported. + /// + public TransportProtocol Protocol { get; set; } = protocol; + + /// + /// Local IP address of the connection. + /// + public IPAddress LocalIPAddress { get; set; } = localIPAddress; + + /// + /// Local port of the connection. + /// + public int LocalPort { get; set; } = localPort; + + /// + /// Remote IP address of the connection. + /// + public IPAddress RemoteIPAddress { get; set; } = remoteIPAddress; + + /// + /// Remote port of the connection. + /// + public int RemotePort { get; set; } = remotePort; + + /// + /// Remote host name of the connection. + /// + public string RemoteHostname { get; set; } = remoteHostname; + + /// + /// State of the connection. + /// + public TcpState TcpState { get; set; } = tcpState; + + /// + /// PID of the process that owns the connection. + /// + public int ProcessId { get; set; } = processId; + + /// + /// Name of the process that owns the connection. + /// + public string ProcessName { get; set; } = processName; + + /// + /// Path of the process that owns the connection. + /// + public string ProcessPath { get; set; } = processPath; } \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/ConnectionState.cs b/Source/NETworkManager.Models/Network/ConnectionState.cs index 3c73d52043..1e58835a89 100644 --- a/Source/NETworkManager.Models/Network/ConnectionState.cs +++ b/Source/NETworkManager.Models/Network/ConnectionState.cs @@ -1,33 +1,32 @@ -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +/// +/// Represents the state of a connection. +/// +public enum ConnectionState { /// - /// Represents the state of a connection. + /// Connection has no state. /// - public enum ConnectionState - { - /// - /// Connection has no state. - /// - None, + None, - /// - /// Connection is OK. - /// - OK, + /// + /// Connection is OK. + /// + OK, - /// - /// Connection is warning. - /// - Warning, + /// + /// Connection is warning. + /// + Warning, - /// - /// Connection is critical. - /// - Critical, + /// + /// Connection is critical. + /// + Critical, - /// - /// Informations. - /// - Info - } -} + /// + /// Information's. + /// + Info +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/DNSLookup.cs b/Source/NETworkManager.Models/Network/DNSLookup.cs index 9300698722..da84a900d1 100644 --- a/Source/NETworkManager.Models/Network/DNSLookup.cs +++ b/Source/NETworkManager.Models/Network/DNSLookup.cs @@ -1,4 +1,5 @@ using DnsClient; +using DnsClient.Protocol; using System; using System.Collections.Generic; using System.Linq; @@ -6,169 +7,314 @@ using System.Net.NetworkInformation; using System.Threading.Tasks; -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +public sealed class DNSLookup { - public class DNSLookup - { - #region Variables - public bool UseCustomDNSServer = false; - public DNSServerInfo CustomDNSServer; - public bool AddDNSSuffix = true; - public bool UseCustomDNSSuffix = false; - public string CustomDNSSuffix; - public QueryClass QueryClass = QueryClass.IN; - public QueryType QueryType = QueryType.ANY; - - public bool UseCache = false; - public bool Recursion = true; - public bool UseTCPOnly = false; - public int Retries = 3; - public TimeSpan Timeout = TimeSpan.FromSeconds(2); - #endregion - - #region Events - public event EventHandler RecordReceived; - - protected virtual void OnRecordReceived(DNSLookupRecordArgs e) - { - RecordReceived?.Invoke(this, e); - } - - public event EventHandler LookupError; - - protected virtual void OnLookupError(DNSLookupErrorArgs e) - { - LookupError?.Invoke(this, e); - } - - public event EventHandler LookupComplete; - - protected virtual void OnLookupComplete() - { - LookupComplete?.Invoke(this, EventArgs.Empty); - } - #endregion - - #region Methods - private List GetDnsServer() - { - List dnsServers = new List(); - - if (UseCustomDNSServer) - { - foreach (var dnsServer in CustomDNSServer.Servers) - dnsServers.Add(new IPEndPoint(IPAddress.Parse(dnsServer), CustomDNSServer.Port)); - } - else - { - foreach (var dnsServer in NameServer.ResolveNameServers(true, false)) - { - dnsServers.Add(new IPEndPoint(IPAddress.Parse(dnsServer.Address), dnsServer.Port)); - } - } - - return dnsServers; - } - - public void ResolveAsync(List hosts) - { - Task.Run(() => - { - // Get list of dns servers - List dnsServers = GetDnsServer(); - - // Foreach host - foreach (var host in hosts) - { - var query = host; - - // Append dns suffix to hostname - if (QueryType != QueryType.PTR && AddDNSSuffix && query.IndexOf(".", StringComparison.OrdinalIgnoreCase) == -1) - { - var dnsSuffix = UseCustomDNSSuffix ? CustomDNSSuffix : IPGlobalProperties.GetIPGlobalProperties().DomainName; - - if (!string.IsNullOrEmpty(dnsSuffix)) - query += $".{dnsSuffix}"; - } - - // Foreach dns server - Parallel.ForEach(dnsServers, dnsServer => - { - LookupClientOptions lookupClientOptions = new LookupClientOptions(dnsServer) - { - UseTcpOnly = UseTCPOnly, - UseCache = UseCache, - Recursion = Recursion, - Timeout = Timeout, - Retries = Retries, - }; - - LookupClient dnsLookupClient = new LookupClient(lookupClientOptions); - - try - { - // PTR vs A, AAAA, CNAME etc. - var dnsResponse = QueryType == QueryType.PTR ? dnsLookupClient.QueryReverse(IPAddress.Parse(query)) : dnsLookupClient.Query(query, QueryType, QueryClass); - - // If there was an error... return - if (dnsResponse.HasError) - { - OnLookupError(new DNSLookupErrorArgs(dnsResponse.ErrorMessage, new IPEndPoint(IPAddress.Parse(dnsResponse.NameServer.Address), dnsResponse.NameServer.Port))); - return; - } - - // Process the results... - ProcessDnsQueryResponse(dnsResponse); - } - catch (Exception ex) - { - OnLookupError(new DNSLookupErrorArgs(ex.Message, dnsServer)); - } - }); - } - - OnLookupComplete(); - }); - } - - private void ProcessDnsQueryResponse(IDnsQueryResponse dnsQueryResponse) - { - var dnsServer = new IPEndPoint(IPAddress.Parse(dnsQueryResponse.NameServer.Address), dnsQueryResponse.NameServer.Port); - - // A - foreach (var record in dnsQueryResponse.Answers.ARecords()) - OnRecordReceived(new DNSLookupRecordArgs(record.DomainName, record.TimeToLive, record.RecordClass, record.RecordType, record.Address.ToString(), dnsServer)); - - // AAAA - foreach (var record in dnsQueryResponse.Answers.AaaaRecords()) - OnRecordReceived(new DNSLookupRecordArgs(record.DomainName, record.TimeToLive, record.RecordClass, record.RecordType, record.Address.ToString(), dnsServer)); - - // CNAME - foreach (var record in dnsQueryResponse.Answers.CnameRecords()) - OnRecordReceived(new DNSLookupRecordArgs(record.DomainName, record.TimeToLive, record.RecordClass, record.RecordType, record.CanonicalName, dnsServer)); - - // MX - foreach (var record in dnsQueryResponse.Answers.MxRecords()) - OnRecordReceived(new DNSLookupRecordArgs(record.DomainName, record.TimeToLive, record.RecordClass, record.RecordType, record.Exchange, dnsServer)); - - // NS - foreach (var record in dnsQueryResponse.Answers.NsRecords()) - OnRecordReceived(new DNSLookupRecordArgs(record.DomainName, record.TimeToLive, record.RecordClass, record.RecordType, record.NSDName, dnsServer)); - - // PTR - foreach (var record in dnsQueryResponse.Answers.PtrRecords()) - OnRecordReceived(new DNSLookupRecordArgs(record.DomainName, record.TimeToLive, record.RecordClass, record.RecordType, record.PtrDomainName, dnsServer)); - - // SOA - foreach (var record in dnsQueryResponse.Answers.SoaRecords()) - OnRecordReceived(new DNSLookupRecordArgs(record.DomainName, record.TimeToLive, record.RecordClass, record.RecordType, record.MName + ", " + record.RName, dnsServer)); - - // TXT - foreach (var record in dnsQueryResponse.Answers.TxtRecords()) - OnRecordReceived(new DNSLookupRecordArgs(record.DomainName, record.TimeToLive, record.RecordClass, record.RecordType, string.Join(", ", record.Text), dnsServer)); - - // ToDo: implement more + #region Constructor + + public DNSLookup(DNSLookupSettings settings, IEnumerable dnsServers = null) + { + _settings = settings; + + _servers = GetDnsServer(dnsServers); + + // Get the dns suffix from windows or use custom dns suffix from settings if enabled + if (_settings.AddDNSSuffix) + { + _suffix = _settings.UseCustomDNSSuffix + ? _settings.CustomDNSSuffix + : IPGlobalProperties.GetIPGlobalProperties().DomainName; + + _addSuffix = !string.IsNullOrEmpty(_suffix); } - #endregion - } -} + } + + #endregion + + #region Variables + + /// + /// Query types that can be used. + /// + public static HashSet QueryTypes => + [ + QueryType.A, + QueryType.AAAA, + QueryType.ANY, + QueryType.CAA, + QueryType.CNAME, + QueryType.DNSKEY, + QueryType.MX, + QueryType.NS, + QueryType.PTR, + QueryType.SOA, + QueryType.SRV, + QueryType.TXT + ]; + + /// + /// DNS lookup settings to use for the DNS lookup. + /// + private readonly DNSLookupSettings _settings; + + /// + /// List of Windows DNS servers or custom DNS servers from the settings to use for the DNS lookup. + /// + private readonly IEnumerable _servers; + + /// + /// Indicates whether the DNS suffix should be appended to the hostname. + /// + private readonly bool _addSuffix; + + /// + /// DNS suffix to append to hostname. + /// + private readonly string _suffix; + + #endregion + + #region Events + + public event EventHandler RecordReceived; + + private void OnRecordReceived(DNSLookupRecordReceivedArgs e) + { + RecordReceived?.Invoke(this, e); + } + + public event EventHandler LookupError; + + private void OnLookupError(DNSLookupErrorArgs e) + { + LookupError?.Invoke(this, e); + } + + public event EventHandler LookupComplete; + + private void OnLookupComplete() + { + LookupComplete?.Invoke(this, EventArgs.Empty); + } + + #endregion + + #region Methods + + /// + /// Get the DNS servers from Windows or get custom DNS servers from . + /// + /// List of DNS servers as . + private IEnumerable GetDnsServer(IEnumerable dnsServers = null) + { + List servers = []; + + // Use windows dns servers + servers.AddRange(dnsServers == null + ? NameServer.ResolveNameServers(true, false).Select(dnsServer => + new IPEndPoint(IPAddress.Parse(dnsServer.Address), dnsServer.Port)) + : dnsServers.Select(dnsServer => new IPEndPoint(IPAddress.Parse(dnsServer.Server), dnsServer.Port))); + + return servers; + } + + /// + /// Append DNS suffix to hostname if not set. + /// + /// List of hosts + /// List of host with DNS suffix + private IEnumerable GetHostWithSuffix(IEnumerable hosts) + { + return hosts.Select(host => host.Contains('.') ? host : $"{host}.{_suffix}").ToList(); + } + + /// + /// Resolve hostname, fqdn or ip address. + /// + /// List of hostnames, FQDNs or ip addresses. + public void ResolveAsync(IEnumerable hosts) + { + Task.Run(() => + { + // Append dns suffix to hostname, if the option is set, otherwise copy the list + var queries = _addSuffix && _settings.QueryType != QueryType.PTR ? GetHostWithSuffix(hosts) : hosts; + + // For each dns server + Parallel.ForEach(_servers, dnsServer => + { + // Init each dns server once + LookupClientOptions lookupClientOptions = new(dnsServer) + { + UseTcpOnly = _settings.UseTCPOnly, + UseCache = _settings.UseCache, + Recursion = _settings.Recursion, + Timeout = _settings.Timeout, + Retries = _settings.Retries + }; + + LookupClient lookupClient = new(lookupClientOptions); + + // Get the dns server hostname for some additional information + var dnsServerHostName = string.Empty; + + try + { + var result = lookupClient.QueryReverse(dnsServer.Address); + + if (!result.HasError) + { + var record = result.Answers.PtrRecords().FirstOrDefault(); + + if (record != null) + dnsServerHostName = record.PtrDomainName; + } + } + catch + { + // ignored + } + + // For each host + Parallel.ForEach(queries, query => + { + try + { + // Resolve A, AAAA, CNAME, PTR, etc. + var dnsResponse = _settings.QueryType == QueryType.PTR + ? lookupClient.QueryReverse(IPAddress.Parse(query)) + : lookupClient.Query(query, _settings.QueryType, _settings.QueryClass); + + // Pass the error we got from the lookup client (dns server). + if (dnsResponse.HasError) + { + OnLookupError(new DNSLookupErrorArgs(query, $"{dnsServer.Address}", + $"{dnsServer.Address}:{dnsServer.Port}", dnsResponse.ErrorMessage)); + + return; // continue + } + + if (dnsResponse.Answers.Count == 0) + { + var digAdditionalCommand = _settings.QueryType == QueryType.PTR ? " -x " : " "; + + OnLookupError(new DNSLookupErrorArgs(query, $"{dnsServer.Address}", + $"{dnsServer.Address}:{dnsServer.Port}", + $"No DNS resource records received for query \"{query}\" (Query type: \"{_settings.QueryType}\") and the DNS server did not return an error. Try to check your DNS server with: dig @{dnsServer.Address}{digAdditionalCommand}{query}")); + + return; // continue + } + + // Process the results... + ProcessDnsAnswers(dnsResponse.Answers, dnsResponse.NameServer, dnsServerHostName); + } + catch (Exception ex) + { + OnLookupError(new DNSLookupErrorArgs(query, $"{dnsServer.Address}", + $"{dnsServer.Address}:{dnsServer.Port}", ex.Message)); + } + }); + }); + + OnLookupComplete(); + }); + } + + /// + /// Process the DNS answers and raise the event. + /// + /// List of DNS resource records. + /// DNS name server that answered the query. + /// DNS name server hostname. + private void ProcessDnsAnswers(IEnumerable answers, NameServer nameServer, + string nameServerHostname = null) + { + if (answers is not DnsResourceRecord[] dnsResourceRecords) + return; + + // A + foreach (var record in dnsResourceRecords.OfType()) + OnRecordReceived(new DNSLookupRecordReceivedArgs( + new DNSLookupRecordInfo( + record.DomainName, record.TimeToLive, $"{record.RecordClass}", $"{record.RecordType}", + $"{record.Address}", $"{nameServer.Address}", nameServerHostname, nameServer.Port))); + + // AAAA + foreach (var record in dnsResourceRecords.OfType()) + OnRecordReceived(new DNSLookupRecordReceivedArgs( + new DNSLookupRecordInfo( + record.DomainName, record.TimeToLive, $"{record.RecordClass}", $"{record.RecordType}", + $"{record.Address}", $"{nameServer.Address}", nameServerHostname, nameServer.Port))); + + // CAA + foreach (var record in dnsResourceRecords.OfType()) + OnRecordReceived(new DNSLookupRecordReceivedArgs( + new DNSLookupRecordInfo( + record.DomainName, record.TimeToLive, $"{record.RecordClass}", $"{record.RecordType}", + $"{record.Flags} {record.Tag} {record.Value}", $"{nameServer.Address}", nameServerHostname, + nameServer.Port))); + + // CNAME + foreach (var record in dnsResourceRecords.OfType()) + OnRecordReceived(new DNSLookupRecordReceivedArgs( + new DNSLookupRecordInfo( + record.DomainName, record.TimeToLive, $"{record.RecordClass}", $"{record.RecordType}", + record.CanonicalName, $"{nameServer.Address}", nameServerHostname, nameServer.Port))); + + // DNSKEY + foreach (var record in dnsResourceRecords.OfType()) + OnRecordReceived(new DNSLookupRecordReceivedArgs( + new DNSLookupRecordInfo( + record.DomainName, record.TimeToLive, $"{record.RecordClass}", $"{record.RecordType}", + $"{record.Flags} {record.Protocol} {record.Algorithm} {Convert.ToBase64String(record.PublicKey.ToArray())}", + $"{nameServer.Address}", nameServerHostname, nameServer.Port))); + + // MX + foreach (var record in dnsResourceRecords.OfType()) + OnRecordReceived(new DNSLookupRecordReceivedArgs( + new DNSLookupRecordInfo( + record.DomainName, record.TimeToLive, $"{record.RecordClass}", $"{record.RecordType}", + $"{record.Preference} {record.Exchange}", $"{nameServer.Address}", nameServerHostname, + nameServer.Port))); + + // NS + foreach (var record in dnsResourceRecords.OfType()) + OnRecordReceived(new DNSLookupRecordReceivedArgs( + new DNSLookupRecordInfo( + record.DomainName, record.TimeToLive, $"{record.RecordClass}", $"{record.RecordType}", + record.NSDName, $"{nameServer.Address}", nameServerHostname, nameServer.Port))); + + // PTR + foreach (var record in dnsResourceRecords.OfType()) + OnRecordReceived(new DNSLookupRecordReceivedArgs( + new DNSLookupRecordInfo( + record.DomainName, record.TimeToLive, $"{record.RecordClass}", $"{record.RecordType}", + record.PtrDomainName, $"{nameServer.Address}", nameServerHostname, nameServer.Port))); + + // SOA + foreach (var record in dnsResourceRecords.OfType()) + OnRecordReceived(new DNSLookupRecordReceivedArgs( + new DNSLookupRecordInfo( + record.DomainName, record.TimeToLive, $"{record.RecordClass}", $"{record.RecordType}", + record.MName + ", " + record.RName, $"{nameServer.Address}", nameServerHostname, nameServer.Port))); + + // SRV + foreach (var record in dnsResourceRecords.OfType()) + OnRecordReceived(new DNSLookupRecordReceivedArgs( + new DNSLookupRecordInfo( + record.DomainName, record.TimeToLive, $"{record.RecordClass}", $"{record.RecordType}", + $"{record.Priority} {record.Weight} {record.Port} {record.Target}", $"{nameServer.Address}", + nameServerHostname, nameServer.Port))); + + // TXT + foreach (var record in dnsResourceRecords.OfType()) + OnRecordReceived(new DNSLookupRecordReceivedArgs( + new DNSLookupRecordInfo( + record.DomainName, record.TimeToLive, $"{record.RecordClass}", $"{record.RecordType}", + string.Join(", ", record.Text), $"{nameServer.Address}", nameServerHostname, nameServer.Port))); + + // ToDo: implement more + } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/DNSLookupCompleteArgs.cs b/Source/NETworkManager.Models/Network/DNSLookupCompleteArgs.cs deleted file mode 100644 index 84c1bbed5b..0000000000 --- a/Source/NETworkManager.Models/Network/DNSLookupCompleteArgs.cs +++ /dev/null @@ -1,27 +0,0 @@ -namespace NETworkManager.Models.Network -{ - public class DNSLookupCompleteArgs : System.EventArgs - { - public string ServerAndPort { get; set; } - public int QuestionsCount { get; set; } - public int AnswersCount { get; set; } - public int AuthoritiesCount { get; set; } - public int AdditionalsCount { get; set; } - public int MessageSize { get; set; } - - public DNSLookupCompleteArgs() - { - - } - - public DNSLookupCompleteArgs(string serverAndPort, int questionsCount, int answersCount, int authoritiesCount, int additionalsCount, int messageSize) - { - ServerAndPort = serverAndPort; - QuestionsCount = questionsCount; - AnswersCount = answersCount; - AuthoritiesCount = authoritiesCount; - AdditionalsCount = additionalsCount; - MessageSize = messageSize; - } - } -} diff --git a/Source/NETworkManager.Models/Network/DNSLookupErrorArgs.cs b/Source/NETworkManager.Models/Network/DNSLookupErrorArgs.cs index ef38ccceb7..59d93615d0 100644 --- a/Source/NETworkManager.Models/Network/DNSLookupErrorArgs.cs +++ b/Source/NETworkManager.Models/Network/DNSLookupErrorArgs.cs @@ -1,21 +1,29 @@ -using System.Net; +using System; -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +public class DNSLookupErrorArgs : EventArgs { - public class DNSLookupErrorArgs : System.EventArgs + public DNSLookupErrorArgs() { - public string ErrorCode { get; set; } - public IPEndPoint DNSServer { get; set; } - - public DNSLookupErrorArgs() - { - } + } - public DNSLookupErrorArgs(string errorCode, IPEndPoint dnsServer) - { - ErrorCode = errorCode; - DNSServer = dnsServer; - } + public DNSLookupErrorArgs(string query, string server, string ipEndPoint, string errorMessage) + { + Query = query; + Server = server; + ErrorMessage = errorMessage; + IPEndPoint = ipEndPoint; } -} + + public string Query { get; set; } + + public string Server { get; set; } + + public bool HasIPEndPoint { get; set; } + + public string IPEndPoint { get; set; } + + public string ErrorMessage { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/DNSLookupRecordArgs.cs b/Source/NETworkManager.Models/Network/DNSLookupRecordArgs.cs deleted file mode 100644 index 6a0fbfb8e1..0000000000 --- a/Source/NETworkManager.Models/Network/DNSLookupRecordArgs.cs +++ /dev/null @@ -1,31 +0,0 @@ -using DnsClient; -using DnsClient.Protocol; -using System.Net; - -namespace NETworkManager.Models.Network -{ - public class DNSLookupRecordArgs : System.EventArgs - { - public string DomainName { get; set; } - public int TTL { get; set; } - public QueryClass Class { get; set; } - public ResourceRecordType Type { get; set; } - public string Result { get; set; } - public IPEndPoint DNSServer { get; set; } - - public DNSLookupRecordArgs() - { - - } - - public DNSLookupRecordArgs(string domainName, int ttl, QueryClass queryClass, ResourceRecordType queryType, string result, IPEndPoint dnsServer) - { - DomainName = domainName; - TTL = ttl; - Class = queryClass; - Type = queryType; - Result = result; - DNSServer = dnsServer; - } - } -} diff --git a/Source/NETworkManager.Models/Network/DNSLookupRecordInfo.cs b/Source/NETworkManager.Models/Network/DNSLookupRecordInfo.cs index a32c01ffe6..3586102025 100644 --- a/Source/NETworkManager.Models/Network/DNSLookupRecordInfo.cs +++ b/Source/NETworkManager.Models/Network/DNSLookupRecordInfo.cs @@ -1,40 +1,78 @@ -using DnsClient; -using DnsClient.Protocol; -using System; -using System.Net; +namespace NETworkManager.Models.Network; -namespace NETworkManager.Models.Network +/// +/// Class containing information about a DNS lookup record. +/// +public class DNSLookupRecordInfo { - public class DNSLookupRecordInfo + /// + /// Creates a new instance of with the specified parameters. + /// + /// Domain name of the record. + /// Time to live (TTL) of the record. + /// Class of the record. + /// Type of the record. + /// Result of the record. (IP address, hostname, text, etc.) + /// IP address of the name server that provided the result. + /// Hostname of the name server that provided the result. + /// Port of the name server that provided the result. + public DNSLookupRecordInfo(string domainName, int ttl, string recordClass, string recordType, string result, + string nameServerIPAddress, string nameServerHostName, int nameServerPort) { - - public string DomainName { get; set; } - public int TTL { get; set; } - public string Class { get; set; } - public string Type { get; set; } - public string Result { get; set; } - public string DNSServer { get; set; } - public int Port { get; set; } - - public DNSLookupRecordInfo() - { - - } - - public DNSLookupRecordInfo(string domainName, int ttl, string xclass, string type, string result, string dnsServer, int port) - { - DomainName = domainName; - TTL = ttl; - Class = xclass; - Type = type; - Result = result; - DNSServer = dnsServer; - Port = port; - } - - public static DNSLookupRecordInfo Parse(DNSLookupRecordArgs e) - { - return new DNSLookupRecordInfo(e.DomainName, e.TTL, e.Class.ToString(), e.Type.ToString(), e.Result, e.DNSServer.Address.ToString(), e.DNSServer.Port); - } + DomainName = domainName; + TTL = ttl; + RecordClass = recordClass; + RecordType = recordType; + Result = result; + NameServerIPAddress = nameServerIPAddress; + NameServerPort = nameServerPort; + NameServerHostName = nameServerHostName; } + + /// + /// Domain name of the record. + /// + public string DomainName { get; set; } + + /// + /// Time to live (TTL) of the record. + /// + public int TTL { get; set; } + + /// + /// Class of the record. + /// + public string RecordClass { get; set; } + + /// + /// Type of the record. + /// + public string RecordType { get; set; } + + /// + /// Result of the record. (IP address, hostname, text, etc.) + /// + public string Result { get; set; } + + /// + /// IP address of the name server that provided the result. + /// + public string NameServerIPAddress { get; set; } + + /// + /// Port of the name server that provided the result. + /// + public int NameServerPort { get; set; } + + /// + /// Hostname of the name server that provided the result. + /// + public string NameServerHostName { get; set; } + + /// + /// Hostname (if available) or/and IP address with port of the name server that provided the result. + /// + public string NameServerAsString => string.IsNullOrEmpty(NameServerHostName) + ? $"{NameServerIPAddress}:{NameServerPort}" + : $"{NameServerHostName.TrimEnd('.')} # {NameServerIPAddress}:{NameServerPort}"; } \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/DNSLookupRecordReceivedArgs.cs b/Source/NETworkManager.Models/Network/DNSLookupRecordReceivedArgs.cs new file mode 100644 index 0000000000..8ab1043f0c --- /dev/null +++ b/Source/NETworkManager.Models/Network/DNSLookupRecordReceivedArgs.cs @@ -0,0 +1,19 @@ +using System; + +namespace NETworkManager.Models.Network; + +/// +/// Contains the information of a DNS lookup record in a . +/// +public class DNSLookupRecordReceivedArgs : EventArgs +{ + public DNSLookupRecordReceivedArgs(DNSLookupRecordInfo args) + { + Args = args; + } + + /// + /// DNS Lookup record information. + /// + public DNSLookupRecordInfo Args { get; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/DNSLookupSettings.cs b/Source/NETworkManager.Models/Network/DNSLookupSettings.cs new file mode 100644 index 0000000000..0d1f13b4dd --- /dev/null +++ b/Source/NETworkManager.Models/Network/DNSLookupSettings.cs @@ -0,0 +1,19 @@ +using System; +using DnsClient; + +namespace NETworkManager.Models.Network; + +public class DNSLookupSettings +{ + public bool AddDNSSuffix { get; set; } = true; + public bool UseCustomDNSSuffix { get; set; } + public string CustomDNSSuffix { get; set; } + public QueryClass QueryClass { get; set; } = QueryClass.IN; + public QueryType QueryType { get; set; } = QueryType.ANY; + + public bool UseCache { get; set; } + public bool Recursion { get; set; } = true; + public bool UseTCPOnly { get; set; } + public int Retries { get; set; } = 3; + public TimeSpan Timeout { get; set; } = TimeSpan.FromSeconds(2); +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/DNSServer.cs b/Source/NETworkManager.Models/Network/DNSServer.cs index 99076f2ff8..acbd0270ee 100644 --- a/Source/NETworkManager.Models/Network/DNSServer.cs +++ b/Source/NETworkManager.Models/Network/DNSServer.cs @@ -1,27 +1,51 @@ using System.Collections.Generic; -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +/// +/// Class provides static information's about dns servers. +/// +public static class DNSServer { /// - /// Class provides static informations about dns servers. + /// Gets the default list of common dns servers. /// - public static class DNSServer + /// List of common dns servers. + public static List GetDefaultList() { - /// - /// Method will return a default list of common dns servers. - /// - /// List of common dns servers. - public static List DefaultList() - { - return new List - { - new DNSServerInfo(), // Windows DNS server - new DNSServerInfo("Cloudflare", new List{"1.1.1.1", "1.0.0.1"}), - new DNSServerInfo("DNS.Watch", new List{"84.200.69.80", "84.200.70.40"}), - new DNSServerInfo("Google Public DNS", new List{"8.8.8.8", "8.8.4.4"}), - new DNSServerInfo("Level3", new List {"209.244.0.3", "209.244.0.4"}), - new DNSServerInfo("Verisign", new List {"64.6.64.6", "64.6.65.6"}) - }; - } + return + [ + new(), // Windows DNS server + new("Cloudflare", + [ + new("1.1.1.1", 53, TransportProtocol.Udp), + new("1.0.0.1", 53, TransportProtocol.Udp) + ]), + new("DNS.Watch", + [ + new("84.200.69.80", 53, TransportProtocol.Udp), + new("84.200.70.40", 53, TransportProtocol.Udp) + ]), + new("Google Public DNS", + [ + new("8.8.8.8", 53, TransportProtocol.Udp), + new("8.8.4.4", 53, TransportProtocol.Udp) + ]), + new("Level3", + [ + new("209.244.0.3", 53, TransportProtocol.Udp), + new("209.244.0.4", 53, TransportProtocol.Udp) + ]), + new("Quad9", + [ + new ("9.9.9.9", 53, TransportProtocol.Udp), + new ("149.112.112.112", 53 , TransportProtocol.Udp) + ]), + new("Verisign", + [ + new("64.6.64.6", 53, TransportProtocol.Udp), + new("64.6.65.6", 53, TransportProtocol.Udp) + ]) + ]; } } \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/DNSServerConnectionInfoProfile.cs b/Source/NETworkManager.Models/Network/DNSServerConnectionInfoProfile.cs new file mode 100644 index 0000000000..ccc9209aae --- /dev/null +++ b/Source/NETworkManager.Models/Network/DNSServerConnectionInfoProfile.cs @@ -0,0 +1,34 @@ +using System.Collections.Generic; + +namespace NETworkManager.Models.Network; + +/// +/// Class is used to store informations about a DNS server profile. +/// +public class DNSServerConnectionInfoProfile : ServerConnectionInfoProfile +{ + /// + /// Create an instance of . This will use the + /// default DNS server from Windows (=true). + /// + public DNSServerConnectionInfoProfile() + { + Name = "[Windows DNS]"; + UseWindowsDNSServer = true; + } + + /// + /// Create an instance of with parameters. + /// + /// Name of the profile. + /// List of servers as . + public DNSServerConnectionInfoProfile(string name, List servers) : base(name, servers) + { + + } + + /// + /// Use the DNS server from Windows. + /// + public bool UseWindowsDNSServer { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/DNSServerInfo.cs b/Source/NETworkManager.Models/Network/DNSServerInfo.cs deleted file mode 100644 index 1f4bd6d87a..0000000000 --- a/Source/NETworkManager.Models/Network/DNSServerInfo.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System.Collections.Generic; - -namespace NETworkManager.Models.Network -{ - /// - /// Class is used to store informations about DNS servers. - /// It weather a custom DNS server with - /// - public class DNSServerInfo - { - /// - /// Name of the DNS server profile. - /// - public string Name { get; set; } - - /// - /// List of DNS server ip addresses as . - /// - public List Servers { get; set; } - - /// - /// Port which is used for the DNS request. - /// - public int Port { get; set; } = 53; - - /// - /// Indicates if the windows DNS server is used. - /// - public bool UseWindowsDNSServer { get; set; } - - /// - /// Create an empty instance of . If an empty instance is created, - /// the windows DNS server is used. - /// - public DNSServerInfo() - { - UseWindowsDNSServer = true; - } - - /// - /// Create an instance of with DNS server and port. - /// - /// Name of the profile. - /// List of DNS server ip addresses as . - /// Port which is used for the DNS request. - public DNSServerInfo(string name, List servers, int port = 53) - { - UseWindowsDNSServer = false; - Name = name; - Servers = servers; - Port = port; - } - } -} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/DiscoveryProtocol.Protocol.cs b/Source/NETworkManager.Models/Network/DiscoveryProtocol.Protocol.cs index 396fc0a43d..2a325bbab5 100644 --- a/Source/NETworkManager.Models/Network/DiscoveryProtocol.Protocol.cs +++ b/Source/NETworkManager.Models/Network/DiscoveryProtocol.Protocol.cs @@ -1,27 +1,22 @@ -namespace NETworkManager.Models.Network -{ - public partial class DiscoveryProtocol - { - /// - /// Represents all discovery protocols. - /// - public enum Protocol - { - /// - /// Link layer and Cisco discovery protocol. - /// - LLDP_CDP, +namespace NETworkManager.Models.Network; - /// - /// Link layer discovery protocol. - /// - LLDP, +/// +/// Represents all discovery protocols. +/// +public enum DiscoveryProtocol +{ + /// + /// Link layer and Cisco discovery protocol. + /// + LldpCdp, - /// - /// Cisco discovery protocol. - /// - CDP - } - } + /// + /// Link layer discovery protocol. + /// + Lldp, + /// + /// Cisco discovery protocol. + /// + Cdp } \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/DiscoveryProtocol.cs b/Source/NETworkManager.Models/Network/DiscoveryProtocol.cs index 9bf0811537..81badd3f5c 100644 --- a/Source/NETworkManager.Models/Network/DiscoveryProtocol.cs +++ b/Source/NETworkManager.Models/Network/DiscoveryProtocol.cs @@ -1,186 +1,184 @@ -using System.Threading.Tasks; -using System.Management.Automation; -using System.Collections.ObjectModel; -using System.Reflection; +using System; +using System.Collections.Generic; using System.IO; -using System; +using System.Reflection; using System.Text; -using System.Collections.Generic; +using System.Threading.Tasks; + +namespace NETworkManager.Models.Network; -namespace NETworkManager.Models.Network +/// +/// Class to capture network discovery protocol packages. +/// +public class DiscoveryProtocolCapture { /// - /// Class to capture network discovery protocol packages. + /// Holds the PowerShell script which is loaded when the class is initialized. /// - public partial class DiscoveryProtocol + private readonly string _psDiscoveryProtocolModule; + + /// + /// Initializes a new instance of the class. + /// + public DiscoveryProtocolCapture() { - /// - /// Holds the PowerShell script which is loaded when the class is initialized. - /// - private readonly string PSDiscoveryProtocolModule = string.Empty; - - /// - /// Is triggerd when a network package with a discovery protocol is received. - /// - public event EventHandler PackageReceived; - - /// - /// Triggers the event. - /// - /// Passes to the event. - protected virtual void OnPackageReceived(DiscoveryProtocolPackageArgs e) - { - PackageReceived?.Invoke(this, e); - } + using var stream = Assembly.GetExecutingAssembly() + .GetManifestResourceStream("NETworkManager.Models.Resources.PSDiscoveryProtocol.psm1"); - /// - /// Is triggered when an error occurs during the capturing. - /// - public event EventHandler ErrorReceived; + using StreamReader reader = + new(stream ?? throw new InvalidOperationException("Could not load PSDiscoveryProtocol.psm1")); + _psDiscoveryProtocolModule = reader.ReadToEnd(); + } - /// - /// Triggers the event. - /// - /// Passes to the event. - protected virtual void OnErrorReceived(DiscoveryProtocolErrorArgs e) - { - ErrorReceived?.Invoke(this, e); - } - - /// - /// Is triggered when a warning occurs during the capturing. - /// - public event EventHandler WarningReceived; - - /// - /// Triggers the event. - /// - /// Passes to the event. - protected virtual void OnWarningReceived(DiscoveryProtocolWarningArgs e) - { - WarningReceived?.Invoke(this, e); - } - - /// - /// Is triggered when the capturing is completed. - /// - public event EventHandler Complete; - - /// - /// Triggers the event. - /// - protected virtual void OnComplete() - { - Complete?.Invoke(this, EventArgs.Empty); - } + /// + /// Is triggered when a network package with a discovery protocol is received. + /// + public event EventHandler PackageReceived; - /// - /// Initializes a new instance of the class. - /// - public DiscoveryProtocol() - { - using var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("NETworkManager.Models.Resources.PSDiscoveryProtocol.psm1"); + /// + /// Triggers the event. + /// + /// Passes to the event. + protected virtual void OnPackageReceived(DiscoveryProtocolPackageArgs e) + { + PackageReceived?.Invoke(this, e); + } + + /// + /// Is triggered when an error occurs during the capturing. + /// + public event EventHandler ErrorReceived; + + + /// + /// Triggers the event. + /// + /// Passes to the event. + protected virtual void OnErrorReceived(DiscoveryProtocolErrorArgs e) + { + ErrorReceived?.Invoke(this, e); + } + + /// + /// Is triggered when a warning occurs during the capturing. + /// + public event EventHandler WarningReceived; + + /// + /// Triggers the event. + /// + /// Passes to the event. + protected virtual void OnWarningReceived(DiscoveryProtocolWarningArgs e) + { + WarningReceived?.Invoke(this, e); + } - using StreamReader reader = new StreamReader(stream); + /// + /// Is triggered when the capturing is completed. + /// + public event EventHandler Complete; - PSDiscoveryProtocolModule = reader.ReadToEnd(); - } + /// + /// Triggers the event. + /// + protected virtual void OnComplete() + { + Complete?.Invoke(this, EventArgs.Empty); + } - #region Methods - /// - /// Captures the network packets on the network adapter asynchronously for a certain period of time and filters the packets according to the protocol. - /// - /// Duration in seconds. - /// to filter on. - public void CaptureAsync(int duration, Protocol protocol) + #region Methods + + /// + /// Captures the network packets on the network adapter asynchronously for a certain period of time and filters the + /// packets according to the protocol. + /// + /// Duration in seconds. + /// to filter on. + public void CaptureAsync(int duration, DiscoveryProtocol protocol) + { + Task.Run(() => { - Task.Run(() => + using var ps = System.Management.Automation.PowerShell.Create(); + + var typeParam = protocol != DiscoveryProtocol.LldpCdp ? $" -Type {protocol.ToString().ToUpper()}" : ""; + + ps.AddScript($@" +Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process +Import-Module NetAdapter -ErrorAction Stop +{_psDiscoveryProtocolModule} +Invoke-DiscoveryProtocolCapture -Duration {duration}{typeParam} -Force | Get-DiscoveryProtocolData"); + + var results = ps.Invoke(); + + if (ps.Streams.Error.Count > 0) { - using (System.Management.Automation.PowerShell powerShell = System.Management.Automation.PowerShell.Create()) + StringBuilder stringBuilder = new(); + + foreach (var error in ps.Streams.Error) { + if (string.IsNullOrEmpty(stringBuilder.ToString())) + stringBuilder.Append(Environment.NewLine); - powerShell.AddScript("Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process"); - powerShell.AddScript("Import-Module NetAdapter"); - powerShell.AddScript(PSDiscoveryProtocolModule); - powerShell.AddScript($"Invoke-DiscoveryProtocolCapture -Duration {duration}" + (protocol != Protocol.LLDP_CDP ? $" -Type {protocol}" : "") + " -Force | Get-DiscoveryProtocolData"); - - Collection PSOutput = powerShell.Invoke(); - - if (powerShell.Streams.Error.Count > 0) - { - StringBuilder stringBuilder = new StringBuilder(); - - foreach (var error in powerShell.Streams.Error) - { - if (string.IsNullOrEmpty(stringBuilder.ToString())) - stringBuilder.Append(Environment.NewLine); - - stringBuilder.Append(error.Exception.Message); - } - - OnErrorReceived(new DiscoveryProtocolErrorArgs(stringBuilder.ToString())); - } - if (powerShell.Streams.Warning.Count > 0) - { - StringBuilder stringBuilder = new StringBuilder(); - - foreach (var warning in powerShell.Streams.Warning) - { - if (string.IsNullOrEmpty(stringBuilder.ToString())) - stringBuilder.Append(Environment.NewLine); - - stringBuilder.Append(warning.Message); - } - - OnWarningReceived(new DiscoveryProtocolWarningArgs(stringBuilder.ToString())); - } - - foreach (PSObject outputItem in PSOutput) - { - if (outputItem == null) - continue; - - List ipAddresses = new List(); - - if (outputItem.Properties["IPAddress"] != null) - { - foreach (var ipAddress in outputItem.Properties["IPAddress"].Value as List) - { - ipAddresses.Add(ipAddress); - } - } - - List managements = new List(); - - if (outputItem.Properties["Management"] != null) - { - foreach (var management in outputItem.Properties["Management"].Value as List) - { - managements.Add(management); - } - } - - OnPackageReceived(new DiscoveryProtocolPackageArgs() - { - Device = outputItem.Properties["Device"]?.Value.ToString(), - DeviceDescription = outputItem.Properties["SystemDescription"]?.Value.ToString(), - Port = outputItem.Properties["Port"]?.Value.ToString(), - PortDescription = outputItem.Properties["PortDescription"]?.Value.ToString(), - Model = outputItem.Properties["Model"]?.Value.ToString(), - IPAddress = string.Join("; ", ipAddresses), - VLAN = outputItem.Properties["VLAN"]?.Value.ToString(), - Protocol = outputItem.Properties["Type"]?.Value.ToString(), - TimeToLive = outputItem.Properties["TimeToLive"]?.Value.ToString(), - Management = string.Join("; ", managements), - ChassisId = outputItem.Properties["ChassisId"]?.Value.ToString() - }); - } + stringBuilder.Append(error.Exception.Message); } - OnComplete(); - }); - } - #endregion + OnErrorReceived(new DiscoveryProtocolErrorArgs(stringBuilder.ToString())); + } + + if (ps.Streams.Warning.Count > 0) + { + StringBuilder stringBuilder = new(); + + foreach (var warning in ps.Streams.Warning) + { + if (string.IsNullOrEmpty(stringBuilder.ToString())) + stringBuilder.Append(Environment.NewLine); + + stringBuilder.Append(warning.Message); + } + + OnWarningReceived(new DiscoveryProtocolWarningArgs(stringBuilder.ToString())); + } + + foreach (var result in results) + { + if (result == null) + continue; + + List ipAddresses = []; + + if (result.Properties["IPAddress"] != null) + ipAddresses.AddRange(result.Properties["IPAddress"].Value as List); + + List managements = []; + + if (result.Properties["Management"] != null) + managements.AddRange(result.Properties["Management"].Value as List); + + var packageInfo = new DiscoveryProtocolPackageInfo + { + Device = result.Properties["Device"]?.Value.ToString(), + DeviceDescription = result.Properties["SystemDescription"]?.Value.ToString(), + Port = result.Properties["Port"]?.Value.ToString(), + PortDescription = result.Properties["PortDescription"]?.Value.ToString(), + Model = result.Properties["Model"]?.Value.ToString(), + IPAddress = string.Join("; ", ipAddresses), + VLAN = result.Properties["VLAN"]?.Value.ToString(), + Protocol = result.Properties["Type"]?.Value.ToString(), + TimeToLive = result.Properties["TimeToLive"]?.Value.ToString(), + Management = string.Join("; ", managements), + ChassisId = result.Properties["ChassisId"]?.Value.ToString(), + LocalConnection = result.Properties["Connection"]?.Value.ToString(), + LocalInterface = result.Properties["Interface"]?.Value.ToString() + }; + + OnPackageReceived(new DiscoveryProtocolPackageArgs(packageInfo)); + } + + OnComplete(); + }); } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/DiscoveryProtocolErrorArgs.cs b/Source/NETworkManager.Models/Network/DiscoveryProtocolErrorArgs.cs index 1007a6862e..ddc1fb2667 100644 --- a/Source/NETworkManager.Models/Network/DiscoveryProtocolErrorArgs.cs +++ b/Source/NETworkManager.Models/Network/DiscoveryProtocolErrorArgs.cs @@ -1,18 +1,23 @@ -namespace NETworkManager.Models.Network -{ - public class DiscoveryProtocolErrorArgs : System.EventArgs - { - public string Message { get; private set; } - - - public DiscoveryProtocolErrorArgs() - { +using System; - } +namespace NETworkManager.Models.Network; - public DiscoveryProtocolErrorArgs(string message) - { - Message = message; - } +/// +/// Contains the error message of a error. +/// +public class DiscoveryProtocolErrorArgs : EventArgs +{ + /// + /// Creates a new instance of with the given error message. + /// + /// Error message of the error. + public DiscoveryProtocolErrorArgs(string errorMessage) + { + Message = errorMessage; } -} + + /// + /// Error message of the error. + /// + public string Message { get; private set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/DiscoveryProtocolPackageArgs.cs b/Source/NETworkManager.Models/Network/DiscoveryProtocolPackageArgs.cs index 566a24aa58..8fb09f70e1 100644 --- a/Source/NETworkManager.Models/Network/DiscoveryProtocolPackageArgs.cs +++ b/Source/NETworkManager.Models/Network/DiscoveryProtocolPackageArgs.cs @@ -1,100 +1,24 @@ -namespace NETworkManager.Models.Network +using System; + +namespace NETworkManager.Models.Network; + +/// +/// Event arguments when a discovery protocol package is returned. +/// +public class DiscoveryProtocolPackageArgs : EventArgs { /// - /// Contains informations about a received discovery protocol package. + /// Creates a new instance of with the given + /// . /// - public class DiscoveryProtocolPackageArgs : System.EventArgs + /// Discovery protocol package. + public DiscoveryProtocolPackageArgs(DiscoveryProtocolPackageInfo packageInfo) { - /// - /// - /// - public string Device { get; set; } - - /// - /// - /// - public string DeviceDescription { get; set; } - - /// - /// - /// - public string Port { get; set; } - - /// - /// - /// - public string PortDescription { get; set; } - - /// - /// - /// - public string Model { get; set; } - - /// - /// - /// - public string VLAN { get; set; } - - /// - /// - /// - public string IPAddress { get; set; } - - /// - /// - /// - public string Protocol { get; set; } - - /// - /// - /// - public string TimeToLive { get; set; } - - /// - /// - /// - public string Management { get; set; } - - /// - /// - /// - public string ChassisId { get; set; } - - /// - /// - /// - public DiscoveryProtocolPackageArgs() - { - - } - - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - public DiscoveryProtocolPackageArgs(string device, string deviceDescription, string port, string portDescription, string model, string vlan, string ipAddress, string protocol, string timeToLive, string management, string chassisId) - { - Device = device; - DeviceDescription = deviceDescription; - Port = port; - PortDescription = portDescription; - Model = model; - VLAN = vlan; - IPAddress = ipAddress; - Protocol = protocol; - TimeToLive = timeToLive; - Management = management; - ChassisId = chassisId; - } + PackageInfo = packageInfo; } -} + + /// + /// Discovery protocol package. + /// + public DiscoveryProtocolPackageInfo PackageInfo { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/DiscoveryProtocolPackageInfo.cs b/Source/NETworkManager.Models/Network/DiscoveryProtocolPackageInfo.cs index 5b13181a48..a8aac777ff 100644 --- a/Source/NETworkManager.Models/Network/DiscoveryProtocolPackageInfo.cs +++ b/Source/NETworkManager.Models/Network/DiscoveryProtocolPackageInfo.cs @@ -1,42 +1,79 @@ -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +/// +/// Class contains discovery protocol package information's. +/// +public class DiscoveryProtocolPackageInfo { - public class DiscoveryProtocolPackageInfo + /// + /// Creates a new instance of . + /// + public DiscoveryProtocolPackageInfo() { - public string Device { get; private set; } - public string DeviceDescription { get; private set; } - public string Port { get; private set; } - public string PortDescription { get; private set; } - public string Model { get; private set; } - public string VLAN { get; private set; } - public string IPAddress { get; private set; } - public string Protocol { get; private set; } - public string TimeToLive { get; private set; } - public string Management { get; private set; } - public string ChassisId { get; private set; } - - public DiscoveryProtocolPackageInfo() - { - - } - - public DiscoveryProtocolPackageInfo(string device, string deviceDescription, string port, string portDescription, string model, string vlan, string ipAdress, string protocol, string timeToLive, string management, string chassisId) - { - Device = device; - DeviceDescription = deviceDescription; - Port = port; - PortDescription = portDescription; - Model = model; - VLAN = vlan; - IPAddress = ipAdress; - Protocol = protocol; - TimeToLive = timeToLive; - Management = management; - ChassisId = chassisId; - } - - public static DiscoveryProtocolPackageInfo Parse(DiscoveryProtocolPackageArgs e) - { - return new DiscoveryProtocolPackageInfo(e.Device, e.DeviceDescription, e.Port, e.PortDescription, e.Model, e.VLAN, e.IPAddress, e.Protocol, e.TimeToLive, e.Management, e.ChassisId); - } } + + /// + /// Device name. + /// + public string Device { get; init; } + + /// + /// Device description. + /// + public string DeviceDescription { get; init; } + + /// + /// Port name or number. + /// + public string Port { get; init; } + + /// + /// Port description. + /// + public string PortDescription { get; init; } + + /// + /// Device model. + /// + public string Model { get; init; } + + /// + /// Management VLAN. + /// + public string VLAN { get; init; } + + /// + /// IP address(es) of the device. + /// + public string IPAddress { get; init; } + + /// + /// Protocol type. + /// + public string Protocol { get; init; } + + /// + /// Time to live of the LLDP/CDP package. + /// + public string TimeToLive { get; init; } + + /// + /// Device Management. + /// + public string Management { get; init; } + + /// + /// Device Chassis ID. + /// + public string ChassisId { get; init; } + + /// + /// Local connection used to capture the LLDP/CDP package. + /// + public string LocalConnection { get; init; } + + /// + /// Local interface used to capture the LLDP/CDP package. + /// + public string LocalInterface { get; init; } } \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/DiscoveryProtocolWarningArgs.cs b/Source/NETworkManager.Models/Network/DiscoveryProtocolWarningArgs.cs index a6d68520be..45b55fb229 100644 --- a/Source/NETworkManager.Models/Network/DiscoveryProtocolWarningArgs.cs +++ b/Source/NETworkManager.Models/Network/DiscoveryProtocolWarningArgs.cs @@ -1,30 +1,23 @@ -namespace NETworkManager.Models.Network +using System; + +namespace NETworkManager.Models.Network; + +/// +/// Contains the warning message of a warning. +/// +public class DiscoveryProtocolWarningArgs : EventArgs { /// - /// Event arguments when an + /// Creates a new instance of with the given warning message. /// - public class DiscoveryProtocolWarningArgs : System.EventArgs + /// Warning message of the warning. + public DiscoveryProtocolWarningArgs(string message) { - /// - /// Warning message. - /// - public string Message { get; private set; } - - /// - /// Initializes a new instance of the class. - /// - public DiscoveryProtocolWarningArgs() - { - - } - - /// - /// Initializes a new instance of the class with a warning . - /// - /// Warning message. - public DiscoveryProtocolWarningArgs(string message) - { - Message = message; - } + Message = message; } -} + + /// + /// Warning message of the warning. + /// + public string Message { get; private set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/HostFoundArgs.cs b/Source/NETworkManager.Models/Network/HostFoundArgs.cs deleted file mode 100644 index acb2277a08..0000000000 --- a/Source/NETworkManager.Models/Network/HostFoundArgs.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Net.NetworkInformation; - -namespace NETworkManager.Models.Network -{ - public class HostFoundArgs : System.EventArgs - { - public PingInfo PingInfo { get; set; } - public string Hostname { get; set; } - public PhysicalAddress MACAddress { get; set; } - public string Vendor { get; set; } - - public HostFoundArgs() - { - - } - - public HostFoundArgs(PingInfo pingInfo, string hostname, PhysicalAddress macAddress, string vendor) - { - PingInfo = pingInfo; - Hostname = hostname; - MACAddress = macAddress; - Vendor = vendor; - } - } -} diff --git a/Source/NETworkManager.Models/Network/HostInfo.cs b/Source/NETworkManager.Models/Network/HostInfo.cs deleted file mode 100644 index a6614cdb28..0000000000 --- a/Source/NETworkManager.Models/Network/HostInfo.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.Net.NetworkInformation; - -namespace NETworkManager.Models.Network -{ - public class HostInfo - { - public PingInfo PingInfo { get; set; } - public string Hostname { get; set; } - public PhysicalAddress MACAddress { get; set; } - public string Vendor { get; set; } - - public string MACAddressString => MACAddress.ToString(); - - public HostInfo() - { - - } - - public HostInfo(PingInfo pingInfo, string hostname, PhysicalAddress macAddress, string vendor) - { - PingInfo = pingInfo; - Hostname = hostname; - MACAddress = macAddress; - Vendor = vendor; - } - - public static HostInfo Parse(HostFoundArgs e) - { - return new HostInfo(e.PingInfo, e.Hostname, e.MACAddress, e.Vendor); - } - } -} diff --git a/Source/NETworkManager.Models/Network/HostNotFoundException.cs b/Source/NETworkManager.Models/Network/HostNotFoundException.cs deleted file mode 100644 index 21c379e93a..0000000000 --- a/Source/NETworkManager.Models/Network/HostNotFoundException.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; - -namespace NETworkManager.Models.Network -{ - public class HostNotFoundException : Exception - { - public HostNotFoundException() - { - - } - - public HostNotFoundException(string message) : base(message) - { - - } - - public HostNotFoundException(string message, Exception innerException) : base(message, innerException) - { - - } - } -} diff --git a/Source/NETworkManager.Models/Network/HostRangeHelper.cs b/Source/NETworkManager.Models/Network/HostRangeHelper.cs index af8f9b9c30..43ccdc505b 100644 --- a/Source/NETworkManager.Models/Network/HostRangeHelper.cs +++ b/Source/NETworkManager.Models/Network/HostRangeHelper.cs @@ -1,5 +1,4 @@ using NETworkManager.Utilities; -using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; @@ -9,210 +8,206 @@ using System.Threading; using System.Threading.Tasks; -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +/// +/// Helper class to interact with host ranges. +/// E.g. Parse inputs, resolve hostnames and ip ranges. +/// +public static class HostRangeHelper { - public static class HostRangeHelper + /// + /// Create a list of hosts from a string input like "10.0.0.1; example.com; 10.0.0.0/24" + /// + /// Hosts like "10.0.0.1; example.com; 10.0.0.0/24" + /// List of hosts. + public static IEnumerable CreateListFromInput(string hosts) { - public static Task CreateIPAddressesFromIPRangesAsync(string[] ipRanges, CancellationToken cancellationToken) - { - return Task.Run(() => CreateIPAddressesFromIPRanges(ipRanges, cancellationToken), cancellationToken); - } + return hosts.Replace(" ", "").Split(';') + .Where(x => !string.IsNullOrEmpty(x)) + .Select(x => x.Trim()) + .ToArray(); + } - public static IPAddress[] CreateIPAddressesFromIPRanges(string[] ipRanges, CancellationToken cancellationToken) - { - var bag = new ConcurrentBag(); + public static Task<(List<(IPAddress ipAddress, string hostname)> hosts, List hostnamesNotResolved)> + ResolveAsync(IEnumerable hosts, bool dnsResolveHostnamePreferIPv4, CancellationToken cancellationToken) + { + return Task.Run(() => Resolve(hosts, dnsResolveHostnamePreferIPv4, cancellationToken), cancellationToken); + } - var parallelOptions = new ParallelOptions - { - CancellationToken = cancellationToken - }; + private static (List<(IPAddress ipAddress, string hostname)> hosts, List hostnamesNotResolved) Resolve( + IEnumerable hosts, bool dnsResolveHostnamePreferIPv4, CancellationToken cancellationToken) + { + var hostsBag = new ConcurrentBag<(IPAddress ipAddress, string hostname)>(); + var hostnamesNotResovledBag = new ConcurrentBag(); - foreach (var ipOrRange in ipRanges) + Parallel.ForEach(hosts, new ParallelOptions { CancellationToken = cancellationToken }, host => + { + switch (host) { // 192.168.0.1 - if (Regex.IsMatch(ipOrRange, RegexHelper.IPv4AddressRegex)) - { - bag.Add(IPAddress.Parse(ipOrRange)); - continue; - } - - // 192.168.0.0/24 or 192.168.0.0/255.255.255.0 - if (Regex.IsMatch(ipOrRange, RegexHelper.IPv4AddressCidrRegex) || Regex.IsMatch(ipOrRange, RegexHelper.IPv4AddressSubnetmaskRegex)) - { - var network = IPNetwork.Parse(ipOrRange); - - Parallel.For(IPv4Address.ToInt32(network.Network), IPv4Address.ToInt32(network.Broadcast) + 1, parallelOptions, i => - { - bag.Add(IPv4Address.FromInt32(i)); + case var _ when RegexHelper.IPv4AddressRegex().IsMatch(host): + // 2001:db8:85a3::8a2e:370:7334 + case var _ when Regex.IsMatch(host, RegexHelper.IPv6AddressRegex): + hostsBag.Add((IPAddress.Parse(host), string.Empty)); - parallelOptions.CancellationToken.ThrowIfCancellationRequested(); - }); + break; - continue; - } + // 192.168.0.0/24 + case var _ when RegexHelper.IPv4AddressCidrRegex().IsMatch(host): + // 192.168.0.0/255.255.255.0 + case var _ when RegexHelper.IPv4AddressSubnetmaskRegex().IsMatch(host): + var network = IPNetwork2.Parse(host); + + Parallel.For(IPv4Address.ToInt32(network.Network), IPv4Address.ToInt32(network.Broadcast) + 1, + (i, state) => + { + if (cancellationToken.IsCancellationRequested) + state.Break(); + + hostsBag.Add((IPv4Address.FromInt32(i), string.Empty)); + }); + + break; // 192.168.0.0 - 192.168.0.100 - if (Regex.IsMatch(ipOrRange, RegexHelper.IPv4AddressRangeRegex)) - { - var range = ipOrRange.Split('-'); + case var _ when RegexHelper.IPv4AddressRangeRegex().IsMatch(host): + var range = host.Split('-'); - Parallel.For(IPv4Address.ToInt32(IPAddress.Parse(range[0])), IPv4Address.ToInt32(IPAddress.Parse(range[1])) + 1, parallelOptions, i => - { - bag.Add(IPv4Address.FromInt32(i)); + Parallel.For(IPv4Address.ToInt32(IPAddress.Parse(range[0])), + IPv4Address.ToInt32(IPAddress.Parse(range[1])) + 1, (i, state) => + { + if (cancellationToken.IsCancellationRequested) + state.Break(); - parallelOptions.CancellationToken.ThrowIfCancellationRequested(); - }); + hostsBag.Add((IPv4Address.FromInt32(i), string.Empty)); + }); - continue; - } + break; - // 192.168.[50-100,200].1 --> 192.168.50.1, 192.168.51.1, 192.168.52.1, {..}, 192.168.200.1 - if (Regex.IsMatch(ipOrRange, RegexHelper.IPv4AddressSpecialRangeRegex)) - { - var octets = ipOrRange.Split('.'); + // 192.168.[50-100].1 + case var _ when RegexHelper.IPv4AddressSpecialRangeRegex().IsMatch(host): + var octets = host.Split('.'); - var list = new List>(); + var list = new List>(); // Go through each octet... foreach (var octet in octets) { - var innerList = new List(); + var innerList = new ConcurrentBag(); // Create a range for each octet if (Regex.IsMatch(octet, RegexHelper.SpecialRangeRegex)) - { - foreach (var numberOrRange in octet.Substring(1, octet.Length - 2).Split(',')) - { + foreach (var numberOrRange in octet[1..^1].Split(',')) // 50-100 - if (numberOrRange.Contains("-")) + if (numberOrRange.Contains('-')) { var rangeNumbers = numberOrRange.Split('-'); - for (var i = int.Parse(rangeNumbers[0]); i < (int.Parse(rangeNumbers[1]) + 1); i++) - { - innerList.Add(i); - } + Parallel.For(int.Parse(rangeNumbers[0]), int.Parse(rangeNumbers[1]) + 1, + (i, state) => + { + if (cancellationToken.IsCancellationRequested) + state.Break(); + + innerList.Add(i); + }); } // 200 else { innerList.Add(int.Parse(numberOrRange)); } - } - } else - { innerList.Add(int.Parse(octet)); - } list.Add(innerList); } // Build the new ipv4 - foreach (var i in list[0]) - { - foreach (var j in list[1]) + Parallel.ForEach(list[0], new ParallelOptions { CancellationToken = cancellationToken }, + i => { - foreach (var k in list[2]) - { - foreach (var h in list[3]) + Parallel.ForEach(list[1], new ParallelOptions { CancellationToken = cancellationToken }, + j => { - bag.Add(IPAddress.Parse($"{i}.{j}.{k}.{h}")); - } - } - } - } - - continue; - } + Parallel.ForEach(list[2], + new ParallelOptions { CancellationToken = cancellationToken }, + k => + { + Parallel.ForEach(list[3], + new ParallelOptions { CancellationToken = cancellationToken }, + h => + { + hostsBag.Add((IPAddress.Parse($"{i}.{j}.{k}.{h}"), string.Empty)); + }); + }); + }); + }); + + break; - // 2001:db8:85a3::8a2e:370:7334 - if (Regex.IsMatch(ipOrRange, RegexHelper.IPv6AddressRegex)) - { - bag.Add(IPAddress.Parse(ipOrRange)); - } - } - - return bag.ToArray(); - } - - public static Task> ResolveHostnamesInIPRangesAsync(string[] ipRanges, CancellationToken cancellationToken) - { - return Task.Run(() => ResolveHostnamesInIPRanges(ipRanges, cancellationToken), cancellationToken); - } - - public static List ResolveHostnamesInIPRanges(string[] ipRanges, CancellationToken cancellationToken) - { - var bag = new ConcurrentBag(); - - var exceptions = new ConcurrentQueue(); - - Parallel.ForEach(ipRanges, new ParallelOptions { CancellationToken = cancellationToken }, ipHostOrRange => - { - // 192.168.0.1 - if (Regex.IsMatch(ipHostOrRange, RegexHelper.IPv4AddressRegex)) - { - bag.Add(ipHostOrRange); - } - // 192.168.0.0/24 - else if (Regex.IsMatch(ipHostOrRange, RegexHelper.IPv4AddressCidrRegex)) - { - bag.Add(ipHostOrRange); - } - // 192.168.0.0/255.255.255.0 - else if (Regex.IsMatch(ipHostOrRange, RegexHelper.IPv4AddressSubnetmaskRegex)) - { - bag.Add(ipHostOrRange); - } - // 192.168.0.0 - 192.168.0.100 - else if (Regex.IsMatch(ipHostOrRange, RegexHelper.IPv4AddressRangeRegex)) - { - bag.Add(ipHostOrRange); - } - // 192.168.[50-100].1 - else if (Regex.IsMatch(ipHostOrRange, RegexHelper.IPv4AddressSpecialRangeRegex)) - { - bag.Add(ipHostOrRange); - } - // 2001:db8:85a3::8a2e:370:7334 - else if (Regex.IsMatch(ipHostOrRange, RegexHelper.IPv6AddressRegex)) - { - bag.Add(ipHostOrRange); - } // example.com - else if(Regex.IsMatch(ipHostOrRange, RegexHelper.HostnameRegex)) - { - // Wait for task inside a Parallel.Foreach - var dnsResovlerTask = DnsLookupHelper.ResolveIPAddress(ipHostOrRange); + case var _ when RegexHelper.HostnameOrDomainRegex().IsMatch(host): + using (var dnsResolverTask = + DNSClientHelper.ResolveAorAaaaAsync(host, dnsResolveHostnamePreferIPv4)) + { + // Wait for task inside a Parallel.Foreach + dnsResolverTask.Wait(cancellationToken); - Task.WaitAll(dnsResovlerTask); + if (!dnsResolverTask.Result.HasError) + hostsBag.Add((IPAddress.Parse($"{dnsResolverTask.Result.Value}"), host)); + else + hostnamesNotResovledBag.Add(host); + } + + break; - bag.Add($"{dnsResovlerTask.Result}"); - } // example.com/24 or example.com/255.255.255.128 - else if (Regex.IsMatch(ipHostOrRange, RegexHelper.HostnameCidrRegex) || Regex.IsMatch(ipHostOrRange, RegexHelper.HostnameSubnetmaskRegex)) - { - var hostAndSubnet = ipHostOrRange.Split('/'); + case var _ when Regex.IsMatch(host, RegexHelper.HostnameOrDomainWithCidrRegex): + case var _ when Regex.IsMatch(host, RegexHelper.HostnameOrDomainWithSubnetmaskRegex): + var hostAndSubnet = host.Split('/'); - // Wait for task inside a Parallel.Foreach - var dnsResovlerTask = DnsLookupHelper.ResolveIPAddress(hostAndSubnet[0]); + // Only support IPv4 + using (var dnsResolverTask = DNSClientHelper.ResolveAorAaaaAsync(hostAndSubnet[0], true)) + { + // Wait for task inside a Parallel.Foreach + dnsResolverTask.Wait(cancellationToken); - Task.WaitAll(dnsResovlerTask); + if (!dnsResolverTask.Result.HasError) + { + // Only support IPv4 for ranges for now + if (dnsResolverTask.Result.Value.AddressFamily == AddressFamily.InterNetwork) + { + network = IPNetwork2.Parse( + $"{dnsResolverTask.Result.Value}/{hostAndSubnet[1]}"); - // IPv6 is not supported for ranges - if (dnsResovlerTask.Result == null || dnsResovlerTask.Result.AddressFamily != AddressFamily.InterNetwork) - { - exceptions.Enqueue(new HostNotFoundException(hostAndSubnet[0])); - return; + Parallel.For(IPv4Address.ToInt32(network.Network), + IPv4Address.ToInt32(network.Broadcast) + 1, (i, state) => + { + if (cancellationToken.IsCancellationRequested) + state.Break(); + + hostsBag.Add((IPv4Address.FromInt32(i), string.Empty)); + }); + } + else + { + hostnamesNotResovledBag.Add(hostAndSubnet[0]); + } + } + else + { + hostnamesNotResovledBag.Add(hostAndSubnet[0]); + } } - bag.Add($"{dnsResovlerTask.Result}/{hostAndSubnet[1]}"); - } - }); + break; + } + }); - if (exceptions.Count > 0) - throw new AggregateException(exceptions); + // Sort list and return + IPAddressComparer comparer = new(); - return bag.ToList(); - } + return ([.. hostsBag.OrderBy(x => x.ipAddress, comparer)], [.. hostnamesNotResovledBag]); } } \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/HostnameArgs.cs b/Source/NETworkManager.Models/Network/HostnameArgs.cs new file mode 100644 index 0000000000..e7a74da233 --- /dev/null +++ b/Source/NETworkManager.Models/Network/HostnameArgs.cs @@ -0,0 +1,23 @@ +using System; + +namespace NETworkManager.Models.Network; + +/// +/// Contains the information of a resolved hostname in a . +/// +public class HostnameArgs : EventArgs +{ + /// + /// Creates a new instance of with the given hostname. + /// + /// + public HostnameArgs(string hostname) + { + Hostname = hostname; + } + + /// + /// Hostname. + /// + public string Hostname { get; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/IPConfigReleaseRenewMode.cs b/Source/NETworkManager.Models/Network/IPConfigReleaseRenewMode.cs new file mode 100644 index 0000000000..136efe553a --- /dev/null +++ b/Source/NETworkManager.Models/Network/IPConfigReleaseRenewMode.cs @@ -0,0 +1,37 @@ +namespace NETworkManager.Models.Network; + +/// +/// Release or renew modes to control ipconfig.exe. +/// +public enum IPConfigReleaseRenewMode +{ + /// + /// Release and renew IPv4. + /// + ReleaseRenew, + + /// + /// Release and renew IPv6. + /// + ReleaseRenew6, + + /// + /// Release IPv4. + /// + Release, + + /// + /// Release IPv6. + /// + Release6, + + /// + /// Renew IPv4. + /// + Renew, + + /// + /// Renew IPv6. + /// + Renew6 +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/IPNetworkInfo.cs b/Source/NETworkManager.Models/Network/IPNetworkInfo.cs index 1710ed0af6..1ae71879c1 100644 --- a/Source/NETworkManager.Models/Network/IPNetworkInfo.cs +++ b/Source/NETworkManager.Models/Network/IPNetworkInfo.cs @@ -1,41 +1,54 @@ using System.Net; +using System.Net.Sockets; using System.Numerics; -using NETworkManager.Utilities; +using IPAddress = System.Net.IPAddress; -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +public class IPNetworkInfo { - public class IPNetworkInfo + public IPNetworkInfo() { - public IPAddress Network { get; set; } - public IPAddress Broadcast { get; set; } - public BigInteger Total { get; set; } - public IPAddress Netmask { get; set; } - public int Cidr { get; set; } - public IPAddress FirstUsable { get; set; } - public IPAddress LastUsable { get; set; } - public BigInteger Usable { get; set; } - - public int NetworkInt32 => Network.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork ? IPv4Address.ToInt32(Network) : 0; - public int BroadcastInt32 => Broadcast.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork ? IPv4Address.ToInt32(Broadcast) : 0; - public int NetmaskInt32 => Netmask.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork ? IPv4Address.ToInt32(Netmask) : 0; - public int FirstUsableInt32 => FirstUsable.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork ? IPv4Address.ToInt32(FirstUsable) : 0; - public int LastUsableInt32 => LastUsable.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork ? IPv4Address.ToInt32(LastUsable) : 0; - - public IPNetworkInfo() - { - - } - - public IPNetworkInfo(IPNetwork ipNetwork) - { - Network = ipNetwork.Network; - Broadcast = ipNetwork.Broadcast; - Total = ipNetwork.Total; - Netmask = ipNetwork.Netmask; - Cidr = ipNetwork.Cidr; - FirstUsable = ipNetwork.FirstUsable; - LastUsable = ipNetwork.LastUsable; - Usable = ipNetwork.Usable; - } } -} + + public IPNetworkInfo(IPNetwork2 ipNetwork) + { + Network = ipNetwork.Network; + Broadcast = ipNetwork.Broadcast; + Total = ipNetwork.Total; + Netmask = ipNetwork.Netmask; + Cidr = ipNetwork.Cidr; + FirstUsable = ipNetwork.FirstUsable; + LastUsable = ipNetwork.LastUsable; + Usable = ipNetwork.Usable; + } + + public IPAddress Network { get; set; } + public IPAddress Broadcast { get; set; } + public BigInteger Total { get; set; } + public IPAddress Netmask { get; set; } + public int Cidr { get; set; } + public IPAddress FirstUsable { get; set; } + public IPAddress LastUsable { get; set; } + public BigInteger Usable { get; set; } + + public int NetworkInt32 => Network.AddressFamily == AddressFamily.InterNetwork + ? IPv4Address.ToInt32(Network) + : 0; + + public int BroadcastInt32 => Broadcast.AddressFamily == AddressFamily.InterNetwork + ? IPv4Address.ToInt32(Broadcast) + : 0; + + public int NetmaskInt32 => Netmask.AddressFamily == AddressFamily.InterNetwork + ? IPv4Address.ToInt32(Netmask) + : 0; + + public int FirstUsableInt32 => FirstUsable.AddressFamily == AddressFamily.InterNetwork + ? IPv4Address.ToInt32(FirstUsable) + : 0; + + public int LastUsableInt32 => LastUsable.AddressFamily == AddressFamily.InterNetwork + ? IPv4Address.ToInt32(LastUsable) + : 0; +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/IPScanner.cs b/Source/NETworkManager.Models/Network/IPScanner.cs index 8619382c76..7fb4e8b698 100644 --- a/Source/NETworkManager.Models/Network/IPScanner.cs +++ b/Source/NETworkManager.Models/Network/IPScanner.cs @@ -1,225 +1,333 @@ -using DnsClient; -using NETworkManager.Models.Lookup; -using System; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.NetworkInformation; +using System.Net.Sockets; using System.Threading; using System.Threading.Tasks; +using NETworkManager.Models.Lookup; +using NETworkManager.Utilities; + +namespace NETworkManager.Models.Network; -namespace NETworkManager.Models.Network +/// +/// Class to scan for IP addresses in a network. +/// +/// The scan options. +public sealed class IPScanner(IPScannerOptions options) { - public class IPScanner - { - #region Variables - private int _progressValue; - - public int Threads = 256; - public int ICMPTimeout = 4000; - public byte[] ICMPBuffer = new byte[32]; - public int ICMPAttempts = 2; - public bool ResolveHostname = true; - - public bool UseCustomDNSServer = false; - public IPAddress CustomDNSServer; - public int CustomDNSPort = 53; - public bool DNSUseTCPOnly = false; - public bool DNSUseCache = true; - public bool DNSRecursion = true; - public TimeSpan DNSTimeout = TimeSpan.FromSeconds(2); - public int DNSRetries = 3; - public bool DNSShowErrorMessage = false; - - public bool ResolveMACAddress = false; - public bool ShowScanResultForAllIPAddresses = false; - - private LookupClient DnsLookupClient; - #endregion - - #region Events - public event EventHandler HostFound; - - protected virtual void OnHostFound(HostFoundArgs e) - { - HostFound?.Invoke(this, e); - } - - public event EventHandler ScanComplete; - - protected virtual void OnScanComplete() - { - ScanComplete?.Invoke(this, EventArgs.Empty); - } - - public event EventHandler ProgressChanged; - - protected virtual void OnProgressChanged() - { - ProgressChanged?.Invoke(this, new ProgressChangedArgs(_progressValue)); - } - - public event EventHandler UserHasCanceled; - - protected virtual void OnUserHasCanceled() - { - UserHasCanceled?.Invoke(this, EventArgs.Empty); - } - #endregion - - #region Methods - public void ScanAsync(IPAddress[] ipAddresses, CancellationToken cancellationToken) - { - // Start the scan in a separat task - Task.Run(() => - { - _progressValue = 0; - - // Create dns client and set options - - if (ResolveHostname) - { - DnsLookupClient = UseCustomDNSServer ? new LookupClient(new IPEndPoint(CustomDNSServer, CustomDNSPort)) : new LookupClient(); - DnsLookupClient.UseCache = DNSUseCache; - DnsLookupClient.Recursion = DNSRecursion; - DnsLookupClient.Timeout = DNSTimeout; - DnsLookupClient.Retries = DNSRetries; - DnsLookupClient.UseTcpOnly = DNSUseTCPOnly; - } - - // Modify the ThreadPool for better performance - ThreadPool.GetMinThreads(out var workerThreads, out var completionPortThreads); - ThreadPool.SetMinThreads(workerThreads + Threads, completionPortThreads + Threads); - - try - { - var parallelOptions = new ParallelOptions - { - CancellationToken = cancellationToken, - MaxDegreeOfParallelism = Threads - }; - - Parallel.ForEach(ipAddresses, parallelOptions, ipAddress => - { - var pingInfo = new PingInfo(); - var pingable = false; - - // PING - using (var ping = new System.Net.NetworkInformation.Ping()) - { - for (var i = 0; i < ICMPAttempts; i++) - { - try - { - var pingReply = ping.Send(ipAddress, ICMPTimeout, ICMPBuffer); - - if (pingReply != null && IPStatus.Success == pingReply.Status) - { - if (ipAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) - pingInfo = new PingInfo(pingReply.Address, pingReply.Buffer.Length, pingReply.RoundtripTime, pingReply.Options.Ttl, pingReply.Status); - else - pingInfo = new PingInfo(pingReply.Address, pingReply.Buffer.Length, pingReply.RoundtripTime, pingReply.Status); - - pingable = true; - break; // Continue with the next checks... - } - - if (pingReply != null) - pingInfo = new PingInfo(ipAddress, pingReply.Status); - } - catch (PingException) - { } - - // Don't scan again, if the user has canceled (when more than 1 attempt) - if (cancellationToken.IsCancellationRequested) - break; - } - } - - if (pingable || ShowScanResultForAllIPAddresses) - { - // DNS - var hostname = string.Empty; - - if (ResolveHostname) - { - try - { - var dnsQueryResponse = DnsLookupClient.QueryReverse(ipAddress); - - if (dnsQueryResponse != null && !dnsQueryResponse.HasError) - hostname = dnsQueryResponse.Answers.PtrRecords().FirstOrDefault()?.PtrDomainName; - else - hostname = DNSShowErrorMessage ? dnsQueryResponse.ErrorMessage : ""; - } - catch (Exception ex) - { - hostname = DNSShowErrorMessage ? ex.Message : ""; - } - } - - // ARP - PhysicalAddress macAddress = null; - var vendor = string.Empty; - - if (ResolveMACAddress) - { - // Get info from arp table - var arpTableInfo = ARP.GetTable().FirstOrDefault(p => p.IPAddress.ToString() == ipAddress.ToString()); - - if (arpTableInfo != null) - macAddress = arpTableInfo.MACAddress; - - // Check if it is the local mac - if (macAddress == null) - { - var networkInferfaceInfo = NetworkInterface.GetNetworkInterfaces().FirstOrDefault(p => p.IPv4Address.Any(x => x.Item1.Equals(ipAddress))); - - if (networkInferfaceInfo != null) - macAddress = networkInferfaceInfo.PhysicalAddress; - } - - // Vendor lookup - if (macAddress != null) - { - var info = OUILookup.Lookup(macAddress.ToString()).FirstOrDefault(); - - if (info != null) - vendor = info.Vendor; - } - } - - OnHostFound(new HostFoundArgs(pingInfo, hostname, macAddress, vendor)); - } - - IncreaseProcess(); - }); - - - OnScanComplete(); - } - catch (OperationCanceledException) // If user has canceled - { - // Check if the scan is already complete... - if (ipAddresses.Length == _progressValue) - OnScanComplete(); - else - OnUserHasCanceled(); - } - finally - { - // Reset the ThreadPool to default - ThreadPool.GetMinThreads(out workerThreads, out completionPortThreads); - ThreadPool.SetMinThreads(workerThreads - Threads, completionPortThreads - Threads); - } - }, cancellationToken); - } - - private void IncreaseProcess() - { - // Increase the progress - Interlocked.Increment(ref _progressValue); - OnProgressChanged(); - } - #endregion - } -} + #region Variables + + private int _progressValue; + + #endregion + + #region Events + + /// + /// Occurs when a host has been scanned. + /// + public event EventHandler HostScanned; + + private void OnHostScanned(IPScannerHostScannedArgs e) + { + HostScanned?.Invoke(this, e); + } + + /// + /// Occurs when the scan is complete. + /// + public event EventHandler ScanComplete; + + private void OnScanComplete() + { + ScanComplete?.Invoke(this, EventArgs.Empty); + } + + /// + /// Occurs when the scan progress has changed. + /// + public event EventHandler ProgressChanged; + + private void OnProgressChanged() + { + ProgressChanged?.Invoke(this, new ProgressChangedArgs(_progressValue)); + } + + /// + /// Occurs when the user has canceled the scan. + /// + public event EventHandler UserHasCanceled; + + private void OnUserHasCanceled() + { + UserHasCanceled?.Invoke(this, EventArgs.Empty); + } + + #endregion + + #region Methods + + /// + /// Starts the IP scan asynchronously. + /// + /// The list of hosts to scan. + /// The token to monitor for cancellation requests. + public void ScanAsync(IEnumerable<(IPAddress ipAddress, string hostname)> hosts, + CancellationToken cancellationToken) + { + // Start the scan in a separate task + Task.Run(() => + { + _progressValue = 0; + + // Get all network interfaces (for local mac address lookup) + var networkInterfaces = options.ResolveMACAddress ? NetworkInterface.GetNetworkInterfaces() : []; + + try + { + var hostParallelOptions = new ParallelOptions + { + CancellationToken = cancellationToken, + MaxDegreeOfParallelism = options.MaxHostThreads + }; + + var portScanParallelOptions = new ParallelOptions + { + CancellationToken = cancellationToken, + MaxDegreeOfParallelism = options.MaxPortThreads + }; + + // Start scan + Parallel.ForEach(hosts, hostParallelOptions, host => + { + // Start ping async + var pingTask = PingAsync(host.ipAddress, cancellationToken); + + // Start port scan async (if enabled) + var portScanTask = options.PortScanEnabled + ? PortScanAsync(host.ipAddress, portScanParallelOptions, cancellationToken) + : Task.FromResult(Enumerable.Empty()); + + // Start netbios lookup async (if enabled) + var netbiosTask = options.NetBIOSEnabled + ? NetBIOSResolver.ResolveAsync(host.ipAddress, options.NetBIOSTimeout, cancellationToken) + : Task.FromResult(new NetBIOSInfo(host.ipAddress)); + + // Get ping result + pingTask.Wait(cancellationToken); + var pingInfo = pingTask.Result; + + // Get port scan result + portScanTask.Wait(cancellationToken); + var portScanResults = portScanTask.Result.ToList(); + + // Get netbios result + netbiosTask.Wait(cancellationToken); + var netBIOSInfo = netbiosTask.Result; + + // Cancel if the user has canceled + cancellationToken.ThrowIfCancellationRequested(); + + // Check if host is up + var isAnyPortOpen = portScanResults.Any(x => x.State == PortState.Open); + var isReachable = pingInfo.Status == IPStatus.Success || // ICMP response + isAnyPortOpen || // Any port is open + netBIOSInfo.IsReachable; // NetBIOS response + + // DNS & ARP + if (isReachable || options.ShowAllResults) + { + // DNS + var dnsHostname = string.Empty; + + if (options.ResolveHostname) + { + // Don't use await in Parallel.ForEach, this will break + var dnsResolverTask = DNSClient.GetInstance().ResolvePtrAsync(host.ipAddress); + + // Wait for task inside a Parallel.Foreach + dnsResolverTask.Wait(cancellationToken); + + if (!dnsResolverTask.Result.HasError) + dnsHostname = dnsResolverTask.Result.Value; + } + + // ARP + var arpMACAddress = string.Empty; + var arpVendor = string.Empty; + + if (options.ResolveMACAddress) + { + // Get info from neighbor table + arpMACAddress = NeighborTable.GetMACAddress(host.ipAddress); + + // Check if it is the local mac + if (string.IsNullOrEmpty(arpMACAddress)) + { + var networkInterfaceInfo = networkInterfaces.FirstOrDefault(p => + p.IPv4Address.Any(x => x.Item1.Equals(host.ipAddress))); + + if (networkInterfaceInfo != null) + arpMACAddress = networkInterfaceInfo.PhysicalAddress.ToString(); + } + + // Vendor lookup & default format + if (!string.IsNullOrEmpty(arpMACAddress)) + { + var info = OUILookup.LookupByMacAddress(arpMACAddress).FirstOrDefault(); + + if (info != null) + arpVendor = info.Vendor; + + // Apply default format + arpMACAddress = MACAddressHelper.GetDefaultFormat(arpMACAddress); + } + } + + OnHostScanned(new IPScannerHostScannedArgs( + new IPScannerHostInfo( + isReachable, + pingInfo, + // DNS is default, fallback to netbios + !string.IsNullOrEmpty(dnsHostname) + ? dnsHostname + : netBIOSInfo?.ComputerName ?? string.Empty, + dnsHostname, + isAnyPortOpen, + portScanResults.OrderBy(x => x.Port).ToList(), + netBIOSInfo, + // ARP/NDP is preferred, fallback to NetBIOS + !string.IsNullOrEmpty(arpMACAddress) + ? arpMACAddress + : netBIOSInfo?.MACAddress ?? string.Empty, + !string.IsNullOrEmpty(arpMACAddress) + ? arpVendor + : netBIOSInfo?.Vendor ?? string.Empty + ) + ) + ); + } + + IncreaseProgress(); + }); + } + catch (OperationCanceledException) + { + OnUserHasCanceled(); + } + finally + { + OnScanComplete(); + } + }, cancellationToken); + } + + private Task PingAsync(IPAddress ipAddress, CancellationToken cancellationToken) + { + return Task.Run(() => + { + using var ping = new System.Net.NetworkInformation.Ping(); + + for (var i = 0; i < options.ICMPAttempts; i++) + { + // Get timestamp + var timestamp = DateTime.Now; + + try + { + var pingReply = ping.Send(ipAddress, options.ICMPTimeout, options.ICMPBuffer); + + // Success + if (pingReply is { Status: IPStatus.Success }) + { + switch (ipAddress.AddressFamily) + { + case AddressFamily.InterNetwork: + return new PingInfo( + timestamp, + pingReply.Address, + pingReply.Buffer.Length, + pingReply.RoundtripTime, + pingReply.Options!.Ttl, + pingReply.Status); + case AddressFamily.InterNetworkV6: + return new PingInfo( + timestamp, + pingReply.Address, + pingReply.Buffer.Length, + pingReply.RoundtripTime, + pingReply.Status); + } + } + + // Failed + if (pingReply != null) + return new PingInfo(timestamp, ipAddress, pingReply.Status); + } + catch (PingException) + { + // Ping failed with unknown status + return new PingInfo(timestamp, ipAddress, IPStatus.Unknown); + } + + // Don't scan again, if the user has canceled (when more than 1 attempt) + if (cancellationToken.IsCancellationRequested) + break; + } + + // Fall back to unknown status + return new PingInfo(DateTime.Now, ipAddress, IPStatus.Unknown); + }, cancellationToken); + } + + private Task> PortScanAsync(IPAddress ipAddress, ParallelOptions parallelOptions, + CancellationToken cancellationToken) + { + ConcurrentBag results = []; + + Parallel.ForEach(options.PortScanPorts, parallelOptions, port => + { + // Test if port is open + using var tcpClient = new TcpClient(ipAddress.AddressFamily); + + var portState = PortState.None; + + try + { + // ReSharper disable once MethodSupportsCancellation - Wait for timeout + var task = tcpClient.ConnectAsync(ipAddress, port); + + if (task.Wait(options.PortScanTimeout, cancellationToken)) + portState = tcpClient.Connected ? PortState.Open : PortState.Closed; + else + portState = PortState.TimedOut; + } + catch + { + portState = PortState.Closed; + } + finally + { + tcpClient.Close(); + + if (portState == PortState.Open || options.ShowAllResults) + results.Add( + new PortInfo(port, PortLookup.LookupByPortAndProtocol(port), portState)); + } + }); + + return Task.FromResult(results.AsEnumerable()); + } + + private void IncreaseProgress() + { + // Increase the progress + Interlocked.Increment(ref _progressValue); + OnProgressChanged(); + } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/IPScannerCustomCommand.cs b/Source/NETworkManager.Models/Network/IPScannerCustomCommand.cs new file mode 100644 index 0000000000..7ab60cd08b --- /dev/null +++ b/Source/NETworkManager.Models/Network/IPScannerCustomCommand.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using NETworkManager.Utilities; + +namespace NETworkManager.Models.Network; + +public static class IPScannerCustomCommand +{ + public static List GetDefaultList() + { + return new List + { + new(Guid.NewGuid(), "Edge", "cmd.exe", @"/c start microsoft-edge:http://{{IPAddress}}/"), + new(Guid.NewGuid(), "Edge (https)", "cmd.exe", + @"/c start microsoft-edge:https://{{IPAddress}}/"), + new(Guid.NewGuid(), "Windows Explorer (c$)", "explorer.exe", @"\\{{IPAddress}}\c$") + }; + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/IPScannerHostInfo.cs b/Source/NETworkManager.Models/Network/IPScannerHostInfo.cs new file mode 100644 index 0000000000..4e579d77c0 --- /dev/null +++ b/Source/NETworkManager.Models/Network/IPScannerHostInfo.cs @@ -0,0 +1,81 @@ +using System.Collections.Generic; + +namespace NETworkManager.Models.Network; + +/// +/// Class containing information about a host in a . +/// +public class IPScannerHostInfo +{ + /// + /// Creates a new instance of with the specified parameters. + /// + /// Indicates whether the host is reachable. + /// Information about the ping to the host. + /// Hostname of the host (dns or netbios). + /// DNS hostname of the host. + /// Indicates whether any port is open. + /// List of open ports. + /// NetBIOS information about the host. + /// MAC address of the host (ARP/NDP preferred, NetBIOS as fallback). + /// Vendor of the host based on the MAC address. + public IPScannerHostInfo(bool isReachable, PingInfo pingInfo, string hostname, string dnsHostname, + bool isAnyPortOpen, List ports, + NetBIOSInfo netBIOSInfo, string macAddress, string vendor) + { + IsReachable = isReachable; + PingInfo = pingInfo; + Hostname = hostname; + DNSHostname = dnsHostname; + IsAnyPortOpen = isAnyPortOpen; + Ports = ports; + NetBIOSInfo = netBIOSInfo; + MACAddress = macAddress; + Vendor = vendor; + } + + /// + /// Indicates whether the host is reachable. + /// + public bool IsReachable { get; set; } + + /// + /// Information about the ping to the host. + /// + public PingInfo PingInfo { get; set; } + + /// + /// Hostname of the host (dns or netbios). + /// + public string Hostname { get; set; } + + /// + /// DNS hostname of the host. + /// + public string DNSHostname { get; set; } + + /// + /// Indicates whether any port is open. + /// + public bool IsAnyPortOpen { get; set; } + + /// + /// List of open ports. + /// + public List Ports { get; set; } + + /// + /// NetBIOS information about the host. + /// + public NetBIOSInfo NetBIOSInfo { get; set; } + + /// + /// MAC address of the host (ARP/NDP preferred, NetBIOS as fallback). + /// + public string MACAddress { get; set; } + + /// + /// Vendor of the host based on the MAC address. + /// + public string Vendor { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/IPScannerHostScannedArgs.cs b/Source/NETworkManager.Models/Network/IPScannerHostScannedArgs.cs new file mode 100644 index 0000000000..a5d279ebed --- /dev/null +++ b/Source/NETworkManager.Models/Network/IPScannerHostScannedArgs.cs @@ -0,0 +1,23 @@ +using System; + +namespace NETworkManager.Models.Network; + +/// +/// Contains the information of a scanned host in a . +/// +public class IPScannerHostScannedArgs : EventArgs +{ + /// + /// Creates a new instance of with the given . + /// + /// IP Scanner host information. + public IPScannerHostScannedArgs(IPScannerHostInfo args) + { + Args = args; + } + + /// + /// IP Scanner host information. + /// + public IPScannerHostInfo Args { get; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/IPScannerOptions.cs b/Source/NETworkManager.Models/Network/IPScannerOptions.cs new file mode 100644 index 0000000000..545e8502aa --- /dev/null +++ b/Source/NETworkManager.Models/Network/IPScannerOptions.cs @@ -0,0 +1,107 @@ +namespace NETworkManager.Models.Network; + +/// +/// Class contains the options for the traceroute. +/// +public class IPScannerOptions +{ + /// + /// Create an instance of with parameters. + /// + /// Max concurrent threads for the host scan. + /// Max concurrent threads for the port scan of each host. + /// Number of attempts to ping a host. + /// Timeout in milliseconds after which a ping is considered lost. + /// Size of the buffer used in the ping in bytes. + /// Scan the ports of the host. + /// List of ports to scan. + /// Timeout in milliseconds after which a port is considered closed. + /// Resolve the hostname for an IP address. + /// Resolve the NetBIOS name for an IP address. + /// Timeout in milliseconds after which a NetBIOS request is considered lost. + /// Resolve the MAC address for the host from ARP. + /// Include unreachable IP addresses in the result. + public IPScannerOptions(int maxHostThreads, int maxPortThreads, int icmpAttempts, int icmpTimeout, + byte[] icmpBuffer, bool resolveHostname, bool portScanEnabled, int[] portScanPorts, int portScanTimeout, + bool netBIOSEnabled, int netBIOSTimeout, bool resolveMACAddress, bool showAllResults) + { + MaxHostThreads = maxHostThreads; + MaxPortThreads = maxPortThreads; + ICMPAttempts = icmpAttempts; + ICMPTimeout = icmpTimeout; + ICMPBuffer = icmpBuffer; + ResolveHostname = resolveHostname; + PortScanEnabled = portScanEnabled; + PortScanPorts = portScanPorts; + PortScanTimeout = portScanTimeout; + NetBIOSEnabled = netBIOSEnabled; + NetBIOSTimeout = netBIOSTimeout; + ResolveMACAddress = resolveMACAddress; + ShowAllResults = showAllResults; + } + + /// + /// Max concurrent threads for the host scan. + /// + public int MaxHostThreads { get; } + + /// + /// Max concurrent threads for the port scan of each host. + /// + public int MaxPortThreads { get; } + + /// + /// Number of attempts to ping a host. + /// + public int ICMPAttempts { get; } + + /// + /// Timeout in milliseconds after which a ping is considered lost. + /// + public int ICMPTimeout { get; } + + /// + /// Size of the buffer used in the ping in bytes. + /// + public byte[] ICMPBuffer { get; } + + /// + /// Resolve the hostname for an IP address. + /// + public bool ResolveHostname { get; } + + /// + /// Scan the ports of the host. + /// + public bool PortScanEnabled { get; } + + /// + /// Ports to scan. + /// + public int[] PortScanPorts { get; } + + /// + /// Timeout in milliseconds after which a port is considered closed. + /// + public int PortScanTimeout { get; } + + /// + /// Resolve the NetBIOS name for an IP address. + /// + public bool NetBIOSEnabled { get; } + + /// + /// Timeout in milliseconds after which a NetBIOS request is considered lost. + /// + public int NetBIOSTimeout { get; } + + /// + /// Resolve the MAC address for the host from ARP. + /// + public bool ResolveMACAddress { get; } + + /// + /// Include unreachable IP addresses in the result. + /// + public bool ShowAllResults { get; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/IPv4Address.cs b/Source/NETworkManager.Models/Network/IPv4Address.cs index ac307049e6..77a2069c11 100644 --- a/Source/NETworkManager.Models/Network/IPv4Address.cs +++ b/Source/NETworkManager.Models/Network/IPv4Address.cs @@ -3,91 +3,115 @@ using System.Linq; using System.Net; -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +/// +/// Class provides static methods to convert an IPv4 address. +/// +public static class IPv4Address { /// - /// Class provides static methods to convert an IPv4 address. + /// First possible IPv4 multicast address. + /// + private const int IPv4MulticastStart = -536870912; + + /// + /// Last possible IPv4 multicast address. + /// + private const int IPv4MulticastEnd = -268435457; + + /// + /// Method to convert a IPv4 address binary string ("11000000.10101000.00000001.00000001") to human readable string + /// ("192.168.1.1"). + /// + /// IPv4 address as binary string ("11111111111111111111111100000000"). + /// Converted IPv4 address as human readable string ("255.255.255.0"). + public static string ToHumanString(string binaryString) + { + var ipv4AddressBinary = binaryString.Replace(".", ""); + + var ipv4AddressOctets = new List(); + + for (var i = 0; i < ipv4AddressBinary.Length; i += 8) + ipv4AddressOctets.Add(Convert.ToInt32(ipv4AddressBinary.Substring(i, 8), 2).ToString()); + + return string.Join(".", ipv4AddressOctets); + } + + /// + /// Method to convert an human readable IPv4 address ("192.168.1.1") to binary string + /// ("11000000.10101000.00000001.00000001"). + /// + /// IPv4 address as human readable string ("192.168.1.1"). + /// Converted IPv4-Address as binary string ("11000000.10101000.00000001.00000001"). + public static string ToBinaryString(string humanString) + { + return string.Join(".", + humanString.Split('.').Select(x => Convert.ToString(int.Parse(x), 2).PadLeft(8, '0')).ToArray()); + } + + /// + /// Method to convert an to . + /// + /// . + /// IP address as + public static int ToInt32(IPAddress ipAddress) + { + var bytes = ipAddress.GetAddressBytes(); + + if (BitConverter.IsLittleEndian) + Array.Reverse(bytes); + + return BitConverter.ToInt32(bytes, 0); + } + + /// + /// Method to convert an to an . + /// + /// IP address as . + /// Converted . + public static IPAddress FromInt32(int i) + { + var bytes = BitConverter.GetBytes(i); + + if (BitConverter.IsLittleEndian) + Array.Reverse(bytes); + + return new IPAddress(bytes); + } + + /// + /// Method to check if an IPv4 address is a multicast address. + /// + /// IPv4 address as . + /// True if it is a multicast address. False if not. + public static bool IsMulticast(IPAddress ipAddress) + { + var ip = ToInt32(ipAddress); + + return ip is >= IPv4MulticastStart and <= IPv4MulticastEnd; + } + + /// + /// Convert a list of IP addresses to a string. + /// + /// IP addresses. + /// Delimiter to separate the IP addresses. Null for new line. (Default: null) + /// IP addresses as string. + public static object ConvertIPAddressListToString(IEnumerable ipAddresses, string delimiter = null) + { + return string.Join(delimiter ?? Environment.NewLine, ipAddresses); + } + + /// + /// Convert a list of IP addresses with subnetmasks to a string. /// - public static class IPv4Address + /// IP addresses with subnetmasks. + /// IP addresses with subnetmasks as string. + public static object ConvertIPAddressWithSubnetmaskListToString(Tuple[] ipAddresses, + string delimiter = null) { - /// - /// First possible IPv4 multicast address. - /// - private const int IPv4MulticastStart = -536870912; - - /// - /// Last possible IPv4 multicast address. - /// - private const int IPv4MulticastEnd = -268435457; - - /// - /// Method to convert a IPv4 address binary string ("11000000.10101000.00000001.00000001") to human readable string ("192.168.1.1"). - /// - /// IPv4 address as binary string ("11111111111111111111111100000000"). - /// Converted IPv4 address as human readable string ("255.255.255.0"). - public static string ToHumanString(string binaryString) - { - var ipv4AddressBinary = binaryString.Replace(".", ""); - - var ipv4AddressOctets = new List(); - - for (var i = 0; i < ipv4AddressBinary.Length; i += 8) - ipv4AddressOctets.Add(Convert.ToInt32(ipv4AddressBinary.Substring(i, 8), 2).ToString()); - - return string.Join(".", ipv4AddressOctets); - } - - /// - /// Method to convert an human readable IPv4 address ("192.168.1.1") to binary string ("11000000.10101000.00000001.00000001"). - /// - /// IPv4 address as human readable string ("192.168.1.1"). - /// Converted IPv4-Address as binary string ("11000000.10101000.00000001.00000001"). - public static string ToBinaryString(string humanString) - { - return string.Join(".", humanString.Split('.').Select(x => Convert.ToString(int.Parse(x), 2).PadLeft(8, '0')).ToArray()); - } - - /// - /// Method to convert an to . - /// - /// . - /// IP address as - - public static int ToInt32(IPAddress ipAddress) - { - var bytes = ipAddress.GetAddressBytes(); - - if (BitConverter.IsLittleEndian) - Array.Reverse(bytes); - - return BitConverter.ToInt32(bytes, 0); - } - - /// - /// Method to convert an to an . - /// - /// IP address as . - /// Converted . - public static IPAddress FromInt32(int i) - { - var bytes = BitConverter.GetBytes(i); - - if (BitConverter.IsLittleEndian) - Array.Reverse(bytes); - - return new IPAddress(bytes); - } - - /// - /// Method to check if an IPv4 address is a multicast address. - /// - /// IPv4 address as . - /// True if it is a multicast address. False if not. - public static bool IsMulticast(IPAddress ipAddress) - { - var ip = ToInt32(ipAddress); - - return (ip >= IPv4MulticastStart && ip <= IPv4MulticastEnd); - } + return string.Join(delimiter ?? Environment.NewLine, + ipAddresses.Select(ipAddr => $"{ipAddr.Item1}/{Subnetmask.ConvertSubnetmaskToCidr(ipAddr.Item2)}")); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/Listener.Protocol.cs b/Source/NETworkManager.Models/Network/Listener.Protocol.cs deleted file mode 100644 index 49d4daaa15..0000000000 --- a/Source/NETworkManager.Models/Network/Listener.Protocol.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace NETworkManager.Models.Network -{ - public partial class Listener - { - public enum Protocol - { - TCP, - UDP - } - } -} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/Listener.cs b/Source/NETworkManager.Models/Network/Listener.cs index b03d1b8883..249ee063c8 100644 --- a/Source/NETworkManager.Models/Network/Listener.cs +++ b/Source/NETworkManager.Models/Network/Listener.cs @@ -1,59 +1,57 @@ using System.Collections.Generic; -using System.Net; using System.Net.NetworkInformation; using System.Threading.Tasks; -namespace NETworkManager.Models.Network -{ - public partial class Listener - { - #region Methods - public static Task> GetAllActiveListenersAsync() - { - return Task.Run(() => GetAllActiveListeners()); +namespace NETworkManager.Models.Network; - } +public class Listener +{ + #region Methods - public static List GetAllActiveListeners() - { - List list = new List(); + public static Task> GetAllActiveListenersAsync() + { + return Task.Run(() => GetAllActiveListeners()); + } - list.AddRange(GetActiveTcpListeners()); - list.AddRange(GetActiveUdpListeners()); + public static List GetAllActiveListeners() + { + var list = new List(); - return list; - } + list.AddRange(GetActiveTcpListeners()); + list.AddRange(GetActiveUdpListeners()); - public static Task> GetActiveTcpListenersAsync() - { - return Task.Run(() => GetActiveTcpListeners()); - } + return list; + } - public static List GetActiveTcpListeners() - { - List list = new List(); + public static Task> GetActiveTcpListenersAsync() + { + return Task.Run(() => GetActiveTcpListeners()); + } - foreach (IPEndPoint ipEndPoint in IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners()) - list.Add(new ListenerInfo(Protocol.TCP, ipEndPoint.Address, ipEndPoint.Port)); + public static List GetActiveTcpListeners() + { + var list = new List(); - return list; - } + foreach (var ipEndPoint in IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners()) + list.Add(new ListenerInfo(TransportProtocol.Tcp, ipEndPoint.Address, ipEndPoint.Port)); - public static Task> GetActiveUdpListenersAsync() - { - return Task.Run(() => GetActiveUdpListeners()); - } + return list; + } - public static List GetActiveUdpListeners() - { - List list = new List(); + public static Task> GetActiveUdpListenersAsync() + { + return Task.Run(() => GetActiveUdpListeners()); + } - foreach (IPEndPoint ipEndPoint in IPGlobalProperties.GetIPGlobalProperties().GetActiveUdpListeners()) - list.Add(new ListenerInfo(Protocol.UDP, ipEndPoint.Address, ipEndPoint.Port)); + public static List GetActiveUdpListeners() + { + var list = new List(); - return list; - } + foreach (var ipEndPoint in IPGlobalProperties.GetIPGlobalProperties().GetActiveUdpListeners()) + list.Add(new ListenerInfo(TransportProtocol.Udp, ipEndPoint.Address, ipEndPoint.Port)); - #endregion + return list; } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/ListenerInfo.cs b/Source/NETworkManager.Models/Network/ListenerInfo.cs index cf84b1d589..70f0ca7f49 100644 --- a/Source/NETworkManager.Models/Network/ListenerInfo.cs +++ b/Source/NETworkManager.Models/Network/ListenerInfo.cs @@ -1,27 +1,21 @@ -using NETworkManager.Utilities; -using System.Net; -using static NETworkManager.Models.Network.Listener; +using System.Net; -namespace NETworkManager.Models.Network -{ - public class ListenerInfo - { - public Listener.Protocol Protocol { get; set; } - public IPAddress IPAddress { get; set; } - public int Port { get; set; } - - public int IPAddressInt32 => IPAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork ? IPv4Address.ToInt32(IPAddress) : 0; +namespace NETworkManager.Models.Network; - public ListenerInfo() - { +public class ListenerInfo(TransportProtocol protocol, IPAddress ipAddress, int port) +{ + /// + /// Transport protocol of the listener. + /// + public TransportProtocol Protocol { get; set; } = protocol; - } + /// + /// IP address of the listener. + /// + public IPAddress IPAddress { get; set; } = ipAddress; - public ListenerInfo(Listener.Protocol protocol, IPAddress ipddress, int port) - { - Protocol = protocol; - IPAddress = ipddress; - Port = port; - } - } + /// + /// Port of the listener. + /// + public int Port { get; set; } = port; } \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/MaximumHopsReachedArgs.cs b/Source/NETworkManager.Models/Network/MaximumHopsReachedArgs.cs index 816e1fc2b0..a39e5ddbab 100644 --- a/Source/NETworkManager.Models/Network/MaximumHopsReachedArgs.cs +++ b/Source/NETworkManager.Models/Network/MaximumHopsReachedArgs.cs @@ -1,17 +1,17 @@ -namespace NETworkManager.Models.Network +using System; + +namespace NETworkManager.Models.Network; + +public class MaximumHopsReachedArgs : EventArgs { - public class MaximumHopsReachedArgs : System.EventArgs + public MaximumHopsReachedArgs() { - public int Hops { get; set; } - - public MaximumHopsReachedArgs() - { - - } + } - public MaximumHopsReachedArgs(int hops) - { - Hops = hops; - } + public MaximumHopsReachedArgs(int hops) + { + Hops = hops; } -} + + public int Hops { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/NeighborInfo.cs b/Source/NETworkManager.Models/Network/NeighborInfo.cs new file mode 100644 index 0000000000..a38e725f25 --- /dev/null +++ b/Source/NETworkManager.Models/Network/NeighborInfo.cs @@ -0,0 +1,63 @@ +using System.Net; +using System.Net.NetworkInformation; +using System.Net.Sockets; + +namespace NETworkManager.Models.Network; + +/// +/// Class to store information about an IP neighbor entry (IPv4 ARP / IPv6 NDP). +/// +public class NeighborInfo +{ + /// + /// Creates a new instance of with the given parameters. + /// + public NeighborInfo(IPAddress ipAddress, PhysicalAddress macAddress, bool isMulticast, int interfaceIndex, + string interfaceAlias, NeighborState state, AddressFamily addressFamily) + { + IPAddress = ipAddress; + MACAddress = macAddress; + IsMulticast = isMulticast; + InterfaceIndex = interfaceIndex; + InterfaceAlias = interfaceAlias; + State = state; + AddressFamily = addressFamily; + } + + /// + /// IP address of the neighbor entry (IPv4 or IPv6). + /// + public IPAddress IPAddress { get; set; } + + /// + /// Physical (link-layer) address of the neighbor entry. May be empty for + /// / entries. + /// + public PhysicalAddress MACAddress { get; set; } + + /// + /// Indicates whether the IP address is a multicast address. + /// + public bool IsMulticast { get; set; } + + /// + /// Index of the network interface this neighbor entry belongs to. + /// + public int InterfaceIndex { get; set; } + + /// + /// Human-readable name of the network interface (e.g. "Ethernet", "Wi-Fi"). + /// + public string InterfaceAlias { get; set; } + + /// + /// Reachability state of the neighbor entry. + /// + public NeighborState State { get; set; } + + /// + /// Address family ( for IPv4, + /// for IPv6). + /// + public AddressFamily AddressFamily { get; set; } +} diff --git a/Source/NETworkManager.Models/Network/NeighborState.cs b/Source/NETworkManager.Models/Network/NeighborState.cs new file mode 100644 index 0000000000..761e5339ad --- /dev/null +++ b/Source/NETworkManager.Models/Network/NeighborState.cs @@ -0,0 +1,17 @@ +namespace NETworkManager.Models.Network; + +/// +/// Reachability state of an IP neighbor entry. +/// Values match the State field of the MIB_IPNET_ROW2 structure +/// returned by GetIpNetTable2, so a direct cast is safe. +/// +public enum NeighborState +{ + Unreachable = 1, + Incomplete = 2, + Probe = 3, + Delay = 4, + Stale = 5, + Reachable = 6, + Permanent = 7 +} diff --git a/Source/NETworkManager.Models/Network/NeighborTable.cs b/Source/NETworkManager.Models/Network/NeighborTable.cs new file mode 100644 index 0000000000..620be079f0 --- /dev/null +++ b/Source/NETworkManager.Models/Network/NeighborTable.cs @@ -0,0 +1,411 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Management.Automation.Runspaces; +using System.Net; +using System.Net.NetworkInformation; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using System.Threading; +using System.Threading.Tasks; +using System.Linq; +using NETworkManager.Utilities; +using SMA = System.Management.Automation; +using log4net; + +namespace NETworkManager.Models.Network; + +/// +/// Provides static methods to read and modify the Windows IP neighbor table +/// (IPv4 ARP and IPv6 NDP). Read access uses the GetIpNetTable2 Win32 API. +/// Modifying operations (add/delete entries, clear table) run via PowerShell in a +/// shared that is lazily initialized on first use with the +/// required execution policy and the NetTCPIP module imported. A +/// serializes access so the runspace is never used +/// concurrently. Modifying operations require the application to run with elevated rights. +/// +public class NeighborTable +{ + #region Variables + + /// + /// The logger for this class. + /// + private static readonly ILog Log = LogManager.GetLogger(typeof(NeighborTable)); + + // Address family constants for SOCKADDR_INET / GetIpNetTable2. + private const ushort AF_UNSPEC = 0; + private const ushort AF_INET = 2; + private const ushort AF_INET6 = 23; + + // Maximum length of a physical address inside MIB_IPNET_ROW2. + private const int IF_MAX_PHYS_ADDRESS_LENGTH = 32; + + // Size of SOCKADDR_INET (matches sizeof(SOCKADDR_IN6) = 28). + private const int SOCKADDR_INET_SIZE = 28; + + /// + /// Mirror of the native MIB_IPNET_ROW2 structure. The first 28 bytes hold + /// a SOCKADDR_INET union; we read the address family from the first two + /// bytes and parse the IPv4 / IPv6 address from the union accordingly. + /// + [StructLayout(LayoutKind.Sequential, Pack = 8)] + private struct MIB_IPNET_ROW2 + { + [MarshalAs(UnmanagedType.ByValArray, SizeConst = SOCKADDR_INET_SIZE)] + public byte[] Address; + + public uint InterfaceIndex; + public ulong InterfaceLuid; + + [MarshalAs(UnmanagedType.ByValArray, SizeConst = IF_MAX_PHYS_ADDRESS_LENGTH)] + public byte[] PhysicalAddress; + + public uint PhysicalAddressLength; + public uint State; + public uint Flags; + public uint ReachabilityTime; + } + + /// Retrieves all entries from the IPv4/IPv6 neighbor cache. Returns 0 on success. + [DllImport("Iphlpapi.dll")] + private static extern uint GetIpNetTable2(ushort family, out IntPtr table); + + /// Frees a MIB table buffer allocated by GetIpNetTable2. + [DllImport("Iphlpapi.dll")] + private static extern void FreeMibTable(IntPtr memory); + + /// + /// Ensures that only one PowerShell pipeline runs on at a time. + /// + private static readonly SemaphoreSlim RunspaceLock = new(1, 1); + + /// Protects reads and writes to and . + private static readonly Lock InterfaceAliasCacheLock = new(); + + /// Cached result of ; until first use. + private static Dictionary _interfaceAliasCache; + + /// UTC time after which must be rebuilt. + private static DateTime _interfaceAliasCacheExpiry = DateTime.MinValue; + + /// How long the interface alias cache is considered fresh before being rebuilt (5 minutes). + private static readonly TimeSpan InterfaceAliasCacheDuration = TimeSpan.FromMinutes(5); + + /// + /// Lazily initialized PowerShell runspace. Created and configured on first access so that + /// read-only paths (e.g. MAC address lookup in IP Scanner) do not start a PowerShell + /// process unless a modifying operation is actually performed. + /// + private static readonly Lazy _sharedRunspace = new(() => + { + var runspace = RunspaceFactory.CreateRunspace(); + runspace.Open(); + + using var ps = SMA.PowerShell.Create(); + ps.Runspace = runspace; + ps.AddScript(@" +Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process +Import-Module NetTCPIP -ErrorAction Stop").Invoke(); + + return runspace; + }); + + /// Returns the shared runspace, initializing it on first access. + private static Runspace SharedRunspace => _sharedRunspace.Value; + + #endregion + + #region Methods + + /// + /// Returns all entries from the IPv4 and IPv6 neighbor cache asynchronously. + /// + public static Task> GetTableAsync() + { + return Task.Run(GetTable); + } + + /// + /// Returns a list of available network interfaces as index/name pairs, sorted by name. + /// Uses the cached alias map; see . + /// + public static Task>> GetInterfacesAsync() + { + return Task.Run(() => GetCachedInterfaceAliasMap() + .OrderBy(kv => kv.Value) + .ToList()); + } + + /// + /// Reads the full neighbor table via GetIpNetTable2 and returns it as a list + /// of objects. IPv4 entries with a virtual or broadcast MAC + /// are suppressed. + /// + private static List GetTable() + { + var list = new List(); + + var virtualMAC = new PhysicalAddress([0, 0, 0, 0, 0, 0]); + var broadcastMAC = new PhysicalAddress([255, 255, 255, 255, 255, 255]); + + var aliasMap = GetCachedInterfaceAliasMap(); + + var table = IntPtr.Zero; + + try + { + var result = GetIpNetTable2(AF_UNSPEC, out table); + + if (result != 0) + throw new Win32Exception((int)result); + + // First 4 bytes hold NumEntries; the array of MIB_IPNET_ROW2 starts after + // 4 bytes of padding (the row contains a ULONG64, requiring 8-byte alignment). + var numEntries = Marshal.ReadInt32(table); + var rowSize = Marshal.SizeOf(); + var arrayPtr = IntPtr.Add(table, 8); + + for (var i = 0; i < numEntries; i++) + { + var row = Marshal.PtrToStructure(IntPtr.Add(arrayPtr, i * rowSize)); + + var family = BitConverter.ToUInt16(row.Address, 0); + + IPAddress ipAddress; + AddressFamily addressFamily; + + switch (family) + { + case AF_INET: + { + // SOCKADDR_IN: family(2)+port(2)+addr(4)+zero(8) — addr at offset 4 + var addrBytes = new byte[4]; + Buffer.BlockCopy(row.Address, 4, addrBytes, 0, 4); + ipAddress = new IPAddress(addrBytes); + addressFamily = AddressFamily.InterNetwork; + break; + } + case AF_INET6: + { + // SOCKADDR_IN6: family(2)+port(2)+flowinfo(4)+addr(16)+scope_id(4) — addr at offset 8 + var addrBytes = new byte[16]; + Buffer.BlockCopy(row.Address, 8, addrBytes, 0, 16); + var scopeId = BitConverter.ToUInt32(row.Address, 24); + ipAddress = new IPAddress(addrBytes, scopeId); + addressFamily = AddressFamily.InterNetworkV6; + break; + } + default: + continue; + } + + var macLen = (int)row.PhysicalAddressLength; + + if (macLen is < 0 or > IF_MAX_PHYS_ADDRESS_LENGTH) + macLen = 0; + + var macBytes = new byte[macLen]; + + if (macLen > 0) + Buffer.BlockCopy(row.PhysicalAddress, 0, macBytes, 0, macLen); + + var macAddress = new PhysicalAddress(macBytes); + + // Suppress virtual/broadcast MAC for IPv4 to match legacy behavior. + if (addressFamily == AddressFamily.InterNetwork && + (macAddress.Equals(virtualMAC) || macAddress.Equals(broadcastMAC))) + continue; + + aliasMap.TryGetValue((int)row.InterfaceIndex, out var alias); + + list.Add(new NeighborInfo( + ipAddress, + macAddress, + addressFamily == AddressFamily.InterNetworkV6 + ? ipAddress.IsIPv6Multicast + : IPv4Address.IsMulticast(ipAddress), + (int)row.InterfaceIndex, + alias ?? string.Empty, + (NeighborState)row.State, + addressFamily)); + } + + return list; + } + finally + { + if (table != IntPtr.Zero) + FreeMibTable(table); + } + } + + /// + /// Returns the interface alias map, rebuilding it via + /// when the cache has expired or has not yet been populated. + /// + private static Dictionary GetCachedInterfaceAliasMap() + { + lock (InterfaceAliasCacheLock) + { + if (DateTime.UtcNow < _interfaceAliasCacheExpiry && _interfaceAliasCache != null) + return _interfaceAliasCache; + + _interfaceAliasCache = BuildInterfaceAliasMap(); + _interfaceAliasCacheExpiry = DateTime.UtcNow.Add(InterfaceAliasCacheDuration); + return _interfaceAliasCache; + } + } + + /// + /// Builds a dictionary that maps an interface index (IPv4 or IPv6) to the + /// human-readable interface name (e.g. "Ethernet", "Wi-Fi"). + /// + private static Dictionary BuildInterfaceAliasMap() + { + var map = new Dictionary(); + + foreach (var ni in System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()) + { + try + { + var props = ni.GetIPProperties(); + + if (ni.Supports(NetworkInterfaceComponent.IPv4)) + map[props.GetIPv4Properties().Index] = ni.Name; + + if (ni.Supports(NetworkInterfaceComponent.IPv6)) + map[props.GetIPv6Properties().Index] = ni.Name; + } + catch (Exception ex) + { + Log.Warn($"Failed to read interface properties for '{ni.Name}': {ex.Message}"); + } + } + + return map; + } + + /// + /// Returns the MAC address for by scanning the neighbor + /// cache, or when no entry exists. Supports both IPv4 and IPv6. + /// + public static string GetMACAddress(IPAddress ipAddress) + { + var entry = GetTable().FirstOrDefault(x => x.IPAddress.Equals(ipAddress)); + return entry?.MACAddress.ToString(); + } + + /// + /// Adds a permanent neighbor entry for with the given + /// by running New-NetNeighbor through the shared + /// PowerShell runspace. Requires the application to run with elevated rights. + /// + /// The IP address (IPv4 or IPv6) of the entry. + /// The link-layer address of the entry, separated with -. + /// The index of the network interface to add the entry on. + /// + /// Thrown when the PowerShell pipeline reports one or more errors. + /// + public static async Task AddEntryAsync(string ipAddress, string macAddress, int interfaceIndex) + { + await RunspaceLock.WaitAsync(); + try + { + await Task.Run(() => + { + using var ps = SMA.PowerShell.Create(); + ps.Runspace = SharedRunspace; + + ps.AddScript($@"New-NetNeighbor -InterfaceIndex {interfaceIndex} -IPAddress '{PowerShellHelper.EscapeSingleQuotes(ipAddress)}' -LinkLayerAddress '{PowerShellHelper.EscapeSingleQuotes(macAddress)}' -State Permanent -ErrorAction Stop | Out-Null"); + ps.Invoke(); + + ThrowOnError(ps); + }); + } + finally + { + RunspaceLock.Release(); + } + } + + /// + /// Removes the neighbor entry for by running + /// Remove-NetNeighbor through the shared PowerShell runspace. Requires the + /// application to run with elevated rights. + /// + /// The IP address of the entry to remove. + /// The index of the network interface the entry belongs to. + /// + /// Thrown when the PowerShell pipeline reports one or more errors. + /// + public static async Task DeleteEntryAsync(string ipAddress, int interfaceIndex) + { + await RunspaceLock.WaitAsync(); + try + { + await Task.Run(() => + { + using var ps = SMA.PowerShell.Create(); + ps.Runspace = SharedRunspace; + + ps.AddScript($@"Remove-NetNeighbor -InterfaceIndex {interfaceIndex} -IPAddress '{PowerShellHelper.EscapeSingleQuotes(ipAddress)}' -Confirm:$false -ErrorAction Stop | Out-Null"); + ps.Invoke(); + + ThrowOnError(ps); + }); + } + finally + { + RunspaceLock.Release(); + } + } + + /// + /// Clears all dynamic neighbor entries (IPv4 + IPv6) by piping + /// Get-NetNeighbor into Remove-NetNeighbor, excluding entries whose + /// state is Permanent. Requires the application to run with elevated rights. + /// + /// + /// Thrown when the PowerShell pipeline reports one or more errors. + /// + public static async Task DeleteTableAsync() + { + await RunspaceLock.WaitAsync(); + try + { + await Task.Run(() => + { + using var ps = SMA.PowerShell.Create(); + ps.Runspace = SharedRunspace; + + ps.AddScript(@"Get-NetNeighbor -ErrorAction SilentlyContinue | Where-Object { $_.State -ne 'Permanent' } | Remove-NetNeighbor -Confirm:$false -ErrorAction Stop | Out-Null"); + ps.Invoke(); + + ThrowOnError(ps); + }); + } + finally + { + RunspaceLock.Release(); + } + } + + /// + /// Throws an whose message is the joined PowerShell error + /// stream when reported one or more errors. + /// + private static void ThrowOnError(SMA.PowerShell ps) + { + if (ps.Streams.Error.Count == 0) + return; + + var message = string.Join(Environment.NewLine, ps.Streams.Error); + + Log.Warn($"PowerShell error: {message}"); + + throw new Exception(message); + } + + #endregion +} diff --git a/Source/NETworkManager.Models/Network/NetBIOSInfo.cs b/Source/NETworkManager.Models/Network/NetBIOSInfo.cs new file mode 100644 index 0000000000..2e97f3338d --- /dev/null +++ b/Source/NETworkManager.Models/Network/NetBIOSInfo.cs @@ -0,0 +1,74 @@ +using System.Net; + +namespace NETworkManager.Models.Network; + +/// +/// Class containing information about a result of a . +/// +public class NetBIOSInfo +{ + /// + /// Constructor for an unreachable host. + /// + public NetBIOSInfo(IPAddress ipAddress) + { + IsReachable = false; + IPAddress = ipAddress; + } + + /// + /// Constructor for a reachable host. + /// + /// IP address of the host. + /// Computer name of the host. + /// Username of the host. + /// Group name or domain of the host. + /// MAC address of the host. + /// Vendor of the host based on the MAC address. + public NetBIOSInfo(IPAddress ipAddress, string computerName, string userName, string groupName, string macAddress, + string vendor) + { + IsReachable = true; + IPAddress = ipAddress; + ComputerName = computerName; + UserName = userName; + GroupName = groupName; + MACAddress = macAddress; + Vendor = vendor; + } + + /// + /// Whether the host is reachable via NetBIOS. + /// + public bool IsReachable { get; set; } + + /// + /// IP address of the host. + /// + public IPAddress IPAddress { get; set; } + + /// + /// Computer name of the host. + /// + public string ComputerName { get; set; } + + /// + /// Username of the host. + /// + public string UserName { get; set; } + + /// + /// Group name or domain of the host. + /// + public string GroupName { get; set; } + + /// + /// MAC address of the host. + /// + public string MACAddress { get; set; } + + /// + /// Vendor of the host based on the MAC address. + /// + public string Vendor { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/NetBIOSResolver.cs b/Source/NETworkManager.Models/Network/NetBIOSResolver.cs new file mode 100644 index 0000000000..342de111fe --- /dev/null +++ b/Source/NETworkManager.Models/Network/NetBIOSResolver.cs @@ -0,0 +1,168 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using NETworkManager.Models.Lookup; +using NETworkManager.Utilities; + +namespace NETworkManager.Models.Network; + +/// +/// NetBIOS resolver written in C# based on the following sources: +/// https://web.archive.org/web/20100409111218/http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.aspx +/// https://github.com/angryip/ipscan (GPLv2) +/// +public static class NetBIOSResolver +{ + private const int NetBIOSUdpPort = 137; + + private const int ResponseTypePos = 47; + private const byte ResponseTypeNbstat = 33; + + private const int ResponseBaseLen = 57; + private const int ResponseNameLen = 15; + private const int ResponseBlockLen = 18; + + private const int GroupNameFlag = 128; + + private const int NameTypeDomain = 0x00; + private const int NameTypeMessenger = 0x03; + + private static readonly byte[] RequestData = + { + 0x80, 0x94, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x43, 0x4b, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x00, 0x00, 0x21, + 0x00, 0x01 + }; + + public static async Task ResolveAsync(IPAddress ipAddress, int timeout, + CancellationToken cancellationToken) + { + var udpClient = new UdpClient(); + udpClient.Client.ReceiveTimeout = timeout; + + var remoteEndPoint = new IPEndPoint(ipAddress, NetBIOSUdpPort); + + try + { + await udpClient.SendAsync(RequestData, RequestData.Length, remoteEndPoint); + + // ReSharper disable once MethodSupportsCancellation - cancellation is handled below by Task.WhenAny + var receiveTask = udpClient.ReceiveAsync(); + + if (!receiveTask.Wait(timeout, cancellationToken)) + return new NetBIOSInfo(ipAddress); + + var response = receiveTask.Result; + + if (response.Buffer.Length < ResponseBaseLen || response.Buffer[ResponseTypePos] != ResponseTypeNbstat) + return new NetBIOSInfo(ipAddress); // response was too short + + var count = response.Buffer[ResponseBaseLen - 1] & 0xFF; + + if (response.Buffer.Length < ResponseBaseLen + ResponseBlockLen * count) + return new NetBIOSInfo(ipAddress); // data was truncated or something is wrong + + var result = ExtractNames(response.Buffer, count); + + var vendor = string.Empty; + + // ReSharper disable once InvertIf - readability + if (!string.IsNullOrEmpty(result.MacAddress)) + { + // ReSharper disable once MethodHasAsyncOverload - Parent method is async + var info = OUILookup.LookupByMacAddress(result.MacAddress).FirstOrDefault(); + + if (info != null) + vendor = info.Vendor; + } + + return new NetBIOSInfo( + ipAddress, + result.ComputerName, + result.UserName, + result.GroupName, + MACAddressHelper.GetDefaultFormat(result.MacAddress), + vendor + ); + } + catch (Exception) + { + return new NetBIOSInfo(ipAddress); + } + finally + { + udpClient.Close(); + } + } + + private static (string ComputerName, string UserName, string GroupName, string MacAddress) ExtractNames( + byte[] response, int count) + { + // Computer name + var computerName = count > 0 ? Decode(response, 0) : string.Empty; + + // Group or domain name + var groupName = string.Empty; + + for (var i = 1; i < count; i++) + { + if (GetType(response, i) != NameTypeDomain || (GetFlag(response, i) & GroupNameFlag) <= 0) + continue; + + groupName = Decode(response, i); + + break; + } + + // User name + var userName = string.Empty; + + for (var i = count - 1; i > 0; i--) + { + if (GetType(response, i) != NameTypeMessenger) + continue; + + userName = Decode(response, i); + + break; + } + + // MAC address + var macAddress = + $"{GetByte(response, count, 0):X2}{GetByte(response, count, 1):X2}" + + $"{GetByte(response, count, 2):X2}{GetByte(response, count, 3):X2}" + + $"{GetByte(response, count, 4):X2}{GetByte(response, count, 5):X2}"; + + return (computerName, userName, groupName, macAddress); + } + + private static string Decode(byte[] response, int i) + { + return Encoding.ASCII.GetString(response, ResponseBaseLen + ResponseBlockLen * i, ResponseNameLen).Trim(); + } + + private static int GetByte(IReadOnlyList response, int i, int n) + { + return response[ResponseBaseLen + ResponseBlockLen * i + n] & 0xFF; + } + + private static int GetFlag(IReadOnlyList response, int i) + { + return response[ResponseBaseLen + ResponseBlockLen * i + ResponseNameLen + 1] & (0xFF + + (response[ResponseBaseLen + ResponseBlockLen * i + ResponseNameLen + 2] & 0xFF) * 0xFF); + } + + private static int GetType(IReadOnlyList response, int i) + { + return response[ResponseBaseLen + ResponseBlockLen * i + ResponseNameLen] & 0xFF; + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/NetworkInterface.cs b/Source/NETworkManager.Models/Network/NetworkInterface.cs index 8a45f065d4..ff8905bb83 100644 --- a/Source/NETworkManager.Models/Network/NetworkInterface.cs +++ b/Source/NETworkManager.Models/Network/NetworkInterface.cs @@ -1,318 +1,580 @@ -using Microsoft.Win32; -using NETworkManager.Utilities; -using System; +using System; using System.Collections.Generic; -using System.ComponentModel; using System.Linq; using System.Net; using System.Net.NetworkInformation; using System.Net.Sockets; using System.Threading.Tasks; - -namespace NETworkManager.Models.Network +using log4net; +using Microsoft.Win32; +using NETworkManager.Utilities; +using SMA = System.Management.Automation; + +namespace NETworkManager.Models.Network; + +/// +/// Provides static and instance methods for retrieving information about network interfaces, detecting local IP +/// addresses and gateways, and configuring network interface settings on the local machine. +/// +/// The NetworkInterface class offers both synchronous and asynchronous methods for enumerating network +/// interfaces, detecting routing and gateway information, and performing network configuration tasks such as setting IP +/// addresses, DNS servers, and flushing the DNS cache. Most configuration operations require administrative privileges. +/// Events are provided to notify when user-initiated cancellations occur, such as when a UAC prompt is dismissed. This +/// class is intended for use in applications that need to query or modify network interface settings +/// programmatically. +public sealed class NetworkInterface { - public class NetworkInterface + #region Variables + + /// + /// List of network interface name patterns to filter out virtual/filter adapters + /// introduced in .NET 9/10. These are typically not actual network interfaces but rather + /// drivers, filters, or extensions attached to real network interfaces. + /// See: https://github.com/dotnet/runtime/issues/122751 + /// + private static readonly ILog Log = LogManager.GetLogger(typeof(NetworkInterface)); + + private static readonly List NetworkInterfaceFilteredPatterns = + [ + "Hyper-V Virtual Switch Extension Filter", + "Hyper-V Virtual Switch Extension Adapter", + "WFP Native MAC Layer LightWeight Filter", + "Npcap Packet Driver (NPCAP)", + "QoS Packet Scheduler", + "WFP 802.3 MAC Layer LightWeight Filter", + "Ethernet (Kerneldebugger)", + "Filter Driver", + "WAN Miniport", + "Microsoft Wi-Fi Direct Virtual Adapter" + ]; + + #endregion + + #region Methods + + /// + /// Asynchronously retrieves a list of available network interfaces on the local machine. + /// + /// A task that represents the asynchronous operation. The task result contains a list of objects describing each detected network interface. + public static Task> GetNetworkInterfacesAsync() { - #region Events - public event EventHandler UserHasCanceled; + return Task.Run(GetNetworkInterfaces); + } - protected virtual void OnUserHasCanceled() - { - UserHasCanceled?.Invoke(this, EventArgs.Empty); - } - #endregion + /// + /// Retrieves a list of network interfaces on the local machine, including detailed information about each interface + /// such as addresses, gateways, and DHCP settings. + /// + /// Only Ethernet, Wireless80211, and proprietary virtual/internal interfaces are included. The + /// returned information includes both IPv4 and IPv6 details, as well as DHCP and DNS configuration where available. + /// This method may require appropriate permissions to access network configuration data. + /// A list of objects, each representing a network interface with its associated + /// properties. The list is empty if no matching interfaces are found. + public static List GetNetworkInterfaces() + { + List listNetworkInterfaceInfo = []; - #region Methods - public static Task> GetNetworkInterfacesAsync() - { - return Task.Run(() => GetNetworkInterfaces()); - } + // Query network profiles (Domain/Private/Public) for all connected interfaces via PowerShell. + // Keyed by InterfaceAlias which matches networkInterface.Name in the .NET API. + var profileByAlias = new Dictionary(StringComparer.OrdinalIgnoreCase); - public static List GetNetworkInterfaces() + try { - var listNetworkInterfaceInfo = new List(); + using var ps = SMA.PowerShell.Create(); + ps.AddScript("Get-NetConnectionProfile | Select-Object InterfaceAlias, NetworkCategory"); - foreach (var networkInterface in System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()) + foreach (var result in ps.Invoke()) { - // NetworkInterfaceType 53 is proprietary virtual/internal interface - // https://docs.microsoft.com/en-us/windows-hardware/drivers/network/ndis-interface-types - if (networkInterface.NetworkInterfaceType != NetworkInterfaceType.Ethernet && networkInterface.NetworkInterfaceType != NetworkInterfaceType.Wireless80211 && (int)networkInterface.NetworkInterfaceType != 53) - continue; + var alias = result.Properties["InterfaceAlias"]?.Value?.ToString(); + var category = result.Properties["NetworkCategory"]?.Value?.ToString(); - var listIPv4Address = new List>(); - var listIPv6AddressLinkLocal = new List(); - var listIPv6Address = new List(); - - var dhcpLeaseObtained = new DateTime(); - var dhcpLeaseExpires = new DateTime(); - - var ipProperties = networkInterface.GetIPProperties(); + if (string.IsNullOrEmpty(alias)) + continue; - foreach (var unicastIPAddrInfo in ipProperties.UnicastAddresses) + profileByAlias[alias] = category switch { - switch (unicastIPAddrInfo.Address.AddressFamily) - { - case AddressFamily.InterNetwork: - - listIPv4Address.Add(new Tuple(unicastIPAddrInfo.Address, unicastIPAddrInfo.IPv4Mask)); - dhcpLeaseExpires = (DateTime.UtcNow + TimeSpan.FromSeconds(unicastIPAddrInfo.AddressPreferredLifetime)).ToLocalTime(); - dhcpLeaseObtained = (DateTime.UtcNow + TimeSpan.FromSeconds(unicastIPAddrInfo.AddressValidLifetime) - TimeSpan.FromSeconds(unicastIPAddrInfo.DhcpLeaseLifetime)).ToLocalTime(); - break; - case AddressFamily.InterNetworkV6 when unicastIPAddrInfo.Address.IsIPv6LinkLocal: - listIPv6AddressLinkLocal.Add(unicastIPAddrInfo.Address); - break; - case AddressFamily.InterNetworkV6: - listIPv6Address.Add(unicastIPAddrInfo.Address); - break; - } - } - - var listIPv4Gateway = new List(); - var listIPv6Gateway = new List(); + "DomainAuthenticated" => NetworkProfile.Domain, + "Private" => NetworkProfile.Private, + "Public" => NetworkProfile.Public, + _ => NetworkProfile.NotConfigured + }; + } + } + catch (Exception ex) + { + Log.Warn("Failed to query network connection profiles via Get-NetConnectionProfile.", ex); + } - foreach (var gatewayIPAddrInfo in ipProperties.GatewayAddresses) + foreach (var networkInterface in System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()) + { + // NetworkInterfaceType 53 is proprietary virtual/internal interface + // https://docs.microsoft.com/en-us/windows-hardware/drivers/network/ndis-interface-types + if (networkInterface.NetworkInterfaceType != NetworkInterfaceType.Ethernet && + networkInterface.NetworkInterfaceType != NetworkInterfaceType.Wireless80211 && + (int)networkInterface.NetworkInterfaceType != 53) + continue; + + // Filter out virtual/filter adapters introduced in .NET 9/10 + // Check if the adapter name or description contains any filtered pattern + // See: https://github.com/dotnet/runtime/issues/122751 + if (NetworkInterfaceFilteredPatterns.Any(pattern => + networkInterface.Name.Contains(pattern) || + networkInterface.Description.Contains(pattern))) + continue; + + var listIPv4Address = new List>(); + var listIPv6AddressLinkLocal = new List(); + var listIPv6Address = new List(); + + var dhcpLeaseObtained = new DateTime(); + var dhcpLeaseExpires = new DateTime(); + + var ipProperties = networkInterface.GetIPProperties(); + + foreach (var unicastIPAddrInfo in ipProperties.UnicastAddresses) + { + switch (unicastIPAddrInfo.Address.AddressFamily) { - switch (gatewayIPAddrInfo.Address.AddressFamily) - { - case AddressFamily.InterNetwork: - listIPv4Gateway.Add(gatewayIPAddrInfo.Address); - break; - case AddressFamily.InterNetworkV6: - listIPv6Gateway.Add(gatewayIPAddrInfo.Address); - break; - } + case AddressFamily.InterNetwork: + + listIPv4Address.Add(new Tuple(unicastIPAddrInfo.Address, + unicastIPAddrInfo.IPv4Mask)); + dhcpLeaseExpires = + (DateTime.UtcNow + TimeSpan.FromSeconds(unicastIPAddrInfo.AddressPreferredLifetime)) + .ToLocalTime(); + dhcpLeaseObtained = + (DateTime.UtcNow + TimeSpan.FromSeconds(unicastIPAddrInfo.AddressValidLifetime) - + TimeSpan.FromSeconds(unicastIPAddrInfo.DhcpLeaseLifetime)).ToLocalTime(); + break; + case AddressFamily.InterNetworkV6 when unicastIPAddrInfo.Address.IsIPv6LinkLocal: + listIPv6AddressLinkLocal.Add(unicastIPAddrInfo.Address); + break; + case AddressFamily.InterNetworkV6: + listIPv6Address.Add(unicastIPAddrInfo.Address); + break; } + } - var listDhcpServer = new List(); + var listIPv4Gateway = new List(); + var listIPv6Gateway = new List(); - foreach (var dhcpServerIPAddress in ipProperties.DhcpServerAddresses) + foreach (var gatewayIPAddrInfo in ipProperties.GatewayAddresses) + { + switch (gatewayIPAddrInfo.Address.AddressFamily) { - if (dhcpServerIPAddress.AddressFamily == AddressFamily.InterNetwork) - listDhcpServer.Add(dhcpServerIPAddress); + case AddressFamily.InterNetwork: + listIPv4Gateway.Add(gatewayIPAddrInfo.Address); + break; + case AddressFamily.InterNetworkV6: + listIPv6Gateway.Add(gatewayIPAddrInfo.Address); + break; } + } - // Check if autoconfiguration for DNS is enabled (only via registry key) - var nameServerKey = Registry.LocalMachine.OpenSubKey($@"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{networkInterface.Id}"); - var dnsAutoconfigurationEnabled = nameServerKey?.GetValue("NameServer") != null && string.IsNullOrEmpty(nameServerKey.GetValue("NameServer").ToString()); + // Check if autoconfiguration for DNS is enabled (only possible via registry key) + var nameServerKey = + Registry.LocalMachine.OpenSubKey( + $@"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{networkInterface.Id}"); + var dnsAutoconfigurationEnabled = nameServerKey?.GetValue("NameServer") != null && + string.IsNullOrEmpty(nameServerKey.GetValue("NameServer")?.ToString()); - var listDNSServer = new List(); + // Check if IPv4 protocol is available + var ipv4ProtocolAvailable = true; + IPv4InterfaceProperties ipv4Properties = null; - foreach (var dnsServerIPAddress in ipProperties.DnsAddresses) - { - listDNSServer.Add(dnsServerIPAddress); - } + try + { + ipv4Properties = ipProperties.GetIPv4Properties(); + } + catch (NetworkInformationException) + { + ipv4ProtocolAvailable = false; + } - // Check if IPv4 protocol is available - var ipv4ProtocolAvailable = true; - IPv4InterfaceProperties ipv4Properties = null; + // Check if IPv6 protocol is available + var ipv6ProtocolAvailable = true; - try - { - ipv4Properties = ipProperties.GetIPv4Properties(); - } - catch (NetworkInformationException) - { - ipv4ProtocolAvailable = false; - } + try + { + ipProperties.GetIPv6Properties(); + } + catch (NetworkInformationException) + { + ipv6ProtocolAvailable = false; + } - // Check if IPv6 protocol is available - var ipv6ProtocolAvailable = true; - IPv6InterfaceProperties ipv6Properties = null; + listNetworkInterfaceInfo.Add(new NetworkInterfaceInfo + { + Id = networkInterface.Id, + Name = networkInterface.Name, + Description = networkInterface.Description, + Type = networkInterface.NetworkInterfaceType.ToString(), + PhysicalAddress = networkInterface.GetPhysicalAddress(), + Status = networkInterface.OperationalStatus, + IsOperational = networkInterface.OperationalStatus == OperationalStatus.Up, + Speed = networkInterface.Speed, + IPv4ProtocolAvailable = ipv4ProtocolAvailable, + IPv4Address = [.. listIPv4Address], + IPv4Gateway = [.. listIPv4Gateway], + DhcpEnabled = ipv4Properties is { IsDhcpEnabled: true }, + DhcpServer = [.. ipProperties.DhcpServerAddresses.Where(dhcpServerIPAddress => + dhcpServerIPAddress.AddressFamily == AddressFamily.InterNetwork)], + DhcpLeaseObtained = dhcpLeaseObtained, + DhcpLeaseExpires = dhcpLeaseExpires, + IPv6ProtocolAvailable = ipv6ProtocolAvailable, + IPv6AddressLinkLocal = [.. listIPv6AddressLinkLocal], + IPv6Address = [.. listIPv6Address], + IPv6Gateway = [.. listIPv6Gateway], + DNSAutoconfigurationEnabled = dnsAutoconfigurationEnabled, + DNSSuffix = ipProperties.DnsSuffix, + DNSServer = [.. ipProperties.DnsAddresses], + Profile = profileByAlias.GetValueOrDefault(networkInterface.Name, NetworkProfile.NotConfigured) + }); + } - try - { - ipv6Properties = ipProperties.GetIPv6Properties(); - } - catch (NetworkInformationException) - { - ipv6ProtocolAvailable = false; - } + return listNetworkInterfaceInfo; + } - listNetworkInterfaceInfo.Add(new NetworkInterfaceInfo - { - Id = networkInterface.Id, - Name = networkInterface.Name, - Description = networkInterface.Description, - Type = networkInterface.NetworkInterfaceType.ToString(), - PhysicalAddress = networkInterface.GetPhysicalAddress(), - Status = networkInterface.OperationalStatus, - IsOperational = networkInterface.OperationalStatus == OperationalStatus.Up, - Speed = networkInterface.Speed, - IPv4ProtocolAvailable = ipv4ProtocolAvailable, - IPv4Address = listIPv4Address.ToArray(), - IPv4Gateway = listIPv4Gateway.ToArray(), - DhcpEnabled = ipv4Properties != null && ipv4Properties.IsDhcpEnabled, - DhcpServer = listDhcpServer.ToArray(), - DhcpLeaseObtained = dhcpLeaseObtained, - DhcpLeaseExpires = dhcpLeaseExpires, - IPv6ProtocolAvailable = ipv6ProtocolAvailable, - IPv6AddressLinkLocal = listIPv6AddressLinkLocal.ToArray(), - IPv6Address = listIPv6Address.ToArray(), - IPv6Gateway = listIPv6Gateway.ToArray(), - DNSAutoconfigurationEnabled = dnsAutoconfigurationEnabled, - DNSSuffix = ipProperties.DnsSuffix, - DNSServer = listDNSServer.ToArray() - }); - } + /// + /// Asynchronously determines the local IP address that would be used to route traffic to the specified remote IP + /// address. + /// + /// This method is useful for identifying the local network interface that would be selected by + /// the system's routing table when communicating with a given remote address. The result may vary depending on the + /// current network configuration and routing rules. + /// The destination IP address for which to determine the corresponding local source IP address. Cannot be null. + /// A task that represents the asynchronous operation. The task result contains the local IP address that would be + /// used to reach the specified remote IP address. + public static Task DetectLocalIPAddressBasedOnRoutingAsync(IPAddress remoteIPAddress) + { + return Task.Run(() => DetectLocalIPAddressFromRouting(remoteIPAddress)); + } - return listNetworkInterfaceInfo; - } + /// + /// Determines the local IP address that would be used to route traffic to the specified remote IP address. + /// + /// This method creates a UDP socket to determine the local IP address selected by the system's + /// routing table for the given remote address. No data is sent over the network. This method may return null if the + /// routing information is unavailable or an error occurs. + /// The destination IP address for which to determine the local routing address. Must not be null. + /// An IPAddress representing the local address that would be used to reach the specified remote address; or null if + /// the local address cannot be determined. + private static IPAddress DetectLocalIPAddressFromRouting(IPAddress remoteIPAddress) + { + var isIPv4 = remoteIPAddress.AddressFamily == AddressFamily.InterNetwork; + + using var socket = new Socket(remoteIPAddress.AddressFamily, SocketType.Dgram, ProtocolType.Udp); - public static Task DetectLocalIPAddressBasedOnRoutingAsync(IPAddress remoteIPAddress) + // return null on error... + try { - return Task.Run(() => DetectLocalIPAddressBasedOnRouting(remoteIPAddress)); + socket.Bind(new IPEndPoint(isIPv4 ? IPAddress.Any : IPAddress.IPv6Any, 0)); + socket.Connect(new IPEndPoint(remoteIPAddress, 0)); + + if (socket.LocalEndPoint is IPEndPoint ipAddress) + return ipAddress.Address; } + catch (SocketException) { } - public static IPAddress DetectLocalIPAddressBasedOnRouting(IPAddress remoteIPAddress) - { - using (var socket = new Socket(remoteIPAddress.AddressFamily == AddressFamily.InterNetwork ? AddressFamily.InterNetwork : AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) - { - // return null on error... - try - { - socket.Bind(new IPEndPoint(IPAddress.Any, 0)); - socket.Connect(new IPEndPoint(remoteIPAddress, 0)); + return null; + } - if (socket.LocalEndPoint is IPEndPoint ipAddress) - return ipAddress.Address; - } - catch (SocketException) { } - } + /// + /// Asynchronously detects the local IP address associated with a network interface that matches the specified + /// address family. + /// + /// The address family to use when searching for a local IP address. Typically, use AddressFamily.InterNetwork for + /// IPv4 or AddressFamily.InterNetworkV6 for IPv6. + /// A task that represents the asynchronous operation. The task result contains the detected local IP address, or + /// null if no suitable address is found. + public static Task DetectLocalIPAddressFromNetworkInterfaceAsync(AddressFamily addressFamily) + { + return Task.Run(() => DetectLocalIPAddressFromNetworkInterface(addressFamily)); + } - return null; - } + /// + /// Detects and returns the first local IP address assigned to an operational network interface that matches the + /// specified address family. + /// + /// For IPv4, the method prefers non-link-local addresses but will return a link-local address if + /// no other is available. For IPv6, the method returns the first global or unique local address if present; + /// otherwise, it returns a link-local address if available. The returned address is selected from operational + /// network interfaces only. + /// The address family to search for. Specify for IPv4 addresses or for IPv6 addresses. + /// An representing the first detected local IP address for the specified address family, or + /// if no suitable address is found. + public static IPAddress DetectLocalIPAddressFromNetworkInterface(AddressFamily addressFamily) + { + // Filter operational network interfaces + var networkInterfaces = GetNetworkInterfaces() + .Where(x => x.IsOperational) + .ToList(); - public static Task DetectGatewayBasedOnLocalIPAddressAsync(IPAddress localIPAddress) - { - return Task.Run(() => DetectGatewayBasedOnLocalIPAddress(localIPAddress)); - } + var candidates = new List(); - public static IPAddress DetectGatewayBasedOnLocalIPAddress(IPAddress localIPAddress) + switch (addressFamily) { - foreach (var networkInterface in GetNetworkInterfaces()) + // IPv4 + case AddressFamily.InterNetwork: { - if (localIPAddress.AddressFamily == AddressFamily.InterNetwork) + foreach (var networkInterface in networkInterfaces) { - if (networkInterface.IPv4Address.Any(x => x.Item1.Equals(localIPAddress))) - { - return networkInterface.IPv4Gateway.FirstOrDefault(); - } + foreach (var ipAddress in networkInterface.IPv4Address) + candidates.Add(ipAddress.Item1); } - else if (localIPAddress.AddressFamily == AddressFamily.InterNetworkV6) - { - if (networkInterface.IPv6Address.Contains(localIPAddress)) - { - return networkInterface.IPv6Gateway.FirstOrDefault(); - } - } - else + + // Prefer non-link-local addresses + var nonLinkLocal = candidates.FirstOrDefault(x => { - throw new Exception("IPv4 or IPv6 address is required to detect the gateway."); - } + var bytes = x.GetAddressBytes(); + + return !(bytes[0] == 169 && bytes[1] == 254); + }); + + // Return first non-link-local or first candidate if none found (might be null - no addresses at all) + return nonLinkLocal ?? candidates.FirstOrDefault(); } + // IPv6 + case AddressFamily.InterNetworkV6: + { + // First try to get global or unique local addresses + foreach (var networkInterface in networkInterfaces) + candidates.AddRange(networkInterface.IPv6Address); - return null; - } + // Return first candidate if any found + if (candidates.Count != 0) + return candidates.First(); - public Task ConfigureNetworkInterfaceAsync(NetworkInterfaceConfig config) - { - return Task.Run(() => ConfigureNetworkInterface(config)); + // Fallback to link-local addresses + var firstWithLinkLocal = networkInterfaces + .FirstOrDefault(ni => ni.IPv6AddressLinkLocal.Length != 0); + + if (firstWithLinkLocal != null) + return firstWithLinkLocal.IPv6AddressLinkLocal.First(); + break; + } } - public void ConfigureNetworkInterface(NetworkInterfaceConfig config) - { - // IP - var command = @"netsh interface ipv4 set address name='" + config.Name + @"'"; - command += config.EnableStaticIPAddress ? @" source=static address=" + config.IPAddress + @" mask=" + config.Subnetmask + @" gateway=" + config.Gateway : @" source=dhcp"; + return null; + } - // DNS - command += @";netsh interface ipv4 set DNSservers name='" + config.Name + @"'"; - command += config.EnableStaticDNS ? @" source=static address=" + config.PrimaryDNSServer + @" register=primary validate=no" : @" source=dhcp"; - command += (config.EnableStaticDNS && !string.IsNullOrEmpty(config.SecondaryDNSServer)) ? @";netsh interface ipv4 add DNSservers name='" + config.Name + @"' address=" + config.SecondaryDNSServer + @" index=2 validate=no" : ""; + /// + /// Asynchronously detects the default gateway address associated with the specified local IP address. + /// + /// The local IP address for which to determine the corresponding default gateway. Cannot be null. + /// A task that represents the asynchronous operation. The task result contains the IP address of the detected + /// default gateway, or null if no gateway is found. + public static Task DetectGatewayFromLocalIPAddressAsync(IPAddress localIPAddress) + { + return Task.Run(() => DetectGatewayFromLocalIPAddress(localIPAddress)); + } - try - { - PowerShellHelper.ExecuteCommand(command, true); - } - catch (Win32Exception win32Ex) + /// + /// Attempts to determine the default gateway address associated with the specified local IP address. + /// + /// This method searches all available network interfaces to find one that has the specified + /// local IP address assigned. If found, it returns the first associated gateway address for that interface and + /// address family. Returns null if the local IP address is not assigned to any interface or if no gateway is + /// configured. + /// The local IP address for which to detect the corresponding gateway. Must be either an IPv4 or IPv6 address. + /// An IPAddress representing the default gateway for the specified local IP address, or null if no matching gateway + /// is found. + private static IPAddress DetectGatewayFromLocalIPAddress(IPAddress localIPAddress) + { + foreach (var networkInterface in GetNetworkInterfaces()) + { + switch (localIPAddress.AddressFamily) { - switch (win32Ex.NativeErrorCode) - { - case 1223: - OnUserHasCanceled(); - break; - default: - throw; - } + // IPv4 + case AddressFamily.InterNetwork when networkInterface.IPv4Address.Any(x => x.Item1.Equals(localIPAddress)): + return networkInterface.IPv4Gateway.FirstOrDefault(); + // IPv6 + case AddressFamily.InterNetworkV6 when networkInterface.IPv6Address.Contains(localIPAddress): + return networkInterface.IPv6Gateway.FirstOrDefault(); } } - public static Task FlushDnsAsync() - { - return Task.Run(() => FlushDns()); - } + return null; + } - public static void FlushDns() - { - const string command = @"ipconfig /flushdns"; + /// + /// Asynchronously applies the specified network interface configuration. + /// + /// The configuration settings to apply to the network interface. Cannot be null. + /// A task that represents the asynchronous operation. + public static Task ConfigureNetworkInterfaceAsync(NetworkInterfaceConfig config) + { + return Task.Run(() => ConfigureNetworkInterface(config)); + } - PowerShellHelper.ExecuteCommand(command); - } + /// + /// Configures the network interface according to the specified settings. + /// + /// Requires the application to be running with administrator privileges. + /// An object containing the configuration parameters for the network interface, including IP address, subnet mask, + /// gateway, and DNS server settings. Cannot be null. + private static void ConfigureNetworkInterface(NetworkInterfaceConfig config) + { + var name = PowerShellHelper.EscapeSingleQuotes(config.Name); + var commands = new List(); - public static Task ReleaseRenewAsync(IPConfigReleaseRenewMode mode) + // IP + if (config.EnableStaticIPAddress) + commands.Add($"& netsh interface ipv4 set address name='{name}' source=static address={config.IPAddress} mask={config.Subnetmask} gateway={config.Gateway}"); + else + commands.Add($"& netsh interface ipv4 set address name='{name}' source=dhcp"); + + // DNS + if (config.EnableStaticDNS) { - return Task.Run(() => ReleaseRenew(mode)); + commands.Add($"& netsh interface ipv4 set dnsservers name='{name}' source=static address={config.PrimaryDNSServer} register=primary validate=no"); + + if (!string.IsNullOrEmpty(config.SecondaryDNSServer)) + commands.Add($"& netsh interface ipv4 add dnsservers name='{name}' address={config.SecondaryDNSServer} index=2 validate=no"); } - - public static void ReleaseRenew(IPConfigReleaseRenewMode mode) + else { - if (mode == IPConfigReleaseRenewMode.ReleaseRenew || mode == IPConfigReleaseRenewMode.Release) - { - const string command = @"ipconfig /release"; + commands.Add($"& netsh interface ipv4 set dnsservers name='{name}' source=dhcp"); + } - PowerShellHelper.ExecuteCommand(command); - } + RunCommands(commands); + } - if (mode == IPConfigReleaseRenewMode.ReleaseRenew || mode == IPConfigReleaseRenewMode.Renew) - { - const string command = @"ipconfig /renew"; + /// + /// Asynchronously flushes the system DNS resolver cache. + /// + /// This method initiates the DNS cache flush operation on a background thread. The operation may + /// require elevated permissions depending on the system configuration. + /// A task that represents the asynchronous flush operation. + public static Task FlushDnsAsync() + { + return Task.Run(FlushDns); + } - PowerShellHelper.ExecuteCommand(command); - } - } + /// + /// Clears the local DNS resolver cache on the system. + /// + /// Requires the application to be running with administrator privileges. + private static void FlushDns() + { + RunCommands(["& ipconfig /flushdns"], checkExitCode: true); + } - public static Task AddIPAddressToNetworkInterfaceAsync(NetworkInterfaceConfig config) - { - return Task.Run(() => AddIPAddressToNetworkInterface(config)); - } + /// + /// Asynchronously releases and renews the IP configuration for the specified network adapter using the given mode. + /// + /// The release and renew operation mode to apply to the network adapter. + /// The name of the network adapter whose IP configuration will be released and renewed. Cannot be null or empty. + /// A task that represents the asynchronous release and renew operation. + public static Task ReleaseRenewAsync(IPConfigReleaseRenewMode mode, string adapterName) + { + return Task.Run(() => ReleaseRenew(mode, adapterName)); + } - public static void AddIPAddressToNetworkInterface(NetworkInterfaceConfig config) - { - var command = @"netsh interface ipv4 add address '" + config.Name + @"' " + config.IPAddress + @" " + config.Subnetmask; + /// + /// Releases and/or renews the IP configuration for the specified network adapter using the given mode. + /// + /// Requires the application to be running with administrator privileges. + /// A value that specifies which IP configuration operation to perform. + /// The name of the network adapter to target. Cannot be null or empty. + private static void ReleaseRenew(IPConfigReleaseRenewMode mode, string adapterName) + { + var name = PowerShellHelper.EscapeSingleQuotes(adapterName); + var commands = new List(); - PowerShellHelper.ExecuteCommand(command, true); - } + if (mode is IPConfigReleaseRenewMode.ReleaseRenew or IPConfigReleaseRenewMode.Release) + commands.Add($"& ipconfig /release '{name}'"); - public static Task RemoveIPAddressFromNetworkInterfaceAsync(NetworkInterfaceConfig config) - { - return Task.Run(() => RemoveIPAddressFromNetworkInterface(config)); - } + if (mode is IPConfigReleaseRenewMode.ReleaseRenew or IPConfigReleaseRenewMode.Renew) + commands.Add($"& ipconfig /renew '{name}'"); - public static void RemoveIPAddressFromNetworkInterface(NetworkInterfaceConfig config) - { - var command = @"netsh interface ipv4 delete address '" + config.Name + @"' " + config.IPAddress; + if (mode is IPConfigReleaseRenewMode.ReleaseRenew6 or IPConfigReleaseRenewMode.Release6) + commands.Add($"& ipconfig /release6 '{name}'"); - PowerShellHelper.ExecuteCommand(command, true); - } - #endregion + if (mode is IPConfigReleaseRenewMode.ReleaseRenew6 or IPConfigReleaseRenewMode.Renew6) + commands.Add($"& ipconfig /renew6 '{name}'"); - #region Enum - public enum IPConfigReleaseRenewMode - { - ReleaseRenew, - Release, - Renew - } - #endregion + RunCommands(commands, checkExitCode: true); + } + + /// + /// Asynchronously adds an IP address to the specified network interface using the provided configuration. + /// + /// The configuration settings that specify the network interface and IP address to add. Cannot be null. + /// A task that represents the asynchronous operation. + public static Task AddIPAddressToNetworkInterfaceAsync(NetworkInterfaceConfig config) + { + return Task.Run(() => AddIPAddressToNetworkInterface(config)); + } + + /// + /// Adds an IP address to the specified network interface using the provided configuration. + /// + /// Requires the application to be running with administrator privileges. + /// The network interface configuration containing the interface name, IP address, subnet mask, and DHCP/static + /// coexistence settings. Cannot be null. + private static void AddIPAddressToNetworkInterface(NetworkInterfaceConfig config) + { + var name = PowerShellHelper.EscapeSingleQuotes(config.Name); + var commands = new List(); + + if (config.EnableDhcpStaticIpCoexistence) + commands.Add($"& netsh interface ipv4 set interface interface='{name}' dhcpstaticipcoexistence=enabled"); + + commands.Add($"& netsh interface ipv4 add address '{name}' {config.IPAddress} {config.Subnetmask}"); + + RunCommands(commands); } -} + + /// + /// Asynchronously removes the IP address specified in the configuration from the associated network interface. + /// + /// The configuration object that specifies the network interface and IP address to remove. Cannot be null. + /// A task that represents the asynchronous remove operation. + public static Task RemoveIPAddressFromNetworkInterfaceAsync(NetworkInterfaceConfig config) + { + return Task.Run(() => RemoveIPAddressFromNetworkInterface(config)); + } + + /// + /// Removes the specified IP address from the given network interface configuration. + /// + /// Requires the application to be running with administrator privileges. + /// The network interface configuration containing the name of the interface and the IP address to remove. Cannot be + /// null. + private static void RemoveIPAddressFromNetworkInterface(NetworkInterfaceConfig config) + { + var name = PowerShellHelper.EscapeSingleQuotes(config.Name); + RunCommands([$"& netsh interface ipv4 delete address '{name}' {config.IPAddress}"]); + } + + /// + /// Runs one or more native commands via a PowerShell runspace. + /// When is , a non-zero + /// $LASTEXITCODE is treated as an error via Write-Error. + /// Use for netsh, whose exit codes are unreliable + /// for idempotent operations (e.g. returns 1 when already on DHCP). + /// + private static void RunCommands(IEnumerable commands, bool checkExitCode = false) + { + string script; + + if (checkExitCode) + script = string.Join(Environment.NewLine, commands.Select(cmd => + $"{cmd}{Environment.NewLine}if ($LASTEXITCODE -ne 0) {{ Write-Error \"Command failed with exit code $LASTEXITCODE\" }}")); + else + script = string.Join(Environment.NewLine, commands); + + using var ps = SMA.PowerShell.Create(); + ps.AddScript(script); + ps.Invoke(); + + if (checkExitCode && ps.HadErrors) + throw new Exception(string.Join("; ", ps.Streams.Error.Select(e => e.ToString()))); + } + + #endregion + +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/NetworkInterfaceConfig.cs b/Source/NETworkManager.Models/Network/NetworkInterfaceConfig.cs index a5bdb33a7a..56d9fe29b5 100644 --- a/Source/NETworkManager.Models/Network/NetworkInterfaceConfig.cs +++ b/Source/NETworkManager.Models/Network/NetworkInterfaceConfig.cs @@ -1,19 +1,49 @@ -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +public class NetworkInterfaceConfig { - public class NetworkInterfaceConfig - { - public string Name { get; set; } - public bool EnableStaticIPAddress { get; set; } - public string IPAddress { get; set; } - public string Subnetmask { get; set; } - public string Gateway { get; set; } - public bool EnableStaticDNS { get; set; } - public string PrimaryDNSServer { get; set; } - public string SecondaryDNSServer { get; set; } - - public NetworkInterfaceConfig() - { - - } - } -} + /// + /// Name of the network adapter to configure (e.g. "Ethernet", "Wi-Fi", "Local Area Connection") + /// + public string Name { get; init; } + + /// + /// Enable or disable static IP address configuration (otherwise DHCP is used). + /// + public bool EnableStaticIPAddress { get; init; } + + /// + /// Enable or disable DHCP static IP coexistence. + /// + public bool EnableDhcpStaticIpCoexistence { get; init; } + + /// + /// Static or additional IP address to configure. + /// + public string IPAddress { get; init; } + + /// + /// Subnet mask to use for the static or additional IP address configuration. + /// + public string Subnetmask { get; init; } + + /// + /// Gateway to use for the static IP address configuration. + /// + public string Gateway { get; init; } + + /// + /// Enable or disable static DNS server configuration (otherwise DHCP is used). + /// + public bool EnableStaticDNS { get; init; } + + /// + /// Primary DNS server to use for the static DNS server configuration. + /// + public string PrimaryDNSServer { get; init; } + + /// + /// Secondary DNS server to use for the static DNS server configuration. + /// + public string SecondaryDNSServer { get; init; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/NetworkInterfaceInfo.cs b/Source/NETworkManager.Models/Network/NetworkInterfaceInfo.cs index 95b8fabbc3..f5130f49a5 100644 --- a/Source/NETworkManager.Models/Network/NetworkInterfaceInfo.cs +++ b/Source/NETworkManager.Models/Network/NetworkInterfaceInfo.cs @@ -1,38 +1,127 @@ using System; -using System.Diagnostics.CodeAnalysis; using System.Net; using System.Net.NetworkInformation; -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +/// +/// Represents a network interface with all its properties. +/// +public class NetworkInterfaceInfo { - public class NetworkInterfaceInfo - { - public string Id { get; set; } - public string Name { get; set; } - public string Description { get; set; } - public string Type { get; set; } - public PhysicalAddress PhysicalAddress { get; set; } - public OperationalStatus Status { get; set; } - public bool IsOperational { get; set; } - public long Speed { get; set; } - public bool IPv4ProtocolAvailable { get; set; } - public Tuple[] IPv4Address {get;set;} - public IPAddress[] IPv4Gateway { get; set; } - public bool DhcpEnabled { get; set; } - public IPAddress[] DhcpServer { get; set; } - public DateTime DhcpLeaseObtained { get; set; } - public DateTime DhcpLeaseExpires { get; set; } - public bool IPv6ProtocolAvailable { get; set; } - public IPAddress[] IPv6Address { get; set; } - public IPAddress[] IPv6AddressLinkLocal { get; set; } - public IPAddress[] IPv6Gateway { get; set; } - public bool DNSAutoconfigurationEnabled { get; set; } - public string DNSSuffix { get; set; } - public IPAddress[] DNSServer { get; set; } - - public NetworkInterfaceInfo() - { - - } - } -} + /// + /// Identifier of the network adapter. + /// + public string Id { get; set; } + + /// + /// Name of the network adapter. + /// + public string Name { get; set; } + + /// + /// Description of the network adapter. + /// + public string Description { get; set; } + + /// + /// Type of the network adapter (e.g. Ethernet, Wireless). + /// + public string Type { get; set; } + + /// + /// Physical address (MAC) of the network adapter. + /// + public PhysicalAddress PhysicalAddress { get; set; } + + /// + /// Status of the network adapter. + /// + public OperationalStatus Status { get; set; } + + /// + /// Is the network adapter operational. + /// + public bool IsOperational { get; set; } + + /// + /// Speed of the network adapter. + /// + public long Speed { get; set; } + + /// + /// Is the IPv4 protocol available. + /// + public bool IPv4ProtocolAvailable { get; set; } + + /// + /// IPv4 address(es) with subnet mask. + /// + public Tuple[] IPv4Address { get; set; } + + /// + /// IPv4 gateway(s) + /// + public IPAddress[] IPv4Gateway { get; set; } + + /// + /// Is DHCP enabled. + /// + public bool DhcpEnabled { get; set; } + + /// + /// DHCP server(s). + /// + public IPAddress[] DhcpServer { get; set; } + + /// + /// Time when the DHCP lease was obtained. + /// + public DateTime DhcpLeaseObtained { get; set; } + + /// + /// Time when the DHCP lease expires. + /// + public DateTime DhcpLeaseExpires { get; set; } + + /// + /// Is the IPv6 protocol available. + /// + public bool IPv6ProtocolAvailable { get; set; } + + /// + /// IPv6 address(es). + /// + public IPAddress[] IPv6Address { get; set; } + + /// + /// IPv6 link-local address(es). + /// + public IPAddress[] IPv6AddressLinkLocal { get; set; } + + /// + /// IPv6 gateway(s). + /// + public IPAddress[] IPv6Gateway { get; set; } + + /// + /// Is DNS autoconfiguration enabled. + /// + public bool DNSAutoconfigurationEnabled { get; set; } + + /// + /// DNS suffix like "example.com". + /// + public string DNSSuffix { get; set; } + + /// + /// DNS server(s). + /// + public IPAddress[] DNSServer { get; set; } + + /// + /// Network category assigned by Windows (Domain, Private, Public). + /// when the interface has no active connection profile. + /// + public NetworkProfile Profile { get; set; } = NetworkProfile.NotConfigured; +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/NetworkProfiles.cs b/Source/NETworkManager.Models/Network/NetworkProfiles.cs new file mode 100644 index 0000000000..00dd4d9124 --- /dev/null +++ b/Source/NETworkManager.Models/Network/NetworkProfiles.cs @@ -0,0 +1,27 @@ +namespace NETworkManager.Models.Network; + +/// +/// Defines the network profile detected by Windows. +/// +public enum NetworkProfile +{ + /// + /// Network profile is not configured. + /// + NotConfigured = -1, + + /// + /// Network has an Active Directory (AD) controller and you are authenticated. + /// + Domain, + + /// + /// Network is private. Firewall will allow most connections. + /// + Private, + + /// + /// Network is public. Firewall will block most connections. + /// + Public +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/Ping.cs b/Source/NETworkManager.Models/Network/Ping.cs index a2777863e9..fc06a056d2 100644 --- a/Source/NETworkManager.Models/Network/Ping.cs +++ b/Source/NETworkManager.Models/Network/Ping.cs @@ -4,155 +4,213 @@ using System.Net.Sockets; using System.Threading; using System.Threading.Tasks; +using NETworkManager.Utilities; -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +/// +/// Provides functionality to ping a network host. +/// +public sealed class Ping { - public class Ping + #region Variables + + /// + /// The time in milliseconds to wait between ping requests. Default is 1000ms. + /// + public int WaitTime = 1000; + + /// + /// The time in milliseconds to wait for a reply. Default is 4000ms. + /// + public int Timeout = 4000; + + /// + /// The buffer to send with the ping request. Default is 32 bytes. + /// + public byte[] Buffer = new byte[32]; + + /// + /// The Time to Live (TTL) value for the ping request. Default is 64. + /// + public int TTL = 64; + + /// + /// Indicates whether to prevent fragmentation of the data packets. Default is true. + /// + public bool DontFragment = true; + + private const int ExceptionCancelCount = 3; + + #endregion + + #region Events + + /// + /// Occurs when a ping reply is received. + /// + public event EventHandler PingReceived; + + private void OnPingReceived(PingReceivedArgs e) { - #region Varaibles - public int WaitTime = 1000; - public int Timeout = 4000; - public byte[] Buffer = new byte[32]; - public int TTL = 64; - public bool DontFragment = true; - public int ExceptionCancelCount = 3; - public string Hostname = string.Empty; - #endregion - - #region Events - public event EventHandler PingReceived; - - protected virtual void OnPingReceived(PingReceivedArgs e) - { - PingReceived?.Invoke(this, e); - } + PingReceived?.Invoke(this, e); + } - public event EventHandler PingCompleted; + /// + /// Occurs when the ping operation is completed. + /// + public event EventHandler PingCompleted; - protected virtual void OnPingCompleted() - { - PingCompleted?.Invoke(this, EventArgs.Empty); - } + private void OnPingCompleted() + { + PingCompleted?.Invoke(this, EventArgs.Empty); + } - public event EventHandler PingException; + /// + /// Occurs when a ping exception is thrown. + /// + public event EventHandler PingException; - protected virtual void OnPingException(PingExceptionArgs e) - { - PingException?.Invoke(this, e); - } + private void OnPingException(PingExceptionArgs e) + { + PingException?.Invoke(this, e); + } - public event EventHandler UserHasCanceled; + /// + /// Occurs when the hostname is resolved. + /// + public event EventHandler HostnameResolved; - protected virtual void OnUserHasCanceled() - { - UserHasCanceled?.Invoke(this, EventArgs.Empty); - } - #endregion + private void OnHostnameResolved(HostnameArgs e) + { + HostnameResolved?.Invoke(this, e); + } + + /// + /// Occurs when the user has canceled the operation. + /// + public event EventHandler UserHasCanceled; + + private void OnUserHasCanceled() + { + UserHasCanceled?.Invoke(this, EventArgs.Empty); + } + + #endregion + + #region Methods - #region Methods - public void SendAsync(IPAddress ipAddress, CancellationToken cancellationToken) + /// + /// Sends ping requests to the specified IP address asynchronously. + /// + /// The IP address to ping. + /// The token to monitor for cancellation requests. + public void SendAsync(IPAddress ipAddress, CancellationToken cancellationToken) + { + Task.Run(async () => { - Task.Run(() => + var hostname = string.Empty; + + // Try to resolve PTR + var dnsResult = await DNSClient.GetInstance().ResolvePtrAsync(ipAddress); + + if (!dnsResult.HasError) + { + hostname = dnsResult.Value; + + OnHostnameResolved(new HostnameArgs(hostname)); + } + + var errorCount = 0; + + var options = new PingOptions { - var hostname = Hostname; + Ttl = TTL, + DontFragment = DontFragment + }; - // Try to resolve PTR - if (string.IsNullOrEmpty(hostname)) + using (var ping = new System.Net.NetworkInformation.Ping()) + { + do { try { - Task.Run(() => - { - hostname = Dns.GetHostEntryAsync(ipAddress).Result.HostName; - }, cancellationToken); - } - catch (SocketException) { } - } + // Get timestamp + var timestamp = DateTime.Now; - var pingTotal = 0; - var errorCount = 0; + // Send ping + var pingReply = ping.Send(ipAddress, Timeout, Buffer, options); - var options = new PingOptions - { - Ttl = TTL, - DontFragment = DontFragment - }; + // Reset the error count (if no exception was thrown) + errorCount = 0; - using (var ping = new System.Net.NetworkInformation.Ping()) - { - do - { - try + if (pingReply is not { Status: IPStatus.Success }) { - // Get timestamp - var timestamp = DateTime.Now; - - // Send ping - var pingReply = ping.Send(ipAddress, Timeout, Buffer, options); - - // Reset the error count (if no exception was thrown) - errorCount = 0; - - if (pingReply == null || pingReply.Status != IPStatus.Success) - { - if (pingReply != null && pingReply.Address == null) - OnPingReceived(new PingReceivedArgs(timestamp, ipAddress, hostname, pingReply.Status)); - else if (pingReply != null) - OnPingReceived(new PingReceivedArgs(timestamp, pingReply.Address, hostname, pingReply.Status)); - } - else - { - if (ipAddress.AddressFamily == AddressFamily.InterNetwork) - OnPingReceived(new PingReceivedArgs(timestamp, pingReply.Address, hostname, - pingReply.Buffer.Length, pingReply.RoundtripTime, pingReply.Options.Ttl, pingReply.Status)); - else - OnPingReceived(new PingReceivedArgs(timestamp, pingReply.Address, hostname, - pingReply.Buffer.Length, pingReply.RoundtripTime, pingReply.Status)); - } + if (pingReply != null) + OnPingReceived(new PingReceivedArgs( + new PingInfo(timestamp, pingReply.Address, hostname, pingReply.Status))); } - catch (PingException ex) + else { - errorCount++; + if (ipAddress.AddressFamily == AddressFamily.InterNetwork) + OnPingReceived(new PingReceivedArgs( + new PingInfo(timestamp, pingReply.Address, hostname, + pingReply.Buffer.Length, pingReply.RoundtripTime, pingReply.Options!.Ttl, + pingReply.Status))); + else + OnPingReceived(new PingReceivedArgs( + new PingInfo(timestamp, pingReply.Address, hostname, + pingReply.Buffer.Length, pingReply.RoundtripTime, pingReply.Status))); + } + } + catch (PingException ex) + { + errorCount++; - if (errorCount == ExceptionCancelCount) - { - OnPingException(new PingExceptionArgs(ex.Message, ex.InnerException)); + if (errorCount == ExceptionCancelCount) + { + OnPingException(new PingExceptionArgs(ex.Message, ex.InnerException)); - break; - } + break; } + } - pingTotal++; + // If ping is canceled... dont wait for example 5 seconds + for (var i = 0; i < WaitTime; i += 100) + { + Thread.Sleep(100); - // If ping is canceled... dont wait for example 5 seconds - for (var i = 0; i < WaitTime; i += 100) - { - Thread.Sleep(100); + if (cancellationToken.IsCancellationRequested) + break; + } + } while (!cancellationToken.IsCancellationRequested); + } + + if (cancellationToken.IsCancellationRequested) + OnUserHasCanceled(); + // Currently not used (ping will run until the user cancels it) + else + OnPingCompleted(); + }, cancellationToken); + } - if (cancellationToken.IsCancellationRequested) - break; - } - } while (!cancellationToken.IsCancellationRequested); - } - - if (cancellationToken.IsCancellationRequested) - OnUserHasCanceled(); - else - OnPingCompleted(); - }, cancellationToken); - } - - // Param: disableSpecialChar --> ExportManager --> "<" this char cannot be displayed in xml - public static string TimeToString(IPStatus status, long time, bool disableSpecialChar = false) - { - if (status != IPStatus.Success && status != IPStatus.TtlExpired) - return "-/-"; + // Param: disableSpecialChar --> ExportManager --> "<" this char cannot be displayed in xml + /// + /// Converts the ping time to a string representation. + /// + /// The IP status of the ping reply. + /// The round-trip time in milliseconds. + /// If true, disables special characters like '<' in the output (e.g., for XML export). + /// The formatted time string. + public static string TimeToString(IPStatus status, long time, bool disableSpecialChar = false) + { + if (status != IPStatus.Success && status != IPStatus.TtlExpired) + return "-/-"; - long.TryParse(time.ToString(), out var t); + _ = long.TryParse(time.ToString(), out var t); - return disableSpecialChar ? $"{t} ms" : t == 0 ? "<1 ms" : $"{t} ms"; - } - #endregion + return disableSpecialChar ? $"{t} ms" : t == 0 ? "<1 ms" : $"{t} ms"; } -} + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/PingExceptionArgs.cs b/Source/NETworkManager.Models/Network/PingExceptionArgs.cs index ca3004fa47..3783a1560a 100644 --- a/Source/NETworkManager.Models/Network/PingExceptionArgs.cs +++ b/Source/NETworkManager.Models/Network/PingExceptionArgs.cs @@ -1,16 +1,15 @@ using System; -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +public class PingExceptionArgs : EventArgs { - public class PingExceptionArgs : EventArgs + public PingExceptionArgs(string message, Exception innerException) { - public string Message { get; set; } - public Exception InnerException { get; set; } - - public PingExceptionArgs(string message, Exception innerException) - { - Message = message; - InnerException = innerException; - } + Message = message; + InnerException = innerException; } + + public string Message { get; set; } + public Exception InnerException { get; set; } } \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/PingInfo.cs b/Source/NETworkManager.Models/Network/PingInfo.cs index f5851bc6ac..4a15bf88cb 100644 --- a/Source/NETworkManager.Models/Network/PingInfo.cs +++ b/Source/NETworkManager.Models/Network/PingInfo.cs @@ -1,95 +1,166 @@ using System; using System.Net; using System.Net.NetworkInformation; +using System.Net.Sockets; -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +/// +/// Class containing the information of a ping. +/// +public class PingInfo { - public class PingInfo + /// + /// Creates a new instance of . + /// + public PingInfo() + { + } + + /// + /// Creates a new instance of with the specified parameters. + /// + /// Timestamp when the ping was sent. + /// IP address of the host. + /// IP status of the ping. + public PingInfo(DateTime timestamp, IPAddress ipAddress, IPStatus status) + { + Timestamp = timestamp; + IPAddress = ipAddress; + Status = status; + } + + /// + /// Creates a new instance of with the specified parameters. + /// + /// Timestamp when the ping was sent. + /// IP address of the host. + /// Hostname of the host. + /// IP status of the ping. + public PingInfo(DateTime timestamp, IPAddress ipAddress, string hostname, IPStatus status) { - public DateTime Timestamp { get; set; } - public IPAddress IPAddress { get; set; } - public string Hostname { get; set; } - public int Bytes { get; set; } - public long Time { get; set; } - public int TTL { get; set; } - public IPStatus Status { get; set; } - - public int IPAddressInt32 => IPAddress != null && IPAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork ? IPv4Address.ToInt32(IPAddress) : 0; - - public PingInfo() - { - - } - - public PingInfo(IPAddress ipAddress, IPStatus ipStatus) - { - IPAddress = ipAddress; - Status = ipStatus; - } - - public PingInfo(DateTime timestamp, IPAddress ipAddress, IPStatus status) - { - Timestamp = timestamp; - IPAddress = ipAddress; - Status = status; - } - - public PingInfo(DateTime timestamp, IPAddress ipAddress, int bytes, long time, IPStatus status) - { - Timestamp = timestamp; - IPAddress = ipAddress; - Bytes = bytes; - Time = time; - Status = status; - } - - public PingInfo(DateTime timestamp, IPAddress ipAddress, int bytes, long time, int ttl, IPStatus status) - { - Timestamp = timestamp; - IPAddress = ipAddress; - Bytes = bytes; - Time = time; - TTL = ttl; - Status = status; - } - - public PingInfo(DateTime timestamp, IPAddress ipAddress, string hostname, int bytes, long time, int ttl, IPStatus status) - { - Timestamp = timestamp; - IPAddress = ipAddress; - Hostname = hostname; - Bytes = bytes; - Time = time; - TTL = ttl; - Status = status; - } - - public PingInfo(DateTime timestamp, long time) - { - Timestamp = timestamp; - Time = time; - } - - public PingInfo(IPAddress ipAddress, int bytes, long time, int ttl, IPStatus status) - { - IPAddress = ipAddress; - Bytes = bytes; - Time = time; - TTL = ttl; - Status = status; - } - - public PingInfo(IPAddress ipAddress, int bytes, long time, IPStatus status) - { - IPAddress = ipAddress; - Bytes = bytes; - Time = time; - Status = status; - } - - public static PingInfo Parse(PingReceivedArgs e) - { - return new PingInfo(e.Timestamp, e.IPAddress, e.Hostname, e.Bytes, e.Time, e.TTL, e.Status); - } + Timestamp = timestamp; + IPAddress = ipAddress; + Hostname = hostname; + Status = status; } + + /// + /// Creates a new instance of with the specified parameters. + /// + /// Timestamp when the ping was sent. + /// IP address of the host. + /// Bytes used to send the icmp packet. + /// Time in milliseconds how long it took to receive a response. + /// IP status of the ping. + public PingInfo(DateTime timestamp, IPAddress ipAddress, int bytes, long time, IPStatus status) + { + Timestamp = timestamp; + IPAddress = ipAddress; + Bytes = bytes; + Time = time; + Status = status; + } + + /// + /// Creates a new instance of with the specified parameters. + /// + /// Timestamp when the ping was sent. + /// IP address of the host. + /// Hostname of the host. + /// Bytes used to send the icmp packet. + /// Time in milliseconds how long it took to receive a response. + /// IP status of the ping. + public PingInfo(DateTime timestamp, IPAddress ipAddress, string hostname, int bytes, long time, IPStatus status) + { + Timestamp = timestamp; + IPAddress = ipAddress; + Hostname = hostname; + Bytes = bytes; + Time = time; + Status = status; + } + + /// + /// Creates a new instance of with the specified parameters. + /// + /// Timestamp when the ping was sent. + /// IP address of the host. + /// Bytes used to send the icmp packet. + /// Time in milliseconds how long it took to receive a response. + /// Time to live of the icmp packet. + /// IP status of the ping. + public PingInfo(DateTime timestamp, IPAddress ipAddress, int bytes, long time, int ttl, IPStatus status) + { + Timestamp = timestamp; + IPAddress = ipAddress; + Bytes = bytes; + Time = time; + TTL = ttl; + Status = status; + } + + /// + /// Creates a new instance of with the specified parameters. + /// + /// Timestamp when the ping was sent. + /// IP address of the host. + /// Hostname of the host. + /// Bytes used to send the icmp packet. + /// Time in milliseconds how long it took to receive a response. + /// Time to live of the icmp packet. + /// IP status of the ping. + public PingInfo(DateTime timestamp, IPAddress ipAddress, string hostname, int bytes, long time, int ttl, + IPStatus status) + { + Timestamp = timestamp; + IPAddress = ipAddress; + Hostname = hostname; + Bytes = bytes; + Time = time; + TTL = ttl; + Status = status; + } + + /// + /// Timestamp when the ping was sent. + /// + public DateTime Timestamp { get; set; } + + /// + /// IP address of the host. + /// + public IPAddress IPAddress { get; set; } + + /// + /// Hostname of the host. + /// + public string Hostname { get; set; } + + /// + /// Bytes used to send the icmp packet. + /// + public int Bytes { get; set; } + + /// + /// Time in milliseconds how long it took to receive a response. + /// + public long Time { get; set; } + + /// + /// Time to live of the icmp packet. + /// + public int TTL { get; set; } + + /// + /// IP status of the ping. + /// + public IPStatus Status { get; set; } + + /// + /// IP address as an integer. + /// + public int IPAddressInt32 => IPAddress is { AddressFamily: AddressFamily.InterNetwork } + ? IPv4Address.ToInt32(IPAddress) + : 0; } \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/PingMonitorOptions.cs b/Source/NETworkManager.Models/Network/PingMonitorOptions.cs deleted file mode 100644 index c9e70b87bb..0000000000 --- a/Source/NETworkManager.Models/Network/PingMonitorOptions.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.Net; - -namespace NETworkManager.Models.Network -{ - public class PingMonitorOptions - { - public string Host { get; set; } - public IPAddress IPAddress { get; set; } - - public PingMonitorOptions(string host, IPAddress ipAddress) - { - Host = host; - IPAddress = ipAddress; - } - } -} diff --git a/Source/NETworkManager.Models/Network/PingReceivedArgs.cs b/Source/NETworkManager.Models/Network/PingReceivedArgs.cs index a715de922c..1506cb2c68 100644 --- a/Source/NETworkManager.Models/Network/PingReceivedArgs.cs +++ b/Source/NETworkManager.Models/Network/PingReceivedArgs.cs @@ -1,72 +1,23 @@ using System; -using System.Net; -using System.Net.NetworkInformation; -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +/// +/// Contains the information of a received ping in a . +/// +public class PingReceivedArgs : EventArgs { - public class PingReceivedArgs : EventArgs + /// + /// Creates a new instance of with the given . + /// + /// + public PingReceivedArgs(PingInfo args) { - public DateTime Timestamp { get; set; } - public IPAddress IPAddress { get; set; } - public string Hostname { get; set; } - public int Bytes { get; set; } - public long Time { get; set; } - public int TTL { get; set; } - public IPStatus Status { get; set; } - - public PingReceivedArgs(DateTime timestamp, IPAddress ipAddress, IPStatus status) - { - Timestamp = timestamp; - IPAddress = ipAddress; - Status = status; - } - - public PingReceivedArgs(DateTime timestamp, IPAddress ipAddress, string hostname, IPStatus status) - { - Timestamp = timestamp; - IPAddress = ipAddress; - Hostname = hostname; - Status = status; - } - - public PingReceivedArgs(DateTime timestamp, IPAddress ipAddress, int bytes, long time, IPStatus status) - { - Timestamp = timestamp; - IPAddress = ipAddress; - Bytes = bytes; - Time = time; - Status = status; - } - - public PingReceivedArgs(DateTime timestamp, IPAddress ipAddress, string hostname, int bytes, long time, IPStatus status) - { - Timestamp = timestamp; - IPAddress = ipAddress; - Hostname = hostname; - Bytes = bytes; - Time = time; - Status = status; - } - - public PingReceivedArgs(DateTime timestamp, IPAddress ipAddress, int bytes, long time, int ttl, IPStatus status) - { - Timestamp = timestamp; - IPAddress = ipAddress; - Bytes = bytes; - Time = time; - TTL = ttl; - Status = status; - } - - public PingReceivedArgs(DateTime timestamp, IPAddress ipAddress, string hostname, int bytes, long time, int ttl, IPStatus status) - { - Timestamp = timestamp; - IPAddress = ipAddress; - Hostname = hostname; - Bytes = bytes; - Time = time; - TTL = ttl; - Status = status; - } + Args = args; } + + /// + /// Ping information. + /// + public PingInfo Args { get; } } \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/PortInfo.cs b/Source/NETworkManager.Models/Network/PortInfo.cs index 5cacc9b152..30b89e4c3d 100644 --- a/Source/NETworkManager.Models/Network/PortInfo.cs +++ b/Source/NETworkManager.Models/Network/PortInfo.cs @@ -1,35 +1,37 @@ using NETworkManager.Models.Lookup; -using System.Net; -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +/// +/// Class representing a port info. +/// +public class PortInfo { - public partial class PortInfo + /// + /// Create an instance of with parameters. + /// + /// + /// + /// + public PortInfo(int port, PortLookupInfo lookupInfo, PortState state) { - public IPAddress IPAddress { get; set; } - public string Hostname { get; set; } - public int Port { get; set; } - public PortLookupInfo LookupInfo { get; set; } - public PortState State { get; set; } - - public int IPAddressInt32 => IPAddress != null && IPAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork ? IPv4Address.ToInt32(IPAddress) : 0; - - public PortInfo() - { + Port = port; + LookupInfo = lookupInfo; + State = state; + } - } + /// + /// Port number. + /// + public int Port { get; set; } - public PortInfo(IPAddress ipAddress, string hostname, int port, PortLookupInfo lookupInfo, PortState status) - { - IPAddress = ipAddress; - Hostname = hostname; - Port = port; - LookupInfo = lookupInfo; - State = status; - } + /// + /// Port lookup info like service and description. + /// + public PortLookupInfo LookupInfo { get; set; } - public static PortInfo Parse(PortScannedArgs e) - { - return new PortInfo(e.IPAddress, e.Hostname, e.Port, e.LookupInfo, e.State); - } - } -} + /// + /// State of the port. + /// + public PortState State { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/PortProfile.cs b/Source/NETworkManager.Models/Network/PortProfile.cs index 061d019936..606efa67d3 100644 --- a/Source/NETworkManager.Models/Network/PortProfile.cs +++ b/Source/NETworkManager.Models/Network/PortProfile.cs @@ -1,21 +1,24 @@ using System.Collections.Generic; -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +public static class PortProfile { - public static class PortProfile + public static List GetDefaultList() { - public static List DefaultList() + return new List { - return new List - { - new PortProfileInfo("Webserver", "80; 443"), - new PortProfileInfo("Remote access", "22; 23; 3389"), - new PortProfileInfo("Mailserver", "25; 110; 143; 465; 587; 993; 995"), - new PortProfileInfo("Filetransfer", "21; 22; 69; 989-990"), - new PortProfileInfo("DNS server", "53"), - new PortProfileInfo("Database", "1433-1434; 3306; 5432"), - new PortProfileInfo("SMB", "139; 445"), - }; - } + new("DNS (via TCP)", "53"), + new("NTP (via TCP)", "123"), + new("Webserver", "80; 443"), + new("Webserver (Other)", "80; 443; 8080; 8443"), + new("Remote access", "22; 23; 3389; 5900"), + new("Mailserver", "25; 110; 143; 465; 587; 993; 995"), + new("Filetransfer", "20-21; 22; 989-990; 2049"), + new("Database", "1433-1434; 1521; 1830; 3306; 5432"), + new("SMB", "139; 445"), + new("LDAP", "389; 636"), + new("HTTP proxy", "3128") + }; } } \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/PortProfileInfo.cs b/Source/NETworkManager.Models/Network/PortProfileInfo.cs index afbdcf5632..11f4641622 100644 --- a/Source/NETworkManager.Models/Network/PortProfileInfo.cs +++ b/Source/NETworkManager.Models/Network/PortProfileInfo.cs @@ -1,19 +1,17 @@ -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +public class PortProfileInfo { - public class PortProfileInfo + public PortProfileInfo() { - public string Name { get; set; } - public string Ports { get; set; } - - public PortProfileInfo() - { - - } + } - public PortProfileInfo(string name, string ports) - { - Name = name; - Ports = ports; - } + public PortProfileInfo(string name, string ports) + { + Name = name; + Ports = ports; } + + public string Name { get; set; } + public string Ports { get; set; } } \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/PortScannedArgs.cs b/Source/NETworkManager.Models/Network/PortScannedArgs.cs deleted file mode 100644 index 68e624990d..0000000000 --- a/Source/NETworkManager.Models/Network/PortScannedArgs.cs +++ /dev/null @@ -1,29 +0,0 @@ -using NETworkManager.Models.Lookup; -using System; -using System.Net; - -namespace NETworkManager.Models.Network -{ - public class PortScannedArgs : EventArgs - { - public IPAddress IPAddress { get; set; } - public string Hostname { get; set; } - public int Port { get; set; } - public PortLookupInfo LookupInfo { get; set; } - public PortState State { get; set; } - - public PortScannedArgs() - { - - } - - public PortScannedArgs(IPAddress ipAddres, string hostname, int port, PortLookupInfo lookupInfo, PortState state) - { - IPAddress = ipAddres; - Hostname = hostname; - Port = port; - LookupInfo = lookupInfo; - State = state; - } - } -} diff --git a/Source/NETworkManager.Models/Network/PortScanner.cs b/Source/NETworkManager.Models/Network/PortScanner.cs index da4020b684..372cd2d861 100644 --- a/Source/NETworkManager.Models/Network/PortScanner.cs +++ b/Source/NETworkManager.Models/Network/PortScanner.cs @@ -1,161 +1,158 @@ -using NETworkManager.Models.Lookup; -using System; -using System.Linq; +using System; +using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Threading; using System.Threading.Tasks; +using NETworkManager.Models.Lookup; +using NETworkManager.Utilities; -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +public sealed class PortScanner { - public class PortScanner + #region Constructor + + public PortScanner(PortScannerOptions options) { - #region Variables - private int _progressValue; + _options = options; + } - public bool ResolveHostname = true; - public int HostThreads = 5; - public int PortThreads = 100; - public bool ShowClosed = false; - public int Timeout = 4000; - #endregion + #endregion - #region Events - public event EventHandler PortScanned; + #region Variables - protected virtual void OnPortScanned(PortScannedArgs e) - { - PortScanned?.Invoke(this, e); - } + private int _progressValue; - public event EventHandler ScanComplete; + private readonly PortScannerOptions _options; - protected virtual void OnScanComplete() - { - ScanComplete?.Invoke(this, EventArgs.Empty); - } + #endregion - public event EventHandler ProgressChanged; + #region Events - public virtual void OnProgressChanged() - { - ProgressChanged?.Invoke(this, new ProgressChangedArgs(_progressValue)); - } + public event EventHandler PortScanned; - public event EventHandler UserHasCanceled; + private void OnPortScanned(PortScannerPortScannedArgs e) + { + PortScanned?.Invoke(this, e); + } - protected virtual void OnUserHasCanceled() - { - UserHasCanceled?.Invoke(this, EventArgs.Empty); - } - #endregion + public event EventHandler ScanComplete; - #region Methods - public void ScanAsync(IPAddress[] ipAddresses, int[] ports, CancellationToken cancellationToken) - { - _progressValue = 0; + private void OnScanComplete() + { + ScanComplete?.Invoke(this, EventArgs.Empty); + } - // Modify the ThreadPool for better performance - ThreadPool.GetMinThreads(out var workerThreads, out var completionPortThreads); - ThreadPool.SetMinThreads(workerThreads + HostThreads + PortThreads, completionPortThreads + HostThreads + PortThreads); + public event EventHandler ProgressChanged; - Task.Run(() => + private void OnProgressChanged() + { + ProgressChanged?.Invoke(this, new ProgressChangedArgs(_progressValue)); + } + + public event EventHandler UserHasCanceled; + + private void OnUserHasCanceled() + { + UserHasCanceled?.Invoke(this, EventArgs.Empty); + } + + #endregion + + #region Methods + + public void ScanAsync(IEnumerable<(IPAddress ipAddress, string hostname)> hosts, IEnumerable ports, + CancellationToken cancellationToken) + { + _progressValue = 0; + + Task.Run(() => + { + try { - try + var hostParallelOptions = new ParallelOptions { - var hostParallelOptions = new ParallelOptions - { - CancellationToken = cancellationToken, - MaxDegreeOfParallelism = HostThreads - }; + CancellationToken = cancellationToken, + MaxDegreeOfParallelism = _options.MaxHostThreads + }; - var portParallelOptions = new ParallelOptions - { - CancellationToken = cancellationToken, - MaxDegreeOfParallelism = PortThreads / HostThreads - }; - - Parallel.ForEach(ipAddresses, hostParallelOptions, ipAddress => + var portParallelOptions = new ParallelOptions + { + CancellationToken = cancellationToken, + MaxDegreeOfParallelism = _options.MaxPortThreads + }; + + Parallel.ForEach(hosts, hostParallelOptions, host => + { + // Resolve Hostname (PTR) + var hostname = string.Empty; + + if (_options.ResolveHostname) { - // Resolve Hostname (PTR) - var hostname = string.Empty; + // Don't use await in Parallel.ForEach, this will break + var dnsResolverTask = DNSClient.GetInstance().ResolvePtrAsync(host.ipAddress); + + // Wait for task inside a Parallel.Foreach + dnsResolverTask.Wait(cancellationToken); + + if (!dnsResolverTask.Result.HasError) + hostname = dnsResolverTask.Result.Value; + } - if (ResolveHostname) + // Check each port + Parallel.ForEach(ports, portParallelOptions, port => + { + // Test if port is open + using (var tcpClient = new TcpClient(host.ipAddress.AddressFamily)) { + var portState = PortState.None; + try { - Task.Run(() => { hostname = Dns.GetHostEntryAsync(ipAddress).Result.HostName; }, cancellationToken); + var task = tcpClient.ConnectAsync(host.ipAddress, port); + + if (task.Wait(_options.Timeout)) + portState = tcpClient.Connected ? PortState.Open : PortState.Closed; + else + portState = PortState.TimedOut; } - catch (SocketException) + catch { - + portState = PortState.Closed; } - } - - // Check each port - Parallel.ForEach(ports, portParallelOptions, port => - { - // Test if port is open - using (var tcpClient = ipAddress.AddressFamily == AddressFamily.InterNetworkV6 - ? new TcpClient(AddressFamily.InterNetworkV6) - : new TcpClient(AddressFamily.InterNetwork)) + finally { - var tcpClientConnection = tcpClient.BeginConnect(ipAddress, port, null, null); - - if (tcpClientConnection.AsyncWaitHandle.WaitOne(Timeout, false)) - { - try - { - tcpClient.EndConnect(tcpClientConnection); - - OnPortScanned(new PortScannedArgs(ipAddress, hostname, port, - PortLookup.Lookup(port) - .FirstOrDefault(x => x.Protocol == PortLookup.Protocol.Tcp), - PortState.Open)); - } - catch - { - if (ShowClosed) - OnPortScanned(new PortScannedArgs(ipAddress, hostname, port, - PortLookup.Lookup(port).FirstOrDefault(x => - x.Protocol == PortLookup.Protocol.Tcp), - PortState.Closed)); - } - } - else - { - if (ShowClosed) - OnPortScanned(new PortScannedArgs(ipAddress, hostname, port, - PortLookup.Lookup(port) - .FirstOrDefault(x => x.Protocol == PortLookup.Protocol.Tcp), - PortState.Closed)); - } + tcpClient.Close(); + + if (_options.ShowAllResults || portState == PortState.Open) + OnPortScanned(new PortScannerPortScannedArgs( + new PortScannerPortInfo(host.ipAddress, hostname, port, + PortLookup.LookupByPortAndProtocol(port), portState))); } + } - // Increase the progress - Interlocked.Increment(ref _progressValue); - OnProgressChanged(); - }); + IncreaseProgress(); }); + }); + } + catch (OperationCanceledException) + { + OnUserHasCanceled(); + } + finally + { + OnScanComplete(); + } + }, cancellationToken); + } - OnScanComplete(); - } - catch (OperationCanceledException) // If user has canceled - { - // Check if the scan is already complete... - if (ports.Length * ipAddresses.Length == _progressValue) - OnScanComplete(); - else - OnUserHasCanceled(); - } - finally - { - // Reset the ThreadPool to defaul - ThreadPool.GetMinThreads(out workerThreads, out completionPortThreads); - ThreadPool.SetMinThreads(workerThreads - HostThreads + PortThreads, completionPortThreads - HostThreads + PortThreads); - } - }, cancellationToken); - } - #endregion + private void IncreaseProgress() + { + // Increase the progress + Interlocked.Increment(ref _progressValue); + OnProgressChanged(); } -} + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/PortScannerOptions.cs b/Source/NETworkManager.Models/Network/PortScannerOptions.cs new file mode 100644 index 0000000000..2bbca684c2 --- /dev/null +++ b/Source/NETworkManager.Models/Network/PortScannerOptions.cs @@ -0,0 +1,50 @@ +namespace NETworkManager.Models.Network; + +/// +/// Class contains the options for the port scanner. +/// +public class PortScannerOptions +{ + /// + /// Create an instance of with parameters. + /// + /// Max cuncurrent threads for the host scan. + /// Max cuncurrent threads for the port scan of each host. + /// Timeout in ms after which the port is considered closed. + /// Resolve the hostname for an IP address. + /// Include closed ports in the result. + public PortScannerOptions(int maxHostThreads, int maxPortThreads, int timeout, bool resolveHostname, + bool showAllResults) + { + MaxHostThreads = maxHostThreads; + MaxPortThreads = maxPortThreads; + Timeout = timeout; + ResolveHostname = resolveHostname; + ShowAllResults = showAllResults; + } + + /// + /// Max cuncurrent threads for the host scan. + /// + public int MaxHostThreads { get; set; } + + /// + /// Max cuncurrent threads for the port scan of each host. + /// + public int MaxPortThreads { get; set; } + + /// + /// Timeout in ms after which the port is considered closed. + /// + public int Timeout { get; set; } + + /// + /// Resolve the hostname for an IP address. + /// + public bool ResolveHostname { get; set; } + + /// + /// Include closed ports in the result. + /// + public bool ShowAllResults { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/PortScannerPortInfo.cs b/Source/NETworkManager.Models/Network/PortScannerPortInfo.cs new file mode 100644 index 0000000000..2a4add8cbd --- /dev/null +++ b/Source/NETworkManager.Models/Network/PortScannerPortInfo.cs @@ -0,0 +1,40 @@ +using System.Net; +using NETworkManager.Models.Lookup; + +namespace NETworkManager.Models.Network; + +/// +/// Class containing information about a port in a . +/// +public class PortScannerPortInfo : PortInfo +{ + /// + /// Creates a new instance of with the specified parameters. + /// + /// IP address of the host. + /// Hostname of the host. + /// Port number. + /// Port lookup info like service and description. + /// State of the port. + public PortScannerPortInfo(IPAddress ipAddress, string hostname, int port, PortLookupInfo lookupInfo, + PortState status) : base(port, lookupInfo, status) + { + IPAddress = ipAddress; + Hostname = hostname; + } + + /// + /// IP address of the host. + /// + public IPAddress IPAddress { get; set; } + + /// + /// Hostname of the host. + /// + public string Hostname { get; set; } + + /// + /// Hostname (if available) or IP address of the host. + /// + public string HostAsString => string.IsNullOrEmpty(Hostname) ? IPAddress.ToString() : Hostname; +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/PortScannerPortScannedArgs.cs b/Source/NETworkManager.Models/Network/PortScannerPortScannedArgs.cs new file mode 100644 index 0000000000..64350418f2 --- /dev/null +++ b/Source/NETworkManager.Models/Network/PortScannerPortScannedArgs.cs @@ -0,0 +1,24 @@ +using System; + +namespace NETworkManager.Models.Network; + +/// +/// Contains the information of a scanned port in a . +/// +public class PortScannerPortScannedArgs : EventArgs +{ + /// + /// Creates a new instance of with the given + /// . + /// + /// Port scanner port information. + public PortScannerPortScannedArgs(PortScannerPortInfo args) + { + Args = args; + } + + /// + /// Port scanner port information. + /// + public PortScannerPortInfo Args { get; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/PortState.cs b/Source/NETworkManager.Models/Network/PortState.cs index 5294e74f4c..13117416a0 100644 --- a/Source/NETworkManager.Models/Network/PortState.cs +++ b/Source/NETworkManager.Models/Network/PortState.cs @@ -1,18 +1,27 @@ -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +/// +/// Represents the state of a port. +/// +public enum PortState { /// - /// Represents the state of a port. + /// Port is not defined. /// - public enum PortState - { - /// - /// Port is open. - /// - Open, + None, - /// - /// Port is closed. - /// - Closed - } -} + /// + /// Port is open. + /// + Open, + + /// + /// Port is closed. + /// + Closed, + + /// + /// Port has timed out. + /// + TimedOut +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/ProgressChangedArgs.cs b/Source/NETworkManager.Models/Network/ProgressChangedArgs.cs index 2f1eda2886..db2bfe1414 100644 --- a/Source/NETworkManager.Models/Network/ProgressChangedArgs.cs +++ b/Source/NETworkManager.Models/Network/ProgressChangedArgs.cs @@ -1,17 +1,17 @@ -namespace NETworkManager.Models.Network -{ - public class ProgressChangedArgs : System.EventArgs - { - public int Value { get; set; } +using System; - public ProgressChangedArgs() - { +namespace NETworkManager.Models.Network; - } +public class ProgressChangedArgs : EventArgs +{ + public ProgressChangedArgs() + { + } - public ProgressChangedArgs(int value) - { - Value = value; - } + public ProgressChangedArgs(int value) + { + Value = value; } -} + + public int Value { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/SNMP.cs b/Source/NETworkManager.Models/Network/SNMP.cs deleted file mode 100644 index 59e589ca9a..0000000000 --- a/Source/NETworkManager.Models/Network/SNMP.cs +++ /dev/null @@ -1,341 +0,0 @@ -using Lextm.SharpSnmpLib; -using Lextm.SharpSnmpLib.Messaging; -using Lextm.SharpSnmpLib.Security; -using NETworkManager.Utilities; -using System; -using System.Collections.Generic; -using System.Net; -using System.Security; -using System.Threading.Tasks; - -namespace NETworkManager.Models.Network -{ - public class SNMP - { - #region Variables - public int Port = 161; - public int Timeout = 10000; - #endregion - - #region Events - public event EventHandler Received; - - protected virtual void OnReceived(SNMPReceivedArgs e) - { - Received?.Invoke(this, e); - } - - public event EventHandler TimeoutReached; - - protected virtual void OnTimeoutReached() - { - TimeoutReached?.Invoke(this, EventArgs.Empty); - } - - public event EventHandler Error; - - protected virtual void OnError() - { - Error?.Invoke(this, EventArgs.Empty); - } - - public event EventHandler Complete; - - protected virtual void OnComplete() - { - Complete?.Invoke(this, EventArgs.Empty); - } - - public event EventHandler UserHasCanceled; - - protected virtual void OnUserHasCanceled() - { - UserHasCanceled?.Invoke(this, EventArgs.Empty); - } - #endregion - - #region Methods - public void GetV1V2CAsync(SNMPVersion version, IPAddress ipAddress, SecureString community, string oid) - { - Task.Run(() => - { - try - { - foreach (var result in Messenger.Get(version == SNMPVersion.V1 ? VersionCode.V1 : VersionCode.V2, new IPEndPoint(ipAddress, Port), new OctetString(SecureStringHelper.ConvertToString(community)), new List { new Variable(new ObjectIdentifier(oid)) }, Timeout)) - OnReceived(new SNMPReceivedArgs(result.Id, result.Data)); - - OnComplete(); - } - catch (Lextm.SharpSnmpLib.Messaging.TimeoutException) - { - OnTimeoutReached(); - } - catch (ErrorException) - { - OnError(); - } - }); - } - - public void WalkV1V2CAsync(SNMPVersion version, IPAddress ipAddress, SecureString community, string oid, WalkMode walkMode) - { - Task.Run(() => - { - try - { - IList results = new List(); - - Messenger.Walk(version == SNMPVersion.V1 ? VersionCode.V1 : VersionCode.V2, new IPEndPoint(ipAddress, Port), new OctetString(SecureStringHelper.ConvertToString(community)), new ObjectIdentifier(oid), results, Timeout, walkMode); - - foreach (var result in results) - OnReceived(new SNMPReceivedArgs(result.Id, result.Data)); - - OnComplete(); - } - catch (Lextm.SharpSnmpLib.Messaging.TimeoutException) - { - OnTimeoutReached(); - } - catch (ErrorException) - { - OnError(); - } - }); - } - - public void SetV1V2CAsync(SNMPVersion version, IPAddress ipAddress, SecureString communtiy, string oid, string data) - { - Task.Run(() => - { - try - { - Messenger.Set(version == SNMPVersion.V1 ? VersionCode.V1 : VersionCode.V2, new IPEndPoint(ipAddress, Port), new OctetString(SecureStringHelper.ConvertToString(communtiy)), new List { new Variable(new ObjectIdentifier(oid), new OctetString(data)) }, Timeout); - - OnComplete(); - } - catch (Lextm.SharpSnmpLib.Messaging.TimeoutException) - { - OnTimeoutReached(); - } - catch (ErrorException) - { - OnError(); - } - }); - } - - public void Getv3Async(IPAddress ipAddress, string oid, SNMPV3Security security, string username, SNMPV3AuthenticationProvider authProvider, SecureString auth, SNMPV3PrivacyProvider privProvider, SecureString priv) - { - Task.Run(() => - { - try - { - var ipEndpoint = new IPEndPoint(ipAddress, Port); - - // Discovery - var discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu); - var report = discovery.GetResponse(Timeout, ipEndpoint); - - IPrivacyProvider privacy; - - switch (security) - { - case SNMPV3Security.AuthPriv: - privacy = GetPrivacy(authProvider, SecureStringHelper.ConvertToString(auth), privProvider, SecureStringHelper.ConvertToString(priv)); - break; - // noAuthNoPriv - case SNMPV3Security.AuthNoPriv: - privacy = GetPrivacy(authProvider, SecureStringHelper.ConvertToString(auth)); - break; - default: - privacy = GetPrivacy(); - break; - } - - var request = new GetRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, new OctetString(username), new List { new Variable(new ObjectIdentifier(oid)) }, privacy, Messenger.MaxMessageSize, report); - var reply = request.GetResponse(Timeout, ipEndpoint); - - var result = reply.Pdu().Variables[0]; - - OnReceived(new SNMPReceivedArgs(result.Id, result.Data)); - - OnComplete(); - } - catch (Lextm.SharpSnmpLib.Messaging.TimeoutException) - { - OnTimeoutReached(); - } - catch (ErrorException) - { - OnError(); - } - }); - } - - public void WalkV3Async(IPAddress ipAddress, string oid, SNMPV3Security security, string username, SNMPV3AuthenticationProvider authProvider, SecureString auth, SNMPV3PrivacyProvider privProvider, SecureString priv, WalkMode walkMode) - { - Task.Run(() => - { - try - { - var ipEndpoint = new IPEndPoint(ipAddress, Port); - - // Discovery - var discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu); - var report = discovery.GetResponse(Timeout, ipEndpoint); - - IPrivacyProvider privacy; - - switch (security) - { - case SNMPV3Security.AuthPriv: - privacy = GetPrivacy(authProvider, SecureStringHelper.ConvertToString(auth), privProvider, SecureStringHelper.ConvertToString(priv)); - break; - // noAuthNoPriv - case SNMPV3Security.AuthNoPriv: - privacy = GetPrivacy(authProvider, SecureStringHelper.ConvertToString(auth)); - break; - default: - privacy = GetPrivacy(); - break; - } - - var results = new List(); - - Messenger.BulkWalk(VersionCode.V3, ipEndpoint, new OctetString(username), OctetString.Empty, new ObjectIdentifier(oid), results, Timeout, 10, walkMode, privacy, report); - - foreach (var result in results) - OnReceived(new SNMPReceivedArgs(result.Id, result.Data)); - - OnComplete(); - } - catch (Lextm.SharpSnmpLib.Messaging.TimeoutException) - { - OnTimeoutReached(); - } - catch (ErrorException) - { - OnError(); - } - }); - } - - public void SetV3Async(IPAddress ipAddress, string oid, SNMPV3Security security, string username, SNMPV3AuthenticationProvider authProvider, SecureString auth, SNMPV3PrivacyProvider privProvider, SecureString priv, string data) - { - Task.Run(() => - { - try - { - var ipEndpoint = new IPEndPoint(ipAddress, Port); - - // Discovery - var discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu); - var report = discovery.GetResponse(Timeout, ipEndpoint); - - IPrivacyProvider privacy; - - switch (security) - { - case SNMPV3Security.AuthPriv: - privacy = GetPrivacy(authProvider, SecureStringHelper.ConvertToString(auth), privProvider, SecureStringHelper.ConvertToString(priv)); - break; - // noAuthNoPriv - case SNMPV3Security.AuthNoPriv: - privacy = GetPrivacy(authProvider, SecureStringHelper.ConvertToString(auth)); - break; - default: - privacy = GetPrivacy(); - break; - } - - var request = new SetRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, new OctetString(username), OctetString.Empty, new List { new Variable(new ObjectIdentifier(oid), new OctetString(data)) }, privacy, Messenger.MaxMessageSize, report); - var reply = request.GetResponse(Timeout, ipEndpoint); - - OnComplete(); - } - catch (Lextm.SharpSnmpLib.Messaging.TimeoutException) - { - OnTimeoutReached(); - } - catch (ErrorException) - { - OnError(); - } - }); - } - - // noAuthNoPriv - private static IPrivacyProvider GetPrivacy() - { - return new DefaultPrivacyProvider(DefaultAuthenticationProvider.Instance); - } - - // authNoPriv - private static IPrivacyProvider GetPrivacy(SNMPV3AuthenticationProvider authProvider, string auth) - { - IAuthenticationProvider authenticationProvider; - - if (authProvider == SNMPV3AuthenticationProvider.MD5) - authenticationProvider = new MD5AuthenticationProvider(new OctetString(auth)); - else - authenticationProvider = new SHA1AuthenticationProvider(new OctetString(auth)); - - return new DefaultPrivacyProvider(authenticationProvider); - } - - // authPriv - private static IPrivacyProvider GetPrivacy(SNMPV3AuthenticationProvider authProvider, string auth, SNMPV3PrivacyProvider privProvider, string priv) - { - IAuthenticationProvider authenticationProvider; - - if (authProvider == SNMPV3AuthenticationProvider.MD5) - authenticationProvider = new MD5AuthenticationProvider(new OctetString(auth)); - else - authenticationProvider = new SHA1AuthenticationProvider(new OctetString(auth)); - - if (privProvider == SNMPV3PrivacyProvider.DES) - return new DESPrivacyProvider(new OctetString(priv), authenticationProvider); - - return new AESPrivacyProvider(new OctetString(priv), authenticationProvider); - } - #endregion - - #region Enum - public enum SNMPVersion - { - V1, - V2C, - V3 - } - - // Trap and Inform not implemented - public enum SNMPMode - { - Get, - Walk, - Set, - Trap, - Inform - } - - public enum SNMPV3Security - { - NoAuthNoPriv, - AuthNoPriv, - AuthPriv - } - - public enum SNMPV3AuthenticationProvider - { - MD5, - SHA1 - } - - public enum SNMPV3PrivacyProvider - { - DES, - AES - } - #endregion - } -} diff --git a/Source/NETworkManager.Models/Network/SNMPClient.cs b/Source/NETworkManager.Models/Network/SNMPClient.cs new file mode 100644 index 0000000000..cb42015148 --- /dev/null +++ b/Source/NETworkManager.Models/Network/SNMPClient.cs @@ -0,0 +1,659 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Net; +using System.Security; +using System.Threading.Tasks; +using Lextm.SharpSnmpLib; +using Lextm.SharpSnmpLib.Messaging; +using Lextm.SharpSnmpLib.Security; +using NETworkManager.Utilities; + +namespace NETworkManager.Models.Network; + +public sealed class SNMPClient +{ + #region Variables + + /// + /// List of known SNMPv3 error codes with their Object Identifier. + /// + private readonly Dictionary _snmpv3ErrorOIDs = new() + { + { new ObjectIdentifier("1.3.6.1.6.3.15.1.1.3.0"), SNMPV3ErrorCode.UnknownUserName }, + { new ObjectIdentifier("1.3.6.1.6.3.15.1.1.5.0"), SNMPV3ErrorCode.AuthenticationFailed } + }; + + #endregion + + #region Events + + /// + /// Event that is called when an SNMP message is received (Applies to Get and Walk). + /// + public event EventHandler Received; + + /// + /// Private method to call the event. + /// + /// SNMP received arguments. + private void OnReceived(SNMPReceivedArgs e) + { + Received?.Invoke(this, e); + } + + /// + /// Event that is called when the data is updated (Applies to Set). + /// + public event EventHandler DataUpdated; + + /// + /// Private method to call the event. + /// + private void OnDataUpdated() + { + DataUpdated?.Invoke(this, EventArgs.Empty); + } + + /// + /// Event that is called when an error occurs. + /// + public event EventHandler Error; + + /// + /// Private method to call the event. + /// + /// SNMP error arguments. + private void OnError(SNMPErrorArgs e) + { + Error?.Invoke(this, e); + } + + /// + /// Event that is called when the operation is complete. + /// + public event EventHandler Complete; + + /// + /// Private method to call the event. + /// + private void OnComplete() + { + Complete?.Invoke(this, EventArgs.Empty); + } + + /// + /// Event that is called when the operation is canceled. + /// + public event EventHandler Canceled; + + /// + /// Private method to call the event. + /// + private void OnCanceled() + { + Canceled?.Invoke(this, EventArgs.Empty); + } + + #endregion + + #region Methods + + /// + /// Get asynchronously the SNMP information of the given IP address (Applies to v1 and v2c). + /// + /// IP address of the host. + /// List of Object Identifiers. + /// SNMP options. + public void GetAsync(IPAddress ipAddress, List oids, SNMPOptions options) + { + Task.Run(async () => + { + try + { + var version = options.Version == SNMPVersion.V1 ? VersionCode.V1 : VersionCode.V2; + var ipEndPoint = new IPEndPoint(ipAddress, options.Port); + var community = new OctetString(SecureStringHelper.ConvertToString(options.Community)); + + var variables = oids.Select(oid => new Variable(new ObjectIdentifier(oid))).ToList(); + + var message = new GetRequestMessage(Messenger.NextMessageId, version, community, variables); + var response = await message.GetResponseAsync(ipEndPoint, options.CancellationToken); + + var pdu = response.Pdu(); + + // Check for errors + var errorCode = pdu.ErrorStatus.ToInt32(); + + if (errorCode != 0) + { + OnError(new SNMPErrorArgs(pdu.ErrorStatus.ToErrorCode())); + + return; + } + + // Return the SNMP information + foreach (var variable in pdu.Variables) + OnReceived(new SNMPReceivedArgs(new SNMPInfo(variable.Id, variable.Data))); + } + catch (OperationCanceledException) + { + OnCanceled(); + } + catch (Exception ex) + { + OnError(new SNMPErrorArgs(ex.Message)); + } + finally + { + OnComplete(); + } + }, options.CancellationToken); + } + + /// + /// Get asynchronously the SNMP information of the given IP address (Applies to v3). + /// + /// IP address of the host. + /// List of Object Identifiers. + /// SNMP options. + public void GetAsyncV3(IPAddress ipAddress, List oids, SNMPOptionsV3 options) + { + Task.Run(async () => + { + try + { + var ipEndpoint = new IPEndPoint(ipAddress, options.Port); + var username = new OctetString(options.Username); + + var variables = oids.Select(oid => new Variable(new ObjectIdentifier(oid))).ToList(); + + var discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu); + var report = await discovery.GetResponseAsync(ipEndpoint, options.CancellationToken); + + var privacy = GetPrivacyProvider(options); + + var message = new GetRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextMessageId, + username, OctetString.Empty, variables, privacy, Messenger.MaxMessageSize, report); + var response = await message.GetResponseAsync(ipEndpoint, options.CancellationToken); + + var pdu = response.Pdu(); + + // Check for errors + if (pdu.ErrorStatus.ToInt32() != 0) + { + OnError(new SNMPErrorArgs(pdu.ErrorStatus.ToErrorCode())); + + return; + } + + // Check if the response is a report message + if (response is ReportMessage) + // Check for SNMPv3 error codes + if (pdu.Variables.Count > 0 && + _snmpv3ErrorOIDs.TryGetValue(pdu.Variables[0].Id, out var errorCodeV3)) + { + OnError(new SNMPErrorArgs(errorCodeV3)); + + return; + } + + // Return the SNMP information + foreach (var variable in pdu.Variables) + OnReceived(new SNMPReceivedArgs(new SNMPInfo(variable.Id, variable.Data))); + } + catch (OperationCanceledException) + { + OnCanceled(); + } + catch (Exception ex) + { + OnError(new SNMPErrorArgs(ex.Message)); + } + finally + { + OnComplete(); + } + }, options.CancellationToken); + } + + /// + /// Walk asynchronously the SNMP information of the given IP address (Applies to v1 and v2c). + /// + /// IP address of the host. + /// Object Identifier to use for the walk. + /// SNMP options. + public void WalkAsync(IPAddress ipAddress, string oid, SNMPOptions options) + { + Task.Run(async () => + { + try + { + var version = options.Version == SNMPVersion.V1 ? VersionCode.V1 : VersionCode.V2; + var ipEndPoint = new IPEndPoint(ipAddress, options.Port); + var community = new OctetString(SecureStringHelper.ConvertToString(options.Community)); + var table = new ObjectIdentifier(oid); + + var results = new List(); + + var seed = new Variable(table); + var subTreeMask = string.Format(CultureInfo.InvariantCulture, "{0}.", table); + + do + { + var variables = new List + { + new(seed.Id) + }; + + var message = new GetNextRequestMessage(Messenger.NextRequestId, version, community, variables); + + var response = await message.GetResponseAsync(ipEndPoint, options.CancellationToken) + .ConfigureAwait(false); + + var pdu = response.Pdu(); + + // No more objects + if (pdu.ErrorStatus.ToErrorCode() == ErrorCode.NoSuchName) + break; + + // Check for errors + if (pdu.ErrorStatus.ToInt32() != 0) + { + OnError(new SNMPErrorArgs(pdu.ErrorStatus.ToErrorCode())); + + return; + } + + // Skip the first entry + if (pdu.Variables[0].Id == table) + continue; + + // End of MIB view + if (pdu.Variables[0].Data.TypeCode == SnmpType.EndOfMibView) + break; + + // Not in subtree + if (options.WalkMode == WalkMode.WithinSubtree && !pdu.Variables[0].Id.ToString() + .StartsWith(subTreeMask, StringComparison.Ordinal)) + break; + + results.Add(pdu.Variables[0]); + + // Next seed + seed = pdu.Variables[0]; + } while (!options.CancellationToken.IsCancellationRequested); + + foreach (var result in results) + OnReceived(new SNMPReceivedArgs(new SNMPInfo(result.Id, result.Data))); + } + catch (OperationCanceledException) + { + OnCanceled(); + } + catch (Exception ex) + { + OnError(new SNMPErrorArgs(ex.Message)); + } + finally + { + OnComplete(); + } + }, options.CancellationToken); + } + + /// + /// Walk asynchronously the SNMP information of the given IP address (Applies to v3). + /// + /// IP address of the host. + /// Object Identifier to use for the walk. + /// SNMP options. + public void WalkAsyncV3(IPAddress ipAddress, string oid, SNMPOptionsV3 options) + { + Task.Run(async () => + { + try + { + var ipEndPoint = new IPEndPoint(ipAddress, options.Port); + var username = new OctetString(options.Username); + var privacy = GetPrivacyProvider(options); + var table = new ObjectIdentifier(oid); + + var discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu); + var message = await discovery.GetResponseAsync(ipEndPoint, options.CancellationToken) as ISnmpMessage; + + var results = new List(); + + var seed = new Variable(table); + var subTreeMask = string.Format(CultureInfo.InvariantCulture, "{0}.", table); + + var breakLoop = false; + + do + { + var variables = new List + { + new(seed.Id) + }; + + var request = new GetBulkRequestMessage(VersionCode.V3, Messenger.NextMessageId, + Messenger.NextRequestId, username, OctetString.Empty, 0, 10, variables, privacy, + Messenger.MaxMessageSize, message); + + var response = await request.GetResponseAsync(ipEndPoint, options.CancellationToken) + .ConfigureAwait(false); + + var pdu = response.Pdu(); + + // Check for errors + if (pdu.ErrorStatus.ToInt32() != 0) + { + OnError(new SNMPErrorArgs(pdu.ErrorStatus.ToErrorCode())); + + return; + } + + // Check if the response is a report message + if (response is ReportMessage) + { + // Check for SNMPv3 error codes + if (pdu.Variables.Count > 0 && + _snmpv3ErrorOIDs.TryGetValue(pdu.Variables[0].Id, out var errorCodeV3)) + { + OnError(new SNMPErrorArgs(errorCodeV3)); + + return; + } + + // Check if the response is a not in time window message + var id = pdu.Variables[0].Id; + + if (id == Messenger.NotInTimeWindow) + { + // according to RFC 3414, send a second request to sync time. + request = new GetBulkRequestMessage(VersionCode.V3, Messenger.NextMessageId, + Messenger.NextRequestId, username, OctetString.Empty, 0, 10, variables, privacy, + Messenger.MaxMessageSize, response); + + response = await request.GetResponseAsync(ipEndPoint, options.CancellationToken) + .ConfigureAwait(false); + + pdu = response.Pdu(); + + // Check for errors + if (pdu.ErrorStatus.ToInt32() != 0) + { + OnError(new SNMPErrorArgs(pdu.ErrorStatus.ToErrorCode())); + + return; + } + + // Check if the response is a report message + if (response is ReportMessage) + // Check for SNMPv3 error codes + if (pdu.Variables.Count > 0 && + _snmpv3ErrorOIDs.TryGetValue(pdu.Variables[0].Id, out errorCodeV3)) + { + OnError(new SNMPErrorArgs(errorCodeV3)); + + return; + } + } + } + + // Validate the response and add the variables + foreach (var variable in pdu.Variables) + { + // End of MIB view + if (variable.Data.TypeCode == SnmpType.EndOfMibView) + breakLoop = true; + + // Not in subtree + if (options.WalkMode == WalkMode.WithinSubtree && + !variable.Id.ToString().StartsWith(subTreeMask, StringComparison.Ordinal)) + breakLoop = true; + + if (breakLoop) + break; + + results.Add(variable); + } + + if (breakLoop) + break; + + seed = pdu.Variables[^1]; + message = response; + } while (!options.CancellationToken.IsCancellationRequested); + + // Return the SNMP information + foreach (var result in results) + OnReceived(new SNMPReceivedArgs(new SNMPInfo(result.Id, result.Data))); + } + catch (OperationCanceledException) + { + OnCanceled(); + } + catch (Exception ex) + { + OnError(new SNMPErrorArgs(ex.Message)); + } + finally + { + OnComplete(); + } + }, options.CancellationToken); + } + + /// + /// Set asynchronously the SNMP information of the given IP address (Applies to v1 and v2c). + /// + /// IP address of the host. + /// Object Identifier to use for the set. + /// Data to set. + /// SNMP options. + public void SetAsync(IPAddress ipAddress, string oid, string data, SNMPOptions options) + { + Task.Run(async () => + { + try + { + var version = options.Version == SNMPVersion.V1 ? VersionCode.V1 : VersionCode.V2; + var ipEndPoint = new IPEndPoint(ipAddress, options.Port); + var community = new OctetString(SecureStringHelper.ConvertToString(options.Community)); + + var variables = new List { new(new ObjectIdentifier(oid), new OctetString(data)) }; + + var message = new SetRequestMessage(Messenger.NextMessageId, version, community, variables); + + var response = await message.GetResponseAsync(ipEndPoint, options.CancellationToken); + + var pdu = response.Pdu(); + + // Check for errors + if (pdu.ErrorStatus.ToInt32() != 0) + { + OnError(new SNMPErrorArgs(pdu.ErrorStatus.ToErrorCode())); + + return; + } + + OnDataUpdated(); + } + catch (OperationCanceledException) + { + OnCanceled(); + } + catch (Exception ex) + { + OnError(new SNMPErrorArgs(ex.Message)); + } + finally + { + OnComplete(); + } + }); + } + + /// + /// Set asynchronously the SNMP information of the given IP address (Applies to v3). + /// + /// IP address of the host. + /// Object Identifier to use for the set. + /// Data to set. + /// SNMP options. + public void SetAsyncV3(IPAddress ipAddress, string oid, string data, SNMPOptionsV3 options) + { + Task.Run(async () => + { + try + { + var ipEndpoint = new IPEndPoint(ipAddress, options.Port); + var username = new OctetString(options.Username); + var variables = new List { new(new ObjectIdentifier(oid), new OctetString(data)) }; + + var discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu); + var report = await discovery.GetResponseAsync(ipEndpoint, options.CancellationToken); + + var privacy = GetPrivacyProvider(options); + + var message = new SetRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextMessageId, + username, OctetString.Empty, variables, privacy, Messenger.MaxMessageSize, report); + + var response = await message.GetResponseAsync(ipEndpoint, options.CancellationToken); + + var pdu = response.Pdu(); + + // Check for errors + if (pdu.ErrorStatus.ToInt32() != 0) + { + OnError(new SNMPErrorArgs(pdu.ErrorStatus.ToErrorCode())); + + return; + } + + // Check if the response is a report message + if (response is ReportMessage) + // Check for SNMPv3 error codes + if (pdu.Variables.Count > 0 && + _snmpv3ErrorOIDs.TryGetValue(pdu.Variables[0].Id, out var errorCodeV3)) + { + OnError(new SNMPErrorArgs(errorCodeV3)); + + return; + } + + OnDataUpdated(); + } + catch (OperationCanceledException) + { + OnCanceled(); + } + catch (Exception ex) + { + OnError(new SNMPErrorArgs(ex.Message)); + } + finally + { + OnComplete(); + } + }, options.CancellationToken); + } + + /// + /// Create the privacy provider based on the given information's. + /// + /// SNMP v3 options. + /// Privacy provider. + private static IPrivacyProvider GetPrivacyProvider(SNMPOptionsV3 options) + { + return options.Security switch + { + // AuthPriv + SNMPV3Security.AuthPriv => GetPrivacyProvider(options.AuthProvider, options.Auth, options.PrivProvider, + options.Priv), + + // AuthNoPriv + SNMPV3Security.AuthNoPriv => GetPrivacyProvider(options.AuthProvider, options.Auth), + + // NoAuthNoPriv + _ => GetPrivacyProvider() + }; + } + + /// + /// Create the privacy provider with default values. + /// + /// Privacy provider. + private static IPrivacyProvider GetPrivacyProvider() + { + return new DefaultPrivacyProvider(DefaultAuthenticationProvider.Instance); + } + + /// + /// Create the privacy provider based on the given information's. + /// + /// Authentication provider to use. + /// Authentication password. + /// Privacy provider. + private static IPrivacyProvider GetPrivacyProvider(SNMPV3AuthenticationProvider authProvider, SecureString auth) + { + return new DefaultPrivacyProvider(GetAuthenticationProvider(authProvider, auth)); + } + + /// + /// Create the privacy provider based on the given information's. + /// + /// Authentication provider to use. + /// Authentication password. + /// Privacy provider to use. + /// Privacy password. + /// Privacy provider. + private static IPrivacyProvider GetPrivacyProvider(SNMPV3AuthenticationProvider authProvider, SecureString auth, + SNMPV3PrivacyProvider privProvider, SecureString priv) + { + var privPlain = SecureStringHelper.ConvertToString(priv); + + return privProvider switch + { +#pragma warning disable CS0618 // Allow outdated algorithms. We provide the function also for old devices. The user should use newer algorithms... + SNMPV3PrivacyProvider.DES => new DESPrivacyProvider(new OctetString(privPlain), + GetAuthenticationProvider(authProvider, auth)), +#pragma warning restore CS0618 // Allow outdated algorithms. We provide the function also for old devices. The user should use newer algorithms... + SNMPV3PrivacyProvider.AES => new AESPrivacyProvider(new OctetString(privPlain), + GetAuthenticationProvider(authProvider, auth)), + SNMPV3PrivacyProvider.AES192 => new AES192PrivacyProvider(new OctetString(privPlain), + GetAuthenticationProvider(authProvider, auth)), + SNMPV3PrivacyProvider.AES256 => new AES256PrivacyProvider(new OctetString(privPlain), + GetAuthenticationProvider(authProvider, auth)), + _ => null + }; + } + + /// + /// Create the authentication provider based on the given information's. + /// + /// Authentication provider to use. + /// Authentication password. + /// Authentication provider. + private static IAuthenticationProvider GetAuthenticationProvider(SNMPV3AuthenticationProvider authProvider, + SecureString auth) + { + var authPlain = SecureStringHelper.ConvertToString(auth); + + return authProvider switch + { +#pragma warning disable CS0618 // Allow outdated algorithms. We provide the function also for old devices. The user should use newer algorithms... + SNMPV3AuthenticationProvider.MD5 => new MD5AuthenticationProvider(new OctetString(authPlain)), + SNMPV3AuthenticationProvider.SHA1 => new SHA1AuthenticationProvider(new OctetString(authPlain)), +#pragma warning restore CS0618 // Allow outdated algorithms. We provide the function also for old devices. The user should use newer algorithms... + SNMPV3AuthenticationProvider.SHA256 => new SHA256AuthenticationProvider(new OctetString(authPlain)), + SNMPV3AuthenticationProvider.SHA384 => new SHA384AuthenticationProvider(new OctetString(authPlain)), + SNMPV3AuthenticationProvider.SHA512 => new SHA512AuthenticationProvider(new OctetString(authPlain)), + _ => null + }; + } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/SNMPErrorArgs.cs b/Source/NETworkManager.Models/Network/SNMPErrorArgs.cs new file mode 100644 index 0000000000..9f7303ba7c --- /dev/null +++ b/Source/NETworkManager.Models/Network/SNMPErrorArgs.cs @@ -0,0 +1,64 @@ +using System; +using Lextm.SharpSnmpLib; + +namespace NETworkManager.Models.Network; + +/// +/// Contains the information of an SNMP error in an . +/// +public class SNMPErrorArgs : EventArgs +{ + /// + /// Creates a new instance of with the given SNMP error message. + /// + /// SNMP error message + public SNMPErrorArgs(string errorMessage) + { + ErrorMessage = errorMessage; + } + + /// + /// Creates a new instance of with the given SNMP error code. + /// + /// SNMP error code. + public SNMPErrorArgs(ErrorCode errorCode) + { + IsErrorCode = true; + ErrorCode = errorCode; + } + + /// + /// Creates a new instance of with the given SNMPv3 error code. + /// + /// SNMPv3 error code. + public SNMPErrorArgs(SNMPV3ErrorCode errorCode) + { + IsErrorCodeV3 = true; + ErrorCodeV3 = errorCode; + } + + /// + /// SNMP error message. + /// + public string ErrorMessage { get; } + + /// + /// Indicate if the error code is an SNMP error code. + /// + public bool IsErrorCode { get; } + + /// + /// SNMP error code. + /// + public ErrorCode ErrorCode { get; } + + /// + /// Indicate if the error code is an SNMPv3 error code. + /// + public bool IsErrorCodeV3 { get; } + + /// + /// SNMPv3 error code. + /// + public SNMPV3ErrorCode ErrorCodeV3 { get; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/SNMPInfo.cs b/Source/NETworkManager.Models/Network/SNMPInfo.cs new file mode 100644 index 0000000000..3b3bd4857c --- /dev/null +++ b/Source/NETworkManager.Models/Network/SNMPInfo.cs @@ -0,0 +1,39 @@ +using Lextm.SharpSnmpLib; + +namespace NETworkManager.Models.Network; + +/// +/// Class containing SNMP information. +/// +public class SNMPInfo +{ + /// + /// Creates a new instance of with the specified parameters. + /// + /// Object identifier of the SNMP message. + /// Data of the SNMP message. + private SNMPInfo(string oid, string data) + { + OID = oid; + Data = data; + } + + /// + /// Creates a new instance of with the specified parameters. + /// + /// Object identifier of the SNMP message. + /// Data of the SNMP message. + public SNMPInfo(ObjectIdentifier oid, ISnmpData data) : this(oid.ToString(), data.ToString()) + { + } + + /// + /// Object identifier of the SNMP message. + /// + public string OID { get; set; } + + /// + /// Data of the SNMP message. + /// + public string Data { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/SNMPMode.cs b/Source/NETworkManager.Models/Network/SNMPMode.cs new file mode 100644 index 0000000000..109637a356 --- /dev/null +++ b/Source/NETworkManager.Models/Network/SNMPMode.cs @@ -0,0 +1,33 @@ +namespace NETworkManager.Models.Network; + +/// +/// Enum SNMP Mode. +/// Trap and Inform are not implemented yet. +/// +public enum SNMPMode +{ + /// + /// SNMP Get. + /// + Get, + + /// + /// SNMP Walk. + /// + Walk, + + /// + /// SNMP Set. + /// + Set, + + /// + /// SNMP Trap. + /// + Trap, + + /// + /// SNMP Inform. + /// + Inform +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/SNMPOIDProfile.cs b/Source/NETworkManager.Models/Network/SNMPOIDProfile.cs new file mode 100644 index 0000000000..5afa84ce66 --- /dev/null +++ b/Source/NETworkManager.Models/Network/SNMPOIDProfile.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; + +namespace NETworkManager.Models.Network; + +public static class SNMPOIDProfile +{ + /// + /// Get default list of SNMP MIB profiles. + /// + /// List of SNMP MIB profiles. + public static List GetDefaultList() + { + return new List + { + new("HOST-RESOURCES-MIB", ".1.3.6.1.2.1.25", SNMPMode.Walk), + new("IF-MIB", ".1.3.6.1.2.1.2", SNMPMode.Walk), + new("IP-MIB", ".1.3.6.1.2.1.4", SNMPMode.Walk), + new("Linux - Interface names", ".1.3.6.1.2.1.2.2.1.2", SNMPMode.Walk), + new("Linux - Load (1, 5, 15 min)", + ".1.3.6.1.4.1.2021.10.1.3.1; .1.3.6.1.4.1.2021.10.1.3.2; .1.3.6.1.4.1.2021.10.1.3.3", SNMPMode.Get), + new("Linux - Memory (Swap size, total RAM, RAM used, RAM free)", + ".1.3.6.1.4.1.2021.4.3.0; .1.3.6.1.4.1.2021.4.5.0; .1.3.6.1.4.1.2021.4.6.0; .1.3.6.1.4.1.2021.4.11.0", + SNMPMode.Get), + new("Linux - SNMP uptime", ".1.3.6.1.2.1.1.3.0", SNMPMode.Get), + new("Linux - System uptime", ".1.3.6.1.2.1.25.1.1.0", SNMPMode.Get), + new("SNMPv2-MIB (system)", ".1.3.6.1.2.1.1", SNMPMode.Walk), + new("TCP-MIB", ".1.3.6.1.2.1.6", SNMPMode.Walk), + new("UDP-MIB", ".1.3.6.1.2.1.7", SNMPMode.Walk), + new("UCD-SNMP-MIB", ".1.3.6.1.4.1.2021", SNMPMode.Walk) + }; + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/SNMPOIDProfileInfo.cs b/Source/NETworkManager.Models/Network/SNMPOIDProfileInfo.cs new file mode 100644 index 0000000000..cab3d2546d --- /dev/null +++ b/Source/NETworkManager.Models/Network/SNMPOIDProfileInfo.cs @@ -0,0 +1,41 @@ +namespace NETworkManager.Models.Network; + +/// +/// Class represents a SNMP MIB profile. +/// +public class SNMPOIDProfileInfo +{ + /// + /// Create new instance of the class. + /// + public SNMPOIDProfileInfo() + { + } + + /// + /// Create new instance of the class with parameters. + /// + /// Name of the profile. + /// Managed object identifier (MIB). + public SNMPOIDProfileInfo(string name, string oid, SNMPMode mode) + { + Name = name; + OID = oid; + Mode = mode; + } + + /// + /// Name of the profile. + /// + public string Name { get; set; } + + /// + /// Object identifier. + /// + public string OID { get; set; } + + /// + /// SNMP mode (Get, Walk, Set). + /// + public SNMPMode Mode { get; set; } = SNMPMode.Get; +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/SNMPOptions.cs b/Source/NETworkManager.Models/Network/SNMPOptions.cs new file mode 100644 index 0000000000..c8bb03a641 --- /dev/null +++ b/Source/NETworkManager.Models/Network/SNMPOptions.cs @@ -0,0 +1,30 @@ +using System.Security; +using System.Threading; +using Lextm.SharpSnmpLib.Messaging; + +namespace NETworkManager.Models.Network; + +/// +/// Class representing the SNMP options for version 1 and 2c. +/// +public class SNMPOptions : SNMPOptionsBase +{ + /// + /// Create an instance of with parameters. + /// + /// Community as for SNMPv1 or v2c. + /// SNMP version to use. + /// Port to use for SNMP requests. + /// Walk mode. + /// Cancellation token. + public SNMPOptions(SecureString community, SNMPVersion version, int port, WalkMode walkMode, + CancellationToken cancellationToken) : base(version, port, walkMode, cancellationToken) + { + Community = community; + } + + /// + /// Community as for SNMPv1 or v2c. + /// + public SecureString Community { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/SNMPOptionsBase.cs b/Source/NETworkManager.Models/Network/SNMPOptionsBase.cs new file mode 100644 index 0000000000..c37147d7b7 --- /dev/null +++ b/Source/NETworkManager.Models/Network/SNMPOptionsBase.cs @@ -0,0 +1,45 @@ +using System.Threading; +using Lextm.SharpSnmpLib.Messaging; + +namespace NETworkManager.Models.Network; + +/// +/// Class representing the SNMP options for all versions. +/// +public abstract class SNMPOptionsBase +{ + /// + /// Create an instance of with parameters. + /// + /// SNMP version to use. + /// Port to use for SNMP requests. + /// Walk mode. + /// Cancellation token. + public SNMPOptionsBase(SNMPVersion version, int port, WalkMode walkMode, CancellationToken cancellationToken) + { + Version = version; + Port = port; + WalkMode = walkMode; + CancellationToken = cancellationToken; + } + + /// + /// SNMP version to use. + /// + public SNMPVersion Version { get; set; } + + /// + /// Port to use for SNMP requests. + /// + public int Port { get; set; } + + /// + /// Walk mode. + /// + public WalkMode WalkMode { get; set; } + + /// + /// Cancellation token. + /// + public CancellationToken CancellationToken { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/SNMPOptionsV3.cs b/Source/NETworkManager.Models/Network/SNMPOptionsV3.cs new file mode 100644 index 0000000000..fa1f2d9475 --- /dev/null +++ b/Source/NETworkManager.Models/Network/SNMPOptionsV3.cs @@ -0,0 +1,65 @@ +using System.Security; +using System.Threading; +using Lextm.SharpSnmpLib.Messaging; + +namespace NETworkManager.Models.Network; + +/// +/// Class representing the SNMP options for version 3. +/// +public class SNMPOptionsV3 : SNMPOptionsBase +{ + /// + /// Create an instance of with parameters. + /// + /// SNMPv3 security (noAuthNoPriv, authNoPriv, authPriv). + /// Username for SNMPv3. + /// Authentication provider for SNMPv3. + /// Authentication password for SNMPv3. + /// Privacy provider for SNMPv3. + /// Privacy password for SNMPv3. + /// Port to use for SNMP requests. + /// Walk mode. + /// Cancellation token. + public SNMPOptionsV3(SNMPV3Security security, string username, SNMPV3AuthenticationProvider authProvider, + SecureString auth, SNMPV3PrivacyProvider privProvider, SecureString priv, int port, WalkMode walkMode, + CancellationToken cancellationToken) : base(SNMPVersion.V3, port, walkMode, cancellationToken) + { + Security = security; + Username = username; + AuthProvider = authProvider; + Auth = auth; + PrivProvider = privProvider; + Priv = priv; + } + + /// + /// SNMPv3 security (noAuthNoPriv, authNoPriv, authPriv). + /// + public SNMPV3Security Security { get; set; } + + /// + /// Username for SNMPv3. + /// + public string Username { get; set; } + + /// + /// Authentication provider for SNMPv3. + /// + public SNMPV3AuthenticationProvider AuthProvider { get; set; } + + /// + /// Authentication password for SNMPv3. + /// + public SecureString Auth { get; set; } + + /// + /// Privacy provider for SNMPv3. + /// + public SNMPV3PrivacyProvider PrivProvider { get; set; } + + /// + /// Privacy password for SNMPv3. + /// + public SecureString Priv { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/SNMPReceivedArgs.cs b/Source/NETworkManager.Models/Network/SNMPReceivedArgs.cs index bbde5de1af..9f8510acbc 100644 --- a/Source/NETworkManager.Models/Network/SNMPReceivedArgs.cs +++ b/Source/NETworkManager.Models/Network/SNMPReceivedArgs.cs @@ -1,21 +1,23 @@ -using Lextm.SharpSnmpLib; +using System; -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +/// +/// Contains the information of a received SNMP message in an . +/// +public class SNMPReceivedArgs : EventArgs { - public class SNMPReceivedArgs : System.EventArgs + /// + /// Creates a new instance of with the given . + /// + /// SNMP information. + public SNMPReceivedArgs(SNMPInfo args) { - public string OID { get; set; } - public string Data { get; set; } - - public SNMPReceivedArgs() - { - - } - - public SNMPReceivedArgs(ObjectIdentifier oid, ISnmpData data) - { - OID = oid.ToString(); - Data = data.ToString(); - } + Args = args; } -} + + /// + /// SNMP information. + /// + public SNMPInfo Args { get; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/SNMPReceivedInfo.cs b/Source/NETworkManager.Models/Network/SNMPReceivedInfo.cs deleted file mode 100644 index 808936db78..0000000000 --- a/Source/NETworkManager.Models/Network/SNMPReceivedInfo.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace NETworkManager.Models.Network -{ - public class SNMPReceivedInfo - { - public string OID { get; set; } - public string Data { get; set; } - - public SNMPReceivedInfo() - { - - } - - public SNMPReceivedInfo(string oid, string data) - { - OID = oid; - Data = data; - } - - public static SNMPReceivedInfo Parse(SNMPReceivedArgs e) - { - return new SNMPReceivedInfo(e.OID, e.Data); - } - } -} diff --git a/Source/NETworkManager.Models/Network/SNMPV3AuthenticationProvider.cs b/Source/NETworkManager.Models/Network/SNMPV3AuthenticationProvider.cs new file mode 100644 index 0000000000..dc81c3c418 --- /dev/null +++ b/Source/NETworkManager.Models/Network/SNMPV3AuthenticationProvider.cs @@ -0,0 +1,32 @@ +namespace NETworkManager.Models.Network; + +/// +/// Enum for the SNMP v3 authentication provider. +/// +public enum SNMPV3AuthenticationProvider +{ + /// + /// MD5. + /// + MD5, + + /// + /// SHA 1. + /// + SHA1, + + /// + /// SHA 256. + /// + SHA256, + + /// + /// SHA 384. + /// + SHA384, + + /// + /// SHA 512. + /// + SHA512 +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/SNMPV3ErrorCode.cs b/Source/NETworkManager.Models/Network/SNMPV3ErrorCode.cs new file mode 100644 index 0000000000..f186c8c35e --- /dev/null +++ b/Source/NETworkManager.Models/Network/SNMPV3ErrorCode.cs @@ -0,0 +1,22 @@ +namespace NETworkManager.Models.Network; + +/// +/// Enum for the SNMP v3 error codes. +/// +public enum SNMPV3ErrorCode +{ + /// + /// No error. + /// + None, + + /// + /// Unknown user name. + /// + UnknownUserName, + + /// + /// Authentication failed. + /// + AuthenticationFailed +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/SNMPV3PrivacyProvider.cs b/Source/NETworkManager.Models/Network/SNMPV3PrivacyProvider.cs new file mode 100644 index 0000000000..6b4e0e219a --- /dev/null +++ b/Source/NETworkManager.Models/Network/SNMPV3PrivacyProvider.cs @@ -0,0 +1,27 @@ +namespace NETworkManager.Models.Network; + +/// +/// Enum for the SNMP v3 privacy provider. +/// +public enum SNMPV3PrivacyProvider +{ + /// + /// DES. + /// + DES, + + /// + /// AES with 128 bit. + /// + AES, + + /// + /// AES with 192 bit. + /// + AES192, + + /// + /// AES with 256 bit. + /// + AES256 +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/SNMPV3Security.cs b/Source/NETworkManager.Models/Network/SNMPV3Security.cs new file mode 100644 index 0000000000..b1eba57d54 --- /dev/null +++ b/Source/NETworkManager.Models/Network/SNMPV3Security.cs @@ -0,0 +1,22 @@ +namespace NETworkManager.Models.Network; + +/// +/// Enum for the SNMP v3 security. +/// +public enum SNMPV3Security +{ + /// + /// No authentication and no privacy. + /// + NoAuthNoPriv, + + /// + /// Authentication and no privacy. + /// + AuthNoPriv, + + /// + /// Authentication and privacy. + /// + AuthPriv +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/SNMPVersion.cs b/Source/NETworkManager.Models/Network/SNMPVersion.cs new file mode 100644 index 0000000000..195035a2c8 --- /dev/null +++ b/Source/NETworkManager.Models/Network/SNMPVersion.cs @@ -0,0 +1,22 @@ +namespace NETworkManager.Models.Network; + +/// +/// Enum for the SNMP version. +/// +public enum SNMPVersion +{ + /// + /// Version 1. + /// + V1, + + /// + /// Version 2c. + /// + V2C, + + /// + /// Version 3. + /// + V3 +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/SNTPDateTime.cs b/Source/NETworkManager.Models/Network/SNTPDateTime.cs new file mode 100644 index 0000000000..c95f97c39c --- /dev/null +++ b/Source/NETworkManager.Models/Network/SNTPDateTime.cs @@ -0,0 +1,41 @@ +using System; + +namespace NETworkManager.Models.Network; + +/// +/// Class is used to store information's about SNTP date time. +/// +public class SNTPDateTime +{ + /// + /// Create an instance of . + /// + public SNTPDateTime() + { + } + + /// + /// Time when the requests started. + /// + public DateTime LocalStartTime { get; set; } + + /// + /// Time from the SNTP server. + /// + public DateTime NetworkTime { get; set; } + + /// + /// Time when the requests ended. + /// + public DateTime LocalEndTime { get; set; } + + /// + /// Round trip delay in milliseconds. + /// + public double RoundTripDelay { get; set; } + + /// + /// Offset to the local clock in seconds. + /// + public double Offset { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/SNTPLookup.cs b/Source/NETworkManager.Models/Network/SNTPLookup.cs new file mode 100644 index 0000000000..0a20f369c0 --- /dev/null +++ b/Source/NETworkManager.Models/Network/SNTPLookup.cs @@ -0,0 +1,147 @@ +using ControlzEx.Standard; +using NETworkManager.Utilities; +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Sockets; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace NETworkManager.Models.Network; + +public sealed class SNTPLookup +{ + #region Variables + + private readonly SNTPLookupSettings _settings; + + #endregion + + #region Constructor + + public SNTPLookup(SNTPLookupSettings settings) + { + _settings = settings; + } + + #endregion + + #region Events + + public event EventHandler ResultReceived; + + private void OnResultReceived(SNTPLookupResultArgs e) + { + ResultReceived?.Invoke(this, e); + } + + public event EventHandler LookupError; + + private void OnLookupError(SNTPLookupErrorArgs e) + { + LookupError?.Invoke(this, e); + } + + public event EventHandler LookupComplete; + + private void OnLookupComplete() + { + LookupComplete?.Invoke(this, EventArgs.Empty); + } + + #endregion + + #region Methods + + private static SNTPDateTime GetNetworkTimeRfc2030(IPEndPoint server, int timeout = 4000) + { + var ntpData = new byte[48]; // RFC 2030 + ntpData[0] = 0x1B; // LI = 0 (no warning), VN = 3 (IPv4 only), Mode = 3 (Client Mode) + + var udpClient = new UdpClient(server.AddressFamily); + udpClient.Client.SendTimeout = timeout; + udpClient.Client.ReceiveTimeout = timeout; + udpClient.Connect(server); + + var localStartTime = DateTime.Now.ToUniversalTime(); + + udpClient.Send(ntpData, ntpData.Length); + ntpData = udpClient.Receive(ref server); + + var localEndTime = DateTime.Now.ToUniversalTime(); + + udpClient.Close(); + + var intPart = ((ulong)ntpData[40] << 24) | ((ulong)ntpData[41] << 16) | ((ulong)ntpData[42] << 8) | ntpData[43]; + var fractionPart = ((ulong)ntpData[44] << 24) | ((ulong)ntpData[45] << 16) | ((ulong)ntpData[46] << 8) | + ntpData[47]; + + var milliseconds = intPart * 1000 + fractionPart * 1000 / 0x100000000L; + var networkTime = new DateTime(1900, 1, 1).AddMilliseconds((long)milliseconds); + + // Calculate local offset with local start/end time and network time in seconds + var roundTripDelayTicks = localEndTime.Ticks - localStartTime.Ticks; + var offsetInSeconds = (localStartTime.Ticks + roundTripDelayTicks / 2 - networkTime.Ticks) / + TimeSpan.TicksPerSecond; + + return new SNTPDateTime + { + LocalStartTime = localStartTime, + LocalEndTime = localEndTime, + NetworkTime = networkTime, + RoundTripDelay = roundTripDelayTicks / TimeSpan.TicksPerMillisecond, + Offset = offsetInSeconds + }; + } + + public void QueryAsync(IEnumerable servers, bool dnsResolveHostnamePreferIPv4) + { + Task.Run(() => + { + Parallel.ForEach(servers, server => + { + // NTP requires an IP address to connect to + IPAddress serverIP = null; + + if (RegexHelper.IPv4AddressRegex().IsMatch(server.Server) || + Regex.IsMatch(server.Server, RegexHelper.IPv6AddressRegex)) + { + serverIP = IPAddress.Parse(server.Server); + } + else + { + using var dnsResolverTask = + DNSClientHelper.ResolveAorAaaaAsync(server.Server, dnsResolveHostnamePreferIPv4); + + // Wait for task inside a Parallel.Foreach + dnsResolverTask.Wait(); + + if (dnsResolverTask.Result.HasError) + { + OnLookupError(new SNTPLookupErrorArgs( + DNSClientHelper.FormatDNSClientResultError(server.Server, dnsResolverTask.Result), true)); + return; + } + + serverIP = dnsResolverTask.Result.Value; + } + + try + { + var dateTime = GetNetworkTimeRfc2030(new IPEndPoint(serverIP, server.Port), _settings.Timeout); + + OnResultReceived(new SNTPLookupResultArgs( + new SNTPLookupInfo(server.Server, $"{serverIP}:{server.Port}", dateTime))); + } + catch (Exception ex) + { + OnLookupError(new SNTPLookupErrorArgs(server.Server, $"{serverIP}:{server.Port}", ex.Message)); + } + }); + + OnLookupComplete(); + }); + } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/SNTPLookupErrorArgs.cs b/Source/NETworkManager.Models/Network/SNTPLookupErrorArgs.cs new file mode 100644 index 0000000000..6a030829d5 --- /dev/null +++ b/Source/NETworkManager.Models/Network/SNTPLookupErrorArgs.cs @@ -0,0 +1,31 @@ +using System; + +namespace NETworkManager.Models.Network; + +public class SNTPLookupErrorArgs : EventArgs +{ + public SNTPLookupErrorArgs() + { + } + + public SNTPLookupErrorArgs(string errorMessage, bool isDNSError) + { + ErrorMessage = errorMessage; + IsDNSError = isDNSError; + } + + public SNTPLookupErrorArgs(string server, string ipEndPoint, string errorMessage) + { + Server = server; + IPEndPoint = ipEndPoint; + ErrorMessage = errorMessage; + } + + public string Server { get; set; } + + public string IPEndPoint { get; set; } + + public string ErrorMessage { get; set; } + + public bool IsDNSError { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/SNTPLookupInfo.cs b/Source/NETworkManager.Models/Network/SNTPLookupInfo.cs new file mode 100644 index 0000000000..c17120d5a8 --- /dev/null +++ b/Source/NETworkManager.Models/Network/SNTPLookupInfo.cs @@ -0,0 +1,32 @@ +namespace NETworkManager.Models.Network; + +public class SNTPLookupInfo +{ + /// + /// Creates a new instance of with the specified parameters. + /// + /// SNTP server used for the lookup. + /// IP endpoint (IP address:port) of the SNTP server. + /// Date and time received from the SNTP server. + public SNTPLookupInfo(string server, string ipEndPoint, SNTPDateTime dateTime) + { + Server = server; + IPEndPoint = ipEndPoint; + DateTime = dateTime; + } + + /// + /// SNTP server used for the lookup. + /// + public string Server { get; set; } + + /// + /// IP endpoint (IP address:port) of the SNTP server. + /// + public string IPEndPoint { get; set; } + + /// + /// Date and time received from the SNTP server. + /// + public SNTPDateTime DateTime { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/SNTPLookupResultArgs.cs b/Source/NETworkManager.Models/Network/SNTPLookupResultArgs.cs new file mode 100644 index 0000000000..9b955d0b9f --- /dev/null +++ b/Source/NETworkManager.Models/Network/SNTPLookupResultArgs.cs @@ -0,0 +1,23 @@ +using System; + +namespace NETworkManager.Models.Network; + +/// +/// Contains the information of an SNTP lookup result in a . +/// +public class SNTPLookupResultArgs : EventArgs +{ + /// + /// Creates a new instance of with the given . + /// + /// SNTP lookup information. + public SNTPLookupResultArgs(SNTPLookupInfo args) + { + Args = args; + } + + /// + /// SNTP lookup information. + /// + public SNTPLookupInfo Args { get; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/SNTPLookupSettings.cs b/Source/NETworkManager.Models/Network/SNTPLookupSettings.cs new file mode 100644 index 0000000000..3ffee5231d --- /dev/null +++ b/Source/NETworkManager.Models/Network/SNTPLookupSettings.cs @@ -0,0 +1,21 @@ +namespace NETworkManager.Models.Network; + +/// +/// Class contains the settings for the SNTP lookup. +/// +public class SNTPLookupSettings +{ + /// + /// Create an instance of with parameters. + /// + /// Timeout in milliseconds after which the request is aborted. + public SNTPLookupSettings(int timeout) + { + Timeout = timeout; + } + + /// + /// Timeout in milliseconds after which the request is aborted. + /// + public int Timeout { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/SNTPServer.cs b/Source/NETworkManager.Models/Network/SNTPServer.cs new file mode 100644 index 0000000000..985f36cf01 --- /dev/null +++ b/Source/NETworkManager.Models/Network/SNTPServer.cs @@ -0,0 +1,43 @@ +using System.Collections.Generic; + +namespace NETworkManager.Models.Network; + +/// +/// Class provides static informations about SNTP servers. +/// +public static class SNTPServer +{ + /// + /// Method will return a default list of common SNTP servers. + /// + /// GetDefaultList() + { + return new List + { + new("Cloudflare", new List + { + new("time.cloudflare.com", 123) + }), + new("Google Public NTP", new List + { + new("time.google.com", 123), + new("time1.google.com", 123), + new("time2.google.com", 123), + new("time3.google.com", 123), + new("time4.google.com", 123) + }), + new("Microsoft", new List + { + new("time.windows.com", 123) + }), + new("pool.ntp.org", new List + { + new("0.pool.ntp.org", 123), + new("1.pool.ntp.org", 123), + new("2.pool.ntp.org", 123), + new("3.pool.ntp.org", 123) + }) + }; + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/ServerConnectionInfo.cs b/Source/NETworkManager.Models/Network/ServerConnectionInfo.cs new file mode 100644 index 0000000000..0a402771a6 --- /dev/null +++ b/Source/NETworkManager.Models/Network/ServerConnectionInfo.cs @@ -0,0 +1,176 @@ +using NETworkManager.Utilities; +using System; +using System.Diagnostics; +using System.Linq; +using System.Net; +using System.Net.Sockets; + +namespace NETworkManager.Models.Network; + +/// +/// Class contains information about a server. +/// +public class ServerConnectionInfo +{ + /// + /// Create an instance of . + /// + public ServerConnectionInfo() + { + + } + + /// + /// Create an instance of with parameters. Default transport protocol is TCP. + /// + /// Server name or IP address. + /// Port used for the connection. + public ServerConnectionInfo(string server, int port) + { + Server = server; + Port = port; + TransportProtocol = TransportProtocol.Tcp; + } + + /// + /// Create an instance of with parameters. + /// + /// Server name or IP address. + /// Port used for the connection. + /// Transport protocol used for the connection. + public ServerConnectionInfo(string server, int port, TransportProtocol transportProtocol) + { + Server = server; + Port = port; + TransportProtocol = transportProtocol; + } + + /// + /// Server name or IP address. + /// + public string Server { get; set; } + + /// + /// Port used for the connection. + /// + public int Port { get; set; } + + /// + /// Transport protocol used for the connection. + /// + public TransportProtocol TransportProtocol { get; set; } + + /// + /// Tries to parse a server connection string into a object. + /// Supports formats: IPv4, IPv4:port, IPv6, [IPv6], [IPv6]:port, hostname, hostname:port + /// + /// Server connection string to parse. + /// Parsed object if successful. + /// Default port to use if not specified in input. + /// Transport protocol to set in the parsed object. + /// True if parsing was successful; otherwise, false. + public static bool TryParse(string input, out ServerConnectionInfo serverConnectionInfo, int defaultPort, TransportProtocol transportProtocol) + { + serverConnectionInfo = null; + + if (string.IsNullOrWhiteSpace(input)) + return false; + + input = input.Trim(); + + Debug.WriteLine("Parse server connection info input: " + input); + + // [IPv6]:Port + if (input.StartsWith('[') && input.Contains("]:")) + { + var endIndex = input.IndexOf("]:", StringComparison.Ordinal); + var ipPart = input[1..endIndex]; + var portPart = input[(endIndex + 2)..]; + + Debug.WriteLine($"IPv6 with port detected. IP: {ipPart}, Port: {portPart}"); + + if (IPAddress.TryParse(ipPart, out IPAddress ip) && ip.AddressFamily == AddressFamily.InterNetworkV6 && + int.TryParse(portPart, out int port) && port > 0 && port <= 65535) + { + serverConnectionInfo = new ServerConnectionInfo(ip.ToString(), port, transportProtocol); + return true; + } + } + // [IPv6] + else if (input.StartsWith('[') && input.EndsWith(']')) + { + var ipPart = input[1..^1]; + + Debug.WriteLine($"IPv6 without port detected. IP: {ipPart}"); + + if (IPAddress.TryParse(ipPart, out IPAddress ip) && ip.AddressFamily == AddressFamily.InterNetworkV6) + { + serverConnectionInfo = new ServerConnectionInfo(ip.ToString(), defaultPort, transportProtocol); + return true; + } + } + // IPv6 without brackets (contains multiple colons) + else if (input.Count(c => c == ':') > 1) + { + Debug.WriteLine($"IPv6 without port detected. IP: {input}"); + + if (IPAddress.TryParse(input, out IPAddress ip) && ip.AddressFamily == AddressFamily.InterNetworkV6) + { + serverConnectionInfo = new ServerConnectionInfo(ip.ToString(), defaultPort, transportProtocol); + return true; + } + } + // IPv4/hostname:port (single colon) + else if (input.Contains(':')) + { + var parts = input.Split([':'], 2); + + Debug.WriteLine($"IPv4 or Hostname with port detected. Host: {parts[0]}, Port: {parts[1]}"); + + if ((RegexHelper.IPv4AddressRegex().IsMatch(parts[0]) || RegexHelper.HostnameOrDomainRegex().IsMatch(parts[0])) && + int.TryParse(parts[1], out int port) && port > 0 && port <= 65535) + { + serverConnectionInfo = new ServerConnectionInfo(parts[0], port, transportProtocol); + return true; + } + } + // IPv4/hostname + else + { + if (RegexHelper.IPv4AddressRegex().IsMatch(input) || RegexHelper.HostnameOrDomainRegex().IsMatch(input)) + { + Debug.WriteLine($"IPv4 or Hostname without port detected. Host: {input}"); + + serverConnectionInfo = new ServerConnectionInfo(input, defaultPort, transportProtocol); + return true; + } + } + + return false; + } + + /// + /// Parses a server connection string into a object. + /// Supports formats: IPv4, IPv4:port, IPv6, [IPv6], [IPv6]:port, hostname, hostname:port + /// + /// Server connection string to parse. + /// Default port to use if not specified in input. + /// Parsed object. + /// Thrown when the input string is not in a valid format. + public static ServerConnectionInfo Parse(string input, int defaultPort, TransportProtocol transportProtocol) + { + if (TryParse(input, out var serverConnectionInfo, defaultPort, transportProtocol)) + return serverConnectionInfo; + + throw new FormatException($"Could not parse server connection info from input: {input}"); + } + + /// + /// Returns a string that represents the current object. + /// + /// Server:Port + public override string ToString() + { + return $"{Server}:{Port}"; + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/ServerConnectionInfoProfile.cs b/Source/NETworkManager.Models/Network/ServerConnectionInfoProfile.cs new file mode 100644 index 0000000000..a50f03ddbc --- /dev/null +++ b/Source/NETworkManager.Models/Network/ServerConnectionInfoProfile.cs @@ -0,0 +1,43 @@ +using System.Collections.Generic; + +namespace NETworkManager.Models.Network; + +/// +/// Class is used to store informations about a server profile. +/// +public class ServerConnectionInfoProfile +{ + /// + /// Create an instance of . + /// + public ServerConnectionInfoProfile() + { + + } + + /// + /// Create an instance of with parameters. + /// + /// Name of the profile. + /// List of servers as . + public ServerConnectionInfoProfile(string name, List servers) + { + Name = name; + Servers = servers; + } + + /// + /// Name of the server profile. + /// + public string Name { get; set; } + + /// + /// List of servers as . + /// + public List Servers { get; set; } = []; + + public override string ToString() + { + return Name; + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/Subnetmask.cs b/Source/NETworkManager.Models/Network/Subnetmask.cs index 216cbde001..560b7f9939 100644 --- a/Source/NETworkManager.Models/Network/Subnetmask.cs +++ b/Source/NETworkManager.Models/Network/Subnetmask.cs @@ -1,44 +1,40 @@ using System.Collections.Generic; using System.Net; -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +public static class Subnetmask { - public static class Subnetmask - { - public static List List => GenerateList(); + public static List List => GenerateList(); - private static List GenerateList() - { - var list = new List(); + private static List GenerateList() + { + var list = new List(); - for (var i = 2; i < 31; i++) - list.Add(GetFromCidr(i)); + for (var i = 2; i < 31; i++) + list.Add(GetFromCidr(i)); - return list; - } + return list; + } - public static SubnetmaskInfo GetFromCidr(int cidr) - { - return new SubnetmaskInfo - { - CIDR = cidr, - Subnetmask = ConvertCidrToSubnetmask(cidr) - }; - } - - public static string ConvertCidrToSubnetmask(int cidr) + public static SubnetmaskInfo GetFromCidr(int cidr) + { + return new SubnetmaskInfo { - var bits = string.Empty; + CIDR = cidr, + Subnetmask = ConvertCidrToSubnetmask(cidr) + }; + } - for (var i = 0; i < cidr; i++) - bits += "1"; + public static string ConvertCidrToSubnetmask(int cidr) + { + var bits = new string('1', cidr); - return IPv4Address.ToHumanString(bits.PadRight(32, '0')); - } + return IPv4Address.ToHumanString(bits.PadRight(32, '0')); + } - public static int ConvertSubnetmaskToCidr(IPAddress subnetmask) - { - return string.Join("", IPv4Address.ToBinaryString(subnetmask.ToString()).Replace(".", "").TrimEnd('0')).Length; - } + public static int ConvertSubnetmaskToCidr(IPAddress subnetmask) + { + return string.Join("", IPv4Address.ToBinaryString(subnetmask.ToString()).Replace(".", "").TrimEnd('0')).Length; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/SubnetmaskInfo.cs b/Source/NETworkManager.Models/Network/SubnetmaskInfo.cs index c219c42ee0..a18206d49b 100644 --- a/Source/NETworkManager.Models/Network/SubnetmaskInfo.cs +++ b/Source/NETworkManager.Models/Network/SubnetmaskInfo.cs @@ -1,24 +1,22 @@ -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +public class SubnetmaskInfo { - public class SubnetmaskInfo + public SubnetmaskInfo() { - public int CIDR { get; set; } - public string Subnetmask { get; set; } - - public SubnetmaskInfo() - { + } - } + public SubnetmaskInfo(int cidr, string subnetmask) + { + CIDR = cidr; + Subnetmask = subnetmask; + } - public SubnetmaskInfo(int cidr, string subnetmask) - { - CIDR = cidr; - Subnetmask = subnetmask; - } + public int CIDR { get; set; } + public string Subnetmask { get; set; } - public override string ToString() - { - return Subnetmask; - } + public override string ToString() + { + return Subnetmask; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/TigerVNCSessionInfo.cs b/Source/NETworkManager.Models/Network/TigerVNCSessionInfo.cs new file mode 100644 index 0000000000..15c38fb4e1 --- /dev/null +++ b/Source/NETworkManager.Models/Network/TigerVNCSessionInfo.cs @@ -0,0 +1,18 @@ +using System.Security; + +namespace NETworkManager.Models.Network; + +public class SNMPSessionInfo +{ + public string Host { get; set; } + public SNMPMode Mode { get; set; } + public string OID { get; set; } + public SNMPVersion Version { get; set; } + public SecureString Community { get; set; } + public SNMPV3Security Security { get; set; } + public string Username { get; set; } + public SNMPV3AuthenticationProvider AuthenticationProvider { get; set; } + public SecureString Auth { get; set; } = null; + public SNMPV3PrivacyProvider PrivacyProvider { get; set; } + public SecureString Priv { get; set; } = null; +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/Traceroute.cs b/Source/NETworkManager.Models/Network/Traceroute.cs index 46568a27a5..0115c98963 100644 --- a/Source/NETworkManager.Models/Network/Traceroute.cs +++ b/Source/NETworkManager.Models/Network/Traceroute.cs @@ -1,5 +1,4 @@ -using DnsClient; -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -7,56 +6,41 @@ using System.Net.NetworkInformation; using System.Threading; using System.Threading.Tasks; +using NETworkManager.Models.IPApi; +using NETworkManager.Utilities; -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +public sealed class Traceroute { - public class Traceroute - { - #region Variables - private readonly LookupClient DnsLookupClient = new LookupClient(); - - public int Timeout = 4000; - public byte[] Buffer = new byte[32]; - public int MaximumHops = 30; - public bool DontFragement = true; - public bool ResolveHostname = true; - #endregion - - #region Events - public event EventHandler HopReceived; - protected virtual void OnHopReceived(TracerouteHopReceivedArgs e) - { - HopReceived?.Invoke(this, e); - } + #region Variables - public event EventHandler TraceComplete; - protected virtual void OnTraceComplete() - { - TraceComplete?.Invoke(this, EventArgs.Empty); - } + private readonly TracerouteOptions _options; - public event EventHandler MaximumHopsReached; - protected virtual void OnMaximumHopsReached(MaximumHopsReachedArgs e) - { - MaximumHopsReached?.Invoke(this, e); - } + #endregion - public event EventHandler UserHasCanceled; - protected virtual void OnUserHasCanceled() - { - UserHasCanceled?.Invoke(this, EventArgs.Empty); - } - #endregion + #region Constructor + + public Traceroute(TracerouteOptions options) + { + _options = options; + } + + #endregion + + #region Methods - #region Methods - public void TraceAsync(IPAddress ipAddress, CancellationToken cancellationToken) + public void TraceAsync(IPAddress ipAddress, CancellationToken cancellationToken) + { + Task.Run(async () => { - Task.Run(async () => + try { - for (var i = 1; i < MaximumHops + 1; i++) + for (var i = 1; i < _options.MaximumHops + 1; i++) { var tasks = new List>>(); + // Send 3 pings for (var y = 0; y < 3; y++) { var i1 = i; @@ -71,7 +55,8 @@ public void TraceAsync(IPAddress ipAddress, CancellationToken cancellationToken) { stopwatch.Start(); - pingReply = ping.Send(ipAddress, Timeout, Buffer, new PingOptions { Ttl = i1, DontFragment = DontFragement }); + pingReply = ping.Send(ipAddress, _options.Timeout, _options.Buffer, + new PingOptions { Ttl = i1, DontFragment = _options.DontFragment }); stopwatch.Stop(); } @@ -80,26 +65,48 @@ public void TraceAsync(IPAddress ipAddress, CancellationToken cancellationToken) }, cancellationToken)); } - Task.WaitAll(tasks.ToArray()); + try + { + Task.WaitAll(tasks.ToArray()); + } + catch (AggregateException ex) + { + // Remove duplicate messages + OnTraceError(new TracerouteErrorArgs(string.Join(", ", + ex.Flatten().InnerExceptions.Select(s => s.Message).Distinct()))); + return; + } - var ipAddressHop = tasks.FirstOrDefault(x => x.Result.Item1 != null)?.Result.Item1.Address; + // Check results -> Get IP on success or TTL expired + var ipAddressHop = (from task in tasks + where task.Result.Item1.Status != IPStatus.TimedOut + where task.Result.Item1.Status is IPStatus.TtlExpired or IPStatus.Success + select task.Result.Item1.Address).FirstOrDefault(); - // Resolve Hostname + // Resolve Hostname var hostname = string.Empty; - if (ResolveHostname && ipAddressHop != null) + if (_options.ResolveHostname && ipAddressHop != null) { - try - { - var answer = await DnsLookupClient.GetHostNameAsync(ipAddressHop); + var dnsResult = await DNSClient.GetInstance().ResolvePtrAsync(ipAddressHop); - if (!string.IsNullOrEmpty(answer)) - hostname = answer; - } - catch { } // Couldn't resolve hostname + if (!dnsResult.HasError) + hostname = dnsResult.Value; } - OnHopReceived(new TracerouteHopReceivedArgs(i, tasks[0].Result.Item2, tasks[1].Result.Item2, tasks[2].Result.Item2, ipAddressHop, hostname, tasks[0].Result.Item1.Status, tasks[1].Result.Item1.Status, tasks[2].Result.Item1.Status)); + IPGeolocationResult ipGeolocationResult = null; + + // Get IP geolocation info + if (_options.CheckIPApiIPGeolocation && ipAddressHop != null && + !IPAddressHelper.IsPrivateIPAddress(ipAddressHop)) + ipGeolocationResult = + await IPGeolocationService.GetInstance().GetIPGeolocationAsync($"{ipAddressHop}"); + + OnHopReceived(new TracerouteHopReceivedArgs(new TracerouteHopInfo(i, + tasks[0].Result.Item1.Status, tasks[0].Result.Item2, + tasks[1].Result.Item1.Status, tasks[1].Result.Item2, + tasks[2].Result.Item1.Status, tasks[2].Result.Item2, + ipAddressHop, hostname, ipGeolocationResult ?? new IPGeolocationResult()))); // Check if finished if (ipAddressHop != null && ipAddress.ToString() == ipAddressHop.ToString()) @@ -113,15 +120,57 @@ public void TraceAsync(IPAddress ipAddress, CancellationToken cancellationToken) continue; OnUserHasCanceled(); - return; } // Max hops reached... - OnMaximumHopsReached(new MaximumHopsReachedArgs(MaximumHops)); + OnMaximumHopsReached(new MaximumHopsReachedArgs(_options.MaximumHops)); + } + catch (Exception ex) + { + OnTraceError(new TracerouteErrorArgs(ex.Message)); + } + }, cancellationToken); + } + + #endregion + + #region Events + + public event EventHandler HopReceived; + + private void OnHopReceived(TracerouteHopReceivedArgs e) + { + HopReceived?.Invoke(this, e); + } + + public event EventHandler TraceComplete; + + private void OnTraceComplete() + { + TraceComplete?.Invoke(this, EventArgs.Empty); + } - }, cancellationToken); - } - #endregion + public event EventHandler MaximumHopsReached; + + private void OnMaximumHopsReached(MaximumHopsReachedArgs e) + { + MaximumHopsReached?.Invoke(this, e); + } + + public event EventHandler TraceError; + + private void OnTraceError(TracerouteErrorArgs e) + { + TraceError?.Invoke(this, e); } + + public event EventHandler UserHasCanceled; + + private void OnUserHasCanceled() + { + UserHasCanceled?.Invoke(this, EventArgs.Empty); + } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/TracerouteErrorArgs.cs b/Source/NETworkManager.Models/Network/TracerouteErrorArgs.cs new file mode 100644 index 0000000000..31da7f396e --- /dev/null +++ b/Source/NETworkManager.Models/Network/TracerouteErrorArgs.cs @@ -0,0 +1,23 @@ +using System; + +namespace NETworkManager.Models.Network; + +/// +/// Contains the error message of a error. +/// +public class TracerouteErrorArgs : EventArgs +{ + /// + /// Creates a new instance of with the given error message. + /// + /// Error message of the error. + public TracerouteErrorArgs(string errorMessage) + { + ErrorMessage = errorMessage; + } + + /// + /// Error message of the error. + /// + public string ErrorMessage { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/TracerouteHopInfo.cs b/Source/NETworkManager.Models/Network/TracerouteHopInfo.cs index 3656a7147b..fa3bcda9b2 100644 --- a/Source/NETworkManager.Models/Network/TracerouteHopInfo.cs +++ b/Source/NETworkManager.Models/Network/TracerouteHopInfo.cs @@ -1,42 +1,89 @@ - -using System.Net; +using System.Net; using System.Net.NetworkInformation; +using NETworkManager.Models.IPApi; -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +/// +/// Class containing information about a hop in a . +/// +public class TracerouteHopInfo { - public class TracerouteHopInfo + /// + /// Creates a new instance of with the specified parameters. + /// + /// Hop (router). + /// Status of the first ping. + /// Time (ms) of the first ping. + /// Status of the second ping. + /// Time (ms) of the second ping. + /// Status of the third ping. + /// Time (ms) of the third ping. + /// IP address of the hop (router). + /// Hostname of the hop (router). + /// IP geolocation result (and info) of the hop (router). + public TracerouteHopInfo(int hop, IPStatus status1, long time1, IPStatus status2, long time2, IPStatus status3, + long time3, IPAddress ipAddress, string hostname, IPGeolocationResult ipGeolocationResult) { - public int Hop { get; set; } - public long Time1 { get; set; } - public long Time2 { get; set; } - public long Time3 { get; set; } - public IPAddress IPAddress { get; set; } - public string Hostname { get; set; } - public IPStatus Status1 { get; set; } - public IPStatus Status2 { get; set; } - public IPStatus Status3 { get; set; } - - public TracerouteHopInfo() - { - - } - - public TracerouteHopInfo(int hop, long time1, long time2, long time3, IPAddress ipAddress, string hostname, IPStatus status1, IPStatus status2, IPStatus status3) - { - Hop = hop; - Time1 = time1; - Time2 = time2; - Time3 = time3; - IPAddress = ipAddress; - Hostname = hostname; - Status1 = status1; - Status2 = status2; - Status3 = status3; - } - - public static TracerouteHopInfo Parse(TracerouteHopReceivedArgs e) - { - return new TracerouteHopInfo(e.Hop, e.Time1, e.Time2, e.Time3, e.IPAddress, e.Hostname, e.Status1, e.Status2, e.Status3); - } + Hop = hop; + Status1 = status1; + Time1 = time1; + Status2 = status2; + Time2 = time2; + Status3 = status3; + Time3 = time3; + IPAddress = ipAddress; + Hostname = hostname; + IPGeolocationResult = ipGeolocationResult; } -} + + /// + /// Hop (router). + /// + public int Hop { get; set; } + + /// + /// Status of the first ping. + /// + public IPStatus Status1 { get; set; } + + /// + /// Time (ms) of the first ping. + /// + public long Time1 { get; set; } + + /// + /// Status of the second ping. + /// + public IPStatus Status2 { get; set; } + + /// + /// Time (ms) of the second ping. + /// + public long Time2 { get; set; } + + /// + /// Status of the third ping. + /// + public IPStatus Status3 { get; set; } + + /// + /// Time (ms) of the third ping. + /// + public long Time3 { get; set; } + + /// + /// IP address of the hop (router). + /// + public IPAddress IPAddress { get; set; } + + /// + /// Hostname of the hop (router). + /// + public string Hostname { get; set; } + + /// + /// IP geolocation result (and info) of the hop (router). + /// + public IPGeolocationResult IPGeolocationResult { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/TracerouteHopReceivedArgs.cs b/Source/NETworkManager.Models/Network/TracerouteHopReceivedArgs.cs index 0885d4feb0..c7eb953611 100644 --- a/Source/NETworkManager.Models/Network/TracerouteHopReceivedArgs.cs +++ b/Source/NETworkManager.Models/Network/TracerouteHopReceivedArgs.cs @@ -1,36 +1,23 @@ -using System.Net; -using System.Net.NetworkInformation; +using System; -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +/// +/// Contains the information of a received hop in a . +/// +public class TracerouteHopReceivedArgs : EventArgs { - public class TracerouteHopReceivedArgs : System.EventArgs + /// + /// Creates a new instance of with the given . + /// + /// Traceroute hop information. + public TracerouteHopReceivedArgs(TracerouteHopInfo args) { - public int Hop { get; set; } - public long Time1 { get; set; } - public long Time2 { get; set; } - public long Time3 { get; set; } - public IPAddress IPAddress { get; set; } - public string Hostname { get; set; } - public IPStatus Status1 { get; set; } - public IPStatus Status2 { get; set; } - public IPStatus Status3 { get; set; } - - public TracerouteHopReceivedArgs() - { - - } - - public TracerouteHopReceivedArgs(int hop, long time1, long time2, long time3, IPAddress ipAddress, string hostname, IPStatus status1, IPStatus status2, IPStatus status3) - { - Hop = hop; - Time1 = time1; - Time2 = time2; - Time3 = time3; - IPAddress = ipAddress; - Hostname = hostname; - Status1 = status1; - Status2 = status2; - Status3 = status3; - } + Args = args; } -} + + /// + /// Traceroute hop information. + /// + public TracerouteHopInfo Args { get; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/TracerouteOptions.cs b/Source/NETworkManager.Models/Network/TracerouteOptions.cs new file mode 100644 index 0000000000..2233fb378f --- /dev/null +++ b/Source/NETworkManager.Models/Network/TracerouteOptions.cs @@ -0,0 +1,57 @@ +namespace NETworkManager.Models.Network; + +/// +/// Class contains the options for the traceroute. +/// +public class TracerouteOptions +{ + /// + /// Create an instance of with parameters. + /// + /// Timeout in milliseconds after which a ping is considered lost. + /// Size of the buffer used in the ping in bytes. + /// Maximum number of hops between the local and remote computer. + /// Do not fragment the ping packet. + /// Resolve the hostname for an IP address. + /// Check IP geolocation via ip-api.com. + public TracerouteOptions(int timeout, byte[] buffer, int maximumHops, bool dontFragment, bool resolveHostname, + bool checkIPApiIPGeolocation) + { + Timeout = timeout; + Buffer = buffer; + MaximumHops = maximumHops; + DontFragment = dontFragment; + ResolveHostname = resolveHostname; + CheckIPApiIPGeolocation = checkIPApiIPGeolocation; + } + + /// + /// Timeout in milliseconds after which a ping is considered lost. + /// + public int Timeout { get; } + + /// + /// Size of the buffer used in the ping in bytes. + /// + public byte[] Buffer { get; } + + /// + /// Maximum number of hops between the local and remote computer. + /// + public int MaximumHops { get; } + + /// + /// Do not fragment the ping packet. + /// + public bool DontFragment { get; } + + /// + /// Resolve the hostname for an IP address. + /// + public bool ResolveHostname { get; } + + /// + /// Check IP geolocation via ip-api.com. + /// + public bool CheckIPApiIPGeolocation { get; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/TransportProtocol.cs b/Source/NETworkManager.Models/Network/TransportProtocol.cs new file mode 100644 index 0000000000..4a970a4591 --- /dev/null +++ b/Source/NETworkManager.Models/Network/TransportProtocol.cs @@ -0,0 +1,27 @@ +namespace NETworkManager.Models.Network; + +/// +/// Enum for the transport protocol. +/// +public enum TransportProtocol +{ + /// + /// Transmission Control Protocol (TCP). + /// + Tcp, + + /// + /// User Datagram Protocol (UDP). + /// + Udp, + + /// + /// Stream Control Transmission Protocol (SCTP). + /// + Sctp, + + /// + /// Datagram Congestion Control Protocol (DCCP). + /// + Dccp +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/WakeOnLAN.cs b/Source/NETworkManager.Models/Network/WakeOnLAN.cs index 776c2f5f8b..30f67b6a3b 100644 --- a/Source/NETworkManager.Models/Network/WakeOnLAN.cs +++ b/Source/NETworkManager.Models/Network/WakeOnLAN.cs @@ -1,41 +1,38 @@ -using NETworkManager.Utilities; -using System.Net.Sockets; +using System.Net.Sockets; +using NETworkManager.Utilities; -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +public static class WakeOnLAN { - public static class WakeOnLAN + public static void Send(WakeOnLANInfo info) { - public static void Send(WakeOnLANInfo info) + using (var udpClient = new UdpClient()) { - using (var udpClient = new UdpClient()) - { - udpClient.Connect(info.Broadcast, info.Port); + udpClient.Connect(info.Broadcast, info.Port); - udpClient.Send(info.MagicPacket, info.MagicPacket.Length); - } + udpClient.Send(info.MagicPacket, info.MagicPacket.Length); } + } - public static byte[] CreateMagicPacket(byte[] mac) - { - var packet = new byte[17 * 6]; + public static byte[] CreateMagicPacket(byte[] mac) + { + var packet = new byte[17 * 6]; - for (var i = 0; i < 6; i++) - packet[i] = 0xFF; + for (var i = 0; i < 6; i++) + packet[i] = 0xFF; - for (var i = 1; i <= 16; i++) - { - for (var j = 0; j < 6; j++) - packet[i * 6 + j] = mac[j]; - } + for (var i = 1; i <= 16; i++) + for (var j = 0; j < 6; j++) + packet[i * 6 + j] = mac[j]; - return packet; - } + return packet; + } - public static byte[] CreateMagicPacket(string mac) - { - var macBytes = MACAddressHelper.ConvertStringToByteArray(mac); + public static byte[] CreateMagicPacket(string mac) + { + var macBytes = MACAddressHelper.ConvertStringToByteArray(mac); - return CreateMagicPacket(macBytes); - } + return CreateMagicPacket(macBytes); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/WakeOnLanInfo.cs b/Source/NETworkManager.Models/Network/WakeOnLanInfo.cs index 2210bb0571..962c3d95d0 100644 --- a/Source/NETworkManager.Models/Network/WakeOnLanInfo.cs +++ b/Source/NETworkManager.Models/Network/WakeOnLanInfo.cs @@ -1,23 +1,21 @@ using System.Net; -namespace NETworkManager.Models.Network -{ - public class WakeOnLANInfo - { - public byte[] MagicPacket; - public IPAddress Broadcast; - public int Port; +namespace NETworkManager.Models.Network; - public WakeOnLANInfo() - { +public class WakeOnLANInfo +{ + public IPAddress Broadcast; + public byte[] MagicPacket; + public int Port; - } + public WakeOnLANInfo() + { + } - public WakeOnLANInfo(byte[] magicPacket, IPAddress broadcast, int port) - { - MagicPacket = magicPacket; - Broadcast = broadcast; - Port = port; - } + public WakeOnLANInfo(byte[] magicPacket, IPAddress broadcast, int port) + { + MagicPacket = magicPacket; + Broadcast = broadcast; + Port = port; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/Whois.cs b/Source/NETworkManager.Models/Network/Whois.cs index 46b85d74c8..c728808b2f 100644 --- a/Source/NETworkManager.Models/Network/Whois.cs +++ b/Source/NETworkManager.Models/Network/Whois.cs @@ -1,5 +1,4 @@ -using System.Collections.Generic; -using System.IO; +using System.IO; using System.Linq; using System.Net.Sockets; using System.Reflection; @@ -7,74 +6,73 @@ using System.Threading.Tasks; using System.Xml; -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +public static class Whois { - public static class Whois + #region Constructor + + static Whois() { - #region Variables - private static readonly string WhoisServerFilePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Resources", "WhoisServers.xml"); + var document = new XmlDocument(); + document.Load(WhoisServerFilePath); - private static readonly List WhoisServerList; - private static readonly Lookup WhoisServers; - #endregion + var whoisServerList = (from XmlNode node in document.SelectNodes("/WhoisServers/WhoisServer")! + where node != null + select new WhoisServerInfo(node.SelectSingleNode("Server")?.InnerText, + node.SelectSingleNode("TLD")?.InnerText)).ToList(); - #region Constructor + WhoisServers = (Lookup)whoisServerList.ToLookup(x => x.Tld); + } - static Whois() - { - var document = new XmlDocument(); - document.Load(WhoisServerFilePath); + #endregion - WhoisServerList = new List(); + #region Variables - foreach (XmlNode node in document.SelectNodes("/WhoisServers/WhoisServer")) - { - if (node == null) - continue; + private static readonly string WhoisServerFilePath = + Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly()?.Location)!, "Resources", "WhoisServers.xml"); - WhoisServerList.Add(new WhoisServerInfo(node.SelectSingleNode("Server")?.InnerText, node.SelectSingleNode("TLD")?.InnerText)); - } + private static readonly Lookup WhoisServers; - WhoisServers = (Lookup)WhoisServerList.ToLookup(x => x.Tld); - } - #endregion + #endregion - #region Methods - public static Task QueryAsync(string domain, string whoisServer) - { - return Task.Run(() => Query(domain, whoisServer)); - } + #region Methods + + public static Task QueryAsync(string domain, string whoisServer) + { + return Task.Run(() => Query(domain, whoisServer)); + } - public static string Query(string domain, string whoisServer) - { - var tcpClient = new TcpClient(whoisServer, 43); + private static string Query(string domain, string whoisServer) + { + var tcpClient = new TcpClient(whoisServer, 43); - var networkStream = tcpClient.GetStream(); + var networkStream = tcpClient.GetStream(); - var bufferedStream = new BufferedStream(networkStream); + var bufferedStream = new BufferedStream(networkStream); - var streamWriter = new StreamWriter(bufferedStream); + var streamWriter = new StreamWriter(bufferedStream); - streamWriter.WriteLine(domain); - streamWriter.Flush(); + streamWriter.WriteLine(domain); + streamWriter.Flush(); - var streamReader = new StreamReader(bufferedStream); + var streamReader = new StreamReader(bufferedStream); - var stringBuilder = new StringBuilder(); + var stringBuilder = new StringBuilder(); - while (!streamReader.EndOfStream) - stringBuilder.AppendLine(streamReader.ReadLine()); + while (!streamReader.EndOfStream) + stringBuilder.AppendLine(streamReader.ReadLine()); - return stringBuilder.ToString(); - } + return stringBuilder.ToString(); + } - public static string GetWhoisServer(string domain) - { - var domainParts = domain.Split('.'); + public static string GetWhoisServer(string domain) + { + var domainParts = domain.TrimEnd('.').Split('.'); - // TLD to upper because the lookup is case sensitive - return WhoisServers[domainParts[domainParts.Length - 1].ToUpper()].FirstOrDefault()?.Server; - } - #endregion + // TLD to upper because the lookup is case sensitive + return WhoisServers[domainParts[^1].ToUpper()].FirstOrDefault()?.Server; } -} + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/WhoisServerInfo.cs b/Source/NETworkManager.Models/Network/WhoisServerInfo.cs index da9d430f9c..63c9003c92 100644 --- a/Source/NETworkManager.Models/Network/WhoisServerInfo.cs +++ b/Source/NETworkManager.Models/Network/WhoisServerInfo.cs @@ -1,14 +1,13 @@ -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +public class WhoisServerInfo { - public class WhoisServerInfo + public WhoisServerInfo(string server, string tld) { - public string Server { get; set; } - public string Tld { get; set; } - - public WhoisServerInfo(string server, string tld) - { - Server = server; - Tld = tld; - } + Server = server; + Tld = tld; } -} + + public string Server { get; set; } + public string Tld { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/WiFi.cs b/Source/NETworkManager.Models/Network/WiFi.cs index 33bd47e439..d9475faca6 100644 --- a/Source/NETworkManager.Models/Network/WiFi.cs +++ b/Source/NETworkManager.Models/Network/WiFi.cs @@ -1,233 +1,401 @@ -using System; +using log4net; +using System; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Windows.Devices.WiFi; using Windows.Networking.Connectivity; +using Windows.Security.Credentials; +using NETworkManager.Models.Lookup; -//https://docs.microsoft.com/en-us/uwp/api/windows.devices.wifi.wifiadapter.requestaccessasync -//var access = await WiFiAdapter.RequestAccessAsync(); +namespace NETworkManager.Models.Network; -namespace NETworkManager.Models.Network +/// +/// Class with Wi-Fi related methods. +/// +public static class WiFi { - public class WiFi + private static readonly ILog Log = LogManager.GetLogger(typeof(WiFi)); + + /// + /// Get all Wi-Fi adapters async with additional information from . + /// + /// + /// with and as + /// . + /// + public static async Task> GetAdapterAsync() { - public static async Task> GetAdapterAsync() - { - List wifiAdapters = new List(); - List networkInterfaces = await NetworkInterface.GetNetworkInterfacesAsync(); + List wifiAdapterInfos = []; - foreach (WiFiAdapter wifiAdapter in await WiFiAdapter.FindAllAdaptersAsync()) - { - foreach (NetworkInterfaceInfo networkInterface in networkInterfaces) - { - if (!wifiAdapter.NetworkAdapter.NetworkAdapterId.ToString().Equals(networkInterface.Id.TrimStart('{').TrimEnd('}'), StringComparison.OrdinalIgnoreCase)) - continue; - - wifiAdapters.Add(new WiFiAdapterInfo - { - NetworkInterfaceInfo = networkInterface, - WiFiAdapter = wifiAdapter - }); - } - } + var wifiAdapters = await WiFiAdapter.FindAllAdaptersAsync(); - return wifiAdapters; - } + if (wifiAdapters.Count <= 0) + return wifiAdapterInfos; - public static async Task> GetNetworksAsync(WiFiAdapter adapter) + var networkInterfaces = await NetworkInterface.GetNetworkInterfacesAsync(); + + foreach (var wiFiAdapter in wifiAdapters) { - List wifiNetworks = new List(); + var wiFiAdapterId = wiFiAdapter.NetworkAdapter.NetworkAdapterId.ToString(); - await adapter.ScanAsync(); + var networkInterface = networkInterfaces.FirstOrDefault(x => x.Id.TrimStart('{').TrimEnd('}') + .Equals(wiFiAdapterId, StringComparison.OrdinalIgnoreCase)); - foreach (var network in adapter.NetworkReport.AvailableNetworks) - { - wifiNetworks.Add(new WiFiNetworkInfo() + if (networkInterface != null) + wifiAdapterInfos.Add(new WiFiAdapterInfo { - BSSID = network.Bssid, - SSID = network.Ssid, - ChannelCenterFrequencyInKilohertz = network.ChannelCenterFrequencyInKilohertz, - SignalBars = network.SignalBars, - IsWiFiDirect = network.IsWiFiDirect, - NetworkRssiInDecibelMilliwatts = network.NetworkRssiInDecibelMilliwatts, - PhyKind = network.PhyKind, - NetworkKind = network.NetworkKind, - AuthenticationType = network.SecuritySettings.NetworkAuthenticationType, - EncryptionType = network.SecuritySettings.NetworkEncryptionType, - BeaconInterval = network.BeaconInterval, - Uptime = network.Uptime + NetworkInterfaceInfo = networkInterface, + WiFiAdapter = wiFiAdapter }); - } - - return wifiNetworks; + else + Log.Warn($"Could not find network interface for WiFi adapter with id: {wiFiAdapterId}"); } - public static int GetChannelFromChannelFrequency(int kilohertz) + return wifiAdapterInfos; + } + + /// + /// Get all available Wi-Fi networks for an adapter with additional information's. + /// + /// WiFi adapter as . + /// A report as including a list of . + public static async Task GetNetworksAsync(WiFiAdapter adapter) + { + // Scan network adapter async + await adapter.ScanAsync(); + + // Try to get the current connected Wi-Fi network of this network adapter + var (_, bssid) = TryGetConnectedNetworkFromWiFiAdapter(adapter.NetworkAdapter.NetworkAdapterId.ToString()); + + // The WinRT API does not expose the channel bandwidth, so it is read from the native + // BSS list (wlanapi.dll) and matched by BSSID below. Failures yield an empty map and we + // fall back to a heuristic per network. + var channelWidths = WlanApi.GetBssChannelWidths(adapter.NetworkAdapter.NetworkAdapterId); + + var wifiNetworkInfos = new List(); + + foreach (var availableNetwork in adapter.NetworkReport.AvailableNetworks) { - switch (ConvertChannelFrequencyToGigahertz(kilohertz)) + var channelFrequencyInGigahertz = ConvertChannelFrequencyToGigahertz(availableNetwork.ChannelCenterFrequencyInKilohertz); + var radio = GetWiFiRadioFromChannelFrequency(channelFrequencyInGigahertz); + + var wifiNetworkInfo = new WiFiNetworkInfo { - // 2.4 GHz - case 2.412: - return 1; - case 2.417: - return 2; - case 2.422: - return 3; - case 2.427: - return 4; - case 2.432: - return 5; - case 2.437: - return 6; - case 2.442: - return 7; - case 2.447: - return 8; - case 2.452: - return 9; - case 2.457: - return 10; - case 2.462: - return 11; - case 2.467: - return 12; - case 2.472: - return 13; - // 5 GHz - case 5.180: - return 36; - case 5.200: - return 40; - case 5.220: - return 44; - case 5.240: - return 48; - case 5.260: - return 52; - case 5.280: - return 56; - case 5.300: - return 60; - case 5.320: - return 64; - case 5.500: - return 100; - case 5.520: - return 104; - case 5.540: - return 108; - case 5.560: - return 112; - case 5.580: - return 116; - case 5.600: - return 120; - case 5.620: - return 124; - case 5.640: - return 128; - case 5.660: - return 132; - case 5.680: - return 136; - case 5.700: - return 140; - case 5.720: - return 144; - case 5.745: - return 149; - case 5.765: - return 153; - case 5.785: - return 157; - case 5.805: - return 161; - case 5.825: - return 165; - } + AvailableNetwork = availableNetwork, + Radio = radio, + ChannelCenterFrequencyInGigahertz = channelFrequencyInGigahertz, + Channel = GetChannelFromChannelFrequency(channelFrequencyInGigahertz), + ChannelBandwidth = GetChannelBandwidth(channelWidths, availableNetwork.Bssid, radio, availableNetwork.PhyKind), + IsHidden = string.IsNullOrEmpty(availableNetwork.Ssid), + IsConnected = availableNetwork.Bssid.Equals(bssid, StringComparison.OrdinalIgnoreCase), + NetworkAuthenticationType = GetHumanReadableNetworkAuthenticationType(availableNetwork.SecuritySettings.NetworkAuthenticationType), + Vendor = (await OUILookup.LookupByMacAddressAsync(availableNetwork.Bssid)).FirstOrDefault()?.Vendor ?? "-/-", + PhyKind = GetHumanReadablePhyKind(availableNetwork.PhyKind) + }; - return -1; + wifiNetworkInfos.Add(wifiNetworkInfo); } - public static double ConvertChannelFrequencyToGigahertz(int kilohertz) + return new WiFiNetworkScanInfo { - return Convert.ToDouble(kilohertz) / 1000 / 1000; - } + NetworkAdapterId = adapter.NetworkAdapter.NetworkAdapterId, + WiFiNetworkInfos = wifiNetworkInfos, + Timestamp = adapter.NetworkReport.Timestamp.LocalDateTime + }; + } - public static bool Is2dot4GHzNetwork(int kilohertz) + /// + /// Try to get the current connected Wi-Fi network (SSID and BSSID) of a network adapter from + /// netsh.exe. + /// Calling netsh.exe and parsing the output feels so dirty, but Microsoft's API returns only + /// the WLAN profile and the SSID of the connected network. The BSSID is needed to find a + /// specific access point among several. + /// + /// GUID of the Wi-Fi network adapter. + /// SSID and BSSID of the connected Wi-Fi network. Values are null if not detected. + // ReSharper disable once UnusedTupleComponentInReturnValue + private static (string SSID, string BSSID) TryGetConnectedNetworkFromWiFiAdapter(string adapterId) + { + string ssid = null; + string bssid = null; + + using (var powerShell = System.Management.Automation.PowerShell.Create()) { - var x = ConvertChannelFrequencyToGigahertz(kilohertz); + powerShell.AddScript("netsh wlan show interfaces"); - return x >= 2.412 && x <= 2.472; - } + var psOutputs = powerShell.Invoke(); - public static bool Is5GHzNetwork(int kilohertz) - { - var x = ConvertChannelFrequencyToGigahertz(kilohertz); + /* + if (powerShell.Streams.Error.Count > 0) { // Handle error? } + if (powerShell.Streams.Warning.Count > 0) { // Handle warning? } + */ - return x >= 5.180 && x <= 5.825; - } + /* Each object looks like this: + * + * Name : Wireless + * Description : Intel ... + * GUID : 90d8... + * SSID : Devices + * BSSID : 6a:d7:... + */ - public static string GetHumanReadableNetworkAuthenticationType(NetworkAuthenticationType networkAuthenticationType) - { - switch (networkAuthenticationType) + var foundAdapter = false; + + foreach (var outputItem in psOutputs) { - case NetworkAuthenticationType.Open80211: - return "Open"; - case NetworkAuthenticationType.Rsna: - return "WPA2 Enterprise"; - case NetworkAuthenticationType.RsnaPsk: - return "WPA2 PSK"; - case NetworkAuthenticationType.Wpa: - return "WPA Enterprise"; - case NetworkAuthenticationType.WpaNone: - return "WPA None"; - case NetworkAuthenticationType.WpaPsk: - return "WPA PSK"; - case NetworkAuthenticationType.SharedKey80211: - return "WEP"; - case NetworkAuthenticationType.Ihv: - return "IHV"; - case NetworkAuthenticationType.Unknown: - return "Unkown"; - case NetworkAuthenticationType.None: - return "-/-"; - } + // Find line with the network adapter id... + if (outputItem.ToString().Contains(adapterId, StringComparison.OrdinalIgnoreCase)) + foundAdapter = true; + + // ...and skip all lines until we found it. + if (!foundAdapter) + continue; + + // Extract SSID from the line + if (outputItem.ToString().Contains(" SSID ", StringComparison.OrdinalIgnoreCase)) + ssid = outputItem.ToString().Split(':')[1].Trim(); - return "-/-"; + // Extract BSSID from the line + if (outputItem.ToString().Contains(" BSSID ", StringComparison.OrdinalIgnoreCase)) + bssid = outputItem.ToString().Split(':', 2)[1].Trim(); + + // Break if we got the values, otherwise we might overwrite them + // with values from another adapter. + if (!string.IsNullOrEmpty(ssid) && !string.IsNullOrEmpty(bssid)) + break; + } } - public static string GetHumandReadablePhyKind(WiFiPhyKind phyKind) + return (ssid, bssid); + } + + /// + /// Connect to a Wi-Fi network with Pre-shared key, EAP or no security. + /// + /// Wi-Fi adapter which should be used for the connection. + /// Wi-Fi network to connect to. + /// Reconnection type to automatically or manuel reconnect. + /// Credentials for EAP or PSK. Empty for open networks. + /// SSID for hidden networks. + /// + public static async Task ConnectAsync(WiFiAdapter adapter, WiFiAvailableNetwork network, + WiFiReconnectionKind reconnectionKind, PasswordCredential credential, string ssid = null) + { + WiFiConnectionResult connectionResult; + + if (string.IsNullOrEmpty(ssid)) + connectionResult = await adapter.ConnectAsync(network, reconnectionKind, credential); + else + connectionResult = await adapter.ConnectAsync(network, reconnectionKind, credential, ssid); + + // Wrong password may cause connection to timeout. + // Disconnect any network from the adapter to return it to a non-busy state. + if (connectionResult.ConnectionStatus == WiFiConnectionStatus.Timeout) + Disconnect(adapter); + + return connectionResult.ConnectionStatus; + } + + /// + /// Connect to a Wi-Fi network with WPS push button. + /// + /// Wi-Fi adapter which should be used for the connection. + /// Wi-Fi network to connect to. + /// Reconnection type to automatically or manuel reconnect. + /// + public static async Task ConnectWpsAsync(WiFiAdapter adapter, WiFiAvailableNetwork network, + WiFiReconnectionKind reconnectionKind) + { + var connectionResult = await adapter.ConnectAsync(network, reconnectionKind, null, + string.Empty, WiFiConnectionMethod.WpsPushButton); + + // Wrong password may cause connection to timeout. + // Disconnect any network from the adapter to return it to a non-busy state. + if (connectionResult.ConnectionStatus == WiFiConnectionStatus.Timeout) + Disconnect(adapter); + + return connectionResult.ConnectionStatus; + } + + /// + /// Disconnect the Wi-Fi adapter from the current Wi-Fi network. + /// + /// Wi-Fi adapter from which the Wi-Fi network should be disconnected. + public static void Disconnect(WiFiAdapter adapter) + { + adapter.Disconnect(); + } + + /// + /// Get the connect mode of a Wi-Fi network like Open, Eap (WPA2-Enterprise) + /// or Psk (WPA2-Personal). + /// + /// Wi-Fi network as . + /// Connect mode as . + public static WiFiConnectMode GetConnectMode(WiFiAvailableNetwork network) + { + // Enterprise + if (network.SecuritySettings.NetworkAuthenticationType is NetworkAuthenticationType.Rsna or NetworkAuthenticationType.Wpa) + return WiFiConnectMode.Eap; + + // Open + if (network.SecuritySettings.NetworkAuthenticationType == NetworkAuthenticationType.Open80211 || + network.SecuritySettings.NetworkEncryptionType == NetworkEncryptionType.None) + return WiFiConnectMode.Open; + + // Pre-Shared-Key + return WiFiConnectMode.Psk; + } + + /// + /// Check if WPS is available for a Wi-Fi network. + /// + /// WiFi adapter as . + /// WiFi network as . + /// Ture if WPS is available. + public static async Task IsWpsAvailable(WiFiAdapter adapter, WiFiAvailableNetwork network) + { + var result = await adapter.GetWpsConfigurationAsync(network); + + return result.SupportedWpsKinds.Contains(WiFiWpsKind.PushButton); + } + + /// + /// Get the Wi-Fi channel from channel frequency. + /// + /// Input like 2.422 or 5.240. + /// Wi-Fi channel like 3 or 48. + private static int GetChannelFromChannelFrequency(double gigahertz) + { + // Convert to integer MHz to avoid floating-point precision issues from the + // kilohertz / 1_000_000.0 conversion in ConvertChannelFrequencyToGigahertz. + var mhz = (int)Math.Round(gigahertz * 1000); + + // 2.4 GHz: channels 1-13 follow f = 2407 + ch×5 MHz; channel 14 is at 2484 MHz + if (mhz is >= 2412 and <= 2472) + return (mhz - 2407) / 5; + if (mhz == 2484) + return 14; + + // 5 GHz: channels follow f = 5000 + ch×5 MHz + if (mhz is >= 5180 and <= 5825) + return (mhz - 5000) / 5; + + // 6 GHz: channels 1-233 follow f = 5950 + ch×5 MHz + if (mhz is >= 5955 and <= 7115) + return (mhz - 5950) / 5; + + return -1; + } + + /// + /// Convert the channel frequency to gigahertz. + /// + /// Frequency in kilohertz like 2422000 or 5240000. + /// Frequency in gigahertz like 2.422 or 5.240. + private static double ConvertChannelFrequencyToGigahertz(int kilohertz) + { + return Convert.ToDouble(kilohertz) / 1000 / 1000; + } + + /// + /// Get the Wi-Fi radio like 2.4 GHz, 5 GHz, etc. from the channel frequency. + /// + /// Frequency in gigahertz like 2.412 or 5.180. + /// Radio like 2.4 GHz, 5 GHz, etc. as . + private static WiFiRadio GetWiFiRadioFromChannelFrequency(double gigahertz) + { + return gigahertz switch { - switch (phyKind) + >= 2.412 and <= 2.484 => WiFiRadio.GHz2dot4, + >= 5.180 and <= 5.825 => WiFiRadio.GHz5, + >= 5.925 and <= 7.125 => WiFiRadio.GHz6, + _ => WiFiRadio.Unknown + }; + } + + /// + /// Determines the channel bandwidth (MHz) for a network. Prefers the value parsed from the + /// native BSS list (); if unavailable, falls back to a heuristic based + /// on the radio band and PHY kind, and finally to 20 MHz. + /// + private static int GetChannelBandwidth(IReadOnlyDictionary channelWidths, string networkBssid, + WiFiRadio radio, WiFiPhyKind phyKind) + { + if (!string.IsNullOrEmpty(networkBssid) && channelWidths.TryGetValue(networkBssid, out var width) && width > 0) + return width; + + return GetHeuristicChannelBandwidth(radio, phyKind); + } + + /// + /// Estimates the channel bandwidth (MHz) from the radio band and PHY kind when the exact + /// value could not be read from the BSS list. + /// + private static int GetHeuristicChannelBandwidth(WiFiRadio radio, WiFiPhyKind phyKind) + { + return radio switch + { + WiFiRadio.GHz2dot4 => phyKind == WiFiPhyKind.HT ? 40 : 20, + WiFiRadio.GHz5 => phyKind switch { - case WiFiPhyKind.Dsss: - case WiFiPhyKind.Fhss: - return "802.11"; - case WiFiPhyKind.Ofdm: - return "802.11a"; - case WiFiPhyKind.Hrdsss: - return "802.11b"; - case WiFiPhyKind.Erp: - return "802.11g"; - break; - case WiFiPhyKind.HT: - return "802.11n"; - case WiFiPhyKind.Dmg: - return "802.11ad"; - case WiFiPhyKind.Vht: - return "802.11ac"; - case WiFiPhyKind.HE: - return "802.11ax"; - } + WiFiPhyKind.Vht or WiFiPhyKind.HE or WiFiPhyKind.Eht => 80, + WiFiPhyKind.HT => 40, + _ => 20 + }, + WiFiRadio.GHz6 => phyKind is WiFiPhyKind.HE or WiFiPhyKind.Eht ? 160 : 20, + _ => 20 + }; + } - return "-/-"; - } + /// + /// Get the human-readable network authentication type. + /// + /// Wi-Fi network authentication type as . + /// Human-readable authentication type as string like "Open" or "WPA2 Enterprise". + public static string GetHumanReadableNetworkAuthenticationType(NetworkAuthenticationType networkAuthenticationType) + { + return networkAuthenticationType switch + { + NetworkAuthenticationType.None => "-/-", + NetworkAuthenticationType.Unknown => "Unknown", + NetworkAuthenticationType.Open80211 => "Open", + NetworkAuthenticationType.SharedKey80211 => "WEP", + NetworkAuthenticationType.Wpa => "WPA Enterprise", + NetworkAuthenticationType.WpaPsk => "WPA PSK", + NetworkAuthenticationType.WpaNone => "WPA None", + NetworkAuthenticationType.Rsna => "WPA2 Enterprise", + NetworkAuthenticationType.RsnaPsk => "WPA2 Personal (PSK)", + NetworkAuthenticationType.Ihv => "IHV", + NetworkAuthenticationType.Wpa3Enterprise192Bits => "WPA3 Enterprise (192-bit)", // Same as Wpa3 + NetworkAuthenticationType.Wpa3Sae => "WPA3 Personal (SAE)", + NetworkAuthenticationType.Owe => "OWE", + NetworkAuthenticationType.Wpa3Enterprise => "WPA3 Enterprise", + _ => "-/-" + }; + } - public enum Radio + /// + /// Get the human-readable network phy kind. + /// + /// Wi-Fi network phy kind as . + /// Human-readable phy kind as string like "802.11g" or "802.11ax". + public static string GetHumanReadablePhyKind(WiFiPhyKind phyKind) + { + return phyKind switch { - One, - Two - } + WiFiPhyKind.Unknown => "Unknown", + WiFiPhyKind.Dsss or WiFiPhyKind.Fhss => "802.11", + WiFiPhyKind.Ofdm => "802.11a", + WiFiPhyKind.Hrdsss => "802.11b", + WiFiPhyKind.Erp => "802.11g", + WiFiPhyKind.HT => "802.11n", + WiFiPhyKind.Vht => "802.11ac", + WiFiPhyKind.Dmg => "802.11ad", + WiFiPhyKind.HE => "802.11ax", + WiFiPhyKind.Eht => "802.11be", + _ => "-/-" + }; } } \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/WiFiAdapterInfo.cs b/Source/NETworkManager.Models/Network/WiFiAdapterInfo.cs index 0f1777fbb1..46dfdd190d 100644 --- a/Source/NETworkManager.Models/Network/WiFiAdapterInfo.cs +++ b/Source/NETworkManager.Models/Network/WiFiAdapterInfo.cs @@ -1,15 +1,9 @@ using Windows.Devices.WiFi; -namespace NETworkManager.Models.Network -{ - public class WiFiAdapterInfo - { - public NetworkInterfaceInfo NetworkInterfaceInfo { get; set; } - public WiFiAdapter WiFiAdapter { get; set; } +namespace NETworkManager.Models.Network; - public WiFiAdapterInfo() - { - - } - } -} +public class WiFiAdapterInfo +{ + public NetworkInterfaceInfo NetworkInterfaceInfo { get; set; } + public WiFiAdapter WiFiAdapter { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/WiFiConnectMode.cs b/Source/NETworkManager.Models/Network/WiFiConnectMode.cs new file mode 100644 index 0000000000..1dd1616382 --- /dev/null +++ b/Source/NETworkManager.Models/Network/WiFiConnectMode.cs @@ -0,0 +1,24 @@ +namespace NETworkManager.Models.Network; + +/// +/// Enum for the WiFi connect mode. +/// +public enum WiFiConnectMode +{ + /// + /// WiFi network is open. + /// + Open, + + /// + /// WiFi network is protected with Pre-Shared Key (PSK). + /// E.g WpaPsk or RsnaPsk. + /// + Psk, + + /// + /// WiFi network is protected with User-Password-Authentication (EAP). + /// E.g. Wpa or Rsna. + /// + Eap +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/WiFiNetworkInfo.cs b/Source/NETworkManager.Models/Network/WiFiNetworkInfo.cs index 6a42fa50b9..025c839c50 100644 --- a/Source/NETworkManager.Models/Network/WiFiNetworkInfo.cs +++ b/Source/NETworkManager.Models/Network/WiFiNetworkInfo.cs @@ -1,40 +1,71 @@ -using System; -using System.ComponentModel; -using System.Runtime.CompilerServices; -using Windows.Devices.WiFi; -using Windows.Networking.Connectivity; +using Windows.Devices.WiFi; -namespace NETworkManager.Models.Network +namespace NETworkManager.Models.Network; + +/// +/// Class contains information about a Wi-Fi network. +/// +public class WiFiNetworkInfo { - public class WiFiNetworkInfo : INotifyPropertyChanged + /// + /// /// Create an instance of . + /// + public WiFiNetworkInfo() { - #region PropertyChangedEventHandler - public event PropertyChangedEventHandler PropertyChanged; - - protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } - #endregion - - #region Variables - public string BSSID { get; set; } - public string SSID { get; set; } - public int ChannelCenterFrequencyInKilohertz { get; set; } - public byte SignalBars { get; set; } - public bool IsWiFiDirect { get; set; } - public double NetworkRssiInDecibelMilliwatts { get; set; } - public WiFiPhyKind PhyKind { get; set; } - public WiFiNetworkKind NetworkKind { get; set; } - public NetworkAuthenticationType AuthenticationType { get; set; } - public NetworkEncryptionType EncryptionType { get; set; } - public TimeSpan BeaconInterval { get; set; } - public TimeSpan Uptime { get; set; } - #endregion - - public WiFiNetworkInfo() - { - - } + } -} + + #region Variables + + /// + /// Information's about an available Wi-Fi network. + /// + public WiFiAvailableNetwork AvailableNetwork { get; init; } + + /// + /// Radio that is used like 2.4 GHz, 5 GHz, etc. + /// + public WiFiRadio Radio { get; init; } + + /// + /// The channel center frequency in Gigahertz like 2.4 GHz, 5 GHz, etc. + /// + public double ChannelCenterFrequencyInGigahertz { get; set; } + + /// + /// The channel used by the Wi-Fi network. + /// + public int Channel { get; set; } + + /// + /// The channel bandwidth in MHz (e.g. 20, 40, 80, 160). Always >= 20: native value from + /// the BSS list when available, otherwise estimated from radio band and PHY kind. + /// + public int ChannelBandwidth { get; set; } + + /// + /// Indicates if the Wi-Fi network Ssid is hidden. + /// + public bool IsHidden { get; set; } + + /// + /// Indicates if the Wi-Fi network is connected to the current WiFi adapter. + /// + public bool IsConnected { get; set; } + + /// + /// Human-readable network authentication type. + /// + public string NetworkAuthenticationType { get; set; } + + /// + /// Vendor of the Wi-Fi network like Cisco, Netgear, etc. + /// + public string Vendor { get; set; } + + /// + /// Human-readable phy kind. + /// + public string PhyKind { get; set; } + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/WiFiNetworkScannfo.cs b/Source/NETworkManager.Models/Network/WiFiNetworkScannfo.cs new file mode 100644 index 0000000000..d5f2c389b2 --- /dev/null +++ b/Source/NETworkManager.Models/Network/WiFiNetworkScannfo.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; + +namespace NETworkManager.Models.Network; + +/// +/// Class contains information about a WiFi network scan. +/// +public class WiFiNetworkScanInfo +{ + /// + /// Create an instance of . + /// + public WiFiNetworkScanInfo() + { + } + + #region Variables + + /// + /// If of the network adapter who performed the scan. + /// + public Guid NetworkAdapterId { get; set; } + + /// + /// List of available WiFi networks on the network adapter. + /// + public List WiFiNetworkInfos { get; init; } + + /// + /// Timestamp when the scan was performed. + /// + public DateTime Timestamp { get; init; } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/WiFiRadio.cs b/Source/NETworkManager.Models/Network/WiFiRadio.cs new file mode 100644 index 0000000000..e4671d1926 --- /dev/null +++ b/Source/NETworkManager.Models/Network/WiFiRadio.cs @@ -0,0 +1,9 @@ +namespace NETworkManager.Models.Network; + +public enum WiFiRadio +{ + GHz2dot4, + GHz5, + GHz6, + Unknown +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/WlanApi.cs b/Source/NETworkManager.Models/Network/WlanApi.cs new file mode 100644 index 0000000000..8ac684c0e9 --- /dev/null +++ b/Source/NETworkManager.Models/Network/WlanApi.cs @@ -0,0 +1,406 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using log4net; + +namespace NETworkManager.Models.Network; + +/// +/// Native Wi-Fi (wlanapi.dll) interop used to determine the channel bandwidth +/// (20 / 40 / 80 / 160 MHz) of nearby access points. +/// +/// The Windows Runtime Wi-Fi API () does +/// not expose the channel width. The native BSS list (WlanGetNetworkBssList) however +/// returns the raw 802.11 information elements (IEs) of each beacon / probe response. The width +/// is parsed from the HT-Operation (802.11n), VHT-Operation (802.11ac) and HE-Operation +/// (802.11ax / 6 GHz) elements. +/// +/// All calls are wrapped in try/catch; on any failure an empty result is returned so the caller +/// can fall back to a heuristic (see ). +/// +public static class WlanApi +{ + private static readonly ILog Log = LogManager.GetLogger(typeof(WlanApi)); + + private const uint WlanApiVersion2 = 0x00000002; + private const uint ErrorSuccess = 0; + + // 802.11 information element identifiers. + private const byte EidHtOperation = 61; + private const byte EidVhtOperation = 192; + private const byte EidExtension = 255; + private const byte ExtEidHeOperation = 36; + + private enum DOT11_BSS_TYPE + { + // ReSharper disable UnusedMember.Local + Infrastructure = 1, + Independent = 2, + Any = 3 + // ReSharper restore UnusedMember.Local + } + + [DllImport("wlanapi.dll")] + private static extern uint WlanOpenHandle(uint dwClientVersion, IntPtr pReserved, + out uint pdwNegotiatedVersion, out IntPtr phClientHandle); + + [DllImport("wlanapi.dll")] + private static extern uint WlanCloseHandle(IntPtr hClientHandle, IntPtr pReserved); + + [DllImport("wlanapi.dll")] + private static extern void WlanFreeMemory(IntPtr pMemory); + + [DllImport("wlanapi.dll")] + private static extern uint WlanGetNetworkBssList(IntPtr hClientHandle, ref Guid pInterfaceGuid, + IntPtr pDot11Ssid, DOT11_BSS_TYPE dot11BssType, [MarshalAs(UnmanagedType.Bool)] bool bSecurityEnabled, + IntPtr pReserved, out IntPtr ppWlanBssList); + + [DllImport("wlanapi.dll")] + private static extern uint WlanEnumInterfaces(IntPtr hClientHandle, IntPtr pReserved, + out IntPtr ppInterfaceList); + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + private struct WLAN_INTERFACE_INFO + { + public Guid InterfaceGuid; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] + public string strInterfaceDescription; + + public uint isState; + } + + [StructLayout(LayoutKind.Sequential)] + private struct DOT11_SSID + { + public uint uSSIDLength; + + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] + public byte[] ucSSID; + } + + [StructLayout(LayoutKind.Sequential)] + private struct WLAN_RATE_SET + { + public uint uRateSetLength; + + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 126)] + public ushort[] usRateSet; + } + + /// + /// Mirror of the native WLAN_BSS_ENTRY structure. Only , + /// and are used; the remaining fields are + /// required so the layout (and therefore ) matches the + /// native struct exactly. + /// + [StructLayout(LayoutKind.Sequential)] + private struct WLAN_BSS_ENTRY + { + public DOT11_SSID dot11Ssid; + public uint uPhyId; + + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] + public byte[] dot11Bssid; + + public uint dot11BssType; + public uint dot11BssPhyType; + public int lRssi; + public uint uLinkQuality; + + // Native type is BOOLEAN (1 byte), not BOOL (4 bytes). + [MarshalAs(UnmanagedType.U1)] + public bool bInRegDomain; + + public ushort usBeaconPeriod; + public ulong ullTimestamp; + public ulong ullHostTimestamp; + public ushort usCapabilityInformation; + public uint ulChCenterFrequency; + public WLAN_RATE_SET wlanRateSet; + public uint ulIeOffset; + public uint ulIeSize; + } + + /// + /// Returns a map of BSSID (lowercase, colon-separated, e.g. aa:bb:cc:dd:ee:ff) to the + /// channel bandwidth in MHz for all access points visible to the given Wi-Fi interface. + /// BSSIDs whose width could not be parsed are omitted from the result. + /// + /// GUID of the Wi-Fi interface (NetworkAdapter.NetworkAdapterId). + /// A (possibly empty) map of BSSID to channel bandwidth in MHz. + public static Dictionary GetBssChannelWidths(Guid interfaceGuid) + { + var result = new Dictionary(StringComparer.OrdinalIgnoreCase); + + var clientHandle = IntPtr.Zero; + + try + { + var ret = WlanOpenHandle(WlanApiVersion2, IntPtr.Zero, out _, out clientHandle); + + if (ret != ErrorSuccess) + { + Log.Warn($"WlanOpenHandle failed with error code {ret}."); + return result; + } + + // The WinRT NetworkAdapterId normally matches the native WLAN interface GUID. If it does + // not (driver/OS specifics), fall back to enumerating all WLAN interfaces and merging + // their BSS lists (matching is done by BSSID, so mixing interfaces is harmless). + if (!TryQueryBssList(clientHandle, interfaceGuid, result)) + foreach (var guid in EnumerateInterfaces(clientHandle)) + TryQueryBssList(clientHandle, guid, result); + } + catch (Exception ex) + { + Log.Error("Error while reading the Wi-Fi BSS list via wlanapi.dll.", ex); + } + finally + { + if (clientHandle != IntPtr.Zero) + WlanCloseHandle(clientHandle, IntPtr.Zero); + } + + return result; + } + + /// + /// Queries the BSS list for a single WLAN interface and adds the parsed channel widths to + /// . Returns if the query succeeded. + /// + private static bool TryQueryBssList(IntPtr clientHandle, Guid interfaceGuid, Dictionary result) + { + var bssListPtr = IntPtr.Zero; + + try + { + var guid = interfaceGuid; + + var ret = WlanGetNetworkBssList(clientHandle, ref guid, IntPtr.Zero, DOT11_BSS_TYPE.Any, false, + IntPtr.Zero, out bssListPtr); + + if (ret != ErrorSuccess || bssListPtr == IntPtr.Zero) + { + Log.Warn($"WlanGetNetworkBssList failed with error code {ret}."); + return false; + } + + // WLAN_BSS_LIST: DWORD dwTotalSize; DWORD dwNumberOfItems; WLAN_BSS_ENTRY[] entries. + // The entry array starts after the two DWORDs (8-byte aligned). + var totalSize = (long)(uint)Marshal.ReadInt32(bssListPtr, 0); + var numberOfItems = Marshal.ReadInt32(bssListPtr, 4); + var entrySize = Marshal.SizeOf(); + + for (var i = 0; i < numberOfItems; i++) + { + var entryByteOffset = 8 + i * entrySize; + var entry = Marshal.PtrToStructure(IntPtr.Add(bssListPtr, entryByteOffset)); + + // Skip invalid entries and guard against reading outside the allocated buffer + // (defensive: a struct layout mismatch would otherwise risk an invalid read). + // The documented maximum IE data blob size is 2,324 bytes. + if (entry.dot11Bssid is not { Length: 6 } || entry.ulIeSize is 0 or > 2324 || entry.ulIeOffset == 0) + continue; + + var ieStart = entryByteOffset + (long)entry.ulIeOffset; + + if (ieStart + entry.ulIeSize > totalSize) + continue; + + var ieSize = (int)entry.ulIeSize; // safe: guarded to <= 2324 above + + var ie = new byte[ieSize]; + Marshal.Copy(IntPtr.Add(bssListPtr, (int)ieStart), ie, 0, ieSize); + + var width = GetBandwidthFromInformationElements(ie); + + if (width > 0) + result[FormatBssid(entry.dot11Bssid)] = width; + } + + return true; + } + finally + { + if (bssListPtr != IntPtr.Zero) + WlanFreeMemory(bssListPtr); + } + } + + /// + /// Returns the GUIDs of all WLAN interfaces known to the native Wi-Fi service. + /// + private static List EnumerateInterfaces(IntPtr clientHandle) + { + var guids = new List(); + + var listPtr = IntPtr.Zero; + + try + { + if (WlanEnumInterfaces(clientHandle, IntPtr.Zero, out listPtr) != ErrorSuccess || listPtr == IntPtr.Zero) + return guids; + + // WLAN_INTERFACE_INFO_LIST: DWORD dwNumberOfItems; DWORD dwIndex; WLAN_INTERFACE_INFO[] entries. + var numberOfItems = Marshal.ReadInt32(listPtr, 0); + var infoSize = Marshal.SizeOf(); + var arrayPtr = IntPtr.Add(listPtr, 8); + + for (var i = 0; i < numberOfItems; i++) + { + var info = Marshal.PtrToStructure(IntPtr.Add(arrayPtr, i * infoSize)); + guids.Add(info.InterfaceGuid); + } + } + catch (Exception ex) + { + Log.Error("Error while enumerating Wi-Fi interfaces via wlanapi.dll.", ex); + } + finally + { + if (listPtr != IntPtr.Zero) + WlanFreeMemory(listPtr); + } + + return guids; + } + + /// + /// Walks the TLV-encoded 802.11 information elements and returns the widest channel + /// bandwidth (MHz) advertised by the HT-, VHT- or HE-Operation element. Returns 0 if none + /// of these elements are present. + /// + private static int GetBandwidthFromInformationElements(byte[] ie) + { + int htWidth = 0, vhtWidth = 0, heWidth = 0; + + var pos = 0; + + while (pos + 2 <= ie.Length) + { + var id = ie[pos]; + int len = ie[pos + 1]; + var data = pos + 2; + + if (data + len > ie.Length) + break; + + switch (id) + { + case EidHtOperation when len >= 2: + { + // HT Operation Information byte 0: bits 0-1 secondary channel offset, + // bit 2 STA channel width (0 = 20 MHz, 1 = any/40 MHz). + var info = ie[data + 1]; + var secondaryChannelOffset = info & 0x03; + var staChannelWidth = (info >> 2) & 0x01; + htWidth = staChannelWidth == 1 && secondaryChannelOffset != 0 ? 40 : 20; + break; + } + case EidVhtOperation when len >= 3: + vhtWidth = ParseVhtWidth(ie[data], ie[data + 1], ie[data + 2], htWidth); + break; + case EidExtension when len >= 1 && ie[data] == ExtEidHeOperation: + heWidth = ParseHeWidth(ie, data + 1, len - 1, htWidth); + break; + } + + pos = data + len; + } + + return Math.Max(htWidth, Math.Max(vhtWidth, heWidth)); + } + + /// + /// Resolves the channel width from a VHT-Operation channel-width field plus its two center + /// frequency segments. Falls back to when the VHT field signals + /// "20/40 MHz". + /// + private static int ParseVhtWidth(int channelWidth, int segment0, int segment1, int htWidth) + { + switch (channelWidth) + { + case 0: // 20/40 MHz -> defer to HT + return htWidth > 0 ? htWidth : 20; + case 1: // 80 MHz, unless the segments indicate 160 / 80+80 MHz + if (segment1 == 0) + return 80; + var diff = Math.Abs(segment0 - segment1); + return diff is 8 or > 16 ? 160 : 80; + case 2: // 160 MHz (deprecated encoding) + case 3: // 80+80 MHz (deprecated encoding) - treated as 160 MHz for display + return 160; + default: + return 80; + } + } + + /// + /// Parses the HE-Operation element (802.11ax). Optional sub-fields (VHT Operation + /// Information, 6 GHz Operation Information) are only present when the corresponding bit in + /// the HE Operation Parameters is set; their offsets therefore depend on the preceding + /// fields. This is a best-effort parse: on any ambiguity 0 is returned so the caller can + /// fall back to a heuristic. + /// + /// The full information element buffer. + /// Offset of the HE Operation Parameters (after the extension id byte). + /// Remaining length of the HE-Operation element after the extension id. + /// Width parsed from the HT-Operation element (used as VHT fallback). + private static int ParseHeWidth(byte[] ie, int offset, int length, int htWidth) + { + // HE Operation Parameters (3) + BSS Color (1) + Basic HE-MCS And NSS Set (2) = 6 bytes minimum. + if (length < 6) + return 0; + + var end = offset + length; + + // HE Operation Parameters bit layout: B14 VHT Operation Information Present, + // B15 Co-Hosted BSS, B16 ER SU Disable, B17 6 GHz Operation Information Present. + var heOperationParameters = ie[offset] | (ie[offset + 1] << 8) | (ie[offset + 2] << 16); + var vhtOperationInformationPresent = ((heOperationParameters >> 14) & 1) == 1; + var coHostedBss = ((heOperationParameters >> 15) & 1) == 1; + var sixGhzOperationInformationPresent = ((heOperationParameters >> 17) & 1) == 1; + + var cursor = offset + 3 + 1 + 2; // skip parameters, BSS color, basic HE-MCS + var width = 0; + + if (vhtOperationInformationPresent) + { + if (cursor + 3 <= end) + width = Math.Max(width, ParseVhtWidth(ie[cursor], ie[cursor + 1], ie[cursor + 2], htWidth)); + + cursor += 3; + } + + if (coHostedBss) + cursor += 1; + + if (sixGhzOperationInformationPresent && cursor + 2 <= end) + { + // 6 GHz Operation Information: Primary Channel (1), Control (1), ... + // Control byte bits 0-1 = channel width (0 = 20, 1 = 40, 2 = 80, 3 = 160/80+80 MHz). + var channelWidth = ie[cursor + 1] & 0x03; + var sixGhzWidth = channelWidth switch + { + 0 => 20, + 1 => 40, + 2 => 80, + 3 => 160, + _ => 0 + }; + width = Math.Max(width, sixGhzWidth); + } + + return width; + } + + /// + /// Formats a 6-byte BSSID into the lowercase, colon-separated representation used by the + /// Windows Runtime API (e.g. aa:bb:cc:dd:ee:ff). + /// + private static string FormatBssid(byte[] mac) + { + return $"{mac[0]:x2}:{mac[1]:x2}:{mac[2]:x2}:{mac[3]:x2}:{mac[4]:x2}:{mac[5]:x2}"; + } +} diff --git a/Source/NETworkManager.Models/PowerShell/ExecutionPolicy.cs b/Source/NETworkManager.Models/PowerShell/ExecutionPolicy.cs index 00d46fd406..46b82e87b5 100644 --- a/Source/NETworkManager.Models/PowerShell/ExecutionPolicy.cs +++ b/Source/NETworkManager.Models/PowerShell/ExecutionPolicy.cs @@ -1,14 +1,34 @@ -namespace NETworkManager.Models.PowerShell +namespace NETworkManager.Models.PowerShell; + +/// +/// Represents the execution policy for the current PowerShell session. +/// +public enum ExecutionPolicy { - public partial class PowerShell - { - public enum ExecutionPolicy - { - Restricted, - AllSigned, - RemoteSigned, - Unrestricted, - Bypass - } - } -} + /// + /// Restricted execution policy. No scripts can be run. Windows PowerShell can be used only in + /// interactive mode. + /// + Restricted, + + /// + /// AllSigned execution policy. Scripts can be run only if they are signed by a trusted publisher. + /// + AllSigned, + + /// + /// RemoteSigned execution policy. Scripts can be run only if they are signed by a trusted publisher + /// or if they were written on the local computer. + /// + RemoteSigned, + + /// + /// Unrestricted execution policy. No restrictions; all Windows PowerShell scripts can be run. + /// + Unrestricted, + + /// + /// Bypass execution policy. Nothing is blocked and there are no warnings or prompts. + /// + Bypass +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/PowerShell/PowerShell.cs b/Source/NETworkManager.Models/PowerShell/PowerShell.cs index edc5865ff3..06e2c3e119 100644 --- a/Source/NETworkManager.Models/PowerShell/PowerShell.cs +++ b/Source/NETworkManager.Models/PowerShell/PowerShell.cs @@ -1,15 +1,135 @@ -namespace NETworkManager.Models.PowerShell +using System; +using System.Collections.Generic; +using System.Linq; +using log4net; +using Microsoft.Win32; + +namespace NETworkManager.Models.PowerShell; + +/// +/// Class with static methods for PowerShell. +/// +public static class PowerShell { - public static partial class PowerShell + private static readonly ILog Log = LogManager.GetLogger(typeof(PowerShell)); + + /// + /// Windows PowerShell file name. + /// + public const string WindowsPowerShellFileName = "powershell.exe"; + + /// + /// PowerShell Core file name. + /// + public const string PwshFileName = "pwsh.exe"; + + /// + /// Default SZ registry keys for the global PowerShell profile. + /// + private static readonly List> DefaultProfileRegkeysSzBase = + [ + new("FaceName", "Consolas") + ]; + + /// + /// Default DWORD registry keys for the global PowerShell profile. + /// + private static readonly List> DefaultProfileRegkeysDwordBase = + [ + new("CursorType", 1), + new("FontFamily", 54), // 36 + new("FontSize", 1179648), // 120000 + new("FontWeight", 400) // 190 + ]; + + /// + /// Default DWORD registry keys for the global PowerShell profile to delete. + /// + private static readonly List DefaultProfileRegkeysDwordDelete = [ + "ScreenColors" + ]; + + /// + /// Default DWORD registry keys for the global PowerShell profile with dark theme. + /// + /// List of with registry key name and value. + private static List> GetProfileRegkeysDwordDark() + { + return DefaultProfileRegkeysDwordBase.Concat( + [ + new Tuple("DefaultBackground", 2434341), // HEX: 252525 + new Tuple("ColorTable00", 2434341), // HEX: 252525 + new Tuple("ColorTable07", 13421772) // HEX: cccccc + ]).ToList(); + } + + /// + /// Default DWORD registry keys for the global PowerShell profile with white theme. + /// + /// List of with registry key name and value. + private static List> GetProfileRegkeysDwordWhite() + { + return DefaultProfileRegkeysDwordBase.Concat( + [ + new Tuple("DefaultBackground", 16777215), // HEX: FFFFFF + new Tuple("ColorTable00", 16777215), // HEX: FFFFFF + new Tuple("ColorTable07", 2434341) // HEX: 252525 + ]).ToList(); + } + + /// + /// Write default (global) PowerShell profile to registry. + /// + /// Theme of the PowerShell profile. + /// Path to the PowerShell executable. + public static void WriteDefaultProfileToRegistry(string theme, string powerShellPath) { - public static string BuildCommandLine(PowerShellSessionInfo sessionInfo) + var registryPath = @"Console\"; + + var systemRoot = Environment.ExpandEnvironmentVariables("%SystemRoot%"); + + // Windows PowerShell --> HKCU:\Console\%SystemRoot%_System32_WindowsPowerShell_v1.0_powershell.exe + if (powerShellPath.StartsWith(systemRoot)) + registryPath += "%SystemRoot%" + powerShellPath.Substring(systemRoot.Length, powerShellPath.Length - systemRoot.Length).Replace(@"\", "_"); + // PWSH --> HKCU:\Console\C:_Program Files_PowerShell_7_pwsh.exe + else + registryPath += powerShellPath.Replace(@"\", "_"); + + Log.Info($"Registry path for PowerShell profile: \"{registryPath}\""); + + var registryKey = Registry.CurrentUser.OpenSubKey(registryPath, true); + + registryKey ??= Registry.CurrentUser.CreateSubKey(registryPath); + + if (registryKey != null) { - var command = $"-ExecutionPolicy {sessionInfo.ExecutionPolicy} {sessionInfo.AdditionalCommandLine}"; + foreach (var item in theme == "Dark" ? GetProfileRegkeysDwordDark() : GetProfileRegkeysDwordWhite()) + registryKey.SetValue(item.Item1, item.Item2); - if (sessionInfo.EnableRemoteConsole) - command += $" -NoExit -Command \"Enter-PSSession -ComputerName {sessionInfo.Host}\""; + foreach (var item in DefaultProfileRegkeysSzBase) + registryKey.SetValue(item.Item1, item.Item2); - return command; + foreach (var item in DefaultProfileRegkeysDwordDelete) registryKey.DeleteValue(item, false); } + + registryKey?.Close(); + } + + /// + /// Build command line arguments based on a . + /// + /// Instance of . + /// Command line arguments like "-NoExit -ExecutionPolicy RemoteSigned ...". + public static string BuildCommandLine(PowerShellSessionInfo sessionInfo) + { + var command = $"-NoExit -ExecutionPolicy {sessionInfo.ExecutionPolicy} {sessionInfo.AdditionalCommandLine}"; + + // Connect to remote host or execute local command if configured + if (sessionInfo.EnableRemoteConsole) + command += $" -Command \"& {{Enter-PSSession -ComputerName {sessionInfo.Host}}}\""; + else if (!string.IsNullOrEmpty(sessionInfo.Command)) + command += $" -Command \"& {{{sessionInfo.Command}}}\""; + + return command; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/PowerShell/PowerShellSessionInfo.cs b/Source/NETworkManager.Models/PowerShell/PowerShellSessionInfo.cs index f03c6fd1b8..fdd2a99159 100644 --- a/Source/NETworkManager.Models/PowerShell/PowerShellSessionInfo.cs +++ b/Source/NETworkManager.Models/PowerShell/PowerShellSessionInfo.cs @@ -1,18 +1,37 @@ -using static NETworkManager.Models.PowerShell.PowerShell; +namespace NETworkManager.Models.PowerShell; -namespace NETworkManager.Models.PowerShell +/// +/// Class to store information's about a PowerShell session +/// +public class PowerShellSessionInfo { - public class PowerShellSessionInfo - { - public string ApplicationFilePath { get; set; } - public bool EnableRemoteConsole { get; set; } - public string Host { get; set; } - public string AdditionalCommandLine { get; set; } - public ExecutionPolicy ExecutionPolicy { get; set; } + /// + /// Path to the PowerShell executable. + /// + public string ApplicationFilePath { get; set; } - public PowerShellSessionInfo() - { + /// + /// Enable the remote console. + /// + public bool EnableRemoteConsole { get; set; } - } - } -} + /// + /// Host to connect to. + /// + public string Host { get; set; } + + /// + /// Command to execute. + /// + public string Command { get; set; } + + /// + /// Additional command line arguments. + /// + public string AdditionalCommandLine { get; set; } + + /// + /// Execution policy to use. + /// + public ExecutionPolicy ExecutionPolicy { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Properties/AssemblyInfo.cs b/Source/NETworkManager.Models/Properties/AssemblyInfo.cs index f5680bbe85..c9209bc375 100644 --- a/Source/NETworkManager.Models/Properties/AssemblyInfo.cs +++ b/Source/NETworkManager.Models/Properties/AssemblyInfo.cs @@ -4,7 +4,5 @@ [assembly: AssemblyTitle("NETworkManager.Models")] [assembly: AssemblyDescription("Library contains NETworkManager models.")] [assembly: AssemblyProduct("NETworkManager.Models")] - [assembly: ComVisible(false)] - [assembly: Guid("8a2859dc-38b6-4e9d-a6b2-1828dc6641b3")] \ No newline at end of file diff --git a/Source/NETworkManager.Models/PuTTY/ConnectionMode.cs b/Source/NETworkManager.Models/PuTTY/ConnectionMode.cs index 78ee292545..1c076a53b9 100644 --- a/Source/NETworkManager.Models/PuTTY/ConnectionMode.cs +++ b/Source/NETworkManager.Models/PuTTY/ConnectionMode.cs @@ -1,33 +1,32 @@ -namespace NETworkManager.Models.PuTTY +namespace NETworkManager.Models.PuTTY; + +/// +/// Connection modes for PuTTY. +/// +public enum ConnectionMode { /// - /// Connection modes for PuTTY. + /// SSH connection. /// - public enum ConnectionMode - { - /// - /// SSH connection. - /// - SSH, + SSH, - /// - /// Telnet connection. - /// - Telnet, + /// + /// Telnet connection. + /// + Telnet, - /// - /// Serial connection. - /// - Serial, + /// + /// Serial connection. + /// + Serial, - /// - /// Rlogin connection. - /// - Rlogin, + /// + /// Rlogin connection. + /// + Rlogin, - /// - /// RAW connection. - /// - RAW - } -} + /// + /// RAW connection. + /// + RAW +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/PuTTY/LogMode.cs b/Source/NETworkManager.Models/PuTTY/LogMode.cs index 2114e92048..c7d904aa9e 100644 --- a/Source/NETworkManager.Models/PuTTY/LogMode.cs +++ b/Source/NETworkManager.Models/PuTTY/LogMode.cs @@ -1,23 +1,22 @@ -namespace NETworkManager.Models.PuTTY +namespace NETworkManager.Models.PuTTY; + +/// +/// Logging modes for PuTTY. +/// +public enum LogMode { /// - /// Logging modes for PuTTY. + /// All session output will be logged. /// - public enum LogMode - { - /// - /// All session output will be logged. - /// - SessionLog, + SessionLog, - /// - /// SSH packages will be logged. - /// - SSHLog, + /// + /// SSH packages will be logged. + /// + SSHLog, - /// - /// SSH packages and raw data will be logged. - /// - SSHRawLog - } -} + /// + /// SSH packages and raw data will be logged. + /// + SSHRawLog +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/PuTTY/PuTTY.cs b/Source/NETworkManager.Models/PuTTY/PuTTY.cs index 5cb49a4614..645a5dc2bb 100644 --- a/Source/NETworkManager.Models/PuTTY/PuTTY.cs +++ b/Source/NETworkManager.Models/PuTTY/PuTTY.cs @@ -1,167 +1,203 @@ -using Microsoft.Win32; -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; +using Microsoft.Win32; +using NETworkManager.Utilities; -namespace NETworkManager.Models.PuTTY +namespace NETworkManager.Models.PuTTY; + +/// +/// Class control PuTTY. +/// +public static class PuTTY { /// - /// Class control PuTTY. + /// PuTTY file name. /// - public partial class PuTTY - { - private static List> DefaultProfileRegkeysSZBase = new() - { - new Tuple("Colour1", "255,255,255"), - new Tuple("Colour3", "85,85,85"), - new Tuple("Colour4", "0,0,0"), - new Tuple("Colour5", "0,255,0"), - new Tuple("Colour6", "0,0,0"), - new Tuple("Colour7", "85,85,85"), - new Tuple("Colour8", "187,0,0"), - new Tuple("Colour9", "255,85,85"), - new Tuple("Colour10", "0,187,0"), - new Tuple("Colour11", "85,255,85"), - new Tuple("Colour12", "187,187,0"), - new Tuple("Colour13", "255,255,85"), - new Tuple("Colour14", "0,0,187"), - new Tuple("Colour15", "85,85,255"), - new Tuple("Colour16", "187,0,187"), - new Tuple("Colour17", "255,85,255"), - new Tuple("Colour18", "0,187,187"), - new Tuple("Colour19", "85,255,255"), - new Tuple("Colour20", "187,187,187"), - new Tuple("Colour21", "255,255,255"), - new Tuple("LineCodePage", "UTF-8"), - new Tuple("Font", "Consolas") - }; - - private static List> GetProfileRegkeysSZDark() - { - return DefaultProfileRegkeysSZBase.Concat( - new[] { - // new Tuple("Colour0", "255,255,255"), - new Tuple("Colour0", "187,187,187"), // Foreground - new Tuple("Colour2", "37,37,37") // Background - }).ToList(); - } + public const string FileName = "putty.exe"; - private static List> GetProfileRegkeysSZWhite() - { - return DefaultProfileRegkeysSZBase.Concat( - new[] { - // new Tuple("Colour0", "68,68,68"), - new Tuple("Colour0", "0,0,0"), // Foreground - new Tuple("Colour2", "255,255,255") // Background - }).ToList(); - } + /// + /// Default SZ registry keys for PuTTY profile NETworkManager. + /// + private static readonly List> DefaultProfileRegkeysSzBase = + [ + new("Colour1", "255,255,255"), + new("Colour3", "85,85,85"), + new("Colour4", "0,0,0"), + new("Colour5", "0,255,0"), + new("Colour6", "0,0,0"), + new("Colour7", "85,85,85"), + new("Colour8", "187,0,0"), + new("Colour9", "255,85,85"), + new("Colour10", "0,187,0"), + new("Colour11", "85,255,85"), + new("Colour12", "187,187,0"), + new("Colour13", "255,255,85"), + new("Colour14", "0,0,187"), + new("Colour15", "85,85,255"), + new("Colour16", "187,0,187"), + new("Colour17", "255,85,255"), + new("Colour18", "0,187,187"), + new("Colour19", "85,255,255"), + new("Colour20", "187,187,187"), + new("Colour21", "255,255,255"), + new("LineCodePage", "UTF-8"), + new("Font", "Consolas") + ]; - private static List> DefaultProfileRegkeysDword = new() - { - new Tuple("CurType", 2), - new Tuple("FontHeight", 12), - new Tuple("BlinkCur", 1), - new Tuple("ScrollBar", 0) - }; - - /// - /// Build command line arguments based on a . - /// - /// Instance of . - /// Command line arguments like "-ssh -l root -i C:\data\key.ppk" - public static string BuildCommandLine(PuTTYSessionInfo sessionInfo) - { - var command = string.Empty; + /// + /// Default DWORD registry keys for PuTTY profile NETworkManager. + /// + private static readonly List> DefaultProfileRegkeysDwordBase = + [ + new("CurType", 2), + new("FontHeight", 12), + new("BlinkCur", 1), + new("ScrollBar", 0) + ]; - // Protocol - switch (sessionInfo.Mode) - { - case ConnectionMode.SSH: - command += "-ssh"; - break; - case ConnectionMode.Telnet: - command += "-telnet"; - break; - case ConnectionMode.Serial: - command += "-serial"; - break; - case ConnectionMode.Rlogin: - command += "-rlogin"; - break; - case ConnectionMode.RAW: - command += "-raw"; - break; - } + /// + /// SZ registry keys for PuTTY profile NETworkManager if app theme is dark. + /// + /// List with SZ registry keys. + private static List> GetProfileRegkeysSzDark() + { + return DefaultProfileRegkeysSzBase.Concat( + [ + // new Tuple("Colour0", "255,255,255"), + new Tuple("Colour0", "187,187,187"), // Foreground + new Tuple("Colour2", "37,37,37") // Background + ]).ToList(); + } - // Username - if (!string.IsNullOrEmpty(sessionInfo.Username)) - command += $" -l {sessionInfo.Username}"; + /// + /// SZ registry keys for PuTTY profile NETworkManager if app theme is white. + /// + /// List with DWORD registry keys. + private static List> GetProfileRegkeysSzWhite() + { + return DefaultProfileRegkeysSzBase.Concat( + [ + // new Tuple("Colour0", "68,68,68"), + new Tuple("Colour0", "0,0,0"), // Foreground + new Tuple("Colour2", "255,255,255") // Background + ]).ToList(); + } - // Private key - if (!string.IsNullOrEmpty(sessionInfo.PrivateKey)) - command += $" -i {'"'}{sessionInfo.PrivateKey}{'"'}"; + /// + /// Write the default PuTTY profile NETworkManager to the registry. + /// HKCU\Software\SimonTatham\PuTTY\Sessions\NETworkManager + /// + /// Current application theme to adjust the PuTTY colors + public static void WriteDefaultProfileToRegistry(string theme) + { + var profilePath = @"Software\SimonTatham\PuTTY\Sessions\NETworkManager"; - // Profile - if (!string.IsNullOrEmpty(sessionInfo.Profile)) - command += $" -load {'"'}{sessionInfo.Profile}{'"'}"; + var registryKey = Registry.CurrentUser.OpenSubKey(profilePath, true); - // Log - if (sessionInfo.EnableLog) - { - switch (sessionInfo.LogMode) - { - case LogMode.SessionLog: - command += $" -sessionlog"; - break; - case LogMode.SSHLog: - command += $" -sshlog"; - break; - case LogMode.SSHRawLog: - command += $" -sshrawlog"; - break; - } - - command += $" {'"'}{ Environment.ExpandEnvironmentVariables(Path.Combine(sessionInfo.LogPath, sessionInfo.LogFileName))}{'"'}"; - } + registryKey ??= Registry.CurrentUser.CreateSubKey(profilePath); - // Additional commands - if (!string.IsNullOrEmpty(sessionInfo.AdditionalCommandLine)) - command += $" {sessionInfo.AdditionalCommandLine}"; + if (registryKey != null) + { + foreach (var item in theme == "Dark" ? GetProfileRegkeysSzDark() : GetProfileRegkeysSzWhite()) + registryKey.SetValue(item.Item1, item.Item2); - // SerialLine, Baud - if (sessionInfo.Mode == ConnectionMode.Serial) - command += $" {sessionInfo.HostOrSerialLine} -sercfg {sessionInfo.PortOrBaud}"; + foreach (var item in DefaultProfileRegkeysDwordBase) + registryKey.SetValue(item.Item1, item.Item2); + } - // Port, Host - if (sessionInfo.Mode != ConnectionMode.Serial) - command += $" -P {sessionInfo.PortOrBaud} {sessionInfo.HostOrSerialLine}"; + registryKey.Close(); + } - return command; - } + /// + /// Build command line arguments based on a . + /// + /// Instance of . + /// Command line arguments like "-ssh -l root -i C:\data\key.ppk". + public static string BuildCommandLine(PuTTYSessionInfo sessionInfo) + { + var command = string.Empty; - /// - /// - /// - public static void WriteDefaultProfileToRegistry(string AccentName) + // PuTTY Profile + if (!string.IsNullOrEmpty(sessionInfo.Profile)) + command += $"-load \"{sessionInfo.Profile}\""; + + // Protocol + switch (sessionInfo.Mode) { - string profilePath = @"Software\SimonTatham\PuTTY\Sessions\NETworkManager"; + case ConnectionMode.SSH: + command += " -ssh"; + break; + case ConnectionMode.Telnet: + command += " -telnet"; + break; + case ConnectionMode.Serial: + command += " -serial"; + break; + case ConnectionMode.Rlogin: + command += " -rlogin"; + break; + case ConnectionMode.RAW: + command += " -raw"; + break; + } - RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(profilePath, true); + // Username + if (new[] { ConnectionMode.SSH, ConnectionMode.Telnet, ConnectionMode.Rlogin }.Contains(sessionInfo.Mode) && + !string.IsNullOrEmpty(sessionInfo.Username)) + command += $" -l {sessionInfo.Username}"; - if (registryKey == null) - registryKey = Registry.CurrentUser.CreateSubKey(profilePath); + // SSH specific settings + if (sessionInfo.Mode == ConnectionMode.SSH) + { + // Private key + if (!string.IsNullOrEmpty(sessionInfo.PrivateKey)) + command += $" -i \"{sessionInfo.PrivateKey}\""; - if (registryKey != null) + // Hostkey(s) + if (sessionInfo.Mode == ConnectionMode.SSH && !string.IsNullOrEmpty(sessionInfo.Hostkey)) { - foreach (Tuple key in AccentName == "Dark" ? GetProfileRegkeysSZDark() : GetProfileRegkeysSZWhite()) - registryKey.SetValue(key.Item1, key.Item2); + var hostkeys = StringHelper.RemoveWhitespace(sessionInfo.Hostkey) + .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); - foreach (var key in DefaultProfileRegkeysDword) - registryKey.SetValue(key.Item1, key.Item2); + foreach (var hostkey in hostkeys) + command += $" -hostkey \"{hostkey}\""; + } + } + + // Log + if (sessionInfo.EnableLog) + { + switch (sessionInfo.LogMode) + { + case LogMode.SessionLog: + command += " -sessionlog"; + break; + case LogMode.SSHLog: + command += " -sshlog"; + break; + case LogMode.SSHRawLog: + command += " -sshrawlog"; + break; } - registryKey.Close(); + command += + $" \"{Environment.ExpandEnvironmentVariables(Path.Combine(sessionInfo.LogPath, sessionInfo.LogFileName))}\""; } + + // Additional command line + if (!string.IsNullOrEmpty(sessionInfo.AdditionalCommandLine)) + command += $" {sessionInfo.AdditionalCommandLine}"; + + // SerialLine, Baud + if (sessionInfo.Mode == ConnectionMode.Serial) + command += $" {sessionInfo.HostOrSerialLine} -sercfg {sessionInfo.PortOrBaud}"; + + // Port, Host + if (sessionInfo.Mode != ConnectionMode.Serial) + command += $" -P {sessionInfo.PortOrBaud} {sessionInfo.HostOrSerialLine}"; + + return command; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/PuTTY/PuTTYSessionInfo.cs b/Source/NETworkManager.Models/PuTTY/PuTTYSessionInfo.cs index a2332c6069..96de2038f4 100644 --- a/Source/NETworkManager.Models/PuTTY/PuTTYSessionInfo.cs +++ b/Source/NETworkManager.Models/PuTTY/PuTTYSessionInfo.cs @@ -1,76 +1,79 @@ -namespace NETworkManager.Models.PuTTY +namespace NETworkManager.Models.PuTTY; + +/// +/// Class contains information's about a PuTTY session. +/// +public class PuTTYSessionInfo { /// - /// Stores informations about a PuTTY session. + /// Create an instance of . /// - public class PuTTYSessionInfo + public PuTTYSessionInfo() { - /// - /// Full path to the PuTTY.exe on the filesystem. - /// - public string ApplicationFilePath { get; set; } + } - /// - /// Mode (SSH, Telnet, etc.), which is used to establish the connection. - /// - public ConnectionMode Mode { get; set; } + /// + /// Path to the PuTTY executable. + /// + public string ApplicationFilePath { get; set; } - /// - /// Hostname or SerialLine. Depends on the . - /// - public string HostOrSerialLine { get; set; } + /// + /// Mode (SSH, Telnet, etc.), which is used to establish the connection. + /// + public ConnectionMode Mode { get; init; } - /// - /// Port or Baud. Depends on the . - /// - public int PortOrBaud { get; set; } + /// + /// Hostname or SerialLine. Depends on the . + /// + public string HostOrSerialLine { get; init; } - /// - /// Username for login. - /// - public string Username { get; set; } + /// + /// Port or Baud. Depends on the . + /// + public int PortOrBaud { get; init; } - /// - /// Path to the private key. - /// - public string PrivateKey { get; set; } + /// + /// Username for login. + /// + public string Username { get; init; } - /// - /// PuTTY profile to use. - /// - public string Profile { get; set; } + /// + /// Path to the private key. + /// + public string PrivateKey { get; init; } - /// - /// Enables session log. - /// - public bool EnableLog { get; set; } + /// + /// PuTTY profile to use. + /// + public string Profile { get; init; } - /// - /// PuTTY log mode. - /// - public LogMode LogMode { get; set; } + /// + /// PuTTY host key. Multiple keys are separated by a comma. + /// + public string Hostkey { get; init; } - /// - /// Path to the PuTTY log files like "C:\temp". - /// - public string LogPath { get; set; } + /// + /// Enables session log. + /// + public bool EnableLog { get; init; } - /// - /// Filename of the PuTTY log like "PuTTY.log". - /// - public string LogFileName { get; set; } + /// + /// PuTTY log mode. + /// + public LogMode LogMode { get; init; } - /// - /// Additional command line argument. Everything putty can handle. - /// - public string AdditionalCommandLine { get; set; } + /// + /// Path to the PuTTY log files like "C:\temp". + /// + public string LogPath { get; init; } - /// - /// Create an instance of . - /// - public PuTTYSessionInfo() - { + /// + /// Filename of the PuTTY log like "PuTTY.log". + /// + public string LogFileName { get; init; } - } - } -} + /// + /// Additional command line argument. Everything putty can handle. + /// + public string AdditionalCommandLine { get; init; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/RemoteDesktop/AudioCaptureRedirectionMode.cs b/Source/NETworkManager.Models/RemoteDesktop/AudioCaptureRedirectionMode.cs index ccd7863caf..7c88a2a18a 100644 --- a/Source/NETworkManager.Models/RemoteDesktop/AudioCaptureRedirectionMode.cs +++ b/Source/NETworkManager.Models/RemoteDesktop/AudioCaptureRedirectionMode.cs @@ -1,19 +1,19 @@ -namespace NETworkManager.Models.RemoteDesktop +namespace NETworkManager.Models.RemoteDesktop; + +/// +/// Represents whether the default audio input is redirected from the client to the remote session. +/// See also: +/// https://docs.microsoft.com/en-us/windows/win32/termserv/imsrdpclientadvancedsettings7-audiocaptureredirectionmode +/// +public enum AudioCaptureRedirectionMode { /// - /// Represents whether the default audio input is redirected from the client to the remote session. - /// See also: https://docs.microsoft.com/en-us/windows/win32/termserv/imsrdpclientadvancedsettings7-audiocaptureredirectionmode + /// Redirect the default audio input device to the remote session. /// - public enum AudioCaptureRedirectionMode - { - /// - /// Redirect the default audio input device to the remote session. - /// - RecordFromThisComputer, + RecordFromThisComputer, - /// - /// Don't redirect the default audio input device to the remote session. - /// - DoNotRecord - } -} + /// + /// Don't redirect the default audio input device to the remote session. + /// + DoNotRecord +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/RemoteDesktop/AudioRedirectionMode.cs b/Source/NETworkManager.Models/RemoteDesktop/AudioRedirectionMode.cs index 4727f0610e..6b2c30d809 100644 --- a/Source/NETworkManager.Models/RemoteDesktop/AudioRedirectionMode.cs +++ b/Source/NETworkManager.Models/RemoteDesktop/AudioRedirectionMode.cs @@ -1,24 +1,24 @@ -namespace NETworkManager.Models.RemoteDesktop +namespace NETworkManager.Models.RemoteDesktop; + +/// +/// Represents the audio redirection mode and different audio redirection options. +/// See also: +/// https://docs.microsoft.com/en-us/windows/win32/termserv/imsrdpclientadvancedsettings5-audioredirectionmode +/// +public enum AudioRedirectionMode { /// - /// Represents the audio redirection mode and different audio redirection options. - /// See also: https://docs.microsoft.com/en-us/windows/win32/termserv/imsrdpclientadvancedsettings5-audioredirectionmode + /// Audio redirection is enabled and the option for redirection is "Bring to this computer". This is the default mode. /// - public enum AudioRedirectionMode - { - /// - /// Audio redirection is enabled and the option for redirection is "Bring to this computer". This is the default mode. - /// - PlayOnThisComputer, + PlayOnThisComputer, - /// - /// Audio redirection is enabled and the option is "Leave at remote computer" - /// - PlayOnRemoteComputer, + /// + /// Audio redirection is enabled and the option is "Leave at remote computer" + /// + PlayOnRemoteComputer, - /// - /// Audio redirection is enabled and the mode is "Do not play". - /// - DoNotPlay - } -} + /// + /// Audio redirection is enabled and the mode is "Do not play". + /// + DoNotPlay +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/RemoteDesktop/GatewayProfileUsageMethod.cs b/Source/NETworkManager.Models/RemoteDesktop/GatewayProfileUsageMethod.cs new file mode 100644 index 0000000000..f3f8f434f2 --- /dev/null +++ b/Source/NETworkManager.Models/RemoteDesktop/GatewayProfileUsageMethod.cs @@ -0,0 +1,17 @@ +namespace NETworkManager.Models.RemoteDesktop; + +/// +/// The RD Gateway profile usage method. +/// +public enum GatewayProfileUsageMethod : uint +{ + /// + /// Use the default profile mode, as specified by the administrator. + /// + Default = 0, + + /// + /// Use explicit settings, as specified by the user. + /// + Explicit = 1 +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/RemoteDesktop/GatewayUsageMethod.cs b/Source/NETworkManager.Models/RemoteDesktop/GatewayUsageMethod.cs new file mode 100644 index 0000000000..f52abe46fc --- /dev/null +++ b/Source/NETworkManager.Models/RemoteDesktop/GatewayUsageMethod.cs @@ -0,0 +1,38 @@ +namespace NETworkManager.Models.RemoteDesktop; + +/// +/// Specifies the RD Gateway server usage method. +/// Docs: https://learn.microsoft.com/en-us/windows/win32/termserv/imsrdpclienttransportsettings-gatewayusagemethod +/// +public enum GatewayUsageMethod : uint +{ + /// + /// Do not use an RD Gateway server. In the Remote Desktop Connection (RDC) client UI, + /// the Bypass RD Gateway server for local addresses check box is cleared. + /// + NoneDirect = 0, + + /// + /// Always use an RD Gateway server. In the RDC client UI, the Bypass RD Gateway server + /// for local addresses check box is cleared. + /// + Direct = 1, + + /// + /// Use an RD Gateway server if a direct connection cannot be made to the RD Session + /// Host server. In the RDC client UI, the Bypass RD Gateway server for local addresses + /// check box is selected. + /// + Detect = 2, + + /// + /// Use the default RD Gateway server settings. + /// + Default = 3, + + /// + /// Do not use an RD Gateway server. In the RDC client UI, the Bypass RD Gateway server + /// for local addresses check box is selected. + /// + NoneDetect = 4 +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/RemoteDesktop/GatewayUserSelectedCredsSource.cs b/Source/NETworkManager.Models/RemoteDesktop/GatewayUserSelectedCredsSource.cs new file mode 100644 index 0000000000..3fac2d2b14 --- /dev/null +++ b/Source/NETworkManager.Models/RemoteDesktop/GatewayUserSelectedCredsSource.cs @@ -0,0 +1,25 @@ +namespace NETworkManager.Models.RemoteDesktop; + +/// +/// Specifies the RD Gateway authentication method. +/// Docs: +/// https://learn.microsoft.com/en-us/windows/win32/termserv/imsrdpclienttransportsettings-gatewayuserselectedcredssource +/// +public enum GatewayUserSelectedCredsSource : uint +{ + /// + /// Use a password (NTLM) as the authentication method for RD Gateway. + /// + Userpass, + + /// + /// Use a smart card as the authentication method for RD Gateway. + /// Should also support Windows Hello for Business. + /// + Smartcard, + + /// + /// Use any authentication method for RD Gateway. + /// + Any +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/RemoteDesktop/KeyboardHookMode.cs b/Source/NETworkManager.Models/RemoteDesktop/KeyboardHookMode.cs index 89ababf483..eb90ee78ec 100644 --- a/Source/NETworkManager.Models/RemoteDesktop/KeyboardHookMode.cs +++ b/Source/NETworkManager.Models/RemoteDesktop/KeyboardHookMode.cs @@ -1,22 +1,22 @@ -namespace NETworkManager.Models.RemoteDesktop +namespace NETworkManager.Models.RemoteDesktop; + +/// +/// Represents the keyboard redirection settings, which specify how and when to apply Windows keyboard shortcut (for +/// example, ALT+TAB). +/// See also: https://docs.microsoft.com/en-us/windows/win32/termserv/imsrdpclientsecuredsettings-keyboardhookmode +/// +public enum KeyboardHookMode { /// - /// Represents the keyboard redirection settings, which specify how and when to apply Windows keyboard shortcut (for example, ALT+TAB). - /// See also: https://docs.microsoft.com/en-us/windows/win32/termserv/imsrdpclientsecuredsettings-keyboardhookmode + /// Apply key combinations only locally at the client computer. /// - public enum KeyboardHookMode - { - /// - /// Apply key combinations only locally at the client computer. - /// - OnThisComputer, + OnThisComputer, - /// - /// Apply key combinations at the remote server. - /// - OnTheRemoteComputer, + /// + /// Apply key combinations at the remote server. + /// + OnTheRemoteComputer - // Apply key combinations to the remote server only when the client is running in full-screen mode. - //OnlyWhenUsingTheFullScreen - } -} + // Apply key combinations to the remote server only when the client is running in full-screen mode. + //OnlyWhenUsingTheFullScreen +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/RemoteDesktop/Keystroke.cs b/Source/NETworkManager.Models/RemoteDesktop/Keystroke.cs index 5b880fc040..28b5cc6c2b 100644 --- a/Source/NETworkManager.Models/RemoteDesktop/Keystroke.cs +++ b/Source/NETworkManager.Models/RemoteDesktop/Keystroke.cs @@ -1,13 +1,37 @@ -namespace NETworkManager.Models.RemoteDesktop +namespace NETworkManager.Models.RemoteDesktop; + +/// +/// Represents keystrokes which can be send into the remote session. +/// +public enum Keystroke { /// - /// Represents keystrokes which can be send into the remote session. + /// Ctrl + Alt + Del keystroke. /// - public enum Keystroke - { - /// - /// Ctrl + Alt + Del keystroke. - /// - CtrlAltDel - } -} + CtrlAltDel, + + /// + /// Ctrl + Shift + Esc keystroke (opens Task Manager). + /// + TaskManager, + + /// + /// Win + L keystroke (locks the session). + /// + Lock, + + /// + /// Win + D keystroke (shows the desktop / minimizes all windows). + /// + ShowDesktop, + + /// + /// Win + E keystroke (opens File Explorer). + /// + Explorer, + + /// + /// Win + R keystroke (opens the Run dialog). + /// + RunDialog +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/RemoteDesktop/NetworkConnectionType.cs b/Source/NETworkManager.Models/RemoteDesktop/NetworkConnectionType.cs index 6e8e93cf6b..a8f1e9da87 100644 --- a/Source/NETworkManager.Models/RemoteDesktop/NetworkConnectionType.cs +++ b/Source/NETworkManager.Models/RemoteDesktop/NetworkConnectionType.cs @@ -1,45 +1,46 @@ -namespace NETworkManager.Models.RemoteDesktop +namespace NETworkManager.Models.RemoteDesktop; + +/// +/// Represents the network connection used between the client and server. +/// The network connection type information passed on to the server helps the server tune several parameters based on +/// the network connection type. +/// See also: +/// https://docs.microsoft.com/en-us/windows/desktop/termserv/imsrdpclientadvancedsettings7-networkconnectiontype +/// +public enum NetworkConnectionType { /// - /// Represents the network connection used between the client and server. - /// The network connection type information passed on to the server helps the server tune several parameters based on the network connection type. - /// See also: https://docs.microsoft.com/en-us/windows/desktop/termserv/imsrdpclientadvancedsettings7-networkconnectiontype + /// Detect the network connection type automatically. /// - public enum NetworkConnectionType - { - /// - /// Detect the network connection type automatically. - /// - DetectAutomatically, + DetectAutomatically, - /// - /// Modem (56 Kbps). - /// - Modem, + /// + /// Modem (56 Kbps). + /// + Modem, - /// - /// Low-speed broadband (256 Kbps to 2 Mbps). - /// - BroadbandLow, + /// + /// Low-speed broadband (256 Kbps to 2 Mbps). + /// + BroadbandLow, - /// - /// Satellite (2 Mbps to 16 Mbps, with high latency). - /// - Satellite, + /// + /// Satellite (2 Mbps to 16 Mbps, with high latency). + /// + Satellite, - /// - /// High-speed broadband (2 Mbps to 10 Mbps). - /// - BroadbandHigh, + /// + /// High-speed broadband (2 Mbps to 10 Mbps). + /// + BroadbandHigh, - /// - /// Wide area network (WAN) (10 Mbps or higher, with high latency). - /// - WAN, + /// + /// Wide area network (WAN) (10 Mbps or higher, with high latency). + /// + WAN, - /// - /// Local area network (LAN) (10 Mbps or higher). - /// - LAN - } -} + /// + /// Local area network (LAN) (10 Mbps or higher). + /// + LAN +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/RemoteDesktop/RemoteDesktop.cs b/Source/NETworkManager.Models/RemoteDesktop/RemoteDesktop.cs index b2158f0127..128e70d48b 100644 --- a/Source/NETworkManager.Models/RemoteDesktop/RemoteDesktop.cs +++ b/Source/NETworkManager.Models/RemoteDesktop/RemoteDesktop.cs @@ -1,46 +1,65 @@ using System.Collections.Generic; -namespace NETworkManager.Models.RemoteDesktop +namespace NETworkManager.Models.RemoteDesktop; + +public static class RemoteDesktop { - public static class RemoteDesktop - { - public static List ScreenResolutions => new List - { - "640x480", - "800x600", - "1024x768", - "1280x720", - "1280x768", - "1280x800", - "1280x1024", - "1366x768", - "1440x900", - "1400x1050", - "1680x1050", - "1920x1080" - }; + public static List ScreenResolutions => + [ + "640x480", + "800x600", + "1024x768", + "1280x720", + "1280x768", + "1280x800", + "1280x1024", + "1366x768", + "1440x900", + "1400x1050", + "1680x1050", + "1920x1080" + ]; - public static List ColorDepths => new List - { - 15, - 16, - 24, - 32 - }; + public static List ColorDepths => + [ + 15, + 16, + 24, + 32 + ]; - public static RemoteDesktopKeystrokeInfo GetKeystroke(Keystroke keystroke) - { - RemoteDesktopKeystrokeInfo info = new RemoteDesktopKeystrokeInfo(); - - switch (keystroke) - { - case Keystroke.CtrlAltDel: - info.ArrayKeyUp = new bool[] { false, false, false, true, true, true, }; - info.KeyData = new int[] { 0x1d, 0x38, 0x53, 0x53, 0x38, 0x1d }; - break; - } + public static RemoteDesktopKeystrokeInfo GetKeystroke(Keystroke keystroke) + { + RemoteDesktopKeystrokeInfo info = new(); - return info; + switch (keystroke) + { + case Keystroke.CtrlAltDel: + info.ArrayKeyUp = [false, false, false, true, true, true]; + info.KeyData = [0x1d, 0x38, 0x53, 0x53, 0x38, 0x1d]; + break; + case Keystroke.TaskManager: // Ctrl + Shift + Esc + info.ArrayKeyUp = [false, false, false, true, true, true]; + info.KeyData = [0x1d, 0x2a, 0x01, 0x01, 0x2a, 0x1d]; + break; + case Keystroke.Lock: // Win + L + info.ArrayKeyUp = [false, false, true, true]; + info.KeyData = [0x15b, 0x26, 0x26, 0x15b]; + break; + case Keystroke.ShowDesktop: // Win + D + info.ArrayKeyUp = [false, false, true, true]; + info.KeyData = [0x15b, 0x20, 0x20, 0x15b]; + break; + case Keystroke.Explorer: // Win + E + info.ArrayKeyUp = [false, false, true, true]; + info.KeyData = [0x15b, 0x12, 0x12, 0x15b]; + break; + case Keystroke.RunDialog: // Win + R + info.ArrayKeyUp = [false, false, true, true]; + info.KeyData = [0x15b, 0x13, 0x13, 0x15b]; + break; } + + return info; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/RemoteDesktop/RemoteDesktopKeystrokeInfo.cs b/Source/NETworkManager.Models/RemoteDesktop/RemoteDesktopKeystrokeInfo.cs index 04b9f95bf7..684b57f9ad 100644 --- a/Source/NETworkManager.Models/RemoteDesktop/RemoteDesktopKeystrokeInfo.cs +++ b/Source/NETworkManager.Models/RemoteDesktop/RemoteDesktopKeystrokeInfo.cs @@ -1,19 +1,17 @@ -namespace NETworkManager.Models.RemoteDesktop -{ - public class RemoteDesktopKeystrokeInfo - { - public bool[] ArrayKeyUp; - public int[] KeyData; +namespace NETworkManager.Models.RemoteDesktop; - public RemoteDesktopKeystrokeInfo() - { +public class RemoteDesktopKeystrokeInfo +{ + public bool[] ArrayKeyUp; + public int[] KeyData; - } + public RemoteDesktopKeystrokeInfo() + { + } - public RemoteDesktopKeystrokeInfo(bool[] arrayKeyUp, int[] keyData) - { - ArrayKeyUp = arrayKeyUp; - KeyData = keyData; - } + public RemoteDesktopKeystrokeInfo(bool[] arrayKeyUp, int[] keyData) + { + ArrayKeyUp = arrayKeyUp; + KeyData = keyData; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/RemoteDesktop/RemoteDesktopPerformanceConstants.cs b/Source/NETworkManager.Models/RemoteDesktop/RemoteDesktopPerformanceConstants.cs index 18b2e300c2..b42d008f52 100644 --- a/Source/NETworkManager.Models/RemoteDesktop/RemoteDesktopPerformanceConstants.cs +++ b/Source/NETworkManager.Models/RemoteDesktop/RemoteDesktopPerformanceConstants.cs @@ -1,36 +1,34 @@ -namespace NETworkManager.Models.RemoteDesktop -{ - public static class RemoteDesktopPerformanceConstants - { - // No features are disabled. - public const int TS_PERF_DISABLE_NOTHING = 0x00000000; +namespace NETworkManager.Models.RemoteDesktop; - // Wallpaper on the desktop is not displayed. - public const int TS_PERF_DISABLE_WALLPAPER = 0x00000001; +public static class RemoteDesktopPerformanceConstants +{ + // No features are disabled. + public const int TS_PERF_DISABLE_NOTHING = 0x00000000; - // Full-window drag is disabled; only the window outline is displayed when the window is moved. - public const int TS_PERF_DISABLE_FULLWINDOWDRAG = 0x00000002; + // Wallpaper on the desktop is not displayed. + public const int TS_PERF_DISABLE_WALLPAPER = 0x00000001; - // Menu animations are disabled. - public const int TS_PERF_DISABLE_MENUANIMATIONS = 0x00000004; + // Full-window drag is disabled; only the window outline is displayed when the window is moved. + public const int TS_PERF_DISABLE_FULLWINDOWDRAG = 0x00000002; - // Themes are disabled. - public const int TS_PERF_DISABLE_THEMING = 0x00000008; + // Menu animations are disabled. + public const int TS_PERF_DISABLE_MENUANIMATIONS = 0x00000004; - // Enable enhanced graphics. - public const int TS_PERF_ENABLE_ENHANCED_GRAPHICS = 0x00000010; + // Themes are disabled. + public const int TS_PERF_DISABLE_THEMING = 0x00000008; - // No shadow is displayed for the cursor. - public const int TS_PERF_DISABLE_CURSOR_SHADOW = 0x00000020; + // Enable enhanced graphics. + public const int TS_PERF_ENABLE_ENHANCED_GRAPHICS = 0x00000010; - // Cursor blinking is disabled. - public const int TS_PERF_DISABLE_CURSORSETTINGS = 0x00000040; + // No shadow is displayed for the cursor. + public const int TS_PERF_DISABLE_CURSOR_SHADOW = 0x00000020; - // Font smoothing - public const int TS_PERF_ENABLE_FONT_SMOOTHING = 0x00000080; + // Cursor blinking is disabled. + public const int TS_PERF_DISABLE_CURSORSETTINGS = 0x00000040; - // Desktop composition - public const int TS_PERF_ENABLE_DESKTOP_COMPOSITION = 0x00000100; + // Font smoothing + public const int TS_PERF_ENABLE_FONT_SMOOTHING = 0x00000080; - } -} + // Desktop composition + public const int TS_PERF_ENABLE_DESKTOP_COMPOSITION = 0x00000100; +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/RemoteDesktop/RemoteDesktopSessionInfo.cs b/Source/NETworkManager.Models/RemoteDesktop/RemoteDesktopSessionInfo.cs index f8eb194f9f..965a5abfa7 100644 --- a/Source/NETworkManager.Models/RemoteDesktop/RemoteDesktopSessionInfo.cs +++ b/Source/NETworkManager.Models/RemoteDesktop/RemoteDesktopSessionInfo.cs @@ -1,43 +1,52 @@ using System.Security; -namespace NETworkManager.Models.RemoteDesktop +namespace NETworkManager.Models.RemoteDesktop; + +public class RemoteDesktopSessionInfo { - public class RemoteDesktopSessionInfo - { - public string Hostname { get; set; } - public int Port { get; set; } - public bool CustomCredentials { get; set; } - public string Username { get; set; } - public SecureString Password { get; set; } - public bool AdjustScreenAutomatically { get; set; } - public bool UseCurrentViewSize { get; set; } - public int DesktopWidth { get; set; } - public int DesktopHeight { get; set; } - public int ColorDepth { get; set; } - public bool EnableCredSspSupport { get; set; } - public uint AuthenticationLevel { get; set; } - public AudioRedirectionMode AudioRedirectionMode { get; set; } - public AudioCaptureRedirectionMode AudioCaptureRedirectionMode { get; set; } - public KeyboardHookMode KeyboardHookMode { get; set; } - public bool RedirectClipboard { get; set; } - public bool RedirectDevices { get; set; } - public bool RedirectDrives { get; set; } - public bool RedirectPorts { get; set; } - public bool RedirectSmartCards { get; set; } - public bool RedirectPrinters { get; set; } - public bool PersistentBitmapCaching { get; set; } - public bool ReconnectIfTheConnectionIsDropped { get; set; } - public NetworkConnectionType NetworkConnectionType { get; set; } - public bool DesktopBackground { get; set; } - public bool FontSmoothing { get; set; } - public bool DesktopComposition { get; set; } - public bool ShowWindowContentsWhileDragging { get; set; } - public bool MenuAndWindowAnimation { get; set; } - public bool VisualStyles { get; set; } + public string Hostname { get; set; } + public bool UseCredentials { get; set; } + public string Username { get; set; } + public string Domain { get; set; } + public SecureString Password { get; set; } + public bool AdminSession { get; set; } + public int Port { get; set; } + public bool AdjustScreenAutomatically { get; set; } + public bool UseCurrentViewSize { get; set; } + public int DesktopWidth { get; set; } + public int DesktopHeight { get; set; } + public int ColorDepth { get; set; } - public RemoteDesktopSessionInfo() - { + // View only (block keyboard and mouse input to the remote session) + public bool ViewOnly { get; set; } - } - } -} + public bool EnableCredSspSupport { get; set; } + public uint AuthenticationLevel { get; set; } + public bool EnableGatewayServer { get; set; } + public string GatewayServerHostname { get; set; } + public bool GatewayServerBypassLocalAddresses { get; set; } + public GatewayUserSelectedCredsSource GatewayServerLogonMethod { get; set; } + public bool GatewayServerShareCredentialsWithRemoteComputer { get; set; } + public bool UseGatewayServerCredentials { get; set; } + public string GatewayServerUsername { get; set; } + public string GatewayServerDomain { get; set; } + public SecureString GatewayServerPassword { get; set; } + public AudioRedirectionMode AudioRedirectionMode { get; set; } + public AudioCaptureRedirectionMode AudioCaptureRedirectionMode { get; set; } + public KeyboardHookMode KeyboardHookMode { get; set; } + public bool RedirectClipboard { get; set; } + public bool RedirectDevices { get; set; } + public bool RedirectDrives { get; set; } + public bool RedirectPorts { get; set; } + public bool RedirectSmartCards { get; set; } + public bool RedirectPrinters { get; set; } + public bool PersistentBitmapCaching { get; set; } + public bool ReconnectIfTheConnectionIsDropped { get; set; } + public NetworkConnectionType NetworkConnectionType { get; set; } + public bool DesktopBackground { get; set; } + public bool FontSmoothing { get; set; } + public bool DesktopComposition { get; set; } + public bool ShowWindowContentsWhileDragging { get; set; } + public bool MenuAndWindowAnimation { get; set; } + public bool VisualStyles { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Resources/OUI.xml b/Source/NETworkManager.Models/Resources/OUI.xml index 53d4770ac3..659bbca586 100644 --- a/Source/NETworkManager.Models/Resources/OUI.xml +++ b/Source/NETworkManager.Models/Resources/OUI.xml @@ -1,126049 +1,158781 @@  +Generated 07/06/2026 22:47:50--> - 002272 - American Micro-Fuel Device Corp. + 286FB9 + Nokia Shanghai Bell Co., Ltd. - 00D0EF - IGT + 38E2CA + Katun Corporation - 086195 - Rockwell Automation + E80AB9 + Cisco Systems, Inc - F4BD9E - Cisco Systems Inc. + 78465F + Fiberhome Telecommunication Technologies Co.,LTD - 5885E9 - Realme Chongqing MobileTelecommunications Corp Ltd + 9075DE + Zebra Technologies Inc. - BC2392 - BYD Precision Manufacture Company Ltd + 80BA16 + Micas Networks Inc. - 405582 - Nokia + 10E992 + INGRAM MICRO SERVICES - A4E31B - Nokia + 78F276 + Cyklop Fastjet Technologies (Shanghai) Inc. - D89790 - Commonwealth Scientific and Industrial Research Organisation + 20F83B + Nabu Casa, Inc. - 883A30 - Aruba Networks HP + F01B24 + zte corporation - B8A58D - Axe Group Holdings Limited + B84C87 + IEEE Registration Authority - 50CEE3 - Gigafirm Ltd + E4F14C + Private - 98E743 - Dell Inc. + E00630 + HUAWEI TECHNOLOGIES CO.,LTD - C419D1 - Telink Semiconductor (Shanghai) Ltd + 04D168 + Sunplus Technology Co., Ltd. - 887E25 - Extreme Networks Inc. + 644C69 + CONPROVE - 086083 - ZTE Corporation + DCD160 + Tianjin Changdatong Technology Co.,LTD - E01954 - ZTE Corporation + 644ED7 + HP Inc. - 10327E - Huawei Device Ltd + 9CE330 + Cisco Meraki - F8084F - Sagemcom Broadband SAS + 04A959 + New H3C Technologies Co., Ltd - 30FBB8 - Huawei Technologies Ltd + 0CB983 + Honor Device Co., Ltd. - F497C2 - Nebulon Inc + 2CB301 + Honor Device Co., Ltd. - A44519 - Xiaomi Communications Ltd + E0C2B7 + Masimo Corporation - 68DBF5 - Amazon Technologies Inc. + C88BE8 + Masimo Corporation - 2446C8 - Motorola Mobility LLC, a Lenovo Company + E4C767 + Intel Corporate - 1802AE - Vivo Mobile Communication Ltd + 902D77 + Edgecore Americas Networking Corporation - 0C20D3 - Vivo Mobile Communication Ltd + 6CFBED + GN Audio A/S - 44D791 - Huawei Technologies Ltd + E4F27C + Juniper Networks - 8446FE - Huawei Technologies Ltd + 906C4B + Advance Security Electronics - D82918 - Huawei Technologies Ltd + D48AFC + Espressif Inc. - D0D003 - Samsung Electronics Ltd + E465B8 + Espressif Inc. - 64B21D - Chengdu Phycom Tech Ltd + E001C7 + Hui Zhou Gaoshengda Technology Co.,LTD - C42996 - Signify B.V. + B4DF91 + Cisco Meraki - 980637 - IEEE Registration Authority + 98EE8C + zte corporation - 8CB84A - Samsung Electro-Mechanics(Thailand) + 50E478 + Sichuan AI-Link Technology Co., Ltd. - 98E8FA - Nintendo Ltd + 90C710 + zte corporation - 38C4E8 - NSS Sp. z o.o. + 48D475 + Lampuga GmbH - 34DD7E - Umeox Innovations Ltd + 601AC7 + Nintendo Co.,Ltd - CCCD64 - SM-Electronic GmbH + 48DA35 + IEEE Registration Authority - 24DFA7 - Hangzhou BroadLink Technology Ltd + A881FE + Luxul Tech Co., Ltd - B065F1 - WIO Manufacturing HK Limited + 649A08 + Shenzhen SuperElectron Technology Co.,Ltd. - 901234 - Shenzhen YOUHUA Technology Ltd + 50F222 + EM Microelectronic - 542A1B - Sonos Inc. + 307A57 + Accuenergy (CANADA) Inc - 5C925E - Zioncom Electronics (Shenzhen) Ltd + CCEB5E + Xiaomi Communications Co Ltd - 084FA9 - Cisco Systems Inc. + 60C78D + Juniper Networks - 084FF9 - Cisco Systems Inc. + DC5193 + zte corporation - 5098B8 - New H3C Technologies Ltd + 7478A6 + Fortinet, Inc. - 1100AA - Private + 001982 + SmarDTV Corporation - B84DEE - Hisense broadband multimedia technology Ltd + 50FE0C + AzureWave Technology Inc. - A89352 - Shanghai Zhongmi Communication Technology Ltd + BCFD0C + Shenzhen Phaten Tech. LTD - E4CC9D - Integrated Device Technology (Malaysia) Sdn. Bhd. + 1865C7 + Dongguan YIMO Technology Co.LTD - A8D0E3 - Systech Electronics Ltd + 0C01C8 + DENSO Co.,Ltd - 98BA39 - Doro AB + F42E48 + zte corporation - D46BA6 - Huawei Technologies Ltd + B4C2E0 + Bouffalo Lab (Nanjing) Co., Ltd. - CC0577 - Huawei Technologies Ltd + 040986 + Arcadyan Corporation - 308BB2 - Cisco Systems Inc. + 481BA4 + Cisco Systems, Inc - E0EB62 - Shanghai Hulu Devices Ltd + F0EE7A + Apple, Inc. - 08688D - New H3C Technologies Ltd + 203AEB + zte corporation - E86F38 - Chongqing Fugui Electronics Ltd + 5876B3 + Ubee Interactive Co., Limited - 48216C - China Mobile IOT Company Limited + E87072 + Hangzhou BroadLink Technology Co.,Ltd - 8CBE24 - Tashang Semiconductor(Shanghai) Ltd + D8DAF1 + HUAWEI TECHNOLOGIES CO.,LTD - 08B3AF - Vivo Mobile Communication Ltd + 54443B + HUAWEI TECHNOLOGIES CO.,LTD - 30862D - Arista Network Inc. + 5C7075 + HUAWEI TECHNOLOGIES CO.,LTD - 6CE8C6 - Earda Technologies Ltd + CC03FA + Vantiva USA LLC - 1C4176 - China Mobile Group Device Ltd + 48F7C0 + Vantiva USA LLC - 608B0E - Apple + 480033 + Vantiva USA LLC - 1871D5 - Hazens Automotive Electronics(SZ) Ltd + 14987D + Vantiva USA LLC - ACB1EE - Shenzhen Fenda Technology Ltd + 58238C + Vantiva USA LLC - F8ADCB - HMD Global Oy + 80B234 + Vantiva USA LLC - D462EA - Huawei Technologies Ltd + 8417EF + Vantiva USA LLC - 54BAD6 - Huawei Technologies Ltd + A456CC + Vantiva USA LLC - 94DC4E - AEV, spol. s r. o. + 70037E + Vantiva USA LLC - 1442FC - Texas Instruments + 441C12 + Vantiva USA LLC - AC5D5C - FN-Link Technology Limited + 5C7695 + Vantiva USA LLC - A4AE11 - Hon Hai Precision Ind Ltd + AC4CA5 + Vantiva USA LLC - 54DED0 - Sevio Srl + 00CB7A + Vantiva USA LLC - 6C5E3B - Cisco Systems Inc. + F8D2AC + Vantiva USA LLC - 401920 - Movon Corporation + CCF3C8 + Vantiva USA LLC - D03745 - TP-Link Technologies Ltd + 40F3B0 + Texas Instruments - 603A7C - TP-Link Technologies Ltd + 149CEF + Texas Instruments - 000178 - MARGI Systems Inc. + 80C41B + Texas Instruments - 0CB771 - ARRIS Group Inc. + 3468B5 + Texas Instruments - 58C876 - China Mobile (Hangzhou) Information Technology Ltd + 58AD12 + Apple, Inc. - 2C1E4F - Chengdu Qianli Network Technology Ltd + 60FDA6 + Apple, Inc. - 009052 - Selcom Elettronica S.R.L. + 80A997 + Apple, Inc. - 001A83 - Pegasus Technologies Inc. + 348C5E + Apple, Inc. - 24166D - Huawei Technologies Ltd + D0B2C4 + Vantiva USA LLC - 940B19 - Huawei Technologies Ltd + 80C6AB + Vantiva USA LLC - 70C7F2 - Huawei Technologies Ltd + 383FB3 + Vantiva USA LLC - 3894ED - Netgear + 641236 + Vantiva USA LLC - 700433 - California Things Inc. + 0C75D2 + Hangzhou Hikvision Digital Technology Co.,Ltd. - DCA632 - Raspberry Pi Trading Ltd + D87766 + Nurivoice Co., Ltd - 88F56E - Huawei Technologies Ltd + B8A75E + Wuxi Xinjie Electric Co.,Ltd - BC97E1 - Broadcom Limited + 708185 + New H3C Technologies Co., Ltd - 28D1B7 - Shenzhen YOUHUA Technology Ltd + 50D33B + cloudnineinfo - C8C2FA - Huawei Technologies Ltd + 84C8A0 + Hui Zhou Gaoshengda Technology Co.,LTD - 88B362 - Nokia Shanghai Bell Ltd + A88B28 + SHENZHEN DIYANG SMART TECHNOLOGY CO.,LTD. - 0847D0 - Nokia Shanghai Bell Ltd + 08F01E + eero inc. - 089C86 - Nokia Shanghai Bell Ltd + 18A5FF + Arcadyan Corporation - 7C8956 - Samsung Electronics Ltd + 8C1AF3 + Shenzhen Gooxi Information Security CO.,Ltd. - 9C93E4 - Private + F4B6C6 + Indra Heera Technology LLP - 88299C - Samsung Electronics Ltd + 6C03B5 + Cisco Systems, Inc - CC9093 - Hansong Tehnologies + 58C41E + IEEE Registration Authority - CC64A6 - Huawei Technologies Ltd + A89162 + Sophos Ltd - 30317D - Hosiden Corporation + 709883 + SHENZHEN KAYAN ELECTRONICS., LTD. - F0A968 - Antailiye Technology Ltd + F43A7B + zte corporation - 48E1E9 - Chengdu Meross Technology Ltd + 689E29 + zte corporation - D81399 - Hui Zhou Gaoshengda Technology Ltd + E44097 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 54E019 - Ring LLC + DCB4CA + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 148430 - Mitac Computing Technology Corporation + 8CD54A + TAIYO YUDEN CO.,LTD - B8A44F - Axis Communications AB + A002A5 + Intel Corporate - 0024EB - ClearPath Networks Inc. + ACC048 + OnePlus Technology (Shenzhen) Co., Ltd - 50AF4D - ZTE Corporation + 408432 + Microchip Technology Inc. - C8EAF8 - ZTE Corporation + 44D5C1 + EM Microelectronic - 709F2D - ZTE Corporation + 943BB1 + Kaon Group Co., Ltd. - 383B26 - Jiangsu Qinheng Ltd + 44F034 + Kaon Group Co., Ltd. - 5CFAFB - Acubit + 888F10 + Shenzhen Max Infinite Technology Co.,Ltd. - 9C7BEF - Hewlett-Packard Company + C4799F + Haiguang Smart Device Co.,Ltd. - 742EDB - Perinet GmbH + 842859 + Amazon Technologies Inc. - 201742 - LG Electronics + 5016F4 + Motorola Mobility LLC, a Lenovo Company - CC8826 - LG Innotek + 3C08CD + Juniper Networks - EC5B73 - Advanced & Wise Technology Corp. + 68505D + Halo Technologies - E0CB1D - Private + 7C6A8A + SINOBONDER Technology Co., Ltd. - 848BCD - IEEE Registration Authority + 90ECE3 + Nokia - 14C03E - ARRIS Group Inc. + 887B2C + zte corporation - C089AB - ARRIS Group Inc. + 60DBEF + Unify Software and Solutions GmbH & Co. KG - D44DA4 - Murata Manufacturing Ltd + 0016F6 + Nevion - F8E5CF - CGI IT UK Limited + 40B7FC + Phyplus Microelectronics Limited - 6882F2 - grandcentrix GmbH + 682C4F + leerang corporation - D420B0 - Mist Systems Inc. + B851A9 + Nokia - 08EDED - Zhejiang Dahua Technology Ltd + D077CE + Edgecore Networks Corporation - 6092F5 - ARRIS Group Inc. + ECAFF9 + Hailo Technologies Ltd. - 0022AF - Safety Vision LLC + FC59C0 + Arista Networks - A091A2 - OnePlus Electronics (Shenzhen) Ltd + 641B2F + Samsung Electronics Co.,Ltd - 0080B5 - United Networks Inc. + 9C73B1 + Samsung Electronics Co.,Ltd - 1C697A - EliteGroup Computer Systems Ltd + 388A06 + Samsung Electronics Co.,Ltd - 4C1744 - Amazon Technologies Inc. + B0D888 + Panasonic Automotive Systems Co.,Ltd - B03055 - China Mobile IOT Company Limited + 40D4F6 + Honor Device Co., Ltd. - 905C34 - Sirius Electronic Systems Srl + 7C3180 + SMK corporation - D46A35 - Cisco Systems Inc. + 905607 + Sichuan AI-Link Technology Co., Ltd. - D09C7A - Xiaomi Communications Ltd + 483133 + Robert Bosch Elektronika Kft. - C82C2B - IEEE Registration Authority + B8AB61 + Cisco Meraki - 8020DA - Sagemcom Broadband SAS + 782DAD + HUAWEI TECHNOLOGIES CO.,LTD - 68847E - Fujitsu Limited + D06158 + HUAWEI TECHNOLOGIES CO.,LTD - 003085 - Cisco Systems Inc. + 244BF1 + HUAWEI TECHNOLOGIES CO.,LTD - 605F8D - eero Inc. + 60152B + Palo Alto Networks - C4B36A - Cisco Systems Inc. + 44D77E + Robert Bosch GmbH - 70F754 - AMPAK Technology,Inc. + 908855 + Cisco Systems, Inc - 6C8BD3 - Cisco Systems Inc. + 687161 + Cisco Systems, Inc - 68974B - Shenzhen Costar Electronics Ltd + 883F37 + UHTEK CO., LTD. - 34E1D1 - IEEE Registration Authority + 0080B8 + DMG MORI Digital Co., LTD - 0021B7 - Lexmark International Inc. + 2873F6 + Amazon Technologies Inc. - 00A0B0 - I-O Data Device,Inc. + C4EBFF + zte corporation - 2479F3 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 4893DC + UNIWAY INFOCOM PVT LTD - 80A235 - Edgecore Networks Corporation + 5CE688 + VECOS Europe B.V. - 30EA26 - Sycada BV + 5C2886 + Inventec(Chongqing) Corporation - 9C497F - Integrated Device Technology (Malaysia) Sdn. Bhd. + D4BAFA + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - C4E39F - Guangdong Oppo Mobile Telecommunications Corp Ltd + 4CEC0F + Cisco Systems, Inc - F89A78 - Huawei Technologies Ltd + 843E1D + Hui Zhou Gaoshengda Technology Co.,LTD - 88F872 - Huawei Technologies Ltd + E0CB1D + Amazon Technologies Inc. - EC5623 - Huawei Technologies Ltd + FC84A7 + Murata Manufacturing Co., Ltd. - 5486BC - Cisco Systems Inc. + 3CCB4D + Avikus Co., Ltd - 402343 - Chongqing Fugui Electronics Ltd + 601B52 + Vodafone Italia S.p.A. - 18F18E - ChipER Technology Ltd + 24A42C + NETIO products a.s. - 000422 - Studio Technologies Inc. + 702F86 + Marquardt GmbH - 80DA13 - eero Inc. + C08F20 + Shenzhen Skyworth Digital Technology CO., Ltd - 50EC50 - Beijing Xiaomi Mobile Software Ltd + 08FF24 + Shenzhen Skyworth Digital Technology CO., Ltd - 6061DF - Z-meta Research LLC + 90B67A + Shenzhen Skyworth Digital Technology CO., Ltd - 7057BF - New H3C Technologies Ltd + 249AC8 + Shenzhen Skyworth Digital Technology CO., Ltd - 108286 - Luxshare Precision Industry Ltd + A8881F + SERVERCOM (INDIA) PRIVATE LIMITED - 14B457 - Silicon Laboratories + 005079 + Private - DC962C - NST Audio Ltd + 28C01B + Shenzhen Skyworth Digital Technology CO., Ltd - 18022D - Huawei Technologies Ltd + E028B1 + Shenzhen Skyworth Digital Technology CO., Ltd - D8BC59 - Shenzhen DAPU Microelectronics Ltd + 303180 + Shenzhen Skyworth Digital Technology CO., Ltd - 089798 - Compal Information (Kunshan) Ltd + 201582 + Apple, Inc. - 246F28 - Espressif Inc. + 40921A + Apple, Inc. - 8C79F5 - Samsung Electronics Ltd + 10E2C9 + Apple, Inc. - 48F8DB - Huawei Technologies Ltd + 0436B8 + I&C Technology - 00122A - VTech Telecommunications Ltd + D0431E + Dell Inc. - B0518E - Holl technology Ltd + F0A0B1 + HUAWEI TECHNOLOGIES CO.,LTD - 2852E0 - Layon international Electronic & Telecom Ltd + 404F42 + HUAWEI TECHNOLOGIES CO.,LTD - 58CB52 - Google Inc. + 3086F1 + Fiberhome Telecommunication Technologies Co.,LTD - 7C6166 - Amazon Technologies Inc. + 00C04F + Dell Inc. - 989BCB - AVM Audiovisuelles Marketing und Computersysteme GmbH + 00B0D0 + Dell Inc. - 94F7AD - Juniper Networks + 0019B9 + Dell Inc. - 6063F9 - Ciholas Inc. + 001AA0 + Dell Inc. - AC8FF8 - Nokia + 002564 + Dell Inc. - 6003A6 - Inteno Broadband Technology AB + A4BADB + Dell Inc. - 7C5259 - Sichuan Jiuzhou Electronic Technology Ltd + 38A851 + Quickset Defense Technologies, LLC - 44B295 - Sichuan AI-Link Technology Ltd + 00CB00 + Private - 9424E1 - Alcatel-Lucent Enterprise + 1100AA + Private - F8CA59 - NetComm Wireless + 9C93E4 + Private - 88B291 - Apple + 782BCB + Dell Inc. - C42AD0 - Apple + 14FEB5 + Dell Inc. - CCD281 - Apple + 180373 + Dell Inc. - 200DB0 - Shenzhen Four Seas Global Link Network Technology Ltd + 74867A + Dell Inc. - D81EDD - Guangdong Oppo Mobile Telecommunications Corp Ltd + 204747 + Dell Inc. - D43FCB - ARRIS Group Inc. + 000BDB + Dell Inc. - 5C7695 - Technicolor CH USA Inc. + 00123F + Dell Inc. - F84D33 - Fiberhome Telecommunication Technologies Ltd + A41F72 + Dell Inc. - C08ACD - Guangzhou Shiyuan Electronic Technology Company Limited + 001C23 + Dell Inc. - ACF6F7 - LG Electronics (Mobile Communications) + 847BEB + Dell Inc. - 48E6C0 - SIMCom Wireless Solutions Ltd + 989096 + Dell Inc. - 383C9C - Fujian Newland Payment Technology Ltd + 801844 + Dell Inc. - C02E25 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 9840BB + Dell Inc. - 107717 - Shenzhen Chuangwei-RGB Electronics Ltd + D481D7 + Dell Inc. - A86D5F - Raisecom Technology Ltd + F80DA9 + Zyxel Communications Corporation - 58ECED - Integrated Device Technology (Malaysia) Sdn. Bhd. + 54BF64 + Dell Inc. - 005079 - Private + CCC5E5 + Dell Inc. - 100C6B - Netgear + 4CD98F + Dell Inc. - 505FB5 - Askey Computer Corp. + DCF401 + Dell Inc. - C4F0EC - Fiberhome Telecommunication Technologies Ltd + 6C2B59 + Dell Inc. - E80FC8 - Universal Electronics Inc. + C8F750 + Dell Inc. - E45D37 - Juniper Networks + 98E743 + Dell Inc. - 00EEAB - Cisco Systems Inc. + 185A58 + Dell Inc. - 54A703 - TP-Link Technologies Ltd + D08E79 + Dell Inc. - 907A58 - Zegna-Daidong Limited + B44506 + Dell Inc. - E009BF - Shenzhen TONG BO WEI TECHNOLOGY Ltd + 485A0D + Juniper Networks - 00131E - Peiker Acustic GmbH + E0D848 + Dell Inc. - 846991 - Nokia + 04BF1B + Dell Inc. - 001BF7 - Lund IP Products AB + 581031 + Hon Hai Precision IND.CO.,LTD - 783607 - Cermate Technologies Inc. + E03C1C + IEEE Registration Authority - B00073 - Wistron Neweb Corporation + 000993 + Visteon Corporation - D88DC8 - Atil Technology Ltd + EC41CA + Shenzhen TecAnswer Technology co.,ltd - 88DE7C - Askey Computer Corp. + 148477 + New H3C Technologies Co., Ltd - A8E2C1 - Texas Instruments + 14962D + New H3C Technologies Co., Ltd - 909A77 - Texas Instruments + C4A64E + Quectel Wireless Solutions Co.,Ltd. - 04EE03 - Texas Instruments + 7066B9 + Huawei Device Co., Ltd. - 4C2498 - Texas Instruments + C4A1AE + Huawei Device Co., Ltd. - 7CD95C - Google Inc. + 486F33 + KYUNGWOO.SYSTEM, INC. - C8AACC - Private + 086195 + Rockwell Automation - 002167 - HWA JIN T&I Corp. + 24BBC9 + Shenzhen SuperElectron Technology Co.,Ltd. - 000B86 - Aruba Networks HP + 0000BC + Rockwell Automation - DC31D1 - Vivo Mobile Communication Ltd + FCD749 + Amazon Technologies Inc. - C8F750 - Dell Inc. + A87116 + Earda Technologies co Ltd - D49234 - NEC Corporation + E8EBDD + Guangzhou Qingying Acoustics Technology Co., Ltd - 0007CB - Freebox SAS + 548C81 + Hangzhou Hikvision Digital Technology Co.,Ltd. - 149FB6 - Guangdong Genius Technology Ltd + 244845 + Hangzhou Hikvision Digital Technology Co.,Ltd. - 00115A - Ivoclar Vivadent AG + 74EE8D + Apollo Intelligent Connectivity (Beijing) Technology Co., Ltd. - 4CAEA3 - Hewlett Packard Enterprise + D858C6 + Katch Asset Tracking Pty Limited - 1C2E1B - Suzhou Tremenet Communication Technology Ltd + 2CC6A0 + Lumacron Technology Ltd. - 1C24EB - Burlywood + ECC89C + Hangzhou Hikvision Digital Technology Co.,Ltd. - 001013 - Kontron America Inc. + 8CE748 + Hangzhou Hikvision Digital Technology Co.,Ltd. - 2C2BF9 - LG Innotek + 2428FD + Hangzhou Hikvision Digital Technology Co.,Ltd. - D8C7C8 - Aruba Networks HP + ACB92F + Hangzhou Hikvision Digital Technology Co.,Ltd. - 703A0E - Aruba Networks HP + D4E853 + Hangzhou Hikvision Digital Technology Co.,Ltd. - 204C03 - Aruba Networks HP + 240F9B + Hangzhou Hikvision Digital Technology Co.,Ltd. - 58C6F0 - Guangdong Oppo Mobile Telecommunications Corp Ltd + C06DED + Hangzhou Hikvision Digital Technology Co.,Ltd. - 84A06E - Sagemcom Broadband SAS + 2432AE + Hangzhou Hikvision Digital Technology Co.,Ltd. - A43EA0 - iComm HK LIMITED + E0BAAD + Hangzhou Hikvision Digital Technology Co.,Ltd. - 64C2DE - LG Electronics (Mobile Communications) + E0CA3C + Hangzhou Hikvision Digital Technology Co.,Ltd. - 8C444F - HUMAX Ltd + DC07F8 + Hangzhou Hikvision Digital Technology Co.,Ltd. - 006762 - Fiberhome Telecommunication Technologies Ltd + 64DB8B + Hangzhou Hikvision Digital Technology Co.,Ltd. - 2CC407 - machineQ + 94E1AC + Hangzhou Hikvision Digital Technology Co.,Ltd. - B4ED19 - Pie Digital Inc. + 5803FB + Hangzhou Hikvision Digital Technology Co.,Ltd. - 40DF02 - LINE BIZ Plus + 4447CC + Hangzhou Hikvision Digital Technology Co.,Ltd. - CCE194 - Juniper Networks + 98DF82 + Hangzhou Hikvision Digital Technology Co.,Ltd. - 900218 - BSkyB Ltd + C056E3 + Hangzhou Hikvision Digital Technology Co.,Ltd. - 144E2A - Ciena Corporation + BCAD28 + Hangzhou Hikvision Digital Technology Co.,Ltd. - 84139F - ZTE Corporation + 88B6BD + Flaircomm Microelectronics, Inc. - F051EA - Fitbit Inc. + 2C9682 + MitraStar Technology Corp. - 5033F0 - Yichen (Shenzhen) Technology Ltd + BC49B2 + SHENZHEN ALONG COMMUNICATION TECH CO., LTD - FC2BB2 - Actiontec Electronics Inc. + 9497AE + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - E09F2A - Iton Technology Corp. + 0CBD75 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 4CE19E - Tecno Mobile Limited + AC9073 + HUAWEI TECHNOLOGIES CO.,LTD - AC5AEE - China Mobile Group Device Ltd + 000351 + Diebold Nixdorf - 70BC10 - Microsoft Corporation + F09FC2 + Ubiquiti Inc - 884A18 - Opulinks + 802AA8 + Ubiquiti Inc - 9C69B4 - IEEE Registration Authority + FC1D3A + HUAWEI TECHNOLOGIES CO.,LTD - 500084 - Siemens Canada + E4BEFB + HUAWEI TECHNOLOGIES CO.,LTD - 44B433 - tide Ltd + 58F8D7 + HUAWEI TECHNOLOGIES CO.,LTD - D8A6FD - Ghost Locomotion + 788A20 + Ubiquiti Inc - DC21B9 - Sentec Ltd + 7483C2 + Ubiquiti Inc - 6CDFFB - IEEE Registration Authority + E063DA + Ubiquiti Inc - 247D4D - Texas Instruments + 245A4C + Ubiquiti Inc - 8850F6 - Shenzhen Jingxun Software Telecommunication Technology Ltd + 602232 + Ubiquiti Inc - E498BB - Phyplus Microelectronics Limited + E43883 + Ubiquiti Inc - 60A11E - Wuhan Maxsine Electric Ltd + 84B59C + Juniper Networks - C45BF7 - ants + 5C4527 + Juniper Networks - 8CDF9D - NEC Corporation + EC3EF7 + Juniper Networks - 5C415A - Amazon.com LLC + 002159 + Juniper Networks - 705E55 - Realme Chongqing MobileTelecommunications Corp Ltd + 00239C + Juniper Networks - B0D568 - Shenzhen Cultraview Digital Technology Ltd + 50C58D + Juniper Networks - F00EBF - ZettaHash Inc. + 28C0DA + Juniper Networks - 703509 - Cisco Systems Inc. + 288A1C + Juniper Networks - 441AFA - New H3C Technologies Ltd + B8EA98 + Xiaomi Communications Co Ltd - 04072E - VTech Electronics Ltd + 10C4CA + HUMAX Co., Ltd. - 780ED1 - TRUMPF Werkzeugmaschinen GmbH+Co.KG + AC800A + Sony Corporation - 44ECCE + 40A677 Juniper Networks - F82F08 - Molex CMS + D818D3 + Juniper Networks - 441C12 - Technicolor CH USA Inc. + F04B3A + Juniper Networks - 4428A3 - Jiangsu fulian Communication Technology Ltd + C042D0 + Juniper Networks - 10C595 - Lenovo + 001BC0 + Juniper Networks - 203233 - Shenzhen Bilian Electronic Ltd + 44ECCE + Juniper Networks - 6829DC - Ficosa Electronics S.L.U. + CCE194 + Juniper Networks - 9454DF - YST Corp. + E45D37 + Juniper Networks - 7CBC84 - IEEE Registration Authority + 94F7AD + Juniper Networks - F80DF1 - Sontex SA + 784F9B + Juniper Networks - A49426 - Elgama-Elektronika Ltd + 88D98F + Juniper Networks - E4F14C - Private + 78507C + Juniper Networks - A8B456 - Cisco Systems Inc. + F07CC7 + Juniper Networks - 2CA9F0 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 000585 + Juniper Networks - 549B72 - Ericsson AB + 889009 + Juniper Networks - A047D7 - Best IT World (India) Pvt Ltd + 00CC34 + Juniper Networks - 6899CD - Cisco Systems Inc. + E030F9 + Juniper Networks - 1040F3 - Apple + 204E71 + Juniper Networks - 586B14 - Apple + D404FF + Juniper Networks - BCB863 - Apple + 84C1C1 + Juniper Networks - 2C1CF6 - Alien Green LLC + 4C734F + Juniper Networks - 6C2B59 - Dell Inc. + D45A3F + Juniper Networks - 44E66E - Apple + 04698F + Juniper Networks - C0E862 - Apple + 58C935 + Chiun Mai Communication System, Inc - F40616 - Apple + 7CE2CA + Juniper Networks - 0CFE5D - IEEE Registration Authority + A4A528 + Sichuan Tianyi Comheart Telecom Co.,LTD - 3C8D20 - Google Inc. + E878EE + New H3C Technologies Co., Ltd - 601D91 - Motorola Mobility LLC, a Lenovo Company + ECA7AD + Barrot Technology Co.,Ltd. - D4C94B - Motorola Mobility LLC, a Lenovo Company + 00302B + Inalp Solutions AG - 08351B - Shenzhen Jialihua Electronic Technology Ltd + F0748D + Ruijie Networks Co.,LTD - AC1585 - silergy Corp + 48814E + E&M SOLUTION CO,.Ltd - AC5093 - Magna Electronics Europe GmbH & Co. OHG + 7C4D8F + HP Inc. - 70BBE9 - Xiaomi Communications Ltd + 9CCBF7 + CLOUD STAR TECHNOLOGY CO., LTD. - 50A0A4 - Nokia + 74D558 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 00D02D - Resideo + F46412 + Sony Interactive Entertainment Inc. - 806940 - Lexar Ltd + 3CF9F0 + zte corporation - 64F81C - Huawei Technologies Ltd + 6877DA + zte corporation - 1098C3 - Murata Manufacturing Ltd + 8858BE + kuosheng.com - 9CC8FC - ARRIS Group Inc. + 44DBD2 + YEALINK(XIAMEN) NETWORK TECHNOLOGY CO.,LTD. - B07E11 - Texas Instruments + E0DCA0 + Siemens Industrial Automation Products Ltd., Chengdu - 10C753 - Qingdao Intelligent & Precise Electronics Ltd + 1C3B62 + HMD Global Oy - F4951B - Hefei Radio Communication Technology Ltd + 5C64F1 + Cisco Systems, Inc - 6C3845 - Fiberhome Telecommunication Technologies Ltd + 9CDBAF + HUAWEI TECHNOLOGIES CO.,LTD - 2C6104 - Shenzhen Fenglian Technology Ltd + 0C2E57 + HUAWEI TECHNOLOGIES CO.,LTD - BC9325 - Ningbo Joyson Preh Car Connect Ltd + E8D775 + HUAWEI TECHNOLOGIES CO.,LTD - D0B60A - Xingluo Technology Company Limited + 64EC65 + vivo Mobile Communication Co., Ltd. - 049226 - ASUSTek Computer Inc. + F42462 + Selcom Electronics (Shanghai) Co., Ltd - E8ADA6 - Sagemcom Broadband SAS + F4A17F + Marquardt Electronics Technology (Shanghai) Co.Ltd - 0C1C19 - Longconn Electronics(Shenzhen) Ltd + 48BCE1 + Samsung Electronics Co.,Ltd - 90E710 - New H3C Technologies Ltd + B838EF + ADVA Optical Networking Ltd. - 302952 - Hillstone Networks Inc + 084218 + Asyril SA - E013B5 - Vivo Mobile Communication Ltd + D85B22 + Shenzhen Hohunet Technology Co., Ltd - E0795E - Wuxi Xiaohu Technology Ltd + D0D003 + Samsung Electronics Co.,Ltd - 00B1E3 - Cisco Systems Inc. + 5C76D5 + Nokia - A41194 - Lenovo + 8C7A00 + Nokia - 00CB00 - Private + A4FC14 + Apple, Inc. - DCF401 - Dell Inc. + A81AF1 + Apple, Inc. - 0C4101 - Ruichi Auto Technology (Guangzhou) Ltd + 705846 + Trig Avionics Limited - 00B771 - Cisco Systems Inc. + 0891A3 + Amazon Technologies Inc. - E4B2FB - Apple + 0CD923 + GOCLOUD Networks(GAOKE Networks) - 2CCA0C - Withus Planet + 84398F + Fortinet, Inc. - 84326F - Guangzhou AVA Electronics Technology Ltd + B4EDD5 + Quectel Wireless Solutions Co.,Ltd. - C89C13 - Inspiremobile + 2CD1C6 + Murata Manufacturing Co., Ltd. - 8C85E6 - Cleondris GmbH + B85CEE + Baidu Online Network Technology (Beijing) Co., Ltd - 807D14 - Huawei Technologies Ltd + CC08FA + Apple, Inc. - 20283E - Huawei Technologies Ltd + 909B6F + Apple, Inc. - A4FC77 - Mega Well Limited + 7473B4 + Apple, Inc. - 4C569D - Apple + F83C80 + MITSUMI ELECTRIC CO.,LTD. - 38539C - Apple + D83ADD + Raspberry Pi Trading Ltd - 402619 - Apple + 70F8AE + Microsoft Corporation - 6CE85C - Apple + 000F2A + Cableware Electronics - 049162 - Microchip Technology Inc. + BC64D9 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - F83880 - Apple + 301F48 + zte corporation - 2C79D7 - Sagemcom Broadband SAS + 7CC74A + Fiberhome Telecommunication Technologies Co.,LTD - 00B4F5 - DongGuan Siyoto Electronics Ltd + 38FC34 + Huawei Device Co., Ltd. - BC3F4E - Teleepoch Ltd + 3CF692 + Huawei Device Co., Ltd. - 1838AE - Conspin Solution + 940EE7 + HUAWEI TECHNOLOGIES CO.,LTD - 04CF8C - XIAOMI Electronics Ltd + A8B271 + HUAWEI TECHNOLOGIES CO.,LTD - 0C7512 - Shenzhen Kunlun TongTai Technology Ltd + 6405E4 + ALPSALPINE CO,.LTD - 7483C2 - Ubiquiti Networks Inc. + DCAC6F + Everytale Inc - E063DA - Ubiquiti Networks Inc. + F41532 + PETAiO (NanJing), Inc. - 50579C - Seiko Epson Corporation + 2CAB33 + Texas Instruments - 54278D - NXP (China) Management Ltd + 28B5E8 + Texas Instruments - B0BE76 - TP-Link Technologies Ltd + 08C3B3 + TCL King Electrical Appliances(Huizhou)Co.,Ltd - 4447CC - Hangzhou Hikvision Digital Technology Ltd + 204569 + ITEL MOBILE LIMITED - 4CD98F - Dell Inc. + D46352 + Vutility Inc. - B0AE25 - Varikorea + D821DA + SERNET (SUZHOU) TECHNOLOGIES CORPORATION - 4C1B86 - Arcadyan Corporation + 08F1B3 + Cisco Meraki - ECC40D - Nintendo Ltd + BCE8FA + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 440049 + 505A65 + AzureWave Technology Inc. + + + C4A559 + IEEE Registration Authority + + + 6C0C9A Amazon Technologies Inc. - E86A64 - LCFC(HeFei) Electronics Technology Ltd + 308216 + Apple, Inc. - 10A24E - GOLD3LINK Electronics Ltd + 8CD0B2 + Beijing Xiaomi Mobile Software Co., Ltd - CCC5E5 - Dell Inc. + C4A052 + Motorola Mobility LLC, a Lenovo Company - 6CC374 - Texas Instruments + 84900A + Arcadyan Corporation - 684749 - Texas Instruments + 8076C2 + GD Midea Air-Conditioning Equipment Co.,Ltd. - F8D9B8 - Open Mesh Inc. + F04A3D + Bosch Thermotechnik GmbH - 7C696B - Atmosic Technologies + 941FA2 + Wuhan YuXin Semiconductor Co., Ltd. - 5CD20B - Yytek Ltd + B49DFD + Shenzhen SDMC Technology CO.,Ltd. - 70037E - Technicolor CH USA Inc. + F41A9C + Xiaomi Communications Co Ltd - D003DF - Samsung Electronics Ltd + 001AEB + Allied Telesis K.K. - C423A2 - PT. Emsonic Indonesia + DC0682 + Accessia Technology Ltd. - B4CB57 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 44D267 + Snorble - 4C1265 - ARRIS Group Inc. + B0BC7A + Harman/Becker Automotive Systems GmbH - 00500C - e-Tek Labs Inc. + 487706 + NXP Semiconductor (Tianjin) LTD. - 485F99 - Cloud Network Technology (Samoa) Limited + 0CCC47 + IEEE Registration Authority - 8834FE - Bosch Automotive Products (Suzhou) Ltd + 5C3E06 + Cisco Systems, Inc - 88F7BF - Vivo Mobile Communication Ltd + C828E5 + Cisco Systems, Inc - D87D7F - Sagemcom Broadband SAS + 34873D + Quectel Wireless Solutions Co.,Ltd. - 00051A - 3Com Europe Ltd + C44137 + Quectel Wireless Solutions Co.,Ltd. - 08004E - 3Com Europe Ltd + 6CD199 + vivo Mobile Communication Co., Ltd. - 00301E - 3Com Europe Ltd + D040BE + NPO RPS LLC - 005004 - 3Com Corporation + 10D680 + Tendyron Corporation - 000103 - 3Com Corporation + 003E73 + Mist Systems, Inc. - 58B568 - Securitas Direct Espana, SAU + 0CFC18 + HUAWEI TECHNOLOGIES CO.,LTD - 484AE9 - Hewlett Packard Enterprise + F44DAD + Cable Matters Inc. - 846A66 - Sumitomo Kizai Ltd + 80AB4D + Nokia Solutions and Networks GmbH & Co. KG - 18D717 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 4CBA7D + Gemtek Technology Co., Ltd. - 80B624 - IVS + 500238 + Nokia Shanghai Bell Co., Ltd. - DCF505 - Azurewave Technologies Inc. + ACAD4B + zte corporation - CCF0FD - China Mobile (Hangzhou) Information Technology Ltd + A8169D + Hui Zhou Gaoshengda Technology Co.,LTD - 8489EC + F0221D IEEE Registration Authority - 88108F - Huawei Technologies Ltd + 9C5440 + ChengDu TD Tech - F4631F - Huawei Technologies Ltd + 5026EF + Murata Manufacturing Co., Ltd. - A49B4F - Huawei Technologies Ltd + 444988 + Intel Corporate - 00073A - Inventel + FC9189 + Sichuan Tianyi Comheart Telecom Co.,LTD - 00266C - Inventec Corporation + 1C1A1B + Shanghai Sunmi Technology Co.,Ltd. - 008CFA - Inventec Corporation + 8038D4 + Fibercentury Network Technology Co.,Ltd. - 5CFB7C - Shenzhen Jingxun Software Telecommunication Technology Ltd + 7C296F + Apple, Inc. - FC039F - Samsung Electronics Ltd + 40EDCF + Apple, Inc. - 02C08C - 3Com Corporation + 74057C + Qorvo International Pte. Ltd. - 0057C1 - LG Electronics (Mobile Communications) + 8C986B + Apple, Inc. - 7C240C - Telechips Inc. + 1C8682 + Apple, Inc. - 00203D - Honeywell Environmental & Combustion Controls + 8054E3 + Apple, Inc. - A4D990 - Samsung Electronics Ltd + 102E00 + Intel Corporate - 006087 - Kansai Electric Ltd + 203A43 + Intel Corporate - DCF719 - Cisco Systems Inc. + 3C3B99 + ITEL MOBILE LIMITED - A0950C - China Mobile IOT Company Limited + FC3357 + KAGA FEI Co., Ltd. - D4741B - Beijing HuaDa ZhiBao Electronic System Ltd + 9CDE4D + ML vision Co.,LTD - 001BC0 - Juniper Networks + F8F0C5 + Suzhou Kuhan Information Technologies Co.,Ltd. - 2C15E1 - Phicomm (Shanghai) Ltd + F8DE73 + HUAWEI TECHNOLOGIES CO.,LTD - 30D16B - Liteon Technology Corporation + EC1A02 + HUAWEI TECHNOLOGIES CO.,LTD - 98AE71 - VVDN Technologies Pvt Ltd + 902778 + Open Infrastructure - A456CC - Technicolor CH USA Inc. + 68418F + Telechips, Inc. - AC6E1A - Shenzhen Gongjin Electronics Ltd + BC9EBB + Nintendo Co.,Ltd - 0080EB - Compcontrol B.V. + D009C8 + Cisco Systems, Inc - 0002EB - Pico Communications + D03957 + Liteon Technology Corporation - 342EB6 - Huawei Technologies Ltd + E8BAE2 + Xplora Technologies AS - AC9232 - Huawei Technologies Ltd + 5CA06C + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 000FB0 - Compal Electronics Inc. + A83B76 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 00023F - Compal Electronics Inc. + 40E11C + shenzhen Cloud High Communication Technology Co.,Ltd - 68A8E1 - Wacom Ltd + 44643C + Cisco Systems, Inc - 30D32D - devolo AG + 24161B + Cisco Systems, Inc - BCF2AF - devolo AG + A8400B + Visteon Corporation - E0AF4F - Deutsche Telekom AG + 20318D + Giax GmbH - B869F4 - Routerboard.com + 3CB07E + Arounds Intelligent Equipment Co., Ltd. - 283A4D - Cloud Network Technology (Samoa) Limited + C04E8A + HUAWEI TECHNOLOGIES CO.,LTD - B87C6F - NXP (China) Management Ltd + 08569B + WiZ - 305DA6 - ADVALY SysTEM Inc. + 081AFD + Huawei Device Co., Ltd. - BC30D9 - Arcadyan Corporation + C0BFAC + Huawei Device Co., Ltd. - 0479B7 - Texas Instruments + 44272E + Huawei Device Co., Ltd. - C0D0FF - China Mobile IOT Company Limited + 106650 + Robert Bosch JuP1 - 88DF9E - New H3C Technologies Ltd + A80C03 + Florawise - 2C7CE4 - Wuhan Tianyu Information Industry Ltd + 90DAF9 + Siemens Rail Automation SAU - 5803FB - Hangzhou Hikvision Digital Technology Ltd + F8009D + INTRACOM DEFENSE S.A. - 144802 - THE YEOLRIM Ltd + 201642 + Microsoft Corporation - 40313C - XIAOMI Electronics Ltd + 8C946A + New H3C Technologies Co., Ltd - FC4596 - Compal Information (Kunshan) Ltd + FC1165 + Cambium Networks Limited - A0E534 - Stratec Biomedical AG + CC8DB5 + Shenzhen SuperElectron Technology Co.,Ltd. - 444B5D - GE Healthcare + ACEE64 + Shenzhen SuperElectron Technology Co.,Ltd. - 001555 - DFM GmbH + 0012F3 + u-blox AG - 1C7508 - Compal Information (Kunshan) Ltd + 547068 + VTech Communications Limited - 001B38 - Compal Information (Kunshan) Ltd + C84052 + PAX Computer Technology(Shenzhen) Ltd. - 00235A - Compal Information (Kunshan) Ltd + 68EE4B + Sharetronic Data Technology Co.,Ltd - 24D76B - Syntronic AB + 48C35A + LENOVO(BEIJING)CO., LTD. - C4FEE2 - AMICCOM Electronics Corporation + C461C7 + Microsoft Corporation - 780CF0 - Cisco Systems Inc. + ACCB36 + Fiberhome Telecommunication Technologies Co.,LTD - 0C8C24 - Shenzhen Bilian Electronic Ltd + 60706C + Google, Inc. - 8C6D77 - Huawei Technologies Ltd + C82ADD + Google, Inc. - E8C57A - Ufispace Ltd + 240935 + Samsung Electronics Co.,Ltd - E01283 - Shenzhen Fanzhuo Communication Technology Ltd + B4DB91 + CELESTICA INC. - A0CF5B - Cisco Systems Inc. + C48372 + IEEE Registration Authority - 002421 - Micro-Star International + C0A5E8 + Intel Corporate - 0060D1 - Cascade Communications + 906584 + Intel Corporate - 84C9C6 - Shenzhen Gongjin Electronics Ltd + 28C5D2 + Intel Corporate - 88B66B - easynetworks + E48C73 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 24F57E - HWH Ltd + 2CB6C8 + Raisecom Technology CO., LTD - 8CA048 - Beijing NeTopChip Technology Ltd + D834D1 + Shenzhen Orange Digital Technology Co.,Ltd - 24D3F2 - ZTE Corporation + 842289 + Samsung Electronics Co.,Ltd - D469A5 - Miura Systems Ltd + 84AAA4 + SONoC Corp. - 8C8126 - Arcom + 883C93 + Alcatel-Lucent Enterprise - D47C44 - IEEE Registration Authority + FCDF00 + GD Midea Air-Conditioning Equipment Co.,Ltd. - 805E4F - FN-Link Technology Limited + E8BFDB + Inodesign Group - 8417EF - Technicolor CH USA Inc. + 287E80 + Hui Zhou Gaoshengda Technology Co.,LTD - 3856B5 - Peerbridge Health Inc + 0C9F71 + Dolphin Electronics (DongGuan) Co., Ltd. - 7C96D2 - Fihonest Communication Ltd + 1C8B76 + Calix Inc. - C042D0 - Juniper Networks + 745889 + Multilaser Industrial S.A. - D0C5D8 - Latecoere + E8FF98 + Huawei Device Co., Ltd. - 7054B4 - Vestel Elektronik San ve Tic. A.S. + 241551 + Huawei Device Co., Ltd. - 20A60C - Xiaomi Communications Ltd + 58957E + Huawei Device Co., Ltd. - 488AD2 - Mercury Communication Technologies Ltd + 2C9452 + HUAWEI TECHNOLOGIES CO.,LTD - DCE838 - CK Telecom (Shenzhen) Limited + 6001B1 + HUAWEI TECHNOLOGIES CO.,LTD - A8D498 - Avira Operations GmbH & Co. KG + B8144D + Apple, Inc. - 505967 - Intent Solutions Inc + EC28D3 + Apple, Inc. - 000680 - Card Access Inc. + 5CBBEE + zte corporation - 3C576C - Samsung Electronics Ltd + 086518 + Apple, Inc. - 841766 - Weifang Goertek Electronics Ltd + 2C57CE + Apple, Inc. - 2C4D79 - Weifang Goertek Electronics Ltd + 80398C + Samsung Electronics Co.,Ltd - 000C42 - Routerboard.com + 980D6F + Samsung Electronics Co.,Ltd - 0026BD - JTEC Card & Communication Ltd + 1C90FF + Tuya Smart Inc. - 60D02C - Ruckus Wireless + 10823D + Ruijie Networks Co.,LTD - D058FC - BSkyB Ltd + 982044 + New H3C Technologies Co., Ltd - 14579F - Huawei Technologies Ltd + D8A0E8 + zte corporation - B44326 - Huawei Technologies Ltd + 80563C + ZF - 78D294 - Netgear + A044F3 + RafaelMicro - 709FA9 - Tecno Mobile Limited + F42B7D + Chipsguide technology CO.,LTD. - 0C01DB - Infinix mobility limited + 8C5219 + SHARP Corporation - 08C5E1 - Samsung Electro-Mechanics(Thailand) + 2C9E00 + Sony Interactive Entertainment Inc. - 1866C7 - Shenzhen Libre Technology Ltd + DC6AE7 + Xiaomi Communications Co Ltd - 5CB3F6 - Human Inc.orporated + 7CA449 + Xiaomi Communications Co Ltd - 2C4835 + D0066A + Cornelis Networks, Inc. + + + 883CC5 IEEE Registration Authority - 482AE3 - Wistron InfoComm(Kunshan) Ltd + C404D8 + Aviva Links Inc. - FCA6CD - Fiberhome Telecommunication Technologies Ltd + AC965B + Lucid Motors - 44C874 - China Mobile Group Device Ltd + 089115 + Amazon Technologies Inc. - 74C14F - Huawei Technologies Ltd + 74D423 + Amazon Technologies Inc. - B0EB57 - Huawei Technologies Ltd + E04735 + Ericsson AB - 1869DA - China Mobile Group Device Ltd + 909877 + Vestel Elektronik San ve Tic. A.S. - F85C4D - Nokia + ECA138 + Amazon Technologies Inc. - 2C584F - ARRIS Group Inc. + E0EF02 + Chengdu Quanjing Intelligent Technology Co.,Ltd - F04B3A - Juniper Networks + 4CA3A7 + TECNO MOBILE LIMITED - 54BF64 - Dell Inc. + B067B5 + Apple, Inc. - A85B6C - Robert Bosch GmbH, CM-CI2 + 5C5284 + Apple, Inc. - C8B1EE - Qorvo + C0956D + Apple, Inc. - 00FCBA - Cisco Systems Inc. + 3C39C8 + Apple, Inc. - 00CBB4 - Shenzhen Ateko Photoelectricity Ltd + A8ABB5 + Apple, Inc. - 4CC00A - Vivo Mobile Communication Ltd + 5864C4 + Apple, Inc. - 9CE82B - Vivo Mobile Communication Ltd + 40A53B + Nokia - 7079B3 - Cisco Systems Inc. + 74803F + Renesas Electronics (Penang) Sdn. Bhd. - D818D3 - Juniper Networks + 900A62 + Inventus Power Eletronica do Brasil LTDA - 149B2F - JiangSu ZhongXie Intelligent Technology Ltd + 505FB5 + ASKEY COMPUTER CORP - 3835FB - Sagemcom Broadband SAS + 88DE7C + ASKEY COMPUTER CORP - 48DD9D - Itel Mobile Limited + 045747 + GoPro - A075EA - BoxLock Inc. + 5C60BA + HP Inc. - F04CD5 - Maxlinear Inc. + BCF88B + zte corporation - 0001AE - Trex Enterprises + 68539D + EM Microelectronic - 00E009 - Stratus Technologies + 0443FD + Sichuan Tianyi Comheart Telecom Co.,LTD - E4EA83 - Shenzhen Gongjin Electronics Ltd + A4897E + Guangzhou Yuhong Technology Co.,Ltd. - 74EC42 - Fiberhome Telecommunication Technologies Ltd + EC1D9E + Quectel Wireless Solutions Co.,Ltd. - D4FC13 - Fiberhome Telecommunication Technologies Ltd + 3CA7AE + zte corporation - 807D3A - Espressif Inc. + AC3184 + Huawei Device Co., Ltd. - ECAF97 - GIT + 503F50 + Huawei Device Co., Ltd. - A0B045 - Halong Mining + 2C691D + IEEE Registration Authority - E0BAB4 - Arrcus Inc. + CC29BD + zte corporation - 589B0B - Shineway Technologies Inc. + 385CFB + Silicon Laboratories - D8160A - Nippon Electro-Sensory Devices + C43D1A + Intel Corporate - 10C07C - Blu-ray Disc Association + 04E8B9 + Intel Corporate - 40A677 - Juniper Networks + E02E0B + Intel Corporate - E4B021 - Samsung Electronics Ltd + E8CC8C + Chengdu Jiarui Hualian Communication Technology Co - 9C7F57 - UNIC Memory Technology Ltd + E46564 + SHENZHEN KTC TECHNOLOGY CO.,LTD - B4E01D - Conception Electronique + 3CE064 + Texas Instruments - 1C0042 - NARI Technology Ltd + E0928F + Texas Instruments - 4434A7 - ARRIS Group Inc. + CC037B + Texas Instruments - 3CE1A1 - Universal Global Scientific Industrial Ltd + 581CF8 + Intel Corporate - F898EF - Huawei Technologies Ltd + AC198E + Intel Corporate - 58F987 - Huawei Technologies Ltd + C85EA9 + Intel Corporate - A8F5AC - Huawei Technologies Ltd + C8BF4C + Beijing Xiaomi Mobile Software Co., Ltd - 58BAD4 - Huawei Technologies Ltd + 7CDE78 + New H3C Technologies Co., Ltd - 701D08 - 99IOT Shenzhen Ltd + B8FBAF + Xiamen IPRT Technology CO.,LTD - 7412BB - Fiberhome Telecommunication Technologies Ltd + E051D8 + China Dragon Technology Limited - 001027 - L-3 Communications East + 549A11 + IEEE Registration Authority - BC2643 - Elprotronic Inc. + ECE6A2 + Fiberhome Telecommunication Technologies Co.,LTD - 04E229 - Qingdao Haier Technology Ltd + 1C0ED3 + Sichuan Tianyi Comheart Telecom Co.,LTD - 348B75 - Lava International(H.K) Limited + 380A4F + PRACHI ENTERPRISES - 9CE895 - New H3C Technologies Ltd + A0CDF3 + Murata Manufacturing Co., Ltd. - 00583F - PC Aquarius + AC5AF0 + LG Electronics - 903D68 - G-Printec Inc. + ECA62F + HUAWEI TECHNOLOGIES CO.,LTD - 1094BB - Apple + 0CBEF1 + Huawei Device Co., Ltd. - 781D4A - ZTE Corporation + AC936A + Huawei Device Co., Ltd. - 94E1AC - Hangzhou Hikvision Digital Technology Ltd + 38A44B + Huawei Device Co., Ltd. - 34E894 - TP-Link Technologies Ltd + 801970 + Samsung Electronics Co.,Ltd - F86FC1 - Apple + 5C53C3 + Ubee Interactive Co., Limited - 28FF3C - Apple + B48A0A + Espressif Inc. - F099B6 - Apple + C83A1B + Toshiba TEC Corporation Inc - 88E9FE - Apple + E0F728 + Amazon Technologies Inc. - 38892C - Apple + 242934 + Google, Inc. - 749EAF - Apple + 3822F4 + Huawei Device Co., Ltd. - 94BF2D - Apple + 8002F4 + IEEE Registration Authority - 68CAE4 - Cisco Systems Inc. + 149BF3 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 00BE3B - Huawei Technologies Ltd + 10071D + Fiberhome Telecommunication Technologies Co.,LTD - 7CA177 - Huawei Technologies Ltd + C8C13C + RuggedTek Hangzhou Co., Ltd - 242E02 - Huawei Technologies Ltd + B850D8 + Beijing Xiaomi Mobile Software Co., Ltd - 78B6EC - Scuf Gaming International LLC + F4B3B1 + Silicon Laboratories - 8035C1 - Xiaomi Communications Ltd + C09F51 + SERNET (SUZHOU) TECHNOLOGIES CORPORATION - 58B3FC - Shenzhen RF-Link Technology Ltd + 10B232 + Qingdao Intelligent&Precise Electronics Co.,Ltd. - 2047DA - Xiaomi Communications Ltd + 581DD8 + Sagemcom Broadband SAS - 2429FE - KYOCERA Corporation + 30D587 + Samsung Electronics Co.,Ltd - 7C49EB - XIAOMI Electronics Ltd + 14F592 + Shenzhen SDG DONZHI Technology Co., Ltd - C43306 - China Mobile Group Device Ltd + 4C09FA + FRONTIER SMART TECHNOLOGIES LTD - 08DFCB - Systrome Networks + 242CFE + Zhejiang Tmall Technology Co., Ltd. - A4933F - Huawei Technologies Ltd + A042D1 + Huawei Device Co., Ltd. - 28AC9E - Cisco Systems Inc. + 58879F + Huawei Device Co., Ltd. - 68D482 - Shenzhen Gongjin Electronics Ltd + 9C1FCA + Hangzhou AlmightyDigit Technology Co., Ltd - 984562 - Shanghai Baud Data Communication Ltd + 2CDC78 + Descartes Systems (USA) LLC - E4C483 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 68A7B4 + Honor Device Co., Ltd. - 001FBA - Boyoung Tech + 803C20 + HUAWEI TECHNOLOGIES CO.,LTD - A433D7 - MitraStar Technology Corp. + A4DD58 + HUAWEI TECHNOLOGIES CO.,LTD - B0ACD2 - ZTE Corporation + E8D87E + Amazon Technologies Inc. - 200F70 - Foxtech + 78034F + Nokia - 202D23 - Collinear Networks Inc. + 0015A6 + Digital Electronics Products Ltd. - 90834B - Beijing Yunyi Times Technology Ltd + A8A237 + Arcadyan Corporation - 18502A - Soarnex + F8AB82 + Xiaomi Communications Co Ltd - A8367A - frogblue TECHNOLOGY GmbH + EC30B3 + Xiaomi Communications Co Ltd - 6CE4DA - NEC Platforms Ltd + 08E63B + zte corporation - 10E7C6 - Hewlett-Packard Company + 88C174 + zte corporation - 1831BF - ASUSTek Computer Inc. + C89E61 + Lyngsoe Systems LTd - C8FAE1 - ARQ Digital LLC + 902CFB + CanTops Co,.Ltd. - DCA333 - Shenzhen YOUHUA Technology Ltd + 1CAF4A + Samsung Electronics Co.,Ltd - 788C54 - Ping Communication + C8120B + Samsung Electronics Co.,Ltd - B8AF67 - Hewlett-Packard Company + 6C1524 + IEEE Registration Authority - C098DA - China Mobile IOT Company Limited + C08D51 + Amazon Technologies Inc. - F00FEC - Huawei Technologies Ltd + 44B4B2 + Amazon Technologies Inc. - AC075F - Huawei Technologies Ltd + ACCCFC + Amazon Technologies Inc. - C048E6 - Samsung Electronics Ltd + E8DC6C + Cisco Systems, Inc - 882E5A - storONE + B03F64 + Apple, Inc. - 007147 - Amazon Technologies Inc. + 2C8217 + Apple, Inc. - 00BE75 - Cisco Systems Inc. + 142D4D + Apple, Inc. - 64DB8B - Hangzhou Hikvision Digital Technology Ltd + EC42CC + Apple, Inc. - 78257A - LEO Innovation Lab + B8211C + Apple, Inc. - 10A4B9 - Baidu Online Network Technology (Beijing) Ltd + 28BE43 + vivo Mobile Communication Co., Ltd. - 501CB0 - Cisco Systems Inc. + 2CFC8B + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 04AC44 - Holtek Semiconductor Inc. + 002604 + WorldCast Systems - F4DCA5 - Dawon DNS + F8AD24 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 80CE62 - Hewlett-Packard Company + A8C98A + New H3C Technologies Co., Ltd - 801F12 - Microchip Technology Inc. + E0276C + Guangzhou Shiyuan Electronic Technology Company Limited - 506CBE - InnosiliconTechnology Ltd + DC8E95 + Silicon Laboratories - 247E12 - Cisco Systems Inc. + AC8FA9 + Nokia Solutions and Networks GmbH & Co. KG - 04C241 - Nokia + 000AD0 + Niigata Develoment Center, F.I.T. Co., Ltd. - 3C479B - Theissen Training Systems Inc. + 7CEF40 + Nextorage Corporation - 606BFF - Nintendo Ltd + C0E01C + IoT Security Group, SL - 8CF710 - AMPAK Technology Inc. + AC51AB + HUAWEI TECHNOLOGIES CO.,LTD - 307BAC - New H3C Technologies Ltd + 48CDD3 + HUAWEI TECHNOLOGIES CO.,LTD - 785DC8 - LG Electronics + CC6618 + Adtran Inc - 3C0461 - ARRIS Group Inc. + 24EBED + HUAWEI TECHNOLOGIES CO.,LTD - 883D24 - Google Inc. + 2874F5 + Nokia Solutions and Networks GmbH & Co. KG - E8C1B8 - Nanjing Bangzhong Electronic Commerce Limited + A04466 + Intellics - D8D775 - Sagemcom Broadband SAS + 446D7F + Amazon Technologies Inc. - E8330D - Xaptec GmbH + 2406F2 + Sichuan Tianyi Comheart Telecom Co.,LTD - D460E3 - Sercomm Corporation. + 6818D9 + Hill AFB - CAPRE Group - B4A8B9 - Cisco Systems Inc. + 18BC57 + ADVA Optical Networking Ltd. - 50DCE7 - Amazon Technologies Inc. + D8E2DF + Microsoft Corporation - 649829 - Integrated Device Technology (Malaysia) Sdn. Bhd. + 388F30 + Samsung Electronics Co.,Ltd - 081DC4 - Thermo Fisher Scientific Messtechnik GmbH + 6C0F61 + Hypervolt Ltd - 785364 - SHIFT GmbH + C0C170 + Shenzhen SuperElectron Technology Co.,Ltd. - 38E60A - Xiaomi Communications Ltd + 504289 + zte corporation - 40CBC0 - Apple + 84C692 + Texas Instruments - C4618B - Apple + 6CB2FD + Texas Instruments - CC6EA4 - Samsung Electronics Ltd + 302BDC + Top-Unum Electronics Co., LTD - 803A59 - AT&T + 90F7B2 + New H3C Technologies Co., Ltd - 588D64 - Xi'an Clevbee Technology Ltd + 1C47F6 + Zhidao Network Technology(Shenzhen) Co.,Ltd - 005D73 - Cisco Systems Inc. + 000CD6 + PARTNER TECH - 606D3C - Luxshare Precision Industry Company Limited + 6C9308 + IEEE Registration Authority - 44F034 - Kaonmedia Ltd + E881AB + Beijing Sankuai Online Technology Co.,Ltd - 002790 - Cisco Systems Inc. + D4BD4F + Ruckus Wireless - 34BA38 - PAL Mohan Electronics PVT Ltd + 5CC9C0 + Renesas Electronics (Penang) Sdn. Bhd. - 9829A6 - Compal Information (Kunshan) Ltd + 8C1553 + Beijing Memblaze Technology Co Ltd - CC4D38 - Carnegie Technologies + B0A4F0 + HUAWEI TECHNOLOGIES CO.,LTD - 08E689 - Apple + B4695F + TCT mobile ltd - DC56E7 - Apple + 24753A + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - A816D0 - Samsung Electronics Ltd + C85895 + Motorola Mobility LLC, a Lenovo Company - A46CF1 - Samsung Electronics Ltd + 6C999D + Amazon Technologies Inc. - 08AED6 - Samsung Electronics Ltd + C0060C + HUAWEI TECHNOLOGIES CO.,LTD - DCBFE9 - Motorola Mobility LLC, a Lenovo Company + 2C3341 + China Mobile IOT Company Limited - B42D56 - Extreme Networks Inc. + AC567B + Sunnovo International Limited - 4064A4 - THE Furukawa Electric Ltd + 34D737 + IBG Industriebeteiligungsgesellschaft mbH &b Co. KG - 6CB2AE - Cisco Systems Inc. + A8537D + Mist Systems, Inc. - B0982B - Sagemcom Broadband SAS + E4DADF + Taicang T&W Electronics - 34FA9F - Ruckus Wireless + 7C35F8 + Zhejiang Tmall Technology Co., Ltd. - F065C2 - Yanfeng Visteon Electronics Technology (Shanghai) Ltd + B05C16 + Fiberhome Telecommunication Technologies Co.,LTD - 70B7E2 - Jiangsu Miter Technology Ltd + 08E021 + Honor Device Co., Ltd. - 808DB7 - Hewlett Packard Enterprise + 9CC12D + GD Midea Air-Conditioning Equipment Co.,Ltd. - A09D86 - Alcatel-Lucent Shanghai Bell Ltd + 7426FF + zte corporation - 00C0FF - Seagate Cloud Systems Inc + C42728 + zte corporation - D45DDF - Pegatron Corporation + 8CC7C3 + NETLINK ICT - F8B568 - IEEE Registration Authority + E8D322 + Cisco Systems, Inc - 2C6B7D - Texas Instruments + A0B4BF + InfiNet LLC - 88D171 - Beghelli S.P.A + 7CC95E + Dongguan Liesheng Electronic Co., Ltd. - A09DC1 - China Dragon Technology Limited + D0EDFF + ZF CVCS - 2C4205 - Lytx + 988FE0 + IEEE Registration Authority - A825EB - Cambridge Industries(Group) Ltd + F8A91F + ZVISION Technologies Co., Ltd - 34E380 - Genexis B.V. + C07982 + TCL King Electrical Appliances(Huizhou)Co.,Ltd - 5C5819 - Jingsheng Technology Ltd + 080076 + PC LAN TECHNOLOGIES - B8CA04 - Holtek Semiconductor Inc. + 7CCCFC + Quectel Wireless Solutions Co.,Ltd. - C4C563 - Tecno Mobile Limited + DC8084 + Apple, Inc. - 80B708 - Blue Danube Systems Inc. + 4CBAD7 + LG Innotek - 08BC20 - Hangzhou Royal Cloud Technology Ltd + 34B883 + Cisco Systems, Inc - 942A3F - Diversey Inc + 80657C + Apple, Inc. - 2031EB - Hdsn + 2CFDB4 + Shenzhen Jingxun Software Telecommunication Technology Co.,Ltd - F8C96C - Fiberhome Telecommunication Technologies Ltd + 38C804 + Hui Zhou Gaoshengda Technology Co.,LTD - 844823 - WOXTER TECHNOLOGY Ltd + E007C2 + FUJIAN STAR-NET COMMUNICATION CO.,LTD - F41E5E - RtBrick Inc. + 18D793 + IEEE Registration Authority - 6C7660 - Kyocera Corporation + 102C8D + GD Midea Air-Conditioning Equipment Co.,Ltd. - 002102 - UpdateLogic Inc. + D8B673 + Texas Instruments - 505800 - WyTec International Inc. + B4F267 + Compal Broadband Networks, Inc. - C8D12A - Comtrend Corporation + B0DD74 + Heimgard Technologies AS - 0CEAC9 - ARRIS Group Inc. + C0FBC1 + ITEL MOBILE LIMITED - E82A44 - Liteon Technology Corporation + 9850A3 + SIGNALTEK JSC - 10A4BE - Shenzhen Bilian Electronic Ltd + B48C9D + AzureWave Technology Inc. - ECC06A - PowerChord Group Limited + 50B3B4 + Shenzhen Furuilian Electronic Co.,Ltd. - 944996 - WiSilica Inc + 94E686 + Espressif Inc. - F81D0F - Hitron Technologies Inc. + F828C9 + HUAWEI TECHNOLOGIES CO.,LTD - 58C935 - Chiun Mai Communication Systems Inc. + FC1193 + HUAWEI TECHNOLOGIES CO.,LTD - 0094A1 - F5 Networks Inc. + DC3643 + IEEE Registration Authority - BCF292 - Plantronics Inc. + 50874D + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 0450DA - Qiku Internet Network Scientific (Shenzhen) Ltd + A41752 + Hifocus Electronics India Private Limited - E820E2 - HUMAX Ltd + 00620B + Broadcom Limited - 0026A8 - Daehap Hyper-Tech + 40FE95 + New H3C Technologies Co., Ltd - 785C28 - Prime Motion Inc. + A05394 + Shenzhen zediel co., Ltd. - 8C5BF0 - ARRIS Group Inc. + 04EEE8 + IEEE Registration Authority - 1890D8 - Sagemcom Broadband SAS + 9CB8B4 + AMPAK Technology,Inc. - 88835D - FN-Link Technology Limited + 84B4DB + Silicon Laboratories - EC9F0D - IEEE Registration Authority + 1C70C9 + Jiangsu Aisida Electronic Co., Ltd - E078A3 - Shanghai Winner Information Technology Co.,Inc + 3CF7D1 + OMRON Corporation - 0005A7 - HYPERCHIP Inc. + DCCCE6 + Samsung Electronics Co.,Ltd - 088466 - Novartis Pharma AG + F065AE + Samsung Electronics Co.,Ltd - 309FFB - Ardomus Networks Corporation + 5089D1 + Huawei Device Co., Ltd. - 282373 - Digita + BCD074 + Apple, Inc. - 649A08 - Shenzhen SuperElectron Technology Ltd + 0C1EF7 + Omni-ID - 68A682 - Shenzhen YOUHUA Technology Ltd + E85177 + Qingdao Intelligent&Precise Electronics Co.,Ltd. - 587A62 - Texas Instruments + 388A21 + UAB Teltonika Telematics - 547A52 - CTE International srl + A45FB9 + DreamBig Semiconductor, Inc. - F06E0B - Microsoft Corporation + 000F32 + Lootom Telcovideo Network (Wuxi) Co Ltd - 346FED - Enovation Controls + 18C23C + Lumi United Technology Co., Ltd - 5433CB - Apple + 0475F9 + Taicang T&W Electronics - 3408BC - Apple + E06D18 + PIONEERCORPORATION - 1C36BB - Apple + 8CF8C5 + Intel Corporate - 3C2EFF - Apple + A05950 + Intel Corporate - 00E025 - dit Ltd + D4354A + ALAXALA Networks Corporation - AC84C6 - TP-Link Technologies Ltd + 40E99B + SAMSUNG ELECTRO-MECHANICS(THAILAND) - 001530 - Dell EMC + 90FFD6 + Honor Device Co., Ltd. - 0CB2B7 - Texas Instruments + CCA3BD + ITEL MOBILE LIMITED - 24F677 - Apple + BCAF87 + smartAC.com, Inc. - B0CA68 - Apple + C02B31 + Phytium Technology Co.,Ltd. - C83C85 - Apple + 786299 + BITSTREAM sp. z o.o. - 78870D - Unifiedgateways India Private Limited + CC5B31 + Nintendo Co.,Ltd - A88200 - Hisense Electric Ltd + C0280B + Honor Device Co., Ltd. - 3820A8 - ColorTokens Inc. + 9CEA97 + Honor Device Co., Ltd. - 705896 - InShow Technology + C89BAD + Honor Device Co., Ltd. - 000589 - National Datacomputer + B4D286 + Telechips, Inc. - 3CA616 - Vivo Mobile Communication Ltd + 08F80D + IEEE Registration Authority - 9CE063 - Samsung Electronics Ltd + BC455B + Samsung Electronics Co.,Ltd - D03169 - Samsung Electronics Ltd + D42C46 + BUFFALO.INC - 24F27F - Hewlett Packard Enterprise + 78047A + Edge Networks LLC - BC0543 - AVM GmbH + B03CDC + Intel Corporate - 00B69F - Latch + 208097 + Shenzhen OXO Technology limited - 842C80 - Sichuan Changhong Electric Ltd + 5C83CD + New platforms - 3CC079 - Shenzhen One-Nine Intelligent Electronic Science and Technology Ltd + 8415D3 + HUAWEI TECHNOLOGIES CO.,LTD - 98C5DB - Ericsson AB + D49400 + HUAWEI TECHNOLOGIES CO.,LTD - 149F3C - Samsung Electronics Ltd + 384B24 + SIEMENS AG - FCEEE6 - Formike Electronic Ltd + F0AE66 + Cosonic Intelligent Technologies Co., Ltd. - 84E327 - Tailyn Technologies Inc - - - 0021B8 - Inphi Corporation + 3CA916 + Huawei Device Co., Ltd. - 0C9160 - Hui Zhou Gaoshengda Technology Ltd + 806A00 + Cisco Systems, Inc - D8ED1C - Magna Technology SL + A06C65 + Texas Instruments - 408BF6 - Shenzhen TCL New Technology Ltd + 448502 + Shenzhen SuperElectron Technology Co.,Ltd. - 00006B - Silicon Graphics + F4A454 + IEEE Registration Authority - 74373B - UNINET Ltd + 58FCC6 + TOZO INC - 7C6456 - Samsung Electronics Ltd + C41C07 + Samsung Electronics Co.,Ltd - F46E24 - NEC Personal Computers Ltd + 4011C3 + Samsung Electronics Co.,Ltd - 888279 - Shenzhen RB-LINK Intelligent Technology Ltd + C47D9F + Samsung Electronics Co.,Ltd - 68C63A - Espressif Inc. + 1C4586 + Nintendo Co.,Ltd - A0648F - Askey Computer Corp + 185B00 + Nokia - C850E9 - Raisecom Technology Ltd + 305A99 + Sichuan Tianyi Comheart Telecom Co.,LTD - 10F163 - TNK Ltd + 604DE1 + HUAWEI TECHNOLOGIES CO.,LTD - 98EF9B - Ohsung + 704E6B + HUAWEI TECHNOLOGIES CO.,LTD - 14CF8D - Ohsung + 603D29 + HUAWEI TECHNOLOGIES CO.,LTD - 104400 - Huawei Technologies Ltd + 10A51D + Intel Corporate - B0E17E - Huawei Technologies Ltd + 589B4A + DWnet Technologies(Suzhou) Corporation - E4A7C5 - Huawei Technologies Ltd + 507C6F + Intel Corporate - 5C8D2D - Shanghai Wellpay Information Technology Ltd + 98DD60 + Apple, Inc. - 90FD9F - Silicon Laboratories + C04442 + Apple, Inc. - B430C0 - York Instruments Ltd + D468AA + Apple, Inc. - E81DA8 - Ruckus Wireless + F8C3CC + Apple, Inc. - F03D03 - Tecno Mobile Limited + 54C480 + HUAWEI TECHNOLOGIES CO.,LTD - DCF090 - Nubia Technology Ltd + D866EE + BOXIN COMMUNICATION CO.,LTD. - A0FE61 - Vivint Wireless Inc. + F4573E + Fiberhome Telecommunication Technologies Co.,LTD - 5C2BF5 - Vivint Wireless Inc. + 70C6DD + New H3C Technologies Co., Ltd - CC5A53 - Cisco Systems Inc. + 3C9EC7 + SKY UK LIMITED - 006088 - Analog Devices Inc. + 088E90 + Intel Corporate - 084ACF - Guangdong Oppo Mobile Telecommunications Corp Ltd + 282A87 + ITEL MOBILE LIMITED - 2C279E - IEEE Registration Authority + 2426BA + Shenzhen Toptel Technology Co., Ltd. - 8C5F48 - Continental Intelligent Transportation Systems LLC + F06C73 + Nokia - 947EB9 - National Narrowband Network Communications Pty Ltd + 9C756E + Ajax Systems DMCC - 646E69 - Liteon Technology Corporation + E8F9D4 + HUAWEI TECHNOLOGIES CO.,LTD - 706BB9 - Cisco Systems Inc. + B0C787 + HUAWEI TECHNOLOGIES CO.,LTD - 00C0EE - KYOCERA Display Corporation + 0C4F9B + HUAWEI TECHNOLOGIES CO.,LTD - 245FDF - Kyocera Corporation + 482FD7 + HUAWEI TECHNOLOGIES CO.,LTD - 9C63ED - ZTE Corporation + 7C214A + Intel Corporate - 74F661 - Schneider Electric Fire & Security Oy + 508492 + Intel Corporate - B8634D - Apple + 9880BB + IEEE Registration Authority - 24C42F - Philips Lifeline + B812DA + LVSWITCHES INC. - 2CB21A - Phicomm (Shanghai) Ltd + A0D7F3 + Samsung Electronics Co.,Ltd - A4E975 - Apple + 7890A2 + zte corporation - 3035AD - Apple + ACBCD9 + Cisco Systems, Inc - 844167 - Apple + D8B053 + Xiaomi Communications Co Ltd - 9800C6 - Apple + 6CF784 + Xiaomi Communications Co Ltd - AC1F74 - Apple + 546CEB + Intel Corporate - A85C2C - Apple + 009337 + Intel Corporate - 00DB70 - Apple + 58CE2A + Intel Corporate - FCE557 - Nokia Corporation + 042B58 + Shenzhen Hanzsung Technology Co.,Ltd - 48C58D - Lear Corporation GmbH + B43D08 + GX International BV - 00289F - Semptian Ltd + 7089F5 + Dongguan Lingjie IOT Co., LTD - 9C305B - Hon Hai Precision Ind Ltd + 9431CB + vivo Mobile Communication Co., Ltd. - 104E89 - Garmin International + B8208E + Panasonic Connect Co., Ltd. - D8C497 - Quanta Computer Inc. + 847B57 + Intel Corporate - BCC342 - Panasonic Communications Ltd + 4006D5 + Cisco Systems, Inc - 001BD3 - Panasonic Corporation AVC Networks Company + C4CA2B + Arista Networks - CC7EE7 - Panasonic Corporation AVC Networks Company + 607DDD + Shenzhen Shichuangyi Electronics Co.,Ltd - 20C6EB - Panasonic Corporation AVC Networks Company + AC5E14 + HUAWEI TECHNOLOGIES CO.,LTD - 64B5C6 - Nintendo Ltd + 20DF73 + HUAWEI TECHNOLOGIES CO.,LTD - 2830AC - Frontiir Ltd + 48128F + HUAWEI TECHNOLOGIES CO.,LTD - D4D2E5 - BKAV Corporation + 64CBE9 + LG Innotek - 0050B5 - Fichet Securite Electronique + 24D81E + MirWifi,Joint-Stock Company - 001439 - Blonder Tongue Laboratories Inc. + BC2228 + D-Link International - 20A6CD - Hewlett Packard Enterprise + 40CA63 + Seongji Industry Company - 84802D - Cisco Systems Inc. + 40B0A1 + VALCOM CO.,LTD. - 001987 - Panasonic Mobile Communications Ltd + 103C59 + zte corporation - 741C27 - Itel Mobile Limited + D48A3B + HUNAN FN-LINK TECHNOLOGY LIMITED - 00A0AC - Gilat Satellite Networks Ltd + 6CDDEF + EPCOMM Inc. - 002609 - Phyllis Ltd + 10B7A8 + CableFree Networks Limited - 28F537 - IEEE Registration Authority + 78444A + Shenzhen Aiwinn information Technology Co., Ltd. - 94D9B3 - TP-Link Technologies Ltd + D0F121 + Xi'an LINKSCI Technology Co., Ltd - C84029 - Fiberhome Telecommunication Technologies Ltd + 9C5636 + Huawei Device Co., Ltd. - F86EEE - Huawei Technologies Ltd + 947F1D + Shenzhen Fastrain Technology Co., Ltd. - 7802B1 - Cisco Systems Inc. + D0F520 + KYOCERA Corporation - B40F3B - Tenda Technology LtdDongguan branch + 70B64F + Guangzhou V-SOLUTION Electronic Technology Co., Ltd. - 00188D - Nokia Danmark A/S + B89470 + Calix Inc. - 0015AB - PRO Co Sound Inc + E4293D + Shenzhen Sy-Fiber Optical Communication Technology.Co.,Ltd - 5876C5 - Digi I'S Ltd + 70B9BB + Shenzhen Hankvision Technology CO.,LTD - A8B2DA - Fujitsu Limited + B4205B + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 001354 - Zcomax Technologies Inc. + A4C69A + Samsung Electronics Co.,Ltd - 78D800 - IEEE Registration Authority + 8CB87E + Intel Corporate - 0835B2 - CoreEdge Networks Ltd + 701AB8 + Intel Corporate - 4C49E3 - Xiaomi Communications Ltd + 5CDF89 + Ruckus Wireless - 245880 - Vizeo + B88C29 + GD Midea Air-Conditioning Equipment Co.,Ltd. - 54666C - Shenzhen YOUHUA Technology Ltd + 5444A3 + Samsung Electronics Co.,Ltd - A89675 - Motorola Mobility LLC, a Lenovo Company + D03F27 + Wyze Labs Inc - 389AF6 - Samsung Electronics Ltd + 3003C8 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - E0AA96 - Samsung Electronics Ltd + 089E84 + HUAWEI TECHNOLOGIES CO.,LTD - 507705 - Samsung Electronics Ltd + 1082D7 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 28D436 - Jiangsu dewosi electric Ltd + 785EE8 + IEEE Registration Authority - D4B27A - ARRIS Group Inc. + 9C40CD + Synclayer Inc. - 44EA4B - Actlas Inc. + D8BE1F + Apple, Inc. - C4CB6B - Airista Flow Inc. + 98502E + Apple, Inc. - 188090 - Cisco Systems Inc. + 580AD4 + Apple, Inc. - 786256 - Huawei Technologies Ltd + A477F3 + Apple, Inc. - B05508 - Huawei Technologies Ltd + CCBCE3 + HUAWEI TECHNOLOGIES CO.,LTD - B875C0 - PayPal Inc. + 088EDC + Apple, Inc. - 001C71 - Emergent Electronics + A84A28 + Apple, Inc. - 001A93 - ERCO Leuchten GmbH + BC6AD1 + Xiaomi Communications Co Ltd - 94F665 - Ruckus Wireless + 0845D1 + Cisco Systems, Inc - B090D4 - Shenzhen Hoin Internet Technology Ltd + 18E215 + Nokia - 8C9F3B - Qingdao Hisense Communications Ltd + EC1C5D + Siemens AG - 0014B8 - Hill-Rom + 8427B6 + China Mobile IOT Company Limited - ACED5C - Intel Corporation + 807EB4 + Shenzhen SuperElectron Technology Co.,Ltd. - 842096 - Shenzhen RF-Link Technology Ltd + 2CB8ED + SonicWall - B4C170 - Yi chip Microelectronics (Hangzhou) Ltd + 500A52 + Huiwan Technologies Co. Ltd - AC6706 - Ruckus Wireless + 54A9D4 + Minibar Systems - 044FAA - Ruckus Wireless + 000062 + BULL HN INFORMATION SYSTEMS - 589396 - Ruckus Wireless + E43BC9 + HISENSE VISUAL TECHNOLOGY CO.,LTD - 001F41 - Ruckus Wireless + E89526 + Luxshare Precision Industry CO., LTD. - C4108A - Ruckus Wireless + 104121 + TELLESCOM INDUSTRIA E COMERCIO EM TELECOMUNICACAO - F0B052 - Ruckus Wireless + D49390 + CLEVO CO. - 70DF2F - Cisco Systems Inc. + BC062D + Wacom Co.,Ltd. - 3894E0 - Syrotech Networks Ltd + 3C93F4 + HUAWEI TECHNOLOGIES CO.,LTD - 34F64B - Intel Corporation + 6433B5 + IEEE Registration Authority - F46BEF - Sagemcom Broadband SAS + 504B9E + Huawei Device Co., Ltd. - 10CDB6 - Essential Products Inc. + 047AAE + Huawei Device Co., Ltd. - A4F3E7 - Integrated Device Technology (Malaysia) Sdn. Bhd. + 409CA6 + Curvalux - E43A6E - Shenzhen Zeroone Technology Ltd + D88083 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 7CE2CA - Juniper Networks + FC4265 + Zhejiang Tmall Technology Co., Ltd. - 9061AE - Intel Corporation + 187758 + Audoo Limited (UK) - 6CF9D2 - Chengdu Povodo Electronic Technology Ltd + 6887C6 + Cisco Systems, Inc - 30B62D - Mojo Networks Inc. + 80248F + Cisco Systems, Inc - 50184C - Platina Systems Inc. + 4C50F1 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - F4B7B3 - Vivo Mobile Communication Ltd + B4E454 + Amazon Technologies Inc. - FCA667 + 0C43F9 Amazon Technologies Inc. - C81FEA - Avaya Inc + 44A92C + IEEE Registration Authority - 0027E3 - Cisco Systems Inc. + 84AC16 + Apple, Inc. - 0018AE - TVT Ltd + 2CBC87 + Apple, Inc. - 8891DD - Racktivity + 5078B0 + Huawei Device Co., Ltd. - 1C4593 - Texas Instruments + E4072B + Huawei Device Co., Ltd. - 90EC50 - C.O.B.O. SPA + 2446E4 + HUAWEI TECHNOLOGIES CO.,LTD - E0D848 - Dell Inc. + 50E7A0 + Renesas Electronics (Penang) Sdn. Bhd. - 60271C - VIDEOR E. Hartig GmbH + 90E868 + AzureWave Technology Inc. - 00EC0A - Xiaomi Communications Ltd + 68F0D0 + SkyBell Technologies Inc. - C8D7B0 - Samsung Electronics Ltd + FCA89B + Texas Instruments - 6C60EB - ZHI Yuan Electronics Ltd + 98F07B + Texas Instruments - 74DADA - D-Link International + CC896C + GN Hearing A/S - D8F1F0 - Pepxim International Limited + A4FF95 + Nokia - DCC8F5 - Shanghai UMEinfo Ltd + D47350 + DBG Commnunications Technology Co., Ltd. - 88D7F6 - ASUSTek Computer Inc. + 70DA17 + Austrian Audio GmbH - 9097F3 - Samsung Electronics Ltd + 3861A5 + Grabango Co - 7C1C68 - Samsung Electronics Ltd + 78D3ED + NORMA - C087EB - Samsung Electronics Ltd + 8C1ED9 + Beijing Unigroup Tsingteng Microsystem Co., LTD. - 04714B - IEEE Registration Authority + 34B472 + Espressif Inc. - 2C41A1 - Bose Corporation + F80C58 + Taicang T&W Electronics - 4C38D8 - ARRIS Group Inc. + 50411C + AMPAK Technology,Inc. - 447BBB - Shenzhen YOUHUA Technology Ltd + F42679 + Intel Corporate - 9C7BD2 - NEOLAB Convergence + B03795 + LG Electronics - D0F88C - Motorola (Wuhan) Mobility Technologies Communication Ltd + 3C7AF0 + ITEL MOBILE LIMITED - 2CB115 - Integrated Device Technology (Malaysia) Sdn. Bhd. + 48F3F3 + Baidu Online Network Technology (Beijing) Co., Ltd - 10D07A - AMPAK Technology Inc. + 081C6E + Xiaomi Communications Co Ltd - D4C1C8 - ZTE Corporation + 508140 + HP Inc. - 88D274 - ZTE Corporation + FC58DF + Interphone Service - 002449 - Shen Zhen Lite Star Electronics Technology Ltd + 981082 + Nsolution Co., Ltd. - 00E18C - Intel Corporation + 781305 + IEEE Registration Authority - 847933 - profichip GmbH + 34243E + zte corporation - 881544 - Cisco Meraki + 98ED7E + eero inc. - C4ABB2 - Vivo Mobile Communication Ltd + 34FE9E + Fujitsu Limited - 80B234 - Technicolor CH USA Inc. + 38453B + Ruckus Wireless - 44B412 - Sius AG + 6450D6 + Liquidtool Systems - 0CB912 - JM-DATA GmbH + F44637 + Intel Corporate - 3CA308 - Texas Instruments + 0C718C + TCT mobile ltd - F43E61 - Shenzhen Gongjin Electronics Ltd + 505D7A + zte corporation - B4417A - Shenzhen Gongjin Electronics Ltd + C41234 + Apple, Inc. - 000062 - Bull HN Information Systems + 3CA6F6 + Apple, Inc. - E8C1D7 - Philips + 681BEF + HUAWEI TECHNOLOGIES CO.,LTD - 4C8120 - Taicang T&W Electronics + E4DC5F + Cofractal, Inc. - 28A6DB - Huawei Technologies Ltd + 4CAB4F + Apple, Inc. - 14A0F8 - Huawei Technologies Ltd + 9C583C + Apple, Inc. - C8F86D - Alcatel-Lucent Shanghai Bell Ltd + 000901 + Shenzhen Shixuntong Information & Technoligy Co - 6045CB - ASUSTek Computer Inc. + F463E7 + Nanjing Maxon O.E. Tech. Co., LTD - 00118B - Alcatel-Lucent Enterprise + 88AEDD + EliteGroup Computer Systems Co., LTD - 00E0B1 - Alcatel-Lucent Enterprise + 7806C9 + Huawei Device Co., Ltd. - 00E0DA - Alcatel-Lucent Enterprise + E8A6CA + Huawei Device Co., Ltd. - F8BE0D - A2UICT Ltd + CCFA66 + Huawei Device Co., Ltd. - E442A6 - Intel Corporation + 68966A + OHSUNG - 3C678C - Huawei Technologies Ltd + A0E70B + Intel Corporate - D4503F - Guangdong Oppo Mobile Telecommunications Corp Ltd + 04EEEE + Laplace System Co., Ltd. - 388C50 - LG Electronics + 1C3CD4 + HUAWEI TECHNOLOGIES CO.,LTD - DC0856 - Alcatel-Lucent Enterprise + F4E451 + HUAWEI TECHNOLOGIES CO.,LTD - 1CDA27 - Vivo Mobile Communication Ltd + 482218 + Shenzhen Yipingfang Network Technology Co., Ltd. - 90F305 - HUMAX Ltd + F88EA1 + Edgecore Networks Corporation - 4095BD - NTmore Ltd + 2C4881 + vivo Mobile Communication Co., Ltd. - 98AAFC - IEEE Registration Authority + E40CFD + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 00143F - Hotway Technology Corporation + 58D697 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - D055B2 - Integrated Device Technology (Malaysia) Sdn. Bhd. + 30A176 + Fiberhome Telecommunication Technologies Co.,LTD - 144FD7 - IEEE Registration Authority + 48E7DA + AzureWave Technology Inc. - B85510 - Zioncom Electronics (Shenzhen) Ltd + 047153 + SERNET (SUZHOU) TECHNOLOGIES CORPORATION - 049573 - ZTE Corporation + 40C48C + N-iTUS CO.,LTD. - F0D7AA - Motorola Mobility LLC, a Lenovo Company + 5437BB + Taicang T&W Electronics - F8FF0B - Electronic Technology Inc. + 60F8F2 + Synaptec - 7C6BF7 - NTI Ltd + AC74B1 + Intel Corporate - 00D318 - SPG Controls + F46077 + Texas Instruments - 3096FB - Samsung Electronics Ltd + C03C04 + Sagemcom Broadband SAS - 4827EA - Samsung Electronics Ltd + A4D73C + Seiko Epson Corporation - 7C787E - Samsung Electronics Ltd + 000808 + PPT Vision, Inc. - 245BA7 - Apple + 6C108B + WeLink Communications - 70F087 - Apple + 4C7167 + PoLabs d.o.o. - 000C46 - Allied Telesyn Inc. + 7C8530 + Nokia - 001F72 - QingDao Hiphone Technology Ltd + 24A799 + Huawei Device Co., Ltd. - 002365 - Insta Elektro GmbH + 7C3E74 + Huawei Device Co., Ltd. - 6091F3 - Vivo Mobile Communication Ltd + 148919 + 2bps - 28395E - Samsung Electronics Ltd + 58FD5D + Hangzhou Xinyun technology Co., Ltd. - 38295A - Guangdong Oppo Mobile Telecommunications Corp Ltd + 185207 + Sichuan Tianyi Comheart Telecom Co.,LTD - 88E628 - Shenzhen Kezhonglong Optoelectronic Technology Ltd + E0C63C + Sichuan Tianyi Comheart Telecom Co.,LTD - 58238C - Technicolor CH USA Inc. + F8BAE6 + Nokia - CC82EB - Kyocera Corporation + BCECA0 + COMPAL INFORMATION (KUNSHAN) CO., LTD. - 14987D - Technicolor CH USA Inc. + A45590 + Xiaomi Communications Co Ltd - D4CF37 - Symbolic IO + 08010F + Sichuan Tianyi Comheart Telecom Co.,LTD - D47DFC - Tecno Mobile Limited + C0CC42 + Sichuan Tianyi Comheart Telecom Co.,LTD - 409F38 - Azurewave Technologies Inc. + 806559 + EM Microelectronic - BC2F3D - Vivo Mobile Communication Ltd + D047C1 + Elma Electronic AG - 40FA7F - Preh Car Connect GmbH + B8A377 + Cisco Systems, Inc - 000DBB - Nippon Dentsu Ltd + E44E2D + Cisco Systems, Inc - 2C7E81 - ARRIS Group Inc. + DC215C + Intel Corporate - 407D0F - Huawei Technologies Ltd + C42360 + Intel Corporate - 68CC6E - Huawei Technologies Ltd + 78D9E9 + MOMENTUM IOT - 3034D2 - Availink Inc. + 103D1C + Intel Corporate - 504061 - Nokia + 3887D5 + Intel Corporate - 00108E - HUGH SYMONS CoNCEPT Technologies Ltd + 1CD107 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - E05163 - Arcadyan Corporation + 2C0823 + Sercomm France Sarl - 54E3F6 - Alcatel-Lucent + A8934A + CHONGQING FUGUI ELECTRONICS CO.,LTD. - 40B034 - Hewlett-Packard Company + C87B23 + Bose Corporation - B816DB - Chant Sincere Ltd + 00047D + Motorola Solutions Inc. - 40B4CD - Amazon Technologies Inc. + 8C19B5 + Arcadyan Corporation - D481D7 - Dell Inc. + 34AB95 + Espressif Inc. - F42B48 - Ubiqam + C491CF + Luxul - 50F14A - Texas Instruments + D89AC1 + Nokia - 04DEF2 - Shenzhen ECOM Technology Ltd + F0B11D + Nokia - 78C1A7 - ZTE Corporation + 7CD9F4 + UAB Teltonika Telematics - 4C7872 - Cav. Uff. Giacomo Cimberio S.p.A. + A4D795 + Wingtech Mobile Communications Co.,Ltd - 8CF5A3 - Samsung Electro-Mechanics(Thailand) + 84AB26 + Tiinlab Corporation - 8CC8F4 - IEEE Registration Authority + 58356B + TECNO MOBILE LIMITED - F483E1 - Shanghai Clouder Semiconductor Ltd + F89753 + Huawei Device Co., Ltd. - 083E5D - Sagemcom Broadband SAS + 5894AE + Huawei Device Co., Ltd. - 3CBD3E - Beijing Xiaomi Electronics Ltd + B03ACE + Huawei Device Co., Ltd. - 641A22 - Heliospectra AB + F84CDA + HUAWEI TECHNOLOGIES CO.,LTD - A084CB - SonicSensory,Inc. + A4056E + Tiinlab Corporation - D47AE2 - Samsung Electronics Ltd + FC4EA4 + Apple, Inc. - 6854FD - Amazon Technologies Inc. + F4BEEC + Apple, Inc. - 0003BC - CoT GmbH + 54E61B + Apple, Inc. - D4B169 - Le Shi Zhi Xin Electronic Technology (Tianjin) Limited + 14DD9C + vivo Mobile Communication Co., Ltd. - E44790 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 64644A + Beijing Xiaomi Mobile Software Co., Ltd - 38454C - Light Labs Inc. + E89E0C + MAX8USA DISTRIBUTORS INC. - 000A49 - F5 Networks Inc. + 64808B + VG Controls, Inc. - 00A0C8 - Adtran Inc + FC13F0 + Bouffalo Lab (Nanjing) Co., Ltd. - F49651 - NAKAYO Inc + 20896F + Fiberhome Telecommunication Technologies Co.,LTD - 446246 - Comat AG + F4FBB8 + HUAWEI TECHNOLOGIES CO.,LTD - 34FCB9 - Hewlett Packard Enterprise + A070B7 + HUAWEI TECHNOLOGIES CO.,LTD - 70918F - Weber-Stephen Products LLC + 78B554 + Huawei Device Co., Ltd. - D8E0E1 - Samsung Electronics Ltd + 689E6A + Huawei Device Co., Ltd. - 7C1015 - Brilliant Home Technology Inc. + 282B96 + Huawei Device Co., Ltd. - D8C771 - Huawei Technologies Ltd + A439B6 + SHENZHEN PEIZHE MICROELECTRONICS CO .LTD - E02A82 - Universal Global Scientific Industrial Ltd + 0004AD + Malibu Networks - B0F963 - Hangzhou H3C Technologies Ltd + 002618 + ASUSTek COMPUTER INC. - D490E0 - Topcon Electronics GmbH & Co. KG + CC3331 + Texas Instruments - A84041 - Dragino Technology Ltd + FC9C98 + Arlo Technology - E02202 - ARRIS Group Inc. + 1C6EE6 + NHNETWORKS - D825B0 - Rockeetech Systems Ltd + 08F606 + zte corporation - 74614B - Chongqing Huijiatong Information Technology Ltd + B814DB + OHSUNG - 98D293 - Google Inc. + 1CD1E0 + Cisco Systems, Inc - CCB8A8 - AMPAK Technology Inc. + E8FD35 + Huawei Device Co., Ltd. - 1077B0 - Fiberhome Telecommunication Technologies Ltd + ECC5D2 + Huawei Device Co., Ltd. - F01DBC - Microsoft Corporation + 4044FD + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 34049E - IEEE Registration Authority + 646EE0 + Intel Corporate - 94FB29 - Zebra Technologies Inc. + 0456E5 + Intel Corporate - B0702D - Apple + 884604 + Xiaomi Communications Co Ltd - 6C19C0 - Apple + 8C2A8E + DongGuan Ramaxel Memory Technology - 00204F - Deutsche Aerospace AG + 80071B + VSOLUTION TELECOMMUNICATION TECHNOLOGY CO.,LTD. - 00DBDF - Intel Corporation + 24456B + Huawei Device Co., Ltd. - 94A04E - Bostex Technology Ltd + 483871 + Huawei Device Co., Ltd. - 8CE117 - ZTE Corporation + 44BDDE + BHTC GmbH - 688AF0 - ZTE Corporation + B4608C + Fiberhome Telecommunication Technologies Co.,LTD - C0210D - Shenzhen RF-Link Technology Ltd + F40223 + PAX Computer Technology(Shenzhen) Ltd. - 504B5B - CoNTROLtronic GmbH + 6479F0 + Intel Corporate - B47447 - CoreOS + 78653B + Shaoxing Ourten Electronics Co., Ltd. - 80D4A5 - Huawei Technologies Ltd + E0E656 + Nethesis srl - 04B0E7 - Huawei Technologies Ltd + 4CF202 + Xiaomi Communications Co Ltd - 446A2E - Huawei Technologies Ltd + A877E5 + SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD - AC587B - JCT Healthcare + 10A4DA + HUAWEI TECHNOLOGIES CO.,LTD - 1062EB - D-Link International + FC584A + xiamenshi c-chip technology co., ltd - 000894 - InnoVISION Multimedia Ltd + 84D608 + Wingtech Mobile Communications Co., Ltd. - 480033 - Technicolor CH USA Inc. + 346893 + Tecnovideo Srl - A06FAA - LG Innotek + 9023B4 + New H3C Technologies Co., Ltd - 0026AB - Seiko Epson Corporation + 882A5E + New H3C Technologies Co., Ltd - FC10C6 - Taicang T&W Electronics + FCA9DC + Renesas Electronics (Penang) Sdn. Bhd. - 2C6FC9 - Hon Hai Precision Ind Ltd + 3C7AAA + China Dragon Technology Limited - 58EF68 - Belkin International Inc. + 84FD27 + Silicon Laboratories - 000B4F - Verifone + 28D3EA + Huawei Device Co., Ltd. - 60C798 - Verifone + A8F266 + Huawei Device Co., Ltd. - C8662C - Beijing Haitai Fangyuan High Technology Ltd + CC9C3E + Cisco Meraki - 8096CA - Hon Hai Precision Ind Ltd + 84267A + GUANGDONG TAIDE ZHILIAN TECHNOLOGY CO.,LTD - 186571 - Top Victory Electronics (Taiwan) Ltd + 6C4760 + Sunitec Enterprise Co.,Ltd - F83F51 - Samsung Electronics Ltd + 183219 + EM Microelectronic - 50D753 - CoNELCOM GmbH + 0020C1 + SAXA, Inc. - 0CC47A - Super Micro Computer Inc. + 4829E4 + AO - 34D270 - Amazon Technologies Inc. + 3C9BC6 + Huawei Device Co., Ltd. - 50795B - Interexport Telecomunicaciones S.A. + 0036BE + Northwest Towers - 0016D9 - Ningbo Bird Ltd + A45E5A + ACTIVIO Inc. - 6CA7FA - Youngbo Engineering Inc. + 7C5079 + Intel Corporate - 8C7EB3 - Lytro Inc. + 8038FB + Intel Corporate - B4B384 - Shenzhen Figigantic Electronic Ltd + 501FC6 + Apple, Inc. - 7828CA - Sonos Inc. + CC69FA + Apple, Inc. - 00C003 - Globalnet Communications + 10CEE9 + Apple, Inc. - 00234A - Private + 5C56A4 + Wanan Hongsheng Electronic Co.Ltd - 2C402B - Smart iBlue Technology Limited + 642656 + Shenzhen Fanweitai Technology Service Co.,Ltd - 5C6B4F - Hello Inc. + AC8247 + Intel Corporate - 2C9924 - ARRIS Group Inc. + F0258E + HUAWEI TECHNOLOGIES CO.,LTD - D058A8 - ZTE Corporation + 9C746F + HUAWEI TECHNOLOGIES CO.,LTD - D071C4 - ZTE Corporation + AC74C4 + Maytronics Ltd. - A0CC2B - Murata Manufacturing Ltd + 540910 + Apple, Inc. - 5001D9 - Huawei Technologies Ltd + 9CFC28 + Apple, Inc. - 00271C - Mercury Corporation + B485E1 + Apple, Inc. - E0D9E3 - Eltex Enterprise Ltd + 0C19F8 + Apple, Inc. - 805EC0 - Yealink(Xiamen) Network Technology Ltd + 08B4B1 + Google, Inc. - 007B18 - SENTRY Ltd + 382028 + HUAWEI TECHNOLOGIES CO.,LTD - 144D67 - Zioncom Electronics (Shenzhen) Ltd + E47727 + HUAWEI TECHNOLOGIES CO.,LTD - 4CE173 - IEEE Registration Authority + 105107 + Intel Corporate - 0CD86C - Shenzhen Fast Technologies Ltd + 749AC0 + Cachengo, Inc. - 049790 - Lartech telecom LLC + 34587C + MIRAE INFORMATION TECHNOLOGY CO., LTD. - 28EED3 - Shenzhen Super D Technology Ltd + A03B01 + Kyung In Electronics - 24C44A - ZTE Corporation + 145E69 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 98541B - Intel Corporation + C4E287 + HUAWEI TECHNOLOGIES CO.,LTD - 1C40E8 - Shenzhen Progress & WIN Technology Ltd + 54F607 + Huawei Device Co., Ltd. - 0023D2 - Inhand Electronics Inc. + A0A3F0 + D-Link International - DC0B34 - LG Electronics (Mobile Communications) + E8A0CD + Nintendo Co.,Ltd - 404E36 - HTC Corporation + 9C823F + Huawei Device Co., Ltd. - A8E705 - Fiberhome Telecommunication Technologies Ltd + E06C4E + Shenzhen TINNO Mobile Technology Corp. - 9840BB - Dell Inc. + 50558D + China Mobile IOT Company Limited - 0060D6 - NovAtel Inc. + 64E003 + Hui Zhou Gaoshengda Technology Co.,LTD - 503AA0 - Shenzhen Mercury Communication Technologies Ltd + 34F716 + TP-LINK TECHNOLOGIES CO.,LTD. - B0958E - TP-Link Technologies Ltd + 846569 + New H3C Technologies Co., Ltd - C025E9 - TP-Link Technologies Ltd + 281B04 + Zalliant LLC - 802AA8 - Ubiquiti Networks Inc. + 7C5259 + Sichuan Jiuzhou Electronic Technology Co., Ltd. - F09FC2 - Ubiquiti Networks Inc. + F4B301 + Intel Corporate - 188B15 - Shenzhen ZhongRuiJing Technology Ltd + 0C96CD + MERCURY CORPORATION - 788A20 - Ubiquiti Networks Inc. + 18CE94 + Samsung Electronics Co.,Ltd - 886B0F - Bluegiga Technologies Oy + 783716 + Samsung Electronics Co.,Ltd - AC84C9 - Sagemcom Broadband SAS + 5C6F69 + Broadcom Limited - 245CBF - Ncse + 78CF2F + HUAWEI TECHNOLOGIES CO.,LTD - 2C3361 - Apple + A83B5C + HUAWEI TECHNOLOGIES CO.,LTD - 60A4D0 - Samsung Electronics Ltd + 045FB9 + Cisco Systems, Inc - 008701 - Samsung Electronics Ltd + 102FA3 + Shenzhen Uvision-tech Technology Co.Ltd - 5C9960 - Samsung Electronics Ltd + 04495D + Huawei Device Co., Ltd. - 9C62AB - Sumavision Technologies Ltd + F0FEE7 + Huawei Device Co., Ltd. - C8F946 - LOCOSYS Technology Inc. + E8F408 + Intel Corporate - 487B6B - Huawei Technologies Ltd + 58B0FE + Team EPS GmbH - 883FD3 - Huawei Technologies Ltd + DCCD74 + Japan E.M.Solutions Co., Ltd. - 240D65 - Shenzhen Vsun Communication Technology Ltd + 748B29 + Micobiomed - 000B14 - ViewSonic Corporation + 484C29 + HUAWEI TECHNOLOGIES CO.,LTD - C8028F - Nova Electronics (Shanghai) Ltd + C4D438 + HUAWEI TECHNOLOGIES CO.,LTD - A46011 - Verifone + 54211D + Huawei Device Co., Ltd. - 5CA933 - Luma Home + 143FA6 + Sony Home Entertainment&Sound Products Inc - 00137E - CorEdge Networks Inc. + DCA120 + Nokia - D814D6 - SURE SysTEM Ltd + 50523B + Nokia - 6CEFC6 - Shenzhen Twowing Technologies Ltd + 2406AA + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 101DC0 - Samsung Electronics Ltd + 8CAE49 + IEEE Registration Authority - 002341 - Vanderbilt International (SWE) AB + 20FF36 + IFLYTEK CO.,LTD. - 407C7D - Nokia + 24649F + Huawei Device Co., Ltd. - 24590B - White Sky Inc. Limited + 0C1773 + Huawei Device Co., Ltd. - 68EBAE - Samsung Electronics Ltd + E81E92 + Huawei Device Co., Ltd. - 444E1A - Samsung Electronics Ltd + 888E68 + Huawei Device Co., Ltd. - 143365 - TEM Mobile Limited + 807484 + ALL Winner (Hong Kong) Limited - 801844 - Dell Inc. + 88238C + Fiberhome Telecommunication Technologies Co.,LTD - 78471D - Samsung Electronics Ltd + A8CC6F + HMD Global Oy - A07591 - Samsung Electronics Ltd + A4CCB9 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 0CDFA4 - Samsung Electronics Ltd + 6CB881 + zte corporation - B072BF - Murata Manufacturing Ltd + 989AB9 + zte corporation - 701DC4 - NorthStar Battery Company LLC + 008A55 + Huawei Device Co., Ltd. - 64DAA0 - Robert Bosch Smart Home GmbH + 64A28A + Huawei Device Co., Ltd. - 14B837 - Shenzhen YOUHUA Technology Ltd + AC471B + Huawei Device Co., Ltd. - 5C8613 - Beijing Zhoenet Technology Ltd + 0865F0 + JM Zengge Co., Ltd - CC7314 - Hong Kong Wheatek Technology Limited + 14AB02 + HUAWEI TECHNOLOGIES CO.,LTD - B8EE65 - Liteon Technology Corporation + B04530 + SKY UK LIMITED - 985BB0 - Kmdata Inc. + 6CA0B4 + SKY UK LIMITED - E006E6 - Hon Hai Precision Ind Ltd + EC0DE4 + Amazon Technologies Inc. - BC8556 - Hon Hai Precision Ind Ltd + B456E3 + Apple, Inc. - 342387 - Hon Hai Precision Ind Ltd + 843095 + Hon Hai Precision IND.CO.,LTD - 002637 - Samsung Electro Mechanics Ltd + 3C6105 + Espressif Inc. - 002119 - Samsung Electro Mechanics Ltd + 4C20B8 + Apple, Inc. - F4D9FB - Samsung Electronics Ltd + 1488E6 + Apple, Inc. - 3C6200 - Samsung Electronics Ltd + 7895EB + ITEL MOBILE LIMITED - C417FE - Hon Hai Precision Ind Ltd + 1C9F4E + COOSEA GROUP (HK) COMPANY LIMITED - 9439E5 - Hon Hai Precision Ind Ltd + A468BC + Oakley Inc. - 642737 - Hon Hai Precision Ind Ltd + 8CFDDE + Sagemcom Broadband SAS - A41731 - Hon Hai Precision Ind Ltd + 48D890 + FN-LINK TECHNOLOGY LIMITED - 5CA39D - Samsung Electro Mechanics Ltd + B0C53C + Cisco Systems, Inc - 90187C - Samsung Electro Mechanics Ltd + ECCE13 + Cisco Systems, Inc - 50CCF8 - Samsung Electro Mechanics Ltd + C418E9 + Samsung Electronics Co.,Ltd - 00223B - Communication Networks LLC + 1CE57F + Samsung Electronics Co.,Ltd - C0F8DA - Hon Hai Precision Ind Ltd + 085531 + Routerboard.com - 0011FF - Digitro Tecnologia Ltda + 241145 + Xiaomi Communications Co Ltd - 001B94 - T.E.M.A. S.p.A. + 00042B + IT Access Co., Ltd. - F0F002 - Hon Hai Precision Ind Ltd + D44F67 + HUAWEI TECHNOLOGIES CO.,LTD - C0CB38 - Hon Hai Precision Ind Ltd + F8B95A + LG Innotek - F07BCB - Hon Hai Precision Ind Ltd + 781F11 + RAB Lighting - 50B7C3 - Samsung Electronics Ltd + 107100 + Huawei Device Co., Ltd. - 1C5A3E - Samsung Electronics Ltd + 607EA4 + Shanghai Imilab Technology Co.Ltd - A02195 - Samsung Electronics Ltd + B4FF98 + HUAWEI TECHNOLOGIES CO.,LTD - B07870 - Wi-NEXT Inc. + 0838E6 + Motorola (Wuhan) Mobility Technologies Communication Co., Ltd. - E47CF9 - Samsung Electronics Ltd + E8C2DD + Infinix mobility limited - 4844F7 - Samsung Electronics Ltd + C41C9C + JiQiDao - 001377 - Samsung Electronics Ltd + 98F181 + New H3C Technologies Co., Ltd - 002454 - Samsung Electronics Ltd + 8C55BB + Songwoo Information & Technology Co., Ltd - E81132 - Samsung Electronics Ltd + 7C8FDE + DWnet Technologies(Suzhou) Corporation - C06599 - Samsung Electronics Ltd + 90808F + Huawei Device Co., Ltd. - BC79AD - Samsung Electronics Ltd + 184516 + Texas Instruments - 4C3C16 - Samsung Electronics Ltd + D02EAB + Texas Instruments - 0073E0 - Samsung Electronics Ltd + 847127 + Silicon Laboratories - 0017D5 - Samsung Electronics Ltd + F0F7E7 + HUAWEI TECHNOLOGIES CO.,LTD - 001E7D - Samsung Electronics Ltd + 849DC2 + Shanghai MXCHIP Information Technology Co., Ltd. - 001DF6 - Samsung Electronics Ltd + 40A9CF + Amazon Technologies Inc. - F008F1 - Samsung Electronics Ltd + 5895D8 + IEEE Registration Authority - 58C38B - Samsung Electronics Ltd + F80DAC + HP Inc. - 00E3B2 - Samsung Electronics Ltd + 8850F6 + Shenzhen Jingxun Software Telecommunication Technology Co.,Ltd - 301966 - Samsung Electronics Ltd + 0405DD + Shenzhen Cultraview Digital Technology Co., Ltd - F0E77E - Samsung Electronics Ltd + 3897A4 + ELECOM CO.,LTD. - 94350A - Samsung Electronics Ltd + E433AE + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 001D25 - Samsung Electronics Ltd + 387A3C + Fiberhome Telecommunication Technologies Co.,LTD - E4C1F1 - Shenzhen SPOTMAU InfORMATION TECHNOLIGY Ltd + 40B5C1 + Cisco Systems, Inc - 240AC4 - Espressif Inc. + E44791 + Iris ID Systems, Inc. - 343111 - Samsung Electronics Ltd + F013C1 + Hannto Technology Co., Ltd - 08FD0E - Samsung Electronics Ltd + 8454DF + Huawei Device Co., Ltd. - 041BBA - Samsung Electronics Ltd + E884A5 + Intel Corporate - 889B39 - Samsung Electronics Ltd + 00C035 + QUINTAR COMPANY - E432CB - Samsung Electronics Ltd + 1C501E + Sunplus Technology Co., Ltd. - BC8CCD - Samsung Electro-Mechanics(Thailand) + FC66CF + Apple, Inc. - D022BE - Samsung Electro-Mechanics(Thailand) + AC1D06 + Apple, Inc. - EC9BF3 - Samsung Electro-Mechanics(Thailand) + 44A8FC + Apple, Inc. - F409D8 - Samsung Electro-Mechanics(Thailand) + F81093 + Apple, Inc. - 10D542 - Samsung Electronics Ltd + DCE994 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - A0821F - Samsung Electronics Ltd + 409505 + ACOINFO TECHNOLOGY CO.,LTD - F06BCA - Samsung Electronics Ltd + 5CD89E + Huawei Device Co., Ltd. - AC3613 - Samsung Electronics Ltd + B82D28 + AMPAK Technology,Inc. - 002611 - Licera AB + A4134E + Luxul - 005094 - ARRIS Group Inc. + B85F98 + Amazon Technologies Inc. - E0B7B1 - ARRIS Group Inc. + D8F883 + Intel Corporate - D82522 - ARRIS Group Inc. + B436D1 + Renesas Electronics (Penang) Sdn. Bhd. - F0038C - Azurewave Technologies Inc. + 101965 + New H3C Technologies Co., Ltd - 18D276 - Huawei Technologies Ltd + DC774C + Cisco Systems, Inc - 005218 - Wuxi Keboda Electron Ltd + 204441 + Remote Solution - 001E81 - CNB Technology Inc. + FC4482 + Intel Corporate - 7CA97D - Objenious + A085FC + Microsoft Corporation - A8A648 - Qingdao Hisense Communications Ltd + 80F1F1 + Tech4home, Lda - 985DAD - Texas Instruments + 006151 + HUAWEI TECHNOLOGIES CO.,LTD - D43639 - Texas Instruments + BC76C5 + HUAWEI TECHNOLOGIES CO.,LTD - BC282C - e-Smart Systems Pvt Ltd + 5C0272 + Silicon Laboratories - A40DBC - Xiamen Intretech Inc. + 000430 + Netgem - 84EF18 - Intel Corporation + 0446CF + Beijing Venustech Cybervision Co.,Ltd. - 84C1C1 - Juniper Networks + B88035 + Shenzhen Qihu Intelligent Technology Company Limited - A81B6A - Texas Instruments + 9012A1 + We Corporation Inc. - 343DC4 - Buffalo Inc. + 64B623 + Schrack Seconet Care Communication GmbH - B0F893 - Shanghai MXCHIP Information Technology Ltd + 000EFF + Megasolution,Inc. - C411E0 - Bull Group Ltd + 702C09 + Nintendo Co.,Ltd - 28C87A - ARRIS Group Inc. + E4D373 + HUAWEI TECHNOLOGIES CO.,LTD - 48FD8E - Huawei Technologies Ltd + C0BC9A + HUAWEI TECHNOLOGIES CO.,LTD - 7C0623 - Ultra Electronics Sonar System Division + E81B69 + Sercomm Corporation. - 28AC67 - Mach Power, Rappresentanze Internazionali s.r.l. + 6852D6 + UGame Technology Co.,Ltd - 14825B - Hefei Radio Communication Technology Ltd + FC1999 + Xiaomi Communications Co Ltd - 641269 - ARRIS Group Inc. + CC874A + Nokia - 0002C9 - Mellanox Technologies Inc. + A45129 + XAG - 080051 - ExperData + B4C26A + Garmin International - 00126C - Visonic Technologies 1993 Ltd + 78F8B8 + Rako Controls Ltd - AC6175 - Huawei Technologies Ltd + 6CE5F7 + New H3C Technologies Co., Ltd - 244427 - Huawei Technologies Ltd + B8DD71 + zte corporation - 0080C7 - Xircom + F4E578 + LLC Proizvodstvennaya Kompania TransService - 000138 - XAVi Technologies Corp. + 0854BB + SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD - 00166D - Yulong Computer Telecommunication Scientific (Shenzhen) Ltd + 3C9C0F + Intel Corporate - 3C9157 - Yulong Computer Telecommunication Scientific (Shenzhen) Ltd + 1C5D80 + Mitubishi Hitachi Power Systems Industries Co., Ltd. - 0000D8 - Novell Inc. + 3CB15B + Avaya Inc - 001F46 - Nortel Networks + 5865E6 + infomark - 003093 - Sonnet Technologies Inc. + 08FBEA + AMPAK Technology,Inc. - 00034B - Nortel Networks + 60EB5A + Asterfusion Data Technologies Co.,Ltd - 002561 - ProCurve Networking by HP + 5C443E + Skullcandy - 008058 - Printer Systems Corp. + F88200 + CaptionCall - 00157D - Posdata + 0050F1 + Maxlinear, Inc - 4849C7 - Samsung Electronics Ltd + 801605 + Vodafone Italia S.p.A. - 849866 - Samsung Electronics Ltd + A802DB + zte corporation - 001C9C - Nortel Networks + 74F7F6 + Shanghai Sunmi Technology Co.,Ltd. - 001B25 - Nortel Networks + 241AE6 + Huawei Device Co., Ltd. - 0019E1 - Nortel Networks + C45444 + Quanta Computer Inc. - 001D42 - Nortel Networks + 001B24 + Quanta Computer Inc. - 00140D - Nortel Networks + 00C09F + Quanta Computer Inc. - 000E40 - Nortel Networks + C80AA9 + Quanta Computer Inc. - FCB0C4 - Shanghai DareGlobal Technologies Ltd + 60EB69 + Quanta Computer Inc. - A89DD2 - Shanghai DareGlobal Technologies Ltd + B42330 + Itron Inc - 00E00F - Shanghai Baud Data Communication Ltd + 000895 + DIRC Technologie GmbH & Co.KG - 28BE03 - TCT mobile Ltd + 00269E + Quanta Computer Inc. - 903AE6 - Parrot SA + A022DE + vivo Mobile Communication Co., Ltd. - A098ED - Shandong Intelligent Optical Communication Development Ltd + FC73FB + HUAWEI TECHNOLOGIES CO.,LTD - 000EF4 - Kasda Networks Inc + 60B76E + Google, Inc. - 00167A - Skyworth Overseas Development Ltd + 00927D + Ficosa Internationa(Taicang) C0.,Ltd. - A42940 - Shenzhen YOUHUA Technology Ltd + 441622 + Microsoft Corporation - E4A387 - Control Solutions LLC + 044562 + ANDRA Sp. z o. o. - 1880F5 - Alcatel-Lucent Shanghai Bell Ltd + 94AEF0 + Cisco Systems, Inc - 10E878 - Nokia + DCD9AE + Nokia Shanghai Bell Co., Ltd. - 10F96F - LG Electronics (Mobile Communications) + C4366C + LG Innotek - C4438F - LG Electronics (Mobile Communications) + 1C08C1 + LG Innotek - A09169 - LG Electronics (Mobile Communications) + BCA993 + Cambium Networks Limited - 286C07 - XIAOMI Electronics Ltd + A497B1 + CHONGQING FUGUI ELECTRONICS CO.,LTD. - 002280 - A2B Electronics AB + 44E6B0 + China Mobile IOT Company Limited - 404AD4 - Widex A/S + 747A90 + Murata Manufacturing Co., Ltd. - 9893CC - LG Electronics Inc + 58B623 + Beijing Xiaomi Mobile Software Co., Ltd - 3CCD93 - LG Electronics Inc + 14007D + zte corporation - 2021A5 - LG Electronics (Mobile Communications) + 24E9CA + Huawei Device Co., Ltd. - 6CD68A - LG Electronics (Mobile Communications) + D440D0 + OCOSMOS Co., LTD - CC79CF - Shenzhen RF-Link Technology Ltd + 98B8BC + Samsung Electronics Co.,Ltd - 001925 - Intelicis Corporation + 703AA6 + New H3C Technologies Co., Ltd - 9476B7 - Samsung Electronics Ltd + 8CCEFD + Shenzhen zhouhai technology co.,LTD - 2C54CF - LG Electronics (Mobile Communications) + 50FB19 + CHIPSEA TECHNOLOGIES (SHENZHEN) CORP. - 485929 - LG Electronics (Mobile Communications) + 9408C7 + Huawei Device Co., Ltd. - 58A2B5 - LG Electronics (Mobile Communications) + C8CA63 + Huawei Device Co., Ltd. - 002483 - LG Electronics (Mobile Communications) + 9437F7 + Huawei Device Co., Ltd. - 001FE3 - LG Electronics (Mobile Communications) + 184E16 + Samsung Electronics Co.,Ltd - F0421C - Intel Corporation + C03D03 + Samsung Electronics Co.,Ltd - 000F62 - Alcatel Bell Space N.V. + 10746F + MOTOROLA SOLUTIONS MALAYSIA SDN. BHD. - 001CD8 - BlueAnt Wireless + D0C637 + Intel Corporate - 0019AB - Raycom Co Ltd + D49234 + NEC Corporation - 4C334E - Hightech + 386893 + Intel Corporate - 7C70BC - IEEE Registration Authority + 903FEA + HUAWEI TECHNOLOGIES CO.,LTD - E81863 - IEEE Registration Authority + 20AB48 + HUAWEI TECHNOLOGIES CO.,LTD - 2CD141 - IEEE Registration Authority + CCD73C + HUAWEI TECHNOLOGIES CO.,LTD - 3C39E7 - IEEE Registration Authority + 94E70B + Intel Corporate - BC6641 - IEEE Registration Authority + 046C59 + Intel Corporate - 80E4DA - IEEE Registration Authority + D4ABCD + Hui Zhou Gaoshengda Technology Co.,LTD - 885D90 - IEEE Registration Authority + A0CAA5 + INTELLIGENCE TECHNOLOGY OF CEC CO., LTD - C88ED1 - IEEE Registration Authority + E8854B + Apple, Inc. - B01F81 - IEEE Registration Authority + E00EE4 + DWnet Technologies(Suzhou) Corporation - 549A11 - IEEE Registration Authority + 58FDB1 + LG Electronics - B8D812 - IEEE Registration Authority + 34EAE7 + Shanghai High-Flying Electronics Technology Co., Ltd - 1C21D1 - IEEE Registration Authority + CC9ECA + HMD Global Oy - 283638 - IEEE Registration Authority + 28EC95 + Apple, Inc. - F485C6 - FDT Technologies + E02B96 + Apple, Inc. - D404FF - Juniper Networks + 184593 + Taicang T&W Electronics - C8755B - Quantify Technology Pty Ltd + F86C03 + Shenzhen Teleone Technology Co., Ltd - 88124E - Qualcomm Inc. + 105DDC + Huawei Device Co., Ltd. - 001428 - Vocollect Inc + DC7385 + Huawei Device Co., Ltd. - 006B9E - Vizio Inc. + 5455D5 + Huawei Device Co., Ltd. - 4C6641 - Samsung Electro-Mechanics(Thailand) + F041C6 + Heat Tech Company, Ltd. - 5CA86A - Huawei Technologies Ltd + C49886 + Qorvo International Pte. Ltd. - 001B32 - QLogic Corporation + E43A65 + MofiNetwork Inc - 0017CA - Qisda Corporation + 54219D + Samsung Electronics Co.,Ltd - 70F395 - Universal Global Scientific Industrial Ltd + 3C306F + HUAWEI TECHNOLOGIES CO.,LTD - 48F7C0 - Technicolor CH USA Inc. + 80E1BF + HUAWEI TECHNOLOGIES CO.,LTD - 0015B7 - Toshiba + 482CD0 + HUAWEI TECHNOLOGIES CO.,LTD - E89D87 - Toshiba + D8714D + Texas Instruments - E09579 - ORTHOsoft Inc, d/b/a Zimmer CAS + 0CEC80 + Texas Instruments - A0ADA1 - JMR Electronics Inc. + 709F2D + zte corporation - BCC00F - Fiberhome Telecommunication Technologies Ltd + 5C0FFB + Amino Communications Ltd - 9CA5C0 - Vivo Mobile Communication Ltd + E82A44 + Liteon Technology Corporation - 80C6AB - Technicolor CH USA Inc. + 48E1E9 + Chengdu Meross Technology Co., Ltd. - 90A4DE - Wistron Neweb Corporation + 08B055 + ASKEY COMPUTER CORP - 70E284 - Wistron Infocomm (Zhongshan) Corporation + A0DE0F + Huawei Device Co., Ltd. - A854B2 - Wistron Neweb Corporation + F487C5 + Huawei Device Co., Ltd. - 3044A1 - Shanghai Nanchao Information Technology + 882B94 + MADOKA SYSTEM Co.,Ltd. - CC03FA - Technicolor CH USA Inc. + 7CEF61 + STR Elektronik Josef Schlechtinger GmbH - E0ACF1 - Cisco Systems Inc. + 400589 + T-Mobile, USA - 00015B - ITALTEL S.p.A/RF-UP-I + 64A965 + Linkflow Co., Ltd. - 00A0A8 - Renex Corporation + 3CF652 + zte corporation - 00C0AB - Telco Systems Inc. + A80577 + Netlist, Inc. - 0023F8 - ZyXEL Communications Corp + 404028 + ZIV - 0019CB - ZyXEL Communications Corp + 7458F3 + Amazon Technologies Inc. - 2C094D - Raptor Engineering LLC + 08AA55 + Motorola Mobility LLC, a Lenovo Company - AC3743 - HTC Corporation + 001354 + Zcomax Technologies, Inc. - 001D7E - Cisco-Linksys LLC + C09BF4 + IEEE Registration Authority - E4FB8F - Mobiwire Mobiles (Ningbo) Ltd + 30B237 + GD Midea Air-Conditioning Equipment Co.,Ltd. - 10BD55 - Q-Lab Corporation + 68E209 + HUAWEI TECHNOLOGIES CO.,LTD - C449BB - Mitsumi Electric Ltd + F4308B + Xiaomi Communications Co Ltd - FC2D5E - ZTE Corporation + DC6B12 + worldcns inc. - B40418 - Smartchip Integrated Inc. + AC4A56 + Cisco Systems, Inc - 90CF7D - Qingdao Hisense Communications Ltd + B0B5C3 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - F40A4A - IndUSNET Communication Technology Ltd + 282373 + Digita - F85A00 - Sanford LP + D0ABD5 + Intel Corporate - FC55DC - Baltic Latvian Universal Electronics LLC + D4C1C8 + zte corporation - 941882 - Hewlett Packard Enterprise + 88D274 + zte corporation - 6038E0 - Belkin International Inc. + BC5A56 + Cisco Systems, Inc - 8850DD - Infiniband Trade Association + 704A0E + AMPAK Technology,Inc. - D0B2C4 - Technicolor CH USA Inc. + BC0F9A + D-Link International - 50AB3E - Qibixx AG + 4CCE2D + Danlaw Inc - 3876CA - Shenzhen Smart Intelligent Technology Ltd + 0C35FE + Fiberhome Telecommunication Technologies Co.,LTD - 042758 - Huawei Technologies Ltd + 8C83DF + Nokia - 9CE374 - Huawei Technologies Ltd + 30B9B0 + Intracom Asia Co., Ltd - 8CD2E9 - Yokote Seiko Ltd + D4DACD + SKY UK LIMITED - B8BBAF - Samsung Electronics Ltd + F4B78D + HUAWEI TECHNOLOGIES CO.,LTD - 60C5AD - Samsung Electronics Ltd + A416E7 + HUAWEI TECHNOLOGIES CO.,LTD - 442C05 - AMPAK Technology Inc. + B40931 + HUAWEI TECHNOLOGIES CO.,LTD - 8C897A - Augtek + 94E7EA + HUAWEI TECHNOLOGIES CO.,LTD - F845AD - Konka Group Ltd + 94E4BA + Huawei Device Co., Ltd. - 000FE2 - Hangzhou H3C Technologies Ltd + 347146 + Huawei Device Co., Ltd. - 80F62E - Hangzhou H3C Technologies Ltd + 2CC546 + Huawei Device Co., Ltd. - 608D17 - Sentrus Government Systems Division Inc. + 0C839A + Huawei Device Co., Ltd. - ECADB8 - Apple + E0E0FC + Huawei Device Co., Ltd. - 9801A7 - Apple + AC4B1E + Integri-Sys.Com LLC - 6879ED - Sharp Corporation + 6869CA + Hitachi, Ltd. - 002382 - Lih Rong electronic Enterprise Ltd + B0E4D5 + Google, Inc. - 24F094 - Apple + 88C397 + Beijing Xiaomi Mobile Software Co., Ltd - 086D41 - Apple + E0D4E8 + Intel Corporate - B4D5BD - Intel Corporation + 305075 + GN Audio A/S - 98AA3C - Will i-tech Ltd + 90EC77 + silicom - BCAD28 - Hangzhou Hikvision Digital Technology Ltd + B440A4 + Apple, Inc. - F4911E - Zhuhai Ewpe Information Technology Inc + 48B8A3 + Apple, Inc. - 002552 - VXi Corporation + F4DBE3 + Apple, Inc. - 6CE983 - Gastron Ltd + BC428C + ALPSALPINE CO,.LTD - 28E31F - Xiaomi Communications Ltd + 04BDBF + Samsung Electronics Co.,Ltd - 989096 - Dell Inc. + BC7ABF + Samsung Electronics Co.,Ltd - DC3752 - GE + 60684E + Samsung Electronics Co.,Ltd - DCD916 - Huawei Technologies Ltd + 8020FD + Samsung Electronics Co.,Ltd - 00022E - TEAC Corp. R& D + B4CE40 + Samsung Electronics Co.,Ltd - 0060B0 - Hewlett-Packard Company + D45EEC + Beijing Xiaomi Electronics Co., Ltd. - 7C738B - Cocoon Alarm Ltd + 4C4576 + China Mobile(Hangzhou) Information Technology Co.,Ltd. - F80F84 - Natural Security SAS + 74C929 + Zhejiang Dahua Technology Co., Ltd. - 44A42D - TCT mobile Ltd + 94CC04 + IEEE Registration Authority - 70F96D - Hangzhou H3C Technologies Ltd + 5CB29E + ASCO Power Technologies - BC6A44 - Commend International GmbH + 347839 + zte corporation - F0EE58 - PACE Telematics GmbH + D84DB9 + Wu Qi Technologies,Inc. - 083FBC - ZTE Corporation + A04F85 + LG Electronics (Mobile Communications) - 00C0F0 - Kingston Technology Company Inc. + 2C1A01 + HUAWEI TECHNOLOGIES CO.,LTD - 943BB1 - Kaonmedia Ltd + 24169D + Cisco Systems, Inc - 0018D7 - JAVAD GNSS Inc. + F419E2 + Volterra - 001F09 - Jastec + 6C0D34 + Nokia - AC620D - Jabil Circuit(Wuxi) Ltd + 00233D + Laird Technologies - 08000D - International Computers Ltd + 6C1632 + HUAWEI TECHNOLOGIES CO.,LTD - 1C7370 - Neotech + 30809B + New H3C Technologies Co., Ltd - 30E37A - Intel Corporation + 7422BB + Huawei Device Co., Ltd. - 0000C9 - Emulex Corporation + 4C6371 + Xiaomi Communications Co Ltd - 0040AA - Valmet Automation + 5CBAEF + CHONGQING FUGUI ELECTRONICS CO.,LTD. - D0B0CD - Moen + 000ADB + Trilliant - 7050AF - BSkyB Ltd + 30AB6A + SAMSUNG ELECTRO-MECHANICS(THAILAND) - F4EF9E - Sgsg Science & Technology Ltd + 8C6078 + Swissbit AG - 1C740D - ZyXEL Communications Corp + F80DF0 + zte corporation - 603ECA - Cambridge Medical Robotics Ltd + 9CE91C + zte corporation - 001F1F - Edimax Technology Ltd + 749BE8 + Hitron Technologies. Inc - 00020E - ECI Telecom Ltd + 00DD25 + Shenzhen hechengdong Technology Co., Ltd - 200A5E - Xiangshan Giant Eagle Technology Developing Ltd + 0445A1 + NIRIT- Xinwei Telecom Technology Co., Ltd. - 9C741A - Huawei Technologies Ltd + 8020E1 + BVBA DPTechnics - E4A8B6 - Huawei Technologies Ltd + 8C97EA + FREEBOX SAS - 244C07 - Huawei Technologies Ltd + FC8E6E + StreamCCTV, LLC - 746FF7 - Wistron Neweb Corporation + 788B2A + Zhen Shi Information Technology (Shanghai) Co., Ltd. - B8AEED - Elitegroup Computer Systems Ltd + AC64CF + FN-LINK TECHNOLOGY LIMITED - 000DB0 - Olym-tech Ltd + 3CFAD3 + IEEE Registration Authority - 30F6B9 - Ecocentric Energy + 5C17CF + OnePlus Technology (Shenzhen) Co., Ltd - 847BEB - Dell Inc. + 102959 + Apple, Inc. - 54511B - Huawei Technologies Ltd + F06728 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 68536C - SPnS Ltd + E02AE6 + Fiberhome Telecommunication Technologies Co.,LTD - 1CEA1B - Nokia + 14F6D8 + Intel Corporate - D4612E - Huawei Technologies Ltd + 3CDA6D + Tiandy Technologies CO.,LTD - B0E2E5 - Fiberhome Telecommunication Technologies Ltd + A4FA76 + New H3C Technologies Co., Ltd - 001FA7 - Sony Interactive Entertainment Inc. + 9CE176 + Cisco Systems, Inc - 9046A2 - Tedipay UK Ltd + B41A1D + Samsung Electronics Co.,Ltd - 6479A7 - Phison Electronics Corp. + E47684 + Apple, Inc. - CCB11A - Samsung Electronics Ltd + F05CD5 + Apple, Inc. - 703C03 - RadiAnt Ltd + 70EA5A + Apple, Inc. - 00C164 - Cisco Systems Inc. + 4CE176 + Cisco Systems, Inc - DC2DCB - Beijing Unis HengYue Technology Ltd + 1434F6 + LV SOLUTION SDN. BHD. - 2C9662 - Invenit BV + 18AFA1 + Shenzhen Yifang Network Technology Co., Ltd. - CCD3E2 - Jiangsu Yinhe Electronics Ltd + 54CE69 + Hikari Trading Co.,Ltd. - E4FAED - Samsung Electronics Ltd + C014B8 + Nokia - 288335 - Samsung Electronics Ltd + D028BA + Realme Chongqing MobileTelecommunications Corp Ltd - DCCF96 - Samsung Electronics Ltd + A428B7 + Yangtze Memory Technologies Co., Ltd. - AC44F2 - Yamaha Corporation + 9492D2 + KCF Technologies, Inc. - 1C5F2B - D-Link International + E4A8DF + COMPAL INFORMATION (KUNSHAN) CO., LTD. - 1C98EC - Hewlett Packard Enterprise + 702F35 + HUAWEI TECHNOLOGIES CO.,LTD - 70661B - Sonova AG + 8C53C3 + Beijing Xiaomi Mobile Software Co., Ltd - B07FB9 - Netgear + D83BBF + Intel Corporate - 047E4A - moobox Ltd + 000DBB + Nippon Dentsu Co.,Ltd. - 0080E5 - NetApp + 0CEE99 + Amazon Technologies Inc. - 9C5C8E - ASUSTek Computer Inc. + E826B6 + Companies House to GlucoRx Technologies Ltd. - C88722 - Lumenpulse + 00763D + Veea - 84683E - Intel Corporation + 48B02D + NVIDIA Corporation - E0CDFD - Beijing E3Control Technology Ltd + 588E81 + Silicon Laboratories - 000895 - DIRC Technologie GmbH & Co.KG + 902B34 + GIGA-BYTE TECHNOLOGY CO.,LTD. - 60ACC8 - KunTeng Inc. + 94DE80 + GIGA-BYTE TECHNOLOGY CO.,LTD. - CCB3AB - Shenzhen Biocare Bio-Medical Equipment Ltd + 74D435 + GIGA-BYTE TECHNOLOGY CO.,LTD. - E4B318 - Intel Corporation + 408D5C + GIGA-BYTE TECHNOLOGY CO.,LTD. - 743E2B - Ruckus Wireless + 6CC63B + Taicang T&W Electronics - E0C767 - Apple + F4FEFB + Samsung Electronics Co.,Ltd - 80ED2C - Apple + 3C410E + Cisco Systems, Inc - F03404 - TCT mobile Ltd + 207454 + vivo Mobile Communication Co., Ltd. - 80D160 - Integrated Device Technology (Malaysia) Sdn. Bhd. + B8C9B5 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 30785C - Partow Tamas Novin (Parman) + F86FDE + Shenzhen Goodix Technology Co.,Ltd. - 246968 - TP-Link Technologies Ltd + 0045E2 + CyberTAN Technology Inc. - 8CA2FD - Starry Inc. + 1C4D66 + Amazon Technologies Inc. - 84BA3B - Canon Inc. + B0F530 + Hitron Technologies. Inc - 000585 - Juniper Networks + 001FF6 + PS Audio International - 204E71 - Juniper Networks + 006967 + IEEE Registration Authority - 00194F - Nokia Danmark A/S + 001EB8 + Aloys, Inc - 00BD3A - Nokia Corporation + 0CE4A0 + Huawei Device Co., Ltd. - 80501B - Nokia Corporation + BC1AE4 + Huawei Device Co., Ltd. - A04E04 - Nokia Corporation + 740AE1 + Huawei Device Co., Ltd. - 001262 - Nokia Danmark A/S + B4A898 + Huawei Device Co., Ltd. - 0014A7 - Nokia Danmark A/S + 502CC6 + GREE ELECTRIC APPLIANCES, INC. OF ZHUHAI - 0015A0 - Nokia Danmark A/S + 0027E3 + Cisco Systems, Inc - 0016BC - Nokia Danmark A/S + 089C86 + Nokia Shanghai Bell Co., Ltd. - 00174B - Nokia Danmark A/S + F05136 + TCT mobile ltd - 002669 - Nokia Danmark A/S + 7817BE + HUAWEI TECHNOLOGIES CO.,LTD - AC61EA - Apple + 90AFD1 + netKTI Co., Ltd - 38B54D - Apple + E04007 + Huawei Device Co., Ltd. - 1C5CF2 - Apple + 90FD73 + zte corporation - A87E33 - Nokia Danmark A/S + 88ACC0 + Zyxel Communications Corporation - 002403 - Nokia Danmark A/S + 1C1E38 + PCCW Global, Inc. - 002404 - Nokia Danmark A/S + 90812A + Apple, Inc. - 0019B7 - Nokia Danmark A/S + B87BC5 + Apple, Inc. - 0017B0 - Nokia Danmark A/S + 4070F5 + Apple, Inc. - 002109 - Nokia Danmark A/S + B035B5 + Apple, Inc. - 002108 - Nokia Danmark A/S + 800C67 + Apple, Inc. - 001B33 - Nokia Danmark A/S + F072EA + Google, Inc. - 0015DE - Nokia Danmark A/S + EC9C32 + Sichuan AI-Link Technology Co., Ltd. - 0002EE - Nokia Danmark A/S + 4CADA8 + PANOPTICS CORP. - D8F710 - Libre Wireless Technologies Inc. + 981BB5 + ASSA ABLOY Korea Co., Ltd iRevo - 3C591E - TCL King Electrical Appliances (Huizhou) Ltd + B887C6 + Prudential Technology co.,LTD - C43655 - Shenzhen Fenglian Technology Ltd + FC1CA1 + Nokia - 0030DA - Comtrend Corporation + 6CD2BA + zte corporation - 64680C - Comtrend Corporation + 1C1ADF + Microsoft Corporation - 3872C0 - Comtrend Corporation + D4F547 + Google, Inc. - A80600 - Samsung Electronics Ltd + 34CB1A + Procter & Gamble Company - 002682 - Gemtek Technology Ltd + F0B107 + Ericsson AB - 0009E1 - Gemtek Technology Ltd + E8D03C + Shenzhen Jingxun Software Telecommunication Technology Co.,Ltd - 14C126 - Nokia Corporation + 70CE8C + Samsung Electronics Co.,Ltd - 600194 - Espressif Inc. + 783A6C + TECNO MOBILE LIMITED - F05A09 - Samsung Electronics Ltd + C4E0DE + Zhengzhou XindaJiean Information Technology Co.,Ltd. - 503275 - Samsung Electronics Ltd + 901A4F + EM Microelectronic - 08FC88 - Samsung Electronics Ltd + 0004C9 + Micro Electron Co., Ltd. - 0270B3 - Data Recall Ltd + C43A35 + FN-LINK TECHNOLOGY LIMITED - 000136 - CyberTAN Technology Inc. + 04D16E + IEEE Registration Authority - D04D2C - Roku Inc. + D88ADC + Huawei Device Co., Ltd. - B0A737 - Roku Inc. + CC6A10 + The Chamberlain Group, Inc - 140C76 - Freebox SAS + C84F0E + Integrated Device Technology (Malaysia) Sdn. Bhd. - 001BE9 - Broadcom + 10E953 + Huawei Device Co., Ltd. - 0019C7 - Cambridge Industries(Group) Ltd + 303ABA + Guangzhou BaoLun Electronics Co., Ltd - 70D931 - Cambridge Industries(Group) Ltd + 7C48B2 + Vida Resources Lte Ltd - 029D8E - Cardiac Recorders Inc. + 040E3C + HP Inc. - 00402A - Canoga Perkins Corporation + 6C1C71 + Zhejiang Dahua Technology Co., Ltd. - A4C7DE - Cambridge Industries(Group) Ltd + 0C2FB0 + Samsung Electronics Co.,Ltd - D8B8F6 - Nantworks + F03F95 + HUAWEI TECHNOLOGIES CO.,LTD - 008077 - Brother Industries Ltd + 185644 + HUAWEI TECHNOLOGIES CO.,LTD - 24F5AA - Samsung Electronics Ltd + 9C69D1 + HUAWEI TECHNOLOGIES CO.,LTD - 988389 - Samsung Electronics Ltd + 78C881 + Sony Interactive Entertainment Inc. - 84A466 - Samsung Electronics Ltd + 7048F7 + Nintendo Co.,Ltd - C4576E - Samsung Electronics Ltd + 18E1CA + wanze - 508569 - Samsung Electronics Ltd + CCEF03 + Hunan Keyshare Communication Technology Co., Ltd. - 0060BB - Cabletron Systems Inc. + 88571D + Seongji Industry Company - F8D0BD - Samsung Electronics Ltd + B04FC3 + Shenzhen NVC Cloud Technology Co., Ltd. - 78595E - Samsung Electronics Ltd + 309176 + Skyworth Digital Technology(Shenzhen) Co.,Ltd - 0C1420 - Samsung Electronics Ltd + B40216 + Cisco Systems, Inc - 94B10A - Samsung Electronics Ltd + 54A493 + IEEE Registration Authority - 3CBBFD - Samsung Electronics Ltd + 8CC84B + CHONGQING FUGUI ELECTRONICS CO.,LTD. - A48431 - Samsung Electronics Ltd + 749EA5 + OHSUNG - A0B4A5 - Samsung Electronics Ltd + D44F68 + Eidetic Communications Inc - E4F8EF - Samsung Electronics Ltd + 340F66 + Web Sensing LLC - DC446D - Allwinner Technology Ltd + 002272 + American Micro-Fuel Device Corp. - 745AAA - Huawei Technologies Ltd + 00D0EF + IGT - 04FE8D - Huawei Technologies Ltd + D89790 + Commonwealth Scientific and Industrial Research Organisation - 001333 - BaudTec Corporation + 405582 + Nokia - 58671A - Barnes & Noble + A4E31B + Nokia - 002675 - Aztech Electronics Pte Ltd + B8A58D + Axe Group Holdings Limited - 0024FE - AVM GmbH + 50CEE3 + Gigafirm.co.LTD - C02506 - AVM GmbH + F497C2 + Nebulon Inc - 405D82 - Netgear + 30FBB8 + HUAWEI TECHNOLOGIES CO.,LTD - DCEF09 - Netgear + F4BD9E + Cisco Systems, Inc - DC64B8 - Shenzhen JingHanDa Electronics Ltd + 5885E9 + Realme Chongqing MobileTelecommunications Corp Ltd - 000D92 - ARIMA Communications Corp. + A44519 + Xiaomi Communications Co Ltd - 002163 - Askey Computer Corp + 8446FE + HUAWEI TECHNOLOGIES CO.,LTD - A8D3F7 - Arcadyan Technology Corporation + D82918 + HUAWEI TECHNOLOGIES CO.,LTD - 4C60DE - Netgear + 4C1D96 + Intel Corporate - C43DC7 - Netgear + BC2392 + BYD Precision Manufacture Company Ltd. - 489D24 - BlackBerry RTS + 94E6F7 + Intel Corporate - 08BD43 - Netgear + 086083 + zte corporation - 44EE02 - MTI Ltd + E01954 + zte corporation - 5856E8 - ARRIS Group Inc. + 7CF31B + LG Electronics (Mobile Communications) - F80BBE - ARRIS Group Inc. + 10327E + Huawei Device Co., Ltd. - DC4517 - ARRIS Group Inc. + C419D1 + Telink Semiconductor (Shanghai) Co., Ltd. - C8AA21 - ARRIS Group Inc. + 64B21D + Chengdu Phycom Tech Co., Ltd. - 0017EE - ARRIS Group Inc. + C42996 + Signify B.V. - 00111A - ARRIS Group Inc. + B065F1 + WIO Manufacturing HK Limited - 000F9F - ARRIS Group Inc. + 901234 + Shenzhen YOUHUA Technology Co., Ltd - 0004BD - ARRIS Group Inc. + 38C4E8 + NSS Sp. z o.o. - 002642 - ARRIS Group Inc. + 34DD7E + Umeox Innovations Co.,Ltd - 0024A1 - ARRIS Group Inc. + CCCD64 + SM-Electronic GmbH - 002210 - ARRIS Group Inc. + 24DFA7 + Hangzhou BroadLink Technology Co.,Ltd - 0022B4 - ARRIS Group Inc. + 5C925E + Zioncom Electronics (Shenzhen) Ltd. - 00149A - ARRIS Group Inc. + 084FA9 + Cisco Systems, Inc - 0014E8 - ARRIS Group Inc. + 084FF9 + Cisco Systems, Inc - 0019C0 - ARRIS Group Inc. + 980637 + IEEE Registration Authority - 00E06F - ARRIS Group Inc. + 8CB84A + SAMSUNG ELECTRO-MECHANICS(THAILAND) - 8096B1 - ARRIS Group Inc. + 98E8FA + Nintendo Co.,Ltd - 707E43 - ARRIS Group Inc. + 1802AE + vivo Mobile Communication Co., Ltd. - 00152F - ARRIS Group Inc. + 0C20D3 + vivo Mobile Communication Co., Ltd. - 001FC4 - ARRIS Group Inc. + 68DBF5 + Amazon Technologies Inc. - 001CFB - ARRIS Group Inc. + 2446C8 + Motorola Mobility LLC, a Lenovo Company - 002395 - ARRIS Group Inc. + 5098B8 + New H3C Technologies Co., Ltd - 0023AF - ARRIS Group Inc. + 44D791 + HUAWEI TECHNOLOGIES CO.,LTD - F87B7A - ARRIS Group Inc. + B84DEE + Hisense broadband multimedia technology Co.,Ltd - 0000F4 - Allied Telesis Inc. + D46BA6 + HUAWEI TECHNOLOGIES CO.,LTD - 001577 - Allied Telesis Inc. + CC0577 + HUAWEI TECHNOLOGIES CO.,LTD - 001AEB - Allied Telesis R&D Center K.K. + 98BA39 + Doro AB - 703C39 - SEAWING Kft + E4CC9D + Integrated Device Technology (Malaysia) Sdn. Bhd. - 9097D5 - Espressif Inc. + A8D0E3 + Systech Electronics Ltd - ACD074 - Espressif Inc. + 308BB2 + Cisco Systems, Inc - 38E3C5 - Taicang T&W Electronics + A89352 + SHANGHAI ZHONGMI COMMUNICATION TECHNOLOGY CO.,LTD - 0015CE - ARRIS Group Inc. + E0EB62 + Shanghai Hulu Devices Co., Ltd - 0015A2 - ARRIS Group Inc. + 6CE8C6 + Earda Technologies co Ltd - 0015A3 - ARRIS Group Inc. + 48216C + China Mobile IOT Company Limited - 0015A4 - ARRIS Group Inc. + 8CBE24 + Tashang Semiconductor(Shanghai) Co., Ltd. - 0000CA - ARRIS Group Inc. + 94DC4E + AEV, spol. s r. o. - 709E29 - Sony Interactive Entertainment Inc. + 54DED0 + Sevio Srl - A4DB30 - Liteon Technology Corporation + 08B3AF + vivo Mobile Communication Co., Ltd. - 40F02F - Liteon Technology Corporation + 30862D + Arista Network, Inc. - 74C246 - Amazon Technologies Inc. + E86F38 + CHONGQING FUGUI ELECTRONICS CO.,LTD. - 000FA3 - Alpha Networks Inc. + 08688D + New H3C Technologies Co., Ltd - 001D6A - Alpha Networks Inc. + 401920 + Movon Corporation - 001A80 - Sony Corporation + 608B0E + Apple, Inc. - 8841FC - AirTies Wireless Networks + 1442FC + Texas Instruments - 0030D3 - Agilent Technologies Inc. + AC5D5C + FN-LINK TECHNOLOGY LIMITED - 00A02F - ADB Broadband Italia + A4AE11 + Hon Hai Precision Industry Co., Ltd. - 98743D - Shenzhen Jun Kai Hengye Technology Ltd + 2C1E4F + Chengdu Qianli Network Technology Co., Ltd. - A0F459 - FN-Link Technology Limited + 009052 + SELCOM ELETTRONICA S.R.L. - 586356 - FN-Link Technology Limited + 1871D5 + Hazens Automotive Electronics(SZ)Co.,Ltd. - 8CB864 - AcSiP Technology Corp. + ACB1EE + SHENZHEN FENDA TECHNOLOGY CO., LTD - 5CE2F4 - AcSiP Technology Corp. + F8ADCB + HMD Global Oy - B8616F - Accton Technology Corp + 000178 + MARGI Systems, Inc. - 0012CF - Accton Technology Corp + 001A83 + Pegasus Technologies Inc. - 0030F1 - Accton Technology Corp + 50E085 + Intel Corporate - 705A0F - Hewlett-Packard Company + 6C5E3B + Cisco Systems, Inc - 4495FA - Qingdao Santong Digital Technology Ltd + 58C876 + China Mobile (Hangzhou) Information Technology Co., Ltd. - 0025D3 - Azurewave Technologies Inc. + D462EA + HUAWEI TECHNOLOGIES CO.,LTD - 1C4BD6 - Azurewave Technologies Inc. + 54BAD6 + HUAWEI TECHNOLOGIES CO.,LTD - 08A95A - Azurewave Technologies Inc. + 24166D + HUAWEI TECHNOLOGIES CO.,LTD - 94DBC9 - Azurewave Technologies Inc. + 940B19 + HUAWEI TECHNOLOGIES CO.,LTD - 240A64 - Azurewave Technologies Inc. + 70C7F2 + HUAWEI TECHNOLOGIES CO.,LTD - 40E230 - Azurewave Technologies Inc. + DCA632 + Raspberry Pi Trading Ltd - 80D21D - Azurewave Technologies Inc. + 88F56E + HUAWEI TECHNOLOGIES CO.,LTD - D4D184 - ADB Broadband Italia + C8C2FA + HUAWEI TECHNOLOGIES CO.,LTD - A04FD4 - ADB Broadband Italia + 88B362 + Nokia Shanghai Bell Co., Ltd. - D00ED9 - Taicang T&W Electronics + 0847D0 + Nokia Shanghai Bell Co., Ltd. - 541473 - Wingtech Group (HongKong)Limited + CC9093 + Hansong Tehnologies - 8086F2 - Intel Corporation + BC97E1 + Broadcom Limited - E09467 - Intel Corporation + 28D1B7 + Shenzhen YOUHUA Technology Co., Ltd - 08D40C - Intel Corporation + 700433 + California Things Inc. - 6C8814 - Intel Corporation + CC64A6 + HUAWEI TECHNOLOGIES CO.,LTD - 303A64 - Intel Corporation + 148430 + MITAC COMPUTING TECHNOLOGY CORPORATION - ACFDCE - Intel Corporation + B8A44F + Axis Communications AB - 7CCCB8 - Intel Corporation + 0024EB + ClearPath Networks, Inc. - F40669 - Intel Corporation + D81399 + Hui Zhou Gaoshengda Technology Co.,LTD - 001DE1 - Intel Corporation + 54E019 + Ring LLC - 90E2BA - Intel Corporation + F0A968 + Antailiye Technology Co.,Ltd - 0026C7 - Intel Corporation + 50AF4D + zte corporation - 0026C6 - Intel Corporation + C8EAF8 + zte corporation - 0CCC26 - Airenetworks + 848BCD + IEEE Registration Authority - E09D31 - Intel Corporation + 08EDED + Zhejiang Dahua Technology Co., Ltd. - 88532E - Intel Corporation + 383B26 + Jiangsu Qinheng Co., Ltd. - 74C99A - Ericsson AB + 30317D + Hosiden Corporation - 5CC213 - Fr. Sauter AG + 5CFAFB + Acubit - 28101B - MagnaCom + 9C7BEF + Hewlett Packard - 001676 - Intel Corporation + 88299C + Samsung Electronics Co.,Ltd - 0016EA - Intel Corporation + 7C8956 + Samsung Electronics Co.,Ltd - 001B77 - Intel Corporation + 742EDB + Perinet GmbH - 001CC0 - Intel Corporation + 201742 + LG Electronics - 104A7D - Intel Corporation + CC8826 + LG Innotek - 001AA0 - Dell Inc. + EC5B73 + Advanced & Wise Technology Corp. - 0019B9 - Dell Inc. + D09C7A + Xiaomi Communications Co Ltd - 00B0D0 - Dell Inc. + 1C697A + EliteGroup Computer Systems Co., LTD - 00C04F - Dell Inc. + 4C1744 + Amazon Technologies Inc. - B07994 - Motorola Mobility LLC, a Lenovo Company + B03055 + China Mobile IOT Company Limited - A470D6 - Motorola Mobility LLC, a Lenovo Company + D44DA4 + Murata Manufacturing Co., Ltd. - 74867A - Dell Inc. + DC7196 + Intel Corporate - 180373 - Dell Inc. + 905C34 + Sirius Electronic Systems Srl - 14FEB5 - Dell Inc. + D46A35 + Cisco Systems, Inc - 782BCB - Dell Inc. + F8E5CF + CGI IT UK LIMITED - 001F3B - Intel Corporation + C82C2B + IEEE Registration Authority - 00215D - Intel Corporation + D420B0 + Mist Systems, Inc. - 00216A - Intel Corporation + 0022AF + Safety Vision, LLC - 001C23 - Dell Inc. + A091A2 + OnePlus Electronics (Shenzhen) Co., Ltd. - A4BADB - Dell Inc. + 0080B5 + UNITED NETWORKS INC. - 002564 - Dell Inc. + 9C497F + Integrated Device Technology (Malaysia) Sdn. Bhd. - A41F72 - Dell Inc. + C4E39F + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - C46699 - Vivo Mobile Communication Ltd + 2479F3 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - C8F230 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 80A235 + Edgecore Networks Corporation - 8C0EE3 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 402343 + CHONGQING FUGUI ELECTRONICS CO.,LTD. - C8CD72 - Sagemcom Broadband SAS + 0021B7 + LEXMARK INTERNATIONAL, INC. - F82C18 - 2Wire Inc. + C8C64A + Flextronics Tech.(Ind) Pvt Ltd - 18017D - Harbin Arteor technology Ltd + 30EA26 + Sycada BV - 001556 - Sagemcom Broadband SAS + 18F18E + ChipER Technology co. ltd - C0D044 - Sagemcom Broadband SAS + F89A78 + HUAWEI TECHNOLOGIES CO.,LTD - A01B29 - Sagemcom Broadband SAS + 88F872 + HUAWEI TECHNOLOGIES CO.,LTD - 74E14A - IEEE Registration Authority + EC5623 + HUAWEI TECHNOLOGIES CO.,LTD - 0CEFAF - IEEE Registration Authority + 5486BC + Cisco Systems, Inc - F80278 - IEEE Registration Authority + B808CF + Intel Corporate - A0BB3E - IEEE Registration Authority + 68847E + FUJITSU LIMITED - 884AEA - Texas Instruments + 003085 + Cisco Systems, Inc - 0022A4 - 2Wire Inc. + C4B36A + Cisco Systems, Inc - 982CBE - 2Wire Inc. + 70F754 + AMPAK Technology,Inc. - 640F28 - 2Wire Inc. + 6C8BD3 + Cisco Systems, Inc - 00123F - Dell Inc. + 68974B + Shenzhen Costar Electronics Co. Ltd. - 000BDB - Dell Inc. + 34E1D1 + IEEE Registration Authority - 204747 - Dell Inc. + 14B457 + Silicon Laboratories - 001495 - 2Wire Inc. + DC962C + NST Audio Ltd - 348AAE - Sagemcom Broadband SAS + 50EC50 + Beijing Xiaomi Mobile Software Co., Ltd - 7C03D8 - Sagemcom Broadband SAS + 6063F9 + Ciholas, Inc. - C0AC54 - Sagemcom Broadband SAS + AC8FF8 + Nokia - 2C3996 - Sagemcom Broadband SAS + 6003A6 + Inteno Broadband Technology AB - F08261 - Sagemcom Broadband SAS + 44B295 + Sichuan AI-Link Technology Co., Ltd. - 0030C5 - Cadence Design Systems Inc. + 9424E1 + Alcatel-Lucent Enterprise - D08CB5 - Texas Instruments + 108286 + Luxshare Precision Industry Co.,Ltd - 00182F - Texas Instruments + 6061DF + Z-meta Research LLC - 0017EA - Texas Instruments + 7057BF + New H3C Technologies Co., Ltd - 0021BA - Texas Instruments + 089798 + COMPAL INFORMATION (KUNSHAN) CO., LTD. - BC0DA5 - Texas Instruments + 18022D + HUAWEI TECHNOLOGIES CO.,LTD - CC8CE3 - Texas Instruments + D8BC59 + Shenzhen DAPU Microelectronics Co., Ltd - E0D7BA - Texas Instruments + 8C79F5 + Samsung Electronics Co.,Ltd - 1CE2CC - Texas Instruments + 00122A + VTech Telecommunications Ltd. - 985945 - Texas Instruments + 80DA13 + eero inc. - 944452 - Belkin International Inc. + 48F8DB + HUAWEI TECHNOLOGIES CO.,LTD - B0B448 - Texas Instruments + C08ACD + Guangzhou Shiyuan Electronic Technology Company Limited - D494A1 - Texas Instruments + D81EDD + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 0014BF - Cisco-Linksys LLC + B0518E + Holl technology CO.Ltd. - CCB255 - D-Link International + 681729 + Intel Corporate - 28107B - D-Link International + 2852E0 + Layon international Electronic & Telecom Co.,Ltd - FC7516 - D-Link International + 7C6166 + Amazon Technologies Inc. - 84C9B2 - D-Link International + ACF6F7 + LG Electronics (Mobile Communications) - C8D3A3 - D-Link International + 58CB52 + Google, Inc. - 3CBB73 - Shenzhen Xinguodu Technology Ltd + F8CA59 + NetComm Wireless - 0C47C9 - Amazon Technologies Inc. + 88B291 + Apple, Inc. - 0050BA - D-Link Corporation + C42AD0 + Apple, Inc. - 00179A - D-Link Corporation + CCD281 + Apple, Inc. - 001CF0 - D-Link Corporation + F84D33 + Fiberhome Telecommunication Technologies Co.,LTD - 001E58 - D-Link Corporation + 107717 + SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD - 0022B0 - D-Link Corporation + A86D5F + Raisecom Technology CO., LTD - 002401 - D-Link Corporation + 48E6C0 + SIMCom Wireless Solutions Co.,Ltd. - 1CAFF7 - D-Link International + 383C9C + Fujian Newland Payment Technology Co.,Ltd. - 14D64D - D-Link International + C02E25 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 9094E4 - D-Link International + 200DB0 + Shenzhen Four Seas Global Link Network Technology Co., Ltd. - B499BA - Hewlett-Packard Company + 58ECED + Integrated Device Technology (Malaysia) Sdn. Bhd. - 047863 - Shanghai MXCHIP Information Technology Ltd + C4F0EC + Fiberhome Telecommunication Technologies Co.,LTD - 409F87 - Jide Technology (Hong Kong) Limited + D88DC8 + Atil Technology Co., LTD - 0CF9C0 - BSkyB Ltd + E80FC8 + Universal Electronics, Inc. - 4CFF12 - Fuze Entertainment Ltd + C8AACC + Private - AC9A22 - NXP Semiconductors + 002167 + HWA JIN T&I Corp. - 287CDB - Hefei Toycloud Technology Ltd + 04EE03 + Texas Instruments - 806AB0 - Shenzhen TINNO Mobile Technology Corp. + 4C2498 + Texas Instruments - 48AD08 - Huawei Technologies Ltd + 7CD95C + Google, Inc. - 4CFB45 - Huawei Technologies Ltd - - - 009ACD - Huawei Technologies Ltd + 1C2E1B + Suzhou Tremenet Communication Technology Co., Ltd. - 3C5AB4 - Google Inc. + 907A58 + Zegna-Daidong Limited - F4F5E8 - Google Inc. + E009BF + SHENZHEN TONG BO WEI TECHNOLOGY Co.,LTD - 94EB2C - Google Inc. + 001BF7 + Lund IP Products AB - 0CC731 - Currant Inc. + 846991 + Nokia - 70B3D5 - IEEE Registration Authority + 00131E + peiker acustic GmbH - 28ED6A - Apple + 783607 + Cermate Technologies Inc. - C056E3 - Hangzhou Hikvision Digital Technology Ltd + 1C24EB + Burlywood - EC3EF7 - Juniper Networks + 001013 + Kontron America, Inc. - 0CF893 - ARRIS Group Inc. + A8E2C1 + Texas Instruments - 3CDFA9 - ARRIS Group Inc. + 909A77 + Texas Instruments - 8461A0 - ARRIS Group Inc. + 00EEAB + Cisco Systems, Inc - 0015D1 - ARRIS Group Inc. + 54A703 + TP-LINK TECHNOLOGIES CO.,LTD. - 001DD0 - ARRIS Group Inc. + 58C6F0 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 001DD3 - ARRIS Group Inc. + 884A18 + Opulinks - ACB313 - ARRIS Group Inc. + A43EA0 + iComm HK LIMITED - 38F23E - Microsoft Mobile Oy + 64C2DE + LG Electronics (Mobile Communications) - E4F89C - Intel Corporation + 8C444F + HUMAX Co., Ltd. - 6CA100 - Intel Corporation + 006762 + Fiberhome Telecommunication Technologies Co.,LTD - 2C4138 - Hewlett-Packard Company + 2CC407 + machineQ - 441EA1 - Hewlett-Packard Company + 0007CB + FREEBOX SAS - 78E7D1 - Hewlett-Packard Company + 149FB6 + GUANGDONG GENIUS TECHNOLOGY CO., LTD. - 5C8FE0 - ARRIS Group Inc. + 00115A + Ivoclar Vivadent AG - 90C792 - ARRIS Group Inc. + 40DF02 + LINE BIZ Plus - BCCAB5 - ARRIS Group Inc. + DC31D1 + vivo Mobile Communication Co., Ltd. - D039B3 - ARRIS Group Inc. + D43B04 + Intel Corporate - 000FCC - ARRIS Group Inc. + B4ED19 + Pie Digital, Inc. - 0012F0 - Intel Corporation + 84139F + zte corporation - 000740 - Buffalo Inc. + 2C2BF9 + LG Innotek - 0024A5 - Buffalo Inc. + 900218 + SKY UK LIMITED - CCE1D5 - Buffalo Inc. + 144E2A + Ciena Corporation - A402B9 - Intel Corporation + 7495EC + ALPSALPINE CO,.LTD - DC5360 - Intel Corporation + F051EA + Fitbit, Inc. - 001CC4 - Hewlett-Packard Company + 5033F0 + YICHEN (SHENZHEN) TECHNOLOGY CO.LTD - 001E0B - Hewlett-Packard Company + 4CE19E + TECNO MOBILE LIMITED - 002264 - Hewlett-Packard Company + 441AFA + New H3C Technologies Co., Ltd - 0025B3 - Hewlett-Packard Company + 04072E + VTech Electronics Ltd. - 000CF1 - Intel Corporation + FC2BB2 + Actiontec Electronics, Inc - 784859 - Hewlett-Packard Company + E09F2A + Iton Technology Corp. - 58DC6D - Exceptional Innovation Inc. + 70BC10 + Microsoft Corporation - 902155 - HTC Corporation + 9C69B4 + IEEE Registration Authority - 643150 - Hewlett-Packard Company + 0006F7 + ALPSALPINE CO,.LTD - 7CB15D - Huawei Technologies Ltd + 000704 + ALPSALPINE CO,.LTD - 00265E - Hon Hai Precision Ind Ltd + 0006F5 + ALPSALPINE CO,.LTD - 00242C - Hon Hai Precision Ind Ltd + 34C731 + ALPSALPINE CO,.LTD - D8B377 - HTC Corporation + 64D4BD + ALPSALPINE CO,.LTD - B0F1A3 - Fengfan (BeiJing) Technology Ltd + 0498F3 + ALPSALPINE CO,.LTD - 3464A9 - Hewlett-Packard Company + 500084 + Siemens Canada - 3863BB - Hewlett-Packard Company + 44B433 + tide.co.,ltd - 5CB901 - Hewlett-Packard Company + 00214F + ALPSALPINE CO,.LTD - DC4A3E - Hewlett-Packard Company + 247D4D + Texas Instruments - B05ADA - Hewlett-Packard Company + DC21B9 + Sentec Co.Ltd - 001083 - Hewlett-Packard Company + 6CDFFB + IEEE Registration Authority - A0B3CC - Hewlett-Packard Company + 203233 + SHENZHEN BILIAN ELECTRONIC CO.,LTD - ECB1D7 - Hewlett-Packard Company + E498BB + Phyplus Microelectronics Limited - 9CB654 - Hewlett-Packard Company + 705E55 + Realme Chongqing MobileTelecommunications Corp Ltd - 6C3BE5 - Hewlett-Packard Company + B0D568 + Shenzhen Cultraview Digital Technology Co., Ltd - B0AA36 - Guangdong Oppo Mobile Telecommunications Corp Ltd + F00EBF + ZettaHash Inc. - 784B87 - Murata Manufacturing Ltd + 04EA56 + Intel Corporate - E4CE02 - WyreStorm Technologies Ltd + 60A11E + Wuhan Maxsine Electric Co.,Ltd. - 40F308 - Murata Manufacturing Ltd + C45BF7 + ants - 808917 - TP-Link Technologies Ltd + 8CDF9D + NEC Corporation - A09347 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 703509 + Cisco Systems, Inc - E8BBA8 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 5C415A + Amazon.com, LLC - 942CB3 - HUMAX Ltd + A8B456 + Cisco Systems, Inc - 002719 - TP-Link Technologies Ltd + A49426 + Elgama-Elektronika Ltd. - 40169F - TP-Link Technologies Ltd + 2CA9F0 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - F4EC38 - TP-Link Technologies Ltd + 549B72 + Ericsson AB - 140467 - SNK Technologies Ltd + 9454DF + YST CORP. - 8030DC - Texas Instruments + 780ED1 + TRUMPF Werkzeugmaschinen GmbH+Co.KG - A4D578 - Texas Instruments + F82F08 + Molex CMS - 14CF92 - TP-Link Technologies Ltd + A047D7 + Best IT World (India) Pvt Ltd - 20DCE6 - TP-Link Technologies Ltd + 6899CD + Cisco Systems, Inc - 14CC20 - TP-Link Technologies Ltd + 1040F3 + Apple, Inc. - 246081 - razberi technologies + 4428A3 + Jiangsu fulian Communication Technology Co., Ltd. - A4D18C - Apple + 10C595 + Lenovo - 90F652 - TP-Link Technologies Ltd + 6829DC + Ficosa Electronics S.L.U. - 241EEB - Apple + F80DF1 + Sontex SA - CC25EF - Apple + 7CBC84 + IEEE Registration Authority - 88CF98 - Huawei Technologies Ltd + 44E66E + Apple, Inc. - F80D43 - Hon Hai Precision Ind Ltd + C0E862 + Apple, Inc. - 38F889 - Huawei Technologies Ltd + F40616 + Apple, Inc. - D07AB5 - Huawei Technologies Ltd + 586B14 + Apple, Inc. - 0019C6 - ZTE Corporation + BCB863 + Apple, Inc. - 001DD9 - Hon Hai Precision Ind Ltd + 0CFE5D + IEEE Registration Authority - 00197D - Hon Hai Precision Ind Ltd + 3C8D20 + Google, Inc. - 7C4CA5 - BSkyB Ltd + 601D91 + Motorola Mobility LLC, a Lenovo Company - 0014A4 - Hon Hai Precision Ind Ltd + D4C94B + Motorola Mobility LLC, a Lenovo Company - 78DD08 - Hon Hai Precision Ind Ltd + AC1585 + silergy corp - 9CD21E - Hon Hai Precision Ind Ltd + AC5093 + Magna Electronics Europe GmbH & Co. OHG - B43052 - Huawei Technologies Ltd + 70BBE9 + Xiaomi Communications Co Ltd - 80D09B - Huawei Technologies Ltd + 00D02D + Resideo - 1C8E5C - Huawei Technologies Ltd + 2C1CF6 + Alien Green LLC - 84742A - ZTE Corporation + B07E11 + Texas Instruments - 9CD24B - ZTE Corporation + 08351B + Shenzhen Jialihua Electronic Technology Co., Ltd - C87B5B - ZTE Corporation + 806940 + LEXAR CO.,LIMITED - 0007D8 - Hitron Technologies Inc. + 64F81C + Huawei Technologies Co., Ltd. - C03E0F - BSkyB Ltd + 10C753 + Qingdao Intelligent&Precise Electronics Co.,Ltd. - 904E2B - Huawei Technologies Ltd + F4951B + Hefei Radio Communication Technology Co., Ltd - 2008ED - Huawei Technologies Ltd + 6C3845 + Fiberhome Telecommunication Technologies Co.,LTD - 0034FE - Huawei Technologies Ltd + 00B1E3 + Cisco Systems, Inc - C85195 - Huawei Technologies Ltd + A41194 + Lenovo - 40CBA8 - Huawei Technologies Ltd + 2C6104 + SHENZHEN FENGLIAN TECHNOLOGY CO., LTD. - D46E5C - Huawei Technologies Ltd + BC9325 + Ningbo Joyson Preh Car Connect Co.,Ltd. - 8853D4 - Huawei Technologies Ltd + 0C1C19 + LONGCONN ELECTRONICS(SHENZHEN) CO.,LTD - 04C06F - Huawei Technologies Ltd + E013B5 + vivo Mobile Communication Co., Ltd. - 202BC1 - Huawei Technologies Ltd + E0795E + Wuxi Xiaohu Technology Co.,Ltd. - 54A51B - Huawei Technologies Ltd + 8C85E6 + Cleondris GmbH - 002568 - Huawei Technologies Ltd + 90E710 + New H3C Technologies Co., Ltd - 781DBA - Huawei Technologies Ltd + 302952 + Hillstone Networks Inc - 00259E - Huawei Technologies Ltd + 049226 + ASUSTek COMPUTER INC. - 006B8E - Shanghai Feixun Communication Ltd + D0B60A + Xingluo Technology Company Limited - D46AA8 - Huawei Technologies Ltd + A4FC77 + Mega Well Limited - BCADAB - Avaya Inc + 50A0A4 + Nokia - FCA841 - Avaya Inc + 1098C3 + Murata Manufacturing Co., Ltd. - 3CB15B - Avaya Inc + 84326F + GUANGZHOU AVA ELECTRONICS TECHNOLOGY CO.,LTD - 3475C7 - Avaya Inc + C89C13 + Inspiremobile - B0ADAA - Avaya Inc + E4B2FB + Apple, Inc. - B4475E - Avaya Inc + 2CCA0C + WITHUS PLANET - B8BC1B - Huawei Technologies Ltd + 440049 + Amazon Technologies Inc. - 582AF7 - Huawei Technologies Ltd + 1838AE + CONSPIN SOLUTION - 24D921 - Avaya Inc + 04CF8C + XIAOMI Electronics,CO.,LTD - 848371 - Avaya Inc + 0C7512 + Shenzhen Kunlun TongTai Technology Co.,Ltd. - 001B4F - Avaya Inc + 0C4101 + Ruichi Auto Technology (Guangzhou) Co., Ltd. - 4C8BEF - Huawei Technologies Ltd + 00B771 + Cisco Systems, Inc - 5006AB - Cisco Systems Inc. + 807D14 + HUAWEI TECHNOLOGIES CO.,LTD - FC48EF - Huawei Technologies Ltd + 20283E + HUAWEI TECHNOLOGIES CO.,LTD - 707BE8 - Huawei Technologies Ltd + F83880 + Apple, Inc. - 4C1FCC - Huawei Technologies Ltd + 4C569D + Apple, Inc. - 00906D - Cisco Systems Inc. + 38539C + Apple, Inc. - 0090AB - Cisco Systems Inc. + 402619 + Apple, Inc. - 005054 - Cisco Systems Inc. + 6CE85C + Apple, Inc. - 00500B - Cisco Systems Inc. + B0AE25 + Varikorea - 0003DD - Comark Interactive Solutions + 049162 + Microchip Technology Inc. - 005053 - Cisco Systems Inc. + 983B8F + Intel Corporate - 005050 - Cisco Systems Inc. + 54278D + NXP (China) Management Ltd. - D4B110 - Huawei Technologies Ltd + B0BE76 + TP-LINK TECHNOLOGIES CO.,LTD. - E468A3 - Huawei Technologies Ltd + D003DF + Samsung Electronics Co.,Ltd - 247189 + 6CC374 Texas Instruments - 987BF3 + 684749 Texas Instruments - A0F6FD - Texas Instruments + F8D9B8 + Open Mesh, Inc. - D0B5C2 - Texas Instruments + 7C696B + Atmosic Technologies - 78A504 - Texas Instruments + 5CD20B + Yytek Co., Ltd. - 6CECEB - Texas Instruments + 00500C + e-Tek Labs, Inc. - 3400A3 - Huawei Technologies Ltd + 485F99 + Cloud Network Technology (Samoa) Limited - 00902B - Cisco Systems Inc. + 88F7BF + vivo Mobile Communication Co., Ltd. - 00E08F - Cisco Systems Inc. + ECC40D + Nintendo Co.,Ltd - 001868 - Cisco SPVTG + 50579C + Seiko Epson Corporation - 887556 - Cisco Systems Inc. + 8834FE + Bosch Automotive Products (Suzhou) Co. Ltd - FC9947 - Cisco Systems Inc. + 00B4F5 + DongGuan Siyoto Electronics Co., Ltd - 6C2056 - Cisco Systems Inc. + 4C1B86 + Arcadyan Corporation - 0015F2 - ASUSTek Computer Inc. + 58B568 + SECURITAS DIRECT ESPAÑA, SAU - 90E6BA - ASUSTek Computer Inc. + C423A2 + PT. Emsonic Indonesia - 002618 - ASUSTek Computer Inc. + B4CB57 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - F46D04 - ASUSTek Computer Inc. + FC039F + Samsung Electronics Co.,Ltd - 00E018 - ASUSTek Computer Inc. + 00073A + INVENTEL - 000C6E - ASUSTek Computer Inc. + 00266C + INVENTEC CORPORATION - 000EA6 - ASUSTek Computer Inc. + 008CFA + INVENTEC CORPORATION - 001D60 - ASUSTek Computer Inc. + 846A66 + Sumitomo Kizai Co.,Ltd. - 6C416A - Cisco Systems Inc. + 5CFB7C + Shenzhen Jingxun Software Telecommunication Technology Co.,Ltd - ECE1A9 - Cisco Systems Inc. + 10A24E + GOLD3LINK ELECTRONICS CO., LTD - C067AF - Cisco Systems Inc. + 88108F + HUAWEI TECHNOLOGIES CO.,LTD - ACF2C5 - Cisco Systems Inc. + F4631F + HUAWEI TECHNOLOGIES CO.,LTD - 2401C7 - Cisco Systems Inc. + A49B4F + HUAWEI TECHNOLOGIES CO.,LTD - 6886A7 - Cisco Systems Inc. + 00051A + 3COM EUROPE LTD - C0255C - Cisco Systems Inc. + 08004E + 3COM EUROPE LTD - 3C0E23 - Cisco Systems Inc. + 00301E + 3COM EUROPE LTD - 08CC68 - Cisco Systems Inc. + 005004 + 3COM - 0C2724 - Cisco Systems Inc. + 000103 + 3COM - 6CFA89 - Cisco Systems Inc. + 02C08C + 3COM - 00E0A3 - Cisco Systems Inc. + 18D717 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 602AD0 - Cisco SPVTG + 80B624 + IVS - 745E1C - Pioneer Corporation + DCF505 + AzureWave Technology Inc. - 046273 - Cisco Systems Inc. + CCF0FD + China Mobile (Hangzhou) Information Technology Co., Ltd. - D8B190 - Cisco Systems Inc. + 8489EC + IEEE Registration Authority - 80E86F - Cisco Systems Inc. + 1C1BB5 + Intel Corporate - AC7E8A - Cisco Systems Inc. + 0057C1 + LG Electronics (Mobile Communications) - 1CE85D - Cisco Systems Inc. + 7C240C + Telechips, Inc. - A89D21 - Cisco Systems Inc. + 00203D + Honeywell Environmental & Combustion Controls - 689CE2 - Cisco Systems Inc. + 004084 + Honeywell - 0023BE - Cisco SPVTG + D4741B + Beijing HuaDa ZhiBao Electronic System Co.,Ltd. - 185933 - Cisco SPVTG + A0950C + China Mobile IOT Company Limited - 445829 - Cisco SPVTG + 2C15E1 + Phicomm (Shanghai) Co., Ltd. - F44E05 - Cisco Systems Inc. + A4D990 + Samsung Electronics Co.,Ltd - 881DFC - Cisco Systems Inc. + DCF719 + Cisco Systems, Inc - 001011 - Cisco Systems Inc. + 30D16B + Liteon Technology Corporation - 00000C - Cisco Systems Inc. + 006087 + KANSAI ELECTRIC CO., LTD. - 28CFE9 - Apple + 98AE71 + VVDN Technologies Pvt Ltd - 00A040 - Apple + AC6E1A + SHENZHEN GONGJIN ELECTRONICS CO.,LT - A0F849 - Cisco Systems Inc. + 30D32D + devolo AG - 3CD0F8 - Apple + 0080EB + COMPCONTROL B.V. - 680927 - Apple + 0002EB + Pico Communications - 6CC26B - Apple + 342EB6 + HUAWEI TECHNOLOGIES CO.,LTD - 44D884 - Apple + AC9232 + HUAWEI TECHNOLOGIES CO.,LTD - 002608 - Apple + DC8B28 + Intel Corporate - 0026B0 - Apple + B869F4 + Routerboard.com - 0026BB - Apple + 000FB0 + Compal Electronics INC. - D49A20 - Apple + 00023F + Compal Electronics INC. - F81EDF - Apple + 001555 + DFM GmbH - C82A14 - Apple + BCF2AF + devolo AG - 3C0754 - Apple + E0AF4F + Deutsche Telekom AG - A4B197 - Apple + 68A8E1 + Wacom Co.,Ltd. - F0B479 - Apple + 283A4D + Cloud Network Technology (Samoa) Limited - 1093E9 - Apple + B87C6F + NXP (China) Management Ltd. - 442A60 - Apple + 305DA6 + ADVALY SYSTEM Inc. - A4D1D2 - Apple + BC30D9 + Arcadyan Corporation - 28CFDA - Apple + 0479B7 + Texas Instruments - 003065 - Apple + C0D0FF + China Mobile IOT Company Limited - 001451 - Apple + 88DF9E + New H3C Technologies Co., Ltd - 001E52 - Apple + 2C7CE4 + Wuhan Tianyu Information Industry Co., Ltd. - 0021E9 - Apple + 24D76B + Syntronic AB - CC08E0 - Apple + C4FEE2 + AMICCOM Electronics Corporation - 045453 - Apple + 144802 + THE YEOLRIM Co.,Ltd. - F4F951 - Apple + FC4AE9 + Castlenet Technology Inc. - C06394 - Apple + 40313C + XIAOMI Electronics,CO.,LTD - 18AF8F - Apple + FC4596 + COMPAL INFORMATION (KUNSHAN) CO., LTD. - C8B5B7 - Apple + A0E534 + Stratec Biomedical AG - 90B21F - Apple + 1C7508 + COMPAL INFORMATION (KUNSHAN) CO., LTD. - 30F7C5 - Apple + 001B38 + COMPAL INFORMATION (KUNSHAN) CO., LTD. - 40B395 - Apple + 00235A + COMPAL INFORMATION (KUNSHAN) CO., LTD. - 44FB42 - Apple + 444B5D + GE Healthcare - E88D28 - Apple + 8CA048 + Beijing NeTopChip Technology Co.,LTD - 949426 - Apple + 24D3F2 + zte corporation - 207D74 - Apple + D469A5 + Miura Systems Ltd. - F4F15A - Apple + E01283 + Shenzhen Fanzhuo Communication Technology Co., Lt - C86F1D - Apple + E8C57A + Ufispace Co., LTD. - 3090AB - Apple + A0CF5B + Cisco Systems, Inc - 8C2DAA - Apple + 002421 + MICRO-STAR INT'L CO., LTD. - 848506 - Apple + 0060D1 + CASCADE COMMUNICATIONS - 98FE94 - Apple + 0C8C24 + SHENZHEN BILIAN ELECTRONIC CO.,LTD - D8004D - Apple + 805E4F + FN-LINK TECHNOLOGY LIMITED - 64200C - Apple + 8C6D77 + HUAWEI TECHNOLOGIES CO.,LTD - C8334B - Apple + 8C8126 + ARCOM - 64E682 - Apple + D47C44 + IEEE Registration Authority - B8E856 - Apple + 302432 + Intel Corporate - D89695 - Apple + 24F57E + HWH CO., LTD. - 1499E2 - Apple + 84C9C6 + SHENZHEN GONGJIN ELECTRONICS CO.,LT - B418D1 - Apple + 780CF0 + Cisco Systems, Inc - 9C207B - Apple + 7054B4 + Vestel Elektronik San ve Tic. A.S. - B065BD - Apple + 20A60C + Xiaomi Communications Co Ltd - 542696 - Apple + 505967 + Intent Solutions Inc - 64A3CB - Apple + 000680 + Card Access, Inc. - 903C92 - Apple + 88B66B + easynetworks - D81D72 - Apple + 488AD2 + MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. - 341298 - Apple + DCE838 + CK Telecom (Shenzhen) Limited - 70E72C - Apple + A8D498 + Avira Operations GmbH & Co. KG - 70ECE4 - Apple + 60D02C + Ruckus Wireless - 68AE20 - Apple + D058FC + SKY UK LIMITED - AC87A3 - Apple + 3856B5 + Peerbridge Health Inc - D8BB2C - Apple + 14579F + HUAWEI TECHNOLOGIES CO.,LTD - D04F7E - Apple + B44326 + HUAWEI TECHNOLOGIES CO.,LTD - 2078F0 - Apple + 3C576C + Samsung Electronics Co.,Ltd - E0ACCB - Apple + 841766 + WEIFANG GOERTEK ELECTRONICS CO.,LTD - A0999B - Apple + 2C4D79 + WEIFANG GOERTEK ELECTRONICS CO.,LTD - 24240E - Apple + 04AB18 + ELECOM CO.,LTD. - F0DBF8 - Apple + D0C5D8 + LATECOERE - 48746E - Apple + 000C42 + Routerboard.com - 54AE27 - Apple + 0026BD + JTEC Card &amp; Communication Co., Ltd - FCE998 - Apple + 7C96D2 + Fihonest communication co.,Ltd - 0CBC9F - Apple + 709FA9 + TECNO MOBILE LIMITED - 34363B - Apple + 0C01DB + Infinix mobility limited - D0A637 - Apple + 08C5E1 + SAMSUNG ELECTRO-MECHANICS(THAILAND) - 789F70 - Apple + 1866C7 + Shenzhen Libre Technology Co., Ltd - 9CF387 - Apple + 5CB3F6 + Human, Incorporated - A85B78 - Apple + 2C4835 + IEEE Registration Authority - C8F650 - Apple + 482AE3 + Wistron InfoComm(Kunshan)Co.,Ltd. - A88E24 - Apple + B0EB57 + HUAWEI TECHNOLOGIES CO.,LTD - 6C4A39 - Bita + FCA6CD + Fiberhome Telecommunication Technologies Co.,LTD - 847D50 - Holley Metering Limited + 74C14F + HUAWEI TECHNOLOGIES CO.,LTD - 50D59C - Thai Habel Industrial Ltd + A85B6C + Robert Bosch Gmbh, CM-CI2 - 20896F - Fiberhome Telecommunication Technologies Ltd + C8B1EE + Qorvo - 3052CB - Liteon Technology Corporation + 00CBB4 + SHENZHEN ATEKO PHOTOELECTRICITY CO.,LTD - 049645 - Wuxi SKY Chip Interconnection Technology Ltd + 4CC00A + vivo Mobile Communication Co., Ltd. - 1CCDE5 - Shanghai Wind Technologies Ltd + 9CE82B + vivo Mobile Communication Co., Ltd. - 681401 - Hon Hai Precision Ind Ltd + 7079B3 + Cisco Systems, Inc - 50A9DE - Smartcom - Bulgaria AD + 149B2F + JiangSu ZhongXie Intelligent Technology co., LTD - AC1FD7 - Real Vision Technology Ltd + 48DD9D + ITEL MOBILE LIMITED - 88C242 - Poynt Co. + A075EA + BoxLock, Inc. - 1402EC - Hewlett Packard Enterprise + F04CD5 + Maxlinear, Inc - E034E4 - Feit Electric Company Inc. + 00FCBA + Cisco Systems, Inc - 34C9F0 - LM Technologies Ltd + F85C4D + Nokia - 68A828 - Huawei Technologies Ltd + 0001AE + Trex Enterprises - CC20E8 - Apple + 00E009 + Stratus Technologies - 48BF74 - Baicells Technologies Ltd + E4EA83 + SHENZHEN GONGJIN ELECTRONICS CO.,LT - 6C9354 - Yaojin Technology (Shenzhen) Ltd + 74EC42 + Fiberhome Telecommunication Technologies Co.,LTD - DCDC07 - TRP Systems BV + D4FC13 + Fiberhome Telecommunication Technologies Co.,LTD - 3891D5 - Hangzhou H3C Technologies Ltd + A0B045 + Halong Mining - 8CE2DA - Circle Media Inc + ECAF97 + GIT - 382187 - Midea Group Ltd + E0BAB4 + Arrcus, Inc - 78D6B2 - Toshiba + 807D3A + Espressif Inc. - E8DED6 - Intrising Networks Inc. + 9C7F57 + UNIC Memory Technology Co Ltd - DC82F6 - iPort + B4E01D + CONCEPTION ELECTRONIQUE - 70480F - Apple + 1C0042 + NARI Technology Co., Ltd. - 3CB72B - PLUMgrid Inc + 68CAE4 + Cisco Systems, Inc - 489A42 - Technomate Ltd + 781D4A + zte corporation - 20D160 - Private + 001027 + L-3 COMMUNICATIONS EAST - BC9C31 - Huawei Technologies Ltd + 589B0B + Shineway Technologies, Inc. - D88B4C - KingTing Tech. + D8160A + Nippon Electro-Sensory Devices - 384C90 - ARRIS Group Inc. + 10C07C + Blu-ray Disc Association - F0B0E7 - Apple + E4B021 + Samsung Electronics Co.,Ltd - 381C23 - Hilan Technology Ltd + F898EF + HUAWEI TECHNOLOGIES CO.,LTD - 649A12 - P2 Mobile Technologies Limited + 58F987 + HUAWEI TECHNOLOGIES CO.,LTD - AC8995 - Azurewave Technologies Inc. + A8F5AC + HUAWEI TECHNOLOGIES CO.,LTD - 0469F8 - Apple + 58BAD4 + HUAWEI TECHNOLOGIES CO.,LTD - 3029BE - Shanghai MRDcom Ltd + BC2643 + Elprotronic Inc. - 20C3A4 - RetailNext + 04E229 + Qingdao Haier Technology Co.,Ltd - E4C2D1 - Huawei Technologies Ltd + 701D08 + 99IOT Shenzhen co.,ltd - D4F4BE - Palo Alto Networks + 7412BB + Fiberhome Telecommunication Technologies Co.,LTD - 48B620 - ROLI Ltd + 00BE3B + HUAWEI TECHNOLOGIES CO.,LTD - D888CE - RF Technology Pty Ltd + 7CA177 + HUAWEI TECHNOLOGIES CO.,LTD - 307CB2 - Anov France + 242E02 + HUAWEI TECHNOLOGIES CO.,LTD - 847973 - Shanghai Baud Data Communication Ltd + 78B6EC + Scuf Gaming International LLC - E8B4C8 - Samsung Electronics Ltd + 8035C1 + Xiaomi Communications Co Ltd - D087E2 - Samsung Electronics Ltd + 9CE895 + New H3C Technologies Co., Ltd - F05B7B - Samsung Electronics Ltd + 00583F + PC Aquarius - B047BF - Samsung Electronics Ltd + 903D68 + G-Printec, Inc. - 7C0BC6 - Samsung Electronics Ltd + 1094BB + Apple, Inc. - 7CFE90 - Mellanox Technologies Inc. + 08DFCB + Systrome Networks - 845B12 - Huawei Technologies Ltd + A4933F + HUAWEI TECHNOLOGIES CO.,LTD - 205531 - Samsung Electronics Ltd + 34E894 + TP-LINK TECHNOLOGIES CO.,LTD. - 10868C - ARRIS Group Inc. + 28AC9E + Cisco Systems, Inc - 44FDA3 - Everysight Ltd + F86FC1 + Apple, Inc. - A8A795 - Hon Hai Precision Ind Ltd + 28FF3C + Apple, Inc. - 906FA9 - Nanjing Putian Telecommunications Technology Ltd + F099B6 + Apple, Inc. - 60FD56 - WOORISYSTEMS Ltd + 88E9FE + Apple, Inc. - 9870E8 - Innatech SDN BHD + 38892C + Apple, Inc. - 44656A - Mega Video Electronic(HK) Industry Ltd + 348B75 + LAVA INTERNATIONAL(H.K) LIMITED - 78EB39 - Instituto Nacional de Tecnologia Industrial + 749EAF + Apple, Inc. - 0C756C - Anaren Microwave Inc. + 94BF2D + Apple, Inc. - D47BB0 - Askey Computer Corp + 2047DA + Xiaomi Communications Co Ltd - F0224E - Esan electronic Co. + 58B3FC + SHENZHEN RF-LINK TECHNOLOGY CO.,LTD. - CC5FBF - Topwise 3G Communication Ltd + 2429FE + KYOCERA Corporation - C8F9C8 - NewSharp Technology(SuZhou) Ltd + 7C49EB + XIAOMI Electronics,CO.,LTD - 80C5E6 - Microsoft Corporation + 984562 + Shanghai Baud Data Communication Co.,Ltd. - 10DF8B - Shenzhen CareDear Communication Technology Ltd + 68D482 + SHENZHEN GONGJIN ELECTRONICS CO.,LT - C412F5 - D-Link International + 10E7C6 + Hewlett Packard - 5C4527 - Juniper Networks + 202D23 + Collinear Networks Inc. - E02CB2 - Lenovo Mobile Communication (Wuhan) Company Limited + 90834B + BEIJING YUNYI TIMES TECHNOLOGY CO,.LTD - 606DC7 - Hon Hai Precision Ind Ltd + 18502A + SOARNEX - 68EDA4 - Shenzhen Seavo Technology Ltd + A433D7 + MitraStar Technology Corp. - 2CC5D3 - Ruckus Wireless + A8367A + frogblue TECHNOLOGY GmbH - F4573E - Fiberhome Telecommunication Technologies Ltd + B0ACD2 + zte corporation - D0431E - Dell Inc. + 200F70 + FOXTECH - 54CD10 - Panasonic Mobile Communications Ltd + 007147 + Amazon Technologies Inc. - 408D5C - Giga-Byte Technology Ltd + 00BE75 + Cisco Systems, Inc - FCE1FB - Array Networks + E4C483 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - E89120 - Motorola Mobility LLC, a Lenovo Company + 001FBA + Boyoung Tech - D4F9A1 - Huawei Technologies Ltd + DCA333 + Shenzhen YOUHUA Technology Co., Ltd - 5440AD - Samsung Electronics Ltd + 1831BF + ASUSTek COMPUTER INC. - A424DD - Cambrionix Ltd + C048E6 + Samsung Electronics Co.,Ltd - 145A83 - Logi-D Inc + 882E5A + storONE - 804E81 - Samsung Electronics Ltd + 788C54 + Ping Communication - C09A71 - Xiamen Meitu Mobile Technology Ltd + F00FEC + HUAWEI TECHNOLOGIES CO.,LTD - 64167F - Polycom + AC075F + HUAWEI TECHNOLOGIES CO.,LTD - 340B40 - Mios Elettronica SRL + B8AF67 + Hewlett Packard - 48066A - Tempered Networks Inc. + C098DA + China Mobile IOT Company Limited - BCF811 - Xiamen DNAKE Technology Ltd + C8FAE1 + ARQ Digital LLC - 900A39 - Wiio Inc. + 10A4B9 + Baidu Online Network Technology (Beijing) Co., Ltd - D0C0BF - Actions Microelectronics Ltd + 80CE62 + Hewlett Packard - E861BE - Melec Inc. + 801F12 + Microchip Technology Inc. - 5870C6 - Shanghai Xiaoyi Technology Ltd + 506CBE + InnosiliconTechnology Ltd - FC8F90 - Samsung Electronics Ltd + 247E12 + Cisco Systems, Inc - 74042B - Lenovo Mobile Communication (Wuhan) Company Limited + 501CB0 + Cisco Systems, Inc - F87AEF - Rosonix Technology Inc. + 04C241 + Nokia - 2028BC - Visionscape Ltd + 78257A + LEO Innovation Lab - 241C04 - Shenzhen Jehe Technology Development Ltd + 8CF710 + AMPAK Technology, Inc. - D05C7A - Sartura d.o.o. + 307BAC + New H3C Technologies Co., Ltd - 887033 - Hangzhou Silan Microelectronic Inc + 3C479B + Theissen Training Systems, Inc. - DC56E6 - Shenzhen Bococom Technology Ltd + 606BFF + Nintendo Co.,Ltd - CC9635 - LVS Ltd + 785DC8 + LG Electronics - 4480EB - Motorola Mobility LLC, a Lenovo Company + 0C5415 + Intel Corporate - 402814 - RFI Engineering + E8C1B8 + Nanjing Bangzhong Electronic Commerce Limited - 144146 - Honeywell (China) Ltd + D8D775 + Sagemcom Broadband SAS - 94F19E - Huizhou Maorong Intelligent Technology Ltd + B4A8B9 + Cisco Systems, Inc - B856BD - ITT LLC + 50DCE7 + Amazon Technologies Inc. - 40A5EF - Shenzhen Four Seas Global Link Network Technology Ltd + 649829 + Integrated Device Technology (Malaysia) Sdn. Bhd. - C4924C - Keisokuki Center Ltd + 081DC4 + Thermo Fisher Scientific Messtechnik GmbH - 749CE3 - KodaCloud Canada Inc. + 785364 + SHIFT GmbH - D45556 - Fiber Mountain Inc. + 883D24 + Google, Inc. - 50502A - Egardia + 04AC44 + Holtek Semiconductor Inc. - 749637 - Todaair Electronic Ltd + F4DCA5 + DAWON DNS - 88E603 - Avotek Corporation + D460E3 + Sercomm Corporation. - 2CAD13 - Shenzhen Zhilu Technology Ltd + 40CBC0 + Apple, Inc. - 78ACBF - Igneous Systems + E8330D + Xaptec GmbH - C48E8F - Hon Hai Precision Ind Ltd + 38E60A + Xiaomi Communications Co Ltd - C4366C - LG Innotek + 08AED6 + Samsung Electronics Co.,Ltd - 54369B - 1Verge Internet Technology (Beijing) Ltd + CC4D38 + Carnegie Technologies - 40D28A - Nintendo Ltd + 005D73 + Cisco Systems, Inc - 4062B6 - Tele System Communication + 606D3C + Luxshare Precision Industry Company Limited - 60128B - Canon Inc. + 002790 + Cisco Systems, Inc - 84C3E8 - Vaillant GmbH + 5C5F67 + Intel Corporate - 9CD35B - Samsung Electronics Ltd + 803A59 + AT&T - A89FBA - Samsung Electronics Ltd + 588D64 + Xi'an Clevbee Technology Co.,Ltd - B88EC6 - Stateless Networks + 34BA38 + PAL MOHAN ELECTRONICS PVT LTD - BCD165 - Cisco SPVTG + 9829A6 + COMPAL INFORMATION (KUNSHAN) CO., LTD. - 28E476 - Pi-Coral + DCBFE9 + Motorola Mobility LLC, a Lenovo Company - 4CA515 - Baikal Electronics JSC + CC6EA4 + Samsung Electronics Co.,Ltd - 7C3CB6 - Shenzhen Homecare Technology Ltd + A816D0 + Samsung Electronics Co.,Ltd - 20C06D - Shenzhen Spacetek Technology Ltd + A46CF1 + Samsung Electronics Co.,Ltd - 4886E8 - Microsoft Corporation + C4618B + Apple, Inc. - 74A34A - Zimi Corporation + 08E689 + Apple, Inc. - A86405 - nimbus 9 Inc. + DC56E7 + Apple, Inc. - 30D587 - Samsung Electronics Ltd + 4064A4 + THE FURUKAWA ELECTRIC CO., LTD - 6828F6 - Vubiq Networks Inc. + D45DDF + PEGATRON CORPORATION - DC60A1 - Teledyne DALSA Professional Imaging + F065C2 + Yanfeng Visteon Electronics Technology (Shanghai) Co.,Ltd. - 10A659 - Mobile Create Ltd - - - 58856E - QSC AG + 70B7E2 + Jiangsu Miter Technology Co.,Ltd. - 8C9109 - Toyoshima Electric Technoeogy(Suzhou) Ltd + A09D86 + Alcatel-Lucent Shanghai Bell Co., Ltd - 54098D - deister electronic GmbH + 00C0FF + Seagate Cloud Systems Inc - D05BA8 - ZTE Corporation + 88D171 + BEGHELLI S.P.A - E4BAD9 - 360 Fly Inc. + A825EB + Cambridge Industries(Group) Co.,Ltd. - EC59E7 - Microsoft Corporation + 34E380 + Genexis B.V. - C035C5 - Prosoft Systems Ltd + 5C5819 + Jingsheng Technology Co., Ltd. - A0A3E2 - Actiontec Electronics Inc. + B8CA04 + Holtek Semiconductor Inc. - 74547D - Cisco SPVTG + C4C563 + TECNO MOBILE LIMITED - 00E6E8 - Netzin Technology Corporation Ltd + F8B568 + IEEE Registration Authority - 50F43C - Leeo Inc + 2C6B7D + Texas Instruments - E887A3 - Loxley Public Company Limited + 6CB2AE + Cisco Systems, Inc - 10C67E - Shenzhen Juchin Technology Ltd + 80B708 + Blue Danube Systems, Inc - 08A5C8 - Sunnovo International Limited + 34FA9F + Ruckus Wireless - F88479 - Yaojin Technology(Shenzhen) Ltd + A09DC1 + China Dragon Technology Limited - 2C2997 - Microsoft Corporation + 2C4205 + Lytx - D46132 - Pro Concept Manufacturer Ltd + 6C7660 + KYOCERA CORPORATION - 54A050 - ASUSTek Computer Inc. + 002102 + UpdateLogic Inc. - 4C2C83 - Zhejiang KaNong Network Technology Ltd + F41E5E + RtBrick Inc. - 908C09 - Total Phase + 505800 + WyTec International, Inc. - DC2F03 - Step forward Group Ltd + C8D12A + Comtrend Corporation - 380E7B - V.P.S. Thai Ltd + BCF292 + PLANTRONICS, INC. - 2C3796 - Cybo Ltd + 0450DA + Qiku Internet Network Scientific (Shenzhen) Co., Ltd - 587FB7 - Sonar Industrial Ltd + E820E2 + HUMAX Co., Ltd. - 08EB29 - Jiangsu Huitong Group Ltd + 88835D + FN-LINK TECHNOLOGY LIMITED - 409B0D - Shenzhen Yourf Kwan Industrial Ltd + F81D0F + Hitron Technologies. Inc - D8CB8A - Micro-Star INTL Ltd + 0005A7 + HYPERCHIP Inc. - 70FC8C - OneAccess SA + 0026A8 + DAEHAP HYPER-TECH - 58108C - Intelbras + 2031EB + HDSN - 4C7403 - BQ + F8C96C + Fiberhome Telecommunication Technologies Co.,LTD - 8C5D60 - UCI Corporation Ltd + 844823 + WOXTER TECHNOLOGY Co. Ltd - BC6B4D - Nokia + 08BC20 + Hangzhou Royal Cloud Technology Co., Ltd - C8D019 - Shanghai Tigercel Communication Technology Ltd + 942A3F + Diversey Inc - 902181 - Shanghai Huaqin Telecom Technology Ltd + 785C28 + Prime Motion Inc. - 849681 - Cathay Communication Ltd + EC9F0D + IEEE Registration Authority - 2CA30E - Power Dragon Development Limited + E078A3 + Shanghai Winner Information Technology Co.,Inc - 8486F3 - Greenvity Communications + 10A4BE + SHENZHEN BILIAN ELECTRONIC CO.,LTD - 1C5216 - Dongguan Hele Electronics Ltd + 947BBE + Ubicquia LLC - 6099D1 - Vuzix / Lenovo + ECC06A + PowerChord Group Limited - B04515 - mira fitness,LLC. + 944996 + WiSilica Inc - 14488B - Shenzhen Doov Technology Ltd + 68A682 + Shenzhen YOUHUA Technology Co., Ltd - 2012D5 - Scientech Materials Corporation + 0CB2B7 + Texas Instruments - 6C6EFE - Core Logic Inc. + 587A62 + Texas Instruments - 3808FD - Silca Spa + 547A52 + CTE International srl - 784561 - CyberTAN Technology Inc. + 3408BC + Apple, Inc. - 94CE31 - CTS Limited + 1C36BB + Apple, Inc. - 80F8EB - RayTight + 3C2EFF + Apple, Inc. - D437D7 - ZTE Corporation + 088466 + Novartis Pharma AG - 2C010B - NASCENT Technology LLC - RemKon + 309FFB + Ardomus Networks Corporation - 04DEDB - Rockport Networks Inc + F06E0B + Microsoft Corporation - 1C4840 - IMS Messsysteme GmbH + 346FED + Enovation Controls - 6050C1 - Kinetek Sports + 24F677 + Apple, Inc. - 2C1A31 - Electronics Company Limited + B0CA68 + Apple, Inc. - 90B686 - Murata Manufacturing Ltd + C83C85 + Apple, Inc. - ECD9D1 - Shenzhen TG-NET Botone Technology Ltd + 5433CB + Apple, Inc. - 6C0273 - Shenzhen Jin Yun Video Equipment Ltd + 00E025 + dit Co., Ltd. - 54DF00 - Ulterius Technologies LLC + 001530 + Dell EMC - 20ED74 - Ability enterprise Ltd + 78870D + Unifiedgateways India Private Limited - A056B2 - Harman/Becker Automotive Systems GmbH + A88200 + Hisense Electric Co.,Ltd - 44666E - IP-Line + 3820A8 + ColorTokens, Inc. - 244F1D - iRule LLC + 705896 + InShow Technology - 94AEE3 - Belden Hirschmann Industries (Suzhou) Ltd + 00B69F + Latch - 5CB6CC - NovaComm Technologies Inc. + 9CE063 + Samsung Electronics Co.,Ltd - 705B2E - M2Communication Inc. + D03169 + Samsung Electronics Co.,Ltd - 5C1515 - Advan + 842C80 + Sichuan Changhong Electric Ltd. - D059E4 - Samsung Electronics Ltd + 3CC079 + Shenzhen One-Nine Intelligent Electronic Science and Technology Co., Ltd - 14A364 - Samsung Electronics Ltd + 000589 + National Datacomputer - B40AC6 - DEXON Systems Ltd + 3CA616 + vivo Mobile Communication Co., Ltd. - D866EE - Boxin Communication Ltd + 98C5DB + Ericsson AB - 2829CC - Corsa Technology Incorporated + BC0543 + AVM GmbH - 184A6F - Alcatel-Lucent Shanghai Bell Ltd + 149F3C + Samsung Electronics Co.,Ltd - 10C37B - ASUSTek Computer Inc. + FCEEE6 + FORMIKE ELECTRONIC CO., LTD - E85D6B - Luminate Wireless + 84E327 + TAILYN TECHNOLOGIES INC - B40B44 - Smartisan Technology Ltd + 0021B8 + Inphi Corporation - 3431C4 - AVM GmbH + 0C9160 + Hui Zhou Gaoshengda Technology Co.,LTD - 50FEF2 - Sify Technologies Ltd + D8ED1C + Magna Technology SL - 34C5D0 - Hagleitner Hygiene International GmbH + A0648F + ASKEY COMPUTER CORP - A012DB - Tabuchi Electric Ltd + C850E9 + Raisecom Technology CO., LTD - 481A84 - Pointer Telocation Ltd + F46E24 + NEC Personal Computers, Ltd. - DC663A - Apacer Technology Inc. + 888279 + Shenzhen RB-LINK Intelligent Technology Co.Ltd - 08DF1F - Bose Corporation + 10F163 + TNK CO.,LTD - 581F67 - Open-m technology limited + 88DA1A + Redpine Signals, Inc. - 4826E8 - Tek-Air Systems Inc. + 98EF9B + OHSUNG - D05AF1 - Shenzhen Pulier Tech Ltd + 14CF8D + OHSUNG - FCE186 - A3M Ltd + 104400 + HUAWEI TECHNOLOGIES CO.,LTD - 54EF92 - Shenzhen Elink Technology Ltd + B0E17E + HUAWEI TECHNOLOGIES CO.,LTD - ECE512 - tado GmbH + E4A7C5 + HUAWEI TECHNOLOGIES CO.,LTD - 5CF4AB - ZyXEL Communications Corp + A0FE61 + Vivint Wireless Inc. - 08B2A3 - Cynny Italia S.r.L. + 5C2BF5 + Vivint Wireless Inc. - 70305D - Ubiquoss Inc + 2C279E + IEEE Registration Authority - 488244 - Life Fitness / Div. Of Brunswick + B430C0 + York Instruments Ltd - C83168 - eZEX Corporation + E81DA8 + Ruckus Wireless - 40B3CD - Chiyoda Electronics Ltd + 5C8D2D + Shanghai Wellpay Information Technology Co., Ltd - 24336C - Private + 408BF6 + Shenzhen TCL New Technology Co., Ltd - 202564 - Pegatron Corporation + 00006B + Silicon Graphics - C8D590 - Flight Data Systems + 74373B + UNINET Co.,Ltd. - 7CFF62 - Huizhou Super Electron Technology Ltd + 7C6456 + Samsung Electronics Co.,Ltd - 84B59C - Juniper Networks + 90FD9F + Silicon Laboratories - C09D26 - Topicon HK Lmd. + F03D03 + TECNO MOBILE LIMITED - 442938 - NietZsche enterprise Ltd + DCF090 + Nubia Technology Co.,Ltd. - A0DA92 - Nanjing Glarun Atten Technology Ltd + CC5A53 + Cisco Systems, Inc - ECF72B - HD Digital Tech Ltd + 00C0EE + KYOCERA Display Corporation - 4CF45B - Blue Clover Devices + 245FDF + KYOCERA CORPORATION - B06971 - DEI Sales Inc. + 646E69 + Liteon Technology Corporation - 1889DF - CerebrEX Inc. + 706BB9 + Cisco Systems, Inc - 54C80F - TP-Link Technologies Ltd + 006088 + Analog Devices, Inc. - E4D332 - TP-Link Technologies Ltd + 084ACF + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 0C2026 - noax Technologies AG + 9C63ED + zte corporation - 283B96 - Cool Control Ltd + 74F661 + Schneider Electric Fire & Security Oy - 648D9E - IVT Electronic Ltd + 947EB9 + National Narrowband Network Communications Pty Ltd - CC95D7 - Vizio Inc. + D4389C + Sony Corporation - FC09F6 - Guangdong Tonze Electric Ltd + 001BD3 + Panasonic Corporation AVC Networks Company - BCF61C - Geomodeling Wuxi Technology Ltd + CC7EE7 + Panasonic Corporation AVC Networks Company - FC923B - Nokia Corporation + 20C6EB + Panasonic Corporation AVC Networks Company - E03F49 - ASUSTek Computer Inc. + 64B5C6 + Nintendo Co.,Ltd - 88A73C - Ragentek Technology Group + 001987 + Panasonic Mobile Communications Co.,Ltd. - 88D962 - Canopus Systems US LLC + BCC342 + Panasonic Communications Co., Ltd. - D09C30 - Foster Electric Company, Limited + 2CB21A + Phicomm (Shanghai) Co., Ltd. - 949F3F - Optek Digital Technology Company limited + 00289F + Semptian Co., Ltd. - 78FEE2 - Shanghai Diveo Technology Ltd + AC1F74 + Apple, Inc. - 086DF2 - Shenzhen MIMOWAVE Technology Ltd + A85C2C + Apple, Inc. - 48D0CF - Universal Electronics Inc. + 00DB70 + Apple, Inc. - 9C3EAA - EnvyLogic Ltd + B8634D + Apple, Inc. - 1CFCBB - Realfiction ApS + A4E975 + Apple, Inc. - F8F005 - Newport Media Inc. + 3035AD + Apple, Inc. - 28656B - Keystone Microtech Corporation + 844167 + Apple, Inc. - CC9F35 - Transbit Sp. z o.o. + 9800C6 + Apple, Inc. - DCC793 + FCE557 Nokia Corporation - 444891 - HDMI Licensing LLC + 48C58D + Lear Corporation GmbH - 5C254C - Avire Global Pte Ltd + 24C42F + Philips Lifeline - D42F23 - Akenori PTE Ltd + E470B8 + Intel Corporate - 98C0EB - Global Regency Ltd + 9C305B + Hon Hai Precision Ind. Co.,Ltd. - F03FF8 - R L Drake + D4D2E5 + BKAV Corporation - B0C554 - D-Link International + 0050B5 + FICHET SECURITE ELECTRONIQUE - 48EE86 - UTStarcom (China) Ltd + 001439 + Blonder Tongue Laboratories, Inc - 888914 - All Components Incorporated + 00869C + Palo Alto Networks - F0321A - Mita-Teknik A/S + 104E89 + Garmin International - A881F1 - Bmeye B.V. + D8C497 + Quanta Computer Inc. - C4E984 - TP-Link Technologies Ltd + C84029 + Fiberhome Telecommunication Technologies Co.,LTD - D069D0 - Verto Medical Solutions LLC + F86EEE + HUAWEI TECHNOLOGIES CO.,LTD - FC1349 - Global Apps Corp. + 84802D + Cisco Systems, Inc - 848433 - Paradox Engineering SA + 00188D + Nokia Danmark A/S - 44C306 - SIFROM Inc. + 0015AB + PRO CO SOUND INC - 602103 - I4VINE Inc. + 5876C5 + DIGI I'S LTD - FC07A0 - LRE Medical GmbH + 94D9B3 + TP-LINK TECHNOLOGIES CO.,LTD. - 1CEEE8 - Ilshin Elecom + 00A0AC + GILAT SATELLITE NETWORKS, LTD. - 9031CD - Onyx Healthcare Inc. + 741C27 + ITEL MOBILE LIMITED - E48184 - Nokia + 2830AC + Frontiir Co. Ltd. - 14C089 - Dune HD Ltd + 78D800 + IEEE Registration Authority - F4B6E5 - TerraSem Ltd + 0835B2 + CoreEdge Networks Co., Ltd - 60FFDD - C.E. Electronics Inc. + 4C49E3 + Xiaomi Communications Co Ltd - 24050F - MTN Electronic Ltd + 002609 + Phyllis Co., Ltd. - AC2DA3 - TXTR GmbH + 28F537 + IEEE Registration Authority - 889CA6 - BTB Korea Inc + 7802B1 + Cisco Systems, Inc - 90837A - General Electric Water & Process Technologies + F83441 + Intel Corporate - 80BAE6 - Neets + 44EA4B + Actlas Inc. - F8A2B4 - RHEWA-WAAGENFABRIK August Freudewald GmbH &Co. KG + C4CB6B + Airista Flow, Inc. - E056F4 - AxesNetwork Solutions Inc. + 54666C + Shenzhen YOUHUA Technology Co., Ltd - 84569C - Coho Data Inc., + A89675 + Motorola Mobility LLC, a Lenovo Company - 78AE0C - Far South Networks + B4C170 + Yi chip Microelectronics (Hangzhou) Co., Ltd - B024F3 - Progeny Systems + 28D436 + Jiangsu dewosi electric co., LTD - 0C54A5 - Pegatron Corporation + 389AF6 + Samsung Electronics Co.,Ltd - 8C4DB9 - Unmonday Ltd + E0AA96 + Samsung Electronics Co.,Ltd - 78CA5E - Elno + 507705 + Samsung Electronics Co.,Ltd - 2C5A05 - Nokia Corporation + 245880 + VIZEO - D481CA - iDevices LLC + 188090 + Cisco Systems, Inc - D858D7 - CZ.NIC, z.s.p.o. + B40F3B + Tenda Technology Co.,Ltd.Dongguan branch - B0D7C5 - Logipix Ltd + A8B2DA + FUJITSU LIMITED - A43A69 - Vers Inc + 786256 + HUAWEI TECHNOLOGIES CO.,LTD - 9C44A6 - SwiftTest Inc. + B05508 + HUAWEI TECHNOLOGIES CO.,LTD - 4CD9C4 - Magneti Marelli Automotive Electronics (Guangzhou) Ltd + 70DF2F + Cisco Systems, Inc - 50E0C7 - TurControlSystme AG + 3894E0 + Syrotech Networks. Ltd. - B4827B - AKG Acoustics GmbH + B875C0 + PayPal, Inc. - DC5E36 - Paterson Technology + 001C71 + Emergent Electronics - DCAD9E - GreenPriz + B090D4 + Shenzhen Hoin Internet Technology Co., Ltd - B8DF6B - SpotCam Ltd + 8C9F3B + Qingdao Hisense Communications Co.,Ltd. - 9C8888 - Simac Techniek NV + 001F41 + Ruckus Wireless - 10B26B - base Ltd + 842096 + SHENZHEN RF-LINK TECHNOLOGY CO.,LTD. - 4CF02E - Vifa Denmark A/S + C4108A + Ruckus Wireless - 288A1C - Juniper Networks + F0B052 + Ruckus Wireless - DCCEBC - Shenzhen JSR Technology Ltd + AC6706 + Ruckus Wireless - 18C8E7 - Shenzhen Hualistone Technology Ltd + 044FAA + Ruckus Wireless - A03B1B - Inspire Tech + 589396 + Ruckus Wireless - 7CCD3C - Guangzhou Juzing Technology Ltd + 0014B8 + Hill-Rom - 9843DA - Intertech + ACED5C + Intel Corporate - 08CA45 - Toyou Feiji Electronics Ltd + 001A93 + ERCO Leuchten GmbH - 3CCA87 - Iders Incorporated + 94F665 + Ruckus Wireless - 7C6AB3 - IBC Technologies Inc. + 10CDB6 + Essential Products, Inc. - 181BEB - Actiontec Electronics Inc. + 9061AE + Intel Corporate - 84A783 - Alcatel Lucent + 50184C + Platina Systems Inc. - 041A04 - WaveIP + 00EC0A + Xiaomi Communications Co Ltd - 34A5E1 - Sensorist ApS + C81FEA + Avaya Inc - 8079AE - ShanDong Tecsunrise Ltd + 34F64B + Intel Corporate - 7CBD06 - AE REFUsol + A4F3E7 + Integrated Device Technology (Malaysia) Sdn. Bhd. - 94BA56 - Shenzhen Coship Electronics Ltd + E43A6E + Shenzhen Zeroone Technology CO.,LTD - 38DBBB - Sunbow Telecom Ltd + 6CF9D2 + CHENGDU POVODO ELECTRONIC TECHNOLOGY CO., LTD - 448A5B - Micro-Star International + F46BEF + Sagemcom Broadband SAS - 6C4B7F - Vossloh-Schwabe Deutschland GmbH + 08306B + Palo Alto Networks - 908C44 - H.K Zongmu Technology Ltd + 60271C + VIDEOR E. Hartig GmbH - 688AB5 - EDP Servicos + 0018AE + TVT CO.,LTD - 2493CA - Voxtronic Austria + 8891DD + Racktivity - 0CCB8D - ASCO Numatics GmbH + F4B7B3 + vivo Mobile Communication Co., Ltd. - 907990 - Benchmark Electronics Romania SRL + 30B62D + Mojo Networks, Inc. - 740EDB - Optowiz Ltd + 6C60EB + ZHI YUAN ELECTRONICS CO., LIMITED - 6C8366 - Nanjing SAC Power Grid Automation Ltd + 74DADA + D-Link International - F83D4E - Softlink Automation System Ltd + D8F1F0 + Pepxim International Limited - 74D435 - Giga-Byte Technology Ltd + 9097F3 + Samsung Electronics Co.,Ltd - 78D99F - NuCom HK Ltd + 7C1C68 + Samsung Electronics Co.,Ltd - 142BD2 - Armtel Ltd + C087EB + Samsung Electronics Co.,Ltd - 9CA10A - Scle SFE + C8D7B0 + Samsung Electronics Co.,Ltd - 88789C - Game Technologies SA + FCA667 + Amazon Technologies Inc. - A4895B - ARK Infosolutions PVT Ltd + 447BBB + Shenzhen YOUHUA Technology Co., Ltd - D09D0A - Linkcom + 1C4593 + Texas Instruments - EC219F - VidaBox LLC + 90EC50 + C.O.B.O. SPA - A8CCC5 - Saab AB (Publ) + 2C41A1 + Bose Corporation - 58468F - Koncar Electronics and Informatics + 9C7BD2 + NEOLAB Convergence - 985D46 - PeopleNet Communication + D0F88C + Motorola (Wuhan) Mobility Technologies Communication Co., Ltd. - F89FB8 - YAZAKI Energy System Corporation + 2CB115 + Integrated Device Technology (Malaysia) Sdn. Bhd. - F0F5AE - Adaptrum Inc. + DCC8F5 + Shanghai UMEinfo CO.,LTD. - FC3FAB - Henan Lanxin Technology Ltd + 88D7F6 + ASUSTek COMPUTER INC. - 988E4A - Noxus(Beijing) Technology Ltd + 10D07A + AMPAK Technology, Inc. - EC2AF0 - Ypsomed AG + C4ABB2 + vivo Mobile Communication Co., Ltd. - F854AF - ECI Telecom Ltd + 44B412 + SIUS AG - 54BEF7 - Pegatron Corporation + 0CB912 + JM-DATA GmbH - 50B888 - wi2be Tecnologia S/A + 3CA308 + Texas Instruments - 7C8306 - Glen Dimplex Nordic as + 00E18C + Intel Corporate - 442AFF - E3 Technology Inc. + 881544 + Cisco Meraki - 140D4F - Flextronics International + 002449 + Shen Zhen Lite Star Electronics Technology Co., Ltd - 446755 - Orbit Irrigation + 04714B + IEEE Registration Authority - E0FAEC - Platan sp. z o.o. sp. k. + 847933 + profichip GmbH - 7CE56B - ESEN Optoelectronics Technology Ltd + 6045CB + ASUSTek COMPUTER INC. - D44C9C - Shenzhen YOOBAO Technology Ltd + F43E61 + SHENZHEN GONGJIN ELECTRONICS CO.,LT - 20CEC4 - Peraso Technologies + B4417A + SHENZHEN GONGJIN ELECTRONICS CO.,LT - CC4703 - Intercon Systems Ltd + D4503F + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - ACCA8E - ODA Technologies + 388C50 + LG Electronics - 088E4F - SF Software Solutions + DC0856 + Alcatel-Lucent Enterprise - 540536 - Vivago Oy + E442A6 + Intel Corporate - 6C90B1 - SanLogic Inc + 3C678C + HUAWEI TECHNOLOGIES CO.,LTD - CC7B35 - ZTE Corporation + 28A6DB + HUAWEI TECHNOLOGIES CO.,LTD - 04D437 - ZNV + 14A0F8 + HUAWEI TECHNOLOGIES CO.,LTD - CCF407 - Eukrea Electromatique Sarl + 98AAFC + IEEE Registration Authority - DC1792 - Captivate Network + 1CDA27 + vivo Mobile Communication Co., Ltd. - 28A241 - exlar Corp + 90F305 + HUMAX Co., Ltd. - 509871 - Inventum Technologies Private Limited + 4C8120 + Taicang T&W Electronics - 048C03 - ThinPAD Technology (Shenzhen) Ltd + 00118B + Alcatel-Lucent Enterprise - 88462A - Telechips Inc. + 00E0B1 + Alcatel-Lucent Enterprise - C80258 - ITW GSE ApS + 00E0DA + Alcatel-Lucent Enterprise - 30786B - TIANJIN Golden Pentagon Electronics Ltd + 4095BD + NTmore.Co.,Ltd - 20DF3F - Nanjing SAC Power Grid Automation Ltd + E8C1D7 + Philips - F8516D - Denwa Technology Corp. + C8F86D + Alcatel-Lucent Shanghai Bell Co., Ltd - 444A65 - Silverflare Ltd + F8BE0D + A2UICT Co.,Ltd. - 744BE9 - Explorer Hypertech Ltd + 00143F + Hotway Technology Corporation - FC6018 - Zhejiang Kangtai Electric Ltd + F8FF0B + Electronic Technology Inc. - F42012 - Cuciniale GmbH + 144FD7 + IEEE Registration Authority - 98B039 - Nokia + B85510 + Zioncom Electronics (Shenzhen) Ltd. - B830A8 - Road-Track Telematics Development + 70F087 + Apple, Inc. - 4CD637 - Qsono Electronics Ltd + 00D318 + SPG Controls - 9436E0 - Sichuan Bihong Broadcast & Television New Technologies Ltd + D055B2 + Integrated Device Technology (Malaysia) Sdn. Bhd. - 5422F8 - ZTE Corporation + 7C6BF7 + NTI co., ltd. - 486E73 - Pica8 Inc. + 245BA7 + Apple, Inc. - 6405BE - NEW Light LED + 6091F3 + vivo Mobile Communication Co., Ltd. - 646EEA - Iskratel d.o.o. + 28395E + Samsung Electronics Co.,Ltd - D0737F - Mini-Circuits + 38295A + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - E8BB3D - Sino Prime-Tech Limited + 88E628 + Shenzhen Kezhonglong Optoelectronic Technology Co.,Ltd - 28285D - ZyXEL Communications Corp + 000C46 + Allied Telesyn Inc. - 0CF019 - Malgn Technology Ltd + 001F72 + QingDao Hiphone Technology Co,.Ltd - 949FB4 - ChengDu JiaFaAnTai Technology Ltd + 002365 + Insta Elektro GmbH - 406826 - Thales UK Limited + 40FA7F + Preh Car Connect GmbH - F82BC8 - Jiangsu Switter Ltd + CC82EB + KYOCERA CORPORATION - 60C397 - 2Wire Inc. + D4CF37 + Symbolic IO - E07F88 - EVIDENCE Network SIA + 409F38 + AzureWave Technology Inc. - 1C7CC7 - Coriant GmbH + 049573 + zte corporation - 341B22 - Grandbeing Technology Ltd + F0D7AA + Motorola Mobility LLC, a Lenovo Company - 40560C - In Home Displays Ltd + 3096FB + Samsung Electronics Co.,Ltd - 58E02C - Micro Technic A/S + 4827EA + Samsung Electronics Co.,Ltd - 78B3CE - Elo touch solutions + 000631 + Calix Inc. - 88142B - Protonic Holland + BC2F3D + vivo Mobile Communication Co., Ltd. - A4FCCE - Security Expert Ltd + 7C787E + Samsung Electronics Co.,Ltd - 34A68C - Shine Profit Development Limited + D47DFC + TECNO MOBILE LIMITED - 341A4C - Shenzhen Weibu Electronics Ltd + B816DB + CHANT SINCERE CO.,LTD - 0488E2 - Beats Electronics LLC + E05163 + Arcadyan Corporation - A47ACF - Vibicom Communications Inc. + 54E3F6 + Alcatel-Lucent - BC261D - Hong Kong Tecon Technology + 40B034 + Hewlett Packard - E8CE06 - SkyHawke Technologies LLC. + 3034D2 + Availink, Inc. - C8F386 - Shenzhen Xiaoniao Technology Ltd + 504061 + Nokia - E0DCA0 - Siemens Industrial Automation Products Ltd Chengdu + 00108E + HUGH SYMONS CONCEPT Technologies Ltd. - 842F75 - Innokas Group + 641A22 + Heliospectra AB - CC3C3F - SA.S.S. Datentechnik AG + 8CF5A3 + SAMSUNG ELECTRO-MECHANICS(THAILAND) - 2C69BA - RF Controls LLC + F42B48 + Ubiqam - D4BF7F - Upvel + D47AE2 + Samsung Electronics Co.,Ltd - 2C72C3 - Soundmatters + 3CBD3E + Beijing Xiaomi Electronics Co., Ltd. - C44838 - Satcom Direct Inc. + 40B4CD + Amazon Technologies Inc. - C8DDC9 - Lenovo Mobile Communication Technology Ltd + 407D0F + HUAWEI TECHNOLOGIES CO.,LTD - 6C8686 - Technonia + 68CC6E + HUAWEI TECHNOLOGIES CO.,LTD - D4AC4E - BODi rS LLC + 50F14A + Texas Instruments - 204C6D - Hugo Brennenstuhl GmbH & Co. KG. + 04DEF2 + Shenzhen ECOM Technology Co. Ltd - 40C4D6 - ChongQing Camyu Technology Development Ltd + A084CB + SonicSensory,Inc. - A8294C - Precision Optical Transceivers Inc. + 78C1A7 + zte corporation - 70C6AC - Bosch Automotive Aftermarket + 4C7872 + Cav. Uff. Giacomo Cimberio S.p.A. - 7C0507 - Pegatron Corporation + D8E0E1 + Samsung Electronics Co.,Ltd - 880905 - MTMCommunications + 00A0C8 + Adtran Inc - 30D46A - Autosales Incorporated + D8C771 + HUAWEI TECHNOLOGIES CO.,LTD - 282CB2 - TP-Link Technologies Ltd + D4B169 + Le Shi Zhi Xin Electronic Technology (Tianjin) Limited - 64E599 - EFM Networks + E44790 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 308999 - Guangdong East Power + 8CC8F4 + IEEE Registration Authority - C89346 - MXCHIP Company Limited + F483E1 + Shanghai Clouder Semiconductor Co.,Ltd - F4B381 - WindowMaster A/S + 540384 + Hongkong Nano IC Technologies Co., Ltd - 74F102 - Beijing HCHCOM Technology Ltd + 6854FD + Amazon Technologies Inc. - A0861D - Chengdu Fuhuaxin Technology Ltd + 70918F + Weber-Stephen Products LLC - 508D6F - CHAHOO Limited + 0003BC + COT GmbH - E8DE27 - TP-Link Technologies Ltd + 7C1015 + Brilliant Home Technology, Inc. - 94ACCA - trivum technologies GmbH + CCB8A8 + AMPAK Technology, Inc. - 908260 - IEEE 1904.1 Working Group + 34049E + IEEE Registration Authority - D4EE07 - HIWIFI Ltd + 94FB29 + Zebra Technologies Inc. - FCAD0F - QTS Networks + 74614B + Chongqing Huijiatong Information Technology Co., Ltd. - 984C04 - Zhangzhou Keneng Electrical Equipment Ltd + 98D293 + Google, Inc. - A4E991 - Sistemas Audiovisuales Itelsis S.L. + 6C19C0 + Apple, Inc. - 3C86A8 - Sangshin elecom Ltd + B0F963 + Hangzhou H3C Technologies Co., Limited - 84F493 - OMS spol. s.r.o. + D825B0 + Rockeetech Systems Co.,Ltd. - BCD177 - TP-Link Technologies Ltd + F49651 + NAKAYO Inc - ACDBDA - Shenzhen Geniatech Inc Ltd + 446246 + Comat AG - D42751 - Infopia Ltd + 38454C + Light Labs, Inc. - 103DEA - HFC Technology (Beijing) Ltd + B0702D + Apple, Inc. - F05DC8 - Duracell Powermat + 00204F + DEUTSCHE AEROSPACE AG - CC5D57 - Information System Research Institute,Inc. + 8CE117 + zte corporation - 64C667 - Barnes & Noble + 688AF0 + zte corporation - F0F260 - Mobitec AB + C0210D + SHENZHEN RF-LINK TECHNOLOGY CO.,LTD. - 044CEF - Fujian Sanao Technology Ltd + 4CE2F1 + Udino srl - 4C804F - Armstrong Monitoring Corp + 00DBDF + Intel Corporate - 7CD762 - Freestyle Technology Pty Ltd + A84041 + Dragino Technology Co., Limited - 901D27 - ZTE Corporation + 1077B0 + Fiberhome Telecommunication Technologies Co.,LTD - 9C3178 - Foshan Huadian Intelligent Communications Teachnologies Ltd + 80D4A5 + HUAWEI TECHNOLOGIES CO.,LTD - B0C95B - Beijing Symtech Ltd + 04B0E7 + HUAWEI TECHNOLOGIES CO.,LTD - 4CCA53 - Skyera Inc. + 446A2E + HUAWEI TECHNOLOGIES CO.,LTD - 90FF79 - Metro Ethernet Forum + A06FAA + LG Innotek - B01408 - Lightspeed International Co. + 94A04E + Bostex Technology Co., LTD - 081DFB - Shanghai Mexon Communication Technology Ltd + FC10C6 + Taicang T&W Electronics - 983F9F - China SSJ (Suzhou) Network Technology Inc. + F01DBC + Microsoft Corporation - B838CA - Kyokko Tsushin System Ltd + AC587B + JCT Healthcare - C44EAC - Shenzhen Shiningworth Technology Ltd + B47447 + CoreOS - A80180 - IMAGO Technologies GmbH + 0026AB + Seiko Epson Corporation - 0C5521 - Axiros GmbH + 1062EB + D-Link International - 68A40E - BSH Hausgerate GmbH + 000894 + InnoVISION Multimedia Ltd. - F4C6D7 - blackned GmbH + 504B5B + CONTROLtronic GmbH - D4CA6E - u-blox AG + C8662C + Beijing Haitai Fangyuan High Technology Co,.Ltd. - 5C43D2 - Hazemeyer + 8096CA + Hon Hai Precision Ind. Co.,Ltd. - D809C3 - Cercacor Labs + 186571 + Top Victory Electronics (Taiwan) Co., Ltd. - E0C2B7 - Masimo Corporation + 2C6FC9 + Hon Hai Precision Ind. Co.,Ltd. - A01917 - Bertel S.p.a. + D058A8 + zte corporation - 68B8D9 - Act KDE Inc. + D071C4 + zte corporation - 90CC24 - Synaptics Inc. + B4B384 + ShenZhen Figigantic Electronic Co.,Ltd - 2CE871 - Alert Metalguard ApS + F83F51 + Samsung Electronics Co.,Ltd - F87B62 - FASTWEL INTERNATIONAL Ltd Taiwan Branch + 50D753 + CONELCOM GmbH - 40270B - Mobileeco Ltd + 34D270 + Amazon Technologies Inc. - 74FE48 - Advantech Ltd + 0CC47A + Super Micro Computer, Inc. - 80B95C - ELFTECH Ltd + A0CC2B + Murata Manufacturing Co., Ltd. - 38B5BD - E.G.O. Elektro-Ger + 00C003 + GLOBALNET COMMUNICATIONS - 20918A - Profalux + 00234A + Private - E4EEFD - MR&D Manufacturing + 6CA7FA + YOUNGBO ENGINEERING INC. - 105CBF - DuroByte Inc + 8C7EB3 + Lytro, Inc. - A46E79 - DFT System Ltd + E0D9E3 + Eltex Enterprise Ltd. - C88A83 - Dongguan HuaHong Electronics Ltd + 805EC0 + YEALINK(XIAMEN) NETWORK TECHNOLOGY CO.,LTD. - 8CC5E1 - Shenzhen Konka Telecommunication Technology Ltd + 0023D2 + Inhand Electronics, Inc. - 64A341 - Wonderlan (Beijing) Technology Ltd + 00271C + MERCURY CORPORATION - 7898FD - Q9 Networks Inc. + 1C40E8 + SHENZHEN PROGRESS&WIN TECHNOLOGY CO.,LTD - D063B4 - SolidRun Ltd + 2C402B + Smart iBlue Technology Limited - 9C541C - Shenzhen My-power Technology Ltd + 5C6B4F + Hello Inc. - 8C3330 - EmFirst Ltd + 404E36 + HTC Corporation - 087BAA - Svyazkomplektservice LLC + 50795B + Interexport Telecomunicaciones S.A. - 24F2DD - Radiant Zemax LLC + 0016D9 + NINGBO BIRD CO.,LTD. - 20B5C6 - Mimosa Networks + 5001D9 + HUAWEI TECHNOLOGIES CO.,LTD - E4E409 - Leifheit AG + A8E705 + Fiberhome Telecommunication Technologies Co.,LTD - B877C3 - METER Group + 60A4D0 + Samsung Electronics Co.,Ltd - 004D32 - Andon Health Ltd + 886B0F + Bluegiga Technologies OY - FCA9B0 - Miartech (Shanghai),Inc. + AC84C9 + Sagemcom Broadband SAS - 94DE80 - Giga-Byte Technology Ltd + 9C62AB + Sumavision Technologies Co.,Ltd - 2C441B - Spectrum Medical Limited + 188B15 + ShenZhen ZhongRuiJing Technology co.,LTD - EC4993 - Qihan Technology Ltd + 4CE173 + IEEE Registration Authority - B0ACFA - Fujitsu Limited + 0CD86C + SHENZHEN FAST TECHNOLOGIES CO.,LTD - 8CE081 - ZTE Corporation + DC0B34 + LG Electronics (Mobile Communications) - A44E2D - Adaptive Wireless Solutions LLC + 049790 + Lartech telecom LLC - 0CCDFB - EDIC Systems Inc. + 28EED3 + Shenzhen Super D Technology Co., Ltd - 9C8D1A - INTEG process group Inc + 24C44A + zte corporation - 480362 - Desay Electronics(Huizhou) Ltd + 98541B + Intel Corporate - 18673F - Hanover Displays Limited + 007B18 + SENTRY Co., LTD. - 7C0A50 - J-MEX Inc. + 144D67 + Zioncom Electronics (Shenzhen) Ltd. - 5011EB - SilverNet Ltd + 0060D6 + NovAtel Inc. - 54DF63 - Intrakey technologies GmbH + 008701 + Samsung Electronics Co.,Ltd - 40F2E9 - IBM + 5C9960 + Samsung Electronics Co.,Ltd - 744D79 - Arrive Systems Inc. + 245CBF + NCSE - 9C0473 - Tecmobile (International) Ltd + B0958E + TP-LINK TECHNOLOGIES CO.,LTD. - B4DFFA - Litemax Electronics Inc. + C025E9 + TP-LINK TECHNOLOGIES CO.,LTD. - 681CA2 - Rosewill Inc. + 2C3361 + Apple, Inc. - 604616 - Xiamen Vann Intelligent Ltd + C8F946 + LOCOSYS Technology Inc. - E45614 - Suttle Apparatus + 00137E + CorEdge Networks, Inc. - 3C83B5 - Advance Vision Electronics Ltd + D814D6 + SURE SYSTEM Co Ltd - 28A192 - GERP Solution + 6CEFC6 + SHENZHEN TWOWING TECHNOLOGIES CO.,LTD. - 106FEF - Ad-Sol Nissin Corp + 101DC0 + Samsung Electronics Co.,Ltd - 6C40C6 - Nimbus Data Inc. + 487B6B + HUAWEI TECHNOLOGIES CO.,LTD - 1048B1 - Beijing Duokan Technology Limited + 883FD3 + HUAWEI TECHNOLOGIES CO.,LTD - D493A0 - Fidelix Oy + 5CA933 + Luma Home - 08EBED - World Elite Technology Ltd + C8028F + Nova Electronics (Shanghai) Co., Ltd. - DC9FA4 - Nokia Corporation + 000B14 + ViewSonic Corporation - 44C39B - OOO Rubezh NPO + 240D65 + Shenzhen Vsun Communication Technology Co., Ltd. - C44567 - SAMBON PRECISON and ELECTRONICS + 78471D + Samsung Electronics Co.,Ltd - 48F8B3 - Cisco-Linksys LLC + A07591 + Samsung Electronics Co.,Ltd - D8D27C - Jema Energy, SA + 0CDFA4 + Samsung Electronics Co.,Ltd - B01203 - Dynamics Hong Kong Limited + 68EBAE + Samsung Electronics Co.,Ltd - 9886B1 - Flyaudio Corporation (China) + 444E1A + Samsung Electronics Co.,Ltd - 7093F8 - Space Monkey Inc. + 002341 + Vanderbilt International (SWE) AB - 28B3AB - Genmark Automation + 407C7D + Nokia - C4E7BE - SCSpro Ltd + 24590B + White Sky Inc. Limited - 58874C - Lite-ON Clean Energy Technology Corp. + 143365 + TEM Mobile Limited - 2891D0 - Stage Tec Entwicklungsgesellschaft fur professionelle Audiotechnik mbH + D8EC5E + Belkin International Inc. - C0BD42 - ZPA Smart Energy a.s. + E89F80 + Belkin International Inc. - FC52CE - Control iD + 0050CB + Bucher Automation AG - 5C4A26 - Enguity Technology Corp + B072BF + Murata Manufacturing Co., Ltd. - 60F2EF - VisionVera International Ltd + 701DC4 + NorthStar Battery Company, LLC - C03F2A - Biscotti Inc. + 58EF68 + Belkin International Inc. - 381C4A - SIMCom Wireless Solutions Ltd + 5C8613 + Beijing Zhoenet Technology Co., Ltd - D8C691 - Hichan Technology Corp. + CC7314 + HONG KONG WHEATEK TECHNOLOGY LIMITED - E43FA2 - Wuxi DSP Technologies Inc. + B8EE65 + Liteon Technology Corporation - F4B72A - Time Interconnect Ltd + 985BB0 + KMDATA INC. - 749975 - IBM Corporation + 0011FF + Digitro Tecnologia Ltda - 2C625A - Finest Security Systems Ltd + 001B94 + T.E.M.A. S.p.A. - 2074CF - Shenzhen Voxtech Ltd + BC8556 + Hon Hai Precision Ind. Co.,Ltd. - E0F5CA - Cheng UEI Precision Industry Ltd + 342387 + Hon Hai Precision Ind. Co.,Ltd. - A8EF26 - Tritonwave + 64DAA0 + Robert Bosch Smart Home GmbH - 20DC93 - Cheetah Hi-Tech Inc. + 14B837 + Shenzhen YOUHUA Technology Co., Ltd - 4423AA - Farmage Ltd + E47CF9 + Samsung Electronics Co.,Ltd - 7CFE28 - Salutron Inc. + 4844F7 + Samsung Electronics Co.,Ltd - E8102E - Really Simple Software Inc. + 001377 + Samsung Electronics Co.,Ltd - 0C565C - HyBroad Vision (Hong Kong) Technology Ltd + 002454 + Samsung Electronics Co.,Ltd - 8C6AE4 - Viogem Limited + E81132 + Samsung Electronics Co.,Ltd - 543968 - Edgewater Networks Inc + 50B7C3 + Samsung Electronics Co.,Ltd - 440CFD - NetMan Ltd + 1C5A3E + Samsung Electronics Co.,Ltd - 8CD3A2 - VisSim AS + A02195 + Samsung Electronics Co.,Ltd - D82DE1 - Tricascade Inc. + B07870 + Wi-NEXT, Inc. - 14358B - Mediabridge Products LLC. + 5CA39D + SAMSUNG ELECTRO MECHANICS CO., LTD. - 00F403 - Orbis Systems Oy + 90187C + SAMSUNG ELECTRO MECHANICS CO., LTD. - 547398 - Toyo Electronics Corporation + 50CCF8 + SAMSUNG ELECTRO MECHANICS CO., LTD. - E0A30F - Pevco + 002637 + SAMSUNG ELECTRO MECHANICS CO., LTD. - 20443A - Schneider Electric Asia Pacific Ltd + 002119 + SAMSUNG ELECTRO MECHANICS CO., LTD. - C4393A - SMC Networks Inc + F4D9FB + Samsung Electronics Co.,Ltd - 5C2479 - Baltech AG + 3C6200 + Samsung Electronics Co.,Ltd - EC9327 - MEMMERT GmbH + Co. KG + 9439E5 + Hon Hai Precision Ind. Co.,Ltd. - A0EF84 - Seine Image Int'l Ltd + 642737 + Hon Hai Precision Ind. Co.,Ltd. - 64517E - Long BEN (Dongguan) Electronic Technology Ltd + A41731 + Hon Hai Precision Ind. Co.,Ltd. - D43D7E - Micro-Star International + E006E6 + Hon Hai Precision Ind. Co.,Ltd. - ACD9D6 - tci GmbH + F0F002 + Hon Hai Precision Ind. Co.,Ltd. - 48282F - ZTE Corporation + C0CB38 + Hon Hai Precision Ind. Co.,Ltd. - 60CBFB - AirScape Inc. + F07BCB + Hon Hai Precision Ind. Co.,Ltd. - 7C160D - Saia-Burgess Controls AG + C417FE + Hon Hai Precision Ind. Co.,Ltd. - A497BB - Hitachi Industrial Equipment Systems Ltd + 00223B + Communication Networks, LLC - 4C5427 - Linepro Sp. z o.o. + C0F8DA + Hon Hai Precision Ind. Co.,Ltd. - 80D18B - Hangzhou I'Converge Technology Ltd + 0017D5 + Samsung Electronics Co.,Ltd - 4088E0 - Beijing Ereneben Information Technology Limited Shenzhen Branch + 001E7D + Samsung Electronics Co.,Ltd - E85484 - NEO Information Systems Ltd + 001DF6 + Samsung Electronics Co.,Ltd - 74AE76 - iNovo Broadband Inc. + 001D25 + Samsung Electronics Co.,Ltd - EC1A59 - Belkin International Inc. + E4C1F1 + SHENZHEN SPOTMAU INFORMATION TECHNOLIGY CO., Ltd - 881036 - Panodic(Shenzhen) Electronics LTD + F06BCA + Samsung Electronics Co.,Ltd - 68B6FC - Hitron Technologies Inc. + AC3613 + Samsung Electronics Co.,Ltd - ECA29B - Kemppi Oy + BC8CCD + SAMSUNG ELECTRO-MECHANICS(THAILAND) - 04CE14 - Wilocity Ltd + D022BE + SAMSUNG ELECTRO-MECHANICS(THAILAND) - C4BA99 - I+ME Actia Informatik und Mikro-Elektronik GmbH + EC9BF3 + SAMSUNG ELECTRO-MECHANICS(THAILAND) - A4934C - Cisco Systems Inc. + 343111 + Samsung Electronics Co.,Ltd - D0D212 - K2NET Ltd + 08FD0E + Samsung Electronics Co.,Ltd - B0435D - NuLEDs Inc. + 041BBA + Samsung Electronics Co.,Ltd - 0808EA - Amsc + 889B39 + Samsung Electronics Co.,Ltd - E8D483 - ULTIMATE Europe Transportation Equipment GmbH + E432CB + Samsung Electronics Co.,Ltd - 1C8464 - Formosa Wireless Communication Corp. + 10D542 + Samsung Electronics Co.,Ltd - 346E8A - Ecosense + A0821F + Samsung Electronics Co.,Ltd - 64F242 - Gerdes Aktiengesellschaft + F409D8 + SAMSUNG ELECTRO-MECHANICS(THAILAND) - 60F281 - Tranwo Technology Ltd + 18D276 + HUAWEI TECHNOLOGIES CO.,LTD - 942197 - Stalmart Technology Limited + C06599 + Samsung Electronics Co.,Ltd - A0C3DE - Triton Electronic Systems Ltd + BC79AD + Samsung Electronics Co.,Ltd - D0699E - LUMINEX Lighting Control Equipment + 4C3C16 + Samsung Electronics Co.,Ltd - 0CC0C0 - Magneti Marelli Sistemas Electronicos Mexico + 0073E0 + Samsung Electronics Co.,Ltd - 08379C - Topaz Ltd + F0E77E + Samsung Electronics Co.,Ltd - D80DE3 - FXI Technologies AS + F008F1 + Samsung Electronics Co.,Ltd - B0D2F5 - Vello Systems Inc. + 58C38B + Samsung Electronics Co.,Ltd - 709A0B - Italian Institute Of Technology + 002611 + Licera AB - F0FDA0 - Acurix Networks Pty Ltd + 005218 + Wuxi Keboda Electron Co.Ltd - B45570 - Borea + 00E3B2 + Samsung Electronics Co.,Ltd - 100D2F - Online Security Pty Ltd + 301966 + Samsung Electronics Co.,Ltd - 142DF5 - Amphitech + 94350A + Samsung Electronics Co.,Ltd - 5057A8 - Cisco Systems Inc. + F0038C + AzureWave Technology Inc. - 00DEFB - Cisco Systems Inc. + A81B6A + Texas Instruments - 3CA315 - Bless Information & Communications Ltd + 985DAD + Texas Instruments - F83094 - Alcatel-Lucent Telecom Limited + D43639 + Texas Instruments - 10A932 - Beijing Cyber Cloud Technology Co Ltd + BC282C + e-Smart Systems Pvt. Ltd - 34FC6F - Alcea + A40DBC + Xiamen Intretech Inc. - C0B357 - Yoshiki Electronics Industry Ltd + B0F893 + Shanghai MXCHIP Information Technology Co., Ltd. - 3C98BF - Quest Controls Inc. + 001E81 + CNB Technology Inc. - D0AEEC - Alpha Networks Inc. + 7CA97D + Objenious - E81324 - GuangZhou Bonsoninfo System Ltd + A8A648 + Qingdao Hisense Communications Co.,Ltd. - E477D4 - Minrray Industry Ltd + 84EF18 + Intel Corporate - 38E08E - Mitsubishi Electric Corporation + C411E0 + Bull Group Co., Ltd - E4C806 - Ceiec Electric Technology Inc. + 343DC4 + BUFFALO.INC - E0F9BE - Cloudena Corp. + 7C0623 + Ultra Electronics Sonar System Division - B88F14 - Analytica GmbH + 00126C + Visonic Technologies 1993 Ltd. - 7C94B2 - Philips Healthcare PCCI + 0080C7 + XIRCOM - 442B03 - Cisco Systems Inc. + 000138 + XAVi Technologies Corp. - F473CA - Conversion Sound Inc. + 00166D + Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd - F8F7FF - SYN-Tech Systems Inc + 3C9157 + Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd - A81758 - Elektronik System i Umea AB + 0000D8 + Novell, Inc. - 882012 - LMI Technologies + 14825B + Hefei Radio Communication Technology Co., Ltd - 60E956 - Ayla Networks Inc. + AC6175 + HUAWEI TECHNOLOGIES CO.,LTD - EC1120 - FloDesign Wind Turbine Corporation + 244427 + HUAWEI TECHNOLOGIES CO.,LTD - F897CF - Daeshin-Information Technology Ltd + 48FD8E + HUAWEI TECHNOLOGIES CO.,LTD - 08B4CF - Abicom International + 28AC67 + Mach Power, Rappresentanze Internazionali s.r.l. - C495A2 - Shenzhen Weijiu Industry AND Trade Development Ltd + 080051 + ExperData - 8C6878 - Nortek-AS + 001F46 + Nortel Networks - 202598 - Teleview + 003093 + Sonnet Technologies, Inc - 38F8B7 - V2COM Participacoes S.A. + 00034B + Nortel Networks - F8D462 - Pumatronix Equipamentos Eletronicos Ltda. + 000E40 + Nortel Networks - A0DC04 - Becker-Antriebe GmbH + 001C9C + Nortel Networks - 40605A - Hawkeye Tech Ltd + 001B25 + Nortel Networks - A04CC1 - Helixtech Corp. + 0019E1 + Nortel Networks - 34A7BA - Fischer International Systems Corporation + 28BE03 + TCT mobile ltd - 0463E0 - Nome Oy + 903AE6 + PARROT SA - B49EE6 - Shenzhen Technology Ltd + A098ED + Shandong Intelligent Optical Communication Development Co., Ltd. - BC4B79 - SensingTek + 000EF4 + Kasda Networks Inc - A49005 - China Greatwall Computer Shenzhen Ltd + 00167A + Skyworth Overseas Development Ltd. - C40ACB - Cisco Systems Inc. + 002561 + ProCurve Networking by HP - 681605 - Systems And Electronic Development FZCO + 008058 + PRINTER SYSTEMS CORP. - D4A02A - Cisco Systems Inc. + 00157D + POSDATA - 3C4E47 - Etronic A/S + 4849C7 + Samsung Electronics Co.,Ltd - F48771 - Infoblox + 10E878 + Nokia - 5453ED - Sony Corporation + FCB0C4 + Shanghai DareGlobal Technologies Co.,Ltd - 00376D - Murata Manufacturing Ltd + A89DD2 + Shanghai DareGlobal Technologies Co.,Ltd - 50008C - Hong Kong Telecommunications (HKT) Limited + 00E00F + Shanghai Baud Data Communication Co.,Ltd. - 902B34 - Giga-Byte Technology Ltd + 00140D + Nortel Networks - 88C36E - Beijing Ereneben lnformation Technology Limited + 849866 + Samsung Electronics Co.,Ltd - 4C9E80 - KYOKKO ELECTRIC Ltd + 1880F5 + Alcatel-Lucent Shanghai Bell Co., Ltd - 5CEB4E - R. STAHL HMI Systems GmbH + 001D42 + Nortel Networks - 34AA99 - Nokia + A42940 + Shenzhen YOUHUA Technology Co., Ltd - 645563 - Intelight Inc. + E4A387 + Control Solutions LLC - 943AF0 - Nokia Corporation + 10F96F + LG Electronics (Mobile Communications) - 645422 - Equinox Payments + C4438F + LG Electronics (Mobile Communications) - 080D84 - GECO Inc. + A09169 + LG Electronics (Mobile Communications) - 88E712 - Whirlpool Corporation + 286C07 + XIAOMI Electronics,CO.,LTD - D412BB - Quadrant Components Inc Ltd - + 002280 + A2B Electronics AB + - 24B88C - Crenus Ltd + 404AD4 + Widex A/S - BCFE8C - Altronic LLC + 9893CC + LG ELECTRONICS INC - 649EF3 - Cisco Systems Inc. + 3CCD93 + LG ELECTRONICS INC - 24BBC1 - Absolute Analysis + 2021A5 + LG Electronics (Mobile Communications) - 9CCAD9 - Nokia Corporation + 6CD68A + LG Electronics (Mobile Communications) - 046D42 - Bryston Ltd + 002483 + LG Electronics (Mobile Communications) - D8E743 - Wush Inc. + 001FE3 + LG Electronics (Mobile Communications) - 644D70 - dSPACE GmbH + 2C54CF + LG Electronics (Mobile Communications) - DCC101 - SOLiD Technologies Inc. + 485929 + LG Electronics (Mobile Communications) - 3CE624 - LG Display + 58A2B5 + LG Electronics (Mobile Communications) - D8F0F2 - Zeebo Inc + 000F62 + Alcatel Bell Space N.V. - 806007 - RIM + F485C6 + FDT Technologies - 38A851 - Moog, Ing + 0019AB + Raycom CO ., LTD - 94E0D0 - HealthStream Taiwan Inc. + 4C334E + HIGHTECH - D8052E - Skyviia Corporation + CC79CF + SHENZHEN RF-LINK TECHNOLOGY CO.,LTD. - 80946C - Tokyo Radar Corporation + 001925 + Intelicis Corporation - D0CF5E - Energy Micro AS + 9476B7 + Samsung Electronics Co.,Ltd - 1803FA - IBT Interfaces + B8D812 + IEEE Registration Authority - 306E5C - Validus Technologies + 1C21D1 + IEEE Registration Authority - C894D2 - Jiangsu Datang Electronic Products Ltd + 7C70BC + IEEE Registration Authority - C8A620 - Nebula Inc. + E81863 + IEEE Registration Authority - EC6264 - Global411 Internet Services LLC + 2CD141 + IEEE Registration Authority - 00F051 - KWB GmbH + 3C39E7 + IEEE Registration Authority - FC946C - Ubivelox + BC6641 + IEEE Registration Authority - 407B1B - Mettle Networks Inc. + 80E4DA + IEEE Registration Authority - 40D559 - Micro S.E.R.I. + 885D90 + IEEE Registration Authority - 306CBE - Skymotion Technology (HK) Limited + C88ED1 + IEEE Registration Authority - 183825 - Wuhan Lingjiu High-tech Ltd + B01F81 + IEEE Registration Authority - 7C4B78 - Red Sun Synthesis Pte Ltd + 88124E + Qualcomm Inc. - 64A0E7 - Cisco Systems Inc. + 001B32 + QLogic Corporation - DCF858 - Lorent Networks Inc. + 0017CA + Qisda Corporation - 940B2D - NetView Technologies(Shenzhen) Ltd + F0421C + Intel Corporate - 803F5D - Winstars Technology Ltd + 001CD8 + BlueAnt Wireless - 40BF17 - Digistar Telecom. SA + 283638 + IEEE Registration Authority - 780738 - Z.U.K. Elzab S.A. + C8755B + Quantify Technology Pty. Ltd. - 2037BC - Kuipers Electronic Engineering BV + 4C6641 + SAMSUNG ELECTRO-MECHANICS(THAILAND) - 94319B - Alphatronics BV + E09579 + ORTHOsoft inc, d/b/a Zimmer CAS - 00E175 - AK-Systems Ltd + A0ADA1 + JMR Electronics, Inc - CC501C - KVH Industries Inc. + E0ACF1 + Cisco Systems, Inc - 04D783 - Y&H E&C Ltd + 00015B + ITALTEL S.p.A/RF-UP-I - 54A9D4 - Minibar Systems + BCC00F + Fiberhome Telecommunication Technologies Co.,LTD - B0E50E - NRG Systems Inc + 9CA5C0 + vivo Mobile Communication Co., Ltd. - 64808B - VG Controls Inc. + 3044A1 + Shanghai Nanchao Information Technology - 48C1AC - Plantronics Inc. + 00A0A8 + RENEX CORPORATION - 98588A - SysGRATION Ltd + 70E284 + Wistron Infocomm (Zhongshan) Corporation - 2437EF - EMC Electronic Media Communication SA + 0015B7 + Toshiba - 28B0CC - Xenya d.o.o. + E89D87 + Toshiba - 205B5E - Shenzhen Wonhe Technology Ltd + 001428 + Vocollect Inc - C058A7 - Pico Systems Ltd + 006B9E + Vizio, Inc - EC3F05 - Institute 706, The Second Academy China Aerospace Science & Industry Corp + 5CA86A + HUAWEI TECHNOLOGIES CO.,LTD - 489BE2 - SCI Innovations Ltd + 00C0AB + Telco Systems, Inc. - 80FFA8 - Unidis + 001D7E + Cisco-Linksys, LLC - E435FB - Sabre Technology (Hull) Ltd + E4FB8F + MOBIWIRE MOBILES (NINGBO) CO.,LTD - C83B45 - JRI + 3876CA + Shenzhen Smart Intelligent Technology Co.Ltd - E878A1 - Beoview Intercom DOO + F40A4A + INDUSNET Communication Technology Co.,LTD - CCEF48 - Cisco Systems Inc. + 0023F8 + Zyxel Communications Corporation - F04B6A - Scientific Production Association Siberian Arsenal Ltd + 0019CB + Zyxel Communications Corporation - 64AE0C - Cisco Systems Inc. + 10BD55 + Q-Lab Corporation - E8DA96 - Zhuhai Tianrui Electrical Power Tech Ltd + B40418 + Smartchip Integrated Inc. - B4D8DE - iota Computing Inc. + 90CF7D + Qingdao Hisense Communications Co.,Ltd. - C8903E - Pakton Technologies + C449BB + MITSUMI ELECTRIC CO.,LTD. - 54CDA7 - Fujian Shenzhou Electronic Ltd + FC2D5E + zte corporation - 886B76 - China Hopeful Group Hopeful Electric Ltd + 2C094D + Raptor Engineering, LLC - 78F7D0 - Silverbrook Research + AC3743 + HTC Corporation - 207600 - Actiontec Electronics Inc. + F85A00 + Sanford LP - F013C3 - Shenzhen Fenda Technology Ltd + B8BBAF + Samsung Electronics Co.,Ltd - 04A82A - Nokia Corporation + 60C5AD + Samsung Electronics Co.,Ltd - E44E18 - Gardasoft VisionLimited + 442C05 + AMPAK Technology, Inc. - 2046A1 - VECOW Ltd + 6038E0 + Belkin International Inc. - FC01CD - Fundacion Tekniker + 8C897A + AUGTEK - 9C8BF1 - The Warehouse Limited + 002550 + Riverbed Technology, Inc. - DC2E6A - HCT Ltd + FC55DC + Baltic Latvian Universal Electronics LLC - 148A70 - ADS GmbH + 042758 + HUAWEI TECHNOLOGIES CO.,LTD - 00B338 - Kontron Asia Pacific Design Sdn. Bhd + 9CE374 + HUAWEI TECHNOLOGIES CO.,LTD - 84248D - Zebra Technologies Inc + 8CD2E9 + YOKOTE SEIKO CO., LTD. - FCE892 - Hangzhou Lancable Technology Ltd + 50AB3E + Qibixx AG - 1071F9 - Cloud Telecomputers LLC + 24F094 + Apple, Inc. - B8621F - Cisco Systems Inc. + 086D41 + Apple, Inc. - F0022B - Chrontel + ECADB8 + Apple, Inc. - D453AF - VIGO System S.A. + 9801A7 + Apple, Inc. - 18AD4D - Polostar Technology Corporation + 002552 + VXi Corporation - 94C6EB - NOVA electronics Inc. + F4911E + ZHUHAI EWPE INFORMATION TECHNOLOGY INC - 843F4E - Tri-Tech Manufacturing Inc. + 7C738B + Cocoon Alarm Ltd - C83232 - Hunting Innova + B4D5BD + Intel Corporate - 549478 - Silvershore Technology Partners + 98AA3C + Will i-tech Co., Ltd. - A06E50 - Nanotek Elektronik Sistemler Ltd Sti. + DC3752 + GE - 4C774F - Embedded Wireless Labs + 6879ED + SHARP Corporation - D0C282 - Cisco Systems Inc. + 608D17 + Sentrus Government Systems Division, Inc - 147DB3 - JOA Telecom Ltd + 002382 + Lih Rong electronic Enterprise Co., Ltd. - ECBD09 - FUSION Electronics Ltd + F845AD + Konka Group Co., Ltd. - 944696 - BaudTec Corporation + 000FE2 + Hangzhou H3C Technologies Co., Limited - 54847B - Digital Devices GmbH + 6CE983 + Gastron Co., LTD. - 3C2763 - SLE quality engineering GmbH & Co. KG + 28E31F + Xiaomi Communications Co Ltd - B0F1BC - Dhemax Ingenieros Ltda + DCD916 + HUAWEI TECHNOLOGIES CO.,LTD - B8288B - Parker Hannifin Manufacturing (UK) Ltd + 00022E + TEAC Corp. R& D - 90D11B - Palomar Medical Technologies + 0060B0 + Hewlett Packard - 34A55D - Technosoft International SRL + F80F84 + Natural Security SAS - 802E14 - azeti Networks AG + 44A42D + TCT mobile ltd - D4C1FC - Nokia Corporation + 80F62E + Hangzhou H3C Technologies Co., Limited - 34BCA6 - Beijing Ding Qing Technology Ltd + 70F96D + Hangzhou H3C Technologies Co., Limited - 5835D9 - Cisco Systems Inc. + 083FBC + zte corporation - 64D912 - Solidica Inc. + 00C0F0 + Kingston Technology Company, Inc. - C47B2F - Beijing JoinHope Image Technology Ltd + 0018D7 + JAVAD GNSS, Inc. - 508ACB - Shenzhen Maxmade Technology Ltd + 001F09 + Jastec - 3CD16E - Telepower Communication Ltd + AC620D + Jabil Circuit(Wuxi) Co.,Ltd - FC2E2D - Lorom Industrial Ltd + 1C7370 + Neotech - 40040C - A&T + 30E37A + Intel Corporate - DC3C84 - Ticom Geomatics Inc. + BC6A44 + Commend International GmbH - D0131E - Sunrex Technology Corp + F0EE58 + PACE Telematics GmbH - 00FC70 - Intrepid Control Systems Inc. + 4CA003 + VITEC - 703AD8 - Shenzhen Afoundry Electronic Ltd + 08000D + International Computers, Ltd - 704AAE - Xstream Flow (Pty) Ltd + B8AEED + Elitegroup Computer Systems Co.,Ltd. - 40B3FC - Logital Co. Limited + 0000C9 + Emulex Corporation - A4134E - Luxul + 0040AA + Valmet Automation - B09928 - Fujitsu Limited + 7050AF + SKY UK LIMITED - 04E1C8 - IMS Solucoes em Energia Ltda. + F4EF9E + SGSG SCIENCE & TECHNOLOGY CO. LTD - 948FEE - Verizon Telematics + 1C740D + Zyxel Communications Corporation - 50D6D7 - Takahata Precision + 603ECA + Cambridge Medical Robotics Ltd - 88F077 - Cisco Systems Inc. + 9C741A + HUAWEI TECHNOLOGIES CO.,LTD - 587521 - CJSC RTSoft + E4A8B6 + HUAWEI TECHNOLOGIES CO.,LTD - C40F09 - Hermes electronic GmbH + 244C07 + HUAWEI TECHNOLOGIES CO.,LTD - 48F47D - TechVision Holding Internation Limited + 000DB0 + Olym-tech Co.,Ltd. - F081AF - IRZ Automation Technologies Ltd + 30F6B9 + Ecocentric Energy - 701404 - Limited Liability Company + D0B0CD + Moen - B435F7 - Zhejiang Pearmain Electronics Ltd + 00020E + ECI Telecom Ltd. - 9866EA - Industrial Control Communications Inc. + 200A5E + Xiangshan Giant Eagle Technology Developing Co., Ltd. - 983000 - Beijing KEMACOM Technologies Ltd + 001F1F + Edimax Technology Co. Ltd. - 90CF15 - Nokia Corporation + B0E2E5 + Fiberhome Telecommunication Technologies Co.,LTD - 948B03 - EAGET Innovation and Technology Ltd + 00C164 + Cisco Systems, Inc - 2C0033 - EControls LLC + CCB11A + Samsung Electronics Co.,Ltd - AC199F - Sungrow Power Supply Ltd + 703C03 + RadiAnt Co.,Ltd - 7C4A82 - Portsmith LLC + 40476A + Astro Gaming - 94E848 - Fylde Micro Ltd + 001FA7 + Sony Interactive Entertainment Inc. - AC5E8C - Utillink + 9046A2 + Tedipay UK Ltd - 18E288 - STT Condigi + 6479A7 + Phison Electronics Corp. - 1C35F1 - NEW Lift Neue Elektronische Wege Steuerungsbau GmbH + 1C5F2B + D-Link International - 803457 - OT Systems Limited + CCD3E2 + Jiangsu Yinhe Electronics Co.,Ltd. - 5C0CBB - CELIZION Inc. + E4FAED + Samsung Electronics Co.,Ltd - C4242E - Galvanic Applied Sciences Inc + 288335 + Samsung Electronics Co.,Ltd - 24C86E - Chaney Instrument Co. + DCCF96 + Samsung Electronics Co.,Ltd - F0AE51 - Xi3 Corp + AC44F2 + YAMAHA CORPORATION - B80B9D - ROPEX Industrie-Elektronik GmbH + 1CEA1B + Nokia - 306118 - Paradom Inc. + D4612E + HUAWEI TECHNOLOGIES CO.,LTD - 4C7367 - Genius Bytes Software Solutions GmbH + 54511B + HUAWEI TECHNOLOGIES CO.,LTD - 90EA60 - SPI Lasers Ltd + 68536C + SPnS Co.,Ltd - 5070E5 - He Shan World Fair Electronics Technology Limited + DC2DCB + Beijing Unis HengYue Technology Co., Ltd. - 802275 - Beijing Beny Wave Technology Ltd + 2C9662 + Invenit BV - CCF3A5 - Chi Mei Communication Systems Inc. + 84683E + Intel Corporate - 14A9E3 - MST Corporation + 743E2B + Ruckus Wireless - F8EA0A - Dipl.-Math. Michael Rauch + E0C767 + Apple, Inc. - 3831AC - WEG + 80ED2C + Apple, Inc. - 584C19 - Chongqing Guohong Technology Development Company Limited + CCB3AB + shenzhen Biocare Bio-Medical Equipment Co.,Ltd. - 6469BC - Hytera Communications Co Ltd + E4B318 + Intel Corporate - B4F323 - Petatel Inc. + E0CDFD + Beijing E3Control Technology Co, LTD - 285132 - Shenzhen Prayfly Technology Ltd + F03404 + TCT mobile ltd - E42FF6 - Unicore Communication Inc. + 80D160 + Integrated Device Technology (Malaysia) Sdn. Bhd. - 84D9C8 - Unipattern + 047E4A + moobox CO., Ltd. - 94AAB8 - Joview(Beijing) Technology Ltd + 0080E5 + NetApp - 28F358 - 2C - Trifonov & Co + 9C5C8E + ASUSTek COMPUTER INC. - 14C21D - Sabtech Industries + 30785C + Partow Tamas Novin (Parman) - C88439 - Sunrise Technologies + 60ACC8 + KunTeng Inc. - F0BF97 - Sony Corporation + C88722 + Lumenpulse - C44AD0 - Fireflies Systems + 70661B + Sonova AG - EC7D9D - CPI + 3C591E + TCL King Electrical Appliances (Huizhou) Co., Ltd - C81E8E - ADV Security (S) Pte Ltd + 002682 + Gemtek Technology Co., Ltd. - A88792 - Broadband Antenna Tracking Systems + 0009E1 + Gemtek Technology Co., Ltd. - 14F0C5 - Xtremio Ltd + 14C126 + Nokia Corporation - E8C229 - H-Displays (MSC) Bhd + 600194 + Espressif Inc. - 3CA72B - MRV Communications (Networks) Ltd + D8F710 + Libre Wireless Technologies Inc. - 04E662 - Acroname Inc. + 84BA3B + CANON INC. - F87B8C - Amped Wireless + A87E33 + Nokia Danmark A/S - 283410 - Enigma Diagnostics Limited + 002403 + Nokia Danmark A/S - 0CE82F - Bonfiglioli Vectron GmbH + 002404 + Nokia Danmark A/S - 40F4EC - Cisco Systems Inc. + 8CA2FD + Starry, Inc. - 14B73D - ARCHEAN Technologies + 001B33 + Nokia Danmark A/S - 948D50 - Beamex Oy Ab + 00194F + Nokia Danmark A/S - A433D1 - Fibrlink Communications Ltd + 00BD3A + Nokia Corporation - 5CBD9E - Hongkong Miracle Eagle Technology(Group) Limited + 80501B + Nokia Corporation - 08E672 - Jebsee Electronics Ltd + A04E04 + Nokia Corporation - B8E589 - Payter BV + AC61EA + Apple, Inc. - 88E0A0 - Shenzhen VisionSTOR Technologies Ltd + 38B54D + Apple, Inc. - FC10BD - Control Sistematizado S.A. + 1C5CF2 + Apple, Inc. - F0C27C - Mianyang Netop Telecom Equipment Ltd + 001262 + Nokia Danmark A/S - 241A8C - Squarehead Technology AS + 0014A7 + Nokia Danmark A/S - D44F80 - Kemper Digital GmbH + 0015A0 + Nokia Danmark A/S - A41BC0 - Fastec Imaging Corporation + 0016BC + Nokia Danmark A/S - 205B2A - Private + 00174B + Nokia Danmark A/S - F40321 - BeNeXt B.V. + 0019B7 + Nokia Danmark A/S - A071A9 - Nokia Corporation + 0017B0 + Nokia Danmark A/S - A4E32E - Silicon & Software Systems Ltd + 0015DE + Nokia Danmark A/S - C8C126 - ZPM Industria e Comercio Ltda + 0002EE + Nokia Danmark A/S - 64DE1C - Kingnetic Pte Ltd + 002669 + Nokia Danmark A/S - A862A2 - Jiwumedia Ltd + 002109 + Nokia Danmark A/S - 984E97 - Starlight Marketing (H. K.) Ltd + 002108 + Nokia Danmark A/S - 64DC01 - Static Systems Group PLC + A4C7DE + Cambridge Industries(Group) Co.,Ltd. - FC1FC0 - Eurecam + 0019C7 + Cambridge Industries(Group) Co.,Ltd. - BC6784 - Environics Oy + 70D931 + Cambridge Industries(Group) Co.,Ltd. - 68DCE8 - PacketStorm Communications + C43655 + Shenzhen Fenglian Technology Co., Ltd. - 488E42 - DIGALOG GmbH + 0270B3 + DATA RECALL LTD. - 607688 - Velodyne + 000136 + CyberTAN Technology Inc. - 78CD8E - SMC Networks Inc + 0030DA + Comtrend Corporation - 2C8065 - HARTING Inc. Of North America + 64680C + Comtrend Corporation - 3CC0C6 - d&b audiotechnik GmbH + 3872C0 + Comtrend Corporation - 4468AB - Juin Company, Limited + A80600 + Samsung Electronics Co.,Ltd - F81037 - Atopia Systems, LP + 0060BB + Cabletron Systems, Inc. - 78A683 - Precidata + D8B8F6 + Nantworks - F02572 - Cisco Systems Inc. + 008077 + Brother industries, LTD. - 04FF51 - Novamedia Innovision SP. Z O.O. + C4576E + Samsung Electronics Co.,Ltd - 4CB4EA - HRD (S) PTE Ltd + 508569 + Samsung Electronics Co.,Ltd - D44C24 - Vuppalamritha Magnetic Components Ltd + 029D8E + CARDIAC RECORDERS, INC. - F8C678 - Carefusion + 00402A + Canoga Perkins Corporation - 6CAB4D - Digital Payment Technologies + A0B4A5 + Samsung Electronics Co.,Ltd - 2CB0DF - Soliton Technologies Pvt Ltd + E4F8EF + Samsung Electronics Co.,Ltd - ECE555 - Hirschmann Automation + 24F5AA + Samsung Electronics Co.,Ltd - 58F98E - SECUDOS GmbH + 988389 + Samsung Electronics Co.,Ltd - B4C44E - VXL eTech Pvt Ltd + 84A466 + Samsung Electronics Co.,Ltd - 707EDE - Nastec Ltd + F05A09 + Samsung Electronics Co.,Ltd - C07E40 - Shenzhen XDK Communication Equipment Ltd + 503275 + Samsung Electronics Co.,Ltd - E44F29 - MA Lighting Technology GmbH + 08FC88 + Samsung Electronics Co.,Ltd - B4749F - Askey Computer Corp + F8D0BD + Samsung Electronics Co.,Ltd - 7C4AA8 - MindTree Wireless PVT Ltd + 78595E + Samsung Electronics Co.,Ltd - 8091C0 - AgileMesh Inc. + 0C1420 + Samsung Electronics Co.,Ltd - E05FB9 - Cisco Systems Inc. + 94B10A + Samsung Electronics Co.,Ltd - E0143E - Modoosis Inc. + 3CBBFD + Samsung Electronics Co.,Ltd - 90D852 - Comtec Ltd + A48431 + Samsung Electronics Co.,Ltd - 380197 - TSST Global,Inc + 140C76 + FREEBOX SAS - AC02CF - RW Tecnologia Industria e Comercio Ltda + D04D2C + Roku, Inc. - D41296 - Anobit Technologies Ltd + B0A737 + Roku, Inc. - 48174C - MicroPower technologies + 001BE9 + Broadcom - 349A0D - ZBD Displays Ltd + DC64B8 + Shenzhen JingHanDa Electronics Co.Ltd - 90507B - Advanced PANMOBIL Systems GmbH & Co. KG + 44EE02 + MTI Ltd. - 0876FF - Thomson Telecom Belgium + 001333 + BaudTec Corporation - 1C7C11 - EID + 58671A + Barnes&Noble - 20AA25 - IP-NET LLC + 002675 + Aztech Electronics Pte Ltd - C4EEF5 - II-VI Incorporated + 0024FE + AVM GmbH - E0CF2D - Gemintek Corporation + C02506 + AVM GmbH - D491AF - Electroacustica General Iberica, S.A. + 405D82 + NETGEAR - C4B512 - General Electric Digital Energy + DCEF09 + NETGEAR - 0034F1 - Radicom Research Inc. + DC446D + Allwinner Technology Co., Ltd - 9433DD - Taco Inc + 745AAA + HUAWEI TECHNOLOGIES CO.,LTD - E02538 - Titan Pet Products + 04FE8D + HUAWEI TECHNOLOGIES CO.,LTD - CC7A30 - CMAX Wireless Ltd + 000D92 + ARIMA Communications Corp. - B88E3A - Infinite Technologies JLT + 002163 + ASKEY COMPUTER CORP - 588D09 - Cisco Systems Inc. + 489D24 + BlackBerry RTS - C0C1C0 - Cisco-Linksys LLC + 001FE4 + Sony Corporation - 6015C7 - IdaTech + 002345 + Sony Corporation - DC2008 - ASD Electronics Ltd + 6C0E0D + Sony Corporation - 1C83B0 - Linked IP GmbH + 6C23B9 + Sony Corporation - A4D1D1 - ECOtality North America + 001A80 + Sony Corporation - C49313 - 100fio networks technology llc + 0012EE + Sony Corporation - 7C3920 - Ssoma Security + 001620 + Sony Corporation - 28C0DA - Juniper Networks + 001963 + Sony Corporation - 9C77AA - Nadasnv + 3017C8 + Sony Corporation - 10E8EE - PhaseSpace + 205476 + Sony Corporation - A47C1F - Cobham plc + 703C39 + SEAWING Kft - D46CDA - CSM GmbH + 9097D5 + Espressif Inc. - 5CD998 - D-Link Corporation + 38E3C5 + Taicang T&W Electronics - 68597F - Alcatel Lucent + 8841FC + AirTies Wireless Networks - F065DD - Primax Electronics Ltd + 98743D + Shenzhen Jun Kai Hengye Technology Co. Ltd - 706582 - Suzhou Hanming Technologies Ltd + A0F459 + FN-LINK TECHNOLOGY LIMITED - 34D2C4 - RENA GmbH Print Systeme + 586356 + FN-LINK TECHNOLOGY LIMITED - D4CBAF - Nokia Corporation + 0025D3 + AzureWave Technology Inc. - 045D56 - camtron Industrial Inc. + A04FD4 + ADB Broadband Italia - 68234B - Nihon Dengyo Kousaku + 8CB864 + AcSiP Technology Corp. - 1C3DE7 - Sigma Koki Ltd + 5CE2F4 + AcSiP Technology Corp. - 58BC27 - Cisco Systems Inc. + B8616F + Accton Technology Corp - 20D607 - Nokia Corporation + 0012CF + Accton Technology Corp - 6CE0B0 - SOUND4 + 0030F1 + Accton Technology Corp - 9CFFBE - OTSL Inc. + 705A0F + Hewlett Packard - 00F860 - PT. Panggung Electric Citrabuana + 4495FA + Qingdao Santong Digital Technology Co.Ltd - B8BA72 - Cynove + 74C246 + Amazon Technologies Inc. - 443D21 - Nuvolt + 000FA3 + Alpha Networks Inc. - 30493B - Nanjing Z-Com Wireless Ltd + 001D6A + Alpha Networks Inc. - A45C27 - Nintendo Ltd + 0000F4 + Allied Telesis, Inc. - 6C0460 - RBH Access Technologies Inc. + 001577 + Allied Telesis, Inc. - 706417 - Orbis Tecnologia Electrica S.A. + 1C4BD6 + AzureWave Technology Inc. - 18EF63 - Cisco Systems Inc. + 08A95A + AzureWave Technology Inc. - 206FEC - Braemac CA LLC + 94DBC9 + AzureWave Technology Inc. - 100D32 - Embedian Inc. + 240A64 + AzureWave Technology Inc. - 88ACC1 - Generiton Ltd + 40E230 + AzureWave Technology Inc. - 8818AE - Tamron Ltd + 80D21D + AzureWave Technology Inc. - 7CED8D - Microsoft Corporation + 709E29 + Sony Interactive Entertainment Inc. - A4BE61 - EutroVision System Inc. + A4DB30 + Liteon Technology Corporation - D07DE5 - Forward Pay Systems Inc. + 40F02F + Liteon Technology Corporation - 04DD4C - Velocytech + 0030D3 + Agilent Technologies, Inc. - A40CC3 - Cisco Systems Inc. + 00A02F + ADB Broadband Italia - 4CBAA3 - Bison Electronics Inc. + D4D184 + ADB Broadband Italia - A8B1D4 - Cisco Systems Inc. + D00ED9 + Taicang T&W Electronics - EC7C74 - Justone Technologies Ltd + 541473 + Wingtech Group (HongKong)Limited - CCFCB1 - Wireless Technology Inc. + 0CCC26 + Airenetworks - 3C1A79 - Huayuan Technology Ltd + 001F3B + Intel Corporate - 7CF098 - Bee Beans Technologies Inc. + 00215D + Intel Corporate - EC66D1 - B&W Group Ltd + 00216A + Intel Corporate - 385FC3 - Yu Jeong System Ltd + 001676 + Intel Corporate - 888B5D - Storage Appliance Corporation + 0016EA + Intel Corporate - 84A991 - Cyber Trans Japan Ltd + 90E2BA + Intel Corporate - 68784C - Nortel Networks + 0026C7 + Intel Corporate - F8D756 - Simm Tronic Limited + 0026C6 + Intel Corporate - 04A3F3 - Emicon + 88532E + Intel Corporate - 1C17D3 - Cisco Systems Inc. + E09467 + Intel Corporate - 7CE044 - NEON Inc + 08D40C + Intel Corporate - 284C53 - Intune Networks + 6C8814 + Intel Corporate - 90513F - Elettronica Santerno SpA + 7CCCB8 + Intel Corporate - 8841C1 - Orbisat DA Amazonia Ind E Aerol SA + F40669 + Intel Corporate - 9C7514 - Wildix srl + 001DE1 + Intel Corporate - 4CF737 - SamJi Electronics Ltd + E09D31 + Intel Corporate - F0D767 - Axema Passagekontroll AB + 8086F2 + Intel Corporate - C84C75 - Cisco Systems Inc. + 303A64 + Intel Corporate - C802A6 - Beijing Newmine Technology + ACFDCE + Intel Corporate - 4C8B55 - Grupo Digicon + 74C99A + Ericsson AB - 6C5CDE - SunReports Inc. + 5CC213 + Fr. Sauter AG - 34F39B - WizLAN Ltd + 28101B + MagnaCom - E86CDA - Supercomputers and Neurocomputers Research Center + 001495 + 2Wire Inc - 240B2A - Viettel Group + C46699 + vivo Mobile Communication Co., Ltd. - 00B5D6 - Omnibit Inc. + C8F230 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 548922 - Zelfy Inc + 8C0EE3 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 50C58D - Juniper Networks + 982CBE + 2Wire Inc - 24A42C - KOUKAAM a.s. + 640F28 + 2Wire Inc - 4C3089 - Thales Transportation Systems GmbH + 884AEA + Texas Instruments - 481249 - Luxcom Technologies Inc. + 001B77 + Intel Corporate - 24A937 - PURE Storage + 001CC0 + Intel Corporate - 348302 - iFORCOM Ltd + 104A7D + Intel Corporate - B43DB2 - Degreane Horizon + 74E14A + IEEE Registration Authority - 84F64C - Cross Point BV + 0CEFAF + IEEE Registration Authority - C08B6F - S I Sistemas Inteligentes Eletronicos Ltda + F80278 + IEEE Registration Authority - F86ECF - Arcx Inc + A0BB3E + IEEE Registration Authority - 8C8401 - Private + B07994 + Motorola Mobility LLC, a Lenovo Company - 408493 - Clavister AB + A470D6 + Motorola Mobility LLC, a Lenovo Company - 78A6BD - DAEYEON Control & Instrument Ltd + C8CD72 + Sagemcom Broadband SAS - 3C1915 - GFI Chrono Time + 0022A4 + 2Wire Inc - ECB106 - Acuro Networks Inc. + B499BA + Hewlett Packard - C835B8 - Ericsson, EAB/RWI/K + 0C47C9 + Amazon Technologies Inc. - F89D0D - Control Technology Inc. + 0050BA + D-Link Corporation - 2C3F3E - Alge-Timing GmbH + 00179A + D-Link Corporation - 089F97 - Leroy Automation + 001CF0 + D-Link Corporation - 34BA51 - Se-Kure Controls Inc. + 001E58 + D-Link Corporation - 6C7039 - Novar GmbH + 0022B0 + D-Link Corporation - 982D56 - Resolution Audio + 002401 + D-Link Corporation - 147373 - Tubitak Uekae + 1CAFF7 + D-Link International - FCCF62 - IBM Corp + 14D64D + D-Link International - 084E1C - H2A Systems LLC + 9094E4 + D-Link International - 88B627 - Gembird Europe BV + 0030C5 + CADENCE DESIGN SYSTEMS, INC. - F06853 - Integrated Corporation + F82C18 + 2Wire Inc - A4ADB8 - Vitec Group, Camera Dynamics Ltd + 18017D + Harbin Arteor technology co., LTD - A4B121 - Arantia 2010 S.L. + 944452 + Belkin International Inc. - E02636 - Nortel Networks + 0014BF + Cisco-Linksys, LLC - 5C57C8 - Nokia Corporation + BC0DA5 + Texas Instruments - D46CBF - Goodrich ISR + CC8CE3 + Texas Instruments - E02630 - Intrigue Technologies Inc. + E0D7BA + Texas Instruments - ECC882 - Cisco Systems Inc. + F08261 + Sagemcom Broadband SAS - 6CFDB9 - Proware Technologies Ltd + D08CB5 + Texas Instruments - 10189E - Elmo Motion Control + 00182F + Texas Instruments - 8C56C5 - Nintendo Ltd + 0017EA + Texas Instruments - CCB888 - AnB Securite s.a. + 0021BA + Texas Instruments - 6C5E7A - Ubiquitous Internet Telecom Ltd + 1CE2CC + Texas Instruments - B42CBE - Direct Payment Solutions Limited + 985945 + Texas Instruments - CC2218 - InnoDigital Ltd + D494A1 + Texas Instruments - C86C1E - Display Systems Ltd + B0B448 + Texas Instruments - A01859 - Shenzhen Yidashi Electronics Ltd + 287CDB + Hefei Toycloud Technology Co.,ltd - E8056D - Nortel Networks + CCB255 + D-Link International - C45976 - Fugoo Coorporation + 28107B + D-Link International - 90A7C1 - Pakedge Device and Software Inc. + FC7516 + D-Link International - 80BAAC - TeleAdapt Ltd + 84C9B2 + D-Link International - 502DF4 - Phytec Messtechnik GmbH + C8D3A3 + D-Link International - 2CCD27 - Precor Inc + 3CBB73 + Shenzhen Xinguodu Technology Co., Ltd. - 104369 - Soundmax Electronic Limited + 047863 + Shanghai MXCHIP Information Technology Co., Ltd. - C06C0F - Dobbs Stanford + 806AB0 + Shenzhen TINNO Mobile Technology Corp. - C86CB6 - Optcom Ltd + 48AD08 + HUAWEI TECHNOLOGIES CO.,LTD - 5849BA - Chitai Electronic Corp. + 3C5AB4 + Google, Inc. - 00D11C - Acetel + F4F5E8 + Google, Inc. - 601D0F - Midnite Solar + 94EB2C + Google, Inc. - A8F94B - Eltex Enterprise Ltd + 4CFB45 + HUAWEI TECHNOLOGIES CO.,LTD - 0C8230 - Shenzhen Magnus Technologies Ltd + 009ACD + HUAWEI TECHNOLOGIES CO.,LTD - 746B82 - Movek + 70B3D5 + IEEE Registration Authority - 9CC077 - PrintCounts LLC + 28ED6A + Apple, Inc. - 3CB17F - Wattwatchers Pty Ld + 409F87 + Jide Technology (Hong Kong) Limited - CC5459 - OnTime Networks AS + 0CF9C0 + SKY UK LIMITED - F8DC7A - Variscite Ltd + 4CFF12 + Fuze Entertainment Co., ltd - D4F143 - IPROAD.,Inc + 0CC731 + Currant, Inc. - B8F732 - Aryaka Networks Inc + AC9A22 + NXP Semiconductors - E8DFF2 - PRF Ltd + 38F23E + Microsoft Mobile Oy - B4ED54 - Wohler Technologies + 000740 + BUFFALO.INC - 006440 - Cisco Systems Inc. + 0024A5 + BUFFALO.INC - 94C4E9 - PowerLayer Microsystems HongKong Limited + CCE1D5 + BUFFALO.INC - 8843E1 - Cisco Systems Inc. + E4F89C + Intel Corporate - 34862A - Heinz Lackmann GmbH & Co KG + 2C4138 + Hewlett Packard - ACE348 - MadgeTech Inc. + 441EA1 + Hewlett Packard - 549A16 - Uzushio Electric Ltd + 78E7D1 + Hewlett Packard - 9018AE - Shanghai Meridian Technologies Ltd + 001CC4 + Hewlett Packard - 0494A1 - Catch THE Wind Inc + 001E0B + Hewlett Packard - 003A99 - Cisco Systems Inc. + 6CA100 + Intel Corporate - 003A9A - Cisco Systems Inc. + A402B9 + Intel Corporate - 003A98 - Cisco Systems Inc. + DC5360 + Intel Corporate - 50A6E3 - David Clark Company + 000CF1 + Intel Corporation - 50934F - Gradual Tecnologia Ltda. + 0012F0 + Intel Corporate - B8B1C7 - BT& Ltd + 5CB901 + Hewlett Packard - DC2C26 - Iton Technology Limited + DC4A3E + Hewlett Packard - D411D6 - ShotSpotter Inc. + 9CB654 + Hewlett Packard - 9CAFCA - Cisco Systems Inc. + 6C3BE5 + Hewlett Packard - 1C0FCF - Sypro Optics GmbH + A0B3CC + Hewlett Packard - 9C4E8E - ALT Systems Ltd + ECB1D7 + Hewlett Packard - 7072CF - EdgeCore Networks + 784859 + Hewlett Packard - ECD00E - MiraeRecognition Ltd + 3464A9 + Hewlett Packard - A4AD00 - Ragsdale Technology + 3863BB + Hewlett Packard - 4C9EE4 - Hanyang Navicom Ltd + 002264 + Hewlett Packard - C87248 - Aplicom Oy + 0025B3 + Hewlett Packard - C47D4F - Cisco Systems Inc. + 643150 + Hewlett Packard - 3CDF1E - Cisco Systems Inc. + 58DC6D + Exceptional Innovation, Inc. - 986DC8 - Toshiba Mitsubishi-Electric Industrial Systems Corporation + 902155 + HTC Corporation - 6CAC60 - Venetex Corp + D8B377 + HTC Corporation - F04BF2 - JTECH Communications Inc. + B0F1A3 + Fengfan (BeiJing) Technology Co., Ltd. - 042BBB - PicoCELA Inc. + 7CB15D + HUAWEI TECHNOLOGIES CO.,LTD - FC0877 - Prentke Romich Company + 88CF98 + HUAWEI TECHNOLOGIES CO.,LTD - 64F970 - Kenade Electronics Technology Ltd + 140467 + SNK Technologies Co.,Ltd. - C82E94 - Halfa Enterprise Ltd + 8030DC + Texas Instruments - 80177D - Nortel Networks + B05ADA + Hewlett Packard - 7C7BE4 - Z'Sedai Kenkyusho Corporation + 001083 + Hewlett Packard - F0DE71 - Shanghai EDO Technologies Ltd + A4D18C + Apple, Inc. - 60D30A - Quatius Limited + 241EEB + Apple, Inc. - 24CF21 - Shenzhen State Micro Technology Ltd + CC25EF + Apple, Inc. - 10BAA5 - Gana I&C Ltd + 942CB3 + HUMAX Co., Ltd. - BC9DA5 - DASCOM Europe GmbH + 002719 + TP-LINK TECHNOLOGIES CO.,LTD. - 28FBD3 - Ragentek Technology Group + 40169F + TP-LINK TECHNOLOGIES CO.,LTD. - 586ED6 - Private + F4EC38 + TP-LINK TECHNOLOGIES CO.,LTD. - EC3091 - Cisco Systems Inc. + A4D578 + Texas Instruments - 64BC11 - CombiQ AB + 246081 + razberi technologies - C8C13C - RuggedTek Hangzhou Ltd + 00265E + Hon Hai Precision Ind. Co.,Ltd. - F4ACC1 - Cisco Systems Inc. + 00242C + Hon Hai Precision Ind. Co.,Ltd. - 4097D1 - BK Electronics cc + 808917 + TP-LINK TECHNOLOGIES CO.,LTD. - 0CE936 - ELIMOS srl + A09347 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - A02EF3 - United Integrated Services Ltd + E8BBA8 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - A09805 - OpenVox Communication Ltd + B0AA36 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 60391F - ABB Ltd + 784B87 + Murata Manufacturing Co., Ltd. - E8A4C1 - Deep Sea Electronics Ltd + E4CE02 + WyreStorm Technologies Ltd - C8D2C1 - Jetlun (Shenzhen) Corporation + 9CD24B + zte corporation - E09153 - XAVi Technologies Corp. + C87B5B + zte corporation - 88A5BD - Qpcom Inc. + 0019C6 + zte corporation - D4C766 - Acentic GmbH + 001DD9 + Hon Hai Precision Ind. Co.,Ltd. - 002712 - MaxVision LLC + 00197D + Hon Hai Precision Ind. Co.,Ltd. - 00271F - MIPRO Electronics Ltd + 90F652 + TP-LINK TECHNOLOGIES CO.,LTD. - 00270C - Cisco Systems Inc. + 14CF92 + TP-LINK TECHNOLOGIES CO.,LTD. - 0026CF - Deka R&D + 20DCE6 + TP-LINK TECHNOLOGIES CO.,LTD. - 0026E7 - Shanghai ONLAN Communication Tech Ltd + 14CC20 + TP-LINK TECHNOLOGIES CO.,LTD. - 0026E0 - Asiteq + C03E0F + SKY UK LIMITED - 002703 - Testech Electronics Pte Ltd + 7C4CA5 + SKY UK LIMITED - 0026F3 - SMC Networks + CC4E24 + Brocade Communications Systems LLC - 0026A5 - Microrobot Ltd + 00E052 + Brocade Communications Systems LLC - 0026A3 - FQ Ingenieria Electronica S.A. + 0014A4 + Hon Hai Precision Ind. Co.,Ltd. - 00269D - M2Mnet Ltd + 78DD08 + Hon Hai Precision Ind. Co.,Ltd. - 002697 - Alpha Technologies Inc. + 9CD21E + Hon Hai Precision Ind. Co.,Ltd. - 00268A - Terrier SC Ltd + F80D43 + Hon Hai Precision Ind. Co.,Ltd. - 002689 - General Dynamics Robotic Systems + 00010F + Brocade Communications Systems LLC - 0026C5 - Guangdong Gosun Telecommunications Ltd + 080088 + Brocade Communications Systems LLC - 0026C4 - Cadmos microsystems S.r.l. + 84742A + zte corporation - 0026C8 - System Sensor + 38F889 + HUAWEI TECHNOLOGIES CO.,LTD - 00267A - wuhan hongxin telecommunication technologies Ltd + D07AB5 + HUAWEI TECHNOLOGIES CO.,LTD - 0026C2 - SCDI Ltd + 904E2B + HUAWEI TECHNOLOGIES CO.,LTD - 002685 - Digital Innovation + 2008ED + HUAWEI TECHNOLOGIES CO.,LTD - 0026A9 - Strong Technologies Pty Ltd + 40F308 + Murata Manufacturing Co., Ltd. - 002672 - AAMP Of America + 0007D8 + Hitron Technologies. Inc - 0025FD - OBR Centrum Techniki Morskiej S.A. + B43052 + HUAWEI TECHNOLOGIES CO.,LTD - 002600 - TEAC Australia Pty Ltd + 80D09B + HUAWEI TECHNOLOGIES CO.,LTD - 0025FF - CreNova Multimedia Ltd + 1C8E5C + HUAWEI TECHNOLOGIES CO.,LTD - 002659 - Nintendo Ltd + 002568 + HUAWEI TECHNOLOGIES CO.,LTD - 002651 - Cisco Systems Inc. + 781DBA + HUAWEI TECHNOLOGIES CO.,LTD - 002612 - Space Exploration Technologies + 00259E + HUAWEI TECHNOLOGIES CO.,LTD - 002616 - Rosemount Inc. + 3475C7 + Avaya Inc - 00260B - Cisco Systems Inc. + B0ADAA + Avaya Inc - 002623 - JRD Communication Inc + FC48EF + HUAWEI TECHNOLOGIES CO.,LTD - 002627 - Truesell + 707BE8 + HUAWEI TECHNOLOGIES CO.,LTD - 00264F - Kruger &Gothe GmbH + 4C1FCC + HUAWEI TECHNOLOGIES CO.,LTD - 002621 - InteliCloud Technology Inc. + D4B110 + HUAWEI TECHNOLOGIES CO.,LTD - 00261C - Neovia Inc. + E468A3 + HUAWEI TECHNOLOGIES CO.,LTD - 002664 - Core System Japan + 8853D4 + HUAWEI TECHNOLOGIES CO.,LTD - 002639 - T.M. Electronics Inc. + 04C06F + HUAWEI TECHNOLOGIES CO.,LTD - 0025C6 - kasercorp Ltd + 202BC1 + HUAWEI TECHNOLOGIES CO.,LTD - 0025C5 - Star Link Communication Pvt Ltd + 54A51B + HUAWEI TECHNOLOGIES CO.,LTD - 0025C7 - altek Corporation + 006B8E + Shanghai Feixun Communication Co.,Ltd. - 0025E6 - Belgian Monitoring Systems bvba + D46AA8 + HUAWEI TECHNOLOGIES CO.,LTD - 0025E0 - CeedTec Sdn Bhd + B8BC1B + HUAWEI TECHNOLOGIES CO.,LTD - 0025DE - Probits Ltd + 582AF7 + HUAWEI TECHNOLOGIES CO.,LTD - 0025B0 - Schmartz Inc + 0034FE + HUAWEI TECHNOLOGIES CO.,LTD - 0025AD - Manufacturing Resources International + C85195 + HUAWEI TECHNOLOGIES CO.,LTD - 0025AC - I-Tech Corporation + 40CBA8 + HUAWEI TECHNOLOGIES CO.,LTD - 0025AB - AIO LCD PC BU / TPV + D46E5C + HUAWEI TECHNOLOGIES CO.,LTD - 0025EC - Humanware + 4C8BEF + HUAWEI TECHNOLOGIES CO.,LTD - 0025ED - NuVo Technologies LLC + B4475E + Avaya Inc - 0025E9 - i-mate Development Inc. + BCADAB + Avaya Inc - 0025BA - Alcatel-Lucent IPD + FCA841 + Avaya Inc - 0025BB - INNERINT Ltd + 24D921 + Avaya Inc - 0025B8 - Agile Communications Inc. + 848371 + Avaya Inc - 0025B1 - Maya-Creation Corporation + 001B4F + Avaya Inc - 0025A1 - Enalasys + 3400A3 + HUAWEI TECHNOLOGIES CO.,LTD - 0025F3 - Nordwestdeutsche Zahlerrevision + 00E08F + Cisco Systems, Inc - 0025DD - Sunnytek Information Ltd + 001868 + Cisco SPVTG - 0025CE - InnerSpace + 887556 + Cisco Systems, Inc - 002549 - Jeorich Tech Ltd + FC9947 + Cisco Systems, Inc - 002539 - IfTA GmbH + 6C2056 + Cisco Systems, Inc - 002537 - Runcom Technologies Ltd + ACF2C5 + Cisco Systems, Inc - 002538 - Samsung Electronics Ltd Memory Division + 0003DD + Comark Interactive Solutions - 002544 - LoJack Corporation + 005053 + Cisco Systems, Inc - 002532 - Digital Recorders + 005050 + Cisco Systems, Inc - 00255D - Morningstar Corporation + 00906D + Cisco Systems, Inc - 002558 - Mpedia + 0090AB + Cisco Systems, Inc - 00254A - RingCube Technologies Inc. + 005054 + Cisco Systems, Inc - 00254F - ELETTROLAB Srl + 00500B + Cisco Systems, Inc - 002583 - Cisco Systems Inc. + 2401C7 + Cisco Systems, Inc - 002591 - NEXTEK Inc. + 6886A7 + Cisco Systems, Inc - 00258D - Haier + 08CC68 + Cisco Systems, Inc - 002571 - Zhejiang Tianle Digital Electric Ltd + 247189 + Texas Instruments - 00259A - CEStronics GmbH + 987BF3 + Texas Instruments - 002502 - NaturalPoint + A0F6FD + Texas Instruments - 0024F8 - Technical Solutions Company Ltd + D0B5C2 + Texas Instruments - 0024F9 - Cisco Systems Inc. + 78A504 + Texas Instruments - 0024F2 - Uniphone Telecommunication Ltd + 6CECEB + Texas Instruments - 002514 - PC Worth Int'l Ltd + 5006AB + Cisco Systems, Inc - 00250B - Centrofactor Inc + 00E0A3 + Cisco Systems, Inc - 002506 - A.I. Antitaccheggio Italia SRL + 00902B + Cisco Systems, Inc - 00251C - EDT + 3C0E23 + Cisco Systems, Inc - 00251A - Psiber Data Systems Inc. + 00E018 + ASUSTek COMPUTER INC. - 0024E1 - Convey Computer Corp. + 000C6E + ASUSTek COMPUTER INC. - 0024EE - Wynmax Inc. + 000EA6 + ASUSTek COMPUTER INC. - 0024E3 - CAO Group + 001D60 + ASUSTek COMPUTER INC. - 002507 - ASTAK Inc. + 0015F2 + ASUSTek COMPUTER INC. - 0024D9 - BICOM Inc. + 90E6BA + ASUSTek COMPUTER INC. - 00248E - Infoware ZRt. + 0C2724 + Cisco Systems, Inc - 002494 - Shenzhen Baoxin Tech Ltd + 6C416A + Cisco Systems, Inc - 002489 - Vodafone Omnitel N.V. + ECE1A9 + Cisco Systems, Inc - 00246F - Onda Communication spa + 1CE85D + Cisco Systems, Inc - 00247F - Nortel Networks + A89D21 + Cisco Systems, Inc - 002475 - Compass System(Embedded Dept.) + 689CE2 + Cisco Systems, Inc - 0024C3 - Cisco Systems Inc. + C067AF + Cisco Systems, Inc - 0024B5 - Nortel Networks + C0255C + Cisco Systems, Inc - 0024B0 - Esab AB + F44E05 + Cisco Systems, Inc - 0024C4 - Cisco Systems Inc. + 881DFC + Cisco Systems, Inc - 00249D - NES Technology Inc. + A0F849 + Cisco Systems, Inc - 002464 - Bridge Technologies Co AS + 6CFA89 + Cisco Systems, Inc - 002462 - Rayzone Corporation + F46D04 + ASUSTek COMPUTER INC. - 002420 - NetUP Inc. + 745E1C + PIONEER CORPORATION - 00241E - Nintendo Ltd + 001011 + Cisco Systems, Inc - 00241F - DCT-Delta GmbH + 00000C + Cisco Systems, Inc - 00240E - Inventec Besta Ltd + 046273 + Cisco Systems, Inc - 002460 - Giaval Science Development Ltd + 28CFE9 + Apple, Inc. - 00245C - Design-Com Technologies Pty Ltd + 002608 + Apple, Inc. - 00243D - Emerson Appliance Motors and Controls + 0026B0 + Apple, Inc. - 002437 - Motorola - BSG + 0026BB + Apple, Inc. - 002444 - Nintendo Ltd + D49A20 + Apple, Inc. - 002413 - Cisco Systems Inc. + F81EDF + Apple, Inc. - 00244F - Asantron Technologies Ltd + D8B190 + Cisco Systems, Inc - 0023DD - Elgin S.A. + 80E86F + Cisco Systems, Inc - 0023DE - Ansync Inc. + AC7E8A + Cisco Systems, Inc - 0023D9 - Banner Engineering + 185933 + Cisco SPVTG - 0023DA - Industrial Computer Source (Deutschland)GmbH + 445829 + Cisco SPVTG - 002405 - Dilog Nordic AB + 602AD0 + Cisco SPVTG - 0023E8 - Demco Corp. + 001451 + Apple, Inc. - 0023E3 - Microtronic AG + 001E52 + Apple, Inc. - 0023B7 - Q-Light Ltd + 0021E9 + Apple, Inc. - 0023FD - AFT Atlas Fahrzeugtechnik GmbH + CC08E0 + Apple, Inc. - 0023EF - Zuend Systemtechnik AG + F0B479 + Apple, Inc. - 0023AC - Cisco Systems Inc. + 00A040 + Apple, Inc. - 0023D8 - Ball-It Oy + 003065 + Apple, Inc. - 00239F - Institut fur Pruftechnik + 0023BE + Cisco SPVTG - 00239D - Mapower Electronics Ltd + 3CD0F8 + Apple, Inc. - 00239C - Juniper Networks + 680927 + Apple, Inc. - 002398 - Vutlan sro + 6CC26B + Apple, Inc. - 00235B - Gulfstream + 44D884 + Apple, Inc. - 002359 - Benchmark Electronics ( Thailand ) Public Company Limited + 64200C + Apple, Inc. - 002357 - Pitronot Technologies and Engineering P.T.E Ltd + 40B395 + Apple, Inc. - 002355 - Kinco Automation(Shanghai) Ltd + 44FB42 + Apple, Inc. - 002373 - GridIron Systems Inc. + E88D28 + Apple, Inc. - 002367 - UniControls a.s. + 949426 + Apple, Inc. - 002368 - Zebra Technologies Inc + 207D74 + Apple, Inc. - 00236E - Burster GmbH & Co KG + F4F15A + Apple, Inc. - 002366 - Beijing Siasun Electronic System Ltd + C86F1D + Apple, Inc. - 00238F - Nidec Copal Corporation + B065BD + Apple, Inc. - 002380 - Nanoteq + 8C2DAA + Apple, Inc. - 00233D - Laird Technologies + 848506 + Apple, Inc. - 00233F - Purechoice Inc + 98FE94 + Apple, Inc. - 00231B - Danaher Motion - Kollmorgen + D8004D + Apple, Inc. - 00231E - Cezzer Multimedia Technologies + 1093E9 + Apple, Inc. - 00231F - Guangda Electronic & Telecommunication Technology Development Ltd + 442A60 + Apple, Inc. - 002270 - ABK North America LLC + C82A14 + Apple, Inc. - 002313 - Qool Technologies Ltd + 3C0754 + Apple, Inc. - 002310 - LNC Technology Ltd + C8334B + Apple, Inc. - 0022CD - Ared Technology Ltd + 64E682 + Apple, Inc. - 0022CC - SciLog Inc. + 9C207B + Apple, Inc. - 0022CB - IONODES Inc. + A4B197 + Apple, Inc. - 0022C6 - Sutus Inc + A4D1D2 + Apple, Inc. - 0022E8 - Applition Ltd + 28CFDA + Apple, Inc. - 0022E9 - ProVision Communications + 542696 + Apple, Inc. - 0022E6 - Intelligent Data + 64A3CB + Apple, Inc. - 0022E3 - Amerigon + 30F7C5 + Apple, Inc. - 0022EB - Data Respons A/S + 3090AB + Apple, Inc. - 0022EF - iWDL Technologies + 045453 + Apple, Inc. - 0022F2 - SunPower Corp + F4F951 + Apple, Inc. - 0022E2 - WABTEC Transit Division + C06394 + Apple, Inc. - 002301 - Witron Technology Limited + 18AF8F + Apple, Inc. - 0022F7 - Conceptronic + C8B5B7 + Apple, Inc. - 00230C - Clover Electronics Ltd + 90B21F + Apple, Inc. - 002334 - Cisco Systems Inc. + B8E856 + Apple, Inc. - 0022C8 - Applied Instruments B.V. + 2078F0 + Apple, Inc. - 0022C0 - Shenzhen Forcelink Electronic Ltd + E0ACCB + Apple, Inc. - 0022A6 - Sony Computer Entertainment America + A0999B + Apple, Inc. - 0022A7 - Tyco Electronics AMP GmbH + 24240E + Apple, Inc. - 0022A1 - Huawei Symantec Technologies Ltd + 903C92 + Apple, Inc. - 00229D - Pyung-HWA Ind Ltd + AC87A3 + Apple, Inc. - 002296 - LinoWave Corporation + D8BB2C + Apple, Inc. - 002244 - Chengdu Linkon Communications Device Ltd + D04F7E + Apple, Inc. - 002250 - Point Six Wireless LLC + 9CF387 + Apple, Inc. - 00226F - 3onedata Technology Ltd + B418D1 + Apple, Inc. - 002278 - Shenzhen Tongfang Multimedia Technology Ltd + F0DBF8 + Apple, Inc. - 00227A - Telecom Design + 48746E + Apple, Inc. - 002260 - AFREEY Inc. + 34363B + Apple, Inc. - 0021EF - Kapsys + D0A637 + Apple, Inc. - 0021ED - Telegesis + 789F70 + Apple, Inc. - 0021EB - ESP Systems LLC + A85B78 + Apple, Inc. - 002237 - Shinhint Group + FCE998 + Apple, Inc. - 00222F - Open Grid Computing Inc. + 0CBC9F + Apple, Inc. - 0021F6 - Oracle Corporation + D89695 + Apple, Inc. - 002206 - Cyberdyne Inc. + 1499E2 + Apple, Inc. - 002202 - Excito Elektronik i Skane AB + A88E24 + Apple, Inc. - 002227 - uv-electronic GmbH + 68AE20 + Apple, Inc. - 00221E - Media Devices Ltd + 54AE27 + Apple, Inc. - 002225 - Thales Avionics Ltd + C8F650 + Apple, Inc. - 002220 - Mitac Technology Corp + 50D59C + Thai Habel Industrial Co., Ltd. - 00220E - Indigo Security Ltd + 6C4A39 + BITA - 002207 - Inteno Broadband Technology AB + 847D50 + Holley Metering Limited - 00223E - IRTrans GmbH + D81D72 + Apple, Inc. - 0021CE - NTC-Metrotek + 341298 + Apple, Inc. - 0021CA - ART System Ltd + 70E72C + Apple, Inc. - 0021CB - SMS Tecnologia Eletronica Ltda + 70ECE4 + Apple, Inc. - 0021C8 - LOHUIS Networks + E034E4 + Feit Electric Company, Inc. - 0021DB - Santachi Video Technology (Shenzhen) Ltd + 34C9F0 + LM Technologies Ltd - 0021BF - Hitachi High-Tech Control Systems Corporation + 681401 + Hon Hai Precision Ind. Co.,Ltd. - 0021BC - Zala Computer + 50A9DE + Smartcom - Bulgaria AD - 0021B4 - Apro Media Ltd + 3052CB + Liteon Technology Corporation - 0021A8 - Telephonics Corporation + 049645 + WUXI SKY CHIP INTERCONNECTION TECHNOLOGY CO.,LTD. - 0021A9 - Mobilink Telecom Ltd + 1CCDE5 + Shanghai Wind Technologies Co.,Ltd - 00218D - AP Router Ind. Eletronica LtdA + AC1FD7 + Real Vision Technology Co.,Ltd. - 002190 - Goliath Solutions + 88C242 + Poynt Co. - 002185 - Micro-Star International + DC82F6 + iPort - 00219F - Satel Oy + 68A828 + HUAWEI TECHNOLOGIES CO.,LTD - 002196 - Telsey S.p.A. + CC20E8 + Apple, Inc. - 002182 - SandLinks Systems Ltd + 6C9354 + Yaojin Technology (Shenzhen) Co., LTD. - 002183 - ANDRITZ HYDRO GmbH + DCDC07 + TRP Systems BV - 0021DF - Martin Christ GmbH + 3891D5 + Hangzhou H3C Technologies Co., Limited - 0021D4 - Vollmer Werke GmbH + BC9C31 + HUAWEI TECHNOLOGIES CO.,LTD - 0021D6 - LXI Consortium + 70480F + Apple, Inc. - 0021A6 - Videotec Spa + 3CB72B + PLUMgrid Inc - 002159 - Juniper Networks + 382187 + Midea Group Co., Ltd. - 002155 - Cisco Systems Inc. + 78D6B2 + Toshiba - 002157 - National Datacast Inc. + 8CE2DA + Circle Media Inc - 00213B - Berkshire Products Inc. + 489A42 + Technomate Ltd - 002137 - Bay Controls LLC + 20D160 + Private - 002139 - Escherlogic Inc. + E8DED6 + Intrising Networks, Inc. - 00212C - SemIndia System Private Limited + 381C23 + Hilan Technology CO.,LTD - 00212B - MSA Auer + D88B4C + KingTing Tech. - 002174 - AvaLAN Wireless + 48BF74 + Baicells Technologies Co.,LTD - 002179 - IOGEAR Inc. + F0B0E7 + Apple, Inc. - 002168 - iVeia LLC + 649A12 + P2 Mobile Technologies Limited - 002150 - Eyeview Electronics + E4C2D1 + HUAWEI TECHNOLOGIES CO.,LTD - 00214D - Guangzhou Skytone Transmission Technology Com Ltd + 0469F8 + Apple, Inc. - 00212A - Audiovox Corporation + AC8995 + AzureWave Technology Inc. - 00215E - IBM Corp + 3029BE + Shanghai MRDcom Co.,Ltd - 001FF6 - PS Audio International + 48B620 + ROLI Ltd. - 002110 - Clearbox Systems + 20C3A4 + RetailNext - 00210C - Cymtec Systems Inc. + D4F4BE + Palo Alto Networks - 00210B - Gemini Traze Rfid PVT Ltd + D888CE + RF Technology Pty Ltd - 001FDD - GDI LLC + 845B12 + HUAWEI TECHNOLOGIES CO.,LTD - 001FDA - Nortel Networks + 205531 + Samsung Electronics Co.,Ltd - 002104 - Gigaset Communications GmbH + 307CB2 + ANOV FRANCE - 001FFB - Green Packet Bhd + 847973 + Shanghai Baud Data Communication Co.,Ltd. - 001FE9 - Printrex Inc. + E8B4C8 + Samsung Electronics Co.,Ltd - 001FF0 - Audio Partnership + D087E2 + Samsung Electronics Co.,Ltd - 001FEA - Applied Media Technologies Corporation + F05B7B + Samsung Electronics Co.,Ltd - 001FD9 - RSD Communications Ltd + B047BF + Samsung Electronics Co.,Ltd - 001FCE - Qtech LLC + 7C0BC6 + Samsung Electronics Co.,Ltd - 001F8B - Cache IQ + 906FA9 + NANJING PUTIAN TELECOMMUNICATIONS TECHNOLOGY CO.,LTD. - 001F85 - Apriva ISS LLC + 60FD56 + WOORISYSTEMS CO., Ltd - 001F87 - Skydigital Inc. + 0C756C + Anaren Microwave, Inc. - 001F88 - FMS Force Measuring Systems AG + 44FDA3 + Everysight LTD. - 001F86 - digEcor + D47BB0 + ASKEY COMPUTER CORP - 001FA1 - Gtran Inc + F0224E + Esan electronic co. - 001F9F - Thomson Telecom Belgium + C8F9C8 + NewSharp Technology(SuZhou)Co,Ltd - 001F99 - SERONICS Ltd + A8A795 + Hon Hai Precision Ind. Co.,Ltd. - 001F80 - Lucas Holding bv + 9870E8 + INNATECH SDN BHD - 001B58 - ACE CAD Enterprise Ltd + 44656A + Mega Video Electronic(HK) Industry Co., Ltd - 001FB0 - TimeIPS Inc. + C412F5 + D-Link International - 001FAE - Blick South Africa (Pty) Ltd + 68EDA4 + Shenzhen Seavo Technology Co.,Ltd - 001F79 - Lodam Electronics A/S + 2CC5D3 + Ruckus Wireless - 001F71 - xG Technology Inc. + 80C5E6 + Microsoft Corporation - 001FA5 - Blue-White Industries + 10DF8B + Shenzhen CareDear Communication Technology Co.,Ltd - 001F9D - Cisco Systems Inc. + 606DC7 + Hon Hai Precision Ind. Co.,Ltd. - 001F96 - Aprotech Ltd + CC5FBF + Topwise 3G Communication Co., Ltd. - 001F6C - Cisco Systems Inc. + E02CB2 + Lenovo Mobile Communication (Wuhan) Company Limited - 001F6F - Fujian Sunnada Communication Ltd + 78EB39 + Instituto Nacional de Tecnología Industrial - 001F60 - Compass Systems Corp. + 5440AD + Samsung Electronics Co.,Ltd - 001F6A - PacketFlux Technologies Inc. + FCE1FB + Array Networks - 001F65 - Korea Electric Terminal Ltd + E89120 + Motorola Mobility LLC, a Lenovo Company - 001F17 - IDX Company Ltd + D4F9A1 + HUAWEI TECHNOLOGIES CO.,LTD - 001F1B - RoyalTek Company Ltd + 145A83 + Logi-D inc - 001F5E - Dyna Technology Ltd + FC8F90 + Samsung Electronics Co.,Ltd - 001F55 - Honeywell Security (China) Ltd + 54CD10 + Panasonic Mobile Communications Co.,Ltd. - 001F54 - Lorex Technology Inc. + A424DD + Cambrionix Ltd - 001F2E - Triangle Research Int'l Pte Ltd + 804E81 + Samsung Electronics Co.,Ltd - 001F4B - Lineage Power + 48066A + Tempered Networks, Inc. - 001F0D - L3 Communications - Telemetry West + 74042B + Lenovo Mobile Communication (Wuhan) Company Limited - 001EFC - JSC Massa-K + D05C7A + Sartura d.o.o. - 001F23 - Interacoustics + 64167F + Polycom - 001F06 - Integrated Dispatch Solutions + C09A71 + XIAMEN MEITU MOBILE TECHNOLOGY CO.LTD - 001EBA - High Density Devices AS + 340B40 + MIOS ELETTRONICA SRL - 001EB8 - Aloys Inc. + 144146 + Honeywell (China) Co., LTD - 001EB4 - Unifat Technology Ltd + BC5C4C + ELECOM CO.,LTD. - 001EDA - Wesemann Elektrotechniek B.V. + 887033 + Hangzhou Silan Microelectronic Inc - 001ED7 - H-Stream Wireless Inc. + DC56E6 + Shenzhen Bococom Technology Co.,LTD - 001ED5 - Tekon-Automatics + 900A39 + Wiio, Inc. - 001EE8 - Mytek + BCF811 + Xiamen DNAKE Technology Co.,Ltd - 001EEE - ETL Systems Ltd + E861BE + Melec Inc. - 001EFA - PROTEI Ltd + 5870C6 + Shanghai Xiaoyi Technology Co., Ltd. - 001EFB - Trio Motion Technology Ltd + 402814 + RFI Engineering - 001EF8 - Emfinity Inc. + F87AEF + Rosonix Technology, Inc. - 001ECB - RPC Energoautomatika Ltd + 2028BC + Visionscape Co,. Ltd. - 001EA8 - Datang Mobile Communications Equipment Ltd + 40A5EF + Shenzhen Four Seas Global Link Network Technology Co., Ltd. - 001EAB - TeleWell Oy + B856BD + ITT LLC - 001E9F - Visioneering Systems Inc. + C4924C + KEISOKUKI CENTER CO.,LTD. - 001E6B - Cisco SPVTG + 749CE3 + KodaCloud Canada, Inc - 001E70 - Cobham Antenna Systems + CC9635 + LVS Co.,Ltd. - 001E61 - ITEC GmbH + 241C04 + SHENZHEN JEHE TECHNOLOGY DEVELOPMENT CO., LTD. - 001E3E - KMW Inc. + 4480EB + Motorola Mobility LLC, a Lenovo Company - 001E38 - Bluecard Software Technology Ltd + 50502A + Egardia - 001E47 - PT. Hariff Daya Tunggal Engineering + 94F19E + HUIZHOU MAORONG INTELLIGENT TECHNOLOGY CO.,LTD - 001E48 - Wi-Links + D45556 + Fiber Mountain Inc. - 001E8A - eCopy Inc. + DC60A1 + Teledyne DALSA Professional Imaging - 001E9B - San-Eisha Ltd + 4CA515 + Baikal Electronics JSC - 001E96 - Sepura Plc + 7C3CB6 + Shenzhen Homecare Technology Co.,Ltd. - 001E59 - Silicon Turnkey Express LLC + 1C7D22 + FUJIFILM Business Innovation Corp. - 001E51 - Converter Industry Srl + 749637 + Todaair Electronic Co., Ltd - 001E71 - MIrcom Group Of Companies + 88E603 + Avotek corporation - 001DC4 - AIOI Systems Ltd + 84C3E8 + Vaillant GmbH - 001DC0 - Enphase Energy + 2CAD13 + SHENZHEN ZHILU TECHNOLOGY CO.,LTD - 001DBD - Versamed Inc. + C48E8F + Hon Hai Precision Ind. Co.,Ltd. - 001DF8 - Webpro Vision Technology Corporation + 54369B + 1Verge Internet Technology (Beijing) Co., Ltd. - 001DF9 - Cybiotronics (Far East) Limited + 4062B6 + Tele system communication - 001DF7 - R. STAHL Schaltgerate GmbH + 60128B + CANON INC. - 001E05 - Xseed Technologies & Computing + 78ACBF + Igneous Systems - 001E07 - Winy Technology Ltd + 40D28A + Nintendo Co., Ltd. - 001E0A - Syba Tech Limited + 9CD35B + Samsung Electronics Co.,Ltd - 001E03 - LiComm Ltd + A89FBA + Samsung Electronics Co.,Ltd - 001E1B - Digital Stream Technology Inc. + B88EC6 + Stateless Networks - 001E17 - STN BV + BCD165 + Cisco SPVTG - 001E18 - Radio Activity srl + 28E476 + Pi-Coral - 001E15 - Beech Hill Electronics + 74A34A + ZIMI CORPORATION - 001E30 - Shireen Inc + 20C06D + SHENZHEN SPACETEK TECHNOLOGY CO.,LTD - 001E2E - SIRTI S.p.A. + 08A5C8 + Sunnovo International Limited - 001DDC - HangZhou DeChangLong Tech & Info Ltd + D05BA8 + zte corporation - 001DEB - DINEC International + A86405 + nimbus 9, Inc - 001D9A - Godex International Ltd + E4BAD9 + 360 Fly Inc. - 001D97 - Alertus Technologies LLC + 10C67E + SHENZHEN JUCHIN TECHNOLOGY CO., LTD - 001D91 - Digitize Inc. + 6828F6 + Vubiq Networks, Inc. - 001D95 - Flash Inc. + 10A659 + Mobile Create Co.,Ltd. - 001D9D - Artjoy International Limited + 58856E + QSC AG - 001D9E - Axion Technologies + 4886E8 + Microsoft Corporation - 001D70 - Cisco Systems Inc. + A0A3E2 + Actiontec Electronics, Inc - 001D78 - Invengo Information Technology Ltd + 74547D + Cisco SPVTG - 001D6F - Chainzone Technology Ltd + 8C9109 + Toyoshima Electric Technoeogy(Suzhou) Co.,Ltd. - 001D7F - Tekron International Ltd + 54098D + deister electronic GmbH - 001D79 - Signamax LLC + 50F43C + Leeo Inc - 001DAE - Chang Tseng Technology Ltd + E887A3 + Loxley Public Company Limited - 001DA6 - Media Numerics Limited + D8CB8A + Micro-Star INTL CO., LTD. - 001D62 - InPhase Technologies + F88479 + Yaojin Technology(Shenzhen)Co.,Ltd - 001D63 - Miele & Cie. KG + 2C2997 + Microsoft Corporation - 001DB7 - Tendril Networks Inc. + 00E6E8 + Netzin Technology Corporation,.Ltd. - 001D8D - Fluke Process Instruments GmbH + 70FC8C + OneAccess SA - 001D1F - Siauliu Tauro Televizoriai, JSC + 2C3796 + CYBO CO.,LTD. - 001D43 - Shenzhen G-link Digital Technology Ltd + 587FB7 + SONAR INDUSTRIAL CO., LTD. - 001D3F - Mitron Pty Ltd + EC59E7 + Microsoft Corporation - 001D39 - Moohadigital Ltd + C035C5 + Prosoft Systems LTD - 001D37 - Thales-Panda Transportation System + 908C09 + Total Phase - 001D13 - NextGTV + DC2F03 + Step forward Group Co., Ltd. - 001D14 - Speradtone Information Technology Limited + 380E7B + V.P.S. Thai Co., Ltd - 001D10 - LightHaus Logic Inc. + 08EB29 + Jiangsu Huitong Group Co.,Ltd. - 001D04 - Zipit Wireless Inc. + 409B0D + Shenzhen Yourf Kwan Industrial Co., Ltd - 001CF2 - Tenlon Technology Ltd + 4C2C83 + Zhejiang KaNong Network Technology Co.,Ltd. - 001D30 - YX Wireless S.A. + D46132 + Pro Concept Manufacturer Co.,Ltd. - 001CB2 - BPT SPA + 54A050 + ASUSTek COMPUTER INC. - 001CB5 - Neihua Network Technology Ltd(NHN) + 849681 + Cathay Communication Co.,Ltd - 001CB4 - Iridium Satellite LLC + 2CA30E + POWER DRAGON DEVELOPMENT LIMITED - 001CB6 - Duzon CNT Ltd + 8486F3 + Greenvity Communications - 001CC7 - Rembrandt Technologies LLC d/b/a REMSTREAM + 6050C1 + Kinetek Sports - 001CBB - MusicianLink + 2C1A31 + Electronics Company Limited - 001C8D - Mesa Imaging + 2012D5 + Scientech Materials Corporation - 001C89 - Force Communications Inc. + 8C5D60 + UCI Corporation Co.,Ltd. - 001C87 - Uriver Inc. + 6099D1 + Vuzix / Lenovo - 001CCD - Alektrona Corporation + B04515 + mira fitness,LLC. - 001CEC - Mobilesoft (Aust.) Pty Ltd + BC6B4D + Nokia - 001CE8 - Cummins Inc + C8D019 + Shanghai Tigercel Communication Technology Co.,Ltd - 001CD0 - Circleone Ltd + 902181 + Shanghai Huaqin Telecom Technology Co.,Ltd - 001C9F - Razorstream LLC + 58108C + Intelbras - 001C7D - Excelpoint Manufacturing Pte Ltd + 4C7403 + BQ - 001C5C - Integrated Medical Systems Inc. + 1C5216 + DONGGUAN HELE ELECTRONICS CO., LTD - 001C52 - Visionee SRL + 14488B + Shenzhen Doov Technology Co.,Ltd - 001C47 - Hangzhou Hollysys Automation Ltd + 80F8EB + RayTight - 001C16 - ThyssenKrupp Elevator + D437D7 + zte corporation - 001C19 - secunet Security Networks AG + 2C010B + NASCENT Technology, LLC - RemKon - 001C6C - 30805 + 784561 + CyberTAN Technology Inc. - 001C61 - Galaxy Microsystems LImited + 94CE31 + CTS Limited - 001C3B - AmRoad Technology Inc. + 6C6EFE + Core Logic Inc. - 001C3F - International Police Technologies Inc. + 3808FD + Silca Spa - 001C28 - Sphairon Technologies GmbH + 20ED74 + Ability enterprise co.,Ltd. - 001C1F - Quest Retail Technology Pty Ltd + 6C0273 + Shenzhen Jin Yun Video Equipment Co., Ltd. - 001C32 - Telian Corporation + A056B2 + Harman/Becker Automotive Systems GmbH - 001C2B - Alertme.com Limited + 44666E + IP-LINE - 001C77 - Prodys + 5CB6CC + NovaComm Technologies Inc. - 001C6F - Emfit Ltd + 5C1515 + ADVAN - 001C49 - Zoltan Technology Inc. + 244F1D + iRule LLC - 001C63 - Truen + 04DEDB + Rockport Networks Inc - 001BDF - Iskra Sistemi d.d. + 1C4840 + IMS Messsysteme GmbH - 001BD9 - Edgewater Wireless Systems Inc + 54DF00 + Ulterius Technologies, LLC - 001BC7 - StarVedia Technology Inc. + 34C5D0 + Hagleitner Hygiene International GmbH - 001BEC - Netio Technologies Ltd + 10C37B + ASUSTek COMPUTER INC. - 001C09 - SAE Electronic Ltd + B40B44 + Smartisan Technology Co., Ltd. - 001C0C - TANITA Corporation + 90B686 + Murata Manufacturing Co., Ltd. - 001BA6 - intotech Inc. + ECD9D1 + Shenzhen TG-NET Botone Technology Co.,Ltd. - 001BA4 - S.A.E Afikim + 2829CC + Corsa Technology Incorporated - 001BB4 - Airvod Limited + 3431C4 + AVM GmbH - 001BB6 - Bird Electronic Corp. + 184A6F + Alcatel-Lucent Shanghai Bell Co., Ltd - 001BE8 - Ultratronik GmbH + E85D6B + Luminate Wireless - 001BE1 - ViaLogy + 50FEF2 + Sify Technologies Ltd - 001B93 - JC Decaux SA DNT + 705B2E + M2Communication Inc. - 001B9B - Hose-McCann Communications + B40AC6 + DEXON Systems Ltd. - 001B9C - SATEL sp. z o.o. + D059E4 + Samsung Electronics Co.,Ltd - 001B92 - l-acoustics + 14A364 + Samsung Electronics Co.,Ltd - 001B8E - Hulu Sweden AB + 481A84 + Pointer Telocation Ltd - 001B45 - ABB AS, Division Automation Products + DC663A + Apacer Technology Inc. - 001B3F - ProCurve Networking by HP + 08DF1F + Bose Corporation - 001B41 - General Infinity Ltd + 4826E8 + Tek-Air Systems, Inc. - 001B50 - Nizhny Novgorod Factory named after M.Frunze, FSUE (NZiF) + 581F67 + Open-m technology limited - 001B47 - Futarque A/S + A012DB + TABUCHI ELECTRIC CO.,LTD - 001B6C - LookX Digital Media BV + 488244 + Life Fitness / Div. of Brunswick - 001B6B - Swyx Solutions AG + C83168 + eZEX corporation - 001B69 - Equaline Corporation + D05AF1 + Shenzhen Pulier Tech CO.,Ltd - 001B76 - Ripcode Inc. + 40B3CD + Chiyoda Electronics Co.,Ltd. - 001B70 - IRI Ubiteq Inc. + 5CF4AB + Zyxel Communications Corporation - 001B68 - Modnnet Ltd + 08B2A3 + Cynny Italia S.r.L. - 001B62 - JHT Optoelectronics Ltd + FCE186 + A3M Co., LTD - 001B8A - 2M Electronic A/S + 54EF92 + Shenzhen Elink Technology Co., LTD - 001B80 - LORD Corporation + 0C2026 + noax Technologies AG - 001B3E - Curtis Inc. + 202564 + PEGATRON CORPORATION - 001B37 - Computec Oy + C8D590 + FLIGHT DATA SYSTEMS - 001B07 - Mendocino Software + A0DA92 + Nanjing Glarun Atten Technology Co. Ltd. - 001B08 - Danfoss Drives A/S + 54C80F + TP-LINK TECHNOLOGIES CO.,LTD. - 001B01 - Applied Radio Technologies + E4D332 + TP-LINK TECHNOLOGIES CO.,LTD. - 001B02 - ED Ltd + 70305D + Ubiquoss Inc - 001AFC - ModusLink Corporation + D4CFF9 + Shenzhen SEI Robotics Co.,Ltd - 001B10 - Shenzhen Kang Hui Technology Ltd + 24336C + Private - 001B0B - Phidgets Inc. + ECE512 + tado GmbH - 001B0C - Cisco Systems Inc. + 7CFF62 + Huizhou Super Electron Technology Co.,Ltd. - 001AE0 - Mythology Tech Express Inc. + 283B96 + Cool Control LTD - 001AE2 - Cisco Systems Inc. + 648D9E + IVT Electronic Co.,Ltd - 001AD7 - Christie Digital Systems Inc. + 949F3F + Optek Digital Technology company limited - 001B23 - SimpleComTools + 78FEE2 + Shanghai Diveo Technology Co., Ltd - 001AF6 - Woven Systems Inc. + CC95D7 + Vizio, Inc - 001AF9 - AeroVIronment (AV Inc) + FC09F6 + GUANGDONG TONZE ELECTRIC CO.,LTD - 001B30 - Solitech Inc. + BCF61C + Geomodeling Wuxi Technology Co. Ltd. - 001B18 - Tsuken Electric Ind Ltd + 086DF2 + Shenzhen MIMOWAVE Technology Co.,Ltd - 001AE7 - Aztek Networks Inc. + 687848 + WESTUNITIS CO., LTD. - 001A95 - Hisense Mobile Communications Technoligy Ltd + 48D0CF + Universal Electronics, Inc. - 001A81 - Zelax + DCC793 + Nokia Corporation - 001A87 - Canhold International Limited + 444891 + HDMI Licensing, LLC - 001A88 - Venergy Ltd + FC923B + Nokia Corporation - 001AC1 - 3Com Corporation + E03F49 + ASUSTek COMPUTER INC. - 001ABB - Fontal Technology Incorporation + 28656B + Keystone Microtech Corporation - 001ABD - Impatica Inc. + CC9F35 + Transbit Sp. z o.o. - 001AAE - Savant Systems LLC + F03FF8 + R L Drake - 001ACD - Tidel Engineering LP + 5C254C + Avire Global Pte Ltd - 001AC9 - Suzuken Ltd + D42F23 + Akenori PTE Ltd - 001A79 - Telecomunication Technologies Ltd + 98C0EB + Global Regency Ltd - 001AAA - Analogic Corp. + D09C30 + Foster Electric Company, Limited - 001A8B - Chunil Electric Ind., Co. + ECF72B + HD DIGITAL TECH CO., LTD. - 001A8D - AVECS Bergen GmbH + 4CF45B + Blue Clover Devices - 001AB4 - FFEI Ltd + B06971 + DEI Sales, Inc. - 001AB5 - Home Network System + C09D26 + Topicon HK Lmd. - 001AA4 - Future University-Hakodate + 442938 + NietZsche enterprise Co.Ltd. - 001A9F - A-Link Ltd + 9C3EAA + EnvyLogic Co.,Ltd. - 001A74 - Procare International Co + F8F005 + Newport Media Inc. - 001ABE - Computer HI-Tech Inc. + 1CFCBB + Realfiction ApS - 001A19 - Computer Engineering Limited + B0C554 + D-Link International - 001A18 - Advanced Simulation Technology Inc. + C4E984 + TP-LINK TECHNOLOGIES CO.,LTD. - 001A58 - CCV Deutschland GmbH - Celectronic eHealth Div. + 48EE86 + UTStarcom (China) Co.,Ltd - 001A5E - Thincom Technology Ltd + 888914 + All Components Incorporated - 001A5C - Euchner GmbH+Co. KG + F0321A + Mita-Teknik A/S - 001A5B - NetCare Service Ltd + 24050F + MTN Electronic Co. Ltd - 001A24 - Galaxy Telecom Technologies Ltd + AC2DA3 + TXTR GmbH - 001A20 - CMOTECH Ltd + 14C089 + DUNE HD LTD - 001A4E - NTI AG / LinMot + F4B6E5 + TerraSem Co.,Ltd - 001A52 - Meshlinx Wireless Inc. + A881F1 + BMEYE B.V. - 001A13 - Wanlida Group Ltd + D069D0 + Verto Medical Solutions, LLC - 001A0F - Sistemas Avanzados de Control, S.A. + 889CA6 + BTB Korea INC - 001A43 - Logical Link Communications + 90837A + General Electric Water & Process Technologies - 001A47 - Agami Systems Inc. + A43A69 + Vers Inc - 001A2D - The Navvo Group + B0D7C5 + Logipix Ltd - 001A2F - Cisco Systems Inc. + 9C44A6 + SwiftTest, Inc. - 0019A9 - Cisco Systems Inc. + FC07A0 + LRE Medical GmbH - 0019AE - Hopling Technologies b.v. + 1CEEE8 + Ilshin Elecom - 0019AF - Rigol Technologies Inc. + FC1349 + Global Apps Corp. - 0019DE - Mobitek + 848433 + Paradox Engineering SA - 0019E5 - Lynx Studio Technology Inc. + 44C306 + SIFROM Inc. - 0019DB - Micro-Star International + 602103 + I4VINE, INC - 001A03 - Angel Electronics Ltd + 60FFDD + C.E. ELECTRONICS, INC - 0019F9 - TDK-Lambda + 88A73C + Ragentek Technology Group - 0019CE - Progressive Gaming International + 88D962 + Canopus Systems US LLC - 0019BD - New Media Life + 9031CD + Onyx Healthcare Inc. - 0019F2 - Teradyne K.K. + E48184 + Nokia - 0019A7 - ITU-T + E056F4 + AxesNetwork Solutions inc. - 00199F - DKT A/S + 84569C + Coho Data, Inc., - 00198D - Ocean Optics Inc. + 78AE0C + Far South Networks - 001982 - SmarDTV + 84A783 + Alcatel Lucent - 001985 - IT Watchdogs Inc. + 80BAE6 + Neets - 001951 - NETCONS, s.r.o. + F8A2B4 + RHEWA-WAAGENFABRIK August Freudewald GmbH &amp;Co. KG - 001957 - Saafnet Canada Inc. + B024F3 + Progeny Systems - 001958 - Bluetooth SIG Inc. + 0C54A5 + PEGATRON CORPORATION - 001956 - Cisco Systems Inc. + 8C4DB9 + Unmonday Ltd - 00196B - Danpex Corporation + 4CD9C4 + Magneti Marelli Automotive Electronics (Guangzhou) Co. Ltd - 00193D - GMC Guardian Mobility Corp. + 2C5A05 + Nokia Corporation - 001986 - Cheng Hongjian + D481CA + iDevices, LLC - 00199E - Nifty + D858D7 + CZ.NIC, z.s.p.o. - 00196A - MikroM GmbH + 7C6AB3 + IBC TECHNOLOGIES INC. - 0018FF - PowerQuattro Co. + 181BEB + Actiontec Electronics, Inc - 0018F4 - EO TECHNICS Ltd + 78CA5E + ELNO - 0018FC - Altec Electronic AG + B4827B + AKG Acoustics GmbH - 0018F6 - Thomson Telecom Belgium + DC5E36 + Paterson Technology - 0018F5 - Shenzhen Streaming Video Technology Company Limited + 50E0C7 + TurControlSystme AG - 0018F9 - VVOND Inc. + DCAD9E + GreenPriz - 00193B - LigoWave + B8DF6B + SpotCam Co., Ltd. - 001935 - Duerr Dental AG + 9C8888 + Simac Techniek NV - 001910 - Knick Elektronische Messgeraete GmbH & Co. KG + 041A04 + WaveIP - 001913 - Chuang-Yi Network Equipment Ltd + 18C8E7 + Shenzhen Hualistone Technology Co.,Ltd - 0018FA - Yushin Precision Equipment Ltd + A03B1B + Inspire Tech - 0018EA - Alltec GmbH + 7CCD3C + Guangzhou Juzing Technology Co., Ltd - 0018E8 - Hacetron Corporation + 448A5B + Micro-Star INT'L CO., LTD. - 001914 - Winix Ltd + 0CCB8D + ASCO Numatics GmbH - 001906 - Cisco Systems Inc. + 6C4B7F + Vossloh-Schwabe Deutschland GmbH - 001901 - F1MEDIA + 688AB5 + EDP Servicos - 001931 - Balluff GmbH + 2493CA + Voxtronic Austria - 0018E3 - Visualgate Systems Inc. + 10B26B + base Co.,Ltd. - 00189F - Lenntek Corporation + 4CF02E + Vifa Denmark A/S - 001899 - Shenzhen jieshun Science & Technology Industry Ltd + DCCEBC + Shenzhen JSR Technology Co.,Ltd. - 00186D - Zhenjiang Sapphire Electronic Industry Co. + 68764F + Sony Corporation - 00186F - Setha Industria Eletronica LtdA + 38DBBB + Sunbow Telecom Co., Ltd. - 001875 - AnaCise Testnology Pte Ltd + 9843DA + INTERTECH - 0018C1 - Almitec Informatica e Comercio + 08CA45 + Toyou Feiji Electronics Co., Ltd. - 0018C4 - Raba Technologies LLC + 3CCA87 + Iders Incorporated - 0018C9 - EOps Technology Limited + 908C44 + H.K ZONGMU TECHNOLOGY CO., LTD. - 0018D8 - ARCH METER Corporation + 34A5E1 + Sensorist ApS - 0018D9 - Santosha Internatonal Inc. + 6C8366 + Nanjing SAC Power Grid Automation Co., Ltd. - 0018CF - Baldor Electric Company + 78D99F + NuCom HK Ltd. - 0018BC - ZAO NVP Bolid + 142BD2 + Armtel Ltd. - 0018B7 - D3 LED LLC + 9CA10A + SCLE SFE - 001895 - Hansun Technologies Inc. + 88789C + Game Technologies SA - 001883 - FORMOSA21 Inc. + 8079AE + ShanDong Tecsunrise Co.,Ltd - 00188E - Ekahau Inc. + 7CBD06 + AE REFUsol - 001814 - Mitutoyo Corporation + 94BA56 + Shenzhen Coship Electronics Co., Ltd. - 001817 - D. E. Shaw Research LLC + 740EDB + Optowiz Co., Ltd - 001811 - Neuros Technology International LLC. + A4895B + ARK INFOSOLUTIONS PVT LTD - 0017DE - Advantage Six Ltd + D09D0A + LINKCOM - 0017D7 - ION Geophysical Corporation Inc. + EC219F + VidaBox LLC - 001837 - Universal ABIT Ltd + A8CCC5 + Saab AB (publ) - 001822 - CEC Telecom Ltd + 988E4A + NOXUS(BEIJING) TECHNOLOGY CO.,LTD - 001820 - w5networks + 50B888 + wi2be Tecnologia S/A - 00185D - Taiguen Technology (Shen-Zhen) Ltd + 54BEF7 + PEGATRON CORPORATION - 00185E - Nexterm Inc. + 907990 + Benchmark Electronics Romania SRL - 001828 - e2v technologies (UK) Ltd + EC2AF0 + Ypsomed AG - 001835 - Thoratec / ITC + F854AF + ECI Telecom Ltd. - 001801 - Actiontec Electronics Inc. + F0F5AE + Adaptrum Inc. - 0017F3 - Harris Corporation + F83D4E + Softlink Automation System Co., Ltd - 00184A - Catcher Inc. + 7CE56B + ESEN Optoelectronics Technology Co.,Ltd. - 00184B - Las Vegas Gaming Inc. + D44C9C + Shenzhen YOOBAO Technology Co.Ltd - 00180E - Avega Systems + 20CEC4 + Peraso Technologies - 0017BC - Touchtunes Music Corporation + CC4703 + Intercon Systems Co., Ltd. - 0017C1 - CM Precision Technology Ltd + DC1792 + Captivate Network - 0017B2 - SK Telesys + 442AFF + E3 Technology, Inc. - 0017B1 - ACIST Medical Systems Inc. + 7C8306 + Glen Dimplex Nordic as - 0017A3 - MIX s.r.l. + 140D4F + Flextronics International - 0017A6 - Yosin Electronics Ltd + FC3FAB + Henan Lanxin Technology Co., Ltd - 00179C - DEPRAG SCHULZ GmbH u. Co. + 58468F + Koncar Electronics and Informatics - 001796 - Rittmeyer AG + 985D46 + PeopleNet Communication - 0017E1 - DACOS Technologies Ltd + F89FB8 + YAZAKI Energy System Corporation - 0017E0 - Cisco Systems Inc. + 540536 + Vivago Oy - 0017D2 - Thinlinx Pty Ltd + 6C90B1 + SanLogic Inc - 001785 - Sparr Electronics Ltd + E0FAEC + Platan sp. z o.o. sp. k. - 001775 - TTE Germany GmbH + 446755 + Orbit Irrigation - 0017B8 - Novatron Ltd + 5422F8 + zte corporation - 0017BB - Syrinx Industrial Electronics + 486E73 + Pica8, Inc. - 00177C - Smartlink Network Systems Limited + CC7B35 + zte corporation - 001781 - Greystone Data System Inc. + 04D437 + ZNV - 00178D - Checkpoint Systems Inc. + CCF407 + EUKREA ELECTROMATIQUE SARL - 00178E - Gunnebo Cash Automation AB + 088E4F + SF Software Solutions - 0017C7 - MARA Systems Consulting AB + ACCA8E + ODA Technologies - 00175D - Dongseo System. + 6405BE + NEW LIGHT LED - 001750 - GSI Group, MicroE Systems + E8BB3D + Sino Prime-Tech Limited - 001755 - GE Security + 28A241 + exlar corp - 00171D - Digit + 30786B + TIANJIN Golden Pentagon Electronics Co., Ltd. - 001718 - Vansco Electronics Oy + 20DF3F + Nanjing SAC Power Grid Automation Co., Ltd. - 001719 - Audiocodes USA Inc. + 4CD637 + Qsono Electronics Co., Ltd - 001776 - Meso Scale Diagnostics LLC + 9436E0 + Sichuan Bihong Broadcast &amp; Television New Technologies Co.,Ltd - 001779 - QuickTel + 34A68C + Shine Profit Development Limited - 001767 - Earforce AS + 949FB4 + ChengDu JiaFaAnTai Technology Co.,Ltd - 001739 - Bright Headphone Electronics Company + 509871 + Inventum Technologies Private Limited - 00172C - Taejin Infotech + 048C03 + ThinPAD Technology (Shenzhen)CO.,LTD - 001751 - Online Corporation + 88462A + Telechips Inc. - 00174C - Millipore + C80258 + ITW GSE ApS - 001745 - INNOTZ Ltd + F42012 + Cuciniale GmbH - 001748 - Neokoros Brasil Ltda + 98B039 + Nokia - 001763 - Essentia S.p.A. + B830A8 + Road-Track Telematics Development - 001701 - KDE Inc. + 406826 + Thales UK Limited - 0016F6 - Video Products Group + F82BC8 + Jiangsu Switter Co., Ltd - 0016EE - Royaldigital Inc. + 60C397 + 2Wire Inc - 0016DE - FAST Inc + FC6018 + Zhejiang Kangtai Electric Co., Ltd. - 0016DA - Futronic Technology Ltd + 0CF019 + Malgn Technology Co., Ltd. - 0016D4 - Compal Communications Inc. + 28285D + Zyxel Communications Corporation - 0016D7 - Sunways AG + 646EEA + Iskratel d.o.o. - 0016FF - Wamin Optocomm Mfg Corp + D0737F + Mini-Circuits - 0016D1 - ZAT a.s. + 58E02C + Micro Technic A/S - 0016C5 - Shenzhen Xing Feng Industry Ltd + 78B3CE + Elo touch solutions - 0016CC - Xcute Mobile Corp. + F8516D + Denwa Technology Corp. - 001717 - Leica Geosystems AG + 444A65 + Silverflare Ltd. - 001715 - Qstik + 744BE9 + EXPLORER HYPERTECH CO.,LTD - 00170E - Cisco Systems Inc. + E8CE06 + SkyHawke Technologies, LLC. - 001705 - Methode Electronics + C8F386 + Shenzhen Xiaoniao Technology Co.,Ltd - 0016AA - Kei Communication Technology Inc. + 2C72C3 + Soundmatters - 0016A8 - CWT Ltd + 2C69BA + RF Controls, LLC - 0016A6 - Dovado FZ-LLC + D4BF7F + UPVEL - 0016ED - Utility Inc. + C8DDC9 + Lenovo Mobile Communication Technology Ltd. - 0016C7 - Cisco Systems Inc. + 6C8686 + Technonia - 001671 - Symphox Information Co. + D4AC4E + BODi rS, LLC - 001669 - MRV Communication (Networks) Ltd + A4FCCE + Security Expert Ltd. - 001668 - Eishin Electronics + E07F88 + EVIDENCE Network SIA - 001640 - Asmobile Communication Inc. + 1C7CC7 + Coriant GmbH - 00163C - Rebox B.V. + 341B22 + Grandbeing Technology Co., Ltd - 00167D - Sky-Line Information Ltd + 842F75 + Innokas Group - 001677 - Bihl + Wiedemann GmbH + CC3C3F + SA.S.S. Datentechnik AG - 001655 - FUHO TECHNOLOGY Ltd + 341A4C + SHENZHEN WEIBU ELECTRONICS CO.,LTD. - 001646 - Cisco Systems Inc. + 88142B + Protonic Holland - 001648 - SSD Company Limited + 70C6AC + Bosch Automotive Aftermarket - 001672 - Zenway enterprise Ltd + 0488E2 + Beats Electronics LLC - 00165A - Harman Specialty Group + 40560C + In Home Displays Ltd - 001659 - Z.M.P. Radwag + A0861D + Chengdu Fuhuaxin Technology co.,Ltd - 0016A2 - CentraLite Systems Inc. + 508D6F + CHAHOO Limited - 001695 - AVC Technology (International) Limited + 308999 + Guangdong East Power Co., - 0015D8 - Interlink Electronics + A47ACF + VIBICOM COMMUNICATIONS INC. - 0015D4 - Emitor AB + BC261D + HONG KONG TECON TECHNOLOGY - 0015D5 - Nicevt + 204C6D + Hugo Brennenstuhl Gmbh & Co. KG. - 00160C - LPL Development S.A. de C.V + 7C0507 + PEGATRON CORPORATION - 00160B - TVWorks LLC + 880905 + MTMCommunications - 001603 - CoOLKSKY Ltd + F4B381 + WindowMaster A/S - 0015EA - Tellumat (Pty) Ltd + 74F102 + Beijing HCHCOM Technology Co., Ltd - 0015E2 - Dr.Ing. Herbert Knauer GmbH + F0F260 + Mobitec AB - 0015E1 - Picochip Ltd + 282CB2 + TP-LINK TECHNOLOGIES CO.,LTD. - 0015DF - Clivet S.p.A. + 64E599 + EFM Networks - 00161D - Innovative Wireless Technologies Inc. + 40C4D6 + ChongQing Camyu Technology Development Co.,Ltd. - 001611 - Altecon Srl + A8294C + Precision Optical Transceivers, Inc. - 001609 - Unitech electronics Ltd + 30D46A + Autosales Incorporated - 0015F5 - Sustainable Energy Systems + E8DE27 + TP-LINK TECHNOLOGIES CO.,LTD. - 0015F1 - KYLINK Communications Corp. + C89346 + MXCHIP Company Limited - 001623 - Interval Media + 94ACCA + trivum technologies GmbH - 001619 - Lancelan Technologies S.L. + 908260 + IEEE 1904.1 Working Group - 001625 - Impinj Inc. + D4EE07 + HIWIFI Co., Ltd. - 001586 - Xiamen Overseas Chinese Electronic Ltd + FCAD0F + QTS NETWORKS - 00157E - Weidmuller Interface GmbH & Co. KG + 984C04 + Zhangzhou Keneng Electrical Equipment Co Ltd - 001580 - U-WAY Corporation + ACDBDA + Shenzhen Geniatech Inc, Ltd - 00157C - Dave Networks Inc. + A4E991 + SISTEMAS AUDIOVISUALES ITELSIS S.L. - 00157F - ChuanG International Holding Ltd + 3C86A8 + Sangshin elecom .co,, LTD - 0015B3 - Caretech AB + 84F493 + OMS spol. s.r.o. - 0015AA - Rextechnik International + BCD177 + TP-LINK TECHNOLOGIES CO.,LTD. - 0015A6 - Digital Electronics Products Ltd + 7CD762 + Freestyle Technology Pty Ltd - 00159D - Tripp Lite + 901D27 + zte corporation - 0015D6 - OSLiNK Sp. z o.o. + F05DC8 + Duracell Powermat - 001592 - Facom UK Ltd (Melksham) + CC5D57 + Information System Research Institute,Inc. - 00158B - Park Air Systems Ltd + 081DFB + Shanghai Mexon Communication Technology Co.,Ltd - 001576 - LABiTec - Labor Biomedical Technologies GmbH + C44EAC + Shenzhen Shiningworth Technology Co., Ltd. - 0015BE - Iqua Ltd + 044CEF + Fujian Sanao Technology Co.,Ltd - 0015C7 - Cisco Systems Inc. + 4C804F + Armstrong Monitoring Corp - 00155E - Morgan Stanley + 64C667 + Barnes&Noble - 00150B - Sage Infotech Ltd + 103DEA + HFC Technology (Beijing) Ltd. Co. - 001507 - Renaissance Learning Inc + D42751 + Infopia Co., Ltd - 001508 - Global Target Enterprise Inc + 68A40E + BSH Hausgeräte GmbH - 001502 - BETA tech + 4CCA53 + Skyera, Inc. - 0014FD - Thecus Technology Corp. + 90FF79 + Metro Ethernet Forum - 0014FC - Extandon Inc. + D4CA6E + u-blox AG - 0014F8 - Scientific Atlanta + B01408 + LIGHTSPEED INTERNATIONAL CO. - 0014F7 - CREVIS Ltd + 9C3178 + Foshan Huadian Intelligent Communications Teachnologies Co.,Ltd - 001515 - Leipold+Co.GmbH + 983F9F + China SSJ (Suzhou) Network Technology Inc. - 00150F - mingjong + B838CA + Kyokko Tsushin System CO.,LTD - 00155C - Dresser Wayne + B0C95B + Beijing Symtech CO.,LTD - 001559 - Securaplane Technologies Inc. + 38B5BD + E.G.O. Elektro-Ger - 001557 - Olivetti + 5C43D2 + HAZEMEYER - 001554 - Atalum Wireless S.A. + D809C3 + Cercacor Labs - 00153B - EMH metering GmbH & Co. KG + 2CE871 + Alert Metalguard ApS - 001537 - Ventus Networks + F87B62 + FASTWEL INTERNATIONAL CO., LTD. Taiwan Branch - 001533 - Nadam Ltd + 40270B + Mobileeco Co., Ltd - 001534 - A Beltronica-Companhia de Comunicacoes, Lda + E4EEFD + MR&D Manufacturing - 00153F - Alcatel Alenia Space Italia + 105CBF + DuroByte Inc - 001518 - Shenzhen 10MOONS Technology Development Ltd + 20918A + PROFALUX - 001526 - Remote Technologies Inc + A80180 + IMAGO Technologies GmbH - 0014F1 - Cisco Systems Inc. + 0C5521 + Axiros GmbH - 0014EA - S Digm Inc. (Safe Paradigm Inc.) + 7898FD + Q9 Networks Inc. - 0014E5 - Alticast + D063B4 + SolidRun Ltd. - 00149F - System and Chips Inc. + 2C441B + Spectrum Medical Limited - 0014B3 - CoreStar International Corp + E4E409 + LEIFHEIT AG - 0014B1 - Axell Wireless Limited + 68B8D9 + Act KDE, Inc. - 0014E0 - LET'S Corporation + 90CC24 + Synaptics, Inc - 0014E2 - datacom Systems Inc. + C88A83 + Dongguan HuaHong Electronics Co.,Ltd - 0014E4 - Infinias LLC + 8CC5E1 + ShenZhen Konka Telecommunication Technology Co.,Ltd - 0014CC - Zetec Inc. + 64A341 + Wonderlan (Beijing) Technology Co., Ltd. - 0014CB - LifeSync Corporation + 74FE48 + ADVANTECH CO., LTD. - 0014C6 - Quixant Ltd + 80B95C + ELFTECH Co., Ltd. - 001498 - Viking Design Technology + A01917 + Bertel S.p.a. - 001496 - Phonic Corp. + A46E79 + DFT System Co.Ltd - 001493 - Systimax Solutions + B877C3 + METER Group - 0014DB - Elma Trenew Electronic GmbH + 004D32 + Andon Health Co.,Ltd. - 00143A - Raytalk International SRL + FCA9B0 + MIARTECH (SHANGHAI),INC. - 001436 - Qwerty Elektronik AB + 9C8D1A + INTEG process group inc - 00146B - Anagran Inc. + 480362 + DESAY ELECTRONICS(HUIZHOU)CO.,LTD - 001461 - Corona Corporation + 18673F + Hanover Displays Limited - 001462 - Digiwell Technology Inc. + 7C0A50 + J-MEX Inc. - 001463 - Idcs N.V. + 40F2E9 + IBM - 001465 - Novo Nordisk A/S + 744D79 + Arrive Systems Inc. - 001474 - K40 Electronics + 5011EB + SilverNet Ltd - 00146F - Kohler Co + 54DF63 + Intrakey technologies GmbH - 001466 - Kleinhenz Elektronik GmbH + D493A0 + Fidelix Oy - 00147F - Thomson Telecom Belgium + 08EBED + World Elite Technology Co.,LTD - 001475 - Wiline Networks Inc. + EC4993 + Qihan Technology Co., Ltd - 001486 - Echo Digital Audio Corporation + B0ACFA + FUJITSU LIMITED - 001482 - Aurora Networks + 8CE081 + zte corporation - 001455 - Coder Electronics Corporation + 3C83B5 + Advance Vision Electronics Co. Ltd. - 00144E - Srisa + 28A192 + GERP Solution - 00148D - Cubic Defense Simulation Systems + 9C541C + Shenzhen My-power Technology Co.,Ltd - 00143D - Aevoe Inc. + 8C3330 + EmFirst Co., Ltd. - 001415 - Intec Automation Inc. + 087BAA + SVYAZKOMPLEKTSERVICE, LLC - 001410 - Suzhou Keda Technology Ltd + C44567 + SAMBON PRECISON and ELECTRONICS - 001417 - RSE Informations Technologie GmbH + E45614 + Suttle Apparatus - 001433 - Empower Technologies(Canada) Inc. + A44E2D + Adaptive Wireless Solutions, LLC - 001434 - Keri Systems Inc. + 0CCDFB + EDIC Systems Inc. - 0013DE - Adapt4 LLC + 9C0473 + Tecmobile (International) Ltd. - 0013DD - Abbott Diagnostics + B01203 + Dynamics Hong Kong Limited - 0013D7 - SPIDCOM Technologies SA + 9886B1 + Flyaudio corporation (China) - 0013C7 - IONOS Ltd + 7093F8 + Space Monkey, Inc. - 001423 - J-S Co. NEUROCOM + 28B3AB + Genmark Automation - 001425 - Galactic Computing Corp. + C4E7BE + SCSpro Co.,Ltd - 001419 - Sidsa + 58874C + LITE-ON CLEAN ENERGY TECHNOLOGY CORP. - 0013EE - JBX Designs Inc. + 2891D0 + Stage Tec Entwicklungsgesellschaft für professionelle Audiotechnik mbH - 0013E5 - Tenosys Inc. + C0BD42 + ZPA Smart Energy a.s. - 0013E2 - GeoVision Inc. + 2074CF + Shenzhen Voxtech Co.,Ltd - 001402 - kk-electronic a/s + FC52CE + Control iD - 0013FF - Dage-MTI Of MC Inc. + 5C4A26 + Enguity Technology Corp - 0013BC - Artimi Ltd + D8D27C + JEMA ENERGY, SA - 001408 - Eka Systems Inc. + E0F5CA + CHENG UEI PRECISION INDUSTRY CO.,LTD. - 0013A7 - Battelle Memorial Institute + A8EF26 + Tritonwave - 0013A6 - Extricom Ltd + 60F2EF + VisionVera International Co., Ltd. - 0013A2 - MaxStream Inc. + C03F2A + Biscotti, Inc. - 00139F - Electronics Design Services Ltd + 381C4A + SIMCom Wireless Solutions Co.,Ltd. - 0013A0 - ALGOSYSTEM Ltd + 48F8B3 + Cisco-Linksys, LLC - 00139B - ioIMAGE Ltd + B4DFFA + Litemax Electronics Inc. - 001396 - Acbel Polytech Inc. + 681CA2 + Rosewill Inc. - 001393 - Panta Systems Inc. + 604616 + XIAMEN VANN INTELLIGENT CO., LTD - 00138B - Phantom Technologies LLC + 749975 + IBM Corporation - 001388 - WiMedia Alliance + D8C691 + Hichan Technology Corp. - 00136E - Techmetro Corp. + E43FA2 + Wuxi DSP Technologies Inc. - 00136D - Tentaculus AB + F4B72A + TIME INTERCONNECT LTD - 00136A - Hach Lange Sarl + DC9FA4 + Nokia Corporation - 0013B2 - Carallon Limited + 44C39B + OOO RUBEZH NPO - 0013AD - Sendo Ltd + 6C40C6 + Nimbus Data, Inc. - 0013AA - ALS & TEC Ltd + 1048B1 + Beijing Duokan Technology Limited - 0013A4 - KeyEye Communications + 106FEF + Ad-Sol Nissin Corp - 00134D - Inepro BV + 2C625A + Finest Security Systems Co., Ltd - 00134B - ToGoldenNet Technology Inc. + 20DC93 + Cheetah Hi-Tech, Inc. - 001384 - Advanced Motion Controls + 4423AA + Farmage Co., Ltd. - 00137B - Movon Corporation + 7CFE28 + Salutron Inc. - 001353 - HYDAC Filtertechnik GmbH + E8102E + Really Simple Software, Inc - 001363 - Verascape Inc. + 0C565C + HyBroad Vision (Hong Kong) Technology Co Ltd - 001303 - GateConnect + 8C6AE4 + Viogem Limited - 001304 - Flaircomm Technologies Ltd + 64517E + LONG BEN (DONGGUAN) ELECTRONIC TECHNOLOGY CO.,LTD. - 0012F9 - Uryu Seisaku Ltd + D43D7E + Micro-Star Int'l Co, Ltd - 0012F3 - ConnectBlue AB + ACD9D6 + tci GmbH - 001337 - Orient Power Home Network Ltd + 48282F + zte corporation - 001334 - Arkados Inc. + 88DC96 + EnGenius Technologies, Inc. - 001332 - Beijing Topsec Network Security Technology Ltd + 20443A + Schneider Electric Asia Pacific Ltd - 00131F - NxtPhase T&D, Corp. + ECA29B + Kemppi Oy - 0012DC - SunCorp Industrial Limited + C4BA99 + I+ME Actia Informatik und Mikro-Elektronik GmbH - 0012FF - Lely Industries N.V. + 04CE14 + Wilocity LTD. - 00133A - VadaTech Inc. + 543968 + Edgewater Networks Inc - 00132A - Sitronics Telecom Solutions + 440CFD + NetMan Co., Ltd. - 0012E5 - Time America Inc. + 8CD3A2 + VisSim AS - 00130E - Focusrite Audio Engineering Limited + 14358B + Mediabridge Products, LLC. - 001309 - Ocean Broadband Networks + 00F403 + Orbis Systems Oy - 001319 - Cisco Systems Inc. + 547398 + Toyo Electronics Corporation - 00131C - LiteTouch Inc. + C4393A + SMC Networks Inc - 00134A - Engim Inc. + E8D483 + ULTIMATE Europe Transportation Equipment GmbH - 0012D7 - Invento Networks Inc. + 1C8464 + FORMOSA WIRELESS COMMUNICATION CORP. - 0012C4 - Viseon Inc. + EC9327 + MEMMERT GmbH + Co. KG - 001294 - Sumitomo Electric Device Innovations Inc. + A0EF84 + Seine Image Int'l Co., Ltd - 001296 - Addlogix + E0A30F + Pevco - 0012B3 - Advance Wireless Technology Corp. + 5C2479 + Baltech AG - 0012B0 - Efore Oyj (Plc) + D82DE1 + Tricascade Inc. - 00127F - Cisco Systems Inc. + D0D212 + K2NET Co.,Ltd. - 0012A6 - Dolby Australia + 80D18B + Hangzhou I'converge Technology Co.,Ltd - 0012A4 - ThingMagic LLC + 4088E0 + Beijing Ereneben Information Technology Limited Shenzhen Branch - 0012A9 - 3Com Corporation + E85484 + NEO Information Systems Co., Ltd. - 0012D0 - Gossen-Metrawatt-GmbH + 74AE76 + iNovo Broadband, Inc. - 001299 - Ktech Telecommunications Inc + 709A0B + Italian Institute of Technology - 00128C - Woodward Governor + 346E8A + Ecosense - 0012B8 - G2 Microsystems + 64F242 + Gerdes Aktiengesellschaft - 00127B - VIA Networking Technologies Inc. + 60F281 + TRANWO TECHNOLOGY CO., LTD. - 001280 - Cisco Systems Inc. + 0CC0C0 + MAGNETI MARELLI SISTEMAS ELECTRONICOS MEXICO - 001275 - Sentilla Corporation + 08379C + Topaz Co. LTD. - 001276 - CG Power Systems Ireland Limited + D80DE3 + FXI TECHNOLOGIES AS - 001271 - Measurement Computing Corp + 60CBFB + AirScape Inc. - 001273 - Stoke Inc + 7C160D + Saia-Burgess Controls AG - 001269 - Value Electronics + A497BB + Hitachi Industrial Equipment Systems Co.,Ltd - 001250 - Tokyo Aircaft Instrument Ltd + 4C5427 + Linepro Sp. z o.o. - 001252 - Citronix LLC + EC1A59 + Belkin International Inc. - 001240 - Amoi Electronics Ltd + 881036 + Panodic(ShenZhen) Electronics Limted - 00122E - Signal Technology - AISD + 68B6FC + Hitron Technologies. Inc - 001264 - daum electronic GmbH + 942197 + Stalmart Technology Limited - 001261 - Adaptix Inc. + A0C3DE + Triton Electronic Systems Ltd. - 001260 - Stanton Magnetics,Inc. + D0699E + LUMINEX Lighting Control Equipment - 001231 - Motion Control Systems Inc. + B0D2F5 + Vello Systems, Inc. - 00124B - Texas Instruments + 0808EA + AMSC - 00124A - Dedicated Devices Inc. + A4934C + Cisco Systems, Inc - 001243 - Cisco Systems Inc. + F0FDA0 + Acurix Networks Pty Ltd - 0011D9 - TiVo + B45570 + Borea - 0011D2 - Perception Digital Ltd + 5057A8 + Cisco Systems, Inc - 0011CF - Thrane & Thrane A/S + 00DEFB + Cisco Systems, Inc - 0011D4 - NetEnrich Inc. + 3CA315 + Bless Information & Communications Co., Ltd - 0011D5 - Hangzhou Sunyard System Engineering Ltd + 100D2F + Online Security Pty. Ltd. - 0011F8 - AIRAYA Corp + 3C98BF + Quest Controls, Inc. - 0011F4 - woori-net + D0AEEC + Alpha Networks Inc. - 0011F6 - Asia Pacific Microsystems Inc. + E477D4 + Minrray Industry Co.,Ltd - 0011F0 - Wideful Limited + 38E08E + Mitsubishi Electric Corporation - 0011F1 - QinetiQ Ltd + 10A932 + Beijing Cyber Cloud Technology Co. ,Ltd. - 0011ED - 802 Global + 34FC6F + ALCEA - 001211 - Protechna Herbst GmbH & Co. KG + C0B357 + Yoshiki Electronics Industry Ltd. - 001219 - General Datacomm LLC + A81758 + Elektronik System i Umeå AB - 001216 - ICP Internet Communication Payment AG + E81324 + GuangZhou Bonsoninfo System CO.,LTD - 001215 - iStor Networks Inc. + 142DF5 + Amphitech - 001203 - ActivNetworks + F83094 + Alcatel-Lucent Telecom Limited - 0011CC - Guangzhou Jinpeng Group Ltd + C495A2 + SHENZHEN WEIJIU INDUSTRY AND TRADE DEVELOPMENT CO., LTD - 0011C7 - Raymarine UK Ltd + 8C6878 + Nortek-AS - 0011C9 - MTT Corporation + 202598 + Teleview - 0011DB - Land-Cellular Corporation + 38F8B7 + V2COM PARTICIPACOES S.A. - 001224 - NexQL Corporation + A04CC1 + Helixtech Corp. - 0011BD - Bombardier Transportation + 34A7BA + Fischer International Systems Corporation - 0011AA - Uniclass Technology Ltd + F8D462 + Pumatronix Equipamentos Eletronicos Ltda. - 001179 - Singular Technology Ltd + A0DC04 + Becker-Antriebe GmbH - 00118A - Viewtran Technology Limited + 40605A + Hawkeye Tech Co. Ltd - 001184 - Humo Laboratory Ltd + 5453ED + Sony Corporation - 0011B1 - BlueExpert Technology Corp. + F473CA + Conversion Sound Inc. - 0011A6 - Sypixx Networks + F8F7FF + SYN-TECH SYSTEMS INC - 0011B5 - Shenzhen Powercom Ltd + E4C806 + Ceiec Electric Technology Inc. - 0011BB - Cisco Systems Inc. + E0F9BE + Cloudena Corp. - 001166 - Taelim Electronics Ltd + 08B4CF + Abicom International - 001164 - ACARD Technology Corp. + 7C94B2 + Philips Healthcare PCCI - 0011A2 - Manufacturing Technology Inc + 442B03 + Cisco Systems, Inc - 00119E - Solectron Brazil + B88F14 + Analytica GmbH - 001173 - SMART Storage Systems + 60E956 + Ayla Networks, Inc - 001125 - IBM Corp + EC1120 + FloDesign Wind Turbine Corporation - 00111C - Pleora Technologies Inc. + E86D6E + voestalpine Signaling UK Ltd. - 00111F - Doremi Labs Inc. + 681605 + Systems And Electronic Development FZCO - 00111D - Hectrix Limited + 882012 + LMI Technologies - 001119 - Solteras Inc. + 3C4E47 + Etronic A/S - 001150 - Belkin Corporation + F48771 + Infoblox - 001146 - Telecard-Pribor Ltd + F897CF + DAESHIN-INFORMATION TECHNOLOGY CO., LTD. - 00110D - SANBlaze Technology Inc. + B49EE6 + SHENZHEN TECHNOLOGY CO LTD - 001106 - Siemens NV (Belgium) + BC4B79 + SensingTek - 000FF4 - Guntermann & Drunck GmbH + A49005 + CHINA GREATWALL COMPUTER SHENZHEN CO.,LTD - 000FF8 - Cisco Systems Inc. + C40ACB + Cisco Systems, Inc - 00112C - IZT GmbH + D4A02A + Cisco Systems, Inc - 00110E - Tsurusaki Sealand Transportation Ltd + 88C36E + Beijing Ereneben lnformation Technology Limited - 00114C - caffeina applied research Ltd + 645422 + Equinox Payments - 001141 - GoodMan Corporation + 00376D + Murata Manufacturing Co., Ltd. - 001155 - Sevis Systems + 50008C + Hong Kong Telecommunications (HKT) Limited - 001152 - Eidsvoll Electronics AS + 34AA99 + Nokia - 000FCF - DataWind Research + 24B88C + Crenus Co.,Ltd. - 000FD2 - EWA Technologies Inc. + 4C9E80 + KYOKKO ELECTRIC Co., Ltd. - 000FCE - Kikusui Electronics Corp. + 5CEB4E + R. STAHL HMI Systems GmbH - 000FEB - Cylon Controls + 943AF0 + Nokia Corporation - 000FDC - Ueda Japan Radio Ltd + 0463E0 + Nome Oy - 000F8E - Dongyang Telecom Ltd + 940B2D + NetView Technologies(Shenzhen) Co., Ltd - 000F91 - Aerotelecom Ltd + 306E5C + Validus Technologies - 000F87 - Maxcess International + C894D2 + Jiangsu Datang Electronic Products Co., Ltd - 000FA1 - Gigabit Systems Inc. + BCFE8C + Altronic, LLC - 000F99 - APAC opto Electronics Inc. + 649EF3 + Cisco Systems, Inc - 000FF5 - GN&S Company + 24BBC1 + Absolute Analysis - 000FE8 - Lobos Inc. + 9CCAD9 + Nokia Corporation - 000FB2 - Broadband Pacenet (India) Pvt Ltd + 046D42 + Bryston Ltd. - 000FD7 - Harman Music Group + D8E743 + Wush, Inc - 000FD4 - Soundcraft + 80946C + TOKYO RADAR CORPORATION - 000FAF - Dialog Inc. + 3CE624 + LG Display - 000FA5 - BWA Technology GmbH + D8F0F2 + Zeebo Inc - 000F80 - Trinity Security Systems,Inc. + 644D70 + dSPACE GmbH - 000F2A - Cableware Electronics + D0CF5E + Energy Micro AS - 000F29 - Augmentix Corporation + DCC101 + SOLiD Technologies, Inc. - 000F27 - TEAL Electronics Inc. + 080D84 + GECO, Inc. - 000F43 - Wasabi Systems Inc. + 88E712 + Whirlpool Corporation - 000F48 - Polypix Inc. + D412BB + Quadrant Components Inc. Ltd - 000F50 - StreamScale Limited + 806007 + RIM - 000F4E - Cellink + 94E0D0 + HealthStream Taiwan Inc. - 000F47 - Robox SPA + DCF858 + Lorent Networks, Inc. - 000F18 - Industrial Control Systems + 1803FA + IBT Interfaces - 000F1D - Cosmo Techs Ltd + D8052E + Skyviia Corporation - 000F1B - Ego Systems Inc. + 183825 + Wuhan Lingjiu High-tech Co.,Ltd. - 000F78 - Datacap Systems Inc + 7C4B78 + Red Sun Synthesis Pte Ltd - 000F70 - Wintec Industries Inc. + 64A0E7 + Cisco Systems, Inc - 000F74 - Qamcom Technology AB + EC6264 + Global411 Internet Services, LLC - 000F6D - Midas Engineering + 00F051 + KWB Gmbh - 000F5F - Nicety Technologies Inc. (NTS) + CCEF48 + Cisco Systems, Inc - 000F5A - Peribit Networks + 2437EF + EMC Electronic Media Communication SA - 000F31 - Allied Vision Technologies Canada Inc + 28B0CC + Xenya d.o.o. - 000F73 - RS Automation Ltd + 205B5E + Shenzhen Wonhe Technology Co., Ltd - 000F3C - Endeleo Limited + B0E50E + NRG SYSTEMS INC - 000EAB - Cray Inc + 48C1AC + PLANTRONICS, INC. - 000EAD - Metanoia Technologies Inc. + 98588A + SYSGRATION Ltd. - 000EAF - Castel + 94319B + Alphatronics BV - 000EF8 - SBC ASI + E878A1 + BEOVIEW INTERCOM DOO - 000EF9 - REA Elektronik GmbH + 803F5D + Winstars Technology Ltd - 000EE6 - Adimos Systems Ltd + 40BF17 + Digistar Telecom. SA - 000EF6 - E-TEN Information Systems Ltd + 780738 + Z.U.K. Elzab S.A. - 000EEA - Shadong Luneng Jicheng Electronics Ltd + 2037BC + Kuipers Electronic Engineering BV - 000F0F - Real ID Technology Ltd + C8A620 + Nebula, Inc - 000F16 - JAY HOW Technology + FC946C + UBIVELOX - 000EC6 - Asix Electronics Corp. + 407B1B + Mettle Networks Inc. - 000EBF - Remsdaq Limited + 489BE2 + SCI Innovations Ltd - 000EFF - Megasolution,Inc. + 80FFA8 + UNIDIS - 000EE0 - Mcharge + 40D559 + MICRO S.E.R.I. - 000E9F - TEMIC SDS GmbH + 306CBE + Skymotion Technology (HK) Limited - 000E96 - Cubic Defense Applications Inc. + 886B76 + CHINA HOPEFUL GROUP HOPEFUL ELECTRIC CO.,LTD - 000E8E - SparkLAN Communications Inc. + 78F7D0 + Silverbrook Research - 000E91 - Navico Auckland Ltd + 207600 + Actiontec Electronics, Inc - 000E48 - Lipman TransAction Solutions + F04B6A + Scientific Production Association Siberian Arsenal, Ltd. - 000E3E - Sun Optronics Inc + 64AE0C + Cisco Systems, Inc - 000E33 - Shuko Electronics Ltd + 00E175 + AK-Systems Ltd - 000E75 - New York Air Brake Corp. + CC501C + KVH Industries, Inc. - 000E7C - Televes S.A. + 04D783 + Y&H E&C Co.,LTD. - 000E66 - Hitachi Industry & Control Solutions Ltd + C83B45 + JRI - 000E68 - E-TOP Network Technology Inc. + C058A7 + Pico Systems Co., Ltd. - 000E5E - Raisecom Technology + EC3F05 + Institute 706, The Second Academy China Aerospace Science & Industry Corp - 000E56 - 4G Systems GmbH & Co. KG + E8DA96 + Zhuhai Tianrui Electrical Power Tech. Co., Ltd. - 000E55 - Auvitran + F013C3 + SHENZHEN FENDA TECHNOLOGY CO., LTD - 000E73 - Tpack A/S + 04A82A + Nokia Corporation - 000E72 - CTS electronics + E44E18 + Gardasoft VisionLimited - 000E6E - MAT S.A. (Mircrelec Advanced Technology) + 148A70 + ADS GmbH - 000E84 - Cisco Systems Inc. + B4D8DE + iota Computing, Inc. - 000E87 - adp Gauselmann GmbH + C8903E + Pakton Technologies - 000E92 - Open Telecom + DC2E6A + HCT. Co., Ltd. - 000E53 - AV Tech Corporation + 2046A1 + VECOW Co., Ltd - 000DF9 - NDS Limited + FC01CD + FUNDACION TEKNIKER - 000DFD - Huges Hi-Tech Inc., + 9C8BF1 + The Warehouse Limited - 000DFB - Komax AG + 00B338 + Kontron Asia Pacific Design Sdn. Bhd - 000E00 - Atrie + E435FB + Sabre Technology (Hull) Ltd - 000DF4 - Watertek Co. + F0022B + Chrontel - 000DFA - Micro Control Systems Ltd + B8288B + Parker Hannifin Manufacturing (UK) Ltd - 000DFC - ITFOR Inc. + 90D11B + Palomar Medical Technologies - 000DFE - Hauppauge Computer Works Inc. + A06E50 + Nanotek Elektronik Sistemler Ltd. Sti. - 000DD6 - ITI Ltd + 84248D + Zebra Technologies Inc - 000DD5 - O'Rite Technology Ltd + FCE892 + Hangzhou Lancable Technology Co.,Ltd - 000E0F - Ermme + 34A55D + TECHNOSOFT INTERNATIONAL SRL - 000E10 - C-guys Inc. + 4C774F + Embedded Wireless Labs - 000E0A - Sakuma Design Office + ECBD09 + FUSION Electronics Ltd - 000E0E - ESA elettronica S.P.A. + 944696 + BaudTec Corporation - 000E18 - MyA Technology + 54847B + Digital Devices GmbH - 000E14 - Visionary Solutions Inc. + 843F4E + Tri-Tech Manufacturing, Inc. - 000E1B - IAV GmbH + C83232 + Hunting Innova - 000E13 - Accu-Sort Systems Inc. + D453AF + VIGO System S.A. - 000DDE - Joyteck Ltd + 18AD4D + Polostar Technology Corporation - 000DE2 - CMZ Sistemi Elettronici + 1071F9 + Cloud Telecomputers, LLC - 000DDA - Allied Telesis K.K. + B8621F + Cisco Systems, Inc - 000DCD - Groupe Txcom + 94C6EB + NOVA electronics, Inc. - 000DCA - Tait Electronics + 549478 + Silvershore Technology Partners - 000DCF - Cidra Corp. + 54CDA7 + Fujian Shenzhou Electronic Co.,Ltd - 000E3A - Cirrus Logic + 3C2763 + SLE quality engineering GmbH & Co. KG - 000E3B - Hawking Technologies Inc. + B0F1BC + Dhemax Ingenieros Ltda - 000DEC - Cisco Systems Inc. + 508ACB + SHENZHEN MAXMADE TECHNOLOGY CO., LTD. - 000DF2 - Private + D0C282 + Cisco Systems, Inc - 000E27 - Crere Networks Inc. + 147DB3 + JOA TELECOM.CO.,LTD - 000DA0 - Nedap N.V. + 3CD16E + Telepower Communication Co., Ltd - 000D8E - Koden Electronics Ltd + 40040C + A&T - 000D8A - Winners Electronics Ltd + 948FEE + Verizon Telematics - 000D7E - Axiowave Networks Inc. + 50D6D7 + Takahata Precision - 000D71 - boca Systems + 00FC70 + Intrepid Control Systems, Inc. - 000D5A - Tiesse SpA + 704AAE + Xstream Flow (Pty) Ltd - 000DB8 - Schiller AG + 40B3FC + Logital Co. Limited - 000DC4 - Emcore Corporation + DC3C84 + Ticom Geomatics, Inc. - 000D9B - Heraeus Electro-Nite International N.V. + D0131E + Sunrex Technology Corp - 000D7C - Codian Ltd + C40F09 + Hermes electronic GmbH - 000D6B - Mita-Teknik A/S + 802E14 + azeti Networks AG - 000D43 - DRS Tactical Systems Inc. + D4C1FC + Nokia Corporation - 000D44 - Audio BU - Logitech + 34BCA6 + Beijing Ding Qing Technology, Ltd. - 000D36 - Wu Han Routon Electronic Ltd + 5835D9 + Cisco Systems, Inc - 000D3D - Hammerhead Systems Inc. + 64D912 + Solidica, Inc. - 000D3E - APLUX Communications Ltd + C47B2F + Beijing JoinHope Image Technology Ltd. - 000D0D - ITSupported LLC + FC2E2D + Lorom Industrial Co.LTD. - 000D06 - Compulogic Limited + 587521 + CJSC RTSoft - 000D4A - Steag ETA-Optik + 18E288 + STT Condigi - 000D4F - Kenwood Corporation + B435F7 + Zhejiang Pearmain Electronics Co.ltd. - 000D47 - Collex + 9866EA + Industrial Control Communications, Inc. - 000D61 - Giga-Byte Technology Ltd + 983000 + Beijing KEMACOM Technologies Co., Ltd. - 000D3B - Microelectronics Technology Inc. + 90CF15 + Nokia Corporation - 000D2D - NCT Deutschland GmbH + F081AF + IRZ AUTOMATION TECHNOLOGIES LTD - 000D1E - Control Techniques + 701404 + Limited Liability Company - 000D52 - Comart System + 1C35F1 + NEW Lift Neue Elektronische Wege Steuerungsbau GmbH - 000D1A - Mustek System Inc. + 803457 + OT Systems Limited - 000CB8 - Medion AG + B09928 + FUJITSU LIMITED - 000CBB - Iskraemeco + 04E1C8 + IMS Soluções em Energia Ltda. - 000CC0 - Genera Oy + 948B03 + EAGET Innovation and Technology Co., Ltd. - 000CA8 - Garuda Networks Corporation + 48F47D + TechVision Holding Internation Limited - 000D03 - Matrics Inc. + 703AD8 + Shenzhen Afoundry Electronic Co., Ltd - 000CFF - MRO-TEK Realty Limited + 88F077 + Cisco Systems, Inc - 000CFA - Digital Systems Corp + 2C0033 + EControls, LLC - 000CFD - Hyundai ImageQuest Ltd + AC199F + SUNGROW POWER SUPPLY CO.,LTD. - 000CD3 - Prettl Elektronik Radeberg GmbH + 7C4A82 + Portsmith LLC - 000CD7 - Nallatech Ltd + AC5E8C + Utillink - 000CD4 - Positron Public Safety Systems Inc. + 94E848 + FYLDE MICRO LTD - 000CD6 - Partner Tech + 94AAB8 + Joview(Beijing) Technology Co. Ltd. - 000CB9 - LEA + 28F358 + 2C - Trifonov & Co - 000CBD - Interface Masters Inc. + 301A28 + Mako Networks Ltd - 000CB2 - UNION Ltd + 3831AC + WEG - 000CEB - CNMP Networks Inc. + 584C19 + Chongqing Guohong Technology Development Company Limited - 000CCC - Aeroscout Ltd + 3CA72B + MRV Communications (Networks) LTD - 000CC7 - Intelligent Computer Solutions Inc. + 285132 + Shenzhen Prayfly Technology Co.,Ltd - 000CBE - Innominate Security Technologies AG + E42FF6 + Unicore communication Inc. - 000CA7 - Metro (Suzhou) Technologies Ltd + 84D9C8 + Unipattern Co., - 000CEF - Open Networks Engineering Ltd + B80B9D + ROPEX Industrie-Elektronik GmbH - 000C64 - X2 MSA Group + 5070E5 + He Shan World Fair Electronics Technology Limited - 000CA0 - StorCase Technology Inc. + 802275 + Beijing Beny Wave Technology Co Ltd - 000C99 - HITEL LINK Ltd + 24C86E + Chaney Instrument Co. - 000C5A - IBSmm Embedded Electronics Consulting + F0AE51 + Xi3 Corp - 000C5E - Calypso Medical + 14F0C5 + Xtremio Ltd. - 000C61 - AC Tech Corporation DBA Advanced Digital + E8C229 + H-Displays (MSC) Bhd - 000C5F - Avtec Inc. + 5C0CBB + CELIZION Inc. - 000C4B - Cheops Elektronik + 306118 + Paradom Inc. - 000C45 - Animation Technologies Inc. + 4C7367 + Genius Bytes Software Solutions GmbH - 000C3C - MediaChorus Inc. + 90EA60 + SPI Lasers Ltd - 000C7C - Internet Information Image Inc. + C4242E + Galvanic Applied Sciences Inc - 000C7B - ALPHA PROJECT Ltd + F8EA0A + Dipl.-Math. Michael Rauch - 000C77 - Life Racing Ltd + CCF3A5 + Chi Mei Communication Systems, Inc - 000C69 - National Radio Astronomy Observatory + 14A9E3 + MST CORPORATION - 000C66 - Pronto Networks Inc + 14B73D + ARCHEAN Technologies - 000C88 - Apache Micro Peripherals Inc. + 948D50 + Beamex Oy Ab - 000C82 - Network Technologies Inc + A433D1 + Fibrlink Communications Co.,Ltd. - 000C8D - MATRIX VISION GmbH + 6469BC + Hytera Communications Co .,ltd - 000C89 - AC Electric Vehicles Ltd + B4F323 + PETATEL INC. - 000C4E - Winbest Technology Co,LT + 14C21D + Sabtech Industries - 000BFE - CASTEL Broadband Limited + C88439 + Sunrise Technologies - 000BF5 - Shanghai Sibo Telecom Technology Ltd + F0C27C + Mianyang Netop Telecom Equipment Co.,Ltd. - 000C27 - Sammy Corporation + 283410 + Enigma Diagnostics Limited - 000C2A - OCTTEL Communication Ltd + 0CE82F + Bonfiglioli Vectron GmbH - 000C1C - MicroWeb Ltd + 40F4EC + Cisco Systems, Inc - 000BDF - Shenzhen RouterD Networks Limited + A41BC0 + Fastec Imaging Corporation - 000BE6 - Datel Electronics + 205B2A + Private - 000BF2 - Chih-Kan Technology Ltd + F40321 + BeNeXt B.V. - 000BEB - Systegra AG + A071A9 + Nokia Corporation - 000BEF - Code Corporation + A4E32E + Silicon & Software Systems Ltd. - 000C05 - RPA Reserch Ltd + 5CBD9E + HONGKONG MIRACLE EAGLE TECHNOLOGY(GROUP) LIMITED - 000C22 - Double D Electronics Ltd + F0BF97 + Sony Corporation - 000C0F - Techno-One Ltd + C44AD0 + FIREFLIES SYSTEMS - 000C38 - TelcoBridges Inc. + 88E0A0 + Shenzhen VisionSTOR Technologies Co., Ltd - 000BAF - WOOJU CoMMUNICATIONS Ltd + FC10BD + Control Sistematizado S.A. - 000BB6 - Metalligence Technology Corp. + F87B8C + Amped Wireless - 000BB3 - RiT technologies Ltd + 241A8C + Squarehead Technology AS - 000BB7 - Micro Systems Ltd + D44F80 + Kemper Digital GmbH - 000BBA - Harmonic Inc. + 08E672 + JEBSEE ELECTRONICS CO.,LTD. - 000B62 - ib-mohnen KG + B8E589 + Payter BV - 000B64 - Kieback & Peter GmbH & Co KG + EC7D9D + CPI - 000B67 - Topview Technology Corporation + C81E8E + ADV Security (S) Pte Ltd - 000B7D - Solomon Extreme International Ltd + A88792 + Broadband Antenna Tracking Systems - 000B94 - Digital Monitoring Products Inc. + 04E662 + Acroname Inc. - 000BAE - Vitals System Inc. + 64DC01 + Static Systems Group PLC - 000BD9 - General Hydrogen + 607688 + Velodyne - 000BAB - Advantech Technology (CHINA) Ltd + 78CD8E + SMC Networks Inc - 000B6D - Solectron Japan Nakaniida + C8C126 + ZPM Industria e Comercio Ltda - 000BC4 - BIOTRONIK GmbH & Co + 64DE1C + Kingnetic Pte Ltd - 000B57 - Silicon Laboratories + A862A2 + JIWUMEDIA CO., LTD. - 000B51 - Micetek International Inc. + 984E97 + Starlight Marketing (H. K.) Ltd. - 000B53 - INITIUM Ltd + 78A683 + Precidata - 000AFB - Ambri Limited + FC1FC0 + EURECAM - 000AFF - Kilchherr Elektronik AG + BC6784 + Environics Oy - 000B4A - Visimetrics (UK) Ltd + B4C44E + VXL eTech Pvt Ltd - 000B48 - sofrel + 68DCE8 + PacketStorm Communications - 000B1E - KAPPA opto-electronics GmbH + 488E42 + DIGALOG GmbH - 000B1C - SIBCO bv + 2C8065 + HARTING Inc. of North America - 000B37 - Manufacture DES Montres Rolex SA + 3CC0C6 + d&b audiotechnik GmbH - 000AF8 - American Telecare Inc. + 4468AB + JUIN COMPANY, LIMITED - 000B17 - MKS Instruments + 707EDE + NASTEC LTD. - 000B2D - Danfoss Inc. + E05FB9 + Cisco Systems, Inc - 000AA3 - Shimafuji Electric Ltd + F02572 + Cisco Systems, Inc - 000AA7 - FEI Electron Optics + 04FF51 + NOVAMEDIA INNOVISION SP. Z O.O. - 000AA6 - Hochiki Corporation + 4CB4EA + HRD (S) PTE., LTD. - 000A9A - Aiptek International Inc + D44C24 + Vuppalamritha Magnetic Components LTD - 000A94 - ShangHai cellink Ltd + 8091C0 + AgileMesh, Inc. - 000A97 - SONICblue Inc. + 084EBF + Sumitomo Electric Industries, Ltd - 000A92 - Presonus Corporation + AC02CF + RW Tecnologia Industria e Comercio Ltda - 000A85 - PLAT'C2,Inc + F8C678 + Carefusion - 000AD0 - Niigata Develoment Center, F.I.T Ltd + 6CAB4D + Digital Payment Technologies - 000AD4 - CoreBell Systems Inc. + 2CB0DF + Soliton Technologies Pvt Ltd - 000ACA - YOKOYAMA SHOKAI Ltd + ECE555 + Hirschmann Automation - 000ACE - Radiantech Inc. + 58F98E + SECUDOS GmbH - 000AC7 - Unication Group + B4749F + ASKEY COMPUTER CORP - 000ADE - Happy Communication Ltd + 7C4AA8 + MindTree Wireless PVT Ltd - 000AE2 - Binatone Electronics International Ltd + E0143E + Modoosis Inc. - 000ADB - Trilliant + C07E40 + SHENZHEN XDK COMMUNICATION EQUIPMENT CO.,LTD - 000AB8 - Cisco Systems Inc. + E44F29 + MA Lighting Technology GmbH - 000AAC - TerraTec Electronic GmbH + 1C7C11 + EID - 000ABF - Hirota SS + 48174C + MicroPower technologies - 000ABC - Seabridge Ltd + 90507B + Advanced PANMOBIL Systems GmbH & Co. KG - 000A50 - Remotek Corporation + 20AA25 + IP-NET LLC - 000A58 - Freyer & Siegel Elektronik GmbH & Co. KG + 349A0D + ZBD Displays Ltd - 000A4E - UNITEK Electronics Inc. + D41296 + Anobit Technologies Ltd. - 000A62 - Crinis Networks Inc. + 0876FF + Thomson Telecom Belgium - 000A6A - SVM Microwaves s.r.o. + 90D852 + Comtec Co., Ltd. - 000A66 - Mitsubishi Electric System & Service Ltd + 380197 + TSST Global,Inc - 000A31 - HCV Consulting + 588D09 + Cisco Systems, Inc - 004252 - RLX Technologies + C0C1C0 + Cisco-Linksys, LLC - 000A70 - MPLS Forum + 0034F1 + Radicom Research, Inc. - 000A72 - Stec Inc. + 6015C7 + IdaTech - 000A3D - Elo Sistemas Eletronicos S.A. + DC2008 + ASD Electronics Ltd - 000A46 - ARO Welding Technologies SAS + A4D1D1 + ECOtality North America - 000A71 - Avrio Technologies Inc. + C49313 + 100fio networks technology llc - 000A64 - Eracom Technologies + 68597F + Alcatel Lucent - 000A83 - Salto Systems S.L. + F065DD + Primax Electronics Ltd. - 000A86 - Lenze + 706582 + Suzhou Hanming Technologies Co., Ltd. - 000A3F - Data East Corporation + C4B512 + General Electric Digital Energy - 000A0C - Scientific Research Corporation + E02538 + Titan Pet Products - 0009F6 - Shenzhen Eastern Digital Tech Ltd + CC7A30 + CMAX Wireless Co., Ltd. - 000A20 - SVA Networks Inc. + B88E3A + Infinite Technologies JLT - 000A24 - Octave Communications + D4CBAF + Nokia Corporation - 000A19 - Valere Power Inc. + 10E8EE + PhaseSpace - 0009DE - Samjin Information & Communications Ltd + A47C1F + Cobham plc - 0009E0 - Xemics S.A. + D46CDA + CSM GmbH - 000A01 - SOHOware Inc. + 5CD998 + D-Link Corporation - 0009EC - Daktronics Inc. + 9433DD + Taco Inc - 0009EE - Meikyo Electric Ltd + E0CF2D + Gemintek Corporation - 0009CA - iMaxNetworks(Shenzhen)Limited. + C4EEF5 + II-VI Incorporated - 0009CF - iAd GmbH + D491AF + Electroacustica General Iberica, S.A. - 000A11 - ExPet Technologies Inc. + 045D56 + camtron industrial inc. - 000A0F - Ilryung Telesys Inc. + 68234B + Nihon Dengyo Kousaku - 0009E7 - ADC Techonology + A4BE61 + EutroVision System, Inc. - 000993 - Visteon Corporation + 58BC27 + Cisco Systems, Inc - 000999 - CP Georges Renault - + 34D2C4 + RENA GmbH Print Systeme + - 000994 - Cronyx Engineering + 7C3920 + SSOMA SECURITY - 0009B9 - Action Imaging Solutions + 9C77AA + NADASNV - 0009AC - Lanvoice + 1C83B0 + Linked IP GmbH - 0009B1 - Kanematsu Electronics Ltd + 1C3DE7 + Sigma Koki Co.,Ltd. - 000979 - Advanced Television Systems Committee Inc. + 8818AE + Tamron Co., Ltd - 000963 - Dominion Lasercom Inc. + 20D607 + Nokia Corporation - 000966 - Trimble Europe BV + 443D21 + Nuvolt - 0009C1 - Proces-Data A/S + 30493B + Nanjing Z-Com Wireless Co.,Ltd - 0009BB - MathStar Inc. + D07DE5 + Forward Pay Systems, Inc. - 000968 - Technoventure Inc. + 04DD4C + Velocytech - 000961 - Switchgear and Instrumentation Ltd + 6CE0B0 + SOUND4 - 00097C - Cisco Systems Inc. + 9CFFBE + OTSL Inc. - 00097B - Cisco Systems Inc. + 00F860 + PT. Panggung Electric Citrabuana - 00099D - Haliplex Communications + EC66D1 + B&W Group LTD - 00099E - Testech Inc. + 385FC3 + Yu Jeong System, Co.Ltd - 000988 - Nudian Electron Ltd + 888B5D + Storage Appliance Corporation - 00098E - ipcas GmbH + 18EF63 + Cisco Systems, Inc - 0009AB - Netcontrol Oy + 206FEC + Braemac CA LLC - 000960 - YOZAN Inc. + A45C27 + Nintendo Co., Ltd. - 000956 - Network Systems Group Ltd (NSG) + 6C0460 + RBH Access Technologies Inc. - 000900 - TMT + 706417 + ORBIS TECNOLOGIA ELECTRICA S.A. - 000901 - Shenzhen Shixuntong Information & Technoligy Co + B8BA72 + Cynove - 000913 - SystemK Corporation + 78C6BB + Analog Devices, Inc. - 00090E - Helix Technology Inc. + 100D32 + Embedian, Inc. - 00093C - Jacques Technologies P/L + 7CED8D + Microsoft - 000935 - Sandvine Incorporated + 88ACC1 + Generiton Co., Ltd. - 000936 - Ipetronik GmbH & Co. KG + EC7C74 + Justone Technologies Co., Ltd. - 000937 - Inventec Appliance Corp + A8B1D4 + Cisco Systems, Inc - 000946 - Cluster Labs GmbH + CCFCB1 + Wireless Technology, Inc. - 00093F - Double-Win Enterpirse Ltd + 3C1A79 + Huayuan Technology CO.,LTD - 000948 - Vista Control Systems, Corp. + C802A6 + Beijing Newmine Technology - 000949 - Glyph Technologies Inc. + C84C75 + Cisco Systems, Inc - 00092A - MYTECS Ltd + 4C8B55 + Grupo Digicon - 000925 - VSN Systemen BV + 04A3F3 + Emicon - 0008E0 - ATO Technology Ltd + 1C17D3 + Cisco Systems, Inc - 0008E4 - Envenergy Inc + 7CE044 + NEON Inc - 0008E3 - Cisco Systems Inc. + 284C53 + Intune Networks - 0008E5 - IDK Corporation + 64D02D + NEXT GENERATION INTEGRATION LIMITED (NGI) - 0008D9 - Mitadenshi Ltd + 68784C + Nortel Networks - 000891 - Lyan Inc. + 9CF61A + Carrier Fire & Security - 000892 - EM Solutions + 7CF098 + Bee Beans Technologies, Inc. - 00088C - Quanta Network Systems Inc. + 8841C1 + ORBISAT DA AMAZONIA IND E AEROL SA - 00088A - Minds@Work + 9C7514 + Wildix srl - 0008FD - BlueKorea Ltd + 4CF737 + SamJi Electronics Co., Ltd - 0008F8 - UTC CCS + F0D767 + Axema Passagekontroll AB - 0008D5 - Vanguard Networks Solutions LLC + 84A991 + Cyber Trans Japan Co.,Ltd. - 0008CD - With-Net Inc + F8D756 + Simm Tronic Limited - 0008CC - Remotec Inc. + A40CC3 + Cisco Systems, Inc - 0008D1 - Karel Inc. + 4CBAA3 + Bison Electronics Inc. - 0008A7 - iLogic Inc. + 90513F + Elettronica Santerno SpA - 000899 - Netbind Inc. + 00B5D6 + Omnibit Inc. - 0008A0 - Stotz Feinmesstechnik GmbH + 548922 + Zelfy Inc - 0008BC - Ilevo AB + 6C5CDE + SunReports, Inc. - 0008BD - Tepg-US + 34F39B + WizLAN Ltd. - 0008AE - PacketFront Network Products AB + E86CDA + Supercomputers and Neurocomputers Research Center - 0008C3 - Contex A/S + 240B2A + Viettel Group - 0008F3 - Wany + 84F64C + Cross Point BV - 0008DE - 3UP Systems + C08B6F + S I Sistemas Inteligentes Eletrônicos Ltda - 000822 - InPro Comm + ECB106 + Acuro Networks, Inc - 000823 - Texa Corp. + 481249 + Luxcom Technologies Inc. - 00081D - Ipsil Inc.orporated + 24A937 + PURE Storage - 00082D - Indus Teqsite Private Limited + 348302 + iFORCOM Co., Ltd - 000820 - Cisco Systems Inc. + F86ECF + Arcx Inc - 000828 - Koei Engineering Ltd + 8C8401 + Private - 000824 - Nuance Document Imaging + 408493 + Clavister AB - 00086C - Plasmon LMS + 6C7039 + Novar GmbH - 000868 - PurOptix + B43DB2 + Degreane Horizon - 000869 - Command-e Technology Ltd + 34BA51 + Se-Kure Controls, Inc. - 000862 - NEC Eluminant Technologies Inc. + 089F97 + LEROY AUTOMATION - 000803 - Cos Tron + 78A6BD + DAEYEON Control&Instrument Co,.Ltd - 000805 - Techno-Holon Corporation + 3C1915 + GFI Chrono Time - 000808 - PPT Vision Inc. + 147373 + TUBITAK UEKAE - 000814 - TIL Technologies + C835B8 + Ericsson, EAB/RWI/K - 00085C - Shanghai Dare Technologies Ltd + 982D56 + Resolution Audio - 00082C - Homag AG + FCCF62 + IBM Corp - 000821 - Cisco Systems Inc. + 084E1C + H2A Systems, LLC - 000887 - Maschinenfabrik Reinhausen GmbH + 88B627 + Gembird Europe BV - 000877 - Liebert-Hiross Spa + F06853 + Integrated Corporation - 00087B - RTX Telecom A/S + A4ADB8 + Vitec Group, Camera Dynamics Ltd - 000861 - SoftEnergy Ltd + E02630 + Intrigue Technologies, Inc. - 00084F - Qualstar Corporation + 104369 + Soundmax Electronic Limited - 000854 - Netronix Inc. + C06C0F + Dobbs Stanford - 000876 - SDSystem + 502DF4 + Phytec Messtechnik GmbH - 000870 - Rasvia Systems Inc. + A4B121 + Arantia 2010 S.L. - 00086E - Hyglo AB + E02636 + Nortel Networks - 0007FD - LANergy Ltd + 5C57C8 + Nokia Corporation - 0007FE - Rigaku Corporation + D46CBF + Goodrich ISR - 0007BF - Armillaire Technologies Inc. + F89D0D + Control Technology Inc. - 0007BB - Candera Inc. + 2C3F3E + Alge-Timing GmbH - 0007BD - Radionet Ltd + ECC882 + Cisco Systems, Inc - 0007C4 - JEAN Ltd + 6CFDB9 + Proware Technologies Co Ltd. - 0007B6 - Telecom Technology Ltd + B42CBE + Direct Payment Solutions Limited - 0007B7 - Samurai Ind. Prods Eletronicos Ltda + CC2218 + InnoDigital Co., Ltd. - 0007B0 - Office Details Inc. + C86C1E + Display Systems Ltd - 0007D9 - Splicecom + 90A7C1 + Pakedge Device and Software Inc. - 0007DA - Neuro Telecom Ltd + 80BAAC + TeleAdapt Ltd - 0007CD - Kumoh Electronic Ltd + 746B82 + MOVEK - 0007CF - Anoto AB + 9CC077 + PrintCounts, LLC - 0007D2 - Logopak Systeme GmbH & Co. KG + 3CB17F + Wattwatchers Pty Ld - 0007C9 - Technol Seven Ltd + CC5459 + OnTime Networks AS - 0007C7 - Synectics Systems Limited + D4F143 + IPROAD.,Inc - 0007C3 - Thomson + C86CB6 + Optcom Co., Ltd. - 0007A5 - Y.D.K Ltd + A01859 + Shenzhen Yidashi Electronics Co Ltd - 00079C - Golden Electronics Technology Ltd + E8056D + Nortel Networks - 0007E4 - SoftRadio Ltd + C45976 + Fugoo Coorporation - 000754 - Xyterra Computing Inc. + 8C56C5 + Nintendo Co., Ltd. - 000757 - Topcall International AG + CCB888 + AnB Securite s.a. - 000753 - Beijing Qxcomm Technology Ltd + 6C5E7A + Ubiquitous Internet Telecom Co., Ltd - 00074C - Beicom Inc. + 34862A + Heinz Lackmann GmbH & Co KG - 00074D - Zebra Technologies Corp. + B4ED54 + Wohler Technologies - 000732 - AAEON Technology Inc. + 2CCD27 + Precor Inc - 000725 - Bematech International Corp. + 10189E + Elmo Motion Control - 000723 - ELCON Systemtechnik GmbH + 5849BA + Chitai Electronic Corp. - 00071D - Satelsa Sistemas Y Aplicaciones de Telecomunicaciones, S.A. + 00D11C + ACETEL - 000720 - Trutzschler GmbH & Co. KG + 549A16 + Uzushio Electric Co.,Ltd. - 00076E - Sinetica Corporation Limited + 601D0F + Midnite Solar - 00076F - Synoptics Limited + A8F94B + Eltex Enterprise Ltd. - 000773 - Ascom Powerline Communications Ltd + 0C8230 + SHENZHEN MAGNUS TECHNOLOGIES CO.,LTD - 00076C - Daehanet Inc. + 50A6E3 + David Clark Company - 00075D - Celleritas Inc. + 50934F + Gradual Tecnologia Ltda. - 00073F - Woojyun Systec Ltd + ACE348 + MadgeTech, Inc - 000728 - Neo Telecom + 9018AE + Shanghai Meridian Technologies, Co. Ltd. - 00072C - Fabricom + 0494A1 + CATCH THE WIND INC - 00072D - CNSystems + 003A99 + Cisco Systems, Inc - 00072F - Intransa Inc. + 003A9A + Cisco Systems, Inc - 000780 - Bluegiga Technologies Oy + 003A98 + Cisco Systems, Inc - 000777 - Motah Ltd + 7072CF + EdgeCore Networks - 000724 - Telemax Ltd + B8B1C7 + BT&COM CO.,LTD - 00071B - CDVI Americas Ltd + DC2C26 + Iton Technology Limited - 000715 - General Research Of Electronics Inc. + 006440 + Cisco Systems, Inc - 000737 - Soriya Ltd + 94C4E9 + PowerLayer Microsystems HongKong Limited - 000734 - ONStor Inc. + 8843E1 + Cisco Systems, Inc - 000765 - Jade Quantum Technologies Inc. + B8F732 + Aryaka Networks Inc - 0005EA - Rednix + E8DFF2 + PRF Co., Ltd. - 0006C9 - Technical Marketing Research Inc. + A4AD00 + Ragsdale Technology - 0006C8 - Sumitomo Metal Micro Devices Inc. + 4C9EE4 + Hanyang Navicom Co.,Ltd. - 0006F1 - Optillion + C47D4F + Cisco Systems, Inc - 0006A7 - Primarion + 3CDF1E + Cisco Systems, Inc - 0006A9 - Universal Instruments Corp. + 9C4E8E + ALT Systems Ltd - 00069E - UNIQA Inc. + 042BBB + PicoCELA, Inc. - 0006B1 - Sonicwall + FC0877 + Prentke Romich Company - 0006AD - KB Electronics Ltd + ECD00E + MiraeRecognition Co., Ltd. - 0006AF - Xalted Networks + 986DC8 + TOSHIBA MITSUBISHI-ELECTRIC INDUSTRIAL SYSTEMS CORPORATION - 0006D7 - Cisco Systems Inc. + 6CAC60 + Venetex Corp - 0006D5 - Diamond Systems Corp. + C87248 + Aplicom Oy - 0006FD - Comjet Information Systems Corp. + F04BF2 + JTECH Communications, Inc. - 0006F9 - Mitsui Zosen Systems Research Inc. + 1C0FCF + Sypro Optics GmbH - 0006C0 - United Internetworks Inc. + 64F970 + Kenade Electronics Technology Co.,LTD. - 0006E0 - MAT Ltd + D411D6 + ShotSpotter, Inc. - 00D0B9 - Microtek International Inc. + 9CAFCA + Cisco Systems, Inc - 00D05F - Valcom Inc. + C82E94 + Halfa Enterprise Co., Ltd. - 000675 - Banderacom Inc. + 7C7BE4 + Z'SEDAI KENKYUSHO CORPORATION - 000698 - egnite GmbH + F0DE71 + Shanghai EDO Technologies Co.,Ltd. - 00069C - Transmode Systems AB + 60D30A + Quatius Limited - 000643 - SONO Computer Ltd + 24CF21 + Shenzhen State Micro Technology Co., Ltd - 000649 - 3M Deutschland GmbH + 10BAA5 + GANA I&C CO., LTD - 00063E - Opthos Inc. + BC9DA5 + DASCOM Europe GmbH - 00063B - Arcturus Networks Inc. + 28FBD3 + Ragentek Technology Group - 00067B - Toplink C&C Corporation + 586ED6 + Private - 000670 - Upponetti Oy + C8D2C1 + Jetlun (Shenzhen) Corporation - 00066F - Korea Data Systems + E09153 + XAVi Technologies Corp. - 000668 - Vicon Industries Inc. + 64BC11 + CombiQ AB - 00066D - Compuprint S.P.A. + EC3091 + Cisco Systems, Inc - 000626 - MWE GmbH + F4ACC1 + Cisco Systems, Inc - 000620 - Serial System Ltd + 4097D1 + BK Electronics cc - 000618 - DigiPower Manufacturing Inc. + 0CE936 + ELIMOS srl - 000633 - Cross Match Technologies GmbH + 60391F + ABB Ltd - 000686 - ZARDCOM Ltd + E8A4C1 + Deep Sea Electronics Ltd - 000689 - yLez Technologies Pte Ltd + D4C766 + Acentic GmbH - 000681 - Goepel Electronic GmbH + A02EF3 + United Integrated Services Co., Led. - 000658 - Helmut Fischer GmbH Institut fur Elektronik und Messtechnik + A09805 + OpenVox Communication Co Ltd - 0005D3 - eProduction Solutions Inc. + 00271F + MIPRO Electronics Co., Ltd - 000604 - @Track Communications Inc. + 88A5BD + QPCOM INC. - 000606 - RapidWAN Inc. + 80177D + Nortel Networks - 000603 - Baker Hughes Inc. + 0026A9 + Strong Technologies Pty Ltd - 000607 - Omni Directional Control Technology Inc. + 0026A5 + MICROROBOT.CO.,LTD - 0005F7 - Analog Devices Inc. + 0026A3 + FQ Ingenieria Electronica S.A. - 00059C - Kleinknecht GmbH, Ing. Buro + 00269D + M2Mnet Co., Ltd. - 0005AE - Mediaport USA + 0026C5 + Guangdong Gosun Telecommunications Co.,Ltd - 0005B0 - Korea Computer Technology Ltd + 0026C4 + Cadmos microsystems S.r.l. - 0005B2 - Medison Ltd + 0026C8 + System Sensor - 000597 - Eagle Traffic Control Systems + 0026C2 + SCDI Co. LTD - 0005B5 - Broadcom Technologies + 002697 + Alpha Technologies Inc. - 0005CB - ROIS Technologies Inc. + 00268A + Terrier SC Ltd - 0005C8 - Verytech + 002712 + MaxVision LLC - 0005CD - D&M Holdings Inc. + 0026CF + DEKA R&D - 0005A2 - CELOX Networks + 0026F3 + SMC Networks - 0005AA - Moore Industries International Inc. + 0026E7 + Shanghai ONLAN Communication Tech. Co., Ltd. - 0005E7 - Netrake an AudioCodes Company + 0026E0 + ASITEQ - 0005F4 - System Base Ltd + 00270C + Cisco Systems, Inc - 0005E1 - Trellis Photonics Ltd + 002703 + Testech Electronics Pte Ltd - 0005E2 - Creativ Network Technologies + 002612 + Space Exploration Technologies - 000613 - Kawasaki Microelectronics Incorporated + 002616 + Rosemount Inc. - 000617 - Redswitch Inc. + 00260B + Cisco Systems, Inc - 000551 - F & S Elektronik Systeme GmbH + 0025FD + OBR Centrum Techniki Morskiej S.A. - 00054D - Brans Technologies Inc. + 002600 + TEAC Australia Pty Ltd. - 000547 - Starent Networks + 002685 + Digital Innovation - 00054E - Philips + 002623 + JRD Communication Inc - 000546 - KDDI Network & Solultions Inc. + 002627 + Truesell - 000540 - FAST Corporation + 00267A + wuhan hongxin telecommunication technologies co.,ltd - 00053C - Xircom + 002664 + Core System Japan - 000544 - Valley Technologies Inc. + 002659 + Nintendo Co., Ltd. - 00052E - Cinta Networks + 002651 + Cisco Systems, Inc - 00052F - Leviton Network Solutions + 00264E + r2p GmbH - 00053B - Harbour Networks Ltd Beijing + 00264F + Krüger &Gothe GmbH - 000528 - New Focus Inc. + 002621 + InteliCloud Technology Inc. - 00056B - C.P. Technology Ltd + 00261C + NEOVIA INC. - 000560 - Leader Comm Ltd + 002639 + T.M. Electronics, Inc. - 00055E - Cisco Systems Inc. + 002672 + AAMP of America - 000596 - Genotech Ltd + 0025E9 + i-mate Development, Inc. - 000579 - Universal Control Solution Corp. + 0025E6 + Belgian Monitoring Systems bvba - 00057F - Acqis Technology + 0025E0 + CeedTec Sdn Bhd - 000573 - Cisco Systems Inc. + 0025DE + Probits Co., LTD. - 000575 - CDS-Electronics BV + 0025B0 + Schmartz Inc - 000556 - 360 Systems + 0025AD + Manufacturing Resources International - 000559 - Intracom S.A. + 0025AC + I-Tech corporation - 00058C - Opentech Inc. + 0025AB + AIO LCD PC BU / TPV - 0004C9 - Micro Electron Ltd + 0025BA + Alcatel-Lucent IPD - 0004BE - OptXCon Inc. + 0025BB + INNERINT Co., Ltd. - 0004C4 - Audiotonix Group Limited + 0025B1 + Maya-Creation Corporation - 0004C1 - Cisco Systems Inc. + 0025B8 + Agile Communications, Inc. - 0004D6 - Takagi Industrial Ltd + 0025CE + InnerSpace - 0004D1 - Drew Technologies Inc. + 0025C6 + kasercorp, ltd - 0004D0 - Softlink s.r.o. + 0025C5 + Star Link Communication Pvt. Ltd. - 008087 - OKI Electric Industry Ltd + 0025C7 + altek Corporation - 0004D9 - Titan Electronics Inc. + 0025FF + CreNova Multimedia Co., Ltd - 0004D8 - IPWireless Inc. + 0025F3 + Nordwestdeutsche Zählerrevision - 000524 - BTL System (HK) Limited + 0025EC + Humanware - 000522 - LEA*D Corporation Inc. + 0025ED + NuVo Technologies LLC - 000520 - Smartronix Inc. + 0025A1 + Enalasys - 0004EB - Paxonet Communications Inc. + 00259A + CEStronics GmbH - 0004EF - Polestar Corp. + 002591 + NEXTEK, Inc. - 000514 - KDT Systems Ltd + 00258D + Haier - 00050B - SICOM Systems Inc. + 0025DD + SUNNYTEK INFORMATION CO., LTD. - 000505 - Systems Integration Solutions Inc. + 002537 + Runcom Technologies Ltd. - 0004FE - Pelago Networks + 002538 + Samsung Electronics Co., Ltd., Memory Division - 000518 - Jupiters Technology + 002544 + LoJack Corporation - 0004B7 - AMB i.t. Holding + 00254A + RingCube Technologies, Inc. - 0004B9 - S.I. Soubou Inc. + 00254F + ELETTROLAB Srl - 0004BB - Bardac Corporation + 002549 + Jeorich Tech. Co.,Ltd. - 0004BC - Giantec Inc. + 002539 + IfTA GmbH - 0004AF - Digital Fountain Inc. + 00251C + EDT - 000456 - Cambium Networks Limited + 00251A + Psiber Data Systems Inc. - 000458 - Fusion X Ltd + 002514 + PC Worth Int'l Co., Ltd. - 00044F - Schubert System Elektronik GmbH + 002532 + Digital Recorders - 000446 - CYZENTECH Ltd + 002571 + Zhejiang Tianle Digital Electric Co.,Ltd - 00044A - iPolicy Networks Inc. + 002583 + Cisco Systems, Inc - 000440 - cyberPIXIE Inc. + 00255D + Morningstar Corporation - 00043C - SONOS Ltd + 002558 + MPEDIA - 0004B2 - Essegi SRL + 0024F8 + Technical Solutions Company Ltd. - 0004B4 - Ciac + 0024F9 + Cisco Systems, Inc - 0004AD - Malibu Networks + 0024F2 + Uniphone Telecommunication Co., Ltd. - 0004A9 - SandStream Technologies Inc. + 002507 + ASTAK Inc. - 000461 - EPOX Computer Ltd + 002502 + NaturalPoint - 000462 - DAKOS Data & Communication Ltd + 00250B + CENTROFACTOR INC - 00045F - Avalue Technology Inc. + 002506 + A.I. ANTITACCHEGGIO ITALIA SRL - 00049C - Surgient Networks Inc. + 0024B5 + Nortel Networks - 00049D - Ipanema Technologies + 0024B0 + ESAB AB - 000460 - Knilink Technology Inc. + 0024E1 + Convey Computer Corp. - 00048F - TD Systems Corporation + 0024D9 + BICOM, Inc. - 000495 - Tejas Networks India Limited + 0024EE + Wynmax Inc. - 00046F - Digitel S/A Industria Eletronica + 0024E3 + CAO Group - 000469 - Innocom Inc. + 0024C3 + Cisco Systems, Inc - 000487 - Cogency Semiconductor Inc. + 0024C4 + Cisco Systems, Inc - 000468 - Vivity Inc. + 002469 + Fasttel - Smart Doorphones - 0003E1 - Winmate Communication Inc. + 002464 + Bridge Technologies Co AS - 0003E4 - Cisco Systems Inc. + 002462 + Rayzone Corporation - 0003DC - Lexar Media Inc. + 002494 + Shenzhen Baoxin Tech CO., Ltd. - 0003D8 - iMPath Networks Inc. + 002489 + Vodafone Omnitel N.V. - 0003D5 - Advanced Communications Ltd + 00247F + Nortel Networks - 0003F7 - Plast-Control GmbH + 002475 + Compass System(Embedded Dept.) - 0003FC - Intertex Data AB + 00246F + Onda Communication spa - 0003EF - Oneline AG + 002420 + NetUP Inc. - 0003F1 - Cicada Semiconductor Inc. + 00241E + Nintendo Co., Ltd. - 000430 - Netgem + 00241F + DCT-Delta GmbH - 00042C - Minet Inc. + 002460 + Giaval Science Development Co. Ltd. - 00042A - Wireless Networks Inc. + 00245C + Design-Com Technologies Pty. Ltd. - 00042B - IT Access Ltd + 002444 + Nintendo Co., Ltd. - 0003D6 - RADVision Ltd + 00243D + Emerson Appliance Motors and Controls - 0003D4 - Alloptic Inc. + 002437 + Motorola - BSG - 0003CE - ETEN Technologies Inc. + 00249D + NES Technology Inc. - 0003C8 - CML Emergency Services + 00248E + Infoware ZRt. - 0003C3 - Micronik Multimedia + 00244F + Asantron Technologies Ltd. - 000419 - Fibercycle Networks Inc. + 0023FD + AFT Atlas Fahrzeugtechnik GmbH - 00041C - ipDialog Inc. + 0023E3 + Microtronic AG - 000418 - Teltronic S.A.U. + 0023DD + ELGIN S.A. - 000370 - NXTV Inc. + 0023DE + Ansync Inc. - 000402 - Nexsan Technologies Ltd + 0023D9 + Banner Engineering - 0003ED - Shinkawa Electric Ltd + 0023DA + Industrial Computer Source (Deutschland)GmbH - 0003BD - OmniCluster Technologies Inc. + 002413 + Cisco Systems, Inc - 0003C0 - RFTNC Ltd + 00240E + Inventec Besta Co., Ltd. - 0003B8 - NetKit Solutions LLC + 002405 + Dilog Nordic AB - 0003B7 - ZACCESS Systems + 0023EF + Zuend Systemtechnik AG - 0003A0 - Cisco Systems Inc. + 0023E8 + Demco Corp. - 0003A2 - Catapult Communications + 0023AC + Cisco Systems, Inc - 00039C - OptiMight Communications Inc. + 0023B7 + Q-Light Co., Ltd. - 0003B0 - Xsense Technology Corp. + 0023D8 + Ball-It Oy - 0003AA - Watlow + 00231B + Danaher Motion - Kollmorgen - 0003A8 - IDOT Computers Inc. + 00231E + Cezzer Multimedia Technologies - 000355 - TeraBeam Internet Systems + 00231F + Guangda Electronic & Telecommunication Technology Development Co., Ltd. - 000369 - Nippon Antenna Ltd + 002270 + ABK North America, LLC - 000373 - Aselsan A.S + 002313 + Qool Technologies Ltd. - 000377 - Gigabit Wireless + 002310 + LNC Technology Co., Ltd. - 000365 - Kira Information & Communications Ltd + 00235B + Gulfstream - 000385 - Actelis Networks Inc. + 002359 + Benchmark Electronics ( Thailand ) Public Company Limited - 000354 - Fiber Logic Communications + 002357 + Pitronot Technologies and Engineering P.T.E. Ltd. - 000350 - Bticino SPA + 002355 + Kinco Automation(Shanghai) Ltd. - 000351 - Diebold Inc. + 002373 + GridIron Systems, Inc. - 00034E - Pos Data Company Ltd + 002367 + UniControls a.s. - 000348 - Norscan Instruments Ltd + 002368 + Zebra Technologies Inc - 000346 - Hitachi Kokusai Electric Inc. + 00236E + Burster GmbH & Co KG - 000344 - Tietech Ltd + 002366 + Beijing Siasun Electronic System Co.,Ltd. - 0002E6 - Gould Instrument Systems Inc. + 00239F + Institut für Prüftechnik - 0002E4 - JC HYUN Systems Inc. + 00239D + Mapower Electronics Co., Ltd - 0002DE - Astrodesign Inc. + 002398 + Vutlan sro - 0002E2 - NDC Infared Engineering + 00238F + NIDEC COPAL CORPORATION - 0002E1 - Integrated Network Corporation + 002380 + Nanoteq - 0002F7 - ARM + 002334 + Cisco Systems, Inc - 00D024 - Cognex Corporation + 00233F + Purechoice Inc - 0002F1 - Pinetron Ltd + 0022CB + IONODES Inc. - 0002ED - DXO Telecom Ltd + 0022C6 + Sutus Inc - 0002EC - Maschoff Design Engineering + 0022C0 + Shenzhen Forcelink Electronic Co, Ltd - 000336 - Zetes Technologies + 002296 + LinoWave Corporation - 000337 - Vaone Inc. + 0022CD + Ared Technology Co., Ltd. - 00033B - TAMI Tech Ltd + 0022CC + SciLog, Inc. - 00032D - IBASE Technology Inc. + 0022EB + Data Respons A/S - 00B052 - Atheros Communications + 0022EF + iWDL Technologies - 000343 - Martin Professional A/S + 0022F2 + SunPower Corp - 000335 - Mirae Technology + 0022E8 + Applition Co., Ltd. - 0002F8 - SEAKR Engineering Inc. + 0022E9 + ProVision Communications - 000314 - Teleware Network Systems + 002278 + Shenzhen Tongfang Multimedia Technology Co.,Ltd. - 00032F - Global Sun Technology Inc. + 00227A + Telecom Design - 0002DC - Fujitsu General Limited + 0022A7 + Tyco Electronics AMP GmbH - 0002D7 - EMPEG Ltd + 0022A1 + Huawei Symantec Technologies Co.,Ltd. - 0002D3 - NetBotz Inc. + 00229D + PYUNG-HWA IND.CO.,LTD - 0002DA - ExiO Communications Inc. + 00230C + CLOVER ELECTRONICS CO.,LTD. - 0002D4 - PDA Peripherals Inc. + 002301 + Witron Technology Limited - 0002D6 - NICE Systems + 0022F7 + Conceptronic - 00027D - Cisco Systems Inc. + 0022E6 + Intelligent Data - 00027C - Trilithic Inc. + 0022E3 + Amerigon - 00028B - VDSL Systems Oy + 0022E2 + WABTEC Transit Division - 00028C - Micrel-Synergy Semiconductor + 0022A6 + Sony Computer Entertainment America - 00028D - Movita Technologies Inc. + 002220 + Mitac Technology Corp - 000298 - Broadframe Corporation + 002227 + uv-electronic GmbH - 000297 - C-CoR.net + 002225 + Thales Avionics Ltd - 000291 - Open Network Ltd + 00221E + Media Devices Co., Ltd. - 0002C1 - Innovative Electronic Designs Inc. + 002237 + Shinhint Group - 0002C0 - Bencent Tzeng Industry Ltd + 00222F + Open Grid Computing, Inc. - 000299 - Apex Inc. + 002244 + Chengdu Linkon Communications Device Co., Ltd - 000275 - SMART Technologies Inc. + 002250 + Point Six Wireless, LLC - 0002C6 - Data Track Technology PLC + 00226F + 3onedata Technology Co. Ltd. - 0002A6 - Effinet Systems Ltd + 002260 + AFREEY Inc. - 00025F - Nortel Networks + 0021F6 + Oracle Corporation - 00025C - SCI Systems (Kunshan) Ltd + 002206 + Cyberdyne Inc. - 000087 - Hitachi Ltd + 002202 + Excito Elektronik i Skåne AB - 000258 - Flying Packets Communications + 00220E + Indigo Security Co., Ltd. - 00024E - Datacard Group + 002207 + Inteno Broadband Technology AB - 000242 - Videoframe Systems + 00223E + IRTrans GmbH - 000244 - SURECOM Technology Co. + 0021CE + NTC-Metrotek - 00023E - Selta Telematica S.p.a + 0021CA + ART System Co., Ltd. - 000241 - Amer.com + 0021CB + SMS TECNOLOGIA ELETRONICA LTDA - 000207 - VisionGlobal Network Corp. + 0021C8 + LOHUIS Networks - 000208 - Unify Networks Inc. + 0021BF + Hitachi High-Tech Control Systems Corporation - 000204 - Bodmann Industries Elektronik GmbH + 0021EF + Kapsys - 000229 - Adtec Corporation + 0021ED + Telegesis - 00022D - Agere Systems + 0021EB + ESP SYSTEMS, LLC - 000226 - XESystems Inc. + 00219F + SATEL OY - 000225 - One Stop Systems + 002196 + Telsey S.p.A. - 000211 - Nature Worldwide Technology Corp. + 00218D + AP Router Ind. Eletronica LTDA - 000212 - SierraCom + 002190 + Goliath Solutions - 000217 - Cisco Systems Inc. + 002174 + AvaLAN Wireless - 00017A - Chengdu Maipu Electric Industrial Ltd + 002179 + IOGEAR, Inc. - 000238 - Serome Technology Inc. + 0021DB + Santachi Video Technology (Shenzhen) Co., Ltd. - 000269 - Nadatel Ltd + 0021DF + Martin Christ GmbH - 000264 - AudioRamp.com + 0021D4 + Vollmer Werke GmbH - 000255 - IBM Corp + 0021D6 + LXI Consortium - 000252 - Carrier Corporation + 0021A8 + Telephonics Corporation - 000220 - Canon Finetech Inc. + 0021A9 + Mobilink Telecom Co.,Ltd - 00020D - Micronpc.com + 0021A6 + Videotec Spa - 0001D4 - Leisure Time Inc. + 0021BC + ZALA COMPUTER - 0001DD - Avail Networks + 0021B4 + APRO MEDIA CO., LTD - 0001D5 - Haedong Info & Comm Ltd + 002185 + MICRO-STAR INT'L CO.,LTD. - 0001D7 - F5 Networks Inc. + 002182 + SandLinks Systems, Ltd. - 0001DE - Trango Systems Inc. + 002183 + ANDRITZ HYDRO GmbH - 0001DC - Activetelco + 002168 + iVeia, LLC - 0001F9 - TeraGlobal Communications Corp. + 002139 + Escherlogic Inc. - 0001FB - DoTop Technology Inc. + 00212C + SemIndia System Private Limited - 0001F8 - Texio Technology Corporation + 00212B + MSA Auer - 0001BE - Gigalink Ltd + 00213B + Berkshire Products, Inc - 0001B1 - General Bandwidth + 002137 + Bay Controls, LLC - 0001BF - Teleforce Ltd + 00215E + IBM Corp - 0001B4 - Wayport Inc. + 002155 + Cisco Systems, Inc - 0001BA - IC-Net Inc. + 002157 + National Datacast, Inc. - 0001CF - Alpha Data Parallel Systems Ltd + 00210C + Cymtec Systems, Inc. - 0001D0 - VitalPoint Inc. + 00210B + GEMINI TRAZE RFID PVT. LTD. - 0001B0 - Fulltek Technology Ltd + 001FFB + Green Packet Bhd - 0001A9 - BMW AG + 00212A + Audiovox Corporation - 0001AA - Airspan Communications Ltd + 00214D + Guangzhou Skytone Transmission Technology Com. Ltd. - 00019E - ESS Technology Inc. + 002150 + EYEVIEW ELECTRONICS - 00017D - ThermoQuest + 001FF0 + Audio Partnership - 000181 - Nortel Networks + 001FEA + Applied Media Technologies Corporation - 000194 - Capital Equipment Corporation + 002110 + Clearbox Systems - 000198 - Darim Vision + 001F8B + Cache IQ - 0001E8 - Force10 Networks Inc. + 001F85 + Apriva ISS, LLC - 0001E9 - Litton Marine Systems B.V. + 001F87 + Skydigital Inc. - 0001E5 - Supernet Inc. + 001F88 + FMS Force Measuring Systems AG - 0001A2 - Logical Ltd + 001F86 + digEcor - 000185 - Hitachi Aloka Medical Ltd + 001F80 + Lucas Holding bv - 0001C7 - Cisco Systems Inc. + 001FA5 + Blue-White Industries - 000121 - WatchGuard Technologies Inc. + 001F9D + Cisco Systems, Inc - 000129 - DFI Inc. + 001F9F + Thomson Telecom Belgium - 000119 - RTUnet (Australia) + 001FA1 + Gtran Inc - 000122 - Trend Communications Ltd + 001FE9 + Printrex, Inc. - 00011A - Hoffmann und Burmeister GbR + 001FDD + GDI LLC - 00010A - CIS Technology Inc. + 001FCE + QTECH LLC - 000167 - Hioki E.E. Corporation + 001B58 + ACE CAD Enterprise Co., Ltd. - 000168 - Vitana Corporation + 001F79 + Lodam Electronics A/S - 000162 - Cygnet Technologies Inc. + 001F71 + xG Technology, Inc. - 000154 - G3M Corporation + 001FDA + Nortel Networks - 000152 - Chromatek Inc. + 001FD9 + RSD Communications Ltd - 000150 - Gilat Communications Ltd + 001FB0 + TimeIPS, Inc. - 000151 - Ensemble Communications + 001FAE + Blick South Africa (Pty) Ltd - 000115 - Extratech Corporation + 001F99 + SERONICS co.ltd - 000101 - Private + 001F96 + APROTECH CO.LTD - 00010D - Teledyne DALSA Inc. + 001F6C + Cisco Systems, Inc - 000105 - Beckhoff Automation GmbH + 001F6F + Fujian Sunnada Communication Co.,Ltd. - 00B017 - InfoGear Technology Corp. + 001F60 + COMPASS SYSTEMS CORP. - 00012C - Aravox Technologies Inc. + 001F6A + PacketFlux Technologies, Inc. - 000142 - Cisco Systems Inc. + 001F65 + KOREA ELECTRIC TERMINAL CO., LTD. - 000164 - Cisco Systems Inc. + 001F5E + Dyna Technology Co.,Ltd. - 00015F - DIGITAL DESIGN GmbH + 001EE8 + Mytek - 00012B - TELENET Ltd + 001EEE + ETL Systems Ltd - 00013F - Neighbor World Ltd + 001EE0 + Urmet SpA - 000124 - Acer Incorporated + 001EDA + Wesemann Elektrotechniek B.V. - 003088 - Ericsson + 001F17 + IDX Company, Ltd. - 003020 - TSI Inc.. + 001F55 + Honeywell Security (China) Co., Ltd. - 003095 - Procomp Informatics Ltd + 001F54 + Lorex Technology Inc. - 0030CA - Discovery Com + 001F4B + Lineage Power - 0030CE - Zaffire + 001F40 + Speakercraft Inc. - 00307B - Cisco Systems Inc. + 001EFC + JSC MASSA-K - 0030B5 - Tadiran Microwave Networks + 001F06 + Integrated Dispatch Solutions - 0030B8 - RiverDelta Networks + 001EFA + PROTEI Ltd. - 003071 - Cisco Systems Inc. + 001EFB + Trio Motion Technology Ltd - 00303A - Maatel + 001EF8 + Emfinity Inc. - 00304E - Bustec Production Ltd + 001F1B + RoyalTek Company Ltd. - 0030A4 - Woodwind Communications System + 001F0D + L3 Communications - Telemetry West - 00303B - PowerCom Technology + 001F2E + Triangle Research Int'l Pte Ltd - 0030BC - Optronic AG + 001ECB + RPC Energoautomatika Ltd - 00B02D - ViaGate Technologies Inc. + 001EBA + High Density Devices AS - 0030EE - DSG Technology Inc. + 001E9F + Visioneering Systems, Inc. - 00309E - Workbit Corporation. + 001E9B + San-Eisha, Ltd. - 0030DE - WAGO Kontakttechnik GmbH + 001ED7 + H-Stream Wireless, Inc. - 00303E - Radcom Ltd + 001ED5 + Tekon-Automatics - 0030D7 - Innovative Systems, L.L.C. + 001EB4 + UNIFAT TECHNOLOGY LTD. - 00B0CE - Viveris Technologies + 001EA8 + Datang Mobile Communications Equipment CO.,LTD - 00B01C - Westport Technologies + 001EAB + TeleWell Oy - 00B04A - Cisco Systems Inc. + 001E61 + ITEC GmbH - 00B048 - Marconi Communications Inc. + 001E59 + Silicon Turnkey Express, LLC - 00301B - Shuttle Inc. + 001E71 + MIrcom Group of Companies - 003021 - Hsing Tech. Enterprise Ltd + 001E6B + Cisco SPVTG - 00302C - Sylantro Systems Corporation + 001E70 + Chelton Limited - 0030DF - KB/TEL Telecomunicaciones + 001E51 + Converter Industry Srl - 003030 - Harmonix Corporation + 001E47 + PT. Hariff Daya Tunggal Engineering - 003063 - Santera Systems Inc. + 001E48 + Wi-Links - 0030A3 - Cisco Systems Inc. + 001E8A + eCopy, Inc - 0030DD - Indigita Corporation + 001E1B + Digital Stream Technology, Inc. - 003099 - Boenig UND Kallenbach OHG + 001E17 + STN BV - 0030F2 - Cisco Systems Inc. + 001E18 + Radio Activity srl - 003051 - Orbit Avionic & Communication + 001E15 + Beech Hill Electronics - 00308E - Cross Match Technologies Inc. + 001DC4 + AIOI Systems Co., Ltd. - 003027 - Kerbango Inc. + 001DC0 + Enphase Energy - 003033 - Orient Telecom Ltd + 001DBD + Versamed Inc. - 003008 - Avio Digital Inc. + 001DF8 + Webpro Vision Technology Corporation - 00301D - Skystream Inc. + 001DF9 + Cybiotronics (Far East) Limited - 0030BA - AC&T System Ltd + 001DF7 + R. STAHL Schaltgeräte GmbH - 0030FD - Integrated Systems Design + 001E05 + Xseed Technologies & Computing - 0030B9 - Ectel + 001E07 + Winy Technology Co., Ltd. - 00307D - GRE America Inc. + 001E0A + Syba Tech Limited - 0030EF - Neon Technology Inc. + 001E03 + LiComm Co., Ltd. - 003096 - Cisco Systems Inc. + 001E38 + Bluecard Software Technology Co., Ltd. - 003039 - Softbook Press + 001E30 + Shireen Inc - 00D0F8 - Fujian Star Terminal + 001E2E + SIRTI S.p.A. - 00D0ED - Xiox + 001DEB + DINEC International - 00D097 - Cisco Systems Inc. + 001DDC + HangZhou DeChangLong Tech&Info Co.,Ltd - 00D08E - Grass Valley, A Belden Brand + 001E3E + KMW Inc. - 00D056 - Somat Corporation + 001DB7 + Tendril Networks, Inc. - 00D0E0 - Dooin Electronics Co. + 001D9D + ARTJOY INTERNATIONAL LIMITED - 00D000 - Ferran Scientific Inc. + 001D9E + AXION TECHNOLOGIES - 00D0D0 - Zhongxing Telecom Ltd + 001D9A + GODEX INTERNATIONAL CO., LTD - 00D053 - Connected Systems + 001D97 + Alertus Technologies LLC - 00D033 - Dalian Daxian Network + 001D43 + Shenzhen G-link Digital Technology Co., Ltd. - 00D0D6 - Aethra Telecomunicazioni + 001D3F + Mitron Pty Ltd - 00D063 - Cisco Systems Inc. + 001D39 + MOOHADIGITAL CO., LTD - 00D047 - XN Technologies + 001D37 + Thales-Panda Transportation System - 00D055 - Kathrein-Werke KG + 001D30 + YX Wireless S.A. - 00D03B - Vision Products Pty Ltd + 001D7F + Tekron International Ltd - 00D0B3 - DRS Technologies Canada Ltd + 001D70 + Cisco Systems, Inc - 00D0AF - Cutler-Hammer Inc. + 001D79 + SIGNAMAX LLC - 00D052 - Ascend Communications Inc. + 001D6F + Chainzone Technology Co., Ltd - 00D0AD - TL Industries + 001D78 + Invengo Information Technology Co.,Ltd - 00D0A4 - Alantro Communications + 001D62 + InPhase Technologies - 00D0B0 - Bitswitch Ltd + 001D63 + Miele & Cie. KG - 00D030 - Safetran Systems Corp + 001DAE + CHANG TSENG TECHNOLOGY CO., LTD - 00302A - Southern Information + 001DA6 + Media Numerics Limited - 0030E1 - Network Equipment Technologies Inc. + 001D91 + Digitize, Inc - 00302B - Inalp Networks Inc. + 001D95 + Flash, Inc. - 003001 - SMP + 001D8D + Fluke Process Instruments GmbH - 00D08B - ADVA Optical Networking Ltd + 001D13 + NextGTV - 00D0E4 - Cisco Systems Inc. + 001D10 + LightHaus Logic, Inc. - 00D05A - Symbionics Ltd + 001D14 + SPERADTONE INFORMATION TECHNOLOGY LIMITED - 00D079 - Cisco Systems Inc. + 001CBB + MusicianLink - 00D021 - Regent Electronics Corp. + 001CB2 + BPT SPA - 00D09F - Novtek Test Systems + 001CB5 + Neihua Network Technology Co.,LTD.(NHN) - 00D0FE - Astral Point + 001CB4 + Iridium Satellite LLC - 00D0D4 - V-Bits Inc. + 001CB6 + Duzon CNT Co., Ltd. - 00D084 - Nexcomm Systems Inc. + 001D1F + Siauliu Tauro Televizoriai, JSC - 00D099 - Elcard Wireless Systems Oy - - - 00D0E7 - Vcon Telecommunication Ltd + 001CCD + Alektrona Corporation - 00D01B - Mimaki Engineering Ltd + 001CC7 + Rembrandt Technologies, LLC d/b/a REMSTREAM - 00D00D - Micromeritics Instrument + 001D04 + Zipit Wireless, Inc. - 00D054 - SAS Institute Inc. + 001CD0 + Circleone Co.,Ltd. - 00D009 - Hsing Tech. Enterprise Ltd + 001C9F + Razorstream, LLC - 00D0F4 - Carinthian Tech Institute + 001CEC + Mobilesoft (Aust.) Pty Ltd - 00D07D - Cosine Communications + 001CE8 + Cummins Inc - 00D083 - Invertex Inc. + 001CF2 + Tenlon Technology Co.,Ltd. - 00D0BA - Cisco Systems Inc. + 001C1F + Quest Retail Technology Pty Ltd - 00D098 - Photon Dynamics Canada Inc. + 001C16 + ThyssenKrupp Elevator - 00D0BE - Emutec Inc. + 001C19 + secunet Security Networks AG - 00D092 - Glenayre Western Multiplex + 001C47 + Hangzhou Hollysys Automation Co., Ltd - 00509D - THE Industree B.V. + 001C49 + Zoltan Technology Inc. - 00D0B8 - Iomega Corporation + 001C3F + International Police Technologies, Inc. - 0050CB - Jetter + 001C3B + AmRoad Technology Inc. - 005058 - Sangoma Technologies + 001C32 + Telian Corporation - 005074 - Advanced HI-Tech Corp. + 001C63 + TRUEN - 00500A - Iris Technologies Inc. + 001C5C + Integrated Medical Systems, Inc. - 00506D - Videojet Systems + 001C52 + VISIONEE SRL - 0050CA - NET TO NET Technologies + 001C8D + Mesa Imaging - 00D0C7 - Pathway Inc. + 001C89 + Force Communications, Inc. - 00D07A - Amaquest Computer Corp. + 001C87 + Uriver Inc. - 00503F - Anchor Games + 001C7D + Excelpoint Manufacturing Pte Ltd - 005032 - Picazo Communications Inc. + 001C77 + Prodys - 00D04A - Presence Technology GmbH + 001C6F + Emfit Ltd - 00D074 - Taqua Systems Inc. + 001C6C + 30805 - 00504D - Tokyo Electron Device Limited + 001C61 + Galaxy Microsystems LImited - 005070 - Chaintech Computer Ltd + 001C28 + Sphairon Technologies GmbH - 005023 - PG Design Electronics Inc. + 001C09 + SAE Electronic Co.,Ltd. - 00509E - Les Technologies SoftAcoustik Inc. + 001C0C + TANITA Corporation - 005071 - Aiwa Ltd + 001B9B + Hose-McCann Communications - 00505F - Brand Innovators + 001B9C + SATEL sp. z o.o. - 0050B4 - Satchwell Control Systems Ltd + 001B92 + l-acoustics - 0050D6 - Atlas Copco Tools AB + 001B8E + Hulu Sweden AB - 005082 - Foresson Corporation + 001BE8 + Ultratronik GmbH - 0050DF - AirFiber Inc. + 001BE1 + ViaLogy - 0050C5 - ADS Technologies Inc. + 001BDF + Iskra Sistemi d.d. - 00508E - Optimation Inc. + 001BEC + Netio Technologies Co., Ltd - 005028 - Aval Communications + 001BB4 + Airvod Limited - 00502F - TollBridge Technologies Inc. + 001BB6 + Bird Electronic Corp. - 0050FE - PCTVnet ASA + 001BA6 + intotech inc. - 0050AB - NALTEC Inc. + 001B8A + 2M Electronic A/S - 005037 - Koga Electronics Co. + 001B80 + LORD Corporation - 0050A8 - OpenCon Systems Inc. + 001B76 + Ripcode, Inc. - 00509C - Beta Research + 001B70 + IRI Ubiteq, INC. - 0050B1 - Giddings & Lewis + 001BC7 + StarVedia Technology Inc. - 005006 - TAC AB + 001BA4 + S.A.E Afikim - 005009 - Philips Broadband Networks + 001B93 + JC Decaux SA DNT - 005030 - Future Plus Systems + 001BD9 + Edgewater Wireless Systems Inc - 005078 - Megaton House Ltd + 001B07 + Mendocino Software - 005002 - Omnisec AG + 001B08 + Danfoss Drives A/S - 00506A - Edeva Inc. + 001B01 + Applied Radio Technologies - 0050AA - Konica Minolta Holdings Inc. + 001B02 + ED Co.Ltd - 005038 - Dain Telecom Ltd + 001AFC + ModusLink Corporation - 0050B7 - Boser Technology Ltd + 001B6C + LookX Digital Media BV - 009088 - Baxall Security Ltd + 001B6B + Swyx Solutions AG - 00906C - Sartorius Hamburg GmbH + 001B69 + Equaline Corporation - 0090A4 - Altiga Networks + 001B68 + Modnnet Co., Ltd - 0090F9 - Imagine Communications + 001B62 + JHT Optoelectronics Co.,Ltd. - 009089 - Softcom Microsystems Inc. + 001B3F + ProCurve Networking by HP - 0090EE - Personal Communications Technologies + 001B41 + General Infinity Co.,Ltd. - 009080 - NOT Limited Inc. + 001B3E + Curtis, Inc. - 0090E8 - Moxa Technologies Corp Ltd + 001B37 + Computec Oy - 0090A1 - Flying Pig Systems/High End Systems Inc. + 001B10 + ShenZhen Kang Hui Technology Co.,ltd - 009079 - ClearOne Inc. + 001B0B + Phidgets Inc. - 00909A - ONE World Systems Inc. + 001B0C + Cisco Systems, Inc - 0090C2 - JK microsystems Inc. + 001B23 + SimpleComTools - 0050D0 - Minerva Systems + 001B18 + Tsuken Electric Ind. Co.,Ltd - 0050D8 - Unicorn Computer Corp. + 001AF6 + Woven Systems, Inc. - 0050B2 - BRODEL GmbH + 001AF9 + AeroVIronment (AV Inc) - 009076 - FMT Aircraft Gate Support Systems AB + 001AE0 + Mythology Tech Express Inc. - 009017 - Zypcom Inc. + 001B50 + Nizhny Novgorod Factory named after M.Frunze, FSUE (NZiF) - 009049 - Entridia Corporation + 001B30 + Solitech Inc. - 0090E6 - ALi Corporation + 001B47 + Futarque A/S - 009070 - NEO Networks Inc. + 001B45 + ABB AS, Division Automation Products - 009030 - Honeywell-Dating + 001ABE + COMPUTER HI-TECH INC. - 009008 - HanA Systems Inc. + 001AC1 + 3Com Ltd - 0090AC - Optivision Inc. + 001ABB + Fontal Technology Incorporation - 00904E - Delem BV + 001ABD + Impatica Inc. - 0090ED - Central System Research Ltd + 001AAE + Savant Systems LLC - 00901E - Selesta Ingegneria S.p.A. + 001A58 + CCV Deutschland GmbH - Celectronic eHealth Div. - 009075 - NEC DO Brasil S.A. + 001A5E + Thincom Technology Co.,Ltd - 0090AD - Aspect Electronics Inc. + 001A87 + Canhold International Limited - 009001 - Nishimu Electronics Industries Ltd + 001A88 + Venergy,Co,Ltd - 009043 - Tattile SRL + 001A74 + Procare International Co - 0090CB - Wireless OnLine Inc. + 001AB4 + FFEI Ltd. - 001063 - Starguide Digital Networks + 001AB5 + Home Network System - 001023 - Network Equipment Technologies + 001A79 + TELECOMUNICATION TECHNOLOGIES LTD. - 00102B - Umax Data Systems Inc. + 001AAA + Analogic Corp. - 00908A - Bayly Communications Inc. + 001A8B + CHUNIL ELECTRIC IND., CO. - 00900E - Handlink Technologies Inc. + 001A8D + AVECS Bergen GmbH - 0090C1 - Peco II Inc. + 001A95 + Hisense Mobile Communications Technoligy Co.,Ltd. - 00108D - Johnson Controls Inc. + 001A81 + Zelax - 001045 - Nortel Networks + 001AD7 + Christie Digital Systems, Inc. - 00107D - Aurora Communications Ltd + 001ACD + Tidel Engineering LP - 0090E4 - NEC America Inc. + 001AE2 + Cisco Systems, Inc - 009040 - Siemens Network Convergence LLC + 001AE7 + Aztek Networks, Inc. - 0090C8 - Waverider Communications (Canada) Inc. + 001AC9 + SUZUKEN CO.,LTD - 00901B - Digital Controls + 001AA4 + Future University-Hakodate - 0090F7 - Nbase Communications Ltd + 001A9F + A-Link Ltd - 009012 - Globespan Semiconductor Inc. + 001A24 + Galaxy Telecom Technologies Ltd - 0090B7 - Digital Lightwave Inc. + 001A20 + CMOTECH Co. Ltd. - 0090A0 - 8X8 Inc. + 001A19 + Computer Engineering Limited - 009047 - Giga Fast E Ltd + 001A18 + Advanced Simulation Technology inc. - 0090E1 - Telena S.P.A. + 001A5C + Euchner GmbH+Co. KG - 009032 - Pelcombe Group Ltd + 001A5B + NetCare Service Co., Ltd. - 001062 - NX Server, Ilnc. + 001A4E + NTI AG / LinMot - 0010F0 - RITTAL-WERK RUDOLF LOH GmbH & Co. + 001A52 + Meshlinx Wireless Inc. - 001001 - Citel + 001A13 + Wanlida Group Co., LTD - 00105C - Quantum Designs (H.K.) Ltd + 001A0F + ARTECHE GROUP - 0010CF - Fiberlane Communications + 001A43 + Logical Link Communications - 001069 - Helioss Communications Inc. + 001A47 + Agami Systems, Inc. - 0010BF - InterAir Wireless + 001A03 + Angel Electronics Co., Ltd. - 001026 - Accelerated Networks Inc. + 0019F9 + TDK-Lambda - 001036 - Inter-TEL Integrated Systems + 0019F2 + Teradyne K.K. - 001039 - Vectron Systems AG + 001A2F + Cisco Systems, Inc - 0010B6 - Entrata Communications Corp. + 001A2D + The Navvo Group - 0010EC - Rpcg LLC + 00198D + Ocean Optics, Inc. - 001059 - Diablo Research Co. LLC + 001985 + IT Watchdogs, Inc - 0010FC - Broadband Networks Inc. + 001986 + Cheng Hongjian - 001031 - Objective Communications Inc. + 0019A9 + Cisco Systems, Inc - 00106D - Axxcelera Broadband Wireless + 0019AE + Hopling Technologies b.v. - 00104C - Teledyne LeCroy Inc. + 0019AF + Rigol Technologies, Inc. - 0010CC - CLP CoMPUTER LOGISTIK PLANUNG GmbH + 0019A7 + ITU-T - 001030 - EION Inc. + 0019DE + MOBITEK - 0010D0 - Witcom Ltd + 0019E5 + Lynx Studio Technology, Inc. - 001093 - CMS Computers Ltd + 0019DB + MICRO-STAR INTERNATIONAL CO., LTD. - 00108F - Raptor Systems + 00199E + Nifty - 0010A4 - Xircom + 00196A + MikroM GmbH - 0010F1 - I-O Corporation + 0019CE + Progressive Gaming International - 001066 - Advanced Control Systems Inc. + 0019BD + New Media Life - 0010AC - Imci Technologies + 00196B + Danpex Corporation - 0010B1 - FOR-A Ltd + 00199F + DKT A/S - 0010EE - CTI Products Inc. + 0018FF + PowerQuattro Co. - 001041 - Bristol Babcock Inc. + 0018F4 + EO TECHNICS Co., Ltd. - 0010AA - MEDIA4 Inc. + 0018F6 + Thomson Telecom Belgium - 0010E8 - Telocity Inc.orporated + 0018FC + Altec Electronic AG - 0010A2 - TNS + 0018F5 + Shenzhen Streaming Video Technology Company Limited - 001065 - Radyne Corporation + 0018F9 + VVOND, Inc. - 00109F - Pavo Inc. + 00193B + LigoWave - 00101D - Winbond Electronics Corp. + 001935 + DUERR DENTAL AG - 001084 - K-BOT Communications + 001932 + Gude Systems GmbH - 001000 - Cable Television Laboratories Inc. + 001931 + Balluff GmbH - 001009 - Horanet + 001914 + Winix Co., Ltd - 0010F8 - Texio Technology Corporation + 001901 + F1MEDIA - 0010C0 - ARMA Inc. + 001906 + Cisco Systems, Inc - 00105B - NET Insight AB + 00193D + GMC Guardian Mobility Corp. - 001002 - Actia + 001910 + Knick Elektronische Messgeraete GmbH & Co. KG - 0010EB - Selsius Systems Inc. + 001913 + Chuang-Yi Network Equipment Co.Ltd. - 001057 - Rebel.com Inc. + 001951 + NETCONS, s.r.o. - 0010F9 - Unique Systems Inc. + 0018FA + Yushin Precision Equipment Co.,Ltd. - 001075 - Segate Technology LLC + 0018EA + Alltec GmbH - 00E003 - Nokia Wireless Business Commun + 0018E8 + Hacetron Corporation - 00E0F3 - WebSprint Communications Inc. + 001957 + Saafnet Canada Inc. - 08BBCC - AK-NORD EDV VERTRIEBSGES. mbH + 001956 + Cisco Systems, Inc - 00E0DB - ViaVideo Communications Inc. + 001958 + Bluetooth SIG, Inc. - 00E0A6 - Telogy Networks Inc. + 0018E3 + Visualgate Systems, Inc. - 00E09F - Pixel Vision + 001899 + ShenZhen jieshun Science&Technology Industry CO,LTD. - 00E0CC - Hero Systems Ltd + 00189F + Lenntek Corporation - 00E080 - Control Resources Corporation + 0018B7 + D3 LED, LLC - 00E004 - PMC-Sierra Inc. + 0018C1 + Almitec Informática e Comércio - 00E03B - Prominet Corporation + 0018C4 + Raba Technologies LLC - 00E0F5 - Teles AG + 0018C9 + EOps Technology Limited - 00E0D7 - Sunshine Electronics Inc. + 0018BC + ZAO NVP Bolid - 00E0B5 - Ardent Communications Corp. + 00185D + TAIGUEN TECHNOLOGY (SHEN-ZHEN) CO., LTD. - 00E068 - Merrimac Systems Inc. + 00185E + Nexterm Inc. - 00E049 - MICROWI ELECTRONIC GmbH + 00186D + Zhenjiang Sapphire Electronic Industry CO. - 00E095 - Advanced-Vision Technolgies Corp. + 00186F + Setha Industria Eletronica LTDA - 00E00E - Avalon Imaging Systems Inc. + 001875 + AnaCise Testnology Pte Ltd - 00E048 - SDL Communications Inc. + 0018D8 + ARCH METER Corporation - 00E0CB - Reson Inc. + 0018D9 + Santosha Internatonal, Inc - 00E0C8 - Virtual Access Ltd + 0018CF + Baldor Electric Company - 00E006 - Silicon Integrated Sys. Corp. + 00188E + Ekahau, Inc. - 00E0AC - Midsco Inc. + 001883 + FORMOSA21 INC. - 00E008 - Amazing Controls! Inc. + 001895 + Hansun Technologies Inc. - 00E0AE - Xaqti Corporation + 00184A + Catcher, Inc. - 00E0E0 - SI Electronics Ltd + 00184B + Las Vegas Gaming, Inc. - 00E050 - Executone Information Systems Inc. + 0017BB + Syrinx Industrial Electronics - 00E023 - Telrad + 0017BC + Touchtunes Music Corporation - 00E02C - AST Computer + 0017C1 + CM Precision Technology LTD. - 00E067 - eac AUTOMATION-CoNSULTING GmbH + 0017B2 + SK Telesys - 00E0FA - TRL Technology Ltd + 0017B1 + ACIST Medical Systems, Inc. - 00E02A - Tandberg Television AS + 0017E1 + DACOS Technologies Co., Ltd. - 00E04E - Sanyo Denki Ltd + 0017E0 + Cisco Systems, Inc - 00E012 - Pluto Technologies International Inc. + 0017D2 + THINLINX PTY LTD - 00E04C - Realtek Semiconductor Corp. + 0017C7 + MARA Systems Consulting AB - 00E051 - Talx Corporation + 001814 + Mitutoyo Corporation - 00606B - Synclayer Inc. + 001817 + D. E. Shaw Research, LLC - 00603B - AMTEC spa + 001811 + Neuros Technology International, LLC. - 00E039 - Paradyne Corp. + 0017DE + Advantage Six Ltd - 00600B - LOGWARE GmbH + 0017D7 + ION Geophysical Corporation Inc. - 00E0C7 - Eurotech SRL + 001837 + Universal ABIT Co., Ltd. - 00E0AF - General Dynamics Information Systems + 001822 + CEC TELECOM CO.,LTD. - 00E054 - Kodai Hitec Ltd + 001820 + w5networks - 00E0B9 - Byas Systems + 0017B8 + NOVATRON CO., LTD. - 00604B - Safe-Com GmbH & Co. KG + 001828 + e2v technologies (UK) ltd. - 00E0EF - Dionex + 001835 + Thoratec / ITC - 00E02D - InnoMediaLogic Inc. + 00180E + Avega Systems - 00E035 - Artesyn Embedded Technologies + 001801 + Actiontec Electronics, Inc - 00E090 - Beckman LAB. Automation Div. + 0017F3 + Harris Corporation - 006001 - InnoSys Inc. + 001750 + GSI Group, MicroE Systems - 0060FE - Lynx System Developers Inc. + 001755 + GE Security - 0060BD - Enginuity Communications + 001751 + Online Corporation - 000800 - Multitech Systems Inc. + 0017A3 + MIX s.r.l. - 00E085 - Global Maintech Inc. + 0017A6 + YOSIN ELECTRONICS CO., LTD. - 00E0BE - Genroco International Inc. + 00179C + DEPRAG SCHULZ GMBH u. CO. - 00E0B6 - Entrada Networks + 001796 + Rittmeyer AG - 00E0F4 - INSIDE Technology A/S + 001775 + TTE Germany GmbH - 00E0A0 - Wiltron Co. + 001776 + Meso Scale Diagnostics, LLC - 00E0F1 - That Corporation + 001779 + QuickTel - 0060D5 - AMADA MIYACHI Ltd + 001767 + Earforce AS - 00603F - Patapsco Designs + 00177C + Smartlink Network Systems Limited - 0060B5 - KEBA GmbH + 001781 + Greystone Data System, Inc. - 006014 - Edec Ltd + 001785 + Sparr Electronics Ltd - 0060AC - Resilience Corporation + 00172C + TAEJIN INFOTECH - 00604E - Cycle Computer Corporation Inc. + 00174C + Millipore - 0060E1 - Orckit Communications Ltd + 001745 + INNOTZ CO., Ltd - 0060D2 - Lucent Technologies Taiwan Telecommunications Ltd + 001748 + Neokoros Brasil Ltda - 006042 - TKS (USA) Inc. + 00178D + Checkpoint Systems, Inc. - 006079 - Mainstream Data Inc. + 00178E + Gunnebo Cash Automation AB - 00609A - NJK Techno Co. + 001763 + Essentia S.p.A. - 00602B - Peak Audio + 00175D + Dongseo system. - 0060F1 - EXP Computer Inc. + 001739 + Bright Headphone Electronics Company - 0060E6 - Shomiti Systems Incorporated + 00171D + DIGIT - 0060FF - QuVis Inc. + 001718 + Vansco Electronics Oy - 006067 - Acer Netxus Inc. + 001719 + Audiocodes USA, Inc - 00609F - Phast Corporation + 0016FF + Wamin Optocomm Mfg Corp - 006040 - Netro Corp. + 001701 + KDE, Inc. - 0060CC - Emtrak Inc.orporated + 00170E + Cisco Systems, Inc - 00602C - LINX Data Terminals Inc. + 001705 + Methode Electronics - 00607E - Gigalabs Inc. + 0016DA + Futronic Technology Co. Ltd. - 0060CD - VideoServer Inc. + 0016D4 + Compal Communications, Inc. - 0060AA - Intelligent Devices Inc. (IDI) + 0016D7 + Sunways AG - 006025 - Active Imaging PLC + 0016D1 + ZAT a.s. - 0060A7 - MICROSENS GmbH & Co. KG + 001711 + Cytiva Sweden AB - 0005A8 - Wyle Electronics + 001717 + Leica Geosystems AG - 0060E5 - Fuji Automation Ltd + 001715 + Qstik - 00605E - Liberty Technology Networking + 0016C5 + Shenzhen Xing Feng Industry Co.,Ltd - 0060C6 - DCS AG + 0016CC + Xcute Mobile Corp. - 00601E - Softlab Inc. + 0016EE + Royaldigital Inc. - 00605D - Scanivalve Corp. + 0016ED + Utility, Inc - 00606F - Clarion Corporation Of America + 0016DE + FAST Inc - 00A010 - Syslogic Datentechnik AG + 001672 + Zenway enterprise ltd - 00A059 - Hamilton Hallmark + 001671 + Symphox Information Co. - 00A039 - Ross Technology Inc. + 001669 + MRV Communication (Networks) LTD - 00A0AD - Marconi SPA + 001668 + Eishin Electronics - 00A0D6 - SBE Inc. + 001655 + FUHO TECHNOLOGY Co., LTD - 00A02E - Brand Communications Ltd + 001646 + Cisco Systems, Inc - 00604A - Saic Ideas Group + 001648 + SSD Company Limited - 00A0BD - I-Tech Corp. + 0016AA + Kei Communication Technology Inc. - 006090 - Artiza Networks Inc + 0016A8 + CWT CO., LTD. - 00600D - Digital Logic GmbH + 0016A6 + Dovado FZ-LLC - 006030 - Village Tronic Entwicklung + 0016A2 + CentraLite Systems, Inc. - 00A08D - Jacomo Corporation + 00167D + Sky-Line Information Co., Ltd. - 00A08E - Check Point Software Technologies + 001677 + Bihl + Wiedemann GmbH - 00A0FC - Image Sciences Inc. + 00165A + Harman Specialty Group - 00A09C - Xyplex Inc. + 001659 + Z.M.P. RADWAG - 00A00D - THE Panda Project + 0016C7 + Cisco Systems, Inc - 00A0E9 - Electronic Retailing Systems International + 001695 + AVC Technology (International) Limited - 00A0BE - Integrated Circuit Systems Inc. Communications Group + 0015DF + Clivet S.p.A. - 00A016 - Micropolis Corp. + 0015D8 + Interlink Electronics - 00A048 - Questech Ltd + 0015D2 + Xantech Corporation - 00A003 - Siemens Switzerland Ltd I B T HVP + 0015D4 + Emitor AB - 00A0F9 - Bintec Communications GmbH + 0015D6 + OSLiNK Sp. z o.o. - 00A0F5 - Radguard Ltd + 0015D5 + NICEVT - 00A0CA - Fujitsu Denso Ltd + 0015F1 + KYLINK Communications Corp. - 00A022 - Centre FOR Development Of Advanced Computing + 0015E2 + Dr.Ing. Herbert Knauer GmbH - 00A0B6 - Sanritz Automation Ltd + 0015E1 + Picochip Ltd - 00A079 - Alps Electric (USA) Inc. + 00160C + LPL DEVELOPMENT S.A. DE C.V - 00A0C0 - Digital Link Corp. + 001612 + Otsuka Electronics Co., Ltd. - 00A01E - EST Corporation + 00160B + TVWorks LLC - 00A0AE - Nucom Systems Inc. + 001603 + COOLKSKY Co., LTD - 00A062 - AES Prodata + 001609 + Unitech electronics co., ltd. - 00A076 - Cardware LAB Inc. + 001640 + Asmobile Communication Inc. - 00A0A1 - Epic Data Inc. + 00163C + Rebox B.V. - 00A044 - NTT IT Ltd + 001619 + Lancelan Technologies S.L. - 00A011 - Mutoh Industries Ltd + 00161D + Innovative Wireless Technologies, Inc. - 00A0BA - Patton Electronics Co. + 001611 + Altecon Srl - 00A0B5 - 3H Technology + 0015C7 + Cisco Systems, Inc - 00A04D - EDA Instruments Inc. + 001625 + Impinj, Inc. - 00A086 - Amber Wave Systems Inc. + 001623 + Interval Media - 00A0AF - WMS Industries + 0015F5 + Sustainable Energy Systems - 00A057 - LANCOM Systems GmbH + 00158B + Park Air Systems Ltd - 00A030 - Captor NV/SA + 001586 + Xiamen Overseas Chinese Electronic Co., Ltd. - 00A0DE - Yamaha Corporation + 00157E + Weidmüller Interface GmbH & Co. KG - 00A084 - Dataplex Pty Ltd + 001580 + U-WAY CORPORATION - 00A049 - Digitech Industries Inc. + 00157C + Dave Networks, Inc. - 00A09D - Johnathon Freeman Technologies + 00157F + ChuanG International Holding CO.,LTD. - 00A06B - DMS Dorsch Mikrosystem GmbH + 001533 + NADAM.CO.,LTD - 00A0F8 - Zebra Technologies Inc + 001537 + Ventus Networks - 00A09F - Commvision Corp. + 001534 + A Beltrónica-Companhia de Comunicações, Lda - 00A06E - Austron Inc. + 00159D + Tripp Lite - 002022 - NMS Communications + 001592 + Facom UK Ltd (Melksham) - 0020AE - Ornet Data Communication Tech. + 00155C + Dresser Wayne - 0020AA - Ericsson Television Limited + 001559 + Securaplane Technologies, Inc. - 0020A4 - Multipoint Networks + 001557 + Olivetti - 000267 - Node Runner Inc. + 001554 + Atalum Wireless S.A. - 0020B1 - Comtech Research Inc. + 0015B3 + Caretech AB - 002032 - Alcatel Taisel + 0015AA + Rextechnik International Co., - 0020E9 - Dantel + 00153F + Alcatel Alenia Space Italia - 002038 - VME Microsystems International Corporation + 001576 + LABiTec - Labor Biomedical Technologies GmbH - 0020A3 - Harmonic Inc. + 0015BE + Iqua Ltd. - 002059 - Miro Computer Products AG + 00155E + Morgan Stanley - 002034 - Rotec Industrieautomation GmbH + 001502 + BETA tech - 002079 - Mikron GmbH + 0014FD + Thecus Technology Corp. - 002005 - Simple Technology + 0014FC + Extandon, Inc. - 002018 - CIS Technology Inc. + 0014F8 + Scientific Atlanta - 002098 - Hectronic AB + 0014F7 + CREVIS Co., LTD - 0020FD - ITV Technologies Inc. + 00150F + mingjong - 0020FA - GDE Systems Inc. + 00150B + SAGE INFOTECH LTD. - 0020C1 - SAXA Inc. + 001507 + Renaissance Learning Inc - 002080 - Synergy (UK) Ltd + 001508 + Global Target Enterprise Inc - 00C023 - Tutankhamon Electronics + 0014E5 + Alticast - 00C08B - Risq Modular Systems Inc. + 0014E0 + LET'S Corporation - 0020C4 - Inet,Inc. + 0014E2 + datacom systems inc. - 002074 - Sungwoon Systems + 0014E4 + infinias, LLC - 00203C - Eurotime AB + 001518 + Shenzhen 10MOONS Technology Development CO.,Ltd - 002028 - West EGG Systems Inc. + 001515 + Leipold+Co.GmbH - 002068 - Isdyne + 001526 + Remote Technologies Inc - 0020C8 - Larscom Incorporated + 0014F1 + Cisco Systems, Inc - 00209D - Lippert Automationstechnik + 0014EA + S Digm Inc. (Safe Paradigm Inc.) - 00209C - Primary Access Corp. + 0014CB + LifeSync Corporation - 00206D - Data Race Inc. + 0014C6 + Quixant Ltd - 00203A - Digital BI0METRICS Inc. + 0014DB + Elma Trenew Electronic GmbH - 002048 - Marconi Communications + 0014CC + Zetec, Inc. - 0020DC - Densitron Taiwan Ltd + 001474 + K40 Electronics - 00200C - Adastra Systems Corp. + 00146F + Kohler Co - 002011 - Canopus Ltd + 001466 + Kleinhenz Elektronik GmbH - 002051 - Verilink Corporation + 00146B + Anagran, Inc. - 00203B - Wisdm Ltd + 00149F + System and Chips, Inc. - 0020BA - Center FOR High Performance + 001498 + Viking Design Technology - 0020F5 - Pandatel AG + 001496 + Phonic Corp. - 00200E - NSSLGlobal Technologies AS + 001493 + Systimax Solutions - 0020E7 - B&W Nuclear Service Company + 00143D + Aevoe Inc. - 0020F0 - Universal Microelectronics Co. + 00143A + RAYTALK INTERNATIONAL SRL - 002089 - T3PLUS Networking Inc. + 001461 + CORONA CORPORATION - 002061 - GarrettCom Inc. + 001462 + Digiwell Technology, inc - 00C080 - Netstar Inc. + 001463 + IDCS N.V. - 00C0B4 - Myson Technology Inc. + 001465 + Novo Nordisk A/S - 00C045 - Isolation Systems Ltd + 00148D + Cubic Defense Simulation Systems - 0070B3 - Data Recall Ltd + 001486 + Echo Digital Audio Corporation - 0070B0 - M/A-CoM Inc. Companies + 001482 + Aurora Networks - 00E6D3 - Nixdorf Computer Corp. + 001436 + Qwerty Elektronik AB - 00C0C3 - Acuson Computed Sonography + 001433 + Empower Technologies(Canada) Inc. - 00C0B3 - Comstat Datacomm Corporation + 001434 + Keri Systems, Inc - 00C0E5 - Gespac, S.A. + 00147F + Thomson Telecom Belgium - 00C04D - Mitec Inc. + 001475 + Wiline Networks, Inc. - 00C047 - Unimicro Systems Inc. + 001455 + Coder Electronics Corporation - 00C084 - Data Link Corp Ltd + 00144E + SRISA - 00C041 - Digital Transmission Systems + 0014B3 + CoreStar International Corp - 00C01F - S.E.R.C.E.L. + 0014B1 + Axell Wireless Limited - 006086 - Logic Replacement Tech Ltd + 0013A4 + KeyEye Communications - 00C059 - Denso Corporation + 0013A7 + BATTELLE MEMORIAL INSTITUTE - 00C0F1 - Shinko Electric Ltd + 0013A6 + Extricom Ltd - 00C0A1 - Tokyo Denshi Sekei Co. + 00139F + Electronics Design Services, Co., Ltd. - 00C02E - Netwiz + 0013A2 + MaxStream, Inc - 00C00D - Advanced Logic Research Inc. + 0013A0 + ALGOSYSTEM Co., Ltd. - 00C081 - Metrodata Ltd + 001398 + TrafficSim Co.,Ltd - 00C03B - Multiaccess Computing Corp. + 001415 + Intec Automation inc. - 00C082 - Moore Products Co. + 001410 + Suzhou Keda Technology CO.,Ltd - 00C099 - Yoshiki Industrial Ltd + 001417 + RSE Informations Technologie GmbH - 00C001 - Diatek Patient Managment + 001408 + Eka Systems Inc. - 00C0F4 - Interlink System Ltd + 001423 + J-S Co. NEUROCOM - 00C0E2 - Calcomp Inc. + 001425 + Galactic Computing Corp. - 00C07B - Ascend Communications Inc. + 001419 + SIDSA - 00C03C - Tower Tech S.R.L. + 0013E2 + GeoVision Inc. - 00C01D - Grand Junction Networks Inc. + 0013DE + Adapt4, LLC - 00C035 - Quintar Company + 0013DD + Abbott Diagnostics - 00C070 - Sectra Secure-Transmission AB + 0013D7 + SPIDCOM Technologies SA - 00C06D - Boca Research Inc. + 0013C7 + IONOS Co.,Ltd. - 00C0EA - Array Technology Ltd + 0013B2 + Carallon Limited - 00C009 - KT Technology (S) PTE Ltd + 0013AD + Sendo Ltd - 00C0D6 - J1 Systems Inc. + 0013AA + ALS & TEC Ltd. - 00C0DC - EOS Technologies Inc. + 0013EE + JBX Designs Inc. - 00C072 - KNX Ltd + 0013E5 + TENOSYS, INC. - 00C0AE - Towercom Co Inc. DBA PC House + 001402 + kk-electronic a/s - 00C0C2 - Infinite Networks Ltd + 0013FF + Dage-MTI of MC, Inc. - 00C0AF - Teklogix Inc. + 0013BC + Artimi Ltd - 00C07A - Priva B.V. + 001384 + Advanced Motion Controls - 00C0F6 - Celan Technology Inc. + 00137B + Movon Corporation - 00C0F8 - About Computing Inc. + 00134A + Engim, Inc. - 00C078 - Computer Systems Engineering + 00133A + VadaTech Inc. - 00C09A - Photonics Corporation + 00132A + Sitronics Telecom Solutions - 00C01A - Corometrics Medical Systems + 00139B + ioIMAGE Ltd. - 00C068 - HME Clear- Ltd + 001396 + Acbel Polytech Inc. - 00C0D8 - Universal Data Systems + 001393 + Panta Systems, Inc. - 004016 - ADC - Global Connectivity Solutions Division + 00138B + Phantom Technologies LLC - 00406A - Kentek Information Systems,Inc + 001388 + WiMedia Alliance - 00400A - Pivotal Technologies Inc. + 001353 + HYDAC Filtertechnik GMBH - 004099 - Newgen Systems Corp. + 00134D + Inepro BV - 004011 - Andover Controls Corporation + 00134B + ToGoldenNet Technology Inc. - 0040A1 - Ergo Computing + 001334 + Arkados, Inc. - 004081 - Mannesmann Scangraphic GmbH + 001337 + Orient Power Home Network Ltd. - 00C08C - Performance Technologies Inc. + 001332 + Beijing Topsec Network Security Technology Co., Ltd. - 00C007 - Pinnacle Data Systems Inc. + 00131F + NxtPhase T&D, Corp. - 00C098 - Chuntex Electronic Ltd + 00136E + Techmetro Corp. - 00C0BE - Alcatel - SEL + 00136D + Tentaculus AB - 00C06E - Haft Technology Inc. + 00136A + Hach Lange Sarl - 00C08A - Lauterbach GmbH + 00130E + Focusrite Audio Engineering Limited - 00C0F7 - Engage Communication Inc. + 001309 + Ocean Broadband Networks - 0040B7 - Stealth Computer Systems + 001319 + Cisco Systems, Inc - 0040AC - Super Workstation Inc. + 00131C + LiteTouch, Inc. - 10005A - IBM Corp + 001363 + Verascape, Inc. - 0040D1 - Fukuda Denshi Ltd + 0012FF + Lely Industries N.V. - 004069 - Lemcom Systems Inc. + 001303 + GateConnect - 00403B - Synerjet International Corp. + 0012F9 + URYU SEISAKU, LTD. - 00803B - APT Communications Inc. + 001304 + Flaircomm Technologies Co. LTD - 00806A - ERI (Empac Research Inc.) + 0012B3 + Advance Wireless Technology Corp. - 00C0A8 - GVC Corporation + 0012B0 + Efore Oyj (Plc) - 0040E0 - Atomwide Ltd + 0012A6 + Dolby Australia - 0040A8 - IMF International Ltd + 0012A4 + ThingMagic, LLC - 004070 - Interware Ltd + 0012A9 + 3Com Ltd - 00408A - TPS Teleprocessing Sys. GmbH + 0012DC + SunCorp Industrial Limited - 0040FD - LXE + 0012D7 + Invento Networks, Inc. - 00403F - Ssangyong Computer Systems + 0012C4 + Viseon, Inc. - 004082 - Laboratory Equipment Corp. + 0012D0 + Gossen-Metrawatt-GmbH - 0040F1 - Chuo Electronics Ltd + 0012E5 + Time America, Inc. - 0040A9 - Datacom Inc. + 0012B8 + G2 Microsystems - 0040E3 - Quin Systems Ltd + 001299 + Ktech Telecommunications Inc - 004091 - Procomp Industria Eletronica + 001280 + Cisco Systems, Inc - 0040EA - Plain Tree Systems Inc + 001275 + Sentilla Corporation - 0040A7 - Itautec Philco S.A. + 001276 + CG Power Systems Ireland Limited - 004064 - KLA Instruments Corporation + 001271 + Measurement Computing Corp - 004043 - Nokia Siemens Networks GmbH & Co. KG. + 001273 + Stoke Inc - 00405A - Goldstar Information & Comm. + 001269 + Value Electronics - 004013 - NTT Data Comm. Systems Corp. + 001264 + daum electronic gmbh - 00400C - General Micro Systems Inc. + 001261 + Adaptix, Inc - 00405E - North Hills Israel + 001260 + Stanton Magnetics,inc. - 0040FA - Microboards Inc. + 00128C + Woodward Governor - 004014 - Comsoft GmbH + 001293 + ABB Switzerland Ltd. - 004000 - PCI Componentes DA Amzonia Ltd + 001294 + SUMITOMO ELECTRIC DEVICE INNOVATIONS, INC - 00406C - Copernique + 001296 + Addlogix - 004075 - Tattile SRL + 001258 + TechVoIP Sp z o.o. - 004053 - Ampro Computers + 001250 + Tokyo Aircaft Instrument Co., Ltd. - 008038 - Data Research & Applications + 001252 + Citronix, LLC - 00805E - LSI Logic Corporation + 00127F + Cisco Systems, Inc - 008060 - Network Interface Corporation + 00127B + VIA Networking Technologies, Inc. - 0080C3 - Bicc Information Systems & SVC + 001240 + AMOI ELECTRONICS CO.,LTD - 008044 - Systech Computer Corp. + 00122E + Signal Technology - AISD - 008006 - Compuadd Corporation + 001231 + Motion Control Systems, Inc. - 00809B - Justsystem Corporation + 001224 + NexQL Corporation - 0080DF - ADC Codenoll Technology Corp. + 00124B + Texas Instruments - 008028 - Tradpost (HK) Ltd + 00124A + Dedicated Devices, Inc. - 008061 - Litton Systems Inc. + 001243 + Cisco Systems, Inc - 0080F5 - Quantel Ltd + 001203 + ActivNetworks - 0080B9 - Arche Technoligies Inc. + 0011F8 + AIRAYA Corp - 004063 - VIA Technologies Inc. + 0011F4 + woori-net - 00808A - Summit Microsystems Corp. + 0011F6 + Asia Pacific Microsystems , Inc. - 0080A7 - Honeywell International Inc + 0011F0 + Wideful Limited - 008066 - Arcom Control Systems Ltd + 0011F1 + QinetiQ Ltd - 0080CB - Falco Data Products + 0011AA + Uniclass Technology, Co., LTD - 008007 - Dlog NC-Systeme + 0011B1 + BlueExpert Technology Corp. - 008062 - Interface Co. + 0011DB + Land-Cellular Corporation - 00801E - Xinetron Inc. + 0011D2 + Perception Digital Ltd - 0080E2 - T.D.I Ltd + 0011D9 + TiVo - 008049 - Nissin Electric Ltd + 0011CF + Thrane & Thrane A/S - 0080C1 - Lanex Corporation + 0011D4 + NetEnrich, Inc - 0080A3 - Lantronix + 0011D5 + Hangzhou Sunyard System Engineering Co.,Ltd. - 0080BC - Hitachi Engineering Ltd + 0011CC + Guangzhou Jinpeng Group Co.,Ltd. - 008036 - Reflex Manufacturing Systems + 0011C7 + Raymarine UK Ltd - 008083 - Amdahl + 0011C9 + MTT Corporation - 0080B8 - DMG Mori B.U.G Ltd + 001211 + Protechna Herbst GmbH & Co. KG - 00804D - Cyclone Microsystems Inc. + 001219 + General Datacomm LLC - 0080D4 - Chase Research Ltd + 001216 + ICP Internet Communication Payment AG - 00803D - Surigiken Co. Ltd + 001215 + iStor Networks, Inc. - 00808B - Dacoll Limited + 0011A6 + Sypixx Networks - 0080B2 - Network Equipment Technologies + 0011A2 + Manufacturing Technology Inc - 008076 - Mcnc + 00119E + Solectron Brazil - 00800B - CSK Corporation + 0011B5 + Shenzhen Powercom Co.,Ltd - 008018 - Kobe Steel Ltd + 0011BB + Cisco Systems, Inc - 008068 - Yamatech Scientific Ltd + 0011BD + Bombardier Transportation - 0080A8 - Vitacom Corporation + 0011ED + 802 Global - 008033 - EMS Aviation Inc. + 00111C + Pleora Technologies Inc. - 00807C - Fibercom Inc. + 001125 + IBM Corp - 008091 - Tokyo Electric Ltd + 00111F + Doremi Labs, Inc. - 00008E - Solbourne Computer Inc. + 00111D + Hectrix Limited - 0000DC - Hayes Microcomputer Products + 001119 + Solteras, Inc. - 000063 - Barco Control Rooms GmbH + 001184 + Humo Laboratory,Ltd. - 00004E - Ampex Corporation + 00117E + Midmark Corp - 00002E - Societe Evira + 001152 + Eidsvoll Electronics AS - 00003F - Syntrex Inc. + 001150 + Belkin Corporation - 00809D - Commscraft Ltd + 001166 + Taelim Electronics Co., Ltd. - 0080F4 - Telemecanique Electrique + 001164 + ACARD Technology Corp. - 008022 - Scan-Optics + 001155 + Sevis Systems - 0000CD - Allied Telesis Labs Ltd + 001146 + Telecard-Pribor Ltd - 0080DD - GMX Inc/Gimix + 00114C + caffeina applied research ltd. - 0080FB - BVM Limited + 001141 + GoodMan Corporation - 0080B4 - Sophia Systems + 00118A + Viewtran Technology Limited - 00807F - DY-4 Incorporated + 001179 + Singular Technology Co. Ltd. - 00802D - Xylogics Inc + 001173 + SMART Storage Systems - 000061 - Gateway Communications + 00112C + IZT GmbH - 0000EA - Upnod AB + 000FCF + DataWind Research - 000043 - Micro Technology + 000FD2 + EWA Technologies, Inc. - 000017 - Oracle + 000FCE + Kikusui Electronics Corp. - 0000B2 - Televideo Systems Inc. + 000FA1 + Gigabit Systems Inc. - 0000EE - Network Designers Ltd + 000F99 + APAC opto Electronics Inc. - 0000E5 - Sigmex Ltd + 000FE8 + Lobos, Inc. - 000089 - Cayman Systems Inc. + 000FEB + Cylon Controls - 0000FF - Camtec Electronics Ltd + 000FDC + Ueda Japan Radio Co., Ltd. - 0000B7 - Dove Computer Corporation + 000FF4 + Guntermann & Drunck GmbH - 0000F2 - Spider Communications + 000FF8 + Cisco Systems, Inc - 0000CC - Densan Ltd + 000FF5 + GN&S company - 0000A4 - Acorn Computers Limited + 000FD7 + Harman Music Group - 0000DB - British Telecommunications plc + 000FD4 + Soundcraft - 0000C1 - Madge Ltd + 001114 + EverFocus Electronics Corp. - 0000F6 - Applied Microsystems Corp. + 00110E + Tsurusaki Sealand Transportation Co. Ltd. - 000077 - Interphase Corporation + 00110D + SANBlaze Technology, Inc. - 0000A2 - Bay Networks + 000FA5 + BWA Technology GmbH - 0000EC - Microprocess + 000FB2 + Broadband Pacenet (India) Pvt. Ltd. - 0000C2 - Information Presentation Tech. + 001106 + Siemens NV (Belgium) - 0000FC - Meiko + 000FAF + Dialog Inc. - 00006D - Cray Communications Ltd + 000F43 + Wasabi Systems Inc. - 0000DA - Atex + 000F48 + Polypix Inc. - 0000DD - TCL Incorporated + 000F50 + StreamScale Limited - 0000AE - Dassault Electronique + 000F47 + ROBOX SPA - 0000A0 - SANYO Electric Ltd + 000F4E + Cellink - 0000C0 - Western Digital Corporation + 000F31 + Allied Vision Technologies Canada Inc - 000033 - Egan Machinery Company + 000F29 + Augmentix Corporation - 00009D - Locus Computing Corporation + 000F27 + TEAL Electronics, Inc. - 0000FD - High Level Hardware + 000F8E + DONGYANG TELECOM CO.,LTD. - 000065 - Network General Corporation + 000F91 + Aerotelecom Co.,Ltd. - 000011 - Normerel Systemes + 000F73 + RS Automation Co., Ltd - 000010 - Sytek Inc. + 000F78 + Datacap Systems Inc - 0000BC - Rockwell Automation + 000F70 + Wintec Industries, inc. - 08007E - Amalgamated Wireless(AUS) Ltd + 000F87 + Maxcess International - 08007F - Carnegie-Mellon University + 000F80 + Trinity Security Systems,Inc. - 000099 - MTX Inc. + 000F5F + Nicety Technologies Inc. (NTS) - 0000C4 - Waters Div. Of Millipore + 000F5A + Peribit Networks - 0000EB - Matsushita Comm. Ind Ltd + 000F74 + Qamcom Technology AB - 000028 - Prodigy Systems Corporation + 000F6D + Midas Engineering - 08003B - Torus Systems Limited + 000F3C + Endeleo Limited - 08003C - Schlumberger Well Services + 000F18 + Industrial Control Systems - 080034 - Filenet Corporation + 000F1D + Cosmo Techs Co., Ltd. - 080036 - Intergraph Corporation + 000F1B + Ego Systems Inc. - 080033 - Bausch & Lomb + 000F0F + Real ID Technology Co., Ltd. - 080048 - Eurotherm Gauging Systems + 000F16 + JAY HOW TECHNOLOGY CO., - 080043 - Pixel Computer Inc. + 000EF8 + SBC ASI - 080045 - Concurrent Computer Corp. + 000EF9 + REA Elektronik GmbH - 080078 - Accell Corporation + 000EF6 + E-TEN Information Systems Co., Ltd. - 08006D - Whitechapel Computer Works + 000EEA + Shadong Luneng Jicheng Electronics,Co.,Ltd - 080030 - Network Research Corporation + 000EAD + Metanoia Technologies, Inc. - 080031 - Little Machines Inc. + 000EAF + CASTEL - 08002E - Metaphor Computer Systems + 000EE6 + Adimos Systems LTD - 080056 - Stanford Linear Accel. Center + 000EC6 + ASIX ELECTRONICS CORP. - 08004F - Cygnet Systems + 000EBF + Remsdaq Limited - 080050 - Daisy Systems Corp. + 000EE0 + Mcharge - 08005E - Counterpoint Computer Inc. + 000EAB + Cray Inc - 080076 - PC LAN Technologies + 000E9F + TEMIC SDS GmbH - 080075 - Dansk Data Electronik + 000E92 + Open Telecom - 08002B - Digital Equipment Corporation + 000E96 + Cubic Defense Applications, Inc. - 080029 - Megatek Corporation + 000E8E + SparkLAN Communications, Inc. - 0270B0 - M/A-CoM Inc. Companies + 000E91 + Navico Auckland Ltd - 000053 - Compucorp + 000E14 + Visionary Solutions, Inc. - 080090 - Sonoma Systems + 000E1B + IAV GmbH - 08000A - Nestar Systems Incorporated + 000E0F + ERMME - 00800F - Standard Microsystems + 000E10 + C-guys, Inc. - 00406B - Sysgen + 000E13 + Accu-Sort Systems inc. - 08000F - Mitel Corporation + 000E0A + SAKUMA DESIGN OFFICE - 080023 - Panasonic Communications Ltd + 000E7C + Televes S.A. - B04FC3 - Shenzhen NVC Cloud Technology Ltd + 000E73 + Tpack A/S - 08001C - KDD-Kokusai Debnsin Denwa Co. + 000E6E + MAT S.A. (Mircrelec Advanced Technology) - 00DD0C - Ungermann-Bass Inc. + 000E56 + 4G Systems GmbH & Co. KG - 080018 - Pirelli Focom Networks + 000E55 + AUVITRAN - 0000A6 - Network General Corporation + 000E53 + AV TECH CORPORATION - 00BBF0 - Ungermann-Bass Inc. + 000E66 + Hitachi Industry & Control Solutions, Ltd. - 00408E - Tattile SRL + 000E68 + E-TOP Network Technology Inc. - 000004 - Xerox Corporation + 000E33 + Shuko Electronics Co.,Ltd - 00DD0E - Ungermann-Bass Inc. + 000E3A + Cirrus Logic - 88571D - Seongji Industry Company + 000E3B + Hawking Technologies, Inc. - 7CF31B - LG Electronics (Mobile Communications) + 000E84 + Cisco Systems, Inc - 0001C8 - Thomas Conrad Corp. + 000E87 + adp Gauselmann GmbH - CCEF03 - Hunan Keyshare Communication Technology Ltd + 000E75 + New York Air Brake Corp. - 102FA3 - Shenzhen Uvision-tech Technology Ltd + 000E48 + Lipman TransAction Solutions - 7048F7 - Nintendo Ltd + 000E3E + Sun Optronics Inc - 18E1CA - wanze + 000E27 + Crere Networks, Inc. - ECBEDD - Sagemcom Broadband SAS + 000E18 + MyA Technology - 00C0B6 - HVE Inc. + 000D9B + Heraeus Electro-Nite International N.V. - 309176 - Skyworth Digital Technology(Shenzhen) Ltd + 000D8A + Winners Electronics Co., Ltd. - 78C881 - Sony Interactive Entertainment Inc. + 000D8E + Koden Electronics Co., Ltd. - D44F68 - Eidetic Communications Inc + 000DCD + GROUPE TXCOM - 749EA5 - Ohsung + 000DCF + Cidra Corp. - 8CC84B - Chongqing Fugui Electronics Ltd + 000DCA + Tait Electronics - 0C2FB0 - Samsung Electronics Ltd + 000DDE + Joyteck Co., Ltd. - B40216 - Cisco Systems Inc. + 000DE2 + CMZ Sistemi Elettronici - 54A493 - IEEE Registration Authority + 000DDA + ALLIED TELESIS K.K. - 6C1C71 - Zhejiang Dahua Technology Ltd + 000DD6 + ITI LTD - CC6A10 - The Chamberlain Group Inc. + 000DD5 + O'RITE TECHNOLOGY CO.,LTD - F03F95 - Huawei Technologies Ltd + 000E0E + ESA elettronica S.P.A. - 185644 - Huawei Technologies Ltd + 000DFD + Huges Hi-Tech Inc., - 9C69D1 - Huawei Technologies Ltd + 000DF9 + NDS Limited - 185A58 - Dell Inc. + 000DFB + Komax AG - C43A35 - FN-Link Technology Limited + 000E00 + Atrie - 04D16E - IEEE Registration Authority + 000DF4 + Watertek Co. - 040E3C - HP Inc. + 000DFA + Micro Control Systems Ltd. - C4E0DE - Zhengzhou XindaJiean Information Technology Ltd + 000DFC + ITFOR Inc. - 901A4F - EM Microelectronic + 000DFE + Hauppauge Computer Works, Inc. - C84F0E - Integrated Device Technology (Malaysia) Sdn. Bhd. + 000DB8 + SCHILLER AG - 6CD2BA - ZTE Corporation + 000DC4 + Emcore Corporation - 303ABA - Guangzhou BaoLun Electronics Ltd + 000DEC + Cisco Systems, Inc - D88ADC - Huawei Device Ltd + 000DF2 + Private - 10E953 - Huawei Device Ltd + 000DA0 + NEDAP N.V. - 7C48B2 - Vida Resources Lte Ltd + 000D4F + Kenwood Corporation - 2CAB33 - Texas Instruments + 000D47 + Collex - B887C6 - Prudential Technology Ltd + 000D43 + DRS Tactical Systems Inc. - EC9C32 - Sichuan AI-Link Technology Ltd + 000D44 + Audio BU - Logitech - 4CADA8 - Panoptics Corp. + 000D3D + Hammerhead Systems, Inc. - FC1CA1 - Nokia + 000D3E + APLUX Communications Ltd. - D42DC5 - Panasonic i-PRO Sensing Solutions Ltd + 000D5A + Tiesse SpA - E8D03C - Shenzhen Jingxun Software Telecommunication Technology Ltd + 000D61 + Giga-Byte Technology Co., Ltd. - 1C1ADF - Microsoft Corporation + 000D36 + Wu Han Routon Electronic Co., Ltd - D4F547 - Google Inc. + 000D3B + Microelectronics Technology Inc. - 981BB5 - ASSA ABLOY Korea Ltd iRevo + 000D1A + Mustek System Inc. - 34CB1A - Procter & Gamble Company + 000D1E + Control Techniques - F0B107 - Ericsson AB + 000D0D + ITSupported, LLC - 784F9B - Juniper Networks + 000D06 + Compulogic Limited - 783A6C - Tecno Mobile Limited + 000D52 + Comart system - E04007 - Huawei Device Ltd + 000D4A + Steag ETA-Optik - 383FB3 - Technicolor CH USA Inc. + 000D7C + Codian Ltd - 70CE8C - Samsung Electronics Ltd + 000D6B + Mita-Teknik A/S - 4070F5 - Apple + 000D71 + boca systems - B035B5 - Apple + 000D2D + NCT Deutschland GmbH - 90AFD1 - netKTI Ltd + 000D7E + Axiowave Networks, Inc. - 800C67 - Apple + 000CA7 + Metro (Suzhou) Technologies Co., Ltd. - 90812A - Apple + 000CA0 + StorCase Technology, Inc. - 7817BE - Huawei Technologies Ltd + 000CBE + Innominate Security Technologies AG - F072EA - Google Inc. + 000CBD + Interface Masters, Inc - B87BC5 - Apple + 000CB2 + UNION co., ltd. - F05136 - TCT mobile Ltd + 000CB9 + LEA - B8C9B5 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 000CB8 + MEDION AG - 88ACC0 - ZyXEL Communications Corp + 000C88 + Apache Micro Peripherals, Inc. - 90FD73 - ZTE Corporation + 000C82 + NETWORK TECHNOLOGIES INC - 1C1E38 - PCCW Global Inc. + 000C7C + Internet Information Image Inc. - 3C410E - Cisco Systems Inc. + 000D03 + Matrics, Inc. - 88D98F - Juniper Networks + 000CFF + MRO-TEK Realty Limited - 0045E2 - CyberTAN Technology Inc. + 000CFA + Digital Systems Corp - 006967 - IEEE Registration Authority + 000CFD + Hyundai ImageQuest Co.,Ltd. - F86FDE - Shenzhen Goodix Technology Ltd + 000CBB + ISKRAEMECO - 646624 - Sagemcom Broadband SAS + 000CC0 + Genera Oy - B0F530 - Hitron Technologies Inc. + 000CA8 + Garuda Networks Corporation - 740AE1 - Huawei Device Ltd + 000CEB + CNMP Networks, Inc. - B4A898 - Huawei Device Ltd + 000CD3 + Prettl Elektronik Radeberg GmbH - 0CE4A0 - Huawei Device Ltd + 000CD7 + Nallatech Ltd - BC1AE4 - Huawei Device Ltd + 000CD4 + Positron Public Safety Systems inc. - 043F72 - Mellanox Technologies Inc. + 000C99 + HITEL LINK Co.,Ltd - 1C4D66 - Amazon Technologies Inc. + 000C89 + AC Electric Vehicles, Ltd. - 502CC6 - Gree Electric Appliances Inc. Of Zhuhai + 000CCC + Aeroscout Ltd. - F4FEFB - Samsung Electronics Ltd + 000CC7 + Intelligent Computer Solutions Inc. - 984914 - Wistron Neweb Corporation + 000C7B + ALPHA PROJECT Co.,Ltd. - 0CEE99 - Amazon Technologies Inc. + 000C77 + Life Racing Ltd - 00117E - Midmark Corp + 000C64 + X2 MSA Group - D028BA - Realme Chongqing MobileTelecommunications Corp Ltd + 000C5A + IBSmm Embedded Electronics Consulting - A428B7 - Yangtze Memory Technologies Ltd + 000C5E + Calypso Medical - 9492D2 - KCF Technologies Inc. + 000C61 + AC Tech corporation DBA Advanced Digital - E4A8DF - Compal Information (Kunshan) Ltd + 000C5F + Avtec, Inc. - 8C53C3 - Beijing Xiaomi Mobile Software Ltd + 000C4B + Cheops Elektronik - 702F35 - Huawei Technologies Ltd + 000C05 + RPA Reserch Co., Ltd. - C014B8 - Nokia + 000C27 + Sammy Corporation - 00763D - Veea + 000C2A + OCTTEL Communication Co., Ltd. - 3093BC - Sagemcom Broadband SAS + 000C22 + Double D Electronics Ltd - FCF5C4 - Espressif Inc. + 000C1C + MicroWeb Co., Ltd. - E826B6 - Inside Biometrics International Limited + 000C69 + National Radio Astronomy Observatory - 54CE69 - Hikari Trading Ltd + 000C66 + Pronto Networks Inc - 6CC63B - Taicang T&W Electronics + 000C45 + Animation Technologies Inc. - 588E81 - Silicon Laboratories + 000C3C + MediaChorus, Inc. - 48B02D - NVIDIA Corporation + 000C0F + Techno-One Co., Ltd - 4CE176 - Cisco Systems Inc. + 000C38 + TelcoBridges Inc. - 6CAEF6 - eero Inc. + 000C4E + Winbest Technology CO,LT - FC8E6E - StreamCCTV LLC + 000BC4 + BIOTRONIK GmbH & Co - E02AE6 - Fiberhome Telecommunication Technologies Ltd + 000BAF + WOOJU COMMUNICATIONS Co,.Ltd - 641236 - Technicolor CH USA Inc. + 000BB6 + Metalligence Technology Corp. - 788B2A - Zhen Shi Information Technology (Shanghai) Ltd + 000BB7 + Micro Systems Co.,Ltd. - AC64CF - FN-Link Technology Limited + 000BB3 + RiT technologies Ltd. - F06728 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 000BE6 + Datel Electronics - BCD767 - Private + 000BAE + Vitals System Inc. - 9CE176 - Cisco Systems Inc. + 000BD9 + General Hydrogen - 102959 - Apple + 000BF2 + Chih-Kan Technology Co., Ltd. - E47684 - Apple + 000BEB + Systegra AG - B41A1D - Samsung Electronics Ltd + 000BEF + Code Corporation - F05CD5 - Apple + 000BDF + Shenzhen RouterD Networks Limited - 3CDA6D - Tiandy Technologies Ltd + 000BF5 + Shanghai Sibo Telecom Technology Co.,Ltd - F80DF0 - ZTE Corporation + 000BFE + CASTEL Broadband Limited - 9CE91C - ZTE Corporation + 000B7D + SOLOMON EXTREME INTERNATIONAL LTD. - 5C17CF - OnePlus Technology (Shenzhen) Ltd + 000B94 + Digital Monitoring Products, Inc. - A4FA76 - New H3C Technologies Ltd + 000BAB + Advantech Technology (CHINA) Co., Ltd. - 70EA5A - Apple + 000BBA + Harmonic, Inc - 3CFAD3 - IEEE Registration Authority + 000B57 + Silicon Laboratories - 8C6078 - Swissbit AG + 000B51 + Micetek International Inc. - 00DD25 - Shenzhen hechengdong Technology Ltd + 000B53 + INITIUM Co., Ltd. - 8020E1 - BVBA DPTechnics + 000B6D + SOLECTRON JAPAN NAKANIIDA - 0445A1 - NIRIT- Xinwei Telecom Technology Ltd + 000B62 + ib-mohnen KG - 8C97EA - Freebox SAS + 000B64 + Kieback & Peter GmbH & Co KG - 30AB6A - Samsung Electro-Mechanics(Thailand) + 000B67 + Topview Technology Corporation - 749BE8 - Hitron Technologies Inc. + 000B48 + sofrel - 5CBAEF - Chongqing Fugui Electronics Ltd + 000AFB + Ambri Limited - 4C6371 - Xiaomi Communications Ltd + 000AFF + Kilchherr Elektronik AG - D84DB9 - Wu Qi Technologies,Inc. + 000B4A + Visimetrics (UK) Ltd - A04F85 - LG Electronics (Mobile Communications) + 000B37 + MANUFACTURE DES MONTRES ROLEX SA - D807B6 - TP-Link Technologies Ltd + 000B2D + Danfoss Inc. - 646E97 - TP-Link Technologies Ltd + 000B1E + KAPPA opto-electronics GmbH - 78507C - Juniper Networks + 000B1C + SIBCO bv - 001258 - TechVoIP Sp z o.o. + 000AF8 + American Telecare Inc. - 6C1632 - Huawei Technologies Ltd + 000B17 + MKS Instruments - 2C1A01 - Huawei Technologies Ltd + 000A9A + Aiptek International Inc - 347839 - ZTE Corporation + 000A94 + ShangHai cellink CO., LTD - 24169D - Cisco Systems Inc. + 000A97 + SONICblue, Inc. - F419E2 - Volterra + 000A92 + Presonus Corporation - 4CA003 - Vitec + 000A64 + Eracom Technologies - 64F2FB - Hangzhou Ezviz Software Ltd + 000A62 + Crinis Networks, Inc. - 30809B - New H3C Technologies Ltd + 000A6A + SVM Microwaves s.r.o. - 7422BB - Huawei Device Ltd + 000A66 + MITSUBISHI ELECTRIC SYSTEM & SERVICE CO.,LTD. - 6C0D34 - Nokia + 000AA3 + SHIMAFUJI ELECTRIC CO.,LTD. - 4C4576 - China Mobile(Hangzhou) Information Technology Ltd + 000AA7 + FEI Electron Optics - B440A4 - Apple + 000AA6 + Hochiki Corporation - 48B8A3 - Apple + 000AC7 + Unication Group - F4DBE3 - Apple + 000ABF + HIROTA SS - F07CC7 - Juniper Networks + 000ABC + Seabridge Ltd. - D45EEC - Beijing Xiaomi Electronics Ltd + 000A70 + MPLS Forum - 74C929 - Zhejiang Dahua Technology Ltd + 000A72 + STEC, INC. - D4CFF9 - Shenzhen SEI Robotics Ltd + 000A71 + Avrio Technologies, Inc - 5CB29E - ASCO Power Technologies + 000ADE + Happy Communication Co., Ltd. - 9CC9EB - Netgear + 000AE2 + Binatone Electronics International, Ltd - 94CC04 - IEEE Registration Authority + 000AD4 + CoreBell Systems Inc. - 90EC77 - silicom + 000ACA + YOKOYAMA SHOKAI CO.,Ltd. - 88C397 - Beijing Xiaomi Mobile Software Ltd + 000ACE + RADIANTECH, INC. - F0F6C1 - Sonos Inc. + 000AAC + TerraTec Electronic GmbH - 60684E - Samsung Electronics Ltd + 000AB8 + Cisco Systems, Inc - 8020FD - Samsung Electronics Ltd + 000A85 + PLAT'C2,Inc - B4CE40 - Samsung Electronics Ltd + 000A83 + SALTO SYSTEMS S.L. - 540384 - Hongkong Nano IC Technologies Ltd + 000A86 + Lenze - 04BDBF - Samsung Electronics Ltd + 000A50 + REMOTEK CORPORATION - BC7ABF - Samsung Electronics Ltd + 000A58 + Freyer & Siegel Elektronik GmbH & Co. KG - B40931 - Huawei Technologies Ltd + 000A4E + UNITEK Electronics INC. - 94E7EA - Huawei Technologies Ltd + 000A3D + Elo Sistemas Eletronicos S.A. - 94E4BA - Huawei Device Ltd + 000A46 + ARO WELDING TECHNOLOGIES SAS - 347146 - Huawei Device Ltd + 0009F6 + Shenzhen Eastern Digital Tech Ltd. - 2CC546 - Huawei Device Ltd + 000A01 + SOHOware, Inc. - 0C839A - Huawei Device Ltd + 0009EE + MEIKYO ELECTRIC CO.,LTD - E0E0FC - Huawei Device Ltd + 000A31 + HCV Consulting - 305075 - GN Audio A/S + 004252 + RLX Technologies - F4B78D - Huawei Technologies Ltd + 000A20 + SVA Networks, Inc. - A416E7 - Huawei Technologies Ltd + 000A24 + Octave Communications - 30B9B0 - Intracom Asia Ltd + 000A19 + Valere Power, Inc. - 0C35FE - Fiberhome Telecommunication Technologies Ltd + 0009E5 + Hottinger Brüel & Kjaer GmbH - 8C83DF - Nokia + 0009DE + Samjin Information & Communications Co., Ltd. - AC4B1E - Integri-Sys.com LLC + 0009E0 + XEMICS S.A. - B0E4D5 - Google Inc. + 0009CA + iMaxNetworks(Shenzhen)Limited. - D4DACD - BSkyB Ltd + 000A11 + ExPet Technologies, Inc - 6869CA - Hitachi Ltd + 000A0F + Ilryung Telesys, Inc - AC4A56 - Cisco Systems Inc. + 000A0C + Scientific Research Corporation - F4EAB5 - Extreme Networks Inc. + 0009EC + Daktronics, Inc. - 001977 - Extreme Networks Inc. + 0009E7 + ADC Techonology - 08EA44 - Extreme Networks Inc. + 0009CF + iAd GmbH - B0B5C3 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 000A3F + Data East Corporation - 704A0E - AMPAK Technology,Inc. + 000956 + Network Systems Group, Ltd. (NSG) - 08306B - Palo Alto Networks + 000948 + Vista Control Systems, Corp. - 00869C - Palo Alto Networks + 000949 + Glyph Technologies Inc. - 4CB911 - Raisecom Technology Ltd + 0009B1 + Kanematsu Electronics, Ltd. - 40476A - Astro Gaming + 0009B0 + Onkyo Technology K.K. - 4CCE2D - Danlaw Inc + 0009AB + Netcontrol Oy - 30B237 - GD Midea Air-Conditioning Equipment Ltd + 00099D + Haliplex Communications - BC5A56 - Cisco Systems Inc. + 000968 + TECHNOVENTURE, INC. - B87CF2 - Extreme Networks Inc. + 000961 + Switchgear and Instrumentation Ltd - 882B94 - MADOKA SysTEM Ltd + 000960 + YOZAN Inc. - 7CEF61 - STR Elektronik Josef Schlechtinger GmbH + 00099E + Testech, Inc. - 64A965 - Linkflow Ltd + 0009C1 + PROCES-DATA A/S - 2462CE - Aruba Networks HP + 000999 + CP GEORGES RENAULT - 68E209 - Huawei Technologies Ltd + 000994 + Cronyx Engineering - 400589 - T-Mobile, USA + 000988 + Nudian Electron Co., Ltd. - C09BF4 - IEEE Registration Authority + 00098E + ipcas GmbH - F4308B - Xiaomi Communications Ltd + 000979 + Advanced Television Systems Committee, Inc. - DC6B12 - worldcns Inc. + 000963 + Dominion Lasercom Inc. - 70039F - Espressif Inc. + 000966 + TRIMBLE EUROPE BV - A0DE0F - Huawei Device Ltd + 0009BB + MathStar, Inc. - F487C5 - Huawei Device Ltd + 0009B9 + Action Imaging Solutions - 080088 - Brocade Communications Systems LLC + 0009AC + LANVOICE - 00010F - Brocade Communications Systems LLC + 00097C + Cisco Systems, Inc - 08B055 - Askey Computer Corp + 00097B + Cisco Systems, Inc - 045FB9 - Cisco Systems Inc. + 00093C + Jacques Technologies P/L - CC4E24 - Brocade Communications Systems LLC + 000935 + Sandvine Incorporated - 00E052 - Brocade Communications Systems LLC + 000936 + Ipetronik GmbH & Co. KG - 98DF82 - Hangzhou Hikvision Digital Technology Ltd + 000937 + Inventec Appliance Corp - 3CF652 - ZTE Corporation + 0008FD + BlueKorea Co., Ltd. - 5C0FFB - Amino Communications Ltd + 0008F8 + UTC CCS - 7458F3 - Amazon Technologies Inc. + 0008F3 + WANY - 000631 - Calix Inc. + 0008D9 + Mitadenshi Co.,LTD - A80577 - Netlist Inc. + 0008D5 + Vanguard Networks Solutions, LLC - E43A65 - MofiNetwork Inc + 0008CD + With-Net Inc - 08AA55 - Motorola Mobility LLC, a Lenovo Company + 0008CC + Remotec, Inc. - 54219D - Samsung Electronics Ltd + 0008D1 + KAREL INC. - C88BE8 - Masimo Corporation + 0008DE + 3UP Systems - F041C6 - Heat Tech Company Ltd + 0008E0 + ATO Technology Ltd. - 404028 - ZIV + 0008E4 + Envenergy Inc - F86C03 - Shenzhen Teleone Technology Ltd + 0008E3 + Cisco Systems, Inc - D8714D - Texas Instruments + 0008E5 + IDK Corporation - 0CEC80 - Texas Instruments + 000913 + SystemK Corporation - 105DDC - Huawei Device Ltd + 00090E + Helix Technology Inc. - DC7385 - Huawei Device Ltd + 000946 + Cluster Labs GmbH - 5455D5 - Huawei Device Ltd + 00093F + Double-Win Enterpirse CO., LTD - 0015D2 - Xantech Corporation + 00092A + MYTECS Co.,Ltd. - 001F40 - Speakercraft Inc. + 000925 + VSN Systemen BV - 184593 - Taicang T&W Electronics + 000900 + TMT - CC9ECA - HMD Global Oy + 00082C + Homag AG - 3C306F - Huawei Technologies Ltd + 000821 + Cisco Systems, Inc - 34EAE7 - Shanghai High-Flying Electronics Technology Ltd + 000822 + InPro Comm - D4ABCD - Hui Zhou Gaoshengda Technology Ltd + 00081D + Ipsil, Incorporated - 80E1BF - Huawei Technologies Ltd + 000823 + Texa Corp. - 482CD0 - Huawei Technologies Ltd + 000828 + Koei Engineering Ltd. - 001932 - Gude Systems GmbH + 00082D + Indus Teqsite Private Limited - A0CAA5 - Intelligence Technology Of CEC Ltd + 000820 + Cisco Systems, Inc - 5C5F67 - Intel Corporation + 000824 + Nuance Document Imaging - 0C5415 - Intel Corporation + 00086C + Plasmon LMS - 302432 - Intel Corporation + 000868 + PurOptix - DC8B28 - Intel Corporation + 000869 + Command-e Technology Co.,Ltd. - 1C1BB5 - Intel Corporation + 000862 + NEC Eluminant Technologies, Inc. - F83441 - Intel Corporation + 000861 + SoftEnergy Co., Ltd. - E470B8 - Intel Corporation + 000891 + Lyan Inc. - E00EE4 - DWnet Technologies(Suzhou) Corporation + 000892 + EM Solutions - E8854B - Apple + 00088C + Quanta Network Systems Inc. - 28EC95 - Apple + 00088A + Minds@Work - 58FDB1 - LG Electronics + 000887 + Maschinenfabrik Reinhausen GmbH - E02B96 - Apple + 000877 + Liebert-Hiross Spa - A8469D - Cisco Meraki + 00087B + RTX Telecom A/S - 6CDEA9 - Cisco Meraki + 000876 + SDSystem - 8CCEFD - Shenzhen zhouhai technology Ltd + 000870 + Rasvia Systems, Inc. - 50FB19 - Chipsea Technologies (Shenzhen) Corp. + 00086E + Hyglo AB - D0ABD5 - Intel Corporation + 000814 + TIL Technologies - 681729 - Intel Corporation + 0008BD + TEPG-US - B808CF - Intel Corporation + 0008AE + PacketFront Network Products AB - DC7196 - Intel Corporation + 00084F + Qualstar Corporation - 50E085 - Intel Corporation + 000854 + Netronix, Inc. - 9408C7 - Huawei Device Ltd + 00085C + Shanghai Dare Technologies Co. Ltd. - C8CA63 - Huawei Device Ltd + 0008A7 + iLogic Inc. - 983B8F - Intel Corporation + 000899 + Netbind, Inc. - D0C637 - Intel Corporation + 0008A0 + Stotz Feinmesstechnik GmbH - 04EA56 - Intel Corporation + 0008C3 + Contex A/S - D43B04 - Intel Corporation + 0008BC + Ilevo AB - 386893 - Intel Corporation + 0007BD + Radionet Ltd. - D83BBF - Intel Corporation + 0007C4 + JEAN Co. Ltd. - 14F6D8 - Intel Corporation + 0007C3 + Thomson - E0D4E8 - Intel Corporation + 0007D2 + Logopak Systeme GmbH & Co. KG - 94E6F7 - Intel Corporation + 0007C9 + Technol Seven Co., Ltd. - 4C1D96 - Intel Corporation + 0007C7 + Synectics Systems Limited - 703AA6 - New H3C Technologies Ltd + 0007BF + Armillaire Technologies, Inc. - 9437F7 - Huawei Device Ltd + 0007BB + Candera Inc. - 046C59 - Intel Corporation + 0007A5 + Y.D.K Co. Ltd. - 903FEA - Huawei Technologies Ltd + 00079C + Golden Electronics Technology Co., Ltd. - 20AB48 - Huawei Technologies Ltd + 0007B6 + Telecom Technology Ltd. - CCD73C - Huawei Technologies Ltd + 0007B7 + Samurai Ind. Prods Eletronicos Ltda - D440D0 - OCOSMOS Ltd + 0007B0 + Office Details, Inc. - 94E70B - Intel Corporation + 000803 + Cos Tron - 001EE0 - Urmet SpA + 000805 + Techno-Holon Corporation - DCD9AE - Nokia Shanghai Bell Ltd + 0007FD + LANergy Ltd. - 98B8BC - Samsung Electronics Ltd + 0007FE + Rigaku Corporation - 184E16 - Samsung Electronics Ltd + 0007D9 + Splicecom - C03D03 - Samsung Electronics Ltd + 0007DA + Neuro Telecom Co., Ltd. - A497B1 - Chongqing Fugui Electronics Ltd + 0007CD + Kumoh Electronic Co, Ltd - BCA993 - Cambium Networks Limited + 0007CF + Anoto AB - 10746F - Motorola Solutions Malaysia SDN. BHD. + 000777 + Motah Ltd. - 00927D - Ficosa Internationa(Taicang) C0 Ltd + 000780 + Bluegiga Technologies OY - 441622 - Microsoft Corporation + 00078E + Garz & Fricke GmbH - 44E6B0 - China Mobile IOT Company Limited + 0007E4 + SoftRadio Co., Ltd. - 747A90 - Murata Manufacturing Ltd + 000754 + Xyterra Computing, Inc. - 24E9CA - Huawei Device Ltd + 000757 + Topcall International AG - 14007D - ZTE Corporation + 00074C + Beicom Inc. - 94AEF0 - Cisco Systems Inc. + 000753 + Beijing Qxcomm Technology Co., Ltd. - 1C08C1 - LG Innotek + 00074D + Zebra Technologies Corp. - 34873D - Quectel Wireless Solutions Ltd + 00072F + Intransa, Inc. - 9CF61A - Carrier Fire & Security + 000732 + AAEON Technology Inc. - 58B623 - Beijing Xiaomi Mobile Software Ltd + 000725 + Bematech International Corp. - FC73FB - Huawei Technologies Ltd + 000723 + ELCON Systemtechnik GmbH - 044562 - ANDRA Sp. z o. o. + 00071D + Satelsa Sistemas Y Aplicaciones De Telecomunicaciones, S.A. - 00269E - Quanta Computer Inc. + 000720 + Trutzschler GmbH & Co. KG - C45444 - Quanta Computer Inc. + 00076E + Sinetica Corporation Limited - 00C09F - Quanta Computer Inc. + 00076F + Synoptics Limited - 001B24 - Quanta Computer Inc. + 000773 + Ascom Powerline Communications Ltd. - C80AA9 - Quanta Computer Inc. + 00076C + Daehanet, Inc. - 60EB69 - Quanta Computer Inc. + 00075D + Celleritas Inc. - C08F20 - Shenzhen Skyworth Digital Technology Ltd + 000765 + Jade Quantum Technologies, Inc. - 74F7F6 - Shanghai Sunmi Technology Ltd + 000737 + Soriya Co. Ltd. - 241AE6 - Huawei Device Ltd + 000734 + ONStor, Inc. - 60B76E - Google Inc. + 00073F + Woojyun Systec Co., Ltd. - B42330 - Itron Inc + 000728 + Neo Telecom - 084EBF - Sumitomo Electric Industries Ltd + 00072C + Fabricom - A802DB - ZTE Corporation + 00072D + CNSystems - 1C5D80 - Mitubishi Hitachi Power Systems Industries Ltd + 000724 + Telemax Co., Ltd. - 801605 - Vodafone Italia S.p.A. + 00071B + CDVI Americas Ltd - 3C9C0F - Intel Corporation + 000715 + General Research of Electronics, Inc. - 5C443E - Skullcandy + 0006FD + Comjet Information Systems Corp. - F88200 - CaptionCall + 0006F9 + Mitsui Zosen Systems Research Inc. - 08FBEA - AMPAK Technology,Inc. + 0006F1 + Optillion - 340F66 - Web Sensing LLC + 0006E0 + MAT Co., Ltd. - 5865E6 - Infomark + 0006D7 + Cisco Systems, Inc - 0050F1 - Maxlinear Inc. + 0006D5 + Diamond Systems Corp. - F4E578 - LLC Proizvodstvennaya Kompania TransService + 00D0B9 + MICROTEK INTERNATIONAL, INC. - 0854BB - Shenzhen Chuangwei-RGB Electronics Ltd + 00D05F + VALCOM, INC. - 60EB5A - Asterfusion Data Technologies Ltd + 000675 + Banderacom, Inc. - E4D373 - Huawei Technologies Ltd + 00067B + Toplink C&C Corporation - C0BC9A - Huawei Technologies Ltd + 000670 + Upponetti Oy - 702C09 - Nintendo Ltd + 0005EA + Rednix - E81B69 - Sercomm Corporation. + 0006C9 + Technical Marketing Research, Inc. - 6852D6 - UGame Technology Ltd + 0006C8 + Sumitomo Metal Micro Devices, Inc. - 9012A1 - We Corporation Inc. + 0006C0 + United Internetworks, Inc. - B88035 - Shenzhen Qihu Intelligent Technology Company Limited + 000698 + egnite GmbH - 001711 - Cytiva Sweden AB + 00069C + Transmode Systems AB - B4C26A - Garmin International + 0006AF + Xalted Networks - E89F80 - Belkin International Inc. + 0006A7 + Primarion - BC5C4C - Elecom Ltd + 0006A9 + Universal Instruments Corp. - 04AB18 - Elecom Ltd + 00069E + UNIQA, Inc. - 6CE5F7 - New H3C Technologies Ltd + 000668 + Vicon Industries Inc. - B8DD71 - ZTE Corporation + 00066D + Compuprint S.P.A. - 78F8B8 - Rako Controls Ltd + 000658 + Helmut Fischer GmbH Institut für Elektronik und Messtechnik - 001612 - Otsuka Electronics Ltd + 000649 + 3M Deutschland GmbH - A45129 - XAG + 000643 + SONO Computer Co., Ltd. - 5C0272 - Silicon Laboratories + 00063E + Opthos Inc. - FC4AE9 - Castlenet Technology Inc. + 00066F + Korea Data Systems - 0446CF - Beijing Venustech Cybervision Ltd + 000686 + ZARDCOM Co., Ltd. - CC874A - Nokia + 000689 + yLez Technologies Pte Ltd - 00078E - Garz & Fricke GmbH + 000681 + Goepel Electronic GmbH - B436D1 - Renesas Electronics (Penang) Sdn. Bhd. + 0006B1 + Sonicwall - 006151 - Huawei Technologies Ltd + 0006AD + KB Electronics Ltd. - BC76C5 - Huawei Technologies Ltd + 00063B + Arcturus Networks Inc. - DC774C - Cisco Systems Inc. + 000626 + MWE GmbH - 204441 - Remote Solution + 000606 + RapidWAN, Inc. - B85F98 - Amazon Technologies Inc. + 000603 + Baker Hughes Inc. - A085FC - Microsoft Corporation + 000607 + Omni Directional Control Technology Inc. - C49886 - Qorvo International Pte Ltd + 0005F7 + Analog Devices, Inc. - 94FF61 - China Mobile Group Device Ltd + 000613 + Kawasaki Microelectronics Incorporated - 101965 - New H3C Technologies Ltd + 0005D3 + eProduction Solutions, Inc. - 245A4C - Ubiquiti Networks Inc. + 000604 + @Track Communications, Inc. - 80F1F1 - Tech4home, Lda + 00059C + Kleinknecht GmbH, Ing. Büro - 14A9D0 - F5 Networks Inc. + 0005A2 + CELOX Networks - 1C501E - Sunplus Technology Ltd + 0005AA + Moore Industries International Inc. - 409505 - Acoinfo Technology Ltd + 0005AE + Mediaport USA - FC66CF - Apple + 0005B0 + Korea Computer Technology Co., Ltd. - AC1D06 - Apple + 0005B2 + Medison Co., Ltd. - 44A8FC - Apple + 000618 + DigiPower Manufacturing Inc. - F81093 - Apple + 000620 + Serial System Ltd. - 5CD89E - Huawei Device Ltd + 000617 + Redswitch Inc. - 0405DD - Shenzhen Cultraview Digital Technology Ltd + 0005C8 + VERYTECH - 3897A4 - Elecom Ltd + 0005CB + ROIS Technologies, Inc. - E433AE - Guangdong Oppo Mobile Telecommunications Corp Ltd + 0005CD + D&M Holdings Inc. - DCE994 - Cloud Network Technology Singapore PTE Ltd + 0005E7 + Netrake an AudioCodes Company - 387A3C - Fiberhome Telecommunication Technologies Ltd + 0005F4 + System Base Co., Ltd. - 8CCE4E - Espressif Inc. + 0005E1 + Trellis Photonics, Ltd. - B82D28 - AMPAK Technology,Inc. + 0005E2 + Creativ Network Technologies - C44137 - Quectel Wireless Solutions Ltd + 00054D + Brans Technologies, Inc. - ECC89C - Hangzhou Hikvision Digital Technology Ltd + 000547 + Starent Networks - F013C1 - Hannto Technology Ltd + 00054E + Philips - F80DAC - HP Inc. + 000546 + KDDI Network & Solultions Inc. - 88DA1A - Redpine Signals Inc. + 00053C + XIRCOM - 40B5C1 - Cisco Systems Inc. + 000596 + Genotech Co., Ltd. - E44791 - Iris ID Systems Inc. + 000579 + Universal Control Solution Corp. - 006065 - B&R Industrial Automation GmbH + 00052E + Cinta Networks - 849DC2 - Shanghai MXCHIP Information Technology Ltd + 00052F + Leviton Network Solutions - 184516 - Texas Instruments + 00053B + Harbour Networks Ltd., Co. Beijing - D02EAB - Texas Instruments + 000528 + New Focus, Inc. - 8454DF - Huawei Device Ltd + 000575 + CDS-Electronics BV - F0F7E7 - Huawei Technologies Ltd + 00056B + C.P. Technology Co., Ltd. - 8C55BB - Songwoo Information & Technology Ltd + 000560 + LEADER COMM.CO., LTD - 7C8FDE - DWnet Technologies(Suzhou) Corporation + 00055E + Cisco Systems, Inc - 98F181 - New H3C Technologies Ltd + 000544 + Valley Technologies, Inc. - 90808F - Huawei Device Ltd + 000597 + Eagle Traffic Control Systems - 40A9CF - Amazon Technologies Inc. + 0005B5 + Broadcom Technologies - 5895D8 - IEEE Registration Authority + 00058C + Opentech Inc. - 0838E6 - Motorola (Wuhan) Mobility Technologies Communication Ltd + 000556 + 360 Systems - E8C2DD - Infinix mobility limited + 000559 + Intracom S.A. - 48D890 - FN-Link Technology Limited + 000551 + F & S Elektronik Systeme GmbH - 781F11 - RAB Lighting + 000524 + BTL System (HK) Limited - F8B95A - LG Innotek + 000522 + LEA*D Corporation, Inc. - C41C9C - JiQiDao + 000520 + Smartronix, Inc. - D44F67 - Huawei Technologies Ltd + 00057F + Acqis Technology - B4FF98 - Huawei Technologies Ltd + 000573 + Cisco Systems, Inc - 847127 - Silicon Laboratories + 0004BE + OptXCon, Inc. - 00264E - r2p GmbH + 0004C1 + Cisco Systems, Inc - B0BBE5 - Sagemcom Broadband SAS + 0004C4 + Audiotonix Group Limited - 90B4DD - Private + 0004B7 + AMB i.t. Holding - C418E9 - Samsung Electronics Ltd + 0004B9 + S.I. Soubou, Inc. - 1CE57F - Samsung Electronics Ltd + 0004BB + Bardac Corporation - B0C53C - Cisco Systems Inc. + 0004BC + Giantec, Inc. - ECCE13 - Cisco Systems Inc. + 0004AF + Digital Fountain, Inc. - 107100 - Huawei Device Ltd + 0004D6 + Takagi Industrial Co., Ltd. - 8CFDDE - Sagemcom Broadband SAS + 0004D1 + Drew Technologies, Inc. - A468BC - Oakley Inc. + 0004D0 + Softlink s.r.o. - 607EA4 - Shanghai Imilab Technology Ltd + 008087 + OKI ELECTRIC INDUSTRY CO., LTD - 7895EB - Itel Mobile Limited + 0004D9 + Titan Electronics, Inc. - 1C9F4E - Coosea Group (HK) Company Limited + 0004D8 + IPWireless, Inc. - 14AB02 - Huawei Technologies Ltd + 0004B2 + ESSEGI SRL - BC5BD5 - ARRIS Group Inc. + 0004B4 + CIAC - 085531 - Routerboard.com + 0004A9 + SandStream Technologies, Inc. - 3C6105 - Espressif Inc. + 0004EB + Paxonet Communications, Inc. - 2406AA - Guangdong Oppo Mobile Telecommunications Corp Ltd + 0004EF + Polestar Corp. - 843095 - Hon Hai Precision Ind Ltd + 000514 + KDT Systems Co., Ltd. - 0865F0 - JM Zengge Ltd + 00050B + SICOM Systems, Inc. - AC471B - Huawei Device Ltd + 000505 + Systems Integration Solutions, Inc. - 003192 - TP-Link Corporation Limited + 0004FE + Pelago Networks - A4CCB9 - Realme Chongqing Mobile Telecommunications Corp Ltd + 000518 + Jupiters Technology - 90FFD6 - Honor Device Ltd + 000461 + EPOX Computer Co., Ltd. - 6CB881 - ZTE Corporation + 000462 + DAKOS Data & Communication Co., Ltd. - 989AB9 - ZTE Corporation + 00045F + Avalue Technology, Inc. - 008A55 - Huawei Device Ltd + 000456 + Cambium Networks Limited - 64A28A - Huawei Device Ltd + 000446 + CYZENTECH Co., Ltd. - B456E3 - Apple + 00044A + iPolicy Networks, Inc. - 4C20B8 - Apple + 000440 + cyberPIXIE, Inc. - 1488E6 - Apple + 00043C + SONOS Co., Ltd. - BC0F9A - D-Link International + 00049C + Surgient Networks, Inc. - B04530 - BSkyB Ltd + 00049D + Ipanema Technologies - 6CA0B4 - BSkyB Ltd + 000460 + Knilink Technology, Inc. - 947BBE - Ubicquia LLC + 00048F + TD Systems Corporation - 24649F - Huawei Device Ltd + 000419 + Fibercycle Networks, Inc. - 0C1773 - Huawei Device Ltd + 00041C + ipDialog, Inc. - E81E92 - Huawei Device Ltd + 000418 + Teltronic S.A.U. - 888E68 - Huawei Device Ltd + 000370 + NXTV, Inc. - 807484 - ALL Winner (Hong Kong) Limited + 000468 + Vivity, Inc. - 0498F3 - Alpsalpine Ltd + 00046F + Digitel S/A Industria Eletronica - 64D4BD - Alpsalpine Ltd + 000469 + Innocom, Inc. - 34C731 - Alpsalpine Ltd + 000402 + Nexsan Technologies, Ltd. - 0006F5 - Alpsalpine Ltd + 0003F7 + Plast-Control GmbH - 000704 - Alpsalpine Ltd + 0003FC + Intertex Data AB - 0006F7 - Alpsalpine Ltd + 000495 + Tejas Networks India Limited - 88238C - Fiberhome Telecommunication Technologies Ltd + 000487 + Cogency Semiconductor, Inc. - 20FF36 - Iflytek Ltd + 00042C + Minet, Inc. - BC428C - Alpsalpine Ltd + 00042A + Wireless Networks, Inc. - 7495EC - Alpsalpine Ltd + 000458 + Fusion X Co., Ltd. - 98ED7E - eero Inc. + 00044F + Schubert System Elektronik Gmbh - 8CAE49 - IEEE Registration Authority + 0003E1 + Winmate Communication, Inc. - 00214F - Alpsalpine Ltd + 0003E4 + Cisco Systems, Inc - 78CF2F - Huawei Technologies Ltd + 0003DC + Lexar Media, Inc. - A83B5C - Huawei Technologies Ltd + 0003D8 + iMPath Networks, Inc. - B0EE7B - Roku Inc. + 0003D5 + Advanced Communications Co., Ltd. - D83134 - Roku Inc. + 0003D6 + RADVision, Ltd. - 6405E4 - Alpsalpine Co Ltd + 0003C8 + CML Emergency Services - 105932 - Roku Inc. + 0003C3 + Micronik Multimedia - A8CC6F - HMD Global Oy + 0003C0 + RFTNC Co., Ltd. - 5C6F69 - Broadcom Limited + 0003BD + OmniCluster Technologies, Inc. - D012CB - AVM Audiovisuelles Marketing und Computersysteme GmbH + 0003B8 + NetKit Solutions, LLC - FC4482 - Intel Corporation + 0003B7 + ZACCESS Systems - D8F883 - Intel Corporation + 0003B0 + Xsense Technology Corp. - E884A5 - Intel Corporation + 0003AA + Watlow - E8F408 - Intel Corporation + 0003A8 + IDOT Computers, Inc. - 748B29 - Micobiomed + 0003EF + Oneline AG - 002550 - Riverbed Technology Inc. + 0003F1 + Cicada Semiconductor, Inc. - 58B0FE - Team EPS GmbH + 0003ED + Shinkawa Electric Co., Ltd. - 143FA6 - Sony Home Entertainment & Sound Products Inc + 0003A0 + Cisco Systems, Inc - F0FEE7 - Huawei Device Ltd + 0003A2 + Catapult Communications - 54211D - Huawei Device Ltd + 00039C + OptiMight Communications, Inc. - 04495D - Huawei Device Ltd + 0003D4 + Alloptic, Inc. - 44D453 - Sagemcom Broadband SAS + 0003CE + ETEN Technologies, Inc. - DCA120 - Nokia + 000385 + Actelis Networks, Inc. - 50523B - Nokia + 000369 + Nippon Antenna Co., Ltd. - DCCD74 - Japan E.M.Solutions Ltd + 000373 + Aselsan A.S - 001293 - ABB Power Protection (CH) + 000377 + Gigabit Wireless - A03B01 - Kyung In Electronics + 000355 + TeraBeam Internet Systems - 18188B - Fujitsu Connected Technologies Limited + 000354 + Fiber Logic Communications - 145E69 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 000350 + BTICINO SPA - 484C29 - Huawei Technologies Ltd + 00034E + Pos Data Company, Ltd. - C4D438 - Huawei Technologies Ltd + 000348 + Norscan Instruments, Ltd. - C0280B - Honor Device Ltd + 000344 + Tietech.Co., Ltd. - 9CEA97 - Honor Device Ltd + 0002E6 + Gould Instrument Systems, Inc. - EC0DE4 - Amazon Technologies Inc. + 0002E4 + JC HYUN Systems, Inc. - 0C96CD - Mercury Corporation + 0002DE + Astrodesign, Inc. - E8D2FF - Sagemcom Broadband SAS + 0002E2 + NDC Infared Engineering - C4E287 - Huawei Technologies Ltd + 0002E1 + Integrated Network Corporation - F4B301 - Intel Corporation + 0002D7 + EMPEG Ltd - 5CDE34 - Shenzhen Mercury Communication Technologies Ltd + 0002F8 + SEAKR Engineering, Inc. - E8A0CD - Nintendo Ltd + 0002F7 + ARM - A0A3F0 - D-Link International + 00D024 + Cognex Corporation - 846569 - New H3C Technologies Ltd + 0002F1 + Pinetron Co., Ltd. - 34F716 - TP-Link Technologies Ltd + 0002ED + DXO Telecom Co., Ltd. - 9C823F - Huawei Device Ltd + 0002EC + Maschoff Design Engineering - 54F607 - Huawei Device Ltd + 0002D3 + NetBotz, Inc. - 687848 - Westunitis Ltd + 0002DA + ExiO Communications, Inc. - 08FF24 - Shenzhen Skyworth Digital Technology Ltd + 0002D4 + PDA Peripherals, Inc. - 50558D - China Mobile IOT Company Limited + 0002D6 + NICE Systems - 642656 - Shenzhen Fanweitai Technology Service Ltd + 000343 + Martin Professional A/S - E06C4E - Shenzhen TINNO Mobile Technology Corp. + 000335 + Mirae Technology - F0258E - Huawei Technologies Ltd + 000336 + Zetes Technologies - 9C746F - Huawei Technologies Ltd + 000337 + Vaone, Inc. - 64E003 - Hui Zhou Gaoshengda Technology Ltd + 000365 + Kira Information & Communications, Ltd. - 18CE94 - Samsung Electronics Ltd + 00033B + TAMI Tech Co., Ltd. - 783716 - Samsung Electronics Ltd + 00032D + IBASE Technology, Inc. - 281B04 - Zalliant LLC + 00032F + Global Sun Technology, Inc. - 7C5079 - Intel Corporation + 00B052 + Atheros Communications - 8038FB - Intel Corporation + 000314 + Teleware Network Systems - 08B4B1 - Google Inc. + 00025C + SCI Systems (Kunshan) Co., Ltd. - 34587C - Mirae Information Technology Ltd + 000087 + HITACHI, LTD. - AC8247 - Intel Corporation + 000258 + Flying Packets Communications - 749AC0 - Cachengo Inc. + 000255 + IBM Corp - A45E5A - ACTIVIO Inc. + 000252 + Carrier Corporation - 5C56A4 - Wanan Hongsheng Electronic Ltd + 00024E + Datacard Group - B485E1 - Apple + 000242 + Videoframe Systems - 0C19F8 - Apple + 000244 + SURECOM Technology Co. - 501FC6 - Apple + 00023E + Selta Telematica S.p.a - 3C9BC6 - Huawei Device Ltd + 000241 + Amer.com - 540910 - Apple + 00027D + Cisco Systems, Inc - 9CFC28 - Apple + 00027C + Trilithic, Inc. - CC69FA - Apple + 000275 + SMART Technologies, Inc. - 10CEE9 - Apple + 000269 + Nadatel Co., Ltd - 0C8DDB - Cisco Meraki + 000264 + AudioRamp.com - CC03D9 - Cisco Meraki + 00025F + Nortel Networks - 0036BE - Northwest Towers + 000299 + Apex, Inc. - A877E5 - Shenzhen Chuangwei-RGB Electronics Ltd + 000298 + Broadframe Corporation - 10A4DA - Huawei Technologies Ltd + 000297 + C-COR.net - 382028 - Huawei Technologies Ltd + 000291 + Open Network Co., Ltd. - E47727 - Huawei Technologies Ltd + 0002C6 + Data Track Technology PLC - 105107 - Intel Corporation + 0002C1 + Innovative Electronic Designs, Inc. - AC74C4 - Maytronics Ltd + 0002C0 + Bencent Tzeng Industry Co., Ltd. - 84D608 - Wingtech Mobile Communications Ltd + 00017A + Chengdu Maipu Electric Industrial Co., Ltd. - 346893 - Tecnovideo Srl + 000238 + Serome Technology, Inc. - 3C7AAA - China Dragon Technology Limited + 000229 + Adtec Corporation - 6C4760 - Sunitec Enterprise Ltd + 00028B + VDSL Systems OY - 183219 - EM Microelectronic + 00028C + Micrel-Synergy Semiconductor - 28D3EA - Huawei Device Ltd + 00028D + Movita Technologies, Inc. - A8F266 - Huawei Device Ltd + 0002A6 + Effinet Systems Co., Ltd. - 84267A - Guangdong Taide Zhilian Technology Ltd + 0001E5 + Supernet, Inc. - D8EC5E - Belkin International Inc. + 0001D4 + Leisure Time, Inc. - 84FD27 - Silicon Laboratories + 0001DD + Avail Networks - CC9C3E - Cisco Meraki + 0001D5 + HAEDONG INFO & COMM CO., LTD - 4829E4 - ZAO NPK Rotek + 0001DE + Trango Systems, Inc. - FCA9DC - Renesas Electronics (Penang) Sdn. Bhd. + 0001DC + Activetelco - FC584A - xiamenshi c-chip technology Ltd + 000207 + VisionGlobal Network Corp. - 78653B - Shaoxing Ourten Electronics Ltd + 000208 + Unify Networks, Inc. - E0E656 - Nethesis srl + 000204 + Bodmann Industries Elektronik GmbH - 9023B4 - New H3C Technologies Ltd + 0001F9 + TeraGlobal Communications Corp. - 882A5E - New H3C Technologies Ltd + 0001FB + DoTop Technology, Inc. - 841EA3 - Sagemcom Broadband SAS + 0001BF + Teleforce Co., Ltd. - F40223 - PAX Computer Technology(Shenzhen) Ltd + 0001B4 + Wayport, Inc. - 646EE0 - Intel Corporation + 0001BA + IC-Net, Inc. - 0456E5 - Intel Corporation + 0001B0 + Fulltek Technology Co., Ltd. - 081086 - NEC Platforms Ltd + 0001A9 + BMW AG - 6479F0 - Intel Corporation + 0001AA + Airspan Communications, Ltd. - 1CD1E0 - Cisco Systems Inc. + 00019E + ESS Technology, Inc. - 24456B - Huawei Device Ltd + 000211 + Nature Worldwide Technology Corp. - 483871 - Huawei Device Ltd + 000212 + SierraCom - 44BDDE - BHTC GmbH + 000217 + Cisco Systems, Inc - 8C2A8E - DongGuan Ramaxel Memory Technology + 00022D + Agere Systems - 4044FD - Realme Chongqing Mobile Telecommunications Corp Ltd + 000226 + XESystems, Inc. - E8FD35 - Huawei Device Ltd + 000225 + One Stop Systems - ECC5D2 - Huawei Device Ltd + 000220 + CANON FINETECH INC. - B4608C - Fiberhome Telecommunication Technologies Ltd + 00020D + Micronpc.com - B814DB - Ohsung + 0001CF + Alpha Data Parallel Systems, Ltd. - 80071B - Vsolution Telecommunication Technology Ltd + 0001D0 + VitalPoint, Inc. - FC13F0 - Bouffalo Lab (Nanjing) Ltd + 0001C7 + Cisco Systems, Inc - 1C6EE6 - Nhnetworks + 00017D + ThermoQuest - 08F606 - ZTE Corporation + 000181 + Nortel Networks - E89E0C - MAX8USA Distributors Inc. + 000194 + Capital Equipment Corporation - FC9C98 - Arlo Technology + 000198 + Darim Vision - A070B7 - Huawei Technologies Ltd + 0001F8 + TEXIO TECHNOLOGY CORPORATION - 78B554 - Huawei Device Ltd + 0001E8 + Force10 Networks, Inc. - 689E6A - Huawei Device Ltd + 0001E9 + Litton Marine Systems B.V. - 282B96 - Huawei Device Ltd + 0001BE + Gigalink Co., Ltd. - CC68B6 - TP-Link Corporation Limited + 0001B1 + General Bandwidth - 64644A - Beijing Xiaomi Mobile Software Ltd + 00010A + CIS TECHNOLOGY INC. - A439B6 - Shenzhen Peizhe Microelectronics Co Ltd + 000162 + Cygnet Technologies, Inc. - F4FBB8 - Huawei Technologies Ltd + 000167 + HIOKI E.E. CORPORATION - CC3331 - Texas Instruments + 000168 + VITANA CORPORATION - 2CB8ED - SonicWall + 00015F + DIGITAL DESIGN GmbH - C89BAD - Honor Device Ltd + 000164 + Cisco Systems, Inc - C45BBE - Espressif Inc. + 00B04A + Cisco Systems, Inc - 889009 - Juniper Networks + 00B048 + Marconi Communications Inc. - 90B67A - Shenzhen Skyworth Digital Technology Ltd + 00B0CE + Viveris Technologies - 7CD9F4 - UAB Teltonika Telematics + 00B01C + Westport Technologies - C8C64A - Flextronics Tech.(Ind) Pvt Ltd + 000119 + RTUnet (Australia) - FC4EA4 - Apple + 000122 + Trend Communications, Ltd. - F4BEEC - Apple + 00011A + Hoffmann und Burmeister GbR - BCFF4D - Espressif Inc. + 000124 + Acer Incorporated - 54E61B - Apple + 000142 + Cisco Systems, Inc - D89AC1 - Nokia + 00012C + Aravox Technologies, Inc. - F0B11D - Nokia + 000121 + WatchGuard Technologies, Inc. - 00047D - Motorola Solutions Inc. + 000129 + DFI Inc. - A4D795 - Wingtech Mobile Communications Ltd + 000154 + G3M Corporation - 84AB26 - Tiinlab Corporation + 000152 + CHROMATEK INC. - F89753 - Huawei Device Ltd + 000150 + GILAT COMMUNICATIONS, LTD. - 5894AE - Huawei Device Ltd + 000151 + Ensemble Communications - B03ACE - Huawei Device Ltd + 000115 + EXTRATECH CORPORATION - 34AB95 - Espressif Inc. + 000101 + Private - C491CF - Luxul + 00010D + Teledyne DALSA Inc. - 58356B - Tecno Mobile Limited + 000105 + Beckhoff Automation GmbH - F84CDA - Huawei Technologies Ltd + 00B017 + InfoGear Technology Corp. - A8934A - Chongqing Fugui Electronics Ltd + 00012B + TELENET Co., Ltd. - A4056E - Tiinlab Corporation + 00013F + Neighbor World Co., Ltd. - 8C19B5 - Arcadyan Corporation + 000185 + Hitachi Aloka Medical, Ltd. - C87B23 - Bose Corporation + 0001A2 + Logical Co., Ltd. - 78D9E9 - Momentum IOT + 00303A + MAATEL - 2C0823 - Sercomm France Sarl + 00302C + SYLANTRO SYSTEMS CORPORATION - 9C1C37 - AltoBeam (China) Inc. + 0030DF + KB/TEL TELECOMUNICACIONES - 8CE748 - Hangzhou Hikvision Digital Technology Ltd + 00304E + BUSTEC PRODUCTION LTD. - 984265 - Sagemcom Broadband SAS + 003063 + SANTERA SYSTEMS, INC. - B8A377 - Cisco Systems Inc. + 003030 + HARMONIX CORPORATION - E44E2D - Cisco Systems Inc. + 0030A3 + Cisco Systems, Inc - 00CC34 - Juniper Networks + 0030FD + INTEGRATED SYSTEMS DESIGN - 1CD107 - Realme Chongqing Mobile Telecommunications Corp Ltd + 0030B9 + ECTEL - 103D1C - Intel Corporation + 00307D + GRE AMERICA, INC. - 3887D5 - Intel Corporation + 003021 + HSING TECH. ENTERPRISE CO.,LTD - 806559 - EM Microelectronic + 00B02D + ViaGate Technologies, Inc. - D047C1 - Elma Electronic AG + 0030EE + DSG Technology, Inc. - C0CC42 - Sichuan Tianyi Comheart Telecom Ltd + 00309E + WORKBIT CORPORATION. - C42360 - Intel Corporation + 0030DE + WAGO Kontakttechnik GmbH - 08010F - Sichuan Tianyi Comheart Telecom Ltd + 00303E + Radcom Ltd. - 185207 - Sichuan Tianyi Comheart Telecom Ltd + 0030D7 + Innovative Systems, L.L.C. - E0C63C - Sichuan Tianyi Comheart Telecom Ltd + 0030A4 + Woodwind Communications System - DC215C - Intel Corporation + 00303B + PowerCom Technology - BCECA0 - Compal Information (Kunshan) Ltd + 0030BC + Optronic AG - F8BAE6 - Nokia + 0030B8 + RiverDelta Networks - 58FD5D - Hangzhou Xinyun technology Ltd + 003071 + Cisco Systems, Inc - 24A799 - Huawei Device Ltd + 003088 + Ericsson - 7C3E74 - Huawei Device Ltd + 0030B5 + Tadiran Microwave Networks - 148919 - 2bps + 003020 + TSI, Inc.. - 4C7167 - PoLabs d.o.o. + 0030EF + NEON TECHNOLOGY, INC. - 047153 - Sernet (Suzhou) Technologies Corporation + 003095 + Procomp Informatics, Ltd. - 48E7DA - Azurewave Technologies Inc. + 0030CA + Discovery Com - 40C48C - N-iTUS Ltd + 0030CE + Zaffire - 482218 - Shenzhen Yipingfang Network Technology Ltd + 003096 + Cisco Systems, Inc - 30A176 - Fiberhome Telecommunication Technologies Ltd + 003039 + SOFTBOOK PRESS - E40CFD - Guangdong Oppo Mobile Telecommunications Corp Ltd + 00301B + SHUTTLE, INC. - 58D697 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 00307B + Cisco Systems, Inc - 5437BB - Taicang T&W Electronics + 00D03B + VISION PRODUCTS PTY. LTD. - 60F8F2 - Synaptec + 00D0B3 + DRS Technologies Canada Ltd - AC74B1 - Intel Corporation + 00D000 + FERRAN SCIENTIFIC, INC. - 1C3CD4 - Huawei Technologies Ltd + 00D0D0 + ZHONGXING TELECOM LTD. - F4E451 - Huawei Technologies Ltd + 00D053 + CONNECTED SYSTEMS - 6026EF - Aruba Networks HP + 00D097 + Cisco Systems, Inc - F46077 - Texas Instruments + 00D08E + Grass Valley, A Belden Brand - 249AC8 - Shenzhen Skyworth Digital Technology Ltd + 00D056 + SOMAT CORPORATION - C03C04 - Sagemcom Broadband SAS + 00D0E0 + DOOIN ELECTRONICS CO. - A4D73C - Seiko Epson Corporation + 00D033 + DALIAN DAXIAN NETWORK - 6C108B - WeLink Communications + 00D0D6 + AETHRA TELECOMUNICAZIONI - F88EA1 - Edgecore Networks Corporation + 00D063 + Cisco Systems, Inc - 7C8530 - Nokia + 00D0F8 + FUJIAN STAR TERMINAL - F463E7 - Nanjing Maxon O.E. Tech Ltd + 00D0ED + XIOX - 2428FD - Hangzhou Hikvision Digital Technology Ltd + 003027 + KERBANGO, INC. - 88AEDD - EliteGroup Computer Systems Ltd + 003033 + ORIENT TELECOM CO., LTD. - 64D02D - Next Generation Integration Limited (NGI) + 0030DD + INDIGITA CORPORATION - A0E70B - Intel Corporation + 003099 + BOENIG UND KALLENBACH OHG - B0D888 - Panasonic Corporation Automotive + 0030F2 + Cisco Systems, Inc - 04EEEE - Laplace System Ltd + 003051 + ORBIT AVIONIC & COMMUNICATION - 68966A - Ohsung + 003008 + AVIO DIGITAL, INC. - 902E16 - LCFC(HeFei) Electronics Technology Ltd + 00301D + SKYSTREAM, INC. - 7806C9 - Huawei Device Ltd + 0030BA + AC&T SYSTEM CO., LTD. - E8A6CA - Huawei Device Ltd + 00D030 + Safetran Systems Corp - CCFA66 - Huawei Device Ltd + 00D047 + XN TECHNOLOGIES - 1C7D22 - FUJIFILM Business Innovation Corp. + 00D055 + KATHREIN-WERKE KG - 34FE9E - Fujitsu Limited + 00D0B0 + BITSWITCH LTD. - 0C718C - TCT mobile Ltd + 00302A + SOUTHERN INFORMATION - E030F9 - Juniper Networks + 0030E1 + Network Equipment Technologies, Inc. - 24085D - Continental Aftermarket & Services GmbH + 003001 + SMP - 34243E - ZTE Corporation + 00D021 + REGENT ELECTRONICS CORP. - 38453B - Ruckus Wireless + 00D09F + NOVTEK TEST SYSTEMS - 781305 - IEEE Registration Authority + 00D0FE + ASTRAL POINT - 205476 - Sony Corporation + 00D0D4 + V-BITS, INC. - 3017C8 - Sony Corporation + 00D0E7 + VCON TELECOMMUNICATION LTD. - 6C23B9 - Sony Corporation + 00D084 + NEXCOMM SYSTEMS, INC. - 6C0E0D - Sony Corporation + 00D099 + Elcard Wireless Systems Oy - 001963 - Sony Corporation + 00D01B + MIMAKI ENGINEERING CO., LTD. - 001620 - Sony Corporation + 00D083 + INVERTEX, INC. - 0012EE - Sony Corporation + 00D0BA + Cisco Systems, Inc - D4389C - Sony Corporation + 00D0E4 + Cisco Systems, Inc - 681BEF - Huawei Technologies Ltd + 00D08B + ADVA Optical Networking Ltd. - 002345 - Sony Corporation + 00D05A + SYMBIONICS, LTD. - 001FE4 - Sony Corporation + 00D079 + Cisco Systems, Inc - F44637 - Intel Corporation + 00D098 + Photon Dynamics Canada Inc. - 6450D6 - Liquidtool Systems + 00D0BE + EMUTEC INC. - 68764F - Sony Corporation + 00D0F4 + CARINTHIAN TECH INSTITUTE - 38A659 - Sagemcom Broadband SAS + 00D07D + COSINE COMMUNICATIONS - 606134 - Genesis Technical Systems Corp + 00D0AF + CUTLER-HAMMER, INC. - A848FA - Espressif Inc. + 00D052 + ASCEND COMMUNICATIONS, INC. - 505D7A - ZTE Corporation + 00D0AD + TL INDUSTRIES - FC58DF - Interphone Service + 00D0A4 + ALANTRO COMMUNICATIONS - 981082 - Nsolution Ltd + 00D00D + MICROMERITICS INSTRUMENT - C41234 - Apple + 00D04A + PRESENCE TECHNOLOGY GMBH - 3CA6F6 - Apple + 00D074 + TAQUA SYSTEMS, INC. - 4CAB4F - Apple + 00D0C7 + PATHWAY, INC. - 9C583C - Apple + 00D07A + AMAQUEST COMPUTER CORP. - E4DC5F - Cofractal Inc. + 00D0B8 + Iomega Corporation - 508140 - HP Inc. + 00509D + THE INDUSTREE B.V. - CC896C - GN Hearing A/S + 00D054 + SAS INSTITUTE INC. - 48F3F3 - Baidu Online Network Technology (Beijing) Ltd + 00D009 + HSING TECH. ENTERPRISE CO. LTD - D47350 - DBG Commnunications Technology Ltd + 00D092 + GLENAYRE WESTERN MULTIPLEX - 3C7AF0 - Itel Mobile Limited + 005058 + Sangoma Technologies - 70DA17 - Austrian Audio GmbH + 0050FE + PCTVnet ASA - 50411C - AMPAK Technology,Inc. + 0050AB + NALTEC, Inc. - 8C1ED9 - Beijing Unigroup Tsingteng Microsystem Ltd + 005037 + KOGA ELECTRONICS CO. - B03795 - LG Electronics + 005006 + TAC AB - A4FF95 - Nokia + 005009 + PHILIPS BROADBAND NETWORKS - F42679 - Intel Corporation + 005030 + FUTURE PLUS SYSTEMS - 3861A5 - Grabango Co + 0050D6 + ATLAS COPCO TOOLS AB - D08E79 - Dell Inc. + 005082 + FORESSON CORPORATION - 78D3ED - Norma + 0050DF + AirFiber, Inc. - 34B472 - Espressif Inc. + 0050AA + KONICA MINOLTA HOLDINGS, INC. - F80C58 - Taicang T&W Electronics + 005038 + DAIN TELECOM CO., LTD. - FC1999 - Xiaomi Communications Ltd + 00509E + Les Technologies SoftAcoustik Inc. - 241145 - Xiaomi Communications Ltd + 005071 + AIWA CO., LTD. - 5078B0 - Huawei Device Ltd + 00505F + BRAND INNOVATORS - E4072B - Huawei Device Ltd + 0050B4 + SATCHWELL CONTROL SYSTEMS, LTD - FCA89B - Texas Instruments + 0050D0 + MINERVA SYSTEMS - 98F07B - Texas Instruments + 0050D8 + UNICORN COMPUTER CORP. - 2446E4 - Huawei Technologies Ltd + 0050A8 + OpenCon Systems, Inc. - 68F0D0 - SkyBell Technologies Inc. + 00509C + BETA RESEARCH - BCD7A5 - Aruba Networks HP + 005023 + PG DESIGN ELECTRONICS, INC. - 4CF202 - Xiaomi Communications Ltd + 0050B1 + GIDDINGS & LEWIS - 884604 - Xiaomi Communications Ltd + 0050B7 + BOSER TECHNOLOGY CO., LTD. - A45590 - Xiaomi Communications Ltd + 005078 + MEGATON HOUSE, LTD. - 081C6E - Xiaomi Communications Ltd + 005002 + OMNISEC AG - 84AC16 - Apple + 00506A + EDEVA, INC. - 2CBC87 - Apple + 0050C5 + ADS Technologies, Inc - 44A92C - IEEE Registration Authority + 00508E + OPTIMATION, INC. - D88083 - Cloud Network Technology Singapore PTE Ltd + 005028 + AVAL COMMUNICATIONS - ACB92F - Hangzhou Hikvision Digital Technology Ltd + 00502F + TollBridge Technologies, Inc. - 187758 - Audoo Limited (UK) + 005074 + ADVANCED HI-TECH CORP. - 90E868 - Azurewave Technologies Inc. + 00500A + IRIS TECHNOLOGIES, INC. - 4C50F1 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 005070 + CHAINTECH COMPUTER CO., LTD. - FC4265 - Zhejiang Tmall Technology Ltd + 00503F + ANCHOR GAMES - B4E454 - Amazon Technologies Inc. + 005032 + PICAZO COMMUNICATIONS, INC. - 0C43F9 - Amazon Technologies Inc. + 00506D + VIDEOJET SYSTEMS - 6887C6 - Cisco Systems Inc. + 009008 + HanA Systems Inc. - 80248F - Cisco Systems Inc. + 009088 + BAXALL SECURITY LTD. - D494FB - Continental Automotive Systems Inc. + 00906C + Sartorius Hamburg GmbH - 44D454 - Sagemcom Broadband SAS + 0090A4 + ALTIGA NETWORKS - E89526 - Luxshare Precision Industry Ltd + 0090F9 + Imagine Communications - C8C9A3 - Espressif Inc. + 009089 + SOFTCOM MICROSYSTEMS, INC. - E43BC9 - Hisense Visual Technology Ltd + 0090EE + PERSONAL COMMUNICATIONS TECHNOLOGIES - D49390 - Clevo Co. + 009080 + NOT LIMITED, INC. - BC062D - Wacom Ltd + 0090E8 + MOXA TECHNOLOGIES CORP., LTD. - 104121 - Tellescom Industria E Comercio EM Telecomunicacao + 0090A1 + Flying Pig Systems/High End Systems Inc. - 50E7A0 - Renesas Electronics (Penang) Sdn. Bhd. + 009079 + ClearOne, Inc. - 001398 - TrafficSim Ltd + 00909A + ONE WORLD SYSTEMS, INC. - 500A52 - Huiwan Technologies Ltd + 0090C2 + JK microsystems, Inc. - 409CA6 - Curvalux + 0090AC + OPTIVISION, INC. - 9C9726 - Technicolor Delivery Technologies Belgium NV + 0050B2 + BRODEL GmbH - 30918F - Technicolor Delivery Technologies Belgium NV + 009076 + FMT AIRCRAFT GATE SUPPORT SYSTEMS AB - E0B9E5 - Technicolor Delivery Technologies Belgium NV + 009017 + Zypcom, Inc - 807EB4 - Shenzhen SuperElectron Technology Ltd + 009049 + ENTRIDIA CORPORATION - 504B9E - Huawei Device Ltd + 009043 + Tattile SRL - 047AAE - Huawei Device Ltd + 0090AD + ASPECT ELECTRONICS, INC. - 3C93F4 - Huawei Technologies Ltd + 0090E6 + ALi Corporation - 6433B5 - IEEE Registration Authority + 009070 + NEO NETWORKS, INC. - 8C4B14 - Espressif Inc. + 009030 + HONEYWELL-DATING - D4E853 - Hangzhou Hikvision Digital Technology Ltd + 0090C8 + WAVERIDER COMMUNICATIONS (CANADA) INC. - 18E215 - Nokia + 00901B + DIGITAL CONTROLS - 4CE2F1 - Udino srl + 00904E + DELEM BV - B88C29 - GD Midea Air-Conditioning Equipment Ltd + 0090ED + CENTRAL SYSTEM RESEARCH CO., LTD. - BC6AD1 - Xiaomi Communications Ltd + 009075 + NEC DO BRASIL S.A. - 8427B6 - China Mobile IOT Company Limited + 009001 + NISHIMU ELECTRONICS INDUSTRIES CO., LTD. - 5444A3 - Samsung Electronics Ltd + 00901E + Selesta Ingegneria S.p.A. - 64B623 - Schrack Seconet Care Communication GmbH + 0010EC + Embedded Planet - 0845D1 - Cisco Systems Inc. + 001059 + DIABLO RESEARCH CO. LLC - 9C40CD - Synclayer Inc. + 001069 + HELIOSS COMMUNICATIONS, INC. - 785EE8 - IEEE Registration Authority + 0010BF + InterAir Wireless - CCBCE3 - Huawei Technologies Ltd + 001036 + INTER-TEL INTEGRATED SYSTEMS - 089E84 - Huawei Technologies Ltd + 001026 + ACCELERATED NETWORKS, INC. - 1082D7 - Realme Chongqing Mobile Telecommunications Corp Ltd + 0010AC + IMCI TECHNOLOGIES - 3003C8 - Cloud Network Technology Singapore PTE Ltd + 0010FC + BROADBAND NETWORKS, INC. - 088EDC - Apple + 001031 + OBJECTIVE COMMUNICATIONS, INC. - 98502E - Apple + 00106D + Axxcelera Broadband Wireless - 580AD4 - Apple + 0010D0 + WITCOM, LTD. - A477F3 - Apple + 001093 + CMS COMPUTERS, LTD. - A84A28 - Apple + 00108F + RAPTOR SYSTEMS - D8BE1F - Apple + 001063 + STARGUIDE DIGITAL NETWORKS - 10B7A8 - CableFree Networks Limited + 001023 + Network Equipment Technologies - 089BF1 - eero Inc. + 00102B + UMAX DATA SYSTEMS, INC. - 001114 - EverFocus Electronics Corp. + 00108D + Johnson Controls, Inc. - D03F27 - Wyze Labs Inc + 0090F7 + NBASE COMMUNICATIONS LTD. - 50297B - China Mobile Group Device Ltd + 009012 + GLOBESPAN SEMICONDUCTOR, INC. - 6CDDEF - EPCOMM Inc. + 00908A + BAYLY COMMUNICATIONS, INC. - D0F121 - Xi'an LINKSCI Technology Ltd + 00900E + HANDLINK TECHNOLOGIES, INC. - EC1C5D - Siemens AG + 001045 + Nortel Networks - 78444A - Shenzhen Aiwinn Information Technology Ltd + 00107D + AURORA COMMUNICATIONS, LTD. - 8CB87E - Intel Corporation + 001039 + Vectron Systems AG - 701AB8 - Intel Corporation + 0010B6 + ENTRATA COMMUNICATIONS CORP. - 5CDF89 - Ruckus Wireless + 0090E4 + NEC AMERICA, INC. - 70B64F - Guangzhou V-SOLUTION Electronic Technology Ltd + 0090C1 + Peco II, Inc. - B4205B - Guangdong Oppo Mobile Telecommunications Corp Ltd + 009040 + Siemens Network Convergence LLC - 187A3B - Aruba Networks HP + 009047 + GIGA FAST E. LTD. - 70B9BB - Shenzhen Hankvision Technology Ltd + 0090E1 + TELENA S.P.A. - A4C69A - Samsung Electronics Ltd + 0090CB + Wireless OnLine, Inc. - D0F520 - KYOCERA Corporation + 0090B7 + DIGITAL LIGHTWAVE, INC. - B89470 - Calix Inc. + 0090A0 + 8X8 INC. - 947F1D - Shenzhen Fastrain Technology Ltd + 009032 + PELCOMBE GROUP LTD. - 607DDD - Shenzhen Shichuangyi Electronics Ltd + 00104C + Teledyne LeCroy, Inc - 240F9B - Hangzhou Hikvision Digital Technology Ltd + 0010CC + CLP COMPUTER LOGISTIK PLANUNG GmbH - E4293D - Shenzhen Sy-Fiber Optical Communication Technology Ltd + 001030 + EION Inc. - AC5E14 - Huawei Technologies Ltd + 001062 + NX SERVER, ILNC. - 20DF73 - Huawei Technologies Ltd + 0010F0 + RITTAL-WERK RUDOLF LOH GmbH & Co. - 48128F - Huawei Technologies Ltd + 001001 + Citel - 9C5636 - Huawei Device Ltd + 00105C + QUANTUM DESIGNS (H.K.) LTD. - 40CA63 - Seongji Industry Company + 001075 + Segate Technology LLC - D48A3B - Hunan FN-Link Technology Limited + 0010B1 + FOR-A CO., LTD. - 4006D5 - Cisco Systems Inc. + 0010EE + CTI PRODUCTS, INC. - A022DE - Vivo Mobile Communication Ltd + 001041 + BRISTOL BABCOCK, INC. - 14DD9C - Vivo Mobile Communication Ltd + 0010AA + MEDIA4, INC. - 2C4881 - Vivo Mobile Communication Ltd + 0010E8 + TELOCITY, INCORPORATED - 9431CB - Vivo Mobile Communication Ltd + 0010A2 + TNS - 207454 - Vivo Mobile Communication Ltd + 001000 + CABLE TELEVISION LABORATORIES, INC. - BC2228 - D-Link International + 001009 + HORANET - 103C59 - ZTE Corporation + 0010F8 + TEXIO TECHNOLOGY CORPORATION - C4CA2B - Arista Networks + 0010C0 + ARMA, Inc. - 002469 - Fasttel - Smart Doorphones + 001002 + ACTIA - B43D08 - GX International BV + 00105B + NET INSIGHT AB - 7089F5 - Dongguan Lingjie IOT Ltd + 0010EB + SELSIUS SYSTEMS, INC. - 88DC96 - EnGenius Technologies Inc. + 00101D + WINBOND ELECTRONICS CORP. - 40B0A1 - Valcom Ltd + 00109F + PAVO, INC. - B8208E - Panasonic Corporation Connected Solutions Company + 001084 + K-BOT COMMUNICATIONS - 90380C - Espressif Inc. + 0010F9 + UNIQUE SYSTEMS, INC. - 847B57 - Intel Corporation + 0010CF + FIBERLANE COMMUNICATIONS - 64CBE9 - LG Innotek + 0010A4 + XIRCOM - 9C756E - Ajax Systems DMCC + 0010F1 + I-O CORPORATION - F06C73 - Nokia + 001057 + Rebel.com, Inc. - E8F9D4 - Huawei Technologies Ltd + 001065 + RADYNE CORPORATION - B0C787 - Huawei Technologies Ltd + 001066 + ADVANCED CONTROL SYSTEMS, INC. - 0C4F9B - Huawei Technologies Ltd + 00E09F + PIXEL VISION - 7C214A - Intel Corporation + 00E0CC + HERO SYSTEMS, LTD. - 508492 - Intel Corporation + 00E080 + CONTROL RESOURCES CORPORATION - 482FD7 - Huawei Technologies Ltd + 00E004 + PMC-SIERRA, INC. - 24D81E - MirWifi,Joint-Stock Company + 00E03B + PROMINET CORPORATION - 9880BB - IEEE Registration Authority + 00E0F5 + TELES AG - D8B053 - Xiaomi Communications Ltd + 00E0D7 + SUNSHINE ELECTRONICS, INC. - 6CF784 - Xiaomi Communications Ltd + 00E095 + ADVANCED-VISION TECHNOLGIES CORP. - 042B58 - Shenzhen Hanzsung Technology Ltd + 00E00E + AVALON IMAGING SYSTEMS, INC. - 28C01B - Shenzhen Skyworth Digital Technology Ltd + 00E048 + SDL COMMUNICATIONS, INC. - B812DA - Lvswitches Inc. + 00E0CB + RESON, INC. - A0D7F3 - Samsung Electronics Ltd + 00E0C8 + VIRTUAL ACCESS, LTD. - E86D6E - voestalpine Signaling UK Ltd + 00E006 + SILICON INTEGRATED SYS. CORP. - 282A87 - Itel Mobile Limited + 00E0AC + MIDSCO, INC. - A8B57C - Roku Inc. + 00E0FA + TRL TECHNOLOGY, LTD. - 78C6BB - Analog Devices Inc. + 00E02C + AST COMPUTER - 2426BA - Shenzhen Toptel Technology Ltd + 00E067 + eac AUTOMATION-CONSULTING GmbH - 546CEB - Intel Corporation + 00E008 + AMAZING CONTROLS! INC. - 009337 - Intel Corporation + 00E0AE + XAQTI CORPORATION - 7890A2 - ZTE Corporation + 00E0E0 + SI ELECTRONICS, LTD. - 602232 - Ubiquiti Networks Inc. + 00E003 + NOKIA WIRELESS BUSINESS COMMUN - ACBCD9 - Cisco Systems Inc. + 00E0F3 + WebSprint Communications, Inc. - 58CE2A - Intel Corporation + 08BBCC + AK-NORD EDV VERTRIEBSGES. mbH - 10A51D - Intel Corporation + 00E0DB + ViaVideo Communications, Inc. - 088E90 - Intel Corporation + 00E0A6 + TELOGY NETWORKS, INC. - C04442 - Apple + 00604B + Safe-com GmbH & Co. KG - D468AA - Apple + 00606B + Synclayer Inc. - 98DD60 - Apple + 00603B + AMTEC spa - F8C3CC - Apple + 00E039 + PARADYNE CORP. - 301A28 - Mako Networks Ltd + 00600B + LOGWARE GmbH - 305A99 - Sichuan Tianyi Comheart Telecom Ltd + 00E0EF + DIONEX - 604DE1 - Huawei Technologies Ltd + 00E051 + TALX CORPORATION - 704E6B - Huawei Technologies Ltd + 00E02D + InnoMediaLogic, Inc. - 70C6DD - New H3C Technologies Ltd + 00E035 + Artesyn Embedded Technologies - 3C9EC7 - BSkyB Ltd + 00E090 + BECKMAN LAB. AUTOMATION DIV. - 185B00 - Nokia + 00E085 + GLOBAL MAINTECH, INC. - 6CC49F - Aruba Networks HP + 00E0A0 + WILTRON CO. - 603D29 - Huawei Technologies Ltd + 00E0C7 + EUROTECH SRL - 54C480 - Huawei Technologies Ltd + 00E0F1 + THAT CORPORATION - A861DF - China Mobile Group Device Ltd + 00E0AF + GENERAL DYNAMICS INFORMATION SYSTEMS - 7CA62A - Hewlett Packard Enterprise + 00E054 + KODAI HITEC CO., LTD. - 1C4586 - Nintendo Ltd + 00E0B9 + BYAS SYSTEMS - 507C6F - Intel Corporation + 00E023 + TELRAD - 589B4A - DWnet Technologies(Suzhou) Corporation + 00E02A + TANDBERG TELEVISION AS - 5C83CD - New platforms + 00E04E + SANYO DENKI CO., LTD. - 384B24 - Siemens AG + 00E012 + PLUTO TECHNOLOGIES INTERNATIONAL INC. - F0AE66 - Cosonic Intelligent Technologies Ltd + 00E04C + REALTEK SEMICONDUCTOR CORP. - 208097 - Shenzhen OXO Technology limited + 0060B5 + KEBA GmbH - 7C1689 - Sagemcom Broadband SAS + 006001 + InnoSys, Inc. - 4011C3 - Samsung Electronics Ltd + 0060FE + LYNX SYSTEM DEVELOPERS, INC. - C47D9F - Samsung Electronics Ltd + 0060BD + Enginuity Communications - 9C5440 - Private + 000800 + MULTITECH SYSTEMS, INC. - 3CA916 - Huawei Device Ltd + 00E0B5 + ARDENT COMMUNICATIONS CORP. - C41C07 - Samsung Electronics Ltd + 00E068 + MERRIMAC SYSTEMS INC. - 58FCC6 - Tozo Inc + 00E049 + MICROWI ELECTRONIC GmbH - 004036 - Minim Inc. + 00E050 + EXECUTONE INFORMATION SYSTEMS, INC. - 448502 - Shenzhen SuperElectron Technology Ltd + 00E0BE + GENROCO INTERNATIONAL, INC. - A4EF15 - AltoBeam (China) Inc. + 00E0B6 + Entrada Networks - D49400 - Huawei Technologies Ltd + 00E0F4 + INSIDE Technology A/S - 8415D3 - Huawei Technologies Ltd + 00607E + GIGALABS, INC. - A06C65 - Texas Instruments + 00603F + PATAPSCO DESIGNS - F4A454 - IEEE Registration Authority + 0060D2 + LUCENT TECHNOLOGIES TAIWAN TELECOMMUNICATIONS CO., LTD. - 10E8A7 - Wistron Neweb Corporation + 0060CD + VideoServer, Inc. - D42C46 - Buffalo Inc. + 0060AA + INTELLIGENT DEVICES INC. (IDI) - 1091A8 - Espressif Inc. + 006065 + B&R Industrial Automation GmbH - 6C3A36 - Glowforge Inc + 00605D + SCANIVALVE CORP. - 806A00 - Cisco Systems Inc. + 00602C + LINX Data Terminals, Inc. - D46C6D - ARRIS Group Inc. + 0060AC + RESILIENCE CORPORATION - A0E7AE - ARRIS Group Inc. + 00604E + CYCLE COMPUTER CORPORATION, INC. - EC50AA - Aruba Networks HP + 006014 + EDEC CO., LTD. - B44506 - Dell Inc. + 0060E1 + ORCKIT COMMUNICATIONS LTD. - CCA3BD - Itel Mobile Limited + 0060E6 + SHOMITI SYSTEMS INCORPORATED - D4354A - ALAXALA Networks Corporation + 0060FF + QuVis, Inc. - 40E99B - Samsung Electro-Mechanics(Thailand) + 006067 + ACER NETXUS INC. - 78047A - Edge Networks LLC + 00609F + PHAST CORPORATION - BCAF87 - smartAC.com Inc. + 006042 + TKS (USA), INC. - C02B31 - Phytium Technology Ltd + 006079 + Mainstream Data, Inc. - 58CF79 - Espressif Inc. + 00609A + NJK TECHNO CO. - 4CC449 - Icotera A/S + 00602B + PEAK AUDIO - BC455B - Samsung Electronics Ltd + 0060F1 + EXP COMPUTER, INC. - B03CDC - Intel Corporation + 0005A8 + WYLE ELECTRONICS - 0009B0 - Onkyo Technology K.K. + 006040 + NETRO CORP. - 08F80D - IEEE Registration Authority + 0060CC + EMTRAK, INCORPORATED - 786299 - BITSTREAM sp. z o.o. + 00606F + CLARION CORPORATION OF AMERICA - CC5B31 - Nintendo Ltd + 006090 + Artiza Networks Inc - 0C1EF7 - Omni-ID + 006025 + ACTIVE IMAGING PLC - E06D18 - Pioneercorporation + 0060A7 + MICROSENS GmbH & CO. KG - 8CF8C5 - Intel Corporation + 006030 + VILLAGE TRONIC ENTWICKLUNG - 345D9E - Sagemcom Broadband SAS + 00A00D + THE PANDA PROJECT - A45FB9 - DreamBig Semiconductor Inc. + 00A0E9 + ELECTRONIC RETAILING SYSTEMS INTERNATIONAL - B4D286 - Telechips Inc. + 00A0BE + INTEGRATED CIRCUIT SYSTEMS, INC. COMMUNICATIONS GROUP - 000F32 - Lootom Telcovideo Network (Wuxi) Ltd + 00A010 + SYSLOGIC DATENTECHNIK AG - 18C23C - Lumi United Technology Ltd + 00A016 + MICROPOLIS CORP. - 0475F9 - Taicang T&W Electronics + 00A048 + QUESTECH, LTD. - E85177 - Qingdao Intelligent & Precise Electronics Ltd + 00A0BD + I-TECH CORP. - 388A21 - UAB Teltonika Telematics + 00A059 + HAMILTON HALLMARK - A05950 - Intel Corporation + 00A039 + ROSS TECHNOLOGY, INC. - 50874D - Guangdong Oppo Mobile Telecommunications Corp Ltd + 00A0AD + MARCONI SPA - 5089D1 - Huawei Device Ltd + 0060E5 + FUJI AUTOMATION CO., LTD. - 00620B - Broadcom Limited + 00605E + LIBERTY TECHNOLOGY NETWORKING - A41752 - Hifocus Electronics India Private Limited + 0060C6 + DCS AG - 40FE95 - New H3C Technologies Ltd + 00601E + SOFTLAB, INC. - BCD074 - Apple + 00600D + Digital Logic GmbH - F061C0 - Aruba Networks HP + 00604A + SAIC IDEAS GROUP - DCCCE6 - Samsung Electronics Ltd + 00A0FC + IMAGE SCIENCES, INC. - F065AE - Samsung Electronics Ltd + 00A09C + Xyplex, Inc. - 1C70C9 - Jiangsu Aisida Electronic Ltd + 00A0D6 + SBE, Inc. - 9CB8B4 - AMPAK Technology,Inc. + 00A02E + BRAND COMMUNICATIONS, LTD. - 004084 - Honeywell + 00A0AF + WMS INDUSTRIES - A05394 - Shenzhen zediel Ltd + 00A057 + LANCOM Systems GmbH - 04EEE8 - IEEE Registration Authority + 00A09F + COMMVISION CORP. - 3CF7D1 - OMRON Corporation + 00A06E + AUSTRON, INC. - 84B4DB - Silicon Laboratories + 00A0BA + PATTON ELECTRONICS CO. - 38C804 - Hui Zhou Gaoshengda Technology Ltd + 00A0B5 + 3H TECHNOLOGY - E007C2 - Fujian Star-NET Communication Ltd + 00A04D + EDA INSTRUMENTS, INC. - 2CFDB4 - Shenzhen Jingxun Software Telecommunication Technology Ltd + 00A086 + AMBER WAVE SYSTEMS, INC. - B4F267 - Compal Broadband Networks Inc. + 00A01E + EST CORPORATION - C0BAE6 - Application Solutions (Safety and Security) Ltd + 00A062 + AES PRODATA - 18D793 - IEEE Registration Authority + 00A0AE + NUCOM SYSTEMS, INC. - 0009E5 - Hottinger Bruel & Kjaer GmbH + 00A076 + CARDWARE LAB, INC. - D8B673 - Texas Instruments + 00A0A1 + EPIC DATA INC. - 9850A3 - Signaltek JSC + 00A0CA + FUJITSU DENSO LTD. - C0FBC1 - Itel Mobile Limited + 00A022 + CENTRE FOR DEVELOPMENT OF ADVANCED COMPUTING - E817FC - Fujitsu Cloud Technologies Limited + 00A0C0 + DIGITAL LINK CORP. - B0DD74 - Heimgard Technologies AS + 00A044 + NTT IT CO., LTD. - DC3643 - IEEE Registration Authority + 00A011 + MUTOH INDUSTRIES LTD. - 102C8D - GD Midea Air-Conditioning Equipment Ltd + 00A0B6 + SANRITZ AUTOMATION CO., LTD. - 94E686 - Espressif Inc. + 00A079 + ALPS ELECTRIC (USA), INC. - F828C9 - Huawei Technologies Ltd + 00A08D + JACOMO CORPORATION - 50B3B4 - Shenzhen Furuilian Electronic Ltd + 00A08E + Check Point Software Technologies - B48C9D - Azurewave Technologies Inc. + 00A0F5 + RADGUARD LTD. - FC1193 - Huawei Technologies Ltd + 00A084 + Dataplex Pty Ltd - E43883 - Ubiquiti Networks Inc. + 00A049 + DIGITECH INDUSTRIES, INC. - 34B883 - Cisco Systems Inc. + 00A09D + JOHNATHON FREEMAN TECHNOLOGIES - C07982 - TCL King Electrical Appliances(Huizhou) Ltd + 00A0F9 + BINTEC COMMUNICATIONS GMBH - D0EDFF - ZF Cvcs + 00A003 + Siemens Switzerland Ltd., I B T HVP - F8A91F - ZVISION Technologies Ltd + 000267 + NODE RUNNER, INC. - 4CBAD7 - LG Innotek + 0020B1 + COMTECH RESEARCH INC. - 7CC95E - Dongguan Liesheng Electronic Ltd + 002032 + ALCATEL TAISEL - 7CCCFC - Quectel Wireless Solutions Ltd + 0020E9 + DANTEL - 988FE0 - IEEE Registration Authority + 002022 + NMS Communications - 34D737 - IBG Industriebeteiligungsgesellschaft mbH &b Co. KG + 0020AE + ORNET DATA COMMUNICATION TECH. - 2C3341 - China Mobile IOT Company Limited + 0020AA + Ericsson Television Limited - AC567B - Sunnovo International Limited + 00A06B + DMS DORSCH MIKROSYSTEM GMBH - 9CC12D - GD Midea Air-Conditioning Equipment Ltd + 00A030 + CAPTOR NV/SA - 80657C - Apple + 00A0DE + YAMAHA CORPORATION - DC8084 - Apple + 00A0F8 + Zebra Technologies Inc - 8CC7C3 - Netlink ICT + 002005 + SIMPLE TECHNOLOGY - 7C35F8 - Zhejiang Tmall Technology Ltd + 0020FA + GDE SYSTEMS, INC. - 7426FF - ZTE Corporation + 002038 + VME MICROSYSTEMS INTERNATIONAL CORPORATION - C42728 - ZTE Corporation + 0020A3 + Harmonic, Inc - C85895 - Motorola Mobility LLC, a Lenovo Company + 002059 + MIRO COMPUTER PRODUCTS AG - E4DADF - Taicang T&W Electronics + 002080 + SYNERGY (UK) LTD. - A8537D - Mist Systems Inc. + 002018 + CIS TECHNOLOGY INC. - 303422 - eero Inc. + 002098 + HECTRONIC AB - 08E021 - Honor Device Ltd + 0020FD + ITV TECHNOLOGIES, INC. - B05C16 - Fiberhome Telecommunication Technologies Ltd + 002034 + ROTEC INDUSTRIEAUTOMATION GMBH - E8D322 - Cisco Systems Inc. + 002079 + MIKRON GMBH - 8C1553 - Beijing Memblaze Technology Ltd + 0020F5 + PANDATEL AG - D4BD4F - Ruckus Wireless + 002074 + SUNGWOON SYSTEMS - 5CC9C0 - Renesas Electronics (Penang) Sdn. Bhd. + 00203C + EUROTIME AB - 6CB158 - TP-Link Technologies Ltd + 002028 + WEST EGG SYSTEMS, INC. - E881AB - Beijing Sankuai Online Technology Ltd + 002068 + ISDYNE - 1C47F6 - Zhidao Network Technology(Shenzhen) Ltd + 0020C8 + LARSCOM INCORPORATED - A0B4BF - InfiNet LLC + 00C023 + TUTANKHAMON ELECTRONICS - E8EBD3 - Mellanox Technologies Inc. + 00C08B + RISQ MODULAR SYSTEMS, INC. - 302BDC - Top-Unum Electronics Ltd + 0020C4 + INET,INC. - 90F7B2 - New H3C Technologies Ltd + 00200E + NSSLGlobal Technologies AS - 04E31A - Sagemcom Broadband SAS + 0020E7 + B&W NUCLEAR SERVICE COMPANY - C0060C - Huawei Technologies Ltd + 00209D + LIPPERT AUTOMATIONSTECHNIK - B0A4F0 - Huawei Technologies Ltd + 00209C + PRIMARY ACCESS CORP. - 24753A - Guangdong Oppo Mobile Telecommunications Corp Ltd + 00206D + DATA RACE, INC. - 6C999D - Amazon Technologies Inc. + 00203A + DIGITAL BI0METRICS INC. - 6C9308 - IEEE Registration Authority + 0020A4 + MULTIPOINT NETWORKS - 7C6A60 - China Mobile Group Device Ltd + 002051 + Verilink Corporation - 6818D9 - Hill AFB - CAPRE Group + 00203B + WISDM LTD. - 18BC57 - ADVA Optical Networking Ltd + 0020BA + CENTER FOR HIGH PERFORMANCE - D8E2DF - Microsoft Corporation + 00C0C3 + ACUSON COMPUTED SONOGRAPHY - 1C61B4 - TP-Link Corporation Limited + 00C0B3 + COMSTAT DATACOMM CORPORATION - 9CA2F4 - TP-Link Corporation Limited + 00C0E5 + GESPAC, S.A. - B4695F - TCT mobile Ltd + 00C04D + MITEC, INC. - 388F30 - Samsung Electronics Ltd + 0020DC + DENSITRON TAIWAN LTD. - A04466 - Intellics + 002048 + Marconi Communications - 446D7F - Amazon Technologies Inc. + 00200C + ADASTRA SYSTEMS CORP. - 84C692 - Texas Instruments + 002011 + CANOPUS CO., LTD. - 6CB2FD - Texas Instruments + 0020F0 + UNIVERSAL MICROELECTRONICS CO. - 6C0F61 - Hypervolt Ltd + 002089 + T3PLUS NETWORKING, INC. - 2406F2 - Sichuan Tianyi Comheart Telecom Ltd + 002061 + GarrettCom, Inc. - C06DED - Hangzhou Hikvision Digital Technology Ltd + 00C0A1 + TOKYO DENSHI SEKEI CO. - 90935A - ARRIS Group Inc. + 00C02E + NETWIZ - AC8FA9 - Nokia Solutions and Networks GmbH & Co. KG + 00C047 + UNIMICRO SYSTEMS, INC. - 4C734F - Juniper Networks + 00C084 + DATA LINK CORP. LTD. - C0C170 - Shenzhen SuperElectron Technology Ltd + 00C041 + DIGITAL TRANSMISSION SYSTEMS - 504289 - ZTE Corporation + 00C00D + ADVANCED LOGIC RESEARCH, INC. - 44291E - AltoBeam (China) Inc. + 00C0B4 + MYSON TECHNOLOGY, INC. - 24EBED - Huawei Technologies Ltd + 00C080 + NETSTAR, INC. - 308E7A - Shenzhen iComm Semiconductor Ltd + 00C045 + ISOLATION SYSTEMS, LTD. - 2CDD5F - Shenzhen iComm Semiconductor Ltd + 0070B3 + DATA RECALL LTD. - AC51AB - Huawei Technologies Ltd + 00E6D3 + NIXDORF COMPUTER CORP. - 48CDD3 - Huawei Technologies Ltd + 0070B0 + M/A-COM INC. COMPANIES - CC6618 - Adtran Inc + 00C01F + S.E.R.C.E.L. - E0276C - Guangzhou Shiyuan Electronic Technology Company Limited + 006086 + LOGIC REPLACEMENT TECH. LTD. - DC8E95 - Silicon Laboratories + 00C0B6 + HVE, Inc. - 28BE43 - Vivo Mobile Communication Ltd + 00C07A + PRIVA B.V. - 2CFC8B - Guangdong Oppo Mobile Telecommunications Corp Ltd + 00C06D + BOCA RESEARCH, INC. - F8AD24 - Realme Chongqing Mobile Telecommunications Corp Ltd + 00C0EA + ARRAY TECHNOLOGY LTD. - B01F8C - Aruba Networks HP + 00C009 + KT TECHNOLOGY (S) PTE LTD - A8C98A - New H3C Technologies Ltd + 00C081 + METRODATA LTD. - 002604 - WorldCast Systems + 00C03B + MULTIACCESS COMPUTING CORP. - 7CEF40 - Nextorage Corporation + 00C082 + MOORE PRODUCTS CO. - 1CAF4A - Samsung Electronics Ltd + 00C099 + YOSHIKI INDUSTRIAL CO.,LTD. - C8120B - Samsung Electronics Ltd + 00C0DC + EOS TECHNOLOGIES, INC. - 2874F5 - Nokia Solutions and Networks GmbH & Co. KG + 00C03C + TOWER TECH S.R.L. - C0E01C - IoT Security Group, SL + 00C01D + GRAND JUNCTION NETWORKS, INC. - 0000BD - RYOSEI Ltd + 00C070 + SECTRA SECURE-TRANSMISSION AB - 902CFB - CanTops Ltd + 00C072 + KNX LTD. - F8AB82 - Xiaomi Communications Ltd + 00C0AE + TOWERCOM CO. INC. DBA PC HOUSE - EC30B3 - Xiaomi Communications Ltd + 00C0D6 + J1 SYSTEMS, INC. - 00CB7A - Technicolor CH USA Inc. + 00C0F6 + CELAN TECHNOLOGY INC. - A8A237 - Arcadyan Corporation + 00C0C2 + INFINITE NETWORKS LTD. - 9C57BC - eero Inc. + 00C0AF + TEKLOGIX INC. - 2C8217 - Apple + 00C059 + DENSO CORPORATION - 142D4D - Apple + 00C0F1 + SHINKO ELECTRIC CO., LTD. - EC42CC - Apple + 00C001 + DIATEK PATIENT MANAGMENT - B8211C - Apple + 00C0F4 + INTERLINK SYSTEM CO., LTD. - B03F64 - Apple + 00C0E2 + CALCOMP, INC. - ACCCFC - Amazon Technologies Inc. + 00C07B + ASCEND COMMUNICATIONS, INC. - 9CFFC2 - AVI Systems GmbH + 00C098 + CHUNTEX ELECTRONIC CO., LTD. - 44D878 - Hui Zhou Gaoshengda Technology Ltd + 00C0BE + ALCATEL - SEL - A0D807 - Huawei Device Ltd + 00C06E + HAFT TECHNOLOGY, INC. - 2C780E - Huawei Device Ltd + 00C0F8 + ABOUT COMPUTING INC. - 34B20A - Huawei Device Ltd + 00C078 + COMPUTER SYSTEMS ENGINEERING - 98F4AB - Espressif Inc. + 00C09A + PHOTONICS CORPORATION - D8BFC0 - Espressif Inc. + 00C01A + COROMETRICS MEDICAL SYSTEMS - 202681 - Tecno Mobile Limited + 00C068 + HME Clear-Com LTD. - F4D620 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 00C0D8 + UNIVERSAL DATA SYSTEMS - 64FB92 - PPC Broadband Inc. + 004099 + NEWGEN SYSTEMS CORP. - 141346 - Skyworth Digital Technology(Shenzhen) Ltd + 004011 + ANDOVER CONTROLS CORPORATION - 949034 - Shenzhen Chuangwei-RGB Electronics Ltd + 0040A1 + ERGO COMPUTING - 987A10 - Ericsson AB + 004081 + MANNESMANN SCANGRAPHIC GMBH - 542BDE - New H3C Technologies Ltd + 004036 + Minim Inc. - 98F781 - ARRIS Group Inc. + 004016 + ADC - Global Connectivity Solutions Division - 7897C3 - Dingxin Information Technology Ltd + 00406A + KENTEK INFORMATION SYSTEMS,INC - 4C90DB - JL Audio + 00400A + PIVOTAL TECHNOLOGIES, INC. - B899AE - Shenzhen MiaoMing Intelligent Technology Ltd + 004082 + LABORATORY EQUIPMENT CORP. - E8D0B9 - Taicang T&W Electronics + 00C08C + PERFORMANCE TECHNOLOGIES, INC. - 3C8F06 - Shenzhen Libtor Technology Ltd + 00C007 + PINNACLE DATA SYSTEMS, INC. - B00875 - Huawei Technologies Ltd + 00C08A + Lauterbach GmbH - 8CF112 - Motorola Mobility LLC, a Lenovo Company + 0040B7 + STEALTH COMPUTER SYSTEMS - 847637 - Huawei Technologies Ltd + 0040A8 + IMF INTERNATIONAL LTD. - FC9435 - Huawei Technologies Ltd + 004070 + INTERWARE CO., LTD. - E02481 - Huawei Technologies Ltd + 0040AC + SUPER WORKSTATION, INC. - A8C0EA - Pepwave Limited + 00C0F7 + ENGAGE COMMUNICATION, INC. - 182AD3 - Juniper Networks + 10005A + IBM Corp - 80B07B - ZTE Corporation + 0040E0 + ATOMWIDE LTD. - C85A9F - ZTE Corporation + 0040D1 + FUKUDA DENSHI CO., LTD. - 44AEAB - Guangdong Oppo Mobile Telecommunications Corp Ltd + 004069 + LEMCOM SYSTEMS, INC. - A4F05E - Guangdong Oppo Mobile Telecommunications Corp Ltd + 0040F1 + CHUO ELECTRONICS CO., LTD. - 1C687E - Shenzhen Qihu Intelligent Technology Company Limited + 0040A9 + DATACOM INC. - C03656 - Fiberhome Telecommunication Technologies Ltd + 0040E3 + QUIN SYSTEMS LTD - 5885A2 - Realme Chongqing MobileTelecommunications Corp Ltd + 004091 + PROCOMP INDUSTRIA ELETRONICA - 2CF89B - Cisco Systems Inc. + 0040EA + PLAIN TREE SYSTEMS INC - 00071C - AT&T + 00408A + TPS TELEPROCESSING SYS. GMBH - E0E8E6 - Shenzhen C-Data Technology Ltd + 0040FD + LXE - 500291 - Espressif Inc. + 0040FA + MICROBOARDS, INC. - 001DDF - Sunitec Enterprise Ltd + 00803B + APT COMMUNICATIONS, INC. - 8C0FFA - Hutec Ltd + 00806A + ERI (EMPAC RESEARCH INC.) - ACFE05 - Itel Mobile Limited + 00C0A8 + GVC CORPORATION - 782A79 - Integrated Device Technology (Malaysia) Sdn. Bhd. + 00403B + SYNERJET INTERNATIONAL CORP. - 786559 - Sagemcom Broadband SAS + 00403F + SSANGYONG COMPUTER SYSTEMS - 50D2F5 - Beijing Xiaomi Mobile Software Ltd + 004014 + COMSOFT GMBH - 24526A - Zhejiang Dahua Technology Ltd + 004000 + PCI COMPONENTES DA AMZONIA LTD - 20DFB9 - Google Inc. + 00406C + COPERNIQUE - 5CCAD3 - Chipsea Technologies (Shenzhen) Corp. + 004075 + Tattile SRL - 28167F - Xiaomi Communications Ltd + 004053 + AMPRO COMPUTERS - B03E51 - BSkyB Ltd + 008038 + DATA RESEARCH & APPLICATIONS - 5CE883 - Huawei Technologies Ltd + 00805E + LSI LOGIC CORPORATION - 100177 - Huawei Technologies Ltd + 008060 + NETWORK INTERFACE CORPORATION - 44A191 - Huawei Technologies Ltd + 0040A7 + ITAUTEC PHILCO S.A. - 6023A4 - Sichuan AI-Link Technology Ltd + 004064 + KLA INSTRUMENTS CORPORATION - A4530E - Cisco Systems Inc. + 00405A + GOLDSTAR INFORMATION & COMM. - 00403A - Impact Technologies + 004013 + NTT DATA COMM. SYSTEMS CORP. - F887F1 - Apple + 0080F5 + Quantel Ltd - 9C28BF - Continental Automotive Czech Republic s.r.o. + 0080B9 + ARCHE TECHNOLIGIES INC. - 807215 - BSkyB Ltd + 0080A7 + Honeywell International Inc - 74D637 - Amazon Technologies Inc. + 00400C + GENERAL MICRO SYSTEMS, INC. - D05F64 - IEEE Registration Authority + 004063 + VIA TECHNOLOGIES, INC. - BCC31B - Kygo Life A + 008028 + TRADPOST (HK) LTD - 64DF10 - JingLue Semiconductor(SH) Ltd + 008061 + LITTON SYSTEMS, INC. - C463FB - Neatframe AS + 0080C3 + BICC INFORMATION SYSTEMS & SVC - 0C8126 - Juniper Networks + 008044 + SYSTECH COMPUTER CORP. - 305714 - Apple + 008006 + COMPUADD CORPORATION - 60447A - Water-i.d. GmbH + 00808A + SUMMIT MICROSYSTEMS CORP. - C8B1CD - Apple + 004043 + Nokia Siemens Networks GmbH & Co. KG. - 1460CB - Apple + 00405E + NORTH HILLS ISRAEL - B8F12A - Apple + 00807C + FIBERCOM, INC. - 04AB6A - Chun-il Ltd + 008091 + TOKYO ELECTRIC CO.,LTD - 544E45 - Private + 00809D + Commscraft Ltd. - 04C807 - Xiaomi Communications Ltd + 0080F4 + TELEMECANIQUE ELECTRIQUE - 04A222 - Arcadyan Corporation + 00808B + DACOLL LIMITED - 489BD5 - Extreme Networks Inc. + 0080CB + FALCO DATA PRODUCTS - 3C8C93 - Juniper Networks + 008007 + DLOG NC-SYSTEME - 28FE65 - DongGuan Siyoto Electronics Ltd + 008062 + INTERFACE CO. - 1806F5 - RAD Data Communications Ltd + 00801E + XINETRON, INC. - 7484E1 - Dongguan Haoyuan Electronics Ltd + 0080E2 + T.D.I. CO., LTD. - 44FB5A - ZTE Corporation + 008036 + REFLEX MANUFACTURING SYSTEMS - 4459E3 - Huawei Technologies Ltd + 008083 + AMDAHL - DC54D7 - Amazon Technologies Inc. + 00804D + CYCLONE MICROSYSTEMS, INC. - 44D3CA - Cisco Systems Inc. + 00800B + CSK CORPORATION - 889FAA - Hella Gutmann Solutions GmbH + 008018 + KOBE STEEL, LTD. - E454E8 - Dell Inc. + 00809B + JUSTSYSTEM CORPORATION - 20968A - China Mobile (Hangzhou) Information Technology Ltd + 0080DF + ADC CODENOLL TECHNOLOGY CORP. - 8C1850 - China Mobile (Hangzhou) Information Technology Ltd + 0080D4 + CHASE RESEARCH LTD. - D8D4E6 - Hytec Inter Ltd + 00803D + SURIGIKEN CO., LTD. - 683F1E - EFFECT Photonics B.V. + 008049 + NISSIN ELECTRIC CO., LTD. - 0035FF - Texas Instruments + 0080C1 + LANEX CORPORATION - F8E7A0 - Vivo Mobile Communication Ltd + 0080BC + HITACHI ENGINEERING CO., LTD - 2CFFEE - Vivo Mobile Communication Ltd + 0080B2 + NETWORK EQUIPMENT TECHNOLOGIES - 840B7C - Hitron Technologies Inc. + 008076 + MCNC - 48A73C - Sichuan tianyi kanghe Communications Ltd + 008022 + SCAN-OPTICS - C85D38 - HUMAX Ltd + 0000B2 + TELEVIDEO SYSTEMS, INC. - F8A763 - Zhejiang Tmall Technology Ltd + 0000EE + NETWORK DESIGNERS, LTD. - A49813 - ARRIS Group Inc. + 0000E5 + SIGMEX LTD. - 6C2990 - WiZ Connected Lighting Company Limited + 000089 + CAYMAN SYSTEMS INC. - 9835ED - Huawei Technologies Ltd + 0000FF + CAMTEC ELECTRONICS LTD. - 084F0A - Huawei Technologies Ltd + 0000B7 + DOVE COMPUTER CORPORATION - A8494D - Huawei Technologies Ltd + 0000F2 + SPIDER COMMUNICATIONS - 44004D - Huawei Technologies Ltd + 0000CC + DENSAN CO., LTD. - 18CF24 - Huawei Technologies Ltd + 0080A8 + VITACOM CORPORATION - D89B3B - Huawei Technologies Ltd + 008033 + EMS Aviation, Inc. - 88403B - Huawei Technologies Ltd + 0080DD + GMX INC/GIMIX - FC8743 - Huawei Technologies Ltd + 0080FB + BVM LIMITED - 807693 - Newag SA + 0000DB + British Telecommunications plc - BC9740 - IEEE Registration Authority + 0000C1 + Madge Ltd. - 04885F - Huawei Technologies Ltd + 0000F6 + APPLIED MICROSYSTEMS CORP. - C850CE - Huawei Technologies Ltd + 00003F + SYNTREX, INC. - 50F8A5 - eWBM Ltd + 00008E + SOLBOURNE COMPUTER, INC. - 1449BC - DrayTek Corp. + 0000DC + HAYES MICROCOMPUTER PRODUCTS - 20F478 - Xiaomi Communications Ltd + 000063 + BARCO CONTROL ROOMS GMBH - 90735A - Motorola Mobility LLC, a Lenovo Company + 0080B4 + SOPHIA SYSTEMS - 1C8259 - IEEE Registration Authority + 00807F + DY-4 INCORPORATED - 0004DF - Teracom Telematica S.A + 0000BD + RYOSEI, Ltd. - 7438B7 - Canon Inc. + 00002E + SOCIETE EVIRA - 8C04BA - Dell Inc. + 00004E + AMPEX CORPORATION - 00FA21 - Samsung Electronics Ltd + 0000C2 + INFORMATION PRESENTATION TECH. - 7C2302 - Samsung Electronics Ltd + 0000FC + MEIKO - 18B6F7 - NEW POS Technology Limited + 0000CD + Allied Telesis Labs Ltd - 5CB15F - Oceanblue Cloud Technology Limited + 008068 + YAMATECH SCIENTIFIC LTD. - 18AACA - Sichuan tianyi kanghe Communications Ltd + 00006D + CRAY COMMUNICATIONS, LTD. - D49DC0 - Samsung Electronics Ltd + 0000DA + ATEX - D0196A - Ciena Corporation + 00802D + XYLOGICS INC - 4413D0 - ZTE Corporation + 0000A0 + SANYO Electric Co., Ltd. - 2462AB - Espressif Inc. + 0000C0 + WESTERN DIGITAL CORPORATION - 88B436 - Private + 000033 + EGAN MACHINERY COMPANY - 6CAB05 - Cisco Systems Inc. + 0000EA + UPNOD AB - 000BE4 - Hosiden Corporation + 000043 + MICRO TECHNOLOGY - 60D248 - ARRIS Group Inc. + 000017 + Oracle - 485DEB - Just Add Power + 000065 + Network General Corporation - 501395 - Sichuan AI-Link Technology Ltd + 000011 + NORMEREL SYSTEMES - 18D9EF - Shuttle Inc. + 0000C4 + WATERS DIV. OF MILLIPORE - 88DA33 - Beijing Xiaoyuer Network Technology Ltd + 0000A2 + Bay Networks - 5041B9 - I-O Data Device,Inc. + 0000EC + MICROPROCESS - 80DABC - Megafone Limited + 000061 + GATEWAY COMMUNICATIONS - C09FE1 - ZTE Corporation + 0000A4 + ACORN COMPUTERS LIMITED - 184644 - Home Control Singapore Pte Ltd + 0000DD + TCL INCORPORATED - B0700D - Nokia + 0000AE + DASSAULT ELECTRONIQUE - 346B5B - New H3C Technologies Ltd + 000077 + INTERPHASE CORPORATION - 84E892 - Actiontec Electronics Inc. + 000099 + MTX, INC. - 78E2BD - Vodafone Automotive S.p.A. + 000028 + PRODIGY SYSTEMS CORPORATION - F848FD - China Mobile Group Device Ltd + 000010 + SYTEK INC. - 20DA22 - Huawei Technologies Ltd + 0000EB + MATSUSHITA COMM. IND. CO. LTD. - C821DA - Shenzhen YOUHUA Technology Ltd + 080043 + PIXEL COMPUTER INC. - E0B655 - Beijing Xiaomi Electronics Ltd + 080045 + CONCURRENT COMPUTER CORP. - 002175 - Pacific Satellite International Ltd + 08003B + TORUS SYSTEMS LIMITED - 889746 - Sichuan AI-Link Technology Ltd + 08003C + SCHLUMBERGER WELL SERVICES - 1CDE57 - Fiberhome Telecommunication Technologies Ltd + 080034 + FILENET CORPORATION - E0DCFF - Xiaomi Communications Ltd + 080036 + INTERGRAPH CORPORATION - 00778D - Cisco Systems Inc. + 080033 + BAUSCH & LOMB - 000E8C - Siemens AG + 080030 + NETWORK RESEARCH CORPORATION - 008764 - Cisco Systems Inc. + 080031 + LITTLE MACHINES INC. - FC3342 - Juniper Networks + 08007E + AMALGAMATED WIRELESS(AUS) LTD - C468D0 - VTech Telecommunications Ltd + 08007F + CARNEGIE-MELLON UNIVERSITY - 14AEDB - VTech Telecommunications Ltd + 080029 + Megatek Corporation - 78DB2F - Texas Instruments + 080023 + Panasonic Communications Co., Ltd. - 8C0FA0 - di-soric GmbH & Co. KG + 08005E + COUNTERPOINT COMPUTER INC. - DCB808 - Extreme Networks Inc. + 080056 + STANFORD LINEAR ACCEL. CENTER - B0E71D - Shanghai Maigantech Ltd + 080048 + EUROTHERM GAUGING SYSTEMS - F8BBBF - eero Inc. + 08004F + CYGNET SYSTEMS - 846FCE - Guangdong Oppo Mobile Telecommunications Corp Ltd + 080050 + DAISY SYSTEMS CORP. - 20658E - Huawei Technologies Ltd + 08002E + METAPHOR COMPUTER SYSTEMS - 183D5E - Huawei Technologies Ltd + 08002B + DIGITAL EQUIPMENT CORPORATION - DC7137 - ZTE Corporation + 080075 + DANSK DATA ELECTRONIK - 847C9B - GD Midea Air-Conditioning Equipment Ltd + 080078 + ACCELL CORPORATION - 3441A8 - ER-Telecom + 08006D + WHITECHAPEL COMPUTER WORKS - 34DB9C - Sagemcom Broadband SAS + 00009D + LOCUS COMPUTING CORPORATION - 7440BE - LG Innotek + 0000FD + HIGH LEVEL HARDWARE - 04D4C4 - ASUSTek Computer Inc. + 08000F + MITEL CORPORATION - F0D4E2 - Dell Inc. + 0270B0 + M/A-COM INC. COMPANIES - A8E2C3 - Shenzhen YOUHUA Technology Ltd + 000053 + COMPUCORP - 9020C2 - Aruba Networks HP + 08000A + NESTAR SYSTEMS INCORPORATED - 0CA06C - Industrial Cyber Sensing Inc. + 000004 + XEROX CORPORATION - FCD2B6 - IEEE Registration Authority + 00DD0E + UNGERMANN-BASS INC. - 804A14 - Apple + 080018 + PIRELLI FOCOM NETWORKS - 703C69 - Apple + 0000A6 + NETWORK GENERAL CORPORATION - AC2DA9 - Tecno Mobile Limited + 00BBF0 + UNGERMANN-BASS INC. - 48049F - Elecom Ltd + 00408E + Tattile SRL - 087F98 - Vivo Mobile Communication Ltd + 08001C + KDD-KOKUSAI DEBNSIN DENWA CO. - C85261 - ARRIS Group Inc. + 080090 + SONOMA SYSTEMS - 7488BB - Cisco Systems Inc. + 00800F + STANDARD MICROSYSTEMS - A4CF12 - Espressif Inc. + 00406B + SYSGEN - 4C6AF6 - HMD Global Oy + 00DD0C + UNGERMANN-BASS INC. - 489DD1 - Samsung Electronics Ltd + 0001C8 + THOMAS CONRAD CORP. - B06FE0 - Samsung Electronics Ltd + CC45A5 + Texas Instruments - 44B994 - Douglas Lighting Controls + 602602 + Texas Instruments - 40A93F - Pivotal Commware Inc. + ECBFD0 + Texas Instruments - 70BF92 - GN Audio A/S + C4E733 + Clear Align LLC - C08C71 - Motorola Mobility LLC, a Lenovo Company + 5CFCE1 + Resideo - F46F4E - Echowell + 54DED3 + zte corporation - 5C8816 - Rockwell Automation + 749B89 + HUAWEI TECHNOLOGIES CO.,LTD - 002F5C - Cisco Systems Inc. + 5C53B4 + EM Microelectronic - F4645D - Toshiba + 50A6D8 + Apple, Inc. - 38F85E - HUMAX Ltd + 68CAC4 + Apple, Inc. - ACBB61 - YSTen Technology Ltd + 00308E + Crossmatch Technologies/HID Global - 2479F8 - KUPSON spol. s r.o. + 000633 + Crossmatch Technologies/HID Global - 7CFD82 - Guangdong Genius Technology Ltd + 80F5AE + Hangzhou Hikvision Digital Technology Co.,Ltd. - 180D2C - Intelbras + 9415B2 + Huawei Device Co., Ltd. - 042DB4 - First Property (Beijing) Ltd Modern MOMA Branch + E8B722 + GreenTrol Automation - 04E0B0 - Shenzhen YOUHUA Technology Ltd + 606134 + Arcade Communications Ltd. - 08ECF5 - Cisco Systems Inc. + A4978A + LEAR - D07650 + 4CEA41 IEEE Registration Authority - 60D0A9 - Samsung Electronics Ltd + 74205F + Shenzhen Zhongruixin Intelligent Technology Co., Ltd. - 88CEFA - Huawei Technologies Ltd + 14064C + Vogl Electronic GmbH - 002706 - Yoisys + 8C6120 + EM Microelectronic - 00CB51 - Sagemcom Broadband SAS + 8C8E4E + Baylan Olcu Aletleri San. ve Tic.A.S. - C464B7 - Fiberhome Telecommunication Technologies Ltd + F8ACC1 + InnoXings Co., LTD. - EC4118 - XIAOMI Electronics Ltd + 4064DC + X-speed lnformation Technology Co.,Ltd - D8860B - IEEE Registration Authority + 5CC787 + Huawei Device Co., Ltd. - 342003 - Shenzhen Feitengyun Technology Ltd + 845075 + Huawei Device Co., Ltd. - F07D68 - D-Link Corporation + 5CF838 + IEEE Registration Authority - 40E3D6 - Aruba Networks HP + 30D97F + Tech4home, Lda - B45D50 - Aruba Networks HP + 4080E1 + FN-LINK TECHNOLOGY Ltd. - 78DAA2 - Cynosure Technologies Ltd + C44838 + Satcom Direct, Inc. - 38B19E - IEEE Registration Authority + 9C37CB + Sony Interactive Entertainment Inc. - 38E26E - Shenzhen Sweet Rain Electronics Ltd + 3CB0ED + Nothing Technology Limited - 00D050 - Iskratel d.o.o. + ECCF70 + FUJIAN STAR-NET COMMUNICATION CO.,LTD - 70C9C6 - Cisco Systems Inc. + 04F0E4 + ShenZhen Hosecom Electronic Technology Co.,LTD - D4B92F - Technicolor CH USA Inc. + D8E23F + Qingdao Haier Technology Co.,Ltd - 689A87 - Amazon Technologies Inc. + D8032A + COMMTACT LTD - 64AE88 - Polytec GmbH + 847051 + ALPSALPINE CO,.LTD - ACA31E - Aruba Networks HP + 50131D + Motorola Mobility LLC, a Lenovo Company - 00177B - Azalea Networks Inc + D47F78 + Dopple B.V. - 98DAC4 - TP-Link Technologies Ltd + 90A9F7 + IEEE Registration Authority - 502B98 - Es-tech International + F0F7FC + HUAWEI TECHNOLOGIES CO.,LTD - C82832 - Beijing Xiaomi Electronics Ltd + 30FFFD + HUAWEI TECHNOLOGIES CO.,LTD - 946A77 - Technicolor CH USA Inc. + B0995A + HUAWEI TECHNOLOGIES CO.,LTD - C4346B - Hewlett-Packard Company + 00F7AD + HUAWEI TECHNOLOGIES CO.,LTD - 8084A9 - oshkosh Corporation + D4CBCC + vivo Mobile Communication Co., Ltd. - F46E95 - Extreme Networks Inc. + 3C8427 + Espressif Inc. - 4CC7D6 - Flextronics Manufacturing(Zhuhai) Ltd + 740BB0 + Hirschmann Automation and Control GmbH - C80873 - Ruckus Wireless + 20ED47 + Juniper Networks - 701BFB - Integrated Device Technology (Malaysia) Sdn. Bhd. + 94EF49 + BDR Thermea Group B.V - 001BB5 - Cherry GmbH + 90B685 + WEIFANG GOERTEK ELECTRONICS CO.,LTD - D05157 - LEAX Arkivator Telecom + A0D1B3 + Apple, Inc. - 288088 - Netgear + 7C4B26 + Apple, Inc. - 64CE6E - Sierra Wireless + 24D5E4 + Cisco Systems, Inc - 1C3477 - Innovation Wireless + CC115A + Apple, Inc. - BC3E07 - Hitron Technologies Inc. + 0080A3 + Lantronix - 48FDA3 - Xiaomi Communications Ltd + 90D432 + zte corporation - 001697 - NEC Corporation + 18E83B + Citadel Wallet LLC - 003013 - NEC Corporation + 008066 + Eurotech S.p.A. - 049DFE - Hivesystem + 785333 + Beijing Xiaomi Electronics Co.,Ltd - 0CEC84 - Shenzhen TINNO Mobile Technology Corp. + 9CF8B8 + Shenzhen Skyworth Digital Technology CO., Ltd - 9CDB07 - Thum+Mahr GmbH + 9432C1 + Honor Device Co., Ltd. - DCEB69 - Technicolor CH USA Inc. + 147F67 + LG Innotek - 004E35 - Hewlett Packard Enterprise + EC9A0C + IEEE Registration Authority - F81308 - Nokia + CC4D75 + Beijing Xiaomi Mobile Software Co., Ltd - F8A2D6 - Liteon Technology Corporation + 107C61 + ASUSTek COMPUTER INC. - 182A44 - Hirose Electronic System + 008DF4 + IEEE Registration Authority - FC94CE - ZTE Corporation + 7818EC + Fortinet, Inc. - 90869B - ZTE Corporation + 6C7F0C + Cisco Meraki - E0189F - EM Microelectronic + 5CB26D + Intel Corporate - 74366D - Vodafone Italia S.p.A. + 481CB9 + SZ DJI TECHNOLOGY CO.,LTD - 84DB2F - Sierra Wireless + E02EFE + Zhejiang Dahua Technology Co., Ltd. - 9458CB - Nintendo Ltd + CCA08F + zte corporation - 28EC9A - Texas Instruments + E8B0C5 + Intel Corporate - FCBE7B - Vivo Mobile Communication Ltd + FCB585 + Shenzhen Water World Information Co.,Ltd. - B40FB3 - Vivo Mobile Communication Ltd + 6C51E4 + Huawei Device Co., Ltd. - EC5C68 - Chongqing Fugui Electronics Ltd + B0FA8B + Huawei Device Co., Ltd. - C4E506 - Piper Networks Inc. + ECE660 + Qingdao Hisense Communications Co.,Ltd. - 30EB5A - Landis + GYR + E8288D + Huawei Device Co., Ltd. - F80F6F - Cisco Systems Inc. + F462DC + Huawei Device Co., Ltd. - 0080E3 - Coral Network Corporation + C46237 + sunweit industrial limited - B4C62E - Molex CMS + F4D58A + Palo Alto Networks - B8259A - Thalmic Labs + 1889DF + OMNIVISION - 282536 - Shenzhen Holatek Ltd + 44303F + HUAWEI TECHNOLOGIES CO.,LTD - B8A175 - Roku Inc. + 5C07A6 + HUAWEI TECHNOLOGIES CO.,LTD - CCD3C1 - Vestel Elektronik San ve Tic. A.S. + CC1E56 + HUAWEI TECHNOLOGIES CO.,LTD - 0CD0F8 - Cisco Systems Inc. + 4CB911 + Raisecom Technology CO., LTD - 745F90 - LAM Technologies + 000E5E + Raisecom Technology CO., LTD - A42655 - LTI Motion (Shanghai) Ltd + 38C6BD + Xiaomi Communications Co Ltd - 60A730 - Shenzhen Yipinfang Internet Technology Ltd + 000C8D + Balluff MV GmbH - 3C9BD6 - Vizio Inc. + 908938 + Hefei Linkin Technology Co., Ltd. - F85B9C - SB SysTEMS Ltd + A8BA69 + Samsung Electronics Co.,Ltd - 6CA928 - HMD Global Oy + A83CA5 + Dell Inc. - 00D861 - Micro-Star INTL Ltd + 80F7A6 + Shenzhen C-Data Technology Co., Ltd. - 74C17D - Infinix mobility limited + 302FAC + Zhejiang HuaRay Technology Co.,Ltd - 8871B1 - ARRIS Group Inc. + B80BDA + GD Midea Air-Conditioning Equipment Co.,Ltd. - F0AF85 - ARRIS Group Inc. + 342DA3 + Fiberhome Telecommunication Technologies Co.,LTD - FCAE34 - ARRIS Group Inc. + 0C6AC4 + Apple, Inc. - DCDA80 - New H3C Technologies Ltd + BC37D3 + Apple, Inc. - CC7286 - Xi'an Fengyu Information Technology Ltd + 20CC27 + Cisco Systems, Inc - 64EEB7 - Netcore Technology Inc + 0C517E + Apple, Inc. - 3881D7 - Texas Instruments + 28D25A + Infinix mobility limited - 1804ED - Texas Instruments + 80EA0B + Zyxel Communications Corporation - D43260 - GoPro + 982F86 + vivo Mobile Communication Co., Ltd. - 50DB3F - Shenzhen Gongjin Electronics Ltd + 04E4B6 + Samsung Electronics Co.,Ltd - 1081B4 - Hunan Greatwall Galaxy Science and Technology Ltd + BCEA9C + ITEL MOBILE LIMITED - 004279 - Sunitec Enterprise Ltd + 0479FD + Ciena Corporation - 00B8B3 - Cisco Systems Inc. + 509893 + Texas Instruments - F4DD9E - GoPro + 6C8338 + Ubihere - D4D919 - GoPro + 000CEF + ONE Investment Group Limited - 141114 - Tecno Mobile Limited + 503AA0 + SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. - A45046 - Xiaomi Communications Ltd + 5CDE34 + SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. - 1C24CD - Askey Computer Corp. + 842712 + Silicon Laboratories - 007C2D - Samsung Electronics Ltd + 7CC6B6 + Silicon Laboratories - B47748 - Shenzhen Neoway Technology Ltd + 980C33 + Silicon Laboratories - F8501C - Tianjin Geneuo Technology Ltd + 38398F + Silicon Laboratories - 44070B - Google Inc. + 7CF0E5 + OnePlus Technology (Shenzhen) Co., Ltd - F8C249 - Private + 505E5C + SUNITEC TECHNOLOGY CO.,LIMITED - B831B5 - Microsoft Corporation + 3802E3 + YICHEN (SHENZHEN) TECHNOLOGY CO.,LTD - ECF6BD - Sncf Mobilites + E4A7D0 + HUAWEI TECHNOLOGIES CO.,LTD - 38B4D3 - BSH Hausgeraete GmbH + B42BB9 + HUAWEI TECHNOLOGIES CO.,LTD - C84782 - Areson Technology Corp. + 34C7E9 + Google, Inc. - E89363 - Nokia + AC8C46 + Beijing Xiaomi Mobile Software Co., Ltd - 7C0CF6 - Guangdong Huiwei High-tech Ltd + 482D63 + Wavarts Technologies Co., Ltd - 749D79 - Sercomm Corporation. + 8099E7 + Sony Corporation - 00D6FE - Cisco Systems Inc. + 209339 + Juniper Networks - 0CBF74 - Morse Micro + E8FF1E + IEEE Registration Authority - FC8F7D - Shenzhen Gongjin Electronics Ltd + 1C54E6 + Shenzhen Yisheng Technology Co.,Ltd - 24BE18 - Dadoutek Company Limited + 0C4B48 + Nokia - B41D2B - Shenzhen YOUHUA Technology Ltd + 7C7B1C + Motorola Mobility LLC, a Lenovo Company - 14C213 - Apple + 7834FD + vivo Mobile Communication Co., Ltd. - 70D313 - Huawei Technologies Ltd + FC3CD7 + Tuya Smart Inc. - 9C1D36 - Huawei Technologies Ltd + B09C63 + Xiaomi Communications Co Ltd - Ccbbfe - Huawei Technologies Ltd + E89847 + Xiaomi Communications Co Ltd - A4D931 - Apple + FC386A + Shenzhen Skyworth Digital Technology CO., Ltd - BCFED9 - Apple + 508811 + Beijing Xiaomi Mobile Software Co., Ltd - 808223 - Apple + F8C4FA + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 300A60 - IEEE Registration Authority + ACCE92 + New H3C Technologies Co., Ltd - 80D065 - CKS Corporation + AC81B5 + Accton Technology Corporation - 283166 - Vivo Mobile Communication Ltd + D0460C + Dell Inc. - C04004 - Medicaroid Corporation + 84D5A0 + MCOT INC. - 20AD56 - Continental Automotive Systems Inc. + 84E8CB + BUFFALO.INC - 5029F5 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 90A0BE + Cannice - CC08FB - TP-Link Technologies Ltd + 6453E0 + HUAWEI TECHNOLOGIES CO.,LTD - BCAF91 - TE Connectivity Sensor Solutions + 688BF4 + Arista Network, Inc. - F0D7DC - Wesine (Wuhan) Technology Ltd + 94017D + SHENZHEN SHLINK.CO.,LIMITED - 007204 - Samsung Electronics Ltd ARTIK + C0E5DA + Qingdao Intelligent&Precise Electronics Co.,Ltd. - 40C81F - Shenzhen Xinguodu Technology Ltd + D8A6FD + Ghost Autonomy Inc. - 1459C0 - Netgear + 8C8474 + Broadcom Limited - 8C61A3 - ARRIS Group Inc. + D83D3F + JOYNED GmbH - A81087 - Texas Instruments + D44867 + Silicon Laboratories - A02833 - IEEE Registration Authority + D8C6F9 + Tracklab Inc - C8C2F5 - Flextronics Manufacturing(Zhuhai) Ltd + 6C483F + Xiaomi Communications Co Ltd - F05849 - CareView Communications + 3CAFB7 + Xiaomi Communications Co Ltd - 34E5EC - Palo Alto Networks + 540853 + Qingdao Haier Technology Co.,Ltd - A4ED43 - IEEE Registration Authority + BC0866 + Nestle Purina PetCare - 94298D - Shanghai AdaptComm Technology Ltd + DC9B95 + Phyplus Technology (Shanghai) Co., Ltd - 00AA6E - Cisco Systems Inc. + 4800B3 + Cisco Systems, Inc - 6843D7 - Agilecom Photonics Solutions Guangdong Limited + 2CB68F + HUAWEI TECHNOLOGIES CO.,LTD - 20D80B - Juniper Networks + C8D1A9 + HUAWEI TECHNOLOGIES CO.,LTD - 8C8F8B - China Mobile Chongqing branch + 40BB56 + TeraNXT Global India Pvt Ltd. - B86A97 - Edgecore Networks Corporation + E05D54 + Ruijie Networks Co.,LTD - 000A5E - 3Com Corporation + 18188B + FCNT LLC - 00105A - 3Com Corporation + DC71D0 + Apple, Inc. - 006097 - 3Com Corporation + 9CFA76 + Apple, Inc. - 006008 - 3Com Corporation + 20FA85 + Apple, Inc. - 001B6E - Keysight Technologies Inc. + 9C1A25 + Apple, Inc. - 00040B - 3Com Europe Ltd + 6C6016 + OnePlus Technology (Shenzhen) Co., Ltd - 000102 - 3Com Corporation + A0782D + Apple, Inc. - 8CFE74 - Ruckus Wireless + D011E5 + Apple, Inc. - A8016D - Aiwa Corporation + 40DA5C + Apple, Inc. - 0440A9 - New H3C Technologies Ltd + 5C9175 + Apple, Inc. - 4C0143 - eero Inc. + 44F770 + Beijing Xiaomi Mobile Software Co., Ltd - E43493 - Huawei Technologies Ltd + A83162 + Hangzhou Huacheng Network Technology Co.,Ltd - 342912 - Huawei Technologies Ltd + 64FE15 + Flaircomm Microelectronics,Inc. - 604BAA - Magic Leap Inc. + D86BFC + zte corporation - 4C364E - Panasonic Corporation Connected Solutions Company + E04824 + Garmin International - BCA58B - Samsung Electronics Ltd + 08F0B6 + Edifier International - 80CEB9 - Samsung Electronics Ltd + C0555C + Impulse Labs - D0D3FC - Mios Ltd + A8595F + Intel Corporate - 6C6CD3 - Cisco Systems Inc. + CC28AA + ASUSTek COMPUTER INC. - E049ED - Audeze LLC + 3C9FCD + Shenzhen Neoway Technology Co.,Ltd. - 8030E0 - Hewlett Packard Enterprise + 341453 + Gantner Electronic GmbH - E85D86 - Chang YOW Technologies International Ltd + CC641A + SHENZHEN BILIAN ELECTRONIC CO.,LTD - 143719 - PT Prakarsa Visi Valutama + A89609 + FN-LINK TECHNOLOGY Ltd. - 582F40 - Nintendo Ltd + 68B41E + ZEASN TECHNOLOGY PRIVATE LIMITED - 0890BA - Danlaw Inc + 841571 + TCT mobile ltd - 94A3CA - KonnectONE LLC + E8BFB8 + Intel Corporate - 244CE3 - Amazon Technologies Inc. + 34A6EF + Shenzhen Phaten Tech. LTD - B8BEF4 - devolo AG + BC3F4E + Great Talent Technology Limited - 000157 - Syswave Ltd + 540463 + CIG SHANGHAI CO LTD - 58FDBE - Shenzhen Taikaida Technology Ltd + 882067 + Fiberhome Telecommunication Technologies Co.,LTD - F4F197 - EMTAKE Inc + E85497 + Samsung Electronics Co.,Ltd - 6CED51 - NEXCONTROL Ltd + 14E01D + Samsung Electronics Co.,Ltd - 04C3E6 - IEEE Registration Authority + DC54AD + Hangzhou RunZhou Fiber Technologies Co.,Ltd - 286336 - Siemens AG + 40DE24 + Samsung Electronics Co.,Ltd - 14D169 - Huawei Technologies Ltd + 1083B4 + Sidora Srl - 1062E5 - Hewlett-Packard Company + 403059 + Silicon Laboratories - 0020B5 - Yaskawa Electric Corporation + B85C5C + Microsoft Corporation - E06267 - Xiaomi Communications Ltd + F0D805 + Cisco Systems, Inc - 70B7AA - Vivo Mobile Communication Ltd + 086332 + IEEE Registration Authority - 84B31B - Kinexon GmbH + B492FE + Arista Network, Inc. - 082525 - Xiaomi Communications Ltd + 4471B3 + Logitech Far East - C49500 - Amazon Technologies Inc. + A4FCA1 + Nokia Solutions and Networks GmbH & Co. KG - F460E2 - Xiaomi Communications Ltd + 787E42 + zte corporation - E4D124 - Mojo Networks Inc. + 345A18 + Alignment Engine Inc. - 0013A3 - Siemens Home & Office Comm. Devices + 0C6825 + Suzhou HYC technology Co., Ltd. - B0B867 - Hewlett Packard Enterprise + 90B4DD + ZPT R&D - C00380 - Juniper Networks + A0FAC8 + HUAWEI TECHNOLOGIES CO.,LTD - 98BB99 - Phicomm (Sichuan) Ltd + 6429FF + HUAWEI TECHNOLOGIES CO.,LTD - 002622 - Compal Information (Kunshan) Ltd + C09B63 + HUAWEI TECHNOLOGIES CO.,LTD - F8272E - Mercku + 10A145 + nexzo india pvt ltd - 9CC950 - Baumer Holding + C4E7AE + Chengdu Meross Technology Co., Ltd. - F89910 - Integrated Device Technology (Malaysia) Sdn. Bhd. + 648FDB + Huaqin Technology Co.LTD - 50E0EF - Nokia + 94E6BA + Samsung Electronics Co.,Ltd - 848A8D - Cisco Systems Inc. + 746DFA + Samsung Electronics Co.,Ltd - 1CC3EB - Guangdong Oppo Mobile Telecommunications Corp Ltd + 980709 + Huawei Device Co., Ltd. - 504C7E - THE 41ST Institute Of Cetc + 0441A5 + Apple, Inc. - 001413 - Trebing & Himstedt Prozessautomation GmbH & Co. KG + 1C0EC2 + Apple, Inc. - 000799 - Tipping Point Technologies Inc. + B08BA8 + Amazon Technologies Inc. - D01CBB - Beijing Ctimes Digital Technology Ltd + 38ACDD + Valenco GmbH - 7487BB - Ciena Corporation + C4CC37 + IEEE Registration Authority - 68DD26 - Shanghai Focus Vision Security Technology Ltd + 7C7EF9 + eero inc. - 2866E3 - Azurewave Technologies Inc. + C40898 + Dropbeats Technology Co., Ltd. - 60F18A - Huawei Technologies Ltd + 3C996D + Marelli Europe s.p.a. - EC3873 - Juniper Networks + 8850DD + Infiniband Trade Association - 780473 - Texas Instruments + 5C35FC + Actiontec Electronics Inc. - A83E0E - HMD Global Oy + E85FB4 + Xiaomi Communications Co Ltd - 10C172 - Huawei Technologies Ltd + ACEAEA + HUAWEI TECHNOLOGIES CO.,LTD - 00151E - ETHERNET Powerlink Standarization Group (EPSG) + 38F195 + HUAWEI TECHNOLOGIES CO.,LTD - 00111E - ETHERNET Powerlink Standarization Group (EPSG) + 982A0A + Intelbras - 00409D - DigiBoard + 1402EC + Hewlett Packard Enterprise - CC50E3 - Espressif Inc. + 1C98EC + Hewlett Packard Enterprise - DCE305 - ZAO NPK Rotek + 24F27F + Hewlett Packard Enterprise - A4DA32 - Texas Instruments + 808DB7 + Hewlett Packard Enterprise - 000EEE - Muco Industrie BV + 941882 + Hewlett Packard Enterprise - 7C1C4E - LG Innotek + 34FCB9 + Hewlett Packard Enterprise - D8B6B7 - Comtrend Corporation + 484AE9 + Hewlett Packard Enterprise - 002106 - RIM Testing Services + 4CAEA3 + Hewlett Packard Enterprise - 8C14B4 - ZTE Corporation + B8977A + Nokia Solutions and Networks GmbH & Co. KG - 3C9872 - Sercomm Corporation. + 20A6CD + Hewlett Packard Enterprise - 40C3C6 - SnapRoute + 703A0E + Hewlett Packard Enterprise - 5C9656 - Azurewave Technologies Inc. + 6CC49F + Hewlett Packard Enterprise - E06066 - Sercomm Corporation. + EC50AA + Hewlett Packard Enterprise - 149346 - PNI sensor Corporation + F061C0 + Hewlett Packard Enterprise - DCE0EB - Nanjing Aozheng Information Technology Ltd + B01F8C + Hewlett Packard Enterprise - EC8C9A - Huawei Technologies Ltd + 48B4C3 + Hewlett Packard Enterprise - B48655 - Huawei Technologies Ltd + 209CB4 + Hewlett Packard Enterprise - 2C4759 - Beijing MEGA preponderance Science & Technology Ltd + 4CD587 + Hewlett Packard Enterprise - A41566 - Weifang Goertek Electronics Ltd + 9C3708 + Hewlett Packard Enterprise - 1C965A - Weifang Goertek Electronics Ltd + 34C515 + Hewlett Packard Enterprise - 401B5F - Weifang Goertek Electronics Ltd + 6026EF + Hewlett Packard Enterprise - A8E552 - JUWEL Aquarium AG & Co. KG + BCD7A5 + Hewlett Packard Enterprise - 5CCD7C - MEIZU Technology Ltd + 187A3B + Hewlett Packard Enterprise - 00138A - Qingdao GoerTek Technology Ltd + B86CE0 + Hewlett Packard Enterprise - A830AD - Weifang Goertek Electronics Ltd + 204C03 + Hewlett Packard Enterprise - BC5FF6 - Mercury Communication Technologies Ltd + F01AA0 + Hewlett Packard Enterprise - C8E7D8 - Mercury Communication Technologies Ltd + A0A001 + Hewlett Packard Enterprise - 60D21C - Sunnovo International Limited + 8C7909 + Hewlett Packard Enterprise - CC51B4 - Integrated Device Technology (Malaysia) Sdn. Bhd. + 000B86 + Hewlett Packard Enterprise - 00C3F4 - Samsung Electronics Ltd + 883A30 + Hewlett Packard Enterprise - B88AEC - Nintendo Ltd + 7CA62A + Hewlett Packard Enterprise - D0D783 - Huawei Technologies Ltd + 2462CE + Hewlett Packard Enterprise - AC3B77 - Sagemcom Broadband SAS + D8D8E5 + Vantiva Connected Home - Technologies Telco - B0FC0D - Amazon Technologies Inc. + 4C2338 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - CCC92C - Schindler - PORT Technology + 4472AC + AltoBeam Inc. - 001E39 - Comsys Communication Ltd + 888C1B + EM Microelectronic - 78725D - Cisco Systems Inc. + 3CF083 + Arcadyan Corporation - FCE66A - Industrial Software Co + C0D941 + Shenzhen VMAX Software Co., Ltd. - 7836CC - Guangdong Oppo Mobile Telecommunications Corp Ltd + 68B76B + Fiberhome Telecommunication Technologies Co.,LTD - 8CCF5C - BEFEGA GmbH + 9C1221 + Sichuan AI-Link Technology Co., Ltd. - 70C833 - Wirepas Oy + 103F8C + New H3C Technologies Co., Ltd - 0C73EB - IEEE Registration Authority + 48B313 + Idesco Oy - 048AE1 - Flextronics Manufacturing(Zhuhai) Ltd + 68C6AC + Intel Corporate - F0B5D1 - Texas Instruments + BC3898 + Intel Corporate - 00E000 - Fujitsu Limited + A04F52 + Intel Corporate - 90848B - HDR10+ Technologies LLC + 3C94FD + Mist Systems, Inc. - C8D779 - Qing DAO Haier Telecom Ltd + 94CA9A + Paul Vahle GmbH & Co. KG - 10B36F - Bowei Technology Company Limited + 742EC1 + Dixon Electro Appliances Pvt Ltd - FC9BC6 - Sumavision Technologies Ltd + 3023BA + Accelerated Memory Production Inc. - C8292A - Barun Electronics + 84F2C1 + zte corporation - E482CC - Jumptronic GmbH + 40827B + STMicroelectronics Rousset SAS - 48605F - LG Electronics (Mobile Communications) + D06DC8 + HUAWEI TECHNOLOGIES CO.,LTD - B0416F - Shenzhen Maxtang Computer Ltd + 4062EE + Chicony Electronics Co., Ltd. - 501D93 - Huawei Technologies Ltd + 742972 + Juniper Networks - 2816A8 - Microsoft Corporation + E45ECC + Juniper Networks - F8F532 - ARRIS Group Inc. + 286B5C + Cisco Systems, Inc - B083D6 - ARRIS Group Inc. + 5879E0 + Samsung Electronics Co.,Ltd - 80C7C5 - Fiberhome Telecommunication Technologies Ltd + C47764 + Samsung Electronics Co.,Ltd - E4434B - Dell Inc. + 607FCB + Samsung Electronics Co.,Ltd - 0CF5A4 - Cisco Systems Inc. + 6CB34D + SharkNinja Operating LLC - 9C2EA1 - Xiaomi Communications Ltd + 5C5A4C + IEEE Registration Authority - 089734 - Hewlett Packard Enterprise + 980802 + ORBIS BV - F09CD7 - Guangzhou Blue Cheetah Intelligent Technology Ltd + FCB387 + Leapmotor (Jinhua) New Energy Vehicle Parts Technology Co., Ltd. - BCE143 - Apple + 70357B + vivo Mobile Communication Co., Ltd. - 647033 - Apple + A8A913 + GN Hearing A/S - 846878 - Apple + BC2978 + Prama Hikvision India Private Limited - C8D083 - Apple + 1423F3 + Broadcom Limited - 0C6ABC - Fiberhome Telecommunication Technologies Ltd + 9C0E51 + Schneider Electric - 0080BA - Specialix (Asia) PTE Ltd + 1CF64C + Apple, Inc. - 480BB2 - IEEE Registration Authority + AC5C2C + Apple, Inc. - CCC079 - Murata Manufacturing Ltd + 50F265 + Apple, Inc. - E019D8 - BH Technologies + C06C0C + Apple, Inc. - 6030D4 - Apple + EC09C9 + Texas Instruments - F895EA - Apple + 6C3A36 + Glowforge Inc - 18F1D8 - Apple + C8EED7 + Lightspeed Technologies Inc. - 3CCD5D - Huawei Technologies Ltd + 603192 + OVT India pvt Ltd - 7C7668 - Huawei Technologies Ltd + 58D15A + Texas Instruments - 6C3838 - Marking System Technology Ltd + 9CDAA8 + Apple, Inc. - 30D9D9 - Apple + 0C07DF + Xiaomi Communications Co Ltd - 780F77 - HangZhou Gubei Electronics Technology Ltd + F0ABF3 + Fiberhome Telecommunication Technologies Co.,LTD - A438CC - Nintendo Ltd + 7CE712 + Quectel Wireless Solutions Co.,Ltd. - 74721E - Edison Labs Inc. + 0CEA14 + Ubiquiti Inc - 8C4CDC - Planex Communications Inc. + E817FC + Fujitsu Limited - 5065F3 - Hewlett-Packard Company + E82281 + GD Midea Air-Conditioning Equipment Co.,Ltd. - 3C9509 - Liteon Technology Corporation + 203B34 + Xiaomi Communications Co Ltd - BCAB7C - TRnP KOREA Ltd + B43D6B + NXP Semiconductor (Tianjin) LTD. - 64CB5D - SIA TeleSet + A42902 + Hangzhou Hikvision Digital Technology Co.,Ltd. - 5821E9 - Twpi + 6CD008 + zte corporation - C49F4C - Huawei Technologies Ltd + 508CC9 + zte corporation - 0C704A - Huawei Technologies Ltd + 346E68 + HUAWEI TECHNOLOGIES CO.,LTD - F0E3DC - Tecon MT LLC + CC9096 + Huawei Device Co., Ltd. - A8DA01 - Shenzhen NUOLIJIA Digital Technology Ltd + 2CE2D9 + Huawei Device Co., Ltd. - 7C2586 - Juniper Networks + 8492E5 + HUAWEI TECHNOLOGIES CO.,LTD - F041C8 - IEEE Registration Authority + FCAE2B + Titan Products Ltd. - CC9916 - Integrated Device Technology (Malaysia) Sdn. Bhd. + 5CEB52 + zte corporation - EC7FC6 - Eccel Corporation SAS + FCABF5 + zte corporation - 4CABFC - ZTE Corporation + 083BE9 + New H3C Technologies Co., Ltd - 0010D8 - Calista + 10B65E + New H3C Technologies Co., Ltd - 002194 - Ping Communication + 28EBB7 + ambie corporation - 5C5AEA - Ford + 60CF84 + ASUSTek COMPUTER INC. - 000B7B - Test-Um Inc. + 685134 + Hewlett Packard Enterprise - 30FD38 - Google Inc. + F0CF4D + BitRecords GmbH - 001386 - ABB Inc/Totalflow + 00153B + EMH Metering GmbH & Co. KG - 003C10 - Cisco Systems Inc. + B848EC + Private - 54A65C - Technicolor CH USA Inc. + F41E57 + Routerboard.com - BCDDC2 - Espressif Inc. + 081031 + Lithiunal Energy - 98D863 - Shanghai High-Flying Electronics Technology Ltd + CC6E2A + Cisco Meraki - 0CF346 - Xiaomi Communications Ltd + 30F23C + TECNO MOBILE LIMITED - 7CFF4D - AVM Audiovisuelles Marketing und Computersysteme GmbH + 1C112F + vivo Mobile Communication Co., Ltd. - C88F26 - Skyworth Digital Technology(Shenzhen) Ltd + 74AD45 + Valeo Auto- Electric Hungary Ltd - 703A73 - Shenzhen Sundray Technologies Company Limited + EC308E + Lierda Science & Technology Group Co., Ltd - 10F9EB - Industria Fueguina de Relojeria Electronica s.a. + 70C59C + Silicon Laboratories - 80AD16 - Xiaomi Communications Ltd + E406BF + Silicon Laboratories - 044EAF - LG Innotek + 0CC56C + Apple, Inc. - 1894C6 - Shenzhen Chenyee Technology Ltd + 983FE8 + Samsung Electronics Co.,Ltd - 40BD32 - Texas Instruments + 10ABC9 + Samsung Electronics Co.,Ltd - CC8E71 - Cisco Systems Inc. + E86A64 + LCFC(Hefei) Electronics Technology co., ltd - 38F554 - Hisense Electric Ltd + 902E16 + LCFC(Hefei) Electronics Technology co., ltd - 88E90F - innomdlelab + CC4B04 + Apple, Inc. - 003074 - Equiinet Ltd + 4409DA + Apple, Inc. - EC9B8B - Hewlett Packard Enterprise + 809698 + Apple, Inc. - B0B3AD - HUMAX Ltd + C484FC + Apple, Inc. - 18A28A - Essel-T Ltd + 60FF9E + AzureWave Technology Inc. - 20365B - Megafone Limited + 001E96 + Sepura Limited - E8DE00 - ChongQing GuanFang Technology Ltd + E88088 + LCFC(Hefei) Electronics Technology co., ltd - 70C94E - Liteon Technology Corporation + 745D22 + LCFC(Hefei) Electronics Technology co., ltd - 70D081 - Beijing Netpower Technologies Inc. + 9C69ED + Arista Networks - FC643A - Samsung Electronics Ltd + 645563 + Q-Free America, Inc. - A8515B - Samsung Electronics Ltd + C8A913 + Lontium Semiconductor Corporation - 54B7E5 - Rayson Technology Ltd + 101A92 + AKEBONO BRAKE INDUSTRY CO.,LTD. - 946372 - Vivo Mobile Communication Ltd + 781F7C + Nokia - BC0FA7 - Ouster + 485C2C + Earda Technologies co Ltd - F8C120 - Xi'an Link-Science Technology Ltd + 88F4DA + Intel Corporate - F0C9D1 - GD Midea Air-Conditioning Equipment Ltd + EC8E77 + Intel Corporate - 347E5C - Sonos Inc. + 8407C4 + Walter Kidde Portable Equipment, Inc. - B4FBF9 - Huawei Technologies Ltd + 30E3A4 + Intel Corporate - 506F77 - Huawei Technologies Ltd + A085E3 + Espressif Inc. - 0C41E9 - Huawei Technologies Ltd + 084857 + Suteng Innovation Technology Co., Ltd. - 3CE824 - Huawei Technologies Ltd + 74F90F + HUAWEI TECHNOLOGIES CO.,LTD - 345A06 - Sharp Corporation + 2014C4 + HUAWEI TECHNOLOGIES CO.,LTD - 001936 - Sterlite Optical Technologies Limited + 0C9515 + Palltronics, Inc. - B89F09 - Wistron Neweb Corporation + 707DAF + Plucent AB - 0402CA - Shenzhen Vtsonic Ltd + 64E815 + Arcelik A.S - 3CFB5C - Fiberhome Telecommunication Technologies Ltd + 50056E + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 7440BB - Hon Hai Precision Ind Ltd + EC470C + Universal Electronics, Inc. - 1C1161 - Ciena Corporation + 3854F5 + AltoBeam Inc. - B4DE31 - Cisco Systems Inc. + 70F74F + Robert Bosch JuP1 - A44027 - ZTE Corporation + 485E0E + IEEE Registration Authority - B4F7A1 - LG Electronics (Mobile Communications) + C0BAE6 + Zenitel GB Ltd - 28EDE0 - AMPAK Technology Inc. + E01F34 + HMD Global Oy - 88BD45 - Samsung Electronics Ltd + 4CF475 + Huawei Device Co., Ltd. - 54FCF0 - Samsung Electronics Ltd + 3C4AC9 + Huawei Device Co., Ltd. - 306A85 - Samsung Electronics Ltd + 2C0D27 + Huawei Device Co., Ltd. - 4CDD31 - Samsung Electronics Ltd + 5CBE69 + Oraimo Technology Limited - 88B6EE - Dish Technologies Corp + 94CFB0 + Huawei Device Co., Ltd. - 70F220 - Actiontec Electronics Inc. + FC4116 + Google, Inc. - D0817A - Apple + 48B424 + eero inc. - 98CA33 - Apple + A02442 + Shenzhenshi Xinzhongxin Technology Co.Ltd - 68AB1E - Apple + 3C5765 + UNIONMAN TECHNOLOGY CO.,LTD - 70EF00 - Apple + 5805D9 + Seiko Epson Corporation - C87765 - Tiesse SpA + EC5A31 + BUFFALO.INC - 2C37C5 - Qingdao Haier Intelligent Home Appliance Technology Ltd + F01EAC + Rentokil Initial - CC40D0 - Netgear + 34E6E6 + LG Innotek - 7C7630 - Shenzhen YOUHUA Technology Ltd + ECA7B1 + IEEE Registration Authority - 9822EF - Liteon Technology Corporation + B48618 + GX India Pvt Ltd - 788038 - Funai Electric Ltd + EC1DA9 + YEALINK(XIAMEN) NETWORK TECHNOLOGY CO.,LTD. - BCFFEB - Motorola Mobility LLC, a Lenovo Company + A4A584 + Cisco Systems, Inc - 000130 - Extreme Networks Inc. + C4A9B8 + XIAMENSHI C-CHIP TECHNOLOGY CO.,LTD - FC0A81 - Extreme Networks Inc. + 345CF3 + Chipsea Technologies (Shenzhen) Corp. - F045DA - Texas Instruments + 58ED99 + zte corporation - B80716 - Vivo Mobile Communication Ltd + F4BDB9 + Ubiqcom India Pvt Ltd - A8EEC6 - Muuselabs NV/SA + 20B5C6 + Mimosa Networks - E4F042 - Google Inc. + 981CA2 + Apple, Inc. - 4048FD - IEEE Registration Authority + E8FFF4 + Apple, Inc. - 20B399 - Enterasys + 0C1563 + Apple, Inc. - CC2D21 - Tenda Technology LtdDongguan branch + 3CDD57 + Apple, Inc. - 004097 - Datex Division Of + 7C3B2D + Apple, Inc. - 9C4FCF - TCT mobile Ltd + EC536F + HUAWEI TECHNOLOGIES CO.,LTD - D896E0 - Alibaba Cloud Computing Ltd + D801D0 + HUAWEI TECHNOLOGIES CO.,LTD - 001862 - Seagate Technology + 84EE7F + HUAWEI TECHNOLOGIES CO.,LTD - 1CEEC9 - Elo touch solutions + 7CFAD6 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 000C50 - Seagate Technology + 788371 + HUAWEI TECHNOLOGIES CO.,LTD - 342AF1 - Texas Instruments + E8F0A4 + Antonios A. Chariton - C8DEC9 - Coriant + F43AFA + IEEE Registration Authority - 44D5A5 - AddOn Computer + CC2614 + Sichuan Tianyi Comheart Telecom Co.,LTD - 38F73D - Amazon Technologies Inc. + 3C3824 + Xiaomi Communications Co Ltd - C0A00D - ARRIS Group Inc. + D0C0BF + Actions Microelectronics - 0C6111 - Anda Technologies SAC + DC2FFA + GE Lighting - 0022C4 - epro GmbH + 284D7D + zte corporation - 1C330E - PernixData + B82903 + VIETNAM POST AND TELECOMMUNICATION INDUSTRY TECHNOLOGY JOIN STOCK COMPANY - B8F74A - Rcntec + A8FECE + Fiberhome Telecommunication Technologies Co.,LTD - 645106 - Hewlett-Packard Company + 286DDA + Fiberhome Telecommunication Technologies Co.,LTD - 0C1539 - Apple + 84CC11 + LG Electornics - 6C5697 - Amazon Technologies Inc. + C45746 + Texas Instruments - 0005FF - SNS Solutions Inc. + 20BEB4 + Hisense broadband multimedia technology Co.,Ltd - F87B20 - Cisco Systems Inc. + C47DA8 + NXP Semiconductor (Tianjin) LTD. - E0AADB - Nanjing PANENG Technology Development Ltd + B8A0B8 + Samsung Electronics Co.,Ltd - ECF451 - Arcadyan Corporation + 440BAB + Positivo Tecnologia S.A. - 581243 - AcSiP Technology Corp. + DC7E1D + HUAWEI TECHNOLOGIES CO.,LTD - A89FEC - ARRIS Group Inc. + 2CA797 + HUAWEI TECHNOLOGIES CO.,LTD - 00BE9E - Fiberhome Telecommunication Technologies Ltd + 98E255 + Nintendo Co.,Ltd - 54C57A - Sunnovo International Limited + 087158 + HANSHOW TECHNOLOGY CO.,LTD. - 58C17A - Cambium Networks Limited + AC1794 + SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD - 38019F - Shenzhen Fast Technologies Ltd + 58257A + MOBIWIRE MOBILES(NINGBO) CO.,LTD - 245CCB - AXIe Consortium Inc. + 8892CC + Tonly Technology Co. Ltd - 609BC8 - Hipad Intelligent Technology Ltd + 3490EA + Murata Manufacturing Co., Ltd. - 406A8E - Hangzhou Puwell OE Tech Ltd + 0060D5 + AMADA CO., LTD - 1C0FAF - Lucid Vision Labs + 0022C8 + ModuVision Technologies - 88B4A6 - Motorola Mobility LLC, a Lenovo Company + EC41F9 + Shenzhen iComm Semiconductor CO.,LTD - 28CF08 - Essys + B8CC5F + Shenzhen iComm Semiconductor CO.,LTD - 002128 - Oracle Corporation + A46011 + Verifone, Inc. - 001C73 - Arista Networks + 60C798 + Verifone, Inc. - 2C8A72 - HTC Corporation + 000B4F + Verifone, Inc. - 38AD8E - New H3C Technologies Ltd + 88BF35 + Verifone, Inc. - 34D0B8 - IEEE Registration Authority + 308E7A + Shenzhen iComm Semiconductor CO.,LTD - D06726 - Hewlett Packard Enterprise + 2CDD5F + Shenzhen iComm Semiconductor CO.,LTD - ECFAF4 - SenRa Tech Pvt Ltd + 081A1E + Shenzhen iComm Semiconductor CO.,LTD - D88F76 - Apple + 88B5FF + Shenzhen iComm Semiconductor CO.,LTD - 409C28 - Apple + 4CA38F + shenzhen trolink Technology Co.,Ltd - 583879 - Ricoh Company Ltd + 905671 + Cisco Systems, Inc - F44C70 - Skyworth Digital Technology(Shenzhen) Ltd + 70BD96 + Cisco Systems, Inc - C8E7F0 - Juniper Networks + BCFCE7 + ASUSTek COMPUTER INC. - B0935B - ARRIS Group Inc. + 9CDEF0 + Jiangxi Risound Electronics Co.,LTD - F449EF - Emstone + 081287 + Jiangxi Risound Electronics Co.,LTD - 54DF24 - Fiberhome Telecommunication Technologies Ltd + B46E10 + vivo Mobile Communication Co., Ltd. - AC1DDF - IEEE Registration Authority + 6C4F89 + Zyxel Communications Corporation - E8D819 - Azurewave Technologies Inc. + A809B1 + Huawei Device Co., Ltd. - 782D7E - TRENDnet Inc. + 34A8DB + SenArch ApS - 741AE0 - IEEE Registration Authority + ECD909 + ALPSALPINE CO,.LTD - 24B209 - Avaya Inc + 405B7F + Broadcom Limited - FC65DE - Amazon Technologies Inc. + 2840DD + Sony Interactive Entertainment Inc. - B06EBF - ASUSTek Computer Inc. + 5C1923 + Hangzhou Lanly Technology Co., Ltd. - 603D26 - Technicolor CH USA Inc. + 185073 + Tianjin HuaLai Technology CO., Ltd. - BC903A - Robert Bosch GmbH + D820A2 + HUAWEI TECHNOLOGIES CO.,LTD - D0B128 - Samsung Electronics Ltd + AC69CF + Cisco Meraki - BC5451 - Samsung Electronics Ltd + FC942E + Cisco Meraki - 74860B - Cisco Systems Inc. + B8A1B8 + Arista Networks - 182D98 - Jinwoo Industrial System + C0D6D5 + Microsoft Corporation - D8A534 - Spectronix Corporation + 1406A7 + CRESYN - EC51BC - Guangdong Oppo Mobile Telecommunications Corp Ltd + CCD920 + Huizhou Desay SV Automotive Co., Ltd. - F079E8 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 4087E5 + Wu Qi Technologies,Inc. - 601803 - Daikin Air-Conditioning (Shanghai) Ltd + C4F035 + Hughes Network Systems, LLC - 00A096 - Mitsumi Electric Ltd + B4E7B3 + Edifier International - 78617C - Mitsumi Electric Ltd + D45944 + tonies GmbH - 940E6B - Huawei Technologies Ltd + 684465 + Apple, Inc. - 64FB50 - RoomReady/Zdi Inc. + 2478EF + Nokia - 74EAC8 - New H3C Technologies Ltd + 009D85 + Sigmastar Technology Ltd. - B4D64E - Caldero Limited + D8C7C8 + Hewlett Packard Enterprise - F89DBB - Tintri + C0B22F + Apple, Inc. - D8A01D - Espressif Inc. + 608110 + Apple, Inc. - C4F312 - Texas Instruments + 64A3CC + LeoLabs - 904E91 - IEEE Registration Authority + E8EAFA + Qingdao Haier Technology Co.,Ltd - 5CE8B7 - Oraimo Technology Limited + ACF473 + iRobot Corporation - 3C11B2 - Fraunhofer FIT + 644F56 + YEALINK(XIAMEN) NETWORK TECHNOLOGY CO.,LTD. - 104B46 - Mitsubishi Electric Corporation + DC9009 + Intel Corporate - DC0C2D - Weifang Goertek Electronics Ltd + 54E4ED + Intel Corporate - D067E5 - Dell Inc. + 38F0BB + CompuSoft A/S - 8CFEB4 - Vsoontech Electronics Ltd + 08B8D0 + Chipsea Technologies (Shenzhen) Corp. - CC66B2 - Nokia + 0015D1 + Commscope - 9C65EE - DASAN Network Solutions + 0000CA + Commscope - 78CA04 - Nokia Corporation + 0015A4 + Commscope - 34298F - IEEE Registration Authority + 0015A3 + Commscope - 5CEA1D - Hon Hai Precision Ind Ltd + 0015A2 + Commscope - 181456 - Nokia Corporation + 000FCC + Commscope - 0017C8 - KYOCERA Display Corporation + D039B3 + Commscope - 38E2DD - ZTE Corporation + BCCAB5 + Commscope - 885DFB - ZTE Corporation + 5C8FE0 + Commscope - 58B42D - YSTen Technology Ltd + 4896D9 + zte corporation - E048D3 - Mobiwire Mobiles (Ningbo) Ltd + 8461A0 + Commscope - 58E28F - Apple + 3CDFA9 + Commscope - 787B8A - Apple + 0CF893 + Commscope - 4C16FC - Juniper Networks + ACB313 + Commscope - 48BCA6 - ASUNG TECHNO Ltd + 10868C + Commscope - B009DA - Ring Solutions + 384C90 + Commscope - 00054F - Garmin International + 001DD3 + Commscope - 005C86 - Shenzhen Fast Technologies Ltd + 001DD0 + Commscope - 30053F - JTI Ltd + 0015CE + Commscope - B8DB1C - Integrated Device Technology (Malaysia) Sdn. Bhd. + 0004BD + Commscope - 3C10E6 - PHAZR Inc. + 000F9F + Commscope - 904506 - Tokyo Boeki Medisys Inc. + 00111A + Commscope - 0021A1 - Cisco Systems Inc. + 0017EE + Commscope - FCB698 - Cambridge Industries(Group) Ltd + 00152F + Commscope - 0001CD - ARtem + F87B7A + Commscope - 5C546D - Huawei Technologies Ltd + C8AA21 + Commscope - 84A1D1 - Sagemcom Broadband SAS + DC4517 + Commscope - 909D7D - ARRIS Group Inc. + 001FC4 + Commscope - 788C4D - Indyme Solutions LLC + 0023AF + Commscope - 78BC1A - Cisco Systems Inc. + 002395 + Commscope - 000E59 - Sagemcom Broadband SAS + 0022B4 + Commscope - 101D51 - 8Mesh Networks Limited + 002210 + Commscope - DCEB53 - Wuhan QianXiao Elecronic Technology Ltd + 0024A1 + Commscope - EC8AC7 - Fiberhome Telecommunication Technologies Ltd + 8096B1 + Commscope - 88365F - LG Electronics (Mobile Communications) + 00E06F + Commscope - 288CB8 - ZTE Corporation + 00149A + Commscope - FC7F56 - CoSyst Control Systems GmbH + 001CFB + Commscope - 2C4053 - Samsung Electronics Ltd + 0019C0 + Commscope - 0C8FFF - Huawei Technologies Ltd + 0014E8 + Commscope - 54B121 - Huawei Technologies Ltd + 707E43 + Commscope - 788102 - Sercomm Corporation. + 002642 + Commscope - 84AA9C - MitraStar Technology Corp. + 2C584F + Commscope - F0EFD2 - TF Payment Service Ltd + 4C1265 + Commscope - 24B2DE - Espressif Inc. + 9CC8FC + Commscope - F4939F - Hon Hai Precision Ind Ltd + 2C9924 + Commscope - 000726 - Shenzhen Gongjin Electronics Ltd + E02202 + Commscope - FC8B97 - Shenzhen Gongjin Electronics Ltd + 2C7E81 + Commscope - 2CAB25 - Shenzhen Gongjin Electronics Ltd + 8C5BF0 + Commscope - 1CA532 - Shenzhen Gongjin Electronics Ltd + 0CEAC9 + Commscope - 000C03 - HDMI Licensing LLC + 3C0461 + Commscope - 7CBACC - IEEE Registration Authority + 641269 + Commscope - 94F128 - Hewlett Packard Enterprise + 28C87A + Commscope - 101B54 - Huawei Technologies Ltd + D43FCB + Commscope - A80C63 - Huawei Technologies Ltd + 6092F5 + Commscope - 5CC307 - Huawei Technologies Ltd + 4C38D8 + Commscope - E0107F - Ruckus Wireless + D4B27A + Commscope - C4017C - Ruckus Wireless + D82522 + Commscope - 04FA3F - Opticore Inc. + E0B7B1 + Commscope - 540237 - Teltronic AG + 005094 + Commscope - 4CB008 - Shenzhen Gwelltimes Technology Ltd + F80BBE + Commscope - E86FF2 - Actiontec Electronics Inc. + 5856E8 + Commscope - 005018 - AMIT Inc. + 4434A7 + Commscope - 70DEF9 - FAI WAH International (Hong Kong) Limited + 6838E3 + EYESON SOLUTION CO.,Ltd - B0EABC - Askey Computer Corp + 3C39A8 + Shenzhen Taichi Technology Limited - 94C691 - EliteGroup Computer Systems Ltd + A0E7AE + Commscope - 3CF591 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 90935A + Commscope - 602101 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 24A186 + Commscope - 7CEB7F - Dmet Products Corp. + 14C03E + Commscope - 8C8580 - Smart Innovation LLC + C089AB + Commscope - 404229 - Layer3TV Inc. + 0CB771 + Commscope - FC2F6B - Everspin Technologies Inc. + 90C792 + Commscope - 287B09 - ZTE Corporation + D46C6D + Commscope - 0025C4 - Ruckus Wireless + BC5BD5 + Commscope - C0C520 - Ruckus Wireless + 145D34 + SHENZHEN BILIAN ELECTRONIC CO.,LTD - 78B28D - Beijing Tengling Technology Ltd + ACC5B4 + HUAWEI TECHNOLOGIES CO.,LTD - A88038 - Shenzhen MovingComm Technology Ltd + B4D5E5 + Samsung Electronics Co.,Ltd - F81D90 - Solidwintech + C4EF3D + Samsung Electronics Co.,Ltd - A06A44 - Vizio Inc. + C0D5E2 + Samsung Electronics Co.,Ltd - DCBE7A - Zhejiang Nurotron Biotechnology Co. + 68ED57 + Juniper Networks - 3438B7 - HUMAX Ltd + 4036B7 + Juniper Networks - CC0677 - Fiberhome Telecommunication Technologies Ltd + 7CC790 + Palo Alto Networks - 784501 - Biamp Systems + 000540 + Tokyo Electron Device Limited - 309C23 - Micro-Star INTL Ltd + 4C3089 + Hitachi Rail GTS Deutschland GmbH - 54D751 - Proximus + 2C66F5 + SHENZHEN ELECTRICAL APPLIANCES CO. - 14780B - Varex Imaging Deutschland AG + BCBEFB + ASL Xiamen Technology CO., LTD - ACAFB9 - Samsung Electronics Ltd + 00504D + Tokyo Electron Device Limited - 88B111 - Intel Corporation + E46447 + EM Microelectronic - 8C395C - Bit4id Srl + 343607 + PINEWAVE PTE. LTD. - D4258B - Intel Corporation + C87023 + Altice Labs - 041B6D - LG Electronics (Mobile Communications) + 542722 + Lacroix - F44156 - Arrikto Inc. + A47D78 + Edgecore Americas Networking Corporation - 688DB6 - Aetek Inc. + 50E099 + HangZhou Atuo Future Technology Co., Ltd - ECF342 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 547E1A + Kaon Group Co., Ltd. - 50FF20 - Keenetic Limited + B8D4F7 + New H3C Technologies Co., Ltd - E45740 - ARRIS Group Inc. + 68508C + Shanghai Sunmi Technology Co.,Ltd. - F894C2 - Intel Corporation + A88F99 + Arista Networks - 70D379 - Cisco Systems Inc. + E8CF83 + Dell Inc. - 00F82C - Cisco Systems Inc. + 48BC0E + Sichuan AI-Link Technology Co., Ltd. - 00C1B1 - Cisco Systems Inc. + 6C22F7 + Nokia Shanghai Bell Co., Ltd. - F4FCB1 - JJ Corp + 244885 + Huawei Device Co., Ltd. - D8C8E9 - Phicomm (Shanghai) Ltd + CC8A84 + Huawei Device Co., Ltd. - 7CB960 - Shanghai X-Cheng telecom Ltd + 802EDE + Huawei Device Co., Ltd. - B03D96 - Vision Valley FZ LLC + 98A44E + IEC Technologies S. de R.L de C.V. - 986C5C - Jiangxi Gosun Guard Security Ltd + 384DD2 + Huawei Device Co., Ltd. - 24792A - Ruckus Wireless + BCF2E5 + Powerful Devices - 30D386 - ZTE Corporation + 04FDE8 + Technoalpin - 70DB98 - Cisco Systems Inc. + 9088A9 + IEEE Registration Authority - B42A0E - Technicolor CH USA Inc. + 3486DA + Honor Device Co., Ltd. - 9CC8AE - Becton, Dickinson and Company + F8CE21 + TP-LINK TECHNOLOGIES CO.,LTD. - B0359F - Intel Corporation + F8C903 + TP-LINK TECHNOLOGIES CO.,LTD. - C0D962 - Askey Computer Corp + 441146 + The Chamberlain Group, Inc - F80BCB - Cisco Systems Inc. + F43392 + Cisco Systems, Inc - 50D37F - Yu Fly Mikly Way Science and Technology Ltd + 389231 + TECNO MOBILE LIMITED - 181212 - Cepton Technologies + 6C05D3 + CHINA DRAGON TECHNOLOGY LIMITED - 70D923 - Vivo Mobile Communication Ltd + 443E8A + Texas Instruments - B83A08 - Tenda Technology LtdDongguan branch + 348E89 + Hangzhou BroadLink Technology Co., Ltd - 28B448 - Huawei Technologies Ltd + 8428D6 + SERVERCOM (INDIA) PRIVATE LIMITED - 100501 - Pegatron Corporation + ACD929 + Quectel Wireless Solutions Co.,Ltd. - 2CFAA2 - Alcatel-Lucent Enterprise + 10C735 + Microsoft Corporation - A49BF5 - Hybridserver Tec GmbH + 64028F + Silicon Laboratories - 503DA1 - Samsung Electronics Ltd + CCB148 + Arcadyan Corporation - F097E5 - Tamio Inc. + DC567B + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 4C1A3D - Guangdong Oppo Mobile Telecommunications Corp Ltd + 74FB17 + Qingdao Goertek Horizons Tecnology Co.,LTD - 08028E - Netgear + C4E3CE + EnGenius Technologies, Inc. - E8E732 - Alcatel-Lucent Enterprise + D490E0 + Wachendorff Automation GmbH & CO.KG - B47C9C - Amazon Technologies Inc. + 889E96 + zte corporation - F4A739 - Juniper Networks + 546749 + Google, Inc. - F470AB - Vivo Mobile Communication Ltd + BC85D0 + SKY UK LIMITED - 2C5A0F - Cisco Systems Inc. + 140805 + SKY UK LIMITED - 2C3124 - Cisco Systems Inc. + ACCA0F + INDISR COMMUNICATION SERVICES AND TECHNOLOGIES INDIA - 503237 - Apple + 9C79E3 + Apple, Inc. - B0481A - Apple + 8851F2 + Apple, Inc. - B49CDF - Apple + 5CADBA + Apple, Inc. - 48BF6B - Apple + 1CF9D5 + Apple, Inc. - 2C1DB8 - ARRIS Group Inc. + 783F4D + Apple, Inc. - 58821D - H. Schomacker GmbH + 50139D + Sierra Wireless, ULC - D8A105 - Syslane Ltd + 58FCC8 + Honeywell - BCA042 - Shanghai Flyco Electrical Appliance Ltd + F8DC7A + Variscite LTD - 3C0518 - Samsung Electronics Ltd + 245D92 + Juniper Networks - 900628 - Samsung Electronics Ltd + 7CBECE + Private - B4A9FE - GHIA Technology (Shenzhen) Ltd + C890A8 + Bouffalo Lab (Nanjing) Co., Ltd. - 08B258 - Juniper Networks + C8A4CD + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 9C84BF - Apple + 784946 + Cambridge Mobile Telematics, Inc. - 1CA0D3 - IEEE Registration Authority + 48EEE2 + ROAMWIFI TECHNOLOGY(HK) LIMITED - 9CFCD1 - Aetheris Technology (Shanghai) Ltd + A0BD71 + QUALCOMM Incorporated - CCCE1E - AVM Audiovisuelles Marketing und Computersysteme GmbH + 880F62 + Silicon Laboratories - 0CF4D5 - Ruckus Wireless + 3034DB + LG Innotek - 7C2664 - Sagemcom Broadband SAS + 7410E0 + Broadcom Limited - AC6B0F - Cadence Design Systems Inc + 5823BC + IEEE Registration Authority - C8B5AD - Hewlett Packard Enterprise + 9877D5 + WiZ - 7C3866 - Texas Instruments + A0E06D + Fiberhome Telecommunication Technologies Co.,LTD - 0C61CF - Texas Instruments + 903CDA + Fiberhome Telecommunication Technologies Co.,LTD - 9C1D58 - Texas Instruments + 3C9722 + shenzhen worldelite electronics co., LTD - 3805AC - Piller Group GmbH + 04208A + 浙江路川科技有限公司 - 346E9D - Ericsson AB + 20F120 + Cisco Systems, Inc - 6854C1 - ColorTokens Inc. + ECDD24 + Cisco Systems, Inc - 00111B - Targa Systems Div L-3 Communications + 30BE29 + AltoBeam Inc. - 6C750D - WiFiSONG + 8449EE + Demant Enterprise A/S - BC3F8F - Huawei Technologies Ltd + C400B5 + HongKong Tenry Technology Co., Ltd. - 143004 - Huawei Technologies Ltd + 845234 + Juniper Networks - F4DC41 - Youngzone Culture (Shanghai) Corp + 344951 + Eliyan Corp. - C4836F - Ciena Corporation + A44343 + Huawei Device Co., Ltd. - 7CC6C4 - Kolff Computer Supplies b.v. + 44B3C5 + Huawei Device Co., Ltd. - 000F4F - PCS Systemtechnik GmbH + 64C01A + Sichuan Tianyi Comheart Telecom Co.,LTD - A80CCA - Shenzhen Sundray Technologies Company Limited + 782599 + Huawei Device Co., Ltd. - 38AA3C - Samsung Electro Mechanics Ltd + C4FF99 + Intel Corporate - 000302 - Charles Industries Ltd + 289529 + Intel Corporate - 50A4D0 - IEEE Registration Authority + A499A8 + eero inc. - 800010 - AT&T + 643135 + Apple, Inc. - 0024F1 - Shenzhen Fanhai Sanjiang Electronics Ltd + E0BFB2 + Apple, Inc. - 142FFD - LT Security Inc + 086202 + Apple, Inc. - 0C3CCD - Universal Global Scientific Industrial Ltd + D823E0 + SPEEDTECH CORP. - 14ABC5 - Intel Corporation + BC86A5 + Cambridge Mobile Telematics, Inc. - 50D213 - CviLux Corporation + F810A0 + Xtreme Testek Inc. - 001E29 - Hypertherm Inc + A09D22 + Apple, Inc. - 5004B8 - Huawei Technologies Ltd + 4CC449 + Icotera A/S - 00D0B2 - Xiotech Corporation + 68EFDC + Apple, Inc. - 5CFF35 - Wistron Corporation + B8CB93 + IC BOSS.COM TECH INC - CC9F7A - Chiun Mai Communication Systems Inc. + C4D7DC + Zhejiang Weilai Jingling Artificial Intelligence Technology Co., Ltd. - 78F29E - Pegatron Corporation + 1C792D + CHINA DRAGON TECHNOLOGY LIMITED - 64777D - Hitron Technologies Inc. + 14801F + Sunnovo International Limited - 9C50EE - Cambridge Industries(Group) Ltd + E845EB + Kohler Ventures, Inc. - 40ED98 - IEEE Registration Authority + 789F6A + Ruckus Wireless - C891F9 - Sagemcom Broadband SAS + 000346 + KOKUSAI DENKI Electric Inc. - ACDCE5 - Procter & Gamble Company + 54B29D + Shenzhen YOUHUA Technology Co., Ltd - 00B362 - Apple + 800EA9 + TCL Yuxin Zhixing Technology (Huizhou) Co.,Ltd - E4E4AB - Apple + 809D65 + FN-LINK TECHNOLOGY Ltd. - 60D262 - Tzukuri Pty Ltd + B0EE7B + Roku, Inc - 8404D2 - Kirale Technologies SL + D83134 + Roku, Inc - 60334B - Apple + 105932 + Roku, Inc - 38AFD7 - Fujitsu Limited + A8B57C + Roku, Inc - 28993A - Arista Networks + 345E08 + Roku, Inc - 64EB8C - Seiko Epson Corporation + C47981 + Ehya LTD - F48C50 - Intel Corporation + 4C2F7B + AltoBeam Inc. - DCD255 - Kinpo Electronics Inc. + 00A62B + Shanghai High-Flying Electronics Technology Co.,Ltd - A02C36 - FN-Link Technology Limited + 3C566E + Infinix mobility limited - 000320 - Xpeed Inc. + 9CDFB3 + NXP Semiconductor (Tianjin) LTD. - 508A0F - Shenzhen Fise Technology Holding Ltd + BC8D7E + Silicon Laboratories - 7CCBE2 - IEEE Registration Authority + 640864 + Cisco Systems, Inc - A8A5E2 - MSF-Vathauer Antriebstechnik GmbH & Co KG + A4A404 + Bubendorff SAS - BCA8A6 - Intel Corporation + 001C2B + Hive - 74FF4C - Skyworth Digital Technology(Shenzhen) Ltd + E0EFBF + Nintendo Co.,Ltd - 68AF13 - Futura Mobility + 882AE1 + MRC INC. - 681AB2 - ZTE Corporation + 985207 + HUAWEI TECHNOLOGIES CO.,LTD - 7CEBAE - Ridgeline Instruments + A80DE1 + HUAWEI TECHNOLOGIES CO.,LTD - E0508B - Zhejiang Dahua Technology Ltd + C0E911 + RealNetworks - 9C1E95 - Actiontec Electronics Inc. + B4E9B8 + Dell Inc. - 60427F - Shenzhen Chuangwei-RGB Electronics Ltd + A4BA70 + Beijing Xiaomi Mobile Software Co., Ltd - E89EB4 - Hon Hai Precision Ind Ltd + 606E53 + Beijing Wisdomstar Technology Co., Ltd - D46A6A - Hon Hai Precision Ind Ltd + 7828CA + Sonos, Inc. - 98FD74 - ACT Ltd + 542A1B + Sonos, Inc. - 64DB43 - Motorola (Wuhan) Mobility Technologies Communication Ltd + F0F6C1 + Sonos, Inc. - 000E58 - Sonos Inc. + D42DC5 + i-PRO Co., Ltd. - 002590 - Super Micro Computer Inc. + 6CB077 + ALL Winner (Hong Kong) Limited - AC1F6B - Super Micro Computer Inc. + D09288 + Powertek Limited - 000B2E - Cal-Comp Electronics & Communications Company Ltd + 9C65EB + Intel Corporate - 4865EE + 943EFD IEEE Registration Authority - D0F73B - Helmut Mauell GmbH Werk Weida - - - 180675 - Dilax Intelcom GmbH + F09602 + Earda Technologies co Ltd - 000FC2 - Uniwell Corporation + 187E20 + FUJIAN STAR-NET COMMUNICATION CO.,LTD - 6CEC5A - Hon Hai Precision Ind Ltd + C049BD + EM Microelectronic - 44C346 - Huawei Technologies Ltd + 24B231 + Dongguan Liesheng Electronic Co., Ltd. - 307496 - Huawei Technologies Ltd + 8CA401 + Shenzhen New Chip Intelligence Co.,LTD - 708A09 - Huawei Technologies Ltd + 14375E + Symbotic LLC - CCC5EF - Co-Comm Servicios Telecomunicaciones S.L. + 6882F2 + FIXME GmbH - 9002A9 - Zhejiang Dahua Technology Ltd + 90E5B1 + Espressif Inc. - C0288D - Logitech Inc. + 480560 + Meta Platforms, Inc. - 0C4933 - Sichuan Jiuzhou Electronic Technology Ltd + 1492F9 + Sichuan AI-Link Technology Co., Ltd. - 000064 - Yokogawa Digital Computer Corporation + 2429B0 + HUAWEI TECHNOLOGIES CO.,LTD - 506B8D - Nutanix + 6C27C8 + IEEE Registration Authority - 0038DF - Cisco Systems Inc. + 001F23 + DGS Diagnostics A/S - F4CAE5 - Freebox SAS + CC6D55 + Sichuan Tianyi Comheart Telecom Co.,LTD - 90004E - Hon Hai Precision Ind Ltd + 34C1E9 + Ulak Communications Inc. - 7C2634 - ARRIS Group Inc. + C0DFED + Juniper Networks - 40F413 - Rubezh + D03BF4 + Shenzhen Kean Digital Co.,Ltd - C8D3FF - Hewlett-Packard Company + 48FC07 + Huawei Device Co., Ltd. - C4BE84 - Texas Instruments + A8EE67 + Samsung Electronics Co.,Ltd - F4F524 - Motorola Mobility LLC, a Lenovo Company + B841D9 + Guangzhou Shiyuan Electronic Technology Company Limited - 00BBC1 - Canon Inc. + E095FF + Infinix mobility limited - 24C1BD - Crrc Dalian R&D Ltd + 40ED00 + TP-Link Systems Inc - 00A2EE - Cisco Systems Inc. + 788CB5 + TP-Link Systems Inc - 0059DC - Cisco Systems Inc. + 94FF06 + Hewlett Packard Enterprise - 00FD45 - Hewlett Packard Enterprise + 0827F0 + Accton Technology Co., Ltd. - 5098F3 - Rheem Australia Pty Ltd + 88263F + Zhejiang Uniview Technologies Co.,Ltd. - B4D135 - Cloudistics + 202351 + TP-Link Systems Inc - 0013A5 - General Solutions Ltd + D84489 + TP-Link Systems Inc - 9C3DCF - Netgear + 04981C + Ningbo Zhixiang Technology Co., Ltd - 248894 - Shenzhen lensun Communication Technology Ltd + 04C98B + IEEE Registration Authority - B04BBF - PT HAN Sung Electoronics Indonesia + 6083E7 + TP-Link Systems Inc - CC2D83 - Guangdong Oppo Mobile Telecommunications Corp Ltd + A86E84 + TP-Link Systems Inc - D46E0E - TP-Link Technologies Ltd + 003192 + TP-Link Systems Inc - 88366C - EFM Networks + D80A42 + Shanghai Lixun Information Technology Co., Ltd. - 48DA96 - Eddy Smart Home Solutions Inc. + 54107B + Guangdong Jeton International Tech Ltd. - F074E4 - Thundercomm Technology Ltd + 1C61B4 + TP-Link Systems Inc - A0722C - HUMAX Ltd + 9CA2F4 + TP-Link Systems Inc - FCD848 - Apple + CC68B6 + TP-Link Systems Inc - EC107B - Samsung Electronics Ltd + F0A731 + TP-Link Systems Inc - 1C232C - Samsung Electronics Ltd + B0A187 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - E00DB9 - Cree Inc. + 50BB9F + Vantiva USA LLC - DC0D30 - Shenzhen Feasycom Technology Ltd + 180DF9 + Silicon Laboratories - F0ACD7 + 380525 IEEE Registration Authority - 9495A0 - Google Inc. + 04BE58 + HUAWEI TECHNOLOGIES CO.,LTD - 00A6CA - Cisco Systems Inc. + 4044CE + HUAWEI TECHNOLOGIES CO.,LTD - 38D547 - ASUSTek Computer Inc. + F02B18 + Nanjing Jiahao Technology Co., Ltd. - FC83C6 - N-Radio Technologies Ltd + 00F5FD + HUAWEI TECHNOLOGIES CO.,LTD - 30B64F - Juniper Networks + 180BD0 + HUAWEI TECHNOLOGIES CO.,LTD - 1C9D3E - Integrated Device Technology (Malaysia) Sdn. Bhd. + 34FC99 + SJIT Co., Ltd. - F02FA7 - Huawei Technologies Ltd + D84A83 + vivo Mobile Communication Co., Ltd. - 18DED7 - Huawei Technologies Ltd + DC76C3 + IEEE Registration Authority - C83DD4 - CyberTAN Technology Inc. + 081093 + Samsung Electronics Co.,Ltd - E0B94D - Shenzhen Bilian Electronic Ltd + 44C63C + Samsung Electronics Co.,Ltd - D8452B - Integrated Device Technology (Malaysia) Sdn. Bhd. + 4845E6 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - E4186B - ZyXEL Communications Corp + B0D77E + HUAWEI TECHNOLOGIES CO.,LTD - 008731 - Cisco Systems Inc. + 7400E8 + HUAWEI TECHNOLOGIES CO.,LTD - 88DEA9 - Roku Inc. + 00AEF7 + Dreame Technology (Suzhou) Limited - 78888A - CDR Sp. z o.o. Sp. k. + 60323B + Quectel Wireless Solutions Co.,Ltd. - 0021D1 - Samsung Electronics Ltd + 147AE4 + Apple, Inc. - 001FCC - Samsung Electronics Ltd + A0C1C5 + Apple, Inc. - A42983 - Boeing Defence Australia + 904748 + Sony Interactive Entertainment Inc. - EC8892 - Motorola Mobility LLC, a Lenovo Company + D4A2CD + Dell Inc. - 7487A9 - OCT Technology Ltd + 9CC7B1 + ELITEGROUP COMPUTER SYSTEMS CO.,LTD. - 004A77 - ZTE Corporation + 407AA4 + ZHEJIANG DAHUA TECHNOLOGYCO.,LTD - A41437 - Hangzhou Hikvision Digital Technology Ltd + 7C7B68 + VIETNAM POST AND TELECOMMUNICATION INDUSTRY TECHNOLOGY JOIN STOCK COMPANY - 60A10A - Samsung Electronics Ltd + D065B3 + TCL King Electrical Appliances(Huizhou)Co.,Ltd - 8C71F8 - Samsung Electronics Ltd + 80AA1C + Luxottica Tristar (Dongguan) Optical Co.,Ltd - CC051B - Samsung Electronics Ltd + 5C9977 + Apple, Inc. - 8C7712 - Samsung Electronics Ltd + B07219 + Apple, Inc. - 9463D1 - Samsung Electronics Ltd + 30FE6C + Apple, Inc. - 0021D2 - Samsung Electronics Ltd + 1C7754 + Apple, Inc. - 5C497D - Samsung Electronics Ltd + E0051C + GigaDevice Semiconductor Inc. - 98234E - Micromedia AG + A8E5EC + Nokia - 503F98 - Cmitech + D40ADC + Qingdao Intelligent&Precise Electronics Co.,Ltd. - 782079 - ID Tech + 3C3BAD + CHINA DRAGON TECHNOLOGY LIMITED - 0C6076 - Hon Hai Precision Ind Ltd + 7824BE + Cisco Systems, Inc - 0CEEE6 - Hon Hai Precision Ind Ltd + 089707 + Cisco Systems, Inc - E4D53D - Hon Hai Precision Ind Ltd + A401DE + SERCOMM PHILIPPINES INC - C0143D - Hon Hai Precision Ind Ltd + 68F44B + Home Control Singapore Pte Ltd - C01885 - Hon Hai Precision Ind Ltd + 0C8DDB + Cisco Meraki - 00749C - Ruijie Networks Ltd + CC03D9 + Cisco Meraki - 5894CF - Vertex Standard LMR Inc. + 10D657 + Siemens Industrial Automation Products Ltd., Chengdu - 20F85E - Delta Electronics + 88C78F + zte corporation - 7825AD - Samsung Electronics Ltd + A8ED71 + Analogue Enterprises Limited - ECE09B - Samsung Electronics Ltd + 0C1C31 + MERCUSYS TECHNOLOGIES CO., LTD. - 0023E4 - IPnect Ltd + 30C91B + Zhen Shi Information Technology(Shanghai)Co.,Ltd. - 70D4F2 - RIM + 48C381 + TP-Link Systems Inc. - 78D6F0 - Samsung Electro Mechanics Ltd + C877F3 + VusionGroup - BC20A4 - Samsung Electronics Ltd + 4024D2 + Huawei Device Co., Ltd. - 08D42B - Samsung Electronics Ltd + 1C0EAF + Huawei Device Co., Ltd. - 789ED0 - Samsung Electronics Ltd + 3C7787 + Huawei Device Co., Ltd. - B0C4E7 - Samsung Electronics Ltd + 8C4E46 + Motorola Mobility LLC, a Lenovo Company - A00798 - Samsung Electronics Ltd + A8469D + Cisco Meraki - 001FCD - Samsung Electronics Ltd + 6CDEA9 + Cisco Meraki - 38ECE4 - Samsung Electronics Ltd + D424DD + AVM Audiovisuelles Marketing und Computersysteme GmbH - 945103 - Samsung Electronics Ltd + BC2EC3 + Shenzhen Tianruixiang Communication Equipment Co.,Ltd - 002490 - Samsung Electronics Ltd + 3870F2 + HUAWEI TECHNOLOGIES CO.,LTD - 0023D7 - Samsung Electronics Ltd + C4BB03 + HUAWEI TECHNOLOGIES CO.,LTD - 549B12 - Samsung Electronics Ltd + 246078 + HUAWEI TECHNOLOGIES CO.,LTD - FCA13E - Samsung Electronics Ltd + 989BCB + AVM Audiovisuelles Marketing und Computersysteme GmbH - 24C696 - Samsung Electronics Ltd + D012CB + AVM Audiovisuelles Marketing und Computersysteme GmbH - 94D771 - Samsung Electronics Ltd + 9C57BC + eero inc. - E84E84 - Samsung Electronics Ltd + 8470D7 + eero inc. - 001632 - Samsung Electronics Ltd + 787689 + eero inc. - E4E0C5 - Samsung Electronics Ltd + 28EC22 + eero inc. - C81479 - Samsung Electronics Ltd + C8C6FE + eero inc. - 1CAF05 - Samsung Electronics Ltd + 089BF1 + eero inc. - 0016DB - Samsung Electronics Ltd + 303422 + eero inc. - 001EE2 - Samsung Electronics Ltd + 605F8D + eero inc. - 20D5BF - Samsung Electronics Ltd + 6CAEF6 + eero inc. - 5CE8EB - Samsung Electronics Ltd + 7CFE90 + Mellanox Technologies, Inc. - C0BDD1 - Samsung Electro-Mechanics(Thailand) + 0002C9 + Mellanox Technologies, Inc. - B479A7 - Samsung Electro-Mechanics(Thailand) + C43306 + China Mobile Group Device Co.,Ltd. - 7C11CB - Huawei Technologies Ltd + 1869DA + China Mobile Group Device Co.,Ltd. - 1C25E1 - China Mobile IOT Company Limited + 44C874 + China Mobile Group Device Co.,Ltd. - C0F636 - Hangzhou Kuaiyue Technologies Ltd + AC5AEE + China Mobile Group Device Co.,Ltd. - 001A22 - eQ-3 Entwicklung GmbH + 50297B + China Mobile Group Device Co.,Ltd. - B0DF3A - Samsung Electronics Ltd + A861DF + China Mobile Group Device Co.,Ltd. - 805719 - Samsung Electronics Ltd + 7C6A60 + China Mobile Group Device Co.,Ltd. - 34BE00 - Samsung Electronics Ltd + 7C8C09 + Mellanox Technologies, Inc. - 54E2E0 - ARRIS Group Inc. + D89424 + Mellanox Technologies, Inc. - 347A60 - ARRIS Group Inc. + 043F72 + Mellanox Technologies, Inc. - 001CC3 - ARRIS Group Inc. + E8EBD3 + Mellanox Technologies, Inc. - 240DC2 - TCT mobile Ltd + DC7CF7 + China Mobile Group Device Co.,Ltd. - 78521A - Samsung Electronics Ltd + 2C5683 + China Mobile Group Device Co.,Ltd. - 7085C6 - ARRIS Group Inc. + 1C4176 + China Mobile Group Device Co.,Ltd. - 20BBC6 - Jabil Circuit Hungary Ltd + 94FF61 + China Mobile Group Device Co.,Ltd. - 04FEA1 - Fihonest Communication Ltd + 30292B + eero inc. - EC8CA2 - Ruckus Wireless + 3409C9 + Dongguan Huayin Electronic Technology Co., Ltd. - B80018 - Htel + 70856C + Ruijie Networks Co.,LTD - 7472B0 - Guangzhou Shiyuan Electronics Ltd + 8CE4DB + Shenzhen MiaoMing Intelligent Technology Co.,Ltd - 546C0E - Texas Instruments + 302450 + Hangzhou Huacheng Network Technology Co.,Ltd - EC8EAE - Nagravision SA + 948E6D + Nintendo Co.,Ltd - A043DB - Sitael S.p.A. + 0C2779 + New H3C Technologies Co., Ltd - E0E7BB - Nureva Inc. + 8C5823 + SZ DJI TECHNOLOGY CO.,LTD - 001087 - Xstreamis PLC + C43396 + Dongguan Hele Electronics Co., Ltd. - 00B0B3 - Xstreamis PLC + 4CD546 + Hewlett Packard Enterprise - 049FCA - Huawei Technologies Ltd + 989D40 + MIWA LOCK CO.,LTD. - 50016B - Huawei Technologies Ltd + 4CABF3 + Universal Electronics, Inc. - AC482D - Ralinwi Nanjing Electronic Technology Ltd + D49C53 + NETCRAZE LLC - 002363 - Zhuhai Raysharp Technology Ltd + B87029 + Shenzhen Ruiyuanchuangxin Technology Co.,Ltd. - 00001B - Novell Inc. + 28CE15 + Shenzhen Xinwei Intelligent Co., Ltd - 009058 - Ultra Electronics Command & Control Systems + 849459 + Hangzhou Hikvision Digital Technology Co.,Ltd. - 001CFD - Universal Electronics Inc. + 9451DC + Espressif Inc. - 080087 - Xyplex Inc. + C8088B + Arista Networks - DC1A01 - Ecoliv Technology ( Shenzhen ) Ltd + 10D9A2 + Google, Inc. - 00549F - Avaya Inc + E04934 + Calix Inc. - 2824FF - Wistron Neweb Corporation + 0094A1 + F5 Inc. - 38256B - Microsoft Mobile Oy + 000A49 + F5 Inc. - 001CEF - Primax Electronics Ltd + 14A9D0 + F5 Inc. - 000276 - Primax Electronics Ltd + 0001D7 + F5 Inc. - 4CB21C - Maxphotonics Ltd + 78CEA5 + Vital link vietnam company limited - 205EF7 - Samsung Electronics Ltd + CCBABD + TP-Link Systems Inc. - 141F78 - Samsung Electronics Ltd + B45B86 + Funshion Online Technologies Co.,Ltd - D84710 - Sichuan Changhong Electric Ltd + ACC9FF + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 001972 - Plexus (Xiamen) Ltd + 80E769 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 002347 - ProCurve Networking by HP + 94BA06 + SHENZHEN BILIAN ELECTRONIC CO.,LTD - 0024A8 - ProCurve Networking by HP + AC017A + Sichuan Tianyi Comheart Telecom Co.,LTD - C09134 - ProCurve Networking by HP + 08736F + EM Microelectronic - 001969 - Nortel Networks + 780F81 + Cisco Meraki - 0018B0 - Nortel Networks + B41F4D + Sony Interactive Entertainment Inc. - 0016CA - Nortel Networks + E89E49 + Mellanox Technologies, Inc. - 000FCD - Nortel Networks + 148F79 + Apple, Inc. - 001BBA - Nortel Networks + 104210 + Apple, Inc. - 0004DC - Nortel Networks + B80533 + Apple, Inc. - 000CF7 - Nortel Networks + 685EDD + Apple, Inc. - 00140E - Nortel Networks + F8D3F0 + Apple, Inc. - 001E1F - Nortel Networks + A02B44 + WaveGo Tech LLC - 203AEF - Sivantos GmbH + 00D626 + Mist Systems, Inc. - 005979 - Networked Energy Services + C89009 + Budderfly Inc. - 207C8F - Quanta Microsystems,Inc. + F8F7D2 + Equal Optics, LLC - 000B34 - ShangHai Broadband Technologies Ltd + 904C02 + vivo Mobile Communication Co., Ltd. - 74B57E - ZTE Corporation + 041FB8 + vivo Mobile Communication Co., Ltd. - B8BB23 - Guangdong Nufront CSC Ltd + A47B52 + JoulWatt Technology Co., Ltd - 34EA34 - HangZhou Gubei Electronics Technology Ltd + 4409C6 + HUAWEI TECHNOLOGIES CO.,LTD - 3092F6 - Shanghai Sunmon Communication Technogy Ltd + 3CC5C7 + HUAWEI TECHNOLOGIES CO.,LTD - A8AD3D - Alcatel-Lucent Shanghai Bell Ltd + 30C9CC + Samsung Electronics Co.,Ltd - 24AF4A - Alcatel-Lucent IPD + 0455B2 + Huaqin Technology Co.,Ltd - 7C2064 - Alcatel-Lucent IPD + 1CD3AF + LG Innotek - 44DC91 - Planex Communications Inc. + C826E2 + CHINA DRAGON TECHNOLOGY LIMITED - E09DB8 - Planex Communications Inc. + FC4CEA + Dell Inc. - 000F59 - Phonak AG + 3CB6E7 + Handheld Scientific, Inc. - 001478 - TP-Link Technologies Ltd + F44EB4 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 48F8E1 - Nokia + F4AB5C + Quectel Wireless Solutions Co.,Ltd. - 8C90D3 - Nokia + 80AE3C + Taicang T&W Electronics - 0028F8 - Intel Corporation + F06FCE + Ruckus Wireless - 58BC8F - Cognitive Systems Corp. + A01B9E + Samsung Electronics Co.,Ltd - D455BE - Shenzhen Fast Technologies Ltd + D87154 + Samsung Electronics Co.,Ltd - 640DCE - Shenzhen Mercury Communication Technologies Ltd + 7833C6 + Samsung Electronics Co.,Ltd - 54D272 - Nuki Home Solutions GmbH + 2CC1F4 + Nokia Solutions and Networks India Private Limited - EC26FB - Tecc Ltd + 34FD70 + Intel Corporate - 0020F4 - Spectrix Corporation + 4CBB47 + NVIDIA Corporation - 04EE91 - x-fabric GmbH + B07C8E + Brother Industries, LTD. - B47443 - Samsung Electronics Ltd + F07A55 + zte corporation - FCF647 - Fiberhome Telecommunication Technologies Ltd + D46195 + zte corporation - 18686A - ZTE Corporation + E0D55D + Intel Corporate - C44BD1 - Wallys Communications Teachnologies Ltd + E44AE0 + Intel Corporate - 6CB9C5 - Delta Networks Inc. + A08527 + Intel Corporate - 30766F - LG Electronics (Mobile Communications) + 90F005 + Xi'an Molead Technology Co., Ltd - A8922C - LG Electronics (Mobile Communications) + A01BD6 + Nautitech Mining Systems Pty. Ltd. - F80CF3 - LG Electronics (Mobile Communications) + 6073C8 + Voyetra Turtle Beach, Inc. - C49A02 - LG Electronics (Mobile Communications) + 5CE1A4 + Pleneo - 001F6B - LG Electronics (Mobile Communications) + FCE498 + IEEE Registration Authority - 0026E2 - LG Electronics (Mobile Communications) + 24B5B9 + Motorola Mobility LLC, a Lenovo Company - DC4427 - IEEE Registration Authority + E467DD + ELA INNOVATION - BC3400 - IEEE Registration Authority + FC9D05 + Micro-Star INTL CO., LTD. - E8886C - Shenzhen SC Technologies Ltd + 002B90 + Zelus(Shenzhen) Technology Ltd. - 0024FF - QLogic Corporation + ECBB78 + Cisco Systems, Inc - 001E21 - Qisda Corporation + 68D972 + Cisco Systems, Inc - 00039D - Qisda Corporation + 549B24 + Mellanox Technologies, Inc. - 00080D - Toshiba + 506245 + Annapurna labs - 000E7B - Toshiba + BC2106 + Adtran Inc - 0003B2 - Radware + 242D4B + F5 Inc. - 00A0C6 - Qualcomm Inc. + 38B9AF + NXP Semiconductors Taiwan Ltd. - 649C81 - Qualcomm Inc. + 389201 + Tianyi Telecom Terminals Company Limited - 001A6A - Tranzas Inc. + D81F65 + Private - A47174 - Huawei Technologies Ltd + D4532A + Beijing Xiaomi Mobile Software Co., Ltd - F4CB52 - Huawei Technologies Ltd + 987EB5 + Huawei Device Co., Ltd. - B808D7 - Huawei Technologies Ltd + 68951B + Huawei Device Co., Ltd. - 94611E - Wata Electronics Ltd + 78C884 + Huawei Device Co., Ltd. - 00C0E4 - Siemens Building + 189578 + DENSO CORPORATION - 000D10 - Embedtronics Oy + F8D554 + GD Midea Air-Conditioning Equipment Co.,Ltd. - 001FA8 - Smart Energy Instruments Inc. + 9C5766 + HUAWEI TECHNOLOGIES CO.,LTD - 000FDB - Westell Technologies Inc. + 5C0B3B + HUAWEI TECHNOLOGIES CO.,LTD - 3C0771 - Sony Corporation + 74B3EA + EK INC. - 80414E - BBK Educational Electronics Corp Ltd + 14D725 + Barrot Technology Co.,Ltd. - 249442 - Open Road Solutions Inc. + 4C820C + Apple, Inc. - C46413 - Cisco Systems Inc. + 10A1DA + Apple, Inc. - 0010CA - Telco Systems Inc. + 54B8DB + Apple, Inc. - 00E09E - Quantum Corporation + 749533 + Westala Technologies Inc. - 206A8A - Wistron Infocomm (Zhongshan) Corporation + F0578D + JetHome LLC - 784476 - Zioncom Electronics (Shenzhen) Ltd + 0050CA + Zhone Technologies, Inc. - 001165 - ZNYX Networks Inc. + 94974F + Liteon Technology Corporation - 000A68 - Solarflare Communications Inc. + 28255F + HUMAX NETWORKS - 002186 - Universal Global Scientific Industrial Ltd + 3C7895 + TP-Link Systems Inc. - 183919 - Unicoi Systems + E0DEF2 + Texas Instruments - E8E0B7 - Toshiba + 448DD5 + Cisco Systems, Inc - 680715 - Intel Corporation + 200A87 + Guangzhou On-Bright Electronics Co., Ltd. - 3CB6B7 - Vivo Mobile Communication Ltd + 38C6CE + Nintendo Co.,Ltd - C42795 - Technicolor CH USA Inc. + F4063C + Texas Instruments - A020A6 - Espressif Inc. + 8C91A4 + Apple, Inc. - 58528A - Mitsubishi Electric Corporation + 181628 + SharkNinja Operating LLC - C4F1D1 - Beijing Sogou Technology Development Ltd + 4CC5D9 + Dell Inc. - 2C36A0 - Capisco Limited + 98E081 + Beijing Xiaomi Mobile Software Co., Ltd - B0B2DC - ZyXEL Communications Corp + 04AE47 + Beijing Xiaomi Mobile Software Co., Ltd - CC5D4E - ZyXEL Communications Corp + CCE4D1 + Arista Networks - 404A03 - ZyXEL Communications Corp + E87EEF + Xiaomi Communications Co Ltd - C86C87 - ZyXEL Communications Corp + 882F92 + Xiaomi Communications Co Ltd - 001EC0 - Microchip Technology Inc. + F4D7E4 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 38BC1A - MEIZU Technology Ltd + 0C9AE6 + SZ DJI TECHNOLOGY CO.,LTD - 802994 - Technicolor CH USA Inc. + BC09B9 + Hui Zhou Gaoshengda Technology Co.,LTD - E0885D - Technicolor CH USA Inc. + FC8B1F + GUTOR Electronic - 340AFF - Qingdao Hisense Communications Ltd + 307A05 + HUAWEI TECHNOLOGIES CO.,LTD - 587E61 - Qingdao Hisense Communications Ltd + 74FC77 + HUAWEI TECHNOLOGIES CO.,LTD - C0A1A2 - MarqMetrix + 2896B0 + HUAWEI TECHNOLOGIES CO.,LTD - 08D0B7 - Qingdao Hisense Communications Ltd + F4B0FF + Shanghai Baud Data Communication Co.,Ltd. - ECD68A - Shenzhen JMicron Intelligent Technology Developmen + C0408D + ALPSALPINE CO,.LTD - 5052D2 - Hangzhou Telin Technologies Ltd + 04C8B0 + Google, Inc. - 90EED9 - Universal de Desarrollos Electronicos, SA + D86DD0 + InnoCare Optoelectronics - 606453 - AOD Ltd + C4D4D0 + SHENZHEN TECNO TECHNOLOGY - 009E1E - Cisco Systems Inc. + 24FAD4 + ShenZhen More Star Technology Co.,LTD - 00253E - Sensus Metering Systems + 64F2FB + Hangzhou Ezviz Software Co.,Ltd. - C8AFE3 - Hefei Radio Communication Technology Ltd + 94EC13 + Hangzhou Ezviz Software Co.,Ltd. - 7C574E - CoBI GmbH + 102B1C + Motorola Mobility LLC, a Lenovo Company - 28F10E - Dell Inc. + DCD83B + Cisco Systems, Inc - 045604 - Gionee Communication Equipment Ltd + 90FEE2 + ISIF - 34C0F9 - Rockwell Automation + EC4684 + Microsoft Corporation - 00FEC8 - Cisco Systems Inc. + D4A7EA + Solar76 - 2C5A8D - SysTRONIK Elektronik u. Systemtechnik GmbH + 6C4329 + COSMIQ EDUSNAP PRIVATE LIMITED - 10BEF5 - D-Link International + 68E6D4 + FURUNO SYSTEMS CO.,LTD. - E47B3F - Beijing Co-Cloud Technology Ltd + C86C9A + SNUC System - 0C8A87 - AgLogica Holdings Inc. + 000E72 + Sesami Technologies Srl - 54EDA3 - Navdy Inc. + 4439AA + G.Tech Technology Ltd. - 34A2A2 - Huawei Technologies Ltd + 582745 + Angelbird Technologies GmbH - 749D8F - Huawei Technologies Ltd + 982CC6 + SERNET (SUZHOU) TECHNOLOGIES CORPORATION - 945907 - Shanghai HITE-BELDEN Network Technology Ltd + 30F65D + Hewlett Packard Enterprise - 0016FB - Shenzhen MTC Ltd + F03E05 + Murata Manufacturing Co., Ltd. - A0415E - Opsens Solution Inc. + B0A604 + Espressif Inc. - A860B6 - Apple + C02EDF + AltoBeam Inc. - C4B301 - Apple + 703E76 + Arcadyan Corporation - E05F45 - Apple + F45C42 + Huawei Device Co., Ltd. - 74CC39 - Fiberhome Telecommunication Technologies Ltd + 3C240A + Huawei Device Co., Ltd. - 3822D6 - Hangzhou H3C Technologies Ltd + E4AEE4 + Tuya Smart Inc. - 94E8C5 - ARRIS Group Inc. + 0CEB25 + Power Plus Communications AG - 6C3B6B - Routerboard.com + 804863 + Electralsys Networks - 0022E7 - WPS Parking Systems + 7CCF4E + FINE TRIUMPH TECHNOLOGY CORP.,LTD. - 4851B7 - Intel Corporation + 70F395 + Universal Global Scientific Industrial., Ltd - B8E779 - 9Solutions Oy + E02A82 + Universal Global Scientific Industrial., Ltd - C864C7 - ZTE Corporation + 3CE1A1 + Universal Global Scientific Industrial., Ltd - 483B38 - Apple + 8C3B4A + Universal Global Scientific Industrial., Ltd - 1C9148 - Apple + 8C1952 + Amazon Technologies Inc. - 905F2E - TCT mobile Ltd + 0472EF + Apple, Inc. - F823B2 - Huawei Technologies Ltd + D4FF1A + Apple, Inc. - 341290 - Treeview Ltd + 107DC8 + Apple, Inc. - 7CFE4E - Shenzhen Safe vision Technology Ltd + C45BAC + Apple, Inc. - 644FB0 - Hyunjin.com + F4B599 + Apple, Inc. - 00E0E6 - IncAA Computers + A0F7C3 + Ficosa Automotive SLU - 28F366 - Shenzhen Bilian electronic Ltd + B8FBB3 + TP-Link Systems Inc. - E0A3AC - Huawei Technologies Ltd + 5093CE + HUAWEI TECHNOLOGIES CO.,LTD - BC7574 - Huawei Technologies Ltd + 683045 + HUAWEI TECHNOLOGIES CO.,LTD - 20A680 - Huawei Technologies Ltd + 246D10 + Apple, Inc. - 8828B3 - Huawei Technologies Ltd + 20463A + Apple, Inc. - A4E597 - Gessler GmbH + 10E8A7 + WNC Corporation - 006CBC - Cisco Systems Inc. + AC919B + WNC Corporation - 5C70A3 - LG Electronics (Mobile Communications) + 8C53E6 + WNC Corporation - 001D08 - Jiangsu Yinhe Electronics Ltd + DC4BA1 + WNC Corporation - 001D82 - GN Netcom A/S + 2441FE + WNC Corporation - 001317 - GN Netcom A/S + B00073 + WNC Corporation - 00A0A4 - Oracle Corporation + 984914 + WNC Corporation - 749781 - ZTE Corporation + 3041DB + vivo Mobile Communication Co., Ltd. - 0001F4 - Enterasys + A854B2 + WNC Corporation - 00109B - Emulex Corporation + 90A4DE + WNC Corporation - 00142A - Elitegroup Computer Systems Ltd + 746FF7 + WNC Corporation - 00115B - Elitegroup Computer Systems Ltd + 2C658D + Cisco Systems, Inc - C03FD5 - Elitegroup Computer Systems Ltd + 94AA07 + Nokia - ECA86B - Elitegroup Computer Systems Ltd + 68A34F + Nokia - C89CDC - Elitegroup Computer Systems Ltd + 10EDC8 + NXP Semiconductors Taiwan Ltd. - 002511 - Elitegroup Computer Systems Ltd + 20CBCC + GridVisibility, inc. - 4487FC - Elitegroup Computer Systems Ltd + F49AB1 + Hewlett Packard Enterprise - A86BAD - Hon Hai Precision Ind Ltd + FC9E53 + Intel Corporate - D80F99 - Hon Hai Precision Ind Ltd + D494A9 + Intel Corporate - B4B15A - Siemens AG Energy Management Division + 84083A + Intel Corporate - 002465 - Elentec + EC79C0 + zte corporation - 00089F - EFM Networks + 6C11BA + zte corporation - 0050FC - Edimax Technology Ltd + 1016B1 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 9CDF03 - Harman/Becker Automotive Systems GmbH + E46566 + Maple IoT Solutions LLC - 001188 - Enterasys + 80B269 + Subtle Computing - 0016FA - ECI Telecom Ltd + 400877 + Xiaomi Communications Co Ltd - F8A188 - LED Roadway Lighting + 08B339 + Xiaomi Communications Co Ltd - A082AC - Linear DMS Solutions Sdn. Bhd. + B85384 + Xiaomi Communications Co Ltd - A86AC1 - HanbitEDS Ltd + CC2DD2 + Ruckus Wireless - D463FE - Arcadyan Corporation + B0D7DE + Hangzhou Linovision Co., Ltd. - 689361 - Integrated Device Technology (Malaysia) Sdn. Bhd. + 9842AB + GN Hearing A/S - BC15AC - Vodafone Italia S.p.A. + 5C33B1 + EM Microelectronic - 00BD82 - Shenzhen YOUHUA Technology Ltd + E0FA5B + Arista Networks - 94513D - iSmart Alarm Inc. + 743336 + IEEE Registration Authority - 001174 - Mojo Networks Inc. + 9CCD42 + Dongguan Liesheng Electronic Co., Ltd. - 001954 - Leaf Corporation. + 903196 + SHENZHEN IP-COM NETWORKS CO.,LTD. - 9466E7 - WOM Engineering + 18ACC2 + TCL King Electrical Appliances(Huizhou)Co.,Ltd - 4CB8B5 - Shenzhen YOUHUA Technology Ltd + 00BC99 + Hangzhou Hikvision Digital Technology Co.,Ltd. - 7085C2 - ASRock Incorporation + 4C3C8F + Shenzhen Jingxun Technology Co., Ltd. - EC93ED - DDoS-Guard Ltd + BCD767 + BAE Systems - 30FC68 - TP-Link Technologies Ltd + 04C5CD + Mellanox Technologies, Inc. - 008A96 - Cisco Systems Inc. + 0015EA + Hensoldt South Africa (Pty) Ltd - BC60A7 - Sony Interactive Entertainment Inc. + F81037 + ENTOUCH Controls - 808C97 - Kaonmedia Ltd + 202BDA + IEEE Registration Authority - DCEE06 - Huawei Technologies Ltd + 100C6B + NETGEAR - 0452C7 - Bose Corporation + 3894ED + NETGEAR - F02745 - F-Secure Corporation + 9CC9EB + NETGEAR - 54D0B4 - Xiamen Four-Faith Communication Technology Ltd + 44FB76 + vivo Mobile Communication Co., Ltd. - 00137C - Kaicom Ltd + B07FB9 + NETGEAR - E85659 - Advanced-Connectek Inc. + 78D294 + NETGEAR - 34BF90 - Fiberhome Telecommunication Technologies Ltd + C43DC7 + NETGEAR - CCB3F8 - Fujitsu Isotec Limited + 4C60DE + NETGEAR - E4A471 - Intel Corporation + 08BD43 + NETGEAR - 10F005 - Intel Corporation + A09A0C + Honor Device Co., Ltd. - 64CC2E - Xiaomi Communications Ltd + C05724 + Honor Device Co., Ltd. - 8801F2 - Vitec System Engineering Inc. + 28EA5B + SAMSARA NETWORKS INC - 14D11F - Huawei Technologies Ltd + 449BC6 + EOSS s.r.l. - DC094C - Huawei Technologies Ltd + 808F97 + Xiaomi Communications Co Ltd - 1C6758 - Huawei Technologies Ltd + 4CE20F + Xiaomi Communications Co Ltd - 24BCF8 - Huawei Technologies Ltd + C4CD50 + Shenzhen C-Data Technology Co., Ltd. - A0043E - Parker Hannifin Manufacturing Germany GmbH & Co. KG + 9C9726 + Vantiva Technologies Belgium - C84529 - IMK Networks Ltd + 30918F + Vantiva Technologies Belgium - 7C477C - IEEE Registration Authority + E0B9E5 + Vantiva Technologies Belgium - F877B8 - Samsung Electronics Ltd + AC8AC7 + HUAWEI TECHNOLOGIES CO.,LTD - F0D2F1 - Amazon Technologies Inc. + 18B657 + HUAWEI TECHNOLOGIES CO.,LTD - A8E3EE - Sony Interactive Entertainment Inc. + 24DB94 + Juniper Networks - 00248D - Sony Interactive Entertainment Inc. + 8013BE + Juniper Networks - 00041F - Sony Interactive Entertainment Inc. + A0552E + zte corporation - 20A90E - TCT mobile Ltd + 54AEBC + CHINA DRAGON TECHNOLOGY LIMITED - EC438B - Yaptv + 5CF53A + Zhongge Smart Technology(Shanghai) Co., Ltd - 980CA5 - Motorola (Wuhan) Mobility Technologies Communication Ltd + 144CFF + Grandstream Networks, Inc. - 441102 - EDMI Europe Ltd + ECE9D2 + Apple, Inc. - A85EE4 - 12Sided Technology LLC + 48E1CA + Apple, Inc. - 182195 - Samsung Electronics Ltd + C8806D + Apple, Inc. - 44783E - Samsung Electronics Ltd + DC045A + Nanjing Qinheng Microelectronics Co., Ltd. - 0CA2F4 - Chameleon Technology (UK) Limited + 8C7779 + Arcadyan Corporation - BC44B0 - Elastifile + 04C9DE + Qingdao HaierTechnology Co.,Ltd - 74BFB7 - Nusoft Corporation + 24F2DD + Radiant Vision Systems, LLC - 50DA00 - Hangzhou H3C Technologies Ltd + 98CF7D + Apple, Inc. - F4ED5F - Shenzhen KTC Technology Group + 742959 + Apple, Inc. - 00E0E4 - FANUC ROBOTICS NORTH AMERICA Inc. + E86E3E + Sichuan Tianyi Comheart Telecom Co.,LTD - 000896 - Printronix Inc. + D8D7F3 + New H3C Technologies Co., Ltd - 245EBE - QNAP Systems Inc. + 442538 + WNC Corporation - 0404EA - Valens Semiconductor Ltd + 1CCF82 + Palo Alto Networks - 800DD7 - Latticework Inc. + 80B82A + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - D0B53D - Sepro Robotique + 185CA1 + Jiangxi Risound Electronics Co.,LTD - 00D0EC - NAKAYO Inc + 3C2AB3 + Telesystem communications Pte Ltd - 4CCC6A - Micro-Star INTL Ltd + 9C04B6 + Quectel Wireless Solutions Co.,Ltd. - 30636B - Apple + 3455E5 + SJIT Co., Ltd. - 70884D - Japan Radio Ltd + 4CD7C8 + Guangzhou V-Solution Telecommunication Technology Co.,Ltd. - A4F1E8 - Apple + BCAA82 + Fiberhome Telecommunication Technologies Co.,LTD - 546751 - Compal Broadband Networks Inc. + 44938D + Innolux Corporation - 240B0A - Palo Alto Networks + C8CC21 + eero inc. - D099D5 - Alcatel-Lucent + B8F4A4 + Google, Inc. - 14C3C2 - K.A. Schmersal GmbH & Co. KG + E01ADF + Google, Inc. - 10785B - Actiontec Electronics Inc. + 703A8C + Shenzhen Skyworth Digital Technology CO., Ltd - DC0077 - TP-Link Technologies Ltd + 186C60 + Jifeline Networks B.V. - F4F5A5 - Nokia Corporation + D098B1 + GScoolink Microelectronics (Beijing) Co.,LTD - EC9B5B - Nokia Corporation + 04EECD + Hangzhou Hikvision Digital Technology Co.,Ltd. - 2CCC15 - Nokia Corporation + 64BC43 + HUAWEI TECHNOLOGIES CO.,LTD - 14BB6E - Samsung Electronics Ltd + C89143 + Nintendo Co.,Ltd - 1886AC - Nokia Danmark A/S + C8AFF0 + CDVI Wireless SpA - 001F5C - Nokia Danmark A/S + 08711C + Cisco Meraki - 001F00 - Nokia Danmark A/S + 440FB4 + GSD VIET NAM TECHNOLOGY COMPANY LIMITED - 002547 - Nokia Danmark A/S + E4FAE4 + Shenzhen SDMC Technology CP,.LTD - 0018C5 - Nokia Danmark A/S + 704EE0 + Samsung Electronics Co.,Ltd - 00164E - Nokia Danmark A/S + 885E54 + Samsung Electronics Co.,Ltd - 002668 - Nokia Danmark A/S + 8CA3EC + Samsung Electronics Co.,Ltd - 00247D - Nokia Danmark A/S + 5C3AA2 + Silicon Laboratories - 002265 - Nokia Danmark A/S + CCAFE3 + Amazon Technologies Inc. - F88096 - Elsys Equipamentos Eletronicos Ltda + 14C19F + Espressif Inc. - A811FC - ARRIS Group Inc. + AC3AE2 + NVIDIA Corporation - 001DAA - DrayTek Corp. + 70AD43 + Blink by Amazon - E498D1 - Microsoft Mobile Oy + D400CA + AUMOVIO Systems Romania S.R.L. - 6C2779 - Microsoft Mobile Oy + 408556 + AUMOVIO Technologies Romania S.R.L. - 00CF1C - Communication Machinery Corporation + 8C5F48 + AUMOVIO Systems, Inc. - 28CC01 - Samsung Electronics Ltd + 24085D + AUMOVIO Aftermarket GmbH - D8FB5E - Askey Computer Corp + D494FB + AUMOVIO Systems, Inc. - 002326 - Fujitsu Limited + B81E61 + TELLESCOM INDUSTRIA E COMERCIO EM TELECOMUNICACAO - 0CBF15 - Genetec Inc. + 406E0F + SKYASTAR TECHNOLOGLES(ZHUHAI) LTD - 000D4B - Roku Inc. + ECB50A + Quectel Wireless Solutions Co.,Ltd. - 0040FB - Cascade Communications + 38E054 + Security Design, Inc. - D0542D - Cambridge Industries(Group) Ltd + 447CAC + Invictus-AV - 744AA4 - ZTE Corporation + 6CD552 + SHENZHEN BILIAN ELECTRONIC CO.,LTD - 001BA9 - Brother Industries Ltd + 442063 + AUMOVIO Germany GmbH - 30A220 - ARG Telecom + E41E33 + AUMOVIO Germany GmbH - 6CF373 - Samsung Electronics Ltd + 0002DC + GENERAL Inc. - 9C3AAF - Samsung Electronics Ltd + C4B16B + Advantech Czech - 781FDB - Samsung Electronics Ltd + B4ABF3 + IEEE Registration Authority - 4CA56D - Samsung Electronics Ltd + A4AB39 + Shenzhen Taichi Technology Limited - B86CE8 - Samsung Electronics Ltd + 6CF43D + VusionGroup - 0CB319 - Samsung Electronics Ltd + D02C39 + Cisco Systems, Inc - 183F47 - Samsung Electronics Ltd + 487696 + Huaan Zhongyun Co., Ltd. - B46293 - Samsung Electronics Ltd + 642F1C + HUAWEI TECHNOLOGIES CO.,LTD - 50A4C8 - Samsung Electronics Ltd + 186945 + TP-Link Systems Inc. - 00001D - Cabletron Systems Inc. + 80BF21 + vivo Mobile Communication Co., Ltd. - 1867B0 - Samsung Electronics Ltd + 5CFFA9 + zte corporation - 6C8336 - Samsung Electronics Ltd + D0B324 + Apple, Inc. - DCD87C - Beijing Jingdong Century Trading Ltd + 1CFF3F + Cust2mate - C4DA7D - Ivium Technologies B.V. + 7483A0 + Shenzhen MiaoMing Intelligent Technology Co.,Ltd - 000B6A - Asiarock Technology Limited + 6025ED + Hewlett Packard Enterprise - 009096 - Askey Computer Corp + 204B2E + Pizzato Elettrica S.r.l. - 001B9E - Askey Computer Corp + 50617E + Shenzhen MiaoMing Intelligent Technology Co.,Ltd - E0CA94 - Askey Computer Corp + 4C0997 + Arista Networks - 0026B6 - Askey Computer Corp + 0464FA + Dell Inc. - 002557 - BlackBerry RTS + 6878A8 + Fiberhome Telecommunication Technologies Co.,LTD - 001CCC - BlackBerry RTS + ACD20C + Chengdu SingCore Technology Co.,Ltd. - 00300A - Aztech Electronics Pte Ltd + 10D8CC + Guangzhou FiiO Electronics Technology CO., LTD - 001F3F - AVM GmbH + 002104 + Gigaset Technologies GmbH - 246511 - AVM GmbH + 8C37B7 + Hosin Global Electronics Co.,Ltd - C0FFD4 - Netgear + F06D93 + EM Microelectronic - 6CB0CE - Netgear + 0CC98A + Intel Corporate - 008EF2 - Netgear + ECF33C + Intel Corporate - 9CD36D - Netgear + 40ECBD + Intel Corporate - C40415 - Netgear + 6C1041 + Shenzhen Skyworth Digital Technology CO., Ltd - E8FCAF - Netgear + 900A75 + New H3C Technologies Co., Ltd - 841B5E - Netgear + 98045F + Huawei Device Co., Ltd. - 2CB05D - Netgear + 8C8C29 + Espressif Inc. - A021B7 - Netgear + E406E0 + HUAWEI TECHNOLOGIES CO.,LTD - 0024B2 - Netgear + A459BF + Silicon Laboratories - 001B2F - Netgear + DCB43F + eero inc. - 00264D - Arcadyan Technology Corporation + 14907A + Beijing Xiaomi Mobile Software Co., Ltd - 849CA6 - Arcadyan Technology Corporation + 9C9774 + HUAWEI TECHNOLOGIES CO.,LTD - E03E44 - Broadcom + C05BBD + HUAWEI TECHNOLOGIES CO.,LTD - 001F33 - Netgear + 440C4B + HUAWEI TECHNOLOGIES CO.,LTD - 002040 - ARRIS Group Inc. + 4C4B1F + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 386BBB - ARRIS Group Inc. + 8800C6 + Sichuan Tianyi Comheart Telecom Co.,LTD - E86D52 - ARRIS Group Inc. + 448346 + Texas Instruments - 3C754A - ARRIS Group Inc. + 787871 + Texas Instruments - E48399 - ARRIS Group Inc. + DCDEE3 + Texas Instruments - 002143 - ARRIS Group Inc. + 0CCDD0 + CHINA DRAGON TECHNOLOGY LIMITED - 74F612 - ARRIS Group Inc. + 94AEE3 + Belden Hirschmann industries (Suzhou) Limited - 002495 - ARRIS Group Inc. + 94105A + Dell Inc. - 0024A0 - ARRIS Group Inc. + 7CCF0F + LCFC(Hefei) Electronics Technology co., ltd - 00080E - ARRIS Group Inc. + A40853 + Nokia Solutions and Networks India Private Limited - 00909C - ARRIS Group Inc. + 24C013 + zte corporation - 001225 - ARRIS Group Inc. + E09D1E + zte corporation - 145BD1 - ARRIS Group Inc. + A02605 + Belden Hirschmann industries (Suzhou) Limited - 6CC1D2 - ARRIS Group Inc. + E4729D + Nokia Shanghai Bell Co., Ltd. - 1C1448 - ARRIS Group Inc. + F88475 + i5LED, LLC - 001784 - ARRIS Group Inc. + C02FCD + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 001C11 - ARRIS Group Inc. + 04DBD9 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 001E46 - ARRIS Group Inc. + 54014A + Guangzhou Shiyuan Electronic Technology Company Limited - 0018A4 - ARRIS Group Inc. + FC8FA4 + NXP Semiconductors Taiwan Ltd. - 0018C0 - ARRIS Group Inc. + A46177 + AMOSENSE - 002374 - ARRIS Group Inc. + 58DF70 + Private - ACE010 - Liteon Technology Corporation + 50EE9B + AltoBeam Inc. - 747548 - Amazon Technologies Inc. + 90DF06 + Ciena Corporation - 0000B1 - Alpha Micro + 449F79 + onsemi - 001802 - Alpha Networks Inc. + 2CDEF5 + TVS REGZA Corporation - 78843C - Sony Corporation + EC73F6 + Sichuan AI-Link Technology Co., Ltd. - 0013A9 - Sony Corporation + 002689 + General Dynamics Land Systems Inc. - FC0FE6 - Sony Interactive Entertainment Inc. + 0C6F8B + Apple, Inc. - 74DE2B - Liteon Technology Corporation + 50EE87 + HPRO - 00225F - Liteon Technology Corporation + 10C197 + Xiaomi Communications Co Ltd - 5C93A2 - Liteon Technology Corporation + 3CB922 + HUAWEI TECHNOLOGIES CO.,LTD - 24FD52 - Liteon Technology Corporation + AC45B0 + Shenzhen Jidao Technology Co Ltd - 2CD05A - Liteon Technology Corporation + 7070D5 + HUAWEI TECHNOLOGIES CO.,LTD - 74E543 - Liteon Technology Corporation + 605355 + HUAWEI TECHNOLOGIES CO.,LTD - 0015CF - ARRIS Group Inc. + B02B64 + Cisco Systems, Inc - 6CFAA7 - AMPAK Technology Inc. + 10E676 + Cisco Systems, Inc - 54E4BD - FN-Link Technology Limited + FC500C + Sitehop Ltd - 5414FD - Orbbec 3D Technology International + D49FF9 + Earda Technologies co Ltd - 900BC1 - Sprocomm Technologies Ltd + C8C873 + CHIPSEN INC. - 001CA8 - AirTies Wireless Networks + 900E84 + eero inc. - 485D60 - Azurewave Technologies Inc. + F4C6D7 + blackned GmbH - DC85DE - Azurewave Technologies Inc. + 38A3E0 + 1Finity Inc - B0EE45 - Azurewave Technologies Inc. + E0D38E + Chipsea Technologies (Shenzhen) Crop. - 00238E - ADB Broadband Italia + CCC837 + Quectel Wireless Solutions Co.,Ltd. - 001D8B - ADB Broadband Italia + D44A85 + Silicon Laboratories - 0013C8 - ADB Broadband Italia + A8D3F7 + Arcadyan Corporation - DC0B1A - ADB Broadband Italia + 983B8A + Sekisui Jushi CAP-AI System Co.,Ltd. - 0C6AE6 - Stanley Security Solutions + D096EA + vivo Mobile Communication Co., Ltd. - 842615 - ADB Broadband Italia + 780A57 + Shanghai Lightningsemi Technology Co.,Ltd. - F0842F - ADB Broadband Italia + 689E67 + SHENZHEN FOCUSCOM TECHNOLOGIES CO., LTD - 54271E - Azurewave Technologies Inc. + 74136A + Motorola Mobility LLC, a Lenovo Company - 28C2DD - Azurewave Technologies Inc. + 609578 + Samsung Electronics Co.,Ltd - 80A589 - Azurewave Technologies Inc. + B83865 + Hewlett Packard Enterprise - C40938 - Fujian Star-NET Communication Ltd + 08D01E + Juniper Networks - 001C50 - TCL Technoly Electronics (Huizhou) Ltd + 301577 + Zyxel Communications Corporation - 00AA02 - Intel Corporation + 505E3A + GD Midea Air-Conditioning Equipment Co.,Ltd. - ACE5F0 - Doppler Labs + 8C5387 + Huzhou Luxshare Precision Industry Co.LTD - F48E38 - Dell Inc. + 54138F + GEOIDE Crypto&Com - 74C63B - Azurewave Technologies Inc. + 9006DB + HUAWEI TECHNOLOGIES CO.,LTD - 7C7A91 - Intel Corporation + 787826 + HUAWEI TECHNOLOGIES CO.,LTD - AC7BA1 - Intel Corporation + 5C6117 + HUAWEI TECHNOLOGIES CO.,LTD - 6C2995 - Intel Corporation + 348A3B + Huawei Device Co., Ltd. - 984FEE - Intel Corporation + 20E525 + Huawei Device Co., Ltd. - E82AEA - Intel Corporation + F8BA98 + HUAQIN TECHNOLOGY CO., LTD - 605718 - Intel Corporation + AC5322 + Samsung Electronics Co.,Ltd - C4D987 - Intel Corporation + 88C344 + Google, Inc. - FCF8AE - Intel Corporation + B0435D + MechoShade - 6036DD - Intel Corporation + ACADEF + Wanan Hongsheng Electronic Co.Ltd - 100BA9 - Intel Corporation + D42BF0 + Tiinlab Corporation - 8C705A - Intel Corporation + 84EB0C + Mellanox Technologies, Inc. - 606720 - Intel Corporation + 5414E9 + AltoBeam Inc. - 7C5CF8 - Intel Corporation + F4F91E + INGRAM MICRO SERVICES - B4E1C4 - Microsoft Mobile Oy + D860C5 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - E0757D - Motorola Mobility LLC, a Lenovo Company + 5CF92B + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 34BB26 + 1438FA Motorola Mobility LLC, a Lenovo Company - 806C1B - Motorola Mobility LLC, a Lenovo Company + F040EC + LOOPDESIGNLAB PTE. LTD - 0016EB - Intel Corporation + 9C9D07 + FN-LINK TECHNOLOGY Ltd. - 0018DE - Intel Corporation + D8BF42 + Intel Corporate - 5CE0C5 - Intel Corporation + 7CA85D + RONGCHEENG GOER TECHNOLOGY CO.,LTD. - 58A839 - Intel Corporation + C8412E + AM Telecom co., Ltd. - 001E67 - Intel Corporation + 4C548B + Cerebras System Inc. - 0022FA - Intel Corporation + 80A63C + Amazon Technologies Inc. - 001500 - Intel Corporation + A40F25 + eero inc. - A088B4 - Intel Corporation + 7831C4 + Panascais ehf. - 648099 - Intel Corporation + 4C6CA1 + Chipsea Technologies (Shenzhen) Crop. - D07E35 - Intel Corporation + 90848E + FUJIAN STAR-NET COMMUNICATION CO.,LTD - 001E65 - Intel Corporation + 8C1801 + zte corporation - 348446 - Ericsson AB + D0845D + B&C Transit, Inc. - 044E06 - Ericsson AB + 40ED7B + Zscaler - 00270E - Intel Corporation + 5CB2DF + Shenzhen Powerleader Storage Technology Co., Ltd. - 0026B9 - Dell Inc. + 444520 + EM Microelectronic - 64006A - Dell Inc. + 88DB08 + EM Microelectronic - 00D09E - 2Wire Inc. + FCFD71 + AltoBeam Inc. - 0019E4 - 2Wire Inc. + 382CDB + Arista Networks - 001AC4 - 2Wire Inc. + BC932A + Silicon Laboratories - 001B5B - 2Wire Inc. + ACA899 + Texas Instruments - 3CEA4F - 2Wire Inc. + 384E56 + Texas Instruments - DC7FA4 - 2Wire Inc. + B8DA5E + Texas Instruments - B0D5CC + F0B163 Texas Instruments - 3829DD - ONvocal Inc + B4DF09 + FLUX:: - 001EC7 - 2Wire Inc. + 5C51DF + eero inc. - 002650 - 2Wire Inc. + 5C63B0 + Fortinet, Inc. - 002351 - 2Wire Inc. + 88F3D5 + Zyxel Communications Corporation - 001E4F - Dell Inc. + A01B04 + Hefei Huanxin Microelectronics Technology Co., Ltd. - 5C260A - Dell Inc. + 74A981 + HUAWEI TECHNOLOGIES CO.,LTD - 7845C4 - Dell Inc. + 40A654 + HUAWEI TECHNOLOGIES CO.,LTD - C81F66 - Dell Inc. + 90BA09 + HUAWEI TECHNOLOGIES CO.,LTD - 0015C5 - Dell Inc. + E8EA34 + HUAWEI TECHNOLOGIES CO.,LTD - 001422 - Dell Inc. + 7834B4 + HUAWEI TECHNOLOGIES CO.,LTD - 109836 - Dell Inc. + A0C6A5 + Lierda Science & Technology Group Co., Ltd - 800A80 - IEEE Registration Authority + 20A366 + vivo Mobile Communication Co., Ltd. - F8DB88 - Dell Inc. + 68FDE8 + Ruckus Wireless - 3CA348 - Vivo Mobile Communication Ltd + 7C0C5F + Espressif Inc. - E45AA2 - Vivo Mobile Communication Ltd + 7CE8B1 + Espressif Inc. - CC3B3E - Lester Electrical + FC597A + Zebra Technologies Inc. - 2082C0 - Xiaomi Communications Ltd + F400A2 + Samsung Electronics Co.,Ltd - DC6DCD - Guangdong Oppo Mobile Telecommunications Corp Ltd + 3C2983 + Samsung Electronics Co.,Ltd - C4282D - Embedded Intellect Pty Ltd + 1C42C2 + Huawei Device Co., Ltd. - 5846E1 - Baxter International Inc + F401CC + Silicon Laboratories - 00173F - Belkin International Inc. + D0D4FB + Home Control Singapore Pte Ltd - 001CDF - Belkin International Inc. + 48EAA9 + ShenZhen C&D Electronics CO.Ltd. - C05627 - Belkin International Inc. + 50DE92 + shenzhen worldelite electronics co., LTD - 4C17EB - Sagemcom Broadband SAS + 34F084 + Samsung Electronics Co.,Ltd - CC33BB - Sagemcom Broadband SAS + FC6E83 + Samsung Electronics Co.,Ltd - D86CE9 - Sagemcom Broadband SAS + BCBF2E + ASUSTek COMPUTER INC. - E8F1B0 - Sagemcom Broadband SAS + F8C9D6 + IEEE Registration Authority - 5C6B32 - Texas Instruments + 0C393D + eero inc. - 84DD20 - Texas Instruments + B0BBE5 + Sagemcom Broadband SAS - 001831 - Texas Instruments + E8D2FF + Sagemcom Broadband SAS - 24FD5B - SmartThings Inc. + 984265 + Sagemcom Broadband SAS - 2876CD - Funshion Online Technologies Ltd + 3093BC + Sagemcom Broadband SAS - 205532 - Gotech International Technology Limited + B41CAF + UAB TELTONIKA NETWORKS - 2CFF65 - Oki Electric Industry Ltd + 8C083C + EM Microelectronic - 2C27D7 - Hewlett-Packard Company + 3835FB + Sagemcom Broadband SAS - 984BE1 - Hewlett-Packard Company + 342844 + Kyung In Electronics - 002926 - Applied Optoelectronics Inc. Taiwan Branch + 4449C0 + NVIDIA Corporation - 24BA13 - Riso Kagaku Corporation + D8B1DE + Hewlett Packard Enterprise - 0017E5 - Texas Instruments + F87528 + IEEE Registration Authority - 0017EC - Texas Instruments + C08B27 + FN-LINK TECHNOLOGY Ltd. - 0017E7 - Texas Instruments + DCF144 + Ocean Solution Technology - 0017E9 - Texas Instruments + F8E73C + Ufispace Co., LTD. - 1CBA8C - Texas Instruments + F832BA + VusionGroup - 0015E9 - D-Link Corporation + F8D811 + Quectel Wireless Solutions Co.,Ltd. - 001B11 - D-Link Corporation + 383904 + ittim - 00265A - D-Link Corporation + 786BA5 + Changchun Jetty Automotive Technology Co., LTD - C8BE19 - D-Link International + D013C1 + Shenzhen Skyworth Digital Technology CO., Ltd - A4BA76 - Huawei Technologies Ltd + 10B06E + Shenzhen Phaten Tech. LTD - 0050C2 - IEEE Registration Authority + 209395 + nVent - 440010 - Apple + EC86C4 + Mellanox Technologies, Inc. - 0056CD - Apple + D05533 + Palo Alto Networks - 006037 - NXP Semiconductors + FC186B + Dot Origin Ltd - DCC0EB - Assa Abloy Cote Picarde + 707EDA + GSD VIET NAM TECHNOLOGY COMPANY LIMITED - 28BC56 - EMAC Inc. + 000422 + Studio Technologies, Inc. - 00CDFE - Apple + 0C5141 + NXP Semiconductors Taiwan Ltd. - A0F895 - Shenzhen TINNO Mobile Technology Corp. + C4AA43 + Cisco Systems, Inc - 0078CD - Ignition Design Labs + 3CD35C + Luna Innovations - B436A9 - Fibocom Wireless Inc. + 1CE587 + Cisco Meraki - 70CA4D - Shenzhen lnovance Technology Ltd + B83446 + Motorola Mobility LLC, a Lenovo Company - 001A11 - Google Inc. + 04E31A + Sagemcom Broadband SAS - 48DB50 - Huawei Technologies Ltd + 345D9E + Sagemcom Broadband SAS - C8478C - Beken Corporation + 7C1689 + Sagemcom Broadband SAS - 9CEFD5 - Panda Wireless Inc. + 44D454 + Sagemcom Broadband SAS - 9C3426 - ARRIS Group Inc. + 38A659 + Sagemcom Broadband SAS - 2C6E85 - Intel Corporation + 841EA3 + Sagemcom Broadband SAS - 001DD1 - ARRIS Group Inc. + B0924A + Sagemcom Broadband SAS - 001DCF - ARRIS Group Inc. + 38E1F4 + Sagemcom Broadband SAS - 001DD5 - ARRIS Group Inc. + A0551F + Sagemcom Broadband SAS - 001DD4 - ARRIS Group Inc. + B05B99 + Sagemcom Broadband SAS - E498D6 - Apple + ACD75B + Sagemcom Broadband SAS - 002283 - Juniper Networks + 3817B1 + Sagemcom Broadband SAS - 0010DB - Juniper Networks + D8CF61 + Sagemcom Broadband SAS - 00121E - Juniper Networks + ECFC2F + Sagemcom Broadband SAS - CCA462 - ARRIS Group Inc. + 6045CD + Sagemcom Broadband SAS - 484520 - Intel Corporation + 7CD4A8 + Sagemcom Broadband SAS - C80E77 - Le Shi Zhi Xin Electronic Technology (Tianjin) Limited + 64FA2B + Sagemcom Broadband SAS - 106F3F - Buffalo Inc. + 102BAA + Sagemcom Broadband SAS - 9049FA - Intel Corporation + 382228 + Telink Micro LLC - BC0F64 - Intel Corporation + BC9D37 + Telink Micro LLC - 0000C5 - ARRIS Group Inc. + 74DC13 + Telink Micro LLC - 6455B1 - ARRIS Group Inc. + CC00F1 + Sagemcom Broadband SAS - 0002B3 - Intel Corporation + B0FC88 + Sagemcom Broadband SAS - 000347 - Intel Corporation + 44D453 + Sagemcom Broadband SAS - 000E0C - Intel Corporation + 646624 + Sagemcom Broadband SAS - D8D385 - Hewlett-Packard Company + 244ECD + Sagemcom Broadband SAS - 18A905 - Hewlett-Packard Company + 48AABB + Sagemcom Broadband SAS - 001B78 - Hewlett-Packard Company + ECBEDD + Sagemcom Broadband SAS - E4FAFD - Intel Corporation + F8084F + Sagemcom Broadband SAS - 94659C - Intel Corporation + 8020DA + Sagemcom Broadband SAS - B0C745 - Buffalo Inc. + 84A06E + Sagemcom Broadband SAS - 14CFE2 - ARRIS Group Inc. + E8ADA6 + Sagemcom Broadband SAS - 44E137 - ARRIS Group Inc. + 8C94DF + Espressif Inc. - 001320 - Intel Corporation + 288485 + Espressif Inc. - 0080E1 - STMicroelectronics SRL + F85B1B + Espressif Inc. - F8DB7F - HTC Corporation + 441BF6 + Espressif Inc. - 64A769 - HTC Corporation + 704BCA + Espressif Inc. - E899C4 - HTC Corporation + 2C79D7 + Sagemcom Broadband SAS - BCCFCC - HTC Corporation + D87D7F + Sagemcom Broadband SAS - 0004EA - Hewlett-Packard Company + B0982B + Sagemcom Broadband SAS - 001279 - Hewlett-Packard Company + 1890D8 + Sagemcom Broadband SAS - 001321 - Hewlett-Packard Company + 348AAE + Sagemcom Broadband SAS - 000802 - Hewlett-Packard Company + 7C03D8 + Sagemcom Broadband SAS - 0002A5 - Hewlett-Packard Company + C0AC54 + Sagemcom Broadband SAS - 001871 - Hewlett-Packard Company + 2C3996 + Sagemcom Broadband SAS - 000E7F - Hewlett-Packard Company + 582ABD + Espressif Inc. - 001185 - Hewlett-Packard Company + 1C8F57 + Espressif Inc. - 10604B - Hewlett-Packard Company + 10BDA3 + Espressif Inc. - C8CBB8 - Hewlett-Packard Company + 001556 + Sagemcom Broadband SAS - 843497 - Hewlett-Packard Company + C0D044 + Sagemcom Broadband SAS - 6CC217 - Hewlett-Packard Company + A01B29 + Sagemcom Broadband SAS - 1458D0 - Hewlett-Packard Company + B43B52 + Sagemcom Broadband SAS - 5C8A38 - Hewlett-Packard Company + 083E5D + Sagemcom Broadband SAS - EC9A74 - Hewlett-Packard Company + 80456B + Espressif Inc. - 2C59E5 - Hewlett-Packard Company + A848FA + Espressif Inc. - D8FC38 - Giantec Semiconductor Inc + C8C9A3 + Espressif Inc. - AC2A0C - CSR Zhuzhou Institute Ltd + 8C4B14 + Espressif Inc. - 2C6798 - IntalTech Ltd + 90380C + Espressif Inc. - 00234D - Hon Hai Precision Ind Ltd + ACD074 + Espressif Inc. - 002556 - Hon Hai Precision Ind Ltd + 240AC4 + Espressif Inc. - 601888 - ZTE Corporation + 68C63A + Espressif Inc. - D860B0 - bioMerieux Italia S.p.A. + 8CCE4E + Espressif Inc. - 54E6FC - TP-Link Technologies Ltd + C45BBE + Espressif Inc. - 74EA3A - TP-Link Technologies Ltd + BCFF4D + Espressif Inc. - F81A67 - TP-Link Technologies Ltd + 8856A6 + Espressif Inc. - EC172F - TP-Link Technologies Ltd + E08CFE + Espressif Inc. - 847778 - Cochlear Limited + 58E6C5 + Espressif Inc. - 887F03 - Comper Technology Investment Limited + 348518 + Espressif Inc. - 0019E0 - TP-Link Technologies Ltd + 80646F + Espressif Inc. - 002586 - TP-Link Technologies Ltd + 48E729 + Espressif Inc. - F431C3 - Apple + FCF5C4 + Espressif Inc. - 64A5C3 - Apple + 70039F + Espressif Inc. - 28565A - Hon Hai Precision Ind Ltd + 1091A8 + Espressif Inc. - 6CB56B - HUMAX Ltd + 58CF79 + Espressif Inc. - BC3AEA - Guangdong Oppo Mobile Telecommunications Corp Ltd + 8CFD49 + Espressif Inc. - E422A5 - Plantronics Inc. + 246F28 + Espressif Inc. - D4C9B2 - Quanergy Systems Inc + 80F3DA + Espressif Inc. - 6021C0 - Murata Manufacturing Ltd + 80B54E + Espressif Inc. - 88308A - Murata Manufacturing Ltd + 140808 + Espressif Inc. - 5CDAD4 - Murata Manufacturing Ltd + AC1518 + Espressif Inc. - 0026E8 - Murata Manufacturing Ltd + F09E9E + Espressif Inc. - 002512 - ZTE Corporation + 588C81 + Espressif Inc. - 001C26 - Hon Hai Precision Ind Ltd + FC012C + Espressif Inc. - 14E6E4 - TP-Link Technologies Ltd + 5CBA75 + Quectel Wireless Solutions Co.,Ltd. - 344B50 - ZTE Corporation + DC0675 + Espressif Inc. - FCC897 - ZTE Corporation + 10061C + Espressif Inc. - 0016CE - Hon Hai Precision Ind Ltd + B8D3EF + UNISEM (M) BERHAD - 002268 - Hon Hai Precision Ind Ltd + 6CE4DA + NEC Platforms, Ltd. - 001882 - Huawei Technologies Ltd + 081086 + NEC Platforms, Ltd. - D4EA0E - Avaya Inc + 5C4097 + ACCTON TECHNOLOGY CORPORATION - 6CFA58 - Avaya Inc + 04FB66 + Ericsson AB - 20F3A3 - Huawei Technologies Ltd + D807B6 + TP-LINK TECHNOLOGIES CO.,LTD. - 0C37DC - Huawei Technologies Ltd + 646E97 + TP-LINK TECHNOLOGIES CO.,LTD. - BC7670 - Huawei Technologies Ltd + D03745 + TP-LINK TECHNOLOGIES CO.,LTD. - 24DBAC - Huawei Technologies Ltd + 603A7C + TP-LINK TECHNOLOGIES CO.,LTD. - 1C1D67 - Huawei Technologies Ltd + 68DDB7 + TP-LINK TECHNOLOGIES CO.,LTD. - 300ED5 - Hon Hai Precision Ind Ltd + 14D864 + TP-LINK TECHNOLOGIES CO.,LTD. - 485AB6 - Hon Hai Precision Ind Ltd + AC84C6 + TP-LINK TECHNOLOGIES CO.,LTD. - 543530 - Hon Hai Precision Ind Ltd + 6CB158 + TP-LINK TECHNOLOGIES CO.,LTD. - F866D1 - Hon Hai Precision Ind Ltd + 246968 + TP-LINK TECHNOLOGIES CO.,LTD. - 2469A5 - Huawei Technologies Ltd + 9C1C37 + AltoBeam Inc. - EC233D - Huawei Technologies Ltd + A4EF15 + AltoBeam Inc. - 78F5FD - Huawei Technologies Ltd + 44291E + AltoBeam Inc. - 5C7D5E - Huawei Technologies Ltd + 2C79BE + TP-LINK TECHNOLOGIES CO.,LTD. - 90671C - Huawei Technologies Ltd + 0423A3 + Mellanox Technologies, Inc. - BC25E0 - Huawei Technologies Ltd + 2CE5BD + Ubiquiti Inc - F4E3FB - Huawei Technologies Ltd + 5CE753 + Shenzhen Intellirocks Tech. Co. Ltd. - D02DB3 - Huawei Technologies Ltd + 386FF4 + Amazon Technologies Inc. - E8CD2D - Huawei Technologies Ltd + C46940 + Xiaomi Communications Co Ltd - 84A8E4 - Huawei Technologies Ltd + B0EC69 + Apple, Inc. - 0C96BF - Huawei Technologies Ltd + 20845F + Apple, Inc. - 60E701 - Huawei Technologies Ltd + B0BBA9 + Apple, Inc. - E8088B - Huawei Technologies Ltd + CC38E1 + HUAWEI TECHNOLOGIES CO.,LTD - A051C6 - Avaya Inc + 509546 + HUAWEI TECHNOLOGIES CO.,LTD - F0EBD0 - Shanghai Feixun Communication Ltd + 14B6EB + CJ intelligent technology LTD. - 643E8C - Huawei Technologies Ltd + C4C00A + Microsoft Corporation - 0012D2 - Texas Instruments + E09EC1 + Silicon Innovation Microelectronics Co.,Ltd. - A863F2 - Texas Instruments + F49A7C + Hangzhou Supranett Network Technology Co.,Ltd. - 7C6097 - Huawei Technologies Ltd + 109327 + GIGA-BYTE TECHNOLOGY CO. , Ltd. - CC53B5 - Huawei Technologies Ltd + 18120C + Zhouhai Intelligence(Shenzhen).,Ltd - 60DE44 - Huawei Technologies Ltd + 0CE623 + Huawei Device Co., Ltd. - 105172 - Huawei Technologies Ltd + A0C926 + Huawei Device Co., Ltd. - 08E84F - Huawei Technologies Ltd + 94AD05 + Huawei Device Co., Ltd. - 888603 - Huawei Technologies Ltd + 64D667 + Shanghai Ikotek Technology Co.,Ltd - 04F938 - Huawei Technologies Ltd + 0851F2 + Sagemcom Broadband SAS - AC853D - Huawei Technologies Ltd + 501911 + IEEE Registration Authority - 4846FB - Huawei Technologies Ltd + 887E25 + Extreme Networks, Inc. - D0FF50 - Texas Instruments + B87CF2 + Extreme Networks, Inc. - 20C38F - Texas Instruments + F4EAB5 + Extreme Networks, Inc. - 7C669D - Texas Instruments + 08EA44 + Extreme Networks, Inc. - D8DDFD - Texas Instruments + BC34D6 + Extreme Networks, Inc. - D05FB8 - Texas Instruments + B81E0B + Extreme Networks, Inc. - E0247F - Huawei Technologies Ltd + B8DC28 + Extreme Networks, Inc. - 00464B - Huawei Technologies Ltd + 1C2D60 + Extreme Networks, Inc. - 80FB06 - Huawei Technologies Ltd + A4C7F6 + Extreme Networks, Inc. - 6CA849 - Avaya Inc + A8C647 + Extreme Networks, Inc. - 64C354 - Avaya Inc + E0A129 + Extreme Networks, Inc. - 50CD22 - Avaya Inc + 0C9B78 + Extreme Networks, Inc. - B4A95A - Avaya Inc + A473AB + Extreme Networks, Inc. - 84EB18 - Texas Instruments + D0A651 + AltoBeam Inc. - EC1127 - Texas Instruments + B42D56 + Extreme Networks, Inc. - 581626 - Avaya Inc + 001977 + Extreme Networks, Inc. - 70E422 - Cisco Systems Inc. + 940E5F + Apple, Inc. - 00500F - Cisco Systems Inc. + C88A7B + Espressif Inc. - 7C1DD9 - Xiaomi Communications Ltd + B4101C + Shanghai Imilab Technology Co.Ltd - A086C6 - Xiaomi Communications Ltd + 380484 + Apple, Inc. - 9C99A0 - Xiaomi Communications Ltd + 4089C2 + Apple, Inc. - 584498 - Xiaomi Communications Ltd + 0C2D71 + Apple, Inc. - 00E0B0 - Cisco Systems Inc. + 787462 + Intel Corporate - 00E0FE - Cisco Systems Inc. + A426CA + Intel Corporate - 00E034 - Cisco Systems Inc. + 60D1D8 + Silicon Laboratories - 00E0F9 - Cisco Systems Inc. + 00A0B0 + I-O DATA, INC. - C8D719 - Cisco-Linksys LLC + BCC8CC + Seiko Epson Corporation - 001079 - Cisco Systems Inc. + 90B141 + Motorola Mobility LLC, a Lenovo Company - 001029 - Cisco Systems Inc. + B8FE96 + Amazon Technologies Inc. - 000E08 - Cisco-Linksys LLC + 8CA9FD + Copper Mountain Technologies - 4403A7 - Cisco Systems Inc. + 00749C + Ruijie Networks Co.,LTD - B0FAEB - Cisco Systems Inc. + 000FEA + GIGA-BYTE TECHNOLOGY CO.,LTD. - 7CAD74 - Cisco Systems Inc. + 38AD2B + Hitron Technologies. Inc - 00603E - Cisco Systems Inc. + E8458B + MitraStar Technology Corp. - 00602F - Cisco Systems Inc. + D04433 + Clourney Semiconductor - 006047 - Cisco Systems Inc. + 4086CB + D-Link Corporation - 0050A2 - Cisco Systems Inc. + 48417B + Nokia Solutions and Networks GmbH & Co. KG - 00023D - Cisco Systems Inc. + 608CDF + Beamtrail-Sole Proprietorship - 203A07 - Cisco Systems Inc. + 3027CF + Canopy Growth Corp - 00502A - Cisco Systems Inc. + 001277 + Beijer Electronics Corp. - BC16F5 - Cisco Systems Inc. + 60452E + Intel Corporate - FC5B39 - Cisco Systems Inc. + 1CAB48 + TECNO MOBILE LIMITED - 346F90 - Cisco Systems Inc. + 88B436 + FUJIFILM Corporation - 5CFC66 - Cisco Systems Inc. + CCD342 + Cisco Systems, Inc - D46D50 - Cisco Systems Inc. + 40B8C2 + OSMOZIS - 74A02F - Cisco Systems Inc. + 8CE9EE + Intel Corporate - 88908D - Cisco Systems Inc. + 944560 + Google, Inc. - F07816 - Cisco Systems Inc. + 5C337B + Google, Inc. - 00223A - Cisco SPVTG + 2C9C58 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 0021BE - Cisco SPVTG + B8F44F + u-blox AG - 14DAE9 - ASUSTek Computer Inc. + 540929 + Inventus Power Eletronica do Brasil LTDA - F4CFE2 - Cisco Systems Inc. + 2831F8 + HUAWEI TECHNOLOGIES CO.,LTD - A80C0D - Cisco Systems Inc. + C4AA99 + HUAWEI TECHNOLOGIES CO.,LTD - C07BBC - Cisco Systems Inc. + A8F5E1 + Shenzhen Shokz Co., Ltd. - 24E9B3 - Cisco Systems Inc. + 606682 + SHENZHEN ATEKO PHOTOELECTRICITY CO.,LTD - 0011D8 - ASUSTek Computer Inc. + 788DAF + Sagemcom Broadband SAS - C08C60 - Cisco Systems Inc. + 2CBACA + Cosonic Electroacoustic Technology Co., Ltd. - E8EDF3 - Cisco Systems Inc. + 04FA3F + OptiCore Inc. - E4C722 - Cisco Systems Inc. + 441DB1 + APTIV SERVICES US, LLC - 64E950 - Cisco Systems Inc. + 009CC0 + vivo Mobile Communication Co., Ltd. - F41FC2 - Cisco Systems Inc. + E89E13 + CRESYN - 44ADD9 - Cisco Systems Inc. + BC1896 + HUAWEI TECHNOLOGIES CO.,LTD - 0C6803 - Cisco Systems Inc. + BC0FFE + Juniper Networks - 1CDEA7 - Cisco Systems Inc. + E0D3B4 + Cisco Meraki - F07F06 - Cisco Systems Inc. + FC8C11 + Microsoft Corporation - 88F031 - Cisco Systems Inc. + A494DC + Infinite Clouds - 0018F3 - ASUSTek Computer Inc. + 4C4341 + Calix Inc. - 001A92 - ASUSTek Computer Inc. + E46CD1 + Calix Inc. - 000C41 - Cisco-Linksys LLC + D0F27F + BrewLogix, LLC - 0016B6 - Cisco-Linksys LLC + 7CFCFD + Fiberhome Telecommunication Technologies Co.,LTD - 0018F8 - Cisco-Linksys LLC + 4887B8 + TCL King Electrical Appliances(Huizhou)Co.,Ltd - 00252E - Cisco SPVTG + 7058A4 + Actiontec Electronics Inc. - 54D46F - Cisco SPVTG + 188025 + Hangzhou Hikvision Digital Technology Co.,Ltd. - A4A24A - Cisco SPVTG + F8F09D + Hangzhou Prevail Communication Technology Co., Ltd - 44E08E - Cisco SPVTG + E47876 + Arista Networks - 00E036 - Pioneer Corporation + A4A930 + Beijing Xiaomi Mobile Software Co., Ltd - 00E04F - Cisco Systems Inc. + A02252 + Astra Wireless Technology FZ-LLC - 0010FF - Cisco Systems Inc. + BC102F + SJI Industry Company - 001054 - Cisco Systems Inc. + FC936B + Samsung Electronics Co.,Ltd - 0010F6 - Cisco Systems Inc. + BCB6FB + P4Q ELECTRONICS, S.L. - 0010A6 - Cisco Systems Inc. + 7C752D + Samsung Electronics Co.,Ltd - BCC810 - Cisco SPVTG + 84EEE4 + Samsung Electronics Co.,Ltd - 7CB21B - Cisco SPVTG + 4435D3 + GD Midea Air-Conditioning Equipment Co.,Ltd. - 24767D - Cisco SPVTG + 88F00F + Miraeil - 481D70 - Cisco SPVTG + 18A788 + Shenzhen MEK Intellisys Pte Ltd - F0B2E5 - Cisco Systems Inc. + BC8529 + Jiangxi Remote lntelligence Technology Co.,Ltd - 002332 - Apple + 289401 + NETGEAR - 00236C - Apple + D878C9 + SERVERCOM (INDIA) PRIVATE LIMITED - 0023DF - Apple + A85EF2 + TECNO MOBILE LIMITED - 002500 - Apple + 789A18 + Routerboard.com - 0025BC - Apple + 84DB2F + Sierra Wireless, ULC - 5897BD - Cisco Systems Inc. + 74C530 + vivo Mobile Communication Co., Ltd. - 5C838F - Cisco Systems Inc. + BC96E5 + SERCOMM PHILIPPINES INC - ECBD1D - Cisco Systems Inc. + A899AD + Chaoyue Technology Co., Ltd. - 0019E3 - Apple + D015BB + IEEE Registration Authority - 001B63 - Apple + 64CE6E + Sierra Wireless, ULC - 001EC2 - Apple + 78DF72 + Shanghai Imilab Technology Co.Ltd - 001FF3 - Apple + 602B58 + EM Microelectronic - 0010FA - Apple + 109D9C + EM Microelectronic - 0050E4 - Apple + 28FF5F + HG Genuine Intelligent Terminal (Xiaogan) Co.,Ltd. - 000D93 - Apple + 607623 + Shenzhen E-Superlink Technology Co., Ltd - 7CFADF - Apple + 7492BA + Movesense Ltd - 78A3E4 - Apple + D0484F + Nokia Solutions and Networks GmbH & Co. KG - 148FC6 - Apple + 2C459A + Dixon Technologies (India) Limited - 286AB8 - Apple + 6C6E07 + CE LINK LIMITED - 28E02C - Apple + 6C6286 + Nokia - E0B9BA - Apple + 50482C + IEEE Registration Authority - 00C610 - Apple + B8FC28 + Valeo Vision Systems - B8F6B1 - Apple + 0020FC + Matrox Central Services Inc - 8CFABA - Apple + 888187 + Umeox Innovations Co.,Ltd - 7CD1C3 - Apple + D40F9E + Apple, Inc. - F0DCE2 - Apple + 6CA367 + Avlinkpro - 24AB81 - Apple + 48C461 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - E0F847 - Apple + B8B7DB + GOIP Global Services Pvt. Ltd. - 28E7CF - Apple + 880CE0 + Texas Instruments - E4CE8F - Apple + B83DF6 + Texas Instruments - A82066 - Apple + B4DDE0 + Shanghai Amphenol Airwave Communication Electronics Co.,Ltd. - BC52B7 - Apple + 9064AD + HUAWEI TECHNOLOGIES CO.,LTD - 5C5948 - Apple + D4D892 + HUAWEI TECHNOLOGIES CO.,LTD - C8BCC8 - Apple + 98D3D7 + HUAWEI TECHNOLOGIES CO.,LTD - E8040B - Apple + 886EEB + HUAWEI TECHNOLOGIES CO.,LTD - 145A05 - Apple + 980DAF + Apple, Inc. - 1CABA7 - Apple + DC6DBC + Apple, Inc. - C0847A - Apple + A4D23E + Apple, Inc. - 34159E - Apple + 30E04F + Apple, Inc. - 58B035 - Apple + 64E4A5 + LG Electronics - DC86D8 - Apple + 48BDCE + Vantiva USA LLC - 90B931 - Apple + 9404E3 + Vantiva USA LLC - D0E140 - Apple + B42A0E + Vantiva USA LLC - 24A2E1 - Apple + 603D26 + Vantiva USA LLC - 04214C - Insight Energy Ventures LLC + 54A65C + Vantiva USA LLC - F832E4 - ASUSTek Computer Inc. + DCEB69 + Vantiva USA LLC - 80EA96 - Apple + 946A77 + Vantiva USA LLC - 600308 - Apple + D4B92F + Vantiva USA LLC - 04F13E - Apple + 589630 + Vantiva USA LLC - 98F0AB - Apple + 989D5D + Vantiva USA LLC - 7831C1 - Apple + 484BD4 + Vantiva USA LLC - 783A84 - Apple + E0DBD1 + Vantiva USA LLC - 5C8D4E - Apple + ECA81F + Vantiva USA LLC - 8863DF - Apple + C42795 + Vantiva USA LLC - 881FA1 - Apple + E0885D + Vantiva USA LLC - C8E0EB - Apple + 802994 + Vantiva USA LLC - 98B8E3 - Apple + E40D3B + Ericsson AB - 885395 - Apple + EC5382 + Honor Device Co., Ltd. - 786C1C - Apple + 9C0971 + New H3C Technologies Co., Ltd - 4C8D79 - Apple + 98AB15 + Fujian Youyike Technology Co.,Ltd - 1CE62B - Apple + 0018AD + NIDEC INSTRUMENTS CORPORATION - 0C3021 - Apple + A4CCB3 + Xiaomi Communications Co Ltd - 0C3E9F - Apple + BC3198 + IEEE Registration Authority - FCFC48 - Apple + ECA2A0 + Taicang T&W Electronics - 9C293F - Apple + 0C7043 + Sony Interactive Entertainment Inc. - 80A1AB - Intellisis + CC4085 + WiZ - 84285A - Saffron Solutions Inc + DCCD18 + Nintendo Co.,Ltd - D4B8FF - Home Control Singapore Pte Ltd + 5449FC + Ubee Interactive Co., Limited - 087402 - Apple + 4C496C + Intel Corporate - 94F6A3 - Apple + 0011A9 + Nurivoice Co., Ltd - 98E0D9 - Apple + 18F935 + Cisco Systems, Inc - CC29F5 - Apple + 588B1C + Cisco Systems, Inc - 285AEB - Apple + C8154E + Intel Corporate - F02475 - Apple + 789F38 + Shenzhen Feasycom Co., Ltd - 2C1F23 - Apple + 544C8A + Microsoft Corporation - 549F13 - Apple + 9070D3 + Fiberhome Telecommunication Technologies Co.,LTD - F0DBE2 - Apple + 6C48A6 + Fiberhome Telecommunication Technologies Co.,LTD - 748114 - Apple + 3C0D2C + Liquid-Markets GmbH - 18F643 - Apple + FCB9DF + Motorola Mobility LLC, a Lenovo Company - A45E60 - Apple + D081C5 + Juniper Networks - A01828 - Apple + 84AC60 + Guangxi Hesheng Electronics Co., Ltd. - D0034B - Apple + 9CA389 + Nokia - 10417F - Apple + 5C101E + zte corporation - A8667F - Apple + 201746 + Paradromics, Inc. - D02598 - Apple + C46026 + SKY UK LIMITED - 80BE05 - Apple + 905A08 + Super Micro Computer, Inc. - 24A074 - Apple + FCF763 + KunGao Micro (JiangSu) Co., LTd - 84788B - Apple + 808C97 + Kaon Group Co., Ltd. - 84A423 - Sagemcom Broadband SAS + 4C12E8 + VIETNAM POST AND TELECOMMUNICATION INDUSTRY TECHNOLOGY JOIN STOCK COMPANY - 3C7873 - Airsonics + 2002FE + Hangzhou Dangbei Network Technology Co., Ltd - 9C88AD - Fiberhome Telecommunication Technologies Ltd + 74272C + Advanced Micro Devices, Inc. - 88947E - Fiberhome Telecommunication Technologies Ltd + 208810 + Dell Inc. - C8A2CE - Oasis Media Systems LLC + A06260 + Private - 58F496 - Source Chain + E44519 + Beijing Xiaomi Electronics Co.,Ltd - 587F57 - Apple + C05B44 + Beijing Xiaomi Mobile Software Co., Ltd - D07C2D - Leie IOT technology Ltd + E4B224 + HUAWEI TECHNOLOGIES CO.,LTD - EC64E7 - MOCACARE Corporation + A83ED3 + HUAWEI TECHNOLOGIES CO.,LTD - 40862E - JDM Mobile Internet Solution Ltd + 6467CD + HUAWEI TECHNOLOGIES CO.,LTD - C4BBEA - Pakedge Device and Software Inc + 34ECB6 + Phyplus Microelectronics Limited - 988744 - Wuxi Hongda Science and Technology Ltd + 4CD2FB + UNIONMAN TECHNOLOGY CO.,LTD - E8343E - Beijing Infosec Technologies Ltd + 9C1ECF + Valeo Telematik und Akustik GmbH - 346987 - ZTE Corporation + 000D39 + Nevion - 98F428 - ZTE Corporation + 807677 + hangzhou puwell cloud tech co., ltd. - A4CC32 - Inficomm Ltd + F42B8C + Samsung Electronics Co.,Ltd - 006D52 - Apple + E41A1D + NOVEA ENERGIES - A03299 - Lenovo (Beijing) Ltd + F4CAE7 + Arcadyan Corporation - 4054E4 - Wearsafe Labs Inc + 3CEF42 + TCT mobile ltd - DC9A8E - Nanjing Cocomm electronics Ltd + B0A3F2 + Huaqin Technology Co. LTD - ACEE9E - Samsung Electronics Ltd + F86691 + Sichuan Tianyi Comheart Telecom Co.,LTD - B857D8 - Samsung Electronics Ltd + E43819 + Shenzhen Hi-Link Electronic CO.,Ltd. - 70BF3E - Charles River Laboratories + 84F175 + Jiangxi Xunte Intelligent Terminal Co., Ltd - A8C87F - Roqos Inc. + C89828 + zte corporation - 3C831E - CKD Corporation + DC3642 + zte corporation - 90DFFB - Homerider Systems + 788A86 + China Dragon Technology Limited - 305A3A - ASUSTek Computer Inc. + 608246 + Apple, Inc. - 2C081C - OVH + 98B379 + Apple, Inc. - C08488 - Finis Inc + 6C2ADF + IEEE Registration Authority - 38F557 - Jolata Inc. + 847293 + Texas Instruments - 54A3FA - BQT Solutions (Australia)Pty Ltd + 60DC81 + AltoBeam Inc. - 246C8A - YUKAI Engineering + 20E46F + vivo Mobile Communication Co., Ltd. - ACC51B - Zhuhai Pantum Electronics Ltd + 883037 + Juniper Networks - 385F66 - Cisco SPVTG + E82404 + Quectel Wireless Solutions Co.,Ltd. - B844D9 - Apple + F82E0C + Texas Instruments - 9C7A03 - Ciena Corporation + 9006F2 + Texas Instruments - 5CCF7F - Espressif Inc. + E86E3A + Sony Interactive Entertainment Inc. - 681295 - Lupine Lighting Systems GmbH + BCB1D3 + Cisco Meraki - 7011AE - Music Life Ltd + B87BD4 + Google, Inc. - 041E7A - DSPWorks + C8138B + Shenzhen Skyworth Digital Technology CO., Ltd - 84A788 - Perples + 34AA31 + Shenzhen Skyworth Digital Technology CO., Ltd - AC60B6 - Ericsson AB + A04C0C + Shenzhen Skyworth Digital Technology CO., Ltd - 14B370 - Gigaset Digital Technology (Shenzhen) Ltd + 6CC242 + Shenzhen Skyworth Digital Technology CO., Ltd - 6889C1 - Huawei Technologies Ltd + 049D05 + Apple, Inc. - 1C497B - Gemtek Technology Ltd + E073E7 + HP Inc. - 2CCF58 - Huawei Technologies Ltd + 54083B + IEEE Registration Authority - D09380 - Ducere Technologies Pvt Ltd + 54EF43 + HUAWEI TECHNOLOGIES CO.,LTD - 68F956 - Objetivos y Servicio de Valor Anadido + D81BB5 + HUAWEI TECHNOLOGIES CO.,LTD - C8A9FC - Goyoo Networks Inc. + 8464DD + HUAWEI TECHNOLOGIES CO.,LTD - FCFEC2 - Invensys Controls UK Limited + 68A46A + HUAWEI TECHNOLOGIES CO.,LTD - 689AB7 - Atelier Vision Corporation + F48E38 + Dell Inc. - 444CA8 - Arista Networks + 28F10E + Dell Inc. - 7C2BE1 - Shenzhen Ferex Electrical Ltd + 90B11C + Dell Inc. - 5031AD - ABB Global Industries and Services Private Limited + 64006A + Dell Inc. - 143EBF - ZTE Corporation + 109836 + Dell Inc. - FC2FEF - UTT Technologies Ltd + C81F66 + Dell Inc. - A4C138 - Telink Semiconductor (Taipei) Ltd + F8DB88 + Dell Inc. - 20F510 - Codex Digital Limited + 001422 + Dell Inc. - A8741D - PHOENIX CoNTACT Electronics GmbH + 0015C5 + Dell Inc. - F09A51 - Shanghai Viroyal Electronic Technology Company Limited + 7845C4 + Dell Inc. - 4CB82C - Cambridge Mobile Telematics Inc. + 5C260A + Dell Inc. - E4A32F - Shanghai Artimen Technology Ltd + 001E4F + Dell Inc. - F4672D - Shenzhen Topstar Technology Company + 0026B9 + Dell Inc. - A8D828 - Ascensia Diabetes Care + D067E5 + Dell Inc. - B869C2 - Sunitec Enterprise Ltd + 544E45 + Private - 88CBA5 - Suzhou Torchstar Intelligent Technology Ltd + 209727 + TELTONIKA NETWORKS UAB - 7CA23E - Huawei Technologies Ltd + 001AE8 + Unify Software and Solutions GmbH & Co. KG - 501AA5 - GN Netcom A/S + 2CFE4F + Xiaomi Communications Co Ltd - A48D3B - Vizio Inc. + 907E43 + zte corporation - 1C56FE - Motorola Mobility LLC, a Lenovo Company + 943EE4 + WiSA Technologies Inc - B899B0 - Cohere Technologies + A8BD3A + UNION MAN TECHNOLOGY CO.,LTD - D85DEF - Busch-Jaeger Elektro GmbH + 48CAC6 + UNION MAN TECHNOLOGY CO.,LTD - 88A2D7 - Huawei Technologies Ltd + D43844 + UNION MAN TECHNOLOGY CO.,LTD - 00323A - so-logic + 6C3C8C + Dell Inc. - 809FAB - Fiberhome Telecommunication Technologies Ltd + C45AB1 + Dell Inc. - E00370 - Shenzhen Continental Wireless Technology Ltd + A8B028 + CubePilot Pty Ltd - 046169 - Media Global Links Ltd + 407F5F + Juniper Networks - BCEB5F - Fujian Beifeng Telecom Technology Ltd + 2CEA7F + Dell Inc. - AC5A14 - Samsung Electronics Ltd + F0D4E2 + Dell Inc. - F0AB54 - Mitsumi Electric Ltd + CC483A + Dell Inc. - 3C3178 - Qolsys Inc. + 30D042 + Dell Inc. - 08ECA9 - Samsung Electronics Ltd + 8C04BA + Dell Inc. - E04B45 - Hi-P Electronics Pte Ltd + E454E8 + Dell Inc. - F46A92 - Shenzhen Fast Technologies Ltd + A4BB6D + Dell Inc. - F0D657 - Echosens + E4434B + Dell Inc. - 9C37F4 - Huawei Technologies Ltd + E01F6A + Huawei Device Co., Ltd. - 3C4711 - Huawei Technologies Ltd + 00566D + Huawei Device Co., Ltd. - 5CEB68 - Cheerstar Technology Ltd + 90CC7A + Huawei Device Co., Ltd. - AC562C - Lava International(H.K) Limited + 8CC58C + ShenZhen Elsky Technology Co.,LTD - FC9AFA - Motus Global Inc. + 2C704F + zte corporation - 14157C - Tokyo Cosmos Electric Ltd + 645234 + Sichuan Tianyi Comheart Telecom Co.,LTD - 20E407 - Spark srl + 381672 + Shenzhen SuperElectron Technology Co.,Ltd. - D09DAB - TCT mobile Ltd + 6C29D2 + Cisco Systems, Inc - 887384 - Toshiba + 08CC81 + Hangzhou Hikvision Digital Technology Co.,Ltd. - 24693E - innodisk Corporation + F45433 + Rockwell Automation - C0DC6A - Qingdao Eastsoft Communication Technology Ltd + 34C0F9 + Rockwell Automation - 24B0A9 - Shanghai Mobiletek Communication Ltd + 5C8816 + Rockwell Automation - 1CC586 - Absolute Acoustics + D45347 + Merytronic 2012, S.L. - 407FE0 - Glory Star Technics (Shenzhen) Limited + D07B6F + Zhuhai Yunmai Technology Co.,Ltd - C8E130 - Milkyway Group Ltd + 04A526 + Nokia - 486EFB - Davit System Technology Ltd + 20BA36 + u-blox AG - B0966C - Lanbowan Technology Ltd + D80AE6 + zte corporation - 1CF03E - Wearhaus Inc. + 489E9D + Hui Zhou Gaoshengda Technology Co.,LTD - 883B8B - Cheering Connection Ltd + 18F46B + Telenor Connexion AB - E4F939 - Minxon Hotel Technology Inc. + 28EA0B + Microsoft Corporation - 146B72 - Shenzhen Fortune Ship Technology Ltd + A41437 + Hangzhou Hikvision Digital Technology Co.,Ltd. - B8F080 - SPS Inc. + F84DFC + Hangzhou Hikvision Digital Technology Co.,Ltd. - 805067 - W & D Technology Corporation + 849A40 + Hangzhou Hikvision Digital Technology Co.,Ltd. - 78F944 - Private + C0517E + Hangzhou Hikvision Digital Technology Co.,Ltd. - 247656 - Shanghai Net Miles Fiber Optics Technology Ltd + 2CA59C + Hangzhou Hikvision Digital Technology Co.,Ltd. - F8CFC5 - Motorola Mobility LLC, a Lenovo Company + 40ACBF + Hangzhou Hikvision Digital Technology Co.,Ltd. - A47B85 - ULTIMEDIA Ltd + 98F112 + Hangzhou Hikvision Digital Technology Co.,Ltd. - 5C5B35 - Mist Systems Inc. + 989DE5 + Hangzhou Hikvision Digital Technology Co.,Ltd. - Ecbafe - Giroptic + 3C1BF8 + Hangzhou Hikvision Digital Technology Co.,Ltd. - 3C2C94 - (HangZhou Delan Technology Ltd) + 9C5416 + Cisco Systems, Inc - 241B44 - Hangzhou Tuners Electronics Ltd + 48BDA7 + Honor Device Co., Ltd. - 80A85D - Osterhout Design Group + EC2150 + vivo Mobile Communication Co., Ltd. - ACCAAB - Virtual Electric Inc + A0AF12 + HUAWEI TECHNOLOGIES CO.,LTD - 485415 - NET Rules Tecnologia Eireli + 6096A4 + HUAWEI TECHNOLOGIES CO.,LTD - 7840E4 - Samsung Electronics Ltd + 5C5EAB + Juniper Networks - E09971 - Samsung Electronics Ltd + 7819F7 + Juniper Networks - 70DA9C - Tecsen + 2C2172 + Juniper Networks - 2CA2B4 - Fortify Technologies LLC + 4C9614 + Juniper Networks - 10D38A - Samsung Electronics Ltd + 784558 + Ubiquiti Inc - E48501 - Geberit International AG + AC8BA9 + Ubiquiti Inc - 206274 - Microsoft Corporation + 9C05D6 + Ubiquiti Inc - E8162B - IDEO Security Ltd + 28704E + Ubiquiti Inc - B47356 - Hangzhou Treebear Networking Ltd + 0017CB + Juniper Networks - 346895 - Hon Hai Precision Ind Ltd + 001F12 + Juniper Networks - 847303 - Letv Mobile and Intelligent Information Technology (Beijing) Corporation Ltd + 0024DC + Juniper Networks - 3CC2E1 - Xinhua Control Engineering Ltd + 00121E + Juniper Networks - 8C873B - Leica Camera AG + 0010DB + Juniper Networks - 44F477 + 002283 Juniper Networks - 142971 - Nemoa Electronics (HK) Ltd + 100E7E + Juniper Networks - 78E980 - RainUs Ltd + 44F477 + Juniper Networks - E0FFF7 - Softiron Inc. + 5C6AEC + IEEE Registration Authority - 3C6A9D - Dexatek Technology Ltd + CC9F7A + Chiun Mai Communication System, Inc - 349E34 - Evervictory Electronic Ltd + 5414A7 + Nanjing Qinheng Microelectronics Co., Ltd. - 700FC7 - Shenzhen Ikinloop Technology Ltd + 4CE705 + Siemens Industrial Automation Products Ltd., Chengdu - BC74D7 - HangZhou JuRu Technology Ltd + 80DB17 + Juniper Networks - 78EB14 - Shenzhen Fast Technologies Ltd + B8F015 + Juniper Networks - 3C4937 - ASSMANN Electronic GmbH + E4233C + Juniper Networks - 844464 - ServerU Inc + 98868B + Juniper Networks - 003560 - Rosen Aviation + 005828 + Axon Networks Inc. - F8BC41 - Rosslare Enterprises Limited + 30B64F + Juniper Networks - 3CB792 - Hitachi Maxell Ltd Optronics Division + 08B258 + Juniper Networks - F8B2F3 - Guangzhou Bosma Technology Ltd + F4A739 + Juniper Networks - 28D98A - Hangzhou Konke Technology Ltd + 4C16FC + Juniper Networks - D89341 - General Electric Global Research + C8E7F0 + Juniper Networks - 1C9ECB - Beijing Nari Smartchip Microelectronics Company Limited + 7C2586 + Juniper Networks - D48DD9 - Meld Technology Inc. + EC3873 + Juniper Networks - DCC622 - Buheung System + C00380 + Juniper Networks - 902CC7 - C-MAX Asia Limited + 20D80B + Juniper Networks - 8870EF - SC Professional Trading Ltd + 94BF94 + Juniper Networks - 94C038 - Tallac Networks + 4C6D58 + Juniper Networks - 6836B5 - DriveScale Inc. + 408F9D + Juniper Networks - C40880 - Shenzhen UTEPO Tech Ltd + AC78D1 + Juniper Networks - D88039 - Microchip Technology Inc. + 68228E + Juniper Networks - 5C966A - Rtnet + D8539A + Juniper Networks - BCBC46 - SKS Welding Systems GmbH + F8C116 + Juniper Networks - 9816EC - IC Intracom + 880AA3 + Juniper Networks - D062A0 - China Essence Technology (Zhumadian) Ltd + FC3342 + Juniper Networks - 90179B - Nanomegas + 3C8C93 + Juniper Networks - 14F893 - Wuhan FiberHome Digital Technology Ltd + 0C8126 + Juniper Networks - 582136 - KMB Systems, s.r.o. + 182AD3 + Juniper Networks - 800902 - Keysight Technologies Inc. + 7495A7 + Keyence Corporation - 0499E6 - Shenzhen Yoostar Technology Ltd + A0A3B3 + Espressif Inc. - 70FF5C - Cheerzing Communication(Xiamen)Technology Ltd + 34987A + Espressif Inc. - 4C48DA - Beijing Autelan Technology Ltd + 685932 + Sunitec Enterprise Co.,Ltd - 205CFA - Yangzhou ChangLian Network Technology Ltd + 30B216 + Hitachi Energy Germany AG - 84930C - Incoax Networks Europe AB + 88625D + BITNETWORKS CO.,LTD - 1CA2B1 - ruwido austria GmbH + 380716 + FREEBOX SAS - 384B76 - AIRTAME ApS + C836A3 + GERTEC BRASIL LTDA - 38B1DB - Hon Hai Precision Ind Ltd + F4EE31 + Cisco Systems, Inc - 34F6D2 - Panasonic Taiwan Ltd + 4045C4 + HUAWEI TECHNOLOGIES CO.,LTD - 64002D - Powerlinq Ltd + 74872E + HUAWEI TECHNOLOGIES CO.,LTD - B47C29 - Shenzhen Guzidi Technology Ltd + 3C1EB5 + Apple, Inc. - D48F33 - Microsoft Corporation + AC86A3 + Apple, Inc. - 54F876 - ABB AG + 001FD6 + Shenzhen Allywll - 34B7FD - Guangzhou Younghead Electronic Technology Ltd + 80D266 + ScaleFlux - B41780 - DTI Group Ltd + E42150 + Shanghai Chint low voltage electrical technology Co.,Ltd. - 489D18 - Flashbay Limited + D404E6 + Broadcom Limited - 90203A - BYD Precision Manufacture Ltd + 28EBA6 + Nex-T LLC - 80EACA - Dialog Semiconductor Hellas SA + C0B3C8 + LLC NTC Rotek - 20A99B - Microsoft Corporation + CC4D74 + Fujian Newland Payment Technology Co., Ltd. - 604826 - Newbridge Technologies Int Ltd + A031EB + Semikron Elektronik GmbH & Co. KG - 38F33F - Tatsuno Corporation + F8D758 + Veratron AG - D80CCF - C.G.V. S.A.S. + 24FE9A + CyberTAN Technology Inc. - 4CBB58 - Chicony Electronics Ltd + B4CBB8 + Universal Electronics, Inc. - A41242 - NEC Platforms Ltd + BC32B2 + Samsung Electronics Co.,Ltd - D00AAB - Yokogawa Digital Computer Corporation + EC8A48 + Arista Networks - C40006 - Lipi Data Systems Ltd + 141A97 + Apple, Inc. - 38262B - UTran Technology + 8C5DB2 + IEEE Registration Authority - 480C49 - NAKAYO Inc + 88CE3F + HUAWEI TECHNOLOGIES CO.,LTD - 3CD9CE - Eclipse WiFi + ECF8D0 + HUAWEI TECHNOLOGIES CO.,LTD - 6077E2 - Samsung Electronics Ltd + 30DF17 + ALPSALPINE CO,.LTD - FC1910 - Samsung Electronics Ltd + D8028A + Shenzhen YOUHUA Technology Co., Ltd - FC790B - Hitachi High Technologies America Inc. + B83C28 + Apple, Inc. - 6081F9 - Helium Systems Inc. + 3C6D89 + Apple, Inc. - 8401A7 - Greyware Automation Products Inc. + AC4500 + Apple, Inc. - 98F170 - Murata Manufacturing Ltd + E86538 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 686E48 - Prophet Electronic Technology Corp Ltd + 242A04 + Cisco Systems, Inc - 04C991 - Phistek Inc. + 141AAA + Metal Work SpA - 3CA10D - Samsung Electronics Ltd + CCDEDE + Nokia - 646CB2 - Samsung Electronics Ltd + 748669 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 680571 - Samsung Electronics Ltd + C80A35 + Qingdao Hisense Smart Life Technology Co., Ltd - 14B484 - Samsung Electronics Ltd + 886D2D + Huawei Device Co., Ltd. - F4C447 - Coagent International Enterprise Limited + 40FF40 + GloquadTech - C8E42F - Technical Research Design and Development + 24952F + Google, Inc. - C4C9EC - Gugaoo HK Limited + 10BE99 + Netberg - 34E42A - Automatic Bar Controls Inc. + 84D352 + Tonly Technology Co. Ltd - 3059B7 - Microsoft Corporation + 047056 + Arcadyan Corporation - 20A787 - Bointec Taiwan Corporation Limited + B894D9 + Texas Instruments - A0FC6E - Telegrafia a.s. + 7CE269 + Texas Instruments - 2053CA - Risk Technology Ltd + 0804B4 + Texas Instruments - A43D78 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 30AF7E + Texas Instruments - 04572F - Sertel Electronics UK Ltd + 84B1E4 + Apple, Inc. - D8977C - Grey Innovation + 54EBE9 + Apple, Inc. - BC8D0E - Nokia + AC1615 + Apple, Inc. - A49F85 - Lyve Minds Inc. + EC7379 + Apple, Inc. - 78923E - Nokia Corporation + 1CC316 + Xiamen Milesight IoT Co., Ltd. - ACA9A0 - Audioengine Ltd + FC2A46 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - A481EE - Nokia Corporation + 9CFA3C + Daeyoung Electronics - 78D66F - Aristocrat Technologies Australia Pty Ltd + 28CF51 + Nintendo Co.,Ltd - 441E91 - ARVIDA Intelligent Electronics Technology Ltd + FCB0DE + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - C4626B - ZPT Vigantice + 044A6A + niliwi nanjing big data Co,.Ltd - EC1766 - Research Centre Module + 64C6D2 + Seiko Epson Corporation - A0D12A - AXPRO Technology Inc. + 0C3526 + Microsoft Corporation - 209AE9 - Volacomm Ltd + 80616C + New H3C Technologies Co., Ltd - 345D10 - Wytek + 40B607 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 6C14F7 - Erhardt+Leimer GmbH + 782459 + Alcatel-Lucent Enterprise - B0D59D - Shenzhen Zowee Technology Ltd + F44D5C + Zyxel Communications Corporation - 6828BA - Dejai + 106838 + AzureWave Technology Inc. - B05706 - Vallox Oy + 78071C + Green Energy Options Ltd - 48EE07 - Silver Palm Technologies LLC + 1C8BEF + Beijing Xiaomi Electronics Co.,Ltd - 50C7BF - TP-Link Technologies Ltd + 28E297 + Shanghai InfoTM Microelectronics Co.,Ltd - 205A00 - Coval + 58F85C + LLC Proizvodstvennaya Kompania TransService - A8A668 - ZTE Corporation + 304449 + PLATH Signal Products GmbH & Co. KG - 00EEBD - HTC Corporation + ECC3B0 + zte corporation - 38F708 - National Resource Management Inc. + BCBD84 + zte corporation - E0DB88 - Open Standard Digital-IF Interface for SATCOM Systems + 5CB12E + Cisco Systems, Inc - A8BD3A - Unionman Technology Ltd + BC6BFF + Guangzhou Shiyuan Electronic Technology Company Limited - A824EB - ZAO NPO Introtest + 00301A + SMARTBRIDGES PTE. LTD. - C40E45 - ACK Networks,Inc. + B457E6 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 3C89A6 - Kapelse + 70033F + Pimax Technology(ShangHai)Co.,Ltd - A46CC1 - LTi REEnergy GmbH + 80F1A4 + HUAWEI TECHNOLOGIES CO.,LTD - A8B9B3 - Essys + A46C24 + HUAWEI TECHNOLOGIES CO.,LTD - 6C09D6 - Digiquest Electronics Ltd + 50D45C + Amazon Technologies Inc. - 481842 - Shanghai Winaas Co. Equipment Ltd + 44D506 + Sichuan Tianyi Comheart Telecom Co.,LTD - 447098 - Ming Hong Technology (Shen Zhen) Limited + 2C69CC + Valeo Detection Systems - 9CBD9D - SkyDisk Inc. + D46137 + IEEE Registration Authority - 74C621 - Zhejiang Hite Renewable Energy Ltd + 08085C + Luna Products - D4319D - Sinwatec + 2C8AC7 + Ubee Interactive Co., Limited - B068B6 - Hangzhou OyE Technology Ltd + 80DECC + HYBE Co.,LTD - 9C65F9 - AcSiP Technology Corp. + A0ED6D + Ubee Interactive Co., Limited - 487604 - Private + F8345A + Hitron Technologies. Inc - 2C534A - Shenzhen Winyao Electronic Limited + 70C932 + Dreame Technology (Suzhou) Limited - A4BBAF - Lime Instruments + 301984 + HUAWEI TECHNOLOGIES CO.,LTD - F490CA - Tensorcom + F8C249 + AMPERE COMPUTING LLC - E44C6C - Shenzhen Guo Wei Electronic Ltd + 648CBB + Texas Instruments - A8574E - TP-Link Technologies Ltd + 74B839 + Texas Instruments - B843E4 - Vlatacom + C4D36A + Texas Instruments - 282246 - Beijing Sinoix Communication Ltd + 988924 + Texas Instruments - 48B977 - PulseOn Oy + 341593 + Ruckus Wireless - 7071B3 - Brain Corporation + B08BBE + ABL GmbH - 64E625 - Woxu Wireless Ltd + 0CB937 + Ubee Interactive Co., Limited - 10B713 - Private + 440CEE + Robert Bosch Elektronikai Kft. - 100E7E - Juniper Networks + A017F1 + Allwinner Technology Co., Ltd - 208986 - ZTE Corporation + 2C6F4E + Hubei Yuan Times Technology Co.,Ltd. - 44C56F - NGN Easy Satfinder (Tianjin) Electronic Ltd + 488F4C + shenzhen trolink Technology Co.,Ltd - B898F7 - Gionee Communication Equipment LtdShenzhen + 744D6D + HUAWEI TECHNOLOGIES CO.,LTD - 848336 - Newrun + C435D9 + Apple, Inc. - 182012 - Aztech Associates Inc. + ACC906 + Apple, Inc. - B8266C - ANOV France + 04BC6D + Apple, Inc. - 3C300C - Dewar Electronics Pty Ltd + A8F1B2 + Allwinner Technology Co., Ltd - 98FFD0 - Lenovo Mobile Communication Technology Ltd + FCE9D8 + Amazon Technologies Inc. - A875E2 - Aventura Technologies Inc. + 642943 + D-Link Corporation - B87AC9 - Siemens Ltd + 585B69 + TVT CO., LTD - F06130 - Advantage Pharmacy Services LLC + B8B2F7 + DRIMAES INC. - 6C3C53 - SoundHawk Corp + C49894 + IEEE Registration Authority - 084027 - Gridstore Inc. + 8CFADD + HUAWEI TECHNOLOGIES CO.,LTD - 38BF2F - Espec Corp. + F89A25 + HUAWEI TECHNOLOGIES CO.,LTD - 44C4A9 - Opticom Communication LLC + 842388 + Ruckus Wireless - C4824E - Changzhou Uchip Electronics Ltd + 386504 + Honor Device Co., Ltd. - A47760 - Nokia Corporation + F8710C + Xiaomi Communications Co Ltd - C85663 - Sunflex Europe GmbH + 3C135A + Xiaomi Communications Co Ltd - 88FED6 - ShangHai WangYong Software Ltd + 90F82E + Amazon Technologies Inc. - 7C72E4 - Unikey Technologies + C084E0 + HUAWEI TECHNOLOGIES CO.,LTD - 7C2048 - KoamTac + 900117 + HUAWEI TECHNOLOGIES CO.,LTD - 8CB7F7 - Shenzhen UniStrong Science & Technology Ltd + E0B668 + zte corporation - 38B74D - Fijowave Limited + A49DDD + Samsung Electronics Co.,Ltd - 180C14 - iSonea Limited + 6C5563 + Samsung Electronics Co.,Ltd - 9CA9E4 - ZTE Corporation + 109F4F + New H3C Intelligence Terminal Co., Ltd. - 90F3B7 - Kirisun Communications Ltd + 389E80 + zte corporation - C4E92F - AB Sciex + D492B9 + ORION NOVA, S.L. - A88D7B - SunDroid Global limited. + 001BB5 + Cherry GmbH - 3CF748 - Shenzhen Linsn Technology Development Ltd + 68B8BB + Beijing Xiaomi Electronics Co.,Ltd - B07908 - Cummings Engineering + 14AC60 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - E47723 - ZTE Corporation + 1C2285 + Serrature Meroni SpA - 1C63B7 - OpenProducts 237 AB + 589351 + Huawei Device Co., Ltd. - 94B9B4 - Aptos Technology + 2CA7EF + OnePlus Technology (Shenzhen) Co., Ltd - 6C15F9 - Nautronix Limited + 50FDD5 + SJI Industry Company - 18AA45 - Fon Technology + D0F4F7 + Huawei Device Co., Ltd. - 902083 - General Engine Management Systems Ltd + D4E98A + Intel Corporate - 14B126 - Industrial Software Co + D42000 + IEEE Registration Authority - D850E6 - ASUSTek Computer Inc. + 704DE7 + TECNO MOBILE LIMITED - DC3EF8 - Nokia Corporation + 74D873 + GUANGDONG GENIUS TECHNOLOGY CO., LTD. - A49F89 - Shanghai Rui Rui Communication Technology Ltd + 682624 + Ergatta - 7060DE - LaVision GmbH + A0218B + ACE Antenna Co., ltd - 502E5C - HTC Corporation + 2084F5 + Yufei Innovation Software(Shenzhen) Co., Ltd. - FCFE77 - Hitachi Reftechno Inc. + 142103 + Calix Inc. - 70533F - Alfa Instrumentos Eletronicos Ltda. + 40B15C + HUAWEI TECHNOLOGIES CO.,LTD - 407A80 - Nokia Corporation + 28808A + HUAWEI TECHNOLOGIES CO.,LTD - 644214 - Swisscom Energy Solutions AG + 346679 + HUAWEI TECHNOLOGIES CO.,LTD - 0CA694 - Sunitec Enterprise Ltd + 448CAB + Beijing Flitlink Vientiane Technology Co., LTD - 184462 - Riava Networks Inc. + C4D496 + Shenzhen Excelsecu Data Technology Co.,Ltd - C03580 - A&R Tech + 6C97AA + AI TECHNOLOGY CO.,LTD. - D08A55 - Skullcandy + 6C6567 + BELIMO Automation AG - 344F3F - IO-Power Technology Ltd + D0DAD7 + Apple, Inc. - 146080 - ZTE Corporation + C4ACAA + Apple, Inc. - 9CBB98 - Shen Zhen RND Electronic Ltd + 4C24CE + Sichuan AI-Link Technology Co., Ltd. - 50C271 - Securetech Inc + 1C97FB + CoolBitX Ltd. - CC720F - Viscount Systems Inc. + 2C326A + Apple, Inc. - 742B62 - Fujitsu Limited + 6CB133 + Apple, Inc. - 643F5F - Exablaze + 28E71D + Arista Networks - 8C2F39 - IBA Dosimetry GmbH + 10E840 + ZOWEE TECHNOLOGY(HEYUAN) CO., LTD. - C0A0BB - D-Link International + 4405E8 + twareLAB - 2CCD69 - Aqavi.com + 78F1C6 + Cisco Systems, Inc - F45F69 - Matsufu Electronics distribution Company + 341B2D + Cisco Systems, Inc - 28A1EB - Etek Technology (Shenzhen) Ltd + 843C4C + Robert Bosch SRL - B8F828 - Changshu Gaoshida Optoelectronic Technology Ltd + 445ADF + MIKAMI & CO., LTD. - 3C1A57 - Cardiopulmonary Corp + 086E9C + Huawei Device Co., Ltd. - 541B5D - Techno-Innov + 4416FA + Samsung Electronics Co.,Ltd - 9CE7BD - Winduskorea Ltd + FC671F + Tuya Smart Inc. - 3842A6 - Ingenieurbuero Stahlkopf + 78C57D + Zyxel Communications Corporation - 248000 - Westcontrol AS + 8C3592 + Guangzhou Shiyuan Electronic Technology Company Limited - 1C4BB9 - SMG Enterprise LLC + A0465A + Motorola Mobility LLC, a Lenovo Company - 346178 - The Boeing Company + 64B5F2 + Samsung Electronics Co.,Ltd - 1446E4 - Avistel + 8C06CB + Toradex AG - D095C7 - Pantech Ltd + 38A89B + Fiberhome Telecommunication Technologies Co.,LTD - D02C45 - littleBits Electronics Inc. + 6437A4 + TOKYOSHUHA CO.,LTD. - 044F8B - Adapteva Inc. + 90CAFA + Google, Inc. - B4A82B - Histar Digital Electronics Ltd + DCAA43 + Shenzhen Terca Information Technology Co., Ltd. - 284D92 - Luminator + 447147 + Beijing Xiaomi Electronics Co.,Ltd - 54FB58 - WISEWARE, Lda + F4BBC7 + vivo Mobile Communication Co., Ltd. - 940BD5 - Himax Technologies Inc. + 00FBF9 + Axiado Corporation - E0D1E6 - Aliph dba Jawbone + 986610 + zte corporation - D82D9B - Shenzhen G.Credit Communication Technology Ltd + A8DC5A + Digital Watchdog - 709BFC - Bryton Inc. + 1C24CD + ASKEY COMPUTER CORP - ACE42E - SK hynix + 6C72E2 + amitek - 78FE41 - Socus networks + 04D9C8 + Hon Hai Precision Industry Co., Ltd. - 205721 - Salix Technology Ltd + 906560 + EM Microelectronic - 883612 - SRC Computers LLC + A0FB83 + Honor Device Co., Ltd. - 083571 - CASwell Inc. + DC0B09 + Cisco Systems, Inc - 9876B6 - Adafruit + 08F3FB + Cisco Systems, Inc - 503CC4 - Lenovo Mobile Communication Technology Ltd + A036BC + ASUSTek COMPUTER INC. - 2C7B84 - OOO Petr Telegin + 840BBB + MitraStar Technology Corp. - A4C0C7 - Shenzhen Hitom Communication Technology Co Ltd + E00871 + Dongguan Liesheng Electronic Co., Ltd. - 306112 - PAV GmbH + 9C956E + Microchip Technology Inc. - 789F4C - HOERBIGER Elektronik GmbH + 1073EB + Infiniti Electro-Optics - 18104E - Cedint-UPM + 2CA774 + Texas Instruments - 9C1465 - Edata Elektronik San. ve Tic. A.S. + 187A3E + Silicon Laboratories - 4C55CC - Zentri Pty Ltd + 300505 + Intel Corporate - 00C5DB - Datatech Sistemas Digitales Avanzados SL + B0DCEF + Intel Corporate - 8CF945 - Power Automation pte Ltd + 7413EA + Intel Corporate - F842FB - Yasuda Joho Ltd + 184E03 + HMD Global Oy - 887398 - K2E Tekpoint + 70B306 + Apple, Inc. - 2C922C - Kishu Giken Kogyou Company Ltd + B8496D + Apple, Inc. - D8FEE3 - D-Link International + 9C924F + Apple, Inc. - 58F387 - Hccp + 200E2B + Apple, Inc. - 3C977E - IPS Technology Limited + F0D793 + Apple, Inc. - A4FB8D - Hangzhou Dunchong Technology Ltd + DCF31C + Texas Instruments - F4CD90 - Vispiron Rotec GmbH + 544538 + Texas Instruments - 806C8B - Kaeser Kompressoren AG + 303D51 + IEEE Registration Authority - 043D98 - ChongQing QingJia Electronics Ltd + 38F0C8 + Logitech - E03E4A - Cavanagh Group International + 34FE1C + CHOUNG HWA TECH CO.,LTD - 041B94 - Host Mobility AB + 60CF69 + meerecompany - A0CEC8 - CE Link Limited + 4C627B + SmartCow AI Technologies Taiwan Ltd. - 907A28 - Beijing Morncloud Information And Technology Ltd + 28BC05 + BLU Products Inc - 1001CA - Ashley Butterworth + 1CEF03 + Guangzhou V-SOLUTION Electronic Technology Co., Ltd. - 246AAB - IT-IS International + 58B03E + Nintendo Co.,Ltd - FC4BBC - Sunplus Technology Ltd + AC4E65 + Fiberhome Telecommunication Technologies Co.,LTD - 50A0BF - Alba Fiber Systems Inc. + A88038 + ShenZhen MovingComm Technology Co., Limited - B836D8 - Videoswitch + BC5DA3 + Sichuan Tianyi Comheart Telecom Co.,LTD - DC6F00 - Livescribe Inc. + BC7B72 + Huawei Device Co., Ltd. - 54E3B0 - JVL Industri Elektronik + F82B7F + Huawei Device Co., Ltd. - 804B20 - Ventilation Control + 40C3BC + Huawei Device Co., Ltd. - 287994 - Realplay Digital Technology(Shenzhen) Ltd + 2853E0 + Sintela Ltd - 107A86 - U&U Engineering Inc. + D868A0 + Samsung Electronics Co.,Ltd - 40BD9E - Physio-Control Inc. + 04292E + Samsung Electronics Co.,Ltd - 6C5779 - Aclima Inc. + 345DA8 + Cisco Systems, Inc - C0DA74 - Hangzhou Sunyard Technology Ltd + E0806B + Xiaomi Communications Co Ltd - 18D6CF - Kurth Electronic GmbH + 7050E7 + IEEE Registration Authority - F48139 - Canon Inc. + 70AC08 + Silicon Laboratories - 1836FC - Elecsys International Corporation + 38FDF5 + Renesas Electronics (Penang) Sdn. Bhd. - 882364 - Watchnet DVR Inc + 3C26E4 + Cisco Systems, Inc - 581CBD - Affinegy + 3891B7 + Cisco Systems, Inc - 284FCE - Liaoning Wontel Science and Technology Development Ltd + DC360C + Hitron Technologies. Inc - 048D38 - Netcore Technology Inc. + 38127B + Crenet Labs Co., Ltd. - 2C9464 - Cincoze Ltd + B0E45C + Samsung Electronics Co.,Ltd - 3065EC - Wistron (ChongQing) + 88F2BD + GD Midea Air-Conditioning Equipment Co.,Ltd. - 542CEA - Protectron + 6C0831 + ANALOG SYSTEMS - 94B8C5 - RuggedCom Inc. + A47EFA + Withings - DC825B - JANUS, spol. s r.o. + 7891DE + Guangdong ACIGA Science&Technology Co.,Ltd - 9CA577 - Osorno Enterprises Inc. + BC4CA0 + HUAWEI TECHNOLOGIES CO.,LTD - C04301 - Epec Oy + 74342B + HUAWEI TECHNOLOGIES CO.,LTD - E07C62 - Whistle Labs Inc. + C412EC + HUAWEI TECHNOLOGIES CO.,LTD - F07F0C - Leopold Kostal GmbH &Co. KG + ACA32F + Solidigm Technology - 4C6255 - Sanmina-SCI System de Mexico S.A. de C.V. + 4C9E6C + BROADEX TECHNOLOGIES CO.LTD - 082719 - APS Systems/electronic AG + 8C9806 + SHENZHEN SEI ROBOTICS CO.,LTD - 505AC6 - Guangdong Super Telecom Ltd + 200889 + zte corporation - 9C79AC - Suntec Software(Shanghai) Ltd + 200BCF + Nintendo Co.,Ltd - 4C9614 - Juniper Networks + 7070FC + GOLD&WATER INDUSTRIAL LIMITED - B863BC - ROBOTIS Ltd + 98D93D + Demant Enterprise A/S - 980D2E - HTC Corporation + B4A678 + Zhejiang Tmall Technology Co., Ltd. - C419EC - Qualisys AB + ACC4BD + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 604A1C - SUYIN Corporation + E4B633 + Wuxi Stars Microsystem Technology Co., Ltd - D464F7 - Chengdu Usee Digital Technology Ltd + 085104 + Huawei Device Co., Ltd. - 74D02B - ASUSTek Computer Inc. + 785B64 + Huawei Device Co., Ltd. - 601E02 - EltexAlatau + 54E15B + Huawei Device Co., Ltd. - E0C6B3 - MilDef AB + 2426D6 + HUAWEI TECHNOLOGIES CO.,LTD - 6472D8 - GooWi Technology Ltd + EC819C + HUAWEI TECHNOLOGIES CO.,LTD - 60601F - SZ DJI Technology Ltd + C4A10E + IEEE Registration Authority - 5C8486 - Brightsource Industries Israel Ltd + 542F04 + Shanghai Longcheer Technology Co., Ltd. - 50CD32 - NanJing Chaoran Science & Technology Ltd + 1CA410 + Amlogic, Inc. - BCBAE1 - AREC Inc. + 98C81C + BAYTEC LIMITED - 18FA6F - ISC applied Systems Corp + 748469 + Nintendo Co.,Ltd - A01C05 - Nimax Telecom Ltd + 8CCBDF + FOXCONN INTERCONNECT TECHNOLOGY - 60E00E - Shinsei Electronics Ltd + 200B16 + Texas Instruments - 545414 - Digital RF Corea Inc. + 8801F9 + Texas Instruments - 24EB65 - SAET I.S. S.r.l. + F85548 + Texas Instruments - D0F27F - SteadyServ Technoligies LLC + 68E74A + Texas Instruments - E894F6 - TP-Link Technologies Ltd + 70A6BD + Honor Device Co., Ltd. - 188410 - CoreTrust Inc. + 846993 + HP Inc. - FC229C - Han Kyung I Net Ltd + 746F88 + zte corporation - 1832A2 - Laon Technology Ltd + 74718B + Apple, Inc. - D4A499 - InView Technology Corporation + 70317F + Apple, Inc. - 08482C - Raycore Taiwan Ltd + A4CF99 + Apple, Inc. - DC2BCA - Zera GmbH + 4C2EB4 + Apple, Inc. - 9498A2 - Shanghai LISTEN TECH Ltd + D0989C + ConMet - E0EDC7 - Shenzhen Friendcom Technology Development Ltd + 34AD61 + CELESTICA INC. - B4DD15 - ControlThings Oy Ab + 2C553C + Vecima Networks Inc. - DC1DD4 - Microstep-MIS spol. s r.o. + B41974 + Apple, Inc. - FCDD55 - Shenzhen WeWins wireless Ltd + 6095BD + Apple, Inc. - B01743 - Edison Global Circuits LLC + EC1127 + Texas Instruments - D0BE2C - CNSLink Ltd + 04E892 + SHENNAN CIRCUITS CO.,LTD - 40516C - Grandex International Corporation + BCE9E2 + Brocade Communications Systems LLC - C0885B - SnD Tech Ltd + 18A59C + IEEE Registration Authority - 3CFB96 - Emcraft Systems LLC + 10961A + CHIPSEA TECHNOLOGIES (SHENZHEN) CORP. - 846223 - Shenzhen Coship Electronics Ltd + ACBF71 + Bose Corporation - 1CFA68 - TP-Link Technologies Ltd + ACD31D + Cisco Meraki - 081F3F - WondaLink Inc. + 74563C + GIGA-BYTE TECHNOLOGY CO.,LTD. - 1853E0 - Hanyang Digitech Ltd + EC551C + HUAWEI TECHNOLOGIES CO.,LTD - 00C14F - DDL Ltd + B48351 + Intel Corporate - 2C26C5 - ZTE Corporation + BCF4D4 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 105F06 - Actiontec Electronics Inc. + CCF305 + SHENZHEN TIAN XING CHUANG ZHAN ELECTRONIC CO.,LTD - 087999 - AIM GmbH + 04B97D + AiVIS Co., Itd. - C011A6 - Fort-Telecom Ltd + C4C063 + New H3C Technologies Co., Ltd - C04A00 - TP-Link Technologies Ltd + E0798D + Silicon Laboratories - 045FA7 - Shenzhen Yichen Technology Development Ltd + 34BD20 + Hangzhou Hikrobot Technology Co., Ltd. - 94C962 - Teseq AG + AC2AA1 + Cisco Systems, Inc - DC2A14 - Shanghai Longjing Technology Co. + F8E94F + Cisco Systems, Inc - 6886E7 - Orbotix Inc. + 30894A + Intel Corporate - C05E6F - V. Stonkaus firma Kodinis Raktas + D89C8E + Comcast Cable Corporation - C0B8B1 - BitBox Ltd + E06CC5 + Huawei Device Co., Ltd. - F82EDB - RTW GmbH & Co. KG + 30963B + Huawei Device Co., Ltd. - 808B5C - Shenzhen Runhuicheng Technology Ltd + 8C6BDB + Huawei Device Co., Ltd. - D819CE - Telesquare + 10DA49 + Huawei Device Co., Ltd. - E0CEC3 - Askey Computer Corp + 60183A + Huawei Device Co., Ltd. - 38F597 - home2net GmbH + 18C007 + Huawei Device Co., Ltd. - 807B1E - Corsair Memory Inc. + 98597A + Intel Corporate - B4AB2C - MtM Technology Corporation + 64497D + Intel Corporate - 74372F - Tongfang Shenzhen Cloudcomputing Technology Ltd + B8D61A + Espressif Inc. - F0219D - Cal-Comp Electronics & Communications Company Ltd + BC6E6D + EM Microelectronic - 181725 - Cameo Communications Inc. + 00D49E + Intel Corporate - 8462A6 - EuroCB (Phils) Inc. + 3492C2 + Square Route Co., Ltd. - E4F365 - Time-O-Matic Inc. + 8C1759 + Intel Corporate - DCC0DB - Shenzhen Kaiboer Technology Ltd + 30CB36 + Belden Singapore Pte. Ltd. - AC5D10 - Pace Americas + 30BB7D + OnePlus Technology (Shenzhen) Co., Ltd - FC626E - Beijing MDC Telecom + 6C67EF + HUAWEI TECHNOLOGIES CO.,LTD - 84C8B1 - Incognito Software Systems Inc. + 88693D + HUAWEI TECHNOLOGIES CO.,LTD - E8A364 - Signal Path International / Peachtree Audio + 00991D + HUAWEI TECHNOLOGIES CO.,LTD - BC51FE - Swann Communications Pty Ltd + 283E0C + Preferred Robotics, Inc. - 88F490 - Jetmobile Pte Ltd + 04BC9F + Calix Inc. - 1C9179 - Integrated System Technologies Ltd + 6CA401 + essensys plc - A0BAB8 - Pixon Imaging + B04A6A + Samsung Electronics Co.,Ltd - 74E424 - Apiste Corporation + A8798D + Samsung Electronics Co.,Ltd - 2411D0 - Chongqing Ehs Science and Technology Development Ltd + 5CEDF4 + Samsung Electronics Co.,Ltd - B461FF - Lumigon A/S + 283DC2 + Samsung Electronics Co.,Ltd - A0A130 - DLI Taiwan Branch Office + B42875 + Futecho Solutions Private Limited - 30215B - Shenzhen Ostar Display Electronic Ltd + 302364 + Nokia Shanghai Bell Co., Ltd. - 34FA40 - Guangzhou Robustel Technologies Ltd + 4851D0 + Jiangsu Xinsheng Intelligent Technology Co., Ltd. - 1C5A6B - Philips Electronics Nederland BV + DC9A7D + HISENSE VISUAL TECHNOLOGY CO.,LTD - A875D6 - FreeTek International Ltd + 84F1D0 + EHOOME IOT PRIVATE LIMITED - ECE915 - STI Ltd + 208BD1 + NXP Semiconductor (Tianjin) LTD. - 80D733 - QSR Automations Inc. + 2C07F6 + SKG Health Technologies Co., Ltd. - 303D08 - Glintt TES S.A. + 3868BE + Sichuan Tianyi Comheart Telecom Co.,LTD - A81FAF - Krypton Polska + 28A53F + vivo Mobile Communication Co., Ltd. - 30D357 - Logosol Inc. + 8C49B6 + vivo Mobile Communication Co., Ltd. - BC39A6 - CSUN System Technology Ltd + 8077A4 + TECNO MOBILE LIMITED - ECB541 - SHINANO E and E Ltd + 7C6CF0 + Shenzhen TINNO Mobile Technology Corp. - D410CF - Huanshun Network Science and Technology Ltd + 00C30A + Xiaomi Communications Co Ltd - 6CB311 - Shenzhen Lianrui Electronics Ltd + 8852EB + Xiaomi Communications Co Ltd - 10A743 - SK Mtek Limited + 0857FB + Amazon Technologies Inc. - 547FA8 - TELCO Systems, s.r.o. + 00D0FC + GRANITE MICROSYSTEMS - 5474E6 - Webtech Wireless + B0DE28 + Apple, Inc. - C46DF1 - DataGravity + 7C131D + SERNET (SUZHOU) TECHNOLOGIES CORPORATION - 304449 - PLATH GmbH + D49FDD + Huawei Device Co., Ltd. - 94FD2E - Shanghai Uniscope Technologies Ltd + 00D8A2 + Huawei Device Co., Ltd. - E4C146 - Objetivos y Servicios de Valor A + DC6B1B + Huawei Device Co., Ltd. - D40057 - MC Technologies GmbH + 98CA20 + Shanghai SIMCOM Ltd. - 5CE0F6 - NIC.br- Nucleo de Informacao e Coordenacao do Ponto BR + D850A1 + Hunan Danuo Technology Co.,LTD - C83D97 - Nokia Corporation + 441AAC + Elektrik Uretim AS EOS - 0CF361 - Java Information + 342840 + Apple, Inc. - 600F77 - SilverPlus Inc. + 18E7B0 + Apple, Inc. - B0358D - Nokia Corporation + 50578A + Apple, Inc. - F8E4FB - Actiontec Electronics Inc. + D4FB8E + Apple, Inc. - 8C4AEE - Giga TMS Inc + 2C784C + Iton Technology Corp. - 34C99D - Eidolon Communications Technology Ltd + 488759 + Xiaomi Communications Co Ltd - ACE64B - Shenzhen Baojia Battery Technology Ltd + AC1E9E + Xiaomi Communications Co Ltd - 789F87 - Siemens AG I IA PP PRM + D01B1F + OHSUNG - 08E5DA - Nanjing Fujitsu Computer Products Ltd + E0AEA2 + HUAWEI TECHNOLOGIES CO.,LTD - 5884E4 - IP500 Alliance e.V. + 44456F + SHENZHEN ONEGA TECHNOLOGY CO.,LTD - 044BFF - GuangZhou Hedy Digital Technology Ltd + E8FDF8 + Shanghai High-Flying Electronics Technology Co., Ltd - E8718D - Elsys Equipamentos Eletronicos Ltda + C01803 + HP Inc. - D0738E - Dong OH Precision Ltd + 04CF4B + Intel Corporate - 64C944 - LARK Technologies Inc. + FC38C4 + China Grand Communications Co.,Ltd. - 0C93FB - BNS Solutions + 5CF51A + Zhejiang Dahua Technology Co., Ltd. - E44F5F - EDS Elektronik Destek San.Tic LtdSti + 101D51 + 8Mesh Networks Limited - E86D54 - Digit Mobile Inc + 34976F + Rootech, Inc. - 90B11C - Dell Inc. + 6C6C0F + HUAWEI TECHNOLOGIES CO.,LTD - 005D03 - Xilinx Inc. + CC8CBF + Tuya Smart Inc. - 802FDE - Zurich Instruments AG + F897A9 + Ericsson AB - 5C38E0 - Shanghai Super Electronics Technology Ltd + AC93C4 + GD Midea Air-Conditioning Equipment Co.,Ltd. - 08AF78 - Totus Solutions Inc. + 000688 + Telways Communication Co., Ltd. - C8C791 - Zero1.tv GmbH + A81306 + vivo Mobile Communication Co., Ltd. - ECD925 - Rami + 1C34F1 + Silicon Laboratories - 1C9492 - RUAG Schweiz AG + CC7D5B + Telink Semiconductor (Shanghai) Co., Ltd. - B889CA - ILJIN ELECTRIC Ltd + 749552 + Xuzhou WIKA Electronics Control Technology Co., Ltd. - 64F50E - Kinion Technology Company Limited + 44EA30 + Samsung Electronics Co.,Ltd - D04CC1 - SINTRONES Technology Corp. + 845F04 + Samsung Electronics Co.,Ltd - 503F56 - Syncmold Enterprise Corp + 9C2F9D + Liteon Technology Corporation - 8CEEC6 - Precepscion Pty Ltd + A4F33B + zte corporation - 101248 - ITG Inc. + 30E7BC + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 1848D8 - Fastback Networks + 4CFE2E + DongGuan Siyoto Electronics Co., Ltd - F0D3E7 - Sensometrix SA + 0C4EC0 + Maxlinear Inc - B01266 - Futaba-Kikaku + 901195 + Amazon Technologies Inc. - 7CC8D0 - Tianjin Yaan Technology Ltd + 7CB566 + Intel Corporate - 88E917 - Tamaggo + 40329D + Union Image Co.,Ltd - 88615A - Siano Mobile Silicon Ltd + 50A030 + IEEE Registration Authority - 70E24C - SAE IT-Systems GmbH & Co. KG + 6C4BB4 + HUMAX Co., Ltd. - 00FD4C - Nevatec + 589BF7 + Hefei Radio Communication Technology Co., Ltd - 144319 - Creative & Link Technology Limited + 000E24 + Huwell Technology Inc. - D8AF3B - Hangzhou Bigbright Integrated Communications System Ltd + 4C7713 + Renesas Electronics (Penang) Sdn. Bhd. - 6032F0 - Mplus technology + D8AA59 + Tonly Technology Co. Ltd - 2829D9 - GlobalBeiMing technology (Beijing) Ltd + 64CF13 + Weigao Nikkiso(Weihai)Dialysis Equipment Co.,Ltd - 1CC316 - MileSight Technology Ltd + 50E9DF + Quectel Wireless Solutions Co.,Ltd. - 6815D3 - Zaklady Elektroniki i Mechaniki Precyzyjnej R&G S.A. + E8FA23 + Huawei Device Co., Ltd. - 10F3DB - Gridco Systems Inc. + EC3A52 + Huawei Device Co., Ltd. - 305D38 - Beissbarth + 441B88 + Apple, Inc. - 60D2B9 - Realand BIO Ltd + 80045F + Apple, Inc. - 30FD11 - Macrotech (USA) Inc. + 9C3E53 + Apple, Inc. - C4DA26 - Noblex SA + C889F3 + Apple, Inc. - 7CC8AB - Acro Associates Inc. + 10B9C4 + Apple, Inc. - 601929 - Voltronic Power Technology(Shenzhen) Corp. + 60109E + HUAWEI TECHNOLOGIES CO.,LTD - 48B253 - Marketaxess Corporation + 480286 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 74943D - AgJunction + 94DEB8 + Silicon Laboratories - 58CF4B - Lufkin Industries + 040D84 + Silicon Laboratories - 68B43A - WaterFurnace International Inc. + 9C7403 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 4C7897 - Arrowhead Alarm Products Ltd + 3CECDE + FUJIAN STAR-NET COMMUNICATION CO.,LTD - 44E8A5 - Myreka Technologies Sdn. Bhd. + 9C6B00 + ASRock Incorporation - D8AFF1 - Panasonic Appliances Company + 54F82A + u-blox AG - 2C6289 - Regenersis (Glenrothes) Ltd + D43538 + Beijing Xiaomi Mobile Software Co., Ltd - 58ECE1 - Newport Corporation + 10CE02 + Amazon Technologies Inc. - 4C09B4 - ZTE Corporation + 98672E + Skullcandy - 60D1AA - Vishal Telecommunications Pvt Ltd + A83A48 + Ubiqcom India Pvt Ltd - 709BA5 - Shenzhen Y&D Electronics Ltd + C85ACF + HP Inc. - F45433 - Rockwell Automation + FC29E3 + Infinix mobility limited - B48910 - Coster T.E. S.P.A. + 9C1C6D + HEFEI DATANG STORAGE TECHNOLOGY CO.,LTD - B0C83F - Jiangsu Cynray IOT Ltd + 641ABA + Dryad Networks GmbH - 3CF392 - Virtualtek Ltd + 0013DC + IBTEK INC. - B482C5 - Relay2 Inc. + D84A2B + zte corporation - 985E1B - ConversDigital Ltd + D0F99B + zte corporation - D48CB5 - Cisco Systems Inc. + F41399 + Aerospace new generation communications Co.,Ltd - 909DE0 - Newland Design + Assoc Inc. + 94A9A8 + Texas Instruments - 149FE8 - Lenovo Mobile Communication Technology Ltd + 48B423 + Amazon Technologies Inc. - BCD940 - ASR Ltd + 7070AA + Amazon Technologies Inc. - 049C62 - BMT Medical Technology s.r.o. + 642FC7 + New H3C Technologies Co., Ltd - 0C2A69 - electric imp Inc.orporated + 6026AA + Cisco Systems, Inc - C455C2 - Bach-Simpson + 5C3192 + Cisco Systems, Inc - 00E8AB - Meggitt Training Systems Inc. + 88C227 + HUAWEI TECHNOLOGIES CO.,LTD - B4218A - Dog Hunter LLC + 8054D9 + HUAWEI TECHNOLOGIES CO.,LTD - B4A4B5 - Zen Eye Ltd + 9C8566 + Wingtech Mobile Communications Co.,Ltd. - DC37D2 - Hunan HKT Electronic Technology Ltd + B03366 + vivo Mobile Communication Co., Ltd. - 407074 - Life Technology (China) Ltd + 7CC225 + Samsung Electronics Co.,Ltd - 20F002 - MTData Developments Pty Ltd + D413F8 + Peplink International Ltd. - 388AB7 - ITC Networks + 001117 + CESNET - BCC23A - Thomson Video Networks + 9CEC61 + Huawei Device Co., Ltd. - 1CF4CA - Private + 747069 + Huawei Device Co., Ltd. - ACC2EC - CLT Int'l Ind. Corp. + 14FB70 + Huawei Device Co., Ltd. - A865B2 - Dongguan Yishang Electronic Technology Ltd + 84D3D5 + Huawei Device Co., Ltd. - E8D0FA - MKS Instruments Deutschland GmbH + 9C00D3 + SHENZHEN IK WORLD Technology Co., Ltd - 98262A - Applied Research Associates Inc. + 282D06 + AMPAK Technology,Inc. - 3C9174 - Along Communication Technology + 202B20 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - ACEE3B - 6harmonics Inc + A0A309 + Apple, Inc. - 1C6BCA - Mitsunami Ltd + 5C50D9 + Apple, Inc. - 642400 - Xorcom Ltd + E8CAC8 + Hui Zhou Gaoshengda Technology Co.,LTD - E83EFB - Geodesic Ltd + D419F6 + NXP Semiconductor (Tianjin) LTD. - ECD19A - Zhuhai Liming Industries Ltd + 64BF6B + HUAWEI TECHNOLOGIES CO.,LTD - 348137 - Unicard SA + 30499E + HUAWEI TECHNOLOGIES CO.,LTD - 38B12D - Sonotronic Nagel GmbH + 884D7C + Apple, Inc. - 549D85 - EnerAccess Inc + A8FE9D + Apple, Inc. - B0750C - QA Cafe + DC973A + Verana Networks - B4E1EB - Private + FC7692 + Semptian Co.,Ltd. - 3C363D - Nokia Corporation + FCAFBE + TireCheck GmbH - 808698 - Netronics Technologies Inc. + 1848BE + Amazon Technologies Inc. - 9CE10E - NCTech Ltd + 886EE1 + Erbe Elektromedizin GmbH - A06D09 - Intelcan Technosystems Inc. + C475AB + Intel Corporate - 60F3DA - Logic Way GmbH + C8418A + Samsung Electronics.,LTD - FC5090 - SIMEX Sp. z o.o. + 547D40 + Powervision Tech Inc. - 60B982 - RO.VE.R. Laboratories S.p.A. + C0D7AA + Arcadyan Corporation - B46238 - Exablox + ACACE2 + CHANGHONG (HONGKONG) TRADING LIMITED - C8BBD3 - Embrane + 80B745 + The Silk Technologies ILC LTD - 8C604F - Cisco Systems Inc. + F89E94 + Intel Corporate - A4B980 - Parking BOXX Inc. + C403A8 + Intel Corporate - A47C14 - ChargeStorm AB + 0CB088 + AITelecom - 8020AF - Trade FIDES, a.s. + 2066FD + CONSTELL8 NV - 2C750F - Shanghai Dongzhou-Lawton Communication Technology Ltd + 644212 + Shenzhen Water World Information Co.,Ltd. - 5C5015 - Cisco Systems Inc. + 4CABF8 + ASKEY COMPUTER CORP - 980284 - Theobroma Systems GmbH + 8C5646 + LG Electronics - 1CD40C - Kriwan Industrie-Elektronik GmbH + CC7190 + VIETNAM POST AND TELECOMMUNICATION INDUSTRY TECHNOLOGY JOINT STOCK COMPANY - 002D76 - TITECH GmbH + 48BD4A + HUAWEI TECHNOLOGIES CO.,LTD - F8DB4C - PNY Technologies Inc. + A8D4E0 + HUAWEI TECHNOLOGIES CO.,LTD - 0C9D56 - Consort Controls Ltd + A0406F + HUAWEI TECHNOLOGIES CO.,LTD - 3CB87A - Private + 004F1A + HUAWEI TECHNOLOGIES CO.,LTD - AC1461 - ATAW Ltd + 7433A6 + Shenzhen SuperElectron Technology Co.,Ltd. - E4C6E6 - Mophie LLC + 2C0DA7 + Intel Corporate - 502D1D - Nokia Corporation + D463DE + vivo Mobile Communication Co., Ltd. - F48E09 - Nokia Corporation + D4B7D0 + Ciena Corporation - 5848C0 - Coflec + 1400E9 + Mitel Networks Corporation - 8C57FD - LVX Western + 0C9043 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 54E63F - Shenzhen LingKeWeiEr Technology Ltd + 541F8D + zte corporation - 20FABB - Cambridge Executive Limited + 2CF1BB + zte corporation - 141A51 - Treetech Sistemas Digitais + BC2CE6 + Cisco Systems, Inc - 587FC8 - S2M + CCED4D + Cisco Systems, Inc - 200505 - Radmax Communication Private Limited + 18A9A6 + Nebra Ltd - C035BD - Velocytech Aps + B0F7C4 + Amazon Technologies Inc. - 287184 - Spire Payments + 4C8D53 + HUAWEI TECHNOLOGIES CO.,LTD - 7CB03E - OSRAM GmbH + DC2C6E + Routerboard.com - 3C9F81 - Shenzhen CATIC Bit Communications Technology Ltd + C4BDE5 + Intel Corporate - 445F7A - Shihlin Electric & Engineering Corp. + 3429EF + Qingdao Haier Technology Co.,Ltd - 441319 - WKK Technology Ltd + 541D61 + YEESTOR Microelectronics Co., Ltd - 18B591 - I-Storm + 700971 + Samsung Electronics Co.,Ltd - BC8B55 - NPP ELIKS America Inc. DBA T&M Atlantic + D01B49 + Samsung Electronics Co.,Ltd - C0493D - Maitrise Technologique + FC5F49 + Zhejiang Dahua Technology Co., Ltd. - C84544 - Asia Pacific CIS (Wuxi) Ltd + 3035C5 + Huawei Device Co., Ltd. - E0EF25 - Lintes Technology Ltd + 18EF3A + Sichuan AI-Link Technology Co., Ltd. - 50ED94 - Egatel SL + A0FF22 + SHENZHEN APICAL TECHNOLOGY CO., LTD - 48A22D - Shenzhen Huaxuchang Telecom Technology Ltd + F820A9 + Huawei Device Co., Ltd. - C86000 - ASUSTek Computer Inc. + 649E31 + Beijing Xiaomi Mobile Software Co., Ltd - AC0DFE - Ekon GmbH - myGEKKO + 6CB0FD + Shenzhen Xinghai Iot Technology Co.,Ltd - FC5B26 - MikroBits + 24CD8D + Murata Manufacturing Co., Ltd. - 40F407 - Nintendo Ltd + 5C0214 + Beijing Xiaomi Mobile Software Co., Ltd - B01C91 - Elim Co + E42805 + Pivotal Optics - 04F17D - Tarana Wireless + 381F8D + Tuya Smart Inc. - 844915 - vArmour Networks Inc. + 208C47 + Tenstorrent Inc - 2CBE97 - Ingenieurbuero Bickele und Buehler GmbH + 0080E7 + Leonardo UK Ltd - 70A66A - Prox Dynamics AS + 3C9FC3 + Beijing Sinead Technology Co., Ltd. - DC3E51 - Solberg & Andersen AS + 00B0EC + EACEM - 900A3A - PSG Plastic Service GmbH + 6CD3EE + ZIMI CORPORATION - 28CD1C - Espotel Oy + 04CD15 + Silicon Laboratories - D443A8 - Changzhou Haojie Electric Ltd + 785EA2 + Sunitec Enterprise Co.,Ltd - BCE59F - WATERWORLD Technology Ltd + B0BE83 + Apple, Inc. - 7041B7 - Edwards Lifesciences LLC + 10321D + HUAWEI TECHNOLOGIES CO.,LTD - DCA8CF - New Spin Golf LLC. + E4936A + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - A849A5 - Lisantech Ltd + 4877BD + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - A05E6B - MELPER Ltd + F856C3 + zte corporation - D878E5 - Kuhn SA + 38FDF8 + Cisco Systems, Inc - D824BD - Cisco Systems Inc. + DCF4CA + Apple, Inc. - 3497FB - Advanced RF Technologies Inc + 7CFC16 + Apple, Inc. - F03A55 - Omega Elektronik AS + 88B945 + Apple, Inc. - 98BC57 - SVA Technologies Ltd + 18E1DE + Chengdu ChipIntelli Technology Co., Ltd - DC3C2E - Manufacturing System Insights Inc. + 8CF681 + Silicon Laboratories - F83553 - Magenta Research Ltd + 7C66EF + Hon Hai Precision IND.CO.,LTD - F4044C - ValenceTech Limited + 00A388 + SKY UK LIMITED - C467B5 - Libratone A/S + 7CC177 + INGRAM MICRO SERVICES - 4C3910 - Newtek Electronics Ltd + 7876D9 + EXARA Group - 903AA0 - Nokia + 94A408 + Shenzhen Trolink Technology CO, LTD - B06CBF - 3ality Digital Systems GmbH + 7C8437 + China Post Communications Equipment Co., Ltd. - 54D0ED - AXIM Communications + B84D43 + HUNAN FN-LINK TECHNOLOGY LIMITED - 843611 - hyungseul Publishing networks + D0F865 + ITEL MOBILE LIMITED - 3440B5 - IBM + C89F1A + HUAWEI TECHNOLOGIES CO.,LTD - D4D748 - Cisco Systems Inc. + D86852 + HUAWEI TECHNOLOGIES CO.,LTD - 344F69 - Ekinops SAS + AC6490 + HUAWEI TECHNOLOGIES CO.,LTD - F8313E - endeavour GmbH + A84A63 + TPV Display Technology(Xiamen) Co.,Ltd. - 143605 - Nokia Corporation + 608FA4 + Nokia Solutions and Networks GmbH & Co. KG - C81AFE - DLOGIC GmbH + 243FAA + Huawei Device Co., Ltd. - EC63E5 - ePBoard Design LLC + D867D3 + Huawei Device Co., Ltd. - 94DB49 - Sitcorp + 48474B + Huawei Device Co., Ltd. - F0620D - Shenzhen Egreat Tech Corp Ltd + 806F1C + Huawei Device Co., Ltd. - 2C67FB - Shenzhen Zhengjili Electronics Ltd + E0A258 + Wanbang Digital Energy Co.,Ltd - 3CE5B4 - Kidasen Industria E Comercio de Antenas Ltda + 4CBCE9 + LG Innotek - 08D09F - Cisco Systems Inc. + 385C76 + PLANTRONICS, INC. - 644BF0 - CalDigit Inc. + 9C50D1 + Murata Manufacturing Co., Ltd. - 64ED62 - WOORI SysTEMS Ltd + 140020 + LongSung Technology (Shanghai) Co.,Ltd. - 2C002C - Unowhy + 30B930 + zte corporation - 5CC9D3 - Palladium Energy Eletronica DA Amazonia Ltda + 949869 + zte corporation - C87CBC - Valink Ltd + 503DEB + Zhejiang Tmall Technology Co., Ltd. - B81413 - Keen High Holding(HK) Ltd + F87FA5 + GREATEK - B4944E - WeTelecom Ltd + 745CFA + Shenzhen Shunrui Gaojie Technology Co., Ltd. - E00B28 - Inovonics + 5CDFB8 + Shenzhen Unionmemory Information System Limited - 48022A - B-Link Electronic Limited + 2C1A05 + Cisco Systems, Inc - 18E80F - Viking Electronics Inc. + B40ECF + Bouffalo Lab (Nanjing) Co., Ltd. - CC6BF1 - Sound Masking Inc. + F83869 + LG Electronics - 2C9717 - I.C.Y. B.V. + 2C0547 + Shenzhen Phaten Tech. LTD - 2C3F38 - Cisco Systems Inc. + E0C58F + China Mobile IOT Company Limited - 4050E0 - Milton Security Group LLC + E00AF6 + Liteon Technology Corporation - 70CA9B - Cisco Systems Inc. + F05ECD + Texas Instruments - A078BA - Pantech Ltd + 2C3A91 + Huawei Device Co., Ltd. - 68BC0C - Cisco Systems Inc. + 64F705 + Huawei Device Co., Ltd. - 345B11 - EVI Heat AB + 785005 + MOKO TECHNOLOGY Ltd - 78BAD0 - Shinybow Technology Ltd + F0B61E + Intel Corporate - 24E6BA - JSC Zavod im. Kozitsky + C84D44 + Shenzhen Jiapeng Huaxiang Technology Co.,Ltd - CCA374 - Guangdong Guanglian Electronic Technology Ltd + A029BD + Team Group Inc - 58677F - Clare Controls Inc. + 64DCDE + ZheJiang FuChunJiang Information Technology Co.,Ltd - 0C5A19 - Axtion Sdn Bhd + 00919E + Intel Corporate - A8BD1A - Honey Bee (Hong Kong) Limited + 60CE41 + HUAWEI TECHNOLOGIES CO.,LTD - 248707 - SEnergy Corporation + 281709 + HUAWEI TECHNOLOGIES CO.,LTD - C4C19F - National Oilwell Varco Instrumentation, Monitoring, and Optimization (NOV IMO) + 606EE8 + Xiaomi Communications Co Ltd - 000830 - Cisco Systems Inc. + D0B66F + SERNET (SUZHOU) TECHNOLOGIES CORPORATION - C4EEAE - VSS Monitoring + 3009C0 + Motorola Mobility LLC, a Lenovo Company - F8D3A9 - AXAN Networks + 50F908 + Wizardlab Co., Ltd. - BC779F - SBM Ltd + 50C2E8 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 406AAB - RIM + B04692 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 9CA3BA - SAKURA Internet Inc. + AC764C + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 8C8A6E - Estun Automation Technoloy Ltd + 5C58E6 + Palo Alto Networks - 988217 - Disruptive Ltd + 0CE159 + Shenzhen iStartek Technology Co., Ltd. - 9C5C8D - Firemax Industria E Comercio de Produtos Eletronicos Ltda + 001413 + Trebing & Himstedt Prozeßautomation GmbH & Co. KG - D4206D - HTC Corporation + 000799 + Tipping Point Technologies, Inc. - 7C1E52 - Microsoft Corporation + DC8D8A + Nokia Solutions and Networks GmbH & Co. KG - DCB4C4 - Microsoft XCG + 7086CE + GD Midea Air-Conditioning Equipment Co.,Ltd. - ACCB09 - Hefcom Metering (Pty) Ltd + 500F59 + STMicrolectronics International NV - 1866E3 - Veros Systems Inc. + E42AAC + Microsoft Corporation - 74FDA0 - Compupal (Group) Corporation + 20E7B6 + Universal Electronics, Inc. - CCB8F1 - Eagle Kingdom Technologies Limited + D43DF3 + Zyxel Communications Corporation - A429B7 - bluesky + 20579E + HUNAN FN-LINK TECHNOLOGY LIMITED - 48F317 - Private + C884CF + HUAWEI TECHNOLOGIES CO.,LTD - CCF8F0 - Xi'an HISU Multimedia Technology Ltd + E023D7 + Sleep Number - 04888C - Eifelwerk Butler Systeme GmbH + 241D48 + Sichuan Tianyi Comheart Telecom Co.,LTD - D45AB2 - Galleon Systems + 287777 + zte corporation - 30DE86 - Cedac Software S.r.l. + 60E32B + Intel Corporate - 18C451 - Tucson Embedded Systems + D8BE65 + Amazon Technologies Inc. - 704642 - Chyng Hong Electronic Ltd + 28DEA8 + zte corporation - D41C1C - RCF S.P.A. + 808ABD + Samsung Electronics Co.,Ltd - 58920D - Kinetic Avionics Limited + 3CCD57 + Beijing Xiaomi Mobile Software Co., Ltd - AC02EF - Comsis + 806A10 + Whisker Labs - Ting - B8B42E - Gionee Communication Equipment LtdShenzhen + C0F827 + Rapidmax Technology Corporation - 443EB2 - DEOTRON Ltd + 245E48 + Apple, Inc. - D059C3 - CeraMicro Technology Corporation + 08C729 + Apple, Inc. - 182C91 - Concept Development Inc. + C4C36B + Apple, Inc. - FC1794 - InterCreative Ltd + E8A730 + Apple, Inc. - B40B7A - Brusa Elektronik AG + 6006E3 + Apple, Inc. - 280CB8 - Mikrosay Yazilim ve Elektronik A.S. + 106FD9 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 3CC99E - Huiyang Technology Ltd + 584D42 + Dragos, Inc. - 2C1EEA - Aerodev + 608A10 + Microchip Technology Inc. - 1C8E8E - DB Communication & Systems Ltd + A864F1 + Intel Corporate - 24EC99 - Askey Computer Corp + D01E1D + SaiNXT Technologies LLP - A44B15 - Sun Cupid Technology (HK) Ltd + E06781 + Dongguan Liesheng Electronic Co., Ltd. - 48C862 - Simo Wireless,Inc. + B8DAE8 + Huawei Device Co., Ltd. - 78BEB6 - Enhanced Vision + B8AE1D + Guangzhou Xingyi Electronic Technology Co.,Ltd - 449CB5 - Alcomp Inc. + D4548B + Intel Corporate - B4FC75 - SEMA Electronics(HK) Ltd + 1009F9 + Amazon Technologies Inc. - B0BF99 - Wizitdongdo + D03E7D + CHIPSEA TECHNOLOGIES (SHENZHEN) CORP. - B82ADC - EFR Europaische Funk-Rundsteuerung GmbH + 906976 + Withrobot Inc. - 40F14C - ISE Europe SPRL + FC9257 + Renesas Electronics (Penang) Sdn. Bhd. - E8944C - Cogent Healthcare Systems Ltd + 60DB15 + New H3C Technologies Co., Ltd - 9067F3 - Alcatel Lucent + 5CA721 + New H3C Technologies Co., Ltd - D4F0B4 - Napco Security Technologies + A42A71 + Sichuan Tianyi Comheart Telecom Co.,LTD - 68F895 - Redflow Limited + 60A5E2 + Intel Corporate - 70B921 - Fiberhome Telecommunication Technologies Ltd + 48F8FF + CHENGDU KT ELECTRONIC HI-TECH CO.,LTD - A0E295 - DAT System Ltd + E8C1E8 + Shenzhen Xiao Bi En Culture Education Technology Co.,Ltd. - A0165C - Triteka Ltd + 7C70DB + Intel Corporate - 9C417C - Hame Technology Ltd + 8C94CC + SFR - 9C6ABE - QEES ApS. + 98F217 + Castlenet Technology Inc. - 9C934E - Xerox Corporation + 84EBEF + Cisco Systems, Inc - 044665 - Murata Manufacturing Ltd + A82316 + Nokia - 2C2172 - Juniper Networks + 38E39F + Motorola Mobility LLC, a Lenovo Company - 900917 - Far-sighted mobile + 908060 + Nilfisk A/S - 2C8BF2 - Hitachi Metals America Ltd + 70A6CC + Intel Corporate - D8973B - Artesyn Embedded Technologies + 6C433C + TECNO MOBILE LIMITED - 3826CD - Andtek + 78BB88 + Maxio Technology (Hangzhou) Ltd. - 88BFD5 - Simple Audio Ltd + 446752 + Wistron INFOCOMM (Zhongshan) CORPORATION - 24CBE7 - MYK Inc. + 60B6E1 + Texas Instruments - B0A10A - Pivotal Systems Corporation + 6C79B8 + Texas Instruments - 802DE1 - Solarbridge Technologies + 8CA399 + SERVERCOM (INDIA) PRIVATE LIMITED - F4A52A - Hawa Technologies Inc + D48DD9 + Meld Technology, Inc - 0C6E4F - PrimeVOLT Ltd + ACE77B + Sichuan Tianyi Comheart Telecom Co.,LTD - E8B748 - Cisco Systems Inc. + 40F420 + Sichuan Tianyi Comheart Telecom Co.,LTD - BC99BC - FonSee Technology Inc. + 645D92 + Sichuan Tianyi Comheart Telecom Co.,LTD - 783F15 - EasySYNC Ltd + 8CFD15 + Imagine Marketing Private Limited - 18D071 - Dasan Ltd + 14223B + Google, Inc. - 58E476 - Centron Communications Technologies Fujian Ltd + C4FF22 + Huawei Device Co., Ltd. - 447E95 - Alpha and Omega Inc. + A0A0DC + Huawei Device Co., Ltd. - 986022 - EMW Ltd + C4808A + Cloud Diagnostics Canada ULC - B8D49D - M Seven System Ltd + 2CDDE9 + Arista Networks - 3C672C - Sciovid Inc. + 709741 + Arcadyan Corporation - DC9B1E - Intercom Inc. + E408E7 + Quectel Wireless Solutions Co.,Ltd. - BC5FF4 - ASRock Incorporation + 0C8DCA + Samsung Electronics Co.,Ltd - E8B4AE - Shenzhen C&D Electronics Ltd + CC0DE7 + B METERS S.R.L. - 50FAAB - L-tek d.o.o. + 4456E2 + Sichuan Tianyi Comheart Telecom Co.,LTD - 3891FB - Xenox Holding BV + 683A48 + SAMJIN Co., Ltd. - A8E018 - Nokia Corporation + CCA260 + Sichuan Tianyi Comheart Telecom Co.,LTD - 781DFD - Jabil Inc + 9C6121 + Sichuan Tianyi Comheart Telecom Co.,LTD - 18AEBB - Siemens Convergence Creators GmbH&Co.KG + E04FBD + Sichuan Tianyi Comheart Telecom Co.,LTD - B0BDA1 - Zaklad Elektroniczny Sims + 5CA176 + Sichuan Tianyi Comheart Telecom Co.,LTD - 70B265 - Hiltron s.r.l. + 4CD3AF + HMD Global Oy - CCC62B - Tri-Systems Corporation + C85142 + Samsung Electronics Co.,Ltd - D8C068 - Netgenetech Ltd + 10E4C2 + Samsung Electronics Co.,Ltd - 601199 - Siama Systems Inc + ACD829 + Bouffalo Lab (Nanjing) Co., Ltd. - 6C81FE - Mitsuba Corporation + 5C625A + CANON INC. - C027B9 - Beijing National Railway Research & Design Institute Of Signal & Communication Ltd + 7C0A3F + Samsung Electronics Co.,Ltd - 147411 - RIM + 08AA89 + zte corporation - F8A9DE - Puissance Plus + 04D60E + FUNAI ELECTRIC CO., LTD. - A88CEE - MicroMade Galka i Drozdz sp.j. + B0C952 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - DC2B66 - InfoBLOCK S.A. de C.V. + D0E042 + Cisco Systems, Inc - B8871E - Good Mind Industries Ltd + C47469 + BT9 - D4F027 - Trust Power Ltd + F46FA4 + Physik Instrumente GmbH & Co. KG - 0455CA - BriView (Xiamen) Corp. + C8BB81 + Huawei Device Co., Ltd. - 1435B3 - Future Designs Inc. + 1C472F + Huawei Device Co., Ltd. - AC932F - Nokia Corporation + 205E64 + Huawei Device Co., Ltd. - 0054AF - Continental Automotive Systems Inc. + F4419E + Huawei Device Co., Ltd. - ACCABA - Midokura Ltd + 90F9B7 + HUAWEI TECHNOLOGIES CO.,LTD - 0C8112 - Private + F44588 + HUAWEI TECHNOLOGIES CO.,LTD - 9C95F8 - SmartDoor Systems LLC + 54AED2 + CSL Dualcom Ltd - 7819F7 - Juniper Networks + 80B655 + Intel Corporate - 64094C - Beijing Superbee Wireless Technology Ltd + 0CCB0C + iSYS RTS GmbH - 7C7D41 - Jinmuyu Electronics Ltd + F44EE3 + Intel Corporate - 4C1480 - Noregon Systems Inc. + 78F235 + Sichuan AI-Link Technology Co., Ltd. - A4856B - Q Electronics Ltd + 082FE9 + HUAWEI TECHNOLOGIES CO.,LTD - 20D5AB - Korea Infocom Ltd + 984874 + HUAWEI TECHNOLOGIES CO.,LTD - 0CF3EE - EM Microelectronic + 1CA681 + HUAWEI TECHNOLOGIES CO.,LTD - 64D1A3 - Sitecom Europe BV + E8A660 + HUAWEI TECHNOLOGIES CO.,LTD - F43E9D - Benu Networks Inc. + CC242E + Shenzhen SuperElectron Technology Co.,Ltd. - 04E2F8 - AEP Ticketing solutions srl + F0016E + Tianyi Telecom Terminals Company Limited - EC9ECD - Artesyn Embedded Technologies + EC0BAE + Hangzhou BroadLink Technology Co.,Ltd - 8C5105 - Shenzhen ireadygo Information Technology Ltd + 802511 + ITEL MOBILE LIMITED - C8208E - Storagedata + 3802DE + Sercomm Corporation. - 5C5EAB - Juniper Networks + D0CFD8 + Huizhou Boshijie Technology Co.,Ltd - 9C807D - SysCABLE Korea Inc. + 2CBEEB + Nothing Technology Limited - 28E297 - Shanghai InfoTM Microelectronics Ltd + 7409AC + Quext, LLC - 34B571 - Plds + F04A02 + Cisco Systems, Inc - 3C7437 - RIM + 509A46 + Safetrust Inc - EC9233 - Eddyfi NDT Inc + A4352D + TRIZ Networks corp. - 743889 - ANNAX Anzeigesysteme GmbH + B881FA + Apple, Inc. - 44D2CA - Anvia TV Oy + 9C760E + Apple, Inc. - 386E21 - Wasion Group Ltd + 94EA32 + Apple, Inc. - 2872F0 - Athena + 50F4EB + Apple, Inc. - 1C19DE - eyevis GmbH + 28C709 + Apple, Inc. - 609E64 - Vivonic GmbH + 082E36 + Huawei Device Co., Ltd. - BC15A6 - Taiwan Jantek Electronics Ltd + C8BFFE + Huawei Device Co., Ltd. - DCDECA - Akyllor + 049F81 + NETSCOUT SYSTEMS INC - A0AAFD - EraThink Technologies Corp. + 00808C + NETSCOUT SYSTEMS INC - 6CA906 - Telefield Ltd + 4024B2 + Sichuan AI-Link Technology Co., Ltd. - 78223D - Affirmed Networks + 640D22 + LG Electronics (Mobile Communications) - 3C02B1 - Creation Technologies LP + 8C31E2 + DAYOUPLUS - E441E6 - Ottec Technology GmbH + 10394E + Hisense broadband multimedia technology Co.,Ltd - BC71C1 - XTrillion Inc. + 20A7F9 + SHENZHEN OLANBOA TECHNOLOGY CO., LTD - E0E8E8 - Olive Telecommunication Pvt Ltd + F4C7AA + Marvell Semiconductors - 6052D0 - FACTS Engineering + 70F088 + Nintendo Co.,Ltd - B08991 - LGE + CCED21 + Nokia Shanghai Bell Co., Ltd. - 30142D - Piciorgros GmbH + FC4DA6 + HUAWEI TECHNOLOGIES CO.,LTD - 50AF73 - Shenzhen Bitland Information Technology Ltd + 3C1512 + Shenzhen Huanhu Technology Co.,Ltd - 5C9AD8 - Fujitsu Limited + 18C241 + SonicWall - A4C0E1 - Nintendo Ltd + 58454C + Ericsson AB - 4C3B74 - VOGTEC(H.K.) Ltd + B414E6 + HUAWEI TECHNOLOGIES CO.,LTD - 684352 - Bhuu Limited + AC9929 + HUAWEI TECHNOLOGIES CO.,LTD - ECE90B - Sistema Solucoes Eletronicas Ltda - Easytech + 04BA1C + Huawei Device Co., Ltd. - A08C9B - Xtreme Technologies Corp + 7C3D2B + Huawei Device Co., Ltd. - A83944 - Actiontec Electronics Inc. + 14517E + New H3C Technologies Co., Ltd - 74E06E - Ergophone GmbH + 083A38 + New H3C Technologies Co., Ltd - 0CF0B4 - Globalsat International Technology Ltd + F8ABE5 + shenzhen worldelite electronics co., LTD - 48DF1C - Wuhan NEC Fibre Optic Communications Industry Ltd + 08BB3C + Flextronics Tech.(Ind) Pvt Ltd - D49C8E - University Of FUKUI + 10D561 + Tuya Smart Inc. - F8F014 - RackWare Inc. + F0A3B2 + Hui Zhou Gaoshengda Technology Co.,LTD - 2826A6 - PBR electronics GmbH + 184859 + Castlenet Technology Inc. - B428F1 - E-Prime Ltd + 2CFDB3 + Tonly Technology Co. Ltd - C01242 - Alpha Security Products + 2CCE1E + Cloudtronics Pty Ltd - BC20BA - Inspur (Shandong) Electronic Information Ltd + DC9A8E + Nanjing Cocomm electronics co., LTD - 1CFEA7 - IDentytech Solutins Ltd + 58AEF1 + Fiberhome Telecommunication Technologies Co.,LTD - 304EC3 - Tianjin Techua Technology Ltd + E86CC7 + IEEE Registration Authority - B4CFDB - Shenzhen Jiuzhou Electric Ltd + C0D46B + Huawei Device Co., Ltd. - FCD4F2 - The Coca Cola Company + 9C9567 + Huawei Device Co., Ltd. - 5C6A7D - Kentkart EGE Elektronik SAN. VE TIC Ltd STI. + A47B1A + Huawei Device Co., Ltd. - 44599F - Criticare Systems Inc. + D85982 + HUAWEI TECHNOLOGIES CO.,LTD - 3C2F3A - SFORZATO Corp. + 48B25D + HUAWEI TECHNOLOGIES CO.,LTD - 74CE56 - Packet Force Technology Limited Company + 147D05 + SERCOMM PHILIPPINES INC - AC2FA8 - Humannix Ltd + 787A6F + Juice Technology AG - 1064E2 - ADFweb.com s.r.l. + 641759 + Intellivision Holdings, LLC - CC34D7 - Gewiss S.P.A. + 504348 + ThingsMatrix Inc. - F02A61 - Waldo Networks Inc. + 8045DD + Intel Corporate - C8A70A - Verizon Business + 002DB3 + AMPAK Technology,Inc. - 60DA23 - Estech Ltd + E4FD45 + Intel Corporate - 44DCCB - Semindia Systems PVT Ltd + 145051 + SHARP Corporation - A0DE05 - JSC Irbis-T + 3CC786 + DONGGUAN HUARONG COMMUNICATION TECHNOLOGIES CO.,LTD. - 0817F4 - IBM Corp + A47E36 + EM Microelectronic - CCD811 - Aiconn Technology Corporation + 98387D + ITRONIC TECHNOLOGY CO . , LTD . - F43814 - Shanghai Howell Electronic Ltd + ACD618 + OnePlus Technology (Shenzhen) Co., Ltd - 90610C - Fida International (S) Pte Ltd + 88C3E5 + Betop Techonologies - 3C5F01 - Synerchip Ltd + E428A4 + Prama India Private Limited - ECBBAE - Digivoice Tecnologia em Eletronica Ltda + 943A91 + Amazon Technologies Inc. - 34A183 - AWare Inc. + C4D0E3 + Intel Corporate - 9873C4 - Sage Electronic Engineering LLC + 28C87C + zte corporation - B40142 - GCI Science & Technology Ltd + 307C4A + Huawei Device Co., Ltd. - 740ABC - LightwaveRF Technology Ltd + C8D884 + Universal Electronics, Inc. - 10A13B - Fujikura Rubber Ltd + B4A25C + Cambium Networks Limited - F4E142 - Delta Elektronika BV + 2C71FF + Amazon Technologies Inc. - AC8112 - Gemtek Technology Ltd + 48785E + Amazon Technologies Inc. - 686359 - Advanced Digital Broadcast SA + 20C74F + SensorPush - 28061E - Ningbo Global Useful Electric Ltd + 24E853 + LG Innotek - 64E8E6 - global moisture management System + 482952 + Sagemcom Broadband SAS - E0D10A - Katoudenkikougyousyo Ltd + 606C63 + Hitron Technologies. Inc - C44B44 - Omniprint Inc. + 00F361 + Amazon Technologies Inc. - 18922C - Virtual Instruments + 0040DD + HONG TECHNOLOGIES - A49B13 - Digital Check + 408C1F + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - C8EE08 - Tangtop Technology Ltd + 04F03E + Huawei Device Co., Ltd. - 7472F2 - Chipsip Technology Ltd + E8D765 + HUAWEI TECHNOLOGIES CO.,LTD - 48C8B6 - SysTec GmbH + 502DFB + IGShare Co., Ltd. - 3C6278 - Shenzhen Jetnet Technology Ltd + 40EE15 + Zioncom Electronics (Shenzhen) Ltd. - C8D5FE - Shenzhen Zowee Technology Ltd + 6C0DE1 + Dongguan Cannice Precision Manufacturing Co., Ltd. - 2C3068 - Pantech Ltd + 6C0309 + Cisco Systems, Inc - 00BD27 - Exar Corp. + BCD295 + Cisco Systems, Inc - 5C4058 - Jefferson Audio Video Systems Inc. + 80C501 + OctoGate IT Security Systems GmbH - 58D08F - IEEE 1904.1 Working Group + 14D19E + Apple, Inc. - 6C9CE9 - Nimble Storage + 40C711 + Apple, Inc. - CC09C8 - Imaqliq Ltd + 5C7017 + Apple, Inc. - 9C4563 - DIMEP Sistemas + 8CEC7B + Apple, Inc. - D43D67 - Carma Industries Inc. + C430CA + SD Biosensor - E0A670 - Nokia Corporation + 28052E + Dematic Corp - 58DB8D - Fast Ltd + E45E1B + Google, Inc. - E446BD - C&C Technic Taiwan Ltd + 78E22C + Huawei Device Co., Ltd. - 8CDD8D - Wifly-City System Inc. + C0D026 + Huawei Device Co., Ltd. - 20A2E7 - Lee-Dickens Ltd + A4423B + Intel Corporate - FCEDB9 - Arrayent + ECBE5F + Vestel Elektronik San ve Tic. A.S. - 44ED57 - Longicorn Inc. + 70CF49 + Intel Corporate - EC98C1 - Beijing Risbo Network Technology Ltd + 4851C5 + Intel Corporate - 38A95F - Actifio Inc + F42A7D + TP-LINK TECHNOLOGIES CO.,LTD. - F4DCDA - Zhuhai Jiahe Communication Technology Ltd + 04F993 + Infinix mobility limited - E80462 - Cisco Systems Inc. + BCBD9E + ITEL MOBILE LIMITED - DCD0F7 - Bentek Systems Ltd + BC6D05 + Dusun Electron Co.,Ltd. - D4A928 - GreenWave Reality Inc + C0E018 + HUAWEI TECHNOLOGIES CO.,LTD - E06290 - Jinan Jovision Science & Technology Ltd + 5CE747 + HUAWEI TECHNOLOGIES CO.,LTD - 100E2B - NEC CASIO Mobile Communications + A8FFBA + HUAWEI TECHNOLOGIES CO.,LTD - 70E139 - 3view Ltd + F03965 + Samsung Electronics Co.,Ltd - 18422F - Alcatel Lucent + EC7CB6 + Samsung Electronics Co.,Ltd - C46354 - U-Raku Inc. + 58A639 + Samsung Electronics Co.,Ltd - 405FBE - RIM + 8C0FC9 + Huawei Device Co., Ltd. - 6854F5 - enLighted Inc + 304E1B + Huawei Device Co., Ltd. - 7CB542 - ACES Technology + 74504E + New H3C Technologies Co., Ltd - 905446 - TES Electronic Solutions + 089AC7 + zte corporation - 544A05 - wenglor sensoric GmbH + 744CA1 + Liteon Technology Corporation - 98E165 - Accutome + B4B291 + LG Electronics - 785712 - Mobile Integration Workgroup + D80093 + Aurender Inc. - 380A0A - Sky-City Communication and Electronics Limited Company + 389052 + HUAWEI TECHNOLOGIES CO.,LTD - 0CD696 - Amimon Ltd + C0F6EC + HUAWEI TECHNOLOGIES CO.,LTD - F4DC4D - Beijing CCD Digital Technology Ltd + CC208C + HUAWEI TECHNOLOGIES CO.,LTD - 4013D9 - Global ES + 948ED3 + Arista Networks - AC4FFC - SVS-VISTEK GmbH + 24E4C8 + Fiberhome Telecommunication Technologies Co.,LTD - B43741 - Consert Inc. + 687627 + Zhuhai Dingzhi Electronic Technology Co., Ltd - 94857A - Evantage Industries Corp + C86C3D + Amazon Technologies Inc. - 4083DE - Zebra Technologies Inc + 70617B + Cisco Systems, Inc - 8897DF - Entrypass Corporation Sdn. Bhd. + A0024A + IEEE Registration Authority - 24AF54 - NEXGEN Mediatech Inc. + 04E77E + We Corporation Inc. - F0F842 - KEEBOX Inc. + 74ECB2 + Amazon Technologies Inc. - DC4EDE - Shinyei Technology Ltd + 4C52EC + SOLARWATT GmbH - E087B1 - Nata-Info Ltd + E01FED + Nokia Shanghai Bell Co., Ltd. - 447C7F - Innolight Technology Corporation + 30D941 + Raydium Semiconductor Corp. - D496DF - Sungjin C&T Ltd + 146B9A + zte corporation - 5C864A - Secret Labs LLC + 9C28B3 + Apple, Inc. - F0AD4E - Globalscale Technologies Inc. + A07817 + Apple, Inc. - 903D5A - Shenzhen Wision Technology Holding Limited + 5C8730 + Apple, Inc. - 7CA29B - D.SignT GmbH & Co. KG + A4AAFE + Huawei Device Co., Ltd. - A04041 - SAMWONFA Ltd + F83B7E + Huawei Device Co., Ltd. - 6C22AB - Ainsworth Game Technology + 8815C5 + Huawei Device Co., Ltd. - 3018CF - DEOS Control Systems GmbH + B41BB0 + Apple, Inc. - 08FAE0 - Fohhn Audio AG + 58D349 + Apple, Inc. - 58B9E1 - Crystalfontz America Inc. + F434F0 + Apple, Inc. - 20D906 - Iota Inc. + B08C75 + Apple, Inc. - F45595 - HENGBAO Corporation Ltd + 7040FF + Huawei Device Co., Ltd. - 1C3A4F - AccuSpec Electronics LLC + 34D693 + Huawei Device Co., Ltd. - 9C4E20 - Cisco Systems Inc. + 9C9AC0 + LEGO System A/S - D87533 - Nokia Corporation + A09F10 + SHENZHEN BILIAN ELECTRONIC CO.,LTD - 9835B8 - Assembled Products Corporation + 201B88 + Dongguan Liesheng Electronic Co., Ltd. - 288915 - CashGuard Sverige AB + E8EB34 + Cisco Systems, Inc - 4C5DCD - Oy Finnish Electric Vehicle Technologies Ltd + 3CBDC5 + Arcadyan Corporation - 70D57E - Scalar Corporation + A8DA0C + SERVERCOM (INDIA) PRIVATE LIMITED - B0E39D - CAT System Ltd + 249493 + FibRSol Global Network Limited - 7C2E0D - Blackmagic Design + 28D044 + Shenzhen Xinyin technology company - 180C77 - Westinghouse Electric Company LLC + 5C10C5 + Samsung Electronics Co.,Ltd - 68CA00 - Octopus Systems Limited + A8407D + GD Midea Air-Conditioning Equipment Co.,Ltd. - E0589E - Laerdal Medical + FC4B57 + Peerless Instrument Division of Curtiss-Wright - 0C1DC2 - SeAH Networks + 74B7B3 + Shenzhen YOUHUA Technology Co., Ltd - 5475D0 - Cisco Systems Inc. + DC9BD6 + TCT mobile ltd - 6089B7 - Kael Muhendislik Elektronik Ticaret Sanayi Limited Sirketi + DC8C1B + vivo Mobile Communication Co., Ltd. - 30525A - NST Ltd + F85329 + HUAWEI TECHNOLOGIES CO.,LTD - 2CA780 - True Technologies Inc. + E80AEC + Jiangsu Hengtong Optic-Electric Co., LTD - 7C6F06 - Caterpillar Trimble Control Technologies + C4DE7B + Huawei Device Co., Ltd. - 601283 - TSB Real Time Location Systems S.L. + 6C1A75 + Huawei Device Co., Ltd. - 98DCD9 - UNITEC Ltd + 40D4BD + SK Networks Service CO., LTD. - C0CFA3 - Creative Electronics & Software Inc. + 841B77 + Intel Corporate - 94236E - Shenzhen Junlan Electronic Ltd + 7CC294 + Beijing Xiaomi Mobile Software Co., Ltd - 10E6AE - Source Technologies LLC + E0E2E6 + Espressif Inc. - FCE192 - Sichuan Jinwangtong Electronic Science & Technology Ltd + 6C7637 + Huawei Device Co., Ltd. - 408A9A - TITENG Ltd + 68D48B + Hailo Technologies Ltd. - F445ED - Portable Innovation Technology Ltd + C43772 + Virtuozzo International GmbH - 5CE286 - Nortel Networks + CC3B27 + TECNO MOBILE LIMITED - 8C640B - Beyond Devices d.o.o. + 3CD2E5 + New H3C Technologies Co., Ltd - 949C55 - Alta Data Technologies + 9C7370 + HUAWEI TECHNOLOGIES CO.,LTD - D479C3 - Cameronet GmbH & Co. KG + 983F60 + HUAWEI TECHNOLOGIES CO.,LTD - 70D5E7 - Wellcore Corporation + C03FDD + HUAWEI TECHNOLOGIES CO.,LTD - 3CF72A - Nokia Corporation + 303235 + Qingdao Intelligent&Precise Electronics Co.,Ltd. - 545FA9 - Teracom Limited + 00301F + OPTICAL NETWORKS, INC. - 6C32DE - Indieon Technologies Pvt Ltd + 0858A5 + Beijing Vrv Software Corpoaration Limited. - 14A62C - S.M. Dezac S.A. + 001391 + OUEN CO.,LTD. - 547FEE - Cisco Systems Inc. + 582429 + Google, Inc. - ACEA6A - Genix Infocomm Ltd + 7C73EB + Huawei Device Co., Ltd. - E0BC43 - C2 Microsystems Inc. + E48F1D + Huawei Device Co., Ltd. - 2CA835 - RIM + CCF55F + E FOCUS INSTRUMENTS INDIA PRIVATE LIMITED - C41ECE - HMI Sources Ltd + 087C39 + Amazon Technologies Inc. - A8F470 - Fujian Newland Communication Science Technologies Ltd + 141333 + AzureWave Technology Inc. - 8C736E - Fujitsu Limited + A4178B + HUAWEI TECHNOLOGIES CO.,LTD - B86491 - CK Telecom Ltd + 94B271 + HUAWEI TECHNOLOGIES CO.,LTD - 50F003 - Open Stack Inc. + 808FE8 + Intelbras - DC49C9 - Casco Signal Ltd + 18CC18 + Intel Corporate - 70D880 - Upos System sp. z o.o. + C0C9E3 + TP-LINK TECHNOLOGIES CO.,LTD. - A05DC1 - TMCT Ltd + F88C21 + TP-LINK TECHNOLOGIES CO.,LTD. - 583CC6 - Omneality Ltd + C4278C + Huawei Device Co., Ltd. - B0C8AD - People Power Company + 78058C + mMax Communications, Inc. - 181714 - Daewoois + C4A72B + SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD - F0EC39 - Essec + D0C31E + JUNGJIN Electronics Co.,Ltd - 446C24 - Reallin Electronic Ltd + 5C3400 + Hisense Electric Co.,Ltd - 2046F9 - Advanced Network Devices (dba:AND) + D810CB + Andrea Informatique - 487119 - SGB Group Ltd + E0913C + Kyeungin CNS Co., Ltd. - 04FE7F - Cisco Systems Inc. + D05919 + zte corporation - A4B1EE - H. ZANDER GmbH & Co. KG + 00B881 + New platforms LLC - 842141 - Shenzhen Ginwave Technologies Ltd + B098BC + Huawei Device Co., Ltd. - A0231B - TeleComp R&D Corp. + 24016F + Huawei Device Co., Ltd. - B8A3E0 - BenRui Technology Ltd + 84E342 + Tuya Smart Inc. - 3CF52C - DSPECIALISTS GmbH + FCCD2F + IEEE Registration Authority - EC4476 - Cisco Systems Inc. + C03C59 + Intel Corporate - 6C1811 - Decatur Electronics + 4C3BDF + Microsoft Corporation - F8E968 - Egker Kft. + B43161 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - A8995C - aizo ag + 188740 + Xiaomi Communications Co Ltd - 4012E4 - Compass-EOS + 341CF0 + Xiaomi Communications Co Ltd - 5403F5 - EBN Technology Corp. + 30AFCE + vivo Mobile Communication Co., Ltd. - 04C05B - Tigo Energy + 64F947 + Senscomm Semiconductor Co., Ltd. - 8038FD - LeapFrog Enterprises Inc. + DC00B0 + FREEBOX SAS - ACBEB6 - Visualedge Technology Ltd + 707414 + Murata Manufacturing Co., Ltd. - 2C9127 - Eintechno Corporation + A0764E + Espressif Inc. - AC583B - Human Assembler Inc. + CC4F5C + IEEE Registration Authority - E8E776 - Shenzhen Kootion Technology Ltd + FC6DD1 + APRESIA Systems, Ltd. - 681FD8 - Siemens Industry Inc. + 6C09BF + Fiberhome Telecommunication Technologies Co.,LTD - 4001C6 - 3Com Europe Ltd + 445943 + zte corporation - 9C5E73 - Calibre UK Ltd + 343654 + zte corporation - 5C1437 - Thyssenkrupp Aufzugswerke GmbH + C8E600 + HUAWEI TECHNOLOGIES CO.,LTD - 9C55B4 - I.S.E. S.r.l. + D4D51B + HUAWEI TECHNOLOGIES CO.,LTD - 702F97 - Aava Mobile Oy + 2491BB + HUAWEI TECHNOLOGIES CO.,LTD - 10CA81 - Precia + 645E10 + HUAWEI TECHNOLOGIES CO.,LTD - 40A6A4 - PassivSystems Ltd + ECF22B + TECNO MOBILE LIMITED - 94BA31 - Visiontec da Amazonia Ltda. + 309610 + Huawei Device Co., Ltd. - B894D2 - Retail Innovation HTT AB + FCB3BC + Intel Corporate - B0E97E - Advanced Micro Peripherals + C816DA + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - F0C24C - Zhejiang FeiYue Digital Technology Ltd + B04414 + New H3C Technologies Co., Ltd - E4751E - Getinge Sterilization AB + E45F01 + Raspberry Pi Trading Ltd - 9C5B96 - NMR Corporation + 748F3C + Apple, Inc. - 60F13D - JABLOCOM s.r.o. + 40F946 + Apple, Inc. - 50252B - Nethra Imaging Incorporated + 1CFE2B + Amazon Technologies Inc. - F8811A - Overkiz + A4AE12 + Hon Hai Precision Industry Co., Ltd. - 3863F6 - 3NOD Multimedia(Shenzhen) Ltd + 9C9D7E + Beijing Xiaomi Mobile Software Co., Ltd - 78B81A - Inter Sales A/S + DCA3A2 + Feng mi(Beijing)technology co., LTD - CC0080 - Bettini SRL + EC570D + AFE Inc. - 644BC3 - Shanghai WOASiS Telecommunications Ltd + 7C25DA + FN-LINK TECHNOLOGY LIMITED - 942E63 - Finsecur + 3059B7 + Microsoft - AC8317 - Shenzhen Furtunetel Communication Ltd + 7412B3 + CHONGQING FUGUI ELECTRONICS CO.,LTD. - ACD180 - Crexendo Business Solutions Inc. + 9447B0 + BEIJING ESWIN COMPUTING TECHNOLOGY CO., LTD - CCCC4E - Sun Fountainhead USA. Corp + E45AD4 + Eltex Enterprise Ltd. - 688540 - IGI Mobile Inc. + 44A54E + Qorvo International Pte. Ltd. - A09A5A - Time Domain + A8698C + Oracle Corporation - 64A837 - Juni Korea Ltd + A4AC0F + Huawei Device Co., Ltd. - 202CB7 - Kong Yue Electronics & Information Industry (Xinhui) Ltd + CCFF90 + Huawei Device Co., Ltd. - 609F9D - CloudSwitch + 003054 + Castlenet Technology Inc. - 48343D - IEP GmbH + 001368 + Saab Danmark A/S - D4AAFF - Micro World + B030C8 + Teal Drones, Inc. - 74E537 - Radspin + D4F337 + Xunison Ltd. - 0026E9 - SP Corp + 48A2B8 + Chengdu Vision-Zenith Tech.Co,.Ltd - 0026EB - Advanced Spectrum Technology Ltd + 58E873 + HANGZHOU DANGBEI NETWORK TECH.Co.,Ltd - 0026E1 - Stanford University, OpenFlow Group + A0681C + GD Midea Air-Conditioning Equipment Co.,Ltd. - 002717 - CE Digital(Zhenjiang) Ltd + 6C442A + HUAWEI TECHNOLOGIES CO.,LTD - 002716 - Adachi-Syokai Ltd + A47CC9 + HUAWEI TECHNOLOGIES CO.,LTD - 0026DC - Optical Systems Design + C40D96 + HUAWEI TECHNOLOGIES CO.,LTD - 002700 - Shenzhen Siglent Technology Ltd + 44AF28 + Intel Corporate - 0026EC - Legrand Home Systems Inc. + D4A651 + Tuya Smart Inc. - 0026D4 - IRCA SpA + 84225E + SHENZHEN TECHNEWCHIP TECHNOLOGY CO.,LTD. - 002663 - Shenzhen Huitaiwei Tech Ltd + F85C7D + Shenzhen Honesty Electronics Co.,Ltd. - 002661 - Irumtek Ltd + 842AFD + HP Inc. - 00265B - Hitron Technologies Inc. + C0B8E6 + Ruijie Networks Co.,LTD - 002656 - Sansonic Electronics USA + 90F644 + Huawei Device Co., Ltd. - 00267D - A-Max Technology Macao Commercial Offshore Company Limited + A83512 + Huawei Device Co., Ltd. - 00267C - Metz-Werke GmbH & Co KG + DC41A9 + Intel Corporate - 002673 - Ricoh Company Ltd + 8C941F + Cisco Systems, Inc - 00266D - MobileAccess Networks + 687DB4 + Cisco Systems, Inc - 0026C0 - EnergyHub + 846B48 + ShenZhen EepuLink Co., Ltd. - 0026C1 - Artray Ltd + B460ED + Beijing Xiaomi Mobile Software Co., Ltd - 0026BE - Schoonderbeek Elektronica Systemen B.V. + 30CC21 + zte corporation - 0026B5 - ICOMM Tele Ltd + 646C80 + CHONGQING FUGUI ELECTRONICS CO.,LTD. - 00268C - StarLeaf Ltd + 00300B + mPHASE Technologies, Inc. - 00268B - Guangzhou Escene Computer Technology Limited + C01850 + Quanta Computer Inc. - 00266F - Coordiwise Technology Corp. + 4427F3 + 70mai Co.,Ltd. - 00266E - Nissho-denki Ltd + 000896 + Printronix, Inc. - 0026C3 - Insightek Corp. + 0025DC + Sumitomo Electric Industries, Ltd - 002681 - Interspiro AB + 047D7B + Quanta Computer Inc. - 002683 - Ajoho Enterprise Ltd + 089E01 + Quanta Computer Inc. - 00267F - Zenterio AB + A81E84 + Quanta Computer Inc. - 002698 - Cisco Systems Inc. + B46F2D + Wahoo Fitness - 00269B - SOKRAT Ltd + BC7F7B + Huawei Device Co., Ltd. - 0026A1 - Megger + F0FAC7 + Huawei Device Co., Ltd. - 002644 - Thomson Telecom Belgium + 0026C0 + EnergyHub - 002646 - Shenyang Tongfang Multimedia Technology Company Limited + 80EACA + Dialog Semiconductor Hellas SA - 00263F - LIOS Technology GmbH + 5C857E + IEEE Registration Authority - 00263B - Onbnetech + 8803E9 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 002658 - T-Platforms (Cyprus) Limited + 2098D8 + Shenzhen Yingdakang Technology CO., LTD - 00264C - Shanghai DigiVision Technology Ltd + 182649 + Intel Corporate - 00262F - Hamamatsu TOA Electronics + A0CFF5 + zte corporation - 002631 - Commtact Ltd + 98B3EF + Huawei Device Co., Ltd. - 0025FB - Tunstall Healthcare A/S + 50F958 + Huawei Device Co., Ltd. - 0025F4 - KoCo Connector AG + C0A36E + SKY UK LIMITED - 002606 - RAUMFELD GmbH + 34C93D + Intel Corporate - 002607 - Enabling Technology Pty Ltd + 1C012D + Ficer Technology - 002624 - Thomson Inc. + 0005C9 + LG Innotek - 002605 - CC Systems AB + ACF108 + LG Innotek - 002602 - SMART Temps LLC + E41F7B + Cisco Systems, Inc - 00261A - Femtocomm System Technology Corp. + 7CFD6B + Xiaomi Communications Co Ltd - 002634 - Infineta Systems Inc. + 7CC77E + Fiberhome Telecommunication Technologies Co.,LTD - 002599 - Hedon e.d. B.V. + 345840 + HUAWEI TECHNOLOGIES CO.,LTD - 002597 - Kalki Communication Technologies + 5C647A + HUAWEI TECHNOLOGIES CO.,LTD - 002592 - Guangzhou Shirui Electronic Ltd + DCEF80 + HUAWEI TECHNOLOGIES CO.,LTD - 002594 - Eurodesign BG Ltd + 304950 + IEEE Registration Authority - 00259F - TechnoDigital Technologies GmbH + 209E79 + Universal Electronics, Inc. - 00259D - Private + 08ED9D + TECNO MOBILE LIMITED - 002598 - Zhong Shan City Litai Electronic Industrial Ltd + FC1499 + Aimore Acoustics Incorporation - 0025E3 - Hanshinit Inc. + 88948F + Xi'an Zhisensor Technologies Co.,Ltd - 0025D4 - General Dynamics Mission Systems + 5CD5B5 + Shenzhen WiSiYiLink Technology Co.,Ltd - 0025C2 - RingBell Ltd + AC5FEA + OnePlus Technology (Shenzhen) Co., Ltd - 0025A7 - itron + 00BED5 + New H3C Technologies Co., Ltd - 0025A9 - Shanghai Embedway Information Technologies Ltd + E86DCB + Samsung Electronics Co.,Ltd - 0025B4 - Cisco Systems Inc. + 189552 + 1MORE - 0025B2 - MBDA Deutschland GmbH + 98C7A4 + Shenzhen HS Fiber Communication Equipment CO., LTD - 0025EF - I-TEC Ltd + 044AC6 + Aipon Electronics Co., Ltd - 002528 - Daido Signal Ltd + C0FFA8 + HUAWEI TECHNOLOGIES CO.,LTD - 002526 - Genuine Technologies Ltd + C87EA1 + TCL MOKA International Limited - 00256B - ATENIX E.E. s.r.l. + 642C0F + vivo Mobile Communication Co., Ltd. - 00256E - Van Breda B.V. + 3066D0 + Huawei Device Co., Ltd. - 002565 - Vizimax Inc. + 3CB233 + Huawei Device Co., Ltd. - 00255E - Shanghai Dare Technologies Ltd + CCC261 + IEEE Registration Authority - 00253B - din Dietmar Nocker Facilitymanagement GmbH + 5CFE9E + Wiwynn Corporation Tainan Branch - 00253D - DRS Consolidated Controls + 881C95 + ITEL MOBILE LIMITED - 002535 - Minimax GmbH & Co KG + 002003 + PIXEL POWER LTD. - 002584 - Cisco Systems Inc. + F02E51 + Casa Systems - 002579 - J & F Labs + F46942 + ASKEY COMPUTER CORP - 00257F - CallTechSolution Ltd + 08E9F6 + AMPAK Technology,Inc. - 002577 - D-BOX Technologies + C8E42F + Technical Research Design and Development - 002572 - Nemo-Q International AB + 680AE2 + Silicon Laboratories - 002529 - Comelit Group S.P.A + 241407 + Xiamen Sigmastar Technology Ltd. - 00252A - Chengdu GeeYa Technology Ltd + B47947 + Nutanix - 00258A - Pole/Zero Corporation + 04F8F8 + Edgecore Networks Corporation - 00255F - SenTec AG + 640BD7 + Apple, Inc. - 0024EC - United Information Technology Ltd + A8913D + Apple, Inc. - 0024E6 - In Motion Technology Inc. + 0C3B50 + Apple, Inc. - 0024E7 - Plaster Networks + 4CC95E + Samsung Electronics Co.,Ltd - 0024E4 - Withings + 5C9157 + HUAWEI TECHNOLOGIES CO.,LTD - 0024DE - GLOBAL Technology Inc. + 04CB88 + Shenzhen Jingxun Software Telecommunication Technology Co.,Ltd - 0024DC - Juniper Networks + FCA5D0 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 0024DB - Alcohol Monitoring Systems + 347DF6 + Intel Corporate - 002521 - Logitek Electronic Systems Inc. + C85BA0 + Shenzhen Qihu Intelligent Technology Company Limited - 00251F - Zynus Vision Inc. + E0BE03 + Lite-On Network Communication (Dongguan) Limited - 00251E - Rotel Technologies + A48873 + Cisco Systems, Inc - 002519 - Viaas Inc + 98CBA4 + Benchmark Electronics - 0024D5 - Winward Industrial Limited + B46293 + Samsung Electronics Co.,Ltd - 0024DD - Centrak Inc. + 000DA1 + MIRAE ITS Co.,LTD. - 0024EA - iris-GmbH Infrared & Intelligent sensors + CCD9AC + Intel Corporate - 0024ED - YT Elec Ltd + B8804F + Texas Instruments - 002503 - IBM Corp + 000F2D + CHUNG-HSIN ELECTRIC & MACHINERY MFG.CORP. - 002504 - Valiant Communications Limited + 183CB7 + Huawei Device Co., Ltd. - 002513 - CXP Digital BV + 5C9012 + Owl Cyber Defense Solutions, LLC - 0024A4 - Siklu Communication + 481693 + Lear Corporation GmbH - 00249A - Beijing Zhongchuang Telecommunication Test Ltd + A4BDC4 + HUAWEI TECHNOLOGIES CO.,LTD - 00249E - ADC-Elektronik GmbH + 38F7CD + IEEE Registration Authority - 00249F - RIM Testing Services + 9C2976 + Intel Corporate - 0024C2 - Asumo Ltd + 18F697 + Axiom Memory Solutions, Inc. - 0024BF - Ciat + 5C6BD7 + Foshan VIOMI Electric Appliance Technology Co. Ltd. - 0024C0 - NTI Comodo Inc + 1848CA + Murata Manufacturing Co., Ltd. - 0024BB - CENTRAL Corporation + CC0DF2 + Motorola Mobility LLC, a Lenovo Company - 0024BC - HuRob Ltd + 94434D + Ciena Corporation - 0024AD - Adolf Thies GmbH & Co. KG + 0001CD + ARtem - 0024A7 - Advanced Video Communications Inc. + 58A87B + Fitbit, Inc. - 0024AB - A7 Engineering Inc. + C489ED + Solid Optics EU N.V. - 002466 - Unitron nv + 488F5A + Routerboard.com - 00245F - Vine Telecom Ltd + A027B6 + Samsung Electronics Co.,Ltd - 002455 - MuLogic BV + 103917 + Samsung Electronics Co.,Ltd - 002488 - Centre For Development Of Telematics + 9880EE + Samsung Electronics Co.,Ltd - 00248F - DO-Monix + 90EEC7 + Samsung Electronics Co.,Ltd - 002479 - Optec Displays Inc. + 1029AB + Samsung Electronics Co.,Ltd - 0024B7 - GridPoint Inc. + 184ECB + Samsung Electronics Co.,Ltd - 0024AE - Idemia + 5C2316 + Squirrels Research Labs LLC - 002468 - Sumavision Technologies Ltd + 985949 + LUXOTTICA GROUP S.P.A. - 00243A - Ludl Electronic Products + 64E172 + Shenzhen Qihoo Intelligent Technology Co.,Ltd - 002439 - Digital Barriers Advanced Technologies + C4D8F3 + iZotope - 002434 - Lectrosonics Inc. + A84025 + Oxide Computer Company - 00245A - Nanjing Panda Electronics Company Limited + 60F43A + Edifier International - 00245B - Raidon Technology Inc. + FCB698 + Cambridge Industries(Group) Co.,Ltd. - 002459 - ABB Automation products GmbH + 042144 + Sunitec Enterprise Co.,Ltd - 00244E - RadChips Inc. + 4C3329 + Sweroam - 00240D - OnePath Networks Ltd + 782B46 + Intel Corporate - 00240B - Virtual Computer Inc. + 785773 + HUAWEI TECHNOLOGIES CO.,LTD - 002402 - Op-Tection GmbH + AC6089 + HUAWEI TECHNOLOGIES CO.,LTD - 00242F - Micron + 843E92 + HUAWEI TECHNOLOGIES CO.,LTD - 002426 - Nohmi Bosai Ltd + 708CB6 + HUAWEI TECHNOLOGIES CO.,LTD - 002418 - Nextwave Semiconductor + 50464A + HUAWEI TECHNOLOGIES CO.,LTD - 002412 - Benign Technologies Ltd + C4A402 + HUAWEI TECHNOLOGIES CO.,LTD - 002429 - MK Master Inc. + 68332C + KENSTEL NETWORKS LIMITED - 0023DB - saxnet GmbH + 9CBD6E + DERA Co., Ltd - 0023C8 - Team-R + 0006B3 + Diagraph Corporation - 0023EB - Cisco Systems Inc. + D8787F + Ubee Interactive Co., Limited - 0023EC - Algorithmix GmbH + DC333D + Huawei Device Co., Ltd. - 0023C1 - Securitas Direct AB + 285471 + Huawei Device Co., Ltd. - 0023AA - HFR Inc. + B88E82 + Huawei Device Co., Ltd. - 0023A5 - SageTV LLC + 34E5EC + Palo Alto Networks - 00239E - Jiangsu Lemote Technology Corporation Limited + 0887C6 + INGRAM MICRO SERVICES - 0023FC - Ultra Stereo Labs Inc. + D4D2D6 + FN-LINK TECHNOLOGY LIMITED - 00238D - Techno Design Ltd + 105072 + Sercomm Corporation. - 002387 - ThinkFlood Inc. + 98FAA7 + INNONET - 002384 - GGH Engineering s.r.l. + 086BD1 + Shenzhen SuperElectron Technology Co.,Ltd. - 002391 - Maxian + 905D7C + New H3C Technologies Co., Ltd - 002392 - Proteus Industries Inc. + 3CB53D + HUNAN GOKE MICROELECTRONICS CO.,LTD - 002393 - Ajinextek + AC3A67 + Cisco Systems, Inc - 00237F - Plantronics Inc. + 00B7A8 + Heinzinger electronic GmbH - 00236F - DAQ System + 34CFF6 + Intel Corporate - 002330 - Dizipia Inc. + B8E3B1 + HUAWEI TECHNOLOGIES CO.,LTD - 002369 - Cisco-Linksys LLC + 980D51 + Huawei Device Co., Ltd. - 0022F8 - PIMA Electronic Systems Ltd + 00ADD5 + Huawei Device Co., Ltd. - 00231C - Fourier Systems Ltd + EC7949 + FUJITSU LIMITED - 00231D - Deltacom Electronics Ltd + AC4A67 + Cisco Systems, Inc - 0022D7 - Nintendo Ltd + 900A84 + Mellanox Technologies, Inc. - 0022D6 - Cypak AB + 70CA97 + Ruckus Wireless - 0022D0 - Polar Electro Oy + 345180 + TCL King Electrical Appliances (Huizhou) Co., Ltd - 00230A - ARBURG GmbH & Co KG + 6CD94C + vivo Mobile Communication Co., Ltd. - 0022C3 - Zeeport Technology Inc. + AC1ED0 + Temic Automotive Philippines Inc. - 002316 - Kisan Electronics Co + 0088BA + NC&C - 00230F - Hirsch Electronics Corporation + 4CA64D + Cisco Systems, Inc - 00232D - SandForce + 402B69 + Kumho Electric Inc. - 002323 - Zylin AS + A40801 + Amazon Technologies Inc. - 0022DE - OPPO Digital Inc. + A8A097 + ScioTeq bvba - 0022F1 - Private + F47335 + Logitech Far East - 0022A2 - Xtramus Technologies + 90ADFC + Telechips, Inc. - 00229E - Social Aid Research Ltd + BC1695 + zte corporation - 002285 - Nomus Comm Systems + A4CFD2 + Ubee Interactive Co., Limited - 002281 - Daintree Networks Pty + E8E98E + SOLAR controls s.r.o. - 002255 - Cisco Systems Inc. + 64F6BB + Fibocom Wireless Inc. - 00224E - SEEnergy Corp. + 5CA62D + Cisco Systems, Inc - 002287 - Titan Wireless LLC + EC97B2 + SUMEC Machinery & Electric Co.,Ltd. - 002288 - Sagrad Inc. + 28FA7A + Zhejiang Tmall Technology Co., Ltd. - 002273 - Techway + 1005E1 + Nokia - 00226B - Cisco-Linksys LLC + BC542F + Intel Corporate - 002267 - Nortel Networks + 842E14 + Silicon Laboratories - 002295 - SGM Technology for lighting spa + 0020E1 + ALAMAR ELECTRONICS - 00225A - Garde Security AB + 08F458 + Huawei Device Co., Ltd. - 002242 - Alacron Inc. + 343794 + Hamee Corp. - 002234 - Corventis Inc. + D4DC09 + Mist Systems, Inc. - 0021F7 - HPN Supply Chain + 4410FE + Huizhou Foryou General Electronics Co., Ltd. - 0021F4 - INRange Systems Inc. + EC316D + Hansgrohe - 0021F5 - Western Engravers Supply Inc. + CC7F75 + Cisco Systems, Inc - 002232 - Design Design Technology Ltd + 20E874 + Apple, Inc. - 00222B - Nucomm Inc. + D03FAA + Apple, Inc. - 002226 - Avaak Inc. + 7CAB60 + Apple, Inc. - 002221 - Itoh Denki Ltd + 44C65D + Apple, Inc. - 00221D - Freegene Technology Ltd + 40EC99 + Intel Corporate - 002224 - Good Will Instrument Ltd + F4A4D6 + HUAWEI TECHNOLOGIES CO.,LTD - 002245 - Leine & Linde AB + 187EB9 + Apple, Inc. - 002249 - Home Multienergy SL + 1C97C5 + Ynomia Pty Ltd - 002240 - Universal Telecom S/A + 5CC1D7 + Samsung Electronics Co.,Ltd - 00220F - MoCA (Multimedia over Coax Alliance) + 380146 + SHENZHEN BILIAN ELECTRONIC CO.,LTD - 00220A - OnLive Inc. + 2C5741 + Cisco Systems, Inc - 002203 - Glensound Electronics Ltd + B0B353 + IEEE Registration Authority - 002204 - Koratek + 1C919D + Dongguan Liesheng Electronic Co., Ltd. - 0021FF - Cyfrowy Polsat SA + 20114E + MeteRSit S.R.L. - 0021E4 - I-WIN + FCF29F + China Mobile Iot Limited company - 0021E5 - Display Solution AG + F81F32 + Motorola Mobility LLC, a Lenovo Company - 00221B - Morega Systems + A87EEA + Intel Corporate - 0021B2 - Fiberblaze A/S + B00AD5 + zte corporation - 0021AC - Infrared Integrated Systems Ltd + A84D4A + Audiowise Technology Inc. - 00218E - Mekics Ltd + 98006A + zte corporation - 00218F - Avantgarde Acoustic Lautsprechersysteme GmbH + 7894E8 + Radio Bridge - 00217E - Telit Communication s.p.a + 547FBC + iodyne - 002187 - Imacs GmbH + FCE14F + BRK Brands, Inc. - 002181 - Si2 Microsystems Limited + 889655 + Zitte corporation - 0021C2 - GL Communications Inc + 18300C + Hisense Electric Co.,Ltd - 0021E2 - visago Systems & Controls GmbH & Co. KG + 5C27D4 + Shenzhen Qihu Intelligent Technology Company Limited - 0021DD - Northstar Systems Corp + 74D83E + Intel Corporate - 0021D5 - X2E GmbH + 88B6EE + Dish Technologies Corp - 0021A2 - EKE-Electronics Ltd + 5050A4 + Samsung Electronics Co.,Ltd - 0021C9 - Wavecom Asia Pacific Limited + 08F8BC + Apple, Inc. - 00214A - Pixel Velocity Inc. + 90A25B + Apple, Inc. - 002146 - Sanmina-SCI + 88A479 + Apple, Inc. - 00216E - Function ATI (Huizhou) Telecommunications Ltd + 047295 + Apple, Inc. - 00216D - Soltech Ltd + D446E1 + Apple, Inc. - 002165 - Presstek Inc. + 141459 + Vodafone Italia S.p.A. - 00211F - Shinsung Deltatech Ltd + 5043B9 + OktoInform RUS - 002124 - Optos Plc + 88541F + Google, Inc. - 002133 - Building B Inc. + 900CC8 + Google, Inc. - 002134 - Brandywine Communications + 00104F + Oracle Corporation - 00213A - Winchester Systems Inc. + 08D23E + Intel Corporate - 00212E - dresden-elektronik + 487B5E + SMT TELECOMM HK - 002130 - Keico Hightech Inc. + 0025A9 + Shanghai Embedway Information Technologies Co.,Ltd - 00215B - SenseAnywhere + 68215F + Edgecore Networks Corporation - 00214E - GS Yuasa Power Supply Ltd + 3CBF60 + Apple, Inc. - 002142 - Advanced Control Systems doo + AC15F4 + Apple, Inc. - 001FFA - Coretree Ltd + 78D162 + Apple, Inc. - 001FF2 - VIA Technologies Inc. + 44C7FC + Huawei Device Co., Ltd. - 002101 - Aplicaciones Electronicas Quasar (AEQ) + 7885F4 + Huawei Device Co., Ltd. - 002103 - GHI Electronics LLC + 8086D9 + Samsung Electronics Co.,Ltd - 001FF8 - Siemens AG, Sector Industry, Drive Technologies, Motion Control Systems + 386A77 + Samsung Electronics Co.,Ltd - 001FD0 - Giga-Byte Technology Ltd + 00B810 + Yichip Microelectronics (Hangzhou) Co.,Ltd - 001FD1 - Optex Ltd + A4B239 + Cisco Systems, Inc - 001FC9 - Cisco Systems Inc. + 548D5A + Intel Corporate - 001FDC - Mobile Safe Track Ltd + F44955 + MIMO TECH Co., Ltd. - 001FD6 - Shenzhen Allywll + 0809C7 + Zhuhai Unitech Power Technology Co., Ltd. - 002117 - Tellord + 58961D + Intel Corporate - 00210F - Cernium Corp + 68AFFF + Shanghai Cambricon Information Technology Co., Ltd. - 001FF1 - Paradox Hellas S.A. + D01C3C + TECNO MOBILE LIMITED - 001FE6 - Alphion Corporation + 041DC7 + zte corporation - 001FCF - MSI Technology GmbH + 001A4D + GIGA-BYTE TECHNOLOGY CO.,LTD. - 001F9C - Ledco + 001FD0 + GIGA-BYTE TECHNOLOGY CO.,LTD. - 001F90 - Actiontec Electronics Inc. + B89A2A + Intel Corporate - 001F91 - DBS Lodging Technologies LLC + DC21E2 + HUAWEI TECHNOLOGIES CO.,LTD - 001F98 - Daiichi-Dentsu Ltd + FC1BD1 + HUAWEI TECHNOLOGIES CO.,LTD - 001F93 - Xiotech Corporation + 582575 + HUAWEI TECHNOLOGIES CO.,LTD - 001F51 - HD Communications Corp + 28DEE5 + HUAWEI TECHNOLOGIES CO.,LTD - 001F53 - GEMAC Chemnitz GmbH + 18C04D + GIGA-BYTE TECHNOLOGY CO.,LTD. - 001F50 - Swissdis AG + 402C76 + IEEE Registration Authority - 001F4C - Roseman Engineering Ltd + 80C955 + Redpine Signals, Inc. - 001FA9 - Atlanta DTH Inc. + 5C68D0 + Aurora Innovation Inc. - 001FA3 - T&W Electronics(Shenzhen) Ltd + 10364A + Boston Dynamics - 001FA2 - Datron World Communications Inc. + 000BCC + JUSAN, S.A. - 001F70 - Botik Technologies Ltd + 00E059 + CONTROLLED ENVIRONMENTS, LTD. - 001F64 - Beijing Autelan Technology Inc. + 0C8E29 + Arcadyan Corporation - 001F6D - Cisco Systems Inc. + A0224E + IEEE Registration Authority - 001F24 - Digitview Technology Ltd + C49878 + SHANGHAI MOAAN INTELLIGENT TECHNOLOGY CO.,LTD - 001F21 - Inner Mongolia Yin An Science & Technology Development Ltd + 000A23 + Parama Networks Inc - 001F22 - Source Photonics Inc. + 3843E5 + Grotech Inc - 001F1D - Atlas Material Testing Technology LLC + 6C06D6 + Huawei Device Co., Ltd. - 001F15 - Bioscrypt Inc + 18E777 + vivo Mobile Communication Co., Ltd. - 001F2B - Orange Logic + 0C7A15 + Intel Corporate - 001F2A - Accm + 94D6DB + NexFi - 001F30 - Travelping + 78B46A + HUAWEI TECHNOLOGIES CO.,LTD - 001F48 - Mojix Inc. + 6CEBB6 + HUAWEI TECHNOLOGIES CO.,LTD - 001F3E - RP-Technik e.K. + 4CF55B + HUAWEI TECHNOLOGIES CO.,LTD - 001EF0 - Gigafin Networks + 643139 + IEEE Registration Authority - 001EF2 - Micro Motion Inc + A44BD5 + Xiaomi Communications Co Ltd - 001F37 - Genesis I&C + 14876A + Apple, Inc. - 001F2C - Starbridge Networks + E0B55F + Apple, Inc. - 001F31 - Radiocomp + F8FFC2 + Apple, Inc. - 001F12 - Juniper Networks + E0EB40 + Apple, Inc. - 001EEA - Sensor Switch Inc. + 4077A9 + New H3C Technologies Co., Ltd - 001F04 - Granch Ltd + 64694E + Texas Instruments - 001E94 - Supercom Technology Corporation + F83331 + Texas Instruments - 001E8F - Canon Inc. + 40A6B7 + Intel Corporate - 001EA5 - ROBOTOUS Inc. + B4ECF2 + Shanghai Listent Medical Tech Co., Ltd. - 001EA7 - Actiontec Electronics Inc. + C4954D + IEEE Registration Authority - 001EA0 - XLN-t + 64956C + LG Electronics - 001E98 - GreenLine Communications + E83F67 + Huawei Device Co., Ltd. - 001E9A - HAMILTON Bonaduz AG + 3446EC + Huawei Device Co., Ltd. - 001EDF - Master Industrialization Center Kista + 1CBFC0 + CHONGQING FUGUI ELECTRONICS CO.,LTD. - 001EE3 - T&W Electronics (Shenzhen) Ltd + 801609 + Sleep Number - 001ED9 - Mitsubishi Precision Ltd + AC8B9C + Primera Technology, Inc. - 001ED3 - Dot Technology Int'l Ltd + 1CC1BC + Yichip Microelectronics (Hangzhou) Co.,Ltd - 001EA6 - Best IT World (India) Pvt Ltd + 2C3AFD + AVM Audiovisuelles Marketing und Computersysteme GmbH - 001E83 - LAN/MAN Standards Association (LMSC) + AC61B9 + WAMA Technology Limited - 001E7C - Taiwick Limited + F855CD + Visteon Corporation - 001ECF - Philips Electronics UK Ltd + 441847 + HUNAN SCROWN ELECTRONIC INFORMATION TECH.CO.,LTD - 001E22 - ARVOO Imaging Products BV + 0030B7 + Teletrol Systems, Inc. - 001E1A - Best Source Taiwan Inc. + C8F319 + LG Electronics (Mobile Communications) - 001E19 - Gtri + 009096 + ASKEY COMPUTER CORP - 001E14 - Cisco Systems Inc. + 2474F7 + GoPro - 001E44 - Santec + 7CD566 + Amazon Technologies Inc. - 001E62 - Siemon + 686350 + Hella India Automotive Pvt Ltd - 001E5C - RB GeneralEkonomik + 18703B + Huawei Device Co., Ltd. - 001E5D - Holosys d.o.o. + 442295 + China Mobile Iot Limited company - 001E78 - Owitek Technology Ltd + E85A8B + Xiaomi Communications Co Ltd - 001E7A - Cisco Systems Inc. + 80751F + SKY UK LIMITED - 001E27 - SBN TECH Ltd + D89E61 + Huawei Device Co., Ltd. - 001E60 - Digital Lighting Systems Inc. + 347E00 + Huawei Device Co., Ltd. - 001E6C - Opaque Systems + 5CE50C + Beijing Xiaomi Mobile Software Co., Ltd - 001E2F - DiMoto Pty Ltd + 5C710D + Cisco Systems, Inc - 001E36 - Ipte + 98AF65 + Intel Corporate - 001DA7 - Seamless Internet + F8893C + Inventec Appliances Corp. - 001DA5 - WB Electronics + 749EF5 + Samsung Electronics Co.,Ltd - 001DA8 - Takahata Electronics Ltd + 68BFC4 + Samsung Electronics Co.,Ltd - 001DA9 - Castles Technology Ltd + B82ADC + EFR Europäische Funk-Rundsteuerung GmbH - 001DCB - Exens Development Oy + A0DF15 + HUAWEI TECHNOLOGIES CO.,LTD - 001DCA - PAV Electronics Limited + C4AD34 + Routerboard.com - 001DC2 - Xortec Oy + 000733 + DANCONTROL Engineering - 001E0E - Maxi View Holdings Limited + A85E45 + ASUSTek COMPUTER INC. - 001E0F - Briot International + 64C901 + INVENTEC Corporation - 001DE3 - Intuicom + B43939 + Shenzhen TINNO Mobile Technology Corp. - 001DDE - Zhejiang Broadcast & Television Technology Ltd + 5CCD5B + Intel Corporate - 001DE5 - Cisco Systems Inc. + 84C807 + ADVA Optical Networking Ltd. - 001DEC - Marusys + 10B3C6 + Cisco Systems, Inc - 001DE8 - Nikko Denki Tsushin Corporation(NDTC) + 10B3D6 + Cisco Systems, Inc - 001DDA - Mikroelektronika spol. s r. o. + A0AB51 + WEIFANG GOERTEK ELECTRONICS CO.,LTD - 001DB0 - FuJian HengTong Information Technology Ltd + 04B1A1 + Samsung Electronics Co.,Ltd - 001DB8 - Intoto Inc. + CC464E + Samsung Electronics Co.,Ltd - 001DF5 - Sunshine Ltd + 306F07 + Nations Technologies Inc. - 001DF0 - Vidient Systems Inc. + 3C894D + Dr. Ing. h.c. F. Porsche AG - 001DFE - Palm Inc. + F854B8 + Amazon Technologies Inc. - 001D52 - Defzone B.V. + 781735 + Nokia Shanghai Bell Co., Ltd. - 001D4A - Carestream Health Inc. + 9CFFC2 + AVI Systems GmbH - 001D96 - WatchGuard Video + 44D878 + Hui Zhou Gaoshengda Technology Co.,LTD - 001D8F - PureWave Networks + 7897C3 + DINGXIN INFORMATION TECHNOLOGY CO.,LTD - 001D8C - La Crosse Technology Ltd + F4D620 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 001D64 - Adam Communications Systems Int ltd + 949034 + SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD - 001D5E - Coming Media Corp. + 3C8F06 + Shenzhen Libtor Technology Co.,Ltd - 001D55 - ZANTAZ Inc. + 987A10 + Ericsson AB - 001DA1 - Cisco Systems Inc. + 202681 + TECNO MOBILE LIMITED - 001D71 - Cisco Systems Inc. + A0D807 + Huawei Device Co., Ltd. - 001D65 - Microwave Radio Communications + 2C780E + Huawei Device Co., Ltd. - 001D50 - Spinetix SA + 34B20A + Huawei Device Co., Ltd. - 001D45 - Cisco Systems Inc. + 98F4AB + Espressif Inc. - 001D69 - Knorr-Bremse IT-Services GmbH + D8BFC0 + Espressif Inc. - 001CF8 - Parade Technologies Ltd + B00875 + HUAWEI TECHNOLOGIES CO.,LTD - 001CF7 - AudioScience + 64FB92 + PPC Broadband Inc. - 001CF6 - Cisco Systems Inc. + 141346 + Skyworth Digital Technology(Shenzhen) Co.,Ltd - 001CF5 - Wiseblue Technology Limited + 542BDE + New H3C Technologies Co., Ltd - 001CEE - Sharp Corporation + 4C90DB + JL Audio - 001D07 - Shenzhen Sang Fei Consumer Communications Ltd + 8CF112 + Motorola Mobility LLC, a Lenovo Company - 001D06 - HM Electronics Inc. + B899AE + Shenzhen MiaoMing Intelligent Technology Co.,Ltd - 001D01 - Neptune Digital + E8D0B9 + Taicang T&W Electronics - 001D33 - Maverick Systems Inc. + 5885A2 + Realme Chongqing MobileTelecommunications Corp Ltd - 001D2C - Wavetrend Technologies (Pty) Limited + A8C0EA + Pepwave Limited - 001CCF - Limetek + 44AEAB + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 001D24 - Aclara Power-Line Systems Inc. + A4F05E + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 001D18 - Power Innovation GmbH + 00071C + AT&T - 001D1B - Sangean Electronics Inc. + 847637 + HUAWEI TECHNOLOGIES CO.,LTD - 001D17 - Digital Sky Corporation + FC9435 + HUAWEI TECHNOLOGIES CO.,LTD - 001D27 - NAC-Intercom + E02481 + HUAWEI TECHNOLOGIES CO.,LTD - 001CE3 - Optimedical Systems + 2CF89B + Cisco Systems, Inc - 001CDE - Interactive Multimedia eXchange Inc. + 80B07B + zte corporation - 001D36 - Electronics Corporation Of India Limited + C85A9F + zte corporation - 001C80 - New Business Division/Rhea-Information Ltd + 001DDF + Sunitec Enterprise Co.,Ltd - 001C83 - New Level Telecom Ltd + 8C0FFA + Hutec co.,ltd - 001C76 - The Wandsworth Group Ltd + ACFE05 + ITEL MOBILE LIMITED - 001C72 - Mayer & Cie GmbH & Co KG + BCC31B + Kygo Life A - 001CAD - Wuhan Telecommunication Devices Ltd + 64DF10 + JingLue Semiconductor(SH) Ltd. - 001CA7 - International Quartz Limited + 100177 + HUAWEI TECHNOLOGIES CO.,LTD - 001CAB - Meyer Sound Laboratories Inc. + 44A191 + HUAWEI TECHNOLOGIES CO.,LTD - 001C9E - Dualtech IT AB + 24526A + Zhejiang Dahua Technology Co., Ltd. - 001CC8 - IndUSTRONIC Industrie-Electronic GmbH & Co. KG + 20DFB9 + Google, Inc. - 001CC6 - ProStor Systems + 5CCAD3 + CHIPSEA TECHNOLOGIES (SHENZHEN) CORP. - 001CBE - Nintendo Ltd + 782A79 + Integrated Device Technology (Malaysia) Sdn. Bhd. - 001C94 - LI-CoR Biosciences + 50D2F5 + Beijing Xiaomi Mobile Software Co., Ltd - 001C8C - Dial Technology Ltd + 1C687E + Shenzhen Qihu Intelligent Technology Company Limited - 001CCA - Shanghai Gaozhi Science & Technology Development Co. + C03656 + Fiberhome Telecommunication Technologies Co.,LTD - 001CC9 - Kaise Electronic Technology Ltd + B03E51 + SKY UK LIMITED - 001C93 - ExaDigm Inc + 28167F + Xiaomi Communications Co Ltd - 001C85 - Eunicorn + 087190 + Intel Corporate - 001C67 - Pumpkin Networks Inc. + 5CE883 + HUAWEI TECHNOLOGIES CO.,LTD - 001C60 - CSP Frontier Technologies,Inc. + 6023A4 + Sichuan AI-Link Technology Co., Ltd. - 001C6A - Weiss Engineering Ltd + A4530E + Cisco Systems, Inc - 001C0A - Shenzhen AEE Technology Ltd + 00403A + IMPACT TECHNOLOGIES - 001C0D - G-Technology Inc. + C8B1CD + Apple, Inc. - 001C03 - Betty TV Technology AG + 1460CB + Apple, Inc. - 001C46 - Qtum + B8F12A + Apple, Inc. - 001C42 - Parallels Inc. + F887F1 + Apple, Inc. - 001C3E - ECKey Corporation + 60447A + Water-i.d. GmbH - 001C51 - Celeno Communications + 807215 + SKY UK LIMITED - 001C54 - Hillstone Networks Inc + 74D637 + Amazon Technologies Inc. - 001C59 - Devon IT + 7484E1 + Dongguan Haoyuan Electronics Co.,Ltd - 001C22 - Aeris Elettronica s.r.l. + 4074E0 + Intel Corporate - 001C1D - Chenzhou Gospell Digital Technology Ltd + D05F64 + IEEE Registration Authority - 001C39 - S Netsystems Inc. + 44FB5A + zte corporation - 001C37 - Callpod Inc. + C463FB + Neatframe AS - 001C33 - Sutron + 305714 + Apple, Inc. - 001BF6 - CoNWISE Technology Corporation Ltd + 04A222 + Arcadyan Corporation - 001BF8 - Digitrax Inc. + 04AB6A + Chun-il Co.,Ltd. - 001C2F - Pfister GmbH + 0035FF + Texas Instruments - 001C27 - Sunell Electronics Co. + DC54D7 + Amazon Technologies Inc. - 001C0F - Cisco Systems Inc. + 28FE65 + DongGuan Siyoto Electronics Co., Ltd - 001C48 - WiDeFi Inc. + 1806F5 + RAD Data Communications, Ltd. - 001BAD - iControl Incorporated + 889FAA + Hella Gutmann Solutions GmbH - 001BA7 - Lorica Solutions + 04C807 + Xiaomi Communications Co Ltd - 001BA5 - MyungMin Systems Inc. + 4459E3 + HUAWEI TECHNOLOGIES CO.,LTD - 001BF1 - Nanjing SilverNet Software Ltd + 683F1E + EFFECT Photonics B.V. - 001BEF - Blossoms Digital Technology Ltd + 44D3CA + Cisco Systems, Inc - 001BEB - DMP Electronics Inc. + 840B7C + Hitron Technologies. Inc - 001BA2 - IDS Imaging Development Systems GmbH + 48A73C + Sichuan tianyi kanghe communications co., LTD - 001B9D - Novus Security Sp. z o.o. + F8A763 + Zhejiang Tmall Technology Co., Ltd. - 001BC9 - FSN Display Inc + 6C2990 + WiZ Connected Lighting Company Limited - 001BC3 - Mobisolution Ltd + 9835ED + HUAWEI TECHNOLOGIES CO.,LTD - 001BCE - Measurement Devices Ltd + 807693 + Newag SA - 001BB8 - Blueway Electronic Co; Ltd + BC9740 + IEEE Registration Authority - 001BB2 - Intellect International NV + 084F0A + HUAWEI TECHNOLOGIES CO.,LTD - 001BE7 - Postek Electronics Ltd + A8494D + HUAWEI TECHNOLOGIES CO.,LTD - 001BE3 - Health Hero Network Inc. + 44004D + HUAWEI TECHNOLOGIES CO.,LTD - 001BDC - Vencer Ltd + 20968A + China Mobile (Hangzhou) Information Technology Co., Ltd. - 001BD5 - Cisco Systems Inc. + 8C1850 + China Mobile (Hangzhou) Information Technology Co., Ltd. - 001B95 - Video Systems SRL + D8D4E6 + Hytec Inter Co., Ltd. - 001B90 - Cisco Systems Inc. + F8E7A0 + vivo Mobile Communication Co., Ltd. - 001B7F - TMN Technologies Telecomunicacoes Ltda + 2CFFEE + vivo Mobile Communication Co., Ltd. - 001B7E - Beckmann GmbH + C85D38 + HUMAX Co., Ltd. - 001B7A - Nintendo Ltd + 18CF24 + HUAWEI TECHNOLOGIES CO.,LTD - 001B34 - Focus System Inc. + 50F8A5 + eWBM Co., Ltd. - 001B3A - SIMS Corp. + D89B3B + HUAWEI TECHNOLOGIES CO.,LTD - 001B5F - Alien Technology + 88403B + HUAWEI TECHNOLOGIES CO.,LTD - 001B61 - Digital Acoustics LLC + FC8743 + HUAWEI TECHNOLOGIES CO.,LTD - 001B5E - BPL Limited + 04885F + HUAWEI TECHNOLOGIES CO.,LTD - 001B5C - Azuretec Ltd + C850CE + HUAWEI TECHNOLOGIES CO.,LTD - 001B72 - Sicep s.p.a. + 000BE4 + Hosiden Corporation - 001B74 - MiraLink Corporation + 4413D0 + zte corporation - 001B6D - Midtronics Inc. + 1449BC + DrayTek Corp. - 001B6F - Teletrak Ltd + 20F478 + Xiaomi Communications Co Ltd - 001B4B - SANION Ltd + 7438B7 + CANON INC. - 001B2D - Med-Eng Systems Inc. + 90735A + Motorola Mobility LLC, a Lenovo Company - 001B87 - Deepsound Tech Ltd + 0004DF + TERACOM TELEMATICA S.A - 001B4D - Areca Technology Corporation + 18B6F7 + NEW POS TECHNOLOGY LIMITED - 001AE3 - Cisco Systems Inc. + 1C8259 + IEEE Registration Authority - 001ADF - Interactivetv Pty Limited + 00FA21 + Samsung Electronics Co.,Ltd - 001AE1 - Edge Access Inc + 7C2302 + Samsung Electronics Co.,Ltd - 001AE8 - Unify Software and Solutions GmbH & Co. KG + 6CAB05 + Cisco Systems, Inc - 001AE9 - Nintendo Ltd + 5CB15F + Oceanblue Cloud Technology Limited - 001AE5 - Mvox Technologies Inc. + 485DEB + Just Add Power - 001AE4 - Medicis Technologies Corporation + 501395 + Sichuan AI-Link Technology Co., Ltd. - 001AF8 - Copley Controls Corporation + 18D9EF + Shuttle Inc. - 001AF5 - Pentaone Ltd + 88DA33 + Beijing Xiaoyuer Network Technology Co., Ltd - 001AED - IncOTEC GmbH + 84C78F + APS Networks GmbH - 001AEE - Shenztech Ltd + C09FE1 + zte corporation - 001ACE - Yupiteru Corporation + 18AACA + Sichuan tianyi kanghe communications co., LTD - 001ACC - Celestial Semiconductor Ltd + D49DC0 + Samsung Electronics Co.,Ltd - 001AD2 - Eletronica Nitron Ltda + D0196A + Ciena Corporation - 001B1D - Phoenix International Ltd + 84FDD1 + Intel Corporate - 001B1A - e-trees Japan Inc. + B0700D + Nokia - 001B12 - Apprion + 002175 + Pacific Satellite International Ltd. - 001AFE - Sofacreal + 346B5B + New H3C Technologies Co., Ltd - 001AF1 - Embedded Artists AB + 84E892 + Actiontec Electronics, Inc - 001B0D - Cisco Systems Inc. + 78E2BD + Vodafone Automotive S.p.A. - 001B0A - Intelligent Distributed Controls Ltd + F848FD + China Mobile Group Device Co.,Ltd. - 001AB1 - Asia Pacific Satellite Industries Ltd + 80DABC + Megafone Limited - 001AB7 - Ethos Networks Ltd + 20DA22 + HUAWEI TECHNOLOGIES CO.,LTD - 001AB2 - Cyber Solutions Inc. + 184644 + Home Control Singapore Pte Ltd - 001A97 - fitivision technology Inc. + C821DA + Shenzhen YOUHUA Technology Co., Ltd - 001A90 - Tropico Sistemas e Telecomunicacoes da Amazonia LtdA. + 20658E + HUAWEI TECHNOLOGIES CO.,LTD - 001A94 - Votronic GmbH + 183D5E + HUAWEI TECHNOLOGIES CO.,LTD - 001AC7 - Unipoint + 889746 + Sichuan AI-Link Technology Co., Ltd. - 001AC0 - Joybien Technologies Ltd + 1CDE57 + Fiberhome Telecommunication Technologies Co.,LTD - 001A9E - ICON Digital International Limited + E0DCFF + Xiaomi Communications Co Ltd - 001A98 - Asotel Communication Limited Taiwan Branch + 00778D + Cisco Systems, Inc - 001A72 - Mosart Semiconductor Corp. + 000E8C + Siemens AG - 001A68 - Weltec Enterprise Ltd + 008764 + Cisco Systems, Inc - 001AC2 - YEC Ltd + 846FCE + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 001AA5 - BRN Phoenix + B0E71D + Shanghai Maigantech Co.,Ltd - 001AA2 - Cisco Systems Inc. + C468D0 + VTech Telecommunications Ltd. - 001A9C - RightHand Technologies Inc. + 14AEDB + VTech Telecommunications Ltd. - 001A7E - LN Srithai Comm Ltd + 78DB2F + Texas Instruments - 001A5A - Korea Electric Power Data Network (KDN) Ltd + E0B655 + Beijing Xiaomi Electronics Co., Ltd. - 001A5F - KitWorks.fi Ltd + 8C0FA0 + di-soric GmbH & Co. KG - 001A37 - Lear Corporation + DCFB48 + Intel Corporate - 001A38 - Sanmina-SCI + DC7137 + zte corporation - 001A2B - Ayecom Technology Ltd + 847C9B + GD Midea Air-Conditioning Equipment Co.,Ltd. - 001A28 - ASWT Ltd Taiwan Branch H.K. + 3441A8 + ER-Telecom - 001A2C - SATEC Ltd + 7440BE + LG Innotek - 001A27 - Ubistar + A4CF12 + Espressif Inc. - 001A21 - Brookhuis Applied Technologies BV + FCB662 + IC Holdings LLC - 0019FF - Finnzymes + 04D4C4 + ASUSTek COMPUTER INC. - 0019FA - Cable Vision Electronics Ltd + A0510B + Intel Corporate - 001A5D - Mobinnova Corp. + 7488BB + Cisco Systems, Inc - 001A4D - Giga-Byte Technology Ltd + A8E2C3 + Shenzhen YOUHUA Technology Co., Ltd - 001A48 - Takacom Corporation + 0CA06C + Industrial Cyber Sensing Inc. - 001A0B - Bona Technology Inc. + FCD2B6 + IEEE Registration Authority - 001A06 - OpVista Inc. + 804A14 + Apple, Inc. - 001A2E - Ziova Coporation + 703C69 + Apple, Inc. - 001A32 - Activa Multimedia + AC2DA9 + TECNO MOBILE LIMITED - 001A00 - Matrix Inc. + 40A93F + Pivotal Commware, Inc. - 0019AD - Bobst SA + 4C6AF6 + HMD Global Oy - 0019A2 - Ordyn Technologies + 489DD1 + Samsung Electronics Co.,Ltd - 0019A5 - RadarFind Corporation + C08C71 + Motorola Mobility LLC, a Lenovo Company - 001993 - Changshu Switchgear MFG Ltd (Former Changshu Switchgea + 48049F + ELECOM CO., LTD - 0019F1 - Star Communication Network Technology Ltd + 087F98 + vivo Mobile Communication Co., Ltd. - 0019EC - Sagamore Systems Inc. + C04121 + Nokia Solutions and Networks GmbH & Co. KG - 0019CC - RCG (HK) Ltd + F46F4E + Echowell - 0019C8 - AnyDATA Corporation + B06FE0 + Samsung Electronics Co.,Ltd - 0019C4 - Infocrypt Inc. + 44B994 + Douglas Lighting Controls - 0019BC - Electro Chance SRL + 2479F8 + KUPSON spol. s r.o. - 00199B - Diversified Technical Systems Inc. + 70BF92 + GN Audio A/S - 001990 - ELM DATA Ltd + ACBB61 + YSTen Technology Co.,Ltd - 00198F - Nokia Bell N.V. + 342003 + Shenzhen Feitengyun Technology Co.,LTD - 0019D8 - Maxfor + 7CFD82 + GUANGDONG GENIUS TECHNOLOGY CO., LTD. - 0019D5 - IP Innovations Inc. + 002F5C + Cisco Systems, Inc - 0019A3 - asteel electronique atlantique + F4645D + Toshiba - 0019EA - TeraMage Technologies Ltd + F07D68 + D-Link Corporation - 00196E - Metacom (Pty) Ltd + EC4118 + XIAOMI Electronics,CO.,LTD - 001965 - YuHua TelTech (ShangHai) Ltd + D8860B + IEEE Registration Authority - 001966 - Asiarock Technology Limited + 08ECF5 + Cisco Systems, Inc - 00197B - Picotest Corp. + D07650 + IEEE Registration Authority - 001973 - Zeugma Systems + 60D0A9 + Samsung Electronics Co.,Ltd - 001975 - Beijing Huisen networks technology Inc + 88CEFA + HUAWEI TECHNOLOGIES CO.,LTD - 001940 - Rackable Systems + 002706 + YOISYS - 00193C - HighPoint Technologies Incorporated + 042DB4 + First Property (Beijing) Co., Ltd Modern MOMA Branch - 00195C - Innotech Corporation + 38F85E + HUMAX Co., Ltd. - 00195F - Valemount Networks Corporation + C464B7 + Fiberhome Telecommunication Technologies Co.,LTD - 001948 - AireSpider Networks + 04E0B0 + Shenzhen YOUHUA Technology Co., Ltd - 001943 - Belden + 38B19E + IEEE Registration Authority - 00192E - Spectral Instruments Inc. + 38E26E + ShenZhen Sweet Rain Electronics Co.,Ltd. - 00192B - Aclara RF Systems Inc. + 70C9C6 + Cisco Systems, Inc - 00191E - Beyondwiz Ltd + 689A87 + Amazon Technologies Inc. - 001981 - Vivox Inc + 64AE88 + Polytec GmbH - 001945 - RF Concepts LLC + 00D050 + Iskratel d.o.o. - 00191F - Microlink Communications Inc. + 78DAA2 + Cynosure Technologies Co.,Ltd - 001920 - KUME electric Ltd + 8084A9 + oshkosh Corporation - 001926 - BitsGen Ltd + 180D2C + Intelbras - 001929 - 2M2B Montadora de Maquinas Bahia Brasil LtdA + 98DAC4 + TP-LINK TECHNOLOGIES CO.,LTD. - 0018F1 - Chunichi Denshi Ltd + 00177B + Azalea Networks inc - 0018F2 - Beijing Tianyu Communication Equipment Ltd + 502B98 + Es-tech International - 0018EC - Welding Technology Corporation + C82832 + Beijing Xiaomi Electronics Co., Ltd. - 0018ED - Accutech Ultrasystems Ltd + 701BFB + Integrated Device Technology (Malaysia) Sdn. Bhd. - 00190B - Southern Vision Systems Inc. + 04766E + ALPSALPINE CO,.LTD - 001903 - Bigfoot Networks Inc + AC7A4D + ALPSALPINE CO,.LTD - 001900 - Intelliverese - DBA Voicecom + 38C096 + ALPSALPINE CO,.LTD - 001902 - Cambridge Consultants Ltd + C4346B + Hewlett Packard - 00192A - Antiope Associates + 48F17F + Intel Corporate - 00190F - Advansus Corp. + 002643 + ALPSALPINE CO,.LTD - 001911 - Just In Mobile Information Technologies (Shanghai) Ltd + 1C3477 + Innovation Wireless - 0018E0 - Anaveo + 4CC7D6 + FLEXTRONICS MANUFACTURING(ZHUHAI)CO.,LTD. - 001917 - Posiflex Inc. + C80873 + Ruckus Wireless - 001918 - Interactive Wear AG + 001697 + NEC Corporation - 0018CB - Tecobest Technology Limited + 003013 + NEC Corporation - 0018CE - Dreamtech Ltd + BC3E07 + Hitron Technologies. Inc - 001894 - NPCore Inc. + 48FDA3 + Xiaomi Communications Co Ltd - 001898 - Kingstate Electronics Corporation + 90869B + zte corporation - 001892 - ads-tec GmbH + E0189F + EM Microelectronic - 001891 - Zhongshan General K-mate Electronics Ltd + F81308 + Nokia - 0018AD - Nidec Sankyo Corporation + F8A2D6 + Liteon Technology Corporation - 0018AC - Shanghai Jiao Da HISYS Technology Ltd + 049DFE + Hivesystem - 0018AB - Beijing Lhwt Microelectronics Inc. + D05157 + LEAX Arkivator Telecom - 0018A5 - ADigit Technologies Corp. + FCBE7B + vivo Mobile Communication Co., Ltd. - 001878 - Mackware GmbH + B40FB3 + vivo Mobile Communication Co., Ltd. - 00186A - Global Link Digital Technology Ltd + EC5C68 + CHONGQING FUGUI ELECTRONICS CO.,LTD. - 00186B - Sambu Communics Ltd + 9458CB + Nintendo Co.,Ltd - 00186E - 3Com Corporation + 74366D + Vodafone Italia S.p.A. - 0018A6 - Persistent Systems LLC + 182A44 + HIROSE ELECTRONIC SYSTEM - 00189B - Thomson Inc. + FC94CE + zte corporation - 0018B2 - Adeunis RF + 0CEC84 + Shenzhen TINNO Mobile Technology Corp. - 0018B3 - TEC WizHome Ltd + 9CDB07 + Yellowtec GmbH - 0018BD - Shenzhen Dvbworld Technology Ltd + 28EC9A + Texas Instruments - 001867 - Datalogic ADC + C4E506 + Piper Networks, Inc. - 001865 - Siemens Healthcare Diagnostics Manufacturing Ltd + 0CD0F8 + Cisco Systems, Inc - 001877 - Amplex A/S + DCDA80 + New H3C Technologies Co., Ltd - 001889 - WinNet Solutions Limited + B8259A + Thalmic Labs - 0017F9 - Forcom Sp. z o.o. + F80F6F + Cisco Systems, Inc - 0017F4 - Zeron Alliance + 0080E3 + CORAL NETWORK CORPORATION - 0017F7 - CEM Solutions Pvt Ltd + D8F2CA + Intel Corporate - 0017ED - WooJooIT Ltd + B4C62E + Molex CMS - 001843 - Dawevision Ltd + 282536 + SHENZHEN HOLATEK CO.,LTD - 00182C - Ascend Networks Inc. + B8A175 + Roku, Inc. - 00181D - Asia Electronics Ltd + CCD3C1 + Vestel Elektronik San ve Tic. A.S. - 00181F - Palmmicro Communications + A42655 + LTI Motion (Shanghai) Co., Ltd. - 00181B - TaiJin Metal Ltd + 60A730 + Shenzhen Yipinfang Internet Technology Co.,Ltd - 001805 - Beijing InHand Networking Technology Ltd + 3C9BD6 + Vizio, Inc - 00180D - Terabytes Server Storage Tech Corp + 50DB3F + SHENZHEN GONGJIN ELECTRONICS CO.,LT - 001854 - Argard Ltd + 1081B4 + Hunan Greatwall Galaxy Science and Technology Co.,Ltd. - 001847 - AceNet Technology Inc. + 3881D7 + Texas Instruments - 001836 - REJ Ltd + 1804ED + Texas Instruments - 0017CC - Alcatel-Lucent + D43260 + GoPro - 0017C4 - Quanta Microsystems Inc. + F4DD9E + GoPro - 00179E - Sirit Inc + D4D919 + GoPro - 0017A7 - Mobile Computing Promotion Consortium + CC7286 + Xi'an Fengyu Information Technology Co., Ltd. - 00179F - Apricorn + 6CA928 + HMD Global Oy - 0017B4 - Remote Security Systems LLC + 00D861 + Micro-Star INTL CO., LTD. - 0017AC - O'Neil Product Development Inc. + 74C17D + Infinix mobility limited - 0017AD - AceNet Corporation + 141114 + TECNO MOBILE LIMITED - 0017DD - Clipsal Australia + 00B8B3 + Cisco Systems, Inc - 0017D9 - AAI Corporation + 745F90 + LAM Technologies - 0017DC - Daemyung ZERO1 + F85B9C + SB SYSTEMS Co.,Ltd - 0017BF - Coherent Research Limited + 004279 + Sunitec Enterprise Co.,Ltd - 0017BD - Tibetsystem + A45046 + Xiaomi Communications Co Ltd - 0017A1 - 3soft Inc. + F8501C + Tianjin Geneuo Technology Co.,Ltd - 001792 - Falcom Wireless Comunications GmbH + 70D313 + HUAWEI TECHNOLOGIES CO.,LTD - 001797 - Telsy Elettronica S.p.A. + 9C1D36 + HUAWEI TECHNOLOGIES CO.,LTD - 00178C - Independent Witness Inc. + CCBBFE + HUAWEI TECHNOLOGIES CO.,LTD - 0017CB - Juniper Networks + 44070B + Google, Inc. - 0017D3 - Etymotic Research Inc. + ECF6BD + SNCF MOBILITÉS - 001788 - Philips Lighting BV + B831B5 + Microsoft Corporation - 00173C - Extreme Engineering Solutions + 007C2D + Samsung Electronics Co.,Ltd - 001736 - iiTron Inc. + C84782 + Areson Technology Corp. - 001737 - Industrie Dial Face S.p.A. + E89363 + Nokia - 001733 - SFR + 7C0CF6 + Guangdong Huiwei High-tech Co., Ltd. - 001758 - ThruVision Ltd + 5029F5 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 00174F - iCatch Inc. + 300A60 + IEEE Registration Authority - 00174A - Socomec + 80D065 + CKS Corporation - 00174E - Parama-tech Ltd + 00D6FE + Cisco Systems, Inc - 00176F - PAX Computer Technology(Shenzhen) Ltd + 0CBF74 + Morse Micro - 001771 - APD Communications Ltd + B41D2B + Shenzhen YOUHUA Technology Co., Ltd - 00175B - ACS Solutions Switzerland Ltd + 14C213 + Apple, Inc. - 001729 - Ubicod Ltd + FC8F7D + SHENZHEN GONGJIN ELECTRONICS CO.,LT - 001727 - Thermo Ramsey Italia s.r.l. + 24BE18 + DADOUTEK COMPANY LIMITED - 00172A - Proware Technology Corp.(By Unifosa) + 749D79 + Sercomm Corporation. - 001725 - Liquid Computing + A4D931 + Apple, Inc. - 001764 - ATMedia GmbH + BCFED9 + Apple, Inc. - 00175E - Zed-3 + 808223 + Apple, Inc. - 001766 - Accense Technology Inc. + CC08FB + TP-LINK TECHNOLOGIES CO.,LTD. - 0016D0 - ATech elektronika d.o.o. + BCAF91 + TE Connectivity Sensor Solutions - 0016C3 - BA Systems Inc + 283166 + vivo Mobile Communication Co., Ltd. - 0016F0 - Dell Inc. + C04004 + Medicaroid Corporation - 0016F8 - Aviqtech Technology Ltd - + A4ED43 + IEEE Registration Authority + - 001703 - MOSDAN Internation Ltd + 94298D + Shanghai AdaptComm Technology Co., Ltd. - 0016FC - Tohken Ltd + 00AA6E + Cisco Systems, Inc - 0016E9 - Tiba Medical Inc + F0D7DC + Wesine (Wuhan) Technology Co., Ltd. - 0016DC - Archos + 007204 + Samsung Electronics Co., Ltd. ARTIK - 001714 - BR Controls Nederland bv + 40C81F + Shenzhen Xinguodu Technology Co., Ltd. - 00171B - Innovation Lab Corp. + 0C7C28 + Nokia Solutions and Networks GmbH & Co. KG - 001709 - Exalt Communications + 6843D7 + Agilecom Photonics Solutions Guangdong Limited - 0016C1 - Eleksen Ltd + B86A97 + Edgecore Networks Corporation - 0016A9 - 2EI + A81087 + Texas Instruments - 0016B0 - VK Corporation + 8C8F8B + China Mobile Chongqing branch - 0016B1 - KBS + 00040B + 3COM EUROPE LTD - 0016AE - Inventel + C8C2F5 + FLEXTRONICS MANUFACTURING(ZHUHAI)CO.,LTD. - 0016AC - Toho Technology Corp. + F05849 + CareView Communications - 001683 - WEBIO International Co. Ltd + 8CFE74 + Ruckus Wireless - 001684 - Donjin Ltd + 604BAA + Magic Leap, Inc. - 001687 - Chubb CSC-Vendor AP + E43493 + HUAWEI TECHNOLOGIES CO.,LTD - 00167F - Bluebird Soft Inc. + 342912 + HUAWEI TECHNOLOGIES CO.,LTD - 00164C - PLANET INT Ltd + 48A472 + Intel Corporate - 001649 - SetOne GmbH + 000A5E + 3COM - 001647 - Cisco Systems Inc. + 00105A + 3COM - 001665 - Cellon France + 006097 + 3COM - 00165F - Fairmount Automation + 006008 + 3COM - 00167C - iRex Technologies BV + 000102 + 3COM - 001673 - Bury GmbH & Co. KG + A02833 + IEEE Registration Authority - 001694 - Sennheiser Communications A/S + 001B6E + Keysight Technologies, Inc. - 00169C - Cisco Systems Inc. + 143719 + PT Prakarsa Visi Valutama - 001657 - Aegate Ltd + 582F40 + Nintendo Co.,Ltd - 00168C - DSL Partner AS + 0890BA + Danlaw Inc - 00161B - Micronet Corporation + 4C364E + Panasonic Connect Co., Ltd. - 001618 - HIVION Ltd + BCA58B + Samsung Electronics Co.,Ltd - 00161E - Woojinnet + 80CEB9 + Samsung Electronics Co.,Ltd - 00161F - SUNWAVETEC Ltd + E85D86 + CHANG YOW TECHNOLOGIES INTERNATIONAL CO.,LTD. - 001614 - Picosecond Pulse Labs + 94A3CA + KonnectONE, LLC - 00160E - Optica Technologies Inc. + D0D3FC + Mios, Ltd. - 001643 - Sunhillo Corporation + 6C6CD3 + Cisco Systems, Inc - 001644 - LITE-ON Technology Corp. + E049ED + Audeze LLC - 00163E - Xensource Inc. + 000157 + SYSWAVE CO., LTD - 0015FD - Complete Media Systems + A8016D + Aiwa Corporation - 0015F6 - Science AND Engineering Services Inc. + 0440A9 + New H3C Technologies Co., Ltd - 001634 - Mathtech Inc. + 244CE3 + Amazon Technologies Inc. - 00162C - Xanboo + B8BEF4 + devolo AG - 001605 - Yorkville Sound Inc. + 58FDBE + Shenzhen Taikaida Technology Co., Ltd - 0015F9 - Cisco Systems Inc. + F4F197 + EMTAKE Inc - 0015E3 - Dream Technologies Corporation + 6CED51 + NEXCONTROL Co.,Ltd - 0015E0 - Ericsson + 1062E5 + Hewlett Packard - 0015F3 - Peltor AB + 04C3E6 + IEEE Registration Authority - 0015D3 - Pantech & Curitel Communications Inc. + 98BB99 + Phicomm (Sichuan) Co.,Ltd. - 0015AD - Accedian Networks + 002622 + COMPAL INFORMATION (KUNSHAN) CO., LTD. - 0015AC - Capelon AB + 0020B5 + YASKAWA ELECTRIC CORPORATION - 0015A9 - Kwang WOO I&C Ltd + 286336 + Siemens AG - 00E0A8 - SAT GmbH & Co. + 14D169 + HUAWEI TECHNOLOGIES CO.,LTD - 001574 - Horizon Semiconductors Ltd + 1CC3EB + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 00158A - SURECOM Technology Corp. + F460E2 + Xiaomi Communications Co Ltd - 00158E - Plustek.Inc + E4D124 + Mojo Networks, Inc. - 001589 - D-MAX Technology Ltd + 9CC950 + Baumer Holding - 0015B4 - Polymap Wireless LLC + F89910 + Integrated Device Technology (Malaysia) Sdn. Bhd. - 0015CA - TeraRecon Inc. + 50E0EF + Nokia - 001598 - Kolektor group + 60F18A + HUAWEI TECHNOLOGIES CO.,LTD - 001512 - Zurich University Of Applied Sciences + C49500 + Amazon Technologies Inc. - 00150A - Sonoa Systems Inc. + 68DD26 + Shanghai Focus Vision Security Technology Co.,Ltd - 001570 - Zebra Technologies Inc + 2866E3 + AzureWave Technology Inc. - 00156E - A. W. Communication Systems Ltd + 848A8D + Cisco Systems, Inc - 001568 - Dilithium Networks + E06267 + Xiaomi Communications Co Ltd - 00154B - Wonde Proud Technology Ltd + 70B7AA + vivo Mobile Communication Co., Ltd. - 001548 - Cube Technologies + 0013A3 + Siemens Home & Office Comm. Devices - 00155F - GreenPeak Technologies + 082525 + Xiaomi Communications Co Ltd - 00155A - Dainippon Pharmaceutical Ltd + 84B31B + Kinexon GmbH - 00151D - M2I Corporation + F8272E + Mercku - 00153C - Kprotech Ltd + A83E0E + HMD Global Oy - 00153A - Shenzhen Syscan Technology Ltd + 10C172 + HUAWEI TECHNOLOGIES CO.,LTD - 001532 - Consumer Technologies Group LLC + 000EEE + Muco Industrie BV - 00149B - Nokota Communications LLC + 7C1C4E + LG Innotek - 0014A1 - Synchronous Communication Corp + D8B6B7 + Comtrend Corporation - 00149E - UbONE Ltd + 8C14B4 + zte corporation - 0014A2 - Core Micro Systems Inc. + 3C9872 + Sercomm Corporation. - 0014AD - Gassner Wiege- und Messtechnik GmbH + 40C3C6 + SnapRoute - 0014AF - Datasym POS Inc. + D01CBB + Beijing Ctimes Digital Technology Co., Ltd. - 0014A9 - Cisco Systems Inc. + 7487BB + Ciena Corporation - 0014FF - Precise Automation Inc. + C0B6F9 + Intel Corporate - 0014FA - AsGa S.A. + DCE305 + AO - 0014FB - Technical Solutions Inc. + A4DA32 + Texas Instruments - 0014D2 - Kyuden Technosystems Corporation + 780473 + Texas Instruments - 0014DC - Communication System Design & Manufacturing (CSDM) + 504C7E + THE 41ST INSTITUTE OF CETC - 0014CD - DigitalZone Ltd + 2C4759 + Beijing MEGA preponderance Science & Technology Co. Ltd - 0014C0 - Symstream Technology Group Ltd + DCE0EB + Nanjing Aozheng Information Technology Co.Ltd - 0014C1 - U.S. Robotics Corporation + 00409D + DigiBoard - 0014C4 - Vitelcom Mobile Technology + 149346 + PNI sensor corporation - 0014EC - Acro Telecom + 00138A + Qingdao GoerTek Technology Co., Ltd. - 0014EB - AwarePoint Corporation + A830AD + WEIFANG GOERTEK ELECTRONICS CO.,LTD - 0014AB - Senhai Electronic Technology Ltd + A41566 + WEIFANG GOERTEK ELECTRONICS CO.,LTD - 0014B0 - Naeil Community + 1C965A + WEIFANG GOERTEK ELECTRONICS CO.,LTD - 0014F4 - DekTec Digital Video B.V. + 401B5F + WEIFANG GOERTEK ELECTRONICS CO.,LTD - 0014F5 - OSI Security Devices + 144F8A + Intel Corporate - 00148E - Tele Power Inc. + 002106 + RIM Testing Services - 00148F - Protronic (Far East) Ltd + 5CCD7C + MEIZU Technology Co.,Ltd. - 00148C - General Dynamics Mission Systems + 5C9656 + AzureWave Technology Inc. - 001487 - American Technology Integrators + E06066 + Sercomm Corporation. - 001444 - Grundfos Holding + BC5FF6 + MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. - 001437 - GSTeletech Ltd + C8E7D8 + MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. - 001431 - PDL Electronics Ltd + A8E552 + JUWEL Aquarium AG & Co. KG - 00144D - Intelligent Systems + 60D21C + Sunnovo International Limited - 00144A - Taiwan Thick-Film Ind. Corp. + CC51B4 + Integrated Device Technology (Malaysia) Sdn. Bhd. - 001445 - Telefon-Gradnja d.o.o. + 00C3F4 + Samsung Electronics Co.,Ltd - 001468 - CelPlan International Inc. + B88AEC + Nintendo Co.,Ltd - 00147C - 3Com Corporation + 78725D + Cisco Systems, Inc - 001481 - Multilink Inc + B46BFC + Intel Corporate - 001464 - Cryptosoft + B0FC0D + Amazon Technologies Inc. - 00145E - IBM Corp + CCC92C + Schindler - PORT Technology - 001458 - HS Automatic ApS + 001E39 + Comsys Communication Ltd. - 001421 - Total Wireless Technologies Pte Ltd + EC8C9A + HUAWEI TECHNOLOGIES CO.,LTD - 001420 - G-Links networking Company + B48655 + HUAWEI TECHNOLOGIES CO.,LTD - 001418 - C4Line + D0D783 + HUAWEI TECHNOLOGIES CO.,LTD - 00141B - Cisco Systems Inc. + FCE66A + Industrial Software Co - 0013F0 - Wavefront Semiconductor + 7836CC + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 0013EF - Kingjon Digital Technology Ltd + 70C833 + Wirepas Oy - 0013EB - Sysmaster Corporation + 0C73EB + IEEE Registration Authority - 0013EC - Netsnapper Technologies SARL + F0B5D1 + Texas Instruments - 00142B - Edata Communication Inc. + 00E000 + FUJITSU LIMITED - 00142C - Koncept International Inc. + 90848B + HDR10+ Technologies, LLC - 001424 - Merry Electrics Ltd + 0CF5A4 + Cisco Systems, Inc - 0013D0 - t+ Medical Ltd + 80C7C5 + Fiberhome Telecommunication Technologies Co.,LTD - 0013D2 - Page Iberica, S.A. + 2816A8 + Microsoft Corporation - 0013D1 - KIRK telecom A/S + 048AE1 + FLEXTRONICS MANUFACTURING(ZHUHAI)CO.,LTD. - 00140F - Federal State Unitary Enterprise Leningrad R&D Institute Of + 8CCF5C + BEFEGA GmbH - 001407 - Sperian Protection Instrumentation + 501D93 + HUAWEI TECHNOLOGIES CO.,LTD - 001406 - Go Networks + C8D779 + QING DAO HAIER TELECOM CO.,LTD. - 00140A - WEPIO Ltd + 10B36F + Bowei Technology Company Limited - 0013FA - LifeSize Communications Inc. + FC9BC6 + Sumavision Technologies Co.,Ltd - 0013FB - RKC Instrument Inc. + C8292A + Barun Electronics - 0013DC - Ibtek Inc. + 0080BA + SPECIALIX (ASIA) PTE, LTD - 0013BA - ReadyLinks Inc + 480BB2 + IEEE Registration Authority - 0013B8 - RyCo Electronic Systems Limited + CCC079 + Murata Manufacturing Co., Ltd. - 0013B6 - Sling Media Inc. + F09CD7 + Guangzhou Blue Cheetah Intelligent Technology Co., Ltd. - 00137D - Dynalab Inc. + BCE143 + Apple, Inc. - 001383 - Application Technologies and Engineering Research Laboratory + E482CC + Jumptronic GmbH - 001387 - 27M Technologies AB + B0416F + Shenzhen Maxtang Computer Co.,Ltd - 001373 - BLwave Electronics Ltd + E019D8 + BH TECHNOLOGIES - 001366 - Neturity Technologies Inc. + 48605F + LG Electronics (Mobile Communications) - 00135B - PanelLink Cinema LLC + 30D9D9 + Apple, Inc. - 00136F - PacketMotion Inc. + 6030D4 + Apple, Inc. - 001368 - Saab Danmark A/S + F895EA + Apple, Inc. - 0013B4 - Appear TV + 18F1D8 + Apple, Inc. - 0013AE - Radiance Technologies Inc. + 647033 + Apple, Inc. - 001397 - Oracle Corporation + 846878 + Apple, Inc. - 0013C3 - Cisco Systems Inc. + C8D083 + Apple, Inc. - 0013BD - Hymatom SA + 8C4CDC + PLANEX COMMUNICATIONS INC. - 001391 - Ouen Ltd + BCAB7C + TRnP KOREA Co Ltd - 001323 - Cap Ltd + 6C3838 + Marking System Technology Co., Ltd. - 001314 - Asiamajor Inc. + 9C2EA1 + Xiaomi Communications Co Ltd - 001316 - L-S-B Broadcast Technologies GmbH + 0C6ABC + Fiberhome Telecommunication Technologies Co.,LTD - 001312 - Amedia Networks Inc. + 3CCD5D + HUAWEI TECHNOLOGIES CO.,LTD - 001336 - Tianjin 712 Communication Broadcasting Ltd + 7C7668 + HUAWEI TECHNOLOGIES CO.,LTD - 00135E - EAB/RWI/K + 001386 + ABB Inc/Totalflow - 00134E - Valox Systems Inc. + 003C10 + Cisco Systems, Inc - 001344 - Fargo Electronics Inc. + F041C8 + IEEE Registration Authority - 001348 - Artila Electronics Ltd + CC9916 + Integrated Device Technology (Malaysia) Sdn. Bhd. - 0012EF - OneAccess SA + EC7FC6 + ECCEL CORPORATION SAS - 0012E9 - Abbey Systems Ltd + A438CC + Nintendo Co.,Ltd - 001300 - IT-Factory Inc. + 74721E + Edison Labs Inc. - 001322 - DAQ Electronics Inc. + 780F77 + HangZhou Gubei Electronics Technology Co.,Ltd - 0012D5 - Motion Reality Inc. + 4CABFC + zte corporation - 0012D8 - International Games System Ltd + 7C2A31 + Intel Corporate - 00129A - IRT Electronics Pty Ltd + 0CF346 + Xiaomi Communications Co Ltd - 00128D - STB Datenservice GmbH + 7470FD + Intel Corporate - 0012DB - ZIEHL Industrie-elektronik GmbH + Co KG + 5065F3 + Hewlett Packard - 0012D6 - Jiangsu Yitong High-Tech Ltd + 3C9509 + Liteon Technology Corporation - 0012DA - Cisco Systems Inc. + 30FD38 + Google, Inc. - 0012D3 - Zetta Systems Inc. + 64CB5D + SIA TeleSet - 0012A2 - Vita + 5821E9 + TWPI - 0012A5 - Dolphin Interconnect Solutions AS + F0E3DC + Tecon MT, LLC - 0012A8 - intec GmbH + A8DA01 + Shenzhen NUOLIJIA Digital Technology Co.,Ltd - 00129E - Surf Communications Inc. + 88E90F + innomdlelab - 0012BA - FSI Systems Inc. + 0010D8 + CALISTA - 0012B2 - Avolites Ltd + 002194 + Ping Communication - 0012AE - HLS HARD-LINE Solutions Inc. + 1894C6 + ShenZhen Chenyee Technology Co., Ltd. - 0012AF - ELPRO Technologies + 80AD16 + Xiaomi Communications Co Ltd - 0012E6 - Spectec Computer Ltd + 044EAF + LG Innotek - 001236 - ConSentry Networks + 98D863 + Shanghai High-Flying Electronics Technology Co., Ltd - 001235 - Andrew Corporation + C49F4C + HUAWEI TECHNOLOGIES CO.,LTD - 001245 - Zellweger Analytics Inc. + 0C704A + HUAWEI TECHNOLOGIES CO.,LTD - 001242 - Millennial Net + 10F9EB + Industria Fueguina de Relojería Electrónica s.a. - 001241 - a2i marketing center + 5C5AEA + FORD - 00123B - KeRo Systems ApS + 000B7B + Test-Um Inc. - 001287 - Digital Everywhere Unterhaltungselektronik GmbH + C88F26 + Skyworth Digital Technology(Shenzhen) Co.,Ltd - 001282 - Qovia + 20365B + Megafone Limited - 001285 - Gizmondo Europe Ltd + E8DE00 + ChongQing GuanFang Technology Co.,LTD - 001277 - Korenix Technologies Ltd + FC643A + Samsung Electronics Co.,Ltd - 00126D - University Of California, Berkeley + 003074 + EQUIINET LTD. - 001267 - Panasonic Corporation + B0B3AD + HUMAX Co., Ltd. - 001265 - Enerdyne Technologies Inc. + 40BD32 + Texas Instruments - 001257 - LeapComm Communication Technologies Inc. + CC8E71 + Cisco Systems, Inc - 001251 - Silink + 70D081 + Beijing Netpower Technologies Inc. - 00128E - Q-Free ASA + 70C94E + Liteon Technology Corporation - 001292 - Griffin Technology + 38F554 + HISENSE ELECTRIC CO.,LTD - 0011F3 - NeoMedia Europe AG + 18A28A + Essel-T Co., Ltd - 0011E9 - Starnex Ltd + A8515B + Samsung Electronics Co.,Ltd - 0011EC - Avix Inc. + 001936 + STERLITE OPTICAL TECHNOLOGIES LIMITED - 0011E7 - WORLDSAT - Texas de France + 3CE824 + HUAWEI TECHNOLOGIES CO.,LTD - 001202 - Decrane Aerospace - Audio International Inc. + 54B7E5 + Rayson Technology Co., Ltd. - 0011FE - Keiyo System Research Inc. + 946372 + vivo Mobile Communication Co., Ltd. - 0011FD - Korg Inc. + BC0FA7 + Ouster - 0011FA - Rane Corporation + F0C9D1 + GD Midea Air-Conditioning Equipment Co.,Ltd. - 0011CE - Ubisense Limited + F8C120 + Xi'an Link-Science Technology Co.,Ltd - 0011D0 - Tandberg Data ASA + B4FBF9 + HUAWEI TECHNOLOGIES CO.,LTD - 0011C3 - Transceiving System Technology Corporation + 506F77 + HUAWEI TECHNOLOGIES CO.,LTD - 0011C2 - United Fiber Optic Communication + 0C41E9 + HUAWEI TECHNOLOGIES CO.,LTD - 001228 - Data Ltd + 70F220 + Actiontec Electronics, Inc - 00121F - Harding Instruments + 345A06 + SHARP Corporation - 001220 - Cadco Systems + 0402CA + Shenzhen Vtsonic Co.,ltd - 001229 - BroadEasy Technologies Ltd + 3CFB5C + Fiberhome Telecommunication Technologies Co.,LTD - 001226 - Japan Direx Corporation + 7440BB + Hon Hai Precision Ind. Co.,Ltd. - 001222 - Skardin (UK) Ltd + 88BD45 + Samsung Electronics Co.,Ltd - 0011E8 - Tixi.com + 54FCF0 + Samsung Electronics Co.,Ltd - 0011E0 - U-MEDIA Communications Inc. + 306A85 + Samsung Electronics Co.,Ltd - 00120D - Advanced Telecommunication Technologies Inc. + 4CDD31 + Samsung Electronics Co.,Ltd - 00120E - AboCom + B4DE31 + Cisco Systems, Inc - 0011F2 - Institute Of Network Technologies + A44027 + zte corporation - 001210 - WideRay Corp + B4F7A1 + LG Electronics (Mobile Communications) - 0011A4 - JStream Technologies Inc. + 70EF00 + Apple, Inc. - 001198 - Prism Media Products Limited + 28EDE0 + AMPAK Technology, Inc. - 001197 - Monitoring Technologies Limited + 1C1161 + Ciena Corporation - 001199 - 2wcom Systems GmbH + C87765 + Tiesse SpA - 0011A7 - Infilco Degremont Inc. + D0817A + Apple, Inc. - 0011A9 - MOIMSTONE Ltd + 98CA33 + Apple, Inc. - 0011A3 - LanReady Technologies Inc. + 68AB1E + Apple, Inc. - 001176 - Intellambda Systems Inc. + BCFFEB + Motorola Mobility LLC, a Lenovo Company - 001177 - Coaxial Networks Inc. + 2C37C5 + Qingdao Haier Intelligent Home Appliance Technology Co.,Ltd - 001170 - GSC SRL + 7C7630 + Shenzhen YOUHUA Technology Co., Ltd - 00116B - Digital Data Communications Asia Ltd + 9822EF + Liteon Technology Corporation - 001169 - EMS Satcom + 7C7635 + Intel Corporate - 001162 - Star Micronics Ltd + B80716 + vivo Mobile Communication Co., Ltd. - 001181 - InterEnergy Ltd + 788038 + FUNAI ELECTRIC CO., LTD. - 001194 - Chi Mei Communication Systems Inc. + F045DA + Texas Instruments - 0011BF - AESYS S.p.A. + 1CEEC9 + Elo touch solutions - 0011B7 - Octalix B.V. + 001862 + Seagate Technology - 0011B9 - Inner Range Pty Ltd + 000C50 + Seagate Technology - 001109 - Micro-Star International + E4F042 + Google, Inc. - 001104 - Telexy + 20B399 + Enterasys - 001161 - NetStreams LLC + CC2D21 + Tenda Technology Co.,Ltd.Dongguan branch - 001156 - Pharos Systems NZ + 004097 + DATEX DIVISION OF - 001159 - Matisse Networks Inc + 4048FD + IEEE Registration Authority - 00115C - Cisco Systems Inc. + A8EEC6 + Muuselabs NV/SA - 00115D - Cisco Systems Inc. + 9C4FCF + TCT mobile ltd - 001126 - Venstar Inc. + D896E0 + Alibaba Cloud Computing Ltd. - 00112E - Ceicom + 207852 + Nokia Solutions and Networks GmbH & Co. KG - 001122 - CIMSYS Inc + F417B8 + AirTies Wireless Networks - 001117 - Cesnet + 38F73D + Amazon Technologies Inc. - 001116 - Coteau Vert Ltd + B8F74A + RCNTEC - 001110 - Maxanna Technology Ltd + ECF451 + Arcadyan Corporation - 00113B - Micronet Communications Inc. + 581243 + AcSiP Technology Corp. - 00113D - KN Soltec Ltd + 58C17A + Cambium Networks Limited - 001134 - MediaCell Inc. + E0AADB + Nanjing PANENG Technology Development Co.,Ltd - 001135 - Grandeye Ltd + C8DEC9 + Coriant - 001121 - Cisco Systems Inc. + 342AF1 + Texas Instruments - 001149 - Proliphix Inc. + 0C6111 + Anda Technologies SAC - 000FC0 - DELCOMp + 0022C4 + epro GmbH - 000FBA - Tevebox AB + 0C1539 + Apple, Inc. - 000FB8 - CallURL Inc. + 1C330E + PernixData - 000FB7 - Cavium + 44D5A5 + AddOn Computer - 000FD3 - Digium + 645106 + Hewlett Packard - 000FD1 - Applied Wireless Identifications Group Inc. + 00BE9E + Fiberhome Telecommunication Technologies Co.,LTD - 000FC1 - WAVE Corporation + 54C57A + Sunnovo International Limited - 001100 - Schneider Electric + 6C5697 + Amazon Technologies Inc. - 000FFA - Optinel Systems Inc. + F87B20 + Cisco Systems, Inc - 000FFD - Glorytek Network Inc. + 38AD8E + New H3C Technologies Co., Ltd - 000FF9 - Valcretec Inc. + 34D0B8 + IEEE Registration Authority - 000FC4 - NST Ltd + ECFAF4 + SenRa Tech Pvt. Ltd - 000FC9 - Allnet GmbH + 0005FF + SNS Solutions, Inc. - 000FC6 - Eurocom Industries A/S + D88F76 + Apple, Inc. - 000FBE - e-w/you Inc. + 409C28 + Apple, Inc. - 000FA9 - PC Fabrik + 001C73 + Arista Networks - 000F9A - Synchrony Inc. + 2C8A72 + HTC Corporation - 000FEA - Giga-Byte Technology Ltd + 38019F + SHENZHEN FAST TECHNOLOGIES CO.,LTD - 000FF7 - Cisco Systems Inc. + 245CCB + AXIe Consortium, Inc. - 000FD8 - Force Inc. + 609BC8 + Hipad Intelligent Technology Co., Ltd. - 000F8D - FAST TV-Server AG + 406A8E + Hangzhou Puwell OE Tech Ltd. - 000F85 - ADDO-Japan Corporation + 1C0FAF + Lucid Vision Labs - 000F82 - Mortara Instrument Inc. + 88B4A6 + Motorola Mobility LLC, a Lenovo Company - 000F49 - Northover Solutions Limited + 54DF24 + Fiberhome Telecommunication Technologies Co.,LTD - 000F4B - Oracle Corporation + AC1DDF + IEEE Registration Authority - 000F44 - Tivella Inc. + 24B209 + Avaya Inc - 000F4A - Kyushu-kyohan Ltd + FC65DE + Amazon Technologies Inc. - 000F81 - PAL Pacific Inc. + BC903A + Robert Bosch GmbH - 000F7F - UBSTORAGE Ltd + E8D819 + AzureWave Technology Inc. - 000F95 - ELECOM Ltd Laneed Division + B06EBF + ASUSTek COMPUTER INC. - 000F55 - Datawire Communication Networks Inc. + 002128 + Oracle Corporation - 000F56 - Continuum Photonics Inc + 28CF08 + ESSYS - 000F60 - Lifetron Ltd + 74860B + Cisco Systems, Inc - 000F5B - Delta Information Systems Inc. + 182D98 + Jinwoo Industrial system - 000F8A - WideView + 782D7E + TRENDnet, Inc. - 000F90 - Cisco Systems Inc. + 741AE0 + IEEE Registration Authority - 000F77 - Dentum Ltd + 583879 + RICOH COMPANY, LTD. - 000F7B - Arce Sistemas, S.A. + F44C70 + Skyworth Digital Technology(Shenzhen) Co.,Ltd - 000F68 - Vavic Network Technology Inc. + 78321B + D-Link International - 000EE2 - Custom Engineering + D8A534 + Spectronix Corporation - 000EE3 - Chiyu Technology Ltd + 00A096 + MITSUMI ELECTRIC CO.,LTD. - 000EE5 - bitWallet Inc. + 78617C + MITSUMI ELECTRIC CO.,LTD. - 000EDA - C-Tech United Corp. + EC51BC + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 000ECF - PROFIBUS Nutzerorganisation e.V. + F079E8 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 000EEB - Sandmartin(zhong shan)Electronics Ltd + D0B128 + Samsung Electronics Co.,Ltd - 000EEC - Orban + BC5451 + Samsung Electronics Co.,Ltd - 000EEF - Private + 08661F + Palo Alto Networks - 000EF1 - Ezquest Inc. + 74EAC8 + New H3C Technologies Co., Ltd - 000EE7 - AAC Electronics Corp. + B4D64E + Caldero Limited - 000F1C - DigitAll World Ltd + F89DBB + Tintri - 000F1A - Gaming Support B.V. + 904E91 + IEEE Registration Authority - 000F0A - Clear Edge Networks + DC0C2D + WEIFANG GOERTEK ELECTRONICS CO.,LTD - 000F02 - Digicube Technology Ltd + C4F312 + Texas Instruments - 000F2F - W-Linx Technology Ltd + 601803 + Daikin Air-conditioning (Shanghai) Co., Ltd. - 000F2D - Chung-Hsin Electric & Machinery MFG.Corp. + 8CFEB4 + VSOONTECH ELECTRONICS CO., LIMITED - 000EF7 - Vulcan Portals Inc + 940E6B + HUAWEI TECHNOLOGIES CO.,LTD - 000EF0 - Festo AG & Co. KG + 64FB50 + RoomReady/Zdi, Inc. - 000EE9 - WayTech Development Inc. + 58B42D + YSTen Technology Co.,Ltd - 000F40 - Optical Internetworking Forum + 34298F + IEEE Registration Authority - 000F33 - DUALi Inc. + 5CEA1D + Hon Hai Precision Ind. Co.,Ltd. - 000F05 - 3B System Inc. + 181456 + Nokia Corporation - 000EC9 - YOKO Technology Corp. + 78CA04 + Nokia Corporation - 000EBD - Burdick, a Quinton Compny + 104B46 + Mitsubishi Electric Corporation - 000EB9 - HASHIMOTO Electronics Industry Ltd + 0017C8 + KYOCERA Display Corporation - 000EB2 - Micro-Research Finland Oy + 5CE8B7 + Oraimo Technology Limited - 000ED0 - Privaris Inc. + CC66B2 + Nokia - 000EC3 - Logic Controls Inc. + 38E2DD + zte corporation - 000EC4 - Iskra Transmission d.d. + 885DFB + zte corporation - 000EC1 - MYNAH Technologies + 68ECC5 + Intel Corporate - 000E89 - Clematic + 3C11B2 + Fraunhofer FIT - 000E79 - Ample Communications Inc. + 288CB8 + zte corporation - 000EA1 - Formosa Teletek Corporation + 78BC1A + Cisco Systems, Inc - 000E98 - HME Clear- Ltd + 005C86 + SHENZHEN FAST TECHNOLOGIES CO.,LTD - 000E99 - Spectrum Digital Inc. + 5C546D + HUAWEI TECHNOLOGIES CO.,LTD - 000E95 - Fujiya Denki Seisakusho Ltd + 48BCA6 + ​ASUNG TECHNO CO.,Ltd - 000E97 - Ultracker Technology Co. Inc. + 3C10E6 + PHAZR Inc. - 000EA7 - Endace Technology + 30053F + JTI Co.,Ltd. - 000E6F - IRIS Corporation Berhad + B009DA + Ring Solutions - 000EB5 - Ecastle Electronics Ltd + 00054F + Garmin International - 000E50 - Thomson Telecom Belgium + 904506 + Tokyo Boeki Medisys Inc. - 000E4B - atrium c and i + 0021A1 + Cisco Systems, Inc - 000E2B - Safari Technologies + E048D3 + MOBIWIRE MOBILES (NINGBO) CO.,LTD - 000E28 - Dynamic Ratings P/L + B8DB1C + Integrated Device Technology (Malaysia) Sdn. Bhd. - 000E24 - Huwell Technology Inc. + 58E28F + Apple, Inc. - 000E3F - Soronti Inc. + 787B8A + Apple, Inc. - 000E45 - Beijing Newtry Electronic Technology Ltd + 000C03 + HDMI Licensing, LLC - 000E1D - ARION Technology Inc. + F4939F + Hon Hai Precision Industry Co., Ltd. - 000E12 - Adaptive Micro Systems Inc. + 000726 + SHENZHEN GONGJIN ELECTRONICS CO.,LT - 000E4F - Trajet GmbH + FC8B97 + SHENZHEN GONGJIN ELECTRONICS CO.,LT - 000E38 - Cisco Systems Inc. + FC7F56 + CoSyst Control Systems GmbH - 000E36 - HEINESYS Inc. + 2C4053 + Samsung Electronics Co.,Ltd - 000E17 - Private + 0C8FFF + HUAWEI TECHNOLOGIES CO.,LTD - 000E15 - Tadlys Ltd + 54B121 + HUAWEI TECHNOLOGIES CO.,LTD - 000E01 - ASIP Technologies Inc. + A80C63 + HUAWEI TECHNOLOGIES CO.,LTD - 000DCB - Petcomkorea Ltd + 5CC307 + HUAWEI TECHNOLOGIES CO.,LTD - 000DCC - NEOSMART Corp. + 788C4D + Indyme Solutions, LLC - 000DCE - Dynavac Technology Pte Ltd + DCEB53 + Wuhan QianXiao Elecronic Technology CO.,LTD - 000DE8 - Nasaco Electronics Pte Ltd + EC8AC7 + Fiberhome Telecommunication Technologies Co.,LTD - 000DE9 - Napatech Aps + 88365F + LG Electronics (Mobile Communications) - 000DE6 - Youngbo Engineering Ltd + F0EFD2 + TF PAYMENT SERVICE CO., LTD - 000DC3 - First Communication Inc. + 788102 + Sercomm Corporation. - 000DB9 - PC Engines GmbH + 84AA9C + MitraStar Technology Corp. - 000DB7 - Sanko Electric Ltd + 2CAB25 + SHENZHEN GONGJIN ELECTRONICS CO.,LT - 000DAC - Japan CBM Corporation + 1CA532 + SHENZHEN GONGJIN ELECTRONICS CO.,LT - 000DDF - Japan Image & Network Inc. + 001F92 + Motorola Solutions Inc. - 000DDB - Airwave Technologies Inc. + 0025C4 + Ruckus Wireless - 000E04 - CMA/Microdialysis AB + C0C520 + Ruckus Wireless - 000D2A - Scanmatic AS + 70DEF9 + FAI WAH INTERNATIONAL (HONG KONG) LIMITED - 000D29 - Cisco Systems Inc. + 4CB008 + Shenzhen Gwelltimes Technology Co.,Ltd - 000D26 - Primagraphics Limited + E86FF2 + Actiontec Electronics, Inc - 000D46 - Parker SSD Drives + 005018 + AMIT, Inc. - 000D41 - Siemens AG ICM MP UC RD IT KLF1 + FC2F6B + Everspin Technologies, Inc. - 000D42 - Newbest Development Limited + 101B54 + HUAWEI TECHNOLOGIES CO.,LTD - 000D3C - i.Tech Dynamic Ltd + 7CBACC + IEEE Registration Authority - 000D55 - SANYCOM Technology Ltd + 540237 + Teltronic AG - 000D57 - Fujitsu I-Network Systems Limited. + E0107F + Ruckus Wireless - 000D58 - Private + C4017C + Ruckus Wireless - 000D51 - DivR Systems Inc. + 404229 + Layer3TV, Inc - 000D39 - Network Electronics + F81D90 + Solidwintech - 000D35 - PAC International Ltd + B0EABC + ASKEY COMPUTER CORP - 000D95 - Opti-cell Inc. + 94C691 + EliteGroup Computer Systems Co., LTD - 000D91 - Eclipse (HQ Espana) S.L. + 3CF591 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 000D62 - Funkwerk Dabendorf GmbH + 602101 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 000D65 - Cisco Systems Inc. + 7CEB7F + Dmet Products Corp. - 000D45 - Tottori SANYO Electric Ltd + 8C8580 + Smart Innovation LLC - 000DA1 - MIRAE ITS Ltd + 287B09 + zte corporation - 000D80 - Online Development Inc + A06A44 + Vizio, Inc - 000D13 - Wilhelm Rutenbeck GmbH&Co.KG + 88B111 + Intel Corporate - 000D19 - ROBE Show lighting + DCBE7A + Zhejiang Nurotron Biotechnology Co. - 000D1C - Amesys Defense + 3438B7 + HUMAX Co., Ltd. - 000CED - Real Digital Media + 78B28D + Beijing Tengling Technology CO.Ltd - 000CF0 - M & N GmbH + 784501 + Biamp Systems - 000CF4 - Akatsuki Electric MFG Ltd + 54D751 + Proximus - 000CF3 - Call Image SA + CC0677 + Fiberhome Telecommunication Technologies Co.,LTD - 000CCF - Cisco Systems Inc. + 14780B + Varex Imaging Deutschland AG - 000CD8 - M. K. Juchheim GmbH & Co + 0080C2 + IEEE 802.1 Chair - 000CC6 - Ka-Ro electronics GmbH + ECF342 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 000D01 - P&E Microcomputer Systems Inc. + D4258B + Intel Corporate - 000D00 - Seaway Networks Inc. + 041B6D + LG Electronics (Mobile Communications) - 000CF9 - Xylem Water Solutions + F44156 + Arrikto Inc. - 000CC4 - Tiptel AG + 986C5C + Jiangxi Gosun Guard Security Co.,Ltd - 000CBA - Jamex Inc. + 50FF20 + Keenetic Limited - 000CD1 - SFOM Technology Corp. + 688DB6 + AETEK INC. - 000CCE - Cisco Systems Inc. + 00F82C + Cisco Systems, Inc - 000CE0 - Trek Diagnostics Inc. + 00C1B1 + Cisco Systems, Inc - 000CE2 - Rolls-Royce + F4FCB1 + JJ Corp - 000D0C - MDI Security Systems + 8C395C + Bit4id Srl - 000D16 - UHS Systems Pty Ltd + 309C23 + Micro-Star INTL CO., LTD. - 000D1F - AV Digital + 145E45 + Bamboo Systems Group - 000CAD - BTU International + ACAFB9 + Samsung Electronics Co.,Ltd - 000CAA - Cubic Transportation Systems Inc + 181212 + Cepton Technologies - 000CAC - Citizen Watch Ltd + 70D923 + vivo Mobile Communication Co., Ltd. - 000CAE - Ailocom Oy + B83A08 + Tenda Technology Co.,Ltd.Dongguan branch - 000CA3 - Rancho Technology Inc. + 50D37F + Yu Fly Mikly Way Science and Technology Co., Ltd. - 000C9C - Chongho Information & Communications + B03D96 + Vision Valley FZ LLC - 000C97 - NV ADB TTV Technologies SA + F894C2 + Intel Corporate - 000C8F - Nergal s.r.l. + 70D379 + Cisco Systems, Inc - 000C92 - WolfVision GmbH + 100501 + PEGATRON CORPORATION - 000C93 - Xeline Ltd + D8C8E9 + Phicomm (Shanghai) Co., Ltd. - 000C7F - synertronixx GmbH + 7CB960 + Shanghai X-Cheng telecom LTD - 000C81 - Schneider Electric (Australia) + 28B448 + HUAWEI TECHNOLOGIES CO.,LTD - 000C9E - MemoryLink Corp. + 70DB98 + Cisco Systems, Inc - 000C95 - PrimeNet + 30D386 + zte corporation - 000C76 - Micro-Star International + 24792A + Ruckus Wireless - 000C80 - Opelcomm Inc. + A49BF5 + Hybridserver Tec GmbH - 000C7D - Teikoku Electric MFG Ltd + F470AB + vivo Mobile Communication Co., Ltd. - 000CB7 - Nanjing Huazhuo Electronics Ltd + 2C5A0F + Cisco Systems, Inc - 000C68 - SigmaTel Inc. + 2C3124 + Cisco Systems, Inc - 000C07 - Iftest AG + 9CC8AE + Becton, Dickinson and Company - 000C0C - Appro Technology Inc. + B0359F + Intel Corporate - 000C0E - XtremeSpectrum Inc. + C0D962 + ASKEY COMPUTER CORP - 000C12 - Micro-Optronic-Messtechnik GmbH + F80BCB + Cisco Systems, Inc - 000C10 - PNI Corporation + B47C9C + Amazon Technologies Inc. - 000C40 - Altech Controls + 503DA1 + Samsung Electronics Co.,Ltd - 000C3E - Crest Audio + 503237 + Apple, Inc. - 000C3A - Oxance + B0481A + Apple, Inc. - 000C35 - KaVo Dental GmbH & Co. KG + B49CDF + Apple, Inc. - 000C56 - Megatel Computer (1986) Corp. + 48BF6B + Apple, Inc. - 000C57 - MACKIE Engineering Services Belgium BVBA + 2CFAA2 + Alcatel-Lucent Enterprise - 000C23 - Beijing Lanchuan Tech Ltd + E8E732 + Alcatel-Lucent Enterprise - 000C25 - Allied Telesis Labs Inc. + 7C2664 + Sagemcom Broadband SAS - 000C18 - Zenisu Keisoku Inc. + AC6B0F + CADENCE DESIGN SYSTEMS INC - 000C0A - Guangdong Province Electronic Technology Research Institute + 7C3866 + Texas Instruments - 000C0B - Broadbus Technologies + 0C61CF + Texas Instruments - 000C4A - Cygnus Microsystems (P) Limited + 9C1D58 + Texas Instruments - 000C54 - Pedestal Networks Inc. + 58821D + H. Schomäcker GmbH - 000C37 - Geomation Inc. + D8A105 + Syslane, Co., Ltd. - 000BE8 - Aoip + 3C0518 + Samsung Electronics Co.,Ltd - 000BDC - Akcp + 900628 + Samsung Electronics Co.,Ltd - 000BD8 - Industrial Scientific Corp. + 9C84BF + Apple, Inc. - 000BD7 - DORMA Time + Access GmbH + B4A9FE + GHIA Technology (Shenzhen) LTD - 000BDD - TOHOKU RICOH Ltd + F097E5 + TAMIO, INC - 000BE5 - HIMS International Corporation + 4C1A3D + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 000BE9 - Actel Corporation + 1CA0D3 + IEEE Registration Authority - 000BE3 - Key Stream Ltd + 9CFCD1 + Aetheris Technology (Shanghai) Co., Ltd. - 000BD3 - cd3o + BCA042 + SHANGHAI FLYCO ELECTRICAL APPLIANCE CO.,LTD - 000BD5 - Nvergence Inc. + 0CF4D5 + Ruckus Wireless - 000BD1 - Aeronix Inc. + 00111B + Targa Systems Div L-3 Communications - 000BD2 - Remopro Technology Inc. + 6854C1 + ColorTokens, Inc. - 000BC7 - ICET S.p.A. + 346E9D + Ericsson AB - 000BB8 - Kihoku Electronic Co. + F4DC41 + YOUNGZONE CULTURE (SHANGHAI) CORP - 000BC0 - China IWNComm Ltd + 000F4F + PCS Systemtechnik GmbH - 000BB0 - Sysnet Telematica srl + 6C750D + WiFiSONG - 000BB4 - RDC Semiconductor Inc., + 3805AC + Piller Group GmbH - 000BCC - Jusan, S.A. + BC3F8F + HUAWEI TECHNOLOGIES CO.,LTD - 000BAC - 3Com Corporation + 143004 + HUAWEI TECHNOLOGIES CO.,LTD - 000BF9 - Gemstone Communications Inc. + 38AA3C + SAMSUNG ELECTRO MECHANICS CO., LTD. - 000BFC - Cisco Systems Inc. + 50A4D0 + IEEE Registration Authority - 000BEA - Zultys Technologies + 800010 + AT&T - 000B9F - Neue ELSA GmbH + 14ABC5 + Intel Corporate - 000B98 - NiceTechVision + 0024F1 + Shenzhen Fanhai Sanjiang Electronics Co., Ltd. - 000B95 - eBet Gaming Systems Pty Ltd + 50D213 + CviLux Corporation - 000B9E - Yasing Technology Corp. + 001E29 + Hypertherm Inc - 000B88 - Vidisco Ltd + 7CC6C4 + Kolff Computer Supplies b.v. - 000B54 - BiTMICRO Networks Inc. + C4836F + Ciena Corporation - 000B8C - Flextronics + 5004B8 + HUAWEI TECHNOLOGIES CO.,LTD - 000B8A - MITEQ Inc. + 5CFF35 + Wistron Corporation - 000B90 - ADVA Optical Networking Ltd + 78F29E + PEGATRON CORPORATION - 000B79 - X-CoM Inc. + 64777D + Hitron Technologies. Inc - 000B4B - Visiowave SA + 60D262 + Tzukuri Pty Ltd - 000B36 - Productivity Systems Inc. + 142FFD + LT SECURITY INC - 000B35 - Quad Bit System Ltd + 00D0B2 + Xiotech Corporation - 000B75 - Iosoft Ltd + 9C50EE + Cambridge Industries(Group) Co.,Ltd. - 000B70 - Load Technology Inc. + 40ED98 + IEEE Registration Authority - 000B6F - Media Streaming Networks Inc + ACDCE5 + Procter & Gamble Company - 000B43 - Microscan Systems Inc. + 00B362 + Apple, Inc. - 000B45 - Cisco Systems Inc. + E4E4AB + Apple, Inc. - 000B4C - Clarion (M) Sdn Bhd + 54FA96 + Nokia Solutions and Networks GmbH & Co. KG - 000B63 - Kaleidescape + 60334B + Apple, Inc. - 000B68 - Addvalue Communications Pte Ltd + C891F9 + Sagemcom Broadband SAS - 000B58 - Astronautics C.A Ltd + 8404D2 + Kirale Technologies SL - 000B55 - ADInstruments + 38AFD7 + FUJITSU LIMITED - 000B87 - American Reliance Inc. + 28993A + Arista Networks - 000B0D - Air2U Inc. + 60427F + SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD - 000B0B - Corrent Corporation + BCA8A6 + Intel Corporate - 000B08 - Pillar Data Systems + 74FF4C + Skyworth Digital Technology(Shenzhen) Co.,Ltd - 000B27 - Scion Corporation + A02C36 + FN-LINK TECHNOLOGY LIMITED - 000B21 - G-Star Communications Inc. + F48C50 + Intel Corporate - 000ADA - Vindicator Technologies + DCD255 + Kinpo Electronics, Inc. - 000AC9 - Zambeel Inc + 64EB8C + Seiko Epson Corporation - 000B25 - Aeluros + 001351 + Niles Audio Corporation - 000B1A - Industrial Defender Inc. + 000320 + Xpeed, Inc. - 000B18 - Private + AC1F6B + Super Micro Computer, Inc. - 000B15 - Platypus Technology + 508A0F + SHENZHEN FISE TECHNOLOGY HOLDING CO.,LTD. - 000AFA - Traverse Technologies Australia + 7CCBE2 + IEEE Registration Authority - 000AFC - Core Tec Communications LLC + A8A5E2 + MSF-Vathauer Antriebstechnik GmbH & Co KG - 000AEC - Koatsu Gas Kogyo Ltd + C0288D + Logitech, Inc - 000AE7 - Eliop S.A. + 6CEC5A + Hon Hai Precision Ind. CO.,Ltd. - 000AE8 - Cathay Roxus Information Technology Ltd + 44C346 + HUAWEI TECHNOLOGIES CO.,LTD - 000ADD - Allworx Corp. + 307496 + HUAWEI TECHNOLOGIES CO.,LTD - 000AE1 - EG Technology + 708A09 + HUAWEI TECHNOLOGIES CO.,LTD - 000ADF - Gennum Corporation + 180675 + Dilax Intelcom GmbH - 000B3F - Anthology Solutions Inc. + 000FC2 + Uniwell Corporation - 000B3C - Cygnal Integrated Products Inc. + CCC5EF + Co-Comm Servicios Telecomunicaciones S.L. - 000AF1 - Clarity Design Inc. + 9002A9 + Zhejiang Dahua Technology Co., Ltd. - 000AF3 - Cisco Systems Inc. + E89EB4 + Hon Hai Precision Ind. Co.,Ltd. - 000A8D - Eurotherm Limited + D46A6A + Hon Hai Precision Ind. Co.,Ltd. - 000A9F - Pannaway Technologies Inc. + 98FD74 + ACT.CO.LTD - 000A8F - Aska International Inc. + E0508B + Zhejiang Dahua Technology Co., Ltd. - 000AA0 - Cedar Point Communications + 000064 + Yokogawa Digital Computer Corporation - 000A8E - Invacom Ltd + D0F73B + Helmut Mauell GmbH Werk Weida - 000AC1 - Futuretel + 0C4933 + Sichuan Jiuzhou Electronic Technology Co., Ltd. - 000ABE - OPNET Technologies Ltd + 9C1E95 + Actiontec Electronics, Inc - 000AC3 - eM Technics Ltd + 64DB43 + Motorola (Wuhan) Mobility Technologies Communication Co., Ltd. - 000AC4 - Daewoo Teletech Ltd + 68AF13 + Futura Mobility - 000AC0 - Fuyoh Video Industry Ltd + 681AB2 + zte corporation - 000AAE - Rosemount Process Analytical + 7CEBAE + Ridgeline Instruments - 000AB3 - Fa. GIRA + 002590 + Super Micro Computer, Inc. - 000ABA - Arcon Technology Limited + 24C1BD + CRRC DALIAN R&D CO.,LTD. - 000AB6 - Compunetix Inc. + 00A2EE + Cisco Systems, Inc - 000AAF - Pipal Systems + 0059DC + Cisco Systems, Inc - 000A76 - Beida Jade Bird Huaguang Technology Ltd + C8D3FF + Hewlett Packard - 000AB2 - Fresnel Wireless Systems + C4BE84 + Texas Instruments - 000AAA - AltiGen Communications Inc. + F4F524 + Motorola Mobility LLC, a Lenovo Company - 000A99 - Calamp Wireless Networks Inc + 000B2E + Cal-Comp Electronics & Communications Company Ltd. - 000A93 - W2 Networks Inc. + 4865EE + IEEE Registration Authority - 000A89 - Creval Systems Inc. + F4CAE5 + FREEBOX SAS - 000A80 - Telkonet Inc. + 00BBC1 + CANON INC. - 000A79 - Corega K.K + 0013A5 + General Solutions, LTD. - 000A5C - Carel s.p.a. + 5098F3 + Rheem Australia Pty Ltd - 000A5A - GreenNET Technologies Ltd + 506B8D + Nutanix - 000A56 - Hitachi Maxell Ltd + 0038DF + Cisco Systems, Inc - 000A51 - GyroSignal Technology Ltd + 40F413 + Rubezh - 000A2C - Active Tchnology Corporation + 90004E + Hon Hai Precision Ind. Co.,Ltd. - 000A2A - QSI Systems Inc. + 248894 + shenzhen lensun Communication Technology LTD - 000A23 - Parama Networks Inc + EC107B + Samsung Electronics Co.,Ltd - 000A1F - ART WARE Telecommunication Ltd + B04BBF + PT HAN SUNG ELECTORONICS INDONESIA - 000A0A - SUNIX Ltd + CC2D83 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 000A05 - Widax Corp. + D46E0E + TP-LINK TECHNOLOGIES CO.,LTD. - 000A34 - Identicard Systems Incorporated + 88366C + EFM Networks - 000A30 - Visteon Corporation + 48DA96 + Eddy Smart Home Solutions Inc. - 000A2F - Artnix Inc. + F074E4 + Thundercomm Technology Co., Ltd - 000A15 - Silicon Data Inc. + A0722C + HUMAX Co., Ltd. - 000A1B - Stream Labs + C83DD4 + CyberTAN Technology Inc. - 000A1A - Imerge Ltd + E0B94D + SHENZHEN BILIAN ELECTRONIC CO.,LTD - 000A60 - Autostar Technology Pte Ltd + 38D547 + ASUSTek COMPUTER INC. - 000A5D - FingerTec Worldwide Sdn Bhd + B4D135 + Cloudistics - 000A39 - LoPA Information Technology + F02FA7 + HUAWEI TECHNOLOGIES CO.,LTD - 000A37 - Procera Networks Inc. + 18DED7 + HUAWEI TECHNOLOGIES CO.,LTD - 000A53 - Intronics Inc.orporated + 1C232C + Samsung Electronics Co.,Ltd - 000A4A - Targa Systems Ltd + 78888A + CDR Sp. z o.o. Sp. k. - 0009D6 - KNC One GmbH + FCD848 + Apple, Inc. - 0009C7 - Movistec + E00DB9 + Cree, Inc. - 0009C9 - BlueWINC Ltd + FC83C6 + N-Radio Technologies Co., Ltd. - 0009D4 - Transtech Networks + DC0D30 + Shenzhen Feasycom Technology Co., Ltd. - 0009CB - HBrain + F0ACD7 + IEEE Registration Authority - 0009F1 - Yamaki Electric Corporation + 0021D2 + Samsung Electronics Co.,Ltd - 0009F4 - Alcon Laboratories Inc. + 0021D1 + Samsung Electronics Co.,Ltd - 0009F5 - Emerson Network Power Ltd + 001FCC + Samsung Electronics Co.,Ltd - 0009EA - YEM Inc. + A42983 + Boeing Defence Australia - 0009C5 - KINGENE Technology Corporation + EC8892 + Motorola Mobility LLC, a Lenovo Company - 0009CD - Hudson Soft Ltd + 9495A0 + Google, Inc. - 0009C0 - 6WIND + 00A6CA + Cisco Systems, Inc - 0009BF - Nintendo Ltd + D8452B + Integrated Device Technology (Malaysia) Sdn. Bhd. - 0009E3 - Angel Iglesias S.A. + E4186B + Zyxel Communications Corporation - 0009B4 - Kisan Telecom Ltd + D41D71 + Palo Alto Networks - 0009AE - Okano Electric Ltd + 008731 + Cisco Systems, Inc - 0009BA - MAKU Informationstechik GmbH + 88DEA9 + Roku, Inc. - 000A04 - 3Com Corporation + 004A77 + zte corporation - 000971 - Time Management Inc. + 60A10A + Samsung Electronics Co.,Ltd - 000974 - Innopia Technologies Inc. + 8C71F8 + Samsung Electronics Co.,Ltd - 00098B - Entropic Communications Inc. + CC051B + Samsung Electronics Co.,Ltd - 00097E - IMI Technology Ltd + 8C7712 + Samsung Electronics Co.,Ltd - 00096A - Cloverleaf Communications Inc. + 9463D1 + Samsung Electronics Co.,Ltd - 00095A - Racewood Technology + 1C9D3E + Integrated Device Technology (Malaysia) Sdn. Bhd. - 00094E - Bartech Systems International Inc. + 7487A9 + OCT Technology Co., Ltd. - 000947 - Aztek Inc. + 503F98 + CMITECH - 000951 - Apogee Imaging Systems + 5C497D + Samsung Electronics Co.,Ltd - 00093D - Newisys,Inc. + 98234E + Micromedia AG - 000967 - Tachyon Inc. + 782079 + ID Tech - 000996 - RDI + 78D6F0 + SAMSUNG ELECTRO MECHANICS CO., LTD. - 00090C - Mayekawa Mfg Ltd + 7825AD + Samsung Electronics Co.,Ltd - 00090D - Leader Electronics Corp. + ECE09B + Samsung Electronics Co.,Ltd - 0008FE - UNIK C&C Ltd + 001632 + Samsung Electronics Co.,Ltd - 0008FF - Trilogy Communications Ltd + 0C6076 + Hon Hai Precision Ind. Co.,Ltd. - 000904 - MONDIAL electronic + 0CEEE6 + Hon Hai Precision Ind. Co.,Ltd. - 00091F - A&D Ltd + E4D53D + Hon Hai Precision Ind. Co.,Ltd. - 000924 - Telebau GmbH + C0143D + Hon Hai Precision Ind. Co.,Ltd. - 000921 - Planmeca Oy + C01885 + Hon Hai Precision Ind. Co.,Ltd. - 000919 - MDS Gateways + 5894CF + Vertex Standard LMR, Inc. - 000918 - Samsung Techwin Ltd + 20F85E + Delta Electronics - 00092F - Akom Technology Corporation + E4E0C5 + Samsung Electronics Co.,Ltd - 0008EF - Dibal,S.A. + 20D5BF + Samsung Electronics Co.,Ltd - 0008F0 - Next Generation Systems Inc. + 0023E4 + IPnect co. ltd. - 0008E9 - NextGig + 70D4F2 + RIM - 000910 - Simple Access Inc. + 0016DB + Samsung Electronics Co.,Ltd - 000914 - Computrols Inc. + 001EE2 + Samsung Electronics Co.,Ltd - 0008E7 - SHI ControlSystems Ltd + C0BDD1 + SAMSUNG ELECTRO-MECHANICS(THAILAND) - 0008D7 - HOW Corporation + B479A7 + SAMSUNG ELECTRO-MECHANICS(THAILAND) - 0008FC - Gigaphoton Inc. + 7C11CB + HUAWEI TECHNOLOGIES CO.,LTD - 000938 - Allot Communications + 1C25E1 + China Mobile IOT Company Limited - 0008BF - Aptus Elektronik AB + C0F636 + Hangzhou Kuaiyue Technologies, Ltd. - 0008B8 - E.F. Johnson + BC20A4 + Samsung Electronics Co.,Ltd - 0008BB - NetExcell + 08D42B + Samsung Electronics Co.,Ltd - 0008BE - XENPAK MSA Group + 789ED0 + Samsung Electronics Co.,Ltd - 0008C1 - Avistar Communications Corporation + B0C4E7 + Samsung Electronics Co.,Ltd - 0008C6 - Philips Consumer Communications + C81479 + Samsung Electronics Co.,Ltd - 000865 - Jascom Ltd + 002490 + Samsung Electronics Co.,Ltd - 000864 - Fasy S.p.A. + 0023D7 + Samsung Electronics Co.,Ltd - 000860 - LodgeNet Entertainment Corp. + 549B12 + Samsung Electronics Co.,Ltd - 000897 - Quake Technologies + FCA13E + Samsung Electronics Co.,Ltd - 000890 - Avilinks SA + A00798 + Samsung Electronics Co.,Ltd - 00088D - Sigma-Links Inc. + 001A22 + eQ-3 Entwicklung GmbH - 0008A8 - Systec Ltd + 1CAF05 + Samsung Electronics Co.,Ltd - 0008A4 - Cisco Systems Inc. + 24C696 + Samsung Electronics Co.,Ltd - 08006B - Accel Technologies Inc. + 94D771 + Samsung Electronics Co.,Ltd - 000884 - Index Braille AB + E84E84 + Samsung Electronics Co.,Ltd - 0007E8 - EdgeWave + B0DF3A + Samsung Electronics Co.,Ltd - 0007EB - Cisco Systems Inc. + 805719 + Samsung Electronics Co.,Ltd - 0007EC - Cisco Systems Inc. + 34BE00 + Samsung Electronics Co.,Ltd - 000851 - Canadian Bank Note Company Ltd + 78521A + Samsung Electronics Co.,Ltd - 000859 - Shenzhen Unitone Electronics Ltd + 001FCD + Samsung Electronics Co.,Ltd - 00084E - DivergeNet Inc. + 38ECE4 + Samsung Electronics Co.,Ltd - 000819 - Banksys + 945103 + Samsung Electronics Co.,Ltd - 00081A - Sanrad Intelligence Storage Communications (2000) Ltd + 5CE8EB + Samsung Electronics Co.,Ltd - 000810 - Key Technology Inc. + 240DC2 + TCT mobile ltd - 000807 - Access Devices Limited + 04FEA1 + Fihonest communication co.,Ltd - 0007FC - Adept Systems Inc. + EC8CA2 + Ruckus Wireless - 000825 - Acme Packet + EC8EAE + Nagravision SA - 0007DC - Atek Ltd + E0E7BB + Nureva, Inc. - 00081F - Pou Yuen Tech Corp Ltd + 546C0E + Texas Instruments - 0007C6 - VDS Vosskuhler GmbH + A043DB + Sitael S.p.A. - 0007F5 - Bridgeco Co AG + 20BBC6 + Jabil Circuit Hungary Ltd. - 000794 - Simple Devices Inc. + 00B0B3 + XSTREAMIS PLC - 000797 - Netpower Ltd + 002363 + Zhuhai Raysharp Technology Co.,Ltd - 00078C - Elektronikspecialisten i Borlange AB + 009058 + Ultra Electronics Command & Control Systems - 0007CC - Kaba Benzing GmbH + 001CFD + Universal Electronics, Inc. - 0007C0 - NetZerver Inc. + 001087 + XSTREAMIS PLC - 00047E - Siqura B.V. + AC482D + Ralinwi Nanjing Electronic Technology Co., Ltd. - 0007BC - Identix Inc. + B80018 + Htel - 0007A9 - Novasonics + 7472B0 + Guangzhou Shiyuan Electronics Co., Ltd. - 0007A1 - VIASYS Healthcare GmbH + DC1A01 + Ecoliv Technology ( Shenzhen ) Ltd. - 00079E - Ilinx Ltd + 080087 + Xyplex, Inc. - 0007A0 - e-Watch Inc. + 00549F + Avaya Inc - 000788 - Clipcomm Inc. + 049FCA + HUAWEI TECHNOLOGIES CO.,LTD - 000781 - Itron Inc. + 50016B + HUAWEI TECHNOLOGIES CO.,LTD - 00076B - Stralfors AB + 00001B + Novell, Inc. - 000768 - Danfoss A/S + 0004DC + Nortel Networks - 00075F - VCS Video Communication Systems AG + 000CF7 + Nortel Networks - 0007B8 - Corvalent Corporation + 000FCD + Nortel Networks - 00077B - Millimetrix Broadband Networks + 38256B + Microsoft Mobile Oy - 000769 - Italiana Macchi SpA + 203AEF + Sivantos GmbH - 00071A - Finedigital Inc. + 005979 + Networked Energy Services - 00071E - Tri-M Engineering / Nupak Dev. Corp. + D84710 + Sichuan Changhong Electric Ltd. - 000717 - Wieland Electric GmbH + 001972 + Plexus (Xiamen) Co.,ltd. - 000711 - Acterna + 4CB21C + Maxphotonics Co.,Ltd - 000702 - Varex Imaging + 205EF7 + Samsung Electronics Co.,Ltd - 000705 - Endress & Hauser GmbH & Co + 141F78 + Samsung Electronics Co.,Ltd - 0006FF - Sheba Systems Ltd + 002347 + ProCurve Networking by HP - 000741 - Sierra Automated Systems + 0024A8 + ProCurve Networking by HP - 000745 - Radlan Computer Communications Ltd + C09134 + ProCurve Networking by HP - 00073E - China Great-Wall Computer Shenzhen Ltd + 001CEF + Primax Electronics Ltd. - 000733 - DANCONTROL Engineering + 000276 + Primax Electronics Ltd. - 00072B - Jung Myung Telecom Ltd + A8AD3D + Alcatel-Lucent Shanghai Bell Co., Ltd - 000718 - iCanTek Ltd + 24AF4A + Alcatel-Lucent IPD - 000716 - J & S Marine Ltd + 7C2064 + Alcatel-Lucent IPD - 00075C - Eastman Kodak Company + 48F8E1 + Nokia - 000756 - Juyoung Telecom + 8C90D3 + Nokia - 00075A - Air Products and Chemicals Inc. + 207C8F + Quanta Microsystems,Inc. - 000748 - The Imaging Source Europe + 000B34 + ShangHai Broadband Technologies CO.LTD - 000746 - TURCK Inc. + 3092F6 + SHANGHAI SUNMON COMMUNICATION TECHNOGY CO.,LTD - 00073B - Tenovis GmbH & Co KG + 001BBA + Nortel Networks - 000731 - Ophir-Spiricon LLC + 001969 + Nortel Networks - 00070A - Unicom Automation Ltd + 0018B0 + Nortel Networks - 000709 - Westerstrand Urfabrik AB + 0016CA + Nortel Networks - 0006EB - Global Data + 001478 + TP-LINK TECHNOLOGIES CO.,LTD. - 0006D3 - Alpha Telecom Inc. U.S.A. + 00140E + Nortel Networks - 000647 - Etrali S.A. + 001E1F + Nortel Networks - 0006A4 - INNOWELL Corp. + C44BD1 + Wallys Communications Teachnologies Co.,Ltd. - 0006D6 - Cisco Systems Inc. + 6CB9C5 + Delta Networks, Inc. - 0006CB - Jotron Electronics A/S + 0028F8 + Intel Corporate - 0006CD - Leaf Imaging Ltd + 58BC8F + Cognitive Systems Corp. - 000695 - Ensure Technologies Inc. + D455BE + SHENZHEN FAST TECHNOLOGIES CO.,LTD - 000691 - PT Inovacao + B8BB23 + Guangdong Nufront CSC Co., Ltd - 000692 - Intruvert Networks Inc. + 34EA34 + HangZhou Gubei Electronics Technology Co.,Ltd - 00068B - AirRunner Technologies Inc. + EC26FB + TECC CO.,LTD. - 000688 - Telways Communication Ltd + 44DC91 + PLANEX COMMUNICATIONS INC. - 0006AB - W-Link Systems Inc. + E09DB8 + PLANEX COMMUNICATIONS INC. - 0006AC - Intersoft Co. + 000F59 + Phonak AG - 000694 - Mobillian Corporation + 74B57E + zte corporation - 0006C7 - RFNET Technologies Pte Ltd (S) + 0020F4 + SPECTRIX CORPORATION - 0006B9 - A5TEK Corp. + 04EE91 + x-fabric GmbH - 0006B3 - Diagraph Corporation + C49A02 + LG Electronics (Mobile Communications) - 0006E3 - Quantitative Imaging Corporation + 54D272 + Nuki Home Solutions GmbH - 0006E4 - Citel Technologies Ltd + B47443 + Samsung Electronics Co.,Ltd - 0006A1 - Celsian Technologies Inc. + 30766F + LG Electronics (Mobile Communications) - 0006D9 - IPM-Net S.p.A. + A8922C + LG Electronics (Mobile Communications) - 000663 - Human Technology Ltd + F80CF3 + LG Electronics (Mobile Communications) - 000665 - Sunny Giken Inc. + 001F6B + LG Electronics (Mobile Communications) - 000669 - Datasound Laboratories Ltd + 0026E2 + LG Electronics (Mobile Communications) - 00066E - Delta Electronics Inc. + E8886C + Shenzhen SC Technologies Co.,LTD - 00061B - Notebook Development Lab. Lenovo Japan Ltd + DC35F1 + Positivo Tecnologia S.A. - 00060F - Narad Networks Inc + 0024FF + QLogic Corporation - 000610 - Abeona Networks Inc + 001E21 + Qisda Corporation - 000611 - Zeus Wireless Inc. + 00039D + Qisda Corporation - 0005EC - Mosaic Systems Inc. + 00080D + Toshiba - 000662 - MBM Technology Ltd + 000E7B + Toshiba - 00065A - Strix Systems + E8E0B7 + Toshiba - 000652 - Cisco Systems Inc. + 0003B2 + Radware - 000656 - Tactel AB + 00A0C6 + Qualcomm Inc. - 000641 - Itcn + 649C81 + Qualcomm Inc. - 000648 - Seedsware Inc. + 183919 + Unicoi Systems - 00064C - Invicta Networks Inc. + 00C0E4 + SIEMENS BUILDING - 000674 - Spectrum Control Inc. + 000D10 + Embedtronics Oy - 000638 - Sungjin C&C Ltd + FCF647 + Fiberhome Telecommunication Technologies Co.,LTD - 000635 - PacketAir Networks Inc. + 18686A + zte corporation - 00061A - Zetari Inc. + DC4427 + IEEE Registration Authority - 00061F - Vision Components GmbH + 001A6A + Tranzas, Inc. - 000687 - Omnitron Systems Technology Inc. + BC3400 + IEEE Registration Authority - 000602 - Cirkitech Electronics Co. + A47174 + HUAWEI TECHNOLOGIES CO.,LTD - 0005C0 - Digital Network Alacarte Ltd + F4CB52 + HUAWEI TECHNOLOGIES CO.,LTD - 0005B8 - Electronic Design Associates Inc. + B808D7 + HUAWEI TECHNOLOGIES CO.,LTD - 0005BA - Area Netwoeks Inc. + 94611E + Wata Electronics Co.,Ltd. - 0005BF - JustEzy Technology Inc. + 58528A + Mitsubishi Electric Corporation - 0005D5 - Speedcom Wireless + 680715 + Intel Corporate - 0005C5 - Flaga HF + 3CB6B7 + vivo Mobile Communication Co., Ltd. - 0005CA - Hitron Technology Inc. + 001FA8 + Smart Energy Instruments Inc. - 0005D2 - DAP Technologies + 000FDB + Westell Technologies Inc. - 0005B1 - ASB Technology BV + 784476 + Zioncom Electronics (Shenzhen) Ltd. - 000599 - DRS Test and Energy Management or DRS-TEM + 001165 + ZNYX Networks, Inc. - 00059A - Cisco Systems Inc. + 3C0771 + Sony Corporation - 0005AB - Cyber Fone Inc. + 80414E + BBK EDUCATIONAL ELECTRONICS CORP.,LTD. - 000592 - Pultek Corp. + 249442 + OPEN ROAD SOLUTIONS , INC. - 00058B - IPmental Inc. + C46413 + Cisco Systems, Inc - 0005AC - Northern Digital Inc. + 0010CA + Telco Systems, Inc. - 0005AD - Topspin Communications Inc. + 00E09E + Quantum Corporation - 0005D1 - Metavector Technologies + 000A08 + Alps Alpine - 0005FB - ShareGate Inc. + 206A8A + Wistron Infocomm (Zhongshan) Corporation - 0005FE - Traficon N.V. + 000A68 + Solarflare Communications Inc. - 0005F0 - Satec + 001EC0 + Microchip Technology Inc. - 000530 - Andiamo Systems Inc. + C4F1D1 + BEIJING SOGOU TECHNOLOGY DEVELOPMENT CO., LTD. - 000538 - Merilus Inc. + 38BC1A + MEIZU Technology Co., Ltd. - 00052B - HORIBA Ltd + ECD68A + Shenzhen JMicron Intelligent Technology Developmen - 00051D - Airocon Inc. + 5052D2 + Hangzhou Telin Technologies Co., Limited - 000515 - Nuark Ltd + 90EED9 + UNIVERSAL DE DESARROLLOS ELECTRÓNICOS, SA - 000516 - SMART Modular Technologies + 7C574E + COBI GmbH - 000577 - SM Information & Communication + 045604 + Gionee Communication Equipment Co.,Ltd. - 000570 - Baydel Ltd + C8AFE3 + Hefei Radio Communication Technology Co., Ltd - 00056E - National Enhance Technology Inc. + 945907 + Shanghai HITE-BELDEN Network Technology Co., Ltd. - 00056D - Pacific Corporation + 001848 + Vecima Networks Inc. - 000581 - Snell + 0016FB + SHENZHEN MTC CO LTD - 00057D - Sun Communications Inc. + 74CC39 + Fiberhome Telecommunication Technologies Co.,LTD - 000586 - Lucent Technologies + 340AFF + Qingdao Hisense Communications Co.,Ltd. - 00057B - Chung Nam Electronic Ltd + 587E61 + Qingdao Hisense Communications Co.,Ltd. - 000571 - Seiwa Electronics Co. + C0A1A2 + MarqMetrix - 000549 - Salira Optical Network Systems + 08D0B7 + Qingdao Hisense Communications Co.,Ltd. - 00054C - RF Innovations Pty Ltd + 00FEC8 + Cisco Systems, Inc - 000543 - IQ Wireless GmbH + 00253E + Sensus Metering Systems - 00055C - Kowa Company Ltd + 606453 + AOD Co.,Ltd. - 000510 - Infinite Shanghai Communication Terminals Ltd + 6C98EB + Riverbed Technology, Inc. - 0004FF - Acronet Ltd + 009E1E + Cisco Systems, Inc - 000501 - Cisco Systems Inc. + 2C36A0 + Capisco Limited - 000508 - Inetcam Inc. + B0B2DC + Zyxel Communications Corporation - 00051B - Magic Control Technology Corporation + CC5D4E + Zyxel Communications Corporation - 000513 - VTLinx Multimedia Systems Inc. + 404A03 + Zyxel Communications Corporation - 00050E - 3ware Inc. + C86C87 + Zyxel Communications Corporation - 0004D7 - Omitec Instrumentation Ltd + E47B3F + BEIJING CO-CLOUD TECHNOLOGY LTD. - 0004D4 - Proview Electronics Ltd + 54EDA3 + Navdy, Inc. - 0004DB - Tellus Group Corp. + 10BEF5 + D-Link International - 0004E0 - Procket Networks + A0415E + Opsens Solution Inc. - 0004DD - Cisco Systems Inc. + 2C5A8D + SYSTRONIK Elektronik u. Systemtechnik GmbH - 008086 - Computer Generation Inc. + 3822D6 + Hangzhou H3C Technologies Co., Limited - 000504 - Naray Information & Communication Enterprise + A860B6 + Apple, Inc. - 000509 - AVOC Nishimura Ltd + C4B301 + Apple, Inc. - 0004FB - Commtech Inc. + E05F45 + Apple, Inc. - 0004C0 - Cisco Systems Inc. + 483B38 + Apple, Inc. - 0004BA - KDD Media Will Corporation + 1C9148 + Apple, Inc. - 0004B6 - Stratex Networks Inc. + 34A2A2 + HUAWEI TECHNOLOGIES CO.,LTD - 0004CD - Extenway Solutions Inc + 749D8F + HUAWEI TECHNOLOGIES CO.,LTD - 0004E9 - Infiniswitch Corporation + C864C7 + zte corporation - 0004E8 - IER Inc. + 0022E7 + WPS Parking Systems - 0004B3 - Videotek Inc. + 0C8A87 + AgLogica Holdings, Inc - 00044C - Jenoptik + B8E779 + 9Solutions Oy - 000444 - Western Multiplex Corporation + E0A3AC + HUAWEI TECHNOLOGIES CO.,LTD - 000439 - Rosco Entertainment Technology Inc. + BC7574 + HUAWEI TECHNOLOGIES CO.,LTD - 00043A - Intelligent Telecommunications Inc. + 20A680 + HUAWEI TECHNOLOGIES CO.,LTD - 000492 - Hive Internet Ltd + 8828B3 + HUAWEI TECHNOLOGIES CO.,LTD - 00048C - Nayna Networks Inc. + F823B2 + HUAWEI TECHNOLOGIES CO.,LTD - 000491 - Technovision Inc. + 341290 + Treeview Co.,Ltd. - 000493 - Tsinghua Unisplendour Ltd + 7CFE4E + Shenzhen Safe vision Technology Co.,LTD - 000494 - Breezecom Ltd + 644FB0 + Hyunjin.com - 000489 - YAFO Networks Inc. + 00E0E6 + INCAA Computers - 00048A - Temia Vertriebs GmbH + 6C3B6B + Routerboard.com - 000481 - Econolite Control Products Inc. + 006CBC + Cisco Systems, Inc - 00046C - Cyber Technology Ltd + 5C70A3 + LG Electronics (Mobile Communications) - 000471 - IPrad + 001D08 + Jiangsu Yinhe Electronics Co.,Ltd. - 00046E - Cisco Systems Inc. + 4851B7 + Intel Corporate - 000474 - Legrand + 905F2E + TCT mobile ltd - 00042D - Sarian Systems Ltd + B4B15A + Siemens AG Energy Management Division - 00042E - Netous Technologies Ltd + 00A0A4 + Oracle Corporation - 000425 - Atmel Corporation + 749781 + zte corporation - 00043F - ESTeem Wireless Modems Inc. + 9CDF03 + Harman/Becker Automotive Systems GmbH - 000433 - Cyberboard A/S + 001188 + Enterasys - 000434 - Accelent Systems Inc. + 0001F4 + Enterasys - 000477 - Scalant Systems Inc. + 00109B + Emulex Corporation - 000473 - Photonex Corporation + A4E597 + Gessler GmbH - 000470 - ipUnplugged AB + A86BAD + Hon Hai Precision Ind. Co.,Ltd. - 00045D - BEKA Elektronik + D80F99 + Hon Hai Precision Ind. Co.,Ltd. - 000459 - Veristar Corporation + C89CDC + Elitegroup Computer Systems Co.,Ltd. - 0004A4 - NetEnabled Inc. + 002511 + Elitegroup Computer Systems Co.,Ltd. - 000416 - Parks S/A Comunicacoes Digitais + 4487FC + Elitegroup Computer Systems Co.,Ltd. - 00040F - Asus Network Technologies Inc. + 002465 + Elentec - 00040A - Sage Systems + 00089F + EFM Networks - 000404 - Makino Milling Machine Ltd + 001D82 + GN Netcom A/S - 0003D0 - KOANKEISO Ltd + 001317 + GN Netcom A/S - 0003CF - Muxcom Inc. + 00142A + Elitegroup Computer Systems Co.,Ltd. - 0003D1 - Takaya Corporation + 00115B + Elitegroup Computer Systems Co.,Ltd. - 0003AD - Emerson Energy Systems AB + C03FD5 + Elitegroup Computer Systems Co.,Ltd. - 0003A7 - Unixtar Technology Inc. + ECA86B + Elitegroup Computer Systems Co.,Ltd. - 0003AE - Allied Advanced Manufacturing Pte Ltd + 0050FC + Edimax Technology Co. Ltd. - 0003A3 - MAVIX Ltd + 0016FA + ECI Telecom Ltd. - 0003B6 - QSI Corporation + A082AC + Linear DMS Solutions Sdn. Bhd. - 0003B1 - Hospira Inc. + A86AC1 + HanbitEDS Co., Ltd. - 0003B3 - IA Link Systems Ltd + D463FE + Arcadyan Corporation - 0003EB - Atrica + 689361 + Integrated Device Technology (Malaysia) Sdn. Bhd. - 0003E7 - Logostek Ltd + A0043E + Parker Hannifin Manufacturing Germany GmbH & Co. KG - 0003E3 - Cisco Systems Inc. + C84529 + IMK Networks Co.,Ltd - 0003F4 - NetBurner + 001174 + Mojo Networks, Inc. - 0003F2 - Seneca Networks + 001954 + Leaf Corporation. - 0003F0 - Redfern Broadband Networks + 9466E7 + WOM Engineering - 0003DB - Apogee Electronics Corp. + F8A188 + LED Roadway Lighting - 0003D2 - Crossbeam Systems Inc. + 34BF90 + Fiberhome Telecommunication Technologies Co.,LTD - 000405 - ACN Technologies + CCB3F8 + FUJITSU ISOTEC LIMITED - 000401 - Osaki Electric Ltd + E4A471 + Intel Corporate - 0003A1 - HIPER Information & Communication Inc. + 10F005 + Intel Corporate - 000396 - EZ Cast Ltd + 00BD82 + Shenzhen YOUHUA Technology Co., Ltd - 00039A - SiConnect + 4CB8B5 + Shenzhen YOUHUA Technology Co., Ltd - 000363 - Miraesys Ltd + 7085C2 + ASRock Incorporation - 00035F - Pruftechnik Condition Monitoring GmbH & Co. KG + 94513D + iSmart Alarm, Inc. - 000360 - PAC Interactive Technology Inc. + BC15AC + Vodafone Italia S.p.A. - 000361 - Widcomm Inc. + EC93ED + DDoS-Guard LTD - 000394 - Connect One + 0452C7 + Bose Corporation - 00038A - America Online Inc. + F02745 + F-Secure Corporation - 00038D - PCS Revenue Control Systems Inc. + 54D0B4 + Xiamen Four-Faith Communication Technology Co.,Ltd - 000388 - Fastfame Technology Ltd + 00137C + Kaicom co., Ltd. - 000359 - DigitalSis + 7C477C + IEEE Registration Authority - 000352 - Colubris Networks + F877B8 + Samsung Electronics Co.,Ltd - 00034C - Shanghai DigiVision Technology Ltd + F0D2F1 + Amazon Technologies Inc. - 000378 - HUMAX Ltd + 14D11F + HUAWEI TECHNOLOGIES CO.,LTD - 000374 - Control Microsystems + DC094C + HUAWEI TECHNOLOGIES CO.,LTD - 000376 - Graphtec Technology Inc. + 1C6758 + HUAWEI TECHNOLOGIES CO.,LTD - 00037E - PORTech Communications Inc. + 24BCF8 + HUAWEI TECHNOLOGIES CO.,LTD - 00036D - Runtop Inc. + DCEE06 + HUAWEI TECHNOLOGIES CO.,LTD - 00036E - Nicon Systems (Pty) Limited + E85659 + Advanced-Connectek Inc. - 000371 - Acomz Networks Corp. + 30FC68 + TP-LINK TECHNOLOGIES CO.,LTD. - 000349 - Vidicode Datacommunicatie B.V. + 008A96 + Cisco Systems, Inc - 00033E - Tateyama System Laboratory Ltd + BC60A7 + Sony Interactive Entertainment Inc. - 00033C - Daiden Ltd + 64CC2E + Xiaomi Communications Co Ltd - 000325 - Arima Computer Corp. + 8801F2 + Vitec System Engineering Inc. - 00031F - Condev Ltd + A8E3EE + Sony Interactive Entertainment Inc. - 00029F - L-3 Communication Aviation Recorders + 00248D + Sony Interactive Entertainment Inc. - 00031B - Cellvision Systems Inc. + 00041F + Sony Interactive Entertainment Inc. - 00031C - Svenska Hardvarufabriken AB + 20A90E + TCT mobile ltd - 0001A8 - Welltech Computer Ltd + EC438B + YAPTV - 00030C - Telesoft Technologies Ltd + 182195 + Samsung Electronics Co.,Ltd - 000308 - AM Communications Inc. + 44783E + Samsung Electronics Co.,Ltd - 000307 - Secure Works Inc. + 14C3C2 + K.A. Schmersal GmbH & Co. KG - 000306 - Fusion In Tech Ltd + 10785B + Actiontec Electronics, Inc - 0002FC - Cisco Systems Inc. + BC44B0 + Elastifile - 0002FA - DX Antenna Ltd + 74BFB7 + Nusoft Corporation - 0002FB - Baumuller Aulugen-Systemtechnik GmbH + 50DA00 + Hangzhou H3C Technologies Co., Limited - 0002F6 - Equipe Communications + F4ED5F + SHENZHEN KTC TECHNOLOGY GROUP - 000223 - ClickTV + 00E0E4 + FANUC ROBOTICS NORTH AMERICA, Inc. - 0002CB - TriState Ltd + D0B53D + SEPRO ROBOTIQUE - 0002CA - EndPoints Inc. + 00D0EC + NAKAYO Inc - 00032A - UniData Communication Systems Inc. + 441102 + EDMI Europe Ltd - 0002BF - dotRocket Inc. + 980CA5 + Motorola (Wuhan) Mobility Technologies Communication Co., Ltd. - 000317 - Merlin Systems Inc. + A85EE4 + 12Sided Technology, LLC - 000318 - Cyras Systems Inc. + 245EBE + QNAP Systems, Inc. - 0002E3 - LITE-ON Communications Inc. + 0404EA + Valens Semiconductor Ltd. - 0002DD - Bromax Communications Ltd + 800DD7 + Latticework, Inc - 000247 - Great Dragon Information Technology (Group) Ltd + 4CCC6A + Micro-Star INTL CO., LTD. - 000243 - Raysis Ltd + 30636B + Apple, Inc. - 000231 - Ingersoll-Rand + 70884D + JAPAN RADIO CO., LTD. - 000266 - Thermalogic Corporation + A4F1E8 + Apple, Inc. - 000268 - Harris Government Communications + 546751 + Compal Broadband Networks, Inc. - 00025E - High Technology Ltd + 240B0A + Palo Alto Networks - 000260 - Accordion Networks Inc. + D099D5 + Alcatel-Lucent - 000283 - Spectrum Controls Inc. + 00247D + Nokia Danmark A/S - 000284 - UK Grid Solutions Limited + 14BB6E + Samsung Electronics Co.,Ltd - 000280 - Mu Net Inc. + 2CCC15 + Nokia Corporation - 009064 - Thomson Inc. + D8FB5E + ASKEY COMPUTER CORP - 00027A - IOI Technology Corporation + 0018C5 + Nokia Danmark A/S - 000274 - Tommy Technologies Corp. + F4F5A5 + Nokia Corporation - 00029E - Information Equipment Ltd + EC9B5B + Nokia Corporation - 00029B - Kreatel Communications AB + 0CBF15 + Genetec Inc. - 000295 - IP.Access Limited + 002326 + FUJITSU LIMITED - 000272 - CC&C Technologies Inc. + 002265 + Nokia Danmark A/S - 00026D - Adept Telecom + 1886AC + Nokia Danmark A/S - 00026B - BCM Computers Ltd + 001F5C + Nokia Danmark A/S - 000293 - Solid Data Systems + 001F00 + Nokia Danmark A/S - 000289 - DNE Technologies + 002668 + Nokia Danmark A/S - 00012F - Twinhead International Corp + 002547 + Nokia Danmark A/S - 0002A7 - Vivace Networks + 00164E + Nokia Danmark A/S - 0001B2 - Digital Processing Systems Inc. + E498D1 + Microsoft Mobile Oy - 0001B8 - Netsensity Inc. + 6C2779 + Microsoft Mobile Oy - 0001B9 - SKF (U.K.) Limited + 000D4B + Roku, Inc. - 0001B3 - Precision Electronic Manufacturing + F88096 + Elsys Equipamentos Eletrônicos Ltda - 0001BD - Peterson Electro-Musical Products Inc. + 001DAA + DrayTek Corp. - 000209 - Shenzhen SED Information Technology Ltd + 1867B0 + Samsung Electronics Co.,Ltd - 000202 - Amino Communications Ltd + 0040FB + CASCADE COMMUNICATIONS - 000201 - IFM Electronic GmbH + 00CF1C + Communication Machinery Corporation - 000234 - Imperial Technology Inc. + D0542D + Cambridge Industries(Group) Co.,Ltd. - 000236 - INIT GmbH + 744AA4 + zte corporation - 00022B - SAXA Inc. + 28CC01 + Samsung Electronics Co.,Ltd - 000224 - C-CoR + 6CF373 + Samsung Electronics Co.,Ltd - 00021F - Aculab PLC + 9C3AAF + Samsung Electronics Co.,Ltd - 00021A - Zuma Networks + 781FDB + Samsung Electronics Co.,Ltd - 0001CA - Geocast Network Systems Inc. + 183F47 + Samsung Electronics Co.,Ltd - 0001D1 - CoNet Communications Inc. + 00001D + Cabletron Systems, Inc. - 000222 - Chromisys Inc. + 4CA56D + Samsung Electronics Co.,Ltd - 000213 - S.D.E.L. + B86CE8 + Samsung Electronics Co.,Ltd - 0001DB - Freecom Technologies GmbH + 0CB319 + Samsung Electronics Co.,Ltd - 0001DF - ISDN Communications Ltd + 50A4C8 + Samsung Electronics Co.,Ltd - 0001EF - Camtel Technology Corp. + 6C8336 + Samsung Electronics Co.,Ltd - 00020A - Gefran Spa + 0026B6 + ASKEY COMPUTER CORP - 000206 - Telital R&D Denmark A/S + DCD87C + Beijing Jingdong Century Trading Co., LTD. - 000179 - Wireless Technology Inc. + C4DA7D + Ivium Technologies B.V. - 000160 - ELMEX Ltd + 001BA9 + Brother industries, LTD. - 00014E - WIN Enterprises Inc. + 30A220 + ARG Telecom - 003073 - International Microsystems, In + E03E44 + Broadcom - 00303F - TurboComm Tech Inc. + 002557 + BlackBerry RTS - 000184 - Sieb & Meyer AG + 001CCC + BlackBerry RTS - 000195 - Sena Technologies Inc. + 00300A + Aztech Electronics Pte Ltd - 0001A4 - Microlink Corporation + 001F3F + AVM GmbH - 00018E - Logitec Corporation + 246511 + AVM GmbH - 00016D - CarrierComm Inc. + 000B6A + Asiarock Technology Limited - 00016F - Inkel Corp. + 001B9E + ASKEY COMPUTER CORP - 000170 - ESE Embedded System Engineer'g + E0CA94 + ASKEY COMPUTER CORP - 00016A - Alitec + 841B5E + NETGEAR - 000153 - Archtek Telecom Corporation + C0FFD4 + NETGEAR - 000135 - KDC Corp. + 0024B2 + NETGEAR - 000141 - Cable Print + 001E45 + Sony Corporation - 000165 - AirSwitch Corporation + 001CA4 + Sony Corporation - 000156 - Firewiredirect.com Inc. + 001A75 + Sony Corporation - 0001B7 - Centos Inc. + 78843C + Sony Corporation - 0001B5 - Turin Networks Inc. + 0023F1 + Sony Corporation - 000183 - Anite Telecoms + 6CFAA7 + AMPAK Technology, Inc. - 00017E - ADTEK System Science Ltd + 0013A9 + Sony Corporation - 00010C - System Talks Inc. + 000AD9 + Sony Corporation - 000111 - iDigm Inc. + 000E07 + Sony Corporation - 000107 - Leiser GmbH + 94CE2C + Sony Corporation - 000114 - Kanda Tsushin Kogyo Ltd + ACE010 + Liteon Technology Corporation - 00B0F5 - NetWorth Technologies Inc. + 747548 + Amazon Technologies Inc. - 00B0DB - Nextcell Inc. + 0000B1 + Alpha Micro - 00B0AE - Symmetricom + 001802 + Alpha Networks Inc. - 00B0E7 - British Federal Ltd + 54271E + AzureWave Technology Inc. - 00B08E - Cisco Systems Inc. + 900BC1 + Sprocomm Technologies CO.,Ltd - 00305C - SMAR Laboratories Corp. + 0C6AE6 + Stanley Security Solutions - 003004 - Leadtek Research Inc. + 54E4BD + FN-LINK TECHNOLOGY LIMITED - 0030F9 - Sollae Systems Ltd + 5414FD + Orbbec 3D Technology International - 000118 - EZ Digital Ltd + 485D60 + AzureWave Technology Inc. - 00011C - Universal Talkware Corporation + DC85DE + AzureWave Technology Inc. - 000128 - EnjoyWeb Inc. + B0EE45 + AzureWave Technology Inc. - 000146 - Tesco Controls Inc. + FC0FE6 + Sony Interactive Entertainment Inc. - 000149 - TDT AG + 24FD52 + Liteon Technology Corporation - 000131 - Bosch Security Systems Inc. + 2CD05A + Liteon Technology Corporation - 0030BE - City-Net Technology Inc. + 74E543 + Liteon Technology Corporation - 003002 - Expand Networks + 001CA8 + AirTies Wireless Networks - 003078 - Cisco Systems Inc. + 00238E + ADB Broadband Italia - 00B0EC - Eacem + 001D8B + ADB Broadband Italia - 00B0DF - Starboard Storage Systems + 0013C8 + ADB Broadband Italia - 00010B - Space CyberLink Inc. + 74DE2B + Liteon Technology Corporation - 00309C - Timing Applications Inc. + 00225F + Liteon Technology Corporation - 00307E - Redflex Communication Systems + 5C93A2 + Liteon Technology Corporation - 00304F - PLANET Technology Corporation + DC0B1A + ADB Broadband Italia - 003022 - Fong Kai Industrial Ltd + 842615 + ADB Broadband Italia - 003070 - 1Net Corporation + F0842F + ADB Broadband Italia - 0030F8 - Dynapro Systems Inc. + 28C2DD + AzureWave Technology Inc. - 0030B7 - Teletrol Systems Inc. + 80A589 + AzureWave Technology Inc. - 0030B3 - San Valley Systems Inc. + C40938 + FUJIAN STAR-NET COMMUNICATION CO.,LTD - 003009 - Tachion Networks Inc. + 74C63B + AzureWave Technology Inc. - 00307A - Advanced Technology & Systems + ACE5F0 + Doppler Labs - 003061 - MobyTEL + 001C50 + TCL Technoly Electronics (Huizhou) Co., Ltd. - 00300B - mPHASE Technologies Inc. + 00AA02 + Intel Corporation - 00308F - MICRILOR Inc. + 7C7A91 + Intel Corporate - 003050 - Versa Technology + AC7BA1 + Intel Corporate - 0030C0 - Lara Technology Inc. + 6C2995 + Intel Corporate - 003005 - Fujitsu Siemens Computers + 984FEE + Intel Corporate - 0030E0 - Oxford Semiconductor Ltd + 8C705A + Intel Corporate - 003064 - Adlink Technology Inc. + 606720 + Intel Corporate - 0030DB - Mindready Solutions Inc. + FCF8AE + Intel Corporate - 0030E7 - CNF Mobile Solutions Inc. + 6036DD + Intel Corporate - 0030B4 - Intersil Corp. + 001E65 + Intel Corporate - 0030B1 - TrunkNet + 001E67 + Intel Corporate - 003060 - Powerfile Inc. + 0022FA + Intel Corporate - 0030A0 - Tyco Submarine Systems Ltd + 001500 + Intel Corporate - 003015 - CP Clare Corp. + A088B4 + Intel Corporate - 00301F - Optical Networks Inc. + 648099 + Intel Corporate - 0030FA - Telica Inc. + D07E35 + Intel Corporate - 00304B - Orbacom Systems Inc. + E82AEA + Intel Corporate - 0030E9 - GMA Communication Manufact'G + 605718 + Intel Corporate - 0030A5 - Active Power + C4D987 + Intel Corporate - 003084 - Allied Telesyn Internaional + 100BA9 + Intel Corporate - 003043 - Idream Technologies, PTE Ltd + 00270E + Intel Corporate - 003000 - Allwell Technology Corp. + B4E1C4 + Microsoft Mobile Oy - 003011 - HMS Industrial Networks + E0757D + Motorola Mobility LLC, a Lenovo Company - 003068 - Cybernetics Tech Ltd + 34BB26 + Motorola Mobility LLC, a Lenovo Company - 003091 - Taiwan First Line Elec. Corp. + 806C1B + Motorola Mobility LLC, a Lenovo Company - 0030CD - Conexant Systems Inc. + 00D09E + 2Wire Inc - 00301A - Smartbridges PTE Ltd + 0019E4 + 2Wire Inc - 003029 - Opicom + 001AC4 + 2Wire Inc - 003083 - Ivron Systems + 001B5B + 2Wire Inc - 0030B6 - Cisco Systems Inc. + 001EC7 + 2Wire Inc - 0030C7 - Macromate Corp. + 002650 + 2Wire Inc - 0030E4 - Chiyoda System Riken + 0016EB + Intel Corporate - 003066 - RFM + 0018DE + Intel Corporate - 003031 - Lightwave Communications Inc. + 5CE0C5 + Intel Corporate - 00D007 - MIC Associates Inc. + 58A839 + Intel Corporate - 00D0FF - Cisco Systems Inc. + 7C5CF8 + Intel Corporate - 00D028 - Harmonic Inc. + 3CA348 + vivo Mobile Communication Co., Ltd. - 00D025 - Xrosstech Inc. + E45AA2 + vivo Mobile Communication Co., Ltd. - 00D044 - Alidian Networks Inc. + B0D5CC + Texas Instruments - 00305B - Toko Inc. + 3829DD + ONvocal Inc - 00D049 - Impresstek Ltd + 800A80 + IEEE Registration Authority - 00D05B - Acroloop Motion Control + DC6DCD + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 00D042 - Mahlo GmbH & Co. UG + 002351 + 2Wire Inc - 00D031 - Industrial Logic Corporation + 3CEA4F + 2Wire Inc - 00D038 - Fivemere Ltd + DC7FA4 + 2Wire Inc - 00D0C6 - Thomas & Betts Corp. + C4282D + Embedded Intellect Pty Ltd - 00D077 - Lucent Technologies + 348446 + Ericsson AB - 00D03E - Rocketchips Inc. + 044E06 + Ericsson AB - 00D093 - TQ - Components GmbH + CC3B3E + Lester Electrical - 00D03F - American Communication + 2082C0 + Xiaomi Communications Co Ltd - 00D0F7 - Next Nets Corporation + 00173F + Belkin International Inc. - 00D06F - KMC Controls + 001CDF + Belkin International Inc. - 00D0FC - Granite Microsystems + 205532 + Gotech International Technology Limited - 00D0A6 - Lanbird Technology Ltd + 2CFF65 + Oki Electric Industry Co., Ltd. - 00D003 - Comda Enterprises Corp. + 2C27D7 + Hewlett Packard - 00D0D2 - Epilog Corporation + 984BE1 + Hewlett Packard - 00D0F9 - Acute Communications Corp. + C05627 + Belkin International Inc. - 00D0CE - iSystem Labs + D86CE9 + Sagemcom Broadband SAS - 00D018 - Qwes. CoM Inc. + 0015E9 + D-Link Corporation - 0001A7 - Unex Technology Corporation + 001B11 + D-Link Corporation - 00D08C - Genoa Technology Inc. + 00265A + D-Link Corporation - 00D059 - Ambit Microsystems Corp. + 5C6B32 + Texas Instruments - 00D0FD - Optima Tele.com Inc. + 84DD20 + Texas Instruments - 00D0A9 - Shinano Kenshi Ltd + 0017E5 + Texas Instruments - 00D0DD - Sunrise Telecom Inc. + 0017EC + Texas Instruments - 00D0E6 - Ibond Inc. + 0017E7 + Texas Instruments - 00D0D1 - Sycamore Networks + 0017E9 + Texas Instruments - 00D087 - Microfirst Inc. + 1CBA8C + Texas Instruments - 00D080 - Exabyte Corporation + 5846E1 + Baxter International Inc - 00D091 - Smartsan Systems Inc. + 001831 + Texas Instruments - 00D04E - Logibag + 24FD5B + SmartThings, Inc. - 00D027 - Applied Automation Inc. + 001A11 + Google, Inc. - 00D072 - Broadlogic + 28BC56 + EMAC, Inc. - 00D0E2 - MRT Micro Inc. + C8BE19 + D-Link International - 00D06A - Linkup Systems Corporation + 002926 + Applied Optoelectronics, Inc Taiwan Branch - 00D089 - Dynacolor Inc. + 48DB50 + HUAWEI TECHNOLOGIES CO.,LTD - 00D02C - Campbell Scientific Inc. + A4BA76 + HUAWEI TECHNOLOGIES CO.,LTD - 00D0CD - Atan Technology Inc. + 0050C2 + IEEE Registration Authority - 00D040 - Sysmate Ltd + A0F895 + Shenzhen TINNO Mobile Technology Corp. - 00D01A - Urmet TLC S.P.A. + 0078CD + Ignition Design Labs - 0050FF - Hakko Electronics Ltd + 440010 + Apple, Inc. - 0050D2 - CMC Electronics Inc + 0056CD + Apple, Inc. - 0050F9 - Sensormatic Electronics LLC + 00CDFE + Apple, Inc. - 005048 - Infolibria + 24BA13 + RISO KAGAKU CORPORATION - 00504E - Sierra Monitor Corp. + 2C6E85 + Intel Corporate - 0050F6 - PAN-International Industrial Corp. + C8478C + Beken Corporation - 00506C - Beijer Electronics Products AB + E498D6 + Apple, Inc. - 0050D7 - Telstrat + 006037 + NXP Semiconductors - 005044 - Asaca Corporation + DCC0EB + ASSA ABLOY CÔTE PICARDE - 0050E6 - Hakusan Corporation + 9CEFD5 + Panda Wireless, Inc. - 00503C - Tsinghua Novel Electronics + 70CA4D + Shenzhen lnovance Technology Co.,Ltd. - 005060 - Tandberg Telecom AS + E4FAFD + Intel Corporate - 0050EE - TEK Digitel Corporation + 94659C + Intel Corporate - 005045 - Rioworks Solutions Inc. + 484520 + Intel Corporate - 00502B - Genrad Ltd + C80E77 + Le Shi Zhi Xin Electronic Technology (Tianjin) Limited - 00502E - Cambex Corporation + 9049FA + Intel Corporate - 00506E - Corder Engineering Corporation + BC0F64 + Intel Corporate - 00502C - Soyo Computer Inc. + 0002B3 + Intel Corporation - 005077 - Prolific Technology Inc. + 000347 + Intel Corporation - 005033 - Mayan Networks + 000E0C + Intel Corporation - 00500E - Chromatis Networks Inc. + 001320 + Intel Corporate - 00D0CC - Technologies Lyre Inc. + 001321 + Hewlett Packard - 0050EC - Olicom A/S + 000802 + Hewlett Packard - 0050C9 - Maspro Denkoh Corp. + 0002A5 + Hewlett Packard - 0050BB - CMS Technologies + 6CC217 + Hewlett Packard - 005062 - Kouwell Electronics Corp. ** + 1458D0 + Hewlett Packard - 0050D5 - AD Systems Corp. + D8D385 + Hewlett Packard - 0050F3 - GLOBAL NET InfORMATION Ltd + 18A905 + Hewlett Packard - 0050BE - Fast Multimedia AG + 001B78 + Hewlett Packard - 00506F - G-Connect + 001871 + Hewlett Packard - 0050F8 - Entrega Technologies Inc. + 000E7F + Hewlett Packard - 005042 - SCI Manufacturing Singapore PTE Ltd + 001185 + Hewlett Packard - 0050C0 - Gatan Inc. + 001279 + Hewlett Packard - 005051 - Iwatsu Electric Ltd + EC9A74 + Hewlett Packard - 00507D - IFP + 10604B + Hewlett Packard - 005097 - MMC-EMBEDDED CoMPUTERTECHNIK GmbH + C8CBB8 + Hewlett Packard - 005010 - NovaNET Learning Inc. + 843497 + Hewlett Packard - 00509A - TAG Electronic Systems + 106F3F + BUFFALO.INC - 005022 - Zonet Technology Inc. + B0C745 + BUFFALO.INC - 005007 - Siemens Telecommunication Systems Limited + 5C8A38 + Hewlett Packard - 005040 - Panasonic Electric Works Ltd + 2C59E5 + Hewlett Packard - 00501C - Jatom Systems Inc. + D860B0 + bioMérieux Italia S.p.A. - 005092 - Rigaku Corporation Osaka Plant + D8FC38 + Giantec Semiconductor Inc - 00507A - Xpeed Inc. + AC2A0C + CSR ZHUZHOU INSTITUTE CO.,LTD. - 005069 - PixStream Incorporated + 2C6798 + InTalTech Ltd. - 005068 - Electronic Industries Association + F8DB7F + HTC Corporation - 0050BC - Hammer Storage Solutions + 64A769 + HTC Corporation - 009071 - Applied Innovation Inc. + E899C4 + HTC Corporation - 0050EB - Alpha-TOP Corporation + BCCFCC + HTC Corporation - 0050EF - SPE Systemhaus GmbH + 28565A + Hon Hai Precision Ind. Co.,Ltd. - 005098 - Globaloop Ltd + 0019E0 + TP-LINK TECHNOLOGIES CO.,LTD. - 00504F - Olencom Electronics + 002586 + TP-LINK TECHNOLOGIES CO.,LTD. - 0090FF - Tellus Technology Inc. + 54E6FC + TP-LINK TECHNOLOGIES CO.,LTD. - 00903E - N.V. Philips Industrial Activities + 74EA3A + TP-LINK TECHNOLOGIES CO.,LTD. - 0090BA - Valid Networks Inc. + 6CB56B + HUMAX Co., Ltd. - 009018 - ITO Electric Industry Ltd + D81FCC + Brocade Communications Systems LLC - 0090CD - ENT-Empresa Nacional de Telecommunicacoes, S.A. + 00234D + Hon Hai Precision Ind. Co.,Ltd. - 0090FB - Portwell Inc. + 002556 + Hon Hai Precision Ind. Co.,Ltd. - 009094 - Osprey Technologies Inc. + 601888 + zte corporation - 0090B3 - Agranat Systems + 847778 + Cochlear Limited - 00903C - Atlantic Network Systems + 887F03 + Comper Technology Investment Limited - 00905D - Netcom Sicherheitstechnik GmbH + 0080E1 + STMicroelectronics SRL - 0090D1 - Leichu Enterprise Ltd + 0004EA + Hewlett Packard - 009046 - Dexdyne Ltd + F431C3 + Apple, Inc. - 0090DA - Dynarc Inc. + 64A5C3 + Apple, Inc. - 0090E0 - Systran Corp. + E422A5 + PLANTRONICS, INC. - 0090D0 - Thomson Telecom Belgium + 6021C0 + Murata Manufacturing Co., Ltd. - 00909B - Markem-Imaje + 88308A + Murata Manufacturing Co., Ltd. - 009022 - Ivex + 5CDAD4 + Murata Manufacturing Co., Ltd. - 009016 - ZAC + 0026E8 + Murata Manufacturing Co., Ltd. - 0090A7 - Clientec Corporation + FCC897 + zte corporation - 009053 - Daewoo Electronics Ltd + 002512 + zte corporation - 0090DC - Teco Information Systems + 001C26 + Hon Hai Precision Ind. Co.,Ltd. - 0090E2 - Distributed Processing Technology + 002268 + Hon Hai Precision Ind. Co.,Ltd. - 009085 - Golden Enterprises Inc. + BC3AEA + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 0090C7 - Icom Inc. + F81A67 + TP-LINK TECHNOLOGIES CO.,LTD. - 009035 - Alpha Telecom Inc. + EC172F + TP-LINK TECHNOLOGIES CO.,LTD. - 00900F - Kawasaki Heavy Industries Ltd + 14E6E4 + TP-LINK TECHNOLOGIES CO.,LTD. - 0090EA - Alpha Technologies Inc. + 0016CE + Hon Hai Precision Ind. Co.,Ltd. - 009077 - Advanced Fibre Communications + 300ED5 + Hon Hai Precision Ind. Co.,Ltd. - 009099 - Allied Telesis, K.K. + 485AB6 + Hon Hai Precision Ind. Co.,Ltd. - 0010AD - Softronics USB Inc. + 543530 + Hon Hai Precision Ind. Co.,Ltd. - 0010A7 - Unex Technology Corporation + 002438 + Brocade Communications Systems LLC - 0010D5 - Imasde Canarias, S.A. + 0014C9 + Brocade Communications Systems LLC - 001055 - Fujitsu Microelectronics Inc. + 344B50 + zte corporation - 00907A - Spectralink Inc. + E8088B + HUAWEI TECHNOLOGIES CO.,LTD - 0090F0 - Harmonic Video Systems Ltd + 0C96BF + HUAWEI TECHNOLOGIES CO.,LTD - 009020 - Philips Analytical X-RAY B.V. + 60E701 + HUAWEI TECHNOLOGIES CO.,LTD - 0010A3 - Omnitronix Inc. + 50EB1A + Brocade Communications Systems LLC - 00905C - Edmi + 0027F8 + Brocade Communications Systems LLC - 0090E3 - Avex Electronics Inc. + 748EF8 + Brocade Communications Systems LLC - 0090A9 - Western Digital + F866D1 + Hon Hai Precision Ind. Co.,Ltd. - 0090F3 - Aspect Communications + F0EBD0 + Shanghai Feixun Communication Co.,Ltd. - 00904F - ABB Power T&D Company Inc. + 888603 + HUAWEI TECHNOLOGIES CO.,LTD - 009060 - System Create Corp. + 04F938 + HUAWEI TECHNOLOGIES CO.,LTD - 009013 - Samsan Corp. + AC853D + HUAWEI TECHNOLOGIES CO.,LTD - 001052 - Mettler-Toledo (Albstadt) GmbH + 4846FB + HUAWEI TECHNOLOGIES CO.,LTD - 00106B - Sonus Networks Inc. + 7C6097 + HUAWEI TECHNOLOGIES CO.,LTD - 0010C3 - CSI-Control Systems + CC53B5 + HUAWEI TECHNOLOGIES CO.,LTD - 009055 - Parker Hannifin Corporation Compumotor Division + 60DE44 + HUAWEI TECHNOLOGIES CO.,LTD - 0010DD - Enable Semiconductor Inc. + 105172 + HUAWEI TECHNOLOGIES CO.,LTD - 00102D - Hitachi Software Engineering + 08E84F + HUAWEI TECHNOLOGIES CO.,LTD - 001033 - Accesslan Communications Inc. + 643E8C + HUAWEI TECHNOLOGIES CO.,LTD - 001012 - Processor Systems (I) PVT Ltd + 84A8E4 + HUAWEI TECHNOLOGIES CO.,LTD - 001015 - OOmon Inc. + 001882 + HUAWEI TECHNOLOGIES CO.,LTD - 001078 - Nuera Communications Inc. + D4EA0E + Avaya Inc - 00104F - Oracle Corporation + 78F5FD + HUAWEI TECHNOLOGIES CO.,LTD - 00107A - AmbiCom Inc. + 5C7D5E + HUAWEI TECHNOLOGIES CO.,LTD - 0010B9 - Maxtor Corp. + 20F3A3 + HUAWEI TECHNOLOGIES CO.,LTD - 00105D - Draeger Medical + 0C37DC + HUAWEI TECHNOLOGIES CO.,LTD - 001091 - NO Wires Needed BV + BC7670 + HUAWEI TECHNOLOGIES CO.,LTD - 00101B - Cornet Technology Inc. + 24DBAC + HUAWEI TECHNOLOGIES CO.,LTD - 0010DC - Micro-Star International + 1C1D67 + HUAWEI TECHNOLOGIES CO.,LTD - 00100A - Williams Communications Group + D02DB3 + HUAWEI TECHNOLOGIES CO.,LTD - 001032 - Alta Technology + E8CD2D + HUAWEI TECHNOLOGIES CO.,LTD - 001080 - Metawave Communications + 2469A5 + HUAWEI TECHNOLOGIES CO.,LTD - 0010F4 - Vertical Communications + EC233D + HUAWEI TECHNOLOGIES CO.,LTD - 001077 - SAF Drive Systems Ltd + E0247F + HUAWEI TECHNOLOGIES CO.,LTD - 0010B3 - Nokia Multimedia Terminals + 00464B + HUAWEI TECHNOLOGIES CO.,LTD - 00101E - Matsushita Electronic Instruments Corp. + 80FB06 + HUAWEI TECHNOLOGIES CO.,LTD - 00104D - Surtec Industries Inc. + 90671C + HUAWEI TECHNOLOGIES CO.,LTD - 001051 - Cmicro Corporation + BC25E0 + HUAWEI TECHNOLOGIES CO.,LTD - 001037 - CYQ've Technology Ltd + F4E3FB + HUAWEI TECHNOLOGIES CO.,LTD - 00E0BB - NBX Corporation + 6CFA58 + Avaya Inc - 00E08A - GEC Avery Ltd + 6CA849 + Avaya Inc - 00E086 - Emerson Network Power, Avocent Division + 64C354 + Avaya Inc - 00E01B - Sphere Communications Inc. + 50CD22 + Avaya Inc - 00E059 - Controlled Environments Ltd + B4A95A + Avaya Inc - 00E0C5 - Bcom Electronics Inc. + 581626 + Avaya Inc - 00E0EE - Marel HF + A051C6 + Avaya Inc - 00E08E - Utstarcom + 70E422 + Cisco Systems, Inc - 00E03F - Jaton Corporation + 00500F + Cisco Systems, Inc - 00E0D4 - Excellent Computer + 0050A2 + Cisco Systems, Inc - 00E07F - LOGISTISTEM s.r.l. + 00E0B0 + Cisco Systems, Inc - 00E013 - Eastern Electronic Ltd + 00E0FE + Cisco Systems, Inc - 00E0FD - A-Trend Technology Ltd + 00E034 + Cisco Systems, Inc - 00E0BD - Interface Systems Inc. + 00E0F9 + Cisco Systems, Inc - 00E06E - FAR SysTEMS S.p.A. + C8D719 + Cisco-Linksys, LLC - 00E06D - Compuware Corporation + 203A07 + Cisco Systems, Inc - 00E0EA - Innovat Communications Inc. + 0012D2 + Texas Instruments - 00E064 - Samsung Electronics + A863F2 + Texas Instruments - 00E0C9 - AutomatedLogic Corporation + D0FF50 + Texas Instruments - 00E038 - Proxima Corporation + 20C38F + Texas Instruments - 00E09C - MII + 7C669D + Texas Instruments - 00E0E9 - Data Labs Inc. + D8DDFD + Texas Instruments - 00E00C - Motorola + 7C1DD9 + Xiaomi Communications Co Ltd - 00E00A - Diba Inc. + A086C6 + Xiaomi Communications Co Ltd - 00E0C4 - Horner Electric Inc. + 9C99A0 + Xiaomi Communications Co Ltd - 00E069 - Jaycor + 584498 + Xiaomi Communications Co Ltd - 00E0A4 - ESAOTE S.p.A. + 001079 + Cisco Systems, Inc - 00E0DE - Datax NV + 001029 + Cisco Systems, Inc - 00E0A5 - ComCore Semiconductor Inc. + 000E08 + Cisco-Linksys, LLC - 00E015 - Heiwa Corporation + 00603E + Cisco Systems, Inc - 00E0E8 - GRETACODER Data Systems AG + 00602F + Cisco Systems, Inc - 00E016 - Rapid City Communications + 006047 + Cisco Systems, Inc - 00E005 - Technical Corp. + 00023D + Cisco Systems, Inc - 00E0C1 - Memorex Telex Japan Ltd + 00502A + Cisco Systems, Inc - 00E0A9 - Funai Electric Ltd + 4403A7 + Cisco Systems, Inc - 00E084 - Compulite R&D + B0FAEB + Cisco Systems, Inc - 00E096 - Shimadzu Corporation + D05FB8 + Texas Instruments - 00E017 - EXXACT GmbH + 84EB18 + Texas Instruments - 00607F - Aurora Technologies Inc. + 88908D + Cisco Systems, Inc - 00E029 - Standard Microsystems Corp. + F07816 + Cisco Systems, Inc - 006074 - QSC LLC + 00223A + Cisco SPVTG - 006076 - Schlumberger Technologies Retail Petroleum Systems + 0021BE + Cisco SPVTG - 0060A1 - VPNet Inc. + 000C41 + Cisco-Linksys, LLC - 006027 - Superior Modular Products + 1CDEA7 + Cisco Systems, Inc - 0060BC - KeunYoung Electronics & Communication Ltd + F07F06 + Cisco Systems, Inc - 0060A5 - Performance Telecom Corp. + BC16F5 + Cisco Systems, Inc - 006005 - Feedback Data Ltd + FC5B39 + Cisco Systems, Inc - 00602E - Cyclades Corporation + 346F90 + Cisco Systems, Inc - 0060B6 - Land Computer Ltd + 14DAE9 + ASUSTek COMPUTER INC. - 00606C - Arescom + F4CFE2 + Cisco Systems, Inc - 0060E3 - Arbin Instruments + A80C0D + Cisco Systems, Inc - 006071 - Midas LAB Inc. + 7CAD74 + Cisco Systems, Inc - 006061 - Whistle Communications Corp. + F41FC2 + Cisco Systems, Inc - 00601B - Mesa Electronics + 44ADD9 + Cisco Systems, Inc - 0060C5 - Ancot Corp. + 0C6803 + Cisco Systems, Inc - 0060A9 - Gesytec MBH + C08C60 + Cisco Systems, Inc - 0060F2 - Lasergraphics Inc. + E8EDF3 + Cisco Systems, Inc - 0060C3 - Netvision Corporation + E4C722 + Cisco Systems, Inc - 006029 - Cary Peripherals Inc. + 64E950 + Cisco Systems, Inc - 0060A8 - Tidomat AB + 5CFC66 + Cisco Systems, Inc - 0060FC - Conservation Through Innovation Ltd + D46D50 + Cisco Systems, Inc - 006018 - Stellar ONE Corporation + 74A02F + Cisco Systems, Inc - 00600A - Sord Computer Corporation + C07BBC + Cisco Systems, Inc - 0060A4 - GEW Technologies (Pty) Ltd + 24E9B3 + Cisco Systems, Inc - 006064 - Netcomm Limited + 0011D8 + ASUSTek COMPUTER INC. - 0060F9 - Diamond Lane Communications + 0018F3 + ASUSTek COMPUTER INC. - 0060EA - StreamLogic + 001A92 + ASUSTek COMPUTER INC. - 006082 - Novalink Technologies Inc. + 88F031 + Cisco Systems, Inc - 0060E7 - Randata + 0016B6 + Cisco-Linksys, LLC - 0060D9 - Transys Networks Inc. + 0018F8 + Cisco-Linksys, LLC - 00601F - Stallion Technologies + 00252E + Cisco SPVTG - 006054 - Controlware GmbH + 54D46F + Cisco SPVTG - 0060C2 - MPL AG + A4A24A + Cisco SPVTG - 0060D4 - Eldat Communication Ltd + 44E08E + Cisco SPVTG - 00A04E - Voelker Technologies Inc. + BCC810 + Cisco SPVTG - 00A05A - Kofax Image Products + 7CB21B + Cisco SPVTG - 00A052 - Stanilite Electronics Pty Ltd + 24767D + Cisco SPVTG - 00A05E - Myriad Logic Inc. + 481D70 + Cisco SPVTG - 00A095 - Acacia Networks Inc. + 00E036 + PIONEER CORPORATION - 00A053 - Compact Devices Inc. + 00E04F + Cisco Systems, Inc - 00A069 - Symmetricom Inc. + 0010FF + Cisco Systems, Inc - 00A07A - Advanced Peripherals Technologies Inc. + 001054 + Cisco Systems, Inc - 00609B - AstroNova Inc. + 0010F6 + Cisco Systems, Inc - 0060DB - NTP Elektronik A/S + 0010A6 + Cisco Systems, Inc - 006052 - PERIPHERALS ENTERPRISE Ltd + F0B2E5 + Cisco Systems, Inc - 0060B2 - Process Control Corp. + 0010FA + Apple, Inc. - 006081 - TV/CoM International + 0050E4 + Apple, Inc. - 00A005 - Daniel Instruments Ltd + 000D93 + Apple, Inc. - 00A0F2 - Infotek Communications Inc. + 0019E3 + Apple, Inc. - 00A0DF - STS Technologies Inc. + 001B63 + Apple, Inc. - 00A094 - Comsat Corporation + 001EC2 + Apple, Inc. - 00A0EF - Lucidata Ltd + 001FF3 + Apple, Inc. - 00A020 - Citicorp/TTI + 002332 + Apple, Inc. - 00A0CE - Ecessa + 00236C + Apple, Inc. - 00A028 - Conner Peripherals + 0023DF + Apple, Inc. - 00A09E - Ictv + 002500 + Apple, Inc. - 00A099 - K-NET Ltd + 0025BC + Apple, Inc. - 00A0EC - Transmitton Ltd + 34159E + Apple, Inc. - 00A067 - Network Services Group + 58B035 + Apple, Inc. - 00A0E0 - Tennyson Technologies Pty Ltd + 5C5948 + Apple, Inc. - 00A0FD - Scitex Digital Printing Inc. + C8BCC8 + Apple, Inc. - 00A00F - Broadband Technologies + 5897BD + Cisco Systems, Inc - 00A002 - Leeds & Northrup Australia Pty Ltd + 5C838F + Cisco Systems, Inc - 00A0E4 - Optiquest + ECBD1D + Cisco Systems, Inc - 00A0EE - Nashoba Networks + 7CFADF + Apple, Inc. - 00A0C3 - Unicomputer GmbH + 24AB81 + Apple, Inc. - 00A00A - Airspan + 78A3E4 + Apple, Inc. - 00A0E7 - Central Data Corporation + 1CABA7 + Apple, Inc. - 00A080 - Tattile SRL + E0F847 + Apple, Inc. - 00A02B - Transitions Research Corp. + 28E7CF + Apple, Inc. - 00A0E8 - Reuters Holdings PLC + E4CE8F + Apple, Inc. - 00A008 - Netcorp + E8040B + Apple, Inc. - 00A050 - Cypress Semiconductor + 145A05 + Apple, Inc. - 00A0DD - Azonix Corporation + 148FC6 + Apple, Inc. - 00A075 - Micron Technology Inc. + 286AB8 + Apple, Inc. - 00A009 - Whitetree Network + 28E02C + Apple, Inc. - 00A00C - Kingmax Technology Inc. + E0B9BA + Apple, Inc. - 00A066 - ISA Ltd + 00C610 + Apple, Inc. - 00A0AB - Netcs Informationstechnik GmbH + 7CD1C3 + Apple, Inc. - 00A0D8 - Spectra - TEK + F0DCE2 + Apple, Inc. - 00A0FA - Marconi Communication GmbH + A82066 + Apple, Inc. - 00A0CB - ARK Telecommunications Inc. + BC52B7 + Apple, Inc. - 00A034 - Axel + C0847A + Apple, Inc. - 00A001 - DRS Signal Solutions + B8F6B1 + Apple, Inc. - 0020B2 - GKD Gesellschaft Fur Kommunikation Und Datentechnik + 8CFABA + Apple, Inc. - 002052 - Ragula Systems + 881FA1 + Apple, Inc. - 0020FC - Matrox + C8E0EB + Apple, Inc. - 0020FE - Topware Inc. / Grand Computer + 98B8E3 + Apple, Inc. - 002073 - Fusion Systems Corporation + 885395 + Apple, Inc. - 002035 - IBM Corp + 786C1C + Apple, Inc. - 00A017 - J B M Corporation + 4C8D79 + Apple, Inc. - 00A025 - Redcom Labs Inc. + 1CE62B + Apple, Inc. - 00A0BB - Hilan GmbH + 24A2E1 + Apple, Inc. - 00A091 - Applicom International + 04214C + Insight Energy Ventures LLC - 00A0A5 - Teknor Microsysteme Inc. + F832E4 + ASUSTek COMPUTER INC. - 0020B7 - Namaqua Computerware + 80EA96 + Apple, Inc. - 0020E3 - MCD Kencom Corporation + 600308 + Apple, Inc. - 002013 - Diversified Technology Inc. + 04F13E + Apple, Inc. - 0020AB - Micro Industries Corp. + 98F0AB + Apple, Inc. - 00208D - CMD Technology + 087402 + Apple, Inc. - 0020DD - Cybertec Pty Ltd + 94F6A3 + Apple, Inc. - 0020E6 - Lidkoping Machine Tools AB + 98E0D9 + Apple, Inc. - 002086 - Microtech Electronics Limited + CC29F5 + Apple, Inc. - 002023 - T.C. Technologies Pty Ltd + 285AEB + Apple, Inc. - 00A054 - Private + 748114 + Apple, Inc. - 00205A - Computer Identics + 18F643 + Apple, Inc. - 002000 - Lexmark International Inc. + A45E60 + Apple, Inc. - 00201D - Katana Products + A01828 + Apple, Inc. - 002003 - Pixel Power Ltd + D0034B + Apple, Inc. - 002046 - Ciprico Inc. + 24A074 + Apple, Inc. - 00209B - Ersat Electronic GmbH + F02475 + Apple, Inc. - 00201C - Excel Inc. + 2C1F23 + Apple, Inc. - 00207F - Kyoei Sangyo Ltd + 549F13 + Apple, Inc. - 0020C9 - Victron BV + F0DBE2 + Apple, Inc. - 002077 - Kardios Systems Corp. + 0C3021 + Apple, Inc. - 00207A - WiSE Communications Inc. + DC86D8 + Apple, Inc. - 00203E - LogiCan Technologies Inc. + 90B931 + Apple, Inc. - 002058 - Allied Signal Inc. + D0E140 + Apple, Inc. - 0020E1 - Alamar Electronics + 10417F + Apple, Inc. - 002026 - Amkly Systems Inc. + A8667F + Apple, Inc. - 002065 - Supernet Networking Inc. + D02598 + Apple, Inc. - 00202A - N.V. Dzine + 783A84 + Apple, Inc. - 002083 - Presticom Incorporated + 5C8D4E + Apple, Inc. - 002019 - Ohler GmbH + 8863DF + Apple, Inc. - 00209E - Brown'S Operating System Services Ltd + 84788B + Apple, Inc. - 00208E - Chevin Software ENG Ltd + 80BE05 + Apple, Inc. - 002097 - Applied Signal Technology + 7831C1 + Apple, Inc. - 00C00B - Norcontrol A.S. + 0C3E9F + Apple, Inc. - 0020B0 - Gateway Devices Inc. + FCFC48 + Apple, Inc. - 00205B - Kentrox LLC + 9C293F + Apple, Inc. - 0020F6 - NET TEK AND Karlnet Inc. + 80A1AB + Intellisis - 0020C6 - Nectec + 84285A + Saffron Solutions Inc - 002008 - Cable & Computer Technology + D4B8FF + Home Control Singapore Pte Ltd - 0020D3 - OST (Ouest Standard Telematiqu + EC64E7 + MOCACARE Corporation - 00C00E - Psitech Inc. + 40862E + JDM MOBILE INTERNET SOLUTION CO., LTD. - 00C031 - Design Research Systems Inc. + 58F496 + Source Chain - 000701 - Racal-Datacom + 88947E + Fiberhome Telecommunication Technologies Co.,LTD - 00C09C - Hioki E.E. Corporation + 98F428 + zte corporation - 00C0AA - Silicon Valley Computer + E8343E + Beijing Infosec Technologies Co., LTD. - 00C066 - Docupoint Inc. + 346987 + zte corporation - 00C02D - Fuji Photo Film Ltd + D07C2D + Leie IOT technology Co., Ltd - 00C0F2 - Transition Networks + 9C88AD + Fiberhome Telecommunication Technologies Co.,LTD - 00C0BD - Inex Technologies Inc. + C8A2CE + Oasis Media Systems LLC - 00C088 - EKF Elektronik GmbH + 3C7873 + Airsonics - 00C011 - Interactive Computing Devices + 70BF3E + Charles River Laboratories - 00C03E - FA. Gebr. Heller GmbH + A8C87F + Roqos, Inc. - 00C0FD - Prosum + 3C831E + CKD Corporation - 00C014 - Telematics Calabasas Int'l,Inc + 90DFFB + HOMERIDER SYSTEMS - 00AA3C - Olivetti Telecom SPA (Olteco) + 2C081C + OVH - 00C0C9 - Elsag Bailey Process + C08488 + Finis Inc - 00C048 - BAY Technical Associates + 38F557 + JOLATA, INC. - 00C076 - I-Data International A-S + 4054E4 + Wearsafe Labs Inc - 00C046 - Blue Chip Technology Ltd + 305A3A + ASUSTek COMPUTER INC. - 00C097 - Archipel SA + 587F57 + Apple, Inc. - 00C004 - Japan Business Computer Ltd + 988744 + Wuxi Hongda Science and Technology Co.,LTD - 00C060 - ID Scandinavia AS + A4CC32 + Inficomm Co., Ltd - 0040CC - Silcom Manuf'G Technology Inc. + C4BBEA + Pakedge Device and Software Inc - 00C09E - Cache Computers Inc. + 006D52 + Apple, Inc. - 00C0AC - Gambit Computer Communications + 54A3FA + BQT Solutions (Australia)Pty Ltd - 00C034 - Transaction Network + A03299 + Lenovo (Beijing) Co., Ltd. - 00C093 - Alta Research Corp. + ACEE9E + Samsung Electronics Co.,Ltd - 0040E7 - Arnos Instruments & Computer + 041E7A + DSPWorks - 004087 - Ubitrex Corporation + 385F66 + Cisco SPVTG - 004007 - Telmat Informatique + 9C7A03 + Ciena Corporation - 00407B - Scientific Atlanta + 246C8A + YUKAI Engineering - 00402C - Isis Distributed Systems Inc. + B857D8 + Samsung Electronics Co.,Ltd - 00C0DF - KYE Systems Corp. + B844D9 + Apple, Inc. - 00C0F5 - Metacomp Inc. + 681295 + Lupine Lighting Systems GmbH - 00C091 - Jabil Circuit Inc. + 7011AE + Music Life LTD - 00C049 - U.S. Robotics Inc. + ACC51B + Zhuhai Pantum Electronics Co., Ltd. - 00C09D - Distributed Systems Int'l Inc. + 1C497B + Gemtek Technology Co., Ltd. - 00C0E9 - OAK Solutions Ltd + 2CCF58 + HUAWEI TECHNOLOGIES CO.,LTD - 00C0C5 - SID Informatica + D09380 + Ducere Technologies Pvt. Ltd. - 00C051 - Advanced Integration Research + 68F956 + Objetivos y Servicio de Valor Añadido - 00C085 - Electronics FOR Imaging Inc. + 84A788 + Perples - 00C0B2 - Norand Corporation + AC60B6 + Ericsson AB - 00C054 - Network Peripherals Ltd + 14B370 + Gigaset Digital Technology (Shenzhen) Co., Ltd. - 00C022 - Lasermaster Technologies Inc. + 6889C1 + HUAWEI TECHNOLOGIES CO.,LTD - 00C025 - Dataproducts Corporation + C8A9FC + Goyoo Networks Inc. - 0040CF - Strawberry Tree Inc. + 143EBF + zte corporation - 004077 - Maxton Technology Corporation + FC2FEF + UTT Technologies Co., Ltd. - 00C02C - Centrum Communications Inc. + FCFEC2 + Invensys Controls UK Limited - 00C0FB - Advanced Technology Labs + 689AB7 + Atelier Vision Corporation - 00C02B - Gerloff Gesellschaft FUR + E4A32F + Shanghai Artimen Technology Co., Ltd. - 004074 - Cable AND Wireless + 7C2BE1 + Shenzhen Ferex Electrical Co.,Ltd - 0040B8 - Idea Associates + 5031AD + ABB Global Industries and Services Private Limited - 0040E8 - Charles River Data Systems,Inc + A4C138 + Telink Semiconductor (Taipei) Co. Ltd. - 0040C0 - Vista Controls Corporation + 20F510 + Codex Digital Limited - 00C0A0 - Advance Micro Research Inc. + 444CA8 + Arista Networks - 00C010 - Hirakawa Hewtech Corp. + A48D3B + Vizio, Inc - 00C037 - Dynatem + 1C56FE + Motorola Mobility LLC, a Lenovo Company - 004083 - TDA Industria de Produtos + 046169 + MEDIA GLOBAL LINKS CO., LTD. - 00405B - Funasset Limited + BCEB5F + Fujian Beifeng Telecom Technology Co., Ltd. - 004073 - Bass Associates + F09A51 + Shanghai Viroyal Electronic Technology Company Limited - 00407D - Extension Technology Corp. + 7CA23E + HUAWEI TECHNOLOGIES CO.,LTD - 0080D7 - Fantum Engineering + E00370 + ShenZhen Continental Wireless Technology Co., Ltd. - 00807A - Aitech Systems Ltd + B869C2 + Sunitec Enterprise Co., Ltd. - 0080DC - Picker International + 88CBA5 + Suzhou Torchstar Intelligent Technology Co.,Ltd - 00404D - Telecommunications Techniques + B899B0 + Cohere Technologies - 00400D - Lannet Data Communications Ltd + D85DEF + Busch-Jaeger Elektro GmbH - 004019 - Aeon Systems Inc. + 88A2D7 + HUAWEI TECHNOLOGIES CO.,LTD - 0040BE - Boeing Defense & Space + 00323A + so-logic - 00406E - Corollary Inc. + F4672D + ShenZhen Topstar Technology Company - 004076 - Sun Conversion Technologies + A8D828 + Ascensia Diabetes Care - 004022 - Klever Computers Inc. + 3C3178 + Qolsys Inc. - 0040BF - Channel Systems Intern'L Inc. + 809FAB + Fiberhome Telecommunication Technologies Co.,LTD - 00401E - ICC + 501AA5 + GN Netcom A/S - 00409A - Network Express Inc. + E04B45 + Hi-P Electronics Pte Ltd - 004094 - Shographics Inc. + F46A92 + SHENZHEN FAST TECHNOLOGIES CO.,LTD - 004055 - Metronix GmbH + F0D657 + ECHOSENS - 004027 - SMC Massachusetts Inc. + F0AB54 + MITSUMI ELECTRIC CO.,LTD. - 00408B - Raylan Corporation + 14157C + TOKYO COSMOS ELECTRIC CO.,LTD. - 0040EF - Hypercom Inc. + 20E407 + Spark srl - 004093 - Paxdata Networks Ltd + 887384 + Toshiba - 004085 - Saab Instruments AB + AC562C + LAVA INTERNATIONAL(H.K) LIMITED - 004023 - Logic Corporation + 9C37F4 + HUAWEI TECHNOLOGIES CO.,LTD - 0040A4 - Rose Electronics + 3C4711 + HUAWEI TECHNOLOGIES CO.,LTD - 004008 - A Plus Info Corporation + 5CEB68 + Cheerstar Technology Co., Ltd - 0040B5 - Video Technology Computers Ltd + D09DAB + TCT mobile ltd - 004012 - Windata Inc. + FC9AFA + Motus Global Inc. - 0040D5 - Sartorius Mechatronics T&H GmbH + 08ECA9 + Samsung Electronics Co.,Ltd - 004010 - Sonic Systems Inc. + AC5A14 + Samsung Electronics Co.,Ltd - 0040CA - First Internat'L Computer Inc. + 1CF03E + Wearhaus Inc. - 0040C4 - Kinkei System Corporation + C8E130 + Milkyway Group Ltd - 00405D - Star-TEK Inc. + 1CC586 + Absolute Acoustics - 0040E2 - Mesa Ridge Technologies Inc. + 24693E + innodisk Corporation - 00408C - Axis Communications AB + C0DC6A + Qingdao Eastsoft Communication Technology Co.,LTD - 004045 - Twinhead Corporation + 24B0A9 + Shanghai Mobiletek Communication Ltd. - 004028 - Netcomm Limited + 407FE0 + Glory Star Technics (ShenZhen) Limited - 0040DD - Hong Technologies + 805067 + W & D TECHNOLOGY CORPORATION - 0040CB - Lanwan Technologies + 78F944 + Private - 0040B2 - Systemforschung + 486EFB + Davit System Technology Co., Ltd. - 0040E6 - C.A.E.N. + B0966C + Lanbowan Technology Ltd. - 0040F0 - MicroBrain,Inc. + 5C5B35 + Mist Systems, Inc. - 004089 - Meidensha Corporation + F8CFC5 + Motorola Mobility LLC, a Lenovo Company - 004015 - Ascom Infrasys AG + 146B72 + Shenzhen Fortune Ship Technology Co., Ltd. - 008095 - Basic Merton Handelsges.M.B.H. + C43ABE + Sony Corporation - 0080AE - Hughes Network Systems + 883B8B + Cheering Connection Co. Ltd. - 00803A - Varityper Inc. + E4F939 + Minxon Hotel Technology INC. - 00801C - Newport Systems Solutions + 70DA9C + TECSEN - 008056 - SPHINX Electronics GmbH & Co KG + 7840E4 + Samsung Electronics Co.,Ltd - 008031 - Basys, Corp. + E09971 + Samsung Electronics Co.,Ltd - 0080DB - Graphon Corporation + 2CA2B4 + Fortify Technologies, LLC - 008082 - PEP Modular Computers GmbH + 10D38A + Samsung Electronics Co.,Ltd - 008039 - Alcatel STC Australia + 247656 + Shanghai Net Miles Fiber Optics Technology Co., LTD. - 008023 - Integrated Business Networks + B8F080 + SPS, INC. - 00806B - Schmid Telecommunication + A47B85 + ULTIMEDIA Co Ltd, - 008059 - Stanley Electric Ltd + ECBAFE + GIROPTIC - 008041 - VEB Kombinat Robotron + 3C2C94 + 杭州德澜科技有限公司(HangZhou Delan Technology Co.,Ltd) - 008080 - Datamedia Corporation + 847303 + Letv Mobile and Intelligent Information Technology (Beijing) Corporation Ltd. - 00803F - Tatung Company + 3CC2E1 + XINHUA CONTROL ENGINEERING CO.,LTD - 0080E6 - Peer Networks Inc. + E48501 + Geberit International AG - 0080E0 - XTP Systems Inc. + 206274 + Microsoft Corporation - 008088 - Victor Company Of Japan Ltd + E8162B + IDEO Security Co., Ltd. - 0080D8 - Network Peripherals Inc. + 241B44 + Hangzhou Tuners Electronics Co., Ltd - 00809E - Datus GmbH + 80A85D + Osterhout Design Group - 00802B - Integrated Marketing Co + ACCAAB + Virtual Electric Inc - 008001 - Periphonics Corporation + 485415 + NET RULES TECNOLOGIA EIRELI - 008097 - Centralp Automatismes + 8C873B + Leica Camera AG - 008071 - SAI Technology + E0FFF7 + Softiron Inc. - 008098 - TDK Corporation + D89341 + General Electric Global Research - 0080CA - Netcom Research Incorporated + 700FC7 + SHENZHEN IKINLOOP TECHNOLOGY CO.,LTD. - 0080D5 - Cadre Technologies + 349E34 + Evervictory Electronic Co.Ltd - 00801B - Kodiak Technology + BC74D7 + HangZhou JuRu Technology CO.,LTD - 0080D3 - Shiva Corp. + 28D98A + Hangzhou Konke Technology Co.,Ltd. - 0080B3 - Aval Data Corporation + 78EB14 + SHENZHEN FAST TECHNOLOGIES CO.,LTD - 008020 - Network Products + 3C4937 + ASSMANN Electronic GmbH - 008070 - Computadoras Micron + 844464 + ServerU Inc - 008008 - Dynatech Computer Systems + 78E980 + RainUs Co.,Ltd - 0000E4 - IN2 Groupe Intertechnique + 142971 + NEMOA ELECTRONICS (HK) CO. LTD - 008013 - Thomas-Conrad Corporation + B47356 + Hangzhou Treebear Networking Co., Ltd. - 00806E - Nippon Steel Corporation + 346895 + Hon Hai Precision Ind. Co.,Ltd. - 008010 - Commodore International + 003560 + Rosen Aviation - 008047 - IN-NET Corp. + F8BC41 + Rosslare Enterprises Limited - 008067 - Square D Company + 3CB792 + Hitachi Maxell, Ltd., Optronics Division - 008045 - Matsushita Electric Ind. Co + 3C6A9D + Dexatek Technology LTD. - 0080BF - Takaoka Electric MFG Ltd + D88039 + Microchip Technology Inc. - 0080F9 - Heurikon Corporation + 1C9ECB + Beijing Nari Smartchip Microelectronics Company Limited - 0080A1 - Microtest Inc. + DCC622 + BUHEUNG SYSTEM - 0080A9 - Clearpoint Research + 902CC7 + C-MAX Asia Limited - 008017 - PFU Limited + 94C038 + Tallac Networks - 0080F8 - Mizar Inc. + 6836B5 + DriveScale, Inc. - 000014 - Netronix + 70FF5C + Cheerzing Communication(Xiamen)Technology Co.,Ltd - 000072 - Miniware Technology + 582136 + KMB systems, s.r.o. - 0000A1 - Marquette Electric Co. + 800902 + Keysight Technologies, Inc. - 0000F5 - Diamond Sales Limited + 0499E6 + Shenzhen Yoostar Technology Co., Ltd - 00005C - Telematics International Inc. + C40880 + Shenzhen UTEPO Tech Co., Ltd. - 0000AC - Conware Computer Consulting + F8B2F3 + GUANGZHOU BOSMA TECHNOLOGY CO.,LTD - 000094 - Asante Technologies + 5C966A + RTNET - 000090 - Microcom + 8870EF + SC Professional Trading Co., Ltd. - 000047 - Nicolet Instruments Corp. + BCBC46 + SKS Welding Systems GmbH - 000021 - Sureman Comp. & Commun. Corp. + 38B1DB + Hon Hai Precision Ind. Co.,Ltd. - 000030 - VG Laboratory Systems Ltd + 34F6D2 + Panasonic Taiwan Co.,Ltd. - 000035 - Spectragraphics Corporation + 307512 + Sony Corporation - 000026 - SHA-KEN Ltd + D48F33 + Microsoft Corporation - 0000B6 - Micro-Matic Research + 34B7FD + Guangzhou Younghead Electronic Technology Co.,Ltd - 000082 - Lectra Systemes SA + B47C29 + Shenzhen Guzidi Technology Co.,Ltd - 00002B - Crisp Automation Inc. + 54F876 + ABB AG - 000051 - HOB Electronic GmbH & Co. KG + 84930C + InCoax Networks Europe AB - 0000A7 - Network Computing Devices Inc. + 1CA2B1 + ruwido austria gmbh - 000098 - Crosscomm Corporation + 384B76 + AIRTAME ApS - 0000C6 - EON Systems + 205CFA + Yangzhou ChangLian Network Technology Co,ltd. - 000070 - HCL Limited + 64002D + Powerlinq Co., LTD - 00008F - Raytheon + 9816EC + IC Intracom - 0000F1 - Magna Computer Corporation + D062A0 + China Essence Technology (Zhumadian) Co., Ltd. - 000054 - Schneider Electric + 90179B + Nanomegas - 000020 - Dataindustrier Diab AB + 14F893 + Wuhan FiberHome Digital Technology Co.,Ltd. - 00007A - Dana Computer Inc. + 489D18 + Flashbay Limited - 000045 - Ford Aerospace & Comm. Corp. + 4C48DA + Beijing Autelan Technology Co.,Ltd - 00009C - Rolm MIL-Spec Computers + 4CBB58 + Chicony Electronics Co., Ltd. - 00007C - Ampere Incorporated + A41242 + NEC Platforms, Ltd. - 000068 - Rosemount Controls + C40006 + Lipi Data Systems Ltd. - 0000E9 - Isicad Inc. + D80CCF + C.G.V. S.A.S. - 00009F - Ameristar Technologies Inc. + 604826 + Newbridge Technologies Int. Ltd. - 0000E3 - Integrated Micro Products Ltd + 38F33F + TATSUNO CORPORATION - 0000AD - Bruker Instruments Inc. + B41780 + DTI Group Ltd - 000074 - Ricoh Company Ltd + 90203A + BYD Precision Manufacture Co.,Ltd - 000046 - Olivetti North America + D00AAB + Yokogawa Digital Computer Corporation - 00008D - Cryptek Inc. + 20A99B + Microsoft Corporation - 00003B - i Controls Inc. + 38262B + UTran Technology - 0000B3 - Cimlinc Incorporated + 480C49 + NAKAYO Inc - 0000D3 - Wang Laboratories Inc. + 3CD9CE + Eclipse WiFi - 0000D0 - Develcon Electronics Ltd + 6077E2 + Samsung Electronics Co.,Ltd - 000093 - Proteon Inc. + FC1910 + Samsung Electronics Co.,Ltd - 00008B - Infotron + 3CA10D + Samsung Electronics Co.,Ltd - 080057 - Evans & Sutherland + 646CB2 + Samsung Electronics Co.,Ltd - 08005D - Gould Inc. + 680571 + Samsung Electronics Co.,Ltd - 08005B - VTA Technologies Inc. + FC790B + Hitachi High Technologies America, Inc. - 080071 - Matra (Dsie) + 6081F9 + Helium Systems, Inc - 08006C - Suntek Technology Int'l + F4C447 + Coagent International Enterprise Limited - 080067 - ComDesign + A43D78 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 08008C - Network Research Corporation + A0FC6E + Telegrafia a.s. - 080081 - Astech Inc. + 2053CA + Risk Technology Ltd - 08002D - LAN-TEC Inc. + 98F170 + Murata Manufacturing Co., Ltd. - 00DD00 - Ungermann-Bass Inc. + 04C991 + Phistek INC. - 0000AA - Xerox Corporation + 686E48 + Prophet Electronic Technology Corp.,Ltd - 040AE0 - Xmit AG Computer Networks + 14B484 + Samsung Electronics Co.,Ltd - 080011 - Tektronix Inc. + C4C9EC + Gugaoo HK Limited - 080026 - Norsk Data A.S. + 8401A7 + Greyware Automation Products, Inc - 080025 - Control Data + C4626B + ZPT Vigantice - 100000 - Private + EC1766 + Research Centre Module - 0000D7 - Dartmouth College + A0D12A + AXPRO Technology Inc. - AA0004 - Digital Equipment Corporation + 50C7BF + TP-LINK TECHNOLOGIES CO.,LTD. - 08000C - Miklyn Development Co. + 209AE9 + Volacomm Co., Ltd - 00DD05 - Ungermann-Bass Inc. + 345D10 + Wytek - 08001D - Able Communications Inc. + 6C14F7 + Erhardt+Leimer GmbH - 00DD0B - Ungermann-Bass Inc. + ACA9A0 + Audioengine, Ltd. - 080003 - Advanced Computer Comm. + A481EE + Nokia Corporation - 00DD03 - Ungermann-Bass Inc. + 78D66F + Aristocrat Technologies Australia Pty. Ltd. - 00DD0F - Ungermann-Bass Inc. + 441E91 + ARVIDA Intelligent Electronics Technology Co.,Ltd. - 000001 - Xerox Corporation + B0D59D + Shenzhen Zowee Technology Co., Ltd - 080017 - National Semiconductor + 6828BA + Dejai - 542160 - Alula + 34E42A + Automatic Bar Controls Inc. - 10B3C6 - Cisco Systems Inc. + 20A787 + Bointec Taiwan Corporation Limited - 10B3D6 - Cisco Systems Inc. + A49F85 + Lyve Minds, Inc - 589630 - Technicolor CH USA Inc. + 04572F + Sertel Electronics UK Ltd - F854B8 - Amazon Technologies Inc. + D8977C + Grey Innovation - 781735 - Nokia Shanghai Bell Ltd + 205A00 + Coval - 3C894D - Dr. Ing. h.c. F. Porsche AG + A8A668 + zte corporation - 84C807 - ADVA Optical Networking Ltd + BC8D0E + Nokia - B43939 - Shenzhen TINNO Mobile Technology Corp. + 78923E + Nokia Corporation - A0AB51 - Weifang Goertek Electronics Ltd + 00EEBD + HTC Corporation - 64C901 - INVENTEC Corporation + A824EB + ZAO NPO Introtest - 749EF5 - Samsung Electronics Ltd + 48EE07 + Silver Palm Technologies LLC - 68BFC4 - Samsung Electronics Ltd + 38F708 + National Resource Management, Inc. - A85E45 - ASUSTek Computer Inc. + E0DB88 + Open Standard Digital-IF Interface for SATCOM Systems - 04B1A1 - Samsung Electronics Ltd + C40E45 + ACK Networks,Inc. - CC464E - Samsung Electronics Ltd + 3C89A6 + KAPELSE - F8893C - Inventec Appliances Corp. + A46CC1 + LTi REEnergy GmbH - A0DF15 - Huawei Technologies Ltd + A8B9B3 + ESSYS - C4AD34 - Routerboard.com + 6C09D6 + Digiquest Electronics LTD - 306F07 - Nations Technologies Inc. + 481842 + Shanghai Winaas Co. Equipment Co. Ltd. - 2474F7 - GoPro + 447098 + MING HONG TECHNOLOGY (SHEN ZHEN) LIMITED - 7CD566 - Amazon Technologies Inc. + B05706 + Vallox Oy - 686350 - Hella India Automotive Pvt Ltd + 9CBD9D + SkyDisk, Inc. - 5CE50C - Beijing Xiaomi Mobile Software Ltd + 74C621 + Zhejiang Hite Renewable Energy Co.,LTD - 18703B - Huawei Device Ltd + D4319D + Sinwatec - D89E61 - Huawei Device Ltd + B068B6 + Hangzhou OYE Technology Co. Ltd - 347E00 - Huawei Device Ltd + 2C534A + Shenzhen Winyao Electronic Limited - 003092 - Kontron Electronics AG + A4BBAF + Lime Instruments - 80751F - BSkyB Ltd + F490CA + Tensorcom - E85A8B - Xiaomi Communications Ltd + 282246 + Beijing Sinoix Communication Co., LTD - 442295 - China Mobile Iot Limited Company + 9C65F9 + AcSiP Technology Corp. - 5C710D - Cisco Systems Inc. + 487604 + Private - 00AB48 - eero Inc. + E44C6C + Shenzhen Guo Wei Electronic Co,. Ltd. - F855CD - Visteon Corporation + A8574E + TP-LINK TECHNOLOGIES CO.,LTD. - 441847 - Hunan Scrown Electronic Information Tech Ltd + B843E4 + Vlatacom - 1CC1BC - Yichip Microelectronics (Hangzhou) Ltd + C4824E + Changzhou Uchip Electronics Co., LTD. - AC61B9 - WAMA Technology Limited + 48B977 + PulseOn Oy - C4D8F3 - iZotope + 64E625 + Woxu Wireless Co., Ltd - 003056 - HMS Industrial Networks + 10B713 + Private - 680AE2 - Silicon Laboratories + 208986 + zte corporation - AC8B9C - Primera Technology Inc. + B8266C + ANOV France - 2C3AFD - AVM Audiovisuelles Marketing und Computersysteme GmbH + 182012 + Aztech Associates Inc. - 34495B - Sagemcom Broadband SAS + 3C300C + Dewar Electronics Pty Ltd - C8F319 - LG Electronics (Mobile Communications) + 98FFD0 + Lenovo Mobile Communication Technology Ltd. - 801609 - Sleep Number + 44C56F + NGN Easy Satfinder (Tianjin) Electronic Co., Ltd - 045EA4 - Shenzhen Netis Technology Ltd + B898F7 + Gionee Communication Equipment Co,Ltd.ShenZhen - 1CBFC0 - Chongqing Fugui Electronics Ltd + 848336 + Newrun - 78B46A - Huawei Technologies Ltd + 5C2AEF + r2p Asia-Pacific Pty Ltd - 6CEBB6 - Huawei Technologies Ltd + B87AC9 + Siemens Ltd. - 4CF55B - Huawei Technologies Ltd + F06130 + Advantage Pharmacy Services, LLC - E83F67 - Huawei Device Ltd + 88FED6 + ShangHai WangYong Software Co., Ltd. - 3446EC - Huawei Device Ltd + 7C72E4 + Unikey Technologies - 643139 - IEEE Registration Authority + 7C2048 + KoamTac - A44BD5 - Xiaomi Communications Ltd + 8CB7F7 + Shenzhen UniStrong Science & Technology Co., Ltd - 64956C - LG Electronics + 084027 + Gridstore Inc. - 14876A - Apple + A47760 + Nokia Corporation - E0B55F - Apple + C85663 + Sunflex Europe GmbH - F8FFC2 - Apple + 38BF2F + Espec Corp. - E0EB40 - Apple + A875E2 + Aventura Technologies, Inc. - 64694E - Texas Instruments + 44C4A9 + Opticom Communication, LLC - 94D6DB - NexFi + 6C3C53 + SoundHawk Corp - B4ECF2 - Shanghai Listent Medical Tech Ltd + 1C63B7 + OpenProducts 237 AB - 4077A9 - New H3C Technologies Ltd + B4527E + Sony Corporation - F83331 - Texas Instruments + 18AA45 + Fon Technology - C4954D - IEEE Registration Authority + 94B9B4 + Aptos Technology - C49878 - Shanghai Moaan Intelligent Technology Ltd + 902083 + General Engine Management Systems Ltd. - 6C639C - ARRIS Group Inc. + 14B126 + Industrial Software Co - A4BB6D - Dell Inc. + D850E6 + ASUSTek COMPUTER INC. - 6C06D6 - Huawei Device Ltd + DC3EF8 + Nokia Corporation - 0C8E29 - Arcadyan Corporation + A49F89 + Shanghai Rui Rui Communication Technology Co.Ltd. - A0224E - IEEE Registration Authority + E47723 + zte corporation - 3027CF - Private + 9CA9E4 + zte corporation - 3843E5 - Grotech Inc + 90F3B7 + Kirisun Communications Co., Ltd. - CC593E - Sensium Healthcare Limited + 180C14 + iSonea Limited - 5C68D0 - Aurora Innovation Inc. + C4E92F + AB Sciex - 10364A - Boston Dynamics + A88D7B + SunDroid Global limited. - 00B810 - Yichip Microelectronics (Hangzhou) Ltd + 7060DE + LaVision GmbH - A4B239 - Cisco Systems Inc. + 502E5C + HTC Corporation - 001BB0 - Bharat Electronics Limited + 3CF748 + Shenzhen Linsn Technology Development Co.,Ltd - 68AFFF - Shanghai Cambricon Information Technology Ltd + 6C15F9 + Nautronix Limited - DC21E2 - Huawei Technologies Ltd + 643F5F + Exablaze - FC1BD1 - Huawei Technologies Ltd + FCFE77 + Hitachi Reftechno, Inc. - 582575 - Huawei Technologies Ltd + 70533F + Alfa Instrumentos Eletronicos Ltda. - 28DEE5 - Huawei Technologies Ltd + 38B74D + Fijowave Limited - D01C3C - Tecno Mobile Limited + 50C271 + SECURETECH INC - 18C04D - Giga-Byte Technology Ltd + 407A80 + Nokia Corporation - 8CAAB5 - Espressif Inc. + B07908 + Cummings Engineering - 402C76 - IEEE Registration Authority + 044F8B + Adapteva, Inc. - 44C7FC - Huawei Device Ltd + 9CE7BD + Winduskorea co., Ltd - 7885F4 - Huawei Device Ltd + 3842A6 + Ingenieurbuero Stahlkopf - F44955 - MIMO TECH Ltd + 644214 + Swisscom Energy Solutions AG - 0809C7 - Zhuhai Unitech Power Technology Ltd + 0CA694 + Sunitec Enterprise Co.,Ltd - 88541F - Google Inc. + 184462 + Riava Networks, Inc. - 900CC8 - Google Inc. + 146080 + zte corporation - 041DC7 - ZTE Corporation + 9CBB98 + Shen Zhen RND Electronic Co.,LTD - 68215F - Edgecore Networks Corporation + 54FB58 + WISEWARE, Lda - 3C28A6 - Alcatel-Lucent Enterprise (China) + 2CCD69 + Aqavi.com - 5050A4 - Samsung Electronics Ltd + 8C2F39 + IBA Dosimetry GmbH - 8086D9 - Samsung Electronics Ltd + C0A0BB + D-Link International - F417B8 - AirTies Wireless Networks + 344F3F + IO-Power Technology Co., Ltd. - 3CBF60 - Apple + 1446E4 + AVISTEL - AC15F4 - Apple + D095C7 + Pantech Co., Ltd. - 386A77 - Samsung Electronics Ltd + D02C45 + littleBits Electronics, Inc. - 141459 - Vodafone Italia S.p.A. + 248000 + Westcontrol AS - 5043B9 - OktoInform RUS + 1C4BB9 + SMG ENTERPRISE, LLC - 5C27D4 - Shenzhen Qihu Intelligent Technology Company Limited + 346178 + The Boeing Company - 88A479 - Apple + C03580 + A&R TECH - 047295 - Apple + D08A55 + Skullcandy - D446E1 - Apple + CC720F + Viscount Systems Inc. - 78D162 - Apple + 742B62 + FUJITSU LIMITED - 08F8BC - Apple + B4A82B + Histar Digital Electronics Co., Ltd. - 90A25B - Apple + 940BD5 + Himax Technologies, Inc - 18300C - Hisense Electric Ltd + F45F69 + Matsufu Electronics distribution Company - 44A56E - Netgear + 28A1EB + ETEK TECHNOLOGY (SHENZHEN) CO.,LTD - 1C919D - Dongguan Liesheng Electronic Ltd + B8F828 + Changshu Gaoshida Optoelectronic Technology Co. Ltd. - FCF29F - China Mobile Iot Limited Company + 3C1A57 + Cardiopulmonary Corp - F81F32 - Motorola Mobility LLC, a Lenovo Company + 541B5D + Techno-Innov - B00AD5 - ZTE Corporation + 083571 + CASwell INC. - 20114E - MeteRSit S.R.L. + 9876B6 + Adafruit - 2C5741 - Cisco Systems Inc. + 503CC4 + Lenovo Mobile Communication Technology Ltd. - A84D4A - Audiowise Technology Inc. + E0D1E6 + Aliph dba Jawbone - 7894E8 - Radio Bridge + 041B94 + Host Mobility AB - 484EFC - ARRIS Group Inc. + A0CEC8 + CE LINK LIMITED - B0B353 - IEEE Registration Authority + 907A28 + Beijing Morncloud Information And Technology Co. Ltd. - 547FBC - iodyne + 78FE41 + Socus networks - 7CDFA1 - Espressif Inc. + 205721 + Salix Technology CO., Ltd. - 98006A - ZTE Corporation + 883612 + SRC Computers, LLC - 002674 - Hunter Douglas + D82D9B + Shenzhen G.Credit Communication Technology Co., Ltd - 1C97C5 - Ynomia Pty Ltd + 709BFC + Bryton Inc. - 5CC1D7 - Samsung Electronics Ltd + ACE42E + SK hynix - 380146 - Shenzhen Bilian Electronic Ltd + 2C7B84 + OOO Petr Telegin - 889655 - Zitte Corporation + A4C0C7 + ShenZhen Hitom Communication Technology Co..LTD - F4A4D6 - Huawei Technologies Ltd + 18104E + CEDINT-UPM - FCE14F - BRK Brands Inc. + 306112 + PAV GmbH - 74B6B6 - eero Inc. + 789F4C + HOERBIGER Elektronik GmbH - EC97B2 - SUMEC Machinery & Electric Ltd + FC4BBC + Sunplus Technology Co., Ltd. - 28FA7A - Zhejiang Tmall Technology Ltd + 9C1465 + Edata Elektronik San. ve Tic. A.Ş. - 842E14 - Silicon Laboratories + 4C55CC + Zentri Pty Ltd - 1005E1 - Nokia + 00C5DB + Datatech Sistemas Digitales Avanzados SL - 08F458 - Huawei Device Ltd + 8CF945 + Power Automation pte Ltd - 5CBA2C - Hewlett Packard Enterprise + F842FB + Yasuda Joho Co.,ltd. - 343794 - Hamee Corp. + 887398 + K2E Tekpoint - EC316D - Hansgrohe + 58F387 + Airios - 4410FE - Huizhou Foryou General Electronics Ltd + 3C977E + IPS Technology Limited - 7CAB60 - Apple + A4FB8D + Hangzhou Dunchong Technology Co.Ltd - 44C65D - Apple + 107A86 + U&U ENGINEERING INC. - 187EB9 - Apple + 40BD9E + Physio-Control, Inc - 4CA64D - Cisco Systems Inc. + 6C5779 + Aclima, Inc. - CC7F75 - Cisco Systems Inc. + C0DA74 + Hangzhou Sunyard Technology Co., Ltd. - 20E874 - Apple + 882364 + Watchnet DVR Inc - D03FAA - Apple + 2C922C + Kishu Giken Kogyou Company Ltd,. - 0CB937 - Ubee Interactive Ltd + D8FEE3 + D-Link International - D4DC09 - Mist Systems Inc. + 50A0BF + Alba Fiber Systems Inc. - 0088BA - NC&C + B836D8 + Videoswitch - F47335 - Logitech Far East + 043D98 + ChongQing QingJia Electronics CO.,LTD - 90ADFC - Telechips Inc. + E03E4A + Cavanagh Group International - 5CA62D - Cisco Systems Inc. + F4CD90 + Vispiron Rotec GmbH - 402B69 - Kumho Electric Inc. + 542160 + Alula - E8E98E - SOLAR Controls s.r.o. + 806C8B + KAESER KOMPRESSOREN AG - 64F6BB - Fibocom Wireless Inc. + 581CBD + Affinegy - BC1695 - ZTE Corporation + 284FCE + Liaoning Wontel Science and Technology Development Co.,Ltd. - DC35F1 - Positivo Tecnologia S.A. + DC6F00 + Livescribe, Inc. - A40801 - Amazon Technologies Inc. + 54E3B0 + JVL Industri Elektronik - AC1ED0 - Temic Automotive Philippines Inc. + 1001CA + Ashley Butterworth - 2CEA7F - Dell Inc. + 246AAB + IT-IS International - 345180 - TCL King Electrical Appliances (Huizhou) Ltd + 18D6CF + Kurth Electronic GmbH - A4CFD2 - Ubee Interactive Ltd + F48139 + CANON INC. - A8A097 - ScioTeq bvba + 1836FC + Elecsys International Corporation - 086BD1 - Shenzhen SuperElectron Technology Ltd + A4D094 + VIVAVIS AG - AC3A67 - Cisco Systems Inc. + 2C9464 + Cincoze Co., Ltd. - 3CB53D - Hunan Goke Microelectronics Ltd + 804B20 + Ventilation Control - 980D51 - Huawei Device Ltd + 287994 + Realplay Digital Technology(Shenzhen) Co.,Ltd - 00ADD5 - Huawei Device Ltd + 94B8C5 + RuggedCom Inc. - 905D7C - New H3C Technologies Ltd + 604A1C + SUYIN Corporation - 98FAA7 - Innonet + 082719 + APS systems/electronic AG - 487B5E - SMT Telecomm HK + 505AC6 + GUANGDONG SUPER TELECOM CO.,LTD. - B8E3B1 - Huawei Technologies Ltd + 3065EC + Wistron (ChongQing) - 00B7A8 - Heinzinger electronic GmbH + B863BC + ROBOTIS, Co, Ltd - EC7949 - Fujitsu Limited + 980D2E + HTC Corporation - D4D2D6 - FN-Link Technology Limited + 9C79AC + Suntec Software(Shanghai) Co., Ltd. - 105072 - Sercomm Corporation. + C419EC + Qualisys AB - 900A84 - Mellanox Technologies Inc. + 542CEA + PROTECTRON - AC4A67 - Cisco Systems Inc. + D464F7 + CHENGDU USEE DIGITAL TECHNOLOGY CO., LTD - 70CA97 - Ruckus Wireless + 60E00E + SHINSEI ELECTRONICS CO LTD - 000991 - Intelligent Platforms LLC. + 545414 + Digital RF Corea, Inc - C8665D - Extreme Networks Inc. + 24EB65 + SAET I.S. S.r.l. - E01C41 - Extreme Networks Inc. + E894F6 + TP-LINK TECHNOLOGIES CO.,LTD. - D854A2 - Extreme Networks Inc. + DC825B + JANUS, spol. s r.o. - 08661F - Palo Alto Networks + 9CA577 + Osorno Enterprises Inc. - BCF310 - Extreme Networks Inc. + C04301 + Epec Oy - 285471 - Huawei Device Ltd + E07C62 + Whistle Labs, Inc. - B88E82 - Huawei Device Ltd + 9498A2 + Shanghai LISTEN TECH.LTD - DC333D - Huawei Device Ltd + DC2BCA + Zera GmbH - D8787F - Ubee Interactive Ltd + 5C8486 + Brightsource Industries Israel LTD - D41D71 - Palo Alto Networks + BCBAE1 + AREC Inc. - 0887C6 - Ingram Micro Services + 18FA6F + ISC applied systems corp - 785773 - Huawei Technologies Ltd + 601E02 + EltexAlatau - AC6089 - Huawei Technologies Ltd + F07F0C + Leopold Kostal GmbH &Co. KG - 843E92 - Huawei Technologies Ltd + 4C6255 + SANMINA-SCI SYSTEM DE MEXICO S.A. DE C.V. - 708CB6 - Huawei Technologies Ltd + 50CD32 + NanJing Chaoran Science & Technology Co.,Ltd. - 50464A - Huawei Technologies Ltd + E0EDC7 + Shenzhen Friendcom Technology Development Co., Ltd - C4A402 - Huawei Technologies Ltd + D4A499 + InView Technology Corporation - 0015FF - Novatel Wireless Solutions Inc. + B4DD15 + ControlThings Oy Ab - 2880A2 - Novatel Wireless Solutions Inc. + E0C6B3 + MilDef AB - 68332C - Kenstel Networks Limited + 188410 + CoreTrust Inc. - 145E45 - Bamboo Systems Group + FC229C + Han Kyung I Net Co.,Ltd. - 70617B - Cisco Systems Inc. + 1832A2 + LAON TECHNOLOGY CO., LTD. - 985949 - Luxottica Group S.P.A. + 74D02B + ASUSTek COMPUTER INC. - AC67B2 - Espressif Inc. + A01C05 + NIMAX TELECOM CO.,LTD. - 9CBD6E - DERA Ltd + 08482C + Raycore Taiwan Co., LTD. - 4C3329 - Sweroam + 6472D8 + GooWi Technology Co.,Limited - 64E172 - Shenzhen Qihoo Intelligent Technology Ltd + 846223 + Shenzhen Coship Electronics Co., Ltd. - 488F5A - Routerboard.com + 1CFA68 + TP-LINK TECHNOLOGIES CO.,LTD. - 100645 - Sagemcom Broadband SAS + DC1DD4 + Microstep-MIS spol. s r.o. - 0014C9 - Brocade Communications Systems LLC + FCDD55 + Shenzhen WeWins wireless Co.,Ltd - 002438 - Brocade Communications Systems LLC + B01743 + EDISON GLOBAL CIRCUITS LLC - 748EF8 - Brocade Communications Systems LLC + F82EDB + RTW GmbH & Co. KG - 0027F8 - Brocade Communications Systems LLC + C04A00 + TP-LINK TECHNOLOGIES CO.,LTD. - 50EB1A - Brocade Communications Systems LLC + 045FA7 + Shenzhen Yichen Technology Development Co.,LTD - F84DFC - Hangzhou Hikvision Digital Technology Ltd + 087999 + AIM GmbH - 849A40 - Hangzhou Hikvision Digital Technology Ltd + C011A6 + Fort-Telecom ltd. - D81FCC - Brocade Communications Systems LLC + C0B8B1 + BitBox Ltd - C489ED - Solid Optics EU N.V. + 105F06 + Actiontec Electronics, Inc - 60F43A - Edifier International + 1853E0 + Hanyang Digitech Co.Ltd - 58A87B - Fitbit Inc. + C0885B + SnD Tech Co., Ltd. - 5C6BD7 - Foshan VIOMI Electric Appliance Technology Ltd + 3CFB96 + Emcraft Systems LLC - 1848CA - Murata Manufacturing Ltd + 081F3F + WondaLink Inc. - 90EEC7 - Samsung Electronics Ltd + 40516C + Grandex International Corporation - 1029AB - Samsung Electronics Ltd + D0BE2C + CNSLink Co., Ltd. - 184ECB - Samsung Electronics Ltd + 00C14F + DDL Co,.ltd. - 8022A7 - NEC Platforms Ltd + 2C26C5 + zte corporation - 64E881 - Aruba Networks HP + 807B1E + Corsair Memory, Inc. - 989D5D - Technicolor CH USA Inc. + B4AB2C + MtM Technology Corporation - 5C2316 - Squirrels Research Labs LLC + 74372F + Tongfang Shenzhen Cloudcomputing Technology Co.,Ltd - 042144 - Sunitec Enterprise Ltd + E8A364 + Signal Path International / Peachtree Audio - A027B6 - Samsung Electronics Ltd + BC51FE + Swann communications Pty Ltd - 103917 - Samsung Electronics Ltd + E0CEC3 + ASKEY COMPUTER CORP - 9880EE - Samsung Electronics Ltd + F0219D + Cal-Comp Electronics & Communications Company Ltd. - CC0DF2 - Motorola Mobility LLC, a Lenovo Company + 181725 + Cameo Communications, Inc. - 94BF94 - Juniper Networks + 8462A6 + EuroCB (Phils), Inc. - 94434D - Ciena Corporation + E4F365 + Time-O-Matic, Inc. - A84025 - Oxide Computer Company + DCC0DB + Shenzhen Kaiboer Technology Co., Ltd. - 1065A3 - Panamax LLC + AC5D10 + Pace Americas - C85BA0 - Shenzhen Qihu Intelligent Technology Company Limited + 88F490 + Jetmobile Pte Ltd - E0BE03 - Lite-On Network Communication (Dongguan) Limited + FC626E + Beijing MDC Telecom - 5C9012 - Owl Cyber Defense Solutions LLC + 94C962 + Teseq AG - 38F7CD - IEEE Registration Authority + DC2A14 + Shanghai Longjing Technology Co. - 98CBA4 - Benchmark Electronics + 808B5C + Shenzhen Runhuicheng Technology Co., Ltd - 0012E3 - Agat Soft LLC + C05E6F + V. Stonkaus firma Kodinis Raktas - 001351 - Niles Audio Corporation + 6886E7 + Orbotix, Inc. - 183CB7 - Huawei Device Ltd + D819CE + Telesquare - A48873 - Cisco Systems Inc. + 1C9179 + Integrated System Technologies Ltd - B8804F - Texas Instruments + 38F597 + home2net GmbH - FCA5D0 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 6CB311 + Shenzhen Lianrui Electronics Co.,Ltd - 04CB88 - Shenzhen Jingxun Software Telecommunication Technology Ltd + D8D5B9 + Rainforest Automation, Inc. - A06260 - Private + 2411D0 + Chongqing Ehs Science and Technology Development Co.,Ltd. - A4BDC4 - Huawei Technologies Ltd + B461FF + Lumigon A/S - 5C9157 - Huawei Technologies Ltd + A0A130 + DLI Taiwan Branch office - 481693 - Lear Corporation GmbH + BC39A6 + CSUN System Technology Co.,LTD - B47947 - Nutanix + ECB541 + SHINANO E and E Co.Ltd. - 04F8F8 - Edgecore Networks Corporation + E4C146 + Objetivos y Servicios de Valor A - 38F0C8 - Mevo Inc. + D40057 + MC Technologies GmbH - 5CFE9E - Wiwynn Corporation Tainan Branch + A875D6 + FreeTek International Co., Ltd. - 881C95 - Itel Mobile Limited + 10A743 + SK Mtek Limited - F46942 - Askey Computer Corp + 547FA8 + TELCO systems, s.r.o. - 241407 - Xiamen Sigmastar Technology Ltd + 5474E6 + Webtech Wireless - 08E9F6 - AMPAK Technology,Inc. + C46DF1 + DataGravity - F02E51 - Casa Systems + 30215B + Shenzhen Ostar Display Electronic Co.,Ltd - CCC261 - IEEE Registration Authority + CC593E + Sensium Healthcare Limited - 7470FD - Intel Corporation + 34FA40 + Guangzhou Robustel Technologies Co., Limited - 7C2A31 - Intel Corporation + 1C5A6B + Philips Electronics Nederland BV - B46BFC - Intel Corporation + 84C8B1 + Incognito Software Systems Inc. - 144F8A - Intel Corporation + 30D357 + Logosol, Inc. - C0B6F9 - Intel Corporation + 94FD2E + Shanghai Uniscope Technologies Co.,Ltd - 48A472 - Intel Corporation + A0BAB8 + Pixon Imaging - D8F2CA - Intel Corporation + 74E424 + APISTE CORPORATION - 48F17F - Intel Corporation + D410CF + Huanshun Network Science and Technology Co., Ltd. - 68ECC5 - Intel Corporation + 5CE0F6 + NIC.br- Nucleo de Informacao e Coordenacao do Ponto BR - 7C7635 - Intel Corporation + C83D97 + Nokia Corporation - 640BD7 - Apple + 0CF361 + Java Information - A8913D - Apple + B0358D + Nokia Corporation - 4CC95E - Samsung Electronics Ltd + F8E4FB + Actiontec Electronics, Inc - 0C3B50 - Apple + 8C4AEE + GIGA TMS INC - 782B46 - Intel Corporation + 34C99D + EIDOLON COMMUNICATIONS TECHNOLOGY CO. LTD. - 347DF6 - Intel Corporation + 802FDE + Zurich Instruments AG - CCD9AC - Intel Corporation + 5C38E0 + Shanghai Super Electronics Technology Co.,LTD - 9C2976 - Intel Corporation + 600F77 + SilverPlus, Inc - B89A2A - Intel Corporation + E44F5F + EDS Elektronik Destek San.Tic.Ltd.Sti - 58961D - Intel Corporation + E86D54 + Digit Mobile Inc - 74D83E - Intel Corporation + E8718D + Elsys Equipamentos Eletronicos Ltda - 08D23E - Intel Corporation + ECE915 + STI Ltd - A87EEA - Intel Corporation + 80D733 + QSR Automations, Inc. - 40EC99 - Intel Corporation + 303D08 + GLINTT TES S.A. - BC542F - Intel Corporation + ACE64B + Shenzhen Baojia Battery Technology Co., Ltd. - 34CFF6 - Intel Corporation + 044BFF + GuangZhou Hedy Digital Technology Co., Ltd - C87EA1 - TCL MOKA International Limited + A81FAF + KRYPTON POLSKA - A0510B - Intel Corporation + 08E5DA + NANJING FUJITSU COMPUTER PRODUCTS CO.,LTD. - DCFB48 - Intel Corporation + 5884E4 + IP500 Alliance e.V. - 84FDD1 - Intel Corporation + 08AF78 + Totus Solutions, Inc. - 4074E0 - Intel Corporation + 0C93FB + BNS Solutions - 087190 - Intel Corporation + 789F87 + Siemens AG I IA PP PRM - 5CCD5B - Intel Corporation + 6032F0 + Mplus technology - 98AF65 - Intel Corporation + D8AF3B + Hangzhou Bigbright Integrated communications system Co.,Ltd - 40A6B7 - Intel Corporation + 2829D9 + GlobalBeiMing technology (Beijing)Co. Ltd - 0C7A15 - Intel Corporation + 88615A + Siano Mobile Silicon Ltd. - 548D5A - Intel Corporation + 70E24C + SAE IT-systems GmbH & Co. KG - 3066D0 - Huawei Device Ltd + 00FD4C + NEVATEC - 3CB233 - Huawei Device Ltd + D0738E + DONG OH PRECISION CO., LTD. - 209E79 - Universal Electronics Inc. + 64C944 + LARK Technologies, Inc - AC5FEA - OnePlus Technology (Shenzhen) Ltd + 1C9492 + RUAG Schweiz AG - 044AC6 - Aipon Electronics Ltd + B889CA + ILJIN ELECTRIC Co., Ltd. - 5CD5B5 - Shenzhen WiSiYiLink Technology Ltd + 64F50E + Kinion Technology Company Limited - 88948F - Xi'an Zhisensor Technologies Ltd + 601929 + VOLTRONIC POWER TECHNOLOGY(SHENZHEN) CORP. - 189552 - 1MORE + 48B253 + Marketaxess Corporation - C0FFA8 - Huawei Technologies Ltd + 305D38 + Beissbarth - C0517E - Hangzhou Hikvision Digital Technology Ltd + 60D2B9 + REALAND BIO CO., LTD. - FC1499 - Aimore Acoustics Incorporation + 30FD11 + MACROTECH (USA) INC. - 98C7A4 - Shenzhen HS Fiber Communication Equipment Ltd + 144319 + Creative&Link Technology Limited - 00BED5 - New H3C Technologies Ltd + 1848D8 + Fastback Networks - 0002C4 - OPT Machine Vision Tech Ltd + C8C791 + Zero1.tv GmbH - ACF108 - LG Innotek + ECD925 + RAMI - 08ED9D - Tecno Mobile Limited + 005D03 + Xilinx, Inc - E86DCB - Samsung Electronics Ltd + D04CC1 + SINTRONES Technology Corp. - 304950 - IEEE Registration Authority + 503F56 + Syncmold Enterprise Corp - 0005C9 - LG Innotek + C4DA26 + NOBLEX SA - 0CDC7E - Espressif Inc. + 7CC8AB + Acro Associates, Inc. - 2098D8 - Shenzhen Yingdakang Technology Ltd + 10F3DB + Gridco Systems, Inc. - 7CC77E - Fiberhome Telecommunication Technologies Ltd + 8CEEC6 + Precepscion Pty. Ltd. - A0CFF5 - ZTE Corporation + 101248 + ITG, Inc. - 1C012D - Ficer Technology + 74943D + AgJunction - 3CA62F - AVM Audiovisuelles Marketing und Computersysteme GmbH + 049C62 + BMT Medical Technology s.r.o. - 98B3EF - Huawei Device Ltd + 0C2A69 + electric imp, incorporated - 50F958 - Huawei Device Ltd + C455C2 + Bach-Simpson - C0A36E - BSkyB Ltd + 00E8AB + Meggitt Training Systems, Inc. - 6032B1 - TP-Link Technologies Ltd + B4218A + Dog Hunter LLC - E41F7B - Cisco Systems Inc. + F0D3E7 + Sensometrix SA - 182649 - Intel Corporation + B01266 + Futaba-Kikaku - 8803E9 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 7CC8D0 + TIANJIN YAAN TECHNOLOGY CO., LTD. - 345840 - Huawei Technologies Ltd + 88E917 + Tamaggo - 5C647A - Huawei Technologies Ltd + 909DE0 + Newland Design + Assoc. Inc. - BC7F7B - Huawei Device Ltd + 985E1B + ConversDigital Co., Ltd. - F0FAC7 - Huawei Device Ltd + 60D1AA + Vishal Telecommunications Pvt Ltd - DCEF80 - Huawei Technologies Ltd + 709BA5 + Shenzhen Y&D Electronics Co.,LTD. - B46F2D - Wahoo Fitness + B48910 + Coster T.E. S.P.A. - 5C857E - IEEE Registration Authority + B0C83F + Jiangsu Cynray IOT Co., Ltd. - 846B48 - Shenzhen EepuLink Ltd + 3CF392 + Virtualtek. Co. Ltd - B460ED - Beijing Xiaomi Mobile Software Ltd + 149FE8 + Lenovo Mobile Communication Technology Ltd. - 30CC21 - ZTE Corporation + BCD940 + ASR Co,.Ltd. - 646C80 - Chongqing Fugui Electronics Ltd + 68B43A + WaterFurnace International, Inc. - 089E01 - Quanta Computer Inc. + 4C7897 + Arrowhead Alarm Products Ltd - A81E84 - Quanta Computer Inc. + 44E8A5 + Myreka Technologies Sdn. Bhd. - C01850 - Quanta Computer Inc. + B482C5 + Relay2, Inc. - 4427F3 - 70mai Ltd + D8AFF1 + Panasonic Appliances Company - 047D7B - Quanta Computer Inc. + 2C6289 + Regenersis (Glenrothes) Ltd - 0025DC - Sumitomo Electric Industries Ltd + 58ECE1 + Newport Corporation - D4F337 - Xunison Ltd + 4C09B4 + zte corporation - 48A2B8 - Chengdu Vision-Zenith Tech Ltd + 58CF4B + Lufkin Industries - C0B8E6 - Ruijie Networks Ltd + 388AB7 + ITC Networks - 8C941F - Cisco Systems Inc. + D48CB5 + Cisco Systems, Inc - 687DB4 - Cisco Systems Inc. + A865B2 + DONGGUAN YISHANG ELECTRONIC TECHNOLOGY CO., LIMITED - 58E873 - HANGZHOU DANGBEI NETWORK TECH Ltd + E8D0FA + MKS Instruments Deutschland GmbH - B030C8 - Teal Drones Inc. + 98262A + Applied Research Associates, Inc - DC41A9 - Intel Corporation + 3C9174 + ALONG COMMUNICATION TECHNOLOGY - 088F2C - Amber Technology Ltd + DC37D2 + Hunan HKT Electronic Technology Co., Ltd - A83512 - Huawei Device Ltd + 549D85 + EnerAccess inc - 90F644 - Huawei Device Ltd + B0750C + QA Cafe - 44AF28 - Intel Corporation + B4E1EB + Private - 9C9D7E - Beijing Xiaomi Mobile Software Ltd + ECD19A + Zhuhai Liming Industries Co., Ltd - 7412B3 - Chongqing Fugui Electronics Ltd + 348137 + UNICARD SA - 9447B0 - Beijing Eswin Computing Technology Ltd + 38B12D + Sonotronic Nagel GmbH - A0681C - GD Midea Air-Conditioning Equipment Ltd + ACEE3B + 6harmonics Inc - 6C442A - Huawei Technologies Ltd + A06D09 + Intelcan Technosystems Inc. - A47CC9 - Huawei Technologies Ltd + 60F3DA + Logic Way GmbH - C40D96 - Huawei Technologies Ltd + 3C363D + Nokia Corporation - F85C7D - Shenzhen Honesty Electronics Ltd + 808698 + Netronics Technologies Inc. - 84225E - Shenzhen Technewchip Technology Ltd + 1C6BCA + Mitsunami Co., Ltd. - E45AD4 - Eltex Enterprise Ltd + E83EFB + GEODESIC LTD. - 842AFD - HP Inc. + 642400 + Xorcom Ltd. - 1CFE2B - Amazon Technologies Inc. + 9CE10E + NCTech Ltd - CC483A - Dell Inc. + 407074 + Life Technology (China) Co., Ltd - A4AE12 - Hon Hai Precision Ind Ltd + 20F002 + MTData Developments Pty. Ltd. - DCA3A2 - Feng mi(Beijing)technology Ltd + FC5090 + SIMEX Sp. z o.o. - 7C25DA - FN-Link Technology Limited + 60B982 + RO.VE.R. Laboratories S.p.A. - A8698C - Oracle Corporation + B46238 + Exablox - EC570D - AFE Inc. + C8BBD3 + Embrane - A4AC0F - Huawei Device Ltd + 1CF4CA + Private - CCFF90 - Huawei Device Ltd + B4A4B5 + Zen Eye Co.,Ltd - 5405DB - LCFC(HeFei) Electronics Technology Ltd + BCC23A + Thomson Video Networks - D4D51B - Huawei Technologies Ltd + ACC2EC + CLT INT'L IND. CORP. - 2491BB - Huawei Technologies Ltd + 3C9F81 + Shenzhen CATIC Bit Communications Technology Co.,Ltd - 645E10 - Huawei Technologies Ltd + 445F7A + Shihlin Electric & Engineering Corp. - ECF22B - Tecno Mobile Limited + 141A51 + Treetech Sistemas Digitais - E45F01 - Raspberry Pi Trading Ltd + A47C14 + ChargeStorm AB - 44A54E - Qorvo International Pte Ltd + 8020AF + Trade FIDES, a.s. - C8E600 - Huawei Technologies Ltd + 3CB87A + Private - 30578E - eero Inc. + 002D76 + TITECH GmbH - 003054 - Castlenet Technology Inc. + 8C604F + Cisco Systems, Inc - C816DA - Realme Chongqing Mobile Telecommunications Corp Ltd + A4B980 + Parking BOXX Inc. - B04414 - New H3C Technologies Ltd + 2C750F + Shanghai Dongzhou-Lawton Communication Technology Co. Ltd. - 484BD4 - Technicolor CH USA Inc. + 5C5015 + Cisco Systems, Inc - 309610 - Huawei Device Ltd + 088F2C + Amber Technology Ltd. - 784558 - Ubiquiti Networks Inc. + 441319 + WKK TECHNOLOGY LTD. - 64F947 - Senscomm Semiconductor Ltd + 980284 + Theobroma Systems GmbH - DC00B0 - Freebox SAS + 1CD40C + Kriwan Industrie-Elektronik GmbH - 707414 - Murata Manufacturing Ltd + F8DB4C + PNY Technologies, INC. - A0764E - Espressif Inc. + 0C9D56 + Consort Controls Ltd - B4FBE3 - AltoBeam (China) Inc. + 587FC8 + S2M - 10D7B0 - Sagemcom Broadband SAS + 200505 + RADMAX COMMUNICATION PRIVATE LIMITED - 445943 - ZTE Corporation + AC1461 + ATAW Co., Ltd. - 343654 - ZTE Corporation + E4C6E6 + Mophie, LLC - 748F3C - Apple + 502D1D + Nokia Corporation - 40F946 - Apple + F48E09 + Nokia Corporation - 6C09BF - Fiberhome Telecommunication Technologies Ltd + 5848C0 + COFLEC - FC6DD1 - APRESIA Systems Ltd + 844915 + vArmour Networks, Inc. - 80C955 - Redpine Signals Inc. + C84544 + Asia Pacific CIS (Wuxi) Co, Ltd - CC4F5C - IEEE Registration Authority + 8C57FD + LVX Western - 4C6D58 - Juniper Networks + 54E63F + ShenZhen LingKeWeiEr Technology Co., Ltd. - 5CED8C - Hewlett Packard Enterprise + 20FABB + Cambridge Executive Limited - 30D042 - Dell Inc. + C035BD + Velocytech Aps - C0C9E3 - TP-Link Technologies Ltd + 287184 + Spire Payments - F88C21 - TP-Link Technologies Ltd + 7CB03E + OSRAM GmbH - C4278C - Huawei Device Ltd + E0EF25 + Lintes Technology Co., Ltd. - 808FE8 - Intelbras + B01C91 + Elim Co - 7C73EB - Huawei Device Ltd + 2CBE97 + Ingenieurbuero Bickele und Buehler GmbH - E48F1D - Huawei Device Ltd + 50ED94 + EGATEL SL - FCCD2F - IEEE Registration Authority + 18B591 + I-Storm - 94B271 - Huawei Technologies Ltd + 04F17D + Tarana Wireless - 78058C - mMax Communications Inc. + BC8B55 + NPP ELIKS America Inc. DBA T&M Atlantic - C4A72B - Shenzhen Chuangwei-RGB Electronics Ltd + C0493D + MAITRISE TECHNOLOGIQUE - CCF55F - E Focus Instruments India Private Limited + A849A5 + Lisantech Co., Ltd. - D0C31E - JUNGJIN Electronics Ltd + A05E6B + MELPER Co., Ltd. - 141333 - Azurewave Technologies Inc. + D878E5 + KUHN SA - A4178B - Huawei Technologies Ltd + D824BD + Cisco Systems, Inc - 5C3400 - Hisense Electric Ltd + 28CD1C + Espotel Oy - 4C3BDF - Microsoft Corporation + D443A8 + Changzhou Haojie Electric Co., Ltd. - 087C39 - Amazon Technologies Inc. + BCE59F + WATERWORLD Technology Co.,LTD - D810CB - Andrea Informatique + C467B5 + Libratone A/S - FC1928 - Actions Microelectronics Ltd + 4C3910 + Newtek Electronics co., Ltd. - 3CD2E5 - New H3C Technologies Ltd + AC0DFE + Ekon GmbH - myGEKKO - B098BC - Huawei Device Ltd + FC5B26 + MikroBits - 24016F - Huawei Device Ltd + 40F407 + Nintendo Co., Ltd. - D05919 - ZTE Corporation + 900A3A + PSG Plastic Service GmbH - E0913C - Kyeungin CNS Ltd + DC3C2E + Manufacturing System Insights, Inc. - 00B881 - New platforms LLC + 903AA0 + Nokia - 001B2E - Sinkyo Electron Inc + B06CBF + 3ality Digital Systems GmbH - C43772 - Virtuozzo International GmbH + F83553 + Magenta Research Ltd. - CC3B27 - Tecno Mobile Limited + F4044C + ValenceTech Limited - 0858A5 - Beijing Vrv Software Corpoaration Limited. + 3497FB + ADVANCED RF TECHNOLOGIES INC - 983F60 - Huawei Technologies Ltd + 7041B7 + Edwards Lifesciences LLC - C03FDD - Huawei Technologies Ltd + DCA8CF + New Spin Golf, LLC. - 303235 - Qingdao Intelligent & Precise Electronics Ltd + F03A55 + Omega Elektronik AS - E0E2E6 - Espressif Inc. + 98BC57 + SVA TECHNOLOGIES CO.LTD - 9C7370 - Huawei Technologies Ltd + 48A22D + Shenzhen Huaxuchang Telecom Technology Co.,Ltd - 582429 - Google Inc. + C86000 + ASUSTek COMPUTER INC. - E80AEC - Jiangsu Hengtong Optic-Electric Ltd + 70A66A + Prox Dynamics AS - C4DE7B - Huawei Device Ltd + DC3E51 + Solberg & Andersen AS - 7CC294 - Beijing Xiaomi Mobile Software Ltd + 843611 + hyungseul publishing networks - 40D4BD - SK Networks Service Ltd + 3440B5 + IBM - 68D48B - Hailo Technologies Ltd + 644BF0 + CalDigit, Inc - 6C1A75 - Huawei Device Ltd + F0620D + Shenzhen Egreat Tech Corp.,Ltd - 6C7637 - Huawei Device Ltd + 2C67FB + ShenZhen Zhengjili Electronics Co., LTD - 18EE86 - Novatel Wireless Solutions Inc. + EC63E5 + ePBoard Design LLC - A09F10 - Shenzhen Bilian Electronic Ltd + 94DB49 + SITCORP - 201B88 - Dongguan Liesheng Electronic Ltd + 3CE5B4 + KIDASEN INDUSTRIA E COMERCIO DE ANTENAS LTDA - 249493 - FibRSol Global Network Limited + 08D09F + Cisco Systems, Inc - 28D044 - Shenzhen Xinyin technology Company + D4D748 + Cisco Systems, Inc - A8407D - GD Midea Air-Conditioning Equipment Ltd + 344F69 + EKINOPS SAS - FC4B57 - Peerless Instrument Division Of Curtiss-Wright + F8313E + endeavour GmbH - 5C10C5 - Samsung Electronics Ltd + 143605 + Nokia Corporation - E8EB34 - Cisco Systems Inc. + C81AFE + DLOGIC GmbH - 5860D8 - ARRIS Group Inc. + 54D0ED + AXIM Communications - 9C9AC0 - LEGO System A/S + 2C002C + UNOWHY - 3CBDC5 - Arcadyan Corporation + 64ED62 + WOORI SYSTEMS Co., Ltd - A8DA0C - Servercom (India) Private Limited + 5CC9D3 + PALLADIUM ENERGY ELETRONICA DA AMAZONIA LTDA - F85329 - Huawei Technologies Ltd + B4944E + WeTelecom Co., Ltd. - 50A5DC - ARRIS Group Inc. + E00B28 + Inovonics - 74B7B3 - Shenzhen YOUHUA Technology Ltd + 000830 + Cisco Systems, Inc - 8815C5 - Huawei Device Ltd + C4EEAE + VSS Monitoring - B41BB0 - Apple + F8D3A9 + AXAN Networks - 58D349 - Apple + CC6BF1 + Sound Masking Inc. - F434F0 - Apple + 18E80F + Viking Electronics Inc. - B08C75 - Apple + 2C9717 + I.C.Y. B.V. - A4AAFE - Huawei Device Ltd + 988217 + Disruptive Ltd - F83B7E - Huawei Device Ltd + C87CBC + Valink Co., Ltd. - 9C28B3 - Apple + B81413 + Keen High Holding(HK) Ltd. - A07817 - Apple + 48022A + B-Link Electronic Limited - 5C8730 - Apple + 345B11 + EVI HEAT AB - DC9BD6 - TCT mobile Ltd + 78BAD0 + Shinybow Technology Co. Ltd. - 7040FF - Huawei Device Ltd + 0C5A19 + Axtion Sdn Bhd - 34D693 - Huawei Device Ltd + A8BD1A + Honey Bee (Hong Kong) Limited - E01FED - Nokia Shanghai Bell Ltd + 2C3F38 + Cisco Systems, Inc - 146B9A - ZTE Corporation + 4050E0 + Milton Security Group LLC - 78321B - D-Link International + 70CA9B + Cisco Systems, Inc - 04E77E - We Corporation Inc. + 9CA3BA + SAKURA Internet Inc. - 4C52EC - SOLARWATT GmbH + A078BA + Pantech Co., Ltd. - 30D941 - Raydium Semiconductor Corp. + 68BC0C + Cisco Systems, Inc - 687627 - Zhuhai Dingzhi Electronic Technology Ltd + DCB4C4 + Microsoft XCG - 200BCF - Nintendo Ltd + ACCB09 + Hefcom Metering (Pty) Ltd - 38C096 - Alpsalpine Ltd + 1866E3 + Veros Systems, Inc. - AC7A4D - Alpsalpine Ltd + 74FDA0 + Compupal (Group) Corporation - 04766E - Alpsalpine Ltd + CCB8F1 + EAGLE KINGDOM TECHNOLOGIES LIMITED - 24E4C8 - Fiberhome Telecommunication Technologies Ltd + A429B7 + bluesky - 948ED3 - Arista Networks + 48F317 + Private - 002643 - Alpsalpine Ltd + 704642 + CHYNG HONG ELECTRONIC CO., LTD. - C0F6EC - Huawei Technologies Ltd + 9C5C8D + FIREMAX INDÚSTRIA E COMÉRCIO DE PRODUTOS ELETRÔNICOS LTDA - CC208C - Huawei Technologies Ltd + D4206D + HTC Corporation - 885A85 - Wistron Neweb Corporation + 7C1E52 + Microsoft - D80093 - Aurender Inc. + 24E6BA + JSC Zavod im. Kozitsky - 389052 - Huawei Technologies Ltd + CCA374 + Guangdong Guanglian Electronic Technology Co.Ltd - 408F9D - Juniper Networks + 58677F + Clare Controls Inc. - 0015E7 - Quantec Tontechnik + 406AAB + RIM - FCB3BC - Intel Corporation + 248707 + SEnergy Corporation - 18CC18 - Intel Corporation + C4C19F + National Oilwell Varco Instrumentation, Monitoring, and Optimization (NOV IMO) - C03C59 - Intel Corporation + 04888C + Eifelwerk Butler Systeme GmbH - 841B77 - Intel Corporation + CCF8F0 + Xi'an HISU Multimedia Technology Co.,Ltd. - 2CA59C - Hangzhou Hikvision Digital Technology Ltd + 30DE86 + Cedac Software S.r.l. - 34C93D - Intel Corporation + 18C451 + Tucson Embedded Systems - 6C98EB - Riverbed Technology Inc. + D41C1C + RCF S.P.A. - 001FF5 - Kongsberg Defence & Aerospace + 8C8A6E + ESTUN AUTOMATION TECHNOLOY CO., LTD - 74ECB2 - Amazon Technologies Inc. + BC779F + SBM Co., Ltd. - C86C3D - Amazon Technologies Inc. + 58920D + Kinetic Avionics Limited - C04121 - Nokia Solutions and Networks GmbH & Co. KG + B8B42E + Gionee Communication Equipment Co,Ltd.ShenZhen - 0C7C28 - Nokia Solutions and Networks GmbH & Co. KG + 443EB2 + DEOTRON Co., LTD. - 207852 - Nokia Solutions and Networks GmbH & Co. KG + D059C3 + CeraMicro Technology Corporation - 54FA96 - Nokia Solutions and Networks GmbH & Co. KG + 1C8E8E + DB Communication & Systems Co., ltd. - 7CC2C6 - TP-Link Corporation Limited + AC02EF + Comsis - 089AC7 - ZTE Corporation + B0BF99 + WIZITDONGDO - BC6D05 - Dusun Electron Ltd + 24EC99 + ASKEY COMPUTER CORP - 744CA1 - Liteon Technology Corporation + 280CB8 + Mikrosay Yazilim ve Elektronik A.S. - B4B291 - LG Electronics + 3CC99E + Huiyang Technology Co., Ltd - C0E018 - Huawei Technologies Ltd + 78BEB6 + Enhanced Vision - 5CE747 - Huawei Technologies Ltd + 2C1EEA + AERODEV - A8FFBA - Huawei Technologies Ltd + B4FC75 + SEMA Electronics(HK) CO.,LTD - AC78D1 - Juniper Networks + FC1794 + InterCreative Co., Ltd - ECBE5F - Vestel Elektronik San ve Tic. A.S. + B40B7A + Brusa Elektronik AG - A4423B - Intel Corporation + D45AB2 + Galleon Systems - 70CF49 - Intel Corporation + 182C91 + Concept Development, Inc. - 4851C5 - Intel Corporation + A44B15 + Sun Cupid Technology (HK) LTD - 20EFBD - Roku Inc. + 48C862 + Simo Wireless,Inc. - EC7CB6 - Samsung Electronics Ltd + A0165C + Triteka LTD - 58A639 - Samsung Electronics Ltd + 449CB5 + Alcomp, Inc - A4E57C - Espressif Inc. + 70B921 + Fiberhome Telecommunication Technologies Co.,LTD - 04F993 - Infinix mobility limited + 9C417C + Hame Technology Co., Limited - BCBD9E - Itel Mobile Limited + 9C6ABE + QEES ApS. - F42A7D - TP-Link Technologies Ltd + E8944C + Cogent Healthcare Systems Ltd - 8C0FC9 - Huawei Device Ltd + 9067F3 + Alcatel Lucent - 304E1B - Huawei Device Ltd + A0E295 + DAT System Co.,Ltd - 6C0309 - Cisco Systems Inc. + 40F14C + ISE Europe SPRL - BCD295 - Cisco Systems Inc. + 3826CD + ANDTEK - 74504E - New H3C Technologies Ltd + D8973B + Artesyn Embedded Technologies - F03965 - Samsung Electronics Ltd + D4F0B4 + Napco Security Technologies - FCB662 - IC Holdings LLC + 9C934E + Xerox Corporation - 502DFB - IGShare Ltd + 68F895 + Redflow Limited - 40EE15 - Zioncom Electronics (Shenzhen) Ltd + 2C8BF2 + Hitachi Metals America Ltd - 00F361 - Amazon Technologies Inc. + 900917 + Far-sighted mobile - 6C0DE1 - Dongguan Cannice Precision Manufacturing Ltd + 044665 + Murata Manufacturing Co., Ltd. - 606C63 - Hitron Technologies Inc. + 58E476 + CENTRON COMMUNICATIONS TECHNOLOGIES FUJIAN CO.,LTD - E8D765 - Huawei Technologies Ltd + 447E95 + Alpha and Omega, Inc - E45E1B - Google Inc. + F4A52A + Hawa Technologies Inc - C430CA - SD Biosensor + E8B748 + Cisco Systems, Inc - D4A651 - Tuya Smart Inc. + 0C6E4F + PrimeVOLT Co., Ltd. - 28052E - Dematic Corp + 986022 + EMW Co., Ltd. - 88C3E5 - Betop Techonologies + BC99BC + FonSee Technology Inc. - E428A4 - Prama India Private Limited + 783F15 + EasySYNC Ltd. - 943A91 - Amazon Technologies Inc. + 18D071 + DASAN CO., LTD. - 408C1F - Guangdong Oppo Mobile Telecommunications Corp Ltd + 24CBE7 + MYK, Inc. - 2C3F0B - Cisco Meraki + B0A10A + Pivotal Systems Corporation - 80C501 - OctoGate IT Security Systems GmbH + 802DE1 + Solarbridge Technologies - 04F03E - Huawei Device Ltd + B8D49D + M Seven System Ltd. - 78E22C - Huawei Device Ltd + 88BFD5 + Simple Audio Ltd - C0D026 - Huawei Device Ltd + 3C672C + Sciovid Inc. - 14D19E - Apple + 147411 + RIM - 40C711 - Apple + F8A9DE + PUISSANCE PLUS - 5C7017 - Apple + B8871E + Good Mind Industries Co., Ltd. - 8CEC7B - Apple + D4F027 + Trust Power Ltd. - 002DB3 - AMPAK Technology,Inc. + DC9B1E + Intercom, Inc. - 3CC786 - Dongguan Huarong Communication Technologies Ltd + BC5FF4 + ASRock Incorporation - 28C87C - ZTE Corporation + E8B4AE + Shenzhen C&D Electronics Co.,Ltd - 145051 - Sharp Corporation + CCC62B + Tri-Systems Corporation - C4D0E3 - Intel Corporation + D8C068 + Netgenetech.co.,ltd. - E4FD45 - Intel Corporation + 601199 + Siama Systems Inc - 184CAE - Continental + A88CEE + MicroMade Galka i Drozdz sp.j. - 98387D - Itronic Technology Co Ltd + C027B9 + Beijing National Railway Research & Design Institute of Signal & Communication Co., Ltd. - C8D884 - Universal Electronics Inc. + B0BDA1 + ZAKLAD ELEKTRONICZNY SIMS - B4A25C - Cambium Networks Limited + 70B265 + Hiltron s.r.l. - 2C71FF - Amazon Technologies Inc. + 781DFD + Jabil Inc - ACD618 - OnePlus Technology (Shenzhen) Ltd + 18AEBB + Siemens Convergence Creators GmbH&Co.KG - 6C5640 - BLU Products Inc + 50FAAB + L-tek d.o.o. - 48785E - Amazon Technologies Inc. + 3891FB + Xenox Holding BV - 20C74F - SensorPush + A8E018 + Nokia Corporation - 482952 - Sagemcom Broadband SAS + 0455CA + BriView (Xiamen) Corp. - A47E36 - EM Microelectronic + AC932F + Nokia Corporation - B05DD4 - ARRIS Group Inc. + ACCABA + Midokura Co., Ltd. - 24E853 - LG Innotek + 0C8112 + Private - 307C4A - Huawei Device Ltd + 9C95F8 + SmartDoor Systems, LLC - 2CCE1E - Cloudtronics Pty Ltd + F43E9D + Benu Networks, Inc. - F021E0 - eero Inc. + 64094C + Beijing Superbee Wireless Technology Co.,Ltd - 9CDBCB - Wuhan Funshion Online Technologies Ltd + 64D1A3 + Sitecom Europe BV - 641759 - Intellivision Holdings LLC + DC2B66 + InfoBLOCK S.A. de C.V. - 504348 - ThingsMatrix Inc. + 6C81FE + Mitsuba Corporation - D85982 - Huawei Technologies Ltd + 04E2F8 + AEP Ticketing solutions srl - 48B25D - Huawei Technologies Ltd + EC9ECD + Artesyn Embedded Technologies - A41B34 - China Mobile Group Device Ltd + 8C5105 + Shenzhen ireadygo Information Technology CO.,LTD. - 8045DD - Intel Corporation + C8208E + Storagedata - C0D46B - Huawei Device Ltd + 2872F0 + ATHENA - 9C9567 - Huawei Device Ltd + 1C19DE + eyevis GmbH - 58AEF1 - Fiberhome Telecommunication Technologies Ltd + 9C807D + SYSCABLE Korea Inc. - A47B1A - Huawei Device Ltd + 743889 + ANNAX Anzeigesysteme GmbH - 147D05 - Sercomm Philippines Inc + 44D2CA + Anvia TV Oy - 787A6F - Juice Technology AG + 386E21 + Wasion Group Ltd. - E86CC7 - IEEE Registration Authority + 609E64 + Vivonic GmbH - 4024B2 - Sichuan AI-Link Technology Ltd + 34B571 + PLDS - 640D22 - LG Electronics (Mobile Communications) + 3C7437 + RIM - 20A7F9 - Shenzhen Olanboa Technology Ltd + EC9233 + Eddyfi NDT Inc - C006C3 - TP-Link Corporation Limited + BC15A6 + Taiwan Jantek Electronics,Ltd. - 3C1512 - Shenzhen Huanhu Technology Ltd + DCDECA + Akyllor - 8C31E2 - Dayouplus + A0AAFD + EraThink Technologies Corp. - 10394E - Hisense broadband multimedia technology Ltd + 7C7D41 + Jinmuyu Electronics Co., Ltd. - D8D5B9 - Rainforest Automation Inc. + 4C1480 + NOREGON SYSTEMS, INC - 04BA1C - Huawei Device Ltd + A4856B + Q Electronics Ltd - 7C3D2B - Huawei Device Ltd + 20D5AB + Korea Infocom Co.,Ltd. - 18C241 - SonicWall + 0CF3EE + EM Microelectronic - 58454C - Ericsson AB + B08991 + LGE - FC4DA6 - Huawei Technologies Ltd + 30142D + Piciorgros GmbH - B414E6 - Huawei Technologies Ltd + 50AF73 + Shenzhen Bitland Information Technology Co., Ltd. - AC9929 - Huawei Technologies Ltd + 6CA906 + Telefield Ltd - 184859 - Castlenet Technology Inc. + 78223D + Affirmed Networks - 14517E - New H3C Technologies Ltd + 3C02B1 + Creation Technologies LP - 083A38 - New H3C Technologies Ltd + E441E6 + Ottec Technology GmbH - 70F088 - Nintendo Ltd + 48DF1C + Wuhan NEC Fibre Optic Communications industry Co. Ltd - 842388 - Ruckus Wireless + BC71C1 + XTrillion, Inc. - F4C7AA - Marvell Semiconductors + E0E8E8 + Olive Telecommunication Pvt. Ltd - F8ABE5 - Shenzhen worldelite electronics Ltd + D49C8E + University of FUKUI - E0DBD1 - Technicolor CH USA Inc. + 60DA23 + Estech Co.,Ltd - CCED21 - Nokia Shanghai Bell Ltd + 44DCCB + SEMINDIA SYSTEMS PVT LTD - 10D561 - Tuya Smart Inc. + 5C9AD8 + FUJITSU LIMITED - 001A86 - New Wave Design & Verification + A4C0E1 + Nintendo Co., Ltd. - 509A46 - Safetrust Inc + 4C3B74 + VOGTEC(H.K.) Co., Ltd - D0CFD8 - Huizhou Boshijie Technology Ltd + 684352 + Bhuu Limited - 84C78F - APS Networks GmbH - - - F0A3B2 - Hui Zhou Gaoshengda Technology Ltd + F8F014 + RackWare Inc. - 08BB3C - Flextronics Tech.(Ind) Pvt Ltd + 2826A6 + PBR electronics GmbH - 2CBEEB - Nothing Technology Limited + B428F1 + E-Prime Co., Ltd. - F04A02 - Cisco Systems Inc. + AC2FA8 + Humannix Co.,Ltd. - 7409AC - Quext LLC + A83944 + Actiontec Electronics, Inc - F0016E - Tianyi Telecom Terminals Company Limited + 74E06E + Ergophone GmbH - EC0BAE - Hangzhou BroadLink Technology Ltd + ECE90B + SISTEMA SOLUCOES ELETRONICAS LTDA - EASYTECH - 802511 - Itel Mobile Limited + A08C9B + Xtreme Technologies Corp - E8A660 - Huawei Technologies Ltd + 0CF0B4 + Globalsat International Technology Ltd - CC242E - Shenzhen SuperElectron Technology Ltd + 6052D0 + FACTS Engineering - 082FE9 - Huawei Technologies Ltd + 64E8E6 + global moisture management system - 984874 - Huawei Technologies Ltd + 34A183 + AWare, Inc - 1CA681 - Huawei Technologies Ltd + 9873C4 + Sage Electronic Engineering LLC - B881FA - Apple + B40142 + GCI Science & Technology Co.,LTD - 9C760E - Apple + 740ABC + LightwaveRF Technology Ltd - 94EA32 - Apple + 304EC3 + Tianjin Techua Technology Co., Ltd. - C8BFFE - Huawei Device Ltd + B4CFDB + Shenzhen Jiuzhou Electric Co.,LTD - 082E36 - Huawei Device Ltd + 5C6A7D + KENTKART EGE ELEKTRONIK SAN. VE TIC. LTD. STI. - 50F4EB - Apple + FCD4F2 + The Coca Cola Company - 28C709 - Apple + 1064E2 + ADFweb.com s.r.l. - 3802DE - Sercomm Corporation. + CC34D7 + GEWISS S.P.A. - 5C625A - Canon Inc. + F02A61 + Waldo Networks, Inc. - 7C0A3F - Samsung Electronics Ltd + C8A70A + Verizon Business - 08AA89 - ZTE Corporation + C01242 + Alpha Security Products - A4352D - TRIZ Networks Corp. + BC20BA + Inspur (Shandong) Electronic Information Co., Ltd - 04D60E - Funai Electric Ltd + 1CFEA7 + IDentytech Solutins Ltd. - 049F81 - Netscout Systems Inc + AC8112 + Gemtek Technology Co., Ltd. - 00808C - Netscout Systems Inc + 686359 + Advanced Digital Broadcast SA - 001F92 - Motorola Solutions Inc. + CCD811 + Aiconn Technology Corporation - 0023BB - Accretech SBS Inc. + 44599F + Criticare Systems, Inc - B0C952 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 3C2F3A + SFORZATO Corp. - F4419E - Huawei Device Ltd + 18922C + Virtual Instruments - 90F9B7 - Huawei Technologies Ltd + 28061E + NINGBO GLOBAL USEFUL ELECTRIC CO.,LTD - F44588 - Huawei Technologies Ltd + A0DE05 + JSC Irbis-T - C8BB81 - Huawei Device Ltd + 0817F4 + IBM Corp - 1C472F - Huawei Device Ltd + 74CE56 + Packet Force Technology Limited Company - 205E64 - Huawei Device Ltd + ECBBAE + Digivoice Tecnologia em Eletronica Ltda - 60577D - eero Inc. + C44B44 + Omniprint Inc. - C8138B - Shenzhen Skyworth Digital Technology Ltd + F43814 + Shanghai Howell Electronic Co.,Ltd - 78F235 - Sichuan AI-Link Technology Ltd + 90610C + Fida International (S) Pte Ltd - F44EE3 - Intel Corporation + 3C5F01 + Synerchip Co., Ltd. - D0E042 - Cisco Systems Inc. + 10A13B + FUJIKURA RUBBER LTD. - 3C3712 - AVM Audiovisuelles Marketing und Computersysteme GmbH + F4E142 + Delta Elektronika BV - 80B655 - Intel Corporation + E0D10A + Katoudenkikougyousyo co ltd - 0CCB0C - iSYS RTS GmbH + 48C8B6 + SysTec GmbH - 4456E2 - Sichuan Tianyi Comheart Telecom Ltd + 3C6278 + SHENZHEN JETNET TECHNOLOGY CO.,LTD. - 54AED2 - CSL Dualcom Ltd + D43D67 + Carma Industries Inc. - F46FA4 - Physik Instrumente GmbH & Co. KG + C8D5FE + Shenzhen Zowee Technology Co., Ltd - C47469 - BT9 + 2C3068 + Pantech Co.,Ltd - 645D92 - Sichuan Tianyi Comheart Telecom Ltd + 00BD27 + Exar Corp. - 9C6121 - Sichuan Tianyi Comheart Telecom Ltd + 5C4058 + Jefferson Audio Video Systems, Inc. - E04FBD - Sichuan Tianyi Comheart Telecom Ltd + 58D08F + IEEE 1904.1 Working Group - 40F420 - Sichuan Tianyi Comheart Telecom Ltd + CC09C8 + IMAQLIQ LTD - CCA260 - Sichuan Tianyi Comheart Telecom Ltd + 9C4563 + DIMEP Sistemas - ACE77B - Sichuan Tianyi Comheart Telecom Ltd + E446BD + C&C TECHNIC TAIWAN CO., LTD. - 4CD3AF - HMD Global Oy + 8CDD8D + Wifly-City System Inc. - C85142 - Samsung Electronics Ltd + 20A2E7 + Lee-Dickens Ltd - CC0DE7 - B Meters S.R.L. + FCEDB9 + Arrayent - 5CA176 - Sichuan Tianyi Comheart Telecom Ltd + 44ED57 + Longicorn, inc. - 10E4C2 - Samsung Electronics Ltd + EC98C1 + Beijing Risbo Network Technology Co.,Ltd - 0C8DCA - Samsung Electronics Ltd + D4A928 + GreenWave Reality Inc - 582FF7 - Sagemcom Broadband SAS + E06290 + Jinan Jovision Science & Technology Co., Ltd. - 8CFD15 - Imagine Marketing Private Limited + 100E2B + NEC CASIO Mobile Communications - ACD829 - Bouffalo Lab (Nanjing) Ltd + C46354 + U-Raku, Inc. - 683A48 - SAMJIN Ltd + 405FBE + RIM - B027CF - Extreme Networks Inc. + 58DB8D + Fast Co., Ltd. - 14223B - Google Inc. + 38A95F + Actifio Inc - 48F8FF - Chengdu KT Electronic HI-Tech Ltd + F4DCDA + Zhuhai Jiahe Communication Technology Co., limited - E8C1E8 - Shenzhen Xiao Bi En Culture Education Technology Ltd + E80462 + Cisco Systems, Inc - 2CDDE9 - Arista Networks + DCD0F7 + Bentek Systems Ltd. - 709741 - Arcadyan Corporation + 7CB542 + ACES Technology - C4FF22 - Huawei Device Ltd + 905446 + TES ELECTRONIC SOLUTIONS - A0A0DC - Huawei Device Ltd + 544A05 + wenglor sensoric gmbh - C4808A - Cloud Diagnostics Canada ULC + 6C9CE9 + Nimble Storage - E408E7 - Quectel Wireless Solutions Ltd + A49B13 + Digital Check - 7C70DB - Intel Corporation + C8EE08 + TANGTOP TECHNOLOGY CO.,LTD - 8C94CC - SFR + 70E139 + 3view Ltd - 60B6E1 - Texas Instruments + 18422F + Alcatel Lucent - 6C79B8 - Texas Instruments + 6854F5 + enLighted Inc - A4D094 - Vivavis AG + 7472F2 + Chipsip Technology Co., Ltd. - 8CA399 - Servercom (India) Private Limited + E0A670 + Nokia Corporation - 60DB15 - New H3C Technologies Ltd + 0CD696 + Amimon Ltd - 5CA721 - New H3C Technologies Ltd + F4DC4D + Beijing CCD Digital Technology Co., Ltd - 98F217 - Castlenet Technology Inc. + 4013D9 + Global ES - 908060 - Nilfisk A/S + AC4FFC + SVS-VISTEK GmbH - 70A6CC - Intel Corporation + B43741 + Consert, Inc. - 6C433C - Tecno Mobile Limited + 94857A + Evantage Industries Corp - 445BED - Aruba Networks HP + 24AF54 + NEXGEN Mediatech Inc. - 84EBEF - Cisco Systems Inc. + 98E165 + Accutome - D03E7D - Chipsea Technologies (Shenzhen) Corp. + 785712 + Mobile Integration Workgroup - 906976 - Withrobot Inc. + 380A0A + Sky-City Communication and Electronics Limited Company - FC9257 - Renesas Electronics (Penang) Sdn. Bhd. + DC4EDE + SHINYEI TECHNOLOGY CO., LTD. - 60A5E2 - Intel Corporation + F0F842 + KEEBOX, Inc. - A42A71 - Sichuan Tianyi Comheart Telecom Ltd + 4083DE + Zebra Technologies Inc - D4548B - Intel Corporation + 8897DF + Entrypass Corporation Sdn. Bhd. - 1009F9 - Amazon Technologies Inc. + E087B1 + Nata-Info Ltd. - D01E1D - SaiNXT Technologies LLP + F0AD4E + Globalscale Technologies, Inc. - 584D42 - Dragos Inc. + 08FAE0 + Fohhn Audio AG - 608A10 - Microchip Technology Inc. + 903D5A + Shenzhen Wision Technology Holding Limited - A82316 - Nokia + 447C7F + Innolight Technology Corporation - 38E39F - Motorola Mobility LLC, a Lenovo Company + 5C864A + Secret Labs LLC - 446752 - Wistron InfOCOMM (Zhongshan) CoRPORATION + D496DF + SUNGJIN C&T CO.,LTD - 78BB88 - Maxio Technology (Hangzhou) Ltd + 58B9E1 + Crystalfontz America, Inc. - A864F1 - Intel Corporation + 20D906 + Iota, Inc. - 106FD9 - Cloud Network Technology Singapore PTE Ltd + F45595 + HENGBAO Corporation LTD. - E06781 - Dongguan Liesheng Electronic Ltd + 180C77 + Westinghouse Electric Company, LLC - 000324 - SANYO Techno Solutions Tottori Ltd + 9C4E20 + Cisco Systems, Inc - B8AE1D - Guangzhou Xingyi Electronic Technology Ltd + 1C3A4F + AccuSpec Electronics, LLC - 3CCD57 - Beijing Xiaomi Mobile Software Ltd + 7CA29B + D.SignT GmbH & Co. KG - B8DAE8 - Huawei Device Ltd + A04041 + SAMWONFA Co.,Ltd. - 28DEA8 - ZTE Corporation + 40406B + Icomera - 808ABD - Samsung Electronics Ltd + 6C22AB + Ainsworth Game Technology - D8BE65 - Amazon Technologies Inc. + 9835B8 + Assembled Products Corporation - 60E32B - Intel Corporation + 288915 + CashGuard Sverige AB - ACEC85 - eero Inc. + 68CA00 + Octopus Systems Limited - ECA81F - Technicolor CH USA Inc. + E0589E + Laerdal Medical - C0F827 - Rapidmax Technology Corporation + 3018CF + DEOS control systems GmbH - B4527E - Sony Corporation + D87533 + Nokia Corporation - 7086CE - GD Midea Air-Conditioning Equipment Ltd + 98DCD9 + UNITEC Co., Ltd. - 307512 - Sony Corporation + C0CFA3 + Creative Electronics & Software, Inc. - C43ABE - Sony Corporation + 6089B7 + KAEL MÜHENDİSLİK ELEKTRONİK TİCARET SANAYİ LİMİTED ŞİRKETİ - 94CE2C - Sony Corporation + 30525A + NST Co., LTD - DC8D8A - Nokia Solutions and Networks GmbH & Co. KG + 2CA780 + True Technologies Inc. - 20E7B6 - Universal Electronics Inc. + B0E39D + CAT SYSTEM CO.,LTD. - 500F59 - STMicrolectronics International NV + 7C2E0D + Blackmagic Design - E42AAC - Microsoft Corporation + 5CE286 + Nortel Networks - D43DF3 - ZyXEL Communications Corp + 8C640B + Beyond Devices d.o.o. - 20579E - Hunan FN-Link Technology Limited + FCE192 + Sichuan Jinwangtong Electronic Science&Technology Co,.Ltd - 001E45 - Sony Corporation + 949C55 + Alta Data Technologies - 000E07 - Sony Corporation + D479C3 + Cameronet GmbH & Co. KG - 000AD9 - Sony Corporation + 0C1DC2 + SeAH Networks - 0023F1 - Sony Corporation + 4C5DCD + Oy Finnish Electric Vehicle Technologies Ltd - 001A75 - Sony Corporation + 70D57E + Scalar Corporation - 001CA4 - Sony Corporation + 5475D0 + Cisco Systems, Inc - 245E48 - Apple + 7C6F06 + Caterpillar Trimble Control Technologies - 08C729 - Apple + 70D5E7 + Wellcore Corporation - C884CF - Huawei Technologies Ltd + 3CF72A + Nokia Corporation - 806A10 - Whisker Labs - Ting + 545FA9 + Teracom Limited - E023D7 - Sleep Number + 408A9A + TITENG CO., Ltd. - C4C36B - Apple + F445ED + Portable Innovation Technology Ltd. - 241D48 - Sichuan Tianyi Comheart Telecom Ltd + 6C32DE + Indieon Technologies Pvt. Ltd. - 287777 - ZTE Corporation + 601283 + TSB REAL TIME LOCATION SYSTEMS S.L. - 00919E - Intel Corporation + 547FEE + Cisco Systems, Inc - 64DCDE - ZheJiang FuChunJiang Information Technology Ltd + ACEA6A + GENIX INFOCOMM CO., LTD. - 0CE159 - Shenzhen iStartek Technology Ltd + A8F470 + Fujian Newland Communication Science Technologies Co.,Ltd. - E8A730 - Apple + 8C736E + FUJITSU LIMITED - 6006E3 - Apple + E0BC43 + C2 Microsystems, Inc. - A029BD - Team Group Inc + 94236E + Shenzhen Junlan Electronic Ltd - 98B177 - Landis + GYR + 10E6AE + Source Technologies, LLC - 50F908 - Wizardlab Ltd + 2CA835 + RIM - 50C2E8 - Cloud Network Technology Singapore PTE Ltd + C41ECE + HMI Sources Ltd. - 3009C0 - Motorola Mobility LLC, a Lenovo Company + 14A62C + S.M. Dezac S.A. - FC2E19 - China Mobile Group Device Ltd + 50F003 + Open Stack, Inc. - 701AD5 - Openpath Security Inc. + DC49C9 + CASCO SIGNAL LTD - 000E82 - Infinity Tech + 70D880 + Upos System sp. z o.o. - F0B61E - Intel Corporation + A05DC1 + TMCT Co., LTD. - C84D44 - Shenzhen Jiapeng Huaxiang Technology Ltd + B86491 + CK Telecom Ltd - B04692 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 583CC6 + Omneality Ltd. - AC764C - Guangdong Oppo Mobile Telecommunications Corp Ltd + B0C8AD + People Power Company - 5C58E6 - Palo Alto Networks + 181714 + DAEWOOIS - EC94CB - Espressif Inc. + F0EC39 + Essec - 40406B - Icomera + 04FE7F + Cisco Systems, Inc - EC97E0 - Hangzhou Ezviz Software Ltd + EC4476 + Cisco Systems, Inc - D0B66F - Sernet (Suzhou) Technologies Corporation + 487119 + SGB GROUP LTD. - 7CFD6B - Xiaomi Communications Ltd + 681FD8 + Siemens Industry, Inc. - 188740 - Xiaomi Communications Ltd + A8995C + aizo ag - 341CF0 - Xiaomi Communications Ltd + 4012E4 + Compass-EOS - 2C3A91 - Huawei Device Ltd + 446C24 + Reallin Electronic Co.,Ltd - 64F705 - Huawei Device Ltd + 2046F9 + Advanced Network Devices (dba:AND) - 606EE8 - Xiaomi Communications Ltd + A4B1EE + H. ZANDER GmbH & Co. KG - F05ECD - Texas Instruments + 842141 + Shenzhen Ginwave Technologies Ltd. - F83869 - LG Electronics + A0231B + TeleComp R&D Corp. - 0016E8 - Lumissil Microsystems + B8A3E0 + BenRui Technology Co.,Ltd - 60CE41 - Huawei Technologies Ltd + 3CF52C + DSPECIALISTS GmbH - 281709 - Huawei Technologies Ltd + 6C1811 + Decatur Electronics - 5CDFB8 - Shenzhen Unionmemory Information System Limited + F8E968 + Egker Kft. - E00AF6 - Liteon Technology Corporation + 5403F5 + EBN Technology Corp. - B40ECF - Bouffalo Lab (Nanjing) Ltd + 8038FD + LeapFrog Enterprises, Inc. - E0C58F - China Mobile IOT Company Limited + ACBEB6 + Visualedge Technology Co., Ltd. - 2C0547 - Shenzhen Phaten Tech Ltd + 2C9127 + Eintechno Corporation - 2C1A05 - Cisco Systems Inc. + 5C1437 + Thyssenkrupp Aufzugswerke GmbH - 9C50D1 - Murata Manufacturing Ltd + 9C55B4 + I.S.E. S.r.l. - 140020 - LongSung Technology (Shanghai) Ltd + E4751E + Getinge Sterilization AB - 441793 - Espressif Inc. + 1065A3 + Panamax LLC - 00A388 - BSkyB Ltd + 4001C6 + 3COM EUROPE LTD - 503DEB - Zhejiang Tmall Technology Ltd + 9C5E73 + Calibre UK LTD - 30B930 - ZTE Corporation + 04C05B + Tigo Energy - 949869 - ZTE Corporation + AC583B + Human Assembler, Inc. - 7C66EF - Hon Hai Precision Ind Ltd + E8E776 + Shenzhen Kootion Technology Co., Ltd - 785005 - MOKO TECHNOLOGY Ltd + 50252B + Nethra Imaging Incorporated - F87FA5 - Greatek + F8811A + OVERKIZ - 18E1DE - Chengdu ChipIntelli Technology Ltd + 4C63EB + Application Solutions (Electronics and Vision) Ltd - 8CF681 - Silicon Laboratories + 702F97 + Aava Mobile Oy - 7C8437 - China Post Communications Equipment Ltd + 10CA81 + PRECIA - B84D43 - Hunan FN-Link Technology Limited + 3863F6 + 3NOD MULTIMEDIA(SHENZHEN)CO.,LTD - AC6490 - Huawei Technologies Ltd + 609F9D + CloudSwitch - A84A63 - TPV Display Technology(Xiamen) Ltd + CCCC4E + Sun Fountainhead USA. Corp - 243FAA - Huawei Device Ltd + 688540 + IGI Mobile, Inc. - D867D3 - Huawei Device Ltd + A09A5A + Time Domain - 48474B - Huawei Device Ltd + 64A837 + Juni Korea Co., Ltd - 806F1C - Huawei Device Ltd + 60F13D + JABLOCOM s.r.o. - C89F1A - Huawei Technologies Ltd + B894D2 + Retail Innovation HTT AB - D86852 - Huawei Technologies Ltd + F0C24C + Zhejiang FeiYue Digital Technology Co., Ltd - 84E342 - Tuya Smart Inc. + 40A6A4 + PassivSystems Ltd - E0A258 - Wanbang Digital Energy Ltd + 94BA31 + Visiontec da Amazônia Ltda. - 4CBCE9 - LG Innotek + 9C5B96 + NMR Corporation - 745CFA - Shenzhen Shunrui Gaojie Technology Ltd + 78B81A + INTER SALES A/S - 94A408 - Shenzhen Trolink Technology Ltd + B0E97E + Advanced Micro Peripherals - D0F865 - Itel Mobile Limited + 48343D + IEP GmbH - 385C76 - Plantronics Inc. + D4AAFF + MICRO WORLD - 7CC177 - Ingram Micro Services + 942E63 + Finsécur - 7876D9 - EXARA Group + AC8317 + Shenzhen Furtunetel Communication Co., Ltd - 84A938 - LCFC(HeFei) Electronics Technology Ltd + ACD180 + Crexendo Business Solutions, Inc. - 3C9FC3 - Beijing Sinead Technology Ltd + 202CB7 + Kong Yue Electronics & Information Industry (Xinhui) Ltd. - 608FA4 - Nokia Solutions and Networks GmbH & Co. KG + 74E537 + RADSPIN - 38FDF8 - Cisco Systems Inc. + CC0080 + BETTINI SRL - 208C47 - Tenstorrent Inc + 644BC3 + Shanghai WOASiS Telecommunications Ltd., Co. - 5C2AEF - r2p Asia-Pacific Pty Ltd + 002717 + CE Digital(Zhenjiang)Co.,Ltd - E4936A - Guangdong Oppo Mobile Telecommunications Corp Ltd + 002716 + Adachi-Syokai Co., Ltd. - 4877BD - Guangdong Oppo Mobile Telecommunications Corp Ltd + 0026E1 + Stanford University, OpenFlow Group - F856C3 - ZTE Corporation + 0026DC + Optical Systems Design - 7CFC16 - Apple + 0026EC + Legrand Home Systems, Inc - 88B945 - Apple + 0026E9 + SP Corp - 0080E7 - Leonardo UK Ltd + 0026EB + Advanced Spectrum Technology Co., Ltd. - 10321D - Huawei Technologies Ltd + 002700 + Shenzhen Siglent Technology Co., Ltd. - B0BE83 - Apple + 00267F + Oregan Networks Ltd. - DCF4CA - Apple + 00267D + A-Max Technology Macao Commercial Offshore Company Limited - 18EF3A - Sichuan AI-Link Technology Ltd + 00267C + Metz-Werke GmbH & Co KG - A0FF22 - Shenzhen Apical Technology Ltd + 002674 + Hunter Douglas - 00041B - Bridgeworks Ltd + 002673 + RICOH COMPANY,LTD. - 6CD3EE - Zimi Corporation + 00266D + MobileAccess Networks - E42805 - Pivotal Optics + 002661 + Irumtek Co., Ltd. - 5C0214 - Beijing Xiaomi Mobile Software Ltd + 00265B + Hitron Technologies. Inc - 785EA2 - Sunitec Enterprise Ltd + 002656 + Sansonic Electronics USA - 381F8D - Tuya Smart Inc. + 002658 + T-Platforms (Cyprus) Limited - 04CD15 - Silicon Laboratories + 00266F + Coordiwise Technology Corp. - A0B53C - Technicolor Delivery Technologies Belgium NV + 00266E + Nissho-denki Co.,LTD. - 700971 - Samsung Electronics Ltd + 002663 + Shenzhen Huitaiwei Tech. Ltd, co. - D01B49 - Samsung Electronics Ltd + 0026C3 + Insightek Corp. - 3429EF - Qingdao Haier Technology Ltd + 0026C1 + ARTRAY CO., LTD. - 541D61 - YEESTOR Microelectronics Ltd + 0026BE + Schoonderbeek Elektronica Systemen B.V. - 3453D2 - Sagemcom Broadband SAS + 002681 + Interspiro AB - C4BDE5 - Intel Corporation + 002683 + Ajoho Enterprise Co., Ltd. - 3035C5 - Huawei Device Ltd + 00268C + StarLeaf Ltd. - 649E31 - Beijing Xiaomi Mobile Software Ltd + 00268B + Guangzhou Escene Computer Technology Limited - F820A9 - Huawei Device Ltd + 0026A1 + Megger - 24CD8D - Murata Manufacturing Ltd + 002698 + Cisco Systems, Inc - 34AA31 - Shenzhen Skyworth Digital Technology Ltd + 00269B + SOKRAT Ltd. - 48BD4A - Huawei Technologies Ltd + 0026B5 + ICOMM Tele Ltd - A8D4E0 - Huawei Technologies Ltd + 0026D4 + IRCA SpA - A0406F - Huawei Technologies Ltd + 00264C + Shanghai DigiVision Technology Co., Ltd. - 004F1A - Huawei Technologies Ltd + 002646 + SHENYANG TONGFANG MULTIMEDIA TECHNOLOGY COMPANY LIMITED - 24698E - Shenzhen Mercury Communication Technologies Ltd + 002644 + Thomson Telecom Belgium - 7433A6 - Shenzhen SuperElectron Technology Ltd + 00263F + LIOS Technology GmbH - 2C0DA7 - Intel Corporation + 002606 + RAUMFELD GmbH - BC2CE6 - Cisco Systems Inc. + 002607 + Enabling Technology Pty Ltd - CCED4D - Cisco Systems Inc. + 002602 + SMART Temps LLC - FC5F49 - Zhejiang Dahua Technology Ltd + 002605 + CC Systems AB - 6CB0FD - Shenzhen Xinghai Iot Technology Ltd + 0025D4 + General Dynamics Mission Systems - D463DE - Vivo Mobile Communication Ltd + 0025C2 + RingBell Co.,Ltd. - A85BF7 - Aruba Networks HP + 00263B + Onbnetech - 642C0F - Vivo Mobile Communication Ltd + 002634 + Infineta Systems, Inc - 30AFCE - Vivo Mobile Communication Ltd + 00262F + HAMAMATSU TOA ELECTRONICS - DC8C1B - Vivo Mobile Communication Ltd + 0025FB + Tunstall Healthcare A/S - 0C9043 - Realme Chongqing Mobile Telecommunications Corp Ltd + 0025F4 + KoCo Connector AG - 18E777 - Vivo Mobile Communication Ltd + 0025EF + I-TEC Co., Ltd. - 6CD94C - Vivo Mobile Communication Ltd + 002631 + COMMTACT LTD - 541F8D - ZTE Corporation + 002624 + Thomson Inc. - 2CF1BB - ZTE Corporation + 00261A + Femtocomm System Technology Corp. - CC7190 - Vietnam Post AND Telecommunication Industry Technology Joint Stock Company + 0025E3 + Hanshinit Inc. - B0F7C4 - Amazon Technologies Inc. + 00259F + TechnoDigital Technologies GmbH - 18A9A6 - Nebra Ltd + 00259D + Private - 8C5646 - LG Electronics + 002598 + Zhong Shan City Litai Electronic Industrial Co. Ltd - DC2C6E - Routerboard.com + 002599 + Hedon e.d. B.V. - 1400E9 - Mitel Networks Corporation + 002597 + Kalki Communication Technologies - ACACE2 - Changhong (Hongkong) Trading Limited + 00256B + ATENIX E.E. s.r.l. - 4C8D53 - Huawei Technologies Ltd + 00256E + Van Breda B.V. - 547D40 - Powervision Tech Inc. + 002565 + Vizimax Inc. - C0D7AA - Arcadyan Corporation + 00255E + Shanghai Dare Technologies Co.,Ltd. - 6C0F0B - China Mobile Group Device Ltd + 00255F + SenTec AG - D4B7D0 - Ciena Corporation + 00253B + din Dietmar Nocker Facilitymanagement GmbH - 202027 - Shenzhen Sundray Technologies Company Limited + 00253D + DRS Consolidated Controls - C8418A - Samsung Electronics Ltd + 002535 + Minimax GmbH & Co KG - 4CABF8 - Askey Computer Corp + 002592 + Guangzhou Shirui Electronic Co., Ltd - F89E94 - Intel Corporation + 002594 + Eurodesign BG LTD - 1848BE - Amazon Technologies Inc. + 00258A + Pole/Zero Corporation - 68228E - Juniper Networks + 002584 + Cisco Systems, Inc - 686725 - Espressif Inc. + 002579 + J & F Labs - 80B745 - The Silk Technologies ILC Ltd + 00257F + CallTechSolution Co.,Ltd - C403A8 - Intel Corporation + 002577 + D-BOX Technologies - 644212 - Shenzhen Water World Information Ltd + 002572 + Nemo-Q International AB - 886EE1 - Erbe Elektromedizin GmbH + 0025B4 + Cisco Systems, Inc - AC8BA9 - Ubiquiti Networks Inc. + 0025B2 + MBDA Deutschland GmbH - C475AB - Intel Corporation + 0025A7 + itron - 0CB088 - AITelecom + 0024C2 + Asumo Co.,Ltd. - DC973A - Verana Networks + 0024BF + Carrier Culoz SA - 2066FD - CoNSTELL8 NV + 0024C0 + NTI COMODO INC - 9C00D3 - Shenzhen IK WORLD Technology Ltd + 0024BB + CENTRAL Corporation - 282D06 - AMPAK Technology,Inc. + 0024BC + HuRob Co.,Ltd - 202B20 - Cloud Network Technology Singapore PTE Ltd + 0024B7 + GridPoint, Inc. - 884D7C - Apple + 0024EA + iris-GmbH infrared & intelligent sensors - A8FE9D - Apple + 0024ED + YT Elec. Co,.Ltd. - A0A309 - Apple + 0024EC + United Information Technology Co.,Ltd. - 5C50D9 - Apple + 0024E6 + In Motion Technology Inc. - 000A08 - Alps Alpine + 0024E7 + Plaster Networks - E8CAC8 - Hui Zhou Gaoshengda Technology Ltd + 0024E4 + Withings - D419F6 - NXP Semiconductor (Tianjin) Ltd + 002529 + COMELIT GROUP S.P.A - A04C0C - Shenzhen Skyworth Digital Technology Ltd + 00252A + Chengdu GeeYa Technology Co.,LTD - 40ACBF - Hangzhou Hikvision Digital Technology Ltd + 002528 + Daido Signal Co., Ltd. - 64BF6B - Huawei Technologies Ltd + 002526 + Genuine Technologies Co., Ltd. - 30499E - Huawei Technologies Ltd + 0024DE + GLOBAL Technology Inc. - FC7692 - Semptian Ltd + 0024DB + Alcohol Monitoring Systems - FCAFBE - TireCheck GmbH + 0024DD + Centrak, Inc. - 9CEC61 - Huawei Device Ltd + 002521 + Logitek Electronic Systems, Inc. - B03366 - Vivo Mobile Communication Ltd + 00251F + ZYNUS VISION INC. - 7CC225 - Samsung Electronics Ltd + 00251E + ROTEL TECHNOLOGIES - 747069 - Huawei Device Ltd + 002519 + Viaas Inc - 14FB70 - Huawei Device Ltd + 002513 + CXP DIGITAL BV - 84D3D5 - Huawei Device Ltd + 0024D5 + Winward Industrial Limited - D413F8 - Peplink International Ltd + 002503 + IBM Corp - C85ACF - HP Inc. + 002504 + Valiant Communications Limited - 9C1C6D - Hefei Datang Storage Technology Ltd + 0024A7 + Advanced Video Communications Inc. - FC29E3 - Infinix mobility limited + 0024AB + A7 Engineering, Inc. - 88C227 - Huawei Technologies Ltd + 0024A4 + Siklu Communication - 8054D9 - Huawei Technologies Ltd + 00249A + Beijing Zhongchuang Telecommunication Test Co., Ltd. - 48B423 - Amazon Technologies Inc. + 00249E + ADC-Elektronik GmbH - 7070AA - Amazon Technologies Inc. + 00245F + Vine Telecom CO.,Ltd. - 9C8566 - Wingtech Mobile Communications Ltd + 002455 + MuLogic BV - 94A9A8 - Texas Instruments + 00245A + Nanjing Panda Electronics Company Limited - 642FC7 - New H3C Technologies Ltd + 00245B + RAIDON TECHNOLOGY, INC. - 6026AA - Cisco Systems Inc. + 002459 + ABB Automation products GmbH - 5C3192 - Cisco Systems Inc. + 00249F + RIM Testing Services - A83A48 - Ubiqcom India Pvt Ltd + 002488 + Centre For Development Of Telematics - F41399 - Aerospace new generation Communications Ltd + 00248F + DO-MONIX - 641ABA - Dryad Networks GmbH + 002479 + Optec Displays, Inc. - 349454 - Espressif Inc. + 002468 + Sumavision Technologies Co.,Ltd - A4438C - ARRIS Group Inc. + 002466 + Unitron nv - 94DEB8 - Silicon Laboratories + 0024AD + Adolf Thies Gmbh & Co. KG - 040D84 - Silicon Laboratories + 00243A + Ludl Electronic Products - 4C195D - Sagemcom Broadband SAS + 00244E + RadChips, Inc. - 0080C2 - IEEE 802.1 Chair + 002439 + Digital Barriers Advanced Technologies - 480286 - Realme Chongqing Mobile Telecommunications Corp Ltd + 002434 + Lectrosonics, Inc. - D84A2B - ZTE Corporation + 00242F + Micron - D0F99B - ZTE Corporation + 00240B + Virtual Computer Inc. - 98672E - Skullcandy + 002402 + Op-Tection GmbH - D43538 - Beijing Xiaomi Mobile Software Ltd + 0023C1 + Securitas Direct AB - 10CE02 - Amazon Technologies Inc. + 0023FC + Ultra Stereo Labs, Inc - D8539A - Juniper Networks + 002418 + Nextwave Semiconductor - 54F82A - u-blox AG + 002412 + Benign Technologies Co, Ltd. - 64CF13 - Weigao Nikkiso(Weihai)Dialysis Equipment Ltd + 00240D + OnePath Networks LTD. - 8C497A - Extreme Networks Inc. + 0023DB + saxnet gmbh - 40329D - Union Image Ltd + 0023C8 + TEAM-R - 4C7713 - Renesas Electronics (Penang) Sdn. Bhd. + 0023EB + Cisco Systems, Inc - 6C4BB4 - HUMAX Ltd + 0023EC + Algorithmix GmbH - 589BF7 - Hefei Radio Communication Technology Ltd + 002426 + NOHMI BOSAI LTD. - 50E9DF - Quectel Wireless Solutions Ltd + 002429 + MK MASTER INC. - 441B88 - Apple + 00238D + Techno Design Co., Ltd. - 80045F - Apple + 002387 + ThinkFlood, Inc. - 9C3E53 - Apple + 002384 + GGH Engineering s.r.l. - C889F3 - Apple + 00236F + DAQ System - E8FA23 - Huawei Device Ltd + 002369 + Cisco-Linksys, LLC - EC3A52 - Huawei Device Ltd + 0023AA + HFR, Inc. - 60109E - Huawei Technologies Ltd + 0023A5 + SageTV, LLC - 44EA30 - Samsung Electronics Ltd + 00239E + Jiangsu Lemote Technology Corporation Limited - 9C2F9D - Liteon Technology Corporation + 002330 + DIZIPIA, INC. - A4F33B - ZTE Corporation + 00232D + SandForce - 30E7BC - Guangdong Oppo Mobile Telecommunications Corp Ltd + 002391 + Maxian - 7CB566 - Intel Corporation + 002392 + Proteus Industries Inc. - 901195 - Amazon Technologies Inc. + 002393 + AJINEXTEK - 10B9C4 - Apple + 00237F + PLANTRONICS, INC. - CC7D5B - Telink Semiconductor (Shanghai) Ltd + 0023BB + Accretech SBS, Inc. - 749552 - Xuzhou WIKA Electronics Control Technology Ltd + 002295 + SGM Technology for lighting spa - A81306 - Vivo Mobile Communication Ltd + 002287 + Titan Wireless LLC - 1C34F1 - Silicon Laboratories + 002288 + Sagrad, Inc. - B43161 - Realme Chongqing Mobile Telecommunications Corp Ltd + 002323 + Zylin AS - 4CFE2E - DongGuan Siyoto Electronics Ltd + 0022F8 + PIMA Electronic Systems Ltd. - 845F04 - Samsung Electronics Ltd + 00231C + Fourier Systems Ltd. - F8C116 - Juniper Networks + 00231D + Deltacom Electronics Ltd - EC9B2D - China Mobile Group Device Ltd + 0022D0 + Polar Electro Oy - AC93C4 - GD Midea Air-Conditioning Equipment Ltd + 0022C3 + Zeeport Technology Inc. - 48CAC6 - Unionman Technology Ltd + 002316 + KISAN ELECTRONICS CO - 4C63EB - Application Solutions (Electronics and Vision) Ltd + 00230F + Hirsch Electronics Corporation - 608CDF - Beamtrail-Sole Proprietorship + 00230A + ARBURG GmbH & Co KG - D01B1F - Ohsung + 0022DE + OPPO Digital, Inc. - 0C4EC0 - Maxlinear Inc + 0022D7 + Nintendo Co., Ltd. - FC38C4 - China Grand Communications Ltd + 0022D6 + Cypak AB - 5CF51A - Zhejiang Dahua Technology Ltd + 0022A2 + Xtramus Technologies - D8AA59 - Tonly Technology Ltd + 00229E + Social Aid Research Co., Ltd. - 2CFDB3 - Tonly Technology Ltd + 0022F1 + Private - CC8CBF - Tuya Smart Inc. + 002240 + Universal Telecom S/A - 04CF4B - Intel Corporation + 002242 + Alacron Inc. - C01803 - HP Inc. + 002221 + ITOH DENKI CO,LTD. - 2C784C - Iton Technology Corp. + 002226 + Avaak, Inc. - 488759 - Xiaomi Communications Ltd + 00221D + Freegene Technology LTD - AC1E9E - Xiaomi Communications Ltd + 002224 + Good Will Instrument Co., Ltd. - E0AEA2 - Huawei Technologies Ltd + 002285 + NOMUS COMM SYSTEMS - 44456F - Shenzhen Onega Technology Ltd + 002281 + Daintree Networks Pty - 34976F - Rootech Inc. + 002273 + Techway - E8FDF8 - Shanghai High-Flying Electronics Technology Ltd + 002234 + Corventis Inc. - 6C6C0F - Huawei Technologies Ltd + 002232 + Design Design Technology Ltd - F897A9 - Ericsson AB + 00222B + Nucomm, Inc. - 30B216 - Hitachi Energy + 00224E + SEEnergy Corp. - 98CA20 - Shanghai SIMCOM Ltd + 002245 + Leine & Linde AB - DC152D - China Mobile Group Device Ltd + 002249 + HOME MULTIENERGY SL - 00D8A2 - Huawei Device Ltd + 00220F + MoCA (Multimedia over Coax Alliance) - DC6B1B - Huawei Device Ltd + 00220A + OnLive, Inc - 342840 - Apple + 00226B + Cisco-Linksys, LLC - 18E7B0 - Apple + 002267 + Nortel Networks - 50578A - Apple + 00225A + Garde Security AB - D49FDD - Huawei Device Ltd + 002255 + Cisco Systems, Inc - D06DC9 - Sagemcom Broadband SAS + 00221B + Morega Systems - 0857FB - Amazon Technologies Inc. + 002187 + Imacs GmbH - D4FB8E - Apple + 002181 + Si2 Microsystems Limited - B0DE28 - Apple + 00217E + Telit Communication s.p.a - 7C131D - Sernet (Suzhou) Technologies Corporation + 0021F7 + HPN Supply Chain - D833B7 - Sagemcom Broadband SAS + 0021F4 + INRange Systems, Inc - 440CEE - Robert Bosch Elektronika Kft + 0021F5 + Western Engravers Supply, Inc. - D850A1 - Hunan Danuo Technology Ltd + 0021AC + Infrared Integrated Systems Ltd - 441AAC - Elektrik Uretim AS EOS + 0021A2 + EKE-Electronics Ltd. - 4851D0 - Jiangsu Xinsheng Intelligent Technology Ltd + 0021E4 + I-WIN - 8077A4 - Tecno Mobile Limited + 0021E5 + Display Solution AG - B42875 - Futecho Solutions Private Limited + 0021E2 + visago Systems & Controls GmbH & Co. KG - 302364 - Nokia Shanghai Bell Ltd + 0021DD + Northstar Systems Corp - 0C1C1A - eero Inc. + 00218E + MEKICS CO., LTD. - 00C30A - Xiaomi Communications Ltd + 00218F + Avantgarde Acoustic Lautsprechersysteme GmbH - 8852EB - Xiaomi Communications Ltd + 002203 + Glensound Electronics Ltd - 7C6CF0 - Shenzhen TINNO Mobile Technology Corp. + 002204 + KORATEK - 00A0A2 - B810 S.R.L. + 0021FF + Cyfrowy Polsat SA - 2C07F6 - Wear Future Technologies Ltd + 0021C9 + Wavecom Asia Pacific Limited - 3868BE - Sichuan Tianyi Comheart Telecom Ltd + 0021C2 + GL Communications Inc - DC9A7D - Hisense Visual Technology Ltd + 0021B2 + Fiberblaze A/S - 28A53F - Vivo Mobile Communication Ltd + 0021D5 + X2E GmbH - 8C49B6 - Vivo Mobile Communication Ltd + 00214A + Pixel Velocity, Inc - 84F1D0 - Ehoome IOT Private Limited + 002146 + Sanmina-SCI - 208BD1 - NXP Semiconductor (Tianjin) Ltd + 002142 + Advanced Control Systems doo - 000FA0 - Canon Korea Inc. + 00216E + Function ATI (Huizhou) Telecommunications Co., Ltd. - 30BB7D - OnePlus Technology (Shenzhen) Ltd + 00211F + SHINSUNG DELTATECH CO.,LTD. - 6C67EF - Huawei Technologies Ltd + 002124 + Optos Plc - 88693D - Huawei Technologies Ltd + 002117 + Tellord - 00991D - Huawei Technologies Ltd + 002101 + Aplicaciones Electronicas Quasar (AEQ) - B83FD2 - Mellanox Technologies Inc. + 002103 + GHI Electronics, LLC - 283E0C - Preferred Robotics Inc. + 001FF8 + Siemens AG, Sector Industry, Drive Technologies, Motion Control Systems - 30CB36 - Belden Singapore Pte Ltd + 002130 + Keico Hightech Inc. - 8C1759 - Intel Corporation + 002133 + Building B, Inc - 04BC9F - Calix Inc. + 002134 + Brandywine Communications - BC6E6D - EM Microelectronic + 00216D + Soltech Co., Ltd. - B04A6A - Samsung Electronics Ltd + 002165 + Presstek Inc. - A8798D - Samsung Electronics Ltd + 00213A + Winchester Systems Inc. - 5CEDF4 - Samsung Electronics Ltd + 00212E + dresden-elektronik - 3492C2 - Square Route Ltd + 00210F + Cernium Corp - 283DC2 - Samsung Electronics Ltd + 00215B + SenseAnywhere - 00D49E - Intel Corporation + 00214E + GS Yuasa Power Supply Ltd. - 6CA401 - essensys plc + 001F90 + Actiontec Electronics, Inc - CCF305 - Shenzhen Tian Xing Chuang Zhan Electronic Ltd + 001F91 + DBS Lodging Technologies, LLC - 34BD20 - Hangzhou Hikrobot Technology Ltd + 001F98 + DAIICHI-DENTSU LTD. - 64C269 - eero Inc. + 001F93 + Xiotech Corporation - AC2AA1 - Cisco Systems Inc. + 001FD1 + OPTEX CO.,LTD. - F8E94F - Cisco Systems Inc. + 001FC9 + Cisco Systems, Inc - 30894A - Intel Corporation + 001FFA + Coretree, Co, Ltd - B8D61A - Espressif Inc. + 001FF5 + Kongsberg Defence & Aerospace - BCF4D4 - Cloud Network Technology Singapore PTE Ltd + 001FF2 + VIA Technologies, Inc. - D89C8E - Comcast Cable Corporation + 001FA3 + T&W Electronics(Shenzhen)Co.,Ltd. - 74563C - Giga-Byte Technology Ltd + 001FA2 + Datron World Communications, Inc. - EC551C - Huawei Technologies Ltd + 001FF1 + Paradox Hellas S.A. - 8C6BDB - Huawei Device Ltd + 001FE6 + Alphion Corporation - 10DA49 - Huawei Device Ltd + 001FDC + Mobile Safe Track Ltd - 60183A - Huawei Device Ltd + 001FA9 + Atlanta DTH, Inc. - 18C007 - Huawei Device Ltd + 001FCF + MSI Technology GmbH - E06CC5 - Huawei Device Ltd + 001F2A + ACCM - 30963B - Huawei Device Ltd + 001F30 + Travelping - 90B57F - Shenzhen iComm Semiconductor Ltd + 001F24 + DIGITVIEW TECHNOLOGY CO., LTD. - 98597A - Intel Corporation + 001F21 + Inner Mongolia Yin An Science & Technology Development Co.,L - 64497D - Intel Corporation + 001F22 + Source Photonics, Inc. - B48351 - Intel Corporation + 001F1D + Atlas Material Testing Technology LLC - 0025CA - Laird Connectivity + 001F51 + HD Communications Corp - 04B97D - AiVIS Co., Itd. + 001F53 + GEMAC Chemnitz GmbH - C4C063 - New H3C Technologies Ltd + 001F4C + Roseman Engineering Ltd - 5443B2 - Espressif Inc. + 001F50 + Swissdis AG - C0DD8A - Facebook Technologies LLC + 001F48 + Mojix Inc. - E0798D - Silicon Laboratories + 001F3E + RP-Technik e.K. - 34AD61 - Celestica Inc. + 001F04 + Granch Ltd. - 10961A - Chipsea Technologies (Shenzhen) Corp. + 001EF0 + Gigafin Networks - BCE9E2 - Brocade Communications Systems LLC + 001EF2 + Micro Motion Inc - ACBF71 - Bose Corporation + 001F37 + Genesis I&C - 18A59C - IEEE Registration Authority + 001F2C + Starbridge Networks - ACD31D - Cisco Meraki + 001F31 + Radiocomp - 748469 - Nintendo Ltd + 001F2B + Orange Logic - 74718B - Apple + 001F15 + Bioscrypt Inc - 70317F - Apple + 001F70 + Botik Technologies LTD - A4CF99 - Apple + 001F6D + Cisco Systems, Inc - 4C2EB4 - Apple + 001F64 + Beijing Autelan Technology Inc. - B41974 - Apple + 001EEA + Sensor Switch, Inc. - 04E892 - Shennan Circuits Ltd + 001E98 + GreenLine Communications - 001848 - Vecima Networks Inc. + 001E9A + HAMILTON Bonaduz AG - 2C553C - Vecima Networks Inc. + 001E94 + SUPERCOM TECHNOLOGY CORPORATION - 6095BD - Apple + 001EA6 + Best IT World (India) Pvt. Ltd. - 001A35 - BARTEC GmbH + 001EA5 + ROBOTOUS, Inc. - 98C81C - Baytec Limited + 001EA7 + Actiontec Electronics, Inc - 848094 - Meter Inc. + 001EA0 + XLN-t - 10B3D5 - Cisco Systems Inc. + 001E83 + LAN/MAN Standards Association (LMSC) - 30A2C2 - Huawei Device Ltd + 001E7C + Taiwick Limited - DCDFD6 - ZTE Corporation + 001E78 + Owitek Technology Ltd., - ACA88E - Sharp Corporation + 001E7A + Cisco Systems, Inc - 98415C - Nintendo Ltd + 001E62 + Siemon - 705425 - ARRIS Group Inc. + 001E5C + RB GeneralEkonomik - 5C0BCA - Tunstall Nordic AB + 001E5D + Holosys d.o.o. - 283334 - Huawei Device Ltd + 001E60 + Digital Lighting Systems, Inc - 50A132 - Shenzhen MiaoMing Intelligent Technology Ltd + 001EDF + Master Industrialization Center Kista - 807871 - Askey Computer Corp + 001EE3 + T&W Electronics (ShenZhen) Co.,Ltd - 4CB1CD - Ruckus Wireless + 001ED9 + Mitsubishi Precision Co.,LTd. - F49C12 - Structab AB + 001E6C + Opaque Systems - 88517A - HMD Global Oy + 001ED3 + Dot Technology Int'l Co., Ltd. - ACB3B5 - Huawei Technologies Ltd + 001ECF + PHILIPS ELECTRONICS UK LTD - 083A88 - Universal Global Scientific Industrial Ltd + 001E8F + CANON INC. - 08318B - Huawei Technologies Ltd + 001DE8 + Nikko Denki Tsushin Corporation(NDTC) - F4B688 - Plantronics Inc. + 001DDA + Mikroelektronika spol. s r. o. - 4C7A48 - Nippon Seiki (Europe) B.V. + 001DE3 + Intuicom - 84D15A - TCT mobile Ltd + 001DDE + Zhejiang Broadcast&Television Technology Co.,Ltd. - 047F0E - Barrot Technology Limited + 001DE5 + Cisco Systems, Inc - B8F653 - Shenzhen Jingxun Software Telecommunication Technology Ltd + 001E1A + Best Source Taiwan Inc. - 60AB14 - LG Innotek + 001E19 + GTRI - BC62D2 - Genexis International B.V. + 001E14 + Cisco Systems, Inc - 6C9E7C - Fiberhome Telecommunication Technologies Ltd + 001E36 + IPTE - 44D5F2 - IEEE Registration Authority + 001E27 + SBN TECH Co.,Ltd. - 000C86 - Cisco Systems Inc. + 001E22 + ARVOO Imaging Products BV - F83CBF - Botato Electronics SDN BHD + 001DCB + Exéns Development Oy - FC589A - Cisco Systems Inc. + 001DCA + PAV Electronics Limited - F08620 - Arcadyan Corporation + 001DC2 + XORTEC OY - DCCC8D - Integrated Device Technology (Malaysia) Sdn. Bhd. + 001E44 + SANTEC - F05C77 - Google Inc. + 001E0E + MAXI VIEW HOLDINGS LIMITED - 111111 - Private + 001E0F + Briot International - 6CD71F - Guangdong Oppo Mobile Telecommunications Corp Ltd + 001DFE + Palm, Inc - F06865 - Taicang T&W Electronics + 001DF5 + Sunshine Co,LTD - A463A1 - Inventus Power Eletronica do Brasil LtdA + 001DF0 + Vidient Systems, Inc. - 3C9D56 - Huawei Technologies Ltd + 001DEC + Marusys - 70FD45 - Huawei Technologies Ltd + 001DB8 + Intoto Inc. - 446747 - Huawei Technologies Ltd + 001E2F + DiMoto Pty Ltd - 884A70 - Wacom Ltd + 001DA7 + Seamless Internet - F4B5BB - Ceragon Networks + 001DA8 + Takahata Electronics Co.,Ltd - 507AC5 - Apple + 001DA9 + Castles Technology, Co., LTD - 4C6BE8 - Apple + 001DA5 + WB Electronics - 8C861E - Apple + 001DA1 + Cisco Systems, Inc - 542B8D - Apple + 001D96 + WatchGuard Video - 001D29 - Doro AB + 001D55 + ZANTAZ, Inc - ECA5DE - ONYX WIFI Inc + 001D52 + Defzone B.V. - 1033BF - Technicolor CH USA Inc. + 001D4A + Carestream Health, Inc. - 347563 - Shenzhen RF-Link Technology Ltd + 001D8F + PureWave Networks - 142E5E - Sercomm Corporation. + 001D8C + La Crosse Technology LTD - 0025CB - Reiner SCT + 001D71 + Cisco Systems, Inc - 44237C - Beijing Xiaomi Mobile Software Ltd + 001D65 + Microwave Radio Communications - C064E4 - Cisco Systems Inc. + 001D64 + Adam Communications Systems Int Ltd - 50804A - Quectel Wireless Solutions Ltd + 001D5E + COMING MEDIA CORP. - 309435 - Vivo Mobile Communication Ltd + 001D50 + SPINETIX SA - D44BB6 - Zhejiang Tmall Technology Ltd + 001D45 + Cisco Systems, Inc - 38184C - Sony Home Entertainment & Sound Products Inc + 001D36 + ELECTRONICS CORPORATION OF INDIA LIMITED - D82FE6 - Zhejiang Tmall Technology Ltd + 001DB0 + FuJian HengTong Information Technology Co.,Ltd - 140F42 - Nokia + 001D69 + Knorr-Bremse IT-Services GmbH - 006D61 - Guangzhou V-SOLUTION Electronic Technology Ltd + 001D07 + Shenzhen Sang Fei Consumer Communications Co.,Ltd - C4AC59 - Murata Manufacturing Ltd + 001D06 + HM Electronics, Inc. - FCA47A - IEEE Registration Authority + 001D01 + Neptune Digital - E419C1 - Huawei Technologies Ltd + 001CF8 + Parade Technologies, Ltd. - B86685 - Sagemcom Broadband SAS + 001CF7 + AudioScience - 381A52 - Seiko Epson Corporation + 001CF6 + Cisco Systems, Inc - 000A17 - Nestar Communications Inc. + 001D33 + Maverick Systems Inc. - D8AF81 - ZAO NPK Rotek + 001D2C + Wavetrend Technologies (Pty) Limited - E4FDA1 - Huawei Technologies Ltd + 001CCF + LIMETEK - B452A9 - Texas Instruments + 001CCA + Shanghai Gaozhi Science & Technology Development Co. - 54EF44 - Lumi United Technology Ltd + 001CAD + Wuhan Telecommunication Devices Co.,Ltd - 402B50 - ARRIS Group Inc. + 001CA7 + International Quartz Limited - 78CC2B - Sinewy Technology Ltd + 001CAB + Meyer Sound Laboratories, Inc. - D0C857 - IEEE Registration Authority + 001CF5 + Wiseblue Technology Limited - FCBCD1 - Huawei Technologies Ltd + 001CEE + SHARP Corporation - 7460FA - Huawei Technologies Ltd + 001CC9 + Kaise Electronic Technology Co., Ltd. - 38EFE3 - Ingenico Terminals SAS + 001CC8 + INDUSTRONIC Industrie-Electronic GmbH & Co. KG - 50D4F7 - TP-Link Technologies Ltd + 001CC6 + ProStor Systems - 001F47 - MCS Logic Inc. + 001CBE + Nintendo Co., Ltd. - 8CFD18 - Huawei Technologies Ltd + 001D27 + NAC-INTERCOM - B45459 - China Mobile (Hangzhou) Information Technology Ltd + 001D24 + Aclara Power-Line Systems Inc. - 000970 - Vibration Research Corporation + 001D18 + Power Innovation GmbH - 14A2A0 - Cisco Systems Inc. + 001CE3 + Optimedical Systems - E4AB89 - MitraStar Technology Corp. + 001CDE + Interactive Multimedia eXchange Inc. - 78C313 - China Mobile Group Device Ltd + 001D1B + Sangean Electronics Inc. - 7434AE - this is engineering Inc. + 001D17 + Digital Sky Corporation - 74ADB7 - China Mobile Group Device Ltd + 001C9E + Dualtech IT AB - 6095CE - IEEE Registration Authority + 001C94 + LI-COR Biosciences - 8CE5C0 - Samsung Electronics Ltd + 001C8C + DIAL TECHNOLOGY LTD. - F08A76 - Samsung Electronics Ltd + 001C48 + WiDeFi, Inc. - ECAA25 - Samsung Electronics Ltd + 001C46 + QTUM - 687D6B - Samsung Electronics Ltd + 001C42 + Parallels, Inc. - 485169 - Samsung Electronics Ltd + 001C3E + ECKey Corporation - C40683 - Huawei Technologies Ltd + 001C39 + S Netsystems Inc. - 94D00D - Huawei Technologies Ltd + 001C93 + ExaDigm Inc - C48A5A - Jfcontrol + 001C85 + Eunicorn - B49A95 - Shenzhen Boomtech Industrial Corporation + 001C80 + New Business Division/Rhea-Information CO., LTD. - AC83E9 - Beijing Zile Technology Ltd + 001C83 + New Level Telecom Co., Ltd. - D8CA06 - Titan DataCenters France + 001C27 + Sunell Electronics Co. - 1C20DB - Huawei Technologies Ltd + 001C22 + Aeris Elettronica s.r.l. - D0C65B - Huawei Technologies Ltd + 001C1D + CHENZHOU GOSPELL DIGITAL TECHNOLOGY CO.,LTD - 9078B2 - Xiaomi Communications Ltd + 001C67 + Pumpkin Networks, Inc. - B4CFE0 - Sichuan tianyi kanghe Communications Ltd + 001C60 + CSP Frontier Technologies,Inc. - BC7FA4 - Xiaomi Communications Ltd + 001C51 + Celeno Communications - FC492D - Amazon Technologies Inc. + 001C0F + Cisco Systems, Inc - 74EE2A - Shenzhen Bilian Electronic Ltd + 001C0A + Shenzhen AEE Technology Co.,Ltd. - 087E64 - Technicolor CH USA Inc. + 001C0D + G-Technology, Inc. - 080039 - Spider Systems Limited + 001C76 + The Wandsworth Group Ltd - 90473C - China Mobile Group Device Ltd + 001C72 + Mayer & Cie GmbH & Co KG - 889E33 - TCT mobile Ltd + 001C6A + Weiss Engineering Ltd. - 6C8AEC - Nantong Coship Electronics Ltd + 001C37 + Callpod, Inc. - 84C2E4 - Jiangsu Qinheng Ltd + 001C33 + Sutron - 7C21D8 - Shenzhen Think Will Communication Technology Ltd + 001C2F + Pfister GmbH - FCEA50 - Integrated Device Technology (Malaysia) Sdn. Bhd. + 001C54 + Hillstone Networks Inc - 00E06B - W&G Special Products + 001C59 + DEVON IT - 045C6C - Juniper Networks + 001BF6 + CONWISE Technology Corporation Ltd. - D8F15B - Espressif Inc. + 001BF8 + Digitrax Inc. - D4F057 - Nintendo Ltd + 001BF1 + Nanjing SilverNet Software Co., Ltd. - 6CF17E - Zhejiang Uniview Technologies Ltd + 001BEF + Blossoms Digital Technology Co.,Ltd. - 083A2F - Guangzhou Juan Intelligent Tech Joint Stock Ltd + 001BEB + DMP Electronics INC. - 1C3A60 - Ruckus Wireless + 001BE7 + Postek Electronics Co., Ltd. - 6009C3 - u-blox AG + 001BB8 + BLUEWAY ELECTRONIC CO;LTD - 488764 - Vivo Mobile Communication Ltd + 001BB2 + Intellect International NV - 5C1CB9 - Vivo Mobile Communication Ltd + 001BB0 + Bharat Electronics Limited - C0FD84 - ZTE Corporation + 001BAD + iControl Incorporated - 444B7E - Fiberhome Telecommunication Technologies Ltd + 001BA7 + Lorica Solutions - DC8C37 - Cisco Systems Inc. + 001BA5 + MyungMin Systems, Inc. - E8D0FC - Liteon Technology Corporation + 001B7F + TMN Technologies Telecomunicacoes Ltda - E8E8B7 - Murata Manufacturing Ltd + 001B7E + Beckmann GmbH - 103D3E - China Mobile Group Device Ltd + 001B7A + Nintendo Co., Ltd. - 7C50DA - Private + 001BA2 + IDS Imaging Development Systems GmbH - 64CC22 - Arcadyan Corporation + 001B9D + Novus Security Sp. z o.o. - 4C9157 - Fujian LANDI Commercial Equipment Ltd + 001B95 + VIDEO SYSTEMS SRL - 9C25BE - Wildlife Acoustics Inc. + 001BD5 + Cisco Systems, Inc - D039EA - NetApp + 001BCE + Measurement Devices Ltd - F8DFE1 - MyLight Systems + 001BC9 + FSN DISPLAY INC - 60D2DD - Shenzhen Baitong Putian Technology Ltd + 001BC3 + Mobisolution Co.,Ltd - 788C77 - Lexmark International Inc. + 001B90 + Cisco Systems, Inc - 3C0C7D - Tiny Mesh AS + 001B87 + Deepsound Tech. Co., Ltd - 3476C5 - I-O Data Device,Inc. + 001C03 + Betty TV Technology AG - 24DA33 - Huawei Technologies Ltd + 001BE3 + Health Hero Network, Inc. - FCAB90 - Huawei Technologies Ltd + 001BDC + Vencer Co., Ltd. - 5893D8 - Texas Instruments + 001AFE + SOFACREAL - 5051A9 - Texas Instruments + 001AF1 + Embedded Artists AB - A4975C - VTech Telecommunications Ltd + 001AF8 + Copley Controls Corporation - B02A1F - Wingtech Group (HongKong)Limited + 001AF5 + PENTAONE. CO., LTD. - DC680C - Hewlett Packard Enterprise + 001B72 + Sicep s.p.a. - F40270 - Dell Inc. + 001B74 + MiraLink Corporation - 1C2704 - ZTE Corporation + 001B6D + Midtronics, Inc. - 5078B3 - ZTE Corporation + 001B6F + Teletrak Ltd - F0D4F7 - varram System + 001B34 + Focus System Inc. - E0CC7A - Huawei Technologies Ltd + 001B3A + SIMS Corp. - 6C23CB - Wattty Corporation + 001B2E + Sinkyo Electron Inc - 60AB67 - Xiaomi Communications Ltd + 001B1A + e-trees Japan, Inc. - AC710C - China Mobile Group Device Ltd + 001B12 + Apprion - A8DB03 - Samsung Electro-Mechanics(Thailand) + 001B0D + Cisco Systems, Inc - 308944 - DEVA Broadcast Ltd + 001B0A + Intelligent Distributed Controls Ltd - F47960 - Huawei Technologies Ltd + 001B5F + Alien Technology - 145290 - KNS Group LLC (YADRO Company) + 001B5E + BPL Limited - 5C32C5 - Teracom Ltd + 001B61 + Digital Acoustics, LLC - ACEE70 - Fontem Ventures BV + 001B4B + SANION Co., Ltd. - ACE2D3 - Hewlett-Packard Company + 001B4D + Areca Technology Corporation - 00FD22 - Cisco Systems Inc. + 001B2D + Med-Eng Systems Inc. - 4418FD - Apple + 001B1D + Phoenix International Co., Ltd - 00B600 - VOIM Ltd + 001B5C + Azuretec Co., Ltd. - 98FA9B - LCFC(HeFei) Electronics Technology Ltd + 001AE9 + Nintendo Co., Ltd. - 005B94 - Apple + 001AE5 + Mvox Technologies Inc. - E0897E - Apple + 001AE4 + Medicis Technologies Corporation - B00CD1 - Hewlett-Packard Company + 001AED + INCOTEC GmbH - 4846C1 - FN-Link Technology Limited + 001AEE + Shenztech Ltd - B4D0A9 - China Mobile Group Device Ltd + 001AE3 + Cisco Systems, Inc - FC29F3 - McPay Ltd + 001ADF + Interactivetv Pty Limited - F8AFDB - Fiberhome Telecommunication Technologies Ltd + 001AE1 + EDGE ACCESS INC - A0BD1D - Zhejiang Dahua Technology Ltd + 001AC0 + JOYBIEN TECHNOLOGIES CO., LTD. - E49F1E - ARRIS Group Inc. + 001AC2 + YEC Co.,Ltd. - 002615 - Teracom Limited + 001AB1 + Asia Pacific Satellite Industries Co., Ltd. - 9C8EDC - Teracom Limited + 001AB2 + Cyber Solutions Inc. - 000191 - SYRED Data Systems + 001AB7 + Ethos Networks LTD. - ACD564 - Chongqing Fugui Electronics Ltd + 001AA2 + Cisco Systems, Inc - 94D075 - CIS Crypto + 001AA5 + BRN Phoenix - 28B4FB - Sprocomm Technologies Ltd + 001A97 + fitivision technology Inc. - 40F9D5 - Tecore Networks + 001A90 + Trópico Sistemas e Telecomunicações da Amazônia LTDA. - CC2C83 - DarkMatter L.L.C + 001A94 + Votronic GmbH - DCED84 - Haverford Systems Inc + 001A86 + New Wave Design & Verification - 7C573C - Aruba Networks HP + 001AD2 + Eletronica Nitron Ltda - 2C01B5 - Cisco Systems Inc. + 001ACE + YUPITERU CORPORATION - C05336 - Beijing National Railway Research & Design Institute Of Signal & Communication Group Co Ltd + 001ACC + Celestial Semiconductor, Ltd - 606ED0 - Seal AG + 001AC7 + UNIPOINT - 2CCCE6 - Skyworth Digital Technology(Shenzhen) Ltd + 001A9C + RightHand Technologies, Inc. - E44CC7 - IEEE Registration Authority + 001A9E + ICON Digital International Limited - D4E880 - Cisco Systems Inc. + 001A98 + Asotel Communication Limited Taiwan Branch - A8346A - Samsung Electronics Ltd + 001A7E + LN Srithai Comm Ltd. - 3C20F6 - Samsung Electronics Ltd + 001A38 + Sanmina-SCI - 7C38AD - Samsung Electronics Ltd + 001A2B + Ayecom Technology Co., Ltd. - D49CDD - AMPAK Technology,Inc. + 001A28 + ASWT Co., LTD. Taiwan Branch H.K. - 50F722 - Cisco Systems Inc. + 001A2C + SATEC Co.,LTD - 9849E1 - Boeing Defence Australia + 001A27 + Ubistar - 04D7A5 - New H3C Technologies Ltd + 001A2E + Ziova Coporation - 4C4D66 - Nanjing Jiahao Technology Ltd + 001A32 + ACTIVA MULTIMEDIA - A4817A - CIG Shanghai Ltd + 001A35 + BARTEC GmbH - 905851 - Technicolor CH USA Inc. + 001A37 + Lear Corporation - 9809CF - OnePlus Technology (Shenzhen) Ltd + 001A5A + Korea Electric Power Data Network (KDN) Co., Ltd - B8DE5E - Longcheer Telecommunication Limited + 001A5F + KitWorks.fi Ltd. - 885A06 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 001A72 + Mosart Semiconductor Corp. - 5447D3 - Tsat AS + 001A68 + Weltec Enterprise Co., Ltd. - CCEDDC - MitraStar Technology Corp. + 001A48 + Takacom Corporation - CCD81F - Maipu Communication Technology Ltd + 001A21 + Brookhuis Applied Technologies BV - 688B0F - China Mobile IOT Company Limited + 001A0B + BONA TECHNOLOGY INC. - F82F6A - Itel Mobile Limited + 001A06 + OpVista, Inc. - B068E6 - Chongqing Fugui Electronics Ltd + 001A5D + Mobinnova Corp. - A4E7E4 - Connex GmbH + 001993 + Changshu Switchgear MFG. Co.,Ltd. (Former Changshu Switchgea - B8EF8B - Shenzhen Cannice Technology Ltd + 00199B + Diversified Technical Systems, Inc. - B8186F - Oriental Motor Ltd + 0019FA + Cable Vision Electronics CO., LTD. - 001A3F - Intelbras + 0019F1 + Star Communication Network Technology Co.,Ltd - C0D834 - xvtec Ltd + 0019EC + Sagamore Systems, Inc. - B8C253 - Juniper Networks + 0019A3 + asteel electronique atlantique - F05C19 - Aruba Networks HP + 0019AD + BOBST SA - 04BD88 - Aruba Networks HP + 0019A2 + ORDYN TECHNOLOGIES - 9C1C12 - Aruba Networks HP + 0019A5 + RadarFind Corporation - 18DFB4 - Bosung Powertec Ltd + 0019C4 + Infocrypt Inc. - 000147 - Zhone Technologies + 0019BC + ELECTRO CHANCE SRL - 20B780 - Toshiba Visual Solutions Corporation Ltd + 0019D5 + IP Innovations, Inc. - E03717 - Technicolor CH USA Inc. + 0019CC + RCG (HK) Ltd - 14D4FE - ARRIS Group Inc. + 0019C8 + AnyDATA Corporation - 304F75 - DASAN Network Solutions + 001981 + Vivox Inc - ECA9FA - Guangdong Genius Technology Ltd + 0019EA + TeraMage Technologies Co., Ltd. - 0003A5 - Medea Corporation + 0019D8 + MAXFOR - BCE67C - Cambium Networks Limited + 001A00 + MATRIX INC. - 7C1E06 - New H3C Technologies Ltd + 0019FF + Finnzymes - F0B31E - Universal Electronics Inc. + 001990 + ELM DATA Co., Ltd. - F89173 - Aedle SAS + 00198F + Nokia Bell N.V. - C84F86 - Sophos Ltd + 001929 + 2M2B Montadora de Maquinas Bahia Brasil LTDA - 6429ED - AO PKK Milandr + 00192A + Antiope Associates - 443C88 - Ficosa Maroc International + 00190F + Advansus Corp. - 841C70 - ZTE Corporation + 001911 + Just In Mobile Information Technologies (Shanghai) Co., Ltd. - 544741 - Xcheng Holding + 001917 + Posiflex Inc. - CCF735 - Amazon Technologies Inc. + 00196E + Metacom (Pty) Ltd. - C4F839 - Actia Automotive + 001965 + YuHua TelTech (ShangHai) Co., Ltd. - C8F742 - HangZhou Gubei Electronics Technology Ltd + 001966 + Asiarock Technology Limited - 006FF2 - Mitsumi Electric Ltd + 00192E + Spectral Instruments, Inc. - 30DF8D - Shenzhen Gongjin Electronics Ltd + 00192B + Aclara RF Systems Inc. - D4C93C - Cisco Systems Inc. + 00191E + Beyondwiz Co., Ltd. - 78DD12 - Arcadyan Corporation + 00191F + Microlink communications Inc. - 2C5D34 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 001920 + KUME electric Co.,Ltd. - 9C1463 - Zhejiang Dahua Technology Ltd + 001926 + BitsGen Co., Ltd. - 646038 - Hirschmann Automation and Control GmbH + 001918 + Interactive Wear AG - 7018A7 - Cisco Systems Inc. + 00190B + Southern Vision Systems, Inc. - CCD39D - IEEE Registration Authority + 001903 + Bigfoot Networks Inc - D425CC - IEEE Registration Authority + 001973 + Zeugma Systems - 8C6DC4 - Megapixel VR + 001975 + Beijing Huisen networks technology Inc - D4B761 - Sichuan AI-Link Technology Ltd + 00197B + Picotest Corp. - 7C035E - Xiaomi Communications Ltd + 001943 + Belden - 44FE3B - Arcadyan Corporation + 001940 + Rackable Systems - D83AF5 - Wideband Labs LLC + 00193C + HighPoint Technologies Incorporated - 38D9A5 - Mikotek Information Inc. + 001900 + Intelliverese - DBA Voicecom - 4C875D - Bose Corporation + 001902 + Cambridge Consultants Ltd - B0E7DE - Homa Technologies JSC + 001945 + RF COncepts, LLC - 649D99 - FS CoM Inc + 001948 + AireSpider Networks - 00169D - Cisco Systems Inc. + 00195C + Innotech Corporation - 4C962D - Fresh AB + 00195F + Valemount Networks Corporation - 00D279 - Vingroup Joint Stock Company + 0018F1 + Chunichi Denshi Co.,LTD. - 484A30 - George Robotics Limited + 0018F2 + Beijing Tianyu Communication Equipment Co., Ltd - 4861A3 - Concern Axion JSC + 0018EC + Welding Technology Corporation - 304A26 - Shenzhen Trolink Technology Ltd + 0018ED + Accutech Ultrasystems Co., Ltd. - 4CE5AE - Tianjin Beebox Intelligent Technology Ltd + 001894 + NPCore, Inc. - D467D3 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 001898 + KINGSTATE ELECTRONICS CORPORATION - A41232 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 001892 + ads-tec GmbH - 48E3C3 - JENOPTIK Advanced Systems GmbH + 001891 + Zhongshan General K-mate Electronics Co., Ltd - CC355A - SecuGen Corporation + 001889 + WinNet Solutions Limited - 80546A - Shenzhen Gongjin Electronics Ltd + 0018B2 + ADEUNIS RF - B447F5 - Earda Technologies Ltd + 0018B3 + TEC WizHome Co., Ltd. - F4C7C8 - Kelvin Inc. + 0018AC + Shanghai Jiao Da HISYS Technology Co. Ltd. - A89CA4 - Furrion Limited + 0018AB + BEIJING LHWT MICROELECTRONICS INC. - 00004C - NEC Corporation + 0018A5 + ADigit Technologies Corp. - 8CCF8F - ITC Systems + 0018E0 + ANAVEO - 2875D8 - Fujian Star-NET Communication Ltd + 0018CE + Dreamtech Co., Ltd - 90E202 - Texas Instruments + 0018A6 + Persistent Systems, LLC - 302478 - Sagemcom Broadband SAS + 00189B + Thomson Inc. - 7C89C1 - Palo Alto Networks + 00186B + Sambu Communics CO., LTD. - 84A93E - Hewlett-Packard Company + 001877 + Amplex A/S - B0C387 - GOEFER Inc. + 001867 + Datalogic ADC - 086BD7 - Silicon Laboratories + 0018BD + SHENZHEN DVBWORLD TECHNOLOGY CO., LTD. - 349342 - TTE Corporation + 00186A + Global Link Digital Technology Co,.LTD - 589EC6 - Gigaset Communications GmbH + 001878 + Mackware GmbH - 64C753 - Apple + 00186E + 3Com Ltd - 6458AD - China Mobile IOT Company Limited + 0018CB + Tecobest Technology Limited - 1CF29A - Google Inc. + 001843 + Dawevision Ltd - 748A0D - ARRIS Group Inc. + 00182C + Ascend Networks, Inc. - CC75E2 - ARRIS Group Inc. + 001836 + REJ Co.,Ltd - A0A3B8 - Wiscloud + 0017ED + WooJooIT Ltd. - 38F9D3 - Apple + 0017DD + Clipsal Australia - FC183C - Apple + 0017D9 + AAI Corporation - A40C66 - Shenzhen Colorful Yugong Technology and Development Ltd + 0017DC + DAEMYUNG ZERO1 - 4455B1 - Huawei Technologies Ltd + 0017F9 + Forcom Sp. z o.o. - 98F9C7 - IEEE Registration Authority + 0017F4 + ZERON ALLIANCE - 700B4F - Cisco Systems Inc. + 0017F7 + CEM Solutions Pvt Ltd - E4388C - Digital Products Limited + 00181D + ASIA ELECTRONICS CO.,LTD - 184BDF - Caavo Inc + 00181F + Palmmicro Communications - B89A9A - Xin Shi Jia Technology (Beijing) Ltd + 00181B + TaiJin Metal Co., Ltd. - 8C7BF0 - Xufeng Development Limited + 001865 + Siemens Healthcare Diagnostics Manufacturing Ltd - E0A509 - Bitmain Technologies Inc + 001805 + Beijing InHand Networking Technology Co.,Ltd. - 3C5CC4 - Amazon Technologies Inc. + 001854 + Argard Co., Ltd - D8A756 - Sagemcom Broadband SAS + 001847 + AceNet Technology Inc. - D8D6F3 - Integrated Device Technology (Malaysia) Sdn. Bhd. + 00180D + Terabytes Server Storage Tech Corp - 6C2CDC - Skyworth Digital Technology(Shenzhen) Ltd + 0017C4 + Quanta Microsystems, INC. - 7835A0 - Zurn Industries LLC + 0017BD + Tibetsystem - F43909 - Hewlett-Packard Company + 0017BF + Coherent Research Limited - 201F31 - Inteno Broadband Technology AB + 00179E + Sirit Inc - 2CCC44 - Sony Interactive Entertainment Inc. + 0017A7 + Mobile Computing Promotion Consortium - F47DEF - Samsung Electronics Ltd + 00179F + Apricorn - 7C8BB5 - Samsung Electronics Ltd + 0017A1 + 3soft inc. - 54833A - ZyXEL Communications Corp + 001758 + ThruVision Ltd - 787052 - Welotec GmbH + 00174F + iCatch Inc. - D8A98B - Texas Instruments + 0017B4 + Remote Security Systems, LLC - 00116C - Nanwang Multimedia Inc Ltd + 0017AC + O'Neil Product Development Inc. - 10B9F7 - Niko-Servodan + 0017AD + AceNet Corporation - 14EFCF - Schreder + 001788 + Philips Lighting BV - 3830F9 - LG Electronics (Mobile Communications) + 00176F + PAX Computer Technology(Shenzhen) Ltd. - A83FA1 - IEEE Registration Authority + 001766 + Accense Technology, Inc. - 6C9BC0 - Chemoptics Inc. + 001764 + ATMedia GmbH - F4DBE6 - Cisco Systems Inc. + 00175E + Zed-3 - 248498 - Beijing Jiaoda Microunion Tech Ltd + 00175B + ACS Solutions Switzerland Ltd. - C074AD - Grandstream Networks Inc. + 001792 + Falcom Wireless Comunications Gmbh - F095F1 - Carl Zeiss AG + 001797 + Telsy Elettronica S.p.A. - 00F48D - Liteon Technology Corporation + 00178C + Independent Witness, Inc - 702ED9 - Guangzhou Shiyuan Electronics Ltd + 0017D3 + Etymotic Research, Inc. - 70192F - Huawei Technologies Ltd + 0017CC + Alcatel-Lucent - 10C22F - China Entropy Ltd + 001771 + APD Communications Ltd - BC3865 - Jwcnetworks + 001729 + Ubicod Co.LTD - 04EB40 - Cisco Systems Inc. + 001727 + Thermo Ramsey Italia s.r.l. - 18A7F1 - Qingdao Haier Technology Ltd + 00172A + Proware Technology Corp.(By Unifosa) - 90E17B - Apple + 001725 + Liquid Computing - D81C79 - Apple + 00173C + Extreme Engineering Solutions - 58E6BA - Apple + 001736 + iiTron Inc. - 44E4EE - Wistron Neweb Corporation + 001737 + Industrie Dial Face S.p.A. - DC41E5 - Shenzhen Zhixin Data Service Ltd + 001733 + SFR - 00A5BF - Cisco Systems Inc. + 00174A + SOCOMEC - C8BAE9 - Qdis + 00174E + Parama-tech Co.,Ltd. - 1801F1 - Xiaomi Communications Ltd + 0016F8 + AVIQTECH TECHNOLOGY CO., LTD. - C44F33 - Espressif Inc. + 0016E8 + Lumissil Microsystems - 546AD8 - Elster Water Metering + 0016E9 + Tiba Medical Inc - C0847D - AMPAK Technology Inc. + 001714 + BR Controls Nederland bv - 0409A5 - HFR Inc. + 00171B + Innovation Lab Corp. - 94917F - Askey Computer Corp + 001709 + Exalt Communications - 9C0CDF - Guangdong Oppo Mobile Telecommunications Corp Ltd + 001703 + MOSDAN Internation Co.,Ltd - 242124 - Nokia + 0016FC + TOHKEN CO.,LTD. - 949B2C - Extreme Networks Inc. + 0016F0 + Dell - 7CD30A - Inventec Corporation + 0016A9 + 2EI - 001E33 - Inventec Corporation + 0016B0 + VK Corporation - FC1D84 - Autobase + 0016B1 + KBS - 18AC9E - Itel Mobile Limited + 0016AE + INVENTEL - EC84B4 - CIG Shanghai Ltd + 00168C + DSL Partner AS - 00D096 - 3Com Europe Ltd + 001683 + WEBIO International Co.,.Ltd. - 002654 - 3Com Corporation + 001684 + Donjin Co.,Ltd. - 0050DA - 3Com Corporation + 001687 + Chubb CSC-Vendor AP - 000476 - 3Com Corporation + 0016D0 + ATech elektronika d.o.o. - 000475 - 3Com Corporation + 0016C3 + BA Systems Inc - 4422F1 - S.FAC Inc. + 00167F + Bluebird Soft Inc. - 3009F9 - IEEE Registration Authority + 00167C + iRex Technologies BV - B4DDD0 - Continental Automotive Hungary Kft + 001673 + Bury GmbH & Co. KG - 48F027 - Chengdu newifi Ltd + 0016C1 + Eleksen Ltd - 14C697 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 0016AC + Toho Technology Corp. - 7C03AB - Xiaomi Communications Ltd + 00169C + Cisco Systems, Inc - DC16B2 - Huawei Technologies Ltd + 0016DC + ARCHOS - 24FB65 - Huawei Technologies Ltd + 001694 + Sennheiser Communications A/S - 0CB527 - Huawei Technologies Ltd + 001618 + HIVION Co., Ltd. - B42E99 - Giga-Byte Technology Ltd + 00161E + Woojinnet - 342CC4 - Compal Broadband Networks Inc. + 00161F + SUNWAVETEC Co., Ltd. - 14E9B2 - Fiberhome Telecommunication Technologies Ltd + 001614 + Picosecond Pulse Labs - C8544B - ZyXEL Communications Corp + 00160E + Optica Technologies Inc. - D07FA0 - Samsung Electronics Ltd + 001643 + Sunhillo Corporation - 009093 - EIZO Corporation + 001644 + LITE-ON Technology Corp. - 4C1159 - Vision Information & Communications + 00163E + Xensource, Inc. - 00049F - Freescale Semiconductor + 001634 + Mathtech, Inc. - 00D07B - Comcam International Inc + 00162C + Xanboo - E4FC82 - Juniper Networks + 00164C + PLANET INT Co., Ltd - 00B5D0 - Samsung Electronics Ltd + 001649 + SetOne GmbH - 1496E5 - Samsung Electronics Ltd + 001647 + Cisco Systems, Inc - C46E7B - Shenzhen RF-Link Technology Ltd + 0015FD + Complete Media Systems - C048FB - Shenzhen JingHanDa Electronics Ltd + 0015F6 + SCIENCE AND ENGINEERING SERVICES, INC. - 20E882 - ZTE Corporation + 00161B + Micronet Corporation - F09FFC - Sharp Corporation + 001605 + YORKVILLE SOUND INC. - 0CB5DE - Alcatel Lucent + 0015F9 + Cisco Systems, Inc - 000B3B - devolo AG + 00165F + Fairmount Automation - 240588 - Google Inc. + 001657 + Aegate Ltd - 50DCFC - Ecocom + 001665 + Cellon France - 700B01 - Sagemcom Broadband SAS + 0015D3 + Pantech&Curitel Communications, Inc. - 5C2623 - WaveLynx Technologies Corporation + 0015CA + TeraRecon, Inc. - 303855 - Nokia Corporation + 001570 + Zebra Technologies Inc - 00B670 - Cisco Systems Inc. + 00156E + A. W. Communication Systems Ltd - AC6417 - Siemens AG + 001568 + Dilithium Networks - 347916 - Huawei Technologies Ltd + 00155F + GreenPeak Technologies - 3466EA - Vertu International Corporation Limited + 0015AD + Accedian Networks - 28385C - Flextronics + 0015AC + Capelon AB - 0C1C57 - Texas Instruments + 0015A9 + KWANG WOO I&C CO.,LTD - 806FB0 - Texas Instruments + 00E0A8 + SAT GmbH & Co. - 883F99 - Siemens AG + 001574 + Horizon Semiconductors Ltd. - EC6F0B - FADU Inc. + 0015F3 + PELTOR AB - 0006EC - Harris Corporation + 0015E7 + Quantec Tontechnik - 7C6DA6 - Superwave Group LLC + 0015E3 + Dream Technologies Corporation - D016B4 - Huawei Technologies Ltd + 0015E0 + Ericsson - 20A8B9 - Siemens AG + 001598 + Kolektor group - F0F08F - Nextek Solutions Pte Ltd + 00158A + SURECOM Technology Corp. - 8CB0E9 - Samsung Electronics Ltd + 00158E + Plustek.INC - 1C3947 - Compal Information (Kunshan) Ltd + 001589 + D-MAX Technology Co.,Ltd - 342792 - Freebox SAS + 0015B4 + Polymap Wireless LLC - 40A108 - Motorola (Wuhan) Mobility Technologies Communication Ltd + 0014F4 + DekTec Digital Video B.V. - 705AB6 - Compal Information (Kunshan) Ltd + 0014F5 + OSI Security Devices - 201A06 - Compal Information (Kunshan) Ltd + 0014EC + Acro Telecom - F8A963 - Compal Information (Kunshan) Ltd + 0014EB + AwarePoint Corporation - DC0EA1 - Compal Information (Kunshan) Ltd + 00154B + Wonde Proud Technology Co., Ltd - B870F4 - Compal Information (Kunshan) Ltd + 001548 + CUBE TECHNOLOGIES - 009D6B - Murata Manufacturing Ltd + 00153C + Kprotech Co., Ltd. - 745933 - Danal Entertainment + 00155A + DAINIPPON PHARMACEUTICAL CO., LTD. - EC58EA - Ruckus Wireless + 0014FF + Precise Automation, Inc. - 7C9A54 - Technicolor CH USA Inc. + 0014FA + AsGa S.A. - 388B59 - Google Inc. + 0014FB + Technical Solutions Inc. - 880118 - BLT Co + 00153A + Shenzhen Syscan Technology Co.,Ltd. - A42618 - Integrated Device Technology (Malaysia) Sdn. Bhd. + 001532 + Consumer Technologies Group, LLC - A46191 - NamJunSa + 00150A + Sonoa Systems, Inc - 84A24D - Birds Eye Systems Private Limited + 00151D + M2I CORPORATION - 7C6B9C - Guangdong Oppo Mobile Telecommunications Corp Ltd + 001512 + Zurich University of Applied Sciences - 0017B6 - Aquantia Corporation + 0014A9 + Cisco Systems, Inc - 105917 - Tonal + 00149B + Nokota Communications, LLC - D0EFC1 - Huawei Technologies Ltd + 0014A1 + Synchronous Communication Corp - D45251 - IBT Ingenieurbureau Broennimann Thun + 00149E + UbONE Co., Ltd - 0018B5 - Magna Carta + 0014A2 + Core Micro Systems Inc. - D87EB1 - x.o.ware Inc. + 0014AB + Senhai Electronic Technology Co., Ltd. - 485702 - Huawei Technologies Ltd + 0014B0 + Naeil Community - 644F42 - JETTER Ltd + 0014AD + Gassner Wiege- und Meßtechnik GmbH - DCAF68 - Weifang Goertek Electronics Ltd + 0014AF + Datasym POS Inc. - 24EC51 - ADF Technologies Sdn Bhd + 0014D2 + Kyuden Technosystems Corporation - 7089CC - China Mobile Group Device Ltd + 0014DC + Communication System Design & Manufacturing (CSDM) - 2C5BE1 - Centripetal Networks Inc. + 0014CD + DigitalZone Co., Ltd. - DCEFCA - Murata Manufacturing Ltd + 0014C0 + Symstream Technology Group Ltd - 00BC60 - Cisco Systems Inc. + 0014C1 + U.S. Robotics Corporation - CC7B61 - Nikkiso Ltd + 0014C4 + Vitelcom Mobile Technology - 9C713A - Huawei Technologies Ltd + 00148E + Tele Power Inc. - 2C97B1 - Huawei Technologies Ltd + 00148F + Protronic (Far East) Ltd. - A89969 - Dell Inc. + 00148C + General Dynamics Mission Systems - A4EA8E - Extreme Networks Inc. + 001481 + Multilink Inc - 882D53 - Baidu Online Network Technology (Beijing) Ltd + 00147C + 3Com Ltd - 00D0B5 - IPricot formerly DotCom + 001464 + Cryptosoft - 746BAB - Guangdong Enok Communication Ltd + 00145E + IBM Corp - 7829ED - Askey Computer Corp + 001458 + HS Automatic ApS - 5061BF - Cisco Systems Inc. + 001468 + CelPlan International, Inc. - 0009DF - Vestel Elektronik San ve Tic. A.S. + 001487 + American Technology Integrators - F4032F - Reduxio Systems + 001444 + Grundfos Holding - 944A0C - Sercomm Corporation. + 001437 + GSTeletech Co.,Ltd. - 000FA2 - 2xWireless + 0013F0 + Wavefront Semiconductor - 108EE0 - Samsung Electronics Ltd + 0013EF + Kingjon Digital Technology Co.,Ltd - FCA621 - Samsung Electronics Ltd + 0013EB + Sysmaster Corporation - 8CF228 - Mercury Communication Technologies Ltd + 0013EC + Netsnapper Technologies SARL - 700F6A - Cisco Systems Inc. + 001431 + PDL Electronics Ltd - 000BB2 - Smallbig Technology + 00142B + Edata Communication Inc. - 00305E - Abelko Innovation + 00142C + Koncept International, Inc. - FC6BF0 - Topwell International Holdinds Limited + 001424 + Merry Electrics CO., LTD. - 001477 - Trilliant + 001421 + Total Wireless Technologies Pte. Ltd. - 00079B - Aurora Networks + 001420 + G-Links networking company - 544810 - Dell Inc. + 001418 + C4Line - 54B203 - Pegatron Corporation + 00141B + Cisco Systems, Inc - 3868DD - Inventec Corporation + 00140F + Federal State Unitary Enterprise Leningrad R&D Institute of - B8B7F1 - Wistron Neweb Corporation + 001407 + Sperian Protection Instrumentation - 8050F6 - Itel Mobile Limited + 001406 + Go Networks - A8CAB9 - Samsung Electro Mechanics Ltd + 00140A + WEPIO Co., Ltd. - 203956 - HMD Global Oy + 0013D0 + t+ Medical Ltd - 78AFE4 - Comau S.p.A + 0013D2 + PAGE IBERICA, S.A. - 90A137 - Beijing Splendidtel Communication Technology Ltd + 0013D1 + KIRK telecom A/S - 80029C - Gemtek Technology Ltd + 00144D + Intelligent Systems - D0C5D3 - Azurewave Technologies Inc. + 00144A + Taiwan Thick-Film Ind. Corp. - 14169E - Wingtech Group (HongKong)Limited + 001445 + Telefon-Gradnja d.o.o. - F8C39E - Huawei Technologies Ltd + 0013FA + LifeSize Communications, Inc - E8D099 - Fiberhome Telecommunication Technologies Ltd + 0013FB + RKC INSTRUMENT INC. - 107BA4 - Olive & Dove Ltd + 00136F + PacketMotion, Inc. - 7C41A2 - Nokia + 001366 + Neturity Technologies Inc. - BC325F - Zhejiang Dahua Technology Ltd + 00137D + Dynalab, Inc. - 505BC2 - Liteon Technology Corporation + 001383 + Application Technologies and Engineering Research Laboratory - 6C21A2 - AMPAK Technology Inc. + 001387 + 27M Technologies AB - 9C2F73 - Universal Tiancheng Technology (Beijing) Ltd + 001373 + BLwave Electronics Co., Ltd - D832E3 - Xiaomi Communications Ltd + 00135B + PanelLink Cinema, LLC - 9487E0 - Xiaomi Communications Ltd + 00135E + EAB/RWI/K - 38AF29 - Zhejiang Dahua Technology Ltd + 00134E + Valox Systems, Inc. - C88629 - Shenzhen Duubee Intelligent Technologies Ltd + 0013C3 + Cisco Systems, Inc - CCC2E0 - Raisecom Technology Ltd + 0013BD + HYMATOM SA - 300AC5 - Ruio telecommunication technologies Ltd + 0013BA + ReadyLinks Inc - 00E065 - Optical Access International + 001397 + Oracle Corporation - 4466FC - Guangdong Oppo Mobile Telecommunications Corp Ltd + 001336 + Tianjin 712 Communication Broadcasting co., ltd. - A028ED - HMD Global Oy + 0013B8 + RyCo Electronic Systems Limited - AC5474 - China Mobile IOT Company Limited + 0013B6 + Sling Media, Inc. - 8C1CDA - IEEE Registration Authority + 0013B4 + Appear AS - 0007A8 - Haier Group Technologies Ltd + 001344 + Fargo Electronics Inc. - 9814D2 - Avonic + 001348 + Artila Electronics Co., Ltd. - 1409DC - Huawei Technologies Ltd + 0012D6 + Jiangsu Yitong High-Tech Co.,Ltd - EC9365 - Mapper.ai Inc. + 0012DA + Cisco Systems, Inc - C4BAA3 - Beijing Winicssec Technologies Ltd + 0012D3 + Zetta Systems, Inc. - 9CFEA1 - Fiberhome Telecommunication Technologies Ltd + 0012D5 + Motion Reality Inc. - D88A3B - Unit-EM + 0012D8 + International Games System Co., Ltd. - EC5A86 - Yulong Computer Telecommunication Scientific (Shenzhen) Ltd + 001314 + Asiamajor Inc. - C0EEB5 - Enice Network. + 001316 + L-S-B Broadcast Technologies GmbH - 60DEF3 - Huawei Technologies Ltd + 001312 + Amedia Networks Inc. - 50A009 - Xiaomi Communications Ltd + 0012E6 + SPECTEC COMPUTER CO., LTD. - 88964E - ARRIS Group Inc. + 0012E3 + Agat Soft LLC - 883F4A - Texas Instruments + 0012DB + ZIEHL industrie-elektronik GmbH + Co KG - 9CA615 - TP-Link Technologies Ltd + 001300 + IT-FACTORY, INC. - E44E76 - Championtech Enterprise (Shenzhen) Inc + 0012EF + OneAccess SA - 004098 - Dressler GmbH & Co. + 0012E9 + Abbey Systems Ltd - 001DFA - Fujian LANDI Commercial Equipment Ltd + 001322 + DAQ Electronics, Inc. - 9CE65E - Apple + 001323 + Cap Co., Ltd. - C49880 - Apple + 0012A2 + VITA - E0338E - Apple + 0012A8 + intec GmbH - 08F69C - Apple + 0012A5 + Dolphin Interconnect Solutions AS - 04FA83 - Qingdao Haier Technology Ltd + 00129E + Surf Communications Inc. - D076E7 - TP-Link Technologies Ltd + 001251 + SILINK - 50A67F - Apple + 001245 + Zellweger Analytics, Inc. - D461DA - Apple + 0012BA + FSI Systems, Inc. - F01898 - Apple + 0012B2 + AVOLITES LTD. - 881908 - Apple + 0012AE + HLS HARD-LINE Solutions Inc. - 5C0947 - Apple + 0012AF + ELPRO Technologies - 14205E - Apple + 001242 + Millennial Net - B841A4 - Apple + 001241 + a2i marketing center - 00165C - Trackflow Ltd + 00123B + KeRo Systems ApS - 641CAE - Samsung Electronics Ltd + 001292 + Griffin Technology - F8E44E - Mcot Inc. + 001282 + Qovia - 40CD7A - Qingdao Hisense Communications Ltd + 001287 + Digital Everywhere Unterhaltungselektronik GmbH - DC4EF4 - Shenzhen MTN Electronics Ltd + 001285 + Gizmondo Europe Ltd - F08173 - Amazon Technologies Inc. + 00129A + IRT Electronics Pty Ltd - EC65CC - Panasonic Automotive Systems Company Of America + 00128D + STB Datenservice GmbH - 949990 - VTC Telecommunications + 00128E + Q-Free ASA - F4BC97 - Shenzhen Crave Communication Ltd + 001257 + LeapComm Communication Technologies Inc. - 28FEDE - CoMESTA Inc. + 001267 + Panasonic Corporation - 907910 - Integrated Device Technology (Malaysia) Sdn. Bhd. + 001265 + Enerdyne Technologies, Inc. - 003DE8 - LG Electronics (Mobile Communications) + 00126D + University of California, Berkeley - 68FEDA - Fiberhome Telecommunication Technologies Ltd + 0011FA + Rane Corporation - E8986D - Palo Alto Networks + 0011F2 + Institute of Network Technologies - 144E34 - Remote Solution + 0011F3 + NeoMedia Europe AG - 00508B - Hewlett-Packard Company + 0011E9 + STARNEX CO., LTD. - 146B9C - Shenzhen Bilian Electronic Ltd + 0011EC + AVIX INC. - 948DEF - Oetiker Schweiz AG + 00120D + Advanced Telecommunication Technologies, Inc. - 2CD974 - Hui Zhou Gaoshengda Technology Ltd + 00120E + AboCom - D4F786 - Fiberhome Telecommunication Technologies Ltd + 001202 + Decrane Aerospace - Audio International Inc. - 3403DE - Texas Instruments + 0011FE + Keiyo System Research, Inc. - 240A63 - ARRIS Group Inc. + 0011FD + KORG INC. - F88B37 - ARRIS Group Inc. + 001236 + ConSentry Networks - 20677C - Hewlett Packard Enterprise + 001235 + Andrew Corporation - 34D712 - Smartisan Digital Ltd + 001226 + Japan Direx Corporation - A06610 - Fujitsu Limited + 001229 + BroadEasy Technologies Co.,Ltd - 44FFBA - ZTE Corporation + 001222 + Skardin (UK) Ltd - E0E62E - TCT mobile Ltd + 001228 + Data Ltd. - E42D7B - China Mobile IOT Company Limited + 00121F + Harding Instruments - C464E3 - Texas Instruments + 0011E7 + WORLDSAT - Texas de France - 8817A3 - Integrated Device Technology (Malaysia) Sdn. Bhd. + 0011E8 + Tixi.Com - 88A9A7 - IEEE Registration Authority + 0011E0 + U-MEDIA Communications, Inc. - EC8914 - Huawei Technologies Ltd + 0011D0 + Tandberg Data ASA - B89436 - Huawei Technologies Ltd + 0011C3 + Transceiving System Technology Corporation - 501479 - iRobot Corporation + 0011C2 + United Fiber Optic Communication - 6084BD - Buffalo Inc. + 0011BF + AESYS S.p.A. - 347ECA - Nextwill + 0011B7 + Octalix B.V. - B42EF8 - Eline Technology Ltd + 0011B9 + Inner Range Pty. Ltd. - A4D4B2 - Shenzhen MeiG Smart Technology Ltd + 001220 + Cadco Systems - 8CF773 - Nokia + 001210 + WideRay Corp - DCDD24 - Energica Motor Company SpA + 0011CE + Ubisense Limited - 641CB0 - Samsung Electronics Ltd + 001198 + Prism Media Products Limited - 903A72 - Ruckus Wireless + 001197 + Monitoring Technologies Limited - CC3B58 - Curiouser Products Inc + 001199 + 2wcom Systems GmbH - 4CEFC0 - Amazon Technologies Inc. + 001162 + STAR MICRONICS CO.,LTD. - 8C5973 - ZyXEL Communications Corp + 001161 + NetStreams, LLC - 24181D - Samsung Electro-Mechanics(Thailand) + 001156 + Pharos Systems NZ - 58D759 - Huawei Technologies Ltd + 001159 + MATISSE NETWORKS INC - F89066 - Nain Inc. + 00115C + Cisco Systems, Inc - 7006AC - Eastcompeace Technology Ltd + 00115D + Cisco Systems, Inc - 2802D8 - Samsung Electronics Ltd + 001170 + GSC SRL - DCE533 - IEEE Registration Authority + 00116B + Digital Data Communications Asia Co.,Ltd - D8445C - DEV Tecnologia Ind Com Man Eq LtdA + 001169 + EMS Satcom - 509551 - ARRIS Group Inc. + 0011A7 + Infilco Degremont Inc. - 804126 - Huawei Technologies Ltd + 0011A3 + LanReady Technologies Inc. - ACF970 - Huawei Technologies Ltd + 0011A4 + JStream Technologies Inc. - 7C3953 - ZTE Corporation + 001194 + Chi Mei Communication Systems, Inc. - 38E1AA - ZTE Corporation + 001181 + InterEnergy Co.Ltd, - 48C796 - Samsung Electronics Ltd + 001176 + Intellambda Systems, Inc. - F4C248 - Samsung Electronics Ltd + 001177 + Coaxial Networks, Inc. - F47190 - Samsung Electronics Ltd + 00113D + KN SOLTEC CO.,LTD. - C4FFBC - IEEE Registration Authority + 001134 + MediaCell, Inc. - 0C2369 - Honeywell SPS + 001135 + Grandeye Ltd - 04C9D9 - Dish Technologies Corp + 001149 + Proliphix Inc. - 7055F8 - Cerebras Systems Inc + 00113B + Micronet Communications Inc. - 6C54CD - Lampex Electronics Limited + 000FC1 + WAVE Corporation - 000889 - Dish Technologies Corp + 000FC4 + NST co.,LTD. - F0B5B7 - Disruptive Technologies Research AS + 000FC9 + Allnet GmbH - B4DEDF - ZTE Corporation + 000FC6 + Eurocom Industries A/S - D4909C - Apple + 000FBE + e-w/you Inc. - E4E0A6 - Apple + 000FC0 + DELCOMp - 580454 - Icomm HK Limited + 000FBA + Tevebox AB - 3C9A77 - Technicolor CH USA Inc. + 000FB8 + CallURL Inc. - C477AF - Advanced Digital Broadcast SA + 000FD8 + Force, Inc. - 94290C - Shenyang wisdom Foundation Technology Development Ltd + 000FD3 + Digium - 9C32CE - Canon Inc. + 000FD1 + Applied Wireless Identifications Group, Inc. - 20E09C - Nokia + 001100 + Schneider Electric - 2CFDA1 - ASUSTek Computer Inc. + 000FFA + Optinel Systems, Inc. - 3807D4 - Zeppelin Systems GmbH + 000FFD + Glorytek Network Inc. - 04197F - Grasphere Japan + 000FF9 + Valcretec, Inc. - 5C0038 - Viasat Group S.p.A. + 001126 + Venstar Inc. - 8CEC4B - Dell Inc. + 00112E + CEICOM - 005091 - Netaccess Inc. + 001121 + Cisco Systems, Inc - B85001 - Extreme Networks Inc. + 001122 + CIMSYS Inc - 802BF9 - Hon Hai Precision Ind Ltd + 000FB7 + Cavium - 54B802 - Samsung Electronics Ltd + 001109 + Micro-Star International - 10CEA9 - Texas Instruments + 001104 + TELEXY - 805E0C - Yealink(Xiamen) Network Technology Ltd + 000FF7 + Cisco Systems, Inc - 6C49C1 - o2ones Ltd + 000FA9 + PC Fabrik - 70EEA3 - Eoptolink Technology Inc Ltd + 000F9A + Synchrony, Inc. - 7047E9 - Vivo Mobile Communication Ltd + 000FA0 + Canon Korea Inc. - 5C521E - Nintendo Ltd + 001116 + COTEAU VERT CO., LTD. - 14444A - Apollo Seiko Ltd + 001110 + Maxanna Technology Co., Ltd. - 3C2C99 - Edgecore Networks Corporation + 000F85 + ADDO-Japan Corporation - 683E02 - SIEMENS AG, Digital Factory, Motion Control System + 000F82 + Mortara Instrument, Inc. - 000261 - Tilgin AB + 000F81 + PAL Pacific Inc. - 0014C3 - Seagate Technology + 000F7F + UBSTORAGE Co.,Ltd. - 0004CF - Seagate Technology + 000F49 + Northover Solutions Limited - 002037 - Seagate Technology + 000F4B + Oracle Corporation - 5C81A7 - Network Devices Pty Ltd + 000F4A + Kyushu-kyohan co.,ltd - 5C0C0E - Guizhou Huaxintong Semiconductor Technology Ltd + 000F44 + Tivella Inc. - 503CEA - Guangdong Oppo Mobile Telecommunications Corp Ltd + 000F40 + Optical Internetworking Forum - D096FB - DASAN Network Solutions + 000F33 + DUALi Inc. - 00E091 - LG Electronics + 000F2F + W-LINX TECHNOLOGY CO., LTD. - 38437D - Compal Broadband Networks Inc. + 000F95 + ELECOM Co.,LTD Laneed Division - 506F98 - Sehaj Synergy Technologies Private Limited + 000F8A + WideView - 4CAE1C - SaiNXT Technologies LLP + 000F5B + Delta Information Systems, Inc. - 142882 - Midicom Electronics Ltd + 000F55 + Datawire Communication Networks Inc. - EC8193 - Logitech Inc. + 000F56 + Continuum Photonics Inc - 6CDD30 - Cisco Systems Inc. + 000F90 + Cisco Systems, Inc - 6C4E86 - Third Millennium Systems Ltd + 000F8D + FAST TV-Server AG - 5C86C1 - Dongguan Solum Electronics Ltd + 000F68 + Vavic Network Technology, Inc. - 5C7776 - TCT mobile Ltd + 000F60 + Lifetron Co.,Ltd - 70E56E - Texas Instruments + 000F77 + DENTUM CO.,LTD - 547DCD - Texas Instruments + 000F7B + Arce Sistemas, S.A. - 00AECD - Pensando Systems + 000F1C + DigitAll World Co., Ltd - FC9DD8 - Beijing TongTongYiLian Science and Technology Ltd + 000EF7 + Vulcan Portals Inc - DC2834 - HAKKO Corporation + 000EE9 + WayTech Development, Inc. - 84509A - Easy Soft TV Ltd + 000EF0 + Festo AG & Co. KG - 001730 - Automation Electronics + 000EEB + Sandmartin(zhong shan)Electronics Co.,Ltd - 30E48E - Vodafone UK + 000EEC + Orban - 449160 - Murata Manufacturing Ltd + 000EEF + Private - B4F1DA - LG Electronics (Mobile Communications) + 000EF1 + EZQUEST INC. - C863F1 - Sony Interactive Entertainment Inc. + 000EE7 + AAC ELECTRONICS CORP. - DCE1AD - Shenzhen Wintop Photoelectric Technology Ltd + 000F1A + Gaming Support B.V. - 948854 - Texas Instruments + 000F0A + Clear Edge Networks - 001D0D - Sony Interactive Entertainment Inc. + 000F02 + Digicube Technology Co., Ltd - B0FC36 - CyberTAN Technology Inc. + 000EDA + C-TECH UNITED CORP. - 001DF4 - Magellan Technology Pty Limited + 000EC9 + YOKO Technology Corp. - 6C05D5 - Ethertronics Inc + 000ED0 + Privaris, Inc. - 0019C2 - Equustek Solutions Inc. + 000EC3 + Logic Controls, Inc. - ECB0E1 - Ciena Corporation + 000EC4 + Iskra Transmission d.d. - 78DDD9 - Guangzhou Shiyuan Electronics Ltd + 000EE2 + Custom Engineering - F8B7E2 - Cisco Systems Inc. + 000EE3 + Chiyu Technology Co.,Ltd - F82055 - Green Information System + 000EE5 + bitWallet, Inc. - 74E19A - Fiberhome Telecommunication Technologies Ltd + 000ECF + PROFIBUS Nutzerorganisation e.V. - 000097 - Dell EMC + 000EC1 + MYNAH Technologies - 8CCF09 - Dell EMC + 000EBD + Burdick, a Quinton Compny - 8C839D - Shenzhen Xinyupeng Electronic Technology Ltd + 000EB9 + HASHIMOTO Electronics Industry Co.,Ltd. - B0C19E - ZTE Corporation + 000E98 + HME Clear-Com LTD. - 0C3747 - ZTE Corporation + 000E99 + Spectrum Digital, Inc - ACA667 - Electronic Systems Protection Inc. + 000E95 + Fujiya Denki Seisakusho Co.,Ltd. - 0081F9 - Texas Instruments + 000EA7 + Endace Technology - ECB5FA - Philips Lighting BV + 000EA1 + Formosa Teletek Corporation - 44CD0E - Flextronics Manufacturing(Zhuhai) Ltd + 000F05 + 3B SYSTEM INC. - E8825B - ARRIS Group Inc. + 000EB2 + Micro-Research Finland Oy - 70991C - Shenzhen Honesty Electronics Ltd + 000EB5 + Ecastle Electronics Co., Ltd. - 80B03D - Apple + 000E4F + Trajet GmbH - E49ADC - Apple + 000E50 + Thomson Telecom Belgium - ACE4B5 - Apple + 000E4B + atrium c and i - D0D2B0 - Apple + 000E82 + Infinity Tech - 001CAE - WiChorus Inc. + 000E89 + CLEMATIC - 7CDD76 - Suzhou Hanming Technologies Ltd + 000E79 + Ample Communications Inc. - 246880 - Braveridge Ltd + 000E45 + Beijing Newtry Electronic Technology Ltd - E8DF70 - AVM Audiovisuelles Marketing und Computersysteme GmbH + 000E3F + Soronti, Inc. - 28AD3E - Shenzhen TONG BO WEI Technology Ltd + 000E38 + Cisco Systems, Inc - 001C56 - Pado Systems Inc. + 000E36 + HEINESYS, Inc. - F06D78 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 000E2B + Safari Technologies - 7844FD - TP-Link Technologies Ltd + 000E28 + Dynamic Ratings P/L - 707D95 - Shenzhen City LinwlanTechnology Ltd + 000E97 + Ultracker Technology CO., Inc - 2C431A - Shenzhen YOUHUA Technology Ltd + 000E1D + ARION Technology Inc. - A8D3C8 - Topcon Electronics GmbH & Co. KG + 000E12 + Adaptive Micro Systems Inc. - D05995 - Fiberhome Telecommunication Technologies Ltd + 000E17 + Private - 18CC88 - Hitachi Johnson Controls Air + 000E15 + Tadlys LTD - 80C755 - Panasonic Appliances Company + 000E6F + IRIS Corporation Berhad - F0BD2E - H+S Polatis Ltd + 000DCC + NEOSMART Corp. - 746EE4 - Asia Vital Components Ltd + 000DCE + Dynavac Technology Pte Ltd - 0040E4 - E-M Technology Inc. + 000DC3 + First Communication, Inc. - 984B4A - ARRIS Group Inc. + 000DB9 + PC Engines GmbH - E084F3 - High Grade Controls Corporation + 000DE6 + YOUNGBO ENGINEERING CO.,LTD - 38A6CE - BSkyB Ltd + 000DDF + Japan Image & Network Inc. - 70708B - Cisco Systems Inc. + 000D95 + Opti-cell, Inc. - 389F5A - C-Kur TV Inc. + 000D91 + Eclipse (HQ Espana) S.L. - D843ED - Suzuken + 000D80 + Online Development Inc - BC4101 - Shenzhen TINNO Mobile Technology Corp. + 000DE8 + Nasaco Electronics Pte. Ltd - 043A0D - SM Optics S.r.l. + 000DE9 + Napatech Aps - 448F17 - Samsung Electronics Ltd ARTIK + 000DB7 + SANKO ELECTRIC CO,.LTD - 00FC8B - Amazon Technologies Inc. + 000DAC + Japan CBM Corporation - 0076B1 - Somfy-Protect By Myfox SAS + 000DDB + AIRWAVE TECHNOLOGIES INC. - 6CC147 - Xiamen Hanin Electronic Technology Ltd + 000DCB + Petcomkorea Co., Ltd. - A072E4 - NJ System Ltd + 000E01 + ASIP Technologies Inc. - 4C1365 - Emplus Technologies + 000E04 + CMA/Microdialysis AB - CCF957 - u-blox AG + 000D29 + Cisco Systems, Inc - 0C62A6 - Hui Zhou Gaoshengda Technology Ltd + 000D26 + Primagraphics Limited - 18132D - ZTE Corporation + 000D19 + ROBE Show lighting - 74D21D - Huawei Technologies Ltd + 000D1C + Amesys Defense - 1878D4 - Verizon + 000D62 + Funkwerk Dabendorf GmbH - B8D94D - Sagemcom Broadband SAS + 000D65 + Cisco Systems, Inc - 3890A5 - Cisco Systems Inc. + 000D55 + SANYCOM Technology Co.,Ltd - C0742B - Shenzhen Xunlong Software Ltd + 000D57 + Fujitsu I-Network Systems Limited. - 5C6776 - IDS Imaging Development Systems GmbH + 000D58 + Private - 44EAD8 - Texas Instruments + 000CF9 + Xylem Water Solutions - 189BA5 - IEEE Registration Authority + 000CED + Real Digital Media - 1C7022 - Murata Manufacturing Ltd + 000CF0 + M & N GmbH - CC9891 - Cisco Systems Inc. + 000CF4 + AKATSUKI ELECTRIC MFG.CO.,LTD. - 28BF89 - Fiberhome Telecommunication Technologies Ltd + 000CF3 + CALL IMAGE SA - 903DBD - Secure Meters Limited + 000D41 + Siemens AG ICM MP UC RD IT KLF1 - 002294 - Kyocera Corporation + 000D42 + Newbest Development Limited - 3889DC - Opticon Sensors Europe B.V. + 000D3C + i.Tech Dynamic Ltd - 8C4500 - Murata Manufacturing Ltd + 000D0C + MDI Security Systems - 1CDDEA - Guangdong Oppo Mobile Telecommunications Corp Ltd + 000D01 + P&E Microcomputer Systems, Inc. - 940006 - jinyoung + 000D00 + Seaway Networks Inc. - 20040F - Dell Inc. + 000D51 + DIVR Systems, Inc. - A43412 - Thales Alenia Space + 000D45 + Tottori SANYO Electric Co., Ltd. - 8C8590 - Apple + 000D46 + Parker SSD Drives - BC88C3 - Ningbo Dooya Mechanic & Electronic Technology Ltd + 000D35 + PAC International Ltd - 38CD07 - Beijing FaceCam Technology Ltd + 000D2A + Scanmatic AS - 00D060 - Panasonic Europe Ltd + 000D13 + Wilhelm Rutenbeck GmbH&Co.KG - ECFA03 - FCA + 000D16 + UHS Systems Pty Ltd - 6C96CF - Apple + 000D1F + AV Digital - 681F40 - Blu Wireless Technology Ltd + 000CE0 + Trek Diagnostics Inc. - 90ADF7 - Vivo Mobile Communication Ltd + 000CE2 + Rolls-Royce - 40CE24 - Cisco Systems Inc. + 000CAA + Cubic Transportation Systems Inc - 3432E6 - Panasonic Industrial Devices Europe GmbH + 000CAC + Citizen Watch Co., Ltd. - 40017A - Cisco Systems Inc. + 000CAE + Ailocom Oy - 78886D - Apple + 000C9E + MemoryLink Corp. - 20EE28 - Apple + 000C95 + PrimeNet - B4F61C - Apple + 000C9C + Chongho information & communications - 08F4AB - Apple + 000C97 + NV ADB TTV Technologies SA - FC017C - Hon Hai Precision Ind Ltd + 000C8F + Nergal s.r.l. - 90324B - Hon Hai Precision Ind Ltd + 000C92 + WolfVision Gmbh - 602E20 - Huawei Technologies Ltd + 000C93 + Xeline Co., Ltd. - E472E2 - Huawei Technologies Ltd + 000C7F + synertronixx GmbH - 00127D - MobileAria + 000CD1 + SFOM Technology Corp. - F86465 - Anova Applied Electronics Inc. + 000CD8 + M. K. Juchheim GmbH & Co - 002060 - ALCATEL ITALIA S.p.A. + 000CCE + Cisco Systems, Inc - 508F4C - Xiaomi Communications Ltd + 000CCF + Cisco Systems, Inc - A47758 - Ningbo Freewings Technologies Ltd + 000CC6 + Ka-Ro electronics GmbH - 58A0CB - TrackNet Inc. + 000CC4 + Tiptel AG - E06089 - Cloudleaf Inc. + 000CBA + Jamex, Inc. - 783690 - Yulong Computer Telecommunication Scientific (Shenzhen) Ltd + 000C81 + Schneider Electric (Australia) - BC54FC - Shenzhen Mercury Communication Technologies Ltd + 000C80 + Opelcomm Inc. - 0C4B54 - TP-Link Technologies Ltd + 000C7D + TEIKOKU ELECTRIC MFG. CO., LTD - E4F004 - Dell Inc. + 000CB7 + Nanjing Huazhuo Electronics Co., Ltd. - 94E36D - Texas Instruments + 000C76 + MICRO-STAR INTERNATIONAL CO., LTD. - F0F8F2 - Texas Instruments + 000C68 + SigmaTel, Inc. - 341513 - Texas Instruments + 000CAD + BTU International - 74819A - PT. Hartono Istana Teknologi + 000CA3 + Rancho Technology, Inc. - 283545 - Shenzhen Chuangwei-RGB Electronics Ltd + 000C0E + XtremeSpectrum, Inc. - 044F4C - Huawei Technologies Ltd + 000C12 + Micro-Optronic-Messtechnik GmbH - 18B81F - ARRIS Group Inc. + 000C10 + PNI Corporation - 1C151F - Huawei Technologies Ltd + 000C0A + Guangdong Province Electronic Technology Research Institute - 008BFC - mixi,Inc. + 000C0B + Broadbus Technologies - A82BB5 - Edgecore Networks Corporation + 000C07 + Iftest AG - E8E1E2 - Energotest + 000C0C + APPRO TECHNOLOGY INC. - 7811DC - XIAOMI Electronics Ltd + 000BF9 + Gemstone Communications, Inc. - D463C6 - Motorola Mobility LLC, a Lenovo Company + 000BEA + Zultys Technologies - F844E3 - Taicang T&W Electronics + 000BDD + TOHOKU RICOH Co., LTD. - 24A534 - SynTrust Tech International Ltd + 000BE5 + HIMS International Corporation - C444A0 - Cisco Systems Inc. + 000C23 + Beijing Lanchuan Tech. Co., Ltd. - 18742E - Amazon Technologies Inc. + 000C25 + Allied Telesis Labs, Inc. - 90A365 - HMD Global Oy + 000C18 + Zenisu Keisoku Inc. - DC44B6 - Samsung Electronics Ltd + 000C3A + Oxance - 1007B6 - Samsung Electronics Ltd + 000C35 + KaVo Dental GmbH & Co. KG - 342D0D - Samsung Electronics Ltd + 000C37 + Geomation, Inc. - A44CC8 - Dell Inc. + 000C40 + Altech Controls - D837BE - Shenzhen Gongjin Electronics Ltd + 000C3E + Crest Audio - D4684D - Ruckus Wireless + 000C56 + Megatel Computer (1986) Corp. - 8C0C90 - Ruckus Wireless + 000C57 + MACKIE Engineering Services Belgium BVBA - 6CAAB3 - Ruckus Wireless + 000C54 + Pedestal Networks, Inc - 001392 - Ruckus Wireless + 000C4A + Cygnus Microsystems (P) Limited - 085114 - Qingdao Topscomm Communication Ltd + 000BFC + Cisco Systems, Inc - D05A00 - Technicolor CH USA Inc. + 000BE9 + Actel Corporation - 70788B - Vivo Mobile Communication Ltd + 000BE3 + Key Stream Co., Ltd. - 4859A4 - ZTE Corporation + 000BE8 + AOIP - 54BD79 - Samsung Electronics Ltd + 000BDC + AKCP - A0423F - Tyan Computer Corp + 000BD8 + Industrial Scientific Corp. - 70F11C - Shenzhen Ogemray Technology Ltd + 000B95 + eBet Gaming Systems Pty Ltd - 7065A3 - Kandao lightforge Ltd + 000B98 + NiceTechVision - 14144B - Ruijie Networks Ltd + 000B9E + Yasing Technology Corp. - 74D0DC - Ericsson AB + 000B88 + Vidisco ltd. - C08ADE - Ruckus Wireless + 000B8A + MITEQ Inc. - 001D2E - Ruckus Wireless + 000B8C + Flextronics - B4E62A - LG Innotek + 000B90 + ADVA Optical Networking Ltd. - A0C5F2 - IEEE Registration Authority + 000BC0 + China IWNComm Co., Ltd. - A86B7C - Shenzhen Fenglian Technology Ltd + 000BB0 + Sysnet Telematica srl - B03956 - Netgear + 000BB4 + RDC Semiconductor Inc., - 3C0CDB - Unionman Technology Ltd + 000BAC + 3Com Ltd - EC42B4 - ADC Corporation + 000BD3 + cd3o - 60DA83 - Hangzhou H3C Technologies Ltd + 000BD5 + Nvergence, Inc. - 2C5731 - Wingtech Group (HongKong)Limited + 000BD1 + Aeronix, Inc. - CC4639 - WAAV Inc. + 000BD2 + Remopro Technology Inc. - AC9E17 - ASUSTek Computer Inc. + 000BC7 + ICET S.p.A. - 641666 - Nest Labs Inc. + 000BB8 + Kihoku Electronic Co. - D8DF7A - Quest Software Inc. + 000B75 + Iosoft Ltd. - 145BE1 - nyantec GmbH + 000B70 + Load Technology, Inc. - A0239F - Cisco Systems Inc. + 000B6F + Media Streaming Networks Inc - 70F35A - Cisco Systems Inc. + 000B79 + X-COM, Inc. - A0341B - Adero Inc + 000B87 + American Reliance Inc. - A0AFBD - Intel Corporation + 000B63 + Kaleidescape - 7C8BCA - TP-Link Technologies Ltd + 000B68 + Addvalue Communications Pte Ltd - B04E26 - TP-Link Technologies Ltd + 000B58 + Astronautics C.A LTD - B089C2 - Zyptonite + 000B9F + Neue ELSA GmbH - F023B9 - IEEE Registration Authority + 000B0D + Air2U, Inc. - FC4DD4 - Universal Global Scientific Industrial Ltd + 000B0B + Corrent Corporation - A4F4C2 - Vnpt Technology + 000B08 + Pillar Data Systems - 8C147D - IEEE Registration Authority + 000AFA + Traverse Technologies Australia - 30074D - Samsung Electro-Mechanics(Thailand) + 000AFC + Core Tec Communications, LLC - 1C1FD4 - LifeBEAM Technologies Ltd + 000B4B + VISIOWAVE SA - 009AD2 - Cisco Systems Inc. + 000B36 + Productivity Systems, Inc. - 447F77 - Connected Home + 000B35 + Quad Bit System co., Ltd. - E8B6C2 - Juniper Networks + 000B3F + Anthology Solutions Inc. - 947BE7 - Samsung Electronics Ltd + 000AE1 + EG Technology - 5092B9 - Samsung Electronics Ltd + 000ADF + Gennum Corporation - DC74A8 - Samsung Electronics Ltd + 000ADA + Vindicator Technologies - E83935 - Hewlett-Packard Company + 000AC9 + Zambeel Inc - 00180A - Cisco Meraki + 000B21 + G-Star Communications Inc. - 5C6A80 - ZyXEL Communications Corp + 000B25 + Aeluros - D860B3 - Guangdong Global Electronic Technology Ltd + 000B1A + Industrial Defender, Inc. - 64351C - e-CoN SysTEMS IndIA PVT Ltd + 000B15 + Platypus Technology - 60BA18 - nextLAP GmbH + 000B18 + Private - 44AA50 - Juniper Networks + 000B55 + ADInstruments - 84CD62 - Shenzhen IDWELL Technology Ltd + 000B54 + BiTMICRO Networks, Inc. - A8D579 - Beijing Chushang Science and Technology Ltd + 000AEC + Koatsu Gas Kogyo Co., Ltd. - 4448C1 - Hewlett Packard Enterprise + 000AE7 + ELIOP S.A. - 481063 - NTT Innovation Institute Inc. + 000AE8 + Cathay Roxus Information Technology Co. LTD - A08E78 - Sagemcom Broadband SAS + 000ADD + Allworx Corp. - 88D50C - Guangdong Oppo Mobile Telecommunications Corp Ltd + 000B43 + Microscan Systems, Inc. - D428D5 - TCT mobile Ltd + 000B45 + Cisco Systems, Inc - 9CAF6F - Itel Mobile Limited + 000B4C + Clarion (M) Sdn Bhd - FC539E - Shanghai Wind Technologies Ltd + 000B3C + Cygnal Integrated Products, Inc. - 605317 - Sandstone Technologies + 000B27 + Scion Corporation - 907065 - Texas Instruments + 000AF1 + Clarity Design, Inc. - 18A958 - Provision Thai Ltd + 000AF3 + Cisco Systems, Inc - 74C9A3 - Fiberhome Telecommunication Technologies Ltd + 000AC0 + Fuyoh Video Industry CO., LTD. - EC8A4C - ZTE Corporation + 000AAE + Rosemount Process Analytical - D45F25 - Shenzhen YOUHUA Technology Ltd + 000AB3 + Fa. GIRA - 40C8CB - AM Telecom Ltd + 000ABA + Arcon Technology Limited - 2CABEB - Cisco Systems Inc. + 000AAF + Pipal Systems - B4C6F8 - Axilspot Communication + 000AB2 + Fresnel Wireless Systems - 9CE951 - Shenzhen Sang Fei Consumer Communications Ltd + 000A9F + Pannaway Technologies, Inc. - B8D50B - Sunitec Enterprise Ltd + 000A8F + Aska International Inc. - BC66DE - Shadow Creator Information Technology Ltd + 000AA0 + Cedar Point Communications - 1868CB - Hangzhou Hikvision Digital Technology Ltd + 000A8E + Invacom Ltd - C4AE12 - Samsung Electronics Ltd + 000A99 + Calamp Wireless Networks Inc - 001FA4 - Shenzhen Gongjin Electronics Ltd + 000A5D + FingerTec Worldwide Sdn Bhd - D4DCCD - Apple + 000A5C + Carel s.p.a. - 484BAA - Apple + 000A5A + GreenNET Technologies Co.,Ltd. - DCA904 - Apple + 000A56 + HITACHI Maxell Ltd. - 6CAB31 - Apple + 000A51 + GyroSignal Technology Co., Ltd. - 4C74BF - Apple + 000A53 + Intronics, Incorporated - 04946B - Tecno Mobile Limited + 000A76 + Beida Jade Bird Huaguang Technology Co.,Ltd - A04C5B - Shenzhen TINNO Mobile Technology Corp. + 000A60 + Autostar Technology Pte Ltd - 488803 - ManTechnology Inc. + 000AC1 + Futuretel - B436E3 - Kbvision Group + 000AC3 + eM Technics Co., Ltd. - 94D299 - Techmation Ltd + 000AC4 + Daewoo Teletech Co., Ltd - 341A35 - Fiberhome Telecommunication Technologies Ltd + 000ABE + OPNET Technologies CO., LTD. - 2C029F - 3ALogics + 000AB6 + COMPUNETIX, INC - 64D154 - Routerboard.com + 000AAA + AltiGen Communications Inc. - 58D9D5 - Tenda Technology LtdDongguan branch + 000A8D + EUROTHERM LIMITED - 6C4B90 - LiteON + 000A4A + Targa Systems Ltd. - 00050F - Tanaka S/S Ltd + 000A39 + LoPA Information Technology - 989E63 - Apple + 000A37 + Procera Networks, Inc. - 886B6E - Apple + 000A93 + W2 Networks, Inc. - F4E4AD - ZTE Corporation + 000A89 + Creval Systems, Inc. - 28FF3E - ZTE Corporation + 000A80 + Telkonet Inc. - B8D7AF - Murata Manufacturing Ltd + 000A79 + corega K.K - D4AE05 - Samsung Electronics Ltd + 0009C7 + Movistec - E048AF - Premietech Limited + 0009C9 + BlueWINC Co., Ltd. - 2C3311 - Cisco Systems Inc. + 0009D4 + Transtech Networks - 5082D5 - Apple + 0009CB + HBrain - F0EE10 - Samsung Electronics Ltd + 0009C5 + KINGENE Technology Corporation - C4700B - Guangzhou Chip Technologies Ltd + 0009CD + HUDSON SOFT CO.,LTD. - 3CA067 - Liteon Technology Corporation + 000A2C + Active Tchnology Corporation - BC024A - HMD Global Oy + 000A2A + QSI Systems Inc. - 949901 - Shenzhen YITOA Digital Appliance Ltd + 000A1F + ART WARE Telecommunication Co., Ltd. - F85971 - Intel Corporation + 0009F1 + Yamaki Electric Corporation - 1005CA - Cisco Systems Inc. + 0009F4 + Alcon Laboratories, Inc. - 7894B4 - Sercomm Corporation. + 0009F5 + Emerson Network Power Co.,Ltd - 443708 - MRV Comunications + 0009EA + YEM Inc. - 285F2F - RNware Ltd + 0009C0 + 6WIND - 500FF5 - Tenda Technology LtdDongguan branch + 0009BF + Nintendo Co., Ltd. - BC452E - Knowledge Development for POF S.L. + 000A15 + Silicon Data, Inc - DCC64B - Huawei Technologies Ltd + 000A1B + Stream Labs - 043389 - Huawei Technologies Ltd + 000A1A + Imerge Ltd - 00A068 - BHP Limited + 000A0A + SUNIX Co., Ltd. - 703ACB - Google Inc. + 000A05 + Widax Corp. - 706DEC - Wifi-soft LLC + 000A04 + 3Com Ltd - B0C205 - Bionime + 0009E3 + Angel Iglesias S.A. - 94F551 - Cadi Scientific Pte Ltd + 0009D6 + KNC One GmbH - 105AF7 - ADB Italia + 000A34 + Identicard Systems Incorporated - B81DAA - LG Electronics (Mobile Communications) + 000A30 + Visteon Corporation - 00E400 - Sichuan Changhong Electric Ltd + 000A2F + Artnix Inc. - 2C55D3 - Huawei Technologies Ltd + 00092F + Akom Technology Corporation - 00C024 - Eden Sistemas de Computacao SA + 0009BA + MAKU Informationstechik GmbH - 7C4685 - Motorola (Wuhan) Mobility Technologies Communication Ltd + 0009B4 + KISAN TELECOM CO., LTD. - 1C1EE3 - Hui Zhou Gaoshengda Technology Ltd + 0009AE + OKANO ELECTRIC CO.,LTD - 44032C - Intel Corporation + 00095A + RACEWOOD TECHNOLOGY - 7868F7 - YSTen Technology Ltd + 000951 + Apogee Imaging Systems - 004BF3 - Shenzhen Mercury Communication Technologies Ltd + 000971 + Time Management, Inc. - 08CCA7 - Cisco Systems Inc. + 000974 + Innopia Technologies, Inc. - 0896AD - Cisco Systems Inc. + 00094E + BARTECH SYSTEMS INTERNATIONAL, INC - 0823B2 - Vivo Mobile Communication Ltd + 000947 + Aztek, Inc. - 88C3B3 - Sovico + 00093D + Newisys,Inc. - E05124 - NXP Semiconductors + 00098B + Entropic Communications, Inc. - 001DA3 - SabiOso + 00097E + IMI TECHNOLOGY CO., LTD - 542F8A - Tellescom Industria E Comercio EM Telecomunicacao + 000967 + Tachyon, Inc - 6014B3 - CyberTAN Technology Inc. + 00096A + Cloverleaf Communications Inc. - 105611 - ARRIS Group Inc. + 000991 + Intelligent Platforms, LLC. - 347877 - O-Net Communications (Shenzhen) Limited + 000996 + RDI - 0020CC - Digital Services Ltd + 000938 + Allot Communications - 689FF0 - ZTE Corporation + 00090C + Mayekawa Mfg. Co. Ltd. - 5CAF06 - LG Electronics (Mobile Communications) + 00090D + LEADER ELECTRONICS CORP. - 00179B - Chant Sincere Ltd + 0008FE + UNIK C&C Co.,Ltd. - 1C398A - Fiberhome Telecommunication Technologies Ltd + 0008FF + Trilogy Communications Ltd - E865D4 - Tenda Technology LtdDongguan branch + 000904 + MONDIAL electronic - 24D51C - Zhongtian broadband technology Ltd + 0008A8 + Systec Co., Ltd. - EC43F6 - ZyXEL Communications Corp + 0008A4 + Cisco Systems, Inc - 60C658 - PHYTRONIX Ltd + 00091F + A&D Co., Ltd. - FCB58A - Wapice Ltd + 000924 + Telebau GmbH - A462DF - DS Global Ltd + 000921 + Planmeca Oy - 4C1694 - Shenzhen sibituo Technology Ltd + 000919 + MDS Gateways - C81451 - Huawei Technologies Ltd + 0008BF + Aptus Elektronik AB - 44D437 - Inteno Broadband Technology AB + 0008B8 + E.F. Johnson - ECE154 - Beijing Unisound Information Technology Ltd + 0008BB + NetExcell - 6C160E - ShotTracker + 0008BE + XENPAK MSA Group - 803A0A - Integrated Device Technology (Malaysia) Sdn. Bhd. + 0008C1 + Avistar Communications Corporation - 0C73BE - Dongguan Haimai Electronie Technology Ltd + 0008C6 + Philips Consumer Communications - 286F7F - Cisco Systems Inc. + 000918 + SAMSUNG TECHWIN CO.,LTD - F0C850 - Huawei Technologies Ltd + 000910 + Simple Access Inc. - 00014F - Adtran Inc + 000914 + COMPUTROLS INC. - 285261 - Cisco Systems Inc. + 0008EF + DIBAL,S.A. - C8AA55 - Hunan Comtom Electronic Incorporated Ltd + 0008F0 + Next Generation Systems, Inc. - 20780B - Delta Faucet Company + 0008E9 + NextGig - 8809AF - Masimo Corporation + 0008E7 + SHI ControlSystems,Ltd. - 2CD02D - Cisco Systems Inc. + 0008D7 + HOW CORPORATION - 9CCC83 - Juniper Networks + 0008FC + Gigaphoton Inc. - 24A7DC - BSkyB Ltd + 000807 + Access Devices Limited - 64DBA0 - Select Comfort + 0007FC + Adept Systems Inc. - F8983A - Leeman International (HongKong) Limited + 0007E8 + EdgeWave - 4CECEF - Soraa Inc. + 0007EB + Cisco Systems, Inc - 1CEFCE - bebro electronic GmbH + 000865 + JASCOM CO., LTD - 98B6E9 - Nintendo Ltd + 000864 + Fasy S.p.A. - F015B9 - PlayFusion Limited + 000860 + LodgeNet Entertainment Corp. - 64B0A6 - Apple + 000851 + Canadian Bank Note Company, Ltd. - 7C04D0 - Apple + 000859 + ShenZhen Unitone Electronics Co., Ltd. - 84FCAC - Apple + 00084E + DivergeNet, Inc. - DC0C5C - Apple + 000819 + Banksys - 70700D - Apple + 00081A + Sanrad Intelligence Storage Communications (2000) Ltd. - 30E171 - Hewlett-Packard Company + 000810 + Key Technology, Inc. - 186590 - Apple + 000897 + Quake Technologies - F86214 - Apple + 000890 + AVILINKS SA - 784F43 - Apple + 00088D + Sigma-Links Inc. - 404D7F - Apple + 000825 + Acme Packet - 001D72 - Wistron Corporation + 00081F + Pou Yuen Tech Corp. Ltd. - D8197A - Nuheara Ltd + 000884 + Index Braille AB - 4C38D5 - Mitac Computing Technology Corporation + 08006B + ACCEL TECHNOLOGIES INC. - 54B56C - Xi'an NovaStar Tech Ltd + 0007F5 + Bridgeco Co AG - 344CC8 - Echodyne Corp + 0007EC + Cisco Systems, Inc - 64136C - ZTE Corporation + 0007DC + Atek Co, Ltd. - 04B648 - Zenner + 0007C6 + VDS Vosskuhler GmbH - 98F199 - NEC Platforms Ltd + 0007C0 + NetZerver Inc. - 1840A4 - Shenzhen Trylong Smart Science and Technology Ltd + 0007BC + Identix Inc. - 1C48CE - Guangdong Oppo Mobile Telecommunications Corp Ltd + 000756 + Juyoung Telecom - C80CC8 - Huawei Technologies Ltd + 00075A + Air Products and Chemicals, Inc. - 0425C5 - Huawei Technologies Ltd + 000748 + The Imaging Source Europe - 603E7B - Gafachi Inc. + 000746 + TURCK, Inc. - 4C7487 - Leader Phone Communication Technology Ltd + 000741 + Sierra Automated Systems - AC83F3 - AMPAK Technology Inc. + 00079E + Ilinx Co., Ltd. - CC8CDA - Shenzhen Wei Da Intelligent Technology Go Ltd + 0007A0 + e-Watch Inc. - D436DB - Jiangsu Toppower Automotive Electronics Ltd + 000794 + Simple Devices, Inc. - 2CDCAD - Wistron Neweb Corporation + 000797 + Netpower Co., Ltd. - 6C5C14 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 00078C + Elektronikspecialisten i Borlange AB - E80945 - Integrated Device Technology (Malaysia) Sdn. Bhd. + 000781 + Itron Inc. - B0A2E7 - Shenzhen TINNO Mobile Technology Corp. + 000788 + Clipcomm, Inc. - 7C2587 - chaowifi.com + 00076B + Stralfors AB - 2C2131 - Juniper Networks + 000768 + Danfoss A/S - 00501E - Grass Valley, A Belden Brand + 00075F + VCS Video Communication Systems AG - EC0D9A - Mellanox Technologies Inc. + 00075C + Eastman Kodak Company - 90D7BE - Wavelab Global Inc. + 000745 + Radlan Computer Communications Ltd. - 244E7B - IEEE Registration Authority + 00073E + China Great-Wall Computer Shenzhen Co., Ltd. - 30AEA4 - Espressif Inc. + 0007A9 + Novasonics - 3CFA43 - Huawei Technologies Ltd + 0007A1 + VIASYS Healthcare GmbH - 145F94 - Huawei Technologies Ltd + 0007B8 + Corvalent Corporation - 001F82 - Cal-Comp Electronics & Communications Company Ltd + 00077B + Millimetrix Broadband Networks - 883C1C - Mercury Corporation + 000769 + Italiana Macchi SpA - 002144 - SS Telecoms + 000718 + iCanTek Co., Ltd. - 006BF1 - Cisco Systems Inc. + 000716 + J & S Marine Ltd. - 2834A2 - Cisco Systems Inc. + 00071A + Finedigital Inc. - 7823AE - ARRIS Group Inc. + 00071E + Tri-M Engineering / Nupak Dev. Corp. - 20719E - SF Technology Ltd + 000717 + Wieland Electric GmbH - 2CC260 - Oracle Corporation + 0006D9 + IPM-Net S.p.A. - 3C3F51 - 2CRSI + 0006D3 + Alpha Telecom, Inc. U.S.A. - 3C2AF4 - Brother Industries Ltd + 0006A4 + INNOWELL Corp. - C0854C - Ragentek Technology Group + 0006D6 + Cisco Systems, Inc - 0024AC - Hangzhou DPtech Technologies Ltd + 000647 + Etrali S.A. - 50584F - waytotec,Inc. + 0006CB + Jotron Electronics A/S - 085DDD - Mercury Corporation + 0006CD + Leaf Imaging Ltd. - 8C60E7 - Mpgio Ltd + 000711 + Acterna - CC9470 - Kinestral Technologies Inc. + 00070A + Unicom Automation Co., Ltd. - B439D6 - ProCurve Networking by HP + 000709 + Westerstrand Urfabrik AB - 34F39A - Intel Corporation + 0006C7 + RFNET Technologies Pte Ltd (S) - D816C1 - Dewav (HK) Electronics Limited + 0006B9 + A5TEK Corp. - CC61E5 - Motorola Mobility LLC, a Lenovo Company + 000702 + Varex Imaging - 8C8ABB - Beijing Orient View Technology Ltd + 000705 + Endress & Hauser GmbH & Co - 00039B - NetChip Technology Inc. + 00073B + Tenovis GmbH & Co KG - 44D9E7 - Ubiquiti Networks Inc. + 000731 + Ophir-Spiricon LLC - 24A43C - Ubiquiti Networks Inc. + 00072B + Jung Myung Telecom Co., Ltd. - 9C8BA0 - Apple + 0006FF + Sheba Systems Co., Ltd. - CC088D - Apple + 0006EB + Global Data - 38A4ED - Xiaomi Communications Ltd + 0006E3 + Quantitative Imaging Corporation - B89919 - 7signal Solutions Inc. + 0006E4 + Citel Technologies Ltd. - 40FE0D - Maxio + 0006A1 + Celsian Technologies, Inc. - AC64DD - IEEE Registration Authority + 000663 + Human Technology Co., Ltd. - 94B819 - Nokia + 000665 + Sunny Giken, Inc. - 787D48 - Itel Mobile Limited + 000662 + MBM Technology Ltd. - 8871E5 - Amazon Technologies Inc. + 000669 + Datasound Laboratories Ltd - BC39D9 - Z-TEC + 00066E + Delta Electronics, Inc. - 609AC1 - Apple + 00065A + Strix Systems - 748D08 - Apple + 000695 + Ensure Technologies, Inc. - 00B0EE - Ajile Systems Inc. + 000691 + PT Inovacao - 0418D6 - Ubiquiti Networks Inc. + 000692 + Intruvert Networks, Inc. - 20DBAB - Samsung Electronics Ltd + 00061A + Zetari Inc. - 383A21 - IEEE Registration Authority + 00061F + Vision Components GmbH - D8380D - Shenzhen IP-CoM Network Ltd + 00061B + Notebook Development Lab. Lenovo Japan Ltd. - 88AD43 - Pegatron Corporation + 00060F + Narad Networks Inc - B4EFFA - Lemobile Information Technology (Beijing) Ltd + 000610 + Abeona Networks Inc - 6C71BD - Ezelink Telecom + 000652 + Cisco Systems, Inc - 60EFC6 - Shenzhen Chima Technologies Co Limited + 000656 + Tactel AB - 001FC6 - ASUSTek Computer Inc. + 000641 + ITCN - B0C128 - Adler ELREHA GmbH + 000648 + Seedsware, Inc. - 3087D9 - Ruckus Wireless + 0006AB + W-Link Systems, Inc. - FCCAC4 - LifeHealth LLC + 0006AC + Intersoft Co. - F0D9B2 - EXO S.A. + 000694 + Mobillian Corporation - E4C801 - BLU Products Inc + 000674 + Spectrum Control, Inc. - F09838 - Huawei Technologies Ltd + 00068B + AirRunner Technologies, Inc. - C80E14 - AVM Audiovisuelles Marketing und Computersysteme GmbH + 000687 + Omnitron Systems Technology, Inc. - AC63BE - Amazon Technologies Inc. + 00064C + Invicta Networks, Inc. - F81D78 - IEEE Registration Authority + 000638 + Sungjin C&C Co., Ltd. - 38F7B2 - Seojun Electric + 000635 + PacketAir Networks, Inc. - 101250 - Integrated Device Technology (Malaysia) Sdn. Bhd. + 0005D5 + Speedcom Wireless - 7802B7 - Shenzhen Ultra Easy Technology Ltd + 0005D2 + DAP Technologies - 646184 - Velux + 0005C5 + Flaga HF - E8E5D6 - Samsung Electronics Ltd + 0005CA + Hitron Technology, Inc. - C87E75 - Samsung Electronics Ltd + 0005C0 + Digital Network Alacarte Co., Ltd. - 00265F - Samsung Electronics Ltd + 0005B8 + Electronic Design Associates, Inc. - 00233A - Samsung Electronics Ltd + 00058B + IPmental, Inc. - 086A0A - Askey Computer Corp + 00057D + Sun Communications, Inc. - 98E7F4 - Hewlett-Packard Company + 000581 + Snell - 0007AB - Samsung Electronics Ltd + 0005BF + JustEzy Technology, Inc. - 002486 - DesignArt Networks + 0005AC + Northern Digital, Inc. - 002478 - Mag Tech Electronics Co Limited + 0005AD + Topspin Communications, Inc. - 382DD1 - Samsung Electronics Ltd + 0005B1 + ASB Technology BV - 001B2C - ATRON electronic GmbH + 000599 + DRS Test and Energy Management or DRS-TEM - 9034FC - Hon Hai Precision Ind Ltd + 00059A + Cisco Systems, Inc - 001427 - JazzMutant + 000611 + Zeus Wireless, Inc. - 001E84 - Pika Technologies Inc. + 0005EC + Mosaic Systems Inc. - 10DDB1 - Apple + 000602 + Cirkitech Electronics Co. - 002329 - DDRdrive LLC + 0005AB + Cyber Fone, Inc. - 0026AD - Arada Systems Inc. + 000592 + Pultek Corp. - FC1F19 - Samsung Electro Mechanics Ltd + 0005FB + ShareGate, Inc. - 840B2D - Samsung Electro Mechanics Ltd + 0005F0 + SATEC - 206432 - Samsung Electro Mechanics Ltd + 0005D1 + Metavector Technologies - B407F9 - Samsung Electro Mechanics Ltd + 0005FE + Traficon N.V. - 889FFA - Hon Hai Precision Ind Ltd + 000510 + Infinite Shanghai Communication Terminals Ltd. - 8C7CB5 - Hon Hai Precision Ind Ltd + 000501 + Cisco Systems, Inc - C44619 - Hon Hai Precision Ind Ltd + 000508 + Inetcam, Inc. - 506313 - Hon Hai Precision Ind Ltd + 0004FF + Acronet Co., Ltd. - 60D819 - Hon Hai Precision Ind Ltd + 000504 + Naray Information & Communication Enterprise - F82FA8 - Hon Hai Precision Ind Ltd + 000515 + Nuark Co., Ltd. - 0C84DC - Hon Hai Precision Ind Ltd + 00051B + Magic Control Technology Corporation - 00166C - Samsung Electronics Ltd + 000513 + VTLinx Multimedia Systems, Inc. - 181EB0 - Samsung Electronics Ltd + 00050E + 3ware, Inc. - 247F20 - Sagemcom Broadband SAS + 000586 + Lucent Technologies - E8039A - Samsung Electronics Ltd + 00057B + Chung Nam Electronic Co., Ltd. - 30CDA7 - Samsung Electronics Ltd + 000571 + Seiwa Electronics Co. - 001247 - Samsung Electronics Ltd + 000570 + Baydel Ltd. - 001599 - Samsung Electronics Ltd + 000577 + SM Information & Communication - 0012FB - Samsung Electronics Ltd + 000538 + Merilus, Inc. - D0667B - Samsung Electronics Ltd + 000530 + Andiamo Systems, Inc. - B85E7B - Samsung Electronics Ltd + 00056E + National Enhance Technology, Inc. - E492FB - Samsung Electronics Ltd + 00056D + Pacific Corporation - 6CB7F4 - Samsung Electronics Ltd + 00055C + Kowa Company, Ltd. - 2C4401 - Samsung Electronics Ltd + 000549 + Salira Optical Network Systems - B8D9CE - Samsung Electronics Ltd + 00054C + RF Innovations Pty Ltd - 1C66AA - Samsung Electronics Ltd + 000543 + IQ Wireless GmbH - 3C8BFE - Samsung Electronics Ltd + 00051D + Airocon, Inc. - D4E8B2 - Samsung Electronics Ltd + 000516 + SMART Modular Technologies - 1489FD - Samsung Electronics Ltd + 00052B + HORIBA, Ltd. - BC851F - Samsung Electronics Ltd + 000492 + Hive Internet, Ltd. - 0015B9 - Samsung Electronics Ltd + 00048C + Nayna Networks, Inc. - 002491 - Samsung Electronics Ltd + 000491 + Technovision, Inc. - 002339 - Samsung Electronics Ltd + 000493 + Tsinghua Unisplendour Co., Ltd. - 5001BB - Samsung Electronics Ltd + 000494 + Breezecom, Ltd. - C40142 - MaxMedia Technology Limited + 0004E0 + Procket Networks - 8430E5 - SkyHawke Technologies LLC + 0004DB + Tellus Group Corp. - 1C77F6 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 0004DD + Cisco Systems, Inc - 58E326 - Compass Technologies Inc. + 008086 + COMPUTER GENERATION INC. - 001B2A - Cisco Systems Inc. + 000489 + YAFO Networks, Inc. - 749DDC - 2Wire Inc. + 00048A + Temia Vertriebs GmbH - 14DDE5 - Mpmkvvcl + 000481 + Econolite Control Products, Inc. - 001A09 - Wayfarer Transit Systems Ltd + 000477 + Scalant Systems, Inc. - 742344 - Xiaomi Communications Ltd + 0004D7 + Omitec Instrumentation Ltd. - 54880E - Samsung Electro-Mechanics(Thailand) + 0004D4 + Proview Electronics Co., Ltd. - F025B7 - Samsung Electro-Mechanics(Thailand) + 0004CD + Extenway Solutions Inc - F04347 - Huawei Technologies Ltd + 0004C0 + Cisco Systems, Inc - 9CB2B2 - Huawei Technologies Ltd + 0004BA + KDD Media Will Corporation - A8C83A - Huawei Technologies Ltd + 0004B6 + Stratex Networks, Inc. - BC72B1 - Samsung Electronics Ltd + 0004B3 + Videotek, Inc. - 78F7BE - Samsung Electronics Ltd + 0004E9 + Infiniswitch Corporation - 684898 - Samsung Electronics Ltd + 0004E8 + IER, Inc. - 3423BA - Samsung Electro-Mechanics(Thailand) + 000509 + AVOC Nishimura Ltd. - 003676 - ARRIS Group Inc. + 0004FB + Commtech, Inc. - FC8E7E - ARRIS Group Inc. + 0004A4 + NetEnabled, Inc. - FC6FB7 - ARRIS Group Inc. + 000439 + Rosco Entertainment Technology, Inc. - D42C0F - ARRIS Group Inc. + 00043A + Intelligent Telecommunications, Inc. - 400E85 - Samsung Electro-Mechanics(Thailand) + 00043F + ESTeem Wireless Modems, Inc - C8BA94 - Samsung Electro-Mechanics(Thailand) + 000433 + Cyberboard A/S - 843838 - Samsung Electro-Mechanics(Thailand) + 000434 + Accelent Systems, Inc. - A055DE - ARRIS Group Inc. + 00042D + Sarian Systems, Ltd. - 80F503 - ARRIS Group Inc. + 000473 + Photonex Corporation - 44AAF5 - ARRIS Group Inc. + 000470 + ipUnplugged AB - E09DFA - Wanan Hongsheng Electronic Ltd + 00046C + Cyber Technology Co., Ltd. - 5C3C27 - Samsung Electronics Ltd + 000471 + IPrad - 70A84C - MONAD. Inc. + 00046E + Cisco Systems, Inc - 24E43F - Wenzhou Kunmei Communication Technology Ltd + 000474 + LEGRAND - 287AEE - ARRIS Group Inc. + 000416 + Parks S/A Comunicacoes Digitais - 88797E - Motorola Mobility LLC, a Lenovo Company + 00040F + Asus Network Technologies, Inc. - 305890 - Frontier Silicon Ltd + 00040A + Sage Systems - 708BCD - ASUSTek Computer Inc. + 000404 + Makino Milling Machine Co., Ltd. - 00258B - Mellanox Technologies Inc. + 000405 + ACN Technologies - 00562B - Cisco Systems Inc. + 000401 + Osaki Electric Co., Ltd. - E8FD90 - Turbostor + 0003F4 + NetBurner - 2CAC44 - Conextop + 0003F2 + Seneca Networks - D013FD - LG Electronics (Mobile Communications) + 00042E + Netous Technologies, Ltd. - BC644B - ARRIS Group Inc. + 000425 + Atmel Corporation - 606405 - Texas Instruments + 00041B + Bridgeworks Ltd. - 1899F5 - Sichuan Changhong Electric Ltd + 0003E3 + Cisco Systems, Inc - 0025C3 - 21168 + 0003DB + Apogee Electronics Corp. - 000F57 - CABLELOGIC Ltd + 0003D2 + Crossbeam Systems, Inc. - 000342 - Nortel Networks + 0003F0 + Redfern Broadband Networks - A48269 - Datrium Inc. + 0003EB + Atrica - 10E68F - Kwangsung Electronics Korea Ltd + 0003E7 + Logostek Co. Ltd. - 4CFACA - Cambridge Industries(Group) Ltd + 00044C + JENOPTIK - 18ABF5 - Ultra Electronics Electrics + 000444 + Western Multiplex Corporation - B03EB0 - MICRODIA Ltd + 00045D + BEKA Elektronik - 001591 - RLW Inc. + 000459 + Veristar Corporation - 00182E - XStreamHD + 0003B6 + QSI Corporation - 001283 - Nortel Networks + 0003B1 + ICU Medical, Inc. - 0011F9 - Nortel Networks + 0003B3 + IA Link Systems Co., Ltd. - 001158 - Nortel Networks + 0003AD + Emerson Energy Systems AB - 000F6A - Nortel Networks + 0003A7 + Unixtar Technology, Inc. - 000E62 - Nortel Networks + 0003AE + Allied Advanced Manufacturing Pte, Ltd. - 000CF8 - Nortel Networks + 000363 + Miraesys Co., Ltd. - 0026F1 - ProCurve Networking by HP + 00035F + Prüftechnik Condition Monitoring GmbH & Co. KG - 380DD4 - Primax Electronics Ltd + 000360 + PAC Interactive Technology, Inc. - 98FDB4 - Primax Electronics Ltd + 000361 + Widcomm, Inc. - D8C46A - Murata Manufacturing Ltd + 000359 + DigitalSis - D8FB68 - Cloud Corner Ltd + 000352 + Colubris Networks - 685388 - P&S Technology + 0003A3 + MAVIX, Ltd. - 982F3C - Sichuan Changhong Electric Ltd + 0003A1 + HIPER Information & Communication, Inc. - 14C1FF - Shenzhen QianHai Comlan Communication Ltd + 000396 + EZ Cast Co., Ltd. - 000417 - Elau AG + 00039A + SiConnect - ECFAAA - The IMS Company + 000394 + Connect One - F00786 - Shandong Bittel Electronics Ltd + 00038A + America Online, Inc. - 00D0F6 - Nokia + 00038D + PCS Revenue Control Systems, Inc. - 54A619 - Alcatel-Lucent Shanghai Bell Ltd + 000388 + Fastfame Technology Co., Ltd. - 000997 - Nortel Networks + 0003D0 + KOANKEISO Co., Ltd. - 001CEB - Nortel Networks + 0003CF + Muxcom, Inc. - 001C17 - Nortel Networks + 0003D1 + Takaya Corporation - 001A8F - Nortel Networks + 00037E + PORTech Communications, Inc. - 0017D1 - Nortel Networks + 000376 + Graphtec Technology, Inc. - 888322 - Samsung Electronics Ltd + 000378 + HUMAX Co., Ltd. - E89309 - Samsung Electronics Ltd + 00036D + Runtop, Inc. - 0014C7 - Nortel Networks + 00036E + Nicon Systems (Pty) Limited - 001DAF - Nortel Networks + 000371 + Acomz Networks Corp. - 88A6C6 - Sagemcom Broadband SAS + 00034C + Shanghai DigiVision Technology Co., Ltd. - 94D469 - Cisco Systems Inc. + 000349 + Vidicode Datacommunicatie B.V. - 882BD7 - Addenergie Technologies + 00033E + Tateyama System Laboratory Co., Ltd. - 0090CC - Planex Communications Inc. + 00033C + Daiden Co., Ltd. - 2057AF - Shenzhen FH-NET OPTOELECTRONICS Ltd + 00031F + Condev Ltd. - 54DC1D - Yulong Computer Telecommunication Scientific (Shenzhen) Ltd + 00029F + L-3 Communication Aviation Recorders - ACA213 - Shenzhen Bilian electronic Ltd + 00031B + Cellvision Systems, Inc. - 3C3300 - Shenzhen Bilian electronic Ltd + 00031C + Svenska Hardvarufabriken AB - 6CD032 - LG Electronics + 0001A8 + Welltech Computer Co., Ltd. - 3CBDD8 - LG Electronics Inc + 000317 + Merlin Systems, Inc. - 344DF7 - LG Electronics (Mobile Communications) + 000318 + Cyras Systems, Inc. - 583F54 - LG Electronics (Mobile Communications) + 00030C + Telesoft Technologies Ltd. - 0022CF - Planex Communications Inc. + 000308 + AM Communications, Inc. - E417D8 - 8BITDO Technology HK Limited + 000307 + Secure Works, Inc. - 9CD332 - PLC Technology Ltd + 000306 + Fusion In Tech Co., Ltd. - 38F8CA - OWIN Inc. + 0002FC + Cisco Systems, Inc - 44334C - Shenzhen Bilian electronic Ltd + 00029E + Information Equipment Co., Ltd. - 64899A - LG Electronics (Mobile Communications) + 00029B + Kreatel Communications AB - 002105 - Alcatel-Lucent IPD + 000293 + Solid Data Systems - 001BC5 - IEEE Registration Authority + 00032A + UniData Communication Systems, Inc. - 48DF37 - Hewlett Packard Enterprise + 000325 + Arima Computer Corp. - C0E42D - TP-Link Technologies Ltd + 0002FA + DX Antenna Co., Ltd. - 8CA6DF - TP-Link Technologies Ltd + 0002FB + Baumuller Aulugen-Systemtechnik GmbH - 8416F9 - TP-Link Technologies Ltd + 0002F6 + Equipe Communications - 18D6C7 - TP-Link Technologies Ltd + 000223 + ClickTV - 78C3E9 - Samsung Electronics Ltd + 0002CB + TriState Ltd. - 8C1ABF - Samsung Electronics Ltd + 0002CA + EndPoints, Inc. - 30CBF8 - Samsung Electronics Ltd + 0002C4 + OPT Machine Vision Tech Co., Ltd - A0CBFD - Samsung Electronics Ltd + 0002BF + dotRocket, Inc. - E45D75 - Samsung Electronics Ltd + 0002E3 + LITE-ON Communications, Inc. - 00E04D - Internet Initiative Japan Inc. + 0002DD + Bromax Communications, Ltd. - F8A9D0 - LG Electronics (Mobile Communications) + 0002A7 + Vivace Networks - CCFA00 - LG Electronics (Mobile Communications) + 000272 + CC&C Technologies, Inc. - 74A722 - LG Electronics (Mobile Communications) + 00026D + Adept Telecom - F01C13 - LG Electronics (Mobile Communications) + 00026B + BCM Computers Co., Ltd. - 58FCDB - IEEE Registration Authority + 000266 + Thermalogic Corporation - B0C5CA - IEEE Registration Authority + 000268 + Harris Government Communications - 7419F8 - IEEE Registration Authority + 00025E + High Technology Ltd - A816B2 - LG Electronics (Mobile Communications) + 000260 + Accordion Networks, Inc. - 64BC0C - LG Electronics (Mobile Communications) + 00012F + Twinhead International Corp - 90C682 - IEEE Registration Authority + 000247 + Great Dragon Information Technology (Group) Co., Ltd. - C01ADA - Apple + 000243 + Raysis Co., Ltd. - 000031 - Qpsx Communications Ltd + 000209 + Shenzhen SED Information Technology Co., Ltd. - 000E1E - QLogic Corporation + 000206 + Telital R&D Denmark A/S - 0014D1 - TRENDnet Inc. + 000202 + Amino Communications, Ltd. - CC52AF - Universal Global Scientific Industrial Ltd + 000201 + IFM Electronic gmbh - 001C14 - VMware Inc. + 009064 + Thomson Inc. - 005056 - VMware Inc. + 00027A + IOI Technology Corporation - 00121C - Parrot SA + 000274 + Tommy Technologies Corp. - 9003B7 - Parrot SA + 000289 + DNE Technologies - 208756 - Siemens AG + 000283 + Spectrum Controls, Inc. - 74B472 - Ciesse + 000284 + UK Grid Solutions Limited - FCF152 - Sony Corporation + 000280 + Mu Net, Inc. - 483C0C - Huawei Technologies Ltd + 000234 + Imperial Technology, Inc. - 309BAD - BBK Educational Electronics Corp Ltd + 000236 + INIT GmbH - 001BB1 - Wistron Neweb Corporation + 00022B + SAXA, Inc. - 0080F7 - Zenith Electronics Corporation + 000224 + C-COR - BC307D - Wistron Neweb Corporation + 00021F + Aculab PLC - 48A9D2 - Wistron Neweb Corporation + 00021A + Zuma Networks - 80EA23 - Wistron Neweb Corporation + 000222 + Chromisys, Inc. - 002713 - Universal Global Scientific Industrial Ltd + 0001EF + Camtel Technology Corp. - BC307E - Wistron Neweb Corporation + 000213 + S.D.E.L. - 08952A - Technicolor CH USA Inc. + 00020A + Gefran Spa - 4432C8 - Technicolor CH USA Inc. + 0001D1 + CoNet Communications, Inc. - 38A28C - Shenzhen RF-Link Technology Ltd + 0001B2 + Digital Processing Systems, Inc. - B4A5EF - Sercomm Corporation. + 0001B8 + Netsensity, Inc. - 849D64 - SMC Corporation + 0001B9 + SKF (U.K.) Limited - 0010C1 - OI Electric Ltd + 0001BD + Peterson Electro-Musical Products, Inc. - 28BE9B - Technicolor CH USA Inc. + 0001B3 + Precision Electronic Manufacturing - FC528D - Technicolor CH USA Inc. + 00014E + WIN Enterprises, Inc. - 506583 - Texas Instruments + 003073 + International Microsystems, In - B09122 - Texas Instruments + 00303F + TurboComm Tech Inc. - FC51A4 - ARRIS Group Inc. + 000195 + Sena Technologies, Inc. - 9857D3 - HON HAI-Ccpbg Precision Ind Ltd + 000184 + SIEB & MEYER AG - FCF528 - ZyXEL Communications Corp + 00018E + Logitec Corporation - 00A0C5 - ZyXEL Communications Corp + 000179 + WIRELESS TECHNOLOGY, INC. - A09E1A - Polar Electro Oy + 000160 + ELMEX Co., LTD. - 1CD6BD - Leedarson Lighting Ltd + 00016D + CarrierComm Inc. - D0D94F - IEEE Registration Authority + 00016A + ALITEC - 001E04 - Hanson Research Corporation + 00016F + Inkel Corp. - 60C0BF - ON Semiconductor + 000170 + ESE Embedded System Engineer'g - AC0481 - Jiangsu Huaxing Electronics Ltd + 0001B7 + Centos, Inc. - 68B35E - Shenzhen Neostra Technology Ltd + 0001B5 + Turin Networks, Inc. - 408805 - Motorola Mobility LLC, a Lenovo Company + 00017E + ADTEK System Science Co., Ltd. - 24E271 - Qingdao Hisense Communications Ltd + 000183 + ANITE TELECOMS - BC6010 - Qingdao Hisense Communications Ltd + 0001DB + Freecom Technologies GmbH - D0FCCC - Samsung Electronics Ltd + 0001DF + ISDN Communications, Ltd. - 98398E - Samsung Electronics Ltd + 0001CA + Geocast Network Systems, Inc. - 44D1FA - Shenzhen Yunlink Technology Ltd + 0001A4 + Microlink Corporation - F0F644 - Whitesky Science & Technology Ltd + 00305C + SMAR Laboratories Corp. - 20F17C - Huawei Technologies Ltd + 003004 + LEADTEK RESEARCH INC. - 346AC2 - Huawei Technologies Ltd + 0030F9 + Sollae Systems Co., Ltd. - C41CFF - Vizio Inc. + 003002 + Expand Networks - C09727 - Samsung Electro-Mechanics(Thailand) + 003078 + Cisco Systems, Inc - DC293A - Shenzhen Nuoshi Technology Ltd + 00B0F5 + NetWorth Technologies, Inc. - 7C6AF3 - Integrated Device Technology (Malaysia) Sdn. Bhd. + 00B0DB + Nextcell, Inc. - E46251 - HAO Cheng Group Limited + 00B0AE + Symmetricom - 40562D - Smartron India Pvt Ltd + 00B0E7 + British Federal Ltd. - 3876D1 - Euronda SpA + 00B08E + Cisco Systems, Inc - C4693E - Turbulence Design Inc. + 000118 + EZ Digital Co., Ltd. - 009569 - LSD Science and Technology Ltd + 000128 + EnjoyWeb, Inc. - B0CF4D - MI-Zone Technology Ireland + 00011C + Universal Talkware Corporation - 289AFA - TCT mobile Ltd + 00010C + System Talks Inc. - 001A34 - Konka Group Ltd + 000111 + iDigm Inc. - 0011FC - HARTING Electronics GmbH + 000135 + KDC Corp. - 002389 - Hangzhou H3C Technologies Ltd + 000141 + CABLE PRINT - 3CE5A6 - Hangzhou H3C Technologies Ltd + 000146 + Tesco Controls, Inc. - 5CDD70 - Hangzhou H3C Technologies Ltd + 000149 + TDT AG - 3C8C40 - Hangzhou H3C Technologies Ltd + 000165 + AirSwitch Corporation - A067BE - Sicon srl + 000156 + FIREWIREDIRECT.COM, INC. - D8209F - Cubro Acronet GesmbH + 000153 + ARCHTEK TELECOM CORPORATION - 8C7716 - Longcheer Telecommunication Limited + 0030BE + City-Net Technology, Inc. - 68FB7E - Apple + 003092 + Kontron Electronics AG - 84A134 - Apple + 000114 + KANDA TSUSHIN KOGYO CO., LTD. - A0D385 - AUMA Riester GmbH & Co. KG + 000107 + Leiser GmbH - 1414E6 - Ningbo Sanhe Digital Ltd + 00010B + Space CyberLink, Inc. - 002582 - Maksat Technologies (P) Ltd + 00B0DF + Starboard Storage Systems - 0C5101 - Apple + 000131 + Bosch Security Systems, Inc. - 2CF0A2 - Apple + 00307E + Redflex Communication Systems - 48C049 - Broad Telecom SA + 00304F + PLANET Technology Corporation - AC6FBB - TATUNG Technology Inc. + 003022 + Fong Kai Industrial Co., Ltd. - 001C41 - scemtec Transponder Technology GmbH + 003070 + 1Net Corporation - 146308 - Jabil Circuit (Shanghai) Ltd + 0030F8 + Dynapro Systems, Inc. - 001E25 - Intek Digital + 0030E7 + CNF MOBILE SOLUTIONS, INC. - 00E0CF - Integrated Device + 003043 + IDREAM TECHNOLOGIES, PTE. LTD. - 904D4A - Sagemcom Broadband SAS + 0030B4 + INTERSIL CORP. - 044E5A - ARRIS Group Inc. + 003056 + HMS Industrial Networks - 0060B1 - Input/Output Inc. + 003050 + Versa Technology - 547F54 - Ingenico + 0030C0 + Lara Technology, Inc. - 6C2483 - Microsoft Mobile Oy + 003005 + Fujitsu Siemens Computers - 6891D0 - IEEE Registration Authority + 00308F + MICRILOR, Inc. - E04F43 - Universal Global Scientific Industrial Ltd + 00309C + Timing Applications, Inc. - 38700C - ARRIS Group Inc. + 003009 + Tachion Networks, Inc. - 000E2E - Edimax Technology Ltd + 00307A + Advanced Technology & Systems - 00065F - ECI Telecom Ltd + 003061 + MobyTEL - 00208F - ECI Telecom Ltd + 0030B1 + TrunkNet - 844076 - Drivenets + 0030E0 + OXFORD SEMICONDUCTOR LTD. - 001CD7 - Harman/Becker Automotive Systems GmbH + 003064 + ADLINK TECHNOLOGY, INC. - 003A7D - Cisco Systems Inc. + 0030DB + Mindready Solutions, Inc. - 90C7D8 - ZTE Corporation + 0030B3 + San Valley Systems, Inc. - 00185C - EDSLAB Technologies + 0030C7 + Macromate Corp. - 001A45 - GN Netcom A/S + 0030E4 + CHIYODA SYSTEM RIKEN - 002088 - Global Village Communication + 003066 + RFM - 541379 - Hon Hai Precision Ind Ltd + 003031 + LIGHTWAVE COMMUNICATIONS, INC. - 001921 - Elitegroup Computer Systems Ltd + 003060 + Powerfile, Inc. - 0016EC - Elitegroup Computer Systems Ltd + 0030A0 + TYCO SUBMARINE SYSTEMS, LTD. - 000795 - Elitegroup Computer Systems Ltd + 003015 + CP CLARE CORP. - FC0F4B - Texas Instruments + 003000 + ALLWELL TECHNOLOGY CORP. - D4883F - Hdpro Ltd + 003011 + HMS Industrial Networks - 1088CE - Fiberhome Telecommunication Technologies Ltd + 00304B + ORBACOM SYSTEMS, INC. - 60B617 - Fiberhome Telecommunication Technologies Ltd + 0030FA + TELICA, INC. - DC9C9F - Shenzhen YOUHUA Technology Ltd + 0030A5 + ACTIVE POWER - 74DFBF - Liteon Technology Corporation + 003084 + ALLIED TELESYN INTERNAIONAL - F03E90 - Ruckus Wireless + 0030E9 + GMA COMMUNICATION MANUFACT'G - D8D723 - IDS Inc. + 003068 + CYBERNETICS TECH. CO., LTD. - 84AD58 - Huawei Technologies Ltd + 003091 + TAIWAN FIRST LINE ELEC. CORP. - 58605F - Huawei Technologies Ltd + 0030CD + CONEXANT SYSTEMS, INC. - 00A0F4 - GE + 00305B + Toko Inc. - AC0D1B - LG Electronics (Mobile Communications) + 003029 + OPICOM - F0D1B8 - Ledvance + 003083 + Ivron Systems - 986D35 - IEEE Registration Authority + 0030B6 + Cisco Systems, Inc - 88795B - Konka Group Ltd + 00D03E + ROCKETCHIPS, INC. - 081F71 - TP-Link Technologies Ltd + 00D093 + TQ - COMPONENTS GMBH - 5CCA1A - Microsoft Mobile Oy + 00D03F + AMERICAN COMMUNICATION - FC2FAA - Nokia + 00D0F9 + ACUTE COMMUNICATIONS CORP. - B07E70 - Zadara Storage Ltd + 00D0F7 + NEXT NETS CORPORATION - 0080B1 - Softcom A/S + 00D044 + ALIDIAN NETWORKS, INC. - 202DF8 - Digital Media Cartridge Ltd + 00D018 + QWES. COM, INC. - 10D0AB - ZTE Corporation + 00D077 + LUCENT TECHNOLOGIES - 0004C6 - Yamaha Motor Ltd + 00D028 + Harmonic, Inc - 18A3E8 - Fiberhome Telecommunication Technologies Ltd + 00D025 + XROSSTECH, INC. - 741E93 - Fiberhome Telecommunication Technologies Ltd + 00D007 + MIC ASSOCIATES, INC. - 202D07 - Samsung Electronics Ltd + 00D0FF + Cisco Systems, Inc - D8803C - Anhui Huami Information Technology Company Limited + 00D05B + ACROLOOP MOTION CONTROL - 0034DA - LG Electronics (Mobile Communications) + 00D042 + MAHLO GMBH & CO. UG - 3810D5 - AVM Audiovisuelles Marketing und Computersysteme GmbH + 00D031 + INDUSTRIAL LOGIC CORPORATION - 18C501 - Shenzhen Gongjin Electronics Ltd + 00D038 + FIVEMERE, LTD. - 00A0B8 - NetApp + 00D0C6 + THOMAS & BETTS CORP. - 00C88B - Cisco Systems Inc. + 0001A7 + UNEX TECHNOLOGY CORPORATION - 24C3F9 - Securitas Direct AB + 00D0A9 + SHINANO KENSHI CO., LTD. - 2C21D7 - IMAX Corporation + 00D0DD + SUNRISE TELECOM, INC. - 0009D2 - Mai Logic Inc. + 00D0E6 + IBOND INC. - 006016 - Clariion + 00D0D1 + Sycamore Networks - 981FB1 - Shenzhen Lemon Network Technology Ltd + 00D087 + MICROFIRST INC. - 0C5A9E - Wi-SUN Alliance + 00D091 + SMARTSAN SYSTEMS, INC. - B44BD2 - Apple + 00D040 + SYSMATE CO., LTD. - DC415F - Apple + 00D08C + GENOA TECHNOLOGY, INC. - 641225 - Cisco Systems Inc. + 00D059 + AMBIT MICROSYSTEMS CORP. - 7864E6 - Green Motive Technology Limited + 00D0FD + OPTIMA TELE.COM, INC. - 3CBEE1 - Nikon Corporation + 00D027 + APPLIED AUTOMATION, INC. - 102AB3 - Xiaomi Communications Ltd + 00D080 + EXABYTE CORPORATION - 40D357 - Ison Technology Ltd + 00D04E + LOGIBAG - A41588 - ARRIS Group Inc. + 00D02C + CAMPBELL SCIENTIFIC, INC. - F45C89 - Apple + 00D0CD + ATAN TECHNOLOGY INC. - 20768F - Apple + 00D0A6 + LANBIRD TECHNOLOGY CO., LTD. - 0011D1 - Soft Imaging System GmbH + 00D049 + IMPRESSTEK CO., LTD. - 98D686 - Chyi Lee Industry Ltd + 00D003 + COMDA ENTERPRISES CORP. - 8CC661 - Current, powered by GE + 00D0D2 + EPILOG CORPORATION - 88A084 - Formation Data Systems + 00D06F + KMC CONTROLS - E8B2AC - Apple + 00D089 + DYNACOLOR, INC. - E49A79 - Apple + 00D072 + BROADLOGIC - 30A9DE - LG Innotek + 00D0E2 + MRT MICRO, INC. - F01B6C - Vivo Mobile Communication Ltd + 00D01A + URMET TLC S.P.A. - A0B9ED - Skytap + 00D06A + LINKUP SYSTEMS CORPORATION - 94C960 - Zhongshan B&T technology Ltd + 0050F9 + Sensormatic Electronics LLC - 74C330 - Shenzhen Fast Technologies Ltd + 005048 + INFOLIBRIA - 403F8C - TP-Link Technologies Ltd + 00504E + SIERRA MONITOR CORP. - DCB3B4 - Honeywell Environmental & Combustion Controls (Tianjin) Ltd + 0050D7 + TELSTRAT - 001D3B - Nokia Danmark A/S + 0050F6 + PAN-INTERNATIONAL INDUSTRIAL CORP. - 001DFD - Nokia Danmark A/S + 0050E6 + HAKUSAN CORPORATION - 001E3B - Nokia Danmark A/S + 00503C + TSINGHUA NOVEL ELECTRONICS - 001EA4 - Nokia Danmark A/S + 005060 + TANDBERG TELECOM AS - 0026CC - Nokia Danmark A/S + 0050EE + TEK DIGITEL CORPORATION - 000EED - Nokia Danmark A/S + 0050FF + HAKKO ELECTRONICS CO., LTD. - 4C2578 - Nokia Corporation + 0050D2 + CMC Electronics Inc - BCC6DB - Nokia Corporation + 005068 + ELECTRONIC INDUSTRIES ASSOCIATION - 00119F - Nokia Danmark A/S + 00501C + JATOM SYSTEMS, INC. - 001A16 - Nokia Danmark A/S + 00507A + XPEED, INC. - 001A89 - Nokia Danmark A/S + 00502E + CAMBEX CORPORATION - 001ADC - Nokia Danmark A/S + 00506E + CORDER ENGINEERING CORPORATION - 0025CF - Nokia Danmark A/S + 00502C + SOYO COMPUTER, INC. - 0021AB - Nokia Danmark A/S + 00D0CC + TECHNOLOGIES LYRE INC. - 001FDE - Nokia Danmark A/S + 005077 + PROLIFIC TECHNOLOGY, INC. - 001FDF - Nokia Danmark A/S + 00506C + Beijer Electronics Products AB - 547975 - Nokia Corporation + 005044 + ASACA CORPORATION - A87B39 - Nokia Corporation + 00500E + CHROMATIS NETWORKS, INC. - 00247C - Nokia Danmark A/S + 005033 + MAYAN NETWORKS - 002266 - Nokia Danmark A/S + 005045 + RIOWORKS SOLUTIONS, INC. - 0021FE - Nokia Danmark A/S + 00502B + GENRAD LTD. - C477AB - Beijing ASU Tech Ltd + 0050EC + OLICOM A/S - 000BCA - Datavan TC + 0050C9 + MASPRO DENKOH CORP. - 702559 - CyberTAN Technology Inc. + 005069 + PixStream Incorporated - 607EDD - Microsoft Mobile Oy + 00504F + OLENCOM ELECTRONICS - A8A089 - Tactical Communications + 0050C0 + GATAN, INC. - 48365F - Wintecronics Ltd + 005051 + IWATSU ELECTRIC CO., LTD. - 001D20 - Comtrend Corporation + 0050BB + CMS TECHNOLOGIES - 08373D - Samsung Electronics Ltd + 005062 + KOUWELL ELECTRONICS CORP. ** - 0C75BD - Cisco Systems Inc. + 0050D5 + AD SYSTEMS CORP. - 300D43 - Microsoft Mobile Oy + 0050F3 + GLOBAL NET INFORMATION CO., Ltd. - 00000E - Fujitsu Limited + 0050BE + FAST MULTIMEDIA AG - 000B5D - Fujitsu Limited + 00506F + G-CONNECT - C488E5 - Samsung Electronics Ltd + 005007 + SIEMENS TELECOMMUNICATION SYSTEMS LIMITED - 080581 - Roku Inc. + 005022 + ZONET TECHNOLOGY, INC. - 000DF3 - Asmax Solutions + 005040 + Panasonic Electric Works Co., Ltd. - 80ACAC - Juniper Networks + 0050F8 + ENTREGA TECHNOLOGIES, INC. - 000DB6 - Broadcom + 005042 + SCI MANUFACTURING SINGAPORE PTE, LTD. - 000AF7 - Broadcom + 0050EB + ALPHA-TOP CORPORATION - D40129 - Broadcom + 0050EF + SPE Systemhaus GmbH - 001D00 - Brivo Systems LLC + 005098 + GLOBALOOP, LTD. - 0020D6 - Breezecom Ltd + 0050BC + HAMMER STORAGE SOLUTIONS - 00E063 - Cabletron Systems Inc. + 009071 + Applied Innovation Inc. - FCC734 - Samsung Electronics Ltd + 009018 + ITO ELECTRIC INDUSTRY CO, LTD. - 8425DB - Samsung Electronics Ltd + 0090CD + ENT-EMPRESA NACIONAL DE TELECOMMUNICACOES, S.A. - B0EC71 - Samsung Electronics Ltd + 0090D0 + Thomson Telecom Belgium - E458B8 - Samsung Electronics Ltd + 00909B + MARKEM-IMAJE - 088C2C - Samsung Electronics Ltd + 009022 + IVEX - 64B853 - Samsung Electronics Ltd + 009016 + ZAC - 389496 - Samsung Electronics Ltd + 0090FF + TELLUS TECHNOLOGY INC. - 5056BF - Samsung Electronics Ltd + 00903E + N.V. PHILIPS INDUSTRIAL ACTIVITIES - 90F1AA - Samsung Electronics Ltd + 0090BA + VALID NETWORKS, INC. - 1077B1 - Samsung Electronics Ltd + 00507D + IFP - 001FC7 - Casio Hitachi Mobile Communications Ltd + 005097 + MMC-EMBEDDED COMPUTERTECHNIK GmbH - A49A58 - Samsung Electronics Ltd + 005010 + NovaNET Learning, Inc. - 08EE8B - Samsung Electronics Ltd + 00509A + TAG ELECTRONIC SYSTEMS - 0CA42A - OB Telecom Electronic Technology Ltd + 0090D1 + LEICHU ENTERPRISE CO., LTD. - 74458A - Samsung Electronics Ltd + 009046 + DEXDYNE, LTD. - 5CDC96 - Arcadyan Technology Corporation + 0090DA + DYNARC, INC. - 743170 - Arcadyan Technology Corporation + 0090E0 + SYSTRAN CORP. - 001A2A - Arcadyan Technology Corporation + 009094 + OSPREY TECHNOLOGIES, INC. - 88252C - Arcadyan Technology Corporation + 0090B3 + AGRANAT SYSTEMS - 40BA61 - ARIMA Communications Corp. + 00905D + NETCOM SICHERHEITSTECHNIK GMBH - 0011F5 - Askey Computer Corp + 0090FB + PORTWELL, INC. - 0016E3 - Askey Computer Corp + 00904F + ABB POWER T&D COMPANY, INC. - E839DF - Askey Computer Corp + 009060 + SYSTEM CREATE CORP. - 1CC63C - Arcadyan Technology Corporation + 009013 + SAMSAN CORP. - 1883BF - Arcadyan Technology Corporation + 009085 + GOLDEN ENTERPRISES, INC. - 68ED43 - BlackBerry RTS + 0090DC + TECO INFORMATION SYSTEMS - 70AAB2 - BlackBerry RTS + 0090E2 + DISTRIBUTED PROCESSING TECHNOLOGY - 00146C - Netgear + 0010A3 + OMNITRONIX, INC. - 001E2A - Netgear + 0010AD + SOFTRONICS USB, INC. - 00184D - Netgear + 0010A7 + UNEX TECHNOLOGY CORPORATION - 00040E - AVM GmbH + 0010D5 + IMASDE CANARIAS, S.A. - 9CC7A6 - AVM GmbH + 001055 + FUJITSU MICROELECTRONICS, INC. - A06391 - Netgear + 001052 + METTLER-TOLEDO (ALBSTADT) GMBH - 20E52A - Netgear + 0090C7 + ICOM INC. - 4494FC - Netgear + 009035 + ALPHA TELECOM, INC. - 200CC8 - Netgear + 0090F0 + Harmonic Video Systems Ltd. - C4473F - Huawei Technologies Ltd + 00907A + Spectralink, Inc - 744401 - Netgear + 009020 + PHILIPS ANALYTICAL X-RAY B.V. - E091F5 - Netgear + 00900F + KAWASAKI HEAVY INDUSTRIES, LTD - 000F86 - BlackBerry RTS + 0090EA + ALPHA TECHNOLOGIES, INC. - 0024D2 - Askey Computer Corp + 009077 + ADVANCED FIBRE COMMUNICATIONS - B4EEB4 - Askey Computer Corp + 009099 + ALLIED TELESIS, K.K. - E46449 - ARRIS Group Inc. + 0090A7 + CLIENTEC CORPORATION - 40FC89 - ARRIS Group Inc. + 00905C + EDMI - 2C9E5F - ARRIS Group Inc. + 0090E3 + AVEX ELECTRONICS INC. - 002636 - ARRIS Group Inc. + 0090A9 + WESTERN DIGITAL - 001CC1 - ARRIS Group Inc. + 00903C + ATLANTIC NETWORK SYSTEMS - 001E5A - ARRIS Group Inc. + 009055 + PARKER HANNIFIN CORPORATION COMPUMOTOR DIVISION - 001371 - ARRIS Group Inc. + 0090F3 + ASPECT COMMUNICATIONS - 0023EE - ARRIS Group Inc. + 009053 + DAEWOO ELECTRONICS CO., LTD. - 001ADE - ARRIS Group Inc. + 00105D + Draeger Medical - 745612 - ARRIS Group Inc. + 00102D + HITACHI SOFTWARE ENGINEERING - 0050E3 - ARRIS Group Inc. + 001033 + ACCESSLAN COMMUNICATIONS, INC. - 002136 - ARRIS Group Inc. + 001012 + PROCESSOR SYSTEMS (I) PVT LTD - 001626 - ARRIS Group Inc. + 001015 + OOmon Inc. - 0019A6 - ARRIS Group Inc. + 00106B + SONUS NETWORKS, INC. - E8C74F - Liteon Technology Corporation + 0010C3 + CSI-CONTROL SYSTEMS - D05349 - Liteon Technology Corporation + 001078 + NUERA COMMUNICATIONS, INC. - E8F724 - Hewlett Packard Enterprise + 0010DD + ENABLE SEMICONDUCTOR, INC. - 280DFC - Sony Interactive Entertainment Inc. + 00107A + AmbiCom, Inc. - 001311 - ARRIS Group Inc. + 0010B9 + MAXTOR CORP. - D0DF9A - Liteon Technology Corporation + 001091 + NO WIRES NEEDED BV - 1C659D - Liteon Technology Corporation + 001051 + CMICRO CORPORATION - 3010B3 - Liteon Technology Corporation + 001037 + CYQ've Technology Co., Ltd. - 701A04 - Liteon Technology Corporation + 00101B + CORNET TECHNOLOGY, INC. - 48D224 - Liteon Technology Corporation + 0010DC + MICRO-STAR INTERNATIONAL CO., LTD. - 20689D - Liteon Technology Corporation + 00100A + WILLIAMS COMMUNICATIONS GROUP - 7CBFB1 - ARRIS Group Inc. + 001032 + ALTA TECHNOLOGY - 080046 - Sony Corporation + 001080 + METAWAVE COMMUNICATIONS - ECF00E - AboCom + 0010F4 + Vertical Communications - 00E098 - AboCom + 001077 + SAF DRIVE SYSTEMS, LTD. - 74DAEA - Texas Instruments + 0010B3 + NOKIA MULTIMEDIA TERMINALS - 948815 - Infinique Worldwide Inc + 00101E + MATSUSHITA ELECTRONIC INSTRUMENTS CORP. - D0E44A - Murata Manufacturing Ltd + 00104D + SURTEC INDUSTRIES, INC. - 384FF0 - Azurewave Technologies Inc. + 00E06E + FAR SYSTEMS S.p.A. - E874E6 - ADB Broadband Italia + 00E06D + COMPUWARE CORPORATION - 0020E0 - Actiontec Electronics Inc. + 00E0BB + NBX CORPORATION - 002662 - Actiontec Electronics Inc. + 00E08A + GEC AVERY, LTD. - 002553 - ADB Broadband Italia + 00E07F + LOGISTISTEM s.r.l. - 00193E - ADB Broadband Italia + 00E013 + EASTERN ELECTRONIC CO., LTD. - 000827 - ADB Broadband Italia + 00E086 + Emerson Network Power, Avocent Division - 742F68 - Azurewave Technologies Inc. + 00E01B + SPHERE COMMUNICATIONS, INC. - 4C14A3 - TCL Technoly Electronics (Huizhou) Ltd + 00E0FD + A-TREND TECHNOLOGY CO., LTD. - 4CB0E8 - Beijing RongZhi xinghua technology Ltd + 00E0BD + INTERFACE SYSTEMS, INC. - D887D5 - Leadcore Technology Ltd + 00E038 + PROXIMA CORPORATION - 00F28B - Cisco Systems Inc. + 00E09C + MII - 34E6AD - Intel Corporation + 00E0E9 + DATA LABS, INC. - 081196 - Intel Corporation + 00E00C + MOTOROLA - 183DA2 - Intel Corporation + 00E00A + DIBA, INC. - 809B20 - Intel Corporation + 00E0C4 + HORNER ELECTRIC, INC. - 002314 - Intel Corporation + 00E0C5 + BCOM ELECTRONICS INC. - 340286 - Intel Corporation + 00E0EE + MAREL HF - 001CBF - Intel Corporation + 00E08E + UTSTARCOM - B4B676 - Intel Corporation + 00E03F + JATON CORPORATION - 3CA9F4 - Intel Corporation + 00E0D4 + EXCELLENT COMPUTER - B88A60 - Intel Corporation + 00E0E8 + GRETACODER Data Systems AG - 78FF57 - Intel Corporation + 00E016 + RAPID CITY COMMUNICATIONS - 9C4E36 - Intel Corporation + 00E0EA + INNOVAT COMMUNICATIONS, INC. - 3413E8 - Intel Corporation + 00E064 + SAMSUNG ELECTRONICS - 002710 - Intel Corporation + 00E069 + JAYCOR - A48E0A - DeLaval International AB + 00E0A4 + ESAOTE S.p.A. - AC2B6E - Intel Corporation + 00E0DE + DATAX NV - 9C3583 - Nipro Diagnostics Inc. + 00E005 + TECHNICAL CORP. - C06118 - TP-Link Technologies Ltd + 00E0C1 + MEMOREX TELEX JAPAN, LTD. - B82A72 - Dell Inc. + 00E084 + COMPULITE R&D - F8E079 - Motorola Mobility LLC, a Lenovo Company + 00E0A5 + ComCore Semiconductor, Inc. - CCC3EA - Motorola Mobility LLC, a Lenovo Company + 00E015 + HEIWA CORPORATION - 40786A - Motorola Mobility LLC, a Lenovo Company + 00E096 + SHIMADZU CORPORATION - 0019D1 - Intel Corporation + 00E017 + EXXACT GmbH - 0019D2 - Intel Corporation + 00E0C9 + AutomatedLogic Corporation - 001B21 - Intel Corporation + 00E0A9 + FUNAI ELECTRIC CO., LTD. - 18FF0F - Intel Corporation + 00607F + AURORA TECHNOLOGIES, INC. - 34DE1A - Intel Corporation + 00E029 + STANDARD MICROSYSTEMS CORP. - E8B1FC - Intel Corporation + 0060A5 + PERFORMANCE TELECOM CORP. - CC3D82 - Intel Corporation + 0060A1 + VPNet, Inc. - 001F3C - Intel Corporation + 006027 + Superior Modular Products - 002315 - Intel Corporation + 0060BC + KeunYoung Electronics & Communication Co., Ltd. - 00166F - Intel Corporation + 006061 + WHISTLE COMMUNICATIONS CORP. - 000A8A - Cisco Systems Inc. + 006074 + QSC LLC - 001D09 - Dell Inc. + 006076 + SCHLUMBERGER TECHNOLOGIES RETAIL PETROLEUM SYSTEMS - 0023AE - Dell Inc. + 0060EA + StreamLogic - BC305B - Dell Inc. + 006029 + CARY PERIPHERALS INC. - 388602 - Flexoptix GmbH + 0060FC + CONSERVATION THROUGH INNOVATION LTD. - 4065A3 - Sagemcom Broadband SAS + 006018 + STELLAR ONE CORPORATION - D02212 - IEEE Registration Authority + 0060F9 + DIAMOND LANE COMMUNICATIONS - 100723 - IEEE Registration Authority + 0060B6 + LAND COMPUTER CO., LTD. - A44F29 - IEEE Registration Authority + 00606C + ARESCOM - 74F8DB - IEEE Registration Authority + 00601B + MESA ELECTRONICS - A43BFA - IEEE Registration Authority + 00602E + CYCLADES CORPORATION - B8CA3A - Dell Inc. + 0060E3 + ARBIN INSTRUMENTS - ECF4BB - Dell Inc. + 006071 + MIDAS LAB, INC. - D4BED9 - Dell Inc. + 0060D4 + ELDAT COMMUNICATION LTD. - 00194B - Sagemcom Broadband SAS + 0060A4 + GEW Technologies (PTY)Ltd - 001E74 - Sagemcom Broadband SAS + 006064 + NETCOMM LIMITED - 383BC8 - 2Wire Inc. + 0060C5 + ANCOT CORP. - 60FE20 - 2Wire Inc. + 0060A9 + GESYTEC MBH - 002456 - 2Wire Inc. + 0060F2 + LASERGRAPHICS, INC. - C0830A - 2Wire Inc. + 0060C3 + NETVISION CORPORATION - 00183F - 2Wire Inc. + 00A05A + KOFAX IMAGE PRODUCTS - 000D56 - Dell Inc. + 00A052 + STANILITE ELECTRONICS PTY. LTD - 181E78 - Sagemcom Broadband SAS + 00A05E + MYRIAD LOGIC INC. - 0037B7 - Sagemcom Broadband SAS + 00A095 + ACACIA NETWORKS, INC. - 0054BD - Swelaser AB + 00A0F2 + INFOTEK COMMUNICATIONS, INC. - 001E4C - Hon Hai Precision Ind Ltd + 00A053 + COMPACT DEVICES, INC. - 20BB76 - CoL GIOVANNI PAOLO SpA + 00A069 + Symmetricom, Inc. - 3CDD89 - Somo Holdings & Tech Ltd + 00A07A + ADVANCED PERIPHERALS TECHNOLOGIES, INC. - 1801E3 - Bittium Wireless Ltd + 00A04E + VOELKER TECHNOLOGIES, INC. - 149182 - Belkin International Inc. + 006082 + NOVALINK TECHNOLOGIES, INC. - 18622C - Sagemcom Broadband SAS + 0060E7 + RANDATA - 3C81D8 - Sagemcom Broadband SAS + 006054 + CONTROLWARE GMBH - 40F201 - Sagemcom Broadband SAS + 0060C2 + MPL AG - D084B0 - Sagemcom Broadband SAS + 00609B + AstroNova, Inc - D8543A - Texas Instruments + 0060DB + NTP ELEKTRONIK A/S - 649C8E - Texas Instruments + 006052 + PERIPHERALS ENTERPRISE CO., Ltd. - 102EAF - Texas Instruments + 00A0DF + STS TECHNOLOGIES, INC. - 7C8EE4 - Texas Instruments + 00A094 + COMSAT CORPORATION - B4EED4 - Texas Instruments + 00A0EF + LUCIDATA LTD. - D03761 - Texas Instruments + 0060B2 + PROCESS CONTROL CORP. - C83E99 - Texas Instruments + 006081 + TV/COM INTERNATIONAL - 40984E - Texas Instruments + 00A005 + DANIEL INSTRUMENTS, LTD. - 0017EB - Texas Instruments + 0060D9 + TRANSYS NETWORKS INC. - 0017E6 - Texas Instruments + 00601F + STALLION TECHNOLOGIES - C4EDBA - Texas Instruments + 00600A + SORD COMPUTER CORPORATION - 001832 - Texas Instruments + 0060A8 + TIDOMAT AB - 3C2DB7 - Texas Instruments + 00A066 + ISA CO., LTD. - 5464D9 - Sagemcom Broadband SAS + 00A0AB + NETCS INFORMATIONSTECHNIK GMBH - 00195B - D-Link Corporation + 00A0D8 + SPECTRA - TEK - 000F3D - D-Link Corporation + 00A080 + Tattile SRL - 24DA11 - NO NDA Inc + 00A02B + TRANSITIONS RESEARCH CORP. - EC2280 - D-Link International + 00A0E8 + REUTERS HOLDINGS PLC - 9C8E99 - Hewlett-Packard Company + 00A008 + NETCORP - 9059AF - Texas Instruments + 00A0FD + SCITEX DIGITAL PRINTING, INC. - BC6A29 - Texas Instruments + 00A00F + Broadband Technologies - 847E40 - Texas Instruments + 00A002 + LEEDS & NORTHRUP AUSTRALIA PTY LTD - 001735 - Intel Wireless Network Group + 00A0E4 + OPTIQUEST - 74AC5F - Qiku Internet Network Scientific (Shenzhen) Ltd + 00A0EE + NASHOBA NETWORKS - 38CADA - Apple + 00A0DD + AZONIX CORPORATION - D0B33F - Shenzhen TINNO Mobile Technology Corp. + 00A0C3 + UNICOMPUTER GMBH - BCD1D3 - Shenzhen TINNO Mobile Technology Corp. + 00A00A + Airspan - D83C69 - Shenzhen TINNO Mobile Technology Corp. + 00A067 + NETWORK SERVICES GROUP - F4F5D8 - Google Inc. + 00A0E0 + TENNYSON TECHNOLOGIES PTY LTD - 8C579B - Wistron Neweb Corporation + 00A099 + K-NET LTD. - 0059AC - KPN. B.V. + 00A0EC + TRANSMITTON LTD. - 40D855 - IEEE Registration Authority + 00A028 + CONNER PERIPHERALS - 34AB37 - Apple + 00A09E + ICTV - 2400BA - Huawei Technologies Ltd + 00A020 + CITICORP/TTI - 24DF6A - Huawei Technologies Ltd + 00A0FA + Marconi Communication GmbH - 788B77 - Standar Telecom + 00A0CB + ARK TELECOMMUNICATIONS, INC. - B0C090 - Chicony Electronics Ltd + 00A050 + CYPRESS SEMICONDUCTOR - 907F61 - Chicony Electronics Ltd + 00A0CE + Ecessa - 0C0535 - Juniper Systems + 00A009 + WHITETREE NETWORK - BC83A7 - Shenzhen Chuangwei-RGB Electronics Ltd + 00A00C + KINGMAX TECHNOLOGY, INC. - BCEC23 - Shenzhen Chuangwei-RGB Electronics Ltd + 00A0BB + HILAN GMBH - 18AF61 - Apple + 00A091 + APPLICOM INTERNATIONAL - 5CF938 - Apple + 00A0A5 + TEKNOR MICROSYSTEME, INC. - 009069 - Juniper Networks + 002086 + MICROTECH ELECTRONICS LIMITED - 64649B - Juniper Networks + 002023 + T.C. TECHNOLOGIES PTY. LTD - F01C2D - Juniper Networks + 0020B2 + GKD Gesellschaft Fur Kommunikation Und Datentechnik - 307C5E - Juniper Networks + 002052 + RAGULA SYSTEMS - AC06C7 - ServerNet S.r.l. + 0020FE + TOPWARE INC. / GRAND COMPUTER - E83EFC - ARRIS Group Inc. + 002073 + FUSION SYSTEMS CORPORATION - 900DCB - ARRIS Group Inc. + 0020B7 + NAMAQUA COMPUTERWARE - 001DCD - ARRIS Group Inc. + 0020E3 + MCD KENCOM CORPORATION - 001DD2 - ARRIS Group Inc. + 002013 + DIVERSIFIED TECHNOLOGY, INC. - 8C09F4 - ARRIS Group Inc. + 0020AB + MICRO INDUSTRIES CORP. - 8857EE - Buffalo Inc. + 00A025 + REDCOM LABS INC. - 101F74 - Hewlett-Packard Company + 00A0A2 + B810 S.R.L. - 009C02 - Hewlett-Packard Company + 00A017 + J B M CORPORATION - F4CE46 - Hewlett-Packard Company + 00A034 + AXEL - DCFB02 - Buffalo Inc. + 00A001 + DRS Signal Solutions - 001635 - Hewlett-Packard Company + 00A075 + MICRON TECHNOLOGY, INC. - 0008C7 - Hewlett-Packard Company + 00208D + CMD TECHNOLOGY - 0010E3 - Hewlett-Packard Company + 0020DD + Cybertec Pty Ltd - 000883 - Hewlett-Packard Company + 0020E6 + LIDKOPING MACHINE TOOLS AB - A02BB8 - Hewlett-Packard Company + 00A054 + Private - 0019BB - Hewlett-Packard Company + 00A0E7 + CENTRAL DATA CORPORATION - 001F29 - Hewlett-Packard Company + 002026 + AMKLY SYSTEMS, INC. - 00215A - Hewlett-Packard Company + 002065 + SUPERNET NETWORKING INC. - 00237D - Hewlett-Packard Company + 002019 + OHLER GMBH - E8ED05 - ARRIS Group Inc. + 00209E + BROWN'S OPERATING SYSTEM SERVICES, LTD. - 789684 - ARRIS Group Inc. + 002035 + IBM Corp - CC65AD - ARRIS Group Inc. + 00207A + WiSE Communications, Inc. - 002655 - Hewlett-Packard Company + 00203E + LogiCan Technologies, Inc. - 000D9D - Hewlett-Packard Company + 002058 + ALLIED SIGNAL INC. - 001560 - Hewlett-Packard Company + 00208E + CHEVIN SOFTWARE ENG. LTD. - 00207B - Intel Corporation + 00209B + ERSAT ELECTRONIC GMBH - 001175 - Intel Corporation + 00201C + EXCEL, INC. - 780CB8 - Intel Corporation + 00207F + KYOEI SANGYO CO., LTD. - 185E0F - Intel Corporation + 00205A + COMPUTER IDENTICS - 2C8158 - Hon Hai Precision Ind Ltd + 002000 + LEXMARK INTERNATIONAL, INC. - 8002DF - ORA Inc. + 00201D + KATANA PRODUCTS - 00306E - Hewlett-Packard Company + 002046 + CIPRICO, INC. - 3C4A92 - Hewlett-Packard Company + 00205B + Kentrox, LLC - 7C7D3D - Huawei Technologies Ltd + 0020D3 + OST (OUEST STANDARD TELEMATIQU - 4482E5 - Huawei Technologies Ltd + 0020F6 + NET TEK AND KARLNET, INC. - 00234E - Hon Hai Precision Ind Ltd + 0020B0 + GATEWAY DEVICES, INC. - 2C233A - Hewlett-Packard Company + 00202A + N.V. DZINE - 000A57 - Hewlett-Packard Company + 002083 + PRESTICOM INCORPORATED - 0001E7 - Hewlett-Packard Company + 0020C9 + VICTRON BV - 0001E6 - Hewlett-Packard Company + 002077 + KARDIOS SYSTEMS CORP. - 002376 - HTC Corporation + 002097 + APPLIED SIGNAL TECHNOLOGY - 38E7D8 - HTC Corporation + 00C0C9 + ELSAG BAILEY PROCESS - 188796 - HTC Corporation + 00C048 + BAY TECHNICAL ASSOCIATES - B4CEF6 - HTC Corporation + 00C00E + PSITECH, INC. - 8CDCD4 - Hewlett-Packard Company + 00C031 + DESIGN RESEARCH SYSTEMS, INC. - D4C9EF - Hewlett-Packard Company + 000701 + RACAL-DATACOM - FC15B4 - Hewlett-Packard Company + 00C09C + HIOKI E.E. CORPORATION - 3CA82A - Hewlett-Packard Company + 002008 + CABLE & COMPUTER TECHNOLOGY - EC5F23 - Qinghai Kimascend Electronics Technology Ltd + 00C00B + NORCONTROL A.S. - 047D50 - Shenzhen Kang Ying Technology Ltd + 00C0FD + PROSUM - 54EFFE - Fullpower Technologies Inc. + 00C076 + I-DATA INTERNATIONAL A-S - 940937 - HUMAX Ltd + 00C046 + Blue Chip Technology Ltd - E84DD0 - Huawei Technologies Ltd + 00C014 + TELEMATICS CALABASAS INT'L,INC - 0C45BA - Huawei Technologies Ltd + 00AA3C + OLIVETTI TELECOM SPA (OLTECO) - 20906F - Shenzhen Tencent Computer System Ltd + 00C011 + INTERACTIVE COMPUTING DEVICES - 6CE3B6 - Nera Telecommunications Ltd + 00C03E + FA. GEBR. HELLER GMBH - DCD321 - HUMAX Ltd + 00C060 + ID SCANDINAVIA AS - 6C72E7 - Apple + 0020C6 + NECTEC - 741BB2 - Apple + 00C09E + CACHE COMPUTERS, INC. - 6CE873 - TP-Link Technologies Ltd + 00C0AC + GAMBIT COMPUTER COMMUNICATIONS - C46E1F - TP-Link Technologies Ltd + 00C034 + TRANSACTION NETWORK - 50FA84 - TP-Link Technologies Ltd + 00C093 + ALTA RESEARCH CORP. - 44B32D - TP-Link Technologies Ltd + 00C02C + CENTRUM COMMUNICATIONS, INC. - CC4463 - Apple + 0040E7 + ARNOS INSTRUMENTS & COMPUTER - 882593 - TP-Link Technologies Ltd + 004087 + UBITREX CORPORATION - 001FE1 - Hon Hai Precision Ind Ltd + 004007 + TELMAT INFORMATIQUE - D85D4C - TP-Link Technologies Ltd + 00407B + SCIENTIFIC ATLANTA - A0F3C1 - TP-Link Technologies Ltd + 00402C + ISIS DISTRIBUTED SYSTEMS, INC. - 001D0F - TP-Link Technologies Ltd + 0040CC + SILCOM MANUF'G TECHNOLOGY INC. - 0023CD - TP-Link Technologies Ltd + 00C054 + NETWORK PERIPHERALS, LTD. - 90489A - Hon Hai Precision Ind Ltd + 00C022 + LASERMASTER TECHNOLOGIES, INC. - 0071CC - Hon Hai Precision Ind Ltd + 00C025 + DATAPRODUCTS CORPORATION - B05B67 - Huawei Technologies Ltd + 00C0DF + KYE Systems Corp. - CCA223 - Huawei Technologies Ltd + 00C0F5 + METACOMP, INC. - 786A89 - Huawei Technologies Ltd + 00C091 + JABIL CIRCUIT, INC. - 384608 - ZTE Corporation + 00C049 + U.S. ROBOTICS, INC. - 4CAC0A - ZTE Corporation + 00C09D + DISTRIBUTED SYSTEMS INT'L, INC - B4B362 - ZTE Corporation + 00C0E9 + OAK SOLUTIONS, LTD. - B075D5 - ZTE Corporation + 00C0C5 + SID INFORMATICA - D0154A - ZTE Corporation + 00C051 + ADVANCED INTEGRATION RESEARCH - 0026ED - ZTE Corporation + 00C085 + ELECTRONICS FOR IMAGING, INC. - 006057 - Murata Manufacturing Ltd + 00C066 + DOCUPOINT, INC. - 783E53 - BSkyB Ltd + 00C02D + FUJI PHOTO FILM CO., LTD. - 0019FB - BSkyB Ltd + 00C0BD + INEX TECHNOLOGIES, INC. - 14B968 - Huawei Technologies Ltd + 00C088 + EKF ELEKTRONIK GMBH - 5CF96A - Huawei Technologies Ltd + 00C097 + ARCHIPEL SA - 083E8E - Hon Hai Precision Ind Ltd + 00C004 + JAPAN BUSINESS COMPUTER CO.LTD - 002293 - ZTE Corporation + 00C0AA + SILICON VALLEY COMPUTER - 10A5D0 - Murata Manufacturing Ltd + 00C0B2 + NORAND CORPORATION - 50A72B - Huawei Technologies Ltd + 00C0FB + ADVANCED TECHNOLOGY LABS - 0CD6BD - Huawei Technologies Ltd + 0040CF + STRAWBERRY TREE, INC. - 00F81C - Huawei Technologies Ltd + 004077 + MAXTON TECHNOLOGY CORPORATION - 087A4C - Huawei Technologies Ltd + 00C02B + GERLOFF GESELLSCHAFT FUR - ACE215 - Huawei Technologies Ltd + 00405B + FUNASSET LIMITED - 346BD3 - Huawei Technologies Ltd + 004012 + WINDATA, INC. - 70723C - Huawei Technologies Ltd + 0040D5 + Sartorius Mechatronics T&H GmbH - ACE87B - Huawei Technologies Ltd + 0040BF + CHANNEL SYSTEMS INTERN'L INC. - F83DFF - Huawei Technologies Ltd + 00401E + ICC - 285FDB - Huawei Technologies Ltd + 00409A + NETWORK EXPRESS, INC. - 404D8E - Huawei Technologies Ltd + 004094 + SHOGRAPHICS, INC. - 4C5499 - Huawei Technologies Ltd + 0040E2 + MESA RIDGE TECHNOLOGIES, INC. - F49FF3 - Huawei Technologies Ltd + 0040C4 + KINKEI SYSTEM CORPORATION - 240995 - Huawei Technologies Ltd + 004022 + KLEVER COMPUTERS, INC. - 84DBAC - Huawei Technologies Ltd + 004074 + CABLE AND WIRELESS - 94772B - Huawei Technologies Ltd + 0040B8 + IDEA ASSOCIATES - D440F0 - Huawei Technologies Ltd + 0040E8 + CHARLES RIVER DATA SYSTEMS,INC - 04021F - Huawei Technologies Ltd + 0040C0 + VISTA CONTROLS CORPORATION - 10CDAE - Avaya Inc + 00C010 + HIRAKAWA HEWTECH CORP. - 048A15 - Avaya Inc + 00C037 + DYNATEM - B4B017 - Avaya Inc + 004083 + TDA INDUSTRIA DE PRODUTOS - 90FB5B - Avaya Inc + 00405D + STAR-TEK, INC. - C8F406 - Avaya Inc + 004008 + A PLUS INFO CORPORATION - 7052C5 - Avaya Inc + 0040B5 + VIDEO TECHNOLOGY COMPUTERS LTD - F81547 - Avaya Inc + 004073 + BASS ASSOCIATES - 506184 - Avaya Inc + 00407D + EXTENSION TECHNOLOGY CORP. - 185936 - Xiaomi Communications Ltd + 00404D + TELECOMMUNICATIONS TECHNIQUES - 20A783 - miControl GmbH + 00400D + LANNET DATA COMMUNICATIONS,LTD - 200BC7 - Huawei Technologies Ltd + 0080D7 + Fantum Engineering - F84ABF - Huawei Technologies Ltd + 00807A + AITECH SYSTEMS LTD. - 78D752 - Huawei Technologies Ltd + 0080DC + PICKER INTERNATIONAL - 104780 - Huawei Technologies Ltd + 00C0A0 + ADVANCE MICRO RESEARCH, INC. - 548998 - Huawei Technologies Ltd + 004019 + AEON SYSTEMS, INC. - 00040D - Avaya Inc + 0040BE + BOEING DEFENSE & SPACE - 70A8E3 - Huawei Technologies Ltd + 00406E + COROLLARY, INC. - F8E811 - Huawei Technologies Ltd + 004076 + Sun Conversion Technologies - F8A45F - Xiaomi Communications Ltd + 004028 + NETCOMM LIMITED - 640980 - Xiaomi Communications Ltd + 0040CB + LANWAN TECHNOLOGIES - 94049C - Huawei Technologies Ltd + 0040B2 + SYSTEMFORSCHUNG - 688F84 - Huawei Technologies Ltd + 0040E6 + C.A.E.N. - 30D17E - Huawei Technologies Ltd + 004010 + SONIC SYSTEMS, INC. - 0050BD - Cisco Systems Inc. + 0040CA + FIRST INTERNAT'L COMPUTER, INC - 00906F - Cisco Systems Inc. + 00408B + RAYLAN CORPORATION - 74D6EA - Texas Instruments + 0040EF + HYPERCOM, INC. - 209148 - Texas Instruments + 004093 + PAXDATA NETWORKS LTD. - 544A16 - Texas Instruments + 004085 + SAAB INSTRUMENTS AB - E02F6D - Cisco Systems Inc. + 004023 + LOGIC CORPORATION - 58971E - Cisco Systems Inc. + 0040F0 + MicroBrain,Inc. - B4E9B0 - Cisco Systems Inc. + 004089 + MEIDENSHA CORPORATION - 000832 - Cisco Systems Inc. + 004055 + METRONIX GMBH - 189C5D - Cisco Systems Inc. + 004027 + SMC MASSACHUSETTS, INC. - 5CA48A - Cisco Systems Inc. + 004045 + TWINHEAD CORPORATION - 1C1D86 - Cisco Systems Inc. + 0040A4 + ROSE ELECTRONICS - 60735C - Cisco Systems Inc. + 008080 + DATAMEDIA CORPORATION - 34A84E - Cisco Systems Inc. + 008082 + PEP MODULAR COMPUTERS GMBH - 54781A - Cisco Systems Inc. + 008071 + SAI TECHNOLOGY - 00605C - Cisco Systems Inc. + 008098 + TDK CORPORATION - 0006C1 - Cisco Systems Inc. + 00803F + TATUNG COMPANY - 00E014 - Cisco Systems Inc. + 0080E6 + PEER NETWORKS, INC. - DCA5F4 - Cisco Systems Inc. + 0080E0 + XTP SYSTEMS, INC. - 5017FF - Cisco Systems Inc. + 00802B + INTEGRATED MARKETING CO - 70105C - Cisco Systems Inc. + 004015 + ASCOM INFRASYS AG - 10F311 - Cisco Systems Inc. + 008056 + SPHINX Electronics GmbH & Co KG - 0050F0 - Cisco Systems Inc. + 008031 + BASYS, CORP. - 005014 - Cisco Systems Inc. + 00803A + VARITYPER, INC. - 0090F2 - Cisco Systems Inc. + 008088 + VICTOR COMPANY OF JAPAN, LTD. - 0CE0E4 - Plantronics Inc. + 008001 + PERIPHONICS CORPORATION - 74A2E6 - Cisco Systems Inc. + 008097 + CENTRALP AUTOMATISMES - BCF1F2 - Cisco Systems Inc. + 008041 + VEB KOMBINAT ROBOTRON - C80084 - Cisco Systems Inc. + 00801C + NEWPORT SYSTEMS SOLUTIONS - 40A6E8 - Cisco Systems Inc. + 008095 + BASIC MERTON HANDELSGES.M.B.H. - 3085A9 - ASUSTek Computer Inc. + 0080AE + HUGHES NETWORK SYSTEMS - B83861 - Cisco Systems Inc. + 0080DB + GRAPHON CORPORATION - 580A20 - Cisco Systems Inc. + 0080D8 + NETWORK PERIPHERALS INC. - 2C3ECF - Cisco Systems Inc. + 00809E + DATUS GMBH - B05947 - Shenzhen Qihu Intelligent Technology Company Limited + 008013 + THOMAS-CONRAD CORPORATION - 346288 - Cisco Systems Inc. + 00806E + NIPPON STEEL CORPORATION - CCD8C1 - Cisco Systems Inc. + 008010 + COMMODORE INTERNATIONAL - 7C0ECE - Cisco Systems Inc. + 0080D5 + CADRE TECHNOLOGIES - A0ECF9 - Cisco Systems Inc. + 00801B + KODIAK TECHNOLOGY - 508789 - Cisco Systems Inc. + 0080D3 + SHIVA CORP. - 381C1A - Cisco Systems Inc. + 0080B3 + AVAL DATA CORPORATION - BC671C - Cisco Systems Inc. + 008045 + MATSUSHITA ELECTRIC IND. CO - 001947 - Cisco SPVTG + 008020 + NETWORK PRODUCTS - 001839 - Cisco-Linksys LLC + 008070 + COMPUTADORAS MICRON - 002215 - ASUSTek Computer Inc. + 008008 + DYNATECH COMPUTER SYSTEMS - E0CB4E - ASUSTek Computer Inc. + 0000E4 + IN2 GROUPE INTERTECHNIQUE - 547C69 - Cisco Systems Inc. + 008039 + ALCATEL STC AUSTRALIA - 001731 - ASUSTek Computer Inc. + 008023 + INTEGRATED BUSINESS NETWORKS - DCCEC1 - Cisco Systems Inc. + 00806B + SCHMID TELECOMMUNICATION - 9C57AD - Cisco Systems Inc. + 008059 + STANLEY ELECTRIC CO., LTD - 60FEC5 - Apple + 0080CA + NETCOM RESEARCH INCORPORATED - E425E7 - Apple + 000094 + ASANTE TECHNOLOGIES - BC926B - Apple + 000090 + MICROCOM - 101C0C - Apple + 000047 + NICOLET INSTRUMENTS CORP. - 080007 - Apple + 000070 + HCL LIMITED - 004096 - Cisco Systems Inc. + 00008F + Raytheon - 30F70D - Cisco Systems Inc. + 0080A1 + MICROTEST, INC. - E86549 - Cisco Systems Inc. + 0080A9 + CLEARPOINT RESEARCH - B07D47 - Cisco Systems Inc. + 0080F9 + HEURIKON CORPORATION - 38ED18 - Cisco Systems Inc. + 008047 + IN-NET CORP. - 382056 - Cisco Systems Inc. + 008067 + SQUARE D COMPANY - 40D32D - Apple + 0080BF + TAKAOKA ELECTRIC MFG. CO. LTD. - C42C03 - Apple + 008017 + PFU LIMITED - 9027E4 - Apple + 0080F8 + MIZAR, INC. - 109ADD - Apple + 0000A1 + MARQUETTE ELECTRIC CO. - 581FAA - Apple + 0000F5 + DIAMOND SALES LIMITED - 88C663 - Apple + 00005C + TELEMATICS INTERNATIONAL INC. - 001F5B - Apple + 0000AC + CONWARE COMPUTER CONSULTING - 002436 - Apple + 000026 + SHA-KEN CO., LTD. - 00254B - Apple + 0000B6 + MICRO-MATIC RESEARCH - 0016CB - Apple + 000082 + LECTRA SYSTEMES SA - 0017F2 - Apple + 00002B + CRISP AUTOMATION, INC - 7C6D62 - Apple + 000014 + NETRONIX - 20C9D0 - Apple + 000072 + MINIWARE TECHNOLOGY - 68967B - Apple + 000046 + OLIVETTI NORTH AMERICA - 84FCFE - Apple + 00008D + Cryptek Inc. - E48B7F - Apple + 00003B + i Controls, Inc. - 008865 - Apple + 000098 + CROSSCOMM CORPORATION - BC3BAF - Apple + 0000C6 + EON SYSTEMS - 3CE072 - Apple + 00008B + INFOTRON - 38484C - Apple + 000074 + RICOH COMPANY LTD. - A46706 - Apple + 000035 + SPECTRAGRAPHICS CORPORATION - 8C5877 - Apple + 000021 + SUREMAN COMP. & COMMUN. CORP. - 7CF05F - Apple + 000051 + HOB ELECTRONIC GMBH & CO. KG - 804971 - Apple + 0000A7 + NETWORK COMPUTING DEVICES INC. - 6C3E6D - Apple + 000030 + VG LABORATORY SYSTEMS LTD - BC6778 - Apple + 000020 + DATAINDUSTRIER DIAB AB - D8D1CB - Apple + 00007A + DANA COMPUTER INC. - A8FAD8 - Apple + 000045 + FORD AEROSPACE & COMM. CORP. - B817C2 - Apple + 00009C + ROLM MIL-SPEC COMPUTERS - 7C11BE - Apple + 00007C + AMPERE INCORPORATED - 283737 - Apple + 080071 + MATRA (DSIE) - 50EAD6 - Apple + 08006C + SUNTEK TECHNOLOGY INT'L - 98D6BB - Apple + 080067 + ComDesign - 189EFC - Apple + 08005D + GOULD INC. - ACCF5C - Apple + 08005B + VTA TECHNOLOGIES INC. - 80006E - Apple + 000068 + ROSEMOUNT CONTROLS - 848E0C - Apple + 0000E9 + ISICAD, INC. - 3C15C2 - Apple + 00009F + AMERISTAR TECHNOLOGIES INC. - 6C709F - Apple + 0000E3 + INTEGRATED MICRO PRODUCTS LTD - C0F2FB - Apple + 0000AD + BRUKER INSTRUMENTS INC. - 24E314 - Apple + 0000D3 + WANG LABORATORIES INC. - 80E650 - Apple + 0000D0 + DEVELCON ELECTRONICS LTD. - 90FD61 - Apple + 000093 + PROTEON INC. - 087045 - Apple + 080057 + Evans & Sutherland - A88808 - Apple + 080081 + ASTECH INC. - A4C361 - Apple + 0000B3 + CIMLINC INCORPORATED - 2CF0EE - Apple + 08008C + NETWORK RESEARCH CORPORATION - 5C97F3 - Apple + 0000F1 + MAGNA COMPUTER CORPORATION - D4F46F - Apple + 000054 + Schneider Electric - 6476BA - Apple + 040AE0 + XMIT AG COMPUTER NETWORKS - 34E2FD - Apple + 00DD00 + UNGERMANN-BASS INC. - 04489A - Apple + 0000AA + XEROX CORPORATION - F0F61C - Apple + 080011 + TEKTRONIX INC. - 8C2937 - Apple + 080017 + NATIONAL SEMICONDUCTOR - B09FBA - Apple + 08001D + ABLE COMMUNICATIONS INC. - 0C4DE9 - Apple + 00DD0B + UNGERMANN-BASS INC. - E0F5C6 - Apple + 08002D + LAN-TEC INC. - A0EDCD - Apple + 080026 + NORSK DATA A.S. - F0F249 - Hitron Technologies Inc. + 080025 + CONTROL DATA - 2857BE - Hangzhou Hikvision Digital Technology Ltd + 100000 + Private - 5CF5DA - Apple + 0000D7 + DARTMOUTH COLLEGE - 18EE69 - Apple + F809A4 + Henan Thinker Rail Transportation Research Inc. - 649ABE - Apple + 080003 + ADVANCED COMPUTER COMM. - F099BF - Apple + 00DD0F + UNGERMANN-BASS INC. - 94E96A - Apple + 000001 + XEROX CORPORATION - AC293A - Apple + 00DD03 + UNGERMANN-BASS INC. - 9CFC01 - Apple + AA0004 + DIGITAL EQUIPMENT CORPORATION - 9C35EB - Apple + 08000C + MIKLYN DEVELOPMENT CO. - 48437C - Apple + 00DD05 + UNGERMANN-BASS INC. - 34A395 - Apple + 9CF55F + Harman/Becker Automotive Systems GmbH - 787E61 - Apple + 902C09 + Apple, Inc. - 60F81D - Apple + A0B40F + Apple, Inc. - 38C986 - Apple + 48D017 + Telecom Infra Project - D03311 - Apple + EC0D51 + Apple, Inc. - 507A55 - Apple + ACDFA1 + Apple, Inc. - C8C2C6 - Shanghai Airm2m Communication Technology Ltd + C8CCB5 + Hunter Douglas - 789C85 - August Home Inc. + C05F87 + Legrand INTELLIGENT ELECTRICAL(HUIZHOU)CO.,LTD. - 74D7CA - Panasonic Corporation Automotive + 807C0A + zte corporation - 5882A8 - Microsoft Corporation + 48836F + EM Microelectronic - 58685D - Tempo Australia Pty Ltd + F4832C + OHSUNG - 544B8C - Juniper Networks + 685210 + MCS Logic - DCFE07 - Pegatron Corporation + A87C45 + HUAWEI TECHNOLOGIES CO.,LTD - 707938 - Wuxi Zhanrui Electronic Technology Ltd + 2CEDB0 + HUAWEI TECHNOLOGIES CO.,LTD - 243184 - Sharp Corporation + 2C693E + HUAWEI TECHNOLOGIES CO.,LTD - 582BDB - Pax AB + 14DAB9 + Huawei Device Co., Ltd. - E03676 - Huawei Technologies Ltd + B0CAE7 + Huawei Device Co., Ltd. - EC388F - Huawei Technologies Ltd + DC621F + HUAWEI TECHNOLOGIES CO.,LTD - D03E5C - Huawei Technologies Ltd + 48EDE6 + Zyxel Communications Corporation - C49E41 - G24 Power Limited + 70BDD2 + Adva Network Security GmbH - B813E9 - Trace Live Network + A410B6 + Cisco Systems, Inc - 80B709 - Viptela Inc. + C84709 + Cisco Systems, Inc - F00D5C - JinQianMao Technology Ltd + 00D598 + BOPEL MOBILE TECHNOLOGY CO.,LIMITED - 54BE53 - ZTE Corporation + 904528 + Nintendo Co.,Ltd - 280E8B - Beijing Spirit Technology Development Ltd + F45246 + ASKEY COMPUTER CORP - F44D30 - Elitegroup Computer Systems Ltd + 3C25F8 + Dell Inc. - 0C8610 - Juniper Networks + 000324 + LIMNO Co., Ltd. - 38D40B - Samsung Electronics Ltd + D00B27 + Murata Manufacturing Co., Ltd. - E83A12 - Samsung Electronics Ltd + 4C5739 + Samsung Electronics Co.,Ltd - 24DA9B - Motorola Mobility LLC, a Lenovo Company + 6C1629 + Edifier International - A4DCBE - Huawei Technologies Ltd + F037CF + Huawei Device Co., Ltd. - ECB870 - Beijing Heweinet Technology Ltd + 2CC8F5 + Huawei Device Co., Ltd. - 94BBAE - Husqvarna AB + 48E533 + Sunnovo International Limited - D40AA9 - ARRIS Group Inc. + F0FDDD + Foxtron Vehicle Technologies Co., Ltd. - 203D66 - ARRIS Group Inc. + AC361B + Hon Hai Precision Industry Co.,LTD - D494E8 - Huawei Technologies Ltd + B8060D + Tuya Smart Inc. - B078F0 - Beijing HuaqinWorld Technology Ltd + C8E193 + ITEL MOBILE LIMITED - 209BCD - Apple + D4A23D + New H3C Technologies Co., Ltd - 3095E3 - Shanghai Simcom Limited + 9C1ECE + ALT Co., Ltd. - 80656D - Samsung Electronics Ltd + 001F9C + Havis Inc. - FCF136 - Samsung Electronics Ltd + 806599 + Espressif Inc. - B88687 - Liteon Technology Corporation + BC9A8E + HUMAX NETWORKS - 18895B - Samsung Electronics Ltd + 502065 + Quectel Wireless Solutions Co.,Ltd. - 584925 - E3 Enterprise + FC478D + SHENZHEN TOPWELL TECHNOLOGY CO., LTD. - 94F278 - Elma Electronic + 28CB5C + Shenzhen CPETEK Technology Co.,Ltd. - 283713 - Shenzhen 3Nod Digital Technology Ltd + D05BCB + Tianyi Telecom Terminals Company Limited - 0894EF - Wistron Infocomm (Zhongshan) Corporation + 00C0F2 + Lantronix - E0319E - Valve Corporation + A0004C + HISENSE VISUAL TECHNOLOGY CO.,LTD - 3C5CC3 - Shenzhen First Blue Chip Technology Ltd + E4AAE4 + Xiaomi Communications Co Ltd - C49FF3 - Mciao Technologies Inc. + 68C44C + Xiaomi Communications Co Ltd - 788E33 - Jiangsu SEUIC Technology Ltd + E4F8BE + TECNO MOBILE LIMITED - ECEED8 - ZTLX Network Technology Ltd + D8E593 + Apple, Inc. - 80EB77 - Wistron Corporation + CC68E0 + Apple, Inc. - 483974 - Proware Technologies Ltd + 102CB1 + Smart Innovation LLC - 30FFF6 - HangZhou KuoHeng Technology Ltd + 70DA48 + Cisco Systems, Inc - 4CC681 - Shenzhen Aisat Electronic Ltd + 04AEC7 + Marquardt - 48E244 - Hon Hai Precision Ind Ltd + F4B62D + Dongguan Huayin Electronic Technology Co., Ltd. - 7CAB25 - Mesmo Technology Inc. + 20108A + zte corporation - B0411D - ITTIM Technologies + 58FFA1 + zte corporation - F8BF09 - Huawei Technologies Ltd + B08B9E + Telechips, Inc. - 7CB25C - Acacia Communications + BC1FE1 + Ascendent Technology Group - DCDB70 - Tonfunk Systementwicklung und Service GmbH + B8B1EA + Honor Device Co., Ltd. - 800B51 - Chengdu XGimi Technology Ltd + 2C58B9 + HP Inc. - F80D60 - Canon Inc. + 3050F1 + Ennoconn Corporation. - F0182B - LG Chem + B0FA91 + EM Microelectronic - 3481F4 - SST Taiwan Ltd + ACDB22 + Marquardt Schaltsysteme SCS - 7CA237 - King Slide Technology Ltd + 488002 + Cisco Systems, Inc - D404CD - ARRIS Group Inc. + B46AD4 + Edgecore Americas Networking Corporation - 747336 - MICRODIGTAL Inc + AC712E + Fortinet, Inc. - 382B78 - ECO Plugs Enterprise Ltd + F801B4 + LG Electronics - A47B2C - Nokia + 5421A9 + ITEL MOBILE LIMITED - 24E5AA - Philips Oral Healthcare Inc. + 1073C6 + August Internet Limited - 78BDBC - Samsung Electronics Ltd + CCD843 + Beijing Xiaomi Mobile Software Co., Ltd - 349B5B - Maquet GmbH + C03532 + Liteon Technology Corporation - 884157 - Shenzhen Atsmart Technology Ltd + 740635 + SERNET (SUZHOU) TECHNOLOGIES CORPORATION - D89A34 - Beijing SHENQI Technology Ltd + D4F921 + Qingdao Intelligent&Precise Electronics Co.,Ltd. - A0A65C - Supercomputing Systems AG + 7CC0AA + Microsoft Corporation - 485073 - Microsoft Corporation + 60601F + SZ DJI TECHNOLOGY CO.,LTD - E8377A - ZyXEL Communications Corp + E47A2C + SZ DJI TECHNOLOGY CO.,LTD - 803B2A - ABB Xiamen Low Voltage Equipment Ltd + 94AB18 + cellXica ltd - 7CF90E - Samsung Electronics Ltd + F03F03 + Private - 50F0D3 - Samsung Electronics Ltd + C421B9 + zte corporation - 00A784 - ITX security + 08A5DF + Samsung Electronics Co.,Ltd - 84119E - Samsung Electronics Ltd + 6CD63F + HUAWEI TECHNOLOGIES CO.,LTD - 149A10 - Microsoft Corporation + 0C184E + HUAWEI TECHNOLOGIES CO.,LTD - 38FACA - Skyworth Digital Technology(Shenzhen) Ltd + D4F7D5 + Sony Interactive Entertainment Inc. - 5CB43E - Huawei Technologies Ltd + 98288B + zhejiang Dusun Electron Co.,Ltd - 707781 - Hon Hai Precision Ind Ltd + BCB2CC + Samsung Electronics Co.,Ltd - 54E140 - Ingenico + E0E8E6 + Shenzhen C-Data Technology Co., Ltd. - E4907E - Motorola Mobility LLC, a Lenovo Company + 6C1FF7 + Ugreen Group Limited - 746A3A - Aperi Corporation + 045EA4 + Netis Technology Co., Ltd. - 94A7B7 - ZTE Corporation + 64EEB7 + Netis Technology Co., Ltd. - 1844E6 - ZTE Corporation + 048D38 + Netis Technology Co., Ltd. - 3CCE15 - Mercedes-Benz USA LLC + E82587 + Shenzhen Chilink IoT Technology Co., Ltd. - 287610 - IgniteNet + 507B91 + Sigmastar Technology Ltd. - 20D75A - Posh Mobile Limited + 8C44A5 + Cisco Systems, Inc - F41563 - F5 Networks Inc. + 08E342 + Cear, Inc. - 8C8B83 - Texas Instruments + F4FE3E + Apple, Inc. - 4011DC - Sonance + 342B6E + Apple, Inc. - 1C8341 - Hefei Bitland Information Technology Ltd + 606525 + Apple, Inc. - 081FEB - BinCube + 1455B9 + Nokia Solutions and Networks GmbH & Co. KG - 785F4C - Argox Information Ltd + F439A6 + Apple, Inc. - 34CC28 - Nexpring Ltd + FC5557 + Apple, Inc. - 54E2C8 - Dongguan Aoyuan Electronics Technology Ltd + 8C5570 + IEEE Registration Authority - 6C1E70 - Guangzhou YBDS IT Ltd + A0E025 + Provision-ISR - 54B80A - D-Link International + 808544 + Intelbras - D8ADDD - Sonavation Inc. + 78CD55 + Texas Instruments - 8833BE - Ivenix Inc. + 8C0879 + Texas Instruments - E48D8C - Routerboard.com + 6823B0 + Texas Instruments - 706879 - Saijo Denki International Ltd + 24698E + SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. - 10AF78 - Shenzhen ATUE Technology Ltd + 640DCE + SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. - CC19A8 - PT Inovacao e Sistemas SA + F8F519 + Rulogic Inc. - B4B265 - Daeho I&T + A46DD4 + Silicon Laboratories - E03560 - Challenger Supply Holdings LLC + 0CAE5F + Silicon Laboratories - 3CCB7C - TCT mobile Ltd + 28DBA7 + Silicon Laboratories - 249EAB - Huawei Technologies Ltd + 6C5CB1 + Silicon Laboratories - 244B03 - Samsung Electronics Ltd + 5CC7C1 + Silicon Laboratories - E4CE70 - Health & Life Ltd + 60B647 + Silicon Laboratories - 7C11CD - QianTang Technology + 205A1D + zte corporation - CCA4AF - Shenzhen Sowell Technology Ltd + 3425B4 + Silicon Laboratories - 102C83 - Ximea + 4CB7E0 + SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. - 6CA75F - ZTE Corporation + BC0FB7 + sywinkey HongKong Co,. Limited? - 8C7967 - ZTE Corporation + 583BC2 + Silicon Laboratories - 7858F3 - Vachen Ltd + 006005 + Touchstar ATC Limited - 709C8F - Nero AG + 54606D + HUAWEI TECHNOLOGIES CO.,LTD - 007E56 - China Dragon Technology Limited + 44D465 + NXP Semiconductors Taiwan Ltd. - 74E28C - Microsoft Corporation + ACBAC0 + Intertech Services AG - 0071C2 - Pegatron Corporation + 00CAE0 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 7C8274 - Shenzhen Hikeen Technology Ltd + D4F04A + SKY UK LIMITED - 94D417 - GPI Korea Inc. + 00408C + Axis Communications AB - 244B81 - Samsung Electronics Ltd + 3C450B + Sentry Equipment Corp. - 704E66 - Shenzhen Fast Technologies Ltd + 1C7ACF + vivo Mobile Communication Co., Ltd. - D855A3 - ZTE Corporation + A86A86 + Xiaomi Communications Co Ltd - 38D82F - ZTE Corporation + A486DB + Guangdong Juan Intelligent Technology Joint Stock Co., Ltd. - F07959 - ASUSTek Computer Inc. + 9C63C0 + Mellanox Technologies, Inc. - E08E3C - Aztech Electronics Pte Ltd + 5C2573 + Mellanox Technologies, Inc. - 844BB7 - Beijing Sankuai Online Technology Ltd + B87E39 + Motorola Mobility LLC, a Lenovo Company - 68F0BC - Shenzhen LiWiFi Technology Ltd + 54ECB0 + Sercomm France Sarl - 300EE3 - Aquantia Corporation + 646772 + SERCOMM PHILIPPINES INC - 18F145 - NetComm Wireless Limited + 70D51E + Fiberhome Telecommunication Technologies Co.,LTD - ACABBF - AthenTek Inc. + 1090FA + New H3C Technologies Co., Ltd - 2884FA - Sharp Corporation + 7473E2 + Hillstone Networks Corp. - 60AF6D - Samsung Electronics Ltd + D401C3 + Routerboard.com - B85A73 - Samsung Electronics Ltd + 74077E + Quectel Wireless Solutions Co.,Ltd. - 3C1E04 - D-Link International + 30EC7C + Shenzhen Along Electronics Co., Ltd - 60D9A0 - Lenovo Mobile Communication Technology Ltd + DCDA4D + CELESTICA INC. - 68B983 - b-plus GmbH + 505E24 + zte corporation - 78B3B9 - ShangHai sunup lighting Ltd + 382656 + TCL King Electrical Appliances(Huizhou)Co.,Ltd - 04C09C - Tellabs Inc. + 84BA59 + Wistron InfoComm(Chongqing)Co.,Ltd. - 981DFA - Samsung Electronics Ltd + B09E1B + Butlr Technologies, Inc. - 186882 - Beward R&D Ltd + D0A011 + IEEE Registration Authority - EC8009 - NovaSparks + D8F760 + EM Microelectronic - 50ADD5 - Dynalec Corporation + 005092 + Rigaku Corporation Osaka Plant - B04519 - TCT mobile Ltd + A8CFE0 + GDN Enterprises Private Limited - D88D5C - Elentec + 54C6A6 + Hubei Yangtze Mason Semiconductor Technology Co., Ltd. - 7429AF - Hon Hai Precision Ind Ltd + 40B82D + Ruckus Wireless - 3C1A0F - ClearSky Data + B0B369 + Shenzhen SDMC Technology CO.,Ltd. - E8CC18 - D-Link International + C43EAB + Huawei Device Co., Ltd. - B09137 - ISis ImageStream Internet Solutions Inc. + CC4460 + Huawei Device Co., Ltd. - 8C0551 - Koubachi AG + 24506F + THINKCAR TECH CO.,LTD. - D897BA - Pegatron Corporation + 34EA10 + Orbic North America - A8D88A - Wyconn + 6C92CF + Broadcom Limited - 40EACE - Founder Broadband Network Service Ltd + F43149 + Pixel FX - A49D49 - Ketra Inc. + 78E996 + IEEE Registration Authority - C03896 - Hon Hai Precision Ind Ltd + 3C3576 + ITEL MOBILE LIMITED - 2C5089 - Shenzhen Kaixuan Visual Technology Ltd + A021AA + China Mobile Group Device Co.,Ltd. - 948E89 - Industrias Unidas SA de CV + F42015 + Guangzhou Shiyuan Electronic Technology Company Limited - 00AEFA - Murata Manufacturing Ltd + 1C7A43 + vivo Mobile Communication Co., Ltd. - 841826 - Osram GmbH + 084473 + zte corporation - F8E903 - D-Link International + B47748 + Shenzhen Neoway Technology Co.,Ltd. - E89606 - testo Instruments (Shenzhen) Ltd + 90212E + Apption Labs Ltd - 1C7E51 - 3bumen.com + 50D448 + Private - 6872DC - CETORY.TV Company Limited + 943589 + HUAWEI TECHNOLOGIES CO.,LTD - 3077CB - Maike Industry(Shenzhen) Ltd + 94261D + HUAWEI TECHNOLOGIES CO.,LTD - 2497ED - Techvision Intelligent Technology Limited + A45C25 + Texas Instruments - 909F33 - EFM Networks + 98F487 + Texas Instruments - 600417 - Posbank Ltd + FC599F + Ruijie Networks Co.,LTD - 207693 - Lenovo (Beijing) Limited. + 84A329 + Arcadyan Corporation - 084656 - VEO-Labs + 9C098B + Cisco Systems, Inc - EC3C5A - Shen Zhen Heng Sheng HUI Digital Technology Ltd + 9C5884 + Apple, Inc. - 4488CB - Camco Technologies NV + 24B339 + Apple, Inc. - 6CBFB5 - Noon Technology Ltd + E04E7A + Nanjing Qinheng Microelectronics Co., Ltd. - 50294D - Nanjing IOT Sensor Technology Ltd + D07602 + Hui Zhou Gaoshengda Technology Co.,LTD - 0CCFD1 - SPRINGWAVE Ltd + 6CEFBD + Cisco Meraki - 74BADB - Longconn Electornics(Shenzhen) Ltd + 84821B + PROX SG Pte Ltd - B8F317 - iSun Smasher Communications Private Limited + 94BDBE + TPV Display Technology (Xiamen) Co.,Ltd. - 8CF813 - Orange Polska + 940BFA + EM Microelectronic - 549F35 - Dell Inc. + 80A579 + IEEE Registration Authority - 2442BC - Alinco,Incorporated + 283984 + Qidi Technology (shanghai) Co.,Ltd. - F82441 - Yeelink + 5CFA5A + Sinepower Lda - 108A1B - RAONIX Inc. + F49D8A + Fantasia Trading LLC - 102F6B - Microsoft Corporation + 7C992E + Shanghai Notion lnformatio Technology Co.,Ltd. - 8CB094 - Airtech I&C Ltd + 8CEA88 + Chengdu Yocto Communication Technology Co.Ltd. - 945493 - Rigado LLC + 105FAD + Intel Corporate - 68F06D - Along Industrial Ltd + 4CB04A + Intel Corporate - F42853 - Zioncom Electronics (Shenzhen) Ltd + 40EEBE + NXP Semiconductor (Tianjin) LTD. - D4EC86 - LinkedHope Intelligent Technologies Ltd + FC9816 + ALPSALPINE CO,.LTD - 1C9C26 - Zoovel Technologies + E08F4C + Intel Corporate - 046785 - scemtec Hard- und Software fuer Mess- und Steuerungstechnik GmbH + 54726E + Daimler Truck AG - D0FA1D - Qihoo 360 Technology Ltd + 3C0A7A + Samsung Electronics Co.,Ltd - AC11D3 - Suzhou HOTEK Video Technology Ltd + 2424B7 + Samsung Electronics Co.,Ltd - 8432EA - Anhui Wanzten P&T Ltd + F0051B + Samsung Electronics Co.,Ltd - E01D38 - Beijing HuaqinWorld Technology Ltd + BCA080 + Samsung Electronics Co.,Ltd - E47FB2 - Fujitsu Limited + 002B70 + Samsung Electronics Co.,Ltd - FC6DC0 - BME Corporation + C44606 + Cisco Systems, Inc - 24D13F - Mexus Ltd + 88659F + Fiberhome Telecommunication Technologies Co.,LTD - 7824AF - ASUSTek Computer Inc. + B436A9 + Fibocom Wireless Inc. - FC9FE1 - CoNWIN.Tech Ltd + 942770 + BSH Hausgeräte GmbH - B89BE4 - ABB Power Systems Power Generation + AC1EA9 + Intelbras - A81B5D - Foxtel Management Pty Ltd + 487410 + Cisco Systems, Inc - 505065 - TAKT Corporation + 80E94A + LEAPS s.r.o. - 40C62A - Shanghai Jing Ren Electronic Technology Ltd + 588670 + Juniper Networks - E8150E - Nokia Corporation + 9C5A80 + Juniper Networks - C44202 - Samsung Electronics Ltd + 58FE7E + zte corporation - B4AE6F - Circle Reliance Inc. DBA Cranberry Networks + 34194D + Arcadyan Corporation - 90DA6A - FOCUS H&S Ltd + 6C80AB + ifanr Inc - DC537C - Compal Broadband Networks Inc. + 2817CB + Software Freedom Conservancy - 44A6E5 - Thinking Technology Ltd + 7C0CFA + HUAWEI TECHNOLOGIES CO.,LTD - A45DA1 - ADB Broadband Italia + 3483D5 + HUAWEI TECHNOLOGIES CO.,LTD - 0CAC05 - Unitend Technologies Inc. + 20185B + Shenzhen Jingxun Technology Co., Ltd. - 4C6E6E - Comnect Technology Ltd + 1C64F0 + Motorola Mobility LLC, a Lenovo Company - 8C3357 - HiteVision Digital Media Technology Ltd + 74BEF3 + Motorola Mobility LLC, a Lenovo Company - 3CAA3F - iKey Ltd + AC8866 + Shenzhen Skyworth Digital Technology CO., Ltd - 0C383E - Fanvil Technology Ltd + 5C4842 + Hangzhou Anysoft Information Technology Co. , Ltd - 60CDA9 - Abloomy + 8CC9E9 + Huawei Device Co., Ltd. - B8AD3E - Bluecom + D854F2 + Huawei Device Co., Ltd. - 183009 - Woojin Industrial Systems Ltd + E454E5 + Huawei Device Co., Ltd. - 74DBD1 - Ebay Inc + C40826 + HISENSE VISUAL TECHNOLOGY CO.,LTD - 30B5F1 - Aitexin Technology Ltd + C8586A + Beijing Winner Microelectronics Co.,Ltd. - B01041 - Hon Hai Precision Ind Ltd + 1435B7 + Apple, Inc. - 80AD67 - Kasda Networks Inc + 7CC025 + Palo Alto Networks - 18D5B6 - SMG Holdings LLC + 644842 + Apple, Inc. - 5C2E59 - Samsung Electronics Ltd + F45293 + Apple, Inc. - A8E539 - Moimstone Ltd + 942157 + Apple, Inc. - 54B753 - Hunan Fenghui Yinjia Science And Technology Ltd + 886BDB + Apple, Inc. - 103047 - Samsung Electronics Ltd + B4174D + PROJECT MONITOR INC - F884F2 - Samsung Electronics Ltd + C4AB4D + Cisco Systems, Inc - B0754D - Nokia + 10E376 + Cisco Systems, Inc - E0CBEE - Samsung Electronics Ltd + FC915D + Google, Inc. - 4C3909 - HPL Electric & Power Private Limited + CCB777 + zte corporation - 907EBA - Utek Technology (Shenzhen) Ltd + 3089A6 + HUAWEI TECHNOLOGIES CO.,LTD - A002DC - Amazon Technologies Inc. + 74C17E + LG Electronics - 542AA2 - Alpha Networks Inc. + F84D8B + ecamtek - 84948C - Hitron Technologies Inc. + 1CE89E + SJIT - A8F7E0 - PLANET Technology Corporation + 109819 + Dell Inc. - 4486C1 - Siemens Low Voltage & Products + D06726 + Hewlett Packard Enterprise - 4045DA - Spreadtrum Communications (Shanghai) Ltd + EC9B8B + Hewlett Packard Enterprise - 3451AA - JID Global + 089734 + Hewlett Packard Enterprise - 98BE94 - IBM + B0B867 + Hewlett Packard Enterprise - 6C198F - D-Link International + 8030E0 + Hewlett Packard Enterprise - C8FF77 - Dyson Limited + 004E35 + Hewlett Packard Enterprise - B49EAC - Imagik Int'l Corp + 00FD45 + Hewlett Packard Enterprise - CC07E4 - Lenovo Mobile Communication Technology Ltd + C8B5AD + Hewlett Packard Enterprise - C46BB4 - myIDkey + 5CBA2C + Hewlett Packard Enterprise - 0C63FC - Nanjing Signway Technology Ltd + 5CED8C + Hewlett Packard Enterprise - D4E08E - ValueHD Corporation + 94F128 + Hewlett Packard Enterprise - C89F1D - Shenzhen Communication Technologies Ltd + ACA31E + Hewlett Packard Enterprise - 143DF2 - Beijing Shidai Hongyuan Network Communication Ltd + 0CC3B8 + Shenzhen Jiahua Zhongli Technology Co., LTD - 2C39C1 - Ciena Corporation + EC6794 + Hewlett Packard Enterprise - 54EE75 - Wistron InfoComm(Kunshan) Ltd + A025D7 + Hewlett Packard Enterprise - 0874F6 - Winterhalter Gastronom GmbH + 988F00 + Hewlett Packard Enterprise - D8492F - Canon Inc. + ECFCC6 + Hewlett Packard Enterprise - 800E24 - ForgetBox + A40E75 + Hewlett Packard Enterprise - 3C25D7 - Nokia Corporation + 38BD7A + Hewlett Packard Enterprise - 18FF2E - Shenzhen Rui Ying Da Technology Ltd + E81098 + Hewlett Packard Enterprise - 847207 - I&C Technology + 445BED + Hewlett Packard Enterprise - CCA614 - Aifa Technology Corp. + A85BF7 + Hewlett Packard Enterprise - 90F1B0 - Hangzhou Anheng Info & Tech Ltd + B45D50 + Hewlett Packard Enterprise - 4C8B30 - Actiontec Electronics Inc. + 40E3D6 + Hewlett Packard Enterprise - 0805CD - DongGuang EnMai Electronic Product Ltd + 9020C2 + Hewlett Packard Enterprise - 54D163 - MAX-Tech,Inc + 64E881 + Hewlett Packard Enterprise - 48B5A7 - Glory Horse Industries Ltd + 48E2AD + HUMAX NETWORKS - 0C4F5A - ASA-RT s.r.l. + 5C241F + Qingdao Haier Technology Co.,Ltd - D4224E - Alcatel Lucent + EC3BAF + EM Microelectronic - 9C86DA - Phoenix Geophysics Ltd + 5038AB + PROVE - 2C073C - Devline Limited + AC8EBD + Microsoft Corporation - 7C1A03 - 8Locations Ltd + ACFAE4 + Nintendo Co.,Ltd - ACB859 - Uniband Electronic Corp, + 782E03 + GUANGDONG GENIUS TECHNOLOGY CO., LTD. - 2C9AA4 - Eolo SpA + 4438E8 + Intel Corporate - 88B1E1 - Mojo Networks Inc. + 7829AD + NINGBO QIXIANG INFORMATION TECHNOLOGY CO., LTD - 90DB46 - E-Lead Electronic Ltd + 64078C + HUAWEI TECHNOLOGIES CO.,LTD - 344F5C - R&M AG + 98B71E + Infinix mobility limited - 6047D4 - FORICS Electronic Technology Ltd + 381B9E + Qingdao Intelligent&Precise Electronics Co.,Ltd. - FCF8B7 - TRONTEQ Electronic + 480234 + HUAWEI TECHNOLOGIES CO.,LTD - 30F42F - ESP + E8DF24 + OHSUNG - 704E01 - Kwangwon Tech Ltd + 7CBAC6 + Solar Manager AG - 746A8F - VS Vision Systems GmbH + 0401A1 + Fortinet, Inc. - 54A31B - Shenzhen Linkworld Technology Ltd + 28AF21 + zte corporation - CC398C - Shiningtek + 0C323A + Samsung Electronics Co.,Ltd - 1820A6 - Sage Ltd + 5C15C5 + Shenzhen SSC Technology Co. Ltd - 20EAC7 - Shenzhen Riopine Electronics Ltd + D056FB + Samsung Electronics Co.,Ltd - 64B370 - PowerComm Solutions LLC + C07AD6 + Samsung Electronics Co.,Ltd - 5CF50D - Institute Of microelectronic applications + 000295 + MAVENIR IPA UK LTD - 749C52 - Huizhou Desay SV Automotive Ltd + 78E61C + Honor Device Co., Ltd. - C4291D - Klemsan Elektrik Elektronik SAN.VE TIC.AS. + 04137A + Apple, Inc. - 6C5F1C - Lenovo Mobile Communication Technology Ltd + 70F94A + Apple, Inc. - 7CE4AA - Private + 90B790 + Apple, Inc. - 083F3E - WSH GmbH + 044707 + Texas Instruments - 2C957F - ZTE Corporation + 945044 + Texas Instruments - 3C0C48 - Servergy Inc. + C8844E + Flextronics International Kft - 10DEE4 - automationNEXT GmbH + F49ECE + Sena Technologies Co., Ltd. - 404A18 - Addrek Smart Solutions + 34105D + Texas Instruments - C0C569 - Shanghai Lynuc CNC Technology Ltd + F0D635 + Apple, Inc. - C4C0AE - Midori Electronic Ltd + F87A39 + IEEE Registration Authority - ACC595 - Graphite Systems + 9CDBCB + Funshion Online Technologies Co.,Ltd - 7CE1FF - Computer Performance Inc. DBA Digital Loggers, Inc. + 382CE5 + Tuya Smart Inc. - D8150D - TP-Link Technologies Ltd + 847848 + Ubiquiti Inc - 5850AB - TLS Corporation + C418FC + Cisco Systems, Inc - 7CCD11 - MS-Magnet + EC5BCD + IEEE Registration Authority - 98FF6A - OTEC(Shanghai)Technology Ltd + 6C1D2C + HUAWEI TECHNOLOGIES CO.,LTD - BC1A67 - YF Technology Ltd + 20C2B0 + HUAWEI TECHNOLOGIES CO.,LTD - 4CD7B6 - Helmer Scientific + B0C2C7 + Motorola Mobility LLC, a Lenovo Company - 8425A4 - Tariox Limited + 648B9B + ALWAYS ON TECH PTE.LTD. - 483D32 - Syscor Controls & Automation + 382835 + zte corporation - CC856C - Shenzhen MDK Digital Technology Ltd + C05234 + HUAWEI TECHNOLOGIES CO.,LTD - AC6BAC - Jenny Science AG + 68BF6C + Arista Networks - D8EE78 - Moog Protokraft + 343D7F + Klipsch Group, Inc. - 241148 - Entropix LLC + 94B3F7 + Hui Zhou Gaoshengda Technology Co.,LTD - C445EC - Shanghai Yali Electron Ltd + 741213 + Linksys USA, Inc - E0E631 - SNB Technologies Limited + 74A5C2 + KYOCERA Corporation - 78B5D2 - Ever Treasure Industrial Limited + 543D60 + Arcadyan Corporation - 50ED78 - Changzhou Yongse Infotech Ltd + 38DE35 + GUANGZHOU YUANDIANHE COMMUNICATION TECHNOLOGY CO.,LTD - 90028A - Shenzhen Shidean Legrand Electronic Products Ltd + A00A9A + Huawei Device Co., Ltd. - 1CC11A - Wavetronix + 581F19 + EMH Metering GmbH & Co. KG - FC09D8 - ACTEON Group + 1C83EC + Ubee Interactive co, Limited. - 743ECB - Gentrice tech + 280708 + Samsung Electronics Co.,Ltd - 7C444C - Entertainment Solutions, S.L. + 08DA33 + IEEE Registration Authority - 0444A1 - Telecon Galicia,S.A. + B8B4C9 + Cisco Meraki - 20C60D - Shanghai annijie Information technology Ltd + C01C6A + Google, Inc. - 38CA97 - Contour Design LLC + 8C1ECF + UNIONMAN TECHNOLOGY CO.,LTD - BC2D98 - ThinGlobal LLC + 7C3E82 + Bouffalo Lab (Nanjing) Co., Ltd. - 1879A2 - GMJ Electric Limited + 68CCBA + Dense Air Networks US LLC - E0C86A - Shenzhen TW-SCIE Ltd + 4C6BB8 + Hui Zhou Gaoshengda Technology Co.,LTD - BCEE7B - ASUSTek Computer Inc. + 0056F1 + zte corporation - 3413A8 - Mediplan Limited + 84A938 + LCFC(Hefei) Electronics Technology co., ltd - 7C9763 - Openmatics s.r.o. + 744218 + Apple, Inc. - 48A2B7 - Kodofon JSC + 904CC5 + Apple, Inc. - CC7498 - Filmetrics Inc. + EC4654 + Apple, Inc. - 085AE0 - Recovision Technology Ltd + 5405DB + LCFC(Hefei) Electronics Technology co., ltd - 20E791 - Siemens Healthcare Diagnostics Inc. + 50F351 + Apple, Inc. - 089758 - Shenzhen Strong Rising Electronics Ltd DongGuan Subsidiary + 202DF6 + Apple, Inc. - FC19D0 - Cloud Vision Networks Technology Ltd + C4EFBB + LCFC(Hefei) Electronics Technology co., ltd - 9486D4 - Surveillance Pro Corporation + 38A5C9 + Tuya Smart Inc. - 9CD643 - D-Link International + F8172D + Tuya Smart Inc. - 3C18A0 - Luxshare Precision Industry Company Limited + FC5CEE + LCFC(Hefei) Electronics Technology co., ltd - 8CAE89 - Y-cam Solutions Ltd + 40F4C9 + FN-LINK TECHNOLOGY Ltd. - 94E98C - Nokia + 987596 + EM Microelectronic - FCE1D9 - Stable Imaging Solutions LLC + 545B86 + Panasonic Automotive Systems Co.,Ltd - 50206B - Emerson Climate Technologies Transportation Solutions + 8C5C20 + Vantiva USA LLC - 7CBF88 - Mobilicom Ltd + C41375 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 60DB2A - HNS + 1C627E + HUAWEI TECHNOLOGIES CO.,LTD - B04545 - YACOUB Automation GmbH + 6056B1 + HUAWEI TECHNOLOGIES CO.,LTD - C8EE75 - Pishion International Ltd + 4C22C9 + zte corporation - CC3429 - TP-Link Technologies Ltd + B41DC4 + HUAWEI TECHNOLOGIES CO.,LTD - 64BABD - SDJ Technologies Inc. + 105F02 + Ruijie Networks Co.,LTD - 24C848 - mywerk Portal GmbH + 00A159 + LG Electronics - CCFB65 - Nintendo Ltd + 2824C9 + Amazon Technologies Inc. - A0A23C - Gpms + 5000E0 + Cisco Systems, Inc - 68FCB3 - Next Level Security Systems Inc. + 74E2E7 + Cisco Systems, Inc - 94C3E4 - Atlas Copco IAS GmbH + C4600A + Huaqin Technology Co.LTD - 34885D - Logitech Far East + 147E19 + Hewlett Packard Enterprise - 88576D - XTA Electronics Ltd + 3806E6 + Arcadyan Corporation - BC4100 - CoDACO ELECTRONIC s.r.o. + 1074C5 + Calix Inc. - FCD817 - Beijing Hesun Technologies Ltd + BCCD7F + Huawei Device Co., Ltd. - 682DDC - Wuhan Changjiang Electro-Communication Equipment Ltd + 44896D + TELLESCOM INDUSTRIA E COMERCIO EM TELECOMUNICACAO - E8611F - Dawning Information Industry Ltd + E451A9 + Nanjing Xinlian Electronics Co., Ltd - 2847AA - Nokia Corporation + 742869 + Huawei Device Co., Ltd. - 5CD61F - Qardio Inc. + D0C1B5 + Dell Inc. - 705957 - Medallion Instrumentation Systems + ECE78E + AsiaTelco Technologies Co. - 9C443D - Chengdu Xuguang Technology Ltd + 145A41 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - B424E7 - Codetek Technology Ltd + AC45CA + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 542F89 - Euclid Laboratories Inc. + 8876B9 + D-Link Corporation - 909916 - ELVEES NeoTek OJSC + 90A196 + Private - 00A2FF - abatec group AG + 1435B3 + Future Designs, Inc. - 6024C1 - Jiangsu Zhongxun Electronic Technology Ltd + 54A245 + Digisol Systems Limited - A0143D - Parrot SA + 50695A + AiFamous(shenzhen)Technology Co.,Ltd - FC1BFF - V-ZUG AG + 502FBB + Motorola Mobility LLC, a Lenovo Company - F42896 - Specto Paineis Eletronicos Ltda + 6C0B5E + HP Inc. - 78CB33 - DHC Software Ltd + 2C195C + Beijing Xiaomi Mobile Software Co., Ltd - 60A9B0 - Merchandising Technologies Inc. + 68E580 + Apple, Inc. - 5027C7 - TECHNART Ltd + 58666D + Apple, Inc. - 6C5AB5 - TCL Technoly Electronics (Huizhou) Ltd + DC9E8F + Apple, Inc. - 385AA8 - Beijing Zhongdun Security Technology Development Co. + C48B66 + Hui Zhou Gaoshengda Technology Co.,LTD - F4A294 - Eagle World Development Ltd + B496A5 + Apple, Inc. - EC3E09 - Performance Designed Products LLC + 3809FB + Apple, Inc. - 947C3E - Polewall Norge AS + C463C4 + HUAWEI TECHNOLOGIES CO.,LTD - 34A3BF - Terewave Inc. + 4C5D6A + Apple, Inc. - 8C088B - Remote Solution + 14E289 + Abietec Inc. - B43E3B - Viableware Inc. + 0C1BCC + IFLYTEK CO.,LTD. - 0C5CD8 - DOLI Elektronik GmbH + FCD96B + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 3C15EA - Tescom Ltd + FC1928 + Actions Microelectronics - E80410 - Private + E0C29E + zte corporation - F4BD7C - Chengdu jinshi Communication Ltd + 60B02B + Qingdao Haier Technology Co.,Ltd - DCC422 - Systembase Limited + 306893 + TP-Link Systems Inc. - C8F36B - Yamato Scale Ltd + D4C9B2 + Quanergy Solutions Inc - 98F8C1 - IDT Technology Limited + 242856 + Beijing Gctech Technology Co.,LTD - 6CD1B0 - Wing Sing Electronics Hong Kong Limited + A0D42D + G.Tech Technology Ltd. - A4F522 - Chofu Seisakusho Ltd + F87BE0 + Funtime Pickleball Inc. - 845C93 - Chabrier Services + 789987 + Xiaomi Communications Co Ltd - 68E166 - Private + 34C459 + Texas Instruments - BC2BD7 - Revogi Innovation Ltd + 4488BE + Texas Instruments - 286D97 - SAMJIN Ltd + FCDEC5 + Texas Instruments - 24ECD6 - CSG Science & Technology LtdHefei + 584BBC + zte corporation - CC2A80 - Micro-Biz Intelligence solutions Ltd + 9C47F4 + Nokia - 60FEF9 - Thomas & Betts + 08A136 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - B8DC87 - IAI Corporation + 74E147 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 7C6FF8 - Shenzhen ACTO Digital Video Technology Ltd + 342C8E + Ufispace Co., LTD. - DCF755 - Sitronik + 74B8A8 + HUAWEI TECHNOLOGIES CO.,LTD - 5C026A - Applied Vision Corporation + E0F330 + HUAWEI TECHNOLOGIES CO.,LTD - 0C9301 - PT. Prasimax Inovasi Teknologi + 9C0351 + HUAWEI TECHNOLOGIES CO.,LTD - 746630 - T:mi Ytti + 0CB787 + HUAWEI TECHNOLOGIES CO.,LTD - 6CB350 - Anhui Comhigher tech Ltd + 9898FB + Google, Inc. - 3859F8 - MindMade Sp. z o.o. + 24A3F0 + IEEE Registration Authority - 4CDF3D - Team Engineers Advance Technologies India PVT Ltd + 243CB0 + Dongguan Mentech Optical & Magnetic Co., Ltd. - E89218 - Arcontia International AB + A457A0 + SAMJIN Co., Ltd. - 0075E1 - Ampt LLC + F8160C + Shenzhen iComm Semiconductor CO.,LTD - 98CDB4 - Virident Systems Inc. + 341736 + Shenzhen iComm Semiconductor CO.,LTD - A42305 - Open Networking Laboratory + 707FF2 + Telechips, Inc. - 1C48F9 - GN Netcom A/S + 90B57F + Shenzhen iComm Semiconductor CO.,LTD - B0FEBD - Private + 60DEF4 + Shenzhen iComm Semiconductor CO.,LTD - 60699B - isepos GmbH + B88EB0 + Shenzhen Skyworth Digital Technology CO., Ltd - D4D50D - Southwest Microwave Inc. + 84EB3F + Vivint Inc - 34CD6D - CommSky Technologies + FC4D6A + Silicon Laboratories - E4F3E3 - Shanghai iComhome Ltd + 4C6460 + ITEL MOBILE LIMITED - 9046B7 - Vadaro Pte Ltd + E826CF + Shenzhen Jingxun Technology Co., Ltd. - 04CF25 - Manycolors Inc. + B41678 + Juniper Networks - 80BBEB - Satmap Systems Ltd + AC9FC3 + Ring LLC - 00B78D - Nanjing Shining Electric Automation Ltd + 3CDC03 + IEEE Registration Authority - 60FE1E - China Palms Telecom Ltd + FC221C + Shenzhen Xunman Technology Co., Ltd - B050BC - Shenzhen Basicom Electronic Ltd + 3023CD + FUJIAN STAR-NET COMMUNICATION CO.,LTD - 841E26 - KERNEL-I Ltd + 5408D3 + Tianyi Telecom Terminals Company Limited - B4346C - Matsunichi Digital Technology (Hong Kong) Limited + E81CA5 + Hewlett Packard Enterprise - 0086A0 - Private + 04ED62 + Daikin Europe NV - A05B21 - ENVINET GmbH + 5C14EB + Trident IoT - 50B8A2 - ImTech Technologies LLC, + 4C92D2 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - B04C05 - Fresenius Medical Care Deutschland GmbH + 2CB6C2 + zte corporation - B0793C - Revolv Inc + 10985F + Inventus Power Eletronica do Brasil LTDA - 9C4EBF - BoxCast + 38D518 + GooWi Wireless Technology Co., Limited - 34A843 - KYOCERA Display Corporation + A46D33 + Phyplus Technology (Shanghai) Co., Ltd - 74CA25 - Calxeda Inc. + 640552 + China Post Communication Equipment Co., - 5CA3EB - Lokel s.r.o. + BCA0B9 + HUAWEI TECHNOLOGIES CO.,LTD - C8B373 - Cisco-Linksys LLC + 3C59C0 + HUAWEI TECHNOLOGIES CO.,LTD - 0C2AE7 - Beijing General Research Institute Of Mining and Metallurgy + 8C13E2 + NETLINK ICT - 983071 - Daikyung Vascom + 00FADE + Motorola Mobility LLC, a Lenovo Company - D49524 - Clover Network Inc. + 08C7B5 + Apple, Inc. - 945047 - Rechnerbetriebsgruppe + 942B68 + Apple, Inc. - E031D0 - SZ Telstar Ltd + BC804E + Apple, Inc. - 54112F - Sulzer Pump Solutions Finland Oy + D87475 + Apple, Inc. - 4C55B8 - Turkcell Teknoloji + 9CB150 + Intel Corporate - 088039 - Cisco SPVTG + 24EB16 + Intel Corporate - E438F2 - Advantage Controls + 700810 + Intel Corporate - C4C755 - Beijing HuaqinWorld Technology Ltd + 8C3396 + Apple, Inc. - 0C2D89 - QiiQ Communications Inc. + 74CC40 + Apple, Inc. - A8D236 - Lightware Visual Engineering + 3C5002 + Apple, Inc. - 981094 - Shenzhen Vsun Communication technology Ltd + B0D1D6 + Nokia Shanghai Bell Co., Ltd. - A4F3C1 - Open Source Robotics Foundation Inc. + E86EAD + Guangzhou Gizwits loT Technology Co.,Ltd - 141330 - Anakreon UK LLP + 502E66 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 0CF405 - Beijing Signalway Technologies Ltd + 5003CF + CANON INC. - 5061D6 - Indu-Sol GmbH + 48EA62 + HP Inc. - DC7014 - Private + 04E3C8 + FUJIAN STAR-NET COMMUNICATION CO.,LTD - 788DF7 - Hitron Technologies Inc. + 6455B1 + Commscope - 2C245F - Babolat VS + 0000C5 + Commscope - 905692 - Autotalks Ltd + 44E137 + Commscope - 04BFA8 - ISB Corporation + 14CFE2 + Commscope - 8CC7D0 - zhejiang ebang Communication Ltd + BCC2D9 + Private - B8AE6E - Nintendo Ltd + 001DD4 + Commscope - D0EB03 - Zhehua technology limited + 001DD5 + Commscope - 683EEC - Ereca + 001DCF + Commscope - C42628 - Airo Wireless + 001DD1 + Commscope - 30AABD - Shanghai Reallytek Information Technology Ltd + 9C3426 + Commscope - A4B818 - PENTA Gesellschaft fur elektronische Industriedatenverarbeitung mbH + 0015CF + Commscope - C04DF7 - Serelec + 002040 + Commscope - 0C8484 - Zenovia Electronics Inc. + 001225 + Commscope - 005907 - LenovoEMC Products USA LLC + 00909C + Commscope - 50A715 - Aboundi Inc. + E86D52 + Commscope - 0C0400 - Jantar d.o.o. + 386BBB + Commscope - 687CD5 - Y Soft Corporation, a.s. + 001784 + Commscope - 907AF1 - Wally + 1C1448 + Commscope - 2CB693 - Radware + 001E46 + Commscope - A861AA - Cloudview Limited + 001C11 + Commscope - FC1186 - Logic3 plc + 0018C0 + Commscope - E01877 - Fujitsu Limited + 0018A4 + Commscope - E457A8 - Stuart Manufacturing Inc. + CCA462 + Commscope - 789966 - Musilab Electronics (DongGuan) Ltd + 00080E + Commscope - 28CBEB - One + 2C1DB8 + Commscope - 7CA15D - GN ReSound A/S + E45740 + Commscope - 3C081E - Beijing Yupont Electric Power Technology Ltd + 909D7D + Commscope - FC58FA - Shen Zhen Shi Xin Zhong Xin Technology Ltd + 002495 + Commscope - 4CCC34 - Motorola Solutions Inc. + 74F612 + Commscope - D0D471 - MVTECH Ltd + 6CC1D2 + Commscope - 0868D0 - Japan System Design + 145BD1 + Commscope - D4223F - Lenovo Mobile Communication Technology Ltd + A811FC + Commscope - C8EEA6 - Shenzhen SHX Technology Ltd + 94E8C5 + Commscope - 2481AA - KSH International Ltd + E48399 + Commscope - AC4122 - Eclipse Electronic Systems Inc. + 3C754A + Commscope - 6897E8 - Society Of Motion Picture & Television Engineers + 0024A0 + Commscope - E8E875 - iS5 Communications Inc. + 001CC3 + Commscope - C80E95 - OmniLync Inc. + 347A60 + Commscope - 30055C - Brother Industries Ltd + 54E2E0 + Commscope - 080EA8 - Velex s.r.l. + 7C2634 + Commscope - B8C46F - Primmcon Industries Inc + 7085C6 + Commscope - D8B02E - Guangzhou Zonerich Business Machine Ltd + 002374 + Commscope - C4E032 - IEEE 1904.1 Working Group + 002143 + Commscope - 58EB14 - Proteus Digital Health + 88BD09 + Netis Technology Co., Ltd. - C458C2 - Shenzhen TATFOOK Technology Ltd + 8C61A3 + Commscope - D0CDE1 - Scientech Electronics + 8871B1 + Commscope - 5CE0CA - FeiTian United (Beijing) System Technology Ltd + F0AF85 + Commscope - E08177 - GreenBytes Inc. + FCAE34 + Commscope - 9C9811 - Guangzhou Sunrise Electronics Development Ltd + B0935B + Commscope - B86091 - Onnet Technologies and Innovations LLC + A89FEC + Commscope - 8C76C1 - Goden Tech Limited + C0A00D + Commscope - 8C078C - Flow Data Inc + A49813 + Commscope - F8DFA8 - ZTE Corporation + 98F781 + Commscope - A895B0 - Aker Subsea Ltd + 6C639C + Commscope - 104D77 - Innovative Computer Engineering + 484EFC + Commscope - C45DD8 - HDMI Forum + 5860D8 + Commscope - C4EBE3 - Rrcn SAS + 50A5DC + Commscope - 94756E - QinetiQ North America + FC3FFC + Tozed Kangwei Tech Co.,Ltd - 4C1A95 - Novakon Ltd + F8F532 + Commscope - 60BB0C - Beijing HuaqinWorld Technology Ltd + B083D6 + Commscope - A42C08 - Masterwork Automodules + C85261 + Commscope - 10B9FE - Lika srl + 60D248 + Commscope - 301518 - Ubiquitous Communication Ltd + B05DD4 + Commscope - 841715 - GP Electronics (HK) Ltd + A4438C + Commscope - 848E96 - Embertec Pty Ltd + FCD202 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 6499A0 - AG Elektronik AB + 68AAC4 + Altice Labs - 08F1B7 - Towerstream Corpration + 3CF341 + Hosenso GmbH & Co. KG - C044E3 - Shenzhen Sinkna Electronics Ltd + 7450CD + HUAWEI TECHNOLOGIES CO.,LTD - 18550F - Cisco SPVTG + A091CA + Nokia Solutions and Networks GmbH & Co. KG - 187A93 - AMICCOM Electronics Corporation + 0C44C0 + zte corporation - 8887DD - DarbeeVision Inc. + A840F8 + HUMAX NETWORKS - 30C82A - WI-BIZ srl + EC750C + TP-Link Systems Inc. - 88A3CC - Amatis Controls + 343E25 + OHSUNG - C0A0C7 - Fairfield Industries + 844D4C + Adtran Inc - DCA989 - Macandc + 58D61F + Ubiquiti Inc - A00363 - Robert Bosch Healthcare GmbH + 6C63F8 + Ubiquiti Inc - D0B498 - Robert Bosch LLC Automotive Electronics + A8741D + Phoenix Contact GmbH & Co. KG - E05597 - Emergent Vision Technologies Inc. + CCCCEA + Phoenix Contact GmbH & Co. KG - 7C438F - E-Band Communications Corp. + 28DE1C + Samsung Electronics Co.,Ltd - A0E25A - Amicus SK, s.r.o. + 186BE2 + LYLINK LIMITED - D40FB2 - Applied Micro Electronics AME bv + D8C80C + Tuya Smart Inc. - 449B78 - The Now Factory + 347069 + Cisco Systems, Inc - F0F669 - Motion Analysis Corporation + EC74CD + IEEE Registration Authority - 78995C - Nationz Technologies Inc + F815E0 + Siemens Canada - 849DC5 - Centera Photonics Inc. + 3CE86E + Hewlett Packard Enterprise - 580943 - Private + A00CE2 + Shenzhen Shokz Co., Ltd. - ECFC55 - A. Eberle GmbH & Co. KG + CC1228 + HISENSE VISUAL TECHNOLOGY CO.,LTD - 182A7B - Nintendo Ltd + 58FB3E + Huawei Device Co., Ltd. - 68FB95 - Generalplus Technology Inc. + C02CED + Silicon Laboratories - 5C89D4 - Beijing Banner Electric Ltd + 7071B3 + Brain Corporation - 54115F - Atamo Pty Ltd + 1C3003 + Hewlett Packard Enterprise - 8CAE4C - Plugable Technologies + E0E2D1 + Beijing Netswift Technology Co.,Ltd. - 0CC655 - Wuxi YSTen Technology Ltd + 98BA5F + TP-Link Systems Inc. - 242FFA - Toshiba Global Commerce Solutions + 98EE94 + Xiaomi Communications Co Ltd - E496AE - ALTOGRAPHICS Inc. + 209952 + Xiaomi Communications Co Ltd - 4C2258 - Cozybit Inc. + A4E88D + FN-LINK TECHNOLOGY Ltd. - F49466 - CountMax Ltd + 08D593 + Texas Instruments - F45214 - Mellanox Technologies Inc. + 88CFCD + Texas Instruments - 1C959F - Veethree Electronics And Marine LLC + F8916F + Texas Instruments - 0881F4 - Juniper Networks + 5CA436 + Shenzhen G-world Technology Incorporated Company - 10F49A - T3 Innovation + 284D92 + Luminator Technology Group Global LLC - 3C57BD - Kessler Crane Inc. + A0C7D2 + Cisco Systems, Inc - 04E9E5 - Pjrc.com LLC + 5C6152 + NXP Semiconductor (Tianjin) LTD. - 60BD91 - Move Innovation + 6858A0 + Honor Device Co., Ltd. - CC4BFB - Hellberg Safety AB + 14EA63 + Hui Zhou Gaoshengda Technology Co.,LTD - 6CADEF - KZ Broadband Technologies Ltd + 04BFD5 + Apple, Inc. - 745FAE - TSL PPL + 44A10E + Apple, Inc. - 6851B7 - PowerCloud Systems Inc. + 7CC8DF + Apple, Inc. - 742D0A - Norfolk Elektronik AG + E8E49D + Nexthop Systems Inc. - 70F1E5 - Xetawave LLC + 8083F6 + Apple, Inc. - C0AA68 - OSASI Technos Inc. + 74761F + Microsoft Corporation - 88D7BC - DEP Company + 603D61 + Private - 485A3F - Wisol + 70A703 + Honor Device Co., Ltd. - 60BC4C - EWM Hightec Welding GmbH + 1CD1D7 + Hangzhou BroadLink Technology Co., Ltd - 1C11E1 - Wartsila Finland Oy + 088AF1 + MERCUSYS TECHNOLOGIES CO., LTD. - 50465D - ASUSTek Computer Inc. + 947AF4 + HUAWEI TECHNOLOGIES CO.,LTD - 74BFA1 - Hyunteck + 8CA96D + HUAWEI TECHNOLOGIES CO.,LTD - CC262D - Verifi LLC + 10BA1A + SHENZHEN IK WORLD Technology Co., Ltd - 3C8AE5 - Tensun Information Technology(Hangzhou) Ltd + 7CDC73 + HUAWEI TECHNOLOGIES CO.,LTD - 2C5AA3 - Promate Electronic Ltd + 98038E + TP-Link Systems Inc. - 34E0CF - ZTE Corporation + 8C938B + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 08B738 - Lite-On Technogy Corp. + 706871 + FN-LINK TECHNOLOGY Ltd. - F8AA8A - Axview Technology (Shenzhen) Ltd + C8AC35 + PiLink Co., Ltd. - 7C0187 - Curtis Instruments Inc. + B4107A + Amazon Technologies Inc. - 54F666 - Berthold Technologies GmbH and Co.KG + 543ADF + Qualfiber Technology Co.,Ltd - 34C803 - Nokia Corporation + 043D6E + Nokia - F05F5A - Getriebebau NORD GmbH and Co. KG + 5C0610 + Cisco Meraki - 801DAA - Avaya Inc + F4D454 + Shenzhen Skyworth Digital Technology CO., Ltd - 7C092B - Bekey A/S + BC3E0B + Panasonic Connect Co., Ltd. - 842BBC - Modelleisenbahn GmbH + 30BD13 + Zyxel Communications Corporation - B4009C - CableWorld Ltd + 701AD5 + Avigilon Alta - 289EDF - Danfoss Turbocor Compressors Inc. + 4CB82C + Cambridge Mobile Telematics, Inc. - 803FD6 - bytes at work AG + 901057 + Intel Corporate - 784405 - FUJITU(HONG KONG) ELECTRONIC Ltd + C40F08 + Intel Corporate - 044A50 - Ramaxel Technology (Shenzhen) limited Company + C8D959 + Motorola Mobility LLC, a Lenovo Company - 0CD9C1 - Visteon Corporation + 9C5A8A + DJI BAIWANG TECHNOLOGY CO LTD - 38A5B6 - Shenzhen Megmeet Electrical Ltd + A844AA + Fiberhome Telecommunication Technologies Co.,LTD - 68AB8A - RF IDeas + D87D45 + Nicent Technology Co., Ltd. - 24EE3A - Chengdu Yingji Electronic Hi-tech Ltd + 4CCA95 + Huawei Device Co., Ltd. - 0CC66A - Nokia Corporation + F05C0E + Huawei Device Co., Ltd. - 74273C - ChangYang Technology (Nanjing) Ltd + D4958E + Universal Electronics, Inc. - 087CBE - Quintic Corp. + 74FC45 + SIEMENS AG - E804F3 - Throughtek Ltd + 40C73C + Intel Corporate - 0868EA - Eito Electronics Ltd + D4438A + Beijing Xiaomi Mobile Software Co., Ltd - F82285 - Cypress Technology Ltd + A0EEEE + CIG SHANGHAI CO LTD - C4AD21 - MEDIAEDGE Corporation + 147057 + SHENNAN CIRCUITS CO.,LTD - E85BF0 - Imaging Diagnostics + 4C37DE + AltoBeam Inc. - A40BED - Carry Technology Ltd + 200F92 + STK Technology Co., Ltd. - 702393 - fos4X GmbH + 581862 + Sony Corporation - 64D814 - Cisco Systems Inc. + 785ECC + Apple, Inc. - F85F2A - Nokia Corporation + 880264 + Pascal Audio - C438D3 - Tagatec Ltd + 4C1F86 + Hangzhou Hikvision Digital Technology Co.,Ltd. - 502ECE - Asahi Electronics Ltd + 68D976 + EM Microelectronic - AC14D2 - wi-daq Inc. + 84E585 + EM Microelectronic - 9C4CAE - Mesa Labs + 94E7F3 + HUAWEI TECHNOLOGIES CO.,LTD - 20C1AF - i Wit Digital Ltd + DC9C99 + HUAWEI TECHNOLOGIES CO.,LTD - 80AAA4 - Usag + B45976 + Apple, Inc. - 30AEF6 - Radio Mobile Access + DC9566 + Apple, Inc. - 085B0E - Fortinet Inc. + B845EB + Apple, Inc. - EC42F0 - ADL Embedded Solutions Inc. + 989D39 + China Mobile Group Device Co.,Ltd. - E8CBA1 - Nokia Corporation + 1C61BF + Apple, Inc. - 6CE4CE - Villiger Security Solutions AG + 9C69D3 + ASIX Electronics Corporation - 649FF7 - Kone Oyj + 343C30 + NXP Semiconductor (Tianjin) LTD. - CC912B - TE Connectivity Touch Solutions + 340557 + vivo Mobile Communication Co., Ltd. - C05E79 - Shenzhen Huaxun ARK Technologies Ltd + 9CF1D4 + Roku, Inc - 58BFEA - Cisco Systems Inc. + 20EFBD + Roku, Inc - C401B1 - SeekTech Inc + D46C62 + MultiTracks.com, LLC - C0C946 - Mitsuya Laboratories Inc. + 9CDAB7 + Hewlett Packard Enterprise - F4600D - Panoptic Technology Inc. + 8CC573 + Xsight Labs LTD. - A82BD6 - Shina System Ltd + E0280A + TP-Link Systems Inc. - ACCF23 - Hi-flying electronics technology Ltd + 00596C + Cisco Systems, Inc - 609084 - DSSD Inc + 00D0CE + TASKING Labs - FC1D59 - I Smart Cities HK Ltd + 38165A + zte corporation - 78C4AB - Shenzhen Runsil Technology Ltd + 808800 + zte corporation - B0A86E - Juniper Networks + 7866D7 + GENSTORAIGE TECHNOLOGY CO.LTD. - 802AFA - Germaneers GmbH + 24B5F2 + Shanghai Ingeek Technology Co., Ltd - 18421D - Private + F8D0C5 + Sector Alarm Tech S.L. - 28C914 - Taimag Corporation + 148121 + TOP WING Corporation - 7493A4 - Zebra Technologies Corp. + 1C7126 + snom technology GmbH - E47185 - Securifi Ltd + 5C8DE5 + Delta Electronics, Inc. - 080CC9 - Mission Technology Group, dba Magma + EC1BCF + Brain Technologies, Inc. - 640E94 - Pluribus Networks Inc. + 287B11 + Hui Zhou Gaoshengda Technology Co.,LTD - 0CB4EF - Digience Ltd + 88A29E + Raspberry Pi (Trading) Ltd - 146A0B - Cypress Electronics Limited + 68B1C9 + IYO, Inc - 5CEE79 - Global Digitech Ltd + 347E5C + Sonos, Inc. - 4CAA16 - Azurewave Technologies Inc. + 708B97 + INSYS icom GmbH - AC40EA - C&T Solution Inc. + 000E58 + Sonos, Inc. - 002AAF - LARsys-Automation GmbH + 004B12 + Espressif Inc. - 1CE165 - Marshal Corporation + 444A37 + Xiaomi Communications Co Ltd - 4016FA - EKM Metering + 405ECF + Esconet Technologies Limited - 0C130B - Uniqoteq Ltd + C895CE + Intel Corporate - 2C542D - Cisco Systems Inc. + 94390E + Intel Corporate - BC1401 - Hitron Technologies Inc. + 40D133 + Intel Corporate - 94CA0F - Honeywell Analytics + 20BD1D + Intel Corporate - 782544 - Omnima Limited + 2CC682 + Quectel Wireless Solutions Co.,Ltd. - A41875 - Cisco Systems Inc. + C02242 + Chauvet - C8AE9C - Shanghai TYD Elecronic Technology Ltd + 64A40E + Tianyi Telecom Terminals Company Limited - AC3FA4 - Taiyo Yuden Ltd + 24C406 + SUNITEC TECHNOLOGY CO.,LIMITED - 6CAE8B - IBM Corporation + 8C86DD + TP-Link Systems Inc. - 40AC8D - Data Management Inc. + ECF37A + Forecr OU - 80CEB1 - Theissen Training Systems GmbH + 30BDFE + Sichuan Tianyi Comheart Telecom Co.,LTD - FC2A54 - Connected Data Inc. + 30560F + GIGA-BYTE TECHNOLOGY CO. , Ltd. - 045C06 - Zmodo Technology Corporation + 487B2F + Microsoft Corporation - 747B7A - ETH Inc. + DC8403 + shenzhen trolink Technology Co.,Ltd - 48EA63 - Zhejiang Uniview Technologies Ltd + 7CAADE + AltoBeam Inc. - E88DF5 - ZNYX Networks Inc. + 484996 + Huawei Device Co., Ltd. - 90F72F - Phillips Machine & Welding Co. Inc. + 6822E5 + Huawei Device Co., Ltd. - D05785 - Pantech Ltd + 30DE4B + TP-Link Systems Inc - 408B07 - Actiontec Electronics Inc. + 000302 + Charles Industries - 284121 - OptiSense Network LLC + A40B78 + FAST PHOTONICS HK CO., LIMITED - 38458C - MyCloud Technology Corporation + F83EB0 + Arcadyan Corporation - 10E4AF - APR LLC + D4808B + Seiko Epson Corporation - F4EA67 - Cisco Systems Inc. + 10666A + Zabbly - 2C2D48 - bct electronic GesmbH + 8CCD55 + EM Microelectronic - 28BA18 - NextNav LLC + 4027A8 + Cisco Meraki - AC3D75 - Hangzhou Zhiway Technologies Ltd + D4B4C0 + Fortinet, Inc. - A090DE - Veedims,LLC + C87CE2 + Infrawaves - 642DB7 - Seungil Electronics + CCA174 + Meta Platforms, Inc. - 002A6A - Cisco Systems Inc. + C0DD8A + Meta Platforms, Inc. - F436E1 - Abilis Systems SARL + 50BBB5 + AzureWave Technology Inc. - 781C5A - Sharp Corporation + 687FF0 + TP-Link Systems Inc - E80C75 - Syncbak Inc. + 04F41C + Routerboard.com - 800A06 - CoMTEC Ltd + CC3BFB + Ring LLC - 608C2B - Hanson Technology + F4462A + maxon zub - 940070 - Nokia Corporation + AC50EE + Tianyi Telecom Terminals Company Limited - BC2C55 - Bear Flag Design Inc. + A842A1 + TP-Link Systems Inc - 0C7523 - Beijing Gehua Catv Network Ltd + C006C3 + TP-Link Systems Inc - 04F021 - Compex Systems Pte Ltd + 7CC2C6 + TP-Link Systems Inc - 2818FD - Aditya Infotech Ltd + 90D20B + Nokia Shanghai Bell Co., Ltd. - D8B90E - Triple Domain Vision Ltd + D0B3C2 + Meta Platforms, Inc. - 342F6E - Anywire Corporation + 680489 + Cisco Systems, Inc - CCEED9 - VAHLE Automation GmbH + C4CA67 + Chongqing ZQZER Technology Co., LTD - 005CB1 - Gospell DIGITAL TECHNOLOGY Ltd + 20A8BF + HUAWEI TECHNOLOGIES CO.,LTD - B08E1A - URadio Systems Ltd + 00E12F + HUAWEI TECHNOLOGIES CO.,LTD - D8E952 - Keopsys + 282CC4 + HUAWEI TECHNOLOGIES CO.,LTD - BCA4E1 - Nabto + 389148 + zte corporation - 908FCF - UNO System Ltd + 542B76 + zte corporation - 40E793 - Shenzhen Siviton Technology Ltd + 7CB8DA + Murata Manufacturing Co., Ltd. - 000831 - Cisco Systems Inc. + 08FD52 + Silicon Laboratories - 34D09B - MobilMAX Technology Inc. + 2CDEDF + Guangxi Konaixin Precision Technology Co., Ltd - F0007F - Janz - Contadores de Energia, SA + F4635A + NXP Semiconductor (Tianjin) LTD. - 30B3A2 - Shenzhen Heguang Measurement & Control Technology Ltd + EC2F20 + HYUNDAI WIA - 506028 - Xirrus Inc. + 885A23 + CELESTICA INC. - 0091FA - Synapse Product Development + F8EDFC + HP Inc. - A05AA4 - Grand Products Nevada Inc. + 2CECA6 + HUAWEI TECHNOLOGIES CO.,LTD - F0EEBB - VIPAR GmbH + 98C08A + HUAWEI TECHNOLOGIES CO.,LTD - 6CE907 - Nokia Corporation + 3CFA80 + HUAWEI TECHNOLOGIES CO.,LTD - E4FA1D - PAD Peripheral Advanced Design Inc. + 3C318A + Samsung Electronics Co.,Ltd - 1C5C55 - PRIMA Cinema Inc. + 8075BF + Samsung Electronics Co.,Ltd - 34BA9A - Asiatelco Technologies Co. + 78BE81 + FN-LINK TECHNOLOGY Ltd. - 506441 - Greenlee + 78753E + Apple, Inc. - 9C1FDD - Accupix Inc. + 90AC6D + Apple, Inc. - 7CDD11 - Chongqing MAS SCI&TECH Ltd + 503DD1 + TP-Link Systems Inc. - B8FD32 - Zhejiang ROICX Microelectronics + 74E987 + Apple, Inc. - 70EE50 - Netatmo + A89C6C + Ubiquiti Inc - 984A47 - CHG Hospital Beds + D84567 + TECNO MOBILE LIMITED - 144978 - Digital Control Incorporated + B4D31A + LYSORA TECHNOLOGY INC. - 2C10C1 - Nintendo Ltd + 04D190 + Kaon Group Co., Ltd. - 8CD17B - CG Mobile + 58A748 + Lytx - 502267 - PixeLINK + 2002C9 + Zhejiang Huayi IOT Technology Co.,Ltd - 3C6A7D - Niigata Power Systems Ltd + 34588A + Cisco Systems, Inc - 3C7059 - MakerBot Industries + E08C3C + Cisco Systems, Inc - 502690 - Fujitsu Limited + E48A93 + HISENSE VISUAL TECHNOLOGY CO.,LTD - 24B657 - Cisco Systems Inc. + FC3876 + Forum Communication Systems, Inc - C8AF40 - marco Systemanalyse und Entwicklung GmbH + A01AE3 + Edgecore Americas Networking Corporation - 40984C - Casacom Solutions AG + 5088C7 + Taicang T&W Electronics - 5C18B5 - Talon Communications + 74D5B8 + Infraeo Inc - 64E161 - DEP Corp. + 2C3F0B + Cisco Meraki - 8823FE - TTTech Computertechnik AG + A4AD9E + NEXAIOT - B89AED - OceanServer Technology Inc. + 94742E + MERCUSYS TECHNOLOGIES CO., LTD. - C87D77 - Shenzhen Kingtech Communication Equipment Ltd + 94EF50 + TP-Link Systems Inc. - 94AE61 - Alcatel Lucent + 903FC3 + Huawei Device Co., Ltd. - 5CCEAD - CDYNE Corporation + A80CCA + Shenzhen Sundray Technologies company Limited - AC54EC - IEEE P1823 Standards Working Group + 703A73 + Shenzhen Sundray Technologies company Limited - 709756 - Happyelectronics Ltd + 202027 + Shenzhen Sundray Technologies company Limited - B820E7 - Guangzhou Horizontal Information & Network Integration Ltd + C4493E + Motorola Mobility LLC, a Lenovo Company - 00CD90 - MAS Elektronik AG + FCA2DF + IEEE Registration Authority - 7C6B52 - Tigaro Wireless + CC6200 + Honor Device Co., Ltd. - 0064A6 - Maquet CardioVascular + 54EAE1 + Honor Device Co., Ltd. - 988BAD - Corintech Ltd + 7C692B + HUAWEI TECHNOLOGIES CO.,LTD - D44B5E - Taiyo Yuden Ltd + 386EB2 + HUAWEI TECHNOLOGIES CO.,LTD - 640E36 - Taztag + 18CEDF + Quectel Wireless Solutions Co.,Ltd. - 941D1C - TLab West Systems AB + 00337A + Tuya Smart Inc. - E455EA - Dedicated Computing + C0544D + Nokia Shanghai Bell Co., Ltd. - B05CE5 - Nokia Corporation + CCCE1E + AVM Audiovisuelles Marketing und Computersysteme GmbH - 3482DE - Kiio Inc + 7CFF4D + AVM Audiovisuelles Marketing und Computersysteme GmbH - 4C5FD2 - Alcatel-Lucent + 3CA62F + AVM Audiovisuelles Marketing und Computersysteme GmbH - 28C718 - Altierre + 3C3712 + AVM Audiovisuelles Marketing und Computersysteme GmbH - 7C4C58 - Scale Computing Inc. + 0C7274 + AVM Audiovisuelles Marketing und Computersysteme GmbH - 1013EE - Justec International Technology Inc. + 04B4FE + AVM Audiovisuelles Marketing und Computersysteme GmbH - 8C271D - QuantHouse + 74B6B6 + eero inc. - 386077 - Pegatron Corporation + 30578E + eero inc. - 708105 - Cisco Systems Inc. + F021E0 + eero inc. - E0ED1A - vastriver Technology Ltd + 4C0143 + eero inc. - D4F63F - IEA S.R.L. + F8BBBF + eero inc. - 58B0D4 - ZuniData Systems Inc. + 00AB48 + eero inc. - 64557F - NSFOCUS Information Technology Ltd + 7CC882 + HUAWEI TECHNOLOGIES CO.,LTD - 00082F - Cisco Systems Inc. + 481F66 + China Mobile Group Device Co.,Ltd. - 9CC7D1 - Sharp Corporation + 0815AE + China Mobile Group Device Co.,Ltd. - 149090 - KongTop Industrial(shen zhen) Ltd + F4BFBB + China Mobile Group Device Co.,Ltd. - 38DE60 - Mohlenhoff GmbH + ECE7C2 + China Mobile Group Device Co.,Ltd. - 2839E7 - Preceno Technology Pte Ltd + 14A1DF + China Mobile Group Device Co.,Ltd. - 685E6B - PowerRay Ltd + CC96A2 + China Mobile Group Device Co.,Ltd. - 20C8B3 - Shenzhen BUL-Tech Ltd + FC2E19 + China Mobile Group Device Co.,Ltd. - F8E7B5 - uTech Tecnologia LtdA + 6C0F0B + China Mobile Group Device Co.,Ltd. - D4CEB8 - Enatel Ltd + EC9B2D + China Mobile Group Device Co.,Ltd. - 807A7F - ABB Genway Xiamen Electrical Equipment Ltd + DC152D + China Mobile Group Device Co.,Ltd. - 24DAB6 - Sistemas de Gestion Energetica S.A. de C.V + 60577D + eero inc. - B07D62 - Dipl.-Ing. H. Horstmann GmbH + ACEC85 + eero inc. - B8F5E7 - WayTools LLC + 0C1C1A + eero inc. - B81999 - Nesys + 64C269 + eero inc. - 34255D - Shenzhen Loadcom Technology Ltd + 7093C1 + eero inc. - 4CA74B - Alcatel Lucent + 64DAED + eero inc. - D03110 - Ingenic Semiconductor Ltd + 7C5E98 + eero inc. - 1CE192 - Qisda Corporation + 60F419 + eero inc. - 706F81 - Private + 0C93A5 + eero inc. - FC0012 - Toshiba Samsung Storage Technolgoy Korea Corporation + A8130B + eero inc. - 181420 - TEB SAS + 8CDD0B + eero inc. - AC81F3 - Nokia Corporation + B83FD2 + Mellanox Technologies, Inc. - 30688C - Reach Technology Inc. + A41B34 + China Mobile Group Device Co.,Ltd. - 10EED9 - Canoga Perkins Corporation + B4B9E6 + eero inc. - 94DE0E - SmartOptics AS + D83EEF + COOSEA GROUP (HK) COMPANY LIMITED - C029F3 - XySystem + 04585D + IEEE Registration Authority - AC4AFE - Hisense Broadband Multimedia Technology Ltd + D0789A + Vantiva - Connected Home - 54F5B6 - Oriental Pacific International Limited + C4864F + Beijing BitIntelligence Information Technology Co. Ltd. - 90342B - Gatekeeper Systems Inc. + 54926A + GD Midea Air-Conditioning Equipment Co.,Ltd. - 8CB82C - IPitomy Communications + C87F2B + INGRAM MICRO SERVICES - 807DE3 - Chongqing Sichuan Instrument Microcircuit Ltd + 788E45 + Jizaie inc. - DC175A - Hitachi High-Technologies Corporation + 4CFAC9 + BWS IoT - C8A1BA - Neul Ltd + 682499 + Quectel Wireless Solutions Co.,Ltd. - C43A9F - Siconix Inc. + 303B49 + Cisco Meraki - 686E23 - Wi3 Inc. + E0E6E3 + TeamF1 Networks Pvt Limited - DCF05D - Letta Teknoloji + 34FA1C + Beijing Xiaomi Mobile Software Co., Ltd - 848F69 - Dell Inc. + 2876CD + Funshion Online Technologies Co.,Ltd - 3C096D - Powerhouse Dynamics + 4CCF7C + HP Inc. - 900D66 - Digimore Electronics Ltd + 203A0C + eero inc. - 0C924E - Rice Lake Weighing Systems + 0015FF + Inseego Wireless, Inc - F49461 - NexGen Storage + 2880A2 + Inseego Wireless, Inc - B8CDA7 - Maxeler Technologies Ltd + 18EE86 + Inseego Wireless, Inc - 5435DF - Symeo GmbH + 20F4D4 + Apple, Inc. - F43D80 - FAG Industrial Services GmbH + 30C0AE + Apple, Inc. - F0DB30 - Yottabyte + F8E252 + Apple, Inc. - 9C31B6 - Kulite Semiconductor Products Inc + FC9F2A + Zyxel Communications Corporation - A4B36A - JSC SDO Chromatec + 4435B9 + NetComm Wireless Pty Ltd - E4DD79 - En-Vision America Inc. + 6475DA + Arcadyan Corporation - E8CC32 - Micronet Ltd + B0CCCE + IEEE Registration Authority - D43AE9 - DONGGUAN ipt IndUSTRIAL Ltd + B89C13 + Alps Alpine - 8C5CA1 - d-broad,Inc + BC76F9 + Ubiquoss Inc - 18F650 - Multimedia Pacific Limited + 24D1A1 + Shenzhen Cultraview Digital Technology Co., Ltd - 688470 - eSSys Ltd + 449FDA + Silicon Laboratories - 48DCFB - Nokia Corporation + A81F79 + Yingling Innovations Pte. Ltd. - 20B7C0 - OMICRON electronics GmbH + FCB214 + Apple, Inc. - 8058C5 - NovaTec Kommunikationstechnik GmbH + 2C9520 + Apple, Inc. - B8C716 - Fiberhome Telecommunication Technologies Ltd + 802395 + AVM Audiovisuelles Marketing und Computersysteme GmbH - D42C3D - Sky Light Digital Limited + 983268 + Silicon Laboratories - A45A1C - smart-electronic GmbH + DCB4D9 + Espressif Inc. - 806459 - Nimbus Inc. + EC7CBA + Hewlett Packard Enterprise - 8C89A5 - Micro-Star International + 0CA2F4 + Chameleon Technology (UK) Limited - B4A5A9 - MODI GmbH + 048F00 + Rong-Paisa Electronics Co., Ltd. - C436DA - Rusteletech Ltd + 8C5C53 + AltoBeam Inc. - 0432F4 - Partron + E8BFE1 + Intel Corporate - 1C184A - Shenzhen RicherLink Technologies Ltd + 644A7D + Intel Corporate - 0C3956 - Observator instruments + AC3DCB + Intel Corporate - DCA6BD - Beijing Lanbo Technology Ltd + 48E150 + Intel Corporate - 10C586 - BIO Sound LAB Ltd + B43A96 + Arista Networks - 10768A - EoCell + 94CDFD + eero inc. - F44EFD - Actions Semiconductor Ltd(Cayman Islands) + 6C2F1C + Nexus Raytek Pty Ltd - 24B8D2 - Opzoon Technology Ltd + E49F7D + Samsung Electronics Co.,Ltd - A49981 - FuJian Elite Power Tech Ltd + 609849 + Nokia Solutions and Networks India Private Limited - B83A7B - Worldplay (Canada) Inc. + 846EBC + Nokia Solutions and Networks India Private Limited - 1407E0 - Abrantix AG + 502E91 + AzureWave Technology Inc. - DCCF94 - Beijing Rongcheng Hutong Technology Ltd + 68F7D8 + Microsoft Corporation - A4DB2E - Kingspan Environmental Ltd + BC89A6 + Nintendo Co.,Ltd - C8FE30 - Bejing DAYO Mobile Communication Technology Ltd + C0CDD6 + Espressif Inc. - E4D71D - Oraya Therapeutics + 88B951 + Xiaomi Communications Co Ltd - 24C9DE - Genoray + E8CD15 + Vantiva USA LLC - 54055F - Alcatel Lucent + 60756C + LG Electronics - 6C5D63 - Shenzhen Rapoo Technology Ltd + 3CDC75 + Espressif Inc. - 941673 - Point Core SARL + 8C7AB3 + Guangzhou Shiyuan Electronic Technology Company Limited - 5C56ED - 3pleplay Electronics Private Limited + 7424CA + Guangzhou Shiyuan Electronic Technology Company Limited - 78028F - Adaptive Spectrum and Signal Alignment (ASSIA) Inc. + 70B258 + Ruckus Wireless - DC16A2 - Medtronic Diabetes + EC3111 + Sichuan AI-Link Technology Co., Ltd. - 308CFB - Dropcam + 006A5E + IEEE Registration Authority - D0EB9E - Seowoo Inc. + FC50D6 + Huawei Device Co., Ltd. - BCCD45 - Voismart + 605FAA + Huawei Device Co., Ltd. - 143E60 - Nokia + 247645 + Huawei Device Co., Ltd. - 7032D5 - Athena Wireless Communications Inc + D0B1CA + Shenzhen Skyworth Digital Technology CO., Ltd - 78510C - LiveU Ltd + D801EB + Infinity Electronics Ltd - 44AAE8 - Nanotec Electronic GmbH & Co. KG + 7CC178 + Ericsson AB - D428B2 - ioBridge Inc. + 28353A + HUAWEI TECHNOLOGIES CO.,LTD - 8427CE - Corporation Of the Presiding Bishop Of The Church Of Jesus Christ Of Latter-day Saints + 6030B3 + HUAWEI TECHNOLOGIES CO.,LTD - 48D8FE - ClarIDy Solutions Inc. + E87E1C + HUAWEI TECHNOLOGIES CO.,LTD - D4945A - Cosmo Ltd + C0151B + Sony Interactive Entertainment Inc. - 304C7E - Panasonic Electric Works Automation Controls Techno Ltd + D06827 + eero inc. - 5CF207 - Speco Technologies + C8664B + Aperion Technologies LLC - B42A39 - ORBIT MERRET, spol. s r. o. + BC4529 + zte corporation - 70E843 - Beijing C&W Optical Communication Technology Ltd + 9C65EE + Zhone Technologies, Inc. - 2C7ECF - Onzo Ltd + CC6C52 + Zhone Technologies, Inc. - 50E549 - Giga-Byte Technology Ltd + 8C73DA + Silicon Laboratories - B4B88D - Thuh Company + 345506 + GUANGDONG GENIUS TECHNOLOGY CO., LTD. - 4C73A5 - Kove + D47A97 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 70A41C - Advanced Wireless Dynamics S.L. + 6C1AEA + Texas Instruments - BCBBC9 - Kellendonk Elektronik GmbH + 684406 + Texas Instruments - E42AD3 - Magneti Marelli S.p.A. Powertrain + 840C6D + Cisco Systems, Inc - E83EB6 - RIM + E4B16C + Apple, Inc. - BC35E5 - Hydro Systems Company + 704CA2 + Apple, Inc. - 9C5D95 - VTC Electronics Corp. + 948978 + Apple, Inc. - B8A8AF - Logic S.p.A. + 28D5B1 + Apple, Inc. - 60F673 - Terumo Corporation + BC5A34 + New H3C Technologies Co., Ltd - 28CCFF - Corporacion Empresarial Altra SL + 2CCC7A + AltoBeam Inc. - 94FD1D - WhereWhen Corp + 80D1CE + Apple, Inc. - 4C07C9 - CoMPUTER OfFICE Ltd + F068E3 + AzureWave Technology Inc. - F8769B - Neopis Ltd + 04A924 + Mist Systems, Inc. - 74B00C - Network Video Technologies Inc. + 4C8E19 + Xiaomi Communications Co Ltd - E84040 - Cisco Systems Inc. + 20988E + Shenzhen Feasycom Co., Ltd - D89DB9 - eMegatech International Corp. + 14D5C6 + slash dev slash agents, inc - 405A9B - Anovo + 4438F3 + EM Microelectronic - E06995 - Pegatron Corporation + 1CD11A + Fortinet, Inc. - 84DE3D - Crystal Vision Ltd + 50514F + Netbeam Technology Limited - D075BE - Reno A&E + F8D00E + Vantiva USA LLC - BC6E76 - Green Energy Options Ltd + 94626D + Beijing Xiaomi Electronics Co.,Ltd - E828D5 - Cots Technology + E4BD96 + Chengdu Hurray Data Technology co., Ltd. - F8DAF4 - Taishan Online Technology Ltd + 18690A + Silicon Laboratories - 08D5C0 - Seers Technology Ltd + A46B40 + CHINA DRAGON TECHNOLOGY LIMITED - 6C33A9 - Magicjack LP + 7452CE + Hengtai Intelligent Technology (Zhongshan) Co., LTD - 108CCF - Cisco Systems Inc. + 840055 + VusionGroup - D8E3AE - Cirtec Medical Systems + 14B903 + HUAWEI TECHNOLOGIES CO.,LTD - 08B7EC - Wireless Seismic + 500B23 + HUAWEI TECHNOLOGIES CO.,LTD - 18AF9F - DIGITRONIC Automationsanlagen GmbH + C8B78A + HUAWEI TECHNOLOGIES CO.,LTD - 00B342 - MacroSAN Technologies Ltd + 60C418 + TPV Display Technology (Xiamen) Co.,Ltd. - 1CF5E7 - Turtle Industry Ltd + B02EBA + Earda Technologies co Ltd - 980EE4 - Private + 0C3D5E + Nanjing Qinheng Microelectronics Co., Ltd. - 447DA5 - Vtion Information Technology (Fujian) Ltd + B8CEED + Broadcom - 0CCDD3 - Eastriver Technology Ltd + CC0DCB + Microsoft Corporation - E46C21 - messMa GmbH + 30E044 + Google, Inc. - 00B033 - OAO Izhevskiy radiozavod + EC97E0 + Hangzhou Ezviz Software Co.,Ltd. - 081735 - Cisco Systems Inc. + 605E65 + Mellanox Technologies, Inc. - C89C1D - Cisco Systems Inc. + 54BAD9 + Intelbras - E437D7 - Henri Depaepe S.A.S. + 74317E + Ruckus Wireless - E0A1D7 - SFR + 405493 + zte corporation - 9481A4 - Azuray Technologies + F09258 + China Electronics Cloud Computing Technology Co., Ltd - BCE09D - Eoslink + 2C8D48 + Smart Innovation LLC - 9C220E - TASCAN Systems GmbH + 388CEF + Samsung Electronics Co.,Ltd - 7CDD90 - Shenzhen Ogemray Technology Ltd + 586010 + shenzhen zovoton electronic co.,ltd - 0C3C65 - Dome Imaging Inc + 0CC574 + FRITZ! Technology GmbH - C8DF7C - Nokia Corporation + 847003 + Axon Networks Inc. - B44CC2 - NR Electric Ltd + A0FFFD + HMD Global Oy - 48CB6E - Cello Electronics (UK) Ltd + 307AD2 + Apple, Inc. - BC4377 - Hang Zhou Huite Technology Ltd + D42DCC + Apple, Inc. - CC7669 - Seetech + 042EC1 + Apple, Inc. - AC20AA - DMATEK Ltd + B45575 + Apple, Inc. - FCAF6A - Qulsar Inc + 683036 + Apple, Inc. - 346F92 - White Rodgers Division + 284B54 + Apple, Inc. - 34BDF9 - Shanghai WDK Industrial Ltd + 6CE4A4 + Silicon Laboratories - CCBE71 - OptiLogix BV + 903F86 + New H3C Technologies Co., Ltd - 0C469D - MS Sedco + 6C885F + Private - B09AE2 - STEMMER IMAGING GmbH + 60D4AF + Honor Device Co., Ltd. - 14EE9D - AirNav Systems LLC + A0E390 + Apple, Inc. - 78D004 - Neousys Technology Inc. + 6C4CBC + TP-Link Systems Inc. - 8895B9 - Unified Packet Systems Crop + 402641 + HUAWEI TECHNOLOGIES CO.,LTD - D8FE8F - IDFone Ltd + 508D9E + HUAWEI TECHNOLOGIES CO.,LTD - 888C19 - Brady Corp Asia Pacific Ltd + 545925 + HUAWEI TECHNOLOGIES CO.,LTD - 448C52 - KTIS Ltd + 6C7F49 + Huawei Device Co., Ltd. - 006DFB - Vutrix Technologies Ltd + 608306 + Huawei Device Co., Ltd. - 841888 - Juniper Networks + 0C3CCD + Universal Global Scientific Industrial., Ltd - 9067B5 - Alcatel-Lucent + B89F09 + WNC Corporation - E0F379 - Vaddio + 885A85 + WNC Corporation - 78B6C1 - AOBO Telecom Ltd + 2824FF + WNC Corporation - 08D29A - Proformatique + DCB4E8 + Byos - C89383 - Embedded Automation Inc. + 002186 + Universal Global Scientific Industrial., Ltd - 78A051 - iiNet Labs Pty Ltd + A8A092 + CHINA DRAGON TECHNOLOGY LIMITED - 804F58 - ThinkEco Inc. + 7CAF77 + Nokia - 0475F5 - Csst + EC9E68 + Anhui Taoyun Technology Co., Ltd - 24BA30 - Technical Consumer Products Inc. + D49F29 + Fiberhome Telecommunication Technologies Co.,LTD - 188ED5 - TP Vision Belgium N.V. - innovation site Brugge + A8CEE7 + Fiberhome Telecommunication Technologies Co.,LTD - E80C38 - Daeyoung Information System Ltd + B882F2 + WNC Corporation - E08A7E - Exponent + 5CBF03 + EMOCO - E42771 - Smartlabs + 042405 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 34DF2A - Fujikon Industrial Ltd + 30836B + SteeRetail Co.,Ltd. - 2CDD0C - Discovergy GmbH + D056F2 + BUFFALO.INC - 40B2C8 - Nortel Networks + 801316 + Intel Corporate - 70A191 - Trendsetter Medical LLC + 2CEAFC + Intel Corporate - 708B78 - citygrow technology Ltd + 74F92C + Ubiquiti Inc - 64317E - Dexin Corporation + 5C3977 + Juniper Networks - 3C99F7 - Lansentechnology AB + 00047E + TKH Security B.V. - 507D02 - Biodit + ACF932 + NXP Semiconductor (Tianjin) LTD. - B4A4E3 - Cisco Systems Inc. + 4CD4B1 + NXP Semiconductor (Tianjin) LTD. - 8C1F94 - RF Surgical System Inc. + 0820E7 + Mellanox Technologies, Inc. - 4491DB - Shanghai Huaqin Telecom Technology Ltd + 60B763 + Silicon Laboratories - 14D76E - CoNCH ELECTRONIC Ltd + 304D1F + Amazon Technologies Inc. - AC83F0 - ImmediaTV Corporation + F04EA4 + HP Inc. - CC6B98 - Minetec Wireless Technologies + C83374 + Zyxel Communications Corporation - 3C04BF - PRAVIS SysTEMS Ltd + A8DD9F + Quectel Wireless Solutions Co.,Ltd. - 94DD3F - A+V Link Technologies, Corp. + 74675F + COMPAL INFORMATION(KUNSHAN)CO.,LTD. - F44227 - S & S Research Inc. + 0CBFB4 + IEEE Registration Authority - C8A729 - Systronics Ltd + 50613F + eero inc. - 4454C0 - Thompson Aerospace + 3C28A6 + ALE International - C4F464 - Spica international + C40415 + NETGEAR - 602A54 - CardioTek B.V. + 9CD36D + NETGEAR - Bcffac - Topcon Corporation + 008EF2 + NETGEAR - 445EF3 - Tonalite Holding B.V. + 6CB0CE + NETGEAR - 68DB96 - OPWILL Technologies Co Ltd + 9C3DCF + NETGEAR - 7C55E7 - YSI Inc. + 08028E + NETGEAR - 70B08C - Shenou Communication Equipment Ltd + CC40D0 + NETGEAR - C03B8F - Minicom Digital Signage + 1459C0 + NETGEAR - 20FEDB - M2M Solution S.A.S. + 288088 + NETGEAR - 0C8D98 - TOP Eight Ind Corp + 44A56E + NETGEAR - 40C7C9 - Naviit Inc. + A021B7 + NETGEAR - 7CBB6F - Cosco Electronics Ltd + 2CB05D + NETGEAR - 94A7BC - BodyMedia Inc. + E8FCAF + NETGEAR - C8A1B6 - Shenzhen Longway Technologies Ltd + 4CEFE1 + Dynacon Sp. z o.o. - 64A232 - OOO Samlight + 001F33 + NETGEAR - 64FC8C - Zonar Systems + 001B2F + NETGEAR - D0574C - Cisco Systems Inc. + 3833C5 + Microsoft Corporation - F8DAE2 - NDC Technologies + 901C9E + Alcatel-Lucent Enterprise - 705EAA - Action Target Inc. + 182439 + YIPPEE ELECTRONICS CP.,LIMITED - 34F968 - ATEK Products LLC + 3C8129 + Inheco Industrial Heating and Cooling GmbH - 20B0F7 - Enclustra GmbH + 50AB29 + Trackunit ApS - 543131 - Raster Vision Ltd + A42A26 + GD Midea Air-Conditioning Equipment Co.,Ltd. - D0E347 - Yoga + ECA78D + Cisco Systems, Inc - F0ED1E - Bilkon Bilgisayar Kontrollu Cih. Im Ltd + FC7288 + Cisco Systems, Inc - C416FA - Prysm Inc + 882985 + SZ DJI TECHNOLOGY CO.,LTD - 506F9A - Wi-Fi Alliance + 2482CA + vivo Mobile Communication Co., Ltd. - 842914 - EMPORIA TELECOM Produktions- und VertriebsgesmbH & Co KG + 7408AA + Ruijie Networks Co.,LTD - BC7DD1 - Radio Data Comms + 50E0F9 + GE Vernova - 585076 - Linear Equipamentos Eletronicos SA + 60B705 + Shenzhen Skyworth Digital Technology CO., Ltd - F0F9F7 - IES GmbH & Co. KG + 64EB94 + zte corporation - 38580C - Panaccess Systems GmbH + 1C7055 + HUAWEI TECHNOLOGIES CO.,LTD - 4451DB - Raytheon BBN Technologies + BC121F + ACCTON TECHNOLOGY CORPORATION - DCFAD5 - STRONG Ges.m.b.H. + 70D07E + Silicon Laboratories - 6C8D65 - Wireless Glue Networks Inc. + A0B53C + Vantiva Technologies Belgium - 9803A0 - ABB n.v. Power Quality Products + 0025CA + Ezurio, LLC - CC43E3 - Trump s.a. + 0C8832 + Nokia Solutions and Networks India Private Limited - F8C091 - Highgates Technology + 943B22 + NETGEAR - AC9B84 - Smak Tecnologia e Automacao + 300E43 + Apple, Inc. - 90F278 - Radius Gateway + 743F8E + Apple, Inc. - 806629 - Prescope Technologies Ltd + 883BDC + CJ intelligent technology LTD. - 241F2C - Calsys Inc. + B8A792 + Sichuan Tianyi Comheart Telecom Co.,LTD - F0BDF1 - Sipod Inc. + C8E713 + Bouffalo Lab (Nanjing) Co., Ltd. - 646707 - Beijing Omnific Technology Ltd + 1C8E2A + Apple, Inc. - ACA016 - Cisco Systems Inc. + 587607 + IEEE Registration Authority - 58E747 - Deltanet AG + 2419A5 + New H3C Technologies Co., Ltd - 404022 - ZIV + 6CAFAB + UAB Teltonika Telematics - A85BB0 - Shenzhen Dehoo Technology Ltd + 5483BB + Honda Motor Co., Ltd - 44A689 - Promax Electronica SA + A81378 + Nokia - 40618E - Stella-Green Co + 1C8EE6 + VTECH TELECOMMUNICATIONS LIMITED - 68E41F - Unglaube Identech GmbH + E096E8 + Fiberhome Telecommunication Technologies Co.,LTD - 4C60D5 - airPointe Of New Hampshire + 845B0C + eFAB P.S.A. - 888717 - Canon Inc. + 90AF59 + Choice IT Global LLC - 6CDC6A - Promethean Limited + F0C88B + Wyze Labs Inc - 9055AE - Ericsson, EAB/RWI/K + 34029C + D-Link Corporation - 1010B6 - McCain Inc + B46415 + Guangzhou V-Solution Telecommunication Technology Co.,Ltd. - 009363 - Uni-Link Technology Ltd + 6C77F0 + Huawei Device Co., Ltd. - D4823E - Argosy Technologies Ltd + 2462C6 + Huawei Device Co., Ltd. - 003532 - Electro-Metrics Corporation + 142004 + zte corporation - 081FF3 - Cisco Systems Inc. + B472D4 + zte corporation - 44376F - Young Electric Sign Co + 28DCC3 + HUAWEI TECHNOLOGIES CO.,LTD - 389F83 - OTN Systems N.V. + 1094EF + HUAWEI TECHNOLOGIES CO.,LTD - BC6A16 - tdvine + 8842D0 + Earda Technologies co Ltd - 003A9D - NEC Platforms Ltd + 5C1B17 + Bosch Automotive Electronics India Pvt. Ltd. - 28CD4C - Individual Computers GmbH + 14EB03 + SHENZHEN IP-COM NETWORKS CO.,LTD. - 8C53F7 - A&D Engineering Ltd + 786089 + Samsung Electronics Co.,Ltd - 7C7673 - ENMAS GmbH + A8D162 + Samsung Electronics Co.,Ltd - 6C6F18 - Stereotaxis Inc. + 9C935C + Unisyue Technologies Co;LTD - 84C727 - Gnodal Ltd + 4CEBB0 + Samsung Electronics Co.,Ltd - 087695 - Auto Industrial Ltd + FC5708 + Broadcom Limited - ACCE8F - HWA YAO Technologies Ltd + 10961D + NXP USA, Inc - 8C9236 - Aus.Linx Technology Ltd + 3487FB + GTAI - 10C73F - Midas Klark Teknik Ltd + 8CDD30 + Ruijie Networks Co.,LTD - F8912A - GLP German Light Products GmbH + 6083DA + Silicon Laboratories - 44E49A - Omnitronics Pty Ltd + E07291 + Silicon Laboratories - 08F2F4 - Net One Partners Ltd + ACD3FB + Arycs Technologies Inc - 0C7D7C - Kexiang Information Technology Ltd + 2C9D90 + Mellanox Technologies, Inc. - 3037A6 - Cisco Systems Inc. + E46DAB + Mellanox Technologies, Inc. - DC1D9F - U & B tech + 8C0528 + SHEN ZHEN TENDA TECHNOLOGY CO.,LTD - 785C72 - Hioso Technology Ltd + 9074AE + AzureWave Technology Inc. - 580556 - Elettronica GF S.r.L. + E82D79 + AltoBeam Inc. - B09074 - Fulan Electronics Limited + 184CAE + AUMOVIO France S.A.S. - 94F692 - Geminico Ltd + 0054AF + AUMOVIO Systems, Inc. - 68EFBD - Cisco Systems Inc. + 20AD56 + AUMOVIO Systems, Inc. - F02408 - Talaris (Sweden) AB + 6C8166 + Private - 8081A5 - TONGQING CoMMUNICATION EQUIPMENT (Shenzhen) Ltd + D0EA11 + Routerboard.com - B482FE - Askey Computer Corp + D8FC92 + Tuya Smart Inc. - 307C30 - RIM + B4E25B + HP Inc. - BC4E3C - Core Staff Ltd + DC74CE + ITOCHU Techno-Solutions Corporation - 502A8B - Telekom Research and Development Sdn Bhd + B8511D + TELECHIPS, INC - EC43E6 - AWCER Ltd + 1003CD + Calix Inc. - 7812B8 - Orantek Limited + 9C28BF + AUMOVIO Czech Republic s.r.o. - 98BC99 - Edeltech Ltd + 0C0FD8 + GSD VIET NAM TECHNOLOGY COMPANY LIMITED - F02FD8 - Bi2-Vision + 144FF0 + NXP Semiconductors Taiwan Ltd. - 544249 - Sony Corporation + D41368 + Shenzhen Intellirocks Tech. Co. Ltd. - 904716 - Rorze Corporation + F47018 + Hangzhou Ezviz Software Co.,Ltd. - 10445A - Shaanxi Hitech Electronic Ltd + E45341 + Apple, Inc. - F47626 - Viltechmeda UAB + 68A729 + Apple, Inc. - 0C17F1 - Telecsys + 742917 + Apple, Inc. - 003A9B - Cisco Systems Inc. + 4C55B2 + Xiaomi Communications Co Ltd - 2C3427 - Erco & Gener + A422B6 + Motorola Mobility LLC, a Lenovo Company - 80912A - Lih Rong electronic Enterprise Ltd + CC808F + Apple, Inc. - 7C2F80 - Gigaset Communications GmbH + E0BA78 + Apple, Inc. - 10B7F6 - Plastoform Industries Ltd + 982AFD + HUAWEI TECHNOLOGIES CO.,LTD - 448E81 - VIG + 2CAE46 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 8894F9 - Gemicom Technology Inc. + 6C7742 + zte corporation - 502A7E - Smart electronic GmbH + 10CD54 + HUAWEI TECHNOLOGIES CO.,LTD - 5C8778 - Cybertelbridge Ltd + 94A25D + HUAWEI TECHNOLOGIES CO.,LTD - 38BB23 - OzVision America LLC + B4C3D9 + HUAWEI TECHNOLOGIES CO.,LTD - 0C8411 - A.O. Smith Water Products + 542618 + HUAWEI TECHNOLOGIES CO.,LTD - E0ABFE - Orb Networks Inc. + 9020D7 + Microsoft Corporation - 448312 - Star-Net + 28B20B + NXP USA, Inc - A05DE7 - DIRECTV Inc. + 80AF9F + eero inc. - 087618 - ViE Technologies Sdn. Bhd. + BC9C8D + Ruckus Wireless - D0E40B - Wearable Inc. + 647084 + AltoBeam Inc. - 747E1A - Red Embedded Design Limited + 00151E + B&R Industrial Automation GmbH - 14A86B - Shenzhen Telacom Science & Technology Ltd + 802AF6 + Honor Device Co., Ltd. - 0CC3A7 - Meritec + 00A307 + Honor Device Co., Ltd. - DCE2AC - Lumens Digital Optics Inc. + 64D562 + Huawei Device Co., Ltd. - 98D88C - Nortel Networks + 6095F8 + Arcadyan Corporation - 78192E - NASCENT Technology + 00111E + B&R Industrial Automation GmbH - 48EB30 - Eterna Technology Inc. + DC155C + Anntec (Beijing) Technology Co.,Ltd. - 4C322D - Teledata Networks + 0894EC + Huawei Device Co., Ltd. - AC867E - Create New Technology (HK) Limited Company + CCB775 + Huawei Device Co., Ltd. - 8C598B - C Technologies AB + 98A375 + Huawei Device Co., Ltd. - D44CA7 - Informtekhnika & Communication LLC + B8752E + Huawei Device Co., Ltd. - A8C222 - TM-Research Inc. + 10A879 + Intel Corporate - 003D41 - Hatteland Computer AS + 90B176 + Intel Corporate - CC5076 - Ocom Communications Inc. + 70A04B + Intel Corporate - 4CC452 - Shang Hai Tyd. Electon Technology Ltd + 0CAE39 + Intel Corporate - 7CCB0D - Antaira Technologies LLC + 04A6C8 + Intel Corporate - C01E9B - Pixavi AS + 0C527F + Check Point Software Technologies Ltd. - 803B9A - ghe-ces electronic ag + 88FEB6 + ASKEY COMPUTER CORP - 743256 - NT-ware Systemprg GmbH + 6C5640 + BLU Products Inc - C4E17C - U2S Co. + 80FD7B + BLU Products Inc - 20BFDB - DVL + 0C0CEA + BLU Products Inc - 20415A - Smarteh d.o.o. + 681EA3 + Sichuan Tianyi Comheart Telecom Co.,LTD - A4DA3F - Bionics Corp. + 9C4711 + ACCTON TECHNOLOGY CORPORATION - A04025 - Actioncable Inc. + 60464C + Ligent Tech,Inc - 4C4B68 - Mobile Device Inc. + E8EA7C + Shenzhen Amazwear Holdings Co., Ltd - 201257 - Most Lucky Trading Ltd + EC9B75 + Roku, Inc - E8DAAA - VideoHome Technology Corp. + A4A64E + Mellanox Technologies, Inc. - 647D81 - Yokota Industrial Ltd + 2CB1B7 + Mellanox Technologies, Inc. - 7CCFCF - Shanghai SEARI Intelligent System Ltd + 0C8509 + SHEN ZHEN TENDA TECHNOLOGY CO.,LTD - 68AAD2 - Datecs Ltd + 949CBE + HUAWEI TECHNOLOGIES CO.,LTD - A4DE50 - Total Walther GmbH + 88BA74 + Silicon Laboratories - 1CF061 - SCAPS GmbH + 8079EF + SUB-ZERO GROUP, INC. - A893E6 - Jiangxi Jinggangshan Cking Communication Technology Ltd + 845029 + Arista Networks - C4AAA1 - SUMMIT DEVELOPMENT, spol.s r.o. + 681268 + Quectel Wireless Solutions Co.,Ltd. - 3032D4 - Hanilstm Ltd + 185F27 + Motorola Mobility LLC, a Lenovo Company - E064BB - DigiView S.r.l. + 98F04C + Cisco Systems, Inc - DC3350 - TechSAT GmbH + 88C093 + GIGAMEDIA - F0BCC8 - MaxID (Pty) Ltd + 3CBE8E + Guangzhou Shiyuan Electronic Technology Company Limited - 24828A - Prowave Technologies Ltd + 344A86 + Honor Device Co., Ltd. - 68CC9C - Mine Site Technologies + DC69CC + LG Innotek - 146E0A - Private + B4C0C3 + TP-Link Systems Inc. - 0CE709 - Fox Crypto B.V. + 203389 + Google, Inc. - B4B5AF - Minsung Electronics + 0005BA + XK22 Enterprises, LLC - 04B3B6 - Seamap (UK) Ltd + F81E49 + Apple, Inc. - 00270B - Adura Technologies + BC74EA + Apple, Inc. - 00270D - Cisco Systems Inc. + 70AE2A + Apple, Inc. - 00271B - Alec Sicherheitssysteme GmbH + C02D10 + MOHAN ELECTRONICS AND SYSTEMS - 002718 - Suzhou NEW SEAUNION Video Technology Ltd + 18B842 + Apple, Inc. - 6C0F6A - JDC Tech Ltd + 2C1CF7 + Apple, Inc. - 04B466 - BSP Ltd + 7498F4 + BUFFALO.INC - D8D67E - GSK CNC Equipment Ltd + 0C83F4 + Canopy Works, Inc. - 0026AE - Wireless Measurement Ltd + D0C6BE + HPRO-Video - 0026B1 - Navis Auto Motive Systems Inc. + 84AEDE + Xiaomi Communications Co Ltd - 0026AA - Kenmec Mechanical Engineering Ltd + CC0C9C + CIG SHANGHAI CO LTD - 0026D2 - Pcube Systems Inc. + A4D7D6 + Shenzhen Linkoh Network Technology Co;Ltd - 0026CD - PurpleComm Inc. + B80B9A + HUAWEI TECHNOLOGIES CO.,LTD - 002707 - Lift Complex DS, JSC + C82691 + Arista Networks, Inc. - 0026D7 - KM Electornic Technology Ltd + 0013AE + Radiance Technologies, Inc. - 0026D0 - Semihalf + B4B650 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 0026FE - MKD Technology Inc. + 68C8C0 + GSD VIET NAM TECHNOLOGY COMPANY LIMITED - 0026A0 - moblic + D46663 + Shenzhen Detran Technology Co.,Ltd. - 0026E5 - AEG Power Solutions + FCE421 + zhejiang Dusun Electron Co.,Ltd - 0026E3 - DTI + 2041BC + ANY Electronics Co., Ltd - 0026BC - General Jack Technology Ltd + 0024AE + IDEMIA PUBLIC SECURITY FRANCE - 002696 - NOOLIX Ltd + DC73FC + Mellanox Technologies, Inc. - 00269A - Carina System Ltd + CC3089 + Mellanox Technologies, Inc. - 002695 - ZT Group Int'l Inc + 444A4C + vivo Mobile Communication Co., Ltd. - 002693 - QVidium Technologies Inc. + 849CA6 + Arcadyan Corporation - 002665 - ProtectedLogic Corporation + 00264D + Arcadyan Corporation - 002660 - Logiways + ECB5AF + RayService a.s. - 002670 - Cinch Connectors + 20B37F + IEEE Registration Authority - 002671 - AUTOVISION Ltd + 18F58B + GlobalReach Technology EMEA Ltd - 002648 - Emitech Corp. + 6CE20C + Hangzhou SDIC Microelectronics Inc. - 002645 - Circontrol S.A. + 4490BA + CHINA DRAGON TECHNOLOGY LIMITED - 00263E - Trapeze Networks + 78E0C5 + Samsung Electronics Co.,Ltd - 00263C - Bachmann Technology GmbH & Co. KG + 8CEE17 + GYGES LABS PTE.LTD - 00263D - MIA Corporation + 2CB471 + Tuya Smart Inc. - 002678 - Logic Instrument SA + 0076B6 + Ford Motor Company - 002677 - Deif A/S + 801D0D + IEEE Registration Authority - 00268E - Alta Solutions Inc. + EC96BF + Kontron eSystems GmbH - 002688 - Juniper Networks + B03DBF + shenzhen ceita communications technology co.,ltd - 0025DA - Secura Key + C0A36D + HUAWEI TECHNOLOGIES CO.,LTD - 0025DB - ATI Electronics(Shenzhen) Ltd + 3410D0 + HUAWEI TECHNOLOGIES CO.,LTD - 0025D5 - Robonica (Pty) Ltd + CC13F3 + Hangzhou Hikvision Digital Technology Co.,Ltd. - 0025E2 - Everspring Industry Ltd + 9C7F64 + Nanjing Qinheng Microelectronics Co., Ltd. - 0025E1 - Shanghai Seeyoo Electronic & Technology Ltd + ECA1CC + Cisco Systems, Inc - 00260E - Ablaze Systems LLC + F4B821 + Cisco Systems, Inc - 002610 - Apacewave Technologies + C0E579 + Huawei Device Co., Ltd. - 00260D - Mercury Systems Inc. + CC8130 + Intelbras - 00260A - Cisco Systems Inc. + 9036B2 + TRATON AB - 002632 - Instrumentation Technologies d.d. + AC3019 + Shenzhen Hailingwei Electronics Co., Ltd. - 00262E - Chengdu Jiuzhou Electronic Technology Inc + A0F261 + Palo Alto Networks - 00262C - IKT Advanced Technologies s.r.o. + 74F714 + Lushare Precision Industry Co.,LTD - 002629 - Juphoon System Software Inc. + A0146D + Suzhou NODKA Automation Technology Co.,Ltd - 002625 - MediaSputnik + 8C49CF + Private - 002626 - Geophysical Survey Systems Inc. + 90F04C + Nokia Solutions (Shanghai) Co.,Ltd. - 0025CC - Mobile Communications Korea Incorporated + 6815D3 + R&G PLUS Sp. z o.o. - 0025F9 - GMK electronic design GmbH + 748FBF + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 0025F7 - Ansaldo STS USA + 3CA239 + DGSQ Co.,Ltd - 00261B - Laurel Bank Machines Ltd + 681977 + New H3C Technologies Co., Ltd - 002614 - Ktnf + C492D9 + zte corporation - 002603 - Shenzhen Wistar Technology Ltd + 54BB8F + ACCTON TECHNOLOGY CORPORATION - 0025A6 - Central Network Solution Ltd + 70C288 + Intel Corporate - 0025AA - Beijing Soul Technology Ltd + 741348 + Blink by Amazon - 002588 - Genie Industries Inc. + 803B70 + Private - 002580 - Equipson S.A. + 788AFB + HANSHOW TECHNOLOGY CO.,LTD. - 0025BD - Italdata Ingegneria dell'Idea S.p.A. + 401277 + Microsoft Corporation - 0025B7 - Costar electronics Inc., + 3CA00E + Shenzhen Skyworth Digital Technology CO., Ltd - 00257D - PointRed Telecom Private Ltd + FC2422 + Hangzhou Ezviz Software Co.,Ltd. - 0025A2 - Alta Definicion LINCEO S.L. + 90922C + Changzhi City Zhouyi Hengtong Information Security Co.,Ltd. - 00256D - Broadband Forum + BCFABA + Mellanox Technologies, Inc. - 00256C - Azimut Production Association JSC + D49477 + FONEX Data Systems Inc. - 002563 - Luxtera Inc + DC1B48 + Texas Instruments - 002593 - DatNet Informatikai Kft. + 64D363 + Seyond - 00258E - The Weather Channel + F449EF + EMSTONE - 0025A3 - Trimax Wireless Inc. + AC8746 + Huizhou BYD Electronic Co., Ltd. - 00259C - Cisco-Linksys LLC + 780C48 + Hong Kong Yihao Electronic Technology Co., Limited - 0025C8 - S-Access GmbH + 68709E + Silicon Laboratories - 0025C0 - ZillionTV Corporation + 74DA78 + HP Inc. - 00251B - Philips CareServant + 805A70 + Fortinet, Inc. - 002518 - Power PLUS Communications AG + 9C1FE6 + Shenzhen Skyworth Display Technologies Co.,Ltd - 002515 - SFR + B465DC + CHINA DRAGON TECHNOLOGY LIMITED - 00250D - GZT Telkom-Telmor sp. z o.o. + F42F97 + Embrava USA, Inc - 00250E - gt german telematics GmbH + 342601 + HUAWEI TECHNOLOGIES CO.,LTD - 002531 - Cloud Engines Inc. + AC2477 + Shenzhen Tinno Mobile Technology Corp - 00252D - Kiryung Electronics + F8A5E6 + Magicyo Technology CO.,Ltd - 002545 - Cisco Systems Inc. + E8B853 + GSD VIET NAM TECHNOLOGY COMPANY LIMITED - 002542 - Pittasoft + C48ACE + HISENSE VISUAL TECHNOLOGY CO.,LTD - 002536 - Oki Electric Industry Ltd + 5CA931 + Ubee Interactive Co., Limited - 002541 - Maquet Critical Care AB + 6421FD + Guang zhou Xradio Technology Co., Ltd - 00252B - Stirling Energy Systems + 98FE54 + Raspberry Pi (Trading) Ltd - 002524 - Lightcomm Technology Ltd + DC8E6D + Huawei Device Co., Ltd. - 00254E - Vertex Wireless Ltd + CCA30C + Silicon Laboratories - 002546 - Cisco Systems Inc. + 70287D + Google, Inc. - 002522 - ASRock Incorporation + E8BA17 + Beijing Xiaomi Mobile Software Co., Ltd - 002560 - Ibridge Networks & Communications Ltd + B064E0 + Samsung Electronics Co.,Ltd - 0024B8 - free alliance sdn bhd + 946442 + CELESTICA INC. - 0024B3 - Graf-Syteco GmbH & Co. KG + 50857C + eero inc. - 0024F6 - Miyoshi Electronics Corporation + 241AF7 + Sichuan Tianyi Comheart Telecom Co.,LTD - 0024F0 - Seanodes + 3C3558 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 0024CB - Autonet Mobile + 786559 + Sagemcom Broadband SAS - 0024D1 - Thomson Inc. + 10D7B0 + Sagemcom Broadband SAS - 0024C9 - Broadband Solutions Group + 70733A + Jiangxi Remote lntelligence Technology Co.,Ltd - 0024CA - Tobii Technology AB + 5488D5 + zte corporation - 002508 - Maquet Cardiopulmonary AG + 880FA2 + Sagemcom Broadband SAS - 0024FC - QuoPin Ltd + DC97E6 + Sagemcom Broadband SAS - 0024FB - Private + 4C195D + Sagemcom Broadband SAS - 0024FA - Hilger u. Kern GmbH + EC50A6 + Sagemcom Broadband SAS - 0024D0 - Shenzhen SOGOOD Industry Ltd + 60156F + TP-Link Systems Inc. - 0024CC - Fascinations Toys and Gifts Inc. + 84679A + Arm Ltd - 0024C7 - Mobilarm Ltd + 38B4D3 + BSH Hausgeräte GmbH - 0024DF - Digitalbox Europe GmbH + BC4F2D + Apple, Inc. - 002445 - Adtran Inc + 8C8283 + Apple, Inc. - 00243F - Storwize Inc. + 5CB8B7 + Apple, Inc. - 002497 - Cisco Systems Inc. + 109E6B + Apple, Inc. - 0024A3 - Sonim Technologies Inc + 989E85 + Honor Device Co., Ltd. - 0024AA - Dycor Technologies Ltd + 0C5427 + Dongguan Huayin Electronic Technology Co., Ltd. - 0024A9 - Ag Leader Technology + 14C7C4 + Zyxel Communications Corporation - 0024A6 - TELESTAR DIGITAL GmbH + EC2C0D + Apple, Inc. - 00249B - Action Star Enterprise Ltd + D846CE + Apple, Inc. - 002471 - Fusion MultiSystems dba Fusion-io + 000231 + Ingersoll-Rand - 002474 - Autronica Fire And Securirty + 000374 + Schneider Electric - 002446 - MMB Research Inc. + 780C26 + Trafag AG - 002463 - Phybridge Inc + 7428AE + Mellanox Technologies, Inc. - 002472 - ReDriven Power Inc. + 2059D1 + Mellanox Technologies, Inc. - 00241C - FuGang Electronic (DG) Ltd + 649746 + AzureWave Technology Inc. - 002419 - Private + 44995B + GX India Pvt Ltd - 002415 - Magnetic Autocontrol GmbH + 241F49 + NXP Semiconductors Taiwan Ltd. - 0023E7 - Hinke A/S + 7C9824 + Sagemcom Broadband SAS - 0023E2 - SEA Signalisation + 0430FA + Cisco Systems, Inc - 002425 - Shenzhenshi chuangzhicheng Technology Ltd + F45BB4 + Cisco Systems, Inc - 002427 - SSI Computer Corp + D455AD + go-e GmbH - 002411 - PharmaSmart LLC + 8C20F1 + OpenAI - 00240F - Ishii Tool & Engineering Corporation + DCDE4B + SHENZHEN TRANSCHAN TECHNOLOGY LIMITED - 0023FA - RG Nets Inc. + 2CFB0F + Sagemcom Broadband SAS - 0023F2 - TVLogic + BCD5ED + Sagemcom Broadband SAS - 00240A - US Beverage Net + B88C2B + Sagemcom Broadband SAS - 002407 - Telem SAS + 00F8CC + Sagemcom Broadband SAS - 002440 - Halo Monitoring Inc. + DC9272 + Sagemcom Broadband SAS - 0023CF - Cummins-Allison Corp. + 180C7A + Sagemcom Broadband SAS - 0023C2 - SAMSUNG Electronics Ltd + 9C2472 + Sagemcom Broadband SAS - 0023C4 - Lux Lumen + 2047B5 + Sagemcom Broadband SAS - 0023C5 - Radiation Safety and Control Services Inc + 707DA1 + Sagemcom Broadband SAS - 0023C6 - SMC Corporation + 8C9A8F + Sagemcom Broadband SAS - 002388 - V.T. Telematica S.p.a. + 087B12 + Sagemcom Broadband SAS - 002383 - InMage Systems Inc + D0CF0E + Sagemcom Broadband SAS - 002381 - Lengda Technology(Xiamen) Ltd + C0A3C7 + Telink Micro LLC - 0023BF - Mainpine Inc. + D833B7 + Sagemcom Broadband SAS - 0023B2 - Intelligent Mechatronic Systems Inc + D06DC9 + Sagemcom Broadband SAS - 0023B5 - Ortana Ltd + 3453D2 + Sagemcom Broadband SAS - 0023B9 - Airbus Defence and Space Deutschland GmbH + 582FF7 + Sagemcom Broadband SAS - 0023BD - Digital Ally Inc. + 84A423 + Sagemcom Broadband SAS - 0023D5 - WAREMA electronic GmbH + 48E27E + Sagemcom Broadband SAS - 0023C9 - Sichuan Tianyi Information Science & Technology Stock Ltd + BC33DB + Sagemcom Broadband SAS - 0023CE - Kita Denshi Corporation + AC3B77 + Sagemcom Broadband SAS - 0023A9 - Beijing Detianquan Electromechanical Equipment Ltd + 000E59 + Sagemcom Broadband SAS - 00239B - Elster Solutions LLC + 84A1D1 + Sagemcom Broadband SAS - 00237B - Whdi LLC + 34495B + Sagemcom Broadband SAS - 002324 - G-PRO Computer + 34DB9C + Sagemcom Broadband SAS - 0023E0 - INO Therapeutics LLC + 00CB51 + Sagemcom Broadband SAS - 002390 - Algolware Corporation + C4EB42 + Sagemcom Broadband SAS - 002311 - Gloscom Ltd + 78C213 + Sagemcom Broadband SAS - 002309 - Janam Technologies LLC + CC33BB + Sagemcom Broadband SAS - 002304 - Cisco Systems Inc. + E8F1B0 + Sagemcom Broadband SAS - 00235D - Cisco Systems Inc. + 100645 + Sagemcom Broadband SAS - 00235C - Aprius Inc. + 20500D + Espressif Inc. - 002352 - DATASENSOR S.p.A. + 4C17EB + Sagemcom Broadband SAS - 00232F - Advanced Card Systems Ltd + D885AC + Espressif Inc. - 002353 - F E T Elettronica snc + D4E9F4 + Espressif Inc. - 002342 - Coffee Equipment Company + 1CDBD4 + Espressif Inc. - 002337 - Global Star Solutions ULC + 5CCF7F + Espressif Inc. - 002319 - Sielox LLC + BCDDC2 + Espressif Inc. - 00236A - SmartRG Inc + CC50E3 + Espressif Inc. - 002331 - Nintendo Ltd + 2462AB + Espressif Inc. - 002335 - Linkflex Ltd + 500291 + Espressif Inc. - 002325 - IOLAN Holding + 8CAAB5 + Espressif Inc. - 002321 - Avitech International Corp + 7CDFA1 + Espressif Inc. - 002370 - Snell + AC67B2 + Espressif Inc. - 0022B9 - Analogix Seminconductor Inc. + 0CDC7E + Espressif Inc. - 0022B8 - Norcott + A020A6 + Espressif Inc. - 0022B7 - GSS Grundig SAT-Systems GmbH + 24B2DE + Espressif Inc. - 0022B3 - Sei S.p.A. + D8A01D + Espressif Inc. - 00229C - Verismo Networks Inc + E072A1 + Espressif Inc. - 00229A - Lastar Inc. + ACA704 + Espressif Inc. - 0022EE - Algo Communication Products Ltd + A4F00F + Espressif Inc. - 0022EA - Rustelcom Inc. + EC94CB + Espressif Inc. - 0022F0 - 3 Greens Aviation Limited + 441793 + Espressif Inc. - 0022EC - Idealbt Technology Corporation + 686725 + Espressif Inc. - 0022DD - Protecta Electronics Ltd + 349454 + Espressif Inc. - 0022AB - Shenzhen Turbosight Technology Ltd + A4E57C + Espressif Inc. - 00229B - AverLogic Technologies Inc. + 68EE8F + Espressif Inc. - 0022BE - Cisco Systems Inc. + F024F9 + Espressif Inc. - 0022BF - SieAmp Group Of Companies + 8CBFEA + Espressif Inc. - 0022DB - Translogic Corporation + F4650B + Espressif Inc. - 0022DA - Anatek LLC + 38182B + Espressif Inc. - 0022F9 - Pollin Electronic GmbH + 1020BA + Espressif Inc. - 0022C5 - InfORSON Ltd + B8F862 + Espressif Inc. - 002262 - BEP Marine + 5443B2 + Espressif Inc. - 00226A - Honeywell + 4022D8 + Espressif Inc. - 002263 - Koos Technical Services Inc. + 083A8D + Espressif Inc. - 00226C - LinkSprite Technologies Inc. + BC1469 + Phyplus Technology (Shanghai) Co., Ltd - 00225C - Multimedia & Communication Technology + 9C9E6E + Espressif Inc. - 002284 - Desay A&V Science AND Technology Ltd + 78EE4C + Espressif Inc. - 002286 - Astron + 4CC382 + Espressif Inc. - 002282 - 8086 Consultancy + 10B41D + Espressif Inc. - 002246 - Evoc Intelligent Technology Ltd + D8132A + Espressif Inc. - 002248 - Microsoft Corporation + 586D0C + Hewlett Packard Enterprise - 002290 - Cisco Systems Inc. + B4FBE3 + AltoBeam Inc. - 00228A - Teratronik elektronische Systeme GmbH + 88287D + AltoBeam Inc. - 00228E - TV-Numeric + 28F366 + SHENZHEN BILIAN ELECTRONIC CO.,LTD - 002254 - Bigelow Aerospace + 8457EB + Motorola Mobility LLC, a Lenovo Company - 002257 - 3Com Europe Ltd + 543CED + Sagemcom Broadband SAS - 002276 - Triple EYE B.V. + 8022A7 + NEC Platforms, Ltd. - 002274 - FamilyPhone AB + D826D3 + eero inc. - 002236 - Vector SP. Z O.O. + 2C3F87 + Private - 002230 - FutureLogic Inc. + 0C166E + WirelessMobility Engineering Centre SDN. BHD - 00222E - maintech GmbH + D8FB58 + Mellanox Technologies, Inc. - 002214 - Rinnai Korea + 18D0E1 + Mellanox Technologies, Inc. - 00220B - National Source Coding Center + 889986 + TP-LINK TECHNOLOGIES CO.,LTD. - 00220C - Cisco Systems Inc. + 743989 + TP-LINK TECHNOLOGIES CO.,LTD. - 0021EA - Bystronic Laser AG + DC0077 + TP-LINK TECHNOLOGIES CO.,LTD. - 0021FD - Lacroix Traffic S.A.U + 6032B1 + TP-LINK TECHNOLOGIES CO.,LTD. - 0021CD - LiveTV + 3C6A48 + TP-LINK TECHNOLOGIES CO.,LTD. - 0021D0 - Global Display Solutions Spa + 487F80 + FRITZ! Technology GmbH - 002228 - Breeze Innovations Ltd + 30EB5A + Landis+Gyr S.A. - 002229 - Compumedics Ltd + 98B177 + Landis+Gyr S.A. - 002216 - Shibaura Vending Machine Corporation + E8FEBE + Apple, Inc. - 0021E1 - Nortel Networks + 8817A8 + Apple, Inc. - 002200 - IBM Corp + 74D5E8 + Apple, Inc. - 0021C6 - CSJ Global Inc. + 4463B6 + Apple, Inc. - 0021C3 - CoRNELL Communications Inc. + 683B09 + Apple, Inc. - 0021C7 - Russound + C8BBB4 + GSD VIET NAM TECHNOLOGY COMPANY LIMITED - 0021C1 - ABB Oy / Medium Voltage Products + 343638 + HUAWEI TECHNOLOGIES CO.,LTD - 0021C0 - Mobile Appliance Inc. + 6079C9 + HUAWEI TECHNOLOGIES CO.,LTD - 0021BB - Riken Keiki Ltd + 383E51 + Espressif Inc. - 002166 - NovAtel Inc. + 78B5F2 + HUAWEI TECHNOLOGIES CO.,LTD - 002164 - Special Design Bureau for Seismic Instrumentation + 64C045 + Apple, Inc. - 002160 - Hidea Solutions Ltd + EC8439 + BITMAIN DEVELOPMENT PTE. LTD. - 0021B1 - Digital Solutions Ltd + DCB808 + Extreme Networks, Inc. - 0021B0 - Tyco Telecommunications + 489BD5 + Extreme Networks, Inc. - 0021AD - Nordic ID Oy + BCF310 + Extreme Networks, Inc. - 00217F - Intraco Technology Pte Ltd + E01C41 + Extreme Networks, Inc. - 00217D - Pyxis S.R.L. + 84E6B3 + Tiinlab Corporation - 00216F - SymCom Inc. + FC0A81 + Extreme Networks, Inc. - 0021A3 - Micromint + 000130 + Extreme Networks, Inc. - 0021A5 - ERLPhase Power Technologies Ltd + F46E95 + Extreme Networks, Inc. - 00219D - Adesys BV + 1093C9 + Kingsignal Technology Co., Ltd. - 002195 - GWD Media Limited + C41062 + Cornet Technology India Pvt Ltd - 002188 - EMC Corporation + 80DACE + Huawei Device Co., Ltd. - 00211A - LInTech Corporation + 24BA23 + Cisco Systems, Inc - 002116 - Transcon Electronic Systems, spol. s r. o. + 084F44 + GEW (EC) Ltd - 002115 - PHYWE Systeme GmbH & Co. KG + DC233B + Extreme Networks, Inc. - 002141 - Radlive + C851FB + Extreme Networks, Inc. - 002140 - EN Technologies Inc. + 601D56 + Extreme Networks, Inc. - 00213D - Cermetek Microelectronics Inc. + 500A9C + Extreme Networks, Inc. - 002111 - Uniphone Inc. + 0CED71 + Extreme Networks, Inc. - 002114 - Hylab Technology Inc. + A49791 + Extreme Networks, Inc. - 002132 - Masterclock Inc. + 7CA4F7 + Extreme Networks, Inc. - 002131 - Blynke Inc. + DCBB3D + Extreme Networks, Inc. - 002129 - Cisco-Linksys LLC + C8665D + Extreme Networks, Inc. - 00211D - Dataline AB + D854A2 + Extreme Networks, Inc. - 002120 - Sequel Technologies + B027CF + Extreme Networks, Inc. - 002152 - General Satellite Research & Development Limited + 8C497A + Extreme Networks, Inc. - 002158 - Style Flying Technology Co. + E4DBAE + Extreme Networks, Inc. - 002148 - Kaco Solar Korea + 0007CC + dormakaba Deutschland GmbH - 00213C - AliphCom + 000BD7 + dormakaba Deutschland GmbH - 001FB5 - I/O Interconnect Inc. + 6CE40D + Raisecom Technology CO., LTD - 001FE7 - Simet + 740B12 + Silicon Laboratories - 001FDB - Network Supply Corp., + 5CC786 + ShenZhen Tengxin Electronics Manufacturing Co.,Ltd. - 001FBF - Fulhua Microelectronics Corp. Taiwan Branch + F4BDAE + Shenzhen V-Link Technology CO., LTD. - 001FBE - Shenzhen Mopnet Industrial Ltd + D09282 + Apple, Inc. - 001FC2 - Jow Tong Technology Ltd + 503B70 + Apple, Inc. - 001FD2 - Commtech Technology Macao Commercial Offshore Ltd + 20D5C2 + Espressif Systems (Singapore) Pte. Ltd - 001FB8 - Universal Remote Control Inc. + 98C377 + Espressif Inc. - 001FD4 - 4IPNET Inc. + B0FC4B + Shenzhen Phaten Tech. LTD - 001FCB - NIW Solutions + 6CDA1D + SUNTON TECHNOLOGY (M) SDN. BHD - 001FF7 - Nakajima All Precision Ltd + 5041B9 + I-O DATA, INC. - 001FEB - Trio Datacom Pty Ltd + 6847C5 + Intel Corporate - 001F69 - Pingood Technology Ltd + A44280 + Apple, Inc. - 001F4D - Segnetics LLC + 6C8720 + New H3C Technologies Co., Ltd - 001F81 - Accel Semiconductor Corp + 0C8D7A + RADiflow - 001F83 - Teleplan Technology Services Sdn Bhd + FCA9F5 + Xiaomi Communications Co Ltd - 001F9B - Posbro + 14144B + Ruijie Networks Co.,LTD - 001F78 - Blue Fox Porini Textile + 0004A5 + Barco NV - 001F68 - Martinsson Elektronik AB + 44D980 + EVERYBOT INC. - 001F63 - JSC Goodwin-Europa + 0016E6 + GIGA-BYTE TECHNOLOGY CO.,LTD. - 001FAD - Brown Innovations Inc. + D0DC2C + Cisco Systems, Inc - 001FA6 - Stilo srl + F83C44 + SHENZHEN TRANSCHAN TECHNOLOGY LIMITED - 001F97 - BERTANA srl + 2015DE + Samsung Electronics Co.,Ltd - 001F8C - CCS Inc. + 18523D + Xiamen Jiwu Technology CO.,Ltd - 001F10 - Toledo DO Brasil Industria de Balancas Ltda + D843EA + SY Electronics Ltd - 001F0F - Select Engineered Systems + D09168 + SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD - 001F02 - Pixelmetrix Corporation Pte Ltd + D4A38B + ELE(GROUP)CO.,LTD - 001EFE - LEVEL s.r.o. + 5413CA + ITEL MOBILE LIMITED - 001F1A - Prominvest + 10E83A + FIBERX DISTRIBUIDORA DE PRODUTOS DE TELECOMUNICACAO LTDA - 001F18 - Hakusan.Mfg Ltd + E8C829 + Intel Corporate - 001F13 - S.& A.S Ltd + E04C05 + EverCharge - 001F25 - MBS GmbH + 58687A + Sagemcom Broadband SAS - 001F27 - Cisco Systems Inc. + 80482C + Wyze Labs Inc - 001F26 - Cisco Systems Inc. + 885EBD + NCKOREA Co.,Ltd. - 001EEF - Cantronic International Limited + 1C6066 + TEJAS NETWORKS LTD - 001EDE - BYD Company Limited + D0F405 + Hon Hai Precision Industry Co., Ltd. - 001EDD - Wasko S.A. + 8809AF + Masimo Corporation - 001EDB - Giken Trastem Ltd + B04AB4 + Motorola Mobility LLC, a Lenovo Company - 001F42 - Etherstack plc + C414A2 + Cisco Meraki - 001F35 - AIR802 LLC + 64E738 + Zhejiang SUPCON Technology Co., Ltd. - 001F34 - Lung Hwa Electronics Ltd + 5C7DF3 + Fiberhome Telecommunication Technologies Co.,LTD - 001EEB - Talk-A-Phone Co. + EC0482 + STL Systems AG - 001E6A - Beijing Bluexon Technology Ltd + E88DA6 + Quectel Wireless Solutions Co.,Ltd. - 001E66 - RESOL Elektronische Regelungen GmbH + 3C0AF3 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 001E63 - Vibro-Meter SA + CCE9FA + Samsung Electronics Co.,Ltd - 001E7F - CBM Of America + 6466D8 + Samsung Electronics Co.,Ltd - 001E82 - SanDisk Corporation + 489A5B + Shenzhen iComm Semiconductor CO.,LTD - 001EB1 - Cryptsoft Pty Ltd + 9C9613 + Lenovo Future Communication Technology (Chongqing) Company Limited - 001EAF - Ophir Optronics Ltd + DCF51B + Arcadyan Corporation - 001EAD - Wingtech Group Limited + 087B87 + Cisco Systems, Inc - 001ED1 - Keyprocessor B.V. + 000CEC + Safran Trusted 4D Inc. - 001ED0 - Ingespace + 58D312 + zte corporation - 001E8E - Hunkeler AG + D8097F + zte corporation - 001E87 - Realease Limited + 848687 + weiyuantechnology - 001ECD - KYLAND Technology Ltd + 00E63A + Ruckus Wireless - 001EBF - Haas Automation Inc. + 44E761 + Infinix mobility limited - 001EBC - Wintech Automation Ltd + 44B59C + Tenet Networks Private Limited - 001E6F - Magna-Power Electronics Inc. + A436C7 + LG Innotek - 001EA1 - Brunata a/s + 38F6ED + EVK DI Kerschhaggl GmbH - 001E53 - Further Tech Ltd + D82D40 + Janz - Contagem e Gestão de Fluídos S.A. - 001E4E - DAKO EDV-Ingenieur- und Systemhaus GmbH + 003969 + Air-Weigh Incorporated - 001E49 - Cisco Systems Inc. + C07C90 + Shenzhen YOUHUA Technology Co., Ltd - 001E28 - Lumexis Corporation + B8C065 + Universal Electronics, Inc. - 001E24 - Zhejiang Bell Technology Ltd + 2091DF + Apple, Inc. - 001E20 - Intertain Inc. + A89C78 + Apple, Inc. - 001E1C - SWS Australia Pty Limited + 7C6130 + Apple, Inc. - 001E12 - Ecolab + 80B989 + Apple, Inc. - 001E16 - Keytronix + C4524F + Apple, Inc. - 001E32 - Zensys + 603E5F + Apple, Inc. - 001E35 - Nintendo Ltd + D0CEC9 + HAN CHANG - 001E2B - Radio Systems Design Inc. + A4BD7E + HMD Global Oy - 001E42 - Teltonika + 68DA73 + IEEE Registration Authority - 001E43 - Aisin AW Ltd + 8CD08B + WuXi Rigosys Technology Co.,LTD - 001E08 - Centec Networks Inc + 4432C8 + Vantiva USA LLC - 001DFB - NETCLEUS Systems Corporation + 08952A + Vantiva USA LLC - 001DB9 - Wellspring Wireless + FC528D + Vantiva USA LLC - 001DBB - Dynamic System Electronics Corp. + 6C55E8 + Vantiva USA LLC - 001DB3 - HPN Supply Chain + 889E68 + Vantiva USA LLC - 001DB1 - Crescendo Networks + F85E42 + Vantiva USA LLC - 001DB4 - Kumho ENG Ltd + EC937D + Vantiva USA LLC - 001DA4 - Hangzhou System Technology Ltd + 7C9A54 + Vantiva USA LLC - 001D9F - MATT R.P.Traczynscy Sp.J. + E03717 + Vantiva USA LLC - 001D90 - EMCO Flow Systems + 905851 + Vantiva USA LLC - 001D93 - Modacom + 087E64 + Vantiva USA LLC - 001D94 - Climax Technology Ltd + 1033BF + Vantiva USA LLC - 001D8E - Alereon Inc. + 00651E + Amcrest Technologies - 001DDB - C-BEL Corporation + 087073 + HUAWEI TECHNOLOGIES CO.,LTD - 001DE6 - Cisco Systems Inc. + 28BE9B + Vantiva USA LLC - 001DE7 - Marine Sonic Technology Ltd + D05A00 + Vantiva USA LLC - 001D7B - Ice Energy Inc. + 3C9A77 + Vantiva USA LLC - 001D6C - ClariPhy Communications Inc. + D4E2CB + Vantiva USA LLC - 001DC5 - Beijing Jiaxun Feihong Electricial Ltd + 5C22DA + Vantiva USA LLC - 001DC6 - SNR Inc. + FCC233 + ASUSTek COMPUTER INC. - 001D84 - Gateway Inc. + 00EE01 + Enablers Solucoes e Consultoria em Dispositivos - 001D85 - Call Direct Cellular Solutions + 80F0CF + Ruckus Wireless - 001DBF - Radiient Technologies Inc. + 68DECE + Fiberhome Telecommunication Technologies Co.,LTD - 001D34 - SYRIS Technology Corp + 38315A + Rinnai - 001D32 - Longkay Communication & Technology (Shanghai) Ltd + 3C19CB + TECNO MOBILE LIMITED - 001D2A - Shenzhen BUL-Tech Ltd + FCFA21 + zte corporation - 001D2D - Pylone Inc. + D07CB2 + Sigmastar Technology Ltd. - 001D5D - Control Dynamics Pty Ltd + 0438DC + China Unicom Online Information Technology Co.,Ltd - 001D59 - Mitra Energy & Infrastructure + DCBDCC + Quectel Wireless Solutions Co.,Ltd. - 001D2B - Wuhan Pont Technology Co Ltd + A800E3 + Starkey Labs Inc. - 001D22 - Foss Analytical A/S + B096EA + GD Midea Air-Conditioning Equipment Co.,Ltd. - 001D23 - Sensus + 64009C + Insulet Corporation - 001D3E - Saka Techno Science Ltd + 605699 + MAGNETI MARELLI S.E. S.p.A. - 001D40 - Intel - GE Care Innovations LLC + A82C3E + Shenzhen Cultraview Digital Technology Co., Ltd - 001D57 - CAETEC Messtechnik + D0F928 + zte corporation - 001D51 - Babcock & Wilcox Power Generation Group Inc. + 38922E + ArrayComm - 001D4C - Alcatel-Lucent + 2C9975 + Samsung Electronics Co.,Ltd - 001D1A - OvisLink S.A. + B0F00C + Dongguan Wecxw CO.,Ltd. - 001CB7 - USC DigiArk Corporation + A8FB40 + Nokia Solutions and Networks GmbH & Co. KG - 001CAF - Plato Networks Inc. + A8E539 + Nurivoice Co., Ltd - 001CB1 - Cisco Systems Inc. + A8584E + PK VEGA - 001CFE - Quartics Inc + C47EE0 + Cisco Systems, Inc - 001D0B - Power Standards Lab + 1091D1 + Intel Corporate - 001D02 - Cybertech Telecom Development + 6C4CE2 + Intel Corporate - 001CE9 - Galaxy Technology Limited + 00E04D + INTERNET INITIATIVE JAPAN, INC - 001CEA - Scientific-Atlanta Inc. + 743AEF + Kaon Group Co., Ltd. - 001CE7 - Rocon PLC Research Centre + F854F6 + AzureWave Technology Inc. - 001CDB - Carpoint Ltd + 087458 + Fiberhome Telecommunication Technologies Co.,LTD - 001CD5 - ZeeVee Inc. + C482E1 + Tuya Smart Inc. - 001CBC - CastGrabber LLC + 24E4CE + Kaon Group Co., Ltd. - 001CE4 - EleSy JSC + F0C558 + U.D.Electronic Corp. - 001CE2 - Attero Tech LLC. + 60C9AA + Nokia - 001CAA - Bellon Pty Ltd + E068EE + Phyplus Microelectronics Limited - 001CA0 - Production Resource Group LLC + 6879DD + Omnipless Manufacturing (PTY) Ltd - 001CD3 - ZP Engineering SEL + 48062B + Private - 001CCB - Forth Corporation Public Company Limited + E87640 + SKY UK LIMITED - 001C75 - Segnet Ltd + 743357 + vivo Mobile Communication Co., Ltd. - 001C74 - Syswan Technologies Inc. + AC00F9 + BizLink Technology (S.E.A) Sdn. Bhd. - 001C68 - Anhui Sun Create Electronics Ltd + 681A7C + Sichuan Tianyi Comheart Telecom Co.,LTD - 001C66 - Ucamp Ltd + 00181C + VITEC - 001C98 - Lucky Technology (HK) Company Limited + 989F1E + HUAWEI TECHNOLOGIES CO.,LTD - 001C81 - NextGen Venturi Ltd + 944788 + HUAWEI TECHNOLOGIES CO.,LTD - 001C7A - Perfectone Netware Company Ltd + 5412CB + HUAWEI TECHNOLOGIES CO.,LTD - 001C53 - Synergy Lighting Controls + 98FBF5 + ATRALTECH - 001C4D - Aplix IP Holdings Corporation + 90395F + Amazon Technologies Inc. - 001C92 - Tervela + 301D49 + Firmus Technologies Pty Ltd - 001C8A - Cirrascale Corporation + 401482 + Cisco Systems, Inc - 001C38 - Bio-Rad Laboratories Inc. + 800794 + Samsung Electronics Co.,Ltd - 001C30 - Mode Lighting (UK ) Ltd + F43C3B + HUNAN FN-LINK TECHNOLOGY LIMITED - 001C2E - HPN Supply Chain + 74D7CA + Panasonic Automotive Systems Co.,Ltd - 001C2A - Envisacor Technologies Inc. + D4B680 + Shanghai Linkyum Microeletronics Co.,Ltd - 001C02 - Pano Logic + C81337 + Juniper Networks - 001C05 - Nonin Medical Inc. + AC416A + Amazon Technologies Inc. - 001C06 - Siemens Numerical Control Ltd Nanjing + 8CEEFD + zte corporation - 001BEA - Nintendo Ltd + C04943 + zte corporation - 001BE5 - 802automation Limited + 58CDC9 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 001BE4 - Townet SRL + BCF499 + Rockwell Automation - 001C04 - Airgain Inc. + 903C1D + HISENSE VISUAL TECHNOLOGY CO.,LTD - 001C01 - ABB Oy Drives + 246C84 + Cisco Systems, Inc - 001BFF - Millennia Media Inc. + 90EB50 + Cisco Systems, Inc - 001BF2 - Kworld Computer Ltd + 609532 + Zebra Technologies Inc. - 001BF0 - Value Platforms Limited + D4E95E + Texas Instruments - 001C1B - Hyperstone GmbH + 1015C1 + Zhanzuo (Beijing) Technology Co., Ltd. - 001C10 - Cisco-Linksys LLC + 8CF3E7 + solidotech - 001BD2 - ULTRA-X ASIA PACIFIC Inc. + 90A7BF + EM Microelectronic - 001B8D - Electronic Computer Systems Inc. + 80EE25 + Shenzhen Skyworth Digital Technology CO., Ltd - 001B86 - Bosch Access Systems GmbH + 1055E4 + Shenzhen Skyworth Digital Technology CO., Ltd - 001BC2 - Integrated Control Technology Limitied + 28EF01 + Amazon Technologies Inc. - 001BBB - RFTech Ltd + D452C7 + Beijing L&S Lancom Platform Tech. Co., Ltd. - 001BAA - XenICs nv + 8488E1 + Apple, Inc. - 001B7C - A & R Cambridge + 10BD3A + Apple, Inc. - 001B5D - Vololink Pty Ltd + 184A53 + Apple, Inc. - 001B5A - Apollo Imaging Technologies Inc. + 109F41 + Apple, Inc. - 001B56 - Tehuti Networks Ltd + 7072FE + Apple, Inc. - 001BC6 - Strato Rechenzentrum AG + 2CC253 + Apple, Inc. - 001BC4 - Ultratec Inc. + 80C45D + IPG Laser GmbH - 001BA1 - Amic AB + 68F63B + Amazon Technologies Inc. - 001B96 - General Sensing + 6885A4 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 001AEA - Radio Terminal Systems Pty Ltd + 24E8E5 + Shenzhen Skyworth Digital Technology CO., Ltd - 001ADD - PePWave Ltd + 04AB08 + Shenzhen Skyworth Digital Technology CO., Ltd - 001AD6 - Jiagnsu Aetna Electric Ltd + E8D52B + Google, Inc. - 001AD4 - iPOX Technology Ltd + CC3ADF + Neptune Technology Group Inc. - 001B14 - Carex Lighting Equipment Factory + 68EC8A + IKEA of Sweden AB - 001B15 - Voxtel Inc. + 111111 + Private - 001B09 - Matrix Telecom Pvt Ltd + B456FA + IOPSYS Software Solutions - 001B03 - Action Technology (SZ) Ltd + E8F8D0 + Nokia Shanghai Bell Co., Ltd. - 001AFB - Joby Inc. + 408E2C + Microsoft Corporation - 001AFD - Evolis + 04CE09 + Shenzhen Skyworth Digital Technology CO., Ltd - 001B1E - HART Communication Foundation + 40679B + Shenzhen Skyworth Digital Technology CO., Ltd - 001B4C - Signtech + C068CC + Shenzhen Skyworth Digital Technology CO., Ltd - 001AD5 - KMC Chain Industrial Ltd + 28BEF3 + FUJIAN STAR-NET COMMUNICATION CO.,LTD - 001AD0 - Albis Technologies AG + E0CB19 + Nokia - 001AD3 - Vamp Ltd + 848F69 + Dell Inc. - 001AD8 - AlsterAero GmbH + 549F35 + Dell Inc. - 001ADA - Biz-2-Me Inc. + 845A3E + Cisco Systems, Inc - 001A6F - MI.TEL s.r.l. + B0216F + HUAWEI TECHNOLOGIES CO.,LTD - 001A71 - Diostech Ltd + 94DF34 + HUAWEI TECHNOLOGIES CO.,LTD - 001A69 - Wuhan Yangtze Optical Technology Ltd + 7430AF + Fiberhome Telecommunication Technologies Co.,LTD - 001A67 - Infinite QL Sdn Bhd + A44CC8 + Dell Inc. - 001AC3 - Scientific-Atlanta Inc. + E4F004 + Dell Inc. - 001ABF - TRUMPF Laser Marking Systems AG + 20040F + Dell Inc. - 001AB8 - Anseri Corporation + D4BED9 + Dell Inc. - 001ABC - U4EA Technologies Ltd + ECF4BB + Dell Inc. - 001ACB - Autocom Products Ltd + B8CA3A + Dell Inc. - 001ACF - C.T. Elettronica + B82A72 + Dell Inc. - 001AA3 - Delorme + BC305B + Dell Inc. - 001A9B - ADEC & Parter AG + 000D56 + Dell Inc. - 001A9D - Skipper Wireless Inc. + 001D09 + Dell Inc. - 001A85 - NV Michel Van de Wiele + 0023AE + Dell Inc. - 001A8E - 3Way Networks Ltd + 14C35E + FibRSol Global Network Limited - 001A44 - JWTrading Ltd + 880894 + Skullcandy - 001A49 - Micro Vision Ltd + 902AEE + Xiaomi Communications Co Ltd - 001A3D - Ajin Vision Ltd + 40FAFE + Motorola Mobility LLC, a Lenovo Company - 001A41 - INOCOVA Ltd + 201C3A + Nintendo Co.,Ltd - 001A33 - ASI Communications Inc. + 249038 + Universal Biosensors Pty Ltd - 001A23 - Ice Qube Inc. + F8EDAE + MOBIWIRE MOBILES(NINGBO) CO.,LTD - 001A1D - PChome Online Inc. + D8478F + Microchip Technology Inc. - 001A17 - Teak Technologies Inc. + 3C0CDB + UNION MAN TECHNOLOGY CO.,LTD - 001A1C - GT&T Engineering Pte Ltd + F4D9C6 + UNION MAN TECHNOLOGY CO.,LTD - 001A1F - Coastal Environmental Systems + 94988F + Sagemcom Broadband SAS - 001A64 - IBM Corp + F07B65 + Sagemcom Broadband SAS - 001A51 - Alfred Mann Foundation + C025A5 + Dell Inc. - 001A55 - ACA-Digital Corporation + E8B5D0 + Dell Inc. - 0019E6 - Toyo Medic Ltd + 089204 + Dell Inc. - 0019E2 - Juniper Networks + 70B5E8 + Dell Inc. - 0019E8 - Cisco Systems Inc. + B8CB29 + Dell Inc. - 0019DF - Thomson Inc. + 34735A + Dell Inc. - 0019DD - FEI-Zyfer Inc. + 8CEC4B + Dell Inc. - 0019B2 - XYnetsoft Ltd - - - 0019A4 - Austar Technology (hang zhou) Ltd + 544810 + Dell Inc. - 0019AA - Cisco Systems Inc. + A89969 + Dell Inc. - 0019B1 - Arrow7 Corporation + F40270 + Dell Inc. - 0019B3 - Stanford Research Systems + 3448ED + Dell Inc. - 001A0A - Adaptive Micro-Ware Inc. + A8C56F + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 001A05 - Optibase Ltd + AC7A94 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 0019D4 - ICX Technologies + 04DA28 + Chongqing Zhouhai Intelligent Technology Co., Ltd - 0019CF - Salicru, S.A. + 0C014B + zte corporation - 0019FC - PT. Ufoakses Sukses Luarbiasa + 74D6E5 + Huawei Device Co., Ltd. - 0019F4 - Convergens Oy Ltd + 5C2167 + Rockwell Automation - 001996 - TurboChef Technologies Inc. + 20F597 + Maasiv, LLC - 001997 - Soft Device Sdn Bhd + 988CB3 + Sichuan Tianyi Comheart Telecom Co.,LTD - 001998 - Sato Corporation + D8E35E + LG Innotek - 00199C - Ctring + 14A417 + Shenzhen Belon Technology CO.,LTD - 001946 - Cianet Industria e Comercio S/A + 60489C + YIPPEE ELECTRONICS CO.,LIMITED - 001949 - Tentel Comtech Ltd + 34AFA3 + Recogni Inc - 001944 - Fossil Partners, L.P. + DC9EAB + Chongqing Yipingfang Technology Co., Ltd. - 001971 - Guangzhou Unicomp Technology Ltd + 4891D5 + Cisco Systems, Inc - 001964 - Doorking Inc. + 6C8F4E + Chongqing Yipingfang Technology Co., Ltd. - 001976 - Xipher Technologies LLC + E01FFC + Motorola (Wuhan) Mobility Technologies Communication Co., Ltd. - 00196C - Etrovision Technology + CC4740 + AzureWave Technology Inc. - 001967 - TELDAT Sp.J. + 001491 + Daniels Electronics Ltd. dba Codan Radio Communications - 001952 - ACOGITO Ltd + 200BC5 + Cisco Systems, Inc - 00198B - Novera Optics Korea Inc. + 90E95E + Cisco Systems, Inc - 001961 - Blaupunkt Embedded Systems GmbH + 2857BE + Hangzhou Hikvision Digital Technology Co.,Ltd. - 001942 - ON Software International Limited + 5850ED + Hangzhou Hikvision Digital Technology Co.,Ltd. - 00193F - RDI technology(Shenzhen) Ltd + 1012FB + Hangzhou Hikvision Digital Technology Co.,Ltd. - 001941 - Pitney Bowes Inc. + 4CF5DC + Hangzhou Hikvision Digital Technology Co.,Ltd. - 0018FD - Optimal Technologies International Inc. + 988B0A + Hangzhou Hikvision Digital Technology Co.,Ltd. - 0018F0 - JOYTOTO Ltd + 807C62 + Hangzhou Hikvision Digital Technology Co.,Ltd. - 0018E9 - Numata Corporation + BC9B5E + Hangzhou Hikvision Digital Technology Co.,Ltd. - 001908 - Duaxes Corporation + 2029B9 + Ikotek technology SH Co., Ltd - 00190C - Encore Electronics Inc. + 1868CB + Hangzhou Hikvision Digital Technology Co.,Ltd. - 001919 - ASTEL Inc. + BCBAC2 + Hangzhou Hikvision Digital Technology Co.,Ltd. - 00192D - Nokia Corporation + ACCB51 + Hangzhou Hikvision Digital Technology Co.,Ltd. - 0018EF - Escape Communications Inc. + 9C65FA + AcSiP - 0018E6 - Computer Hardware Design SIA + 80BEAF + Hangzhou Hikvision Digital Technology Co.,Ltd. - 001930 - Cisco Systems Inc. + 040312 + Hangzhou Hikvision Digital Technology Co.,Ltd. - 001927 - ImCoSys Ltd + 4881D4 + Ruijie Networks Co.,LTD - 0018F7 - Kameleon Technologies + 34CA81 + New H3C Intelligence Terminal Co., Ltd. - 001888 - GOTIVE a.s. + 280C2D + QUALVISION TECHNOLOGY CO.,LTD - 00188A - Infinova LLC + 8867DC + HUAWEI TECHNOLOGIES CO.,LTD - 001886 - EL-Tech Inc. + C4678B + Alphabet Capital Sdn Bhd - 001887 - Metasystem SpA + 60F04D + Honor Device Co., Ltd. - 0018BE - ANSA Corporation + D43A2F + SHENZHEN MTC CO LTD - 0018BA - Cisco Systems Inc. + 60030C + Shenzhen YOUHUA Technology Co., Ltd - 0018B4 - Dawon Media Inc. + 40410D + HUAWEI TECHNOLOGIES CO.,LTD - 0018B6 - S3C Inc. + 5C8B6B + Amazon Technologies Inc. - 0018A3 - Zippy Technology Corp. + C0613D + BioIntelliSense, Inc. - 0018A0 - Cierma Ascenseurs + 0418D6 + Ubiquiti Inc - 001893 - Shenzhen Photon Broadband Technology Ltd + 24A43C + Ubiquiti Inc - 0018B1 - IBM Corp + 0019E2 + Juniper Networks - 00187B - 4NSYS Ltd + 002688 + Juniper Networks - 00187F - Zodianet + 841888 + Juniper Networks - 00187E - RGB Spectrum + C82B6B + shenzhen worldelite electronics co., LTD - 00189D - Navcast Inc. + 1814AE + Nokia - 0018D6 - Swirlnet A/S + 44D9E7 + Ubiquiti Inc - 0018CD - Erae Electronics Industry Ltd + D021F9 + Ubiquiti Inc - 0018DB - EPL Technology Ltd + 70A741 + Ubiquiti Inc - 0018C8 - ISONAS Inc. + B0A86E + Juniper Networks - 001849 - nVent, Schroff GmbH + 0881F4 + Juniper Networks - 001846 - Crypto S.A. + E4BCAA + Xiaomi Communications Co Ltd - 001845 - Pulsar-Telecom LLC. + 545DD9 + EDISTEC - 00181E - GDX Technologies Ltd + 307C5E + Juniper Networks - 00181C - Exterity Limited + F01C2D + Juniper Networks - 001863 - Veritech Electronics Limited + 64649B + Juniper Networks - 00185A - uControl Inc. + 009069 + Juniper Networks - 001852 - StorLink Semiconductors Inc. + 80ACAC + Juniper Networks - 001850 - Secfone Kft + 0C8610 + Juniper Networks - 001858 - TagMaster AB + 544B8C + Juniper Networks - 001824 - Kimaldi Electronics, S.L. + 2C2131 + Juniper Networks - 00183D - Vertex Link Corporation + 9CCC83 + Juniper Networks - 001825 - Private + 44AA50 + Juniper Networks - 001879 - dSys + E8B6C2 + Juniper Networks - 001803 - ArcSoft Shanghai Ltd + C409B7 + Juniper Networks - 0017EF - IBM Corp + 74E798 + Juniper Networks - 0017F5 - LIG Neoptek + 487310 + Juniper Networks - 0017CD - CEC Wireless R&D Ltd + E4FC82 + Juniper Networks - 0017D0 - Opticom Communications LLC + B8C253 + Juniper Networks - 0017C6 - Cross Match Technologies Inc + 14B3A1 + Juniper Networks - 0017FE - Talos System Inc. + D4996C + Juniper Networks - 0017F8 - Motech Industries Inc. + 045C6C + Juniper Networks - 0017C3 - KTF Technologies Inc. + 40DEAD + Juniper Networks - 0017B7 - Tonze Technology Co. + 0C599C + Juniper Networks - 0017AB - Nintendo Ltd + 9CD1D0 + Guangzhou Ronsuo Electronic Technology Co.,Ltd - 001807 - Fanstel Corp. + 3C792B + Dongguan Auklink TechnologyCo.,Ltd - 001808 - SightLogix Inc. + 000E51 + TECNA SpA - 0017CE - Screen Service Spa + C0C70A + Ruckus Wireless - 0017DB - Canko Technologies Inc. + 001616 + BROWAN COMMUNICATIONS INCORPORATION - 0017D6 - Bluechips Microhouse Ltd + B461E9 + Sichuan AI-Link Technology Co., Ltd. - 001787 - Brother, Brother & Sons ApS + 64E204 + NTN Technical Service Corporation - 001789 - Zenitron Corporation + 2C9811 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 001760 - Naito Densei Machida MFG Ltd + 90D689 + Huahao Fangzhou Technology Co.,Ltd - 001761 - Private + C08B2A + Cisco Systems, Inc - 001768 - Zinwave Ltd + 2CCA75 + Robert Bosch GmbH AnP - 001769 - Cymphonix Corp + CCD81F + Maipu Communication Technology Co.,Ltd. - 001762 - Solar Technology Inc. + E0D8C4 + Qingdao Intelligent&Precise Electronics Co.,Ltd. - 00178F - Ningbo Yidong Electronic Ltd + 38141B + Secure Letter Inc. - 001794 - Cisco Systems Inc. + 88C6E8 + HUAWEI TECHNOLOGIES CO.,LTD - 00178A - Darts Technologies Corp. + 707CE3 + HUAWEI TECHNOLOGIES CO.,LTD - 001734 - ADC Telecommunications + 3C6F9B + zte corporation - 00172E - FXC Inc. + 5C9462 + Shenzhen Jiuzhou Electric Co.,LTD - 00172B - Global Technologies Inc. + 386F6B + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 001772 - ASTRO Strobel Kommunikationssysteme GmbH + 541149 + vivo Mobile Communication Co., Ltd. - 00173E - LeucotronEquipamentos Ltda. + 9052BF + Sichuan Tianyi Comheart Telecom Co.,LTD - 001798 - Azonic Technology Ltd + 881E59 + Onion Corporation - 001747 - Trimble + 2C002A + Shenzhen TINNO Mobile Technology Corp. - 00177A - Assa Abloy AB + FC9CA7 + Apple, Inc. - 0016F4 - Eidicom Ltd + 48E15C + Apple, Inc. - 0016E7 - Dynamix Promotions Limited + 7415F5 + Apple, Inc. - 0016E5 - Fordley Development Limited + 48A98A + Routerboard.com - 0016E6 - Giga-Byte Technology Ltd + E88843 + Xiaomi Communications Co Ltd - 001720 - Image Sensing Systems Inc. + 28022E + Apple, Inc. - 00171A - Winegard Company + 705A6F + IEEE Registration Authority - 0016C8 - Cisco Systems Inc. + DCA313 + Shenzhen Changjin Communication Technology Co.,Ltd - 0016C4 - SiRF Technology Inc. + 182654 + Samsung Electronics Co.,Ltd - 0016F3 - CAST Information Ltd + 1C6760 + Phonesuite - 0016F5 - Dalian Golden Hualu Digital Technology Ltd + 043201 + Broadcom Limited - 0016F1 - OmniSense LLC + 7C1779 + EM Microelectronic - 0016DD - Gigabeam Corporation + B04B68 + NAKAYO Inc - 00171C - NT MicroSystems Inc. + F86B14 + Barrot Technology Co.,LTD - 001716 - Qno Technology Inc. + 704698 + HUAWEI TECHNOLOGIES CO.,LTD - 001726 - m2c Electronic Technology Ltd + 78084D + HUAWEI TECHNOLOGIES CO.,LTD - 001721 - FITRE S.p.A. + ECAA8F + HUAWEI TECHNOLOGIES CO.,LTD - 0016F9 - CETRTA POT, d.o.o., Kranj + 689A21 + Fiberhome Telecommunication Technologies Co.,LTD - 00170A - Inew Digital Company + 38396C + Huawei Device Co., Ltd. - 0016BD - ATI Industrial Automation + 5066E5 + Huawei Device Co., Ltd. - 0016C0 - Semtech Corporation + DC7794 + Huawei Device Co., Ltd. - 0016C2 - Avtec Systems Inc + D8341C + GD Midea Air-Conditioning Equipment Co.,Ltd. - 0016BA - Weathernews Inc. + 00187F + ZODIANET - 0016B2 - DriveCam Inc + CCF826 + Samsung Electronics Co.,Ltd - 0016B3 - Photonicbridges (China) Ltd + 70B651 + Eight Sleep - 0016AD - BT-Links Company Limited + 90CEB8 + Texas Instruments - 00166E - Arbitron Inc. + B4BC7C + Texas Instruments - 0016AF - Shenzhen Union Networks Equipment Ltd + F88A5E + Texas Instruments - 00169E - TV One Ltd + F4331C + Toast, Inc. - 00166A - TPS + 5451DE + Cisco Systems, Inc - 001663 - KBT Mobile + 4C0617 + Taicang T&W Electronics - 00169F - Vimtron Electronics Ltd + D49AF6 + AzureWave Technology Inc. - 00169A - Quadrics Ltd + AC81F3 + Nokia Corporation - 001692 - Scientific-Atlanta Inc. + 606E41 + Barrot Technology Co.,LTD - 001691 - Moser-Baer AG + 2C1809 + Apple, Inc. - 001688 - ServerEngines LLC + FC47D8 + Apple, Inc. - 00168B - Paralan Corporation + E49D73 + Edgecore Networks Corporation - 00160A - SWEEX Europe BV + 44EB2E + ALPSALPINE CO,.LTD - 001602 - Ceyon Technology Ltd + 047F0E + Barrot Technology Co.,LTD - 001600 - CelleBrite Mobile Synchronization + D40145 + ATW TECHNOLOGY, INC. - 0015F4 - Eventide + A8F8C9 + NXP Semiconductor (Tianjin) LTD. - 001629 - Nivus GmbH + 94720F + Guangdong Nanguang Photo&Video Systems Co., Ltd. - 001621 - Colorado Vnet + 646876 + Edifier International - 00161A - Dametric AB + 7C646C + LG Electronics - 001615 - Nittan Company, Limited + 48C1EE + Honor Device Co., Ltd. - 001616 - Browan Communication Inc. + DCB347 + SHENZHEN FAST TECHNOLOGIES CO.,LTD - 001617 - MSI + A486AE + Quectel Wireless Solutions Co.,Ltd. - 00162E - Space Shuttle Hi-Tech Ltd + 58D391 + Quectel Wireless Solutions Co.,Ltd. - 00162A - Antik Computers & Communications s.r.o. + 0024AC + Hangzhou DPtech Technologies Co., Ltd. - 001656 - Nintendo Ltd + CC087B + HUAWEI TECHNOLOGIES CO.,LTD - 001651 - Exeo Systems + 5C64F3 + sywinkey HongKong Co,. Limited? - 001610 - Carina Technology + 28E424 + New H3C Technologies Co., Ltd - 001606 - Ideal Industries + 50804A + Quectel Wireless Solutions Co.,Ltd. - 001607 - Curves International Inc. + 601521 + Redarc Electronics - 001654 - Flex-P Industries Sdn. Bhd. + E426D5 + Motorola Mobility LLC, a Lenovo Company - 001631 - Xteam + E04B41 + Hangzhou Beilian Low Carbon Technology Co., Ltd. - 00164B - Quorion Data Systems GmbH + 8C8E0D + zte corporation - 001594 - Bixolon Ltd + 9C8824 + PetroCloud LLC - 001590 - Hectronic GmbH + 5C2FAF + HomeWizard B.V. - 00158C - Liab ApS + 704777 + Ruckus Wireless - 00158F - NTT Advanced Technology Corporation + 00068F + Telemonitor, Inc. - 0015ED - Fulcrum Microsystems Inc. + 040067 + Stanley Black & Decker - 0015F0 - EGO BV + 7830F5 + TBT Inc. - 0015EE - Omnex Control Systems + 88AF7B + Nanjing Powercore Tech Co.,Ltd - 0015C8 - FlexiPanel Ltd + C47B80 + Protempis, LLC - 0015C0 - Digital Telemedia Ltd + 00090F + Fortinet, Inc. - 0015C2 - 3M Germany + 000CE6 + Fortinet, Inc. - 001588 - Salutica Allied Solutions Sdn Bhd + A024F9 + Chengdu InnovaTest Technology Co., Ltd - 001583 - IVT Corporation + E0B98A + Shenzhen Taike industrial automation company,Ltd - 001585 - Aonvision Technolopy Corp. + A8EE6D + Fine Point-High Export - 0015A5 - DCI Ltd + 54C6FF + New H3C Technologies Co., Ltd - 0015B2 - Advanced Industrial Computer Inc. + F4E975 + New H3C Technologies Co., Ltd - 0015DA - Iritel A.D. + 386407 + Qingdao Intelligent&Precise Electronics Co.,Ltd. - 00154A - Wanshih Electronic Ltd + 1C63A5 + securityplatform - 00154C - Saunders Electronics + C4E5B1 + Suzhou PanKore Integrated Circuit Technology Co. Ltd. - 00154D - Netronome Systems Inc. + ACC4A9 + Fiberhome Telecommunication Technologies Co.,LTD - 001549 - Dixtal Biomedica Ind. Com Ltda + 7C949F + Shenzhen iComm Semiconductor CO.,LTD - 00153D - Elim Product Co. + 3C2CA6 + Beijing Xiaomi Electronics Co.,Ltd - 001544 - CoM.s.a.t. AG + 34F223 + Fujian Newland Communication Science Technology Co.,Ltd. - 001539 - Technodrive srl + 280AEE + Renesas Electronics (Penang) Sdn. Bhd. - 001531 - Kocom + 70AED5 + Apple, Inc. - 001535 - OTE Spa + 4C22F3 + Arcadyan Corporation - 001536 - Powertech Ltd + 200C86 + GX India Pvt Ltd - 00152B - Cisco Systems Inc. + 88B86F + Infinix mobility limited - 00152C - Cisco Systems Inc. + 743E39 + YUSUR Technology Co., Ltd. - 001528 - Beacon Medical Products LLC d.b.a. BeaconMedaes + 4C74A7 + IEEE Registration Authority - 001527 - Balboa Instruments + B8D4BC + zte corporation - 001521 - Horoquartz + 385319 + 34ED LLC DBA Centegix - 001520 - Radiocrafts AS + 846082 + Hyperloop Technologies, Inc dba Virgin Hyperloop - 001566 - A-First Technology Ltd + F04F7C + Amazon Technologies Inc. - 00156B - Perfisans Networks Corp. + F0A225 + Amazon Technologies Inc. - 001547 - AiZen Solutions Inc. + D43A2C + Google, Inc. - 001579 - Lunatone Industrielle Elektronik GmbH + E8AACB + Samsung Electronics Co.,Ltd - 0014D7 - Datastore Technology Corp + C4AAC4 + Zhejiang Dahua Technology Co., Ltd. - 0014DD - Covergence Inc. + BCD0EB + New H3C Technologies Co., Ltd - 0014D4 - K Technology Corporation + 605801 + Shandong ZTop Microelectronics Co., Ltd. - 0014CF - INVISIO Communications + D8630D + Motorola (Wuhan) Mobility Technologies Communication Co., Ltd. - 0014BE - Wink Communication technology Ltd + 9C635B + zte corporation - 001511 - Data Center Systems + 1461A4 + Honor Device Co., Ltd. - 00150E - Openbrain Technologies Ltd + D09686 + IEEE Registration Authority - 00150D - Hoana Medical Inc. + 94D86B + nass magnet Hungária Kft. - 00151C - Leneco + 38A9EA + HK DAPU ELECTRONIC TECHNOLOGY CO., LIMITED - 001519 - StoreAge Networking Technologies + E8EF22 + Siemens Numerical Control Ltd., Nanjing - 001506 - Neo Photonics + 786C84 + Amazon Technologies Inc. - 001504 - Game Plus Ltd + E07526 + China Dragon Technology Limited - 001505 - Actiontec Electronics Inc. + E48E10 + CIG SHANGHAI CO LTD - 0014FE - Artech Electronics + 64DBF7 + Nokia Shanghai Bell Co., Ltd. - 0014DE - Sage Instruments Inc. + 3CA2C3 + vivo Mobile Communication Co., Ltd. - 0014DF - HI-P Tech Corporation + 5C475E + Ring LLC - 0014E6 - AIM Infrarotmodule GmbH + 54102E + HUAWEI TECHNOLOGIES CO.,LTD - 0014F3 - ViXS Systems Inc + 94D54D + HUAWEI TECHNOLOGIES CO.,LTD - 00147E - InnerWireless + 24E50F + Google, Inc. - 00147D - Aeon Digital International + C091B9 + Amazon Technologies Inc. - 001476 - MultiCom Industries Limited + 702804 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 001473 - Bookham Inc + F8075D + Huawei Device Co., Ltd. - 001489 - B15402100 - Jandei, S.L. + 98226E + Amazon Technologies Inc. - 001480 - Hitachi-LG Data Storage Korea Inc. + F8A4FB + Nanjing Decowell Automation Co.,LTD - 0014B6 - Enswer Technology Inc. + 24F0D3 + Samsung Electronics Co.,Ltd - 0014B2 - mCubelogics Corporation + 582071 + Samsung Electronics Co.,Ltd - 0014AE - Wizlogics Ltd + 684992 + Cisco Meraki - 0014A6 - Teranetics Inc. + F89B6E + Nokia Solutions and Networks GmbH & Co. KG - 001469 - Cisco Systems Inc. + 14DC51 + Xiamen Cheerzing IOT Technology Co.,Ltd. - 0014BA - Carvers SA de CV + 04331F + Huawei Device Co., Ltd. - 00148A - Elin Ebg Traction GmbH + D4BABA + IEEE Registration Authority - 001491 - Daniels Electronics Ltd dbo Codan Rado Communications + 9CD8E3 + Wuhan Huazhong Numerical Control Co., Ltd - 00146E - H. Stoll GmbH & Co. KG + E0C264 + Intel Corporate - 0014AA - Ashly Audio Inc. + 24DC0F + Phytium Technology Co.,Ltd. - 001409 - MAGNETI MARELLI S.E. S.p.A. + 7C2F80 + Gigaset Communications GmbH - 00140B - First International Computer Inc. + 60C7BE + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 0013FD - Nokia Danmark A/S + 0404B8 + China Hualu Panasonic AVC Networks Co., LTD. - 001400 - Minerva Korea Ltd + 40C2BA + COMPAL INFORMATION (KUNSHAN) CO., LTD. - 0013FC - SiCortex Inc. + 18D6DD + HUAWEI TECHNOLOGIES CO.,LTD - 0013F6 - Cintech + FC1803 + HUAWEI TECHNOLOGIES CO.,LTD - 00144F - Oracle Corporation + 68962E + HUAWEI TECHNOLOGIES CO.,LTD - 001456 - Edge Products + CC3DD1 + HUAWEI TECHNOLOGIES CO.,LTD - 001450 - Heim Systems GmbH + 54C45B + Arcadyan Corporation - 001452 - Calculex,Inc. + 80BC37 + Ruckus Wireless - 001442 - Atto Corporation + E001A6 + Edgecore Networks Corporation - 001447 - BOAZ Inc. + C0515C + zte corporation - 00143E - AirLink Communications Inc. + BC89A7 + Apple, Inc. - 00145D - WJ Communications Inc. + 30B0EA + Shenzhen Chuangxin Internet Communication Technology Co., Ltd - 00143B - Sensovation AG + 4CFC22 + SHANGHAI HI-TECH CONTROL SYSTEM CO.,LTD. - 00142D - Toradex AG + E4ECE8 + Samsung Electronics Co.,Ltd - 001429 - V Center Technologies Ltd + C8908A + Samsung Electronics Co.,Ltd - 001414 - Jumpnode Systems LLC. + 403306 + Taicang T&W Electronics - 00141E - P.A. Semi Inc. + 000BF8 + Infinera, Inc. - 0013CB - Zenitel Norway AS + 783EA1 + Nokia Shanghai Bell Co., Ltd. - 0013CF - 4Access Communications + 7C50DA + E.J Ward - 0013BE - Virtual Conexions + A41CB4 + DFI Inc - 0013B9 - BM SPA + 7408DE + Fujian Landi Commercial Technology Co., Ltd. - 0013AB - Telemotive AG + 10FC33 + Huawei Device Co., Ltd. - 0013C9 - Beyond Achieve Enterprises Ltd + 70B7E4 + Broadcom Limited - 0013C6 - OpenGear Inc. + 1423F2 + Broadcom Limited - 0013F3 - Giga-byte Communications Inc. + B08101 + Honor Device Co., Ltd. - 0013F4 - Psitek (Pty) Ltd + 485DED + Sichuan Tianyi Comheart Telecom Co.,LTD - 0013AC - Sunmyung Electronics Ltd + 5CFC6E + Sichuan Tianyi Comheart Telecom Co.,LTD - 0013A8 - Tanisys Technology + 7CDCCC + BEIJING STARBLAZE TECHNOLOGY CO.,LTD - 0013DA - Diskware Ltd + 34479A + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 0013D8 - Princeton Instruments + 94AD23 + Apple, Inc. - 001399 - STAC Corporation. + 20A5CB + Apple, Inc. - 0013E9 - VeriWave Inc. + F421CA + Apple, Inc. - 001395 - Congatec AG + 3C0268 + Infinera, Inc. - 001356 - FLIR Radiation Inc + CC5EF8 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 00135A - Project T&E Limited + FC1263 + ASKEY COMPUTER CORP - 001361 - Biospace Ltd + 58305B + Shanghai Junqian Sensing Technology Co.,LTD - 001362 - ShinHeung Precision Ltd + A03131 + Procenne Digital Security - 00134F - Rapidus Wireless Networks Inc. + C071AA + ShenZhen OnMicro Electronics Co.,Ltd. - 001378 - Qsan Technology Inc. + 709C45 + HUAWEI TECHNOLOGIES CO.,LTD - 00137A - Netvox Technology Ltd + FC0736 + Huawei Device Co., Ltd. - 001381 - CHIPS & Systems Inc. + 94A07D + Huawei Device Co., Ltd. - 001379 - Ponder Information Industries Ltd + 5C0758 + Ufispace Co., LTD. - 00132C - MAZ Brandenburg GmbH + 142D79 + Fiberhome Telecommunication Technologies Co.,LTD - 001324 - Schneider Electric Ultra Terminal + 84F44C + International Integrated Systems., Inc. - 001326 - ECM Systems Ltd + 589A3E + Amazon Technologies Inc. - 001327 - Data Acquisitions limited + E838A0 + Vizio, Inc - 001367 - Narayon Ltd + C81EC2 + ITEL MOBILE LIMITED - 00135C - OnSite Systems Inc. + 6883CB + Apple, Inc. - 00135F - Cisco Systems Inc. + 68B9C2 + Earda Technologies co Ltd - 00133B - Speed Dragon Multimedia Limited + 88B863 + HISENSE VISUAL TECHNOLOGY CO.,LTD - 001338 - Fresenius-Vial + 1C46D1 + SKY UK LIMITED - 00132D - iWise Communications + 003F10 + Shenzhen GainStrong Technology Co., Ltd. - 001374 - Atheros Communications Inc. + 8822B2 + Chipsea Technologies (Shenzhen) Corp. - 001369 - Honda Electron Ltd + 4802AF + Telit Communication s.p.a - 001342 - Vision Research Inc. + 2004F3 + Honor Device Co., Ltd. - 001340 - AD.EL s.r.l. + 38E7C0 + Hui Zhou Gaoshengda Technology Co.,LTD - 00130C - HF System Corporation + F0C1CE + GoodWe Technologies CO., Ltd - 00130F - EGEMEN Bilgisayar Muh San ve Tic Ltd STI + 906AEB + Microsoft Corporation - 001313 - GuangZhou Post & Telecom Equipment Ltd + 0052C8 + Made Studio Design Ltd. - 0012CB - CSS Inc. + 582B0A + Texas Instruments - 0012CE - Advanced Cybernetics Group + 089DF4 + Intel Corporate - 0012CA - Mechatronic Brick Aps + DC4628 + Intel Corporate - 0012C7 - SECURAY Technologies LtdCo. + 0C9192 + Intel Corporate - 0012CD - ASEM SpA + 48AD9A + Intel Corporate - 0012E8 - Fraunhofer IMS + D8E844 + zte corporation - 0012DD - Shengqu Information Technology (Shanghai) Ltd + E46A35 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 00131D - Scanvaegt International A/S + 6865B7 + Zhishang Chuanglian Technology Co., Ltd - 001318 - DGSTATION Ltd + E4B555 + Huawei Device Co., Ltd. - 00131A - Cisco Systems Inc. + 2877B1 + Tri plus grupa d.o.o. - 0012F4 - Belco International Ltd + 405EF6 + Samsung Electronics Co.,Ltd - 0012F5 - Imarda New Zealand Limited + 945244 + Samsung Electronics Co.,Ltd - 0012E0 - Codan Limited + 9C2E7A + Samsung Electronics Co.,Ltd - 0012DE - Radio Components Sweden AB + 7C6305 + Amazon Technologies Inc. - 001301 - IronGate S.L. + D87E6F + CASCINATION AG - 0012F6 - MDK Ltd + FCC737 + Shaanxi Gangsion Electronic Technology Co., Ltd - 0012F1 - Ifotec + 94286F + zte corporation - 0012F8 - WNI Resources LLC + 400EF3 + zte corporation - 00127C - Swegon AB + 743AF4 + Intel Corporate - 001278 - International Bar Code + 687A64 + Intel Corporate - 00127A - Sanyu Industry Ltd + BC0358 + Intel Corporate - 001268 - IPS d.o.o. + 5431D4 + TGW Mechanics GmbH - 0012AC - Ontimetek Inc. + E016B1 + Advanced Design Technology co.,ltd. - 0012BC - Echolab LLC + AC606F + Nokia Shanghai Bell Co., Ltd. - 0012BD - Avantec Manufacturing Limited + C43CB0 + SHENZHEN BILIAN ELECTRONIC CO.,LTD - 0012AB - WiLife Inc. + C06911 + Arista Networks - 00129B - E2S Electronic Engineering Solutions, S.L. + 9401AC + Wuhan Qianyang Iotian Technology Co., Ltd - 001298 - Mico Electric(Shenzhen) Limited + 2C93FB + Sercomm France Sarl - 001272 - Redux Communications Ltd + B4466B + REALTIMEID AS - 00126A - OPTOELECTRONICS Ltd + 58C57E + Fiberhome Telecommunication Technologies Co.,LTD - 0012C0 - HotLava Systems Inc. + 2418C0 + E. Wehrle GmbH - 0012B7 - PTW Freiburg + 0021D0 + Global Display Solutions Spa - 0012A1 - BluePacket Communications Ltd + 4C312D + Sichuan AI-Link Technology Co., Ltd. - 001206 - iQuest (NZ) Ltd + C04E30 + Espressif Inc. - 001207 - Head Strong International Limited + B8B409 + Samsung Electronics Co.,Ltd - 001209 - Fastrax Ltd + 34CF6C + Hangzhou Taili wireless communication equipment Co.,Ltd - 00120B - Chinasys Technologies Limited + 489BE0 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 001205 - Terrasat Communications Inc. + ACDF9F + Arcadyan Corporation - 001238 - SetaBox Technology Ltd + B859C8 + 70mai Co.,Ltd. - 00123C - Second Rule LLC + C82496 + Jiangsu Yinhe Electronics Co.,Ltd. - 00123E - ERUNE technology Ltd + E0F678 + Fiberhome Telecommunication Technologies Co.,LTD - 001254 - Spectra Technologies Holdings Company Ltd + 28F7D6 + Fiberhome Telecommunication Technologies Co.,LTD - 00124F - nVent + A8E207 + GOIP Global Services Pvt. Ltd. - 001221 - B.Braun Melsungen AG + D4E22F + Roku, Inc - 001212 - PLUS Corporation + 5CFA25 + Sagemcom Broadband SAS - 001213 - Metrohm AG + F8CDC8 + Sichuan Tianyi Comheart Telecom Co.,LTD - 001218 - ARUZE Corporation + 402230 + Shenzhen SuperElectron Technology Co.,Ltd. - 001249 - Delta Elettronica S.p.A. + 145BB9 + ConMet - 00124D - Inducon BV + 0830CE + Fiberhome Telecommunication Technologies Co.,LTD - 001266 - Swisscom Hospitality Services SA + 14130B + Garmin International - 00125E - Caen + 90235B + Amazon Technologies Inc. - 00125D - CyberNet Inc. + 1CBCEC + silex technology, Inc. - 001223 - Pixim + 64D814 + Cisco Systems, Inc - 00123A - Posystech Inc., Co. + 7C11CD + QianTang Technology - 001234 - Camille Bauer + 447F77 + Connected Home - 0011E3 - Thomson Inc. + B0285B + JUHUA Technology Inc. - 0011DC - Glunz & Jensen + E06A05 + Shenzhen YOUHUA Technology Co., Ltd - 001196 - Actuality Systems Inc. + 90CD1F + Quectel Wireless Solutions Co.,Ltd. - 001187 - Category Solutions Inc. + 749779 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 001190 - Digital Design Corporation + 403B7B + Huawei Device Co., Ltd. - 0011C4 - Terminales de Telecomunicacion Terrestre, S.L. + F0B661 + eero inc. - 0011CB - Jacobsons AB + 0425F0 + Nokia - 0011F7 - Shenzhen Forward Industry Ltd + 4857D2 + Broadcom Limited - 0011D3 - NextGenTel Holding ASA + 9C2183 + Broadcom Limited - 0011AB - Trustable Technology Ltd + D834EE + SHURE INCORPORATED - 0011A5 - Fortuna Electronic Corp. + 94C5A6 + ITEL MOBILE LIMITED - 00113C - Micronas GmbH + 5CE91E + Apple, Inc. - 001131 - Unatech Ltd + 88034C + WEIFANG GOERTEK ELECTRONICS CO.,LTD - 001127 - TASI Inc. + 047C16 + Micro-Star INTL CO., LTD. - 00112A - Niko NV + 001794 + Cisco Systems, Inc - 00112B - NetModule AG + F4CE46 + Hewlett Packard - 00116F - Netforyou Ltd + E0D738 + WireStar Networks - 001171 - DEXTER Communications Inc. + C8EBEC + Shenzhen YOUHUA Technology Co., Ltd - 001167 - Integrated System Solution Corp. + 404244 + Cisco Systems, Inc - 00116D - American Time and Signal + 04B6BE + CIG SHANGHAI CO LTD - 001160 - ARTDIO Company Ltd + 7CECB1 + Apple, Inc. - 001154 - Webpro Technologies Inc. + C0EDE5 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 001145 - ValuePoint Networks + 10A562 + Iton Technology Corp. - 001151 - Mykotronx + FCB97E + GE Appliances - 00114E - 690885 Ontario Inc. + 30E8E4 + Qorvo International Pte. Ltd. - 00112D - iPulse Systems + 281293 + Honor Device Co., Ltd. - 00117B - Buchi Labortechnik AG + C0A938 + HUAWEI TECHNOLOGIES CO.,LTD - 000FEE - XTec Inc.orporated + 48DC9D + Grandprint(Beijing) Technology Co., LTD. - 000FE4 - Pantech Ltd + 64989E + TRINNOV AUDIO - 000FE7 - Lutron Electronics Co. Inc. + BCC746 + Hon Hai Precision IND.CO.,LTD - 000FE6 - MBTech Systems Inc. + F0D415 + Intel Corporate - 000FDA - Yazaki Corporation + D4D853 + Intel Corporate - 000FEF - Thales e-Transactions GmbH + 643172 + ZHEJIANG HISING TECHNOLOGY CO.,LTD - 000FE9 - GW Technologies Ltd + D0FCD0 + HUMAX Co., Ltd. - 000FE1 - ID Digital Corporation + 20FADB + Huahao Kunpeng Technology (chengDu) Co.,Ltd. - 000FDF - SOLOMON Technology Corp. + 0C8B95 + Espressif Inc. - 000FFE - G-PRO Computer + 9CBFCD + HUAWEI TECHNOLOGIES CO.,LTD - 00110B - Franklin Technology Systems + B89FCC + HUAWEI TECHNOLOGIES CO.,LTD - 001105 - Sunplus Technology Ltd + 3425BE + Amazon Technologies Inc. - 001102 - Aurora Multimedia Corp. + 9CE041 + Nokia - 001123 - Appointech Inc. + 783486 + Nokia - 00110F - netplat,Inc. + 685E1C + Texas Instruments - 000FD6 - Sarotech Ltd + 38AB41 + Texas Instruments - 001115 - EPIN Technologies Inc. + CC4792 + ASIX Electronics Corporation - 000FC7 - Dionica R&D Ltd + 5876AC + SERNET (SUZHOU) TECHNOLOGIES CORPORATION - 000F64 - D&R Electronica Weesp BV + 9C4F5F + Google, Inc. - 000F75 - First Silicon Solutions + A02942 + Intel Corporate - 000F7C - ACTi Corporation + 1071B3 + Zyxel Communications Corporation - 000F7A - BeiJing NuQX Technology Ltd + DCBE49 + ITEL MOBILE LIMITED - 000FAD - FMN Communications GmbH + 9C9561 + Hui Zhou Gaoshengda Technology Co.,LTD - 000FAB - Kyushu Electronics Systems Inc. + E0036B + Samsung Electronics Co.,Ltd - 000FAC - IEEE 802.11 + 1869D4 + Samsung Electronics Co.,Ltd - 000F72 - Sandburst + 0463D0 + Huawei Device Co., Ltd. - 000FB3 - Actiontec Electronics Inc. + 14448F + Edgecore Networks Corporation - 000F9C - Panduit Corp + 50C1F0 + NXP Semiconductor (Tianjin) LTD. - 000FC8 - Chantry Networks + 581122 + ASUSTek COMPUTER INC. - 000FBB - Nokia Siemens Networks GmbH & Co. KG. + 74694A + Sichuan Tianyi Comheart Telecom Co.,LTD - 000FBC - Onkey Technologies Inc. + 00B0EE + Ajile Systems, Inc. - 000FB6 - Europlex Technologies + 50DCD0 + Observint Technologies, Inc. - 000FB9 - Adaptive Instruments + 78152D + UNION CHIP TECHNOLOGY LIMITED - 000F98 - Avamax Ltd + 00A554 + Intel Corporate - 000F97 - Avanex Corporation + D4F0EA + Beijing Xiaomi Mobile Software Co., Ltd - 000F96 - Telco Systems Inc. + 0C8629 + IEEE Registration Authority - 000F8B - Orion MultiSystems Inc + 98A92D + New H3C Technologies Co., Ltd - 000F8C - Gigawavetech Pte Ltd + 94ABFE + Nokia - 000F38 - Netstar + 5C24E2 + Suzhou Denbom Electronic S&T Co., Ltd - 000F3A - Hisharp + 90DF7D + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 000F30 - Raza Microelectronics Inc + BC1D89 + Motorola Mobility LLC, a Lenovo Company - 000F53 - Solarflare Communications Inc. + E47305 + Shenzhen INVT Electric CO.,Ltd - 000F51 - Azul Systems Inc. + A854A2 + Heimgard Technologies AS - 000F07 - Mangrove Systems Inc. + B87EE5 + Intelbras - 000F00 - Legra Systems Inc. + 60BEB4 + S-Bluetech co., limited - 000F01 - Digitalks Inc + B4B742 + Amazon Technologies Inc. - 000F03 - CoM&C Ltd + 78A03F + Amazon Technologies Inc. - 000F34 - Cisco Systems Inc. + 5046AE + MERCURY CORPORATION - 000F2E - Megapower International Corp. + B099D7 + Samsung Electronics Co.,Ltd - 000F26 - WorldAccxx LLC + 30F70D + Cisco Systems, Inc - 000F45 - Stretch Inc. + 742A8A + shenzhen worldelite electronics co., LTD - 000F3B - Fuji System Machines Ltd + A069D9 + New H3C Technologies Co., Ltd - 000F37 - Xambala Incorporated + 20FE00 + Amazon Technologies Inc. - 000F54 - Entrelogic Corporation + F421AE + Shanghai Xiaodu Technology Limited - 000F25 - AimValley B.V. + 747446 + Google, Inc. - 000F19 - Boston Scientific + 7820A5 + Nintendo Co.,Ltd - 000F10 - RDM Corporation + 2078CD + Apple, Inc. - 000EA8 - United Technologists Europe Limited + 30D53E + Apple, Inc. - 000EAA - Scalent Systems Inc. + F412FA + Espressif Inc. - 000EAC - Mintron Enterprise Ltd + F0B2B9 + Intel Corporate - 000EAE - Gawell Technologies Corp. + D0880C + Apple, Inc. - 000EBA - Hanmi Semiconductor Ltd + 1C57DC + Apple, Inc. - 000EBC - Paragon Fidelity GmbH + 604F5B + Huawei Device Co., Ltd. - 000EC5 - Digital Multitools Inc + DC99FE + Armatura LLC - 000EC7 - Motorola Korea + 9CF155 + Nokia - 000E8B - Astarte Technology Ltd + 5023A2 + Apple, Inc. - 000EDF - PLX Technology + 98698A + Apple, Inc. - 000EE1 - ExtremeSpeed Inc. + 78FBD8 + Apple, Inc. - 000ED7 - Cisco Systems Inc. + A4C337 + Apple, Inc. - 000ED3 - Epicenter Inc. + B0F1D8 + Apple, Inc. - 000E9D - Tiscali UK Ltd + B01B4B + Invisible Fun Studio Limited - 000E47 - NCI System Ltd + 487412 + OnePlus Technology (Shenzhen) Co., Ltd - 000E46 - Niigata Seimitsu Ltd + A8E621 + Amazon Technologies Inc. - 000E1F - TCL Networks Equipment Ltd + 3CCFB4 + Telink Semiconductor (Shanghai) Co., Ltd. - 000E26 - Gincom Technology Corp. + 043CE8 + Shenzhen SuperElectron Technology Co.,Ltd. - 000E6C - Device Drivers Limited + 24813B + Cisco Systems, Inc - 000E6B - Janitza electronics GmbH + 0CB8E8 + Renesas Electronics (Penang) Sdn. Bhd. - 000E5F - activ-net GmbH & Co. KG + F0A654 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 000E57 - Iworld Networking Inc. + E8F375 + Nokia - 000E51 - tecna elettronica srl + 381EC7 + Chipsea Technologies(Shenzhen) Corp. - 000E67 - Eltis Microelectronics Ltd + C0886D + Securosys SA - 000E65 - TransCore + 14DCE2 + THALES AVS France - 000E43 - G-Tek Electronics Sdn. Bhd. + EC5C84 + Murata Manufacturing Co., Ltd. - 000E44 - Digital 5 Inc. + C89BD7 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 000E74 - Solar Telecom. Tech + 28B133 + SHINEMAN(SHENZHEN) Tech. Cor., Ltd. - 000E7A - GemWon Communications Ltd + 74E6B8 + LG Electronics - 000E80 - Thomson Technology Inc + 28D0F5 + Ruijie Networks Co.,LTD - 000E85 - Catalyst Enterprises Inc. + A8587C + Shoogee GmbH & Co. KG - 000E32 - Kontron Medical + 985F4F + Tongfang Computer Co.,Ltd. - 000E0B - Netac Technology Ltd + 34F86E + Parker Hannifin Corporation - 000E11 - BDT Buro und Datentechnik GmbH & Co.KG + 0CAEBD + Edifier International - 000DF5 - TElectronics International Inc. + 90F260 + Shenzhen Honesty Electronics Co.,Ltd. - 000DF7 - Space Dynamics Lab + 1889CF + TECNO MOBILE LIMITED - 000DEB - CompXs Limited + 84160C + Broadcom Limited - 000DEE - Andrew RF Power Amplifier Group + 6CD869 + Guangzhou Sat Infrared Co.,LTD - 000DEF - Soc. Coop. Bilanciai + 38F7F1 + Huawei Device Co., Ltd. - 000DE7 - Snap-on OEM Group + 4076A9 + Huawei Device Co., Ltd. - 000DC6 - DigiRose Technology Ltd + F438C1 + Huawei Device Co., Ltd. - 000DC1 - SafeWeb Inc + 28EA2D + Apple, Inc. - 000DF0 - Qcom Technology Inc. + D004B0 + Samsung Electronics Co.,Ltd - 000DE5 - Samsung Thales + 98B08B + Samsung Electronics Co.,Ltd - 000DC0 - Spagat AS + 9C2595 + Samsung Electronics Co.,Ltd - 000DDD - Profilo Telra Elektronik Sanayi ve Ticaret. A.S + E8EECC + Fantasia Trading LLC - 000DF8 - ORGA Kartensysteme GmbH + 04BD97 + Cisco Systems, Inc - 000E16 - SouthWing S.L. + 541651 + Ruijie Networks Co.,LTD - 000DA7 - Private + A06720 + China Dragon Technology Limited - 000DAD - Dataprobe Inc. + 94C9B7 + IEEE Registration Authority - 000DAB - Parker Hannifin GmbH Electromechanical Division Europe + 60BC4C + EWM Hightec Welding GmbH - 000DA8 - TElectronics Technology Corporation + 0C2369 + Honeywell SPS - 000D79 - Dynamic Solutions Ltd + AC0425 + ball-b GmbH Co KG - 000D6D - K-Tech Devices Corp. + A08069 + Intel Corporate - 000DAF - Plexus Corp (UK) Ltd + 2072A9 + Beijing Xiaomi Electronics Co.,Ltd - 000DB1 - Japan Network Service Ltd + D0622C + Xi'an Yipu Telecom Technology Co.,Ltd. - 000D83 - Sanmina-SCI Hungary Ltd + E05689 + Lootom Telcovideo Network (Wuxi) Co Ltd - 000D7F - MIDAS CoMMUNICATION TECHNOLOGIES PTE Ltd ( Foreign Branch) + A81710 + Bouffalo Lab (Nanjing) Co., Ltd. - 000D75 - Kobian Pte Ltd - Taiwan Branch + 086AE5 + Amazon Technologies Inc. - 000D78 - Engineering & Security + 209BE6 + Guangzhou Shiyuan Electronic Technology Company Limited - 000D9E - TOKUDEN OHIZUMI SEISAKUSYO Ltd + 7087A7 + Murata Manufacturing Co., Ltd. - 000DA3 - Emerging Technologies Limited + 4CE0DB + Xiaomi Communications Co Ltd - 000DA4 - Dosch & Amand Systems AG + 7C33F9 + HUAWEI TECHNOLOGIES CO.,LTD - 000D9A - Infotec Ltd + B8E60C + Apple, Inc. - 000D6E - K-Patents Oy + 48352B + Apple, Inc. - 000D6A - Redwood Technologies Ltd + 4CE6C0 + Apple, Inc. - 000DBA - Oce Document Technologies GmbH + 3888A4 + Apple, Inc. - 000DBD - Cisco Systems Inc. + 44DA30 + Apple, Inc. - 000DB5 - Globalsat Technology Corporation + A02BB8 + Hewlett Packard - 000D97 - ABB Inc./Tropos + 8CB094 + Airtech I&C Co., Ltd - 000D96 - Vtera Technology Inc. + 70A8D3 + Intel Corporate - 000D8B - T&D Corporation + D8FBD6 + Amazon Technologies Inc. - 000D90 - Factum Electronics AB + 9C47F9 + LJU Automatisierungstechnik GmbH - 000D85 - Tapwave Inc. + 206296 + Shenzhen Malio Technology Co.,Ltd - 000D82 - Phsnet + 2C3358 + Intel Corporate - 000D23 - Smart Solution Inc. + 00064D + Sencore - 000D27 - MICROPLEX Printware AG + 1C869A + Samsung Electronics Co.,Ltd - 000D1B - Kyoto Electronics Manufacturing Ltd + EC6488 + Honor Device Co., Ltd. - 000D1D - High-TEK Harness ENT Ltd + 98BEDC + Honor Device Co., Ltd. - 000D02 - NEC Platforms Ltd + E42761 + Honor Device Co., Ltd. - 000D07 - Calrec Audio Ltd + A06974 + Honor Device Co., Ltd. - 000D40 - Verint Loronix Video Solutions + 0CC6FD + Xiaomi Communications Co Ltd - 000D21 - WISCORE Inc. + 50DAD6 + Xiaomi Communications Co Ltd - 000D09 - Yuehua(Zhuhai) Electronic Ltd + 3408E1 + Texas Instruments - 000D37 - Wiplug + 18B96E + Dongguan Liesheng Electronic Co., Ltd. - 000D33 - Prediwave Corp. + 64BE63 + STORDIS GmbH - 000D2F - AIN Comm.Tech Ltd + D46624 + Cisco Systems, Inc - 000D5D - Raritan Computer Inc. + 5058B0 + Hunan Greatwall Computer System Co., Ltd. - 000D63 - DENT Instruments Inc. + 14CB65 + Microsoft Corporation - 000D66 - Cisco Systems Inc. + 7813E0 + FUJIAN STAR-NET COMMUNICATION CO.,LTD - 000CCD - IEC - TC57 + 4861EE + Samsung Electronics Co.,Ltd - 000CCB - Design Combus Ltd + A84B4D + Samsung Electronics Co.,Ltd - 000CC9 - Ilwoo Data & Technology Ltd + F4F309 + Samsung Electronics Co.,Ltd - 000CE9 - Bloomberg L.P. + D07880 + Fiberhome Telecommunication Technologies Co.,LTD - 000CEA - aphona Kommunikationssysteme + E06CF6 + ESSENCORE limited - 000CDA - FreeHand Systems Inc. + 78C62B + FUJIAN STAR-NET COMMUNICATION CO.,LTD - 000CF5 - InfoExpress + 3C869A + HUAWEI TECHNOLOGIES CO.,LTD - 000CEE - jp-embedded + 2C2768 + HUAWEI TECHNOLOGIES CO.,LTD - 000CAF - TRI Term Ltd + 546990 + HUAWEI TECHNOLOGIES CO.,LTD - 000CB3 - ROUND Ltd + D80A60 + HUAWEI TECHNOLOGIES CO.,LTD - 000CDD - AOS technologies AG + 9C9019 + Beyless - 000CA5 - Naman NZ Ltd + 0434F6 + Motorola (Wuhan) Mobility Technologies Communication Co., Ltd. - 000CA9 - Ebtron Inc. + 546925 + PS INODIC CO., LTD. - 000CFB - Korea Network Systems + F89522 + HUAWEI TECHNOLOGIES CO.,LTD - 000C7A - DaTARIUS Technologies GmbH + F8B132 + HUAWEI TECHNOLOGIES CO.,LTD - 000C79 - Extel Communications P/L + E84727 + Quectel Wireless Solutions Co.,Ltd. - 000C75 - Oriental integrated electronics Ltd + 28C538 + Apple, Inc. - 000C5D - Chic Technology (China) Corp. + 7857B0 + GERTEC BRASIL LTDA - 000C4F - UDTech Japan Corporation + 14019C + Ubyon Inc. - 000C62 - ABB AB, Cewe-Control + E8CBED + Chipsea Technologies(Shenzhen) Corp. - 000C4C - Arcor AG&Co. + C4F122 + Nexar Ltd. - 000C47 - SK Teletech(R&D Planning Team) + 6007C4 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 000C6D - Edwards Ltd + BCDB09 + Cisco Meraki - 000C70 - ACC GmbH + 0499B9 + Apple, Inc. - 000C6A - Mbari + 78028B + Apple, Inc. - 000C6B - Kurz Industrie-Elektronik GmbH + F84D89 + Apple, Inc. - 000C9D - UbeeAirWalk Inc. + 086F48 + Shenzhen iComm Semiconductor CO.,LTD - 000C9F - NKE Corporation + 0816D5 + GOERTEK INC. - 000C84 - Eazix Inc. + 1C568E + Zioncom Electronics (Shenzhen) Ltd. - 000C85 - Cisco Systems Inc. + 28563A + Fiberhome Telecommunication Technologies Co.,LTD - 000C3F - Cogent Defence & Security Networks, + 540F57 + Silicon Laboratories - 000C30 - Cisco Systems Inc. + 4448FF + Qingdao Haier Technology Co.,Ltd - 000C9A - Hitech Electronics Corp. + D4D7CF + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 000C91 - Riverhead Networks Inc. + F4E4D7 + FUJIAN STAR-NET COMMUNICATION CO.,LTD - 000BDA - EyeCross Co.,Inc. + F84E17 + Sony Corporation - 000BD6 - Paxton Access Ltd + 04C461 + Murata Manufacturing Co., Ltd. - 000BD4 - Beijing Wise Technology & Science Development Ltd + A08222 + Qingdao Haier Technology Co.,Ltd - 000C1F - Glimmerglass Networks + E01F2B + Nokia Solutions and Networks GmbH & Co. KG - 000C20 - Fi WIn Inc. + AC8226 + Qingdao Haier Technology Co.,Ltd - 000C15 - CyberPower Systems Inc. + C8CB9E + Intel Corporate - 000BF8 - Infinera + 3C5576 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 000BFF - Berkeley Camera Engineering + 90EB48 + Shanghai XinMiaoLink Technology Co., Ltd - 000C16 - Concorde Microsystems Inc. + A8C266 + HUMAX Co., Ltd. - 000C09 - Hitachi IE Systems Ltd + 185345 + Nokia - 000BE7 - Comflux Technology Inc. + E48210 + HUAWEI TECHNOLOGIES CO.,LTD - 000BEC - Nippon Electric Instrument Inc. + F8F7B9 + HUAWEI TECHNOLOGIES CO.,LTD - 000C02 - ABB Oy + 9C2BA6 + Ruijie Networks Co.,LTD - 000B71 - Litchfield Communications Inc. + BC5729 + Shenzhen KKM Co., Ltd - 000B74 - Kingwave Technology Ltd + 64B94E + Dell Technologies - 000B73 - Kodeos Communications + 5447E8 + Syrotech Networks. Ltd. - 000B76 - ET&T Technology Ltd + EC2BEB + Amazon Technologies Inc. - 000B5E - Audio Engineering Society Inc. + B898AD + Motorola Mobility LLC, a Lenovo Company - 000B60 - Cisco Systems Inc. + 7052D8 + ITEL MOBILE LIMITED - 000B65 - Sy.A.C. srl + 249745 + HUAWEI TECHNOLOGIES CO.,LTD - 000B5F - Cisco Systems Inc. + D86C5A + HUMAX Co., Ltd. - 000B61 - Friedrich Lutze GmbH & Co. KG + 4C3FA7 + uGrid Network Inc. - 000B59 - ScriptPro LLC + 001D5B + Tecvan Informatica Ltda - 000B5C - Newtech Ltd + 1CAE3E + IEEE Registration Authority - 000B7E - SAGINOMIYA Seisakusho Inc. + D0C35A + Jabil Circuit de Chihuahua - 000B80 - Lycium Networks + 84B630 + Sichuan Tianyi Comheart Telecom Co.,LTD - 000BA7 - Maranti Networks + 58C7AC + New H3C Technologies Co., Ltd - 000BAA - Aiphone Ltd + 0CCAFB + TPVision Europe B.V - 000BA4 - Shiron Satellite Communications Ltd (1996) + 182DF7 + JY COMPANY - 000BD0 - XiMeta Technology Americas Inc. + EC2C11 + CWD INNOVATION LIMITED - 000BC5 - SMC Networks Inc. + F03575 + Hui Zhou Gaoshengda Technology Co.,LTD - 000BC6 - ISAC Inc. + F8B54D + Intel Corporate - 000BC1 - Bay Microsystems Inc. + 38A8CD + IEEE Registration Authority - 000B8B - Kerajet, S.A. + 546706 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 000B89 - Top Global Technology Ltd + C0F535 + AMPAK Technology,Inc. - 000B99 - SensAble Technologies Inc. + 908175 + Samsung Electronics Co.,Ltd - 000B9C - TriBeam Technologies Inc. + 307467 + Samsung Electronics Co.,Ltd - 000B7C - Telex Communications + F0CD31 + Samsung Electronics Co.,Ltd - 000B83 - Datawatt B.V. + 6401FB + Landis+Gyr GmbH - 000B20 - Hirata Corporation + 545284 + Huawei Device Co., Ltd. - 000B22 - Environmental Systems and Services + 646140 + Huawei Device Co., Ltd. - 000B1B - Systronix Inc. + C4170E + Huawei Device Co., Ltd. - 000B03 - Taekwang Industrial Ltd + 7C8334 + IEEE Registration Authority - 000B01 - Daiichi Electronics Ltd + 207BD2 + ASIX Electronics Corporation - 000B3E - BittWare Inc. + C4E532 + Arcadyan Corporation - 000B29 - LS(LG) Industrial Systems Ltd + 0CAAEE + Ansjer Electronics Co., Ltd. - 000B39 - Keisoku Giken Ltd + 906A94 + hangzhou huacheng network technology co., ltd - 000B33 - Vivato Technologies + 100C29 + Shenzhen NORCO lntelligent Technology Co.,Ltd - 000B05 - Pacific Broadband Networks + 8C3DB1 + Beijing H-IoT Technology Co., Ltd. - 000B00 - Fujian Start Computer Equipment Ltd + D8A6F0 + Wu Qi Technologies,Inc. - 000B5B - Rincon Research Corporation + 08E4DF + Shenzhen Sande Dacom Electronics Co., Ltd - 000AF6 - Emerson Climate Technologies Retail Solutions Inc. + 105A17 + Tuya Smart Inc. - 000B11 - Himeji ABC Trading Ltd + 008A76 + Apple, Inc. - 000B41 - Ing. Buro Dr. Beutlhauser + FCA64C + Alibaba cloud computing Co., Ltd - 000AEA - Adam Elektronik Ltd STI + E069BA + Cisco Systems, Inc - 000AE3 - Yang MEI Technology Ltd + 2436DA + Cisco Systems, Inc - 000ADC - RuggedCom Inc. + 2037A5 + Apple, Inc. - 000AB7 - Cisco Systems Inc. + DCB54F + Apple, Inc. - 000AAD - Stargames Corporation + B8374A + Apple, Inc. - 000AB1 - GENETEC Corporation + EC7C2C + HUAWEI TECHNOLOGIES CO.,LTD - 000AB9 - Astera Technologies Corp. + 5C8382 + Nokia - 000A90 - Bayside Interactive Inc. + 283613 + IEEE Registration Authority - 000A9D - King Young Technology Ltd + 145808 + Taicang T&W Electronics - 000AA1 - V V S Limited + F4239C + SERNET (SUZHOU) TECHNOLOGIES CORPORATION - 000AA4 - Shanghai Surveillance Technology Ltd + A8D081 + Huawei Device Co., Ltd. - 000A9E - BroadWeb Corportation + 740CEE + Huawei Device Co., Ltd. - 000AE0 - Fujitsu Softek + 6CB4FD + Huawei Device Co., Ltd. - 000A8B - Cisco Systems Inc. + 7432C2 + KYOLIS - 000A88 - Incypher S.A. + 00CE30 + Express LUCK Industrial Ltd. - 000ABB - Taiwan Secom Ltd + 640E9B + ISHIDA MEDICAL CO., LTD. - 000A7C - Tecton Ltd + 24F603 + HUAWEI TECHNOLOGIES CO.,LTD - 000A6E - Harmonic Inc. + 08FA28 + HUAWEI TECHNOLOGIES CO.,LTD - 000A6D - EKS Elektronikservice GmbH + F8CA85 + NEC Corporation - 000A43 - Chunghwa Telecom Ltd + 1C2CE0 + Shanghai Mountain View Silicon - 000A45 - Audio-Technica Corp. + 2442BC + Alinco,incorporated - 000A35 - Xilinx + 18FC26 + Qorvo International Pte. Ltd. - 000A3B - GCT Semiconductor Inc. + ECC1AB + Guangzhou Shiyuan Electronic Technology Company Limited - 000A74 - Manticom Networks Inc. + 0000C8 + ALTOS COMPUTER SYSTEMS - 000A6F - ZyFLEX Technologies Inc + A0941A + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 000A63 - DHD GmbH + 300EB8 + LG Electronics - 000A2E - Maple Networks Ltd + BC3329 + Sony Interactive Entertainment Inc. - 000A2D - Cabot Communications Limited + A88940 + Huawei Device Co., Ltd. - 000A25 - Ceragon Networks + 0C0E76 + D-Link International - 000A21 - Integra Telecom Ltd + 703E97 + Iton Technology Corp. - 000A1E - Red-M Products Limited + 6C11B3 + Wu Qi Technologies,Inc. - 000A4B - DataPower Technology Inc. + 104738 + Nokia Shanghai Bell Co., Ltd. - 000A33 - Emulex Corporation + CC312A + HUIZHOU TCL COMMUNICATION ELECTRON CO.,LTD - 000A67 - OngCorp + 30B037 + New H3C Technologies Co., Ltd - 0009F9 - ART Japan Ltd + FC122C + HUAWEI TECHNOLOGIES CO.,LTD - 0009FC - IPFLEX Inc. + 6CD1E5 + HUAWEI TECHNOLOGIES CO.,LTD - 0009FD - Ubinetics Limited + 3039A9 + Hongshan Information Science and Technology (HangZhou) Co.,Ltd. - 0009F7 - SED, a Division Of Calian + FCD908 + Xiaomi Communications Co Ltd - 0009E2 - Sinbon Electronics Ltd + 84144D + Intel Corporate - 0009DA - Control Module Inc. + 9C6BF0 + Shenzhen Yipingfang Network Technology Co., Ltd. - 0009D7 - DC Security Products + 44953B + RLTech India Private Limited - 0009D8 - Falt Communications AB + 945AFC + Amazon Technologies Inc. - 000A14 - TECO a.s. + 00D76D + Intel Corporate - 000A0B - Sealevel Systems Inc. + B41CAB + ICR, inc. - 000A10 - FAST media integrations AG + A85B36 + IEEE Registration Authority - 0009DB - eSpace + 2C1165 + Silicon Laboratories - 0009D5 - Signal Communication Inc. + DCED83 + Beijing Xiaomi Mobile Software Co., Ltd - 0009D3 - Western DataCom Co. Inc. + AC0BFB + Espressif Inc. - 0009BC - Utility Inc. + 20B868 + Motorola Mobility LLC, a Lenovo Company - 0009BE - Mamiya-OP Ltd + 289C6E + Shanghai High-Flying Electronics Technology Co., Ltd - 0009E6 - Cyber Switching Inc. + 1C2A8B + Nokia - 0009FB - Philips Patient Monitoring + 485A67 + Shaanxi Ruixun Electronic Information Technology Co., Ltd - 00098F - Cetacean Networks + 945C9A + Apple, Inc. - 000987 - Nishi Nippon Electric Wire & Cable Ltd + 8C1F64 + IEEE Registration Authority - 000989 - VividLogic Inc. + F47B09 + Intel Corporate - 000986 - Metalink Ltd + E87829 + IEEE Registration Authority - 00098C - Option Wireless Sweden + 50325F + Silicon Laboratories - 000985 - Auto Telecom Company + 1C4190 + Universal Electronics, Inc. - 00098D - Velocity Semiconductor + FC8A3D + zte corporation - 000981 - Newport Networks + 085A11 + D-Link International - 000955 - Young Generation International Corp. + 64C403 + Quectel Wireless Solutions Co.,Ltd. - 00094A - Homenet Communications + EC9468 + META SYSTEM SPA - 00094B - FillFactory NV + 00F39F + Apple, Inc. - 00094D - Braintree Communications Pty Ltd + 64C394 + HUAWEI TECHNOLOGIES CO.,LTD - 000950 - Independent Storage Corporation + 4C77CB + Intel Corporate - 000954 - AMiT spol. s. r. o. + 44D5CC + Amazon Technologies Inc. - 000992 - InterEpoch Technology,Inc. + 00005B + ELTEC ELEKTRONIK AG - 000995 - Castle Technology Ltd + 5CE42A + Intel Corporate - 000998 - Capinfo Company Limited + F0C814 + SHENZHEN BILIAN ELECTRONIC CO.,LTD - 0009B6 - Cisco Systems Inc. + 705FA3 + Xiaomi Communications Co Ltd - 0009B3 - MCM Systems Ltd + 3C62F0 + Sercomm Corporation. - 00095C - Philips Medical Systems - Cardiac and Monitoring Systems (CM + 983B67 + DWnet Technologies(Suzhou) Corporation - 000958 - Intelnet S.A. + 6C9392 + BEKO Technologies GmbH - 0009A3 - Leadfly Techologies Corp Ltd + 58355D + Huawei Device Co., Ltd. - 0009A5 - Hansung Eletronic Industries Development Ltd + AC7E01 + Huawei Device Co., Ltd. - 000962 - Sonitor Technologies AS + 1874E2 + IEEE Registration Authority - 00095D - Dialogue Technology Corp. + A0B086 + Hirschmann Automation and Control GmbH - 00099A - Elmo Company, Limited + 30B346 + CJSC NORSI-TRANS - 00099C - Naval Research Laboratory + 0004B8 + Kumahira Co., Ltd. - 000984 - MyCasa Network Inc. + 000B3A + PESA Inc. - 00092B - iQstor Networks Inc. + 04B9E3 + Samsung Electronics Co.,Ltd - 000926 - Yoda Communications Inc. + 94AA0A + Fiberhome Telecommunication Technologies Co.,LTD - 000927 - Toyokeiki Ltd + E85C0A + Cisco Systems, Inc - 000923 - Heaman System Ltd + 9843FA + Intel Corporate - 00091D - Proteam Computer Corporation + 20D276 + ITEL MOBILE LIMITED - 0008EB - ROMWin Ltd + 3CBDD8 + LG ELECTRONICS INC - 0008E8 - Excel Master Ltd + 54C250 + Iskratel d.o.o. - 0008DC - Wiznet + 00FAB6 + Kontakt Micro-Location Sp z o.o. - 0008DD - Telena Communications Inc. + 7CF462 + BEIJING HUAWOO TECHNOLOGIES CO.LTD - 0008E1 - Barix AG + 70B950 + Texas Instruments - 000909 - Telenor Connect A/S + 781C5A + SHARP Corporation - 00090A - SnedFar Technology Ltd + C45E5C + HUAWEI TECHNOLOGIES CO.,LTD - 00090F - Fortinet Inc. + D01769 + Murata Manufacturing Co., Ltd. - 00092C - Hitpoint Inc. + 20C19B + Intel Corporate - 000903 - Panasas Inc. + 2C6DC1 + Intel Corporate - 000907 - Chrysalis Development + D09FD9 + IEEE Registration Authority - 000906 - Esteem Networks + A0D722 + Samsung Electronics Co.,Ltd - 000952 - Auerswald GmbH & Co. KG + 5049B0 + Samsung Electronics Co.,Ltd - 000944 - Cisco Systems Inc. + 000CDF + JAI Manufacturing - 0008FB - SonoSite Inc. + C4A151 + Sichuan Tianyi Comheart Telecom Co.,LTD - 0008EE - Logic Product Development + 201F3B + Google, Inc. - 000917 - WEM Technology Inc + C8059E + Hefei Symboltek Co.,Ltd - 000881 - Digital Hands Ltd + 34FCA1 + Micronet union Technology(Chengdu)Co., Ltd. - 000882 - Sigma Corporation + 107BCE + Nokia - 000873 - DapTechnology B.V. + B825B5 + Trakm8 Ltd - 00087A - Wipotec GmbH + 20415A + Smarteh d.o.o. - 000871 - NORTHDATA Ltd + C8F5D6 + IEEE Registration Authority - 0008B2 - Shenzhen Compass Technology Development Ltd + 2897B8 + myenergi Ltd - 0008B1 - ProQuent Systems + F44E38 + Olibra LLC - 0008AF - Novatec Corporation + F092B4 + Sichuan Tianyi Comheart Telecom Co.,LTD - 0008A6 - Multiware & Image Ltd + ECF8EB + Sichuan Tianyi Comheart Telecom Co.,LTD - 00087E - Bon Electro-Telecom Inc. + 405899 + Logitech Far East - 000880 - BroadTel Canada Communications Inc. + 08A842 + Huawei Device Co., Ltd. - 00086D - Missouri FreeNet + 2C6373 + Sichuan Tianyi Comheart Telecom Co.,LTD - 0008D4 - IneoQuest Technologies Inc. + 88E056 + HUAWEI TECHNOLOGIES CO.,LTD - 0008D6 - HASSNET Inc. + 540E58 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 0008CE - IPMobileNet Inc. + 5C648E + Zyxel Communications Corporation - 0008C2 - Cisco Systems Inc. + 0000B8 + SEIKOSHA CO., LTD. - 0008C0 - ASA Systems + D035E5 + EM Microelectronic - 0008A3 - Cisco Systems Inc. + 9096F3 + BUFFALO.INC - 00089E - Beijing Enter-Net Ltd + 082CED + Technity Solutions Inc. - 0008B4 - Syspol + 145AFC + Liteon Technology Corporation - 0008B3 - Fastwel + EC153D + Beijing Yaxunhongda Technology Co., Ltd. - 00088E - Nihon Computer Ltd + 2066CF + FREEBOX SAS - 0008DA - SofaWare Technologies Ltd + 2C8DB1 + Intel Corporate - 0007D5 - 3e Technologies Int;. Inc. + 586C25 + Intel Corporate - 0007DB - Kirana Networks Inc. + 2CC81B + Routerboard.com - 00086A - Securiton GmbH + 7847E3 + Sichuan Tianyi Comheart Telecom Co.,LTD - 000863 - Entrisphere Inc. + 30E396 + Huawei Device Co., Ltd. - 000866 - DSX Access Systems Inc. + D07D33 + Huawei Device Co., Ltd. - 0007EF - Lockheed Martin Tactical Systems + C0E1BE + HUAWEI TECHNOLOGIES CO.,LTD - 0007F4 - Eletex Ltd + 042728 + Microsoft Corporation - 0007DD - Cradle Technologies + 18BFB3 + Samsung Electronics Co., Ltd., Memory Division - 00081B - Windigo Systems + A49BCD + Cisco Systems, Inc - 0007FF - Gluon Networks + B4E3F9 + Silicon Laboratories - 0007F7 - Galtronics + 1842D4 + Wuhan Hosan Telecommunication Technology Co.,Ltd - 00085F - Picanol N.V. + A8637D + D-Link International - 000852 - Davolink Co Inc. + 6C1B3F + MiraeSignal Co., Ltd - 000804 - ICA Inc. + B03DC2 + Wasp artificial intelligence(Shenzhen) Co.,ltd - 000857 - Polaris Networks Inc. + C84D34 + LIONS Taiwan Technology Inc. - 00078B - Wegener Communications Inc. + 2025D2 + Fiberhome Telecommunication Technologies Co.,LTD - 000783 - SynCom Network Inc. + 2C43BE + Sunnovo International Limited - 000787 - Idea System Ltd + 5810B7 + Infinix mobility limited - 0007B9 - Ginganet Corporation + E0925C + Apple, Inc. - 00047F - Chr. Mayr GmbH & Co. KG + 00116C + Nanwang Multimedia Inc.,Ltd - 00047B - Schlumberger + 28F49B + LEETEK - 0007B4 - Cisco Systems Inc. + D8A35C + Samsung Electronics Co.,Ltd - 0007B3 - Cisco Systems Inc. + C09296 + zte corporation - 0007B5 - Any One Wireless Ltd + 50E24E + zte corporation - 000785 - Cisco Systems Inc. + D8E72B + NETSCOUT SYSTEMS INC - 000775 - Valence Semiconductor Inc. + 78E36D + Espressif Inc. - 000793 - Shin Satellite Public Company Limited + 000139 + Point Multimedia Systems - 000796 - LSI Systems Inc. + B02491 + Huawei Device Co., Ltd. - 00077F - J Communications Ltd + 98751A + Huawei Device Co., Ltd. - 000771 - Embedded System Corporation + B48901 + HUAWEI TECHNOLOGIES CO.,LTD - 000770 - Ubiquoss Inc + 449BC1 + HUAWEI TECHNOLOGIES CO.,LTD - 0007D1 - Spectrum Signal Processing Inc. + 1C9180 + Apple, Inc. - 0007A2 - Opteon Corporation + 4CB910 + Apple, Inc. - 0006F8 - The Boeing Company + 1CA0EF + IEEE Registration Authority - 0006FB - Hitachi Printing Solutions Ltd + 446FF8 + Dyson Limited - 0006FC - Fnet Ltd + 28AFFD + Cisco Systems, Inc - 0006F4 - Prime Electronics & Satellitics Inc. + D097FE + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 000738 - Young Technology Ltd + 843A5B + Inventec(Chongqing) Corporation - 000729 - Kistler Instrumente AG + F845C4 + Shenzhen Netforward Micro-Electronic Co., Ltd. - 00072A - Innovance Networks + EC9365 + Mapper.ai, Inc. - 00074A - Carl Valentin GmbH + 9C7613 + Ring LLC - 00073C - Telecom Design + 808AF7 + Nanoleaf - 000736 - Data Video Technologies Ltd + 182A57 + HUAWEI TECHNOLOGIES CO.,LTD - 000750 - Cisco Systems Inc. + F83E95 + HUAWEI TECHNOLOGIES CO.,LTD - 000742 - Ormazabal + 481258 + HUAWEI TECHNOLOGIES CO.,LTD - 00074B - Daihen Corporation + CC3296 + Huawei Device Co., Ltd. - 000764 - YoungWoo Telecom Ltd + D8EB46 + Google, Inc. - 000766 - Chou Chin Industrial Ltd + 2C17E0 + SYSTEMES ET TECHNOLOGIES IDENTIFICATION (STid) - 000761 - 29530 + 5449DF + Peloton Interactive, Inc - 000755 - Lafon + A84397 + Innogrit Corporation - 000759 - Boris Manufacturing Corp. + 08474C + Nokia - 000751 - m-u-t AG + 90C119 + Nokia - 000719 - Mobiis Ltd + 8CAACE + Xiaomi Communications Co Ltd - 00070D - Cisco Systems Inc. + E89F39 + Nokia - 00070E - Cisco Systems Inc. + B0227A + HP Inc. - 00070B - Novabase SGPS, SA + 60A751 + Huawei Device Co., Ltd. - 000710 - Adax Inc. + 102B41 + Samsung Electronics Co.,Ltd - 0006E8 - Optical Network Testing Inc. + 344AC3 + HuNan ZiKun Information Technology CO., Ltd - 0006EE - Shenyang Neu-era Information & Technology Stock Ltd + 803428 + Microchip Technology Inc. - 0006E2 - Ceemax Technology Ltd + 00E421 + Sony Interactive Entertainment Inc. - 0006A5 - PINON Corp. + D85ED3 + GIGA-BYTE TECHNOLOGY CO.,LTD. - 00069D - Petards Ltd + 249AD8 + YEALINK(XIAMEN) NETWORK TECHNOLOGY CO.,LTD. - 0006A8 - KC Technology Inc. + D8CD2C + WUXI NEIHUA NETWORK TECHNOLOGY CO., LTD - 0006A0 - Mx Imaging + 7CF880 + Cisco Systems, Inc - 0006BE - Baumer Optronic GmbH + 981A35 + HUAWEI TECHNOLOGIES CO.,LTD - 0006BA - Westwave Communications + 682D83 + SHENZHEN DINGHE COMMUNICATION COMPANY - 0006C4 - Piolink Inc. + CCDB04 + DataRemote Inc. - 0006B5 - Source Photonics Inc. + 04D6F4 + GD Midea Air-Conditioning Equipment Co.,Ltd. - 00068F - Telemonitor Inc. + D8BBC1 + Micro-Star INTL CO., LTD. - 0006DA - ITRAN Communications Ltd + B844AE + TCT mobile ltd - 0006D0 - Elgar Electronics Corp. + F8AA3F + DWnet Technologies(Suzhou) Corporation - 0006CC - JMI Electronics Ltd + 0CCF89 + SHENZHEN BILIAN ELECTRONIC CO.,LTD - 0006BF - Accella Technologies Ltd + AC5AFC + Intel Corporate - 000690 - Euracom Communication GmbH + F077C3 + Intel Corporate - 0006E1 - Techno Trade s.a + 049081 + Pensando Systems, Inc. - 00062E - Aristos Logic Corp. + 4C796E + Intel Corporate - 000624 - Gentner Communications Corp. + F09E4A + Intel Corporate - 000625 - The Linksys Group Inc. + C89402 + CHONGQING FUGUI ELECTRONICS CO.,LTD. - 000627 - Uniwide Technologies Inc. + 7CB94C + Bouffalo Lab (Nanjing) Co., Ltd. - 00062A - Cisco Systems Inc. + 0C8C69 + Shenzhen elink smart Co., ltd - 00062C - Bivio Networks + 00682B + Huawei Device Co., Ltd. - 000621 - Hinox Ltd + 98AD1D + Huawei Device Co., Ltd. - 00064E - Broad Net Technology Inc. + 446FD8 + IEEE Registration Authority - 00062D - TouchStar Technologies, L.L.C. + 84D343 + Calix Inc. - 000646 - Shenzhen XunBao Network Technology Ltd + 38B5D3 + SecuWorks - 00064B - Alexon Ltd + 6CD630 + Rootous System Co.,Ltd - 00063C - Intrinsyc Software International Inc. + B068E6 + CHONGQING FUGUI ELECTRONICS CO.,LTD. - 000630 - Adtranz Sweden + BCD7CE + China Mobile (Hangzhou) Information Technology Co., Ltd. - 000637 - Toptrend-Meta Information (Shenzhen) Inc. + 34318F + Apple, Inc. - 00061C - Hoshino Metal Industries Ltd + C41411 + Apple, Inc. - 000623 - MGE UPS Systems France + CCC95D + Apple, Inc. - 00060B - Artesyn Embedded Technologies + C833E5 + HUAWEI TECHNOLOGIES CO.,LTD - 00067E - WinCom Systems Inc. + E86DE9 + HUAWEI TECHNOLOGIES CO.,LTD - 000677 - Sick AG + 144658 + HUAWEI TECHNOLOGIES CO.,LTD - 000666 - Roving Networks + 58BE72 + HUAWEI TECHNOLOGIES CO.,LTD - 000667 - Tripp Lite + 108FFE + HUAWEI TECHNOLOGIES CO.,LTD - 00064D - Sencore + D847BB + Huawei Device Co., Ltd. - 000660 - NADEX Ltd + 2CDD0C + Discovergy GmbH - 000679 - Konami Corporation + BC9D42 + SHENZHEN RF-LINK TECHNOLOGY CO.,LTD. - 00066C - Robinson Corporation + 44B6BE + Cisco Systems, Inc - 000615 - Kimoto Electric Ltd + 8CDEE6 + Samsung Electronics Co.,Ltd - 00060A - Blue2space + 10EC81 + Samsung Electronics Co.,Ltd - 0005CE - Prolink Microsystems Corporation + C45D83 + Samsung Electronics Co.,Ltd - 0005C2 - Soronti Inc. + 240B88 + Taicang T&W Electronics - 0005DF - Electronic Innovation Inc. + 0C938F + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 0005DE - Gi Fone Korea Inc. + A0412D + Lansen Systems AB - 0005E0 - Empirix Corp. + C43960 + GD Midea Air-Conditioning Equipment Co.,Ltd. - 0005D8 - Arescom Inc. + 5CBD9A + Huawei Device Co., Ltd. - 0005E4 - Red Lion Controls Inc. + 14A3B4 + Huawei Device Co., Ltd. - 0005F2 - Power R Inc. + 5CA4A4 + Fiberhome Telecommunication Technologies Co.,LTD - 0005F3 - Webyn + D809D6 + ZEXELON CO., LTD. - 000601 - Otanikeiki Ltd + 7404F0 + Mobiwire Mobiles (NingBo) Co., LTD - 000605 - Inncom International Inc. + B4B5B6 + CHONGQING FUGUI ELECTRONICS CO.,LTD. - 0005FA - IPOptical Inc. + 047A0B + Beijing Xiaomi Electronics Co., Ltd. - 0005E5 - Renishaw PLC + 900F0C + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 0005F5 - Geospace Technologies + 4C1154 + Mobiwire Mobiles (NingBo) Co., LTD - 0005FD - PacketLight Networks Ltd + C4BF60 + TECNO MOBILE LIMITED - 0005D4 - FutureSmart Networks Inc. + D040EF + Murata Manufacturing Co., Ltd. - 0005C4 - Telect Inc. + D056BF + AMOSENSE - 0005A3 - QEI Inc. + 2C9AA4 + Eolo SpA - 00059E - Zinwell Corporation + 18D5B6 + SMG Holdings LLC - 0005A5 - Kott + 70F096 + Cisco Systems, Inc - 0005B3 - Asahi-Engineering Ltd + BC9A53 + Huawei Device Co., Ltd. - 00059D - Daniel Computing Systems Inc. + DC2727 + Huawei Device Co., Ltd. - 0005A4 - Lucid Voice Ltd + F042F5 + Huawei Device Co., Ltd. - 000563 - J-Works Inc. + E02E3F + Huawei Device Co., Ltd. - 000557 - Agile TV Corporation + EC75ED + Citrix Systems, Inc. - 00055B - Charles Industries Ltd + 001340 + AD.EL s.r.l. - 000554 - Rangestar Wireless + 002236 + VECTOR SP. Z O.O. - 000553 - DVC Company Inc. + A453EE + IEEE Registration Authority - 000566 - Secui.com Corporation + C8A40D + Cooler Master Technology Inc - 00056C - Hung Chang Ltd + 608D26 + Arcadyan Corporation - 00055F - Cisco Systems Inc. + 1C3929 + OHSUNG - 00055D - D-Link Systems Inc. + 48701E + Texas Instruments - 000561 - nac Image Technology Inc. + 508E49 + Xiaomi Communications Co Ltd - 000594 - HMS Industrial Networks + AC3328 + Huawei Device Co., Ltd. - 00056F - Innomedia Technologies Pvt Ltd + 8CF319 + Siemens Industrial Automation Products Ltd., Chengdu - 000574 - Cisco Systems Inc. + B00CD1 + Hewlett Packard - 000567 - Etymonic Design Inc. + 2CF05D + Micro-Star INTL CO., LTD. - 000565 - Tailyn Communication Company Ltd + 8C476E + IEEE Registration Authority - 00058E - Flextronics International GmbH & Co. Nfg. KG + 0002F4 + PCTEL, Inc. - 000532 - Cisco Systems Inc. + 309E1D + OHSUNG - 000536 - Danam Communications Inc. + 687912 + IEEE Registration Authority - 000542 - Otari Inc. + 74D6CB + New H3C Technologies Co., Ltd - 000537 - Nets Technology Ltd + 0C3AFA + New H3C Technologies Co., Ltd - 00057C - RCO Security AB + A8817E + Apple, Inc. - 000583 - ImageCom Limited + 18B6CC + We Corporation Inc. - 00054B - Eaton Automation AG + 30A023 + ROCK PATH S.R.L - 0004C8 - LIBA Maschinenfabrik GmbH + 78CB2C + Join Digital, Inc. - 0004CC - Peek Traffic B.V. + F8665A + Apple, Inc. - 0004BF - VersaLogic Corp. + 60BEC4 + Apple, Inc. - 0004C3 - CASTOR Informatique + F8B1DD + Apple, Inc. - 0004F6 - Amphus + 588694 + EFM Networks - 0004F4 - Infinite Electronics Inc. + DCB72E + Xiaomi Communications Co Ltd - 0004F1 - WhereNet + E0C377 + Samsung Electronics Co.,Ltd - 000521 - Control Microsystems + 4CFBF4 + Optimal Audio Ltd - 000523 - AVL List GmbH + E02BE9 + Intel Corporate - 00051F - Taijin Media Ltd + F86D73 + Zengge Co., Limited - 00050C - Network Photonics Inc. + AC3728 + Taicang T&W Electronics - 0004EC - Memobox SA + 6CE874 + HUAWEI TECHNOLOGIES CO.,LTD - 0004E4 - Daeryung Ind. Inc. + C469F0 + HUAWEI TECHNOLOGIES CO.,LTD - 00050A - ICS Spa + BC9930 + HUAWEI TECHNOLOGIES CO.,LTD - 000511 - Complementary Technologies Ltd + E868E7 + Espressif Inc. - 000506 - Reddo Networks AB + 647924 + Huawei Device Co., Ltd. - 0004E2 - SMC Networks Inc. + D8CC98 + Huawei Device Co., Ltd. - 0004CB - Tdsoft Communication Ltd + 20CD6E + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 000526 - IPAS GmbH + 64037F + Samsung Electronics Co.,Ltd - 000467 - Wuhan Research Institute Of MII + B49D02 + Samsung Electronics Co.,Ltd - 00045A - The Linksys Group Inc. + 809FF5 + Samsung Electronics Co.,Ltd - 000463 - Bosch Security Systems + D0BCC1 + WEIFANG GOERTEK ELECTRONICS CO.,LTD - 00045C - Mobiwave Pte Ltd + DC4A9E + IEEE Registration Authority - 000453 - YottaYotta Inc. + FC8D3D + Leapfive Tech. Ltd. - 000450 - DMD Computers SRL + 4014AD + Huawei Device Co., Ltd. - 000443 - Agilent Technologies Inc. + 78C95E + Midmark RTLS - 000449 - Mapletree Networks + C033DA + Shenzhen JRUN Technologies CO., LTD - 00042F - International Communications Products Inc. + A87484 + zte corporation - 000429 - Pixord Corporation + BC69CB + Panasonic Electric Works Networks Co., Ltd. - 000426 - Autosys + 089356 + HUAWEI TECHNOLOGIES CO.,LTD - 0004B8 - Kumahira Ltd + DCB7FC + Alps Electric (Ireland) Ltd - 0004B5 - Equitrac Corporation + ACFAA5 + digitron - 0004B1 - Signal Technology Inc. + B40EDE + Intel Corporate - 000451 - Medrad Inc. + 6C146E + HUAWEI TECHNOLOGIES CO.,LTD - 000483 - Deltron Technology Inc. + 44E968 + HUAWEI TECHNOLOGIES CO.,LTD - 000441 - Half Dome Systems Inc. + E84F4B + Shenzhen Delos Electronic Co., Ltd - 0004A5 - Barco Projection Systems NV + B04A39 + Beijing Roborock Technology Co., Ltd. - 000482 - Medialogic Corp. + A4F9E4 + AirVine Scientific, Inc. - 0003CA - MTS Systems Corp. + F44FD3 + shenzhen hemuwei technology co.,ltd - 0003C7 - hopf Elektronik GmbH + AC122F + Fantasia Trading LLC - 0003C2 - Solphone K.K. + FC45C3 + Texas Instruments - 0003F3 - Dazzle Multimedia Inc. + AC6AA3 + Shenzhen Kertong Technology Co.,Ltd - 0003EC - ICG Research Inc. + E4C32A + TP-LINK TECHNOLOGIES CO.,LTD. - 0003E9 - Akara Canada Inc. + 909A4A + TP-LINK TECHNOLOGIES CO.,LTD. - 0003E5 - Hermstedt SG + BC9789 + Huawei Device Co., Ltd. - 000421 - Ocular Networks + 684571 + Huawei Device Co., Ltd. - 000424 - TMC s.r.l. + 8493A0 + Huawei Device Co., Ltd. - 00041D - Corega Of America + 9C8E9C + Huawei Device Co., Ltd. - 00041A - Ines Test and Measurement GmbH & CoKG + FC698C + ANDREAS STIHL AG & Co. KG - 00041E - Shikoku Instrumentation Ltd + 3CE038 + Omnifi Inc. - 000413 - snom technology GmbH + 44CE3A + Jiangsu Huacun Electronic Technology Co., Ltd. - 0003B4 - Macrotek International Corp. + 9C1EA4 + Renesas Electronics (Penang) Sdn. Bhd. - 0003A6 - Traxit Technology Inc. + 001FB8 + Universal Remote Control, Inc. - 0003A4 - Imation Corp. + B8AE1C + Smart Cube., Ltd - 0003AB - Bridge Information Systems + 607072 + SHENZHEN HONGDE SMART LINK TECHNOLOGY CO., LTD - 000403 - Nexsi Corporation + 6C2D24 + Zhen Shi Information Technology (Shanghai) Co., Ltd. - 000406 - Fa. Metabox AG + C8B6D3 + HUAWEI TECHNOLOGIES CO.,LTD - 0003F8 - SanCastle Technologies Inc. + E04BA6 + HUAWEI TECHNOLOGIES CO.,LTD - 0003FA - TiMetra Networks + 800384 + Ruckus Wireless - 0003C6 - ICUE Systems Inc. + D8373B + Shenzhen Jingxun Software Telecommunication Technology Co.,Ltd - 0003BB - Signal Communications Limited + A8301C + Qingdao Intelligent&Precise Electronics Co.,Ltd. - 0003BE - Netility + 7C78B2 + Wyze Labs Inc - 0003DF - Desana Systems + B8477A + Dasan Electron Co., Ltd. - 0003DA - Takamisawa Cybernetics Ltd + 6CADAD + CHONGQING FUGUI ELECTRONICS CO.,LTD. - 0003D9 - Secheron SA + 0060E9 + ATOP TECHNOLOGIES, INC. - 0003FB - ENEGATE Ltd + D8F3BC + Liteon Technology Corporation - 0003F6 - Allegro Networks Inc. + D4482D + Shenzhen Deejoy Lighting Technology Co.,Ltd. - 000415 - Rasteme Systems Ltd + 78E3DE + Apple, Inc. - 000398 - Wisi + F46FED + Fiberhome Telecommunication Technologies Co.,LTD - 000395 - California Amplifier + CCE0DA + Baidu Online Network Technology (Beijing) Co., Ltd - 000392 - Hyundai Teletek Ltd + 408C4C + Shenzhen MiaoMing Intelligent Technology Co.,Ltd - 00038E - Atoga Systems Inc. + 141B30 + Shenzhen Yipingfang Network Technology Co., Ltd. - 00031A - Beijing Broad Telecom Ltd China + D0D23C + Apple, Inc. - 00035B - BridgeWave Communications + 64D2C4 + Apple, Inc. - 000357 - Intervoice-Brite Inc. + DC5285 + Apple, Inc. - 00037F - Atheros Communications Inc. + E88152 + Apple, Inc. - 0002F0 - AME Optimedia Technology Ltd + 908158 + Apple, Inc. - 00039E - Tera System Ltd + D8F8AF + DAONTEC - 000397 - FireBrick Limited + E4842B + HANGZHOU SOFTEL OPTIC CO., LTD - 00033F - BigBand Networks Ltd + 94026B + Optictimes Co.,Ltd - 000327 - ACT'L + 084296 + Mobile Technology Solutions LLC - 00032E - Scope Information Management Ltd + 34EFB6 + Edgecore Networks Corporation - 00037C - Coax Media + E874C7 + Sentinhealth - 000368 - Embedone Ltd + B4ADA3 + Guangzhou Shiyuan Electronic Technology Company Limited - 000345 - Routrek Networks Corporation + 18FDCB + IEEE Registration Authority - 0002C8 - Technocom Communications Technology (pte) Ltd + 009023 + ZILOG INC. - 0002B8 - WHI Konsult AB + B0FEE5 + Huawei Device Co., Ltd. - 0002A9 - RACOM, s.r.o. + 4487DB + Tymphany Acoustic Technology (Huizhou) Co., Ltd. - 0002BB - Continuous Computing Corp + 642315 + Huawei Device Co., Ltd. - 0002BC - LVL 7 Systems Inc. + A4C74B + Huawei Device Co., Ltd. - 00030F - Digital China (Shanghai) Networks Ltd + 085BD6 + Intel Corporate - 000311 - Micro Technology Ltd + C81739 + ITEL MOBILE LIMITED - 00030D - Uniwill Computer Corp. + 58D061 + HUAWEI TECHNOLOGIES CO.,LTD - 000309 - Texcel Technology PLC + 90CCDF + Intel Corporate - 000303 - JAMA Electronics Ltd + B8D309 + Cox Communications, Inc - 000305 - MSC Vertriebs GmbH + 689320 + New H3C Technologies Co., Ltd - 0002FE - Viditec Inc. + 9454CE + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 00019F - ReadyNet + 388ABE + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 0002FF - Handan BroadInfoCom + 047E23 + China Mobile IOT Company Limited - 0002F4 - PCTEL Inc. + 14CCB3 + AO GK NATEKS - 0002E9 - CS Systemes de Securite - C3S + 001C7B + Castlenet Technology Inc. - 0002E5 - Timeware Ltd + 5484DC + zte corporation - 0002E0 - ETAS GmbH + 38549B + zte corporation - 0002CE - FoxJet Inc. + DCCD2F + Seiko Epson Corporation - 0002C3 - Arelnet Ltd + 343EA4 + Ring LLC - 000316 - Nobell Communications Inc. + 04C1D8 + Huawei Device Co., Ltd. - 000329 - F3 Inc. + C8BC9C + Huawei Device Co., Ltd. - 000321 - Reco Research Ltd + 8C8D28 + Intel Corporate - 0002F5 - VIVE Synergies Inc. + E0D464 + Intel Corporate - 0002D5 - ACR + C0F6C2 + HUAWEI TECHNOLOGIES CO.,LTD - 0002AB - CTC Union Technologies Ltd + 007E56 + China Dragon Technology Limited - 0002A4 - AddPac Technology Ltd + 743A20 + New H3C Technologies Co., Ltd - 0002A0 - Flatstack Ltd + 3C1A9E + VitalThings AS - 0002B2 - Cablevision + C884A1 + Cisco Systems, Inc - 0002B7 - Watanabe Electric Industry Ltd + D8778B + Intelbras - 0002AF - TeleCruz Technology Inc. + 30C9AB + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 0002A8 - Air Link Technology + D4AFF7 + Arista Networks - 00026A - Cocess Telecom Ltd + C4D738 + Huawei Device Co., Ltd. - 00026C - Philips CFT + 60077C + Jala Group - 000262 - Soyo Group Soyo Com Tech Ltd + 609866 + Texas Instruments - 000265 - Virditech Ltd + 28D127 + Beijing Xiaomi Mobile Software Co., Ltd - 00025B - Cambridge Silicon Radio + 30A452 + Arrival Elements BV - 000256 - Alpha Processor Inc. + F469D5 + IEEE Registration Authority - 000259 - Tsann Kuen China (Shanghai)Enterprise Ltd IT Group + F81B04 + Zhong Shan City Richsound Electronic Industrial Ltd - 000294 - Tokyo Sokushin Ltd + D88C79 + Google, Inc. - 000296 - Lectron Ltd + 10341B + Spacelink - 00028E - Rapid 5 Networks Inc. + F86465 + Anova Applied Electronics, Inc. - 00024F - IPM Datacom S.R.L. + 90A935 + JWEntertainment - 000271 - Zhone Technologies + 60D4E9 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 00028A - Ambit Microsystems Corporation + C868DE + Huawei Device Co., Ltd. - 0001FA - Horoscas + D00DF7 + Huawei Device Co., Ltd. - 000282 - ViaClix Inc. + 4805E2 + Huawei Device Co., Ltd. - 000285 - Riverstone Networks + 001E68 + Quanta Computer Inc. - 000279 - Control Applications Ltd + 2C600C + Quanta Computer Inc. - 000251 - Soma Networks Inc. + 00238B + Quanta Computer Inc. - 0001F5 - Erim S.A. + 0008F6 + Sumitomo Electric Industries, Ltd - 0001FF - Data Direct Networks Inc. + 000BA2 + Sumitomo Electric Industries, Ltd - 0001FC - Keyence Corporation + 00005F + Sumitomo Electric Industries, Ltd - 0001FD - Digital Voice Systems Inc. + 18ECE7 + BUFFALO.INC - 000210 - Fenecom + BC03A7 + MFP MICHELIN - 00020B - Native Networks Inc. + CCDB93 + Cisco Systems, Inc - 000218 - Advanced Scientific Corp + C8E265 + Intel Corporate - 0001EE - Comtrol Europe Ltd + 18D61C + Shenzhen TINNO Mobile Technology Corp. - 0001F0 - Tridium Inc. + 5448E6 + Beijing Xiaomi Mobile Software Co., Ltd - 0001F1 - Innovative Concepts Inc. + 2C6F51 + Herospeed Digital Technology Limited - 0001E2 - Ando Electric Corporation + 8012DF + Shenzhen SuperElectron Technology Co.,Ltd. - 00022F - P-Cube Ltd + 04A2F3 + Fiberhome Telecommunication Technologies Co.,LTD - 000227 - ESD Electronic System Design GmbH + 982FF8 + Huawei Device Co., Ltd. - 00021D - Data General Communication Ltd + 40DCA5 + Huawei Device Co., Ltd. - 000219 - Paralon Technologies + 30C50F + HUAWEI TECHNOLOGIES CO.,LTD - 000203 - Woonsang Telecom Inc. + 2868D2 + HUAWEI TECHNOLOGIES CO.,LTD - 0001D3 - PAXCOMM Inc. + 00D0B6 + CRESCENT NETWORKS, INC. - 0001E1 - Kinpo Electronics Inc. + C01C30 + Shenzhen WIFI-3L Technology Co.,Ltd - 00022C - ABB Bomem Inc. + 1CE61D + Samsung Electronics Co.,Ltd - 00023C - Creative Technology Ltd + 441C7F + Motorola Mobility LLC, a Lenovo Company - 00306C - Hitex Holding GmbH + 00B8B6 + Motorola Mobility LLC, a Lenovo Company - 00308B - Brix Networks + BC17B8 + Intel Corporate - 000177 - EDSL + 08FA79 + vivo Mobile Communication Co., Ltd. - 00014D - Shin Kin Enterprises Ltd + D8C678 + MitraStar Technology Corp. - 0001DA - WINCOMM Corporation + ECC01B + HUAWEI TECHNOLOGIES CO.,LTD - 0001D2 - inXtron Inc. + 9844CE + HUAWEI TECHNOLOGIES CO.,LTD - 0001C6 - Quarry Technologies + F09BB8 + HUAWEI TECHNOLOGIES CO.,LTD - 00016E - Conklin Corporation + 44BB3B + Google, Inc. - 000174 - CyberOptics Corporation + 14C14E + Google, Inc. - 00015E - Best Technology Ltd + D8C0A6 + AzureWave Technology Inc. - 000161 - Meta Machine Technology + 10E77A + STMicrolectronics International NV - 0001A1 - Mag-Tek Inc. + E43D1A + Broadcom Limited - 000186 - Uwe Disch + 7018A7 + Cisco Systems, Inc - 0001A6 - Scientific-Atlanta Arcodan A/S + 24F150 + Guangzhou Qi'an Technology Co., Ltd. - 000172 - TechnoLand Ltd + 304240 + zte corporation - 0001A0 - Infinilink Corporation + 4C2113 + Nokia Shanghai Bell Co., Ltd. - 000196 - Cisco Systems Inc. + 183EEF + Apple, Inc. - 000199 - HeiSei Electronics + 607EC9 + Apple, Inc. - 00018B - NetLinks Ltd + 982CBC + Intel Corporate - 00018D - AudeSi Technologies + 2050E7 + AMPAK Technology,Inc. - 00019D - E-Control Systems Inc. + 4CC53E + Zyxel Communications Corporation - 0001CE - Custom Micro Products Ltd + 108B6A + Antailiye Technology Co.,Ltd - 0001BB - Frequentis + 802DBF + Cisco Systems, Inc - 0001BC - Brains Corporation + 8C5EBD + Huawei Device Co., Ltd. - 0001C0 - CompuLab Ltd + 2CA042 + Huawei Device Co., Ltd. - 00017C - AG-E GmbH + C083C9 + Huawei Device Co., Ltd. - 000108 - AVLAB Technology Inc. + FC609B + New H3C Technologies Co., Ltd - 00062B - Intraserver Technology + E8A1F8 + zte corporation - 000100 - Equip'Trans + 14C88B + Apple, Inc. - 00B09D - Point Grey Research Inc. + EC2651 + Apple, Inc. - 000110 - Gotham Networks + 08ACC4 + FMTech - 000112 - Shark Multimedia Inc. + 28B371 + Ruckus Wireless - 000116 - Netspect Technologies Inc. + DC503A + Nanjing Ticom Tech Co., Ltd. - 00B06D - Jones Futurex Inc. + 18473D + CHONGQING FUGUI ELECTRONICS CO.,LTD. - 00B094 - Alaris Inc. + D477B2 + Netix Global B.V. - 0030F0 - Uniform Industrial Corp. + F86BD9 + Cisco Systems, Inc - 00013B - BNA Systems + C014FE + Cisco Systems, Inc - 000134 - Selectron Systems AG + 7CAD4F + Cisco Systems, Inc - 000139 - Point Multimedia Systems + 605661 + IXECLOUD Tech - 00013E - Ascom Tateco AB + 706979 + IEEE Registration Authority - 00012E - PC Partner Ltd + 244BFE + ASUSTek COMPUTER INC. - 000132 - Dranetz - BMI + 7CDDE9 + ATOM tech Inc. - 000113 - Olympus Corporation + 942533 + HUAWEI TECHNOLOGIES CO.,LTD - 00011E - Precidia Technologies Inc. + 44F4E7 + Cohesity Inc - 000155 - Promise Technology Inc. + F82F65 + Huawei Device Co., Ltd. - 003094 - Cisco Systems Inc. + 0831A4 + Huawei Device Co., Ltd. - 00308A - Nicotra Sistemi S.P.A + A8E978 + Huawei Device Co., Ltd. - 003072 - Intellibyte Inc. + E06234 + Texas Instruments - 003040 - Cisco Systems Inc. + 50382F + ASE Group Chung-Li - 003032 - MagicRam Inc. + 708CBB + MIMODISPLAYKOREA - 0030EA - TeraForce Technology Corporation + B848AA + EM Microelectronic - 00309B - Smartware + E0D462 + Huawei Device Co., Ltd. - 003045 - Village Networks Inc. (VNI) + 909838 + Huawei Device Co., Ltd. - 0030E5 - Amper Datos S.A. + F8AC65 + Intel Corporate - 003006 - Superpower Computer + 0019F4 + Convergens Oy Ltd - 003038 - XCP Inc. + F0B022 + TOHO Electronics INC. - 003079 - Cqos Inc. + 987ECA + Inventus Power Eletronica do Brasil LTDA - 00300C - Congruency Ltd + 6C2F8A + Samsung Electronics Co.,Ltd - 00304C - Appian Communications Inc. + 84CCA8 + Espressif Inc. - 0030E8 - Ensim Corp. + 002060 + ALCATEL ITALIA S.p.A. - 0030C9 - LuxN, N + 948AC6 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 003028 - FASE Saldatura srl + 448DBF + Rhino Mobility LLC - 003069 - Impacct Technology Corp. + C0A66D + Inspur Group Co., Ltd. - 0030C3 - Flueckiger Elektronik AG + AC7A56 + Cisco Systems, Inc - 00305A - Telgen Corporation + D89136 + Dover Fueling Solutions - 003010 - Visionetics International + E0F6B5 + Nintendo Co.,Ltd - 0030D9 - Datacore Software Corp. + 40B31E + Universal Electronics, Inc. - 003026 - HeiTel Digital Video GmbH + 884033 + HUAWEI TECHNOLOGIES CO.,LTD - 003077 - Onprem Networks + E8986D + Palo Alto Networks - 003047 - Nissei Electric Ltd + FC956A + OCTAGON SYSTEMS CORP. - 0030D4 - AAE Systems Inc. + 24C8D3 + McWane India Pvt Ltd - 00D0D7 - B2C2 Inc. + B8E3EE + Universal Electronics, Inc. - 00D073 - ACN Advanced Communications + C88314 + Tempo Communications - 00D057 - Ultrak Inc. + 68B9D3 + Shenzhen Trolink Technology CO, LTD - 0030AB - Delta Networks Inc. + 9056FC + TECNO MOBILE LIMITED - 003049 - Bryant Technology Ltd + 98ED5C + Tesla,Inc. - 00306D - Lucent Technologies + 78AA82 + New H3C Technologies Co., Ltd - 003017 - BlueArc UK Ltd + 7C89C1 + Palo Alto Networks - 00301C - Altvater Airdata Systems + 84D6C5 + SolarEdge Technologies - 003080 - Cisco Systems Inc. + 38F601 + Solid State Storage Technology Corporation - 0030F7 - Ramix Inc. + 1070FD + Mellanox Technologies, Inc. - 0030D0 - Tellabs + B8C6AA + Earda Technologies co Ltd - 003014 - Divio Inc. + 54AED0 + DASAN Networks, Inc. - 003081 - Altos C&C + B86392 + GUANGDONG GENIUS TECHNOLOGY CO., LTD. - 00D0F0 - Convision Technology GmbH + 5471DD + Huawei Device Co., Ltd. - 00D010 - Convergent Networks Inc. + 00062A + Cisco Systems, Inc - 00D04B - LA CIE Group S.A. + 6CF712 + Nokia Solutions and Networks GmbH & Co. KG - 00D00E - Pluris Inc. + 20826A + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 00D012 - Gateworks Corp. + 487AF6 + NCS ELECTRICAL SDN BHD - 00D04D - Div Of Research & Statistics + 486E70 + Zhejiang Tmall Technology Co., Ltd. - 00D02E - Communication Automation Corp. + 601D9D + Sichuan AI-Link Technology Co., Ltd. - 00D0C5 - Computational Systems Inc. + 6409AC + TCT mobile ltd - 00D046 - Dolby Laboratories Inc. + 24B657 + Cisco Systems, Inc - 00D0DE - Philips Multimedia Network + 5C5578 + iryx corp - 00D00C - Snijder Micro Systems + E4E112 + Texas Instruments - 00D017 - Syntech Information Ltd + 3414B5 + Texas Instruments - 00D036 - Technology Atlanta Corp. + D003EB + Texas Instruments - 00D0E3 - ELE-Chem Engineering Ltd + 08BFA0 + Samsung Electronics Co.,Ltd - 00D0B6 - Crescent Networks Inc. + 701F3C + Samsung Electronics Co.,Ltd - 00D0C4 - Teratech Corporation + D48A39 + Samsung Electronics Co.,Ltd - 00D061 - Tremon Enterprises Ltd + E4F3C4 + Samsung Electronics Co.,Ltd - 00D0E5 - Solidum Systems Corp. + 9C2F4E + zte corporation - 00D045 - Kvaser AB + D8A8C8 + zte corporation - 00D004 - Pentacom Ltd + 189E2C + Huawei Device Co., Ltd. - 00D005 - ZHS Zeitmanagementsysteme + 94DB56 + Sony Home Entertainment&Sound Products Inc - 00D0D3 - Cisco Systems Inc. + 3822E2 + HP Inc. - 00D026 - Hirschmann Austria GmbH + F01090 + New H3C Technologies Co., Ltd - 00D0DA - Taicom Data Systems Ltd + 646266 + IEEE Registration Authority - 00D03C - Vieo Inc. + D85F77 + Telink Semiconductor (Shanghai) Co., Ltd. - 00D0B4 - Katsujima Ltd + 2C97ED + Sony Imaging Products & Solutions Inc. - 00D086 - Foveon Inc. + 188A6A + AVPro Global Hldgs - 00D0A8 - Network Engines Inc. + 3C7D0A + Apple, Inc. - 00D0AB - Deltakabel Telecom CV + B4157E + Celona Inc. - 00D0E8 - MAC System Ltd + 645E2C + IRay Technology Co., Ltd. - 00D06B - SR Telecom Inc. + 147740 + Huawei Device Co., Ltd. - 00D0DC - Modular Mining Systems Inc. + B89047 + Apple, Inc. - 00D01E - Pingtel Corp. + 909C4A + Apple, Inc. - 00D0CA - Intrinsyc Software International Inc. + 908C43 + Apple, Inc. - 00D065 - Toko Electric + 18D98F + Huawei Device Co., Ltd. - 00D09A - Filanet Corporation + 2811EC + HUAWEI TECHNOLOGIES CO.,LTD - 00D0AE - Oresis Communications Inc. + 00692D + Sunnovo International Limited - 00D0F2 - Monterey Networks + F4032A + Amazon Technologies Inc. - 00D014 - Root Inc. + 9C28F7 + Xiaomi Communications Co Ltd - 00D023 - Infortrend Technology Inc. + 803049 + Liteon Technology Corporation - 00D0A2 - Integrated Device + E42686 + DWnet Technologies(Suzhou) Corporation - 00D034 - Ormec Systems Corp. + 0C3796 + BIZLINK TECHNOLOGY, INC. - 00D08A - Photron USA + 38EB47 + HUAWEI TECHNOLOGIES CO.,LTD - 00D0A7 - Tokyo Sokki Kenkyujo Ltd + 10C3AB + HUAWEI TECHNOLOGIES CO.,LTD - 00D01D - Furuno Electric Ltd + 943BB0 + New H3C Technologies Co., Ltd - 00504C - Galil Motion Control + 289AF7 + ADVA Optical Networking Ltd. - 005076 - IBM Corp + E84943 + YUGE Information technology Co. Ltd - 0050D4 - Joohong Information & + 9043E2 + Cornami, Inc - 0050A6 - Optronics + 501408 + AiNET - 0050A9 - Moldat Wireless Technolgies + F0F0A4 + Amazon Technologies Inc. - 00509B - Switchcore AB + CC2D1B + SFR - 00507E - Newer Technology + B0B194 + zte corporation - 0050CE - LG International Corp. + A02D13 + AirTies Wireless Networks - 0050F7 - Venture Manufacturing (Singapore) Ltd + 3C5731 + Cisco Systems, Inc - 005019 - Spring Tide Networks Inc. + 342FBD + Nintendo Co.,Ltd - 0050FD - Visioncomm Ltd + 6C42AB + Subscriber Networks, Inc. - 0050BF - Metalligence Technology Corp. + 64F6F7 + Anhui Dynamic Power Co., Ltd. - 005036 - Netcam Ltd + 941C56 + Actiontec Electronics, Inc - 0050DB - Contemporary Control + C0D682 + Arista Networks - 00507C - Videocon AG + D80BCB + Telink Semiconductor (Shanghai) Co., Ltd. - 005047 - Private + 9CFCE8 + Intel Corporate - 00D06C - Sharewave Inc. + 8468C8 + TOTOLINK TECHNOLOGY INT‘L LIMITED - 0050A7 - Cisco Systems Inc. + 807B3E + Samsung Electronics Co.,Ltd - 005055 - Doms A/S + F8F1E6 + Samsung Electronics Co.,Ltd - 005072 - Corvis Corporation + 88A9B7 + Apple, Inc. - 00D0EE - Dictaphone Corporation + ECCED7 + Apple, Inc. - 00501B - ABL Canada Inc. + AC9085 + Apple, Inc. - 009057 - AANetcom Inc. + A824B8 + Nokia - 009083 - Turbo Communication Inc. + 6490C1 + Beijing Xiaomi Mobile Software Co., Ltd - 00903D - Biopac Systems Inc. + 4C4FEE + OnePlus Technology (Shenzhen) Co., Ltd - 0090D7 - NetBoost Corp. + 60CE86 + Sercomm Corporation. - 005083 - Gilbarco Inc. + 0009FC + IPFLEX Inc. - 0050DC - TAS Telefonbau A. Schwabe GmbH & Co. KG + 48EB62 + Murata Manufacturing Co., Ltd. - 005008 - Tiva Microcomputer Corp. (TMC) + 50DE19 + IEEE Registration Authority - 005052 - Tiara Networks Inc. + D005E4 + Huawei Device Co., Ltd. - 005027 - Genicom Corporation + 30AAE4 + Huawei Device Co., Ltd. - 00505A - Network Alchemy Inc. + 5CE176 + Cisco Systems, Inc - 005039 - Mariner Networks + 28CDC4 + CHONGQING FUGUI ELECTRONICS CO.,LTD. - 005064 - CAE Electronics + E8D8D1 + HP Inc. - 0050B8 - Inova Computers GmbH & Co. KG + 9055DE + Fiberhome Telecommunication Technologies Co.,LTD - 00505B - Kawasaki LSI U.S.A. Inc. + E8910F + Fiberhome Telecommunication Technologies Co.,LTD - 0050CC - Seagate Cloud Systems Inc + 14AB56 + WUXI FUNIDE DIGITAL CO.,LTD - 005016 - Molex Canada Ltd + 4CE175 + Cisco Systems, Inc - 00501F - MRG Systems Ltd + 50E549 + GIGA-BYTE TECHNOLOGY CO.,LTD. - 005043 - Marvell Semiconductor Inc. + CC5289 + SHENZHEN OPTFOCUS TECHNOLOGY.,LTD - 005095 - Peracom Networks + CC5D78 + JTD Consulting - 0050FA - Oxtel Ltd + B0A454 + Tripwire Inc. - 009038 - Fountain Technologies Inc. + ACEB51 + Universal Electronics, Inc. - 0090B0 - Vadem + C4B239 + Cisco Systems, Inc - 0090EF - Integrix Inc. + A82BCD + HUAWEI TECHNOLOGIES CO.,LTD - 0090C5 - Internet Magic Inc. + 48DC2D + HUAWEI TECHNOLOGIES CO.,LTD - 00908C - Etrend Electronics Inc. + 809F9B + Sichuan AI-Link Technology Co., Ltd. - 009048 - Zeal Corporation + BCF9F2 + TEKO - 0090B9 - Beran Instruments Ltd + 6010A2 + Crompton Instruments - 0090C4 - Javelin Systems Inc. + 349F7B + CANON INC. - 0090A5 - Spectra Logic + 34F150 + Hui Zhou Gaoshengda Technology Co.,LTD - 0090A3 - Corecess Inc. + D03110 + Ingenic Semiconductor Co.,Ltd - 009082 - Force Institute + A8E77D + Texas Instruments - 009000 - Diamond Multimedia + DC543D + ITEL MOBILE LIMITED - 00906E - Praxon Inc. + 08CC27 + Motorola Mobility LLC, a Lenovo Company - 009054 - Innovative Semiconductors Inc. + 04D395 + Motorola Mobility LLC, a Lenovo Company - 009061 - Pacific Research & Engineering Corporation + 2877F1 + Apple, Inc. - 00900B - Lanner Electronics Inc. + 3C510E + Cisco Systems, Inc - 0090CE - avateramedical Mechatronics GmbH + D8AED0 + Shanghai Engineering Science & Technology Co.,LTD CGNPC - 009007 - Domex Technology Corp. + E0859A + SHENZHEN RF-LINK TECHNOLOGY CO.,LTD. - 00902D - Data Electronics (Aust.) Pty Ltd + 748A28 + HMD Global Oy - 0090D4 - BindView Development Corp. + FC8596 + Axonne Inc. - 009029 - Crypto AG + 50C6AD + Fiberhome Telecommunication Technologies Co.,LTD - 0090DF - Mitsubishi Chemical America Inc. + 0C8447 + Fiberhome Telecommunication Technologies Co.,LTD - 0090C0 - K.J. LAW Engineers Inc. + 9C6B72 + Realme Chongqing MobileTelecommunications Corp Ltd - 00901F - Adtec Productions Inc. + 5CB4E2 + Inspur Software Group Ltd. - 009024 - Pipelinks Inc. + D42493 + GW Technologies Co.,Ltd - 00903A - Nihon Media Tool Inc. + 6C410E + Cisco Systems, Inc - 0090B2 - Avici Systems Inc. + 149138 + Amazon Technologies Inc. - 0090B6 - Fibex Systems + F81E6F + EBG compleo GmbH - 009063 - Coherent Communications Systems Corporation + 6C310E + Cisco Systems, Inc - 009062 - ICP VORTEX CoMPUTERSYSTEME GmbH + 58D50A + Murata Manufacturing Co., Ltd. - 0010D3 - Grips Electronic GmbH + 14A32F + Huawei Device Co., Ltd. - 0010FB - Zida Technologies Limited + 04D3B5 + Huawei Device Co., Ltd. - 001053 - Computer Technology Corp. + 00BB1C + Huawei Device Co., Ltd. - 0010ED - Sundance Technology Inc. + DC4BFE + Shenzhen Belon Technology CO.,LTD - 00106C - EDNT GmbH + 506255 + IEEE Registration Authority - 0010E9 - Raidtec Ltd + 80AC7C + Sichuan AI-Link Technology Co., Ltd. - 001003 - Imatron Inc. + 88A303 + Samsung Electronics Co.,Ltd - 001071 - Advanet Inc. + FCDE90 + Samsung Electronics Co.,Ltd - 009015 - Centigram Communications Corp. + 1854CF + Samsung Electronics Co.,Ltd - 009095 - Universal Avionics + 80795D + Infinix mobility limited - 009041 - Applied Digital Access + F0A7B2 + FUTABA CORPORATION - 00905A - Dearborn Group Inc. + 609B2D + JMACS Japan Co., Ltd. - 009011 - WAVTrace Inc. + F0A35A + Apple, Inc. - 009065 - Finisar Corporation + 608373 + Apple, Inc. - 009023 - Zilog Inc. + 84AD8D + Apple, Inc. - 0090F6 - Escalate Networks Inc. + 74428B + Apple, Inc. - 0090A8 - NineTiles Networks Ltd + 642CAC + HUAWEI TECHNOLOGIES CO.,LTD - 00102A - ZF Microsystems Inc. + E884C6 + HUAWEI TECHNOLOGIES CO.,LTD - 0010E5 - Solectron Texas + 6C710D + Cisco Systems, Inc - 00109D - Clarinet Systems Inc. + 00D2B1 + TPV Display Technology (Xiamen) Co.,Ltd. - 00100E - Micro Linear Coporation + 1C4455 + Sieb & Meyer AG - 0090EC - Pyrescom + E01F88 + Xiaomi Communications Co Ltd - 0090C3 - Topic Semiconductor Corp. + 803253 + Intel Corporate - 0010C8 - Communications Electronics Security Group + C0E434 + AzureWave Technology Inc. - 0010F3 - Nexcom International Ltd + 5CE7A0 + Nokia - 001086 - ATTO Technology Inc. + 8CDC02 + zte corporation - 0010DF - Rise Computer Inc. + D03D52 + Ava Security Limited - 001072 - GVN Technologies Inc. + 246F8C + Huawei Device Co., Ltd. - 0010DA - Kollmorgen Corp + 1C1386 + Huawei Device Co., Ltd. - 0010E4 - NSI Corporation + BC2EF6 + Huawei Device Co., Ltd. - 00107E - BACHMANN ELECTRONIC GmbH + 4455C4 + Huawei Device Co., Ltd. - 0010A0 - Innovex Technologies Inc. + 10C65E + Adapt-IP - 001016 - T.Sqware + 20311C + vivo Mobile Communication Co., Ltd. - 001090 - Cimetrics Inc. + B4E842 + Hong Kong Bouffalo Lab Limited - 0010F5 - Amherst Systems Inc. + 7CA7B0 + SHENZHEN BILIAN ELECTRONIC CO.,LTD - 00103D - Phasecom Ltd + 683943 + ittim - 001096 - Tracewell Systems Inc. + 2852F9 + Zhongxin Intelligent Times (Shenzhen) Co., Ltd. - 001082 - JNA Telecommunications Limited + B8F853 + Arcadyan Corporation - 001098 - Starnet Technologies Inc. + E0D083 + Samsung Electronics Co.,Ltd - 001042 - Alacritech Inc. + D80B9A + Samsung Electronics Co.,Ltd - 001068 - Comos Telecom + 6C1DEB + u-blox AG - 0010EA - Adept Technology + 287FCF + Intel Corporate - 0010AE - Shinko Electric Industries Co. + 8031F0 + Samsung Electronics Co.,Ltd - 0010C4 - Media Global Links Ltd + 743C18 + Taicang T&W Electronics - 0010FE - Digital Equipment Corporation + 1088CE + Fiberhome Telecommunication Technologies Co.,LTD - 001056 - Sodick Ltd + 8C02FA + COMMANDO Networks Limited - 0010CD - Interface Concept + 4C80BA + Wuhan Tianyu Information Industry Co., Ltd. - 001061 - Hostlink Corp. + 34B5A3 + CIG SHANGHAI CO LTD - 001099 - InnoMedia Inc. + AC8D34 + HUAWEI TECHNOLOGIES CO.,LTD - 0010E1 - S.I. Tech Inc. + 401175 + IEEE Registration Authority - 0010BB - Data & Information Technology + 84A9EA + Career Technologies USA - 001020 - Hand Held Products Inc + E405F8 + Bytedance - 00103A - Diamond Network Tech + 583526 + DEEPLET TECHNOLOGY CORP - 001004 - THE Brantley Coile Company,Inc + 283334 + Huawei Device Co., Ltd. - 0010EF - Dbtel Incorporated + 30A2C2 + Huawei Device Co., Ltd. - 001088 - American Networks Inc. + F47488 + New H3C Technologies Co., Ltd - 001022 - SatCom Media Corporation + DCDFD6 + zte corporation - 001076 - EUREM GmbH + ACA88E + SHARP Corporation - 00103F - Tollgrade Communications Inc. + 98415C + Nintendo Co.,Ltd - 001049 - ShoreTel Inc. + 848094 + Meter, Inc. - 00105E - Spirent plc, Service Assurance Broadband + 10B3D5 + Cisco Systems, Inc - 0010AF - TAC Systems Inc. + 000084 + SUPERNET - 00108C - Fujitsu Services Ltd + 50A132 + Shenzhen MiaoMing Intelligent Technology Co.,Ltd - 0010F7 - IRIICHI TECHNOLOGIES Inc. + 807871 + ASKEY COMPUTER CORP - 0010AB - Koito Electric Industries Ltd + 4C7A48 + Nippon Seiki (Europe) B.V. - 001010 - Initio Corporation + 5C0BCA + Tunstall Nordic AB - 0010F2 - Antec + F4B688 + PLANTRONICS, INC. - 00E007 - Avaya ECS Ltd + 000C86 + Cisco Systems, Inc - 0010BE - March Networks Corporation + 08318B + HUAWEI TECHNOLOGIES CO.,LTD - 001058 - ArrowPoint Communications + 4CB1CD + Ruckus Wireless - 00100F - Industrial CPU Systems + F83CBF + BOTATO ELECTRONICS SDN BHD - 0010BC - Aastra Telecom + FC589A + Cisco Systems, Inc - 00E0BF - Torrent Networking Technologies Corp. + 88517A + HMD Global Oy - 00E0E3 - SK-Elektronik GmbH + ACB3B5 + HUAWEI TECHNOLOGIES CO.,LTD - 00E0C6 - LINK2IT, L.L.C. + F49C12 + Structab AB - 00E0E5 - Cinco Networks Inc. + 60AB14 + LG Innotek - 00E061 - EdgePoint Networks Inc. + BC62D2 + Genexis International B.V. - 00E053 - Cellport Labs Inc. + 6C9E7C + Fiberhome Telecommunication Technologies Co.,LTD - 00E0D3 - DATENTECHNIK GmbH + 84D15A + TCT mobile ltd - 00E043 - VitalCom + F08620 + Arcadyan Corporation - 00E0B3 - EtherWAN Systems Inc. + DCCC8D + Integrated Device Technology (Malaysia) Sdn. Bhd. - 00E0ED - Silicom Ltd + B8F653 + Shenzhen Jingxun Software Telecommunication Technology Co.,Ltd - 00E0B8 - Gateway 2000 + 446747 + HUAWEI TECHNOLOGIES CO.,LTD - 00E07C - Mettler-Toledo Inc. + 884A70 + Wacom Co.,Ltd. - 00E026 - Redlake MASD LLC + A463A1 + Inventus Power Eletronica do Brasil LTDA - 00E020 - Tecnomen Oy + 3C9D56 + HUAWEI TECHNOLOGIES CO.,LTD - 00E00D - Radiant Systems + 70FD45 + HUAWEI TECHNOLOGIES CO.,LTD - 00E0DC - Nexware Corp. + 44D5F2 + IEEE Registration Authority - 00E037 - Century Corporation + 0CDD24 + Intel Corporate - 00E0C2 - NECSY S.p.A. + F05C77 + Google, Inc. - 00E0FB - Leightronix Inc. + 001D29 + Doro AB - 00E09B - Engage Networks Inc. + ECA5DE + ONYX WIFI Inc - 00E045 - Touchwave Inc. + 8C4962 + Roku, Inc - 00E040 - DeskStation Technology Inc. + D44BB6 + Zhejiang Tmall Technology Co., Ltd. - 00E01A - Comtec Systems Ltd + 38184C + Sony Home Entertainment&Sound Products Inc - 00E078 - Berkeley Networks + 347563 + SHENZHEN RF-LINK TECHNOLOGY CO.,LTD. - 00E087 - LeCroy - Networking Productions Division + 142E5E + Sercomm Corporation. - 00E041 - Cspi + 0025CB + Reiner SCT - 00E0E2 - Innova Corp. + 44237C + Beijing Xiaomi Mobile Software Co., Ltd - 00E081 - Tyan Computer Corp. + 309435 + vivo Mobile Communication Co., Ltd. - 00E057 - HAN Microtelecom Ltd + 50EB71 + Intel Corporate - 00E0BC - Symon Communications Inc. + C4AC59 + Murata Manufacturing Co., Ltd. - 00E082 - Anerma + 5816D7 + ALPSALPINE CO,.LTD - 00E077 - Webgear Inc. + FCA47A + IEEE Registration Authority - 00E056 - Holontech Corporation + 6CD71F + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 00E031 - Hagiwara Electric Ltd + F06865 + Taicang T&W Electronics - 00E00B - Rooftop Communications Corp. + F4B5BB + CERAGON NETWORKS - 00E0B2 - Telmax Communications Corp. + 507AC5 + Apple, Inc. - 00E02F - Mcns Holdings, L.P. + 4C6BE8 + Apple, Inc. - 00E07E - Walt Disney Imagineering + 8C861E + Apple, Inc. - 00E099 - Samson AG + 542B8D + Apple, Inc. - 0060AE - Trio Information Systems AB + 000A17 + NESTAR COMMUNICATIONS, INC - 006053 - Toyoda Machine Works Ltd + 381A52 + Seiko Epson Corporation - 006056 - Network Tools Inc. + C064E4 + Cisco Systems, Inc - 00600C - Eurotech Inc. + D82FE6 + Zhejiang Tmall Technology Co., Ltd. - 00601C - Telxon Corporation + E4FDA1 + HUAWEI TECHNOLOGIES CO.,LTD - 00605F - Nippon Unisoft Corporation + E419C1 + HUAWEI TECHNOLOGIES CO.,LTD - 006091 - First Pacific Networks Inc. + B452A9 + Texas Instruments - 00601D - Lucent Technologies + 140F42 + Nokia - 00607B - Fore Systems Inc. + 006D61 + Guangzhou V-SOLUTION Electronic Technology Co., Ltd. - 00E06C - Ultra Electronics Command & Control Systems + 5C879C + Intel Corporate - 00E04A - ZX Technologies Inc. + 24EE9A + Intel Corporate - 0060C9 - ControlNet Inc. + D8AF81 + AO - 00E07A - Mikrodidakt AB + D0C65B + HUAWEI TECHNOLOGIES CO.,LTD - 006032 - I-Cube Inc. + 9078B2 + Xiaomi Communications Co Ltd - 006033 - Acuity Imaging Inc. + 7434AE + this is engineering Inc. - 006013 - Netstal Maschinen AG + 78CC2B + SINEWY TECHNOLOGY CO., LTD - 006022 - Vicom Systems Inc. + D0C857 + IEEE Registration Authority - 0060EE - Apollo + 94D00D + HUAWEI TECHNOLOGIES CO.,LTD - 0060D8 - Elmic Systems Inc. + C48A5A + JFCONTROL - 0060EF - Flytech Technology Ltd + B49A95 + Shenzhen Boomtech Industrial Corporation - 006085 - Storage Concepts + 000970 + Vibration Research Corporation - 006011 - Crystal Semiconductor Corp. + 14A2A0 + Cisco Systems, Inc - 0060F5 - Icon West Inc. + 54EF44 + Lumi United Technology Co., Ltd - 006062 - Telesync Inc. + E4AB89 + MitraStar Technology Corp. - 0060E9 - Atop Technologies Inc. + 1C20DB + HUAWEI TECHNOLOGIES CO.,LTD - 006043 - iDirect Inc. + 8CFD18 + HUAWEI TECHNOLOGIES CO.,LTD - 006028 - Macrovision Corporation + FCBCD1 + HUAWEI TECHNOLOGIES CO.,LTD - 0060F0 - Johnson & Johnson Medical Inc. + 7460FA + HUAWEI TECHNOLOGIES CO.,LTD - 0060E0 - Axiom Technology Ltd + C40683 + HUAWEI TECHNOLOGIES CO.,LTD - 006096 - T.S. Microtech Inc. + 001F47 + MCS Logic Inc. - 00603A - Quick Controls Ltd + B45459 + China Mobile (Hangzhou) Information Technology Co., Ltd. - 000288 - Global Village Communication + FC492D + Amazon Technologies Inc. - 006034 - ROBERT BOSCH GmbH + 74EE2A + SHENZHEN BILIAN ELECTRONIC CO.,LTD - 006050 - Internix Inc. + 080039 + SPIDER SYSTEMS LIMITED - 0060FA - Educational Technology Resources Inc. + 889E33 + TCT mobile ltd - 0060DA - Red Lion Controls, LP + 6C8AEC + Nantong Coship Electronics Co., Ltd. - 0060E4 - Compuserve Inc. + 84C2E4 + Jiangsu Qinheng Co., Ltd. - 00608F - Tekram Technology Ltd + 8CE5C0 + Samsung Electronics Co.,Ltd - 0060C4 - Soliton Systems K.K. + F08A76 + Samsung Electronics Co.,Ltd - 00A03C - EG&G Nuclear Instruments + ECAA25 + Samsung Electronics Co.,Ltd - 00A0C4 - Cristie Electronics Ltd + 687D6B + Samsung Electronics Co.,Ltd - 00A063 - JRL Systems Inc. + 485169 + Samsung Electronics Co.,Ltd - 00A02C - interWAVE Communications + B4CFE0 + Sichuan tianyi kanghe communications co., LTD - 00A0F7 - V.I Computer Corp. + BC7FA4 + Xiaomi Communications Co Ltd - 00A090 - TimeStep Corporation + AC83E9 + Beijing Zile Technology Co., Ltd - 00A0EA - Ethercom Corp. + D8CA06 + Titan DataCenters France - 00A0DC - O.N. Electronic Ltd + 6095CE + IEEE Registration Authority - 00A00B - Computex Ltd + 6CF17E + Zhejiang Uniview Technologies Co.,Ltd. - 00A0E2 - Keisokugiken Corporation + 7C21D8 + Shenzhen Think Will Communication Technology co., LTD. - 00A033 - imc MeBsysteme GmbH + FCEA50 + Integrated Device Technology (Malaysia) Sdn. Bhd. - 00A0A9 - Navtel Communications Inc. + 00E06B + W&G SPECIAL PRODUCTS - 00A071 - Video Lottery Technologies,Inc + D4F057 + Nintendo Co.,Ltd - 006000 - Xycom Inc. + 488764 + vivo Mobile Communication Co., Ltd. - 006045 - Pathlight Technologies + 5C1CB9 + vivo Mobile Communication Co., Ltd. - 00A05D - CS CoMPUTER SysTEME GmbH + C0FD84 + zte corporation - 00A061 - Puritan Bennett + 444B7E + Fiberhome Telecommunication Technologies Co.,LTD - 0060A6 - Particle Measuring Systems + E8D0FC + Liteon Technology Corporation - 00602A - Symicron Computer Communications Ltd + E8E8B7 + Murata Manufacturing Co., Ltd. - 00A06D - Mannesmann Tally Corporation + 083A2F + Guangzhou Juan Intelligent Tech Joint Stock Co.,Ltd - 00A0F6 - AutoGas Systems Inc. + 1C3A60 + Ruckus Wireless - 0060BE - Webtronics + 6009C3 + u-blox AG - 0060BF - Macraigor Systems Inc. + DC8C37 + Cisco Systems, Inc - 006080 - Microtronix Datacom Ltd + 64CC22 + Arcadyan Corporation - 00A037 - Mindray DS USA Inc. + 4C9157 + Fujian LANDI Commercial Equipment Co.,Ltd - 00A04C - Innovative Systems & Technologies Inc. + 9C25BE + Wildlife Acoustics, Inc. - 00A031 - Hazeltine Corporation, MS 1-17 + D039EA + NetApp - 00A041 - Inficon + F8DFE1 + MyLight Systems - 00A0A7 - Vorax Corporation + 788C77 + LEXMARK INTERNATIONAL, INC. - 00A07E - Avid Technology Inc. + 3C0C7D + Tiny Mesh AS - 00A06F - Color Sentinel Systems LLC + 60D2DD + Shenzhen Baitong Putian Technology Co.,Ltd. - 00A0C7 - Tadiran Telecommunications + 5C32C5 + Teracom Ltd. - 00A01A - Binar Elektronik AB + 24DA33 + HUAWEI TECHNOLOGIES CO.,LTD - 00A088 - Essential Communications + FCAB90 + HUAWEI TECHNOLOGIES CO.,LTD - 00A0C2 - R.A. Systems Ltd + A4975C + VTech Telecommunications Ltd. - 00A098 - NetApp + 1C2704 + zte corporation - 00A04B - TFL LAN Inc. + 5078B3 + zte corporation - 00A064 - KVB/Analect + F0D4F7 + varram system - 00A03E - ATM Forum + E0CC7A + HUAWEI TECHNOLOGIES CO.,LTD - 00A01F - Tricord Systems Inc. + B02A1F + Wingtech Group (HongKong)Limited - 00A06C - Shindengen Electric MFG Ltd + 5893D8 + Texas Instruments - 00A0DB - Fisher & Paykel Production + 5051A9 + Texas Instruments - 00A081 - Alcatel Data Networks + F47960 + HUAWEI TECHNOLOGIES CO.,LTD - 00A0B1 - First Virtual Corporation + 145290 + KNS Group LLC (YADRO Company) - 002010 - Jeol System Technology Ltd + 6C23CB + Wattty Corporation - 00209F - Mercury Computer Systems Inc. + 60AB67 + Xiaomi Communications Co Ltd - 00A073 - CoM21 Inc. + A8DB03 + SAMSUNG ELECTRO-MECHANICS(THAILAND) - 00A03A - Kubotek Corporation + 308944 + DEVA Broadcast Ltd. - 00A0B2 - Shima Seiki + 00B600 + VOIM Co., Ltd. - 00A08B - Aston Electronic Designs Ltd + 002615 + Teracom Limited - 00A097 - JC Information Systems + 9C8EDC + Teracom Limited - 00A027 - Firepower Systems Inc. + 000191 + SYRED Data Systems - 00A046 - Scitex Corp Ltd + 4889E7 + Intel Corporate - 00A0D4 - Radiolan, Inc. + A0BD1D + Zhejiang Dahua Technology Co., Ltd. - 00A092 - H. Bollmann Manufacturers Ltd + 4846C1 + FN-LINK TECHNOLOGY LIMITED - 00200D - Carl Zeiss + ACE2D3 + Hewlett Packard - 00202D - Taiyo Corporation + 00FD22 + Cisco Systems, Inc - 002091 - J125, National Security Agency + ACEE70 + Fontem Ventures BV - 0020BD - Niobrara R & D Corporation + 4418FD + Apple, Inc. - 002054 - Sycamore Networks + 005B94 + Apple, Inc. - 0020A7 - Pairgain Technologies Inc. + E0897E + Apple, Inc. - 002055 - Altech Ltd + 2CCCE6 + Skyworth Digital Technology(Shenzhen) Co.,Ltd - 00200A - Source-Comm Corp. + CC2C83 + DarkMatter L.L.C - 0020CF - Test & Measurement Systems Inc + DCED84 + Haverford Systems Inc - 0020B4 - Terma Elektronik AS + 644C36 + Intel Corporate - 0020E4 - Hsing Tech Enterprise Ltd + ACD564 + CHONGQING FUGUI ELECTRONICS CO.,LTD. - 00206C - Evergreen Technology Corp. + 94D075 + CIS Crypto - 00205E - Castle Rock Inc. + 28B4FB + Sprocomm Technologies CO.,LTD. - 002012 - Camtronics Medical Systems + C05336 + Beijing National Railway Research & Design Institute of Signal & Communication Group Co..Ltd. - 002075 - Motorola Communication Israel + 606ED0 + SEAL AG - 0020A5 - API Engineering + 40F9D5 + Tecore Networks - 002064 - Protec Microsystems Inc. + E44CC7 + IEEE Registration Authority - 002033 - Synapse Technologies Inc. + D4E880 + Cisco Systems, Inc - 0020CB - Pretec Electronics Corp. + 3C20F6 + Samsung Electronics Co.,Ltd - 0020EB - Cincinnati Microwave Inc. + 7C38AD + Samsung Electronics Co.,Ltd - 0020A0 - OA Laboratory Ltd + 2C01B5 + Cisco Systems, Inc - 0020E2 - Information Resource Engineering + A8346A + Samsung Electronics Co.,Ltd - 002007 - SFA Inc. + FC29F3 + McPay Co.,LTD. - 00205C - InterNet Systems Of Florida Inc. + F8AFDB + Fiberhome Telecommunication Technologies Co.,LTD - 0020A2 - Galcom Networking Ltd + 688B0F + China Mobile IOT Company Limited - 002031 - Tattile SRL + 3CF011 + Intel Corporate - 0020D0 - Versalynx Corporation + D49CDD + AMPAK Technology,Inc. - 0020B9 - Metricom Inc. + 50F722 + Cisco Systems, Inc - 002039 - Scinets + 9809CF + OnePlus Technology (Shenzhen) Co., Ltd - 002072 - Worklink Innovations + B8DE5E + LONGCHEER TELECOMMUNICATION LIMITED - 0020EC - Techware Systems Corp. + 9849E1 + Boeing Defence Australia - 00206E - Xact Inc. + 04D7A5 + New H3C Technologies Co., Ltd - 0020F1 - Altos India Limited + 885A06 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 002041 - Data NET + 5447D3 + TSAT AS - 002076 - Reudo Corporation + 4C4D66 + Nanjing Jiahao Technology Co., Ltd. - 0020E8 - Datatrek Corporation + A4817A + CIG SHANGHAI CO LTD - 0020C5 - Eagle Technology + CCEDDC + MitraStar Technology Corp. - 002009 - Packard Bell Elec. Inc. + 20B780 + Toshiba Visual Solutions Corporation Co.,Ltd - 002027 - Ming Fortune Industry Ltd + A4E7E4 + Connex GmbH - 00208A - Sonix Communications Ltd + F0B31E + Universal Electronics, Inc. - 0020D2 - RAD Data Communications Ltd + ECA9FA + GUANGDONG GENIUS TECHNOLOGY CO., LTD. - 002002 - Seritech Enterprise Ltd + 0003A5 + Medea Corporation - 00204B - Autocomputer Ltd + BCE67C + Cambium Networks Limited - 0020EA - Efficient Networks Inc. + 7C1E06 + New H3C Technologies Co., Ltd - 00206A - Osaka Computer Corp. + 18DFB4 + BOSUNG POWERTEC CO.,LTD. - 0020DB - Xnet Technology Inc. + F89173 + AEDLE SAS - 0020BB - ZAX Corporation + B8EF8B + SHENZHEN CANNICE TECHNOLOGY CO.,LTD - 0020A8 - Sast Technology Corp. + B8186F + ORIENTAL MOTOR CO., LTD. - 002045 - ION Networks Inc. + 001A3F + Intelbras - 002049 - Comtron Inc. + 544741 + XCHENG HOLDING - 002050 - Korea Computer Inc. + CCF735 + Amazon Technologies Inc. - 002084 - OCE Printing Systems, GmbH + C4F839 + Actia Automotive - 00208C - Galaxy Networks Inc. + C84F86 + Sophos Ltd - 00202C - Welltronix Ltd + 6429ED + AO PKK Milandr - 002021 - Algorithms Software PVT Ltd + F82F6A + ITEL MOBILE LIMITED - 00C0F9 - Artesyn Embedded Technologies + C0D834 + xvtec ltd - 00C075 - Xante Corporation + 443C88 + FICOSA MAROC INTERNATIONAL - 001C7C - Perq Systems Corporation + 841C70 + zte corporation - 00C039 - Teridian Semiconductor Corporation + 78DD12 + Arcadyan Corporation - 00C0A9 - Barron Mccann Ltd + D425CC + IEEE Registration Authority - 00C04B - Creative Microsystems + 8C6DC4 + Megapixel VR - 00C0B9 - Funk Software Inc. + C8F742 + HangZhou Gubei Electronics Technology Co.,Ltd - 00C015 - NEW Media Corporation + 006FF2 + MITSUMI ELECTRIC CO.,LTD. - 00C083 - Trace Mountain Products Inc. + 30DF8D + SHENZHEN GONGJIN ELECTRONICS CO.,LT - 00C094 - VMX Inc. + D4C93C + Cisco Systems, Inc - 00C019 - Leap Technology Inc. + 2C5D34 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 00C0CF - Imatran Voima Oy + 9C1463 + Zhejiang Dahua Technology Co., Ltd. - 00C07D - Risc Developments Ltd + E0750A + ALPSALPINE CO,.LTD - 00C043 - Stratacom + 0019C1 + ALPSALPINE CO,.LTD - 00C0B5 - Corporate Network Systems,Inc. + 0016FE + ALPSALPINE CO,.LTD - 00C0ED - US Army Electronic + 9C8D7C + ALPSALPINE CO,.LTD - 00C032 - I-Cubed Limited + 002433 + ALPSALPINE CO,.LTD - 00C0A5 - Dickens Data Systems + 002306 + ALPSALPINE CO,.LTD - 00C0EF - Abit Corporation + B4EC02 + ALPSALPINE CO,.LTD - 00C061 - Solectek Corporation + CCD39D + IEEE Registration Authority - 00C0AD - Marben Communication Systems + BC7536 + ALPSALPINE CO,.LTD - 00C07F - Nupon Computing Corp. + E0AE5E + ALPSALPINE CO,.LTD - 00C057 - Myco Electronics + D4B761 + Sichuan AI-Link Technology Co., Ltd. - 00C056 - Somelec + 7C035E + Xiaomi Communications Co Ltd - 00C027 - Cipher Systems Inc. + 44FE3B + Arcadyan Corporation - 00C05C - Elonex PLC + D83AF5 + Wideband Labs LLC - 00C028 - Jasco Corporation + 38D9A5 + Mikotek Information Inc. - 00C08D - Tronix Product Development + 646038 + Hirschmann Automation and Control GmbH - 00C02A - Ohkura Electric Ltd + 649D99 + FS COM INC - 00C0FC - Elastic Reality Inc. + 00169D + Cisco Systems, Inc - 00C0BB - Forval Creative Inc. + 4C875D + Bose Corporation - 00C0E0 - DSC Communication Corp. + B0E7DE + Homa Technologies JSC - 00C05B - Networks Northwest Inc. + 00D279 + VINGROUP JOINT STOCK COMPANY - 00C008 - Seco SRL + 00004C + NEC Corporation - 00C0B7 - American Power Conversion Corp + 8CCF8F + ITC Systems - 00C0D3 - Olympus Image Systems Inc. + 4C962D + Fresh AB - 00C0E8 - Plexcom Inc. + 484A30 + George Robotics Limited - 00C0DA - Nice Systems Ltd + 4861A3 + Concern Axion JSC - 00C0D1 - Comtree Technology Corporation + 4CE5AE + Tianjin Beebox Intelligent Technology Co.,Ltd. - 00C038 - Raster Image Processing System + F4C7C8 + Kelvin Inc. - 00409B - HAL Computer Systems Inc. + 304A26 + Shenzhen Trolink Technology CO, LTD - 0040EB - Martin Marietta Corporation + D467D3 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 0040BD - Starlight Networks Inc. + A41232 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 0040ED - Network Controls INT'Natl Inc. + 48E3C3 + JENOPTIK Advanced Systems GmbH - 004021 - Raster Graphics + CC355A + SecuGen Corporation - 0040C1 - Bizerba-Werke Wilheim Kraut + 80546A + SHENZHEN GONGJIN ELECTRONICS CO.,LT - 0040E1 - Marner International Inc. + B447F5 + Earda Technologies co Ltd - 0040FE - Symplex Communications + 1CF29A + Google, Inc. - 0040E5 - Sybus Corporation + A89CA4 + Furrion Limited - 0040A5 - Clinicomp Intl. + 2875D8 + FUJIAN STAR-NET COMMUNICATION CO.,LTD - 004005 - ANI Communications Inc. + 90E202 + Texas Instruments - 0040D9 - American Megatrends Inc. + 184BDF + Caavo Inc - 00404C - Hypertec Pty Ltd + FC7774 + Intel Corporate - 00C030 - Integrated Engineering B. V. + 700B4F + Cisco Systems, Inc - 00C0A6 - Exicom Australia Pty Ltd + E4388C + Digital Products Limited - 00C0CB - Control Technology Corporation + 4455B1 + HUAWEI TECHNOLOGIES CO.,LTD - 00C0EB - SEH Computertechnik GmbH + 98F9C7 + IEEE Registration Authority - 0040DB - Advanced Technical Solutions + A40C66 + Shenzhen Colorful Yugong Technology and Development Co., Ltd. - 00C092 - Mennen Medical Inc. + 84A93E + Hewlett Packard - 00C052 - Burr-Brown + 349342 + TTE Corporation - 00400E - Memotec Inc. + B0C387 + GOEFER, Inc. - 00C03D - Wiesemann & Theis GmbH + 086BD7 + Silicon Laboratories - 0040C8 - Milan Technology Corporation + 6458AD + China Mobile IOT Company Limited - 0040BA - Alliant Computer Systems Corp. + A0A3B8 + WISCLOUD - 004038 - Talent Electric Incorporated + 38F9D3 + Apple, Inc. - 0040D8 - Ocean Office Automation Ltd + FC183C + Apple, Inc. - 004088 - Mobius Technologies Inc. + 64C753 + Apple, Inc. - 004032 - Digital Communications + 201F31 + Inteno Broadband Technology AB - 0040C2 - Applied Computing Devices + 6C2CDC + Skyworth Digital Technology(Shenzhen) Co.,Ltd - 0040D4 - Gage Talker Corp. + 7835A0 + Zurn Industries LLC - 0040CE - NET-Source Inc. + 8C7BF0 + Xufeng Development Limited - 004062 - E-Systems Inc./Garland Div. + E0A509 + Bitmain Technologies Inc - 004034 - Bustek Corporation + 3C5CC4 + Amazon Technologies Inc. - 00401C - AST Research Inc. + 54833A + Zyxel Communications Corporation - 00400F - Datacom Technologies + F43909 + Hewlett Packard - 004006 - Sampo Technology Corporation + B89A9A + Xin Shi Jia Technology (Beijing) Co.,Ltd - 0080AA - Maxpeed + 2CCC44 + Sony Interactive Entertainment Inc. - 00C050 - Toyo Denki Seizo K.K. + F47DEF + Samsung Electronics Co.,Ltd - 0040C6 - Fibernet Research Inc. + 7C8BB5 + Samsung Electronics Co.,Ltd - 004047 - Wind River Systems + D8A98B + Texas Instruments - 004050 - Ironics Inc.orporated + D8D6F3 + Integrated Device Technology (Malaysia) Sdn. Bhd. - 008092 - Silex Technology Inc. + 787052 + Welotec GmbH - 008093 - Xyron Corporation + 14EFCF + SCHREDER - 00805A - Tulip Computers Internat'L B.V + 3830F9 + LG Electronics (Mobile Communications) - 004041 - Fujikura Ltd + 00F48D + Liteon Technology Corporation - 00804E - Apex Computer Company + 702ED9 + Guangzhou Shiyuan Electronics Co., Ltd. - 008055 - Fermilab + 70192F + HUAWEI TECHNOLOGIES CO.,LTD - 00802A - Test Systems & Simulations Inc + A83FA1 + IEEE Registration Authority - 008035 - Technology Works Inc. + F4DBE6 + Cisco Systems, Inc - 00807E - Southern Pacific Ltd + 10B9F7 + Niko-Servodan - 0080EF - Rational + 18A7F1 + Qingdao Haier Technology Co.,Ltd - 0080F0 - Panasonic Communications Ltd + 90E17B + Apple, Inc. - 00801D - Integrated Inference Machines + D81C79 + Apple, Inc. - 008075 - Parsytec GmbH + 58E6BA + Apple, Inc. - 008051 - Fibermux + 248498 + Beijing Jiaoda Microunion Tech.Co.,Ltd. - 0080C6 - National Datacomm Corporation + 6C9BC0 + Chemoptics Inc. - 0080C0 - Penril Datacomm + 04EB40 + Cisco Systems, Inc - 00802E - Castle Rock Computing + 1801F1 + Xiaomi Communications Co Ltd - 0080F2 - Raycom Systems Inc + C074AD + Grandstream Networks, Inc. - 0080BD - THE Furukawa Electric Ltd + F095F1 + Carl Zeiss AG - 008025 - Telit Wireless Solutions GmbH + C0847D + AMPAK Technology, Inc. - 0080EA - ADVA Optical Networking Ltd + DC41E5 + Shenzhen Zhixin Data Service Co., Ltd. - 00001E - Telsist Industria Electronica + 10C22F + China Entropy Co., Ltd. - 000050 - Radisys Corporation + BC3865 + JWCNETWORKS - 008004 - Antlow Communications Ltd + 0409A5 + HFR, Inc. - 0080D0 - Computer Peripherals Inc. + 94917F + ASKEY COMPUTER CORP - 008024 - Kalpana Inc. + 9C0CDF + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 008040 - John Fluke Manufacturing Co. + 7CD30A + INVENTEC CORPORATION - 008021 - Alcatel Canada Inc. + 001E33 + INVENTEC CORPORATION - 0080E8 - Cumulus Corporatiion + FC1D84 + Autobase - 008069 - Computone Systems + 00A5BF + Cisco Systems, Inc - 00800D - Vosswinkel F.U. + C8BAE9 + QDIS - 0080D1 - Kimtron Corporation + C44F33 + Espressif Inc. - 008042 - Artesyn Embedded Technologies + 546AD8 + Elster Water Metering - 00809A - Novus Networks Ltd + 002654 + 3COM - 008000 - Multitech Systems Inc. + 0050DA + 3COM - 0080ED - IQ Technologies Inc. + 000476 + 3COM - 00804A - PRO-LOG + 000475 + 3COM - 000066 - Talaris Systems Inc. + 00D096 + 3COM EUROPE LTD - 000049 - Apricot Computers Ltd + 3009F9 + IEEE Registration Authority - 0000FA - Microsage Computer Systems Inc + 48F027 + Chengdu newifi Co.,Ltd - 0000D4 - Pure Data Ltd + B42E99 + GIGA-BYTE TECHNOLOGY CO.,LTD. - 000019 - Applied Dynamics International + 342CC4 + Compal Broadband Networks, Inc. - 000015 - Datapoint Corporation + DC16B2 + HUAWEI TECHNOLOGIES CO.,LTD - 00001C - Bell Technologies + 24FB65 + HUAWEI TECHNOLOGIES CO.,LTD - 000034 - Network Resources Corporation + 0CB527 + HUAWEI TECHNOLOGIES CO.,LTD - 000022 - Visual Technology Inc. + 7C03AB + Xiaomi Communications Co Ltd - 0000B5 - Datability Software Sys Inc. + C8544B + Zyxel Communications Corporation - 00002F - Timeplex Inc. + 14C697 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 0000B8 - Seikosha Ltd + 242124 + Nokia - 0000E6 - Aptor Produits de Comm Indust + 18AC9E + ITEL MOBILE LIMITED - 000084 - Supernet + EC84B4 + CIG SHANGHAI CO LTD - 00009A - RC Computer A/S + 4422F1 + S.FAC, INC - 000027 - Japan Radio Company + 78524A + Optonic GmbH - 0000E8 - Accton Technology Corp. + C46E7B + SHENZHEN RF-LINK TECHNOLOGY CO.,LTD. - 00004B - ICL Data Oy + C048FB + Shenzhen JingHanDa Electronics Co.Ltd - 0000E0 - Quadram Corp. + 20E882 + zte corporation - 0000AB - Logic Modeling Corporation + 4C1159 + Vision Information & Communications - 0080AC - Imlogix, Division Of Genesys + 00B5D0 + Samsung Electronics Co.,Ltd - 00004F - Logicraft Inc. + 1496E5 + Samsung Electronics Co.,Ltd - 00006F - Madge Ltd + D07FA0 + Samsung Electronics Co.,Ltd - 000078 - Labtam Limited + 009093 + EIZO Corporation - 00005A - SysKonnect GmbH + F09FFC + SHARP Corporation - 00005B - Eltec Elektronik AG + 0CB5DE + Alcatel Lucent - 000071 - Adra Systems Inc. + 50DCFC + ECOCOM - 000073 - Siecor Corporation + 000B3B + devolo AG - 0000B9 - Mcdonnell Douglas Computer Sys + 240588 + Google, Inc. - 0000BF - Symmetric Computer Systems + 00049F + Freescale Semiconductor - 00002D - Chromatics Inc + 00D07B + COMCAM INTERNATIONAL INC - 000018 - Webster Computer Corporation + 14E9B2 + Fiberhome Telecommunication Technologies Co.,LTD - 0000C8 - Altos Computer Systems + 5C2623 + WaveLynx Technologies Corporation - 0000D5 - Micrognosis International + 303855 + Nokia Corporation - 00003A - Chyron Corporation + 00B670 + Cisco Systems, Inc - 000059 - Hellige GmbH + AC6417 + Siemens AG - 000069 - Concord Communications Inc + EC6F0B + FADU, Inc. - 0000E7 - Star Gate Technologies + 3466EA + VERTU INTERNATIONAL CORPORATION LIMITED - 00004D - DCI Corporation + 28385C + FLEXTRONICS - 000023 - ABB Industrial Systems AB + 00BB60 + Intel Corporate - 0000BE - THE NTI Group + 7C6DA6 + Superwave Group LLC - 0000D9 - Nippon Telegraph & Telephone + B870F4 + COMPAL INFORMATION (KUNSHAN) CO., LTD. - 000080 - Cray Communications A/S + 1C3947 + COMPAL INFORMATION (KUNSHAN) CO., LTD. - 08002A - Mosaic Technologies Inc. + 342792 + FREEBOX SAS - 080089 - Kinetics + 883F99 + Siemens AG - 080086 - Konica Minolta Holdings Inc. + 705AB6 + COMPAL INFORMATION (KUNSHAN) CO., LTD. - 080083 - Seiko Instruments Inc. + 201A06 + COMPAL INFORMATION (KUNSHAN) CO., LTD. - 080061 - Jarogate Ltd + F8A963 + COMPAL INFORMATION (KUNSHAN) CO., LTD. - 08005F - Saber Technology Corp. + DC0EA1 + COMPAL INFORMATION (KUNSHAN) CO., LTD. - 080058 - Systems Concepts + 0006EC + Harris Corporation - 080049 - Univation + 0C1C57 + Texas Instruments - 080024 - 10NET Communications/DCA + 806FB0 + Texas Instruments - 080022 - NBI Inc. + 347916 + HUAWEI TECHNOLOGIES CO.,LTD - 080020 - Oracle Corporation + D016B4 + HUAWEI TECHNOLOGIES CO.,LTD - 08001F - Sharp Corporation + F0F08F + Nextek Solutions Pte Ltd - 080014 - Excelan + 8CB0E9 + Samsung Electronics.,LTD - AA0000 - Digital Equipment Corporation + A46191 + NamJunSa - AA0001 - Digital Equipment Corporation + 40A108 + Motorola (Wuhan) Mobility Technologies Communication Co., Ltd. - AA0002 - Digital Equipment Corporation + 745933 + Danal Entertainment - 000007 - Xerox Corporation + EC58EA + Ruckus Wireless - 00801F - Krupp Atlas Electronik GmbH + 84A24D + Birds Eye Systems Private Limited - 080006 - Siemens AG + 7C6B9C + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 04E0C4 - Triumph-Adler AG + 009D6B + Murata Manufacturing Co., Ltd. - 020701 - Racal-Datacom + D45251 + IBT Ingenieurbureau Broennimann Thun - 080013 - Exxon + 0018B5 + Magna Carta - 00DD08 - Ungermann-Bass Inc. + D87EB1 + x.o.ware, inc. - 000005 - Xerox Corporation + 20A8B9 + SIEMENS AG - 021C7C - Perq Systems Corporation + D0EFC1 + HUAWEI TECHNOLOGIES CO.,LTD - 080065 - Genrad Inc. + 485702 + HUAWEI TECHNOLOGIES CO.,LTD - 84A9EA - Career Technologies USA + 0017B6 + Aquantia Corporation - 000009 - Xerox Corporation + 105917 + Tonal - 0080E9 - Madge Ltd + 388B59 + Google, Inc. - 0040D6 - Locamation B.V. + 880118 + BLT Co - 08004B - Planning Research Corp. + A42618 + Integrated Device Technology (Malaysia) Sdn. Bhd. - 02AA3C - Olivetti Telecomm SPA (Olteco) + 34E12D + Intel Corporate - 080059 - A/S Mycron + DCAF68 + WEIFANG GOERTEK ELECTRONICS CO.,LTD - 080008 - Bolt Beranek AND Newman Inc. + 882D53 + Baidu Online Network Technology (Beijing) Co., Ltd. - F47488 - New H3C Technologies Ltd + 644F42 + JETTER CO., Ltd. - FCC233 - ASUSTek Computer Inc. + 2C97B1 + HUAWEI TECHNOLOGIES CO.,LTD - 401175 - IEEE Registration Authority + 24EC51 + ADF Technologies Sdn Bhd - 8031F0 - Samsung Electronics Ltd + 2C5BE1 + Centripetal Networks, Inc - 583526 - Deeplet Technology Corp + DCEFCA + Murata Manufacturing Co., Ltd. - 34B5A3 - CIG Shanghai Ltd + 00BC60 + Cisco Systems, Inc - 6C1DEB - u-blox AG + 00D0B5 + IPricot formerly DotCom - 2852F9 - Zhongxin Intelligent Times (Shenzhen) Ltd + CC7B61 + NIKKISO CO., LTD. - B8F853 - Arcadyan Corporation + 9C713A + HUAWEI TECHNOLOGIES CO.,LTD - E0D083 - Samsung Electronics Ltd + 8050F6 + ITEL MOBILE LIMITED - 743C18 - Taicang T&W Electronics + A8CAB9 + SAMSUNG ELECTRO MECHANICS CO., LTD. - 4C80BA - Wuhan Tianyu Information Industry Ltd + 5061BF + Cisco Systems, Inc - 8C02FA - CoMMANDO Networks Limited + 0009DF + Vestel Elektronik San ve Tic. A.S. - F0264C - Sigrist-Photometer AG + 000FA2 + 2xWireless - D80B9A - Samsung Electronics Ltd + 746BAB + GUANGDONG ENOK COMMUNICATION CO., LTD - AC8D34 - Huawei Technologies Ltd + 0CB6D2 + D-Link International - 645299 - The Chamberlain Group Inc. + 7829ED + ASKEY COMPUTER CORP - F875A4 - LCFC(HeFei) Electronics Technology Ltd + 000BB2 + SMALLBIG TECHNOLOGY - 00D2B1 - TPV Display Technology (Xiamen) Ltd + F4032F + Reduxio Systems - C0E434 - Azurewave Technologies Inc. + 944A0C + Sercomm Corporation. - 6C710D - Cisco Systems Inc. + 700F6A + Cisco Systems, Inc - 246F8C - Huawei Device Ltd + 108EE0 + Samsung Electronics Co.,Ltd - 1C1386 - Huawei Device Ltd + FCA621 + Samsung Electronics Co.,Ltd - BC2EF6 - Huawei Device Ltd + 8CF228 + MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. - 4455C4 - Huawei Device Ltd + 80029C + Gemtek Technology Co., Ltd. - 000829 - Tokyo Electron Device Nagasaki Limited + E8D099 + Fiberhome Telecommunication Technologies Co.,LTD - 1C4455 - Sieb & Meyer AG + 00305E + Abelko Innovation - F88A5E - Texas Instruments + FC6BF0 + TOPWELL INTERNATIONAL HOLDINDS LIMITED - 5CE7A0 - Nokia + 001477 + Trilliant - E01F88 - Xiaomi Communications Ltd + 00079B + Aurora Networks - 8CDC02 - ZTE Corporation + 54B203 + PEGATRON CORPORATION - B4BC7C - Texas Instruments + 3868DD + INVENTEC CORPORATION - E0AAB0 - Suntaili Enterprise Ltd + 3C6AA7 + Intel Corporate - 683943 - ittim + A028ED + HMD Global Oy - 10C65E - Adapt-IP + D0C5D3 + AzureWave Technology Inc. - 7CA7B0 - Shenzhen Bilian Electronic Ltd + 14169E + Wingtech Group (HongKong)Limited - 20311C - Vivo Mobile Communication Ltd + 107BA4 + Olive & Dove Co.,Ltd. - 104F58 - Aruba Networks HP + 203956 + HMD Global Oy - B4E842 - Hong Kong Bouffalo Lab Limited + 78AFE4 + Comau S.p.A - 0003CB - SystemGear Ltd + 90A137 + Beijing Splendidtel Communication Technology Co,. Ltd - F0A7B2 - Futaba Corporation + BC325F + Zhejiang Dahua Technology Co., Ltd. - 609B2D - JMACS Japan Ltd + AC5474 + China Mobile IOT Company Limited - 14A32F - Huawei Device Ltd + 8C1CDA + IEEE Registration Authority - 04D3B5 - Huawei Device Ltd + 7C41A2 + Nokia - 00BB1C - Huawei Device Ltd + F8C39E + HUAWEI TECHNOLOGIES CO.,LTD - 80AC7C - Sichuan AI-Link Technology Ltd + 505BC2 + Liteon Technology Corporation - DC4BFE - Shenzhen Belon Technology Ltd + 6C21A2 + AMPAK Technology, Inc. - 506255 - IEEE Registration Authority + 9C2F73 + Universal Tiancheng Technology (Beijing) Co., Ltd. - 58D50A - Murata Manufacturing Ltd + D832E3 + Xiaomi Communications Co Ltd - 88A303 - Samsung Electronics Ltd + 9487E0 + Xiaomi Communications Co Ltd - FCDE90 - Samsung Electronics Ltd + 38AF29 + Zhejiang Dahua Technology Co., Ltd. - 1854CF - Samsung Electronics Ltd + 300AC5 + Ruio telecommunication technologies Co., Limited - 80795D - Infinix mobility limited + 00E065 + OPTICAL ACCESS INTERNATIONAL - E884C6 - Huawei Technologies Ltd + C88629 + Shenzhen Duubee Intelligent Technologies Co.,LTD. - 642CAC - Huawei Technologies Ltd + CCC2E0 + Raisecom Technology CO., LTD - 08CC27 - Motorola Mobility LLC, a Lenovo Company + 883F4A + Texas Instruments - 04D395 - Motorola Mobility LLC, a Lenovo Company + D88A3B + UNIT-EM - E09806 - Espressif Inc. + EC5A86 + Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd - F4CFA2 - Espressif Inc. + C4BAA3 + Beijing Winicssec Technologies Co., Ltd. - F81E6F - EBG Compleo GmbH + 9CFEA1 + Fiberhome Telecommunication Technologies Co.,LTD - F0A35A - Apple + 4466FC + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 608373 - Apple + 50A009 + Xiaomi Communications Co Ltd - 84AD8D - Apple + 001DFA + Fujian LANDI Commercial Equipment Co.,Ltd - 74428B - Apple + 9814D2 + Avonic - 149138 - Amazon Technologies Inc. + 08F69C + Apple, Inc. - 6C410E - Cisco Systems Inc. + 04FA83 + Qingdao Haier Technology Co.,Ltd - 6C310E - Cisco Systems Inc. + 78F9B4 + Nokia Solutions and Networks GmbH & Co. KG - 2877F1 - Apple + 2016B9 + Intel Corporate - A8E77D - Texas Instruments + 00165C + Trackflow Ltd. - DC543D - Itel Mobile Limited + 50A67F + Apple, Inc. - 0C8447 - Fiberhome Telecommunication Technologies Ltd + 60DEF3 + HUAWEI TECHNOLOGIES CO.,LTD - 9C6B72 - Realme Chongqing MobileTelecommunications Corp Ltd + 1409DC + HUAWEI TECHNOLOGIES CO.,LTD - 50C6AD - Fiberhome Telecommunication Technologies Ltd + 38BAF8 + Intel Corporate - 748A28 - HMD Global Oy + 0007A8 + Haier Group Technologies Ltd - D42493 - GW Technologies Ltd + 14205E + Apple, Inc. - 0023E6 - Innovation Farm Inc. + B841A4 + Apple, Inc. - ECA940 - ARRIS Group Inc. + 9CE65E + Apple, Inc. - FC8596 - Axonne Inc. + C49880 + Apple, Inc. - 5CB4E2 - Inspur Software Group Ltd + E0338E + Apple, Inc. - 3C510E - Cisco Systems Inc. + C0EEB5 + Enice Network. - D8AED0 - Shanghai Engineering Science & Technology Ltd CGNPC + D461DA + Apple, Inc. - E0859A - Shenzhen RF-Link Technology Ltd + F01898 + Apple, Inc. - 0C42A1 - Mellanox Technologies Inc. + 881908 + Apple, Inc. - B47AF1 - Hewlett Packard Enterprise + 5C0947 + Apple, Inc. - 349F7B - Canon Inc. + 641CAE + Samsung Electronics Co.,Ltd - F4D9C6 - Unionman Technology Ltd + F8E44E + MCOT INC. - 34F150 - Hui Zhou Gaoshengda Technology Ltd + 40CD7A + Qingdao Hisense Communications Co.,Ltd. - CC5289 - Shenzhen Optfocus Technology Ltd + 004098 + DRESSLER GMBH & CO. - CC5D78 - JTD Consulting + 949990 + VTC Telecommunications - BCF9F2 - Teko + F4BC97 + Shenzhen Crave Communication Co., LTD - 000EA4 - Quantum Corp. + 28FEDE + COMESTA, Inc. - 005084 - Quantum Corp. + 907910 + Integrated Device Technology (Malaysia) Sdn. Bhd. - 809F9B - Sichuan AI-Link Technology Ltd + 003DE8 + LG Electronics (Mobile Communications) - A82BCD - Huawei Technologies Ltd + 68FEDA + Fiberhome Telecommunication Technologies Co.,LTD - 48DC2D - Huawei Technologies Ltd + D076E7 + TP-LINK TECHNOLOGIES CO.,LTD. - ACEB51 - Universal Electronics Inc. + 9CA615 + TP-LINK TECHNOLOGIES CO.,LTD. - 6010A2 - Crompton Instruments + E44E76 + CHAMPIONTECH ENTERPRISE (SHENZHEN) INC - C4B239 - Cisco Systems Inc. + DC4EF4 + Shenzhen MTN Electronics CO., Ltd - B0A454 - Tripwire Inc. + F08173 + Amazon Technologies Inc. - 6490C1 - Beijing Xiaomi Mobile Software Ltd + 00508B + Hewlett Packard - CC5CDE - China Mobile Group Device Ltd + 146B9C + SHENZHEN BILIAN ELECTRONIC CO.,LTD - 60CE86 - Sercomm Corporation. + 948DEF + Oetiker Schweiz AG - 4C4FEE - OnePlus Technology (Shenzhen) Ltd + 144E34 + Remote Solution - 4CE175 - Cisco Systems Inc. + 3403DE + Texas Instruments - A824B8 - Nokia + 34D712 + Smartisan Digital Co., Ltd - 000CE6 - Fortinet Inc. + A06610 + FUJITSU LIMITED - 9055DE - Fiberhome Telecommunication Technologies Ltd + 44FFBA + zte corporation - E8910F - Fiberhome Telecommunication Technologies Ltd + 2CD974 + Hui Zhou Gaoshengda Technology Co.,LTD - D005E4 - Huawei Device Ltd + D4F786 + Fiberhome Telecommunication Technologies Co.,LTD - 30AAE4 - Huawei Device Ltd + 94B86D + Intel Corporate - 14AB56 - Wuxi Funide Digital Ltd + 8817A3 + Integrated Device Technology (Malaysia) Sdn. Bhd. - E8D8D1 - HP Inc. + 88A9A7 + IEEE Registration Authority - 28CDC4 - Chongqing Fugui Electronics Ltd + 6084BD + BUFFALO.INC - 000CDF - JAI Manufacturing + 347ECA + NEXTWILL - 2C91AB - AVM Audiovisuelles Marketing und Computersysteme GmbH + EC8914 + HUAWEI TECHNOLOGIES CO.,LTD - 807B3E - Samsung Electronics Ltd + B89436 + HUAWEI TECHNOLOGIES CO.,LTD - F8F1E6 - Samsung Electronics Ltd + E0E62E + TCT mobile ltd - 88A9B7 - Apple + B42EF8 + Eline Technology co.Ltd - ECCED7 - Apple + A4D4B2 + Shenzhen MeiG Smart Technology Co.,Ltd - 48EB62 - Murata Manufacturing Ltd + 8CF773 + Nokia - 5CE176 - Cisco Systems Inc. + F4C248 + Samsung Electronics Co.,Ltd - AC9085 - Apple + F47190 + Samsung Electronics Co.,Ltd - 3448ED - Dell Inc. + 2802D8 + Samsung Electronics Co.,Ltd - 3C5731 - Cisco Systems Inc. + DCE533 + IEEE Registration Authority - 6C55E8 - Technicolor CH USA Inc. + D8445C + DEV Tecnologia Ind Com Man Eq LTDA - 342FBD - Nintendo Ltd + 7C3953 + zte corporation - A02D13 - AirTies Wireless Networks + 38E1AA + zte corporation - 8468C8 - Totolink Technology Int'l Limited + 48C796 + Samsung Electronics Co.,Ltd - 9C28F7 - Xiaomi Communications Ltd + 501479 + iRobot Corporation - 10521C - Espressif Inc. + E42D7B + China Mobile IOT Company Limited - 6C42AB - Subscriber Networks Inc. + 387862 + Sony Corporation - 64F6F7 - Anhui Dynamic Power Ltd + 4CEFC0 + Amazon Technologies Inc. - 941C56 - Actiontec Electronics Inc. + C464E3 + Texas Instruments - D80BCB - Telink Semiconductor (Shanghai) Ltd + CC3B58 + Curiouser Products Inc - F0F0A4 - Amazon Technologies Inc. + DCDD24 + Energica Motor Company SpA - C0D682 - Arista Networks + 641CB0 + Samsung Electronics Co.,Ltd - CC2D1B - SFR + 903A72 + Ruckus Wireless - 80E540 - ARRIS Group Inc. + C4FFBC + IEEE Registration Authority - 000DB4 - Stormshield + 283B82 + D-Link International - 2CF05D - Micro-Star INTL Ltd + 804126 + HUAWEI TECHNOLOGIES CO.,LTD - 943BB0 - New H3C Technologies Ltd + ACF970 + HUAWEI TECHNOLOGIES CO.,LTD - 9043E2 - Cornami Inc. + 58D759 + HUAWEI TECHNOLOGIES CO.,LTD - 803049 - Liteon Technology Corporation + 8C5973 + Zyxel Communications Corporation - E84943 - YUGE Information technology Ltd + 24181D + SAMSUNG ELECTRO-MECHANICS(THAILAND) - 501408 - AiNET + F89066 + Nain Inc. - 289AF7 - ADVA Optical Networking Ltd + 7006AC + Eastcompeace Technology Co., Ltd - B0B194 - ZTE Corporation + 6C54CD + LAMPEX ELECTRONICS LIMITED - 10C3AB - Huawei Technologies Ltd + 94290C + Shenyang wisdom Foundation Technology Development Co., Ltd. - 2811EC - Huawei Technologies Ltd + 000889 + Dish Technologies Corp - E42686 - DWnet Technologies(Suzhou) Corporation + 04C9D9 + Dish Technologies Corp - 00692D - Sunnovo International Limited + 7055F8 + Cerebras Systems Inc - 38EB47 - Huawei Technologies Ltd + 580454 + ICOMM HK LIMITED - 0C3796 - Bizlink Technology Inc. + C477AF + Advanced Digital Broadcast SA - F4032A - Amazon Technologies Inc. + D4909C + Apple, Inc. - 147740 - Huawei Device Ltd + E4E0A6 + Apple, Inc. - B4157E - Celona Inc. + 5C0038 + Viasat Group S.p.A. - 18D98F - Huawei Device Ltd + 9C32CE + CANON INC. - 645E2C - IRay Technology Ltd + 802BF9 + Hon Hai Precision Ind. Co.,Ltd. - 00E0EC - Celestica Inc. + 54B802 + Samsung Electronics Co.,Ltd - 703811 - Siemens Mobility Limited + F0B5B7 + Disruptive Technologies Research AS - 646266 - IEEE Registration Authority + B4DEDF + zte corporation - 487AF6 - NCS Electrical SDN BHD + 805E0C + YEALINK(XIAMEN) NETWORK TECHNOLOGY CO.,LTD. - 486E70 - Zhejiang Tmall Technology Ltd + 6C49C1 + o2ones Co., Ltd. - 601D9D - Sichuan AI-Link Technology Ltd + 34415D + Intel Corporate - D85F77 - Telink Semiconductor (Shanghai) Ltd + 005091 + NETACCESS, INC. - 2C97ED - Sony Imaging Products & Solutions Inc. + 70EEA3 + Eoptolink Technology Inc. Ltd, - 20826A - Guangdong Oppo Mobile Telecommunications Corp Ltd + 7047E9 + vivo Mobile Communication Co., Ltd. - B89047 - Apple + 5C521E + Nintendo Co.,Ltd - 909C4A - Apple + 3C2C99 + Edgecore Networks Corporation - 908C43 - Apple + 10CEA9 + Texas Instruments - 188A6A - AVPro Global Hldgs + 88D039 + Tonly Technology Co. Ltd - 3C7D0A - Apple + 20E09C + Nokia - D48A39 - Samsung Electronics Ltd + 2CFDA1 + ASUSTek COMPUTER INC. - E4F3C4 - Samsung Electronics Ltd + 3807D4 + Zeppelin Systems GmbH - 9C2F4E - ZTE Corporation + 04197F + Grasphere Japan - F01090 - New H3C Technologies Ltd + 14444A + Apollo Seiko Ltd. - 08BFA0 - Samsung Electronics Ltd + 5C81A7 + Network Devices Pty Ltd - 701F3C - Samsung Electronics Ltd + 5C0C0E + Guizhou Huaxintong Semiconductor Technology Co Ltd - 2050E7 - AMPAK Technology,Inc. + 5C86C1 + DONGGUAN SOLUM ELECTRONICS CO.,LTD - D8A8C8 - ZTE Corporation + 38437D + Compal Broadband Networks, Inc. - 3822E2 - HP Inc. + 506F98 + Sehaj Synergy Technologies Private Limited - 08C0EB - Mellanox Technologies Inc. + 4CAE1C + SaiNXT Technologies LLP - E4E112 - Texas Instruments + 142882 + MIDICOM ELECTRONICS CO.LTD - 3414B5 - Texas Instruments + 30E48E + Vodafone UK - D003EB - Texas Instruments + 683E02 + SIEMENS AG, Digital Factory, Motion Control System - 94DB56 - Sony Home Entertainment & Sound Products Inc + 000261 + Tilgin AB - 889E68 - Technicolor CH USA Inc. + 0014C3 + Seagate Technology - 6409AC - TCT mobile Ltd + 0004CF + Seagate Technology - 743AEF - Kaonmedia Ltd + 002037 + Seagate Technology - 189E2C - Huawei Device Ltd + EC8193 + Logitech, Inc - 5C5578 - iryx Corp + 6CDD30 + Cisco Systems, Inc - 4CC53E - ZyXEL Communications Corp + 6C4E86 + Third Millennium Systems Ltd. - 9056FC - Tecno Mobile Limited + FC9DD8 + Beijing TongTongYiLian Science and Technology Ltd. - B86392 - Guangdong Genius Technology Ltd + 503CEA + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 68B9D3 - Shenzhen Trolink Technology Ltd + DC2834 + HAKKO Corporation - B8C6AA - Earda Technologies Ltd + 001730 + Automation Electronics - 54AED0 - DASAN Networks Inc. + 00E091 + LG Electronics - 1070FD - Mellanox Technologies Inc. + DCE1AD + Shenzhen Wintop Photoelectric Technology Co., Ltd - 38F601 - Solid State Storage Technology Corporation + 948854 + Texas Instruments - 40DEAD - Juniper Networks + 001D0D + Sony Interactive Entertainment Inc. - 40F520 - Espressif Inc. + ECB0E1 + Ciena Corporation - 78AA82 - New H3C Technologies Ltd + 449160 + Murata Manufacturing Co., Ltd. - 206C8A - Extreme Networks Inc. + B4F1DA + LG Electronics (Mobile Communications) - 348584 - Extreme Networks Inc. + C863F1 + Sony Interactive Entertainment Inc. - 4018B1 - Extreme Networks Inc. + 5C7776 + TCT mobile ltd - 885BDD - Extreme Networks Inc. + 70E56E + Texas Instruments - 98ED5C - Tesla,Inc. + 547DCD + Texas Instruments - C44268 - Crestron Electronics Inc. + 0019C2 + Equustek Solutions, Inc. - 5471DD - Huawei Device Ltd + 80000B + Intel Corporate - E4A749 - Palo Alto Networks + 00AECD + Pensando Systems - 84D6C5 - SolarEdge Technologies + 84509A + Easy Soft TV Co., Ltd - D89136 - Dover Fueling Solutions + 6C05D5 + Ethertronics Inc - C88314 - Tempo Communications + F8B7E2 + Cisco Systems, Inc - B8E3EE - Universal Electronics Inc. + F82055 + Green Information System - 24C8D3 - McWane India Pvt Ltd + ACA667 + Electronic Systems Protection, Inc. - 605464 - Eyedro Green Solutions Inc. + 000097 + Dell EMC - FC956A - Octagon Systems Corp. + 8CCF09 + Dell EMC - 40B31E - Universal Electronics Inc. + 8C839D + SHENZHEN XINYUPENG ELECTRONIC TECHNOLOGY CO., LTD - 884033 - Huawei Technologies Ltd + B0FC36 + CyberTAN Technology Inc. - E0F6B5 - Nintendo Ltd + 001DF4 + Magellan Technology Pty Limited - AC7A56 - Cisco Systems Inc. + 0081F9 + Texas Instruments - 448DBF - Rhino Mobility LLC + ECB5FA + Philips Lighting BV - 948AC6 - Realme Chongqing Mobile Telecommunications Corp Ltd + 44CD0E + FLEXTRONICS MANUFACTURING(ZHUHAI)CO.,LTD. - C0A66D - Inspur Group Ltd + 74E19A + Fiberhome Telecommunication Technologies Co.,LTD - 70F096 - Cisco Systems Inc. + 001CAE + WiChorus, Inc. - 0020A6 - Proxim Wireless + 80B03D + Apple, Inc. - 5850ED - Hangzhou Hikvision Digital Technology Ltd + E49ADC + Apple, Inc. - 00051E - Brocade Communications Systems LLC + ACE4B5 + Apple, Inc. - 988B0A - Hangzhou Hikvision Digital Technology Ltd + D0D2B0 + Apple, Inc. - BCBAC2 - Hangzhou Hikvision Digital Technology Ltd + B0C19E + zte corporation - ACCB51 - Hangzhou Hikvision Digital Technology Ltd + 0C3747 + zte corporation - E0D462 - Huawei Device Ltd + 78DDD9 + Guangzhou Shiyuan Electronics Co., Ltd. - 909838 - Huawei Device Ltd + E8DF70 + AVM Audiovisuelles Marketing und Computersysteme GmbH - 84CCA8 - Espressif Inc. + D05995 + Fiberhome Telecommunication Technologies Co.,LTD - C4F57C - Brocade Communications Systems LLC + 7CDD76 + Suzhou Hanming Technologies Co., Ltd. - 0012F2 - Brocade Communications Systems LLC + 246880 + Braveridge.co.,ltd. - 6C2F8A - Samsung Electronics Ltd + F06D78 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - F0B022 - TOHO Electronics Inc. + 707D95 + Shenzhen City LinwlanTechnology Co. Ltd. - 987ECA - Inventus Power Eletronica do Brasil LtdA + 28AD3E + Shenzhen TONG BO WEI Technology CO.,LTD - 2C9FFB - Wistron Neweb Corporation + 70991C + Shenzhen Honesty Electronics Co.,Ltd - 50382F - ASE Group Chung-Li + 001C56 + Pado Systems, Inc. - 0C14D2 - China Mobile Group Device Ltd + 80C755 + Panasonic Appliances Company - D4F829 - Sagemcom Broadband SAS + 1878D4 + Verizon - E06234 - Texas Instruments + F0BD2E + H+S Polatis Ltd - 708CBB - Mimodisplaykorea + 746EE4 + Asia Vital Components Co.,Ltd. - B848AA - EM Microelectronic + 2C431A + Shenzhen YOUHUA Technology Co., Ltd - D834EE - Stem Audio + 70708B + Cisco Systems, Inc - F8572E - Core Brands LLC + 389F5A + C-Kur TV Inc. - 001C91 - Gefen LLC + D843ED + Suzuken - 244BFE - ASUSTek Computer Inc. + 38A6CE + SKY UK LIMITED - 7CDDE9 - ATOM tech Inc. + 0040E4 + E-M TECHNOLOGY, INC. - F86BD9 - Cisco Systems Inc. + E084F3 + High Grade Controls Corporation - C014FE - Cisco Systems Inc. + 0C62A6 + Hui Zhou Gaoshengda Technology Co.,LTD - 7CAD4F - Cisco Systems Inc. + 18132D + zte corporation - 0831A4 - Huawei Device Ltd + BC4101 + Shenzhen TINNO Mobile Technology Corp. - A8E978 - Huawei Device Ltd + 043A0D + SM Optics S.r.l. - F82F65 - Huawei Device Ltd + 44EAD8 + Texas Instruments - 28B371 - Ruckus Wireless + 448F17 + Samsung Electronics Co., Ltd. ARTIK - 08ACC4 - FMTech + 00FC8B + Amazon Technologies Inc. - DC503A - Nanjing Ticom Tech Ltd + 0076B1 + Somfy-Protect By Myfox SAS - 18473D - Chongqing Fugui Electronics Ltd + C0742B + SHENZHEN XUNLONG SOFTWARE CO.,LIMITED - D477B2 - Netix Global B.V. + 74D21D + HUAWEI TECHNOLOGIES CO.,LTD - 70B5E8 - Dell Inc. + 3890A5 + Cisco Systems, Inc - 942533 - Huawei Technologies Ltd + 6CC147 + Xiamen Hanin Electronic Technology Co., Ltd - 605661 - IXECLOUD Tech + A072E4 + NJ SYSTEM CO.,LTD - 0C599C - Juniper Networks + 4C1365 + Emplus Technologies - 44F4E7 - Cohesity Inc + CCF957 + u-blox AG - 706979 - IEEE Registration Authority + 5C6776 + IDS Imaging Development Systems GmbH - FC609B - New H3C Technologies Ltd + 1CDDEA + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - E8A1F8 - ZTE Corporation + B8D94D + Sagemcom Broadband SAS - 98A942 - Guangzhou Tozed Kangwei Intelligent Technology Ltd + 189BA5 + IEEE Registration Authority - 304240 - ZTE Corporation + 1C7022 + Murata Manufacturing Co., Ltd. - 4C2113 - Nokia Shanghai Bell Ltd + CC9891 + Cisco Systems, Inc - 802DBF - Cisco Systems Inc. + 28BF89 + Fiberhome Telecommunication Technologies Co.,LTD - 24F150 - Guangzhou Qi'an Technology Ltd + 8C4500 + Murata Manufacturing Co., Ltd. - 108B6A - Antailiye Technology Ltd + A43412 + Thales Alenia Space - 14C88B - Apple + 681F40 + Blu Wireless Technology Ltd - EC2651 - Apple + 90ADF7 + vivo Mobile Communication Co., Ltd. - 183EEF - Apple + ECFA03 + FCA - 607EC9 - Apple + 002294 + KYOCERA CORPORATION - 40882F - Extreme Networks Inc. + 3889DC + Opticon Sensors Europe B.V. - E43D1A - Broadcom Limited + 903DBD + SECURE METERS LIMITED - 644C36 - Intel Corporation + FC017C + Hon Hai Precision Ind. Co.,Ltd. - 4889E7 - Intel Corporation + 90324B + Hon Hai Precision Ind. Co.,Ltd. - 24EE9A - Intel Corporation + 940006 + jinyoung - 5C879C - Intel Corporation + 6C96CF + Apple, Inc. - 50EB71 - Intel Corporation + 78886D + Apple, Inc. - 0CDD24 - Intel Corporation + 74E5F9 + Intel Corporate - 94B86D - Intel Corporation + 40CE24 + Cisco Systems, Inc - 2016B9 - Intel Corporation + 3432E6 + Panasonic Industrial Devices Europe GmbH - 38BAF8 - Intel Corporation + 40017A + Cisco Systems, Inc - 3C6AA7 - Intel Corporation + 38CD07 + Beijing FaceCam Technology Co., Ltd. - 34E12D - Intel Corporation + 20EE28 + Apple, Inc. - 00BB60 - Intel Corporation + B4F61C + Apple, Inc. - 60F677 - Intel Corporation + 08F4AB + Apple, Inc. - A08869 - Intel Corporation + 8C8590 + Apple, Inc. - 74E5F9 - Intel Corporation + BC88C3 + Ningbo Dooya Mechanic & Electronic Technology Co., Ltd - 80000B - Intel Corporation + 00127D + MobileAria - 34415D - Intel Corporation + 00D060 + Panasonic Europe Ltd. - FC7774 - Intel Corporation + A08869 + Intel Corporate - 982CBC - Intel Corporation + 58A0CB + TrackNet, Inc - 3CF011 - Intel Corporation + 0C4B54 + TP-LINK TECHNOLOGIES CO.,LTD. - 287FCF - Intel Corporation + 74819A + PT. Hartono Istana Teknologi - 803253 - Intel Corporation + A82BB5 + Edgecore Networks Corporation - D8C0A6 - Azurewave Technologies Inc. + 283545 + SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD - 9CFCE8 - Intel Corporation + 602E20 + HUAWEI TECHNOLOGIES CO.,LTD - F8AC65 - Intel Corporation + E472E2 + HUAWEI TECHNOLOGIES CO.,LTD - 1012FB - Hangzhou Hikvision Digital Technology Ltd + 94E36D + Texas Instruments - F09BB8 - Huawei Technologies Ltd + F0F8F2 + Texas Instruments - BC17B8 - Intel Corporation + 341513 + Texas Instruments - B8CB29 - Dell Inc. + E06089 + Cloudleaf, Inc. - 44BB3B - Google Inc. + 783690 + Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd - 14C14E - Google Inc. + 508F4C + Xiaomi Communications Co Ltd - 8C5EBD - Huawei Device Ltd + A47758 + Ningbo Freewings Technologies Co.,Ltd - 2CA042 - Huawei Device Ltd + 60F677 + Intel Corporate - ECC01B - Huawei Technologies Ltd + E8E1E2 + Energotest - 9844CE - Huawei Technologies Ltd + 7811DC + XIAOMI Electronics,CO.,LTD - CCD083 - Aruba Networks HP + D463C6 + Motorola Mobility LLC, a Lenovo Company - C083C9 - Huawei Device Ltd + C444A0 + Cisco Systems, Inc - C01C30 - Shenzhen WIFI-3L Technology Ltd + 18742E + Amazon Technologies Inc. - D8C678 - MitraStar Technology Corp. + F844E3 + Taicang T&W Electronics - 441C7F - Motorola Mobility LLC, a Lenovo Company + 24A534 + SynTrust Tech International Ltd. - 00B8B6 - Motorola Mobility LLC, a Lenovo Company + 001D2E + Ruckus Wireless - 1CE61D - Samsung Electronics Ltd + 044F4C + HUAWEI TECHNOLOGIES CO.,LTD - 8012DF - Shenzhen SuperElectron Technology Ltd + 1C151F + HUAWEI TECHNOLOGIES CO.,LTD - 10E77A - STMicrolectronics International NV + 008BFC + mixi,Inc. - 80EA07 - TP-Link Technologies Ltd + 90A365 + HMD Global Oy - BC03A7 - MFP Michelin + DC44B6 + Samsung Electronics Co.,Ltd - 90769F - Shenzhen Mercury Communication Technologies Ltd + 1007B6 + Samsung Electronics Co.,Ltd - 982FF8 - Huawei Device Ltd + 342D0D + Samsung Electronics Co.,Ltd - 40DCA5 - Huawei Device Ltd + D837BE + SHENZHEN GONGJIN ELECTRONICS CO.,LT - 2C6F51 - Herospeed Digital Technology Limited + 001392 + Ruckus Wireless - 04A2F3 - Fiberhome Telecommunication Technologies Ltd + D4684D + Ruckus Wireless - CCDB93 - Cisco Systems Inc. + 8C0C90 + Ruckus Wireless - 18D61C - Shenzhen TINNO Mobile Technology Corp. + 6CAAB3 + Ruckus Wireless - 5448E6 - Beijing Xiaomi Mobile Software Ltd + C08ADE + Ruckus Wireless - 60D4E9 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 085114 + QINGDAO TOPSCOMM COMMUNICATION CO., LTD - 30C50F - Huawei Technologies Ltd + 70788B + vivo Mobile Communication Co., Ltd. - 2868D2 - Huawei Technologies Ltd + 4859A4 + zte corporation - 90A935 - JWEntertainment + 70F11C + Shenzhen Ogemray Technology Co.,Ltd - A486AE - Quectel Wireless Solutions Ltd + 7065A3 + Kandao lightforge Co., Ltd. - 1CD6BE - Wistron Neweb Corporation + 74D0DC + Ericsson AB - 28D127 - Beijing Xiaomi Mobile Software Ltd + 54BD79 + Samsung Electronics Co.,Ltd - C868DE - Huawei Device Ltd + AC9E17 + ASUSTek COMPUTER INC. - D00DF7 - Huawei Device Ltd + 641666 + Nest Labs Inc. - 4805E2 - Huawei Device Ltd + EC42B4 + ADC Corporation - F81B04 - Zhong Shan City Richsound Electronic Industrial Ltd + 60DA83 + Hangzhou H3C Technologies Co., Limited - D88C79 - Google Inc. + 2C5731 + Wingtech Group (HongKong)Limited - 10341B - Spacelink + CC4639 + WAAV, Inc. - 30A452 - Arrival Elements BV + A0423F + Tyan Computer Corp - 001E68 - Quanta Computer Inc. + D8DF7A + Quest Software, Inc. - 00238B - Quanta Computer Inc. + E4A749 + Palo Alto Networks - 2C600C - Quanta Computer Inc. + A86B7C + SHENZHEN FENGLIAN TECHNOLOGY CO., LTD. - 8CC5B4 - Sagemcom Broadband SAS + B4E62A + LG Innotek - 000BA2 - Sumitomo Electric Industries Ltd + A0C5F2 + IEEE Registration Authority - 0008F6 - Sumitomo Electric Industries Ltd + 8C147D + IEEE Registration Authority - 00005F - Sumitomo Electric Industries Ltd + A0AFBD + Intel Corporate - 18ECE7 - Buffalo Inc. + A0341B + Adero Inc - F469D5 - IEEE Registration Authority + A0239F + Cisco Systems, Inc - 083AF2 - Espressif Inc. + 70F35A + Cisco Systems, Inc - 743A20 - New H3C Technologies Ltd + 145BE1 + nyantec GmbH - 30C9AB - Cloud Network Technology Singapore PTE Ltd + 30074D + SAMSUNG ELECTRO-MECHANICS(THAILAND) - 3C1A9E - VitalThings AS + 00180A + Cisco Meraki - C4D738 - Huawei Device Ltd + 88D50C + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - C884A1 - Cisco Systems Inc. + D428D5 + TCT mobile ltd - D8778B - Intelbras + 7C8BCA + TP-LINK TECHNOLOGIES CO.,LTD. - 0003E8 - Wavesight Limited + B04E26 + TP-LINK TECHNOLOGIES CO.,LTD. - 6CBAB8 - Sagemcom Broadband SAS + B089C2 + Zyptonite - E0D464 - Intel Corporation + F023B9 + IEEE Registration Authority - C0F6C2 - Huawei Technologies Ltd + 1C1FD4 + LifeBEAM Technologies LTD - D4AFF7 - Arista Networks + E83935 + Hewlett Packard - 60077C - Jala Group + A4F4C2 + VNPT TECHNOLOGY - 609866 - Texas Instruments + 009AD2 + Cisco Systems, Inc - 047E23 - China Mobile IOT Company Limited + 947BE7 + Samsung Electronics Co.,Ltd - 14CCB3 - AO GK Nateks + 5092B9 + Samsung Electronics Co.,Ltd - DCCD2F - Seiko Epson Corporation + DC74A8 + Samsung Electronics Co.,Ltd - 9454CE - Guangdong Oppo Mobile Telecommunications Corp Ltd + 5C6A80 + Zyxel Communications Corporation - 388ABE - Guangdong Oppo Mobile Telecommunications Corp Ltd + D860B3 + Guangdong Global Electronic Technology CO.,LTD - 689320 - New H3C Technologies Ltd + 64351C + e-CON SYSTEMS INDIA PVT LTD - 5484DC - ZTE Corporation + 605317 + Sandstone Technologies - 38549B - ZTE Corporation + 9CAF6F + ITEL MOBILE LIMITED - 084296 - Mobile Technology Solutions LLC + FC539E + Shanghai Wind Technologies Co.,Ltd - 343EA4 - Ring LLC + A8D579 + Beijing Chushang Science and Technology Co.,Ltd - 04C1D8 - Huawei Device Ltd + 84CD62 + ShenZhen IDWELL Technology CO.,Ltd - C8BC9C - Huawei Device Ltd + 907065 + Texas Instruments - B0FEE5 - Huawei Device Ltd + 481063 + NTT Innovation Institute, Inc. - C81739 - Itel Mobile Limited + 60BA18 + nextLAP GmbH - 58D061 - Huawei Technologies Ltd + 001FA4 + SHENZHEN GONGJIN ELECTRONICS CO.,LT - 34EFB6 - Edgecore Networks Corporation + C4AE12 + Samsung Electronics Co.,Ltd - E874C7 - Sentinhealth + 18A958 + PROVISION THAI CO., LTD. - 001C7B - Castlenet Technology Inc. + 94D299 + Techmation Co.,Ltd. - E4842B - Hangzhou Softel Optic Ltd + 488803 + ManTechnology Inc. - B8D309 - Cox Communications Inc. + B436E3 + KBVISION GROUP - 94026B - Optictimes Ltd + 6C4B90 + LiteON - D46A91 - SnapAV + C83A6B + Roku, Inc - 80EE25 - Shenzhen Skyworth Digital Technology Ltd + B4C6F8 + Axilspot Communication - 4487DB - Tymphany Acoustic Technology (Huizhou) Co. Ltd + 9CE951 + Shenzhen Sang Fei Consumer Communications Ltd., Co. - D021F9 - Ubiquiti Networks Inc. + 74C9A3 + Fiberhome Telecommunication Technologies Co.,LTD - D03D52 - Ava Security Limited + EC8A4C + zte corporation - F490EA - Deciso B.V. + B8D50B + Sunitec Enterprise Co.,Ltd - 64D2C4 - Apple + BC66DE + Shadow Creator Information Technology Co.,Ltd. - DC5285 - Apple + 2CABEB + Cisco Systems, Inc - E88152 - Apple + 58D9D5 + Tenda Technology Co.,Ltd.Dongguan branch - 908158 - Apple + D45F25 + Shenzhen YOUHUA Technology Co., Ltd - B4ADA3 - Guangzhou Shiyuan Electronic Technology Company Limited + 40C8CB + AM Telecom co., Ltd. - 642315 - Huawei Device Ltd + 64D154 + Routerboard.com - A4C74B - Huawei Device Ltd + 28FF3E + zte corporation - D0D23C - Apple + B8D7AF + Murata Manufacturing Co., Ltd. - 78E3DE - Apple + D4AE05 + Samsung Electronics Co.,Ltd - 18FDCB - IEEE Registration Authority + F0EE10 + Samsung Electronics Co.,Ltd - D4482D - Shenzhen Deejoy Lighting Technology Ltd + E048AF + Premietech Limited - D8F8AF - Daontec + 2C3311 + Cisco Systems, Inc - 408C4C - Shenzhen MiaoMing Intelligent Technology Ltd + 5082D5 + Apple, Inc. - 6CADAD - Chongqing Fugui Electronics Ltd + 341A35 + Fiberhome Telecommunication Technologies Co.,LTD - CCE0DA - Baidu Online Network Technology (Beijing) Ltd + 2C029F + 3ALogics - 141B30 - Shenzhen Yipingfang Network Technology Ltd + 00050F + Tanaka S/S Ltd. - F46FED - Fiberhome Telecommunication Technologies Ltd + 989E63 + Apple, Inc. - 94B97E - Espressif Inc. + 886B6E + Apple, Inc. - A8301C - Qingdao Intelligent & Precise Electronics Ltd + D4DCCD + Apple, Inc. - D8F3BC - Liteon Technology Corporation + 484BAA + Apple, Inc. - B8477A - Dasan Electron Ltd + DCA904 + Apple, Inc. - 7C78B2 - Wyze Labs Inc + 6CAB31 + Apple, Inc. - D8373B - Shenzhen Jingxun Software Telecommunication Technology Ltd + 4C74BF + Apple, Inc. - 6C2D24 - Zhen Shi Information Technology (Shanghai) Ltd + 04946B + TECNO MOBILE LIMITED - B8AE1C - Smart Cube Ltd + A04C5B + Shenzhen TINNO Mobile Technology Corp. - 800384 - Ruckus Wireless + F85971 + Intel Corporate - FC698C - ANDREAS STIHL AG & Co. KG + F4E4AD + zte corporation - 0023A7 - Redpine Signals Inc. + BC024A + HMD Global Oy - 44CE3A - Jiangsu Huacun Electronic Technology Ltd + 949901 + Shenzhen YITOA Digital Appliance CO.,LTD - 9C1EA4 - Renesas Electronics (Penang) Sdn. Bhd. + 1005CA + Cisco Systems, Inc - 4CEF56 - Shenzhen Sundray Technologies Company Limited + 7894B4 + Sercomm Corporation. - E4C32A - TP-Link Technologies Ltd + C4700B + GUANGZHOU CHIP TECHNOLOGIES CO.,LTD - 909A4A - TP-Link Technologies Ltd + 443708 + MRV Comunications - BC9789 - Huawei Device Ltd + 285F2F + RNware Co.,Ltd. - AC122F - Fantasia Trading LLC + 3CA067 + Liteon Technology Corporation - FC45C3 - Texas Instruments + 1C1EE3 + Hui Zhou Gaoshengda Technology Co.,LTD - AC6AA3 - Shenzhen Kertong Technology Ltd + 2C55D3 + HUAWEI TECHNOLOGIES CO.,LTD - E84F4B - Shenzhen Delos Electronic Ltd + DCC64B + HUAWEI TECHNOLOGIES CO.,LTD - B04A39 - Beijing Roborock Technology Ltd + 043389 + HUAWEI TECHNOLOGIES CO.,LTD - A4F9E4 - AirVine Scientific Inc. + B81DAA + LG Electronics (Mobile Communications) - F44FD3 - Shenzhen hemuwei technology Ltd + 00E400 + Sichuan Changhong Electric Ltd. - 684571 - Huawei Device Ltd + 542F8A + TELLESCOM INDUSTRIA E COMERCIO EM TELECOMUNICACAO - 8493A0 - Huawei Device Ltd + 6014B3 + CyberTAN Technology Inc. - 9C8E9C - Huawei Device Ltd + 44032C + Intel Corporate - 4014AD - Huawei Device Ltd + 500FF5 + Tenda Technology Co.,Ltd.Dongguan branch - A87484 - ZTE Corporation + BC452E + Knowledge Development for POF S.L. - E04BA6 - Huawei Technologies Ltd + 706DEC + Wifi-soft LLC - C8B6D3 - Huawei Technologies Ltd + B0C205 + BIONIME - FC8D3D - Leapfive Tech Ltd + 94F551 + Cadi Scientific Pte Ltd - 002386 - IMI Hydronic Engineering international SA + 00A068 + BHP LIMITED - A06974 - Honor Device Ltd + 703ACB + Google, Inc. - C033DA - Shenzhen JRUN Technologies Ltd + 105AF7 + ADB Italia - 607072 - Shenzhen Hongde Smart Link Technology Ltd + 00C024 + EDEN SISTEMAS DE COMPUTACAO SA - DCB7FC - Alps Electric (Ireland) Ltd + 7C4685 + Motorola (Wuhan) Mobility Technologies Communication Co., Ltd. - ACFAA5 - digitron + 1C398A + Fiberhome Telecommunication Technologies Co.,LTD - 78C95E - Midmark RTLS + 00179B + CHANT SINCERE CO.,LTD - 20CD6E - Realme Chongqing Mobile Telecommunications Corp Ltd + 0823B2 + vivo Mobile Communication Co., Ltd. - BC69CB - Panasonic Life Solutions Networks Ltd + 88C3B3 + SOVICO - 089356 - Huawei Technologies Ltd + E05124 + NXP Semiconductors - 000789 - Allradio Ltd + 6C160E + ShotTracker - 6C146E - Huawei Technologies Ltd + 803A0A + Integrated Device Technology (Malaysia) Sdn. Bhd. - 44E968 - Huawei Technologies Ltd + A462DF + DS Global. Co., LTD - DC4A9E - IEEE Registration Authority + 08CCA7 + Cisco Systems, Inc - E0C377 - Samsung Electronics Ltd + 0896AD + Cisco Systems, Inc - 4CFBF4 - Optimal Audio Ltd + 347877 + O-Net Communications (Shenzhen) Limited - 846082 - Private + 0020CC + DIGITAL SERVICES, LTD. - 64037F - Samsung Electronics Ltd + 285261 + Cisco Systems, Inc - B49D02 - Samsung Electronics Ltd + 286F7F + Cisco Systems, Inc - 809FF5 - Samsung Electronics Ltd + F0C850 + HUAWEI TECHNOLOGIES CO.,LTD - 647924 - Huawei Device Ltd + 001DA3 + SabiOso - D8CC98 - Huawei Device Ltd + 689FF0 + zte corporation - B8876E - Yandex Services AG + 5CAF06 + LG Electronics (Mobile Communications) - F86D73 - Zengge Ltd + 4C1694 + shenzhen sibituo Technology Co., Ltd - 588694 - EFM Networks + 00014F + Adtran Inc - AC3728 - Taicang T&W Electronics + 7868F7 + YSTen Technology Co.,Ltd - BC9930 - Huawei Technologies Ltd + C81451 + HUAWEI TECHNOLOGIES CO.,LTD - E868E7 - Espressif Inc. + 44D437 + Inteno Broadband Technology AB - D0BCC1 - Weifang Goertek Electronics Ltd + ECE154 + Beijing Unisound Information Technology Co.,Ltd. - 6CE874 - Huawei Technologies Ltd + E865D4 + Tenda Technology Co.,Ltd.Dongguan branch - C469F0 - Huawei Technologies Ltd + 24D51C + Zhongtian broadband technology co., LTD - C09435 - ARRIS Group Inc. + 4CECEF + Soraa, Inc. - 18B6CC - We Corporation Inc. + 1CEFCE + bebro electronic GmbH - F85E42 - Technicolor CH USA Inc. + 64DBA0 + Select Comfort - 30A023 - Rock Path S.R.L + EC43F6 + Zyxel Communications Corporation - E848B8 - TP-Link Corporation Limited + 60C658 + PHYTRONIX Co.,Ltd. - 78CB2C - Join Digital Inc. + FCB58A + Wapice Ltd. - 309E1D - Ohsung + 20780B + Delta Faucet Company - 687912 - IEEE Registration Authority + 2CD02D + Cisco Systems, Inc - EC6488 - Honor Device Ltd + 24A7DC + SKY UK LIMITED - 74D6CB - New H3C Technologies Ltd + 0C73BE + Dongguan Haimai Electronie Technology Co.,Ltd - 0C3AFA - New H3C Technologies Ltd + C8AA55 + Hunan Comtom Electronic Incorporated Co.,Ltd - 283B82 - D-Link International + 98B6E9 + Nintendo Co.,Ltd - 0CB6D2 - D-Link International + 186590 + Apple, Inc. - 60BEC4 - Apple + F86214 + Apple, Inc. - F8B1DD - Apple + 784F43 + Apple, Inc. - F8665A - Apple + 404D7F + Apple, Inc. - A8817E - Apple + 64B0A6 + Apple, Inc. - 8C476E - IEEE Registration Authority + 7C04D0 + Apple, Inc. - 48701E - Texas Instruments + 84FCAC + Apple, Inc. - E8C320 - Austco Marketing & Service (USA) Ltd + DC0C5C + Apple, Inc. - AC3328 - Huawei Device Ltd + F8983A + Leeman International (HongKong) Limited - 002306 - Alpsalpine Ltd + 001D72 + Wistron Corporation - 002433 - Alpsalpine Ltd + 30E171 + Hewlett Packard - 9C8D7C - Alpsalpine Ltd + F015B9 + PlayFusion Limited - 0016FE - Alpsalpine Ltd + 64136C + zte corporation - 0019C1 - Alpsalpine Ltd + 04B648 + ZENNER - D476A0 - Fortinet Inc. + 1840A4 + Shenzhen Trylong Smart Science and Technology Co., Ltd. - 80B97A - eero Inc. + 4C7487 + Leader Phone Communication Technology Co., Ltd. - BC7536 - Alpsalpine Ltd + 4C38D5 + MITAC COMPUTING TECHNOLOGY CORPORATION - 5816D7 - Alpsalpine Ltd + 54B56C + Xi'an NovaStar Tech Co., Ltd - E0750A - Alpsalpine Ltd + 1C48CE + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - E0AE5E - Alpsalpine Ltd + 344CC8 + Echodyne Corp - 608D26 - Arcadyan Corporation + 603E7B + Gafachi, Inc. - B4EC02 - Alpsalpine Ltd + D8197A + Nuheara Ltd - E42761 - Honor Device Ltd + 70700D + Apple, Inc. - 8CF319 - Siemens Industrial Automation Products Ltd Chengdu + 6C5C14 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 1C3929 - Ohsung + AC83F3 + AMPAK Technology, Inc. - E4D3AA - Fujitsu Connected Technologies Limited + CC8CDA + Shenzhen Wei Da Intelligent Technology Go.,Ltd - C8A40D - Cooler Master Technology Inc + D436DB + Jiangsu Toppower Automotive Electronics Co., Ltd - 38420B - Sonos Inc. + E80945 + Integrated Device Technology (Malaysia) Sdn. Bhd. - C83A6B - Roku Inc. + C80CC8 + HUAWEI TECHNOLOGIES CO.,LTD - A453EE - IEEE Registration Authority + 0425C5 + HUAWEI TECHNOLOGIES CO.,LTD - 8C4962 - Roku Inc. + B0A2E7 + Shenzhen TINNO Mobile Technology Corp. - E02E3F - Huawei Device Ltd + 7C2587 + chaowifi.com - C4BF60 - Tecno Mobile Limited + 002144 + SS Telecoms - D040EF - Murata Manufacturing Ltd + 00501E + Grass Valley, A Belden Brand - 8C8CAA - LCFC(HeFei) Electronics Technology Ltd + EC0D9A + Mellanox Technologies, Inc. - 90CCDF - Intel Corporation + 3CFA43 + HUAWEI TECHNOLOGIES CO.,LTD - 085BD6 - Intel Corporation + 145F94 + HUAWEI TECHNOLOGIES CO.,LTD - B40EDE - Intel Corporation + 90D7BE + Wavelab Global Inc. - E02BE9 - Intel Corporation + 244E7B + IEEE Registration Authority - BC9A53 - Huawei Device Ltd + CC9470 + Kinestral Technologies, Inc. - DC2727 - Huawei Device Ltd + 085DDD + MERCURY CORPORATION - F042F5 - Huawei Device Ltd + 001F82 + Cal-Comp Electronics & Communications Company Ltd. - 4C1154 - Mobiwire Mobiles (NingBo) Ltd + 883C1C + MERCURY CORPORATION - C8E265 - Intel Corporation + 2834A2 + Cisco Systems, Inc - 8C8D28 - Intel Corporation + 006BF1 + Cisco Systems, Inc - D056BF - Amosense + CC61E5 + Motorola Mobility LLC, a Lenovo Company - B4B5B6 - Chongqing Fugui Electronics Ltd + 20719E + SF Technology Co.,Ltd - 047A0B - Beijing Xiaomi Electronics Ltd + 2CC260 + Oracle Corporation - 900F0C - Cloud Network Technology Singapore PTE Ltd + 3C3F51 + 2CRSI - F0A225 - Amazon Technologies Inc. + 50584F + waytotec,Inc. - F04F7C - Amazon Technologies Inc. + B439D6 + ProCurve Networking by HP - BC9D42 - Shenzhen RF-Link Technology Ltd + 34F39A + Intel Corporate - 4C7525 - Espressif Inc. + 8C60E7 + MPGIO CO.,LTD - 7404F0 - Mobiwire Mobiles (NingBo) Ltd + 8C8ABB + Beijing Orient View Technology Co., Ltd. - 240B88 - Taicang T&W Electronics + 00039B + NetChip Technology, Inc. - 0C938F - Guangdong Oppo Mobile Telecommunications Corp Ltd + 609AC1 + Apple, Inc. - 78F9B4 - Nokia Solutions and Networks GmbH & Co. KG + 748D08 + Apple, Inc. - 60A8FE - Nokia Solutions and Networks GmbH & Co. KG + 9C8BA0 + Apple, Inc. - D8EFCD - Nokia Solutions and Networks GmbH & Co. KG + CC088D + Apple, Inc. - 6CF712 - Nokia Solutions and Networks GmbH & Co. KG + 38A4ED + Xiaomi Communications Co Ltd - EC75ED - Citrix Systems Inc. + B89919 + 7signal Solutions, Inc - 5CBD9A - Huawei Device Ltd + 40FE0D + MAXIO - 8CDEE6 - Samsung Electronics Ltd + AC64DD + IEEE Registration Authority - 10EC81 - Samsung Electronics Ltd + BC39D9 + Z-TEC - C45D83 - Samsung Electronics Ltd + 3C2AF4 + Brother Industries, LTD. - 5CA4A4 - Fiberhome Telecommunication Technologies Ltd + C0854C + Ragentek Technology Group - 14A3B4 - Huawei Device Ltd + D816C1 + DEWAV (HK) ELECTRONICS LIMITED - 9C9C1F - Espressif Inc. + 94B819 + Nokia - D809D6 - Zexelon Ltd + 787D48 + ITEL MOBILE LIMITED - E86DE9 - Huawei Technologies Ltd + 8871E5 + Amazon Technologies Inc. - 144658 - Huawei Technologies Ltd + 60EFC6 + Shenzhen Chima Technologies Co Limited - 58BE72 - Huawei Technologies Ltd + 20DBAB + Samsung Electronics Co., Ltd. - 108FFE - Huawei Technologies Ltd + 383A21 + IEEE Registration Authority - BCD7CE - China Mobile (Hangzhou) Information Technology Ltd + D8380D + SHENZHEN IP-COM Network Co.,Ltd - 9CA570 - eero Inc. + FCCAC4 + LifeHealth, LLC - A0412D - Lansen Systems AB + 88AD43 + PEGATRON CORPORATION - C43960 - GD Midea Air-Conditioning Equipment Ltd + B4EFFA + Lemobile Information Technology (Beijing) Co., Ltd. - 98BEDC - Honor Device Ltd + B0C128 + Adler ELREHA GmbH - 44B6BE - Cisco Systems Inc. + F81D78 + IEEE Registration Authority - 00A0FB - Toray Engineering D Solutions Ltd + 38F7B2 + SEOJUN ELECTRIC - 7061BE - Wistron Neweb Corporation + 7802B7 + ShenZhen Ultra Easy Technology CO.,LTD - 348A12 - Aruba Networks HP + 646184 + VELUX - 84D343 - Calix Inc. + 3087D9 + Ruckus Wireless - D847BB - Huawei Device Ltd + F09838 + HUAWEI TECHNOLOGIES CO.,LTD - C41411 - Apple + F0D9B2 + EXO S.A. - CCC95D - Apple + 001FC6 + ASUSTek COMPUTER INC. - 38B5D3 - SecuWorks + 6C71BD + EZELINK TELECOM - 34318F - Apple + C87E75 + Samsung Electronics Co.,Ltd - 446FD8 - IEEE Registration Authority + 00265F + Samsung Electronics Co.,Ltd - C89402 - Chongqing Fugui Electronics Ltd + 00233A + Samsung Electronics Co.,Ltd - 7CB94C - Bouffalo Lab (Nanjing) Ltd + 101250 + Integrated Device Technology (Malaysia) Sdn. Bhd. - DC15C8 - AVM Audiovisuelles Marketing und Computersysteme GmbH + 0007AB + Samsung Electronics Co.,Ltd - 6CD630 - Rootous System Ltd + E8E5D6 + Samsung Electronics Co.,Ltd - B80756 - Cisco Meraki + 80691A + Belkin International Inc. - C833E5 - Huawei Technologies Ltd + 001427 + JazzMutant - 3456FE - Cisco Meraki + 001E84 + Pika Technologies Inc. - B844AE - TCT mobile Ltd + 10DDB1 + Apple, Inc. - E4F75B - ARRIS Group Inc. + 002329 + DDRdrive LLC - F8790A - ARRIS Group Inc. + AC63BE + Amazon Technologies Inc. - 0CCF89 - Shenzhen Bilian Electronic Ltd + 086A0A + ASKEY COMPUTER CORP - 0C8C69 - Shenzhen elink smart Ltd + 98E7F4 + Hewlett Packard - D8BBC1 - Micro-Star INTL Ltd + EC65CC + Panasonic Automotive Systems Company of America - AC5AFC - Intel Corporation + 0026AD + Arada Systems, Inc. - 1C937C - ARRIS Group Inc. + 002486 + DesignArt Networks - 58FC20 - Altice Labs S.A. + 002478 + Mag Tech Electronics Co Limited - 58FD20 - Systemhouse Solutions AB + 382DD1 + Samsung Electronics Co.,Ltd - 04D6F4 - GD Midea Air-Conditioning Equipment Ltd + 001B2C + ATRON electronic GmbH - 049081 - Pensando Systems Inc. + 9034FC + Hon Hai Precision Ind. Co.,Ltd. - 4C796E - Intel Corporation + 0C84DC + Hon Hai Precision Ind. Co.,Ltd. - 98AD1D - Huawei Device Ltd + FC1F19 + SAMSUNG ELECTRO MECHANICS CO., LTD. - F8AA3F - DWnet Technologies(Suzhou) Corporation + 840B2D + SAMSUNG ELECTRO MECHANICS CO., LTD. - 00682B - Huawei Device Ltd + 206432 + SAMSUNG ELECTRO MECHANICS CO., LTD. - F09E4A - Intel Corporation + B407F9 + SAMSUNG ELECTRO MECHANICS CO., LTD. - F077C3 - Intel Corporation + 889FFA + Hon Hai Precision Ind. Co.,Ltd. - 249AD8 - Yealink(Xiamen) Network Technology Ltd + 8C7CB5 + Hon Hai Precision Ind. Co.,Ltd. - D85ED3 - Giga-Byte Technology Ltd + C44619 + Hon Hai Precision Ind. Co.,Ltd. - 00E421 - Sony Interactive Entertainment Inc. + 506313 + Hon Hai Precision Ind. Co.,Ltd. - CCDB04 - DataRemote Inc. + D0667B + Samsung Electronics Co.,Ltd - E89F39 - Nokia + E8039A + Samsung Electronics Co.,Ltd - 34735A - Dell Inc. + 30CDA7 + Samsung Electronics Co.,Ltd - 981A35 - Huawei Technologies Ltd + 3C8BFE + Samsung Electronics Co.,Ltd - 803428 - Microchip Technology Inc. + D4E8B2 + Samsung Electronics Co.,Ltd - 28EF01 - Amazon Technologies Inc. + 002339 + Samsung Electronics Co.,Ltd - B0227A - HP Inc. + 5001BB + Samsung Electronics Co.,Ltd - 60A751 - Huawei Device Ltd + 00166C + Samsung Electronics Co.,Ltd - 102B41 - Samsung Electronics Ltd + 001599 + Samsung Electronics Co.,Ltd - 344AC3 - HuNan ZiKun Information Technology Ltd + 0012FB + Samsung Electronics Co.,Ltd - 682D83 - Shenzhen Dinghe Communication Company + 001247 + Samsung Electronics Co.,Ltd - A84397 - Innogrit Corporation + 0015B9 + Samsung Electronics Co.,Ltd - D8CD2C - Wuxi Neihua Network Technology Ltd + 002491 + Samsung Electronics Co.,Ltd - 58D391 - Quectel Wireless Solutions Ltd + 60D819 + Hon Hai Precision Ind. Co.,Ltd. - 08474C - Nokia + F82FA8 + Hon Hai Precision Ind. Co.,Ltd. - 90C119 - Nokia + C40142 + MaxMedia Technology Limited - 7CF880 - Cisco Systems Inc. + 8430E5 + SkyHawke Technologies, LLC - E405F8 - Bytedance + 1C77F6 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - F845C4 - Shenzhen Netforward Micro-Electronic Ltd + 58E326 + Compass Technologies Inc. - 781053 - China Mobile Group Device Ltd + 001B2A + Cisco Systems, Inc - 00080C - VDA Group S.p.a. + 749DDC + 2Wire Inc - D097FE - Realme Chongqing Mobile Telecommunications Corp Ltd + C8BA94 + SAMSUNG ELECTRO-MECHANICS(THAILAND) - 843A5B - Inventec(Chongqing) Corporation + 843838 + SAMSUNG ELECTRO-MECHANICS(THAILAND) - 5449DF - Peloton Interactive Inc. + 54880E + SAMSUNG ELECTRO-MECHANICS(THAILAND) - 182A57 - Huawei Technologies Ltd + F025B7 + SAMSUNG ELECTRO-MECHANICS(THAILAND) - F83E95 - Huawei Technologies Ltd + F04347 + HUAWEI TECHNOLOGIES CO.,LTD - 481258 - Huawei Technologies Ltd + 9CB2B2 + HUAWEI TECHNOLOGIES CO.,LTD - D8EB46 - Google Inc. + A8C83A + HUAWEI TECHNOLOGIES CO.,LTD - 2C17E0 - SysTEMES ET TECHNOLOGIES IDENTIFICATION (STid) + 14DDE5 + MPMKVVCL - CC3296 - Huawei Device Ltd + 001A09 + Wayfarer Transit Systems Ltd - 98CDAC - Espressif Inc. + 742344 + Xiaomi Communications Co Ltd - 808AF7 - Nanoleaf + E492FB + Samsung Electronics Co.,Ltd - B03DC2 - Wasp artificial Intelligence(Shenzhen) Ltd + 6CB7F4 + Samsung Electronics Co.,Ltd - C84D34 - LIONS Taiwan Technology Inc. + 181EB0 + Samsung Electronics Co.,Ltd - 446FF8 - Dyson Limited + 684898 + Samsung Electronics Co.,Ltd - 6C1B3F - MiraeSignal Ltd + 3423BA + SAMSUNG ELECTRO-MECHANICS(THAILAND) - 28AFFD - Cisco Systems Inc. + 400E85 + SAMSUNG ELECTRO-MECHANICS(THAILAND) - 9C7613 - Ring LLC + E09DFA + Wanan Hongsheng Electronic Co.Ltd - 449BC1 - Huawei Technologies Ltd + 1489FD + Samsung Electronics Co.,Ltd - 2025D2 - Fiberhome Telecommunication Technologies Ltd + BC851F + Samsung Electronics Co.,Ltd - 28F49B - Leetek + B85E7B + Samsung Electronics Co.,Ltd - 1842D4 - Wuhan Hosan Telecommunication Technology Ltd + 2C4401 + Samsung Electronics Co.,Ltd - A8637D - D-Link International + B8D9CE + Samsung Electronics Co.,Ltd - 2C43BE - Sunnovo International Limited + 1C66AA + Samsung Electronics Co.,Ltd - 5810B7 - Infinix mobility limited + 5C3C27 + Samsung Electronics Co.,Ltd - B02491 - Huawei Device Ltd + BC72B1 + Samsung Electronics Co.,Ltd - 98751A - Huawei Device Ltd + 78F7BE + Samsung Electronics Co.,Ltd - 1C9180 - Apple + 70A84C + MONAD., Inc. - 4CB910 - Apple + 84C7EA + Sony Corporation - B48901 - Huawei Technologies Ltd + 24E43F + Wenzhou Kunmei Communication Technology Co.,Ltd. - E0925C - Apple + D013FD + LG Electronics (Mobile Communications) - EC153D - Beijing Yaxunhongda Technology Ltd + 88797E + Motorola Mobility LLC, a Lenovo Company - D8A35C - Samsung Electronics Ltd + 305890 + Frontier Silicon Ltd - C09296 - ZTE Corporation + 708BCD + ASUSTek COMPUTER INC. - 50E24E - ZTE Corporation + 2CAC44 + CONEXTOP - 4C7766 - Shenzhen Mercury Communication Technologies Ltd + 606405 + Texas Instruments - 78E36D - Espressif Inc. + 00562B + Cisco Systems, Inc - 145AFC - Liteon Technology Corporation + E8FD90 + Turbostor - 1CA0EF - IEEE Registration Authority + 1899F5 + Sichuan Changhong Electric Ltd. - 001885 - Motorola Solutions Inc. + 18ABF5 + Ultra Electronics Electrics - D8E72B - Netscout Systems Inc + B03EB0 + MICRODIA Ltd. - 18BFB3 - Samsung Electronics Ltd Memory Division + 0025C3 + 21168 - 2C8DB1 - Intel Corporation + 000F57 + CABLELOGIC Co., Ltd. - 586C25 - Intel Corporation + 000342 + Nortel Networks - 082CED - Technity Solutions Inc. + 001283 + Nortel Networks - 34865D - Espressif Inc. + 0011F9 + Nortel Networks - B4E3F9 - Silicon Laboratories + 10E68F + KWANGSUNG ELECTRONICS KOREA CO.,LTD. - A49BCD - Cisco Systems Inc. + 4CFACA + Cambridge Industries(Group) Co.,Ltd. - 042728 - Microsoft Corporation + A48269 + Datrium, Inc. - 2066CF - Freebox SAS + 001158 + Nortel Networks - 2CC81B - Routerboard.com + 000F6A + Nortel Networks - 88E056 - Huawei Technologies Ltd + 000E62 + Nortel Networks - D07D33 - Huawei Device Ltd + 000CF8 + Nortel Networks - C0E1BE - Huawei Technologies Ltd + 000997 + Nortel Networks - D035E5 - EM Microelectronic + 001CEB + Nortel Networks - 9096F3 - Buffalo Inc. + 001C17 + Nortel Networks - 540E58 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 001A8F + Nortel Networks - 5C648E - ZyXEL Communications Corp + 001591 + RLW Inc. - 30E396 - Huawei Device Ltd + 00182E + XStreamHD - C4A151 - Sichuan Tianyi Comheart Telecom Ltd + 0026F1 + ProCurve Networking by HP - 7847E3 - Sichuan Tianyi Comheart Telecom Ltd + 380DD4 + Primax Electronics Ltd. - ECF8EB - Sichuan Tianyi Comheart Telecom Ltd + 98FDB4 + Primax Electronics Ltd. - F092B4 - Sichuan Tianyi Comheart Telecom Ltd + D8C46A + Murata Manufacturing Co., Ltd. - F44E38 - Olibra LLC + D8FB68 + Cloud Corner Ltd. - 2C6373 - Sichuan Tianyi Comheart Telecom Ltd + 685388 + P&S Technology - A0D722 - Samsung Electronics Ltd + 14C1FF + ShenZhen QianHai Comlan communication Co.,LTD - 5049B0 - Samsung Electronics Ltd + ECFAAA + The IMS Company - E805DC - Verifone Inc. + 0014C7 + Nortel Networks - 107BCE - Nokia + 001DAF + Nortel Networks - C8059E - Hefei Symboltek Ltd + 888322 + Samsung Electronics Co.,Ltd - 34FCA1 - Micronet union Technology(Chengdu) Ltd + E89309 + Samsung Electronics Co.,Ltd - 2897B8 - myenergi Ltd + 982F3C + Sichuan Changhong Electric Ltd. - 48062B - Private + F00786 + Shandong Bittel Electronics Co., Ltd - B0A7B9 - TP-Link Corporation Limited + 00D0F6 + Nokia - 6C5AB0 - TP-Link Corporation Limited + 54A619 + Alcatel-Lucent Shanghai Bell Co., Ltd - 4CF5DC - Hangzhou Hikvision Digital Technology Ltd + 38F8CA + OWIN Inc. - 60E6F0 - Wistron Neweb Corporation + 002105 + Alcatel-Lucent IPD - 201F3B - Google Inc. + 0017D1 + Nortel Networks - B825B5 - Trakm8 Ltd + 2057AF + Shenzhen FH-NET OPTOELECTRONICS CO.,LTD - 20D276 - Itel Mobile Limited + 54DC1D + Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd - 08A842 - Huawei Device Ltd + 6CD032 + LG Electronics - C8F5D6 - IEEE Registration Authority + 94D469 + Cisco Systems, Inc - 405899 - Logitech Far East + 882BD7 + ADDÉNERGIE TECHNOLOGIES - 8C4DEA - Cerio Corporation + C0E42D + TP-LINK TECHNOLOGIES CO.,LTD. - 04B9E3 - Samsung Electronics Ltd + 8CA6DF + TP-LINK TECHNOLOGIES CO.,LTD. - 9843FA - Intel Corporation + 8416F9 + TP-LINK TECHNOLOGIES CO.,LTD. - 94AA0A - Fiberhome Telecommunication Technologies Ltd + 18D6C7 + TP-LINK TECHNOLOGIES CO.,LTD. - 7CF462 - Beijing Huawoo Technologies Ltd + 0090CC + PLANEX COMMUNICATIONS INC. - C45E5C - Huawei Technologies Ltd + 0022CF + PLANEX COMMUNICATIONS INC. - E85C0A - Cisco Systems Inc. - - - 2C6DC1 - Intel Corporation - - - 70B950 - Texas Instruments + E417D8 + 8BITDO TECHNOLOGY HK LIMITED - D09FD9 - IEEE Registration Authority + 9CD332 + PLC Technology Ltd - 54C250 - Iskratel d.o.o. + 64899A + LG Electronics (Mobile Communications) - 00FAB6 - Kontakt Micro-Location Sp z o.o. + F8A9D0 + LG Electronics (Mobile Communications) - D01769 - Murata Manufacturing Ltd + CCFA00 + LG Electronics (Mobile Communications) - A0B086 - Hirschmann Automation and Control GmbH + 74A722 + LG Electronics (Mobile Communications) - 30B346 - Cjsc Norsi-Trans + F01C13 + LG Electronics (Mobile Communications) - 20C19B - Intel Corporation + A816B2 + LG Electronics (Mobile Communications) - A8556A - 3S System Technology Inc. + 64BC0C + LG Electronics (Mobile Communications) - 000B3A - Pesa + 344DF7 + LG Electronics (Mobile Communications) - 5CE42A - Intel Corporation + 583F54 + LG Electronics (Mobile Communications) - 1874E2 + B0C5CA IEEE Registration Authority - F0C814 - Shenzhen Bilian Electronic Ltd + 7419F8 + IEEE Registration Authority - CC3ADF - Neptune Technology Group Inc. + 001BC5 + IEEE Registration Authority - 68EC8A - Private + 78C3E9 + Samsung Electronics Co.,Ltd - 3C62F0 - Sercomm Corporation. + 8C1ABF + Samsung Electronics Co.,Ltd - 983B67 - DWnet Technologies(Suzhou) Corporation + 30CBF8 + Samsung Electronics Co.,Ltd - 58355D - Huawei Device Ltd + A0CBFD + Samsung Electronics Co.,Ltd - AC7E01 - Huawei Device Ltd + E45D75 + Samsung Electronics Co.,Ltd - 6C9392 - BEKO Technologies GmbH + 000031 + QPSX COMMUNICATIONS, LTD. - FC8A3D - ZTE Corporation + 000E1E + QLogic Corporation - F8F082 - Nagtech LLC + 0014D1 + TRENDnet, Inc. - 8C1F64 - IEEE Registration Authority + C01ADA + Apple, Inc. - 085A11 - D-Link International + 00121C + PARROT SA - 50325F - Silicon Laboratories + 9003B7 + PARROT SA - F47B09 - Intel Corporation + 90C682 + IEEE Registration Authority - E87829 + 58FCDB IEEE Registration Authority - EC9468 - Meta System SPA + 001C14 + VMware, Inc. - 1C4190 - Universal Electronics Inc. + 005056 + VMware, Inc. - 64C403 - Quectel Wireless Solutions Ltd + 0010C1 + OI ELECTRIC CO.,LTD - A0E453 - Sony Corporation + 38A28C + SHENZHEN RF-LINK TECHNOLOGY CO.,LTD. - 30A8DB - Sony Corporation + A09E1A + Polar Electro Oy - 848EDF - Sony Corporation + B4A5EF + Sercomm Corporation. - 584822 - Sony Corporation + 849D64 + SMC Corporation - C025A5 - Dell Inc. + 0080F7 + Zenith Electronics Corporation - B4C810 - Umpi srl + 483C0C + HUAWEI TECHNOLOGIES CO.,LTD - 485A67 - Shaanxi Ruixun Electronic Information Technology Ltd + 208756 + SIEMENS AG - 18002D - Sony Corporation + 74B472 + CIESSE - D05162 + FCF152 Sony Corporation - 90C115 - Sony Corporation + 309BAD + BBK EDUCATIONAL ELECTRONICS CORP.,LTD. - 5CB524 - Sony Corporation + 68B35E + Shenzhen Neostra Technology Co.Ltd - 58170C - Sony Corporation + 1CD6BD + LEEDARSON LIGHTING CO., LTD. - 44D5CC - Amazon Technologies Inc. + D0D94F + IEEE Registration Authority - 9C5CF9 - Sony Corporation + 506583 + Texas Instruments - 84C7EA - Sony Corporation + B09122 + Texas Instruments - 387862 - Sony Corporation + 9857D3 + HON HAI-CCPBG PRECISION IND.CO.,LTD. - 0025E7 - Sony Corporation + AC0481 + Jiangsu Huaxing Electronics Co., Ltd. - 0024EF - Sony Corporation + FCF528 + Zyxel Communications Corporation - 0016B8 - Sony Corporation + 00A0C5 + Zyxel Communications Corporation - 64C394 - Huawei Technologies Ltd + 408805 + Motorola Mobility LLC, a Lenovo Company - 945C9A - Apple + 60C0BF + ON Semiconductor - 00F39F - Apple + 001E04 + Hanson Research Corporation - 3039A9 - Hongshan Information Science and Technology (HangZhou) Ltd + 98398E + Samsung Electronics Co.,Ltd - 1C573E - Altice Labs S.A. + D0FCCC + Samsung Electronics Co.,Ltd - D0167C - eero Inc. + 24E271 + Qingdao Hisense Communications Co.,Ltd. - A85B36 - IEEE Registration Authority + BC6010 + Qingdao Hisense Communications Co.,Ltd. - 4C77CB - Intel Corporation + F0F644 + Whitesky Science & Technology Co.,Ltd. - 9C6BF0 - Shenzhen Yipingfang Network Technology Ltd + 7C6AF3 + Integrated Device Technology (Malaysia) Sdn. Bhd. - 44953B - RLTech India Private Limited + 20F17C + HUAWEI TECHNOLOGIES CO.,LTD - 84144D - Intel Corporation + 346AC2 + HUAWEI TECHNOLOGIES CO.,LTD - 20B868 - Motorola Mobility LLC, a Lenovo Company + C41CFF + Vizio, Inc - 289C6E - Shanghai High-Flying Electronics Technology Ltd + 44D1FA + Shenzhen Yunlink Technology Co., Ltd - 84F703 - Espressif Inc. + C09727 + SAMSUNG ELECTRO-MECHANICS(THAILAND) - 2C1165 - Silicon Laboratories + DC293A + Shenzhen Nuoshi Technology Co., LTD. - B41CAB - ICR Inc. + 40562D + Smartron India Pvt ltd - 1C2A8B - Nokia + E46251 + HAO CHENG GROUP LIMITED - 945AFC - Amazon Technologies Inc. + A0D385 + AUMA Riester GmbH & Co. KG - BCD7D4 - Roku Inc. + 1414E6 + Ningbo Sanhe Digital Co.,Ltd - AC0BFB - Espressif Inc. + 3876D1 + Euronda SpA - DCED83 - Beijing Xiaomi Mobile Software Ltd + 0C5101 + Apple, Inc. - 00D76D - Intel Corporation + 2CF0A2 + Apple, Inc. - 508E49 - Xiaomi Communications Ltd + 68FB7E + Apple, Inc. - 8CAACE - Xiaomi Communications Ltd + 84A134 + Apple, Inc. - 705FA3 - Xiaomi Communications Ltd + 001A34 + Konka Group Co., Ltd. - FCD908 - Xiaomi Communications Ltd + 0011FC + HARTING Electronics GmbH - 30B037 - New H3C Technologies Ltd + 002389 + Hangzhou H3C Technologies Co., Limited - FC122C - Huawei Technologies Ltd + 3CE5A6 + Hangzhou H3C Technologies Co., Limited - BC3329 - Sony Interactive Entertainment Inc. + D8209F + Cubro Acronet GesmbH - A88940 - Huawei Device Ltd + 8C7716 + LONGCHEER TELECOMMUNICATION LIMITED - CC312A - Huizhou TCL Communication Electron Ltd + C4693E + Turbulence Design Inc. - DCB72E - Xiaomi Communications Ltd + 009569 + LSD Science and Technology Co.,Ltd. - 38B800 - Wistron Neweb Corporation + B0CF4D + MI-Zone Technology Ireland - 6CD1E5 - Huawei Technologies Ltd + 289AFA + TCT mobile ltd - 300EB8 - LG Electronics + 5CDD70 + Hangzhou H3C Technologies Co., Limited - 0C0E76 - D-Link International + 3C8C40 + Hangzhou H3C Technologies Co., Limited - 703E97 - Iton Technology Corp. + A067BE + Sicon srl - 104738 - Nokia Shanghai Bell Ltd + 6C2483 + Microsoft Mobile Oy - 6C11B3 - Wu Qi Technologies,Inc. + 6891D0 + IEEE Registration Authority - A0941A - Guangdong Oppo Mobile Telecommunications Corp Ltd + 002582 + Maksat Technologies (P) Ltd - 1C2CE0 - Shanghai Mountain View Silicon + 48C049 + Broad Telecom SA - 000CEC - Orolia USA + AC6FBB + TATUNG Technology Inc. - 08FA28 - Huawei Technologies Ltd + 001C41 + scemtec Transponder Technology GmbH - F4B19C - AltoBeam (China) Inc. + 146308 + JABIL CIRCUIT (SHANGHAI) LTD. - A8D081 - Huawei Device Ltd + 001E25 + INTEK DIGITAL - 740CEE - Huawei Device Ltd + 00E0CF + INTEGRATED DEVICE - 6CB4FD - Huawei Device Ltd + 0060B1 + Input/Output, Inc. - 640E9B - Ishida Medical Ltd + 547F54 + INGENICO - 24F603 - Huawei Technologies Ltd + 90C7D8 + zte corporation - F8CA85 - NEC Corporation + 003A7D + Cisco Systems, Inc - 1C9DC2 - Espressif Inc. + 001A45 + GN Netcom A/S - C4EA1D - Technicolor Delivery Technologies Belgium NV + 002088 + GLOBAL VILLAGE COMMUNICATION - A491B1 - Technicolor Delivery Technologies Belgium NV + 001CD7 + Harman/Becker Automotive Systems GmbH - D4351D - Technicolor Delivery Technologies Belgium NV + 001921 + Elitegroup Computer Systems Co.,Ltd. - ECC1AB - Guangzhou Shiyuan Electronic Technology Company Limited + 0016EC + Elitegroup Computer Systems Co.,Ltd. - EC937D - Technicolor CH USA Inc. + 000795 + Elitegroup Computer Systems Co.,Ltd. - 18FC26 - Qorvo International Pte Ltd + 541379 + Hon Hai Precision Ind. Co.,Ltd. - 589835 - Technicolor Delivery Technologies Belgium NV + 844076 + Drivenets - 906A94 - hangzhou huacheng network technology Ltd + 00065F + ECI Telecom Ltd. - 100C29 - Shenzhen NORCO lntelligent Technology Ltd + 00208F + ECI Telecom Ltd. - 283613 - IEEE Registration Authority + FC0F4B + Texas Instruments - 78524A - Optonic GmbH + D4883F + HDPRO CO., LTD. - 00CE30 - Express LUCK Industrial Ltd + 60B617 + Fiberhome Telecommunication Technologies Co.,LTD - C46E33 - Zhong Ge Smart Technology Ltd + 18A3E8 + Fiberhome Telecommunication Technologies Co.,LTD - 5C8382 - Nokia + DC9C9F + Shenzhen YOUHUA Technology Co., Ltd - 7432C2 - Kyolis + 74DFBF + Liteon Technology Corporation - 44EB2E - Alpsalpine Co Ltd + F03E90 + Ruckus Wireless - 0CAAEE - Ansjer Electronics Ltd + 00185C + EDSLAB Technologies - FCA64C - Alibaba cloud Computing Ltd + 000E2E + Edimax Technology Co. Ltd. - E069BA - Cisco Systems Inc. + 84AD58 + HUAWEI TECHNOLOGIES CO.,LTD - 2436DA - Cisco Systems Inc. + 58605F + HUAWEI TECHNOLOGIES CO.,LTD - 2037A5 - Apple + D8D723 + IDS, Inc - DCB54F - Apple + 00A0F4 + GE - 4CEBD6 - Espressif Inc. + AC0D1B + LG Electronics (Mobile Communications) - 008A76 - Apple + F0D1B8 + LEDVANCE - F4239C - Sernet (Suzhou) Technologies Corporation + 986D35 + IEEE Registration Authority - D8A6F0 - Wu Qi Technologies,Inc. + 88795B + Konka Group Co., Ltd. - 08E4DF - Shenzhen Sande Dacom Electronics Ltd + B07E70 + Zadara Storage Ltd. - EC7C2C - Huawei Technologies Ltd + 0080B1 + SOFTCOM A/S - 145808 - Taicang T&W Electronics + 202DF8 + Digital Media Cartridge Ltd. - 105A17 - Tuya Smart Inc. + FC2FAA + Nokia - B8374A - Apple + 081F71 + TP-LINK TECHNOLOGIES CO.,LTD. - 8C3DB1 - Beijing H-IoT Technology Ltd + 5CCA1A + Microsoft Mobile Oy - 546706 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 741E93 + Fiberhome Telecommunication Technologies Co.,LTD - 1055E4 - Shenzhen Skyworth Digital Technology Ltd + 0C5A9E + Wi-SUN Alliance - C0F535 - AMPAK Technology,Inc. + D8803C + Anhui Huami Information Technology Company Limited - C4E532 - Arcadyan Corporation + 10D0AB + zte corporation - F8B54D - Intel Corporation + 0004C6 + YAMAHA MOTOR CO.,LTD - 6401FB - Landis+Gyr GmbH + 981FB1 + Shenzhen Lemon Network Technology Co.,Ltd - 207BD2 - ASIX Electronics Corporation + 202D07 + Samsung Electronics Co.,Ltd - 182DF7 - JY Company + B44BD2 + Apple, Inc. - EC2C11 - CWD Innovation Limited + DC415F + Apple, Inc. - F03575 - Hui Zhou Gaoshengda Technology Ltd + 641225 + Cisco Systems, Inc - 908175 - Samsung Electronics Ltd + 7864E6 + Green Motive Technology Limited - 307467 - Samsung Electronics Ltd + 3CBEE1 + NIKON CORPORATION - F0CD31 - Samsung Electronics Ltd + 18C501 + SHENZHEN GONGJIN ELECTRONICS CO.,LT - 38A8CD - IEEE Registration Authority + 00A0B8 + NetApp - E444E5 - Extreme Networks Inc. + 102AB3 + Xiaomi Communications Co Ltd - 545284 - Huawei Device Ltd + 40D357 + Ison Technology Co., Ltd. - 646140 - Huawei Device Ltd + A0B9ED + Skytap - C4170E - Huawei Device Ltd + 0034DA + LG Electronics (Mobile Communications) - 687724 - TP-Link Technologies Ltd + 006016 + CLARIION - 2067E0 - Shenzhen iComm Semiconductor Ltd + 00C88B + Cisco Systems, Inc - 7C8334 - IEEE Registration Authority + 0009D2 + Mai Logic Inc. - D0C35A - Jabil Circuit de Chihuahua + 24C3F9 + Securitas Direct AB - 84B630 - Sichuan Tianyi Comheart Telecom Ltd + 2C21D7 + IMAX Corporation - 58C7AC - New H3C Technologies Ltd + E8B2AC + Apple, Inc. - E4C0E2 - Sagemcom Broadband SAS + E49A79 + Apple, Inc. - D86C5A - HUMAX Ltd + 30A9DE + LG Innotek - 249745 - Huawei Technologies Ltd + F01B6C + vivo Mobile Communication Co., Ltd. - 4C3FA7 - uGrid Network Inc. + 4C2578 + Nokia Corporation - B898AD - Motorola Mobility LLC, a Lenovo Company + BCC6DB + Nokia Corporation - 94FF3C - Fortinet Inc. + 60A8FE + Nokia Solutions and Networks GmbH & Co. KG - 7052D8 - Itel Mobile Limited + 94C960 + Zhongshan B&T technology.co.,ltd - 08FA79 - Vivo Mobile Communication Ltd + F45C89 + Apple, Inc. - 1CAE3E - IEEE Registration Authority + 20768F + Apple, Inc. - 001D5B - Tecvan Informatica Ltda + 9C5CF9 + Sony Corporation - 9C2BA6 - Ruijie Networks Ltd + 0011D1 + Soft Imaging System GmbH - 941457 - Shenzhen Sundray Technologies Company Limited + 98D686 + Chyi Lee industry Co., ltd. - 64B94E - Dell Technologies + 8CC661 + Current, powered by GE - EC2BEB - Amazon Technologies Inc. + 88A084 + Formation Data Systems - 5447E8 - Syrotech Networks Ltd + 74C330 + SHENZHEN FAST TECHNOLOGIES CO.,LTD - 3C5576 - Cloud Network Technology Singapore PTE Ltd + 001D3B + Nokia Danmark A/S - 0CCAFB - TPVision Europe B.V + 001DFD + Nokia Danmark A/S - BC5729 - Shenzhen KKM Ltd + 001E3B + Nokia Danmark A/S - E48210 - Huawei Technologies Ltd + 001EA4 + Nokia Danmark A/S - F8F7B9 - Huawei Technologies Ltd + 0026CC + Nokia Danmark A/S - 185345 - Nokia + 000EED + Nokia Danmark A/S - 38A9EA - Private + 00119F + Nokia Danmark A/S - 0816D5 - Goertek Inc. + 001A16 + Nokia Danmark A/S - 1C568E - Zioncom Electronics (Shenzhen) Ltd + DCB3B4 + Honeywell Environmental & Combustion Controls (Tianjin) Co., Ltd. - E01F2B - Nokia Solutions and Networks GmbH & Co. KG + 00247C + Nokia Danmark A/S - A08222 - Qingdao Haier Technology Ltd + 001A89 + Nokia Danmark A/S - 28563A - Fiberhome Telecommunication Technologies Ltd + 001ADC + Nokia Danmark A/S - 04C461 - Murata Manufacturing Ltd + 0025CF + Nokia Danmark A/S - AC8226 - Qingdao Haier Technology Ltd + 0021AB + Nokia Danmark A/S - 4448FF - Qingdao Haier Technology Ltd + 001FDE + Nokia Danmark A/S - A8C266 - HUMAX Ltd + 001FDF + Nokia Danmark A/S - F84E17 - Sony Corporation + 547975 + Nokia Corporation - 540F57 - Silicon Laboratories + A87B39 + Nokia Corporation - C8CB9E - Intel Corporation + 002266 + Nokia Danmark A/S - 70A741 - Ubiquiti Networks Inc. + 0021FE + Nokia Danmark A/S - D4D7CF - Realme Chongqing Mobile Telecommunications Corp Ltd + 702559 + CyberTAN Technology Inc. - F4E4D7 - Fujian Star-NET Communication Ltd + 001D20 + Comtrend Corporation - E84727 - Quectel Wireless Solutions Ltd + 08373D + Samsung Electronics Co.,Ltd - D4E2CB - Technicolor CH USA Inc. + C488E5 + Samsung Electronics Co.,Ltd - 28C538 - Apple + 607EDD + Microsoft Mobile Oy - 0499B9 - Apple + A8A089 + Tactical Communications - F84D89 - Apple + 48365F + Wintecronics Ltd. - 78028B - Apple + 000BCA + DATAVAN TC - BCDB09 - Cisco Meraki + C477AB + Beijing ASU Tech Co.,Ltd - 0434F6 - Motorola (Wuhan) Mobility Technologies Communication Ltd + 0C75BD + Cisco Systems, Inc - 14019C - Ubyon Inc. + 300D43 + Microsoft Mobile Oy - F89522 - Huawei Technologies Ltd + 5056BF + Samsung Electronics Co.,Ltd - F8B132 - Huawei Technologies Ltd + 90F1AA + Samsung Electronics Co.,Ltd - 546925 - PS Inodic Ltd + 1077B1 + Samsung Electronics Co.,Ltd - E8B5D0 - Dell Inc. + 001FC7 + Casio Hitachi Mobile Communications Co., Ltd. - E8CBED - Chipsea Technologies(Shenzhen) Corp. + FCC734 + Samsung Electronics Co.,Ltd - 7813E0 - Fujian Star-NET Communication Ltd + 8425DB + Samsung Electronics Co.,Ltd - 4861EE - Samsung Electronics Ltd + B0EC71 + Samsung Electronics Co.,Ltd - A84B4D - Samsung Electronics Ltd + E458B8 + Samsung Electronics Co.,Ltd - 6007C4 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 088C2C + Samsung Electronics Co.,Ltd - 086F48 - Shenzhen iComm Semiconductor Ltd + A49A58 + Samsung Electronics Co.,Ltd - F4F309 - Samsung Electronics Ltd + 08EE8B + Samsung Electronics Co.,Ltd - 7857B0 - Gertec Brasil Ltda + 64B853 + Samsung Electronics Co.,Ltd - C4F122 - Nexar Ltd + 389496 + Samsung Electronics Co.,Ltd - 64BE63 - STORDIS GmbH + 00000E + FUJITSU LIMITED - 0CC6FD - Xiaomi Communications Ltd + 000B5D + FUJITSU LIMITED - 50DAD6 - Xiaomi Communications Ltd + 080581 + Roku, Inc. - 18B96E - Dongguan Liesheng Electronic Ltd + 74458A + Samsung Electronics Co.,Ltd - 546990 - Huawei Technologies Ltd + C4473F + HUAWEI TECHNOLOGIES CO.,LTD - D80A60 - Huawei Technologies Ltd + 00E063 + Cabletron Systems, Inc. - 3C869A - Huawei Technologies Ltd + 000DF3 + Asmax Solutions - 2C2768 - Huawei Technologies Ltd + 000DB6 + Broadcom - D07880 - Fiberhome Telecommunication Technologies Ltd + 000AF7 + Broadcom - 14CB65 - Microsoft Corporation + D40129 + Broadcom - 3408E1 - Texas Instruments + 001D00 + Brivo Systems, LLC - 5058B0 - Hunan Greatwall Computer System Ltd + 0020D6 + Breezecom, Ltd. - E06CF6 - ESSENCORE limited + 68ED43 + BlackBerry RTS - 78C62B - Fujian Star-NET Communication Ltd + 70AAB2 + BlackBerry RTS - D46624 - Cisco Systems Inc. + 000F86 + BlackBerry RTS - 9C9019 - Beyless + 00040E + AVM GmbH - 3CE038 - Omnifi Inc. + 9CC7A6 + AVM GmbH - 001682 - OMS Motion + A06391 + NETGEAR - D4F98D - Espressif Inc. + 200CC8 + NETGEAR - 04CE09 - Shenzhen Skyworth Digital Technology Ltd + 0CA42A + OB Telecom Electronic Technology Co., Ltd - 1C869A - Samsung Electronics Ltd + 40BA61 + ARIMA Communications Corp. - D8FBD6 - Amazon Technologies Inc. + 0011F5 + ASKEY COMPUTER CORP - 9C47F9 - LJU Automatisierungstechnik GmbH + 0016E3 + ASKEY COMPUTER CORP - 70A8D3 - Intel Corporation + E839DF + ASKEY COMPUTER CORP - 2C3358 - Intel Corporation + 0024D2 + ASKEY COMPUTER CORP - 086AE5 - Amazon Technologies Inc. + B4EEB4 + ASKEY COMPUTER CORP - A81710 - Bouffalo Lab (Nanjing) Ltd + D0DF9A + Liteon Technology Corporation - 206296 - Shenzhen Malio Technology Ltd + 1C659D + Liteon Technology Corporation - A08069 - Intel Corporation + 3010B3 + Liteon Technology Corporation - A06720 - China Dragon Technology Limited + E8C74F + Liteon Technology Corporation - 94C9B7 - IEEE Registration Authority + D05349 + Liteon Technology Corporation - 605699 - Private + E874E6 + ADB Broadband Italia - E8EECC - Fantasia Trading LLC + 0020E0 + Actiontec Electronics, Inc - 5C16C7 - Arista Networks + 002662 + Actiontec Electronics, Inc - 4CE0DB - Xiaomi Communications Ltd + 948815 + Infinique Worldwide Inc - 7C33F9 - Huawei Technologies Ltd + 5CB524 + Sony Corporation - 541651 - Ruijie Networks Ltd + 90C115 + Sony Corporation - 7087A7 - Murata Manufacturing Ltd + D05162 + Sony Corporation - AC0425 - ball-b GmbH Co KG + 18002D + Sony Corporation - 04BD97 - Cisco Systems Inc. + 280DFC + Sony Interactive Entertainment Inc. - F03A4B - Bloombase Inc. + 0016B8 + Sony Corporation - 0002A3 - Hitachi Energy Switzerland Ltd + 0024EF + Sony Corporation - 38F7F1 - Huawei Device Ltd + 0025E7 + Sony Corporation - 4076A9 - Huawei Device Ltd + 58170C + Sony Corporation - F438C1 - Huawei Device Ltd + 701A04 + Liteon Technology Corporation - 28EA2D - Apple + 48D224 + Liteon Technology Corporation - 209BE6 - Guangzhou Shiyuan Electronic Technology Company Limited + 20689D + Liteon Technology Corporation - B8E60C - Apple + 002553 + ADB Broadband Italia - 48352B - Apple + 00193E + ADB Broadband Italia - 4CE6C0 - Apple + 000827 + ADB Broadband Italia - 3888A4 - Apple + D0E44A + Murata Manufacturing Co., Ltd. - 44DA30 - Apple + 080046 + Sony Corporation - 84160C - Broadcom Limited + 4C14A3 + TCL Technoly Electronics (Huizhou) Co., Ltd. - 74E6B8 - LG Electronics + 4CB0E8 + Beijing RongZhi xinghua technology co., LTD - 28D0F5 - Ruijie Networks Ltd + 74DAEA + Texas Instruments - 941865 - Netgear + D887D5 + Leadcore Technology CO.,LTD - C89BD7 - Realme Chongqing Mobile Telecommunications Corp Ltd + 00F28B + Cisco Systems, Inc - 28B133 - SHINEMAN(Shenzhen) Tech. Cor Ltd + ECF00E + AboCom - D004B0 - Samsung Electronics Ltd + 00E098 + AboCom - 98B08B - Samsung Electronics Ltd + 742F68 + AzureWave Technology Inc. - A8587C - Shoogee GmbH & Co. KG + 384FF0 + AzureWave Technology Inc. - 9C2595 - Samsung Electronics Ltd + 3413E8 + Intel Corporate - 90F260 - Shenzhen Honesty Electronics Ltd + 34E6AD + Intel Corporate - 1889CF - Tecno Mobile Limited + 081196 + Intel Corporate - 985F4F - Tongfang Computer Ltd + 183DA2 + Intel Corporate - 34F86E - Parker Hannifin Corporation + 809B20 + Intel Corporate - 0CAEBD - Edifier International + B4B676 + Intel Corporate - 6CD869 - Guangzhou Sat Infrared Ltd + 3CA9F4 + Intel Corporate - 381EC7 - Chipsea Technologies(Shenzhen) Corp. + 9C4E36 + Intel Corporate - 089204 - Dell Inc. + B88A60 + Intel Corporate - 40679B - Shenzhen Skyworth Digital Technology Ltd + 78FF57 + Intel Corporate - F0A654 - Cloud Network Technology Singapore PTE Ltd + 002710 + Intel Corporate - 3CCFB4 - Telink Semiconductor (Shanghai) Ltd + 001B21 + Intel Corporate - 043CE8 - Shenzhen SuperElectron Technology Ltd + 18FF0F + Intel Corporate - A8E621 - Amazon Technologies Inc. + A48E0A + DeLaval International AB - E831CD - Espressif Inc. + AC2B6E + Intel Corporate - 88D039 - Tonly Technology Ltd + 000A8A + Cisco Systems, Inc - E8F375 - Nokia + 9C3583 + Nipro Diagnostics, Inc - 103711 - Norbit ITS + C06118 + TP-LINK TECHNOLOGIES CO.,LTD. - C0886D - Securosys SA + 002314 + Intel Corporate - 24813B - Cisco Systems Inc. + 340286 + Intel Corporate - C409B7 - Juniper Networks + 001CBF + Intel Corporate - 0CB8E8 - Renesas Electronics (Penang) Sdn. Bhd. + 34DE1A + Intel Corporate - EC5C84 - Murata Manufacturing Ltd + E8B1FC + Intel Corporate - BC9B5E - Hangzhou Hikvision Digital Technology Ltd + CC3D82 + Intel Corporate - 487412 - OnePlus Technology (Shenzhen) Ltd + F8E079 + Motorola Mobility LLC, a Lenovo Company - B0F208 - AVM Audiovisuelles Marketing und Computersysteme GmbH + CCC3EA + Motorola Mobility LLC, a Lenovo Company - F0B2B9 - Intel Corporation + 40786A + Motorola Mobility LLC, a Lenovo Company - A069D9 - New H3C Technologies Ltd + D02212 + IEEE Registration Authority - 20FE00 - Amazon Technologies Inc. + 100723 + IEEE Registration Authority - F421AE - Shanghai Xiaodu Technology Limited + A44F29 + IEEE Registration Authority - F412FA - Espressif Inc. + 74F8DB + IEEE Registration Authority - DC99FE - Armatura LLC + A43BFA + IEEE Registration Authority - 9CF155 - Nokia + 001F3C + Intel Corporate - E47305 - Shenzhen INVT Electric Ltd + 002315 + Intel Corporate - B01B4B - Invisible Fun Studio Limited + 00166F + Intel Corporate - 604F5B - Huawei Device Ltd + 0019D1 + Intel Corporate - 14DCE2 - THALES AVS France + 0019D2 + Intel Corporate - 78FBD8 - Apple + C0830A + 2Wire Inc - A4C337 - Apple + 383BC8 + 2Wire Inc - B0F1D8 - Apple + 60FE20 + 2Wire Inc - D0880C - Apple + 00183F + 2Wire Inc - 1C57DC - Apple + 002456 + 2Wire Inc - 747446 - Google Inc. + 181E78 + Sagemcom Broadband SAS - 7820A5 - Nintendo Ltd + 0054BD + Swelaser AB - 2078CD - Apple + 20BB76 + COL GIOVANNI PAOLO SpA - 30D53E - Apple + 3CDD89 + SOMO HOLDINGS & TECH. CO.,LTD. - 5023A2 - Apple + 1801E3 + Bittium Wireless Ltd - 98698A - Apple + 001E4C + Hon Hai Precision Ind. Co.,Ltd. - 5046AE - Mercury Corporation + D8543A + Texas Instruments - B099D7 - Samsung Electronics Ltd + 649C8E + Texas Instruments - 90EB48 - Shanghai XinMiaoLink Technology Ltd + 102EAF + Texas Instruments - B4B742 - Amazon Technologies Inc. + 7C8EE4 + Texas Instruments - 78A03F - Amazon Technologies Inc. + B4EED4 + Texas Instruments - 50C1F0 - NXP Semiconductor (Tianjin) Ltd + 388602 + Flexoptix GmbH - F4848D - TP-Link Technologies Ltd + 00194B + Sagemcom Broadband SAS - 581122 - ASUSTek Computer Inc. + 149182 + Belkin International Inc. - 60BEB4 - S-Bluetech Ltd + C4EDBA + Texas Instruments - 90DF7D - Realme Chongqing Mobile Telecommunications Corp Ltd + 9059AF + Texas Instruments - A854A2 - Heimgard Technologies AS + BC6A29 + Texas Instruments - 742A8A - Shenzhen worldelite electronics Ltd + 847E40 + Texas Instruments - BC1D89 - Motorola Mobility LLC, a Lenovo Company + C83E99 + Texas Instruments - B87EE5 - Intelbras + 40984E + Texas Instruments - 94ABFE - Nokia + 0017EB + Texas Instruments - 74694A - Sichuan Tianyi Comheart Telecom Ltd + 0017E6 + Texas Instruments - 78152D - Union Chip Technology Limited + 001832 + Texas Instruments - 98A92D - New H3C Technologies Ltd + 3C2DB7 + Texas Instruments - 00A554 - Intel Corporation + D03761 + Texas Instruments - 0C8629 - IEEE Registration Authority + 9C8E99 + Hewlett Packard - 50DCD0 - Observint Technologies Inc. + 00195B + D-Link Corporation - E0036B - Samsung Electronics Ltd + 000F3D + D-Link Corporation - 1869D4 - Samsung Electronics Ltd + 24DA11 + NO NDA Inc - D4F0EA - Beijing Xiaomi Mobile Software Ltd + D0B33F + Shenzhen TINNO Mobile Technology Corp. - 5876AC - Sernet (Suzhou) Technologies Corporation + BCD1D3 + Shenzhen TINNO Mobile Technology Corp. - 80691A - Belkin International Inc. + EC2280 + D-Link International - 643172 - Zhejiang Hising Technology Ltd + 2400BA + HUAWEI TECHNOLOGIES CO.,LTD - D0FCD0 - HUMAX Ltd + 24DF6A + HUAWEI TECHNOLOGIES CO.,LTD - 20FADB - Huahao Kunpeng Technology (chengDu) Ltd + 40D855 + IEEE Registration Authority - 0C8B95 - Espressif Inc. + F4F5D8 + Google, Inc. - 685E1C - Texas Instruments + D83C69 + Shenzhen TINNO Mobile Technology Corp. - 38AB41 - Texas Instruments + B0C090 + Chicony Electronics Co., Ltd. - CC4792 - ASIX Electronics Corporation + 907F61 + Chicony Electronics Co., Ltd. - E046EE - Netgear + AC06C7 + ServerNet S.r.l. - DCBE49 - Itel Mobile Limited + 0059AC + KPN. B.V. - 9C9561 - Hui Zhou Gaoshengda Technology Ltd + 001735 + Intel Wireless Network Group - 9C4F5F - Google Inc. + 74AC5F + Qiku Internet Network Scientific (Shenzhen) Co., Ltd. - A02942 - Intel Corporation + 18AF61 + Apple, Inc. - 1071B3 - ZyXEL Communications Corp + 5CF938 + Apple, Inc. - F0D415 - Intel Corporation + 0C0535 + Juniper Systems - D4D853 - Intel Corporation + BC83A7 + SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD - 0463D0 - Huawei Device Ltd + BCEC23 + SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD - 14448F - Edgecore Networks Corporation + 788B77 + Standar Telecom - 3425BE - Amazon Technologies Inc. + 34AB37 + Apple, Inc. - C0EDE5 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 38CADA + Apple, Inc. - 10A562 - Iton Technology Corp. + 101F74 + Hewlett Packard - D4A3EB - Shenzhen iComm Semiconductor Ltd + 009C02 + Hewlett Packard - 9CBFCD - Huawei Technologies Ltd + 0019BB + Hewlett Packard - B89FCC - Huawei Technologies Ltd + 001F29 + Hewlett Packard - 9CE041 - Nokia + 780CB8 + Intel Corporate - 783486 - Nokia + 185E0F + Intel Corporate - 8C763F - ARRIS Group Inc. + 001635 + Hewlett Packard - 281293 - Honor Device Ltd + 0008C7 + Hewlett Packard - C0A938 - Huawei Technologies Ltd + 0010E3 + Hewlett Packard - 5C24E2 - Suzhou Denbom Electronic S&T Ltd + 000883 + Hewlett Packard - 64989E - Trinnov Audio + 8CDCD4 + Hewlett Packard - BCC746 - Hon Hai Precision Ind Ltd + DCFB02 + BUFFALO.INC - 30E8E4 - Qorvo International Pte Ltd + 8857EE + BUFFALO.INC - 000DA9 - Ingeteam + 00215A + Hewlett Packard - 30E090 - Genevisio Ltd + 00237D + Hewlett Packard - FCB97E - GE Appliances + 002655 + Hewlett Packard - 88034C - Weifang Goertek Electronics Ltd + 000D9D + Hewlett Packard - 48DC9D - Grandprint(Beijing) Technology Ltd + 001560 + Hewlett Packard - 64FD96 - Sagemcom Broadband SAS + 00207B + Intel Corporation - 7CECB1 - Apple + 001175 + Intel Corporation - 5CE91E - Apple + D4C9EF + Hewlett Packard - A8B0AE - BizLink Special Cables Germany GmbH + FC15B4 + Hewlett Packard - C8EBEC - Shenzhen YOUHUA Technology Ltd + 940937 + HUMAX Co., Ltd. - 047C16 - Micro-Star INTL Ltd + E84DD0 + HUAWEI TECHNOLOGIES CO.,LTD - E0D738 - WireStar Networks + 0C45BA + HUAWEI TECHNOLOGIES CO.,LTD - F8D027 - Seiko Epson Corporation + 20906F + Shenzhen Tencent Computer System Co., Ltd. - 5C666C - Guangdong Oppo Mobile Telecommunications Corp Ltd + 6CE3B6 + Nera Telecommunications Ltd. - 4C4BF9 - IEEE Registration Authority + EC5F23 + Qinghai Kimascend Electronics Technology Co. Ltd. - 1CEA0B - Edgecore Networks Corporation + 047D50 + Shenzhen Kang Ying Technology Co.Ltd. - 44EFBF - China Dragon Technology Limited + 54EFFE + Fullpower Technologies, Inc. - B81F5E - Apption Labs Limited + DCD321 + HUMAX Co., Ltd. - D81265 - Chongqing Fugui Electronics Ltd + 4482E5 + HUAWEI TECHNOLOGIES CO.,LTD - 4CB44A - NANOWAVE Technologies Inc. + 00234E + Hon Hai Precision Ind. Co.,Ltd. - 048C9A - Huawei Device Ltd + 2C8158 + Hon Hai Precision Ind. Co.,Ltd. - EC3CBB - Huawei Device Ltd + 8002DF + ORA Inc. - 8C3A7E - Universal Electronics Inc. + 2C233A + Hewlett Packard - 70441C - Shenzhen Kaifa Technology Ltd + 000A57 + Hewlett Packard - B47C59 - Jiangsu Hengxin Technology Ltd + 0001E7 + Hewlett Packard - 300D9E - Ruijie Networks Ltd + 0001E6 + Hewlett Packard - ECFA5C - Beijing Xiaomi Electronics Ltd + 00306E + Hewlett Packard - F8B46A - Hewlett-Packard Company + CC4463 + Apple, Inc. - BCB0E7 - Huawei Technologies Ltd + 6C72E7 + Apple, Inc. - 5434EF - Huawei Technologies Ltd + 741BB2 + Apple, Inc. - 88D5A8 - Itel Mobile Limited + 001D0F + TP-LINK TECHNOLOGIES CO.,LTD. - 208593 - IEEE Registration Authority + 3C4A92 + Hewlett Packard - ACE342 - Huawei Technologies Ltd + 002376 + HTC Corporation - 9017C8 - Huawei Technologies Ltd + 38E7D8 + HTC Corporation - E4922A - DBG Holdings Limited + 188796 + HTC Corporation - 2C641F - Vizio Inc. + B4CEF6 + HTC Corporation - 207759 - Optical Network Video Technologies (Shenzhen) Ltd + 7C7D3D + HUAWEI TECHNOLOGIES CO.,LTD - 54E7D5 - Sun Cupid Technology (HK) Ltd + 3CA82A + Hewlett Packard - 189088 - eero Inc. + 90489A + Hon Hai Precision Ind. Co.,Ltd. - 4C56DF - Targus US LLC + 0071CC + Hon Hai Precision Ind. Co.,Ltd. - 241510 - IEEE Registration Authority + B05B67 + HUAWEI TECHNOLOGIES CO.,LTD - 6C4D51 - Shenzhen Ceres Technology Ltd + CCA223 + HUAWEI TECHNOLOGIES CO.,LTD - 889D98 - Allied-telesisK.K. + 786A89 + HUAWEI TECHNOLOGIES CO.,LTD - DCF8B9 - ZTE Corporation + 14B968 + HUAWEI TECHNOLOGIES CO.,LTD - 18BF1C - Jiangsu Huitong Group Ltd + 882593 + TP-LINK TECHNOLOGIES CO.,LTD. - ACDE48 - Private + 001FE1 + Hon Hai Precision Ind. Co.,Ltd. - 0050C7 - Private + 10A5D0 + Murata Manufacturing Co., Ltd. - 002067 - Private + 0012F2 + Brocade Communications Systems LLC - 4801C5 - OnePlus Technology (Shenzhen) Ltd + 00051E + Brocade Communications Systems LLC - B4EE25 - Shenzhen Belon Technology Ltd + 384608 + zte corporation - C82B96 - Espressif Inc. + 4CAC0A + zte corporation - 98523D - Sunitec Enterprise Ltd + B4B362 + zte corporation - D015A6 - Aruba Networks HP + B075D5 + zte corporation - 000163 - Cisco Systems Inc. + 6CE873 + TP-LINK TECHNOLOGIES CO.,LTD. - 205F3D - Cambridge Communication Systems Ltd + C46E1F + TP-LINK TECHNOLOGIES CO.,LTD. - 04819B - BSkyB Ltd + 50FA84 + TP-LINK TECHNOLOGIES CO.,LTD. - E00084 - Huawei Technologies Ltd + 44B32D + TP-LINK TECHNOLOGIES CO.,LTD. - 2CA89C - Creatz Inc. + 0023CD + TP-LINK TECHNOLOGIES CO.,LTD. - 4CDC0D - Coral Telecom Limited + D85D4C + TP-LINK TECHNOLOGIES CO.,LTD. - 004E01 - Dell Inc. + A0F3C1 + TP-LINK TECHNOLOGIES CO.,LTD. - C4E1A1 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 783E53 + SKY UK LIMITED - ACC358 - Continental Automotive Czech Republic s.r.o. + 0019FB + SKY UK LIMITED - 3CECEF - Super Micro Computer Inc. + C4F57C + Brocade Communications Systems LLC - 1855E3 - Apple + D0154A + zte corporation - E450EB - Apple + 0026ED + zte corporation - 886440 - Apple + 002293 + zte corporation - 6070C0 - Apple + 083E8E + Hon Hai Precision Ind. Co.,Ltd. - F0C371 - Apple + 006057 + Murata Manufacturing Co., Ltd. - 64FF0A - Wistron Neweb Corporation + 70A8E3 + HUAWEI TECHNOLOGIES CO.,LTD - F09919 - Garmin International + F8E811 + HUAWEI TECHNOLOGIES CO.,LTD - 0000DE - Cetia + 200BC7 + HUAWEI TECHNOLOGIES CO.,LTD - F43E66 - Bee Computing (HK) Limited + F84ABF + HUAWEI TECHNOLOGIES CO.,LTD - DC396F - AVM Audiovisuelles Marketing und Computersysteme GmbH + 78D752 + HUAWEI TECHNOLOGIES CO.,LTD - B4C476 - Wuhan Maritime Communication Research Institute + 104780 + HUAWEI TECHNOLOGIES CO.,LTD - 683489 - LEA Professional + 94772B + HUAWEI TECHNOLOGIES CO.,LTD - B46C47 - Panasonic Appliances Company + D440F0 + HUAWEI TECHNOLOGIES CO.,LTD - 44422F - Testop Ltd + 04021F + HUAWEI TECHNOLOGIES CO.,LTD - 549C27 - Plasma Cloud Limited + 50A72B + HUAWEI TECHNOLOGIES CO.,LTD - D04E50 - Mobiwire Mobiles (NingBo) Ltd + 0CD6BD + HUAWEI TECHNOLOGIES CO.,LTD - 94BF80 - ZTE Corporation + 00F81C + HUAWEI TECHNOLOGIES CO.,LTD - 987A14 - Microsoft Corporation + 404D8E + HUAWEI TECHNOLOGIES CO.,LTD - C83DDC - Xiaomi Communications Ltd + 4C5499 + HUAWEI TECHNOLOGIES CO.,LTD - 9C3A9A - Shenzhen Sundray Technologies Company Limited + F81547 + Avaya Inc - B0B5E8 - Ruroc Ltd + 087A4C + HUAWEI TECHNOLOGIES CO.,LTD - 04D590 - Fortinet Inc. + ACE215 + HUAWEI TECHNOLOGIES CO.,LTD - 541589 - MCS Logic Inc. + 346BD3 + HUAWEI TECHNOLOGIES CO.,LTD - 845733 - Microsoft Corporation + 70723C + HUAWEI TECHNOLOGIES CO.,LTD - 002423 - Azurewave Technologies Inc. + ACE87B + HUAWEI TECHNOLOGIES CO.,LTD - 8C593C - IEEE Registration Authority + F83DFF + HUAWEI TECHNOLOGIES CO.,LTD - 6029D5 - DAVOLINK Inc. + 285FDB + HUAWEI TECHNOLOGIES CO.,LTD - 509744 - Integrated Device Technology (Malaysia) Sdn. Bhd. + 5CF96A + HUAWEI TECHNOLOGIES CO.,LTD - 58F39C - Cisco Systems Inc. + F49FF3 + HUAWEI TECHNOLOGIES CO.,LTD - C4411E - Belkin International Inc. + 240995 + HUAWEI TECHNOLOGIES CO.,LTD - 00AD63 - Dedicated Micros Malta Ltd + 84DBAC + HUAWEI TECHNOLOGIES CO.,LTD - E415F6 - Texas Instruments + 506184 + Avaya Inc - AC4228 - Parta Networks + 10CDAE + Avaya Inc - F41D6B - Huawei Technologies Ltd + 048A15 + Avaya Inc - 7CEC9B - Fuzhou Teraway Information Technology Ltd + B4B017 + Avaya Inc - CC9070 - Cisco Systems Inc. + 90FB5B + Avaya Inc - 2841C6 - Huawei Technologies Ltd + C8F406 + Avaya Inc - 380118 - ULVAC,Inc. + 7052C5 + Avaya Inc - 14ADCA - China Mobile Iot Limited Company + 00040D + Avaya Inc - 809133 - Azurewave Technologies Inc. + 548998 + HUAWEI TECHNOLOGIES CO.,LTD - B4F58E - Huawei Technologies Ltd + 30D17E + HUAWEI TECHNOLOGIES CO.,LTD - C48FC1 - Deeptrack S.L.U. + 640980 + Xiaomi Communications Co Ltd - F82387 - Shenzhen Horn Audio Ltd + 185936 + Xiaomi Communications Co Ltd - E828C1 - Eltex Enterprise Ltd + 20A783 + miControl GmbH - 78D347 - Ericsson AB + 0090F2 + Cisco Systems, Inc - A4A179 - Nanjing dianyan electric power automation Ltd + 74D6EA + Texas Instruments - 68DB67 - Nantong Coship Electronics Ltd + 209148 + Texas Instruments - 1819D6 - Samsung Electronics Ltd + F8A45F + Xiaomi Communications Co Ltd - BC98DF - Motorola Mobility LLC, a Lenovo Company + 60735C + Cisco Systems, Inc - 70FC8F - Freebox SAS + 34A84E + Cisco Systems, Inc - 501B32 - Taicang T&W Electronics + 54781A + Cisco Systems, Inc - 980D67 - ZyXEL Communications Corp + E02F6D + Cisco Systems, Inc - 0002D8 - BRECIS Communications Corporation + 94049C + HUAWEI TECHNOLOGIES CO.,LTD - B0A6F5 - Xaptum Inc. + 688F84 + HUAWEI TECHNOLOGIES CO.,LTD - ACF5E6 - Cisco Systems Inc. + 00605C + Cisco Systems, Inc - DCB082 - Nokia + 0006C1 + Cisco Systems, Inc - F8C397 - NZXT Corp Ltd + 00E014 + Cisco Systems, Inc - 70DDA8 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 0050F0 + Cisco Systems, Inc - 4C6F9C - Guangdong Oppo Mobile Telecommunications Corp Ltd + 005014 + Cisco Systems, Inc - 782C29 - New H3C Technologies Ltd + 0050BD + Cisco Systems, Inc - BC9FE4 - Aruba Networks HP + 00906F + Cisco Systems, Inc - 702E80 - DIEHL Connectivity Solutions + 544A16 + Texas Instruments - ACA46E - Shenzhen Gongjin Electronics Ltd + 58971E + Cisco Systems, Inc - C8B422 - Askey Computer Corp + B4E9B0 + Cisco Systems, Inc - 94EE9F - HMD Global Oy + 000832 + Cisco Systems, Inc - DC2AA1 - MedHab LLC + 70105C + Cisco Systems, Inc - E4F3E8 - Shenzhen SuperElectron Technology Ltd + 10F311 + Cisco Systems, Inc - F4323D - Sichuan tianyi kanghe Communications Ltd + 3085A9 + ASUSTek COMPUTER INC. - F8B797 - NEC Platforms Ltd + B83861 + Cisco Systems, Inc - B0AAD2 - Sichuan tianyi kanghe Communications Ltd + 580A20 + Cisco Systems, Inc - 109397 - ARRIS Group Inc. + 001731 + ASUSTek COMPUTER INC. - 5075F1 - ARRIS Group Inc. + 002215 + ASUSTek COMPUTER INC. - C46516 - Hewlett-Packard Company + E0CB4E + ASUSTek COMPUTER INC. - E41E0A - IEEE Registration Authority + 2C3ECF + Cisco Systems, Inc - CCA12B - TCL King Electrical Appliances (Huizhou) Ltd + 508789 + Cisco Systems, Inc - AC00D0 - ZTE Corporation + 381C1A + Cisco Systems, Inc - E8C417 - Fiberhome Telecommunication Technologies Ltd + BC671C + Cisco Systems, Inc - 001EA3 - Nokia Danmark A/S + 346288 + Cisco Systems, Inc - 38F32E - Skullcandy + CCD8C1 + Cisco Systems, Inc - 981E19 - Sagemcom Broadband SAS + 7C0ECE + Cisco Systems, Inc - 84B866 - Beijing XiaoLu technology Ltd + A0ECF9 + Cisco Systems, Inc - 18BC5A - Zhejiang Tmall Technology Ltd + 5CA48A + Cisco Systems, Inc - C4C138 - OWLink Technology Inc + 1C1D86 + Cisco Systems, Inc - AC37C9 - RAID Incorporated + 5017FF + Cisco Systems, Inc - 205869 - Ruckus Wireless + 189C5D + Cisco Systems, Inc - CC37AB - Edgecore Networks Corporation + DCA5F4 + Cisco Systems, Inc - 1422DB - eero Inc. + 547C69 + Cisco Systems, Inc - C86314 - IEEE Registration Authority + 9C57AD + Cisco Systems, Inc - 243154 - Huawei Technologies Ltd + B05947 + Shenzhen Qihu Intelligent Technology Company Limited - 2C58E8 - Huawei Technologies Ltd + 004096 + Cisco Systems, Inc - 70CD91 - Teracom Telematica S.A + 0CE0E4 + PLANTRONICS, INC. - 2C1875 - Skyworth Digital Technology(Shenzhen) Ltd + 74A2E6 + Cisco Systems, Inc - D06EDE - Sagemcom Broadband SAS + BCF1F2 + Cisco Systems, Inc - 18399C - Skorpios Technologies + C80084 + Cisco Systems, Inc - 94C2BD - Tecnobit + 40A6E8 + Cisco Systems, Inc - 4883B4 - Guangdong Oppo Mobile Telecommunications Corp Ltd + E86549 + Cisco Systems, Inc - 84B8B8 - Motorola (Wuhan) Mobility Technologies Communication Ltd + B07D47 + Cisco Systems, Inc - D041C9 - Fiberhome Telecommunication Technologies Ltd + 38ED18 + Cisco Systems, Inc - E8018D - Fiberhome Telecommunication Technologies Ltd + 382056 + Cisco Systems, Inc - 10A3B8 - Iskratel d.o.o. + DCCEC1 + Cisco Systems, Inc - E8ECA3 - Dongguan Liesheng Electronic Ltd + 60FEC5 + Apple, Inc. - 08A6BC - Amazon Technologies Inc. + E425E7 + Apple, Inc. - 701E68 - Hanna Instruments Inc. + BC926B + Apple, Inc. - 1CB3E9 - Shenzhen Zhongke United Communication Technology + 101C0C + Apple, Inc. - 8C965F - Shandong Zhongan Technology Ltd + 080007 + Apple, Inc. - C0074A - Brita GmbH + 40D32D + Apple, Inc. - E8B2FE - HUMAX Ltd + C42C03 + Apple, Inc. - 80FD7A - BLU Products Inc + 9027E4 + Apple, Inc. - 0017FA - Microsoft Corporation + 109ADD + Apple, Inc. - 941625 - Apple + 0016CB + Apple, Inc. - 543B30 - duagon AG + 0017F2 + Apple, Inc. - 40F21C - DASAN Zhone Solutions + 001F5B + Apple, Inc. - B0BB8B - Wavetel Technology Limited + 002436 + Apple, Inc. - 34A8EB - Apple + 001947 + Cisco SPVTG - 94BFC4 - Ruckus Wireless + 001839 + Cisco-Linksys, LLC - A483E7 - Apple + 00254B + Apple, Inc. - F4AFE7 - Apple + 7C6D62 + Apple, Inc. - AC88FD - Apple + 6C3E6D + Apple, Inc. - 503E7C - LeiShen Intelligent System Ltd + BC6778 + Apple, Inc. - 24586E - ZTE Corporation + 20C9D0 + Apple, Inc. - B4A305 - Xiamen Yaxon Network Ltd + 68967B + Apple, Inc. - 803E48 - Shenzhen Gongjin Electronics Ltd + 84FCFE + Apple, Inc. - 243F30 - Oxygen Broadband s.a. + E48B7F + Apple, Inc. - 3C9180 - Liteon Technology Corporation + 581FAA + Apple, Inc. - 20326C - Samsung Electronics Ltd + 88C663 + Apple, Inc. - 6489F1 - Samsung Electronics Ltd + A46706 + Apple, Inc. - 2034FB - Xiaomi Communications Ltd + 8C5877 + Apple, Inc. - A89CED - Xiaomi Communications Ltd + 283737 + Apple, Inc. - 6CA604 - ARRIS Group Inc. + 50EAD6 + Apple, Inc. - 5CF9DD - Dell Inc. + B817C2 + Apple, Inc. - D0EC35 - Cisco Systems Inc. + 7C11BE + Apple, Inc. - 10AE60 - Private + BC3BAF + Apple, Inc. - BCCF4F - ZyXEL Communications Corp + 3CE072 + Apple, Inc. - C010B1 - HMD Global Oy + 38484C + Apple, Inc. - 90895F - Weifang Goertek Electronics Ltd + D8D1CB + Apple, Inc. - 48D845 - Shenzhen Mainuoke Electronics Ltd + A8FAD8 + Apple, Inc. - 0CE041 - iDruide + 008865 + Apple, Inc. - B88FB4 - Jabil Circuit Italia S.R.L + E0F5C6 + Apple, Inc. - 0052C2 - Peiker Acustic GmbH + A0EDCD + Apple, Inc. - 8C53D2 - China Mobile Group Device Ltd + 189EFC + Apple, Inc. - D45383 - Murata Manufacturing Ltd + 804971 + Apple, Inc. - A04246 - IT Telecom Ltd + 98D6BB + Apple, Inc. - 0CF475 - Zliide Technologies ApS + 7CF05F + Apple, Inc. - 68FF7B - TP-Link Technologies Ltd + 5C97F3 + Apple, Inc. - 808F1D - TP-Link Technologies Ltd + D4F46F + Apple, Inc. - 00124E - XAC Automation Corp. + 48437C + Apple, Inc. - 88E034 - Shinwa Industries(China) Ltd + 34A395 + Apple, Inc. - 48BD0E - Quanta Storage Inc. + 787E61 + Apple, Inc. - 000F69 - SEW Eurodrive GmbH & Co. KG + C0F2FB + Apple, Inc. - E458E7 - Samsung Electronics Ltd + 24E314 + Apple, Inc. - 00104A - The Parvus Corporation + 80E650 + Apple, Inc. - D058C0 - Qingdao Haier Multimedia Limited. + 90FD61 + Apple, Inc. - 48C3B0 - Pharos Ltd + 2CF0EE + Apple, Inc. - DC58BC - Thomas-Krenn.AG + 3C15C2 + Apple, Inc. - 001025 - Grayhill Inc. + 6C709F + Apple, Inc. - 3821C7 - Aruba Networks HP + 6476BA + Apple, Inc. - A45F9B - Nexell + 34E2FD + Apple, Inc. - 70EA1A - Cisco Systems Inc. + 04489A + Apple, Inc. - 808A8B - Vivo Mobile Communication Ltd + 087045 + Apple, Inc. - 9844B6 - Infranor SAS + A88808 + Apple, Inc. - 38839A - Shenzhen RF-Link Technology Ltd + A4C361 + Apple, Inc. - DC6723 - barox Kommunikation GmbH + B09FBA + Apple, Inc. - 94B40F - Aruba Networks HP + 8C2937 + Apple, Inc. - 001A1E - Aruba Networks HP + ACCF5C + Apple, Inc. - 00246C - Aruba Networks HP + 80006E + Apple, Inc. - 201BC9 - Juniper Networks + 848E0C + Apple, Inc. - C8F6C8 - Fiberhome Telecommunication Technologies Ltd + F099BF + Apple, Inc. - 1C3B8F - Selve GmbH & Co. KG + 94E96A + Apple, Inc. - E4E749 - Hewlett-Packard Company + AC293A + Apple, Inc. - ECC57F - Suzhou Pairlink Network Technology + 9CFC01 + Apple, Inc. - 38C2BA - Cctv Neotech + 60F81D + Apple, Inc. - A0F9B7 - Ademco Smart Homes Technology(Tianjin) Ltd + 5CF5DA + Apple, Inc. - A83CCB - Rossma + 18EE69 + Apple, Inc. - 886FD4 - Dell Inc. + 649ABE + Apple, Inc. - CC3FEA - BAE Systems Inc. + 9C35EB + Apple, Inc. - 4CF2BF - Cambridge Industries(Group) Ltd + 507A55 + Apple, Inc. - CC9EA2 - Amazon Technologies Inc. + 0C4DE9 + Apple, Inc. - AC4330 - Versa Networks + F0F61C + Apple, Inc. - E85BB7 - Ample Systems Inc. + F0F249 + Hitron Technologies. Inc - 94677E - Belden India Private Limited + 38C986 + Apple, Inc. - AC5775 - HMD Global Oy + D03311 + Apple, Inc. - D43A2E - Shenzhen MTC Ltd + 5882A8 + Microsoft - 50AD92 - NX Technologies + C8C2C6 + Shanghai Airm2m Communication Technology Co., Ltd - 003217 - Cisco Systems Inc. + 789C85 + August Home, Inc. - 94E0D6 - China Dragon Technology Limited + DCFE07 + PEGATRON CORPORATION - B4A9FC - Quanta Computer Inc. + 707938 + Wuxi Zhanrui Electronic Technology Co.,LTD - 6CA936 - DisplayLink (UK) Ltd + B813E9 + Trace Live Network - 708540 - Skyworth Digital Technology(Shenzhen) Ltd + 58685D + Tempo Australia Pty Ltd - 08F1EA - Hewlett Packard Enterprise + 243184 + SHARP Corporation - F00DF5 - ACOMA Medical Industry Ltd + 582BDB + Pax AB - 6845F1 - Toshiba Client Solutions Ltd + 24DA9B + Motorola Mobility LLC, a Lenovo Company - 78B213 - DWnet Technologies(Suzhou) Corporation + 30E090 + Genevisio Ltd. - 58C232 - NEC Corporation + F44D30 + Elitegroup Computer Systems Co.,Ltd. - 381D14 - Skydio Inc. + E03676 + HUAWEI TECHNOLOGIES CO.,LTD - 7CDB98 - Askey Computer Corp + EC388F + HUAWEI TECHNOLOGIES CO.,LTD - 380B3C - Texas Instruments + C49E41 + G24 Power Limited - 9C8CD8 - Hewlett Packard Enterprise + D03E5C + HUAWEI TECHNOLOGIES CO.,LTD - A48CC0 - JLG Industries Inc. + F00D5C + JinQianMao Technology Co.,Ltd. - 3C286D - Google Inc. + 54BE53 + zte corporation - 00093A - Molex CMS + 280E8B + Beijing Spirit Technology Development Co., Ltd. - 04F9D9 - Speaker Electronic(Jiashan) Ltd + 80B709 + Viptela, Inc - DC080F - Apple + A4DCBE + HUAWEI TECHNOLOGIES CO.,LTD - F8E94E - Apple + D494E8 + HUAWEI TECHNOLOGIES CO.,LTD - EC2CE2 - Apple + B078F0 + Beijing HuaqinWorld Technology Co.,Ltd. - 40BC60 - Apple + 38D40B + Samsung Electronics Co.,Ltd - E83617 - Apple + 209BCD + Apple, Inc. - 9C648B - Apple + 94BBAE + Husqvarna AB - 344262 - Apple + ECB870 + Beijing Heweinet Technology Co.,Ltd. - 14D00D - Apple + 3095E3 + SHANGHAI SIMCOM LIMITED - 88D211 - Eko Devices Inc. + E83A12 + Samsung Electronics Co.,Ltd - B8C227 - PSTec + 80656D + Samsung Electronics Co.,Ltd - 74F737 - KCE + FCF136 + Samsung Electronics Co.,Ltd - 48A493 - Taiyo Yuden Ltd + B88687 + Liteon Technology Corporation - E82C6D - SmartRG Inc. + 18895B + Samsung Electronics Co.,Ltd - 48E695 - Insigma Inc + 584925 + E3 Enterprise - B479C8 - Ruckus Wireless + 94F278 + Elma Electronic - B40B78 - Brusa Elektronik AG + 0894EF + Wistron Infocomm (Zhongshan) Corporation - C03DD9 - MitraStar Technology Corp. + 283713 + Shenzhen 3Nod Digital Technology Co., Ltd. - 2CAA8E - Wyze Labs Inc + E0319E + Valve Corporation - 703A51 - Xiaomi Communications Ltd + 7CAB25 + MESMO TECHNOLOGY INC. - DC48B2 - Baraja Pty Ltd + 584822 + Sony Corporation - 181E95 - AuVerte + 747336 + MICRODIGTAL Inc - 0C9541 - Chipsea Technologies (Shenzhen) Corp. + B0411D + ITTIM Technologies - 3C3786 - Netgear + 7CA237 + King Slide Technology CO., LTD. - 48352E - Shenzhen Wolck Network Product Ltd + 3C5CC3 + Shenzhen First Blue Chip Technology Ltd - 04E598 - Xiaomi Communications Ltd + ECEED8 + ZTLX Network Technology Co.,Ltd - B82CA0 - Resideo + 80EB77 + Wistron Corporation - 6CC7EC - Samsung Electro-Mechanics(Thailand) + 483974 + Proware Technologies Co., Ltd. - B033A6 - Juniper Networks + 30FFF6 + HangZhou KuoHeng Technology Co.,ltd - D89685 - GoPro + 48E244 + Hon Hai Precision Ind. Co.,Ltd. - C0BDC8 - Samsung Electronics Ltd + D8EFCD + Nokia Solutions and Networks GmbH & Co. KG - 647BCE - Samsung Electronics Ltd + 4CC681 + Shenzhen Aisat Electronic Co., Ltd. - A887B3 - Samsung Electronics Ltd + C49FF3 + Mciao Technologies, Inc. - 6C006B - Samsung Electronics Ltd + 788E33 + Jiangsu SEUIC Technology Co.,Ltd - 001060 - Billionton Systems Inc. + 884157 + Shenzhen Atsmart Technology Co.,Ltd. - C4D489 - JiangSu Joyque Information Industry Ltd + D89A34 + Beijing SHENQI Technology Co., Ltd. - B4F949 - optilink networks pvt Ltd + 7CF90E + Samsung Electronics Co.,Ltd - E43C80 - University Of Oklahoma + 382B78 + ECO PLUGS ENTERPRISE CO., LTD - 3C2C30 - Dell Inc. + A47B2C + Nokia - 706D15 - Cisco Systems Inc. + DCDB70 + Tonfunk Systementwicklung und Service GmbH - A4A1E4 - Innotube Inc. + 800B51 + Chengdu XGimi Technology Co.,Ltd - 94EAEA - Tellescom Industria E Comercio EM Telecomunicacao + 3481F4 + SST Taiwan Ltd. - 1CFD08 - IEEE Registration Authority + F8BF09 + HUAWEI TECHNOLOGIES CO.,LTD - B8599F - Mellanox Technologies Inc. + 7CB25C + Acacia Communications - 301389 - Siemens AG, Automations & Drives, + 803B2A + ABB Xiamen Low Voltage Equipment Co.,Ltd. - 98D3E7 - Netafim L + A0A65C + Supercomputing Systems AG - F063F9 - Huawei Technologies Ltd + F80D60 + CANON INC. - 7CC385 - Huawei Technologies Ltd + F0182B + LG Chem - 900EB3 - Shenzhen Amediatech Technology Ltd + E8377A + Zyxel Communications Corporation - 549FAE - iBASE Gaming Inc + 00A784 + ITX security - 548028 - Hewlett Packard Enterprise + 5CB43E + HUAWEI TECHNOLOGIES CO.,LTD - 54068B - Ningbo Deli Kebei Technology Ltd + 54E140 + INGENICO - 60CE92 - The Refined Industry Company Limited + E4907E + Motorola Mobility LLC, a Lenovo Company - 105BAD - Mega Well Limited + 3CCE15 + Mercedes-Benz USA, LLC - 74BFC0 - Canon Inc. + 38FACA + Skyworth Digital Technology(Shenzhen) Co.,Ltd - C8D9D2 - Hewlett-Packard Company + 149A10 + Microsoft Corporation - 24FCE5 - Samsung Electronics Ltd + 707781 + Hon Hai Precision Ind. Co.,Ltd. - 809621 - Lenovo + 50F0D3 + Samsung Electronics Co.,Ltd - 78055F - Shenzhen WYC Technology Ltd + 24E5AA + Philips Oral Healthcare, Inc. - 00EABD - Cisco Systems Inc. + 78BDBC + Samsung Electronics Co.,Ltd - 48872D - Shen Zhen DA XIA Long QUE Technology Ltd + 287610 + IgniteNet - E81A58 - Technologic Systems + 746A3A + Aperi Corporation - C0BFA7 - Juniper Networks + 94A7B7 + zte corporation - F05494 - Honeywell Connected Building + 1844E6 + zte corporation - 5CC999 - New H3C Technologies Ltd + 485073 + Microsoft Corporation - B02A43 - Google Inc. + 349B5B + Maquet GmbH - C474F8 - Hot Pepper Inc. + 84119E + Samsung Electronics Co.,Ltd - 142233 - Fiberhome Telecommunication Technologies Ltd + 54E2C8 + Dongguan Aoyuan Electronics Technology Co., Ltd - 743400 - MTG Ltd + 20D75A + Posh Mobile Limited - DC3757 - Integrated Device Technology (Malaysia) Sdn. Bhd. + 8C8B83 + Texas Instruments - 005099 - 3Com Europe Ltd + 4011DC + Sonance - 04BC87 - Shenzhen JustLink Technology Ltd + 1C8341 + Hefei Bitland Information Technology Co.Ltd - 54C33E - Ciena Corporation + 706879 + Saijo Denki International Co., Ltd. - EC79F2 - Startel + 081FEB + BinCube - BCB22B - EM-Tech + 785F4C + Argox Information Co., Ltd. - D4AB82 - ARRIS Group Inc. + 6C1E70 + Guangzhou YBDS IT Co.,Ltd - 704FB8 - ARRIS Group Inc. + D8ADDD + Sonavation, Inc. - 0060EB - Fourthtrack Systems + 8833BE + Ivenix, Inc. - 1862E4 - Texas Instruments + 54B80A + D-Link International - 6035C0 - SFR + 34CC28 + Nexpring Co. LTD., - C4985C - Hui Zhou Gaoshengda Technology Ltd + 249EAB + HUAWEI TECHNOLOGIES CO.,LTD - 30A1FA - Huawei Technologies Ltd + 6CA75F + zte corporation - 242E90 - Palit Microsystems Ltd + 10AF78 + Shenzhen ATUE Technology Co., Ltd - 9CAA1B - Microsoft Corporation + E48D8C + Routerboard.com - A89A93 - Sagemcom Broadband SAS + 8C7967 + zte corporation - 001AC5 - Keysight Technologies Inc. + CCA4AF + Shenzhen Sowell Technology Co., LTD - 00201E - Netquest Corporation + CC19A8 + PT Inovação e Sistemas SA - 64628A - evon GmbH + B4B265 + DAEHO I&T - 0415D9 - Viwone + 74E28C + Microsoft Corporation - ECB313 - Shenzhen Gongjin Electronics Ltd + 0071C2 + PEGATRON CORPORATION - B08BCF - Cisco Systems Inc. + 7C8274 + Shenzhen Hikeen Technology CO.,LTD - 00608C - 3Com Corporation + 94D417 + GPI KOREA INC. - 00A024 - 3Com Corporation + E03560 + Challenger Supply Holdings, LLC - 0020AF - 3Com Corporation + 244B81 + Samsung Electronics Co.,Ltd - 00104B - 3Com Corporation + D855A3 + zte corporation - A85AF3 - Shanghai Siflower Communication Technology Ltd + 38D82F + zte corporation - 70FD46 - Samsung Electronics Ltd + 7858F3 + Vachen Co.,Ltd - 8C83E1 - Samsung Electronics Ltd + 244B03 + Samsung Electronics Co.,Ltd - 889F6F - Samsung Electronics Ltd + 3CCB7C + TCT mobile ltd - 5C63C9 - Intellithings Ltd + E4CE70 + Health & Life co., Ltd. - 0C96E6 - Cloud Network Technology (Samoa) Limited + 704E66 + SHENZHEN FAST TECHNOLOGIES CO.,LTD - 3C8994 - BSkyB Ltd + 102C83 + XIMEA - E00EE1 - We Corporation Inc. + 709C8F + Nero AG - 000C43 - Ralink Technology, Corp. + 844BB7 + Beijing Sankuai Online Technology Co.,Ltd - 8C9246 - Oerlikon Textile GmbH&Co.KG + 68F0BC + Shenzhen LiWiFi Technology Co., Ltd - 000E94 - Maas International BV + 2884FA + SHARP Corporation - 4898CA - Sichuan AI-Link Technology Ltd + 60D9A0 + Lenovo Mobile Communication Technology Ltd. - 247E51 - ZTE Corporation + F07959 + ASUSTek COMPUTER INC. - E8B541 - ZTE Corporation + E08E3C + Aztech Electronics Pte Ltd - 0C9D92 - ASUSTek Computer Inc. + 3C1E04 + D-Link International - 988ED4 - Itel Mobile Limited + 300EE3 + Aquantia Corporation - E8A788 - Xiamen Leelen Technology Ltd + 60AF6D + Samsung Electronics Co.,Ltd - 582D34 - Qingping Electronics (Suzhou) Ltd + B85A73 + Samsung Electronics Co.,Ltd - 20DE88 - IC Realtime LLC + 68B983 + b-plus GmbH - F4068D - devolo AG + 18F145 + NetComm Wireless Limited - 001A31 - Scan Coin AB + ACABBF + AthenTek Inc. - 001B84 - Scan Engineering Telecom + 981DFA + Samsung Electronics Co.,Ltd - 482CA0 - Xiaomi Communications Ltd + 186882 + Beward R&D Co., Ltd. - 3412F9 - Huawei Technologies Ltd + 78B3B9 + ShangHai sunup lighting CO.,LTD - BCE265 - Huawei Technologies Ltd + 04C09C + Tellabs Inc. - 4CD1A1 - Huawei Technologies Ltd + 7429AF + Hon Hai Precision Ind. Co.,Ltd. - 88BFE4 - Huawei Technologies Ltd + 40EACE + FOUNDER BROADBAND NETWORK SERVICE CO.,LTD - 4017E2 - Intai Technology Corp. + 848EDF + Sony Corporation - 0CCB85 - Motorola Mobility LLC, a Lenovo Company + EC8009 + NovaSparks - A4E615 - Shenzhen Chuangwei-RGB Electronics Ltd + 50ADD5 + Dynalec Corporation - 741F79 - Youngkook Electronics Ltd + B04519 + TCT mobile ltd - A09351 - Cisco Systems Inc. + D88D5C + Elentec - 98039B - Mellanox Technologies Inc. + 3C1A0F + ClearSky Data - 208984 - Compal Information (Kunshan) Ltd + E8CC18 + D-Link International - B4CEFE - James Czekaj + B09137 + ISis ImageStream Internet Solutions, Inc - F8CC6E - DEPO Electronics Ltd + 8C0551 + Koubachi AG - F8369B - Texas Instruments + D897BA + PEGATRON CORPORATION - 88AE1D - Compal Information (Kunshan) Ltd + A8D88A + Wyconn - B888E3 - Compal Information (Kunshan) Ltd + 207693 + Lenovo (Beijing) Limited. - 289EFC - Sagemcom Broadband SAS + 600417 + POSBANK CO.,LTD - 00C055 - Modular Computing Technologies + 2497ED + Techvision Intelligent Technology Limited - E41FE9 - Dunkermotoren GmbH + A49D49 + Ketra, Inc. - C4518D - Shenzhen YOUHUA Technology Ltd + C03896 + Hon Hai Precision Ind. Co.,Ltd. - 486834 - Silicon Motion Inc. + 2C5089 + Shenzhen Kaixuan Visual Technology Co.,Limited - 001133 - Siemens AG Austria + 1C7E51 + 3bumen.com - 000B23 - Siemens Home & Office Comm. Devices + 948E89 + INDUSTRIAS UNIDAS SA DE CV - 641331 - Bosch Car Multimedia (Wuhu) Ltd + 084656 + VEO-LABS - 183A48 - VostroNet + EC3C5A + SHEN ZHEN HENG SHENG HUI DIGITAL TECHNOLOGY CO.,LTD - 782F17 - Xlab Ltd + 4488CB + Camco Technologies NV - B0027E - Muller Services + 6872DC + CETORY.TV Company Limited - 24FAF3 - Shanghai Flexem Technology Ltd + 00AEFA + Murata Manufacturing Co., Ltd. - 88D2BF - German Autolabs + 841826 + Osram GmbH - 20163D - Integrated Device Technology (Malaysia) Sdn. Bhd. + 50294D + NANJING IOT SENSOR TECHNOLOGY CO,LTD - E0735F - Nucom + 0CCFD1 + SPRINGWAVE Co., Ltd - 0051ED - LG Innotek + 74BADB + Longconn Electornics(shenzhen)Co.,Ltd - 40DC9D - Hajen + 909F33 + EFM Networks - 340A98 - Huawei Technologies Ltd + 3077CB + Maike Industry(Shenzhen)CO.,LTD - 646D6C - Huawei Technologies Ltd + 102F6B + Microsoft Corporation - C4B8B4 - Huawei Technologies Ltd + 945493 + Rigado, LLC - F0BCC9 - PFU Limited + 6CBFB5 + Noon Technology Co., Ltd - 487583 - Intellion AG + B8F317 + iSun Smasher Communications Private Limited - 904C81 - Hewlett Packard Enterprise + 8CF813 + ORANGE POLSKA - 8C3579 - QDIQO Sp. z o.o. + 68F06D + ALONG INDUSTRIAL CO., LIMITED - 38C70A - WiFiSong + F82441 + Yeelink - D8760A - Escort Inc. + 108A1B + RAONIX Inc. - 5C2ED2 - ABC(XiSheng) Electronics Ltd + F8E903 + D-Link International - FCFBFB - Cisco Systems Inc. + E89606 + testo Instruments (Shenzhen) Co., Ltd. - 007E95 - Cisco Systems Inc. + F42853 + Zioncom Electronics (Shenzhen) Ltd. - 9C5A44 - Compal Information (Kunshan) Ltd + 1C9C26 + Zoovel Technologies - 14CAA0 - Hu & Co + D4EC86 + LinkedHope Intelligent Technologies Co., Ltd - 08D46A - LG Electronics (Mobile Communications) + 046785 + scemtec Hard- und Software fuer Mess- und Steuerungstechnik GmbH - 001017 - Bosch Access Systems GmbH + D0FA1D + Qihoo 360 Technology Co.,Ltd - F4EE14 - Mercury Communication Technologies Ltd + B89BE4 + ABB Power Systems Power Generation - 6C5940 - Mercury Communication Technologies Ltd + 505065 + TAKT Corporation - D02516 - Mercury Communication Technologies Ltd + 40C62A + Shanghai Jing Ren Electronic Technology Co., Ltd. - 1C60DE - Mercury Communication Technologies Ltd + E8150E + Nokia Corporation - D82477 - Universal Electric Corporation + DC537C + Compal Broadband Networks, Inc. - 00907F - WatchGuard Technologies Inc. + AC11D3 + Suzhou HOTEK Video Technology Co. Ltd - 4C5E0C - Routerboard.com + 8432EA + ANHUI WANZTEN P&T CO., LTD - D4CA6D - Routerboard.com + E01D38 + Beijing HuaqinWorld Technology Co.,Ltd - 001472 - China Broadband Wireless IP Standard group(ChinaBWIPS) + E47FB2 + FUJITSU LIMITED - 80B575 - Huawei Technologies Ltd + FC6DC0 + BME CORPORATION - A4BE2B - Huawei Technologies Ltd + 24D13F + MEXUS CO.,LTD - 68E7C2 - Samsung Electronics Ltd + 7824AF + ASUSTek COMPUTER INC. - 58B10F - Samsung Electronics Ltd + 0CAC05 + Unitend Technologies Inc. - 4006A0 - Texas Instruments + FC9FE1 + CONWIN.Tech. Ltd - F82DC0 - ARRIS Group Inc. + A81B5D + Foxtel Management Pty Ltd - 189C27 - ARRIS Group Inc. + 44A6E5 + THINKING TECHNOLOGY CO.,LTD - 3CF5CC - New H3C Technologies Ltd + 3CAA3F + iKey, Ltd. - D08A91 - Technicolor CH USA Inc. + 0C383E + Fanvil Technology Co., Ltd. - 2811A5 - Bose Corporation + 60CDA9 + Abloomy - D8F3DB - Post CH AG + B8AD3E + BLUECOM - DCB4AC - Flextronics Manufacturing(Zhuhai) Ltd + 183009 + Woojin Industrial Systems Co., Ltd. - A492CB - Nokia + 74DBD1 + Ebay Inc - C0D2F3 - Hui Zhou Gaoshengda Technology Ltd + 80AD67 + Kasda Networks Inc - B88303 - Hewlett Packard Enterprise + 30B5F1 + Aitexin Technology Co., Ltd - 203DBD - LG Innotek + B01041 + Hon Hai Precision Ind. Co.,Ltd. - A45385 - Weifang Goertek Electronics Ltd + C44202 + Samsung Electronics Co.,Ltd - 00402F - Xlnt Designs Inc. + B4AE6F + Circle Reliance, Inc DBA Cranberry Networks - 04ECBB - Fiberhome Telecommunication Technologies Ltd + 90DA6A + FOCUS H&S Co., Ltd. - 64A2F9 - OnePlus Technology (Shenzhen) Ltd + 103047 + Samsung Electronics Co.,Ltd - A87D12 - Huawei Technologies Ltd + 5C2E59 + Samsung Electronics Co.,Ltd - D42122 - Sercomm Corporation. + 4C6E6E + Comnect Technology CO.,LTD - 00C002 - Sercomm Corporation. + 8C3357 + HiteVision Digital Media Technology Co.,Ltd. - BC9911 - ZyXEL Communications Corp + F884F2 + Samsung Electronics Co.,Ltd - 280245 - Konze System Technology Ltd + A45DA1 + ADB Broadband Italia - E48F65 - Yelatma Instrument Making Enterprise, JSC + C46BB4 + myIDkey - 0000A8 - Stratus Technologies + 84948C + Hitron Technologies. Inc - 0004FC - Stratus Technologies + A8F7E0 + PLANET Technology Corporation - 3C24F0 - IEEE Registration Authority + 4486C1 + Siemens Low Voltage & Products - 00BB3A - Amazon Technologies Inc. + E0CBEE + Samsung Electronics Co.,Ltd - 0CB34F - Shenzhen Xiaoqi Intelligent Technology Ltd + 4C3909 + HPL Electric & Power Private Limited - 3CF4F9 - Moda-InnoChips + 907EBA + UTEK TECHNOLOGY (SHENZHEN) CO.,LTD - 94193A - Elvaco AB + A002DC + Amazon Technologies Inc. - C08135 - Ningbo Forfan technology Ltd + 4045DA + Spreadtrum Communications (Shanghai) Co., Ltd. - 840D8E - Espressif Inc. + 3451AA + JID GLOBAL - 002082 - Oneac Corporation + 98BE94 + IBM - B4C0F5 - Shenzhen TINNO Mobile Technology Corp. + 6C198F + D-Link International - 406231 - Gifa + C8FF77 + Dyson Limited - FCB7F0 - Idaho National Laboratory + 542AA2 + Alpha Networks Inc. - 2C28B7 - Hangzhou Ruiying technology Ltd + B49EAC + Imagik Int'l Corp - 106530 - Dell Inc. + 54B753 + Hunan Fenghui Yinjia Science And Technology Co.,Ltd - 046B1B - SysDINE Ltd + B0754D + Nokia - B0A37E - Qing DAO Haier Telecom Ltd + CC07E4 + Lenovo Mobile Communication Technology Ltd. - 3CEAF9 - Jubix Ltd + ACB859 + Uniband Electronic Corp, - 58DB15 - Tecno Mobile Limited + 88B1E1 + Mojo Networks, Inc. - 5050CE - Hangzhou Dianyixia Communication Technology Ltd + 54EE75 + Wistron InfoComm(Kunshan)Co.,Ltd. - FC6947 - Texas Instruments + 0C63FC + Nanjing Signway Technology Co., Ltd - E07DEA - Texas Instruments + D4E08E + ValueHD Corporation - DCDE4F - Gionee Communication Equipment Ltd + C89F1D + SHENZHEN COMMUNICATION TECHNOLOGIES CO.,LTD - 4CD0CB - Huawei Technologies Ltd + 0874F6 + Winterhalter Gastronom GmbH - 505DAC - Huawei Technologies Ltd + 143DF2 + Beijing Shidai Hongyuan Network Communication Co.,Ltd - E8FAF7 - Guangdong Uniteddata Holding Group Ltd + 6047D4 + FORICS Electronic Technology Co., Ltd. - 949D57 - Panasonic do Brasil Limitada + D8492F + CANON INC. - 88D37B - FirmTek LLC + 2C39C1 + Ciena Corporation - 1C666D - Hon Hai Precision Ind Ltd + 800E24 + ForgetBox - 84F3EB - Espressif Inc. + 3C25D7 + Nokia Corporation - 001B48 - Shenzhen Lantech Electronics Ltd + 30A8DB + Sony Corporation - 00250C - Senet Inc + 54D163 + MAX-TECH,INC - 0C8063 - TP-Link Technologies Ltd + 083F3E + WSH GmbH - 007278 - Cisco Systems Inc. + 1820A6 + Sage Co., Ltd. - 645AED - Apple + 20EAC7 + SHENZHEN RIOPINE ELECTRONICS CO., LTD - C0B658 - Apple + 64B370 + PowerComm Solutions LLC - 48A91C - Apple + 5CF50D + Institute of microelectronic applications - 50BC96 - Apple + 749C52 + Huizhou Desay SV Automotive Co., Ltd. - FC2A9C - Apple + 48B5A7 + Glory Horse Industries Ltd. - 682C7B - Cisco Systems Inc. + 0C4F5A + ASA-RT s.r.l. - 441E98 - Ruckus Wireless + CCA614 + AIFA TECHNOLOGY CORP. - A056F3 - Apple + 4C8B30 + Actiontec Electronics, Inc - 549963 - Apple + 0805CD + DongGuang EnMai Electronic Product Co.Ltd. - 90DD5D - Apple + 18FF2E + Shenzhen Rui Ying Da Technology Co., Ltd - DC2919 - AltoBeam (Xiamen) Technology Ltd + 847207 + I&C Technology - 885FE8 - IEEE Registration Authority + D4224E + Alcatel Lucent - 002FD9 - Fiberhome Telecommunication Technologies Ltd + 9C86DA + Phoenix Geophysics Ltd. - B4CD27 - Huawei Technologies Ltd + 2C073C + DEVLINE LIMITED - C819F7 - Samsung Electronics Ltd + 7C1A03 + 8Locations Co., Ltd. - 64C3D6 - Juniper Networks + 10DEE4 + automationNEXT GmbH - 00A021 - General Dynamics Mission Systems + F03A4B + Bloombase, Inc. - F0AF50 - Phantom Intelligence + 90F1B0 + Hangzhou Anheng Info&Tech CO.,LTD - C42C4F - Qingdao Hisense Mobile Communication Technology Ltd + 90DB46 + E-LEAD ELECTRONIC CO., LTD - 24CACB - Fiberhome Telecommunication Technologies Ltd + 344F5C + R&amp;M AG - 543E64 - Fiberhome Telecommunication Technologies Ltd + 7CE4AA + Private - 6402CB - ARRIS Group Inc. + C4291D + KLEMSAN ELEKTRIK ELEKTRONIK SAN.VE TIC.AS. - F4E11E - Texas Instruments + FCF8B7 + TRONTEQ Electronic - 3880DF - Motorola Mobility LLC, a Lenovo Company + 30F42F + ESP - BC6A2F - Henge Docks LLC + 704E01 + KWANGWON TECH CO., LTD. - 0C08B4 - HUMAX Ltd + 746A8F + VS Vision Systems GmbH - 002705 - Sectronic + 54A31B + Shenzhen Linkworld Technology Co,.LTD - 48BD3D - New H3C Technologies Ltd + CC398C + Shiningtek - 184C08 - Rockwell Automation + 6C5F1C + Lenovo Mobile Communication Technology Ltd. - DC0265 - Meditech Kft + 404A18 + Addrek Smart Solutions - 14A72B - currentoptronics Pvt Ltd + C0C569 + SHANGHAI LYNUC CNC TECHNOLOGY CO.,LTD - A4DA22 - IEEE Registration Authority + C4C0AE + MIDORI ELECTRONIC CO., LTD. - 3C1710 - Sagemcom Broadband SAS + ACC595 + Graphite Systems - DC729B - Huawei Technologies Ltd + D8EE78 + Moog Protokraft - 909497 - Huawei Technologies Ltd + 7CE1FF + Computer Performance, Inc. DBA Digital Loggers, Inc. - 34029B - Plexonics Technologies LImited + D8150D + TP-LINK TECHNOLOGIES CO.,LTD. - 900372 - Longnan Junya Digital Technology Ltd + 4CD7B6 + Helmer Scientific - 0CC6CC - Huawei Technologies Ltd + 8425A4 + Tariox Limited - 785860 - Huawei Technologies Ltd + 483D32 + Syscor Controls &amp; Automation - E8ABF3 - Huawei Technologies Ltd + A0E453 + Sony Corporation - 3CDCBC - Samsung Electronics Ltd + 3C0C48 + Servergy, Inc. - 804E70 - Samsung Electronics Ltd + CC856C + SHENZHEN MDK DIGITAL TECHNOLOGY CO.,LTD - D4E6B7 - Samsung Electronics Ltd + 2C957F + zte corporation - 8C4CAD - Evoluzn Inc. + 98FF6A + OTEC(Shanghai)Technology Co.,Ltd. - 8CF957 - RuiXingHengFang Network (Shenzhen) Ltd + 7CCD11 + MS-Magnet - 4C776D - Cisco Systems Inc. + 5850AB + TLS Corporation - 74E182 - Texas Instruments + 241148 + Entropix, LLC - 449EF9 - Vivo Mobile Communication Ltd + CC7498 + Filmetrics Inc. - 6CC4D5 - HMD Global Oy + 64BABD + SDJ Technologies, Inc. - 80C548 - Shenzhen Zowee Technology Ltd + 24C848 + mywerk Portal GmbH - 10C25A - Technicolor CH USA Inc. + 50ED78 + Changzhou Yongse Infotech Co.,Ltd - E8DEFB - Mesotic SAS + 1CC11A + Wavetronix - C400AD - Advantech Technology (CHINA) Ltd + 90028A + Shenzhen Shidean Legrand Electronic Products Co.,Ltd - 94FE9D - Shenzhen Gongjin Electronics Ltd + 085AE0 + Recovision Technology Co., Ltd. - 6CB6CA - DivUS GmbH + E0C86A + SHENZHEN TW-SCIE Co., Ltd - 04D13A - Xiaomi Communications Ltd + 1879A2 + GMJ ELECTRIC LIMITED - 4CC206 - Somfy + C445EC + Shanghai Yali Electron Co.,LTD - 040973 - Hewlett Packard Enterprise + E0E631 + SNB TECHNOLOGIES LIMITED - 3499D7 - Universal Flow Monitors Inc. + F8572E + Core Brands, LLC - 0C8BD3 - Itel Mobile Limited + 78B5D2 + Ever Treasure Industrial Limited - C0A8F0 - Adamson Systems Engineering + FC09D8 + ACTEON Group - 9C431E - IEEE Registration Authority + 743ECB + Gentrice tech - 0024AF - Dish Technologies Corp + 7C444C + Entertainment Solutions, S.L. - 282C02 - IEEE Registration Authority + 0444A1 + TELECON GALICIA,S.A. - FCA183 - Amazon Technologies Inc. + 20C60D + Shanghai annijie Information technology Co.,LTD - 6C2ACB - Paxton Access Ltd + 38CA97 + Contour Design LLC - 583BD9 - Fiberhome Telecommunication Technologies Ltd + BC2D98 + ThinGlobal LLC - DCA266 - Hon Hai Precision Ind Ltd + BC1A67 + YF Technology Co., Ltd - C48466 - Apple + AC6BAC + Jenny Science AG - 347C25 - Apple + 7C9763 + Openmatics s.r.o. - CC2DB7 - Apple + 48A2B7 + Kodofon JSC - A0BDCD - BSkyB Ltd + BCEE7B + ASUSTek COMPUTER INC. - BC91B5 - Infinix mobility limited + 3413A8 + Mediplan Limited - 282FC2 - Automotive Data Solutions + 8CAE89 + Y-cam Solutions Ltd - 980074 - Raisecom Technology Ltd + FCE1D9 + Stable Imaging Solutions LLC - 18C19D - Integrated Device Technology (Malaysia) Sdn. Bhd. + B04545 + YACOUB Automation GmbH - 0C9838 - Xiaomi Communications Ltd + C8EE75 + Pishion International Co. Ltd - 74EACB - New H3C Technologies Ltd + 682DDC + Wuhan Changjiang Electro-Communication Equipment CO.,LTD - D41A3F - Guangdong Oppo Mobile Telecommunications Corp Ltd + E8611F + Dawning Information Industry Co.,Ltd - D8B122 - Juniper Networks + 705957 + Medallion Instrumentation Systems - B4C799 - Extreme Networks Inc. + 9CD643 + D-Link International - 646E6C - Radio Datacom LLC + 3C18A0 + Luxshare Precision Industry Company Limited - E88E60 - NSD Corporation + 94E98C + Nokia - 000F9B - Ross Video Limited + 94C3E4 + Atlas Copco IAS GmbH - 0024BA - Texas Instruments + 20E791 + Siemens Healthcare Diagnostics, Inc - 60512C - TCT mobile Ltd + 089758 + Shenzhen Strong Rising Electronics Co.,Ltd DongGuan Subsidiary - 64DB81 - Syszone Ltd + FC19D0 + Cloud Vision Networks Technology Co.,Ltd. - 44AD19 - Xingfei (H.K)Limited + CC3429 + TP-LINK TECHNOLOGIES CO.,LTD. - 38ADBE - New H3C Technologies Ltd + 7CBF88 + Mobilicom LTD - 5CAD76 - Shenzhen TCL New Technology Ltd + 60DB2A + HNS - 5C865C - Samsung Electronics Ltd + 9486D4 + Surveillance Pro Corporation - 04F128 - HMD Global Oy + B424E7 + Codetek Technology Co.,Ltd - 04B167 - Xiaomi Communications Ltd + A0A23C + GPMS - EC8350 - Microsoft Corporation + 68FCB3 + Next Level Security Systems, Inc. - D007CA - Juniper Networks + 542F89 + Euclid Laboratories, Inc. - 1CDF52 - Texas Instruments + 2847AA + Nokia Corporation - 30C507 - ECI Telecom Ltd + 5CD61F + Qardio, Inc - C8458F - Wyler AG + CCFB65 + Nintendo Co., Ltd. - 001BB9 - Elitegroup Computer Systems Ltd + FCD817 + Beijing Hesun Technologies Co.Ltd. - 002461 - Shin Wang Tech. + 34885D + Logitech Far East - 0C5203 - AGM Group Limited + 88576D + XTA Electronics Ltd - 2C5491 - Microsoft Corporation + BC4100 + CODACO ELECTRONIC s.r.o. - 3817C3 - Hewlett Packard Enterprise + 5027C7 + TECHNART Co.,Ltd - 001E1D - East Coast Datacom Inc. + 6C5AB5 + TCL Technoly Electronics (Huizhou) Co., Ltd. - 7846C4 - Daehap Hyper-Tech + B43E3B + Viableware, Inc - 5CE28C - ZyXEL Communications Corp + 0C5CD8 + DOLI Elektronik GmbH - E4BD4B - ZTE Corporation + EC3E09 + PERFORMANCE DESIGNED PRODUCTS, LLC - 38D7CA - 7HUGS Labs + 947C3E + Polewall Norge AS - 000144 - Dell EMC + 385AA8 + Beijing Zhongdun Security Technology Development Co. - 08001B - Dell EMC + F4A294 + EAGLE WORLD DEVELOPMENT CO., LIMITED - 7C010A - Texas Instruments + 9C443D + CHENGDU XUGUANG TECHNOLOGY CO, LTD - E42B34 - Apple + 3C15EA + TESCOM CO., LTD. - 3C2EF9 - Apple + E80410 + Private - A04EA7 - Apple + 909916 + ELVEES NeoTek OJSC - F0989D - Apple + A0143D + PARROT SA - FCD6BD - Robert Bosch GmbH + 6024C1 + Jiangsu Zhongxun Electronic Technology Co., Ltd - 701F53 - Cisco Systems Inc. + 60A9B0 + Merchandising Technologies, Inc - 18396E - Sunsea Telecommunications Ltd + 34A3BF + Terewave. Inc. - EC7D11 - Vivo Mobile Communication Ltd + 8C088B + Remote Solution - 480EEC - TP-Link Technologies Ltd + FC1BFF + V-ZUG AG - 503EAA - TP-Link Technologies Ltd + 00A2FF + abatec group AG - 5800BB - Juniper Networks + F4BD7C + Chengdu jinshi communication Co., LTD - 48BA4E - Hewlett-Packard Company + DCC422 + Systembase Limited - D80831 - Samsung Electronics Ltd + C8F36B + Yamato Scale Co.,Ltd. - 9441C1 - Mini-Cam Limited + 6CD1B0 + WING SING ELECTRONICS HONG KONG LIMITED - 504EDC - Ping Communication + 98F8C1 + IDT Technology Limited - 08674E - Hisense broadband multimedia technology Ltd + A4F522 + CHOFU SEISAKUSHO CO.,LTD - 500F80 - Cisco Systems Inc. + 845C93 + Chabrier Services - 10F1F2 - LG Electronics (Mobile Communications) + 68E166 + Private - 8C68C8 - ZTE Corporation + 60FEF9 + Thomas & Betts - EC8263 - ZTE Corporation + B8DC87 + IAI Corporation - 683C7D - Magic Intelligence Technology Limited + 78CB33 + DHC Software Co.,Ltd - 0C1C20 - Kakao Corp + DCF755 + SITRONIK - 24F5A2 - Belkin International Inc. + BC2BD7 + Revogi Innovation Co., Ltd. - 74BBD3 - Shenzhen xeme Communication Ltd + 7C6FF8 + ShenZhen ACTO Digital Video Technology Co.,Ltd. - 94282E - New H3C Technologies Ltd + 286D97 + SAMJIN Co., Ltd. - 98F5A9 - Ohsung + 24ECD6 + CSG Science & Technology Co.,Ltd.Hefei - D89EF3 - Dell Inc. + CC2A80 + Micro-Biz intelligence solutions Co.,Ltd - 384F49 - Juniper Networks + F42896 + SPECTO PAINEIS ELETRONICOS LTDA - 4CBD8F - Hangzhou Hikvision Digital Technology Ltd + 1C48F9 + GN Netcom A/S - ECEBB8 - Hewlett Packard Enterprise + 9C4EBF + BoxCast - 6CB749 - Huawei Technologies Ltd + 34A843 + KYOCERA Display Corporation - 989C57 - Huawei Technologies Ltd + 80BBEB + Satmap Systems Ltd - 185282 - Fiberhome Telecommunication Technologies Ltd + 00B78D + Nanjing Shining Electric Automation Co., Ltd - 8C3C4A - NAKAYO Inc + 5C026A + Applied Vision Corporation - 7086C1 - Texas Instruments + 0C9301 + PT. Prasimax Inovasi Teknologi - F4D7B2 - LGS Innovations LLC + 746630 + T:mi Ytti - 00152A - Nokia Corporation + 6CB350 + Anhui comhigher tech co.,ltd - 9C4A7B - Nokia Corporation + E89218 + Arcontia International AB - D86162 - Wistron Neweb Corporation + 0075E1 + Ampt, LLC - 28840E - silicon valley immigration service + D46A91 + SnapAV - 2CD2E7 - Nokia Corporation + B0793C + Revolv Inc - 386EA2 - Vivo Mobile Communication Ltd + 3859F8 + MindMade Sp. z o.o. - 982D68 - Samsung Electronics Ltd + 4CDF3D + TEAM ENGINEERS ADVANCE TECHNOLOGIES INDIA PVT LTD - BC2E48 - ARRIS Group Inc. + 98CDB4 + Virident Systems, Inc. - 608CE6 - ARRIS Group Inc. + A42305 + Open Networking Laboratory - 080070 - Mitsubishi Precision Ltd + A05B21 + ENVINET GmbH - 444AB0 - Zhejiang Moorgen Intelligence Technology Ltd + 50B8A2 + ImTech Technologies LLC, - DC6AEA - Infinix mobility limited + B04C05 + Fresenius Medical Care Deutschland GmbH - C421C8 - Kyocera Corporation + 34CD6D + CommSky Technologies - 80739F - Kyocera Corporation + B0FEBD + Private - 705812 - Panasonic Corporation AVC Networks Company + 60699B + isepos GmbH - 04209A - Panasonic Corporation AVC Networks Company + D4D50D + Southwest Microwave, Inc - 34008A - IEEE Registration Authority + E438F2 + Advantage Controls - A41115 - Robert Bosch Engineering and Business Solutions pvt Ltd + C4C755 + Beijing HuaqinWorld Technology Co.,Ltd - 40D63C - Equitech Industrial(DongGuan) Ltd + 0C2D89 + QiiQ Communications Inc. - F4F3AA - JBL GmbH & Co. KG + A8D236 + Lightware Visual Engineering - 9050CA - Hitron Technologies Inc. + 788DF7 + Hitron Technologies. Inc - 409922 - Azurewave Technologies Inc. + 945047 + Rechnerbetriebsgruppe - C06D1A - Tianjin Henxinhuifeng Technology Ltd + E031D0 + SZ Telstar CO., LTD - 107B44 - ASUSTek Computer Inc. + 54112F + Sulzer Pump Solutions Finland Oy - 84253F - silex technology Inc. + 4C55B8 + Turkcell Teknoloji - 0008C9 - TechniSat Digital GmbH Daun + 088039 + Cisco SPVTG - D8B12A - Panasonic Mobile Communications Ltd + 981094 + Shenzhen Vsun communication technology Co.,ltd - B019C6 - Apple + A4F3C1 + Open Source Robotics Foundation, Inc. - 3866F0 - Apple + 141330 + Anakreon UK LLP - 008009 - Jupiter Systems Inc. + 74CA25 + Calxeda, Inc. - 00C064 - General Datacomm LLC + B4346C + MATSUNICHI DIGITAL TECHNOLOGY (HONG KONG) LIMITED - E86819 - Huawei Technologies Ltd + 9046B7 + Vadaro Pte Ltd - 1CAB34 - New H3C Technologies Ltd + 04CF25 + MANYCOLORS, INC. - 3C7843 - Huawei Technologies Ltd + B050BC + SHENZHEN BASICOM ELECTRONIC CO.,LTD. - 5C0979 - Huawei Technologies Ltd + 841E26 + KERNEL-I Co.,LTD - E4FB5D - Huawei Technologies Ltd + DC7014 + Private - 0001CC - Japan Total Design Communication Ltd + E4F3E3 + Shanghai iComhome Co.,Ltd. - 0030C8 - GAD Line Ltd + 0086A0 + Private - 0016E0 - 3Com Corporation + 60FE1E + China Palms Telecom.Ltd - D8DECE - Isung Ltd + 0CF405 + Beijing Signalway Technologies Co.,Ltd - 703EAC - Apple + 5061D6 + Indu-Sol GmbH - 0011C0 - Aday Technology Inc + 04BFA8 + ISB Corporation - 0005F1 - Vrcom Inc. + 8CC7D0 + zhejiang ebang communication co.,ltd - AC512C - Infinix mobility limited + B8AE6E + Nintendo Co., Ltd. - 309935 - ZTE Corporation + D0EB03 + Zhehua technology limited - 0C72D9 - ZTE Corporation + 683EEC + ERECA - 1062D0 - Technicolor CH USA Inc. + 0C2AE7 + Beijing General Research Institute of Mining and Metallurgy - 50642B - XIAOMI Electronics Ltd + 983071 + DAIKYUNG VASCOM - 28401A - C8 MediSensors Inc. + D49524 + Clover Network, Inc. - 30C01B - Shenzhen Jingxun Software Telecommunication Technology Ltd + 0C0400 + Jantar d.o.o. - 8886C2 - STABILO International GmbH + 687CD5 + Y Soft Corporation, a.s. - 08A8A1 - Cyclotronics Power Concepts Inc. + C04DF7 + SERELEC - F4B520 - Biostar Microtech international Corp. + 50A715 + Aboundi, Inc. - CC2F71 - Intel Corporation + C42628 + Airo Wireless - 001CC5 - 3Com Corporation + 30AABD + Shanghai Reallytek Information Technology Co.,Ltd - 887A31 - Velankani Electronics Pvt Ltd + A4B818 + PENTA Gesellschaft für elektronische Industriedatenverarbeitung mbH - 8C0F6F - Pegatron Corporation + 907AF1 + Wally - 8C2505 - Huawei Technologies Ltd + 2CB693 + Radware - 8C3BAD - Netgear + AC4122 + Eclipse Electronic Systems Inc. - 64CFD9 - Texas Instruments + 0C8484 + Zenovia Electronics Inc. - 747D24 - Phicomm (Shanghai) Ltd + 005907 + LenovoEMC Products USA, LLC - D09466 - Dell Inc. + A861AA + Cloudview Limited - 38E595 - Shenzhen Gongjin Electronics Ltd + C8B373 + Cisco-Linksys, LLC - BC9680 - Shenzhen Gongjin Electronics Ltd + 2C245F + Babolat VS - A47B9D - Espressif Inc. + 905692 + Autotalks Ltd. - B8F8BE - Bluecom + FC1186 + Logic3 plc - 002482 - Ruckus Wireless + C8EEA6 + Shenzhen SHX Technology Co., Ltd - 689234 - Ruckus Wireless + 2481AA + KSH International Co., Ltd. - 50A733 - Ruckus Wireless + E01877 + FUJITSU LIMITED - 2C5D93 - Ruckus Wireless + E457A8 + Stuart Manufacturing, Inc. - 38FF36 - Ruckus Wireless + 789966 + Musilab Electronics (DongGuan)Co.,Ltd. - 84183A - Ruckus Wireless + 841715 + GP Electronics (HK) Ltd. - 24C9A1 - Ruckus Wireless + 58EB14 + Proteus Digital Health - 7C2EDD - Samsung Electronics Ltd + C458C2 + Shenzhen TATFOOK Technology Co., Ltd. - 3CF7A4 - Samsung Electronics Ltd + D0CDE1 + Scientech Electronics - 103034 - Cara Systems + 104D77 + Innovative Computer Engineering - 0000FE - Annapolis Micro Systems Inc. + 5CE0CA + FeiTian United (Beijing) System Technology Co., Ltd. - 00D01F - Senetas Corporation Ltd + E08177 + GreenBytes, Inc. - 6447E0 - Feitian Technologies Ltd + 9C9811 + Guangzhou Sunrise Electronics Development Co., Ltd - B44F96 - Zhejiang Xinzailing Technology Ltd + B86091 + Onnet Technologies and Innovations LLC - 4C65A8 - IEEE Registration Authority + 301518 + Ubiquitous Communication Co. ltd. - B0DFC1 - Tenda Technology LtdDongguan branch + D0D471 + MVTECH co., Ltd - 9C6F52 - ZTE Corporation + 0868D0 + Japan System Design - E86D65 - AUDIO MOBIL Elektronik GmbH + D4223F + Lenovo Mobile Communication Technology Ltd. - 706E6D - Cisco Systems Inc. + E8E875 + iS5 Communications Inc. - 604762 - Beijing Sensoro Technology Ltd + C80E95 + OmniLync Inc. - BC1C81 - Sichuan iLink Technology Ltd + 6897E8 + Society of Motion Picture &amp; Television Engineers - 900A1A - Taicang T&W Electronics + 7CA15D + GN ReSound A/S - 506E92 - Innocent Technology Ltd + 3C081E + Beijing Yupont Electric Power Technology Co.,Ltd - 30FE31 - Nokia + FC58FA + Shen Zhen Shi Xin Zhong Xin Technology Co.,Ltd. - 98F2B3 - Hewlett Packard Enterprise + 60BB0C + Beijing HuaqinWorld Technology Co,Ltd - C4571F - June Life Inc + 10B9FE + Lika srl - 886AE3 - Alpha Networks Inc. + A42C08 + Masterwork Automodules - 1C4D70 - Intel Corporation + 8C078C + FLOW DATA INC - D822F4 - Avnet Silica + F8DFA8 + zte corporation - 348F27 - Ruckus Wireless + A895B0 + Aker Subsea Ltd - 2C9EEC - Jabil Circuit Penang + 28CBEB + One - 001CFA - Alarm.com + B8C46F + PRIMMCON INDUSTRIES INC - 60313B - Sunnovo International Limited + D8B02E + Guangzhou Zonerich Business Machine Co., LTD. - 6CB227 - Sony Video & Sound Products Inc. + 4CCC34 + Motorola Solutions Inc. - 986F60 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 30055C + Brother industries, LTD. - 000CAB - Commend International GmbH + 080EA8 + Velex s.r.l. - 745427 - Shenzhen Fast Technologies Ltd + C4E032 + IEEE 1904.1 Working Group - 60720B - BLU Products Inc + 8C76C1 + Goden Tech Limited - 308976 - Dalian Lamba Technology Ltd + 08F1B7 + Towerstream Corpration - 2C2617 - Oculus VR LLC + C044E3 + Shenzhen Sinkna Electronics Co., LTD - 34D954 - WiBotic Inc. + 18550F + Cisco SPVTG - 4857DD - Facebook Inc + 187A93 + AMICCOM Electronics Corporation - 487D2E - TP-Link Technologies Ltd + 8887DD + DarbeeVision Inc. - B0DAF9 - ARRIS Group Inc. + 30C82A + WI-BIZ srl - 1835D1 - ARRIS Group Inc. + C45DD8 + HDMI Forum - C0A5DD - Shenzhen Mercury Communication Technologies Ltd + C4EBE3 + RRCN SAS - 488D36 - Arcadyan Corporation + 94756E + QinetiQ North America - BCD713 - Owl Labs + 4C1A95 + Novakon Co., Ltd. - E8E1E1 - Gemtek Technology Ltd + A00363 + Robert Bosch Healthcare GmbH - 28070D - Guangzhou Winsound Information Technology Ltd + 6499A0 + AG Elektronik AB - 00A3D1 - Cisco Systems Inc. + 848E96 + Embertec Pty Ltd - FC4D8C - Shenzhen Pante Electronics Technology Ltd + 449B78 + The Now Factory - FC06ED - M2Motive Technology Inc. + DCA989 + MACANDC - F0D4F6 - Lars Thrane A/S + 7C438F + E-Band Communications Corp. - F4A997 - Canon Inc. + F0F669 + Motion Analysis Corporation - 64DFE9 - Ateme + 78995C + Nationz Technologies Inc - 10C6FC - Garmin International + 54115F + Atamo Pty Ltd - AC2205 - Compal Broadband Networks Inc. + 8CAE4C + Plugable Technologies - 80A036 - Shanghai MXCHIP Information Technology Ltd + 0CC655 + Wuxi YSTen Technology Co.,Ltd. - F07485 - NGD Systems Inc. + 5C89D4 + Beijing Banner Electric Co.,Ltd - 405CFD - Dell Inc. + 182A7B + Nintendo Co., Ltd. - 20F452 - Shanghai IUV Software Development Ltd + 68FB95 + Generalplus Technology Inc. - 509A4C - Dell Inc. + D0B498 + Robert Bosch LLC Automotive Electronics - A0094C - CenturyLink + E05597 + Emergent Vision Technologies Inc. - B43934 - Pen Generations Inc. + 242FFA + Toshiba Global Commerce Solutions - 7426AC - Cisco Systems Inc. + 849DC5 + Centera Photonics Inc. - B02628 - Broadcom Limited + 580943 + Private - 9874DA - Infinix mobility limited + ECFC55 + A. Eberle GmbH & Co. KG - 40B4F0 - Juniper Networks + 88A3CC + Amatis Controls - 143F27 - Noccela Oy + C0A0C7 + FAIRFIELD INDUSTRIES - 105887 - Fiberhome Telecommunication Technologies Ltd + A0E25A + Amicus SK, s.r.o. - 704CA5 - Fortinet Inc. + D40FB2 + Applied Micro Electronics AME bv - 9C061B - Hangzhou H3C Technologies Ltd + 485A3F + WISOL - 50338B - Texas Instruments + 70F1E5 + Xetawave LLC - E8DE8E - Integrated Device Technology (Malaysia) Sdn. Bhd. + E496AE + ALTOGRAPHICS Inc. - D8D866 - Shenzhen Tozed Technologies Ltd + F8F082 + NAGTECH LLC - D8C06A - Hunantv.com Interactive Entertainment Media Ltd + 4C2258 + cozybit, Inc. - AC202E - Hitron Technologies Inc. + 10F49A + T3 Innovation - 1C5A0B - Tegile Systems + 3C57BD + Kessler Crane Inc. - 046E02 - OpenRTLS Group + 04E9E5 + PJRC.COM, LLC - 900E83 - Monico Monitoring Inc. + 50465D + ASUSTek COMPUTER INC. - 601466 - ZTE Corporation + 74BFA1 + HYUNTECK - 6854ED - Alcatel-Lucent + 08B738 + Lite-On Technogy Corp. - 680235 - Konten Networks Inc. + F8AA8A + Axview Technology (Shenzhen) Co.,Ltd - 38AC3D - Nephos Inc + 7C0187 + Curtis Instruments, Inc. - E037BF - Wistron Neweb Corporation + 54F666 + Berthold Technologies GmbH and Co.KG - E81367 - AIRSOUND Inc. + 1C11E1 + Wartsila Finland Oy - 001192 - Cisco Systems Inc. + 703811 + Siemens Mobility Limited - 38F135 - SensorTec-Canada + CC4BFB + Hellberg Safety AB - AC7409 - Hangzhou H3C Technologies Ltd + 6CADEF + KZ Broadband Technologies, Ltd. - C49DED - Microsoft Corporation + 745FAE + TSL PPL - 98A40E - Snap Inc. + 60BD91 + Move Innovation - F40343 - Hewlett Packard Enterprise + 6851B7 + PowerCloud Systems, Inc. - F093C5 - Garland Technology + 1C959F + Veethree Electronics And Marine LLC - 9810E8 - Apple + B4009C + CableWorld Ltd. - C0D012 - Apple + 2C5AA3 + PROMATE ELECTRONIC CO.LTD - BCA920 - Apple + 34E0CF + zte corporation - 48A195 - Apple + F05F5A + Getriebebau NORD GmbH and Co. KG - F80377 - Apple + CC262D + Verifi, LLC - F49634 - Intel Corporation + 3C8AE5 + Tensun Information Technology(Hangzhou) Co.,LTD - 107D1A - Dell Inc. + C0AA68 + OSASI Technos Inc. - 70AF24 - TP Vision Belgium NV + 88D7BC + DEP Company - A41163 - IEEE Registration Authority + F49466 + CountMax, ltd - C4D197 - Ventia Utility Services + 742D0A + Norfolk Elektronik AG - 2C86D2 - Cisco Systems Inc. + 34C803 + Nokia Corporation - 7CE97C - Itel Mobile Limited + 80AAA4 + USAG - 8058F8 - Motorola Mobility LLC, a Lenovo Company + A40BED + Carry Technology Co.,Ltd - DCA4CA - Apple + F85F2A + Nokia Corporation - 8C8FE9 - Apple + C438D3 + TAGATEC CO.,LTD - 70AF25 - Nishiyama Industry Ltd + 6CE4CE + Villiger Security Solutions AG - E8D11B - Askey Computer Corp + 803FD6 + bytes at work AG - 9800C1 - GuangZhou CREATOR Technology Ltd(CHINA) + E85BF0 + Imaging Diagnostics - 54E1AD - LCFC(HeFei) Electronics Technology Ltd + F82285 + Cypress Technology CO., LTD. - 98D3D2 - MEKRA Lang GmbH & Co. KG + 24EE3A + Chengdu Yingji Electronic Hi-tech Co Ltd - 0C5F35 - Niagara Video Corporation + 0CC66A + Nokia Corporation - F8A34F - ZTE Corporation + 74273C + ChangYang Technology (Nanjing) Co., LTD - 001912 - Welcat Inc + 087CBE + Quintic Corp. - 8C78D7 - Shenzhen Fast Technologies Ltd + 044A50 + Ramaxel Technology (Shenzhen) limited company - B8EAAA - ICG NETWORKS Ltd + 38A5B6 + SHENZHEN MEGMEET ELECTRICAL CO.,LTD - B8F883 - TP-Link Technologies Ltd + 0CD9C1 + Visteon Corporation - DCFE18 - TP-Link Technologies Ltd + 68AB8A + RF IDeas - 704F57 - TP-Link Technologies Ltd + E804F3 + Throughtek Co., Ltd. - B0C46C - Senseit + 289EDF + Danfoss Turbocor Compressors, Inc - 0002A1 - World Wide Packets + 784405 + FUJITU(HONG KONG) ELECTRONIC Co.,LTD. - 00E022 - Analog Devices Inc. + C4AD21 + MEDIAEDGE Corporation - 14B7F8 - Technicolor CH USA Inc. + 0868EA + EITO ELECTRONICS CO., LTD. - 903D6B - Zicon Technology Corp. + 801DAA + Avaya Inc - B04089 - Senient Systems Ltd + 7C092B + Bekey A/S - 5425EA - Huawei Technologies Ltd + 842BBC + Modelleisenbahn GmbH - 3C7F6F - Telechips Inc. + C401B1 + SeekTech INC - 5CBA37 - Microsoft Corporation + C0C946 + MITSUYA LABORATORIES INC. - 00C0C6 - Personal Media Corp. + E8CBA1 + Nokia Corporation - 28FECD - Lemobile Information Technology (Beijing) Ltd + E0AAB0 + SUNTAILI ENTERPRISE CO. LTD, - C894BB - Huawei Technologies Ltd + 649FF7 + Kone OYj - 10B1F8 - Huawei Technologies Ltd + 20C1AF + i Wit Digital Co., Limited - 089E08 - Google Inc. + 085B0E + Fortinet, Inc. - 00210D - Samsin Innotec + EC42F0 + ADL Embedded Solutions, Inc. - C87324 - Sow Cheng Technology Ltd + 502ECE + Asahi Electronics Co.,Ltd - 001F16 - Wistron Corporation + AC14D2 + wi-daq, inc. - 00262D - Wistron Corporation + 9C4CAE + Mesa Labs - 0495E6 - Tenda Technology LtdDongguan branch + 18421D + Private - 50E666 - Shenzhen Techtion Electronics Ltd + 28C914 + Taimag Corporation - 0016D3 - Wistron Corporation + 7493A4 + Zebra Technologies Corp. - 4C4E03 - TCT mobile Ltd + E47185 + Securifi Ltd - 901711 - Hagenuk Marinekommunikation GmbH + 802AFA + Germaneers GmbH - 0010DE - International Datacasting Corporation + 30AEF6 + Radio Mobile Access - C0D9F7 - ShanDong Domor Intelligent S&T Ltd + F4600D + Panoptic Technology, Inc - 00608B - ConferTech International + A82BD6 + Shina System Co., Ltd - 702D84 - i4C Innovations + ACCF23 + Hi-flying electronics technology Co.,Ltd - 2C200B - Apple + CC912B + TE Connectivity Touch Solutions - 8866A5 - Apple + C05E79 + SHENZHEN HUAXUN ARK TECHNOLOGIES CO.,LTD - 000277 - Cash Systemes Industrie + C8AE9C + Shanghai TYD Elecronic Technology Co. Ltd - CCA219 - Shenzhen Along Investment Ltd + 080CC9 + Mission Technology Group, dba Magma - 4C1A3A - PRIMA Research And Production Enterprise Ltd + 640E94 + Pluribus Networks, Inc. - 14B31F - Dell Inc. + 0CB4EF + Digience Co.,Ltd. - ACC1EE - Xiaomi Communications Ltd + AC40EA + C&T Solution Inc. - 5419C8 - Vivo Mobile Communication Ltd + 002AAF + LARsys-Automation GmbH - B0B98A - Netgear + 1CE165 + Marshal Corporation - 805A04 - LG Electronics (Mobile Communications) + 4016FA + EKM Metering - 8CA5A1 - Oregano Systems - Design & Consulting GmbH + 0C130B + Uniqoteq Ltd. - B8ECA3 - ZyXEL Communications Corp + 58BFEA + Cisco Systems, Inc - BC8385 - Microsoft Corporation + FC1D59 + I Smart Cities HK Ltd - 001438 - Hewlett Packard Enterprise + 78C4AB + Shenzhen Runsil Technology Co.,Ltd - E4B005 - Beijing IQIYI Science & Technology Ltd + 146A0B + Cypress Electronics Limited - 000048 - Seiko Epson Corporation + F490EA + Deciso B.V. - B0E892 - Seiko Epson Corporation + 2C542D + Cisco Systems, Inc - AC1826 - Seiko Epson Corporation + AC3FA4 + TAIYO YUDEN CO.,LTD - A4EE57 - Seiko Epson Corporation + 6CAE8B + IBM Corporation - 9CAED3 - Seiko Epson Corporation + BC1401 + Hitron Technologies. Inc - 707C69 - Avaya Inc + 5CEE79 + Global Digitech Co LTD - 500B91 - IEEE Registration Authority + 80CEB1 + Theissen Training Systems GmbH - F8461C - Sony Interactive Entertainment Inc. + FC2A54 + Connected Data, Inc. - 704D7B - ASUSTek Computer Inc. + 40AC8D + Data Management, Inc. - 64A68F - Zhongshan Readboy Electronics Ltd + 4CAA16 + AzureWave Technologies (Shanghai) Inc. - 38BC01 - Huawei Technologies Ltd + 609084 + DSSD Inc - 341E6B - Huawei Technologies Ltd + 782544 + Omnima Limited - 886639 - Huawei Technologies Ltd + A41875 + Cisco Systems, Inc - 00425A - Cisco Systems Inc. + 045C06 + Zmodo Technology Corporation - 18DBF2 - Dell Inc. + 747B7A + ETH Inc. - 18F87A - i3 International Inc. + 48EA63 + Zhejiang Uniview Technologies Co., Ltd. - 4C26E7 - Welgate Ltd + E88DF5 + ZNYX Networks, Inc. - 006041 - Yokogawa Digital Computer Corporation + 642DB7 + SEUNGIL ELECTRONICS - C816A5 - Masimo Corporation + 28BA18 + NextNav, LLC - 0C0227 - Technicolor CH USA Inc. + AC3D75 + HANGZHOU ZHIWAY TECHNOLOGIES CO.,LTD. - 4C11BF - Zhejiang Dahua Technology Ltd + A090DE + VEEDIMS,LLC - 2C598A - LG Electronics (Mobile Communications) + F436E1 + Abilis Systems SARL - B05216 - Hon Hai Precision Ind Ltd + 94CA0F + Honeywell Analytics - A0E4CB - ZyXEL Communications Corp + 284121 + OptiSense Network, LLC - 284ED7 - OutSmart Power Systems Inc. + 38458C + MyCloud Technology corporation - 14A78B - Zhejiang Dahua Technology Ltd + 10E4AF + APR, LLC - A0B8F8 - Amgen U.S.A Inc. + D05785 + Pantech Co., Ltd. - 884477 - Huawei Technologies Ltd + 408B07 + Actiontec Electronics, Inc - 149D09 - Huawei Technologies Ltd + 90F72F + Phillips Machine & Welding Co., Inc. - 686975 - Angler Labs Inc + F4EA67 + Cisco Systems, Inc - 20D25F - SmartCap Technologies + 04F021 + Compex Systems Pte Ltd - E47DBD - Samsung Electronics Ltd + 342F6E + Anywire corporation - 9CFBD5 - Vivo Mobile Communication Ltd + BC2C55 + Bear Flag Design, Inc. - 18F76B - Zhejiang Winsight Technology Ltd + 0C7523 + BEIJING GEHUA CATV NETWORK CO.,LTD - 583112 - Drust + B08E1A + URadio Systems Co., Ltd - 9C83BF - PRO-VISION Inc. + D8E952 + KEOPSYS - 78EF4C - Unetconvergence Ltd + 940070 + Nokia Corporation - 58696C - Ruijie Networks Ltd + E80C75 + Syncbak, Inc. - 48D343 - ARRIS Group Inc. + CCEED9 + VAHLE Automation GmbH - 00C05A - Semaphore Communications Corp. + 608C2B + Hanson Technology - 0007F9 - Sensaphone + 645299 + The Chamberlain Group, Inc - 001CB3 - Apple + 800A06 + COMTEC co.,ltd - 407183 - Juniper Networks + 002A6A + Cisco Systems, Inc - C81B5C - BCTech + 40E793 + Shenzhen Siviton Technology Co.,Ltd - 5CE30E - ARRIS Group Inc. + 000831 + Cisco Systems, Inc - 1CC0E1 - IEEE Registration Authority + 34D09B + MobilMAX Technology Inc. - 001A39 - Merten GmbH&CoKG + BCA4E1 + Nabto - FCECDA - Ubiquiti Networks Inc. + 2818FD + Aditya Infotech Ltd. - 00B0E1 - Cisco Systems Inc. + D8B90E + Triple Domain Vision Co.,Ltd. - 005093 - Boeing + 34BA9A + Asiatelco Technologies Co. - 905C44 - Compal Broadband Networks Inc. + F0007F + Janz - Contadores de Energia, SA - E07C13 - ZTE Corporation + 30B3A2 + Shenzhen Heguang Measurement & Control Technology Co.,Ltd - F41F88 - ZTE Corporation + 506028 + Xirrus Inc. - 14EDBB - 2Wire Inc. + 0091FA + Synapse Product Development - 18E29F - Vivo Mobile Communication Ltd + A05AA4 + Grand Products Nevada, Inc. - 28EE52 - TP-Link Technologies Ltd + F0EEBB + VIPAR GmbH - 687251 - Ubiquiti Networks Inc. + E4FA1D + PAD Peripheral Advanced Design Inc. - B4FBE4 - Ubiquiti Networks Inc. + 005CB1 + Gospell DIGITAL TECHNOLOGY CO., LTD - 707990 - Huawei Technologies Ltd + 1C5C55 + PRIMA Cinema, Inc - A04E01 - CENTRAL ENGINEERING Ltd + 908FCF + UNO System Co., Ltd - 28CA09 - ThyssenKrupp Elevators (Shanghai) Ltd + 6CE907 + Nokia Corporation - 842519 - Samsung Electronics + 984A47 + CHG Hospital Beds - 5C2443 - O-Sung Telecom Ltd + 144978 + Digital Control Incorporated - 24920E - Samsung Electronics Ltd + 2C10C1 + Nintendo Co., Ltd. - FC4203 - Samsung Electronics Ltd + 8CD17B + CG Mobile - A01081 - Samsung Electronics Ltd + 3C6A7D + Niigata Power Systems Co., Ltd. - 3C8BCD - Alcatel-Lucent Shanghai Bell Ltd + 502267 + PixeLINK - 4CF95D - Huawei Technologies Ltd + 506441 + Greenlee - 8421F1 - Huawei Technologies Ltd + 9C1FDD + Accupix Inc. - 00F22C - Shanghai B-star Technology Ltd + 7CDD11 + Chongqing MAS SCI&TECH.Co.,Ltd - 0005EE - Vanderbilt International (SWE) AB + B8FD32 + Zhejiang ROICX Microelectronics - F07960 - Apple + 0064A6 + Maquet CardioVascular - A0D795 - Apple + 988BAD + Corintech Ltd. - 0090E7 - Horsch Elektronik AG + D44B5E + TAIYO YUDEN CO., LTD. - E43ED7 - Arcadyan Corporation + 640E36 + TAZTAG - 5454CF - Probedigital Ltd + C8AF40 + marco Systemanalyse und Entwicklung GmbH - F8633F - Intel Corporation + 40984C + Casacom Solutions AG - 088620 - Tecno Mobile Limited + 3C7059 + MakerBot Industries - F0D5BF - Intel Corporation + 502690 + FUJITSU LIMITED - 6474F6 - Shooter Detection Systems + 5C18B5 + Talon Communications - 981333 - ZTE Corporation + 64E161 + DEP Corp. - 2047ED - BSkyB Ltd + 8823FE + TTTech Computertechnik AG - 748A69 - Korea Image Technology Ltd + 70EE50 + Netatmo - BC4760 - Samsung Electronics Ltd + D4F63F + IEA S.R.L. - 04180F - Samsung Electronics Ltd + 58B0D4 + ZuniData Systems Inc. - 2013E0 - Samsung Electronics Ltd + 64557F + NSFOCUS Information Technology Co., Ltd. - 002566 - Samsung Electronics Ltd + 00082F + Cisco Systems, Inc - D0DB32 - Nokia Corporation + 386077 + PEGATRON CORPORATION - E80036 - Befs Ltd + 708105 + Cisco Systems, Inc - C09F05 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 941D1C + TLab West Systems AB - 5C4979 - AVM Audiovisuelles Marketing und Computersysteme GmbH + 94AE61 + Alcatel Lucent - C0F945 - Toshiba Toko Meter Systems Ltd + 5CCEAD + CDYNE Corporation - 70F8E7 - IEEE Registration Authority + AC54EC + IEEE P1823 Standards Working Group - D42C44 - Cisco Systems Inc. + 709756 + Happyelectronics Co.,Ltd - 843DC6 - Cisco Systems Inc. + E455EA + Dedicated Computing - 002485 - ConteXtream Ltd + B89AED + OceanServer Technology, Inc - 28FCF6 - Shenzhen Xin KingBrand enterprises Ltd + C87D77 + Shenzhen Kingtech Communication Equipment Co.,Ltd - 001F58 - EMH Energiemesstechnik GmbH + B820E7 + Guangzhou Horizontal Information & Network Integration Co. Ltd - 689423 - Hon Hai Precision Ind Ltd + 7C6B52 + Tigaro Wireless - 844BF5 - Hon Hai Precision Ind Ltd + E0ED1A + vastriver Technology Co., Ltd - 08EDB9 - Hon Hai Precision Ind Ltd + 685E6B + PowerRay Co., Ltd. - 3C77E6 - Hon Hai Precision Ind Ltd + B05CE5 + Nokia Corporation - 70188B - Hon Hai Precision Ind Ltd + 3482DE + Kiio Inc - 5C6D20 - Hon Hai Precision Ind Ltd + 20C8B3 + SHENZHEN BUL-TECH CO.,LTD. - 5CAC4C - Hon Hai Precision Ind Ltd + 4C5FD2 + Alcatel-Lucent - 0016DF - Lundinova AB + B8F5E7 + WayTools, LLC - 001D0C - MobileCompia + B81999 + Nesys - B88EDF - Zencheer Communication Technology Ltd + 34255D + Shenzhen Loadcom Technology Co.,Ltd - DC7144 - Samsung Electro Mechanics Ltd + FC0012 + Toshiba Samsung Storage Technolgoy Korea Corporation - 980C82 - Samsung Electro Mechanics Ltd + C029F3 + XySystem - A00BBA - Samsung Electro Mechanics Ltd + 94DE0E + SmartOptics AS - 606BBD - Samsung Electronics Ltd + 807A7F + ABB Genway Xiamen Electrical Equipment CO., LTD - 00214C - Samsung Electronics Ltd + 24DAB6 + Sistemas de Gestión Energética S.A. de C.V - 08C6B3 - Qtech LLC + B07D62 + Dipl.-Ing. H. Horstmann GmbH - 0018AF - Samsung Electronics Ltd + 9CC7D1 + SHARP Corporation - 001EE1 - Samsung Electronics Ltd + 149090 + KongTop industrial(shen zhen)CO.,LTD - 00166B - Samsung Electronics Ltd + 28C718 + Altierre - 0000F0 - Samsung Electronics Ltd + 7C4C58 + Scale Computing, Inc. - 8CC8CD - Samsung Electronics Ltd + 1013EE + Justec International Technology INC. - A8F274 - Samsung Electronics Ltd + 8C271D + QuantHouse - D487D8 - Samsung Electronics Ltd + 38DE60 + Mohlenhoff GmbH - 184617 - Samsung Electronics Ltd + 2839E7 + Preceno Technology Pte.Ltd. - 380A94 - Samsung Electronics Ltd + D4CEB8 + Enatel LTD - D0DFC7 - Samsung Electronics Ltd + 30688C + Reach Technology Inc. - D0C1B1 - Samsung Electronics Ltd + F8E7B5 + µTech Tecnologia LTDA - 8018A7 - Samsung Electronics Ltd + 10EED9 + Canoga Perkins Corporation - F47B5E - Samsung Electronics Ltd + 181420 + TEB SAS - 70F927 - Samsung Electronics Ltd + 4CA74B + Alcatel Lucent - 34E71C - Shenzhen YOUHUA Technology Ltd + 1CE192 + Qisda Corporation - 886AB1 - Vivo Mobile Communication Ltd + 706F81 + Private - 6C1E90 - Hansol Technics Ltd + DCF05D + Letta Teknoloji - 005A13 - Huawei Technologies Ltd + 8CB82C + IPitomy Communications - C45006 - Samsung Electronics Ltd + 807DE3 + Chongqing Sichuan Instrument Microcircuit Co.LTD. - 88329B - Samsung Electro-Mechanics(Thailand) + DC175A + Hitachi High-Technologies Corporation - 1449E0 - Samsung Electro-Mechanics(Thailand) + 900D66 + Digimore Electronics Co., Ltd - D02544 - Samsung Electro-Mechanics(Thailand) + AC4AFE + Hisense Broadband Multimedia Technology Co.,Ltd. - BC4486 - Samsung Electronics Ltd + 54F5B6 + ORIENTAL PACIFIC INTERNATIONAL LIMITED - 20D390 - Samsung Electronics Ltd + 90342B + Gatekeeper Systems, Inc. - 9401C2 - Samsung Electronics Ltd + 5C16C7 + Arista Networks - 50FC9F - Samsung Electronics Ltd + 3C096D + Powerhouse Dynamics - 380B40 - Samsung Electronics Ltd + C8A1BA + Neul Ltd - B8FF61 - Apple + C43A9F + Siconix Inc. - 946124 - Pason Systems + 686E23 + Wi3 Inc. - F0728C - Samsung Electronics Ltd + F49461 + NexGen Storage - 34AA8B - Samsung Electronics Ltd + 0C924E + Rice Lake Weighing Systems - 24DBED - Samsung Electronics Ltd + B8CDA7 + Maxeler Technologies Ltd. - C8DE51 - IntegraOptics + A4B36A + JSC SDO Chromatec - 98F058 - Lynxspring Inc.l. + F43D80 + FAG Industrial Services GmbH - 68C44D - Motorola Mobility LLC, a Lenovo Company + 5435DF + Symeo GmbH - 400D10 - ARRIS Group Inc. + 48DCFB + Nokia Corporation - 943DC9 - Asahi Net Inc. + F0DB30 + Yottabyte - 440444 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 9C31B6 + Kulite Semiconductor Products Inc - 00177E - Meshcom Technologies Inc. + 10C586 + BIO SOUND LAB CO., LTD. - A00460 - Netgear + 10768A + EoCell - 9884E3 - Texas Instruments + 0C3956 + Observator instruments - 38D269 - Texas Instruments + DCA6BD + Beijing Lanbo Technology Co., Ltd. - C8FD19 - Texas Instruments + A45A1C + smart-electronic GmbH - 508CB1 - Texas Instruments + 806459 + Nimbus Inc. - C4F5A5 - Kumalift Ltd + 8C89A5 + Micro-Star INT'L CO., LTD - 70B14E - ARRIS Group Inc. + B4A5A9 + MODI GmbH - 304487 - Hefei Radio Communication Technology Ltd + E8C320 + Austco Marketing & Service (USA) ltd. - 2C9D1E - Huawei Technologies Ltd + C436DA + Rusteletech Ltd. - 0081C4 - Cisco Systems Inc. + 688470 + eSSys Co.,Ltd - 58E876 - IEEE Registration Authority + 8C5CA1 + d-broad,INC - D03742 - Yulong Computer Telecommunication Scientific (Shenzhen) Ltd + D43AE9 + DONGGUAN ipt INDUSTRIAL CO., LTD - 001765 - Nortel Networks + E8CC32 + Micronet LTD - 0015E8 - Nortel Networks + E4DD79 + En-Vision America, Inc. - 00159B - Nortel Networks + 18F650 + Multimedia Pacific Limited - 000F06 - Nortel Networks + 20B7C0 + OMICRON electronics GmbH - 84B541 - Samsung Electronics Ltd + 8058C5 + NovaTec Kommunikationstechnik GmbH - 006F64 - Samsung Electronics Ltd + B8C716 + Fiberhome Telecommunication Technologies Co.,LTD - DC6672 - Samsung Electronics Ltd + D42C3D + Sky Light Digital Limited - EC8EB5 - Hewlett-Packard Company + 1C184A + ShenZhen RicherLink Technologies Co.,LTD - 70AF6A - Shenzhen Fenglian Technology Ltd + F44EFD + Actions Semiconductor Co.,Ltd.(Cayman Islands) - 20F543 - Hui Zhou Gaoshengda Technology Ltd + 24B8D2 + Opzoon Technology Co.,Ltd. - E0DDC0 - Vivo Mobile Communication Ltd + A49981 + FuJian Elite Power Tech CO.,LTD. - 00164D - Alcatel-Lucent IPD + B83A7B + Worldplay (Canada) Inc. - 001AF0 - Alcatel-Lucent IPD + D0EB9E + Seowoo Inc. - 38521A - Nokia + 78028F + Adaptive Spectrum and Signal Alignment (ASSIA), Inc. - 001E40 - Shanghai DareGlobal Technologies Ltd + 24C9DE + Genoray - 94D723 - Shanghai DareGlobal Technologies Ltd + 54055F + Alcatel Lucent - C4047B - Shenzhen YOUHUA Technology Ltd + 6C5D63 + ShenZhen Rapoo Technology Co., Ltd. - 20F41B - Shenzhen Bilian electronic Ltd + 0432F4 + Partron - FCFAF7 - Shanghai Baud Data Communication Ltd + 1407E0 + Abrantix AG - D826B9 - Guangdong Coagent Electronics S&T Ltd + DCCF94 + Beijing Rongcheng Hutong Technology Co., Ltd. - AC9CE4 - Alcatel-Lucent Shanghai Bell Ltd + A4DB2E + Kingspan Environmental Ltd - 00233E - Alcatel-Lucent IPD + DC16A2 + Medtronic Diabetes - 6CBEE9 - Alcatel-Lucent IPD + 308CFB + Dropcam - 001540 - Nortel Networks + BCCD45 + VOISMART - 001ECA - Nortel Networks + 143E60 + Nokia - 00130A - Nortel Networks + 5C56ED + 3pleplay Electronics Private Limited - 001F0A - Nortel Networks + 941673 + Point Core SARL - F8E61A - Samsung Electronics Ltd + C8FE30 + Bejing DAYO Mobile Communication Technology Ltd. - A091C8 - ZTE Corporation + E4D71D + Oraya Therapeutics - 6CA858 - Fiberhome Telecommunication Technologies Ltd + 8427CE + Corporation of the Presiding Bishop of The Church of Jesus Christ of Latter-day Saints - CC2D8C - LG Electronics Inc + 48D8FE + ClarIDy Solutions, Inc. - 98D6F7 - LG Electronics (Mobile Communications) + 70A41C + Advanced Wireless Dynamics S.L. - 700514 - LG Electronics (Mobile Communications) + 7032D5 + Athena Wireless Communications Inc - E892A4 - LG Electronics (Mobile Communications) + 78510C + LiveU Ltd. - 10683F - LG Electronics (Mobile Communications) + 44AAE8 + Nanotec Electronic GmbH & Co. KG - 40B0FA - LG Electronics (Mobile Communications) + 70E843 + Beijing C&W Optical Communication Technology Co.,Ltd. - 0025E5 - LG Electronics (Mobile Communications) + 2C7ECF + Onzo Ltd - 0021FB - LG Electronics (Mobile Communications) + 74B00C + Network Video Technologies, Inc - 34FCEF - LG Electronics (Mobile Communications) + BCBBC9 + Kellendonk Elektronik GmbH - BCF5AC - LG Electronics (Mobile Communications) + B42A39 + ORBIT MERRET, spol. s r. o. - A84E3F - Hitron Technologies Inc. + D4945A + COSMO CO., LTD - 0C4885 - LG Electronics (Mobile Communications) + 304C7E + Panasonic Electric Works Automation Controls Techno Co.,Ltd. - 0022A9 - LG Electronics (Mobile Communications) + 5CF207 + Speco Technologies - 2C6A6F - IEEE Registration Authority + E84040 + Cisco Systems, Inc - 08D833 - Shenzhen RF Technology Ltd + D89DB9 + eMegatech International Corp. - A46032 - MRV Communications (Networks) Ltd + 405A9B + ANOVO - 40667A - mediola - Connected living AG + 103711 + NORBIT ITS - 68A0F6 - Huawei Technologies Ltd + B4B88D + Thuh Company - 000E5C - ARRIS Group Inc. + 4C73A5 + KOVE - 845DD7 - Shenzhen Netcom Electronics Ltd + D428B2 + ioBridge, Inc. - 00B064 - Cisco Systems Inc. + E83EB6 + RIM - 9C2A83 - Samsung Electronics Ltd + BC35E5 + Hydro Systems Company - C80210 - LG Innotek + 28CCFF + Corporacion Empresarial Altra SL - A039F7 - LG Electronics (Mobile Communications) + 94FD1D + WhereWhen Corp - 1CCAE3 - IEEE Registration Authority + 4C07C9 + COMPUTER OFFICE Co.,Ltd. - E4956E - IEEE Registration Authority + 00B342 + MacroSAN Technologies Co., Ltd. - B437D1 - IEEE Registration Authority + 9C5D95 + VTC Electronics Corp. - 0055DA - IEEE Registration Authority + B8A8AF + Logic S.p.A. - 78C2C0 - IEEE Registration Authority + 60F673 + TERUMO CORPORATION - 000EE8 - Zioncom Electronics (Shenzhen) Ltd + E42AD3 + Magneti Marelli S.p.A. Powertrain - 00C095 - ZNYX Networks Inc. + 1CF5E7 + Turtle Industry Co., Ltd. - 002025 - Control Technology Inc. + 980EE4 + Private - 001A6B - Universal Global Scientific Industrial Ltd + 447DA5 + VTION INFORMATION TECHNOLOGY (FUJIAN) CO.,LTD - 001641 - Universal Global Scientific Industrial Ltd + 0CCDD3 + EASTRIVER TECHNOLOGY CO., LTD. - 0010C6 - Universal Global Scientific Industrial Ltd + 84DE3D + Crystal Vision Ltd - 00247E - Universal Global Scientific Industrial Ltd + E06995 + PEGATRON CORPORATION - 00DD0A - Ungermann-Bass Inc. + F8769B + Neopis Co., Ltd. - 683563 - Shenzhen Liown Electronics Ltd + C89C1D + Cisco Systems, Inc - 004072 - Applied Innovation Inc. + D075BE + Reno A&E - 001938 - UMB Communications Ltd + BC6E76 + Green Energy Options Ltd - 4439C4 - Universal Global Scientific Industrial Ltd + E828D5 + Cots Technology - 402CF4 - Universal Global Scientific Industrial Ltd + F8DAF4 + Taishan Online Technology Co., Ltd. - 001E37 - Universal Global Scientific Industrial Ltd + 08D5C0 + Seers Technology Co., Ltd - 1C57D8 - Kraftway Corporation PLC + 6C33A9 + Magicjack LP - 002318 - Toshiba + 108CCF + Cisco Systems, Inc - B86B23 - Toshiba + D8E3AE + CIRTEC MEDICAL SYSTEMS - 0008F1 - Voltaire + CC7669 + SEETECH - 00199D - Vizio Inc. + AC20AA + DMATEK Co., Ltd. - 00E08B - QLogic Corporation + E437D7 + HENRI DEPAEPE S.A.S. - D8EB97 - TRENDnet Inc. + E0A1D7 + SFR - 001C7E - Toshiba + 9481A4 + Azuray Technologies - 002517 - Venntis LLC + BCE09D + Eoslink - 00600F - Westell Technologies Inc. + BC4377 + Hang Zhou Huite Technology Co.,ltd. - 00183A - Westell Technologies Inc. + 7CDD90 + Shenzhen Ogemray Technology Co., Ltd. - 6002B4 - Wistron Neweb Corporation + 9C220E + TASCAN Systems GmbH - 94DF4E - Wistron InfoComm(Kunshan) Ltd + 0C3C65 + Dome Imaging Inc - 98EECB - Wistron Infocomm (Zhongshan) Corporation + C8DF7C + Nokia Corporation - 001BFE - Zavio Inc. + FCAF6A + Qulsar Inc - 5410EC - Microchip Technology Inc. + 081735 + Cisco Systems, Inc - 0004A3 - Microchip Technology Inc. + CCBE71 + OptiLogix BV - 789CE7 - Shenzhen Aikede Technology Ltd + 0C469D + MS Sedco - 509F3B - OI Electric Ltd + 00B033 + OAO Izhevskiy radiozavod - 446EE5 - Huawei Technologies Ltd + 08B7EC + Wireless Seismic - 88F7C7 - Technicolor CH USA Inc. + 18AF9F + DIGITRONIC Automationsanlagen GmbH - 683E34 - MEIZU Technology Ltd + E46C21 + messMa GmbH - C8778B - Mercury Systems - Trusted Mission Solutions Inc. + E0F379 + Vaddio - 00044B - Nvidia + 78B6C1 + AOBO Telecom Co.,Ltd - AC9B0A - Sony Corporation + B09AE2 + STEMMER IMAGING GmbH - 104FA8 - Sony Corporation + 14EE9D + AirNav Systems LLC - 000B6B - Wistron Neweb Corporation + B44CC2 + NR ELECTRIC CO., LTD - AC040B - Peloton Interactive Inc. + 48CB6E + Cello Electronics (UK) Ltd - 48FCB6 - Lava International(H.K) Limited + 006DFB + Vutrix Technologies Ltd - B0E235 - Xiaomi Communications Ltd + 78D004 + Neousys Technology Inc. - 40C729 - Sagemcom Broadband SAS + 8895B9 + Unified Packet Systems Crop - 14C913 - LG Electronics + 78A051 + iiNet Labs Pty Ltd - F8A097 - ARRIS Group Inc. + 804F58 + ThinkEco, Inc. - FC2325 - EosTek (Shenzhen) Ltd + 448C52 + KTIS CO., Ltd - FC3D93 - Longcheer Telecommunication Limited + 346F92 + White Rodgers Division - D8E0B8 - Bulat LLC + 34BDF9 + Shanghai WDK Industrial Co.,Ltd. - 603197 - ZyXEL Communications Corp + D8FE8F + IDFone Co., Ltd. - C0C976 - Shenzhen TINNO Mobile Technology Corp. + 888C19 + Brady Corp Asia Pacific Ltd - 588BF3 - ZyXEL Communications Corp + 08D29A + Proformatique - 5067F0 - ZyXEL Communications Corp + C89383 + Embedded Automation, Inc. - 001349 - ZyXEL Communications Corp + 9067B5 + Alcatel-Lucent - E09861 - Motorola Mobility LLC, a Lenovo Company + 0475F5 + CSST - 9C8ECD - Amcrest Technologies + E80C38 + DAEYOUNG INFORMATION SYSTEM CO., LTD - A009ED - Avaya Inc + E08A7E + Exponent - 0014B4 - General Dynamics United Kingdom Ltd + 8C4DEA + Cerio Corporation - A0B437 - GD Mission Systems + 34DF2A + Fujikon Industrial Co.,Limited - 8C6D50 - Shenzhen MTC Ltd + 70A191 + Trendsetter Medical, LLC - 00F663 - Cisco Systems Inc. + 24BA30 + Technical Consumer Products, Inc. - A06090 - Samsung Electronics Ltd + 188ED5 + TP Vision Belgium N.V. - innovation site Brugge - BC765E - Samsung Electronics Ltd + 40B2C8 + Nortel Networks - E0A8B8 - Le Shi Zhi Xin Electronic Technology (Tianjin) Limited + 708B78 + citygrow technology co., ltd - F45B73 - Wanjiaan Interconnected Technology Ltd + A8B0AE + BizLink Special Cables Germany GmbH - B88198 - Intel Corporation + E42771 + Smartlabs - B0D7CC - Tridonic GmbH & Co KG + 70B08C + Shenou Communication Equipment Co.,Ltd - 2CDDA3 - Point Grey Research Inc. + C03B8F + Minicom Digital Signage - 00809F - ALE International + 20FEDB + M2M Solution S.A.S. - 48C663 - GTO Access Systems LLC + C8A729 + SYStronics Co., Ltd. - 005F86 - Cisco Systems Inc. + 4454C0 + Thompson Aerospace - 381DD9 - FN-Link Technology Limited + 64317E + Dexin Corporation - 1CB9C4 - Ruckus Wireless + 3C99F7 + Lansentechnology AB - 8C59C3 - ADB Italia + 507D02 + BIODIT - B824F0 - SOYO Technology Development Ltd + B4A4E3 + Cisco Systems, Inc - D85B2A - Samsung Electronics Ltd + 94DD3F + A+V Link Technologies, Corp. - FCA89A - Sunitec Enterprise Ltd + F44227 + S & S Research Inc. - 1C7B23 - Qingdao Hisense Communications Ltd + 8C1F94 + RF Surgical System Inc. - 000BDE - TELDIX GmbH + 4491DB + Shanghai Huaqin Telecom Technology Co.,Ltd - CCD31E - IEEE Registration Authority + A8556A + 3S System Technology Inc. - 34B354 - Huawei Technologies Ltd + D0574C + Cisco Systems, Inc - 1C6E76 - Quarion Technology Inc + F8DAE2 + NDC Technologies - 90C1C6 - Apple + AC83F0 + Cobalt Digital Inc. - 6C0EE6 - Chengdu Xiyida Electronic Technology Ltd + CC6B98 + Minetec Wireless Technologies - CC500A - Fiberhome Telecommunication Technologies Ltd + 3C04BF + PRAVIS SYSTEMS Co.Ltd., - D046DC - Southwest Research Institute + 7C55E7 + YSI, Inc. - 70A2B3 - Apple + C4F464 + Spica international - F40F24 - Apple + 602A54 + CardioTek B.V. - 4C57CA - Apple + BCFFAC + TOPCON CORPORATION - 000763 - Sunniwell Cyber Tech Ltd + 14D76E + CONCH ELECTRONIC Co.,Ltd - 0062EC - Cisco Systems Inc. + 445EF3 + Tonalite Holding B.V. - CC167E - Cisco Systems Inc. + 68DB96 + OPWILL Technologies CO .,LTD - C46AB7 - Xiaomi Communications Ltd + 94A7BC + BodyMedia, Inc. - 000AED - HARTING Electronics GmbH + C8A1B6 + Shenzhen Longway Technologies Co., Ltd - 240A11 - TCT mobile Ltd + 38580C + Panaccess Systems GmbH - D8E56D - TCT mobile Ltd + 4451DB + Raytheon BBN Technologies - 540593 - WOORI ELEC Ltd + 585076 + Linear Equipamentos Eletronicos SA - C02FF1 - Volta Networks + F0F9F7 + IES GmbH & Co. KG - E8A7F2 - sTraffic + 64A232 + OOO Samlight - 001F20 - Logitech Europe SA + 64FC8C + Zonar Systems - 741F4A - Hangzhou H3C Technologies Ltd + 0C8D98 + TOP EIGHT IND CORP - E41D2D - Mellanox Technologies Inc. + 40C7C9 + Naviit Inc. - 0CDA41 - Hangzhou H3C Technologies Ltd + 9803A0 + ABB n.v. Power Quality Products - 74258A - Hangzhou H3C Technologies Ltd + DCFAD5 + STRONG Ges.m.b.H. - A0B662 - Acutvista Innovation Ltd + 6C8D65 + Wireless Glue Networks, Inc. - E42F56 - OptoMET GmbH + 7CBB6F + Cosco Electronics Co., Ltd. - F8DA0C - Hon Hai Precision Ind Ltd + 20B0F7 + Enclustra GmbH - 1C1B0D - Giga-Byte Technology Ltd + B4C810 + Umpi srl - 48E9F1 - Apple + 543131 + Raster Vision Ltd - 903809 - Ericsson AB + D0E347 + Yoga - 00A006 - Image Data Processing System Group + 705EAA + Action Target, Inc. - C83F26 - Microsoft Corporation + 34F968 + ATEK Products, LLC - 3497F6 - ASUSTek Computer Inc. + F8C091 + Highgates Technology - 50680A - Huawei Technologies Ltd + AC9B84 + Smak Tecnologia e Automacao - 002238 - Logiplus + 90F278 + Radius Gateway - 000C49 - Dangaard Telecom Denmark A/S + 806629 + Prescope Technologies CO.,LTD. - 0008B9 - Kaonmedia Ltd + 4C60D5 + airPointe of New Hampshire - 60B387 - Synergics Technologies GmbH + 842914 + EMPORIA TELECOM Produktions- und VertriebsgesmbH & Co KG - A4D8CA - Hong Kong Water World Technology Co. Limited + BC7DD1 + Radio Data Comms - 8019FE - JianLing Technology Ltd + 646707 + Beijing Omnific Technology, Ltd. - 60B4F7 - Plume Design Inc + 58FD20 + Systemhouse Solutions AB - 487ADA - Hangzhou H3C Technologies Ltd + F0ED1E + Bilkon Bilgisayar Kontrollu Cih. Im.Ltd. - 001F45 - Enterasys + C416FA + Prysm Inc - 001E90 - Elitegroup Computer Systems Ltd + 506F9A + Wi-Fi Alliance - 0022B1 - Elbit Systems Ltd + 241F2C + Calsys, Inc. - 0000B4 - Edimax Technology Ltd + F0BDF1 + Sipod Inc. - 00168F - GN Netcom A/S + CC43E3 + Trump s.a. - 000D87 - Elitegroup Computer Systems Ltd + ACA016 + Cisco Systems, Inc - 1078D2 - Elitegroup Computer Systems Ltd + 58E747 + Deltanet AG - 002197 - Elitegroup Computer Systems Ltd + 40618E + Stella-Green Co - E4F3F5 - Shenzhen Mercury Communication Technologies Ltd + 68E41F + Unglaube Identech GmbH - A08CFD - Hewlett-Packard Company + 389F83 + OTN Systems N.V. - 000E03 - Emulex Corporation + BC6A16 + tdvine - 00CAE5 - Cisco Systems Inc. + 003A9D + NEC Platforms, Ltd. - 004268 - Cisco Systems Inc. + 009363 + Uni-Link Technology Co., Ltd. - 4883C7 - Sagemcom Broadband SAS + 7C7673 + ENMAS GmbH - 40163B - Samsung Electronics Ltd + 003532 + Electro-Metrics Corporation - 44650D - Amazon Technologies Inc. + 081FF3 + Cisco Systems, Inc - D4F207 - DIAODIAO(Beijing)Technology Ltd + 44376F + Young Electric Sign Co - D4AD2D - Fiberhome Telecommunication Technologies Ltd + 6CDC6A + Promethean Limited - F08CFB - Fiberhome Telecommunication Technologies Ltd + 9055AE + Ericsson, EAB/RWI/K - 48555F - Fiberhome Telecommunication Technologies Ltd + 84C727 + Gnodal Ltd - FC3F7C - Huawei Technologies Ltd + 28CD4C + Individual Computers GmbH - 384C4F - Huawei Technologies Ltd + 8C53F7 + A&D ENGINEERING CO., LTD. - 0CBF3F - Shenzhen Lencotion Technology Ltd + 404022 + ZIV - 50FF99 - IEEE Registration Authority + A85BB0 + Shenzhen Dehoo Technology Co.,Ltd - 84E323 - Green Wave Telecommunication SDN BHD + 888717 + CANON INC. - 705A9E - Technicolor CH USA Inc. + 1010B6 + McCain Inc - 04A316 - Texas Instruments + D4823E + Argosy Technologies, Ltd. - 140C5B - PLNetworks + 44A689 + PROMAX ELECTRONICA SA - 001706 - Techfaithwireless Communication Technology Limited. + 087695 + Auto Industrial Co., Ltd. - FC084A - Fujitsu Limited + ACCE8F + HWA YAO TECHNOLOGIES CO., LTD - BC9889 - Fiberhome Telecommunication Technologies Ltd + 8C9236 + Aus.Linx Technology Co., Ltd. - 24615A - China Mobile Group Device Ltd + F8912A + GLP German Light Products GmbH - 405EE1 - Shenzhen H&T Intelligent Control Ltd + 10C73F + Midas Klark Teknik Ltd - 002578 - JSC Concern Sozvezdie + 44E49A + OMNITRONICS PTY LTD - 30B49E - TP-Link Technologies Ltd + 08F2F4 + Net One Partners Co.,Ltd. - C83870 - Samsung Electronics Ltd + 0C7D7C + Kexiang Information Technology Co, Ltd. - 1C553A - QianGua Corp. + B482FE + ASKEY COMPUTER CORP - 34E70B - HAN Networks Ltd + 307C30 + RIM - 007888 - Cisco Systems Inc. + BC4E3C + CORE STAFF CO., LTD. - 900325 - Huawei Technologies Ltd + 3037A6 + Cisco Systems, Inc - 98E7F5 - Huawei Technologies Ltd + DC1D9F + U & B tech - 085BDA - CliniCare Ltd + B09074 + Fulan Electronics Limited - 1CC035 - Planex Communications Inc. + 94F692 + Geminico co.,Ltd. - 34543C - Takaoka Toko Ltd + 785C72 + Hioso Technology Co., Ltd. - 1866DA - Dell Inc. + 580556 + Elettronica GF S.r.L. - 583277 - Reliance Communications LLC + 10445A + Shaanxi Hitech Electronic Co., LTD - 248A07 - Mellanox Technologies Inc. + F47626 + Viltechmeda UAB - 9C9D5D - Raden Inc + 68EFBD + Cisco Systems, Inc - DC4D23 - MRV Comunications + F02FD8 + Bi2-Vision - 0023B3 - Lyyn AB + 502A8B + Telekom Research and Development Sdn Bhd - 402E28 - MiXTelematics + EC43E6 + AWCER Ltd. - 6C8FB5 - Microsoft Mobile Oy + F02408 + Talaris (Sweden) AB - 008E73 - Cisco Systems Inc. + 8081A5 + TONGQING COMMUNICATION EQUIPMENT (SHENZHEN) Co.,Ltd - 0015C1 - Sony Interactive Entertainment Inc. + 8894F9 + Gemicom Technology, Inc. - A09D91 - SoundBridge + 502A7E + Smart electronic GmbH - 40B688 - LEGIC Identsystems AG + F0264C + Sigrist-Photometer AG - 9CD48B - Innolux Technology Europe BV + 544249 + Sony Corporation - 90A62F - Naver + 0C17F1 + TELECSYS - C0C522 - ARRIS Group Inc. + 7812B8 + ORANTEK LIMITED - 1C9E46 - Apple + 10B7F6 + Plastoform Industries Ltd. - C4E510 - Mechatro Inc. + 448E81 + VIG - 18A6F7 - TP-Link Technologies Ltd + 0C8411 + A.O. Smith Water Products - 00351A - Cisco Systems Inc. + 98BC99 + Edeltech Co.,Ltd. - 00AF1F - Cisco Systems Inc. + 904716 + RORZE CORPORATION - 803896 - Sharp Corporation + A4DA3F + Bionics Corp. - 0060EC - Hermary Opto Electronics Inc. + A8C222 + TM-Research Inc. - C0CCF8 - Apple + 003D41 + Hatteland Computer AS - 9C4FDA - Apple + CC5076 + Ocom Communications, Inc. - 8489AD - Apple + 5C8778 + Cybertelbridge co.,ltd - AC3A7A - Roku Inc. + 38BB23 + OzVision America LLC - B83E59 - Roku Inc. + 003A9B + Cisco Systems, Inc - DC3A5E - Roku Inc. + 2C3427 + ERCO & GENER - 001A73 - Gemtek Technology Ltd + 80912A + Lih Rong electronic Enterprise Co., Ltd. - 00904B - Gemtek Technology Ltd + 803B9A + ghe-ces electronic ag - 001A7F - GCI Science & Technology Ltd + 743256 + NT-ware Systemprg GmbH - 00180F - Nokia Danmark A/S + 4CC452 + Shang Hai Tyd. Electon Technology Ltd. - C8979F - Nokia Corporation + 7CCB0D + Antaira Technologies, LLC - ECF35B - Nokia Corporation + C01E9B + Pixavi AS - 544408 - Nokia Corporation + C4E17C + U2S co. - 3CC243 - Nokia Corporation + 20BFDB + DVL - 0021FC - Nokia Danmark A/S + 448312 + Star-Net - 001F5D - Nokia Danmark A/S + E0ABFE + Orb Networks, Inc. - 001F01 - Nokia Danmark A/S + A05DE7 + DIRECTV, Inc. - 001BEE - Nokia Danmark A/S + D0E40B + Wearable Inc. - 001979 - Nokia Danmark A/S + 747E1A + Red Embedded Design Limited - 0025D0 - Nokia Danmark A/S + 14A86B + ShenZhen Telacom Science&Technology Co., Ltd - 0024D4 - Freebox SAS + 0CC3A7 + Meritec - 347E39 - Nokia Danmark A/S + DCE2AC + Lumens Digital Optics Inc. - 00507F - DrayTek Corp. + 98D88C + Nortel Networks - 647791 - Samsung Electronics Ltd + 78192E + NASCENT Technology - 9CE6E7 - Samsung Electronics Ltd + 48EB30 + ETERNA TECHNOLOGY, INC. - 9C0298 - Samsung Electronics Ltd + 4C322D + TELEDATA NETWORKS - 28987B - Samsung Electronics Ltd + AC867E + Create New Technology (HK) Limited Company - 54FA3E - Samsung Electronics Ltd + 8C598B + C Technologies AB - 0C8910 - Samsung Electronics Ltd + D44CA7 + Informtekhnika & Communication, LLC - 78ABBB - Samsung Electronics Ltd + A04025 + Actioncable, Inc. - D8C4E9 - Samsung Electronics Ltd + 4C4B68 + Mobile Device, Inc. - BCD11F - Samsung Electronics Ltd + 201257 + Most Lucky Trading Ltd - F4428F - Samsung Electronics Ltd + E8DAAA + VideoHome Technology Corp. - 0090A2 - CyberTAN Technology Inc. + 647D81 + YOKOTA INDUSTRIAL CO,.LTD - 0090D6 - Crystal Group Inc. + 7CCFCF + Shanghai SEARI Intelligent System Co., Ltd - 446D6C - Samsung Electronics Ltd + DC3350 + TechSAT GmbH - 00F46F - Samsung Electronics Ltd + E064BB + DigiView S.r.l. - 0C715D - Samsung Electronics Ltd + 68AAD2 + DATECS LTD., - 9C80DF - Arcadyan Technology Corporation + A4DE50 + Total Walther GmbH - 002308 - Arcadyan Technology Corporation + D8D67E + GSK CNC EQUIPMENT CO.,LTD - 880355 - Arcadyan Technology Corporation + C4AAA1 + SUMMIT DEVELOPMENT, spol.s r.o. - 34BB1F - BlackBerry RTS + 1CF061 + SCAPS GmbH - 406F2A - BlackBerry RTS + A893E6 + JIANGXI JINGGANGSHAN CKING COMMUNICATION TECHNOLOGY CO.,LTD - 7C1CF1 - Huawei Technologies Ltd + 3032D4 + Hanilstm Co., Ltd. - 78F557 - Huawei Technologies Ltd + 04B466 + BSP Co., Ltd. - E02861 - Huawei Technologies Ltd + 68CC9C + Mine Site Technologies - D0D04B - Huawei Technologies Ltd + 146E0A + Private - 480031 - Huawei Technologies Ltd + 6C0F6A + JDC Tech Co., Ltd. - D476EA - ZTE Corporation + F0BCC8 + MaxID (Pty) Ltd - 00175A - Cisco Systems Inc. + 24828A + Prowave Technologies Ltd. - 0896D7 - AVM GmbH + 00271B + Alec Sicherheitssysteme GmbH - 506A03 - Netgear + 002718 + Suzhou NEW SEAUNION Video Technology Co.,Ltd - 100D7F - Netgear + 00270B + Adura Technologies - 504A6E - Netgear + 00270D + Cisco Systems, Inc - 4C09D4 - Arcadyan Technology Corporation + 002707 + Lift Complex DS, JSC - 18C086 - Broadcom + 0026FE + MKD Technology Inc. - 001018 - Broadcom + B4B5AF + Minsung Electronics - C8FF28 - Liteon Technology Corporation + 04B3B6 + Seamap (UK) Ltd - B81619 - ARRIS Group Inc. + 0026E5 + AEG Power Solutions - B077AC - ARRIS Group Inc. + 0026BC + General Jack Technology Ltd. - FCB4E6 - Askey Computer Corp + 0026AE + Wireless Measurement Ltd - 00192C - ARRIS Group Inc. + 0026B1 + Navis Auto Motive Systems, Inc. - 00195E - ARRIS Group Inc. + 0026AA + Kenmec Mechanical Engineering Co., Ltd. - 001A1B - ARRIS Group Inc. + 002670 + Cinch Connectors - 001A66 - ARRIS Group Inc. + 002671 + AUTOVISION Co., Ltd - 001A77 - ARRIS Group Inc. + 0026D7 + KM Electornic Technology Co., Ltd. - 64ED57 - ARRIS Group Inc. + 0026D0 + Semihalf - A4ED4E - ARRIS Group Inc. + 0026D2 + Pcube Systems, Inc. - 00211E - ARRIS Group Inc. + 0026A0 + moblic - 002180 - ARRIS Group Inc. + 002696 + NOOLIX Co., Ltd - 001BDD - ARRIS Group Inc. + 00269A + Carina System Co., Ltd. - 001D6B - ARRIS Group Inc. + 002695 + ZT Group Int'l Inc - 001DBE - ARRIS Group Inc. + 002693 + QVidium Technologies, Inc. - 0012C9 - ARRIS Group Inc. + 0026CD + PurpleComm, Inc. - 0023A2 - ARRIS Group Inc. + 00268E + Alta Solutions, Inc. - 0023ED - ARRIS Group Inc. + 002678 + Logic Instrument SA - 001B52 - ARRIS Group Inc. + 002677 + DEIF A/S - 001E8D - ARRIS Group Inc. + 0026E3 + DTI - E0469A - Netgear + 002665 + ProtectedLogic Corporation - 30469A - Netgear + 002660 + Logiways - 002493 - ARRIS Group Inc. + 002614 + KTNF - 002641 - ARRIS Group Inc. + 002610 + Apacewave Technologies - 0015D0 - ARRIS Group Inc. + 00260E + Ablaze Systems, LLC - 001596 - ARRIS Group Inc. + 00260D + Mercury Systems, Inc. - 04E676 - AMPAK Technology Inc. + 00260A + Cisco Systems, Inc - 0022F4 - AMPAK Technology Inc. + 00262C + IKT Advanced Technologies s.r.o. - 001DBA - Sony Corporation + 00262E + Chengdu Jiuzhou Electronic Technology Inc - 0024BE - Sony Corporation + 002629 + Juphoon System Software Inc. - 0CFE45 - Sony Interactive Entertainment Inc. + 002648 + Emitech Corp. - 2016D8 - Liteon Technology Corporation + 002645 + Circontrol S.A. - F8D0AC - Sony Interactive Entertainment Inc. + 00263E + Trapeze Networks - 20E564 - ARRIS Group Inc. + 00263C + Bachmann Technology GmbH & Co. KG - 90B134 - ARRIS Group Inc. + 00263D + MIA Corporation - 40B7F3 - ARRIS Group Inc. + 002632 + Instrumentation Technologies d.d. - 0017E2 - ARRIS Group Inc. + 0025E2 + Everspring Industry Co., Ltd. - 001675 - ARRIS Group Inc. + 0025E1 + SHANGHAI SEEYOO ELECTRONIC & TECHNOLOGY CO., LTD - 000CE5 - ARRIS Group Inc. + 002625 + MediaSputnik - 0003E0 - ARRIS Group Inc. + 002626 + Geophysical Survey Systems, Inc. - 00D0C9 - Advantech Ltd + 00261B + LAUREL BANK MACHINES CO., LTD. - 6487D7 - ADB Broadband Italia + 0025F9 + GMK electronic design GmbH - E0B2F1 - FN-Link Technology Limited + 0025F7 + Ansaldo STS USA - 0C4C39 - MitraStar Technology Corp. + 002603 + Shenzhen Wistar Technology Co., Ltd - 74888B - ADB Broadband Italia + 0025A6 + Central Network Solution Co., Ltd. - 008C54 - ADB Broadband Italia + 0025AA + Beijing Soul Technology Co.,Ltd. - 00247B - Actiontec Electronics Inc. + 0025A3 + Trimax Wireless, Inc. - 0004E3 - Accton Technology Corp + 00259C + Cisco-Linksys, LLC - 0010B5 - Accton Technology Corp + 0025A2 + Alta Definicion LINCEO S.L. - 001974 - 16063 + 0025DA + Secura Key - E8617E - Liteon Technology Corporation + 0025DB + ATI Electronics(Shenzhen) Co., LTD - 18CF5E - Liteon Technology Corporation + 0025D5 + Robonica (Pty) Ltd - F0272D - Amazon Technologies Inc. + 0025CC + Mobile Communications Korea Incorporated - 84D6D0 - Amazon Technologies Inc. + 0025C8 + S-Access GmbH - 18FE34 - Espressif Inc. + 0025C0 + ZillionTV Corporation - 38229D - ADB Broadband Italia + 0025BD + Italdata Ingegneria dell'Idea S.p.A. - A4526F - ADB Broadband Italia + 0025B7 + Costar electronics, inc., - 605BB4 - Azurewave Technologies Inc. + 00257D + PointRed Telecom Private Ltd. - 64D954 - Taicang T&W Electronics + 002588 + Genie Industries, Inc. - 5C36B8 - TCL King Electrical Appliances (Huizhou) Ltd + 002580 + Equipson S.A. - 00AA01 - Intel Corporation + 00256D + Broadband Forum - 985FD3 - Microsoft Corporation + 00256C + Azimut Production Association JSC - 00DA55 - Cisco Systems Inc. + 002563 + Luxtera Inc - 18E3BC - TCT mobile Ltd + 002593 + DatNet Informatikai Kft. - CC1FC4 - InVue + 00258E + The Weather Channel - 00AA00 - Intel Corporation + 00250D + GZT Telkom-Telmor sp. z o.o. - 00C2C6 - Intel Corporation + 00250E + gt german telematics gmbh - 5CD2E4 - Intel Corporation + 002508 + Maquet Cardiopulmonary AG - 28B2BD - Intel Corporation + 002524 + Lightcomm Technology Co., Ltd - 002243 - Azurewave Technologies Inc. + 002522 + ASRock Incorporation - 00006E - Artisoft Inc. + 00251B + Philips CareServant - 448723 - Hoya Service Corporation + 002518 + Power PLUS Communications AG - D86C02 - Huaqin Telecom Technology Ltd + 002515 + SFR - 60BEB5 - Motorola Mobility LLC, a Lenovo Company + 002536 + Oki Electric Industry Co., Ltd. - F8F1B6 - Motorola Mobility LLC, a Lenovo Company + 002541 + Maquet Critical Care AB - 3CFDFE - Intel Corporation + 00254E + Vertex Wireless Co., Ltd. - A4C494 - Intel Corporation + 002546 + Cisco Systems, Inc - 902E1C - Intel Corporation + 002545 + Cisco Systems, Inc - A434D9 - Intel Corporation + 002542 + Pittasoft - 685D43 - Intel Corporation + 002531 + Cloud Engines, Inc. - A0369F - Intel Corporation + 00252D + Kiryung Electronics - 64D4DA - Intel Corporation + 00252B + Stirling Energy Systems - 4025C2 - Intel Corporation + 0024FC + QuoPin Co., Ltd. - 502DA2 - Intel Corporation + 002560 + Ibridge Networks & Communications Ltd. - 78929C - Intel Corporation + 0024B3 + Graf-Syteco GmbH & Co. KG - 843A4B - Intel Corporation + 0024AA + Dycor Technologies Ltd. - 5C514F - Intel Corporation + 0024D0 + Shenzhen SOGOOD Industry CO.,LTD. - A44E31 - Intel Corporation + 0024CC + Fascinations Toys and Gifts, Inc. - 4CEB42 - Intel Corporation + 0024CB + Autonet Mobile - F81654 - Intel Corporation - - - 606C66 - Intel Corporation + 0024D1 + Thomson Inc. - 4C8093 - Intel Corporation + 0024C9 + Broadband Solutions Group - AC7289 - Intel Corporation + 0024CA + Tobii Technology AB - 448500 - Intel Corporation + 0024A9 + Ag Leader Technology - 0CD292 - Intel Corporation + 0024A6 + TELESTAR DIGITAL GmbH - DCA971 - Intel Corporation + 0024A3 + Sonim Technologies Inc - 58946B - Intel Corporation + 0024FB + Private - 0024D7 - Intel Corporation + 0024FA + Hilger u. Kern GMBH - 0024D6 - Intel Corporation + 0024F6 + MIYOSHI ELECTRONICS CORPORATION - 001DE0 - Intel Corporation + 0024F0 + Seanodes - 4C79BA - Intel Corporation + 0024C7 + Mobilarm Ltd - 84A6C8 - Intel Corporation + 0024B8 + free alliance sdn bhd - 5891CF - Intel Corporation + 00249B + Action Star Enterprise Co., Ltd. - 0C8BFD - Intel Corporation + 002497 + Cisco Systems, Inc - 00215C - Intel Corporation + 0024DF + Digitalbox Europe GmbH - 00216B - Intel Corporation + 002425 + Shenzhenshi chuangzhicheng Technology Co.,Ltd - 0022FB - Intel Corporation + 002427 + SSI COMPUTER CORP - 001517 - Intel Corporation + 00241C + FuGang Electronic (DG) Co.,Ltd - A0A8CD - Intel Corporation + 002419 + Private - 5CC5D4 - Intel Corporation + 002415 + Magnetic Autocontrol GmbH - 001E64 - Intel Corporation + 002411 + PharmaSmart LLC - F4F1E1 - Motorola Mobility LLC, a Lenovo Company + 00240F + Ishii Tool & Engineering Corporation - 9CD917 - Motorola Mobility LLC, a Lenovo Company + 00243F + Storwize, Inc. - 9068C3 - Motorola Mobility LLC, a Lenovo Company + 002440 + Halo Monitoring, Inc. - 3C197D - Ericsson AB + 002446 + MMB Research Inc. - B4E10F - Dell Inc. + 002445 + Adtran Inc - 002219 - Dell Inc. + 002472 + ReDriven Power Inc. - 0024E8 - Dell Inc. + 002471 + Fusion MultiSystems dba Fusion-io - B083FE - Dell Inc. + 002474 + Autronica Fire And Securirty - 3417EB - Dell Inc. + 0023FA + RG Nets, Inc. - F8BC12 - Dell Inc. + 0023F2 + TVLogic - 18A99B - Dell Inc. + 00240A + US Beverage Net - 001372 - Dell Inc. + 002407 + TELEM SAS - 001143 - Dell Inc. + 002463 + Phybridge Inc - 4C7625 - Dell Inc. + 0023C2 + SAMSUNG Electronics. Co. LTD - 44A842 - Dell Inc. + 0023C4 + Lux Lumen - 00253C - 2Wire Inc. + 0023C5 + Radiation Safety and Control Services Inc - 34EF44 - 2Wire Inc. + 0023C6 + SMC Corporation - B0E754 - 2Wire Inc. + 0023B9 + Airbus Defence and Space Deutschland GmbH - F01FAF - Dell Inc. + 0023BD + Digital Ally, Inc. - 00188B - Dell Inc. + 0023BF + Mainpine, Inc. - 000874 - Dell Inc. + 0023B2 + Intelligent Mechatronic Systems Inc - B8E625 - 2Wire Inc. + 0023B5 + ORTANA LTD - 001D5A - 2Wire Inc. + 002390 + Algolware Corporation - 1C4419 - TP-Link Technologies Ltd + 002388 + V.T. Telematica S.p.a. - 5C353B - Compal Broadband Networks Inc. + 002386 + IMI Hydronic Engineering international SA - 28FAA0 - Vivo Mobile Communication Ltd + 002383 + InMage Systems Inc - ECDF3A - Vivo Mobile Communication Ltd + 002381 + Lengda Technology(Xiamen) Co.,Ltd. - F42981 - Vivo Mobile Communication Ltd + 00237B + WHDI LLC - 84F6FA - Miovision Technologies Incorporated + 002324 + G-PRO COMPUTER - 70106F - Hewlett Packard Enterprise + 0023E0 + INO Therapeutics LLC - F8E71E - Ruckus Wireless + 0023D5 + WAREMA Renkhoff SE - 08863B - Belkin International Inc. + 0023E7 + Hinke A/S - 247C4C - Herman Miller + 0023E6 + Innovation Farm, Inc. - E46F13 - D-Link International + 0023E2 + SEA Signalisation - 2C56DC - ASUSTek Computer Inc. + 0023C9 + Sichuan Tianyi Information Science & Technology Stock CO.,LTD - 003146 - Juniper Networks + 0023CE + KITA DENSHI CORPORATION - 00604C - Sagemcom Broadband SAS + 0023CF + CUMMINS-ALLISON CORP. - 001F95 - Sagemcom Broadband SAS + 0023A9 + Beijing Detianquan Electromechanical Equipment Co., Ltd - 002348 - Sagemcom Broadband SAS + 0023A7 + Redpine Signals, Inc. - 002691 - Sagemcom Broadband SAS + 00239B + Elster Solutions, LLC - 988B5D - Sagemcom Broadband SAS + 0022EE + Algo Communication Products Ltd - 90013B - Sagemcom Broadband SAS + 0022EA + Rustelcom Inc. - 7C034C - Sagemcom Broadband SAS + 0022F0 + 3 Greens Aviation Limited - 6C2E85 - Sagemcom Broadband SAS + 0022EC + IDEALBT TECHNOLOGY CORPORATION - 94FEF4 - Sagemcom Broadband SAS + 002331 + Nintendo Co., Ltd. - 34B1F7 - Texas Instruments + 002335 + Linkflex Co.,Ltd - 2CFD37 - Blue Calypso Inc. + 00232F + Advanced Card Systems Ltd. - 0C6127 - Actiontec Electronics Inc. + 002319 + Sielox LLC - 3CD92B - Hewlett-Packard Company + 002311 + Gloscom Co., Ltd. - 78DEE4 - Texas Instruments + 00235D + Cisco Systems, Inc - 001833 - Texas Instruments + 00235C + Aprius, Inc. - 001834 - Texas Instruments + 002352 + DATASENSOR S.p.A. - 0017E3 - Texas Instruments + 002309 + Janam Technologies LLC - 001830 - Texas Instruments + 002304 + Cisco Systems, Inc - 0023D4 - Texas Instruments + 0022F9 + Pollin Electronic GmbH - BCF685 - D-Link International + 002353 + F E T Elettronica snc - 78542E - D-Link International + 002342 + Coffee Equipment Company - C4A81D - D-Link International + 002337 + Global Star Solutions ULC - 002191 - D-Link Corporation + 0022DD + Protecta Electronics Ltd - ACF1DF - D-Link International + 0022DB + Translogic Corporation - C0E422 - Texas Instruments + 00236A + SmartRG Inc - D00790 - Texas Instruments + 002370 + Snell - 3C7DB1 - Texas Instruments + 002325 + IOLAN Holding - F4FC32 - Texas Instruments + 002321 + Avitech International Corp - 90D7EB - Texas Instruments + 002274 + FamilyPhone AB - 0017E8 - Texas Instruments + 00226A + Honeywell - 001783 - Texas Instruments + 002262 + BEP Marine - 2435CC - Zhongshan Scinan Internet Of Things Ltd + 002263 + Koos Technical Services, Inc. - 2C3033 - Netgear + 00226C + LinkSprite Technologies, Inc. - CC46D6 - Cisco Systems Inc. + 00225C + Multimedia & Communication Technology - 0041D2 - Cisco Systems Inc. + 0022B9 + Analogix Seminconductor, Inc - 2CAB00 - Huawei Technologies Ltd + 0022B8 + Norcott - A8CA7B - Huawei Technologies Ltd + 0022B7 + GSS Grundig SAT-Systems GmbH - BC4434 - Shenzhen TINNO Mobile Technology Corp. + 0022B3 + Sei S.p.A. - 04BF6D - ZyXEL Communications Corp + 0022AB + Shenzhen Turbosight Technology Ltd - F88FCA - Google Inc. + 00229B + AverLogic Technologies, Inc. - 3898D8 - Meritech Ltd + 00229C + Verismo Networks Inc - 9486CD - Seoul Electronics & Telecom + 00229A + Lastar, Inc. - 3897D6 - Hangzhou H3C Technologies Ltd + 002284 + DESAY A&V SCIENCE AND TECHNOLOGY CO.,LTD - 1CA770 - Shenzhen Chuangwei-RGB Electronics Ltd + 002286 + ASTRON - 4419B6 - Hangzhou Hikvision Digital Technology Ltd + 002282 + 8086 Consultancy - 68DBCA - Apple + 002276 + Triple EYE B.V. - 086698 - Apple + 002254 + Bigelow Aerospace - BC5436 - Apple + 002257 + 3COM EUROPE LTD - 044BED - Apple + 002246 + Evoc Intelligent Technology Co.,Ltd. - 6C8DC1 - Apple + 002248 + Microsoft Corporation - 84ACFB - Crouzet Automatismes + 0022C5 + INFORSON Co,Ltd. - 7CBB8A - Nintendo Ltd + 0022BF + SieAmp Group of Companies - FCFFAA - IEEE Registration Authority + 0022BE + Cisco Systems, Inc - 0CD746 - Apple + 002290 + Cisco Systems, Inc - 60A37D - Apple + 00228A + Teratronik elektronische systeme gmbh - 88A25E - Juniper Networks + 00228E + TV-NUMERIC - 541E56 - Juniper Networks + 0022DA + ANATEK, LLC - 8896B6 - Global Fire Equipment S.A. + 002214 + RINNAI KOREA - 88B8D0 - Dongguan Koppo Electronic Ltd + 00220B + National Source Coding Center - 601971 - ARRIS Group Inc. + 00220C + Cisco Systems, Inc - F8CAB8 - Dell Inc. + 0021EA + Bystronic Laser AG - 001111 - Intel Corporation + 0021FD + LACROIX TRAFFIC S.A.U - 001302 - Intel Corporation + 002228 + Breeze Innovations Ltd. - 6CCA08 - ARRIS Group Inc. + 002229 + Compumedics Ltd - 78719C - ARRIS Group Inc. + 002200 + IBM Corp - D40598 - ARRIS Group Inc. + 002230 + FutureLogic Inc. - E83381 - ARRIS Group Inc. + 00222E + maintech GmbH - 8C7F3B - ARRIS Group Inc. + 0021E1 + Nortel Networks - 5C571A - ARRIS Group Inc. + 0021CD + LiveTV - E8892C - ARRIS Group Inc. + 002216 + SHIBAURA VENDING MACHINE CORPORATION - 94877C - ARRIS Group Inc. + 00216F + SymCom, Inc. - 407009 - ARRIS Group Inc. + 002166 + NovAtel Inc. - 083E0C - ARRIS Group Inc. + 002164 + Special Design Bureau for Seismic Instrumentation - 3C36E4 - ARRIS Group Inc. + 002160 + Hidea Solutions Co. Ltd. - 1C1B68 - ARRIS Group Inc. + 0021C0 + Mobile Appliance, Inc. - 000423 - Intel Corporation + 0021BB + Riken Keiki Co., Ltd. - 207355 - ARRIS Group Inc. + 0021B1 + DIGITAL SOLUTIONS LTD - F8EDA5 - ARRIS Group Inc. + 0021B0 + Tyco Telecommunications - 5465DE - ARRIS Group Inc. + 002152 + General Satellite Research & Development Limited - 58AC78 - Cisco Systems Inc. + 002158 + Style Flying Technology Co. - 780AC7 - Baofeng TV Ltd + 002188 + EMC Corporation - 000D0B - Buffalo Inc. + 00217F + Intraco Technology Pte Ltd - 001D73 - Buffalo Inc. + 00217D + PYXIS S.R.L. - 001601 - Buffalo Inc. + 0021AD + Nordic ID Oy - 7403BD - Buffalo Inc. + 0021A3 + Micromint - B8FC9A - Le Shi Zhi Xin Electronic Technology (Tianjin) Limited + 0021A5 + ERLPhase Power Technologies Ltd. - A45D36 - Hewlett-Packard Company + 0021C6 + CSJ Global, Inc. - F0921C - Hewlett-Packard Company + 0021C3 + CORNELL Communications, Inc. - A0481C - Hewlett-Packard Company + 0021C7 + Russound - A01D48 - Hewlett-Packard Company + 0021C1 + ABB Oy / Medium Voltage Products - 40A8F0 - Hewlett-Packard Company + 002148 + Kaco Solar Korea - 8851FB - Hewlett-Packard Company + 00219D + Adesys BV - 082E5F - Hewlett-Packard Company + 002195 + GWD Media Limited - E4115B - Hewlett-Packard Company + 002116 + Transcon Electronic Systems, spol. s r. o. - 28924A - Hewlett-Packard Company + 002115 + PHYWE Systeme GmbH & Co. KG - 288023 - Hewlett-Packard Company + 002111 + Uniphone Inc. - CC3E5F - Hewlett-Packard Company + 002114 + Hylab Technology Inc. - D89D67 - Hewlett-Packard Company + 002132 + Masterclock, Inc. - 0014C2 - Hewlett-Packard Company + 002131 + Blynke Inc. - 00805F - Hewlett-Packard Company + 002129 + Cisco-Linksys, LLC - 0018FE - Hewlett-Packard Company + 00211D + Dataline AB - 001A4B - Hewlett-Packard Company + 002120 + Sequel Technologies - 002481 - Hewlett-Packard Company + 00211A + LInTech Corporation - 000F61 - Hewlett-Packard Company + 002141 + RADLIVE - 480FCF - Hewlett-Packard Company + 00213D + Cermetek Microelectronics, Inc. - D40B1A - HTC Corporation + 002140 + EN Technologies Inc. - 945330 - Hon Hai Precision Ind Ltd + 00213C + AliphCom - A08D16 - Huawei Technologies Ltd + 001FE7 + Simet - 4CD08A - HUMAX Ltd + 001FDB + Network Supply Corp., - CC4EEC - HUMAX Ltd + 001FD4 + 4IPNET, INC. - 403DEC - HUMAX Ltd + 001FCB + NIW Solutions - EC4D47 - Huawei Technologies Ltd + 001FF7 + Nakajima All Precision Co., Ltd. - C44044 - RackTop Systems Inc. + 001FEB + Trio Datacom Pty Ltd - 4CA161 - Rain Bird Corporation + 001FB5 + I/O Interconnect Inc. - 8CAB8E - Shanghai Feixun Communication Ltd + 001FAD + Brown Innovations, Inc - FC64BA - Xiaomi Communications Ltd + 001FBF + Fulhua Microelectronics Corp. Taiwan Branch - 9060F1 - Apple + 001FBE + Shenzhen Mopnet Industrial Co.,Ltd - F8D111 - TP-Link Technologies Ltd + 001FC2 + Jow Tong Technology Co Ltd - B0487A - TP-Link Technologies Ltd + 001F9B + POSBRO - 940C6D - TP-Link Technologies Ltd + 001F97 + BERTANA srl - A4516F - Microsoft Mobile Oy + 001F8C + CCS Inc. - 542758 - Motorola (Wuhan) Mobility Technologies Communication Ltd + 001F81 + Accel Semiconductor Corp - 00242B - Hon Hai Precision Ind Ltd + 001F83 + Teleplan Technology Services Sdn Bhd - 08181A - ZTE Corporation + 001F68 + Martinsson Elektronik AB - 001E73 - ZTE Corporation + 001F63 + JSC Goodwin-Europa - 0015EB - ZTE Corporation + 001F69 + Pingood Technology Co., Ltd. - 001C25 - Hon Hai Precision Ind Ltd + 001FD2 + COMMTECH TECHNOLOGY MACAO COMMERCIAL OFFSHORE LTD. - 00197E - Hon Hai Precision Ind Ltd + 001F78 + Blue Fox Porini Textile - 90FBA6 - Hon Hai Precision Ind Ltd + 001F4D + Segnetics LLC - 4437E6 - Hon Hai Precision Ind Ltd + 001FA6 + Stilo srl - CCAF78 - Hon Hai Precision Ind Ltd + 001F13 + S.& A.S. Ltd. - F4B7E2 - Hon Hai Precision Ind Ltd + 001F10 + TOLEDO DO BRASIL INDUSTRIA DE BALANCAS LTDA - 647002 - TP-Link Technologies Ltd + 001F0F + Select Engineered Systems - 10FEED - TP-Link Technologies Ltd + 001F02 + Pixelmetrix Corporation Pte Ltd - 645601 - TP-Link Technologies Ltd + 001EFE + LEVEL s.r.o. - F02765 - Murata Manufacturing Ltd + 001F34 + Lung Hwa Electronics Co., Ltd. - 5CF8A1 - Murata Manufacturing Ltd + 001F25 + MBS GmbH - 44A7CF - Murata Manufacturing Ltd + 001F27 + Cisco Systems, Inc - 0013E0 - Murata Manufacturing Ltd + 001EDB + Giken Trastem Co., Ltd. - EC26CA - TP-Link Technologies Ltd + 001ED0 + Ingespace - 9471AC - TCT mobile Ltd + 001EEF + Cantronic International Limited - 2C088C - HUMAX Ltd + 001EDE + BYD COMPANY LIMITED - 1C994C - Murata Manufacturing Ltd + 001EDD + WASKO S.A. - F4559C - Huawei Technologies Ltd + 001F42 + Etherstack plc - 80B686 - Huawei Technologies Ltd + 001F35 + AIR802 LLC - 10C61F - Huawei Technologies Ltd + 001F26 + Cisco Systems, Inc - CC96A0 - Huawei Technologies Ltd + 001F1A + Prominvest - F80113 - Huawei Technologies Ltd + 001F18 + Hakusan.Mfg.Co,.Ltd - A49947 - Huawei Technologies Ltd + 001ECD + KYLAND Technology Co. LTD - C8D15E - Huawei Technologies Ltd + 001EBF + Haas Automation Inc. - 785968 - Hon Hai Precision Ind Ltd + 001EEB + Talk-A-Phone Co. - C07009 - Huawei Technologies Ltd + 001EBC + WINTECH AUTOMATION CO.,LTD. - 8038BC - Huawei Technologies Ltd + 001EB1 + Cryptsoft Pty Ltd - C4072F - Huawei Technologies Ltd + 001EAF + Ophir Optronics Ltd - F48E92 - Huawei Technologies Ltd + 001EAD + Wingtech Group Limited - 00664B - Huawei Technologies Ltd + 001E32 + Zensys - 9CC172 - Huawei Technologies Ltd + 001E35 + Nintendo Co., Ltd. - 247F3C - Huawei Technologies Ltd + 001E2B + Radio Systems Design, Inc. - 581F28 - Huawei Technologies Ltd + 001E28 + Lumexis Corporation - ECCB30 - Huawei Technologies Ltd + 001E43 + AISIN CORPORATION - F4DCF9 - Huawei Technologies Ltd + 001E6F + Magna-Power Electronics, Inc. - 308730 - Huawei Technologies Ltd + 001E6A + Beijing Bluexon Technology Co.,Ltd - C057BC - Avaya Inc + 001E66 + RESOL Elektronische Regelungen GmbH - 64A7DD - Avaya Inc + 001E63 + Vibro-Meter SA - 241FA0 - Huawei Technologies Ltd + 001E53 + Further Tech Co., LTD - 18C58A - Huawei Technologies Ltd + 001E4E + DAKO EDV-Ingenieur- und Systemhaus GmbH - 080028 - Texas Instruments + 001E49 + Cisco Systems, Inc - 405FC2 - Texas Instruments + 001E42 + Teltonika - E0E5CF - Texas Instruments + 001E87 + Realease Limited - 68DFDD - Xiaomi Communications Ltd + 001E7F + CBM of America - 7054F5 - Huawei Technologies Ltd + 001E82 + SanDisk Corporation - DCD2FC - Huawei Technologies Ltd + 001E8E + Hunkeler AG - 9017AC - Huawei Technologies Ltd + 001EA1 + Brunata a/s - 34CDBE - Huawei Technologies Ltd + 001DB9 + Wellspring Wireless - D8490B - Huawei Technologies Ltd + 001DBB + Dynamic System Electronics Corp. - 44322A - Avaya Inc + 001DB3 + HPN Supply Chain - 7038EE - Avaya Inc + 001DB1 + Crescendo Networks - 703018 - Avaya Inc + 001DB4 + KUMHO ENG CO.,LTD - 9C28EF - Huawei Technologies Ltd + 001E24 + Zhejiang Bell Technology Co.,ltd - EC24B8 - Texas Instruments + 001E20 + Intertain Inc. - 7CEC79 - Texas Instruments + 001E1C + SWS Australia Pty Limited - 689E19 - Texas Instruments + 001E12 + Ecolab - 20CD39 - Texas Instruments + 001DDB + C-BEL Corporation - B4994C - Texas Instruments + 001DE6 + Cisco Systems, Inc - A4251B - Avaya Inc + 001DE7 + Marine Sonic Technology, Ltd. - 646A52 - Avaya Inc + 001E16 + Keytronix - 00100B - Cisco Systems Inc. + 001E08 + Centec Networks Inc - 00173B - Cisco Systems Inc. + 001DC5 + Beijing Jiaxun Feihong Electricial Co., Ltd. - 04DAD2 - Cisco Systems Inc. + 001DC6 + SNR Inc. - F02929 - Cisco Systems Inc. + 001DA4 + Hangzhou System Technology CO., LTD - 20BBC0 - Cisco Systems Inc. + 001D9F + MATT R.P.Traczynscy Sp.J. - 4C4E35 - Cisco Systems Inc. + 001DBF + Radiient Technologies, Inc. - 98FAE3 - Xiaomi Communications Ltd + 001DFB + NETCLEUS Systems Corporation - F0B429 - Xiaomi Communications Ltd + 001D3E + SAKA TECHNO SCIENCE CO.,LTD - 005080 - Cisco Systems Inc. + 001D40 + Intel – GE Care Innovations LLC - 005073 - Cisco Systems Inc. + 001D34 + SYRIS Technology Corp - 00900C - Cisco Systems Inc. + 001D32 + Longkay Communication & Technology (Shanghai) Co. Ltd - 00905F - Cisco Systems Inc. + 001D2A + SHENZHEN BUL-TECH CO.,LTD. - 00E0F7 - Cisco Systems Inc. + 001D2D + Pylone, Inc. - 001BD7 - Cisco SPVTG + 001D90 + EMCO Flow Systems - 006083 - Cisco Systems Inc. + 001D93 + Modacom - 006009 - Cisco Systems Inc. + 001D94 + Climax Technology Co., Ltd - 00067C - Cisco Systems Inc. + 001D8E + Alereon, Inc. - 00107B - Cisco Systems Inc. + 001D5D + Control Dynamics Pty. Ltd. - 0050E2 - Cisco Systems Inc. + 001D59 + Mitra Energy & Infrastructure - E4D3F1 - Cisco Systems Inc. + 001D57 + CAETEC Messtechnik - 8478AC - Cisco Systems Inc. + 001D51 + Babcock & Wilcox Power Generation Group, Inc - 0090A6 - Cisco Systems Inc. + 001D2B + Wuhan Pont Technology CO. , LTD - 009086 - Cisco Systems Inc. + 001D22 + Foss Analytical A/S - 00248C - ASUSTek Computer Inc. + 001D23 + SENSUS - 002354 - ASUSTek Computer Inc. + 001D7B + Ice Energy, Inc. - 1C872C - ASUSTek Computer Inc. + 001D6C + ClariPhy Communications, Inc. - 60182E - Shenzhen Protruly Electronic Ltd + 001D4C + Alcatel-Lucent - C4143C - Cisco Systems Inc. + 001D84 + Gateway, Inc. - 3C08F6 - Cisco Systems Inc. + 001D85 + Call Direct Cellular Solutions - 001E8C - ASUSTek Computer Inc. + 001D1A + OvisLink S.A. - 0013D4 - ASUSTek Computer Inc. + 001D0B + Power Standards Lab - 20CF30 - ASUSTek Computer Inc. + 001D02 + Cybertech Telecom Development - BC1665 - Cisco Systems Inc. + 001CFE + Quartics Inc - F872EA - Cisco Systems Inc. + 001C81 + NextGen Venturi LTD - D0C789 - Cisco Systems Inc. + 001C7A + Perfectone Netware Company Ltd - F84F57 - Cisco Systems Inc. + 001C75 + Segnet Ltd. - 501CBF - Cisco Systems Inc. + 001C74 + Syswan Technologies Inc. - B000B4 - Cisco Systems Inc. + 001CB7 + USC DigiArk Corporation - 544A00 - Cisco Systems Inc. + 001CB1 + Cisco Systems, Inc - 00E16D - Cisco Systems Inc. + 001CAF + Plato Networks Inc. - 78BAF9 - Cisco Systems Inc. + 001CE9 + Galaxy Technology Limited - 0022CE - Cisco SPVTG + 001CEA + Scientific-Atlanta, Inc - E0D173 - Cisco Systems Inc. + 001CCB + Forth Corporation Public Company Limited - E0899D - Cisco Systems Inc. + 001CBC + CastGrabber, LLC - C47295 - Cisco Systems Inc. + 001CDB + CARPOINT CO.,LTD - 7C69F6 - Cisco Systems Inc. + 001CD5 + ZeeVee, Inc. - 78DA6E - Cisco Systems Inc. + 001CD3 + ZP Engineering SEL - B8782E - Apple + 001CE7 + Rocon PLC Research Centre - 000502 - Apple + 001CE4 + EleSy JSC - 000A95 - Apple + 001CE2 + Attero Tech, LLC. - 34BDC8 - Cisco Systems Inc. + 001CAA + Bellon Pty Ltd - DCEB94 - Cisco Systems Inc. + 001CA0 + Production Resource Group, LLC - 84B517 - Cisco Systems Inc. + 001C98 + LUCKY TECHNOLOGY (HK) COMPANY LIMITED - 1C6E4C - Logistic Service & Engineering Ltd + 001C91 + Gefen LLC - 000F66 - Cisco-Linksys LLC + 001C92 + Tervela - 24374C - Cisco SPVTG + 001C8A + Cirrascale Corporation - 188B9D - Cisco Systems Inc. + 001C02 + Pano Logic - E4AA5D - Cisco Systems Inc. + 001C05 + Nonin Medical Inc. - F45FD4 - Cisco SPVTG + 001C06 + Siemens Numerical Control Ltd., Nanjing - 2CABA4 - Cisco SPVTG + 001C04 + Airgain, Inc. - 00264A - Apple + 001C01 + ABB Oy Drives - 041E64 - Apple + 001BFF + Millennia Media inc. - 001124 - Apple + 001BEA + Nintendo Co., Ltd. - 002241 - Apple + 001BE5 + 802automation Limited - 7CC537 - Apple + 001BE4 + TOWNET SRL - 78CA39 - Apple + 001C68 + Anhui Sun Create Electronics Co., Ltd - 18E7F4 - Apple + 001C66 + UCAMP CO.,LTD - 70CD60 - Apple + 001C2A + Envisacor Technologies Inc. - 8C7B9D - Apple + 001BF2 + KWORLD COMPUTER CO., LTD - D89E3F - Apple + 001BF0 + Value Platforms Limited - B8C75D - Apple + 001C4D + Aplix IP Holdings Corporation - 0C74C2 - Apple + 001C38 + Bio-Rad Laboratories, Inc. - 403004 - Apple + 001C30 + Mode Lighting (UK ) Ltd. - 842999 - Apple + 001C2E + HPN Supply Chain - 74E2F5 - Apple + 001C53 + Synergy Lighting Controls - E0C97A - Apple + 001C1B + Hyperstone GmbH - 68A86D - Apple + 001C10 + Cisco-Linksys, LLC - 7CC3A1 - Apple + 001BC6 + Strato Rechenzentrum AG - 7073CB - Apple + 001BC4 + Ultratec, Inc. - 90840D - Apple + 001BC2 + Integrated Control Technology Limitied - E80688 - Apple + 001BBB + RFTech Co.,Ltd - EC852F - Apple + 001B5D + Vololink Pty Ltd - 00F4B9 - Apple + 001B5A + Apollo Imaging Technologies, Inc. - 5C95AE - Apple + 001B56 + Tehuti Networks Ltd. - 9803D8 - Apple + 001B86 + Bosch Access Systems GmbH - 60C547 - Apple + 001B7C + A & R Cambridge - 685B35 - Apple + 001BD2 + ULTRA-X ASIA PACIFIC Inc. - 2CB43A - Apple + 001B8D + Electronic Computer Systems, Inc. - 689C70 - Apple + 001BAA + XenICs nv - 380F4A - Apple + 001BA1 + Åmic AB - 3010E4 - Apple + 001B96 + General Sensing - A886DD - Apple + 001AD5 + KMC CHAIN INDUSTRIAL CO., LTD. - 444C0C - Apple + 001AD0 + Albis Technologies AG - B4F0AB - Apple + 001AD3 + Vamp Ltd. - 80929F - Apple + 001AD8 + AlsterAero GmbH - 9C04EB - Apple + 001ADA + Biz-2-Me Inc. - 5C969D - Apple + 001ACB + Autocom Products Ltd - 609217 - Apple + 001ACF + C.T. ELETTRONICA - 84B153 - Apple + 001B15 + Voxtel, Inc. - E06678 - Apple + 001AEA + Radio Terminal Systems Pty Ltd - 48D705 - Apple + 001ADD + PePWave Ltd - 041552 - Apple + 001AD4 + iPOX Technology Co., Ltd. - CC785F - Apple + 001AD6 + JIAGNSU AETNA ELECTRIC CO.,LTD - 88CB87 - Apple + 001AFB + Joby Inc. - F0C1F1 - Apple + 001AFD + EVOLIS - 843835 - Apple + 001B03 + Action Technology (SZ) Co., Ltd - 8C006D - Apple + 001B1E + HART Communication Foundation - A8968A - Apple + 001B14 + Carex Lighting Equipment Factory - F41BA1 - Apple + 001B4C + Signtech - 60D9C7 - Apple + 001A6F + MI.TEL s.r.l. - 3CAB8E - Apple + 001A71 + Diostech Co., Ltd. - F82793 - Apple + 001A69 + Wuhan Yangtze Optical Technology CO.,Ltd. - 907240 - Apple + 001A67 + Infinite QL Sdn Bhd - 908D6C - Apple + 001AB8 + Anseri Corporation - B8098A - Apple + 001ABC + U4EA Technologies Ltd - 4C7C5F - Apple + 001AA3 + DELORME - 68644B - Apple + 001A9B + ADEC & Parter AG - C81EE7 - Apple + 001A9D + Skipper Wireless, Inc. - A43135 - Apple + 001AC3 + Scientific-Atlanta, Inc - 68D93C - Apple + 001ABF + TRUMPF Laser Marking Systems AG - 00F76F - Apple + 001A8E + 3Way Networks Ltd - C88550 - Apple + 001A85 + NV Michel Van de Wiele - 7014A6 - Apple + 001A64 + IBM Corp - 985AEB - Apple + 001A55 + ACA-Digital Corporation - 78D75F - Apple + 001A1C + GT&T Engineering Pte Ltd - E0B52D - Apple + 001A1F + Coastal Environmental Systems - 6C94F8 - Apple + 001A23 + Ice Qube, Inc - C0CECD - Apple + 001A1D + PChome Online Inc. - F44B2A - Cisco SPVTG + 001A17 + Teak Technologies, Inc. - 746F19 - Icarvisions (Shenzhen) Technology Ltd + 001A51 + Alfred Mann Foundation - 2CAE2B - Samsung Electronics Ltd + 001A44 + JWTrading Co., Ltd - C4ADF1 - GOPEACE Inc. + 0019E6 + TOYO MEDIC CO.,LTD. - 58FC73 - Arria Live Media Inc. + 0019E8 + Cisco Systems, Inc - 0C1A10 - Acoustic Stream + 0019DF + Thomson Inc. - C4EF70 - Home Skinovations + 0019DD + FEI-Zyfer, Inc. - 5CE3B6 - Fiberhome Telecommunication Technologies Ltd + 001A05 + OPTIBASE LTD - 7C5A67 - JNC Systems Inc. + 0019FC + PT. Ufoakses Sukses Luarbiasa - A0F9E0 - Vivatel Company Limited + 0019D4 + ICX Technologies - C869CD - Apple + 0019CF + SALICRU, S.A. - A4B805 - Apple + 001A49 + Micro Vision Co.,LTD - 90C99B - Tesorion Nederland B.V. + 001A3D + Ajin Vision Co.,Ltd - 5CADCF - Apple + 001A41 + INOCOVA Co.,Ltd - 080A4E - Planet Bingo(R) -- 3rd Rock Gaming(R) + 001A0A + Adaptive Micro-Ware Inc. - B49D0B - BQ + 001A33 + ASI Communications, Inc. - 3C8CF8 - TRENDnet Inc. + 0019B2 + XYnetsoft Co.,Ltd - E81363 - Comstock RD Inc. + 0019A4 + Austar Technology (hang zhou) Co.,Ltd - 741865 - Shanghai DareGlobal Technologies Ltd + 0019AA + Cisco Systems, Inc - BC6C21 - Apple + 0019B1 + Arrow7 Corporation - F8C372 - Tsuzuki Denki + 001996 + TurboChef Technologies Inc. - D47208 - Bragi GmbH + 001997 + Soft Device Sdn Bhd - A87285 - IDT Inc. + 001998 + SATO CORPORATION - 780541 - Queclink Wireless Solutions Ltd + 00199C + CTRING - 044169 - GoPro + 001952 + ACOGITO Co., Ltd - C02DEE - Cuff + 001946 + Cianet Industria e Comercio S/A - 6CEBB2 - Dongguan Sen DongLv Electronics Ltd + 001949 + TENTEL COMTECH CO., LTD. - 3C7A8A - ARRIS Group Inc. + 001967 + TELDAT Sp.J. - F40E22 - Samsung Electronics Ltd + 001971 + Guangzhou Unicomp Technology Co.,Ltd - 881B99 - Shenzhen XIN FEI JIA Electronic Ltd + 001964 + Doorking Inc. - 544E90 - Apple + 001976 + Xipher Technologies, LLC - A4A6A9 - Private + 00196C + ETROVISION TECHNOLOGY - 8C10D4 - Sagemcom Broadband SAS + 0019B3 + Stanford Research Systems - F898B9 - Huawei Technologies Ltd + 00198B + Novera Optics Korea, Inc. - 5CB559 - CNEX Labs + 001961 + Blaupunkt Embedded Systems GmbH - B83A9D - Alarm.com + 001944 + Fossil Partners, L.P. - 6858C5 - ZF TRW Automotive + 001942 + ON SOFTWARE INTERNATIONAL LIMITED - C01173 - Samsung Electronics Ltd + 00193F + RDI technology(Shenzhen) Co.,LTD - BCE63F - Samsung Electronics Ltd + 001941 + Pitney Bowes, Inc - 7C9122 - Samsung Electronics Ltd + 00192D + Nokia Corporation - ACBC32 - Apple + 001930 + Cisco Systems, Inc - 9023EC - Availink Inc. + 001927 + ImCoSys Ltd - 441CA8 - Hon Hai Precision Ind Ltd + 001908 + Duaxes Corporation - B4293D - Shenzhen Urovo Technology Ltd + 00190C + Encore Electronics, Inc. - 54FF82 - Davit Solution Co. + 0018FD + Optimal Technologies International Inc. - 50DF95 - Lytx + 0018F0 + JOYTOTO Co., Ltd. - 9CA69D - Whaley Technology Ltd + 0018E9 + Numata Corporation - 5853C0 - Beijing Guang Runtong Technology Development Company Ltd + 0018EF + Escape Communications, Inc. - 2CA539 - Parallel Wireless Inc. + 0018E6 + Computer Hardware Design SIA - CC794A - BLU Products Inc. + 0018DB + EPL Technology Ltd - F4E926 - Tianjin Zanpu Technology Inc. + 0018D6 + Swirlnet A/S - 906F18 - Private + 0018CD + Erae Electronics Industry Co., Ltd - 98CB27 - Galore Networks Pvt Ltd + 0018C8 + ISONAS Inc. - E8F2E2 - LG Innotek + 0018BE + ANSA Corporation - 247260 - IOTTECH Corp + 0018BA + Cisco Systems, Inc - 245BF0 - Liteon Inc. + 001919 + ASTEL Inc. - E855B4 - SAI Technology Inc. + 0018F7 + Kameleon Technologies - 340CED - Moduel AB + 00189D + Navcast Inc. - 2827BF - Samsung Electronics Ltd + 001885 + Motorola Solutions Inc. - 94D859 - TCT mobile Ltd + 001888 + GOTIVE a.s. - 2CFCE4 - CTEK Sweden AB + 00188A + Infinova LLC - F4B8A7 - ZTE Corporation + 001849 + nVent, Schroff GmbH - 300C23 - ZTE Corporation + 001846 + Crypto S.A. - C0B713 - Beijing Xiaoyuer Technology Ltd + 001845 + Pulsar-Telecom LLC. - 1005B1 - ARRIS Group Inc. + 00183D + Vertex Link Corporation - 20635F - Abeeway + 0018A3 + ZIPPY TECHNOLOGY CORP. - 083A5C - Junilab Inc. + 001893 + SHENZHEN PHOTON BROADBAND TECHNOLOGY CO.,LTD - B8B3DC - Derek (Shaoguan) Limited + 0018A0 + Cierma Ascenseurs - 702A7D - EpSpot AB + 001863 + Veritech Electronics Limited - 4CAE31 - ShengHai Electronics (Shenzhen) Ltd + 00185A + uControl, Inc. - 188EF9 - G2C Ltd + 0018B4 + Dawon Media Inc. - 44F436 - ZTE Corporation + 0018B6 + S3C, Inc. - C47D46 - Fujitsu Limited + 0018B1 + IBM Corp - 185D9A - BobjGear LLC + 001886 + EL-TECH, INC. - F4E9D4 - QLogic Corporation + 001887 + Metasystem SpA - 4CB76D - Novi Security + 00187B + 4NSYS Co. Ltd. - 6CE01E - Modcam AB + 00187E + RGB Spectrum - 74852A - Pegatron Corporation + 001852 + StorLink Semiconductors, Inc. - 9CB6D0 - Rivet Networks + 001850 + Secfone Kft - 40B89A - Hon Hai Precision Ind Ltd + 001858 + TagMaster AB - 1CB72C - ASUSTek Computer Inc. + 001825 + Private - 4CEEB0 - SHC Netzwerktechnik GmbH + 001879 + dSys - 800184 - HTC Corporation + 0017CE + Screen Service Spa - 44C69B - Wuhan Feng Tian Information Network Ltd + 0017CD + CEC Wireless R&D Ltd. - FCE33C - Huawei Technologies Ltd + 0017D0 + Opticom Communications, LLC - C02567 - Nexxt Solutions + 0017EF + IBM Corp - A8827F - CIBN Oriental Network(Beijing) Ltd + 0017F5 + LIG NEOPTEK - D048F3 - DATTUS Inc + 0017FE + TALOS SYSTEM INC. - B8C3BF - Henan Chengshi NetWork Technology Ltd + 0017F8 + Motech Industries Inc. - 44962B - Aidon Oy + 0017DB + CANKO TECHNOLOGIES INC. - E076D0 - AMPAK Technology Inc. + 0017D6 + Bluechips Microhouse Co.,Ltd. - B008BF - Vital Connect Inc. + 00181E + GDX Technologies Ltd. - D4522A - TangoWiFi.com + 0017C6 + Cross Match Technologies Inc - E807BF - Shenzhen Boomtech Industry Ltd + 0017C3 + KTF Technologies Inc. - 84F129 - Metrascale Inc. + 0017B7 + Tonze Technology Co. - B89ACD - Elite Optoelectronic(Asia) Ltd + 001807 + Fanstel Corp. - D468BA - Shenzhen Sundray Technologies Company Limited + 001808 + SightLogix, Inc. - 086266 - ASUSTek Computer Inc. + 001803 + ArcSoft Shanghai Co. LTD - 9C3066 - RWE Effizienz GmbH + 0017AB + Nintendo Co., Ltd. - 18BDAD - L-Tech Corporation + 001824 + Kimaldi Electronics, S.L. - 60E6BC - Sino-Telecom Technology Ltd + 001798 + Azonic Technology Co., LTD - C8C50E - Shenzhen Primestone Network Technologies Ltd + 00178F + NINGBO YIDONG ELECTRONIC CO.,LTD. - D06A1F - BSE Ltd + 00178A + DARTS TECHNOLOGIES CORP. - 700136 - FATEK Automation Corporation + 001721 + FITRE S.p.A. - FCA22A - PT. Callysta Multi Engineering + 001720 + Image Sensing Systems, Inc. - A45602 - fenglian Technology Ltd + 00171A + Winegard Company - 94E2FD - Boge Kompressoren OTTO Boge GmbH & Co. KG + 001789 + Zenitron Corporation - F01E34 - ORICO Technologies Ltd + 001787 + Brother, Brother & Sons ApS - DCE026 - Patrol Tag Inc. + 001760 + Naito Densei Machida MFG.CO.,LTD - B40566 - SP Best Corporation Ltd + 001761 + Private - 1CC72D - Shenzhen Huapu Digital Ltd + 001768 + Zinwave Ltd - A89008 - Beijing Yuecheng Technology Ltd + 001769 + Cymphonix Corp - 183864 - CAP-Tech International Ltd + 001762 + Solar Technology, Inc. - 6CF5E8 - Mooredoll Inc. + 00173E + LeucotronEquipamentos Ltda. - 8CBFA6 - Samsung Electronics Ltd + 001734 + ADC Telecommunications - C8A823 - Samsung Electronics Ltd + 00172E + FXC Inc. - B0C559 - Samsung Electronics Ltd + 00172B + Global Technologies Inc. - F42C56 - Senor Tech Ltd + 001726 + m2c Electronic Technology Ltd. - FCDC4A - G-Wearables Corp. + 001772 + ASTRO Strobel Kommunikationssysteme GmbH - 1C14B3 - Airwire Technologies + 00177A + ASSA ABLOY AB - A48CDB - Lenovo + 00171C + NT MicroSystems, Inc. - D85DE2 - Hon Hai Precision Ind Ltd + 001716 + Qno Technology Inc. - 3C912B - Vexata Inc + 001747 + Trimble - 346C0F - Pramod Telecom Pvt Ltd + 0016BD + ATI Industrial Automation - BC1485 - Samsung Electronics Ltd + 0016C0 + Semtech Corporation - 9C6C15 - Microsoft Corporation + 0016C2 + Avtec Systems Inc - 445ECD - Razer Inc + 0016F1 + OmniSense, LLC - 4CA928 - Insensi + 0016F4 + Eidicom Co., Ltd. - E8447E - Bitdefender SRL + 0016E7 + Dynamix Promotions Limited - C0335E - Microsoft Corporation + 0016BA + WEATHERNEWS INC. - B0E03C - TCT mobile Ltd + 0016B2 + DriveCam Inc - B0495F - OMRON HEALTHCARE Ltd + 0016B3 + Photonicbridges (China) Co., Ltd. - 60F189 - Murata Manufacturing Ltd + 0016AD + BT-Links Company Limited - 742EFC - DirectPacket Research Inc., + 0016E5 + FORDLEY DEVELOPMENT LIMITED - 84CFBF - Fairphone + 0016DD + Gigabeam Corporation - ACD1B8 - Hon Hai Precision Ind Ltd + 0016C8 + Cisco Systems, Inc - A0C2DE - Costar Video Systems + 0016C4 + SiRF Technology, Inc. - 88E161 - Art Beijing Science and Technology Development Ltd + 0016F3 + CAST Information Co., Ltd - 00A509 - WigWag Inc. + 0016F5 + Dalian Golden Hualu Digital Technology Co.,Ltd - 7491BD - Four Systems Ltd + 0016F9 + CETRTA POT, d.o.o., Kranj - F0FE6B - Shanghai High-Flying Electronics Technology Ltd + 00170A + INEW DIGITAL COMPANY - 3CAE69 - ESA Elektroschaltanlagen Grimma GmbH + 00162A + Antik computers & communications s.r.o. - D43266 - Fike Corporation + 001629 + Nivus GmbH - 900CB4 - Alinket Electronic Technology Ltd + 001621 + Colorado Vnet - 48C093 - Xirrus Inc. + 00161A + Dametric AB - DC0914 - Talk-A-Phone Co. + 001631 + Xteam - D0929E - Microsoft Corporation + 00162E + Space Shuttle Hi-Tech Co., Ltd. - BC52B4 - Nokia + 00166E + Arbitron Inc. - 9405B6 - Liling FullRiver Electronics & Technology Ltd + 00166A + TPS - 00F3DB - WOO Sports + 001663 + KBT Mobile - 78312B - ZTE Corporation + 001654 + Flex-P Industries Sdn. Bhd. - C81B6B - Innova Security + 001656 + Nintendo Co., Ltd. - 3438AF - Inlab Software GmbH + 001651 + Exeo Systems - B4A828 - Shenzhen Concox Information Technology Ltd + 00164B + Quorion Data Systems GmbH - 00A2F5 - Guangzhou Yuanyun Network Technology Ltd + 001688 + ServerEngines LLC - 1008B1 - Hon Hai Precision Ind Ltd + 00168B + Paralan Corporation - E48C0F - Discovery Insure + 001682 + OMS Motion - E42354 - Shenzhen Fuzhi Software Technology Ltd + 00169F + Vimtron Electronics Co., Ltd. - 94BF95 - Shenzhen Coship Electronics Ltd + 00169A + Quadrics Ltd - 44CE7D - SFR + 001692 + Scientific-Atlanta, Inc. - 344DEA - ZTE Corporation + 001691 + Moser-Baer AG - 4C16F1 - ZTE Corporation + 0016AF + Shenzhen Union Networks Equipment Co.,Ltd. - 10FACE - Reacheng Communication Technology Ltd + 00169E + TV One Ltd - 9470D2 - Winfirm Technology + 0015ED + Fulcrum Microsystems, Inc. - A44AD3 - ST Electronics(Shanghai) Ltd + 0015F0 + EGO BV - 7CB177 - Satelco AG + 0015EE + Omnex Control Systems - CC3080 - VAIO Corporation + 00160A + SWEEX Europe BV - 587BE9 - AirPro Technology India Pvt Ltd + 001602 + CEYON TECHNOLOGY CO.,LTD. - 8C18D9 - Shenzhen RF Technology Ltd + 001600 + CelleBrite Mobile Synchronization - C4BD6A - SKF GmbH + 0015F4 + Eventide - C401CE - Presition (2000) Ltd + 0015C0 + DIGITAL TELEMEDIA CO.,LTD. - 187117 - eta plus electronic GmbH + 0015C2 + 3M Germany - EC0EC4 - Hon Hai Precision Ind Ltd + 0015B2 + Advanced Industrial Computer, Inc. - 30FAB7 - Tunai Creative + 001615 + Nittan Company, Limited - 0809B6 - Masimo Corp + 001617 + MSI - 4CF5A0 - Scalable Network Technologies Inc + 001594 + BIXOLON CO.,LTD - D8FB11 - Axacore + 001590 + Hectronic GmbH - 4CE933 - RailComm LLC + 001610 + Carina Technology - CCE17F - Juniper Networks + 001606 + Ideal Industries - E4C62B - Airware + 001607 + Curves International Inc. - EC1D7F - ZTE Corporation + 0015A5 + DCI Co., Ltd. - AC3870 - Lenovo Mobile Communication Technology Ltd + 0015C8 + FlexiPanel Ltd - 4CBC42 - Shenzhen Hangsheng Electronics Ltd + 0015DA + IRITEL A.D. - 70F196 - Actiontec Electronics Inc. + 00154A + WANSHIH ELECTRONIC CO., LTD - 188219 - Alibaba Cloud Computing Ltd + 00154C + Saunders Electronics - 28A5EE - Shenzhen SDGI CATV Ltd + 00154D + Netronome Systems, Inc. - ECB907 - CloudGenix Inc + 001549 + Dixtal Biomedica Ind. Com. Ltda - F42833 - MMPC Inc. + 001511 + Data Center Systems - 0C8C8F - Kamo Technology Limited + 00150E + OPENBRAIN TECHNOLOGIES CO., LTD. - A4A4D3 - Bluebank Communication Technology Ltd + 00150D + Hoana Medical, Inc. - A8329A - Digicom Futuristic Technologies Ltd + 001506 + Neo Photonics - F4D032 - Yunnan Ideal Information & Technology Ltd + 001504 + GAME PLUS CO., LTD. - 600292 - Pegatron Corporation + 001505 + Actiontec Electronics, Inc - B4B859 - Texa Spa + 00158C + Liab ApS - 5CF9F0 - Atomos Engineering P/L + 00158F + NTT Advanced Technology Corporation - 702DD1 - Newings Communication Ltd + 001583 + IVT corporation - 147590 - TP-Link Technologies Ltd + 001588 + Salutica Allied Solutions Sdn Bhd - 50BD5F - TP-Link Technologies Ltd + 001585 + Aonvision Technolopy Corp. - 987E46 - Emizon Networks Limited + 00152B + Cisco Systems, Inc - 3C46D8 - TP-Link Technologies Ltd + 00152C + Cisco Systems, Inc - 4C83DE - Cisco SPVTG + 001528 + Beacon Medical Products LLC d.b.a. BeaconMedaes - A81374 - Panasonic Corporation AVC Networks Company + 001527 + Balboa Instruments - 083D88 - Samsung Electronics Ltd + 001521 + Horoquartz - BC4E5D - ZhongMiao Technology Ltd + 001520 + Radiocrafts AS - 3C189F - Nokia Corporation + 001539 + Technodrive srl - 7C6AC3 - GatesAir Inc. + 001531 + KOCOM - 5C5BC2 - YIK Corporation + 001535 + OTE Spa - 30595B - streamnow AG + 001536 + Powertech co.,Ltd - 84850A - Hella Sonnen- und Wetterschutztechnik GmbH + 00151C + LENECO - 08CD9B - samtec automotive electronics & software GmbH + 001519 + StoreAge Networking Technologies - 28E6E9 - SIS Sat Internet Services GmbH + 001547 + AiZen Solutions Inc. - F4FD2B - ZOYI Company + 00153D + ELIM PRODUCT CO. - F4F646 - Dediprog Technology Ltd + 001544 + coM.s.a.t. AG - 300D2A - Zhejiang Wellcom Technology Ltd + 00156B + Perfisans Networks Corp. - 045C8E - gosund GROUP Ltd + 001566 + A-First Technology Co., Ltd. - 7CC4EF - Devialet + 001579 + Lunatone Industrielle Elektronik GmbH - D85DFB - Private + 0014CF + INVISIO Communications - DCF110 - Nokia Corporation + 0014BE + Wink communication technology CO.LTD - 608F5C - Samsung Electronics Ltd + 0014B2 + mCubelogics Corporation - DC38E1 - Juniper Networks + 0014AE + Wizlogics Co., Ltd. - 908C63 - GZ Weedong Networks Technology Co Ltd + 0014A6 + Teranetics, Inc. - E8EF89 - OPMEX Tech. + 0014AA + Ashly Audio, Inc. - 109266 - Samsung Electronics Ltd + 001489 + B15402100 - JANDEI, S.L. - EC2E4E - Hitachi-LG Data Storage Inc + 0014BA + Carvers SA de CV - 3481C4 - AVM GmbH + 0014B6 + Enswer Technology Inc. - 983713 - PT.Navicom Indonesia + 0014D7 + Datastore Technology Corp - A47E39 - ZTE Corporation + 0014DD + Covergence Inc. - CCB691 - NECMagnusCommunications + 0014D4 + K Technology Corporation - 40167E - ASUSTek Computer Inc. + 0014E6 + AIM Infrarotmodule GmbH - F84A73 - Eumtech Ltd + 0014DE + Sage Instruments Inc. - 142BD6 - Guangdong Appscomm Ltd + 0014DF + HI-P Tech Corporation - FCC2DE - Murata Manufacturing Ltd + 0014FE + Artech Electronics - 98349D - Krauss Maffei Technologies GmbH + 0014F3 + ViXS Systems Inc - 880FB6 - Jabil Circuits India Pvt Ltd-EHTP unit + 00148A + Elin Ebg Traction Gmbh - B46698 - Zealabs srl + 001409 + MAGNETI MARELLI S.E. S.p.A. - 687CC8 - Measurement Systems S. de R.L. + 00140B + FIRST INTERNATIONAL COMPUTER, INC. - 74F85D - Berkeley Nucleonics Corp + 0013FD + Nokia Danmark A/S - B061C7 - Ericsson-LG Enterprise + 001400 + MINERVA KOREA CO., LTD - 0092FA - Shenzhen Wisky Technology Ltd + 0013FC + SiCortex, Inc - 4C7F62 - Nokia Corporation + 001480 + Hitachi-LG Data Storage Korea, Inc - 100F18 - Fu Gang Electronic(KunShan) Ltd + 00147E + InnerWireless - D0C7C0 - TP-Link Technologies Ltd + 00147D + Aeon Digital International - 4411C2 - Telegartner Karl Gartner GmbH + 001476 + MultiCom Industries Limited - 8059FD - Noviga + 001473 + Bookham Inc - 400107 - Arista Corp + 00144F + Oracle Corporation - 30C750 - MIC Technology Group + 001456 + Edge Products - 18CC23 - Philio Technology Corporation + 001450 + Heim Systems GmbH - 407875 - IMBEL - Industria de Material Belico do Brasil + 001452 + CALCULEX,INC. - D881CE - AHN Inc. + 00145D + WJ Communications, Inc. - 28C825 - DellKing Industrial Ltd + 001442 + ATTO CORPORATION - 80618F - Shenzhen sangfei Consumer Communications Ltd + 001447 + BOAZ Inc. - D82A15 - Leitner SpA + 00143E + AirLink Communications, Inc. - 447E76 - Trek Technology (S) Pte Ltd + 00143B + Sensovation AG - B0EC8F - GMX SAS + 00142D + Toradex AG - 28DEF6 - bioMerieux Inc. + 001414 + Jumpnode Systems LLC. - 580528 - Labris Networks + 001429 + V Center Technologies Co., Ltd. - E0D31A - EQUES Technology Ltd + 00141E + P.A. Semi, Inc. - 987770 - Pep Digital Technology (Guangzhou) Ltd + 00146E + H. Stoll GmbH & Co. KG - 68D247 - Portalis LC + 001469 + Cisco Systems, Inc - 50B695 - Micropoint Biotechnologies,Inc. + 0013D8 + Princeton Instruments - B4430D - Broadlink Pty Ltd + 0013CB + Zenitel Norway AS - A06518 - Vnpt Technology + 0013CF + 4Access Communications - 7C8D91 - Shanghai Hongzhuo Information Technology Ltd + 0013C9 + Beyond Achieve Enterprises Ltd. - 748F1B - MasterImage 3D + 001378 + Qsan Technology, Inc. - 083F76 - Intellian Technologies Inc. + 00137A + Netvox Technology Co., Ltd. - CC89FD - Nokia Corporation + 001381 + CHIPS & Systems, Inc. - 34466F - HiTEM Engineering + 0013F6 + Cintech - 386C9B - Ivy Biomedical + 0013F3 + Giga-byte Communications Inc. - B42C92 - Zhejiang Weirong Electronic Ltd + 0013F4 + Psitek (Pty) Ltd - A07771 - Vialis BV + 0013E9 + VeriWave, Inc. - 10DDF4 - Maxway Electronics Ltd + 0013BE + Virtual Conexions - 5CE7BF - New Singularity International Technical Development Ltd + 0013B9 + BM SPA - 6C641A - Penguin Computing + 0013AB + Telemotive AG - 50A054 - Actineon + 001395 + congatec GmbH - B48547 - Amptown System Company GmbH + 0013A8 + Tanisys Technology - 5056A8 - Jolla Ltd + 001399 + STAC Corporation. - E8E770 - Warp9 Tech Design Inc. + 0013AC + Sunmyung Electronics Co., LTD - 609620 - Private + 0013C6 + OpenGear, Inc - C0F991 - GME Standard Communications P/L + 0013DA + Diskware Co., Ltd - D87CDD - Sanix Incorporated + 001367 + Narayon. Co., Ltd. - 707C18 - ADATA Technology Ltd + 00135C + OnSite Systems, Inc. - 14F28E - ShenYang ZhongKe-Allwin Technology Ltd + 00135F + Cisco Systems, Inc - BC14EF - ITON Technology Limited + 001356 + FLIR Radiation Inc - 080371 - KRG Corporate + 00135A + Project T&E Limited - 200E95 - IEC - TC9 WG43 + 001361 + Biospace Co., Ltd. - C8F68D - S.E.Technologies Limited + 001362 + ShinHeung Precision Co., Ltd. - 3CD4D6 - WirelessWERX Inc. + 00134F + Rapidus Wireless Networks Inc. - 0C1262 - ZTE Corporation + 001338 + FRESENIUS-VIAL - 78EC74 - Kyland-USA + 00132D + iWise Communications - 98DA92 - Vuzix Corporation + 00132C + MAZ Brandenburg GmbH - 387B47 - AKELA Inc. + 001324 + Schneider Electric Ultra Terminal - C064C6 - Nokia Corporation + 001326 + ECM Systems Ltd - E40439 - TomTom Software Ltd + 001327 + Data Acquisitions limited - D0C42F - Tamagawa Seiki Ltd + 0012F6 + MDK CO.,LTD. - 549359 - Shenzhen Twowing Technologies Ltd + 0012F4 + Belco International Co.,Ltd. - 90356E - Vodafone Omnitel N.V. + 0012F1 + IFOTEC - 284430 - GenesisTechnical Systems (UK) Ltd + 0012F5 + Imarda New Zealand Limited - 5C1193 - Seal One AG + 00130F + EGEMEN Bilgisayar Muh San ve Tic LTD STI - 783D5B - TELNET Redes Inteligentes S.A. + 001313 + GuangZhou Post & Telecom Equipment ltd - D0B523 - Bestcare Cloucal Corp. + 0012F8 + WNI Resources, LLC - 24A495 - Thales Canada Inc. + 00131D + Scanvaegt International A/S - 847616 - Addat s.r.o. + 001318 + DGSTATION Co., Ltd. - DC0575 - Siemens Energy Automation + 00131A + Cisco Systems, Inc - E097F2 - Atomax Inc. + 00130C + HF System Corporation - 70305E - Nanjing Zhongke Menglian Information Technology Ltd + 001379 + PONDER INFORMATION INDUSTRIES LTD. - C098E5 - University Of Michigan + 001374 + Atheros Communications, Inc. - 50E14A - Private + 001369 + Honda Electron Co., LED. - 708D09 - Nokia Corporation + 001342 + Vision Research, Inc. - 98FB12 - Grand Electronics (HK) Ltd + 00133B + Speed Dragon Multimedia Limited - 3C1040 - daesung network + 001301 + IronGate S.L. - 443C9C - Pintsch Tiefenbach GmbH + 0012CB + CSS Inc. - 28FC51 - The Electric Controller and Manufacturing Ltd + 0012CE + Advanced Cybernetics Group - 407496 - aFUN TECHNOLOGY Inc. + 0012CA + Mechatronic Brick Aps - 701D7F - Comtech Technology Ltd + 0012C7 + SECURAY Technologies Ltd.Co. - 705986 - OOO TTV + 0012E8 + Fraunhofer IMS - 844F03 - Ablelink Electronics Ltd + 0012DD + Shengqu Information Technology (Shanghai) Co., Ltd. - 906717 - Alphion India Private Limited + 0012E0 + Codan Limited - 6064A1 - RADiflow Ltd + 0012A1 + BluePacket Communications Co., Ltd. - 58B961 - SOLEM Electronique + 00129B + E2S Electronic Engineering Solutions, S.L. - 0C473D - Hitron Technologies Inc. + 001298 + MICO ELECTRIC(SHENZHEN) LIMITED - 8CCDA2 - ACTP Inc. + 0012AC + ONTIMETEK INC. - 84262B - Nokia + 0012BC + Echolab LLC - 986CF5 - ZTE Corporation + 0012BD + Avantec Manufacturing Limited - 447BC4 - DualShine Technology(SZ) Ltd + 0012AB + WiLife, Inc. - 9C039E - Beijing Winchannel Software Technology Ltd + 0012CD + ASEM SpA - 680AD7 - Yancheng Kecheng Optoelectronic Technology Ltd + 0012C0 + HotLava Systems, Inc. - BC8893 - VILLBAU Ltd + 0012B7 + PTW Freiburg - 706173 - Calantec GmbH + 0012DE + Radio Components Sweden AB - 7C49B9 - Plexus Manufacturing Sdn Bhd + 00127C + SWEGON AB - 9CF8DB - Shenzhen eyunmei technology Ltd + 001278 + International Bar Code - 20D21F - Wincal Technology Corp. + 00127A + Sanyu Industry Co.,Ltd. - F89550 - Proton Products Chengdu Ltd + 001206 + iQuest (NZ) Ltd - 58639A - TPL Systemes + 001207 + Head Strong International Limited - 187ED5 - Shenzhen kaism technology Ltd + 001209 + Fastrax Ltd - 841B38 - Shenzhen Excelsecu Data Technology Ltd + 00120B + Chinasys Technologies Limited - 4CCBF5 - ZTE Corporation + 001205 + Terrasat Communications, Inc. - 44700B - Iffu + 001254 + Spectra Technologies Holdings Company Ltd - 54A54B - NSC Communications Siberia Ltd + 001249 + Delta Elettronica S.p.A. - BC2B6B - Beijing Haier IC Design Ltd + 001221 + B.Braun Melsungen AG - 98D331 - Shenzhen Bolutek Technology Ltd + 001212 + PLUS Corporation - 38EC11 - Novatek Microelectronics Corp. + 001213 + Metrohm AG - 1C4158 - Gemalto M2M GmbH + 001218 + ARUZE Corporation - 9C2840 - Discovery Technology Ltd + 001266 + Swisscom Hospitality Services SA - E0AF4B - Pluribus Networks Inc. + 00125E + CAEN - 840F45 - Shanghai GMT Digital Technologies Ltd + 00125D + CyberNet Inc. - 2C5FF3 - Pertronic Industries + 001272 + Redux Communications Ltd. - 78491D - The Will-Burt Company + 00126A + OPTOELECTRONICS Co., Ltd. - F46ABC - Adonit Corp Ltd + 001268 + IPS d.o.o. - 28C671 - Yota Devices Oy + 00123E + ERUNE technology Co., Ltd. - D86960 - Steinsvik + 00123A + Posystech Inc., Co. - 08EF3B - MCS Logic Inc. + 001234 + Camille Bauer - E8EADA - Denkovi Assembly Electronics Ltd + 00124D + Inducon BV - F85BC9 - M-Cube Spa + 001238 + SetaBox Technology Co., Ltd. - 7CB77B - Paradigm Electronics Inc + 00123C + Second Rule LLC - B0CE18 - Zhejiang shenghui lighting Ltd + 001223 + Pixim - 6CF97C - Nanoptix Inc. + 001190 + Digital Design Corporation - F8FF5F - Shenzhen Communication Technology Ltd + 001196 + Actuality Systems, Inc. - 102279 - ZeroDesktop Inc. + 001187 + Category Solutions, Inc - 7C1AFC - Dalian Co-Edifice Video Technology Ltd + 00116F + Netforyou Co., LTD. - F47A4E - Woojeon & Handan + 001171 + DEXTER Communications, Inc. - 04848A - 7INOVA Technology Limited + 001167 + Integrated System Solution Corp. - EC2257 - JiangSu NanJing University Electronic Information Technology Ltd + 0011D3 + NextGenTel Holding ASA - F037A1 - Huike Electronics (Shenzhen) Ltd + 0011C4 + Terminales de Telecomunicacion Terrestre, S.L. - 704CED - TMRG Inc. + 0011CB + Jacobsons AB - F08EDB - VeloCloud Networks + 00117B + Büchi Labortechnik AG - C0A39E - EarthCam Inc. + 0011E3 + Thomson, Inc. - 109AB9 - Tosibox Oy + 0011DC + Glunz & Jensen - 142D8B - Incipio Technologies Inc. + 0011F7 + Shenzhen Forward Industry Co., Ltd - 68EE96 - Cisco SPVTG + 0011AB + TRUSTABLE TECHNOLOGY CO.,LTD. - 78D38D - Hongkong Yunlink Technology Limited + 0011A5 + Fortuna Electronic Corp. - DCAE04 - CELOXICA Ltd + 000FFE + G-PRO COMPUTER - 8005DF - Montage Technology Group Limited + 000FDA + YAZAKI CORPORATION - 681D64 - Sunwave Communications Ltd + 000FEF + Thales e-Transactions GmbH - 907A0A - Gebr. Bode GmbH & Co KG + 001105 + Sunplus Technology Co., Ltd. - A0C6EC - Shenzhen ANYK Technology Ltd + 001102 + Aurora Multimedia Corp. - 78E8B6 - ZTE Corporation + 00113C + Micronas GmbH - 1078CE - Hanvit SI Inc. + 001131 + UNATECH. CO.,LTD - D8DA52 - Apator S.A. + 00114E + 690885 Ontario Inc. - 587A4D - Stonesoft Corporation + 001145 + ValuePoint Networks - 84E629 - Bluwan SA + 001127 + TASI, Inc - C47F51 - Inventek Systems + 00112A + Niko NV - A897DC - IBM + 00112B + NetModule AG - CCD29B - Shenzhen Bopengfa Elec & Technology Ltd + 00112D + iPulse Systems - A09BBD - Total Aviation Solutions Pty Ltd + 001154 + Webpro Technologies Inc. - D40BB9 - Solid Semecs bv. + 001151 + Mykotronx - F415FD - Shanghai Pateo Electronic Equipment Manufacturing Ltd + 001123 + Appointech, Inc. - 70E027 - Hongyu Communication Technology Limited + 00110F + netplat,Inc. - FC35E6 - Visteon Corp + 00116D + American Time and Signal - E8481F - Advanced Automotive Antennas + 001160 + ARTDIO Company Co., LTD - 3495DB - Logitec Corporation + 001115 + EPIN Technologies, Inc. - 9CB793 - Creatcomm Technology Inc. + 00110B + Franklin Technology Systems - 5C335C - Swissphone Telecom AG + 000FEE + XTec, Incorporated - 04DF69 - Car Connectivity Consortium + 000FE4 + Pantech Co.,Ltd - 78DAB3 - GBO Technology + 000FE7 + Lutron Electronics Co., Inc. - 700FEC - Poindus Systems Corp. + 000FE6 + MBTech Systems, Inc. - F02405 - OPUS High Technology Corporation + 000FE9 + GW TECHNOLOGIES CO.,LTD. - D41090 - InfORM Systems AG + 000FE1 + ID DIGITAL CORPORATION - 78D5B5 - Navielektro KY + 000FAB + Kyushu Electronics Systems Inc. - E47D5A - Beijing Hanbang Technology Corp. + 000FAD + FMN communications GmbH - E4F7A1 - Datafox GmbH + 000FAC + IEEE 802.11 - 105C3B - Perma-Pipe Inc. + 000FB3 + Actiontec Electronics, Inc - 349D90 - Heinzmann GmbH & Co. KG + 000F9C + Panduit Corp - D862DB - Eno Inc. + 000F7A + BeiJing NuQX Technology CO.,LTD - C47DFE - A.N. Solutions GmbH + 000F64 + D&R Electronica Weesp BV - CCBD35 - Steinel GmbH + 000F72 + Sandburst - 6CECA1 - Shenzhen Clou Electronics Ltd + 000F75 + First Silicon Solutions - B03850 - Nanjing CAS-ZDC IOT SysTEM Ltd + 000F7C + ACTi Corporation - 748E08 - Bestek Corp. + 000FC7 + Dionica R&D Ltd. - 78F5E5 - BEGA Gantenbrink-Leuchten KG + 000FC8 + Chantry Networks - 8C3C07 - Skiva Technologies Inc. + 000FBB + Nokia Siemens Networks GmbH & Co. KG. - 38A86B - Orga BV + 000FBC + Onkey Technologies, Inc. - F07765 - Sourcefire Inc. + 000FDF + SOLOMON Technology Corp. - 1441E2 - Monaco Enterprises Inc. + 000FD6 + Sarotech Co., Ltd - ECD040 - GEA Farm Technologies GmbH + 000F98 + Avamax Co. Ltd. - F80DEA - ZyCast Technology Inc. + 000F97 + Avanex Corporation - B08807 - Strata Worldwide + 000F96 + Telco Systems, Inc. - 249504 - SFR + 000FB6 + Europlex Technologies - F45842 - Boxx TV Ltd + 000FB9 + Adaptive Instruments - 106682 - NEC Platforms Ltd + 000F8B + Orion MultiSystems Inc - 246278 - Sysmocom - Systems for mobile Communications GmbH + 000F8C + Gigawavetech Pte Ltd - F084C9 - ZTE Corporation + 000F45 + Stretch, Inc. - D4016D - TP-Link Technologies Ltd + 000F3B + Fuji System Machines Co., Ltd. - 985C93 - SBG Systems SAS + 000F37 + Xambala Incorporated - A08A87 - HuiZhou KaiYue Electronic Ltd + 000F38 + Netstar - 28CD9C - Shenzhen Dynamax Software Development Ltd + 000F3A + HISHARP - C0C3B6 - Automatic Systems + 000F34 + Cisco Systems, Inc - A0EB76 - AirCUVE Inc. + 000F30 + Raza Microelectronics Inc - FC4499 - Swarco LEA d.o.o. + 000F2E + Megapower International Corp. - DC647C - C.R.S. iiMotion GmbH + 000F26 + WorldAccxx LLC - 148692 - TP-Link Technologies Ltd + 000F53 + Solarflare Communications Inc. - A8154D - TP-Link Technologies Ltd + 000F51 + Azul Systems, Inc. - 5CF370 - CC&C Technologies Inc. + 000F07 + Mangrove Systems, Inc. - A4E0E6 - Filizola S.A. Pesagem E Automacao + 000F00 + Legra Systems, Inc. - 381766 - Promzakaz Ltd + 000F01 + DIGITALKS INC - 18E8DD - Moduletek + 000F03 + COM&C CO., LTD - D073D5 - Lifi Labs Management Pty Ltd + 000F54 + Entrelogic Corporation - 149448 - BLU Castle S.A. + 000EDF + PLX Technology - 48F925 - Maestronic + 000EE1 + ExtremeSpeed Inc. - 386793 - Asia Optical Co. Inc. + 000F25 + AimValley B.V. - 0C8268 - TP-Link Technologies Ltd + 000F19 + Boston Scientific - D81EDE - B&W Group Ltd + 000ED3 + Epicenter, Inc. - 24EA40 - Helmholz GmbH & Co. KG + 000ED7 + Cisco Systems, Inc - D429EA - Zimory GmbH + 000F10 + RDM Corporation - 34ADE4 - Shanghai Chint Power Systems Ltd + 000EC5 + Digital Multitools Inc - 3C94D5 - Juniper Networks + 000EC7 + Motorola Korea - 68831A - Pandora Mobility Corporation + 000EBA + HANMI SEMICONDUCTOR CO., LTD. - FCDB96 - Enervalley Ltd + 000EBC + Paragon Fidelity GmbH - 1423D7 - Eutronix Ltd + 000EA8 + United Technologists Europe Limited - DC6F08 - Bay Storage Technology + 000E8B + Astarte Technology Co, Ltd. - 90DA4E - Avanu + 000E80 + Thomson Technology Inc - 281878 - Microsoft Corporation + 000EAA + Scalent Systems, Inc. - 7038B4 - Low Tech Solutions + 000EAC + MINTRON ENTERPRISE CO., LTD. - 745F00 - Samsung Semiconductor Inc. + 000EAE + GAWELL TECHNOLOGIES CORP. - E0C3F3 - ZTE Corporation + 000EA4 + Quantum Corp. - 5C20D0 - Asoni Communication Ltd + 000E6B + Janitza electronics GmbH - ACA430 - Peerless AV + 000E67 + Eltis Microelectronics Ltd. - 847A88 - HTC Corporation + 000E65 + TransCore - A4D856 - Gimbal Inc. + 000E7A + GemWon Communications Co., Ltd. - 785517 - SankyuElectronics + 000E6C + Device Drivers Limited - B47F5E - Foresight Manufacture (S) Pte Ltd + 000E9D + Tiscali UK Ltd - A0FE91 - AVAT Automation GmbH + 000E5F + activ-net GmbH & Co. KG - 74ECF1 - Acumen + 000E57 + Iworld Networking, Inc. - 5809E5 - Kivic Inc. + 000E47 + NCI System Co.,Ltd. - 504F94 - Loxone Electronics GmbH + 000E85 + Catalyst Enterprises, Inc. - 60B185 - ATH System + 000E74 + Solar Telecom. Tech - BC629F - Telenet Systems P Ltd + 000DE7 + Snap-on OEM Group - 380FE4 - Dedicated Network Partners Oy + 000DF0 + QCOM TECHNOLOGY INC. - 48F230 - Ubizcore Ltd + 000DE5 + Samsung Thales - 78324F - Millennium Group Inc. + 000DDD + Profilo Telra Elektronik Sanayi ve Ticaret. A.Ş - 384369 - Patrol Products Consortium LLC + 000DF5 + Teletronics International Inc. - 44184F - Fitview + 000DF7 + Space Dynamics Lab - 84ACA4 - Beijing Novel Super Digital TV Technology Ltd + 000DEB + CompXs Limited - 541FD5 - Advantage Electronics + 000DEE + Andrew RF Power Amplifier Group - ACE97F - IoT Tech Limited + 000DEF + Soc. Coop. Bilanciai - E85AA7 - LLC Emzior + 000E11 + BDT Büro und Datentechnik GmbH & Co.KG - 9C9C1D - Starkey Labs Inc. + 000DF8 + ORGA Kartensysteme GmbH - D0D6CC - Wintop + 000E46 + Niigata Seimitsu Co.,Ltd. - 58D071 - BW Broadcast + 000E43 + G-Tek Electronics Sdn. Bhd. - 1C52D6 - Flat Display Technology Corporation + 000E44 + Digital 5, Inc. - D0DFB2 - Genie Networks Limited + 000E1F + TCL Networks Equipment Co., Ltd. - 386645 - OOSIC Technology Ltd + 000E26 + Gincom Technology Corp. - B85AF7 - Ouya Inc. + 000E16 + SouthWing S.L. - 34F62D - Sharp Corporation + 000E0B + Netac Technology Co., Ltd. - 4C8FA5 - Jastec + 000E32 + Kontron Medical - 84ED33 - BBMC Ltd + 000DAF + Plexus Corp (UK) Ltd - E82E24 - Out Of the Fog Research LLC + 000DB1 + Japan Network Service Co., Ltd. - 80FA5B - Clevo Co. + 000DA7 + Private - C0B339 - Comigo Ltd + 000DAD + Dataprobe, Inc. - 20858C - Assa + 000DA9 + INGETEAM - 60CDC5 - Taiwan Carol Electronics Ltd + 000DAB + Parker Hannifin GmbH Electromechanical Division Europe - D8182B - Conti Temic Microelectronic GmbH + 000D78 + Engineering & Security - 80CF41 - Lenovo Mobile Communication Technology Ltd + 000D79 + Dynamic Solutions Co,.Ltd. - 9CE1D6 - Junger Audio-Studiotechnik GmbH + 000D6D + K-Tech Devices Corp. - 48B9C2 - Teletics Inc. + 000D6E + K-Patents Oy - 58D6D3 - Dairy Cheq Inc + 000DA8 + Teletronics Technology Corporation - 046E49 - TaiYear Electronic Technology (Suzhou) Ltd + 000D9E + TOKUDEN OHIZUMI SEISAKUSYO Co.,Ltd. - 2C3BFD - Netstor Technology Ltd + 000DA3 + Emerging Technologies Limited - AC3CB4 - Nilan A/S + 000DA4 + DOSCH & AMAND SYSTEMS AG - B49DB4 - Axion Technologies Inc. + 000D9A + INFOTEC LTD - ACE87E - Bytemark Computer Consulting Ltd + 000DC0 + Spagat AS - 8007A2 - Esson Technology Inc. + 000DC6 + DigiRose Technology Co., Ltd. - C0A0E2 - Eden Innovations + 000DC1 + SafeWeb Inc - 080FFA - KSP Inc. + 000D85 + Tapwave, Inc. - E8ABFA - Shenzhen Reecam Tech Ltd + 000D82 + PHSNET - DCB058 - Burkert Werke GmbH + 000D83 + Sanmina-SCI Hungary Ltd. - 6C5A34 - Shenzhen Haitianxiong Electronic Ltd + 000D7F + MIDAS COMMUNICATION TECHNOLOGIES PTE LTD ( Foreign Branch) - 9038DF - Changzhou Tiannengbo System Ltd + 000D75 + Kobian Pte Ltd - Taiwan Branch - 185253 - Pixord Corporation + 000D6A + Redwood Technologies LTD - 683B1E - Countwise Ltd + 000D5D + Raritan Computer, Inc - ACA22C - Baycity Technologies Ltd + 000D63 + DENT Instruments, Inc. - 303294 - W-IE-NE-R Plein & Baus GmbH + 000D66 + Cisco Systems, Inc - 7C822D - Nortec + 000D96 + Vtera Technology Inc. - 10FBF0 - KangSheng Ltd + 000D8B + T&D Corporation - 6C9AC9 - Valentine Research Inc. + 000D90 + Factum Electronics AB - AC8D14 - Smartrove Inc + 000DBA + Océ Document Technologies GmbH - 2091D9 - I'M SPA + 000DBD + Cisco Systems, Inc - AC7236 - Lexking Technology Ltd + 000DB5 + GLOBALSAT TECHNOLOGY CORPORATION - 3CD7DA - SK Mtek microelectronics(Shenzhen)limited + 000DB4 + Stormshield - 04F8C2 - Flaircomm Microelectronics Inc. + 000CCB + Design Combus Ltd - 141BF0 - Intellimedia Systems Ltd + 000CC9 + ILWOO DATA & TECHNOLOGY CO.,LTD - 5887E2 - Shenzhen Coship Electronics Ltd + 000D02 + NEC Platforms, Ltd. - 6869F2 - ComAp s.r.o. + 000D07 + Calrec Audio Ltd - B85AFE - Handaer Communication Technology (Beijing) Ltd + 000D2F + AIN Comm.Tech.Co., LTD - F46DE2 - ZTE Corporation + 000D21 + WISCORE Inc. - F0ACA4 - HBC-radiomatic + 000D23 + Smart Solution, Inc - 60748D - Atmaca Elektronik + 000D27 + MICROPLEX Printware AG - B8B7D7 - 2GIG Technologies + 000D1B + Kyoto Electronics Manufacturing Co., Ltd. - 808287 - ATCOM Technology Ltd + 000D1D + HIGH-TEK HARNESS ENT. CO., LTD. - 28A186 - enblink + 000D09 + Yuehua(Zhuhai) Electronic CO. LTD - 503955 - Cisco SPVTG + 000CEE + jp-embedded - 78D129 - Vicos + 000CE9 + BLOOMBERG L.P. - 84DF0C - NET2GRID BV + 000CEA + aphona Kommunikationssysteme - 388EE7 - Fanhattan LLC + 000D40 + Verint Loronix Video Solutions - 5CD41B - UCZOON Technology Ltd + 000D37 + WIPLUG - CCE798 - My Social Stuff + 000D33 + Prediwave Corp. - A036F0 - Comprehensive Power + 000CDA + FreeHand Systems, Inc. - 180CAC - Canon Inc. + 000CDD + AOS technologies AG - 78AB60 - ABB Australia + 000CCD + IEC - TC57 - 8482F4 - Beijing Huasun Unicreate Technology Ltd + 000CFB + Korea Network Systems - 00DB1E - Albedo Telecom SL + 000CF5 + InfoExpress - 18863A - Digital ART System + 000C85 + Cisco Systems, Inc - 0CDCCC - Inala Technologies + 000C84 + Eazix, Inc. - 98291D - Jaguar de Mexico, SA de CV + 000C7A + DaTARIUS Technologies GmbH - 34AF2C - Nintendo Ltd + 000C79 + Extel Communications P/L - 7CD9FE - New Cosmos Electric Ltd + 000C6D + Edwards Ltd. - E49069 - Rockwell Automation + 000C70 + ACC GmbH - CCC104 - Applied Technical Systems + 000C6A + MBARI - 60455E - Liptel s.r.o. + 000C6B + Kurz Industrie-Elektronik GmbH - D806D1 - Honeywell Fire System (Shanghai) Ltd + 000C9D + UbeeAirWalk, Inc. - 647657 - Innovative Security Designs + 000C9F + NKE Corporation - 907025 - Garea Microsys Ltd + 000C9A + Hitech Electronics Corp. - 10D1DC - INSTAR Deutschland GmbH + 000C91 + Riverhead Networks Inc. - 34996F - VPI Engineering + 000C5D + CHIC TECHNOLOGY (CHINA) CORP. - 944A09 - BitWise Controls + 000C4F + UDTech Japan Corporation - BC28D6 - Rowley Associates Limited + 000C62 + ABB AB, Cewe-Control - 10BD18 - Cisco Systems Inc. + 000C4C + Arcor AG&Co. - 5869F9 - Fusion Transactive Ltd + 000C47 + SK Teletech(R&D Planning Team) - D41E35 - TOHO Electronics Inc. + 000CAF + TRI TERM CO.,LTD. - 4C72B9 - Pegatron Corporation + 000CB3 + ROUND Co.,Ltd. - 2CEDEB - Alpheus Digital Company Limited + 000CA5 + Naman NZ LTd - 0CD996 - Cisco Systems Inc. + 000CA9 + Ebtron Inc. - 30F33A - +plugg srl + 000C75 + Oriental integrated electronics. LTD - 0C57EB - Mueller Systems + 000C20 + Fi WIn, Inc. - 745327 - Commsen Ltd + 000C15 + CyberPower Systems, Inc. - D08CFF - Upwis AB + 000BD6 + Paxton Access Ltd - 68CE4E - L-3 Communications Infrared Products + 000BD0 + XiMeta Technology Americas Inc. - 68D1FD - Shenzhen Trimax Technology Ltd + 000BD4 + Beijing Wise Technology & Science Development Co.Ltd - 9C066E - Hytera Communications Corporation Limited + 000BE7 + COMFLUX TECHNOLOGY INC. - 3CEAFB - NSE AG + 000BDA + EyeCross Co.,Inc. - 8CC7AA - Radinet Communications Inc. + 000C16 + Concorde Microsystems Inc. - 40336C - Godrej & Boyce Mfg Ltd + 000C09 + Hitachi IE Systems Co., Ltd - F8A03D - Dinstar Technologies Ltd + 000BEC + NIPPON ELECTRIC INSTRUMENT, INC. - 2CD444 - Fujitsu Limited + 000C3F + Cogent Defence & Security Networks, - BC811F - Ingate Systems + 000C30 + Cisco Systems, Inc - D867D9 - Cisco Systems Inc. + 000C1F + Glimmerglass Networks - A4E731 - Nokia Corporation + 000C02 + ABB Oy - 98A7B0 - Mcst ZAO + 000BFF + Berkeley Camera Engineering - 4C068A - Basler Electric Company + 000B73 + Kodeos Communications - E856D6 - NCTech Ltd + 000B76 + ET&T Technology Co. Ltd. - C08170 - Effigis GeoSolutions + 000B5E + Audio Engineering Society Inc. - 642216 - Shandong Taixin Electronic Ltd + 000B5F + Cisco Systems, Inc - 443839 - Cumulus Networks Inc. + 000B60 + Cisco Systems, Inc - 048B42 - Skspruce Technologies + 000B65 + Sy.A.C. srl - 5076A6 - Ecil Informatica Ind. Com Ltda + 000B61 + Friedrich Lütze GmbH & Co. KG - A44C11 - Cisco Systems Inc. + 000B99 + SensAble Technologies, Inc. - 60843B - Soladigm Inc. + 000B9C + TriBeam Technologies, Inc. - AC4BC8 - Juniper Networks + 000B89 + Top Global Technology, Ltd. - 209BA5 - JIAXING GLEAD Electronics Ltd + 000B8B + KERAJET, S.A. - A0F450 - HTC Corporation + 000B59 + ScriptPro, LLC - 6089B1 - Key Digital Systems + 000B5C + Newtech Co.,Ltd - 44D15E - Shanghai Kingto Information Technology Ltd + 000B5B + Rincon Research Corporation - 0036FE - SuperVision + 000B83 + DATAWATT B.V. - 709E86 - X6D Limited + 000B71 + Litchfield Communications Inc. - A0F419 - Nokia Corporation + 000B74 + Kingwave Technology Co., Ltd. - 1C973D - PRICOM Design + 000B7E + SAGINOMIYA Seisakusho Inc. - BC0200 - Stewart Audio + 000B80 + Lycium Networks - 489153 - Weinmann Gerate fur Medizin GmbH + Co. KG + 000BA7 + Maranti Networks - AC9403 - Envision Peripherals Inc + 000BAA + Aiphone co.,Ltd - 68D925 - ProSys Development Services + 000BA4 + Shiron Satellite Communications Ltd. (1996) - 848D84 - Rajant Corporation + 000BC1 + Bay Microsystems, Inc. - 54466B - Shenzhen CZTIC Electronic Technology Ltd + 000BC5 + SMC Networks, Inc. - 44B382 - Kuang-chi Institute Of Advanced Technology + 000BC6 + ISAC, Inc. - 60B933 - Deutron Electronics Corp. + 000B41 + Ing. Büro Dr. Beutlhauser - 0043FF - Ketron S.R.L. + 000B05 + Pacific Broadband Networks - 7CACB2 - Bosch Software Innovations GmbH + 000B00 + FUJIAN START COMPUTER EQUIPMENT CO.,LTD - 18D66A - Inmarsat + 000B03 + Taekwang Industrial Co., Ltd - 1C7C45 - Vitek Industrial Video Products Inc. + 000B01 + DAIICHI ELECTRONICS CO., LTD. - 3C3888 - ConnectQuest LLC + 000AEA + ADAM ELEKTRONIK LTD. ŞTI - 48D7FF - BLANKOM Antennentechnik GmbH + 000AE3 + YANG MEI TECHNOLOGY CO., LTD - C47130 - Fon Technology S.L. + 000ADC + RuggedCom Inc. - D8337F - Office FA Ltd + 000AE0 + Fujitsu Softek - 0036F8 - Conti Temic microelectronic GmbH + 000B20 + Hirata corporation - A4F7D0 - LAN Accessories Ltd + 000B22 + Environmental Systems and Services - C85645 - Intermas France + 000B1B + Systronix, Inc. - 44348F - MXT Industrial Ltda + 000B3E + BittWare, Inc - D4EC0C - Harley-Davidson Motor Company + 000B29 + LS(LG) Industrial Systems co.,Ltd - 28E608 - Tokheim + 000ABB + Taiwan Secom Co,. Ltd - 74FF7D - Wren Sound Systems LLC + 000AAD + Stargames Corporation - ACF0B2 - Becker Electronics Taiwan Ltd + 000B39 + Keisoku Giken Co.,Ltd. - 542A9C - LSY Defense LLC. + 000B33 + Vivato Technologies - 504A5E - Masimo Corporation + 000B11 + HIMEJI ABC TRADING CO.,LTD. - 6CA96F - TransPacket AS + 000A6E + Harmonic, Inc - AC0142 - Uriel Technologies SIA + 000A6D + EKS Elektronikservice GmbH - C47BA3 - NAVIS Inc. + 000A74 + Manticom Networks Inc. - F44848 - Amscreen Group Ltd + 000A6F + ZyFLEX Technologies Inc - 50D274 - Steffes Corporation + 000AA4 + SHANGHAI SURVEILLANCE TECHNOLOGY CO,LTD - C8F704 - Building Block Video + 000A9E + BroadWeb Corportation - 508A42 - Uptmate Technology Ltd + 000A90 + Bayside Interactive, Inc. - BCEA2B - CityCom GmbH + 000A9D + King Young Technology Co. Ltd. - 0CA138 - Blinq Wireless Inc. + 000AB1 + GENETEC Corporation - 5C6F4F - S.A. Sistel + 000AB7 + Cisco Systems, Inc - 901B0E - Fujitsu Technology Solutions GmbH + 000AB9 + Astera Technologies Corp. - F85063 - Verathon + 000AA1 + V V S Limited - 2C36F8 - Cisco Systems Inc. + 000A25 + CERAGON NETWORKS - 845787 - DVR C&C Ltd + 000A21 + Integra Telecom Co. Ltd - 5808FA - Fiber Optic & telecommunication Inc. + 000A1E + Red-M Products Limited - AC3D05 - Instorescreen Aisa + 000A4B + DataPower Technology, Inc. - 286094 - Capelec + 000A43 + Chunghwa Telecom Co., Ltd. - A45630 - Cisco Systems Inc. + 000A45 + Audio-Technica Corp. - C43C3C - Cybelec SA + 000A33 + Emulex Corporation - B826D4 - Furukawa Industrial S.A. Produtos Eletricos + 000A2E + MAPLE NETWORKS CO., LTD - B87447 - Convergence Technologies + 000A2D + Cabot Communications Limited - 7463DF - VTS GmbH + 000A35 + Xilinx - BC125E - Beijing WisVideo Inc. + 000A3B + GCT Semiconductor, Inc - 14E4EC - mLogic LLC + 000A8B + Cisco Systems, Inc - 3828EA - Fujian Netcom Technology Ltd + 000A88 + InCypher S.A. - D01AA7 - UniPrint + 000A7C + Tecton Ltd - 846AED - Wireless Tsukamoto. Ltd + 000A63 + DHD GmbH - E05DA6 - Detlef Fink Elektronik & Softwareentwicklung + 000A67 + OngCorp - 045A95 - Nokia Corporation + 0009DA + Control Module Inc. - 04F4BC - Xena Networks + 0009D7 + DC Security Products - 80DB31 - Power Quotient International Ltd + 0009DB + eSpace - 1C51B5 - Techaya Ltd + 0009D5 + Signal Communication, Inc. - 6C3A84 - Shenzhen Aero-Startech Ltd + 0009FB + Philips Patient Monitoring - 00D632 - GE Energy + 0009F9 + ART JAPAN CO., LTD. - 0C9E91 - Sankosha Corporation + 0009FD + Ubinetics Limited - 383F10 - DBL Technology Ltd + 0009B6 + Cisco Systems, Inc - ACD364 - ABB SPA, ABB Sace Div. + 0009B3 + MCM Systems Ltd - 2CEE26 - Petroleum Geo-Services + 0009A3 + Leadfly Techologies Corp. Ltd. - C8F9F9 - Cisco Systems Inc. + 0009A5 + HANSUNG ELETRONIC INDUSTRIES DEVELOPMENT CO., LTD - A4EF52 - Telewave Ltd + 0009D3 + Western DataCom Co., Inc. - A826D9 - HTC Corporation + 000A14 + TECO a.s. - 28940F - Cisco Systems Inc. + 000A0B + Sealevel Systems, Inc. - B8DAF7 - Advanced Photonics Inc. + 000A10 + FAST media integrations AG - 143AEA - Dynapower Company LLC + 0009E6 + Cyber Switching Inc. - A086EC - SAEHAN HITEC Ltd + 0009E2 + Sinbon Electronics Co., Ltd. - 942E17 - Schneider Electric Canada Inc + 00099A + ELMO COMPANY, LIMITED - C46044 - Everex Electronics Limited + 00099C + Naval Research Laboratory - 98FE03 - Ericsson - North America + 0009BC + Utility, Inc - E03C5B - Shenzhen Jiaxinjie Electron Ltd + 0009BE + Mamiya-OP Co.,Ltd. - CC944A - Pfeiffer Vacuum GmbH + 000992 + InterEpoch Technology,INC. - 0C8525 - Cisco Systems Inc. + 000995 + Castle Technology Ltd - B4D8A9 - BetterBots + 000998 + Capinfo Company Limited - 7CC8D7 - Damalisk + 00098F + Cetacean Networks - 9CB008 - Ubiquitous Computing Technology Corporation + 000986 + Metalink LTD. - A8776F - Zonoff + 000987 + NISHI NIPPON ELECTRIC WIRE & CABLE CO.,LTD. - 648788 - Juniper Networks + 000989 + VividLogic Inc. - 00FA3B - Cloos Electronic GmbH + 00098C + Option Wireless Sweden - 541DFB - Freestyle Energy Ltd + 000985 + Auto Telecom Company - 60B606 - Phorus + 00098D + Velocity Semiconductor - 9092B4 - Diehl BGT Defence GmbH & Co. KG + 000981 + Newport Networks - 20AA4B - Cisco-Linksys LLC + 00092C + Hitpoint Inc. - CC6DEF - TJK Tietolaite Oy + 00092B + iQstor Networks, Inc. - A85BF3 - Audivo GmbH + 000926 + YODA COMMUNICATIONS, INC. - B8975A - BIOSTAR Microtech Int'l Corp. + 000927 + TOYOKEIKI CO.,LTD. - 4833DD - Zennio Avance Y Tecnologia, S.L. + 000923 + Heaman System Co., Ltd - 087572 - Obelux Oy + 00091D + Proteam Computer Corporation - 10C2BA - UTT Ltd + 000955 + Young Generation International Corp. - 90D74F - Bookeen + 00094A + Homenet Communications - 64C5AA - South African Broadcasting Corporation + 00094B + FillFactory NV - 98AAD7 - Blue Wave Networking Ltd + 00094D + Braintree Communications Pty Ltd - 9C53CD - ENGICAM s.r.l. + 000950 + Independent Storage Corporation - 608645 - Avery Weigh-Tronix LLC + 000954 + AMiT spol. s. r. o. - FC8FC4 - Intelligent Technology Inc. + 000952 + Auerswald GmbH & Co. KG - 10FC54 - Shany Electronic Ltd + 000944 + Cisco Systems, Inc - C02973 - Audyssey Laboratories Inc. + 000962 + Sonitor Technologies AS - 78FE3D - Juniper Networks + 00095D + Dialogue Technology Corp. - 2838CF - Gen2wave + 00095C + Philips Medical Systems - Cardiac and Monitoring Systems (CM - 24BC82 - Dali Wireless Inc. + 000958 + INTELNET S.A. - B40C25 - Palo Alto Networks + 000909 + Telenor Connect A/S - F8F7D3 - International Communications Corporation + 00090A + SnedFar Technology Co., Ltd. - 28D1AF - Nokia Corporation + 000984 + MyCasa Network Inc. - 24C0B3 - RSF + 000917 + WEM Technology Inc - FC455F - Jiangxi Shanshui Optoelectronic Technology Ltd + 000873 + DapTechnology B.V. - F04A2B - PYRAMID Computer GmbH + 00087A + Wipotec GmbH - 302DE8 - JDA LLC (JDA Systems) + 000871 + NORTHDATA Co., Ltd. - 48A6D2 - GJsun Optical Science and Tech Ltd + 00087E + Bon Electro-Telecom Inc. - 500B32 - Foxda Technology Industrial(Shenzhen) Ltd + 000880 + BroadTel Canada Communications inc. - 603553 - Buwon Technology + 0008B4 + SYSPOL - E039D7 - Plexxi Inc. + 0008B3 + Fastwel - 7C336E - MEG Electronics Inc. + 0008B2 + SHENZHEN COMPASS TECHNOLOGY DEVELOPMENT CO.,LTD - D4E33F - Nokia + 0008B1 + ProQuent Systems - 68CD0F - U Tek Company Limited + 0008AF + Novatec Corporation - 603FC5 - Ltd + 0008A6 + Multiware & Image Co., Ltd. - A4E391 - Deny Fontaine + 0008EB + ROMWin Co.,Ltd. - AC6FD9 - Valueplus Inc. + 0008E8 + Excel Master Ltd. - DC1EA3 - Accensus LLC + 0008DC + Wiznet - A40130 - ABIsystems Ltd + 0008DD + Telena Communications, Inc. - 90A783 - JSW Pacific Corporation + 0008E1 + Barix AG - F8462D - SYNTEC Incorporation + 0008DA + SofaWare Technologies Ltd. - 78A5DD - Shenzhen Smarteye Digital Electronics Ltd + 0008D4 + IneoQuest Technologies, Inc - 28AF0A - Sirius XM Radio Inc + 0008D6 + HASSNET Inc. - 5CD4AB - Zektor + 0008CE + IPMobileNet Inc. - 08FC52 - OpenXS BV + 00088E + Nihon Computer Co., Ltd. - 4C32D9 - M Rutty Holdings Pty Ltd + 000881 + DIGITAL HANDS CO.,LTD. - 08A12B - Shenzhen EZL Technology Ltd + 000882 + SIGMA CORPORATION - A00CA1 - SKTB SKiT + 000903 + Panasas, Inc - 64E84F - Serialway Communication Technology Ltd + 000907 + Chrysalis Development - 2C9EFC - Canon Inc. + 000906 + Esteem Networks - 182B05 - 8D Technologies + 0008FB + SonoSite, Inc. - 240BB1 - KOSTAL Industrie Elektrik GmbH + 0008EE + Logic Product Development - 20EEC6 - Elefirst Science & Tech Co Ltd + 0008C2 + Cisco Systems, Inc - E01E07 - Anite Telecoms US Inc. + 0008C0 + ASA SYSTEMS - 7C6B33 - Tenyu Tech Ltd + 0008A3 + Cisco Systems, Inc - 147DC5 - Murata Manufacturing Ltd + 00089E + Beijing Enter-Net co.LTD - 00B9F6 - Shenzhen Super Rich Electronics Ltd + 0007DD + Cradle Technologies - FCC23D - Atmel Corporation + 0007D5 + 3e Technologies Int;., Inc. - 88E7A6 - iKnowledge Integration Corp. + 0007DB + Kirana Networks, Inc. - A446FA - AmTRAN Video Corporation + 00086D + Missouri FreeNet - CCE7DF - American Magnetics Inc. + 00086A + Securiton Gmbh - 2804E0 - Fermax Electronica S.A.U. + 000863 + Entrisphere Inc. - 644346 - Guangdong Quick Network Computer Ltd + 000866 + DSX Access Systems, Inc. - D4024A - Delphian Systems LLC + 00085F + Picanol N.V. - 0041B4 - Wuxi Zhongxing Optoelectronics Technology Ltd + 00047B + Schlumberger - F44450 - BND Ltd + 0007D1 + Spectrum Signal Processing Inc. - 0462D7 - Alstom Hydro France + 0007B9 + Ginganet Corporation - D4507A - CEIVA Logic Inc. + 00047F + Chr. Mayr GmbH & Co. KG - 64D989 - Cisco Systems Inc. + 00080C + VDA Group S.p.a. - 645DD7 - Shenzhen Lifesense Medical Electronics Ltd + 000804 + ICA Inc. - EC4670 - Meinberg Funkuhren GmbH & Co. KG + 0007FF + Gluon Networks - D05A0F - I-BT Digital Ltd + 0007F7 + Galtronics - EC9681 - 2276427 Ontario Inc + 000829 + TOKYO ELECTRON DEVICE NAGASAKI LIMITED - 5C076F - Thought Creator + 00081B + Windigo Systems - 3C0FC1 - KBC Networks + 0007B4 + Cisco Systems, Inc - 58E636 - EVRsafe Technologies + 0007B3 + Cisco Systems, Inc - 10F9EE - Nokia Corporation + 0007B5 + Any One Wireless Ltd. - 742B0F - Infinidat Ltd + 0007EF + Lockheed Martin Tactical Systems - C8F981 - Seneca s.r.l. + 0007F4 + Eletex Co., Ltd. - 24497B - Innovative Converged Devices Inc + 000852 + Davolink Co. Inc. - 98E79A - Foxconn(NanJing) Communication Ltd + 000857 + Polaris Networks, Inc. - A0E9DB - Ningbo FreeWings Technologies Ltd + 000736 + Data Video Technologies Co., Ltd. - 788973 - CMC + 000738 + Young Technology Co., Ltd. - 14307A - Avermetrics + 00077F + J Communications Co., Ltd. - A06CEC - RIM + 000771 + Embedded System Corporation - 203706 - Cisco Systems Inc. + 000770 + Ubiquoss Inc - F4B164 - Lightning Telecommunications Technology Ltd + 000764 + YoungWoo Telecom Co. Ltd. - 70B035 - Shenzhen Zowee Technology Ltd + 000766 + Chou Chin Industrial Co., Ltd. - 8821E3 - Nebusens, S.L. + 000761 + 29530 - 90B97D - Johnson Outdoors Marine Electronics d/b/a Minnkota + 000755 + Lafon - 7CF429 - NUUO Inc. + 000759 + Boris Manufacturing Corp. - CCB55A - Fraunhofer ITWM + 000751 + m-u-t AG - AC8ACD - ROGER D.Wensker, G.Wensker sp.j. + 000750 + Cisco Systems, Inc - 984246 - SOL Industry PTE Ltd + 000789 + Allradio Co., Ltd - 3429EA - MCD Electronics SP. Z O.O. + 000787 + Idea System Co., Ltd. - 8C82A8 - Insigma Technology Ltd + 000785 + Cisco Systems, Inc - 60190C - Rramac + 000775 + Valence Semiconductor, Inc. - D05FCE - Hitachi Data Systems + 000793 + Shin Satellite Public Company Limited - F80332 - Khomp + 000796 + LSI Systems, Inc. - 28A574 - Miller Electric Mfg. Co. + 000783 + SynCom Network, Inc. - 1045BE - Norphonic AS + 000742 + Ormazabal - 90B8D0 - Joyent Inc. + 00074B + Daihen Corporation - AC4723 - Genelec + 00074A + Carl Valentin GmbH - E8BA70 - Cisco Systems Inc. + 00073C + Telecom Design - D4A425 - SMAX Technology Ltd + 000719 + Mobiis Co., Ltd. - 281471 - Lantis Ltd + 00070D + Cisco Systems, Inc - 24470E - PentronicAB + 00070E + Cisco Systems, Inc - D09B05 - Emtronix + 00070B + Novabase SGPS, SA - 8C11CB - ABUS Security-Center GmbH & Co. KG + 0007A2 + Opteon Corporation - FC8329 - Trei technics + 000729 + Kistler Instrumente AG - 14EB33 - BSMediasoft Ltd + 00072A + Innovance Networks - F4B549 - Xiamen Yeastar Information Technology Ltd + 0006EE + Shenyang Neu-era Information & Technology Stock Co., Ltd - 88B168 - Delta Control GmbH + 0006E8 + Optical Network Testing, Inc. - 68876B - INQ Mobile Limited + 0006E2 + Ceemax Technology Co., Ltd. - 1CAA07 - Cisco Systems Inc. + 0006E1 + Techno Trade s.a - 685B36 - Powertech Industrial Ltd + 000710 + Adax, Inc. - 28EE2C - Frontline Test Equipment + 0006F8 + The Boeing Company - 782EEF - Nokia Corporation + 0006FB + Hitachi Printing Solutions, Ltd. - 7CF0BA - Linkwell Telesystems Pvt Ltd + 0006FC + Fnet Co., Ltd. - AC8674 - Open Mesh Inc. + 0006B5 + Source Photonics, Inc. - 64D241 - Keith & Koep GmbH + 0006A5 + PINON Corp. - 18B79E - Invoxia + 00069D + Petards Ltd - 8C4435 - Shanghai BroadMobi Communication Technology Ltd + 0006A8 + KC Technology, Inc. - F81D93 - Longdhua(Beijing) Controls Technology Ltd + 0006A0 + Mx Imaging - 94D93C - Enelps + 0006BA + Westwave Communications - B8BEBF - Cisco Systems Inc. + 0006BE + Baumer Optronic GmbH - 64B64A - ViVOtech Inc. + 0006C4 + Piolink Inc. - 38D135 - EasyIO Corporation Sdn. Bhd. + 0006F4 + Prime Electronics & Satellitics Inc. - CCF841 - Lumewave + 000690 + Euracom Communication GmbH - 30EB25 - Intek Digital + 0006DA + ITRAN Communications Ltd. - 44E4D9 - Cisco Systems Inc. + 0006D0 + Elgar Electronics Corp. - ACCA54 - Telldus Technologies AB + 0006CC + JMI Electronics Co., Ltd. - 901900 - SCS SA + 0006BF + Accella Technologies Co., Ltd. - D45D42 - Nokia Corporation + 00067E + WinCom Systems, Inc. - B03829 - Siliconware Precision Industries Ltd + 000677 + SICK AG - 7C6C39 - Pixsys SRL + 00062E + Aristos Logic Corp. - 18B3BA - Netlogic AB + 000625 + The Linksys Group, Inc. - 8C5FDF - Beijing Railway Signal Factory + 000627 + Uniwide Technologies, Inc. - D47B75 - HARTING Electronics GmbH + 000624 + Gentner Communications Corp. - D8DF0D - beroNet GmbH + 00062C + Bivio Networks - ACF97E - Elesys Inc. + 000621 + Hinox, Co., Ltd. - 204005 - feno GmbH + 00061C + Hoshino Metal Industries, Ltd. - D46F42 - WAXESS USA Inc + 0005F5 + Geospace Technologies - 300B9C - Delta Mobile Systems Inc. + 0005FD + PacketLight Networks Ltd. - 6CAD3F - Hubbell Building Automation Inc. + 0005E4 + Red Lion Controls Inc. - B01B7C - Ontrol A.S. + 0005F2 + Power R, Inc. - 04C5A4 - Cisco Systems Inc. + 0005F3 + Webyn - BC2846 - NextBIT Computing Pvt Ltd + 000601 + Otanikeiki Co., Ltd. - BC0F2B - Fortune Techgroup Ltd + 000667 + Tripp Lite - 648125 - Alphatron Marine BV + 000660 + NADEX Co., Ltd. - 8CF9C9 - MESADA Technology Ltd - - - C0626B - Cisco Systems Inc. + 00064E + Broad Net Technology Inc. - 94E226 - D. ORtiz Consulting LLC + 00062D + TouchStar Technologies, L.L.C. - D8C99D - EA Display Limited + 00063C + Intrinsyc Software International Inc. - 1083D2 - Microseven Systems LLC + 000630 + Adtranz Sweden - 34684A - Teraworks Ltd + 000637 + Toptrend-Meta Information (ShenZhen) Inc. - CCFC6D - RIZ Transmitters + 0005DF + Electronic Innovation, Inc. - E03E7D - data-Complex GmbH + 0005E0 + Empirix Corp. - 0CC6AC - Dags + 0005D8 + Arescom, Inc. - 042605 - GFR Gesellschaft fur Regelungstechnik und Energieeinsparung mbH + 0005DE + Gi Fone Korea, Inc. - 24F0FF - GHT Ltd + 0005C4 + Telect, Inc. - 9CC0D2 - Conductix-Wampfler GmbH + 000605 + Inncom International, Inc. - CCF67A - Ayecka Communication Systems Ltd + 0005FA + IPOptical, Inc. - 8065E9 - BenQ Corporation + 0005E5 + Renishaw PLC - EC986C - Lufft Mess- und Regeltechnik GmbH + 000623 + MGE UPS Systems France - D093F8 - Stonestreet One LLC + 00060B + Artesyn Embedded Technologies - 9C645E - Harman Consumer Group + 000615 + Kimoto Electric Co., Ltd. - 1C334D - ITS Telecom + 00060A + Blue2space - DCD87F - Shenzhen JoinCyber Telecom Equipment Ltd + 000679 + Konami Corporation - B4E0CD - Fusion-io Inc. + 00066C + Robinson Corporation - 286046 - Lantech Communications Global Inc. + 000666 + Roving Networks - 10E2D5 - Qi Hardware Inc. + 000646 + ShenZhen XunBao Network Technology Co Ltd - 60C980 - Trymus + 00064B + Alexon Co., Ltd. - A036FA - Ettus Research LLC + 000563 + J-Works, Inc. - EC836C - RM Tech Ltd + 000557 + Agile TV Corporation - 303955 - Shenzhen Jinhengjia Electronic Ltd + 000554 + Rangestar Wireless - FC5B24 - Weibel Scientific A/S + 000553 + DVC Company, Inc. - 78593E - RAFI GmbH & Co.KG + 00054B + Eaton Automation AG - 509772 - Westinghouse Digital + 000567 + Etymonic Design, Inc. - 503DE5 - Cisco Systems Inc. + 000565 + Tailyn Communication Company Ltd. - 540496 - Gigawave Ltd + 000566 + Secui.com Corporation - EC4644 - TTK SAS + 00056C + Hung Chang Co., Ltd. - 4CB9C8 - Conet Ltd + 00055F + Cisco Systems, Inc - 8CB64F - Cisco Systems Inc. + 00055D + D-LINK SYSTEMS, INC. - 204AAA - Hanscan Spain S.A. + 000561 + nac Image Technology, Inc. - 20FECD - System In Frontier Inc. + 0005D4 + FutureSmart Networks, Inc. - F0933A - NxtConect + 0005CE + Prolink Microsystems Corporation - B8415F - ASP AG + 000594 + HMS Industrial Networks - 2CB69D - RED Digital Cinema + 00057C + RCO Security AB - 582F42 - Universal Electric Corporation + 000583 + ImageCom Limited - 0474A1 - Aligera Equipamentos Digitais Ltda + 00056F + Innomedia Technologies Pvt. Ltd. - 5C6984 - Nuvico + 000574 + Cisco Systems, Inc - 70DDA1 - Tellabs + 00059E + Zinwell Corporation - 94D019 - Cydle Corp. + 00058E + Flextronics International GmbH & Co. Nfg. KG - 8C278A - Vocollect Inc + 0005C2 + Soronti, Inc. - CC0CDA - Miljovakt AS + 00059D + Daniel Computing Systems, Inc. - E41C4B - V2 Technology Inc. + 0005A4 + Lucid Voice Ltd. - 5CF3FC - IBM Corp + 0005B3 + Asahi-Engineering Co., Ltd. - A86A6F - RIM + 0005A5 + KOTT - 68122D - Special Instrument Development Ltd + 0005A3 + QEI, Inc. - 94F720 - Tianjin Deviser Electronics Instrument Ltd + 000542 + Otari, Inc. - DC9C52 - Sapphire Technology Limited. + 0004F6 + Amphus - 4891F6 - Shenzhen Reach software technology Ltd + 0004F4 + Infinite Electronics Inc. - 649B24 - V Technology Ltd + 0004F1 + WhereNet - 846EB1 - Park Assist LLC + 00051F + Taijin Media Co., Ltd. - 6C504D - Cisco Systems Inc. + 000523 + AVL List GmbH - B8D06F - Guangzhou Hkust FOK Ying Tung Research Institute + 000537 + Nets Technology Co., Ltd. - EC14F6 - BioControl AS + 000532 + Cisco Systems, Inc - E8995A - PiiGAB, Processinformation i Goteborg AB + 000511 + Complementary Technologies Ltd - 401D59 - Biometric Associates, LP + 000506 + Reddo Networks AB - B8FF6F - Shanghai Typrotech Technology Ltd + 00050A + ICS Spa - 1CBD0E - Amplified Engineering Pty Ltd + 0004EC + Memobox SA - A0F217 - GE Medical System(China) Ltd + 0004E4 + Daeryung Ind., Inc. - F0A764 - GST Ltd + 00050C + Network Photonics, Inc. - 1C0656 - IDY Corporation + 0004E2 + SMC Networks, Inc. - 500E6D - TrafficCast International + 000536 + Danam Communications, Inc. - EC3BF0 - NovelSat + 000526 + IPAS GmbH - 4CEDDE - Askey Computer Corp + 00042F + International Communications Products, Inc. - E8E08F - Gravotech Marking SAS + 000429 + Pixord Corporation - ACAB8D - Lyngso Marine A/S + 000426 + Autosys - 6083B2 - GkWare e.K. + 000421 + Ocular Networks - 80D019 - Embed Inc. + 000424 + TMC s.r.l. - 68EBC5 - Angstrem Telecom + 00041D + Corega of America - A0B5DA - HongKong THTF Ltd + 00041A + Ines Test and Measurement GmbH & CoKG - 8886A0 - Simton Technologies Ltd + 00041E + Shikoku Instrumentation Co., Ltd. - A45055 - Busware.DE + 000467 + Wuhan Research Institute of MII - A89B10 - inMotion Ltd + 00045A + The Linksys Group, Inc. - B41489 - Cisco Systems Inc. + 000463 + Bosch Security Systems - A4A80F - Shenzhen Coship Electronics Ltd + 00045C + Mobiwave Pte Ltd - F8B599 - Guangzhou CHNAVS Digital Technology Ltd + 000451 + Medrad, Inc. - B8921D - BG T&A + 000453 + YottaYotta, Inc. - D08999 - APCON Inc. + 000450 + DMD Computers SRL - C88447 - Beautiful Enterprise Ltd + 000443 + Agilent Technologies, Inc. - 54FDBF - Scheidt & Bachmann GmbH + 000449 + Mapletree Networks - D0BB80 - SHL Telemedicine International Ltd + 0004CB + Tdsoft Communication, Ltd. - 5C17D3 - LGE + 0004CC + Peek Traffic B.V. - 1CDF0F - Cisco Systems Inc. + 0004C8 + LIBA Maschinenfabrik GmbH - 68BDAB - Cisco Systems Inc. + 0004BF + VersaLogic Corp. - 9CADEF - Obihai Technology Inc. + 0004C3 + CASTOR Informatique - C88B47 - Nolangroup S.P.A Con Socio Unico + 0004B1 + Signal Technology, Inc. - C4CD45 - Beijing Boomsense Technology Ltd + 000483 + Deltron Technology, Inc. - 8CE7B3 - Sonardyne International Ltd + 000482 + Medialogic Corp. - 088DC8 - Ryowa Electronics Ltd + 000415 + Rasteme Systems Co., Ltd. - 80C6CA - Endian s.r.l. + 000441 + Half Dome Systems, Inc. - 7076F0 - LevelOne Communications (India) Private Limited + 0004B5 + Equitrac Corporation - C02BFC - iNES. applied Informatics GmbH + 0003C7 + hopf Elektronik GmbH - 94C7AF - Raylios Technology + 0003C2 + Solphone K.K. - D81C14 - Compacta International Ltd + 0003C6 + ICUE Systems, Inc. - 008C10 - Black Box Corp. + 0003BB + Signal Communications Limited - 90903C - Trison Technology Corporation + 0003BE + Netility - E061B2 - Hangzhou Zenointel Technology Ltd + 000403 + Nexsi Corporation - 9411DA - ITF Froschl GmbH + 000406 + Fa. Metabox AG - 8039E5 - Patlite Corporation + 0003F8 + SanCastle Technologies, Inc. - DC7B94 - Cisco Systems Inc. + 0003FA + TiMetra Networks - 5CCA32 - Theben AG + 0003FB + ENEGATE Co.,Ltd. - 7415E2 - Tri-Sen Systems Corporation + 0003F6 + Allegro Networks, Inc. - ECC38A - Accuenergy (CANADA) Inc + 000397 + FireBrick Limited - D48FAA - Sogecam Industrial, S.A. + 000398 + WISI - B081D8 - I-Sys Corp + 00039E + Tera System Co., Ltd. - 14FEAF - Sagittar Limited + 000392 + Hyundai Teletek Co., Ltd. - B0B8D5 - Nanjing Nengrui Auto Equipment Ltd + 000395 + California Amplifier - 94E711 - Xirka Dama Persada PT + 0003E5 + Hermstedt SG - 6C9B02 - Nokia Corporation + 0003E8 + Wavesight Limited - 641E81 - Dowslake Microsystems + 0003DF + Desana Systems - EC542E - Shanghai XiMei Electronic Technology Ltd + 0003DA + Takamisawa Cybernetics Co., Ltd. - FCD4F6 - Messana Air.Ray Conditioning s.r.l. + 0003D9 + Secheron SA - D466A8 - Riedo Networks Ltd + 0003F3 + Dazzle Multimedia, Inc. - F0E5C3 - Dragerwerk AG & Co. KG aA + 0003EC + ICG Research, Inc. - D82986 - Best Wish Technology Ltd + 0003E9 + Akara Canada, Inc. - 446132 - ecobee Inc + 0003B4 + Macrotek International Corp. - F41F0B - YAMABISHI Corporation + 0003A6 + Traxit Technology, Inc. - A082C7 - P.T.I Ltd + 0003A4 + Imation Corp. - 043604 - Gyeyoung I&T + 0003AB + Bridge Information Systems - A4B2A7 - Adaxys Solutions AG + 0003CB + SystemGear Co., Ltd. - D0D0FD - Cisco Systems Inc. + 00037C + Coax Media - E05B70 - Innovid Ltd + 00037F + Atheros Communications, Inc. - 141BBD - Volex Inc. + 0002F0 + AME Optimedia Technology Co., Ltd. - E87AF3 - S5 Tech S.r.l. + 00038E + Atoga Systems, Inc. - CC5C75 - Weightech Com. Imp. Exp. Equip. Pesagem Ltda + 00030D + Uniwill Computer Corp. - 1C6F65 - Giga-Byte Technology Ltd + 000309 + Texcel Technology PLC - 90E0F0 - IEEE 1722a Working Group + 000303 + JAMA Electronics Co., Ltd. - 40520D - Pico Technology + 000305 + MSC Vertriebs GmbH - 807D1B - Neosystem Ltd + 0002FE + Viditec, Inc. - 18B209 - Torrey Pines Logic Inc. + 00019F + ReadyNet - D84B2A - Cognitas Technologies Inc. + 0002FF + Handan BroadInfoCom - 684B88 - Galtronics Telemetry Inc. + 000321 + Reco Research Co., Ltd. - 98FC11 - Cisco-Linksys LLC + 000316 + Nobell Communications, Inc. - 34E0D7 - Dongguan Qisheng Electronics Industrial Ltd + 00030F + Digital China (Shanghai) Networks Ltd. - D84606 - Silicon Valley Global Marketing + 000311 + Micro Technology Co., Ltd. - F8AC6D - Deltenna Ltd + 000327 + HMS Industrial Networks - F450EB - Telechips Inc + 00032E + Scope Information Management, Ltd. - 988EDD - TE Connectivity Limerick + 000329 + F3, Inc. - A4AE9A - Maestro Wireless Solutions Ltd + 00031A + Beijing Broad Telecom Ltd., China - C848F5 - MEDISON Xray Ltd + 00035B + BridgeWave Communications - 78A714 - Amphenol + 000357 + Intervoice-Brite, Inc. - F893F3 - Volans + 000345 + Routrek Networks Corporation - 7866AE - ZTEC Instruments Inc. + 0002E9 + CS Systemes De Securite - C3S - 4C022E - CMR Korea Ltd + 0002E5 + Timeware Ltd. - 34AAEE - Mikrovisatos Servisas UAB + 0002E0 + ETAS GmbH - 44D63D - Talari Networks + 00033F + BigBand Networks, Ltd. - 78A2A0 - Nintendo Ltd + 000368 + Embedone Co., Ltd. - 48FCB8 - Woodstream Corporation + 0002F5 + VIVE Synergies, Inc. - D4000D - Phoenix Broadband Technologies LLC. + 0002B7 + Watanabe Electric Industry Co., Ltd. - AC5135 - MPI Tech + 0002AF + TeleCruz Technology, Inc. - 74B9EB - JinQianMao Technology Ltd + 0002A8 + Air Link Technology - D45297 - nSTREAMS Technologies Inc. + 0002AB + CTC Union Technologies Co., Ltd. - 1880CE - Barberry Solutions Ltd + 0002A4 + AddPac Technology Co., Ltd. - 24B6B8 - Friem SPA + 0002A3 + Hitachi Energy Switzerland Ltd - A4561B - MCOT Corporation + 0002A0 + Flatstack Ltd. - 80C63F - Remec Broadband Wireless LLC + 0002C8 + Technocom Communications Technology (pte) Ltd - 40D40E - Biodata Ltd + 0002B8 + WHI KONSULT AB - 0C826A - Wuhan Huagong Genuine Optics Technology Ltd + 0002BB + Continuous Computing Corp - E0271A - TTC Next-generation Home Network System WG + 0002BC + LVL 7 Systems, Inc. - 0097FF - Heimann Sensor GmbH + 0002A9 + RACOM, s.r.o. - E4AB46 - UAB Selteka + 0002B2 + Cablevision - 945B7E - Trilobit Ltda. + 00025B + Cambridge Silicon Radio - 04E548 - Cohda Wireless Pty Ltd + 000256 + Alpha Processor, Inc. - 7071BC - Pegatron Corporation + 000259 + Tsann Kuen China (Shanghai)Enterprise Co., Ltd. IT Group - 7884EE - Indra Espacio S.A. + 000251 + Soma Networks, Inc. - 7C051E - Rafael Ltd + 00026A + Cocess Telecom Co., Ltd. - 10090C - Janome Sewing Machine Ltd + 00026C + Philips CFT - E01CEE - Bravo Tech Inc. + 000262 + Soyo Group Soyo Com Tech Co., Ltd - 2893FE - Cisco Systems Inc. + 000265 + Virditech Co. Ltd. - 781185 - NBS Payment Solutions Inc. + 00028A + Ambit Microsystems Corporation - D05875 - Active Control Technology Inc. + 0001FA + HOROSCAS - C8EF2E - Beijing Gefei Tech Ltd + 000282 + ViaClix, Inc. - 08F6F8 - GET Engineering + 000285 + Riverstone Networks - 3C4C69 - Infinity System S.L. + 000294 + Tokyo Sokushin Co., Ltd. - 7830E1 - UltraClenz LLC + 000296 + Lectron Co,. Ltd. - B09134 - Taleo + 00028E + Rapid 5 Networks, Inc. - A4C2AB - Hangzhou LEAD-IT Information & Technology Ltd + 000279 + Control Applications, Ltd. - 48AA5D - Store Electronic Systems + 00024F + IPM Datacom S.R.L. - 042F56 - ATOCS (Shenzhen) Ltd + 0002D5 + ACR - E85E53 - Infratec Datentechnik GmbH + 0002CE + FoxJet, Inc. - 88BA7F - Qfiednet Ltd + 0002C3 + Arelnet Ltd. - 64DB18 - OpenPattern + 00023C + Creative Technology, Ltd. - 90A2DA - Gheo SA + 00022C + ABB Bomem, Inc. - 9889ED - Anadem Information Inc. + 0001FF + Data Direct Networks, Inc. - D81BFE - Twinlinx Corporation + 0001FC + Keyence Corporation - FC4463 - Universal Audio Inc. + 0001FD + Digital Voice Systems, Inc. - 102D96 - Looxcie Inc. + 0001EE + Comtrol Europe, Ltd. - 5C35DA - There Corporation Oy + 0001F0 + Tridium, Inc. - A06986 - Wellav Technologies Ltd + 0001F1 + Innovative Concepts, Inc. - EC8EAD - DLX + 0001E2 + Ando Electric Corporation - 34C69A - Enecsys Ltd + 00022F + P-Cube, Ltd. - D8AE90 - Itibia Technologies + 000227 + ESD Electronic System Design GmbH - B8653B - Bolymin Inc. + 00021D + Data General Communication Ltd. - 38E8DF - b GmbH medien + datenbanken + 000219 + Paralon Technologies - 1C129D - IEEE PES Psrc/SUB + 0001DA + WINCOMM Corporation - E0CA4D - Shenzhen Unistar Communication Ltd + 0001D2 + inXtron, Inc. - 0CC9C6 - Samwin Hong Kong Limited + 0001C6 + Quarry Technologies - 1062C9 - Adatis GmbH & Co. KG + 000210 + Fenecom - 60B3C4 - Elber Srl + 00020B + Native Networks, Inc. - 04C880 - Samtec Inc + 000218 + Advanced Scientific Corp - F88DEF - Tenebraex + 000203 + Woonsang Telecom, Inc. - 042234 - Wireless Standard Extensions + 0001F5 + ERIM S.A. - F0B6EB - Poslab Technology Ltd + 0001CE + Custom Micro Products, Ltd. - 80C862 - Openpeak Inc. + 0001BB + Frequentis - 1C8F8A - Phase Motion Control SpA + 0001BC + Brains Corporation - FCCCE4 - Ascon Ltd + 0001C0 + CompuLab, Ltd. - 5850E6 - Best Buy Corporation + 0001A0 + Infinilink Corporation - 3C1CBE - Jadak LLC + 000196 + Cisco Systems, Inc - BCD5B6 - d2d technologies + 00017C + AG-E GmbH - FC683E - Directed Perception Inc. + 0001D3 + PAXCOMM, Inc. - 28E794 - Microtime Computer Inc. + 0001E1 + Kinpo Electronics, Inc. - 0CD502 - Westell Technologies Inc. + 000199 + HeiSei Electronics - 70828E - OleumTech Corporation + 000110 + Gotham Networks - A438FC - Plastic Logic + 000112 + Shark Multimedia Inc. - 18FC9F - Changhe Electronics Ltd + 000116 + Netspect Technologies, Inc. - 94592D - EKE Building Technology Systems Ltd + 000108 + AVLAB Technology, Inc. - CC69B0 - Global Traffic Technologies LLC + 00306C + Hitex Holding GmbH - A0593A - V.D.S. Video Display Systems srl + 00308B + Brix Networks - CCEA1C - DCONWORKS Ltd + 000177 + EDSL - 7C08D9 - Shanghai B-Star Technology Co + 00014D + Shin Kin Enterprises Co., Ltd - 2059A0 - Paragon Technologies Inc. + 000174 + CyberOptics Corporation - 38E98C - Reco S.p.A. + 00015E + BEST TECHNOLOGY CO., LTD. - A0BFA5 - Coresys + 000161 + Meta Machine Technology - B05B1F - Thermo Fisher Scientific S.P.A. + 000155 + Promise Technology, Inc. - 24D2CC - SmartDrive Systems Inc. + 0001A1 + Mag-Tek, Inc. - 0CEF7C - AnaCom Inc + 000186 + Uwe Disch - ECE9F8 - Guang Zhou TRI-SUN Electronics Technology Ltd + 0001A6 + Scientific-Atlanta Arcodan A/S - 34CE94 - Parsec (Pty) Ltd + 000172 + TechnoLand Co., LTD. - 34EF8B - NTT Communications Corporation + 00012E + PC Partner Ltd. - 687F74 - Cisco-Linksys LLC + 00013E + Ascom Tateco AB - D0D286 - Beckman Coulter K.K. + 000132 + Dranetz - BMI - C4198B - Dominion Voting Systems Corporation + 00013B + BNA SYSTEMS - C83A35 - Tenda Technology Ltd + 00019D + E-Control Systems, Inc. - 6C8CDB - Otus Technologies Ltd + 00018B + NetLinks Co., Ltd. - 40F52E - Leica Microsystems (Schweiz) AG + 00018D + AudeSi Technologies - E4FFDD - Electron India + 000113 + OLYMPUS CORPORATION - 68A1B7 - Honghao Mingchuan Technology (Beijing) Ltd + 000134 + Selectron Systems AG - 0CD7C2 - Axium Technologies Inc. + 00011E + Precidia Technologies, Inc. - E84ECE - Nintendo Ltd + 00016E + Conklin Corporation - 1045F8 - LNT-Automation GmbH + 003032 + MagicRam, Inc. - DCE71C - AUG Elektronik GmbH + 0030EA + TeraForce Technology Corporation - A870A5 - UniComm Inc. + 003069 + IMPACCT TECHNOLOGY CORP. - F8472D - X2gen Digital Corp Ltd + 0030C3 + FLUECKIGER ELEKTRONIK AG - 08184C - A. S. Thomas Inc. + 00305A + TELGEN CORPORATION - 10880F - Daruma Telecomunicacoes e Informatica S.A. + 00309B + Smartware - FC6198 - NEC Personal Products Ltd + 003045 + Village Networks, Inc. (VNI) - 74D850 - Evrisko Systems + 0030E5 + Amper Datos S.A. - 54B620 - SUHDOL E&C Ltd + 003094 + Cisco Systems, Inc - 78C40E - H&D Wireless + 003040 + Cisco Systems, Inc - 2C0623 - Win Leader Inc. + 00308A + NICOTRA SISTEMI S.P.A - 0C2755 - Valuable Techologies Limited + 00062B + INTRASERVER TECHNOLOGY - 78998F - Mediline Italia SRL + 000100 + EQUIP'TRANS - 40ECF8 - Siemens AG + 00B09D + Point Grey Research Inc. - BCB181 - Sharp Corporation + 00B06D + Jones Futurex Inc. - C8873B - Net Optics + 00B094 + Alaris, Inc. - A8CE90 - CVC + 003072 + Intellibyte Inc. - E41F13 - IBM Corp + 003006 + SUPERPOWER COMPUTER - 701AED - Advas Ltd + 003038 + XCP, INC. - 6465C0 - Nuvon Inc. + 003079 + CQOS, INC. - 7C1EB3 - 2N TELEKOMUNIKACE a.s. + 0030F0 + Uniform Industrial Corp. - 4456B7 - Spawn Labs Inc. + 0030C9 + LuxN, N - 44C9A2 - Greenwald Industries + 00300C + CONGRUENCY, LTD. - 906DC8 - DLG Automacao Industrial Ltda + 00304C + APPIAN COMMUNICATIONS, INC. - 584CEE - Digital One Technologies, Limited + 0030E8 + ENSIM CORP. - 002721 - Shenzhen Baoan Fenda Industrial Ltd + 003028 + FASE Saldatura srl - A07332 - Cashmaster International Limited + 0030D9 + DATACORE SOFTWARE CORP. - 64C6AF - AXERRA Networks Ltd + 003026 + HeiTel Digital Video GmbH - 44568D - PNC Technologies Ltd + 003047 + NISSEI ELECTRIC CO., LTD. - 406186 - Micro-Star International + 003077 + ONPREM NETWORKS - 0026F5 - XRPLUS Inc. + 0030D4 + AAE Systems, Inc. - 0026F8 - Golden Highway Industry Development Ltd + 003010 + VISIONETICS INTERNATIONAL - 0026F4 - Nesslab + 003017 + BlueArc UK Ltd - 0026EE - TKM GmbH + 0030F7 + RAMIX INC. - 0026EF - Technology Advancement Group Inc. + 00D0D7 + B2C2, INC. - 0026B2 - Setrix GmbH + 00D073 + ACN ADVANCED COMMUNICATIONS - 0026AF - Duelco A/S + 00D057 + ULTRAK, INC. - 0026B3 - Thales Communications Inc + 00D0E5 + SOLIDUM SYSTEMS CORP. - 0026A7 - Connect SRL + 00D0D3 + Cisco Systems, Inc - 0026A4 - Novus Produtos Eletronicos Ltda + 00D017 + SYNTECH INFORMATION CO., LTD. - 0026D8 - Magic Point Inc. + 00D036 + TECHNOLOGY ATLANTA CORP. - 0026D6 - Ningbo Andy Optoelectronic Ltd + 0030AB + DELTA NETWORKS, INC. - 00270F - Envisionnovation Inc + 003049 + BRYANT TECHNOLOGY, LTD. - 00270A - IEE S.A. + 00306D + LUCENT TECHNOLOGIES - 002709 - Nintendo Ltd + 00D045 + KVASER AB - 0026D3 - Zeno Information System + 00D004 + PENTACOM LTD. - 0026D1 - S Squared Innovations Inc. + 00D005 + ZHS ZEITMANAGEMENTSYSTEME - 0026CB - Cisco Systems Inc. + 003080 + Cisco Systems, Inc - 002701 - IncOstartec GmbH + 003081 + ALTOS C&C - 0026FB - AirDio Wireless Inc. + 0030D0 + Tellabs - 00271A - Geenovo Technology Ltd + 003014 + DIVIO, INC. - 002714 - Grainmustards Ltd + 00301C + ALTVATER AIRDATA SYSTEMS - 002715 - Rebound Telecom Ltd + 00D01E + PINGTEL CORP. - 0026E6 - Visionhitech Ltd + 00D065 + TOKO ELECTRIC - 0026DF - TaiDoc Technology Corp. + 00D014 + ROOT, INC. - 00266A - Essensium NV + 00D0CA + Intrinsyc Software International Inc. - 00266B - Shine Union Enterprise Limited + 00D023 + INFORTREND TECHNOLOGY, INC. - 002667 - Carecom Ltd + 00D0A2 + INTEGRATED DEVICE - 0026A2 - Instrumentation Technology Systems + 00D010 + CONVERGENT NETWORKS, INC. - 00269F - Private + 00D04B + LA CIE GROUP S.A. - 002699 - Cisco Systems Inc. + 00D00E + PLURIS, INC. - 002647 - WFE Technology Corp. + 00D012 + GATEWORKS CORP. - 002640 - Baustem Broadband Technologies Ltd + 00D04D + DIV OF RESEARCH & STATISTICS - 002653 - DaySequerra Corporation + 00D02E + COMMUNICATION AUTOMATION CORP. - 00267B - GSI Helmholtzzentrum fur Schwerionenforschung GmbH + 00D0C5 + COMPUTATIONAL SYSTEMS, INC. - 002687 - Corega K.K + 00D046 + DOLBY LABORATORIES, INC. - 00268D - CellTel S.p.A. + 00D0DE + PHILIPS MULTIMEDIA NETWORK - 002628 - Companytec automacao e Controle Ltda. + 00D00C + SNIJDER MICRO SYSTEMS - 00261F - SAE Magnetics (H.K.) Ltd + 00D0DA + TAICOM DATA SYSTEMS CO., LTD. - 00261E - Qingbang Elec(SZ) Ltd + 00D03C + Vieo, Inc. - 002619 - FRC + 00D09A + FILANET CORPORATION - 0025EA - Iphion BV + 00D0AE + ORESIS COMMUNICATIONS, INC. - 0025F0 - Suga Electronics Limited + 00D0F2 + MONTEREY NETWORKS - 0025E8 - Idaho Technology + 00D0A8 + NETWORK ENGINES, INC. - 0025E4 - OMNI-WiFi LLC + 00D0B4 + KATSUJIMA CO., LTD. - 0025FC - Enda Endustriyel Elektronik Ltd STI. + 00D086 + FOVEON, INC. - 0025FA - J&M Analytik AG + 00D0E8 + MAC SYSTEM CO., LTD. - 002633 - MIR - Medical International Research + 00D06B + SR TELECOM INC. - 0025D7 - Cedo + 00D0DC + MODULAR MINING SYSTEMS, INC. - 0025D8 - Korea Maintenance + 00D026 + HIRSCHMANN AUSTRIA GMBH - 0025D2 - InpegVision Ltd + 00D0F0 + CONVISION TECHNOLOGY GMBH - 002630 - Acorel S.A.S + 00D0E3 + ELE-CHEM ENGINEERING CO., LTD. - 00262A - Proxense LLC + 00D0C4 + TERATECH CORPORATION - 0025FE - Pilot Electronics Corporation + 00D061 + TREMON ENTERPRISES CO., LTD. - 00257B - STJ Electronics PVT Ltd + 00D0AB + DELTAKABEL TELECOM CV - 00257C - Huachentel Technology Development Ltd + 00D01D + FURUNO ELECTRIC CO., LTD. - 002575 - FiberPlex Technologies LLC + 00D0A7 + TOKYO SOKKI KENKYUJO CO., LTD. - 002570 - Eastern Communications Company Limited + 005076 + IBM Corp - 00259B - Beijing PKUNITY Microsystems Technology Ltd + 0050D4 + JOOHONG INFORMATION & - 002596 - GIGAVISION srl + 0050A6 + OPTRONICS - 002595 - Northwest Signal Supply Inc. + 0050DB + CONTEMPORARY CONTROL - 0025C9 - Shenzhen Huapu Digital Ltd + 00507C + VIDEOCON AG - 00258F - Trident Microsystems Inc. + 005047 + Private - 002589 - Hills Industries Limited + 005084 + Quantum Corp. - 002585 - KOKUYO S&T Ltd + 0050A9 + MOLDAT WIRELESS TECHNOLGIES - 002581 - x-star networks Inc. + 00509B + SWITCHCORE AB - 0025B5 - Cisco Systems Inc. + 00507E + NEWER TECHNOLOGY - 0025BE - Tektrap Systems Inc. + 0050CE + LG INTERNATIONAL CORP. - 0025A0 - Nintendo Ltd + 0050F7 + VENTURE MANUFACTURING (SINGAPORE) LTD. - 00254D - Singapore Technologies Electronics Limited + 005019 + SPRING TIDE NETWORKS, INC. - 00254C - Videon Central Inc. + 00501B + ABL CANADA, INC. - 002543 - Moneytech + 0050DC + TAS TELEFONBAU A. SCHWABE GMBH & CO. KG - 00255B - CoachComm LLC + 005008 + TIVA MICROCOMPUTER CORP. (TMC) - 002516 - Integrated Design Tools Inc. + 00501F + MRG SYSTEMS, LTD. - 002510 - Pico-Tesla Magnetic Therapies + 0050FD + VISIONCOMM CO., LTD. - 00256A - inIT - Institut Industrial IT + 0050BF + Metalligence Technology Corp. - 002562 - interbro Ltd + 005036 + NETCAM, LTD. - 002520 - SMA Railway Technology GmbH + 005083 + GILBARCO, INC. - 002527 - Bitrode Corp. + 00D06C + SHAREWAVE, INC. - 002525 - CTERA Networks Ltd + 00D0EE + DICTAPHONE CORPORATION - 002551 - SE-Elektronic GmbH + 00504C + Galil Motion Control - 00253A - CEVA Ltd + 00D034 + ORMEC SYSTEMS CORP. - 0024A2 - Hong Kong Middleware Technology Limited + 00D08A + PHOTRON USA - 0024B9 - Wuhan Higheasy Electronic Technology Development Ltd + 0050A7 + Cisco Systems, Inc - 0024BD - Hainzl Industriesysteme GmbH + 005043 + MARVELL SEMICONDUCTOR, INC. - 0024B6 - Seagate Technology + 0050FA + OXTEL, LTD. - 0024F7 - Cisco Systems Inc. + 005055 + DOMS A/S - 0024E5 - Seer Technology Inc. + 005072 + CORVIS CORPORATION - 0024E2 - Hasegawa Electric Ltd + 0090EF + INTEGRIX, INC. - 0024E0 - DS Tech LLC + 0090C5 + INTERNET MAGIC, INC. - 0024F3 - Nintendo Ltd + 00908C + ETREND ELECTRONICS, INC. - 002501 - JSC Supertel + 009048 + ZEAL CORPORATION - 0024C8 - Broadband Solutions Group + 009007 + DOMEX TECHNOLOGY CORP. - 0024C5 - Meridian Audio Limited + 00902D + DATA ELECTRONICS (AUST.) PTY, LTD. - 002496 - Ginzinger electronic Systems + 005016 + Molex Canada Ltd - 002499 - Aquila Technologies + 005052 + TIARA NETWORKS, INC. - 00248A - Kaga Electronics Ltd + 005064 + CAE ELECTRONICS - 002435 - Wide Corporation + 00903D + BIOPAC SYSTEMS, INC. - 002431 - Uni-v Ltd + 009057 + AANetcom, Inc. - 002432 - Neostar Technology Ltd + 009083 + TURBO COMMUNICATION, INC. - 002443 - Nortel Networks + 0090D7 + NetBoost Corp. - 002441 - Wanzl Metallwarenfabrik GmbH + 005027 + GENICOM CORPORATION - 00243B - CSSI (S) Pte Ltd + 00505A + NETWORK ALCHEMY, INC. - 002451 - Cisco Systems Inc. + 005039 + MARINER NETWORKS - 00244A - Voyant International + 005095 + PERACOM NETWORKS - 002447 - Kaztek Systems + 0090B9 + BERAN INSTRUMENTS LTD. - 002477 - Tibbo Technology + 0090A5 + SPECTRA LOGIC - 00246E - Phihong USA Corp. + 0090A3 + Corecess Inc. - 00245D - Terberg besturingstechniek B.V. + 00901F + ADTEC PRODUCTIONS, INC. - 002450 - Cisco Systems Inc. + 009038 + FOUNTAIN TECHNOLOGIES, INC. - 002458 - PA Bastion CC + 0090B0 + VADEM - 002473 - 3Com Europe Ltd + 00505B + KAWASAKI LSI U.S.A., INC. - 00246B - Covia Inc. + 0050CC + Seagate Cloud Systems Inc - 0023F5 - Wilo SE + 0090D4 + BindView Development Corp. - 0023FF - Beijing HTTC Technology Ltd + 0090C4 + JAVELIN SYSTEMS, INC. - 0023F6 - Softwell Technology Ltd + 0050B8 + INOVA COMPUTERS GMBH & CO. KG - 0023F3 - Glocom Inc. + 0090B6 + FIBEX SYSTEMS - 0023F0 - Shanghai Jinghan Weighing Apparatus Ltd + 009063 + COHERENT COMMUNICATIONS SYSTEMS CORPORATION - 002410 - NUETEQ Technology,Inc. + 009062 + ICP VORTEX COMPUTERSYSTEME GmbH - 002408 - Pacific Biosciences + 0090C3 + TOPIC SEMICONDUCTOR CORP. - 002430 - Ruby Tech Corp. + 00905A + DEARBORN GROUP, INC. - 00242E - Datastrip Inc. + 0090EC + PYRESCOM - 00241D - Giga-Byte Technology Ltd + 0010FB + ZIDA TECHNOLOGIES LIMITED - 00241A - Red Beetle Inc. + 001053 + COMPUTER TECHNOLOGY CORP. - 002414 - Cisco Systems Inc. + 0010ED + SUNDANCE TECHNOLOGY, INC. - 00240C - DELEC GmbH + 00109D + CLARINET SYSTEMS, INC. - 0023F9 - Double-Take Software Inc. + 00100E + MICRO LINEAR COPORATION - 0023E9 - F5 Networks Inc. + 009095 + UNIVERSAL AVIONICS - 0023EA - Cisco Systems Inc. + 009041 + APPLIED DIGITAL ACCESS - 0023E5 - IPaXiom Networks + 009024 + PIPELINKS, INC. - 0023B6 - Securite Communications / Honeywell + 00903A + NIHON MEDIA TOOL INC. - 0023B8 - Sichuan Jiuzhou Electronic Technology Ltd + 0090B2 + AVICI SYSTEMS INC. - 0023BA - Chroma + 009082 + FORCE INSTITUTE - 0023BC - EQ-Sys GmbH + 009000 + DIAMOND MULTIMEDIA - 0023B1 - Longcheer Technology (Singapore) Pte Ltd + 009054 + INNOVATIVE SEMICONDUCTORS, INC - 002396 - Andes Technology Corporation + 00906E + PRAXON, INC. - 002394 - Samjeon + 0090F6 + ESCALATE NETWORKS, INC. - 002377 - Isotek Electronics Ltd + 0090A8 + NineTiles Networks, Ltd. - 002371 - SOAM Systel + 009015 + CENTIGRAM COMMUNICATIONS CORP. - 0023A1 - Trend Electronics Ltd + 009029 + CRYPTO AG - 0023A6 - E-Mon + 00900B + LANNER ELECTRONICS, INC. - 0023A8 - Marshall Electronics + 009061 + PACIFIC RESEARCH & ENGINEERING CORPORATION - 00239A - EasyData Hardware GmbH + 009011 + WAVTrace, Inc. - 0023CC - Nintendo Ltd + 009065 + FINISAR CORPORATION - 002379 - Union Business Machines Ltd + 0010D3 + GRIPS ELECTRONIC GMBH - 00238C - Private + 0090C0 + K.J. LAW ENGINEERS, INC. - 0023C0 - Broadway Networks + 0090CE + avateramedical Mechatronics GmbH - 002358 - Systel SA + 0090DF + MITSUBISHI CHEMICAL AMERICA, INC. - 002356 - Packet Forensics LLC + 0010C8 + COMMUNICATIONS ELECTRONICS SECURITY GROUP - 002350 - RDC Inc. dba LynTec + 001086 + ATTO Technology, Inc. - 00234F - Luminous Power Technologies Pvt Ltd + 0010F3 + Nexcom International Co., Ltd. - 00234B - Inyuan Technology Inc. + 0010DF + RISE COMPUTER INC. - 002349 - Helmholtz Centre Berlin for Material and Energy + 001072 + GVN TECHNOLOGIES, INC. - 002346 - Vestac + 0010DA + Kollmorgen Corp - 002307 - Future Innovation Tech Ltd + 0010E4 + NSI CORPORATION - 002305 - Cisco Systems Inc. + 001088 + AMERICAN NETWORKS INC. - 0022FF - Nivis LLC + 00107E + BACHMANN ELECTRONIC GmbH - 002344 - Objective Interface Systems Inc. + 0010A0 + INNOVEX TECHNOLOGIES, INC. - 00233C - Alflex + 001016 + T.SQWARE - 002333 - Cisco Systems Inc. + 001090 + CIMETRICS, INC. - 00232E - Kedah Electronics Engineering LLC + 0010F5 + AMHERST SYSTEMS, INC. - 002320 - Nicira Networks + 00103D + PHASECOM, LTD. - 002364 - Power Instruments Pte Ltd + 0010EA + ADEPT TECHNOLOGY - 002317 - Lasercraft Inc + 001022 + SatCom Media Corporation - 00230E - Gorba AG + 001096 + TRACEWELL SYSTEMS, INC. - 002362 - Goldline Controls + 001082 + JNA TELECOMMUNICATIONS LIMITED - 00235E - Cisco Systems Inc. + 001098 + STARNET TECHNOLOGIES, INC. - 002322 - KISS Teknical Solutions Inc. + 001068 + COMOS TELECOM - 0022B6 - Superflow Technologies Group + 00103F + TOLLGRADE COMMUNICATIONS, INC. - 0022B5 - Novita + 0010CD + INTERFACE CONCEPT - 0022B2 - 4RF Communications Ltd + 001056 + SODICK CO., LTD. - 0022AC - Hangzhou Siyuan Tech Ltd + 001061 + HOSTLINK CORP. - 0022AD - Telesis Technologies Inc. + 001099 + InnoMedia, Inc. - 0022AE - Mattel Inc. + 001042 + Alacritech, Inc. - 0022D5 - Eaton Corp. Electrical Group Data Center Solutions - Pulizzi + 0010E1 + S.I. TECH, INC. - 0022D1 - Albrecht Jung GmbH & Co. KG + 0010BB + DATA & INFORMATION TECHNOLOGY - 0022D2 - All Earth Comercio de Eletronicos LtdA. + 001020 + Hand Held Products Inc - 0022C2 - Proview Eletronica do Brasil LtdA + 00103A + DIAMOND NETWORK TECH - 0022BD - Cisco Systems Inc. + 001004 + THE BRANTLEY COILE COMPANY,INC - 0022BA - HUTH Elektronik Systeme GmbH + 0010EF + DBTEL INCORPORATED - 0022BB - beyerdynamic GmbH & Co. KG + 001076 + EUREM GmbH - 0022A3 - California Eastern Laboratories + 0010AE + SHINKO ELECTRIC INDUSTRIES CO. - 002302 - Cobalt Digital Inc. + 0010C4 + MEDIA GLOBAL LINKS CO., LTD. - 0022F5 - Advanced Realtime Tracking GmbH + 0010FE + DIGITAL EQUIPMENT CORPORATION - 0022CA - Anviz Biometric Tech Ltd + 00106C + EDNT GmbH - 0022C7 - SEGGER Microcontroller GmbH & Co. KG + 0010E9 + RAIDTEC LTD. - 0022C1 - Active Storage Inc. + 001003 + IMATRON, INC. - 00228F - Cnrs + 001071 + ADVANET INC. - 002297 - XMOS Semiconductor + 00102A + ZF MICROSYSTEMS, INC. - 002292 - Cinetal + 0010E5 + SOLECTRON TEXAS - 0022E5 - Fisher-Rosemount Systems Inc. + 0010F7 + IRIICHI TECHNOLOGIES Inc. - 0022E4 - Apass Technology Ltd + 0010AB + KOITO ELECTRIC INDUSTRIES, LTD. - 00224F - Byzoro Networks Ltd + 001010 + INITIO CORPORATION - 002251 - Lumasense Technologies + 0010F2 + ANTEC - 00225E - Uwin Technologies Ltd + 00E007 + Avaya ECS Ltd - 002258 - Taiyo Yuden Ltd + 0010BE + MARCH NETWORKS CORPORATION - 00225B - Teradici Corporation + 0010AF + TAC SYSTEMS, INC. - 002259 - Guangzhou New Postcom Equipment Ltd + 00108C + Fujitsu Services Ltd - 002253 - Entorian Technologies + 001058 + ArrowPoint Communications - 00222C - Ceton Corp + 00100F + INDUSTRIAL CPU SYSTEMS - 00222D - SMC Networks Inc. + 0010BC + Aastra Telecom - 00222A - SoundEar A/S + 001049 + ShoreTel, Inc - 00227E - Chengdu 30Kaitian Communication Industry Ltd + 00105E + Spirent plc, Service Assurance Broadband - 00227C - Woori SMT Ltd + 00E0BF + TORRENT NETWORKING TECHNOLOGIES CORP. - 002277 - NEC Australia Pty Ltd + 00E0E3 + SK-ELEKTRONIK GMBH - 00223D - JumpGen Systems LLC + 00E0C6 + LINK2IT, L.L.C. - 002239 - Indiana Life Sciences Incorporated + 00E0E5 + CINCO NETWORKS, INC. - 002235 - Strukton Systems bv + 00E061 + EdgePoint Networks, Inc. - 002279 - Nippon Conlux Ltd + 00E0B8 + GATEWAY 2000 - 002271 - Jager Computergesteuerte Messtechnik GmbH. + 00E07C + METTLER-TOLEDO, INC. - 002247 - DAC Engineering Ltd + 00E026 + Redlake MASD LLC - 00221F - eSang Technologies Ltd + 00E020 + TECNOMEN OY - 0021E6 - Starlight Video Limited + 00E00D + RADIANT SYSTEMS - 0021E0 - CommAgility Ltd + 00E0DC + NEXWARE CORP. - 0021DE - Firepro Wireless + 00E037 + CENTURY CORPORATION - 0021F9 - WIRECOM Technologies + 00E053 + CELLPORT LABS, INC. - 0021FA - A4SP Technologies Ltd + 00E0D3 + DATENTECHNIK GmbH - 0021F0 - EW3 Technologies LLC + 00E043 + VitalCom - 0021D3 - Bocom Security(Asia Pacific) Limited + 00E0B3 + EtherWAN Systems, Inc. - 0021CC - Flextronics International + 00E0ED + SILICOM, LTD. - 0021B9 - Universal Devices Inc. + 00E0FB + LEIGHTRONIX, INC. - 0021B3 - Ross Controls + 00E0C2 + NECSY S.p.A. - 0021B6 - Triacta Power Technologies Inc. + 00E09B + ENGAGE NETWORKS, INC. - 002217 - Neat Electronics + 00E045 + TOUCHWAVE, INC. - 002211 - Rohati Systems + 00E040 + DeskStation Technology, Inc. - 0021CF - The Crypto Group + 00E01A + COMTEC SYSTEMS. CO., LTD. - 0021C5 - 3DSP Corp + 00E081 + TYAN COMPUTER CORP. - 002212 - CAI Networks Inc. + 00E057 + HAN MICROTELECOM. CO., LTD. - 00220D - Cisco Systems Inc. + 00E0BC + SYMON COMMUNICATIONS, INC. - 002208 - Certicom Corp + 00E07E + WALT DISNEY IMAGINEERING - 0021EE - Full Spectrum Inc. + 00E078 + BERKELEY NETWORKS - 0021EC - Solutronic GmbH + 00E087 + LeCroy - Networking Productions Division - 002205 - WeLink Solutions Inc. + 00E041 + CSPI - 002209 - Omron Healthcare Ltd + 00E0E2 + INNOVA CORP. - 00218C - TopControl GmbH + 00E082 + ANERMA - 00218A - Electronic Design and Manufacturing Company + 00E077 + WEBGEAR, INC. - 00218B - Wescon Technology Inc. + 00E056 + HOLONTECH CORPORATION - 002184 - Powersoft SRL + 00E02F + MCNS HOLDINGS, L.P. - 002178 - Matuschek Messtechnik GmbH + 00E06C + Ultra Electronics Command & Control Systems - 002173 - Ion Torrent Systems Inc. + 00E04A + ZX Technologies, Inc - 002177 - W. L. Gore & Associates + 00E031 + HAGIWARA ELECTRIC CO., LTD. - 002172 - Seoultek Valley + 00E00B + ROOFTOP COMMUNICATIONS CORP. - 002153 - SeaMicro Inc. + 00E0B2 + TELMAX COMMUNICATIONS CORP. - 00217A - Sejin Electron Inc. + 00E0EC + CELESTICA INC. - 0021A4 - Dbii Networks + 00E07A + MIKRODIDAKT AB - 002199 - Vacon Plc + 00E099 + SAMSON AG - 0021A0 - Cisco Systems Inc. + 006022 + VICOM SYSTEMS, INC. - 002198 - Thai Radio Ltd + 0060EE + APOLLO - 0021AE - Alcatel-Lucent France - WTD + 0060D8 + ELMIC SYSTEMS, INC. - 0021AF - Radio Frequency Systems + 0060EF + FLYTECH TECHNOLOGY CO., LTD. - 002154 - D-TACQ Solutions Ltd + 006085 + Storage Concepts - 002169 - Prologix LLC. + 006053 + TOYODA MACHINE WORKS, LTD. - 00214B - Shenzhen HAMP Science & Technology Ltd + 006056 + NETWORK TOOLS, INC. - 002145 - Semptian Technologies Ltd + 00600C + Eurotech Inc. - 001FFE - HPN Supply Chain + 006032 + I-CUBE, INC. - 001FFF - Respironics Inc. + 006033 + ACUITY IMAGING, INC. - 001FFC - Riccius+Sohn GmbH + 006013 + NETSTAL MASCHINEN AG - 001FFD - Indigo Mobile Technologies Corp. + 000288 + GLOBAL VILLAGE COMMUNICATION - 002121 - VRmagic GmbH + 006034 + ROBERT BOSCH GmbH - 002123 - Aerosat Avionics + 006050 + INTERNIX INC. - 00210A - byd:sign Corporation + 0060E0 + AXIOM TECHNOLOGY CO., LTD. - 002107 - Seowonintech Ltd + 006096 + T.S. MICROTECH INC. - 00213F - A-Team Technology Ltd + 00601D + LUCENT TECHNOLOGIES - 00211B - Cisco Systems Inc. + 00607B + FORE SYSTEMS, INC. - 00212D - Scimolex Corporation + 006011 + CRYSTAL SEMICONDUCTOR CORP. - 001FD5 - MICRORISC s.r.o. + 0060FA + EDUCATIONAL TECHNOLOGY RESOURCES, INC. - 001FB1 - Cybertech Inc. + 0060DA + Red Lion Controls, LP - 001FB2 - Sontheim Industrie Elektronik GmbH + 0060AE + TRIO INFORMATION SYSTEMS AB - 001FEE - ubisys technologies GmbH + 006043 + iDirect, INC. - 001FEF - Shinsei Industries Ltd + 00603A + QUICK CONTROLS LTD. - 001FEC - Synapse Electronique + 006028 + MACROVISION CORPORATION - 001FCA - Cisco Systems Inc. + 00601C + TELXON CORPORATION - 001FC3 - SmartSynch Inc. + 0060C9 + ControlNet, Inc. - 001FE0 - EdgeVelocity Corp + 00605F + NIPPON UNISOFT CORPORATION - 001FD8 - A-Trust Computer Corporation + 006091 + FIRST PACIFIC NETWORKS, INC. - 001FD7 - Telerad SA + 00A061 + PURITAN BENNETT - 001FD3 - RIVA Networks Inc. + 00A03C + EG&G NUCLEAR INSTRUMENTS - 001FC1 - Hanlong Technology Ltd + 00A0C4 + CRISTIE ELECTRONICS LTD. - 001FBB - Xenatech Ltd + 00A063 + JRL SYSTEMS, INC. - 001FE8 - KURUSUGAWA Electronics Industry Inc,. + 006045 + PATHLIGHT TECHNOLOGIES - 001FAB - I.S High Tech.Inc + 00A05D + CS COMPUTER SYSTEME GmbH - 001FAC - Goodmill Systems Ltd + 00A033 + imc MeBsysteme GmbH - 001F36 - Bellwin Information Ltd + 00A0A9 + NAVTEL COMMUNICATIONS INC. - 001F3D - Qbit GmbH + 00A071 + VIDEO LOTTERY TECHNOLOGIES,INC - 001F38 - Positron + 00A0EA + ETHERCOM CORP. - 001F2D - Electro-Optical Imaging Inc. + 00A0DC + O.N. ELECTRONIC CO., LTD. - 001F89 - Signalion GmbH + 00A00B + COMPUTEX CO., LTD. - 001F8A - Ellion Digital Inc. + 00A0E2 + Keisokugiken Corporation - 001F7F - Phabrix Limited + 0060F0 + JOHNSON & JOHNSON MEDICAL, INC - 001F76 - AirLogic Systems Inc. + 0060F5 + ICON WEST, INC. - 001F73 - Teraview Technology Ltd + 006062 + TELESYNC, INC. - 001F62 - JSC Stilsoft + 0060E4 + COMPUSERVE, INC. - 001F67 - Hitachi Ltd + 0060BE + WEBTRONICS - 001F56 - Digital Forecast + 0060BF + MACRAIGOR SYSTEMS, INC. - 001F52 - UVT Unternehmensberatung fur Verkehr und Technik GmbH + 006000 + XYCOM INC. - 001F4F - Thinkware Ltd + 0060A6 + PARTICLE MEASURING SYSTEMS - 001F2F - Berker GmbH & Co. KG + 00602A + SYMICRON COMPUTER COMMUNICATIONS, LTD. - 001F32 - Nintendo Ltd + 00A06D + MANNESMANN TALLY CORPORATION - 001F44 - GE Transportation Systems + 00A0F6 + AutoGas Systems Inc. - 001F39 - Construcciones y Auxiliar de Ferrocarriles, S.A. + 00608F + TEKRAM TECHNOLOGY CO., LTD. - 001F7C - Witelcom AS + 0060C4 + SOLITON SYSTEMS K.K. - 001F7A - WiWide Inc. + 006080 + MICROTRONIX DATACOM LTD. - 001F77 - Heol Design + 00A037 + Mindray DS USA, Inc. - 001F94 - Lascar Electronics Ltd + 00A04C + INNOVATIVE SYSTEMS & TECHNOLOGIES, INC. - 001F8E - Metris USA Inc. + 00A031 + HAZELTINE CORPORATION, MS 1-17 - 001F61 - Talent Communication Networks Inc. + 00A041 + INFICON - 001ECE - BISA Technologies (Hong Kong) Limited + 00A01A + BINAR ELEKTRONIK AB - 001EC8 - Rapid Mobile (Pty) Ltd + 00A088 + ESSENTIAL COMMUNICATIONS - 001ECC - Cdvi + 00A0C2 + R.A. SYSTEMS CO., LTD. - 001EC5 - Middle Atlantic Products Inc + 00A04B + TFL LAN INC. - 001F03 - NUM AG + 00A064 + KVB/ANALECT - 001EFF - Mueller-Elektronik GmbH & Co. KG + 00A03E + ATM FORUM - 001F05 - iTAS Technology Corp. + 00A098 + NetApp - 001F07 - AZTEQ Mobile + 00A06C + SHINDENGEN ELECTRIC MFG. CO., LTD. - 001EF6 - Cisco Systems Inc. + 00A01F + TRICORD SYSTEMS, INC. - 001EF9 - Pascom Kommunikations Systeme GmbH. + 00A0FB + Toray Engineering D Solutions Co., Ltd. - 001EF3 - From2 + 00A07E + AVID TECHNOLOGY, INC. - 001F19 - BEN-RI Electronica S.A. + 00A06F + Color Sentinel Systems, LLC - 001F11 - Openmoko Inc. + 00A0C7 + TADIRAN TELECOMMUNICATIONS - 001EE4 - ACS Solutions France + 00A02C + interWAVE Communications - 001EED - Adventiq Ltd + 00A0F7 + V.I COMPUTER CORP. - 001ED2 - Ray Shine Video Technology Inc + 00A090 + TimeStep Corporation - 001ED4 - Doble Engineering + 00A0A7 + VORAX CORPORATION - 001EFD - Microbit 2.0 AB + 00A08B + ASTON ELECTRONIC DESIGNS LTD. - 001EE7 - Epic Systems Inc + 00A0B1 + FIRST VIRTUAL CORPORATION - 001EE9 - Stoneridge Electronics AB + 002010 + JEOL SYSTEM TECHNOLOGY CO. LTD - 001F1C - KOBISHI ELECTRIC Ltd + 00209F + MERCURY COMPUTER SYSTEMS, INC. - 001E79 - Cisco Systems Inc. + 002091 + J125, NATIONAL SECURITY AGENCY - 001E76 - Thermo Fisher Scientific + 0020BD + NIOBRARA R & D CORPORATION - 001E72 - PCS + 002054 + Sycamore Networks - 001E5F - KwikByte LLC + 0020A7 + PAIRGAIN TECHNOLOGIES, INC. - 001E5B - Unitron Company Inc. + 002072 + WORKLINK INNOVATIONS - 001E5E - Computime Ltd + 0020CB + PRETEC ELECTRONICS CORP. - 001E9D - Recall Technologies Inc. + 0020EB + CINCINNATI MICROWAVE, INC. - 001E95 - Sigmalink + 0020A0 + OA LABORATORY CO., LTD. - 001E93 - CiriTech Systems Inc + 00200D + CARL ZEISS - 001EA2 - Symx Systems Inc. + 00202D + TAIYO CORPORATION - 001EA9 - Nintendo Ltd + 00A0DB + FISHER & PAYKEL PRODUCTION - 001E9E - ddm hopt + schuler GmbH + Co. KG + 00A097 + JC INFORMATION SYSTEMS - 001EBE - Cisco Systems Inc. + 00A073 + COM21, INC. - 001EC3 - Kozio Inc. + 00A03A + KUBOTEK CORPORATION - 001EBD - Cisco Systems Inc. + 00A0B2 + SHIMA SEIKI - 001EB9 - Sing Fai Technology Limited + 00A027 + FIREPOWER SYSTEMS, INC. - 001EB7 - TBTech Ltd + 00A081 + ALCATEL DATA NETWORKS - 001E69 - Thomson Inc. + 00A0D4 + RADIOLAN, INC. - 001E92 - Jeulin S.A. + 0020B9 + METRICOM, INC. - 001E91 - KIMIN Electronic Ltd + 002039 + SCINETS - 001E89 - CRFS Limited + 00A046 + SCITEX CORP. LTD. - 001E86 - MEL Ltd + 00A092 + H. BOLLMANN MANUFACTURERS, LTD - 001E88 - Andor System Support Ltd + 0020EC + TECHWARE SYSTEMS CORP. - 001E0C - Sherwood Information Partners Inc. + 00206E + XACT, INC. - 001E02 - Sougou Keikaku Kougyou Ltd + 0020F1 + ALTOS INDIA LIMITED - 001E01 - Renesas Technology Sales Ltd + 002041 + DATA NET - 001DFF - Network Critical Solutions Ltd + 002076 + REUDO CORPORATION - 001E00 - Shantou Institute Of Ultrasonic Instruments + 0020E8 + DATATREK CORPORATION - 001E54 - TOYO ELECTRIC Corporation + 0020C5 + EAGLE TECHNOLOGY - 001E3C - Lyngbox Media AB + 0020E2 + INFORMATION RESOURCE ENGINEERING - 001E4D - Welkin Sciences LLC + 002007 + SFA, INC. - 001E4B - City Theatrical + 00205C + InterNet Systems of Florida, Inc. - 001E4A - Cisco Systems Inc. + 002055 + ALTECH CO., LTD. - 001E13 - Cisco Systems Inc. + 00200A + SOURCE-COMM CORP. - 001E0D - Micran Ltd + 0020CF + TEST & MEASUREMENT SYSTEMS INC - 001E09 - ZEFATEK Ltd + 0020A5 + API ENGINEERING - 001E06 - Wibrain + 002064 + PROTEC MICROSYSTEMS, INC. - 001E2C - CyVerse Corporation + 002033 + SYNAPSE TECHNOLOGIES, INC. - 001E26 - Digifriends Ltd + 0020EA + EFFICIENT NETWORKS, INC. - 001E23 - Electronic Educational Devices Inc. + 00206A + OSAKA COMPUTER CORP. - 001DF3 - SBS Science & Technology Ltd + 0020B4 + TERMA ELEKTRONIK AS - 001DEE - Nextvision Sistemas Digitais de Televisao Ltda. + 0020E4 + HSING TECH ENTERPRISE CO., LTD - 001DEA - Commtest Instruments Ltd + 0020A2 + GALCOM NETWORKING LTD. - 001DDD - DAT H.K. Limited + 002031 + Tattile SRL - 001DE4 - Visioneered Image Systems + 0020D0 + VERSALYNX CORPORATION - 001DE2 - Radionor Communications + 00206C + EVERGREEN TECHNOLOGY CORP. - 001DD7 - Algolith + 00205E + CASTLE ROCK, INC. - 001DC9 - GainSpan Corp. + 002012 + CAMTRONICS MEDICAL SYSTEMS - 001D86 - Shinwa Industries(China) Ltd + 002075 + MOTOROLA COMMUNICATION ISRAEL - 001D88 - Clearwire + 0020BB + ZAX CORPORATION - 001D81 - Guangzhou Gateway Electronics Ltd + 0020A8 + SAST TECHNOLOGY CORP. - 001D7D - Giga-Byte Technology Ltd + 002045 + ION Networks, Inc. - 001DC7 - L-3 Communications Geneva Aerospace + 00208A + SONIX COMMUNICATIONS, LTD. - 001D89 - VaultStor Corporation + 002021 + ALGORITHMS SOFTWARE PVT. LTD. - 001D66 - Hyundai Telecom + 002049 + COMTRON, INC. - 001D77 - NSGate + 002050 + KOREA COMPUTER INC. - 001DA2 - Cisco Systems Inc. + 002084 + OCE PRINTING SYSTEMS, GMBH - 001D99 - Cyan Optic Inc. + 002009 + PACKARD BELL ELEC., INC. - 001D9B - Hokuyo Automatic Ltd + 002027 + MING FORTUNE INDUSTRY CO., LTD - 001DBC - Nintendo Ltd + 00202C + WELLTRONIX CO., LTD. - 001DB6 - BestComm Networks Inc. + 0020DB + XNET TECHNOLOGY, INC. - 001DAC - Gigamon Systems LLC + 001C7C + PERQ SYSTEMS CORPORATION - 001D15 - Shenzhen Dolphin Electronic Ltd + 00C039 + Teridian Semiconductor Corporation - 001D16 - SFR + 00C0A9 + BARRON MCCANN LTD. - 001D11 - Analogue & Micro Ltd + 00C019 + LEAP TECHNOLOGY, INC. - 001D12 - Rohm Ltd + 00C0CF + IMATRAN VOIMA OY - 001D47 - Covote GmbH & Co KG + 00C07D + RISC DEVELOPMENTS LTD. - 001D41 - Hardy Instruments + 00C0B5 + CORPORATE NETWORK SYSTEMS,INC. - 001D3D - Avidyne Corporation + 00C04B + CREATIVE MICROSYSTEMS - 001D3C - Muscle Corporation + 00C0B9 + FUNK SOFTWARE, INC. - 001D3A - mh acoustics LLC + 00C015 + NEW MEDIA CORPORATION - 001D49 - Innovation Wireless Inc. + 00C083 + TRACE MOUNTAIN PRODUCTS, INC. - 001D46 - Cisco Systems Inc. + 00C094 + VMX INC. - 001D48 - Sensor-Technik Wiedemann GmbH + 00C0F9 + Artesyn Embedded Technologies - 001D76 - Eyeheight Ltd + 00C075 + XANTE CORPORATION - 001D7A - Wideband Semiconductor Inc. + 00C05B + NETWORKS NORTHWEST, INC. - 001D68 - Thomson Telecom Belgium + 00C008 + SECO SRL - 001D26 - Rockridgesound Technology Co. + 00C0B7 + AMERICAN POWER CONVERSION CORP - 001D35 - Viconics Electronics Inc. + 00C0FC + ELASTIC REALITY, INC. - 001D31 - Highpro International R&D Ltd + 00C0BB + FORVAL CREATIVE, INC. - 001D61 - BIJ Corporation + 0020D2 + RAD DATA COMMUNICATIONS, LTD. - 001D5C - Tom Communication Industrial Ltd + 002002 + SERITECH ENTERPRISE CO., LTD. - 001D56 - Kramer Electronics Ltd + 00204B + AUTOCOMPUTER CO., LTD. - 001D4E - TCM Mobile LLC + 00208C + GALAXY NETWORKS, INC. - 001D21 - Alcad SL + 0020A6 + Proxim Wireless - 001D1C - Gennet s.a. + 00C043 + STRATACOM - 001CE1 - Indra Sistemas, S.A. + 00C028 + JASCO CORPORATION - 001CE0 - Dasan TPS + 00C08D + TRONIX PRODUCT DEVELOPMENT - 001CD9 - GlobalTop Technology Inc. + 00C02A + OHKURA ELECTRIC CO., LTD. - 001CDA - Exegin Technologies Limited + 00C0EF + ABIT CORPORATION - 001CD2 - King Champion (Hong Kong) Limited + 00C061 + SOLECTEK CORPORATION - 001CA6 - Win4NET + 00C0AD + MARBEN COMMUNICATION SYSTEMS - 001CA9 - Audiomatica Srl + 00C07F + NUPON COMPUTING CORP. - 001CA1 - Akamai Technologies Inc. + 00C057 + MYCO ELECTRONICS - 001C99 - Shunra Software Ltd + 00C056 + SOMELEC - 001CF9 - Cisco Systems Inc. + 00C027 + CIPHER SYSTEMS, INC. - 001CF1 - SUPoX Technology Co Ltd + 00C05C + ELONEX PLC - 001CCE - By Techdesign + 00C0ED + US ARMY ELECTRONIC - 001CF3 - EVS Broadcast Equipment + 0040BD + STARLIGHT NETWORKS, INC. - 001CF4 - Media Technology Systems Inc + 0040ED + NETWORK CONTROLS INT'NATL INC. - 001CE6 - Innes + 0040E5 + SYBUS CORPORATION - 001CB9 - Kwang Sung Electronics Ltd + 0040A5 + CLINICOMP INTL. - 001D03 - Design Solutions Inc. + 004005 + ANI COMMUNICATIONS INC. - 001CA3 - Terra + 00C030 + INTEGRATED ENGINEERING B. V. - 001C90 - Empacket Corporation + 00C0A6 + EXICOM AUSTRALIA PTY. LTD - 001C8E - Alcatel-Lucent IPD + 00C0CB + CONTROL TECHNOLOGY CORPORATION - 001C8F - Advanced Electronic Design Inc. + 00C0D1 + COMTREE TECHNOLOGY CORPORATION - 001C88 - Transystem Inc. + 00C038 + RASTER IMAGE PROCESSING SYSTEM - 001C86 - Cranite Systems Inc. + 00C092 + MENNEN MEDICAL INC. - 001C4F - Macab AB + 00C052 + BURR-BROWN - 001C4E - TASA International Limited + 00C0EB + SEH COMPUTERTECHNIK GMBH - 001C4B - Gener8 Inc. + 0040DB + ADVANCED TECHNICAL SOLUTIONS - 001C9B - FEIG ELECTRONIC GmbH + 00409B + HAL COMPUTER SYSTEMS INC. - 001C95 - Opticomm Corporation + 0040EB + MARTIN MARIETTA CORPORATION - 001C97 - Enzytek Technology Inc., + 00C032 + I-CUBED LIMITED - 001C70 - Novacomm Ltda + 00C0A5 + DICKENS DATA SYSTEMS - 001C6E - Newbury Networks Inc. + 00C0D3 + OLYMPUS IMAGE SYSTEMS, INC. - 001C6B - CoVAX Ltd + 00C0E8 + PLEXCOM, INC. - 001C69 - Packet Vision Ltd + 00400E + MEMOTEC, INC. - 001C3D - WaveStorm + 00C03D + WIESEMANN & THEIS GMBH - 001C7F - Check Point Software Technologies + 00404C + HYPERTEC PTY LTD. - 001C78 - Wyplay SAS + 00C0E0 + DSC COMMUNICATION CORP. - 001C58 - Cisco Systems Inc. + 00C0DA + NICE SYSTEMS LTD. - 001C5A - Advanced Relay Corporation + 0040C8 + MILAN TECHNOLOGY CORPORATION - 001C65 - JoeScan Inc. + 0040BA + ALLIANT COMPUTER SYSTEMS CORP. - 001C5F - Winland Electronics Inc. + 0040CE + NET-SOURCE, INC. - 001C40 - VDG-Security bv + 004062 + E-SYSTEMS, INC./GARLAND DIV. - 001C3A - Element Labs Inc. + 0040D9 + AMERICAN MEGATRENDS INC. - 001C18 - Sicert S.r.L. + 004021 + RASTER GRAPHICS - 001C1A - Thomas Instrumentation Inc. + 0040C1 + BIZERBA-WERKE WILHEIM KRAUT - 001C0E - Cisco Systems Inc. + 0040E1 + MARNER INTERNATIONAL, INC. - 001C13 - Optsys Technology Ltd + 0040FE + SYMPLEX COMMUNICATIONS - 001C0B - SmartAnt Telecom + 0040D4 + GAGE TALKER CORP. - 001BD0 - Identec Solutions + 004038 + TALENT ELECTRIC INCORPORATED - 001BCD - Daviscomms (S) PTE Ltd + 0040D8 + OCEAN OFFICE AUTOMATION LTD. - 001BCA - Beijing Run Technology Ltdpany + 0040C6 + FIBERNET RESEARCH, INC. - 001BCC - Kingtek Cctv Alliance Ltd + 004032 + DIGITAL COMMUNICATIONS - 001BF4 - Kenwin Industrial(HK) Ltd + 0040C2 + APPLIED COMPUTING DEVICES - 001BF9 - Intellitect Water Ltd + 004088 + MOBIUS TECHNOLOGIES, INC. - 001BFA - G.i.N. mbH + 0080AA + MAXPEED - 001BF3 - TRANSRADIO SenderSysteme Berlin AG + 00C050 + TOYO DENKI SEIZO K.K. - 001C21 - Nucsafe Inc. + 00401C + AST RESEARCH, INC. - 001C1E - emtrion GmbH + 00400F + DATACOM TECHNOLOGIES - 001BDE - Renkus-Heinz Inc. + 004006 + SAMPO TECHNOLOGY CORPORATION - 001BDB - Valeo VECS + 004034 + BUSTEK CORPORATION - 001BD8 - FLIR Systems Inc + 008093 + XYRON CORPORATION - 001BD4 - Cisco Systems Inc. + 008092 + Silex Technology, Inc. - 001C2D - FlexRadio Systems + 00805A + TULIP COMPUTERS INTERNAT'L B.V - 001C2C - Synapse + 00807E + SOUTHERN PACIFIC LTD. - 001C08 - Echo360 Inc. + 0080EF + RATIONAL - 001BC8 - Miura Ltd + 0080F0 + Panasonic Communications Co., Ltd. - 001BC1 - HOLUX Technology Inc. + 008051 + FIBERMUX - 001BBC - Silver Peak Systems Inc. + 0080C6 + NATIONAL DATACOMM CORPORATION - 001B73 - DTL Broadcast Ltd + 004050 + IRONICS, INCORPORATED - 001B71 - Telular Corp. + 004047 + WIND RIVER SYSTEMS - 001B97 - Violin Technologies + 004041 + FUJIKURA LTD. - 001BA8 - UBI&MOBI,.Inc + 008000 + MULTITECH SYSTEMS, INC. - 001B81 - DATAQ Instruments Inc. + 008069 + COMPUTONE SYSTEMS - 001B7D - CXR Anderson Jacobson + 008035 + TECHNOLOGY WORKS, INC. - 001B79 - Faiveley Transport + 00804E + APEX COMPUTER COMPANY - 001B65 - China Gridcom Ltd + 008055 + FERMILAB - 001B88 - Divinet Access Technologies Ltd + 00802A + TEST SYSTEMS & SIMULATIONS INC - 001B83 - Finsoft Ltd + 00801D + INTEGRATED INFERENCE MACHINES - 001BAB - Telchemy Inc.orporated + 0080C0 + PENRIL DATACOMM - 001BAE - Micro Control Systems Inc. + 008075 + PARSYTEC GMBH - 001BA0 - Awox + 0080ED + IQ TECHNOLOGIES, INC. - 001B51 - Vector Technology Corp. + 00809A + NOVUS NETWORKS LTD - 001B54 - Cisco Systems Inc. + 00804A + PRO-LOG - 001B4A - W&W Communications Inc. + 008004 + ANTLOW COMMUNICATIONS, LTD. - 001AFA - Welch Allyn Inc. + 0080D0 + COMPUTER PERIPHERALS, INC. - 001AF7 - dataschalt e+a GmbH + 008024 + KALPANA, INC. - 001AF3 - Samyoung Electronics + 008040 + JOHN FLUKE MANUFACTURING CO. - 001AEF - Loopcomm Technology Inc. + 008021 + Alcatel Canada Inc. - 001AEC - Keumbee Electronics Ltd + 0080E8 + CUMULUS CORPORATIION - 001B44 - SanDisk Corporation + 000066 + TALARIS SYSTEMS, INC. - 001B46 - Blueone Technology Ltd + 000049 + APRICOT COMPUTERS, LTD - 001B40 - Network Automation mxc AB + 0000FA + MICROSAGE COMPUTER SYSTEMS INC - 001B42 - Wise & Blue + 0000D4 + PURE DATA LTD. - 001B35 - ChongQing JINOU Science & Technology Development Ltd + 000019 + APPLIED DYNAMICS INTERNATIONAL - 001B36 - Tsubata Engineering Ltd (Head Office) + 0000AB + LOGIC MODELING CORPORATION - 001B39 - Proxicast + 0080F2 + RAYCOM SYSTEMS INC - 001B3B - Yi-Qing Ltd + 0080BD + THE FURUKAWA ELECTRIC CO., LTD - 001B20 - TPine Technology + 008025 + Telit Wireless Solutions GmbH - 001B22 - Palit Microsystems ( H.K.) Ltd + 0080EA + ADVA Optical Networking Ltd. - 001B1C - Coherent + 00800D + VOSSWINKEL F.U. - 001B19 - IEEE I&M Society TC9 + 0080D1 + KIMTRON CORPORATION - 001B64 - IsaacLandKorea Ltd + 00001E + TELSIST INDUSTRIA ELECTRONICA - 001B26 - RON-Telecom ZAO + 000050 + RADISYS CORPORATION - 001B13 - Icron Technologies Corporation + 00802E + CASTLE ROCK COMPUTING - 001B0F - Petratec + 00004F + LOGICRAFT, INC. - 001AA9 - Fujian Star-NET Communication Ltd + 000015 + DATAPOINT CORPORATION - 001AA8 - Mamiya Digital Imaging Ltd + 00001C + BELL TECHNOLOGIES - 001A99 - Smarty (HZ) Information Electronics Ltd + 000034 + NETWORK RESOURCES CORPORATION - 001AA6 - Telefunken Radio Communication Systems GmbH &Co.KG + 000022 + VISUAL TECHNOLOGY INC. - 001A96 - Ecler S.A. + 0000B5 + DATABILITY SOFTWARE SYS. INC. - 001A91 - FusionDynamic Ltd + 0000E0 + QUADRAM CORP. - 001A8C - Sophos Ltd + 000027 + JAPAN RADIO COMPANY - 001AB3 - Visionite Inc. + 0000E8 + ACCTON TECHNOLOGY CORP. - 001ACA - Tilera Corporation + 00002F + TIMEPLEX INC. - 001A84 - V One Multimedia Pte Ltd + 0000E6 + APTOR PRODUITS DE COMM INDUST - 001AB9 - PMC + 00009A + RC COMPUTER A/S - 001ABA - Caton Overseas Limited + 00004B + ICL DATA OY - 001AD1 - Fargo Ltd + 008042 + Artesyn Embedded Technologies - 001A3A - Dongahelecomm + 0080AC + IMLOGIX, DIVISION OF GENESYS - 001A3B - Doah Elecom Inc. + 000080 + CRAY COMMUNICATIONS A/S - 001A3C - Technowave Ltd + 080089 + Kinetics - 001A40 - A-Four Tech Ltd + 080086 + KONICA MINOLTA HOLDINGS, INC. - 001A30 - Cisco Systems Inc. + 080083 + Seiko Instruments Inc. - 001A7B - Teleco Inc. + 000073 + SIECOR CORPORATION - 001A36 - Aipermon GmbH & Co. KG + 0000B9 + MCDONNELL DOUGLAS COMPUTER SYS - 001A26 - Deltanode Solutions AB + 0000BF + SYMMETRIC COMPUTER SYSTEMS - 001A6D - Cisco Systems Inc. + 00002D + CHROMATICS INC - 001A6E - Impro Technologies + 000059 + Hellige GMBH - 001A6C - Cisco Systems Inc. + 000069 + CONCORD COMMUNICATIONS INC - 001A4A - Qumranet Inc. + 0000E7 + Star Gate Technologies - 001A3E - Faster Technology LLC + 00004D + DCI CORPORATION - 001A63 - Elster Solutions LLC, + 00006F + Madge Ltd. - 001A59 - Ircona + 000078 + LABTAM LIMITED - 001A46 - Digital Multimedia Technology Ltd + 00005A + SysKonnect GmbH - 001A25 - Delta Dore + 000071 + ADRA SYSTEMS INC. - 0019FE - Shenzhen Seecomm Technology Ltd + 000023 + ABB INDUSTRIAL SYSTEMS AB - 0019FD - Nintendo Ltd + 000018 + WEBSTER COMPUTER CORPORATION - 001A0D - HandHeld entertainment Inc. + 0000D5 + MICROGNOSIS INTERNATIONAL - 001A0E - Cheng Uei Precision Industry Ltd + 00003A + CHYRON CORPORATION - 0019CD - Chengdu ethercom Information technology Ltd + 0000BE + THE NTI GROUP - 0019D9 - Zeutschel GmbH + 0000D9 + NIPPON TELEGRAPH & TELEPHONE - 001A01 - Smiths Medical + 080024 + 10NET COMMUNICATIONS/DCA - 0019CA - Broadata Communications Inc. + 080022 + NBI INC. - 0019D3 - TRAK Microwave + 080020 + Oracle Corporation - 0019C3 - Qualitrol + 08001F + SHARP CORPORATION - 0019BE - Altai Technologies Limited + 020701 + RACAL-DATACOM - 0019B4 - Intellio Ltd + 080006 + SIEMENS AG - 0019BA - Paradox Security Systems Ltd + 08002A + MOSAIC TECHNOLOGIES INC. - 0019A1 - LG Information & Comm. + 080013 + Exxon - 0019A8 - WiQuest Communications + 021C7C + PERQ SYSTEMS CORPORATION - 0019ED - Axesstel Inc. + 080061 + JAROGATE LTD. - 0019F6 - Acconet (PTE) Ltd + 08005F + SABER TECHNOLOGY CORP. - 001A15 - gemalto e-Payment + 080058 + SYSTEMS CONCEPTS - 001968 - Digital Video Networks(Shanghai) Ltd + 04E0C4 + TRIUMPH-ADLER AG - 00197F - Plantronics Inc. + 080049 + UNIVATION - 00197A - MAZeT GmbH + 000005 + XEROX CORPORATION - 001978 - Datum Systems Inc. + 00DD08 + UNGERMANN-BASS INC. - 001989 - Sonitrol Corporation + AA0000 + DIGITAL EQUIPMENT CORPORATION - 001980 - Gridpoint Systems + AA0001 + DIGITAL EQUIPMENT CORPORATION - 001983 - CCT R&D Limited + AA0002 + DIGITAL EQUIPMENT CORPORATION - 00194C - Fujian Stelcom Information & Technology Ltd + 080014 + EXCELAN - 00194A - Testo AG + 080065 + GENRAD INC. - 00198A - Northrop Grumman Systems Corp. + 000007 + XEROX CORPORATION - 001960 - DoCoMo Systems Inc. + 00801F + KRUPP ATLAS ELECTRONIK GMBH - 00195A - Jenaer Antriebstechnik GmbH + 02AA3C + OLIVETTI TELECOMM SPA (OLTECO) - 00196D - Raybit Systems Korea Inc. + 080059 + A/S MYCRON - 001970 - Z-Com Inc. + 080008 + BOLT BERANEK AND NEWMAN INC. - 001950 - Harman Multimedia + 8487FF + Shenzhen Skyworth Digital Technology CO., Ltd - 0018EE - Videology Imaging Solutions Inc. + 645725 + Hui Zhou Gaoshengda Technology Co.,LTD - 0018EB - Blue Zen Enterprises Private Limited + 0080E9 + Madge Ltd. - 001924 - LBNL Engineering + 0040D6 + LOCAMATION B.V. - 00191A - Irlink + 08004B + Planning Research Corp. - 001916 - PayTec AG + 0425E8 + Texas Instruments - 00190E - Atech Technology Ltd + 283C90 + Texas Instruments - 001939 - Gigamips + E4FA5B + Texas Instruments - 00193A - Oesolutions + 000009 + XEROX CORPORATION - 0018E2 - Topdata Sistemas de Automacao Ltda + 44C3B6 + HUAWEI TECHNOLOGIES CO.,LTD - 001922 - CM Comandos Lineares + E8F72F + HUAWEI TECHNOLOGIES CO.,LTD - 00191D - Nintendo Ltd + 50A1F3 + Huawei Device Co., Ltd. - 00192F - Cisco Systems Inc. + DC1057 + Apple, Inc. - 001905 - SCHRACK Seconet AG + 30D875 + Apple, Inc. - 001907 - Cisco Systems Inc. + 485FDF + zte corporation - 0018FB - Compro Technology + 6C1544 + Microsoft Corporation - 0018C3 - CS Corporation + 683EC0 + Apple, Inc. - 0018CA - Viprinet GmbH + 3C55DB + Shenzhen Skyworth Digital Technology CO., Ltd - 0018C7 - Real Time Automation + F0F84A + BUFFALO.INC - 0018BB - Eliwell Controls srl + EC6E79 + InHand Networks, INC. - 0018BF - Essence Technology Solution Inc. + A4004E + Cisco Systems, Inc - 00188C - Mobile Action Technology Inc. + 2C9EE0 + Cavli Inc. - 00188F - Montgomery Technology Inc. + 64C17E + cheilelectric - 001884 - Fon Technology S.L. + B02EE0 + Huawei Device Co., Ltd. - 001880 - Maxim Integrated Products + A4373E + Huawei Device Co., Ltd. - 0018D0 - AtRoad, A Trimble Company + C44F5F + Huawei Device Co., Ltd. - 0018D2 - High-Gain Antennas LLC + 785F28 + EM Microelectronic - 0018D3 - Teamcast + 38EFE3 + INGENICO TERMINALS SAS - 0018C6 - OPW Fuel Management Systems + FC8D13 + FUJIAN STAR-NET COMMUNICATION CO.,LTD - 00187C - Intercross LLC + 9CB1DC + Earda Technologies co Ltd - 001870 - E28 Shanghai Limited + 240462 + Siemens Energy Global GmbH & Co.KG - GT PRM - 001872 - Expertise Engineering + 388871 + ASKEY COMPUTER CORP - 0018DC - Prostar Ltd + BCF87E + Arcadyan Corporation - 0018D1 - Siemens Home & Office Comm. Devices + 284EE9 + mercury corperation - 0018AA - Protec Fire Detection plc + 58E359 + Interroll Software & Electronics GmbH - 001896 - Great Well Electronic Ltd + 8C3223 + JWIPC Technology Co.,Ltd. - 001890 - RadioCOM, s.r.o. + 00C896 + CIG SHANGHAI CO LTD - 0018B9 - Cisco Systems Inc. + 001B09 + MATRIX COMSEC PRIVATE LIMITED - 0018B8 - New Voice International AG + 2800AF + Dell Inc. - 0018A1 - Tiqit Computers Inc. + 000413 + snom technology GmbH - 001812 - Beijing Xinwei Telecom Technology Ltd + 74B059 + Motorola Mobility LLC, a Lenovo Company - 00180B - Brilliant Telecommunications + E48429 + New H3C Technologies Co., Ltd - 001861 - Ooma Inc. + F41A79 + IEEE Registration Authority - 00185B - Network Chemistry Inc. + 8C0734 + Private - 001855 - Aeromaritime Systembau GmbH + 987A9B + TCL MOKA International Limited - 001851 - SWsoft + 781699 + HUAWEI TECHNOLOGIES CO.,LTD - 001874 - Cisco Systems Inc. + E40A16 + HUAWEI TECHNOLOGIES CO.,LTD - 001869 - Kingjim + 409CA7 + CHINA DRAGON TECHNOLOGY LIMITED - 001856 - EyeFi Inc. + D0AD08 + HP Inc. - 00184E - Lianhe Technologies Inc. + 60045C + NXP Semiconductor (Tianjin) LTD. - 00184C - Bogen Communications + 849C02 + Druid Software - 001826 - Cale Access AB + CC40B2 + ECI Telecom Ltd. - 00182D - Artec Design + A4E287 + Xiaomi Communications Co Ltd - 00182A - Taiwan Video & Monitor + 80953A + Apple, Inc. - 00183B - CENITS Ltd + 68AE04 + Shenzhen SuperElectron Technology Co.,Ltd. - 00183C - Encore Software Limited + CC6023 + Apple, Inc. - 001841 - High Tech Computer Corp + 0CDBEA + Apple, Inc. - 001819 - Cisco Systems Inc. + 6845CC + Apple, Inc. - 00180C - Optelian Access Networks + AC9738 + Apple, Inc. - 001810 - IPTrade S.A. + 08C224 + Amazon Technologies Inc. - 001809 - Cresyn + 68932E + Habana Labs LTD. - 001804 - E-TEK Digital Technology Limited + 2CC44F + IEEE Registration Authority - 001800 - Unigrand Ltd + 1C4C27 + World WLAN Application Alliance - 0017FD - Amulet Hotkey + D0C901 + GLA ELECTRONICS PVT LTD - 0017FC - Suprema Inc. + 4099E3 + Guangzhou Mudi Information Technology Co., Ltd - 0017FB - FA + 7C8899 + FN-LINK TECHNOLOGY Ltd. - 0017D8 - Magnum Semiconductor Inc. + FC702E + Sichuan AI-Link Technology Co., Ltd. - 0017DA - Spans Logic + B4F95D + Juniper Networks - 0017CF - iMCA-GmbH + 046874 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 0017B9 - Gambro Lundia AB + 7490BC + Arcadyan Corporation - 0017B3 - Aftek Infosys Limited + B047E9 + Intel Corporate - 0017A2 - Camrivox Ltd + 6C2F80 + Intel Corporate - 00175F - XENOLINK Communications Ltd + D06578 + Intel Corporate - 00175C - Sharp Corporation + 98BD80 + Intel Corporate - 00179D - Kelman Limited + D476A0 + Fortinet, Inc. - 001790 - HYUNDAI DIGITECH Ltd + 94FF3C + Fortinet, Inc. - 001791 - LinTech GmbH + A0F509 + IEI Integration Corp. - 001795 - Cisco Systems Inc. + 6C45C4 + Cloudflare, Inc. - 001759 - Cisco Systems Inc. + 000D97 + Hitachi Energy USA Inc. - 001754 - Arkino HiTOP Corporation Limited + 187F88 + Ring LLC - 001752 - DAGS Inc. + B87E40 + Huawei Device Co., Ltd. - 001756 - Vinci Labs Oy + 1C2FA2 + Guangzhou Shiyuan Electronic Technology Company Limited - 001777 - Obsidian Research Corporation + A43F68 + Arista Network, Inc. - 00176A - Avago Technologies + BC9D4E + Shenzhen Skyworth Digital Technology CO., Ltd - 001786 - wisembed + 1C3B01 + Shanghai Xiaodu Technology Limited - 001782 - LoBenn Inc. + 94706C + Quectel Wireless Solutions Co.,Ltd. - 001778 - Central Music Co. + 64D81B + Vestel Elektronik San ve Tic. A.S. - 00176B - Kiyon Inc. + 30DCE7 + zte corporation - 001799 - SmarTire Systems Inc. + D01255 + Hui Zhou Gaoshengda Technology Co.,LTD - 00177F - Worldsmart Retech + 3C2D9E + Vantiva - Connected Home - 00176E - Ducati Sistemi + 08C7F5 + Vantiva Connected Home - Technologies Telco - 001774 - Elesta GmbH + C01693 + Xiaomi Communications Co Ltd - 00170C - Twig Ltd + FC5B8C + Xiaomi Communications Co Ltd - 00170D - Dust Networks Inc. + 284E44 + HUAWEI TECHNOLOGIES CO.,LTD - 00170B - Contela Inc. + 802EC3 + HUAWEI TECHNOLOGIES CO.,LTD - 00170F - Cisco Systems Inc. + 9C9E03 + awayfrom - 001704 - Shinco Electronics Group Ltd + 80053A + CHeKT Inc. - 001707 - InGrid Inc. + D8B32F + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 001712 - ISCO International + 54104F + Samsung Electronics Co.,Ltd - 0016D8 - Senea AB + B05476 + Samsung Electronics Co.,Ltd - 0016D6 - TDA Tech Pty Ltd + EC90C1 + Samsung Electronics Co.,Ltd - 0016D5 - Synccom Ltd + 30D959 + Shanghai Longcheer Technology Co., Ltd. - 0016C9 - NAT Seattle Inc. + 007839 + Nokia - 0016C6 - North Atlantic Industries + 108A7B + Nokia - 001724 - Studer Professional Audio GmbH + A052AB + AVM ELECTRONICS PTE LTD - 001702 - Osung Midicom Ltd + BC744B + Nintendo Co.,Ltd - 0016F7 - L-3 Communications, Aviation Recorders + 6C6F18 + Stereotaxis, Inc. - 00172D - Axcen Photonics Corporation + F0866F + EM Microelectronic - 001741 - Defidev + 5CB260 + EM Microelectronic - 001738 - International Business Machines + A8BB56 + Apple, Inc. - 00171E - Theo Benning GmbH & Co. KG + 282D7F + Apple, Inc. - 0016D2 - Caspian + 8C26AA + Apple, Inc. - 0016A4 - Ezurio Ltd + 90623F + Apple, Inc. - 001699 - Tonic DVB Marketing Ltd + 5C07A4 + Ciena Corporation - 00169B - Alstom Transport + 004BF3 + SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. - 001690 - J-TEK Incorporation + BC54FC + SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. - 001693 - PowerLink Technology Inc. + 90769F + SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. - 001698 - T&A Mobile Phones + 4C7766 + SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. - 001662 - Liyuh Technology Ltd + 005CC2 + SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. - 001661 - Novatium Solutions (P) Ltd + 88548E + vivo Mobile Communication Co., Ltd. - 001664 - Prod-El SpA + 581DC9 + MSE CO.,LTD. - 00165E - Precision I/O + 505B1D + Shenzhen C-Data Technology Co., Ltd. - 001658 - Fusiontech Technologies Inc. + 88010C + Sichuan Tianyi Comheart Telecom Co.,LTD - 0016A5 - Tandberg Storage ASA + A49E69 + Silicon Laboratories - 0016A1 - 3Leaf Networks + F082C0 + Silicon Laboratories - 001666 - Quantier Communication Inc. + 60EFAB + Silicon Laboratories - 001681 - Vector Informatik GmbH + D87A3B + Silicon Laboratories - 00BAC0 - Biometric Access Company + 3C2EF5 + Silicon Laboratories - 001685 - Elisa Oyj + 3410F4 + Silicon Laboratories - 001680 - Bally Gaming + Systems + 0CEFF6 + Silicon Laboratories - 001696 - QDI Technology (H.K.) Limited + ECF64C + Silicon Laboratories - 0016BE - InfRANET Inc. + 70C912 + Sichuan AI-Link Technology Co., Ltd. - 0016AB - Dansensor A/S + 488EB7 + Zebra Technologies Inc. - 001653 - LEGO System A/S IE Electronics Division + 90AB96 + Silicon Laboratories - 001652 - Hoatech Technologies Inc. + 0C82D5 + Maxio Technology Hangzhou Co., Ltd. - 001650 - Kratos EPD + 0401BB + TECNO MOBILE LIMITED - 0015FA - Cisco Systems Inc. + AC72DD + GD Midea Air-Conditioning Equipment Co.,Ltd. - 0015FC - Littelfuse Startco + 64BB1E + Earda Technologies co Ltd - 0015F7 - Wintecronics Ltd + 648214 + FN-LINK TECHNOLOGY Ltd. - 001630 - Vativ Technologies + E09CE5 + Shanghai Tricheer Technology Co.,Ltd. - 00162F - Geutebruck GmbH + FCD290 + SKY UK LIMITED - 00162B - Togami Electric Mfg Ltd + 78305D + zte corporation - 001642 - Pangolin + 940B83 + zte corporation - 001637 - CITEL SpA + E47450 + Shenzhen Grandsun Electronic Co.,Ltd. - 001608 - Sequans Communications + 7CD3E5 + HUAWEI TECHNOLOGIES CO.,LTD - 001624 - Teneros Inc. + B8876E + Intertech Services AG - 0015F8 - Kingtronics Industrial Ltd + 3C0B4F + Intertech Services AG - 00161C - e:cue + 6C62FE + Juniper Networks - 0015B8 - Tahoe + 9C9ED5 + Xiaomi Communications Co Ltd - 0015B6 - ShinMaywa Industries Ltd + 743822 + Xiaomi Communications Co Ltd - 0015B0 - Autotelenet Ltd + B83BAB + Arcadyan Corporation - 0015B1 - Ambient Corporation + 40A63D + SignalFire Telemetry - 00159F - Terascala Inc. + 605464 + Eyedro Green Solutions Inc. - 00159E - Mad Catz Interactive Inc + CCE536 + ittim - 0015A1 - ECA-Sinters + BC0004 + Fiberhome Telecommunication Technologies Co.,LTD - 001593 - U4EA Technologies Inc. + 98A829 + AltoBeam Inc. - 001581 - MAKUS Inc. + 84E9C1 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 00157A - Telefin S.p.A. + B4622E + Zhong Ge Smart Technology Co., Ltd. - 0015C3 - Ruf Telematik AG + C46E33 + Zhong Ge Smart Technology Co., Ltd. - 0015E6 - MOBILE TECHNIKA Inc. + 2C67BE + DWnet Technologies(Suzhou) Corporation - 0015DB - Canesta Inc. + EC192E + Cisco Systems, Inc - 00158D - Jennic Ltd + F896FE + LG Innotek - 001584 - Schenck Process GmbH + A4C40D + WAC Lighting - 0015CC - Uquest Ltd + 58306E + Nokia - 0015C6 - Cisco Systems Inc. + A8CA77 + Amazon Technologies Inc. - 0015D7 - Reti Corporation + D0C907 + Private - 0015CB - Surf Communication Solutions Ltd + C4A451 + TECNO MOBILE LIMITED - 0015A7 - Robatech AG + F89D9D + Shenzhen MinewSemi Co.,LTD. - 001523 - Meteor Communications Corporation + F061F3 + Comcast Cable Corporation - 001524 - Numatics Inc. + D48D26 + LG Innotek - 00151B - Isilon Systems Inc. + F4F28A + HUAWEI TECHNOLOGIES CO.,LTD - 001573 - NewSoft Technology Corporation + 94E300 + HUAWEI TECHNOLOGIES CO.,LTD - 001575 - Nevis Networks Inc. + 0CE5B5 + HUAWEI TECHNOLOGIES CO.,LTD - 00156C - Sane System Ltd + FCF738 + HUAWEI TECHNOLOGIES CO.,LTD - 00156A - DG2L Technologies Pvt Ltd + 8C862A + HUAWEI TECHNOLOGIES CO.,LTD - 001529 - N3 Corporation + C03379 + HUAWEI TECHNOLOGIES CO.,LTD - 00152D - TenX Networks LLC + 241E2B + Zhejiang Cainiao Supply Chain Management Co., Ltd - 00156F - Xiranet Communications GmbH + 24ACAC + Polar Electro Oy - 001572 - Red-Lemon + 50206B + Copeland - Transportation Solutions ApS - 001567 - RADWIN Inc. + 80D10A + Sichuan AI-Link Technology Co., Ltd. - 00155B - Sampo Corporation + 1047E7 + Shenzhen YOUHUA Technology Co., Ltd - 001553 - Cytyc Corporation + 94F6F2 + Honor Device Co., Ltd. - 001551 - RadioPulse Inc. + 449046 + Honor Device Co., Ltd. - 001552 - Wi-Gear Inc. + B0C38E + Huawei Device Co., Ltd. - 00153E - Q-Matic Sweden AB + 143B51 + Huawei Device Co., Ltd. - 001542 - Microhard S.R.L. + D07380 + Huawei Device Co., Ltd. - 00154E - IEC + ACFCE3 + EM Microelectronic - 001550 - Nits Technology Inc + 042DAD + Areus GmbH - 001546 - ITG Worldwide Sdn Bhd + 781C1E + Chongqing Yipingfang Technology Co., Ltd. - 00155D - Microsoft Corporation + 78A13E + New H3C Technologies Co., Ltd - 001562 - Cisco Systems Inc. + 7CBAC0 + EVBox BV - 0014E1 - Data Display AG + 98256E + Private - 0014E3 - mm-lab GmbH + B0A7D2 + Fiberhome Telecommunication Technologies Co.,LTD - 0014D9 - IP Fabrics Inc. + 8C87D0 + Shenzhen Uascent Technology Co.,Ltd - 0014D6 - Jeongmin Electronics Ltd + 5C1783 + Edgecore Americas Networking Corporation - 0014F9 - Vantage Controls + 647060 + Texas Instruments - 0014E7 - Stolinx, Inc. + 00AAFD + Texas Instruments - 0014E9 - Nortech International + 0C4BEE + Texas Instruments - 0014ED - Airak Inc. + D413B3 + Wu Qi Technologies,Inc. - 0014CE - NF Corporation + 60E5D8 + zte corporation - 0014D0 - BTI Systems Inc. + 5435E9 + Feitian Technologies Co., Ltd - 001503 - PROFIcomms s.r.o. + 7CB59F + HUAWEI TECHNOLOGIES CO.,LTD - 001509 - Plus Technology Ltd + 505C88 + Cisco Systems, Inc - 0014F0 - Business Security OL AB + 30138B + HP Inc. - 0014F2 - Cisco Systems Inc. + 606832 + Guangdong Seneasy Intelligent Technology Co., Ltd. - 001510 - Techsphere Ltd + 8433F2 + Shenzhen Stellamore Technology Co.,Ltd - 001513 - EFS sas + 28D043 + AzureWave Technology Inc. - 00148B - Globo Electronic GmbH & Co. KG + E4D3AA + FCNT LLC - 001490 - ASP Corporation + B0D576 + Apple, Inc. - 001484 - Cermate Technologies Inc. + 142876 + Apple, Inc. - 001479 - NEC Magnus Communications Ltd + 147FCE + Apple, Inc. - 00147B - Iteris Inc. + 6CC3B2 + Cisco Meraki - 0014BB - Open Interface North America + F8CE07 + ZHEJIANG DAHUA TECHNOLOGYCO.,LTD - 001470 - Prokom Software SA + 2098ED + AltoBeam Inc. - 001467 - ArrowSpan Inc. + 983910 + Kaon Group Co., Ltd. - 00145F - Aditec Ltd + 804C5D + NXP Semiconductor (Tianjin) LTD. - 001488 - Akorri + F88FC8 + Chipsea Technologies (Shenzhen) Corp. - 00147A - Eubus GmbH + 289176 + Indyme Solutions, LLC - 00146D - RF Technologies + 28A06B + Intel Corporate - 0014AC - Bountiful WiFi + 7C8BC1 + Infinix mobility limited - 0014A8 - Cisco Systems Inc. + 3CCA61 + TECNO MOBILE LIMITED - 0014A0 - Accsense Inc. + ECA971 + Hangzhou Hikvision Digital Technology Co.,Ltd. - 001459 - Moram Ltd + 68A2AA + Acres Manufacturing - 001457 - T-Vips AS + 88AE35 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 001453 - Advantech Technologies Ltd + 7049A2 + Zyxel Communications Corporation - 001454 - Symwave + A07D9C + Samsung Electronics Co.,Ltd - 0013F8 - Dex Security Solutions + F8C3F1 + Raytron Photonics Co.,Ltd. - 0013F9 - Cavera Systems + D89563 + Taiwan Digital Streaming Co. - 0013F2 - Klas Ltd + E8A848 + Wacom Co.,Ltd. - 0013F7 - SMC Networks Inc. + 5CA3EB + SKODA DIGITAL s.r.o. - 00144B - Hifn Inc. + 5CBE05 + ISPEC - 001441 - Innovation Sound Technology Ltd + 08524E + Shenzhen Fangcheng Baiyi Technology Co., Ltd. - 00143C - Rheinmetall Canada Inc. + ACF42C + Earda Technologies co Ltd - 00141A - Deicy Corporation + C0AB2B + Huawei Device Co., Ltd. - 00141C - Cisco Systems Inc. + 508A7F + HUAWEI TECHNOLOGIES CO.,LTD - 00140C - GKB Cctv Ltd + C4CBBE + Great Talent Technology Limited - 0013FE - Grandtec Electronic Corp. + E8B527 + Phyplus Technology (Shanghai) Co., Ltd - 001435 - CityCom Corp. + 98A878 + Agnigate Technologies Private Limited - 001448 - Inventec Multimedia & Telecom Corporation + 305223 + GD Midea Air-Conditioning Equipment Co.,Ltd. - 001416 - Scosche Industries Inc. + DC4965 + DASAN Newtork Solutions - 001426 - NL Technology + 189E2D + Allwinner Technology Co., Ltd - 0013C5 - Lightron Fiber-Optic Devices Inc. + 9C6076 + Apple, Inc. - 0013C4 - Cisco Systems Inc. + 38E13D + Apple, Inc. - 0013C2 - WACOM Ltd + D0D49F + Apple, Inc. - 0013BF - Media System Planning Corp. + 9C2D49 + Nanowell Info Tech Co., Limited - 0013BB - Smartvue Corporation + 887FD5 + zte corporation - 0013B5 - Wavesat + F47470 + Cisco Systems, Inc - 0013AF - NUMA Technology,Inc. + 60A434 + IEEE Registration Authority - 0013B0 - Jablotron + 387B01 + Shenzhen MiaoMing Intelligent Technology Co.,Ltd - 00139A - K-ubique ID Corp. + 0CEDC8 + Xiaomi Communications Co Ltd - 00139E - Ciara Technologies Inc. + 88BCAC + Zebra Technologies Inc. - 00139D - MaxLinear Hispania S.L.U. + C88DD4 + Markone technology Co., Ltd. - 0013D5 - RuggedCom + 2C36F2 + HUAWEI TECHNOLOGIES CO.,LTD - 0013D6 - TII Network Technologies Inc. + E4995F + HUAWEI TECHNOLOGIES CO.,LTD - 0013DB - SHOEI Electric Ltd + A8F059 + HUAWEI TECHNOLOGIES CO.,LTD - 0013CD - MTI Ltd + 283DE8 + Guangzhou Shiyuan Electronic Technology Company Limited - 0013D3 - Micro-Star International + 180403 + vivo Mobile Communication Co., Ltd. - 0013E6 - Technolution + 206BD5 + vivo Mobile Communication Co., Ltd. - 0013DF - Ryvor Corp. + B47AF1 + Hewlett Packard Enterprise - 00138D - Kinghold + 489ECB + Hewlett Packard Enterprise - 0013ED - Psia + 9C1C12 + Hewlett Packard Enterprise - 0013B1 - Intelligent Control Systems (Asia) Pte Ltd + 04BD88 + Hewlett Packard Enterprise - 00133C - Quintron Systems Inc. + E8F724 + Hewlett Packard Enterprise - 00133D - Micro Memory Curtiss Wright Co + DC680C + Hewlett Packard Enterprise - 00133F - Eppendorf Instrumente GmbH + 48DF37 + Hewlett Packard Enterprise - 001341 - Shandong New Beiyang Information Technology Ltd + 20677C + Hewlett Packard Enterprise - 001330 - Euro Protection Surveillance + 4448C1 + Hewlett Packard Enterprise - 001325 - Cortina Systems Inc + 6828CF + Hewlett Packard Enterprise - 001331 - CellPoint Connect + E4DE40 + Hewlett Packard Enterprise - 001335 - VS Industry Berhad + 480020 + Hewlett Packard Enterprise - 00132F - Interactek + 5CA47D + Hewlett Packard Enterprise - 00134C - YDT Technology International + E89505 + Shenzhen MiaoMing Intelligent Technology Co.,Ltd - 001359 - ProTelevision Technologies A/S + DCB7AC + Hewlett Packard Enterprise - 001350 - Silver Spring Networks Inc. + 54D7E3 + Hewlett Packard Enterprise - 00137F - Cisco Systems Inc. + 14ABEC + Hewlett Packard Enterprise - 001382 - Cetacea Networks Corporation + 104F58 + Hewlett Packard Enterprise - 001390 - Termtek Computer Ltd + CCD083 + Hewlett Packard Enterprise - 001375 - American Security Products Co. + BC4632 + Fiberhome Telecommunication Technologies Co.,LTD - 001358 - Realm Systems Inc. + 685377 + Bouffalo Lab (Nanjing) Co., Ltd. - 0012C1 - Check Point Software Technologies + F05C19 + Hewlett Packard Enterprise - 0012BB - Telecommunications Industry Association TR-41 Committee + 7C573C + Hewlett Packard Enterprise - 0012B6 - Santa Barbara Infrared Inc. + 348A12 + Hewlett Packard Enterprise - 0012B9 - Fusion Digital Technology + 1063A3 + IEEE Registration Authority - 0012ED - AVG Advanced Technologies + DCA706 + CHENGDU KT ELECTRONIC HI-TECH CO.,LTD - 0012EA - Trane + E0604A + Fiberhome Telecommunication Technologies Co.,LTD - 0012E7 - Projectek Networking Electronics Corp. + 5006F5 + Roku, Inc - 0012C3 - WIT S.A. + 9816CD + leapio - 0012C8 - Perfect tech + 34516F + Skychers Creations ShenZhen Limited - 0012C6 - TGC America Inc. + C86E08 + Intel Corporate - 0012CC - Bitatek Ltd + B8374B + Hewlett Packard Enterprise - 0012FA - THX Ltd + 188637 + INGRAM MICRO SERVICES - 001306 - Always On Wireless + 78078F + HUAWEI TECHNOLOGIES CO.,LTD - 0012FD - Optimus IC S.A. + 309E62 + HUAWEI TECHNOLOGIES CO.,LTD - 001305 - Epicom Inc. + 10C0D5 + HOLOEYE Photonics AG - 0012E4 - ZIEHL Industrie-electronik GmbH + Co KG + 54FA89 + Medtronic CRM - 001297 - O2Micro Inc. + 241651 + Chipsea Technologies (Shenzhen) Corp. - 00129D - First International Computer do Brasil + 58769C + Palo Alto Networks - 00129C - Yulinet + B4C556 + Shanghai Kenmyond Industrial Network Equipment Co., Ltd - 001290 - KYOWA Electric & Machinery Corp. + EC725B + zte corporation - 001291 - KWS Computersysteme GmbH + E49282 + Samsung Electronics Co.,Ltd - 001295 - Aiware Inc. + 0009F7 + Calian Advanced Technologies - 00128B - Sensory Networks Inc + 0494E9 + FAXedge Technologies, LLC - 00128F - Montilio + 387ACC + SHENZHEN BILIAN ELECTRONIC CO.,LTD - 0012A3 - Trust International B.V. + 7C72E7 + Texas Instruments - 0012A7 - ISR TECHNOLOGIES Inc + 3030D0 + Texas Instruments - 0012AA - IEE Inc. + 54FEEB + Texas Instruments - 00129F - RAE Systems + 0884FB + Honor Device Co., Ltd. - 0012B5 - Vialta Inc. + 14BEFC + Nanjing Jiahao Technology Co., Ltd. - 0012B1 - Dai Nippon Printing Ltd + 905F7A + Apple, Inc. - 001289 - Advance Sterilization Products + F8F58C + Apple, Inc. - 001284 - Lab33 Srl + 0C85E1 + Apple, Inc. - 001281 - March Networks S.p.A. + 90FB5D + Beijing Xiaomi Mobile Software Co., Ltd - 00127E - Digital Lifestyles Group Inc. + 441690 + Wuxi Ranke Technology Co., Ltd. - 00126B - Ascalade Communications Limited + 9CA6D8 + Fiberhome Telecommunication Technologies Co.,LTD - 001233 - JRC TOKKI Ltd + 0C2A6F + Silicon Laboratories - 00125B - Kaimei Electroni + 20DBEA + Cisco Systems, Inc - 001259 - Thermo Electron Karlsruhe + A0479B + PROCITEC GmbH - 00125A - Microsoft Corporation + 74C90F + Microchip Technologies Inc - 00123D - GES Ltd + 18E204 + BEIJING COOLSHARK TECHNOLOGY CO.,LTD. - 001239 - S Net Systems Inc. + 2CB7A1 + Huawei Device Co., Ltd. - 00122F - Sanei Electric Inc. + 6C8243 + Huawei Device Co., Ltd. - 001230 - Picaso Infocommunication Ltd + B476A4 + Huawei Device Co., Ltd. - 001246 - T.O.M Technology Inc.. + 5026D2 + AVIRE Trading Limited - 001256 - LG Information & Comm. + 942453 + HUAWEI TECHNOLOGIES CO.,LTD - 001214 - Koenig & Bauer AG + 184F43 + UNIONMAN TECHNOLOGY CO.,LTD - 00120F - IEEE 802.3 + F86BFA + Infinix mobility limited - 00121D - Netfabric Corporation + B03226 + Keheng Information Industry Co., Ltd. - 00120C - CE-Infosys Pte Ltd + 84CB85 + EM Microelectronic - 0011B3 - Yoshimiya Ltd + ACF23C + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 0011B6 - Open Systems International + E45768 + vivo Mobile Communication Co., Ltd. - 0011B0 - Fortelink Inc. + 48E6C6 + IEEE Registration Authority - 0011AC - Simtec Electronics + 000417 + Schneider Electric - 0011AD - Shanghai Ruijie Technology + D01BBE + Onward Brands - 0011CD - Axsun Technologies + 246A0E + HP Inc. - 0011C5 - TEN Technology + B07C51 + Ruckus Wireless - 0011BE - AGP Telecom Ltd + 884F59 + Cisco Systems, Inc - 0011BA - Elexol Pty Ltd + 7CFA80 + JiangSu Fulian Communication Technology Co., Ltd - 0011BC - Cisco Systems Inc. + C08706 + Shenzhen Qianfenyi Intelligent Technology Co.,LTD - 0011A8 - Quest Technologies + C4B349 + Apple, Inc. - 0011A1 - Vision Netware Ltd + 34F68D + Apple, Inc. - 0011E2 - Hua Jung Components Ltd + ACB722 + Qingdao Haier Technology Co.,Ltd - 0011DA - Vivaas Technology Inc. + CC2746 + Apple, Inc. - 0011DD - FROMUS TEC Ltd + 285923 + Xiaomi Communications Co Ltd - 0011EB - Innovative Integration + D0CEC0 + Xiaomi Communications Co Ltd - 0011EA - IWICS Inc. + 0C01A5 + zte corporation - 0011E4 - Danelec Electronics A/S + 98FA9B + LCFC(Hefei) Electronics Technology co., ltd - 0011E1 - Arcelik A.S + F875A4 + LCFC(Hefei) Electronics Technology co., ltd - 0011FB - Heidelberg Engineering GmbH + 8C8CAA + LCFC(Hefei) Electronics Technology co., ltd - 0011D6 - HandEra Inc. + 701988 + Nanjing Qinheng Microelectronics Co., Ltd. - 0011CA - Long Range Systems Inc. + FC1A46 + Samsung Electronics Co.,Ltd - 0011EF - Conitec Datensysteme GmbH + 983DAE + Espressif Inc. - 00114F - US Digital Television Inc. + 5C5E0A + Samsung Electronics Co.,Ltd - 001182 - IMI Norgren Ltd + CCB0B3 + Microsoft Corporation - 00117A - Singim International Corp. + 80D52C + Beijing Cheering Networks Technology Co.,Ltd. - 001148 - Prolon Control Systems + 88B2AB + Fiberhome Telecommunication Technologies Co.,LTD - 001140 - Nanometrics Inc. + 24E3A4 + Fiberhome Telecommunication Technologies Co.,LTD - 001144 - Assurance Technology Corp + 3000FC + Nokia - 001163 - System SPA Dept. Electronics + 64DE6D + Intel Corporate - 00118F - Eutech Instruments PTE Ltd + EC4C8C + Intel Corporate - 00118D - Hanchang System Corp. + EC6652 + Info Fiber Solutions Pvt Ltd - 00115F - ITX Security Ltd + CC763A + zte corporation - 001153 - Trident Tek Inc. + 300475 + QBIC COMMUNICATIONS DMCC - 001172 - Cotron Corporation + 000AF6 + Copeland LP - 0011A0 - Vtech Engineering Canada Ltd + 5C18DD + CIG SHANGHAI CO LTD - 00119B - Telesynergy Research Inc. + 14360E + Zyxel Communications Corporation - 001191 - CTS-Clima Temperatur Systeme GmbH + 5C4EEE + AltoBeam Inc. - 001189 - Aerotech Inc + 5CC1F2 + HUAWEI TECHNOLOGIES CO.,LTD - 000FFB - Nippon Denso Industry Ltd + C805A4 + Motorola(Wuhan) Mobility Technologies Communication Co.,Ltd - 000FF2 - Loud Technologies Inc. + 0072EE + Intel Corporate - 000FF1 - nex-G Systems Pte Ltd + C858B3 + Intel Corporate - 001101 - CET Technologies Pte Ltd + E41FD5 + Intel Corporate - 000FFF - Control4 + EC1B5F + Hewlett Packard Enterprise - 000FFC - Merit Li-Lin Ent. + 1CB46C + HUAWEI TECHNOLOGIES CO.,LTD - 001113 - Fraunhofer FOKUS + E8F673 + Microsoft Corporation - 001112 - Honeywell CMSS + 7864A0 + Cisco Systems, Inc - 000FE0 - NComputing Ltd + 5CDB36 + Calix Inc. - 000FE3 - Damm Cellular Systems A/S + 4C7B35 + UNIONMAN TECHNOLOGY CO.,LTD - 001128 - Streamit + 9C45F0 + SKYLARK ELECTRONICS PVT LTD - 00113F - Alcatel DI + 409249 + Shanghai Baud Data Communication Co.,Ltd. - 001137 - Aichi Electric Ltd + 0C7E24 + Garmin International - 000FF3 - Jung Myoung Communications & Technology + 7475DF + TECLINK - 00113A - Shinboram + 686B6A + Phytium Technology Co.,Ltd. - 000F89 - Winnertec System Ltd + 3407AC + PRONYX TRADING LLC - 000FA4 - Sprecher Automation GmbH + 58B858 + SZ DJI TECHNOLOGY CO.,LTD - 000FA6 - S2 Security Corporation + 44B423 + HANWHA VISION VIETNAM COMPANY LIMITED - 000FAA - Nexus Technologies + 6887BD + zte corporation - 000FA8 - Photometrics Inc. + 3058EB + zte corporation - 000FBD - MRV Communications (Networks) Ltd + 4405B8 + Huawei Device Co., Ltd. - 000FB4 - Timespace Technology + 841A24 + UNIONMAN TECHNOLOGY CO.,LTD - 000F9D - DisplayLink (UK) Ltd + 786CAB + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 000FC5 - KeyMed Ltd + 007D3B + Samsung Electronics Co.,Ltd - 000FBF - DGT Sp. z o.o. + 5C40E3 + NOVAON - 000F92 - Microhard Systems Inc. + 986297 + Shenzhen Techwinsemi Technology Co., Ltd. - 000FCB - 3Com Corporation + E8BCE4 + Cisco Systems, Inc - 000FD5 - Schwechat - RISE + 8C8726 + VAST Data Inc - 000F67 - West Instruments + 68628A + vivo Mobile Communication Co., Ltd. - 000F6E - BBox + 2844F4 + Honor Device Co., Ltd. - 000F6F - FTA Communication Technologies + BC31E2 + New H3C Technologies Co., Ltd - 000F63 - Obzerv Technologies + 18E8EC + STMicrolectronics International NV - 000F21 - Scientific Atlanta Inc. + 28F52B + FN-LINK TECHNOLOGY Ltd. - 000F11 - Prodrive B.V. + F8EF5D + Motorola Mobility LLC, a Lenovo Company - 000F13 - Nisca Corporation + A409B3 + HUAWEI TECHNOLOGIES CO.,LTD - 000F14 - Mindray Ltd + 3C07D7 + Apple, Inc. - 000F65 - icube Corp. + A4B0F5 + Texas Instruments - 000F5D - Genexis BV + 2CD3AD + Texas Instruments - 000F58 - Adder Technology Limited + 54FB5A + Optomind Inc. - 000F12 - Panasonic Europe Ltd + 6CD7A0 + WIKO Terminal Technology (Dongguan) Co., Ltd. - 000F0E - WaveSplitter Technologies Inc. + F8E35F + Sichuan Tianyi Comheart Telecom Co.,LTD - 000F0C - Synchronic Engineering + E8E7C3 + zte corporation - 000F0B - Kentima Technologies AB + 24B2B9 + Liteon Technology Corporation - 000F46 - Sinar AG + 1C1DD3 + Apple, Inc. - 000F41 - Zipher Ltd + C81FE8 + Apple, Inc. - 000F4D - TalkSwitch + 08B95F + Silicon Laboratories - 000F71 - Sanmei Electronics Ltd + 747847 + Interdisciplinary Consulting Corporation - 000F6B - GateWare Communications GmbH + F0D506 + Ubee Interactive Co., Limited - 000ED5 - CoPAN Systems Inc. + 7CE53F + HUAWEI TECHNOLOGIES CO.,LTD - 000ECA - WTSS Inc + B423A2 + Google, Inc. - 000ECC - Tableau LLC + 38D09C + HUAWEI TECHNOLOGIES CO.,LTD - 000ECB - VineSys Technology + CC22DF + EM Microelectronic - 000ED2 - Filtronic plc + 8C2A85 + Amazon Technologies Inc. - 000EC8 - Zoran Corporation + E8C6E6 + CHANGHONG (HONGKONG) TRADING LIMITED - 000ED9 - Aksys Ltd + D4A3EB + Shenzhen iComm Semiconductor CO.,LTD - 000EB4 - Guangzhou Gaoke Communications Technology Ltd + 9C84B6 + Shenzhen iComm Semiconductor CO.,LTD - 000EB1 - Newcotech Ltd + 2067E0 + Shenzhen iComm Semiconductor CO.,LTD - 000EA9 - Shanghai Xun Shi Communications Equipment Ltd + E4D58B + Hangzhou Hikvision Digital Technology Co.,Ltd. - 000EB7 - Knovative Inc. + 0C979B + FUJIAN STAR-NET COMMUNICATION CO.,LTD - 000EFA - Optoway Technology Incorporation + 500401 + TelHi Corporation - 000EFD - Fujinon Corporation + 08F4F0 + Cisco Systems, Inc - 000EF5 - iPAC Technology Ltd + 28DB02 + zte corporation - 000EFB - Macey Enterprises + 881566 + Huawei Device Co., Ltd. - 000F09 - Private + 2845AC + Huawei Device Co., Ltd. - 000EDC - Tellion Inc. + A44380 + Huawei Device Co., Ltd. - 000ECD - Skov A/S + 1086F4 + Huawei Device Co., Ltd. - 000EDB - XiNCOM Corp. + D450EE + GD Midea Air-Conditioning Equipment Co.,Ltd. - 000EDD - Shure Incorporated + 24215E + Quectel Wireless Solutions Co.,Ltd. - 000EC2 - Lowrance Electronics Inc. + E805DC + Verifone, Inc. - 000EA3 - CNCR-IT LtdHangZhou P.R.CHINA + A0FB68 + Miba Battery Systems GmbH - 000EA2 - McAfee Inc. + 286BB4 + SJIT Co., Ltd. - 000E9B - Ambit Microsystems Corporation + 98C9BE + Shenzhen SDMC Technology CO., LTD - 000E78 - Amtelco + 6C8375 + Broadcom Limited - 000E71 - Gemstar Technology Development Ltd + D4BEDC + Roku, Inc - 000E70 - in2 Networks + 00CD90 + MAS Elektronik AG - 000E37 - Harms & Wende GmbH & Co.KG + 30ED96 + LS Mecapion - 000E31 - Olympus Soft Imaging Solutions GmbH + FC068C + SHENZHEN MICIPC TECHNOLOGY CO.,LTD - 000E2F - Roche Diagnostics GmbH + DC868D + HUAWEI TECHNOLOGIES CO.,LTD - 000E2A - Private + E8F494 + AltoBeam Inc. - 000E9E - Topfield Ltd + 48CFA9 + HUAWEI TECHNOLOGIES CO.,LTD - 000E41 - Nihon Mechatronics Ltd + D087B5 + SAFEMO PTE. LTD. - 000E3C - Transact Technologies Inc + 742584 + IEEE Registration Authority - 000E63 - Lemke Diagnostics GmbH + 40486E + Nokia Solutions and Networks GmbH & Co. KG - 000E5B - ParkerVision - Direct2Data + D8B061 + SHENZHEN WENXUN TECHNOLOGY CO.,LTD - 000E60 - 360SUN Digital Broadband Corporation + 08DD03 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 000E54 - AlphaCell Wireless Ltd + E44E12 + zte corporation - 000E4E - Waveplus Technology Ltd + CCB85E + Shenzhen Phaten Tech. LTD - 000E4A - Changchun Huayu WEBPAD Ltd + C8A702 + Hangzhou Hikvision Digital Technology Co.,Ltd. - 000E93 - Milenio 3 Sistemas Electronicos, Lda. + 2CFE8B + Microchip Technologies Inc - 000E8D - Systems in Progress Holding GmbH + 68EFAB + Vention - 000E76 - Gemsoc Innovision Inc. + B09200 + Apple, Inc. - 000E7D - Electronics Line 3000 Ltd + A0EE1A + Apple, Inc. - 000E2C - Netcodec Co. + 781EB8 + Shenzhen iComm Semiconductor CO.,LTD - 000E23 - Incipient Inc. + 584146 + Guangzhou Shiyuan Electronic Technology Company Limited - 000E25 - Hannae Technology Ltd + 9CF3AC + Apple, Inc. - 000E20 - ACCESS Systems Americas Inc. + 085D53 + Apple, Inc. - 000E21 - MTU Friedrichshafen GmbH + 542906 + Apple, Inc. - 000DD4 - Symantec Corporation + 7015FB + Intel Corporate - 000DD2 - Simrad Optronics ASA + B0475E + IEEE Registration Authority - 000DD1 - Stryker Corporation + EC8E12 + Nokia - 000DD7 - Bright + C084FF + GD Midea Air-Conditioning Equipment Co.,Ltd. - 000DD9 - Anton Paar GmbH + 10003B + Espressif Inc. - 000DDC - VAC + F8731A + zte corporation - 000DE0 - ICPDAS Ltd + CC65AD + Commscope - 000DE3 - AT Sweden AB + 789684 + Commscope - 000DEA - Kingtel Telecommunication Corp. + E8ED05 + Commscope - 000DED - Cisco Systems Inc. + D404CD + Commscope - 000DE4 - DIGINICS Inc. + 203D66 + Commscope - 000E09 - Shenzhen Coship Software Ltd + D40AA9 + Commscope - 000E05 - Wireless Matrix Corp. + 28A44A + Intel Corporate - 000E22 - Private + 1096C6 + Cisco Systems, Inc - 000E1C - Hach Company + 8C09F4 + Commscope - 000E02 - Advantech AMT Inc. + 900DCB + Commscope - 000DC9 - THALES Elektronik Systeme GmbH + 001371 + Commscope - 000D81 - Pepperl+Fuchs GmbH + 001E5A + Commscope - 000D7A - DiGATTO Asia Pacific Pte Ltd + 001CC1 + Commscope - 000D77 - FalconStor Software + 001DD2 + Commscope - 000D76 - Hokuto Denshi Ltd + 001DCD + Commscope - 000D7B - Consensys Computers Inc. + 001ADE + Commscope - 000D8F - King Tsushin Kogyo Ltd + 0023EE + Commscope - 000D89 - Bils Technology Inc + E83EFC + Commscope - 000D86 - Huber + Suhner AG + 7CBFB1 + Commscope - 000DC8 - AirMagnet Inc. + 0050E3 + Commscope - 000DBE - Bel Fuse Europe LtdUK + 001626 + Commscope - 000DBC - Cisco Systems Inc. + 001311 + Commscope - 000D9F - RF Micro Devices + 0019A6 + Commscope - 000DA5 - Fabric7 Systems Inc. + 80F503 + Commscope - 000DC5 - EchoStar Global B.V. + A055DE + Commscope - 000D99 - Orbital Sciences Corp.; Launch Systems Group + D42C0F + Commscope - 000D6C - M-Audio + FC6FB7 + Commscope - 000D70 - Datamax Corporation + FC8E7E + Commscope - 000D59 - Amity Systems Inc. + A41588 + Commscope - 000D4E - NDR Ltd + 044E5A + Commscope - 000D50 - Galazar Networks + 38700C + Commscope - 000D17 - Turbo Networks Ltd + FC51A4 + Commscope - 000D18 - Mega-Trend Electronics Ltd + 2C9E5F + Commscope - 000D20 - Asahikasei Technosystem Ltd + 40FC89 + Commscope - 000D49 - Triton Systems Of Delaware Inc. + E46449 + Commscope - 000D48 - AEWIN Technologies Ltd + 745612 + Commscope - 000D24 - Sentec E&E Ltd + 287AEE + Commscope - 000D22 - Unitronics Ltd + BC644B + Commscope - 000D14 - Vtech Innovation LP dba Advanced American Telephones + 44AAF5 + Commscope - 000D5B - Smart Empire Investments Limited + 003676 + Commscope - 000D3A - Microsoft Corporation + 7823AE + Commscope - 000D30 - IceFyre Semiconductor + 105611 + Commscope - 000D31 - Compellent Technologies Inc. + 18B81F + Commscope - 000D2C - Net2Edge Limited + 984B4A + Commscope - 000D25 - Sanden Corporation + E8825B + Commscope - 000D6F - Ember Corporation + 002136 + Commscope - 000D5E - NEC Personal Products + 002636 + Commscope - 000D3F - VTI Instruments Corporation + 509551 + Commscope - 000CE3 - Option International N.V. + 240A63 + Commscope - 000CE7 - MediaTek Inc. + F88B37 + Commscope - 000CE8 - GuangZhou AnJuBao Ltd + 88964E + Commscope - 000CE4 - NeuroCom International Inc. + CC75E2 + Commscope - 000CB5 - Premier Technolgies Inc. + 14D4FE + Commscope - 000CB6 - Nanjing SEU Mobile & Internet Technology Ltd + E49F1E + Commscope - 000CC3 - BeWAN Systems + 88C48E + UNEEVIU TECHNOLOGIES INDIA PRIVATE LIMITED - 000CB4 - AutoCell Laboratories Inc. + 402B50 + Commscope - 000CB1 - Salland Engineering (Europe) BV + 705425 + Commscope - 000CBC - Iscutum + ECA940 + Commscope - 000D04 - Foxboro Eckardt Development GmbH + E4F75B + Commscope - 000D08 - AboveCable Inc. + F8790A + Commscope - 000D05 - cybernet manufacturing Inc. + 1C937C + Commscope - 000CFE - Grand Electronic Ltd + DC2E97 + Quectel Wireless Solutions Co.,Ltd. - 000D0E - Inqnet Systems Inc. + 80E540 + Commscope - 000D11 - DENTSPLY - Gendex + C09435 + Commscope - 000CC8 - Xytronix Research & Design Inc. + 748A0D + Commscope - 000CCA - HGST a Western Digital Company + 8C763F + Commscope - 000CD0 - Symetrix + BC4548 + Beijing gpthink technology co.,LTD. - 000CD9 - Itcare Ltd + B852E0 + Beijing Xiaomi Electronics Co.,Ltd - 000CD5 - Passave Inc. + 289F04 + Samsung Electronics Co.,Ltd - 000CD2 - Schaffner EMV AG + E0854D + LG Innotek - 000A07 - WebWayOne Ltd + ACEF92 + IEEE Registration Authority - 000CB0 - Star Semiconductor Corporation + 4045A0 + vivo Mobile Communication Co., Ltd. - 000C34 - Vixen Ltd + 0CE67C + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 000C58 - M&S Systems + 58FC20 + Altice Labs - 000C51 - Scientific Technologies Inc. + 1C573E + Altice Labs - 000C73 - Telson Electronics Ltd + 78123E + TECNO MOBILE LIMITED - 000C65 - Sunin Telecom + 14B5CD + Liteon Technology Corporation - 000C6C - Eve Systems GmbH + E03ECB + Qingdao Intelligent&Precise Electronics Co.,Ltd. - 000C6F - Amtek System Ltd + 3CA9AB + Nintendo Co.,Ltd - 000C7E - Tellium Incorporated + 6CA31E + ITEL MOBILE LIMITED - 000C87 - AMD + F8F3D3 + Shenzhen Gotron electronic CO.,LTD - 000C98 - LETEK Communications Inc. + 0C47A9 + IEEE Registration Authority - 000C8E - Mentor Engineering Inc + C8FB54 + iMin Technology Pte. Ltd. - 000CA2 - Harmonic Video Network + 548450 + Tiinlab Corporation - 000CA4 - Prompttec Product Management GmbH + 689575 + Zhejiang Bodyguard Electronic Co., Ltd - 000C5B - Hanwang Technology Ltd + 20538D + Hon Hai Precision Industry Co., Ltd. - 000C60 - ACM Systems + 9CE91E + TEJAS NETWORKS LTD - 000C83 - Logical Solutions + 58DF59 + Cisco Systems, Inc - 000C96 - OQO Inc. + 0447CA + GREE ELECTRIC APPLIANCES, INC. OF ZHUHAI - 000C08 - HUMEX Technologies Corp. + C0F853 + Tuya Smart Inc. - 000C0D - Communications & Power Industries / Satcom Division + 00BC2F + Actiontec Electronics Inc. - 000C01 - Abatron AG + 30EB15 + Huawei Device Co., Ltd. - 000C39 - Sentinel Wireless Inc. + 689B43 + Huawei Device Co., Ltd. - 000C33 - Compucase Enterprise Ltd + 1C4EA2 + Shenzhen V-Link Technology CO., LTD. - 000BF6 - Nitgen Ltd + E022A1 + AltoBeam Inc. - 000BFD - Cisco Systems Inc. + 04B066 + Private - 000BFA - Exemys SRL + 4CFA9A + Shenzhen Quanxing Technology Co., Ltd - 000BF4 - Private + 284992 + Luminator Technology Group Global LLC - 000BFB - D-NET International Corporation + A8EAE4 + Weiser - 000C1D - Mettler & Fuchs AG + 9438AA + Technology Innovation Institute - 000C1E - Global Cache + 60A3E3 + TP-LINK TECHNOLOGIES CO.,LTD. - 000C1A - Quest Technical Solutions Inc. + 646306 + Xiaomi Communications Co Ltd - 000C24 - Anator + 6C9AB4 + Brodersen A/S - 000C19 - Telio Communications GmbH + E45D39 + Texas Instruments - 000C13 - MediaQ + 0490C0 + Forvia - 000C06 - Nixvue Systems Pte Ltd + 50EE32 + Hon Hai Precision Industry Co.,LTD - 000C2D - FullWave Technology Ltd + 083F21 + Motorola Mobility LLC, a Lenovo Company - 000C26 - Weintek Labs Inc. + 98E7D5 + NXP Semiconductor (Tianjin) LTD. - 000C2B - ELIAS Technology Inc. + E441D4 + vivo Mobile Communication Co., Ltd. - 000BF0 - MoTEX Products Ltd + 64447B + vivo Mobile Communication Co., Ltd. - 000BF1 - LAP Laser Applikations + 4C858A + BUFFALO.INC - 000BEE - Inc.jet Inc.orporated + 10A450 + Kwikset - 000B8D - Avvio Networks + C84805 + Nintendo Co.,Ltd - 000B85 - Cisco Systems Inc. + 80A197 + u-blox AG - 000B7F - Align Engineering LLC + 8CB6C5 + Mimosa Networks - 000BA6 - Miyakawa Electric Works Ltd + 84EAD2 + KOGANEI CORPORATION - 000B93 - Ritter Elektronik + F0DB2A + LANNER ELECTRONICS, INC. - 000B9B - Sirius System Ltd + D80FB5 + SHENZHEN ULTRAEASY TECHNOLOGY CO LTD - 000BE2 - Lumenera Corporation + ECFF3A + Apple, Inc. - 000BE1 - Nokia NET Product Operations + 701384 + Apple, Inc. - 000BA8 - Hanback Electronics Ltd + 84A824 + Google, Inc. - 000BA9 - CloudShield Technologies Inc. + 346691 + Apple, Inc. - 000BA1 - Fujikura Solutions Ltd + E01CA7 + Arista Networks - 000B8E - Ascent Corporation + A8D3C8 + Wachendorff Automation GmbH & CO.KG - 000B8F - Akita Electronics Systems Ltd + E4CDA7 + zte corporation - 000BCB - Fagor Automation , S. Coop + 488C78 + Alpha Networks Inc. - 000BC8 - AirFlow Networks + 909507 + HUAWEI TECHNOLOGIES CO.,LTD - 000BCE - Free2move AB + 8863C5 + HUAWEI TECHNOLOGIES CO.,LTD - 000BCF - Agfa NDT Inc. + 500B88 + Moxa.Inc - 000BC3 - Multiplex Inc. + 24FBE3 + HP Inc. - 000BBE - Cisco Systems Inc. + 540BB6 + Variscite LTD - 000BE0 - SercoNet Ltd + 989F1A + Private - 000BBD - Connexionz Limited + 940E2A + NXP Semiconductors Taiwan Ltd. - 000B40 - Cambridge Industries Group (CIG) + F074BF + Silicon Laboratories - 000B42 - Commax Ltd + 5C8E10 + TimeWatch Infocom Pvt. Ltd. - 000B47 - Advanced Energy + 005245 + GANATECHWIN - 000B81 - Kaparel Corporation + 44C20C + Cisco Systems, Inc - 000B82 - Grandstream Networks Inc. + F897B0 + Goki Pty Ltd - 000B6E - Neff Instrument Corp. + 88948E + Max Weishaupt SE - 000B72 - Lawo AG + 647B40 + Sichuan AI-Link Technology Co., Ltd. - 000B31 - Yantai ZhiYang Scientific and technology Industry Ltd + 2C2D48 + Commend International GmbH - 000B2F - bplan GmbH + 186041 + Arcadyan Corporation - 000B3D - CoNTAL OK Ltd + A06B4A + TCT mobile ltd - 000B4D - Emuzed + 0C7955 + Hui Zhou Gaoshengda Technology Co.,LTD - 000B24 - AirLogic + 74ADCB + New H3C Technologies Co., Ltd - 000B78 - Taifatech Inc. + 4C99E8 + ZHEJIANG DAHUA TECHNOLOGYCO.,LTD - 000B6C - Sychip Inc. + D81909 + Wiwynn Technology Service Malaysia - 0091D6 - Crystal Group Inc. + 3877CD + KOKUSAI ELECTRIC CORPORATION - 000B5A - HyperEdge + 808489 + Intel Corporate - 000B0F - Bosch Rexroth + FCB3AA + Intel Corporate - 000B0C - Agile Systems Inc. + 4C0F3E + Intel Corporate - 000B0A - dBm Optics + 94C7A8 + Jiangsu Huitong Group Co.,Ltd. - 000B09 - Ifoundry Systems Singapore + 88DDB8 + Huawei Device Co., Ltd. - 000B1D - LayerZero Power Systems Inc. + 009B08 + Quectel Wireless Solutions Co.,Ltd. - 000B19 - Vernier Networks Inc. + BCDFE1 + IEEE Registration Authority - 000B16 - Communication Machinery Corporation + 58960A + LG Electronics - 000B12 - NURI Telecom Ltd + 8CBD37 + Shenzhen Phaten Tech. LTD - 000AC5 - Color Kinetics + C4D6D3 + Dell Inc. - 000ABD - Rupprecht & Patashnick Co. + 300A9D + Axino Solutions AG - 000ACB - XPAK MSA Group + 2CD8AE + Shenzhen SEI Robotics Co.,Ltd - 000AD5 - Brainchild Electronic Ltd + C4B757 + ALPSALPINE CO,.LTD - 000AD6 - BeamReach Networks + 88F715 + Arista Networks - 000AFE - NovaPal Ltd + 90E643 + Tesla,Inc. - 000AFD - Kentec Electronics + 40B3FA + Apple, Inc. - 000AEF - Otrum ASA + 9CDA36 + TECNO MOBILE LIMITED - 000AE5 - ScottCare Corporation + 2442E3 + Shenzhen Ai-Thinker Technology Co.,Ltd - 000AB0 - LOYTEC electronics GmbH + 8CBE6F + Tianyi Telecom Terminals Company Limited - 000AB5 - Digital Electronic Network + D0C1BF + Xiaomi Communications Co Ltd - 000AD2 - JEPICO Corporation + A82BD5 + Xiaomi Communications Co Ltd - 000A98 - M+F Gwinner GmbH & Co + C0C989 + Edgecore Americas Networking Corporation - 000A9B - TB Group Inc + 04006E + Google, Inc. - 000A6C - Walchem Corporation + BCD7D4 + Roku, Inc - 000A5F - almedio Inc. + F814DD + Cisco Systems, Inc - 000A6B - Tadiran Telecom Business Systems Ltd + 0C8247 + CIG SHANGHAI CO LTD - 000A61 - Cellinx Systems Inc. + 78ED25 + New H3C Technologies Co., Ltd - 000A78 - Olitec + 447609 + New H3C Technologies Co., Ltd - 000AA9 - Brooks Automation GmbH + 04C845 + TP-Link Systems Inc. - 000AA5 - Maxlink Industries Limited + B0C61C + HUAWEI TECHNOLOGIES CO.,LTD - 000AA2 - Systek Inc. + 44BE0B + HUAWEI TECHNOLOGIES CO.,LTD - 000A5B - Power-One as + 7C9946 + Sector Alarm Tech S.L. - 000A55 - MARKEM Corporation + 5C5EBB + HUAWEI TECHNOLOGIES CO.,LTD - 000A73 - Scientific Atlanta + 402508 + Highway 9 Networks, Inc. - 000A69 - SUNNY bell Technology Ltd + 04A16F + IEEE Registration Authority - 000A84 - Rainsun Enterprise Ltd + 14392F + LEAR - 000A7E - The Advantage Group + 8C3F44 + GD Midea Air-Conditioning Equipment Co.,Ltd. - 000A4C - Molecular Devices Corporation + 3497D7 + YEALINK(XIAMEN) NETWORK TECHNOLOGY CO.,LTD. - 000A4D - Noritz Corporation + 68F62B + ITEL MOBILE LIMITED - 000A91 - HemoCue AB + 2843DC + United Memory Technology (Jiangsu) Limited - 0009F2 - Cohu Inc., Electronics Division + 9812E0 + Xiaomi Communications Co Ltd - 0009E9 - Cisco Systems Inc. + 64DD68 + Zyxel Communications Corporation - 0009DC - Galaxis Technology AG + 387707 + AltoBeam Inc. - 000A3A - J-THREE INTERNATIONAL Holding Ltd + 74CA60 + Sonos, Inc. - 000A47 - Allied Vision Technologies + 38420B + Sonos, Inc. - 000A3C - Enerpoint Ltd + A44BD9 + Hangzhou Hikvision Digital Technology Co.,Ltd. - 000A44 - Avery Dennison Deutschland GmbH + EC1BFA + EM Microelectronic - 0009F8 - Unimo Technology Ltd + 80E4BA + Intel Corporate - 0009FF - X.net 2000 GmbH + 4CD0F9 + Cisco Systems, Inc - 000A03 - Endesa Servicios, S.L. + A87971 + HUAWEI TECHNOLOGIES CO.,LTD - 0009FE - Daisy Technologies Inc. + 60DE94 + HUAWEI TECHNOLOGIES CO.,LTD - 000A28 - Motorola + 48F7BC + HUAWEI TECHNOLOGIES CO.,LTD - 000A29 - Pan Dacom Networking AG + 1C32AC + HUAWEI TECHNOLOGIES CO.,LTD - 0009EB - HuMANDATA Ltd + 183386 + HUAWEI TECHNOLOGIES CO.,LTD - 0009E8 - Cisco Systems Inc. + 30E271 + Fsas Technologies Inc. - 0009ED - CipherOptics + A47A72 + Arista Networks - 000A40 - Crown Audio -- Harmanm International + F80D4B + Nextracker, Inc. - 000A26 - CEIA S.p.A. + 201BA5 + Vizio, Inc - 000A1D - Optical Communications Products Inc. + A4B039 + Shenzhen iComm Semiconductor CO.,LTD - 000A16 - Lassen Research + 88DE39 + Hangzhou Hikvision Digital Technology Co.,Ltd. - 000A18 - Vichel Inc. + C0E350 + CHINA DRAGON TECHNOLOGY LIMITED - 000A06 - Teledex LLC + F82A53 + GD Midea Air-Conditioning Equipment Co.,Ltd. - 0009A9 - Ikanos Communications + C861D0 + SHEN ZHEN KTC TECHNOLOGY.,LTD. - 00099F - Videx Inc. + 58239B + Fiberhome Telecommunication Technologies Co.,LTD - 0009A2 - Interface Ltd + 3C0B59 + Tuya Smart Inc. - 0009A1 - Telewise Communications Inc. + 00055B + Charles Industries - 00097D - SecWell Networks Oy + 203626 + TP-Link Systems Inc - 000976 - Datasoft ISDN Systems GmbH + 4CDE48 + Huawei Device Co., Ltd. - 0009C6 - Visionics Corporation + 98E55B + Intelbras - 0009D1 - Seranoa Networks Inc + F82BE6 + IEEE Registration Authority - 0009CE - SpaceBridge Semiconductor Corp. + E4A430 + Samsung Electronics Co.,Ltd - 0009B8 - Entise Systems + 183D2D + LCFC(Hefei) Electronics Technology co., ltd - 0009AF - e-generis + 006201 + Motorola Mobility LLC, a Lenovo Company - 0009AD - Hyundai Syscomm Inc. + 08CE94 + EM Microelectronic - 0009BD - Epygi Technologies Ltd + 78E167 + Launch Tech Co., Ltd. - 0009C2 - Onity Inc. + B0A7B9 + TP-Link Systems Inc - 0009C3 - Netas + 6C5AB0 + TP-Link Systems Inc - 0009B5 - 3J Tech Ltd + 5C628B + TP-Link Systems Inc - 000982 - Loewe Opta GmbH + AC15A2 + TP-Link Systems Inc - 000983 - GlobalTop Technology Inc. + 189CE1 + Arista Networks - 0009DD - Mavin Technology Inc. + 8CE9FF + Dell Inc. - 00097A - Louis Design Labs. + 104E20 + HSE SMART - 00096B - IBM Corp + 882508 + Meta Platforms, Inc. - 00096D - Powernet Technologies Corp. + 94F929 + Meta Platforms, Inc. - 000964 - Hi-Techniques Inc. + D4D659 + Meta Platforms, Inc. - 000965 - HyunJu Computer Ltd + 785536 + shenzhen AZW Technology(Group) Co.,Ltd - 000939 - ShibaSoku Ltd + 441D64 + Espressif Inc. - 000933 - Ophit Ltd + F0090D + TP-Link Systems Inc - 000932 - Omnilux + E848B8 + TP-Link Systems Inc - 00091C - CacheVision Inc. + 8C501A + Private - 00091A - Macat Optics & Electronics Ltd + 14D881 + Beijing Xiaomi Mobile Software Co., Ltd - 00091B - Digital Generation Inc. + AC915D + Digital Control Technology Limited - 000929 - Sanyo Industries (UK) Limited + 04359B + WuLu Networks Pty Ltd - 000928 - Telecore + C04327 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 00092E - B&Tech System Inc. + 0CA94A + Shenzhen Skyworth Digital Technology CO., Ltd - 00096F - Beijing Zhongqing Elegant Tech. Corp.,Limited + BCADAE + AltoBeam Inc. - 00095E - Masstech Group Inc. + 1CFFAD + HUAWEI TECHNOLOGIES CO.,LTD - 00094F - elmegt GmbH & Co. KG + 4089C6 + Amazon Technologies Inc. - 000943 - Cisco Systems Inc. + 649D38 + Google, Inc. - 000902 - Redline Communications Inc. + 405846 + vivo Mobile Communication Co., Ltd. - 0008FA - KEB Automation KG + D0B270 + Visteon Portuguesa, Ltd - 000959 - Sitecsoft + 94A4CE + Sensear Pty Ltd - 000957 - Supercaller Inc. + A09921 + GD Midea Air-Conditioning Equipment Co.,Ltd. - 0008D2 - ZOOM Networks Inc. + 8C8ACD + HUAWEI TECHNOLOGIES CO.,LTD - 0008C5 - Liontech Ltd + 1CFC2A + HUAWEI TECHNOLOGIES CO.,LTD - 0008AA - Karam + EC2F90 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 0008AB - EnerLinx.com Inc. + A888CE + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 0008AD - Toyo-Linx Ltd + BC7EC3 + Zyxel Communications Corporation - 0008F2 - C&S Technology + 782051 + TP-Link Systems Inc. - 0008EA - Motion Control Engineering Inc. + 2CDA46 + Samsung Electronics Co.,Ltd - 0008ED - ST&T Instrument Corp. + 48EF1C + Samsung Electronics Co.,Ltd - 000888 - OULLIM Information Technology Inc,. + ECB550 + Samsung Electronics Co.,Ltd - 000885 - EMS Dr. Thomas Wunsche + E44389 + Apple, Inc. - 000872 - Sorenson Communications + 3CCD40 + Apple, Inc. - 00089A - Alcatel Microelectronics + 0097F1 + Apple, Inc. - 0008A1 - CNet Technology Inc. + 70217F + Xiaomi Communications Co Ltd - 000893 - LE Information Communication Inc. + B84FA7 + Apple, Inc. - 0008CA - TwinHan Technology Ltd + F481C4 + Apple, Inc. - 0008B6 - RouteFree Inc. + 30FC8C + Vantiva - Connected Home - 0008D8 - Dowkey Microwave + 8CEDE1 + Ubiquiti Inc - 0008DF - Alistel Inc. + 24F68D + Nokia - 0008DB - Corrigent Systems + 346F11 + Qingdao Zhipai Information Technology Co., Ltd. - 00087C - Cisco Systems Inc. + A8E6E8 + Tonly Technology Co. Ltd - 000879 - CEM Corporation + 9C891E + FireBrick Ltd - 00087D - Cisco Systems Inc. + B4EF30 + Shanghai SYH Technology CO.,LTD - 000875 - Acorp Electronics Corp. + 305253 + BuildJet, Inc. - 000816 - Bluelon ApS + 94FF34 + HANSHOW TECHNOLOGY CO.,LTD. - 000811 - VOIX Corporation + A04FE4 + PAX Computer Technology(Shenzhen) Ltd. - 000806 - Raonet Systems Inc. + 3CB8D6 + Bluebank Communication Technology Co.,Ltd. - 00086F - Resources Computer Network Ltd + B45BD1 + TP-Link Systems Inc. - 000867 - Uptime Devices + 803C04 + TP-Link Systems Inc. - 0007F8 - ITDevices Inc. + 2C7AF4 + IEEE Registration Authority - 0007F3 - Thinkengine Networks + C8C432 + SG Armaturen AS - 00081C - @pos.com + 8CBAFC + JOYNEXT GmbH - 00081E - Repeatit AB + 1897F1 + KOSTAL (Shanghai) Management Co., Ltd. - 000856 - Gamatronic Electronic Industries Ltd + F4F50B + TP-Link Systems Inc. - 000853 - Schleicher GmbH & Co. Relaiswerke KG + 040F66 + TP-Link Systems Inc. - 000826 - Colorado Med Tech + 3456FE + Cisco Meraki - 00085E - PCO AG + B80756 + Cisco Meraki - 00079A - Verint Systems Inc + A4D530 + Avaya LLC - 000774 - GuangZhou Thinker Technology Ltd + 941457 + Shenzhen Sundray Technologies company Limited - 000798 - Selea SRL + ACFC82 + Shenzhen Sundray Technologies company Limited - 000791 - International Data Communications Inc. + C8A23B + Shenzhen Sundray Technologies company Limited - 0007EE - telco Informationssysteme GmbH + 7C152D + Renesas Electronics (Penang) Sdn. Bhd. - 0007E2 - Bitworks Inc. + D8F12E + TP-Link Systems Inc. - 0007E6 - edgeflow Canada Inc. + A0885E + Anhui Xiangyao New Energy Technology Co., Ltd. - 0007E5 - Coup Corporation + 4CEF56 + Shenzhen Sundray Technologies company Limited - 0007DE - eCopilt AB + A4DB4C + RAI Institute - 0007C8 - Brain21 Inc. + 34BC5E + eero inc. - 0007C5 - Gcom Inc. + 2C91AB + AVM Audiovisuelles Marketing und Computersysteme GmbH - 0007C1 - Overture Networks Inc. + DC15C8 + AVM Audiovisuelles Marketing und Computersysteme GmbH - 0007A7 - A-Z Inc. + B0F208 + AVM Audiovisuelles Marketing und Computersysteme GmbH - 0007A6 - Leviton Manufacturing Co. Inc. + BC351E + Tuya Smart Inc. - 0007A3 - Ositis Software Inc. + 3810D5 + AVM Audiovisuelles Marketing und Computersysteme GmbH - 0007C2 - Netsys Telecom + C80E14 + AVM Audiovisuelles Marketing und Computersysteme GmbH - 00078F - Emkay Innovative Products + 008497 + Shenzhen MiaoMing Intelligent Technology Co.,Ltd - 000782 - Oracle Corporation + 287AB4 + HUAWEI TECHNOLOGIES CO.,LTD - 0007AE - Britestream Networks Inc. + 78DC87 + HUAWEI TECHNOLOGIES CO.,LTD - 0007B1 - Equator Technologies + E00855 + AVM Audiovisuelles Marketing und Computersysteme GmbH - 0005F9 - TOA Corporation + 103D3E + China Mobile Group Device Co.,Ltd. - 0007CA - Creatix Polymedia Ges Fur Kommunikaitonssysteme + 90473C + China Mobile Group Device Co.,Ltd. - 0007DF - Vbrick Systems Inc. + 74ADB7 + China Mobile Group Device Co.,Ltd. - 000744 - Unico Inc. + 78C313 + China Mobile Group Device Co.,Ltd. - 000749 - CENiX Inc. + CC5CDE + China Mobile Group Device Co.,Ltd. - 00073D - Nanjing Postel Telecommunications Ltd + 0C14D2 + China Mobile Group Device Co.,Ltd. - 000739 - Scotty Group Austria GmbH + 781053 + China Mobile Group Device Co.,Ltd. - 00074E - IPFRONT Inc + 94BE09 + China Mobile Group Device Co.,Ltd. - 000752 - Rhythm Watch Ltd + BC9E2C + China Mobile Group Device Co.,Ltd. - 00074F - Cisco Systems Inc. + C80C53 + China Mobile Group Device Co.,Ltd. - 000743 - Chelsio Communications + 544DD4 + China Mobile Group Device Co.,Ltd. - 000747 - Mecalc + C02D2E + China Mobile Group Device Co.,Ltd. - 000779 - Sungil Telecom Ltd + 7089CC + China Mobile Group Device Co.,Ltd. - 00077E - Elrest GmbH + B4D0A9 + China Mobile Group Device Co.,Ltd. - 000778 - GERSTEL GmbH & Co. KG + AC710C + China Mobile Group Device Co.,Ltd. - 00076D - Flexlight Networks + D0CBDD + eero inc. - 000730 - Hutchison OPTEL Telecom Technology Ltd + 44AC85 + eero inc. - 000722 - The Nielsen Company + 18A9ED + eero inc. - 000760 - TOMIS Information & Telecom Corp. + 80B97A + eero inc. - 000735 - Flarion Technologies Inc. + 9CA570 + eero inc. - 00075E - Ametek Power Instruments + FC3FA6 + eero inc. - 00071F - European Systems Integration + 786829 + eero inc. - 000721 - Formac Elektronik GmbH + 101D6E + Hewlett Packard Enterprise - 000786 - Wireless Networks Inc. + 044F7A + China Mobile Group Device Co.,Ltd. - 0006BC - Macrolink Inc. + D0167C + eero inc. - 0006C2 - Smartmatic Corporation + 247BA4 + China Mobile Group Device Co.,Ltd. - 000654 - Winpresa Building Automation Technologies GmbH + F45214 + Mellanox Technologies, Inc. - 0006B4 - Vorne Industries Inc. + 00258B + Mellanox Technologies, Inc. - 0006AE - Himachal Futuristic Communications Ltd + 0C42A1 + Mellanox Technologies, Inc. - 0006E5 - Fujian Newland Computer Ltd + 08C0EB + Mellanox Technologies, Inc. - 0006DE - Flash Technology + 9C0591 + Mellanox Technologies, Inc. - 0006DF - AIDONIC Corporation + 58A2E1 + Mellanox Technologies, Inc. - 0006DD - AT & T Laboratories - Cambridge Ltd + B0CF0E + Mellanox Technologies, Inc. - 0006F0 - Digeo Inc. + E49652 + vivo Mobile Communication Co., Ltd. - 000700 - Zettamedia Korea + D4A5B4 + Hengji Jiaye (Hangzhou) Technology Co., Ltd - 0006C5 - INNOVI Technologies Limited + 204D52 + Mellanox Technologies, Inc. - 0006C6 - lesswire AG + F02C59 + Chipsea Technologies (Shenzhen) Crop. - 0006B7 - TELEM GmbH + 044A69 + Shenzhen Phaten Tech. LTD - 0006EF - Maxxan Systems Inc. + FC395A + SonicWall - 0006E9 - Intime Corp. + 0CFE7B + Vantiva USA LLC - 0006EA - ELZET80 Mikrocomputer GmbH&Co. KG + B0D5FB + Google, Inc. - 000708 - Bitrage Inc. + 48D01C + AltoBeam Inc. - 000712 - JAL Information Technology + 587AB1 + Shanghai Lixun Information Technology Co., Ltd. - 000713 - IP One Inc. + 04B5C1 + ITEL MOBILE LIMITED - 000707 - Interalia Inc. + 28C97A + New H3C Technologies Co., Ltd - 0006F2 - Platys Communications + C49A89 + Suzhou K-Hiragawa Electronic Technology Co.,Ltd - 0006FA - IP SQUARE Ltd + ACBDF7 + Cisco Meraki - 000703 - CSEE Transport + C817F5 + Nanjing Qinheng Microelectronics Co., Ltd. - 000706 - Sanritz Corporation + D8B2AA + zte corporation - 0006D1 - Tahoe Networks Inc. + 9014AF + Cambium Networks Limited - 0006D4 - Interactive Objects Inc. + 2CF814 + Cisco Systems, Inc - 0006CA - American Computer & Digital Components Inc. (ACDC) + F41563 + F5 Inc. - 0006CE - Dateno + CC67D8 + Telin Semiconductor (Wuhan) Co.,Ltd - 00068E - HID Corporation + 64AC2B + Juniper Networks - 00068A - NeuronNet Ltd R&D Center + CC22FE + Apple, Inc. - 000685 - NetNearU Corporation + 34DAA1 + Apple, Inc. - 000650 - Tiburon Networks Inc. + 2C9D5A + Flaircomm Microelectronics,Inc. - 00065E - Photuris Inc. + 88DA04 + HUAWEI TECHNOLOGIES CO.,LTD - 00067F - Digeo Inc. + 04749E + HUAWEI TECHNOLOGIES CO.,LTD - 000683 - Bravara Communications Inc. + 243408 + Edgecore Americas Networking Corporation - 000655 - Yipee Inc. + 84D0DB + Guangdong Juan Intelligent Technology Joint Stock Co., Ltd. - 000676 - Novra Technologies Inc. + A86D04 + Siemens AG - 000664 - Fostex Corporation + 4C46D1 + Guangzhou V-Solution Telecommunication Technology Co.,Ltd. - 00067A - JMP Systems + DC7035 + Shengzhen Gongjin Electronics - 000673 - TKH Security Solutions USA + ECED04 + Intel Corporate - 00069B - AVT Audio Video Technologies GmbH + 9C971B + Intel Corporate - 000693 - Flexus Computer Technology Inc. + F8CF52 + Intel Corporate - 00065D - Heidelberg Web Systems + 5C6783 + Intel Corporate - 0006B0 - Comtech EF Data Corp. + 44388C + Sumitomo Electric Industries, Ltd - 000696 - Advent Networks + BC515F + Nokia Solutions and Networks India Private Limited - 0005D7 - Vista Imaging Inc. + 28D41E + Barrot Technology Co.,Ltd. - 0005DB - PSI Nentec GmbH + D49D9D + Shenzhen Goodocom lnformation Technology Co.,Ltd. - 0005DD - Cisco Systems Inc. + 7C7BBF + Samsung Electronics Co.,Ltd - 000628 - Cisco Systems Inc. + 8C2E72 + Samsung Electronics Co.,Ltd - 00061D - MIP Telecom Inc. + 80F1B2 + Espressif Inc. - 000619 - Connection Technology Systems + 007007 + Espressif Inc. - 000640 - White Rock Networks + 88127D + Shenzhen Melon Electronics Co.,Ltd - 000644 - NextGen Business Solutions Inc. + 44CBAD + Xiaomi Communications Co Ltd - 000645 - Meisei Electric Ltd + 544EF0 + Roku, Inc - A06A00 - Verilink Corporation + 0C802F + Murata Manufacturing Co., Ltd. - 0005F8 - Real Time Access Inc. + 588785 + Adtran Inc - 0005EB - Blue Ridge Networks Inc. + EC9EEA + Xtra Technology LLC - 0005E8 - TurboWave Inc. + 106519 + Shenzhen iComm Semiconductor CO.,LTD - 0005F6 - Young Chang Ltd + 18EBD4 + Shenzhen Skyworth Digital Technology CO., Ltd - 0005FC - Schenck Pegasus Corp. + E4B731 + Hangzhou Advance IOT Connectivity System Co., Ltd. - 00063A - Dura Micro Inc. + FC3882 + Infinix mobility limited - 000632 - Mesco Engineering GmbH + 48A48C + Shanghai Zenchant Electornics Co.,LTD - 000634 - GTE Airfone Inc. + C4DBAD + Ring LLC - 00060C - Melco Industries Inc. + 94FF7D + AltoBeam Inc. - 00060E - IGYS Systems Inc. + 004B0D + Huawei Device Co., Ltd. - 000614 - Prism Holdings + E04027 + Huawei Device Co., Ltd. - 000608 - At-Sky SAS + 401CD4 + Huawei Device Co., Ltd. - 0005C3 - Pacific Instruments Inc. + D47B6B + Shanghai Cygnus Semiconductor Co., Ltd. - 0005B9 - Airvana Inc. + 000271 + Zhone Technologies, Inc. - 0005BC - Resource Data Management Ltd + 000147 + Zhone Technologies, Inc. - 0005BE - Kongsberg Seatex AS + D096FB + Zhone Technologies, Inc. - 0005BD - Roax BV + 304F75 + Zhone Technologies, Inc. - 0005C1 - A-Kyung Motion Inc. + 7CC518 + vivo Mobile Communication Co., Ltd. - 0005B4 - Aceex Corporation + 7C7D21 + zte corporation - 000598 - CRONOS S.r.l. + A89A8C + zte corporation - 0005B7 - Arbor Technology Corp. + F88306 + Beijing Xiaomi Mobile Software Co., Ltd - 00059B - Cisco Systems Inc. + 986110 + HUAWEI TECHNOLOGIES CO.,LTD - 00057E - Eckelmann Steuerungstechnik GmbH + F485AE + Senbiosys SA - 000580 - FibroLAN Ltd + 605556 + Jiangxi Risound Electronics Co.,LTD - 000582 - ClearCube Technology + AC82F0 + Apple, Inc. - 0005D9 - Techno Valley Inc. + 0CCC5D + Apple, Inc. - 0005DC - Cisco Systems Inc. + 340E22 + Apple, Inc. - 0005D0 - Solinet Systems + 684A5F + Apple, Inc. - 00059F - Yotta Networks Inc. + E898EE + Apple, Inc. - 000587 - Locus Inc.orporated + 342865 + Juniper Networks - 000590 - Swissvoice Ltd + D81D13 + Texas Instruments - 000595 - Alesis Corporation + 105A95 + TP-Link Systems Inc. - 000578 - Private + F82097 + Aditya Infotech Ltd. - 000572 - Deonet Ltd + 5C7B6C + Tradit Co., Ltd - 000576 - NSM Technology Ltd + A07E16 + EM Microelectronic - 00056A - Heuft Systemtechnik GmbH + CC5EA5 + Palo Alto Networks - 000568 - Piltofish Networks AB + 1475E5 + ELMAX Srl - 0005B6 - INSYS Microelectronics GmbH + E0233B + IEEE Registration Authority - 000555 - Japan Cash Machine Ltd + 883374 + ASKEY COMPUTER CORP - 000552 - Xycotec Computer GmbH + E456CA + Fractal BMS - 00054A - Ario Data Networks Inc. + 4808EB + IEEE Registration Authority - 000548 - Disco Corporation + B8FE90 + Cisco Systems, Inc - 0004F7 - Omega Band Inc. + 34C3FD + Cisco Systems, Inc - 0004EE - Lincoln Electric Company + 648434 + BEMER Int. AG - 0004F0 - International Computers Ltd + F044D3 + Silicon Laboratories - 000527 - SJ Tek Ltd + 08FD58 + HUAWEI TECHNOLOGIES CO.,LTD - 000529 - Shanghai Broadan Communication Technology Ltd + B44389 + HUAWEI TECHNOLOGIES CO.,LTD - 00052C - Supreme Magic Corporation + 6C4725 + Rochester Network Supply, Inc. - 00053E - KID Systeme GmbH + 8049BF + Taicang T&W Electronics - 00053F - VisionTek Inc. + 6CD8FB + Qorvo Utrecht B.V. - 00053D - Agere Systems + B097E6 + FUJIAN FUCAN WECON CO LTD - 000500 - Cisco Systems Inc. + B45CB5 + Mellanox Technologies, Inc. - 000519 - Siemens Building Technologies AG, + BC89F8 + GD Midea Air-Conditioning Equipment Co.,Ltd. - 00050D - Midstream Technologies Inc. + 805722 + Wuxi Sunning Smart Devices Co., Ltd - 000534 - Northstar Engineering Ltd + F8EFB1 + Hangzhou Zhongxinghui Intelligent Technology Co., Ltd. - 000535 - Chip PC Ltd + C02E5F + Zyxel Communications Corporation - 000507 - Fine Appliance Corp. + 24A10D + IEEE Registration Authority - 0004FD - Japan Control Engineering Ltd + 002713 + Universal Global Scientific Industrial., Ltd - 000562 - Digital View Limited + CC52AF + Universal Global Scientific Industrial., Ltd - 0004E5 - Glonet Systems Inc. + FC4DD4 + Universal Global Scientific Industrial., Ltd - 0004D2 - Adcon Telemetry GmbH + 083A88 + Universal Global Scientific Industrial., Ltd - 0004D3 - Toyokeiki Ltd + F8F2F0 + Chipsea Technologies (Shenzhen) Crop. - 0004AA - Jetstream Communications + E42F37 + Apple, Inc. - 0004A0 - Verity Instruments Inc. + A493AD + Huawei Device Co., Ltd. - 00049E - Wirelink Ltd + 2C3AB1 + Huawei Device Co., Ltd. - 00049A - Cisco Systems Inc. + 20F1B2 + Tuya Smart Inc. - 000479 - Radius Ltd + A8C050 + Quectel Wireless Solutions Co.,Ltd. - 0004B0 - ELESIGN Ltd + 1CC3AB + Espressif Inc. - 0004AB - Mavenir Inc. + 58044F + TP-Link Systems Inc. - 0004A7 - FabiaTech Corporation + B4B853 + Honor Device Co., Ltd. - 000498 - Mahi Networks + E04F43 + Universal Global Scientific Industrial., Ltd - 000497 - MacroSystem Digital Video AG + 083BC1 + Hangzhou Hikvision Digital Technology Co.,Ltd. - 0004D5 - Hitachi Information & Communication Engineering Ltd + 64BD6D + Apple, Inc. - 0004CA - FreeMs Corp. + E8C386 + Apple, Inc. - 000488 - Eurotherm Controls + 2CDCAD + WNC Corporation - 000485 - PicoLight + B8B7F1 + WNC Corporation - 0004DA - Relax Technology Inc. + 44E4EE + WNC Corporation - 0004C5 - ASE Technologies, USA + 2C9FFB + WNC Corporation - 000436 - ELANsat Technologies Inc. + 1CD6BE + WNC Corporation - 000432 - Voyetra Turtle Beach Inc. + 7061BE + WNC Corporation - 000437 - Powin Information Technology Inc. + 60E6F0 + WNC Corporation - 00040C - Kanno Works Ltd + 80EA23 + WNC Corporation - 000408 - Sanko Electronics Ltd + 48A9D2 + WNC Corporation - 000407 - Topcon Positioning Systems Inc. + BC307D + WNC Corporation - 000409 - Cratos Networks + BC307E + WNC Corporation - 000455 - ANTARA.net + 001BB1 + WNC Corporation - 000457 - Universal Access Technology Inc. + E48EC5 + HUAWEI TECHNOLOGIES CO.,LTD - 00044D - Cisco Systems Inc. + 4CE65E + HUAWEI TECHNOLOGIES CO.,LTD - 000454 - Quadriga UK + A46185 + Tools for Humanity Corporation - 000448 - Polaroid Corporation + 8C579B + WNC Corporation - 000447 - Acrowave Systems Ltd + 7CA236 + Verizon Connect - 00043E - Telencomm + 88A68D + Shanghai MXCHIP Information Technology Co., Ltd. - 00046D - Cisco Systems Inc. + D44F14 + Tesla,Inc. - 000466 - ARMITEL Co. + 3426E6 + CIG SHANGHAI CO LTD - 0003E2 - Comspace Corporation + 38B800 + WNC Corporation - 0003FF - Microsoft Corporation + 401A58 + WNC Corporation - 000414 - Umezawa Musen Denki Ltd + 282E89 + WNC Corporation - 000428 - Cisco Systems Inc. + 388D3D + WNC Corporation - 000386 - Ho Net Inc. + 8C8B5B + WNC Corporation - 00037D - Stellcom + 68EFA8 + AutomationDirect.com - 000383 - Metera Networks Inc. + C06E3D + SHENZHEN TECNO TECHNOLOGY - 0003CC - Momentum Computer Inc. + 0C7474 + Fiberhome Telecommunication Technologies Co.,LTD - 0003D7 - NextNet Wireless Inc. + 94270E + Intel Corporate - 0003D3 - Internet Energy Systems Inc. + 7C013E + GSD VIET NAM TECHNOLOGY COMPANY LIMITED - 0003CD - Clovertech Inc. + 108321 + Yichip Microelectronics (Hangzhou) Co.,Ltd - 00038B - PLUS-ONE I&T Inc. + 18CC88 + Hitachi Global Life Solutions, Inc. - 00038C - Total Impact + 5496CB + AMPAK Technology Inc. - 0003EE - MKNet Corporation + 9041B2 + Ubiquiti Inc - 0003EA - Mega System Technologies Inc. + D017B7 + Atios AG - 0003E6 - Entone Inc. + F0D32B + Juniper Networks - 0003A9 - AXCENT Media AG + 001ED1 + TKH Security B.V. - 00039F - Cisco Systems Inc. + 18FD00 + Marelli - 000390 - Digital Video Communications Inc. + A4C139 + Dongguan Huayin Electronic Technology Co., Ltd. - 0003B5 - Entra Technology Co. + 60D877 + Phyplus Technology (Shanghai) Co., Ltd - 000364 - Scenix Semiconductor Inc. + 84FC14 + SHENZHEN BILIAN ELECTRONIC CO.,LTD - 00035E - Metropolitan Area Networks Inc. + 543976 + Groq - 00035C - Saint Song Corp. + 189677 + Annapurna labs - 00035D - Bosung Hi-Net Ltd + 785FA4 + Ciena Corporation - 000379 - Proscend Communications Inc. + 9811CC + Ciena Corporation - 00036F - Telsey SPA + 90FB93 + Renesas Design US Inc. - 000372 - Ulan + 6CA042 + Silicon Laboratories - 00033A - Silicon Wave Inc. + D83A36 + AltoBeam Inc. - 000332 - Cisco Systems Inc. + F05582 + Arashi Vision Inc. - 00030E - Core Communications Ltd + 6C76F7 + MainStreaming SpA - 000312 - TRsystems GmbH + F0BC50 + Mellanox Technologies, Inc. - 000341 - Axon Digital Design + 40A44A + Google, Inc. - 008037 - Ericsson Group + 0CF2F5 + Sichuan AI-Link Technology Co., Ltd. - 00033D - ILSHin Lab + D0458D + Shenzhen Skyworth Digital Technology CO., Ltd - 000366 - ASM Pacific Technology + 9C2410 + Bouffalo Lab (Nanjing) Co., Ltd. - 000362 - Vodtel Communications Inc. + 941865 + NETGEAR - 00034D - Chiaro Networks Ltd + E046EE + NETGEAR - 000322 - IDIS Ltd + 00184D + NETGEAR - 00031D - Taiwan Commate Computer Inc. + 001E2A + NETGEAR - 000326 - Iwasaki Information Systems Ltd + 00146C + NETGEAR - 000290 - Woorigisool Inc. + E091F5 + NETGEAR - 000292 - Logic Innovations Inc. + 744401 + NETGEAR - 000286 - Occam Networks + 4494FC + NETGEAR - 0002D2 - Workstation AG + 20E52A + NETGEAR - 0002CD - TeleDream Inc. + B03956 + NETGEAR - 0002D0 - Comdial Corporation + 3C1ACC + Quectel Wireless Solutions Co.,Ltd. - 0002CC - M.C.C.I + 38FBA0 + Shenzhen Baseus Technology CoLtd - 0002B0 - Hokubu Communication & Industrial Ltd + A4B256 + Shenzhen Incar Technology Co., Ltd. - 0002AA - PLcom Ltd + 589835 + Vantiva Technologies Belgium - 0002B5 - Avnet Inc. + C4EA1D + Vantiva Technologies Belgium - 0002B4 - Daphne + A491B1 + Vantiva Technologies Belgium - 0002AC - 3PAR data + D8E374 + Xiaomi Communications Co Ltd - 0002D9 - Reliable Controls + D878F0 + Silicon Laboratories - 0002EF - CCC Network Systems Group Ltd + D4351D + Vantiva Technologies Belgium - 0002E8 - E.D.&A. + 007AA4 + FRITZ! Technology GmbH - 0002F2 - eDevice Inc. + 20B83D + UNIONMAN TECHNOLOGY CO.,LTD - 00029D - Merix Corp. + ACEA70 + ZUNDA Inc. - 0002C5 - Evertz Microsystems Ltd + 20E15D + TP-Link Systems Inc. - 00024A - Cisco Systems Inc. + 1C0460 + NXP Semiconductors Taiwan Ltd. - 000249 - Aviv Infocom Ltd + EC5B71 + Inventec(Chongqing) Corporation - 000245 - Lampus Ltd + 74D082 + HISENSE VISUAL TECHNOLOGY CO.,LTD - 000232 - Avision Inc. + 98535F + HUAWEI TECHNOLOGIES CO.,LTD - 000235 - Paragon Networks International + B0FB15 + Ezurio, LLC - 000237 - Cosmo Research Corp. + ECC07A + Ezurio, LLC - 000228 - Necsom Ltd + 2C2FF4 + eero inc. - 000246 - All-Win Tech Ltd + 2453ED + Dell Inc. - 00023A - ZSK Stickmaschinen GmbH + A4CF03 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 00027F - ask-technologies.com + FCE6C6 + China Mobile Group Device Co.,Ltd. - 00027E - Cisco Systems Inc. + 6C3E51 + Mindray North America - 001095 - Thomson Inc. + 141826 + Nokia - 00025D - Calix Networks + 20E59B + Panasonic Automotive Systems - 00027B - Amplify Net Inc. + 0CE709 + Sentyron B.V - 000273 - Coriolis Networks + B082E2 + ASUSTek COMPUTER INC. - 000257 - Microcom Corp. + 3C49FF + UNIONMAN TECHNOLOGY CO.,LTD - 000253 - Televideo Inc. + 24559A + Apple, Inc. - 00026F - Senao International Ltd + 4CE650 + Apple, Inc. - 000230 - Intersoft Electronics + EC1AC3 + Ugreen Group Limited - 00021C - Network Elements Inc. + E47319 + Huawei Device Co., Ltd. - 00020C - Metro-Optix + BCBCCA + Huawei Device Co., Ltd. - 000216 - Cisco Systems Inc. + A0FDD9 + UNIONMAN TECHNOLOGY CO.,LTD - 000214 - Dtvro + BC2B1E + Cresyn Co., Ltd. - 00020F - Aatr + 6C68A4 + Guangzhou V-Solution Telecommunication Technology Co.,Ltd. - 0001C3 - Acromag Inc. + A4C0B0 + Drivenets - 0001C2 - ARK Research Corp. + 90C952 + Durin, Inc - 0001EA - Cirilium Corp. + DC226F + HangZhou Nano IC Technologies Co., Ltd - 0001E0 - Fast Systems Inc. + 0CC763 + eero inc. - 0001AC - Sitara Networks Inc. + 98A942 + Tozed Kangwei Tech Co., Ltd - 0001ED - SETA Corp. + 28D6EC + HUAWEI TECHNOLOGIES CO.,LTD - 0001F6 - Association Of Musical Electronics Industry + ACE011 + HUAWEI TECHNOLOGIES CO.,LTD - 0001CB - EVR + B86468 + BBSakura Networks, Inc. - 0001D6 - manroland AG + 086A0B + Cisco Meraki - 0001AD - Coach Master International d.b.a. CMI Worldwide Inc. + C86340 + Cisco Meraki - 000188 - LXCO Technologies ag + 34F015 + Beijing Xiaomi Mobile Software Co., Ltd - 00019B - Kyoto Microcomputer Ltd + FC268C + Signify B.V. - 00017F - Experience Music Project + E83DC1 + Espressif Inc. - 00015A - Digital Video Broadcasting + 247121 + Cisco Systems, Inc - 00012A - Telematica Sistems Inteligente + BCABF5 + Cisco Systems, Inc - 000166 - TC Group A/S + B8C924 + Cisco Systems, Inc - 000176 - Orient Silver Enterprises + A0F262 + Espressif Inc. - 000158 - Electro Industries/Gauge Tech + A05866 + Qorvo Utrecht B.V. - 00012D - Komodo Technology + 7C6D12 + Microsoft Corporation - 000148 - X-traWeb Inc. + CCC4B2 + Shenzhen Trolink Technology Co.,LTD - 000187 - I2SE GmbH + 60B4A2 + Samsung Electronics Co.,Ltd - 000180 - AOpen Inc. + 140B9E + Samsung Electronics Co.,Ltd - 000197 - Cisco Systems Inc. + 64CE0C + Funshion Online Technologies Co.,Ltd - 00019A - LEUNIG GmbH + 8813C2 + Tendyron Corporation - 000159 - S1 Corporation + 844880 + Amazon Technologies Inc. - 000171 - Allied Data Technologies + 00124F + Chemelex LLC - 0030AC - Systeme Lauer GmbH & Ltd + F03012 + AUMOVIO Autonomous Mobility Germany GmbH - 0030FB - AZS Technology AG + B4DDD0 + AUMOVIO Hungary Kft. - 0030AE - Times N System Inc. + 30F03A + UEI Electronics Private Ltd. - 003003 - Phasys Ltd + 942D3A + PRIZOR VIZTECH LIMITED - 0030E2 - Garnet Systems Ltd + 081814 + Hewlett Packard Enterprise - 00013A - Shelcad Communications Ltd + 44BDC8 + Xiaomi Communications Co Ltd - 000140 - Sendtek Corporation + 30487D + Tuya Smart Inc. - 000123 - Schneider Electric Japan Holdings Ltd + D0CDBF + LG Electronics - 000125 - Yaesu Musen Ltd + 94EAE7 + Lynq Technologies - 000126 - PAC Labs + 908A80 + Cisco Systems, Inc - 00011B - Unizone Technologies Inc. + 00B463 + Ring LLC - 00011D - Centillium Communications + A4F01F + CANON INC. - 00011F - RC Networks Inc. + 90B9F9 + Motorola Mobility LLC, a Lenovo Company - 00B080 - Mannesmann Ipulsys B.V. + 046F00 + LG Electronics - 00B01E - Rantic Labs Inc. + 5C13AC + Apple, Inc. - 00B0F0 - Caly Networks + 0CE5A1 + Apple, Inc. - 00B09A - Morrow Technologies Corp. + 0CA3B2 + Apple, Inc. - 00302E - Hoft & Wessel AG + 242AEA + Apple, Inc. - 0030ED - Expert Magnetics Corp. + 98E859 + Apple, Inc. - 00300F - IMT - Information Management T + D83EEB + AltoBeam Inc. - 003082 - Taihan Electric Wire Ltd + 5C4879 + HUAWEI TECHNOLOGIES CO.,LTD - 0030A9 - Netiverse Inc. + DC575C + PR Electronics A/S - 0030FE - DSA GmbH + 384712 + Luxottica Tristar (Dongguan) Optical Co.,Ltd - 0030C4 - Canon Imaging Systems Inc. + 64B4E8 + Shenzhen D-Robotics Co., Ltd. - 00304D - ESI + 546C50 + Nanjing Qinheng Microelectronics Co., Ltd. - 081443 - Unibrain S.A. + E485FB + Quectel Wireless Solutions Co.,Ltd. - 00B009 - Grass Valley, A Belden Brand + B8BA66 + Microsoft Corporation - 00B0AC - SIAE-Microelettronica S.p.A. + 28ADEA + Mallow SAS - 003023 - Cogent Computer Systems Inc. + 6065F4 + Chipsea Technologies (Shenzhen) Crop. - 003090 - Cyra Technologies Inc. + B07A16 + ROEHN - 0030A7 - Schweitzer Engineering + 589EC6 + Gigaset Technologies GmbH - 00307C - Adid SA + B861FC + Juniper Networks - 003055 - Renesas Technology America Inc. + E847F3 + upscale ai - 00302F - GE Aviation System + 4068F9 + Shenzhen SuperElectron Technology Co.,Ltd. - 00300E - Klotz Digital AG + 981223 + Tarmoc Network LTD - 0030D5 - DResearch GmbH + 2CF8EC + Quectel Wireless Solutions Co.,Ltd. - 003018 - Jetway Information Ltd + 84C665 + Taicang T&W Electronics - 00309F - Amber Networks + 6C9188 + Nokia - 0030A8 - OL'E Communications Inc. + 083C03 + IEEE Registration Authority - 0030D1 - Inova Corporation + 0009D8 + Telia Company AB - 0030BB - CacheFlow Inc. + 346F3F + Hon Hai Precision Industry Co.,LTD - 0030AF - Honeywell GmbH + 1449C5 + Huawei Device Co., Ltd. - 0030AA - Axus Microsystems Inc. + B454F2 + Huawei Device Co., Ltd. - 003089 - Spectrapoint Wireless LLC + 68F90F + Intel Corporate - 00309A - Astro Terra Corp. + D08E17 + ACCTON TECHNOLOGY CORPORATION - 003087 - Vega Grieshaber KG + 54A0AB + Maiyue Future Intelligent Technology (Suzhou) Co.,Ltd. - 003062 - IP Video Networks Inc + 80C2F0 + Xiamen Yeastar Digital Technology Co.,Ltd - 00302D - Quantum Bridge Communications + E4C801 + BLU Products Inc - 0030CB - Omni Flow Computers Inc. + 8C6914 + FREEBOX SAS - 00306B - Cmos Systems Inc. + 246477 + Beijing Xiaomi Mobile Software Co., Ltd - 0030AD - Shanghai Communication + 7CB40F + Fibocom Wireless Inc. - 0030CF - TWO Technologies Inc. + 509FB9 + Shenzhen Skyworth Digital Technology CO., Ltd - 0030B2 - L-3 Sonoma EO + DC7EF5 + HUAWEI TECHNOLOGIES CO.,LTD - 003035 - Corning Incorporated + 8CD066 + Texas Instruments - 00307F - Irlan Ltd + 4463C2 + Zyxel Communications Corporation - 00D015 - Univex Microtechnology Corp. + 3420D3 + SHENZHEN IP-COM NETWORKS CO.,LTD. - 00D048 - Ecton Inc. + 78D366 + GuangZhou Dazzleview Intelligent Technology Co., Ltd - 00D0A5 - American Arium + 646BE7 + Qingdao Intelligent&Precise Electronics Co.,Ltd. - 00305D - Digitra Systems Inc. + 248AB3 + ICTK Co., Ltd. - 003036 - RMP Elektroniksysteme GmbH + 7C62E7 + Cisco Systems, Inc - 00D0CF - Moreton BAY + 10D8B1 + AUO Corporation - 00D07F - Strategy & Technology, Limited + BC0023 + Honor Device Co., Ltd. - 0030E6 - Draeger Medical Systems Inc. + 887CC1 + Zebronics India Pvt Ltd - 0030BD - Belkin Components + 3CCB01 + Beijing Lingji innovations Technology Co., LTD. - 003007 - Opti Inc. + 181454 + CIG SHANGHAI CO LTD - 00D0C2 - Balthazar Technology AB + 9CFA96 + T3 Technology Co., Ltd. - 00D022 - Incredible Technologies Inc. + E4FEE4 + Ciena Corporation - 00D071 - Echelon Corp. + 80B5C6 + OMRON Corporation - 00D04F - Bitronics Inc. + 48785B + Hangzhou Hikvision Digital Technology Co.,Ltd. - 00D069 - Technologic Systems + 607AD8 + GD Midea Air-Conditioning Equipment Co.,Ltd. - 00D090 - Cisco Systems Inc. + F074C1 + Blink by Amazon - 00D0F5 - Orange Micro Inc. + 000B7C + Electro-Voice Dynacord LLC - 00D0E9 - Advantage Century Telecommunication Corp. + 8C4EBB + Amazon Technologies Inc. - 00D094 - Seeion Control LLC + EC315F + Amazon Technologies Inc. - 00D0FB - TEK Microsystems Inc.orporated + 709684 + Apple, Inc. - 00D066 - Wintriss Engineering Corp. + CCBE61 + Apple, Inc. - 00D082 - Iowave Inc. + B857D6 + Cisco Systems, Inc - 00D081 - RTD Embedded Technologies Inc. + E40274 + FW Murphy Production Controls - 00D002 - Ditech Corporation + 140A02 + SHENZHEN BILIAN ELECTRONIC CO.,LTD - 00D085 - Otis Elevator Company + 38E158 + Flaircomm Microelectronics,Inc. - 00D011 - Prism Video Inc. + 007F1D + Fantasia Trading LLC - 00D0DF - Kuzumi Electronics Inc. + 58219D + Shanghai Timar Integrated Circuit Co., LTD - 00D09B - Spectel Ltd + 3C7F6E + Xiaomi Communications Co Ltd - 00D067 - Campio Communications + 407955 + Datacolor - 00D058 - Cisco Systems Inc. + 00078B + Wegener Communications, Inc. - 00D032 - Yano Electric Ltd + 001A2A + Arcadyan Corporation - 00D0F1 - Sega Enterprises Ltd + 5CDC96 + Arcadyan Corporation - 00D03A - Zoneworx Inc. + 743170 + Arcadyan Corporation - 00D001 - VST Technologies Inc. + D8855E + zte corporation - 00503E - Cisco Systems Inc. + 1883BF + Arcadyan Corporation - 005020 - Mediastar Ltd + 1CC63C + Arcadyan Corporation - 00D075 - Alaris Medical Systems Inc. + 88252C + Arcadyan Corporation - 00D0E1 - Avionitek Israel Inc. + E40A75 + Silicon Laboratories - 00D008 - Mactell Corporation + EC6FF9 + Pioseed Technology(Chengdu)Co.,Ltd. - 00D0D9 - Dedicated Microcomputers + D85C11 + Optiview USA - 00D00B - RHK Technology Inc. + B07AA4 + Guangzhou Punp Electronics Manufacturing Co., Ltd. - 00D09C - Kapadia Communications + 506188 + PLANET Technology Corporation - 00D0F3 - Solari DI Udine SPA + 18DC12 + Silicon Laboratories - 00D039 - Utilicom Inc. + F8E000 + FUJI ELECTRIC CO., LTD. - 00D0A0 - Mips Denmark + 8C9885 + Samsung Electronics Co.,Ltd - 00D00A - Lanaccess Telecom S.A. + F8ECFE + Owl Home Inc. - 00D01C - SBS Technologies, + E0E805 + SERNET (SUZHOU) TECHNOLOGIES CORPORATION - 00D0D5 - Grundig AG + 44CE1D + Nokia - 00D041 - Amigo Technology Ltd + D0B646 + NXP Semiconductors Taiwan Ltd. - 00D09D - Veris Industries + 54735A + Huawei Device Co., Ltd. - 00D06D - Acrison Inc. + E8C3C5 + Huawei Device Co., Ltd. - 00D02B - Jetcell Inc. + C83049 + Huawei Device Co., Ltd. - 00D062 - Digigram + D42B6F + Cisco Systems, Inc - 00D08D - Phoenix Group Inc. + AC2241 + HUAWEI TECHNOLOGIES CO.,LTD - 00D03D - Galileo Technology Ltd + D00477 + HUAWEI TECHNOLOGIES CO.,LTD - 0050C6 - Loop Telecommunication International Inc. + D47327 + HUAWEI TECHNOLOGIES CO.,LTD - 00509F - Horizon Computer + 3422CF + AUMOVIO Systems, Inc. - 0050A5 - Capitol Business Systems Ltd + D082EB + Tuya Smart Inc. - 005000 - Nexo Communications Inc. + 3C714B + HUMAX NETWORKS - 005090 - Dctri + 086480 + Black Sesame Technologies Co., Ltd - 00503B - Mediafire Corporation + C0BA1F + Xiamen Milesight IoT Co., Ltd. - 005046 - Menicx International Ltd + E09559 + Arcadyan Corporation - 005041 - Coretronic Corporation + 28047A + WNC Corporation - 0050B0 - Technology Atlanta Corporation + B8D08F + Quectel Wireless Solutions Co.,Ltd. - 0050DD - Serra Soldadura, S.A. + F84068 + SZ DJI Ronin Technology Co., Ltd. - 005063 - Oy Comsel System AB + 24BA79 + New H3C Technologies Co., Ltd - 00508D - Abit Computer Corporation + 30535B + Shenzhen Comnect Technology Co.,LTD - 0050A0 - Delta Computer Systems Inc. + 0C025B + Microchip Technology Inc. - 005066 - AtecoM GmbH advanced telecomunication modules + A8754E + Nexlawn Intelligent Technology (Suzhou) Co., Ltd. - 005059 - iBAHN + 589204 + zte corporation - 0050D9 - ENGETRON-ENGENHARIA ELETRONICA Ind. e CoM LtdA + 480951 + Guangzhou Trustmo Information System Co.,LTD - 005001 - Yamashita Systems Corp. + 74E665 + Dynabook Technology (Hangzhou) Inc. - 005067 - Aerocomm Inc. + ECB293 + Hewlett Packard Enterprise - 0050B6 - Good WAY Ind Ltd + A43CD4 + JBL Professional - 00504B - Barconet N.V. + FC376D + SHENZHEN BILIAN ELECTRONIC CO.,LTD - 0050EA - XEL Communications Inc. + 50DA9E + SHEN ZHEN TENDA TECHNOLOGY CO.,LTD - 0050C8 - Addonics Technologies Inc. + 3C8B6E + Mellanox Technologies, Inc. - 0050C4 - IMD + 7C4FAD + Espressif Inc. - 005089 - Safety Management Systems + 90D733 + HUAWEI TECHNOLOGIES CO.,LTD - 0050F4 - Sigmatek GmbH & Co. KG + 1C5BA2 + HP GLOBALES MEXICO - 005021 - EIS International Inc. + C4969F + Amazon Technologies Inc. - 00505E - Digitek Micrologic S.A. + 344EE2 + Huawei Device Co., Ltd. - 0050AE - FDK Ltd + 7C852F + Huawei Device Co., Ltd. - 0050E7 - Paradise Innovations (Asia) + 78966E + Huawei Device Co., Ltd. - 0050FB - VSK Electronics + 3C381F + Huawei Device Co., Ltd. - 009073 - Gaio Technology + DC87F8 + Samsung Electronics Co.,Ltd - 00907B - E-Tech Inc. + 4CECEE + Samsung Electronics Co.,Ltd - 009081 - Aloha Networks Inc. + 2872C6 + Samsung Electronics Co.,Ltd - 00901C - mps Software GmbH + 841985 + Samsung Electronics Co.,Ltd - 005086 - Telkom SA Ltd + 5C1715 + ODrive Robotics - 00501A - IQinVision + D8CFB1 + BRIGHT TECHNOLOGIES INDIA PRIVATE LIMITED - 00508F - Asita Technologies Int'l Ltd + 0C2643 + Cisco Systems, Inc - 005015 - Bright Star Engineering + 08638A + Cisco Systems, Inc - 005057 - Broadband Access Systems + C0A4CF + Nintendo Co.,Ltd - 005088 - Amano Corporation + 2C4B14 + Sichuan Tianyi Comheart Telecom Co.,LTD - 005031 - Aeroflex Laboratories Inc. + 087618 + ViTrox Technologies Sdn. Bhd - 0090DB - Next Level Communications + A05D0E + ALPSALPINE CO.,LTD. - 009056 - Telestream Inc. + 60F723 + Beijing Xiaomi Mobile Software Co., Ltd - 009068 - DVT Corp. + 6CA613 + AltoBeam Inc. - 00905E - Rauland-Borg Corporation + 5818B4 + Chengdu Quanjing Intelligent Technology Co.,Ltd - 0090AF - J. Morita MFG. Corp. + 702393 + Polytech A/S - 005003 - Xrite Inc + E4C0E2 + Sagemcom Broadband SAS - 0050D3 - Digital Audio Processing Pty Ltd + 64FD96 + Sagemcom Broadband SAS - 0050AD - CommUnique Wireless Corp. + 3C5836 + Sagemcom Broadband SAS - 0050AF - Intergon Inc. + FC6637 + Sagemcom Broadband SAS - 009034 - Imagic Inc. + 7C90E9 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 0090AA - Indigo Active Vision Systems Limited + 3814A1 + LG Innotek - 00905B - Raymond AND LAE Engineering + 3089EC + Nintendo Co.,Ltd - 0090BC - Telemann Ltd + 300916 + Apple, Inc. - 00900A - Proton Electronic Industrial Ltd + 602ED5 + Apple, Inc. - 0090F8 - Mediatrix Telecom + 7C4FCD + Apple, Inc. - 009010 - Simulation Laboratories Inc. + F4A1A6 + Apple, Inc. - 0090C6 - Optim Systems Inc. + 14D537 + All Inspire Health Inc. - 00902E - Namco Limited + D00C5E + Nanjing Qinheng Microelectronics Co., Ltd. - 009037 - Acucomm Inc. + A087BE + Apple, Inc. - 009078 - MER Telemanagement Solutions Ltd + 34F8DD + Apple, Inc. - 0090B8 - Rohde & Schwarz GmbH & Co. KG + 7CD62C + Apple, Inc. - 00901A - Unisphere Solutions + 6C688A + Amazon Technologies Inc. - 0090B5 - Nikon Corporation + 000521 + Schneider Electric - 009005 - Protech Systems Ltd + C44268 + CRESTRON ELECTRONICS, INC. - 009059 - Telecom Device K.K. + FCB948 + McScience Inc. - 0090CA - Accord Video Telecommunications Ltd + 441DE5 + XCENA Inc. - 0090E9 - Janz Computer AG + 58F658 + Edifier International - 0090EB - Sentry Telecom Systems + E0D239 + TECHNOLID, LLC - 0090FE - Elecom Ltd (Laneed Div.) + AC236E + Apismoon Electric Pte. Ltd. - 0090BB - TAINET CoMMUNICATION SysTEM Corp. + FC1119 + Silicon Laboratories - 009090 - I-BUS + 940F3B + ASKEY COMPUTER CORP - 0090D5 - Euphonix Inc. + 6C92F6 + Arista Networks - 00904A - Concur System Technologies + E4D436 + Nokia Solutions and Networks India Private Limited - 00908F - Audio Codes Ltd + 7CA05E + Motorola Mobility LLC, a Lenovo Company - 00909E - Critical IO LLC + 30FD34 + COMMANDO Networks Pvt Ltd. - 001092 - Netcore Inc. + F0C71F + Arista Networks - 00101C - OHM Technologies Intl LLC + 0003CA + Temposonics, LLC - 001046 - Alcorn Mcbride Inc. + 5C8DFD + Clariphotonics CO., Ltd - 001028 - Computer Technica Inc. + 647999 + Sagemcom Broadband SAS - 0010B7 - Coyote Technologies LLC + 68ABA9 + Sagemcom Broadband SAS - 0090E5 - Teknema Inc. + CCFAF1 + Sagemcom Broadband SAS - 0090F4 - Lightning Instrumentation + A03C20 + Sagemcom Broadband SAS - 009074 - Argon Networks Inc. + 186A81 + Sagemcom Broadband SAS - 00909F - Digi-Data Corporation + A07F8A + Sagemcom Broadband SAS - 00903B - TriEMS Research Lab Inc. + 603FFB + Telink Micro LLC - 0010C9 - Mitsubishi Electronics Logistic Support Co. + B0D616 + Super Micro Computer, Inc. - 000400 - Lexmark International Inc. + C4EB43 + Sagemcom Broadband SAS - 0010C5 - Protocol Technologies Inc. + C4EB41 + Sagemcom Broadband SAS - 00101A - PictureTel Corp. + 943C96 + Sagemcom Broadband SAS - 001047 - Echo Eletric Ltd + 2CF2A5 + Sagemcom Broadband SAS - 0010A5 - Oxford Instruments + C4EB39 + Sagemcom Broadband SAS - 0010D7 - Argosy Research Inc. + 5464D9 + Sagemcom Broadband SAS - 00102C - Lasat Networks A/S + 18622C + Sagemcom Broadband SAS - 0010FD - Cocom A/S + 3C81D8 + Sagemcom Broadband SAS - 009019 - Hermes Electronics Ltd + 40F201 + Sagemcom Broadband SAS - 0090D8 - Whitecross Systems + D084B0 + Sagemcom Broadband SAS - 00104E - Ceologic + 247F20 + Sagemcom Broadband SAS - 0010C2 - Willnet Inc. + 88A6C6 + Sagemcom Broadband SAS - 001040 - Intermec Corporation + 904D4A + Sagemcom Broadband SAS - 00102E - Network Systems & Technologies PVT Ltd + 4065A3 + Sagemcom Broadband SAS - 0010B0 - Meridian Technology Corp. + B86685 + Sagemcom Broadband SAS - 001021 - Encanto Networks Inc. + 302478 + Sagemcom Broadband SAS - 001064 - Dnpg LLC + D8A756 + Sagemcom Broadband SAS - 001074 - Aten International Ltd + 6CBAB8 + Sagemcom Broadband SAS - 00109E - Aware Inc. + 8CC5B4 + Sagemcom Broadband SAS - 001005 - UEC Commercial + D4F829 + Sagemcom Broadband SAS - 0010B8 - Ishigaki Computer System Co. + 700B01 + Sagemcom Broadband SAS - 00108B - Laseranimation Sollinger GmbH + A08E78 + Sagemcom Broadband SAS - 0010C7 - Data Transmission Network + 0037B7 + Sagemcom Broadband SAS - 001070 - Caradon Trend Ltd + 001E74 + Sagemcom Broadband SAS - 0010BA - Martinho-Davis Systems Inc. + FC4A47 + Nokia - 0010B4 - Atmosphere Networks + 083AF2 + Espressif Inc. - 0004AC - IBM Corp + 94B97E + Espressif Inc. - 001067 - Ericsson + 4C7525 + Espressif Inc. - 00E07D - Netronix Inc. + 9C9C1F + Espressif Inc. - 00E028 - Aptix Corporation + 98CDAC + Espressif Inc. - 00E08C - Neoparadigm Labs Inc. + D4D4DA + Espressif Inc. - 00E0A1 - HIMA PAUL HILDEBRANDT GmbH Co. KG + 404CCA + Espressif Inc. - 00E088 - LTX-Credence CoRPORATION + FCB467 + Espressif Inc. - 00E05D - Unitec Ltd + D8BC38 + Espressif Inc. - 00E05E - Japan Aviation Electronics Industry Ltd + E09806 + Espressif Inc. - 00E09D - Sarnoff Corporation + F4CFA2 + Espressif Inc. - 00E058 - Phase ONE Denmark A/S + 10521C + Espressif Inc. - 00E076 - Development Concepts Inc. + 40F520 + Espressif Inc. - 00E0F8 - Dicna Control AB + 34865D + Espressif Inc. - 00E0F2 - Arlotto Comnet Inc. + 84F703 + Espressif Inc. - 00E0E1 - G2 Networks Inc. + 1C9DC2 + Espressif Inc. - 00E03D - Focon Electronic Systems A/S + 4CEBD6 + Espressif Inc. - 00E046 - Bently Nevada Corp. + 44BD8D + Espressif Inc. - 00E07B - BAY Networks + C88541 + Espressif Inc. - 00E01D - WebTV NETWORKS Inc. + 90649B + Espressif Inc. - 00E0CD - Saab Sensis Corporation + F42DC9 + Espressif Inc. - 00E08D - Pressure Systems Inc. + B0CBD8 + Espressif Inc. - 00E019 - ING. Giordano Elettronica + E8F60A + Espressif Inc. - 00E047 - Infocus Corporation + D4F98D + Espressif Inc. - 00E0C3 - Sakai System Development Corp. + E831CD + Espressif Inc. - 00E092 - Admtek Incorporated + D8F15B + Espressif Inc. - 00E0FF - SECURITY DYNAMICS TECHNOLOGIES Inc. + 30AEA4 + Espressif Inc. - 00E0AB - Dimat S.A. + 748B23 + Samsung Electronics Co.,Ltd - 00E030 - Melita International Corp. + 200D3D + Quectel Wireless Solutions Co.,Ltd. - 00E033 - E.E.P.D. GmbH + 9454C5 + Espressif Inc. - 00E0A2 - Microslate Inc. + 78421C + Espressif Inc. - 00E079 - A.T.N.R. + 5C013B + Espressif Inc. - 00E075 - Verilink Corporation + 28372F + Espressif Inc. - 006039 - SanCom Technology Inc. + CC7B5C + Espressif Inc. - 006049 - Vina Technologies + FCE8C0 + Espressif Inc. - 00608D - Unipulse Corp. + 142B2F + Espressif Inc. - 00E02E - SPC Electronics Corporation + 885721 + Espressif Inc. - 00E09A - Positron Inc. + B81F3F + Espressif Inc. - 00E03E - Alfatech Inc. + 90DA72 + Espressif Inc. - 006099 - SBE Inc. + 48CA43 + Espressif Inc. - 0060B3 - Z-CoM Inc. + E80690 + Espressif Inc. - 006002 - Screen Subtitling Systems Ltd + 34CDB0 + Espressif Inc. - 006089 - Xata + 14335C + Espressif Inc. - 006021 - DSC Corporation + 9888E0 + Espressif Inc. - 0060B8 - CoRELIS Inc. + 98A316 + Espressif Inc. - 00E0AA - Electrosonic Ltd + 98F199 + NEC Platforms, Ltd. - 00E010 - HESS SB-AUTOMATENBAU GmbH + 4C80FB + Google, Inc. - 00E0D2 - Versanet Communications Inc. + 3C3300 + SHENZHEN BILIAN ELECTRONIC CO.,LTD - 0060CE - Acclaim Communications + ACA213 + SHENZHEN BILIAN ELECTRONIC CO.,LTD - 006036 - AIT Austrian Institute Of Technology GmbH + 44334C + SHENZHEN BILIAN ELECTRONIC CO.,LTD - 00608E - HE ELECTRONICS, TECHNOLOGIE & SysTEMTECHNIK GmbH + 445E82 + Zyxel Communications Corporation - 00601A - Keithley Instruments + F4B19C + AltoBeam Inc. - 00606A - Mitsubishi Wireless Communications Inc. + A0CA4A + AltoBeam Inc. - 0060AD - MegaChips Corporation + 1C7C98 + NEC Platforms, Ltd. - 006055 - Cornell University + 1C4A3B + ACCTON TECHNOLOGY CORPORATION - 00606D - Digital Equipment Corp. + 74A235 + IEEE Registration Authority - 0060B9 - NEC Platforms Ltd + F4848D + TP-LINK TECHNOLOGIES CO.,LTD. - 00609C - Perkin-Elmer Incorporated + 687724 + TP-LINK TECHNOLOGIES CO.,LTD. - 0060CF - Alteon Networks Inc. + 403F8C + TP-LINK TECHNOLOGIES CO.,LTD. - 006075 - Pentek Inc. + 4C10D5 + TP-LINK TECHNOLOGIES CO.,LTD. - 0060B7 - Channelmatic Inc. + 60292B + TP-LINK TECHNOLOGIES CO.,LTD. - 006006 - Sotec Ltd + 7844FD + TP-LINK TECHNOLOGIES CO.,LTD. - 0060BA - Sahara Networks Inc. + B006EC + Nexquome Pte Limited - 006098 - HT Communications + 3816B3 + HP Inc. - 0060DE - Kayser-Threde GmbH + 446690 + TP-LINK TECHNOLOGIES CO.,LTD. - 0060D0 - Snmp Research Incorporated + 80EA07 + TP-LINK TECHNOLOGIES CO.,LTD. - 006015 - NET2NET Corporation + 50D4F7 + TP-LINK TECHNOLOGIES CO.,LTD. - 00609D - PMI Food Equipment Group + 9CBCA6 + Hewlett Packard Enterprise - 0060A2 - Nihon Unisys Limited Co. + 28806E + Pirelli Tyre S.p.A. - 006084 - Digital Video + 682E3C + Ubiquiti Inc - 00602D - Alerton Technologies Inc. + 982AC3 + Silicon Laboratories - 0060F8 - Loran International Technologies Inc. + B47E9F + Xiaomi Communications Co Ltd - 006078 - Power Measurement Ltd + C0C7B5 + Infinix mobility limited - 0060E8 - Hitachi Computer Products (America) Inc. + D082E8 + Tuya Smart Inc. - 0060F6 - Nextest Communications Products Inc. + 6C3DD8 + Espressif Systems (Singapore) Pte. Ltd - 006072 - VXL Instruments, Limited + 4CD012 + Apple, Inc. - 006051 - Quality Semiconductor + 08E64B + Apple, Inc. - 006092 - Micro/Sys Inc. + 8CC246 + Apple, Inc. - 00609E - ASC X3 - Information Technology Standards Secretariats + F4B24E + Huawei Device Co., Ltd. - 006010 - Network Machines Inc. + 9449F6 + Huawei Device Co., Ltd. - 006044 - Litton/Poly-Scientific + 38736E + Huawei Device Co., Ltd. - 006004 - Computadores Modulares SA + F406A3 + Huawei Device Co., Ltd. - 0060E2 - Quest Engineering & Development + 2068AA + Potron Technology Co.,Ltd., - 0060B4 - Glenayre R&D Inc. + 5C23C2 + Apple, Inc. - 00A01D - Red Lion Controls, LP + 0066DC + Apple, Inc. - 00A0A6 - M.I. Systems, K.K. + 7C59B1 + Apple, Inc. - 00A051 - Angia Communications Inc. + 80D175 + iPanel.TV Inc. - 00A013 - Teltrend Ltd + 84C7BB + Espressif Inc. - 00A0B9 - Eagle Technology Inc. + 3454EF + Cisco Systems, Inc - 00A019 - Nebula Consultants Inc. + 588FA7 + LG Innotek - 00A0ED - Brooks Automation Inc. + 885BDD + Extreme Networks, Inc. - 0060CA - Harmonic Systems Incorporated + 206C8A + Extreme Networks, Inc. - 006024 - Gradient Technologies Inc. + 4018B1 + Extreme Networks, Inc. - 0060AF - Pacific Micro Data Inc. + 40882F + Extreme Networks, Inc. - 006038 - Nortel Networks + E444E5 + Extreme Networks, Inc. - 00604F - Tattile SRL + F02F50 + Shenzhen SEI Robotics Co.,Ltd - 00A0D0 - TEN X Technology Inc. + B85001 + Extreme Networks, Inc. - 00A0BC - Viasat Inc.orporated + A4EA8E + Extreme Networks, Inc. - 00A05B - Marquip Inc. + 949B2C + Extreme Networks, Inc. - 00A08C - MultiMedia LANs Inc. + 744F80 + shenzhen Amos Electronics Co.,Ltd - 00A058 - Glory Ltd + 348584 + Extreme Networks, Inc. - 00A077 - Fujitsu Nexion Inc. + B81BCB + Shanghai Sunmi Technology Co.,Ltd. - 00A0A0 - Compact Data Ltd + 74D59C + fluidiQ by Magnalytix - 00A038 - Email Electronics + 241FBD + Extreme Networks, Inc. - 00A065 - Symantec Corporation + DCE650 + Extreme Networks, Inc. - 00A0A3 - Reliable Power Meters + 7896A3 + Extreme Networks, Inc. - 00A01B - Premisys Communications Inc. + 6C0370 + Extreme Networks, Inc. - 00A055 - Data Device Corporation + 00E60E + Extreme Networks, Inc. - 00A074 - Perception Technology + ACED32 + Extreme Networks, Inc. - 00A07F - GSM-Syntel Ltd + B4A3BD + Extreme Networks, Inc. - 00A029 - Coulter Corporation + AC7F8D + Extreme Networks, Inc. - 00A087 - Microsemi Corporation + E4FD8C + Extreme Networks, Inc. - 00A043 - American Technology Labs Inc. + 4C0A4E + Extreme Networks, Inc. - 00A042 - Spur Products Corp. + D4126E + Apple, Inc. - 00A0C1 - Ortivus Medical AB + ECD508 + Apple, Inc. - 00A04F - Ameritec Corp. + E02A25 + Shenzhen Intellirocks Tech. Co. Ltd. - 00A0CF - Sotas Inc. + 900C0F + Flume-io, Inc. - 00A072 - Ovation Systems Ltd + 28E971 + EM Microelectronic - 00A082 - NKT Elektronik A/S + 6CA0AF + CM PARTNER INC. - 00A0F0 - Toronto Microelectronics Inc. + 64C9F1 + Amazon Technologies Inc. - 00A0D7 - Kasten Chase Applied Research + 0C1B7B + Microsoft Corporation - 00A0F1 - MTI + 10A4C9 + Apple, Inc. - 00A0B3 - Zykronix + 24814E + AMD - 00A0FF - Tellabs Operations Inc. + 3476C5 + I-O DATA, INC. - 00A0E5 - NHC Communications + 9C961B + IFTER Jerzy Taczalski - 00A036 - Applied Network Technology + B00C9D + Quectel Wireless Solutions Co.,Ltd. - 00A0D2 - Allied Telesis International Corporation + F0AB1F + zte corporation - 00A09B - Qpsx Communications Ltd + 7CB30A + zte corporation - 00A000 - Centillion Networks Inc. + 58696C + Ruijie Networks Co.,LTD - 00A08A - Brooktrout Technology Inc. + 8C8394 + Arcadyan Corporation - 00A07B - Dawn Computer Incorporation + CC14BC + Edifier International - 00A05C - Inventory Conversion Inc./ + B0104B + Fiberhome Telecommunication Technologies Co.,LTD - 00200F - EBRAINS Inc + 44365D + Shenzhen HippStor Technology Co., Ltd - 00A0D3 - Instem Computer Systems Ltd + 54C078 + Infinix mobility limited - 00A0B4 - Texas Microsystems Inc. + E81711 + Shenzhen Vipstech Co., Ltd - 00A060 - Acer Peripherals Inc. + 200B74 + AzureWave Technology Inc. - 00A083 - Asimmphony Turkey + F8FE5E + Intel Corporate - 00A0AA - Spacelabs Medical + 4C62DF + Hangzhou Hikvision Digital Technology Co.,Ltd. - 00A03B - Toshin Electric Ltd + 102874 + Shenzhen Jingxun Technology Co., Ltd. - 00A0F3 - Staubli + E4E26C + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 0020DF - Kyosan Electric MFG Ltd + 88F916 + Qingdao Dayu Dance Digital Technology Co.,Ltd - 0020C7 - AKAI Professional M.I. Corp. + 38C0EA + Fortinet, Inc. - 00A004 - Netpower Inc. + D094CF + HUAWEI TECHNOLOGIES CO.,LTD - 002029 - Teleprocessing Products Inc. + 043855 + Scopus International Pvt. Ltd. - 002069 - Isdn Systems Corporation + 9C4952 + Dongguan Liesheng Electronic Co., Ltd. - 00208B - Lapis Technologies Inc. + C022F1 + IEEE Registration Authority - 00202B - Advanced Telecommunications Modules Ltd + 446D05 + NoTraffic - 00206B - Konica Minolta Holdings Inc. + 542259 + HUAWEI TECHNOLOGIES CO.,LTD - 002004 - Yamatake-Honeywell Ltd + 041471 + HUAWEI TECHNOLOGIES CO.,LTD - 002015 - Actis Computer SA + C816A5 + Masimo Corporation - 002099 - BON Electric Ltd + 18C009 + New H3C Technologies Co., Ltd - 0020F9 - Paralink Networks Inc. + 706173 + Calantec GmbH - 002092 - Chess Engineering B.V. + C89D6D + ITEL MOBILE LIMITED - 002043 - Neuron Company Limited + ECAB3E + ESSYS - 002071 - IBR GmbH + 384A80 + Samsung Electronics Co.,Ltd - 00207C - Autec GmbH + 900E9E + Shenzhen SuperElectron Technology Co.,Ltd. - 002057 - TITZE DATENTECHNIK GmbH + 54F29F + HUNAN FN-LINK TECHNOLOGY LIMITED - 0020E5 - Apex Data Inc. + C82E18 + Espressif Inc. - 002087 - Memotec Inc. + E86BEA + Espressif Inc. - 0020BC - Long Reach Networks Pty Ltd + 4CA0D4 + Telink Semiconductor (Shanghai) Co., Ltd. - 00C0C0 - Shore Microsystems Inc. + A8B483 + Shenzhen SuperElectron Technology Co.,Ltd. - 00C00C - Relia Technolgies + 6855D4 + Seiko Epson Corporation - 00C073 - Xedia Corporation + D422CD + Movella Technologies B.V. - 00C0D4 - Axon Networks Inc. + 0C659A + Panasonic Automotive Systems Company of America - 00C0CD - Comelta, S.A. + 00409E + Concurrent Technologies Ltd. - 0020ED - Giga-Byte Technology Ltd + 288EB9 + Wacom Co.,Ltd. - 002085 - Eaton Corporation + BC2411 + Proxmox Server Solutions GmbH - 0020CD - Hybrid Networks Inc. + DC6880 + zte corporation - 00202E - Daystar Digital + 28BBED + Bouffalo Lab (Nanjing) Co., Ltd. - 0020B3 - Tattile SRL + 344E2F + LEAR - 0020EE - Gtech Corporation + 98EDCA + Fiberhome Telecommunication Technologies Co.,LTD - 00204C - Mitron Computer PTE Ltd + ECB0D2 + EM Microelectronic - 002017 - Orbotech + 4CEB76 + Murrelektronik GmbH - 002093 - Landings Technology Corp. + BC8D1F + Cisco Systems, Inc - 002063 - Wipro Infotech Ltd + 88A6EF + IEEE Registration Authority - 002016 - Showa Electric Wire & Cable Co + 84F5EB + zte corporation - 00204D - Inovis GmbH + D8E72F + Chipsea Technologies (Shenzhen) Corp. - 00205F - Gammadata Computer GmbH + 74C76E + RTK-TECHNOLOGIES, LLC - 00201F - Best Power Technology Inc. + C493BB + Beijing Xiaomi Mobile Software Co., Ltd - 0020B6 - Agile Networks Inc. + E89C25 + ASUSTek COMPUTER INC. - 0020D1 - Microcomputer Systems (M) SDN. + ECC38A + Accuenergy (CANADA) Inc - 0020CE - Logical Design Group Inc. + 14993E + Xiaomi Communications Co Ltd - 002014 - Global View Ltd + 78467D + SKAIChips - 0020C2 - Texas Memory Systems Inc. + EC748C + Sony Interactive Entertainment Inc. - 00C0F3 - Network Communications Corp. + B04FA6 + DongGuan Ramaxel Memory Technology - 002056 - Neoproducts + 4C9992 + vivo Mobile Communication Co., Ltd. - 002042 - Datametrics Corp. + 045791 + Shenzhenshi Xinzhongxin Technology Co.Ltd - 002078 - Runtop Inc. + 54DF1B + Vestel Elektronik San ve Tic. A.S. - 002006 - Garrett Communications Inc. + 38F9F5 + Garmin International - 002024 - Pacific Communication Sciences + 60BD2C + Taicang T&W Electronics - 00205D - Nanomatic Oy + 2C4C15 + Juniper Networks - 00C005 - Livingston Enterprises Inc. + E41088 + Samsung Electronics Co.,Ltd - 00C077 - Daewoo Telecom Ltd + 000CC8 + Xytronix Research & Design, Inc. - 00C0C8 - Micro Byte Pty Ltd + 14C050 + GUANGDONG GENIUS TECHNOLOGY CO., LTD. - 00C069 - Axxcelera Broadband Wireless + 441A4C + xFusion Digital Technologies Co.,Ltd. - 00C067 - United Barcode Industries + 4C62CD + Nokia - 00C0A3 - Dual Enterprises Corporation + 98DA92 + Vuzix Corporation - 00C018 - Lanart Corporation + 9CF86B + AgiTech Distribution Limited - Linki - 009D8E - Cardiac Recorders Inc. + 1071FA + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 00BB01 - Octothorpe Corp. + 78465C + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 00C033 - Telebit Communications APS + D0DD7C + zte corporation - 00C090 - Praim S.R.L. + 843C99 + zte corporation - 00C0DE - Zcomm Inc. + F83B1D + Vantiva USA LLC - 00C013 - Netrix + E4BFFA + Vantiva USA LLC - 00C06B - OSI Plus Corporation + 1C9D72 + Vantiva USA LLC - 00C04C - Department Of Foreign Affairs + 3C82C0 + Vantiva USA LLC - 00C07C - Hightech Information + 80DAC2 + Vantiva USA LLC - 00C0B8 - Fraser'S Hill Ltd + 481B40 + Vantiva USA LLC - 00C062 - Impulse Technology + B85E71 + Vantiva USA LLC - 00C0EC - Dauphin Technology + 400FC1 + Vantiva USA LLC - 00C086 - THE Lynk Corporation + 107B93 + Zhen Shi Information Technology (Shanghai) Co., Ltd. - 00C058 - Dataexpert Corp. + 705A9E + Vantiva USA LLC - 00C0D0 - Ratoc System Inc. + 68E59E + Cisco Systems, Inc - 00C0BF - Technology Concepts Ltd + F8E5CE + Apple, Inc. - 00C0BA - Netvantage + 14B7F8 + Vantiva USA LLC - 00C05E - Vari-Lite Inc. + 1062D0 + Vantiva USA LLC - 00C0D5 - Werbeagentur Jurgen Siebert + 10C25A + Vantiva USA LLC - 00C063 - Morning Star Technologies Inc. + D08A91 + Vantiva USA LLC - 00C021 - Netexpress + 88F7C7 + Vantiva USA LLC - 00C0DB - IPC Corporation (PTE) Ltd + 0C0227 + Vantiva USA LLC - 00C0E3 - Ositech Communications Inc. + F4C114 + Vantiva USA LLC - 00C0FE - Aptec Computer Systems Inc. + 74978E + Nova Labs - 00C016 - Electronic Theatre Controls + 0823C6 + HUAWEI TECHNOLOGIES CO.,LTD - 00C0BC - Telecom Australia/Cssc + 7036B2 + Focusai Corp - 00C0C1 - Quad/Graphics Inc. + 4CD717 + Dell Inc. - 00C089 - Telindus Distribution + C87F54 + ASUSTek COMPUTER INC. - 00C0B0 - GCC Technologies,Inc. + 1CC992 + Honor Device Co., Ltd. - 00C00A - Micro Craft + 08D1F9 + Espressif Inc. - 00C074 - Toyoda Automatic Loom + 34B7DA + Espressif Inc. - 00404E - Fluent Inc. + 00C711 + ITEL MOBILE LIMITED - 00408D - THE Goodyear Tire & Rubber Co. + 348D52 + Sichuan Tianyi Comheart Telecom Co.,LTD - 00401B - Printer Systems Corp. + 1C860B + Guangdong Taiying Technology Co.,Ltd - 0040A3 - Microunity Systems Engineering + 74D713 + Huaqin Technology Co. LTD - 0040B3 - ParTech Inc. + 2CC3E6 + SHENZHEN BILIAN ELECTRONIC CO.,LTD - 00401D - Invisible Software Inc. + F020FF + Intel Corporate - 00C0CA - Alfa Inc. + C88A9A + Intel Corporate - 00C06C - Svec Computer Corp. + 90837E + Fiberhome Telecommunication Technologies Co.,LTD - 0040FF - Telebit Corporation + CCB071 + Fiberhome Telecommunication Technologies Co.,LTD - 00401F - Colorgraph Ltd + 485541 + Iskratel d.o.o. - 0040AF - Digital Products Inc. + F09008 + Shenzhen Skyworth Digital Technology CO., Ltd - 0040F7 - Polaroid Corporation + C84C78 + zte corporation - 004037 - SEA-Ilan Inc. + 802D1A + zte corporation - 00C026 - Lans Technology Ltd + 6823F4 + Shenzhen Jinlangxin Technology Co., Ltd - 00407E - Evergreen Systems Inc. + A0B339 + Intel Corporate - 0040F9 - Combinet + 6CF6DA + Intel Corporate - 00C0A7 - Seel Ltd + C86BBC + IEEE Registration Authority - 00C04A - Group 2000 AG + 30600A + CIG SHANGHAI CO LTD - 004054 - Connection Machines Services + 302F1E + SIEMENS AG - 004004 - ICM Ltd + FCB2D6 + CIG SHANGHAI CO LTD - 004018 - Adobe Systems Inc. + 60FCF1 + Private - 00404A - West Australian Department + 5476B2 + Raisecom Technology CO., LTD - 00403C - Forks Inc. + 6074F4 + Private - 004042 - N.A.T. GmbH + A03768 + Shenzhen E-Life Intelligence Technology Co.,Ltd. - 0040F2 - Janich & Klass Computertechnik + 44FA66 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 0040A2 - Kingstar Technology Inc. + 847ADF + FUJIAN STAR-NET COMMUNICATION CO.,LTD - 0040DC - Tritec Electronic GmbH + 6813F3 + Amazon Technologies Inc. - 004060 - Comendec Ltd + 806D97 + Private - 004056 - MCM Japan Ltd + 28EB0A + Rolling Wireless S.a.r.l. Luxembourg - 004030 - GK Computer + 848A59 + Hisilicon Technologies Co., Ltd - 004040 - Ring Access Inc. + DCCD66 + NXP Semiconductor (Tianjin) LTD. - 008057 - Adsoft Ltd + B0FF72 + IEEE Registration Authority - 0080BB - Hughes LAN Systems + 649A63 + Ring LLC - 00403D - Teradata Corporation + 102834 + SALZ Automation GmbH - 0040D0 - Mitac International Corp. + 4C70CC + Blyott NV - 0040B6 - Computerm Corporation + 586861 + VIASAT, INCORPORATED - 0040A6 - Cray Inc. + 14C9CF + Sigmastar Technology Ltd. - 00403E - Raster OPS Corporation + 148554 + Earda Technologies co Ltd - 004046 - UDC Research Limited + 60C01E + V&G Information System Co.,Ltd - 00C0D7 - Taiwan Trading Center DBA + 2C3C05 + Marinesync Corp - 0040DA - Telspec Ltd + 0008B9 + Kaon Group Co., Ltd. - 0040C7 - Ruby Tech Corporation + 98CCF3 + Amazon Technologies Inc. - 004052 - Star Technologies Inc. + F02178 + UNIONMAN TECHNOLOGY CO.,LTD - 00402E - Precision Software Inc. + 2C3EBF + HOSIN Global Electronics Co., Ltd. - 00402B - Trigem Computer Inc. + 40D563 + HANA Electronics - 00401A - Fuji Electric Ltd + 348818 + Cisco Systems, Inc - 00405F - AFE Computers Ltd + 005001 + YAMASHITA SYSTEMS CORP. - 004080 - Athenix Corporation + 6CEEF7 + shenzhen scodeno technology co., Ltd. - 004051 - Garbee and Garbee + B440DC + Samsung Electronics Co.,Ltd - 00407A - Societe D'Exploitation DU Cnit + 3C3332 + D-Link Corporation - 004031 - Kokusai Electric Ltd + 6417CD + Samsung Electronics Co.,Ltd - 0040D3 - Kimpsion International Corp. + DC69E2 + Samsung Electronics Co.,Ltd - 0040EE - Optimem + C05064 + SHENNAN CIRCUITS CO.,LTD - 004025 - Molecular Dynamics + 9CFB77 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 004067 - Omnibyte Corporation + 643E0A + HUAWEI TECHNOLOGIES CO.,LTD - 0040C3 - Fischer AND Porter Co. + 143375 + Zyxel Communications Corporation - 0040EC - Mikasa System Engineering + 2CFEE2 + Qingdao Hisense Communications Co.,Ltd. - 00802F - National Instruments Corp. + 001457 + Nevion - 008054 - Frontier Technologies Corp. + C4D666 + Cisco Meraki - 008053 - Intellicom Inc. + 18DE50 + Tuya Smart Inc. - 008026 - Network Products Corporation + 947918 + ITEL MOBILE LIMITED - 0080B0 - Advanced Information + 68F0B5 + Honor Device Co., Ltd. - 0080FA - RWT GmbH + 101849 + WEIFANG GOERTEK ELECTRONICS CO.,LTD - 0080FD - Exsceed Corpration + 08F9E0 + Espressif Inc. - 0080FE - Azure Technologies Inc. + 0036D7 + Keltron IOT Corp. - 00803C - TVS Electronics Ltd + 34DC99 + New H3C Technologies Co., Ltd - 008046 - Tattile SRL + 5CE8D3 + Signalinks Communication Technology Co., Ltd - 004002 - Perle Systems Limited + 80802C + Fortinet, Inc. - 004049 - Roche Diagnostics International Ltd + 4831B7 + Espressif Inc. - 004029 - Compex + 543204 + Espressif Inc. - 00409E - Concurrent Technologies Ltd + CCB54C + Texas Instruments - 0080AD - Cnet Technology Inc. + 74A58C + Texas Instruments - 00800E - Atlantix Corporation + 3CE002 + Texas Instruments - 0080AB - Dukane Network Integration + 402A8F + Shanghai High-Flying Electronics Technology Co., Ltd - 0080F1 - Opus Systems + B03893 + Onda TLC Italia S.r.l. - 008029 - Eagle Technology Inc. + 28C1A0 + Apple, Inc. - 008072 - Microplex Systems Ltd + EC2C73 + Apple, Inc. - 004001 - Zero One Technology Ltd + 7CC06F + Apple, Inc. - 004071 - ATM Computer GmbH + EC8150 + Apple, Inc. - 008011 - Digital Systems Int'l Inc. + D42FCA + Apple, Inc. - 008034 - SMT Goupil + D058A5 + Apple, Inc. - 0080E4 - Northwest Digital Systems Inc. + B09738 + Shenzhen Skyworth Digital Technology CO., Ltd - 0080EC - Supercomputing Solutions Inc. + 8CDF2C + vivo Mobile Communication Co., Ltd. - 00802C - THE Sage Group PLC + F87928 + zte corporation - 0080D6 - Nuvotech Inc. + 2C67AB + EZELINK TELECOM - 00800A - Japan Computer Corp. + 2CD7FF + LANCOM Systems GmbH - 00804B - Eagle Technologies Pty Ltd + 98038A + Texas Instruments - 0080C8 - D-Link Systems Inc. + F8B8B4 + Shenzhen Skyworth Digital Technology CO., Ltd - 008012 - Integrated Measurement Systems + 681AA4 + Shenzhen Skyworth Digital Technology CO., Ltd - 008027 - Adaptive Systems Inc. + 48555E + Shenzhen Skyworth Digital Technology CO., Ltd - 0080FC - Avatar Corporation + 700692 + IEEE Registration Authority - 008016 - Wandel AND Goltermann + 1C880C + Shenzhen Skyworth Digital Technology CO., Ltd - 0080A2 - Creative Electronic Systems + 348511 + Shenzhen Skyworth Digital Technology CO., Ltd - 0080CC - Microwave Bypass Systems + 943FD6 + Apple, Inc. - 0080A5 - Speed International + 38B5C9 + INGRAM MICRO SERVICES - 008079 - Microbus Designs Ltd + 984B06 + HUAWEI TECHNOLOGIES CO.,LTD - 000079 - Networth Incorporated + ACFF6B + HUAWEI TECHNOLOGIES CO.,LTD - 000091 - Anritsu Corporation + 844DBE + Fiberhome Telecommunication Technologies Co.,LTD - 000075 - Nortel Networks + 38AB16 + NPO RTT LLC - 0000A5 - Tattile SRL + 44A842 + Dell Inc. - 000036 - Atari Corporation + 4C7625 + Dell Inc. - 0000F8 - Digital Equipment Corporation + 001143 + Dell Inc. - 00805C - Agilis Corporation + 001372 + Dell Inc. - 0080C5 - Novellco de Mexico + 00188B + Dell Inc. - 008078 - Practical Peripherals Inc. + 80B946 + Nokia - 0080F6 - Synergy Microsystems + F8CAB8 + Dell Inc. - 00807B - Artel Communications Corp. + F01FAF + Dell Inc. - 008014 - Esprit Systems + 18A99B + Dell Inc. - 0080B7 - Stellar Computer + F8BC12 + Dell Inc. - 0000ED - April + 002067 + Private - 0000A3 - Network Application Technology + ACDE48 + Private - 000039 - Toshiba Corporation + 0050C7 + Private - 00003C - Auspex Systems Inc. + E8655F + Dell Inc. - 00007E - Clustrix Corporation + E8B265 + Dell Inc. - 0000CB - Compu-Shack Electronic GmbH + AC91A1 + Dell Inc. - 000013 - Camex + C4CBE1 + Dell Inc. - 000095 - Sony Tektronix Corp. + 381428 + Dell Inc. - 000057 - Scitex Corporation Ltd + F4EE08 + Dell Inc. - 0000D6 - Punch Line Holding + 908D6E + Dell Inc. - 00009E - Marli S.A. + EC2A72 + Dell Inc. - 000042 - Metier Management Systems Ltd + 7486E2 + Dell Inc. - 00007D - Oracle Corporation + 00BE43 + Dell Inc. - 000096 - Marconi Electronics Ltd + 605B30 + Dell Inc. - 00005E - ICANN, IANA Department + C84BD6 + Dell Inc. - 000038 - CSS Labs + B4E10F + Dell Inc. - 000044 - Castelle Corporation + 1866DA + Dell Inc. - 0000CE - Megadata Corp. + 18DBF2 + Dell Inc. - 00007B - Research Machines + 14B31F + Dell Inc. - 00000F - Next Inc. + 107D1A + Dell Inc. - 0000BB - TRI-Data + 509A4C + Dell Inc. - 00001A - Advanced Micro Devices + 247152 + Dell Inc. - 00007F - Linotype-Hell AG + 8C47BE + Dell Inc. - 08006F - Philips Apeldoorn B.V. + 601895 + Dell Inc. - 000040 - Applicon Inc. + B04F13 + Dell Inc. - 00005D - CS Telecom + 405CFD + Dell Inc. - 000012 - Information Technology Limited + D09466 + Dell Inc. - 00008A - Datahouse Information Systems + D89EF3 + Dell Inc. - 000032 - Marconi plc + 106530 + Dell Inc. - 000085 - Canon Inc. + 3C2C30 + Dell Inc. - 00004A - ADC Codenoll Technology Corp. + 886FD4 + Dell Inc. - 08008F - Chipcom Corporation + 5CF9DD + Dell Inc. - 00006A - Computer Consoles Inc. + 004E01 + Dell Inc. - 08003E - Codex Corporation + 000874 + Dell Inc. - 080040 - Ferranti Computer Sys. Limited + 0024E8 + Dell Inc. - 08003A - Orcatech Inc. + 002219 + Dell Inc. - 08003D - Cadnetix Corporations + 3417EB + Dell Inc. - 080038 - Bull S.A.S. + B083FE + Dell Inc. - 080073 - Tecmar Inc. + 94CBCD + zte corporation - 080072 - Xerox Corp Univ Grant Program + 805F8E + Huizhou BYD Electronic Co., Ltd. - 08006A - AT&T + A83A79 + Mist Systems, Inc. - 08007A - Indata + 5488FE + Xiaoniu network technology (Shanghai) Co., Ltd. - 080079 - THE Droid Works + F4D580 + YAMAHA CORPORATION - 08004D - Corvus Systems Inc. + 5030F4 + Exascend, Inc. - 08002F - Prime Computer Inc. + E49069 + Rockwell Automation - 08002C - Britton LEE Inc. + 184C08 + Rockwell Automation - 080062 - General Dynamics + FC35E6 + Visteon Corporation - 08005C - Four Phase Systems + 8CBA25 + UNION MAN TECHNOLOGY CO.,LTD - 08005A - IBM Corp + 54725E + UNION MAN TECHNOLOGY CO.,LTD - 080052 - Insystec + F814FE + UNION MAN TECHNOLOGY CO.,LTD - 08001E - Apollo Computer Inc. + CC62FE + UNION MAN TECHNOLOGY CO.,LTD - 080019 - General Electric Corporation + 404101 + Rockwell Automation - 027001 - Racal-Datacom + 68C8EB + Rockwell Automation - 08000E - NCR Corporation + 7CBFAE + Renesas Electronics (Penang) Sdn. Bhd. - 00DD09 - Ungermann-Bass Inc. + 80AFCA + Shenzhen Cudy Technology Co., Ltd. - 000002 - Xerox Corporation + 1C6E74 + EnOcean Edge Inc. - 000003 - Xerox Corporation + C09573 + AIxLink - 000006 - Xerox Corporation + 04472A + Palo Alto Networks - 080001 - Computervision Corporation + C02C17 + Cisco Systems, Inc - 080005 - Symbolics Inc. + 984925 + Juniper Networks - 00DD07 - Ungermann-Bass Inc. + 4419B6 + Hangzhou Hikvision Digital Technology Co.,Ltd. - 000008 - Xerox Corporation + 7C8931 + Huawei Device Co., Ltd. - 00003D - Unisys + BC5E33 + Hangzhou Hikvision Digital Technology Co.,Ltd. - 00DD0D - Ungermann-Bass Inc. + FC9FFD + Hangzhou Hikvision Digital Technology Co.,Ltd. - 080064 - Sitasys AG + E8A0ED + Hangzhou Hikvision Digital Technology Co.,Ltd. - 080002 - Bridge Communications Inc. + 5C345B + Hangzhou Hikvision Digital Technology Co.,Ltd. - 08001A - Tiara/ 10NET + 7CEDC6 + Amazon Technologies Inc. - 08008B - Pyramid Technology Corp. + 4825F3 + Huawei Device Co., Ltd. - 080012 - Bell Atlantic Integrated Syst. + C04884 + Sigma Bilisim Sist. Tekn. Elk. Enj. ve San. D??. Tic. Ltd. ?ti. - 14A1BF - ASSA ABLOY Korea Ltd Unilock + 4CBD8F + Hangzhou Hikvision Digital Technology Co.,Ltd. - 9483C4 - GL Technologies (Hong Kong) Limited + F412DA + zte corporation - 080030 - Royal Melbourne Inst Of Tech + 540295 + HUAWEI TECHNOLOGIES CO.,LTD - 00000B - Matrix Corporation + C8787D + D-Link Corporation - 00009B - Information International Inc. + D09395 + IEEE Registration Authority - 9C93B0 - Megatronix (Beijing) Technology Ltd + F4E2C6 + Ubiquiti Inc - 64AEF1 - Qingdao Hisense Electronics Ltd + D8B370 + Ubiquiti Inc - 080016 - Barrister Info Sys Corp + B4FBE4 + Ubiquiti Inc - 44CB8B - LG Innotek + 687251 + Ubiquiti Inc - B4055D - Inspur Electronic Information Industry Ltd + E09B27 + Ciena Corporation - 984827 - TP-Link Technologies Ltd + FCECDA + Ubiquiti Inc - D4F5EF - Hewlett Packard Enterprise + 942A6F + Ubiquiti Inc - 28BD89 - Google Inc. + 8CE042 + vivo Mobile Communication Co., Ltd. - EC1BBD - Silicon Laboratories + 407183 + Juniper Networks - D8A315 - Vivo Mobile Communication Ltd + 40B4F0 + Juniper Networks - 80647A - Ola Sense Inc + 384F49 + Juniper Networks - 70F82B - DWnet Technologies(Suzhou) Corporation + 5800BB + Juniper Networks - 142475 - 4DReplay Inc. + D007CA + Juniper Networks - 10DCB6 - IEEE Registration Authority + D8B122 + Juniper Networks - F89E28 - Cisco Meraki + 9CC893 + Juniper Networks - F8C4F3 - Shanghai Infinity Wireless Technologies Ltd + 58E434 + Juniper Networks - D4772B - Nanjing Ztlink Network Technology Ltd + B0EB7F + Juniper Networks - 64F9C0 - Analog Devices + 28B829 + Juniper Networks - 18D0C5 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 64C3D6 + Juniper Networks - 34ED1B - Cisco Systems Inc. + C0BFA7 + Juniper Networks - BCA511 - Netgear + B033A6 + Juniper Networks - 000A7B - Cornelius Consult + 201BC9 + Juniper Networks - C4447D - Huawei Technologies Ltd + 541E56 + Juniper Networks - 30E98E - Huawei Technologies Ltd + 88A25E + Juniper Networks - 748B34 - Shanghai Smart System Technology Ltd + 003146 + Juniper Networks - ACBD70 - Huawei Device Ltd + 78FE3D + Juniper Networks - C02E26 - Private + 648788 + Juniper Networks - 34D262 - SZ DJI Technology Ltd + AC4BC8 + Juniper Networks - 0812A5 - Amazon Technologies Inc. + 3C94D5 + Juniper Networks - 807FF8 + 50C709 Juniper Networks - 440377 - IEEE Registration Authority + 00C52C + Juniper Networks - 002487 - Transact Campus Inc. + B48A5F + Juniper Networks - B4E9A3 - port Industrial automation GmbH + E0F62D + Juniper Networks - 38E8EE - Nanjing Youkuo Electric Technology Ltd + EC7C5C + Juniper Networks - 90B8E0 - Shenzhen Yanray Technology Ltd + DC38E1 + Juniper Networks - 9CF531 - Guangdong Oppo Mobile Telecommunications Corp Ltd + CCE17F + Juniper Networks - 80E455 - New H3C Technologies Ltd + 807FF8 + Juniper Networks - 2C4CC6 - Murata Manufacturing Ltd + 54B7BD + Arcadyan Corporation - 7C210D - Cisco Systems Inc. + BC73A4 + ANDA TELECOM PVT LTD - 4CBC72 - Primex Wireless + 14F5F9 + HUNAN FN-LINK TECHNOLOGY LIMITED - 6802B8 - Compal Broadband Networks Inc. + AC1754 + tiko Energy Solutions AG - 3463D4 - Bionix Supplychain Technologies SLU + ACE0D6 + koreabts - 08F7E9 - HRCP Research and Development Partnership + FC5703 + Hisense broadband multimedia technology Co.,Ltd - 8CBA25 - Unionman Technology Ltd + E897B8 + Chiun Mai Communication System, Inc - D49E3B - Guangzhou Shiyuan Electronic Technology Company Limited + 94F524 + Chengdu BeiZhongWangXin Technology Co.Ltd - DCDCE2 - Samsung Electronics Ltd + 60FAB1 + Kempower Oyj - A0AC69 - Samsung Electronics Ltd + A4C23E + Huizhou Speed Wireless Technology Co.,Ltd - 1089FB - Samsung Electronics Ltd + 0050C4 + IMD - DC4BDD - Shenzhen SuperElectron Technology Ltd + 001AA6 + Elbit Systems Deutschland GmbH & Co. KG - C0B5CD - Huawei Device Ltd + 7C45F9 + IEEE Registration Authority - 4C5077 - Huawei Device Ltd + C0EAC3 + IEEE Registration Authority - 502DBB - GD Midea Air-Conditioning Equipment Ltd + FCA0F3 + HUAWEI TECHNOLOGIES CO.,LTD - 5C3A3D - ZTE Corporation + 04A81C + HUAWEI TECHNOLOGIES CO.,LTD - 30FD65 - Huawei Technologies Ltd + 304074 + zte corporation - 7CA1AE - Apple + 10CF0F + Apple, Inc. - 3C22FB - Apple + D8638C + Shenzhen Dttek Technology Co., Ltd. - 58EAFC - ELL-IoT Inc + 1C76F2 + Samsung Electronics Co.,Ltd - 9013DA - Athom B.V. + 0092A5 + LG Innotek - 14115D - Skyworth Digital Technology(Shenzhen) Ltd + A01077 + zte corporation - E4F327 - Atol LLC + 7C7A3C + New H3C Technologies Co., Ltd - 6819AC - Guangzhou Xianyou Intelligent Technogoly Ltd + 483177 + Nintendo Co.,Ltd - E82E0C - NETINT Technologies Inc. + 140FA6 + Renesas Electronics (Penang) Sdn. Bhd. - 1892A4 - Ciena Corporation + 148473 + Cisco Systems, Inc - 10082C - Texas Instruments + 1CCA41 + AO - B0735D - Huawei Device Ltd + 347DE4 + SHENZHEN BILIAN ELECTRONIC CO.,LTD - 5C3A45 - Chongqing Fugui Electronics Ltd + CCCF83 + CIG SHANGHAI CO LTD - A03C31 - Shenzhen Belon Technology Ltd + B4636F + Nokia Solutions and Networks GmbH & Co. KG - A897CD - ARRIS Group Inc. + 24D337 + Xiaomi Communications Co Ltd - 404C77 - ARRIS Group Inc. + 90314B + AltoBeam Inc. - 2CE310 - Stratacache + 205F3D + Adtran Inc - 0022A0 - Aptiv Services US LLC + 3C3B4D + Toyo Seisakusho Kaisha, Limited - A4307A - Samsung Electronics Ltd + 3CBCD0 + zte corporation - FC8E5B - China Mobile Iot Limited Company + D0A9D3 + EM Microelectronic - 142A14 - Shenzhen Selenview Digital Technology Ltd + 14DD02 + Liangang Optoelectronic Technology CO., Ltd. - D87E76 - Itel Mobile Limited + 60C727 + Digiboard Eletronica da Amazonia Ltda - 384B5B - Ztron Technology Limited + 646E60 + zte corporation - B86142 - Beijing Tricolor Technology Ltd + 4C421E + Cisco Systems, Inc - 200A0D - IEEE Registration Authority + 64B2B4 + Fiberhome Telecommunication Technologies Co.,LTD - E47C65 - Sunstar Communication Technology Ltd + 4831DB + Huawei Device Co., Ltd. - 9C54DA - SkyBell Technologies Inc. + 04F778 + Sony Interactive Entertainment Inc. - 4C494F - ZTE Corporation + 58707F + Ericsson AB - C4741E - ZTE Corporation + D039FA + Samsung Electronics Co.,Ltd - 00D078 - Eltex Of Sweden AB + B40B1D + Samsung Electronics Co.,Ltd - 5C78F8 - Huawei Device Ltd + AC80FB + Samsung Electronics Co.,Ltd - B827C5 - Huawei Device Ltd + 147F0F + Texas Instruments - DC8983 - Samsung Electronics Ltd + 444AD6 + Shenzhen Rinocloud Technology Co.,Ltd. - 5CCB99 - Samsung Electronics Ltd + 189EAD + Shenzhen Chengqian Information Technology Co., Ltd - D46075 - Baidu Online Network Technology (Beijing) Ltd + 94DDF8 + Brother Industries, LTD. - 78C5F8 - Huawei Device Ltd + 84B386 + IEEE Registration Authority - D45D64 - ASUSTek Computer Inc. + 408EF6 + Infinix mobility limited - 90B144 - Samsung Electronics Ltd + E02DF0 + ALPSALPINE CO,.LTD - 48DD0C - eero Inc. + A45D5E + Wilk Elektronik S.A. - 940C98 - Apple + FC315D + Apple, Inc. - E8FBE9 - Apple + 74A6CD + Apple, Inc. - 38EC0D - Apple + 2C7CF2 + Apple, Inc. - 58278C - Buffalo Inc. + 30D7A1 + Apple, Inc. - 140AC5 - Amazon Technologies Inc. + 887477 + HUAWEI TECHNOLOGIES CO.,LTD - 2083F8 - Advanced Digital Broadcast SA + A8727E + WISDRI (wuhan) Automation Company Limited - C8C750 - Motorola Mobility LLC, a Lenovo Company + DCD2FD + HUAWEI TECHNOLOGIES CO.,LTD - 2CDCD7 - Azurewave Technologies Inc. + 5873D1 + HUAWEI TECHNOLOGIES CO.,LTD - 34E3DA - Hoval Aktiengesellschaft + 4CB087 + HUAWEI TECHNOLOGIES CO.,LTD - E0BB9E - Seiko Epson Corporation + 88B4BE + HUAWEI TECHNOLOGIES CO.,LTD - 48D24F - Sagemcom Broadband SAS + 947BAE + Xiaomi Communications Co Ltd - E4AAEC - Tianjin Hualai Technology Ltd + 00C28F + Allied Telesis K.K. - 94BE46 - Motorola (Wuhan) Mobility Technologies Communication Ltd + F42D06 + zte corporation - ACF8CC - ARRIS Group Inc. + 1C674A + zte corporation - 8C5A25 - ARRIS Group Inc. + 7C5758 + HP Inc. - 483FDA - Espressif Inc. + C829C8 + Palo Alto Networks - 6C5D3A - Microsoft Corporation + B4E265 + Shenzhen SDMC Technology CO.,Ltd. - CCD42E - Arcadyan Corporation + E0382D + IEEE Registration Authority - C853E1 - Beijing Bytedance Network Technology Ltd + 98BFF4 + MARKIN co., Ltd. - 14169D - Cisco Systems Inc. + 3847F2 + Recogni Inc - 48A2E6 - Resideo + D8AD49 + Honor Device Co., Ltd. - 90E2FC - IEEE Registration Authority + 38F8F6 + Adtran Inc - F008D1 - Espressif Inc. + B484D5 + GooWi Wireless Technology Co., Limited - 5894B2 - BrainCo + C45379 + Micronview Limited Liability Company - B09575 - TP-Link Technologies Ltd + 68FCB6 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - B4B055 - Huawei Technologies Ltd + D8312C + zte corporation - 048C16 - Huawei Technologies Ltd + 049F15 + Humane - 98DD5B - Takumi Japan Ltd + 3838A6 + Arista Networks - 3C5CF1 - eero Inc. + 50236D + Nintendo Co.,Ltd - 14AE85 - IEEE Registration Authority + A03975 + Leo Bodnar Electronics Ltd - 90749D - IRay Technology Ltd + F42756 + DASAN Newtork Solutions - 8C3B32 - Microfan B.V. + E0A1CE + zte corporation - D0D3E0 - Aruba Networks HP + 24A6FA + WEIFANG GOERTEK ELECTRONICS CO.,LTD - 645CF3 - ParanTek Inc. + 7493DA + ASKEY COMPUTER CORP - B0CCFE - Huawei Device Ltd + C84AA0 + Sony Interactive Entertainment Inc. - 540DF9 - Huawei Device Ltd + 4C968A + Wacom Co.,Ltd. - 006619 - Huawei Device Ltd + EC83B7 + PUWELL CLOUD TECH LIMITED - FC3964 - Itel Mobile Limited + 0C6422 + Beijing Wiseasy Technology Co.,Ltd. - 14472D - Guangdong Oppo Mobile Telecommunications Corp Ltd + C8F2B4 + Guizhou Huaxin Information Technology Co., Ltd. - E490FD - Apple + 2C75CB + Novitec Co., Ltd. - 84AB1A - Apple + 9C558F + Lockin Technology(Beijing) Co.,Ltd. - 206D31 - Firewalla Inc + E8268D + Shenzhen SuperElectron Technology Co.,Ltd. - D06544 - Apple + 6C9106 + Katena Computing Technologies - 186F2D - Shenzhen Sundray Technologies Company Limited + 6C70CB + Samsung Electronics Co.,Ltd - F84FAD - Hui Zhou Gaoshengda Technology Ltd + 907BC6 + Texas Instruments - 4C0A3D - Adnacom Inc. + 904846 + Texas Instruments - 3C806B - Hunan Voc Acoustics Technology Ltd + C47905 + Zhejiang Uniview Technologies Co.,Ltd. - 60DE35 - GITSN Inc. + D4DA21 + Beijing Xiaomi Mobile Software Co., Ltd - 28317E - Hongkong Nano IC Technologies Ltd + 201A94 + Apple, Inc. - A84122 - China Mobile (Hangzhou) Information Technology Ltd + B0E5EF + Apple, Inc. - 6CDDBC - Samsung Electronics Ltd + 288FF6 + Apple, Inc. - CC7F76 - Cisco Systems Inc. + 10BBF3 + HUNAN FN-LINK TECHNOLOGY LIMITED - 40BC68 - Wuhan Funshion Online Technologies Ltd + D04E99 + HUAWEI TECHNOLOGIES CO.,LTD - DC9840 - Microsoft Corporation + 20A766 + HUAWEI TECHNOLOGIES CO.,LTD - 447654 - Huawei Technologies Ltd + 3C058E + HUAWEI TECHNOLOGIES CO.,LTD - 7CD9A0 - Huawei Technologies Ltd + A411BB + Cisco Systems, Inc - F033E5 - Huawei Technologies Ltd + 504921 + Cisco Systems, Inc - B4F18C - Huawei Device Ltd + 44B7D0 + Microchip Technology Inc. - B8CEF6 - Mellanox Technologies Inc. + E88F6F + TCT mobile ltd - B802A4 - Aeonsemi Inc. + 58B965 + Apple, Inc. - E48326 - Huawei Technologies Ltd + 743174 + Apple, Inc. - 9405BB - IEEE Registration Authority + F0C725 + Apple, Inc. - 8C5FAD - Fiberhome Telecommunication Technologies Ltd + 784F24 + Taicang T&W Electronics - ACC25D - Fiberhome Telecommunication Technologies Ltd + 7C669A + HUAWEI TECHNOLOGIES CO.,LTD - 8C0C87 - Nokia + CC1E97 + HUAWEI TECHNOLOGIES CO.,LTD - C432D1 - Farlink Technology Limited + B4E46B + China Mobile IOT Company Limited - CC418E - MSA Innovation + CCCC77 + Zaram Technology. Inc. - CCA7C1 - Google Inc. + 6813E2 + Eltex Enterprise LTD - 388479 - Cisco Meraki + 6444D5 + TD Tech - 7C9EBD - Espressif Inc. + F8AAB3 + DESSMANN (China) Machinery & Electronic Co., Ltd - 1C0219 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 9C5467 + Nokia - C8D778 - BSH Hausgeraete GmbH + B46142 + HUAWEI TECHNOLOGIES CO.,LTD - 9C611D - Panasonic Corporation Of North America + BCB923 + Alta Networks - C095DA - NXP India Private Limited + 8C8442 + Cisco Systems, Inc - B42200 - Brother Industries Ltd + 84F117 + Newseason - 6849B2 - Carlo Gavazzi Ltd + 3C0664 + Beijing Leagrid Technology Co.,Ltd. - 487AFF - Essys + BC5274 + Samsung Electronics Co.,Ltd - 40B6E7 - Huawei Device Ltd + BC458C + Shenzhen Topwise Communication Co.,Ltd - D0B45D - Huawei Device Ltd + 947806 + NINGBO SUNVOT TECHNOLOGY CO.,LTD - 8836CF - Huawei Device Ltd + 98CCE4 + Shenzhen Mindray Animal Medical Technology Co.,LTD - A4C54E - Huawei Device Ltd + 9009DF + Intel Corporate - D4BBE6 - Huawei Device Ltd + E40D36 + Intel Corporate - 009EEE - Positivo Tecnologia S.A. + 149F43 + Cisco Meraki - 90B832 - Extreme Networks Inc. + 64DB38 + zte corporation - 402F86 - LG Innotek + 2C08B4 + Huawei Device Co., Ltd. - D422CD - Xsens Technologies B.V. + 5007C3 + Amazon Technologies Inc. - C8675E - Extreme Networks Inc. + C8EFBC + Inspur Communication Technology Co.,Ltd. - 9C5D12 - Extreme Networks Inc. + 848DCE + Ciena Corporation - F09CE9 - Extreme Networks Inc. + E466AB + zte corporation - C413E2 - Extreme Networks Inc. + A0957F + SERNET (SUZHOU) TECHNOLOGIES CORPORATION - F4EB9F - Ellu Company 2019 SL + 64135A + Itectra A/S - E898C2 - ZETLAB Company + 54E1B6 + Renesas Electronics (Penang) Sdn. Bhd. - D41AC8 - Nippon Printer Engineering + CC77C9 + Fiberhome Telecommunication Technologies Co.,LTD - 5061F6 - Universal Electronics Inc. + 2C572C + Allwinner Technology Co., Ltd - 000C32 - Avionic Design GmbH + ECDFC9 + Hangzhou Microimage Software Co., Ltd - 000A0D - Amphenol + 3CE441 + Amazon Technologies Inc. - F45420 - Tellescom Industria E Comercio EM Telecomunicacao + 444201 + Amazon Technologies Inc. - 4C4088 - Sanshin Electronics Ltd + E46D7F + Ciena Corporation - 64DDE9 - Xiaomi Communications Ltd + 80276C + Cisco Systems, Inc - 0C817D - EEP Elektro-Elektronik Pranjic GmbH + 6C4EF6 + Cisco Systems, Inc - 04F5F4 - Proxim Wireless + 5C2763 + Itibia Technologies - C8BCE5 - Sense Things Japan Inc. + 40C1F6 + Shenzhen Jingxun Technology Co., Ltd. - E8B470 - IEEE Registration Authority + FC22D3 + FDSYS - 001BED - Brocade Communications Systems LLC + B40421 + zte corporation - 000CDB - Brocade Communications Systems LLC + E84368 + zte corporation - 000480 - Brocade Communications Systems LLC + 4C5CDF + ITEL MOBILE LIMITED - 609C9F - Brocade Communications Systems LLC + C02E26 + iRhythm Technologies, Inc. - 000088 - Brocade Communications Systems LLC + 504877 + Honor Device Co., Ltd. - 0060DF - Brocade Communications Systems LLC + F85C7E + Shenzhen Honesty Electronics Co.,Ltd. - 006069 - Brocade Communications Systems LLC + F824E4 + Beyonics Technology Electronic (Changshu) Co., Ltd - 000533 - Brocade Communications Systems LLC + 1CB8BA + XIAMEN LEELEN TECHNOLOGY CO., LTD - B04502 - Huawei Device Ltd + 6C7E67 + Apple, Inc. - 1C1FF1 - Huawei Device Ltd + A4C6F0 + Apple, Inc. - B4EF1C - 360 AI Technology Ltd + A88FD9 + Apple, Inc. - 14DE39 - Huawei Device Ltd + 089542 + Apple, Inc. - B8F009 - Espressif Inc. + E49C67 + Apple, Inc. - FC71FA - Trane Technologies + 64E220 + Qisda Corporation - CCBE59 - Calix Inc. + F0CCE0 + Shenzhen All-Smartlink Technology Co.,Ltd. - 84A3B5 - Propulsion Systems + 44E2F1 + NewRadio Technologies Co. , Ltd. - 30FCEB - LG Electronics (Mobile Communications) + 00234B + Inyuan Technology Inc. - 2468B0 - Samsung Electronics Ltd + 00176E + DUCATI SISTEMI - 1C1338 - Kimball Electronics Group LLC + 1C6A76 + Apple, Inc. - 9CEDFA - EVUlution AG + 30C6D7 + New H3C Technologies Co., Ltd - EC63ED - Hyundai Autoever Corp. + D4F242 + Huawei Device Co., Ltd. - D46761 - XonTel Technology Co. + 0030AF + Honeywell GmbH - E44122 - OnePlus Technology (Shenzhen) Ltd + E886CF + Nokia - 9C19C2 - Dongguan Liesheng Electronic Ltd + B07839 + GD Midea Air-Conditioning Equipment Co.,Ltd. - BC26A1 - FACTORY FIVE Corporation + D85482 + Oxit, LLC - 74CBF3 - Lava international limited + C4EFDA + Honeywell - F0D14F - Linear LLC + D8F507 + Fiberhome Telecommunication Technologies Co.,LTD - 001168 - HomeLogic LLC + F41C71 + SHENZHEN SANMU COMMUNICATION TECHNOLOGY CO., LTD - 18DFC1 - Aetheros + 70110E + zte corporation - FCBC0E - Zhejiang Cainiao Supply Chain Management Ltd + 98818A + Huawei Device Co., Ltd. - 2CD066 - Xiaomi Communications Ltd + A8AA7C + Huawei Device Co., Ltd. - B05CDA - HP Inc. + B4C2F7 + Huawei Device Co., Ltd. - DCBD7A - Guangzhou Shiyuan Electronic Technology Company Limited + D4AD20 + Jinan USR IOT Technology Limited - 9016BA - Huawei Technologies Ltd + 1CFC17 + Cisco Systems, Inc - 60AAEF - Huawei Device Ltd + 488AE8 + vivo Mobile Communication Co., Ltd. - D0F3F5 - Huawei Device Ltd + 10AE60 + Amazon Technologies Inc. - D44649 - Huawei Technologies Ltd + BC107B + Samsung Electronics Co.,Ltd - 9400B0 - Huawei Technologies Ltd + 8812AC + HUNAN FN-LINK TECHNOLOGY LIMITED - 2479EF - Greenpacket Berhad, Taiwan + EC74D7 + Grandstream Networks Inc - AC2334 - Infinix mobility limited + 28011C + zte corporation - 002B67 - LCFC(HeFei) Electronics Technology Ltd + 306371 + Shenzhenshi Xinzhongxin Technology Co.Ltd - F8BC0E - eero Inc. + 98A2C0 + Cisco Systems, Inc - 50E039 - ZyXEL Communications Corp + 00410E + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - B85776 - lignex1 + FC6179 + IEEE Registration Authority - 2400FA - China Mobile (Hangzhou) Information Technology Ltd + 1C3283 + COMTTI Intelligent Technology(Shenzhen) Co., Ltd. - C83DFC - AlphaTheta Corporation + C8848C + Ruckus Wireless - E01995 - Nutanix + F4931C + Universal Electronics, Inc. - F85128 - SimpliSafe + CCBA6F + HUAWEI TECHNOLOGIES CO.,LTD - AC1F09 - Shenzhen RAKwireless technology Ltd + 785C5E + HUAWEI TECHNOLOGIES CO.,LTD - BC13A8 - Shenzhen YOUHUA Technology Ltd + 3C4E56 + SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD - 9077EE - Cisco Systems Inc. + A08CF2 + YINUOLINK CO.,LTD - 3C13CC - Cisco Systems Inc. + 5C3E1B + Apple, Inc. - 94E3EE - ZTE Corporation + 7C2ACA + Apple, Inc. - D8DC40 - Apple + 288EEC + Apple, Inc. - 805FC5 - Apple + 74375F + SERCOMM PHILIPPINES INC - 10F920 - Cisco Systems Inc. + C82AF1 + TCT mobile ltd - 206980 - Apple + 3CE90E + Espressif Inc. - 6432A8 - Intel Corporation + A842E3 + Espressif Inc. - 801934 - Intel Corporation + D49B74 + Kinetic Technologies - 40A3CC - Intel Corporation + 50F261 + Photon Sail Technologies - E4A7A0 - Intel Corporation + 944E5B + Ubee Interactive Co., Limited - 3C4DBE - Apple + B4BA9D + SKY UK LIMITED - 48262C - Apple + 40F8DF + CANON INC. - 147DDA - Apple + 0C7FED + IEEE Registration Authority - C4910C - Apple + 3CFEAC + Cisco Systems, Inc - 6C9961 - Sagemcom Broadband SAS + 04A741 + Cisco Systems, Inc - 50C709 - Juniper Networks + A8DE68 + Beijing Wide Technology Co.,Ltd - 806D97 - Private + F43BD8 + Intel Corporate - 645D86 - Intel Corporation + A0889D + Huawei Device Co., Ltd. - 181DEA - Intel Corporation + 6C302A + Texas Instruments - 185680 - Intel Corporation + 7446B3 + Texas Instruments - A0A4C5 - Intel Corporation + F46ADD + Liteon Technology Corporation - F4D108 - Intel Corporation + 18E91D + HUAWEI TECHNOLOGIES CO.,LTD - 207918 - Intel Corporation + 18B185 + Qiao Information Technology (Zhengzhou) Co., Ltd. - A86DAA - Intel Corporation + 7C0C92 + Suzhou Mobydata Smart System Co.,Ltd. - 380025 - Intel Corporation + 303F5D + PT HAN SUNG ELECTORONICS INDONESIA - C0E3A0 - Renesas Electronics (Penang) Sdn. Bhd. + 3C69D1 + ADC Automotive Distance Control System GmbH - F4C114 - Technicolor CH USA Inc. + B0FBDD + Shenzhen SuperElectron Technology Co.,Ltd. - 8CE468 - Guangzhou Sageran Technology Ltd + E09C8D + Seakeeper, Inc. - C8B29B - Intel Corporation + 307F10 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 6C6A77 - Intel Corporation + A490CE + vivo Mobile Communication Co., Ltd. - A4B1C1 - Intel Corporation + 48706F + HUAWEI TECHNOLOGIES CO.,LTD - 342EB7 - Intel Corporation + 04BAD6 + D-Link Corporation - 8CC681 - Intel Corporation + 98D742 + Samsung Electronics Co.,Ltd - CCF9E4 - Intel Corporation + 54A9C8 + Home Control Singapore Pte Ltd - 3C58C2 - Intel Corporation + C86C20 + Sichuan Tianyi Comheart Telecom Co.,LTD - E45E37 - Intel Corporation + 34AC11 + China Mobile Group Device Co.,Ltd. - 24418C - Intel Corporation + 4432C2 + GOAL Co., Ltd. - 60F262 - Intel Corporation + 70662A + Sony Interactive Entertainment Inc. - C0B883 - Intel Corporation + DC71DD + AX Technologies - C809A8 - Intel Corporation + 2064DE + Sunitec Enterprise Co.,Ltd - 907841 - Intel Corporation + A40F98 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 58A023 - Intel Corporation + 74B725 + Huawei Device Co., Ltd. - D4D252 - Intel Corporation + 408EDF + Huawei Device Co., Ltd. - 2848E7 - Huawei Device Ltd + D880DC + Huawei Device Co., Ltd. - 04D3B0 - Intel Corporation + E8B3EF + Fiberhome Telecommunication Technologies Co.,LTD - E06CA6 - Creotech Instruments S.A. + 5CFB3A + CHONGQING FUGUI ELECTRONICS CO.,LTD. - 44680C - Wacom Ltd + D04E50 + Mobiwire Mobiles (NingBo) Co., LTD - 980E24 - Phytium Technology Ltd + E8F791 + Xiaomi Communications Co Ltd - A830BC - Samsung Electronics Ltd + 8493B2 + zte corporation - 0063DE - Cloudwalk Technology Ltd + B49F4D + Fiberhome Telecommunication Technologies Co.,LTD - 60A423 - Silicon Laboratories + 60E9AA + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 7846D4 - Samsung Electronics Ltd + 240F5E + Shenzhen z-router Technology Co., Ltd - E43EC6 - Huawei Technologies Ltd + 000C06 + Nixvue Systems Pte Ltd - 38881E - Huawei Technologies Ltd + 18FD74 + Routerboard.com - 2CDB07 - Intel Corporation + 6C976D + Motorola Mobility LLC, a Lenovo Company - 988D46 - Intel Corporation + 6411A4 + Motorola Mobility LLC, a Lenovo Company - E4268B - Huawei Device Ltd + 18863A + DIGITAL ART SYSTEM - 6888A1 - Universal Electronics Inc. + C8D6B7 + Solidigm Technology - 001EB2 - LG Innotek + F0877F + Magnetar Technology Shenzhen Co., LTD. - C086B3 - Shenzhen Voxtech Ltd + 000EDB + XiNCOM Corp. - 44ADB1 - Sagemcom Broadband SAS + 40D95A + AMPAK Technology,Inc. - 1C98C1 - Cloud Network Technology Singapore PTE Ltd + 4CD0DD + HUAWEI TECHNOLOGIES CO.,LTD - A09B17 - Taicang T&W Electronics + 78669D + Hui Zhou Gaoshengda Technology Co.,LTD - 4401BB - Shenzhen Bilian Electronic Ltd + 48468D + Zepcam B.V. - A0D83D - Fiberhome Telecommunication Technologies Ltd + 904992 + YSTen Technology Co.,Ltd - 58F2FC - Huawei Device Ltd + 3CCE0D + Shenzhen juduoping Technology Co.,Ltd - 643AEA - Cisco Systems Inc. + D0497C + OnePlus Technology (Shenzhen) Co., Ltd - 507043 - BSkyB Ltd + 74D4DD + Quanta Computer Inc. - D01411 - IEEE Registration Authority + E4902A + HUAWEI TECHNOLOGIES CO.,LTD - 3C53D7 - Cedes AG + 905E44 + HUAWEI TECHNOLOGIES CO.,LTD - E8136E - Huawei Technologies Ltd + 10F068 + Ruckus Wireless - 4CAE13 - Huawei Technologies Ltd + AC2929 + Infinix mobility limited - 4C2EFE - Shenzhen Comnect Technology Ltd + 7CE152 + THE GOODYEAR TIRE & RUBBER COMPANY - DCD444 - Huawei Device Ltd + 7820BD + Polysense (Beijing) Technologies Co. Ltd - E0B260 - Teno Network Technologies Company Limited + 68CE4E + L-3 Communications Infrared Products - A446B4 - Huawei Device Ltd + 00E5F1 + BUFFALO.INC - 0CC844 - Cambridge Mobile Telematics Inc. + 34EE2A + ConMet - E8DA20 - Nintendo Ltd + 684E05 + HUNAN FN-LINK TECHNOLOGY LIMITED - 482335 - Dialog Semiconductor Hellas SA + 0499BB + Apple, Inc. - 8C85C1 - Aruba Networks HP + EC2125 + Toshiba Corp. - 20A171 - Amazon Technologies Inc. + 5C1BF4 + Apple, Inc. - 7CF9A0 - Fiberhome Telecommunication Technologies Ltd + A851AB + Apple, Inc. - 6CA4D1 - Fiberhome Telecommunication Technologies Ltd + 50392F + INGRAM MICRO SERVICES - 54AB3A - Quanta Computer Inc. + FC8417 + Honor Device Co., Ltd. - E89A8F - Quanta Computer Inc. + 2CA79E + HUAWEI TECHNOLOGIES CO.,LTD - EC6C9A - Arcadyan Corporation + 102407 + HUAWEI TECHNOLOGIES CO.,LTD - 346D9C - Carrier Corporation + 74D9EB + Petabit Scale, Inc. - D4F756 - ZTE Corporation + 28CDC1 + Raspberry Pi Trading Ltd - E0693A - Innophase Inc. + C4DEE2 + Espressif Inc. - 5488DE - Cisco Systems Inc. + 68B6B3 + Espressif Inc. - 782B64 - Bose Corporation + FCA05A + Oray.com co., LTD. - 24FD0D - Intelbras + 90486C + Ring LLC - 345594 - Fujian Star-NET Communication Ltd + 30045C + Shenzhen SuperElectron Technology Co.,Ltd. - 9C6B37 - Renesas Electronics (Penang) Sdn. Bhd. + 9079CF + zte corporation - A83759 - Huawei Device Ltd + 8C1E80 + Cisco Systems, Inc - 40AA56 - China Dragon Technology Limited + A4F933 + Intel Corporate - 68545A - Intel Corporation + 10F60A + Intel Corporate - 3CE3E7 - China Mobile Group Device Ltd + 70D823 + Intel Corporate - CC47BD - Rhombus Systems + 3C4645 + Shanghai Infinity Wireless Technologies Co.,Ltd. - 4C93A6 - IEEE Registration Authority + 888FA4 + Huawei Device Co., Ltd. - 001E31 - Infomark + 5068AC + Huawei Device Co., Ltd. - 50F7ED - Huawei Device Ltd + ACB566 + Renesas Electronics (Penang) Sdn. Bhd. - 4CB99B - Weifang Goertek Electronics Ltd + 381F26 + IEEE Registration Authority - BC7E8B - Samsung Electronics Ltd + 3043D7 + IEEE Registration Authority - 0C31DC - Huawei Technologies Ltd + B4A7C6 + SERVERCOM (INDIA) PRIVATE LIMITED - 40DDD1 - Beautiful Card Corporation - - - C0E7BF - Sichuan AI-Link Technology Ltd + 80C3BA + Sonova Consumer Hearing GmbH - 54778A - Hewlett Packard Enterprise + 487E48 + Earda Technologies co Ltd - 247152 - Dell Inc. + E84DEC + Xerox Corporation - 6433DB - Texas Instruments + A41EE1 + Taicang T&W Electronics - A406E9 - Texas Instruments + E8FB1C + AzureWave Technology Inc. - B0B113 - Texas Instruments + 5478C9 + AMPAK Technology,Inc. - 4CAEEC - Guangzhou limee technology Ltd + 286B35 + Intel Corporate - 0040AB - Roland DG Corporation + 4035E6 + Samsung Electronics Co.,Ltd - 0012B4 - Work Microwave GmbH + D0A46F + China Dragon Technology Limited - 24B105 - Prama Hikvision India Private Limited + 2C60CD + NR ELECTRIC CO., LTD - 8060B7 - Cloud Network Technology Singapore PTE Ltd + 0060E2 + QUEST ENGINEERING & DEVELOPMENT - 90AAC3 - Hitron Technologies Inc. + C4DF39 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 44917C - HMD Global Oy + CC60C8 + Microsoft Corporation - DC7223 - Hui Zhou Gaoshengda Technology Ltd + FC101A + Palo Alto Networks - 3420E3 - Ruckus Wireless + 6CAEE3 + Nokia - 245F9F - Huawei Device Ltd + 809733 + Shenzhen Elebao Technology Co., Ltd - CCB0A8 - Huawei Device Ltd + 00405F + AFE COMPUTERS LTD. - 502873 - Huawei Device Ltd + 00EBD8 + MERCUSYS TECHNOLOGIES CO., LTD. - 8C47BE - Dell Inc. + 7404F1 + Intel Corporate - 142C78 - GooWi Wireless Technology Ltd + 00A265 + M2Motive Technology Inc. - 98FC84 + 1054D2 IEEE Registration Authority - 20F44F - Nokia + B85DC3 + HUAWEI TECHNOLOGIES CO.,LTD - 0476B0 - Cisco Systems Inc. + B43AE2 + HUAWEI TECHNOLOGIES CO.,LTD - 40F078 - Cisco Systems Inc. + F0C8B5 + HUAWEI TECHNOLOGIES CO.,LTD - 78D71A - Ciena Corporation + D8365F + Intelbras - 7853F2 - Roxton Systems Ltd + DCFE23 + Murata Manufacturing Co., Ltd. - 9C6937 - Qorvo International Pte Ltd + 347379 + xFusion Digital Technologies Co., Limited - F82E3F - Huawei Technologies Ltd + D83DCC + shenzhen UDD Technologies,co.,Ltd - 90A5AF - Huawei Technologies Ltd + AC80AE + Fiberhome Telecommunication Technologies Co.,LTD - 3C7C3F - ASUSTek Computer Inc. + BC606B + Shanghai Baud Data Communication Co.,Ltd. - 34916F - UserGate Ltd + 0417B6 + Smart Innovation LLC - 0C8B7D - Vizio Inc. + CC5C61 + Huawei Device Co., Ltd. - EC4D3E - Beijing Xiaomi Mobile Software Ltd + 1CF42B + Huawei Device Co., Ltd. - D8A491 - Huawei Device Ltd + 6C51BF + Huawei Device Co., Ltd. - 681324 - Huawei Device Ltd + 6C8D77 + Cisco Systems, Inc - A8C092 - Huawei Device Ltd + 7411B2 + Cisco Systems, Inc - 9860CA - Apple + 04E69E + ZHONGGUANCUN XINHAIZEYOU TECHNOLOGY CO.,LTD - 4490BB - Apple + 00198E + Demant A/S - 34FD6A - Apple + 60FB00 + SHENZHEN BILIAN ELECTRONIC CO.,LTD - EC3EB3 - ZyXEL Communications Corp + D09200 + FiRa Consortium - 8CD67F - EM Microelectronic + E893F3 + Graphiant Inc - 5C91FD - Jaewoncnc + 7CC180 + Apple, Inc. - FC449F - ZTE Corporation + 280244 + Apple, Inc. - 204EF6 - Azurewave Technologies Inc. + E85F02 + Apple, Inc. - 443583 - Apple + BCDF58 + Google, Inc. - 38CA73 - Shenzhen MiaoMing Intelligent Technology Ltd + 2C301A + Technicolor CH USA Inc for Telus - 6C0DC4 - Beijing Xiaomi Electronics Ltd + C814B4 + Sichuan Tianyi Comheart Telecom Co.,LTD - C440F6 - Guangdong Oppo Mobile Telecommunications Corp Ltd + C049EF + Espressif Inc. - 0055B1 - Shanghai Baud Data Communication Ltd + E42B79 + Nokia - 74901F - Ragile Networks Inc. + ECE7A7 + Intel Corporate - C0252F - Shenzhen Mercury Communication Technologies Ltd + 94B555 + Espressif Inc. - 549FC6 - Cisco Systems Inc. + 74F2FA + Xiaomi Communications Co Ltd - F01D2D - Cisco Systems Inc. + 5C843C + Sony Interactive Entertainment Inc. - 443B32 - Intelbras + E8AEC5 + Arista Networks - F83B1D - Technicolor CH USA Inc. + 4017F6 + TKH SECURITY,S.L.U. - D41B81 - Chongqing Fugui Electronics Ltd + 3CE9F7 + Intel Corporate - F40B9F - CIG Shanghai Ltd + 185E0B + zte corporation - 7845B3 - Huawei Device Ltd + D0BB61 + zte corporation - 20DCFD - Huawei Device Ltd + 60A6C5 + HUAWEI TECHNOLOGIES CO.,LTD - FC65B3 - Huawei Device Ltd + 208C86 + HUAWEI TECHNOLOGIES CO.,LTD - 109D7A - Huawei Device Ltd + F0A951 + HUAWEI TECHNOLOGIES CO.,LTD - DC6373 - Obara Korea + 004058 + UKG - D47EE4 - China Mobile IOT Company Limited + F4CE23 + Intel Corporate - 88892F - Huawei Technologies Ltd + A84FB1 + Cisco Systems, Inc - 28E5B0 - Huawei Technologies Ltd + 54ACFC + LIZN ApS - 1CA852 - Sensaio PTE Ltd + 4C7274 + Shenzhenshi Xinzhongxin Technology Co.Ltd - 787DF3 - Sterlite Technologies Limited + A439B3 + Beijing Xiaomi Mobile Software Co., Ltd - C094AD - ZTE Corporation + C899B2 + Arcadyan Corporation - 342B70 - Arris + AC7352 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 1C90BE - Ericsson AB + 50C275 + GN Audio A/S - 00163B - Communications & Power Industries + C8727E + Nokia - 9CB2E8 - Huawei Technologies Ltd + 6425EC + guangdong kesheng zhixun technology - 74731D - ifm electronic GmbH + 00E0CD + SAAB SENSIS CORPORATION - 000B4E - Communications & Power Industries + 800CF9 + Amazon Technologies Inc. - 000334 - Omega Engineering Inc. + A09208 + Tuya Smart Inc. - 5C6199 - Cloud Network Technology Singapore PTE Ltd + F4B898 + Texas Instruments - E8DB84 - Espressif Inc. + B0D278 + Texas Instruments - D05509 - Nintendo Ltd + 0024B6 + Seagate Technology - A07751 - ASMedia Technology Inc. + 64D69A + Intel Corporate - 305684 - Shenzhen Yunji Intelligent Technology Ltd + E0A25A + Shanghai Mo xiang Network Technology CO.,ltd - 14563A - Huawei Device Ltd + E484D3 + Xiaomi Communications Co Ltd - 7090B7 - Huawei Device Ltd + 04106B + Xiaomi Communications Co Ltd - 249494 - Hong Kong Bouffalo Lab Limited + 04CCBC + HUAWEI TECHNOLOGIES CO.,LTD - 30BE3B - Mitsubishi Electric Corporation + 1CE504 + HUAWEI TECHNOLOGIES CO.,LTD - 0CB789 - Honor Device Ltd + 2C0BAB + HUAWEI TECHNOLOGIES CO.,LTD - 7891E9 - Raisecom Technology Ltd + 94D2BC + HUAWEI TECHNOLOGIES CO.,LTD - 8C3401 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 684AE9 + Samsung Electronics Co.,Ltd - 60DB98 - Calix Inc. + 201F54 + Raisecom Technology CO., LTD - 6872C3 - Samsung Electronics Ltd + 7C97E1 + Huawei Device Co., Ltd. - 70B13D - Samsung Electronics Ltd + C83E9E + Huawei Device Co., Ltd. - FC7FF1 - Aruba Networks HP + E0D045 + Intel Corporate - 3CA37E - Huawei Technologies Ltd + 60DD70 + Apple, Inc. - F8E43B - ASIX Electronics Corporation + 98A5F9 + Apple, Inc. - 48EF61 - Huawei Device Ltd + ECA907 + Apple, Inc. - 78F09B - Huawei Device Ltd + 34CE69 + Nokia Solutions and Networks GmbH & Co. KG - 00E93A - Azurewave Technologies Inc. + 940D2D + Universal Electronics, Inc. - 00C52C - Juniper Networks + A88C3E + Microsoft Corporation - 0034A1 - RF-Lambda USA Inc. + 4C06B7 + ProDVX Europe B.V. - 603573 - Earda Technologies Ltd + 605747 + CIG SHANGHAI CO LTD - A49733 - Askey Computer Corp + F82551 + Seiko Epson Corporation - 5CFB3A - Chongqing Fugui Electronics Ltd + 7453A8 + ACL Airshop BV - 180F76 - D-Link International + 147EA1 + Britania Eletrônicos S.A. - 00AD24 - D-Link International + E81656 + Hangzhou BroadLink Technology Co.,Ltd - 60634C - D-Link International + 149E5D + JSC IB Reform - C4E90A - D-Link International + BC4760 + Samsung Electronics Co.,Ltd - F0B4D2 - D-Link International + 2C4DDE + TECNO MOBILE LIMITED - E01CFC - D-Link International + 303F7B + Shenzhen YOUHUA Technology Co., Ltd - F02F74 - ASUSTek Computer Inc. + 54CF8D + HUAWEI TECHNOLOGIES CO.,LTD - 006E02 - Xovis AG + 0CB789 + Honor Device Co., Ltd. - ACF85C - Chengdu Higon Integrated Circuit Design Ltd + F0B040 + HUNAN FN-LINK TECHNOLOGY LIMITED - 181171 - Guangzhou Doctorpai Education & Technology Ltd + D48866 + HUAWEI TECHNOLOGIES CO.,LTD - E06D17 - Apple + D48457 + GD Midea Air-Conditioning Equipment Co.,Ltd. - F0B3EC - Apple + FC0296 + Xiaomi Communications Co Ltd - F465A6 - Apple + 68BE49 + Nebula Matrix - 7898E8 - D-Link International + 94F827 + Shanghai Imilab Technology Co.Ltd - 44F21B - Apple + D8CFBF + Motorola Mobility LLC, a Lenovo Company - 74650C - Apple + 1845B3 + IEEE Registration Authority - FCD436 - Motorola Mobility LLC, a Lenovo Company + 60E85B + Texas Instruments - 0CEC8D - Motorola Mobility LLC, a Lenovo Company + C448FA + Taicang T&W Electronics - 184F5D - JRC Mobility Inc. + A89892 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 08CBE5 - R3 - Reliable Realtime Radio Communications GmbH + E0720A + Shenzhen SuperElectron Technology Co.,Ltd. - F023AE - AMPAK Technology,Inc. + 24D904 + Sichuan Changhong Network Technologies Co., Ltd. - E07726 - Huawei Device Ltd + 483E5E + SERNET (SUZHOU) TECHNOLOGIES CORPORATION - 94A67E - Netgear + 50EBF6 + ASUSTek COMPUTER INC. - A89AD7 - Nokia + 60FF12 + Samsung Electronics Co.,Ltd - 482567 - Poly + 24C613 + Samsung Electronics Co.,Ltd - 84F147 - Cisco Systems Inc. + 94E129 + Samsung Electronics Co.,Ltd - 249F89 - Texas Instruments + 2804C6 + Wanan Hongsheng Electronic Co.Ltd - 247625 - Texas Instruments + C44F96 + Alps Alpine - F87A41 - Cisco Systems Inc. + 685811 + Fiberhome Telecommunication Technologies Co.,LTD - D439B8 - Ciena Corporation + B4BA02 + Agatel Ltd - 30C3D9 - Alpsalpine Ltd + D47954 + Huawei Device Co., Ltd. - 001BFB - Alpsalpine Ltd + C839AC + Huawei Device Co., Ltd. - 74E9BF - Huawei Technologies Ltd + 145594 + Huawei Device Co., Ltd. - D8109F - Huawei Technologies Ltd + 08C06C + Huawei Device Co., Ltd. - ACAE19 - Roku Inc. + 3C457A + SKY UK LIMITED - 34FEC5 - Shenzhen Sunwoda Intelligent hardware Ltd + 902759 + Nanjing Jiahao Technology Co., Ltd. - A8F766 - ITE Tech Inc + 84BA20 + Silicon Laboratories - 00213E - TomTom International BV + 003C84 + Silicon Laboratories - 683E26 - Intel Corporation + 281D21 + IN ONE SMART TECHNOLOGY(H,K,)LIMITED - 8C554A - Intel Corporation + 74E336 + FUJIAN STAR-NET COMMUNICATION CO.,LTD - 401C83 - Intel Corporation + C4345B + HUAWEI TECHNOLOGIES CO.,LTD - 38FC98 - Intel Corporation + B0739C + Amazon Technologies Inc. - 502F9B - Intel Corporation + 3C219C + Intel Corporate - F85EA0 - Intel Corporation + DC6294 + Guangzhou Lango Electronics Technology Co.,Ltd. - A46BB6 - Intel Corporation + 1859F5 + Cisco Systems, Inc - FC0C45 - Shenzhen SuperElectron Technology Ltd + 703217 + Intel Corporate - 5467E6 - Shenzhen MTC Ltd + 389461 + Renesas Electronics (Penang) Sdn. Bhd. - 3C5447 - Huawei Technologies Ltd + 5C46B0 + SIMCom Wireless Solutions Limited - 006B6F - Huawei Technologies Ltd + C02C5C + Apple, Inc. - A03D6E - Cisco Systems Inc. + EC4269 + HMD Global Oy - 709CD1 - Intel Corporation + D45763 + Apple, Inc. - 000EB6 - Riverbed Technology Inc. + 48B9C2 + Teletics Inc. - 8444AF - Zhejiang Tmall Technology Ltd + 90F3B8 + China Mobile Group Device Co.,Ltd. - E4BFFA - Technicolor CH USA Inc. + 38563D + Microsoft Corporation - 8C64D4 - Hyeco Smart Tech Ltd + 28937D + Sichuan Tianyi Comheart Telecom Co.,LTD - 8CDEF9 - Beijing Xiaomi Mobile Software Ltd + 1C73E2 + HUAWEI TECHNOLOGIES CO.,LTD - 58AE2B - Huawei Device Ltd + 8C83E8 + HUAWEI TECHNOLOGIES CO.,LTD - D03C1F - Intel Corporation + 34A5B4 + NAVTECH PTE LTD - B08BD0 - Cisco Systems Inc. + F829C0 + Availink, Inc. - 6CD704 - Huawei Technologies Ltd + 24B72A + China Dragon Technology Limited - 543AD6 - Samsung Electronics Ltd + F8FCE1 + Amazon Technologies Inc. - 544617 - ZTE Corporation + 6457E5 + Beijing Royaltech Co.,Ltd - 5C85F8 - Shenzhen Kaifa Technology Ltd + FC9BD4 + EdgeQ - 14230A - Huawei Technologies Ltd + 145790 + Qingdao Haier Technology Co.,Ltd - 58AEA8 - Huawei Technologies Ltd + 405F7D + TCT mobile ltd - 48EC5B - Nokia Solutions and Networks GmbH & Co. KG + 986EE8 + IEEE Registration Authority - 0077E4 - Nokia Solutions and Networks GmbH & Co. KG + D4C3B0 + Gearlinx Pty Ltd - 802278 - China Mobile IOT Company Limited + E070EA + HP Inc. - 903CB3 - Edgecore Networks Corporation + 08B49D + TECNO MOBILE LIMITED - D814DF - TCL King Electrical Appliances (Huizhou) Ltd + 04D921 + Occuspace - 90027A - Shenzhen Sworix Techonlogy Ltd + 4C034F + Intel Corporate - 3C06A7 - TP-Link Technologies Ltd + 942957 + Airpo Networks Technology Co.,Ltd. - 24E927 - TomTom International BV + 9877CB + Vorteks ED - 845CF3 - Intel Corporation + C436C0 + BUFFALO.INC - D05AFD - Realme Chongqing Mobile Telecommunications Corp Ltd + B88A72 + Renesas Electronics (Penang) Sdn. Bhd. - 584120 - TP-Link Technologies Ltd + 88D82E + Intel Corporate - 64D7C0 - Huawei Device Ltd + 50547B + Nanjing Qinheng Microelectronics Co., Ltd. - 946010 - Huawei Device Ltd + 4CEAAE + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 2C793D - Boditech Med + D41AD1 + Zyxel Communications Corporation - 6C02E0 - HP Inc. + B845F4 + New H3C Technologies Co., Ltd - 245B83 - Renesas Electronics (Penang) Sdn. Bhd. + EC01D5 + Cisco Systems, Inc - F0F564 - Samsung Electronics Ltd + 2C53D7 + Sonova AG - 00DCB2 - Extreme Networks Inc. + E8979A + Quectel Wireless Solutions Co.,Ltd. - 6C13D5 - Cisco Systems Inc. + 180EAC + SHENZHEN FAST TECHNOLOGIES CO.,LTD - 0008B0 - HUBER+SUHNER BKtel GmbH + 144920 + HUAWEI TECHNOLOGIES CO.,LTD - 84DB9E - Pink Nectarine Health AB + DCA782 + HUAWEI TECHNOLOGIES CO.,LTD - 1869D8 - Tuya Smart Inc. + 045170 + Zhongshan K-mate General Electronics Co.,Ltd - 68ABBC - Beijing Xiaomi Mobile Software Ltd + 384554 + Harman/Becker Automotive Systems GmbH - 34C103 - Hangzhou Huamu Technology Ltd + 3CE4B0 + Texas Instruments - 6413AB - Huawei Technologies Ltd + E80115 + COOCAA Network Technology CO.,TD. - B06088 - Intel Corporation + 8CEA12 + Shenzhen MiaoMing Intelligent Technology Co.,Ltd - 0C7329 - Sercomm Corporation. + C8BD4D + Samsung Electronics Co.,Ltd - 5CC336 - ittim + 8881B9 + Huawei Device Co., Ltd. - FC041C - Guangdong Oppo Mobile Telecommunications Corp Ltd + 3C38F4 + Sony Corporation - F4D488 - Apple + 0CC413 + Google, Inc. - 682F67 - Apple + 7463C2 + Huawei Device Co., Ltd. - 003DE1 - Huawei Device Ltd + D48FA2 + Huawei Device Co., Ltd. - F06F46 - Ubiik + 2C15BF + Samsung Electronics Co.,Ltd - 50ED3C - Apple + 2CB0FD + Shenzhen MiaoMing Intelligent Technology Co.,Ltd - FC4009 - ZTE Corporation + C4FBC8 + Shenzhen Candour Co., Ltd. - 24A65E - ZTE Corporation + 2CE032 + TCL King Electrical Appliances(Huizhou)Co.,Ltd - 48007D - DTS Elektronik SAN. TIC Ltd STI. + A0D2B1 + Amazon Technologies Inc. - 30B1B5 - Arcadyan Corporation + 806D71 + Amazon Technologies Inc. - 6407F6 - Samsung Electronics Ltd + 88AC9E + Shenzhen YOUHUA Technology Co., Ltd - E0CBBC - Cisco Meraki + 9C36F8 + Hyundai Kefico - 683A1E - Cisco Meraki + E0B72E + ShenZhen Qualmesh Technology Co.,Ltd. - D8ECE5 - ZyXEL Communications Corp + 081605 + Vodafone Italia S.p.A. - C470AB - Ruijie Networks Ltd + 1C53F9 + Google, Inc. - CC6B1E - Cloud Network Technology Singapore PTE Ltd + 04421A + ASUSTek COMPUTER INC. - F0D08C - TCT mobile Ltd + 207C14 + Qotom - 849000 - Arnold & Richter Cine Technik GmbH & Co. Betriebs KG + B859CE + Earda Technologies co Ltd - 30F94B - Universal Electronics Inc. + 100020 + Apple, Inc. - B48A5F - Juniper Networks + BC1E85 + HUAWEI TECHNOLOGIES CO.,LTD - 70DFF7 - ARRIS Group Inc. + B85600 + HUAWEI TECHNOLOGIES CO.,LTD - 00E0DF - DZS GmbH + 305F77 + New H3C Technologies Co., Ltd - E0E8BB - Unicom Vsens Telecommunications Ltd + 8C7A3D + Xiaomi Communications Co Ltd - E4C90B - Radwin + 987EE3 + vivo Mobile Communication Co., Ltd. - 982782 - IEEE Registration Authority + 8C7AAA + Apple, Inc. - 38A067 - Nokia Solutions and Networks GmbH & Co. KG + 7C2499 + Apple, Inc. - 7C1B93 - Huawei Device Ltd + 000D4E + NDR Co.,LTD. - DC2D3C - Huawei Device Ltd + 305696 + Infinix mobility limited - 041119 - IEEE Registration Authority + 7CB073 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - E455A8 - Cisco Meraki + 0CE5A3 + SharkNinja - 0881B2 - Logitech (China) Technology Ltd + 34317F + Panasonic Appliances Company - C4F174 - eero Inc. + B0E9FE + Woan Technology (Shenzhen) Co., Ltd. - 28D0EA - Intel Corporation + C89665 + Microsoft Corporation - E00CE5 - Huawei Technologies Ltd + CC3F8A + KOMATSU LTD. - 2841EC - Huawei Technologies Ltd + EC354D + Wingtech Mobile Communications Co.,Ltd - 7C004D - Huawei Technologies Ltd + 7C3985 + HUAWEI TECHNOLOGIES CO.,LTD - 04D320 - Itel Mobile Limited + 00BD3E + Vizio, Inc - 1C9957 - Intel Corporation + 18F87F + Wha Yu Industrial Co., Ltd. - F46B8C - Hon Hai Precision Ind Ltd + 40E1E4 + Nokia Solutions and Networks GmbH & Co. KG - FC3497 - ASUSTek Computer Inc. + 90F157 + Garmin International - 847AB6 - AltoBeam (China) Inc. + FC5C45 + Ruckus Wireless - 78A6A0 - Hangzhou Ezviz Software Ltd + 10F605 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 4851CF - Intelbras + 5C8F40 + TECNO MOBILE LIMITED - 4C5D3C - Cisco Systems Inc. + 584849 + IEEE Registration Authority - 34732D - Cisco Systems Inc. + E075AA + Beijing Jingling Information System Technology Co., Ltd. - 047BCB - Universal Global Scientific Industrial Ltd + E446B0 + Fujitsu Client Computing Limited - 8C3446 - Huawei Device Ltd + 44AE44 + Huawei Device Co., Ltd. - 804786 - Samsung Electronics Ltd + 444F8E + WiZ - D4475A - ScreenBeam Inc. + 0899E8 + KEMAS GmbH - E44164 - Nokia + 04B86A + SKY UK LIMITED - 34E9FE - Metis Ltd + 54CE82 + zte corporation - AC139C - Adtran Inc + 80CBBC + Qingdao Intelligent&Precise Electronics Co.,Ltd. - A4CEDA - Arcadyan Corporation + F4A475 + Intel Corporate - 8C4361 - Hailo Digital Hub GmbH & Co. KG + C89E43 + NETGEAR - 54725E - Unionman Technology Ltd + 2864EF + Shenzhen Fsan Intelligent Technology Co.,Ltd - 98C3D2 - Ningbo Sanxing Medical Electric Ltd + 180712 + Shenzhen Dazoo Technologies CO.,Ltd - 245DFC + F02A2B IEEE Registration Authority - 487E48 - Earda Technologies Ltd + 04ECD8 + Intel Corporate - E0E37C - Huawei Device Ltd + 700777 + OnTarget Technologies, Inc - 2418C6 - Hunan FN-Link Technology Limited + 000534 + Northstar Engineering Ltd. - 3078D3 - Virgilant Technologies Ltd + BC091B + Intel Corporate - 601895 - Dell Inc. + 0026A7 + CONNECT SRL - E8EA4D - Huawei Technologies Ltd + 8C1D96 + Intel Corporate - 3CFFD8 - Huawei Technologies Ltd + 60DD8E + Intel Corporate - 4C617E - Huawei Device Ltd + 90593C + AZ-TECHNOLOGY SDN BHD - B4107B - Texas Instruments + 1CC10C + Intel Corporate - 649714 - eero Inc. + 00BFAF + Hui Zhou Gaoshengda Technology Co.,LTD - CC86EC - Silicon Laboratories + B4ECFF + Wuhan IPG Technologies Co., Ltd. - 404101 - Rockwell Automation + F057A6 + Intel Corporate - 7C55A7 - Kastle Systems + 642677 + BKM-Micronic Richtfunkanlagen GmbH - 40BEEE - Shenzhen Yunding Information Technology Ltd + 1CE639 + HUAWEI TECHNOLOGIES CO.,LTD - A44C62 - Hangzhou Microimage Software Ltd + 8C6794 + vivo Mobile Communication Co., Ltd. - FCE806 - Edifier International + 001441 + Innovation Sound Technology Co., LTD. - F4C795 - WEY Technology AG + 20D778 + Texas Instruments - 44B462 - Flextronics Tech.(Ind) Pvt Ltd + 4C2FD7 + Huawei Device Co., Ltd. - F8D478 - Flextronics Tech.(Ind) Pvt Ltd + D47415 + Huawei Device Co., Ltd. - 50C2ED - GN Audio A/S + 50586F + Huawei Device Co., Ltd. - 90A822 - Amazon Technologies Inc. + F0B13F + Huawei Device Co., Ltd. - 74AD98 - Cisco Systems Inc. + 7CC255 + Super Micro Computer, Inc. - 848C8D - Apple + 0064AF + Dish Technologies Corp - 0C5CB5 - IEEE Registration Authority + E4B503 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - E84F25 - Murata Manufacturing Ltd + ECF40C + Cisco Systems, Inc - 0425E0 - Taicang T&W Electronics + 1006ED + Cisco Systems, Inc - 3085EB - Fiberhome Telecommunication Technologies Ltd + D4EB68 + Cisco Systems, Inc - 8406FA - Fiberhome Telecommunication Technologies Ltd + C44D84 + Cisco Systems, Inc - C0DCD7 - Huawei Device Ltd + 102CEF + EMU Electronic AG - 3037B3 - Huawei Technologies Ltd + C0D063 + EM Microelectronic - 14CB19 - HP Inc. + 7C10C9 + ASUSTek COMPUTER INC. - 0CE441 - Apple + 38FF13 + Joint Stock Company Research Instinite Masshtab - B82AA9 - Apple + D0DBB7 + Casa Systems - 7864C0 - Apple + 205383 + HUAWEI TECHNOLOGIES CO.,LTD - 385247 - Huawei Device Ltd + B8857B + HUAWEI TECHNOLOGIES CO.,LTD - E81CD8 - Apple + 50D065 + ESYLUX GmbH - 3C0630 - Apple + A8671E + RATP - F40228 - Samsung Electro-Mechanics(Thailand) + 8CE9B4 + Zhejiang Dahua Technology Co., Ltd. - 0C83CC - Alpha Networks Inc. + D88C73 + zte corporation - ECB970 - Ruijie Networks Ltd + E87865 + Apple, Inc. - 308398 - Espressif Inc. + B4CDF5 + CUB ELECPARTS INC. - F889D2 - Cloud Network Technology Singapore PTE Ltd + A04ECF + Apple, Inc. - 1027F5 - TP-Link Corporation Limited + 0887C7 + Apple, Inc. - B04F13 - Dell Inc. + 3865B2 + Apple, Inc. - C04B13 - WonderSound Technology Ltd + D8DE3A + Apple, Inc. - 9C7F81 - Shenzhen Fast Technologies Ltd + 08855B + Kontron Europe GmbH - C4BCD7 - New Ryatek + E84FA7 + Huawei Device Co., Ltd. - C0AEFD - Shenzhen HC-WLAN Technology Ltd + 449F46 + Huawei Device Co., Ltd. - 206A94 - Hitron Technologies Inc. + 345184 + Huawei Device Co., Ltd. - 309587 - Hunan FN-Link Technology Limited + FCF77B + Huawei Device Co., Ltd. - DC87CB - Beijing Perfectek Technologies Ltd + 844709 + Shenzhen IP3 Century Intelligent Technology CO.,Ltd - 102D41 - Sichuan AI-Link Technology Ltd + 5CD06E + Xiaomi Communications Co Ltd - 642753 - Huawei Device Ltd + 0091EB + Renesas Electronics (Penang) Sdn. Bhd. - 7CF666 - Tuya Smart Inc. + DCF56E + Wellysis Corp. - 28534E - Huawei Technologies Ltd + EC08E5 + Motorola Mobility LLC, a Lenovo Company - 5CB00A - Huawei Technologies Ltd + 280FEB + LG Innotek - 00C06A - Zahner-Elektrik Ingeborg Zahner-Schiller GmbH & Co. KG. + 74E20C + Amazon Technologies Inc. - 201E88 - Intel Corporation + 4CD577 + CHONGQING FUGUI ELECTRONICS CO.,LTD. - 20CE2A - IEEE Registration Authority + 745D68 + Fiberhome Telecommunication Technologies Co.,LTD - 5813D3 - Gemtek Technology Ltd + 20CFAE + Cisco Systems, Inc - 00E5E4 - Sichuan Tianyi Comheart Telecom Ltd + CC1531 + Intel Corporate - 1469A2 - Sichuan Tianyi Comheart Telecom Ltd + C0F9B0 + HUAWEI TECHNOLOGIES CO.,LTD - 046B25 - Sichuan Tianyi Comheart Telecom Ltd + 148C4A + HUAWEI TECHNOLOGIES CO.,LTD - 1012B4 - Sichuan Tianyi Comheart Telecom Ltd + 609BB4 + HUAWEI TECHNOLOGIES CO.,LTD - 9C32A9 - Sichuan Tianyi Comheart Telecom Ltd + 105403 + INTARSO GmbH - 68262A - Sichuan Tianyi Comheart Telecom Ltd + 7C27BC + Hui Zhou Gaoshengda Technology Co.,LTD - B8224F - Sichuan Tianyi Comheart Telecom Ltd + C0238D + Samsung Electronics Co.,Ltd - 908674 - Sichuan Tianyi Comheart Telecom Ltd + 0C6046 + vivo Mobile Communication Co., Ltd. - 88C9B3 - IEEE Registration Authority + CC2D8C + LG ELECTRONICS INC - C8BD69 - Samsung Electronics Ltd + 0C9A3C + Intel Corporate - 643AB1 - Sichuan Tianyi Comheart Telecom Ltd + DC2148 + Intel Corporate - 44BA46 - Sichuan Tianyi Comheart Telecom Ltd + 44DB60 + Nanjing Baihezhengliu Technology Co., Ltd - A87650 - Samsung Electronics Ltd + B8B77D + Guangdong Transtek Medical Electronics CO.,Ltd - 54D17D - Samsung Electronics Ltd + C478A2 + Huawei Device Co., Ltd. - 603AAF - Samsung Electronics Ltd + C0FBF9 + IEEE Registration Authority - 8048A5 - Sichuan Tianyi Comheart Telecom Ltd + 2811A8 + Intel Corporate - 5466F9 - ConMet + 74CF00 + Shenzhen SuperElectron Technology Co.,Ltd. 589153 China Mobile IOT Company Limited + + 987DDD + China Mobile Group Device Co.,Ltd. + B81332 AMPAK Technology,Inc. - 987DDD - China Mobile Group Device Ltd + ACE14F + Autonomic Controls, Inc. - 44DB60 - Nanjing Baihezhengliu Technology Ltd + AC976C + Greenliant - B8B77D - Guangdong Transtek Medical Electronics Ltd + 2CEADC + ASKEY COMPUTER CORP - C478A2 - Huawei Device Ltd + 9C5A81 + Xiaomi Communications Co Ltd - 9C9E71 - Huawei Device Ltd + 643AB1 + Sichuan Tianyi Comheart Telecom Co.,LTD - 0C9A3C - Intel Corporation + 8048A5 + Sichuan Tianyi Comheart Telecom Co.,LTD - DC2148 - Intel Corporation + 44BA46 + Sichuan Tianyi Comheart Telecom Co.,LTD - 74CF00 - Shenzhen SuperElectron Technology Ltd + 9C32A9 + Sichuan Tianyi Comheart Telecom Co.,LTD - 2CEADC - Askey Computer Corp + 908674 + Sichuan Tianyi Comheart Telecom Co.,LTD - ACE14F - Autonomic Controls Inc. + 9C9E71 + Huawei Device Co., Ltd. - AC976C - Greenliant + 98499F + Domo Tactical Communications - 381428 - Dell Inc. + 88C9B3 + IEEE Registration Authority - 745D68 - Fiberhome Telecommunication Technologies Ltd + 5813D3 + Gemtek Technology Co., Ltd. - 20CFAE - Cisco Systems Inc. + 201E88 + Intel Corporate - 98499F - Domo Tactical Communications + 206A94 + Hitron Technologies. Inc - C0F9B0 - Huawei Technologies Ltd + 309587 + HUNAN FN-LINK TECHNOLOGY LIMITED - 148C4A - Huawei Technologies Ltd + 20CE2A + IEEE Registration Authority - 609BB4 - Huawei Technologies Ltd + 7CF666 + Tuya Smart Inc. - C0238D - Samsung Electronics Ltd + 68262A + Sichuan Tianyi Comheart Telecom Co.,LTD - 2811A8 - Intel Corporation + B8224F + Sichuan Tianyi Comheart Telecom Co.,LTD - C0FBF9 - IEEE Registration Authority + C8BD69 + Samsung Electronics Co.,Ltd - 4CD577 - Chongqing Fugui Electronics Ltd + A87650 + Samsung Electronics Co.,Ltd - EC08E5 - Motorola Mobility LLC, a Lenovo Company + 54D17D + Samsung Electronics Co.,Ltd - 80CC9C - Netgear + 603AAF + Samsung Electronics Co.,Ltd - 7C27BC - Hui Zhou Gaoshengda Technology Ltd + C04B13 + WonderSound Technology Co., Ltd - 507097 - China Mobile Group Device Ltd + 9C7F81 + SHENZHEN FAST TECHNOLOGIES CO.,LTD - CC1531 - Intel Corporation + 642753 + Huawei Device Co., Ltd. - 280FEB - LG Innotek + 28534E + HUAWEI TECHNOLOGIES CO.,LTD - 74E20C - Amazon Technologies Inc. + 5CB00A + HUAWEI TECHNOLOGIES CO.,LTD - 105403 - INTARSO GmbH + 00E5E4 + Sichuan Tianyi Comheart Telecom Co.,LTD - 000C04 - Tecnova + 1469A2 + Sichuan Tianyi Comheart Telecom Co.,LTD - 844709 - Shenzhen IP3 Century Intelligent Technology Ltd + 046B25 + Sichuan Tianyi Comheart Telecom Co.,LTD - 0091EB - Renesas Electronics (Penang) Sdn. Bhd. + 1012B4 + Sichuan Tianyi Comheart Telecom Co.,LTD - 449F46 - Huawei Device Ltd + 102D41 + Sichuan AI-Link Technology Co., Ltd. - 345184 - Huawei Device Ltd + DC87CB + Beijing Perfectek Technologies Co., Ltd. - FCF77B - Huawei Device Ltd + F40228 + SAMSUNG ELECTRO-MECHANICS(THAILAND) - 8CAEDB - Nagtech LLC + 0C83CC + Alpha Networks Inc. - DCF56E - Wellysis Corp. + C8B6FE + Fitbit, Inc. - 000060 - Kontron Europe GmbH + 001CC5 + 3Com Ltd - 60FCF1 - Private + E84F25 + Murata Manufacturing Co., Ltd. - E84FA7 - Huawei Device Ltd + 0425E0 + Taicang T&W Electronics - C0D063 - EM Microelectronic + 385247 + Huawei Device Co., Ltd. - 7C10C9 - ASUSTek Computer Inc. + C4BCD7 + New Ryatek - 00C06F - Komatsu Ltd + C0AEFD + Shenzhen HC-WLAN Technology Co.,Ltd - A8671E - Ratp + C0DCD7 + Huawei Device Co., Ltd. - 8CE9B4 - Zhejiang Dahua Technology Ltd + 3037B3 + HUAWEI TECHNOLOGIES CO.,LTD - 08855B - Kontron Europe GmbH + 3085EB + Fiberhome Telecommunication Technologies Co.,LTD - E4B503 - Realme Chongqing Mobile Telecommunications Corp Ltd + 8406FA + Fiberhome Telecommunication Technologies Co.,LTD - ECF40C - Cisco Systems Inc. + B8D43E + vivo Mobile Communication Co., Ltd. - 1006ED - Cisco Systems Inc. + 14CB19 + HP Inc. - D4EB68 - Cisco Systems Inc. + ECB970 + Ruijie Networks Co.,LTD - C44D84 - Cisco Systems Inc. + F889D2 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 205383 - Huawei Technologies Ltd + 848C8D + Apple, Inc. - B8857B - Huawei Technologies Ltd + 0CE441 + Apple, Inc. - 2421AB - Sony Corporation + B82AA9 + Apple, Inc. - 002298 - Sony Corporation + 7864C0 + Apple, Inc. - 001B59 - Sony Corporation + E81CD8 + Apple, Inc. - 8C6422 - Sony Corporation + 3C0630 + Apple, Inc. - B8F934 - Sony Corporation + 741575 + Xiaomi Communications Co Ltd - 40B837 - Sony Corporation + 7C55A7 + Kastle Systems - E063E5 - Sony Corporation - - - 4C21D0 - Sony Corporation + FCE806 + Edifier International - 1C7B21 - Sony Corporation + 3078D3 + Virgilant Technologies Ltd. - 000FDE - Sony Corporation + 0017E8 + Texas Instruments - 3C01EF - Sony Corporation + E8EA4D + HUAWEI TECHNOLOGIES CO.,LTD - 102CEF - EMU Electronic AG + 3CFFD8 + HUAWEI TECHNOLOGIES CO.,LTD - 6CCF39 - Guangdong Starfive Technology Ltd + 40BEEE + Shenzhen Yunding Information Technology Co.,Ltd - B4CDF5 - CUB Elecparts Inc. + A44C62 + Hangzhou Microimage Software Co., Ltd - D88C73 - ZTE Corporation + CC86EC + Silicon Laboratories - 3865B2 - Apple + 9C8281 + vivo Mobile Communication Co., Ltd. - D8DE3A - Apple + 4C617E + Huawei Device Co., Ltd. - E87865 - Apple + E0E37C + Huawei Device Co., Ltd. - A04ECF - Apple + 2418C6 + HUNAN FN-LINK TECHNOLOGY LIMITED - 50D065 - ESYLUX GmbH + 50C2ED + GN Audio A/S - 0887C7 - Apple + 90A822 + Amazon Technologies Inc. - 8C1D96 - Intel Corporation + 0C5CB5 + IEEE Registration Authority - 60DD8E - Intel Corporation + 74AD98 + Cisco Systems, Inc - 90593C - AZ-Technology SDN BHD + B4107B + Texas Instruments - 1CC10C - Intel Corporation + 00C06A + Zahner-Elektrik Ingeborg Zahner-Schiller GmbH & Co. KG. - F4A475 - Intel Corporation + 8C4361 + Hailo Digital Hub GmbH & Co. KG - 38FF13 - Joint Stock Company Research Instinite Masshtab + 4851CF + Intelbras - D0DBB7 - Casa Systems + 4C5D3C + Cisco Systems, Inc - 2864EF - Shenzhen Fsan Intelligent Technology Ltd + 34732D + Cisco Systems, Inc - C89E43 - Netgear + E44164 + Nokia - 7CC255 - Super Micro Computer Inc. + 0881B2 + Logitech (China) Technology Co., Ltd - 180712 - Shenzhen Dazoo Technologies Ltd + 28D0EA + Intel Corporate - 20BECD - eero Inc. + E00CE5 + HUAWEI TECHNOLOGIES CO.,LTD - 0008AC - BST GmbH + D4475A + ScreenBeam, Inc. - BC091B - Intel Corporation + F46B8C + Hon Hai Precision Industry Co., Ltd. - 00BFAF - Hui Zhou Gaoshengda Technology Ltd + FC3497 + ASUSTek COMPUTER INC. - 0064AF - Dish Technologies Corp + AC139C + Adtran Inc - 04ECD8 - Intel Corporation + A4CEDA + Arcadyan Corporation - F02A2B - IEEE Registration Authority + 2841EC + HUAWEI TECHNOLOGIES CO.,LTD - 0025DF - Private + 7C004D + HUAWEI TECHNOLOGIES CO.,LTD - D0497C - OnePlus Technology (Shenzhen) Ltd + 1C9957 + Intel Corporate - B4ECFF - Wuhan IPG Technologies Ltd + 04D320 + ITEL MOBILE LIMITED - F057A6 - Intel Corporation + 8C3446 + Huawei Device Co., Ltd. - 642677 - BKM-Micronic Richtfunkanlagen GmbH + 804786 + Samsung Electronics Co.,Ltd - 4C2FD7 - Huawei Device Ltd + 34E9FE + Metis Co., Ltd. - D47415 - Huawei Device Ltd + 98C3D2 + Ningbo Sanxing Medical Electric Co.,Ltd - 50586F - Huawei Device Ltd + 245DFC + IEEE Registration Authority - F0B13F - Huawei Device Ltd + D8ECE5 + Zyxel Communications Corporation - 1CE639 - Huawei Technologies Ltd + C470AB + Ruijie Networks Co.,LTD - 20D778 - Texas Instruments + CC6B1E + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 700777 - OnTarget Technologies Inc. + F0D08C + TCT mobile ltd - 10F605 - Realme Chongqing Mobile Telecommunications Corp Ltd + E0E8BB + Unicom Vsens Telecommunications Co., Ltd. - 5C8F40 - Tecno Mobile Limited + 982782 + IEEE Registration Authority - 103F44 - Xiaomi Communications Ltd + FC4009 + zte corporation - 9CBCF0 - Xiaomi Communications Ltd + 24A65E + zte corporation 509839 - Xiaomi Communications Ltd + Xiaomi Communications Co Ltd - 741575 - Xiaomi Communications Ltd + CC812A + vivo Mobile Communication Co., Ltd. - 9C5A81 - Xiaomi Communications Ltd + 7C1B93 + Huawei Device Co., Ltd. - 5CD06E - Xiaomi Communications Ltd + DC2D3C + Huawei Device Co., Ltd. - 90F157 - Garmin International + E455A8 + Cisco Meraki - FC5C45 - Ruckus Wireless + 30F94B + Universal Electronics, Inc. - 4C0220 - Xiaomi Communications Ltd + 041119 + IEEE Registration Authority - 40E1E4 + 38A067 Nokia Solutions and Networks GmbH & Co. KG - E446B0 - Fujitsu Client Computing Limited + E4C90B + Radwin - 80CBBC - Qingdao Intelligent & Precise Electronics Ltd + 6407F6 + Samsung Electronics Co.,Ltd - E075AA - Beijing Jingling Information System Technology Ltd + 5CC336 + ittim - 54CE82 - ZTE Corporation + FC041C + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - F4CE48 - Extreme Networks Inc. + 003DE1 + Huawei Device Co., Ltd. - 584849 - IEEE Registration Authority + F06F46 + Ubiik - 708976 - Tuya Smart Inc. + B06088 + Intel Corporate - 0899E8 - KEMAS GmbH + 48007D + DTS ELEKTRONIK SAN. TIC. LTD. STI. - 18F87F - Wha Yu Industrial Ltd + 30B1B5 + Arcadyan Corporation - 444F8E - WiZ + 68ABBC + Beijing Xiaomi Mobile Software Co., Ltd - 04B86A - BSkyB Ltd + F4D488 + Apple, Inc. - 1C880C - Shenzhen Skyworth Digital Technology Ltd + 682F67 + Apple, Inc. - EC354D - Wingtech Mobile Communications Ltd + 50ED3C + Apple, Inc. - 80615F - Beijing Sinead Technology Ltd + D814DF + TCL King Electrical Appliances (Huizhou) Co., Ltd - 44AE44 - Huawei Device Ltd + 90027A + Shenzhen Sworix Techonlogy Co., Ltd - 20B001 - Technicolor Delivery Technologies Belgium NV + D05AFD + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 7C3985 - Huawei Technologies Ltd + 34C103 + Hangzhou Huamu Technology Co.,Ltd. - A4B1E9 - Technicolor Delivery Technologies Belgium NV + 584120 + TP-LINK TECHNOLOGIES CO.,LTD. - 305696 - Infinix mobility limited + 3C06A7 + TP-LINK TECHNOLOGIES CO.,LTD. - 7CB073 - Realme Chongqing Mobile Telecommunications Corp Ltd + 24E927 + TomTom International BV - B0E9FE - Woan Technology (Shenzhen) Ltd + F0F564 + Samsung Electronics Co.,Ltd - 00BD3E - Vizio Inc. + 708976 + Tuya Smart Inc. - C89665 - Microsoft Corporation + 245B83 + Renesas Electronics (Penang) Sdn. Bhd. - 0CE5A3 - SharkNinja + 845CF3 + Intel Corporate - 6C9106 - Private + 2C793D + Boditech Med - 409151 - Espressif Inc. + 6C02E0 + HP Inc. - CC3F8A - Komatsu Ltd + F0ACA4 + HBC-radiomatic - 34317F - Panasonic Appliances Company + 64D7C0 + Huawei Device Co., Ltd. - F4EE08 - Dell Inc. + 946010 + Huawei Device Co., Ltd. - 100020 - Apple + 903CB3 + Edgecore Networks Corporation - 946424 - Aruba Networks HP + 802278 + China Mobile IOT Company Limited - BC1E85 - Huawei Technologies Ltd + 6413AB + HUAWEI TECHNOLOGIES CO.,LTD - B85600 - Huawei Technologies Ltd + 0C7329 + Sercomm Corporation. - B859CE - Earda Technologies Ltd + 6C13D5 + Cisco Systems, Inc - 8C7A3D - Xiaomi Communications Ltd + F89725 + OPPLE LIGHTING CO., LTD - 305F77 - New H3C Technologies Ltd + 5466F9 + ConMet - 7C2499 - Apple + 8C64D4 + Hyeco Smart Tech Co.,Ltd - 8C7AAA - Apple + 14230A + HUAWEI TECHNOLOGIES CO.,LTD - 9C36F8 - Hyundai Kefico + 58AEA8 + HUAWEI TECHNOLOGIES CO.,LTD - E0B72E - Shenzhen Qualmesh Technology Ltd + 6CD704 + HUAWEI TECHNOLOGIES CO.,LTD - 04421A - ASUSTek Computer Inc. + 543AD6 + Samsung Electronics Co.,Ltd - 2CE032 - TCL King Electrical Appliances(Huizhou) Ltd + 544617 + zte corporation - A0D2B1 - Amazon Technologies Inc. + 8444AF + Zhejiang Tmall Technology Co., Ltd. - 806D71 - Amazon Technologies Inc. + 8CDEF9 + Beijing Xiaomi Mobile Software Co., Ltd - 081605 - Vodafone Italia S.p.A. + D03C1F + Intel Corporate - 207C14 - Qotom + A03D6E + Cisco Systems, Inc - 1C53F9 - Google Inc. + B08BD0 + Cisco Systems, Inc - 2CB0FD - Shenzhen MiaoMing Intelligent Technology Ltd + 5C85F8 + SHENZHEN KAIFA TECHNOLOGY CO.,LTD. - C4FBC8 - Shenzhen Candour Ltd + 9CBCF0 + Xiaomi Communications Co Ltd - E80115 - CoOCAA Network Technology Co.,TD. + 0C4885 + LG Electronics (Mobile Communications) - 8CEA12 - Shenzhen MiaoMing Intelligent Technology Ltd + 70E46E + Lytx - 88AC9E - Shenzhen YOUHUA Technology Ltd + 58AE2B + Huawei Device Co., Ltd. - C8BD4D - Samsung Electronics Ltd + E43C80 + University of Oklahoma - 2C15BF - Samsung Electronics Ltd + A8F766 + ITE Tech Inc - 3CE4B0 - Texas Instruments + 7C210D + Cisco Systems, Inc - B4B024 - TP-Link Corporation Limited + 34FEC5 + Shenzhen Sunwoda intelligent hardware Co.,Ltd - 18F22C - TP-Link Technologies Ltd + FCD436 + Motorola Mobility LLC, a Lenovo Company - 9897CC - TP-Link Technologies Ltd + 0CEC8D + Motorola Mobility LLC, a Lenovo Company - 043855 - Scopus International-Belgium + 103F44 + Xiaomi Communications Co Ltd - E8979A - Quectel Wireless Solutions Ltd + 8C3401 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 5CA6E6 - TP-Link Corporation Limited + 000BDE + TELDIX GmbH - B88A72 - Renesas Electronics (Penang) Sdn. Bhd. + A46BB6 + Intel Corporate - C436C0 - Buffalo Inc. + FC0C45 + Shenzhen SuperElectron Technology Co.,Ltd. - 2C53D7 - Sonova AG + 5467E6 + SHENZHEN MTC CO LTD - 0CC413 - Google Inc. + D439B8 + Ciena Corporation - D48FA2 - Huawei Device Ltd + 249F89 + Texas Instruments - 8881B9 - Huawei Device Ltd + 247625 + Texas Instruments - 7463C2 - Huawei Device Ltd + F87A41 + Cisco Systems, Inc - 908D6E - Dell Inc. + 84F147 + Cisco Systems, Inc - 3C38F4 - Sony Corporation + 74E9BF + HUAWEI TECHNOLOGIES CO.,LTD - DCA782 - Huawei Technologies Ltd + D8109F + HUAWEI TECHNOLOGIES CO.,LTD - 045170 - Zhongshan K-mate General Electronics Ltd + 3C5447 + HUAWEI TECHNOLOGIES CO.,LTD - 384554 - Harman/Becker Automotive Systems GmbH + 006B6F + HUAWEI TECHNOLOGIES CO.,LTD - 88D82E - Intel Corporation + 603573 + Earda Technologies co Ltd - 180EAC - Shenzhen Fast Technologies Ltd + A49733 + ASKEY COMPUTER CORP - 4CEAAE - Guangdong Oppo Mobile Telecommunications Corp Ltd + F02F74 + ASUSTek COMPUTER INC. - 50547B - Nanjing Qinheng Microelectronics Ltd + 006E02 + Xovis AG - 144920 - Huawei Technologies Ltd + 2C1875 + Skyworth Digital Technology(Shenzhen) Co.,Ltd - D41AD1 - ZyXEL Communications Corp + 482567 + Poly - B845F4 - New H3C Technologies Ltd + A89AD7 + Nokia - EC01D5 - Cisco Systems Inc. + 181171 + Guangzhou Doctorpai Education & Technology Co.,Ltd - 90F3B8 - China Mobile Group Device Ltd + ACF85C + Chengdu Higon Integrated Circuit Design Co,. Ltd. - 38563D - Microsoft Corporation + 00E93A + AzureWave Technology Inc. - 10BC97 - Vivo Mobile Communication Ltd + 78F09B + Huawei Device Co., Ltd. - CC812A - Vivo Mobile Communication Ltd + 48EF61 + Huawei Device Co., Ltd. - 9C8281 - Vivo Mobile Communication Ltd + E07726 + Huawei Device Co., Ltd. - B8D43E - Vivo Mobile Communication Ltd + 44F21B + Apple, Inc. - 0C6046 - Vivo Mobile Communication Ltd + 74650C + Apple, Inc. - 8C6794 - Vivo Mobile Communication Ltd + E06D17 + Apple, Inc. - 08B49D - Tecno Mobile Limited + F0B3EC + Apple, Inc. - 28937D - Sichuan Tianyi Comheart Telecom Ltd + F465A6 + Apple, Inc. - 987EE3 - Vivo Mobile Communication Ltd + F023AE + AMPAK Technology,Inc. - D4C3B0 - Gearlinx Pty Ltd + 0034A1 + RF-LAMBDA USA INC. - E070EA - HP Inc. + 249494 + Hong Kong Bouffalo Lab Limited - 942957 - Airpo Networks Technology Ltd + 30BE3B + Mitsubishi Electric Corporation - 405F7D - TCT mobile Ltd + 3CA37E + HUAWEI TECHNOLOGIES CO.,LTD - 4C034F - Intel Corporation + 7898E8 + D-Link International - 04D921 - Occuspace + F8E43B + ASIX Electronics Corporation - 986EE8 - IEEE Registration Authority + 60DB98 + Calix Inc. - D4ADFC - Private + 6872C3 + Samsung Electronics Co.,Ltd - 1C73E2 - Huawei Technologies Ltd + 70B13D + Samsung Electronics Co.,Ltd - 8C83E8 - Huawei Technologies Ltd + F85EA0 + Intel Corporate - 6457E5 - Beijing Royaltech Ltd + 14563A + Huawei Device Co., Ltd. - FC9BD4 - EdgeQ + 7090B7 + Huawei Device Co., Ltd. - 145790 - Qingdao Haier Technology Ltd + 38FC98 + Intel Corporate - F829C0 - Availink Inc. + 502F9B + Intel Corporate - 24B72A - China Dragon Technology Limited + 00188C + Mobile Action Technology Inc. - 34A5B4 - Navtech PTE Ltd + 1C90BE + Ericsson AB - E89F6D - Espressif Inc. + 342B70 + Arris - 9877CB - Vorteks ED + 4C0220 + Xiaomi Communications Co Ltd - 3498B5 - Netgear + D41B81 + CHONGQING FUGUI ELECTRONICS CO.,LTD. - 389461 - Renesas Electronics (Penang) Sdn. Bhd. + F40B9F + CIG SHANGHAI CO LTD - 485519 - Espressif Inc. + C094AD + zte corporation - F8FCE1 - Amazon Technologies Inc. + 5C6199 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 703217 - Intel Corporation + E8DB84 + Espressif Inc. - 1859F5 - Cisco Systems Inc. + A07751 + ASMedia Technology Inc. - 14C9CF - Sigmastar Technology Ltd + 305684 + SHENZHEN YUNJI INTELLIGENT TECHNOLOGY CO.,LTD - 6444D5 - Private + 00081E + Repeatit AB - DC6294 - Guangzhou Lango Electronics Technology Ltd + 74731D + ifm electronic gmbh - 5C46B0 - SIMCom Wireless Solutions Limited + 001F94 + Lascar Electronics Ltd - 3C219C - Intel Corporation + 787DF3 + Sterlite Technologies Limited - EC4269 - HMD Global Oy + D05509 + Nintendo Co.,Ltd - 281D21 - IN ONE Smart Technology(H,K,)Limited + 9CB2E8 + HUAWEI TECHNOLOGIES CO.,LTD - 74E336 - Fujian Star-NET Communication Ltd + 088FC3 + COMPAL INFORMATION (KUNSHAN) CO., LTD. - B0739C - Amazon Technologies Inc. + D021AC + Yohana - C4345B - Huawei Technologies Ltd + 7845B3 + Huawei Device Co., Ltd. - 84BA20 - Silicon Laboratories + 20DCFD + Huawei Device Co., Ltd. - 003C84 - Silicon Laboratories + FC65B3 + Huawei Device Co., Ltd. - C02C5C - Apple + 109D7A + Huawei Device Co., Ltd. - D45763 - Apple + DC6373 + OBARA KOREA - 049F15 - Private + D47EE4 + China Mobile IOT Company Limited - 483E5E - Sernet (Suzhou) Technologies Corporation + 1CA852 + SENSAIO PTE LTD - 50EBF6 - ASUSTek Computer Inc. + 401C83 + Intel Corporate - C448FA - Taicang T&W Electronics + 443B32 + Intelbras - A89892 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 683E26 + Intel Corporate - E0720A - Shenzhen SuperElectron Technology Ltd + 8C554A + Intel Corporate - 60FF12 - Samsung Electronics Ltd + 549FC6 + Cisco Systems, Inc - 24C613 - Samsung Electronics Ltd + F01D2D + Cisco Systems, Inc - 94E129 - Samsung Electronics Ltd + 0055B1 + Shanghai Baud Data Communication Co.,Ltd. - D0A0D6 - ChengDu TD Tech + 74901F + Ragile Networks Inc. - 24D904 - Sichuan Changhong Network Technologies Ltd + 88892F + HUAWEI TECHNOLOGIES CO.,LTD - 3C457A - BSkyB Ltd + 28E5B0 + HUAWEI TECHNOLOGIES CO.,LTD - 902759 - Nanjing Jiahao Technology Ltd + 38CA73 + Shenzhen MiaoMing Intelligent Technology Co.,Ltd - 0013CA - ATX + 6C0DC4 + Beijing Xiaomi Electronics Co., Ltd. - 2804C6 - Wanan Hongsheng Electronic Ltd + C440F6 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - D47954 - Huawei Device Ltd + E01CFC + D-Link International - C44F96 - Alps Alpine + 204EF6 + AzureWave Technology Inc. - 685811 - Fiberhome Telecommunication Technologies Ltd + FC449F + zte corporation - C839AC - Huawei Device Ltd + 9860CA + Apple, Inc. - 145594 - Huawei Device Ltd + 4490BB + Apple, Inc. - 08C06C - Huawei Device Ltd + 34FD6A + Apple, Inc. - FC0296 - Xiaomi Communications Ltd + 443583 + Apple, Inc. - 60E85B - Texas Instruments + 0C8B7D + Vizio, Inc - EC2A72 - Dell Inc. + 3C7C3F + ASUSTek COMPUTER INC. - B4BA02 - Agatel Ltd + 24470E + PentronicAB - 14EBB6 - TP-Link Corporation Limited + 8CD67F + EM Microelectronic - 54AF97 - TP-Link Corporation Limited + 34916F + UserGate Ltd. - 54CF8D - Huawei Technologies Ltd + 142C78 + GooWi Wireless Technology Co., Limited - F863D9 - ARRIS Group Inc. + 98FC84 + IEEE Registration Authority - A405D6 - ARRIS Group Inc. + EC4D3E + Beijing Xiaomi Mobile Software Co., Ltd - DCA633 - ARRIS Group Inc. + EC3EB3 + Zyxel Communications Corporation - 1845B3 - IEEE Registration Authority + D8A491 + Huawei Device Co., Ltd. - ECE744 - Omntec mfg Inc. + 681324 + Huawei Device Co., Ltd. - 2C4DDE - Tecno Mobile Limited + A8C092 + Huawei Device Co., Ltd. - 303F7B - Shenzhen YOUHUA Technology Ltd + 5C91FD + Jaewoncnc - D48457 - GD Midea Air-Conditioning Equipment Ltd + F82E3F + HUAWEI TECHNOLOGIES CO.,LTD - D8CFBF - Motorola Mobility LLC, a Lenovo Company + 90A5AF + HUAWEI TECHNOLOGIES CO.,LTD - D48866 - Huawei Technologies Ltd + 0476B0 + Cisco Systems, Inc - 00C09B - Tellabs Enterprise Inc. + 40F078 + Cisco Systems, Inc - 68BE49 - Nebula Matrix + 78D71A + Ciena Corporation - 940D2D - Universal Electronics Inc. + 24B105 + Prama Hikvision India Private Limited - 94F827 - Shanghai Imilab Technology Ltd + 709CD1 + Intel Corporate - F0B040 - Hunan FN-Link Technology Limited + 4CAEEC + Guangzhou limee technology co.,LTD - 482F6B - Aruba Networks HP + 8060B7 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 4C06B7 - ProDVX Europe B.V. + DC7223 + Hui Zhou Gaoshengda Technology Co.,LTD - 7486E2 - Dell Inc. + 90AAC3 + Hitron Technologies. Inc - A88C3E - Microsoft Corporation + 44917C + HMD Global Oy - F814FE - Unionman Technology Ltd + 245F9F + Huawei Device Co., Ltd. - 34CE69 - Nokia Solutions and Networks GmbH & Co. KG + CCB0A8 + Huawei Device Co., Ltd. - 70B8F6 - Espressif Inc. + 502873 + Huawei Device Co., Ltd. - 149E5D - JSC IB Reform + 3420E3 + Ruckus Wireless - F82551 - Seiko Epson Corporation + 20F44F + Nokia - E484D3 - Xiaomi Communications Ltd + 345594 + FUJIAN STAR-NET COMMUNICATION CO.,LTD - 04106B - Xiaomi Communications Ltd + 4C93A6 + IEEE Registration Authority - 04CCBC - Huawei Technologies Ltd + CC47BD + Rhombus Systems - 1CE504 - Huawei Technologies Ltd + 40AA56 + China Dragon Technology Limited - 2C0BAB - Huawei Technologies Ltd + 68545A + Intel Corporate - E0A25A - Shanghai Mo xiang Network Technology Ltd + 4CB99B + WEIFANG GOERTEK ELECTRONICS CO.,LTD - 147EA1 - Britania Eletronicos S.A. + BC7E8B + Samsung Electronics Co.,Ltd - E81656 - Hangzhou BroadLink Technology Ltd + 9C6B37 + Renesas Electronics (Penang) Sdn. Bhd. - 94D2BC - Huawei Technologies Ltd + A83759 + Huawei Device Co., Ltd. - 7453A8 - ACL Airshop BV + 50F7ED + Huawei Device Co., Ltd. - 68C8EB - Rockwell Automation + 001E31 + infomark - 348511 - Shenzhen Skyworth Digital Technology Ltd + 5488DE + Cisco Systems, Inc - 201F54 - Raisecom Technology Ltd + 24FD0D + Intelbras - 7C97E1 - Huawei Device Ltd + 0C31DC + HUAWEI TECHNOLOGIES CO.,LTD - C83E9E - Huawei Device Ltd + 40DDD1 + Beautiful Card Corporation - 60DD70 - Apple + C0E7BF + Sichuan AI-Link Technology Co., Ltd. - 98A5F9 - Apple + 6433DB + Texas Instruments - E0D045 - Intel Corporation + A406E9 + Texas Instruments - 000C36 - S-Takaya Electronics Industry Ltd + B0B113 + Texas Instruments - ECA907 - Apple + E0B260 + TENO NETWORK TECHNOLOGIES COMPANY LIMITED - 2887BA - TP-Link Corporation Limited + 346D9C + Carrier Corporation - 3460F9 - TP-Link Corporation Limited + 7CF9A0 + Fiberhome Telecommunication Technologies Co.,LTD - 6425EC - Guangdong kesheng zhixun technology + 6CA4D1 + Fiberhome Telecommunication Technologies Co.,LTD - 684AE9 - Samsung Electronics Ltd + A446B4 + Huawei Device Co., Ltd. - 0050E8 - Nomadix Inc. + DCD444 + Huawei Device Co., Ltd. - 54ACFC - LIZN ApS + D4F756 + zte corporation - 4C7274 - Shenzhenshi xinzhongxin Technology Ltd + 482335 + Dialog Semiconductor Hellas SA - F4B898 - Texas Instruments + E8DA20 + Nintendo Co.,Ltd - B0D278 - Texas Instruments + 70828E + OleumTech Corporation - A439B3 - Beijing Xiaomi Mobile Software Ltd + 20A171 + Amazon Technologies Inc. - 6CFFCE - Sagemcom Broadband SAS + E0693A + Innophase Inc. - C899B2 - Arcadyan Corporation + 0002AC + 3PAR data - B03893 - Onda TLC GmbH + 782B64 + Bose Corporation - 1C9D72 - Technicolor CH USA Inc. + 54AB3A + Quanta Computer Inc. - 0CB815 - Espressif Inc. + E89A8F + Quanta Computer Inc. - 800CF9 - Amazon Technologies Inc. + EC6C9A + Arcadyan Corporation - A09208 - Tuya Smart Inc. + 10BC97 + vivo Mobile Communication Co., Ltd. - C8727E - Nokia + 4401BB + SHENZHEN BILIAN ELECTRONIC CO.,LTD - 00F871 - Demant A/S + C80210 + LG Innotek - 60A6C5 - Huawei Technologies Ltd + 001EB2 + LG Innotek - 208C86 - Huawei Technologies Ltd + 3C53D7 + CEDES AG - F0A951 - Huawei Technologies Ltd + 44680C + Wacom Co.,Ltd. - 64D69A - Intel Corporation + 980E24 + Phytium Technology Co.,Ltd. - 185E0B - ZTE Corporation + A830BC + Samsung Electronics Co.,Ltd - D0BB61 - ZTE Corporation + 7846D4 + Samsung Electronics Co.,Ltd - AC7352 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 1C98C1 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 588FCF - Hangzhou Ezviz Software Ltd + A09B17 + Taicang T&W Electronics - 942A6F - Ubiquiti Networks Inc. + A0D83D + Fiberhome Telecommunication Technologies Co.,LTD - F4E2C6 - Ubiquiti Networks Inc. + 58F2FC + Huawei Device Co., Ltd. - A84FB1 - Cisco Systems Inc. + 507043 + SKY UK LIMITED - 50C275 - GN Audio A/S + E8136E + HUAWEI TECHNOLOGIES CO.,LTD - 94B555 - Espressif Inc. + 4CAE13 + HUAWEI TECHNOLOGIES CO.,LTD - 74F2FA - Xiaomi Communications Ltd + 4C2EFE + Shenzhen Comnect Technology Co.,LTD - 3CE9F7 - Intel Corporation + C086B3 + Shenzhen Voxtech Co., Ltd. - F4CE23 - Intel Corporation + 643AEA + Cisco Systems, Inc - 5C843C - Sony Interactive Entertainment Inc. + D01411 + IEEE Registration Authority - E8AEC5 - Arista Networks + E4268B + Huawei Device Co., Ltd. - 4017F6 - TKH Security,S.L.U. + C0E3A0 + Renesas Electronics (Penang) Sdn. Bhd. - 004058 - UKG + 8CE468 + Guangzhou Sageran Technology Co., Ltd. - 2C301A - Technicolor CH USA Inc for Telus + 2848E7 + Huawei Device Co., Ltd. - E8C7CF - Wistron Neweb Corporation + 2CDB07 + Intel Corporate - C049EF - Espressif Inc. + 988D46 + Intel Corporate - ECE7A7 - Intel Corporation + 6888A1 + Universal Electronics, Inc. - E42B79 - Nokia + 0063DE + CLOUDWALK TECHNOLOGY CO.,LTD - C814B4 - Sichuan Tianyi Comheart Telecom Ltd + 60A423 + Silicon Laboratories - 00198E - Demant A/S + E43EC6 + HUAWEI TECHNOLOGIES CO.,LTD - 000B44 - Concord Idea Corp. + 38881E + HUAWEI TECHNOLOGIES CO.,LTD - 60FB00 - Shenzhen Bilian Electronic Ltd + 805FC5 + Apple, Inc. - CC5C61 - Huawei Device Ltd + 3C4DBE + Apple, Inc. - 1CF42B - Huawei Device Ltd + 48262C + Apple, Inc. - 6C51BF - Huawei Device Ltd + 147DDA + Apple, Inc. - D09200 - FiRa Consortium + C4910C + Apple, Inc. - E893F3 - Graphiant Inc + 001693 + PowerLink Technology Inc. - 280244 - Apple + AC1F09 + shenzhen RAKwireless technology Co.,Ltd - E85F02 - Apple + F85128 + SimpliSafe - E0F62D - Juniper Networks + 2400FA + China Mobile (Hangzhou) Information Technology Co., Ltd - BCDF58 - Google Inc. + 50E039 + Zyxel Communications Corporation - 7CC180 - Apple + B85776 + lignex1 - 00D04C - Eseye Design Ltd + AC2334 + Infinix mobility limited - BC606B - Shanghai Baud Data Communication Ltd + E01995 + Nutanix - DCFE23 - Murata Manufacturing Ltd + FCBC0E + Zhejiang Cainiao Supply Chain Management Co., Ltd - 347379 - xFusion Digital Technologies Ltd + 10F920 + Cisco Systems, Inc - 04E69E - Zhongguancun Xinhaizeyou Technology Ltd + 9077EE + Cisco Systems, Inc - 7C8AC0 - EVBox BV + 3C13CC + Cisco Systems, Inc - AC80AE - Fiberhome Telecommunication Technologies Ltd + BC13A8 + Shenzhen YOUHUA Technology Co., Ltd - D83DCC - Shenzhen UDD Technologies Ltd + 206980 + Apple, Inc. - 0417B6 - Smart Innovation LLC + D8DC40 + Apple, Inc. - 00BE43 - Dell Inc. + 94E3EE + zte corporation - B4E265 - Shenzhen SDMC Technology Ltd + B05CDA + HP Inc. - CC60C8 - Microsoft Corporation + B01B7C + Ontrol A.S. - 00EBD8 - Mercusys Technologies Ltd + 001C70 + NOVACOMM LTDA - 6C8D77 - Cisco Systems Inc. + 000FA4 + Sprecher Automation GmbH - 7411B2 - Cisco Systems Inc. + 0024A2 + Hong Kong Middleware Technology Limited - B417A8 - Facebook Technologies LLC + 18DFC1 + Aetheros - EC7C5C - Juniper Networks + 84A3B5 + Propulsion systems - 1054D2 - IEEE Registration Authority + 9CEDFA + EVUlution AG - 001043 - A2 Corporation + EC63ED + Hyundai Autoever Corp. - C4DF39 - Realme Chongqing Mobile Telecommunications Corp Ltd + 1C1338 + Kimball Electronics Group, LLC - 809733 - Shenzhen Elebao Technology Ltd + E44122 + OnePlus Technology (Shenzhen) Co., Ltd - F46D2F - TP-Link Technologies Ltd + 9C19C2 + Dongguan Liesheng Electronic Co., Ltd. - 00A265 - M2Motive Technology Inc. + 74CBF3 + Lava international limited - D8365F - Intelbras + 2CD066 + Xiaomi Communications Co Ltd - 7404F1 - Intel Corporation + 9016BA + HUAWEI TECHNOLOGIES CO.,LTD - 000435 - InfiNet LLC + DCBD7A + Guangzhou Shiyuan Electronic Technology Company Limited - 5478C9 - AMPAK Technology,Inc. + 342EB7 + Intel Corporate - FC101A - Palo Alto Networks + BC26A1 + FACTORY FIVE Corporation - 6CAEE3 - Nokia + 60AAEF + Huawei Device Co., Ltd. - 0CAC8A - Sagemcom Broadband SAS + D0F3F5 + Huawei Device Co., Ltd. - 10634B - Shenzhen Mercury Communication Technologies Ltd + 2479EF + Greenpacket Berhad, Taiwan - E84DEC - Xerox Corporation + D44649 + HUAWEI TECHNOLOGIES CO.,LTD - C8B82F - eero Inc. + 9400B0 + HUAWEI TECHNOLOGIES CO.,LTD - B43AE2 - Huawei Technologies Ltd + 2468B0 + Samsung Electronics Co.,Ltd - F0C8B5 - Huawei Technologies Ltd + 30FCEB + LG Electronics (Mobile Communications) - B85DC3 - Huawei Technologies Ltd + B4EF1C + 360 AI Technology Co.Ltd - B4A7C6 - Servercom (India) Private Limited + B8F009 + Espressif Inc. - D0A46F - China Dragon Technology Limited + E8B470 + IEEE Registration Authority - 1C76F2 - Samsung Electronics Ltd + FC71FA + Trane Technologies - 80C3BA - Sennheiser Consumer Audio GmbH + 0002D8 + BRECIS Communications Corporation - 4035E6 - Samsung Electronics Ltd + B04502 + Huawei Device Co., Ltd. - 2C60CD - NR Electric Ltd + 1C1FF1 + Huawei Device Co., Ltd. - 286B35 - Intel Corporation + 14DE39 + Huawei Device Co., Ltd. - 3043D7 - IEEE Registration Authority + 04F5F4 + Proxim Wireless - A41EE1 - Taicang T&W Electronics + 008016 + WANDEL AND GOLTERMANN - E8FB1C - Azurewave Technologies Inc. + C8BCE5 + Sense Things Japan INC. - C0EE40 - Laird Connectivity + F45420 + TELLESCOM INDUSTRIA E COMERCIO EM TELECOMUNICACAO - A47D9F - Shenzhen iComm Semiconductor Ltd + 0C817D + EEP Elektro-Elektronik Pranjic GmbH - 30045C - Shenzhen SuperElectron Technology Ltd + 64DDE9 + Xiaomi Communications Co Ltd - 3C4645 - Shanghai Infinity Wireless Technologies Ltd + 4C4088 + SANSHIN ELECTRONICS CO.,LTD. - A4F933 - Intel Corporation + 009EEE + Positivo Tecnologia S.A. - 10F60A - Intel Corporation + 00A058 + GLORY, LTD. - 70D823 - Intel Corporation + 1C0219 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 888FA4 - Huawei Device Ltd + 9C611D + Panasonic Corporation of North America - 5068AC - Huawei Device Ltd + F0D5BF + Intel Corporate - 9079CF - ZTE Corporation + DCD2FC + HUAWEI TECHNOLOGIES CO.,LTD - 8C1E80 - Cisco Systems Inc. + 60F262 + Intel Corporate - 50392F - Ingram Micro Services + A4B1C1 + Intel Corporate - FC8417 - Honor Device Ltd + 00092E + B&Tech System Inc. - 2CA79E - Huawei Technologies Ltd + D41AC8 + Nippon Printer Engineering - 0C7FB2 - ARRIS Group Inc. + 5061F6 + Universal Electronics, Inc. - C4DEE2 - Espressif Inc. + F4EB9F + Ellu Company 2019 SL - 68B6B3 - Espressif Inc. + E898C2 + ZETLAB Company - FCA05A - Oray Ltd + A4C54E + Huawei Device Co., Ltd. - 84EA97 - Shenzhen iComm Semiconductor Ltd + D4BBE6 + Huawei Device Co., Ltd. - 14B2E5 - Shenzhen iComm Semiconductor Ltd + 40B6E7 + Huawei Device Co., Ltd. - E0CB56 - Shenzhen iComm Semiconductor Ltd + D0B45D + Huawei Device Co., Ltd. - 90486C - Ring LLC + 8836CF + Huawei Device Co., Ltd. - 3C82C0 - Technicolor CH USA Inc. + 402F86 + LG Innotek - 102407 - Huawei Technologies Ltd + 3C806B + Hunan Voc Acoustics Technology Co., Ltd. - 74D9EB - Petabit Scale Inc. + 60DE35 + GITSN, Inc. - D021AC - Yohana + 28317E + Hongkong Nano IC Technologies Co., Ltd - 7CE152 - THE Goodyear Tire & Rubber Company + 9405BB + IEEE Registration Authority - 28CDC1 - Raspberry Pi Trading Ltd + B802A4 + Aeonsemi, Inc. - 00903F - WorldCast Systems + CCA7C1 + Google, Inc. - ACB566 - Renesas Electronics (Penang) Sdn. Bhd. + 8C5FAD + Fiberhome Telecommunication Technologies Co.,LTD - 381F26 - IEEE Registration Authority + ACC25D + Fiberhome Telecommunication Technologies Co.,LTD - EC2125 - Toshiba Corp. + 8C0C87 + Nokia - 00E5F1 - Buffalo Inc. + E48326 + HUAWEI TECHNOLOGIES CO.,LTD - 34EE2A - ConMet + 447654 + HUAWEI TECHNOLOGIES CO.,LTD - 50E636 - AVM Audiovisuelles Marketing und Computersysteme GmbH + 7CD9A0 + HUAWEI TECHNOLOGIES CO.,LTD - 684E05 - Hunan FN-Link Technology Limited + F033E5 + HUAWEI TECHNOLOGIES CO.,LTD - 7820BD - Polysense (Beijing) Technologies Ltd + 6C6A77 + Intel Corporate - F04DD4 - Sagemcom Broadband SAS + 1869D8 + Tuya Smart Inc. - 0499BB - Apple + C8B29B + Intel Corporate - 5C1BF4 - Apple + CC418E + MSA Innovation - A851AB - Apple + 6849B2 + CARLO GAVAZZI LTD - AC2929 - Infinix mobility limited + 487AFF + ESSYS - 7C8AE1 - Compal Information (Kunshan) Ltd + C095DA + NXP India Private Limited - 54E4A9 - BHR Tech GmbH + B42200 + Brother Industries, LTD. - 208058 - Ciena Corporation + DC9840 + Microsoft Corporation - 684AAE - Huawei Technologies Ltd + B4F18C + Huawei Device Co., Ltd. - 60D755 - Huawei Technologies Ltd + C432D1 + Farlink Technology Limited - A445CD - IoT Diagnostics + 6CDDBC + Samsung Electronics Co.,Ltd - 946269 - ARRIS Group Inc. + F84FAD + Hui Zhou Gaoshengda Technology Co.,LTD - D0DD49 - Juniper Networks + 4C0A3D + ADNACOM INC. - C863FC - ARRIS Group Inc. + CC7F76 + Cisco Systems, Inc - 1CCCD6 - Xiaomi Communications Ltd + A84122 + China Mobile (Hangzhou) Information Technology Co.,Ltd. - A8C252 - Huawei Device Ltd + E8ABFA + Shenzhen Reecam Tech.Ltd. - A04147 - Huawei Device Ltd + B0CCFE + Huawei Device Co., Ltd. - 1CAECB - Huawei Technologies Ltd + 540DF9 + Huawei Device Co., Ltd. - 4CF19E - Groupe Atlantic + 006619 + Huawei Device Co., Ltd. - 2036D7 - Shanghai Reacheng Communication Technology Ltd + 206D31 + FIREWALLA INC - 68070A - TPVision Europe B.V + 14472D + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 4CEBBD - Chongqing Fugui Electronics Ltd + 28401A + C8 MediSensors, Inc. - 7CC926 - Wuhan GreeNet Information Service Ltd + E45E37 + Intel Corporate - 5C75AF - Fitbit Inc. + E490FD + Apple, Inc. - 38BAB0 - Broadcom + 84AB1A + Apple, Inc. - 70879E - Beken Corporation + D06544 + Apple, Inc. - B45062 - EmBestor Technology Inc. + 000E9E + Topfield Co., Ltd - 044A6C - Huawei Technologies Ltd + 90E2FC + IEEE Registration Authority - 38FB14 - Huawei Technologies Ltd + FC3964 + ITEL MOBILE LIMITED - F0E4A2 - Huawei Technologies Ltd + 8C3B32 + Microfan B.V. - 7C5189 - SG Wireless Limited + 3C58C2 + Intel Corporate - 1063C8 - Liteon Technology Corporation + CCF9E4 + Intel Corporate - 582059 - Xiaomi Communications Ltd + 000C1E + Global Cache - 90272B - Algorab S.r.l. + 14AE85 + IEEE Registration Authority - 4CBCB4 - ABB SpA - DIN Rail + 645CF3 + ParanTek Inc. - 94D505 - Fiberhome Telecommunication Technologies Ltd + 90749D + IRay Technology Co., Ltd. - 74E1B6 - Apple + CCD42E + Arcadyan Corporation - 24A52C - Huawei Technologies Ltd + 5894B2 + BrainCo - 482759 - Levven Electronics Ltd + 14169D + Cisco Systems, Inc - AC7713 - Honeywell Safety Products (Shanghai) Ltd + 48A2E6 + Resideo - 08849D - Amazon Technologies Inc. + B4B055 + HUAWEI TECHNOLOGIES CO.,LTD - 90BDE6 - Quectel Wireless Solutions Ltd + 048C16 + HUAWEI TECHNOLOGIES CO.,LTD - 18A4A9 - Vanu Inc. + 98DD5B + TAKUMI JAPAN LTD - 80E82C - Hewlett-Packard Company + E0BB9E + Seiko Epson Corporation - D4ADBD - Cisco Systems Inc. + E4AAEC + Tianjin Hualai Technology Co., Ltd - 2440AE - NIIC Technology Ltd + 94BE46 + Motorola (Wuhan) Mobility Technologies Communication Co., Ltd. - F40E01 - Apple + 58278C + BUFFALO.INC - 1495CE - Apple + 140AC5 + Amazon Technologies Inc. - 50DE06 - Apple + 2CDCD7 + AzureWave Technology Inc. - 5CD135 - Xtreme Power Systems + C8C750 + Motorola Mobility LLC, a Lenovo Company - 7869D4 - Shenyang Vibrotech Instruments Inc. + 6C5D3A + Microsoft Corporation - 082697 - ZyXEL Communications Corp + 8CC681 + Intel Corporate - CCCCCC - Silicon Laboratories + 2083F8 + Advanced Digital Broadcast SA - CC660A - Apple + 9C54DA + SkyBell Technologies Inc. - FC1D43 - Apple + 4C494F + zte corporation - 64CB9F - Tecno Mobile Limited + C4741E + zte corporation - 4CFBFE - Sercomm Japan Corporation + 001D7D + GIGA-BYTE TECHNOLOGY CO.,LTD. - C0CBF1 - Mobiwire Mobiles (NingBo) Ltd + 1C6F65 + GIGA-BYTE TECHNOLOGY CO.,LTD. - FC7D6C - HYESUNG TECHWIN Ltd + 00241D + GIGA-BYTE TECHNOLOGY CO.,LTD. - E47E9A - ZTE Corporation + DC8983 + Samsung Electronics Co.,Ltd - 2C16BD - IEEE Registration Authority + D46075 + Baidu Online Network Technology (Beijing) Co., Ltd - 30A889 - Decimator Design + 78C5F8 + Huawei Device Co., Ltd. - B4A2EB - IEEE Registration Authority + 5C78F8 + Huawei Device Co., Ltd. - 1CD5E2 - Shenzhen YOUHUA Technology Ltd + B827C5 + Huawei Device Co., Ltd. - 0024E9 - Samsung Electronics Ltd + 5CCB99 + Samsung Electronics Co.,Ltd - 683B78 - Cisco Systems Inc. + 90B144 + Samsung Electronics Co.,Ltd - F860F0 - Aruba Networks HP + D45D64 + ASUSTek COMPUTER INC. - 5CA1E0 - EmbedWay Technologies + 38EC0D + Apple, Inc. - 84D412 - Palo Alto Networks + 940C98 + Apple, Inc. - 68AB09 - Nokia + E8FBE9 + Apple, Inc. - F4CE36 - Nordic Semiconductor ASA + 142A14 + ShenZhen Selenview Digital Technology Co.,Ltd - B46077 - Sichuan Changhong Electric Ltd + B86142 + Beijing Tricolor Technology Co., Ltd - 00F620 - Google Inc. + 384B5B + ZTRON TECHNOLOGY LIMITED - F43328 - CIMCON Lighting Inc. + E47C65 + Sunstar Communication Technology Co., Ltd - 7C942A - Huawei Technologies Ltd + 34E3DA + Hoval Aktiengesellschaft - 1CB796 - Huawei Technologies Ltd + D87E76 + ITEL MOBILE LIMITED - 3847BC - Huawei Technologies Ltd + A4307A + Samsung Electronics Co.,Ltd - 549209 - Huawei Technologies Ltd + 00A0B3 + ZYKRONIX - 745909 - Huawei Technologies Ltd + 200A0D + IEEE Registration Authority - 5C5AC7 - Cisco Systems Inc. + 2CE310 + Stratacache - 3CB74B - Technicolor CH USA Inc. + E4F327 + ATOL LLC - 00EDB8 - KYOCERA Corporation + 6819AC + Guangzhou Xianyou Intelligent Technogoly CO., LTD - 9C99CD - Voippartners + E82E0C + NETINT Technologies Inc. - C4C603 - Cisco Systems Inc. + 1892A4 + Ciena Corporation - BCA13A - SES-imagotag + B0735D + Huawei Device Co., Ltd. - 2823F5 - China Mobile (Hangzhou) Information Technology Ltd + F0B4D2 + D-Link International - F010AB - China Mobile (Hangzhou) Information Technology Ltd + 5C3A45 + CHONGQING FUGUI ELECTRONICS CO.,LTD. - B4DC09 - Guangzhou Dawei Communication Ltd + 14115D + Skyworth Digital Technology(Shenzhen) Co.,Ltd - 98865D - Nokia Shanghai Bell Ltd + FC8E5B + China Mobile Iot Limited company - 7CB59B - TP-Link Technologies Ltd + A03C31 + Shenzhen Belon Technology CO.,LTD - 2C4F52 - Cisco Systems Inc. + 10082C + Texas Instruments - 68A03E - Huawei Technologies Ltd + 9013DA + Athom B.V. - B8C385 - Huawei Technologies Ltd + D49E3B + Guangzhou Shiyuan Electronic Technology Company Limited - 4CE9E4 - New H3C Technologies Ltd + DC4BDD + Shenzhen SuperElectron Technology Co.,Ltd. - ACDB48 - ARRIS Group Inc. + C0B5CD + Huawei Device Co., Ltd. - C80D32 - Holoplot GmbH + 4C5077 + Huawei Device Co., Ltd. - D05794 - Sagemcom Broadband SAS + 502DBB + GD Midea Air-Conditioning Equipment Co.,Ltd. - 04D9F5 - ASUSTek Computer Inc. + 7CA1AE + Apple, Inc. - B891C9 - Handreamnet + 58EAFC + ELL-IoT Inc - C8A776 - Huawei Technologies Ltd + 5C3A3D + zte corporation - A400E2 - Huawei Technologies Ltd + 30FD65 + HUAWEI TECHNOLOGIES CO.,LTD - B4C4FC - Xiaomi Communications Ltd + 3C22FB + Apple, Inc. - C8D69D - Arab International Optronics + 80E455 + New H3C Technologies Co., Ltd - 405BD8 - Chongqing Fugui Electronics Ltd + 00909E + Critical IO, LLC - 54EC2F - Ruckus Wireless + 38E8EE + Nanjing Youkuo Electric Technology Co., Ltd - 2899C7 - Lindsay Broadband Inc + 90B8E0 + SHENZHEN YANRAY TECHNOLOGY CO.,LTD - FCBD67 - Arista Networks + 2C4CC6 + Murata Manufacturing Co., Ltd. - 00257E - NEW POS Technology Limited + 6802B8 + Compal Broadband Networks, Inc. - F8AE27 - John Deere Electronic Solutions + 3463D4 + BIONIX SUPPLYCHAIN TECHNOLOGIES SLU - 7445CE - Cresyn + 08F7E9 + HRCP Research and Development Partnership - C4F7D5 - Cisco Systems Inc. + 440377 + IEEE Registration Authority - 1C6499 - Comtrend Corporation + 0812A5 + Amazon Technologies Inc. - 10DC4A - Fiberhome Telecommunication Technologies Ltd + 9CF531 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 88EF16 - ARRIS Group Inc. + C809A8 + Intel Corporate - 8CA96F - D&M Holdings Inc. + 748B34 + Shanghai Smart System Technology Co., Ltd - 7CD661 - Xiaomi Communications Ltd + 4CBC72 + Primex Wireless - B0FD0B - IEEE Registration Authority + DCDCE2 + Samsung Electronics Co.,Ltd - 98B8BA - LG Electronics (Mobile Communications) + A0AC69 + Samsung Electronics Co.,Ltd - 0CE99A - Atls Altec + 1089FB + Samsung Electronics Co.,Ltd - 4C11AE - Espressif Inc. + D4772B + Nanjing Ztlink Network Technology Co.,Ltd - 8C89FA - Zhejiang Hechuan Technology Ltd + 64F9C0 + ANALOG DEVICES - 4CBC48 - Cisco Systems Inc. + F8C4F3 + Shanghai Infinity Wireless Technologies Co.,Ltd. - 80D04A - Technicolor CH USA Inc. + C4E90A + D-Link International - 48D875 - China TransInfo Technology Ltd + 18D0C5 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - D4789B - Cisco Systems Inc. + ACBD70 + Huawei Device Co., Ltd. - 483FE9 - Huawei Technologies Ltd + 30E98E + HUAWEI TECHNOLOGIES CO.,LTD - 143CC3 - Huawei Technologies Ltd + C4447D + HUAWEI TECHNOLOGIES CO.,LTD - A8E544 - Huawei Technologies Ltd + 70F82B + DWnet Technologies(Suzhou) Corporation - 1820D5 - ARRIS Group Inc. + 44CB8B + LG Innotek - 3050FD - Skyworth Digital Technology(Shenzhen) Ltd + EC1BBD + Silicon Laboratories - 0040BC - Algorithmics Ltd + 10DCB6 + IEEE Registration Authority - 004065 - GTE Spacenet + D8A315 + vivo Mobile Communication Co., Ltd. - 88E64B - Juniper Networks + 14A1BF + ASSA ABLOY Korea Co., Ltd Unilock - D8D090 - Dell Inc. + 9483C4 + GL Technologies (Hong Kong) Limited - 50C4DD - Buffalo Inc. + 9C93B0 + Megatronix (Beijing) Technology Co., Ltd. - 0084ED - Private + 64AEF1 + Qingdao Hisense Electronics Co.,Ltd. - E002A5 - ABB Robotics + 048C9A + Huawei Device Co., Ltd. - F42E7F - Aruba Networks HP + EC3CBB + Huawei Device Co., Ltd. - B4CC04 - Piranti + 28BD89 + Google, Inc. - B8D526 - ZyXEL Communications Corp + 984827 + TP-LINK TECHNOLOGIES CO.,LTD. - F0B968 - Itel Mobile Limited + 34ED1B + Cisco Systems, Inc - 04E56E - THUB Ltd + 142475 + 4DReplay, Inc - 1C7F2C - Huawei Technologies Ltd + 80647A + Ola Sense Inc - 88BCC1 - Huawei Technologies Ltd + C0B883 + Intel Corporate - 1CBFCE - Shenzhen Century Xinyang Technology Ltd + 70441C + SHENZHEN KAIFA TECHNOLOGY CO.,LTD. - F83002 - Texas Instruments + 1CEA0B + Edgecore Networks Corporation - A8A159 - ASRock Incorporation + 24418C + Intel Corporate - 78DA07 - Zhejiang Tmall Technology Ltd + 44EFBF + China Dragon Technology Limited - 44A61E - Ingram Micro Services + 4CB44A + NANOWAVE Technologies Inc. - 38D2CA - Zhejiang Tmall Technology Ltd + F8D027 + Seiko Epson Corporation - 109E3A - Zhejiang Tmall Technology Ltd + 5C666C + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 904DC3 - Flonidan A/S + 4C4BF9 + IEEE Registration Authority - 000DF1 - Ionix Inc. + 88D5A8 + ITEL MOBILE LIMITED - 00077C - Westermo Network Technologies AB + B81F5E + Apption Labs Limited - 8C426D - Huawei Technologies Ltd + D81265 + CHONGQING FUGUI ELECTRONICS CO.,LTD. - 90F891 - Kaonmedia Ltd + 8C3A7E + Universal Electronics, Inc. - 445D5E - Shenzhen Coolkit Technology Ltd + 208593 + IEEE Registration Authority - 50AD71 - Tessolve Semiconductor Private Limited + B47C59 + Jiangsu Hengxin Technology Co.,Ltd. - 202AC5 - Petite-En + 300D9E + Ruijie Networks Co.,LTD - A8BF3C - HDV Phoelectron Technology Limited + BCB0E7 + HUAWEI TECHNOLOGIES CO.,LTD - D4F527 - Siemens AG + 5434EF + HUAWEI TECHNOLOGIES CO.,LTD - B8B2F8 - Apple + ECFA5C + Beijing Xiaomi Electronics Co., Ltd. - 98460A - Apple + F8B46A + Hewlett Packard - B85D0A - Apple + ACE342 + HUAWEI TECHNOLOGIES CO.,LTD - 7C9A1D - Apple + 9017C8 + HUAWEI TECHNOLOGIES CO.,LTD - 103025 - Apple + E4922A + DBG HOLDINGS LIMITED - 70ACD7 - Shenzhen YOUHUA Technology Ltd + 4801C5 + OnePlus Technology (Shenzhen) Co., Ltd - 5462E2 - Apple + 18BF1C + Jiangsu Huitong Group Co.,Ltd. - 149D99 - Apple + 207759 + OPTICAL NETWORK VIDEO TECHNOLOGIES (SHENZHEN) CO., LTD. - 147BAC - Nokia + 889D98 + Allied-telesisK.K. - 906D05 - BXB Electronics Ltd + 4C56DF + Targus US LLC - D4BBC8 - Vivo Mobile Communication Ltd + B4EE25 + Shenzhen Belon Technology CO.,LTD - 489507 - Guangdong Oppo Mobile Telecommunications Corp Ltd + C82B96 + Espressif Inc. - 24BF74 - Private + 98523D + Sunitec Enterprise Co.,Ltd - CCDC55 - Dragonchip Limited + DCF8B9 + zte corporation - 28FFB2 - Toshiba Corp. + 2C641F + Vizio, Inc - 1C60D2 - Fiberhome Telecommunication Technologies Ltd + 54E7D5 + Sun Cupid Technology (HK) LTD - F4B5AA - ZTE Corporation + 241510 + IEEE Registration Authority - E8ACAD - ZTE Corporation + 6C4D51 + Shenzhen Ceres Technology Co., Ltd. - 0836C9 - Netgear + 04819B + SKY UK LIMITED - 745BC5 - IEEE Registration Authority + 2CA89C + Creatz inc. - 9440C9 - Hewlett Packard Enterprise + 4CDC0D + Coral Telecom Limited - A041A7 - NL Ministry Of Defense + 000163 + Cisco Systems, Inc - E446DA - Xiaomi Communications Ltd + 6070C0 + Apple, Inc. - 1C12B0 - Amazon Technologies Inc. + F0C371 + Apple, Inc. - 4CBC98 - IEEE Registration Authority + 1855E3 + Apple, Inc. - 2CF432 - Espressif Inc. + 60634C + D-Link International - 647366 - Shenzhen Siera Technology Ltd + E00084 + HUAWEI TECHNOLOGIES CO.,LTD - 041EFA - BISSELL Homecare Inc. + 0000DE + CETIA - D85575 - Samsung Electronics Ltd + F43E66 + Bee Computing (HK) Limited - D411A3 - Samsung Electronics Ltd + B4C476 + Wuhan Maritime Communication Research Institute - 04BA8D - Samsung Electronics Ltd + 683489 + LEA Professional - 744D28 - Routerboard.com + B46C47 + Panasonic Appliances Company - 00A085 - Private + 94BF80 + zte corporation - E05A9F - IEEE Registration Authority + 44422F + TESTOP CO.,LTD. - 8C5AF8 - Beijing Xiaomi Electronics Ltd + 549C27 + Plasma Cloud Limited - D45800 - Fiberhome Telecommunication Technologies Ltd + 541589 + MCS Logic Inc. - 90842B - LEGO System A/S + 845733 + Microsoft Corporation - 00267E - Parrot SA + 3CECEF + Super Micro Computer, Inc. - 2C557C - Shenzhen YOUHUA Technology Ltd + E450EB + Apple, Inc. - F4BCDA - Shenzhen Jingxun Software Telecommunication Technology Ltd + 886440 + Apple, Inc. - 000915 - CAS Corp. + C4E1A1 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 58D9C3 - Motorola Mobility LLC, a Lenovo Company + F09919 + Garmin International - 2C73A0 - Cisco Systems Inc. + 58F39C + Cisco Systems, Inc - 443E07 - Electrolux + 002423 + AzureWave Technologies (Shanghai) Inc. - 8485E6 - Guangdong Asano Technology Ltd + 8C593C + IEEE Registration Authority - 3C8375 - Microsoft Corporation + 00AD63 + Dedicated Micros Malta LTD - 000AA8 - ePipe Pty Ltd + 6029D5 + DAVOLINK Inc. - 0029C2 - Cisco Systems Inc. + 509744 + Integrated Device Technology (Malaysia) Sdn. Bhd. - 187C0B - Ruckus Wireless + 987A14 + Microsoft Corporation - D47B35 - NEO Monitors AS + C83DDC + Xiaomi Communications Co Ltd - 000878 - Benchmark Storage Innovations + B0B5E8 + Ruroc LTD - 6CF37F - Aruba Networks HP + E415F6 + Texas Instruments - 140708 - Private + 809133 + AzureWave Technology Inc. - 78A7EB - 1MORE + 1819D6 + Samsung Electronics Co.,Ltd - 485D36 - Verizon + 70FC8F + FREEBOX SAS - 20C047 - Verizon + 501B32 + Taicang T&W Electronics - 346B46 - Sagemcom Broadband SAS + 14ADCA + China Mobile Iot Limited company - 7C604A - Avelon + CC9070 + Cisco Systems, Inc - 186472 - Aruba Networks HP + 2841C6 + HUAWEI TECHNOLOGIES CO.,LTD - 84D47E - Aruba Networks HP + 0077E4 + Nokia Solutions and Networks GmbH & Co. KG - 24DEC6 - Aruba Networks HP + 380118 + ULVAC,Inc. - 0017A0 - RoboTech srl + F41D6B + HUAWEI TECHNOLOGIES CO.,LTD - 103D0A - Hui Zhou Gaoshengda Technology Ltd + 7CEC9B + Fuzhou Teraway Information Technology Co.,Ltd - 942790 - TCT mobile Ltd + C48FC1 + DEEPTRACK S.L.U. - A41791 - Shenzhen Decnta Technology Ltd + B4F58E + HUAWEI TECHNOLOGIES CO.,LTD - 34DAB7 - ZTE Corporation + AC4228 + Parta Networks - 109C70 - Prusa Research s.r.o. + B0A6F5 + Xaptum, Inc. - E84C56 - Intercept Services Limited + ACF5E6 + Cisco Systems, Inc - A41908 - Fiberhome Telecommunication Technologies Ltd + E828C1 + Eltex Enterprise Ltd. - 80D336 - Cern + 78D347 + Ericsson AB - 64255E - Observint Technologies Inc. + F82387 + Shenzhen Horn Audio Co.,Ltd. - 90940A - Analog Devices Inc. + BC98DF + Motorola Mobility LLC, a Lenovo Company - 40B076 - ASUSTek Computer Inc. + A4A179 + Nanjing dianyan electric power automation co. LTD - D43D39 - Dialog Semiconductor + 68DB67 + Nantong Coship Electronics Co., Ltd. - 0014A5 - Gemtek Technology Ltd + 980D67 + Zyxel Communications Corporation - C0B5D7 - Chongqing Fugui Electronics Ltd + 702E80 + DIEHL Connectivity Solutions - D4AD71 - Cisco Systems Inc. + F8C397 + NZXT Corp. Ltd. - 702B1D - E-Domus International Limited + 70DDA8 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - F085C1 - Shenzhen RF-Link Technology Ltd + 4C6F9C + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 4CDD7D - LHP Telematics LLC + 782C29 + New H3C Technologies Co., Ltd - B8BC5B - Samsung Electronics Ltd + ACA46E + SHENZHEN GONGJIN ELECTRONICS CO.,LT - 108EBA - Molekule + C8B422 + ASKEY COMPUTER CORP - 4C218C - Panasonic India Private limited + 94EE9F + HMD Global Oy - 2C4E7D - Chunghua Intelligent Network Equipment Inc. + D4D252 + Intel Corporate - A4F465 - Itel Mobile Limited + 58A023 + Intel Corporate - 4C917A - IEEE Registration Authority + DCB082 + Nokia - 743A65 - NEC Corporation + F4323D + Sichuan tianyi kanghe communications co., LTD - 00255C - NEC Corporation + E8C417 + Fiberhome Telecommunication Technologies Co.,LTD - 684F64 - Dell Inc. + F8B797 + NEC Platforms, Ltd. - CC70ED - Cisco Systems Inc. + B0AAD2 + Sichuan tianyi kanghe communications co., LTD - 907E30 - Lars + 001EA3 + Nokia Danmark A/S - 84EB3E - Vivint Smart Home + 38F32E + Skullcandy - 00A0D5 - Sierra Wireless + DC2AA1 + MedHab LLC - 18BB26 - FN-Link Technology Limited + E4F3E8 + Shenzhen SuperElectron Technology Co.,Ltd. - 18B905 - Hong Kong Bouffalo Lab Limited + CCA12B + TCL King Electrical Appliances (Huizhou) Co., Ltd - ECF0FE - ZTE Corporation + AC00D0 + zte corporation - 94A40C - Diehl Metering GmbH + 84B866 + Beijing XiaoLu technology co. LTD - 70B317 - Cisco Systems Inc. + 18BC5A + Zhejiang Tmall Technology Co., Ltd. - B00247 - AMPAK Technology Inc. + C4C138 + OWLink Technology Inc - BCE796 - Wireless CCTV Ltd + C46516 + Hewlett Packard - 948FCF - ARRIS Group Inc. + E41E0A + IEEE Registration Authority - A8F5DD - ARRIS Group Inc. + AC37C9 + RAID Incorporated - 44D3AD - Shenzhen TINNO Mobile Technology Corp. + 205869 + Ruckus Wireless - 9C8275 - Yichip Microelectronics (Hangzhou) Ltd + CC37AB + Edgecore Networks Corporation - 5CCBCA - Fujian Star-NET Communication Ltd + 907841 + Intel Corporate - 28E98E - Mitsubishi Electric Corporation + C86314 + IEEE Registration Authority - 34F8E7 - Cisco Systems Inc. + 243154 + HUAWEI TECHNOLOGIES CO.,LTD - B0907E - Cisco Systems Inc. + 84B8B8 + Motorola (Wuhan) Mobility Technologies Communication Co., Ltd. - 2C7360 - Earda Technologies Ltd + D041C9 + Fiberhome Telecommunication Technologies Co.,LTD - 508CF5 - China Mobile Group Device Ltd + E8018D + Fiberhome Telecommunication Technologies Co.,LTD - 1C549E - Universal Electronics Inc. + 18399C + Skorpios Technologies - E4CA12 - ZTE Corporation + 94C2BD + TECNOBIT - D49E05 - ZTE Corporation + 4883B4 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 585FF6 - ZTE Corporation + 701E68 + Hanna Instruments, Inc. - 40B30E - Integrated Device Technology (Malaysia) Sdn. Bhd. + 941625 + Apple, Inc. - 04CE7E - NXP France Semiconductors France + 543B30 + duagon AG - C09AD0 - Apple + 8C965F + Shandong Zhongan Technology Co., Ltd. - 94B01F - Apple + 10A3B8 + Iskratel d.o.o. - 98CC4D - Shenzhen mantunsci Ltd + 70CD91 + TERACOM TELEMATICA S.A - B8C74A - Guangdong Oppo Mobile Telecommunications Corp Ltd + E8ECA3 + Dongguan Liesheng Electronic Co.Ltd - D8CE3A - Xiaomi Communications Ltd + 08A6BC + Amazon Technologies Inc. - 102C6B - AMPAK Technology Inc. + 2C58E8 + HUAWEI TECHNOLOGIES CO.,LTD - 7485C4 - New H3C Technologies Ltd + B0BB8B + WAVETEL TECHNOLOGY LIMITED - 94F6D6 - Apple + 34A8EB + Apple, Inc. - F82D7C - Apple + 1CB3E9 + Shenzhen Zhongke United Communication Technology - D0BAE4 - Shanghai MXCHIP Information Technology Ltd + A483E7 + Apple, Inc. - 48D35D - Private + F4AFE7 + Apple, Inc. - 80FBF0 - Quectel Wireless Solutions Ltd + AC88FD + Apple, Inc. - C0132B - Sichuan Changhong Electric Ltd + 6489F1 + Samsung Electronics Co.,Ltd - 0CB4A4 - Xintai Automobile Intelligent Network Technology + 503E7C + LeiShen Intelligent System Co.Ltd - 90633B - Samsung Electronics Ltd + 243F30 + Oxygen Broadband s.a. - FCAAB6 - Samsung Electronics Ltd + 3C9180 + Liteon Technology Corporation - C82E47 - Suzhou SmartChip Semiconductor Ltd + 20326C + Samsung Electronics Co.,Ltd - C02250 - Koss Corporation + B4A305 + XIAMEN YAXON NETWORK CO., LTD. - A0B549 - Arcadyan Corporation + 803E48 + SHENZHEN GONGJIN ELECTRONICS CO.,LT - 001F5A - Beckwith Electric Co. + 24586E + zte corporation - 985D82 - Arista Networks + C0074A + Brita GmbH - 2453BF - Enernet + E8B2FE + HUMAX Co., Ltd. - 043385 - Nanchang BlackShark Ltd + 0017FA + Microsoft Corporation - 84E5D8 - Guangdong UNIPOE IoT Technology Ltd + 94BFC4 + Ruckus Wireless - A8BC9C - Cloud Light Technology Limited + 2034FB + Xiaomi Communications Co Ltd - A89042 - Beijing Wanwei Intelligent Technology Ltd + A89CED + Xiaomi Communications Co Ltd - 18BE92 - Delta Networks Inc. + 00124E + XAC AUTOMATION CORP. - 90C54A - Vivo Mobile Communication Ltd + 88E034 + Shinwa industries(China) ltd. - BC7596 - Beijing Broadwit Technology Ltd + BCCF4F + Zyxel Communications Corporation - 1C34DA - Mellanox Technologies Inc. + 0CE041 + iDruide - 2CA02F - Veroguard Systems Pty Ltd + B88FB4 + JABIL CIRCUIT ITALIA S.R.L - 6C5C3D - IEEE Registration Authority + C010B1 + HMD Global Oy - 782327 - Samsung Electronics Ltd + 0052C2 + peiker acustic GmbH - DCF756 - Samsung Electronics Ltd + 90895F + WEIFANG GOERTEK ELECTRONICS CO.,LTD - 68A47D - Sun Cupid Technology (HK) Ltd + 48D845 + Shenzhen Mainuoke Electronics Co., Ltd - 184B0D - Ruckus Wireless + D0EC35 + Cisco Systems, Inc - D41243 - AMPAK Technology Inc. + 380025 + Intel Corporate - 48A6B8 - Sonos Inc. + 0CF475 + Zliide Technologies ApS - B87826 - Nintendo Ltd + 68FF7B + TP-LINK TECHNOLOGIES CO.,LTD. - DCCBA8 - Explora Technologies Inc + 808F1D + TP-LINK TECHNOLOGIES CO.,LTD. - C07878 - Flextronics Manufacturing(Zhuhai) Ltd + 000F69 + SEW Eurodrive GmbH & Co. KG - E4B97A - Dell Inc. + D058C0 + Qingdao Haier Multimedia Limited. - 34DAC1 - SAE Technologies Development(Dongguan) Ltd + F8D478 + Flextronics Tech.(Ind) Pvt Ltd - 705DCC - EFM Networks + 48BD0E + Quanta Storage Inc. - D092FA - Fiberhome Telecommunication Technologies Ltd + D45383 + Murata Manufacturing Co., Ltd. - E85AD1 - Fiberhome Telecommunication Technologies Ltd + A04246 + IT Telecom Co., Ltd. - A823FE - LG Electronics + A45F9B + Nexell - E05D5C - Oy Everon Ab + E458E7 + Samsung Electronics Co.,Ltd - 688F2E - Hitron Technologies Inc. + 00104A + The Parvus Corporation - E046E5 - Gosuncn Technology Group Ltd + 48C3B0 + Pharos Co.Ltd - 1C599B - Huawei Technologies Ltd + DC58BC + Thomas-Krenn.AG - D4BD1E - 5VT Technologies,Taiwan Ltd + 001025 + Grayhill, Inc - BC9B68 - Technicolor CH USA Inc. + 70EA1A + Cisco Systems, Inc - CCD4A1 - MitraStar Technology Corp. + 808A8B + vivo Mobile Communication Co., Ltd. - 08BA5F - Qingdao Hisense Electronics Ltd + 1C3B8F + Selve GmbH & Co. KG - 10DFFC - Siemens AG + E4E749 + Hewlett Packard - 847F3D - Integrated Device Technology (Malaysia) Sdn. Bhd. + 9844B6 + INFRANOR SAS - C4FDE6 - Drtech + 38839A + SHENZHEN RF-LINK TECHNOLOGY CO.,LTD. - CC988B - SONY Visual Products Inc. + C8F6C8 + Fiberhome Telecommunication Technologies Co.,LTD - 30E3D6 - Spotify USA Inc. + A86DAA + Intel Corporate - 9CA525 - Shandong USR IOT Technology Limited + 38C2BA + CCTV NEOTECH - E0456D - China Mobile Group Device Ltd + A0F9B7 + Ademco Smart Homes Technology(Tianjin)Co.,Ltd. - 283926 - CyberTAN Technology Inc. + A83CCB + ROSSMA - 8CFCA0 - Shenzhen Smart Device Technology Ltd + DC6723 + barox Kommunikation GmbH - 1C427D - Guangdong Oppo Mobile Telecommunications Corp Ltd + 44B462 + Flextronics Tech.(Ind) Pvt Ltd - 806933 - Huawei Technologies Ltd + CC3FEA + BAE Systems, Inc - BC26C7 - Cisco Systems Inc. + 94677E + Belden India Private Limited - BC5EA1 - PsiKick Inc. + AC5775 + HMD Global Oy - 944F4C - Sound United LLC + E85BB7 + Ample Systems Inc. - 18810E - Apple + AC4330 + Versa Networks - 608C4A - Apple + D43A2E + SHENZHEN MTC CO LTD - 74B587 - Apple + ECC57F + Suzhou Pairlink Network Technology - FCB6D8 - Apple + 30C3D9 + ALPSALPINE CO,.LTD - 3C6A2C - IEEE Registration Authority + 50AD92 + NX Technologies - 241B7A - Apple + 4CF2BF + Cambridge Industries(Group) Co.,Ltd. - 8CFE57 - Apple + CC9EA2 + Amazon Technologies Inc. - C0A600 - Apple + 001BFB + ALPSALPINE CO,.LTD - 18E829 - Ubiquiti Networks Inc. + 8CAEDB + NAGTECH LLC - E0C286 - Aisai Communication Technology Ltd + 78B213 + DWnet Technologies(Suzhou) Corporation - 7405A5 - TP-Link Technologies Ltd + 7CDB98 + ASKEY COMPUTER CORP - 286DCD - Beijing Winner Microelectronics Ltd + 380B3C + Texas Instruments - 541031 - Smarto + 6845F1 + TOSHIBA CLIENT SOLUTIONS CO., LTD. - 44A466 - Groupe Ldlc + 6CA936 + DisplayLink (UK) Ltd - D80D17 - TP-Link Technologies Ltd + 708540 + Skyworth Digital Technology(Shenzhen) Co.,Ltd - 18C2BF - Buffalo Inc. + F00DF5 + ACOMA Medical Industry Co,. Ltd. - E81CBA - Fortinet Inc. + 58C232 + NEC Corporation - F0B014 - AVM Audiovisuelles Marketing und Computersysteme GmbH + 94E0D6 + China Dragon Technology Limited - 1889A0 - Wuhan Funshion Online Technologies Ltd + B4A9FC + Quanta Computer Inc. - 0C2A86 - Fiberhome Telecommunication Technologies Ltd + 003217 + Cisco Systems, Inc - FC61E9 - Fiberhome Telecommunication Technologies Ltd + 381D14 + Skydio Inc. - 405662 - GuoTengShengHua Electronics Ltd + 3C286D + Google, Inc. - E4DB6D - Beijing Xiaomi Electronics Ltd + 00093A + Molex CMS - 00A0D1 - Inventec Corporation + 74F737 + KCE - 0018CC - Axiohm SAS + 48A493 + TAIYO YUDEN CO.,LTD - 001827 - NEC Unified Solutions Nederland B.V. + 88D211 + Eko Devices, Inc. - 009004 - 3Com Europe Ltd + B8C227 + PSTec - 00068C - 3Com Corporation + A48CC0 + JLG Industries, Inc. - 02608C - 3Com Corporation + 48E695 + Insigma Inc - 00D0D8 - 3Com Corporation + B479C8 + Ruckus Wireless - 18937F - AMPAK Technology Inc. + E82C6D + SmartRG, Inc. - A43523 - Guangdong Donyan Network Technologies Ltd + 04F9D9 + Speaker Electronic(Jiashan) Co.,Ltd - B4A94F - Mercury Corporation + DC080F + Apple, Inc. - 803AF4 - Fiberhome Telecommunication Technologies Ltd + F8E94E + Apple, Inc. - 48A0F8 - Fiberhome Telecommunication Technologies Ltd + EC2CE2 + Apple, Inc. - F85E3C - Shenzhen Zhibotong Electronics Ltd + 40BC60 + Apple, Inc. - 283E76 - Common Networks + E83617 + Apple, Inc. - DC3979 - Cisco Systems Inc. + 9C648B + Apple, Inc. - 0C5331 - ETH Zurich + 344262 + Apple, Inc. - DC9088 - Huawei Technologies Ltd + 2CAA8E + Wyze Labs Inc - 54812D - PAX Computer Technology(Shenzhen) Ltd + 703A51 + Xiaomi Communications Co Ltd - 0C9A42 - FN-Link Technology Limited + 14D00D + Apple, Inc. - 000809 - Systemonic AG + C03DD9 + MitraStar Technology Corp. - 8C41F4 - IPmotion GmbH + 0C9541 + CHIPSEA TECHNOLOGIES (SHENZHEN) CORP. - 704F08 - Shenzhen Huisheng Information Technology Ltd + B40B78 + Brusa Elektronik AG - 8835C1 - OI Electric Ltd + 181E95 + AuVerte - 3042A1 - ilumisys Inc. DBA Toggled + 9C6937 + Qorvo International Pte. Ltd. - 0026B7 - Kingston Technology Company Inc. + 207918 + Intel Corporate - 28D0CB - Cambridge Communication Systems Ltd + 48352E + Shenzhen Wolck Network Product Co.,LTD - 4062EA - China Mobile Group Device Ltd + 04E598 + Xiaomi Communications Co Ltd - 4C0FC7 - Earda Technologies Ltd + 001060 + BILLIONTON SYSTEMS, INC. - 80A796 - Neurotek LLC + C4D489 + JiangSu Joyque Information Industry Co.,Ltd - CC2119 - Samsung Electronics Ltd + B82CA0 + Resideo - 302303 - Belkin International Inc. + DC48B2 + Baraja Pty. Ltd. - 9CF6DD - IEEE Registration Authority + ACAE19 + Roku, Inc - 001E80 - Icotera A/S + C0BDC8 + Samsung Electronics Co.,Ltd - 48881E - EthoSwitch LLC + B4F949 + optilink networks pvt ltd - 3C71BF - Espressif Inc. + A4A1E4 + Innotube, Inc. - 000393 - Apple + 98D3E7 + Netafim L - 0000C3 - Harris Corporation + 647BCE + Samsung Electronics Co.,Ltd - 304B07 - Motorola Mobility LLC, a Lenovo Company + A887B3 + Samsung Electronics Co.,Ltd - 345ABA - tcloud Intelligence + 6C006B + Samsung Electronics Co.,Ltd - 502FA8 - Cisco Systems Inc. + 6CC7EC + SAMSUNG ELECTRO-MECHANICS(THAILAND) - 902BD2 - Huawei Technologies Ltd + D89685 + GoPro - 08D59D - Sagemcom Broadband SAS + A0A4C5 + Intel Corporate - C08359 - IEEE Registration Authority + F4D108 + Intel Corporate - EC83D5 - GIRD Systems Inc + 60CE92 + The Refined Industry Company Limited - 14942F - Usys Ltd + 94EAEA + TELLESCOM INDUSTRIA E COMERCIO EM TELECOMUNICACAO - FCB10D - Shenzhen Tian Kun Technology Ltd + 301389 + Siemens AG, Automations & Drives, - 20F77C - Vivo Mobile Communication Ltd + 1CFD08 + IEEE Registration Authority - 001EEC - Compal Information (Kunshan) Ltd + B8599F + Mellanox Technologies, Inc. - F0761C - Compal Information (Kunshan) Ltd + 3C01EF + Sony Corporation - 0004AE - Sullair Corporation + 706D15 + Cisco Systems, Inc - 00451D - Cisco Systems Inc. + 105BAD + Mega Well Limited - A0D635 - WBS Technology + F063F9 + HUAWEI TECHNOLOGIES CO.,LTD - 34800D - Cavium Inc + 7CC385 + HUAWEI TECHNOLOGIES CO.,LTD - B44BD6 - IEEE Registration Authority + 900EB3 + Shenzhen Amediatech Technology Co., Ltd. - D8912A - ZyXEL Communications Corp + F05494 + Honeywell Connected Building - 3C427E - IEEE Registration Authority + 48872D + SHEN ZHEN DA XIA LONG QUE TECHNOLOGY CO.,LTD - 000BA3 - Siemens AG + E81A58 + TECHNOLOGIC SYSTEMS - 000C8A - Bose Corporation + 00AD24 + D-Link International - 243A82 - Irts + 54068B + Ningbo Deli Kebei Technology Co.LTD - 880907 - MKT Systemtechnik GmbH & Co. KG + 549FAE + iBASE Gaming Inc - 58A48E - PixArt Imaging Inc. + 00EABD + Cisco Systems, Inc - 30D659 - Merging Technologies SA + 74BFC0 + CANON INC. - 702AD5 - Samsung Electronics Ltd + 181DEA + Intel Corporate - 889765 - exands + 185680 + Intel Corporate - 386E88 - ZTE Corporation + C8D9D2 + Hewlett Packard - B88584 - Dell Inc. + 24FCE5 + Samsung Electronics Co.,Ltd - 40EEDD - Huawei Technologies Ltd + 809621 + Lenovo - B01886 - SmarDTV + 142233 + Fiberhome Telecommunication Technologies Co.,LTD - AC751D - Huawei Technologies Ltd + 78055F + Shenzhen WYC Technology Co., Ltd. - 289E97 - Huawei Technologies Ltd + 0060EB + FOURTHTRACK SYSTEMS - 001525 - Chamberlain Access Solutions + EC79F2 + Startel - 001EB0 - ImesD Electronica S.L. + 04BC87 + Shenzhen JustLink Technology Co., LTD - 641C67 - Digibras Industria DO Brasils/A + 54C33E + Ciena Corporation - 60058A - Hitachi Metals Ltd + 1862E4 + Texas Instruments - BC22FB - RF Industries + 5CC999 + New H3C Technologies Co., Ltd - 0080B6 - Mercury Systems - Trusted Mission Solutions Inc. + B02A43 + Google, Inc. - 08512E - Orion Diagnostica Oy + C474F8 + Hot Pepper, Inc. - 98A404 - Ericsson AB + BCB22B + EM-Tech - 00CC3F - Universal Electronics Inc. + B08BCF + Cisco Systems, Inc - 74B91E - Nanjing Bestway Automation System Ltd + C4985C + Hui Zhou Gaoshengda Technology Co.,LTD - A019B2 - IEEE Registration Authority + 30A1FA + HUAWEI TECHNOLOGIES CO.,LTD - 8C15C7 - Huawei Technologies Ltd + 64628A + evon GmbH - 60FA9D - Huawei Technologies Ltd + 0415D9 + Viwone - DC9914 - Huawei Technologies Ltd + DC3757 + Integrated Device Technology (Malaysia) Sdn. Bhd. - 4C3FD3 - Texas Instruments + 005099 + 3COM EUROPE LTD - B05365 - China Mobile IOT Company Limited + ECB313 + SHENZHEN GONGJIN ELECTRONICS CO.,LT - 308841 - Sichuan AI-Link Technology Ltd + 242E90 + PALIT MICROSYSTEMS, LTD - 44EFCF - UGENE SOLUTION Inc. + 743400 + MTG Co., Ltd. - 304596 - Huawei Technologies Ltd + 6035C0 + SFR - C0F4E6 - Huawei Technologies Ltd + 001AC5 + Keysight Technologies, Inc. - 74EB80 - Samsung Electronics Ltd + 00201E + NETQUEST CORPORATION - 0CE0DC - Samsung Electronics Ltd + 00608C + 3COM - D868C3 - Samsung Electronics Ltd + 00A024 + 3COM - C493D9 - Samsung Electronics Ltd + 0020AF + 3COM - A82BB9 - Samsung Electronics Ltd + 00104B + 3COM - ACFD93 - Weifang Goertek Electronics Ltd + A85AF3 + Shanghai Siflower Communication Technology Co., Ltd - 00B8C2 - Heights Telecom T Ltd + 70FD46 + Samsung Electronics Co.,Ltd - F4BF80 - Huawei Technologies Ltd + 8C83E1 + Samsung Electronics Co.,Ltd - 000E8F - Sercomm Corporation. + 645D86 + Intel Corporate - A0E617 - Matis + 9CAA1B + Microsoft Corporation - 7001B5 - Cisco Systems Inc. + E00EE1 + We Corporation Inc. - 001F49 - Manhattan TV Ltd + 8C9246 + Oerlikon Textile Gmbh&Co.KG - 88D652 - AMERGINT Technologies + 000E94 + Maas International BV - FC90FA - Independent Technologies + 4898CA + Sichuan AI-Link Technology Co., Ltd. - D0B214 - PoeWit Inc + 247E51 + zte corporation - C42456 - Palo Alto Networks + E8B541 + zte corporation - B4B686 - Hewlett-Packard Company + 0C9D92 + ASUSTek COMPUTER INC. - 4CEDFB - ASUSTek Computer Inc. + 0CCB85 + Motorola Mobility LLC, a Lenovo Company - 7C2EBD - Google Inc. + 889F6F + Samsung Electronics Co.,Ltd - 6CAF15 - Webasto SE + 5C63C9 + Intellithings Ltd. - E4E130 - TCT mobile Ltd + 0C96E6 + Cloud Network Technology (Samoa) Limited - 0C2138 - Hengstler GmbH + 3C8994 + SKY UK LIMITED - E46059 - Pingtek Ltd + 582D34 + Qingping Electronics (Suzhou) Co., Ltd - E0191D - Huawei Technologies Ltd + 20DE88 + IC Realtime LLC - 68D1BA - Shenzhen YOUHUA Technology Ltd + 482CA0 + Xiaomi Communications Co Ltd - 1C1AC0 - Apple + A4E615 + SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD - 3078C2 - Innowireless / QUCELL Networks + 001A31 + SCAN COIN AB - 4050B5 - Shenzhen New Species Technology Ltd + 001B84 + Scan Engineering Telecom - 3C15FB - Huawei Technologies Ltd + F4068D + devolo AG - CC934A - Sierra Wireless + 988ED4 + ITEL MOBILE LIMITED - 00CFC0 - China Mobile Group Device Ltd + E8A788 + XIAMEN LEELEN TECHNOLOGY CO., LTD - DC330D - Qing DAO Haier Telecom Ltd + 3412F9 + HUAWEI TECHNOLOGIES CO.,LTD - 688975 - nuoxc + BCE265 + HUAWEI TECHNOLOGIES CO.,LTD - 40F04E - Integrated Device Technology (Malaysia) Sdn. Bhd. + 4CD1A1 + HUAWEI TECHNOLOGIES CO.,LTD - 0021F2 - EASY3CALL Technology Limited + 88BFE4 + HUAWEI TECHNOLOGIES CO.,LTD - 0015C4 - Flovel Ltd + 4017E2 + INTAI TECHNOLOGY CORP. - 0011E6 - Scientific Atlanta + 741F79 + YOUNGKOOK ELECTRONICS CO.,LTD - 24F128 - Telstra + E0735F + NUCOM - E0383F - ZTE Corporation + 0051ED + LG Innotek - D47226 - ZTE Corporation + 40DC9D + HAJEN - 40831D - Apple + F0BCC9 + PFU LIMITED - DCD3A2 - Apple + B4CEFE + James Czekaj - 5C1DD9 - Apple + 88AE1D + COMPAL INFORMATION (KUNSHAN) CO., LTD. - 800588 - Ruijie Networks Ltd + C4518D + Shenzhen YOUHUA Technology Co., Ltd - F00E1D - Megafone Limited + 486834 + Silicon Motion, Inc. - 88AE07 - Apple + F8CC6E + DEPO Electronics Ltd - 68FEF7 - Apple + F8369B + Texas Instruments - AC35EE - FN-Link Technology Limited + A09351 + Cisco Systems, Inc - 881196 - Huawei Technologies Ltd + B888E3 + COMPAL INFORMATION (KUNSHAN) CO., LTD. - E40EEE - Huawei Technologies Ltd + 208984 + COMPAL INFORMATION (KUNSHAN) CO., LTD. - 28D997 - Yuduan Mobile Ltd + 641331 + Bosch Car Multimedia (Wuhu) Co. Ltd. - 301F9A - IEEE Registration Authority + 183A48 + VostroNet - 0C2C54 - Huawei Technologies Ltd + 782F17 + Xlab Co.,Ltd - D4C19E - Ruckus Wireless + B0027E + MULLER SERVICES - 70695A - Cisco Systems Inc. + 24FAF3 + Shanghai Flexem Technology Co.,Ltd. - 00BF77 - Cisco Systems Inc. + 00C055 + MODULAR COMPUTING TECHNOLOGIES - D07714 - Motorola Mobility LLC, a Lenovo Company + E41FE9 + Dunkermotoren GmbH - 30B7D4 - Hitron Technologies Inc. + D8760A + Escort, Inc. - B481BF - Meta-Networks LLC + 487583 + Intellion AG - 946AB0 - Arcadyan Corporation + 8C3579 + QDIQO Sp. z o.o. - 4818FA - Nocsys + 38C70A + WiFiSong - 587A6A - Guangdong Oppo Mobile Telecommunications Corp Ltd + FCFBFB + Cisco Systems, Inc - A038F8 - OURA Health Oy + 88D2BF + German Autolabs - 687924 - ELS-GmbH & Co. KG + 20163D + Integrated Device Technology (Malaysia) Sdn. Bhd. - 28FD80 - IEEE Registration Authority + 5C2ED2 + ABC(XiSheng) Electronics Co.,Ltd - 0CAE7D - Texas Instruments + 9C5A44 + COMPAL INFORMATION (KUNSHAN) CO., LTD. - 304511 - Texas Instruments + 340A98 + HUAWEI TECHNOLOGIES CO.,LTD - E81AAC - ORFEO SOUNDWORKS Inc. + 646D6C + HUAWEI TECHNOLOGIES CO.,LTD - 000758 - DragonWave Inc. + C4B8B4 + HUAWEI TECHNOLOGIES CO.,LTD - F0FCC8 - ARRIS Group Inc. + 14CAA0 + Hu&Co - F8DF15 - Sunitec Enterprise Ltd + 001133 + Siemens AG Austria - 001DB5 - Juniper Networks + 000B23 + Siemens Home & Office Comm. Devices - B02680 - Cisco Systems Inc. + D82477 + Universal Electric Corporation - D49398 - Nokia Corporation + 00907F + WatchGuard Technologies, Inc. - 001937 - CommerceGuard AB + 4C5E0C + Routerboard.com - FC7C02 - Phicomm (Shanghai) Ltd + D4CA6D + Routerboard.com - A8610A - Arduino AG + 001017 + Bosch Access Systems GmbH - 6097DD - MicroSys Electronics GmbH + F4EE14 + MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. - 047970 - Huawei Technologies Ltd + 6C5940 + MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. - A057E3 - Huawei Technologies Ltd + D02516 + MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. - 1CB044 - Askey Computer Corp + 1C60DE + MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. - F4844C - Texas Instruments + 08D46A + LG Electronics (Mobile Communications) - B4F2E8 - ARRIS Group Inc. + 001472 + China Broadband Wireless IP Standard group(ChinaBWIPS) - 3C574F - China Mobile Group Device Ltd + 007E95 + Cisco Systems, Inc - D49CF4 - Palo Alto Networks + 4006A0 + Texas Instruments - 8C1645 - LCFC(HeFei) Electronics Technology Ltd + 80B575 + HUAWEI TECHNOLOGIES CO.,LTD - 689861 - Beacon Inc + A4BE2B + HUAWEI TECHNOLOGIES CO.,LTD - 609813 - Shanghai Visking Digital Technology Ltd + 2811A5 + Bose Corporation - 506B4B - Mellanox Technologies Inc. + D8F3DB + Post CH AG - B41C30 - ZTE Corporation + DCB4AC + FLEXTRONICS MANUFACTURING(ZHUHAI)CO.,LTD. - 705AAC - Samsung Electronics Ltd + 203DBD + LG Innotek - 2C9569 - ARRIS Group Inc. + 04ECBB + Fiberhome Telecommunication Technologies Co.,LTD - A039EE - Sagemcom Broadband SAS + D42122 + Sercomm Corporation. - E4CB59 - Beijing Loveair Science and Technology Ltd + 00C002 + Sercomm Corporation. - B4E62D - Espressif Inc. + 68E7C2 + Samsung Electronics Co.,Ltd - 847460 - ZTE Corporation + 58B10F + Samsung Electronics Co.,Ltd - 4C82CF - Dish Technologies Corp + A45385 + WEIFANG GOERTEK ELECTRONICS CO.,LTD - 285767 - Dish Technologies Corp + 00402F + XLNT DESIGNS INC. - 70169F - EtherCAT Technology Group + A492CB + Nokia - 68EF43 - Apple + C0D2F3 + Hui Zhou Gaoshengda Technology Co.,LTD - D02B20 - Apple + 64A2F9 + OnePlus Technology (Shenzhen) Co., Ltd - 2C61F6 - Apple + A87D12 + HUAWEI TECHNOLOGIES CO.,LTD - D4A33D - Apple + 94193A + Elvaco AB - F0766F - Apple + BC9911 + Zyxel Communications Corporation - 4098AD - Apple + 280245 + Konze System Technology Co.,Ltd. - 6C4D73 - Apple + E48F65 + Yelatma Instrument Making Enterprise, JSC - 1CA0B8 - Hon Hai Precision Ind Ltd + 00BB3A + Amazon Technologies Inc. - D88466 - Extreme Networks Inc. + 3CF5CC + New H3C Technologies Co., Ltd - 000496 - Extreme Networks Inc. + 002082 + ONEAC CORPORATION - 00E02B - Extreme Networks Inc. + 0000A8 + Stratus Technologies - 5C0E8B - Extreme Networks Inc. + 0004FC + Stratus Technologies - 7467F7 - Extreme Networks Inc. + 3C24F0 + IEEE Registration Authority - E43022 - Hanwha Techwin Security Vietnam + 0CB34F + Shenzhen Xiaoqi Intelligent Technology Co., Ltd. - 044F17 - HUMAX Ltd + C08135 + Ningbo Forfan technology Co., LTD - E48F34 - Vodafone Italia S.p.A. + 3CF4F9 + Moda-InnoChips - 685ACF - Samsung Electronics Ltd + 505DAC + HUAWEI TECHNOLOGIES CO.,LTD - 0CA8A7 - Samsung Electronics Ltd + B0A37E + QING DAO HAIER TELECOM CO.,LTD. - B0672F - Bowers & Wilkins + 3CEAF9 + JUBIXCOLTD - 10CD6E - Fisys + 682C7B + Cisco Systems, Inc - D86375 - Xiaomi Communications Ltd + E8FAF7 + Guangdong Uniteddata Holding Group Co., Ltd. - D89C67 - Hon Hai Precision Ind Ltd + 949D57 + Panasonic do Brasil Limitada - 64209F - Tilgin AB + FC6947 + Texas Instruments - A43E51 - Anov France + E07DEA + Texas Instruments - 702605 - SONY Visual Products Inc. + B4C0F5 + Shenzhen TINNO Mobile Technology Corp. - 0090F1 - Seagate Cloud Systems Inc + 406231 + GIFA - 845A81 - ffly4u + FCB7F0 + Idaho National Laboratory - CC81DA - Phicomm (Shanghai) Ltd + 04D3B0 + Intel Corporate - 00806C - Secure Systems & Services + 58DB15 + TECNO MOBILE LIMITED - 007263 - Netcore Technology Inc. + 5050CE + Hangzhou Dianyixia Communication Technology Co. Ltd. - 1C27DD - Datang Gohighsec(zhejiang)Information Technology Ltd + 2C28B7 + Hangzhou Ruiying technology co., LTD - B8C8EB - Itel Mobile Limited + 046B1B + SYSDINE Co., Ltd. - 80C5F2 - Azurewave Technologies Inc. + 1C666D + Hon Hai Precision Ind. Co.,Ltd. - 64F88A - China Mobile IOT Company Limited + DCDE4F + Gionee Communication Equipment Co Ltd - 68DB54 - Phicomm (Shanghai) Ltd + 4CD0CB + HUAWEI TECHNOLOGIES CO.,LTD - B45253 - Seagate Technology + 88D37B + FirmTek, LLC - 0011C6 - Seagate Technology + 441E98 + Ruckus Wireless - 001D38 - Seagate Technology + 007278 + Cisco Systems, Inc - 005013 - Seagate Cloud Systems Inc + 00A021 + General Dynamics Mission Systems - C8DF84 - Texas Instruments + 90DD5D + Apple, Inc. - 240D6C - Smnd + F0AF50 + Phantom Intelligence - 48555C - Wu Qi Technologies,Inc. + 00250C + Senet Inc - 18F0E4 - Xiaomi Communications Ltd + 0C8063 + TP-LINK TECHNOLOGIES CO.,LTD. - 588A5A - Dell Inc. + B4CD27 + HUAWEI TECHNOLOGIES CO.,LTD - 9C8C6E - Samsung Electronics Ltd + C819F7 + Samsung Electronics Co.,Ltd - DC4F22 - Espressif Inc. + 645AED + Apple, Inc. - F86CE1 - Taicang T&W Electronics + 001B48 + Shenzhen Lantech Electronics Co., Ltd. - 1C7328 - Connected Home + FC2A9C + Apple, Inc. - D8E004 - Vodia Networks Inc + A056F3 + Apple, Inc. - 2CFDAB - Motorola (Wuhan) Mobility Technologies Communication Ltd + 549963 + Apple, Inc. - 30B4B8 - LG Electronics + C0B658 + Apple, Inc. - 380E4D - Cisco Systems Inc. + 48A91C + Apple, Inc. - 3873EA - IEEE Registration Authority + 50BC96 + Apple, Inc. - 4C5262 - Fujitsu Technology Solutions GmbH + 002FD9 + Fiberhome Telecommunication Technologies Co.,LTD - 803BF6 - Look Easy International Limited + 885FE8 + IEEE Registration Authority - 30EB1F - Skylab M&C Technology Ltd + 3880DF + Motorola Mobility LLC, a Lenovo Company - 549A4C - Guangdong Homecare Technology Ltd + BC6A2F + Henge Docks LLC - EC1D8B - Cisco Systems Inc. + F4E11E + Texas Instruments - EC7097 - ARRIS Group Inc. + C42C4F + Qingdao Hisense Mobile Communication Technology Co,Ltd - 5819F8 - ARRIS Group Inc. + 24CACB + Fiberhome Telecommunication Technologies Co.,LTD - D07FC4 - Ou Wei Technology Ltd Of Shenzhen City + 543E64 + Fiberhome Telecommunication Technologies Co.,LTD - 1479F3 - China Mobile Group Device Ltd + 0C08B4 + HUMAX Co., Ltd. - 0CCEF6 - Guizhou Fortuneship Technology Ltd + DC0265 + Meditech Kft - 1806FF - Acer Computer(Shanghai) Limited. + 48BD3D + New H3C Technologies Co., Ltd - C4CD82 - Hangzhou Lowan Information Technology Ltd + 002705 + Sectronic - 30FB94 - Shanghai Fangzhiwei Information Technology Ltd + 180F76 + D-Link International - 0023A0 - Hana CNS Ltd + 909497 + HUAWEI TECHNOLOGIES CO.,LTD - F406A5 - Hangzhou Bianfeng Networking Technology Ltd + DC729B + HUAWEI TECHNOLOGIES CO.,LTD - A4B52E - Integrated Device Technology (Malaysia) Sdn. Bhd. + 14A72B + currentoptronics Pvt.Ltd - 3CA581 - Vivo Mobile Communication Ltd + 34029B + Plexonics Technologies LImited - 34E911 - Vivo Mobile Communication Ltd + 84DB9E + Pink Nectarine Health AB - 64CBA3 - Pointmobile + A4DA22 + IEEE Registration Authority - ECFABC - Espressif Inc. + 900372 + Longnan Junya Digital Technology Co. Ltd. - 08BA22 - Swaive Corporation + 8C4CAD + Evoluzn Inc. - 28C13C - Hon Hai Precision Ind Ltd + 8CF957 + RuiXingHengFang Network (Shenzhen) Co.,Ltd - B0ECE1 - Private + 0CC6CC + HUAWEI TECHNOLOGIES CO.,LTD - 60E78A - Unisem + 785860 + HUAWEI TECHNOLOGIES CO.,LTD - 282986 - APC by Schneider Electric + 4C776D + Cisco Systems, Inc - 707DB9 - Cisco Systems Inc. + 3CDCBC + Samsung Electronics Co.,Ltd - 08BEAC - Edimax Technology Ltd + 804E70 + Samsung Electronics Co.,Ltd - 002424 - Ace Axis Limited + D4E6B7 + Samsung Electronics Co.,Ltd - 50C9A0 - Skipper AS + 74E182 + Texas Instruments - 7483EF - Arista Networks + E8DEFB + MESOTIC SAS - 00E0F6 - Decision Europe + C400AD + Advantech Technology (CHINA) Co., Ltd. - CC2DE0 - Routerboard.com + 94FE9D + SHENZHEN GONGJIN ELECTRONICS CO.,LT - 00BF61 - Samsung Electronics Ltd + 6CB6CA + DIVUS GmbH - 7867D7 - Apple + 04D13A + Xiaomi Communications Co Ltd - B8C111 - Apple + 6CC4D5 + HMD Global Oy - 1046B4 - FormericaOE + 80C548 + Shenzhen Zowee Technology Co.,Ltd - 9CE33F - Apple + 0024AF + Dish Technologies Corp - 386B1C - Shenzhen Mercury Communication Technologies Ltd + C0A8F0 + Adamson Systems Engineering - DC5583 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 9C431E + IEEE Registration Authority - 001248 - Dell EMC + 4CC206 + Somfy - 006048 - Dell EMC + 3499D7 + Universal Flow Monitors, Inc. - 7CC95A - Dell EMC + 0C8BD3 + ITEL MOBILE LIMITED - D00401 - Motorola Mobility LLC, a Lenovo Company + E8ABF3 + HUAWEI TECHNOLOGIES CO.,LTD - 742857 - Mayfield Robotics + 449EF9 + vivo Mobile Communication Co., Ltd. - 589043 - Sagemcom Broadband SAS + B4E9A3 + port industrial automation GmbH - B4A382 - Hangzhou Hikvision Digital Technology Ltd + 6C2ACB + Paxton Access Ltd - A407B6 - Samsung Electronics Ltd + 980074 + Raisecom Technology CO., LTD - 40498A - Synapticon GmbH + 18C19D + Integrated Device Technology (Malaysia) Sdn. Bhd. - 389D92 - Seiko Epson Corporation + 0C9838 + Xiaomi Communications Co Ltd - 8C0F83 - Angie Hospitality LLC + 282C02 + IEEE Registration Authority - DC68EB - Nintendo Ltd + 583BD9 + Fiberhome Telecommunication Technologies Co.,LTD - E8361D - Sense Labs Inc. + FCA183 + Amazon Technologies Inc. - 087808 - Samsung Electronics Ltd + C48466 + Apple, Inc. - 887598 - Samsung Electronics Ltd + 347C25 + Apple, Inc. - C0174D - Samsung Electronics Ltd + CC2DB7 + Apple, Inc. - 20F19E - ARRIS Group Inc. + DCA266 + Hon Hai Precision Ind. Co.,Ltd. - C89F42 - VDII Innovation AB + A0BDCD + SKY UK LIMITED - 7091F3 - Universal Electronics Inc. + BC91B5 + Infinix mobility limited - 080069 - Silicon Graphics + 74EACB + New H3C Technologies Co., Ltd - 002291 - Cisco Systems Inc. + 5C865C + Samsung Electronics Co.,Ltd - 10FCB6 - mirusystems Ltd + 04F128 + HMD Global Oy - 04D6AA - Samsung Electro-Mechanics(Thailand) + D41A3F + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 50A83A - S Mobile Devices Limited + 30C507 + ECI Telecom Ltd. - 6405E9 - Shenzhen WayOS Technology Crop Ltd + 282FC2 + Automotive Data Solutions - A07099 - Beijing Huacan Electronics Ltd + 44AD19 + XINGFEI (H.K)LIMITED - 48D6D5 - Google Inc. + 000F9B + Ross Video Limited - 0C5842 - DME Micro + 0024BA + Texas Instruments - B810D4 - Masimo Corporation + 60512C + TCT mobile ltd - BC825D - Mitsumi Electric Ltd + 64DB81 + Syszone Co., Ltd. - D0666D - Shenzhen Bus-Lan Technology Ltd + 1CDF52 + Texas Instruments - 08152F - Samsung Electronics Ltd ARTIK + 04B167 + Xiaomi Communications Co Ltd - F4F5DB - Xiaomi Communications Ltd + EC8350 + Microsoft Corporation - CC2237 - IEEE Registration Authority + 5CAD76 + Shenzhen TCL New Technology Co., Ltd - 38D620 - Limidea Concept Pte Ltd + 646E6C + Radio Datacom LLC - 74F91A - Onface + E88E60 + NSD Corporation - A434F1 - Texas Instruments + 38ADBE + New H3C Technologies Co., Ltd - 186024 - Hewlett-Packard Company + 0C5203 + AGM GROUP LIMITED - BC3D85 - Huawei Technologies Ltd + 2C5491 + Microsoft Corporation - 2054FA - Huawei Technologies Ltd + C8458F + Wyler AG - 38378B - Huawei Technologies Ltd + 001BB9 + Elitegroup Computer Systems Co.,Ltd. - 745C4B - GN Audio A/S + 002461 + Shin Wang Tech. - 00149D - Sound ID Inc. + E4A7A0 + Intel Corporate - A8E824 - Inim Electronics S.R.L. + 38D7CA + 7HUGS LABS - 104963 - Harting K.K. + 5CE28C + Zyxel Communications Corporation - 8CD48E - Itel Mobile Limited + E4BD4B + zte corporation - 642B8A - ALL BEST Industrial Ltd + 001E1D + East Coast Datacom, Inc. - B8EE0E - Sagemcom Broadband SAS + 7846C4 + DAEHAP HYPER-TECH - ECD09F - Xiaomi Communications Ltd + 000144 + Dell EMC - 78E103 - Amazon Technologies Inc. + 08001B + Dell EMC - 000659 - EAL (Apeldoorn) B.V. + 7C010A + Texas Instruments - E4EC10 - Nokia Corporation + 701F53 + Cisco Systems, Inc - 002692 - Mitsubishi Electric Corporation + 18396E + SUNSEA TELECOMMUNICATIONS CO.,LTD. - 8CC121 - Panasonic Corporation AVC Networks Company + EC7D11 + vivo Mobile Communication Co., Ltd. - EC0441 - Shenzhen TIGO Semiconductor Ltd + A04EA7 + Apple, Inc. - ACBE75 - Ufine Technologies Ltd + F0989D + Apple, Inc. - 00C08F - Panasonic Electric Works Ltd + E42B34 + Apple, Inc. - B0350B - Mobiwire Mobiles (Ningbo) Ltd + 3C2EF9 + Apple, Inc. - 28A6AC - seca GmbH & Co. kg + FCD6BD + Robert Bosch GmbH - A8BE27 - Apple + 0C1C20 + Kakao Corp - C0A53E - Apple + 94282E + New H3C Technologies Co., Ltd - 444E6D - AVM Audiovisuelles Marketing und Computersysteme GmbH + 683C7D + Magic Intelligence Technology Limited - 90B1E0 - Beijing Nebula Link Technology Ltd + 74BBD3 + Shenzhen xeme Communication Co., Ltd. - 6C090A - Gematica SRL + D80831 + Samsung Electronics Co.,Ltd - 70E1FD - Flextronics + 48BA4E + Hewlett Packard - 74E60F - Tecno Mobile Limited + 9441C1 + Mini-Cam Limited - 001AA7 - Torian Wireless + 185282 + Fiberhome Telecommunication Technologies Co.,LTD - 0CB459 - Marketech International Corp. + 500F80 + Cisco Systems, Inc - 8014A8 - Guangzhou V-SOLUTION Electronic Technology Ltd + 504EDC + Ping Communication - 409BCD - D-Link International + 08674E + Hisense broadband multimedia technology Co.,Ltd - 002EC7 - Huawei Technologies Ltd + 8C3C4A + NAKAYO Inc - 488EEF - Huawei Technologies Ltd + 7086C1 + Texas Instruments - 547595 - TP-Link Technologies Ltd + 10F1F2 + LG Electronics (Mobile Communications) - C47154 - TP-Link Technologies Ltd + 8C68C8 + zte corporation - 586163 - Quantum Networks (SG) Pte Ltd + EC8263 + zte corporation - EC3DFD - Shenzhen Bilian Electronic Ltd + 98F5A9 + OHSUNG - 94D029 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 6CB749 + HUAWEI TECHNOLOGIES CO.,LTD - 308454 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 989C57 + HUAWEI TECHNOLOGIES CO.,LTD - 5C0339 - Huawei Technologies Ltd + F4D7B2 + LGS Innovations, LLC - F82819 - Liteon Technology Corporation + 00152A + Nokia Corporation - 0015E5 - Cheertek Inc. + 9C4A7B + Nokia Corporation - 50E971 - Jibo Inc. + 2CD2E7 + Nokia Corporation - 30F77F - S Mobile Devices Limited + 48EC5B + Nokia Solutions and Networks GmbH & Co. KG - D86C63 - Google Inc. + DC6AEA + Infinix mobility limited - 0840F3 - Tenda Technology LtdDongguan branch + 386EA2 + vivo Mobile Communication Co., Ltd. - 94FBB2 - Shenzhen Gongjin Electronics Ltd + 982D68 + Samsung Electronics Co., Ltd - 001E99 - Vantanol Industrial Corporation + 444AB0 + Zhejiang Moorgen Intelligence Technology Co., Ltd - 58B633 - Ruckus Wireless + 80739F + KYOCERA CORPORATION - 5C5181 - Samsung Electronics Ltd + 28840E + silicon valley immigration service - 608E08 - Samsung Electronics Ltd + 080070 + Mitsubishi Precision Co.,LTd. - 543D37 - Ruckus Wireless + C421C8 + KYOCERA CORPORATION - 2CE6CC - Ruckus Wireless + 80615F + Beijing Sinead Technology Co., Ltd. - 00227F - Ruckus Wireless + 34008A + IEEE Registration Authority - 74911A - Ruckus Wireless + 9050CA + Hitron Technologies. Inc - 00C05D - L&N Technologies + 409922 + AzureWave Technology Inc. - 58C583 - Itel Mobile Limited + C06D1A + Tianjin Henxinhuifeng Technology Co.,Ltd. - 18204C - Kummler+Matter AG + 107B44 + ASUSTek COMPUTER INC. - 18D225 - Fiberhome Telecommunication Technologies Ltd + A41115 + Robert Bosch Engineering and Business Solutions pvt. Ltd. - 18B430 - Nest Labs Inc. + F4F3AA + JBL GmbH & Co. KG - 30B164 - Power Electronics International Inc. + 40A3CC + Intel Corporate - F88A3C - IEEE Registration Authority + 84253F + silex technology, Inc. - A40450 - nFore Technology Inc. + 0008C9 + TechniSat Digital GmbH Daun - FC5A1D - Hitron Technologies Inc. + D8B12A + Panasonic Mobile Communications Co.,Ltd. - 94147A - Vivo Mobile Communication Ltd + 705812 + Panasonic Corporation AVC Networks Company - 3817E1 - Technicolor CH USA Inc. + 04209A + Panasonic Corporation AVC Networks Company - 9828A6 - Compal Information (Kunshan) Ltd + 40D63C + Equitech Industrial(DongGuan)Co.,Ltd - 943FC2 - Hewlett Packard Enterprise + AC512C + Infinix mobility limited - 681DEF - Shenzhen CYX Technology Ltd + B019C6 + Apple, Inc. - B40016 - Ingenico Terminals SAS + 3866F0 + Apple, Inc. - AC203E - Wuhan Tianyu Information Industry Ltd + E4FB5D + HUAWEI TECHNOLOGIES CO.,LTD - B01F29 - Helvetia Inc. + E86819 + HUAWEI TECHNOLOGIES CO.,LTD - 880F10 - Huami Information Technology Ltd + 0011C0 + Aday Technology Inc - 14612F - Avaya Inc + 0005F1 + Vrcom, Inc. - 00309D - Nimble Microsystems Inc. + 1CAB34 + New H3C Technologies Co., Ltd - 8C210A - TP-Link Technologies Ltd + 3C7843 + HUAWEI TECHNOLOGIES CO.,LTD - 4C189A - Guangdong Oppo Mobile Telecommunications Corp Ltd + 5C0979 + HUAWEI TECHNOLOGIES CO.,LTD - CC4B73 - AMPAK Technology Inc. + 309935 + zte corporation - 0015DC - KT&C Ltd + 0C72D9 + zte corporation - 00187D - Armorlink Co Ltd + 0030C8 + GAD LINE, LTD. - F430B9 - Hewlett-Packard Company + 0016E0 + 3Com Ltd - 0019F0 - Unionman Technology Ltd + D8DECE + ISUNG CO.,LTD - C8DB26 - Logitech + 801934 + Intel Corporate - A40E2B - Facebook Inc + 703EAC + Apple, Inc. - AC4E2E - Shenzhen JingHanDa Electronics Ltd + 50642B + XIAOMI Electronics,CO.,LTD - 4C910C - Lanix Internacional, S.A. de C.V. + 30C01B + Shenzhen Jingxun Software Telecommunication Technology Co.,Ltd - A47886 - Avaya Inc + 8C3BAD + NETGEAR - 0403D6 - Nintendo Ltd + 6432A8 + Intel Corporate - 5C1A6F - Cambridge Industries(Group) Ltd + 747D24 + Phicomm (Shanghai) Co., Ltd. - 3C4CD0 - Ceragon Networks + 64CFD9 + Texas Instruments - F40E83 - ARRIS Group Inc. + 008009 + JUPITER SYSTEMS, INC. - 98F7D7 - ARRIS Group Inc. + 00C064 + General Datacomm LLC - B4BFF6 - Samsung Electronics Ltd + F4B520 + Biostar Microtech international corp. - 2C3AE8 - Espressif Inc. + 8886C2 + STABILO International GmbH - 88BD78 - Flaircomm Microelectronics,Inc. + 887A31 + Velankani Electronics Pvt. Ltd. - 58C5CB - Samsung Electronics Ltd + 8C0F6F + PEGATRON CORPORATION - 206BE7 - TP-Link Technologies Ltd + 8C2505 + HUAWEI TECHNOLOGIES CO.,LTD - 182CB4 - Nectarsoft Ltd + 08A8A1 + Cyclotronics Power Concepts, Inc - 54C9DF - FN-Link Technology Limited + BC9680 + SHENZHEN GONGJIN ELECTRONICS CO.,LT - 74F61C - HTC Corporation + 7C2EDD + Samsung Electronics Co.,Ltd - B8FFB3 - MitraStar Technology Corp. + 3CF7A4 + Samsung Electronics Co.,Ltd - EC237B - ZTE Corporation + CC2F71 + Intel Corporate - A0C9A0 - Murata Manufacturing Ltd + B8F8BE + BLUECOM - 982DBA - Fibergate Inc. + 2C5D93 + Ruckus Wireless - 84C0EF - Samsung Electronics Ltd + 0000FE + Annapolis Micro Systems, Inc. - 00A38E - Cisco Systems Inc. + 38E595 + SHENZHEN GONGJIN ELECTRONICS CO.,LT - E0D55E - Giga-Byte Technology Ltd + 38FF36 + Ruckus Wireless - A040A0 - Netgear + 84183A + Ruckus Wireless - 000D2B - Racal Instruments + 24C9A1 + Ruckus Wireless - 48A74E - ZTE Corporation + 002482 + Ruckus Wireless - BC8AE8 - Qing DAO Haier Telecom Ltd + 103034 + Cara Systems - F4DE0C - ESPOD Ltd + 706E6D + Cisco Systems, Inc - 3C5282 - Hewlett-Packard Company + 00D01F + Senetas Corporation Ltd - 08ED02 - IEEE Registration Authority + 6447E0 + Feitian Technologies Co., Ltd - E8FDE8 - CeLa Link Corporation + B0DFC1 + Tenda Technology Co.,Ltd.Dongguan branch - 28C63F - Intel Corporation + 9C6F52 + zte corporation - 88CC45 - Skyworth Digital Technology(Shenzhen) Ltd + 604762 + Beijing Sensoro Technology Co.,Ltd. - 600837 - ivvi Scientific(Nanchang) Ltd + 689234 + Ruckus Wireless - EC363F - Markov Corporation + 50A733 + Ruckus Wireless - 5804CB - Tianjin Huisun Technology Ltd + E86D65 + AUDIO MOBIL Elektronik GmbH - 60D7E3 - IEEE Registration Authority + BC1C81 + Sichuan iLink Technology Co., Ltd. - 1893D7 - Texas Instruments + 900A1A + Taicang T&W Electronics - A8B86E - LG Electronics (Mobile Communications) + 506E92 + Innocent Technology Co., Ltd. - CC90E8 - Shenzhen YOUHUA Technology Ltd + 30FE31 + Nokia - 7C4F7D - Sawwave + E8E1E1 + Gemtek Technology Co., Ltd. - 9CAC6D - Universal Electronics Inc. + 28070D + GUANGZHOU WINSOUND INFORMATION TECHNOLOGY CO.,LTD. - 08EA40 - Shenzhen Bilian Electronic Ltd + B44F96 + Zhejiang Xinzailing Technology co., ltd - 00D095 - Alcatel-Lucent Enterprise + 4C65A8 + IEEE Registration Authority - 0020DA - Alcatel-Lucent Enterprise + D822F4 + Avnet Silica - 6C5976 - Shanghai Tricheer Technology Ltd + 348F27 + Ruckus Wireless - 7C7B8B - Control Concepts Inc. + 2C9EEC + Jabil Circuit Penang - 84A9C4 - Huawei Technologies Ltd + C4571F + June Life Inc - A0086F - Huawei Technologies Ltd + 886AE3 + Alpha Networks Inc. - 34CE00 - XIAOMI Electronics Ltd + 1C4D70 + Intel Corporate - D06F82 - Huawei Technologies Ltd + 60313B + Sunnovo International Limited - A0F479 - Huawei Technologies Ltd + 6CB227 + Sony Video & Sound Products Inc. - 844765 - Huawei Technologies Ltd + 00A3D1 + Cisco Systems, Inc - C4FF1F - Huawei Technologies Ltd + 001CFA + Alarm.com - B83765 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 986F60 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 345BBB - GD Midea Air-Conditioning Equipment Ltd + 745427 + SHENZHEN FAST TECHNOLOGIES CO.,LTD - C40BCB - Xiaomi Communications Ltd + 308976 + DALIAN LAMBA TECHNOLOGY CO.,LTD - 84AFEC - Buffalo Inc. + 2C2617 + Oculus VR, LLC - 5CC6E9 - Edifier International + FC06ED + M2Motive Technology Inc. - 98DDEA - Infinix mobility limited + 34D954 + WiBotic Inc. - 001D44 - Krohne + 4857DD + Facebook Inc - A8A198 - TCT mobile Ltd + 487D2E + TP-LINK TECHNOLOGIES CO.,LTD. - E0C0D1 - CK Telecom (Shenzhen) Limited + A0094C + CenturyLink - ACB57D - Liteon Technology Corporation + F07485 + NGD Systems, Inc. - D4619D - Apple + 488D36 + Arcadyan Corporation - D0498B - Zoom Server + BCD713 + Owl Labs - 0827CE - Nagano Keiki Ltd + F0D4F6 + Lars Thrane A/S - C0D3C0 - Samsung Electronics Ltd + F4A997 + CANON INC. - 948BC1 - Samsung Electronics Ltd + FC4D8C + SHENZHEN PANTE ELECTRONICS TECHNOLOGY CO., LTD - 14568E - Samsung Electronics Ltd + 64DFE9 + ATEME - 14BD61 - Apple + B43934 + Pen Generations, Inc. - 503A7D - AlphaTech PLC Int'l Ltd + 7426AC + Cisco Systems, Inc - F4C4D6 - Shenzhen Xinfa Electronic Ltd + 10C6FC + Garmin International - 6837E9 - Amazon Technologies Inc. + AC2205 + Compal Broadband Networks, Inc. - 2CA17D - ARRIS Group Inc. + 80A036 + Shanghai MXCHIP Information Technology Co., Ltd. - D83214 - Tenda Technology LtdDongguan branch + 105887 + Fiberhome Telecommunication Technologies Co.,LTD - 10954B - Megabyte Ltd + B02628 + Broadcom Limited - D8325A - Shenzhen YOUHUA Technology Ltd + 9874DA + Infinix mobility limited - 9CDA3E - Intel Corporation + 50338B + Texas Instruments - 002CC8 - Cisco Systems Inc. + 9C061B + Hangzhou H3C Technologies Co., Limited - C0028D - WINSTAR Display Ltd + 20F452 + Shanghai IUV Software Development Co. Ltd - E89FEC - Chengdu KT Electronic HI-Tech Ltd + 143F27 + Noccela Oy - 802689 - D-Link International + 680235 + Konten Networks Inc. - F8AB05 - Sagemcom Broadband SAS + E8DE8E + Integrated Device Technology (Malaysia) Sdn. Bhd. - 7C5049 - Apple + D8C06A + Hunantv.com Interactive Entertainment Media Co.,Ltd. - E47DEB - Shanghai Notion Information Technology Ltd + 1C5A0B + Tegile Systems - C4B9CD - Cisco Systems Inc. + 046E02 + OpenRTLS Group - D461FE - Hangzhou H3C Technologies Ltd + 900E83 + Monico Monitoring, Inc. - 2C4D54 - ASUSTek Computer Inc. + 601466 + zte corporation - 349672 - TP-Link Technologies Ltd + AC202E + Hitron Technologies. Inc - 64B473 - Xiaomi Communications Ltd + D8D866 + SHENZHEN TOZED TECHNOLOGIES CO.,LTD. - 7451BA - Xiaomi Communications Ltd + 6854ED + Alcatel-Lucent - 6CB4A7 - Landauer Inc. + 38AC3D + Nephos Inc - 7802F8 - Xiaomi Communications Ltd + 38F135 + SensorTec-Canada - 00238A - Ciena Corporation + AC7409 + Hangzhou H3C Technologies Co., Limited - 001081 - DPS Inc. + E81367 + AIRSOUND Inc. - 40F385 - IEEE Registration Authority + C49DED + Microsoft Corporation - 887873 - Intel Corporation + 98A40E + Snap, Inc. - F87588 - Huawei Technologies Ltd + F093C5 + Garland Technology - F44C7F - Huawei Technologies Ltd + 9810E8 + Apple, Inc. - 28A24B - Juniper Networks + C0D012 + Apple, Inc. - 080027 - PCS Systemtechnik GmbH + BCA920 + Apple, Inc. - F8A5C5 - Cisco Systems Inc. + 001192 + Cisco Systems, Inc - 7C5A1C - Sophos Ltd + 8058F8 + Motorola Mobility LLC, a Lenovo Company - B0F1EC - AMPAK Technology Inc. + 48A195 + Apple, Inc. - 542B57 - Night Owl SP + F80377 + Apple, Inc. - 501E2D - StreamUnlimited Engineering GmbH + F49634 + Intel Corporate - E45D51 - SFR + A41163 + IEEE Registration Authority - EC01EE - Guangdong Oppo Mobile Telecommunications Corp Ltd + E8D11B + ASKEY COMPUTER CORP - 6049C1 - Avaya Inc + C4D197 + Ventia Utility Services - 702084 - Hon Hai Precision Ind Ltd + 70AF24 + TP Vision Belgium NV - 9C6650 - Glodio Technolies Ltd Tianjin Branch + 0C5F35 + Niagara Video Corporation - A0A33B - Huawei Technologies Ltd + 7CE97C + ITEL MOBILE LIMITED - 7C67A2 - Intel Corporation + CCBE59 + Calix Inc. - 00E05A - Galea Network Security + DCA4CA + Apple, Inc. - 48A380 - Gionee Communication Equipment Ltd + 8C8FE9 + Apple, Inc. - 94652D - OnePlus Technology (Shenzhen) Ltd + 70AF25 + Nishiyama Industry Co.,LTD. - 1CB857 - Becon Technologies Ltd + 2C86D2 + Cisco Systems, Inc - 682737 - Samsung Electronics Ltd + B8F883 + TP-LINK TECHNOLOGIES CO.,LTD. - F06E32 - Microtel Innovation S.R.L. + DCFE18 + TP-LINK TECHNOLOGIES CO.,LTD. - 54C415 - Hangzhou Hikvision Digital Technology Ltd + 704F57 + TP-LINK TECHNOLOGIES CO.,LTD. - 3CF862 - Intel Corporation + 001912 + Welcat Inc - 2816AD - Intel Corporation + 9800C1 + GuangZhou CREATOR Technology Co.,Ltd.(CHINA) - 0060D3 - AT&T + 98D3D2 + MEKRA Lang GmbH & Co. KG - 848DC7 - Cisco SPVTG + 903D6B + Zicon Technology Corp. - 001992 - Adtran Inc + B0C46C + Senseit - 045D4B - Sony Corporation + 8C78D7 + SHENZHEN FAST TECHNOLOGIES CO.,LTD - 78AF58 - Gimasi SA + B8EAAA + ICG NETWORKS CO.,ltd - 90505A - unGlue Inc. + 0002A1 + World Wide Packets - 8C9351 - Jigowatts Inc. + 00E022 + Analog Devices, Inc. - D838FC - Ruckus Wireless + F8A34F + zte corporation - 3478D7 - Gionee Communication Equipment Ltd + C87324 + Sow Cheng Technology Co. Ltd. - 5CCCA0 - Gridwiz Inc. + 4C4E03 + TCT mobile ltd - 6831FE - Teladin Ltd + 50E666 + Shenzhen Techtion Electronics Co., Ltd. - 5800E3 - Liteon Technology Corporation + B04089 + Senient Systems LTD - 2C0BE9 - Cisco Systems Inc. + 5425EA + HUAWEI TECHNOLOGIES CO.,LTD - C43018 - MCS Logic Inc. + C894BB + HUAWEI TECHNOLOGIES CO.,LTD - D0FF98 - Huawei Technologies Ltd + 10B1F8 + HUAWEI TECHNOLOGIES CO.,LTD - B0E5ED - Huawei Technologies Ltd + 089E08 + Google, Inc. - C486E9 - Huawei Technologies Ltd + 3C7F6F + Telechips, Inc. - 000AE4 - Wistron Corporation + 28FECD + Lemobile Information Technology (Beijing) Co., Ltd. - 344B3D - Fiberhome Telecommunication Technologies Ltd + 00210D + SAMSIN INNOTEC - FC3CE9 - Tsingtong Technologies Ltd + 5CBA37 + Microsoft Corporation - A408F5 - Sagemcom Broadband SAS + 00C0C6 + PERSONAL MEDIA CORP. - 00B091 - Transmeta Corp. + B8ECA3 + Zyxel Communications Corporation - ACC662 - MitraStar Technology Corp. + 5419C8 + vivo Mobile Communication Co., Ltd. - 886B44 - Sunnovo International Limited + 000277 + Cash Systemes Industrie - A4580F - IEEE Registration Authority + 0016D3 + Wistron Corporation - C8F733 - Intel Corporation + 001F16 + Wistron Corporation - E0A700 - Verkada Inc + 00262D + Wistron Corporation - 58404E - Apple + 0495E6 + Tenda Technology Co.,Ltd.Dongguan branch - D0C5F3 - Apple + 00608B + ConferTech International - BC9FEF - Apple + 702D84 + i4C Innovations - 20AB37 - Apple + C0D9F7 + ShanDong Domor Intelligent S&T CO.,Ltd - 60F445 - Apple + B0B98A + NETGEAR - 48F97C - Fiberhome Telecommunication Technologies Ltd + 805A04 + LG Electronics (Mobile Communications) - 40B93C - Hewlett Packard Enterprise + 2C200B + Apple, Inc. - C0BFC0 - Huawei Technologies Ltd + 8866A5 + Apple, Inc. - 9CD9CB - Lesira Manufacturing Pty Ltd + 901711 + Hagenuk Marinekommunikation GmbH - 94E979 - Liteon Technology Corporation + 0010DE + INTERNATIONAL DATACASTING CORPORATION - A03D6F - Cisco Systems Inc. + 8CA5A1 + Oregano Systems - Design & Consulting GmbH - A0E0AF - Cisco Systems Inc. + CCA219 + SHENZHEN ALONG INVESTMENT CO.,LTD - 4CB81C - SAM Electronics GmbH + 4C1A3A + PRIMA Research And Production Enterprise Ltd. - 003048 - Super Micro Computer Inc. + 9CAED3 + Seiko Epson Corporation - 44D244 - Seiko Epson Corporation + 707C69 + Avaya Inc - A08CF8 - Huawei Technologies Ltd + 500B91 + IEEE Registration Authority - 7CF95C - U.I. Lapp GmbH + F8461C + Sony Interactive Entertainment Inc. - A4E6B1 - Shanghai Joindata Technology Ltd + 704D7B + ASUSTek COMPUTER INC. - C09C04 - Shaanxi GuoLian Digital TV Technology Ltd + 38BC01 + HUAWEI TECHNOLOGIES CO.,LTD - ACD657 - Shaanxi GuoLian Digital TV Technology Ltd + 341E6B + HUAWEI TECHNOLOGIES CO.,LTD - 007686 - Cisco Systems Inc. + 886639 + HUAWEI TECHNOLOGIES CO.,LTD - 8C2FA6 - Solid Optics B.V. + 000048 + Seiko Epson Corporation - 8C192D - IEEE Registration Authority + B0E892 + Seiko Epson Corporation - 00ACE0 - ARRIS Group Inc. + AC1826 + Seiko Epson Corporation - 007532 - Inid BV + A4EE57 + Seiko Epson Corporation - 6473E2 - Arbiter Systems Inc. + E4B005 + Beijing IQIYI Science & Technology Co., Ltd. - 88C626 - Logitech Inc. + ACC1EE + Xiaomi Communications Co Ltd - D0608C - ZTE Corporation + BC8385 + Microsoft Corporation - AC233F - Shenzhen Minew Technologies Ltd + B05216 + Hon Hai Precision Ind. Co.,Ltd. - 7C03C9 - Shenzhen YOUHUA Technology Ltd + 14A78B + Zhejiang Dahua Technology Co., Ltd. - B8E937 - Sonos Inc. + 4C26E7 + Welgate Co., Ltd. - E45D52 - Avaya Inc + 006041 + Yokogawa Digital Computer Corporation - 0023F7 - Private + 18F87A + i3 International Inc. - 3C80AA - Ransnet Singapore Pte Ltd + A0E4CB + Zyxel Communications Corporation - B49691 - Intel Corporation + 284ED7 + OutSmart Power Systems, Inc. - C82158 - Intel Corporation + 64A68F + Zhongshan Readboy Electronics Co.,Ltd - 2420C7 - Sagemcom Broadband SAS + 2C598A + LG Electronics (Mobile Communications) - D4C8B0 - Prime Electronics & Satellitics Inc. + A0B8F8 + Amgen U.S.A. Inc. - 446AB7 - ARRIS Group Inc. + 884477 + HUAWEI TECHNOLOGIES CO.,LTD - 701CE7 - Intel Corporation + 149D09 + HUAWEI TECHNOLOGIES CO.,LTD - 9C2A70 - Hon Hai Precision Ind Ltd + 686975 + Angler Labs Inc - 703D15 - Hangzhou H3C Technologies Ltd + 4C11BF + Zhejiang Dahua Technology Co., Ltd. - E49E12 - Freebox SAS + 00425A + Cisco Systems, Inc - 0481AE - Clack Corporation + 9CFBD5 + vivo Mobile Communication Co., Ltd. - 9C13AB - Chanson Water Ltd + 18F76B + Zhejiang Winsight Technology CO.,LTD - 98E476 - Zentan + C81B5C + BCTech - 14A51A - Huawei Technologies Ltd + E07C13 + zte corporation - 047503 - Huawei Technologies Ltd + F41F88 + zte corporation - 3CEF8C - Zhejiang Dahua Technology Ltd + 583112 + DRUST - A4D9A4 - neXus ID Solutions AB + 9C83BF + PRO-VISION, Inc. - 484D7E - Dell Inc. + 78EF4C + Unetconvergence Co., Ltd. - D4E90B - CVT Ltd + 20D25F + SmartCap Technologies - CCB0DA - Liteon Technology Corporation + E47DBD + Samsung Electronics Co.,Ltd - 18F292 - Shannon Systems + 00C05A + SEMAPHORE COMMUNICATIONS CORP. - 8CEA1B - Edgecore Networks Corporation + 0007F9 + Sensaphone - E02CF3 - MRS Electronic GmbH + 001CB3 + Apple, Inc. - 50B363 - Digitron da Amazonia S/A + 1CC0E1 + IEEE Registration Authority - 2C0E3D - Samsung Electro-Mechanics(Thailand) + 24920E + Samsung Electronics Co.,Ltd - 58E16C - Ying Hua Information Technology (Shanghai) Ltd + FC4203 + Samsung Electronics Co.,Ltd - 9C7DA3 - Huawei Technologies Ltd + A01081 + Samsung Electronics Co.,Ltd - A4C64F - Huawei Technologies Ltd + A04E01 + CENTRAL ENGINEERING co.,ltd. - CCFD17 - TCT mobile Ltd + 28CA09 + ThyssenKrupp Elevators (Shanghai) Co.,Ltd - DC9FDB - Ubiquiti Networks Inc. + 005093 + BOEING - 002722 - Ubiquiti Networks Inc. + 28EE52 + TP-LINK TECHNOLOGIES CO.,LTD. - 00156D - Ubiquiti Networks Inc. + 001A39 + Merten GmbH&CoKG - 00D78F - Cisco Systems Inc. + 3C8BCD + Alcatel-Lucent Shanghai Bell Co., Ltd - 2CBABA - Samsung Electronics Ltd + 4CF95D + HUAWEI TECHNOLOGIES CO.,LTD - 40D3AE - Samsung Electronics Ltd + 8421F1 + HUAWEI TECHNOLOGIES CO.,LTD - 2CDD95 - Taicang T&W Electronics + 707990 + HUAWEI TECHNOLOGIES CO.,LTD - 88E87F - Apple + 14EDBB + 2Wire Inc - 9CF48E - Apple + 18E29F + vivo Mobile Communication Co., Ltd. - 5CF7E6 - Apple + 00B0E1 + Cisco Systems, Inc - B853AC - Apple + E43ED7 + Arcadyan Corporation - 203CAE - Apple + F07960 + Apple, Inc. - A03BE3 - Apple + A0D795 + Apple, Inc. - 4C3275 - Apple + 0090E7 + HORSCH ELEKTRONIK AG - 487A55 - ALE International + 905C44 + Compal Broadband Networks, Inc. - 001EAE - Continental Automotive Systems Inc. + 842519 + Samsung Electronics - 502B73 - Tenda Technology LtdDongguan branch + 5C2443 + O-Sung Telecom Co., Ltd. - 04BA36 - Li Seng Technology Ltd + 2047ED + SKY UK LIMITED - 107223 - Tellescom Industria E Comercio EM Telecomunicacao + 748A69 + Korea Image Technology Co., Ltd - E0686D - Raybased AB + 5454CF + PROBEDIGITAL CO.,LTD - 1861C7 - lemonbeat GmbH + F8633F + Intel Corporate - 9CDC71 - Hewlett Packard Enterprise + 088620 + TECNO MOBILE LIMITED - B4F81E - Kinova + 002566 + Samsung Electronics Co.,Ltd - D03DC3 - AQ Corporation + 981333 + zte corporation - EC01E2 - Foxconn Interconnect Technology + 6474F6 + Shooter Detection Systems - B4E782 - Vivalnk + 00F22C + Shanghai B-star Technology Co.,Ltd. - 4409B8 - Salcomp (Shenzhen) Ltd + 0005EE + Vanderbilt International (SWE) AB - 3816D1 - Samsung Electronics Ltd + 04180F + Samsung Electronics Co.,Ltd - D0176A - Samsung Electronics Ltd + 2013E0 + Samsung Electronics Co.,Ltd - D48890 - Samsung Electronics Ltd + D0DB32 + Nokia Corporation - 5492BE - Samsung Electronics Ltd + E80036 + Befs co,. ltd - 205D47 - Vivo Mobile Communication Ltd + C09F05 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 10C60C - Domino UK Ltd + F43C96 + Ericsson AB - 043110 - Inspur Group Ltd + C4411E + Belkin International Inc. - 949AA9 - Microsoft Corporation + 24F5A2 + Belkin International Inc. - ACAB2E - Beijing LasNubes Technology Ltd + C0F945 + Toshiba Toko Meter Systems Co., LTD. - 600B03 - Hangzhou H3C Technologies Ltd + 70F8E7 + IEEE Registration Authority - A0AB1B - D-Link International + D42C44 + Cisco Systems, Inc - D842E2 - Canary Connect Inc. + B88EDF + Zencheer Communication Technology Co., Ltd. - C8B21E - Chipsea Technologies (Shenzhen) Corp. + DC7144 + SAMSUNG ELECTRO MECHANICS CO., LTD. - 000678 - D&M Holdings Inc. + 002485 + ConteXtream Ltd - E0286D - AVM Audiovisuelles Marketing und Computersysteme GmbH + 28FCF6 + Shenzhen Xin KingBrand enterprises Co.,Ltd - 884CCF - Pulzze Systems Inc. + 689423 + Hon Hai Precision Ind. Co.,Ltd. - 500959 - Technicolor CH USA Inc. + 844BF5 + Hon Hai Precision Ind. Co.,Ltd. - E41218 - Shenzhen Rapoo Technology Ltd + 08EDB9 + Hon Hai Precision Ind. Co.,Ltd. - 001984 - ESTIC Corporation + 3C77E6 + Hon Hai Precision Ind. Co.,Ltd. - 001628 - Magicard Ltd + 70188B + Hon Hai Precision Ind. Co.,Ltd. - 702E22 - ZTE Corporation + 980C82 + SAMSUNG ELECTRO MECHANICS CO., LTD. - C8E776 - PTCOM Technology + A00BBA + SAMSUNG ELECTRO MECHANICS CO., LTD. - 000278 - Samsung Electro Mechanics Ltd + 606BBD + Samsung Electronics Co.,Ltd - 002399 - Samsung Electronics Ltd + 00214C + Samsung Electronics Co.,Ltd - 0017C9 - Samsung Electronics Ltd + 00166B + Samsung Electronics Co.,Ltd - 906EBB - Hon Hai Precision Ind Ltd + 001F58 + EMH Energiemesstechnik GmbH - 18F46A - Hon Hai Precision Ind Ltd + 0016DF + Lundinova AB - 4C0F6E - Hon Hai Precision Ind Ltd + 001D0C + MobileCompia - 78E400 - Hon Hai Precision Ind Ltd + 843DC6 + Cisco Systems, Inc - 00212F - Phoebe Micro Inc. + 0000F0 + Samsung Electronics Co.,Ltd - 3859F9 - Hon Hai Precision Ind Ltd + 8CC8CD + Samsung Electronics Co.,Ltd - EC55F9 - Hon Hai Precision Ind Ltd + 8018A7 + Samsung Electronics Co.,Ltd - C4731E - Samsung Electronics Ltd + 5C6D20 + Hon Hai Precision Ind. Co.,Ltd. - 5C0A5B - Samsung Electro Mechanics Ltd + 5CAC4C + Hon Hai Precision Ind. Co.,Ltd. - 7CE9D3 - Hon Hai Precision Ind Ltd + 34E71C + Shenzhen YOUHUA Technology Co., Ltd - 1C3E84 - Hon Hai Precision Ind Ltd + F47B5E + Samsung Electronics Co.,Ltd - B8763F - Hon Hai Precision Ind Ltd + 08C6B3 + QTECH LLC - 60F494 - Hon Hai Precision Ind Ltd + 0018AF + Samsung Electronics Co.,Ltd - 8056F2 - Hon Hai Precision Ind Ltd + 001EE1 + Samsung Electronics Co.,Ltd - 7CF854 - Samsung Electronics Ltd + D02544 + SAMSUNG ELECTRO-MECHANICS(THAILAND) - 001B98 - Samsung Electronics Ltd + 005A13 + HUAWEI TECHNOLOGIES CO.,LTD - 001A8A - Samsung Electronics Ltd + 24DBED + Samsung Electronics Co.,Ltd - 3C5A37 - Samsung Electronics Ltd + C45006 + Samsung Electronics Co.,Ltd - F49F54 - Samsung Electronics Ltd + 88329B + SAMSUNG ELECTRO-MECHANICS(THAILAND) - 34C3AC - Samsung Electronics Ltd + 1449E0 + SAMSUNG ELECTRO-MECHANICS(THAILAND) - 44F459 - Samsung Electronics Ltd + D487D8 + Samsung Electronics Co.,Ltd - 00265D - Samsung Electronics Ltd + 184617 + Samsung Electronics Co.,Ltd - CCF9E8 - Samsung Electronics Ltd + 380A94 + Samsung Electronics Co.,Ltd - D857EF - Samsung Electronics Ltd + D0DFC7 + Samsung Electronics Co.,Ltd - 18E2C2 - Samsung Electronics Ltd + D0C1B1 + Samsung Electronics Co.,Ltd - 9852B1 - Samsung Electronics Ltd + 20D390 + Samsung Electronics Co.,Ltd - E440E2 - Samsung Electronics Ltd + 9401C2 + Samsung Electronics Co.,Ltd - 103B59 - Samsung Electronics Ltd + 50FC9F + Samsung Electronics Co.,Ltd - D890E8 - Samsung Electronics Ltd + 380B40 + Samsung Electronics Co.,Ltd - C462EA - Samsung Electronics Ltd + 70F927 + Samsung Electronics Co.,Ltd - 14F42A - Samsung Electronics Ltd + F0728C + Samsung Electronics Co.,Ltd - 0808C2 - Samsung Electronics Ltd + 34AA8B + Samsung Electronics Co.,Ltd - CCFE3C - Samsung Electronics Ltd + BC4486 + Samsung Electronics Co.,Ltd - 28BAB5 - Samsung Electronics Ltd + A8F274 + Samsung Electronics Co.,Ltd - 182666 - Samsung Electronics Ltd + 886AB1 + vivo Mobile Communication Co., Ltd. - 30D6C9 - Samsung Electronics Ltd + 6C1E90 + Hansol Technics Co., Ltd. - CC07AB - Samsung Electronics Ltd + 00177E + Meshcom Technologies Inc. - 002567 - Samsung Electronics Ltd + 98F058 + Lynxspring, Incl. - BCB1F3 - Samsung Electronics Ltd + C4F5A5 + Kumalift Co., Ltd. - 1C62B8 - Samsung Electronics Ltd + 9884E3 + Texas Instruments - B43A28 - Samsung Electronics Ltd + 38D269 + Texas Instruments - 78A873 - Samsung Electronics Ltd + C8FD19 + Texas Instruments - 001C43 - Samsung Electronics Ltd + 508CB1 + Texas Instruments - 0023D6 - Samsung Electronics Ltd + B8FF61 + Apple, Inc. - E4121D - Samsung Electronics Ltd + 946124 + Pason Systems - 44D6E1 - Snuza International Pty Ltd + 68C44D + Motorola Mobility LLC, a Lenovo Company - FC9114 - Technicolor CH USA Inc. + C8DE51 + IntegraOptics - 486DBB - Vestel Elektronik San ve Tic. A.S. + 304487 + Hefei Radio Communication Technology Co., Ltd - 002A10 - Cisco Systems Inc. + 2C9D1E + HUAWEI TECHNOLOGIES CO.,LTD - 00A289 - Cisco Systems Inc. + 943DC9 + Asahi Net, Inc. - 44E9DD - Sagemcom Broadband SAS + 0081C4 + Cisco Systems, Inc - 000F5E - Veo + 440444 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 001328 - Westech Korea Inc., + 58E876 + IEEE Registration Authority - B8BF83 - Intel Corporation + D03742 + Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd - 8C6102 - Beijing Baofengmojing Technologies Ltd + 001765 + Nortel Networks - 548CA0 - Liteon Technology Corporation + 0015E8 + Nortel Networks - 7C79E8 - PayRange Inc. + 000F06 + Nortel Networks - A43111 - ZIV + F8E61A + Samsung Electronics Co.,Ltd - 008073 - DWB Associates + 84B541 + Samsung Electronics Co.,Ltd - 80A1D7 - Shanghai DareGlobal Technologies Ltd + 006F64 + Samsung Electronics Co.,Ltd - EC1F72 - Samsung Electro-Mechanics(Thailand) + DC6672 + Samsung Electronics Co.,Ltd - 8C0D76 - Huawei Technologies Ltd + EC8EB5 + Hewlett Packard - 84BE52 - Huawei Technologies Ltd + 70AF6A + SHENZHEN FENGLIAN TECHNOLOGY CO., LTD. - 849FB5 - Huawei Technologies Ltd + C4047B + Shenzhen YOUHUA Technology Co., Ltd - A4CAA0 - Huawei Technologies Ltd + 00233E + Alcatel-Lucent IPD - 84E0F4 - IEEE Registration Authority + 6CBEE9 + Alcatel-Lucent IPD - D83062 - Apple + 00164D + Alcatel-Lucent IPD - D0E54D - ARRIS Group Inc. + 001AF0 + Alcatel-Lucent IPD - A0C562 - ARRIS Group Inc. + 38521A + Nokia - 8496D8 - ARRIS Group Inc. + 001E40 + Shanghai DareGlobal Technologies Co.,Ltd - 0026D9 - ARRIS Group Inc. + 20F543 + Hui Zhou Gaoshengda Technology Co.,LTD - E8508B - Samsung Electro-Mechanics(Thailand) + E0DDC0 + vivo Mobile Communication Co., Ltd. - F8042E - Samsung Electro-Mechanics(Thailand) + 94D723 + Shanghai DareGlobal Technologies Co.,Ltd - 00D037 - ARRIS Group Inc. + FCFAF7 + Shanghai Baud Data Communication Co.,Ltd. - 84E058 - ARRIS Group Inc. + D826B9 + Guangdong Coagent Electronics S&amp;T Co.,Ltd. - 707630 - ARRIS Group Inc. + AC9CE4 + Alcatel-Lucent Shanghai Bell Co., Ltd - 04BBF9 - Pavilion Data Systems Inc + 00159B + Nortel Networks - E4BEED - Netcore Technology Inc. + 001540 + Nortel Networks - 58FB84 - Intel Corporation + 001ECA + Nortel Networks - 00C017 - NetAlly + 00130A + Nortel Networks - 5CB066 - ARRIS Group Inc. + 001F0A + Nortel Networks - BC8AA3 - NHN Entertainment + 6CA858 + Fiberhome Telecommunication Technologies Co.,LTD - A8BD27 - Hewlett Packard Enterprise + A84E3F + Hitron Technologies. Inc - 345760 - MitraStar Technology Corp. + 08D833 + Shenzhen RF Technology Co., Ltd - C0D391 - IEEE Registration Authority + A46032 + MRV Communications (Networks) LTD - D49B5C - Chongqing Miedu Technology Ltd + 40667A + mediola - connected living AG - E8EB11 - Texas Instruments + 9C2A83 + Samsung Electronics Co.,Ltd - 44BFE3 - Shenzhen Longtech Electronics Ltd + 0022A9 + LG Electronics (Mobile Communications) - 3C6FEA - Panasonic India Pvt Ltd + 0025E5 + LG Electronics (Mobile Communications) - 002261 - Frontier Silicon Ltd + 0021FB + LG Electronics (Mobile Communications) - 001988 - Wi2Wi Inc. + 34FCEF + LG Electronics (Mobile Communications) - 18DC56 - Yulong Computer Telecommunication Scientific (Shenzhen) Ltd + BCF5AC + LG Electronics (Mobile Communications) - 0016F2 - Dmobile System Ltd + 98D6F7 + LG Electronics (Mobile Communications) - 34074F - AccelStor Inc. + 700514 + LG Electronics (Mobile Communications) - B4A984 - Symantec Corporation + E892A4 + LG Electronics (Mobile Communications) - B0B28F - Sagemcom Broadband SAS + 10683F + LG Electronics (Mobile Communications) - 441441 - AudioControl Inc. + 40B0FA + LG Electronics (Mobile Communications) - C88D83 - Huawei Technologies Ltd + A039F7 + LG Electronics (Mobile Communications) - 00E011 - Uniden Corporation + 1CCAE3 + IEEE Registration Authority - 002555 - Visonic Technologies 1993 Ltd + E4956E + IEEE Registration Authority - 58986F - Revolution Display + B437D1 + IEEE Registration Authority - C81FBE - Huawei Technologies Ltd + A091C8 + zte corporation - 203DB2 - Huawei Technologies Ltd + 0055DA + IEEE Registration Authority - 48D539 - Huawei Technologies Ltd + 78C2C0 + IEEE Registration Authority - 001F9A - Nortel Networks + 2C6A6F + IEEE Registration Authority - 000A0E - Invivo Research Inc. + 00600F + Westell Technologies Inc. - 001660 - Nortel Networks + 00183A + Westell Technologies Inc. - 001E7E - Nortel Networks + 000EE8 + Zioncom Electronics (Shenzhen) Ltd. - 001365 - Nortel Networks + 00C095 + ZNYX Networks, Inc. - 000438 - Nortel Networks + 002025 + CONTROL TECHNOLOGY, INC. - 000EC0 - Nortel Networks + 00DD0A + UNGERMANN-BASS INC. - D84FB8 - LG Electronics + 002517 + Venntis, LLC - 000AEB - TP-Link Technologies Ltd + 683563 + SHENZHEN LIOWN ELECTRONICS CO.,LTD. - 2C3731 - Shenzhen Yifang Digital Technology Ltd + 004072 + Applied Innovation Inc. - 60EE5C - Shenzhen Fast Technologies Ltd + 0008F1 + Voltaire - 6488FF - Sichuan Changhong Electric Ltd + 00199D + Vizio, Inc - 002162 - Nortel Networks + 001938 + UMB Communications Co., Ltd. - 02E6D3 - Nixdorf Computer Corp. + 00B064 + Cisco Systems, Inc - 0016B9 - ProCurve Networking by HP + 68A0F6 + HUAWEI TECHNOLOGIES CO.,LTD - C4084A - Nokia + 845DD7 + Shenzhen Netcom Electronics Co.,Ltd - 000801 - HighSpeed Surfing Inc. + 1C57D8 + Kraftway Corporation PLC - 000772 - Alcatel-Lucent Shanghai Bell Ltd + 00E08B + QLogic Corporation - E03005 - Alcatel-Lucent Shanghai Bell Ltd + D8EB97 + TRENDnet, Inc. - 3C404F - Guangdong Pisen Electronics Ltd + 001C7E + Toshiba - 0CA402 - Alcatel-Lucent IPD + 002318 + Toshiba - A0F3E4 - Alcatel-Lucent IPD + B86B23 + Toshiba - 84DBFC - Nokia + AC040B + Peloton Interactive, Inc - 7CFC3C - Visteon Corporation + 48FCB6 + LAVA INTERNATIONAL(H.K) LIMITED - 981E0F - Jeelan (Shanghai Jeelan Technology Information Inc + B0E235 + Xiaomi Communications Co Ltd - 4888CA - Motorola (Wuhan) Mobility Technologies Communication Ltd + 001349 + Zyxel Communications Corporation - 385610 - CANDY HOUSE Inc. + D8E0B8 + BULAT LLC - 00A742 - Cisco Systems Inc. + 603197 + Zyxel Communications Corporation - 00AA70 - LG Electronics (Mobile Communications) + 001BFE + Zavio Inc. - F895C7 - LG Electronics (Mobile Communications) + 5410EC + Microchip Technology Inc. - 84D931 - Hangzhou H3C Technologies Ltd + 0004A3 + Microchip Technology Inc. - 00116E - Peplink International Ltd + 789CE7 + Shenzhen Aikede Technology Co., Ltd - 540955 - ZTE Corporation + 509F3B + OI ELECTRIC CO.,LTD - 001E75 - LG Electronics (Mobile Communications) + 14C913 + LG Electronics - 001C62 - LG Electronics (Mobile Communications) + C0C976 + Shenzhen TINNO Mobile Technology Corp. - 505527 - LG Electronics (Mobile Communications) + 588BF3 + Zyxel Communications Corporation - 88C9D0 - LG Electronics (Mobile Communications) + 5067F0 + Zyxel Communications Corporation - C041F6 - LG Electronics Inc + 446EE5 + HUAWEI TECHNOLOGIES CO.,LTD - 8C3AE3 - LG Electronics (Mobile Communications) + C8778B + Mercury Systems – Trusted Mission Solutions, Inc. - 90A46A - Sisnet Ltd + 94DF4E + Wistron InfoComm(Kunshan)Co.,Ltd. - 14E7C8 - Integrated Device Technology (Malaysia) Sdn. Bhd. + 98EECB + Wistron Infocomm (Zhongshan) Corporation - ECCD6D - Allied Telesis Inc. + 683E34 + MEIZU Technology Co., Ltd. - 18339D - Cisco Systems Inc. + 00044B + NVIDIA - 54276C - Jiangsu Houge Technology Corp. + AC9B0A + Sony Corporation - 9CA3A9 - Guangzhou Juan Optical and Electronical Tech Joint Stock Ltd + 104FA8 + Sony Corporation - 7CC709 - Shenzhen RF-Link Technology Ltd + A06090 + Samsung Electronics Co.,Ltd - A03E6B - IEEE Registration Authority + BC765E + Samsung Electronics Co.,Ltd - 9802D8 - IEEE Registration Authority + E0A8B8 + Le Shi Zhi Xin Electronic Technology (Tianjin) Limited - 64FB81 - IEEE Registration Authority + F45B73 + Wanjiaan Interconnected Technology Co., Ltd - 0821EF - Samsung Electronics Ltd + B88198 + Intel Corporate - 34145F - Samsung Electronics Ltd + B0D7CC + Tridonic GmbH & Co KG - 2C265F - IEEE Registration Authority + 2CDDA3 + Point Grey Research Inc. - D0052A - Arcadyan Corporation + 00809F + ALE International - E4509A - HW Communications Ltd + B824F0 + SOYO Technology Development Co., Ltd. - 702900 - Shenzhen ChipTrip Technology Ltd + D85B2A + Samsung Electronics Co.,Ltd - ECAAA0 - Pegatron Corporation + A009ED + Avaya Inc - 00E0DD - Zenith Electronics Corporation + 0014B4 + General Dynamics United Kingdom Ltd - 50CE75 - Measy Electronics Ltd + A0B437 + GD Mission Systems - 00045B - Techsan Electronics Ltd + E09861 + Motorola Mobility LLC, a Lenovo Company - 0007BA - UTStarcom Inc + 9C8ECD + Amcrest Technologies - 90A210 - United Telecoms Ltd + 48C663 + GTO Access Systems LLC - 6C0B84 - Universal Global Scientific Industrial Ltd + 005F86 + Cisco Systems, Inc - 001597 - Aeta Audio Systems + 381DD9 + FN-LINK TECHNOLOGY LIMITED - 002397 - Westell Technologies Inc. + 00F663 + Cisco Systems, Inc - 60E3AC - LG Electronics (Mobile Communications) + 8C6D50 + SHENZHEN MTC CO LTD - 90F052 - MEIZU Technology Ltd + FC2325 + EosTek (Shenzhen) Co., Ltd. - 001639 - Ubiquam Ltd + FC3D93 + LONGCHEER TELECOMMUNICATION LIMITED - 000C29 - VMware Inc. + 8C59C3 + ADB Italia - 000569 - VMware Inc. + 1CB9C4 + Ruckus Wireless - 000B0E - Trapeze Networks + FCA89A + Sunitec Enterprise Co.,Ltd - 8CFDF0 - Qualcomm Inc. + 1C7B23 + Qingdao Hisense Communications Co.,Ltd. - C4BB4C - Zebra Information Tech Ltd + C83DFC + AlphaTheta Corporation - 98CF53 - BBK Educational Electronics Corp Ltd + CCD31E + IEEE Registration Authority - D4A148 - Huawei Technologies Ltd + 34B354 + HUAWEI TECHNOLOGIES CO.,LTD - D065CA - Huawei Technologies Ltd + C02FF1 + Volta Networks - 486B2C - BBK Educational Electronics Corp Ltd + E8A7F2 + sTraffic - 6C25B9 - BBK Educational Electronics Corp Ltd + 001F20 + Logitech Europe SA - 2C282D - BBK Educational Electronics Corp Ltd + 1C6E76 + Quarion Technology Inc - 4813F3 - BBK Educational Electronics Corp Ltd + 0062EC + Cisco Systems, Inc - 00409F - Telco Systems Inc. + 6C0EE6 + Chengdu Xiyida Electronic Technology Co,.Ltd - 00001F - Telco Systems Inc. + 000763 + Sunniwell Cyber Tech. Co., Ltd. - 00A012 - Telco Systems Inc. + C46AB7 + Xiaomi Communications Co Ltd - 8CEBC6 - Huawei Technologies Ltd + 000AED + HARTING Electronics GmbH - B08900 - Huawei Technologies Ltd + CC167E + Cisco Systems, Inc - 78CB68 - Daehap Hyper-Tech + CC500A + Fiberhome Telecommunication Technologies Co.,LTD - 34ED0B - Shanghai XZ-CoM Ltd + D046DC + Southwest Research Institute - F0DEF1 - Wistron Infocomm (Zhongshan) Corporation + 0CDA41 + Hangzhou H3C Technologies Co., Limited - F80F41 - Wistron Infocomm (Zhongshan) Corporation + 74258A + Hangzhou H3C Technologies Co., Limited - 3C970E - Wistron InfoComm(Kunshan) Ltd + 741F4A + Hangzhou H3C Technologies Co., Limited - 30144A - Wistron Neweb Corporation + 70A2B3 + Apple, Inc. - 4C0BBE - Microsoft Corporation + F40F24 + Apple, Inc. - 0C2576 - Longcheer Telecommunication Limited + 4C57CA + Apple, Inc. - D8D43C - Sony Corporation + 90C1C6 + Apple, Inc. - E4029B - Intel Corporation + 240A11 + TCT mobile ltd - DC1AC5 - Vivo Mobile Communication Ltd + D8E56D + TCT mobile ltd - F45EAB - Texas Instruments + 540593 + WOORI ELEC Co.,Ltd - A8FCB7 - Consolidated Resource Imaging + A0B662 + Acutvista Innovation Co., Ltd. - 00C000 - Lanoptics Ltd + 3497F6 + ASUSTek COMPUTER INC. - 845181 - Samsung Electronics Ltd + 50680A + HUAWEI TECHNOLOGIES CO.,LTD - B0C287 - Technicolor CH USA Inc. + 00A006 + IMAGE DATA PROCESSING SYSTEM GROUP - CC3540 - Technicolor CH USA Inc. + C83F26 + Microsoft Corporation - 8C04FF - Technicolor CH USA Inc. + 000C49 + Dangaard Telecom Denmark A/S - FC94E3 - Technicolor CH USA Inc. + 002238 + LOGIPLUS - B88D12 - Apple + F8DA0C + Hon Hai Precision Ind. Co.,Ltd. - 90EF68 - ZyXEL Communications Corp + 1C1B0D + GIGA-BYTE TECHNOLOGY CO.,LTD. - C816BD - Qingdao Hisense Communications Ltd + 48E9F1 + Apple, Inc. - 00EBD5 - Cisco Systems Inc. + 903809 + Ericsson AB - C48F07 - Shenzhen Yihao Hulian Science and Technology Ltd + A4D8CA + HONG KONG WATER WORLD TECHNOLOGY CO. LIMITED - DC7834 - Logicom SA + 8019FE + JianLing Technology CO., LTD - CCCC81 - Huawei Technologies Ltd + 60B4F7 + Plume Design Inc - 6C9522 - Scalys + 44650D + Amazon Technologies Inc. - B456B9 - Teraspek Technologies Ltd + E42F56 + OptoMET GmbH - 9CDD1F - Intelligent Steward Ltd + 00168F + GN Netcom A/S - 3C6816 - VXi Corporation + 487ADA + Hangzhou H3C Technologies Co., Limited - E811CA - Shandong Kaer Electric Ltd + 1078D2 + Elitegroup Computer Systems Co.,Ltd. - 70288B - Samsung Electronics Ltd + 002197 + Elitegroup Computer Systems Co.,Ltd. - 348A7B - Samsung Electronics Ltd + 001E90 + Elitegroup Computer Systems Co.,Ltd. - D0577B - Intel Corporation + 0022B1 + Elbit Systems Ltd. - 78009E - Samsung Electronics Ltd + 0000B4 + Edimax Technology Co. Ltd. - ACC33A - Samsung Electronics Ltd + A08CFD + Hewlett Packard - 54F201 - Samsung Electronics Ltd + 60B387 + Synergics Technologies GmbH - C4A366 - ZTE Corporation + 001F45 + Enterasys - 6073BC - ZTE Corporation + 000E03 + Emulex Corporation - 7C3548 - Transcend Information + 000D87 + Elitegroup Computer Systems Co.,Ltd. - 18B169 - Sonicwall + FC3F7C + HUAWEI TECHNOLOGIES CO.,LTD - 444450 - OttoQ + 384C4F + HUAWEI TECHNOLOGIES CO.,LTD - 50F5DA - Amazon Technologies Inc. + FC084A + FUJITSU LIMITED - 101212 - Vivo International Corporation Pty Ltd + 00CAE5 + Cisco Systems, Inc - C85B76 - LCFC(HeFei) Electronics Technology Ltd + 004268 + Cisco Systems, Inc - 78FFCA - Tecno Mobile Limited + 40163B + Samsung Electronics Co.,Ltd - 046565 - Testop + 48555F + Fiberhome Telecommunication Technologies Co.,LTD - A8BB50 - WiZ IoT Company Limited + BC9889 + Fiberhome Telecommunication Technologies Co.,LTD - 08C021 - Huawei Technologies Ltd + 04A316 + Texas Instruments - 600810 - Huawei Technologies Ltd + D4F207 + DIAODIAO(Beijing)Technology CO.,Ltd - 48435A - Huawei Technologies Ltd + D4AD2D + Fiberhome Telecommunication Technologies Co.,LTD - 8C8EF2 - Apple + F08CFB + Fiberhome Telecommunication Technologies Co.,LTD - 90B0ED - Apple + 30B49E + TP-LINK TECHNOLOGIES CO.,LTD. - F03EBF - Gogoro Taiwan Limited + 34E70B + HAN Networks Co., Ltd - 3C92DC - Octopod Technology Ltd + 007888 + Cisco Systems, Inc - 1000FD - LaonPeople + 140C5B + PLNetworks - C47C8D + 50FF99 IEEE Registration Authority - 745C9F - TCT mobile Ltd + 84E323 + Green Wave Telecommunication SDN BHD - 8C99E6 - TCT mobile Ltd + 0CBF3F + Shenzhen Lencotion Technology Co.,Ltd - 449F7F - DataCore Software Corporation + 001706 + Techfaithwireless Communication Technology Limited. - 848319 - Hangzhou Zero Zero Technology Ltd + C83870 + Samsung Electronics Co.,Ltd - A81559 - Breathometer Inc. + 1C553A + QianGua Corp. - 70BAEF - Hangzhou H3C Technologies Ltd + 008E73 + Cisco Systems, Inc - 586AB1 - Hangzhou H3C Technologies Ltd + 9C9D5D + Raden Inc - 009006 - Hamamatsu Photonics K.K. + DC4D23 + MRV Comunications - 001AF4 - Handreamnet + 0023B3 + Lyyn AB - 04D3CF - Apple + 405EE1 + Shenzhen H&T Intelligent Control Co.,Ltd. - 4882F2 - Appel Elektronik GmbH + 002578 + JSC Concern Sozvezdie - 7CB0C2 - Intel Corporation + 085BDA + CliniCare LTD - 001793 - Tigi Corporation + 1CC035 + PLANEX COMMUNICATIONS INC. - 000358 - Hanyang Digitech Ltd + 583277 + Reliance Communications LLC - C4CAD9 - Hangzhou H3C Technologies Ltd + 0015C1 + Sony Interactive Entertainment Inc. - 5866BA - Hangzhou H3C Technologies Ltd + 34543C + TAKAOKA TOKO CO.,LTD. - E0C79D - Texas Instruments + 900325 + HUAWEI TECHNOLOGIES CO.,LTD - 4C0B3A - TCT mobile Ltd + 98E7F5 + HUAWEI TECHNOLOGIES CO.,LTD - E42D02 - TCT mobile Ltd + A09D91 + SoundBridge - 0CBD51 - TCT mobile Ltd - - - 4000E0 - Derek(Shaoguan)Limited + 40B688 + LEGIC Identsystems AG - FCBC9C - Vimar Spa + 9CD48B + Innolux Technology Europe BV - 149ECF - Dell Inc. + 90A62F + NAVER - E80959 - Guoguang Electric Ltd + 1C9E46 + Apple, Inc. - D89403 - Hewlett Packard Enterprise + 9C4FDA + Apple, Inc. - E00EDA - Cisco Systems Inc. + 00351A + Cisco Systems, Inc - D0A4B1 - Sonifex Ltd + 00AF1F + Cisco Systems, Inc - F49EEF - Taicang T&W Electronics + C0CCF8 + Apple, Inc. - C4F081 - Huawei Technologies Ltd + 402E28 + MiXTelematics - 801382 - Huawei Technologies Ltd + 6C8FB5 + Microsoft Mobile Oy - 94FE22 - Huawei Technologies Ltd + C4E510 + Mechatro, Inc. - F4CC55 - Juniper Networks + 803896 + SHARP Corporation - 50DD4F - Automation Components Inc. + 8489AD + Apple, Inc. - 341FE4 - ARRIS Group Inc. + 0060EC + HERMARY OPTO ELECTRONICS INC. - 0024F4 - Kaminario Ltd + AC3A7A + Roku, Inc. - 001A29 - Johnson Outdoors Marine Electronics d/b/a Minnkota + B83E59 + Roku, Inc. - 0090AE - ITALTEL S.p.A/RF-UP-I + DC3A5E + Roku, Inc. - 00177D - IDT Technology Limited + 00507F + DrayTek Corp. - 00A045 - PHOENIX CoNTACT Electronics GmbH + 001A73 + Gemtek Technology Co., Ltd. - 002378 - GN Netcom A/S + 00904B + Gemtek Technology Co., Ltd. - 50C971 - GN Netcom A/S + 001A7F + GCI Science & Technology Co.,LTD - F0407B - Fiberhome Telecommunication Technologies Ltd + 0024D4 + FREEBOX SAS - 94885E - Surfilter Network Technology Ltd + ECF35B + Nokia Corporation - C825E1 - Lemobile Information Technology (Beijing) Ltd + 544408 + Nokia Corporation - 945089 - SimonsVoss Technologies GmbH + 3CC243 + Nokia Corporation - 042AE2 - Cisco Systems Inc. + 347E39 + Nokia Danmark A/S - E0B6F5 - IEEE Registration Authority + 00180F + Nokia Danmark A/S - 0090FA - Emulex Corporation + C8979F + Nokia Corporation - 00E0D5 - Emulex Corporation + 0021FC + Nokia Danmark A/S - 001035 - Elitegroup Computer Systems Ltd + 001F5D + Nokia Danmark A/S - 000AE6 - Elitegroup Computer Systems Ltd + 001F01 + Nokia Danmark A/S - 7427EA - Elitegroup Computer Systems Ltd + 001979 + Nokia Danmark A/S - 649968 - Elentec + 0025D0 + Nokia Danmark A/S - 00409C - Transware + 001BEE + Nokia Danmark A/S - B01BD2 - Le Shi Zhi Xin Electronic Technology (Tianjin) Limited + 00175A + Cisco Systems, Inc - 54489C - Cdoubles Electronics Ltd + 0090A2 + CyberTAN Technology Inc. - E4A1E6 - Alcatel-Lucent Shanghai Bell Ltd + 0090D6 + Crystal Group, Inc. - 84002D - Pegatron Corporation + 647791 + Samsung Electronics Co.,Ltd - 408256 - Continental Automotive GmbH + 9CE6E7 + Samsung Electronics Co.,Ltd - 5CC7D7 - Azroad Technology Company Limited + 9C0298 + Samsung Electronics Co.,Ltd - 986B3D - ARRIS Group Inc. + 28987B + Samsung Electronics Co.,Ltd - E0071B - Hewlett Packard Enterprise + 0C715D + Samsung Electronics Co.,Ltd - 1CABC0 - Hitron Technologies Inc. + BCD11F + Samsung Electronics Co.,Ltd - 1C3ADE - Samsung Electronics Ltd + F4428F + Samsung Electronics Co.,Ltd - 002360 - Lookit Technology Ltd + 446D6C + Samsung Electronics Co.,Ltd - 84FEDC - Borqs Beijing Ltd + 00F46F + Samsung Electronics Co.,Ltd - 608334 - Huawei Technologies Ltd + 54FA3E + Samsung Electronics Co.,Ltd - E47E66 - Huawei Technologies Ltd + 0C8910 + Samsung Electronics Co.,Ltd - 94DBDA - Huawei Technologies Ltd + 78ABBB + Samsung Electronics Co.,Ltd - 54D9E4 - Brilliantts Ltd + D476EA + zte corporation - F462D0 - Not for Radio LLC + 001018 + Broadcom - 98DED0 - TP-Link Technologies Ltd + 18C086 + Broadcom - 508965 - Shenzhen Mercury Communication Technologies Ltd + D8C4E9 + Samsung Electronics Co.,Ltd - 005BA1 - shanghai huayuan chuangxin software Ltd + 7C1CF1 + HUAWEI TECHNOLOGIES CO.,LTD - 58D67A - TCPlink + 78F557 + HUAWEI TECHNOLOGIES CO.,LTD - 98072D - Texas Instruments + E02861 + HUAWEI TECHNOLOGIES CO.,LTD - F0C77F - Texas Instruments + D0D04B + HUAWEI TECHNOLOGIES CO.,LTD - 000AC2 - Wuhan FiberHome Digital Technology Ltd + 480031 + HUAWEI TECHNOLOGIES CO.,LTD - 10DA43 - Netgear + C8FF28 + Liteon Technology Corporation - B805AB - ZTE Corporation + 34BB1F + BlackBerry RTS - 789682 - ZTE Corporation + FCB4E6 + ASKEY COMPUTER CORP - D467E7 - Fiberhome Telecommunication Technologies Ltd + 0896D7 + AVM GmbH - E42F26 - Fiberhome Telecommunication Technologies Ltd + 506A03 + NETGEAR - 04C1B9 - Fiberhome Telecommunication Technologies Ltd + 100D7F + NETGEAR - C4BED4 - Avaya Inc + 406F2A + BlackBerry RTS - D017C2 - ASUSTek Computer Inc. + 04E676 + AMPAK Technology, Inc. - 349971 - Quanta Storage Inc. + 0022F4 + AMPAK Technology, Inc. - 9C52F8 - Huawei Technologies Ltd + 001DBA + Sony Corporation - EC13DB - Juniper Networks + 0024BE + Sony Corporation - 5CF286 - IEEE Registration Authority + 000FDE + Sony Corporation - E8FD72 - Shanghai Linguo Technology Ltd + 001B59 + Sony Corporation - 98BB1E - BYD Precision Manufacture Company Ltd + 002298 + Sony Corporation - AC5F3E - Samsung Electro-Mechanics(Thailand) + 2421AB + Sony Corporation - 546D52 - Topview Optronics Corp. + B8F934 + Sony Corporation - 04C103 - Clover Network Inc. + 8C6422 + Sony Corporation - 280C28 - Unigen DataStorage Corporation + 00006E + Artisoft Inc. - A4BF01 - Intel Corporation + 00DA55 + Cisco Systems, Inc - 208B37 - Skyworth Digital Technology(Shenzhen) Ltd + 0004E3 + Accton Technology Corp - 08BE77 - Green Electronics + 0010B5 + Accton Technology Corp - 509EA7 - Samsung Electronics Ltd + 001974 + 16063 - A88195 - Samsung Electronics Ltd + E0B2F1 + FN-LINK TECHNOLOGY LIMITED - 88ADD2 - Samsung Electronics Ltd + 0C4C39 + MitraStar Technology Corp. - 00CCFC - Cisco Systems Inc. + E063E5 + Sony Corporation - 0019C5 + F8D0AC Sony Interactive Entertainment Inc. - 001315 + 0CFE45 Sony Interactive Entertainment Inc. - 1C234F - EDMI Europe Ltd + 2016D8 + Liteon Technology Corporation - A444D1 - Wingtech Group (HongKong)Limited + F0272D + Amazon Technologies Inc. - 006CFD - Sichuan Changhong Electric Ltd + 84D6D0 + Amazon Technologies Inc. - 545AA6 - Espressif Inc. + 00D0C9 + ADVANTECH CO., LTD. - FC1A11 - Vivo Mobile Communication Ltd + 6487D7 + ADB Broadband Italia - 001A57 - Matrix Design Group LLC + 38229D + ADB Broadband Italia - A0C589 - Intel Corporation + A4526F + ADB Broadband Italia - 001E1E - Honeywell Life Safety + 74888B + ADB Broadband Italia - 002340 - MiXTelematics + 008C54 + ADB Broadband Italia - B48B19 - Apple + 00247B + Actiontec Electronics, Inc - 38FDFE - IEEE Registration Authority + E8617E + Liteon Technology Corporation - 2C09CB - Cobs AB + 18CF5E + Liteon Technology Corporation - BCEC5D - Apple + 002243 + AzureWave Technology Inc. - 28A02B - Apple + 18E3BC + TCT mobile ltd - A84481 - Nokia Corporation + CC1FC4 + InVue - 8844F6 - Nokia Corporation + 5C36B8 + TCL King Electrical Appliances (Huizhou) Co., Ltd - F44D17 - Goldcard High-Tech Ltd + 00AA01 + Intel Corporation - 38B8EB - IEEE Registration Authority + 00AA00 + Intel Corporation - 9897D1 - MitraStar Technology Corp. + 00C2C6 + Intel Corporate - B83241 - Wuhan Tianyu Information Industry Ltd + 5CD2E4 + Intel Corporate - 0060DC - NEC Magnus Communications Ltd + 28B2BD + Intel Corporate - 907282 - Sagemcom Broadband SAS + 985FD3 + Microsoft Corporation - 001C35 - Nokia Danmark A/S + 448500 + Intel Corporate - 001C9A - Nokia Danmark A/S + 0CD292 + Intel Corporate - 001CD6 - Nokia Danmark A/S + 685D43 + Intel Corporate - 001CD4 - Nokia Danmark A/S + A0369F + Intel Corporate - 001D98 - Nokia Danmark A/S + 64D4DA + Intel Corporate - 001DE9 - Nokia Danmark A/S + 4025C2 + Intel Corporate - 001E3A - Nokia Danmark A/S + 502DA2 + Intel Corporate - 002548 - Nokia Danmark A/S + 78929C + Intel Corporate - 0022FC - Nokia Danmark A/S + 4C79BA + Intel Corporate - 0022FD - Nokia Danmark A/S + 84A6C8 + Intel Corporate - 0021AA - Nokia Danmark A/S + 5891CF + Intel Corporate - 001D6E - Nokia Danmark A/S + 0C8BFD + Intel Corporate - 0023B4 - Nokia Danmark A/S + 843A4B + Intel Corporate - 001370 - Nokia Danmark A/S + 5C514F + Intel Corporate - 9C1874 - Nokia Danmark A/S + A44E31 + Intel Corporate - 001BAF - Nokia Danmark A/S + DCA971 + Intel Corporate - C8D10B - Nokia Corporation + 58946B + Intel Corporate - 5CC6D0 - Skyworth Digital Technology(Shenzhen) Ltd + 0024D7 + Intel Corporate - 001A9A - Skyworth Digital Technology(Shenzhen) Ltd + 0024D6 + Intel Corporate - CC6DA0 - Roku Inc. + 001DE0 + Intel Corporate - 0016E4 - Vanguard Security Engineering Corp. + A0A8CD + Intel Corporate - 3C8970 - Neosfar + 5CC5D4 + Intel Corporate - 001742 - Fujitsu Limited + 4CEB42 + Intel Corporate - 001999 - Fujitsu Technology Solutions GmbH + F81654 + Intel Corporate - 005A39 - Shenzhen Fast Technologies Ltd + 606C66 + Intel Corporate - A089E4 - Skyworth Digital Technology(Shenzhen) Ltd + 4C8093 + Intel Corporate - 78CA83 - IEEE Registration Authority + AC7289 + Intel Corporate - 0C1167 - Cisco Systems Inc. + 605BB4 + AzureWave Technology Inc. - 74EAE8 - ARRIS Group Inc. + 64D954 + Taicang T&W Electronics - F88E85 - Comtrend Corporation + 001E64 + Intel Corporate - 02CF1C - Communication Machinery Corporation + 00215C + Intel Corporate - 0090F5 - Clevo Co. + 00216B + Intel Corporate - 0030FF - DataFab Systems Inc. + 0022FB + Intel Corporate - 000FF6 - Darfon Lighting Corp + 001517 + Intel Corporate - 002100 - Gemtek Technology Ltd + 247C4C + Herman Miller - 50F520 - Samsung Electronics Ltd + E46F13 + D-Link International - 64B310 - Samsung Electronics Ltd + 1C4419 + TP-LINK TECHNOLOGIES CO.,LTD. - A4EBD3 - Samsung Electronics Ltd + 28FAA0 + vivo Mobile Communication Co., Ltd. - C81073 - Century Opticomm Ltd + ECDF3A + vivo Mobile Communication Co., Ltd. - 343759 - ZTE Corporation + 5C353B + Compal Broadband Networks, Inc. - FC2F40 - Calxeda Inc. + 448723 + HOYA SERVICE CORPORATION - BC620E - Huawei Technologies Ltd + D86C02 + Huaqin Telecom Technology Co.,Ltd - 74A528 - Huawei Technologies Ltd + 60BEB5 + Motorola Mobility LLC, a Lenovo Company - 5CF6DC - Samsung Electronics Ltd + F8F1B6 + Motorola Mobility LLC, a Lenovo Company - 0026E4 - Canal + + 3CFDFE + Intel Corporate - 000117 - Canal + + A4C494 + Intel Corporate - E01D3B - Cambridge Industries(Group) Ltd + 902E1C + Intel Corporate - 70C76F - Inno S + A434D9 + Intel Corporate - 38192F - Nokia Corporation + F4F1E1 + Motorola Mobility LLC, a Lenovo Company - B8C68E - Samsung Electronics Ltd + 9CD917 + Motorola Mobility LLC, a Lenovo Company - 04FE31 - Samsung Electronics Ltd + 9068C3 + Motorola Mobility LLC, a Lenovo Company - 4CBCA5 - Samsung Electronics Ltd + 3C197D + Ericsson AB - D831CF - Samsung Electronics Ltd + 34EF44 + 2Wire Inc - 188331 - Samsung Electronics Ltd + B0E754 + 2Wire Inc - 9C65B0 - Samsung Electronics Ltd + B8E625 + 2Wire Inc - 8455A5 - Samsung Electronics Ltd + 001D5A + 2Wire Inc - A87C01 - Samsung Electronics Ltd + 00253C + 2Wire Inc - B0D09C - Samsung Electronics Ltd + F42981 + vivo Mobile Communication Co., Ltd. - 50C8E5 - Samsung Electronics Ltd + 84F6FA + Miovision Technologies Incorporated - 0020D4 - Cabletron Systems Inc. + F8E71E + Ruckus Wireless - 00E03A - Cabletron Systems Inc. + 001783 + Texas Instruments - 0010E7 - Breezecom Ltd + 34B1F7 + Texas Instruments - 9492BC - Syntech(HK) Technology Limited + 2CFD37 + Blue Calypso, Inc. - 001D19 - Arcadyan Technology Corporation + 0C6127 + Actiontec Electronics, Inc - 0012BF - Arcadyan Technology Corporation + 08863B + Belkin International Inc. - 507E5D - Arcadyan Technology Corporation + 2C56DC + ASUSTek COMPUTER INC. - 7C4FB5 - Arcadyan Technology Corporation + 3CD92B + Hewlett Packard - 00223F - Netgear + 90D7EB + Texas Instruments - 000FB5 - Netgear + 78DEE4 + Texas Instruments - 00095B - Netgear + 001833 + Texas Instruments - 001A4F - AVM GmbH + 001834 + Texas Instruments - 001C4A - AVM GmbH + 0017E3 + Texas Instruments - 00150C - AVM GmbH + 001830 + Texas Instruments - 0026FF - BlackBerry RTS + 0023D4 + Texas Instruments - A4E4B8 - BlackBerry RTS + C0E422 + Texas Instruments - 003067 - BIOSTAR Microtech Int'l Corp. + D00790 + Texas Instruments - F40B93 - BlackBerry RTS + 3C7DB1 + Texas Instruments - 1C69A5 - BlackBerry RTS + 00F871 + Demant A/S - 94EBCD - BlackBerry RTS + 002191 + D-Link Corporation - 28C68E - Netgear + F4FC32 + Texas Instruments - 04A151 - Netgear + 2435CC + Zhongshan Scinan Internet of Things Co.,Ltd. - F87394 - Netgear + BC4434 + Shenzhen TINNO Mobile Technology Corp. - 204E7F - Netgear + 04BF6D + Zyxel Communications Corporation - C03F0E - Netgear + CC46D6 + Cisco Systems, Inc - 0026F2 - Netgear + 0041D2 + Cisco Systems, Inc - 00138F - Asiarock Technology Limited + 0CD746 + Apple, Inc. - 803773 - Netgear + 60A37D + Apple, Inc. - A42B8C - Netgear + 68DBCA + Apple, Inc. - CC7D37 - ARRIS Group Inc. + 086698 + Apple, Inc. - A47AA4 - ARRIS Group Inc. + BC5436 + Apple, Inc. - 001700 - ARRIS Group Inc. + 044BED + Apple, Inc. - 0016B5 - ARRIS Group Inc. + 6C8DC1 + Apple, Inc. - 0015A8 - ARRIS Group Inc. + ACF1DF + D-Link International - 00159A - ARRIS Group Inc. + BCF685 + D-Link International - 001180 - ARRIS Group Inc. + 78542E + D-Link International - 000B06 - ARRIS Group Inc. + C4A81D + D-Link International - 00D088 - ARRIS Group Inc. + F88FCA + Google, Inc. - 00128A - ARRIS Group Inc. + 2CAB00 + HUAWEI TECHNOLOGIES CO.,LTD - 002375 - ARRIS Group Inc. + A8CA7B + HUAWEI TECHNOLOGIES CO.,LTD - 0023A3 - ARRIS Group Inc. + 88B8D0 + Dongguan Koppo Electronic Co.,Ltd - 001ADB - ARRIS Group Inc. + 58AC78 + Cisco Systems, Inc - 001F7E - ARRIS Group Inc. + FCFFAA + IEEE Registration Authority - 0011AE - ARRIS Group Inc. + 3898D8 + MERITECH CO.,LTD - 94CCB9 - ARRIS Group Inc. + 9486CD + SEOUL ELECTRONICS&TELECOM - 3C438E - ARRIS Group Inc. + 84ACFB + Crouzet Automatismes - 0024C1 - ARRIS Group Inc. + 7CBB8A + Nintendo Co., Ltd. - 0025F2 - ARRIS Group Inc. + 3897D6 + Hangzhou H3C Technologies Co., Limited - 0025F1 - ARRIS Group Inc. + 1CA770 + SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD - 001404 - ARRIS Group Inc. + 8896B6 + Global Fire Equipment S.A. - 001AAD - ARRIS Group Inc. + 000D0B + BUFFALO.INC - 0026BA - ARRIS Group Inc. + 001D73 + BUFFALO.INC - 00230B - ARRIS Group Inc. + 001601 + BUFFALO.INC - 74E7C6 - ARRIS Group Inc. + 7403BD + BUFFALO.INC - 001C12 - ARRIS Group Inc. + B8FC9A + Le Shi Zhi Xin Electronic Technology (Tianjin) Limited - 5C338E - Alpha Networks Inc. + CC3E5F + Hewlett Packard - 000941 - Allied Telesis R&D Center K.K. + D89D67 + Hewlett Packard - 28E347 - Liteon Technology Corporation + A45D36 + Hewlett Packard - 446D57 - Liteon Technology Corporation + F0921C + Hewlett Packard - 9CB70D - Liteon Technology Corporation + A0481C + Hewlett Packard - 68A3C4 - Liteon Technology Corporation + A01D48 + Hewlett Packard - 70F1A1 - Liteon Technology Corporation + 000423 + Intel Corporation - 00D9D1 - Sony Interactive Entertainment Inc. + 001111 + Intel Corporation - B00594 - Liteon Technology Corporation + 001302 + Intel Corporate - EC086B - TP-Link Technologies Ltd + 40A8F0 + Hewlett Packard - 94A1A2 - AMPAK Technology Inc. + 8851FB + Hewlett Packard - 00014A - Sony Corporation + 082E5F + Hewlett Packard - 983B16 - AMPAK Technology Inc. + E4115B + Hewlett Packard - 409558 - Aisino Corporation + 28924A + Hewlett Packard - 182861 - AirTies Wireless Networks + 0014C2 + Hewlett Packard - 6C71D9 - Azurewave Technologies Inc. + 00805F + Hewlett Packard - D0E782 - Azurewave Technologies Inc. + 288023 + Hewlett Packard - 6CADF8 - Azurewave Technologies Inc. + 780AC7 + Baofeng TV Co., Ltd. - A81D16 - Azurewave Technologies Inc. + 0018FE + Hewlett Packard - 34C3D2 - FN-Link Technology Limited + 001A4B + Hewlett Packard - 54F6C5 - Fujian Star-NET Communication Ltd + 002481 + Hewlett Packard - D0D412 - ADB Broadband Italia + 000F61 + Hewlett Packard - 0026B8 - Actiontec Electronics Inc. + 8CAB8E + Shanghai Feixun Communication Co.,Ltd. - 0026FC - AcSiP Technology Corp. + 9060F1 + Apple, Inc. - 0015AF - Azurewave Technologies Inc. + A4516F + Microsoft Mobile Oy - 74F06D - Azurewave Technologies Inc. + FC64BA + Xiaomi Communications Co Ltd - 44D832 - Azurewave Technologies Inc. + D40B1A + HTC Corporation - E0B9A5 - Azurewave Technologies Inc. + 945330 + Hon Hai Precision Ind. Co.,Ltd. - 781881 - Azurewave Technologies Inc. + 4CD08A + HUMAX Co., Ltd. - B046FC - MitraStar Technology Corp. + CC4EEC + HUMAX Co., Ltd. - E04136 - MitraStar Technology Corp. + 403DEC + HUMAX Co., Ltd. - 001CA2 - ADB Broadband Italia + EC4D47 + HUAWEI TECHNOLOGIES CO.,LTD - 002233 - ADB Broadband Italia + C44044 + RackTop Systems Inc. - 3039F2 - ADB Broadband Italia + 4CA161 + Rain Bird Corporation - 0017C2 - ADB Broadband Italia + A08D16 + HUAWEI TECHNOLOGIES CO.,LTD - 689C5E - AcSiP Technology Corp. + 00242B + Hon Hai Precision Ind. Co.,Ltd. - 9C0E4A - Shenzhen Vastking Electronic Ltd + F8D111 + TP-LINK TECHNOLOGIES CO.,LTD. - A85840 - Cambridge Industries(Group) Ltd + B0487A + TP-LINK TECHNOLOGIES CO.,LTD. - A0D37A - Intel Corporation + 940C6D + TP-LINK TECHNOLOGIES CO.,LTD. - 8896F2 - Valeo Schalter und Sensoren GmbH + 542758 + Motorola (Wuhan) Mobility Technologies Communication Co., Ltd. - 001073 - Technobox Inc. + 480FCF + Hewlett Packard - 20934D - Fujian Star-NET Communication Ltd + 000480 + Brocade Communications Systems LLC - 009027 - Intel Corporation + 000CDB + Brocade Communications Systems LLC - C48508 - Intel Corporation + 001BED + Brocade Communications Systems LLC - 6805CA - Intel Corporation + 000533 + Brocade Communications Systems LLC - 247703 - Intel Corporation + 006069 + Brocade Communications Systems LLC - 74E50B - Intel Corporation + 0060DF + Brocade Communications Systems LLC - B80305 - Intel Corporation + 000088 + Brocade Communications Systems LLC - 00A0C9 - Intel Corporation + 2C088C + HUMAX Co., Ltd. - 141877 - Dell Inc. + 1C994C + Murata Manufacturing Co., Ltd. - E09796 - Huawei Technologies Ltd + F02765 + Murata Manufacturing Co., Ltd. - 1C4024 - Dell Inc. + 5CF8A1 + Murata Manufacturing Co., Ltd. - 18FB7B - Dell Inc. + 44A7CF + Murata Manufacturing Co., Ltd. - F8B156 - Dell Inc. + 0013E0 + Murata Manufacturing Co., Ltd. - 141AA3 - Motorola Mobility LLC, a Lenovo Company + 08181A + zte corporation - 3407FB - Ericsson AB + 001E73 + zte corporation - A4A1C2 - Ericsson AB + 0015EB + zte corporation - 00065B - Dell Inc. + 001C25 + Hon Hai Precision Ind. Co.,Ltd. - 842B2B - Dell Inc. + 00197E + Hon Hai Precision Ind. Co.,Ltd. - F04DA2 - Dell Inc. + 90FBA6 + Hon Hai Precision Ind. Co.,Ltd. - E0DB55 - Dell Inc. + 4437E6 + Hon Hai Precision Ind. Co.,Ltd. - 000F1F - Dell Inc. + CCAF78 + Hon Hai Precision Ind. Co.,Ltd. - 24B6FD - Dell Inc. + F4B7E2 + Hon Hai Precision Ind. Co.,Ltd. - 74E6E2 - Dell Inc. + 785968 + Hon Hai Precision Ind. Co.,Ltd. - 34E6D7 - Dell Inc. + 647002 + TP-LINK TECHNOLOGIES CO.,LTD. - 001EC9 - Dell Inc. + 10FEED + TP-LINK TECHNOLOGIES CO.,LTD. - 002170 - Dell Inc. + 645601 + TP-LINK TECHNOLOGIES CO.,LTD. - 00219B - Dell Inc. + ECCB30 + HUAWEI TECHNOLOGIES CO.,LTD - B8AC6F - Dell Inc. + F4DCF9 + HUAWEI TECHNOLOGIES CO.,LTD - 8CA982 - Intel Corporation + EC26CA + TP-LINK TECHNOLOGIES CO.,LTD. - BC7737 - Intel Corporation + 9471AC + TCT mobile ltd - 1430C6 - Motorola Mobility LLC, a Lenovo Company + 00664B + HUAWEI TECHNOLOGIES CO.,LTD - D8FC93 - Intel Corporation + 9CC172 + HUAWEI TECHNOLOGIES CO.,LTD - D4AE52 - Dell Inc. + 247F3C + HUAWEI TECHNOLOGIES CO.,LTD - 28162E - 2Wire Inc. + C8D15E + HUAWEI TECHNOLOGIES CO.,LTD - F81897 - 2Wire Inc. + F4559C + HUAWEI TECHNOLOGIES CO.,LTD - 94C150 - 2Wire Inc. + 80B686 + HUAWEI TECHNOLOGIES CO.,LTD - 5CF821 - Texas Instruments + 10C61F + HUAWEI TECHNOLOGIES CO.,LTD - 88074B - LG Electronics (Mobile Communications) + CC96A0 + HUAWEI TECHNOLOGIES CO.,LTD - 000D72 - 2Wire Inc. + 581F28 + HUAWEI TECHNOLOGIES CO.,LTD - 001288 - 2Wire Inc. + C07009 + HUAWEI TECHNOLOGIES CO.,LTD - 00789E - Sagemcom Broadband SAS + 8038BC + HUAWEI TECHNOLOGIES CO.,LTD - E8BE81 - Sagemcom Broadband SAS + C4072F + HUAWEI TECHNOLOGIES CO.,LTD - 681590 - Sagemcom Broadband SAS + F48E92 + HUAWEI TECHNOLOGIES CO.,LTD - F4EB38 - Sagemcom Broadband SAS + 241FA0 + HUAWEI TECHNOLOGIES CO.,LTD - 001BBF - Sagemcom Broadband SAS + 7054F5 + HUAWEI TECHNOLOGIES CO.,LTD - 002569 - Sagemcom Broadband SAS + 9017AC + HUAWEI TECHNOLOGIES CO.,LTD - 141FBA - IEEE Registration Authority + 18C58A + HUAWEI TECHNOLOGIES CO.,LTD - 807B85 - IEEE Registration Authority + 34CDBE + HUAWEI TECHNOLOGIES CO.,LTD - CC1BE0 - IEEE Registration Authority + D8490B + HUAWEI TECHNOLOGIES CO.,LTD - F40E11 - IEEE Registration Authority + C057BC + Avaya Inc - 10F681 - Vivo Mobile Communication Ltd + 64A7DD + Avaya Inc - 00217C - 2Wire Inc. + A4251B + Avaya Inc - 001FB3 - 2Wire Inc. + 646A52 + Avaya Inc - 002275 - Belkin International Inc. + F80113 + HUAWEI TECHNOLOGIES CO.,LTD - 0057D2 - Cisco Systems Inc. + A49947 + HUAWEI TECHNOLOGIES CO.,LTD - 3C6716 - Lily Robotics + 308730 + HUAWEI TECHNOLOGIES CO.,LTD - 00D0BD - Lattice Semiconductor Corp. (LPA) + 44322A + Avaya Inc - 001F3A - Hon Hai Precision Ind Ltd + 7038EE + Avaya Inc - C8A030 - Texas Instruments + 703018 + Avaya Inc - 78C5E5 - Texas Instruments + 9C28EF + HUAWEI TECHNOLOGIES CO.,LTD - 0CFD37 - SUSE Linux GmbH + 006083 + Cisco Systems, Inc - 2C228B - CTR SRL + 006009 + Cisco Systems, Inc - 0C6F9C - Shaw Communications Inc. + 00067C + Cisco Systems, Inc - 0017E4 - Texas Instruments + 00E0F7 + Cisco Systems, Inc - 04E451 - Texas Instruments + 005073 + Cisco Systems, Inc - 505663 - Texas Instruments + 00900C + Cisco Systems, Inc - 883314 - Texas Instruments + 00905F + Cisco Systems, Inc - 647BD4 - Texas Instruments + 00100B + Cisco Systems, Inc - D8952F - Texas Instruments + 00173B + Cisco Systems, Inc - B8FFFE - Texas Instruments + F0B429 + Xiaomi Communications Co Ltd - 2CE412 - Sagemcom Broadband SAS + 00107B + Cisco Systems, Inc - 44C15C + 0050E2 + Cisco Systems, Inc + + + 080028 Texas Instruments - 0022A5 + 405FC2 Texas Instruments - E043DB - Shenzhen ViewAt Technology Ltd + 20CD39 + Texas Instruments - 3CCF5B - Icomm HK Limited + B4994C + Texas Instruments - 2405F5 - Integrated Device Technology (Malaysia) Sdn. Bhd. + E4D3F1 + Cisco Systems, Inc - 3C3556 - Cognitec Systems GmbH + 8478AC + Cisco Systems, Inc - 3C9066 - SmartRG Inc. + 04DAD2 + Cisco Systems, Inc - 000D88 - D-Link Corporation + F02929 + Cisco Systems, Inc - 001195 - D-Link Corporation + 20BBC0 + Cisco Systems, Inc - 001346 - D-Link Corporation + 4C4E35 + Cisco Systems, Inc - 78E3B5 - Hewlett-Packard Company + 68DFDD + Xiaomi Communications Co Ltd - 78ACC0 - Hewlett-Packard Company + 98FAE3 + Xiaomi Communications Co Ltd - 68B599 - Hewlett-Packard Company + 0090A6 + Cisco Systems, Inc - 1CC1DE - Hewlett-Packard Company + 009086 + Cisco Systems, Inc - B8A386 - D-Link International + 005080 + Cisco Systems, Inc - 1C7EE5 - D-Link International + EC24B8 + Texas Instruments - 1CBDB9 - D-Link International + 7CEC79 + Texas Instruments - 00142F - Savvius + 689E19 + Texas Instruments - 28BC18 - SourcingOverseas Ltd + E0E5CF + Texas Instruments - 94ABDE - OMX Technology - FZE + 001BD7 + Cisco SPVTG - 9CDFB1 - Shenzhen Crave Communication Ltd + 00248C + ASUSTek COMPUTER INC. - ACCF85 - Huawei Technologies Ltd + 002354 + ASUSTek COMPUTER INC. - 3871DE - Apple + 1C872C + ASUSTek COMPUTER INC. - 7081EB - Apple + 60182E + ShenZhen Protruly Electronic Ltd co. - 00738D - Shenzhen TINNO Mobile Technology Corp. + C4143C + Cisco Systems, Inc - 34BA75 - Everest Networks Inc. + 3C08F6 + Cisco Systems, Inc - 7C18CD - E-TRON Ltd + 78BAF9 + Cisco Systems, Inc - 00E0FC - Huawei Technologies Ltd + 0022CE + Cisco SPVTG - 6416F0 - Huawei Technologies Ltd + 000F66 + Cisco-Linksys, LLC - F40304 - Google Inc. + 001E8C + ASUSTek COMPUTER INC. - 546009 - Google Inc. + 0013D4 + ASUSTek COMPUTER INC. - A47733 - Google Inc. + 20CF30 + ASUSTek COMPUTER INC. - 807ABF - HTC Corporation + 501CBF + Cisco Systems, Inc - 78F882 - LG Electronics (Mobile Communications) + B000B4 + Cisco Systems, Inc - C02C7A - Shenzhen Horn Audio Ltd + 544A00 + Cisco Systems, Inc - 1CCB99 - TCT mobile Ltd + 00E16D + Cisco Systems, Inc - A42BB0 - TP-Link Technologies Ltd + BC1665 + Cisco Systems, Inc - 188B45 - Cisco Systems Inc. + F872EA + Cisco Systems, Inc - 606944 - Apple + D0C789 + Cisco Systems, Inc - B0C69A - Juniper Networks + F84F57 + Cisco Systems, Inc - 2C6BF5 - Juniper Networks + 7C69F6 + Cisco Systems, Inc - C42F90 - Hangzhou Hikvision Digital Technology Ltd + 78DA6E + Cisco Systems, Inc - F4CA24 - FreeBit Ltd + E0D173 + Cisco Systems, Inc - 00D0B7 - Intel Corporation + E0899D + Cisco Systems, Inc - 001DD6 - ARRIS Group Inc. + C47295 + Cisco Systems, Inc - 903EAB - ARRIS Group Inc. + 24374C + Cisco SPVTG - 306023 - ARRIS Group Inc. + F45FD4 + Cisco SPVTG - 14ABF0 - ARRIS Group Inc. + 2CABA4 + Cisco SPVTG - 0014F6 - Juniper Networks + 1C6E4C + Logistic Service & Engineering Co.,Ltd - 901ACA - ARRIS Group Inc. + B8782E + Apple, Inc. - C83FB4 - ARRIS Group Inc. + 000502 + Apple, Inc. - E0B70A - ARRIS Group Inc. + 34BDC8 + Cisco Systems, Inc - 001DCE - ARRIS Group Inc. + DCEB94 + Cisco Systems, Inc - 0013E8 - Intel Corporation + 84B517 + Cisco Systems, Inc - 0013CE - Intel Corporation + 188B9D + Cisco Systems, Inc - 2C768A - Hewlett-Packard Company + E4AA5D + Cisco Systems, Inc - C8348E - Intel Corporation + 9803D8 + Apple, Inc. - 4C3488 - Intel Corporation + D89E3F + Apple, Inc. - 1002B5 - Intel Corporation + B8C75D + Apple, Inc. - 004026 - Buffalo Inc. + 0C74C2 + Apple, Inc. - 4CE676 - Buffalo Inc. + 90840D + Apple, Inc. - 000BCD - Hewlett-Packard Company + E80688 + Apple, Inc. - 000F20 - Hewlett-Packard Company + 7CC537 + Apple, Inc. - 00110A - Hewlett-Packard Company + 78CA39 + Apple, Inc. - B8B81E - Intel Corporation + 18E7F4 + Apple, Inc. - B46D83 - Intel Corporation + 70CD60 + Apple, Inc. - 000E35 - Intel Corporation + 8C7B9D + Apple, Inc. - 0007E9 - Intel Corporation + 002241 + Apple, Inc. - 001708 - Hewlett-Packard Company + 00264A + Apple, Inc. - 0017A4 - Hewlett-Packard Company + 041E64 + Apple, Inc. - C005C2 - ARRIS Group Inc. + 000A95 + Apple, Inc. - 0030C1 - Hewlett-Packard Company + 001124 + Apple, Inc. - 0080A0 - Hewlett-Packard Company + CC785F + Apple, Inc. - D48564 - Hewlett-Packard Company + 88CB87 + Apple, Inc. - 24BE05 - Hewlett-Packard Company + 685B35 + Apple, Inc. - FC3FDB - Hewlett-Packard Company + 2CB43A + Apple, Inc. - 308D99 - Hewlett-Packard Company + 689C70 + Apple, Inc. - 5820B1 - Hewlett-Packard Company + 380F4A + Apple, Inc. - 9457A5 - Hewlett-Packard Company + 444C0C + Apple, Inc. - 000EB3 - Hewlett-Packard Company + B4F0AB + Apple, Inc. - 080009 - Hewlett-Packard Company + 80929F + Apple, Inc. - 90CDB6 - Hon Hai Precision Ind Ltd + 9C04EB + Apple, Inc. - 40490F - Hon Hai Precision Ind Ltd + 5C969D + Apple, Inc. - 00265C - Hon Hai Precision Ind Ltd + 3010E4 + Apple, Inc. - 002269 - Hon Hai Precision Ind Ltd + A886DD + Apple, Inc. - D87988 - Hon Hai Precision Ind Ltd + F0C1F1 + Apple, Inc. - 74A78E - ZTE Corporation + 843835 + Apple, Inc. - 00092D - HTC Corporation + 8C006D + Apple, Inc. - 443192 - Hewlett-Packard Company + 5C95AE + Apple, Inc. - A0D3C1 - Hewlett-Packard Company + 842999 + Apple, Inc. - 38EAA7 - Hewlett-Packard Company + 74E2F5 + Apple, Inc. - AC162D - Hewlett-Packard Company + E0C97A + Apple, Inc. - 80C16E - Hewlett-Packard Company + A8968A + Apple, Inc. - B4B52F - Hewlett-Packard Company + F41BA1 + Apple, Inc. - D07E28 - Hewlett-Packard Company + 041552 + Apple, Inc. - D0BF9C - Hewlett-Packard Company + 68A86D + Apple, Inc. - 7C6193 - HTC Corporation + 7CC3A1 + Apple, Inc. - 90E7C4 - HTC Corporation + 7073CB + Apple, Inc. - BCEAFA - Hewlett-Packard Company + 907240 + Apple, Inc. - 7446A0 - Hewlett-Packard Company + F82793 + Apple, Inc. - 2C44FD - Hewlett-Packard Company + 403004 + Apple, Inc. - 0453D5 - Sysorex Global Holdings + 60C547 + Apple, Inc. - EC52DC - WORLD MEDIA AND TECHNOLOGY Corp. + EC852F + Apple, Inc. - 94B2CC - Pioneer Corporation + 00F4B9 + Apple, Inc. - 0452F3 - Apple + 3CAB8E + Apple, Inc. - 88C255 - Texas Instruments + 609217 + Apple, Inc. - CC78AB - Texas Instruments + 84B153 + Apple, Inc. - 1C7839 - Shenzhen Tencent Computer System Ltd + E06678 + Apple, Inc. - FCD733 - TP-Link Technologies Ltd + 48D705 + Apple, Inc. - 5C899A - TP-Link Technologies Ltd + 68D93C + Apple, Inc. - A81B5A - Guangdong Oppo Mobile Telecommunications Corp Ltd + 00F76F + Apple, Inc. - 2C5BB8 - Guangdong Oppo Mobile Telecommunications Corp Ltd + C88550 + Apple, Inc. - 08EB74 - HUMAX Ltd + E0B52D + Apple, Inc. - E005C5 - TP-Link Technologies Ltd + A43135 + Apple, Inc. - 388345 - TP-Link Technologies Ltd + 7014A6 + Apple, Inc. - EC888F - TP-Link Technologies Ltd + 985AEB + Apple, Inc. - 6466B3 - TP-Link Technologies Ltd + 78D75F + Apple, Inc. - 2832C5 - HUMAX Ltd + 4C7C5F + Apple, Inc. - F0F336 - TP-Link Technologies Ltd + 68644B + Apple, Inc. - BC4699 - TP-Link Technologies Ltd + C81EE7 + Apple, Inc. - F483CD - TP-Link Technologies Ltd + 6C94F8 + Apple, Inc. - 002127 - TP-Link Technologies Ltd + 908D6C + Apple, Inc. - 5C63BF - TP-Link Technologies Ltd + B8098A + Apple, Inc. - 142D27 - Hon Hai Precision Ind Ltd + C0CECD + Apple, Inc. - 88E3AB - Huawei Technologies Ltd + 60D9C7 + Apple, Inc. - C40528 - Huawei Technologies Ltd + F44B2A + Cisco SPVTG - 3CDFBD - Huawei Technologies Ltd + C4ADF1 + GOPEACE Inc. - 509F27 - Huawei Technologies Ltd + 58FC73 + Arria Live Media, Inc. - 80717A - Huawei Technologies Ltd + 0C1A10 + Acoustic Stream - 0021E8 - Murata Manufacturing Ltd + E81363 + Comstock RD, Inc. - 000E6D - Murata Manufacturing Ltd + 741865 + Shanghai DareGlobal Technologies Co.,Ltd - 902106 - BSkyB Ltd + A4B805 + Apple, Inc. - D02788 - Hon Hai Precision Ind Ltd + 90C99B + Tesorion Nederland B.V. - 904CE5 - Hon Hai Precision Ind Ltd + 5CADCF + Apple, Inc. - 001FE2 - Hon Hai Precision Ind Ltd + BC6C21 + Apple, Inc. - 0016CF - Hon Hai Precision Ind Ltd + C4EF70 + Home Skinovations - 2002AF - Murata Manufacturing Ltd + 746F19 + ICARVISIONS (SHENZHEN) TECHNOLOGY CO., LTD. - 98F537 - ZTE Corporation + 7C5A67 + JNC Systems, Inc. - 5C4CA9 - Huawei Technologies Ltd + 5CE3B6 + Fiberhome Telecommunication Technologies Co.,LTD - F4C714 - Huawei Technologies Ltd + A0F9E0 + VIVATEL COMPANY LIMITED - 286ED4 - Huawei Technologies Ltd + 2CAE2B + Samsung Electronics Co.,Ltd - 001E10 - Huawei Technologies Ltd + C869CD + Apple, Inc. - D47856 - Avaya Inc + F8C372 + TSUZUKI DENKI - D842AC - Shanghai Feixun Communication Ltd + D47208 + Bragi GmbH - 5439DF - Huawei Technologies Ltd + A4A6A9 + Private - 283CE4 - Huawei Technologies Ltd + F898B9 + HUAWEI TECHNOLOGIES CO.,LTD - 2CF4C5 - Avaya Inc + 5CB559 + CNEX Labs - 3C3A73 - Avaya Inc + B83A9D + Alarm.com - FC8399 - Avaya Inc + F40E22 + Samsung Electronics Co.,Ltd - 587F66 - Huawei Technologies Ltd + C01173 + Samsung Electronics Co.,Ltd - 64A651 - Huawei Technologies Ltd + 7853F2 + Roxton Systems Ltd. - 086361 - Huawei Technologies Ltd + 6CEBB2 + Dongguan Sen DongLv Electronics Co.,Ltd - A01290 - Avaya Inc + 6858C5 + ZF TRW Automotive - 38BB3C - Avaya Inc + BCE63F + Samsung Electronics Co.,Ltd - F873A2 - Avaya Inc + 7C9122 + Samsung Electronics Co.,Ltd - CCF954 - Avaya Inc + ACBC32 + Apple, Inc. - 8C34FD - Huawei Technologies Ltd + 544E90 + Apple, Inc. - ACF7F3 - Xiaomi Communications Ltd + 881B99 + SHENZHEN XIN FEI JIA ELECTRONIC CO. LTD. - D4970B - Xiaomi Communications Ltd + 080A4E + Planet Bingo® — 3rd Rock Gaming® - 8CBEBE - Xiaomi Communications Ltd + B49D0B + BQ - 14F65A - Xiaomi Communications Ltd + 3C8CF8 + TRENDnet, Inc. - 009EC8 - Xiaomi Communications Ltd + A87285 + IDT, INC. - 0C1DAF - Xiaomi Communications Ltd + 044169 + GoPro - 0819A6 - Huawei Technologies Ltd + C02DEE + Cuff - 3CF808 - Huawei Technologies Ltd + 9023EC + Availink, Inc. - 486276 - Huawei Technologies Ltd + 441CA8 + Hon Hai Precision Ind. Co.,Ltd. - B41513 - Huawei Technologies Ltd + 340CED + Moduel AB - AC4E91 - Huawei Technologies Ltd + 9CA69D + Whaley Technology Co.Ltd - 283152 - Huawei Technologies Ltd + 5853C0 + Beijing Guang Runtong Technology Development Company co.,Ltd - 3480B3 - Xiaomi Communications Ltd + 247260 + IOTTECH Corp - F48B32 - Xiaomi Communications Ltd + E8F2E2 + LG Innotek - 009021 - Cisco Systems Inc. + 2CA539 + Parallel Wireless, Inc - 0090B1 - Cisco Systems Inc. + 245BF0 + Liteon, Inc. - 001AB6 - Texas Instruments + CC794A + BLU Products Inc. - 0012D1 - Texas Instruments + B4293D + Shenzhen Urovo Technology Co.,Ltd. - 001237 - Texas Instruments + 54FF82 + Davit Solution co. - A0E6F8 - Texas Instruments + 2827BF + Samsung Electronics Co.,Ltd - 70FF76 - Texas Instruments + F4E926 + Tianjin Zanpu Technology Inc. - D03972 - Texas Instruments + 98CB27 + Galore Networks Pvt. Ltd. - 5C313E - Texas Instruments + 94D859 + TCT mobile ltd - F4B85E - Texas Instruments + 2CFCE4 + CTEK Sweden AB - 68C90B - Texas Instruments + E855B4 + SAI Technology Inc. - 74882A - Huawei Technologies Ltd + 50DF95 + Lytx - 4CB16C - Huawei Technologies Ltd + 300C23 + zte corporation - 04BD70 - Huawei Technologies Ltd + C47D46 + FUJITSU LIMITED - D4F513 - Texas Instruments + C0B713 + Beijing Xiaoyuer Technology Co. Ltd. - 507224 - Texas Instruments + 188EF9 + G2C Co. Ltd. - 0090D9 - Cisco Systems Inc. + F4B8A7 + zte corporation - 009092 - Cisco Systems Inc. + 20635F + Abeeway - 00102F - Cisco Systems Inc. + 083A5C + Junilab, Inc. - 00100D - Cisco Systems Inc. + 6CE01E + Modcam AB - 001007 - Cisco Systems Inc. + 74852A + PEGATRON CORPORATION - 001014 - Cisco Systems Inc. + 4CEEB0 + SHC Netzwerktechnik GmbH - 0090BF - Cisco Systems Inc. + 800184 + HTC Corporation - 0050D1 - Cisco Systems Inc. + B8B3DC + DEREK (SHAOGUAN) LIMITED - 1CE6C7 - Cisco Systems Inc. + 702A7D + EpSpot AB - CCD539 - Cisco Systems Inc. + 4CAE31 + ShengHai Electronics (Shenzhen) Ltd - 4C0082 - Cisco Systems Inc. + F4E9D4 + QLogic Corporation - 7C95F3 - Cisco Systems Inc. + 44F436 + zte corporation - 34DBFD - Cisco Systems Inc. + 44C69B + Wuhan Feng Tian Information Network CO.,LTD - 885A92 - Cisco Systems Inc. + 4CB76D + Novi Security - 00400B - Cisco Systems Inc. + 185D9A + BobjGear LLC - 006070 - Cisco Systems Inc. + C02567 + Nexxt Solutions - 500604 - Cisco Systems Inc. + FCE33C + HUAWEI TECHNOLOGIES CO.,LTD - 00E01E - Cisco Systems Inc. + 9CB6D0 + Rivet Networks - 00112F - ASUSTek Computer Inc. + 40B89A + Hon Hai Precision Ind. Co.,Ltd. - 001BFC - ASUSTek Computer Inc. + 1CB72C + ASUSTek COMPUTER INC. - A0554F - Cisco Systems Inc. + 40B837 + Sony Corporation - 204C9E - Cisco Systems Inc. + 609C9F + Brocade Communications Systems LLC - 84B802 - Cisco Systems Inc. + A8827F + CIBN Oriental Network(Beijing) CO.,Ltd - B0AA77 - Cisco Systems Inc. + D048F3 + DATTUS Inc - BCC493 - Cisco Systems Inc. + B008BF + Vital Connect, Inc. - A46C2A - Cisco Systems Inc. + E076D0 + AMPAK Technology, Inc. - D0A5A6 - Cisco Systems Inc. + D4522A + TangoWiFi.com - 3C5EC3 - Cisco Systems Inc. + B8C3BF + Henan Chengshi NetWork Technology Co.,Ltd - 64F69D - Cisco Systems Inc. + 44962B + Aidon Oy - 000389 - Plantronics Inc. + E807BF + SHENZHEN BOOMTECH INDUSTRY CO.,LTD - D072DC - Cisco Systems Inc. + 84F129 + Metrascale Inc. - 28C7CE - Cisco Systems Inc. + B89ACD + ELITE OPTOELECTRONIC(ASIA)CO.,LTD - F40F1B - Cisco Systems Inc. + F01E34 + ORICO Technologies Co., Ltd - F8C288 - Cisco Systems Inc. + DCE026 + Patrol Tag, Inc - 1C6A7A - Cisco Systems Inc. + B40566 + SP Best Corporation Co., LTD. - 001EE5 - Cisco-Linksys LLC + 1CC72D + Shenzhen Huapu Digital CO.,Ltd - 484487 - Cisco SPVTG + 8CBFA6 + Samsung Electronics Co.,Ltd - 38C85C - Cisco SPVTG + 086266 + ASUSTek COMPUTER INC. - 485B39 - ASUSTek Computer Inc. + 9C3066 + RWE Effizienz GmbH - BCAEC5 - ASUSTek Computer Inc. + 700136 + FATEK Automation Corporation - 10BF48 - ASUSTek Computer Inc. + FCA22A + PT. Callysta Multi Engineering - 5067AE - Cisco Systems Inc. + A45602 + fenglian Technology Co.,Ltd. - F09E63 - Cisco Systems Inc. + C8C50E + Shenzhen Primestone Network Technologies.Co., Ltd. - 6C9989 - Cisco Systems Inc. + D06A1F + BSE CO.,LTD. - 18E728 - Cisco Systems Inc. + 18BDAD + L-TECH CORPORATION - 001217 - Cisco-Linksys LLC + 60E6BC + Sino-Telecom Technology Co.,Ltd. - 001310 - Cisco-Linksys LLC + 94E2FD + Boge Kompressoren OTTO Boge GmbH & Co. KG - 046C9D - Cisco Systems Inc. + F42C56 + SENOR TECH CO LTD - 84B261 - Cisco Systems Inc. + FCDC4A + G-Wearables Corp. - E448C7 - Cisco SPVTG + 1C14B3 + Airwire Technologies - 00101F - Cisco Systems Inc. + A89008 + Beijing Yuecheng Technology Co. Ltd. - 54A274 - Cisco Systems Inc. + 183864 + CAP-TECH INTERNATIONAL CO., LTD. - 60FB42 - Apple + C0335E + Microsoft - 64B9E8 - Apple + B0E03C + TCT mobile ltd - 001D4F - Apple + BC1485 + Samsung Electronics Co.,Ltd - 002312 - Apple + 9C6C15 + Microsoft Corporation - 80E01D - Cisco Systems Inc. + A48CDB + Lenovo - D8A25E - Apple + D85DE2 + Hon Hai Precision Ind. Co.,Ltd. - 000A27 - Apple + 3C912B + Vexata Inc - 183451 - Apple + 346C0F + Pramod Telecom Pvt. Ltd - 0C771A - Apple + C8A823 + Samsung Electronics Co.,Ltd - 286ABA - Apple + B0C559 + Samsung Electronics Co.,Ltd - 4CB199 - Apple + 6CF5E8 + Mooredoll Inc. - C09F42 - Apple + E8447E + Bitdefender SRL - D023DB - Apple + B0495F + OMRON HEALTHCARE Co., Ltd. - 70DEE2 - Apple + 445ECD + Razer Inc - F0CBA1 - Apple + A0C2DE + Costar Video Systems - 182032 - Apple + 88E161 + Art Beijing Science and Technology Development Co., Ltd. - 403CFC - Apple + 00A509 + WigWag Inc. - 4860BC - Apple + 7491BD + Four systems Co.,Ltd. - 3451C9 - Apple + D0929E + Microsoft Corporation - 406C8F - Apple + 84CFBF + Fairphone - 5855CA - Apple + ACD1B8 + Hon Hai Precision Ind. Co.,Ltd. - DC2B61 - Apple + 60F189 + Murata Manufacturing Co., Ltd. - 40A6D9 - Apple + 742EFC + DirectPacket Research, Inc, - 60FACD - Apple + F0FE6B + Shanghai High-Flying Electronics Technology Co., Ltd - 003EE1 - Apple + 3CAE69 + ESA Elektroschaltanlagen Grimma GmbH - FC253F - Apple + D43266 + Fike Corporation - 04F7E4 - Apple + 900CB4 + Alinket Electronic Technology Co., Ltd - 34C059 - Apple + 4CA928 + Insensi - F0D1A9 - Apple + DC0914 + Talk-A-Phone Co. - 705681 - Apple + 48C093 + Xirrus, Inc. - 14109F - Apple + 00A2F5 + Guangzhou Yuanyun Network Technology Co.,Ltd - 040CCE - Apple + 1008B1 + Hon Hai Precision Ind. Co.,Ltd. - 54EAA8 - Apple + E48C0F + Discovery Insure - 28E14C - Apple + BC52B4 + Nokia - E4C63D - Apple + 9405B6 + Liling FullRiver Electronics & Technology Ltd - 54E43A - Apple + 10FACE + Reacheng Communication Technology Co.,Ltd - 04DB56 - Apple + C81B6B + Innova Security - AC3C0B - Apple + B4A828 + Shenzhen Concox Information Technology Co., Ltd - 701124 - Apple + 3438AF + Inlab Networks GmbH - 042665 - Apple + 00F3DB + WOO Sports - EC3586 - Apple + 78312B + zte corporation - 78FD94 - Apple + 44CE7D + SFR - 2CBE08 - Apple + 344DEA + zte corporation - E8802E - Apple + 94BF95 + Shenzhen Coship Electronics Co., Ltd - 006171 - Apple + E42354 + SHENZHEN FUZHI SOFTWARE TECHNOLOGY CO.,LTD - 8C7C92 - Apple + 9470D2 + WINFIRM TECHNOLOGY - B03495 - Apple + A44AD3 + ST Electronics(Shanghai) Co.,Ltd - F437B7 - Apple + EC0EC4 + Hon Hai Precision Ind. Co.,Ltd. - AC7F3E - Apple + 8C18D9 + Shenzhen RF Technology Co., Ltd - 280B5C - Apple + CC3080 + VAIO Corporation - ACFDEC - Apple + 187117 + eta plus electronic gmbh - DC9B9C - Apple + 7CB177 + Satelco AG - 54724F - Apple + 30FAB7 + Tunai Creative - D8CF9C - Apple + 0809B6 + Masimo Corp - 7C6DF8 - Apple + 4CF5A0 + Scalable Network Technologies Inc - 04E536 - Apple + 4C16F1 + zte corporation - A8BBCF - Apple + D8FB11 + AXACORE - 6C4008 - Apple + C4BD6A + SKF GmbH - FCA386 - Shenzhen Chuangwei-RGB Electronics Ltd + C401CE + PRESITION (2000) CO., LTD. - 40331A - Apple + 587BE9 + AirPro Technology India Pvt. Ltd - CCC760 - Apple + 600292 + PEGATRON CORPORATION - BC4CC4 - Apple + B4B859 + Texa Spa - DC3714 - Apple + 5CF9F0 + Atomos Engineering P/L - 20A2E4 - Apple + E4C62B + Airware - 28F076 - Apple + EC1D7F + zte corporation - 141357 - ATP Electronics Inc. + 4CE933 + RailComm, LLC - B8B2EB - Googol Technology (HK) Limited + AC3870 + Lenovo Mobile Communication Technology Ltd. - FCCF43 - Huizhou City Huiyang District Meisiqi Industry Development Ltd + 4CBC42 + Shenzhen Hangsheng Electronics Co.,Ltd. - D848EE - Hangzhou Xueji Technology Ltd + 987E46 + Emizon Networks Limited - B4EF04 - DAIHAN Scientific Ltd + 3C46D8 + TP-LINK TECHNOLOGIES CO.,LTD. - A4DEC9 - QLove Mobile Intelligence Information Technology (W.H.) Ltd + 147590 + TP-LINK TECHNOLOGIES CO.,LTD. - CCE0C3 - EXTEN Technologies Inc. + 50BD5F + TP-LINK TECHNOLOGIES CO.,LTD. - 646A74 - Auth-Servers LLC + 70F196 + Actiontec Electronics, Inc - 4C8ECC - Silkan SA + 188219 + Alibaba Cloud Computing Ltd. - E435C8 - Huawei Technologies Ltd + 28A5EE + Shenzhen SDGI CATV Co., Ltd - 0C54B9 - Nokia + F4FD2B + ZOYI Company - 84100D - Motorola Mobility LLC, a Lenovo Company + BC4E5D + ZhongMiao Technology Co., Ltd. - D00F6D - T&W Electronics Company + 7C6AC3 + GatesAir, Inc - 908D78 - D-Link International + F4D032 + Yunnan Ideal Information&Technology.,Ltd - 7C7176 - Wuxi iData Technology Company Ltd + 0C8C8F + Kamo Technology Limited - 7C0191 - Apple + A4A4D3 + Bluebank Communication Technology Co.Ltd - 2C1BC8 - Hunan Topview Network System Ltd + 702DD1 + Newings Communication CO., LTD. - A8474A - Hon Hai Precision Ind Ltd + F4F646 + Dediprog Technology Co. Ltd. - C40049 - Kamama + D0A0D6 + ChengDu TD Tech - 80D605 - Apple + ECB907 + CloudGenix Inc - 98E848 - Axiim + F42833 + MMPC Inc. - C04A09 - Zhejiang Everbright Communication Equip Ltd + A8329A + Digicom Futuristic Technologies Ltd. - A01E0B - MINIX Technology Limited + 083D88 + Samsung Electronics Co.,Ltd - 68E8EB - Linktel Technologies Ltd + 30595B + streamnow AG - A845CD - Siselectron Technology Ltd + 4C83DE + Cisco SPVTG - D0C193 - Skybell Inc. + A81374 + Panasonic Corporation AVC Networks Company - AC6462 - ZTE Corporation + 3C189F + Nokia Corporation - C025A2 - NEC Platforms Ltd + 28E6E9 + SIS Sat Internet Services GmbH - 48137E - Samsung Electronics Ltd + 045C8E + gosund GROUP CO.,LTD - 30F772 - Hon Hai Precision Ind Ltd + 7CC4EF + Devialet - DC3CF6 - Atomic Rules LLC + D85DFB + Private - 089B4B - iKuai Networks + 300D2A + Zhejiang Wellcom Technology Co.,Ltd. - 4473D6 - Logitech + 908C63 + GZ Weedong Networks Technology Co. , Ltd - 10CC1B - Liverock technologies,Inc + 84850A + Hella Sonnen- und Wetterschutztechnik GmbH - E80734 - Champion Optical Network Engineering LLC + 08CD9B + samtec automotive electronics & software GmbH - A43831 - RF elements s.r.o. + 5C5BC2 + YIK Corporation - 380546 - Foctek Photonics Inc. + 109266 + Samsung Electronics Co.,Ltd - D48304 - Shenzhen Fast Technologies Ltd + DCF110 + Nokia Corporation - DC2B2A - Apple + 608F5C + Samsung Electronics Co.,Ltd - 9C8DD3 - Leonton Technologies + E8EF89 + OPMEX Tech. - E41A2C - ZPE Systems Inc. + EC2E4E + HITACHI-LG DATA STORAGE INC - E8BDD1 - Huawei Technologies Ltd + 3481C4 + AVM GmbH - F41535 - SPON Communication Technology Ltd + CCB691 + NECMagnusCommunications - 380AAB - Formlabs + 40167E + ASUSTek COMPUTER INC. - 382DE8 - Samsung Electronics Ltd + 142BD6 + Guangdong Appscomm Co.,Ltd - C08997 - Samsung Electronics Ltd + F84A73 + EUMTECH CO., LTD - A815D6 - Shenzhen Meione Technology Ltd + 983713 + PT.Navicom Indonesia - C07CD1 - Pegatron Corporation + A47E39 + zte corporation - 90D8F3 - ZTE Corporation + FCC2DE + Murata Manufacturing Co., Ltd. - D445E8 - Jiangxi Hongpai Technology Ltd + D0C7C0 + TP-LINK TECHNOLOGIES CO.,LTD. - 342606 - CarePredict Inc. + D46761 + XonTel Technology Co. - 38B725 - Wistron Infocomm (Zhongshan) Corporation + 98349D + Krauss Maffei Technologies GmbH - ACEC80 - ARRIS Group Inc. + 880FB6 + Jabil Circuits India Pvt Ltd,-EHTP unit - 507B9D - LCFC(HeFei) Electronics Technology Ltd + B46698 + Zealabs srl - 6C7220 - D-Link International + 687CC8 + Measurement Systems S. de R.L. - 30A243 - Shenzhen Prifox Innovation Technology Ltd + 74F85D + Berkeley Nucleonics Corp - 380195 - Samsung Electronics Ltd + B061C7 + Ericsson-LG Enterprise - 246E96 - Dell Inc. + 400107 + Arista Corp - 44975A - Shenzhen Fast Technologies Ltd + 0092FA + SHENZHEN WISKY TECHNOLOGY CO.,LTD - 5045F7 - Liuhe Intelligence Technology Ltd + 4C7F62 + Nokia Corporation - AC676F - Electrocompaniet A.S. + D881CE + AHN INC. - 640DE6 - Petra Systems + E0D31A + EQUES Technology Co., Limited - E0553D - Cisco Meraki + 580528 + LABRIS NETWORKS - FC335F - Polyera + 407875 + IMBEL - Industria de Material Belico do Brasil - 84D4C8 - Widex A/S + 30C750 + MIC Technology Group - EC21E5 - Toshiba + 4411C2 + Telegartner Karl Gartner GmbH - 04C23E - HTC Corporation + 8059FD + Noviga - E01AEA - Allied Telesis Inc. + 987770 + Pep Digital Technology (Guangzhou) Co., Ltd - 28B9D9 - Radisys Corporation + 28C825 + DellKing Industrial Co., Ltd - F4C613 - Alcatel-Lucent Shanghai Bell Ltd + 447E76 + Trek Technology (S) Pte Ltd - 445F8C - Intercel Group Limited + B0EC8F + GMX SAS - B88981 - Chengdu InnoThings Technology Ltd + 28DEF6 + bioMerieux Inc. - F02624 - Wafa Technologies Ltd + 100F18 + Fu Gang Electronic(KunShan)CO.,LTD - F8F464 - Rawe Electonic GmbH + 18CC23 + Philio Technology Corporation - 5C5188 - Motorola Mobility LLC, a Lenovo Company + 68D247 + Portalis LC - EC0133 - Trinus Systems Inc. + 50B695 + Micropoint Biotechnologies,Inc. - 2CC548 - IAdea Corporation + B4430D + Broadlink Pty Ltd - 14DDA9 - ASUSTek Computer Inc. + 50A054 + Actineon - 184F32 - Hon Hai Precision Ind Ltd + A06518 + VNPT TECHNOLOGY - DCA3AC - RBcloudtech + 7C8D91 + Shanghai Hongzhuo Information Technology co.,LTD - 0CE725 - Microsoft Corporation + 748F1B + MasterImage 3D - 58F102 - BLU Products Inc. + 083F76 + Intellian Technologies, Inc. - B4AE2B - Microsoft Corporation + 386C9B + Ivy Biomedical - 949F3E - Sonos Inc. + B42C92 + Zhejiang Weirong Electronic Co., Ltd - 3089D3 - Hongkong Ucloudlink Network Technology Limited + 6C641A + Penguin Computing - 5CB395 - Huawei Technologies Ltd + 5CE7BF + New Singularity International Technical Development Co.,Ltd - 906CAC - Fortinet Inc. + CC89FD + Nokia Corporation - 3CDA2A - ZTE Corporation + 34466F + HiTEM Engineering - 842E27 - Samsung Electronics Ltd + D82A15 + Leitner SpA - 1CADD1 - Bosung Electronics Ltd + 80618F + Shenzhen sangfei consumer communications co.,ltd - 082CB0 - Network Instruments + B48547 + Amptown System Company GmbH - A013CB - Fiberhome Telecommunication Technologies Ltd + D87CDD + SANIX INCORPORATED - D00492 - Fiberhome Telecommunication Technologies Ltd + 707C18 + ADATA Technology Co., Ltd - 1432D1 - Samsung Electronics Ltd + 78EC74 + Kyland-USA - 1816C9 - Samsung Electronics Ltd + E8E770 + Warp9 Tech Design, Inc. - 00FC8D - Hitron Technologies Inc. + 609620 + Private - 84DF19 - Chuango Security Technology Corporation + C0F991 + GME Standard Communications P/L - DC15DB - Ge Ruili Intelligent Technology ( Beijing ) Ltd + C064C6 + Nokia Corporation - E0DB10 - Samsung Electronics Ltd + 14F28E + ShenYang ZhongKe-Allwin Technology Co.LTD - 546172 - Zodiac Aerospace SAS + BC14EF + ITON Technology Limited - EC60E0 - AVI-ON Labs + 443C9C + Pintsch GmbH - B46D35 - Dalian Seasky Automation Co; Ltd + 10DDF4 + Maxway Electronics CO.,LTD - 3CA31A - Oilfind International LLC + 080371 + KRG CORPORATE - 30F335 - Huawei Technologies Ltd + 200E95 + IEC – TC9 WG43 - E8F2E3 - Starcor Beijing Ltd + 0C1262 + zte corporation - 6459F8 - Vodafone Omnitel B.V. + 3CD4D6 + WirelessWERX, Inc - 6C4418 - Zappware + C8F68D + S.E.TECHNOLOGIES LIMITED - A8D409 - USA 111 Inc + 387B47 + AKELA, Inc. - 6C4598 - Antex Electronic Corp. + E40439 + TomTom Software Ltd - 68A378 - Freebox SAS + 24A495 + Thales Canada Inc. - 340A22 - TOP-Access Electronics Ltd + D0C42F + Tamagawa Seiki Co.,Ltd. - E866C4 - Diamanti + 549359 + SHENZHEN TWOWING TECHNOLOGIES CO.,LTD. - D4D7A9 - Shanghai Kaixiang Info Tech Ltd + 90356E + Vodafone Omnitel N.V. - 343D98 - JinQianMao Technology Ltd + E097F2 + Atomax Inc. - F44713 - Leading Public Performance Ltd + 70305E + Nanjing Zhongke Menglian Information Technology Co.,LTD - 5CA178 - TableTop Media (dba Ziosk) + C098E5 + University of Michigan - 9CBEE0 - Biosoundlab Ltd + 50E14A + Private - 0C413E - Microsoft Corporation + 708D09 + Nokia Corporation - D06F4A - Topwell International Holdings Limited + 701D7F + Comtech Technology Co., Ltd. - 0492EE - iway AG + 9C039E + Beijing Winchannel Software Technology Co., Ltd - 807459 - K's Ltd + 680AD7 + Yancheng Kecheng Optoelectronic Technology Co., Ltd - 601970 - Huizhou Qiaoxing Electronics Technology Ltd + 5C1193 + Seal One AG - A408EA - Murata Manufacturing Ltd + 847616 + Addat s.r.o. - B87879 - Roche Diagnostics GmbH + DC0575 + SIEMENS ENERGY AUTOMATION - D083D4 - Xtel Wireless ApS + 844F03 + Ablelink Electronics Ltd - 08D34B - Techman Electronics (Changshu) Ltd + 783D5B + TELNET Redes Inteligentes S.A. - 78A351 - Shenzhen Zhibotong Electronics Ltd + D0B523 + Bestcare Cloucal Corp. - E4695A - Dictum Health Inc. + 98FB12 + Grand Electronics (HK) Ltd - 7C7A53 - Phytrex Technology Corp. + 3C1040 + daesung network - 107873 - Shenzhen Jinkeyi Communication Ltd + 28FC51 + The Electric Controller and Manufacturing Co., LLC - 48EE0C - D-Link International + BC8893 + VILLBAU Ltd. - EC3C88 - MCNEX Ltd + 407496 + aFUN TECHNOLOGY INC. - 70AD54 - Malvern Instruments Ltd + 705986 + OOO TTV - 9000DB - Samsung Electronics Ltd + 986CF5 + zte corporation - B4EF39 - Samsung Electronics Ltd + 906717 + Alphion India Private Limited - F02A23 - Creative Next Design + 6064A1 + RADiflow Ltd. - 584704 - Shenzhen Webridge Technology Ltd + 58B961 + SOLEM Electronique - 74A063 - Huawei Technologies Ltd + 78491D + The Will-Burt Company - ECE2FD - SKG Electric Group(Thailand) Ltd + 20D21F + Wincal Technology Corp. - 148F21 - Garmin International + F89550 + Proton Products Chengdu Ltd - 9C685B - Octonion SA + 447BC4 + DualShine Technology(SZ)Co.,Ltd - 7C534A - Metamako + 2C5FF3 + Pertronic Industries - BCB308 - Hongkong Ragentek Communication Technology Ltd + 58639A + TPL SYSTEMES - 6C2E72 - B&B Exporting Limited + 187ED5 + shenzhen kaism technology Co. Ltd - 5CCCFF - Techroutes Network Pvt Ltd + 9CF8DB + shenzhen eyunmei technology co,.ltd - 90C35F - Nanjing Jiahao Technology Ltd + 0C473D + Hitron Technologies. Inc - C808E9 - LG Electronics + 8CCDA2 + ACTP, Inc. - 183A2D - Samsung Electronics Ltd + 84262B + Nokia - EC74BA - Hirschmann Automation and Control GmbH + F46ABC + Adonit Corp. Ltd. - FC3288 - CELOT Wireless Ltd + 7C49B9 + Plexus Manufacturing Sdn Bhd - D87495 - ZTE Corporation + 840F45 + Shanghai GMT Digital Technologies Co., Ltd - 5C3B35 - Gehirn Inc. + E0AF4B + Pluribus Networks, Inc. - E4FED9 - EDMI Europe Ltd + 54A54B + NSC Communications Siberia Ltd - 5CF7C3 - Syntech (HK) Technology Limited + BC2B6B + Beijing Haier IC Design Co.,Ltd - 9CE230 - Julong Ltd + 7CB77B + Paradigm Electronics Inc - 5C41E7 - Wiatec International Ltd + B0CE18 + Zhejiang shenghui lighting co.,Ltd - 344CA4 - amazipoint technology Ltd + 98D331 + Shenzhen Bolutek Technology Co.,Ltd. - A8F038 - Shen Zhen SHI JIN HUA TAI Electronics Ltd + 38EC11 + Novatek Microelectronics Corp. - ACC73F - Vitsmo Ltd + 4CCBF5 + zte corporation - 74E277 - Vizmonet Pte Ltd + 44700B + IFFU - 14893E - Vixtel Technologies LTD + 1C4158 + Gemalto M2M GmbH - BC54F9 - Drogoo Technology Ltd + 9C2840 + Discovery Technology,LTD.. - 78FC14 - Family Zone Cyber Safety Ltd + 1C7B21 + Sony Corporation - 3809A4 - Firefly Integrations + EC2257 + JiangSu NanJing University Electronic Information Technology Co.,Ltd - BCE767 - Quanzhou TDX Electronics Ltd + F037A1 + Huike Electronics (SHENZHEN) CO., LTD. - FCAFAC - Socionext Inc. + F08EDB + VeloCloud Networks - BC4DFB - Hitron Technologies Inc. + F47A4E + Woojeon&Handan - 2C337A - Hon Hai Precision Ind Ltd + 04848A + 7INOVA TECHNOLOGY LIMITED - 84DDB7 - Cilag GmbH International + 6CF97C + Nanoptix Inc. - 08EFAB - Sayme Wireless Sensor Network + F8FF5F + Shenzhen Communication Technology Co.,Ltd - 7076FF - Kerlink + 704CED + TMRG, Inc. - 1436C6 - Lenovo Mobile Communication Technology Ltd + 841B38 + Shenzhen Excelsecu Data Technology Co.,Ltd - 68F728 - LCFC(HeFei) Electronics Technology Ltd + A897DC + IBM - 382C4A - ASUSTek Computer Inc. + 109AB9 + Tosibox Oy - 307350 - Inpeco SA + 142D8B + Incipio Technologies, Inc - DCEC06 - Heimi Network Technology Ltd + 68EE96 + Cisco SPVTG - CCBDD3 - Ultimaker B.V. + 08EF3B + MCS Logic Inc. - 8CE78C - DK Networks + E8EADA + Denkovi Assembly Electronics LTD - 545146 - AMG Systems Ltd + F85BC9 + M-Cube Spa - 8463D6 - Microsoft Corporation + 907A0A + Gebr. Bode GmbH & Co KG - EC13B2 - Netonix + A0C6EC + ShenZhen ANYK Technology Co.,LTD - 104E07 - Shanghai Genvision Industries Ltd + 102279 + ZeroDesktop, Inc. - 049B9C - Eadingcore Intelligent Technology Ltd + 7C1AFC + Dalian Co-Edifice Video Technology Co., Ltd - 842690 - Beijing Thought Science Ltd + 28C671 + Yota Devices OY - 801967 - Shanghai Reallytek Information Technology Ltd + D86960 + Steinsvik - 2CF7F1 - Seeed Technology Inc. + 78E8B6 + zte corporation - 3C1E13 - Hangzhou Sunrise Technology Ltd + DCAE04 + CELOXICA Ltd - 08115E - Bitel Ltd + 8005DF + Montage Technology Group Limited - 0881BC - HongKong Ipro Technology Ltd + 84E629 + Bluwan SA - C09879 - Acer Inc. + C47F51 + Inventek Systems - B84FD5 - Microsoft Corporation + 681D64 + Sunwave Communications Co., Ltd - D84A87 - OI Electric Ltd + 4C21D0 + Sony Corporation - F03D29 - Actility + CCD29B + Shenzhen Bopengfa Elec&Technology CO.,Ltd - 88708C - Lenovo Mobile Communication Technology Ltd + 78DAB3 + GBO Technology - 5014B5 - Richfit Information Technology Ltd + 700FEC + Poindus Systems Corp. - DCDA4F - Getck Technology, Inc + E8481F + Advanced Automotive Antennas - 101218 - Korins Inc. + D40BB9 + Solid Semecs bv. - 3428F0 - ATN International Limited + F415FD + Shanghai Pateo Electronic Equipment Manufacturing Co., Ltd. - CC10A3 - Beijing Nan Bao Technology Ltd + 748E08 + Bestek Corp. - 5CAAFD - Sonos Inc. + D8DA52 + APATOR S.A. - 14EDE4 - Kaiam Corporation + 587A4D + Stonesoft Corporation - D01242 - BIOS Corporation + F02405 + OPUS High Technology Corporation - 603696 - The Sapling Company + D41090 + iNFORM Systems AG - 54FFCF - Mopria Alliance + 3495DB + Logitec Corporation - F4F26D - TP-Link Technologies Ltd + 9CB793 + Creatcomm Technology Inc. - 404EEB - Higher Way Electronic Ltd + 5C335C + Swissphone Telecom AG - C456FE - Lava International Ltd + 78D38D + HONGKONG YUNLINK TECHNOLOGY LIMITED - ACB74F - METEL s.r.o. + 1078CE + Hanvit SI, Inc. - C0EEFB - OnePlus Tech (Shenzhen) Ltd + 78F5E5 + BEGA Gantenbrink-Leuchten KG - 304225 - Burg-Wachter KG + C47DFE + A.N. Solutions GmbH - FCDBB3 - Murata Manufacturing Ltd + 70E027 + HONGYU COMMUNICATION TECHNOLOGY LIMITED - CCF538 - 3isysnetworks + A09BBD + Total Aviation Solutions Pty Ltd - B8BD79 - TrendPoint Systems + 04DF69 + Car Connectivity Consortium - 74F413 - Maxwell Forest + 78D5B5 + NAVIELEKTRO KY - A00627 - NEXPA System + ECD040 + GEA Farm Technologies GmbH - 303335 - Boosty + F80DEA + ZyCast Technology Inc. - 4C9EFF - ZyXEL Communications Corp + B08807 + Strata Worldwide - BC9CC5 - Beijing Huafei Technology Ltd + 5CF370 + CC&C Technologies, Inc - 5CB8CB - Allis Communications + CCBD35 + Steinel GmbH - 34F0CA - Shenzhen Linghangyuan Digital Technology Ltd + 6CECA1 + SHENZHEN CLOU ELECTRONICS CO. LTD. - 70720D - Lenovo Mobile Communication Technology Ltd + 105C3B + Perma-Pipe, Inc. - 3CCD5A - Technische Alternative GmbH + 349D90 + Heinzmann GmbH & CO. KG - FCAA14 - Giga-Byte Technology Ltd + B03850 + Nanjing CAS-ZDC IOT SYSTEM CO.,LTD - 94D60E - Shenzhen yunmao Information technologies Ltd + A4E0E6 + FILIZOLA S.A. PESAGEM E AUTOMACAO - 506787 - Planet Networks + DC647C + C.R.S. iiMotion GmbH - 8CBF9D - Shanghai Xinyou Information Technology Ltd + 148692 + TP-LINK TECHNOLOGIES CO.,LTD. - 9CAD97 - Hon Hai Precision Ind Ltd + A8154D + TP-LINK TECHNOLOGIES CO.,LTD. - 882950 - Netmoon Technology Ltd + D862DB + Eno Inc. - 7CE524 - Quirky Inc. + 8C3C07 + Skiva Technologies, Inc. - F4D261 - SEMOCON Ltd + C0C3B6 + Automatic Systems - 48D855 - Telvent + A0EB76 + AirCUVE Inc. - 08F728 - GLOBO Multimedia Sp. z o.o. Sp.k. + FC4499 + Swarco LEA d.o.o. - 206E9C - Samsung Electronics Ltd + E4F7A1 + Datafox GmbH - 6C2F2C - Samsung Electronics Ltd + 381766 + PROMZAKAZ LTD. - B009D3 - Avizia + 1441E2 + Monaco Enterprises, Inc. - 60C1CB - Fujian Great Power PLC Equipment Ltd + E47D5A + Beijing Hanbang Technology Corp. - BC25F0 - 3D Display Technologies Ltd + 38A86B + Orga BV - C03D46 - Shanghai Sango Network Technology Ltd + F07765 + Sourcefire, Inc - 64EAC5 - SiboTech Automation Ltd + 249504 + SFR - 30F7D7 - Thread Technology Ltd + F45842 + Boxx TV Ltd - 18227E - Samsung Electronics Ltd + 106682 + NEC Platforms, Ltd. - 30C7AE - Samsung Electronics Ltd + F084C9 + zte corporation - FCD5D9 - Shenzhen SDMC Technology Ltd + D4016D + TP-LINK TECHNOLOGIES CO.,LTD. - 74DA38 - Edimax Technology Ltd + 985C93 + SBG Systems SAS - E4F4C6 - Netgear + A08A87 + HuiZhou KaiYue Electronic Co.,Ltd - CCA0E5 - DZG Metering GmbH + 18E8DD + MODULETEK - 1C1CFD - Dalian Hi-Think Computer Technology, Corp + D073D5 + LIFI LABS MANAGEMENT PTY LTD - 90AE1B - TP-Link Technologies Ltd + 149448 + BLU CASTLE S.A. - 60E327 - TP-Link Technologies Ltd + 68831A + Pandora Mobility Corporation - 48D18E - Metis Communication Ltd + D429EA + Zimory GmbH - F86601 - Suzhou Chi-tek Information technology Ltd + 34ADE4 + Shanghai Chint Power Systems Co., Ltd. - 145645 - Savitech Corp. + D81EDE + B&W Group Ltd - 7062B8 - D-Link International + 24EA40 + Helmholz GmbH & Co. KG - ACA919 - TrekStor GmbH + FCDB96 + ENERVALLEY CO., LTD - B025AA - Private + 1423D7 + EUTRONIX CO., LTD. - D4B43E - Messcomp Datentechnik GmbH + 386793 + Asia Optical Co., Inc. - 94C014 - Sorter Sp. j. Konrad Grzeszczyk MichaA, Ziomek + 0C8268 + TP-LINK TECHNOLOGIES CO.,LTD. - 9CFBF1 - MESOMATIC GmbH & Co.KG + 90DA4E + AVANU - 1027BE - Tvip + 281878 + Microsoft Corporation - 2087AC - AES motomation + 7038B4 + Low Tech Solutions - 709383 - Intelligent Optical Network High Tech Ltd + 28CD9C + Shenzhen Dynamax Software Development Co.,Ltd. - 80D433 - LzLabs GmbH + 504F94 + Loxone Electronics GmbH - B0DA00 - Cera Electronique + 60B185 + ATH system - 1CAB01 - Innovolt + 745F00 + Samsung Semiconductor Inc. - D8B6D6 - Blu Tether Limited + E0C3F3 + zte corporation - 6C2C06 - OOO NPP Systemotechnika-NN + 5C20D0 + Asoni Communication Co., Ltd. - C4913A - Shenzhen Sanland Electronic Ltd + BC629F + Telenet Systems P. Ltd. - 68856A - OuterLink Corporation + 847A88 + HTC Corporation - 9451BF - Hyundai ESG + A4D856 + Gimbal, Inc - F015A0 - KyungDong One Ltd + 785517 + SankyuElectronics - C44E1F - BlueN + B47F5E + Foresight Manufacture (S) Pte Ltd - B0869E - Chloride S.r.L + 44184F + Fitview - D057A1 - Werma Signaltechnik GmbH & Co. KG + ACA430 + Peerless AV - B4B542 - Hubbell Power Systems Inc. + 541FD5 + Advantage Electronics - 54CDEE - Shenzhen Apexis Electronic Ltd + ACE97F + IoT Tech Limited - 88E8F8 - Yong TAI Electronic (Dongguan) Ltd + A0FE91 + AVAT Automation GmbH - 909864 - Impex-Sat GmbH&Co KG + 74ECF1 + Acumen - DCE578 - Experimental Factory Of Scientific Engineering and Special Design Department + 78324F + Millennium Group, Inc. - D86595 - Toy's Myth Inc. + 48F230 + Ubizcore Co.,LTD - F4B52F - Juniper Networks + 384369 + Patrol Products Consortium LLC - C0F79D - Powercode + B85AF7 + Ouya, Inc - C4C919 - Energy Imports Ltd + 84ACA4 + Beijing Novel Super Digital TV Technology Co., Ltd - 38F098 - Vapor Stone Rail Systems + 5809E5 + Kivic Inc. - 64E892 - Morio Denki Ltd + DC6F08 + Bay Storage Technology - D8DD5F - BALMUDA Inc. + 58D6D3 + Dairy Cheq Inc - D86194 - Objetivos y Sevicios de Valor Anadido + 046E49 + TaiYear Electronic Technology (Suzhou) Co., Ltd - E8FC60 - ELCOM Innovations Private Limited + E85AA7 + LLC Emzior - 589CFC - FreeBSD Foundation + 9C9C1D + Starkey Labs Inc. - 702C1F - Wisol + 9CE1D6 + Junger Audio-Studiotechnik GmbH - C8D429 - Muehlbauer AG + 34F62D + SHARP Corporation - F85C45 - IC Nexus Ltd + 4C8FA5 + Jastec - ACE069 - ISAAC Instruments + 84ED33 + BBMC Co.,Ltd - 30B5C2 - TP-Link Technologies Ltd + E82E24 + Out of the Fog Research LLC - E07F53 - Techboard SRL + 2C3BFD + Netstor Technology Co., Ltd. - 48FEEA - Homa B.V. + 1C52D6 + FLAT DISPLAY TECHNOLOGY CORPORATION - E8EA6A - StarTech.com + D0DFB2 + Genie Networks Limited - 04DB8A - Suntech International Ltd + 386645 + OOSIC Technology CO.,Ltd - 90DFB7 - s.m.s smart microwave sensors GmbH + D0D6CC + Wintop - 085700 - TP-Link Technologies Ltd + 58D071 + BW Broadcast - FC27A2 - Trans Electric Ltd + 80FA5B + CLEVO CO. - FCBBA1 - Shenzhen Minicreate Technology Ltd + C0B339 + Comigo Ltd. - F08A28 - JIANGSU HENGSION ELECTRONIC S and T Ltd + 20858C + Assa - 28BB59 - RNET Technologies Inc. + 8007A2 + Esson Technology Inc. - 242642 - Sharp Corporation. + C0A0E2 + Eden Innovations - 34DE34 - ZTE Corporation + 6C5A34 + Shenzhen Haitianxiong Electronic Co., Ltd. - FC1607 - Taian Technology(Wuxi) Ltd + DCB058 + Bürkert Werke GmbH - AC02CA - HI Solutions Inc. + 60CDC5 + Taiwan Carol Electronics., Ltd - 746F3D - Contec GmbH + D8182B + Conti Temic Microelectronic GmbH - 4C0DEE - Jabil Circuit (Shanghai) Ltd + 80CF41 + Lenovo Mobile Communication Technology Ltd. - D0634D - Meiko Maschinenbau GmbH & Co. KG + 9038DF + Changzhou Tiannengbo System Co. Ltd. - 008B43 - Rftech + 185253 + Pixord Corporation - 8C41F2 - RDA Technologies Ltd + 683B1E + Countwise LTD - E036E3 - Stage One International Ltd + 10FBF0 + KangSheng LTD. - DC052F - National Products Inc. + B49DB4 + Axion Technologies Inc. - D0BD01 - DS International + ACE87E + Bytemark Computer Consulting Ltd - 8CDE99 - Comlab Inc. + ACA22C + Baycity Technologies Ltd - 4CE1BB - Zhuhai HiFocus Technology Ltd + 6C9AC9 + Valentine Research, Inc. - 24A87D - Panasonic Automotive Systems Asia Pacific(Thailand) Ltd + 080FFA + KSP INC. - A409CB - Alfred Kaercher GmbH & Co KG + AC3CB4 + Nilan A/S - 8C569D - Imaging Solutions Group + B85AFE + Handaer Communication Technology (Beijing) Co., Ltd - 40B6B1 - SUNGSAM Ltd + 60748D + Atmaca Elektronik - 84FE9E - RTC Industries Inc. + B8B7D7 + 2GIG Technologies - FC4B1C - Intersensor S.R.L. + 78D129 + Vicos - 403067 - Conlog (Pty) Ltd + 84DF0C + NET2GRID BV - E86183 - Black Diamond Advanced Technology LLC + 78AB60 + ABB Australia - 38C9A9 - SMART High Reliability Solutions Inc. + 8482F4 + Beijing Huasun Unicreate Technology Co., Ltd - 501AC5 - Microsoft Corporation + 5CD41B + UCZOON Technology Co., LTD - B0989F - LG CNS + CCE798 + My Social Stuff - C0F1C4 - Pacidal Corporation Ltd + A036F0 + Comprehensive Power - 600347 - Billion Electric Ltd + 180CAC + CANON INC. - F0D3A7 - CobaltRay Ltd + AC7236 + Lexking Technology Co., Ltd. - 38A53C - CoMECER Netherlands + 3CD7DA + SK Mtek microelectronics(shenzhen)limited - 5CFFFF - Shenzhen Kezhonglong Optoelectronic Technology Ltd + 04F8C2 + Flaircomm Microelectronics, Inc. - 085240 - EbV Elektronikbau- und Vertriebs GmbH + 808287 + ATCOM Technology Co.Ltd. - B8C1A2 - Dragon Path Technologies Ltd + 28A186 + enblink - 80F25E - Kyynel + 6869F2 + ComAp s.r.o. - 68692E - Zycoo Ltd + 5887E2 + Shenzhen Coship Electronics Co., Ltd. - D46867 - Neoventus Design Group + F46DE2 + zte corporation - 2C18AE - Trend Electronics Ltd + 388EE7 + Fanhattan LLC - F81CE5 - Telefonbau Behnke GmbH + 2091D9 + I'M SPA - 889166 - Viewcooper Corp. + 141BF0 + Intellimedia Systems Ltd - 103378 - FLECTRON Ltd + 303294 + W-IE-NE-R Plein & Baus GmbH - 14EDA5 - Wachter GmbH Sicherheitssysteme + 7C822D + Nortec - 50C006 - Carmanah Signs + AC8D14 + Smartrove Inc - 04CB1D - Traka plc + 503955 + Cisco SPVTG - A4E9A3 - Honest Technology Ltd + 34996F + VPI Engineering - A0E5E9 - enimai Inc + 7CD9FE + New Cosmos Electric Co., Ltd. - 9C216A - TP-Link Technologies Ltd + CCC104 + Applied Technical Systems - F862AA - xn Systems + 4C72B9 + PEGATRON CORPORATION - 107BEF - ZyXEL Communications Corp + 907025 + Garea Microsys Co.,Ltd. - B462AD - Elysia Germany GmbH + 10D1DC + INSTAR Deutschland GmbH - 345C40 - Cargt Holdings LLC + 2CEDEB + Alpheus Digital Company Limited - 68193F - Digital Airways + 00DB1E + Albedo Telecom SL - B4750E - Belkin International Inc. + 34AF2C + Nintendo Co., Ltd. - 94103E - Belkin International Inc. + 0CDCCC + Inala Technologies - 7CB733 - Askey Computer Corp + 98291D + Jaguar de Mexico, SA de CV - 3051F8 - BYK-Gardner GmbH + 0CD996 + Cisco Systems, Inc - E8F226 - Millson Custom Solutions Inc. + 30F33A + +plugg srl - 44EE30 - Budelmann Elektronik GmbH + F8A03D + Dinstar Technologies Co., Ltd. - FC1E16 - IPEVO Corp + 2CD444 + FUJITSU LIMITED - 3C6E63 - Mitron Oy + 0C57EB + Mueller Systems - A4059E - STA Infinity LLP + 745327 + COMMSEN CO., LIMITED - A0BF50 - S.C. ADD-Production S.R.L. + D08CFF + UPWIS AB - E8D4E0 - Beijing BenyWave Technology Ltd + 68D1FD + Shenzhen Trimax Technology Co.,Ltd - FC019E - Vievu + BC28D6 + Rowley Associates Limited - 642184 - Nippon Denki Kagaku Ltd + 10BD18 + Cisco Systems, Inc - 2464EF - CYG Sunri Ltd + 5869F9 + Fusion Transactive Ltd. - D8270C - MaxTronic International Ltd + D41E35 + TOHO Electronics INC. - B4CCE9 - Prosyst + 98A7B0 + MCST ZAO - C4D655 - Tercel technology Ltd + 8CC7AA + Radinet Communications Inc. - 58BDF9 - Sigrand + 40336C + Godrej & Boyce Mfg. co. ltd - C0C687 - Cisco SPVTG + E856D6 + NCTech Ltd - C49380 - Speedytel technology + C08170 + Effigis GeoSolutions - 007DFA - Volkswagen Group Of America + 60455E + Liptel s.r.o. - 2C7155 - HiveMotion + D806D1 + Honeywell Fire System (Shanghai) Co,. Ltd. - 20180E - Shenzhen Sunchip Technology Ltd + 647657 + Innovative Security Designs - 80B219 - Elektron Technology UK Limited + 944A09 + BitWise Controls - E0AEB2 - Bender GmbH & Co.KG + 9C066E + Hytera Communications Corporation Limited - F84A7F - Innometriks Inc + 443839 + Cumulus Networks, inc - 74A4B5 - Powerleader Science and Technology Ltd + D867D9 + Cisco Systems, Inc - 909F43 - Accutron Instruments Inc. + 642216 + Shandong Taixin Electronic co.,Ltd - 2894AF - Samhwa Telecom + A4E731 + Nokia Corporation - AC5036 - Pi-Coral Inc + 3CEAFB + NSE AG - 0C9B13 - Shanghai Magic Mobile Telecommunication Ltd + BC811F + Ingate Systems - 94BF1E - eflow Inc. / Smart Device Planning and Development Division + 4C068A + Basler Electric Company - E8516E - TSMART Inc. + A44C11 + Cisco Systems, Inc - AC220B - ASUSTek Computer Inc. + 60843B + Soladigm, Inc. - B887A8 - Step Ahead Innovations Inc. + 209BA5 + JIAXING GLEAD Electronics Co.,Ltd - E0A198 - NOJA Power Switchgear Pty Ltd + A0F450 + HTC Corporation - 88354C - Transics + 6089B1 + Key Digital Systems - 3C6104 - Juniper Networks + 44D15E + Shanghai Kingto Information Technology Ltd - CC4AE1 - fourtec -Fourier Technologies + 68D925 + ProSys Development Services - 8C4B59 - 3D Imaging & Simulations Corp + 848D84 + Rajant Corporation - 5C3327 - Spazio Italia srl + D8337F + Office FA.com Co.,Ltd. - 507691 - Tekpea Inc. + 0036F8 + Conti Temic microelectronic GmbH - 28F532 - ADD-Engineering BV + AC9403 + Envision Peripherals Inc - 9440A2 - Anywave Communication Technologies Inc. + 048B42 + Skspruce Technologies - 1C86AD - MCT Ltd + 5076A6 + Ecil Informatica Ind. Com. Ltda - 28D93E - Telecor Inc. + A4F7D0 + LAN Accessories Co., Ltd. - 640B4A - Digital Telecom Technology Limited + 0036FE + SuperVision - 384233 - Wildeboer Bauteile GmbH + 54466B + Shenzhen CZTIC Electronic Technology Co., Ltd - 3C8AB0 - Juniper Networks + 44B382 + Kuang-chi Institute of Advanced Technology - C034B4 - Gigastone Corporation + 709E86 + X6D Limited - CCE8AC - SOYEA Technology Ltd + A0F419 + Nokia Corporation - 70F176 - Data Modul AG + 1C973D + PRICOM Design - B847C6 - SanJet Technology Corp. + BC0200 + Stewart Audio - B8CD93 - Penetek Inc. + D4EC0C + Harley-Davidson Motor Company - 28DB81 - Shanghai Guao Electronic Technology Ltd + 6CA96F + TransPacket AS - 3806B4 - A.D.C. GmbH + AC0142 + Uriel Technologies SIA - B8241A - Sweda Informatica Ltda + 60B933 + Deutron Electronics Corp. - A0B100 - Shenzhen Cando Electronics Ltd + 489153 + Weinmann Geräte für Medizin GmbH + Co. KG - 201D03 - Elatec GmbH + F44848 + Amscreen Group Ltd - E067B3 - Shenzhen C-Data Technology Ltd + 50D274 + Steffes Corporation - 1C4AF7 - Amon Inc + F85063 + Verathon - E4776B - Aartesys AG + F0D14F + LINEAR LLC - 30F31D - ZTE Corporation + 0043FF + KETRON S.R.L. - A0EC80 - ZTE Corporation + 7CACB2 + Bosch Software Innovations GmbH - 0CC81F - Summer Infant Inc. + 5C6F4F + S.A. SISTEL - A8FB70 - WiseSec L.t.d + 901B0E + Fujitsu Technology Solutions GmbH - E481B3 - Shenzhen ACT Industrial Ltd + 2C36F8 + Cisco Systems, Inc - C06C6D - MagneMotion Inc. + 5808FA + Fiber Optic & telecommunication INC. - E880D8 - GNTEK Electronics Ltd + 845787 + DVR C&C Co., Ltd. - 303EAD - Sonavox Canada Inc + C85645 + Intermas France - F835DD - Gemtek Technology Ltd + 44348F + MXT INDUSTRIAL LTDA - D8B04C - Jinan USR IOT Technology Ltd + C47BA3 + NAVIS Inc. - CC04B4 - Select Comfort + C8F704 + Building Block Video - 5C15E1 - Aidc Technology (S) PTE Ltd + 508A42 + Uptmate Technology Co., LTD - E8519D - Yeonhab Precision Ltd + BCEA2B + CityCom GmbH - DC5726 - Power-One + 18D66A + Inmarsat - F8DADF - EcoTech Inc. + 28E608 + Tokheim - 30AE7B - Deqing Dusun Electron Ltd + 74FF7D + Wren Sound Systems, LLC - 68EC62 - YODO Technology Corp Ltd + ACF0B2 + Becker Electronics Taiwan Ltd. - 188857 - Beijing Jinhong Xi-Dian Information Technology Corp. + 542A9C + LSY Defense, LLC. - B8C855 - Shanghai GBCOM Communication Technology Ltd + 504A5E + Masimo Corporation - 78303B - Stephen Technologies Ltd + 1C7C45 + Vitek Industrial Video Products, Inc. - CC1AFA - ZTE Corporation + 3C3888 + ConnectQuest, llc - 6C8B2F - ZTE Corporation + 48D7FF + BLANKOM Antennentechnik GmbH - 8C5AF0 - Exeltech Solar Products + C47130 + Fon Technology S.L. - B0808C - Laser Light Engines + AC3D05 + Instorescreen Aisa - D8DCE9 - Kunshan Erlab ductless filtration System Ltd + 00D632 + GE Energy - DCD52A - Sunny Heart Limited + C43C3C + CYBELEC SA - D866C6 - Shenzhen Daystar Technology Ltd + B826D4 + Furukawa Industrial S.A. Produtos Elétricos - D00EA4 - Porsche Cars North America + B87447 + Convergence Technologies - 784B08 - f.robotics acquisitions Ltd + D01AA7 + UniPrint - 84E4D9 - Shenzhen NEED technology Ltd + E05DA6 + Detlef Fink Elektronik & Softwareentwicklung - 40BC73 - Cronoplast S.L. + 846AED + Wireless Tsukamoto.,co.LTD - 4007C0 - Railtec Systems GmbH + 7463DF + VTS GmbH - A4D3B5 - GLITEL Stropkov, s.r.o. + BC125E + Beijing WisVideo INC. - D43A65 - IGRS Engineering Lab Ltd + 14E4EC + mLogic LLC - F499AC - WEBER Schraubautomaten GmbH + 3828EA + Fujian Netcom Technology Co., LTD - D05099 - ASRock Incorporation + 045A95 + Nokia Corporation - A49EDB - AutoCrib Inc. + 04F4BC + Xena Networks - 1C76CA - Terasic Technologies Inc. + 6C3A84 + Shenzhen Aero-Startech. Co.Ltd - 888964 - GSI Electronics Inc. + 0C9E91 + Sankosha Corporation - 7CD844 - Enmotus Inc + C8F9F9 + Cisco Systems, Inc - 44619C - FONsystem Ltd + 80DB31 + Power Quotient International Co., Ltd. - 70820E - as electronics GmbH + 1C51B5 + Techaya LTD - 0C1105 - Akuvox (Xiamen) Networks Ltd + A45630 + Cisco Systems, Inc - 5C22C4 - DAE EUN Electronics Ltd + 286094 + CAPELEC - F8FEA8 - Technico Japan Corporation + 383F10 + DBL Technology Ltd. - 1800DB - Fitbit Inc. + ACD364 + ABB SPA, ABB SACE DIV. - 78A106 - TP-Link Technologies Ltd + A4EF52 + Telewave Co., Ltd. - 6C6126 - Rinicom Holdings + A826D9 + HTC Corporation - 88685C - Shenzhen ChuangDao & Perpetual Eternal Technology Ltd + 28940F + Cisco Systems, Inc - 102831 - Morion Inc. + B8DAF7 + Advanced Photonics, Inc. - EC2C49 - University Of Tokyo + 143AEA + Dynapower Company LLC - D82916 - Ascent Communication Technology + B4D8A9 + BetterBots - 2CF203 - Emko Elektronik SAN VE TIC AS + 7CC8D7 + Damalisk - B4FE8C - Centro Sicurezza Italia SpA + 942E17 + Schneider Electric Canada Inc - 40E730 - DEY Storage Systems Inc. + 9CB008 + Ubiquitous Computing Technology Corporation - 68B094 - Inesa Electron Ltd - - - A073FC - Rancore Technologies Private Limited + A8776F + Zonoff - 44F849 - Union Pacific Railroad + 00FA3B + CLOOS ELECTRONIC GMBH - CC0DEC - Cisco SPVTG + CC944A + Pfeiffer Vacuum GmbH - 1C37BF - Cloudium Systems Ltd + 0C8525 + Cisco Systems, Inc - 50ABBF - Hoseo Telecom + C46044 + Everex Electronics Limited - 0C722C - TP-Link Technologies Ltd + 98FE03 + Ericsson - North America - 9CE635 - Nintendo Ltd + 20AA4B + Cisco-Linksys, LLC - 60A44C - ASUSTek Computer Inc. + 2CEE26 + Petroleum Geo-Services - 185AE8 - Zenotech Ltd + A086EC + SAEHAN HITEC Co., Ltd - C47DCC - Zebra Technologies Inc + E03C5B + SHENZHEN JIAXINJIE ELECTRON CO.,LTD - E0AEED - Loenk + 2838CF + Gen2wave - E492E7 - Gridlink Tech Ltd + 60B606 + Phorus - CC047C - G-WAY Microwave + 9092B4 + Diehl BGT Defence GmbH & Co. KG - 64535D - Frauscher Sensortechnik + FC455F + JIANGXI SHANSHUI OPTOELECTRONIC TECHNOLOGY CO.,LTD - 3C6FF7 - EnTek Systems Inc. + F04A2B + PYRAMID Computer GmbH - 2C7B5A - Milper Ltd + A85BF3 + Audivo GmbH - D4BF2D - SE Controls Asia Pacific Ltd + B8975A + BIOSTAR Microtech Int'l Corp. - E0D9A2 - Hippih aps + 4833DD + ZENNIO AVANCE Y TECNOLOGIA, S.L. - FC0647 - Cortland Research LLC + 10FC54 + Shany Electronic Co., Ltd. - 6CD146 - FRAMOS GmbH + C02973 + Audyssey Laboratories Inc. - 54E032 - Juniper Networks + 24BC82 + Dali Wireless, Inc. - 5461EA - Zaplox AB + 087572 + Obelux Oy - D08B7E - Passif Semiconductor + 10C2BA + UTT Co., Ltd. - 04586F - Sichuan Whayer Information Industry Ltd + 90D74F + Bookeen - FC9FAE - Fidus Systems Inc + 64C5AA + South African Broadcasting Corporation - 681E8B - InfoSight Corporation + CC6DEF + TJK Tietolaite Oy - D052A8 - Physical Graph Corporation + 9C53CD + ENGICAM s.r.l. - CC3A61 - Samsung Electro Mechanics Ltd + 608645 + Avery Weigh-Tronix, LLC - F8D7BF - REV Ritter GmbH + FC8FC4 + Intelligent Technology Inc. - 48BE2D - Symanitron + 541DFB + Freestyle Energy Ltd - F02329 - Showa Denki Ltd + 24C0B3 + RSF - F073AE - PEAK-System Technik + 603553 + Buwon Technology - 48B8DE - Homewins Technology Ltd + 98AAD7 + BLUE WAVE NETWORKING CO LTD - 10EA59 - Cisco SPVTG + 7C336E + MEG Electronics Inc. - 0C191F - Inform Electronik + B40C25 + Palo Alto Networks - 1065CF - Iqsim + E039D7 + Plexxi, Inc. - 684CA8 - Shenzhen Herotel Tech Ltd + 500B32 + Foxda Technology Industrial(ShenZhen)Co.,LTD - 98208E - Definium Technologies + 302DE8 + JDA, LLC (JDA Systems) - 704AE4 - Rinstrum Pty Ltd + 48A6D2 + GJsun Optical Science and Tech Co.,Ltd. - 083AB8 - Shinoda Plasma Ltd + 68CD0F + U Tek Company Limited - A0DD97 - PolarLink Technologies Ltd + A4E391 + DENY FONTAINE - EC89F5 - Lenovo Mobile Communication Technology Ltd + 603FC5 + COX CO., LTD - B49842 - ZTE Corporation + AC6FD9 + Valueplus Inc. - 7054D2 - Pegatron Corporation + DC1EA3 + Accensus LLC - 645A04 - Chicony Electronics Ltd + A40130 + ABIsystems Co., LTD - AC1702 - Fibar Group sp. z o.o. + 90A783 + JSW PACIFIC CORPORATION - 984CD3 - Mantis Deposition + 28AF0A + Sirius XM Radio Inc - 08606E - ASUSTek Computer Inc. + 5CD4AB + Zektor - 3C57D5 - FiveCo + 64E84F + Serialway Communication Technology Co. Ltd - F84897 - Hitachi Ltd + 2C9EFC + CANON INC. - F80BD0 - Datang Telecom Communication terminal (Tianjin) Ltd + 08FC52 + OpenXS BV - E89AFF - Fujian LANDI Commercial Equipment Ltd + F8462D + SYNTEC Incorporation - 0C8CDC - Suunto Oy + 78A5DD + Shenzhen Smarteye Digital Electronics Co., Ltd - 60C5A8 - Beijing LT Honway Technology Ltd + ECE744 + Omntec mfg. inc - B4DF3B - Chromlech + 08A12B + ShenZhen EZL Technology Co., Ltd - 7C9A9B - VSE valencia smart energy + A00CA1 + SKTB SKiT - 84E714 - Liang Herng Enterprise Ltd + 4C32D9 + M Rutty Holdings Pty. Ltd. - B829F7 - Blaster Tech + D4E33F + Nokia - E4A7FD - Cellco Partnership + 28D1AF + Nokia Corporation - 2CE2A8 - DeviceDesign + F8F7D3 + International Communications Corporation - 00B56D - David Electronics Ltd + 182B05 + 8D Technologies - B80415 - Bayan Audio + 240BB1 + KOSTAL Industrie Elektrik GmbH - D4136F - Asia Pacific Brands + 20EEC6 + Elefirst Science & Tech Co ., ltd - C8E1A7 - Vertu Corporation Limited + E01E07 + Anite Telecoms US. Inc - 4CAB33 - KST technology + 147DC5 + Murata Manufacturing Co., Ltd. - F4472A - Nanjing Rousing Sci. and Tech. Industrial Ltd + 00B9F6 + Shenzhen Super Rich Electronics Co.,Ltd - DC028E - ZTE Corporation + FCC23D + Atmel Corporation - A845E9 - Firich Enterprises Ltd + 88E7A6 + iKnowledge Integration Corp. - 485261 - Soreel + 0462D7 + ALSTOM HYDRO FRANCE - 646223 - Cellient Ltd + D4507A + CEIVA Logic, Inc - 98473C - Shanghai Sunmon Communication Technogy Ltd + CCE7DF + American Magnetics, Inc. - 5481AD - Eagle Research Corporation + A446FA + AmTRAN Video Corporation - 54A04F - t-mac Technologies Ltd + 644346 + GuangDong Quick Network Computer CO.,LTD - 14DB85 - S NET Media + 7C6B33 + Tenyu Tech Co. Ltd. - B8DAF1 - Strahlenschutz- Entwicklungs- und Ausruestungsgesellschaft mbH + 64D989 + Cisco Systems, Inc - D45C70 - Wi-Fi Alliance + 645DD7 + Shenzhen Lifesense Medical Electronics Co., Ltd. - EC473C - Redwire LLC + D4024A + Delphian Systems LLC - 3CC12C - AES Corporation + 0041B4 + Wuxi Zhongxing Optoelectronics Technology Co.,Ltd. - 949BFD - Trans New Technology Inc. + F44450 + BND Co., Ltd. - A00ABF - Wieson Technologies Ltd + EC4670 + Meinberg Funkuhren GmbH & Co. KG - 8CCDE8 - Nintendo Ltd + 2804E0 + FERMAX ELECTRONICA S.A.U. - 7CB232 - Hui Zhou Gaoshengda Technology Ltd + D05A0F + I-BT DIGITAL CO.,LTD - 00E666 - ARIMA Communications Corp. + EC9681 + 2276427 Ontario Inc - 34BDFA - Cisco SPVTG + 5C076F + Thought Creator - F41E26 - Simon-Kaloi Engineering + 3C0FC1 + KBC Networks - 702526 - Nokia + 10F9EE + Nokia Corporation - 18D949 - Qvis Labs LLC + 742B0F + Infinidat Ltd. - D808F5 - Arcadia Networks Ltd + C8F981 + Seneca s.r.l. - 0CC47E - EUCAST Ltd + 58E636 + EVRsafe Technologies - 50724D - BEG Brueck Electronic GmbH + 24497B + Innovative Converged Devices Inc - 783CE3 - Kai-EE + 98E79A + Foxconn(NanJing) Communication Co.,Ltd. - B898B0 - Atlona Inc. + 14307A + Avermetrics - 24694A - Jasmine Systems Inc. + A06CEC + RIM - 080C0B - SysMik GmbH Dresden + A0E9DB + Ningbo FreeWings Technologies Co.,Ltd - DCBF90 - Huizhou Qiaoxing Telecommunication Industry Ltd + 788973 + CMC - 049F06 - Smobile Ltd + 203706 + Cisco Systems, Inc - 289A4B - SteelSeries ApS + 90B97D + Johnson Outdoors Marine Electronics d/b/a Minnkota - A08C15 - Gerhard D. Wempe KG + F4B164 + Lightning Telecommunications Technology Co. Ltd - 90CF6F - Dlogixs Ltd + 70B035 + Shenzhen Zowee Technology Co., Ltd - C8FB26 - Cisco SPVTG + 8821E3 + Nebusens, S.L. - B85810 - Numera Inc. + 7CF429 + NUUO Inc. - ECD950 - IRT SA + 1045BE + Norphonic AS - 7C02BC - Hansung Electronics Ltd + 8C82A8 + Insigma Technology Co.,Ltd - B82410 - Magneti Marelli Slovakia s.r.o. + CCB55A + Fraunhofer ITWM - 105F49 - Cisco SPVTG + AC8ACD + ROGER D.Wensker, G.Wensker sp.j. - 1C5C60 - Shenzhen Belzon Technology Ltd + AC4723 + Genelec - B8B94E - Shenzhen iBaby Labs Inc. + E8BA70 + Cisco Systems, Inc - ACC698 - Kohzu Precision Ltd + D4A425 + SMAX Technology Co., Ltd. - 7C386C - Real Time Logic + 8C11CB + ABUS Security-Center GmbH & Co. KG - 2067B1 - Pluto Inc. + F80332 + Khomp - 189A67 - CSE-Servelec Limited + 984246 + SOL INDUSTRY PTE., LTD - 087D21 - Altasec technology Corporation + 3429EA + MCD ELECTRONICS SP. Z O.O. - F8051C - DRS Imaging and Targeting Solutions + 28A574 + Miller Electric Mfg. Co. - 78D34F - Pace-O-Matic Inc. + 60190C + RRAMAC - A4466B - EOC Technology + D05FCE + Hitachi Data Systems - 901EDD - Great Computer Corporation + D09B05 + Emtronix - 34D7B4 - Tributary Systems Inc. + FC8329 + Trei technics - F40F9B - Wavelink + 90B8D0 + Joyent, Inc. - 645FFF - Nicolet Neuro + 281471 + Lantis co., LTD. - 700BC0 - Dewav Technology Company + 88B168 + Delta Control GmbH - CC14A6 - Yichun MyEnergy Domain Inc. + AC8674 + Open Mesh, Inc. - 109FA9 - Actiontec Electronics Inc. + 64D241 + Keith & Koep GmbH - C0A364 - 3D Systems Massachusetts + 18B79E + Invoxia - 1C5FFF - Beijing Ereneben Information Technology Ltd Shenzhen Branch + CCF841 + Lumewave - 6045BD - Microsoft Corporation + 14EB33 + BSMediasoft Co., Ltd. - 241064 - Shenzhen Ecsino Tecnical Ltd + 685B36 + POWERTECH INDUSTRIAL CO., LTD. - 7CEBEA - Asct + 8C4435 + Shanghai BroadMobi Communication Technology Co., Ltd. - 9C0DAC - Tymphany HK Limited + F81D93 + Longdhua(Beijing) Controls Technology Co.,Ltd - 70B599 - Embedded Technologies s.r.o. + 7CF0BA + Linkwell Telesystems Pvt Ltd - EC4C4D - ZAO NPK RoTeK + D8DF0D + beroNet GmbH - A4D18F - Shenzhen Skyee Optical Fiber Communication Technology Ltd + ACF97E + ELESYS INC. - 58343B - Glovast Technology Ltd + 38D135 + EasyIO Corporation Sdn. Bhd. - 889676 - TTC MARCONI s.r.o. + 94D93C + ENELPS - 5C1737 - I-View Now LLC. + B8BEBF + Cisco Systems, Inc - AC0A61 - Labor S.r.L. + 68876B + INQ Mobile Limited - 1C43EC - Japan Circuit Ltd + 1CAA07 + Cisco Systems, Inc - 54D1B0 - Universal Laser Systems Inc. + 28EE2C + Frontline Test Equipment - 785262 - Shenzhen Hojy Software Ltd + 782EEF + Nokia Corporation - 746A89 - Rezolt Corporation + 64B64A + ViVOtech, Inc. - 741489 - SRT Wireless + 30EB25 + INTEK DIGITAL - 241B13 - Shanghai Nutshell Electronic Ltd + 44E4D9 + Cisco Systems, Inc - 20014F - Linea Research Ltd + ACCA54 + Telldus Technologies AB - EC0ED6 - Itech Instruments SAS + 901900 + SCS SA - 240917 - Devlin Electronics Limited + D45D42 + Nokia Corporation - 9C54CA - Zhengzhou VCOM Science and Technology Ltd + B03829 + Siliconware Precision Industries Co., Ltd. - B43564 - Fujian Tian Cheng Electron Science & Technical Development Ltd + 7C6C39 + PIXSYS SRL - 00BF15 - Genetec Inc. + BC2846 + NextBIT Computing Pvt. Ltd. - 38EE9D - Anedo Ltd + BC0F2B + FORTUNE TECHGROUP CO.,LTD - 78BEBD - STULZ GmbH + 648125 + Alphatron Marine BV - D4DF57 - Alpinion Medical Systems + 8CF9C9 + MESADA Technology Co.,Ltd. - 5048EB - Beijing Haihejinsheng Network Technology Ltd + 042605 + Bosch Building Automation GmbH - B40E96 - Heran + C0626B + Cisco Systems, Inc - 508C77 - DIRMEIER Schanktechnik GmbH &Co KG + 94E226 + D. ORtiz Consulting, LLC - 40704A - Power Idea Technology Limited + CCF67A + Ayecka Communication Systems LTD - 545EBD - NL Technologies + D8C99D + EA DISPLAY LIMITED - F47F35 - Cisco Systems Inc. + 1083D2 + Microseven Systems, LLC - BCC168 - DinBox Sverige AB + 204005 + feno GmbH - DC309C - Heyrex Limited + 300B9C + Delta Mobile Systems, Inc. - 2C00F7 - XOS + D46F42 + WAXESS USA Inc - 28F606 - Syes srl + 04C5A4 + Cisco Systems, Inc - 0CAF5A - Genus Power Infrastructures Limited + 18B3BA + Netlogic AB - 7CEF8A - Inhon International Ltd + D47B75 + HARTING Electronics GmbH - 241125 - Hutek Ltd + 8C5FDF + Beijing Railway Signal Factory - B431B8 - Aviwest + 24F0FF + GHT Co., Ltd. - CC187B - Manzanita Systems Inc. + 9CC0D2 + Conductix-Wampfler GmbH - 08BE09 - Astrol Electronic AG + 6CAD3F + Hubbell Building Automation, Inc. - B41DEF - Internet Laboratories Inc. + DCD87F + Shenzhen JoinCyber Telecom Equipment Ltd - 809393 - Xapt GmbH + B4E0CD + Fusion-io, Inc - A007B6 - Advanced Technical Support Inc. + 286046 + Lantech Communications Global, Inc. - 0CD2B5 - Binatone Telecommunication Pvt Ltd + 10E2D5 + Qi Hardware Inc. - 4846F1 - Uros Oy + EC986C + Lufft Mess- und Regeltechnik GmbH - B827EB - Raspberry Pi Foundation + D093F8 + Stonestreet One LLC - 84AF1F - Beat System Service Ltd + 9C645E + Harman Consumer Group - B058C4 - Broadcast Microwave Services Inc. + 1C334D + ITS Telecom - 745798 - TRUMPF Laser GmbH + Co. KG + 34684A + Teraworks Co., Ltd. - 2817CE - Omnisense Ltd + CCFC6D + RIZ TRANSMITTERS - 3CCE73 - Cisco Systems Inc. + E03E7D + data-complex GmbH - B0BD6D - Echostreams Innovative Solutions + 0CC6AC + DAGS - 6044F5 - Easy Digital Ltd + 4CB9C8 + CONET CO., LTD. - 90AC3F - BrightSign LLC + 78593E + RAFI GmbH & Co.KG - AC51EE - Cambridge Communication Systems Ltd + 509772 + Westinghouse Digital - 78A183 - Advidia + 303955 + Shenzhen Jinhengjia Electronic Co., Ltd. - A8D0E5 - Juniper Networks + FC5B24 + Weibel Scientific A/S - F89955 - Fortress Technology Inc + 503DE5 + Cisco Systems, Inc - 4CC94F - Nokia + 8CB64F + Cisco Systems, Inc - 0CE5D3 - DH electronics GmbH + EC4644 + TTK SAS - E425E9 - Color-Chip + 540496 + Gigawave LTD - 14B1C8 - InfiniWing Inc. + 8065E9 + BenQ Corporation - E840F2 - Pegatron Corporation + 0474A1 + Aligera Equipamentos Digitais Ltda - 50053D - CyWee Group Ltd + 5C6984 + NUVICO - F88C1C - Kaishun Electronic Technology Ltd Beijing + B8415F + ASP AG - 1C0B52 - Epicom S.A + 2CB69D + RED Digital Cinema - 747E2D - Beijing Thomson CITIC Digital Technology Ltd + 20FECD + System In Frontier Inc. - 885C47 - Alcatel Lucent + F0933A + NxtConect - 3CC1F6 - Melange Systems Pvt Ltd + 70DDA1 + Tellabs - 94FAE8 - Shenzhen Eycom Technology Ltd + 94D019 + Cydle Corp. - B48255 - Research Products Corporation + 8C278A + Vocollect Inc - 8016B7 - Brunel University + CC0CDA + Miljovakt AS - 008DDA - Link One Ltd + A86A6F + RIM - C49805 - Minieum Networks Inc. + 500E6D + TrafficCast International - 90F4C1 - Rand McNally + EC3BF0 + NovelSat - 18193F - Tamtron Oy + 4CEDDE + ASKEY COMPUTER CORP - 944444 - LG Innotek + E8E08F + GRAVOTECH MARKING SAS - 4C64D9 - Guangdong Leawin Group Ltd + 60C980 + Trymus - 940149 - AutoHotBox + A036FA + Ettus Research LLC - 1CB094 - HTC Corporation + EC836C + RM Tech Co., Ltd. - 9C0111 - Shenzhen Newabel Electronic Ltd + E41C4B + V2 TECHNOLOGY, INC. - 400E67 - Tremol Ltd + 5CF3FC + IBM Corp - C0DF77 - Conrad Electronic SE + 582F42 + Universal Electric Corporation - 3055ED - Trex Network LLC + 204AAA + Hanscan Spain S.A. - F0F755 - Cisco Systems Inc. + 401D59 + Biometric Associates, LP - 1CB243 - TDC A/S + B8FF6F + Shanghai Typrotech Technology Co.Ltd - 38BF33 - NEC CASIO Mobile Communications + 68122D + Special Instrument Development Co., Ltd. - B467E9 - Qingdao GoerTek Technology Ltd + 94F720 + Tianjin Deviser Electronics Instrument Co., Ltd - 186751 - KOMEG Industrielle Messtechnik GmbH + DC9C52 + Sapphire Technology Limited. - 645EBE - Yahoo! JAPAN + 4891F6 + Shenzhen Reach software technology CO.,LTD - CCC50A - Shenzhen Dajiahao Technology Ltd + 649B24 + V Technology Co., Ltd. - 1CB17F - NEC Platforms Ltd + 846EB1 + Park Assist LLC - E42C56 - Lilee Systems Ltd + A89B10 + inMotion Ltd. - 48ED80 - daesung eltec + B41489 + Cisco Systems, Inc - C80718 - TDSi + A0B5DA + HongKong THTF Co., Ltd - 581D91 - Advanced Mobile Telecom Ltd + 8886A0 + Simton Technologies, Ltd. - D8BF4C - Victory Concept Electronics Limited + A45055 + BUSWARE.DE - 3CB9A6 - Belden Deutschland GmbH + ACAB8D + Lyngso Marine A/S - 8C0CA3 - Amper + 6083B2 + GkWare e.K. - 94DF58 - IJ Electron Ltd + 80D019 + Embed, Inc - 48D54C - Jeda Networks + 68EBC5 + Angstrem Telecom - 8CDE52 - ISSC Technologies Corp. + E8995A + PiiGAB, Processinformation i Goteborg AB - 082522 - Advansee + 1CBD0E + Amplified Engineering Pty Ltd - 4C2F9D - ICM Controls + A0F217 + GE Medical System(China) Co., Ltd. - E467BA - Danish Interpretation Systems A/S + F0A764 + GST Co., Ltd. - BCB852 - Cybera Inc. + 1C0656 + IDY Corporation - C49300 - 8Devices + 6C504D + Cisco Systems, Inc - 6CA682 - EDAM Information & Communications + B8D06F + GUANGZHOU HKUST FOK YING TUNG RESEARCH INSTITUTE - 28D576 - Premier Wireless Inc. + EC14F6 + BioControl AS - 70D6B6 - Metrum Technologies + 7076F0 + LevelOne Communications (India) Private Limited - C0A0DE - Multi Touch Oy + 088DC8 + Ryowa Electronics Co.,Ltd - 40BC8B - itelio GmbH + 5C17D3 + LGE - 9CA134 - Nike Inc. + 8CE7B3 + Sonardyne International Ltd - 50FC30 - Treehouse Labs + 1CDF0F + Cisco Systems, Inc - B89674 - AllDSP GmbH & Co. KG + 68BDAB + Cisco Systems, Inc - 48E1AF - Vity + 9CADEF + Obihai Technology, Inc. - 1CBBA8 - OJSC Ufimskiy Zavod Promsvyaz + D08999 + APCON, Inc. - 006BA0 - Shenzhen Universal Intellisys PTE Ltd + C88447 + Beautiful Enterprise Co., Ltd - A898C6 - Shinbo Ltd + A4A80F + Shenzhen Coship Electronics Co., Ltd. - B4211D - Beijing GuangXin Technology Ltd + F8B599 + Guangzhou CHNAVS Digital Technology Co.,Ltd - 903CAE - Yunnan KSEC Digital Technology Ltd + B8921D + BG T&A - 70704C - Purple Communications Inc. + C88B47 + Nolangroup S.P.A con Socio Unico - D89760 - C2 Development Inc. + C4CD45 + Beijing Boomsense Technology CO.,LTD. - F47ACC - SolidFire Inc. + 54FDBF + Scheidt & Bachmann GmbH - 905682 - Lenbrook Industries Limited + D0BB80 + SHL Telemedicine International Ltd. - F0DA7C - RLH Industries,Inc. + E061B2 + HANGZHOU ZENOINTEL TECHNOLOGY CO., LTD - AC319D - Shenzhen TG-NET Botone Technology Ltd + 9411DA + ITF Fröschl GmbH - 20107A - Gemtek Technology Ltd + 8039E5 + PATLITE CORPORATION - 78DDD6 - c-scape + DC7B94 + Cisco Systems, Inc - C09132 - Patriot Memory + 5CCA32 + Theben AG - 90185E - Apex Tool Group GmbH & Co OHG + C02BFC + iNES. applied informatics GmbH - F8FE5C - Reciprocal Labs Corp + 94C7AF + Raylios Technology - 6C9CED - Cisco Systems Inc. + D81C14 + Compacta International, Ltd. - 2486F4 - Ctek Inc. + 008C10 + Black Box Corp. - C4237A - WhizNets Inc. + B0B8D5 + Nanjing Nengrui Auto Equipment CO.,Ltd - F4E6D7 - Solar Power Technologies Inc. + 94E711 + Xirka Dama Persada PT - B87424 - Viessmann Elektronik GmbH + 90903C + TRISON TECHNOLOGY CORPORATION - B451F9 - NB Software + 80C6CA + Endian s.r.l. - 30168D - ProLon + 14FEAF + SAGITTAR LIMITED - E4AFA1 - HES-SO + B081D8 + I-sys Corp - A887ED - ARC Wireless LLC + 6C9B02 + Nokia Corporation - D4D249 - Power Ethernet + 641E81 + Dowslake Microsystems - 80427C - Adolf Tedsen GmbH & Co. KG + EC542E + Shanghai XiMei Electronic Technology Co. Ltd - E0DADC - JVC KENWOOD Corporation + F0E5C3 + Drägerwerk AG & Co. KG aA - E843B6 - QNAP Systems Inc. + E05B70 + Innovid, Co., Ltd. - B89BC9 - SMC Networks Inc + 043604 + Gyeyoung I&T - 409FC7 - BAEKCHUN I&C Ltd + A4B2A7 + Adaxys Solutions AG - 00FC58 - WebSilicon Ltd + D0D0FD + Cisco Systems, Inc - 983571 - Sub10 Systems Ltd + FCD4F6 + Messana Air.Ray Conditioning s.r.l. - 5404A6 - ASUSTek Computer Inc. + D466A8 + Riedo Networks Ltd - 186D99 - Adanis Inc. + F41F0B + YAMABISHI Corporation - A0E201 - AVTrace Ltd(China) + A082C7 + P.T.I Co.,LTD - F0DEB9 - ShangHai Y&Y Electronics Ltd + D82986 + Best Wish Technology LTD - 7CA61D - MHL LLC + 446132 + ecobee inc - 9CF67D - Ricardo Prague, s.r.o. + 7415E2 + Tri-Sen Systems Corporation - 98C845 - PacketAccess + D48FAA + Sogecam Industrial, S.A. - 989080 - Linkpower Network System Inc Ltd + 78A714 + Amphenol - F83376 - Good Mind Innovation Ltd + F450EB + Telechips Inc - 50F61A - Kunshan JADE Technologies Ltd + E87AF3 + S5 Tech S.r.l. - 542018 - Tely Labs + 141BBD + Volex Inc. - 581FEF - Tuttnaer Ltd + F893F3 + VOLANS - 58BDA3 - Nintendo Ltd + 7866AE + ZTEC Instruments, Inc. - F8F25A - G-Lab GmbH + 4C022E + CMR KOREA CO., LTD - 307ECB - SFR + 34AAEE + Mikrovisatos Servisas UAB - 68F125 - Data Controls Inc. + 90E0F0 + IEEE 1722a Working Group - BC764E - Rackspace US Inc. + F8AC6D + Deltenna Ltd - CCC8D7 - CIAS Elettronica srl + 18B209 + Torrey Pines Logic, Inc - 84D32A - IEEE 1905.1 + 988EDD + TE Connectivity Limerick - 4C0289 - LEX Computech Ltd + 98FC11 + Cisco-Linksys, LLC - C0E54E - ARIES Embedded GmbH + 34E0D7 + DONGGUAN QISHENG ELECTRONICS INDUSTRIAL CO., LTD - F8C001 - Juniper Networks + D84606 + Silicon Valley Global Marketing - 187C81 - Valeo Vision Systems + 40520D + Pico Technology - ACCC8E - Axis Communications AB + 807D1B + Neosystem Co. Ltd. - 8C94CF - Encell Technology Inc. + 48FCB8 + Woodstream Corporation - 6CA780 - Nokia Corporation + C848F5 + MEDISON Xray Co., Ltd - 3057AC - Irlab Ltd + 1880CE + Barberry Solutions Ltd - 842B50 - Huria Ltd + D84B2A + Cognitas Technologies, Inc. - 48F7F1 - Nokia + 684B88 + Galtronics Telemetry Inc. - 8C8E76 - taskit GmbH + A4AE9A + Maestro Wireless Solutions ltd. - A0133B - HiTi Digital Inc. + CC5C75 + Weightech Com. Imp. Exp. Equip. Pesagem Ltda - 9C5711 - Feitian Xunda(Beijing) Aeronautical Information Technology Ltd + 74B9EB + JinQianMao Technology Co.,Ltd. - 88F488 - cellon Communications technology(Shenzhen) Ltd + D45297 + nSTREAMS Technologies, Inc. - 448E12 - DT Research Inc. + A4561B + MCOT Corporation - B8BB6D - ENERES Ltd + 80C63F + Remec Broadband Wireless , LLC - 14373B - PROCOM Systems + 40D40E + Biodata Ltd - 1897FF - TechFaith Wireless Technology Limited + 0C826A + Wuhan Huagong Genuine Optics Technology Co., Ltd - 4C5585 - Hamilton Systems + 7C051E + RAFAEL LTD. - ECEA03 - Darfon Lighting Corp + E0271A + TTC Next-generation Home Network System WG - 30F9ED - Sony Corporation + 0097FF + Heimann Sensor GmbH - 582EFE - Lighting Science Group + E4AB46 + UAB Selteka - CC60BB - Empower RF Systems + 945B7E + TRILOBIT LTDA. - 7CDD20 - IOXOS Technologies S.A. + 04E548 + Cohda Wireless Pty Ltd - ECF236 - Neomontana Electronics + 2893FE + Cisco Systems, Inc - 0418B6 - Private + F4C795 + WEY Technology AG - E4A5EF - Tron Link Electronics Ltd + 781185 + NBS Payment Solutions Inc. - 3071B2 - Hangzhou Prevail Optoelectronic Equipment Ltd + 78A2A0 + Nintendo Co., Ltd. - DCCE41 - FE Global Hong Kong Limited + 24B6B8 + FRIEM SPA - FC6C31 - LXinstruments GmbH + D4000D + Phoenix Broadband Technologies, LLC. - 705CAD - Konami Gaming Inc + AC5135 + MPI TECH - 3C6F45 - Fiberpro Inc. + 44D63D + Talari Networks - 703187 - ACX GmbH + 08F6F8 + GET Engineering - 30E4DB - Cisco Systems Inc. + 7071BC + PEGATRON CORPORATION - 88E0F3 - Juniper Networks + 7884EE + INDRA ESPACIO S.A. - 80971B - Altenergy Power System,Inc. + 10090C + JANOME Corporation - 587675 - Beijing ECHO Technologies Ltd + E01CEE + Bravo Tech, Inc. - 0C51F7 - Chauvin Arnoux + A4C2AB + Hangzhou LEAD-IT Information & Technology Co.,Ltd - 0CFC83 - Airoha Technology Corp., + 48AA5D + Store Electronic Systems - 007F28 - Actiontec Electronics Inc. + 0CC9C6 + Samwin Hong Kong Limited - 804731 - Packet Design Inc. + 1062C9 + Adatis GmbH & Co. KG - B09BD4 - GNH Software India Private Limited + D8AE90 + Itibia Technologies - F08BFE - Costel. Ltd + E85E53 + Infratec Datentechnik GmbH - 3C26D5 - Sotera Wireless + 88BA7F + Qfiednet Co., Ltd. - E84E06 - Edup International (HK) Ltd + 64DB18 + OpenPattern - 00077D - Cisco Systems Inc. + 5C35DA + There Corporation Oy - CCD9E9 - SCR Engineers Ltd + 3C4C69 + Infinity System S.L. - 34A709 - Trevil srl + 7830E1 + UltraClenz, LLC - E0C922 - Jireh Energy Tech Ltd + B09134 + Taleo - 905F8D - modas GmbH + D05875 + Active Control Technology Inc. - 98293F - Fujian Start Computer Equipment Ltd + D81BFE + TWINLINX CORPORATION - B45CA4 - Thing-talk Wireless Communication Technologies Corporation Limited + 042F56 + ATOCS (Shenzhen) LTD - 908D1D - GH Technologies + 90A2DA + GHEO SA - 444F5E - Pan Studios Ltd + 9889ED + Anadem Information Inc. - D0AFB6 - Linktop Technology Ltd + FC4463 + Universal Audio, Inc - 98EC65 - Cosesy ApS + C8EF2E + Beijing Gefei Tech. Co., Ltd - ACC935 - Ness Corporation + 102D96 + Looxcie Inc. - 008D4E - Cjsc NII STT + B8653B + Bolymin, Inc. - 98F8DB - Marini Impianti Industriali s.r.l. + 38E8DF + b gmbh medien + datenbanken - E41289 - topsystem Systemhaus GmbH + 1C129D + IEEE PES PSRC/SUB - 58E808 - Autonics Corporation + E0CA4D + Shenzhen Unistar Communication Co.,LTD - DC05ED - Nabtesco Corporation + A06986 + Wellav Technologies Ltd - 4C98EF - Zeo + EC8EAD + DLX - 00A1DE - Shenzhen ShiHua Technology Ltd + F0B6EB + Poslab Technology Co., Ltd. - 806CBC - NET New Electronic Technology GmbH + 1C8F8A + Phase Motion Control SpA - 909060 - RSI Video Technologies + FCCCE4 + Ascon Ltd. - BC8199 - BASIC Ltd + 60B3C4 + Elber Srl - DCA7D9 - Compressor Controls Corp + 04C880 + Samtec Inc - 38FEC5 - Ellips B.V. + BCD5B6 + d2d technologies - C455A6 - Cadac Holdings Ltd + FC683E + Directed Perception, Inc - 5C7757 - Haivision Network Video + 28E794 + Microtime Computer Inc. - D4D898 - Korea CNO Tech Ltd + 34C69A + Enecsys Ltd - B4AA4D - Ensequence Inc. + F88DEF + Tenebraex - B83D4E - Shenzhen Cultraview Digital Technology Ltd Shanghai Branch + 042234 + Wireless Standard Extensions - 5087B8 - Nuvyyo Inc + 94592D + EKE Building Technology Systems Ltd - C0EAE4 - Sonicwall + CC69B0 + Global Traffic Technologies, LLC - 0838A5 - Funkwerk plettac electronic GmbH + 80C862 + Openpeak, Inc - CC1EFF - Metrological Group BV + 0CD502 + Westell Technologies Inc. - 184E94 - Messoa Technologies Inc. + 5850E6 + Best Buy Corporation - 6C391D - Beijing ZhongHuaHun Network Information center + 3C1CBE + JADAK LLC - 80B32A - UK Grid Solutions Ltd + 7C08D9 + Shanghai B-Star Technology Co - 405539 - Cisco Systems Inc. + A0BFA5 + CORESYS - E0F211 - Digitalwatt + B05B1F + THERMO FISHER SCIENTIFIC S.P.A. - F86971 - Seibu Electric + ECE9F8 + Guang Zhou TRI-SUN Electronics Technology Co., Ltd - 44AA27 - udworks Ltd + 34CE94 + Parsec (Pty) Ltd - E8F928 - Rftech SRL + A438FC + Plastic Logic - 1C955D - I-LAX Electronics Inc. + 18FC9F + Changhe Electronics Co., Ltd. - 60F59C - CRU-Dataport + A0593A + V.D.S. Video Display Systems srl - B0A72A - Ensemble Designs Inc. + CCEA1C + DCONWORKS Co., Ltd - 6400F1 - Cisco Systems Inc. + 687F74 + Cisco-Linksys, LLC - B8F4D0 - Herrmann Ultraschalltechnik GmbH & Co. Kg + 38E98C + Reco S.p.A. - 08ACA5 - Benu Video Inc. + 2059A0 + Paragon Technologies Inc. - 586D8F - Cisco-Linksys LLC + E4FFDD + ELECTRON INDIA - 10E3C7 - Seohwa Telecom + 68A1B7 + Honghao Mingchuan Technology (Beijing) CO.,Ltd. - 7465D1 - Atlinks + 0CD7C2 + Axium Technologies, Inc. - 040A83 - Alcatel-Lucent + C4198B + Dominion Voting Systems Corporation - C45600 - Galleon Embedded Computing + 10880F + Daruma Telecomunicações e Informática S.A. - BC3E13 - Accordance Systems Inc. + FC6198 + NEC Personal Products, Ltd - A81B18 - XTS Corp + 74D850 + Evrisko Systems - D0A311 - Neuberger Gebaudeautomation GmbH + 78998F + MEDILINE ITALIA SRL - 041D10 - Dream Ware Inc. + F8472D + X2gen Digital Corp. Ltd - 801440 - Sunlit System Technology Corp + 849000 + Arnold&Richter Cine Technik GmbH & Co. Betriebs KG - 180B52 - Nanotron Technologies GmbH + 08184C + A. S. Thomas, Inc. - DC07C1 - HangZhou QiYang Technology Ltd + E84ECE + Nintendo Co., Ltd. - C0A26D - Abbott Point Of Care + 1045F8 + LNT-Automation GmbH - 00BB8E - HME Ltd + DCE71C + AUG Elektronik GmbH - D82A7E - Nokia Corporation + A870A5 + UniComm Inc. - 801F02 - Edimax Technology Ltd + D0D286 + Beckman Coulter K.K. - 58EECE - Icon Time Systems + 24D2CC + SmartDrive Systems Inc. - 647FDA - TEKTELIC Communications Inc. + 0CEF7C + AnaCom Inc - AC0613 - Senselogix Ltd + 40ECF8 + Siemens AG - 747818 - Jurumani Solutions + 54B620 + SUHDOL E&C Co.Ltd. - E01F0A - Xslent Energy Technologies. LLC + 78C40E + H&D Wireless - 443719 - 2 Save Energy Ltd + C8873B + Net Optics - 84EA99 - Vieworks + 2C0623 + Win Leader Inc. - E00C7F - Nintendo Ltd + 0C2755 + Valuable Techologies Limited - E48AD5 - RF Window Ltd + BCB181 + SHARP CORPORATION - FCF1CD - Optex-FA Ltd + E41F13 + IBM Corp - 4425BB - Bamboo Entertainment Corporation + C83A35 + Tenda Technology Co., Ltd. - 7CDA84 - Dongnian Networks Inc. + 6C8CDB + Otus Technologies Ltd - BCC61A - Spectra Embedded Systems + 40F52E + Leica Microsystems (Schweiz) AG - 0470BC - Globalstar Inc. + 906DC8 + DLG Automação Industrial Ltda - 88DD79 - Voltaire + 4456B7 + Spawn Labs, Inc - 64F987 - Avvasi Inc. + 44C9A2 + Greenwald Industries - D85D84 - CAx soft GmbH + 406186 + MICRO-STAR INT'L CO.,LTD - D4E32C - S. Siedle & Sohne + A8CE90 + CVC - 7C6ADB - SafeTone Technology Ltd + 002721 + Shenzhen Baoan Fenda Industrial Co., Ltd - 902E87 - LabJack + 584CEE + Digital One Technologies, Limited - A424B3 - FlatFrog Laboratories AB + A07332 + Cashmaster International Limited - 94CDAC - Creowave Oy + 64C6AF + AXERRA Networks Ltd - 144C1A - Max Communication GmbH + 701AED + ADVAS CO., LTD. - 340804 - D-Link Corporation + 6465C0 + Nuvon, Inc - F05D89 - Dycon Limited + 00271A + Geenovo Technology Ltd. - AC80D6 - Hexatronic AB + 002714 + Grainmustards, Co,ltd. - 9CF938 - AREVA NP GmbH + 002715 + Rebound Telecom. Co., Ltd - 8CDB25 - ESG Solutions + 00270F + Envisionnovation Inc - FC3598 - Favite Inc. + 00270A + IEE S.A. - 90D92C - HUG-Witschi AG + 002709 + Nintendo Co., Ltd. - 988E34 - Zhejiang Boxsam Electronic Ltd + 44568D + PNC Technologies Co., Ltd. - C471FE - Cisco Systems Inc. + 7C1EB3 + 2N TELEKOMUNIKACE a.s. - 4022ED - Digital Projection Ltd + 002701 + INCOstartec GmbH - 989449 - Skyworth Wireless Technology Ltd + 0026FB + AirDio Wireless, Inc. - 2CA157 - acromate Inc. + 0026F5 + XRPLUS Inc. - 942053 - Nokia Corporation + 0026F8 + Golden Highway Industry Development Co., Ltd. - 28852D - Touch Networks + 0026DF + TaiDoc Technology Corp. - B8BA68 - Xi'an Jizhong Digital Communication Ltd + 0026D8 + Magic Point Inc. - B0B32B - Slican Sp. z o.o. + 0026D6 + Ningbo Andy Optoelectronic Co., Ltd. - 5842E4 - Baxter International Inc + 0026A2 + Instrumentation Technology Systems - B8797E - Secure Meters (UK) Limited + 00269F + Private - CC9E00 - Nintendo Ltd + 002699 + Cisco Systems, Inc - 58A76F - iD Corporation + 0026F4 + Nesslab - 0006F6 - Cisco Systems Inc. + 0026EE + TKM GmbH - 747DB6 - Aliwei Communications Inc. + 0026EF + Technology Advancement Group, Inc. - B06563 - Shanghai Railway Communication Factory + 0026E6 + Visionhitech Co., Ltd. - 4018D7 - Smartronix Inc. + 0026B2 + Setrix GmbH - 4C2C80 - Beijing Skyway Technologies Ltd + 0026AF + Duelco A/S - D49E6D - Wuhan Zhongyuan Huadian Science & Technology + 0026B3 + Thales Communications Inc - 6C2E33 - Accelink Technologies Ltd + 0026D1 + S Squared Innovations Inc. - 40987B - Aisino Corporation + 0026D3 + Zeno Information System - BC38D2 - Pandachip Limited + 0026CB + Cisco Systems, Inc - 2005E8 - OOO InProMedia + 002687 + corega K.K - F00248 - SmarteBuilding + 00268D + CellTel S.p.A. - AC6F4F - Enspert Inc + 002628 + companytec automação e controle ltda. - E82877 - TMY Ltd + 00261F + SAE Magnetics (H.K.) Ltd. - F0C88C - LeddarTech Inc. + 00261E + QINGBANG ELEC(SZ) CO., LTD - 4037AD - Macro Image Technology Inc. + 002619 + FRC - 28ED58 - JAG Jakob AG + 002640 + Baustem Broadband Technologies, Ltd. - 486B91 - Fleetwood Group Inc. + 002633 + MIR - Medical International Research - 643409 - BITwave Pte Ltd + 00266A + ESSENSIUM NV - 40C245 - Shenzhen Hexicom Technology Ltd + 00266B + SHINE UNION ENTERPRISE LIMITED - CC55AD - RIM + 002667 + CARECOM CO.,LTD. - E8757F - FIRS Technologies(Shenzhen) Ltd + 0025FE + Pilot Electronics Corporation - F0F7B3 - Phorm + 0025FA + J&M Analytik AG - 00D38D - Hotel Technology Next Generation + 002647 + WFE TECHNOLOGY CORP. - C83EA7 - KUNBUS GmbH + 002653 + DaySequerra Corporation - 60893C - Thermo Fisher Scientific P.O.A. + 002630 + ACOREL S.A.S - D86BF7 - Nintendo Ltd + 00262A + Proxense, LLC - 74CD0C - Smith Myers Communications Ltd + 00267B + GSI Helmholtzzentrum für Schwerionenforschung GmbH - CCCE40 - Janteq Corp + 002596 + GIGAVISION srl - B8EE79 - YWire Technologies Inc. + 002595 + Northwest Signal Supply, Inc - 74D675 - WYMA Tecnologia + 00258F + Trident Microsystems, Inc. - B40EDC - LG-Ericsson Ltd + 002589 + Hills Industries Limited - E0EE1B - Panasonic Automotive Systems Company Of America + 002585 + KOKUYO S&T Co., Ltd. - 74BE08 - ATEK Products LLC + 0025C9 + SHENZHEN HUAPU DIGITAL CO., LTD - 6063FD - Transcend Communication Beijing Ltd + 0025BE + Tektrap Systems Inc. - D8B6C1 - NetworkAccountant Inc. + 0025EA + Iphion BV - 74A4A7 - QRS Music Technologies Inc. + 0025F0 + Suga Electronics Limited - 700258 - 01DB-Metravib + 0025B5 + Cisco Systems, Inc - F455E0 - Niceway CNC Technology LtdHunan Province + 0025E8 + Idaho Technology - 20FDF1 - 3Com Europe Ltd + 0025E4 + OMNI-WiFi, LLC - 8497B8 - Memjet Inc. + 002581 + x-star networks Inc. - A0DDE5 - Sharp Corporation + 0025A0 + Nintendo Co., Ltd. - 206AFF - Atlas Elektronik UK Limited + 00259B + Beijing PKUNITY Microsystems Technology Co., Ltd - AC34CB - Shanhai GBCOM Communication Technology Ltd + 0025D7 + CEDO - 9088A2 - Ionics Technology ME Ltda + 0025D8 + KOREA MAINTENANCE - 40CD3A - Z3 Technology + 0025D2 + InpegVision Co., Ltd - 482CEA - Motorola Inc Business Light Radios + 00254D + Singapore Technologies Electronics Limited - 00336C - SynapSense Corporation + 00254C + Videon Central, Inc. - F866F2 - Cisco Systems Inc. + 002543 + MONEYTECH - AC6123 - Drivven Inc. + 00257B + STJ ELECTRONICS PVT LTD - 100C24 - pomdevices LLC + 00257C + Huachentel Technology Development Co., Ltd - 58F6BF - Kyoto University + 002575 + FiberPlex Technologies, LLC - 78EC22 - Shanghai Qihui Telecom Technology Ltd + 002570 + Eastern Communications Company Limited - 0C15C5 - SDTEC Ltd + 00256A + inIT - Institut Industrial IT - FC75E6 - Handreamnet + 002562 + interbro Co. Ltd. - A0A763 - Polytron Vertrieb GmbH + 002551 + SE-Elektronic GmbH - EC2368 - IntelliVoice Ltd + 00255B + CoachComm, LLC - 749050 - Renesas Electronics Corporation + 002516 + Integrated Design Tools, Inc. - 389592 - Beijing Tendyron Corporation + 002510 + Pico-Tesla Magnetic Therapies - A4218A - Nortel Networks + 002520 + SMA Railway Technology GmbH - F8FB2F - Santur Corporation + 002527 + Bitrode Corp. - 2CCD43 - Summit Technology Group + 002525 + CTERA Networks Ltd. - 64995D - LGE + 00253A + CEVA, Ltd. - 7CEF18 - Creative Product Design Pty Ltd + 0024F7 + Cisco Systems, Inc - FC7CE7 - FCI USA LLC + 0024F3 + Nintendo Co., Ltd. - 145412 - Entis Ltd + 0024B9 + Wuhan Higheasy Electronic Technology Development Co.Ltd - 7C3E9D - Patech + 0024BD + Hainzl Industriesysteme GmbH - 244597 - GEMUE Gebr. Mueller Apparatebau + 0024E0 + DS Tech, LLC - 78818F - Server Racks Australia Pty Ltd + 0024E2 + HASEGAWA ELECTRIC CO.,LTD. - 284846 - GridCentric Inc. + 0024C8 + Broadband Solutions Group - 30694B - RIM + 0024C5 + Meridian Audio Limited - 6C626D - Micro-Star International + 0024E5 + Seer Technology, Inc - 28068D - ITL LLC + 002501 + JSC Supertel - C00D7E - Additech Inc. + 002435 + WIDE CORPORATION - 84C7A9 - C3PO S.A. + 002431 + Uni-v co.,ltd - D87157 - Lenovo Mobile Communication Technology Ltd + 002432 + Neostar Technology Co.,LTD - 609AA4 - GVI Security Inc. + 002430 + Ruby Tech Corp. - 641084 - HEXIUM Technical Development Ltd + 00242E + Datastrip Inc. - 342109 - Jensen Scandinavia AS + 002458 + PA Bastion CC - 3C106F - Albahith Technologies + 00245D + Terberg besturingstechniek B.V. - 0CDDEF - Nokia Corporation + 002450 + Cisco Systems, Inc - ECFE7E - BlueRadios Inc. + 002496 + Ginzinger electronic systems - E4AD7D - SCL Elements + 002499 + Aquila Technologies - F09CBB - RaonThink Inc. + 00248A + Kaga Electronics Co., Ltd. - 10CCDB - Aximum Produits Electroniques + 002487 + Transact Campus, Inc. - 38C7BA - CS Services Ltd + 002477 + Tibbo Technology - EC5C69 - Mitsubishi Heavy Industries Mechatronics Systems Ltd + 00246E + Phihong USA Corp. - 6C92BF - Inspur Electronic Information Industry Ltd + 002473 + 3COM EUROPE LTD - 44A8C2 - Sewoo Tech Ltd + 002443 + Nortel Networks - 80EE73 - Shuttle Inc. + 002441 + Wanzl Metallwarenfabrik GmbH - FCE23F - Clay Paky SPA + 00243B + CSSI (S) Pte Ltd - 58570D - Danfoss Solar Inverters + 002451 + Cisco Systems, Inc - C4823F - Fujian Newland Auto-ID Tech Ltd + 00244A + Voyant International - E85B5B - LG Electronics Inc + 002447 + Kaztek Systems - BCA9D6 - Cyber-Rain Inc. + 00246B + Covia, Inc. - 6C3E9C - KE Knestel Elektronik GmbH + 0023B8 + Sichuan Jiuzhou Electronic Technology Co.,Ltd - 8CD628 - Ikor Metering + 0023BA + Chroma - 243C20 - Dynamode Group + 0023BC + EQ-SYS GmbH - 3C39C3 - JW Electronics Ltd + 0023B1 + Longcheer Technology (Singapore) Pte Ltd - 3C05AB - Product Creation Studio + 0023F5 + WILO SE - F04335 - DVN(Shanghai) Ltd + 0023FF + Beijing HTTC Technology Ltd. - A479E4 - KLINFO Corp + 0023F6 + Softwell Technology Co., Ltd. - 481BD2 - Intron Scientific Ltd + 0023F3 + Glocom, Inc. - D0F0DB - Ericsson + 0023F0 + Shanghai Jinghan Weighing Apparatus Co. Ltd. - 7C1476 - Damall Technologies SAS + 00241A + Red Beetle Inc. - 8C541D - LGE + 002414 + Cisco Systems, Inc - 00A2DA - INAT GmbH + 002410 + NUETEQ Technology,Inc. - 003CC5 - WONWOO Engineering Ltd + 0023CC + Nintendo Co., Ltd. - F077D0 - Xcellen + 002408 + Pacific Biosciences - 4CC602 - Radios Inc. + 00240C + DELEC GmbH - 80711F - Juniper Networks + 0023F9 + Double-Take Software, INC. - 88FD15 - Lineeye Ltd + 0023A1 + Trend Electronics Ltd - 884B39 - Siemens AG, Healthcare Sector + 0023A6 + E-Mon - D828C9 - General Electric Consumer and Industrial + 0023A8 + Marshall Electronics - 44C233 - Guangzhou Comet Technology Development Ltd + 0023C0 + Broadway Networks - 30EFD1 - Alstom Strongwish (Shenzhen) Ltd + 0023B6 + SECURITE COMMUNICATIONS / HONEYWELL - 7C2CF3 - Secure Electrans Ltd + 0023EA + Cisco Systems, Inc - 081651 - Shenzhen SEA Star Technology Ltd + 0023E5 + IPaXiom Networks - A863DF - Displaire Corporation + 002349 + Helmholtz Centre Berlin for Material and Energy - 183BD2 - BYD Precision Manufacture Company Ltd + 002346 + Vestac - E43593 - Hangzhou GoTo technology Ltd + 002344 + Objective Interface Systems, Inc. - 2C3A28 - Fagor Electronica + 00233C + Alflex - B45861 - CRemote LLC + 002379 + Union Business Machines Co. Ltd. - B0973A - E-Fuel Corporation + 002377 + Isotek Electronics Ltd - 204E6B - Axxana(israel) Ltd + 002371 + SOAM Systel - 80F593 - IRCO Sistemas de Telecomunicacion S.A. + 002362 + Goldline Controls - E497F0 - Shanghai VLC Technologies Ltd + 00235E + Cisco Systems, Inc - B40832 - TC Communications + 002358 + SYSTEL SA - ECDE3D - Lamprey Networks Inc. + 002356 + Packet Forensics LLC - 6CFFBE - MPB Communications Inc. + 002350 + RDC, Inc. dba LynTec - 304174 - Altec Lansing LLC + 00234F + Luminous Power Technologies Pvt. Ltd. - 80B289 - Forworld Electronics Ltd + 00239A + EasyData Hardware GmbH - E83A97 - Toshiba Corporation + 002396 + ANDES TECHNOLOGY CORPORATION - 1056CA - Peplink International Ltd + 002394 + Samjeon - 486FD2 - StorSimple Inc + 00238C + Private - A03A75 - PSS Belgium N.V. + 002317 + Lasercraft Inc - 24DBAD - ShopperTrak RCT Corporation + 00230E + Gorba AG - 9CEBE8 - BizLink (Kunshan) Ltd + 002307 + FUTURE INNOVATION TECH CO.,LTD - 040EC2 - ViewSonic Mobile China Limited + 002333 + Cisco Systems, Inc - C8D1D1 - AGAiT Technology Corporation + 00232E + Kedah Electronics Engineering, LLC - 00DB45 - Thamway Ltd + 002320 + Nicira Networks - D49C28 - JayBird LLC + 002322 + KISS Teknical Solutions, Inc. - 74F726 - Neuron Robotics + 002364 + Power Instruments Pte Ltd - 2872C5 - Smartmatic Corp + 0022C7 + SEGGER Microcontroller GmbH & Co. KG - E08FEC - Repotec Ltd + 0022C1 + Active Storage Inc. - ACE9AA - Hay Systems Ltd + 0022C2 + Proview Eletrônica do Brasil LTDA - 082AD0 - SRD Innovations Inc. + 0022BD + Cisco Systems, Inc - 889821 - Teraon + 0022BA + HUTH Elektronik Systeme GmbH - E0E751 - Nintendo Ltd + 0022BB + beyerdynamic GmbH & Co. KG - 003AAF - BlueBit Ltd + 0022B6 + Superflow Technologies Group - 64168D - Cisco Systems Inc. + 0022B5 + NOVITA - 003A9C - Cisco Systems Inc. + 0022B2 + 4RF Communications Ltd - 7C6C8F - AMS Neve Ltd + 0022AC + Hangzhou Siyuan Tech. Co., Ltd - 9CB206 - Procentec + 0022AD + TELESIS TECHNOLOGIES, INC. - 88ED1C - Cudo Communication Ltd + 0022AE + Mattel Inc. - 9CCD82 - Cheng UEI Precision Industry Ltd + 002305 + Cisco Systems, Inc - F06281 - ProCurve Networking by HP + 0022FF + NIVIS LLC - C09C92 - Coby + 002302 + Cobalt Digital, Inc. - C038F9 - Nokia Danmark A/S + 0022F5 + Advanced Realtime Tracking GmbH - F46349 - Diffon Corporation + 0022D1 + Albrecht Jung GmbH & Co. KG - 74F07D - BnCOM Ltd + 0022D2 + All Earth Comércio de Eletrônicos LTDA. - F852DF - VNL Europe AB + 0022CA + Anviz Biometric Tech. Co., Ltd. - A8CB95 - East Best Ltd + 0022A3 + California Eastern Laboratories - F45FF7 - DQ Technology Inc. + 0022A0 + APTIV SERVICES US, LLC - 7C3BD5 - Imago Group + 002297 + XMOS Semiconductor - 5CE223 - Delphin Technology AG + 00228F + CNRS - F871FE - The Goldman Sachs Group Inc. + 00227E + Chengdu 30Kaitian Communication Industry Co.Ltd - 2C1984 - IDN Telecom Inc. + 00227C + Woori SMT Co.,ltd - D8C3FB - Detracom + 002277 + NEC Australia Pty Ltd - 58F67B - Xia Men UnionCore Technology Ltd + 002279 + Nippon Conlux Co., Ltd. - 6CF049 - Giga-Byte Technology Ltd + 0022E5 + Fisher-Rosemount Systems Inc. - 644F74 - LENUS Ltd + 0022E4 + APASS TECHNOLOGY CO., LTD. - 787F62 - GiK mbH + 0022D5 + Eaton Corp. Electrical Group Data Center Solutions - Pulizzi - 401597 - Protect America Inc. + 002292 + Cinetal - C4FCE4 - DishTV NZ Ltd + 002258 + Taiyo Yuden Co., Ltd. - E80B13 - Akib Systems Taiwan Inc. + 00225B + Teradici Corporation - EC6C9F - Chengdu Volans Technology Ltd + 002259 + Guangzhou New Postcom Equipment Co.,Ltd. - 40EF4C - Fihonest Communication Ltd + 002253 + Entorian Technologies - 00271E - Xagyl Communications + 00224F + Byzoro Networks Ltd. - 00271D - Comba Telecom Systems (China) Ltd + 002235 + Strukton Systems bv - 002720 - NEW-SOL CoM + 00222C + Ceton Corp - 0026F0 - cTrixs International GmbH. + 00222D + SMC Networks Inc. - 0026EA - Cheerchip Electronic Technology (ShangHai) Ltd + 00222A + SoundEar A/S - 002708 - Nordiag ASA + 002205 + WeLink Solutions, Inc. - 002702 - SolarEdge Technologies + 002209 + Omron Healthcare Co., Ltd - 002704 - Accelerated Concepts Inc. + 0021F9 + WIRECOM Technologies - 0026FA - BandRich Inc. + 0021FA + A4SP Technologies Ltd. - 0026F9 - S.E.M. srl + 002271 + Jäger Computergesteuerte Meßtechnik GmbH. - 0026FD - Interactive Intelligence + 00225E + Uwin Technologies Co.,LTD - 0026F7 - Nivetti Systems Pvt Ltd + 002211 + Rohati Systems - 0026F6 - Military Communication Institute + 002212 + CAI Networks, Inc. - 0026DD - Fival Science & Technology Ltd + 00220D + Cisco Systems, Inc - 0026DE - FDI Matelec + 002208 + Certicom Corp - 0026DA - Universal Media Corporation /Slovakia/ s.r.o. + 00223D + JumpGen Systems, LLC - 0026DB - Ionics EMS Inc. + 002239 + Indiana Life Sciences Incorporated - 0026D5 - Ory Solucoes em Comercio de Informatica Ltda. + 00221F + eSang Technologies Co., Ltd. - 0026CE - Kozumi USA Corp. + 002217 + Neat Electronics - 002711 - LanPro Inc + 0021F0 + EW3 Technologies LLC - 002686 - Quantenna Communcations Inc. + 0021EE + Full Spectrum Inc. - 002684 - Kisan System + 0021EC + Solutronic GmbH - 002680 - SIL3 Pty Ltd + 002251 + Lumasense Technologies - 0026BF - Shenzhen Temobi Science & Tech Development Ltd + 002247 + DAC ENGINEERING CO., LTD. - 0026B4 - Ford Motor Company + 0021A0 + Cisco Systems, Inc - 0026CA - Cisco Systems Inc. + 002198 + Thai Radio Co, LTD - 0026C9 - Proventix Systems Inc. + 00218C + TopControl GMBH - 002690 - I DO IT + 00218A + Electronic Design and Manufacturing Company - 00268F - MTA SpA + 00218B + Wescon Technology, Inc. - 002679 - Euphonic Technologies Inc. + 002184 + POWERSOFT SRL - 0026AC - Shanghai LUSTER Teraband photonic Ltd + 00217A + Sejin Electron, Inc. - 0026A6 - Trixell + 0021D3 + BOCOM SECURITY(ASIA PACIFIC) LIMITED - 00269C - Itus Japan Ltd + 0021CC + Flextronics International - 002694 - Senscient Ltd + 0021CF + The Crypto Group - 002676 - CoMMidt AS + 0021B9 + Universal Devices Inc. - 00261D - CoP Security System Corp. + 0021B3 + Ross Controls - 002617 - OEM Worldwide + 0021B6 + Triacta Power Technologies Inc. - 002613 - Engel Axil S.L. + 0021AE + ALCATEL-LUCENT FRANCE - WTD - 002638 - Xia Men Joyatech Ltd + 0021AF + Radio Frequency Systems - 00263A - Digitec Systems + 0021E6 + Starlight Video Limited - 00260F - Linn Products Ltd + 0021E0 + CommAgility Ltd - 00260C - Dataram + 0021DE + Firepro Wireless - 00262B - Wongs Electronics Ltd + 002178 + Matuschek Messtechnik GmbH - 002620 - ISGUS GmbH + 002173 + Ion Torrent Systems, Inc. - 002601 - Cutera Inc + 002177 + W. L. Gore & Associates - 002635 - Bluetechnix GmbH + 002172 + Seoultek Valley - 002657 - OOO NPP Ekra + 002169 + Prologix, LLC. - 002652 - Cisco Systems Inc. + 0021C5 + 3DSP Corp - 002666 - EFM Networks + 0021A4 + Dbii Networks - 0025F5 - DVS Korea Ltd + 002199 + Vacon Plc - 0025EB - Reutech Radar Systems (Pty) Ltd + 00214B + Shenzhen HAMP Science & Technology Co.,Ltd - 0025EE - Avtex Ltd + 002145 + Semptian Technologies Ltd. - 0025AE - Microsoft Corporation + 00213E + TomTom International BV - 0025AF - CoMFILE Technology + 001FFC + Riccius+Sohn GmbH - 0025A8 - Kontron (BeiJing) Technology Ltd - + 001FFD + Indigo Mobile Technologies Corp. + + + 001FEE + ubisys technologies GmbH + + + 001FEF + SHINSEI INDUSTRIES CO.,LTD + + + 001FEC + Synapse Électronique + + + 001FE8 + KURUSUGAWA Electronics Industry Inc,. + + + 002121 + VRmagic GmbH + + + 002123 + Aerosat Avionics + + + 00211B + Cisco Systems, Inc + + + 002107 + Seowonintech Co Ltd. + + + 001FFE + HPN Supply Chain + + + 001FFF + Respironics, Inc. + + + 002153 + SeaMicro Inc. + + + 002154 + D-TACQ Solutions Ltd + + + 00213F + A-Team Technology Ltd. + + + 00212D + SCIMOLEX CORPORATION + + + 00210A + byd:sign Corporation + + + 001FD7 + TELERAD SA + + + 001FD3 + RIVA Networks Inc. + + + 001FD5 + MICRORISC s.r.o. + + + 001FBB + Xenatech Co.,LTD + + + 001FB1 + Cybertech Inc. + + + 001FB2 + Sontheim Industrie Elektronik GmbH + + + 001FCA + Cisco Systems, Inc + + + 001FC3 + SmartSynch, Inc + + + 001FC1 + Hanlong Technology Co.,LTD + + + 001F89 + Signalion GmbH + + + 001F8A + Ellion Digital Inc. + + + 001F7F + Phabrix Limited + + + 001F7C + Witelcom AS + + + 001F7A + WiWide Inc. + + + 001F77 + HEOL DESIGN + + + 001F76 + AirLogic Systems Inc. + + + 001F73 + Teraview Technology Co., Ltd. + + + 001F62 + JSC Stilsoft + + + 001F67 + Hitachi,Ltd. + + + 001F61 + Talent Communication Networks Inc. + + + 001F56 + DIGITAL FORECAST + + + 001FE0 + EdgeVelocity Corp + + + 001FD8 + A-TRUST COMPUTER CORPORATION + + + 001FAB + I.S HIGH TECH.INC + + + 001FAC + Goodmill Systems Ltd + + + 001F8E + Metris USA Inc. + + + 001F44 + GE Transportation Systems + + + 001F39 + Construcciones y Auxiliar de Ferrocarriles, S.A. + + + 001F3D + Qbit GmbH + + + 001F36 + Bellwin Information Co. Ltd., + + + 001F38 + POSITRON + + + 001F2D + Electro-Optical Imaging, Inc. + + + 001F11 + OPENMOKO, INC. + + + 001F03 + NUM AG + + + 001EFD + Microbit 2.0 AB + + + 001ED4 + Doble Engineering + + + 001ED2 + Ray Shine Video Technology Inc + + + 001ECE + BISA Technologies (Hong Kong) Limited + + + 001EC8 + Rapid Mobile (Pty) Ltd + + + 001ECC + CDVI + + + 001EFF + Mueller-Elektronik GmbH & Co. KG + + + 001F05 + iTAS Technology Corp. + + + 001F07 + AZTEQ Mobile + + + 001EF6 + Cisco Systems, Inc + + + 001EF9 + Pascom Kommunikations systeme GmbH. + + + 001EF3 + From2 + + + 001EE7 + Epic Systems Inc + + + 001EE9 + Stoneridge Electronics AB + + + 001EE4 + ACS Solutions France + + + 001F2F + Berker GmbH & Co. KG + + + 001F32 + Nintendo Co., Ltd. + + + 001EED + Adventiq Ltd. + + + 001F52 + UVT Unternehmensberatung fur Verkehr und Technik GmbH + + + 001F4F + Thinkware Co. Ltd. + + + 001F1C + KOBISHI ELECTRIC Co.,Ltd. + + + 001F19 + BEN-RI ELECTRONICA S.A. + + + 001E5F + KwikByte, LLC + + + 001E5B + Unitron Company, Inc. + + + 001E5E + COmputime Ltd. + + + 001E54 + TOYO ELECTRIC Corporation + + + 001E3C + Lyngbox Media AB + + + 001EC5 + Middle Atlantic Products Inc + + + 001EBE + Cisco Systems, Inc + + + 001EC3 + Kozio, Inc. + + + 001EBD + Cisco Systems, Inc + + + 001EB9 + Sing Fai Technology Limited + + + 001EB7 + TBTech, Co., Ltd. + + + 001E4D + Welkin Sciences, LLC + + + 001E4B + City Theatrical + + + 001E4A + Cisco Systems, Inc + + + 001E92 + JEULIN S.A. + + + 001E91 + KIMIN Electronic Co., Ltd. + + + 001E89 + CRFS Limited + + + 001E86 + MEL Co.,Ltd. + + + 001E88 + ANDOR SYSTEM SUPPORT CO., LTD. + + + 001E9D + Recall Technologies, Inc. + + + 001E95 + SIGMALINK + + + 001E93 + CiriTech Systems Inc + + + 001E79 + Cisco Systems, Inc + + + 001E76 + Thermo Fisher Scientific + + + 001E72 + PCS + + + 001E69 + Thomson Inc. + + + 001EA2 + Symx Systems, Inc. + + + 001EA9 + Nintendo Co., Ltd. + + + 001E9E + ddm hopt + schuler Gmbh + Co. KG + + + 001E09 + ZEFATEK Co.,LTD + + + 001E06 + WIBRAIN + + + 001E0C + Sherwood Information Partners, Inc. + + + 001E02 + Sougou Keikaku Kougyou Co.,Ltd. + + + 001E01 + Renesas Technology Sales Co., Ltd. + + + 001DFF + Network Critical Solutions Ltd + + + 001E00 + Shantou Institute of Ultrasonic Instruments + + + 001DF3 + SBS Science & Technology Co., Ltd + + + 001DDD + DAT H.K. LIMITED + + + 001DE4 + Visioneered Image Systems + + + 001DE2 + Radionor Communications + + + 001DD7 + Algolith + + + 001DC9 + GainSpan Corp. + + + 001DEE + NEXTVISION SISTEMAS DIGITAIS DE TELEVISÃO LTDA. + + + 001DEA + Commtest Instruments Ltd + + + 001DC7 + L-3 Communications Geneva Aerospace + + + 001E2C + CyVerse Corporation + + + 001E26 + Digifriends Co. Ltd + + + 001E23 + Electronic Educational Devices, Inc + + + 001DB6 + BestComm Networks, Inc. + + + 001DAC + Gigamon Systems LLC + + + 001DA2 + Cisco Systems, Inc + + + 001D99 + Cyan Optic, Inc. + + + 001D9B + Hokuyo Automatic Co., Ltd. + + + 001DBC + Nintendo Co., Ltd. + + + 001E13 + Cisco Systems, Inc + + + 001E0D + Micran Ltd. + + + 001D1C + Gennet s.a. + + + 001D15 + Shenzhen Dolphin Electronic Co., Ltd + + + 001D16 + SFR + + + 001D11 + Analogue & Micro Ltd + + + 001D12 + ROHM CO., LTD. + + + 001D86 + Shinwa Industries(China) Ltd. + + + 001D88 + Clearwire + + + 001D81 + GUANGZHOU GATEWAY ELECTRONICS CO., LTD + + + 001D49 + Innovation Wireless Inc. + + + 001D46 + Cisco Systems, Inc + + + 001D48 + Sensor-Technik Wiedemann GmbH + + + 001D47 + Covote GmbH & Co KG + + + 001D41 + Hardy Instruments + + + 001D3D + Avidyne Corporation + + + 001D3C + Muscle Corporation + + + 001D3A + mh acoustics LLC + + + 001D35 + Viconics Electronics Inc. + + + 001D31 + HIGHPRO INTERNATIONAL R&D CO,.LTD. + + + 001D66 + Hyundai Telecom + + + 001D77 + NSGate + + + 001D76 + Eyeheight Ltd. + + + 001D7A + Wideband Semiconductor, Inc. + + + 001D68 + Thomson Telecom Belgium + + + 001D61 + BIJ Corporation + + + 001D5C + Tom Communication Industrial Co.,Ltd. + + + 001D89 + VaultStor Corporation + + + 001D26 + Rockridgesound Technology Co. + + + 001D21 + Alcad SL + + + 001D56 + Kramer Electronics Ltd. + + + 001D4E + TCM Mobile LLC + + + 001CE1 + INDRA SISTEMAS, S.A. + + + 001CE0 + DASAN TPS + + + 001CD9 + GlobalTop Technology Inc. + + + 001CDA + Exegin Technologies Limited + + + 001C8E + Alcatel-Lucent IPD + + + 001C8F + Advanced Electronic Design, Inc. + + + 001C88 + TRANSYSTEM INC. + + + 001C86 + Cranite Systems, Inc. + + + 001C7F + Check Point Software Technologies + + + 001C99 + Shunra Software Ltd. + + + 001C9B + FEIG ELECTRONIC GmbH + + + 001C95 + Opticomm Corporation + + + 001C97 + Enzytek Technology Inc., + + + 001C90 + Empacket Corporation + + + 001CF1 + SUPoX Technology Co. , LTD. + + + 001CF4 + Media Technology Systems Inc + + + 001CE6 + INNES + + + 001C78 + WYPLAY SAS + + + 001C6E + Newbury Networks, Inc. + + + 001C6B + COVAX Co. Ltd + + + 001CA3 + Terra + + + 001CA6 + Win4NET + + + 001CA9 + Audiomatica Srl + + + 001CD2 + King Champion (Hong Kong) Limited + + + 001CCE + By Techdesign + + + 001D03 + Design Solutions Inc. + + + 001CF9 + Cisco Systems, Inc + + + 001CB9 + KWANG SUNG ELECTRONICS CO., LTD. + + + 001C58 + Cisco Systems, Inc + + + 001C5A + Advanced Relay Corporation + + + 001C4F + MACAB AB + + + 001C4E + TASA International Limited + + + 001C4B + Gener8, Inc. + + + 001C18 + Sicert S.r.L. + + + 001C1A + Thomas Instrumentation, Inc + + + 001C0E + Cisco Systems, Inc + + + 001C13 + OPTSYS TECHNOLOGY CO., LTD. + + + 001C0B + SmartAnt Telecom + + + 001C21 + Nucsafe Inc. + + + 001C1E + emtrion GmbH + + + 001C40 + VDG-Security bv + + + 001C3A + Element Labs, Inc. + + + 001C3D + WaveStorm + + + 001C08 + Echo360, Inc. + + + 001BF4 + KENWIN INDUSTRIAL(HK) LTD. + + + 001BF9 + Intellitect Water Ltd + + + 001BFA + G.i.N. mbH + + + 001BF3 + TRANSRADIO SenderSysteme Berlin AG + + + 001BDE + Renkus-Heinz, Inc. + + + 001BDB + Valeo VECS + + + 001C69 + Packet Vision Ltd + + + 001C65 + JoeScan, Inc. + + + 001C5F + Winland Electronics, Inc. + + + 001C2D + FlexRadio Systems + + + 001C2C + Synapse + + + 001BD8 + FLIR Systems Inc + + + 001BD4 + Cisco Systems, Inc + + + 001BD0 + IDENTEC SOLUTIONS + + + 001BCD + DAVISCOMMS (S) PTE LTD + + + 001BCA + Beijing Run Technology LTD. Company + + + 001BCC + KINGTEK CCTV ALLIANCE CO., LTD. + + + 001B51 + Vector Technology Corp. + + + 001B54 + Cisco Systems, Inc + + + 001B4A + W&W Communications, Inc. + + + 001BC8 + MIURA CO.,LTD + + + 001BC1 + HOLUX Technology, Inc. + + + 001BBC + Silver Peak Systems, Inc. + + + 001BAB + Telchemy, Incorporated + + + 001BAE + Micro Control Systems, Inc + + + 001BA8 + UBI&MOBI,.Inc + + + 001B83 + Finsoft Ltd + + + 001B81 + DATAQ Instruments, Inc. + + + 001B7D + CXR Anderson Jacobson + + + 001B79 + FAIVELEY TRANSPORT + + + 001B65 + China Gridcom Co., Ltd + + + 001B64 + IsaacLandKorea Co., Ltd, + + + 001B88 + Divinet Access Technologies Ltd + + + 001B71 + Telular Corp. + + + 001B73 + DTL Broadcast Ltd + + + 001BA0 + Awox + + + 001B97 + Violin Technologies + + + 001B35 + ChongQing JINOU Science & Technology Development CO.,Ltd + + + 001B36 + Tsubata Engineering Co.,Ltd. (Head Office) + + + 001B39 + Proxicast + + + 001B3B + Yi-Qing CO., LTD + + + 001B1C + Coherent + + + 001B22 + Palit Microsystems ( H.K.) Ltd. + + + 001B19 + IEEE I&M Society TC9 + + + 001B13 + Icron Technologies Corporation + + + 001AFA + Welch Allyn, Inc. + + + 001AF7 + dataschalt e+a GmbH + + + 001AF3 + Samyoung Electronics + + + 001AEF + Loopcomm Technology, Inc. + + + 001AEC + Keumbee Electronics Co.,Ltd. + + + 001B44 + SanDisk Corporation + + + 001B46 + Blueone Technology Co.,Ltd + + + 001B40 + Network Automation mxc AB + + + 001B42 + Wise & Blue + + + 001ABA + Caton Overseas Limited + + + 001AB3 + VISIONITE INC. + + + 001B26 + RON-Telecom ZAO + + + 001B20 + TPine Technology + + + 001ACA + Tilera Corporation + + + 001B0F + Petratec + + + 001AD1 + FARGO CO., LTD. + + + 001A3E + Faster Technology LLC + + + 001A3A + Dongahelecomm + + + 001A3B + Doah Elecom Inc. + + + 001A3C + Technowave Ltd. + + + 001A40 + A-FOUR TECH CO., LTD. + + + 001A8C + Sophos Ltd + + + 001A91 + FusionDynamic Ltd. + + + 001A84 + V One Multimedia Pte Ltd + + + 001A6D + Cisco Systems, Inc + + + 001A6E + Impro Technologies + + + 001A6C + Cisco Systems, Inc + + + 001A63 + Elster Solutions, LLC, + + + 001AA9 + FUJIAN STAR-NET COMMUNICATION CO.,LTD + + + 001AA8 + Mamiya Digital Imaging Co., Ltd. + + + 001A99 + Smarty (HZ) Information Electronics Co., Ltd + + + 001A7B + Teleco, Inc. + + + 001A96 + ECLER S.A. + + + 001A46 + Digital Multimedia Technology Co., Ltd + + + 001A4A + Qumranet Inc. + + + 001A59 + Ircona + + + 0019FE + SHENZHEN SEECOMM TECHNOLOGY CO.,LTD. + + + 0019CD + Chengdu ethercom information technology Ltd. + + + 0019D9 + Zeutschel GmbH + + + 0019CA + Broadata Communications, Inc + + + 0019D3 + TRAK Microwave + + + 0019C3 + Qualitrol + + + 001A0D + HandHeld entertainment, Inc. + + + 001A0E + Cheng Uei Precision Industry Co.,Ltd + + + 0019BE + Altai Technologies Limited + + + 0019B4 + Intellio Ltd + + + 0019BA + Paradox Security Systems Ltd + + + 001A26 + Deltanode Solutions AB + + + 001A25 + DELTA DORE + + + 0019FD + Nintendo Co., Ltd. + + + 0019ED + Axesstel Inc. + + + 0019F6 + Acconet (PTE) Ltd + + + 001A30 + Cisco Systems, Inc + + + 001A36 + Aipermon GmbH & Co. KG + + + 001A15 + gemalto e-Payment + + + 001978 + Datum Systems, Inc. + + + 001968 + Digital Video Networks(Shanghai) CO. LTD. + + + 001950 + Harman Multimedia + + + 00194C + Fujian Stelcom information & Technology CO.,Ltd + + + 00194A + TESTO AG + + + 001939 + Gigamips + + + 00193A + OESOLUTIONS + + + 001983 + CCT R&D Limited + + + 00197F + PLANTRONICS, INC. + + + 00197A + MAZeT GmbH + + + 00198A + Northrop Grumman Systems Corp. + + + 001989 + Sonitrol Corporation + + + 001980 + Gridpoint Systems + + + 001960 + DoCoMo Systems, Inc. + + + 00195A + Jenaer Antriebstechnik GmbH + + + 0019A1 + LG INFORMATION & COMM. + + + 0019A8 + WiQuest Communications + + + 00196D + Raybit Systems Korea, Inc + + + 001970 + Z-Com, Inc. + + + 0018C3 + CS Corporation + + + 0018CA + Viprinet GmbH + + + 0018C7 + Real Time Automation + + + 0018BB + Eliwell Controls srl + + + 0018BF + Essence Technology Solution, Inc. + + + 0018B9 + Cisco Systems, Inc + + + 0018B8 + New Voice International AG + + + 0018EE + Videology Imaging Solutions, Inc. + + + 0018EB + Blue Zen Enterprises Private Limited + + + 0018E2 + Topdata Sistemas de Automacao Ltda + + + 0018D1 + Siemens Home & Office Comm. Devices + + + 0018D0 + AtRoad, A Trimble Company + + + 0018D2 + High-Gain Antennas LLC + + + 0018D3 + TEAMCAST + + + 0018C6 + OPW Fuel Management Systems + + + 001924 + LBNL Engineering + + + 00191A + IRLINK + + + 001916 + PayTec AG + + + 00190E + Atech Technology Co., Ltd. + + + 00192F + Cisco Systems, Inc + + + 001922 + CM Comandos Lineares + + + 00191D + Nintendo Co., Ltd. + + + 001905 + SCHRACK Seconet AG + + + 001907 + Cisco Systems, Inc + + + 0018FB + Compro Technology + + + 0018DC + Prostar Co., Ltd. + + + 00188F + Montgomery Technology, Inc. + + + 001884 + Fon Technology S.L. + + + 001880 + Maxim Integrated Products + + + 00187C + INTERCROSS, LLC + + + 001870 + E28 Shanghai Limited + + + 001872 + Expertise Engineering + + + 001874 + Cisco Systems, Inc + + + 00185B + Network Chemistry, Inc + + + 001861 + Ooma, Inc. + + + 001855 + Aeromaritime Systembau GmbH + + + 001851 + SWsoft + + + 001856 + EyeFi, Inc + + + 00184E + Lianhe Technologies, Inc. + + + 00184C + Bogen Communications + + + 00183B + CENITS Co., Ltd. + + + 00183C + Encore Software Limited + + + 001841 + High Tech Computer Corp + + + 001826 + Cale Access AB + + + 00182D + Artec Design + + + 00182A + Taiwan Video & Monitor + + + 001869 + KINGJIM + + + 0018AA + Protec Fire Detection plc + + + 0018A1 + Tiqit Computers, Inc. + + + 001896 + Great Well Electronic LTD + + + 001890 + RadioCOM, s.r.o. + + + 001819 + Cisco Systems, Inc + + + 001810 + IPTrade S.A. + + + 001804 + E-TEK DIGITAL TECHNOLOGY LIMITED + + + 001809 + CRESYN + + + 001800 + UNIGRAND LTD + + + 001812 + Beijing Xinwei Telecom Technology Co., Ltd. + + + 00180B + Brilliant Telecommunications + + + 0017FC + Suprema Inc. + + + 0017FD + Amulet Hotkey + + + 0017FB + FA + + + 0017A2 + Camrivox Ltd. + + + 00179D + Kelman Limited + + + 001790 + HYUNDAI DIGITECH Co, Ltd. + + + 001791 + LinTech GmbH + + + 0017CF + iMCA-GmbH + + + 0017D8 + Magnum Semiconductor, Inc. + + + 0017DA + Spans Logic + + + 001795 + Cisco Systems, Inc + + + 001799 + SmarTire Systems Inc. + + + 00177F + Worldsmart Retech + + + 0017B9 + Gambro Lundia AB + + + 0017B3 + Aftek Infosys Limited + + + 001712 + ISCO International + + + 00170D + Dust Networks Inc. + + + 00170C + Twig Com Ltd. + + + 00170B + Contela, Inc. + + + 00175F + XENOLINK Communications Co., Ltd. + + + 00175C + SHARP CORPORATION + + + 001759 + Cisco Systems, Inc + + + 001754 + Arkino HiTOP Corporation Limited + + + 001752 + DAGS, Inc + + + 001756 + Vinci Labs Oy + + + 001786 + wisembed + + + 001782 + LoBenn Inc. + + + 00176B + Kiyon, Inc. + + + 001778 + Central Music Co. + + + 001774 + Elesta GmbH + + + 001777 + Obsidian Research Corporation + + + 00176A + Avago Technologies + + + 001741 + DEFIDEV + + + 001738 + International Business Machines + + + 00172D + Axcen Photonics Corporation + + + 001724 + Studer Professional Audio GmbH + + + 0016A1 + 3Leaf Networks + + + 0016A4 + Ezurio Ltd + + + 001699 + Tonic DVB Marketing Ltd + + + 00169B + Alstom Transport + + + 001690 + J-TEK INCORPORATION + + + 001698 + T&A Mobile Phones + + + 001696 + QDI Technology (H.K.) Limited + + + 00170F + Cisco Systems, Inc + + + 001704 + Shinco Electronics Group Co.,Ltd + + + 001707 + InGrid, Inc + + + 0016D8 + Senea AB + + + 0016D6 + TDA Tech Pty Ltd + + + 0016D5 + Synccom Co., Ltd + + + 0016C9 + NAT Seattle, Inc. + + + 0016A5 + Tandberg Storage ASA + + + 0016C6 + North Atlantic Industries + + + 0016D2 + Caspian + + + 0016F7 + L-3 Communications, Aviation Recorders + + + 001702 + Osung Midicom Co., Ltd + + + 0016BE + INFRANET, Inc. + + + 0016AB + Dansensor A/S + + + 001666 + Quantier Communication Inc. + + + 001662 + Liyuh Technology Ltd. + + + 001661 + Novatium Solutions (P) Ltd + + + 001664 + Prod-El SpA + + + 00165E + Precision I/O + + + 001658 + Fusiontech Technologies Inc. + + + 001653 + LEGO System A/S IE Electronics Division + + + 001652 + Hoatech Technologies, Inc. + + + 001650 + Kratos EPD + + + 001642 + Pangolin + + + 001630 + Vativ Technologies + + + 00162F + Geutebrück GmbH + + + 00162B + Togami Electric Mfg.co.,Ltd. + + + 001681 + Vector Informatik GmbH + + + 00BAC0 + Biometric Access Company + + + 00163B + Communications & Power Industries + + + 001637 + CITEL SpA + + + 001685 + Elisa Oyj + + + 001680 + Bally Gaming + Systems + + + 001624 + Teneros, Inc. + + + 00161C + e:cue + + + 001608 + Sequans Communications + + + 001573 + NewSoft Technology Corporation + + + 001575 + Nevis Networks Inc. + + + 00156C + SANE SYSTEM CO., LTD + + + 00156A + DG2L Technologies Pvt. Ltd. + + + 00156F + Xiranet Communications GmbH + + + 001572 + Red-Lemon + + + 0015B8 + Tahoe + + + 0015B6 + ShinMaywa Industries, Ltd. + + + 0015B0 + AUTOTELENET CO.,LTD + + + 0015B1 + Ambient Corporation + + + 001584 + Schenck Process GmbH + + + 001581 + MAKUS Inc. + + + 00157A + Telefin S.p.A. + + + 0015FA + Cisco Systems, Inc + + + 0015FC + Littelfuse Startco + + + 0015F7 + Wintecronics Ltd. + + + 0015F8 + Kingtronics Industrial Co. Ltd. + + + 0015A7 + Robatech AG + + + 00159F + Terascala, Inc. + + + 00159E + Mad Catz Interactive Inc + + + 0015A1 + ECA-SINTERS + + + 0015D7 + Reti Corporation + + + 0015CB + Surf Communication Solutions Ltd. + + + 0015CC + UQUEST, LTD. + + + 0015E6 + MOBILE TECHNIKA Inc. + + + 0015DB + Canesta Inc. + + + 0015C6 + Cisco Systems, Inc + + + 0015C3 + Ruf Telematik AG + + + 001593 + U4EA Technologies Inc. + + + 00158D + Jennic Ltd + + + 001529 + N3 Corporation + + + 00152D + TenX Networks, LLC + + + 001523 + Meteor Communications Corporation + + + 001524 + Numatics, Inc. + + + 00151B + Isilon Systems Inc. + + + 0014F9 + Vantage Controls + + + 00154E + IEC + + + 001550 + Nits Technology Inc + + + 001546 + ITG Worldwide Sdn Bhd + + + 00153E + Q-Matic Sweden AB + + + 001567 + RADWIN Inc. + + + 00155D + Microsoft Corporation + + + 001562 + Cisco Systems, Inc + + + 00155B + Sampo Corporation + + + 001553 + Cytyc Corporation + + + 001551 + RadioPulse Inc. + + + 001552 + Wi-Gear Inc. + + + 001510 + Techsphere Co., Ltd + + + 001513 + EFS sas + + + 001542 + MICROHARD S.R.L. + + + 001503 + PROFIcomms s.r.o. + + + 001509 + Plus Technology Co., Ltd + + + 0014ED + Airak, Inc. + + + 0014E1 + Data Display AG + + + 0014E3 + mm-lab GmbH + + + 0014D9 + IP Fabrics, Inc. + + + 0014D6 + Jeongmin Electronics Co.,Ltd. + + + 00148B + Globo Electronic GmbH & Co. KG + + + 001490 + ASP Corporation + + + 001479 + NEC Magnus Communications,Ltd. + + + 00147B + Iteris, Inc. + + + 00147A + Eubus GmbH + + + 00146D + RF Technologies + + + 0014F0 + Business Security OL AB + + + 0014F2 + Cisco Systems, Inc + + + 0014E7 + Stolinx,. Inc + + + 0014E9 + Nortech International + + + 0014D0 + BTI Systems Inc. + + + 0014CE + NF CORPORATION + + + 0014BB + Open Interface North America + + + 001488 + Akorri + + + 001484 + Cermate Technologies Inc. + + + 0014AC + Bountiful WiFi + + + 0014A8 + Cisco Systems, Inc + + + 0014A0 + Accsense, Inc. + + + 0013FE + GRANDTEC ELECTRONIC CORP. + + + 0013F8 + Dex Security Solutions + + + 0013F9 + Cavera Systems + + + 0013F2 + Klas Ltd + + + 0013F7 + SMC Networks, Inc. + + + 00145F + ADITEC CO. LTD + + + 001459 + Moram Co., Ltd. + + + 0013ED + PSIA + + + 0013E6 + Technolution + + + 001453 + ADVANTECH TECHNOLOGIES CO.,LTD + + + 001454 + Symwave + + + 001448 + Inventec Multimedia & Telecom Corporation + + + 00141C + Cisco Systems, Inc + + + 00141A + DEICY CORPORATION + + + 00144B + Hifn, Inc. + + + 00143C + Rheinmetall Canada Inc. + + + 001470 + Prokom Software SA + + + 001467 + ArrowSpan Inc. + + + 001416 + Scosche Industries, Inc. + + + 00140C + GKB CCTV CO., LTD. + + + 001435 + CityCom Corp. + + + 001426 + NL Technology + + + 0013CD + MTI co. LTD + + + 0013D3 + MICRO-STAR INTERNATIONAL CO., LTD. + + + 0013CA + ATX + + + 0013C5 + LIGHTRON FIBER-OPTIC DEVICES INC. + + + 0013C4 + Cisco Systems, Inc + + + 00134C + YDT Technology International + + + 00133C + QUINTRON SYSTEMS INC. + + + 00139A + K-ubique ID Corp. + + + 00139E + Ciara Technologies Inc. + + + 00139D + MaxLinear Hispania S.L.U. + + + 0013B5 + Wavesat + + + 0013AF + NUMA Technology,Inc. + + + 0013B0 + Jablotron + + + 0013B1 + Intelligent Control Systems (Asia) Pte Ltd + + + 0013DF + Ryvor Corp. + + + 0013D5 + RuggedCom + + + 0013D6 + TII NETWORK TECHNOLOGIES, INC. + + + 0013DB + SHOEI Electric Co.,Ltd + + + 00137F + Cisco Systems, Inc + + + 001382 + Cetacea Networks Corporation + + + 001375 + American Security Products Co. + + + 0013C2 + WACOM Co.,Ltd + + + 0013BF + Media System Planning Corp. + + + 0013BB + Smartvue Corporation + + + 001358 + Realm Systems, Inc. + + + 001359 + ProTelevision Technologies A/S + + + 001350 + Silver Spring Networks, Inc + + + 00138D + Kinghold + + + 001390 + Termtek Computer Co., Ltd + + + 00132F + Interactek + + + 001330 + EURO PROTECTION SURVEILLANCE + + + 001325 + Cortina Systems Inc + + + 00133D + Micro Memory Curtiss Wright Co + + + 00133F + Eppendorf Instrumente GmbH + + + 001341 + Shandong New Beiyang Information Technology Co.,Ltd + + + 001331 + CellPoint Connect + + + 001335 + VS Industry Berhad + + + 0012C3 + WIT S.A. + + + 0012C8 + Perfect tech + + + 0012C6 + TGC America, Inc + + + 0012CC + Bitatek CO., LTD + + + 0012ED + AVG Advanced Technologies + + + 0012EA + Trane + + + 0012E7 + Projectek Networking Electronics Corp. + + + 0012FD + OPTIMUS IC S.A. + + + 001305 + Epicom, Inc. + + + 001306 + Always On Wireless + + + 0012FA + THX LTD + + + 0012E4 + ZIEHL industrie-electronik GmbH + Co KG + + + 0012BB + Telecommunications Industry Association TR-41 Committee + + + 0012B6 + Santa Barbara Infrared, Inc. + + + 0012B9 + Fusion Digital Technology + + + 0012B4 + Work Microwave GmbH + + + 0012B5 + Vialta, Inc. + + + 001297 + O2Micro, Inc. + + + 00129D + First International Computer do Brasil + + + 00129C + Yulinet + + + 001290 + KYOWA Electric & Machinery Corp. + + + 001291 + KWS Computersysteme GmbH + + + 0012A3 + Trust International B.V. + + + 0012A7 + ISR TECHNOLOGIES Inc + + + 0012AA + IEE, Inc. + + + 00129F + RAE Systems + + + 001295 + Aiware Inc. + + + 00128B + Sensory Networks Inc + + + 00128F + Montilio + + + 001289 + Advance Sterilization Products + + + 001284 + Lab33 Srl + + + 00125B + KAIMEI ELECTRONI + + + 001259 + THERMO ELECTRON KARLSRUHE + + + 00125A + Microsoft Corporation + + + 001256 + LG INFORMATION & COMM. + + + 0012B1 + Dai Nippon Printing Co., Ltd + + + 001281 + March Networks S.p.A. + + + 00127E + Digital Lifestyles Group, Inc. + + + 00126B + Ascalade Communications Limited + + + 0011DA + Vivaas Technology Inc. + + + 0011DD + FROMUS TEC. Co., Ltd. + + + 0011E4 + Danelec Electronics A/S + + + 0011E1 + Arcelik A.S + + + 001233 + JRC TOKKI Co.,Ltd. + + + 00122F + Sanei Electric Inc. + + + 0011EB + Innovative Integration + + + 0011EA + IWICS Inc. + + + 0011E2 + Hua Jung Components Co., Ltd. + + + 001246 + T.O.M TECHNOLOGY INC.. + + + 00123D + GES Co, Ltd + + + 001239 + S Net Systems Inc. + + + 0011FB + Heidelberg Engineering GmbH + + + 001214 + Koenig & Bauer AG + + + 00120F + IEEE 802.3 + + + 00120C + CE-Infosys Pte Ltd + + + 001230 + Picaso Infocommunication CO., LTD. + + + 00121D + Netfabric Corporation + + + 0011EF + Conitec Datensysteme GmbH + + + 0011AD + Shanghai Ruijie Technology + + + 0011A8 + Quest Technologies + + + 0011A1 + VISION NETWARE CO.,LTD + + + 0011A0 + Vtech Engineering Canada Ltd + + + 0011BE + AGP Telecom Co. Ltd + + + 0011BA + Elexol Pty Ltd + + + 0011BC + Cisco Systems, Inc + + + 0011B3 + YOSHIMIYA CO.,LTD. + + + 0011B6 + Open Systems International + + + 0011B0 + Fortelink Inc. + + + 0011AC + Simtec Electronics + + + 00114F + US Digital Television, Inc + + + 001172 + COTRON CORPORATION + + + 001168 + HomeLogic LLC + + + 00118F + EUTECH INSTRUMENTS PTE. LTD. + + + 001191 + CTS-Clima Temperatur Systeme GmbH + + + 00118D + Hanchang System Corp. + + + 001189 + Aerotech Inc + + + 001182 + IMI Norgren Ltd + + + 00117A + Singim International Corp. + + + 001163 + SYSTEM SPA DEPT. ELECTRONICS + + + 00115F + ITX Security Co., Ltd. + + + 001153 + Trident Tek, Inc. + + + 0011D6 + HandEra, Inc. + + + 0011CA + Long Range Systems, Inc. + + + 0011C5 + TEN Technology + + + 0011CD + Axsun Technologies + + + 00119B + Telesynergy Research Inc. + + + 001101 + CET Technologies Pte Ltd + + + 000FFF + Control4 + + + 000FFC + Merit Li-Lin Ent. + + + 000FFB + Nippon Denso Industry Co., Ltd. + + + 001148 + Prolon Control Systems + + + 001140 + Nanometrics Inc. + + + 001144 + Assurance Technology Corp + + + 00113A + SHINBORAM + + + 001112 + Honeywell CMSS + + + 000FF2 + Loud Technologies Inc. + + + 000FF1 + nex-G Systems Pte.Ltd + + + 000FF3 + Jung Myoung Communications&Technology + + + 001113 + Fraunhofer FOKUS + + + 000FE0 + NComputing Co.,Ltd. + + + 000FE3 + Damm Cellular Systems A/S + + + 001128 + Streamit + + + 00113F + Alcatel DI + + + 001137 + AICHI ELECTRIC CO., LTD. + + + 000FD5 + Schwechat - RISE + + + 000F67 + West Instruments + + + 000F6E + BBox + + + 000F6F + FTA Communication Technologies + + + 000F63 + Obzerv Technologies + + + 000F65 + icube Corp. + + + 000FCB + 3Com Ltd + + + 000FC5 + KeyMed Ltd + + + 000FBF + DGT Sp. z o.o. + + + 000FBD + MRV Communications (Networks) LTD + + + 000FB4 + Timespace Technology + + + 000FA6 + S2 Security Corporation + + + 000FAA + Nexus Technologies + + + 000FA8 + Photometrics, Inc. + + + 000F9D + DisplayLink (UK) Ltd + + + 000F92 + Microhard Systems Inc. + + + 000F89 + Winnertec System Co., Ltd. + + + 000F5D + Genexis BV + + + 000F58 + Adder Technology Limited + + + 000F71 + Sanmei Electronics Co.,Ltd + + + 000F6B + GateWare Communications GmbH + + + 000ECA + WTSS Inc + + + 000ECC + Tableau, LLC + + + 000ED5 + COPAN Systems Inc. + + + 000EC8 + Zoran Corporation + + + 000ECB + VineSys Technology + + + 000ED2 + Filtronic plc + + + 000ED9 + Aksys, Ltd. + + + 000EC2 + Lowrance Electronics, Inc. + + + 000EFB + Macey Enterprises + + + 000EFA + Optoway Technology Incorporation + + + 000EFD + FUJINON CORPORATION + + + 000F12 + Panasonic Europe Ltd. + + + 000F0E + WaveSplitter Technologies, Inc. + + + 000F0C + SYNCHRONIC ENGINEERING + + + 000F0B + Kentima Technologies AB + + + 000F09 + Private + + + 000EB6 + Riverbed Technology, Inc. + + + 000EB7 + Knovative, Inc. + + + 000F21 + Scientific Atlanta, Inc + + + 000F11 + Prodrive B.V. + + + 000F13 + Nisca corporation + + + 000F14 + Mindray Co., Ltd. + + + 000F46 + SINAR AG + + + 000F41 + Zipher Ltd + + + 000F4D + TalkSwitch + + + 000EDD + SHURE INCORPORATED + + + 000EDC + Tellion INC. + + + 000ECD + SKOV A/S + + + 000EF5 + iPAC Technology Co., Ltd. + + + 000EB1 + Newcotech,Ltd + + + 000EB4 + GUANGZHOU GAOKE COMMUNICATIONS TECHNOLOGY CO.LTD. + + + 000EA9 + Shanghai Xun Shi Communications Equipment Ltd. Co. + + + 000EA3 + CNCR-IT CO.,LTD,HangZhou P.R.CHINA + + + 000EA2 + McAfee, Inc + + + 000E9B + Ambit Microsystems Corporation + + + 000E93 + Milénio 3 Sistemas Electrónicos, Lda. + + + 000E54 + AlphaCell Wireless Ltd. + + + 000E4E + Waveplus Technology Co., Ltd. + + + 000E4A + Changchun Huayu WEBPAD Co.,LTD + + + 000E63 + Lemke Diagnostics GmbH + + + 000E5B + ParkerVision - Direct2Data + + + 000E60 + 360SUN Digital Broadband Corporation + + + 000E76 + GEMSOC INNOVISION INC. + + + 000E7D + Electronics Line 3000 Ltd. + + + 000E78 + Amtelco + + + 000E71 + Gemstar Technology Development Ltd. + + + 000E70 + in2 Networks + + + 000E41 + NIHON MECHATRONICS CO.,LTD. + + + 000E3C + Transact Technologies Inc + + + 000E8D + Systems in Progress Holding GmbH + + + 000E23 + Incipient, Inc. + + + 000E25 + Hannae Technology Co., Ltd + + + 000E20 + ACCESS Systems Americas, Inc. + + + 000E21 + MTU Friedrichshafen GmbH + + + 000E22 + Private + + + 000E1C + Hach Company + + + 000E37 + Harms & Wende GmbH & Co.KG + + + 000E31 + Olympus Soft Imaging Solutions GmbH + + + 000E2F + Roche Diagnostics GmbH + + + 000E2C + Netcodec co. + + + 000DD4 + Symantec Corporation + + + 000DD2 + Simrad Optronics ASA + + + 000DD1 + Stryker Corporation + + + 000DD7 + Bright + + + 000DD9 + Anton Paar GmbH + + + 000DE4 + DIGINICS, Inc. + + + 000DDC + VAC + + + 000DE0 + ICPDAS Co.,LTD + + + 000DE3 + AT Sweden AB + + + 000DC8 + AirMagnet, Inc + + + 000DBE + Bel Fuse Europe Ltd.,UK + + + 000DC9 + THALES Elektronik Systeme GmbH + + + 000DC5 + EchoStar Global B.V. + + + 000E02 + Advantech AMT Inc. + + + 000DEA + Kingtel Telecommunication Corp. + + + 000DED + Cisco Systems, Inc + + + 000E09 + Shenzhen Coship Software Co.,LTD. + + + 000E05 + WIRELESS MATRIX CORP. + + + 000D81 + Pepperl+Fuchs GmbH + + + 000D7A + DiGATTO Asia Pacific Pte Ltd + + + 000D77 + FalconStor Software + + + 000D76 + Hokuto Denshi Co,. Ltd. + + + 000D7B + Consensys Computers Inc. + + + 000D6C + M-Audio + + + 000D5E + NEC Personal Products + + + 000D5B + Smart Empire Investments Limited + + + 000D59 + Amity Systems, Inc. + + + 000D9F + RF Micro Devices + + + 000DA5 + Fabric7 Systems, Inc + + + 000D99 + Orbital Sciences Corp.; Launch Systems Group + + + 000D50 + Galazar Networks + + + 000D49 + Triton Systems of Delaware, Inc. + + + 000D48 + AEWIN Technologies Co., Ltd. + + + 000D8F + King Tsushin Kogyo Co., LTD. + + + 000D89 + Bils Technology Inc + + + 000D86 + Huber + Suhner AG + + + 000DBC + Cisco Systems, Inc + + + 000D70 + Datamax Corporation + + + 000D6F + Ember Corporation + + + 000D3F + VTI Instruments Corporation + + + 000CE3 + Option International N.V. + + + 000CE4 + NeuroCom International, Inc. + + + 000CE8 + GuangZhou AnJuBao Co., Ltd + + + 000CD0 + Symetrix + + + 000CD9 + Itcare Co., Ltd + + + 000CD5 + Passave Inc. + + + 000CCA + HGST a Western Digital Company + + + 000CB5 + Premier Technolgies, Inc + + + 000CB6 + NANJING SEU MOBILE & INTERNET TECHNOLOGY CO.,LTD + + + 000CC3 + BeWAN systems + + + 000CB4 + AutoCell Laboratories, Inc. + + + 000D17 + Turbo Networks Co.Ltd + + + 000D18 + Mega-Trend Electronics CO., LTD. + + + 000D20 + ASAHIKASEI TECHNOSYSTEM CO.,LTD. + + + 000D0E + Inqnet Systems, Inc. + + + 000D11 + DENTSPLY - Gendex + + + 000D04 + Foxboro Eckardt Development GmbH + + + 000D05 + cybernet manufacturing inc. + + + 000D08 + AboveCable, Inc. + + + 000D25 + SANDEN CORPORATION + + + 000D24 + SENTEC E&E CO., LTD. + + + 000D22 + Unitronics LTD + + + 000D14 + Vtech Innovation LP dba Advanced American Telephones + + + 000A07 + WebWayOne Ltd + + + 000CB0 + Star Semiconductor Corporation + + + 000C34 + Vixen Co., Ltd. + + + 000D3A + Microsoft Corp. + + + 000D30 + IceFyre Semiconductor + + + 000D31 + Compellent Technologies, Inc. + + + 000CFE + Grand Electronic Co., Ltd + + + 000CD2 + Schaffner EMV AG + + + 000C65 + Sunin Telecom + + + 000C6F + Amtek system co.,LTD. + + + 000C6C + Eve Systems GmbH + + + 000C58 + M&S Systems + + + 000CB1 + Salland Engineering (Europe) BV + + + 000CBC + Iscutum + + + 000CA2 + Harmonic Video Network + + + 000CA4 + Prompttec Product Management GmbH + + + 000C98 + LETEK Communications Inc. + + + 000C8E + Mentor Engineering Inc + + + 000C7E + Tellium Incorporated + + + 000C73 + TELSON ELECTRONICS CO., LTD + + + 000C5B + HANWANG TECHNOLOGY CO.,LTD + + + 000C60 + ACM Systems + + + 000C87 + AMD + + + 000C83 + Logical Solutions + + + 000C51 + Scientific Technologies Inc. + + + 000C39 + Sentinel Wireless Inc. + + + 000C96 + OQO, Inc. + + + 000C08 + HUMEX Technologies Corp. + + + 000C0D + Communications & Power Industries / Satcom Division + + + 000C04 + Tecnova + + + 000BF6 + Nitgen Co., Ltd + + + 000C01 + Abatron AG + + + 000BF0 + MoTEX Products Co., Ltd. + + + 000BF1 + LAP Laser Applikations + + + 000BEE + inc.jet, Incorporated + + + 000BE2 + Lumenera Corporation + + + 000BE1 + Nokia NET Product Operations + + + 000C26 + Weintek Labs. Inc. + + + 000C2B + ELIAS Technology, Inc. + + + 000C1A + Quest Technical Solutions Inc. + + + 000C24 + ANATOR + + + 000C19 + Telio Communications GmbH + + + 000C1D + Mettler & Fuchs AG + + + 000C13 + MediaQ + + + 000C32 + Avionic Design GmbH + + + 000C33 + Compucase Enterprise Co. Ltd. + + + 000C36 + S-Takaya Electronics Industry Co.,Ltd. + + + 000C2D + FullWave Technology Co., Ltd. + + + 000BFD + Cisco Systems, Inc + + + 000BF4 + Private + + + 000BFA + EXEMYS SRL + + + 000BFB + D-NET International Corporation + + + 000BCB + Fagor Automation , S. Coop + + + 000BC8 + AirFlow Networks + + + 000BCE + Free2move AB + + + 000BCF + AGFA NDT INC. + + + 000BC3 + Multiplex, Inc. + + + 000BBE + Cisco Systems, Inc + + + 000BE0 + SercoNet Ltd. + + + 000B40 + Cambridge Industries Group (CIG) + + + 000B44 + Concord Idea Corp. + + + 000B42 + commax Co., Ltd. + + + 000B47 + Advanced Energy + + + 000B7F + Align Engineering LLC + + + 000B85 + Cisco Systems, Inc + + + 000B81 + Kaparel Corporation + + + 000BA1 + Fujikura Solutions Ltd. + + + 000BA6 + Miyakawa Electric Works Ltd. + + + 000B93 + Ritter Elektronik + + + 000B9B + Sirius System Co, Ltd. + + + 000B82 + Grandstream Networks, Inc. + + + 000B6E + Neff Instrument Corp. + + + 000B72 + Lawo AG + + + 000B78 + TAIFATECH INC. + + + 000B6C + Sychip Inc. + + + 000B8E + Ascent Corporation + + + 000B8F + AKITA ELECTRONICS SYSTEMS CO.,LTD. + + + 000B8D + Avvio Networks + + + 000BBD + Connexionz Limited + + + 000BA8 + HANBACK ELECTRONICS CO., LTD. + + + 000BA9 + CloudShield Technologies, Inc. + + + 000B5A + HyperEdge + + + 000B4E + Communications & Power Industries + + + 000B4D + Emuzed + + + 000B3D + CONTAL OK Ltd. + + + 000B31 + Yantai ZhiYang Scientific and technology industry CO., LTD + + + 0091D6 + Crystal Group, Inc. + + + 000B0C + Agile Systems Inc. + + + 000B0A + dBm Optics + + + 000B09 + Ifoundry Systems Singapore + + + 000B1D + LayerZero Power Systems, Inc. + + + 000B19 + Vernier Networks, Inc. + + + 000B16 + Communication Machinery Corporation + + + 000B12 + NURI Telecom Co., Ltd. + + + 000AD2 + JEPICO Corporation + + + 000AC5 + Color Kinetics + + + 000ABD + Rupprecht & Patashnick Co. + + + 000AA5 + MAXLINK INDUSTRIES LIMITED + + + 000AA9 + Brooks Automation GmbH + + + 000AA2 + SYSTEK INC. + + + 000ACB + XPAK MSA Group + + + 000AD5 + Brainchild Electronic Co., Ltd. + + + 000AD6 + BeamReach Networks + + + 000B2F + bplan GmbH + + + 000B24 + AirLogic + + + 000AFE + NovaPal Ltd + + + 000AFD + Kentec Electronics + + + 000AEF + OTRUM ASA + + + 000AE5 + ScottCare Corporation + + + 000AB0 + LOYTEC electronics GmbH + + + 000AB5 + Digital Electronic Network + + + 000A3A + J-THREE INTERNATIONAL Holding Co., Ltd. + + + 000A47 + Allied Vision Technologies + + + 000A44 + Avery Dennison Deutschland GmbH + + + 000A3C + Enerpoint Ltd. + + + 000A40 + Crown Audio -- Harmanm International + + + 000A9B + TB Group Inc + + + 000A84 + Rainsun Enterprise Co., Ltd. + + + 000A7E + The Advantage Group + + + 000A73 + Scientific Atlanta + + + 000A69 + SUNNY bell Technology Co., Ltd. + + + 000A6C + Walchem Corporation + + + 000A6B + Tadiran Telecom Business Systems LTD + + + 000A5F + almedio inc. + + + 000A28 + Motorola + + + 000A26 + CEIA S.p.A. + + + 000A29 + Pan Dacom Networking AG + + + 000A1D + Optical Communications Products Inc. + + + 000A61 + Cellinx Systems Inc. + + + 000A5B + Power-One as + + + 000A55 + MARKEM Corporation + + + 000A91 + HemoCue AB + + + 000A98 + M+F Gwinner GmbH & Co + + + 000A78 + OLITEC + + + 000A7B + Cornelius Consult + + + 000A4C + Molecular Devices Corporation + + + 000A4D + Noritz Corporation + + + 000A16 + Lassen Research + + + 000A18 + Vichel Inc. + + + 0009ED + CipherOptics + + + 0009F2 + Cohu, Inc., Electronics Division + + + 0009DC + Galaxis Technology AG + + + 0009DD + Mavin Technology Inc. + + + 000A06 + Teledex LLC + + + 000A0D + Amphenol + + + 0009F8 + UNIMO TECHNOLOGY CO., LTD. + + + 0009FF + X.net 2000 GmbH + + + 000A03 + ENDESA SERVICIOS, S.L. + + + 0009B5 + 3J Tech. Co., Ltd. + + + 0009B8 + Entise Systems + + + 0009AF + e-generis + + + 0009AD + HYUNDAI SYSCOMM, INC. + + + 0009A9 + Ikanos Communications + + + 00099F + VIDEX INC. + + + 0009A2 + Interface Co., Ltd. + + + 0009A1 + Telewise Communications, Inc. + + + 0009BD + Epygi Technologies, Ltd. + + + 0009C2 + Onity, Inc. + + + 0009C3 + NETAS + + + 0009FE + Daisy Technologies, Inc. + + + 0009EB + HuMANDATA LTD. + + + 0009E8 + Cisco Systems, Inc + + + 0009E9 + Cisco Systems, Inc + + + 0009CE + SpaceBridge Semiconductor Corp. + + + 0009C6 + Visionics Corporation + + + 0009D1 + SERANOA NETWORKS INC + + + 00096B + IBM Corp + + + 00096D + Powernet Technologies Corp. + + + 000964 + Hi-Techniques, Inc. + + + 000965 + HyunJu Computer Co., Ltd. + + + 00096F + Beijing Zhongqing Elegant Tech. Corp.,Limited + + + 00095E + Masstech Group Inc. + + + 000932 + Omnilux + + + 000929 + Sanyo Industries (UK) Limited + + + 000928 + Telecore + + + 00097D + SecWell Networks Oy + + + 000976 + Datasoft ISDN Systems GmbH + + + 00097A + Louis Design Labs. + + + 00091B + Digital Generation Inc. + + + 00091C + CacheVision, Inc + + + 00091A + Macat Optics & Electronics Co., Ltd. + + + 000939 + ShibaSoku Co.,Ltd. + + + 000933 + Ophit Co.Ltd. + + + 00094F + elmegt GmbH & Co. KG + + + 000943 + Cisco Systems, Inc + + + 000959 + Sitecsoft + + + 000957 + Supercaller, Inc. + + + 000982 + Loewe Opta GmbH + + + 000983 + GlobalTop Technology, Inc. + + + 0008B0 + HUBER+SUHNER BKtel GmbH + + + 0008AC + BST GmbH + + + 0008AA + KARAM + + + 0008AB + EnerLinx.com, Inc. + + + 0008AD + Toyo-Linx Co., Ltd. + + + 000879 + CEM Corporation + + + 00087D + Cisco Systems, Inc + + + 000875 + Acorp Electronics Corp. + + + 00086F + Resources Computer Network Ltd. + + + 000867 + Uptime Devices + + + 000888 + OULLIM Information Technology Inc,. + + + 000885 + EMS Dr. Thomas Wünsche + + + 000872 + Sorenson Communications + + + 00087C + Cisco Systems, Inc + + + 0008D2 + ZOOM Networks Inc. + + + 0008C5 + Liontech Co., Ltd. + + + 0008DF + Alistel Inc. + + + 0008DB + Corrigent Systems + + + 0008D8 + Dowkey Microwave + + + 0008F2 + C&S Technology + + + 0008EA + Motion Control Engineering, Inc + + + 0008ED + ST&T Instrument Corp. + + + 00089A + Alcatel Microelectronics + + + 0008A1 + CNet Technology Inc. + + + 000893 + LE INFORMATION COMMUNICATION INC. + + + 0008CA + TwinHan Technology Co.,Ltd + + + 0008B6 + RouteFree, Inc. + + + 000902 + Redline Communications Inc. + + + 0008FA + KEB Automation KG + + + 0007EE + telco Informationssysteme GmbH + + + 0007E2 + Bitworks, Inc. + + + 0007E6 + edgeflow Canada Inc. + + + 0007E5 + Coup Corporation + + + 0007DE + eCopilt AB + + + 0007DF + Vbrick Systems Inc. + + + 0007C5 + Gcom, Inc. + + + 0007C8 + Brain21, Inc. + + + 0007C1 + Overture Networks, Inc. + + + 0007C2 + Netsys Telecom + + + 000816 + Bluelon ApS + + + 000811 + VOIX Corporation + + + 000806 + Raonet Systems, Inc. + + + 0007F8 + ITDevices, Inc. + + + 0007F3 + Thinkengine Networks + + + 0005F9 + TOA Corporation + + + 0007CA + Creatix Polymedia Ges Fur Kommunikaitonssysteme + + + 000826 + Colorado Med Tech + + + 00081C + @pos.com + + + 00085E + PCO AG + + + 000856 + Gamatronic Electronic Industries Ltd. + + + 000853 + Schleicher GmbH & Co. Relaiswerke KG + + + 000744 + Unico, Inc. + + + 000749 + CENiX Inc. + + + 000739 + Scotty Group Austria Gmbh + + + 00073D + Nanjing Postel Telecommunications Co., Ltd. + + + 000735 + Flarion Technologies, Inc. + + + 00074E + IPFRONT Inc + + + 000752 + Rhythm Watch Co., Ltd. + + + 00074F + Cisco Systems, Inc + + + 000743 + Chelsio Communications + + + 000747 + Mecalc + + + 0007AE + Britestream Networks, Inc. + + + 0007B1 + Equator Technologies + + + 0007A6 + Leviton Manufacturing Co., Inc. + + + 0007A3 + Ositis Software, Inc. + + + 00079A + Verint Systems Inc + + + 000774 + GuangZhou Thinker Technology Co. Ltd. + + + 000798 + Selea SRL + + + 000791 + International Data Communications, Inc. + + + 000779 + Sungil Telecom Co., Ltd. + + + 00077E + Elrest GmbH + + + 000778 + GERSTEL GmbH & Co. KG + + + 00076D + Flexlight Networks + + + 00078F + Emkay Innovative Products + + + 000782 + Oracle Corporation + + + 000786 + Wireless Networks Inc. + + + 000722 + The Nielsen Company + + + 00071F + European Systems Integration + + + 000721 + Formac Elektronik GmbH + + + 00075E + Ametek Power Instruments + + + 000760 + TOMIS Information & Telecom Corp. + + + 000730 + Hutchison OPTEL Telecom Technology Co., Ltd. + + + 0006E5 + Fujian Newland Computer Ltd. Co. + + + 0006DE + Flash Technology + + + 0006DF + AIDONIC Corporation + + + 0006DD + AT & T Laboratories - Cambridge Ltd + + + 0006D1 + Tahoe Networks, Inc. + + + 0006D4 + Interactive Objects, Inc. + + + 0006CE + DATENO + + + 0006C5 + INNOVI Technologies Limited + + + 0006C6 + lesswire AG + + + 0006B7 + TELEM GmbH + + + 0006BC + Macrolink, Inc. + + + 0006C2 + Smartmatic Corporation + + + 0006F0 + Digeo, Inc. + + + 000700 + Zettamedia Korea + + + 0006F2 + Platys Communications + + + 0006FA + IP SQUARE Co, Ltd. + + + 000703 + CSEE Transport + + + 000706 + Sanritz Corporation + + + 0006EF + Maxxan Systems, Inc. + + + 0006E9 + Intime Corp. + + + 0006EA + ELZET80 Mikrocomputer GmbH&Co. KG + + + 000654 + Winpresa Building Automation Technologies GmbH + + + 0006B4 + Vorne Industries, Inc. + + + 0006AE + Himachal Futuristic Communications Ltd + + + 0006B0 + Comtech EF Data Corp. + + + 000708 + Bitrage Inc. + + + 000712 + JAL Information Technology + + + 000713 + IP One, Inc. + + + 000707 + Interalia Inc. + + + 000696 + Advent Networks + + + 00068E + HID Corporation + + + 00069B + AVT Audio Video Technologies GmbH + + + 000693 + Flexus Computer Technology, Inc. + + + 0006CA + American Computer & Digital Components, Inc. (ACDC) + + + 00068A + NeuronNet Co. Ltd. R&D Center + + + 000685 + NetNearU Corporation + + + 00067F + Digeo, Inc. + + + 000683 + Bravara Communications, Inc. + + + 000655 + Yipee, Inc. + + + 000634 + GTE Airfone Inc. + + + 000628 + Cisco Systems, Inc + + + 00061D + MIP Telecom, Inc. + + + 0005F6 + Young Chang Co. Ltd. + + + 0005FC + Schenck Pegasus Corp. + + + 0005E8 + TurboWave, Inc. + + + A06A00 + Verilink Corporation + + + 0005F8 + Real Time Access, Inc. + + + 000650 + Tiburon Networks, Inc. + + + 00065E + Photuris, Inc. + + + 000644 + NextGen Business Solutions, Inc + + + 00067A + JMP Systems + + + 000673 + TKH Security Solutions USA + + + 000676 + Novra Technologies Inc. + + + 000664 + Fostex Corporation + + + 000645 + Meisei Electric Co. Ltd. + + + 000640 + White Rock Networks + + + 00063A + Dura Micro, Inc. + + + 000632 + Mesco Engineering GmbH + + + 00060C + Melco Industries, Inc. + + + 00060E + IGYS Systems, Inc. + + + 000614 + Prism Holdings + + + 000608 + At-Sky SAS + + + 000619 + Connection Technology Systems + + + 00065D + Heidelberg Web Systems + + + 0005EB + Blue Ridge Networks, Inc. + + + 0005D7 + Vista Imaging, Inc. + + + 0005DD + Cisco Systems, Inc + + + 0005BE + Kongsberg Seatex AS + + + 0005BD + ROAX BV + + + 0005C1 + A-Kyung Motion, Inc. + + + 0005B6 + INSYS Microelectronics GmbH + + + 0005B4 + Aceex Corporation + + + 000598 + CRONOS S.r.l. + + + 000580 + FibroLAN Ltd. + + + 000582 + ClearCube Technology + + + 0005C3 + Pacific Instruments, Inc. + + + 0005B9 + Airvana, Inc. + + + 0005BC + Resource Data Management Ltd + + + 0005B7 + Arbor Technology Corp. + + + 00059B + Cisco Systems, Inc + + + 00059F + Yotta Networks, Inc. + + + 0005D9 + Techno Valley, Inc. + + + 0005DC + Cisco Systems, Inc + + + 0005D0 + Solinet Systems + + + 000587 + Locus, Incorporated + + + 000590 + Swissvoice Ltd. + + + 000595 + Alesis Corporation + + + 00056A + Heuft Systemtechnik GmbH + + + 000568 + Piltofish Networks AB + + + 000562 + Digital View Limited + + + 000578 + Private + + + 000572 + Deonet Co., Ltd. + + + 000576 + NSM Technology Ltd. + + + 000555 + Japan Cash Machine Co., Ltd. + + + 000552 + Xycotec Computer GmbH + + + 00054A + Ario Data Networks, Inc. + + + 000548 + Disco Corporation + + + 0004F7 + Omega Band, Inc. + + + 0004EE + Lincoln Electric Company + + + 0004F0 + International Computers, Ltd + + + 000527 + SJ Tek Co. Ltd + + + 000529 + Shanghai Broadan Communication Technology Co., Ltd + + + 00052C + Supreme Magic Corporation + + + 00053E + KID Systeme GmbH + + + 00053F + VisionTek, Inc. + + + 00053D + Agere Systems + + + 000500 + Cisco Systems, Inc + + + 000519 + Siemens Building Technologies AG, + + + 00050D + Midstream Technologies, Inc. + + + 0004DA + Relax Technology, Inc. + + + 0004E5 + Glonet Systems, Inc. + + + 000507 + Fine Appliance Corp. + + + 0004FD + Japan Control Engineering Co., Ltd. + + + 000535 + Chip PC Ltd. + + + 000455 + ANTARA.net + + + 000457 + Universal Access Technology, Inc. + + + 0004AB + Mavenir Inc. + + + 0004A7 + FabiaTech Corporation + + + 0004AA + Jetstream Communications + + + 0004A0 + Verity Instruments, Inc. + + + 00049E + Wirelink Co., Ltd. + + + 00049A + Cisco Systems, Inc + + + 0004D2 + Adcon Telemetry GmbH + + + 0004D3 + Toyokeiki Co., Ltd. + + + 000498 + Mahi Networks + + + 000497 + MacroSystem Digital Video AG + + + 000488 + Eurotherm Controls + + + 00044D + Cisco Systems, Inc + + + 000454 + Quadriga UK + + + 000448 + Polaroid Corporation + + + 000447 + Acrowave Systems Co., Ltd. + + + 000485 + PicoLight + + + 000479 + Radius Co., Ltd. + + + 0004D5 + Hitachi Information & Communication Engineering, Ltd. + + + 0004CA + FreeMs Corp. + + + 0004C5 + ASE Technologies, USA + + + 0004B0 + ELESIGN Co., Ltd. + + + 00046D + Cisco Systems, Inc + + + 000466 + ARMITEL Co. + + + 00043E + Telencomm + + + 000436 + ELANsat Technologies, Inc. + + + 000435 + InfiNet LLC + + + 000437 + Powin Information Technology, Inc. + + + 000414 + Umezawa Musen Denki Co., Ltd. + + + 00040C + Kanno Works, Ltd. + + + 000408 + Sanko Electronics Co., Ltd. + + + 000409 + Cratos Networks + + + 000407 + Topcon Positioning Systems, Inc. + + + 0003CD + Clovertech, Inc. + + + 0003CC + Momentum Computer, Inc. + + + 0003EE + MKNet Corporation + + + 0003EA + Mega System Technologies, Inc. + + + 0003E6 + Entone, Inc. + + + 0003D7 + NextNet Wireless, Inc. + + + 0003D3 + Internet Energy Systems, Inc. + + + 0003E2 + Comspace Corporation + + + 0003FF + Microsoft Corporation + + + 0003B5 + Entra Technology Co. + + + 000428 + Cisco Systems, Inc + + + 0003A9 + AXCENT Media AG + + + 000362 + Vodtel Communications, Inc. + + + 000364 + Scenix Semiconductor, Inc. + + + 00035E + Metropolitan Area Networks, Inc. + + + 00035C + Saint Song Corp. + + + 00035D + Bosung Hi-Net Co., Ltd. + + + 00038B + PLUS-ONE I&T, Inc. + + + 00038C + Total Impact + + + 000386 + Ho Net, Inc. + + + 008037 + Ericsson Group + + + 00033D + ILSHin Lab + + + 000334 + Omega Engineering Inc. + + + 00033A + Silicon Wave, Inc. + + + 000332 + Cisco Systems, Inc + + + 00037D + Stellcom + + + 000383 + Metera Networks, Inc. + + + 000379 + Proscend Communications, Inc. + + + 00036F + Telsey SPA + + + 000372 + ULAN + + + 000366 + ASM Pacific Technology + + + 00039F + Cisco Systems, Inc + + + 000390 + Digital Video Communications, Inc. + + + 00034D + Chiaro Networks, Ltd. + + + 000322 + IDIS Co., Ltd. + + + 00031D + Taiwan Commate Computer, Inc. + + + 000326 + Iwasaki Information Systems Co., Ltd. + + + 000290 + Woorigisool, Inc. + + + 000292 + Logic Innovations, Inc. + + + 000286 + Occam Networks + + + 001095 + Thomson Inc. + + + 00027B + Amplify Net, Inc. + + + 000273 + Coriolis Networks + + + 0002B4 + DAPHNE + + + 0002B0 + Hokubu Communication & Industrial Co., Ltd. + + + 0002AA + PLcom Co., Ltd. + + + 00029D + Merix Corp. + + + 0002D2 + Workstation AG + + + 0002CD + TeleDream, Inc. + + + 0002D0 + Comdial Corporation + + + 0002CC + M.C.C.I + + + 0002E8 + E.D.&A. + + + 0002D9 + Reliable Controls + + + 00030E + Core Communications Co., Ltd. + + + 000312 + TRsystems GmbH + + + 0002F2 + eDevice, Inc. + + + 0002EF + CCC Network Systems Group Ltd. + + + 0002C5 + Evertz Microsystems Ltd. + + + 0002B5 + Avnet, Inc. + + + 00027E + Cisco Systems, Inc + + + 00027F + ask-technologies.com + + + 000249 + Aviv Infocom Co, Ltd. + + + 000245 + Lampus Co, Ltd. + + + 000246 + All-Win Tech Co., Ltd. + + + 00021C + Network Elements, Inc. + + + 00020C + Metro-Optix + + + 000216 + Cisco Systems, Inc + + + 000214 + DTVRO + + + 00023A + ZSK Stickmaschinen GmbH + + + 000232 + Avision, Inc. + + + 000235 + Paragon Networks International + + + 000237 + Cosmo Research Corp. + + + 000228 + Necsom, Ltd. + + + 00025D + Calix Networks + + + 000257 + Microcom Corp. + + + 000253 + Televideo, Inc. + + + 00024A + Cisco Systems, Inc + + + 00026F + Senao International Co., Ltd. + + + 0001ED + SETA Corp. + + + 0001EA + Cirilium Corp. + + + 00020F + AATR + + + 0001F6 + Association of Musical Electronics Industry + + + 0001E0 + Fast Systems, Inc. + + + 0001D6 + manroland AG + + + 000230 + Intersoft Electronics + + + 000166 + TC GROUP A/S + + + 000171 + Allied Data Technologies + + + 000176 + Orient Silver Enterprises + + + 000158 + Electro Industries/Gauge Tech + + + 00012A + Telematica Sistems Inteligente + + + 00012D + Komodo Technology + + + 000148 + X-traWeb Inc. + + + 0030AC + Systeme Lauer GmbH & Co., Ltd. + + + 0001AC + Sitara Networks, Inc. + + + 0001AD + Coach Master International d.b.a. CMI Worldwide, Inc. + + + 00019B + Kyoto Microcomputer Co., Ltd. + + + 000188 + LXCO Technologies ag + + + 00017F + Experience Music Project + + + 000187 + I2SE GmbH + + + 0001CB + EVR + + + 0001C3 + Acromag, Inc. + + + 0001C2 + ARK Research Corp. + + + 000197 + Cisco Systems, Inc + + + 000180 + AOpen, Inc. + + + 00015A + Digital Video Broadcasting + + + 000159 + S1 Corporation + + + 00019A + LEUNIG GmbH + + + 00013A + SHELCAD COMMUNICATIONS, LTD. + + + 000140 + Sendtek Corporation + + + 000123 + Schneider Electric Japan Holdings Ltd. + + + 000125 + YAESU MUSEN CO., LTD. + + + 000126 + PAC Labs + + + 00011B + Unizone Technologies, Inc. + + + 00B0F0 + CALY NETWORKS + + + 00B09A + Morrow Technologies Corp. + + + 0030A9 + Netiverse, Inc. + + + 0030FE + DSA GmbH + + + 0030C4 + Canon Imaging Systems Inc. + + + 00304D + ESI + + + 0030D5 + DResearch GmbH + + + 003018 + Jetway Information Co., Ltd. + + + 003089 + Spectrapoint Wireless, LLC + + + 00011D + Centillium Communications + + + 00011F + RC Networks, Inc. + + + 00B080 + Mannesmann Ipulsys B.V. + + + 00B01E + Rantic Labs, Inc. + + + 0030FB + AZS Technology AG + + + 003003 + Phasys Ltd. + + + 0030AE + Times N System, Inc. + + + 0030E2 + GARNET SYSTEMS CO., LTD. + + + 081443 + UNIBRAIN S.A. + + + 00B009 + Grass Valley, A Belden Brand + + + 00B0AC + SIAE-Microelettronica S.p.A. + + + 00302E + Hoft & Wessel AG + + + 0030ED + Expert Magnetics Corp. + + + 00300F + IMT - Information Management T + + + 003082 + TAIHAN ELECTRIC WIRE CO., LTD. + + + 0030E6 + Draeger Medical Systems, Inc. + + + 003062 + IP Video Networks Inc + + + 00302D + QUANTUM BRIDGE COMMUNICATIONS + + + 0030CB + OMNI FLOW COMPUTERS, INC. + + + 00306B + CMOS SYSTEMS, INC. + + + 0030AD + SHANGHAI COMMUNICATION + + + 003090 + CYRA TECHNOLOGIES, INC. + + + 0030A7 + SCHWEITZER ENGINEERING + + + 003023 + COGENT COMPUTER SYSTEMS, INC. + + + 00307C + ADID SA + + + 00309A + ASTRO TERRA CORP. + + + 00309F + AMBER NETWORKS + + + 0030A8 + OL'E COMMUNICATIONS, INC. + + + 0030D1 + INOVA CORPORATION + + + 0030CF + TWO TECHNOLOGIES, INC. + + + 0030B2 + L-3 Sonoma EO + + + 003035 + Corning Incorporated + + + 00307F + IRLAN LTD. + + + 0030AA + AXUS MICROSYSTEMS, INC. + + + 00305D + DIGITRA SYSTEMS, INC. + + + 003055 + Renesas Technology America, Inc. + + + 00302F + GE Aviation System + + + 00300E + Klotz Digital AG + + + 0030BB + CacheFlow, Inc. + + + 003007 + OPTI, INC. + + + 0030BD + BELKIN COMPONENTS + + + 003087 + VEGA GRIESHABER KG + + + 00D0C2 + BALTHAZAR TECHNOLOGY AB + + + 00D022 + INCREDIBLE TECHNOLOGIES, INC. + + + 00D071 + ECHELON CORP. + + + 00D04F + BITRONICS, INC. + + + 00D0FB + TEK MICROSYSTEMS, INCORPORATED + + + 00D066 + WINTRISS ENGINEERING CORP. + + + 00D082 + IOWAVE INC. + + + 00D069 + TECHNOLOGIC SYSTEMS + + + 00D090 + Cisco Systems, Inc + + + 00D0F5 + ORANGE MICRO, INC. + + + 00D078 + Eltex of Sweden AB + + + 00D0E9 + Advantage Century Telecommunication Corp. + + + 00D094 + Seeion Control LLC + + + 00D015 + UNIVEX MICROTECHNOLOGY CORP. + + + 00D0A5 + AMERICAN ARIUM + + + 00D0CF + MORETON BAY + + + 00D07F + STRATEGY & TECHNOLOGY, LIMITED + + + 003036 + RMP ELEKTRONIKSYSTEME GMBH + + + 00D081 + RTD Embedded Technologies, Inc. + + + 00D002 + DITECH CORPORATION + + + 00D048 + ECTON, INC. + + + 00D085 + OTIS ELEVATOR COMPANY + + + 00D09B + SPECTEL LTD. + + + 00D011 + PRISM VIDEO, INC. + + + 00D0DF + KUZUMI ELECTRONICS, INC. + + + 00D062 + DIGIGRAM + + + 00D067 + CAMPIO COMMUNICATIONS + + + 00D058 + Cisco Systems, Inc + + + 00D03D + GALILEO TECHNOLOGY, LTD. + + + 00D032 + YANO ELECTRIC CO., LTD. + + + 00D0F1 + SEGA ENTERPRISES, LTD. + + + 00505E + DIGITEK MICROLOGIC S.A. + + + 005090 + DCTRI + + + 00503B + MEDIAFIRE CORPORATION + + + 005046 + MENICX INTERNATIONAL CO., LTD. + + + 0050B0 + TECHNOLOGY ATLANTA CORPORATION + + + 005041 + Coretronic Corporation + + + 0050DD + SERRA SOLDADURA, S.A. + + + 00D04C + Eseye Design Ltd + + + 00D0D9 + DEDICATED MICROCOMPUTERS + + + 00D0E1 + AVIONITEK ISRAEL INC. + + + 00D008 + MACTELL CORPORATION + + + 00D00B + RHK TECHNOLOGY, INC. + + + 00D0A0 + MIPS DENMARK + + + 00D00A + LANACCESS TELECOM S.A. + + + 00D02B + JETCELL, INC. + + + 00503E + Cisco Systems, Inc + + + 00D03A + ZONEWORX, INC. + + + 00D001 + VST TECHNOLOGIES, INC. + + + 005020 + MEDIASTAR CO., LTD. + + + 00D075 + ALARIS MEDICAL SYSTEMS, INC. + + + 005067 + AEROCOMM, INC. + + + 0050B6 + GOOD WAY IND. CO., LTD. + + + 00504B + BARCONET N.V. + + + 0050EA + XEL COMMUNICATIONS, INC. + + + 0050E8 + Nomadix, Inc + + + 00D08D + PHOENIX GROUP, INC. + + + 00D09C + KAPADIA COMMUNICATIONS + + + 00D0F3 + SOLARI DI UDINE SPA + + + 00D039 + UTILICOM, INC. + + + 0050E7 + PARADISE INNOVATIONS (ASIA) + + + 0050FB + VSK ELECTRONICS + + + 0050F4 + SIGMATEK GMBH & CO. KG + + + 005021 + EIS INTERNATIONAL, INC. + + + 00D01C + SBS TECHNOLOGIES, + + + 00D0D5 + GRUNDIG AG + + + 00D06D + ACRISON, INC. + + + 00D041 + AMIGO TECHNOLOGY CO., LTD. + + + 00D09D + VERIS INDUSTRIES + + + 0050C6 + LOOP TELECOMMUNICATION INTERNATIONAL, INC. + + + 00509F + HORIZON COMPUTER + + + 0050A5 + CAPITOL BUSINESS SYSTEMS, LTD. + + + 005000 + NEXO COMMUNICATIONS, INC. + + + 0050C8 + Addonics Technologies, Inc. + + + 00508D + ABIT COMPUTER CORPORATION + + + 0050A0 + DELTA COMPUTER SYSTEMS, INC. + + + 005086 + TELKOM SA, LTD. + + + 00501A + IQinVision + + + 00508F + ASITA TECHNOLOGIES INT'L LTD. + + + 005015 + BRIGHT STAR ENGINEERING + + + 005089 + SAFETY MANAGEMENT SYSTEMS + + + 005066 + AtecoM GmbH advanced telecomunication modules + + + 005059 + iBAHN + + + 0050D9 + ENGETRON-ENGENHARIA ELETRONICA IND. e COM. LTDA + + + 005057 + BROADBAND ACCESS SYSTEMS + + + 005088 + AMANO CORPORATION + + + 005031 + AEROFLEX LABORATORIES, INC. + + + 005063 + OY COMSEL SYSTEM AB + + + 005003 + Xrite Inc + + + 0050D3 + DIGITAL AUDIO PROCESSING PTY. LTD. + + + 0050AF + INTERGON, INC. + + + 0050AD + CommUnique Wireless Corp. + + + 009034 + IMAGIC, INC. + + + 0050AE + FDK Co., Ltd + + + 009073 + GAIO TECHNOLOGY + + + 00907B + E-TECH, INC. + + + 009081 + ALOHA NETWORKS, INC. + + + 00901C + mps Software Gmbh + + + 0090DB + NEXT LEVEL COMMUNICATIONS + + + 00901A + UNISPHERE SOLUTIONS + + + 0090B5 + NIKON CORPORATION + + + 009005 + PROTECH SYSTEMS CO., LTD. + + + 0090F8 + MEDIATRIX TELECOM + + + 009010 + SIMULATION LABORATORIES, INC. + + + 0090C6 + OPTIM SYSTEMS, INC. + + + 0090CA + ACCORD VIDEO TELECOMMUNICATIONS, LTD. + + + 0090E9 + JANZ COMPUTER AG + + + 009037 + ACUCOMM, INC. + + + 009078 + MER TELEMANAGEMENT SOLUTIONS, LTD. + + + 0090B8 + ROHDE & SCHWARZ GMBH & CO. KG + + + 00905B + RAYMOND AND LAE ENGINEERING + + + 0090BC + TELEMANN CO., LTD. + + + 00900A + PROTON ELECTRONIC INDUSTRIAL CO., LTD. + + + 0090D5 + EUPHONIX, INC. + + + 00904A + CONCUR SYSTEM TECHNOLOGIES + + + 0090EB + SENTRY TELECOM SYSTEMS + + + 0090FE + ELECOM CO., LTD. (LANEED DIV.) + + + 009059 + TELECOM DEVICE K.K. + + + 00902E + NAMCO LIMITED + + + 00908F + AUDIO CODES LTD. + + + 0090AA + INDIGO ACTIVE VISION SYSTEMS LIMITED + + + 00905E + RAULAND-BORG CORPORATION + + + 0090AF + J. MORITA MFG. CORP. + + + 0090BB + TAINET COMMUNICATION SYSTEM Corp. + + + 009090 + I-BUS + + + 009056 + TELESTREAM, INC. + + + 009068 + DVT CORP. + + + 0010A5 + OXFORD INSTRUMENTS + + + 0010D7 + ARGOSY RESEARCH INC. + + + 001092 + NETCORE INC. + + + 00101C + OHM TECHNOLOGIES INTL, LLC + + + 001046 + ALCORN MCBRIDE INC. + + + 009074 + ARGON NETWORKS, INC. + + + 00903B + TriEMS Research Lab, Inc. + + + 00909F + DIGI-DATA CORPORATION + + + 009019 + HERMES ELECTRONICS CO., LTD. + + + 0010C9 + MITSUBISHI ELECTRONICS LOGISTIC SUPPORT CO. + + + 000400 + LEXMARK INTERNATIONAL, INC. + + + 0010C5 + PROTOCOL TECHNOLOGIES, INC. + + + 00101A + PictureTel Corp. + + + 0010B7 + COYOTE TECHNOLOGIES, LLC + + + 001028 + COMPUTER TECHNICA, INC. + + + 00102C + Lasat Networks A/S + + + 0010FD + COCOM A/S + + + 001047 + ECHO ELETRIC CO. LTD. + + + 00903F + WorldCast Systems + + + 001043 + A2 CORPORATION + + + 0090D8 + WHITECROSS SYSTEMS + + + 0090E5 + TEKNEMA, INC. + + + 0090F4 + LIGHTNING INSTRUMENTATION + + + 00109E + AWARE, INC. + + + 001005 + UEC COMMERCIAL + + + 0010B8 + ISHIGAKI COMPUTER SYSTEM CO. + + + 00108B + LASERANIMATION SOLLINGER GMBH + + + 0010C7 + DATA TRANSMISSION NETWORK + + + 00104E + CEOLOGIC + + + 001074 + ATEN INTERNATIONAL CO., LTD. + + + 001070 + CARADON TREND LTD. + + + 0010BA + MARTINHO-DAVIS SYSTEMS, INC. + + + 0010C2 + WILLNET, INC. + + + 001040 + INTERMEC CORPORATION + + + 00102E + NETWORK SYSTEMS & TECHNOLOGIES PVT. LTD. + + + 0010B0 + MERIDIAN TECHNOLOGY CORP. + + + 001067 + Ericsson + + + 001021 + ENCANTO NETWORKS, INC. + + + 001064 + DNPG, LLC + + + 0004AC + IBM Corp + + + 0010B4 + ATMOSPHERE NETWORKS + + + 00E05D + UNITEC CO., LTD. + + + 00E05E + JAPAN AVIATION ELECTRONICS INDUSTRY, LTD. + + + 00E09D + SARNOFF CORPORATION + + + 00E08C + NEOPARADIGM LABS, INC. + + + 00E07D + NETRONIX, INC. + + + 00E0D2 + VERSANET COMMUNICATIONS, INC. + + + 00E047 + InFocus Corporation + + + 00E0C3 + SAKAI SYSTEM DEVELOPMENT CORP. + + + 00E092 + ADMTEK INCORPORATED + + + 00E0FF + SECURITY DYNAMICS TECHNOLOGIES, Inc. + + + 00E0AB + DIMAT S.A. + + + 00E030 + MELITA INTERNATIONAL CORP. + + + 00E028 + APTIX CORPORATION + + + 00E0A1 + HIMA PAUL HILDEBRANDT GmbH Co. KG + + + 00E088 + LTX-Credence CORPORATION + + + 00E0F2 + ARLOTTO COMNET, INC. + + + 00E046 + BENTLY NEVADA CORP. + + + 00E058 + PHASE ONE DENMARK A/S + + + 00E076 + DEVELOPMENT CONCEPTS, INC. + + + 00E0F8 + DICNA CONTROL AB + + + 00E0AA + ELECTROSONIC LTD. + + + 00E010 + HESS SB-AUTOMATENBAU GmbH + + + 00E033 + E.E.P.D. GmbH + + + 00E0A2 + MICROSLATE INC. + + + 00E079 + A.T.N.R. + + + 00E07B + BAY NETWORKS + + + 00E01D + WebTV NETWORKS, INC. + + + 00E0E1 + G2 NETWORKS, INC. + + + 00E08D + PRESSURE SYSTEMS, INC. + + + 00E03D + FOCON ELECTRONIC SYSTEMS A/S + + + 00E019 + ING. GIORDANO ELETTRONICA + + + 0060B3 + Z-COM, INC. + + + 006002 + SCREEN SUBTITLING SYSTEMS, LTD + + + 006089 + XATA + + + 006021 + DSC CORPORATION + + + 0060B8 + CORELIS Inc. + + + 0060AD + MegaChips Corporation + + + 006055 + CORNELL UNIVERSITY + + + 00E075 + Verilink Corporation + + + 00E02E + SPC ELECTRONICS CORPORATION + + + 00E03E + ALFATECH, INC. + + + 00E09A + Positron Inc. + + + 006039 + SanCom Technology, Inc. + + + 006049 + VINA TECHNOLOGIES + + + 00608D + UNIPULSE CORP. + + + 006099 + SBE, Inc. + + + 006098 + HT COMMUNICATIONS + + + 0060DE + Kayser-Threde GmbH + + + 00609C + Perkin-Elmer Incorporated + + + 0060CF + ALTEON NETWORKS, INC. + + + 006075 + PENTEK, INC. + + + 006015 + NET2NET CORPORATION + + + 00609E + ASC X3 - INFORMATION TECHNOLOGY STANDARDS SECRETARIATS + + + 006010 + NETWORK MACHINES, INC. + + + 006044 + LITTON/POLY-SCIENTIFIC + + + 0060A2 + NIHON UNISYS LIMITED CO. + + + 00609D + PMI FOOD EQUIPMENT GROUP + + + 006084 + DIGITAL VIDEO + + + 00602D + ALERTON TECHNOLOGIES, INC. + + + 0060F8 + Loran International Technologies Inc. + + + 0060B9 + NEC Platforms, Ltd + + + 006036 + AIT Austrian Institute of Technology GmbH + + + 00608E + HE ELECTRONICS, TECHNOLOGIE & SYSTEMTECHNIK GmbH + + + 00606A + MITSUBISHI WIRELESS COMMUNICATIONS. INC. + + + 00601A + KEITHLEY INSTRUMENTS + + + 0060F6 + NEXTEST COMMUNICATIONS PRODUCTS, INC. + + + 006072 + VXL INSTRUMENTS, LIMITED + + + 006051 + QUALITY SEMICONDUCTOR + + + 006092 + MICRO/SYS, INC. + + + 0060BA + SAHARA NETWORKS, INC. + + + 00606D + DIGITAL EQUIPMENT CORP. + + + 0060CE + ACCLAIM COMMUNICATIONS + + + 0060AF + PACIFIC MICRO DATA, INC. + + + 006038 + Nortel Networks + + + 0060CA + HARMONIC SYSTEMS INCORPORATED + + + 006024 + GRADIENT TECHNOLOGIES, INC. + + + 006078 + POWER MEASUREMENT LTD. + + + 006004 + COMPUTADORES MODULARES SA + + + 0060B4 + GLENAYRE R&D INC. + + + 00A01D + Red Lion Controls, LP + + + 0060D0 + SNMP RESEARCH INCORPORATED + + + 0060B7 + CHANNELMATIC, INC. + + + 006006 + SOTEC CO., LTD + + + 00A0B9 + EAGLE TECHNOLOGY, INC. + + + 00A019 + NEBULA CONSULTANTS, INC. + + + 00A0ED + Brooks Automation, Inc. + + + 00604F + Tattile SRL + + + 0060E8 + HITACHI COMPUTER PRODUCTS (AMERICA), INC. + + + 00A065 + Symantec Corporation + + + 00A0A3 + RELIABLE POWER METERS + + + 00A055 + Data Device Corporation + + + 00A074 + PERCEPTION TECHNOLOGY + + + 00A07F + GSM-SYNTEL, LTD. + + + 00A0D0 + TEN X TECHNOLOGY, INC. + + + 00A0BC + VIASAT, INCORPORATED + + + 00A0A6 + M.I. SYSTEMS, K.K. + + + 00A051 + ANGIA COMMUNICATIONS. INC. + + + 00A013 + TELTREND LTD. + + + 00A029 + COULTER CORPORATION + + + 00A087 + Microsemi Corporation + + + 00A043 + AMERICAN TECHNOLOGY LABS, INC. + + + 00A0A0 + COMPACT DATA, LTD. + + + 00A05B + MARQUIP, INC. + + + 00A08C + MultiMedia LANs, Inc. + + + 00A038 + EMAIL ELECTRONICS + + + 00A077 + FUJITSU NEXION, INC. + + + 00A0D7 + KASTEN CHASE APPLIED RESEARCH + + + 00A0F1 + MTI + + + 00A0FF + TELLABS OPERATIONS, INC. + + + 00A0E5 + NHC COMMUNICATIONS + + + 00A036 + APPLIED NETWORK TECHNOLOGY + + + 00A0D2 + ALLIED TELESIS INTERNATIONAL CORPORATION + + + 00A0D3 + INSTEM COMPUTER SYSTEMS, LTD. + + + 00A0B4 + TEXAS MICROSYSTEMS, INC. + + + 00A03B + TOSHIN ELECTRIC CO., LTD. + + + 00A0F3 + STAUBLI + + + 00A042 + SPUR PRODUCTS CORP. + + + 00A0C1 + ORTIVUS MEDICAL AB + + + 00A04F + AMERITEC CORP. + + + 00A0CF + SOTAS, INC. + + + 00A072 + OVATION SYSTEMS LTD. + + + 00A082 + NKT ELEKTRONIK A/S + + + 00A0F0 + TORONTO MICROELECTRONICS INC. + + + 00A09B + QPSX COMMUNICATIONS, LTD. + + + 00A000 + CENTILLION NETWORKS, INC. + + + 00A08A + BROOKTROUT TECHNOLOGY, INC. + + + 00A07B + DAWN COMPUTER INCORPORATION + + + 00A05C + INVENTORY CONVERSION, INC./ + + + 00200F + EBRAINS Inc + + + 0020DF + KYOSAN ELECTRIC MFG. CO., LTD. + + + 0020C7 + AKAI Professional M.I. Corp. + + + 002092 + CHESS ENGINEERING B.V. + + + 00202B + ADVANCED TELECOMMUNICATIONS MODULES, LTD. + + + 00206B + KONICA MINOLTA HOLDINGS, INC. + + + 00A060 + ACER PERIPHERALS, INC. + + + 00A083 + ASIMMPHONY TURKEY + + + 00A004 + NETPOWER, INC. + + + 002087 + MEMOTEC, INC. + + + 0020F9 + PARALINK NETWORKS, INC. + + + 00A0AA + SPACELABS MEDICAL + + + 002006 + GARRETT COMMUNICATIONS, INC. + + + 002024 + PACIFIC COMMUNICATION SCIENCES + + + 0020D1 + MICROCOMPUTER SYSTEMS (M) SDN. + + + 0020CE + LOGICAL DESIGN GROUP, INC. + + + 002014 + GLOBAL VIEW CO., LTD. + + + 0020B3 + Tattile SRL + + + 002016 + SHOWA ELECTRIC WIRE & CABLE CO + + + 00204D + INOVIS GMBH + + + 00205F + GAMMADATA COMPUTER GMBH + + + 00201F + BEST POWER TECHNOLOGY, INC. + + + 0020B6 + AGILE NETWORKS, INC. + + + 0020ED + GIGA-BYTE TECHNOLOGY CO., LTD. + + + 002085 + Eaton Corporation + + + 0020CD + HYBRID NETWORKS, INC. + + + 00202E + DAYSTAR DIGITAL + + + 002029 + TELEPROCESSING PRODUCTS, INC. + + + 002069 + ISDN SYSTEMS CORPORATION + + + 00208B + LAPIS TECHNOLOGIES, INC. + + + 0020E5 + APEX DATA, INC. + + + 002043 + NEURON COMPANY LIMITED + + + 002071 + IBR GMBH + + + 002057 + TITZE DATENTECHNIK GmbH + + + 002015 + ACTIS COMPUTER SA + + + 002099 + BON ELECTRIC CO., LTD. + + + 0020C2 + TEXAS MEMORY SYSTEMS, INC. + + + 00205D + NANOMATIC OY + + + 002004 + YAMATAKE-HONEYWELL CO., LTD. + + + 0020BC + Long Reach Networks Pty Ltd + + + 00207C + AUTEC GMBH + + + 0020EE + GTECH CORPORATION + + + 00204C + MITRON COMPUTER PTE LTD. + + + 002017 + ORBOTECH + + + 002093 + LANDINGS TECHNOLOGY CORP. + + + 002063 + WIPRO INFOTECH LTD. + + + 002056 + NEOPRODUCTS + + + 002042 + DATAMETRICS CORP. + + + 002078 + RUNTOP, INC. + + + 00C0F3 + NETWORK COMMUNICATIONS CORP. + + + 00C0C0 + SHORE MICROSYSTEMS, INC. + + + 00C00C + RELIA TECHNOLGIES + + + 00C067 + UNITED BARCODE INDUSTRIES + + + 00C0A3 + DUAL ENTERPRISES CORPORATION + + + 00C073 + XEDIA CORPORATION + + + 00C0D4 + AXON NETWORKS, INC. + + + 00C0CD + COMELTA, S.A. + + + 00C090 + PRAIM S.R.L. + + + 00C0DE + ZCOMM, INC. + + + 00C033 + TELEBIT COMMUNICATIONS APS + + + 00C005 + LIVINGSTON ENTERPRISES, INC. + + + 00C077 + DAEWOO TELECOM LTD. + + + 00C0C8 + MICRO BYTE PTY. LTD. + + + 00C069 + Axxcelera Broadband Wireless + + + 00C013 + NETRIX + + + 00C058 + DATAEXPERT CORP. + + + 00C0D0 + RATOC SYSTEM INC. + + + 00C0BF + TECHNOLOGY CONCEPTS, LTD. + + + 00C018 + LANART CORPORATION + + + 009D8E + CARDIAC RECORDERS, INC. + + + 00BB01 + OCTOTHORPE CORP. + + + 00C06B + OSI PLUS CORPORATION + + + 00C04C + DEPARTMENT OF FOREIGN AFFAIRS + + + 00C07C + HIGHTECH INFORMATION + + + 00C0B8 + FRASER'S HILL LTD. + + + 00C062 + IMPULSE TECHNOLOGY + + + 00C0EC + DAUPHIN TECHNOLOGY + + + 00C016 + ELECTRONIC THEATRE CONTROLS + + + 00C086 + THE LYNK CORPORATION + + + 00C06C + SVEC COMPUTER CORP. + + + 0040FF + TELEBIT CORPORATION + + + 00401F + COLORGRAPH LTD + + + 0040AF + DIGITAL PRODUCTS, INC. + + + 0040F7 + Polaroid Corporation + + + 004037 + SEA-ILAN, INC. + + + 00404E + FLUENT, INC. + + + 00408D + THE GOODYEAR TIRE & RUBBER CO. + + + 00C026 + LANS TECHNOLOGY CO., LTD. + + + 00C0D5 + Werbeagentur Jürgen Siebert + + + 00C063 + MORNING STAR TECHNOLOGIES, INC + + + 00C021 + NETEXPRESS + + + 00C0C1 + QUAD/GRAPHICS, INC. + + + 00C0BA + NETVANTAGE + + + 00C05E + VARI-LITE, INC. + + + 00C0DB + IPC CORPORATION (PTE) LTD. + + + 00C09B + Tellabs Enterprise, Inc. + + + 00C089 + TELINDUS DISTRIBUTION + + + 00C0E3 + OSITECH COMMUNICATIONS, INC. + + + 00C0FE + APTEC COMPUTER SYSTEMS, INC. + + + 00C0B0 + GCC TECHNOLOGIES,INC. + + + 00C0CA + ALFA, INC. + + + 00C0BC + TELECOM AUSTRALIA/CSSC + + + 00C00A + MICRO CRAFT + + + 00C074 + TOYODA AUTOMATIC LOOM + + + 00C04A + GROUP 2000 AG + + + 0040F2 + JANICH & KLASS COMPUTERTECHNIK + + + 0040A2 + KINGSTAR TECHNOLOGY INC. + + + 0040DC + TRITEC ELECTRONIC GMBH + + + 004054 + CONNECTION MACHINES SERVICES + + + 004004 + ICM CO. LTD. + + + 004018 + ADOBE SYSTEMS, INC. + + + 00C0D7 + TAIWAN TRADING CENTER DBA + + + 0040DA + TELSPEC LTD + + + 0040A6 + Cray, Inc. + + + 004030 + GK COMPUTER + + + 004040 + RING ACCESS, INC. + + + 008057 + ADSOFT, LTD. + + + 0080BB + HUGHES LAN SYSTEMS + + + 00403D + Teradata Corporation + + + 0040D0 + MITAC INTERNATIONAL CORP. + + + 0040AB + ROLAND DG CORPORATION + + + 0040B6 + COMPUTERM CORPORATION + + + 0040A3 + MICROUNITY SYSTEMS ENGINEERING + + + 0040B3 + ParTech Inc. + + + 00401D + INVISIBLE SOFTWARE, INC. + + + 004046 + UDC RESEARCH LIMITED + + + 00404A + WEST AUSTRALIAN DEPARTMENT + + + 00403C + FORKS, INC. + + + 004042 + N.A.T. GMBH + + + 0040F9 + COMBINET + + + 00407E + EVERGREEN SYSTEMS, INC. + + + 00403E + RASTER OPS CORPORATION + + + 00C06F + KOMATSU LTD. + + + 00C0A7 + SEEL LTD. + + + 00401B + PRINTER SYSTEMS CORP. + + + 0040EE + OPTIMEM + + + 004051 + Garbee and Garbee + + + 00407A + SOCIETE D'EXPLOITATION DU CNIT + + + 0040D3 + KIMPSION INTERNATIONAL CORP. + + + 004025 + MOLECULAR DYNAMICS + + + 0040C7 + RUBY TECH CORPORATION + + + 004052 + STAR TECHNOLOGIES, INC. + + + 00402E + PRECISION SOFTWARE, INC. + + + 00402B + TRIGEM COMPUTER, INC. + + + 00401A + FUJI ELECTRIC CO., LTD. + + + 004080 + ATHENIX CORPORATION + + + 004001 + Zero One Technology Co. Ltd. + + + 004071 + ATM COMPUTER GMBH + + + 004060 + COMENDEC LTD + + + 004056 + MCM JAPAN LTD. + + + 004067 + OMNIBYTE CORPORATION + + + 0040C3 + FISCHER AND PORTER CO. + + + 0040EC + MIKASA SYSTEM ENGINEERING + + + 0080F1 + OPUS SYSTEMS + + + 008029 + EAGLE TECHNOLOGY, INC. + + + 008072 + MICROPLEX SYSTEMS LTD. + + + 00802F + NATIONAL INSTRUMENTS CORP. + + + 008054 + FRONTIER TECHNOLOGIES CORP. + + + 008053 + INTELLICOM, INC. + + + 008026 + NETWORK PRODUCTS CORPORATION + + + 0080B0 + ADVANCED INFORMATION + + + 0080FA + RWT GMBH + + + 0080FD + EXSCEED CORPRATION + + + 0080FE + AZURE TECHNOLOGIES, INC. + + + 00803C + TVS ELECTRONICS LTD + + + 008046 + Tattile SRL + + + 00800E + ATLANTIX CORPORATION + + + 0080AB + DUKANE NETWORK INTEGRATION + + + 004002 + PERLE SYSTEMS LIMITED + + + 004049 + Roche Diagnostics International Ltd. + + + 004029 + Compex + + + 0080A2 + CREATIVE ELECTRONIC SYSTEMS + + + 00804B + EAGLE TECHNOLOGIES PTY.LTD. + + + 0080EC + SUPERCOMPUTING SOLUTIONS, INC. + + + 008027 + ADAPTIVE SYSTEMS, INC. + + + 0080FC + AVATAR CORPORATION + + + 0080E4 + NORTHWEST DIGITAL SYSTEMS, INC + + + 0080AD + CNET TECHNOLOGY, INC. + + + 008011 + DIGITAL SYSTEMS INT'L. INC. + + + 008034 + SMT GOUPIL + + + 00802C + THE SAGE GROUP PLC + + + 0080C8 + D-LINK SYSTEMS, INC. + + + 008012 + INTEGRATED MEASUREMENT SYSTEMS + + + 0080A5 + SPEED INTERNATIONAL + + + 008079 + MICROBUS DESIGNS LTD. + + + 0080B7 + STELLAR COMPUTER + + + 00805C + AGILIS CORPORATION + + + 0080C5 + NOVELLCO DE MEXICO + + + 0080D6 + NUVOTECH, INC. + + + 00800A + JAPAN COMPUTER CORP. + + + 0080CC + MICROWAVE BYPASS SYSTEMS + + + 0000A5 + Tattile SRL + + + 000036 + ATARI CORPORATION + + + 0000F8 + DIGITAL EQUIPMENT CORPORATION + + + 008014 + ESPRIT SYSTEMS + + + 000079 + NETWORTH INCORPORATED + + + 000091 + ANRITSU CORPORATION + + + 0080F6 + SYNERGY MICROSYSTEMS + + + 008078 + PRACTICAL PERIPHERALS, INC. + + + 00807B + ARTEL COMMUNICATIONS CORP. + + + 000075 + Nortel Networks + + + 0000ED + APRIL + + + 0000A3 + NETWORK APPLICATION TECHNOLOGY + + + 000039 + TOSHIBA CORPORATION + + + 00003C + AUSPEX SYSTEMS INC. + + + 00007E + CLUSTRIX CORPORATION + + + 0000CB + COMPU-SHACK ELECTRONIC GMBH + + + 0000CE + MEGADATA CORP. + + + 00007B + RESEARCH MACHINES + + + 000013 + CAMEX + + + 000095 + SONY TEKTRONIX CORP. + + + 000057 + SCITEX CORPORATION LTD. + + + 0000D6 + PUNCH LINE HOLDING + + + 00007D + Oracle Corporation + + + 000096 + MARCONI ELECTRONICS LTD. + + + 00005E + ICANN, IANA Department + + + 000038 + CSS LABS + + + 000060 + Kontron Europe GmbH + + + 08006F + PHILIPS APELDOORN B.V. + + + 00000F + NEXT, INC. + + + 0000BB + TRI-DATA + + + 000044 + CASTELLE CORPORATION + + + 00009E + MARLI S.A. + + + 000042 + METIER MANAGEMENT SYSTEMS LTD. + + + 00001A + ADVANCED MICRO DEVICES + + + 00007F + LINOTYPE-HELL AG + + + 08007A + INDATA + + + 080079 + THE DROID WORKS + + + 080073 + TECMAR INC. + + + 080072 + XEROX CORP UNIV GRANT PROGRAM + + + 08006A + AT&T + + + 080062 + General Dynamics + + + 08005C + FOUR PHASE SYSTEMS + + + 08005A + IBM Corp + + + 080052 + INSYSTEC + + + 000085 + CANON INC. + + + 00004A + ADC CODENOLL TECHNOLOGY CORP. + + + 000012 + INFORMATION TECHNOLOGY LIMITED + + + 000040 + APPLICON, INC. + + + 00005D + CS TELECOM + + + 08008F + CHIPCOM CORPORATION + + + 00008A + DATAHOUSE INFORMATION SYSTEMS + + + 000032 + Marconi plc + + + 00006A + COMPUTER CONSOLES INC. + + + 08003E + CODEX CORPORATION + + + 080040 + FERRANTI COMPUTER SYS. LIMITED + + + 08003A + ORCATECH INC. + + + 08003D + CADNETIX CORPORATIONS + + + 080038 + BULL S.A.S. + + + 08002F + PRIME COMPUTER INC. + + + 08001E + APOLLO COMPUTER INC. + + + 080019 + GENERAL ELECTRIC CORPORATION + + + 027001 + RACAL-DATACOM + + + 08002C + BRITTON LEE INC. + + + 08004D + CORVUS SYSTEMS INC. + + + 08000E + NCR CORPORATION + + + 000002 + XEROX CORPORATION + + + 000003 + XEROX CORPORATION + + + 00DD09 + UNGERMANN-BASS INC. + + + 000006 + XEROX CORPORATION + + + 080064 + Sitasys AG + + + 080002 + BRIDGE COMMUNICATIONS INC. + + + 08001A + TIARA/ 10NET + + + 08008B + PYRAMID TECHNOLOGY CORP. + + + 080012 + BELL ATLANTIC INTEGRATED SYST. + + + 080001 + COMPUTERVISION CORPORATION + + + 080005 + SYMBOLICS INC. + + + 00003D + UNISYS + + + 000008 + XEROX CORPORATION + + + 00DD07 + UNGERMANN-BASS INC. + + + 00DD0D + UNGERMANN-BASS INC. + + + 943F0C + Genexis B.V. + + + 080016 + BARRISTER INFO SYS CORP + + + 080030 + ROYAL MELBOURNE INST OF TECH + + + 00000B + MATRIX CORPORATION + + + 00009B + INFORMATION INTERNATIONAL, INC + + + 84BB26 + Texas Instruments + + + EC9A34 + Texas Instruments + + + A4F841 + Apple, Inc. + + + A05272 + Apple, Inc. + + + 34B1EB + Apple, Inc. + + + 200484 + Apple, Inc. + + + 58BAD3 + NANJING CASELA TECHNOLOGIES CORPORATION LIMITED + + + F87D3F + Huawei Device Co., Ltd. + + + 90A57D + Huawei Device Co., Ltd. + + + FCA8E0 + THE FURUKAWA ELECTRIC CO., LTD + + + FC51B5 + HUAWEI TECHNOLOGIES CO.,LTD + + + 8C9B2D + PLANTRONICS, INC. + + + 909E24 + ekey biometric systems gmbh + + + 40C0EE + 365mesh Pty Ltd + + + 284430 + Arcade Communications Ltd. + + + 9803CF + SHENZHEN BILIAN ELECTRONIC CO.,LTD + + + 943251 + ASKEY COMPUTER CORP + + + 78EDBC + OnePlus Technology (Shenzhen) Co., Ltd + + + DCE5D8 + zte corporation + + + 68944A + zte corporation + + + 7433E9 + zte corporation + + + 604966 + Shenzhen Dingsheng Technology Co., Ltd. + + + C8A3E8 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. + + + 40B70E + Huawei Device Co., Ltd. + + + 606B5B + Arista Network, Inc. + + + FCC0CC + Yunke China Information Technology Limited + + + 48EB65 + Henan KunLun Technologies CO.,Ltd. + + + 1C2156 + Smappee NV + + + A841F4 + AzureWave Technology Inc. + + + C4CB76 + Microsoft Corporation + + + D8D668 + Tuya Smart Inc. + + + 004CE5 + Sichuan Tianyi Comheart Telecom Co.,LTD + + + C09120 + Sichuan Tianyi Comheart Telecom Co.,LTD + + + 407218 + Tonly Technology Co. Ltd + + + 409EA4 + Juniper Networks + + + 4C50DD + Hui Zhou Gaoshengda Technology Co.,LTD + + + 9CB400 + zte corporation + + + 886076 + Sparnex n.v. + + + 0CD5D3 + Cisco Systems, Inc + + + BC4C78 + HUAWEI TECHNOLOGIES CO.,LTD + + + D45F7A + HUAWEI TECHNOLOGIES CO.,LTD + + + A80556 + vivo Mobile Communication Co., Ltd. + + + F00727 + INTEREL BUILDING AUTOMATION + + + B05246 + NXP Semiconductor (Tianjin) LTD. + + + F871A6 + Apple, Inc. + + + 78A7C7 + Apple, Inc. + + + 98FEE1 + Apple, Inc. + + + 340962 + Hangzhou Hikvision Digital Technology Co.,Ltd. + + + D0C050 + Apple, Inc. + + + 849437 + Apple, Inc. + + + 2C81BF + Apple, Inc. + + + 2834FF + Apple, Inc. + + + 100648 + IEEE Registration Authority + + + 000D2C + Lantronix + + + 14AE68 + KLG Smartec + + + EC462C + Infinix mobility limited + + + 30169D + MERCUSYS TECHNOLOGIES CO., LTD. + + + 2C532B + TCT mobile ltd + + + 64FD29 + Zhejiang Dahua Technology Co., Ltd. + + + 742E4F + Stienen Group + + + 5C836C + Ruckus Wireless + + + 704CA5 + Fortinet, Inc. + + + 04D590 + Fortinet, Inc. + + + 94F392 + Fortinet, Inc. + + + 4C4CD8 + zte corporation + + + 5C5310 + Nanjing Qinheng Microelectronics Co., Ltd. + + + 8C8881 + Cisco Meraki + + + 34D262 + SZ DJI TECHNOLOGY CO.,LTD + + + D8B020 + Taicang T&W Electronics + + + D4F32D + Intel Corporate + + + 2C7BA0 + Intel Corporate + + + 5422E0 + Adtran Inc + + + C40778 + New H3C Technologies Co., Ltd + + + FC8AF7 + zte corporation + + + 1004C1 + JD Cloud Computing Co., Ltd. + + + 24D208 + Sensata Technologies Inc. + + + 7891E9 + Raisecom Technology CO., LTD + + + E85540 + WUXI FUNIDE DIGITAL CO.,LTD + + + C4509C + Vantiva - Connected Home + + + 308ECF + HUAWEI TECHNOLOGIES CO.,LTD + + + D829F8 + HUAWEI TECHNOLOGIES CO.,LTD + + + 78392D + IEEE Registration Authority + + + D40068 + Fiberhome Telecommunication Technologies Co.,LTD + + + 38637F + Fiberhome Telecommunication Technologies Co.,LTD + + + C8FE0F + SHENZHEN BILIAN ELECTRONIC CO.,LTD + + + 70F6CF + Relay, Inc. + + + 387605 + Inogeni + + + 249D2A + LinkData Technology (Tianjin) Co., LTD + + + E4E66C + Tiandy Technologies Co.,LTD + + + 549A8F + Realme Chongqing Mobile Telecommunications Corp.,Ltd. + + + A8EF5F + Realme Chongqing Mobile Telecommunications Corp.,Ltd. + + + BCE001 + Netis Technology Co., Ltd. + + + D03E07 + Apple, Inc. + + + 50B127 + Apple, Inc. + + + C81072 + BBPOS Limited + + + 0CA138 + BLiNQ Networks Inc. + + + E4F3F5 + SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. + + + C0A5DD + SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. + + + F8FB90 + Texas Instruments + + + 446B1F + Texas Instruments + + + F010A5 + Texas Instruments + + + C0252F + SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. + + + D8EE42 + Sichuan Tianyi Comheart Telecom Co.,LTD + + + 28AF42 + Samsung Electronics Co.,Ltd + + + 1CCE51 + AzureWave Technology Inc. + + + C06380 + Texas Instruments + + + 10634B + SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. + + + 044BA5 + SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. + + + D48409 + SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. + + + BC026E + Silicon Laboratories + + + B43522 + Silicon Laboratories + + + 90395E + Silicon Laboratories + + + E8E07E + Silicon Laboratories + + + B0C7DE + Silicon Laboratories + + + 881A14 + Silicon Laboratories + + + 44E2F8 + Silicon Laboratories + + + 30FB68 + Wuhan Zmvision Technology Co. Ltd. + + + F4ED37 + Qingdao Yuze lntelligent Technology Co.,Ltd + + + B8DB38 + Google, Inc. + + + 5464BC + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + 246830 + Shenzhen Shokzhear Co., Ltd + + + 3C90E0 + HUAWEI TECHNOLOGIES CO.,LTD + + + 707362 + HUAWEI TECHNOLOGIES CO.,LTD + + + 30A30F + HUAWEI TECHNOLOGIES CO.,LTD + + + 308DD4 + HUAWEI TECHNOLOGIES CO.,LTD + + + 74C64A + AGOS Co.,Ltd + + + EC314A + Chengdu Quanjing Intelligent Technology Co.,Ltd + + + E461F4 + shenzhen worldelite electronics co., LTD + + + 109F47 + Shenzhen Skyworth Digital Technology CO., Ltd + + + E4379F + Cisco Systems, Inc + + + 0026A4 + Novus Produtos Eletronicos Ltda + + + 04F4D8 + Hui Zhou Gaoshengda Technology Co.,LTD + + + 3CB43D + SZ Tenveo video technology co., Ltd + + + 14C67D + Vizio, Inc + + + D4ADFC + Shenzhen Intellirocks Tech. Co. Ltd. + + + E82725 + Axis Communications AB + + + 9CC8E9 + Amazon Technologies Inc. + + + 606BB3 + zte corporation + + + 547885 + SHENZHEN GIEC DIGITAL CO.,LTD + + + 000E2A + dormakaba USA Inc. + + + 74309D + Infinix mobility limited + + + 64F0AD + Zhejiang Tmall Technology Co., Ltd. + + + 54A7A0 + HUNAN AIMAG INTELLIGENT TECHNOLOGY CO.,LTD + + + E8F085 + HUAWEI TECHNOLOGIES CO.,LTD + + + 3C366A + HUAWEI TECHNOLOGIES CO.,LTD + + + EC5AA3 + Huawei Device Co., Ltd. + + + 2C66AD + NimbleTech Digital Inc. + + + 44E64A + Shenzhen iComm Semiconductor CO.,LTD + + + 701301 + Vantiva - Connected Home + + + D04FAB + Yoqu Technology (Shenzhen) Co., Ltd. + + + 0025FC + ENDA + + + 98876C + Huawei Device Co., Ltd. + + + 0C8306 + Huawei Device Co., Ltd. + + + ECCD4C + New H3C Technologies Co., Ltd + + + F0ED19 + zte corporation + + + 046ECB + zte corporation + + + 205D0D + Fiberhome Telecommunication Technologies Co.,LTD + + + E0B763 + Bosch Automotive Products (Suzhou) Co., Ltd. Changzhou Branch + + + E81499 + Yoqu Technology(Shenzhen)Co.,Ltd. + + + 102FF8 + Vicoretek (Nanjing) Co.,Ltd. + + + 684DB6 + Xiaomi Communications Co Ltd + + + F0E752 + Shenzhen Huajuxin Semiconductor Co.,ltd + + + 603457 + HP Tuners LLC + + + C8CD55 + Ruijie Networks Co.,LTD + + + C4B25B + Ruijie Networks Co.,LTD + + + 984A6B + Ruijie Networks Co.,LTD + + + 7866F3 + shenzhen worldelite electronics co., LTD + + + 28221E + HUAWEI TECHNOLOGIES CO.,LTD + + + 24EFB4 + Shanghai Neardi Technologies Co. Ltd. + + + D8A0E6 + Chongqing Yipingfang Technology Co., Ltd. + + + 0C0ADF + Texas Instruments + + + DCBE04 + Texas Instruments + + + 64BAA4 + zte corporation + + + C457CD + HUAWEI TECHNOLOGIES CO.,LTD + + + 08DDEB + Silicon Laboratories + + + 3824F1 + Private + + + BCBB58 + Apple, Inc. + + + 303B7C + Apple, Inc. + + + 00812A + Apple, Inc. + + + 1CE209 + Apple, Inc. + + + 6CC41E + NEXSEC Incorporated + + + CC6A33 + Cisco Systems, Inc + + + 40D160 + Apple, Inc. + + + 900371 + Quectel Wireless Solutions Co.,Ltd. + + + 949F8B + zte corporation + + + 18EFC0 + Sercomm Japan Corporation + + + 80283C + Sonova AG + + + F46ED6 + EM Microelectronic + + + 948CD7 + Hui Zhou Gaoshengda Technology Co.,LTD + + + 48E9CA + creoline GmbH + + + 3C0868 + Power Plus Communications AG + + + 901564 + IEEE Registration Authority + + + 408F9A + KanEL Sweden AB + + + 001CA1 + Akamai Technologies Inc. + + + 5C3548 + Aditya Infotech Ltd. + + + 20500F + Fiber Groep B.V. + + + D009F5 + Hosiden Corporation + + + D47F35 + Cisco Systems, Inc + + + 98CB38 + Boxin Communications Limited Liability Company + + + 30C6AB + zte corporation + + + 286847 + Silicon Laboratories + + + 48E663 + IEEE Registration Authority + + + A4403D + Shenzhen Baseus Technology Co., Ltd. + + + 4C8125 + ZOWEE TECHNOLOGY(HEYUAN)Co.,Ltd + + + 44C532 + HUAWEI TECHNOLOGIES CO.,LTD + + + 30D4E2 + HUAWEI TECHNOLOGIES CO.,LTD + + + DCECE3 + HORYS TECHNOLOGIES LLC + + + 484982 + Huawei Device Co., Ltd. + + + 2836F0 + Huawei Device Co., Ltd. + + + 1C13FA + Huawei Device Co., Ltd. + + + A8B0D1 + EFUN Display Technology (Shenzhen) Co., Ltd. + + + 60D51B + Fujitsu Limited + + + 483584 + Huawei Device Co., Ltd. + + + 88F6DC + Huawei Device Co., Ltd. + + + 70EB74 + Ningbo Goneo Electric Appliance Co., Ltd. + + + 00057E + Eckelmann AG + + + D4955D + zte corporation + + + 9C6697 + Cisco Systems, Inc + + + D0E581 + Apple, Inc. + + + 940BCD + Apple, Inc. + + + 1C3C78 + Apple, Inc. + + + E45BB3 + zte corporation + + + C4B1D9 + HUAWEI TECHNOLOGIES CO.,LTD + + + 707013 + HUAWEI TECHNOLOGIES CO.,LTD + + + A4A459 + Hangzhou Hikvision Digital Technology Co.,Ltd. + + + 981DAC + Cyviz AS + + + ECEBB8 + Hewlett Packard Enterprise + + + 3817C3 + Hewlett Packard Enterprise + + + 040973 + Hewlett Packard Enterprise + + + B88303 + Hewlett Packard Enterprise + + + 904C81 + Hewlett Packard Enterprise + + + 001438 + Hewlett Packard Enterprise + + + F40343 + Hewlett Packard Enterprise + + + 98F2B3 + Hewlett Packard Enterprise + + + 70106F + Hewlett Packard Enterprise + + + C8FFBF + IEEE Registration Authority + + + 482F6B + Hewlett Packard Enterprise + + + 0C975F + Hewlett Packard Enterprise + + + 343A20 + Hewlett Packard Enterprise + + + 749E75 + Hewlett Packard Enterprise + + + 548028 + Hewlett Packard Enterprise + + + 9C8CD8 + Hewlett Packard Enterprise + + + 08F1EA + Hewlett Packard Enterprise + + + D4F5EF + Hewlett Packard Enterprise + + + 94B40F + Hewlett Packard Enterprise + + + BC9FE4 + Hewlett Packard Enterprise + + + D015A6 + Hewlett Packard Enterprise + + + D0D3E0 + Hewlett Packard Enterprise + + + 8C85C1 + Hewlett Packard Enterprise + + + FC7FF1 + Hewlett Packard Enterprise + + + 00246C + Hewlett Packard Enterprise + + + 001A1E + Hewlett Packard Enterprise + + + A852D4 + Hewlett Packard Enterprise + + + 946424 + Hewlett Packard Enterprise + + + 3821C7 + Hewlett Packard Enterprise + + + 54778A + Hewlett Packard Enterprise + + + 94A6D8 + New H3C Technologies Co., Ltd + + + A827C8 + Edgecore Americas Networking Corporation + + + 24DD1B + Qingdao Hi-image Technologies Co., Ltd + + + F84477 + Silicon Laboratories + + + 6CFD22 + Silicon Laboratories + + + 50E4E0 + Hewlett Packard Enterprise + + + 380B26 + Mindray Co., Ltd. + + + CC7E0F + Theben AG + + + C4474E + Intel Corporate + + + 08B4D2 + Intel Corporate + + + 5CB47E + Intel Corporate + + + 28C5C8 + HP Inc. + + + 90D3CF + ASKEY COMPUTER CORP + + + 38AA20 + zte corporation + + + 70378E + Tianyi Telecom Terminals Company Limited + + + 2CED89 + HUAWEI TECHNOLOGIES CO.,LTD + + + 800518 + HUAWEI TECHNOLOGIES CO.,LTD + + + 243F75 + Hui Zhou Gaoshengda Technology Co.,LTD + + + 706AC9 + zte corporation + + + 483A02 + Fortinet, Inc. + + + 940D4B + Cisco Systems, Inc + + + 04E387 + Cisco Systems, Inc + + + 247C46 + FLEXTRONICS TECHNOLOGIES MEXICO S DE RL DE CV + + + C8711F + SUZHOU TESIEN TECHNOLOGY CO., LTD. + + + D8D261 + GD Midea Air-Conditioning Equipment Co.,Ltd. + + + 8C12C2 + GLBB Japan + + + 246278 + sysmocom - s.f.m.c. GmbH + + + 90CBA3 + TECNO MOBILE LIMITED + + + D43B8A + Shenzhen Zhide technology Co., LTD + + + BC41A0 + zte corporation + + + DCEB4D + Motorola (Wuhan) Mobility Technologies Communication Co., Ltd. + + + 146C27 + Dongguan Liesheng Electronic Co., Ltd. + + + 3CA80A + vivo Mobile Communication Co., Ltd. + + + B0653A + Murata Manufacturing Co., Ltd. + + + 00A41C + Tonly Technology Co. Ltd + + + 442745 + LG Innotek + + + 448763 + FN-LINK TECHNOLOGY Ltd. + + + D83BDA + Espressif Inc. + + + 60F549 + Apple, Inc. + + + 10DA63 + Apple, Inc. + + + A8BA25 + Hewlett Packard Enterprise + + + 8C08AA + Apple, Inc. + + + F4A310 + Apple, Inc. + + + 3C3B77 + Apple, Inc. + + + E84A78 + Apple, Inc. + + + 7402E1 + Texas Instruments + + + 24F306 + ITEL MOBILE LIMITED + + + 649CF3 + Fiberhome Telecommunication Technologies Co.,LTD + + + 1090FC + Shenzhen DOOGEE Hengtong Technology CO.,LTD + + + 4C97A1 + Silicon Laboratories + + + D0AE05 + Xiaomi Communications Co Ltd + + + B03B1B + Kontrolnext Technology (Beijing) Ltd. + + + 48A170 + Cisco Systems, Inc + + + B41E52 + Flock Safety + + + 789912 + Flyingvoice (HongKong) Technologies Limited + + + 941042 + Fanox Electronic S.L. + + + BC34CA + INOVANCE + + + A00E98 + HUAWEI TECHNOLOGIES CO.,LTD + + + 58B4BB + Ruijie Networks Co.,LTD + + + 60D561 + Shenzhen Glazero Technology Co., Ltd. + + + 044BB1 + Huawei Device Co., Ltd. + + + F0D7EE + Huawei Device Co., Ltd. + + + B8A25D + Motorola Mobility LLC, a Lenovo Company + + + F45B29 + HUAWEI TECHNOLOGIES CO.,LTD + + + 349671 + HUAWEI TECHNOLOGIES CO.,LTD + + + 7CD44D + Shanghai Moorewatt Energy Technology Co.,Ltd + + + 7CA58F + shenzhen Qikai Electronic Co., Ltd. + + + 344663 + IEEE Registration Authority + + + 8C5E4D + DragonWave Technologies DMCC + + + 7800A8 + PT HAN SUNG ELECTORONICS INDONESIA + + + 406918 + EM Microelectronic + + + 0CCDB4 + Sichuan AI-Link Technology Co., Ltd. + + + 98FA2E + Sony Interactive Entertainment Inc. + + + 90032E + Taicang T&W Electronics + + + A85C03 + JiangSu Fulian Communication Technology Co., Ltd + + + F40A2E + Shenzhen Skyworth Digital Technology CO., Ltd + + + 088BC8 + Google, Inc. + + + 20BEB8 + Amazon Technologies Inc. + + + C095CF + Amazon Technologies Inc. + + + 2CE38E + Cisco Systems, Inc + + + 540A77 + Fiberhome Telecommunication Technologies Co.,LTD + + + 6C1F8A + Apple, Inc. + + + 385439 + Guangzhou Shiyuan Electronic Technology Company Limited + + + 6C3AFF + Apple, Inc. + + + EC97A2 + Apple, Inc. + + + 449E8B + Apple, Inc. + + + C40FA6 + SERNET (SUZHOU) TECHNOLOGIES CORPORATION + + + 78C4FA + Meta Platforms, Inc. + + + E0C3EA + Apple, Inc. + + + 443B14 + MitraStar Technology Corp. + + + 446370 + LCFC(Hefei) Electronics Technology co., ltd + + + C4C6E6 + LCFC(Hefei) Electronics Technology co., ltd + + + 182CA9 + DASAN Networks, Inc. + + + 54A552 + Shenzhen WeSing Interactive Entertainment Technology Co., Ltd + + + 4C3946 + Samsung Electronics Co.,Ltd + + + 240A3F + Samsung Electronics Co.,Ltd + + + 203B67 + Samsung Electronics Co.,Ltd + + + 2460B3 + Samsung Electronics Co.,Ltd + + + 8022FA + ITEL MOBILE LIMITED + + + E8122D + UNIONMAN TECHNOLOGY CO.,LTD + + + 54E1AD + LCFC(Hefei) Electronics Technology co., ltd + + + 002B67 + LCFC(Hefei) Electronics Technology co., ltd + + + B4055D + IEIT SYSTEMS Co., Ltd. + + + 3063EA + Juniper Networks + + + F42055 + IEEE Registration Authority + + + A09857 + Shenzhen ELINK Technology Co., Ltd. + + + A84FA4 + CHINA DRAGON TECHNOLOGY LIMITED + + + 248625 + IEEE Registration Authority + + + 948B93 + Xiaomi Communications Co Ltd + + + 5C5DEC + JiangSu Newcom Optical&Electrical Communication CO Ltd + + + 58EA1F + Beijing Xiaomi Mobile Software Co., Ltd + + + B08184 + Espressif Inc. + + + F820D2 + Vantiva USA LLC + + + C0A39E + EarthCam, Inc. + + + 8C1D55 + Hanwha NxMD (Thailand) Co., Ltd. + + + 7C8D9C + Edgecore Americas Networking Corporation + + + F4FBF5 + EM Microelectronic + + + D826FA + Jiangxi Zhentian Technology CO.,LTD + + + 103597 + Qorvo Utrecht B.V. + + + AC5C80 + Telink Micro LLC + + + 743C24 + HUAWEI TECHNOLOGIES CO.,LTD + + + C8B4AB + Inspur Computer Technology Co.,Ltd. + + + C4D8C8 + Silicon Laboratories + + + B8D4C3 + HUAWEI TECHNOLOGIES CO.,LTD + + + 00A91D + HUAWEI TECHNOLOGIES CO.,LTD + + + E862BE + Intel Corporate + + + D0F76E + Shenzhen YOUHUA Technology Co., Ltd + + + A0FA9C + WEIFANG GOERTEK ELECTRONICS CO.,LTD + + + 30F947 + Shenzhen Skyworth Digital Technology CO., Ltd + + + 48A964 + APEXSHA SMARTTECH PRIVATE LIMITED + + + E4F58E + Schneider Electric USA + + + 485F2D + Amazon Technologies Inc. + + + E81DEE + i-TEK RFID + + + 0CC119 + Shenzhen Phaten Tech. LTD + + + 306DF9 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + DC3130 + 3onedata Technology Co. Ltd. + + + 80489F + Hangzhou Hikvision Digital Technology Co.,Ltd. + + + B4A10A + Huawei Device Co., Ltd. + + + F0BDEE + Huawei Device Co., Ltd. + + + 34A34E + NevadaNano + + + C44FD5 + Vantiva - Connected Home + + + D0F8E7 + Shenzhen Shutong Space Technology Co., Ltd + + + 8C4F00 + Espressif Inc. + + + E808AF + zte corporation + + + 94342F + ITEL MOBILE LIMITED + + + 04CB01 + Samsung Electronics Co.,Ltd + + + E47F3C + zte corporation + + + 2C347B + SHENZHEN JUNGE TECHNOLOGY CO.,LTD + + + 2CD8DE + AltoBeam Inc. + + + 54C8CC + Shenzhen SDG Telecom Equipment Co.,Ltd. + + + 00BB43 + Tiinlab Corporation + + + FC626F + Fortx + + + C875DD + LG Electronics NV + + + 3034F6 + Vantiva Connected Home - Subcomponents + + + A85008 + Felion Technologies Company Limited + + + C4D8D4 + HUAWEI TECHNOLOGIES CO.,LTD + + + 8092A5 + Valeo Interior Controls (Shenzhen) Co.,Ltd + + + EC1D53 + HUAWEI TECHNOLOGIES CO.,LTD + + + 706E10 + HUAWEI TECHNOLOGIES CO.,LTD + + + B8220C + Apple, Inc. + + + 9CA9C5 + Apple, Inc. + + + F027A0 + Apple, Inc. + + + 3839CD + vivo Mobile Communication Co., Ltd. + + + 40734D + New H3C Technologies Co., Ltd + + + E458BC + Bose Corporation + + + 840F4C + Apple, Inc. + + + A0D91A + Texas Instruments + + + 50BA02 + Qingdao Intelligent&Precise Electronics Co.,Ltd. + + + C04A0E + Texas Instruments + + + D4060F + Texas Instruments + + + 5C2D08 + Subeca + + + 8439FC + Nokia + + + 6056EE + AltoBeam Inc. + + + D020DD + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + 28172E + Fiberhome Telecommunication Technologies Co.,LTD + + + 105F81 + INTENTSECURE Inc., + + + CCA150 + SystemX Co.,Ltd. + + + 6879C4 + Shanghai MXCHIP Information Technology Co., Ltd. + + + 50CF14 + Quectel Wireless Solutions Co.,Ltd. + + + 9C61D7 + HUAWEI TECHNOLOGIES CO.,LTD + + + E8E609 + Chongqing Zhouhai intelligent technology CO., Ltd + + + CCBF0C + SHENZHEN FENDA TECHNOLOGY CO., LTD + + + 70D983 + Shanghai JINXVM Microelectronics Co.,Ltd. + + + 984E8A + Samsung Electronics Co.,Ltd + + + 000341 + EVS Broadcast Equipment + + + 9CBF0D + Framework Computer Inc. + + + 189C2C + Dongguan Huayin Electronic Technology Co., Ltd. + + + D4DC85 + Edgecore Americas Networking Corporation + + + 2037F0 + Arcadyan Corporation + + + 4C01F7 + Cisco Systems, Inc + + + A08966 + CIG SHANGHAI CO LTD + + + 001CF3 + EVS Broadcast Equipment + + + 746AB3 + MICIUS Laboratory + + + D40E60 + Nanjing phx-gctech Information Technology Co., Ltd + + + 98173C + Private + + + A47D9F + Shenzhen iComm Semiconductor CO.,LTD + + + 84EA97 + Shenzhen iComm Semiconductor CO.,LTD + + + 14B2E5 + Shenzhen iComm Semiconductor CO.,LTD + + + E0CB56 + Shenzhen iComm Semiconductor CO.,LTD + + + D0A0BB + Shenzhen iComm Semiconductor CO.,LTD + + + A0AC78 + Shenzhen iComm Semiconductor CO.,LTD + + + 34D72F + Shenzhen SuperElectron Technology Co.,Ltd. + + + 94A748 + New H3C Technologies Co., Ltd + + + A8E291 + AzureWave Technology Inc. + + + 4485DA + Shenzhen Skyworth Digital Technology CO., Ltd + + + 3C7625 + zte corporation + + + 40D521 + LG Innotek + + + 486264 + Arlo Technology + + + 148F34 + TECNO MOBILE LIMITED + + + 60B0E8 + Huawei Device Co., Ltd. + + + B83C20 + Huawei Device Co., Ltd. + + + 74051D + Jiangxi Risound Electronics Co.,LTD + + + 3CC5DD + Hui Zhou Gaoshengda Technology Co.,LTD + + + 90E4B0 + SHARP Corporation + + + 04E3E5 + Silicon Laboratories + + + B81E9E + HUAWEI TECHNOLOGIES CO.,LTD + + + 9C9793 + HUAWEI TECHNOLOGIES CO.,LTD + + + 74220D + CHENGDU XUGUANG TECHNOLOGY CO,LTD + + + 48D682 + zte corporation + + + 24DEEB + HUAWEI TECHNOLOGIES CO.,LTD + + + E0F325 + Elkor Technologies Inc. + + + E8AC7E + TERAHOP PTE.LTD. + + + D06C37 + ikeja wireless (pty) ltd + + + A4C3BE + Xiaomi Communications Co Ltd + + + FC4345 + Xiaomi Communications Co Ltd + + + 580205 + AzureWave Technology Inc. + + + D45E89 + Motorola Mobility LLC, a Lenovo Company + + + A4F921 + Apple, Inc. + + + FCA5C8 + Apple, Inc. + + + 7CD2DA + Apple, Inc. + + + 80AF19 + Apple, Inc. + + + AC1007 + Arcadyan Corporation + + + 601A4F + Beijing China Electronics Intelligent Acoustics Technology Co.,Ltd + + + 90EF4A + Dongguan Liesheng Electronic Co., Ltd. + + + 540A8A + Jlztlink Industry(ShenZhen)Co.,Ltd. + + + B0AC82 + CHINA DRAGON TECHNOLOGY LIMITED + + + AC16DE + Intel Corporate + + + D0577E + Intel Corporate + + + 00BE44 + Silicon Laboratories + + + 7893C3 + Hui Zhou Gaoshengda Technology Co.,LTD + + + 0C2C7C + Shenzhen Skyworth Digital Technology CO., Ltd + + + 40311B + Genbyte Technology Inc. + + + 94A990 + Espressif Inc. + + + E83381 + Commscope + + + D40598 + Commscope + + + 6CCA08 + Commscope + + + 5465DE + Commscope + + + D45F2C + zte corporation + + + 3C7A8A + Commscope + + + 1C1B68 + Commscope + + + 3C36E4 + Commscope + + + 1036AA + Vantiva - Connected Home + + + 8C7F3B + Commscope + + + 1005B1 + Commscope + + + 001A77 + Commscope + + + 001A66 + Commscope + + + 001A1B + Commscope + + + 00195E + Commscope + + + 00192C + Commscope + + + 083E0C + Commscope + + + 407009 + Commscope + + + 94877C + Commscope + + + E8892C + Commscope + + + 601971 + Commscope + + + 001596 + Commscope + + + 0015D0 + Commscope + + + 40B7F3 + Commscope + + + 90B134 + Commscope + + + 20E564 + Commscope + + + F8EDA5 + Commscope + + + 207355 + Commscope + + + 001675 + Commscope + + + 0017E2 + Commscope + + + 5C571A + Commscope + + + 000CE5 + Commscope + + + 0003E0 + Commscope + + + F8A097 + Commscope + + + 000E5C + Commscope + + + 400D10 + Commscope + + + B81619 + Commscope + + + C0C522 + Commscope + + + 0012C9 + Commscope + + + 001DBE + Commscope + + + 001D6B + Commscope + + + 001BDD + Commscope + + + 001E8D + Commscope + + + 001B52 + Commscope + + + 0023ED + Commscope + + + 0023A2 + Commscope + + + 5CE30E + Commscope + + + 48D343 + Commscope + + + A4ED4E + Commscope + + + 002641 + Commscope + + + 002493 + Commscope + + + 002180 + Commscope + + + 00211E + Commscope + + + B077AC + Commscope + + + 70B14E + Commscope + + + 70DFF7 + Commscope + + + 64ED57 + Commscope + + + F863D9 + Commscope + + + A405D6 + Commscope + + + DCA633 + Commscope + + + 2815A4 + SHENZHEN PINSU ZHILIAN INFORMATION TECHNOLOGY CO.,LTD. + + + B0DAF9 + Commscope + + + 1835D1 + Commscope + + + BC2E48 + Commscope + + + 608CE6 + Commscope + + + ACF8CC + Commscope + + + 8C5A25 + Commscope + + + 78719C + Commscope + + + 189C27 + Commscope + + + D4AB82 + Commscope + + + 704FB8 + Commscope + + + 6CA604 + Commscope + + + 109397 + Commscope + + + 5075F1 + Commscope + + + 6402CB + Commscope + + + F82DC0 + Commscope + + + 404C77 + Commscope + + + A897CD + Commscope + + + 0C7FB2 + Commscope + + + 6833EE + Commscope + + + 785844 + Hangzhou Sciener Smart Technology Co., Ltd. + + + 50B03B + Sony Interactive Entertainment Inc. + + + FC4E6D + HUAWEI TECHNOLOGIES CO.,LTD + + + F4248B + HUAWEI TECHNOLOGIES CO.,LTD + + + 44E59B + HUAWEI TECHNOLOGIES CO.,LTD + + + 54DD4F + Samsung Electronics Co.,Ltd + + + 74F67A + Samsung Electronics Co.,Ltd + + + A0562C + Samsung Electronics Co.,Ltd + + + 0C8BA2 + HUAWEI TECHNOLOGIES CO.,LTD + + + 7C3626 + HUAWEI TECHNOLOGIES CO.,LTD + + + 0434C3 + Qingdao Goertek Horizons Tecnology Co.,LTD + + + A0B0BD + Samsung Electronics Co.,Ltd + + + C85309 + LCFC(Hefei) Electronics Technology co., ltd + + + 78A4BA + Marquardt India Pvt Ltd + + + D4E3C5 + zte corporation + + + 580D0D + GREE ELECTRIC APPLIANCES, INC. OF ZHUHAI + + + 9CBAC9 + Telit Communication s.p.a + + + 2CDFE6 + Raisecom Technology CO., LTD + + + 1C0B8B + Ubiquiti Inc + + + D849BF + CELESTICA INC. + + + 8845F0 + GUANGDONG GENIUS TECHNOLOGY CO., LTD. + + + 1C784B + Bouffalo Lab (Nanjing) Co., Ltd. + + + 34F5D7 + Huawei Device Co., Ltd. + + + DC42C8 + Huawei Device Co., Ltd. + + + 803E4F + GD Midea Air-Conditioning Equipment Co.,Ltd. + + + 94A081 + Silicon Laboratories + + + A07771 + Vialis BV + + + 7CB8E6 + GREE ELECTRIC APPLIANCES, INC. OF ZHUHAI + + + A4C34E + Texas Instruments + + + D429A7 + Infinix mobility limited + + + D8F1D8 + OI ELECTRIC CO.,LTD + + + 742981 + Texas Instruments + + + D08543 + Cisco Systems, Inc + + + 0C7DB0 + Motorola Mobility LLC, a Lenovo Company + + + 80F416 + Chipsea Technologies (Shenzhen) Corp. + + + 807933 + Aigentec Technology(Zhejiang) Co., Ltd. + + + D05FAF + Shenzhen C-Data Technology Co., Ltd. + + + 18DF26 + INGRAM MICRO SERVICES + + + 5056A8 + Jollyboys Ltd + + + B01831 + Apple, Inc. + + + D04D86 + Apple, Inc. + + + 34D509 + Genexis B.V. + + + 203543 + Sagemcom Broadband SAS + + + 6867C7 + Sagemcom Broadband SAS + + + 849690 + Murata Manufacturing Co., Ltd. + + + F4B549 + Xiamen Yeastar Digital Technology Co., Ltd + + + F4CBE7 + Apple, Inc. + + + 5C9BA6 + Apple, Inc. + + + 38C43A + Apple, Inc. + + + A85BD1 + INVENTEC CORPORATION + + + BC071D + TP-Link Systems Inc. + + + BC5E91 + Honor Device Co., Ltd. + + + 001A01 + ICU Medical, Inc. + + + 2CE099 + FUJIAN STAR-NET COMMUNICATION CO.,LTD + + + 58D533 + Huaqin Technology Co.,Ltd + + + 5C7DAE + zte corporation + + + 7CB68D + Mist Systems, Inc. + + + A459D3 + IEEE Registration Authority + + + 501365 + Vola Networks Inc. + + + 3C6AD2 + TP-Link Systems Inc. + + + B81743 + shenzhen worldelite electronics co., LTD + + + A0C016 + Sichuan Changhong Network Technologies Co., Ltd. + + + 180B1B + Amazon Technologies Inc. + + + 009C17 + Quectel Wireless Solutions Co.,Ltd. + + + 0CC844 + Cambridge Mobile Telematics, Inc. + + + D874DF + HUAWEI TECHNOLOGIES CO.,LTD + + + 78DAAF + HUAWEI TECHNOLOGIES CO.,LTD + + + A47F1B + Juniper Networks + + + 78B39F + SERNET (SUZHOU) TECHNOLOGIES CORPORATION + + + BCA231 + HUAWEI TECHNOLOGIES CO.,LTD + + + 0CE0FC + Edgecore Americas Networking Corporation + + + D874EF + Guangzhou Shiyuan Electronic Technology Company Limited + + + 109166 + Shenzhen Yinwang Intelligent Technologies Co.,Ltd. + + + 84F758 + Huizhou BYD Electronic Co., Ltd. + + + 80CA52 + Wistron InfoComm(Chongqing)Co.,Ltd. + + + F003BC + Cisco Systems, Inc + + + D4E5C9 + Senao Networks Inc. + + + D45B51 + Motorola Mobility LLC, a Lenovo Company + + + 4C4968 + Ruijie Networks Co.,LTD + + + 9C4B6B + iFlight Technology Company Limited + + + 289200 + Intel Corporate + + + 886078 + Sparnex n.v. + + + 78F7A3 + Opentext + + + 80051F + Vizio, Inc + + + 4070A5 + Sichuan Tianyi Comheart Telecom Co.,LTD + + + 0CB78E + Huawei Device Co., Ltd. + + + 684C25 + Huawei Device Co., Ltd. + + + 741B39 + CONVEY INDIA PRIVATE LIMITED + + + D4AB61 + Intel Corporate + + + B8F775 + Intel Corporate + + + 100D8C + Huawei Device Co., Ltd. + + + 30BB43 + Sixi Networks Co., Ltd + + + E482FF + Ecliptic Enterprises Corp + + + 000CAB + Commend International GmbH + + + 2465E1 + Ciena Corporation + + + 7CBF77 + SPEEDTECH CORP. + + + 1841C3 + GD Midea Air-Conditioning Equipment Co.,Ltd. + + + 3063CF + Zhejiang Cainiao Supply Chain Management Co., Ltd + + + A82948 + TP-Link Systems Inc. + + + F83DC6 + AzureWave Technology Inc. + + + E0D362 + TP-Link Systems Inc. + + + 000C43 + MediaTek Inc + + + 24CBE1 + Ericsson AB + + + FC931D + HUAWEI TECHNOLOGIES CO.,LTD + + + 1C99DB + HUAWEI TECHNOLOGIES CO.,LTD + + + B47B1A + HUAWEI TECHNOLOGIES CO.,LTD + + + 983C8C + Apple, Inc. + + + A40987 + Apple, Inc. + + + 4C9FF1 + Apple, Inc. + + + 407911 + Apple, Inc. + + + 6C41DE + HUAWEI TECHNOLOGIES CO.,LTD + + + 8CA5CF + HUAWEI TECHNOLOGIES CO.,LTD + + + B8C051 + VusionGroup + + + A4EA4F + VusionGroup + + + D41972 + Hewlett Packard Enterprise + + + C0C7DB + Apple, Inc. + + + 004031 + KOKUSAI DENKI Electric Inc. + + + B41324 + Google, Inc. + + + 74E9D8 + Shanghai High-Flying Electronics Technology Co.,Ltd + + + E4E33D + Qingdao Intelligent&Precise Electronics Co.,Ltd. + + + BC9829 + vivo Mobile Communication Co., Ltd. + + + 3825F3 + Mellanox Technologies, Inc. + + + 2CBEEE + Nothing Technology Limited + + + 000CE7 + MediaTek Inc + + + 7C67AB + Roku, Inc + + + 080FE5 + Cisco Systems, Inc + + + B04F3C + Genuine Optics + + + 78862E + Microsoft Corporation + + + 0025DF + Axon Enterprise, Inc. + + + 148501 + Rivos Inc. + + + EC3532 + Tactrix Inc. + + + 9C06CF + PLAUD Inc. + + + 604A77 + Finder SpA + + + 5C89E6 + Richard Wolf GmbH + + + FCE1A6 + HUAWEI TECHNOLOGIES CO.,LTD + + + 0C07F3 + HUAWEI TECHNOLOGIES CO.,LTD + + + 98247B + HUAWEI TECHNOLOGIES CO.,LTD + + + 6CCF39 + Shanghai StarFive Semiconductor Co., Ltd. + + + 588336 + HUAWEI TECHNOLOGIES CO.,LTD + + + 084B44 + Robert Bosch Elektronika Kft. + + + 90F964 + Rawasi Co + + + 2CDA3F + DongGuan Ramaxel Memory Technology Limited + + + BCA68D + Continetal Automotive Systems Sibiu + + + 804AF2 + Sonos, Inc. + + + 941724 + Anhui Guoke Ruidian communication technology Co.,Ltd. + + + A09A52 + Shenzhen MoreSense Technology Co., Ltd. + + + 30F028 + Bosch Sicherheitssysteme GmbH + + + 50787D + Espressif Inc. + + + FC6D77 + Intel Corporate + + + E0E258 + Intel Corporate + + + 381868 + Intel Corporate + + + 0001CC + Brand Maker Enabler Inc. + + + 78C1AE + Hangzhou Ezviz Software Co.,Ltd. + + + 68C95D + SZ Knowact Robot Technology Co., Ltd + + + 245EE1 + United Automotive Electronic Systems Co.,Ltd. + + + 887ABC + Cisco Systems, Inc + + + 7CB353 + Cisco Systems, Inc + + + F0FD45 + Silicon Laboratories + + + B85B6C + Control Accessories LLC + + + B8DFD4 + Fiberhome Telecommunication Technologies Co.,LTD + + + 382A8C + ALL Winner (Hong Kong) Limited + + + B4394C + HUAWEI TECHNOLOGIES CO.,LTD + + + D0760C + Qisda Corporation + + + 00DA27 + Palo Alto Networks + + + 9CAA5D + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + ACBC5B + VIVIBIT INC + + + C0DA5E + Huawei Device Co., Ltd. + + + 98886C + Huawei Device Co., Ltd. + + + 80647C + Tuya Smart Inc. + + + 34936F + Juniper Networks + + + 30ACED + Packet Clearing House + + + C8A1DC + Motorola Mobility LLC, a Lenovo Company + + + 2427E5 + Huawei Device Co., Ltd. + + + E00DEE + Huawei Device Co., Ltd. + + + 0CB5B3 + Huawei Device Co., Ltd. + + + D484D0 + Shanghai Xiaodu Technology Limited + + + A02884 + Garmin International + + + B4B2E9 + Fortinet, Inc. + + + A8B58E + SHENZHEN BILIAN ELECTRONIC CO.,LTD + + + 7CA909 + Hui Zhou Gaoshengda Technology Co.,LTD + + + E4FAC4 + TP-Link Systems Inc + + + 14EBB6 + TP-Link Systems Inc + + + 54AF97 + TP-Link Systems Inc + + + 405548 + Quectel Wireless Solutions Co.,Ltd. + + + DC08DA + ASKEY COMPUTER CORP + + + B01921 + TP-Link Systems Inc + + + 5091E3 + TP-Link Systems Inc + + + B4B024 + TP-Link Systems Inc + + + 2887BA + TP-Link Systems Inc + + + 3460F9 + TP-Link Systems Inc + + + 9C5322 + TP-Link Systems Inc + + + 482254 + TP-Link Systems Inc + + + 3C52A1 + TP-Link Systems Inc + + + 1027F5 + TP-Link Systems Inc + + + 5CA6E6 + TP-Link Systems Inc + + + 24DF17 + Shenzhen Sande Dacom Electronics Co., Ltd + + + 3C64CF + TP-Link Systems Inc + + + 40AE30 + TP-Link Systems Inc + + + B417A8 + Meta Platforms, Inc. + + + A4C1E8 + Nintendo Co.,Ltd + + + D0EE47 + Hitron Technologies. Inc + + + E879A3 + Cisco Systems, Inc + + + E02A66 + Cisco Systems, Inc + + + F4FC49 + zte corporation + + + 0455B8 + HUAWEI TECHNOLOGIES CO.,LTD + + + 28B221 + Sienda Multimedia Ltd + + + 444648 + Hon Hai Precision Industry Co.,LTD + + + 6083E2 + Shanghai Notion Information Technology Co., Ltd + + + 38F20D + Juniper Networks + + + C8D995 + Juniper Networks + + + 84F1F7 + NXP Semiconductor (Tianjin) LTD. + + + 0827A8 + Arcadyan Corporation + + + D893D4 + Xiaomi Communications Co Ltd + + + 80542D + Samsung Electronics Co.,Ltd + + + 24A452 + Samsung Electronics Co.,Ltd + + + 5CDC49 + Samsung Electronics Co.,Ltd + + + CC2293 + Amazon Technologies Inc. + + + 74C412 + Microsoft Corporation + + + 90742E + New H3C Technologies Co., Ltd + + + 30F527 + New H3C Technologies Co., Ltd + + + 1052BD + HUAWEI TECHNOLOGIES CO.,LTD + + + B81D1F + HUAWEI TECHNOLOGIES CO.,LTD + + + 3C3464 + Apple, Inc. + + + 88D546 + Apple, Inc. + + + 2CDF68 + Apple, Inc. + + + 8C1ECB + Nanjing Jiahao Technology Co., Ltd. + + + 1C52A7 + Coram AI, Inc + + + 0C2756 + RONGCHEENG GOER TECHNOLOGY CO.,LTD. + + + 046761 + Beijing Xiaomi Mobile Software Co., Ltd + + + F89497 + BUFFALO.INC + + + 8C019D + Arista Networks + + + ACFBC2 + Shenzhen Skyworth Digital Technology CO., Ltd + + + 40C02F + Actiontec Electronics Inc. + + + 502F54 + CIG SHANGHAI CO LTD + + + 9CC7D3 + AzureWave Technology Inc. + + + D89A0D + zte corporation + + + B47CA6 + zte corporation + + + 90E317 + Mellanox Technologies, Inc. + + + CC40F3 + Mellanox Technologies, Inc. + + + 94C2EF + ASKEY COMPUTER CORP + + + E467A6 + BSH Hausgeräte GmbH + + + 507973 + Inagile Electronic Technology Co.,LTD. + + + 30D51F + Prolights + + + 18FB8E + VusionGroup + + + 683A1E + Cisco Meraki + + + F89E28 + Cisco Meraki + + + 388479 + Cisco Meraki + + + 74A57E + Panasonic Ecology Systems + + + 6C15DB + Arcadyan Corporation + + + 7CE913 + Fantasia Trading LLC + + + 382A8B + nFore Technology Co., Ltd. + + + E0CBBC + Cisco Meraki + + + D468BA + Shenzhen Sundray Technologies company Limited + + + 9C3A9A + Shenzhen Sundray Technologies company Limited + + + 186F2D + Shenzhen Sundray Technologies company Limited + + + 08B3D6 + Huawei Device Co., Ltd. + + + 782B60 + Huawei Device Co., Ltd. + + + 70B51A + Huawei Device Co., Ltd. + + + FC79DD + Huawei Device Co., Ltd. + + + C853E1 + Douyin Vision Co., Ltd + + + DC396F + AVM Audiovisuelles Marketing und Computersysteme GmbH + + + 5C4979 + AVM Audiovisuelles Marketing und Computersysteme GmbH + + + 2C6F37 + Nokia + + + 941787 + Nokia + + + 587961 + Microsoft Corporation + + + F414BF + LG Innotek + + + 50E636 + AVM Audiovisuelles Marketing und Computersysteme GmbH + + + 60B58D + AVM Audiovisuelles Marketing und Computersysteme GmbH + + + 34E1A9 + AVM Audiovisuelles Marketing und Computersysteme GmbH + + + 48DD0C + eero inc. + + + 3C5CF1 + eero inc. + + + F8BC0E + eero inc. + + + C4F174 + eero inc. + + + 40475E + eero inc. + + + 20E6DF + eero inc. + + + 5027A9 + eero inc. + + + D88ED4 + eero inc. + + + 649714 + eero inc. + + + 20BECD + eero inc. + + + C8B82F + eero inc. + + + 1422DB + eero inc. + + + 189088 + eero inc. + + + E8D3EB + eero inc. + + + C06F98 + eero inc. + + + 8C53D2 + China Mobile Group Device Co.,Ltd. + + + 24615A + China Mobile Group Device Co.,Ltd. + + + ACF70D + China Mobile Group Device Co.,Ltd. + + + 248A07 + Mellanox Technologies, Inc. + + + E41D2D + Mellanox Technologies, Inc. + + + 98039B + Mellanox Technologies, Inc. + + + F85C24 + Sonos Inc. + + + B86061 + China Mobile Group Device Co.,Ltd. + + + C875F4 + China Mobile Group Device Co.,Ltd. + + + 8C1A50 + China Mobile Group Device Co.,Ltd. + + + 88DA18 + China Mobile Group Device Co.,Ltd. + + + B8E924 + Mellanox Technologies, Inc. + + + 2C5EAB + Mellanox Technologies, Inc. + + + B8CEF6 + Mellanox Technologies, Inc. + + + C470BD + Mellanox Technologies, Inc. + + + 507097 + China Mobile Group Device Co.,Ltd. + + + E83A4B + China Mobile Group Device Co.,Ltd. + + + 3CE3E7 + China Mobile Group Device Co.,Ltd. + + + 187CAA + China Mobile Group Device Co.,Ltd. + + + 6CC36A + vivo Mobile Communication Co., Ltd. + + + 5872C9 + zte corporation + + + 38E563 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + 58FCE3 + Funshion Online Technologies Co.,Ltd + + + 30C599 + ASUSTek COMPUTER INC. + + + 3C1640 + Qingdao Haier Technology Co.,Ltd + + + 0023E9 + F5 Inc. + + + 40BC68 + Funshion Online Technologies Co.,Ltd + + + 889AFF + SystemX Co.,Ltd. + + + B8DDE8 + Sichuan Tianyi Comheart Telecom Co.,LTD + + + 78A1D8 + ShenzhenEnjoyTechnologyCo.,Ltd + + + 30FEFA + Cisco Systems, Inc + + + 6C4FA1 + Cisco Systems, Inc + + + 409595 + TP-Link Systems Inc. + + + 48CA68 + Apple, Inc. + + + 747786 + Apple, Inc. + + + D842F7 + Tozed Kangwei Tech Co.,Ltd + + + 1886C3 + Nokia + + + 087671 + Juniper Networks + + + A46B1F + eero inc. + + + E8CA50 + Bouffalo Lab (Nanjing) Co., Ltd. + + + 2801CD + Mellanox Technologies, Inc. + + + E08614 + Inseego Wireless, Inc + + + A8C407 + HUAWEI TECHNOLOGIES CO.,LTD + + + 508D62 + HUAWEI TECHNOLOGIES CO.,LTD + + + DC121D + HUAWEI TECHNOLOGIES CO.,LTD + + + 40EB21 + HUAWEI TECHNOLOGIES CO.,LTD + + + 68FE71 + Espressif Inc. + + + D86B83 + Nintendo Co.,Ltd + + + C07415 + IntelPro Inc. + + + 30305F + Valeo Schalter und Sensoren GmbH + + + 787835 + IEEE Registration Authority + + + 8C96A5 + New H3C Technologies Co., Ltd + + + BCD22C + Intel Corporate + + + 2C0369 + ACCTON TECHNOLOGY CORPORATION + + + 509903 + Meta Platforms, Inc. + + + 64681A + DASAN Network Solutions + + + 40268E + Shenzhen Photon Leap Technology Co., Ltd. + + + 5478F0 + zte corporation + + + 74F441 + Samsung Electronics Co.,Ltd + + + E03AAA + Intel Corporate + + + 343916 + Google, Inc. + + + 64D9C2 + eero inc. + + + 20E7C8 + Espressif Inc. + + + 000432 + Voyetra Turtle Beach, Inc. + + + 288761 + LG Innotek + + + 780C71 + Inseego Wireless, Inc + + + A82BDD + LCFC(Hefei) Electronics Technology co., ltd + + + 8082FE + Arcadyan Corporation + + + CCCFFE + Henan Lingyunda Information Technology Co., Ltd + + + 34B5F3 + IEEE Registration Authority + + + 40497C + eero inc. + + + C0AFF2 + Dyson Limited + + + 2010B1 + Amazon Technologies Inc. + + + 8453CD + China Mobile Group Device Co.,Ltd. + + + F8554B + WirelessMobility Engineering Centre SDN. BHD + + + BC2A33 + Quectel Wireless Solutions Co.,Ltd. + + + 8C913A + Mellanox Technologies, Inc. + + + E489CA + Cisco Systems, Inc + + + 14BC68 + Cisco Systems, Inc + + + 0CEE20 + FBC + + + 98F67A + Chipsea Technologies (Shenzhen) Crop. + + + C49A31 + Zyxel Communications Corporation + + + 480E13 + ittim + + + 743491 + Shenzhen Kings IoT Co., Ltd + + + 08D945 + HUAWEI TECHNOLOGIES CO.,LTD + + + 00A01B + Zhone Technologies, Inc. + + + 00E0DF + Zhone Technologies, Inc. + + + 00180C + Zhone Technologies, Inc. + + + 40F21C + Zhone Technologies, Inc. + + + AC84FA + Zhejiang Weilai Jingling Artificial Intelligence Technology Co., Ltd. + + + 3C4015 + 12mm Health Technology (Hainan) Co., Ltd. + + + 642E41 + HUAWEI TECHNOLOGIES CO.,LTD + + + 0C1A61 + Neox FZCO + + + C00925 + FN-LINK TECHNOLOGY Ltd. + + + B8D82D + Qingdao Intelligent&Precise Electronics Co.,Ltd. + + + 84A1B7 + Honor Device Co., Ltd. + + + DCA281 + Honor Device Co., Ltd. + + + FCABD0 + vivo Mobile Communication Co., Ltd. + + + 5485C1 + Siliconwaves Technologies Co.,Ltd + + + F4289D + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. + + + 9CC394 + Apple, Inc. + + + 4CAD35 + Apple, Inc. + + + 9C3B91 + VSSL + + + E02611 + Apple, Inc. + + + F4979D + IEEE Registration Authority + + + B0F1AE + eero inc. + + + 0C587B + Quectel Wireless Solutions Co.,Ltd. + + + E8A55A + Juniper Networks + + + 68F21F + Bose Corporation + + + 2C9D4B + Lavelle Networks Private Limited + + + E84074 + Barrot Technology Co.,Ltd. + + + B0BC8E + SkyMirr + + + 88546B + Texas Instruments + + + B014DF + MitraStar Technology Corp. + + + 10E66B + Kaon Broadband CO., LTD. + + + ACF466 + HP Inc. + + + 746859 + SUNITEC TECHNOLOGY CO.,LIMITED + + + C062F2 + Beijing Cotytech Co.,LTD + + + 28B27C + Sailing Northern Technology + + + 24EE5D + Vizio, Inc + + + 403E22 + VusionGroup + + + D4A254 + HUAWEI TECHNOLOGIES CO.,LTD + + + EC8152 + HUAWEI TECHNOLOGIES CO.,LTD + + + 68CCAE + Fortinet, Inc. + + + 10BD43 + Robert Bosch Elektronikai Kft. + + + 78119D + Cisco Systems, Inc + + + 588FCF + Hangzhou Ezviz Software Co.,Ltd. + + + 78A6A0 + Hangzhou Ezviz Software Co.,Ltd. + + + 0C3623 + Nokia Shanghai Bell Co., Ltd. + + + 54D60D + Hangzhou Ezviz Software Co.,Ltd. + + + D40DAB + Shenzhen Cudy Technology Co., Ltd. + + + 18B0A4 + zte corporation + + + 000B0F + Bosch Rexroth AG + + + 8493EC + Guangzhou Shiyuan Electronic Technology Company Limited + + + F07084 + Actiontec Electronics Inc. + + + 4044F7 + Nintendo Co.,Ltd + + + A405FD + Bouffalo Lab (Nanjing) Co., Ltd. + + + A090B5 + Tiinlab Corporation + + + 288328 + EMALDO TECHNOLOGY(HK)LIMITED + + + ACEBE6 + Espressif Inc. + + + E8B3EE + Pixelent Inc. + + + 6C7A63 + Arista Networks + + + C4168F + Apple, Inc. + + + F82AE2 + Apple, Inc. + + + 845C31 + Dell Inc. + + + 149569 + Shenzhen iComm Semiconductor CO.,LTD + + + 702661 + Universal Global Scientific Industrial., Ltd + + + 00247E + Universal Global Scientific Industrial., Ltd + + + 0010C6 + Universal Global Scientific Industrial., Ltd + + + 001641 + Universal Global Scientific Industrial., Ltd + + + 001A6B + Universal Global Scientific Industrial., Ltd + + + 001E37 + Universal Global Scientific Industrial., Ltd + + + 1C7D51 + HANSHOW TECHNOLOGY CO.,LTD. + + + 402CF4 + Universal Global Scientific Industrial., Ltd + + + 4439C4 + Universal Global Scientific Industrial., Ltd + + + 047BCB + Universal Global Scientific Industrial., Ltd + + + 50FBFF + Franklin Technology Inc. + + + E0CDB8 + Huawei Device Co., Ltd. + + + B4E5C5 + Huawei Device Co., Ltd. + + + 087C43 + Huawei Device Co., Ltd. + + + 70E997 + HUAWEI TECHNOLOGIES CO.,LTD + + + 0816E3 + HUAWEI TECHNOLOGIES CO.,LTD + + + 8829BF + Amazon Technologies Inc. + + + 001AB9 + Groupe Carrus + + + C467A1 + Accelight Technologies (Wuhan) Inc. + + + E037BF + WNC Corporation + + + D86162 + WNC Corporation + + + 64FF0A + WNC Corporation + + + E8C7CF + WNC Corporation + + + F46C68 + WNC Corporation + + + 589671 + WNC Corporation + + + D8332A + Ruijie Networks Co.,LTD + + + 6002B4 + WNC Corporation + + + 000B6B + WNC Corporation + + + 24D53B + Motorola Mobility LLC, a Lenovo Company + + + C834E5 + Cisco Systems, Inc + + + 989E80 + tonies GmbH + + + 24C35D + Duke University + + + 50926A + Beijing Xiaomi Mobile Software Co., Ltd + + + 041CDB + Siba Service + + + 983FA4 + zte corporation + + + 806132 + Cisco Systems, Inc + + + 8818F1 + Nokia + + + F0FB7F + Mellanox Technologies, Inc. + + + 8445A0 + Tube investments of India Limited + + + 30BC4F + Beijing Jianguo Bite Technology Co., Ltd. + + + 543631 + Intel Corporate + + + 849265 + Intel Corporate + + + 90B021 + Intel Corporate + + + 9453FF + Intel Corporate + + + E0C932 + Intel Corporate + + + A43FA7 + Hewlett Packard Enterprise + + + 74FA29 + Ubiquiti Inc + + + 54C1D3 + Guangzhou TR Intelligent Manufacturing Technology Co., Ltd + + + E0315D + EM Microelectronic + + + 0012C1 + Check Point Software Technologies Ltd. + + + 9840D4 + Vantiva Connected Home - Technologies Telco + + + B86870 + Nintendo Co.,Ltd + + + F0ABFA + Shenzhen Rayin Technology Co.,Ltd + + + A44A64 + Maverick Mobile LLC + + + 5CC41D + Stone Devices Sdn. Bhd. + + + 689FD4 + Amazon Technologies Inc. + + + DC44B1 + Hilti Corporation + + + F4525B + Antare Technology Ltd + + + 50D06D + Bird Buddy + + + 34EF8B + NTT DOCOMO BUSINESS, Inc. + + + E0A366 + Motorola Mobility LLC, a Lenovo Company + + + 809FE4 + SHEN ZHEN TENDA TECHNOLOGY CO.,LTD + + + ACE6BB + Google, Inc. + + + 2C3033 + NETGEAR + + + E41B43 + Beijing Xiaomi Mobile Software Co., Ltd + + + 380FE4 + Dedicated Network Partners Oy + + + 54077D + NETGEAR + + + E89744 + LCFC(Hefei) Electronics Technology co., ltd + + + 3C3786 + NETGEAR + + + BCA511 + NETGEAR + + + 94A67E + NETGEAR + + + 80CC9C + NETGEAR + + + 3498B5 + NETGEAR + + + 60A954 + Cisco Systems, Inc + + + 441A5C + Cisco Systems, Inc + + + 30469A + NETGEAR + + + E0469A + NETGEAR + + + A00460 + NETGEAR + + + 504A6E + NETGEAR + + + F0ED51 + Qingdao Intelligent&Precise Electronics Co.,Ltd. + + + FC3D98 + ACCTON TECHNOLOGY CORPORATION + + + 28B67C + KEBODA Intelligent TECHNOLOGY CO., LTD. + + + 682ADD + zte corporation + + + 602972 + Arista Networks + + + 20B001 + Vantiva Technologies Belgium + + + 44658A + Dukelana LLC + + + A4B1E9 + Vantiva Technologies Belgium + + + 64F64D + CELESTICA INC. + + + 48FC7C + Shenzhen Huidu Technology Co., Ltd. + + + 9CDF8A + HUAWEI TECHNOLOGIES CO.,LTD + + + FCA27E + HUAWEI TECHNOLOGIES CO.,LTD + + + 945AEA + HUAWEI TECHNOLOGIES CO.,LTD + + + 748DAA + HUAWEI TECHNOLOGIES CO.,LTD + + + 009235 + Apple, Inc. + + + F02FBA + Apple, Inc. + + + E4CE58 + Anhui Realloong Automotive Electronics Co.,Ltd + + + 7414D0 + Apple, Inc. + + + 3CFB02 + Apple, Inc. + + + 9035A2 + Apple, Inc. + + + 04B5B2 + Apple, Inc. + + + F478AC + Apple, Inc. + + + 7C246A + Scita Solutions + + + F464B6 + Sercomm Corporation. + + + C0EE40 + Ezurio, LLC + + + C8ADE7 + Shenzhen Shengxi Industrial Co.,Ltd + + + AC3DFA + Hangzhou Huacheng Network Technology Co.,Ltd + + + 8CA454 + Private + + + C8741B + Fiberhome Telecommunication Technologies Co.,LTD + + + F4E25D + AltoBeam Inc. + + + CC36BB + Silicon Laboratories + + + CC7645 + Microsoft Corporation + + + 9812B7 + KARST.AI + + + 8C5D54 + Kisi + + + 545618 + Huawei Device Co., Ltd. + + + 58509F + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. + + + 7866A5 + Chipsea Technologies (Shenzhen) Crop. + + + 38EC07 + Motorola Mobility LLC, a Lenovo Company + + + 906FA7 + Funshion Online Technologies Co.,Ltd + + + 64A337 + Garmin International + + + 5C5136 + Samsung Electronics Co.,Ltd + + + 3456ED + Goerdyna Group Co., Ltd + + + C0CF64 + Hangzhou Zenith Electron Co.,Ltd + + + 3077DF + Terex Corporation + + + 901F09 + Silicon Laboratories + + + 04B247 + Espressif Inc. + + + B4BFE9 + Espressif Inc. + + + B43836 + HUAWEI TECHNOLOGIES CO.,LTD + + + B042B7 + HUAWEI TECHNOLOGIES CO.,LTD + + + 800D3F + Samsung Electronics Co.,Ltd + + + 382FB0 + GD Midea Air-Conditioning Equipment Co.,Ltd. + + + 308B23 + Annapurna labs + + + 0C61F9 + Tozed Kangwei Tech Co., Ltd + + + 24AFCC + Chiun Mai Communication System, Inc + + + A49DB8 + SHENZHEN TECNO TECHNOLOGY + + + 089C74 + UNIONMAN TECHNOLOGY CO.,LTD + + + BC277A + Samsung Electronics Co.,Ltd + + + BCAF6E + Arcadyan Corporation + + + E41226 + AUMOVIO Technologies Romania S.R.L. + + + ACC358 + AUMOVIO Czech Republic s.r.o. + + + 0005DB + PSI Software SE, + + + C0A4B9 + Sichuan AI-Link Technology Co., Ltd. + + + 405ADD + Actions Microelectronics + + + 80E63C + Xiaomi Communications Co Ltd + + + 907ADA + CHINA DRAGON TECHNOLOGY LIMITED + + + 9051F8 + Hewlett Packard Enterprise + + + A857BA + Shenzhen YOUHUA Technology Co., Ltd + + + 7C8767 + Cisco Systems, Inc + + + 141923 + Cisco Systems, Inc + + + 987800 + TCT mobile ltd + + + 884558 + Amicro Technology Co., Ltd. + + + 10CB33 + NXP Semiconductors Taiwan Ltd. + + + C4491B + Apple, Inc. + + + 804715 + Apple, Inc. + + + 7CD1AD + Apple, Inc. + + + 24A5FF + Fairbanks Scales + + + 742920 + MCX-PRO Kft. + + + 30A033 + Apple, Inc. + + + 60470A + Shenzhen Zenith Intelligent Technology Co., Ltd. + + + 8C22D2 + Hangzhou Hikvision Digital Technology Co.,Ltd. + + + 209BDD + HUAWEI TECHNOLOGIES CO.,LTD + + + B8328F + eero inc. + + + F4A3C2 + Shenzhen iComm Semiconductor CO.,LTD + + + 341FC4 + Shenzhen V-Link Technology CO., LTD. + + + 080299 + HC Corporation + + + 3C65D1 + HUAWEI TECHNOLOGIES CO.,LTD + + + 807786 + IEEE Registration Authority + + + F80C9A + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + 541FCD + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + AC276E + Espressif Inc. + + + 643136 + Mellanox Technologies, Inc. + + + 88F155 + Espressif Inc. + + + 94FC87 + Hirschmann Automation and Control GmbH + + + E4793F + Juniper Networks + + + B855EA + Yantai Jahport Electronic Technology Co., Ltd. + + + 8C2AC1 + GSD VIET NAM TECHNOLOGY COMPANY LIMITED + + + B8CD58 + Shenzhen SuperElectron Technology Co.,Ltd. + + + BC8D2D + Fiberhome Telecommunication Technologies Co.,LTD + + + EC30DD + eero inc. + + + E8F094 + GD Midea Air-Conditioning Equipment Co.,Ltd. + + + 3CF75D + Zyxel Communications Corporation + + + 3412DC + Qingdao HaierTechnology Co.,Ltd + + + CC58C7 + Nokia + + + 641B85 + Vantiva USA LLC + + + 1C6932 + Hisense Home Appliances Group Co., Ltd. Qingdao Branch + + + B09501 + EM Microelectronic + + + D85B27 + WNC Corporation + + + C42C7B + VIETNAM POST AND TELECOMMUNICATION INDUSTRY TECHNOLOGY JOIN STOCK COMPANY + + + F4A157 + Huawei Device Co., Ltd. + + + A8724D + Intel Corporate + + + 6457BA + Intel Corporate + + + 34D7F5 + IEEE Registration Authority + + + B8CC38 + Shenzhen Yinwang Intelligent Technologies Co., Ltd. + + + 343DA9 + HUAWEI TECHNOLOGIES CO.,LTD + + + C47BE3 + HUAWEI TECHNOLOGIES CO.,LTD + + + 60720B + BLU Products Inc + + + 80FD7A + BLU Products Inc + + + A8CA87 + ZHEJIANG DAHUA ZHILIAN CO.,LTD + + + A861EC + Texas Instruments + + + 746A84 + Texas Instruments + + + B08CB3 + FN-LINK TECHNOLOGY Ltd. + + + DC5D31 + ITEL MOBILE LIMITED + + + 80E869 + AltoBeam Inc. + + + D489C1 + Ubiquiti Inc + + + 8C0F7E + TCL King Electrical Appliances(Huizhou)Co.,Ltd + + + 089B27 + GSD VIET NAM TECHNOLOGY COMPANY LIMITED + + + 685EDF + NXP Semiconductors Taiwan Ltd. + + + F00C51 + zte corporation + + + 089536 + Actiontec Electronics Inc. + + + 847CEE + Cisco Systems, Inc + + + 906F18 + Afero, Inc. + + + 24D660 + Silicon Laboratories + + + 18C3E4 + IEEE Registration Authority + + + 184F5D + Japan Radio Co., Ltd + + + 6C2813 + nFore Technology Co., Ltd. + + + 08357D + Microsoft Corporation + + + C03A55 + TP-Link Systems Inc. + + + B88788 + HP Inc. + + + A85F61 + Apple, Inc. + + + C4F445 + Apple, Inc. + + + 5856AA + Apple, Inc. + + + F8CB15 + Apple, Inc. + + + 7845DC + HUAWEI TECHNOLOGIES CO.,LTD + + + 10490E + HUAWEI TECHNOLOGIES CO.,LTD + + + D4CE40 + Apple, Inc. + + + 887015 + Apple, Inc. + + + F0D018 + Hewlett Packard Enterprise + + + 00171E + Benning Elektrotechnik und Elektronik GmbH & Co. KG + + + D862CA + Cisco Systems, Inc + + + 742554 + NVIDIA Corporation + + + 54E6FD + Sony Interactive Entertainment Inc. + + + 6CBF2F + eero inc. + + + 1CE4DD + Technicolor (China) Technology Co., Ltd. + + + 447831 + HUAWEI TECHNOLOGIES CO.,LTD + + + 38B14E + IEEE Registration Authority + + + 9CCE22 + PROMED Soest GmbH + + + 6848B4 + AltoBeam Inc. + + + EC72F7 + DJI BAIWANG TECHNOLOGY CO LTD + + + F81B2E + G.Tech Technology Ltd. + + + F41AF7 + zte corporation + + + E4FB1E + Microsoft Corporation + + + B8D5AD + Nokia + + + 002308 + Arcadyan Corporation + + + 9C80DF + Arcadyan Corporation + + + 880355 + Arcadyan Corporation + + + 9454A0 + Fosilicon CO., Ltd + + + 28875F + Annapurna labs + + + 386DED + Juniper Networks + + + 103A5D + Emerson + + + 30084D + Trumpf Hüttinger + + + 4C09D4 + Arcadyan Corporation + + + DC9DED + Samsung Electronics Co.,Ltd + + + AC62FF + Vantiva USA LLC + + + AC46A7 + SERCOMM PHILIPPINES INC + + + 30C8A2 + SHENZHEN TRANSCHAN TECHNOLOGY LIMITED + + + E0830D + NOTTA PTE. LTD. + + + 2CABEE + EM Microelectronic + + + 301C22 + Hewlett Packard Enterprise + + + FCCA10 + MERCUSYS TECHNOLOGIES CO., LTD. + + + 34C232 + Samsung Electronics Co.,Ltd + + + 9CF27E + Samsung Electronics Co.,Ltd + + + D0EA30 + NXP Semiconductors Taiwan Ltd. + + + F0A4EA + Huawei Device Co., Ltd. + + + A8F07C + Huawei Device Co., Ltd. + + + 98E301 + Shenzhen Sundray Technologies company Limited + + + 087D60 + SAMJIN Co.ltd + + + BCB30E + Cisco Systems, Inc + + + 0007A7 + Glory Technical Solutions Co., Ltd. + + + 3C155A + Nokia + + + 243672 + AMPAK Technology Inc. + + + 3007A3 + Shenzhen Skyworth Digital Technology CO., Ltd + + + EC8F72 + Barrot Technology Co.,Ltd. + + + ECB931 + TP-Link Systems Inc. + + + D4D6DF + TP-Link Systems Inc. + + + 003CB7 + AzureWave Technology Inc. + + + EC715E + Freefly Systems Inc + + + 447B45 + Amazon Technologies Inc. + + + 90FC55 + Hyve Solutions + + + CCE7DE + IEEE Registration Authority + + + 48F925 + Maestronic + + + 4CA03D + Bouffalo Lab (Nanjing) Co., Ltd. + + + E4FADE + Microsoft Corporation + + + CCDD28 + ACCTON TECHNOLOGY CORPORATION + + + 8099CF + Texas Instruments + + + 38FF59 + Dell Inc. + + + 286926 + OPTOKON, a.s. + + + B09C18 + Shenzhen Taichi Technology Limited + + + 8CD1A6 + eero inc. + + + 08CBE5 + R3 Solutions GmbH + + + 743CDE + Hewlett Packard Enterprise + + + E48FB7 + Arista Networks + + + 0CFEE5 + Texas Instruments + + + D8A469 + Sonova AG + + + 702D81 + Infinix mobility limited + + + 945915 + Amazon Technologies Inc. + + + A44F3E + IEEE Registration Authority + + + CC7A8B + SHENZHEN TECNO TECHNOLOGY + + + 400EB9 + HUAWEI TECHNOLOGIES CO.,LTD + + + 08DD82 + HUAWEI TECHNOLOGIES CO.,LTD + + + 1CBAB8 + vivo Mobile Communication Co., Ltd. + + + 6C9313 + Mellanox Technologies, Inc. + + + B09CB2 + Google, Inc. + + + 68080D + Shenzhen Yingsheng Technology Co., LTD + + + E06CA6 + Creotech Quantum SA + + + 785249 + Loxone Electronics GmbH + + + 9C09CA + Huawei Device Co., Ltd. + + + 5C8505 + Huawei Device Co., Ltd. + + + BCA6E7 + Sichuan Odot Automation System Co., Ltd. + + + 2CE64D + GD Midea Air-Conditioning Equipment Co.,Ltd. + + + 1CD21E + Juniper Networks + + + DC330E + Qingdao Haier Technology Co.Ltd + + + 44CC6E + Rockwell Automation + + + 6C55F6 + eero inc. + + + A829DC + TP-Link Systems Inc. + + + 289104 + TP-Link Systems Inc. + + + 2C0613 + China Mobile Group Device Co.,Ltd. + + + C8D778 + BSH Hausgeräte GmbH + + + 6418DF + Sagemcom Broadband SAS + + + 647B1E + Sagemcom Broadband SAS + + + D06EDE + Sagemcom Broadband SAS + + + F04DD4 + Sagemcom Broadband SAS + + + 547370 + The LEGO Group + + + 580FA5 + Apple, Inc. + + + 40B570 + Hangzhou Hikvision Digital Technology Co.,Ltd. + + + B80E1D + PAX Computer Technology(Shenzhen) Ltd. + + + F416E7 + Skyverse Limited + + + B49A7D + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + 480A28 + Apple, Inc. + + + BC89C1 + Apple, Inc. + + + 7062CB + Apple, Inc. + + + 087B0F + Amazon Technologies Inc. + + + A04E8D + Cisco Meraki + + + 44B4A0 + Mellanox Technologies, Inc. + + + 647D4D + Arcadyan Corporation + + + C0FD6F + Sagemcom Broadband SAS + + + 045A3D + Nothing Technology Limited + + + 54F283 + Silicon Laboratories + + + DC2DDE + Illucere Srl + + + 448A7F + Murata Manufacturing Co., Ltd. + + + E8D5A1 + Earda Technologies co Ltd + + + 28BAB9 + ACME LIGHTING + + + D45039 + Sagemcom Broadband SAS + + + C0CAA2 + ESSYS + + + A89A93 + Sagemcom Broadband SAS + + + 289EFC + Sagemcom Broadband SAS + + + 3C1710 + Sagemcom Broadband SAS + + + 44ADB1 + Sagemcom Broadband SAS + + + 6C9961 + Sagemcom Broadband SAS + + + 48D24F + Sagemcom Broadband SAS + + + B01FF4 + Sagemcom Broadband SAS + + + D427FF + Sagemcom Broadband SAS + + + F40595 + Sagemcom Broadband SAS + + + 0CAC8A + Sagemcom Broadband SAS + + + 6CFFCE + Sagemcom Broadband SAS + + + 843E03 + Sagemcom Broadband SAS + + + 981E19 + Sagemcom Broadband SAS + + + 441524 + Sagemcom Broadband SAS + + + 44053F + Sagemcom Broadband SAS + + + 001F95 + Sagemcom Broadband SAS + + + 002348 + Sagemcom Broadband SAS + + + 002691 + Sagemcom Broadband SAS + + + 988B5D + Sagemcom Broadband SAS + + + 90013B + Sagemcom Broadband SAS + + + 7C034C + Sagemcom Broadband SAS + + + 6C2E85 + Sagemcom Broadband SAS + + + 94FEF4 + Sagemcom Broadband SAS + + + 3844BE + Espressif Inc. + + + 3076F5 + Espressif Inc. + + + 3C0F02 + Espressif Inc. + + + 2805A5 + Espressif Inc. + + + 40C729 + Sagemcom Broadband SAS + + + 4883C7 + Sagemcom Broadband SAS + + + 00604C + Sagemcom Broadband SAS + + + B87B4D + Espressif Inc. + + + D40592 + Espressif Inc. + + + 08AD0A + Espressif Inc. + + + 18FE34 + Espressif Inc. + + + A47B9D + Espressif Inc. + + + 84F3EB + Espressif Inc. + + + 840D8E + Espressif Inc. + + + F0161D + Espressif Inc. + + + 146393 + Espressif Inc. + + + 8C10D4 + Sagemcom Broadband SAS + + + 3030F9 + Espressif Inc. + + + 7C7398 + Espressif Inc. + + + 6CB456 + Espressif Inc. + + + 24587C + Espressif Inc. + + + CC8DA2 + Espressif Inc. + + + A0DD6C + Espressif Inc. + + + D0EF76 + Espressif Inc. + + + C4D8D5 + Espressif Inc. + + + ECDA3B + Espressif Inc. + + + 84FCE6 + Espressif Inc. + + + B0A732 + Espressif Inc. + + + B0B21C + Espressif Inc. + + + A0B765 + Espressif Inc. + + + CCDBA7 + Espressif Inc. + + + 08B61F + Espressif Inc. + + + E05A1B + Espressif Inc. + + + 048308 + Espressif Inc. + + + ECE334 + Espressif Inc. + + + 1051DB + Espressif Inc. + + + 0C4EA0 + Espressif Inc. + + + 483FDA + Espressif Inc. + + + F008D1 + Espressif Inc. + + + 7C9EBD + Espressif Inc. + + + 308398 + Espressif Inc. + + + 409151 + Espressif Inc. + + + E89F6D + Espressif Inc. + + + 485519 + Espressif Inc. + + + 70B8F6 + Espressif Inc. + + + 0CB815 + Espressif Inc. + + + 24EC4A + Espressif Inc. + + + 901506 + Espressif Inc. + + + CCBA97 + Espressif Inc. + + + 841FE8 + Espressif Inc. + + + B03FD3 + Espressif Inc. + + + 3C227F + Quectel Wireless Solutions Co.,Ltd. + + + 5037CD + Quectel Wireless Solutions Co.,Ltd. + + + 2C2B86 + Sagemcom Broadband SAS + + + 343839 + NEC Platforms, Ltd. + + + C05097 + EG4 Electronics + + + 28B3AF + Qualynxus Inc + + + F8622A + eero inc. + + + 88C22D + BUFFALO.INC + + + 4CE4B6 + Motorola Mobility LLC, a Lenovo Company + + + DC2919 + AltoBeam(Xiamen)Technology Co., Ltd. + + + 20F41B + SHENZHEN BILIAN ELECTRONIC CO.,LTD + + + 847AB6 + AltoBeam Inc. + + + 504035 + Vantiva USA LLC + + + 80AE54 + TP-LINK TECHNOLOGIES CO.,LTD. + + + 78605B + TP-LINK TECHNOLOGIES CO.,LTD. + + + 04F9F8 + TP-LINK TECHNOLOGIES CO.,LTD. + + + 480EEC + TP-LINK TECHNOLOGIES CO.,LTD. + + + 503EAA + TP-LINK TECHNOLOGIES CO.,LTD. + + + F46D2F + TP-LINK TECHNOLOGIES CO.,LTD. + + + 18F22C + TP-LINK TECHNOLOGIES CO.,LTD. + + + 9897CC + TP-LINK TECHNOLOGIES CO.,LTD. + + + 18A6F7 + TP-LINK TECHNOLOGIES CO.,LTD. + + + ACE4D8 + Xiaomi Communications Co Ltd + + + 6C72B8 + LCFC(Hefei) Electronics Technology co., ltd + + + B09575 + TP-LINK TECHNOLOGIES CO.,LTD. + + + FC0F76 + Amazon Technologies Inc. + + + F040D9 + Apple, Inc. + + + 20521D + Apple, Inc. + + + 103089 + Resideo + + + D85437 + HUAWEI TECHNOLOGIES CO.,LTD + + + F453E4 + HUAWEI TECHNOLOGIES CO.,LTD + + + F425FE + HUAWEI TECHNOLOGIES CO.,LTD + + + C03E75 + HUAWEI TECHNOLOGIES CO.,LTD + + + 406768 + Huawei Device Co., Ltd. + + + 780541 + Queclink Wireless Solutions Co., Ltd. + + + 689DD2 + Espressif Inc. + + + 9074F2 + HUAWEI TECHNOLOGIES CO.,LTD + + + 709FEC + CU Velocity + + + 60FAA7 + SHENZHEN MTC CO LTD + + + C8C992 + Beijing Roborock Technology Co., Ltd. + + + C413E2 + Extreme Networks, Inc. + + + C8675E + Extreme Networks, Inc. + + + 00DCB2 + Extreme Networks, Inc. + + + F4CE48 + Extreme Networks, Inc. + + + B4C799 + Extreme Networks, Inc. + + + F09CE9 + Extreme Networks, Inc. + + + 9C5D12 + Extreme Networks, Inc. + + + 90B832 + Extreme Networks, Inc. + + + AC4DD9 + Extreme Networks, Inc. + + + C47A5D + Panmnesia Inc. + + + D8E016 + Extreme Networks, Inc. + + + E41613 + Extreme Networks, Inc. + + + 1C984B + Extreme Networks, Inc. + + + 248185 + Extreme Networks, Inc. + + + 00B81D + Extreme Networks, Inc. + + + 30B89A + KRYON TECHNOLOGY PRIVATE LIMITED + + + E4C0FE + Apple, Inc. + + + 7CD544 + Espressif Inc. + + + 40E317 + Extreme Networks, Inc. + + + 44E4E6 + Extreme Networks, Inc. + + + 40B215 + Extreme Networks, Inc. + + + 8CE807 + Bouffalo Lab (Nanjing) Co., Ltd. + + + 4835AB + Apple, Inc. + + + FC9DD2 + Apple, Inc. + + + 708536 + Arcadyan Corporation + + + 74BC6B + Intel Corporate + + + CC1966 + EM Microelectronic + + + 20AB53 + Motorola Mobility LLC, a Lenovo Company + + + 5CAAA2 + CELESTICA INC. + + + C85CE2 + IEEE Registration Authority + + + DCEE14 + ADT Technology + + + 10FFE0 + GIGA-BYTE TECHNOLOGY CO.,LTD. + + + E84A54 + Beijing Xiaomi Mobile Software Co., Ltd + + + 2CAB46 + Ruckus Wireless + + + 90A1BA + PNetworks Electronics Information + + + 000AD7 + Origin Co., Ltd. + + + A0D86F + ARGO AI, LLC + + + B4D7DB + New H3C Technologies Co., Ltd + + + 3050CE + Xiaomi Communications Co Ltd + + + B405A1 + Xiaomi Communications Co Ltd + + + 2885BB + Zen Exim Pvt. Ltd. + + + F8C650 + Cisco Systems, Inc + + + 3C1060 + Fiberhome Telecommunication Technologies Co.,LTD + + + B4565D + Chipsea Technologies (Shenzhen) Corp. + + + 4CE136 + Private + + + 0084ED + LEXMARK INTERNATIONAL, INC. + + + C05D39 + Jiangsu Huitong Group Co.,Ltd. + + + 74249F + TIBRO Corp. + + + 648505 + zte corporation + + + E4604D + zte corporation + + + F4E84F + zte corporation + + + C87867 + Mist Systems, Inc. + + + E822B8 + Shenzhen Skyworth Digital Technology CO., Ltd + + + 00F952 + HUAWEI TECHNOLOGIES CO.,LTD + + + 2C15D9 + HUAWEI TECHNOLOGIES CO.,LTD + + + D4A923 + HUAWEI TECHNOLOGIES CO.,LTD + + + B810D4 + Masimo Corporation + + + C89F0C + Motorola Mobility LLC, a Lenovo Company + + + 28E6A9 + Samsung Electronics Co.,Ltd + + + DC2D04 + vivo Mobile Communication Co., Ltd. + + + A43CD7 + NTX Electronics YangZhou co.,LTD + + + 000263 + RPS S.p.A. + + + 483543 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + 4C5F70 + Intel Corporate + + + 60B9C0 + Cisco Systems, Inc + + + 8C9461 + Cisco Systems, Inc + + + 5807F8 + Nokia Solutions and Networks GmbH & Co. KG + + + DC6555 + New H3C Intelligence Terminal Co., Ltd. + + + 346F71 + TenaFe Inc. + + + 5491AF + IEEE Registration Authority + + + 9C3928 + Samsung Electronics Co.,Ltd + + + BC0EAB + Samsung Electronics Co.,Ltd + + + 98FB27 + Samsung Electronics Co.,Ltd + + + A80BFB + Ruckus Wireless + + + 3CFA30 + Palo Alto Networks + + + CCECB7 + ShenZhen Linked-Z Intelligent Display Co., Ltd + + + A8B8E0 + Changwang Technology inc. + + + 14CA56 + zte corporation + + + 48D35D + Private + + + 5433C6 + Mist Systems, Inc. + + + CC934A + Sierra Wireless, ULC + + + 00A0D5 + Sierra Wireless, ULC + + + 28A331 + Sierra Wireless, ULC + + + 6C221A + AltoBeam Inc. + + + D843AE + Micro-Star INTL CO., LTD. + + + A843A4 + China Dragon Technology Limited + + + D8094E + Active Brains + + + 00D07C + JTEKT ELECTRONICS CORPORATION + + + 886C60 + Xiaomi Communications Co Ltd + + + E0DF13 + Hangzhou Hikvision Digital Technology Co.,Ltd. + + + B01886 + SmarDTV Corporation + + + C8A6EF + Samsung Electronics Co.,Ltd + + + 687909 + Cisco Systems, Inc + + + E4A41C + Cisco Systems, Inc + + + B40AD8 + Sony Interactive Entertainment Inc. + + + 0480A7 + ShenZhen TianGang Micro Technology CO.LTD + + + 389CB2 + Apple, Inc. + + + 583653 + Apple, Inc. + + + 84D328 + Apple, Inc. + + + 504074 + Alarm.com + + + 5C7B5C + Shenzhen SDMC Technology CO.,Ltd. + + + 407912 + Texas Instruments + + + 58A15F + Texas Instruments + + + 10CABF + Texas Instruments + + + 98524A + Vantiva USA LLC + + + A0FF70 + Vantiva USA LLC + + + 5C7D7D + Vantiva USA LLC + + + 08A7C0 + Vantiva USA LLC + + + 8C6A8D + Vantiva USA LLC + + + 1C9ECC + Vantiva USA LLC + + + CC1AA3 + Arista Networks + + + 3CC03E + HUAWEI TECHNOLOGIES CO.,LTD + + + FC94E3 + Vantiva USA LLC + + + 8C04FF + Vantiva USA LLC + + + CC3540 + Vantiva USA LLC + + + B0C287 + Vantiva USA LLC + + + BC9B68 + Vantiva USA LLC + + + 80D04A + Vantiva USA LLC + + + 3CB74B + Vantiva USA LLC + + + FC9114 + Vantiva USA LLC + + + 500959 + Vantiva USA LLC + + + 3817E1 + Vantiva USA LLC + + + 4075C3 + Vantiva USA LLC + + + 10A793 + Vantiva USA LLC + + + B8A535 + Vantiva USA LLC + + + 9839C0 + FLEXTRONICS + + + 8CCB14 + TBS GmbH + + + BC5C17 + Qingdao Intelligent&Precise Electronics Co.,Ltd. + + + 74B80F + Zipline International Inc. + + + 545FA7 + Jibaiyou Technology Co.,Ltd. + + + 08BFB8 + ASUSTek COMPUTER INC. + + + 003044 + CradlePoint, Inc + + + 00E01C + CradlePoint, Inc + + + 58D237 + Sichuan Tianyi Comheart Telecom Co.,LTD + + + BC0FF3 + HP Inc. + + + 64B379 + Jiangsu Viscore Technologies Co.,Ltd + + + 24FDFA + Private + + + D43127 + Ruijie Networks Co.,LTD + + + ECEF17 + Sunplus Technology Co., Ltd. + + + 4CC64C + Beijing Xiaomi Mobile Software Co., Ltd + + + 90E468 + Guangzhou Shiyuan Electronic Technology Company Limited + + + EC0C96 + Nokia + + + A0779E + Chipsea Technologies (Shenzhen) Corp. + + + 90D092 + HUMAX Co., Ltd. + + + 8430CE + Shenzhen Jaguar Microsystems Co., Ltd + + + 70D8C2 + Intel Corporate + + + 445925 + Square Inc. + + + E021FE + Richer Link Technologies CO.,LTD + + + C8A362 + ASIX Electronics Corporation + + + 34D856 + Shenzhen Skyworth Digital Technology CO., Ltd + + + 1844CF + B+L Industrial Measurements GmbH + + + CC5763 + Panasonic Automotive Systems Co.,Ltd + + + 882F64 + BCOM Networks Limited + + + BC87FA + Bose Corporation + + + B81EA4 + Liteon Technology Corporation + + + 684724 + EM Microelectronic + + + AC3B96 + NXP Semiconductor (Tianjin) LTD. + + + 0C6714 + SERNET (SUZHOU) TECHNOLOGIES CORPORATION + + + 90F891 + Kaon Group Co., Ltd. + + + C8A608 + Ruckus Wireless + + + 9877E7 + Kaon Group Co., Ltd. + + + 840112 + Kaon Group Co., Ltd. + + + 1834AF + Kaon Group Co., Ltd. + + + 3447D4 + Chengdu Quanjing Intelligent Technology Co.,Ltd + + + 64FB01 + Zhongshan Camry Electronic Company Limited + + + 38F6CF + zte corporation + + + 782AF8 + IETHCOM INFORMATION TECHNOLOGY CO., LTD. + + + 7449D2 + New H3C Technologies Co., Ltd + + + DCD26A + Hangzhou Hikvision Digital Technology Co.,Ltd. + + + ACD8A7 + BELLDESIGN Inc. + + + 0C8772 + FUJIAN STAR-NET COMMUNICATION CO.,LTD + + + DC8D91 + Infinix mobility limited + + + 409A30 + TECNO MOBILE LIMITED + + + 90F421 + IEEE Registration Authority + + + 242361 + vivo Mobile Communication Co., Ltd. + + + D42787 + Shanghai High-Flying Electronics Technology Co., Ltd + + + 34D4E3 + Atom Power, Inc. + + + 906D62 + Cambium Networks Limited + + + 30B29F + EVIDENT CORPORATION + + + 24DCC3 + Espressif Inc. + + + F824DB + EntryPoint Networks, Inc + + + B44D43 + IEEE Registration Authority + + + F8C4AE + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + C4A816 + eero inc. + + + 34F043 + Samsung Electronics Co.,Ltd + + + 4C66A6 + Samsung Electronics Co.,Ltd + + + 4845CF + LLC Proizvodstvennaya Kompania TransService + + + 8C02CD + FUJIAN STAR-NET COMMUNICATION CO.,LTD + + + 54F8F0 + Tesla Inc + + + 74546B + hangzhou zhiyi communication co., ltd + + + D8D45D + Orbic North America + + + 0C298F + Tesla,Inc. + + + 141844 + Xenon Smart Teknoloji Ltd. + + + A06636 + Intracom SA Telecom Solutions + + + 5843AB + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + 58569F + Cisco Systems, Inc + + + A82AD6 + Arthrex Inc. + + + E48EBB + Rockwell Automation + + + 50E538 + Hangzhou Hikvision Digital Technology Co.,Ltd. + + + F4AAD0 + OHSUNG + + + FC48C9 + Yobiiq Intelligence B.V. + + + 641C10 + Texas Instruments + + + 24BF74 + Hamamatsu Photonics K.K. + + + 0833ED + ASKEY COMPUTER CORP + + + C01754 + Apple, Inc. + + + BC3340 + Cisco Meraki + + + 001227 + Franklin Electric Co., Inc. + + + AC1A3D + Dell Inc. + + + F49DA7 + Private + + + E84C4A + Amazon Technologies Inc. + + + 748F4D + duagon Germany GmbH + + + 00C03A + duagon Germany GmbH + + + 2C64F6 + Wu Qi Technologies,Inc. + + + 88684B + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + C8F225 + EM Microelectronic + + + 78530D + Shenzhen Skyworth Digital Technology CO., Ltd + + + 785F36 + Shenzhen Skyworth Digital Technology CO., Ltd + + + 947FD8 + Shenzhen Skyworth Digital Technology CO., Ltd + + + 20898A + Shenzhen Skyworth Digital Technology CO., Ltd + + + 18AA1E + Shenzhen Skyworth Digital Technology CO., Ltd + + + FC7A58 + Shenzhen Skyworth Digital Technology CO., Ltd + + + E88FC4 + MOBIWIRE MOBILES(NINGBO) CO.,LTD + + + 00A085 + Private + + + FC2CFD + dormakaba Canada Inc. - Keyscan + + + 4C9B63 + LG Innotek + + + 648F3E + Cisco Systems, Inc + + + CCB6C8 + Cisco Systems, Inc + + + 18FB7B + Dell Inc. + + + 1C4024 + Dell Inc. + + + 141877 + Dell Inc. + + + E0DB55 + Dell Inc. + + + F04DA2 + Dell Inc. + + + 842B2B + Dell Inc. + + + EC2C49 + NakaoLab, The University of Tokyo + + + 246E96 + Dell Inc. + + + 00065B + Dell Inc. + + + B8AC6F + Dell Inc. + + + 00219B + Dell Inc. + + + 002170 + Dell Inc. + + + 001EC9 + Dell Inc. + + + 34E6D7 + Dell Inc. + + + 74E6E2 + Dell Inc. + + + 24B6FD + Dell Inc. + + + 000F1F + Dell Inc. + + + 149ECF + Dell Inc. + + + 484D7E + Dell Inc. + + + 6CD6E3 + Cisco Systems, Inc + + + D4AE52 + Dell Inc. + + + F8B156 + Dell Inc. + + + AC3D94 + Arista Networks + + + CC96E5 + Dell Inc. + + + 3C46A1 + Ruckus Wireless + + + AC128E + Shanghai Baud Data Communication Co.,Ltd. + + + ECED73 + Motorola Mobility LLC, a Lenovo Company + + + 78AC44 + Dell Inc. + + + C03EBA + Dell Inc. + + + 747827 + Dell Inc. + + + B07B25 + Dell Inc. + + + B88584 + Dell Inc. + + + E4B97A + Dell Inc. + + + 684F64 + Dell Inc. + + + D8D090 + Dell Inc. + + + 1C721D + Dell Inc. + + + 0C29EF + Dell Inc. + + + A02919 + Dell Inc. + + + 588A5A + Dell Inc. + + + ECC018 + Cisco Systems, Inc + + + 748FC2 + Cisco Systems, Inc + + + 64E0AB + UNION MAN TECHNOLOGY CO.,LTD + + + 0019F0 + UNION MAN TECHNOLOGY CO.,LTD + + + A01C87 + UNION MAN TECHNOLOGY CO.,LTD + + + 40F4FD + UNION MAN TECHNOLOGY CO.,LTD + + + 1884C1 + Guangzhou Shiyuan Electronic Technology Company Limited + + + D016F0 + IEEE Registration Authority + + + B0449C + Assa Abloy AB - Yale + + + 602A1B + JANCUS + + + 68856A + OuterLink Corporation + + + E41289 + topsystem GmbH + + + 30E1F1 + Intelbras + + + D824EC + Plenom A/S + + + 1012D0 + zte corporation + + + 44A3C7 + zte corporation + + + 001D9C + Rockwell Automation + + + D019D3 + ITEL MOBILE LIMITED + + + CCACFE + Telink Semiconductor (Shanghai) Co., Ltd. + + + 886EDD + Micronet union Technology(Chengdu)Co., Ltd. + + + D8B249 + Huawei Device Co., Ltd. + + + C49D08 + Huawei Device Co., Ltd. + + + 4C5ED3 + Unisyue Technologies Co; LTD. + + + A0FF0C + Hangzhou Hikvision Digital Technology Co.,Ltd. + + + 085411 + Hangzhou Hikvision Digital Technology Co.,Ltd. + + + 743FC2 + Hangzhou Hikvision Digital Technology Co.,Ltd. + + + A4D5C2 + Hangzhou Hikvision Digital Technology Co.,Ltd. + + + F40046 + ON Semiconductor + + + 80433F + Juniper Networks + + + C42F90 + Hangzhou Hikvision Digital Technology Co.,Ltd. + + + 54C415 + Hangzhou Hikvision Digital Technology Co.,Ltd. + + + B4A382 + Hangzhou Hikvision Digital Technology Co.,Ltd. + + + 686DBC + Hangzhou Hikvision Digital Technology Co.,Ltd. + + + 08A189 + Hangzhou Hikvision Digital Technology Co.,Ltd. + + + 44A642 + Hangzhou Hikvision Digital Technology Co.,Ltd. + + + 5C4DBF + zte corporation + + + 984744 + Shenzhen Boomtech Industrial Corporation + + + 4838B6 + Auhui Taoyun Technology Co., Ltd + + + AC89D2 + Ciena Corporation + + + E05694 + Yunhight Microelectronics + + + 242730 + GD Midea Air-Conditioning Equipment Co.,Ltd. + + + 541159 + Nettrix Information Industry co.LTD + + + BCC427 + HUAWEI TECHNOLOGIES CO.,LTD + + + 000356 + Diebold Nixdorf + + + 00156D + Ubiquiti Inc + + + 002722 + Ubiquiti Inc + + + DC9FDB + Ubiquiti Inc + + + B0CFCB + Amazon Technologies Inc. + + + 18E829 + Ubiquiti Inc + + + 74ACB9 + Ubiquiti Inc + + + F492BF + Ubiquiti Inc + + + 68D79A + Ubiquiti Inc + + + 504594 + Radisys + + + 80711F + Juniper Networks + + + E8A245 + Juniper Networks + + + 840328 + Juniper Networks + + + F4BFA8 + Juniper Networks + + + C8FE6A + Juniper Networks + + + FC9643 + Juniper Networks + + + 0805E2 + Juniper Networks + + + 68F38E + Juniper Networks + + + 8828FB + Juniper Networks + + + E824A6 + Juniper Networks + + + B49882 + Brusa HyPower AG + + + 88E0F3 + Juniper Networks + + + F8C001 + Juniper Networks + + + A8D0E5 + Juniper Networks + + + 54E032 + Juniper Networks + + + 3C8AB0 + Juniper Networks + + + 3C6104 + Juniper Networks + + + 88E64B + Juniper Networks + + + D0DD49 + Juniper Networks + + + 1C9C8C + Juniper Networks + + + 9C8ACB + Juniper Networks + + + 1039E9 + Juniper Networks + + + 2C6BF5 + Juniper Networks + + + B0C69A + Juniper Networks + + + EC13DB + Juniper Networks + + + F4CC55 + Juniper Networks + + + EC94D5 + Juniper Networks + + + A4E11A + Juniper Networks + + + 24FC4E + Juniper Networks + + + A4515E + Juniper Networks + + + F4B52F + Juniper Networks + + + 0014F6 + Juniper Networks + + + 28A24B + Juniper Networks + + + 001DB5 + Juniper Networks + + + 7C273C + Shenzhen Yunlink Technology Co., Ltd + + + 1C2AB0 + Beijing Xiaomi Electronics Co.,Ltd + + + 9817F1 + zte corporation + + + 4CC844 + Maipu Communication Technology Co.,Ltd. + + + 0C9505 + The Chamberlain Group, Inc + + + 08E6C9 + Business-intelligence of Oriental Nations Corporation Ltd. + + + 98C854 + Chiun Mai Communication System, Inc + + + 7017D7 + Shanghai Enflame Technology Co., Ltd. + + + 247823 + Panasonic Entertainment & Communication Co., Ltd. + + + 844693 + Beijing Xiaomi Mobile Software Co., Ltd + + + 44DF65 + Beijing Xiaomi Mobile Software Co., Ltd + + + 002BF5 + BUFFALO.INC + + + 5C1648 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + 202141 + Universal Electronics BV + + + 28D0CB + Adtran Inc + + + AC51EE + Adtran Inc + + + C4FC22 + YEALINK(XIAMEN) NETWORK TECHNOLOGY CO.,LTD. + + + 082802 + SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD + + + CC4210 + Xiaomi Communications Co Ltd + + + A06032 + Amcrest Technologies + + + F0D31F + Apple, Inc. + + + B4AEC1 + Apple, Inc. + + + 5432C7 + Apple, Inc. + + + 58E488 + Amazon Technologies Inc. + + + D853BC + Lenovo Information Products (Shenzhen)Co.,Ltd + + + 98F9CC + Zhejiang Dahua Technology Co., Ltd. + + + 3868A4 + Samsung Electronics Co.,Ltd + + + AC1E92 + Samsung Electronics Co.,Ltd + + + 80ACC8 + Phyplus Microelectronics Limited + + + A416C0 + Apple, Inc. + + + DC45B8 + Apple, Inc. + + + 90ECEA + Apple, Inc. + + + 10B588 + Apple, Inc. + + + BCAD90 + Kymeta Purchasing + + + 3C998C + Houwa System Design Corp. + + + 5C7545 + Wayties, Inc. + + + 380FAD + HUAWEI TECHNOLOGIES CO.,LTD + + + B4E54C + LLC Elektra + + + DCC2C9 + CANON INC. + + + 4829D6 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + E462C4 + Cisco Systems, Inc + + + 20DE1E + Nokia + + + 607771 + Texas Instruments + + + ACB181 + Belden Mooresville + + + ACE403 + Shenzhen Visteng Technology CO.,LTD + + + A88055 + Tuya Smart Inc. + + + 508BB9 + Tuya Smart Inc. + + + 6CACC2 + Samsung Electronics Co.,Ltd + + + BCF730 + Samsung Electronics Co.,Ltd + + + C4DB04 + HUAWEI TECHNOLOGIES CO.,LTD + + + 947D77 + HUAWEI TECHNOLOGIES CO.,LTD + + + 9409C9 + ALPSALPINE CO,.LTD + + + 60D039 + Apple, Inc. + + + C4C17D + Apple, Inc. + + + 44EE14 + Texas Instruments + + + B4AC9D + Texas Instruments + + + F83451 + Comcast-SRL + + + 686372 + Huawei Device Co., Ltd. + + + A0C20D + Huawei Device Co., Ltd. + + + 4C889E + Huawei Device Co., Ltd. + + + 3C3174 + Google, Inc. + + + BC9307 + Samsung Electronics Co.,Ltd + + + 503CCA + TECNO MOBILE LIMITED + + + 9C0C35 + Shenzhenshi Xinzhongxin Technology Co.Ltd + + + A43F51 + Shenzhen Benew Technology Co.,Ltd. + + + 8CCDFE + AMPAK Technology,Inc. + + + DCFBB8 + Meizhou Guo Wei Electronics Co., Ltd + + + 001B8F + Cisco Systems, Inc + + + D04F58 + Ruckus Wireless + + + 6C2316 + TATUNG Technology Inc., + + + C8EDFC + Shenzhen Ideaform Industrial Product Design Co., Ltd + + + F82229 + Nokia Shanghai Bell Co., Ltd. + + + 98ACEF + Realme Chongqing Mobile Telecommunications Corp.,Ltd. + + + E0BDA0 + Apple, Inc. + + + 5873D8 + Apple, Inc. + + + F4E8C7 + Apple, Inc. + + + 148509 + Apple, Inc. + + + 443D54 + Amazon Technologies Inc. + + + A0A763 + Polytron Vertrieb GmbH + + + 24D79C + Cisco Systems, Inc + + + 24724A + Nile Global Inc + + + 00841E + Cisco Meraki + + + 546503 + Quectel Wireless Solutions Co.,Ltd. + + + F85B9B + iMercury + + + 000941 + Allied Telesis K.K. + + + E8473A + Hon Hai Precision Industry Co.,LTD + + + D80E29 + vivo Mobile Communication Co., Ltd. + + + 10BF67 + Amazon Technologies Inc. + + + FCD5D9 + Shenzhen SDMC Technology CO.,Ltd. + + + 80FBF0 + Quectel Wireless Solutions Co.,Ltd. + + + 90BDE6 + Quectel Wireless Solutions Co.,Ltd. + + + 500B26 + HUAWEI TECHNOLOGIES CO.,LTD + + + 504172 + HUAWEI TECHNOLOGIES CO.,LTD + + + 90A6BF + Quectel Wireless Solutions Co.,Ltd. + + + 389592 + Tendyron Corporation + + + F0C745 + TECNO MOBILE LIMITED + + + B46DC2 + SHENZHEN BILIAN ELECTRONIC CO.,LTD + + + 3CFA06 + Microsoft Corporation + + + 443262 + zte corporation + + + F0F69C + NIO Co., Ltd. + + + 98CCD9 + Shenzhen SuperElectron Technology Co.,Ltd. + + + 64D315 + HMD Global Oy + + + 606D9D + Otto Bock Healthcare Products GmbH + + + B06BB3 + GRT + + + 4C82A9 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. + + + 0CAF31 + Cisco Systems, Inc + + + 647C34 + Ubee Interactive Co., Limited + + + 6C38A1 + Ubee Interactive Co., Limited + + + ACCF7B + INGRAM MICRO SERVICES + + + AC3EB1 + Google, Inc. + + + CCB7C4 + HUAWEI TECHNOLOGIES CO.,LTD + + + 5014C1 + HUAWEI TECHNOLOGIES CO.,LTD + + + 60A2C6 + HUAWEI TECHNOLOGIES CO.,LTD + + + A4E8A3 + Fujian Newland Auto-ID Tech Co.,Ltd. + + + B8165F + LG Innotek + + + 1C6349 + Texas Instruments + + + E4521E + Texas Instruments + + + 182C65 + Texas Instruments + + + 18FAB7 + Apple, Inc. + + + 7022FE + Apple, Inc. + + + 881E5A + Apple, Inc. + + + 00C585 + Apple, Inc. + + + A87CF8 + Apple, Inc. + + + 60567D + AM Telecom co., Ltd. + + + D4F0C9 + KYOCERA Document Solutions Inc. + + + 24B7DA + Fiberhome Telecommunication Technologies Co.,LTD + + + 0846C7 + Fiberhome Telecommunication Technologies Co.,LTD + + + 78D840 + Xiaomi Communications Co Ltd + + + C8965A + SKY UK LIMITED + + + C8DE41 + SKY UK LIMITED + + + 38CA84 + HP Inc. + + + B8AB62 + Hui Zhou Gaoshengda Technology Co.,LTD + + + 84E657 + Sony Interactive Entertainment Inc. + + + 205E97 + Nokia + + + 048680 + Quectel Wireless Solutions Co.,Ltd. + + + FC22F4 + Zyxel Communications Corporation + + + F0EDB8 + SERVERCOM (INDIA) PRIVATE LIMITED + + + F87999 + Guangdong Jiuzhi Technology Co.,Ltd + + + CC2AAC + Yunjing lntelligent Technology(Dongguan).,Ltd + + + 20406A + AMPAK Technology,Inc. + + + 84DBA4 + Huawei Device Co., Ltd. + + + 245CC5 + Huawei Device Co., Ltd. + + + F463FC + vivo Mobile Communication Co., Ltd. + + + B83DFB + Bouffalo Lab (Nanjing) Co., Ltd. + + + 5464DE + u-blox AG + + + 38BC61 + Starkoff Co., Ltd. + + + 68E1DC + BUFFALO.INC + + + 5CAC3D + Samsung Electronics Co.,Ltd + + + CCE686 + Samsung Electronics Co.,Ltd + + + 74190A + Samsung Electronics Co.,Ltd + + + C0C4F9 + Qisda Corporation + + + 10A829 + Cisco Systems, Inc + + + E46017 + Intel Corporate + + + 30F6EF + Intel Corporate + + + 586D67 + Intel Corporate + + + 686CE6 + Microsoft Corporation + + + 003126 + Nokia + + + 109826 + Nokia + + + C870D4 + IBO Technology Co,Ltd + + + 5847CA + IEEE Registration Authority + + + 84FB43 + Central Denshi Seigyo + + + 68D40C + TELLESCOM INDUSTRIA E COMERCIO EM TELECOMUNICACAO + + + 24E3DE + China Telecom Fufu Information Technology Co., Ltd. + + + 1816E8 + Siliconware Precision Industries Co., Ltd. + + + CC79D7 + Cisco Systems, Inc + + + E4387E + Cisco Systems, Inc + + + 90AC3F + BrightSign LLC + + + 68F543 + HUAWEI TECHNOLOGIES CO.,LTD + + + 8082F5 + STMicrolectronics International NV + + + F4F19E + Wistron InforComm (Zhongshan) Corporation + + + 104C43 + Fiberhome Telecommunication Technologies Co.,LTD + + + 647CE8 + Palo Alto Networks + + + 282BB9 + Shenzhen Xiongxin Technology Co.,Ltd + + + 301ABA + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + F026F8 + Worldcns Co.,Ltd. + + + 140708 + CP PLUS GMBH & CO. KG + + + F85B6E + Samsung Electronics Co.,Ltd + + + 14D424 + AzureWave Technology Inc. + + + 68275F + zte corporation + + + 4441F0 + zte corporation + + + A47952 + Huawei Device Co., Ltd. + + + B87CD0 + Huawei Device Co., Ltd. + + + D07E01 + Huawei Device Co., Ltd. + + + F87907 + Huawei Device Co., Ltd. + + + 68871C + Motorola Mobility LLC, a Lenovo Company + + + F8A475 + PT Indoreka Jaya Wutama + + + 1449D4 + Xiaomi Communications Co Ltd + + + F87D76 + Apple, Inc. + + + 00A093 + B/E AEROSPACE, Inc. + + + 2C7600 + Apple, Inc. + + + 7042D3 + Ruijie Networks Co.,LTD + + + 18C3F4 + IEEE Registration Authority + + + 34DF20 + Shenzhen Comstar .Technology Co.,Ltd + + + E4A634 + Universal Electronics, Inc. + + + 2C8D37 + Virtium + + + 40FDF3 + AMPAK Technology,Inc. + + + 8C6A3B + Samsung Electronics Co.,Ltd + + + 241153 + Samsung Electronics Co.,Ltd + + + 889CAD + Cisco Systems, Inc + + + D88332 + TaiXin Semiconductor Co., Ltd + + + ECE61D + Huawei Device Co., Ltd. + + + 4C63AD + Huawei Device Co., Ltd. + + + DCDB27 + Huawei Device Co., Ltd. + + + ACB687 + Arcadyan Corporation + + + 506391 + HUAWEI TECHNOLOGIES CO.,LTD + + + E8A34E + HUAWEI TECHNOLOGIES CO.,LTD + + + 041892 + HUAWEI TECHNOLOGIES CO.,LTD + + + 14656A + HUAWEI TECHNOLOGIES CO.,LTD + + + 6CB7E2 + HUAWEI TECHNOLOGIES CO.,LTD + + + C475EA + HUAWEI TECHNOLOGIES CO.,LTD + + + 9025F2 + HUAWEI TECHNOLOGIES CO.,LTD + + + F41AB0 + Shenzhen Xingguodu Technology Co., Ltd. + + + B01F47 + Heights Telecom T ltd + + + 282947 + Chipsea Technologies (Shenzhen) Corp. + + + ACBCB5 + Apple, Inc. + + + 082573 + Apple, Inc. + + + AC007A + Apple, Inc. + + + F01FC7 + Apple, Inc. + + + 88200D + Apple, Inc. + + + BC1541 + Nokia + + + 40E171 + Jiangsu Huitong Group Co.,Ltd. + + + 18C300 + Nokia + + + D44D77 + Nokia + + + E0F318 + Sichuan Tianyi Comheart Telecom Co.,LTD + + + C464F2 + Infinix mobility limited + + + 6C724A + Onkyo Technology K.K. + + + D8FFC3 + Shenzhen 3SNIC information technology company Limited + + + B88F27 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. + + + 8C255E + VoltServer + + + 58B38F + New H3C Technologies Co., Ltd + + + F46D3F + Intel Corporate + + + DC0539 + Cisco Systems, Inc + + + 3886F7 + Google, Inc. + + + F4227A + Guangdong Seneasy Intelligent Technology Co., Ltd. + + + DC8DB7 + ATW TECHNOLOGY, INC. + + + 543D92 + WIRELESS-TEK TECHNOLOGY LIMITED + + + 9826AD + Quectel Wireless Solutions Co.,Ltd. + + + 640E6A + SECO-LARM USA Inc + + + 8C5109 + IEEE Registration Authority + + + 68E154 + SiMa.ai + + + 6C60D0 + Huawei Device Co., Ltd. + + + E8EF05 + MIND TECH INTERNATIONAL LIMITED + + + A475B9 + Samsung Electronics Co.,Ltd + + + 80549C + Samsung Electronics Co.,Ltd + + + 1CF8D0 + Samsung Electronics Co.,Ltd + + + F08756 + Zyxel Communications Corporation + + + 94D331 + Xiaomi Communications Co Ltd + + + D4430E + Zhejiang Dahua Technology Co., Ltd. + + + F85E0B + Realme Chongqing Mobile Telecommunications Corp.,Ltd. + + + 90F970 + HUAWEI TECHNOLOGIES CO.,LTD + + + 04CAED + HUAWEI TECHNOLOGIES CO.,LTD + + + 68EE88 + Shenzhen TINNO Mobile Technology Corp. + + + 2C3B70 + AzureWave Technology Inc. + + + 5C8C30 + Taicang T&W Electronics + + + 34DD04 + Minut AB + + + 601E98 + Axevast Technology + + + A8F7D9 + Mist Systems, Inc. + + + 448816 + Cisco Systems, Inc + + + E8AC23 + HUAWEI TECHNOLOGIES CO.,LTD + + + 68D927 + HUAWEI TECHNOLOGIES CO.,LTD + + + 2C9D65 + vivo Mobile Communication Co., Ltd. + + + 4C9D22 + ACES Co.,Ltd + + + 88C9E8 + Sony Corporation + + + B8F0B9 + zte corporation + + + 805B65 + LG Innotek + + + A0C98B + Nokia Solutions and Networks GmbH & Co. KG + + + 18BB1C + Huawei Device Co., Ltd. + + + 70A983 + Cisco Systems, Inc + + + BCFAEB + Cisco Systems, Inc + + + 848553 + Biznes Systema Telecom, LLC + + + B47D76 + KNS Group LLC + + + C0AD97 + TECNO MOBILE LIMITED + + + 580032 + Genexis B.V. + + + BCC7DA + Earda Technologies co Ltd + + + 1866F0 + Jupiter Systems + + + 74604C + RODE + + + B038E2 + Wanan Hongsheng Electronic Co.Ltd + + + 4C5369 + YanFeng Visteon(ChongQing) Automotive Electronic Co.,Ltd + + + E048D8 + Guangzhi Wulian Technology(Guangzhou) Co., Ltd + + + F8E4A4 + Fiberhome Telecommunication Technologies Co.,LTD + + + 286F40 + Tonly Technology Co. Ltd + + + 0C86C7 + Jabil Circuit (Guangzhou) Limited + + + D88863 + HUAWEI TECHNOLOGIES CO.,LTD + + + C03E50 + HUAWEI TECHNOLOGIES CO.,LTD + + + 806036 + HUAWEI TECHNOLOGIES CO.,LTD + + + 74767D + shenzhen kexint technology co.,ltd + + + 24CF24 + Beijing Xiaomi Mobile Software Co., Ltd + + + F06C5D + Xiaomi Communications Co Ltd + + + 40B02F + Miele & Cie. KG + + + 0C7BC8 + Cisco Meraki + + + 001401 + Rivertree Networks Corp. + + + 006068 + Dialogic Corporation + + + 1C5974 + IEEE Registration Authority + + + 1C0D7D + Apple, Inc. + + + 14F287 + Apple, Inc. + + + 585595 + Apple, Inc. + + + 14946C + Apple, Inc. + + + 90D473 + vivo Mobile Communication Co., Ltd. + + + 607D09 + Luxshare Precision Industry Co., Ltd + + + B06E72 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. + + + 5CA4F4 + zte corporation + + + 246C60 + Huawei Device Co., Ltd. + + + 88FC5D + Cisco Systems, Inc + + + F4C88A + Intel Corporate + + + 28827C + Bosch Automative products(Suzhou)Co.,Ltd Changzhou Branch + + + 303EA7 + Intel Corporate + + + 50284A + Intel Corporate + + + 08EBF6 + HUAWEI TECHNOLOGIES CO.,LTD + + + B02347 + Shenzhen Giant Microelectronics Company Limited + + + 183C98 + Shenzhen Hengyi Technology Co., LTD + + + D81068 + Murata Manufacturing Co., Ltd. + + + 5C045A + Company NA Stage & Light + + + 58C356 + EM Microelectronic + + + F4E204 + COYOTE SYSTEM + + + F84E58 + Samsung Electronics Co.,Ltd + + + B47064 + Samsung Electronics Co.,Ltd + + + 4C2E5E + Samsung Electronics Co.,Ltd + + + 645DF4 + Samsung Electronics Co.,Ltd + + + DCA956 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + CC827F + Advantech Technology (CHINA) Co., Ltd. + + + 78AF08 + Intel Corporate + + + CCDD58 + Robert Bosch GmbH + + + 787104 + Sichuan Tianyi Comheart Telecom Co.,LTD + + + 0016A3 + INGETEAM + + + 883F0C + system a.v. co., ltd. + + + A0EDFB + Quectel Wireless Solutions Co.,Ltd. + + + 104D15 + Viaanix Inc + + + 50A015 + Shenzhen Yipingfang Network Technology Co., Ltd. + + + 7085C4 + Ruijie Networks Co.,LTD + + + A0092E + zte corporation + + + AC330B + Japan Computer Vision Corp. + + + 3053C1 + CRESYN + + + 5CC563 + HUNAN FN-LINK TECHNOLOGY LIMITED + + + 74DDCB + China Leadshine Technology Co.,Ltd + + + A8B13B + HP Inc. + + + 68B691 + Amazon Technologies Inc. + + + B0AFF7 + Shenzhen Yipingfang Network Technology Co., Ltd. + + + 4827C5 + HUAWEI TECHNOLOGIES CO.,LTD + + + BCD206 + HUAWEI TECHNOLOGIES CO.,LTD + + + 14755B + Intel Corporate + + + C854A4 + Infinix mobility limited + + + 2CF295 + Huawei Device Co., Ltd. + + + 7CDAC3 + Sichuan Tianyi Comheart Telecom Co.,LTD + + + BC6193 + Xiaomi Communications Co Ltd + + + F8E57E + Cisco Systems, Inc + + + 3C5D29 + Zhejiang Tmall Technology Co., Ltd. + + + 68FCCA + Samsung Electronics Co.,Ltd + + + 6CD719 + Fiberhome Telecommunication Technologies Co.,LTD + + + 385B44 + Silicon Laboratories + + + 943469 + Silicon Laboratories + + + E0BB0C + Synertau LLC + + + 80015C + Synaptics, Inc + + + CCEB18 + OOO TSS + + + AC77B9 + Nanjing Yufei Intelligent Control Technology Co.,LTD + + + A85BB7 + Apple, Inc. + + + 3462B4 + Renesas Electronics (Penang) Sdn. Bhd. + + + 8C17B6 + Huawei Device Co., Ltd. + + + B82B68 + Huawei Device Co., Ltd. + + + 0010E6 + APPLIED INTELLIGENT SYSTEMS, INC. + + + 000813 + Diskbank, Inc. + + + 744687 + Kingsignal Technology Co., Ltd. + + + 8C477F + NambooSolution + + + 482E72 + Cisco Systems, Inc + + + 30CBC7 + Cambium Networks Limited + + + 885046 + LEAR + + + 0826AE + IEEE Registration Authority + + + 244CAB + Espressif Inc. + + + E04102 + zte corporation + + + D84008 + HUAWEI TECHNOLOGIES CO.,LTD + + + 6C047A + HUAWEI TECHNOLOGIES CO.,LTD + + + 6C558D + HUAWEI TECHNOLOGIES CO.,LTD + + + A42A95 + D-Link International + + + 78482C + START USA, INC. + + + 7C45D0 + Shenzhen Wewins Wireless Co., ltd + + + 70041D + Espressif Inc. + + + 886F29 + Pocketbook International SA + + + BC2247 + New H3C Technologies Co., Ltd + + + 20AF1B + SteelSeries ApS + + + 000AC2 + Wuhan FiberHome Digital Technology Co.,Ltd. + + + 704CB6 + Shenzhen SuperElectron Technology Co.,Ltd. + + + 7C7716 + Zyxel Communications Corporation + + + 943FBB + JSC RPC Istok named after Shokin + + + 50E7B7 + vivo Mobile Communication Co., Ltd. + + + F4F70C + Avang - neterbit + + + 74EF4B + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + 448C00 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. + + + F0BE25 + Dongguan Cannice Precision Manufacturing Co., Ltd. + + + 149BD7 + MULI MUWAI FURNITURE QIDONG CO., LTD + + + D0E828 + Radiant Industries Incorporated + + + 107636 + Earda Technologies co Ltd + + + F4442C + Shenzhen SuperElectron Technology Co.,Ltd. + + + E0FFF1 + Texas Instruments + + + 40F6BC + Amazon Technologies Inc. + + + ECDA59 + New H3C Technologies Co., Ltd + + + 98B785 + Shenzhen 10Gtek Transceivers Co., Limited + + + 485AEA + Fiberhome Telecommunication Technologies Co.,LTD + + + 848102 + Fiberhome Telecommunication Technologies Co.,LTD + + + 54E005 + Fiberhome Telecommunication Technologies Co.,LTD + + + 3C8B7F + Cisco Systems, Inc + + + C0F87F + Cisco Systems, Inc + + + 5C8E8B + Shenzhen Linghai Electronics Co.,Ltd + + + 10B1DF + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. + + + F4F647 + zte corporation + + + E88175 + zte corporation + + + 1C7125 + Apple, Inc. + + + 34FE77 + Apple, Inc. + + + 6CE5C9 + Apple, Inc. + + + 74B7E6 + Zegna-Daidong Limited + + + 04FF08 + Huawei Device Co., Ltd. + + + 00A45F + Huawei Device Co., Ltd. + + + FCE26C + Apple, Inc. + + + 4C7975 + Apple, Inc. + + + DC9758 + Sichuan AI-Link Technology Co., Ltd. + + + 78F238 + Samsung Electronics Co.,Ltd + + + 64D0D6 + Samsung Electronics Co.,Ltd + + + 78EB46 + HUAWEI TECHNOLOGIES CO.,LTD + + + C416C8 + HUAWEI TECHNOLOGIES CO.,LTD + + + E4DCCC + HUAWEI TECHNOLOGIES CO.,LTD + + + 3CA161 + HUAWEI TECHNOLOGIES CO.,LTD + + + 000931 + Future Internet, Inc. + + + B8F255 + Universal Electronics, Inc. + + + EC656E + The Things Industries B.V. + + + 10AEA5 + Duskrise inc. + + + 94944A + Particle Industries Inc. + + + 5C49FA + Shenzhen Guowei Shidai Communication Equipement Co., Ltd + + + 2CA327 + Oraimo Technology Limited + + + 9075BC + Nokia Shanghai Bell Co., Ltd. + + + 4C53FD + Amazon Technologies Inc. + + + 587DB6 + Northern Data AG + + + 341343 + GE Lighting + + + 185880 + Arcadyan Corporation + + + 3083D2 + Motorola Mobility LLC, a Lenovo Company + + + AC50DE + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. + + + 00DDB6 + New H3C Technologies Co., Ltd + + + B89EA6 + SPBEC-MINING CO.LTD + + + E07E5F + Renesas Electronics (Penang) Sdn. Bhd. + + + 047975 + Honor Device Co., Ltd. + + + 9C0567 + Honor Device Co., Ltd. + + + 1466B7 + Advanced Design Technology Pty Ltd + + + B08B92 + zte corporation + + + 08C8C2 + GN Audio A/S + + + AC8B6A + China Mobile IOT Company Limited + + + 000056 + DR. B. STRUCK + + + 70FD88 + Nanjing Jiahao Technology Co., Ltd. + + + 98192C + Edgecore Networks Corporation + + + 080004 + CROMEMCO INCORPORATED + + + FC777B + Hitron Technologies. Inc + + + 14172A + Fiberhome Telecommunication Technologies Co.,LTD + + + 005FBF + Toshiba Corp. + + + FC0FE7 + Microchip Technology Inc. + + + 50C0F0 + Artek Microelectronics Co.,Ltd. + + + B4AE2B + Microsoft + + + 38A91C + New H3C Technologies Co., Ltd + + + F4700C + IEEE Registration Authority + + + 549F06 + Nokia Shanghai Bell Co., Ltd. + + + 68A878 + GeoWAN Pty Ltd + + + 409B21 + Nokia + + + 4873CB + Tiinlab Corporation + + + 789FAA + Huawei Device Co., Ltd. + + + E8A72F + Microsoft Corporation + + + 94B34F + Ruckus Wireless + + + C85CCC + Beijing Xiaomi Mobile Software Co., Ltd + + + 38384B + vivo Mobile Communication Co., Ltd. + + + 140A29 + Tiinlab Corporation + + + 301A30 + Mako Networks Ltd + + + C48BA3 + Cisco Meraki + + + 24CE33 + Amazon Technologies Inc. + + + 0CDDEF + Nokia Corporation + + + 5C9666 + Sony Interactive Entertainment Inc. + + + 88231F + Fibocom Wireless Inc. + + + A4DE26 + Sumitomo Electric Industries, Ltd + + + 307BC9 + SHENZHEN BILIAN ELECTRONIC CO.,LTD + + + 68E478 + Qingdao Haier Technology Co.,Ltd + + + E09D13 + Samsung Electronics Co.,Ltd + + + A00F37 + Cisco Systems, Inc + + + 4C445B + Intel Corporate + + + C8CA79 + Ciena Corporation + + + BC6EE2 + Intel Corporate + + + 7C726E + Ericsson AB + + + D4EEDE + Sichuan Tianyi Comheart Telecom Co.,LTD + + + C08B05 + HUAWEI TECHNOLOGIES CO.,LTD + + + 046865 + Apple, Inc. + + + DC5392 + Apple, Inc. + + + 1CB3C9 + Apple, Inc. + + + FCAA81 + Apple, Inc. + + + 609316 + Apple, Inc. + + + 646D2F + Apple, Inc. + + + C0F9D2 + arkona technologies GmbH + + + 387A0E + Intel Corporate + + + 042084 + zte corporation + + + B45F84 + zte corporation + + + 00DF1D + Cisco Systems, Inc + + + 787264 + IEEE Registration Authority + + + B01C0C + SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD + + + 68403C + Fiberhome Telecommunication Technologies Co.,LTD + + + 903E7F + Fiberhome Telecommunication Technologies Co.,LTD + + + 14C0A1 + UCloud Technology Co., Ltd. + + + DC0E96 + Palo Alto Networks + + + 940230 + Logitech + + + 701135 + Livesecu co., Ltd + + + 643216 + Weidu Technology (Beijing) Co., Ltd. + + + C06B55 + Motorola Mobility LLC, a Lenovo Company + + + DC84E9 + Shenzhen Qihoo Intelligent Technology Co.,Ltd + + + 080205 + HUAWEI TECHNOLOGIES CO.,LTD + + + 9035EA + Silicon Laboratories + + + FCA84A + Sentinum GmbH + + + 6C3C7C + CANON INC. + + + 304F00 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + 1C5EE6 + SHENZHEN TWOWING TECHNOLOGIES CO.,LTD. + + + 346F24 + AzureWave Technology Inc. + + + 3484E4 + Texas Instruments + + + AC4D16 + Texas Instruments + + + B010A0 + Texas Instruments + + + DC9166 + Huawei Device Co., Ltd. + + + AC80D6 + Hexatronic AB + + + DCE55B + Google, Inc. + + + 4CB9EA + iRobot Corporation + + + B894E7 + Xiaomi Communications Co Ltd + + + 34B98D + Xiaomi Communications Co Ltd + + + C4D7FD + Bouffalo Lab (Nanjing) Co., Ltd. + + + D876AE + HUAWEI TECHNOLOGIES CO.,LTD + + + 0C8408 + HUAWEI TECHNOLOGIES CO.,LTD + + + A09F7A + D-Link Middle East FZCO + + + E86E44 + zte corporation + + + 00E7E3 + zte corporation + + + B06A41 + Google, Inc. + + + D81F12 + Tuya Smart Inc. + + + 204B22 + Sunnovo International Limited + + + C81CFE + Zebra Technologies Inc. + + + F0704F + Samsung Electronics Co.,Ltd + + + AC6C90 + Samsung Electronics Co.,Ltd + + + 90B622 + Samsung Electronics Co.,Ltd + + + 0C02BD + Samsung Electronics Co.,Ltd + + + 2CD1DA + Keysight Technologies, Inc. + + + C4FCEF + SambaNova Systems, Inc. + + + 5C5230 + Apple, Inc. + + + 645A36 + Apple, Inc. + + + 6C71D2 + HUAWEI TECHNOLOGIES CO.,LTD + + + F800A1 + HUAWEI TECHNOLOGIES CO.,LTD + + + B4AC8C + Bern University of Applied Sciences + + + BCCE25 + Nintendo Co.,Ltd + + + 2032C6 + Apple, Inc. + + + FC1D2A + vivo Mobile Communication Co., Ltd. + + + 9C54C2 + New H3C Technologies Co., Ltd + + + 78E9CF + TELLESCOM INDUSTRIA E COMERCIO EM TELECOMUNICACAO + + + 000D67 + Ericsson + + + 80D2E5 + Nintendo Co.,Ltd + + + 04D442 + GUANGDONG GENIUS TECHNOLOGY CO., LTD. + + + 1C05B7 + Chongqing Trantor Technology Co., Ltd. + + + 141973 + Beijing Yunyi Times Technology Co.,Ltd + + + 546F71 + uAvionix Corporation + + + 54EF33 + SHENZHEN BILIAN ELECTRONIC CO.,LTD + + + 4448B9 + MitraStar Technology Corp. + + + 9009D0 + Synology Incorporated + + + A0D05B + Samsung Electronics Co.,Ltd + + + F8CE72 + Wistron Corporation + + + CC9DA2 + Eltex Enterprise Ltd. + + + B437D8 + D-Link (Shanghai) Limited Corp. + + + 000A02 + ANNSO CO., LTD. + + + 9CD57D + Cisco Systems, Inc + + + CCE236 + Hangzhou Yaguan Technology Co. LTD + + + 000FE5 + MERCURY SECURITY CORPORATION + + + 74765B + Quectel Wireless Solutions Co.,Ltd. + + + 204181 + ESYSE GmbH Embedded Systems Engineering + + + 605375 + HUAWEI TECHNOLOGIES CO.,LTD + + + 78DD33 + HUAWEI TECHNOLOGIES CO.,LTD + + + A031DB + HUAWEI TECHNOLOGIES CO.,LTD + + + DCBB96 + Full Solution Telecom + + + 941F3A + Ambiq + + + 7066E1 + dnt Innovation GmbH + + + 48188D + WEIFANG GOERTEK ELECTRONICS CO.,LTD + + + 80FBF1 + Freescale Semiconductor (China) Ltd. + + + 38D57A + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. + + + 08E7E5 + Huawei Device Co., Ltd. + + + 487397 + New H3C Technologies Co., Ltd + + + A0445C + HUAWEI TECHNOLOGIES CO.,LTD + + + 646D4E + HUAWEI TECHNOLOGIES CO.,LTD + + + 085C1B + HUAWEI TECHNOLOGIES CO.,LTD + + + 509A88 + HUAWEI TECHNOLOGIES CO.,LTD + + + B83BCC + Xiaomi Communications Co Ltd + + + D09CAE + vivo Mobile Communication Co., Ltd. + + + 88D199 + Vencer Co., Ltd. + + + 701F0B + WILOGY SRL + + + A01842 + Comtrend Corporation + + + D48660 + Arcadyan Corporation + + + 40406C + Icomera + + + 043926 + China Dragon Technology Limited + + + 70CD0D + Intel Corporate + + + 5C0CE6 + Nintendo Co.,Ltd + + + 1856C3 + Apple, Inc. + + + 6881E0 + HUAWEI TECHNOLOGIES CO.,LTD + + + 4CD629 + HUAWEI TECHNOLOGIES CO.,LTD + + + F0C478 + HUAWEI TECHNOLOGIES CO.,LTD + + + D86D17 + HUAWEI TECHNOLOGIES CO.,LTD + + + 7C1AC0 + HUAWEI TECHNOLOGIES CO.,LTD + + + 8C8172 + Sichuan Tianyi Comheart Telecom Co.,LTD + + + 1C93C4 + Amazon Technologies Inc. + + + 000BA5 + Quasar Cipta Mandiri, PT + + + 44E517 + Intel Corporate + + + AC49DB + Apple, Inc. + + + 44F09E + Apple, Inc. + + + 08FF44 + Apple, Inc. + + + 547787 + Earda Technologies co Ltd + + + 002704 + Accelerated Concepts, Inc + + + D0C24E + Samsung Electronics Co.,Ltd + + + 345B98 + EM Microelectronic + + + B88D12 + Apple, Inc. + + + 080037 + FUJIFILM Business Innovation Corp. + + + 888E7F + ATOP CORPORATION + + + 003059 + Kontron Europe GmbH + + + 88A0BE + HUAWEI TECHNOLOGIES CO.,LTD + + + 949010 + HUAWEI TECHNOLOGIES CO.,LTD + + + 98F083 + HUAWEI TECHNOLOGIES CO.,LTD + + + 8C64A2 + OnePlus Technology (Shenzhen) Co., Ltd + + + D05475 + SAVI Controls + + + 489EBD + HP Inc. + + + 00269C + ITUS JAPAN CO. LTD + + + 28FA19 + Shenzhen Jingxun Software Telecommunication Technology Co.,Ltd + + + BCA37F + Rail-Mil Sp. z o.o. Sp. K. + + + 28DFEB + Intel Corporate + + + 88FCA6 + devolo AG + + + 5009E5 + Drimsys,Inc + + + 203CC0 + Beijing Tosee Technology Co., Ltd. + + + 28FBAE + HUAWEI TECHNOLOGIES CO.,LTD + + + D8A011 + WiZ + + + A47806 + Cisco Systems, Inc + + + B8D56B + Mirka Ltd. + + + CCB5D1 + Beijing Xiaomi Mobile Software Co., Ltd + + + 78D6DC + Motorola (Wuhan) Mobility Technologies Communication Co., Ltd. + + + 0C4314 + Silicon Laboratories + + + F4C02F + BlueBite + + + EC8AC4 + Amazon Technologies Inc. + + + 78B84B + Sichuan Tianyi Comheart Telecom Co.,LTD + + + 508A06 + Tuya Smart Inc. + + + D40868 + Beijing Lanxum Computer Technology CO.,LTD. + + + E8DA00 + Kivo Technology, Inc. + + + 7886B6 + Shenzhen YOUHUA Technology Co., Ltd + + + C48025 + Huawei Device Co., Ltd. + + + B8145C + Huawei Device Co., Ltd. + + + C89D18 + Huawei Device Co., Ltd. + + + DC0398 + LG Innotek + + + 10381F + Sichuan AI-Link Technology Co., Ltd. + + + 5414F3 + Intel Corporate + + + ECB4E8 + Wistron Mexico SA de CV + + + 30A612 + ShenZhen Hugsun Technology Co.,Ltd. + + + 18BB41 + Huawei Device Co., Ltd. + + + 7818A8 + Huawei Device Co., Ltd. + + + 807264 + Huawei Device Co., Ltd. + + + E8F654 + HUAWEI TECHNOLOGIES CO.,LTD + + + 2087EC + HUAWEI TECHNOLOGIES CO.,LTD + + + D44165 + Sichuan Tianyi Comheart Telecom Co.,LTD + + + 7CCC1F + Sichuan Tianyi Comheart Telecom Co.,LTD + + + FC372B + Sichuan Tianyi Comheart Telecom Co.,LTD + + + 248BE0 + Sichuan Tianyi Comheart Telecom Co.,LTD + + + 5C4A1F + Sichuan Tianyi Comheart Telecom Co.,LTD + + + 54E061 + Sichuan Tianyi Comheart Telecom Co.,LTD + + + 5CC8E3 + Shintec Hozumi co.ltd. + + + 086AC5 + Intel Corporate + + + 8C367A + Palo Alto Networks + + + 6CFE54 + Intel Corporate + + + 3C195E + Samsung Electronics Co.,Ltd + + + 1CFF59 + Sichuan Tianyi Comheart Telecom Co.,LTD + + + C01B23 + Sichuan Tianyi Comheart Telecom Co.,LTD + + + 187532 + Sichuan Tianyi Comheart Telecom Co.,LTD + + + 9C9C40 + Sichuan Tianyi Comheart Telecom Co.,LTD + + + 4C3B6C + GARO AB + + + 68DDD9 + HMD Global Oy + + + 6C9466 + Intel Corporate + + + 54F6E2 + HUAWEI TECHNOLOGIES CO.,LTD + + + A85081 + HUAWEI TECHNOLOGIES CO.,LTD + + + 3C7AC4 + Chemtronics + + + 0015E5 + Cheertek Inc. + + + 8C83FC + Axioma Metering UAB + + + 001FC8 + Up-Today Industrial Co., Ltd. + + + 38AFD0 + Nevro + + + FC97A8 + Cricut Inc. + + + A0D7A0 + Huawei Device Co., Ltd. + + + E0DA90 + HUAWEI TECHNOLOGIES CO.,LTD + + + A4A46B + HUAWEI TECHNOLOGIES CO.,LTD + + + C04754 + vivo Mobile Communication Co., Ltd. + + + 8CD9D6 + Xiaomi Communications Co Ltd + + + 00A00E + NETSCOUT SYSTEMS INC + + + A45802 + SHIN-IL TECH + + + 38F3FB + Asperiq + + + 50AE86 + Linkintec Co., Ltd + + + 601592 + IEEE Registration Authority + + + 143B42 + Realfit(Shenzhen) Intelligent Technology Co., Ltd + + + A4DAD4 + Yamato Denki Co.,Ltd. + + + F4B1C2 + Zhejiang Dahua Technology Co., Ltd. + + + BCFAB8 + Guangzhou Shiyuan Electronic Technology Company Limited + + + A04A5E + Microsoft Corporation + + + 60C5E6 + Skullcandy + + + 109497 + Logitech Hong Kong + + + F02F4B + Apple, Inc. + + + 40E64B + Apple, Inc. + + + EC2E98 + AzureWave Technology Inc. + + + D47798 + Cisco Systems, Inc + + + 10C9CA + Ace Technology Corp. + + + B4FA48 + Apple, Inc. + + + 38B3F7 + Huawei Device Co., Ltd. + + + 84E986 + Huawei Device Co., Ltd. + + + AC1F0F + Texas Instruments + + + 74D285 + Texas Instruments + + + 8044FD + China Mobile (Hangzhou) Information Technology Co., Ltd. + + + F46AD7 + Microsoft Corporation + + + 481F2D + Shenzhen Jie Shi Lian Industrial Co.,LTD + + + A8E81E + ATW TECHNOLOGY, INC. + + + 1409B4 + zte corporation + + + 101081 + zte corporation + + + F81A2B + Google, Inc. + + + 8C73A0 + Fiberhome Telecommunication Technologies Co.,LTD + + + F4A80D + Wistron InfoComm(Kunshan)Co.,Ltd. + + + 3CA8ED + smart light technology + + + F885F9 + Calix Inc. + + + 78CFF9 + Huawei Device Co., Ltd. + + + 1C87E3 + TECNO MOBILE LIMITED + + + 20B730 + TeconGroup, Inc + + + 509707 + Xiamen Paperang Technology Co.,Ltd. + + + 3CE36B + Zhejiang Dahua Technology Co., Ltd. + + + 488899 + Shenzhen SuperElectron Technology Co.,Ltd. + + + DCB131 + SHENZHEN HUARUIAN TECHNOLOGY CO.,LTD + + + F0625A + Realme Chongqing Mobile Telecommunications Corp.,Ltd. + + + 843B10 + LVSWITCHES INC. + + + 94A4F9 + HUAWEI TECHNOLOGIES CO.,LTD + + + 6C3491 + HUAWEI TECHNOLOGIES CO.,LTD + + + E84D74 + HUAWEI TECHNOLOGIES CO.,LTD + + + CC895E + HUAWEI TECHNOLOGIES CO.,LTD + + + EC63D7 + Intel Corporate + + + 7C9F07 + CIG SHANGHAI CO LTD + + + 203B69 + vivo Mobile Communication Co., Ltd. + + + 5C1720 + Huawei Device Co., Ltd. + + + 605E4F + Huawei Device Co., Ltd. + + + 1CE6AD + Huawei Device Co., Ltd. + + + 14857F + Intel Corporate + + + 94E23C + Intel Corporate + + + 5856C2 + HUAWEI TECHNOLOGIES CO.,LTD + + + A03679 + HUAWEI TECHNOLOGIES CO.,LTD + + + B8D6F6 + HUAWEI TECHNOLOGIES CO.,LTD + + + 2C52AF + HUAWEI TECHNOLOGIES CO.,LTD + + + 48684A + Intel Corporate + + + 58FB96 + Ruckus Wireless + + + 285B0C + Sichuan Jiuzhou Electronic Technology Co., Ltd. + + + 1489CB + HUAWEI TECHNOLOGIES CO.,LTD + + + 6C2636 + HUAWEI TECHNOLOGIES CO.,LTD + + + 40DE17 + Shenzhen Lanfeng Times Industrial Co.,Ltd. + + + AC2316 + Mist Systems, Inc. + + + 002470 + AUROTECH ultrasound AS. + + + BCF171 + Intel Corporate + + + 84716A + Huawei Device Co., Ltd. + + + 488C63 + Huawei Device Co., Ltd. + + + 70DDEF + Huawei Device Co., Ltd. + + + 54A6DB + Huawei Device Co., Ltd. + + + 149877 + Apple, Inc. + + + 88665A + Apple, Inc. + + + B0E5F9 + Apple, Inc. + + + B88DF1 + Nanjing BigFish Semiconductor Co., Ltd. + + + 6C4A74 + AERODISK LLC + + + 14EB08 + HUAWEI TECHNOLOGIES CO.,LTD + + + B01656 + HUAWEI TECHNOLOGIES CO.,LTD + + + 78D4F1 + IEEE Registration Authority + + + DC9020 + RURU TEK PRIVATE LIMITED + + + A842A7 + Jiangsu Huitong Group Co.,Ltd. + + + 2CD26B + FN-LINK TECHNOLOGY LIMITED + + + A062FB + HISENSE VISUAL TECHNOLOGY CO.,LTD + + + 9C6865 + Fiberhome Telecommunication Technologies Co.,LTD + + + 383D5B + Fiberhome Telecommunication Technologies Co.,LTD + + + 24EDFD + Siemens Canada Limited + + + 540764 + Huawei Device Co., Ltd. + + + DCD7A0 + Huawei Device Co., Ltd. + + + F01628 + Technicolor (China) Technology Co., Ltd. + + + F88F07 + Samsung Electronics Co.,Ltd + + + 8CEA48 + Samsung Electronics Co.,Ltd + + + 503DC6 + Xiaomi Communications Co Ltd + + + B0BD1B + Dongguan Liesheng Electronic Co., Ltd. + + + D4ECAB + vivo Mobile Communication Co., Ltd. + + + BC3ECB + vivo Mobile Communication Co., Ltd. + + + 08798C + HUAWEI TECHNOLOGIES CO.,LTD + + + 5C9AA1 + Huawei Device Co., Ltd. + + + BCF45F + zte corporation + + + 548ABA + Cisco Systems, Inc + + + 64A198 + Huawei Device Co., Ltd. + + + 1418C3 + Intel Corporate + + + 54DBA2 + Fibrain + + + 44AE25 + Cisco Systems, Inc + + + BCE712 + Cisco Systems, Inc + + + CCCC81 + HUAWEI TECHNOLOGIES CO.,LTD + + + 4089A8 + WiredIQ, LLC + + + 3C2093 + GD Midea Air-Conditioning Equipment Co.,Ltd. + + + E02967 + HMD Global Oy + + + 988B69 + Shenzhen hylitech Co.,LTD + + + 18146C + Zhejiang Tmall Technology Co., Ltd. + + + 688975 + nuoxc + + + A899DC + i-TOP DESING TECHNOLOGY CO.,LTD + + + 001D1E + KYUSHU TEN CO.,LTD + + + 1CD1BA + Fiberhome Telecommunication Technologies Co.,LTD + + + 804B50 + Silicon Laboratories + + + C0E3FB + HUAWEI TECHNOLOGIES CO.,LTD + + + 30E283 + Texas Instruments + + + 34AFB3 + Amazon Technologies Inc. + + + 683F7D + INGRAM MICRO SERVICES + + + 945F34 + Renesas Electronics (Penang) Sdn. Bhd. + + + 603CEE + LG Electronics (Mobile Communications) + + + 2C4A11 + Ciena Corporation + + + 20AC9C + China Telecom Corporation Limited + + + 28AD18 + Hui Zhou Gaoshengda Technology Co.,LTD + + + 0C354F + Nokia + + + C4CB54 + Fibocom Auto Inc. + + + 3024A9 + HP Inc. + + + 9409D3 + shenzhen maxtopic technology co.,ltd + + + F8A73A + Cisco Systems, Inc + + + B8114B + Cisco Systems, Inc + + + 1C4C48 + ITEL MOBILE LIMITED + + + 2C0786 + Huawei Device Co., Ltd. + + + A86E4E + Huawei Device Co., Ltd. + + + 102D31 + Shenzhen Americas Trading Company LLC + + + C40B31 + Apple, Inc. + + + 8C7A15 + Ruckus Wireless + + + 6420E0 + T3 Technology Co., Ltd. + + + 8411C2 + IEEE Registration Authority + + + 90DE80 + Shenzhen Century Xinyang Technology Co., Ltd + + + 109693 + Amazon Technologies Inc. + + + E4F1D4 + vivo Mobile Communication Co., Ltd. + + + 5CC0A0 + HUAWEI TECHNOLOGIES CO.,LTD + + + 04F352 + HUAWEI TECHNOLOGIES CO.,LTD + + + 488B0A + Cisco Systems, Inc + + + 185BB3 + Samsung Electronics Co.,Ltd + + + 9C5FB0 + Samsung Electronics Co.,Ltd + + + E87F6B + Samsung Electronics Co.,Ltd + + + ECA1D1 + HUAWEI TECHNOLOGIES CO.,LTD + + + A46DA4 + HUAWEI TECHNOLOGIES CO.,LTD + + + 24A487 + Huawei Device Co., Ltd. + + + C45A86 + Huawei Device Co., Ltd. + + + FCB69D + Zhejiang Dahua Technology Co., Ltd. + + + 94F2BB + Valeo Vision Systems + + + B0ECDD + HUAWEI TECHNOLOGIES CO.,LTD + + + 6C1414 + BUJEON ELECTRONICS Co,.Ltd + + + AC6784 + Google, Inc. + + + EC7E91 + ITEL MOBILE LIMITED + + + E0E1A9 + Shenzhen Four Seas Global Link Network Technology Co., Ltd. + + + 7C4E09 + Shenzhen Skyworth Wireless Technology Co.,Ltd + + + 280FC5 + Beijing Leadsec Technology Co., Ltd. + + + 1CEC72 + Allradio Co., Ltd + + + E4DC43 + Huawei Device Co., Ltd. + + + 2430F8 + Huawei Device Co., Ltd. + + + C43CEA + BUFFALO.INC + + + D4910F + Amazon Technologies Inc. + + + 80F5B5 + Texas Instruments + + + 1C3008 + Hui Zhou Gaoshengda Technology Co.,LTD + + + 98063A + Home Control Singapore Pte Ltd + + + 64A200 + Xiaomi Communications Co Ltd + + + 703A2D + Shenzhen V-Link Technology CO., LTD. + + + 1C45C2 + Huizhou City Sunsin lntelligent Technology Co.,Ltd + + + 84CC63 + Huawei Device Co., Ltd. + + + C07831 + Huawei Device Co., Ltd. + + + C4FBAA + HUAWEI TECHNOLOGIES CO.,LTD + + + B0A651 + Cisco Systems, Inc + + + 183672 + Shaoxing ShunChuang Technology CO.,LTD + + + 0017C9 + Samsung Electronics Co.,Ltd + + + 5CF9FD + Taicang T&W Electronics + + + 3898E9 + Huawei Device Co., Ltd. + + + 48A516 + Huawei Device Co., Ltd. + + + ACDCCA + HUAWEI TECHNOLOGIES CO.,LTD + + + B85FB0 + HUAWEI TECHNOLOGIES CO.,LTD + + + B4BA12 + China Mobile (Hangzhou) Information Technology Co.,Ltd. + + + 6C1ED7 + vivo Mobile Communication Co., Ltd. + + + F0AA0B + Arra Networks/ Spectramesh + + + 945641 + Palo Alto Networks + + + ECC302 + HUMAX Co., Ltd. + + + C4DD57 + Espressif Inc. + + + 00C343 + E-T-A Circuit Breakers Ltd + + + A0D0DC + Amazon Technologies Inc. + + + 143FC3 + SnapAV + + + 50C68E + Biwin Semiconductor (HK) Company Limted + + + E475DC + Arcadyan Corporation + + + 58208A + IEEE Registration Authority + + + BCA5A9 + Apple, Inc. + + + 102779 + Sadel S.p.A. + + + 80CA4B + SHENZHEN GONGJIN ELECTRONICS CO.,LTD + + + C41688 + Huawei Device Co., Ltd. + + + 64B0E8 + Huawei Device Co., Ltd. + + + 30A998 + Huawei Device Co., Ltd. + + + 64F54E + EM Microelectronic + + + 04E795 + HUAWEI TECHNOLOGIES CO.,LTD + + + 20E2A8 + Apple, Inc. + + + A0FBC5 + Apple, Inc. + + + 007D60 + Apple, Inc. + + + 001C45 + Chenbro Micom Co., Ltd. + + + C0619A + IEEE Registration Authority + + + 28C21F + SAMSUNG ELECTRO-MECHANICS(THAILAND) + + + 8C7086 + Gesellschaft für Sonder-EDV-Anlagen mbH + + + 400634 + Huawei Device Co., Ltd. + + + C42B44 + Huawei Device Co., Ltd. + + + F8A26D + CANON INC. + + + 689E0B + Cisco Systems, Inc + + + 004238 + Intel Corporate + + + 74F9CA + Nintendo Co.,Ltd + + + 7061EE + Sunwoda Electronic Co.,Ltd + + + 0019DC + ENENSYS Technologies + + + B07D64 + Intel Corporate + + + 48902F + LG Electronics (Mobile Communications) + + + 4C2219 + YUANFUDAO HK LIMTED + + + E4246C + Zhejiang Dahua Technology Co., Ltd. + + + E8EB1B + Microchip Technology Inc. + + + 38BAB0 + Broadcom + + + B0A460 + Intel Corporate + + + 000083 + TADPOLE TECHNOLOGY PLC + + + 28B77C + IEEE Registration Authority + + + 00146A + Cisco Systems, Inc + + + 68D6ED + GooWi Wireless Technology Co., Limited + + + 840283 + HUMAX Co., Ltd. + + + 941700 + Xiaomi Communications Co Ltd + + + D8EF42 + Huawei Device Co., Ltd. + + + 80CC12 + Huawei Device Co., Ltd. + + + 18AA0F + Huawei Device Co., Ltd. + + + 54D9C6 + Huawei Device Co., Ltd. + + + 308AF7 + Huawei Device Co., Ltd. + + + 64E7D8 + Samsung Electronics Co.,Ltd + + + 00E406 + HUAWEI TECHNOLOGIES CO.,LTD + + + 44227C + HUAWEI TECHNOLOGIES CO.,LTD + + + CCB182 + HUAWEI TECHNOLOGIES CO.,LTD + + + 089BB9 + Nokia Solutions and Networks GmbH & Co. KG + + + D89ED4 + Fiberhome Telecommunication Technologies Co.,LTD + + + 40D25F + ITEL MOBILE LIMITED + + + 54F15F + Sichuan AI-Link Technology Co., Ltd. + + + E079C4 + iRay Technology Company Limited + + + AC9572 + Jovision Technology Co., Ltd. + + + 001636 + Quanta Computer Inc. + + + 884067 + infomark + + + 083869 + Hong Kong AMobile Intelligent Corp. Limited Taiwan Branch + + + 2481C7 + Huawei Device Co., Ltd. + + + FC862A + Huawei Device Co., Ltd. + + + AC9A96 + Maxlinear, Inc + + + 4843DD + Amazon Technologies Inc. + + + 5894A2 + KETEK GmbH + + + 001A57 + Matrix Design Group, LLC + + + 001CFC + Sumitomo Electric Industries, Ltd + + + EC753E + HUAWEI TECHNOLOGIES CO.,LTD + + + DCAEEB + Ruckus Wireless + + + 882949 + Renesas Electronics (Penang) Sdn. Bhd. + + + ECDB86 + API-K + + + 7C2ADB + Xiaomi Communications Co Ltd + + + F864B8 + zte corporation + + + 145120 + Huawei Device Co., Ltd. + + + C0D193 + Huawei Device Co., Ltd. + + + 7804E3 + Huawei Device Co., Ltd. + + + A43B0E + Huawei Device Co., Ltd. + + + 909164 + ChongQing Lavid Technology Co., Ltd. + + + 1C3D2F + HUAWEI TECHNOLOGIES CO.,LTD + + + 001D67 + AMEC + + + 001A62 + Data Robotics, Incorporated + + + C06369 + BINXIN TECHNOLOGY(ZHEJIANG) LTD. + + + 08B0A7 + Truebeyond Co., Ltd + + + 18AB1D + Samsung Electronics Co.,Ltd + + + BCE92F + HP Inc. + + + E092A7 + Feitian Technologies Co., Ltd + + + B0761B + HUAWEI TECHNOLOGIES CO.,LTD + + + 8C0E60 + Nanjing Juplink Intelligent Technologies Co., Ltd. + + + DC91BF + Amazon Technologies Inc. + + + 6CCE44 + 1MORE + + + 944444 + LG Innotek + + + 340A33 + D-Link International + + + 8437D5 + Samsung Electronics Co.,Ltd + + + 3482C5 + Samsung Electronics Co.,Ltd + + + F0D7AF + IEEE Registration Authority + + + 7CA96B + Syrotech Networks. Ltd. + + + 98063C + Samsung Electronics Co.,Ltd + + + 74A7EA + Amazon Technologies Inc. + + + 7C6DF8 + Apple, Inc. + + + 50AD71 + Tessolve Semiconductor Private Limited + + + D84F37 + Proxis, spol. s r.o. + + + 74AB93 + Blink by Amazon + + + E87F95 + Apple, Inc. + + + 781100 + Quantumsolution + + + 88C08B + Apple, Inc. + + + 4C7CD9 + Apple, Inc. + + + 940853 + Liteon Technology Corporation + + + B49E80 + Sichuan Changhong Electric Ltd. + + + A49340 + Beijing Supvan Information Technology Co.,Ltd. + + + F8E877 + Harman/Becker Automotive Systems GmbH + + + A09B12 + China Mobile IOT Company Limited + + + 98F621 + Xiaomi Communications Co Ltd + + + 1413FB + HUAWEI TECHNOLOGIES CO.,LTD + + + D0768F + Calix Inc. + + + C0395A + Zhejiang Dahua Technology Co., Ltd. + + + 2064CB + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + F05501 + Huawei Device Co., Ltd. + + + EC6CB5 + zte corporation + + + C0B101 + zte corporation + + + A45006 + SHENZHEN HUACHUANG SHIDAI TECHNOLOGYCO.,LTD + + + AC3C8E + Flextronics Computing(Suzhou)Co.,Ltd. + + + 406234 + Telink Semiconductor (Shanghai) Co., Ltd. + + + 94FBA7 + IEEE Registration Authority + + + FC3DA5 + Arcadyan Corporation + + + C87125 + Johnson Outdoors Marine Electronics d/b/a Minnkota + + + 80CFA2 + Huawei Device Co., Ltd. + + + 0094EC + Huawei Device Co., Ltd. + + + 74452D + Huawei Device Co., Ltd. + + + 140152 + Samsung Electronics Co.,Ltd + + + DC1BA1 + Intel Corporate + + + BC33AC + Silicon Laboratories + + + 001329 + VSST Co., LTD + + + 7CF2DD + Vence Corp + + + 988E79 + Qudelix, Inc. + + + C80739 + NAKAYO Inc + + + 6C6D09 + Kyowa Electronics Co.,Ltd. + + + 080342 + Palo Alto Networks + + + 2443E2 + DASAN Network Solutions + + + EC237B + zte corporation + + + D49CF4 + Palo Alto Networks + + + CCAB2C + HUMAX Co., Ltd. + + + 540E2D + vivo Mobile Communication Co., Ltd. + + + 708F47 + vivo Mobile Communication Co., Ltd. + + + 90173F + HUAWEI TECHNOLOGIES CO.,LTD + + + 607ECD + HUAWEI TECHNOLOGIES CO.,LTD + + + 001876 + WowWee Ltd. + + + C42456 + Palo Alto Networks + + + 84D412 + Palo Alto Networks + + + B82FCB + CMS Electracom + + + 4CFCAA + Tesla,Inc. + + + 10CE45 + Miromico AG + + + 8C59DC + ASR Microelectronics (Shanghai) Co., Ltd. + + + 18828C + Arcadyan Corporation + + + D452EE + SKY UK LIMITED + + + 6C61F4 + SFR + + + 9CF029 + Integrated Device Technology (Malaysia) Sdn. Bhd. + + + 2856C1 + Harman/Becker Automotive Systems GmbH + + + BC4A56 + Cisco Systems, Inc + + + F8AF05 + Huawei Device Co., Ltd. + + + 94E9EE + Huawei Device Co., Ltd. + + + 64BC58 + Intel Corporate + + + AC1203 + Intel Corporate + + + 28E34E + HUAWEI TECHNOLOGIES CO.,LTD + + + 78B8D6 + Zebra Technologies Inc. + + + F490CB + IEEE Registration Authority + + + 185869 + Sailer Electronic Co., Ltd + + + BC2DEF + Realme Chongqing Mobile Telecommunications Corp.,Ltd. + + + 7881CE + China Mobile Iot Limited company + + + 445CE9 + Samsung Electronics Co.,Ltd + + + BCFF21 + Smart Code(shenzhen)Technology Co.,Ltd + + + 381730 + Ulrich Lippert GmbH & Co KG + + + 98C8B8 + vivo Mobile Communication Co., Ltd. + + + 402E71 + Texas Instruments + + + 1C63BF + SHENZHEN BROADTEL TELECOM CO.,LTD + + + AC3651 + Jiangsu Hengtong Terahertz Technology Co., Ltd. + + + 684A76 + eero inc. + + + 8C683A + HUAWEI TECHNOLOGIES CO.,LTD + + + B46E08 + HUAWEI TECHNOLOGIES CO.,LTD + + + 2864B0 + Huawei Device Co., Ltd. + + + 04F169 + Huawei Device Co., Ltd. + + + 5021EC + Huawei Device Co., Ltd. + + + 0C48C6 + CELESTICA INC. + + + A42985 + Sichuan AI-Link Technology Co., Ltd. + + + B48107 + SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD + + + 706655 + AzureWave Technology Inc. + + + C858C0 + Intel Corporate + + + 4CB16C + HUAWEI TECHNOLOGIES CO.,LTD + + + BC0963 + Apple, Inc. + + + D84C90 + Apple, Inc. + + + 24D0DF + Apple, Inc. + + + 6C4A85 + Apple, Inc. + + + 28F033 + Apple, Inc. + + + 005E0C + HMD Global Oy + + + 688FC9 + Zhuolian (Shenzhen) Communication Co., Ltd + + + A043B0 + Hangzhou BroadLink Technology Co.,Ltd + + + D8C561 + CommFront Communications Pte Ltd + + + 60D89C + HMD Global Oy + + + F41C95 + BEIJING YUNYI TIMES TECHNOLOGY CO,.LTD + + + 9C9789 + 1MORE + + + F82E8E + Nanjing Kechen Electric Co., Ltd. + + + B4C9B9 + Sichuan AI-Link Technology Co., Ltd. + + + F0463B + Comcast Cable Corporation + + + C402E1 + Khwahish Technologies Private Limited + + + 4C6C13 + IoT Company Solucoes Tecnologicas Ltda + + + 0009F3 + WELL Communication Corp. + + + C8FA84 + Trusonus corp. + + + 2863BD + APTIV SERVICES US, LLC + + + F85B3B + ASKEY COMPUTER CORP + + + A885D7 + Sangfor Technologies Inc. + + + 786DEB + GE Lighting + + + 9CA513 + Samsung Electronics Co.,Ltd + + + 309048 + Apple, Inc. + + + 444ADB + Apple, Inc. + + + 8C5AC1 + Huawei Device Co., Ltd. + + + A85AE0 + Huawei Device Co., Ltd. + + + A4B61E + Huawei Device Co., Ltd. + + + C4FE5B + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + 84F883 + Luminar Technologies + + + B44C3B + Zhejiang Dahua Technology Co., Ltd. + + + 40A2DB + Amazon Technologies Inc. + + + C03937 + GREE ELECTRIC APPLIANCES, INC. OF ZHUHAI + + + C467D1 + HUAWEI TECHNOLOGIES CO.,LTD + + + 9424B8 + GREE ELECTRIC APPLIANCES, INC. OF ZHUHAI + + + CCF411 + Google, Inc. + + + 9C2DCF + Shishi Tongyun Technology(Chengdu)Co.,Ltd. + + + 0433C2 + Intel Corporate + + + D49AA0 + VNPT TECHNOLOGY + + + C8C465 + HUAWEI TECHNOLOGIES CO.,LTD + + + 1C4363 + HUAWEI TECHNOLOGIES CO.,LTD + + + 94292F + New H3C Technologies Co., Ltd + + + 6CF049 + GIGA-BYTE TECHNOLOGY CO.,LTD. + + + FCAA14 + GIGA-BYTE TECHNOLOGY CO.,LTD. + + + F80FF9 + Google, Inc. + + + 444687 + Realme Chongqing MobileTelecommunications Corp Ltd + + + E0F442 + Huawei Device Co., Ltd. + + + F0C42F + Huawei Device Co., Ltd. + + + C0B47D + Huawei Device Co., Ltd. + + + F4A59D + Huawei Device Co., Ltd. + + + 307ECB + SFR + + + C803F5 + Ruckus Wireless + + + E81B4B + amnimo Inc. + + + A4B439 + Cisco Systems, Inc + + + A0B439 + Cisco Systems, Inc + + + 105FD4 + Tendyron Corporation + + + B4265D + Taicang T&W Electronics + + + 48A5E7 + Nintendo Co.,Ltd + + + B81904 + Nokia Shanghai Bell Co., Ltd. + + + B4A5AC + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + 1C784E + China Mobile Iot Limited company + + + D4B709 + zte corporation + + + 38144E + Fiberhome Telecommunication Technologies Co.,LTD + + + E0CCF8 + Xiaomi Communications Co Ltd + + + AC675D + Intel Corporate + + + 84C5A6 + Intel Corporate + + + 5C80B6 + Intel Corporate + + + F07807 + Apple, Inc. + + + 082CB6 + Apple, Inc. + + + F84E73 + Apple, Inc. + + + 3CCD36 + Apple, Inc. + + + 843E79 + Shenzhen Belon Technology CO.,LTD + + + F8E4E3 + Intel Corporate + + + D8CF89 + Beijing DoSee Science and Technology Co., Ltd. + + + 04AAE1 + BEIJING MICROVISION TECHNOLOGY CO.,LTD + + + 44DC4E + ITEL MOBILE LIMITED + + + B4E8C9 + XADA Technologies + + + 6C24A6 + vivo Mobile Communication Co., Ltd. + + + 9C5F5A + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + A01C8D + HUAWEI TECHNOLOGIES CO.,LTD + + + F4DEAF + HUAWEI TECHNOLOGIES CO.,LTD + + + 60123C + HUAWEI TECHNOLOGIES CO.,LTD + + + C0D2DD + Samsung Electronics Co.,Ltd + + + 942DDC + Samsung Electronics Co.,Ltd + + + 7CB37B + Qingdao Intelligent&Precise Electronics Co.,Ltd. + + + 88123D + Suzhou Aquila Solutions Inc. + + + 48210B + PEGATRON CORPORATION + + + 0068EB + HP Inc. + + + 7C310E + Cisco Systems, Inc + + + 484C86 + Huawei Device Co., Ltd. + + + 54F294 + Huawei Device Co., Ltd. + + + 245AB5 + Samsung Electronics Co.,Ltd + + + 382A19 + Technica Engineering GmbH + + + 74D654 + GINT + + + 7C210E + Cisco Systems, Inc + + + F4E5F2 + HUAWEI TECHNOLOGIES CO.,LTD + + + 541310 + HUAWEI TECHNOLOGIES CO.,LTD + + + 8CE5EF + HUAWEI TECHNOLOGIES CO.,LTD + + + F0EF86 + Google, Inc. + + + A0946A + Shenzhen XGTEC Technology Co,.Ltd. + + + 1C2AA3 + Shenzhen HongRui Optical Technology Co., Ltd. + + + 388E7A + AUTOIT + + + 9C31C3 + SKY UK LIMITED + + + E4AAEA + Liteon Technology Corporation + + + 4C710D + Cisco Systems, Inc + + + 4C710C + Cisco Systems, Inc + + + A4CD23 + Shenzhenshi Xinzhongxin Co., Ltd + + + E01F0A + Xslent Energy Technologies. LLC + + + E447B3 + zte corporation + + + E4671E + SHEN ZHEN NUO XIN CHENG TECHNOLOGY co., Ltd. + + + 682719 + Microchip Technology Inc. + + + 24C17A + BEIJING IACTIVE NETWORK CO.,LTD + + + A4C939 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + 34D772 + Xiamen Yudian Automation Technology Co., Ltd + + + 3C86D1 + vivo Mobile Communication Co., Ltd. + + + 301B97 + Lierda Science & Technology Group Co.,Ltd + + + 48794D + Samsung Electronics Co.,Ltd + + + 18F9C4 + BAE Systems + + + 60ABD2 + Bose Corporation + + + C0DCDA + Samsung Electronics Co.,Ltd + + + 04B429 + Samsung Electronics Co.,Ltd + + + 7C8AE1 + COMPAL INFORMATION (KUNSHAN) CO., LTD. + + + 54E4A9 + BHR Tech GmbH + + + 208058 + Ciena Corporation + + + 74DA88 + TP-LINK TECHNOLOGIES CO.,LTD. + + + CC32E5 + TP-LINK TECHNOLOGIES CO.,LTD. + + + 1C3BF3 + TP-LINK TECHNOLOGIES CO.,LTD. + + + 2C00F7 + XOS + + + 2CD2E3 + Guangzhou Aoshi Electronic Co.,Ltd + + + A8C252 + Huawei Device Co., Ltd. + + + A04147 + Huawei Device Co., Ltd. + + + 1459C3 + Creative Chips GmbH + + + 1CCCD6 + Xiaomi Communications Co Ltd + + + A445CD + IoT Diagnostics + + + 7CC926 + Wuhan GreeNet Information Service Co.,Ltd. + + + 68070A + TPVision Europe B.V + + + 4CEBBD + CHONGQING FUGUI ELECTRONICS CO.,LTD. + + + 70879E + Beken Corporation + + + 684AAE + HUAWEI TECHNOLOGIES CO.,LTD + + + 60D755 + HUAWEI TECHNOLOGIES CO.,LTD + + + 1CAECB + HUAWEI TECHNOLOGIES CO.,LTD + + + 4CF19E + Groupe Atlantic + + + 04ED33 + Intel Corporate + + + 2036D7 + Shanghai Reacheng Communication Technology Co.,Ltd + + + 044A6C + HUAWEI TECHNOLOGIES CO.,LTD + + + 38FB14 + HUAWEI TECHNOLOGIES CO.,LTD + + + F0E4A2 + HUAWEI TECHNOLOGIES CO.,LTD + + + B45062 + EmBestor Technology Inc. + + + 5C75AF + Fitbit, Inc. + + + 94D505 + Fiberhome Telecommunication Technologies Co.,LTD + + + 7CB27D + Intel Corporate + + + 582059 + Xiaomi Communications Co Ltd + + + 90272B + Algorab S.r.l. + + + 4CBCB4 + ABB SpA - DIN Rail + + + 1063C8 + Liteon Technology Corporation + + + 7C5189 + SG Wireless Limited + + + 082697 + Zyxel Communications Corporation + + + 7869D4 + Shenyang Vibrotech Instruments Inc. + + + 5CD135 + Xtreme Power Systems + + + 74E1B6 + Apple, Inc. + + + 24A52C + HUAWEI TECHNOLOGIES CO.,LTD + + + 482759 + Levven Electronics Ltd. + + + 64CB9F + TECNO MOBILE LIMITED + + + 4CFBFE + Sercomm Japan Corporation + + + C0CBF1 + Mobiwire Mobiles (NingBo) Co., LTD + + + FC7D6C + HYESUNG TECHWIN Co., Ltd + + + 1CD5E2 + Shenzhen YOUHUA Technology Co., Ltd + + + 0024E9 + Samsung Electronics Co.,Ltd + + + 683B78 + Cisco Systems, Inc + + + F4CE36 + Nordic Semiconductor ASA + + + AC7713 + Honeywell Safety Products (Shanghai) Co.,Ltd + + + 08849D + Amazon Technologies Inc. + + + 2440AE + NIIC Technology Co., Ltd. + + + F40E01 + Apple, Inc. + + + 1495CE + Apple, Inc. + + + 50DE06 + Apple, Inc. + + + CC660A + Apple, Inc. + + + FC1D43 + Apple, Inc. + + + 18A4A9 + Vanu Inc. + + + 80E82C + Hewlett Packard + + + D4ADBD + Cisco Systems, Inc + + + CCCCCC + Silicon Laboratories + + + 5CA1E0 + EmbedWay Technologies + + + 1CB796 + HUAWEI TECHNOLOGIES CO.,LTD + + + 3847BC + HUAWEI TECHNOLOGIES CO.,LTD + + + 549209 + HUAWEI TECHNOLOGIES CO.,LTD + + + 745909 + HUAWEI TECHNOLOGIES CO.,LTD + + + 7C942A + HUAWEI TECHNOLOGIES CO.,LTD + + + E47E9A + zte corporation + + + 2C16BD + IEEE Registration Authority + + + 30A889 + DECIMATOR DESIGN + + + 00F620 + Google, Inc. + + + F43328 + CIMCON Lighting Inc. + + + 5C5AC7 + Cisco Systems, Inc + + + B46077 + Sichuan Changhong Electric Ltd. + + + B4A2EB + IEEE Registration Authority + + + 68AB09 + Nokia + + + 00EDB8 + KYOCERA Corporation + + + C8D69D + Arab International Optronics + + + 405BD8 + CHONGQING FUGUI ELECTRONICS CO.,LTD. + + + B891C9 + Handreamnet + + + C8A776 + HUAWEI TECHNOLOGIES CO.,LTD + + + A400E2 + HUAWEI TECHNOLOGIES CO.,LTD + + + C4C603 + Cisco Systems, Inc + + + 2C4F52 + Cisco Systems, Inc + + + 2823F5 + China Mobile (Hangzhou) Information Technology Co., Ltd. + + + F010AB + China Mobile (Hangzhou) Information Technology Co., Ltd. + + + B4DC09 + Guangzhou Dawei Communication Co.,Ltd + + + 98865D + Nokia Shanghai Bell Co., Ltd. + + + 9C99CD + Voippartners + + + 68A03E + HUAWEI TECHNOLOGIES CO.,LTD + + + B8C385 + HUAWEI TECHNOLOGIES CO.,LTD + + + 4CE9E4 + New H3C Technologies Co., Ltd + + + C80D32 + Holoplot GmbH + + + C4F7D5 + Cisco Systems, Inc + + + 1C6499 + Comtrend Corporation + + + 04D9F5 + ASUSTek COMPUTER INC. + + + 54EC2F + Ruckus Wireless + + + 00257E + NEW POS TECHNOLOGY LIMITED + + + 2899C7 + LINDSAY BROADBAND INC + + + B4C4FC + Xiaomi Communications Co Ltd + + + FCBD67 + Arista Networks + + + 10DC4A + Fiberhome Telecommunication Technologies Co.,LTD + + + 487746 + Calix Inc. + + + F8AE27 + John Deere Electronic Solutions + + + 8CA96F + D&M Holdings Inc. + + + 98B8BA + LG Electronics (Mobile Communications) + + + 7CD661 + Xiaomi Communications Co Ltd + + + 7445CE + CRESYN + + + B0FD0B + IEEE Registration Authority + + + B4CC04 + Piranti + + + 4CBC48 + Cisco Systems, Inc + + + 48D875 + China TransInfo Technology Co., Ltd + + + 3050FD + Skyworth Digital Technology(Shenzhen) Co.,Ltd + + + 0CE99A + ATLS ALTEC + + + 4C11AE + Espressif Inc. + + + 8C89FA + Zhejiang Hechuan Technology Co., Ltd. + + + D4789B + Cisco Systems, Inc + + + 483FE9 + HUAWEI TECHNOLOGIES CO.,LTD + + + 143CC3 + HUAWEI TECHNOLOGIES CO.,LTD + + + A8E544 + HUAWEI TECHNOLOGIES CO.,LTD + + + 50C4DD + BUFFALO.INC + + + 0040BC + ALGORITHMICS LTD. + + + 004065 + GTE SPACENET + + + E002A5 + ABB Robotics + + + B8D526 + Zyxel Communications Corporation + + + ECADE0 + D-Link International + + + F0B968 + ITEL MOBILE LIMITED + + + 04E56E + THUB Co., ltd. + + + 1C7F2C + HUAWEI TECHNOLOGIES CO.,LTD + + + 88BCC1 + HUAWEI TECHNOLOGIES CO.,LTD + + + 8C426D + HUAWEI TECHNOLOGIES CO.,LTD + + + 38D2CA + Zhejiang Tmall Technology Co., Ltd. + + + 109E3A + Zhejiang Tmall Technology Co., Ltd. + + + 78DA07 + Zhejiang Tmall Technology Co., Ltd. + + + 44A61E + INGRAM MICRO SERVICES + + + 904DC3 + Flonidan A/S + + + 000DF1 + IONIX INC. + + + 00077C + Westermo Network Technologies AB + + + A8BF3C + HDV Phoelectron Technology Limited + + + D4F527 + SIEMENS AG + + + 1CBFCE + Shenzhen Century Xinyang Technology Co., Ltd + + + F83002 + Texas Instruments + + + A8A159 + ASRock Incorporation + + + 202AC5 + Petite-En + + + CCDC55 + Dragonchip Limited + + + A4C3F0 + Intel Corporate + + + 906D05 + BXB ELECTRONICS CO., LTD + + + D4BBC8 + vivo Mobile Communication Co., Ltd. + + + 489507 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + 745BC5 + IEEE Registration Authority + + + 445D5E + SHENZHEN Coolkit Technology CO.,LTD + + + A041A7 + NL Ministry of Defense + + + 5462E2 + Apple, Inc. + + + 149D99 + Apple, Inc. + + + B8B2F8 + Apple, Inc. + + + 98460A + Apple, Inc. + + + B85D0A + Apple, Inc. + + + 7C9A1D + Apple, Inc. + + + 103025 + Apple, Inc. + + + 70ACD7 + Shenzhen YOUHUA Technology Co., Ltd + + + 147BAC + Nokia + + + E446DA + Xiaomi Communications Co Ltd + + + 1C12B0 + Amazon Technologies Inc. + + + 4CBC98 + IEEE Registration Authority + + + 58D9C3 + Motorola Mobility LLC, a Lenovo Company + + + 2CF432 + Espressif Inc. + + + 28FFB2 + Toshiba Corp. + + + 1C60D2 + Fiberhome Telecommunication Technologies Co.,LTD + + + F4B5AA + zte corporation + + + E8ACAD + zte corporation + + + 647366 + Shenzhen Siera Technology Ltd + + + 744D28 + Routerboard.com + + + 041EFA + BISSELL Homecare, Inc. + + + 2C73A0 + Cisco Systems, Inc + + + 443E07 + Electrolux + + + 04BA8D + Samsung Electronics Co.,Ltd + + + D85575 + Samsung Electronics Co.,Ltd + + + D411A3 + Samsung Electronics Co.,Ltd + + + 90842B + LEGO System A/S + + + 00267E + PARROT SA + + + E05A9F + IEEE Registration Authority + + + 2C557C + Shenzhen YOUHUA Technology Co., Ltd + + + F4BCDA + Shenzhen Jingxun Software Telecommunication Technology Co.,Ltd + + + 000915 + CAS Corp. + + + 8C5AF8 + Beijing Xiaomi Electronics Co., Ltd. + + + D45800 + Fiberhome Telecommunication Technologies Co.,LTD + + + 0017A0 + RoboTech srl + + + 000AA8 + ePipe Pty. Ltd. + + + 0029C2 + Cisco Systems, Inc + + + 187C0B + Ruckus Wireless + + + 485D36 + Verizon + + + 20C047 + Verizon + + + 8485E6 + Guangdong Asano Technology CO.,Ltd. + + + 3C8375 + Microsoft Corporation + + + 78A7EB + 1MORE + + + D47B35 + NEO Monitors AS + + + 000878 + Benchmark Storage Innovations + + + 34DAB7 + zte corporation + + + 109C70 + Prusa Research s.r.o. + + + 103D0A + Hui Zhou Gaoshengda Technology Co.,LTD + + + 942790 + TCT mobile ltd + + + A41791 + Shenzhen Decnta Technology Co.,LTD. + + + A41908 + Fiberhome Telecommunication Technologies Co.,LTD + + + 7C604A + Avelon + + + 0014A5 + Gemtek Technology Co., Ltd. + + + C0B5D7 + CHONGQING FUGUI ELECTRONICS CO.,LTD. + + + 108EBA + Molekule + + + 80D336 + CERN + + + 64255E + Observint Technologies, Inc. + + + 90940A + Analog Devices, Inc + + + 40B076 + ASUSTek COMPUTER INC. + + + E84C56 + INTERCEPT SERVICES LIMITED + + + D4AD71 + Cisco Systems, Inc + + + 702B1D + E-Domus International Limited + + + F085C1 + SHENZHEN RF-LINK TECHNOLOGY CO.,LTD. + + + FC62B9 + ALPSALPINE CO,.LTD + + + 0002C7 + ALPSALPINE CO,.LTD + + + 001E3D + ALPSALPINE CO,.LTD + + + 28A183 + ALPSALPINE CO,.LTD + + + 48F07B + ALPSALPINE CO,.LTD + + + 4CDD7D + LHP Telematics LLC + + + B8BC5B + Samsung Electronics Co.,Ltd + + + 60380E + ALPSALPINE CO,.LTD + + + D43D39 + Dialog Semiconductor + + + 4C218C + Panasonic India Private limited + + + 94A40C + Diehl Metering GmbH + + + 4C917A + IEEE Registration Authority + + + F48CEB + D-Link International + + + 743A65 + NEC Corporation + + + 00255C + NEC Corporation + + + 2C4E7D + Chunghua Intelligent Network Equipment Inc. + + + A4F465 + ITEL MOBILE LIMITED + + + CC70ED + Cisco Systems, Inc + + + 907E30 + LARS + + + 84EB3E + Vivint Smart Home + + + 9C8275 + Yichip Microelectronics (Hangzhou) Co.,Ltd + + + 5CCBCA + FUJIAN STAR-NET COMMUNICATION CO.,LTD + + + 18BB26 + FN-LINK TECHNOLOGY LIMITED + + + 34F8E7 + Cisco Systems, Inc + + + 28E98E + Mitsubishi Electric Corporation + + + 18B905 + Hong Kong Bouffalo Lab Limited + + + ECF0FE + zte corporation + + + 70B317 + Cisco Systems, Inc + + + B00247 + AMPAK Technology, Inc. + + + BCE796 + Wireless CCTV Ltd + + + 44D3AD + Shenzhen TINNO Mobile Technology Corp. + + + 7485C4 + New H3C Technologies Co., Ltd + + + D8CE3A + Xiaomi Communications Co Ltd + + + B0907E + Cisco Systems, Inc + + + 2C7360 + Earda Technologies co Ltd + + + D0BAE4 + Shanghai MXCHIP Information Technology Co., Ltd. + + + C82E47 + Suzhou SmartChip Semiconductor Co., LTD + + + C02250 + Koss Corporation + + + 043385 + Nanchang BlackShark Co.,Ltd. + + + E4CA12 + zte corporation + + + D49E05 + zte corporation + + + 585FF6 + zte corporation + + + 40B30E + Integrated Device Technology (Malaysia) Sdn. Bhd. + + + 04CE7E + NXP France Semiconductors France + + + 1C549E + Universal Electronics, Inc. + + + 94B01F + Apple, Inc. + + + 98CC4D + Shenzhen mantunsci co., LTD + + + B8C74A + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + 102C6B + AMPAK Technology, Inc. + + + 2453BF + Enernet + + + 94F6D6 + Apple, Inc. + + + F82D7C + Apple, Inc. + + + C09AD0 + Apple, Inc. + + + D092FA + Fiberhome Telecommunication Technologies Co.,LTD + + + E85AD1 + Fiberhome Telecommunication Technologies Co.,LTD + + + 5076AF + Intel Corporate + + + 6C5C3D + IEEE Registration Authority + + + 84E5D8 + Guangdong UNIPOE IoT Technology Co.,Ltd. + + + A8BC9C + Cloud Light Technology Limited + + + A89042 + Beijing Wanwei Intelligent Technology Co., Ltd. + + + 18BE92 + Delta Networks, Inc. + + + C0132B + Sichuan Changhong Electric Ltd. + + + 0CB4A4 + Xintai Automobile Intelligent Network Technology + + + 90633B + Samsung Electronics Co.,Ltd + + + FCAAB6 + Samsung Electronics Co.,Ltd + + + 782327 + Samsung Electronics Co.,Ltd + + + DCF756 + Samsung Electronics Co.,Ltd + + + 2CA02F + Veroguard Systems Pty Ltd + + + 90C54A + vivo Mobile Communication Co., Ltd. + + + BC7596 + Beijing Broadwit Technology Co., Ltd. + + + A0B549 + Arcadyan Corporation + + + 001F5A + Beckwith Electric Co. + + + 985D82 + Arista Networks + + + 1C34DA + Mellanox Technologies, Inc. + + + 68A47D + Sun Cupid Technology (HK) LTD + + + 184B0D + Ruckus Wireless + + + D41243 + AMPAK Technology, Inc. + + + B87826 + Nintendo Co.,Ltd + + + DCCBA8 + Explora Technologies Inc + + + C07878 + FLEXTRONICS MANUFACTURING(ZHUHAI)CO.,LTD. + + + CCD4A1 + MitraStar Technology Corp. + + + 08BA5F + Qingdao Hisense Electronics Co.,Ltd. + + + 10DFFC + Siemens AG + + + 847F3D + Integrated Device Technology (Malaysia) Sdn. Bhd. + + + 944F4C + Sound United LLC + + + 34DAC1 + SAE Technologies Development(Dongguan) Co., Ltd. + + + 705DCC + EFM Networks + + + A823FE + LG Electronics + + + 1C599B + HUAWEI TECHNOLOGIES CO.,LTD + + + 806933 + HUAWEI TECHNOLOGIES CO.,LTD + + + BC26C7 + Cisco Systems, Inc + + + E05D5C + Oy Everon Ab + + + E046E5 + Gosuncn Technology Group Co., Ltd. + + + 688F2E + Hitron Technologies. Inc + + + D4BD1E + 5VT Technologies,Taiwan LTd. + + + BC5EA1 + PsiKick, Inc. + + + 283926 + CyberTAN Technology Inc. + + + C4FDE6 + DRTECH + + + CC988B + SONY Visual Products Inc. + + + 74B587 + Apple, Inc. + + + FCB6D8 + Apple, Inc. + + + 3C6A2C + IEEE Registration Authority + + + 30E3D6 + Spotify USA Inc. + + + D80D17 + TP-LINK TECHNOLOGIES CO.,LTD. + + + 7405A5 + TP-LINK TECHNOLOGIES CO.,LTD. + + + 286DCD + Beijing Winner Microelectronics Co.,Ltd. + + + 541031 + SMARTO + + + 44A466 + GROUPE LDLC + + + 8CFCA0 + Shenzhen Smart Device Technology Co., LTD. + + + 1C427D + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + 9CA525 + Shandong USR IOT Technology Limited + + + 18810E + Apple, Inc. + + + 608C4A + Apple, Inc. + + + 241B7A + Apple, Inc. + + + 8CFE57 + Apple, Inc. + + + C0A600 + Apple, Inc. + + + E0C286 + Aisai Communication Technology Co., Ltd. + + + 18C2BF + BUFFALO.INC + + + 0C2A86 + Fiberhome Telecommunication Technologies Co.,LTD + + + FC61E9 + Fiberhome Telecommunication Technologies Co.,LTD + + + 00A0D1 + INVENTEC CORPORATION + + + 0018CC + AXIOHM SAS + + + 001827 + NEC UNIFIED SOLUTIONS NEDERLAND B.V. + + + 009004 + 3COM EUROPE LTD + + + 00068C + 3COM + + + 02608C + 3COM + + + 00D0D8 + 3COM + + + 18937F + AMPAK Technology, Inc. + + + A43523 + Guangdong Donyan Network Technologies Co.,Ltd. + + + B4A94F + MERCURY CORPORATION + + + 803AF4 + Fiberhome Telecommunication Technologies Co.,LTD + + + 48A0F8 + Fiberhome Telecommunication Technologies Co.,LTD + + + 405662 + GuoTengShengHua Electronics LTD. + + + E4DB6D + Beijing Xiaomi Electronics Co., Ltd. + + + 0C5331 + ETH Zurich + + + 0C9A42 + FN-LINK TECHNOLOGY LIMITED + + + F85E3C + SHENZHEN ZHIBOTONG ELECTRONICS CO.,LTD + + + 283E76 + Common Networks + + + DC3979 + Cisco Systems, Inc + + + 58D56E + D-Link International + + + DC9088 + HUAWEI TECHNOLOGIES CO.,LTD + + + 54812D + PAX Computer Technology(Shenzhen) Ltd. + + + 44657F + Calix Inc. + + + 304B07 + Motorola Mobility LLC, a Lenovo Company + + + 345ABA + tcloud intelligence + + + 502FA8 + Cisco Systems, Inc + + + C08359 + IEEE Registration Authority + + + 8835C1 + OI ELECTRIC CO.,LTD + + + 3042A1 + ilumisys Inc. DBA Toggled + + + 0026B7 + Kingston Technology Company, Inc. + + + 000809 + Systemonic AG + + + 8C41F4 + IPmotion GmbH + + + 704F08 + Shenzhen Huisheng Information Technology Co., Ltd. + + + 4C0FC7 + Earda Technologies co Ltd + + + 9CF6DD + IEEE Registration Authority + + + 48881E + EthoSwitch LLC + + + CC2119 + Samsung Electronics Co.,Ltd + + + 80A796 + Neuralink Corp. + + + 001EEC + COMPAL INFORMATION (KUNSHAN) CO., LTD. + + + F0761C + COMPAL INFORMATION (KUNSHAN) CO., LTD. + + + 0004AE + Sullair Corporation + + + FCB10D + Shenzhen Tian Kun Technology Co.,LTD. + + + 20F77C + vivo Mobile Communication Co., Ltd. + + + 00451D + Cisco Systems, Inc + + + 000393 + Apple, Inc. + + + 0000C3 + Harris Corporation + + + A0D635 + WBS Technology + + + 902BD2 + HUAWEI TECHNOLOGIES CO.,LTD + + + 08D59D + Sagemcom Broadband SAS + + + B46921 + Intel Corporate + + + 14942F + USYS CO.,LTD. + + + EC83D5 + GIRD Systems Inc + + + 3C427E + IEEE Registration Authority + + + 30D659 + Merging Technologies SA + + + 702AD5 + Samsung Electronics Co.,Ltd + + + 889765 + exands + + + 000BA3 + Siemens AG + + + 34800D + Cavium Inc + + + B44BD6 + IEEE Registration Authority + + + D8912A + Zyxel Communications Corporation + + + 000C8A + Bose Corporation + + + 243A82 + IRTS + + + 880907 + MKT Systemtechnik GmbH & Co. KG + + + 40EEDD + HUAWEI TECHNOLOGIES CO.,LTD + + + AC751D + HUAWEI TECHNOLOGIES CO.,LTD + + + 289E97 + HUAWEI TECHNOLOGIES CO.,LTD + + + 001EB0 + ImesD Electronica S.L. + + + 001525 + Chamberlain Access Solutions + + + 58A48E + PixArt Imaging Inc. + + + 60058A + Hitachi Metals, Ltd. + + + BC22FB + RF Industries + + + 74B91E + Nanjing Bestway Automation System Co., Ltd + + + A019B2 + IEEE Registration Authority + + + 4C3FD3 + Texas Instruments + + + 8C15C7 + HUAWEI TECHNOLOGIES CO.,LTD + + + 60FA9D + HUAWEI TECHNOLOGIES CO.,LTD + + + 386E88 + zte corporation + + + 641C67 + DIGIBRAS INDUSTRIA DO BRASILS/A + + + DC9914 + HUAWEI TECHNOLOGIES CO.,LTD + + + B05365 + China Mobile IOT Company Limited + + + 308841 + Sichuan AI-Link Technology Co., Ltd. + + + 44EFCF + UGENE SOLUTION inc. + + + 0080B6 + Mercury Systems – Trusted Mission Solutions, Inc. + + + 08512E + Orion Diagnostica Oy + + + 98A404 + Ericsson AB + + + 00CC3F + Universal Electronics, Inc. + + + 74EB80 + Samsung Electronics Co.,Ltd + + + 0CE0DC + Samsung Electronics Co.,Ltd + + + D868C3 + Samsung Electronics Co.,Ltd + + + C493D9 + Samsung Electronics Co.,Ltd + + + A82BB9 + Samsung Electronics Co.,Ltd + + + ACFD93 + WEIFANG GOERTEK ELECTRONICS CO.,LTD + + + 000E8F + Sercomm Corporation. + + + 00B8C2 + Heights Telecom T ltd + + + B4B686 + Hewlett Packard + + + F4BF80 + HUAWEI TECHNOLOGIES CO.,LTD + + + 304596 + HUAWEI TECHNOLOGIES CO.,LTD + + + C0F4E6 + HUAWEI TECHNOLOGIES CO.,LTD + + + 68572D + Tuya Smart Inc. + + + A0E617 + MATIS + + + 7001B5 + Cisco Systems, Inc + + + 001F49 + Manhattan TV Ltd + + + 7C2EBD + Google, Inc. + + + 4CEDFB + ASUSTek COMPUTER INC. + + + D0B214 + PoeWit Inc + + + 88D652 + AMERGINT Technologies + + + FC90FA + Independent Technologies + + + E4E130 + TCT mobile ltd + + + 6CAF15 + Webasto SE + + + 40F04E + Integrated Device Technology (Malaysia) Sdn. Bhd. + + + 0C2138 + Hengstler GmbH + + + E0191D + HUAWEI TECHNOLOGIES CO.,LTD + + + 68D1BA + Shenzhen YOUHUA Technology Co., Ltd + + + E46059 + Pingtek Co., Ltd. + + + 4050B5 + Shenzhen New Species Technology Co., Ltd. + + + 1C1AC0 + Apple, Inc. + + + 3078C2 + Innowireless / QUCELL Networks + + + 800588 + Ruijie Networks Co.,LTD + + + 3C15FB + HUAWEI TECHNOLOGIES CO.,LTD + + + DC330D + QING DAO HAIER TELECOM CO.,LTD. + + + E0383F + zte corporation + + + D47226 + zte corporation + + + 0021F2 + EASY3CALL Technology Limited + + + 0015C4 + FLOVEL CO., LTD. + + + AC35EE + FN-LINK TECHNOLOGY LIMITED + + + 0C2C54 + HUAWEI TECHNOLOGIES CO.,LTD + + + 881196 + HUAWEI TECHNOLOGIES CO.,LTD + + + E40EEE + HUAWEI TECHNOLOGIES CO.,LTD + + + 28D997 + Yuduan Mobile Co., Ltd. + + + 0011E6 + Scientific Atlanta + + + 88AE07 + Apple, Inc. + + + 40831D + Apple, Inc. + + + DCD3A2 + Apple, Inc. + + + 5C1DD9 + Apple, Inc. + + + 68FEF7 + Apple, Inc. + + + F00E1D + Megafone Limited + + + 24F128 + Telstra + + + 70695A + Cisco Systems, Inc + + + 00BF77 + Cisco Systems, Inc + + + D07714 + Motorola Mobility LLC, a Lenovo Company + + + 30B7D4 + Hitron Technologies. Inc + + + B481BF + Meta-Networks, LLC + + + 946AB0 + Arcadyan Corporation + + + 4818FA + Nocsys + + + 587A6A + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + E81AAC + ORFEO SOUNDWORKS Inc. + + + A038F8 + OURA Health Oy + + + 687924 + ELS-GmbH & Co. KG + + + D4C19E + Ruckus Wireless + + + 0CAE7D + Texas Instruments + + + 304511 + Texas Instruments + + + 301F9A + IEEE Registration Authority + + + 28FD80 + IEEE Registration Authority + + + 000758 + DragonWave Inc. + + + D49398 + Nokia Corporation + + + 001937 + CommerceGuard AB + + + FC7C02 + Phicomm (Shanghai) Co., Ltd. + + + A8610A + ARDUINO AG + + + 6097DD + MicroSys Electronics GmbH + + + 047970 + HUAWEI TECHNOLOGIES CO.,LTD + + + A057E3 + HUAWEI TECHNOLOGIES CO.,LTD + + + F8DF15 + Sunitec Enterprise Co.,Ltd + + + B02680 + Cisco Systems, Inc + + + D46D6D + Intel Corporate + + + B41C30 + zte corporation + + + 705AAC + Samsung Electronics Co.,Ltd + + + 609813 + Shanghai Visking Digital Technology Co. LTD + + + 1CB044 + ASKEY COMPUTER CORP + + + 38DEAD + Intel Corporate + + + F4844C + Texas Instruments + + + 4C82CF + Dish Technologies Corp + + + 285767 + Dish Technologies Corp + + + 70169F + EtherCAT Technology Group + + + 689861 + Beacon Inc + + + 847460 + zte corporation + + + 506B4B + Mellanox Technologies, Inc. + + + 1CA0B8 + Hon Hai Precision Industry Co., Ltd. + + + 2C61F6 + Apple, Inc. + + + D4A33D + Apple, Inc. + + + 044F17 + HUMAX Co., Ltd. + + + 0CA8A7 + Samsung Electronics Co.,Ltd + + + B0672F + Bowers & Wilkins + + + 10CD6E + FISYS + + + E4CB59 + Beijing Loveair Science and Technology Co. Ltd. + + + B4E62D + Espressif Inc. + + + F0766F + Apple, Inc. + + + 4098AD + Apple, Inc. + + + 6C4D73 + Apple, Inc. + + + D89C67 + Hon Hai Precision Ind. Co.,Ltd. + + + 685ACF + Samsung Electronics Co.,Ltd + + + 64209F + Tilgin AB + + + A43E51 + ANOV FRANCE + + + D86375 + Xiaomi Communications Co Ltd + + + 68EF43 + Apple, Inc. + + + D02B20 + Apple, Inc. + + + 702605 + SONY Visual Products Inc. + + + 005013 + Seagate Cloud Systems Inc + + + 0090F1 + Seagate Cloud Systems Inc + + + 845A81 + ffly4u + + + CC81DA + Phicomm (Shanghai) Co., Ltd. + + + 00806C + Secure Systems & Services + + + 1C27DD + Datang Gohighsec(zhejiang)Information Technology Co.,Ltd. + + + B8C8EB + ITEL MOBILE LIMITED + + + 80C5F2 + AzureWave Technology Inc. + + + 64F88A + China Mobile IOT Company Limited + + + 68DB54 + Phicomm (Shanghai) Co., Ltd. + + + C8DF84 + Texas Instruments + + + 240D6C + SMND + + + B45253 + Seagate Technology + + + 0011C6 + Seagate Technology + + + 001D38 + Seagate Technology + + + E48F34 + Vodafone Italia S.p.A. + + + D8E004 + Vodia Networks Inc + + + 2CFDAB + Motorola (Wuhan) Mobility Technologies Communication Co., Ltd. + + + 30B4B8 + LG Electronics + + + 3873EA + IEEE Registration Authority + + + 4C5262 + Fujitsu Technology Solutions GmbH + + + 803BF6 + LOOK EASY INTERNATIONAL LIMITED + + + 30EB1F + Skylab M&C Technology Co.,Ltd + + + 549A4C + GUANGDONG HOMECARE TECHNOLOGY CO.,LTD. + + + 0CCEF6 + Guizhou Fortuneship Technology Co., Ltd + + + 1806FF + Acer Computer(Shanghai) Limited. + + + EC1D8B + Cisco Systems, Inc + + + D07FC4 + Ou Wei Technology Co.,Ltd. of Shenzhen City + + + 48555C + Wu Qi Technologies,Inc. + + + 18F0E4 + Xiaomi Communications Co Ltd + + + 380E4D + Cisco Systems, Inc + + + C4CD82 + Hangzhou Lowan Information Technology Co., Ltd. + + + 30FB94 + Shanghai Fangzhiwei Information Technology CO.,Ltd. + + + A4B52E + Integrated Device Technology (Malaysia) Sdn. Bhd. + + + 9C8C6E + Samsung Electronics Co.,Ltd + + + F86CE1 + Taicang T&W Electronics + + + 1C7328 + Connected Home + + + 08BA22 + Swaive Corporation + + + 28C13C + Hon Hai Precision Industry Co., Ltd. + + + 0023A0 + Hana CNS Co., LTD. + + + F406A5 + Hangzhou Bianfeng Networking Technology Co., Ltd. + + + B0ECE1 + Private + + + 60E78A + UNISEM + + + 64CBA3 + Pointmobile + + + 3CA581 + vivo Mobile Communication Co., Ltd. + + + 34E911 + vivo Mobile Communication Co., Ltd. + + + 1046B4 + FormericaOE + + + 9CE33F + Apple, Inc. + + + 7867D7 + Apple, Inc. + + + B8C111 + Apple, Inc. + + + 002424 + Ace Axis Limited + + + 50C9A0 + SKIPPER AS + + + 7483EF + Arista Networks + + + 00E0F6 + DECISION EUROPE + + + 001248 + Dell EMC + + + 006048 + Dell EMC + + + 7CC95A + Dell EMC + + + 00BF61 + Samsung Electronics Co.,Ltd + + + CC2DE0 + Routerboard.com + + + 389D92 + Seiko Epson Corporation + + + A07099 + Beijing Huacan Electronics Co., Ltd + + + DC5583 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + F8F21E + Intel Corporate + + + 282986 + APC by Schneider Electric + + + 707DB9 + Cisco Systems, Inc + + + 08BEAC + Edimax Technology Co. Ltd. + + + 8C0F83 + Angie Hospitality LLC + + + D00401 + Motorola Mobility LLC, a Lenovo Company + + + 742857 + Mayfield Robotics + + + 589043 + Sagemcom Broadband SAS + + + 24E124 + Xiamen Milesight IoT Co., Ltd. + + + DC68EB + Nintendo Co.,Ltd + + + E8361D + Sense Labs, Inc. + + + A407B6 + Samsung Electronics Co.,Ltd + + + 40498A + Synapticon GmbH + + + 087808 + Samsung Electronics Co.,Ltd + + + 887598 + Samsung Electronics Co.,Ltd + + + C0174D + Samsung Electronics Co.,Ltd + + + 7091F3 + Universal Electronics, Inc. + + + 080069 + Silicon Graphics + + + 002291 + Cisco Systems, Inc + + + 10FCB6 + mirusystems CO.,LTD + + + 04D6AA + SAMSUNG ELECTRO-MECHANICS(THAILAND) + + + C89F42 + VDII Innovation AB + + + 50A83A + S Mobile Devices Limited + + + 6405E9 + Shenzhen WayOS Technology Crop., Ltd. + + + F4F5DB + Xiaomi Communications Co Ltd + + + D0666D + Shenzhen Bus-Lan Technology Co., Ltd. + + + 08152F + Samsung Electronics Co., Ltd. ARTIK + + + 0C5842 + DME Micro + + + BC825D + MITSUMI ELECTRIC CO.,LTD. + + + CC2237 + IEEE Registration Authority + + + 48D6D5 + Google, Inc. + + + 38D620 + Limidea Concept Pte. Ltd. + + + 104963 + HARTING K.K. + + + 8CE38E + Kioxia Corporation + + + 186024 + Hewlett Packard + + + 8CD48E + ITEL MOBILE LIMITED + + + 642B8A + ALL BEST Industrial Co., Ltd. + + + 00149D + Sound ID Inc. + + + A8E824 + INIM ELECTRONICS S.R.L. + + + BC3D85 + HUAWEI TECHNOLOGIES CO.,LTD + + + 2054FA + HUAWEI TECHNOLOGIES CO.,LTD + + + 38378B + HUAWEI TECHNOLOGIES CO.,LTD + + + 745C4B + GN Audio A/S + + + 74F91A + Onface + + + A434F1 + Texas Instruments + + + EC0441 + ShenZhen TIGO Semiconductor Co., Ltd. + + + C0A53E + Apple, Inc. + + + B0350B + MOBIWIRE MOBILES (NINGBO) CO.,LTD + + + 28A6AC + seca gmbh & co. kg + + + ECD09F + Xiaomi Communications Co Ltd + + + 78E103 + Amazon Technologies Inc. + + + 78A6E1 + Brocade Communications Systems LLC + + + E4EC10 + Nokia Corporation + + + 000659 + EAL (Apeldoorn) B.V. + + + A8BE27 + Apple, Inc. + + + 002692 + Mitsubishi Electric Corporation + + + 00C08F + Panasonic Electric Works Co., Ltd. + + + 6C090A + GEMATICA SRL + + + 70E1FD + FLEXTRONICS + + + 74E60F + TECNO MOBILE LIMITED + + + 001AA7 + Torian Wireless + + + 90B1E0 + Beijing Nebula Link Technology Co., Ltd + + + 8014A8 + Guangzhou V-SOLUTION Electronic Technology Co., Ltd. + + + 586163 + Quantum Networks (SG) Pte. Ltd. + + + 002EC7 + HUAWEI TECHNOLOGIES CO.,LTD + + + 488EEF + HUAWEI TECHNOLOGIES CO.,LTD + + + 8CC121 + Panasonic Corporation AVC Networks Company + + + ACBE75 + Ufine Technologies Co.,Ltd. + + + 409BCD + D-Link International + + + 0CB459 + Marketech International Corp. + + + 94D029 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + 308454 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + 5C0339 + HUAWEI TECHNOLOGIES CO.,LTD + + + EC3DFD + SHENZHEN BILIAN ELECTRONIC CO.,LTD + + + 547595 + TP-LINK TECHNOLOGIES CO.,LTD. + + + C47154 + TP-LINK TECHNOLOGIES CO.,LTD. + + + F82819 + Liteon Technology Corporation + + + 50E971 + Jibo, Inc. + + + 58C583 + ITEL MOBILE LIMITED + + + 18204C + Kummler+Matter AG + + + 18D225 + Fiberhome Telecommunication Technologies Co.,LTD + + + 0840F3 + Tenda Technology Co.,Ltd.Dongguan branch + + + 94FBB2 + SHENZHEN GONGJIN ELECTRONICS CO.,LT + + + 00C05D + L&N TECHNOLOGIES + + + 30F77F + S Mobile Devices Limited + + + D86C63 + Google, Inc. + + + 001E99 + Vantanol Industrial Corporation + + + 58B633 + Ruckus Wireless + + + 543D37 + Ruckus Wireless + + + 2CE6CC + Ruckus Wireless + + + 5C5181 + Samsung Electronics Co.,Ltd + + + 608E08 + Samsung Electronics Co.,Ltd + + + 00227F + Ruckus Wireless + + + 74911A + Ruckus Wireless + + + C8DB26 + Logitech + + + A40E2B + Facebook Inc + + + F88A3C + IEEE Registration Authority + + + FC5A1D + Hitron Technologies. Inc + + + 94147A + vivo Mobile Communication Co., Ltd. + + + 18B430 + Nest Labs Inc. + + + 30B164 + Power Electronics International Inc. + + + 9828A6 + COMPAL INFORMATION (KUNSHAN) CO., LTD. + + + 001B17 + Palo Alto Networks + + + 58493B + Palo Alto Networks + + + 786D94 + Palo Alto Networks + + + F430B9 + Hewlett Packard + + + 14612F + Avaya Inc + + + 00309D + Nimble Microsystems, Inc. + + + 8C210A + TP-LINK TECHNOLOGIES CO.,LTD. + + + 4C189A + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + CC4B73 + AMPAK Technology, Inc. + + + 681DEF + Shenzhen CYX Technology Co., Ltd. + + + AC203E + Wuhan Tianyu Information Industry Co., Ltd. + + + B01F29 + Helvetia INC. + + + 54C9DF + FN-LINK TECHNOLOGY LIMITED + + + A47886 + Avaya Inc + + + 0403D6 + Nintendo Co.,Ltd + + + AC4E2E + Shenzhen JingHanDa Electronics Co.Ltd + + + 4C910C + Lanix Internacional, S.A. de C.V. + + + 0015DC + KT&C Co., Ltd. + + + 00187D + Armorlink Co .Ltd + + + 880F10 + Huami Information Technology Co.,Ltd. + + + 5C1A6F + Cambridge Industries(Group) Co.,Ltd. + + + 3C4CD0 + CERAGON NETWORKS + + + 206BE7 + TP-LINK TECHNOLOGIES CO.,LTD. + + + 182CB4 + Nectarsoft Co., Ltd. + + + 88BD78 + Flaircomm Microelectronics,Inc. + + + 58C5CB + Samsung Electronics Co.,Ltd + + + B4BFF6 + Samsung Electronics Co.,Ltd + + + EC363F + Markov Corporation + + + 5804CB + Tianjin Huisun Technology Co.,Ltd. + + + B8FFB3 + MitraStar Technology Corp. + + + 982DBA + Fibergate Inc. + + + E0D55E + GIGA-BYTE TECHNOLOGY CO.,LTD. + + + 00A38E + Cisco Systems, Inc + + + A0C9A0 + Murata Manufacturing Co., Ltd. + + + 74F61C + HTC Corporation + + + 84C0EF + Samsung Electronics Co.,Ltd + + + 000D2B + Racal Instruments + + + 004066 + APRESIA Systems Ltd + + + 48A74E + zte corporation + + + BC8AE8 + QING DAO HAIER TELECOM CO.,LTD. + + + F4DE0C + ESPOD Ltd. + + + 28C63F + Intel Corporate + + + 88CC45 + Skyworth Digital Technology(Shenzhen) Co.,Ltd + + + CC90E8 + Shenzhen YOUHUA Technology Co., Ltd + + + 3C5282 + Hewlett Packard + + + 08ED02 + IEEE Registration Authority + + + 84A9C4 + HUAWEI TECHNOLOGIES CO.,LTD + + + A0086F + HUAWEI TECHNOLOGIES CO.,LTD + + + D06F82 + HUAWEI TECHNOLOGIES CO.,LTD + + + A0F479 + HUAWEI TECHNOLOGIES CO.,LTD + + + 844765 + HUAWEI TECHNOLOGIES CO.,LTD + + + C4FF1F + HUAWEI TECHNOLOGIES CO.,LTD + + + 7C4F7D + Sawwave + + + 9CAC6D + Universal Electronics, Inc. + + + 600837 + ivvi Scientific(Nanchang)Co.Ltd + + + E8FDE8 + CeLa Link Corporation + + + C40BCB + Xiaomi Communications Co Ltd + + + 60D7E3 + IEEE Registration Authority + + + 1893D7 + Texas Instruments + + + A8B86E + LG Electronics (Mobile Communications) + + + 84AFEC + BUFFALO.INC + + + 7C7B8B + Control Concepts, Inc. + + + B83765 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + 345BBB + GD Midea Air-Conditioning Equipment Co.,Ltd. + + + 34CE00 + XIAOMI Electronics,CO.,LTD + + + D0498B + ZOOM SERVER + + + 0827CE + NAGANO KEIKI CO., LTD. + + + 00219E + Sony Corporation + + + ACB57D + Liteon Technology Corporation + + + D4619D + Apple, Inc. + + + 98DDEA + Infinix mobility limited + + + 001D44 + Krohne + + + A8A198 + TCT mobile ltd + + + 08EA40 + SHENZHEN BILIAN ELECTRONIC CO.,LTD + + + 00D095 + Alcatel-Lucent Enterprise + + + 0020DA + Alcatel-Lucent Enterprise + + + A0C4A5 + SYGN HOUSE INC. + + + 6C5976 + Shanghai Tricheer Technology Co.,Ltd. + + + 14BD61 + Apple, Inc. + + + 5CC6E9 + Edifier International + + + EC4F82 + Calix Inc. + + + 002CC8 + Cisco Systems, Inc + + + C0028D + WINSTAR Display CO.,Ltd + + + E89FEC + CHENGDU KT ELECTRONIC HI-TECH CO.,LTD + + + 802689 + D-Link International + + + 503A7D + AlphaTech PLC Int’l Co., Ltd. + + + F4C4D6 + Shenzhen Xinfa Electronic Co.,ltd + + + 7C5049 + Apple, Inc. + + + E47DEB + Shanghai Notion Information Technology CO.,LTD. + + + D8325A + Shenzhen YOUHUA Technology Co., Ltd + + + 9CDA3E + Intel Corporate + + + 283F69 + Sony Corporation + + + D83214 + Tenda Technology Co.,Ltd.Dongguan branch + + + 10954B + Megabyte Ltd. + + + C4B9CD + Cisco Systems, Inc + + + E0C0D1 + CK Telecom (Shenzhen) Limited + + + C0D3C0 + Samsung Electronics Co.,Ltd + + + 948BC1 + Samsung Electronics Co.,Ltd + + + 14568E + Samsung Electronics Co.,Ltd + + + 6837E9 + Amazon Technologies Inc. + + + 001081 + DPS, INC. + + + 40F385 + IEEE Registration Authority + + + 887873 + Intel Corporate + + + F87588 + HUAWEI TECHNOLOGIES CO.,LTD + + + F44C7F + HUAWEI TECHNOLOGIES CO.,LTD + + + 64B473 + Xiaomi Communications Co Ltd + + + 7451BA + Xiaomi Communications Co Ltd + + + 6CB4A7 + Landauer, Inc. + + + F8A5C5 + Cisco Systems, Inc + + + 7C5A1C + Sophos Ltd + + + B0F1EC + AMPAK Technology, Inc. + + + 542B57 + Night Owl SP + + + 7802F8 + Xiaomi Communications Co Ltd + + + 00238A + Ciena Corporation + + + 080027 + PCS Systemtechnik GmbH + + + 2C4D54 + ASUSTek COMPUTER INC. + + + 349672 + TP-LINK TECHNOLOGIES CO.,LTD. + + + 702084 + Hon Hai Precision Industry Co., Ltd. + + + 9C6650 + Glodio Technolies Co.,Ltd Tianjin Branch + + + D461FE + Hangzhou H3C Technologies Co., Limited + + + 501E2D + StreamUnlimited Engineering GmbH + + + A0A33B + HUAWEI TECHNOLOGIES CO.,LTD + + + EC01EE + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + 6049C1 + Avaya Inc + + + E45D51 + SFR + + + 7C67A2 + Intel Corporate + + + 00E05A + GALEA NETWORK SECURITY + + + F06E32 + MICROTEL INNOVATION S.R.L. + + + C43018 + MCS Logic Inc. + + + 6831FE + Teladin Co.,Ltd. + + + 2816AD + Intel Corporate + + + D0FF98 + HUAWEI TECHNOLOGIES CO.,LTD + + + 94652D + OnePlus Technology (Shenzhen) Co., Ltd + + + 0060D3 + AT&T + + + 848DC7 + Cisco SPVTG + + + 045D4B + Sony Corporation + + + 78AF58 + GIMASI SA + + + 1CB857 + Becon Technologies Co,.Ltd. + + + 48A380 + Gionee Communication Equipment Co.,Ltd. + + + 682737 + Samsung Electronics Co.,Ltd + + + 001992 + Adtran Inc + + + 3CF862 + Intel Corporate + + + B0E5ED + HUAWEI TECHNOLOGIES CO.,LTD + + + C486E9 + HUAWEI TECHNOLOGIES CO.,LTD + + + 344B3D + Fiberhome Telecommunication Technologies Co.,LTD + + + 8C9351 + Jigowatts Inc. + + + D838FC + Ruckus Wireless + + + 2C0BE9 + Cisco Systems, Inc + + + 90505A + unGlue, Inc + + + 3478D7 + Gionee Communication Equipment Co.,Ltd. + + + 5CCCA0 + Gridwiz Inc. + + + 20AB37 + Apple, Inc. + + + 60F445 + Apple, Inc. + + + E0A700 + Verkada Inc + + + 58404E + Apple, Inc. + + + D0C5F3 + Apple, Inc. + + + BC9FEF + Apple, Inc. + + + 5800E3 + Liteon Technology Corporation + + + 000AE4 + Wistron Corporation + + + 00B091 + Transmeta Corp. + + + ACC662 + MitraStar Technology Corp. + + + 886B44 + Sunnovo International Limited + + + FC3CE9 + Tsingtong Technologies Co, Ltd. + + + A4580F + IEEE Registration Authority + + + 48F97C + Fiberhome Telecommunication Technologies Co.,LTD + + + C0BFC0 + HUAWEI TECHNOLOGIES CO.,LTD + + + A08CF8 + HUAWEI TECHNOLOGIES CO.,LTD + + + 4CB81C + SAM Electronics GmbH + + + 44D244 + Seiko Epson Corporation + + + 7CF95C + U.I. Lapp GmbH + + + C8F733 + Intel Corporate + + + A03D6F + Cisco Systems, Inc + + + A0E0AF + Cisco Systems, Inc + + + A4E6B1 + Shanghai Joindata Technology Co.,Ltd. + + + C09C04 + Shaanxi GuoLian Digital TV Technology Co.,Ltd. + + + ACD657 + Shaanxi GuoLian Digital TV Technology Co.,Ltd. + + + 3CEF8C + Zhejiang Dahua Technology Co., Ltd. + + + 8C2FA6 + Solid Optics B.V. + + + 8C192D + IEEE Registration Authority + + + 6473E2 + Arbiter Systems, Inc. + + + E45D52 + Avaya Inc + + + 94E979 + Liteon Technology Corporation + + + B49691 + Intel Corporate + + + 007686 + Cisco Systems, Inc + + + D0608C + zte corporation + + + 7C03C9 + Shenzhen YOUHUA Technology Co., Ltd + + + 003048 + Super Micro Computer, Inc. + + + 9CD9CB + Lesira Manufacturing Pty Ltd + + + AC233F + Shenzhen Minew Technologies Co., Ltd. + + + 3C80AA + Ransnet Singapore Pte Ltd + + + 88C626 + Logitech, Inc + + + 0023F7 + Private + + + D4C8B0 + Prime Electronics & Satellitics Inc. + + + 0481AE + Clack Corporation + + + 9C13AB + Chanson Water Co., Ltd. + + + 703D15 + Hangzhou H3C Technologies Co., Limited + + + E49E12 + FREEBOX SAS + + + 18F292 + Shannon Systems + + + 8CEA1B + Edgecore Networks Corporation + + + 701CE7 + Intel Corporate + + + 9C2A70 + Hon Hai Precision Ind. Co.,Ltd. + + + 58E16C + Ying Hua Information Technology (Shanghai)Co., LTD + + + C82158 + Intel Corporate + + + 98E476 + Zentan + + + 14A51A + HUAWEI TECHNOLOGIES CO.,LTD + + + 047503 + HUAWEI TECHNOLOGIES CO.,LTD + + + 50B363 + Digitron da Amazonia S/A + + + D4E90B + CVT CO.,LTD + + + CCB0DA + Liteon Technology Corporation + + + A4D9A4 + neXus ID Solutions AB + + + E02CF3 + MRS Electronic GmbH + + + 2C0E3D + SAMSUNG ELECTRO-MECHANICS(THAILAND) + + + 487A55 + ALE International + + + 2CBABA + Samsung Electronics Co.,Ltd + + + 40D3AE + Samsung Electronics Co.,Ltd + + + 2CDD95 + Taicang T&W Electronics + + + 88E87F + Apple, Inc. + + + 9CF48E + Apple, Inc. + + + 5CF7E6 + Apple, Inc. + + + B853AC + Apple, Inc. + + + 203CAE + Apple, Inc. + + + A03BE3 + Apple, Inc. + + + 4C3275 + Apple, Inc. + + + 9C7DA3 + HUAWEI TECHNOLOGIES CO.,LTD + + + A4C64F + HUAWEI TECHNOLOGIES CO.,LTD + + + 00D78F + Cisco Systems, Inc + + + 107223 + TELLESCOM INDUSTRIA E COMERCIO EM TELECOMUNICACAO + + + D03DC3 + AQ Corporation + + + EC01E2 + FOXCONN INTERCONNECT TECHNOLOGY + + + E0686D + Raybased AB + + + CCFD17 + TCT mobile ltd + + + 502B73 + Tenda Technology Co.,Ltd.Dongguan branch + + + B4E782 + Vivalnk + + + 4409B8 + Salcomp (Shenzhen) CO., LTD. + + + 04BA36 + Li Seng Technology Ltd + + + B4F81E + Kinova + + + 001628 + Magicard Ltd + + + 702E22 + zte corporation + + + 3816D1 + Samsung Electronics Co.,Ltd + + + D0176A + Samsung Electronics Co.,Ltd + + + D48890 + Samsung Electronics Co.,Ltd + + + 5492BE + Samsung Electronics Co.,Ltd + + + 1861C7 + lemonbeat GmbH + + + 205D47 + vivo Mobile Communication Co., Ltd. + + + 10C60C + Domino UK Ltd + + + 043110 + Inspur Group Co., Ltd. + + + 949AA9 + Microsoft Corporation + + + ACAB2E + Beijing LasNubes Technology Co., Ltd. + + + 000678 + D&M Holdings Inc. + + + 884CCF + Pulzze Systems, Inc + + + C8B21E + CHIPSEA TECHNOLOGIES (SHENZHEN) CORP. + + + 600B03 + Hangzhou H3C Technologies Co., Limited + + + A0AB1B + D-Link International + + + D842E2 + Canary Connect, Inc. + + + C8E776 + PTCOM Technology + + + 302303 + Belkin International Inc. + + + E41218 + ShenZhen Rapoo Technology Co., Ltd. + + + 001984 + ESTIC Corporation + + + 00212F + Phoebe Micro Inc. + + + 3859F9 + Hon Hai Precision Ind. Co.,Ltd. + + + EC55F9 + Hon Hai Precision Ind. Co.,Ltd. + + + 001A8A + Samsung Electronics Co.,Ltd + + + 3C5A37 + Samsung Electronics Co.,Ltd + + + F49F54 + Samsung Electronics Co.,Ltd + + + 34C3AC + Samsung Electronics Co.,Ltd + + + 44F459 + Samsung Electronics Co.,Ltd + + + 00265D + Samsung Electronics Co.,Ltd + + + 002567 + Samsung Electronics Co.,Ltd + + + BCB1F3 + Samsung Electronics Co.,Ltd + + + 5C0A5B + SAMSUNG ELECTRO MECHANICS CO., LTD. + + + 8056F2 + Hon Hai Precision Ind. Co.,Ltd. + + + 000278 + SAMSUNG ELECTRO MECHANICS CO., LTD. + + + 002399 + Samsung Electronics Co.,Ltd + + + 7CF854 + Samsung Electronics Co.,Ltd + + + 7CE9D3 + Hon Hai Precision Ind. Co.,Ltd. + + + 1C3E84 + Hon Hai Precision Ind. Co.,Ltd. + + + B8763F + Hon Hai Precision Ind. Co.,Ltd. + + + 60F494 + Hon Hai Precision Ind. Co.,Ltd. + + + 906EBB + Hon Hai Precision Ind. Co.,Ltd. + + + 18F46A + Hon Hai Precision Ind. Co.,Ltd. + + + 4C0F6E + Hon Hai Precision Ind. Co.,Ltd. + + + 78E400 + Hon Hai Precision Ind. Co.,Ltd. + + + C4731E + Samsung Electronics Co.,Ltd + + + 001C43 + Samsung Electronics Co.,Ltd + + + 0023D6 + Samsung Electronics Co.,Ltd + + + 001B98 + Samsung Electronics Co.,Ltd + + + 44D6E1 + Snuza International Pty. Ltd. + + + 486DBB + Vestel Elektronik San ve Tic. A.S. + + + 002A10 + Cisco Systems, Inc + + + 00A289 + Cisco Systems, Inc + + + 000F5E + Veo + + + 001328 + Westech Korea Inc., + + + B8BF83 + Intel Corporate + + + 84E0F4 + IEEE Registration Authority + + + D83062 + Apple, Inc. + + + 7C79E8 + PayRange Inc. + + + A43111 + ZIV + + + 008073 + DWB ASSOCIATES + + + 80A1D7 + Shanghai DareGlobal Technologies Co.,Ltd + + + EC1F72 + SAMSUNG ELECTRO-MECHANICS(THAILAND) + + + 8C0D76 + HUAWEI TECHNOLOGIES CO.,LTD + + + 84BE52 + HUAWEI TECHNOLOGIES CO.,LTD + + + 849FB5 + HUAWEI TECHNOLOGIES CO.,LTD + + + A4CAA0 + HUAWEI TECHNOLOGIES CO.,LTD + + + 14F42A + Samsung Electronics Co.,Ltd + + + 0808C2 + Samsung Electronics Co.,Ltd + + + CCFE3C + Samsung Electronics Co.,Ltd + + + 28BAB5 + Samsung Electronics Co.,Ltd + + + E440E2 + Samsung Electronics Co.,Ltd + + + 103B59 + Samsung Electronics Co.,Ltd + + + D890E8 + Samsung Electronics Co.,Ltd + + + E4121D + Samsung Electronics Co.,Ltd + + + E8508B + SAMSUNG ELECTRO-MECHANICS(THAILAND) + + + F8042E + SAMSUNG ELECTRO-MECHANICS(THAILAND) + + + 1C62B8 + Samsung Electronics Co.,Ltd + + + CCF9E8 + Samsung Electronics Co.,Ltd + + + D857EF + Samsung Electronics Co.,Ltd + + + 18E2C2 + Samsung Electronics Co.,Ltd + + + 9852B1 + Samsung Electronics Co.,Ltd + + + C462EA + Samsung Electronics Co.,Ltd + + + 182666 + Samsung Electronics Co.,Ltd + + + 30D6C9 + Samsung Electronics Co.,Ltd + + + CC07AB + Samsung Electronics Co.,Ltd + + + B43A28 + Samsung Electronics Co.,Ltd + + + 78A873 + Samsung Electronics Co.,Ltd + + + BC8AA3 + NHN Entertainment + + + 04BBF9 + Pavilion Data Systems Inc + + + 58FB84 + Intel Corporate + + + 8C6102 + Beijing Baofengmojing Technologies Co., Ltd + + + 548CA0 + Liteon Technology Corporation + + + 345760 + MitraStar Technology Corp. + + + C0D391 + IEEE Registration Authority + + + D49B5C + Chongqing Miedu Technology Co., Ltd. + + + 00C017 + NetAlly + + + 002261 + Frontier Silicon Ltd + + + E8EB11 + Texas Instruments + + + 3C6FEA + Panasonic India Pvt. Ltd. + + + 001988 + Wi2Wi, Inc + + + 18DC56 + Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd + + + 0016F2 + Dmobile System Co., Ltd. + + + 44BFE3 + Shenzhen Longtech Electronics Co.,Ltd + + + 34074F + AccelStor, Inc. + + + B4A984 + Symantec Corporation + + + 00E011 + UNIDEN CORPORATION + + + 002555 + Visonic Technologies 1993 Ltd. + + + 58986F + Revolution Display + + + C81FBE + HUAWEI TECHNOLOGIES CO.,LTD + + + 203DB2 + HUAWEI TECHNOLOGIES CO.,LTD + + + 48D539 + HUAWEI TECHNOLOGIES CO.,LTD + + + C88D83 + HUAWEI TECHNOLOGIES CO.,LTD + + + 441441 + AudioControl Inc. + + + 001F9A + Nortel Networks + + + 000A0E + Invivo Research Inc. + + + 000438 + Nortel Networks + + + 000EC0 + Nortel Networks + + + 3C404F + GUANGDONG PISEN ELECTRONICS CO.,LTD + + + D84FB8 + LG ELECTRONICS + + + 000AEB + TP-LINK TECHNOLOGIES CO.,LTD. + + + 60EE5C + SHENZHEN FAST TECHNOLOGIES CO.,LTD + + + 6488FF + Sichuan Changhong Electric Ltd. + + + C4084A + Nokia + + + 000801 + HighSpeed Surfing Inc. + + + 000772 + Alcatel-Lucent Shanghai Bell Co., Ltd + + + E03005 + Alcatel-Lucent Shanghai Bell Co., Ltd + + + 001E7E + Nortel Networks + + + 001365 + Nortel Networks + + + 002162 + Nortel Networks + + + 02E6D3 + NIXDORF COMPUTER CORP. + + + 0CA402 + Alcatel-Lucent IPD + + + A0F3E4 + Alcatel-Lucent IPD + + + 84DBFC + Nokia + + + 0016B9 + ProCurve Networking by HP + + + 001660 + Nortel Networks + + + 00AA70 + LG Electronics (Mobile Communications) + + + F895C7 + LG Electronics (Mobile Communications) + + + 84D931 + Hangzhou H3C Technologies Co., Limited + + + 7CFC3C + Visteon Corporation + + + 4888CA + Motorola (Wuhan) Mobility Technologies Communication Co., Ltd. + + + 385610 + CANDY HOUSE, Inc. + + + 00A742 + Cisco Systems, Inc + + + 2C3731 + SHENZHEN YIFANG DIGITAL TECHNOLOGY CO.,LTD. + + + 00116E + Peplink International Ltd. + + + 540955 + zte corporation + + + C041F6 + LG ELECTRONICS INC + + + 001E75 + LG Electronics (Mobile Communications) + + + 001C62 + LG Electronics (Mobile Communications) + + + 505527 + LG Electronics (Mobile Communications) + + + 88C9D0 + LG Electronics (Mobile Communications) + + + 8C3AE3 + LG Electronics (Mobile Communications) + + + D0052A + Arcadyan Corporation + + + EC6881 + Palo Alto Networks + + + E4509A + HW Communications Ltd + + + 702900 + Shenzhen ChipTrip Technology Co,Ltd + + + ECAAA0 + PEGATRON CORPORATION + + + 60E3AC + LG Electronics (Mobile Communications) + + + 90F052 + MEIZU Technology Co., Ltd. + + + 90A46A + SISNET CO., LTD + + + 14E7C8 + Integrated Device Technology (Malaysia) Sdn. Bhd. + + + ECCD6D + Allied Telesis, Inc. + + + 981E0F + Jeelan (Shanghai Jeelan Technology Information Inc + + + 9CA3A9 + Guangzhou Juan Optical and Electronical Tech Joint Stock Co., Ltd + + + 7CC709 + SHENZHEN RF-LINK TECHNOLOGY CO.,LTD. + + + 18339D + Cisco Systems, Inc + + + 146102 + Alps Alpine + + + 54276C + Jiangsu Houge Technology Corp. + + + 0821EF + Samsung Electronics Co.,Ltd + + + 34145F + Samsung Electronics Co.,Ltd + + + A03E6B + IEEE Registration Authority + + + 9802D8 + IEEE Registration Authority + + + 64FB81 + IEEE Registration Authority + + + 2C265F + IEEE Registration Authority + + + 8CFDF0 + Qualcomm Inc. + + + C4BB4C + Zebra Information Tech Co. Ltd + + + 98CF53 + BBK EDUCATIONAL ELECTRONICS CORP.,LTD. + + + D4A148 + HUAWEI TECHNOLOGIES CO.,LTD + + + 4C0BBE + Microsoft + + + 0C2576 + LONGCHEER TELECOMMUNICATION LIMITED + + + D8D43C + Sony Corporation + + + 486B2C + BBK EDUCATIONAL ELECTRONICS CORP.,LTD. + + + 6C25B9 + BBK EDUCATIONAL ELECTRONICS CORP.,LTD. + + + 2C282D + BBK EDUCATIONAL ELECTRONICS CORP.,LTD. + + + 4813F3 + BBK EDUCATIONAL ELECTRONICS CORP.,LTD. + + + 00409F + Telco Systems, Inc. + + + 00001F + Telco Systems, Inc. + + + 00A012 + Telco Systems, Inc. + + + F0DEF1 + Wistron Infocomm (Zhongshan) Corporation + + + F80F41 + Wistron Infocomm (Zhongshan) Corporation + + + 3C970E + Wistron InfoComm(Kunshan)Co.,Ltd. + + + D065CA + HUAWEI TECHNOLOGIES CO.,LTD + + + 8CEBC6 + HUAWEI TECHNOLOGIES CO.,LTD + + + B08900 + HUAWEI TECHNOLOGIES CO.,LTD + + + 00E0DD + Zenith Electronics Corporation + + + 50CE75 + Measy Electronics Co., Ltd. + + + 001639 + Ubiquam Co., Ltd. + + + 001597 + AETA AUDIO SYSTEMS + + + 002397 + Westell Technologies Inc. + + + 00045B + Techsan Electronics Co., Ltd. + + + 0007BA + UTStarcom Inc + + + 90A210 + United Telecoms Ltd + + + 78CB68 + DAEHAP HYPER-TECH + + + 000B0E + Trapeze Networks + + + 000C29 + VMware, Inc. + + + 000569 + VMware, Inc. + + + E4029B + Intel Corporate + + + DC1AC5 + vivo Mobile Communication Co., Ltd. + + + B456B9 + Teraspek Technologies Co.,Ltd + + + 9CDD1F + Intelligent Steward Co.,Ltd + + + 3C6816 + VXi Corporation + + + E811CA + SHANDONG KAER ELECTRIC.CO.,LTD + + + 00C000 + LANOPTICS, LTD. + + + 845181 + Samsung Electronics Co.,Ltd + + + A8FCB7 + Consolidated Resource Imaging + + + C816BD + Qingdao Hisense Communications Co.,Ltd. + + + 00EBD5 + Cisco Systems, Inc + + + 34ED0B + Shanghai XZ-COM.CO.,Ltd. + + + 90EF68 + Zyxel Communications Corporation + + + F45EAB + Texas Instruments + + + C4A366 + zte corporation + + + 6073BC + zte corporation + + + 18B169 + Sonicwall + + + 444450 + OttoQ + + + 50F5DA + Amazon Technologies Inc. + + + 101212 + Vivo International Corporation Pty Ltd + + + F03EBF + GOGORO TAIWAN LIMITED + + + C48F07 + Shenzhen Yihao Hulian Science and Technology Co., Ltd. + + + DC7834 + LOGICOM SA + + + D0577B + Intel Corporate + + + 6C9522 + Scalys + + + A8BB50 + WiZ IoT Company Limited + + + 3C92DC + Octopod Technology Co. Ltd. + + + 08C021 + HUAWEI TECHNOLOGIES CO.,LTD + + + 600810 + HUAWEI TECHNOLOGIES CO.,LTD + + + 48435A + HUAWEI TECHNOLOGIES CO.,LTD + + + 78FFCA + TECNO MOBILE LIMITED + + + 046565 + Testop + + + 7C3548 + Transcend Information + + + 78009E + Samsung Electronics Co.,Ltd + + + ACC33A + Samsung Electronics Co.,Ltd + + + 54F201 + Samsung Electronics Co.,Ltd + + + 70288B + Samsung Electronics Co.,Ltd + + + 348A7B + Samsung Electronics Co.,Ltd + + + 1000FD + LaonPeople + + + C47C8D + IEEE Registration Authority + + + 848319 + Hangzhou Zero Zero Technology Co., Ltd. + + + 7CB0C2 + Intel Corporate + + + A81559 + Breathometer, Inc. + + + C4CAD9 + Hangzhou H3C Technologies Co., Limited + + + 5866BA + Hangzhou H3C Technologies Co., Limited + + + 70BAEF + Hangzhou H3C Technologies Co., Limited + + + 586AB1 + Hangzhou H3C Technologies Co., Limited + + + 009006 + Hamamatsu Photonics K.K. + + + 001AF4 + Handreamnet + + + E00EDA + Cisco Systems, Inc + + + 4C0B3A + TCT mobile ltd + + + E42D02 + TCT mobile ltd + + + 0CBD51 + TCT mobile ltd + + + 745C9F + TCT mobile ltd + + + 8C99E6 + TCT mobile ltd + + + 449F7F + DataCore Software Corporation + + + 001793 + Tigi Corporation + + + 000358 + Hanyang Digitech Co.Ltd + + + 8C8EF2 + Apple, Inc. + + + 90B0ED + Apple, Inc. + + + 04D3CF + Apple, Inc. + + + 4882F2 + Appel Elektronik GmbH + + + E0C79D + Texas Instruments + + + 00177D + IDT Technology Limited + + + 4000E0 + Derek(Shaoguan)Limited + + + FCBC9C + Vimar Spa + + + E80959 + Guoguang Electric Co.,Ltd + + + F0407B + Fiberhome Telecommunication Technologies Co.,LTD + + + 94885E + Surfilter Network Technology Co., Ltd. + + + 945089 + SimonsVoss Technologies GmbH + + + 0024F4 + Kaminario, Ltd. + + + 001A29 + Johnson Outdoors Marine Electronics d/b/a Minnkota + + + 0090AE + ITALTEL S.p.A/RF-UP-I + + + 042AE2 + Cisco Systems, Inc + + + E0B6F5 + IEEE Registration Authority + + + D0A4B1 + Sonifex Ltd. + + + 50DD4F + Automation Components, Inc + + + F49EEF + Taicang T&W Electronics + + + 002378 + GN Netcom A/S + + + 50C971 + GN Netcom A/S + + + C4F081 + HUAWEI TECHNOLOGIES CO.,LTD + + + 801382 + HUAWEI TECHNOLOGIES CO.,LTD + + + 94FE22 + HUAWEI TECHNOLOGIES CO.,LTD + + + 00409C + TRANSWARE + + + 608334 + HUAWEI TECHNOLOGIES CO.,LTD + + + E47E66 + HUAWEI TECHNOLOGIES CO.,LTD + + + 94DBDA + HUAWEI TECHNOLOGIES CO.,LTD + + + B01BD2 + Le Shi Zhi Xin Electronic Technology (Tianjin) Limited + + + 1C3ADE + Samsung Electronics Co.,Ltd + + + 002360 + Lookit Technology Co., Ltd + + + F462D0 + Not for Radio, LLC + + + 84002D + PEGATRON CORPORATION + + + E4A1E6 + Alcatel-Lucent Shanghai Bell Co., Ltd + + + 1CABC0 + Hitron Technologies. Inc + + + C825E1 + Lemobile Information Technology (Beijing) Co., Ltd + + + 54D9E4 + BRILLIANTTS CO., LTD + + + 0090FA + Emulex Corporation + + + 00E0D5 + Emulex Corporation + + + 84FEDC + Borqs Beijing Ltd. + + + 001035 + Elitegroup Computer Systems Co.,Ltd. + + + 000AE6 + Elitegroup Computer Systems Co.,Ltd. + + + 7427EA + Elitegroup Computer Systems Co.,Ltd. + + + 649968 + Elentec + + + 98DED0 + TP-LINK TECHNOLOGIES CO.,LTD. + + + 005BA1 + shanghai huayuan chuangxin software CO., LTD. + + + 58D67A + TCPlink + + + 5CC7D7 + AZROAD TECHNOLOGY COMPANY LIMITED + + + 509EA7 + Samsung Electronics Co.,Ltd + + + A88195 + Samsung Electronics Co.,Ltd + + + 88ADD2 + Samsung Electronics Co.,Ltd + + + A4BF01 + Intel Corporate + + + B805AB + zte corporation + + + 789682 + zte corporation + + + C4BED4 + Avaya Inc + + + D017C2 + ASUSTek COMPUTER INC. + + + 98072D + Texas Instruments + + + F0C77F + Texas Instruments + + + D467E7 + Fiberhome Telecommunication Technologies Co.,LTD + + + E42F26 + Fiberhome Telecommunication Technologies Co.,LTD + + + 04C1B9 + Fiberhome Telecommunication Technologies Co.,LTD + + + 349971 + Quanta Storage Inc. + + + 9C52F8 + HUAWEI TECHNOLOGIES CO.,LTD + + + 5CF286 + IEEE Registration Authority + + + E8FD72 + SHANGHAI LINGUO TECHNOLOGY CO., LTD. + + + 98BB1E + BYD Precision Manufacture Company Ltd. + + + 04C103 + Clover Network, Inc. + + + 280C28 + Unigen DataStorage Corporation + + + 00CCFC + Cisco Systems, Inc + + + 08BE77 + Green Electronics + + + AC5F3E + SAMSUNG ELECTRO-MECHANICS(THAILAND) + + + 546D52 + TOPVIEW OPTRONICS CORP. + + + 545AA6 + Espressif Inc. + + + FC1A11 + vivo Mobile Communication Co., Ltd. + + + 38FDFE + IEEE Registration Authority + + + 2C09CB + COBS AB + + + 208B37 + Skyworth Digital Technology(Shenzhen) Co.,Ltd + + + 002340 + MiXTelematics + + + B48B19 + Apple, Inc. + + + BCEC5D + Apple, Inc. + + + 28A02B + Apple, Inc. + + + 0019C5 + Sony Interactive Entertainment Inc. + + + 001315 + Sony Interactive Entertainment Inc. + + + 001E1E + Honeywell Life Safety + + + A0C589 + Intel Corporate + + + 1C234F + EDMI Europe Ltd + + + A444D1 + Wingtech Group (HongKong)Limited + + + 006CFD + Sichuan Changhong Electric Ltd. + + + 907282 + Sagemcom Broadband SAS + + + 38B8EB + IEEE Registration Authority + + + 9897D1 + MitraStar Technology Corp. + + + B83241 + Wuhan Tianyu Information Industry Co., Ltd. + + + 0060DC + NEC Magnus Communications,Ltd. + + + 0023B4 + Nokia Danmark A/S + + + 002548 + Nokia Danmark A/S + + + 0022FC + Nokia Danmark A/S + + + 0022FD + Nokia Danmark A/S + + + 0021AA + Nokia Danmark A/S + + + 001D6E + Nokia Danmark A/S + + + 001370 + Nokia Danmark A/S + + + 9C1874 + Nokia Danmark A/S + + + 001BAF + Nokia Danmark A/S + + + 001C35 + Nokia Danmark A/S + + + 001C9A + Nokia Danmark A/S + + + 001CD6 + Nokia Danmark A/S + + + 001CD4 + Nokia Danmark A/S + + + 001D98 + Nokia Danmark A/S + + + 001DE9 + Nokia Danmark A/S + + + 001E3A + Nokia Danmark A/S + + + C8D10B + Nokia Corporation + + + A84481 + Nokia Corporation + + + 8844F6 + Nokia Corporation + + + F44D17 + GOLDCARD HIGH-TECH CO.,LTD. + + + 0030FF + DataFab Systems Inc. + + + 000FF6 + DARFON LIGHTING CORP + + + CC6DA0 + Roku, Inc. + + + 0016E4 + VANGUARD SECURITY ENGINEERING CORP. + + + 3C8970 + Neosfar + + + 78CA83 + IEEE Registration Authority + + + 0C1167 + Cisco Systems, Inc + + + 001742 + FUJITSU LIMITED + + + 001999 + Fujitsu Technology Solutions GmbH + + + 005A39 + SHENZHEN FAST TECHNOLOGIES CO.,LTD + + + A089E4 + Skyworth Digital Technology(Shenzhen) Co.,Ltd + + + 5CC6D0 + Skyworth Digital Technology(Shenzhen) Co.,Ltd + + + 001A9A + Skyworth Digital Technology(Shenzhen) Co.,Ltd + + + 50F520 + Samsung Electronics Co.,Ltd + + + 64B310 + Samsung Electronics Co.,Ltd + + + A4EBD3 + Samsung Electronics Co.,Ltd + + + B8C68E + Samsung Electronics Co.,Ltd + + + 04FE31 + Samsung Electronics Co.,Ltd + + + 4CBCA5 + Samsung Electronics Co.,Ltd + + + F88E85 + Comtrend Corporation + + + 02CF1C + Communication Machinery Corporation + + + 0090F5 + CLEVO CO. + + + 002100 + Gemtek Technology Co., Ltd. + + + D831CF + Samsung Electronics Co.,Ltd + + + B0D09C + Samsung Electronics Co.,Ltd + + + 50C8E5 + Samsung Electronics Co.,Ltd + + + 188331 + Samsung Electronics Co.,Ltd + + + 9C65B0 + Samsung Electronics Co.,Ltd + + + 8455A5 + Samsung Electronics Co.,Ltd + + + A87C01 + Samsung Electronics Co.,Ltd + + + E01D3B + Cambridge Industries(Group) Co.,Ltd. + + + C81073 + CENTURY OPTICOMM CO.,LTD + + + 343759 + zte corporation + + + FC2F40 + Calxeda, Inc. + + + BC620E + HUAWEI TECHNOLOGIES CO.,LTD + + + 74A528 + HUAWEI TECHNOLOGIES CO.,LTD + + + 0020D4 + Cabletron Systems, Inc. + + + 00E03A + Cabletron Systems, Inc. + + + 70C76F + INNO S + + + 38192F + Nokia Corporation + + + 0010E7 + Breezecom, Ltd. + + + 5CF6DC + Samsung Electronics Co.,Ltd + + + 0026E4 + Canal + + + + 000117 + Canal + + + + F40B93 + BlackBerry RTS + + + 1C69A5 + BlackBerry RTS + + + 94EBCD + BlackBerry RTS + + + 0026FF + BlackBerry RTS + + + A4E4B8 + BlackBerry RTS + + + F87394 + NETGEAR + + + 204E7F + NETGEAR + + + 003067 + BIOSTAR Microtech Int'l Corp. + + + 9492BC + SYNTECH(HK) TECHNOLOGY LIMITED + + + 001A4F + AVM GmbH + + + 001C4A + AVM GmbH + + + 00150C + AVM GmbH + + + 00138F + Asiarock Technology Limited + + + 34C3D2 + FN-LINK TECHNOLOGY LIMITED + + + 54F6C5 + FUJIAN STAR-NET COMMUNICATION CO.,LTD + + + 409558 + Aisino Corporation + + + 182861 + AirTies Wireless Networks + + + 446D57 + Liteon Technology Corporation + + + 9CB70D + Liteon Technology Corporation + + + 68A3C4 + Liteon Technology Corporation + + + 70F1A1 + Liteon Technology Corporation + + + EC086B + TP-LINK TECHNOLOGIES CO.,LTD. + + + 00D9D1 + Sony Interactive Entertainment Inc. + + + B00594 + Liteon Technology Corporation + + + 28E347 + Liteon Technology Corporation + + + 94A1A2 + AMPAK Technology, Inc. + + + 00014A + Sony Corporation + + + 001EDC + Sony Corporation + + + 001D28 + Sony Corporation + + + 8400D2 + Sony Corporation + + + 303926 + Sony Corporation + + + 00EB2D + Sony Corporation + + + B4527D + Sony Corporation + + + 5C338E + Alpha Networks Inc. + + + 983B16 + AMPAK Technology, Inc. + + + 001CA2 + ADB Broadband Italia + + + 002233 + ADB Broadband Italia + + + 3039F2 + ADB Broadband Italia + + + 0017C2 + ADB Broadband Italia + + + 001813 + Sony Corporation + + + 402BA1 + Sony Corporation + + + 9C0E4A + Shenzhen Vastking Electronic Co.,Ltd. + + + A85840 + Cambridge Industries(Group) Co.,Ltd. + + + A0D37A + Intel Corporate + + + 8896F2 + Valeo Schalter und Sensoren GmbH + + + 44D832 + AzureWave Technology Inc. + + + E0B9A5 + AzureWave Technology Inc. + + + 781881 + AzureWave Technology Inc. + + + 6C71D9 + AzureWave Technology Inc. + + + D0E782 + AzureWave Technology Inc. + + + 6CADF8 + AzureWave Technology Inc. + + + A81D16 + AzureWave Technology Inc. + + + B046FC + MitraStar Technology Corp. + + + E04136 + MitraStar Technology Corp. + + + 0015AF + AzureWave Technology Inc. + + + 74F06D + AzureWave Technology Inc. + + + D0D412 + ADB Broadband Italia + + + 0026B8 + Actiontec Electronics, Inc + + + 0026FC + AcSiP Technology Corp. + + + 689C5E + AcSiP Technology Corp. + + + 001073 + TECHNOBOX, INC. + + + 20934D + FUJIAN STAR-NET COMMUNICATION CO.,LTD + + + 009027 + Intel Corporation + + + 00A0C9 + Intel Corporation + + + B80305 + Intel Corporate + + + 3407FB + Ericsson AB + + + A4A1C2 + Ericsson AB + + + E09796 + HUAWEI TECHNOLOGIES CO.,LTD + + + 000D72 + 2Wire Inc + + + 001288 + 2Wire Inc + + + 00217C + 2Wire Inc + + + 001FB3 + 2Wire Inc + + + 28162E + 2Wire Inc + + + F81897 + 2Wire Inc + + + 94C150 + 2Wire Inc + + + 5CF821 + Texas Instruments + + + 141FBA + IEEE Registration Authority + + + 807B85 + IEEE Registration Authority + + + CC1BE0 + IEEE Registration Authority + + + F40E11 + IEEE Registration Authority + + + C48508 + Intel Corporate + + + 6805CA + Intel Corporate + + + 8CA982 + Intel Corporate + + + BC7737 + Intel Corporate + + + 1430C6 + Motorola Mobility LLC, a Lenovo Company + + + 141AA3 + Motorola Mobility LLC, a Lenovo Company + + + 247703 + Intel Corporate + + + 74E50B + Intel Corporate + + + D8FC93 + Intel Corporate + + + 0057D2 + Cisco Systems, Inc + + + 3C6716 + Lily Robotics + + + 2C228B + CTR SRL + + + 0C6F9C + Shaw Communications Inc. + + + 00D0BD + Lattice Semiconductor Corp. (LPA) + + + 001F3A + Hon Hai Precision Ind. Co.,Ltd. + + + 647BD4 + Texas Instruments + + + D8952F + Texas Instruments + + + B8FFFE + Texas Instruments + + + 88074B + LG Electronics (Mobile Communications) + + + C8A030 + Texas Instruments + + + 78C5E5 + Texas Instruments + + + 0CFD37 + SUSE Linux GmbH + + + 10F681 + vivo Mobile Communication Co., Ltd. + + + 04E451 + Texas Instruments + + + 505663 + Texas Instruments + + + 883314 + Texas Instruments + + + 44C15C + Texas Instruments + + + 0022A5 + Texas Instruments + + + 0017E4 + Texas Instruments + + + 002275 + Belkin International Inc. + + + 78E3B5 + Hewlett Packard + + + 78ACC0 + Hewlett Packard + + + 68B599 + Hewlett Packard + + + 1CC1DE + Hewlett Packard + + + 3C3556 + Cognitec Systems GmbH + + + 3C9066 + SmartRG, Inc. + + + 000D88 + D-Link Corporation + + + 001195 + D-Link Corporation + + + B8A386 + D-Link International + + + 1C7EE5 + D-Link International + + + 3CCF5B + ICOMM HK LIMITED + + + 2405F5 + Integrated Device Technology (Malaysia) Sdn. Bhd. + + + 00738D + Shenzhen TINNO Mobile Technology Corp. + + + E043DB + Shenzhen ViewAt Technology Co.,Ltd. + + + F40304 + Google, Inc. + + + 546009 + Google, Inc. + + + A47733 + Google, Inc. + + + 00E0FC + HUAWEI TECHNOLOGIES CO.,LTD + + + 001346 + D-Link Corporation + + + 1CBDB9 + D-Link International + + + 9CDFB1 + Shenzhen Crave Communication Co., LTD + + + 606944 + Apple, Inc. + + + 78F882 + LG Electronics (Mobile Communications) + + + C02C7A + Shenzhen Horn Audio Co.,Ltd. + + + 1CCB99 + TCT mobile ltd + + + A42BB0 + TP-LINK TECHNOLOGIES CO.,LTD. + + + 807ABF + HTC Corporation + + + 34BA75 + Everest Networks, Inc + + + 7C18CD + E-TRON Co.,Ltd. + + + 94ABDE + OMX Technology - FZE + + + 6416F0 + HUAWEI TECHNOLOGIES CO.,LTD + + + ACCF85 + HUAWEI TECHNOLOGIES CO.,LTD + + + 188B45 + Cisco Systems, Inc + + + F4CA24 + FreeBit Co., Ltd. + + + 00142F + Savvius + + + 28BC18 + SourcingOverseas Co. Ltd + + + 00D0B7 + Intel Corporation + + + 3871DE + Apple, Inc. + + + 7081EB + Apple, Inc. + + + 000E35 + Intel Corporation + + + 0007E9 + Intel Corporation + + + 0013E8 + Intel Corporate + + + 0013CE + Intel Corporate + + + B8B81E + Intel Corporate + + + B46D83 + Intel Corporate + + + 2C768A + Hewlett Packard + + + C8348E + Intel Corporate + + + 4C3488 + Intel Corporate + + + 1002B5 + Intel Corporate + + + 001708 + Hewlett Packard + + + 0017A4 + Hewlett Packard + + + BCEAFA + Hewlett Packard + + + 004026 + BUFFALO.INC + + + 4CE676 + BUFFALO.INC + + + 000BCD + Hewlett Packard + + + 000F20 + Hewlett Packard + + + 00110A + Hewlett Packard + + + 1C7839 + Shenzhen Tencent Computer System Co., Ltd. + + + 0453D5 + Sysorex Global Holdings + + + EC52DC + WORLD MEDIA AND TECHNOLOGY Corp. + + + 94B2CC + PIONEER CORPORATION + + + 08EB74 + HUMAX Co., Ltd. + + + 2832C5 + HUMAX Co., Ltd. + + + 88C255 + Texas Instruments + + + CC78AB + Texas Instruments + + + 5820B1 + Hewlett Packard + + + 9457A5 + Hewlett Packard + + + 000EB3 + Hewlett Packard + + + 080009 + Hewlett Packard + + + 0030C1 + Hewlett Packard + + + 0080A0 + Hewlett Packard + + + D48564 + Hewlett Packard + + + 24BE05 + Hewlett Packard + + + FC3FDB + Hewlett Packard + + + 00092D + HTC Corporation + + + 00265C + Hon Hai Precision Ind. Co.,Ltd. + + + 002269 + Hon Hai Precision Ind. Co.,Ltd. + + + D87988 + Hon Hai Precision Ind. Co.,Ltd. + + + 74A78E + zte corporation + + + 7C6193 + HTC Corporation + + + 90E7C4 + HTC Corporation + + + 90CDB6 + Hon Hai Precision Ind. Co.,Ltd. + + + 40490F + Hon Hai Precision Ind. Co.,Ltd. + + + AC162D + Hewlett Packard + + + 80C16E + Hewlett Packard + + + B4B52F + Hewlett Packard + + + D07E28 + Hewlett Packard + + + D0BF9C + Hewlett Packard + + + 308D99 + Hewlett Packard + + + 7446A0 + Hewlett Packard + + + 2C44FD + Hewlett Packard + + + 443192 + Hewlett Packard + + + A0D3C1 + Hewlett Packard + + + 38EAA7 + Hewlett Packard + + + 0452F3 + Apple, Inc. + + + 002127 + TP-LINK TECHNOLOGIES CO.,LTD. + + + EC888F + TP-LINK TECHNOLOGIES CO.,LTD. + + + 6466B3 + TP-LINK TECHNOLOGIES CO.,LTD. + + + F0F336 + TP-LINK TECHNOLOGIES CO.,LTD. + + + BC4699 + TP-LINK TECHNOLOGIES CO.,LTD. + + + F483CD + TP-LINK TECHNOLOGIES CO.,LTD. + + + FCD733 + TP-LINK TECHNOLOGIES CO.,LTD. + + + 5C899A + TP-LINK TECHNOLOGIES CO.,LTD. + + + A81B5A + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + 2C5BB8 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD + + + 902106 + SKY UK LIMITED + + + 889471 + Brocade Communications Systems LLC + + + 8C7CFF + Brocade Communications Systems LLC + + + 5C63BF + TP-LINK TECHNOLOGIES CO.,LTD. + + + E005C5 + TP-LINK TECHNOLOGIES CO.,LTD. + + + 388345 + TP-LINK TECHNOLOGIES CO.,LTD. + + + 98F537 + zte corporation + + + 001FE2 + Hon Hai Precision Ind. Co.,Ltd. + + + 0016CF + Hon Hai Precision Ind. Co.,Ltd. + + + 2002AF + Murata Manufacturing Co., Ltd. + + + 0021E8 + Murata Manufacturing Co., Ltd. + + + 000E6D + Murata Manufacturing Co., Ltd. + + + D02788 + Hon Hai Precision Ind. Co.,Ltd. + + + 904CE5 + Hon Hai Precision Ind. Co.,Ltd. + + + 142D27 + Hon Hai Precision Ind. Co.,Ltd. + + + 5C4CA9 + HUAWEI TECHNOLOGIES CO.,LTD + + + F4C714 + HUAWEI TECHNOLOGIES CO.,LTD + + + 286ED4 + HUAWEI TECHNOLOGIES CO.,LTD + + + 001E10 + HUAWEI TECHNOLOGIES CO.,LTD + + + D47856 + Avaya Inc + + + A01290 + Avaya Inc + + + D842AC + Shanghai Feixun Communication Co.,Ltd. + + + 5439DF + HUAWEI TECHNOLOGIES CO.,LTD + + + 74882A + HUAWEI TECHNOLOGIES CO.,LTD + + + 88E3AB + HUAWEI TECHNOLOGIES CO.,LTD + + + C40528 + HUAWEI TECHNOLOGIES CO.,LTD + + + 3CDFBD + HUAWEI TECHNOLOGIES CO.,LTD + + + 509F27 + HUAWEI TECHNOLOGIES CO.,LTD + + + 8C34FD + HUAWEI TECHNOLOGIES CO.,LTD + + + 587F66 + HUAWEI TECHNOLOGIES CO.,LTD + + + 64A651 + HUAWEI TECHNOLOGIES CO.,LTD + + + CCF954 + Avaya Inc + + + 2CF4C5 + Avaya Inc + + + 3C3A73 + Avaya Inc + + + FC8399 + Avaya Inc + + + 283CE4 + HUAWEI TECHNOLOGIES CO.,LTD + + + 086361 + HUAWEI TECHNOLOGIES CO.,LTD + + + 38BB3C + Avaya Inc + + + F873A2 + Avaya Inc + + + 80717A + HUAWEI TECHNOLOGIES CO.,LTD + + + D4970B + Xiaomi Communications Co Ltd + + + 8CBEBE + Xiaomi Communications Co Ltd + + + 14F65A + Xiaomi Communications Co Ltd + + + 009EC8 + Xiaomi Communications Co Ltd + + + 0C1DAF + Xiaomi Communications Co Ltd + + + 3480B3 + Xiaomi Communications Co Ltd + + + F48B32 + Xiaomi Communications Co Ltd + + + F4B85E + Texas Instruments + + + 68C90B + Texas Instruments + + + D4F513 + Texas Instruments + + + 507224 + Texas Instruments + + + ACF7F3 + Xiaomi Communications Co Ltd + + + 0819A6 + HUAWEI TECHNOLOGIES CO.,LTD + + + 3CF808 + HUAWEI TECHNOLOGIES CO.,LTD + + + 486276 + HUAWEI TECHNOLOGIES CO.,LTD + + + B41513 + HUAWEI TECHNOLOGIES CO.,LTD + + + AC4E91 + HUAWEI TECHNOLOGIES CO.,LTD + + + 283152 + HUAWEI TECHNOLOGIES CO.,LTD + + + 009021 + Cisco Systems, Inc + + + 0090B1 + Cisco Systems, Inc + + + 04BD70 + HUAWEI TECHNOLOGIES CO.,LTD + + + 001AB6 + Texas Instruments + + + 0012D1 + Texas Instruments + + + 001237 + Texas Instruments + + + 00102F + Cisco Systems, Inc + + + 00100D + Cisco Systems, Inc + + + 001007 + Cisco Systems, Inc + + + 001014 + Cisco Systems, Inc + + + 00400B + Cisco Systems, Inc + + + 0090BF + Cisco Systems, Inc + + + 0050D1 + Cisco Systems, Inc + + + 0090D9 + Cisco Systems, Inc + + + 009092 + Cisco Systems, Inc + + + A0E6F8 + Texas Instruments + + + 70FF76 + Texas Instruments + + + D03972 + Texas Instruments + + + 5C313E + Texas Instruments + + + 006070 + Cisco Systems, Inc + + + 00E01E + Cisco Systems, Inc + + + 1CE6C7 + Cisco Systems, Inc + + + 00112F + ASUSTek COMPUTER INC. + + + 18E728 + Cisco Systems, Inc + + + D072DC + Cisco Systems, Inc + + + 28C7CE + Cisco Systems, Inc + + + F40F1B + Cisco Systems, Inc + + + F8C288 + Cisco Systems, Inc + + + BCAEC5 + ASUSTek COMPUTER INC. + + + 10BF48 + ASUSTek COMPUTER INC. + + + 6C9989 + Cisco Systems, Inc + + + 1C6A7A + Cisco Systems, Inc + + + 5067AE + Cisco Systems, Inc + + + F09E63 + Cisco Systems, Inc + + + 001BFC + ASUSTek COMPUTER INC. + + + 485B39 + ASUSTek COMPUTER INC. + + + CCD539 + Cisco Systems, Inc + + + 500604 + Cisco Systems, Inc + + + 4C0082 + Cisco Systems, Inc + + + 7C95F3 + Cisco Systems, Inc + + + 34DBFD + Cisco Systems, Inc + + + 885A92 + Cisco Systems, Inc + + + 046C9D + Cisco Systems, Inc + + + 84B261 + Cisco Systems, Inc + + + 00101F + Cisco Systems, Inc + + + 54A274 + Cisco Systems, Inc + + + A0554F + Cisco Systems, Inc + + + 204C9E + Cisco Systems, Inc + + + 84B802 + Cisco Systems, Inc + + + B0AA77 + Cisco Systems, Inc + + + BCC493 + Cisco Systems, Inc + + + A46C2A + Cisco Systems, Inc + + + D0A5A6 + Cisco Systems, Inc + + + 3C5EC3 + Cisco Systems, Inc + + + 64F69D + Cisco Systems, Inc + + + 000389 + PLANTRONICS, INC. + + + 484487 + Cisco SPVTG + + + 38C85C + Cisco SPVTG + + + E448C7 + Cisco SPVTG + + + 001217 + Cisco-Linksys, LLC + + + 001310 + Cisco-Linksys, LLC + + + 001EE5 + Cisco-Linksys, LLC + + + 001D4F + Apple, Inc. + + + 002312 + Apple, Inc. + + + 80E01D + Cisco Systems, Inc + + + 000A27 + Apple, Inc. + + + 3451C9 + Apple, Inc. + + + 406C8F + Apple, Inc. + + + D023DB + Apple, Inc. + + + 70DEE2 + Apple, Inc. + + + F0CBA1 + Apple, Inc. + + + 182032 + Apple, Inc. + + + 60FACD + Apple, Inc. + + + 003EE1 + Apple, Inc. + + + FC253F + Apple, Inc. + + + 183451 + Apple, Inc. + + + 0C771A + Apple, Inc. + + + D8A25E + Apple, Inc. + + + 5855CA + Apple, Inc. + + + DC2B61 + Apple, Inc. + + + 40A6D9 + Apple, Inc. + + + 286ABA + Apple, Inc. + + + 4CB199 + Apple, Inc. + + + C09F42 + Apple, Inc. + + + 705681 + Apple, Inc. + + + 04F7E4 + Apple, Inc. + + + 34C059 + Apple, Inc. + + + F0D1A9 + Apple, Inc. + + + 040CCE + Apple, Inc. + + + 403CFC + Apple, Inc. + + + 4860BC + Apple, Inc. + + + AC3C0B + Apple, Inc. + + + 701124 + Apple, Inc. + + + 60FB42 + Apple, Inc. + + + 64B9E8 + Apple, Inc. + + + 14109F + Apple, Inc. + + + 042665 + Apple, Inc. + + + EC3586 + Apple, Inc. + + + 54EAA8 + Apple, Inc. + + + 28E14C + Apple, Inc. + + + E4C63D + Apple, Inc. + + + 54E43A + Apple, Inc. + + + 04DB56 + Apple, Inc. + + + DC9B9C + Apple, Inc. + + + 54724F + Apple, Inc. + + + 8C7C92 + Apple, Inc. + + + B03495 + Apple, Inc. + + + F437B7 + Apple, Inc. + + + 78FD94 + Apple, Inc. + + + 2CBE08 + Apple, Inc. + + + E8802E + Apple, Inc. + + + 006171 + Apple, Inc. + + + 04E536 + Apple, Inc. + + + A8BBCF + Apple, Inc. + + + AC7F3E + Apple, Inc. + + + 20A2E4 + Apple, Inc. + + + BC4CC4 + Apple, Inc. + + + 280B5C + Apple, Inc. + + + ACFDEC + Apple, Inc. + + + D8CF9C + Apple, Inc. + + + DC3714 + Apple, Inc. + + + 6C4008 + Apple, Inc. + + + 28F076 + Apple, Inc. + + + FCA386 + SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD + + + 40331A + Apple, Inc. + + + CCC760 + Apple, Inc. + + + 141357 + ATP Electronics, Inc. + + + FCCF43 + HUIZHOU CITY HUIYANG DISTRICT MEISIQI INDUSTRY DEVELOPMENT CO,.LTD + + + B4EF04 + DAIHAN Scientific Co., Ltd. + + + A4DEC9 + QLove Mobile Intelligence Information Technology (W.H.) Co. Ltd. + + + CCE0C3 + EXTEN Technologies, Inc. + + + D848EE + Hangzhou Xueji Technology Co., Ltd. + + + 4C8ECC + SILKAN SA + + + B8B2EB + Googol Technology (HK) Limited + + + 646A74 + AUTH-SERVERS, LLC + + + 7C7176 + Wuxi iData Technology Company Ltd. + + + 7C0191 + Apple, Inc. + + + 0C54B9 + Nokia + + + 98E848 + Axiim + + + 2C1BC8 + Hunan Topview Network System CO.,LTD + + + A8474A + Hon Hai Precision Ind. Co.,Ltd. + + + C40049 + Kamama + + + AC6462 + zte corporation + + + A01E0B + MINIX Technology Limited + + + 68E8EB + Linktel Technologies Co.,Ltd + + + 4040A7 + Sony Corporation + + + C04A09 + Zhejiang Everbright Communication Equip. Co,. Ltd + + + 84100D + Motorola Mobility LLC, a Lenovo Company + + + D00F6D + T&W Electronics Company + + + 48137E + Samsung Electronics Co.,Ltd + + + 908D78 + D-Link International + + + E435C8 + HUAWEI TECHNOLOGIES CO.,LTD + + + 80D605 + Apple, Inc. + + + 089B4B + iKuai Networks + + + A845CD + Siselectron Technology LTD. + + + D0C193 + SKYBELL, INC + + + D48304 + SHENZHEN FAST TECHNOLOGIES CO.,LTD + + + E80734 + Champion Optical Network Engineering, LLC + + + 30F772 + Hon Hai Precision Ind. Co.,Ltd. + + + DC3CF6 + Atomic Rules LLC + + + 4473D6 + Logitech + + + 10CC1B + Liverock technologies,INC + + + A43831 + RF elements s.r.o. + + + 380546 + Foctek Photonics, Inc. + + + DC2B2A + Apple, Inc. + + + 9C8DD3 + Leonton Technologies + + + E41A2C + ZPE Systems, Inc. + + + E8BDD1 + HUAWEI TECHNOLOGIES CO.,LTD + + + F41535 + SPON Communication Technology Co.,Ltd + + + 380AAB + Formlabs + + + 382DE8 + Samsung Electronics Co.,Ltd + + + C08997 + Samsung Electronics Co.,Ltd + + + A815D6 + Shenzhen Meione Technology CO., LTD + + + C07CD1 + PEGATRON CORPORATION + + + 90D8F3 + zte corporation + + + D445E8 + Jiangxi Hongpai Technology Co., Ltd. + + + 30A243 + Shenzhen Prifox Innovation Technology Co., Ltd. + + + 342606 + CarePredict, Inc. + + + 38B725 + Wistron Infocomm (Zhongshan) Corporation + + + 6C7220 + D-Link International + + + 28B9D9 + Radisys Corporation + + + AC676F + Electrocompaniet A.S. + + + E0553D + Cisco Meraki + + + 640DE6 + Petra Systems + + + F4C613 + Alcatel-Lucent Shanghai Bell Co., Ltd + + + 445F8C + Intercel Group Limited + + + FC335F + Polyera + + + 84D4C8 + Widex A/S + + + EC21E5 + Toshiba + + + 380195 + Samsung Electronics Co.,Ltd + + + 44975A + SHENZHEN FAST TECHNOLOGIES CO.,LTD + + + 5045F7 + Liuhe Intelligence Technology Ltd. + + + B88981 + Chengdu InnoThings Technology Co., Ltd. + + + 949F3E + Sonos, Inc. + + + 04C23E + HTC Corporation + + + E01AEA + Allied Telesis, Inc. + + + 3089D3 + HONGKONG UCLOUDLINK NETWORK TECHNOLOGY LIMITED + + + 5CB395 + HUAWEI TECHNOLOGIES CO.,LTD + + + 906CAC + Fortinet, Inc. + + + DCA3AC + RBcloudtech + + + F02624 + WAFA TECHNOLOGIES CO., LTD. + + + F8F464 + Rawe Electonic GmbH + + + D00492 + Fiberhome Telecommunication Technologies Co.,LTD + + + 5C5188 + Motorola Mobility LLC, a Lenovo Company + + + EC0133 + TRINUS SYSTEMS INC. + + + 00FC8D + Hitron Technologies. Inc + + + A013CB + Fiberhome Telecommunication Technologies Co.,LTD + + + 58F102 + BLU Products Inc. + + + 2CC548 + IAdea Corporation + + + 0CE725 + Microsoft Corporation + + + 14DDA9 + ASUSTek COMPUTER INC. + + + 184F32 + Hon Hai Precision Ind. Co.,Ltd. + + + DC15DB + Ge Ruili Intelligent Technology ( Beijing ) Co., Ltd. + + + 84DF19 + Chuango Security Technology Corporation + + + 30F335 + HUAWEI TECHNOLOGIES CO.,LTD + + + B46D35 + Dalian Seasky Automation Co;Ltd + + + 1816C9 + Samsung Electronics Co.,Ltd + + + 842E27 + Samsung Electronics Co.,Ltd + + + 1CADD1 + Bosung Electronics Co., Ltd. + + + 082CB0 + Network Instruments + + + E0DB10 + Samsung Electronics Co.,Ltd + + + 546172 + ZODIAC AEROSPACE SAS + + + EC60E0 + AVI-ON LABS + + + 3CDA2A + zte corporation + + + 1432D1 + Samsung Electronics Co.,Ltd + + + 3CA31A + Oilfind International LLC + + + E8F2E3 + Starcor Beijing Co.,Limited + + + 343D98 + JinQianMao Technology Co.,Ltd. + + + F44713 + Leading Public Performance Co., Ltd. + + + 601970 + HUIZHOU QIAOXING ELECTRONICS TECHNOLOGY CO., LTD. + + + A408EA + Murata Manufacturing Co., Ltd. + + + A8D409 + USA 111 Inc + + + 6C4598 + Antex Electronic Corp. + + + 68A378 + FREEBOX SAS + + + 340A22 + TOP-ACCESS ELECTRONICS CO LTD + + + E866C4 + Diamanti + + + D4D7A9 + Shanghai Kaixiang Info Tech LTD + + + 6C4418 + Zappware + + + 6459F8 + Vodafone Omnitel B.V. + + + D083D4 + Xtel Wireless ApS + + + F02A23 + Creative Next Design + + + 584704 + Shenzhen Webridge Technology Co.,Ltd + + + 5CA178 + TableTop Media (dba Ziosk) + + + 9CBEE0 + Biosoundlab Co., Ltd. + + + 0C413E + Microsoft Corporation + + + 807459 + K's Co.,Ltd. + + + E4695A + Dictum Health, Inc. + + + 7C7A53 + Phytrex Technology Corp. + + + 107873 + Shenzhen Jinkeyi Communication Co., Ltd. + + + 48EE0C + D-Link International + + + 70AD54 + Malvern Instruments Ltd + + + 9000DB + Samsung Electronics Co.,Ltd + + + B4EF39 + Samsung Electronics Co.,Ltd + + + B87879 + Roche Diagnostics GmbH + + + D06F4A + TOPWELL INTERNATIONAL HOLDINGS LIMITED + + + 0492EE + iway AG + + + 7C534A + Metamako + + + BCB308 + HONGKONG RAGENTEK COMMUNICATION TECHNOLOGY CO.,LIMITED + + + BC6E64 + Sony Corporation + + + 6C2E72 + B&B EXPORTING LIMITED + + + 5CCCFF + Techroutes Network Pvt Ltd + + + FC3288 + CELOT Wireless Co., Ltd + + + D87495 + zte corporation + + + EC3C88 + MCNEX Co.,Ltd. + + + 08D34B + Techman Electronics (Changshu) Co., Ltd. + + + 78A351 + SHENZHEN ZHIBOTONG ELECTRONICS CO.,LTD + + + 90C35F + Nanjing Jiahao Technology Co., Ltd. + + + C808E9 + LG Electronics + + + E4FED9 + EDMI Europe Ltd + + + 5CF7C3 + SYNTECH (HK) TECHNOLOGY LIMITED + + + ECE2FD + SKG Electric Group(Thailand) Co., Ltd. + + + 183A2D + Samsung Electronics Co.,Ltd + + + EC74BA + Hirschmann Automation and Control GmbH + + + 74A063 + HUAWEI TECHNOLOGIES CO.,LTD + + + 5C3B35 + Gehirn Inc. + + + 545146 + AMG Systems Ltd. + + + 8463D6 + Microsoft Corporation + + + BC4DFB + Hitron Technologies. Inc + + + 2C337A + Hon Hai Precision Ind. Co.,Ltd. + + + 7076FF + KERLINK + + + 1436C6 + Lenovo Mobile Communication Technology Ltd. + + + BCE767 + Quanzhou TDX Electronics Co., Ltd + + + 344CA4 + amazipoint technology Ltd. + + + 148F21 + Garmin International + + + 9C685B + Octonion SA + + + 9CE230 + JULONG CO,.LTD. + + + 5C41E7 + Wiatec International Ltd. + + + A8F038 + SHEN ZHEN SHI JIN HUA TAI ELECTRONICS CO.,LTD + + + ACC73F + VITSMO CO., LTD. + + + 44356F + Neterix Ltd + + + BC54F9 + Drogoo Technology Co., Ltd. + + + 78FC14 + Family Zone Cyber Safety Ltd + + + 3809A4 + Firefly Integrations + + + 74E277 + Vizmonet Pte Ltd + + + 14893E + VIXTEL TECHNOLOGIES LIMTED + + + FCAFAC + Socionext Inc. + + + 382C4A + ASUSTek COMPUTER INC. + + + 08EFAB + SAYME WIRELESS SENSOR NETWORK + + + 3C1E13 + HANGZHOU SUNRISE TECHNOLOGY CO., LTD + + + 049B9C + Eadingcore Intelligent Technology Co., Ltd. + + + 842690 + BEIJING THOUGHT SCIENCE CO.,LTD. + + + 84DDB7 + Cilag GmbH International + + + CCBDD3 + Ultimaker B.V. + + + 8CE78C + DK Networks + + + C09879 + Acer Inc. + + + 307350 + Inpeco SA + + + DCEC06 + Heimi Network Technology Co., Ltd. + + + EC13B2 + Netonix + + + 104E07 + Shanghai Genvision Industries Co.,Ltd + + + F03D29 + Actility + + + 88708C + Lenovo Mobile Communication Technology Ltd. + + + 08115E + Bitel Co., Ltd. + + + 0881BC + HongKong Ipro Technology Co., Limited + + + 5014B5 + Richfit Information Technology Co., Ltd + + + 3428F0 + ATN International Limited + + + CC10A3 + Beijing Nan Bao Technology Co., Ltd. + + + 14EDE4 + Kaiam Corporation + + + CC3F1D + HMS Industrial Networks SLU + + + DCDA4F + GETCK TECHNOLOGY, INC + + + 801967 + Shanghai Reallytek Information Technology Co.,Ltd + + + 2CF7F1 + Seeed Technology Inc. + + + 101218 + Korins Inc. + + + B84FD5 + Microsoft Corporation + + + D84A87 + OI ELECTRIC CO.,LTD + + + D01242 + BIOS Corporation + + + 603696 + The Sapling Company + + + F4F26D + TP-LINK TECHNOLOGIES CO.,LTD. + + + ACB74F + METEL s.r.o. + + + CCF538 + 3isysnetworks + + + C0EEFB + OnePlus Tech (Shenzhen) Ltd + + + 54FFCF + Mopria Alliance + + + B8BD79 + TrendPoint Systems + + + 304225 + BURG-WÄCHTER KG + + + FCDBB3 + Murata Manufacturing Co., Ltd. + + + 404EEB + Higher Way Electronic Co., Ltd. + + + C456FE + Lava International Ltd. + + + 74F413 + Maxwell Forest + + + A00627 + NEXPA System + + + 303335 + Boosty + + + F4D261 + SEMOCON Co., Ltd + + + B009D3 + Avizia + + + 9CAD97 + Hon Hai Precision Ind. Co.,Ltd. + + + BC9CC5 + Beijing Huafei Technology Co., Ltd. + + + 94D60E + shenzhen yunmao information technologies co., ltd + + + 506787 + Planet Networks + + + 5CB8CB + Allis Communications + + + 34F0CA + Shenzhen Linghangyuan Digital Technology Co.,Ltd. + + + 44746C + Sony Corporation + + + 4C9EFF + Zyxel Communications Corporation + + + 6C2F2C + Samsung Electronics Co.,Ltd + + + 8CBF9D + Shanghai Xinyou Information Technology Ltd. Co. + + + 70720D + Lenovo Mobile Communication Technology Ltd. + + + 3CCD5A + Technische Alternative GmbH + + + 48D855 + Telvent + + + 08F728 + GLOBO Multimedia Sp. z o.o. Sp.k. + + + 206E9C + Samsung Electronics Co.,Ltd + + + BC25F0 + 3D Display Technologies Co., Ltd. + + + C03D46 + Shanghai Sango Network Technology Co.,Ltd + + + 64EAC5 + SiboTech Automation Co., Ltd. + + + 60C1CB + Fujian Great Power PLC Equipment Co.,Ltd + + + 882950 + Netmoon Technology Co., Ltd + + + 7CE524 + Quirky, Inc. + + + 74DA38 + Edimax Technology Co. Ltd. + + + 30F7D7 + Thread Technology Co., Ltd + + + 18227E + Samsung Electronics Co.,Ltd + + + 30C7AE + Samsung Electronics Co.,Ltd + + + 90AE1B + TP-LINK TECHNOLOGIES CO.,LTD. + + + 60E327 + TP-LINK TECHNOLOGIES CO.,LTD. + + + 44D4E0 + Sony Corporation + + + D4B43E + Messcomp Datentechnik GmbH + + + CCA0E5 + DZG Metering GmbH + + + 60812B + Astronics Custom Control Concepts + + + F86601 + Suzhou Chi-tek information technology Co., Ltd + + + 145645 + Savitech Corp. + + + 1C1CFD + Dalian Hi-Think Computer Technology, Corp + + + 48D18E + Metis Communication Co.,Ltd + + + 6C2C06 + OOO NPP Systemotechnika-NN + + + C4913A + Shenzhen Sanland Electronic Co., ltd. + + + 7062B8 + D-Link International + + + ACA919 + TrekStor GmbH + + + C44E1F + BlueN + + + B0869E + Chloride S.r.L + + + D057A1 + Werma Signaltechnik GmbH & Co. KG + + + B4B542 + Hubbell Power Systems, Inc. + + + 64E892 + Morio Denki Co., Ltd. + + + 88E8F8 + YONG TAI ELECTRONIC (DONGGUAN) LTD. + + + 909864 + Impex-Sat GmbH&amp;Co KG + + + DCE578 + Experimental Factory of Scientific Engineering and Special Design Department + + + 38F098 + Vapor Stone Rail Systems + + + 54CDEE + ShenZhen Apexis Electronic Co.,Ltd + + + E8FC60 + ELCOM Innovations Private Limited + + + 9451BF + Hyundai ESG + + + F015A0 + KyungDong One Co., Ltd. + + + 1CAB01 + Innovolt + + + B0DA00 + CERA ELECTRONIQUE + + + D8B6D6 + Blu Tether Limited + + + 94C014 + Sorter Sp. j. Konrad Grzeszczyk MichaA, Ziomek + + + 9CFBF1 + MESOMATIC GmbH & Co.KG + + + 1027BE + TVIP + + + 2087AC + AES motomation + + + 709383 + Intelligent Optical Network High Tech CO.,LTD. + + + 80D433 + LzLabs GmbH + + + 8C41F2 + RDA Technologies Ltd. + + + E036E3 + Stage One International Co., Ltd. + + + 242642 + SHARP Corporation. + + + 34DE34 + zte corporation + + + FC1607 + Taian Technology(Wuxi) Co.,Ltd. + + + AC02CA + HI Solutions, Inc. + + + 04DB8A + Suntech International Ltd. + + + 90DFB7 + s.m.s smart microwave sensors GmbH + + + 085700 + TP-LINK TECHNOLOGIES CO.,LTD. + + + F85C45 + IC Nexus Co. Ltd. + + + ACE069 + ISAAC Instruments + + + 30B5C2 + TP-LINK TECHNOLOGIES CO.,LTD. + + + FC27A2 + TRANS ELECTRIC CO., LTD. + + + FCBBA1 + Shenzhen Minicreate Technology Co.,Ltd + + + F08A28 + JIANGSU HENGSION ELECTRONIC S and T CO.,LTD + + + 28BB59 + RNET Technologies, Inc. + + + E8EA6A + StarTech.com + + + D86595 + Toy's Myth Inc. + + + C0F79D + Powercode + + + C4C919 + Energy Imports Ltd + + + D8DD5F + BALMUDA Inc. + + + E07F53 + TECHBOARD SRL + + + 48FEEA + HOMA B.V. + + + 746F3D + Contec GmbH + + + 4C0DEE + JABIL CIRCUIT (SHANGHAI) LTD. + + + D0634D + Meiko Maschinenbau GmbH &amp; Co. KG + + + D86194 + Objetivos y Sevicios de Valor Añadido + + + 589CFC + FreeBSD Foundation + + + 702C1F + Wisol + + + DC052F + National Products Inc. + + + 008B43 + RFTECH + + + C8D429 + Muehlbauer AG + + + 8C569D + Imaging Solutions Group + + + 40B6B1 + SUNGSAM CO,.Ltd + + + E86183 + Black Diamond Advanced Technology, LLC + + + 38C9A9 + SMART High Reliability Solutions, Inc. + + + 8CDE99 + Comlab Inc. + + + 4CE1BB + Zhuhai HiFocus Technology Co., Ltd. + + + 24A87D + Panasonic Automotive Systems Asia Pacific(Thailand)Co.,Ltd. + + + 84FE9E + RTC Industries, Inc. + + + FC4B1C + INTERSENSOR S.R.L. + + + 403067 + Conlog (Pty) Ltd + + + 600347 + Billion Electric Co. Ltd. + + + F81CE5 + Telefonbau Behnke GmbH + + + EC71DB + Reolink Innovation Limited + + + A409CB + Alfred Kaercher GmbH &amp; Co KG + + + 501AC5 + Microsoft + + + B0989F + LG CNS + + + C0F1C4 + Pacidal Corporation Ltd. + + + 14EDA5 + Wächter GmbH Sicherheitssysteme + + + D0BD01 + DS International + + + 085240 + EbV Elektronikbau- und Vertriebs GmbH + + + B8C1A2 + Dragon Path Technologies Co., Limited + + + 80F25E + Kyynel + + + 889166 + Viewcooper Corp. + + + 38A53C + COMECER Netherlands + + + 5CFFFF + Shenzhen Kezhonglong Optoelectronic Technology Co., Ltd + + + 68692E + Zycoo Co.,Ltd + + + D46867 + Neoventus Design Group + + + 9C216A + TP-LINK TECHNOLOGIES CO.,LTD. + + + F862AA + xn systems + + + A4059E + STA Infinity LLP + + + 44EE30 + Budelmann Elektronik GmbH + + + FC1E16 + IPEVO corp + + + 3051F8 + BYK-Gardner GmbH + + + E8F226 + MILLSON CUSTOM SOLUTIONS INC. + + + 3C6E63 + Mitron OY + + + 103378 + FLECTRON Co., LTD + + + F0D3A7 + CobaltRay Co., Ltd + + + 2C18AE + Trend Electronics Co., Ltd. + + + 50C006 + Carmanah Signs + + + A4E9A3 + Honest Technology Co., Ltd + + + A0E5E9 + enimai Inc + + + 04CB1D + Traka plc + + + C0C687 + Cisco SPVTG + + + C49380 + Speedytel technology + + + 007DFA + Volkswagen Group of America + + + E0AEB2 + Bender GmbH &amp; Co.KG + + + F84A7F + Innometriks Inc + + + 0C9B13 + Shanghai Magic Mobile Telecommunication Co.Ltd. + + + 107BEF + Zyxel Communications Corporation + + + B462AD + Elysia Germany GmbH + + + 2C7155 + HiveMotion + + + 20180E + Shenzhen Sunchip Technology Co., Ltd + + + 80B219 + ELEKTRON TECHNOLOGY UK LIMITED + + + 2894AF + Samhwa Telecom + + + B4750E + Belkin International Inc. + + + 94103E + Belkin International Inc. + + + 7CB733 + ASKEY COMPUTER CORP + + + 345C40 + Cargt Holdings LLC + + + 74A4B5 + Powerleader Science and Technology Co. Ltd. + + + 909F43 + Accutron Instruments Inc. + + + AC5036 + Pi-Coral Inc + + + C4D655 + Tercel technology co.,ltd + + + 58BDF9 + Sigrand + + + 2464EF + CYG SUNRI CO.,LTD. + + + D8270C + MaxTronic International Co., Ltd. + + + 68193F + Digital Airways + + + B4CCE9 + PROSYST + + + A0BF50 + S.C. ADD-PRODUCTION S.R.L. + + + E8D4E0 + Beijing BenyWave Technology Co., Ltd. + + + FC019E + VIEVU + + + 642184 + Nippon Denki Kagaku Co.,LTD + + + 94BF1E + eflow Inc. / Smart Device Planning and Development Division + + + E8516E + TSMART Inc. + + + AC220B + ASUSTek COMPUTER INC. + + + B887A8 + Step Ahead Innovations Inc. + + + 8C4B59 + 3D Imaging & Simulations Corp + + + 5C3327 + Spazio Italia srl + + + E0A198 + NOJA Power Switchgear Pty Ltd + + + 88354C + Transics + + + 507691 + Tekpea, Inc. + + + CC4AE1 + fourtec -Fourier Technologies + + + 28F532 + ADD-Engineering BV + + + 9440A2 + Anywave Communication Technologies, Inc. + + + 384233 + Wildeboer Bauteile GmbH + + + C034B4 + Gigastone Corporation + + + 303EAD + Sonavox Canada Inc + + + F835DD + Gemtek Technology Co., Ltd. + + + D8B04C + Jinan USR IOT Technology Co., Ltd. + + + E8519D + Yeonhab Precision Co.,LTD + + + 1C86AD + MCT CO., LTD. + + + 28D93E + Telecor Inc. + + + 640B4A + Digital Telecom Technology Limited + + + 70F176 + Data Modul AG + + + CCE8AC + SOYEA Technology Co.,Ltd. + + + CC04B4 + Select Comfort + + + 5C15E1 + AIDC TECHNOLOGY (S) PTE LTD + + + B847C6 + SanJet Technology Corp. + + + B8CD93 + Penetek, Inc + + + 3806B4 + A.D.C. GmbH + + + B8241A + SWEDA INFORMATICA LTDA + + + A0B100 + ShenZhen Cando Electronics Co.,Ltd + + + 201D03 + Elatec GmbH + + + C06C6D + MagneMotion, Inc. + + + B8C855 + Shanghai GBCOM Communication Technology Co.,Ltd. + + + 78303B + Stephen Technologies Co.,Limited + + + 40BC73 + Cronoplast S.L. + + + 4007C0 + Railtec Systems GmbH + + + 84E4D9 + Shenzhen NEED technology Ltd. + + + 784B08 + f.robotics acquisitions ltd + + + B0808C + Laser Light Engines + + + E880D8 + GNTEK Electronics Co.,Ltd. + + + D866C6 + Shenzhen Daystar Technology Co.,ltd + + + D00EA4 + Porsche Cars North America + + + 188857 + Beijing Jinhong Xi-Dian Information Technology Corp. + + + E4776B + AARTESYS AG + + + 30F31D + zte corporation + + + A0EC80 + zte corporation + + + 28DB81 + Shanghai Guao Electronic Technology Co., Ltd + + + 0CC81F + Summer Infant, Inc. + + + A8FB70 + WiseSec L.t.d + + + E481B3 + Shenzhen ACT Industrial Co.,Ltd. + + + 1C4AF7 + AMON INC + + + D8DCE9 + Kunshan Erlab ductless filtration system Co.,Ltd + + + DCD52A + Sunny Heart Limited + + + A4D3B5 + GLITEL Stropkov, s.r.o. + + + 44619C + FONsystem co. ltd. + + + 88685C + Shenzhen ChuangDao & Perpetual Eternal Technology Co.,Ltd + + + 102831 + Morion Inc. + + + DC5726 + Power-One + + + F8DADF + EcoTech, Inc. + + + 30AE7B + Deqing Dusun Electron CO., LTD + + + 68EC62 + YODO Technology Corp. Ltd. + + + 1C76CA + Terasic Technologies Inc. + + + F499AC + WEBER Schraubautomaten GmbH + + + D43A65 + IGRS Engineering Lab Ltd. + + + 7CD844 + Enmotus Inc + + + 70820E + as electronics GmbH + + + 888964 + GSI Electronics Inc. + + + 0C1105 + AKUVOX (XIAMEN) NETWORKS CO., LTD + + + 5C22C4 + DAE EUN ELETRONICS CO., LTD + + + F8FEA8 + Technico Japan Corporation + + + 1800DB + Fitbit Inc. + + + 78A106 + TP-LINK TECHNOLOGIES CO.,LTD. + + + D05099 + ASRock Incorporation + + + A49EDB + AutoCrib, Inc. + + + 6C8B2F + zte corporation + + + CC1AFA + zte corporation + + + 8C5AF0 + Exeltech Solar Products + + + 6C6126 + Rinicom Holdings + + + CC047C + G-WAY Microwave + + + 50ABBF + Hoseo Telecom + + + B4FE8C + Centro Sicurezza Italia SpA + + + 2CF203 + EMKO ELEKTRONIK SAN VE TIC AS + + + 185AE8 + Zenotech.Co.,Ltd + + + C47DCC + Zebra Technologies Inc + + + E0AEED + LOENK + + + E492E7 + Gridlink Tech. Co.,Ltd. + + + 1C37BF + Cloudium Systems Ltd. + + + D82916 + Ascent Communication Technology + + + A073FC + Rancore Technologies Private Limited + + + 64535D + Frauscher Sensortechnik + + + 40E730 + DEY Storage Systems, Inc. + + + 68B094 + INESA ELECTRON CO.,LTD + + + 44F849 + Union Pacific Railroad + + + CC0DEC + Cisco SPVTG + + + 2C7B5A + Milper Ltd + + + 0C722C + TP-LINK TECHNOLOGIES CO.,LTD. + + + FC9FAE + Fidus Systems Inc + + + 681E8B + InfoSight Corporation + + + F8D7BF + REV Ritter GmbH + + + 48BE2D + Symanitron + + + F02329 + SHOWA DENKI CO.,LTD. + + + 5461EA + Zaplox AB + + + D08B7E + Passif Semiconductor + + + 04586F + Sichuan Whayer information industry Co.,LTD + + + D4BF2D + SE Controls Asia Pacific Ltd + + + 9CE635 + Nintendo Co., Ltd. + + + 60A44C + ASUSTek COMPUTER INC. + + + E0D9A2 + Hippih aps + + + FC0647 + Cortland Research, LLC + + + D052A8 + Physical Graph Corporation + + + CC3A61 + SAMSUNG ELECTRO MECHANICS CO., LTD. + + + 3C6FF7 + EnTek Systems, Inc. + + + 6CD146 + FRAMOS GmbH + + + 3C57D5 + FiveCo + + + F073AE + PEAK-System Technik + + + 48B8DE + HOMEWINS TECHNOLOGY CO.,LTD. + + + 10EA59 + Cisco SPVTG + + + 0C191F + Inform Electronik + + + 98208E + Definium Technologies + + + 704AE4 + Rinstrum Pty Ltd + + + 083AB8 + Shinoda Plasma Co., Ltd. + + + A0DD97 + PolarLink Technologies, Ltd + + + E4A7FD + Cellco Partnership + + + 2CE2A8 + DeviceDesign + + + 60C5A8 + Beijing LT Honway Technology Co.,Ltd + + + B4DF3B + Chromlech + + + A845E9 + Firich Enterprises CO., LTD. + + + 7C9A9B + VSE valencia smart energy + + + 645A04 + Chicony Electronics Co., Ltd. + + + AC1702 + Fibar Group sp. z o.o. + + + 984CD3 + Mantis Deposition + + + 08606E + ASUSTek COMPUTER INC. + + + EC89F5 + Lenovo Mobile Communication Technology Ltd. + + + B49842 + zte corporation + + + 7054D2 + PEGATRON CORPORATION + + + 7076DD + OxyGuard Internation A/S + + + E89AFF + Fujian LANDI Commercial Equipment Co.,Ltd + + + 1065CF + IQSIM + + + 684CA8 + Shenzhen Herotel Tech. Co., Ltd. + + + 0C8CDC + Suunto Oy + + + F84897 + Hitachi, Ltd. + + + F80BD0 + Datang Telecom communication terminal (Tianjin) Co., Ltd. + + + 646223 + Cellient Co., Ltd. + + + 98473C + SHANGHAI SUNMON COMMUNICATION TECHNOGY CO.,LTD + + + 5481AD + Eagle Research Corporation + + + EC473C + Redwire, LLC + + + 3CC12C + AES Corporation + + + 949BFD + Trans New Technology, Inc. + + + 84E714 + Liang Herng Enterprise,Co.Ltd. + + + B829F7 + Blaster Tech + + + C8E1A7 + Vertu Corporation Limited + + + A00ABF + Wieson Technologies Co., Ltd. + + + 8CCDE8 + Nintendo Co., Ltd. + + + 00E666 + ARIMA Communications Corp. + + + 34BDFA + Cisco SPVTG + + + D4136F + Asia Pacific Brands + + + 00B56D + David Electronics Co., LTD. + + + 2C3557 + ELIIY Power CO., Ltd. + + + B80415 + Bayan Audio + + + 4CAB33 + KST technology + + + 485261 + SOREEL + + + F4472A + Nanjing Rousing Sci. and Tech. Industrial Co., Ltd + + + DC028E + zte corporation + + + 18D949 + Qvis Labs, LLC + + + D808F5 + Arcadia Networks Co. Ltd. + + + 049F06 + Smobile Co., Ltd. + + + 289A4B + SteelSeries ApS + + + 7CB232 + Hui Zhou Gaoshengda Technology Co.,LTD + + + 54A04F + t-mac Technologies Ltd + + + 14DB85 + S NET MEDIA + + + B8DAF1 + Strahlenschutz- Entwicklungs- und Ausruestungsgesellschaft mbH + + + D45C70 + Wi-Fi Alliance + + + 0CC47E + EUCAST Co., Ltd. + + + 50724D + BEG Brueck Electronic GmbH + + + 783CE3 + Kai-EE + + + B898B0 + Atlona Inc. + + + 080C0B + SysMik GmbH Dresden + + + DCBF90 + HUIZHOU QIAOXING TELECOMMUNICATION INDUSTRY CO.,LTD. + + + C8FB26 + Cisco SPVTG + + + ACBD0B + Leimac Ltd. + + + B85810 + NUMERA, INC. + + + A08C15 + Gerhard D. Wempe KG + + + 90CF6F + Dlogixs Co Ltd + + + 24694A + Jasmine Systems Inc. + + + F41E26 + Simon-Kaloi Engineering + + + 702526 + Nokia + + + ECD950 + IRT SA + + + 645FFF + Nicolet Neuro + + + A4D18F + Shenzhen Skyee Optical Fiber Communication Technology Ltd. + + + 58343B + Glovast Technology Ltd. + + + 109FA9 + Actiontec Electronics, Inc + + + C0A364 + 3D Systems Massachusetts + + + AC7A42 + iConnectivity + + + F8051C + DRS Imaging and Targeting Solutions + + + 78D34F + Pace-O-Matic, Inc. + + + A4466B + EOC Technology + + + 7C386C + Real Time Logic + + + 2067B1 + Pluto inc. + + + 7C02BC + Hansung Electronics Co. LTD + + + B82410 + Magneti Marelli Slovakia s.r.o. + + + 105F49 + Cisco SPVTG + + + 1C5C60 + Shenzhen Belzon Technology Co.,LTD. + + + 700BC0 + Dewav Technology Company + + + CC14A6 + Yichun MyEnergy Domain, Inc + + + 889676 + TTC MARCONI s.r.o. + + + B8B94E + Shenzhen iBaby Labs, Inc. + + + ACC698 + Kohzu Precision Co., Ltd. + + + AC0A61 + Labor S.r.L. + + + 241064 + Shenzhen Ecsino Tecnical Co. Ltd + + + 7CEBEA + ASCT + + + 189A67 + CSE-Servelec Limited + + + 087D21 + Altasec technology corporation + + + 34D7B4 + Tributary Systems, Inc. + + + F40F9B + WAVELINK + + + 901EDD + GREAT COMPUTER CORPORATION + + + 9C0DAC + Tymphany HK Limited + + + 1C43EC + JAPAN CIRCUIT CO.,LTD + + + 785262 + Shenzhen Hojy Software Co., Ltd. + + + 20014F + Linea Research Ltd + + + EC0ED6 + ITECH INSTRUMENTS SAS + + + 746A89 + Rezolt Corporation + + + 702F4B + Steelcase Inc. + + + 741489 + SRT Wireless + + + 241B13 + Shanghai Nutshell Electronic Co., Ltd. + + + B43564 + Fujian Tian Cheng Electron Science & Technical Development Co.,Ltd. + + + 1C5FFF + Beijing Ereneben Information Technology Co.,Ltd Shenzhen Branch + + + 6045BD + Microsoft + + + 9C54CA + Zhengzhou VCOM Science and Technology Co.,Ltd + + + 00BF15 + Genetec Inc. + + + 241125 + Hutek Co., Ltd. + + + B431B8 + Aviwest + + + 508C77 + DIRMEIER Schanktechnik GmbH &Co KG + + + 5C1737 + I-View Now, LLC. + + + 70B599 + Embedded Technologies s.r.o. + + + EC4C4D + ZAO NPK RoTeK + + + 38EE9D + Anedo Ltd. + + + 54D1B0 + Universal Laser Systems, Inc + + + 240917 + Devlin Electronics Limited + + + 78BEBD + STULZ GmbH + + + B058C4 + Broadcast Microwave Services, Inc + + + A007B6 + Advanced Technical Support, Inc. + + + 0CD2B5 + Binatone Telecommunication Pvt. Ltd + + + 4846F1 + Uros Oy + + + B827EB + Raspberry Pi Foundation + + + 08BE09 + Astrol Electronic AG + + + B41DEF + Internet Laboratories, Inc. + + + 809393 + Xapt GmbH + + + 6044F5 + Easy Digital Ltd. + + + F47F35 + Cisco Systems, Inc + + + BCC168 + DinBox Sverige AB + + + DC309C + Heyrex Limited + + + D4DF57 + Alpinion Medical Systems + + + 5048EB + BEIJING HAIHEJINSHENG NETWORK TECHNOLOGY CO. LTD. + + + B40E96 + HERAN + + + F89955 + Fortress Technology Inc + + + 4CC94F + Nokia + + + 0CE5D3 + DH electronics GmbH + + + 40704A + Power Idea Technology Limited + + + 545EBD + NL Technologies + + + CC187B + Manzanita Systems, Inc. + + + 28F606 + Syes srl + + + 0CAF5A + GENUS POWER INFRASTRUCTURES LIMITED + + + 7CEF8A + Inhon International Ltd. + + + 94FAE8 + Shenzhen Eycom Technology Co., Ltd + + + E840F2 + PEGATRON CORPORATION + + + 50053D + CyWee Group Ltd + + + F88C1C + KAISHUN ELECTRONIC TECHNOLOGY CO., LTD. BEIJING + + + 1C0B52 + EPICOM S.A + + + 747E2D + Beijing Thomson CITIC Digital Technology Co. LTD. + + + 4C64D9 + Guangdong Leawin Group Co., Ltd + + + 9C0111 + Shenzhen Newabel Electronic Co., Ltd. + + + 400E67 + Tremol Ltd. + + + 008DDA + Link One Co., Ltd. + + + 18193F + Tamtron Oy + + + 885C47 + Alcatel Lucent + + + 3CC1F6 + Melange Systems Pvt. Ltd. + + + C49805 + Minieum Networks, Inc + + + 90F4C1 + Rand McNally + + + 3CCE73 + Cisco Systems, Inc + + + B0BD6D + Echostreams Innovative Solutions + + + 745798 + TRUMPF Laser GmbH + Co. KG + + + 2817CE + Omnisense Ltd + + + E425E9 + Color-Chip + + + 78A183 + Advidia + + + 940149 + AutoHotBox + + + 1CB094 + HTC Corporation + + + 14B1C8 + InfiniWing, Inc. + + + B48255 + Research Products Corporation + + + 8016B7 + Brunel University + + + 48ED80 + daesung eltec + + + C80718 + TDSi + + + B467E9 + Qingdao GoerTek Technology Co., Ltd. + + + 186751 + KOMEG Industrielle Messtechnik GmbH + + + F0F755 + Cisco Systems, Inc + + + 1CB243 + TDC A/S + + + 38BF33 + NEC CASIO Mobile Communications + + + 645EBE + Yahoo! JAPAN + + + CCC50A + SHENZHEN DAJIAHAO TECHNOLOGY CO.,LTD + + + D8BF4C + Victory Concept Electronics Limited + + + 3CB9A6 + Belden Deutschland GmbH + + + C0DF77 + Conrad Electronic SE + + + 581D91 + Advanced Mobile Telecom co.,ltd. + + + 1CB17F + NEC Platforms, Ltd. + + + E42C56 + Lilee Systems, Ltd. + + + B89674 + AllDSP GmbH & Co. KG + + + 3055ED + Trex Network LLC + + + 94DF58 + IJ Electron CO.,Ltd. + + + 48D54C + Jeda Networks + + + 1CBBA8 + OJSC Ufimskiy Zavod Promsvyaz + + + 70D6B6 + Metrum Technologies + + + C0A0DE + Multi Touch Oy + + + 8C0CA3 + Amper + + + 48E1AF + Vity + + + BCB852 + Cybera, Inc. + + + C49300 + 8Devices + + + 6CA682 + EDAM information & communications + + + 28D576 + Premier Wireless, Inc. + + + F0DA7C + RLH INDUSTRIES,INC. + + + AC319D + Shenzhen TG-NET Botone Technology Co.,Ltd. + + + 2486F4 + Ctek, Inc. + + + C4237A + WhizNets Inc. + + + 903CAE + Yunnan KSEC Digital Technology Co.,Ltd. + + + 70704C + Purple Communications, Inc + + + D89760 + C2 Development, Inc. + + + 8CDE52 + ISSC Technologies Corp. + + + 082522 + ADVANSEE + + + 4C2F9D + ICM Controls + + + 50FC30 + Treehouse Labs + + + E467BA + Danish Interpretation Systems A/S + + + 9CA134 + Nike, Inc. + + + 40BC8B + itelio GmbH + + + F47ACC + SolidFire, Inc. + + + 905682 + Lenbrook Industries Limited + + + C09132 + Patriot Memory + + + 90185E + Apex Tool Group GmbH & Co OHG + + + F8FE5C + Reciprocal Labs Corp + + + 6C9CED + Cisco Systems, Inc + + + 006BA0 + SHENZHEN UNIVERSAL INTELLISYS PTE LTD + + + A898C6 + Shinbo Co., Ltd. + + + B4211D + Beijing GuangXin Technology Co., Ltd + + + E843B6 + QNAP Systems, Inc. + + + E0DADC + JVC KENWOOD Corporation + + + B89BC9 + SMC Networks Inc + + + D4D249 + Power Ethernet + + + 80427C + Adolf Tedsen GmbH & Co. KG + + + 409FC7 + BAEKCHUN I&C Co., Ltd. + + + 00FC58 + WebSilicon Ltd. + + + 983571 + Sub10 Systems Ltd + + + F4E6D7 + Solar Power Technologies, Inc. + + + 20107A + Gemtek Technology Co., Ltd. + + + 78DDD6 + c-scape + + + F82F5B + eGauge Systems LLC + + + E4AFA1 + HES-SO + + + A887ED + ARC Wireless LLC + + + 186D99 + Adanis Inc. + + + A0E201 + AVTrace Ltd.(China) + + + 9CF67D + Ricardo Prague, s.r.o. + + + 989080 + Linkpower Network System Inc Ltd. + + + B87424 + Viessmann Elektronik GmbH + + + B451F9 + NB Software + + + 30168D + ProLon + + + 4C0289 + LEX COMPUTECH CO., LTD + + + C0E54E + ARIES Embedded GmbH + + + 50F61A + Kunshan JADE Technologies co., Ltd. + + + 542018 + Tely Labs + + + 581FEF + Tuttnaer LTD + + + 58BDA3 + Nintendo Co., Ltd. + + + 187C81 + Valeo Vision Systems + + + ACCC8E + Axis Communications AB + + + BC764E + Rackspace US, Inc. + + + 5404A6 + ASUSTek COMPUTER INC. + + + F83376 + Good Mind Innovation Co., Ltd. + + + 98C845 + PacketAccess + + + CCC8D7 + CIAS Elettronica srl + + + 84D32A + IEEE 1905.1 + + + 8C94CF + Encell Technology, Inc. + + + F8F25A + G-Lab GmbH + + + F0DEB9 + ShangHai Y&Y Electronics Co., Ltd + + + 7CA61D + MHL, LLC + + + 3057AC + IRLAB LTD. + + + 842B50 + Huria Co.,Ltd. + + + B8BB6D + ENERES Co.,Ltd. + + + 14373B + PROCOM Systems + + + 1897FF + TechFaith Wireless Technology Limited + + + 4C5585 + Hamilton Systems + + + 8C8E76 + taskit GmbH + + + A0133B + HiTi Digital, Inc. + + + 48F7F1 + Nokia + + + 9C5711 + Feitian Xunda(Beijing) Aeronautical Information Technology Co., Ltd. + + + 88F488 + cellon communications technology(shenzhen)Co.,Ltd. + + + 448E12 + DT Research, Inc. + + + 703187 + ACX GmbH + + + 80971B + Altenergy Power System,Inc. + + + 30E4DB + Cisco Systems, Inc + + + ECEA03 + DARFON LIGHTING CORP + + + 6CA780 + Nokia Corporation + + + 582EFE + Lighting Science Group + + + 30F9ED + Sony Corporation + + + ECF236 + NEOMONTANA ELECTRONICS + + + 0418B6 + Private + + + E4A5EF + TRON LINK ELECTRONICS CO., LTD. + + + 705CAD + Konami Gaming Inc + + + 804731 + Packet Design, Inc. + + + F08BFE + COSTEL.,CO.LTD + + + 3071B2 + Hangzhou Prevail Optoelectronic Equipment Co.,LTD. + + + 3C6F45 + Fiberpro Inc. + + + DCCE41 + FE GLOBAL HONG KONG LIMITED + + + FC6C31 + LXinstruments GmbH + + + B09BD4 + GNH Software India Private Limited + + + 007F28 + Actiontec Electronics, Inc + + + CC60BB + Empower RF Systems + + + 7CDD20 + IOXOS Technologies S.A. + + + E84E06 + EDUP INTERNATIONAL (HK) CO., LTD + + + 00077D + Cisco Systems, Inc + + + E0C922 + Jireh Energy Tech., Ltd. + + + 905F8D + modas GmbH + + + 98293F + Fujian Start Computer Equipment Co.,Ltd + + + 0C51F7 + CHAUVIN ARNOUX + + + 0CFC83 + Airoha Technology Corp., + + + 587675 + Beijing ECHO Technologies Co.,Ltd + + + CCD9E9 + SCR Engineers Ltd. + + + 34A709 + Trevil srl + + + 3C26D5 + Sotera Wireless + + + ACC935 + Ness Corporation + + + 008D4E + CJSC NII STT + + + 444F5E + Pan Studios Co.,Ltd. + + + D0AFB6 + Linktop Technology Co., LTD + + + 98EC65 + Cosesy ApS + + + 4C98EF + Zeo + + + 00A1DE + ShenZhen ShiHua Technology CO.,LTD + + + 908D1D + GH Technologies + + + 806CBC + NET New Electronic Technology GmbH + + + 58E808 + AUTONICS CORPORATION + + + DC05ED + Nabtesco Corporation + + + 98F8DB + Marini Impianti Industriali s.r.l. + + + 909060 + RSI VIDEO TECHNOLOGIES + + + BC8199 + BASIC Co.,Ltd. + + + E0F211 + Digitalwatt + + + B45CA4 + Thing-talk Wireless Communication Technologies Corporation Limited + + + DCA7D9 + Compressor Controls Corp + + + 38FEC5 + Ellips B.V. + + + C455A6 + Cadac Holdings Ltd + + + 5C7757 + Haivision Network Video + + + D4D898 + Korea CNO Tech Co., Ltd + + + B4AA4D + Ensequence, Inc. + + + 040A83 + Alcatel-Lucent + + + B83D4E + Shenzhen Cultraview Digital Technology Co.,Ltd Shanghai Branch + + + 5087B8 + Nuvyyo Inc + + + C0EAE4 + Sonicwall + + + 0838A5 + Funkwerk plettac electronic GmbH + + + B0A72A + Ensemble Designs, Inc. + + + 6400F1 + Cisco Systems, Inc + + + F86971 + Seibu Electric Co., + + + 44AA27 + udworks Co., Ltd. + + + CC1EFF + Metrological Group BV + + + 184E94 + MESSOA TECHNOLOGIES INC. + + + 60F59C + CRU-Dataport + + + 6C391D + Beijing ZhongHuaHun Network Information center + + + 80B32A + UK Grid Solutions Ltd + + + 405539 + Cisco Systems, Inc + + + C45600 + Galleon Embedded Computing + + + 58EECE + Icon Time Systems + + + 647FDA + TEKTELIC Communications Inc. + + + AC0613 + Senselogix Ltd + + + 747818 + Jurumani Solutions + + + B8F4D0 + Herrmann Ultraschalltechnik GmbH & Co. Kg + + + 08ACA5 + Benu Video, Inc. + + + 586D8F + Cisco-Linksys, LLC + + + 10E3C7 + Seohwa Telecom + + + FCF1CD + OPTEX-FA CO.,LTD. + + + 4425BB + Bamboo Entertainment Corporation + + + E00C7F + Nintendo Co., Ltd. + + + 1C955D + I-LAX ELECTRONICS INC. + + + 7465D1 + Atlinks + + + E48AD5 + RF WINDOW CO., LTD. + + + 443719 + 2 Save Energy Ltd + + + 84EA99 + Vieworks + + + BC3E13 + Accordance Systems Inc. + + + 041D10 + Dream Ware Inc. + + + 801440 + Sunlit System Technology Corp + + + 88DD79 + Voltaire + + + 64F987 + Avvasi Inc. + + + 902E87 + LabJack + + + DC07C1 + HangZhou QiYang Technology Co.,Ltd. + + + A81B18 + XTS CORP + + + D0A311 + Neuberger Gebäudeautomation GmbH + + + A424B3 + FlatFrog Laboratories AB + + + 94CDAC + Creowave Oy + + + 7CDA84 + Dongnian Networks Inc. + + + C0A26D + Abbott Point of Care + + + 00BB8E + HME Co., Ltd. + + + D82A7E + Nokia Corporation + + + 801F02 + Edimax Technology Co. Ltd. + + + 180B52 + Nanotron Technologies GmbH + + + 144C1A + Max Communication GmbH + + + D85D84 + CAx soft GmbH + + + D4E32C + S. Siedle & Sohne + + + 7C6ADB + SafeTone Technology Co.,Ltd + + + F05D89 + Dycon Limited + + + 9CF938 + AREVA NP GmbH + + + 8CDB25 + ESG Solutions + + + BCC61A + SPECTRA EMBEDDED SYSTEMS + + + 0470BC + Globalstar Inc. + + + 988E34 + ZHEJIANG BOXSAM ELECTRONIC CO.,LTD + + + C471FE + Cisco Systems, Inc + + + 340804 + D-Link Corporation + + + FC3598 + Favite Inc. + + + 90D92C + HUG-WITSCHI AG + + + 4022ED + Digital Projection Ltd + + + 6C2E33 + Accelink Technologies Co.,Ltd. + + + 989449 + Skyworth Wireless Technology Ltd. + + + 2CA157 + acromate, Inc. + + + 942053 + Nokia Corporation + + + 28852D + Touch Networks + + + 486B91 + Fleetwood Group Inc. + + + 643409 + BITwave Pte Ltd + + + 74CD0C + Smith Myers Communications Ltd. + + + CCCE40 + Janteq Corp + + + B8EE79 + YWire Technologies, Inc. + + + 28ED58 + JAG Jakob AG + + + B8797E + Secure Meters (UK) Limited + + + 2005E8 + OOO InProMedia + + + 0006F6 + Cisco Systems, Inc + + + 747DB6 + Aliwei Communications, Inc + + + B06563 + Shanghai Railway Communication Factory + + + AC6F4F + Enspert Inc + + + E82877 + TMY Co., Ltd. + + + F0C88C + LeddarTech Inc. + + + B0B32B + Slican Sp. z o.o. + + + 5842E4 + Baxter International Inc + + + CC9E00 + Nintendo Co., Ltd. + + + 58A76F + iD corporation + + + 40987B + Aisino Corporation + + + BC38D2 + Pandachip Limited + + + B8BA68 + Xi'an Jizhong Digital Communication Co.,Ltd + + + 4018D7 + Smartronix, Inc. + + + 4C2C80 + Beijing Skyway Technologies Co.,Ltd + + + D49E6D + Wuhan Zhongyuan Huadian Science & Technology Co., + + + 4037AD + Macro Image Technology, Inc. + + + F00248 + SmarteBuilding + + + 40C245 + Shenzhen Hexicom Technology Co., Ltd. + + + CC55AD + RIM + + + E8757F + FIRS Technologies(Shenzhen) Co., Ltd + + + F0F7B3 + Phorm + + + 6063FD + Transcend Communication Beijing Co.,Ltd. + + + 74BE08 + ATEK Products, LLC + + + 74D675 + WYMA Tecnologia + + + B40EDC + LG-Ericsson Co.,Ltd. + + + E0EE1B + Panasonic Automotive Systems Company of America + + + 60893C + Thermo Fisher Scientific P.O.A. + + + D86BF7 + Nintendo Co., Ltd. + + + 00D38D + Hotel Technology Next Generation + + + C83EA7 + KUNBUS GmbH + + + D8B6C1 + NetworkAccountant, Inc. + + + 74A4A7 + QRS Music Technologies, Inc. + + + 40CD3A + Z3 Technology + + + 482CEA + Motorola Inc Business Light Radios + + + F455E0 + Niceway CNC Technology Co.,Ltd.Hunan Province + + + 20FDF1 + 3COM EUROPE LTD + + + A4218A + Nortel Networks + + + EC2368 + IntelliVoice Co.,Ltd. + + + 749050 + Renesas Electronics Corporation + + + 7CEF18 + Creative Product Design Pty. Ltd. + + + 9088A2 + IONICS TECHNOLOGY ME LTDA + + + 00336C + SynapSense Corporation + + + 100C24 + pomdevices, LLC + + + 58F6BF + Kyoto University + + + AC6123 + Drivven, Inc. + + + F866F2 + Cisco Systems, Inc + + + AC34CB + Shanhai GBCOM Communication Technology Co. Ltd + + + 700258 + 01DB-METRAVIB + + + 8497B8 + Memjet Inc. + + + A0DDE5 + SHARP Corporation + + + 206AFF + Atlas Elektronik UK Limited + + + FC75E6 + Handreamnet + + + 0C15C5 + SDTEC Co., Ltd. + + + F8FB2F + Santur Corporation + + + 2CCD43 + Summit Technology Group + + + 145412 + Entis Co., Ltd. + + + 78EC22 + Shanghai Qihui Telecom Technology Co., LTD + + + 64995D + LGE + + + FC7CE7 + FCI USA LLC + + + 3C106F + ALBAHITH TECHNOLOGIES + + + D87157 + Lenovo Mobile Communication Technology Ltd. + + + C00D7E + Additech, Inc. + + + 84C7A9 + C3PO S.A. + + + 609AA4 + GVI SECURITY INC. + + + 641084 + HEXIUM Technical Development Co., Ltd. + + + 6C626D + Micro-Star INT'L CO., LTD + + + 28068D + ITL, LLC + + + 342109 + Jensen Scandinavia AS + + + 7C3E9D + PATECH + + + 244597 + GEMUE Gebr. Mueller Apparatebau + + + 78818F + Server Racks Australia Pty Ltd + + + 284846 + GridCentric Inc. + + + 30694B + RIM + + + 10CCDB + AXIMUM PRODUITS ELECTRONIQUES + + + 38C7BA + CS Services Co.,Ltd. + + + EC5C69 + MITSUBISHI HEAVY INDUSTRIES MECHATRONICS SYSTEMS,LTD. + + + E4AD7D + SCL Elements + + + F09CBB + RaonThink Inc. + + + 80EE73 + Shuttle Inc. + + + FCE23F + CLAY PAKY SPA + + + 58570D + Danfoss Solar Inverters + + + 44A8C2 + SEWOO TECH CO., LTD + + + BCA9D6 + Cyber-Rain, Inc. + + + ECFE7E + BlueRadios, Inc. + + + C4823F + Fujian Newland Auto-ID Tech. Co,.Ltd. + + + E85B5B + LG ELECTRONICS INC + + + 7C2CF3 + Secure Electrans Ltd + + + 081651 + SHENZHEN SEA STAR TECHNOLOGY CO.,LTD + + + 304174 + ALTEC LANSING LLC + + + 3C39C3 + JW Electronics Co., Ltd. + + + 3C05AB + Product Creation Studio + + + 30EFD1 + Alstom Strongwish (Shenzhen) Co., Ltd. + + + D41F0C + JAI Manufacturing + + + 8CD628 + Ikor Metering + + + 243C20 + Dynamode Group + + + 481BD2 + Intron Scientific co., ltd. + + + F04335 + DVN(Shanghai)Ltd. + + + A479E4 + KLINFO Corp + + + 8C541D + LGE + + + 00A2DA + INAT GmbH + + + 6C3E9C + KE Knestel Elektronik GmbH + + + A863DF + DISPLAIRE CORPORATION + + + 183BD2 + BYD Precision Manufacture Company Ltd. + + + 4CC602 + Radios, Inc. + + + D0F0DB + Ericsson + + + 7C1476 + Damall Technologies SAS + + + 003CC5 + WONWOO Engineering Co., Ltd + + + F077D0 + Xcellen + + + 884B39 + Siemens AG, Healthcare Sector + + + D828C9 + General Electric Consumer and Industrial + + + 44C233 + Guangzhou Comet Technology Development Co.Ltd + + + E43593 + Hangzhou GoTo technology Co.Ltd + + + 2C3A28 + Fagor Electrónica + + + 80B289 + Forworld Electronics Ltd. + + + E83A97 + Toshiba Corporation + + + 1056CA + Peplink International Ltd. + + + D49C28 + JayBird LLC + + + 80F593 + IRCO Sistemas de Telecomunicación S.A. + + + ECDE3D + Lamprey Networks, Inc. + + + 6CFFBE + MPB Communications Inc. + + + E497F0 + Shanghai VLC Technologies Ltd. Co. + + + B40832 + TC Communications + + + 88FD15 + LINEEYE CO., LTD + + + 24DBAD + ShopperTrak RCT Corporation + + + 2872C5 + Smartmatic Corp + + + 486FD2 + StorSimple Inc + + + A03A75 + PSS Belgium N.V. + + + B45861 + CRemote, LLC + + + B0973A + E-Fuel Corporation + + + 204E6B + Axxana(israel) ltd + + + 9CEBE8 + BizLink (Kunshan) Co.,Ltd + + + F06281 + ProCurve Networking by HP + + + C09C92 + COBY + + + 88ED1C + Cudo Communication Co., Ltd. + + + 9CCD82 + CHENG UEI PRECISION INDUSTRY CO.,LTD + + + 040EC2 + ViewSonic Mobile China Limited + + + C8D1D1 + AGAiT Technology Corporation + + + 00DB45 + THAMWAY CO.,LTD. + + + 74F726 + Neuron Robotics + + + C038F9 + Nokia Danmark A/S + + + F46349 + Diffon Corporation + + + 003A9C + Cisco Systems, Inc + + + 889821 + TERAON + + + E0E751 + Nintendo Co., Ltd. + + + 74F07D + BnCOM Co.,Ltd + + + 7C6C8F + AMS NEVE LTD + + + 9CB206 + HMS Industrial Networks + + + ACE9AA + Hay Systems Ltd + + + 082AD0 + SRD Innovations Inc. + + + E08FEC + REPOTEC CO., LTD. + + + F852DF + VNL Europe AB + + + 003AAF + BlueBit Ltd. + + + 64168D + Cisco Systems, Inc + + + D8C3FB + DETRACOM + + + A8CB95 + EAST BEST CO., LTD. + + + F45FF7 + DQ Technology Inc. + + + 7C3BD5 + Imago Group + + + 5CE223 + Delphin Technology AG + + + F871FE + The Goldman Sachs Group, Inc. + + + 2C1984 + IDN Telecom, Inc. + + + 40EF4C + Fihonest communication co.,Ltd + + + 00271E + Xagyl Communications + + + 00271D + Comba Telecom Systems (China) Ltd. + + + 002720 + NEW-SOL COM + + + 644F74 + LENUS Co., Ltd. + + + 787F62 + GiK mbH + + + 58F67B + Xia Men UnionCore Technology LTD. + + + 401597 + Protect America, Inc. + + + C4FCE4 + DishTV NZ Ltd + + + EC6C9F + Chengdu Volans Technology CO.,LTD + + + E80B13 + Akib Systems Taiwan, INC + + + 0026F7 + Nivetti Systems Pvt. Ltd. + + + 0026F6 + Military Communication Institute + + + 0026F0 + cTrixs International GmbH. + + + 0026EA + Cheerchip Electronic Technology (ShangHai) Co., Ltd. + + + 0026DD + Fival Science & Technology Co.,Ltd. + + + 0026DE + FDI MATELEC + + + 0026DA + Universal Media Corporation /Slovakia/ s.r.o. + + + 0026DB + Ionics EMS Inc. + + + 0026C9 + Proventix Systems, Inc. + + + 0026BF + ShenZhen Temobi Science&Tech Development Co.,Ltd + + + 0026D5 + Ory Solucoes em Comercio de Informatica Ltda. + + + 0026CE + Kozumi USA Corp. + + + 0026CA + Cisco Systems, Inc + + + 002708 + Nordiag ASA + + + 002702 + SolarEdge Technologies + + + 0026FA + BandRich Inc. + + + 0026F9 + S.E.M. srl + + + 0026FD + Interactive Intelligence + + + 0026B4 + Ford Motor Company + + + 0026AC + Shanghai LUSTER Teraband photonic Co., Ltd. + + + 0026A6 + TRIXELL + + + 002711 + LanPro Inc + + + 00268F + MTA SpA + + + 002686 + Quantenna Communcations, Inc. + + + 002684 + KISAN SYSTEM + + + 002680 + SIL3 Pty.Ltd + + + 002638 + Xia Men Joyatech Co., Ltd. + + + 00263A + Digitec Systems + + + 002635 + Bluetechnix GmbH + + + 002617 + OEM Worldwide + + + 002613 + Engel Axil S.L. + + + 00260F + Linn Products Ltd + + + 00260C + Dataram + + + 002620 + ISGUS GmbH + + + 00261D + COP SECURITY SYSTEM CORP. + + + 00262B + Wongs Electronics Co. Ltd. + + + 002694 + Senscient Ltd + + + 002690 + I DO IT + + + 002679 + Euphonic Technologies, Inc. + + + 002676 + COMMidt AS + + + 002666 + EFM Networks + + + 002657 + OOO NPP EKRA + + + 002652 + Cisco Systems, Inc + + + 0025F6 + netTALK.com, Inc. + + + 0025F5 + DVS Korea, Co., Ltd + + + 0025EB + Reutech Radar Systems (PTY) Ltd + + + 0025EE + Avtex Ltd + + + 0025D6 + The Kroger Co. + + + 0025D1 + Eastern Asia Technology Limited + + + 0025CD + Skylane Optics + + + 00258C + ESUS ELEKTRONIK SAN. VE DIS. TIC. LTD. STI. + + + 0025A5 + Walnut Media Network + + + 0025A4 + EuroDesign embedded technologies GmbH + + + 0025AE + Microsoft Corporation + + + 0025AF + COMFILE Technology + + + 0025A8 + Kontron (BeiJing) Technology Co.,Ltd + + + 002601 + Cutera Inc + + + 0025BF + Wireless Cables Inc. + + + 0025B9 + Cypress Solutions Inc + + + 0025B6 + Telecom FM + + + 0025D9 + DataFab Systems Inc. + + + 0025C1 + Nawoo Korea Corp. + + + 00257A + CAMCO Produktions- und Vertriebs-GmbH für Beschallungs- und Beleuchtungsanlagen + + + 002576 + NELI TECHNOLOGIES + + + 002574 + KUNIMI MEDIA DEVICE Co., Ltd. + + + 002573 + ST Electronics (Info-Security) Pte Ltd + + + 00256F + Dantherm Power + + + 002554 + Pixel8 Networks + + + 00255A + Tantalus Systems Corp. + + + 002559 + Syphan Technologies Ltd + + + 002530 + Aetas Systems Inc. + + + 00252C + Entourage Systems, Inc. + + + 00252F + Energy, Inc. + + + 00250F + On-Ramp Wireless, Inc. + + + 002505 + eks Engel GmbH & Co. KG + + + 002540 + Quasar Technologies, Inc. + + + 002533 + WITTENSTEIN AG + + + 002587 + Vitality, Inc. + + + 002523 + OCP Inc. + + + 00251D + DSA Encore, LLC + + + 00250A + Security Expert Co. Ltd + + + 002509 + SHARETRONIC Group LTD + + + 0024D8 + IlSung Precision + + + 0024CD + Willow Garage, Inc. + + + 0024D3 + QUALICA Inc. + + + 0024CE + Exeltech Inc + + + 0024CF + Inscape Data Corporation + + + 0024C6 + Hager Electro SAS + + + 0024B4 + ESCATRONIC GmbH + + + 0024B1 + Coulomb Technologies + + + 00249C + Bimeng Comunication System Co. Ltd + + + 002498 + Cisco Systems, Inc + + + 0024FD + Accedian Networks Inc + + + 0024F5 + NDS Surgical Imaging + + + 0024DA + Innovar Systems Limited + + + 00246A + Solid Year Co., Ltd. + + + 002467 + AOC International (Europe) GmbH + + + 00248B + HYBUS CO., LTD. + + + 002492 + Motorola, Broadband Solutions Group + + + 002484 + Bang and Olufsen Medicom a/s + + + 002452 + Silicon Software GmbH + + + 002453 + Initra d.o.o. + + + 00244C + Solartron Metrology Ltd + + + 002448 + SpiderCloud Wireless, Inc + + + 00244B + PERCEPTRON INC + + + 00242A + Hittite Microwave Corporation + + + 002422 + Knapp Logistik Automation GmbH + + + 00241B + iWOW Communications Pte Ltd + + + 002428 + EnergyICT + + + 002417 + Thomson Telecom Belgium + + + 00247A + FU YI CHENG Technology Co., Ltd. + + + 002476 + TAP.tv + + + 00246D + Weinzierl Engineering GmbH + + + 002442 + Axona Limited + + + 00243C + S.A.A.A. + + + 00245E + Hivision Co.,ltd + + + 00244D + Hokkaido Electronics Corporation + + + 002416 + Any Use + + + 002409 + The Toro Company + + + 002406 + Pointmobile + + + 002400 + Nortel Networks + + + 0023E1 + Cavena Image Products AB + + + 0023DC + Benein, Inc + + + 0023D1 + TRG + + + 0023D3 + AirLink WiFi Networking Corp. + + + 0023FB + IP Datatel, LLC. + + + 0023FE + Biodevices, SA + + + 0023F4 + Masternaut + + + 0023CA + Behind The Set, LLC + + + 0023CB + Shenzhen Full-join Technology Co.,Ltd + + + 0023D0 + Uniloc USA Inc. + + + 0023AD + Xmark Corporation + + + 0023AB + Cisco Systems, Inc + + + 0023A4 + New Concepts Development Corp. + + + 002385 + ANTIPODE + + + 0023C7 + AVSystem sp. z o. o. + + + 0023C3 + LogMeIn, Inc. + + + 0023B0 + COMXION Technology Inc. + + + 002303 + LITE-ON IT Corporation + + + 0022FE + Advanced Illumination + + + 002300 + Cayee Computer Ltd. + + + 0022F3 + SHARP Corporation + + + 0022F6 + Syracuse Research Corporation + + + 00232C + Senticare + + + 00232B + IRD A/S + + + 00232A + eonas IT-Beratung und -Entwicklung GmbH + + + 002327 + Shouyo Electronics CO., LTD + + + 002328 + ALCON TELECOMMUNICATIONS CO., LTD. + + + 002372 + MORE STAR INDUSTRIAL GROUP LIMITED + + + 00236D + ResMed Ltd + + + 00236B + Xembedded, Inc. + + + 00237E + ELSTER GMBH + + + 00237C + NEOTION + + + 00237A + RIM + + + 00234C + KTC AB + + + 002343 + TEM AG + + + 002336 + METEL s.r.o. + + + 002338 + OJ-Electronics A/S + + + 002361 + Unigen Corporation + + + 00235F + Silicon Micro Sensors GmbH + + + 00233B + C-Matic Systems Ltd + + + 00231A + ITF Co., Ltd. + + + 00230D + Nortel Networks + + + 0022ED + TSI Power Corporation + + + 0022E1 + ZORT Labs, LLC. + + + 0022E0 + Atlantic Software Technologies S.r.L. + + + 0022DF + TAMUZ Monitors + + + 0022D8 + Shenzhen GST Security and Safety Technology Limited + + + 0022DC + Vigil Health Solutions Inc. + + + 00228C + Photon Europe GmbH + + + 00228B + Kensington Computer Products Group + + + 00228D + GBS Laboratories LLC + + + 002289 + Vanderlande APC inc. + + + 00226D + Shenzhen GIEC Electronics Co., Ltd. + + + 00226E + Gowell Electronic Limited + + + 00225D + Digicable Network India Pvt. Ltd. + + + 002256 + Cisco Systems, Inc + + + 0022D9 + Fortex Industrial Ltd. + + + 0022D3 + Hub-Tech + + + 0022D4 + ComWorth Co., Ltd. + + + 00229F + Sensys Traffic AB + + + 002299 + SeaMicro Inc. + + + 0022BC + JDSU France SAS + + + 0022AA + Nintendo Co., Ltd. + + + 0022A8 + Ouman Oy + + + 0022C9 + Lenord, Bauer & Co GmbH + + + 00227D + YE DATA INC. + + + 00227B + Apogee Labs, Inc. + + + 002223 + TimeKeeping Systems, Inc. + + + 00221A + Audio Precision + + + 00224B + AIRTECH TECHNOLOGIES, INC. + + + 00223C + RATIO Entwicklungen GmbH + + + 002252 + ZOLL Lifecor Corporation + + + 00224D + MITAC INTERNATIONAL CORP. + + + 00224C + Nintendo Co., Ltd. + + + 00224A + RAYLASE AG + + + 0021E3 + SerialTek LLC + + + 0021E7 + Informatics Services Corporation + + + 0021DC + TECNOALARM S.r.l. + + + 0021F8 + Enseo, Inc. + + + 0021F3 + Si14 SpA + + + 0021F1 + Tutus Data AB + + + 002213 + PCI CORPORATION + + + 00221C + Private + + + 002222 + Schaffner Deutschland GmbH + + + 002231 + SMT&C Co., Ltd. + + + 002201 + Aksys Networks Inc + + + 00219A + Cambridge Visual Networks Ltd + + + 002193 + Videofon MV + + + 002192 + Baoding Galaxy Electronic Technology Co.,Ltd + + + 00217B + Bastec AB + + + 002176 + YMax Telecom Ltd. + + + 002171 + Wesung TNC Co., Ltd. + + + 00215F + IHSE GmbH + + + 002156 + Cisco Systems, Inc + + + 002151 + Millinet Co., Ltd. + + + 0021A7 + Hantle System Co., Ltd. + + + 00219C + Honeywld Technology Corp. + + + 0021D8 + Cisco Systems, Inc + + + 0021D7 + Cisco Systems, Inc + + + 0021D9 + SEKONIC CORPORATION + + + 0021DA + Automation Products Group Inc. + + + 00216C + ODVA + + + 002161 + Yournet Inc. + + + 002189 + AppTech, Inc. + + + 0021BD + Nintendo Co., Ltd. + + + 0021B5 + Galvanic Ltd + + + 0021C4 + Consilium AB + + + 002122 + Chip-pro Ltd. + + + 002125 + KUK JE TONG SHIN Co.,LTD + + + 002126 + Shenzhen Torch Equipment Co., Ltd. + + + 00211C + Cisco Systems, Inc + + + 001FF9 + Advanced Knowledge Associates + + + 001FF4 + Power Monitors, Inc. + + + 002135 + ALCATEL-LUCENT + + + 002118 + Athena Tech, Inc. + + + 002113 + Padtec S/A + + + 002112 + WISCOM SYSTEM CO.,LTD + + + 002147 + Nintendo Co., Ltd. + + + 002149 + China Daheng Group ,Inc. + + + 001FED + Tecan Systems Inc. + + + 001FE5 + In-Circuit GmbH + + + 002138 + Cepheid + + + 001F7B + TechNexion Ltd. + + + 001F7D + Embedded Wireless GmbH + + + 001F74 + Eigen Development + + + 001F75 + GiBahn Media + + + 001FB6 + Chi Lin Technology Co., Ltd. + + + 001FAF + NextIO, Inc. + + + 001FAA + Taseon, Inc. + + + 001FBC + EVGA Corporation + + + 001FBD + Kyocera Wireless Corp. + + + 001FB9 + Paltronics + + + 001FB7 + WiMate Technologies Corp. + + + 001FB4 + SmartShare Systems + + + 001F9E + Cisco Systems, Inc + + + 001FA0 + A10 Networks + + + 001F6E + Vtech Engineering Corporation + + + 001F66 + PLANAR LLC + + + 001F5F + Blatand GmbH + + + 001F8D + Ingenieurbuero Stark GmbH und Ko. KG + + + 001FC5 + Nintendo Co., Ltd. + + + 001FC0 + Control Express Finland Oy + + + 001F8F + Shanghai Bellmann Digital Source Co.,Ltd. + + + 001F84 + Gigle Semiconductor + + + 001EE6 + Shenzhen Advanced Video Info-Tech Co., Ltd. + + + 001EF5 + Hitek Automated Inc. + + + 001EF7 + Cisco Systems, Inc + + + 001ED8 + Digital United Inc. + + + 001ED6 + Alentec & Orion AB + + + 001F1E + Astec Technology Co., Ltd + + + 001F14 + NexG + + + 001F0C + Intelligent Digital Services GmbH + + + 001F08 + RISCO LTD + + + 001EF1 + Servimat + + + 001EF4 + L-3 Communications Display Systems + + + 001F0E + Japan Kyastem Co., Ltd + + + 001F0B + Federal State Unitary Enterprise Industrial UnionElectropribor + + + 001F57 + Phonik Innovation Co.,LTD + + + 001F59 + Kronback Tracers + + + 001F4E + ConMed Linvatec + + + 001F4A + Albentia Systems S.A. + + + 001F43 + ENTES ELEKTRONIK + + + 001F28 + HPN Supply Chain + + + 001E77 + Air2App + + + 001E7B + R.I.CO. S.r.l. + + + 001E8B + Infra Access Korea Co., Ltd. + + + 001E85 + Lagotek Corporation + + + 001EB5 + Ever Sparkle Technologies Ltd + + + 001EB3 + Primex Wireless + + + 001EB6 + TAG Heuer SA + + + 001EAC + Armadeus Systems + + + 001EAA + E-Senza Technologies GmbH + + + 001E3F + TrellisWare Technologies, Inc. + + + 001E55 + COWON SYSTEMS,Inc. + + + 001E56 + Bally Wulff Entertainment GmbH + + + 001E57 + ALCOMA, spol. s r.o. + + + 001EC4 + Celio Corp + + + 001EC1 + 3COM EUROPE LTD + + + 001EBB + BLUELIGHT TECHNOLOGY INC. + + + 001E9C + Fidustron INC + + + 001E97 + Medium Link System Technology CO., LTD, + + + 001E6E + Shenzhen First Mile Communications Ltd + + + 001E6D + IT R&D Center + + + 001E50 + BATTISTONI RESEARCH + + + 001E41 + Microwave Communication & Component, Inc. + + + 001DFC + KSIC + + + 001DF2 + Netflix, Inc. + + + 001DEF + TRIMM, INC. + + + 001DF1 + Intego Systems, Inc. + + + 001DC3 + RIKOR TV, Ltd + + + 001DC1 + Audinate Pty L + + + 001DED + Grid Net, Inc. + + + 001E34 + CryptoMetrics + + + 001E2D + STIM + + + 001DB2 + HOKKAIDO ELECTRIC ENGINEERING CO.,LTD. + + + 001DAD + Sinotech Engineering Consultants, Inc. Geotechnical Enginee + + + 001DD8 + Microsoft Corporation + + + 001DC8 + Navionics Research Inc., dba SCADAmetrics + + + 001DCC + Ayon Cyber Security, Inc + + + 001DAB + SwissQual License AG + + + 001DA0 + Heng Yu Electronic Manufacturing Company Limited + + + 001E11 + ELELUX INTERNATIONAL LTD + + + 001D83 + Emitech Corporation + + + 001D74 + Tianjin China-Silicon Microelectronics Co., Ltd. + + + 001D6D + Confidant International LLC + + + 001D7C + ABE Elettronica S.p.A. + + + 001D4B + Grid Connect Inc. + + + 001D4D + Adaptive Recognition Hungary, Inc + + + 001D8A + TechTrex Inc + + + 001D87 + VigTech Labs Sdn Bhd + + + 001D80 + Beijing Huahuan Eletronics Co.,Ltd + + + 001D58 + CQ Inc + + + 001D53 + S&O Electronics (Malaysia) Sdn. Bhd. + + + 001D54 + Sunnic Technology & Merchandise INC. + + + 001D1D + Inter-M Corporation + + + 001D0E + Agapha Technology co., Ltd. + + + 001D75 + Radioscape PLC + + + 001D5F + OverSpeed SARL + + + 001D92 + MICRO-STAR INT'L CO.,LTD. + + + 001D2F + QuantumVision Corporation + - 0025D9 - DataFab Systems Inc. + 001CED + ENVIRONNEMENT SA - 0025D6 - The Kroger Co. + 001CE5 + MBS Electronic Systems GmbH - 0025D1 - Eastern Asia Technology Limited + 001CDD + COWBELL ENGINEERING CO., LTD. - 0025CD - Skylane Optics + 001CC2 + Part II Research, Inc. - 0025BF - Wireless Cables Inc. + 001CBD + Ezze Mobile Tech., Inc. - 0025B9 - Cypress Solutions Inc + 001CB8 + CBC Co., Ltd - 0025B6 - Telecom FM + 001D0A + Davis Instruments, Inc. - 0025A5 - Walnut Media Network + 001D05 + Cooper Lighting Solutions - 0025A4 - EuroDesign embedded technologies GmbH + 001CFF + Napera Networks Inc - 0025C1 - Nawoo Korea Corp. + 001C82 + Genew Technologies - 0025F6 - netTALK.com Inc. + 001C84 + STL Solution Co.,Ltd. - 00257A - CAMCO Produktions- und Vertriebs-GmbH fur Beschallungs- und Beleuchtungsanlagen + 001C79 + Cohesive Financial Technologies LLC - 002576 - Neli Technologies + 001CA5 + Zygo Corporation - 002574 - KUNIMI MEDIA DEVICE Ltd + 001C9D + Liecthi AG - 002559 - Syphan Technologies Ltd + 001C96 + Linkwise Technology Pte Ltd - 002554 - Pixel8 Networks + 001CBA + VerScient, Inc. - 002540 - Quasar Technologies Inc. + 001CB0 + Cisco Systems, Inc - 002533 - Wittenstein AG + 001CAC + Qniq Technology Corp. - 002530 - Aetas Systems Inc. + 001CDC + Custom Computer Services, Inc. - 00252C - Entourage Systems Inc. + 001CD1 + Waves Audio LTD - 00258C - Esus Elektronik SAN. VE DIS. TIC Ltd STI. + 001C8B + MJ Innovations Ltd. - 00255A - Tantalus Systems Corp. + 001C57 + Cisco Systems, Inc - 002587 - Vitality Inc. + 001C5D + Leica Microsystems - 002573 - ST Electronics (Info-Security) Pte Ltd + 001C5E + ASTON France - 00256F - Dantherm Power + 001C5B + Chubb Electronic Security Systems Ltd - 00252F - Energy Inc. + 001C55 + Shenzhen Kaifa Technology Co. - 00250A - Security Expert Ltd + 001C4C + Petrotest Instruments - 002505 - eks Engel GmbH & Co. KG + 001C3C + Seon Design Inc. - 002509 - SHARETRONIC Group Ltd + 001C29 + CORE DIGITAL ELECTRONICS CO., LTD - 0024DA - Innovar Systems Limited + 001C24 + Formosa Wireless Systems Corp. - 0024D8 - IlSung Precision + 001C20 + CLB Benelux - 0024CD - Willow Garage Inc. + 001C1C + Center Communication Systems GmbH - 0024D3 - QUALICA Inc. + 001C31 + Mobile XP Technology Co., LTD - 0024CE - Exeltech Inc + 001C34 + HUEY CHIAO INTERNATIONAL CO., LTD. - 0024CF - Inscape Data Corporation + 001C36 + iNEWiT NV - 0024C6 - Hager Electro SAS + 001C07 + Cwlinux Limited - 0024FD - Accedian Networks Inc + 001C00 + Entry Point, LLC - 002523 - OCP Inc. + 001BFD + Dignsys Inc. - 00251D - DSA Encore LLC + 001C6D + KYOHRITSU ELECTRONIC INDUSTRY CO., LTD. - 00250F - On-Ramp Wireless Inc. + 001C64 + Landis+Gyr - 0024F5 - NDS Surgical Imaging + 001BE6 + VR AG - 002467 - AOC International (Europe) GmbH + 001BE2 + AhnLab,Inc. - 00246D - Weinzierl Engineering GmbH + 001BE0 + TELENOT ELECTRONIC GmbH - 002470 - AUROTECH ultrasound AS. + 001BDA + UTStarcom Inc - 00246A - Solid Year Ltd + 001BF5 + Tellink Sistemas de Telecomunicación S.L. - 002492 - Motorola, Broadband Solutions Group + 001C15 + iPhotonix LLC - 00248B - Hybus Ltd + 001BA3 + Flexit Group GmbH - 002484 - Bang and Olufsen Medicom a/s + 001B9F + Calyptech Pty Ltd - 002480 - Meteocontrol GmbH + 001B99 + KS System GmbH - 00247A - FU YI CHENG Technology Ltd + 001B9A + Apollo Fire Detectors Ltd - 002476 - TAP.tv + 001BBD + FMC Kongsberg Subsea AS - 0024B4 - ESCATRONIC GmbH + 001BBE + ICOP Digital - 0024B1 - Coulomb Technologies + 001BB3 + Condalo GmbH - 00249C - Bimeng Comunication System Ltd + 001BB7 + Alta Heights Technology Corp. - 002498 - Cisco Systems Inc. + 001BAC + Curtiss Wright Controls Embedded Computing - 002452 - Silicon Software GmbH + 001B60 + NAVIGON AG - 002453 - Initra d.o.o. + 001B57 + SEMINDIA SYSTEMS PRIVATE LIMITED - 00244C - Solartron Metrology Ltd + 001B55 + Hurco Automation Ltd. - 002448 - SpiderCloud Wireless Inc. + 001B53 + Cisco Systems, Inc - 00244B - Perceptron Inc + 001BD1 + SOGESTMATIC - 002428 - EnergyICT + 001BD6 + Kelvin Hughes Ltd - 002417 - Thomson Telecom Belgium + 001BCF + Dataupia Corporation - 002416 - Any Use + 001B8B + NEC Platforms, Ltd. - 00242A - Hittite Microwave Corporation + 001B82 + Taiwan Semiconductor Co., Ltd. - 002422 - Knapp Logistik Automation GmbH + 001B8C + JMicron Technology Corp. - 00241B - iWOW Communications Pte Ltd + 001B91 + EFKON AG - 00245E - Hivision Ltd + 001B89 + EMZA Visual Sense Ltd. - 00244D - Hokkaido Electronics Corporation + 001B6A + Powerwave Technologies Sweden AB - 002442 - Axona Limited + 001B67 + Cisco Systems Inc - 002400 - Nortel Networks + 001B66 + Sennheiser electronic GmbH & Co. KG - 0023FB - IP Datatel LLC. + 001BCB + PEMPEK SYSTEMS PTY LTD - 002409 - The Toro Company + 001B7B + The Tintometer Ltd - 002406 - Pointmobile + 001B75 + Hypermedia Systems - 00243C - S.A.A.A. + 001AD9 + International Broadband Electric Communications, Inc. - 0023D3 - AirLink WiFi Networking Corp. + 001B31 + Neural Image. Co. Ltd. - 0023CA - Behind The Set LLC + 001B29 + Avantis.Co.,Ltd - 0023CB - Shenzhen Full-join Technology Ltd + 001B28 + POLYGON, JSC - 0023AD - Xmark Corporation + 001B2B + Cisco Systems, Inc - 0023AB - Cisco Systems Inc. + 001B27 + Merlin CSI - 0023A4 - New Concepts Development Corp. + 001B0E + InoTec GmbH Organisationssysteme - 0023DC - Benein Inc. + 001B04 + Affinity International S.p.a - 0023D1 - TRG + 001B06 + Ateliers R. LAUMONIER - 0023FE - Biodevices, SA + 001B05 + YMC AG - 0023F4 - Masternaut + 001AFF + Wizyoung Tech. - 0023D0 - Uniloc USA Inc. + 001B00 + Neopost Technologies - 0023C7 - AVSystem + 001B43 + Beijing DG Telecommunications equipment Co.,Ltd - 0023C3 - LogMeIn Inc. + 001B3C + Software Technologies Group,Inc. - 0023B0 - CoMXION Technology Inc. + 001B3D + EuroTel Spa - 0023E1 - Cavena Image Products AB + 001B1B + Siemens AG, - 00237E - Elster GmbH + 001B1F + FORCE Technology - 00237C - Neotion + 001B49 + Roberts Radio limited - 00237A - RIM + 001B4E + Navman New Zealand - 00236D - ResMed Ltd + 001B16 + Celtro Ltd. - 00236B - Xembedded Inc. + 001AE6 + Atlanta Advanced Communications Holdings Limited - 002361 - Unigen Corporation + 001AF2 + Dynavisions Schweiz AG - 00232C - Senticare + 001A7A + Lismore Instruments Limited - 00232B - IRD A/S + 001A78 + ubtos - 002336 - METEL s.r.o. + 001A76 + SDT information Technology Co.,LTD. - 002338 - OJ-Electronics A/S + 001A70 + Cisco-Linksys, LLC - 00233B - C-Matic Systems Ltd + 001A60 + Wave Electronics Co.,Ltd. - 00232A - eonas IT-Beratung und -Entwicklung GmbH + 001A56 + ViewTel Co,. Ltd. - 002327 - Shouyo Electronics Ltd + 001A50 + PheeNet Technology Corp. - 002328 - Alcon Telecommunications Ltd + 001A53 + Zylaya - 002372 - More Star Industrial Group Limited + 001A4C + Crossbow Technology, Inc - 00234C - KTC AB + 001A7D + cyber-blue(HK)Ltd - 002343 - TEM AG + 001A82 + PROBA Building Automation Co.,LTD - 00235F - Silicon Micro Sensors GmbH + 001A7C + Hirschmann Multimedia B.V. - 002385 - Antipode + 001AAB + eWings s.r.l. - 0022D8 - Shenzhen GST Security and Safety Technology Limited + 001AAC + Corelatus AB - 0022DC - Vigil Health Solutions Inc. + 001AAF + BLUSENS TECHNOLOGY - 0022D9 - Fortex Industrial Ltd + 001AB0 + Signal Networks Pvt. Ltd., - 0022D3 - Hub-Tech + 001AC8 + ISL (Instrumentation Scientifique de Laboratoire) - 0022D4 - ComWorth Ltd + 001AC6 + Micro Control Designs - 0022FE - Advanced Illumination + 001A61 + PacStar Corp. - 002300 - Cayee Computer Ltd + 001A65 + Seluxit - 0022F3 - Sharp Corporation + 001A54 + Hip Shing Electronics Ltd. - 0022F6 - Syracuse Research Corporation + 001AA1 + Cisco Systems, Inc - 00230D - Nortel Networks + 0019F8 + Embedded Systems Design, Inc. - 002303 - LITE-ON IT Corporation + 0019EF + SHENZHEN LINNKING ELECTRONICS CO.,LTD - 0022ED - TSI Power Corporation + 0019F3 + Cetis, Inc + + + 0019F5 + Imagination Technologies Ltd + + + 0019F7 + Onset Computer Corporation + + + 0019EE + CARLO GAVAZZI CONTROLS SPA-Controls Division + + + 0019EB + Pyronix Ltd + + + 0019E7 + Cisco Systems, Inc + + + 0019E9 + S-Information Technolgy, Co., Ltd. + + + 0019DA + Welltrans O&E Technology Co. , Ltd. + + + 0019D0 + Cathexis + + + 001A14 + Xin Hua Control Engineering Co.,Ltd. + + + 001A10 + LUCENT TRANS ELECTRONICS CO.,LTD + + + 001A0C + Swe-Dish Satellite Systems AB + + + 001A07 + Arecont Vision + + + 001A08 + Simoco Ltd. + + + 001A04 + Interay Solutions BV + + + 001A02 + SECURE CARE PRODUCTS, INC + + + 001A1A + Gentex Corporation/Electro-Acoustic Products + + + 001A12 + Essilor + + + 0019D6 + LS Cable and System Ltd. + + + 0019D7 + FORTUNETEK CO., LTD + + + 0019C9 + S&C ELECTRIC COMPANY + + + 001A42 + Techcity Technology co., Ltd. + + + 0019AC + GSP SYSTEMS Inc. + + + 0019B0 + HanYang System + + + 001995 + Jurong Hi-Tech (Suzhou)Co.ltd + + + 00199A + EDO-EVI + + + 001994 + Jorjin Technologies Inc. + + + 0019BF + Citiway technology Co.,ltd + + + 0019B6 + Euro Emme s.r.l. + + + 0019B5 + Famar Fueguina S.A. + + + 00195D + ShenZhen XinHuaTong Opto Electronics Co.,Ltd + + + 001953 + Chainleader Communications Corp. + + + 001955 + Cisco Systems, Inc + + + 001959 + Staccato Communications Inc. + + + 00194D + Avago Technologies Sdn Bhd + + + 00194E + Ultra Electronics - TCS (Tactical Communication Systems) + + + 00197C + Riedel Communications GmbH - 0022E1 - ZORT Labs LLC. + 00196F + SensoPart GmbH - 0022E0 - Atlantic Software Technologies S.r.L. + 0019A0 + NIHON DATA SYSTENS, INC. - 0022DF - TAMUZ Monitors + 001991 + avinfo - 00231A - ITF Ltd + 00198C + iXSea - 0022BC - JDSU France SAS + 001962 + Commerciant, LP - 0022AA - Nintendo Ltd + 0019B8 + Boundary Devices - 0022C9 - Lenord, Bauer & Co GmbH + 0018E4 + YIGUANG - 00228C - Photon Europe GmbH + 0018E5 + Adhoco AG - 00228B - Kensington Computer Products Group + 0018DD + Silicondust Engineering Ltd - 00228D - GBS Laboratories LLC + 0018DF + The Morey Corporation - 00224C - Nintendo Ltd + 0018E1 + Verkerk Service Systemen - 00224A - Raylase AG + 0018DA + Würth Elektronik eiSos GmbH & Co. KG - 00224B - Airtech Technologies Inc. + 0018D5 + REIGNCOM - 002256 - Cisco Systems Inc. + 0018D4 + Unified Display Interface SIG - 002252 - ZOLL Lifecor Corporation + 001915 + TECOM Co., Ltd. - 00224D - Mitac International Corp. + 00191B + Sputnik Engineering AG - 00229F - Sensys Traffic AB + 001909 + DEVI - Danfoss A/S - 002299 - SeaMicro Inc. + 00190A + HASWARE INC. - 00226D - Shenzhen GIEC Electronics Ltd + 001904 + WB Electronics Sp. z o.o. - 00226E - Gowell Electronic Limited + 001934 + TRENDON TOUCH TECHNOLOGY CORP. - 00225D - Digicable Network India Pvt Ltd + 001923 + Phonex Korea Co., LTD. - 00227B - Apogee Labs Inc. + 00191C + Sensicast Systems - 00227D - YE Data Inc. + 001933 + Strix Systems, Inc. - 0022A8 - Ouman Oy + 001928 + Siemens AG, Transportation Systems - 002223 - TimeKeeping Systems Inc. + 00190D + IEEE 1394c - 00221A - Audio Precision + 0018C2 + Firetide, Inc - 002218 - Akamai Technologies Inc + 0018E7 + Cameo Communications, INC. - 00223C - RATIO Entwicklungen GmbH + 001838 + PanAccess Communications,Inc. - 0021E7 - Informatics Services Corporation + 001821 + SINDORICOH - 0021DC - TECNOALARM S.r.l. + 001823 + Delta Electronics, Inc. - 0021F1 - Tutus Data AB + 001815 + GZ Technologies, Inc. - 0021E3 - SerialTek LLC + 001818 + Cisco Systems, Inc - 00221C - Private + 0018A9 + Ethernet Direct Corporation - 002222 - Schaffner Deutschland GmbH + 0018A7 + Yoggie Security Systems LTD. - 0021F8 - Enseo Inc. + 0018A8 + AnNeal Technology Inc. - 0021F3 - Si14 SpA + 0018A2 + XIP Technology AB - 002231 - SMT&C Ltd + 00189C + Weldex Corporation - 002213 - PCI Corporation + 00189A + HANA Micron Inc. - 002201 - Aksys Networks Inc + 00185F + TAC Inc. - 00217B - Bastec AB + 001864 + Eaton Corporation - 002176 - YMax Telecom Ltd + 001866 + Leutron Vision - 002171 - Wesung TNC Ltd + 001860 + SIM Technology Group Shanghai Simcom Ltd., - 002193 - Videofon MV + 00183E + Digilent, Inc - 002192 - Baoding Galaxy Electronic Technology Ltd + 001842 + Nokia Danmark A/S - 0021A7 - Hantle System Ltd + 001840 + 3 Phoenix, Inc. - 00219C - Honeywld Technology Corp. + 001857 + Unilever R&D - 00219A - Cambridge Visual Networks Ltd + 001853 + Atera Networks LTD. - 0021D8 - Cisco Systems Inc. + 001859 + Strawberry Linux Co.,Ltd. - 0021D7 - Cisco Systems Inc. + 00184F + 8 Ways Technology Corp. - 0021D9 - Sekonic Corporation + 001873 + Cisco Systems, Inc - 0021DA - Automation Products Group Inc. + 00187A + Wiremold - 0021B5 - Galvanic Ltd + 00186C + Neonode AB - 0021BD - Nintendo Ltd + 001844 + Heads Up Technologies, Inc. - 0021C4 - Consilium AB + 00182B + Softier - 002189 - AppTech Inc. + 001829 + Gatsometer - 002122 - Chip-pro Ltd + 001881 + Buyang Electronics Industrial Co., Ltd - 002125 - KUK JE TONG SHIN Ltd + 001897 + JESS-LINK PRODUCTS Co., LTD - 002126 - Shenzhen Torch Equipment Ltd + 00189E + OMNIKEY GmbH. - 002113 - Padtec S/A + 00181A + AVerMedia Information Inc. - 002112 - Wiscom System Ltd + 001816 + Ubixon Co., Ltd. - 00210E - Orpak Systems L.t.d. + 0017B5 + Peerless Systems Corporation - 002161 - Yournet Inc. + 0017AF + Enermet - 00215F - IHSE GmbH + 0017AA + elab-experience inc. - 002135 - Alcatel-Lucent + 0017AE + GAI-Tronics - 002138 - Cepheid + 0017A8 + EDM Corporation - 002147 - Nintendo Ltd + 0017A9 + Sentivision - 002149 - China Daheng Group ,Inc. + 0017C5 + SonicWALL - 002156 - Cisco Systems Inc. + 0017BE + Tratec Telecom B.V. - 002151 - Millinet Ltd + 0017C0 + PureTech Systems, Inc. - 00216C - Odva + 0017BA + SEDO CO., LTD. - 00211C - Cisco Systems Inc. + 0017D4 + Monsoon Multimedia, Inc - 002118 - Athena Tech Inc. + 0017F1 + Renu Electronics Pvt Ltd - 001FBD - Kyocera Wireless Corp. + 0017FF + PLAYLINE Co.,Ltd. - 001FB9 - Paltronics + 0017F6 + Pyramid Meriden Inc. - 001FB7 - WiMate Technologies Corp. + 001806 + Hokkei Industries Co., Ltd. - 001FB4 - SmartShare Systems + 0017F0 + SZCOM Broadband Network Technology Co.,Ltd - 001FB6 - Chi Lin Technology Ltd + 00178B + Teledyne Technologies Incorporated - 001FC8 - Up-Today Industrial Ltd + 001780 + Applied Biosystems B.V. - 001FC5 - Nintendo Ltd + 0017DF + Cisco Systems, Inc - 001FC0 - Control Express Finland Oy + 00172F + NeuLion Incorporated - 001FBC - EVGA Corporation + 001728 + Selex Communications - 001FF9 - Advanced Knowledge Associates + 001746 + Freedom9 Inc. - 001FED - Tecan Systems Inc. + 00174D + DYNAMIC NETWORK FACTORY, INC. - 001FE5 - In-Circuit GmbH + 001744 + Araneo Ltd. - 001FF4 - Power Monitors Inc. + 001749 + HYUNDAE YONG-O-SA CO.,LTD - 001F5F - Blatand GmbH + 001743 + Deck Srl - 001F57 - Phonik Innovation Ltd + 00173D + Neology - 001F59 - Kronback Tracers + 001740 + Bluberi Gaming Technologies Inc - 001F4E - ConMed Linvatec + 001732 + Science-Technical Center RISSA - 001FAA - Taseon Inc. + 00173A + Cloudastructure Inc - 001F7B - TechNexion Ltd + 001770 + Arti Industrial Electronics Ltd. - 001F7D - Embedded Wireless GmbH + 00176D + CORE CORPORATION - 001F8D - Ingenieurbuero Stark GmbH und Ko. KG + 001773 + Laketune Technologies Co. Ltd - 001FAF - NextIO Inc. + 001722 + Hanazeder Electronic GmbH - 001F74 - Eigen Development + 001723 + Summit Data Communications - 001F75 - GiBahn Media + 00176C + Pivot3, Inc. - 001F8F - Shanghai Bellmann Digital Source Ltd + 00171F + IMV Corporation - 001F84 - Gigle Semiconductor + 001757 + RIX TECHNOLOGY LIMITED - 001F6E - Vtech Engineering Corporation + 0016BB + Law-Chain Computer Technology Co Ltd - 001F66 - Planar LLC + 0016B4 + Private - 001FA0 - A10 Networks + 0016A7 + AWETA G&P - 001F9E - Cisco Systems Inc. + 0016BF + PaloDEx Group Oy - 001EE6 - Shenzhen Advanced Video Info-Tech Ltd + 0016B7 + Seoul Commtech - 001EF7 - Cisco Systems Inc. + 0016A0 + Auto-Maskin - 001F0B - Federal State Unitary Enterprise Industrial UnionElectropribor + 0016E1 + SiliconStor, Inc. - 001F0C - Intelligent Digital Services GmbH + 0016E2 + American Fibertek, Inc. - 001F08 - Risco Ltd + 001713 + Tiger NetCom - 001F43 - Entes Elektronik + 0016CD + HIJI HIGH-TECH CO., LTD. - 001F14 - NexG + 0016EF + Koko Fitness, Inc. - 001EF1 - Servimat + 0016FD + Jaty Electronics - 001EF4 - L-3 Communications Display Systems + 00168D + KORWIN CO., Ltd. - 001EF5 - Hitek Automated Inc. + 00168E + Vimicro corporation - 001F0E - Japan Kyastem Ltd + 001689 + Pilkor Electronics Co., Ltd - 001F28 - HPN Supply Chain + 00168A + id-Confirm Inc - 001F1E - Astec Technology Ltd + 001686 + Karl Storz Imaging - 001F4A - Albentia Systems S.A. + 00167E + DIBOSS.CO.,LTD - 001EAA - E-Senza Technologies GmbH + 00167B + Haver&Boecker - 001E9C - Fidustron Inc + 001679 + eOn Communications - 001E97 - Medium Link System Technology Ltd + 001678 + SHENZHEN BAOAN GAOKE ELECTRONICS CO., LTD - 001E8B - Infra Access Korea Ltd + 001674 + EuroCB (Phils.), Inc. - 001EBB - Bluelight Technology Inc. + 00164A + Vibration Technology Limited - 001EB5 - Ever Sparkle Technologies Ltd + 00163F + CReTE SYSTEMS Inc. - 001EB3 - Primex Wireless + 00163D + Tsinghua Tongfang Legend Silicon Tech. Co., Ltd. - 001E85 - Lagotek Corporation + 00163A + YVES TECHNOLOGY CO., LTD. - 001ED8 - Digital United Inc. + 001638 + TECOM Co., Ltd. - 001ED6 - Alentec & Orion AB + 001627 + embedded-logic DESIGN AND MORE GmbH - 001EC6 - Obvius Holdings LLC + 001622 + BBH SYSTEMS GMBH - 001EC4 - Celio Corp + 001613 + LibreStream Technologies Inc. - 001EC1 - 3Com Europe Ltd + 001633 + Oxford Diagnostics Ltd. - 001EB6 - TAG Heuer SA + 00162D + STNet Co., Ltd. - 001EAC - Armadeus Systems + 00164F + World Ethnic Broadcastin Inc. - 001E77 - Air2App + 001670 + SKNET Corporation - 001E7B - R.I.Co. S.r.l. + 001667 + A-TEC Subsystem INC. - 001E6E - Shenzhen First Mile Communications Ltd + 00165D + AirDefense, Inc. - 001E6D - IT R&D Center + 00165B + Grip Audio - 001E34 - CryptoMetrics + 0015CD + Exartech International Corp. - 001E2D - Stim + 0015C9 + Gumstix, Inc - 001E41 - Microwave Communication & Component Inc. + 0015BA + iba AG - 001DFC - Ksic + 0015BB + SMA Solar Technology AG - 001E55 - CoWON SysTEMS,Inc. + 0015EC + Boca Devices LLC - 001E56 - Bally Wulff Entertainment GmbH + 0015EF + NEC TOKIN Corporation - 001E3F - TrellisWare Technologies Inc. + 0015E4 + Zimmer Elektromedizin - 001E57 - ALCOMA, spol. s r.o. + 0015BF + technicob - 001E50 - Battistoni Research + 0015BC + Develco - 001E11 - Elelux International Ltd + 0015BD + Group 4 Technology Ltd - 001DF2 - Netflix Inc. + 0015B5 + CI Network Corp. - 001DEF - Trimm Inc. + 0015FB + setex schermuly textile computer gmbh - 001DF1 - Intego Systems Inc. + 0015FE + SCHILLING ROBOTICS LLC - 001DED - Grid Net Inc. + 0015AE + kyung il - 001DC3 - RIKOR TV Ltd + 00160F + BADGER METER INC - 001DC1 - Audinate Pty L + 001604 + Sigpro - 001DB2 - Hokkaido Electric Engineering Ltd + 00159C + B-KYUNG SYSTEM Co.,Ltd. - 001DAD - Sinotech Engineering Consultants Inc. Geotechnical Enginee + 001595 + Quester Tangent Corporation - 001DAB - SwissQual License AG + 0015D9 + PKC Electronics Oy - 001D9C - Rockwell Automation + 0015DD + IP Control Systems Ltd. - 001DA0 - Heng Yu Electronic Manufacturing Company Limited + 00160D + Be Here Corporation - 001DD8 - Microsoft Corporation + 00151A + Hunter Engineering Company - 001DC8 - Navionics Research Inc., dba SCADAmetrics + 001514 + Hu Zhou NAVA Networks&Electronics Ltd. - 001DCC - Ayon Cyber Security Inc. + 001516 + URIEL SYSTEMS INC. - 001D92 - Micro-Star International + 001565 + XIAMEN YEALINK NETWORK TECHNOLOGY CO.,LTD - 001D8A - TechTrex Inc + 001569 + PECO II, Inc. - 001D80 - Beijing Huahuan Electronics Ltd + 001563 + Cisco Systems, Inc - 001D83 - Emitech Corporation + 001564 + BEHRINGER Spezielle Studiotechnik GmbH - 001D74 - Tianjin China-Silicon Microelectronics Ltd + 00157B + Leuze electronic GmbH + Co. KG - 001D4B - Grid Connect Inc. + 001578 + Audio / Video Innovations - 001D4D - Adaptive Recognition Hungary Inc. + 001571 + Nolan Systems - 001D1E - Kyushu TEN Ltd + 001543 + Aberdeen Test Center - 001D1D - Inter-M Corporation + 001541 + StrataLight Communications, Inc. - 001D0E - Agapha Technology Ltd + 001561 + JJPlus Corporation - 001D0A - Davis Instruments Inc. + 001558 + FOXCONN - 001D67 - Amec + 001538 + RFID, Inc. - 001D7C - ABE Elettronica S.p.A. + 00152E + PacketHop, Inc. - 001D6D - Confidant International LLC + 00154F + one RF Technology - 001D75 - Radioscape PLC + 001545 + SEECODE Co., Ltd. - 001D53 - S&O Electronics (Malaysia) Sdn. Bhd. + 00151F + Multivision Intelligent Surveillance (Hong Kong) Ltd - 001D54 - Sunnic Technology & Merchandise Inc. + 001522 + Dea Security - 001D5F - OverSpeed SARL + 001587 + Takenaka Seisakusho Co.,Ltd - 001D58 - CQ Inc + 0014EF + TZero Technologies, Inc. - 001D87 - VigTech Labs Sdn Bhd + 0014EE + Western Digital Technologies, Inc. - 001D2F - QuantumVision Corporation + 0014A3 + Vitelec BV - 001CE5 - MBS Electronic Systems GmbH + 001497 + ZHIYUAN Eletronics co.,ltd. - 001CDD - Cowbell Engineering Ltd + 001499 + Helicomm Inc - 001CC2 - Part II Research Inc. + 001492 + Liteon, Mobile Media Solution SBU - 001CBD - Ezze Mobile Tech. Inc. + 001494 + ESU AG - 001CB8 - CBC Ltd + 0014BC + SYNECTIC TELECOM EXPORTS PVT. LTD. - 001CAC - Qniq Technology Corp. + 0014B9 + MSTAR SEMICONDUCTOR - 001CA5 - Zygo Corporation + 0014BD + incNETWORKS, Inc - 001C9D - Liecthi AG + 0014B7 + AR Infotek Inc. - 001CFF - Napera Networks Inc + 0014B5 + PHYSIOMETRIX,INC - 001CDC - Custom Computer Services Inc. + 0014CA + Key Radio Systems Limited - 001CD1 - Waves Audio Ltd + 0014C8 + Contemporary Research Corp - 001CED - Environnement SA + 0014C5 + Alive Technologies Pty Ltd - 001CBA - VerScient Inc. + 0014D3 + SEPSA - 001CB0 - Cisco Systems Inc. + 0014D8 + bio-logic SA - 001C4C - Petrotest Instruments + 0014DA + Huntleigh Healthcare - 001C45 - Chenbro Micom Ltd + 0014D5 + Datang Telecom Technology CO. , LCD,Optical Communication Br - 001C3C - Seon Design Inc. + 001485 + Giga-Byte - 001C57 - Cisco Systems Inc. + 001483 + eXS Inc. - 001C5D - Leica Microsystems + 00149C + HF Company - 001C5E - ASTON France + 001501 + LexBox - 001C55 - Shenzhen Kaifa Technology Co. + 001412 + S-TEC electronics AG - 001C5B - Chubb Electronic Security Systems Ltd + 001411 + Deutschmann Automation GmbH & Co. KG - 001C44 - Bosch Security Systems BV + 001405 + OpenIB, Inc. - 001C82 - Genew Technologies + 004501 + Midmark RTLS - 001C84 - STL Solution Ltd + 001460 + Kyocera Wireless Corp. - 001C79 - Cohesive Financial Technologies LLC + 00145C + Intronics B.V. - 001C64 - Landis+Gyr + 00145A + Westermo Neratec AG - 001C31 - Mobile XP Technology Ltd + 00145B + SeekerNet Inc. - 001C8B - MJ Innovations Ltd + 001443 + Consultronics Europe Ltd - 001C6D - Kyohritsu Electronic Industry Ltd + 001449 + Sichuan Changhong Electric Ltd. - 001C96 - Linkwise Technology Pte Ltd + 001446 + SuperVision Solutions LLC - 001C29 - Core Digital Electronics Ltd + 001440 + ATOMIC Corporation - 001C24 - Formosa Wireless Systems Corp. + 00142E + 77 Elektronika Kft. - 001C20 - CLB Benelux + 001430 + ViPowER, Inc - 001C1C - Center Communication Systems GmbH + 001432 + Tarallax Wireless, Inc. - 001BDA - UTStarcom Inc + 0013F5 + Akimbi Systems - 001BD1 - Sogestmatic + 0013F1 + AMOD Technology Co., Ltd. - 001C00 - Entry Point LLC + 00141F + SunKwang Electronics Co., Ltd - 001BFD - Dignsys Inc. + 00141D + KEBA Industrial Automation Germany GmbH - 001BD6 - Kelvin Hughes Ltd + 00144C + General Meters Corp. - 001BCF - Dataupia Corporation + 001471 + Eastern Asia Technology Limited - 001BCB - Pempek Systems Pty Ltd + 001403 + Renasis, LLC - 001BF5 - Tellink Sistemas de Telecomunicacion S.L. + 0013E7 + Halcro - 001BE6 - VR AG + 0013EA + Kamstrup A/S - 001BE2 - AhnLab,Inc. + 0013E1 + Iprobe AB - 001BE0 - TELENOT ELECTRONIC GmbH + 0013E3 + CoVi Technologies, Inc. - 001C34 - Huey Chiao International Ltd + 0013E4 + YANGJAE SYSTEMS CORP. - 001C36 - iNEWiT NV + 0013D9 + Matrix Product Development, Inc. - 001C15 - iPhotonix LLC + 001394 + Infohand Co.,Ltd - 001C07 - Cwlinux Limited + 001389 + Redes de Telefonía Móvil S.A. - 001BA3 - Flexit Group GmbH + 00138C + Kumyoung.Co.Ltd - 001B9F - Calyptech Pty Ltd + 00138E + FOAB Elektronik AB - 001B9A - Apollo Fire Detectors Ltd + 001376 + Tabor Electronics Ltd. - 001BBD - FMC Kongsberg Subsea AS + 001380 + Cisco Systems, Inc - 001BBE - ICOP Digital + 001385 + Add-On Technology Co., LTD. - 001BB3 - Condalo GmbH + 0013C1 + Asoka USA Corporation - 001BB7 - Alta Heights Technology Corp. + 0013C0 + Trix Tecnologia Ltda. - 001B99 - KS System GmbH + 0013A1 + Crow Electronic Engeneering - 001B8F - Cisco Systems Inc. + 00139C + Exavera Technologies, Inc. - 001B8C - JMicron Technology Corp. + 00136C + TomTom - 001B91 - Efkon AG + 001364 + Paradigm Technology Inc.. - 001B82 - Taiwan Semiconductor Ltd + 00136B + E-TEC - 001B89 - EMZA Visual Sense Ltd + 0013B3 + Ecom Communications Technology Co., Ltd. - 001B8B - NEC Platforms Ltd + 0013CC + Tall Maple Systems - 001BAC - Curtiss Wright Controls Embedded Computing + 0013B7 + Scantech ID - 001B6A - Powerwave Technologies Sweden AB + 00130B + Mextal B.V. - 001B67 - Cisco Systems Inc. + 00130D + GALILEO AVIONICA - 001B7B - The Tintometer Ltd + 001308 + Nuvera Fuel Cells - 001B75 - Hypermedia Systems + 001307 + Paravirtual Corporation - 001B27 - Merlin CSI + 001355 + TOMEN Cyber-business Solutions, Inc. - 001B1B - Siemens AG, + 001357 + Soyal Technology Co., Ltd. - 001B1F - DELTA - Danish Electronics, Light & Acoustics + 001360 + Cisco Systems, Inc - 001B57 - Semindia Systems Private Limited + 00135D + NTTPC Communications, Inc. - 001B55 - Hurco Automation Ltd + 001352 + Naztec, Inc. - 001B53 - Cisco Systems Inc. + 001345 + Eaton Corporation - 001B49 - Roberts Radio limited + 001347 + Red Lion Controls, LP - 001B0E - InoTec GmbH Organisationssysteme + 001343 + Matsushita Electronic Components (Europe) GmbH - 001B04 - Affinity International S.p.a + 0012EC + Movacolor b.v. - 001B06 - Ateliers R. LAUMONIER + 0012EB + PDH Solutions, LLC - 001B31 - Neural Image Ltd + 0012FC + PLANET System Co.,LTD - 001B29 - Avantis Ltd + 0012FE + Lenovo Mobile Communication Technology Ltd. - 001B2B - Cisco Systems Inc. + 0012F7 + Xiamen Xinglian Electronics Co., Ltd. - 001B28 - Polygon, JSC + 00133E + MetaSwitch - 001B43 - Beijing DG Telecommunications equipment Ltd + 00132E + ITian Coporation - 001B3C - Software Technologies Group,Inc. + 0012E1 + Alliant Networks, Inc - 001B3D - EuroTel Spa + 001339 + CCV Deutschland GmbH - 001B66 - Sennheiser electronic GmbH & Co. KG + 00132B + Phoenix Digital - 001B60 - Navigon AG + 00131B + BeCell Innovations Corp. - 001B05 - YMC AG + 001286 + ENDEVCO CORP - 001AFF - Wizyoung Tech. + 0012C2 + Apex Electronics Factory - 001B00 - Neopost Technologies + 0012BE + Astek Corporation - 001B4E - Navman New Zealand + 0012DF + Novomatic AG - 001B16 - Celtro Ltd + 0012E2 + ALAXALA Networks Corporation - 001AE6 - Atlanta Advanced Communications Holdings Limited + 0012D4 + Princeton Technology, Ltd - 001AD9 - International Broadband Electric Communications Inc. + 0012D9 + Cisco Systems, Inc - 001AC8 - ISL (Instrumentation Scientifique de Laboratoire) + 001274 + NIT lab - 001AAB - eWings s.r.l. + 001270 + NGES Denro Systems - 001AAC - Corelatus AB + 00126E + Seidel Elektronik GmbH Nfg.KG - 001AAF - Blusens Technology + 0012A0 + NeoMeridian Sdn Bhd - 001AB0 - Signal Networks Pvt Ltd + 0012AD + VIVAVIS AG - 001AA1 - Cisco Systems Inc. + 0012C5 + V-Show Technology (China) Co.,Ltd - 001AC6 - Micro Control Designs + 00122D + SiNett Corporation - 001AF2 - Dynavisions Schweiz AG + 00122C + Soenen Controls N.V. - 001A82 - PROBA Building Automation Ltd + 00122B + Virbiage Pty Ltd - 001A7C - Hirschmann Multimedia B.V. + 001232 + LeWiz Communications Inc. - 001A7A - Lismore Instruments Limited + 0011E5 + KCodes Corporation - 001A78 - ubtos + 001204 + u10 Networks, Inc. - 001A76 - SDT Information Technology Ltd + 00120A + Emerson Climate Technologies GmbH - 001A70 - Cisco-Linksys LLC + 001208 + Gantner Instruments GmbH - 001A61 - PacStar Corp. + 001201 + Cisco Systems, Inc - 001A62 - Data Robotics Inc.orporated + 001200 + Cisco Systems, Inc - 001A54 - Hip Shing Electronics Ltd + 001263 + Data Voice Technologies GmbH - 001A42 - Techcity Technology Ltd + 00125C + Green Hills Software, Inc. - 001A50 - PheeNet Technology Corp. + 00125F + AWIND Inc. - 001A53 - Zylaya + 00121A + Techno Soft Systemnics Inc. - 001A4C - Crossbow Technology Inc. + 00121B + Sound Devices, LLC - 001A1A - Gentex Corporation/Electro-Acoustic Products + 0011EE + Estari, Inc. - 001A12 - Essilor + 00126F + Rayson Technology Co., Ltd. - 001A7D - cyber-blue(HK) Ltd + 00124C + BBWM Corporation - 001A60 - Wave Electronics Ltd + 001244 + Cisco Systems, Inc - 001A56 - ViewTel Ltd + 001255 + NetEffect Incorporated - 0019F3 - Cetis Inc. + 001253 + AudioDev AB - 0019EF - Shenzhen Linnking Electronics Ltd + 0011B4 + Westermo Network Technologies AB - 0019F7 - Onset Computer Corporation + 0011B8 + Liebherr - Elektronik GmbH - 0019EE - CARLO GAVAZZI CoNTROLS SPA-Controls Division + 0011C1 + 4P MOBILE DATA PROCESSING - 0019BF - Citiway technology Ltd + 00118C + Missouri Department of Transportation - 0019B6 - Euro Emme s.r.l. + 001193 + Cisco Systems, Inc - 0019EB - Pyronix Ltd + 00118E + Halytech Mace - 0019E7 - Cisco Systems Inc. + 001186 + Prime Systems, Inc. - 0019E9 - S-Information Technolgy Ltd + 001178 + Chiron Technology Ltd - 0019DA - Welltrans O&E Technology Co Ltd + 00116A + Domo Ltd - 001A14 - Xin Hua Control Engineering Ltd + 00119D + Diginfo Technology Corporation - 001A10 - Lucent Trans Electronics Ltd + 00119A + Alkeria srl - 001A0C - Swe-Dish Satellite Systems AB + 00119C + EP&T Energy - 0019DC - ENENSYS Technologies + 001183 + Datalogic ADC, Inc. - 0019D0 - Cathexis + 00117F + Neotune Information Technology Corporation,.LTD - 0019D6 - LS Cable and System Ltd + 00117D + ZMD America, Inc. - 0019D7 - Fortunetek Ltd + 00117C + e-zy.net - 001A02 - Secure Care Products Inc. + 0011D7 + eWerks Inc - 0019F8 - Embedded Systems Design Inc. + 0011C8 + Powercom Co., Ltd. - 001A07 - Arecont Vision + 0011B2 + 2001 Technology Inc. - 001A08 - Simoco Ltd + 0011AF + Medialink-i,Inc - 001A04 - Interay Solutions BV + 0011DE + EURILOGIC - 0019C9 - S&C Electric Company + 0011DF + Current Energy - 0019B5 - Famar Fueguina S.A. + 00115E + ProMinent Dosiertechnik GmbH - 0019B8 - Boundary Devices + 001157 + Oki Electric Industry Co., Ltd. - 00195D - Shenzhen XinHuaTong Opto Electronics Ltd + 001139 + STOEBER ANTRIEBSTECHNIK GmbH + Co. KG. - 001953 - Chainleader Communications Corp. + 00113E + JL Corporation - 001955 - Cisco Systems Inc. + 001138 + TAISHIN CO., LTD. - 001959 - Staccato Communications Inc. + 001136 + Goodrich Sensor Systems - 00194D - Avago Technologies Sdn Bhd + 001132 + Synology Incorporated - 00194E - Ultra Electronics - TCS (Tactical Communication Systems) + 001129 + Paradise Datacom Ltd. - 0019AC - GSP SysTEMS Inc. + 001130 + Allied Telesis (Hong Kong) Ltd. - 0019B0 - HanYang System + 001118 + BLX IC Design Corp., Ltd. - 001995 - Jurong Hi-Tech (Suzhou) Ltd + 001107 + RGB Networks Inc. - 00199A - EDO-EVI + 001108 + Orbital Data Corporation - 001994 - Jorjin Technologies Inc. + 00110C + Atmark Techno, Inc. - 00197C - Riedel Communications GmbH + 00114B + Francotyp-Postalia GmbH - 0019A0 - Nihon Data Systens Inc. + 001147 + Secom-Industry co.LTD. - 001991 - avinfo + 00114A + KAYABA INDUSTRY Co,.Ltd. - 00198C - iXSea + 001142 + e-SMARTCOM INC. - 001962 - Commerciant, LP + 001120 + Cisco Systems, Inc - 00196F - SensoPart GmbH + 000FED + Anam Electronics Co., Ltd - 0018DD - Silicondust Engineering Ltd + 000FDD + SORDIN AB - 0018DF - The Morey Corporation + 00114D + Atsumi Electric Co.,LTD. - 0018E1 - Verkerk Service Systemen + 000FF0 + Sunray Co. Ltd. - 0018DA - Wurth Elektronik eiSos GmbH & Co. KG + 001103 + kawamura electric inc. - 0018D5 - Reigncom + 000F88 + AMETEK, Inc. - 0018E7 - Cameo Communications Inc. + 000F7E + Ablerex Electronics Co., LTD - 0018E4 - Yiguang + 000F83 + Brainium Technologies Inc. - 0018E5 - Adhoco AG + 000F84 + Astute Networks, Inc. - 00190A - Hasware Inc. + 000FD9 + FlexDSL Telecommunications AG - 001923 - Phonex Korea Ltd + 000FD0 + ASTRI - 00191C - Sensicast Systems + 000FAE + E2O Communications - 001928 - Siemens AG, Transportation Systems + 000FB1 + Cognio Inc. - 001915 - TECOM Ltd + 000F9E + Murrelektronik GmbH - 00191B - Sputnik Engineering AG + 000F93 + Landis+Gyr Ltd. - 001909 - DEVI - Danfoss A/S + 000F94 + Genexis BV - 001933 - Strix Systems Inc. + 000FCA + A-JIN TECHLINE CO, LTD - 001904 - WB Electronics Sp. z o.o. + 000FC3 + PalmPalm Technology, Inc. - 001934 - Trendon Touch Technology Corp. + 000F79 + Bluetooth Interest Group Inc. - 00190D - IEEE 1394c + 000F6C + ADDI-DATA GmbH - 001881 - Buyang Electronics Industrial Ltd + 000F8F + Cisco Systems, Inc - 001876 - WowWee Ltd + 000F7D + Xirrus - 00187A - Wiremold + 000F76 + Digital Keystone, Inc. - 00186C - Neonode AB + 000FA7 + Raptor Networks Technology - 001873 - Cisco Systems Inc. + 000F23 + Cisco Systems, Inc - 00185F - TAC Inc. + 000F22 + Helius, Inc. - 0018D4 - Unified Display Interface SIG + 000F24 + Cisco Systems, Inc - 0018A7 - Yoggie Security Systems Ltd + 000F17 + Insta Elektro GmbH - 0018A2 - XIP Technology AB + 000F1E + Chengdu KT Electric Co.of High & New Technology - 00189C - Weldex Corporation + 000F35 + Cisco Systems, Inc - 00189A - HANA Micron Inc. + 000F36 + Accurate Techhnologies, Inc. - 001864 - Eaton Corporation + 000F2B + GREENBELL SYSTEMS - 001866 - Leutron Vision + 000F28 + Itronix Corporation - 001860 - SIM Technology Group Shanghai Simcom Ltd + 000EFC + JTAG Technologies B.V. - 001897 - JESS-LINK PRODUCTS Ltd + 000EFE + EndRun Technologies LLC - 00189E - OMNIKEY GmbH. + 000EF3 + Smartlabs, Inc. - 0018A9 - Ethernet Direct Corporation + 000EF2 + Infinico Corporation - 0018A8 - AnNeal Technology Inc. + 000F5C + Day One Digital Media Limited - 0018C2 - Firetide Inc. + 000EE4 + BOE TECHNOLOGY GROUP CO.,LTD - 00183E - Digilent Inc. + 000EDE + REMEC, Inc. - 001842 - Nokia Danmark A/S + 000F52 + YORK Refrigeration, Marine & Controls - 001840 - 3 Phoenix Inc. + 000F4C + Elextech INC - 001844 - Heads Up Technologies Inc. + 000F42 + Xalyo Systems - 001821 - Sindoricoh + 000F39 + IRIS SENSORS - 001823 - Delta Electronics Inc. + 000F3E + CardioNet, Inc - 001815 - GZ Technologies Inc. + 000F3F + Big Bear Networks - 001857 - Unilever R&D + 000F08 + Indagon Oy - 001853 - Atera Networks Ltd + 000F04 + cim-usa inc - 001859 - Strawberry Linux Ltd + 000F0D + Hunt Electronic Co., Ltd. - 00184F - 8 Ways Technology Corp. + 000E83 + Cisco Systems, Inc - 001806 - Hokkei Industries Ltd + 000E81 + Devicescape Software, Inc. - 001818 - Cisco Systems Inc. + 000E88 + VIDEOTRON CORP. - 00181A - AVerMedia Information Inc. + 000E86 + Alcatel North America - 001816 - Ubixon Ltd + 000E69 + China Electric Power Research Institute - 00182B - Softier + 000E61 + MICROTROL LIMITED - 001829 - Gatsometer + 000E64 + Elphel, Inc - 001838 - PanAccess Communications,Inc. + 000E5A + TELEFIELD inc. - 0017F0 - SZCOM Broadband Network Technology Ltd + 000ECE + S.I.T.T.I. S.p.A. - 0017F1 - Renu Electronics Pvt Ltd + 000ED4 + CRESITT INDUSTRIE - 0017FF - PLAYLINE Ltd + 000ED6 + Cisco Systems, Inc - 0017F6 - Pyramid Meriden Inc. + 000ED8 + Positron Access Solutions Corp - 0017C5 - SonicWALL + 000ED1 + Osaka Micro Computer. - 0017BE - Tratec Telecom B.V. + 000EA5 + BLIP Systems - 0017C0 - PureTech Systems Inc. + 000EA0 + NetKlass Technology Inc. - 0017BA - Sedo Ltd + 000E9C + Benchmark Electronics - 0017D4 - Monsoon Multimedia Inc. + 000E9A + BOE TECHNOLOGY GROUP CO.,LTD - 001780 - Applied Biosystems B.V. + 000E7E + ionSign Oy - 0017A5 - Ralink Technology Corp + 000E77 + Decru, Inc. - 0017A8 - EDM Corporation + 000E6A + 3Com Ltd - 0017A9 - Sentivision + 000E90 + PONICO CORP. - 0017AF - Enermet + 000E8A + Avara Technologies Pty. Ltd. - 0017AA - elab-experience Inc. + 000EB8 + Iiga co.,Ltd - 0017AE - GAI-Tronics + 000EBB + Everbee Networks - 0017B5 - Peerless Systems Corporation + 000EBE + B&B Electronics Manufacturing Co. - 00176C - Pivot3 Inc. + 000EB0 + Solutions Radio BV - 001770 - Arti Industrial Electronics Ltd + 000E4C + Bermai Inc. - 00178B - Teledyne Technologies Incorporated + 000E49 + Forsway Scandinavia AB - 0017DF - Cisco Systems Inc. + 000E42 + Motic Incoporation Ltd. - 001746 - Freedom9 Inc. + 000E3D + Televic N.V. - 00174D - Dynamic Network Factory Inc. + 000E39 + Cisco Systems, Inc - 001744 - Araneo Ltd + 000DE1 + Control Products, Inc. - 001749 - Hyundae Yong-O-SA Ltd + 000DD0 + TetraTec Instruments GmbH - 001743 - Deck Srl + 000DD3 + SAMWOO Telecommunication Co.,Ltd. - 001728 - Selex Communications + 000DD8 + BBN - 001722 - Hanazeder Electronic GmbH + 000E34 + NexGen City, LP - 00173D - Neology + 000E2D + Hyundai Digital Technology Co.,Ltd. - 001740 - Bluberi Gaming Technologies Inc + 000E30 + AERAS Networks, Inc. - 001732 - Science-Technical Center RISSA + 000E0D + Hesch Schröder GmbH - 00176D - Core Corporation + 000DFF + CHENMING MOLD INDUSTRY CORP. - 001773 - Laketune Technologies Ltd + 000DF6 + Technology Thesaurus Corp. - 00173A - Cloudastructure Inc + 000E29 + Shester Communications Inc - 00172F - NeuLion Incorporated + 000E19 + LogicaCMG Pty Ltd - 001723 - Summit Data Communications + 000E5D + Triple Play Technologies A/S - 00171F - IMV Corporation + 000E52 + Optium Corporation - 001753 - nFore Technology Inc. + 000E4D + Numesa Inc. - 001757 - RIX Technology Limited + 000E1A + JPS Communications - 0016BB - Law-Chain Computer Technology Ltd + 000E06 + Team Simoco Ltd - 0016B4 - Private + 000DAE + SAMSUNG HEAVY INDUSTRIES CO., LTD. - 0016A7 - Aweta G&P + 000DB2 + Ammasso, Inc. - 001710 - Casa Systems Inc. + 000DAA + S.A.Tehnology co.,Ltd. - 0016BF - PaloDEx Group Oy + 000DA6 + Universal Switching Corporation - 0016B7 - Seoul Commtech + 000D9C + K.A. Schmersal GmbH & Co. KG - 0016E1 - SiliconStor Inc. + 000D98 + S.W.A.C. Schmitt-Walter Automation Consult GmbH - 0016E2 - American Fibertek Inc. + 000D8C + Shanghai Wedone Digital Ltd. CO. - 001713 - Tiger NetCom + 000D94 + AFAR Communications,Inc - 0016CD - Hiji High-Tech Ltd + 000D8D + Prosoft Technology, Inc - 0016EF - Koko Fitness Inc. + 000D7D + Afco Systems - 0016FD - Jaty Electronics + 000D73 + Technical Support, Inc. - 001678 - Shenzhen Baoan Gaoke Electronics Ltd + 000D69 + TMT&D Corporation - 001674 - EuroCB (Phils.) Inc. + 000D68 + Vinci Systems, Inc. - 001670 - SKNET Corporation + 000D64 + COMAG Handels AG - 001689 - Pilkor Electronics Ltd + 000D5C + Robert Bosch GmbH, VT-ATMO - 00168A - id-Confirm Inc + 000D60 + IBM Corp - 001686 - Karl Storz Imaging + 000D84 + Makus Inc. - 00168D - KORWIN Ltd + 000D74 + Sand Network Systems, Inc. - 00168E - Vimicro Corporation + 000DA2 + Infrant Technologies, Inc. - 00164F - World Ethnic Broadcastin Inc. + 000DC7 + COSMIC ENGINEERING INC. - 00167E - Diboss Ltd + 000DC2 + Private - 00167B - Haver & Boecker + 000DBF + TekTone Sound & Signal Mfg., Inc. - 001679 - eOn Communications + 000DB3 + SDO Communication Corperation - 0016A0 - Auto-Maskin + 000D38 + NISSIN INC. - 00165D - AirDefense Inc. + 000D34 + Shell International Exploration and Production, Inc. - 00165B - Grip Audio + 000D32 + DispenseSource, Inc. - 001667 - A-TEC Subsystem Inc. + 000CFC + S2io Technologies Corp - 00164A - Vibration Technology Limited + 000CF6 + Sitecom Europe BV - 001645 - Power Distribution Inc. + 000CF2 + GAMESA Eólica - 00163F - CReTE SysTEMS Inc. + 000D5F + Minds Inc - 00163D - Tsinghua Tongfang Legend Silicon Tech Ltd + 000D54 + 3Com Ltd - 00162D - STNet Ltd + 000D4C + Outline Electronics Ltd. - 001627 - embedded-logic DESIGN AND MORE GmbH + 000D4D + Ninelanes - 00163A - Yves Technology Ltd + 000D12 + AXELL Corporation - 001638 - TECOM Ltd + 000D0A + Barco Projection Systems NV - 001633 - Oxford Diagnostics Ltd + 000CDC + BECS Technology, Inc - 0015EC - Boca Devices LLC + 000D15 + Voipac s.r.o. - 0015EF - NEC TOKIN Corporation + 000D0F + Finlux Ltd - 0015E4 - Zimmer Elektromedizin + 000D2E + Matsushita Avionics Systems Corporation - 001622 - BBH Systems GmbH + 000D28 + Cisco Systems, Inc - 001613 - LibreStream Technologies Inc. + 000D53 + Beijing 5w Communication Corp. - 00160F - Badger Meter Inc + 000CE1 + The Open Group - 001604 - Sigpro + 000C71 + Wybron, Inc - 0015FB - setex schermuly textile Computer GmbH + 000C72 + Tempearl Industrial Co., Ltd. - 0015FE - Schilling Robotics LLC + 000CC2 + ControlNet (India) Private Limited - 00160D - Be Here Corporation + 000CC1 + Eaton Corporation - 0015C9 - Gumstix Inc. + 000CA1 + SIGMACOM Co., LTD. - 0015BA - iba AG + 000CA6 + Mintera Corporation - 0015BB - SMA Solar Technology AG + 000C94 + United Electronic Industries, Inc. (EUI) - 0015BF - technicob + 000C9B + EE Solutions, Inc - 001582 - Pulse Eight Limited + 000C8B + Connect Tech Inc - 00157B - Leuze electronic GmbH + Co. KG + 000C90 + Octasic Inc. - 001578 - Audio / Video Innovations + 000C8C + KODICOM CO.,LTD. - 0015AE - kyung il + 000C55 + Microlink Communications Inc. - 0015BC - Develco + 000C59 + Indyme Electronics, Inc. - 0015BD - Group 4 Technology Ltd + 000C5C + GTN Systems B.V. - 0015B5 - CI Network Corp. + 000C52 + Roll Systems Inc. - 0015CD - Exartech International Corp. + 000C78 + In-Tech Electronics Limited - 0015D9 - PKC Electronics Oy + 000C74 + RIVERTEC CORPORATION - 0015DD - IP Control Systems Ltd + 000CC5 + Nextlink Co., Ltd. - 00159C - B-KYUNG SysTEM Ltd + 000C67 + OYO ELECTRIC CO.,LTD - 001595 - Quester Tangent Corporation + 000C63 + Zenith Electronics Corporation - 001587 - Takenaka Seisakusho Ltd + 000CBF + Holy Stone Ent. Co., Ltd. - 00151A - Hunter Engineering Company + 000C2E + Openet information technology(shenzhen) Co., Ltd. - 001514 - Hu Zhou NAVA Networks & Electronics Ltd + 000C2C + Enwiser Inc. - 001516 - Uriel Systems Inc. + 000C28 + RIFATRON - 001545 - SEECODE Ltd + 000C21 + Faculty of Science and Technology, Keio University - 001543 - Aberdeen Test Center + 000C1B + ORACOM Co, Ltd. - 001541 - StrataLight Communications Inc. + 000C44 + Automated Interfaces, Inc. - 001569 - PECO II Inc. + 000C3B + Orion Electric Co., Ltd. - 001564 - BEHRINGER Spezielle Studiotechnik GmbH + 000C3D + Glsystech Co., Ltd. - 001563 - Cisco Systems Inc. + 000C14 + Diagnostic Instruments, Inc. - 001561 - JJPlus Corporation + 000C53 + Private - 001571 - Nolan Systems + 000C48 + QoStek Corporation - 001565 - Xiamen Yealink Network Technology Ltd + 000C4D + Curtiss-Wright Controls Avionics & Electronics - 001538 - RFID Inc. + 000C2F + SeorimTechnology Co.,Ltd. - 00152E - PacketHop Inc. + 000C31 + Cisco Systems, Inc - 001558 - Foxconn + 000C17 + AJA Video Systems Inc - 00151F - Multivision Intelligent Surveillance (Hong Kong) Ltd + 000C11 + NIPPON DEMPA CO.,LTD. - 001522 - Dea Security + 000BF7 + NIDEK CO.,LTD - 00154F - one RF Technology + 000C00 + BEB Industrie-Elektronik AG - 001501 - LexBox + 000BF3 + BAE SYSTEMS - 0014A3 - Vitelec BV + 000BED + ELM Inc. - 001497 - ZHIYUAN Electronics Ltd + 000BB5 + nStor Technologies, Inc. - 001499 - Helicomm Inc + 000BB9 + Imsys AB - 001492 - Liteon, Mobile Media Solution SBU + 000BBB + Etin Systems Co., Ltd - 001494 - ESU AG + 000BBC + En Garde Systems, Inc. - 0014EF - TZero Technologies Inc. + 000BB1 + Super Star Technology Co., Ltd. - 0014BC - Synectic Telecom Exports PVT Ltd + 000BBF + Cisco Systems, Inc - 0014B9 - Mstar Semiconductor + 000BAD + PC-PoS Inc. - 0014BD - IncNETWORKS Inc. + 000BA0 + T&L Information Inc. - 0014B7 - AR Infotek Inc. + 000B97 + Matsushita Electric Industrial Co.,Ltd. - 0014CA - Key Radio Systems Limited + 000B92 + Ascom Danmark A/S - 0014C8 - Contemporary Research Corp + 000B52 + JOYMAX ELECTRONICS CO. LTD. - 0014C5 - Alive Technologies Pty Ltd + 000B49 + RF-Link System Inc. - 0014DA - Huntleigh Healthcare + 000B46 + Cisco Systems, Inc - 0014D5 - Datang Telecom Technology Co. , LCD,Optical Communication Br + 000BC9 + Electroline Equipment - 0014D3 - Sepsa + 000BC2 + Corinex Communication Corp. - 0014D8 - bio-logic SA + 000B9A + Shanghai Ulink Telecom Equipment Co. Ltd. - 0014EE - Western Digital Technologies Inc. + 000B96 + Innotrac Diagnostics Oy - 0014B5 - Physiometrix,Inc + 000B9D + TwinMOS Technologies Inc. - 00149C - HF Company + 000B69 + Franke Finland Oy - 00145C - Intronics B.V. + 000B66 + Teralink Communications - 00145B - SeekerNet Inc. + 000B56 + Cybernetics - 001449 - Sichuan Changhong Electric Ltd + 000B50 + Oxygnet - 001446 - SuperVision Solutions LLC + 000B7A + L-3 Linkabit - 001440 - ATOMIC Corporation + 000B84 + BODET - 00142E - 77 Elektronika Kft. + 000B77 + Cogent Systems, Inc. - 001430 - ViPowER Inc. + 000AF2 + NeoAxiom Corp. - 001432 - Tarallax Wireless Inc. + 000AF5 + Airgo Networks, Inc. - 001485 - Giga-Byte + 000AF4 + Cisco Systems, Inc - 001483 - eXS Inc. + 000AF0 + SHIN-OH ELECTRONICS CO., LTD. R&D - 001471 - Eastern Asia Technology Limited + 000AEE + GCD Hard- & Software GmbH - 00146A - Cisco Systems Inc. + 000AE9 + AirVast Technology Inc. - 00144C - General Meters Corp. + 000ACD + Sunrich Technology Limited - 001443 - Consultronics Europe Ltd + 000ACC + Winnow Networks, Inc. - 001460 - Kyocera Wireless Corp. + 000ACF + PROVIDEO Multimedia Co. Ltd. - 0013F5 - Akimbi Systems + 000AD1 + MWS - 0013F1 - AMOD Technology Ltd + 000AD3 + INITECH Co., Ltd - 0013E7 - Halcro + 000AC8 + ZPSYS CO.,LTD. (Planning&Management) - 0013EA - Kamstrup A/S + 000B2C + Eiki Industrial Co. Ltd. - 0013E1 - Iprobe AB + 000B26 + Wetek Corporation - 0013E3 - CoVi Technologies Inc. + 000B28 + Quatech Inc. - 0013E4 - Yangjae Systems Corp. + 000B30 + Beijing Gongye Science & Technology Co.,Ltd - 0013C1 - Asoka USA Corporation + 000B2A + HOWTEL Co., Ltd. - 0013C0 - Trix Tecnologia Ltda. + 000B13 + ZETRON INC - 00141F - SunKwang Electronics Ltd + 000B10 + 11wave Technonlogy Co.,Ltd - 001412 - S-TEC electronics AG + 000B07 + Voxpath Networks - 001411 - Deutschmann Automation GmbH & Co. KG + 000B04 + Volktek Corporation - 001405 - OpenIB Inc. + 000AC6 + Overture Networks. - 004501 - Midmark RTLS + 000AAB + Toyota Technical Development Corporation - 001403 - Renasis LLC + 000B38 + Knürr GmbH - 001401 - Rivertree Networks Corp. + 000B32 + VORMETRIC, INC. - 0013D9 - Matrix Product Development Inc. + 000AD8 + IPCserv Technology Corp. - 0013CC - Tall Maple Systems + 000B2B + HOSTNET CORPORATION - 001394 - Infohand Ltd + 000B1F + I CON Computer Co. - 001389 - Redes de Telefonia Movil S.A. + 000AF9 + HiConnect, Inc. - 00138C - Kumyoung Ltd + 000B02 + Dallmeier electronic - 0013A1 - Crow Electronic Engeneering + 000A7D + Valo, Inc. - 00139C - Exavera Technologies Inc. + 000A7F + Teradon Industries, Inc - 001355 - TOMEN Cyber-business Solutions Inc. + 000A81 + TEIMA Audiotex S.L. - 001357 - Soyal Technology Ltd + 000A87 + Integrated Micromachines Inc. - 001360 - Cisco Systems Inc. + 000A77 + Bluewire Technologies LLC - 00138E - FOAB Elektronik AB + 000A7A + Kyoritsu Electric Co., Ltd. - 001376 - Tabor Electronics Ltd + 000A38 + Apani Networks - 00135D - NTTPC Communications Inc. + 000A41 + Cisco Systems, Inc - 001352 - Naztec Inc. + 000A3E + EADS Telecom - 00136C - TomTom + 000A48 + Albatron Technology - 001364 - Paradigm Technology Inc.. + 000A36 + Synelec Telecom Multimedia - 00136B - E-TEC + 000A32 + Xsido Corporation - 001380 - Cisco Systems Inc. + 000A2B + Etherstuff - 001385 - Add-On Technology Ltd + 000A9C + Server Technology, Inc. - 0013B3 - Ecom Communications Technology Ltd + 000A8C + Guardware Systems Ltd. - 0013B7 - Scantech ID + 000A96 + MEWTEL TECHNOLOGY INC. - 001308 - Nuvera Fuel Cells + 000A82 + TATSUTA SYSTEM ELECTRONICS CO.,LTD. - 001307 - Paravirtual Corporation + 000A54 + Laguna Hills, Inc. - 0012FC - PLANET System Ltd + 000A52 + AsiaRF Ltd. - 0012FE - Lenovo Mobile Communication Technology Ltd + 000A4F + Brain Boxes Limited - 0012EC - Movacolor b.v. + 000A42 + Cisco Systems, Inc - 0012EB - PDH Solutions LLC + 000A65 + GentechMedia.co.,ltd. - 001343 - Matsushita Electronic Components (Europe) GmbH + 000A59 + HW server - 00133E - MetaSwitch + 000A22 + Amperion Inc - 001345 - Eaton Corporation + 000A1C + Bridge Information Co., Ltd. - 001347 - Red Lion Controls, LP + 000AB4 + ETIC Telecommunications - 00132E - ITian Coporation + 000A75 + Caterpillar, Inc - 001339 - CCV Deutschland GmbH + 0009D0 + Solacom Technologies Inc. - 001329 - VSST Ltd + 0009CC + Moog GmbH - 00132B - Phoenix Digital + 0009C8 + SINAGAWA TSUSHIN KEISOU SERVICE - 00130B - Mextal B.V. + 0009B2 + L&F Inc. - 00130D - Galileo Avionica + 0009A8 + Eastmode Pte Ltd - 0012F7 - Xiamen Xinglian Electronics Ltd + 0009AA + Data Comm for Business, Inc. - 00131B - BeCell Innovations Corp. + 0009A4 + HARTEC Corporation - 0012E2 - ALAXALA Networks Corporation + 0009A6 + Ignis Optics, Inc. - 0012DF - Novomatic AG + 0009A7 + Bang & Olufsen A/S - 0012D4 - Princeton Technology Ltd + 0009A0 + Microtechno Corporation - 0012D9 - Cisco Systems Inc. + 00099B + Western Telematic Inc. - 0012C2 - Apex Electronics Factory + 000990 + ACKSYS Communications & systems - 0012BE - Astek Corporation + 000A12 + Azylex Technology, Inc - 0012E1 - Alliant Networks Inc. + 000A13 + Honeywell Video Systems - 0012C5 - V-Show Technology (China) Ltd + 000A09 + TaraCom Integrated Products, Inc. - 0012A0 - NeoMeridian Sdn Bhd + 0009C4 + Medicore Co., Ltd - 001286 - Endevco Corp + 0009B7 + Cisco Systems, Inc - 001263 - Data Voice Technologies GmbH + 0009EF + Vocera Communications - 001270 - NGES Denro Systems + 0009E4 + K Tech Infosystem Inc. - 00126E - Seidel Elektronik GmbH Nfg.KG + 0009F0 + Shimizu Technology Inc. - 00126F - Rayson Technology Ltd + 0009D9 + Neoscale Systems, Inc - 00125C - Green Hills Software Inc. + 000942 + Wireless Technologies, Inc - 00125F - AWIND Inc. + 000945 + Palmmicro Communications Inc - 00122D - SiNett Corporation + 00093E + C&I Technologies - 001274 - NIT lab + 000940 + AGFEO GmbH & Co. KG - 001253 - AudioDev AB + 00093B + HYUNDAI NETWORKS INC. - 00124C - BBWM Corporation + 00097F + Vsecure 2000 LTD. - 001255 - NetEffect Incorporated + 000980 + Power Zenith Inc. - 001244 - Cisco Systems Inc. + 000972 + Securebase,Inc - 00122C - Soenen Controls N.V. + 000978 + AIJI System Co., Ltd. - 00122B - Virbiage Pty Ltd + 000973 + Lenten Technology Co., Ltd. - 001232 - LeWiz Communications Inc. + 000975 + fSONA Communications Corporation - 001227 - Franklin Electric Co. Inc. + 000977 + Brunner Elektronik AG - 00121A - Techno Soft Systemnics Inc. + 000969 + Meret Optical Communications - 00121B - Sound Devices LLC + 00096E + GIANT ELECTRONICS LTD. - 0011DF - Current Energy + 000920 + EpoX COMPUTER CO.,LTD. - 0011D7 - eWerks Inc + 000922 + TST Biometrics GmbH - 001204 - u10 Networks Inc. + 000916 + Listman Home Technologies, Inc. - 00120A - Emerson Climate Technologies GmbH + 00096C + Imedia Semiconductor Corp. - 001208 - Gantner Instruments GmbH + 00095F + Telebyte, Inc. - 001201 - Cisco Systems Inc. + 000953 + Linkage System Integration Co.Ltd. - 0011EE - Estari Inc. + 00094C + Communication Weaver Co.,Ltd. - 001200 - Cisco Systems Inc. + 000930 + AeroConcierge Inc. - 0011DE - Eurilogic + 00091E + Firstech Technology Corp. - 0011C8 - Powercom Ltd + 000934 + Dream-Multimedia-Tv GmbH - 0011B8 - Liebherr - Elektronik GmbH + 00098A + EqualLogic Inc - 0011B4 - Westermo Network Technologies AB + 0008A5 + Peninsula Systems Inc. - 001178 - Chiron Technology Ltd + 0008A2 + ADI Engineering, Inc. - 00116A - Domo Ltd + 000898 + Gigabit Optics Corporation - 001193 - Cisco Systems Inc. + 00089B + ICP Electronics Inc. - 00118C - Missouri Department Of Transportation + 00089C + Elecs Industry Co., Ltd. - 00118E - Halytech Mace + 00089D + UHD-Elektronik - 001186 - Prime Systems Inc. + 0008CF + Nippon Koei Power Systems Co., Ltd. - 001183 - Datalogic ADC Inc. + 0008CB + Zeta Broadband Inc. - 00117D - ZMD America Inc. + 0008D3 + Hercules Technologies S.A.S. - 00117F - Neotune Information Technology Corporation Ltd + 0008D0 + Musashi Engineering Co., LTD. - 00119D - Diginfo Technology Corporation + 0008F4 + Bluetake Technology Co., Ltd. - 00119C - EP&T Energy + 0008F7 + Hitachi Ltd, Semiconductor & Integrated Circuits Gr - 00119A - Alkeria srl + 0008F5 + YESTECHNOLOGY Co.,Ltd. - 0011C1 - 4P Mobile Data Processing + 000911 + Cisco Systems, Inc - 0011B2 - 2001 Technology Inc. + 000912 + Cisco Systems, Inc - 0011AF - Medialink-i,Inc + 000908 + VTech Technology Corp. - 00115E - ProMinent Dosiertechnik GmbH + 00090B + MTL Instruments PLC - 00117C - e-zy.net + 0008B5 + TAI GUEN ENTERPRISE CO., LTD - 001139 - STOEBER ANTRIEBSTECHNIK GmbH + Co. KG. + 0008B7 + HIT Incorporated - 00113E - JL Corporation + 0008A9 + SangSang Technology, Inc. - 001138 - Taishin Ltd + 0008C8 + Soneticom, Inc. - 001136 - Goodrich Sensor Systems + 0008C4 + Hikari Co.,Ltd. - 00114B - Francotyp-Postalia GmbH + 0008BA + Erskine Systems Ltd - 001147 - Secom-Industry Ltd + 00088F + ADVANCED DIGITAL TECHNOLOGY - 00114A - KAYABA IndUSTRY Ltd + 00088B + Tropic Networks Inc. - 001142 - e-SMARTCOM Inc. + 000886 + Hansung Teliann, Inc. - 001120 - Cisco Systems Inc. + 0008EC + Optical Zonu Corporation - 001118 - BLX IC Design Corp Ltd + 0008E6 + Littlefeet - 001107 - RGB Networks Inc. + 0008E2 + Cisco Systems, Inc - 001108 - Orbital Data Corporation + 000905 + iTEC Technologies Ltd. - 00110C - Atmark Techno Inc. + 0008F9 + Artesyn Embedded Technologies - 00114D - Atsumi Electric Ltd + 0007E1 + WIS Communications Co. Ltd. - 001130 - Allied Telesis (Hong Kong) Ltd + 0007E0 + Palm Inc. - 001129 - Paradise Datacom Ltd + 0007D6 + Commil Ltd. - 001157 - Oki Electric Industry Ltd + 0007D7 + Caporis Networks AG - 000FD9 - FlexDSL Telecommunications AG + 0007D4 + Zhejiang Yutong Network Communication Co Ltd. - 000FD0 - Astri + 0007CE + Cabletime Limited - 000FCA - A-JIN Techline Ltd + 0007D3 + SPGPrints B.V. - 000FEC - ARKUS Inc. + 0007D0 + Automat Engenharia de Automação Ltda. - 000FED - Anam Electronics Ltd + 00085D + Mitel Corporation - 000FE5 - Mercury Security Corporation + 000855 + NASA-Goddard Space Flight Center - 000FAE - E2O Communications + 00085A + IntiGate Inc. - 000FB1 - Cognio Inc. + 000858 + Novatechnology Inc. - 000FA7 - Raptor Networks Technology + 000850 + Arizona Instrument Corp. - 000FF0 - Sunray Ltd + 00085B + Hanbit Electronics Co., Ltd. - 001103 - kawamura electric Inc. + 0007ED + Altera Corporation - 000FDD - Sordin AB + 0007EA + Massana, Inc. - 000FC3 - PalmPalm Technology Inc. + 0007F1 + TeraBurst Networks Inc. - 000F88 - AMETEK Inc. + 0007F2 + IOA Corporation - 000F7E - Ablerex Electronics Ltd + 0007F0 + LogiSync LLC - 000F83 - Brainium Technologies Inc. + 0007E7 + FreeWave Technologies - 000F84 - Astute Networks Inc. + 0007E3 + Navcom Technology, Inc. - 000F5C - Day One Digital Media Limited + 000817 + EmergeCore Networks LLC - 000F52 - YORK Refrigeration, Marine & Controls + 000815 + CATS Co., Ltd. - 000F4C - Elextech Inc + 000818 + Pixelworks, Inc. - 000F93 - Landis+Gyr Ltd + 00080F + Proximion Fiber Optics AB - 000F94 - Genexis BV + 000812 + GM-2 Corporation - 000F6C - ADDI-DATA GmbH + 00080B + Birka BPA Informationssystem AB - 000F8F - Cisco Systems Inc. + 00080A + Espera-Werke GmbH - 000F7D - Xirrus + 0007FA + ITT Co., Ltd. - 000F76 - Digital Keystone Inc. + 0007F6 + Qqest Software Systems - 000F9E - Murrelektronik GmbH + 0007FB + Giga Stream UMTS Technologies GmbH - 000F79 - Bluetooth Interest Group Inc. + 00047C + Skidata AG - 000F17 - Insta Elektro GmbH + 0007BE + DataLogic SpA - 000F1E - Chengdu KT Electric Co.Of High & New Technology + 00082B + Wooksung Electronics, Inc. - 000F15 - Icotera A/S + 00082E + Multitone Electronics PLC - 000F39 - Iris Sensors + 00082A + Powerwallz Network Security - 000F3E - CardioNet Inc. + 00086B + MIPSYS - 000F3F - Big Bear Networks + 00087F + SPAUN electronic GmbH & Co. KG - 000F35 - Cisco Systems Inc. + 0007AF + Red Lion Controls, LP - 000F36 - Accurate Techhnologies Inc. + 0007B2 + Transaccess S.A. - 000F28 - Itronix Corporation + 0007AD + Pentacon GmbH Foto-und Feinwerktechnik - 000F23 - Cisco Systems Inc. + 0007AC + Eolring - 000F22 - Helius Inc. + 0007AA + Quantum Data Inc. - 000F24 - Cisco Systems Inc. + 0007A4 + GN Netcom Ltd. - 000EFC - JTAG Technologies B.V. + 00079D + Musashi Co., Ltd. - 000EFE - EndRun Technologies LLC + 00079F + Action Digital Inc. - 000F2C - Uplogix Inc. + 000792 + Sütron Electronic GmbH - 000F2B - Greenbell Systems + 000790 + Tri-M Technologies (s) Limited - 000EF2 - Infinico Corporation + 00078D + NetEngines Ltd. - 000F0D - Hunt Electronic Ltd + 00078A + Mentor Data System Inc. - 000F08 - Indagon Oy + 00076A + NEXTEYE Co., Ltd. - 000F04 - cim-usa Inc + 000767 + Yuxing Electronics Company Limited - 000F42 - Xalyo Systems + 00075B + Gibson Guitars - 000EA5 - BLIP Systems + 000762 + Group Sense Limited - 000EA0 - NetKlass Technology Inc. + 000784 + Cisco Systems, Inc - 000EE4 - BOE Technology Group Ltd + 000776 + Federal APD - 000EDE - REMEC Inc. + 00077A + Infoware System Co., Ltd. - 000E9C - Benchmark Electronics + 00070C + SVA-Intrusion.com Co. Ltd. - 000E9A - BOE Technology Group Ltd + 00070F + Fujant, Inc. - 000E90 - Ponico Corp. + 000727 + Zi Corporation (HK) Ltd. - 000E8A - Avara Technologies Pty Ltd + 00072E + North Node AB - 000EB8 - Iiga Ltd + 0006E6 + DongYang Telecom Co., Ltd. - 000EBE - B&B Electronics Manufacturing Co. + 0006D2 + Tundra Semiconductor Corp. - 000EBB - Everbee Networks + 0006D8 + Maple Optical Systems - 000ECE - S.I.T.T.I. S.p.A. + 0006CF + Thales Avionics In-Flight Systems, LLC - 000ED4 - Cresitt Industrie + 0006B6 + Nir-Or Israel Ltd. - 000ED6 - Cisco Systems Inc. + 0006A3 + Bitran Corporation - 000ED8 - Positron Access Solutions Corp + 00069F + Kuokoa Networks - 000ED1 - Osaka Micro Computer. + 0006A2 + Microtune, Inc. - 000EB0 - Solutions Radio BV + 0006A6 + Artistic Licence Engineering Ltd - 000E83 - Cisco Systems Inc. + 0006AA + VT Miltope - 000E81 - Devicescape Software Inc. + 000657 + Market Central, Inc. - 000E88 - Videotron Corp. + 0006DC + Syabas Technology (Amquest) - 000E86 - Alcatel North America + 000697 + R & D Center - 000E69 - China Electric Power Research Institute + 00069A + e & Tel - 000E61 - Microtrol Limited + 000699 + Vida Design Co. - 000E64 - Elphel Inc. + 00068D + SEPATON, Inc. - 000E49 - Forsway Scandinavia AB + 000684 + Biacore AB - 000E42 - Motic Incoporation Ltd + 000682 + Convedia - 000E3D - Televic N.V. + 0006BB + ATI Technologies Inc. - 000E39 - Cisco Systems Inc. + 0006BD + BNTECHNOLOGY Co., Ltd. - 000E34 - NexGen City, LP + 0006C3 + Schindler Elevator Ltd. - 000E6A - 3Com Corporation + 0006B2 + Linxtek Co. - 000E5A - TELEFIELD Inc. + 0006FE + Ambrado, Inc - 000E5D - Triple Play Technologies A/S + 0006E7 + Bit Blitz Communications Inc. - 000E52 - Optium Corporation + 0006ED + Inara Networks - 000E7E - ionSign Oy + 000714 + Brightcom - 000E77 - Decru Inc. + 0006F3 + AcceLight Networks - 000E4D - Numesa Inc. + 0006DB + ICHIPS Co., Ltd. - 000E4C - Bermai Inc. + 0006B8 + Bandspeed Pty Ltd - 000E2D - Hyundai Digital Technology Ltd + 00066B + Sysmex Corporation - 000E30 - AERAS Networks Inc. + 00055A + Power Dsine Ltd. - 000E29 - Shester Communications Inc + 000653 + Cisco Systems, Inc - 000DE1 - Control Products Inc. + 00064F + PRO-NETS Technology Corporation - 000DD0 - TetraTec Instruments GmbH + 000651 + Aspen Networks Inc. - 000DD3 - SAMWOO Telecommunication Ltd + 00065C + Malachite Technologies, Inc. - 000DD8 - BBN + 000622 + Chung Fu Chen Yeh Enterprise Corp. - 000DB3 - SDO Communication Corperation + 000612 + Accusys, Inc. - 000DAE - Samsung Heavy Industries Ltd + 000609 + Crossport Systems - 000DB2 - Ammasso Inc. + 000616 + Tel Net Co., Ltd. - 000E0D - Hesch Schroder GmbH + 00060D + Wave7 Optics - 000DF6 - Technology Thesaurus Corp. + 000642 + Genetel Systems Inc. - 000DFF - Chenming Mold Industry Corp. + 00064A + Honeywell Co., Ltd. (KOREA) - 000DC7 - Cosmic Engineering Inc. + 00063F + Everex Communications Inc. - 000DC2 - Private + 00063D + Microwave Data Systems Inc. - 000DBF - TekTone Sound & Signal Mfg. Inc. + 000639 + Newtec - 000E19 - LogicaCMG Pty Ltd + 0005EF + ADOIR Digital Technology - 000E1A - JPS Communications + 0005E9 + Unicess Network, Inc. - 000E06 - Team Simoco Ltd + 000600 + Toshiba Teli Corporation - 000D5C - Robert Bosch GmbH, VT-ATMO + 0005E6 + Egenera, Inc. - 000D60 - IBM Corp + 00067D + Takasago Ltd. - 000D67 - Ericsson + 000671 + Softing AG - 000D5F - Minds Inc + 000672 + Netezza - 000D98 - S.W.A.C. Schmitt-Walter Automation Consult GmbH + 00062F + Pivotech Systems Inc. - 000D8C - Shanghai Wedone Digital Ltd + 000636 + Jedai Broadband Networks - 000D94 - AFAR Communications,Inc + 00CBBD + Cambridge Broadband Networks Group - 000DAA - S.A.Tehnology Ltd + 0005E3 + LightSand Communications, Inc. - 000DA6 - Universal Switching Corporation + 0005ED + Technikum Joanneum GmbH - 000D8D - Prosoft Technology Inc. + 00066A + InfiniCon Systems, Inc. - 000D84 - Makus Inc. + 000661 + NIA Home Technologies Corp. - 000D73 - Technical Support Inc. + 00061E + Maxan Systems - 000D69 - TMT&D Corporation + 0005C6 + Triz Communications - 000DA2 - Infrant Technologies Inc. + 0005CC + Sumtel Communications, Inc. - 000D68 - Vinci Systems Inc. + 0005CF + Thunder River Technologies, Inc. - 000D64 - CoMAG Handels AG + 0005A0 + MOBILINE Kft. - 000D74 - Sand Network Systems Inc. + 0005A6 + Extron Electronics - 000D7D - Afco Systems + 000588 + Sensoria Corp. - 000D54 - 3Com Corporation + 00058D + Lynx Photonic Networks, Inc. - 000D4C - Outline Electronics Ltd + 00058A + Netcom Co., Ltd. - 000D0F - Finlux Ltd + 000591 + Active Silicon Ltd - 000D12 - AXELL Corporation + 000593 + Grammar Engine Inc. - 000D34 - Shell International Exploration and Production Inc. + 00058F + CLCsoft co. - 000D32 - DispenseSource Inc. + 000584 + AbsoluteValue Systems, Inc. - 000CF6 - Sitecom Europe BV + 0005D6 + L-3 Linkabit - 000CF2 - GAMESA Eolica + 0005DA + Apex Automationstechnik - 000D2E - Matsushita Avionics Systems Corporation + 0005C7 + I/F-COM A/S - 000D28 - Cisco Systems Inc. + 000564 + Tsinghua Bitway Co., Ltd. - 000D4D - Ninelanes + 000558 + Synchronous, Inc. - 000D53 - Beijing 5w Communication Corp. + 000550 + Vcomms Connect Limited - 000CFC - S2io Technologies Corp + 0005A9 + Princeton Networks, Inc. - 000D38 - Nissin Inc. + 0005AF + InnoScan Computing A/S - 000D15 - Voipac s.r.o. + 0005A1 + Zenocom - 000CA1 - SIGMACOM Ltd + 000541 + Advanced Systems Co., Ltd. - 000CA6 - Mintera Corporation + 000545 + Internet Photonics - 000CC1 - Eaton Corporation + 00057A + Overture Networks - 000C8B - Connect Tech Inc + 0005BB + Myspace AB - 000C90 - Octasic Inc. + 0004F8 + QUALICABLE TV Industria E Com., Ltda - 000C8C - Kodicom Ltd + 0004F5 + SnowShore Networks, Inc. - 000CC2 - ControlNet (India) Private Limited + 0004F2 + Polycom - 000C94 - United Electronic Industries Inc. (EUI) + 0004F3 + FS FORTH-SYSTEME GmbH - 000C9B - EE Solutions Inc. + 0004ED + Billion Electric Co., Ltd. - 000CE1 - The Open Group + 0004E7 + Lightpointe Communications, Inc - 000CDC - BECS Technology Inc. + 0004E6 + Banyan Network Private Limited - 000CC5 - Nextlink Ltd + 0004DE + Cisco Systems, Inc - 000CDE - ABB STOTZ-KONTAKT GmbH + 000531 + Cisco Systems, Inc - 000CBF - Holy Stone Ent Ltd + 000539 + A Brand New World in Sweden AB - 000C4D - Curtiss-Wright Controls Avionics & Electronics + 00052A + Ikegami Tsushinki Co., Ltd. - 000C44 - Automated Interfaces Inc. + 00052D + Zoltrix International Limited - 000C3B - Orion Electric Ltd + 000517 + Shellcomm, Inc. - 000C71 - Wybron Inc. + 00051C + Xnet Technology Corp. - 000C72 - Tempearl Industrial Ltd + 000512 + Zebra Technologies Inc - 000C78 - In-Tech Electronics Limited + 000503 + ICONAG - 000C59 - Indyme Electronics Inc. + 0004F9 + Xtera Communications, Inc. - 000C5C - GTN Systems B.V. + 0004FA + NBS Technologies Inc. - 000C55 - Microlink Communications Inc. + 00053A + Willowglen Services Pte Ltd - 000C52 - Roll Systems Inc. + 0004E1 + Infinior Microsystems - 000C74 - Rivertec Corporation + 000525 + Puretek Industrial Co., Ltd. - 000C67 - OyO Electric Ltd + 0004A6 + SAF Tehnika Ltd. - 000C2E - Openet Information technology(Shenzhen) Ltd + 0004A8 + Broadmax Technologies, Inc. - 000C2C - Enwiser Inc. + 0004A1 + Pathway Connectivity - 000C28 - Rifatron + 0004A2 + L.S.I. Japan Co., Ltd. - 000C3D - Glsystech Ltd + 00049B + Cisco Systems, Inc - 000C2F - SeorimTechnology Ltd + 00047A + AXXESSIT ASA - 000C31 - Cisco Systems Inc. + 00046A + Navini Networks - 000C53 - Private + 00046B + Palm Wireless, Inc. - 000C48 - QoStek Corporation + 000472 + Telelynx, Inc. - 000C63 - Zenith Electronics Corporation + 000464 + Pulse-Link Inc - 000BBB - Etin Systems Ltd + 000490 + Optical Access - 000BBC - En Garde Systems Inc. + 000486 + ITTC, University of Kansas - 000BB1 - Super Star Technology Ltd + 00048B + Poscon Corporation - 000BBF - Cisco Systems Inc. + 000484 + Amann GmbH - 000BAD - PC-PoS Inc. + 000478 + G. Star Technology Corporation - 000BA0 - T&L Information Inc. + 00044E + Cisco Systems, Inc - 000C17 - AJA Video Systems Inc + 000452 + RocketLogix, Inc. - 000C11 - Nippon Dempa Ltd + 000442 + NACT - 000C14 - Diagnostic Instruments Inc. + 000445 + LMS Skalar Instruments GmbH - 000BB5 - nStor Technologies Inc. + 00043D + INDEL AG - 000BB9 - Imsys AB + 00043B + Lava Computer Mfg., Inc. - 000C21 - Faculty Of Science and Technology, Keio University + 000431 + GlobalStreams, Inc. - 000C1B - ORACOM Ltd + 000499 + Chino Corporation - 000BC9 - Electroline Equipment + 00048E + Ohm Tech Labs, Inc. - 000BC2 - Corinex Communication Corp. + 00048D + Teo Technologies, Inc - 000BF7 - Nidek Ltd + 0004CE + Patria Ailon - 000C00 - BEB Industrie-Elektronik AG + 0004C7 + NetMount - 000BF3 - BAE Systems + 000465 + i.s.t isdn-support technik GmbH - 000BED - ELM Inc. + 00045E + PolyTrax Information Technology AG - 000B91 - Aglaia Gesellschaft fur Bildverarbeitung und Kommunikation mbH + 0004C2 + Magnipix, Inc. - 000B97 - Matsushita Electric Industrial Ltd + 0003C9 + TECOM Co., Ltd. - 000B92 - Ascom Danmark A/S + 0003C1 + Packet Dynamics Ltd - 000B9A - Shanghai Ulink Telecom Equipment Ltd + 0003C4 + Tomra Systems ASA - 000B9D - TwinMOS Technologies Inc. + 0003BF + Centerpoint Broadband Technologies, Inc. - 000B96 - Innotrac Diagnostics Oy + 0003FD + Cisco Systems, Inc - 000B56 - Cybernetics + 0003F9 + Pleiades Communications, Inc. - 000B50 - Oxygnet + 0003FE + Cisco Systems, Inc - 000B52 - Joymax Electronics Ltd + 0003B9 + Hualong Telecom Co., Ltd. - 000B69 - Franke Finland Oy + 0003BA + Oracle Corporation - 000BA5 - Quasar Cipta Mandiri, PT + 0003AF + Paragea Communications - 000B49 - RF-Link System Inc. + 000411 + Inkra Networks, Inc. - 000B46 - Cisco Systems Inc. + 000410 + Spinnaker Networks, Inc. - 000B7A - L-3 Linkabit + 000412 + WaveSmith Networks, Inc. - 000B84 - Bodet + 0003AC + Fronius Schweissmaschinen - 000B77 - Cogent Systems Inc. + 000399 + Dongju Informations & Communications Co., Ltd. - 000B66 - Teralink Communications + 00030B + Hunter Technology, Inc. - 000B2C - Eiki Industrial Ltd + 000427 + Cisco Systems, Inc - 000B26 - Wetek Corporation + 000420 + Slim Devices, Inc. - 000B28 - Quatech Inc. + 0003DE + OTC Wireless - 000B2A - HOWTEL Ltd + 0003F5 + Chip2Chip - 000B30 - Beijing Gongye Science & Technology Ltd + 000330 + Imagenics, Co., Ltd. - 000AF2 - NeoAxiom Corp. + 000328 + Mace Group, Inc. - 000AF5 - Airgo Networks Inc. + 00032B + GAI Datenfunksysteme GmbH - 000AF0 - Shin-OH Electronics Ltd R&D + 00032C + ABB Switzerland Ltd - 000AF4 - Cisco Systems Inc. + 000323 + Cornet Technology, Inc. - 000AEE - GCD Hard- & Software GmbH + 000313 + Access Media SPA - 000AD8 - IPCserv Technology Corp. + 000310 + E-Globaledge Corporation - 000AD7 - Origin ELECTRIC Ltd + 00030A + Argus Technologies - 000B38 - Knurr GmbH + 000304 + Pacific Broadband Communications - 000B32 - Vormetric Inc. + 000301 + EXFO - 000B07 - Voxpath Networks + 0002FD + Cisco Systems, Inc - 000B04 - Volktek Corporation + 000340 + Floware Wireless Systems, Ltd. - 000AF9 - HiConnect Inc. + 0001EC + Ericsson Group - 000B1F - I CoN Computer Co. + 000333 + Digitel Co., Ltd. - 000B13 - Zetron Inc + 000338 + Oak Technology - 000B10 - 11wave Technonlogy Ltd + 000339 + Eurologic Systems, Ltd. - 000AE9 - AirVast Technology Inc. + 000331 + Cisco Systems, Inc - 000B2B - Hostnet Corporation + 000381 + Ingenico International - 000B02 - Dallmeier electronic + 000380 + SSH Communications Security Corp. - 000ACD - Sunrich Technology Limited + 000382 + A-One Co., Ltd. - 000ACC - Winnow Networks Inc. + 00037A + Taiyo Yuden Co., Ltd. - 000ACF - PROVIDEO Multimedia Ltd + 000375 + NetMedia, Inc. - 000AD1 - MWS + 000391 + Advanced Digital Broadcast, Ltd. - 000A7D - Valo Inc. + 00038F + Weinschel Corporation - 000A7F - Teradon Industries Inc. + 000384 + AETA - 000A81 - TEIMA Audiotex S.L. + 000387 + Blaze Network Products - 000A87 - Integrated Micromachines Inc. + 00035A + Photron Limited - 000A77 - Bluewire Technologies LLC + 000353 + Mitac, Inc. - 000A8C - Guardware Systems Ltd + 00031E + Optranet, Inc. - 000A96 - Mewtel Technology Inc. + 000315 + Cidco Incorporated - 000A82 - Tatsuta System Electronics Ltd + 000319 + Infineon AG - 000AD3 - INITECH Ltd + 00037B + IDEC IZUMI Corporation - 000AC8 - ZPSYS Ltd (Planning & Management) + 000367 + Jasmine Networks, Inc. - 000AC6 - Overture Networks. + 00036A + Mainnet, Ltd. - 000AAB - Toyota Technical Development Corporation + 00036B + Cisco Systems, Inc - 000AB4 - ETIC Telecommunications + 00036C + Cisco Systems, Inc - 000A7A - Kyoritsu Electric Ltd + 00034F + Sur-Gard Security - 000A9C - Server Technology Inc. + 00034A + RIAS Corporation - 000A75 - Caterpillar Inc. + 0002B6 + Acrosser Technology Co., Ltd. - 000A12 - Azylex Technology Inc. + 0002B1 + Anritsu, Ltd. - 000A13 - Honeywell Video Systems + 0002AD + HOYA Corporation - 000A09 - TaraCom Integrated Products Inc. + 0002AE + Scannex Electronics Ltd. - 000A41 - Cisco Systems Inc. + 0002A2 + Hilscher GmbH - 000A36 - Synelec Telecom Multimedia + 0002C2 + Net Vision Telecom - 000A48 - Albatron Technology + 0002BD + Bionet Co., Ltd. - 000A3E - EADS Telecom + 0002BE + Totsu Engineering, Inc. - 000A59 - HW server + 0002B9 + Cisco Systems, Inc - 000A54 - Laguna Hills Inc. + 0002BA + Cisco Systems, Inc - 000A4F - Brain Boxes Limited + 000300 + Barracuda Networks, Inc. - 000A52 - AsiaRF Ltd + 0002F9 + MIMOS Berhad - 000A02 - Annso Ltd + 0002F3 + Media Serve Co., Ltd. - 000A65 - GentechMedia Ltd + 0002EA + Focus Enhancements - 000A22 - Amperion Inc + 00025A + Catena Networks - 000A1C - Bridge Information Ltd + 00026E + NeGeN Access, Inc. - 000A32 - Xsido Corporation + 0002E7 + CAB GmbH & Co KG - 000A2B - Etherstuff + 0002DF + Net Com Systems, Inc. - 000A42 - Cisco Systems Inc. + 0002DB + NETSEC - 000A38 - Apani Networks + 000270 + Crewave Co., Ltd. - 0009A8 - Eastmode Pte Ltd + 00029A + Storage Apps - 0009AA - Data Comm for Business Inc. + 00028F + Globetek, Inc. - 0009A4 - HARTEC Corporation + 000287 + Adapcom - 0009A6 - Ignis Optics Inc. + 000281 + Madge Ltd. - 0009A7 - Bang & Olufsen A/S + 0002CF + ZyGate Communications, Inc. - 0009C8 - Sinagawa Tsushin Keisou Service + 0002D1 + Vivotek, Inc. - 0009B7 - Cisco Systems Inc. + 000254 + WorldGate - 0009B2 - L&F Inc. + 00024B + Cisco Systems, Inc - 0009F3 - WELL Communication Corp. + 00024D + Mannesman Dematic Colby Pty. Ltd. - 0009EF - Vocera Communications + 000250 + Geyser Networks, Inc. - 0009C4 - Medicore Ltd + 0001D9 + Sigma, Inc. - 0009D9 - Neoscale Systems Inc. + 0001C5 + Simpler Networks - 0009D0 - Solacom Technologies Inc. + 0001C9 + Cisco Systems, Inc - 0009CC - Moog GmbH + 0001C4 + NeoWave, Inc. - 000A00 - Mediatek Corp. + 000200 + Net & Sys Co., Ltd. - 0009F0 - Shimizu Technology Inc. + 0001E4 + Sitera, Inc. - 0009E4 - K Tech Infosystem Inc. + 0001F3 + QPS, Inc. - 000972 - Securebase,Inc + 0001E3 + Siemens AG - 000978 - AIJI System Ltd + 000248 + Pilz GmbH & Co. - 000973 - Lenten Technology Ltd + 00024C + SiByte, Inc. - 000975 - fSONA Communications Corporation + 000240 + Seedek Co., Ltd. - 000977 - Brunner Elektronik AG + 00023B + Ericsson - 000969 - Meret Optical Communications + 0001EB + C-COM Corporation - 000942 - Wireless Technologies Inc. + 0001F2 + Mark of the Unicorn, Inc. - 000945 - Palmmicro Communications Inc + 0001D8 + Teltronics, Inc. - 00093E - C&I Technologies + 000239 + Visicom - 000940 - AGFEO GmbH & Co. KG + 000233 + Mantra Communications, Inc. - 00097F - Vsecure 2000 Ltd + 00022A + Asound Electronic - 000980 - Power Zenith Inc. + 000205 + Hitachi Denshi, Ltd. - 0009A0 - Microtechno Corporation + 0001F7 + Image Display Systems, Inc. - 00099B - Western Telematic Inc. + 000221 + DSP Application, Ltd. - 000990 - ACKSYS Communications & Systems + 000215 + Cotas Computer Technology A/B - 000953 - Linkage System Integration Ltd + 00021B + Kollmorgen-Servotronix - 00094C - Communication Weaver Ltd + 00021E + SIMTEL S.R.L. - 00096E - Giant Electronics Ltd + 00018A + ROI COMPUTER AG - 00096C - Imedia Semiconductor Corp. + 000192 + Texas Digital Systems - 00095F - Telebyte Inc. + 000182 + DICA TECHNOLOGIES AG - 00098A - EqualLogic Inc + 000189 + Refraction Technology, Inc. - 0008F9 - Artesyn Embedded Technologies + 000193 + Hanbyul Telecom Co., Ltd. - 0008F4 - Bluetake Technology Ltd + 0030F5 + Wild Lab. Ltd. - 0008F7 - Hitachi Ltd Semiconductor & Integrated Circuits Gr + 000145 + WINSYSTEMS, INC. - 000920 - EpoX CoMPUTER Ltd + 000137 + IT Farm Corporation - 000922 - TST Biometrics GmbH + 000133 + KYOWA Electronic Instruments C - 000916 - Listman Home Technologies Inc. + 00013C + TIW SYSTEMS - 000911 - Cisco Systems Inc. + 00014C + Berkeley Process Control - 000912 - Cisco Systems Inc. + 0001A3 + GENESYS LOGIC, INC. - 000908 - VTech Technology Corp. + 00018C + Mega Vision - 00090B - MTL Instruments PLC + 00018F + Kenetec, Inc. - 00093B - Hyundai Networks Inc. + 00017B + Heidelberger Druckmaschinen AG - 000934 - Dream-Multimedia-Tv GmbH + 000173 + AMCC - 000931 - Future Internet Inc. + 00016C + FOXCONN - 0008F5 - YESTECHNOLOGY Ltd + 000175 + Radiant Communications Corp. - 0008EC - Optical Zonu Corporation + 00015C + CADANT INC. - 0008E6 - Littlefeet + 0001AB + Main Street Networks + + + 0001AF + Artesyn Embedded Technologies - 000930 - AeroConcierge Inc. + 000169 + Celestix Networks Pte Ltd. - 00091E - Firstech Technology Corp. + 00016B + LightChip, Inc. - 0008E2 - Cisco Systems Inc. + 0001A5 + Nextcomm, Inc. - 000905 - iTEC Technologies Ltd + 000190 + SMK-M - 0008A5 - Peninsula Systems Inc. + 0001C1 + Vitesse Semiconductor Corporation - 0008A2 - ADI Engineering Inc. + 0001B6 + SAEJIN T&M Co., Ltd. - 000898 - Gigabit Optics Corporation + 00015D + Oracle Corporation - 00089B - ICP Electronics Inc. + 00B02A + ORSYS GmbH - 00089C - Elecs Industry Ltd + 00B069 + Honewell Oy - 00089D - UHD-Elektronik + 00B0C2 + Cisco Systems, Inc - 0008CF - Nippon Koei Power Systems Ltd + 00B03B + HiQ Networks - 0008CB - Zeta Broadband Inc. + 00B086 + LocSoft Limited - 0008D3 - Hercules Technologies S.A.S. + 003046 + Controlled Electronic Manageme - 0008D0 - Musashi Engineering Ltd + 003075 + ADTECH - 0008BA - Erskine Systems Ltd + 003098 + Global Converging Technologies - 0008B5 - TAI Guen Enterprise Ltd + 00300D + MMC Technology, Inc. - 0008B7 - HIT Incorporated + 0030A2 + Lightner Engineering - 0008A9 - SangSang Technology Inc. + 003042 + DeTeWe-Deutsche Telephonwerke - 0008C8 - Soneticom Inc. + 003037 + Packard Bell Nec Services - 0008C4 - Hikari Ltd + 003057 + QTelNet, Inc. - 00088F - Advanced Digital Technology + 0030FC + Terawave Communications, Inc. - 00088B - Tropic Networks Inc. + 000127 + OPEN Networks Pty Ltd - 00086B - Mipsys + 000104 + DVICO Co., Ltd. - 00087F - SPAUN electronic GmbH & Co. KG + 00010E + Bri-Link Technologies Co., Ltd - 000886 - Hansung Teliann Inc. + 00013D + RiscStation Ltd. - 000858 - Novatechnology Inc. + 000143 + Cisco Systems, Inc - 000850 - Arizona Instrument Corp. + 00014B + Ennovate Networks, Inc. - 00085B - Hanbit Electronics Ltd + 000120 + OSCILLOQUARTZ S.A. - 00082B - Wooksung Electronics Inc. + 0030C2 + COMONE - 00082E - Multitone Electronics PLC + 0030F3 + At Work Computers - 0007ED - Altera Corporation + 0030CC + Tenor Networks, Inc. - 0007F1 - TeraBurst Networks Inc. + 0030B0 + Convergenet Technologies - 0007F2 - IOA Corporation + 00029C + 3COM - 0007EA - Massana Inc. + 00B019 + UTC CCS - 0007F0 - LogiSync LLC + 00B0C7 + Tellabs Operations, Inc. - 0007E7 - FreeWave Technologies + 003086 + Transistor Devices, Inc. - 0007D6 - Commil Ltd + 000106 + Tews Datentechnik GmbH - 0007D7 - Caporis Networks AG + 000109 + Nagano Japan Radio Co., Ltd. - 0007D4 - Zhejiang Yutong Network Communication Ltd + 00305F + Hasselblad - 0007CE - Cabletime Limited + 0030DC + RIGHTECH CORPORATION - 0007D3 - SPGPrints B.V. + 003025 + CHECKOUT COMPUTER SYSTEMS, LTD - 000813 - Diskbank Inc. + 0030C6 + CONTROL SOLUTIONS, INC. - 00080F - Proximion Fiber Optics AB + 0030E3 + SEDONA NETWORKS CORP. - 000812 - GM-2 Corporation + 0030BF + MULTIDATA GMBH - 00080B - Birka BPA Informationssystem AB + 003034 + SET ENGINEERING - 00080A - Espera-Werke GmbH + 00304A + Fraunhofer IPMS - 0007E3 - Navcom Technology Inc. + 00308D + Pinnacle Systems, Inc. - 0007E1 - WIS Communications Ltd + 0030F6 + SECURELOGIX CORPORATION - 0007E0 - Palm Inc. + 0030D6 + MSC VERTRIEBS GMBH - 0007FA - ITT Ltd + 003041 + SAEJIN T & M CO., LTD. - 0007F6 - Qqest Software Systems + 00308C + Quantum Corporation - 0007FB - Giga Stream UMTS Technologies GmbH + 003019 + Cisco Systems, Inc - 00085D - Mitel Corporation + 003076 + Akamba Corporation - 000855 - NASA-Goddard Space Flight Center + 0030EC + BORGARDT - 00085A - IntiGate Inc. + 00303C + ONNTO CORP. - 000817 - EmergeCore Networks LLC + 003024 + Cisco Systems, Inc - 000815 - CATS Ltd + 0030D8 + SITEK - 00082A - Powerwallz Network Security + 003016 + ISHIDA CO., LTD. - 0007AC - Eolring + 00306F + SEYEON TECH. CO., LTD. - 0007AA - Quantum Data Inc. + 00303D + IVA CORPORATION - 0007A4 - GN Netcom Ltd + 0030F4 + STARDOT TECHNOLOGIES - 00079D - Musashi Ltd + 0030EB + TURBONET COMMUNICATIONS, INC. - 00079F - Action Digital Inc. + 0030A1 + WEBGATE Inc. - 00047C - Skidata AG + 00306A + PENTA MEDIA CO., LTD. - 0007BE - DataLogic SpA + 003053 + Basler AG - 0007AF - Red Lion Controls, LP + 0030D2 + WIN TECHNOLOGIES, CO., LTD. - 000767 - Yuxing Electronics Company Limited + 003097 + AB Regin - 00075B - Gibson Guitars + 00D043 + ZONAL RETAIL DATA SYSTEMS - 000762 - Group Sense Limited + 00D0C1 + HARMONIC DATA SYSTEMS, LTD. - 000784 - Cisco Systems Inc. + 00D035 + BEHAVIOR TECH. COMPUTER CORP. - 000776 - Federal APD + 00D0DB + MCQUAY INTERNATIONAL - 00077A - Infoware System Ltd + 00D070 + LONG WELL ELECTRONICS CORP. - 000790 - Tri-M Technologies (s) Limited + 00D029 + WAKEFERN FOOD CORPORATION - 00078D - NetEngines Ltd + 00D0B1 + OMEGA ELECTRONICS SA - 00078A - Mentor Data System Inc. + 00D016 + SCM MICROSYSTEMS, INC. - 000792 - Sutron Electronic GmbH + 003012 + DIGITAL ENGINEERING LTD. - 0007B2 - Transaccess S.A. + 00D00F + SPEECH DESIGN GMBH - 0007AD - Pentacon GmbH Foto-und Feinwerktechnik + 003058 + API MOTION - 0007D0 - Automat Engenharia de Automacao Ltda. + 0030A6 + VIANET TECHNOLOGIES, LTD. - 00076A - NEXTEYE Ltd + 00D0C3 + VIVID TECHNOLOGY PTE, LTD. - 0006E6 - DongYang Telecom Ltd + 00D0C8 + Prevas A/S - 0006DC - Syabas Technology (Amquest) + 00D07E + KEYCORP LTD. - 00070C - SVA-Intrusion Ltd + 00D0EA + NEXTONE COMMUNICATIONS, INC. - 00070F - Fujant Inc. + 00D020 + AIM SYSTEM, INC. - 000714 - Brightcom + 00D0CB + DASAN CO., LTD. - 0006F3 - AcceLight Networks + 00D019 + DAINIPPON SCREEN CORPORATE - 0006D2 - Tundra Semiconductor Corp. + 00D013 + PRIMEX AEROSPACE COMPANY - 0006D8 - Maple Optical Systems + 00D0A3 + VOCAL DATA, INC. - 0006CF - Thales Avionics In-Flight Systems LLC + 00D0BF + PIVOTAL TECHNOLOGIES - 0006FE - Ambrado Inc. + 00D02F + VLSI TECHNOLOGY INC. - 0006E7 - Bit Blitz Communications Inc. + 00D0AC + Commscope, Inc - 0006ED - Inara Networks + 00D0BC + Cisco Systems, Inc - 0006DB - ICHIPS Ltd + 0050A1 + CARLO GAVAZZI, INC. - 000727 - Zi Corporation (HK) Ltd + 005017 + RSR S.R.L. - 00072E - North Node AB + 005065 + TDK-Lambda Corporation - 000699 - Vida Design Co. + 0050B9 + XITRON TECHNOLOGIES, INC. - 00068D - SEPATON Inc. + 00506B + SPX-ATEG - 0006A3 - Bitran Corporation + 00504A + ELTECO A.S. - 00069F - Kuokoa Networks + 00D064 + MULTITEL - 0006A2 - Microtune Inc. + 00D05E + STRATABEAM TECHNOLOGY, INC. - 0006A6 - Artistic Licence Engineering Ltd + 00D0AA + CHASE COMMUNICATIONS - 0006B8 - Bandspeed Pty Ltd + 00D0FA + Thales e-Security Ltd. - 0006BB - ATI Technologies Inc. + 00D0EB + LIGHTERA NETWORKS, INC. - 0006BD - BNTECHNOLOGY Ltd + 00D006 + Cisco Systems, Inc - 0006C3 - Schindler Elevator Ltd + 00D02A + Voxent Systems Ltd. - 0006AA - VT Miltope + 00D08F + ARDENT TECHNOLOGIES, INC. - 000657 - Market Central Inc. + 00D051 + O2 MICRO, INC. - 000697 - R & D Center + 00D0BB + Cisco Systems, Inc - 00069A - e & Tel + 00D06E + TRENDVIEW RECORDERS LTD. - 00067D - Takasago Ltd + 00D05C + KATHREIN TechnoTrend GmbH - 000671 - Softing AG + 00D05D + INTELLIWORXX, INC. - 000672 - Netezza + 00D0A1 + OSKAR VIERLING GMBH + CO. KG - 00066A - InfiniCon Systems Inc. + 00D0C0 + Cisco Systems, Inc - 000661 - NIA Home Technologies Corp. + 00D076 + Bank of America - 0006B2 - Linxtek Co. + 0050C1 + GEMFLEX NETWORKS, LTD. - 0006B6 - Nir-Or Israel Ltd + 005075 + KESTREL SOLUTIONS - 000684 - Biacore AB + 0050ED + ANDA NETWORKS - 000682 - Convedia + 005096 + SALIX TECHNOLOGIES, INC. - 0005E3 - LightSand Communications Inc. + 005024 + NAVIC SYSTEMS, INC. - 0005ED - Technikum Joanneum GmbH + 00D068 + IWILL CORPORATION - 0005EF - ADOIR Digital Technology + 005012 + CBL - GMBH - 000600 - Toshiba Teli Corporation + 0050F2 + MICROSOFT CORP. - 00066B - Sysmex Corporation + 005029 + 1394 PRINTER WORKING GROUP - 00055A - Power Dsine Ltd + 005081 + MURATA MACHINERY, LTD. - 000653 - Cisco Systems Inc. + 0050AC + MAPLE COMPUTER CORPORATION - 00064F - PRO-NETS Technology Corporation + 005049 + Arbor Networks Inc - 000612 - Accusys Inc. + 00902C + DATA & CONTROL EQUIPMENT LTD. - 000609 - Crossport Systems + 0090BD + OMNIA COMMUNICATIONS, INC. - 000616 - Tel Net Ltd + 0090B4 + WILLOWBROOK TECHNOLOGIES - 00060D - Wave7 Optics + 009003 + APLIO - 00064A - Honeywell Ltd (KOREA) + 0050CF + VANLINK COMMUNICATION TECHNOLOGY RESEARCH INSTITUTE - 00063F - Everex Communications Inc. + 0050A4 + IO TECH, INC. - 00063D - Microwave Data Systems Inc. + 0050A3 + TransMedia Communications, Inc. - 000639 - Newtec + 00505C + TUNDO CORPORATION - 00062F - Pivotech Systems Inc. + 0050B3 + VOICEBOARD CORPORATION - 000636 - Jedai Broadband Networks + 0050CD + DIGIANSWER A/S - 000651 - Aspen Networks Inc. + 00502D + ACCEL, INC. - 00065C - Malachite Technologies Inc. + 00503A + DATONG ELECTRONICS LTD. - 000642 - Genetel Systems Inc. + 005087 + TERASAKI ELECTRIC CO., LTD. - 0005E9 - Unicess Network Inc. + 00508C + RSI SYSTEMS - 0005E6 - Egenera Inc. + 0050E1 + NS TECH ELECTRONICS SDN BHD - 00061E - Maxan Systems + 0050DE + SIGNUM SYSTEMS CORP. - 000622 - Chung Fu Chen Yeh Enterprise Corp. + 00507B + MERLOT COMMUNICATIONS - 000588 - Sensoria Corp. + 00500D + SATORI ELECTORIC CO., LTD. - 00058D - Lynx Photonic Networks Inc. + 005026 + COSYSTEMS, INC. - 00058A - Netcom Ltd + 0090CF + NORTEL - 000591 - Active Silicon Ltd + 00902F + NETCORE SYSTEMS, INC. - 000593 - Grammar Engine Inc. + 009098 + SBC DESIGNS, INC. - 0005C7 - I/F-CoM A/S + 009045 + Marconi Communications - 0005CC - Sumtel Communications Inc. + 009036 + ens, inc. - 0005CF - Thunder River Technologies Inc. + 00908B + Tattile SRL - 0005C6 - Triz Communications + 009044 + ASSURED DIGITAL, INC. - 0005D6 - L-3 Linkabit + 00907C + DIGITALCAST, INC. - 0005DA - Apex Automationstechnik + 009042 + ECCS, Inc. - 0005A1 - Zenocom + 009051 + ULTIMATE TECHNOLOGY CORP. - 0005A9 - Princeton Networks Inc. + 009026 + ADVANCED SWITCHING COMMUNICATIONS, INC. - 0005AF - InnoScan Computing A/S + 0090D3 + GIESECKE & DEVRIENT GmbH - 0005A6 - Extron Electronics + 009067 + WalkAbout Computers, Inc. - 0005A0 - MOBILINE Kft. + 009025 + BAE Systems Australia (Electronic Systems) Pty Ltd - 000584 - AbsoluteValue Systems Inc. + 00904C + Epigram, Inc. - 00058F - CLCsoft Co. + 009084 + ATECH SYSTEM - 0005BB - Myspace AB + 00906A + TURNSTONE SYSTEMS, INC. - 000517 - Shellcomm Inc. + 009087 + ITIS - 00051C - Xnet Technology Corp. + 009031 + MYSTICOM, LTD. - 0004F9 - Xtera Communications Inc. + 0090DD + MIHARU COMMUNICATIONS Inc - 0004FA - NBS Technologies Inc. + 009028 + NIPPON SIGNAL CO., LTD. - 000541 - Advanced Systems Ltd + 00907D + Lake Communications - 000545 - Internet Photonics + 0090C9 + DPAC Technologies - 00053A - Willowglen Services Pte Ltd + 00907E + VETRONIX CORP. - 000531 - Cisco Systems Inc. + 009050 + Teleste Corporation - 000539 - A Brand New World in Sweden AB + 00902A + COMMUNICATION DEVICES, INC. - 00052A - Ikegami Tsushinki Ltd + 009072 + SIMRAD AS - 00052D - Zoltrix International Limited + 00900D + Overland Storage Inc. - 000525 - Puretek Industrial Ltd + 009033 + INNOVAPHONE AG - 000558 - Synchronous Inc. + 009002 + ALLGON AB - 000550 - Vcomms Connect Limited + 0090FC + NETWORK COMPUTING DEVICES - 000512 - Zebra Technologies Inc + 009014 + ROTORK INSTRUMENTS, LTD. - 000503 - Iconag + 00904D + SPEC S.A. - 00057A - Overture Networks + 0090FD + CopperCom, Inc. - 000564 - Tsinghua Bitway Ltd + 009039 + SHASTA NETWORKS - 0004F8 - QUALICABLE TV Industria E Com Ltda + 009091 + DigitalScape, Inc. - 0004F5 - SnowShore Networks Inc. + 00908D + VICKERS ELECTRONICS SYSTEMS - 0004F2 - Polycom + 009097 + Sycamore Networks - 0004F3 - FS FORTH-SysTEME GmbH + 000629 + IBM Corp - 0004ED - Billion Electric Ltd + 0010A9 + ADHOC TECHNOLOGIES - 0004E7 - Lightpointe Communications Inc. + 00108A + TeraLogic, Inc. - 0004E6 - Banyan Network Private Limited + 001024 + NAGOYA ELECTRIC WORKS CO., LTD - 0004DE - Cisco Systems Inc. + 0010D6 + Exelis - 0004A2 - L.S.I. Japan Ltd + 001048 + HTRC AUTOMATION, INC. - 00049B - Cisco Systems Inc. + 001097 + WinNet Metropolitan Communications Systems, Inc. - 000499 - Chino Corporation + 001085 + POLARIS COMMUNICATIONS, INC. - 00048E - Ohm Tech Labs Inc. + 00100C + ITO CO., LTD. - 0004A6 - SAF Tehnika Ltd + 001006 + Thales Contact Solutions Ltd. - 0004A8 - Broadmax Technologies Inc. + 00106F + TRENTON TECHNOLOGY INC. - 0004A1 - Pathway Connectivity + 001034 + GNP Computers - 0004CE - Patria Ailon + 001044 + InnoLabs Corporation - 0004C7 - NetMount + 00908E + Nortel Networks Broadband Access - 00048D - Teo Technologies Inc. + 009009 + I Controls, Inc. - 000490 - Optical Access + 0090D2 + Artel Video Systems - 0004E1 - Infinior Microsystems + 0001FE + DIGITAL EQUIPMENT CORPORATION - 0004C2 - Magnipix Inc. + 0010D9 + IBM JAPAN, FUJISAWA MT+D - 000486 - ITTC, University Of Kansas + 00103C + IC ENSEMBLE, INC. - 00048B - Poscon Corporation + 001019 + SIRONA DENTAL SYSTEMS GmbH & Co. KG - 000484 - Amann GmbH + 0010D4 + STORAGE COMPUTER CORPORATION - 000478 - G. Star Technology Corporation + 0010E2 + ArrayComm, Inc. - 00047A - Axxessit ASA + 0090DE + CARDKEY SYSTEMS, INC. - 00046A - Navini Networks + 00906B + APPLIED RESOURCES, INC. - 00046B - Palm Wireless Inc. + 0090BE + IBC/INTEGRATED BUSINESS COMPUTERS - 000472 - Telelynx Inc. + 009066 + Troika Networks, Inc. - 000464 - Pulse-Link Inc + 0010D2 + NITTO TSUSHINKI CO., LTD - 000465 - i.s.t isdn-support technik GmbH + 001094 + Performance Analysis Broadband, Spirent plc - 00045E - PolyTrax Information Technology AG + 001050 + RION CO., LTD. - 000411 - Inkra Networks Inc. + 0010CE + VOLAMP, LTD. - 000410 - Spinnaker Networks Inc. + 0010B2 + COACTIVE AESTHETICS - 000412 - WaveSmith Networks Inc. + 0010A1 + KENDIN SEMICONDUCTOR, INC. - 000442 - Nact + 00105F + ZODIAC DATA SYSTEMS - 000445 - LMS Skalar Instruments GmbH + 00103E + NETSCHOOLS CORPORATION - 00044E - Cisco Systems Inc. + 0010CB + FACIT K.K. - 000452 - RocketLogix Inc. + 0010E0 + Oracle Corporation - 000427 - Cisco Systems Inc. + 00107C + P-COM, INC. - 000420 - Slim Devices Inc. + 0010BD + THE TELECOMMUNICATION TECHNOLOGY COMMITTEE (TTC) - 00043D - Indel AG + 001038 + Micro Research Ltd. - 00043B - Lava Computer Mfg. Inc. + 0010A8 + RELIANCE COMPUTER CORP. - 000431 - GlobalStreams Inc. + 0010D1 + Top Layer Networks, Inc. - 0003C4 - Tomra Systems ASA + 00106A + DIGITAL MICROWAVE CORPORATION - 0003C5 - Mobotix AG + 00103B + HIPPI NETWORKING FORUM - 0003BF - Centerpoint Broadband Technologies Inc. + 001089 + WebSonic - 0003B9 - Hualong Telecom Ltd + 001008 + VIENNA SYSTEMS CORPORATION - 0003F9 - Pleiades Communications Inc. + 00106E + TADIRAN COM. LTD. - 0003FE - Cisco Systems Inc. + 00109A + NETLINE - 0003F5 - Chip2Chip + 00E0D1 + TELSIS LIMITED - 000391 - Advanced Digital Broadcast Ltd + 00E0F0 + ABLER TECHNOLOGY, INC. - 0003AC - Fronius Schweissmaschinen + 00E002 + CROSSROADS SYSTEMS, INC. - 000399 - Dongju Informations & Communications Ltd + 00E0D6 + COMPUTER & COMMUNICATION RESEARCH LAB. - 0003FD - Cisco Systems Inc. + 00E0B7 + Cosworth Electronics Ltd - 0003BA - Oracle Corporation + 00E083 + JATO TECHNOLOGIES, INC. - 0003AF - Paragea Communications + 00E072 + LYNK - 00030B - Hunter Technology Inc. + 00E094 + OSAI SRL - 0003C9 - TECOM Ltd + 00E032 + MISYS FINANCIAL SYSTEMS, LTD. - 0003C1 - Packet Dynamics Ltd + 00E0C0 + SEIWA ELECTRIC MFG. CO., LTD. - 0003DE - OTC Wireless + 00E027 + DUX, INC. - 000328 - Mace Group Inc. + 00E044 + LSICS CORPORATION - 00032B - GAI Datenfunksysteme GmbH + 00E0CA + BEST DATA PRODUCTS - 00032C - ABB Switzerland Ltd + 00E0A7 + IPC INFORMATION SYSTEMS, INC. - 000323 - Cornet Technology Inc. + 00E097 + CARRIER ACCESS CORPORATION - 000380 - SSH Communications Security Corp. + 00E089 + ION Networks, Inc. - 000382 - A-One Ltd + 00E070 + DH TECHNOLOGY - 00037A - Taiyo Yuden Ltd + 00E055 + INGENIERIA ELECTRONICA COMERCIAL INELCOM S.A. - 000375 - NetMedia Inc. + 00E042 + Pacom Systems Ltd. - 00035A - Photron Limited + 00E0EB + DIGICOM SYSTEMS, INCORPORATED - 000353 - Mitac Inc. + 00E04B + JUMP INDUSTRIELLE COMPUTERTECHNIK GmbH - 000356 - Wincor Nixdorf International GmbH + 00E074 + TIERNAN COMMUNICATIONS, INC. - 00034F - Sur-Gard Security + 00E0D9 + TAZMO CO., LTD. - 00037B - IDEC IZUMI Corporation + 00E093 + ACKFIN NETWORKS - 000367 - Jasmine Networks Inc. + 00E071 + EPIS MICROCOMPUTER - 00036A - Mainnet Ltd + 00E066 + ProMax Systems, Inc. - 00036B - Cisco Systems Inc. + 00E0B4 + TECHNO SCOPE CO., LTD. - 00036C - Cisco Systems Inc. + 00605B + IntraServer Technology, Inc. - 00038F - Weinschel Corporation + 0060D7 + ECOLE POLYTECHNIQUE FEDERALE DE LAUSANNE (EPFL) - 000384 - Aeta + 0060F3 + Performance Analysis Broadband, Spirent plc - 000387 - Blaze Network Products + 00607C + WaveAccess, Ltd. - 000381 - Ingenico International + 0060C1 + WaveSpan Corporation - 000340 - Floware Wireless Systems Ltd + 00603C + HAGIWARA SYS-COM CO., LTD. - 0001EC - Ericsson Group + 00607D + SENTIENT NETWORKS INC. - 000333 - Digitel Ltd + 00606E + DAVICOM SEMICONDUCTOR, INC. - 000338 - Oak Technology + 0060C7 + AMATI COMMUNICATIONS CORP. - 000339 - Eurologic Systems Ltd + 00E060 + SHERWOOD - 000331 - Cisco Systems Inc. + 00E0BA + BERGHOF AUTOMATIONSTECHNIK GmbH - 000330 - Imagenics Ltd + 00E021 + FREEGATE CORP. - 00034A - RIAS Corporation + 00E05B + WEST END SYSTEMS CORP. - 0002CF - ZyGate Communications Inc. + 00E062 + HOST ENGINEERING - 0002D1 - Vivotek Inc. + 00E001 + STRAND LIGHTING LIMITED - 0002C2 - Net Vision Telecom + 00E0D8 + LANBit Computer, Inc. - 0002B6 - Acrosser Technology Ltd + 00E01F + AVIDIA Systems, Inc. - 0002B1 - Anritsu Ltd + 00E0D0 + NETSPEED, INC. - 0002AD - HOYA Corporation + 006073 + REDCREEK COMMUNICATIONS, INC. - 0002AE - Scannex Electronics Ltd + 0060FD + NetICs, Inc. - 000304 - Pacific Broadband Communications + 0060FB + PACKETEER, INC. - 000301 - Exfo + 00E0CE + ARN - 0002FD - Cisco Systems Inc. + 00E05F + e-Net, Inc. - 000300 - Barracuda Networks Inc. + 00E0E7 + RAYTHEON E-SYSTEMS, INC. - 0002BD - Bionet Ltd + 00E073 + NATIONAL AMUSEMENT NETWORK, INC. - 0002BE - Totsu Engineering Inc. + 00E06A + KAPSCH AG - 0002B9 - Cisco Systems Inc. + 00E03C + AdvanSys - 0002BA - Cisco Systems Inc. + 00E024 + GADZOOX NETWORKS - 0002F9 - MIMOS Berhad + 1000E8 + NATIONAL SEMICONDUCTOR - 0002F3 - Media Serve Ltd + 006031 + HRK SYSTEMS - 0002EA - Focus Enhancements + 0060ED + RICARDO TEST AUTOMATION LTD. - 000313 - Access Media SPA + 006012 + POWER COMPUTING CORPORATION - 000310 - E-Globaledge Corporation + 00604D + MMC NETWORKS, INC. - 00030A - Argus Technologies + 0060DD + MYRICOM, INC. - 00031E - Optranet Inc. + 0060F4 + ADVANCED COMPUTER SOLUTIONS, Inc. - 000315 - Cidco Incorporated + 006060 + Data Innovations North America - 000319 - Infineon AG + 0060F7 + DATAFUSION SYSTEMS - 0002E7 - CAB GmbH & Co KG + 006020 + PIVOTAL NETWORKING, INC. - 0002DF - Net Com Systems Inc. + 0060C0 + Nera Networks AS - 0002DB - Netsec + 00600E + WAVENET INTERNATIONAL, INC. - 00024B - Cisco Systems Inc. + 0060A0 + SWITCHED NETWORK TECHNOLOGIES, INC. - 00024D - Mannesman Dematic Colby Pty Ltd + 006017 + TOKIMEC INC. - 000250 - Geyser Networks Inc. + 006026 + VIKING Modular Solutions - 000248 - Pilz GmbH & Co. + 006019 + Roche Diagnostics - 00024C - SiByte Inc. + 006059 + TECHNICAL COMMUNICATIONS CORP. - 00025A - Catena Networks + 006003 + TERAOKA WEIGH SYSTEM PTE, LTD. - 00026E - NeGeN Access Inc. + 006095 + ACCU-TIME SYSTEMS, INC. - 000270 - Crewave Ltd + 0060CB + HITACHI ZOSEN CORPORATION - 00023B - Ericsson + 0060C8 + KUKA WELDING SYSTEMS & ROBOTS - 000239 - Visicom + 006023 + PERICOM SEMICONDUCTOR CORP. - 000233 - Mantra Communications Inc. + 006063 + PSION DACOM PLC. - 0002A2 - Hilscher GmbH + 006035 + DALLAS SEMICONDUCTOR, INC. - 000254 - WorldGate + 006007 + ACRES GAMING, INC. - 00029A - Storage Apps + 006058 + COPPER MOUNTAIN COMMUNICATIONS, INC. - 00028F - Globetek Inc. + 00607A + DVS GMBH - 000287 - Adapcom + 006066 + LACROIX Trafic - 000281 - Madge Ltd + 006077 + PRISA NETWORKS - 000263 - UPS Manufacturing SRL + 006094 + IBM Corp - 000240 - Seedek Ltd + 0060AB + LARSCOM INCORPORATED - 0001F3 - QPS Inc. + 00605A + CELCORE, INC. - 0001E4 - Sitera Inc. + 0060A3 + CONTINUUM TECHNOLOGY CORP. - 0001E3 - Siemens AG + 00603D + 3CX - 0001EB - C-CoM Corporation + 006046 + VMETRO, INC. - 0001F2 - Mark Of the Unicorn Inc. + 00A0DA + INTEGRATED SYSTEMS Technology, Inc. - 0001D9 - Sigma Inc. + 00A02A + TRANCELL SYSTEMS - 0001C5 - Simpler Networks + 00A01C + NASCENT NETWORKS CORPORATION - 0001C9 - Cisco Systems Inc. + 00A09A + NIHON KOHDEN AMERICA - 00021B - Kollmorgen-Servotronix + 00A078 + Marconi Communications - 00021E - Simtel S.R.L. + 00A0BF + WIRELESS DATA GROUP MOTOROLA - 000221 - DSP Application Ltd + 00A05F + BTG Electronics Design BV - 0001F7 - Image Display Systems Inc. + 00A0CD + DR. JOHANNES HEIDENHAIN GmbH - 000200 - Net & Sys Ltd + 00A02D + 1394 Trade Association - 0001C4 - NeoWave Inc. + 00A07C + TONYANG NYLON CO., LTD. - 0001C1 - Vitesse Semiconductor Corporation + 00A0E6 + DIALOGIC CORPORATION - 0001D8 - Teltronics Inc. + 00A04A + NISSHIN ELECTRIC CO., LTD. - 000205 - Hitachi Denshi Ltd + 00A035 + CYLINK CORPORATION - 000215 - Cotas Computer Technology A/B + 00A03F + COMPUTER SOCIETY MICROPROCESSOR & MICROPROCESSOR STANDARDS C - 00022A - Asound Electronic + 00A03D + OPTO-22 - 00018C - Mega Vision + 00A026 + TELDAT, S.A. - 00018F - Kenetec Inc. + 00A023 + APPLIED CREATIVE TECHNOLOGY, INC. - 00017B - Heidelberger Druckmaschinen AG + 00A08F + DESKNET SYSTEMS, INC. - 00019C - JDS Uniphase Inc. + 00A0CC + LITE-ON COMMUNICATIONS, INC. - 0001A3 - Genesys Logic Inc. + 00A0B7 + CORDANT, INC. - 000182 - Dica Technologies AG + 00A056 + MICROPROSS - 000189 - Refraction Technology Inc. + 00A0E1 + WESTPORT RESEARCH ASSOCIATES, INC. - 000193 - Hanbyul Telecom Ltd + 00608A + CITADEL COMPUTER - 0030F5 - Wild Lab Ltd + 006093 + VARIAN - 00015D - Oracle Corporation + 00A089 + XPOINT TECHNOLOGIES, INC. - 000173 - AMCC + 00A007 + APEXX TECHNOLOGY, INC. - 00016C - Foxconn + 00A047 + INTEGRATED FITNESS CORP. - 000175 - Radiant Communications Corp. + 00A032 + GES SINGAPORE PTE. LTD. - 0001AF - Artesyn Embedded Technologies + 00A014 + CSIR - 00018A - ROI Computer AG + 00A015 + WYLE - 000192 - Texas Digital Systems + 00A06A + Verilink Corporation - 00015C - Cadant Inc. + 00A070 + COASTCOM - 000169 - Celestix Networks Pte Ltd + 002020 + MEGATRON COMPUTER INDUSTRIES PTY, LTD. - 00016B - LightChip Inc. + 00201B + NORTHERN TELECOM/NETWORK - 0001B6 - SAEJIN T&M Ltd + 0020C0 + PULSE ELECTRONICS, INC. - 0001AB - Main Street Networks + 00206F + FLOWPOINT CORPORATION - 000145 - Winsystems Inc. + 00A018 + CREATIVE CONTROLLERS, INC. - 000137 - IT Farm Corporation + 00A0FE + BOSTON TECHNOLOGY, INC. - 00013C - TIW Systems + 00A0EB + Encore Networks, Inc. - 000133 - KYOWA Electronic Instruments C + 00A07D + SEEQ TECHNOLOGY, INC. - 0001A5 - Nextcomm Inc. + 00A0D9 + CONVEX COMPUTER CORPORATION - 000190 - SMK-M + 0020DE + JAPAN DIGITAL LABORAT'Y CO.LTD - 00014C - Berkeley Process Control + 00200B + OCTAGON SYSTEMS CORP. - 000143 - Cisco Systems Inc. + 002094 + CUBIX CORPORATION - 00014B - Ennovate Networks Inc. + 0020F7 + CYBERDATA CORPORATION - 00013D - RiscStation Ltd + 0020D7 + JAPAN MINICOMPUTER SYSTEMS CO., Ltd. - 000120 - Oscilloquartz S.A. + 0020C3 + COUNTER SOLUTIONS LTD. - 003046 - Controlled Electronic Manageme + 0020FB + OCTEL COMMUNICATIONS CORP. - 003098 - Global Converging Technologies + 002047 + STEINBRECHER CORP. - 00300D - MMC Technology Inc. + 0020D5 + VIPA GMBH - 003075 - Adtech + 00201A + MRV Communications, Inc. - 00B069 - Honewell Oy + 0020F2 + Oracle Corporation - 00B0C2 - Cisco Systems Inc. + 0020B8 + PRIME OPTION, INC. - 00B03B - HiQ Networks + 002062 + SCORPION LOGIC, LTD. - 000127 - OPEN Networks Pty Ltd + 002081 + TITAN ELECTRONICS - 00010E - Bri-Link Technologies Ltd + 0020D9 + PANASONIC TECHNOLOGIES, INC./MIECO-US - 003037 - Packard Bell Nec Services + 00207E + FINECOM CO., LTD. - 003057 - QTelNet Inc. + 0020AD + LINQ SYSTEMS - 0030FC - Terawave Communications Inc. + 00207D + ADVANCED COMPUTER APPLICATIONS - 00B086 - LocSoft Limited + 00202F + ZETA COMMUNICATIONS, LTD. - 0030A2 - Lightner Engineering + 00209A + THE 3DO COMPANY - 003042 - DeTeWe-Deutsche Telephonwerke + 002001 + DSP SOLUTIONS, INC. - 00B0C7 - Tellabs Operations Inc. + 0020BF + AEHR TEST SYSTEMS - 00B02A - ORSYS GmbH + 00204E + NETWORK SECURITY SYSTEMS, INC. - 000104 - DVICO Ltd + 0020FF + SYMMETRICAL TECHNOLOGIES - 000106 - Tews Datentechnik GmbH + 002044 + GENITECH PTY LTD - 000109 - Nagano Japan Radio Ltd + 0020A1 + DOVATRON - 00029C - 3Com Corporation + 002070 + HYNET, LTD. - 00B019 - UTC CCS + 0020BE + LAN ACCESS CORP. - 00306F - Seyeon Tech Ltd + 00204A + PRONET GMBH - 00303D - IVA Corporation + 0020F3 + RAYNET CORPORATION - 0030F4 - Stardot Technologies + 002090 + ADVANCED COMPRESSION TECHNOLOGY, INC. - 003052 - Elastic Networks + 002053 + HUNTSVILLE MICROSYSTEMS, INC. - 003019 - Cisco Systems Inc. + 0020CA + DIGITAL OCEAN - 003076 - Akamba Corporation + 002095 + RIVA ELECTRONICS - 0030EC - Borgardt + 00203F + JUKI CORPORATION - 0030F3 - At Work Computers + 0020A9 + WHITE HORSE INDUSTRIAL - 0030CC - Tenor Networks Inc. + 002096 + Invensys - 0030B0 - Convergenet Technologies + 0020EF + USC CORPORATION - 0030EB - Turbonet Communications Inc. + 002030 + ANALOG & DIGITAL SYSTEMS - 0030A1 - WEBGATE Inc. + 0020AC + INTERFLEX DATENSYSTEME GMBH - 00306A - Penta Media Ltd + 0020D8 + Nortel Networks - 003086 - Transistor Devices Inc. + 002066 + GENERAL MAGIC, INC. - 003044 - CradlePoint Inc. + 002036 + BMC SOFTWARE - 0030C2 - Comone + 0020F8 + CARRERA COMPUTERS, INC. - 003053 - Basler AG + 00C02F + OKUMA CORPORATION - 0030D2 - WIN Technologies Ltd + 00C01E + LA FRANCAISE DES JEUX - 003097 - AB Regin + 00C0E1 + SONIC SOLUTIONS - 00305F - Hasselblad + 00C065 + SCOPE COMMUNICATIONS, INC. - 0030DC - Rightech Corporation + 00C079 + FONSYS CO.,LTD. - 003025 - Checkout Computer Systems Ltd + 00406F + SYNC RESEARCH INC. - 003012 - Digital Engineering Ltd + 00404F + SPACE & NAVAL WARFARE SYSTEMS - 0030C6 - Control Solutions Inc. + 00408F + WM-DATA MINFO AB - 0030D6 - MSC Vertriebs GmbH + 0040D7 + STUDIO GEN INC. - 003041 - Saejin T & M Ltd + 004057 + LOCKHEED - SANDERS - 00308C - Quantum Corporation + 004017 + Silex Technology America - 0030E3 - Sedona Networks Corp. + 00C071 + AREANEX COMMUNICATIONS, INC. - 0030BF - Multidata GmbH + 00C0C4 + COMPUTER OPERATIONAL - 00D00F - Speech Design GmbH + 00C012 + NETSPAN CORPORATION - 003058 - API Motion + 00C0D9 + QUINTE NETWORK CONFIDENTIALITY - 003034 - SET Engineering + 00C0B1 + GENIUS NET CO. - 00304A - Fraunhofer IPMS + 00C00F + QUANTUM SOFTWARE SYSTEMS LTD. - 00308D - Pinnacle Systems Inc. + 00C087 + UUNET TECHNOLOGIES, INC. - 0030A6 - Vianet Technologies Ltd + 00C006 + NIPPON AVIONICS CO., LTD. - 00D0BF - Pivotal Technologies + 00C0D2 + SYNTELLECT, INC. - 00303C - Onnto Corp. + 00C07E + KUBOTA CORPORATION ELECTRONIC - 003024 - Cisco Systems Inc. + 00C0DD + QLogic Corporation - 0030F6 - Securelogix Corporation + 00C01B + SOCKET COMMUNICATIONS, INC. - 00D02F - Vlsi Technology Inc. + 00C03F + STORES AUTOMATED SYSTEMS, INC. - 0030D8 - Sitek + 00C036 + RAYTECH ELECTRONIC CORP. - 003016 - Ishida Ltd + 00C040 + ECCI - 00D0B1 - Omega Electronics SA + 00C0A4 + UNIGRAF OY - 00D016 - SCM Microsystems Inc. + 00C0FA + CANARY COMMUNICATIONS, INC. - 00D043 - Zonal Retail Data Systems + 00C01C + INTERLINK COMMUNICATIONS LTD. - 00D0C1 - Harmonic Data Systems Ltd + 00C04E + COMTROL CORPORATION - 00D0AC - Commscope Inc. + 00C044 + EMCOM CORPORATION - 00D07C - Koyo Electronics Inc Ltd + 00C0E6 + Verilink Corporation - 00D0BC - Cisco Systems Inc. + 00C042 + DATALUX CORP. - 00D0CB - Dasan Ltd + 00C0A2 + INTERMEDIUM A/S - 00D019 - Dainippon Screen Corporate + 00C053 + Aspect Software Inc. - 00D035 - Behavior Tech. Computer Corp. + 00C0CC + TELESCIENCES CO SYSTEMS, INC. - 00D0DB - Mcquay International + 00C0CE + CEI SYSTEMS & ENGINEERING PTE - 00D070 - Long Well Electronics Corp. + 00C08E + NETWORK INFORMATION TECHNOLOGY - 00D029 - Wakefern Food Corporation + 00C0C7 + SPARKTRUM MICROSYSTEMS, INC. - 00D0C3 - Vivid Technology PTE Ltd + 0040F3 + NETCOR - 00D013 - Primex Aerospace Company + 00404B + MAPLE COMPUTER SYSTEMS - 00D0A3 - Vocal Data Inc. + 004033 + ADDTRON TECHNOLOGY CO., LTD. - 00D07E - Keycorp Ltd + 0040AD + SMA REGELSYSTEME GMBH - 00D020 - AIM System Inc. + 00406D + LANCO, INC. - 00D0C8 - Prevas A/S + 0040CD + TERA MICROSYSTEMS, INC. - 005017 - RSR S.R.L. + 0040F5 + OEM ENGINES - 005065 - TDK-Lambda Corporation + 004039 + OPTEC DAIICHI DENKO CO., LTD. - 0050B9 - Xitron Technologies Inc. + 004079 + JUKO MANUFACTURE COMPANY, LTD. - 00506B - SPX-Ateg + 004059 + YOSHIDA KOGYO K. K. - 00D076 - Bank Of America + 0040AE + DELTA CONTROLS, INC. - 00D051 - O2 Micro Inc. + 0040F6 + KATRON COMPUTERS INC. - 00D0BB - Cisco Systems Inc. + 00C05F + FINE-PAL COMPANY LIMITED - 00D06E - Trendview Recorders Ltd + 0080D9 + EMK Elektronik GmbH & Co. KG - 00D05C - KATHREIN TechnoTrend GmbH + 00C020 + ARCO ELECTRONIC, CONTROL LTD. - 00D0EA - Nextone Communications Inc. + 00C0E7 + FIBERDATA AB - 00D064 - Multitel + 0040F4 + CAMEO COMMUNICATIONS, INC. - 00D05E - Stratabeam Technology Inc. + 0040B4 + NEXTCOM K.K. - 00D0AA - Chase Communications + 0040B0 + BYTEX CORPORATION, ENGINEERING - 00D05D - Intelliworxx Inc. + 004086 + MICHELS & KLEBERHOFF COMPUTER - 00D0A1 - Oskar Vierling GmbH + Co. KG + 004092 + ASP COMPUTER PRODUCTS, INC. - 00D006 - Cisco Systems Inc. + 0040B9 + MACQ ELECTRONIQUE SA - 00D02A - Voxent Systems Ltd + 0040BB + GOLDSTAR CABLE CO., LTD. - 00D08F - Ardent Technologies Inc. + 0040B1 + CODONICS INC. - 00D0FA - Thales e-Security Ltd + 00407F + FLIR Systems - 00D0EB - Lightera Networks Inc. + 004095 + R.P.T. INTERGROUPS INT'L LTD. - 0050A1 - Carlo Gavazzi Inc. + 004035 + OPCOM - 00D0C0 - Cisco Systems Inc. + 00405C + FUTURE SYSTEMS, INC. - 00D068 - Iwill Corporation + 004061 + DATATECH ENTERPRISES CO., LTD. - 005029 - 1394 Printer Working Group + 00008C + Alloy Computer Products (Australia) Pty Ltd - 005081 - Murata Machinery Ltd + 0040C5 + MICOM COMMUNICATIONS INC. - 0050AC - Maple Computer Corporation + 004020 + CommScope Inc - 005049 - Arbor Networks Inc + 004048 + SMD INFORMATICA S.A. - 00500D - Satori Electoric Ltd + 004068 + EXTENDED SYSTEMS - 0050A3 - TransMedia Communications Inc. + 004078 + WEARNES AUTOMATION PTE LTD - 0050A4 - IO Tech Inc. + 0040F8 + SYSTEMHAUS DISCOM - 00505C - Tundo Corporation + 004024 + COMPAC INC. - 0050B3 - Voiceboard Corporation + 0040D2 + PAGINE CORPORATION - 00508C - RSI Systems + 0040E9 + ACCORD SYSTEMS, INC. - 0050E1 - NS Tech Electronics SDN BHD + 004003 + Emerson Process Management Power & Water Solutions, Inc. - 0050DE - Signum Systems Corp. + 004090 + ANSEL COMMUNICATIONS - 005075 - Kestrel Solutions + 00407C + QUME CORPORATION - 0050ED - Anda Networks + 004044 + QNIX COMPUTER CO., LTD. - 005096 - Salix Technologies Inc. + 00402D + HARRIS ADACOM CORPORATION - 005012 - CBL - GmbH + 008081 + KENDALL SQUARE RESEARCH CORP. - 0050F2 - Microsoft Corporation + 00809C + LUXCOM, INC. - 00504A - Elteco A.S. + 008065 + CYBERGRAPHIC SYSTEMS PTY LTD. - 0050C1 - Gemflex Networks Ltd + 008019 + DAYNA COMMUNICATIONS, INC. - 0050CF - Vanlink Communication Technology Research Institute + 008050 + ZIATECH CORPORATION - 005024 - Navic Systems Inc. + 0080D2 + SHINNIHONDENKO CO., LTD. - 0090BD - Omnia Communications Inc. + 008089 + TECNETICS (PTY) LTD. - 0090B4 - Willowbrook Technologies + 00806F + ONELAN LTD. - 009003 - Aplio + 008084 + THE CLOUD INC. - 009031 - Mysticom Ltd + 0080A6 + REPUBLIC TECHNOLOGY, INC. - 00909D - NovaTech Process Solutions LLC + 0040FC + IBR COMPUTER TECHNIK GMBH - 0090DD - MIHARU CoMMUNICATIONS Inc + 0040DE + Elsag Datamat spa - 009028 - Nippon Signal Ltd + 0040C9 + NCUBE - 00907D - Lake Communications + 0080CF + EMBEDDED PERFORMANCE INC. - 0090C9 - DPAC Technologies + 008090 + MICROTEK INTERNATIONAL, INC. - 00507B - Merlot Communications + 0080C4 + DOCUMENT TECHNOLOGIES, INC. - 0050CD - Digianswer A/S + 0040A0 + GOLDSTAR CO., LTD. - 00502D - Accel Inc. + 0040DF + DIGALOG SYSTEMS, INC. - 00503A - Datong Electronics Ltd + 004009 + TACHIBANA TECTRON CO., LTD. - 005087 - Terasaki Electric Ltd + 008032 + ACCESS CO., LTD. - 005026 - Cosystems Inc. + 00805B + CONDOR SYSTEMS, INC. - 00902C - Data & Control Equipment Ltd + 008043 + NETWORLD, INC. - 00901D - PEC (NZ) Ltd + 0080AF + ALLUMER CO., LTD. - 009097 - Sycamore Networks + 000055 + COMMISSARIAT A L`ENERGIE ATOM. - 009025 - BAE Systems Australia (Electronic Systems) Pty Ltd + 000041 + ICE CORPORATION - 00904C - Epigram Inc. + 000086 + MEGAHERTZ CORPORATION - 009084 - Atech System + 000092 + COGENT DATA TECHNOLOGIES - 00906A - Turnstone Systems Inc. + 000058 + RACORE COMPUTER PRODUCTS INC. - 009087 - Itis + 0080CE + BROADCAST TELEVISION SYSTEMS - 009051 - Ultimate Technology Corp. + 00800C + VIDECOM LIMITED - 009026 - Advanced Switching Communications Inc. + 00807D + EQUINOX SYSTEMS INC. - 0090D3 - GIESECKE & DEVRIENT GmbH + 008063 + Hirschmann Automation and Control GmbH - 009067 - WalkAbout Computers Inc. + 008074 + FISHER CONTROLS - 00902A - Communication Devices Inc. + 008030 + NEXUS ELECTRONICS - 00900D - Overland Storage Inc. + 0080C9 + ALBERTA MICROELECTRONIC CENTRE - 0090CF - Nortel Networks + 0080EE + THOMSON CSF - 009072 - Simrad AS + 00808E + RADSTONE TECHNOLOGY - 00902F - Netcore Systems Inc. + 00801A + BELL ATLANTIC - 009098 - SBC Designs Inc. + 008052 + TECHNICALLY ELITE CONCEPTS - 009045 - Marconi Communications + 00805D + CANSTAR - 009036 - ens Inc. + 00804F + DAIKIN INDUSTRIES, LTD. - 00908B - Tattile SRL + 008005 + CACTUS COMPUTER INC. - 009044 - Assured Digital Inc. + 0080CD + MICRONICS COMPUTER, INC. - 009091 - DigitalScape Inc. + 008003 + HYTEC ELECTRONICS LTD. - 00907E - Vetronix Corp. + 008099 + Eaton Industries GmbH - 009050 - Teleste Corporation + 00808D + WESTCOAST TECHNOLOGY B.V. - 00904D - Spec S.A. + 0080BE + ARIES RESEARCH - 0090FD - CopperCom Inc. + 008015 + SEIKO SYSTEMS, INC. - 009039 - Shasta Networks + 0080A4 + LIBERTY ELECTRONICS - 0090FC - Network Computing Devices + 0080F3 + SUN ELECTRONICS CORP. - 009014 - Rotork Instruments Ltd + 008096 + HUMAN DESIGNED SYSTEMS, INC. - 00908D - Vickers Electronics Systems + 0080DA + Hottinger Brüel & Kjær A/S - 009042 - ECCS Inc. + 00803E + SYNERNETICS - 009033 - Innovaphone AG + 0080DE + GIPSI S.A. - 009002 - Allgon AB + 00806D + CENTURY SYSTEMS CORP. - 0010D4 - Storage Computer Corporation + 008094 + ALFA LAVAL AUTOMATION AB - 000629 - IBM Corp + 008002 + SATELCOM (UK) LTD - 0010A9 - Adhoc Technologies + 008064 + WYSE TECHNOLOGY LLC - 00108A - TeraLogic Inc. + 008048 + COMPEX INCORPORATED - 001024 - Nagoya Electric Works Ltd + 008085 + H-THREE SYSTEMS CORPORATION - 0010D6 - Exelis + 00804C + CONTEC CO., LTD. - 001048 - Htrc Automation Inc. + 00808F + C. ITOH ELECTRONICS, INC. - 001097 - WinNet Metropolitan Communications Systems Inc. + 000052 + Intrusion.com, Inc. - 001085 - Polaris Communications Inc. + 0080FF + SOC. DE TELEINFORMATIQUE RTC - 00100C - ITO Ltd + 000037 + OXFORD METRICS LIMITED - 001006 - Thales Contact Solutions Ltd + 0000F7 + YOUTH KEEP ENTERPRISE CO LTD - 009009 - I Controls Inc. + 0000C7 + ARIX CORPORATION - 00908E - Nortel Networks Broadband Access + 0000D1 + ADAPTEC INCORPORATED - 00907C - Digitalcast Inc. + 000016 + DU PONT PIXEL SYSTEMS . - 0001FE - Digital Equipment Corporation + 0000E2 + ACER TECHNOLOGIES CORP. - 0090BE - IBC/Integrated Business Computers + 0000E1 + GRID SYSTEMS - 00103C - IC Ensemble Inc. + 000081 + Bay Networks - 001019 - SIRONA DENTAL SysTEMS GmbH & Co. KG + 000029 + IMC NETWORKS CORP. - 0090DE - Cardkey Systems Inc. + 0000FB + RECHNER ZUR KOMMUNIKATION - 00906B - Applied Resources Inc. + 00000D + FIBRONICS LTD. - 0010E2 - ArrayComm Inc. + 00000A + OMRON TATEISI ELECTRONICS CO. - 0010D2 - Nitto Tsushinki Ltd + 000024 + CONNECT AS - 0010D9 - IBM Japan, Fujisawa MT+D + 0000CF + HAYES MICROCOMPUTER PRODUCTS - 009066 - Troika Networks Inc. + 0000EF + KTI - 001094 - Performance Analysis Broadband, Spirent plc + 000025 + RAMTEK CORP. - 001050 - Rion Ltd + 000067 + SOFT * RITE, INC. - 00109C - M-System Ltd + 0000D2 + SBE, INC. - 0010CE - Volamp Ltd + 0000BA + SIIG, INC. - 0010B2 - Coactive Aesthetics + 08007B + SANYO ELECTRIC CO. LTD. - 00105F - Zodiac Data Systems + 08007C + VITALINK COMMUNICATIONS CORP. - 00103E - Netschools Corporation + 08008E + Tandem Computers - 0010CB - Facit K.K. + 080084 + TOMEN ELECTRONICS CORP. - 0010E0 - Oracle Corporation + 080085 + ELXSI - 00107C - P-CoM Inc. + 080082 + VERITAS SOFTWARE - 0010BD - THE Telecommunication Technology Committee (TTC) + 080080 + AES DATA INC. - 001008 - Vienna Systems Corporation + 00002A + TRW - SEDD/INP - 0010D1 - Top Layer Networks Inc. + 00002C + AUTOTOTE LIMITED - 00106A - Digital Microwave Corporation + 0000F3 + GANDALF DATA LIMITED - 00106F - Trenton Technology Inc. + 0000B0 + RND-RAD NETWORK DEVICES - 001034 - GNP Computers + 0000A9 + NETWORK SYSTEMS CORP. - 001044 - InnoLabs Corporation + 0000DF + BELL & HOWELL PUB SYS DIV - 0010A1 - Kendin Semiconductor Inc. + 0000F9 + QUOTRON SYSTEMS INC. - 0010A8 - Reliance Computer Corp. + 0000AF + Canberra Industries, Inc. - 00106E - Tadiran CoM Ltd + 000076 + ABEKAS VIDEO SYSTEM - 00109A - Netline + 080041 + RACAL-MILGO INFORMATION SYS.. - 001089 - WebSonic + 080035 + MICROFIVE CORPORATION - 0010E6 - Applied Intelligent Systems Inc. + 080032 + TIGAN INCORPORATED - 00103B - Hippi Networking Forum + 080077 + TSL COMMUNICATIONS LTD. - 00E083 - Jato Technologies Inc. + 080074 + CASIO COMPUTER CO. LTD. - 00E072 - Lynk + 08006E + MASSCOMP - 00E0AD - EES Technology Ltd + 080053 + MIDDLE EAST TECH. UNIVERSITY - 00E094 - Osai SRL + 08004C + HYDRA COMPUTER SYSTEMS INC. - 00E032 - Misys Financial Systems Ltd + 080047 + SEQUENT COMPUTER SYSTEMS INC. - 00E0C0 - Seiwa Electric MFG Ltd + 08004A + BANYAN SYSTEMS INC. - 00E0D1 - Telsis Limited + 080044 + DAVID SYSTEMS INC. - 00E0F0 - Abler Technology Inc. + 080068 + RIDGE COMPUTERS - 00E002 - Crossroads Systems Inc. + 080063 + PLESSEY - 00E0D6 - Computer & Communication Research LAB. + 080060 + INDUSTRIAL NETWORKING INC. - 00E074 - Tiernan Communications Inc. + 080055 + STANFORD TELECOMM. INC. - 00E0D9 - Tazmo Ltd + 08000B + UNISYS CORPORATION - 00E055 - Ingenieria Electronica Comercial Inelcom S.A. + 00DD01 + UNGERMANN-BASS INC. - 00E0B4 - Techno Scope Ltd + 08008A + PerfTech, Inc. - 00E071 - Epis Microcomputer + 00DD06 + UNGERMANN-BASS INC. - 00E066 - ProMax Systems Inc. + 02BB01 + OCTOTHORPE CORP. - 00E093 - Ackfin Networks + 00003E + SIMPACT - 00E042 - Pacom Systems Ltd + 080015 + STC BUSINESS SYSTEMS - 00E0EB - Digicom Systems Inc.orporated + 080042 + MACNICA, Inc. - 00E01C - Cradlepoint Inc. + AA0003 + DIGITAL EQUIPMENT CORPORATION - 00E027 - DUX Inc. + 080066 + AGFA CORPORATION - 00E04B - JUMP IndUSTRIELLE CoMPUTERTECHNIK GmbH + 000000 + XEROX CORPORATION - 00E097 - Carrier Access Corporation + F82111 + HMD Global Oy - 00E089 - ION Networks Inc. + EC9161 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 00E070 - DH Technology + 080030 + CERN - 00E05C - PHC Corporation + 08008D + XYVISION INC. - 00E024 - Gadzoox Networks + 00DD02 + UNGERMANN-BASS INC. - 00605B - IntraServer Technology Inc. + 00DD04 + UNGERMANN-BASS INC. - 0060D7 - Ecole Polytechnique Federale de Lausanne (Epfl) + 0001C8 + CONRAD CORP. - 00E0BA - BERGHOF AUTOMATIONSTECHNIK GmbH + 08003F + FRED KOSCHARA ENTERPRISES - 00E021 - Freegate Corp. + C0D60A + Texas Instruments - 00E05B - West END Systems Corp. + 2883C9 + Apple, Inc. - 00E044 - Lsics Corporation + 080021 + 3M COMPANY - 00E0CA - Best Data Products + 026086 + LOGIC REPLACEMENT TECH. LTD. - 00E0A7 - IPC Information Systems Inc. + DCA0D0 + Amazon Technologies Inc. - 00E062 - Host Engineering + F02F9E + Amazon Technologies Inc. - 00E0CE - ARN + 403668 + E&B TELECOM - 00E05F - e-Net Inc. + 183F70 + Apple, Inc. - 00E01F - AVIDIA Systems Inc. + A4F6E8 + Apple, Inc. - 00E0D0 - Netspeed Inc. + 6441E6 + Apple, Inc. - 00E060 - Sherwood + 70BB5B + Apple, Inc. - 00E06A - Kapsch AG + E8519E + Guangzhou Shiyuan Electronic Technology Company Limited - 00E001 - Strand Lighting Limited + 740EA4 + Apple, Inc. - 00E0D8 - LANBit Computer Inc. + 6057C8 + Apple, Inc. - 00E0E7 - Raytheon E-Systems Inc. + D4413F + Gen IV Technology LLC - 00E03C - AdvanSys + 44A038 + Huawei Device Co., Ltd. - 00E073 - National Amusement Network Inc. + D0D7BE + HUAWEI TECHNOLOGIES CO.,LTD - 006066 - LACROIX Trafic + 206BF4 + Huawei Device Co., Ltd. - 0060F4 - ADVANCED CoMPUTER SOLUTIONS Inc. + E82BC5 + Huawei Device Co., Ltd. - 006060 - Data Innovations North America + 08276B + Huawei Device Co., Ltd. - 006035 - Dallas Semiconductor Inc. + 3CCD73 + Nebula Electronic Technology Corporation - 006007 - Acres Gaming Inc. + 3C13BB + HUAWEI TECHNOLOGIES CO.,LTD - 006058 - Copper Mountain Communications Inc. + CC36CF + Cisco Systems, Inc - 0060FB - Packeteer Inc. + 58D8A7 + Bird Home Automation GmbH - 0060C1 - WaveSpan Corporation + ECB1E0 + Eltex Enterprise LTD - 00603C - Hagiwara Sys- Ltd + B40016 + INGENICO TERMINALS SAS - 00607D - Sentient Networks Inc. + C89CBB + Taicang T&W Electronics - 006019 - Roche Diagnostics + 345EE7 + Hangzhou ChengFengErLai Digial Technology Co.,Ltd. - 006059 - Technical Communications Corp. + 54B874 + GD Midea Air-Conditioning Equipment Co.,Ltd. - 006003 - Teraoka Weigh System PTE Ltd + C45781 + Wingtech Group (HongKong) Limited - 00607A - DVS GmbH + F4DD06 + Samsung Electronics Co.,Ltd - 0060F3 - Performance Analysis Broadband, Spirent plc + 101EDA + INGENICO TERMINALS SAS - 00607C - WaveAccess Ltd + 44D47F + INGENICO TERMINALS SAS - 0060A0 - Switched Network Technologies Inc. + 185D6F + N3com - 006017 - Tokimec Inc. + 6451F4 + Huawei Device Co., Ltd. - 006026 - VIKING Modular Solutions + 4C60BA + AltoBeam Inc. - 00606E - Davicom Semiconductor Inc. + 486345 + Huawei Device Co., Ltd. - 0060C7 - Amati Communications Corp. + 709041 + Mist Systems, Inc. - 1000E8 - National Semiconductor + 785994 + Alif Semiconductor, Inc. - 006073 - Redcreek Communications Inc. + 14CB49 + Habolink Technology Co.,LTD - 0060FD - NetICs Inc. + 94A4B5 + Mitsubishi Electric Corporation - 0060CB - Hitachi Zosen Corporation + C4955F + Anhui Saida Technology Limited Liability Company - 0060C8 - Kuka Welding Systems & Robots + CC1B5A + Ruckus Wireless - 006023 - Pericom Semiconductor Corp. + 3890AF + zte corporation - 006063 - Psion Dacom PLC. + 1879FD + zte corporation - 006031 - HRK Systems + 64A444 + Loongson Technology Corporation Limited - 00600E - Wavenet International Inc. + 7048B5 + CTS System Co., LTD. - 0060A3 - Continuum Technology Corp. + 18314F + AIDIN ROBOTICS - 00603D - 3CX + 0C6743 + HUAWEI TECHNOLOGIES CO.,LTD - 0060ED - Ricardo Test Automation Ltd + F47946 + HUAWEI TECHNOLOGIES CO.,LTD - 006012 - Power Computing Corporation + 30B851 + Siemens AG - 00604D - MMC Networks Inc. + 780B8C + Private - 0060F7 - Datafusion Systems + 9433D8 + Cisco Systems, Inc - 006020 - Pivotal Networking Inc. + 840A9E + Nexapp Technologies Pvt Ltd - 0060C0 - Nera Networks AS + D06B78 + Apple, Inc. - 006077 - Prisa Networks + 0C53B7 + Apple, Inc. - 006094 - IBM Corp + 7CF34D + Apple, Inc. - 0060AB - Larscom Incorporated + 000F2C + Lantronix - 0060DD - Myricom Inc. + FCD586 + Shenzhen SuperElectron Technology Co.,Ltd. - 006046 - Vmetro Inc. + 0CDC91 + Amazon Technologies Inc. - 006068 - Dialogic Corporation + 981C42 + LAIIER - 00605A - Celcore Inc. + 58350F + EM Microelectronic - 006095 - Accu-Time Systems Inc. + 3067A1 + Sagemcom Broadband SAS - 00608A - Citadel Computer + D01BF4 + Sagemcom Broadband SAS - 006093 - Varian + ACA09D + Juniper Networks - 00A03F - Computer Society Microprocessor & Microprocessor Standards C + 78BBC1 + SERVERCOM (INDIA) PRIVATE LIMITED - 00A02D - 1394 Trade Association + E4BC96 + Versuni - 00A07C - Tonyang Nylon Ltd + E023FF + Fortinet, Inc. - 00A09A - Nihon Kohden America + E8EDD6 + Fortinet, Inc. - 00A093 - B/E AEROSPACE Inc. + 70BC48 + Cisco Systems, Inc - 00A078 - Marconi Communications + E81CBA + Fortinet, Inc. - 00A0BF - Wireless Data Group Motorola + D0C730 + zte corporation - 00A05F - BTG Electronics Design BV + 2459E5 + GD Midea Air-Conditioning Equipment Co.,Ltd. - 00A0CD - DR. JOHANNES HEIDENHAIN GmbH + 20C792 + Wuhan Maiwe communication Co.,Ltd - 00A0DA - INTEGRATED SysTEMS Technology Inc. + A0BC6F + Cisco Systems, Inc - 00A02A - Trancell Systems + B08D57 + Cisco Systems, Inc - 00A01C - Nascent Networks Corporation + 189341 + Intel Corporate - 00A08F - Desknet Systems Inc. + DC4546 + Intel Corporate - 00A0CC - Lite-ON Communications Inc. + 94CE0F + Huawei Device Co., Ltd. - 00A0E6 - Dialogic Corporation + 883F27 + Huawei Device Co., Ltd. - 00A04A - Nisshin Electric Ltd + 24E29D + Huawei Device Co., Ltd. - 00A035 - Cylink Corporation + 2C2080 + Huawei Device Co., Ltd. - 00A03D - Opto-22 + CCBC2B + Huawei Device Co., Ltd. - 00A056 - Micropross + C02B56 + CANDID OPTRONIX PRIVATE LIMITED - 00A0E1 - Westport Research Associates Inc. + DC97BA + Intel Corporate - 00A0B7 - Cordant Inc. + A0D365 + Intel Corporate - 00A026 - Teldat, S.A. + B402F2 + Synaptics, Inc - 00A023 - Applied Creative Technology Inc. + 744DDC + Sonim Technologies, Inc - 00A089 - Xpoint Technologies Inc. + B8A14A + Raisecom Technology CO., LTD - 00A007 - Apexx Technology Inc. + 3C6D66 + NVIDIA Corporation - 00A047 - Integrated Fitness Corp. + 74D5C6 + Microchip Technologies Inc - 00A032 - GES Singapore PTE Ltd + BC09EB + TECNO MOBILE LIMITED - 00A0E3 - XKL Systems Corp. + 5C640F + Sage Technologies Inc. - 00A014 - Csir + 38A746 + COMPAL INFORMATION (KUNSHAN) CO., LTD. - 00A015 - Wyle + 6CE2D3 + New H3C Technologies Co., Ltd - 00A06A - Verilink Corporation + 5C167D + HUAWEI TECHNOLOGIES CO.,LTD - 00A018 - Creative Controllers Inc. + 50E452 + Chipsea Technologies (Shenzhen) Corp. - 00A0FE - Boston Technology Inc. + A4A490 + Samsung Electronics Co.,Ltd - 00A0EB - Encore Networks Inc. + B8A825 + Samsung Electronics Co.,Ltd - 00A07D - Seeq Technology Inc. + CCF9F0 + Samsung Electronics Co.,Ltd - 00A0D9 - Convex Computer Corporation + F0A882 + shenzhen trolink Technology Co.,Ltd - 00A070 - Coastcom + 10322C + Murata Manufacturing Co., Ltd. - 0020DE - Japan Digital Laborat'Y Ltd + DCC49C + Samsung Electronics Co.,Ltd - 00200B - Octagon Systems Corp. + E4C770 + Raisecom Technology CO., LTD - 002094 - Cubix Corporation + E067B3 + Shenzhen C-Data Technology Co., Ltd. - 0020F7 - Cyberdata Corporation + 70A56A + Shenzhen C-Data Technology Co., Ltd. - 0020D7 - JAPAN MINICOMPUTER SysTEMS Ltd + DC8E8D + Netis Technology Co., Ltd. - 0020C3 - Counter Solutions Ltd + E4BEED + Netis Technology Co., Ltd. - 002047 - Steinbrecher Corp. + 007263 + Netis Technology Co., Ltd. - 0020D5 - Vipa GmbH + F84288 + Apple, Inc. - 00201A - MRV Communications Inc. + 88B7EB + Apple, Inc. - 0020F2 - Oracle Corporation + 10A2D3 + Apple, Inc. - 0020B8 - Prime Option Inc. + F44250 + Bouffalo Lab (Nanjing) Co., Ltd. - 0020AD - Linq Systems + BC62CE + Netis Technology Co., Ltd. - 00207D - Advanced Computer Applications + 98D7E1 + Cisco Systems, Inc - 00202F - Zeta Communications Ltd + F83918 + Cisco Systems, Inc - 00209A - THE 3DO Company + 84B1E2 + Microsoft Corporation - 002062 - Scorpion Logic Ltd + FC34E2 + Shenzhen YOUHUA Technology Co., Ltd - 002081 - Titan Electronics + 4C97CC + Apple, Inc. - 0020D9 - Panasonic Technologies Inc./Mieco-US + 34EE16 + Apple, Inc. - 00206F - Flowpoint Corporation + 48849D + Texas Instruments - 002020 - Megatron Computer Industries Pty Ltd + 600F6B + Apple, Inc. - 00201B - Northern Telecom/Network + 44F971 + SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. - 0020F3 - Raynet Corporation + 386B1C + SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. - 002090 - Advanced Compression Technology Inc. + 349677 + zte corporation - 0020C0 - Pulse Electronics Inc. + 2475FC + zte corporation - 00207E - Finecom Ltd + 508965 + SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. - 00204E - Network Security Systems Inc. + C03FBB + Zhongshan Zhiniu Electronics Co.,Ltd. - 0020CA - Digital Ocean + 5C579E + Chiun Mai Communication System, Inc - 002095 - Riva Electronics + 441A84 + Quectel Wireless Solutions Co.,Ltd. - 0020FB - Octel Communications Corp. + 705464 + Silicon Laboratories - 002070 - Hynet Ltd + 8C6FB9 + Silicon Laboratories - 0020BE - LAN Access Corp. + 142D41 + Silicon Laboratories - 00203F - Juki Corporation + 048727 + Silicon Laboratories - 0020A9 - White Horse Industrial + 4C5BB3 + Silicon Laboratories - 002096 - Invensys + 287681 + Silicon Laboratories - 00204A - Pronet GmbH + 30FB10 + Silicon Laboratories - 0020FF - Symmetrical Technologies + 94B216 + Silicon Laboratories - 002044 - Genitech Pty Ltd + 8C65A3 + Silicon Laboratories - 0020EF - USC Corporation + B43A31 + Silicon Laboratories - 002030 - Analog & Digital Systems + 28F8C6 + IEEE Registration Authority - 0020AC - Interflex Datensysteme GmbH + C88AD8 + CHINA DRAGON TECHNOLOGY LIMITED - 0020D8 - Nortel Networks + D058AB + Mara Tech LLC - 002066 - General Magic Inc. + 9440F3 + HUAWEI TECHNOLOGIES CO.,LTD - 002001 - DSP Solutions Inc. + 406F27 + HUAWEI TECHNOLOGIES CO.,LTD - 0020BF - Aehr Test Systems + 18CAA7 + zte corporation - 002053 - Huntsville Microsystems Inc. + D487CC + Sivantos GmbH - 0020A1 - Dovatron + 003358 + Ruckus Wireless - 00C02F - Okuma Corporation + 644EEB + Daikin Holdings Singapore Pte Ltd - 00C01E - LA Francaise DES Jeux + E04C12 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 00C0E1 - Sonic Solutions + 24E8CE + Qingdao Haier Technology Co.,Ltd - 002036 - BMC Software + 9C3818 + Cisco Systems, Inc - 0020F8 - Carrera Computers Inc. + B44C90 + Cisco Systems, Inc - 00C065 - Scope Communications Inc. + DCEAE7 + D-Link Corporation - 00C079 - Fonsys Ltd + 8CA682 + IEEE Registration Authority - 00C00F - Quantum Software Systems Ltd + 4CA919 + Tuya Smart Inc. - 00C087 - Uunet Technologies Inc. + A8EA71 + Fiberhome Telecommunication Technologies Co.,LTD - 00C006 - Nippon Avionics Ltd + BC629C + zte corporation - 00C0A4 - Unigraf Oy + D41761 + Xiaomi Communications Co Ltd - 00C029 - Nexans Deutschland GmbH - ANS + D825DF + CAME UK - 00C0FA - Canary Communications Inc. + 684983 + HUAWEI TECHNOLOGIES CO.,LTD - 00C03A - MEN-Mikro Elektronik GmbH + 2CECF7 + Shenzhen SDMC Technology CO.,Ltd. - 00C040 - Ecci + 90F721 + IndiNatus (IndiNatus India Private Limited) - 00C01C - Interlink Communications Ltd + E8DA3E + Huawei Device Co., Ltd. - 00C042 - Datalux Corp. + ECB878 + Huawei Device Co., Ltd. - 00C071 - Areanex Communications Inc. + 38F45E + H1-Radio co.,ltd - 00C044 - Emcom Corporation + 78F505 + Murata Manufacturing Co., Ltd. - 00C0E6 - Verilink Corporation + 588D39 + MITSUBISHI ELECTRIC AUTOMATION (CHINA) LTD. - 00C096 - Tamura Corporation + B8E28C + MOTOROLA SOLUTIONS MALAYSIA SDN. BHD. - 00C04E - Comtrol Corporation + E0DAD7 + zte corporation - 00C03F - Stores Automated Systems Inc. + 94BB43 + AzureWave Technology Inc. - 00C036 - Raytech Electronic Corp. + 30A3B5 + Jiangsu Best Tone Information Service Co., Ltd - 00C0A2 - Intermedium A/S + B8F774 + Fiberhome Telecommunication Technologies Co.,LTD - 00C053 - Aspect Software Inc. + 2CCF67 + Raspberry Pi (Trading) Ltd - 00C0CC - Telesciences Co Systems Inc. + 444963 + Woven By Toyota U.S., Inc. - 00C0CE - CEI Systems & Engineering PTE + 6074B1 + Home Control Singapore Pte Ltd - 00404F - Space & Naval Warfare Systems + 34C8D6 + IEEE Registration Authority - 00408F - WM-Data Minfo AB + 281DFB + HUAWEI TECHNOLOGIES CO.,LTD - 0040D7 - Studio GEN Inc. + 0C238D + HUAWEI TECHNOLOGIES CO.,LTD - 004057 - Lockheed - Sanders + DC6180 + HUAWEI TECHNOLOGIES CO.,LTD - 004017 - Silex Technology America + A86F36 + vivo Mobile Communication Co., Ltd. - 00C0D9 - Quinte Network Confidentiality + C0A476 + Ruijie Networks Co.,LTD - 00C0B1 - Genius NET Co. + 20019C + Bigleaf Networks Inc. - 00C0D2 - Syntellect Inc. + 48A3BD + Texas Instruments - 00C07E - Kubota Corporation Electronic + 042322 + Texas Instruments - 00C0DD - QLogic Corporation + 28DE59 + Domus NTW CORP. - 00C01B - Socket Communications Inc. + B8D0F0 + FCNT LLC - 00406F - Sync Research Inc. + 702AD7 + New H3C Intelligence Terminal Co., Ltd. - 0040F3 - Netcor + ECC342 + zte corporation - 00404B - Maple Computer Systems + 94BE50 + Remote Solution - 004033 - Addtron Technology Ltd + AC0775 + Apple, Inc. - 00C08E - Network Information Technology + 842F57 + Apple, Inc. - 00C0C7 - Sparktrum Microsystems Inc. + 1881ED + TERACOM TELEMATICA S.A - 00C0C4 - Computer Operational + 00109C + MG Co., Ltd. - 00C012 - Netspan Corporation + D44D9F + Shenzhen Skyworth Digital Technology CO., Ltd - 0040AD - SMA Regelsysteme GmbH + 9CD4A6 + SERVERCOM (INDIA) PRIVATE LIMITED - 00406D - Lanco Inc. + A86308 + AVUTEC - 0040CD - Tera Microsystems Inc. + 684216 + Steplock Access AB - 0040F5 - OEM Engines + 6CF2D8 + CANON INC. - 004039 - Optec Daiichi Denko Ltd + F0FC65 + SynaXG Technologies Pte. Ltd. - 004079 - Juko Manufacture Company Ltd + A427A5 + Palo Alto Networks - 00C020 - Arco Electronic, Control Ltd + 002480 + Meteocontrol GmbH - 00C0E7 - Fiberdata AB + C4BD8D + SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD - 00C05F - Fine-PAL Company Limited + 944BF8 + TOZO INC - 0040AE - Delta Controls Inc. + 989DB2 + GOIP Global Services Pvt. Ltd. - 0040F6 - Katron Computers Inc. + 683421 + Intel Corporate - 004086 - Michels & Kleberhoff Computer + 002218 + Akamai Technologies Inc. - 004092 - ASP Computer Products Inc. + 00019C + Lumentum - 004068 - Extended Systems + 68E905 + Fiberhome Telecommunication Technologies Co.,LTD - 004078 - Wearnes Automation PTE Ltd + 34E3FB + Samsung Electronics Co.,Ltd - 0040F4 - Cameo Communications Inc. + 98348C + Great Talent Technology Limited - 0040B4 - Nextcom K.K. + 985F41 + Intel Corporate - 0040B0 - Bytex Corporation, Engineering + AC3971 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 0080D9 - EMK Elektronik GmbH & Co. KG + A044B7 + PAX Computer Technology(Shenzhen) Ltd. - 004059 - Yoshida Kogyo K. K. + 601D16 + Med-Eng Holdings ULC - 004095 - R.P.T. Intergroups Int'l Ltd + 985A98 + HUAWEI TECHNOLOGIES CO.,LTD - 004035 - Opcom + E0AD9B + HUAWEI TECHNOLOGIES CO.,LTD - 00405C - Future Systems Inc. + B05A44 + Fibocom Wireless Inc. - 004061 - Datatech Enterprises Ltd + 38F18F + Technicolor (China) Technology Co., Ltd. - 00008C - Alloy Computer Products (Australia) Pty Ltd + 4099F6 + Telink Semiconductor(Shanghai) Co.,Ltd - 0040B9 - Macq Electronique SA + CC8C17 + ITEL MOBILE LIMITED - 0040BB - Goldstar Cable Ltd + 34CFB5 + Robotic d.o.o. - 0040B1 - Codonics Inc. + 849CA4 + Mimosa Networks - 0040F8 - Systemhaus Discom + 00D6CB + Quectel Wireless Solutions Co.,Ltd. - 0040D2 - Pagine Corporation + 883E0D + HD Hyundai Electric - 004024 - Compac Inc. + B83B8F + Hangzhou Hylin IoT Techonology Co.,Ltd. - 0040E9 - Accord Systems Inc. + 0003C5 + Mobotix AG - 004003 - Emerson Process Management Power & Water Solutions Inc. + 58A8E8 + Amazon Technologies Inc. - 004090 - Ansel Communications + 00E05C + PHC Corporation - 0040C5 - Micom Communications Inc. + 640C91 + Apple, Inc. - 004020 - CommScope Inc + 5893E8 + Apple, Inc. - 004048 - SMD Informatica S.A. + F004E1 + Apple, Inc. - 00407C - Qume Corporation + 708CF2 + Apple, Inc. - 00407F - FLIR Systems + F873DF + Apple, Inc. - 00402D - Harris Adacom Corporation + 141BA0 + Apple, Inc. - 0080A6 - Republic Technology Inc. + 9C4FAC + zte corporation - 0040DE - Elsag Datamat spa + A8C246 + Gemtek Technology Co., Ltd. - 0040C9 - Ncube + CC817D + Apple, Inc. - 008032 - Access Ltd + 20F094 + Google, Inc. - 0080CF - Embedded Performance Inc. + 60C22A + Allwinner Technology Co., Ltd - 008090 - Microtek International Inc. + 700894 + Liteon Technology Corporation - 004044 - Qnix Computer Ltd + B0386C + EFM Networks - 0080C4 - Document Technologies Inc. + BCF212 + Telink Micro LLC - 00805B - Condor Systems Inc. + 2C0B97 + Xiaomi Communications Co Ltd - 008043 - Networld Inc. + 74238D + zte corporation - 0040DF - Digalog Systems Inc. + D069C1 + HUAWEI TECHNOLOGIES CO.,LTD - 004009 - Tachibana Tectron Ltd + 542F2B + HUAWEI TECHNOLOGIES CO.,LTD - 0040A0 - Goldstar Ltd + A41162 + Arlo Technology - 0040FC - IBR Computer Technik GmbH + 08BAB7 + Ceragon Networks Ltd. - 0080AF - Allumer Ltd + A067D6 + Nokia - 008084 - THE Cloud Inc. + E82689 + Hewlett Packard Enterprise - 0080F3 - SUN Electronics Corp. + B8D4E7 + Hewlett Packard Enterprise - 008099 - Eaton Industries GmbH + F860F0 + Hewlett Packard Enterprise - 00808D - Westcoast Technology B.V. + 1C28AF + Hewlett Packard Enterprise - 0080BE - Aries Research + 28DE65 + Hewlett Packard Enterprise - 008015 - Seiko Systems Inc. + 88E9A4 + Hewlett Packard Enterprise - 0080D2 - Shinnihondenko Ltd + 9CDC71 + Hewlett Packard Enterprise - 008089 - Tecnetics (Pty) Ltd + 303FBB + Hewlett Packard Enterprise - 00806F - Onelan Ltd + F42E7F + Hewlett Packard Enterprise - 008081 - Kendall Square Research Corp. + B83A5A + Hewlett Packard Enterprise - 00809C - Luxcom Inc. + A8BD27 + Hewlett Packard Enterprise - 008065 - Cybergraphic Systems Pty Ltd + 40B93C + Hewlett Packard Enterprise - 008019 - Dayna Communications Inc. + E0071B + Hewlett Packard Enterprise - 008050 - Ziatech Corporation + D89403 + Hewlett Packard Enterprise - 0080A4 - Liberty Electronics + 186472 + Hewlett Packard Enterprise - 0080CD - Micronics Computer Inc. + 6CF37F + Hewlett Packard Enterprise - 008003 - Hytec Electronics Ltd + 24DEC6 + Hewlett Packard Enterprise - 008052 - Technically Elite Concepts + 84D47E + Hewlett Packard Enterprise - 00805D - Canstar + 943FC2 + Hewlett Packard Enterprise - 00804F - Daikin Industries Ltd + 9440C9 + Hewlett Packard Enterprise - 008005 - Cactus Computer Inc. + 3810F0 + Hewlett Packard Enterprise - 00806D - Century Systems Corp. + CC88C7 + Hewlett Packard Enterprise - 008094 - Alfa Laval Automation AB + EC0273 + Hewlett Packard Enterprise - 000041 - ICE Corporation + D04DC6 + Hewlett Packard Enterprise - 000086 - Megahertz Corporation + 9460D5 + Hewlett Packard Enterprise - 000092 - Cogent Data Technologies + 882510 + Hewlett Packard Enterprise - 000058 - Racore Computer Products Inc. + D4E053 + Hewlett Packard Enterprise - 008074 - Fisher Controls + 441244 + Hewlett Packard Enterprise - 008030 - Nexus Electronics + 54F0B1 + Hewlett Packard Enterprise - 000055 - Commissariat A L`Energie Atom. + B837B2 + Hewlett Packard Enterprise - 0080C9 - Alberta Microelectronic Centre + 0CD3A1 + Monthly Kitchen - 00800C - Videcom Limited + 001EC6 + Leviton Manufacturing Co., Inc - 00807D - Equinox Systems Inc. + 44A3BB + Intel Corporate - 008063 - Hirschmann Automation and Control GmbH + 94B609 + Intel Corporate - 0080EE - Thomson CSF + 7C1E4A + FORTUNE MARKETING PRIVATE LIMITED - 00808E - Radstone Technology + C0BFBE + AzureWave Technology Inc. - 008096 - Human Designed Systems Inc. + 3CBD69 + Nokia Shanghai Bell Co., Ltd. - 00803E - Synernetics + 1CEAAC + Beijing Xiaomi Mobile Software Co., Ltd - 0080CE - Broadcast Television Systems + 84652B + Donaldson Company - 00801A - Bell Atlantic + 58DB09 + Quectel Wireless Solutions Co.,Ltd. - 0080DE - Gipsi S.A. + 783409 + HUAWEI TECHNOLOGIES CO.,LTD - 008002 - Satelcom (UK) Ltd + 149AA3 + HUAWEI TECHNOLOGIES CO.,LTD - 008064 - Wyse Technology LLC + A0AD62 + HUAWEI TECHNOLOGIES CO.,LTD - 008048 - Compex Incorporated + 5C87D8 + IEEE Registration Authority - 008085 - H-Three Systems Corporation + 50B140 + ELPROMA ELEKTRONIKA SP Z O O - 00804C - Contec Ltd + 8CC5D0 + Samsung Electronics Co.,Ltd - 00808F - C. Itoh Electronics Inc. + 28B591 + Cisco Systems, Inc - 000052 - Intrusion.com Inc. + 08023C + Samsung Electronics Co.,Ltd - 0080FF - SOC. de Teleinformatique RTC + 78B6FE + Samsung Electronics Co.,Ltd - 0000F7 - Youth Keep Enterprise Ltd + 9CCE88 + Ruijie Networks Co.,LTD - 0000C7 - Arix Corporation + 9054B7 + Eltex Enterprise LTD - 0000D1 - Adaptec Incorporated + BC9424 + TCT mobile ltd - 000016 - DU Pont Pixel Systems + 849E56 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 0000E1 - Grid Systems + 249E7D + Beijing Roborock Technology Co., Ltd. - 000081 - Bay Networks + 5C8AAE + CHINA DRAGON TECHNOLOGY LIMITED - 000029 - IMC Networks Corp. + 909F22 + Zyxel Communications Corporation - 00000A - Omron Tateisi Electronics Co. + 2CCA16 + Apple, Inc. - 00000D - Fibronics Ltd + 14147D + Apple, Inc. - 000024 - Connect AS + 102381 + Barrot Technology Co.,LTD - 000067 - Soft * Rite Inc. + E8B723 + Shenzhen Vatilon Electronics Co.,Ltd - 0000D2 - SBE Inc. + 1889A0 + Funshion Online Technologies Co.,Ltd - 000037 - Oxford Metrics Limited + 7C2C67 + Espressif Inc. - 0000FB - Rechner ZUR Kommunikation + 98874C + SERVERCOM (INDIA) PRIVATE LIMITED - 0000E2 - Acer Technologies Corp. + C08A60 + AltoBeam Inc. - 0000BA - Siig Inc. + C8608F + Cisco Systems, Inc - 00002A - TRW - Sedd/INP + B8C007 + tickIoT Inc. - 00002C - Autotote Limited + 10907D + Funshion Online Technologies Co.,Ltd - 000083 - Tadpole Technology PLC + 400326 + NXP Semiconductor (Tianjin) LTD. - 0000F3 - Gandalf Data Limited + 1C6A1B + Ubiquiti Inc - 0000B0 - RND-RAD Network Devices + 2005B6 + OpenWrt - 0000CF - Hayes Microcomputer Products + 68F125 + Data Controls Inc. - 000056 - DR. B. Struck + 008320 + Huawei Device Co., Ltd. - 00006C - Private + 7C68B9 + Huawei Device Co., Ltd. - 0000A9 - Network Systems Corp. + 9028F6 + Wuhan Yangtze Optical Technology CO.,Ltd. - 0000EF - KTI + 20A200 + HUAWEI TECHNOLOGIES CO.,LTD - 000025 - Ramtek Corp. + 7CA8EC + Hewlett Packard Enterprise - 0000AF - Canberra Industries Inc. + F4D0A7 + Zhejiang Weilai Jingling Artificial Intelligence Technology Co., Ltd. - 000076 - Abekas Video System + 20F307 + zte corporation - 080055 - Stanford Telecomm Inc. + B4E3D0 + LG Electronics - 080053 - Middle East Tech. University + 3CD1C9 + Groupe SEB - 08008E - Tandem Computers + EC554D + Private - 080084 - Tomen Electronics Corp. + 084F66 + Shenzhen Skyworth Digital Technology CO., Ltd - 080085 - Elxsi + CCDA20 + Beijing Xiaomi Mobile Software Co., Ltd - 080082 - Veritas Software + B0F2F6 + Samsung Electronics Co.,Ltd - 080080 - AES Data Inc. + 241972 + Quectel Wireless Solutions Co.,Ltd. - 080077 - TSL Communications Ltd + 503D7F + Nokia Shanghai Bell Co., Ltd. - 080074 - Casio Computer Ltd + 001710 + AxyomCore Inc. - 08006E - Masscomp + 143A9A + Hon Hai Precision Industry Co.,LTD - 080068 - Ridge Computers + C8E07A + Fiberhome Telecommunication Technologies Co.,LTD - 080063 - Plessey + D069FF + Fiberhome Telecommunication Technologies Co.,LTD - 08007B - Sanyo Electric Ltd + 84FFC2 + Cisco Systems, Inc - 08007C - Vitalink Communications Corp. + 788517 + Cisco Systems, Inc - 0000DF - Bell & Howell Pub Sys Div + 48A4FD + AltoBeam Inc. - 0000F9 - Quotron Systems Inc. + 48F1EB + Nintendo Co.,Ltd - 080060 - Industrial Networking Inc. + 501B6A + SUNITEC TECHNOLOGY CO.,LIMITED - 08004C - Hydra Computer Systems Inc. + 8C0DD9 + Skullcandy - 080047 - Sequent Computer Systems Inc. + 4465E0 + Merlion Consulting Services (Shenzhen) Co., Ltd - 08004A - Banyan Systems Inc. + 741EB1 + Samsung Electronics Co.,Ltd - 080044 - David Systems Inc. + A49FE7 + Samsung Electronics Co.,Ltd - 080041 - Racal-Milgo Information Sys.. + A41A6E + zte corporation - 080035 - Microfive Corporation + CC3F36 + Apple, Inc. - 080032 - Tigan Incorporated + 102FCA + Apple, Inc. - 08008D - Xyvision Inc. + 542097 + TTTech Auto AG - 080015 - STC Business Systems + 28D244 + LCFC(Hefei) Electronics Technology co., ltd - 080066 - Agfa Corporation + 507B9D + LCFC(Hefei) Electronics Technology co., ltd - 080004 - Cromemco Incorporated + 88A4C2 + LCFC(Hefei) Electronics Technology co., ltd - 0001C8 - Conrad Corp. + 6C2408 + LCFC(Hefei) Electronics Technology co., ltd - 08003F - Fred Koschara Enterprises + 9C2DCD + LCFC(Hefei) Electronics Technology co., ltd - 08000B - Unisys Corporation + D048A1 + Juniper Networks - 00DD01 - Ungermann-Bass Inc. + 68F728 + LCFC(Hefei) Electronics Technology co., ltd - 00DD06 - Ungermann-Bass Inc. + C85B76 + LCFC(Hefei) Electronics Technology co., ltd - AA0003 - Digital Equipment Corporation + 8C1645 + LCFC(Hefei) Electronics Technology co., ltd - 000000 - Xerox Corporation + 38F3AB + LCFC(Hefei) Electronics Technology co., ltd - 080021 - 3M Company + 98F1AE + Senaisc - 02BB01 - Octothorpe Corp. + F04B8A + Vantiva USA LLC - 08008A - PerfTech Inc. + 2CEADA + ICC Intelligent Platforms GmbH - 00003E - Simpact + C0470E + Dell Inc. - 00DD02 - Ungermann-Bass Inc. + ACA613 + Aivres SYSTEMS INC - 00DD04 - Ungermann-Bass Inc. + 2496D5 + NEXCON Technology Co.,ltd. - 026086 - Logic Replacement Tech Ltd + CC38D0 + Palo Alto Networks - 080030 - Cern + F49EA4 + Epiq Solutions - 74DA88 - TP-Link Technologies Ltd + 8006D9 + zte corporation - CC32E5 - TP-Link Technologies Ltd + 94C36B + DRD Automation GmbH - 1C3BF3 - TP-Link Technologies Ltd + BC0435 + GD Midea Air-Conditioning Equipment Co.,Ltd. - 3C86D1 - Vivo Mobile Communication Ltd + E43022 + Hanwha Vision VietNam - 301B97 - Lierda Science & Technology Group Ltd + C096A4 + Fiberhome Telecommunication Technologies Co.,LTD - 2CD2E3 - Guangzhou Aoshi Electronic Ltd + EC7359 + Shenzhen Cloudsky Technologies Co., Ltd. - 1459C3 - Creative Chips GmbH + 80C01E + Intel Corporate - A0D86F - Argo AI LLC + 4C4929 + TCL King Electrical Appliances(Huizhou)Co.,Ltd - E4671E - SHEN ZHEN NUO XIN CHENG TECHNOLOGY Ltd + 94EC32 + Silicon Laboratories - 682719 - Microchip Technology Inc. + 345A60 + Micro-Star INTL CO., LTD. - 24C17A - Beijing Iactive Network Ltd + BCA13A + VusionGroup - 1C9C8C - Juniper Networks + C4B691 + Angel Robotics - A4C939 - Guangdong Oppo Mobile Telecommunications Corp Ltd + C88234 + Cisco Systems, Inc - 34D772 - Xiamen Yudian Automation Technology Ltd + AC86D1 + IEEE Registration Authority - C0DCDA - Samsung Electronics Ltd + 782288 + SHENZHEN BILIAN ELECTRONIC CO.,LTD - 04B429 - Samsung Electronics Ltd + 84BE8B + Chengdu Geeker Technology Co., Ltd. - 48794D - Samsung Electronics Ltd + 98A14A + Quectel Wireless Solutions Co.,Ltd. - 44F971 - Shenzhen Mercury Communication Technologies Ltd + F8B3B7 + Espressif Inc. - 18F9C4 - BAE Systems + C4EB68 + VusionGroup - 60ABD2 - Bose Corporation + AC3351 + Ericsson AB - F0EF86 - Google Inc. + E4B323 + Espressif Inc. - E4C0CC - China Mobile Group Device Ltd + 30DDAA + ZHEJIANG DAHUA TECHNOLOGYCO.,LTD - 5CB13E - Sagemcom Broadband SAS + B89165 + Zhejiang Tmall Technology Co., Ltd. - F4E5F2 - Huawei Technologies Ltd + 709AC4 + Huawei Device Co., Ltd. - 541310 - Huawei Technologies Ltd + C8DD6A + OHSUNG - 8CE5EF - Huawei Technologies Ltd + C4FF84 + IEEE Registration Authority - A4CD23 - Shenzhenshi Xinzhongxin Ltd + 1C4D89 + Hangzhou Huacheng Network Technology Co.,Ltd - B83A5A - Aruba Networks HP + 344A1B + zte corporation - E4AAEA - Liteon Technology Corporation + B4BA6A + TECNO MOBILE LIMITED - A0946A - Shenzhen XGTEC Technology Ltd + 045665 + Nokia Shanghai Bell Co., Ltd. - 1C2AA3 - Shenzhen HongRui Optical Technology Ltd + B44130 + Jabil Circuit (Guangzhou) Ltd. - 388E7A - Autoit + A0334F + Cisco Systems, Inc - 4C710C - Cisco Systems Inc. + A0A47F + Cisco Systems, Inc - 4C710D - Cisco Systems Inc. + 9070BF + Mimosa Networks - 9C31C3 - BSkyB Ltd + ACB480 + Dell Inc. - 6C24A6 - Vivo Mobile Communication Ltd + 28A915 + SERVERCOM (INDIA) PRIVATE LIMITED - 9C5F5A - Guangdong Oppo Mobile Telecommunications Corp Ltd + 44370B + Guangzhou Shiyuan Electronic Technology Company Limited - E447B3 - ZTE Corporation + 24AECC + Honor Device Co., Ltd. - FCDB21 - Samsara Networks Inc + 10A30F + HUAWEI TECHNOLOGIES CO.,LTD - 607771 - Texas Instruments + C4F7C1 + Apple, Inc. - D8CF89 - Beijing DoSee Science and Technology Ltd + 386233 + Apple, Inc. - 04AAE1 - Beijing Microvision Technology Ltd + 3C8A1F + Espressif Inc. - 44DC4E - Itel Mobile Limited + 2043A8 + Espressif Inc. - 382A19 - Technica Engineering GmbH + D4DD0B + WAVETEL TECHNOLOGY LIMITED - 74D654 - Gint + 74866F + zte corporation - B4E8C9 - XADA Technologies + 546CAC + Intelbras - 7C210E - Cisco Systems Inc. + 540F2C + Arista Networks - 942DDC - Samsung Electronics Ltd + 9082C3 + Quanta Computer Inc. - 54F294 - Huawei Device Ltd + 1CC089 + Silicon Laboratories - 245AB5 - Samsung Electronics Ltd + BC2B02 + CHINA DRAGON TECHNOLOGY LIMITED - C0D2DD - Samsung Electronics Ltd + D4A365 + Xiaomi Communications Co Ltd - AC1E92 - Samsung Electronics Ltd + 7C60DB + zte corporation - 0068EB - HP Inc. + C0482F + IEEE Registration Authority - 7CB37B - Qingdao Intelligent & Precise Electronics Ltd + 007532 + Integrated Engineering BV - 484C86 - Huawei Device Ltd + 585924 + Nanjing Simon Info Tech Co.,Ltd. - 88123D - Suzhou Aquila Solutions Inc. + 909DAC + Infinix mobility limited - 48210B - Pegatron Corporation + 24DE8A + Nokia Solutions and Networks GmbH & Co. KG - A01C8D - Huawei Technologies Ltd + C8E5E0 + HUAWEI TECHNOLOGIES CO.,LTD - 7C310E - Cisco Systems Inc. + BCB4FD + NXP Semiconductor (Tianjin) LTD. - F4DEAF - Huawei Technologies Ltd + 580987 + Amazon Technologies Inc. - 60123C - Huawei Technologies Ltd + 94F717 + CIG SHANGHAI CO LTD - 48A5E7 - Nintendo Ltd + E806EB + ShieldSOS LLC - 082CB6 - Apple + 78202E + Skychers Creations ShenZhen Limited - F84E73 - Apple + 946C04 + EM Microelectronic - B4265D - Taicang T&W Electronics + 98C97C + Shenzhen iComm Semiconductor CO.,LTD - F07807 - Apple + 84B4D2 + Shenzhen iComm Semiconductor CO.,LTD - 3CCD36 - Apple + BC095C + FiSens GmbH - D4B709 - ZTE Corporation + C01944 + Juniper Networks - 38144E - Fiberhome Telecommunication Technologies Ltd + AC04AA + GoPro - ACBD0B - Leimac Ltd + E85C5F + FN-LINK TECHNOLOGY Ltd. - E0CCF8 - Xiaomi Communications Ltd + 001582 + Pulse Eight Limited - 98524A - Technicolor CH USA Inc. + 504F3B + Beijing Xiaomi Mobile Software Co., Ltd - 3868A4 - Samsung Electronics Ltd + 840F2A + Jiangxi Risound Electronics Co.,LTD - B4A5AC - Guangdong Oppo Mobile Telecommunications Corp Ltd + 5CF796 + New H3C Technologies Co., Ltd - 1C784E - China Mobile Iot Limited Company + 4CC096 + Shenzhen SuperElectron Technology Co.,Ltd. - 843E79 - Shenzhen Belon Technology Ltd + BCFF54 + zte corporation - B81904 - Nokia Shanghai Bell Ltd + 4C2B3B + Huawei Device Co., Ltd. - F4A59D - Huawei Device Ltd + 949386 + Shenzhen SiACRRIER Industry Machines Co.,LTD - E0F442 - Huawei Device Ltd + E4B107 + Huawei Device Co., Ltd. - F0C42F - Huawei Device Ltd + 58B18F + Huawei Device Co., Ltd. - C0B47D - Huawei Device Ltd + 648624 + Beijing Global Safety Technology Co., LTD. - 444687 - Realme Chongqing MobileTelecommunications Corp Ltd + 687D00 + Shenzhen YOUHUA Technology Co., Ltd - E82689 - Aruba Networks HP + 282E30 + MECHATRONICS INNOVATION TECHNOLOGIES, S.L.U. - 20F375 - ARRIS Group Inc. + 509B94 + Shenzhen iComm Semiconductor CO.,LTD - 84BB69 - ARRIS Group Inc. + 48264C + BSH Electrical Appliances (Jiangsu) Co., Ltd. - 105FD4 - Tendyron Corporation + D498B9 + vivo Mobile Communication Co., Ltd. - 8CE38E - Kioxia Corporation + E4E608 + Kiwibit Inc. - A0B439 - Cisco Systems Inc. + 8C902D + TP-Link Systems Inc. - A4B439 - Cisco Systems Inc. + B4E025 + ITLook - 001038 - Micro Research Ltd + 10E18E + Universal Global Scientific Industrial., Ltd - E81B4B - amnimo Inc. + B07ADF + HUAWEI TECHNOLOGIES CO.,LTD - CCF411 - Google Inc. + 34FFF3 + HUAWEI TECHNOLOGIES CO.,LTD - 9C2DCF - Shishi Tongyun Technology(Chengdu) Ltd + CC54FE + Mimosa Networks - 9424B8 - Gree Electric Appliances Inc. Of Zhuhai + 7488A8 + Bouffalo Lab (Nanjing) Co., Ltd. - C803F5 - Ruckus Wireless + 04CDC0 + Mist Systems, Inc. - 000D0A - Barco Projection Systems NV + 54A104 + OPTOWL Co.,Ltd - C467D1 - Huawei Technologies Ltd + 0CFA22 + FLIPPER DEVICES INC - 9C8ACB - Juniper Networks + 5C4071 + Xiaomi Communications Co Ltd - C8C465 - Huawei Technologies Ltd + 3CC683 + Sichuan AI-Link Technology Co., Ltd. - 1C4363 - Huawei Technologies Ltd + 9C67D6 + Intel Corporate - 94292F - New H3C Technologies Ltd + 6C1270 + Apple, Inc. - D49AA0 - Vnpt Technology + E8F928 + ENGINKO SRL - F80FF9 - Google Inc. + 882222 + VusionGroup - 8C5AC1 - Huawei Device Ltd + 3CAB72 + Nanjing Qinheng Microelectronics Co., Ltd. - A85AE0 - Huawei Device Ltd + 603C0E + Guizhou Huaxin Information Technology Co.,Ltd - A4B61E - Huawei Device Ltd + B40E06 + Third Reality, Inc - C4FE5B - Guangdong Oppo Mobile Telecommunications Corp Ltd + 8C8B48 + Silicon Laboratories - C03937 - Gree Electric Appliances Inc. Of Zhuhai + 105725 + Cisco Systems, Inc - B44C3B - Zhejiang Dahua Technology Ltd + 9CA9B8 + Cisco Systems, Inc - 40A2DB - Amazon Technologies Inc. + 40F49F + Cisco Systems, Inc - 4C6C13 - IoT Company Solucoes Tecnologicas Ltda + B48970 + IGEN Tech Co., Ltd. - A885D7 - Sangfor Technologies Inc. + 542B1C + Amazon Technologies Inc. - 444ADB - Apple + A402B7 + Amazon Technologies Inc. - 84F883 - Luminar Technologies + ACEC80 + Commscope - 9CA513 - Samsung Electronics Ltd + C005C2 + Commscope - 1039E9 - Juniper Networks + 0016B5 + Commscope - 309048 - Apple + 001700 + Commscope - D41F0C - JAI Manufacturing + A47AA4 + Commscope - C8FA84 - Trusonus Corp. + CC7D37 + Commscope - C402E1 - Khwahish Technologies Private Limited + 000B06 + Commscope - F85B3B - Askey Computer Corp + 001180 + Commscope - 786DEB - GE Lighting + 00159A + Commscope - 88E9A4 - Hewlett Packard Enterprise + 0015A8 + Commscope - 2863BD - Aptiv Services US LLC + 306023 + Commscope - 1C721D - Dell Inc. + 903EAB + Commscope - F41C95 - Beijing Yunyi Times Technology Ltd + 001DD6 + Commscope - A0687E - ARRIS Group Inc. + 0011AE + Commscope - A8705D - ARRIS Group Inc. + 00128A + Commscope - 546503 - Quectel Wireless Solutions Ltd + 00D088 + Commscope - 9C9789 - 1MORE + E0B70A + Commscope - 1C05B7 - Chongqing Trantor Technology Ltd + C83FB4 + Commscope - 000EF3 - Smartlabs Inc. + 901ACA + Commscope - A043B0 - Hangzhou BroadLink Technology Ltd + 14ABF0 + Commscope - 74ACB9 - Ubiquiti Networks Inc. + 3C438E + Commscope - F492BF - Ubiquiti Networks Inc. + 94CCB9 + Commscope - D8C561 - CommFront Communications Pte Ltd + 001DCE + Commscope - 0C29EF - Dell Inc. + 001AAD + Commscope - 60D89C - HMD Global Oy + 84E058 + Commscope - F82E8E - Nanjing Kechen Electric Ltd + 00D037 + Commscope - B4C9B9 - Sichuan AI-Link Technology Ltd + 446AB7 + Commscope - F0463B - Comcast Cable Corporation + 00ACE0 + Commscope - 68D79A - Ubiquiti Networks Inc. + 74EAE8 + Commscope - 1C63BF - Shenzhen Broadtel Telecom Ltd + 986B3D + Commscope - AC3651 - Jiangsu Hengtong Terahertz Technology Ltd + 341FE4 + Commscope - 684A76 - eero Inc. + 8496D8 + Commscope - 688FC9 - Zhuolian (Shenzhen) Communication Ltd + A0C562 + Commscope - F08175 - Sagemcom Broadband SAS + D0E54D + Commscope - D84732 - TP-Link Technologies Ltd + 707630 + Commscope - 2864B0 - Huawei Device Ltd + 0026BA + Commscope - 04F169 - Huawei Device Ltd + 0025F1 + Commscope - 5021EC - Huawei Device Ltd + 0025F2 + Commscope - 8C683A - Huawei Technologies Ltd + 0024C1 + Commscope - B46E08 - Huawei Technologies Ltd + 5CB066 + Commscope - 005E0C - HMD Global Oy + 0026D9 + Commscope - B48107 - Shenzhen Chuangwei-RGB Electronics Ltd + 001F7E + Commscope - 706655 - Azurewave Technologies Inc. + 001ADB + Commscope - 647C34 - Ubee Interactive Ltd + 0023A3 + Commscope - 6C38A1 - Ubee Interactive Ltd + 001404 + Commscope - 78530D - Shenzhen Skyworth Digital Technology Ltd + 001C12 + Commscope - 0C48C6 - Celestica Inc. + 002375 + Commscope - A42985 - Sichuan AI-Link Technology Ltd + 00230B + Commscope - 78AC44 - Dell Inc. + 74E7C6 + Commscope - B8D4E7 - Aruba Networks HP + CC3E79 + Commscope - D84C90 - Apple + 28F5D1 + Commscope - 24D0DF - Apple + 10E177 + Commscope - 6C4A85 - Apple + A46EA7 + DX ANTENNA CO.,LTD. - 28F033 - Apple + ACDB48 + Commscope - 209EF7 - Extreme Networks Inc. + C863FC + Commscope - BC0963 - Apple + 946269 + Commscope - 185869 - Sailer Electronic Ltd + 20F375 + Commscope - BC2DEF - Realme Chongqing Mobile Telecommunications Corp Ltd + 84BB69 + Commscope - 7881CE - China Mobile Iot Limited Company + 20F19E + Commscope - BCFF21 - Smart Code(Shenzhen)Technology Ltd + EC7097 + Commscope - 445CE9 - Samsung Electronics Ltd + 5819F8 + Commscope - C01692 - China Mobile Group Device Ltd + B4F2E8 + Commscope - 381730 - Ulrich Lippert GmbH & Co KG + 2C9569 + Commscope - 402E71 - Texas Instruments + A0687E + Commscope - 7076DD - OxyGuard Internation A/S + A8705D + Commscope - 94E9EE - Huawei Device Ltd + 786A1F + Commscope - 28E34E - Huawei Technologies Ltd + 2494CB + Commscope - D452EE - BSkyB Ltd + 2CA17D + Commscope - E023FF - Fortinet Inc. + F40E83 + Commscope - 8C59DC - ASR Microelectronics (Shanghai) Ltd + 98F7D7 + Commscope - 18828C - Arcadyan Corporation + A8F5DD + Commscope - 9CF029 - Integrated Device Technology (Malaysia) Sdn. Bhd. + 1820D5 + Commscope - 2856C1 - Harman/Becker Automotive Systems GmbH + 88EF16 + Commscope - 78B8D6 - Zebra Technologies Inc. + F0FCC8 + Commscope - BC4A56 - Cisco Systems Inc. + 948FCF + Commscope - 6C61F4 - SFR + 2C00AB + Commscope - F490CB - IEEE Registration Authority + 1CC8C1 + HongKong YiTong Technology Ltd. - 00107F - Crestron Electronics Inc. + 30294B + HUAWEI TECHNOLOGIES CO.,LTD - 001B85 - MAN Energy Solutions + E04E5D + HUAWEI TECHNOLOGIES CO.,LTD - 58493B - Palo Alto Networks + 9C4929 + HUAWEI TECHNOLOGIES CO.,LTD - 001B17 - Palo Alto Networks + D02AAA + Infinix mobility limited - 5859C2 - Extreme Networks Inc. + 9C8306 + Samsung Electronics Co.,Ltd - B82FCB - CMS Electracom + 68DFE4 + Samsung Electronics Co.,Ltd - 10CE45 - Miromico AG + 5067E0 + Altice Labs - 787D53 - Extreme Networks Inc. + 00909D + NovaTech, LLC - 7C95B1 - Extreme Networks Inc. + 94F7BE + SERCOMM PHILIPPINES INC - EC6881 - Palo Alto Networks + 880E85 + Shenzhen Boomtech Industrial Corporation - 786D94 - Palo Alto Networks + A08A06 + ASKEY COMPUTER CORP - F8AF05 - Huawei Device Ltd + 7826A6 + zte corporation - 4CFCAA - Tesla,Inc. + C051F3 + CIG SHANGHAI CO LTD - CCAB2C - HUMAX Ltd + 14EAA1 + Micronet union Technology (chengdu) co., Ltd - 6C6D09 - Kyowa Electronics Ltd + 6C40E8 + vivo Mobile Communication Co., Ltd. - 2443E2 - DASAN Network Solutions + F80584 + EM Microelectronic - A86ABB - Sagemcom Broadband SAS + 1480CC + Quectel Wireless Solutions Co.,Ltd. - 90173F - Huawei Technologies Ltd + CC20AC + Samsung Electronics Co.,Ltd - A0FF70 - Technicolor CH USA Inc. + 44F53E + Earda Technologies co Ltd - 607ECD - Huawei Technologies Ltd + 3001AF + Cisco Systems, Inc - 548ABA - Cisco Systems Inc. + B4CADD + Cisco Systems, Inc - C80739 - NAKAYO Inc + 1C9468 + New H3C Technologies Co., Ltd - 8C7CFF - Brocade Communications Systems LLC + FCB577 + Cortex Security Inc - AC3C8E - Flextronics Computing(Suzhou) Ltd + 00A045 + Phoenix Contact GmbH & Co. KG - 406234 - Telink Semiconductor (Shanghai) Ltd + 08468B + Guangdong NanGuang Photo & Video Systems Co., Ltd - 889471 - Brocade Communications Systems LLC + FCC2E5 + HOLOWITS TECHNOLOGIES CO.,LTD - 78A6E1 - Brocade Communications Systems LLC + 981E89 + Tianyi Telecom Terminals Company Limited - 0094EC - Huawei Device Ltd + 205A8F + Shenzhen Hikeen Technology Co.,LTD - 74452D - Huawei Device Ltd + 4CDA38 + Texas Instruments - A45006 - Shenzhen Huachuang Shidai Technologyco Ltd + CCDAB5 + Texas Instruments - C87125 - Johnson Outdoors Marine Electronics d/b/a Minnkota + 30E4D8 + Huawei Device Co., Ltd. - 686DBC - Hangzhou Hikvision Digital Technology Ltd + 90BFD9 + Smart Innovation LLC - 80CFA2 - Huawei Device Ltd + B88880 + Shanghai Imilab Technology Co.Ltd - 080342 - Palo Alto Networks + DC88A1 + ITEL MOBILE LIMITED - FC3DA5 - Arcadyan Corporation + 9C4782 + TP-LINK TECHNOLOGIES CO.,LTD. - EC4F82 - Calix Inc. + 68286C + Sony Interactive Entertainment Inc. - 44657F - Calix Inc. + 38AA09 + Cisco Systems, Inc - 487746 - Calix Inc. + D0AA5F + IEEE Registration Authority - EC6CB5 - ZTE Corporation + DC3262 + Nanjing Qinheng Microelectronics Co., Ltd. - C0B101 - ZTE Corporation + E4FE43 + Beijing Xiaomi Mobile Software Co., Ltd - 140152 - Samsung Electronics Ltd + 38D6E0 + TOPDON TECHNOLOGY Co.,Ltd. - BC33AC - Silicon Laboratories + D806F3 + Arista Networks - 94FBA7 - IEEE Registration Authority + 781C9D + Silicon Laboratories - 988E79 - Qudelix Inc. + 3CBD14 + Diebold Nixdorf - 98F621 - Xiaomi Communications Ltd + A09A8E + Apple, Inc. - C03EBA - Dell Inc. + BC9F58 + Apple, Inc. - C0395A - Zhejiang Dahua Technology Ltd + 90CDE8 + Apple, Inc. - 2064CB - Guangdong Oppo Mobile Telecommunications Corp Ltd + 70EDFA + imperix Ltd - F05501 - Huawei Device Ltd + 00210E + Gilbarco Inc. - 7CF2DD - Vence Corp + E86D16 + Elmec Elettronica SRL - D0768F - Calix Inc. + 84FE40 + HUAWEI TECHNOLOGIES CO.,LTD - 1413FB - Huawei Technologies Ltd + ECE9F5 + HUAWEI TECHNOLOGIES CO.,LTD - 00E0B7 - Cosworth Electronics Ltd + D0AB4A + Telink Micro LLC - A49340 - Beijing Supvan Information Technology Ltd + 6C7DB7 + Cisco Meraki - F8E877 - Harman/Becker Automotive Systems GmbH + 14BAAF + BKS GmbH - A09B12 - China Mobile IOT Company Limited + 5CCDA8 + ITEL MOBILE LIMITED - 940853 - Liteon Technology Corporation + 9CC2C4 + IEIT SYSTEMS Co., Ltd. - B49E80 - Sichuan Changhong Electric Ltd + 6C92BF + IEIT SYSTEMS Co., Ltd. - 00E22C - China Mobile Group Device Ltd + D4E4C3 + Ciena Corporation - 781100 - Quantumsolution + 3C1A65 + Nokia - E87F95 - Apple + 94224C + Qingdao Haier Technology Co.,Ltd - 88C08B - Apple + 54263D + Sony Corporation - 74AB93 - Blink by Amazon + 54808A + PT. BIZLINK TECHNOLOGY INDONESIA - 7CA96B - Syrotech Networks Ltd + F0F069 + Private - 98063C - Samsung Electronics Ltd + 6C78C1 + Juniper Networks - 38DEAD - Intel Corporation + 8CF0DF + Beijing Zhongyuan Yishang Technology Co.,LTD - D46D6D - Intel Corporation + F8388D + New H3C Technologies Co., Ltd - B46921 - Intel Corporation + 34D868 + Broadcom Limited - F8F21E - Intel Corporation + 402F51 + Maxtek Optoelectronics Ltd - 74A7EA - Amazon Technologies Inc. + E0A498 + SHENZHEN ORFA TECH CO.,LTD - 4C7CD9 - Apple + B05A7B + Huawei Device Co., Ltd. - F0D7AF - IEEE Registration Authority + A808CF + Vestel Elektronik San ve Tic. A.S. - 7CB27D - Intel Corporation + 54489C + CDOUBLES ELECTRONICS CO. LTD. - 04ED33 - Intel Corporation + E03DA6 + Taicang T&W Electronics - 5C80B6 - Intel Corporation + BCCD99 + Intel Corporate - 84C5A6 - Intel Corporation + 00C029 + Aginode Germany GmbH - AC675D - Intel Corporation + FC23CD + SHENZHEN BILIAN ELECTRONIC CO.,LTD - F8E4E3 - Intel Corporation + AC45EF + Intel Corporate - D84F37 - Proxis, spol. s r.o. + 280C50 + Intel Corporate - AC1203 - Intel Corporation + E466E5 + Nanjing Qinheng Microelectronics Co., Ltd. - DC1BA1 - Intel Corporation + 04A85A + SZ DJI TECHNOLOGY CO.,LTD - 5CA5BC - eero Inc. + 387F8B + Apple, Inc. - 0433C2 - Intel Corporation + 5C13CC + Apple, Inc. - C858C0 - Intel Corporation + 4CCDB6 + Apple, Inc. - 64BC58 - Intel Corporation + 000F15 + Icotera A/S - A4C3F0 - Intel Corporation + 001E80 + Icotera A/S - 5076AF - Intel Corporation + 0CF07B + Shenzhen Skyworth Digital Technology CO., Ltd - DC91BF - Amazon Technologies Inc. + A04839 + HUAWEI TECHNOLOGIES CO.,LTD - E092A7 - Feitian Technologies Ltd + F48918 + HUAWEI TECHNOLOGIES CO.,LTD - 08B0A7 - Truebeyond Ltd + 08B657 + AVM Audiovisuelles Marketing und Computersysteme GmbH - C06369 - Binxin Technology(Zhejiang) Ltd + F46802 + HUAWEI TECHNOLOGIES CO.,LTD - 1841FE - Digital 14 + 0017A5 + MediaTek Inc - 6CCE44 - 1MORE + 44A7F4 + Apple, Inc. - B0761B - Huawei Technologies Ltd + 186696 + IEEE Registration Authority - A41162 - Arlo Technology + 000A00 + MediaTek Inc - 001D05 - Cooper Lighting Solutions + 44FEEF + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 8C0E60 - Nanjing Juplink Intelligent Technologies Ltd + 2475B3 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 18AB1D - Samsung Electronics Ltd + 6433AA + Mellanox Technologies, Inc. - BCE92F - HP Inc. + A0AD9F + ASUSTek COMPUTER INC. - 8437D5 - Samsung Electronics Ltd + 785F6C + Arista Networks - 3482C5 - Samsung Electronics Ltd + FC5ADC + Keenetic Limited - 84D81B - TP-Link Technologies Ltd + 84EAED + Roku, Inc - E8A245 - Juniper Networks + 6092C8 + Roku, Inc - 882949 - Renesas Electronics (Penang) Sdn. Bhd. + 203462 + Xiaomi Communications Co Ltd - F864B8 - ZTE Corporation + 6045E8 + Arcadyan Corporation - 145120 - Huawei Device Ltd + C0DCAB + LG Innotek - C0D193 - Huawei Device Ltd + 10B676 + HP Inc. - 3C846A - TP-Link Technologies Ltd + 54DCE9 + Silicon Laboratories - 7804E3 - Huawei Device Ltd + 9CE549 + IEEE Registration Authority - A43B0E - Huawei Device Ltd + 9C5385 + PT. Hartono Istana Teknologi - 24A160 - Espressif Inc. + 248602 + Bouffalo Lab (Nanjing) Co., Ltd. - DCAEEB - Ruckus Wireless + B42F03 + Quectel Wireless Solutions Co.,Ltd. - 2481C7 - Huawei Device Ltd + 90B942 + zte corporation - FC862A - Huawei Device Ltd + 201E1D + HUAWEI TECHNOLOGIES CO.,LTD - 1C3D2F - Huawei Technologies Ltd + 00006C + Schneider Electric - EC753E - Huawei Technologies Ltd + 60D8A4 + Vantiva Connected Home - Technologies Telco - 909164 - ChongQing Lavid Technology Ltd + 48A6B8 + Sonos, Inc. - ECDB86 - API-K + C43875 + Sonos, Inc. - 4843DD - Amazon Technologies Inc. + 2019F3 + WavTek Technologies, Inc - 083869 - Hong Kong AMobile Intelligent Corp. Limited Taiwan Branch + 5CAAFD + Sonos, Inc. - D89ED4 - Fiberhome Telecommunication Technologies Ltd + B8E937 + Sonos, Inc. - 840328 - Juniper Networks + 98FE3E + Intel Corporate - 001CFC - Sumitomo Electric Industries Ltd + 58263A + Silicon Laboratories - 001636 - Quanta Computer Inc. + D4FE28 + Silicon Laboratories - 54F15F - Sichuan AI-Link Technology Ltd + 6C55B1 + Amazon Technologies Inc. - E079C4 - iRay Technology Company Limited + 50995A + Amazon Technologies Inc. - 884067 - Infomark + 54EF5B + Science Corporation - AC9572 - Jovision Technology Ltd + C4710F + Xiaomi Communications Co Ltd - 40D25F - Itel Mobile Limited + 389E4C + Hewlett Packard Enterprise - A8032A - Espressif Inc. + 1894A3 + Wistron Service(Kunshan) Co., Ltd. - 0019F5 - Imagination Technologies Ltd + A80B6B + Chipsea Technologies (Shenzhen) Corp. - 00CBBD - Cambridge Broadband Networks Group + 04CA8D + Enfabrica - 5894A2 - KETEK GmbH + 8C7112 + Microchip Technologies Inc - 4C2219 - Yuanfudao HK LTD + C0A810 + Intel Corporate - 54D9C6 - Huawei Device Ltd + 04F0EE + Intel Corporate - 308AF7 - Huawei Device Ltd + BCF105 + Intel Corporate - 64E7D8 - Samsung Electronics Ltd + F47257 + Jiangxi Remote lntelligence Technology Co.,Ltd - D8EF42 - Huawei Device Ltd + 1CF43F + Arcadyan Corporation - 80CC12 - Huawei Device Ltd + 348D13 + Silicon Laboratories - 18AA0F - Huawei Device Ltd + 84AF1F + GopherTec Inc. - B0A460 - Intel Corporation + 000FEC + GopherTec Inc. - AC9A96 - Maxlinear Inc. + B0D41F + MOBITITECABSOLUT S.A. - 8C7086 - Gesellschaft fur Sonder-EDV-Anlagen mbH + 781C3C + Espressif Inc. - 1C28AF - Aruba Networks HP + 383FE8 + HUAWEI TECHNOLOGIES CO.,LTD - E4246C - Zhejiang Dahua Technology Ltd + B0EA19 + TPV Audio and Visual Technology (Shenzhen) Co.,Ltd. - E8EB1B - Microchip Technology Inc. + 20BBBC + Hangzhou Ezviz Software Co.,Ltd. - 840283 - HUMAX Ltd + B0F5C8 + AMPAK Technology Inc. - 68D6ED - GooWi Wireless Technology Ltd + F868FF + Cisco Systems, Inc - 00E406 - Huawei Technologies Ltd + 0CEF15 + TP-Link Systems Inc. - 44227C - Huawei Technologies Ltd + 4476E7 + TECNO MOBILE LIMITED - CCB182 - Huawei Technologies Ltd + 7CFE62 + ShenZhen XinZhongXin Technology Co., Ltd - 48902F - LG Electronics (Mobile Communications) + C4CCF9 + zte corporation - 28B77C - IEEE Registration Authority + 202051 + zte corporation - 28C21F - Samsung Electro-Mechanics(Thailand) + 785237 + zte corporation - 5C7D7D - Technicolor CH USA Inc. + 60BD83 + HUAWEI TECHNOLOGIES CO.,LTD - F4BFA8 - Juniper Networks + 1067A3 + HUAWEI TECHNOLOGIES CO.,LTD - C0619A - IEEE Registration Authority + E00ECE + Fiberhome Telecommunication Technologies Co.,LTD - C42B44 - Huawei Device Ltd + 78818C + Nintendo Co.,Ltd - F8A26D - Canon Inc. + E01333 + General Motors - 74427F - AVM Audiovisuelles Marketing und Computersysteme GmbH + 3C32B9 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - 400634 - Huawei Device Ltd + DC7306 + Vantiva Connected Home - Home Networks - 7061EE - Sunwoda Electronic Ltd + 7CF17E + TP-Link Systems Inc - 143FC3 - SnapAV + FC4CEF + Huawei Device Co., Ltd. - 209A7D - Sagemcom Broadband SAS + 443659 + Robert Bosch GmbH - 74F9CA - Nintendo Ltd + 98254A + TP-Link Systems Inc - 50C68E - Biwin Semiconductor (HK) Company LTD + D8B293 + TOPSSD - 04E795 - Huawei Technologies Ltd + ACC3E5 + Cisco Meraki - A0D0DC - Amazon Technologies Inc. + C8AAB2 + SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD - 689E0B - Cisco Systems Inc. + 74FECE + TP-Link Systems Inc - C8FE6A - Juniper Networks + 242FD0 + TP-Link Systems Inc - 80CA4B - Shenzhen Gongjin Electronics Ltd + 80F3EF + Meta Platforms, Inc. - 64F54E - EM Microelectronic + 8457F7 + Meta Platforms, Inc. - 102779 - Sadel S.p.A. + 503A0F + ALL Winner (Hong Kong) Limited - C4DD57 + A84674 Espressif Inc. - 702F4B - Steelcase Inc. + 88225B + Hewlett Packard Enterprise - E475DC - Arcadyan Corporation + DC6279 + TP-Link Systems Inc - C41688 - Huawei Device Ltd + D032C3 + D-Link Corporation - 64B0E8 - Huawei Device Ltd + A8D861 + ITEL MOBILE LIMITED - BCA5A9 - Apple + 005F67 + TP-Link Systems Inc - 20E2A8 - Apple + 60A4B7 + TP-Link Systems Inc - A0FBC5 - Apple + 94BE36 + ADOPT NETTECH PVT LTD - 30A998 - Huawei Device Ltd + 5CE931 + TP-Link Systems Inc - 007D60 - Apple + 8CB50E + Cisco Systems, Inc - ECC302 - HUMAX Ltd + 48C030 + Kogniza Inc. - 00C343 - E-T-A Circuit Breakers Ltd + A84616 + HUAWEI TECHNOLOGIES CO.,LTD - 58208A - IEEE Registration Authority + A4C788 + Xiaomi Communications Co Ltd - 0090D2 - Artel Video Systems + AC0650 + Shanghai Baosight Software Co., Ltd - F0AA0B - Arra Networks/ Spectramesh + 008667 + LG Innotek - 945641 - Palo Alto Networks + B8E44A + Xconnect - 80F5B5 - Texas Instruments + CC0388 + MangoBoost Inc - 1C3008 - Hui Zhou Gaoshengda Technology Ltd + F0F56D + Kubota Corporation - 98063A - Home Control Singapore Pte Ltd + 000B91 + Xovis Germany GmbH - B4BA12 - China Mobile (Hangzhou) Information Technology Ltd + A4D501 + Yucca Technology Company Limited. - 5CF9FD - Taicang T&W Electronics + A4F6E6 + Apple, Inc. - 3898E9 - Huawei Device Ltd + D463C0 + Apple, Inc. - 48A516 - Huawei Device Ltd + 840511 + Apple, Inc. - 183672 - Shaoxing ShunChuang Technology Ltd + 189067 + Shenzhen Jingxun Technology Co., Ltd. - 28DE65 - Aruba Networks HP + 84D7DE + HUAWEI TECHNOLOGIES CO.,LTD - B0A651 - Cisco Systems Inc. + 8C3066 + Ubiquiti Inc - D4910F - Amazon Technologies Inc. + D40A9E + GO development GmbH - B85FB0 - Huawei Technologies Ltd + 2C1B3A + Hui Zhou Gaoshengda Technology Co.,LTD - C4FBAA - Huawei Technologies Ltd + DC813D + SHANGHAI XIANGCHENG COMMUNICATION TECHNOLOGY CO., LTD - Acdcca - Huawei Technologies Ltd + 6083F8 + SICHUAN HUAKUN ZHENYU INTELLIGENT TECHNOLOGY CO.,LTD - C07831 - Huawei Device Ltd + B034FB + ShenZhen Microtest Automation Co.,Ltd - 84CC63 - Huawei Device Ltd + 60DC0D + TAIWAN SHIN KONG SECURITY CO., LTD - E0E0C2 - China Mobile Group Device Ltd + F01204 + IEEE Registration Authority - F06426 - Extreme Networks Inc. + 001645 + Eaton Corporation - 703A2D - Shenzhen V-Link Technology Ltd + 7CEE7B + Logically Us Ltd - 1C45C2 - Huizhou City Sunsin lntelligent Technology Ltd + 58C587 + AltoBeam Inc. - 7C4E09 - Shenzhen Skyworth Wireless Technology Ltd + 603C68 + Garmin International - EC7E91 - Itel Mobile Limited + 5CA64F + TP-Link Systems Inc. - FC9643 - Juniper Networks + 64CDF1 + KO & AL Co., Ltd - A8B088 - eero Inc. + 185111 + Universal Electronics, Inc. - 001A65 - Seluxit + 4CBB6F + Infinix mobility limited - 280FC5 - Beijing Leadsec Technology Ltd + 2051F5 + Earda Technologies co Ltd - 1CEC72 - Allradio Ltd + AC17C8 + Cisco Meraki - E0E1A9 - Shenzhen Four Seas Global Link Network Technology Ltd + 981888 + Cisco Meraki - 6C1414 - BUJEON ELECTRONICS Ltd + 4CC8A1 + Cisco Meraki - C43CEA - Buffalo Inc. + B4E85C + fünfeinhalb Funksysteme GmbH - B0ECDD - Huawei Technologies Ltd + 64A0AC + Adtran Inc - AC6784 - Google Inc. + A083B4 + Velorum B.V - 90DE80 - Shenzhen Century Xinyang Technology Ltd + 600A8C + Shenzhen Sundray Technologies company Limited - E4DC43 - Huawei Device Ltd + 102F6E + Shenzhen Sundray Technologies company Limited - 2430F8 - Huawei Device Ltd + B00B22 + Huawei Device Co., Ltd. - 9C5FB0 - Samsung Electronics Ltd + 8C0572 + Huawei Device Co., Ltd. - E87F6B - Samsung Electronics Ltd + 1025CE + ELKA - Torantriebe GmbH u. Co. Betriebs KG - FCB69D - Zhejiang Dahua Technology Ltd + 9C7DC0 + Tech4home, Lda - 185BB3 - Samsung Electronics Ltd + 20A716 + Silicon Laboratories - 94F2BB - Valeo Vision Systems + C09B9E + Silicon Laboratories - 6420E0 - T3 Technology Ltd + DCEC4F + Guangzhou Shiyuan Electronic Technology Company Limited - 5CC0A0 - Huawei Technologies Ltd + D85A49 + INGCHIPS Technology Co., Ltd - 04F352 - Huawei Technologies Ltd + 54A637 + HUAWEI TECHNOLOGIES CO.,LTD - ECA1D1 - Huawei Technologies Ltd + 3061A2 + HUAWEI TECHNOLOGIES CO.,LTD - A46DA4 - Huawei Technologies Ltd + E0286D + AVM Audiovisuelles Marketing und Computersysteme GmbH - 488B0A - Cisco Systems Inc. + 444E6D + AVM Audiovisuelles Marketing und Computersysteme GmbH - 2494CB - ARRIS Group Inc. + F0B014 + AVM Audiovisuelles Marketing und Computersysteme GmbH - 786A1F - ARRIS Group Inc. + 485D35 + AVM Audiovisuelles Marketing und Computersysteme GmbH - 8C7A15 - Ruckus Wireless + B4FC7D + AVM Audiovisuelles Marketing und Computersysteme GmbH - 8411C2 - IEEE Registration Authority + 98A965 + AVM Audiovisuelles Marketing und Computersysteme GmbH - 28AD18 - Hui Zhou Gaoshengda Technology Ltd + EC7427 + eero inc. - 24A487 - Huawei Device Ltd + C8E306 + eero inc. - C45A86 - Huawei Device Ltd + 78D6D6 + eero inc. - 20AC9C - China Telecom Corporation Limited + D43F32 + eero inc. - 747827 - Dell Inc. + A08E24 + eero inc. - 9409D3 - Shenzhen maxtopic technology Ltd + B42046 + eero inc. - 58D56E - D-Link International + C03653 + eero inc. - F48CEB - D-Link International + D405DE + eero inc. - ECADE0 - D-Link International + 9C0B05 + eero inc. - 340A33 - D-Link International + 74427F + AVM Audiovisuelles Marketing und Computersysteme GmbH - BC62CE - Shenzhen Netis Technology Ltd + 1CED6F + AVM Audiovisuelles Marketing und Computersysteme GmbH - 782E56 - China Mobile Group Device Ltd + 5CA5BC + eero inc. - C40B31 - Apple + A8B088 + eero inc. - 3024A9 - HP Inc. + B4E53E + Ruckus Wireless - A86E4E - Huawei Device Ltd + 886746 + eero inc. - 945F34 - Renesas Electronics (Penang) Sdn. Bhd. + 24F3E3 + eero inc. - 603CEE - LG Electronics (Mobile Communications) + E4197F + eero inc. - 2C4A11 - Ciena Corporation + FC3D73 + eero inc. - 1C4C48 - Itel Mobile Limited + 1479F3 + China Mobile Group Device Co.,Ltd. - C4CB54 - Fibocom Auto Inc. + 3C574F + China Mobile Group Device Co.,Ltd. - 102D31 - Shenzhen Americas Trading Company LLC + 00CFC0 + China Mobile Group Device Co.,Ltd. - 2C0786 - Huawei Device Ltd + 4062EA + China Mobile Group Device Co.,Ltd. - 0C354F - Nokia + E0456D + China Mobile Group Device Co.,Ltd. - 60812B - Astronics Custom Control Concepts + 508CF5 + China Mobile Group Device Co.,Ltd. - F8A73A - Cisco Systems Inc. + E4C0CC + China Mobile Group Device Co.,Ltd. - B8114B - Cisco Systems Inc. + C01692 + China Mobile Group Device Co.,Ltd. - 30E283 - Texas Instruments + 00E22C + China Mobile Group Device Co.,Ltd. - 0002C7 - Alpsalpine Ltd + E0E0C2 + China Mobile Group Device Co.,Ltd. - FC62B9 - Alpsalpine Ltd + 782E56 + China Mobile Group Device Co.,Ltd. - 60380E - Alpsalpine Ltd + 946DAE + Mellanox Technologies, Inc. - 28A183 - Alpsalpine Ltd + FC6A1C + Mellanox Technologies, Inc. - 001E3D - Alpsalpine Ltd + A088C2 + Mellanox Technologies, Inc. - 48F07B - Alpsalpine Ltd + 7C49CF + eero inc. - 00145A - Westermo Neratec AG + 242D6C + eero inc. - 1CD1BA - Fiberhome Telecommunication Technologies Ltd + 303A4A + eero inc. - A899DC - i-TOP DESING TECHNOLOGY Ltd + DC69B5 + eero inc. - B07B25 - Dell Inc. + 5C75C6 + China Mobile Group Device Co.,Ltd. - 84EAED - Roku Inc. + 241281 + China Mobile Group Device Co.,Ltd. - 0012AD - Vivavis AG + 64C582 + China Mobile Group Device Co.,Ltd. - E02967 - HMD Global Oy + E09D73 + Mellanox Technologies, Inc. - 988B69 - Shenzhen hylitech Ltd + 5000E6 + Mellanox Technologies, Inc. - 18146C - Zhejiang Tmall Technology Ltd + 448EEC + China Mobile Group Device Co.,Ltd. - 3C2093 - GD Midea Air-Conditioning Equipment Ltd + 50CF56 + China Mobile Group Device Co.,Ltd. - 9C0567 - Honor Device Ltd + C82478 + Edifier International - B07D64 - Intel Corporation + F8F295 + Annapurna labs - 004238 - Intel Corporation + E0426D + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - C0E3FB - Huawei Technologies Ltd + 80030D + CANON INC. - 804B50 - Silicon Laboratories + D4A0FB + IEEE Registration Authority - 4089A8 - WiredIQ LLC + 18C1E2 + Qolsys Inc. - 683F7D - Ingram Micro Services + F843EF + Xiaomi Communications Co Ltd - 748F4D - duagon Germany GmbH + A4FF9F + Xiaomi Communications Co Ltd - 08798C - Huawei Technologies Ltd + 2025CC + Xiaomi Communications Co Ltd - 50C3A2 - nFore Technology Ltd + B0F3E9 + PATEO CONNECT (Xiamen) Co., Ltd. - 54DBA2 - Fibrain + 304AC4 + Barrot Technology Co.,LTD - 089BB9 - Nokia Solutions and Networks GmbH & Co. KG + 647520 + zte corporation - 44AE25 - Cisco Systems Inc. + 8431A8 + Funshion Online Technologies Co.,Ltd - BCE712 - Cisco Systems Inc. + 983F66 + Funshion Online Technologies Co.,Ltd - 64A198 - Huawei Device Ltd + D47AEC + Funshion Online Technologies Co.,Ltd - 5C9AA1 - Huawei Device Ltd + 40A786 + TECNO MOBILE LIMITED - 6055F9 + 9C139E Espressif Inc. - 8CEA48 - Samsung Electronics Ltd + 00C84E + Hewlett Packard Enterprise - 005F67 - TP-Link Corporation Limited + 88DA36 + Calix Inc. - BCF45F - ZTE Corporation + 98171A + Beijing Xiaomi Mobile Software Co., Ltd - B0BD1B - Dongguan Liesheng Electronic Ltd + EC1055 + Beijing Xiaomi Electronics Co.,Ltd - 109693 - Amazon Technologies Inc. + 2CDCC1 + EM Microelectronic - 34AFB3 - Amazon Technologies Inc. + A49700 + Cisco Systems, Inc - 1418C3 - Intel Corporation + 944FDB + Nokia - 24EDFD - Siemens Canada Limited + D853AD + Cisco Meraki - 6CCDD6 - Netgear + 4010ED + G.Tech Technology Ltd. - 540764 - Huawei Device Ltd + 68A593 + Apple, Inc. - DCD7A0 - Huawei Device Ltd + A82C89 + Apple, Inc. - 9C6865 - Fiberhome Telecommunication Technologies Ltd + 801242 + Apple, Inc. - 383D5B - Fiberhome Telecommunication Technologies Ltd + B8011F + Apple, Inc. - A062FB - Hisense Visual Technology Ltd + 141416 + Hui Zhou Gaoshengda Technology Co.,LTD - 9877E7 - Kaonmedia Ltd + 804005 + Guangdong COROS Sports Technology Co.,Ltd - 78D4F1 - IEEE Registration Authority + DC9396 + Apple, Inc. - B01656 - Huawei Technologies Ltd + 18E671 + Apple, Inc. - 047975 - Honor Device Ltd + CCEA27 + GE Appliances - DC9020 - Ruru TEK Private Limited + 8C3D16 + Shenzhen Four Seas Global Link Network Technology Co.,Ltd - 3810F0 - Aruba Networks HP + C08840 + GD Midea Air-Conditioning Equipment Co.,Ltd. - F88F07 - Samsung Electronics Ltd + D0C67F + HUAWEI TECHNOLOGIES CO.,LTD - 14EB08 - Huawei Technologies Ltd + 98F3F6 + HUAWEI TECHNOLOGIES CO.,LTD - A842A7 - Jiangsu Huitong Group Ltd + B025AA + AIstone Global Limited - 2CD26B - FN-Link Technology Limited + B48931 + Silicon Laboratories - B88DF1 - Nanjing BigFish Semiconductor Ltd + 4CADDF + Công ty Cổ phần Thiết bị Công nghiệp GEIC - 6C4A74 - Aerodisk LLC + 64CDC2 + Amazon Technologies Inc. - 40DE17 - Shenzhen Lanfeng Times Industrial Ltd + 4C60AD + Amazon Technologies Inc. - F01628 - Technicolor (China) Technology Ltd + 48F6EE + Espressif Inc. - 68572D - Tuya Smart Inc. + 7C31FA + Silicon Laboratories - 08A7C0 - Technicolor CH USA Inc. + 3CA070 + Blink by Amazon - 285B0C - Sichuan Jiuzhou Electronic Technology Ltd + 105EAE + New H3C Technologies Co., Ltd - 1489CB - Huawei Technologies Ltd + 24F40A + Samsung Electronics Co.,Ltd - 6C2636 - Huawei Technologies Ltd + 78C11D + Samsung Electronics Co.,Ltd - 48684A - Intel Corporation + E8C913 + Samsung Electronics Co.,Ltd - BCF171 - Intel Corporation + 4CA954 + Intel Corporate - 84716A - Huawei Device Ltd + 08EB21 + Intel Corporate - 488C63 - Huawei Device Ltd + 14C24D + ATW TECHNOLOGY, INC. - 70DDEF - Huawei Device Ltd + 58E4EB + FN-LINK TECHNOLOGY Ltd. + + + 983A1F + Google, Inc. - 54A6DB - Huawei Device Ltd + F847E3 + Shenzhen Skyworth Digital Technology CO., Ltd - 5856C2 - Huawei Technologies Ltd + 089272 + Espressif Inc. - A03679 - Huawei Technologies Ltd + B06B11 + Hui Zhou Gaoshengda Technology Co.,LTD - B8D6F6 - Huawei Technologies Ltd + 2C0DCF + Xiaomi Communications Co Ltd - 2C52AF - Huawei Technologies Ltd + 140589 + Motorola Mobility LLC, a Lenovo Company - 149877 - Apple + 806A34 + Bouffalo Lab (Nanjing) Co., Ltd. - 88665A - Apple + 54DD21 + Huawei Device Co., Ltd. - B0E5F9 - Apple + AC1065 + KT Micro, Inc. - AC17C8 - Cisco Meraki + D4FF26 + OHSUNG - 981888 - Cisco Meraki + 008621 + Amazon Technologies Inc. - 4CC8A1 - Cisco Meraki + A82450 + Beijing Huadianzhongxin Tech.Co.,Ltd - 58FB96 - Ruckus Wireless + 8C44BB + SHEN ZHEN TENDA TECHNOLOGY CO.,LTD - F0625A - Realme Chongqing Mobile Telecommunications Corp Ltd + C8E31D + HUAWEI TECHNOLOGIES CO.,LTD - 64E0AB - Unionman Technology Ltd + 50ACB9 + HUAWEI TECHNOLOGIES CO.,LTD - AC2316 - Mist Systems Inc. + 0C331B + TydenBrooks - 2C00AB - ARRIS Group Inc. + 242BD6 + Ring LLC - 3CE36B - Zhejiang Dahua Technology Ltd + 003052 + Zhone Technologies, Inc. - 5C1720 - Huawei Device Ltd + 2C4C7D + New H3C Technologies Co., Ltd - 983F66 - Wuhan Funshion Online Technologies Ltd + E46E8A + BYD Lithium Battery Co., Ltd. - 605E4F - Huawei Device Ltd + 28575D + Apple, Inc. - 1CE6AD - Huawei Device Ltd + 3410BE + Apple, Inc. - 509707 - Xiamen Paperang Technology Ltd + E456AC + Silicon Laboratories - EC63D7 - Intel Corporation + 5491E1 + Vitalacy Inc. - 14857F - Intel Corporation + D852FA + Texas Instruments - 7C9F07 - CIG Shanghai Ltd + F433B7 + Apple, Inc. - 1C87E3 - Tecno Mobile Limited + D4BED7 + Dell Inc. - 94E23C - Intel Corporation + D42F4B + Hon Hai Precision Industry Co.,LTD - 20B730 - TeconGroup Inc. + 38E2C4 + Texas Instruments - 488899 - Shenzhen SuperElectron Technology Ltd + C8C83F + Texas Instruments - DCB131 - Shenzhen Huaruian Technology Ltd + E0D491 + Cisco Systems, Inc - 94A4F9 - Huawei Technologies Ltd + A4DCD5 + Cisco Systems, Inc - 6C3491 - Huawei Technologies Ltd + 54FB66 + ASRock Incorporation - E84D74 - Huawei Technologies Ltd + 902962 + Linkpower Microelectronics Co., Ltd. - CC895E - Huawei Technologies Ltd + 2C157E + RADIODATA GmbH - 8044FD - China Mobile (Hangzhou) Information Technology Ltd + 44F79F + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - F46AD7 - Microsoft Corporation + 10C34D + SHENZHEN WATER WORLD CO.,LTD. - 481F2D - Shenzhen Jie Shi Lian Industrial Ltd + 88492D + SHENZHEN BILIAN ELECTRONIC CO.,LTD - 8C73A0 - Fiberhome Telecommunication Technologies Ltd + A43A39 + AURORA TECHNOLOGIES CO.,LTD. - 1409B4 - ZTE Corporation + 34E1D7 + NXP Semiconductors Taiwan Ltd. - 101081 - ZTE Corporation + 849D4B + Shenzhen Boomtech Industrial Corporation - 78CFF9 - Huawei Device Ltd + 70A3A4 + Beijing Guming Communication Technology Co., Ltd. - A8E81E - ATW Technology Inc. + 94EF97 + Edgecore Americas Networking Corporation - F885F9 - Calix Inc. + 2C5917 + Arcadyan Corporation - CC88C7 - Aruba Networks HP + 2036D0 + Motorola Mobility LLC, a Lenovo Company - F81A2B - Google Inc. + 84D9E0 + eero inc. - F4A80D - Wistron InfoComm(Kunshan) Ltd + 7C6CE1 + Shenzhen Honesty Electronics Co.,Ltd. - 08A189 - Hangzhou Hikvision Digital Technology Ltd + 684A6E + Quectel Wireless Solutions Co.,Ltd. - 80F3EF - Facebook Technologies LLC + 64244D + Hangzhou Ezviz Software Co.,Ltd. - 3CA8ED - smart light technology + 0CA64C + Hangzhou Ezviz Software Co.,Ltd. - 04C29B - Aura Home Inc. + 34C6DD + Hangzhou Ezviz Software Co.,Ltd. - 143B42 - Realfit(Shenzhen) Intelligent Technology Ltd + AC1C26 + Hangzhou Ezviz Software Co.,Ltd. - EC2E98 - Azurewave Technologies Inc. + C02E1D + Nokia Solutions and Networks GmbH & Co. KG - 38F3AB - LCFC(HeFei) Electronics Technology Ltd + BC8753 + Sera Network Inc. - 50AE86 - Linkintec Ltd + 50FACB + IEEE Registration Authority - 38B3F7 - Huawei Device Ltd + B85213 + zte corporation - 84E986 - Huawei Device Ltd + 9C6D92 + Shanghai Kanghai Infomation System CO.,LTD - AC1F0F - Texas Instruments + 9CE450 + IEEE Registration Authority - 74D285 - Texas Instruments + E88F16 + Skullcandy - 601592 - IEEE Registration Authority + 1841FE + KATIM L.L.C - 10C9CA - Ace Technology Corp. + 001B85 + Everllence - BCFAB8 - Guangzhou Shiyuan Electronic Technology Company Limited + D8911D + Jiangsu Yuwell POCTech Biotechnology Co.,Ltd - D47798 - Cisco Systems Inc. + AC393D + eero inc. - A04A5E - Microsoft Corporation + 00E607 + AURCORE TECHNOLOGY INC. - EC0273 - Aruba Networks HP + 2C27E4 + Luxshare Precision Industry (Xuancheng) Co.,Ltd. - F4B1C2 - Zhejiang Dahua Technology Ltd + 4CD74A + Vantiva USA LLC - A4DAD4 - Yamato Denki Ltd + FC963E + EM Microelectronic - 109497 - Logitech Hong Kong + FCCF9F + EM Microelectronic - 00141D - KEBA Industrial Automation Germany GmbH + B40429 + Guangzhou Shiyuan Electronic Technology Company Limited - E0DA90 - Huawei Technologies Ltd + D425DE + New H3C Technologies Co., Ltd - A4A46B - Huawei Technologies Ltd + B0E8E8 + Silicon Laboratories - A0D7A0 - Huawei Device Ltd + 646911 + APTIV SERVICES US, LLC - 40E64B - Apple + 04D688 + CIG SHANGHAI CO LTD - B4FA48 - Apple + 787984 + Apple, Inc. - 943CC6 - Espressif Inc. + 6C0B84 + Universal Global Scientific Industrial., Ltd - 8C83FC - Axioma Metering UAB + 387C76 + Universal Global Scientific Industrial., Ltd - F02F4B - Apple + 78670E + WNC Corporation - 60A4B7 - TP-Link Corporation Limited + 58E403 + WNC Corporation - 60C5E6 - Skullcandy + F86DCC + WNC Corporation - 38F3FB - Asperiq + 70EBA5 + Huawei Device Co., Ltd. - A45802 - Shin-IL Tech + C890F7 + HUAWEI TECHNOLOGIES CO.,LTD - 38AFD0 - Nevro + 205843 + WNC Corporation - 00A00E - Netscout Systems Inc + 30144A + WNC Corporation - 30A612 - Shenzhen Hugsun Technology Ltd + F040AF + IEEE Registration Authority - ECB4E8 - Wistron Mexico SA de CV + 28B446 + SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD - 10381F - Sichuan AI-Link Technology Ltd + EC3A56 + AzureWave Technology Inc. - 3C7AC4 - Chemtronics + 08F97E + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 5414F3 - Intel Corporation + 50FE39 + Beijing Xiaomi Mobile Software Co., Ltd - 5CC8E3 - Shintec Hozumi Ltd + 2812D0 + Motorola Mobility LLC, a Lenovo Company - 18BB41 - Huawei Device Ltd + 189024 + Astera LED Technology GmbH - 7818A8 - Huawei Device Ltd + C878F7 + Cisco Systems, Inc - 807264 - Huawei Device Ltd + 985B76 + Vantiva Connected Home - Orange Belgium - 54F6E2 - Huawei Technologies Ltd + 5C4546 + Shenzhen Water World Information Co.,Ltd. - A85081 - Huawei Technologies Ltd + E47C1A + mercury corperation - E8F654 - Huawei Technologies Ltd + 045FA6 + Shenzhen SDMC Technology CP,.LTD - 2087EC - Huawei Technologies Ltd + B49D6B + vivo Mobile Communication Co., Ltd. - 6CFE54 - Intel Corporation + F4E1FC + Hewlett Packard Enterprise - 086AC5 - Intel Corporation + B41D62 + Nokia Shanghai Bell Co., Ltd. - 8C367A - Palo Alto Networks + E07256 + Intel Corporate - 1CFF59 - Sichuan Tianyi Comheart Telecom Ltd + F41C26 + AltoBeam Inc. - C01B23 - Sichuan Tianyi Comheart Telecom Ltd + 84D1C1 + Intel Corporate - 101EDA - Ingenico Terminals SAS + 78FDF1 + Shenzhen Huadian Communication Co., Ltd - 8C6A8D - Technicolor CH USA Inc. + FCF861 + Harman/Becker Automotive Systems GmbH - 68DDD9 - HMD Global Oy + 980A4B + Nokia Solutions and Networks GmbH & Co. KG - 3C195E - Samsung Electronics Ltd + 7461D1 + GOIP Global Services Pvt. Ltd. - 6C9466 - Intel Corporation + 588990 + Starkey Labs Inc. - 4C3B6C - Garo AB + E8F6D7 + IEEE Registration Authority - FC372B - Sichuan Tianyi Comheart Telecom Ltd + 389B73 + GSD VIET NAM TECHNOLOGY COMPANY LIMITED - 7CCC1F - Sichuan Tianyi Comheart Telecom Ltd + 28BBB2 + Infinix mobility limited - 5C4A1F - Sichuan Tianyi Comheart Telecom Ltd + 2CAFC4 + Private - 248BE0 - Sichuan Tianyi Comheart Telecom Ltd + 14A454 + Mist Systems, Inc. - 9C9C40 - Sichuan Tianyi Comheart Telecom Ltd + 0439CB + Qingdao HaierTechnology Co.,Ltd - 54E061 - Sichuan Tianyi Comheart Telecom Ltd + 681579 + BrosTrend Technology LLC - 187532 - Sichuan Tianyi Comheart Telecom Ltd + FCDB21 + SAMSARA NETWORKS INC - 78B84B - Sichuan Tianyi Comheart Telecom Ltd + DC83BF + Seiko Epson Corporation - D44165 - Sichuan Tianyi Comheart Telecom Ltd + E4F4C6 + NETGEAR - EC8AC4 - Amazon Technologies Inc. + 00095B + NETGEAR - 44356F - Neterix Ltd + 000FB5 + NETGEAR - 002289 - Vanderlande APC Inc. + 00223F + NETGEAR - 508A06 - Tuya Smart Inc. + 0026F2 + NETGEAR - D40868 - Beijing Lanxum Computer Technology Ltd + 04A151 + NETGEAR - B8145C - Huawei Device Ltd + 28C68E + NETGEAR - C89D18 - Huawei Device Ltd + A42B8C + NETGEAR - C48025 - Huawei Device Ltd + 803773 + NETGEAR - DC0398 - LG Innotek + 0C7165 + Motorola Mobility LLC, a Lenovo Company - E8DA00 - Kivo Technology Inc. + C03F0E + NETGEAR - CCB5D1 - Beijing Xiaomi Mobile Software Ltd + 3CEFA5 + CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD. - 78D6DC - Motorola (Wuhan) Mobility Technologies Communication Ltd + 04174C + Nanjing SCIYON Wisdom Technology Group Co.,Ltd. - 0C4314 - Silicon Laboratories + CC033D + Beijing Xiaomi Mobile Software Co., Ltd - 7886B6 - Shenzhen YOUHUA Technology Ltd + 503123 + FN-LINK TECHNOLOGY Ltd. - 24E124 - Xiamen Milesight IoT Ltd + E0C250 + NETGEAR - F4C02F - BlueBite + C8102F + NETGEAR - 98F083 - Huawei Technologies Ltd + 10DA43 + NETGEAR - 8C64A2 - OnePlus Technology (Shenzhen) Ltd + A040A0 + NETGEAR - D05475 - SAVI Controls + 0836C9 + NETGEAR - 88A0BE - Huawei Technologies Ltd + 6CCDD6 + NETGEAR - 949010 - Huawei Technologies Ltd + 30CB89 + OnLogic Inc - 28FBAE - Huawei Technologies Ltd + E48F09 + ithinx GmbH - A47806 - Cisco Systems Inc. + BCD9FB + China Mobile Group Device Co.,Ltd. - 0805E2 - Juniper Networks + 400AE7 + BSH Hausgeräte GmbH - B8D56B - Mirka Ltd + D4925E + Vantiva Technologies Belgium - BCA37F - Rail-Mil Sp. z o.o. Sp. K. + 101331 + Vantiva Technologies Belgium - 000818 - Pixelworks Inc. + 200E0F + Panasonic Marketing Middle East & Africa FZE - 28FA19 - Shenzhen Jingxun Software Telecommunication Technology Ltd + E8CBF5 + Ezurio, LLC - 64B379 - Private + D8031A + Ezurio, LLC - 5009E5 - Drimsys,Inc + 18C293 + Ezurio, LLC - 203CC0 - Beijing Tosee Technology Ltd + 88F9C0 + KTS Kommunikationstechnik und Systeme GmbH - D8A011 - WiZ + 145EBC + HUAWEI TECHNOLOGIES CO.,LTD - B8A14A - Raisecom Technology Ltd + 1088D3 + HUAWEI TECHNOLOGIES CO.,LTD - AC7A42 - iConnectivity + ACA7F1 + TP-Link Systems Inc. - 28DFEB - Intel Corporation + E40177 + SafeOwl, Inc. - 88FCA6 - devolo AG + 281DAA + ASTI India Private Limited - 489EBD - HP Inc. + C0188C + Altus Sistemas de Automação S.A. - 080037 - FUJIFILM Business Innovation Corp. + 907ABE + GSD VIET NAM TECHNOLOGY COMPANY LIMITED - 888E7F - Atop Corporation + FC8827 + Apple, Inc. - E8EDD6 - Fortinet Inc. + 0434CF + Apple, Inc. - 003059 - Kontron Europe GmbH + 60DE18 + Apple, Inc. - 547787 - Earda Technologies Ltd + 30ECA3 + Alfatron Electronics INC - 5C0CE6 - Nintendo Ltd + 403802 + Silicon Laboratories - D0C24E - Samsung Electronics Ltd + 10BC36 + Huawei Device Co., Ltd. - 345B98 - EM Microelectronic + B4F49B + Huawei Device Co., Ltd. - 70CD0D - Intel Corporation + 14D67C + Uncord Technologies Private Limited - 043926 - China Dragon Technology Limited + 80F1A8 + Guangzhou V-Solution Telecommunication Technology Co.,Ltd. - BC6E64 - Sony Corporation + 742435 + Huawei Device Co., Ltd. - 4040A7 - Sony Corporation + 0C0ECB + Huawei Device Co., Ltd. - B4527D - Sony Corporation + E880E7 + Huawei Device Co., Ltd. - 00EB2D - Sony Corporation + 70A8A5 + Microsoft Corporation - 303926 - Sony Corporation + 5C5C75 + IEEE Registration Authority - 8400D2 - Sony Corporation + A4F4CA + Private - 402BA1 - Sony Corporation + F01653 + YEALINK(XIAMEN) NETWORK TECHNOLOGY CO.,LTD. - 001813 - Sony Corporation + B061A9 + YEALINK(XIAMEN) NETWORK TECHNOLOGY CO.,LTD. - 001D28 - Sony Corporation + 6C4EB0 + Castelion Corporation - 001EDC - Sony Corporation + 68B5E3 + HUAWEI TECHNOLOGIES CO.,LTD - 840112 - Kaonmedia Ltd + C46DD1 + HUAWEI TECHNOLOGIES CO.,LTD - 44D4E0 - Sony Corporation + 34A137 + HUAWEI TECHNOLOGIES CO.,LTD - 44746C - Sony Corporation + F891F5 + Dingtian Technologies Co., Ltd - 283F69 - Sony Corporation + 4C43F6 + SZ DJI TECHNOLOGY CO.,LTD - 00219E - Sony Corporation + 7CA53E + Motorola Mobility LLC, a Lenovo Company - A0C4A5 - Sygn House Inc. + D83139 + zte corporation - 6881E0 - Huawei Technologies Ltd + A05911 + Cisco Meraki - 4CD629 - Huawei Technologies Ltd + 547AF4 + Bouffalo Lab (Nanjing) Co., Ltd. - F0C478 - Huawei Technologies Ltd + 489D31 + Espressif Inc. - D86D17 - Huawei Technologies Ltd + 14E22A + Cisco Systems, Inc - 7C1AC0 - Huawei Technologies Ltd + 709751 + Beijing Xiaomi Mobile Software Co., Ltd - D04DC6 - Aruba Networks HP + 5CD33D + Samsung Electronics Co.,Ltd - 44F09E - Apple + ACDE01 + Ruckus Wireless - 08FF44 - Apple + C0B550 + Broadcom Limited - 1C93C4 - Amazon Technologies Inc. + 90F861 + u-blox AG - AC49DB - Apple + 58AD08 + IEEE Registration Authority - 1856C3 - Apple + 58BD35 + SHANGHAI XIANGCHENG COMMUNICATION TECHNOLOGY CO., LTD - 48188D - Weifang Goertek Electronics Ltd + 80999B + Murata Manufacturing Co., Ltd. - 80FBF1 - Freescale Semiconductor (China) Ltd + 001EAE + AUMOVIO Systems, Inc. - 38D57A - Cloud Network Technology Singapore PTE Ltd + D4C1A8 + KYKXCOM Co., Ltd. - 7C87CE - Espressif Inc. + B858FF + Arista Networks - 8C8172 - Sichuan Tianyi Comheart Telecom Ltd + 408256 + AUMOVIO Germany GmbH - 44E517 - Intel Corporation + 18F7F6 + Ericsson AB - 68F38E - Juniper Networks + 9C3312 + Treon Oy - 745D43 - BSH Hausgeraete GmbH + 4445BA + Edgecore Americas Networking Corporation - 70A56A - Shenzhen C-Data Technology Ltd + 14DD48 + Shield AI - 785F36 - Shenzhen Skyworth Digital Technology Ltd + D89999 + TECNO MOBILE LIMITED - A01842 - Comtrend Corporation + 84C7E2 + VusionGroup - 303FBB - Hewlett Packard Enterprise + 40E762 + Calix Inc. - EC94D5 - Juniper Networks + 681A47 + Apple, Inc. - 701F0B - Wilogy SRL + 2849E9 + Apple, Inc. - 40406C - Icomera + 78960D + Apple, Inc. - 646D4E - Huawei Technologies Ltd + 801D39 + Apple, Inc. - 085C1B - Huawei Technologies Ltd + CC722A + Apple, Inc. - 509A88 - Huawei Technologies Ltd + AC401E + vivo Mobile Communication Co., Ltd. - 506F0C - Sagemcom Broadband SAS + 3417DD + Sercomm France Sarl - 487397 - New H3C Technologies Ltd + 60159F + IEEE Registration Authority - A0445C - Huawei Technologies Ltd + 74E6C7 + LUXSHARE-ICT Co., Ltd. - 7C2ADB - Xiaomi Communications Ltd + 841623 + zte corporation - 941700 - Xiaomi Communications Ltd + D0F815 + HUAWEI TECHNOLOGIES CO.,LTD - 64A200 - Xiaomi Communications Ltd + 64D4F0 + NETVUE,INC. - 503DC6 - Xiaomi Communications Ltd + 14AEE0 + ETHERNEXION NETWORKS PTE. LTD. - 8CD9D6 - Xiaomi Communications Ltd + 045E0A + SHENZHEN TRANSCHAN TECHNOLOGY LIMITED - 44A642 - Hangzhou Hikvision Digital Technology Ltd + A86ACB + EVAR - 08E7E5 - Huawei Device Ltd + 58D812 + TP-Link Systems Inc. - D48660 - Arcadyan Corporation + 70792D + Mellanox Technologies, Inc. - B83BCC - Xiaomi Communications Ltd + A4431B + Dreamtek Intelligent Technology Co., Ltd - 88D199 - Vencer Ltd + B88411 + Shenzhen Shokz Co., Ltd. - CCE236 - Hangzhou Yaguan Technology Ltd + 946A7C + OnePlus Technology (Shenzhen) Co., Ltd - 204181 - ESYSE GmbH Embedded Systems Engineering + 209BA9 + Espressif Inc. - DCBB96 - Full Solution Telecom + 0C882F + Frog Innovations Limited - 74765B - Quectel Wireless Solutions Ltd + F04FE0 + Vizio, Inc - B437D8 - D-Link (Shanghai) Limited Corp. + 2C63A1 + Huawei Device Co., Ltd. - 9CD57D - Cisco Systems Inc. + 500FC6 + solum - 941F3A - Ambiq + 0422E7 + Fiberhome Telecommunication Technologies Co.,LTD - 80D2E5 - Nintendo Ltd + 2CE187 + New H3C Technologies Co., Ltd - F8CE72 - Wistron Corporation + 142E43 + Hisense broadband multimedia technology Co.,Ltd - CC9DA2 - Eltex Enterprise Ltd + 4892C1 + OHSUNG - 605375 - Huawei Technologies Ltd + 4C306A + Nintendo Co.,Ltd - 78DD33 - Huawei Technologies Ltd + 2C2BDB + eero inc. - A031DB - Huawei Technologies Ltd + DCF34C + PT HAN SUNG ELECTORONICS INDONESIA - 58BF25 - Espressif Inc. + B49107 + HUAWEI TECHNOLOGIES CO.,LTD - 101331 - Technicolor Delivery Technologies Belgium NV + FCEFD7 + HUAWEI TECHNOLOGIES CO.,LTD - 004066 - APRESIA Systems Ltd + EC5865 + Shenzhen Xinguodu Technology Co., Ltd - 7066E1 - dnt Innovation GmbH + 680947 + Espressif Inc. - 2C3557 - ELIIY Power Ltd + 70AF09 + Espressif Inc. - 080042 - MACNICA Inc. + 4461DF + Skyquad Electronics & Appliances Pvt. Ltd. - 546F71 - uAvionix Corporation + 9047C2 + Intel Corporate - 54EF33 - Shenzhen Bilian Electronic Ltd + 4840D5 + Intel Corporate - 141973 - Beijing Yunyi Times Technology Ltd + 1C8C6E + Arista Networks - 5C75C6 - China Mobile Group Device Ltd + 841DE8 + CJ intelligent technology LTD. - 4448B9 - MitraStar Technology Corp. + C484C0 + Motorola Mobility LLC, a Lenovo Company - A0D05B - Samsung Electronics Ltd + E8A927 + LEAR - 04D442 - Guangdong Genius Technology Ltd + 649B8F + Texas Instruments - 24D7EB - Espressif Inc. + 289E1E + Texas Instruments - A4E11A - Juniper Networks + CCC530 + AzureWave Technology Inc. - E86E44 - ZTE Corporation + A4F8FF + Ubiquiti Inc - 00E7E3 - ZTE Corporation + CC35D9 + Ubiquiti Inc - 9C54C2 - New H3C Technologies Ltd + 6C4780 + IEEE Registration Authority - 78E9CF - Tellescom Industria E Comercio EM Telecomunicacao + 50C3A2 + nFore Technology Co., Ltd. - A09F7A - D-Link Middle East FZCO + A40450 + nFore Technology Co., Ltd. - 001132 - Synology Incorporated + 001753 + nFore Technology Co., Ltd. - 9009D0 - Synology Incorporated + 441030 + Google, Inc. - 5C5230 - Apple + 80C429 + Renesas Electronics Operations Services Limited - 645A36 - Apple + 00E0AD + Brandywine Communications UK Ltd. - 28D244 - LCFC(HeFei) Electronics Technology Ltd + 588CCF + Silicon Laboratories - B42046 - eero Inc. + 507164 + Cisco Systems, Inc - 2032C6 - Apple + 001C44 + Electro Voice Dynacord BV - C81CFE - Zebra Technologies Inc. + 60A1FE + HPRO - 1C9ECC - Technicolor CH USA Inc. + A41894 + IQSIGHT B.V. - 1CED6F - AVM Audiovisuelles Marketing und Computersysteme GmbH + B03731 + FUJIAN STAR-NET COMMUNICATION CO.,LTD - 6C71D2 - Huawei Technologies Ltd + 249900 + FRITZ! Technology GmbH - F800A1 - Huawei Technologies Ltd + 18A084 + Apple, Inc. - D876AE - Huawei Technologies Ltd + 582A93 + Apple, Inc. - 0C8408 - Huawei Technologies Ltd + 64C905 + Apple, Inc. - 204B22 - Sunnovo International Limited + E88F8E + Hoags Technologies India Private Limited - D81F12 - Tuya Smart Inc. + 6C4033 + Beijing Megwang Technology Co., Ltd. - B06A41 - Google Inc. + E8FC5F + Ruckus Wireless - BCCE25 - Nintendo Ltd + 506382 + HUAWEI TECHNOLOGIES CO.,LTD - B010A0 - Texas Instruments + BC68C3 + HUAWEI TECHNOLOGIES CO.,LTD - 24FC4E - Juniper Networks + 3CBFD7 + Apple, Inc. - 98C854 - Chiun MaiCommunication System Inc. + 887E9B + Apple, Inc. - C4D7FD - Bouffalo Lab (Nanjing) Ltd + 542A43 + Apple, Inc. - 2CD1DA - Keysight Technologies Inc. + A493FE + HUAWEI TECHNOLOGIES CO.,LTD - C4FCEF - SambaNova Systems Inc. + E868B1 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - F0704F - Samsung Electronics Ltd + B0F079 + GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD - AC6C90 - Samsung Electronics Ltd + 449A52 + zte corporation - A41A3A - TP-Link Technologies Ltd + E823FB + Redder - 90B622 - Samsung Electronics Ltd + 64CA80 + Realme Chongqing Mobile Telecommunications Corp.,Ltd. - 0C02BD - Samsung Electronics Ltd + 40BA09 + Dell Inc. - 3484E4 - Texas Instruments + 000CDE + ABB AG - AC4D16 - Texas Instruments + 5C8217 + DSE srl - FCA84A - Sentinum GmbH + ACE606 + Honor Device Co., Ltd. - 1C5EE6 - Shenzhen Twowing Technologies Ltd + CCFA95 + Honor Device Co., Ltd. - 346F24 - Azurewave Technologies Inc. + 001D19 + Arcadyan Corporation - DCE55B - Google Inc. + C06BC7 + Gallagher Group Limited - 4CB9EA - iRobot Corporation + 64ACE0 + Samsung Electronics Co.,Ltd - DC9166 - Huawei Device Ltd + BCC436 + Nokia - 9035EA - Silicon Laboratories + DCB87D + Hewlett Packard Enterprise - 6C3C7C - Canon Inc. + 982BA6 + Motorola Mobility LLC, a Lenovo Company - F82F5B - eGauge Systems LLC + 247E7F + D-Fend Solutions A.D Ltd - 6C1ED7 - Vivo Mobile Communication Ltd + 7C4FB5 + Arcadyan Corporation - E4F1D4 - Vivo Mobile Communication Ltd + 507E5D + Arcadyan Corporation - D4ECAB - Vivo Mobile Communication Ltd + 0012BF + Arcadyan Corporation - BC3ECB - Vivo Mobile Communication Ltd + CC1EAB + LEDATEL sp. z o.o. i Wspólnicy sp.k - 203B69 - Vivo Mobile Communication Ltd + 7C5C8D + EM Microelectronic - C04754 - Vivo Mobile Communication Ltd + 04C29B + Aura Home, Inc. - D09CAE - Vivo Mobile Communication Ltd + B89734 + Silicon Laboratories - B4AC8C - Bern University Of Applied Sciences + 30A771 + Jiang Su Fulian Communication Technology Co.,Ltd - B894E7 - Xiaomi Communications Ltd + 806DDE + Beken Corporation - 34B98D - Xiaomi Communications Ltd + 681D4C + Kontron eSystems GmbH - 304F00 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 246800 + Samsung Electronics Co.,Ltd - 98C8B8 - Vivo Mobile Communication Ltd + F067B1 + Samsung Electronics Co.,Ltd - 540E2D - Vivo Mobile Communication Ltd + 900A48 + Samsung Electronics Co.,Ltd - 708F47 - Vivo Mobile Communication Ltd + ECB9A5 + Huawei Device Co., Ltd. - DC84E9 - Shenzhen Qihoo Intelligent Technology Ltd + 04801A + Huawei Device Co., Ltd. - 701135 - Livesecu Ltd + 4CD73A + ShenZhen XinZhongXin Technology Co., Ltd - C06B55 - Motorola Mobility LLC, a Lenovo Company + 9C5187 + SUNITEC TECHNOLOGY CO.,LIMITED - FC1D2A - Vivo Mobile Communication Ltd + FCEB7B + HUAWEI TECHNOLOGIES CO.,LTD - 78670E - Wistron Neweb Corporation + 00CC05 + HUAWEI TECHNOLOGIES CO.,LTD - 643216 - Weidu Technology (Beijing) Ltd + E4CA5F + Murata Manufacturing Co., Ltd. - B01C0C - Shenzhen Chuangwei-RGB Electronics Ltd + B41584 + Samsung Electronics Co.,Ltd - 68403C - Fiberhome Telecommunication Technologies Ltd + 34DDCC + Google, Inc. - 903E7F - Fiberhome Telecommunication Technologies Ltd + CC6146 + GSD VIET NAM TECHNOLOGY COMPANY LIMITED - 940230 - Logitech + 38879C + Ei Electronics - 14C0A1 - UCloud Technology Ltd + F4204D + Mellanox Technologies, Inc. - C03653 - eero Inc. + E8F674 + Jiang Su Fulian Communication Technology Co.,Ltd - 9460D5 - Aruba Networks HP + 7C5184 + Unis Flash Memory Technology(Chengdu)Co.,Ltd. - 080205 - Huawei Technologies Ltd + 041C6C + Intel Corporate - 68E478 - Qingdao Haier Technology Ltd + 109ABA + Intel Corporate - 4C445B - Intel Corporation + AC05C7 + Intel Corporate - C8CA79 - Ciena Corporation + 7864F0 + Beijing Soynetic Co., Ltd - 843B10 - Lvswitches Inc. + 68229F + Guangzhou V-Solution Telecommunication Technology Co.,Ltd. - E09D13 - Samsung Electronics Ltd + 78ECB5 + Ruijie Networks Co.,LTD - 30C6F7 - Espressif Inc. + 44EF26 + Qingdao Intelligent&Precise Electronics Co.,Ltd. - DC0E96 - Palo Alto Networks + 689268 + Motorola Mobility LLC, a Lenovo Company - 042084 - ZTE Corporation + EC34E2 + Yasmina Labs Trading FZE - B45F84 - ZTE Corporation + 143EC2 + Intel Corporate - 9CC2C4 - Inspur Electronic Information Industry Ltd + F4253C + eero inc. - 00DF1D - Cisco Systems Inc. + 1C23A2 + FRITZ! Technology GmbH - A00F37 - Cisco Systems Inc. + 9C862B + MOTOROLA SOLUTIONS MALAYSIA SDN. BHD. - 1097BD - Espressif Inc. + E0D3F0 + AltoBeam Inc. - BC6EE2 - Intel Corporation + 10F1C7 + Tachyon Networks Inc - 387A0E - Intel Corporation + E4FF69 + Holiday Robotics - 787264 + 4C6E44 IEEE Registration Authority - 88231F - Fibocom Wireless Inc. + 306D34 + Wu Qi Technologies,Inc. - A4DE26 - Sumitomo Electric Industries Ltd + B89DE5 + ASIX Electronics Corporation - 301A30 - Mako Networks Ltd + E498E0 + Tonly Technology Co. Ltd - C48BA3 - Cisco Meraki + A821C8 + shenzhen phoenix telecom technology Co.,Ltd. - 140A29 - Tiinlab Corporation + 78BB5C + Nokia Solutions and Networks India Private Limited - C0F9D2 - arkona technologies GmbH + 481389 + Mellanox Technologies, Inc. - 146102 - Alps Alpine + 188AF1 + LEDVANCE, LLC - A02919 - Dell Inc. + 8498A7 + Texas Instruments - 241281 - China Mobile Group Device Ltd + 80A2FC + AzureWave Technology Inc. - D4EEDE - Sichuan Tianyi Comheart Telecom Ltd + 9030D6 + Quectel Wireless Solutions Co.,Ltd. - C08B05 - Huawei Technologies Ltd + 44321D + HUAWEI TECHNOLOGIES CO.,LTD - 307BC9 - Shenzhen Bilian Electronic Ltd + 3CC801 + Shenzhen Sundray Technologies company Limited - 50C0F0 - Artek Microelectronics Ltd + A8DDEC + Hangzhou BroadLink Technology Co., Ltd - 046865 - Apple + 4898AB + Wistron InfoComm(Chongqing)Co.,Ltd. - DC5392 - Apple + 2887AF + Advantech Technology (CHINA) Co., Ltd. - 1CB3C9 - Apple + 50E467 + Ring LLC - FCAA81 - Apple + 4C4AB4 + Juniper Networks - 609316 - Apple + 944667 + Cisco Systems, Inc - 646D2F - Apple + 8C142A + Cisco Systems, Inc - 5C9666 - Sony Interactive Entertainment Inc. + 6CDFD9 + Concept2, Inc. - 24CE33 - Amazon Technologies Inc. + 38F406 + Jinan USR IOT Technology Limited - 7C726E - Ericsson AB + 20AEB6 + Huawei Device Co., Ltd. - 549F06 - Nokia Shanghai Bell Ltd + 7C162A + Huawei Device Co., Ltd. - 68A878 - GeoWAN Pty Ltd + E0A447 + zte corporation - 38A91C - New H3C Technologies Ltd + B0DE31 + Samsung Electronics Co.,Ltd - 94B34F - Ruckus Wireless + D05794 + Sagemcom Broadband SAS - F4700C - IEEE Registration Authority + 80E8A4 + zte corporation - 409B21 - Nokia + DCCB35 + EM Microelectronic - FC777B - Hitron Technologies Inc. + 5C5A35 + eero inc. - 14172A - Fiberhome Telecommunication Technologies Ltd + 00107F + CRESTRON ELECTRONICS, INC. - 005FBF - Toshiba Corp. + 948835 + CRESTRON ELECTRONICS, INC. - E8A72F + 107A2A Microsoft Corporation - D405DE - eero Inc. + 74D809 + Microsoft Corporation - FC0FE7 - Microchip Technology Inc. + 54B27E + Sagemcom Broadband SAS - C85CCC - Beijing Xiaomi Mobile Software Ltd + 5022C9 + Bel Power Solutions, Inc. - 70FD88 - Nanjing Jiahao Technology Ltd + 745D43 + BSH Hausgeräte GmbH - 4873CB - Tiinlab Corporation + F86347 + Sichuan AI-Link Technology Co., Ltd. - 38384B - Vivo Mobile Communication Ltd + 246404 + GSD VIET NAM TECHNOLOGY COMPANY LIMITED - 789FAA - Huawei Device Ltd + 84016E + Honor Device Co., Ltd. - 98192C - Edgecore Networks Corporation + B490E5 + GD Midea Air-Conditioning Equipment Co.,Ltd. - 88A4C2 - LCFC(Hefei) Electronics Technology Ltd + B8DC7D + VusionGroup - AC8B6A - China Mobile IOT Company Limited + 201F55 + DJI Osmo Technology Co., Ltd. - E07E5F - Renesas Electronics (Penang) Sdn. Bhd. + 904DE2 + Apple, Inc. - 38BEAB - AltoBeam (China) Inc. + ECDCAA + Apple, Inc. - 341343 - GE Lighting + 08240B + Apple, Inc. - B89EA6 - Spbec-Mining Ltd + 0C0EC1 + IEEE Registration Authority - AC50DE - Cloud Network Technology Singapore PTE Ltd + 8C65EC + TUBITAK MAM - 08C8C2 - GN Audio A/S + 101988 + Mother Computer Inc. - 185880 - Arcadyan Corporation + F8B22C + Roku, Inc - A01C87 - Unionman Technology Ltd + 04B3C9 + WNC Corporation - 3083D2 - Motorola Mobility LLC, a Lenovo Company + 84DD84 + Cisco Systems, Inc - 00DDB6 - New H3C Technologies Ltd + A02490 + IEEE Registration Authority - B08B92 - ZTE Corporation + 00901D + Gallagher Group Limited - 782184 - Espressif Inc. + 00C096 + Tamu Radiance Corporation - 94944A - Particle Industries Inc. + D0B0DF + Mimosa Networks - 2CA327 - Oraimo Technology Limited + 880348 + SERCOMM PHILIPPINES INC - 1466B7 - Advanced Design Technology Pty Ltd + 60DD10 + Shenzhen Angxun Technology Co.,Ltd - B8F255 - Universal Electronics Inc. + A8213A + Shenzhen Talent Technology Comapny Limited 深圳市泰霖科技有限公司 - CC3F1D - HMS Industrial Networks SLU + 30075C + Netis Technology Co., Ltd. - 5C49FA - Shenzhen Guowei Shidai Communication Equipement Ltd + 649E58 + MM Devices Pty. Ltd. - EC656E - The Things Industries B.V. + C4224E + Telink Micro LLC - 10AEA5 - Duskrise Inc. + 4C8237 + Telink Micro LLC - 587DB6 - Northern Data AG + 24FAD6 + EMSTONE - 5C8E8B - Shenzhen Linghai Electronics Ltd + 00A0E3 + XKL LLC - 78EB46 - Huawei Technologies Ltd + F8AB05 + Sagemcom Broadband SAS - C416C8 - Huawei Technologies Ltd + A408F5 + Sagemcom Broadband SAS - E4DCCC - Huawei Technologies Ltd + 2420C7 + Sagemcom Broadband SAS - 3CA161 - Huawei Technologies Ltd + 44E9DD + Sagemcom Broadband SAS - 9075BC - Nokia Shanghai Bell Ltd + B0B28F + Sagemcom Broadband SAS - C0F87F - Cisco Systems Inc. + F4EB38 + Sagemcom Broadband SAS - 4C53FD - Amazon Technologies Inc. + A42249 + Sagemcom Broadband SAS - 3C8B7F - Cisco Systems Inc. + 20B82B + Sagemcom Broadband SAS - 0011E5 - KCodes Corporation + B86AF1 + Sagemcom Broadband SAS - A083B4 - HeNet B.V. + CC5830 + Sagemcom Broadband SAS - 04FF08 - Huawei Device Ltd + 5447CC + Sagemcom Broadband SAS - 00A45F - Huawei Device Ltd + 3C585D + Sagemcom Broadband SAS - FCE26C - Apple + 30F600 + Sagemcom Broadband SAS - 485AEA - Fiberhome Telecommunication Technologies Ltd + D4B5CD + Sagemcom Broadband SAS - 848102 - Fiberhome Telecommunication Technologies Ltd + A02DDB + Sagemcom Broadband SAS - 54E005 - Fiberhome Telecommunication Technologies Ltd + 209A7D + Sagemcom Broadband SAS - 4C7975 - Apple + A86ABB + Sagemcom Broadband SAS - 1C7125 - Apple + F08175 + Sagemcom Broadband SAS - 34FE77 - Apple + A039EE + Sagemcom Broadband SAS - 98B785 - Shenzhen 10Gtek Transceivers Ltd + B8EE0E + Sagemcom Broadband SAS - ECDA59 - New H3C Technologies Ltd + 5CB13E + Sagemcom Broadband SAS - 74B7E6 - Zegna-Daidong Limited + 346B46 + Sagemcom Broadband SAS - 6CE5C9 - Apple + A039F9 + Sagemcom Broadband SAS - 10B1DF - Cloud Network Technology Singapore PTE Ltd + 7CE87F + Sagemcom Broadband SAS - F4F647 - ZTE Corporation + 506F0C + Sagemcom Broadband SAS - E88175 - ZTE Corporation + 2C3AE8 + Espressif Inc. - 40F4FD - Unionman Technology Ltd + ECFABC + Espressif Inc. - 9C0B05 - eero Inc. + DC4F22 + Espressif Inc. - 78F238 - Samsung Electronics Ltd + E8BE81 + Sagemcom Broadband SAS - 64D0D6 - Samsung Electronics Ltd + 681590 + Sagemcom Broadband SAS - DC9758 - Sichuan AI-Link Technology Ltd + 2CE412 + Sagemcom Broadband SAS - 40F6BC - Amazon Technologies Inc. + 44B176 + Espressif Inc. - 20AF1B - SteelSeries ApS + 9CCC01 + Espressif Inc. - 7C7716 - ZyXEL Communications Corp + 001BBF + Sagemcom Broadband SAS - 943FBB - JSC RPC Istok named after Shokin + 002569 + Sagemcom Broadband SAS - 50E7B7 - Vivo Mobile Communication Ltd + 00789E + Sagemcom Broadband SAS - F4F70C - Avang - neterbit + E04F95 + Sagemcom Broadband SAS - E0FFF1 - Texas Instruments + A4CB8F + Espressif Inc. - F4442C - Shenzhen SuperElectron Technology Ltd + 907069 + Espressif Inc. - F0BE25 - Dongguan Cannice Precision Manufacturing Ltd + 206EF1 + Espressif Inc. - 0080DA - Hottinger Bruel & Kjaer A/S + D4B6C9 + Nokia - 704CB6 - Shenzhen SuperElectron Technology Ltd + 188B0E + Espressif Inc. - 549B49 - NEC Platforms Ltd + 08A6F7 + Espressif Inc. - 882510 - Aruba Networks HP + 2CBCBB + Espressif Inc. - 448C00 - Realme Chongqing Mobile Telecommunications Corp Ltd + ECC9FF + Espressif Inc. - D0E828 - Radiant Industries Incorporated + E4B063 + Espressif Inc. - 74EF4B - Guangdong Oppo Mobile Telecommunications Corp Ltd + 1C6920 + Espressif Inc. - 107636 - Earda Technologies Ltd + 8813BF + Espressif Inc. - 18C293 - Laird Connectivity + 345F45 + Espressif Inc. - 000D9C - K.A. Schmersal GmbH & Co. KG + C05D89 + Espressif Inc. - 244CAB + DCDA0C Espressif Inc. - E04102 - ZTE Corporation + 744DBD + Espressif Inc. - D84008 - Huawei Technologies Ltd + 30C922 + Espressif Inc. - 6C047A - Huawei Technologies Ltd + EC64C9 + Espressif Inc. - 6C558D - Huawei Technologies Ltd + F0F5BD + Espressif Inc. - 78482C - Start USA Inc. + EC6260 + Espressif Inc. - 7C45D0 - Shenzhen Wewins Wireless Ltd + C8F09E + Espressif Inc. - A42A95 - D-Link International + DC5475 + Espressif Inc. - 30CBC7 - Cambium Networks Limited + 4827E2 + Espressif Inc. - 482E72 - Cisco Systems Inc. + A8032A + Espressif Inc. - 885046 - Lear + 6055F9 + Espressif Inc. - 70041D + 943CC6 Espressif Inc. - 886F29 - Pocketbook International SA + 30C6F7 + Espressif Inc. - 744687 - Kingsignal Technology Ltd + 1097BD + Espressif Inc. - BC2247 - New H3C Technologies Ltd + 782184 + Espressif Inc. - 0826AE - IEEE Registration Authority + 7C87CE + Espressif Inc. - 8C477F - NambooSolution + 58BF25 + Espressif Inc. - 7CDAC3 - Sichuan Tianyi Comheart Telecom Ltd + 24D7EB + Espressif Inc. - 8C17B6 - Huawei Device Ltd + 64E833 + Espressif Inc. - B82B68 - Huawei Device Ltd + 64B708 + Espressif Inc. - 2CF295 - Huawei Device Ltd + 3C71BF + Espressif Inc. - E0BB0C - Synertau LLC + 24A160 + Espressif Inc. - 149BD7 - Muli Muwai Furniture Qidong Ltd + FC934E + REALTEK SEMICONDUCTOR CORP. - AC77B9 - Nanjing Yufei Intelligent Control Technology Ltd + B43A45 + Espressif Inc. - A85BB7 - Apple + 6825DD + Espressif Inc. - 3C5D29 - Zhejiang Tmall Technology Ltd + 6CC840 + Espressif Inc. - 68FCCA - Samsung Electronics Ltd + 28562F + Espressif Inc. - 6CD719 - Fiberhome Telecommunication Technologies Ltd + D48C49 + Espressif Inc. - 80015C - Synaptics Inc. + DC1ED5 + Espressif Inc. - BC6193 - Xiaomi Communications Ltd + 30EDA0 + Espressif Inc. - 947FD8 - Shenzhen Skyworth Digital Technology Ltd + 38327A + Routerboard.com - C854A4 - Infinix mobility limited + 84C065 + Nintendo Co.,Ltd - EC71DB - Reolink Innovation Limited + 306222 + Samsung Electronics Co.,Ltd - F8E57E - Cisco Systems Inc. + D0CF13 + Espressif Inc. - 3053C1 - Cresyn + 549B49 + NEC Platforms, Ltd. - 385B44 - Silicon Laboratories + C025A2 + NEC Platforms, Ltd. - 943469 + 4C4553 Silicon Laboratories - AC330B - Japan Computer Vision Corp. - - - 3462B4 - Renesas Electronics (Penang) Sdn. Bhd. - - - CCEB18 - OOO TSS + 38BEAB + AltoBeam Inc. - 6C2408 - LCFC(Hefei) Electronics Technology Ltd + A0B15C + Google, Inc. - EC6073 - TP-Link Technologies Ltd + 405925 + Kaon Broadband CO., LTD. - 74DDCB - China Leadshine Technology Ltd + AC2BA2 + The Chamberlain Group, Inc - 104D15 - Viaanix Inc + E0DFB7 + Zeica Labs Pte Ltd - 50A015 - Shenzhen Yipingfang Network Technology Ltd + 3C846A + TP-LINK TECHNOLOGIES CO.,LTD. - B0AFF7 - Shenzhen Yipingfang Network Technology Ltd + 84D81B + TP-LINK TECHNOLOGIES CO.,LTD. - 7085C4 - Ruijie Networks Ltd + D84732 + TP-LINK TECHNOLOGIES CO.,LTD. - 5CC563 - Hunan FN-Link Technology Limited + 245A5F + TP-LINK TECHNOLOGIES CO.,LTD. - A0092E - ZTE Corporation + 485F08 + TP-LINK TECHNOLOGIES CO.,LTD. - 14755B - Intel Corporation + F86FB0 + TP-LINK TECHNOLOGIES CO.,LTD. - A8B13B - HP Inc. + C4BB89 + Shanghai High-Flying Electronics Technology Co.,Ltd - C43875 - Sonos Inc. + E47010 + Apple, Inc. - 68B691 - Amazon Technologies Inc. + EC6073 + TP-LINK TECHNOLOGIES CO.,LTD. - 20898A - Shenzhen Skyworth Digital Technology Ltd + A41A3A + TP-LINK TECHNOLOGIES CO.,LTD. - DCA956 - Guangdong Oppo Mobile Telecommunications Corp Ltd + 7CB59B + TP-LINK TECHNOLOGIES CO.,LTD. - 4827C5 - Huawei Technologies Ltd + 84B890 + TP-LINK TECHNOLOGIES CO.,LTD. - BCD206 - Huawei Technologies Ltd + 38C22D + Mellanox Technologies, Inc. - CC827F - Advantech Technology (CHINA) Ltd + D8C262 + Ubiquiti Inc - F84E58 - Samsung Electronics Ltd + A09C19 + CIG SHANGHAI CO LTD - B47064 - Samsung Electronics Ltd + 3409E9 + Harman/Becker Automotive Systems GmbH - 4C2E5E - Samsung Electronics Ltd + C0582E + Cisco Systems, Inc - 645DF4 - Samsung Electronics Ltd + E4135C + Cisco Systems, Inc - D81068 - Murata Manufacturing Ltd + D8C960 + Huawei Device Co., Ltd. - 5C045A - Company NA Stage & Light + 30E226 + Apple, Inc. - 883F0C - System a.v Ltd + 842789 + Apple, Inc. - C8BE35 - Extreme Networks Inc. + B4A64A + Espressif Inc. - 78AF08 - Intel Corporation + D032E7 + Tuya Smart Inc. - F4E204 - Coyote System + 4890F0 + Dell Inc. - 58C356 - EM Microelectronic + 6C7028 + Landis+Gyr S.A. - A0EDFB - Quectel Wireless Solutions Ltd + 888225 + Telink Micro LLC - B02347 - Shenzhen Giant Microelectronics Company Limited + 70246E + Zhejiang Laibao Display Technology Co., Ltd. - CCDD58 - Robert Bosch GmbH + F45424 + Extreme Networks, Inc. - D4E053 - Aruba Networks HP + F02B7C + Extreme Networks, Inc. - 88FC5D - Cisco Systems Inc. + 7467F7 + Extreme Networks, Inc. - F4C88A - Intel Corporation + 580E85 + Sagemcom Broadband SAS - 183C98 - Shenzhen Hengyi Technology Ltd + 5C0E8B + Extreme Networks, Inc. - 787104 - Sichuan Tianyi Comheart Telecom Ltd + 00E02B + Extreme Networks, Inc. - 64C582 - China Mobile Group Device Ltd + 000496 + Extreme Networks, Inc. - 50284A - Intel Corporation + D88466 + Extreme Networks, Inc. - 5CA4F4 - ZTE Corporation + 209EF7 + Extreme Networks, Inc. - 9409C9 - Alpsalpine Co Ltd + 787D53 + Extreme Networks, Inc. - 246C60 - Huawei Device Ltd + 5859C2 + Extreme Networks, Inc. - 98C97C - Shenzhen iComm Semiconductor Ltd + 7C95B1 + Extreme Networks, Inc. - 303EA7 - Intel Corporation + F06426 + Extreme Networks, Inc. - 28A331 - Sierra Wireless + 2CE7A7 + SJIT Co., Ltd. - EC6260 - Espressif Inc. + C8BE35 + Extreme Networks, Inc. - B06E72 - Realme Chongqing Mobile Telecommunications Corp Ltd + DCDCC3 + Extreme Networks, Inc. - 607D09 - Luxshare Precision Industry Ltd + 5858CD + Extreme Networks, Inc. - 1834AF - Kaonmedia Ltd + 4C231A + Extreme Networks, Inc. - 28827C - Bosch Automative products(Suzhou) Ltd Changzhou Branch + 809562 + Extreme Networks, Inc. - 28F5D1 - ARRIS Group Inc. + 1849F8 + Extreme Networks, Inc. - 10E177 - ARRIS Group Inc. + D802C0 + Extreme Networks, Inc. - 90D473 - Vivo Mobile Communication Ltd + 602D74 + Extreme Networks, Inc. - 08EBF6 - Huawei Technologies Ltd + 88F2CE + Apple, Inc. - CC3E79 - ARRIS Group Inc. + 881032 + Apple, Inc. - 0016A3 - Ingeteam + 34C386 + Apple, Inc. - F06C5D - Xiaomi Communications Ltd + ACE6FB + Apple, Inc. - 24CF24 - Beijing Xiaomi Mobile Software Ltd + 403F43 + Extreme Networks, Inc. - C8F09E - Espressif Inc. + 30F856 + Extreme Networks, Inc. - DC5475 - Espressif Inc. + 0089C9 + Extreme Networks, Inc. - 0C7BC8 - Cisco Meraki + 74DDF0 + SHEN ZHEN TENDA TECHNOLOGY CO.,LTD - 286F40 - Tonly Technology Ltd + CC79B8 + Lunar Energy - 0C86C7 - Jabil Circuit (Guangzhou) Limited + 803FD4 + Apple, Inc. - 1C0D7D - Apple + 44E853 + Apple, Inc. - 14F287 - Apple + DCE541 + Apple, Inc. - 585595 - Apple + DC0A69 + Espressif Inc. - 14946C - Apple + 082532 + IEEE Registration Authority - 1C5974 - IEEE Registration Authority + B42802 + Intel Corporate - 74604C - Rode + F82980 + Dongguan Ruilian Xiangtong Technology Co., Ltd - 40B02F - Miele & Cie. KG + D8A312 + Taicang T&W Electronics - 1866F0 - Jupiter Systems + ECB157 + Sagemcom Broadband SAS - BCC7DA - Earda Technologies Ltd + 244750 + Sagemcom Broadband SAS \ No newline at end of file diff --git a/Source/NETworkManager.Models/Resources/Ports.xml b/Source/NETworkManager.Models/Resources/Ports.xml index d8f030c5da..a00465324c 100644 --- a/Source/NETworkManager.Models/Resources/Ports.xml +++ b/Source/NETworkManager.Models/Resources/Ports.xml @@ -1,6 +1,6 @@  +Generated 07/06/2026 22:48:00--> 0 @@ -29,26 +29,26 @@ Generated 02/21/2022 03:26:03--> 2 tcp - compressnet - Management Utility + record + Reserved 2 udp - compressnet - Management Utility + record + Reserved 3 tcp - compressnet - Compression Process + record + Reserved 3 udp - compressnet - Compression Process + record + Reserved 4 @@ -3171,6 +3171,18 @@ Generated 02/21/2022 03:26:03--> k-block K-BLOCK + + 300 + tcp + tacacss + TLS Secure Login Host Protocol (TACACSS) + + + 300 + udp + record + Reserved + 308 tcp @@ -3594,14 +3606,16 @@ Generated 02/21/2022 03:26:03--> 359 tcp - nsrmp - Network Security Risk Management Protocol + + + Reserved 359 udp - nsrmp - Network Security Risk Management Protocol + + + Reserved 360 @@ -8500,38 +8514,38 @@ Generated 02/21/2022 03:26:03--> 831 tcp - netconf-beep - NETCONF over BEEP + record + Reserved 831 udp - netconf-beep - NETCONF over BEEP + record + Reserved 832 tcp - netconfsoaphttp - NETCONF for SOAP over HTTPS + record + Reserved 832 udp - netconfsoaphttp - NETCONF for SOAP over HTTPS + record + Reserved 833 tcp - netconfsoapbeep - NETCONF for SOAP over BEEP + record + Reserved 833 udp - netconfsoapbeep - NETCONF for SOAP over BEEP + record + Reserved 847 @@ -8561,13 +8575,13 @@ Generated 02/21/2022 03:26:03--> 853 tcp domain-s - DNS query-response protocol run over TLS/DTLS + DNS query-response protocol run over TLS 853 udp domain-s - DNS query-response protocol run over TLS/DTLS + DNS query-response protocol run over DTLS or QUIC 854 @@ -8779,6 +8793,32 @@ Generated 02/21/2022 03:26:03--> apex-edge APEX endpoint-relay service + + 914 + tcp + + + Reserved + + + 914 + udp + rift-lies + Routing in Fat Trees Link Information Element + + + 915 + tcp + + + Reserved + + + 915 + udp + rift-ties + Routing in Fat Trees Topology Information Element + 953 tcp @@ -12666,13 +12706,13 @@ Generated 02/21/2022 03:26:03--> 1325 tcp dx-instrument - DX-Instrument + Thermo Fisher Scientific Instrumentation (Formally Dionex) 1325 udp dx-instrument - DX-Instrument + Thermo Fisher Scientific Instrumentation (Formally Dionex) 1326 @@ -18690,13 +18730,13 @@ Generated 02/21/2022 03:26:03--> 1815 tcp mmpft - MMPFT + Manufacturing messaging protocol for factory transmission 1815 udp mmpft - MMPFT + Manufacturing messaging protocol for factory transmission 1816 @@ -20669,14 +20709,14 @@ Generated 02/21/2022 03:26:03--> 1980 tcp - pearldoc-xact - PearlDoc XACT + panquest-xact + PanQuest XACT 1980 udp - pearldoc-xact - PearlDoc XACT + panquest-xact + PanQuest XACT 1981 @@ -24122,6 +24162,18 @@ Generated 02/21/2022 03:26:03--> rcts Rotorcraft Communications Test System + + 2259 + tcp + bid-serv + BIF identifiers resolution service + + + 2259 + udp + bid-serv + BIF identifiers resolution service + 2260 tcp @@ -25490,6 +25542,18 @@ Generated 02/21/2022 03:26:03--> opentable OpenTable + + 2369 + tcp + bif-p2p + Blockchain Identifier InFrastructure P2P + + + 2369 + udp + bif-p2p + Blockchain Identifier InFrastructure P2P + 2370 tcp @@ -30618,6 +30682,18 @@ Generated 02/21/2022 03:26:03--> initlsmsad initlsmsad + + 2794 + tcp + urp + Uniform Resource Platform + + + 2794 + udp + urp + Uniform Resource Platform + 2795 tcp @@ -35127,14 +35203,14 @@ Generated 02/21/2022 03:26:03--> 3157 tcp - e3consultants - CCC Listener Port + lsa-comm + LSA Communicator 3157 udp - e3consultants - CCC Listener Port + lsa-comm + LSA Communicator 3158 @@ -36639,13 +36715,13 @@ Generated 02/21/2022 03:26:03--> 3283 tcp - Apple Remote Desktop (Net Assistant) + net-assistant Net Assistant 3283 udp - Apple Remote Desktop (Net Assistant) + net-assistant Net Assistant @@ -36852,6 +36928,18 @@ Generated 02/21/2022 03:26:03--> record Reserved + + 3301 + tcp + tarantool + Tarantool in-memory computing platform + + + 3301 + udp + tarantool + Tarantool in-memory computing platform + 3302 tcp @@ -41277,13 +41365,13 @@ Generated 02/21/2022 03:26:03--> 3679 tcp - Escale (Newton Dock) + newton-dock Newton Dock 3679 udp - Escale (Newton Dock) + newton-dock Newton Dock @@ -44859,13 +44947,13 @@ Generated 02/21/2022 03:26:03--> 3974 tcp - citysearch + xk22 Remote Applicant Tracking Service 3974 udp - citysearch + xk22 Remote Applicant Tracking Service @@ -47841,14 +47929,14 @@ Generated 02/21/2022 03:26:03--> 4319 tcp - fox-skytale - Fox SkyTale encrypted communication + skytale + Sentyron SkyTale encrypted communication 4319 udp - fox-skytale - Fox SkyTale encrypted communication + skytale + Sentyron SkyTale encrypted communication 4320 @@ -47901,26 +47989,26 @@ Generated 02/21/2022 03:26:03--> 4325 tcp - geognosisman - Cadcorp GeognoSIS Manager Service + geognosisadmin + Cadcorp GeognoSIS Administrator 4325 udp geognosisman - Cadcorp GeognoSIS Manager Service + Cadcorp GeognoSIS Administrator 4326 tcp geognosis - Cadcorp GeognoSIS Service + Cadcorp GeognoSIS 4326 udp geognosis - Cadcorp GeognoSIS Service + Cadcorp GeognoSIS 4327 @@ -48753,14 +48841,14 @@ Generated 02/21/2022 03:26:03--> 4413 tcp - avi-nms - AVI Systems NMS + vision-mon + FORTÉ Vision Monitoring platform 4413 udp - avi-nms-disc - AVI Systems NMS + vision-mon-disc + FORTÉ Vision Monitoring platform 4414 @@ -49230,6 +49318,18 @@ Generated 02/21/2022 03:26:03--> record Reserved + + 4480 + tcp + agtp + Agent Transfer Protocol + + + 4480 + udp + agtp-quic + Agent Transfer Protocol over QUIC + 4484 tcp @@ -49308,6 +49408,18 @@ Generated 02/21/2022 03:26:03--> a25-fap-fgw A25 (FAP-FGW) + + 4503 + tcp + record + Reserved + + + 4503 + udp + m-bus-oms + M-Bus-OMS over UDP + 4534 tcp @@ -50820,6 +50932,42 @@ Generated 02/21/2022 03:26:03--> record Reserved + + 4792 + tcp + unified-bus + IP Routable Unified Bus + + + 4792 + udp + unified-bus + IP Routable Unified Bus + + + 4793 + tcp + record + Reserved + + + 4793 + udp + uet + Ultra Ethernet Transport + + + 4794 + tcp + record + Reserved + + + 4794 + udp + veroce + veRoCE Transport Protocol + 4800 tcp @@ -53544,6 +53692,30 @@ Generated 02/21/2022 03:26:03--> mnet-discovery m-net discovery + + 5242 + tcp + attune + ATTUne API + + + 5242 + udp + record + Reserved + + + 5243 + tcp + xycstatus + xyClient Status API and rendevous point + + + 5243 + udp + record + Reserved + 5245 tcp @@ -54012,6 +54184,18 @@ Generated 02/21/2022 03:26:03--> record Reserved + + 5319 + tcp + roughtime + Roughtime time synchronization + + + 5319 + udp + roughtime + Roughtime time synchronization + 5320 tcp @@ -55098,6 +55282,18 @@ Generated 02/21/2022 03:26:03--> matter Matter Operational Discovery and Communi + + 5543 + tcp + qftest-licserve + QF-Test License Server + + + 5543 + udp + record + Reserved + 5550 tcp @@ -56526,6 +56722,18 @@ Generated 02/21/2022 03:26:03--> spt-automation Support Automation + + 5820 + tcp + autopassdaemon + AutoPass licensing + + + 5820 + udp + record + Reserved + 5841 tcp @@ -56610,17 +56818,143 @@ Generated 02/21/2022 03:26:03--> rfb Remote Framebuffer + + 5903 + tcp + ff-ice + Flight & Flow Info for Collaborative Env + + + 5903 + udp + ff-ice + Flight & Flow Info for Collaborative Env + + + 5903 + sctp + ff-ice + Flight & Flow Info for Collaborative Env + + + 5904 + tcp + ag-swim + Air-Ground SWIM + + + 5904 + udp + ag-swim + Air-Ground SWIM + + + 5904 + sctp + ag-swim + Air-Ground SWIM + + + 5905 + tcp + asmgcs + Adv Surface Mvmnt and Guidance Cont Sys + + + 5905 + udp + asmgcs + Adv Surface Mvmnt and Guidance Cont Sys + + + 5905 + sctp + asmgcs + Adv Surface Mvmnt and Guidance Cont Sys + + + 5906 + tcp + rpas-c2 + Remotely Piloted Vehicle C&C + + + 5906 + udp + rpas-c2 + Remotely Piloted Vehicle C&C + + + 5906 + sctp + rpas-c2 + Remotely Piloted Vehicle C&C + + + 5907 + tcp + dsd + Distress and Safety Data App + + + 5907 + udp + dsd + Distress and Safety Data App + + + 5907 + sctp + dsd + Distress and Safety Data App + + + 5908 + tcp + ipsma + IPS Management Application + + + 5908 + udp + ipsma + IPS Management Application + + + 5908 + sctp + ipsma + IPS Management Application + + + 5909 + tcp + agma + Air-ground media advisory + + + 5909 + udp + agma + Air-ground media advisory + + + 5909 + sctp + agma + Air-ground media advisory + 5910 tcp - cm - Context Management + ats-atn + Air Traffic Services applications using ATN 5910 udp - cm - Context Management + ats-atn + Air Traffic Services applications using ATN 5910 @@ -56631,14 +56965,14 @@ Generated 02/21/2022 03:26:03--> 5911 tcp - cpdlc - Controller Pilot Data Link Communication + ats-acars + Air Traffic Services applications using ACARS 5911 udp - cpdlc - Controller Pilot Data Link Communication + ats-acars + Air Traffic Services applications using ACARS 5911 @@ -56649,14 +56983,14 @@ Generated 02/21/2022 03:26:03--> 5912 tcp - fis - Flight Information Services + ais-met + Aeronautical Information Service/Meteorological applications using ACARS 5912 udp - fis - Flight Information Services + ais-met + Aeronautical Information Service/Meteorological applications using ACARS 5912 @@ -56667,14 +57001,14 @@ Generated 02/21/2022 03:26:03--> 5913 tcp - ads-c - Automatic Dependent Surveillance + aoc-acars + Airline operational communications applications using ACARS 5913 udp - ads-c - Automatic Dependent Surveillance + aoc-acars + Airline operational communications applications using ACARS 5913 @@ -56682,6 +57016,24 @@ Generated 02/21/2022 03:26:03--> ads-c Automatic Dependent Surveillance + + 5914 + tcp + ipsdtls + Security for Internet Protocol Suite + + + 5914 + udp + ipsdtls + Security for Internet Protocol Suite + + + 5914 + sctp + ipsdtls + Security for Internet Protocol Suite + 5963 tcp @@ -58638,6 +58990,18 @@ Generated 02/21/2022 03:26:03--> nav-data Navtech Radar Sensor Data + + 6318 + tcp + iona-data + IONA Measurement and control data + + + 6318 + udp + record + Reserved + 6320 tcp @@ -59696,6 +60060,18 @@ Generated 02/21/2022 03:26:03--> record Reserved + + 6610 + tcp + bencher + Bencher API + + + 6610 + udp + bencher + Bencher API + 6619 tcp @@ -60788,6 +61164,18 @@ Generated 02/21/2022 03:26:03--> conductor-mpx conductor for multiplex + + 6980 + tcp + record + Reserved + + + 6980 + udp + qolyester + QoS-extended OLSR protocol + 6997 tcp @@ -62456,6 +62844,18 @@ Generated 02/21/2022 03:26:03--> coherence-disc Oracle Coherence Cluster discovery service + + 7575 + tcp + wtmi-panel + Main access port for WTMI Panel + + + 7575 + udp + record + Reserved + 7588 tcp @@ -62606,6 +63006,18 @@ Generated 02/21/2022 03:26:03--> rome Proprietary immutable distributed data storage + + 7668 + tcp + authoritygate + AuthorityGate Secure API communication for Orchestrated task sequencing + + + 7668 + udp + record + Reserved + 7672 tcp @@ -62681,14 +63093,14 @@ Generated 02/21/2022 03:26:03--> 7680 tcp - pando-pub - Pando Media Public Distribution + ms-do + Microsoft Delivery Optimization Peer-to-Peer 7680 udp - pando-pub - Pando Media Public Distribution + ms-do + Microsoft Delivery Optimization Peer-to-Peer 7683 @@ -62726,6 +63138,18 @@ Generated 02/21/2022 03:26:03--> collaber Collaber Network Service + + 7690 + tcp + sovd + Service-Oriented Vehicle Diagnostics + + + 7690 + udp + record + Reserved + 7697 tcp @@ -63938,6 +64362,18 @@ Generated 02/21/2022 03:26:03--> aero Asymmetric Extended Route Optimization (AERO) + + 8061 + tcp + nikatron-dev + Nikatron Device Protocol + + + 8061 + udp + record + Reserved + 8066 tcp @@ -63989,8 +64425,9 @@ Generated 02/21/2022 03:26:03--> 8077 tcp - mles - Mles is a client-server data distribution protocol targeted to serve as a lightweight and reliable distributed publish/subscribe database service. + + + Reserved 8077 @@ -64697,14 +65134,14 @@ Generated 02/21/2022 03:26:03--> 8276 tcp - pando-sec - Pando Media Controlled Distribution + ms-mcc + Microsoft Connected Cache 8276 udp - pando-sec - Pando Media Controlled Distribution + ms-mcc + Microsoft Connected Cache 8280 @@ -65078,6 +65515,18 @@ Generated 02/21/2022 03:26:03--> record Reserved + + 8433 + tcp + record + Reserved + + + 8433 + udp + aws-as2 + Non Persistent Desktop and Application Streaming + 8442 tcp @@ -65126,6 +65575,18 @@ Generated 02/21/2022 03:26:03--> copy-disc Port for copy discovery + + 8448 + tcp + matrix-fed + Matrix Federation Protocol + + + 8448 + udp + record + Reserved + 8450 tcp @@ -65420,6 +65881,18 @@ Generated 02/21/2022 03:26:03--> record Reserved + + 8668 + tcp + spartan + Spartan management + + + 8668 + udp + record + Reserved + 8675 tcp @@ -66728,6 +67201,18 @@ Generated 02/21/2022 03:26:03--> apani5 apani5 + + 9183 + tcp + sirius-agent + Sirius Configuration Agent + + + 9183 + udp + sirius-agent + Sirius Configuration Agent + 9191 tcp @@ -67244,6 +67729,18 @@ Generated 02/21/2022 03:26:03--> record Reserved + + 9340 + tcp + gribi + gRPC Routing Information Base Interface + + + 9340 + udp + record + Reserved + 9343 tcp @@ -68270,6 +68767,18 @@ Generated 02/21/2022 03:26:03--> record Reserved + + 9986 + tcp + kaostransport + KAOS secure message transport protocol for safety-critical environments + + + 9986 + udp + record + Reserved + 9987 tcp @@ -68957,8 +69466,8 @@ Generated 02/21/2022 03:26:03--> 10321 tcp - cosir - Computer Op System Information Report + record + Reserved 10321 @@ -69114,7 +69623,7 @@ Generated 02/21/2022 03:26:03--> 10809 tcp nbd - Linux Network Block Device + Network Block Device 10809 @@ -69584,6 +70093,18 @@ Generated 02/21/2022 03:26:03--> record Reserved + + 11434 + tcp + ollama + Ollama + + + 11434 + udp + record + Reserved + 11489 tcp @@ -69998,6 +70519,18 @@ Generated 02/21/2022 03:26:03--> italk Italk Chat System + + 12546 + tcp + carb-repl-ctrl + Carbonite Server Replication Control + + + 12546 + udp + record + Reserved + 12753 tcp @@ -70274,6 +70807,18 @@ Generated 02/21/2022 03:26:03--> record Reserved + + 13832 + tcp + a-trust-rpc + Certificate Management and Issuing + + + 13832 + udp + record + Reserved + 13894 tcp @@ -70990,6 +71535,18 @@ Generated 02/21/2022 03:26:03--> + + 17010 + tcp + ncpu + Plan 9 cpu port + + + 17010 + udp + record + Reserved + 17184 tcp @@ -71698,6 +72255,12 @@ Generated 02/21/2022 03:26:03--> dnp-sec Distributed Network Protocol - Secure + + 19999 + sctp + dnp-sec + Distributed Network Protocol - secured + 20000 tcp @@ -71710,6 +72273,12 @@ Generated 02/21/2022 03:26:03--> dnp DNP + + 20000 + sctp + dnp + Distributed Network Protocol + 20001 tcp @@ -72016,6 +72585,18 @@ Generated 02/21/2022 03:26:03--> record Reserved + + 21337 + tcp + xahaud + Xahau P2P network protocol + + + 21337 + udp + record + Reserved + 21553 tcp @@ -72064,6 +72645,12 @@ Generated 02/21/2022 03:26:03--> tvpm TVNC Pro Multiplexing + + 21801 + tcp + sal + Safe AutoLogon + 21845 tcp @@ -72784,6 +73371,18 @@ Generated 02/21/2022 03:26:03--> bilobit-update bilobit Service Update + + 24601 + udp + udpstp + UDP-based IP-Layer Capacity and Performance Measurement protocol + + + 24601 + tcp + record + Reserved + 24666 tcp @@ -73000,6 +73599,18 @@ Generated 02/21/2022 03:26:03--> icl-twobase10 icl-twobase10 + + 25100 + tcp + db2c-tls + IBM Db2 Client Interface - Encrypted + + + 25100 + udp + record + Reserved + 25471 sctp @@ -73258,6 +73869,18 @@ Generated 02/21/2022 03:26:03--> record Reserved + + 27016 + tcp + chlenix + Cloud hosting environment network + + + 27016 + udp + record + Reserved + 27017 tcp @@ -73630,6 +74253,18 @@ Generated 02/21/2022 03:26:03--> record Reserved + + 30939 + tcp + dilithium3 + Persistent peer-to-peer connections for block propagation, transaction relay, and BFT consensus message exchange. + + + 30939 + udp + dilithium3 + Kademlia DHT peer discovery and routing table maintenance. + 30999 tcp @@ -74260,6 +74895,30 @@ Generated 02/21/2022 03:26:03--> profinet-cm PROFInet Context Manager + + 34965 + tcp + profinet-cm-sec + PROFINET secure connection management and key provisioning + + + 34965 + udp + profinet-cm-sec + PROFINET secure connection management and key provisioning + + + 34966 + tcp + record + Reserved + + + 34966 + udp + profinet-rt-sec + PROFINET secure real-time data transfer over UDP (unicast and multicast) + 34980 tcp @@ -75040,6 +75699,18 @@ Generated 02/21/2022 03:26:03--> caerpc CA eTrust RPC + + 42999 + tcp + curiosity + API endpoint for search application + + + 42999 + udp + record + Reserved + 43000 tcp @@ -75187,14 +75858,14 @@ Generated 02/21/2022 03:26:03--> 44322 tcp - pmcdproxy - PCP server (pmcd) proxy + pmproxy + PCP proxy (pmproxy) 44322 udp - pmcdproxy - PCP server (pmcd) proxy + pmproxy + PCP proxy (pmproxy) 44323 @@ -75364,6 +76035,18 @@ Generated 02/21/2022 03:26:03--> invision-ag InVision AG + + 45185 + tcp + witsnet + Wire and Wireless transfer on synchroniz + + + 45185 + udp + witsnet + Wire and Wireless transfer on synchroniz + 45514 tcp diff --git a/Source/NETworkManager.Models/Resources/WhoisServers.xml b/Source/NETworkManager.Models/Resources/WhoisServers.xml index 6b82b04c54..0c85bd0ff4 100644 --- a/Source/NETworkManager.Models/Resources/WhoisServers.xml +++ b/Source/NETworkManager.Models/Resources/WhoisServers.xml @@ -1,32 +1,27 @@  +Generated 07/06/2026 22:48:19--> AAA - - + whois.nic.aaa AARP whois.nic.aarp - - ABARTH - whois.afilias-srs.net - ABB - - + whois.nic.abb ABBOTT - whois.afilias-srs.net + whois.nic.abbott ABBVIE - whois.nic.abbvie + + ABC @@ -51,12 +46,12 @@ Generated 02/21/2022 03:25:53--> ACADEMY - whois.nic.academy + + ACCENTURE - - + whois.nic.accenture ACCOUNTANT @@ -64,7 +59,8 @@ Generated 02/21/2022 03:25:53--> ACCOUNTANTS - whois.nic.accountants + + ACO @@ -72,20 +68,17 @@ Generated 02/21/2022 03:25:53--> ACTOR - whois.nic.actor - - - AD - ADAC - whois.nic.adac + AD + whois.nic.ad ADS - whois.nic.google + + ADULT @@ -126,11 +119,12 @@ Generated 02/21/2022 03:25:53--> AGAKHAN - whois.afilias-srs.net + whois.nic.agakhan AGENCY - whois.nic.agency + + AI @@ -147,7 +141,8 @@ Generated 02/21/2022 03:25:53--> AIRFORCE - whois.nic.airforce + + AIRTEL @@ -155,17 +150,13 @@ Generated 02/21/2022 03:25:53--> AKDN - whois.afilias-srs.net + whois.nic.akdn AL - - ALFAROMEO - whois.afilias-srs.net - ALIBABA whois.nic.alibaba @@ -180,7 +171,7 @@ Generated 02/21/2022 03:25:53--> ALLSTATE - whois.afilias-srs.net + whois.nic.allstate ALLY @@ -200,7 +191,8 @@ Generated 02/21/2022 03:25:53--> AMAZON - whois.nic.amazon + + AMERICANEXPRESS @@ -236,7 +228,8 @@ Generated 02/21/2022 03:25:53--> ANDROID - whois.nic.google + + ANQUAN @@ -257,15 +250,18 @@ Generated 02/21/2022 03:25:53--> APARTMENTS - whois.nic.apartments + + APP - whois.nic.google + + APPLE - whois.afilias-srs.net + + AQ @@ -291,11 +287,13 @@ Generated 02/21/2022 03:25:53--> ARCHI - whois.nic.archi + + ARMY - whois.nic.army + + ARPA @@ -323,7 +321,8 @@ Generated 02/21/2022 03:25:53--> ASSOCIATES - whois.nic.associates + + AT @@ -336,7 +335,8 @@ Generated 02/21/2022 03:25:53--> ATTORNEY - whois.nic.attorney + + AU @@ -344,19 +344,21 @@ Generated 02/21/2022 03:25:53--> AUCTION - whois.nic.auction + + AUDI - whois.afilias-srs.net + whois.nic.audi AUDIBLE - whois.nic.audible + + AUDIO - whois.uniregistry.net + whois.nic.audio AUSPOST @@ -364,7 +366,8 @@ Generated 02/21/2022 03:25:53--> AUTHOR - whois.nic.author + + AUTO @@ -374,17 +377,14 @@ Generated 02/21/2022 03:25:53--> AUTOS whois.nic.autos - - AVIANCA - whois.afilias-srs.net - AW whois.nic.aw AWS - whois.nic.aws + + AX @@ -424,14 +424,10 @@ Generated 02/21/2022 03:25:53--> - BANANAREPUBLIC + BAND - - BAND - whois.nic.band - BANK whois.nic.bank @@ -458,12 +454,12 @@ Generated 02/21/2022 03:25:53--> BARGAINS - whois.nic.bargains + + BASEBALL - - + whois.nic.baseball BASKETBALL @@ -492,7 +488,8 @@ Generated 02/21/2022 03:25:53--> BBVA - whois.nic.bbva + + BCG @@ -513,7 +510,7 @@ Generated 02/21/2022 03:25:53--> BEATS - whois.afilias-srs.net + whois.nic.beats BEAUTY @@ -523,10 +520,6 @@ Generated 02/21/2022 03:25:53--> BEER whois.nic.beer - - BENTLEY - whois.nic.bentley - BERLIN whois.nic.berlin @@ -541,12 +534,12 @@ Generated 02/21/2022 03:25:53--> BET - whois.nic.bet + + BF - - + whois.registre.bf BG @@ -554,13 +547,11 @@ Generated 02/21/2022 03:25:53--> BH - - + whois.nic.bh BHARTI - - + whois.nic.bharti BI @@ -576,7 +567,8 @@ Generated 02/21/2022 03:25:53--> BIKE - whois.nic.bike + + BING @@ -585,11 +577,13 @@ Generated 02/21/2022 03:25:53--> BINGO - whois.nic.bingo + + BIO - whois.nic.bio + + BIZ @@ -601,11 +595,12 @@ Generated 02/21/2022 03:25:53--> BLACK - whois.nic.black + + BLACKFRIDAY - whois.uniregistry.net + whois.nic.blackfriday BLOCKBUSTER @@ -617,17 +612,16 @@ Generated 02/21/2022 03:25:53--> BLOOMBERG - - + whois.nic.bloomberg BLUE - whois.nic.blue + + BM - - + whois.nic.bm BMS @@ -643,7 +637,7 @@ Generated 02/21/2022 03:25:53--> BNPPARIBAS - whois.afilias-srs.net + whois.nic.bnpparibas BO @@ -655,7 +649,7 @@ Generated 02/21/2022 03:25:53--> BOEHRINGER - whois.afilias-srs.net + whois.nic.boehringer BOFA @@ -663,7 +657,8 @@ Generated 02/21/2022 03:25:53--> BOM - whois.gtlds.nic.br + + BOND @@ -671,11 +666,13 @@ Generated 02/21/2022 03:25:53--> BOO - whois.nic.google + + BOOK - whois.nic.book + + BOOKING @@ -696,11 +693,13 @@ Generated 02/21/2022 03:25:53--> BOT - whois.nic.bot + + BOUTIQUE - whois.nic.boutique + + BOX @@ -720,11 +719,13 @@ Generated 02/21/2022 03:25:53--> BROADWAY - whois.nic.broadway + + BROKER - whois.nic.broker + + BROTHER @@ -732,7 +733,8 @@ Generated 02/21/2022 03:25:53--> BRUSSELS - whois.nic.brussels + + BS @@ -744,30 +746,28 @@ Generated 02/21/2022 03:25:53--> - - BUGATTI - whois.afilias-srs.net - BUILD whois.nic.build BUILDERS - whois.nic.builders + + BUSINESS - whois.nic.business + + BUY - whois.nic.buy + + BUZZ - - + whois.nic.buzz BV @@ -797,19 +797,23 @@ Generated 02/21/2022 03:25:53--> CAB - whois.nic.cab + + CAFE - whois.nic.cafe + + CAL - whois.nic.google + + CALL - whois.nic.call + + CALVINKLEIN @@ -822,15 +826,13 @@ Generated 02/21/2022 03:25:53--> CAMERA - whois.nic.camera + + CAMP - whois.nic.camp - - - CANCERRESEARCH - whois.nic.cancerresearch + + CANON @@ -842,7 +844,8 @@ Generated 02/21/2022 03:25:53--> CAPITAL - whois.nic.capital + + CAPITALONE @@ -859,19 +862,23 @@ Generated 02/21/2022 03:25:53--> CARDS - whois.nic.cards + + CARE - whois.nic.care + + CAREER - whois.nic.career + + CAREERS - whois.nic.careers + + CARS @@ -887,11 +894,13 @@ Generated 02/21/2022 03:25:53--> CASH - whois.nic.cash + + CASINO - whois.nic.casino + + CAT @@ -899,7 +908,8 @@ Generated 02/21/2022 03:25:53--> CATERING - whois.nic.catering + + CATHOLIC @@ -919,10 +929,6 @@ Generated 02/21/2022 03:25:53--> - - CBS - whois.afilias-srs.net - CC ccwhois.verisign-grs.com @@ -934,7 +940,8 @@ Generated 02/21/2022 03:25:53--> CENTER - whois.nic.center + + CEO @@ -942,7 +949,7 @@ Generated 02/21/2022 03:25:53--> CERN - whois.afilias-srs.net + whois.nic.cern CF @@ -971,7 +978,8 @@ Generated 02/21/2022 03:25:53--> CHANNEL - whois.nic.google + + CHARITY @@ -984,11 +992,13 @@ Generated 02/21/2022 03:25:53--> CHAT - whois.nic.chat + + CHEAP - whois.nic.cheap + + CHINTAI @@ -996,15 +1006,17 @@ Generated 02/21/2022 03:25:53--> CHRISTMAS - whois.uniregistry.net + whois.nic.christmas CHROME - whois.nic.google + + CHURCH - whois.nic.church + + CI @@ -1012,11 +1024,12 @@ Generated 02/21/2022 03:25:53--> CIPRIANI - whois.afilias-srs.net + whois.nic.cipriani CIRCLE - whois.nic.circle + + CISCO @@ -1025,8 +1038,7 @@ Generated 02/21/2022 03:25:53--> CITADEL - - + whois.nic.citadel CITI @@ -1040,11 +1052,8 @@ Generated 02/21/2022 03:25:53--> CITY - whois.nic.city - - - CITYEATS - whois.nic.cityeats + + CK @@ -1057,19 +1066,22 @@ Generated 02/21/2022 03:25:53--> CLAIMS - whois.nic.claims + + CLEANING - whois.nic.cleaning + + CLICK - whois.uniregistry.net + whois.registry.click CLINIC - whois.nic.clinic + + CLINIQUE @@ -1077,7 +1089,8 @@ Generated 02/21/2022 03:25:53--> CLOTHING - whois.nic.clothing + + CLOUD @@ -1093,8 +1106,7 @@ Generated 02/21/2022 03:25:53--> CM - - + whois.nic.cm CN @@ -1102,19 +1114,22 @@ Generated 02/21/2022 03:25:53--> CO - whois.nic.co + whois.registry.co COACH - whois.nic.coach + + CODES - whois.nic.codes + + COFFEE - whois.nic.coffee + + COLLEGE @@ -1128,21 +1143,19 @@ Generated 02/21/2022 03:25:53--> COM whois.verisign-grs.com - - COMCAST - whois.nic.comcast - COMMBANK whois.nic.commbank COMMUNITY - whois.nic.community + + COMPANY - whois.nic.company + + COMPARE @@ -1150,7 +1163,8 @@ Generated 02/21/2022 03:25:53--> COMPUTER - whois.nic.computer + + COMSEC @@ -1158,35 +1172,37 @@ Generated 02/21/2022 03:25:53--> CONDOS - whois.nic.condos + + CONSTRUCTION - whois.nic.construction + + CONSULTING - whois.nic.consulting + + CONTACT - whois.nic.contact + + CONTRACTORS - whois.nic.contractors + + COOKING whois.nic.cooking - - COOKINGCHANNEL - whois.nic.cookingchannel - COOL - whois.nic.cool + + COOP @@ -1198,16 +1214,16 @@ Generated 02/21/2022 03:25:53--> COUNTRY - whois.uniregistry.net + whois.registry.click COUPON - - + whois.nic.coupon COUPONS - whois.nic.coupons + + COURSES @@ -1223,15 +1239,17 @@ Generated 02/21/2022 03:25:53--> CREDIT - whois.nic.credit + + CREDITCARD - whois.nic.creditcard + + CREDITUNION - whois.afilias-srs.net + whois.nic.creditunion CRICKET @@ -1239,13 +1257,11 @@ Generated 02/21/2022 03:25:53--> CROWN - - + whois.nic.crown CRS - - + whois.nic.crs CRUISE @@ -1253,7 +1269,8 @@ Generated 02/21/2022 03:25:53--> CRUISES - whois.nic.cruises + + CU @@ -1266,8 +1283,7 @@ Generated 02/21/2022 03:25:53--> CV - - + whois.nic.cv CW @@ -1285,7 +1301,8 @@ Generated 02/21/2022 03:25:53--> CYMRU - whois.nic.cymru + + CYOU @@ -1295,17 +1312,15 @@ Generated 02/21/2022 03:25:53--> CZ whois.nic.cz - - DABUR - whois.afilias-srs.net - DAD - whois.nic.google + + DANCE - whois.nic.dance + + DATA @@ -1317,7 +1332,8 @@ Generated 02/21/2022 03:25:53--> DATING - whois.nic.dating + + DATSUN @@ -1325,11 +1341,13 @@ Generated 02/21/2022 03:25:53--> DAY - whois.nic.google + + DCLK - whois.nic.google + + DDS @@ -1341,7 +1359,8 @@ Generated 02/21/2022 03:25:53--> DEAL - whois.nic.deal + + DEALER @@ -1349,15 +1368,18 @@ Generated 02/21/2022 03:25:53--> DEALS - whois.nic.deals + + DEGREE - whois.nic.degree + + DELIVERY - whois.nic.delivery + + DELL @@ -1374,19 +1396,23 @@ Generated 02/21/2022 03:25:53--> DEMOCRAT - whois.nic.democrat + + DENTAL - whois.nic.dental + + DENTIST - whois.nic.dentist + + DESI - whois.nic.desi + + DESIGN @@ -1394,7 +1420,8 @@ Generated 02/21/2022 03:25:53--> DEV - whois.nic.google + + DHL @@ -1403,32 +1430,36 @@ Generated 02/21/2022 03:25:53--> DIAMONDS - whois.nic.diamonds + + DIET - whois.uniregistry.net + whois.nic.diet DIGITAL - whois.nic.digital + + DIRECT - whois.nic.direct + + DIRECTORY - whois.nic.directory + + DISCOUNT - whois.nic.discount + + DISCOVER - - + whois.nic.discover DISH @@ -1436,7 +1467,7 @@ Generated 02/21/2022 03:25:53--> DIY - whois.nic.diy + whois.registry.click DJ @@ -1445,11 +1476,11 @@ Generated 02/21/2022 03:25:53--> DK - whois.dk-hostmaster.dk + whois.punktum.dk DM - whois.nic.dm + whois.dmdomains.dm DNP @@ -1461,19 +1492,23 @@ Generated 02/21/2022 03:25:53--> DOCS - whois.nic.google + + DOCTOR - whois.nic.doctor + + DOG - whois.nic.dog + + DOMAINS - whois.nic.domains + + DOT @@ -1485,7 +1520,8 @@ Generated 02/21/2022 03:25:53--> DRIVE - whois.nic.google + + DTV @@ -1495,10 +1531,6 @@ Generated 02/21/2022 03:25:53--> DUBAI whois.nic.dubai - - DUNLOP - whois.nic.dunlop - DUPONT @@ -1526,7 +1558,8 @@ Generated 02/21/2022 03:25:53--> EAT - whois.nic.google + + EC @@ -1538,7 +1571,7 @@ Generated 02/21/2022 03:25:53--> EDEKA - whois.afilias-srs.net + whois.nic.edeka EDU @@ -1546,7 +1579,8 @@ Generated 02/21/2022 03:25:53--> EDUCATION - whois.nic.education + + EE @@ -1559,27 +1593,32 @@ Generated 02/21/2022 03:25:53--> EMAIL - whois.nic.email + + EMERCK - whois.afilias-srs.net + whois.nic.emerck ENERGY - whois.nic.energy + + ENGINEER - whois.nic.engineer + + ENGINEERING - whois.nic.engineering + + ENTERPRISES - whois.nic.enterprises + + EPSON @@ -1587,7 +1626,8 @@ Generated 02/21/2022 03:25:53--> EQUIPMENT - whois.nic.equipment + + ER @@ -1608,21 +1648,19 @@ Generated 02/21/2022 03:25:53--> ESQ - whois.nic.google + + ESTATE - whois.nic.estate + + ET - - ETISALAT - whois.centralnic.com - EU whois.eu @@ -1637,39 +1675,46 @@ Generated 02/21/2022 03:25:53--> EVENTS - whois.nic.events + + EXCHANGE - whois.nic.exchange + + EXPERT - whois.nic.expert + + EXPOSED - whois.nic.exposed + + EXPRESS - whois.nic.express + + EXTRASPACE - whois.afilias-srs.net + whois.nic.extraspace FAGE - whois.afilias-srs.net + whois.nic.fage FAIL - whois.nic.fail + + FAIRWINDS - whois.nic.fairwinds + + FAITH @@ -1677,11 +1722,13 @@ Generated 02/21/2022 03:25:53--> FAMILY - whois.nic.family + + FAN - whois.nic.fan + + FANS @@ -1689,7 +1736,8 @@ Generated 02/21/2022 03:25:53--> FARM - whois.nic.farm + + FARMERS @@ -1702,7 +1750,8 @@ Generated 02/21/2022 03:25:53--> FAST - whois.nic.fast + + FEDEX @@ -1710,7 +1759,7 @@ Generated 02/21/2022 03:25:53--> FEEDBACK - whois.nic.feedback + whois.registry.click FERRARI @@ -1725,17 +1774,13 @@ Generated 02/21/2022 03:25:53--> FI whois.fi - - FIAT - whois.afilias-srs.net - FIDELITY whois.nic.fidelity FIDO - whois.afilias-srs.net + whois.nic.fido FILM @@ -1743,19 +1788,23 @@ Generated 02/21/2022 03:25:53--> FINAL - whois.gtlds.nic.br + + FINANCE - whois.nic.finance + + FINANCIAL - whois.nic.financial + + FIRE - whois.nic.fire + + FIRESTONE @@ -1767,7 +1816,8 @@ Generated 02/21/2022 03:25:53--> FISH - whois.nic.fish + + FISHING @@ -1779,12 +1829,12 @@ Generated 02/21/2022 03:25:53--> FITNESS - whois.nic.fitness + + FJ - - + www.whois.fj FK @@ -1798,7 +1848,8 @@ Generated 02/21/2022 03:25:53--> FLIGHTS - whois.nic.flights + + FLIR @@ -1807,15 +1858,17 @@ Generated 02/21/2022 03:25:53--> FLORIST - whois.nic.florist + + FLOWERS - whois.uniregistry.net + whois.nic.flowers FLY - whois.nic.google + + FM @@ -1827,20 +1880,17 @@ Generated 02/21/2022 03:25:53--> FOO - whois.nic.google - - - FOOD - FOODNETWORK - whois.nic.foodnetwork + FOOD + whois.registry.click FOOTBALL - whois.nic.football + + FORD @@ -1849,15 +1899,17 @@ Generated 02/21/2022 03:25:53--> FOREX - whois.nic.forex + + FORSALE - whois.nic.forsale + + FORUM - whois.nic.forum + whois.registry.click FOUNDATION @@ -1873,7 +1925,8 @@ Generated 02/21/2022 03:25:53--> FREE - whois.nic.free + + FRESENIUS @@ -1887,10 +1940,6 @@ Generated 02/21/2022 03:25:53--> FROGANS whois.nic.frogans - - FRONTDOOR - whois.nic.frontdoor - FRONTIER @@ -1911,19 +1960,23 @@ Generated 02/21/2022 03:25:53--> FUND - whois.nic.fund + + FURNITURE - whois.nic.furniture + + FUTBOL - whois.nic.futbol + + FYI - whois.nic.fyi + + GA @@ -1936,7 +1989,8 @@ Generated 02/21/2022 03:25:53--> GALLERY - whois.nic.gallery + + GALLO @@ -1948,11 +2002,12 @@ Generated 02/21/2022 03:25:53--> GAME - whois.uniregistry.net + whois.nic.game GAMES - whois.nic.games + + GAP @@ -1974,7 +2029,8 @@ Generated 02/21/2022 03:25:53--> GBIZ - whois.nic.google + + GD @@ -2018,20 +2074,20 @@ Generated 02/21/2022 03:25:53--> GH - - + whois.nic.gh GI - whois2.afilias-grs.net + whois.identitydigital.services GIFT - whois.uniregistry.net + whois.registry.gift GIFTS - whois.nic.gifts + + GIVES @@ -2047,19 +2103,23 @@ Generated 02/21/2022 03:25:53--> GLASS - whois.nic.glass + + GLE - whois.nic.google + + GLOBAL - whois.nic.global + + GLOBO - whois.gtlds.nic.br + + GM @@ -2068,11 +2128,13 @@ Generated 02/21/2022 03:25:53--> GMAIL - whois.nic.google + + GMBH - whois.nic.gmbh + + GMO @@ -2084,16 +2146,16 @@ Generated 02/21/2022 03:25:53--> GN - - + whois.ande.gov.gn GODADDY - whois.afilias-srs.net + whois.nic.godaddy GOLD - whois.nic.gold + + GOLDPOINT @@ -2101,11 +2163,8 @@ Generated 02/21/2022 03:25:53--> GOLF - whois.nic.golf - - - GOO - whois.nic.gmo + + GOODYEAR @@ -2113,11 +2172,13 @@ Generated 02/21/2022 03:25:53--> GOOG - whois.nic.google + + GOOGLE - whois.nic.google + + GOP @@ -2125,11 +2186,12 @@ Generated 02/21/2022 03:25:53--> GOT - whois.nic.got + + GOV - whois.dotgov.gov + whois.nic.gov GP @@ -2151,28 +2213,32 @@ Generated 02/21/2022 03:25:53--> GRAPHICS - whois.nic.graphics + + GRATIS - whois.nic.gratis + + GREEN - whois.nic.green + + GRIPE - whois.nic.gripe + + GROCERY - - + whois.nic.grocery GROUP - whois.nic.group + + GS @@ -2189,29 +2255,28 @@ Generated 02/21/2022 03:25:53--> - GUARDIAN + GUCCI - - GUCCI - whois.nic.gucci - GUGE - whois.nic.google + + GUIDE - whois.nic.guide + + GUITARS - whois.uniregistry.net + whois.nic.guitars GURU - whois.nic.guru + + GW @@ -2232,11 +2297,13 @@ Generated 02/21/2022 03:25:53--> HANGOUT - whois.nic.google + + HAUS - whois.nic.haus + + HBO @@ -2258,11 +2325,12 @@ Generated 02/21/2022 03:25:53--> HEALTHCARE - whois.nic.healthcare + + HELP - whois.uniregistry.net + whois.nic.help HELSINKI @@ -2270,19 +2338,16 @@ Generated 02/21/2022 03:25:53--> HERE - whois.nic.google + + HERMES - whois.afilias-srs.net - - - HGTV - whois.nic.hgtv + whois.nic.hermes HIPHOP - whois.uniregistry.net + whois.nic.hiphop HISAMITSU @@ -2294,7 +2359,7 @@ Generated 02/21/2022 03:25:53--> HIV - whois.uniregistry.net + whois.registry.click HK @@ -2314,15 +2379,18 @@ Generated 02/21/2022 03:25:53--> HOCKEY - whois.nic.hockey + + HOLDINGS - whois.nic.holdings + + HOLIDAY - whois.nic.holiday + + HOMEDEPOT @@ -2352,7 +2420,8 @@ Generated 02/21/2022 03:25:53--> HOSPITAL - whois.nic.hospital + + HOST @@ -2360,21 +2429,16 @@ Generated 02/21/2022 03:25:53--> HOSTING - whois.uniregistry.net + whois.nic.hosting HOT - whois.nic.hot - - - HOTELES HOTELS - - + whois.nic.hotels HOTMAIL @@ -2383,11 +2447,13 @@ Generated 02/21/2022 03:25:53--> HOUSE - whois.nic.house + + HOW - whois.nic.google + + HR @@ -2466,23 +2532,26 @@ Generated 02/21/2022 03:25:53--> IMAMAT - whois.afilias-srs.net + whois.nic.imamat IMDB - whois.nic.imdb + + IMMO - whois.nic.immo + + IMMOBILIEN - whois.nic.immobilien + + IN - whois.registry.in + whois.nixiregistry.in INC @@ -2490,7 +2559,8 @@ Generated 02/21/2022 03:25:53--> INDUSTRIES - whois.nic.industries + + INFINITI @@ -2498,11 +2568,13 @@ Generated 02/21/2022 03:25:53--> INFO - whois.nic.info + + ING - whois.nic.google + + INK @@ -2510,7 +2582,8 @@ Generated 02/21/2022 03:25:53--> INSTITUTE - whois.nic.institute + + INSURANCE @@ -2518,7 +2591,8 @@ Generated 02/21/2022 03:25:53--> INSURE - whois.nic.insure + + INT @@ -2526,7 +2600,8 @@ Generated 02/21/2022 03:25:53--> INTERNATIONAL - whois.nic.international + + INTUIT @@ -2535,7 +2610,8 @@ Generated 02/21/2022 03:25:53--> INVESTMENTS - whois.nic.investments + + IO @@ -2556,7 +2632,8 @@ Generated 02/21/2022 03:25:53--> IRISH - whois.nic.irish + + IS @@ -2564,15 +2641,15 @@ Generated 02/21/2022 03:25:53--> ISMAILI - whois.afilias-srs.net + whois.nic.ismaili IST - whois.afilias-srs.net + whois.nic.ist ISTANBUL - whois.afilias-srs.net + whois.nic.istanbul IT @@ -2585,7 +2662,7 @@ Generated 02/21/2022 03:25:53--> ITV - whois.afilias-srs.net + whois.nic.itv JAGUAR @@ -2605,15 +2682,17 @@ Generated 02/21/2022 03:25:53--> JEEP - whois.afilias-srs.net + whois.nic.jeep JETZT - whois.nic.jetzt + + JEWELRY - whois.nic.jewelry + + JIO @@ -2621,7 +2700,7 @@ Generated 02/21/2022 03:25:53--> JLL - whois.afilias-srs.net + whois.nic.jll JM @@ -2645,7 +2724,8 @@ Generated 02/21/2022 03:25:53--> JOBS - whois.nic.jobs + + JOBURG @@ -2653,11 +2733,13 @@ Generated 02/21/2022 03:25:53--> JOT - whois.nic.jot + + JOY - whois.nic.joy + + JP @@ -2670,12 +2752,12 @@ Generated 02/21/2022 03:25:53--> JPRS - - + whois.nic.jprs JUEGOS - whois.uniregistry.net + + JUNIPER @@ -2683,7 +2765,8 @@ Generated 02/21/2022 03:25:53--> KAUFEN - whois.nic.kaufen + + KDDI @@ -2697,10 +2780,6 @@ Generated 02/21/2022 03:25:53--> KERRYHOTELS whois.nic.kerryhotels - - KERRYLOGISTICS - whois.nic.kerrylogistics - KERRYPROPERTIES whois.nic.kerryproperties @@ -2727,21 +2806,23 @@ Generated 02/21/2022 03:25:53--> whois.nic.kia - KIM - whois.nic.kim + KIDS + whois.nic.kids - KINDER + KIM KINDLE - whois.nic.kindle + + KITCHEN - whois.nic.kitchen + + KIWI @@ -2827,23 +2908,16 @@ Generated 02/21/2022 03:25:53--> LAMBORGHINI - whois.afilias-srs.net + whois.nic.lamborghini LAMER whois.nic.lamer - - LANCASTER - whois.nic.lancaster - - - LANCIA - whois.afilias-srs.net - LAND - whois.nic.land + + LANDROVER @@ -2856,7 +2930,7 @@ Generated 02/21/2022 03:25:53--> LASALLE - whois.afilias-srs.net + whois.nic.lasalle LAT @@ -2876,7 +2950,8 @@ Generated 02/21/2022 03:25:53--> LAWYER - whois.nic.lawyer + + LB @@ -2893,7 +2968,8 @@ Generated 02/21/2022 03:25:53--> LEASE - whois.nic.lease + + LECLERC @@ -2905,7 +2981,8 @@ Generated 02/21/2022 03:25:53--> LEGAL - whois.nic.legal + + LEGO @@ -2917,7 +2994,8 @@ Generated 02/21/2022 03:25:53--> LGBT - whois.nic.lgbt + + LI @@ -2929,24 +3007,26 @@ Generated 02/21/2022 03:25:53--> LIFE - whois.nic.life + + LIFEINSURANCE - - + whois.nic.lifeinsurance LIFESTYLE - whois.nic.lifestyle + whois.registry.click LIGHTING - whois.nic.lighting + + LIKE - whois.nic.like + + LILLY @@ -2955,37 +3035,31 @@ Generated 02/21/2022 03:25:53--> LIMITED - whois.nic.limited + + LIMO - whois.nic.limo + + LINCOLN - - LINDE - whois.nic.linde - LINK whois.uniregistry.net - - LIPSY - whois.nic.lipsy - LIVE - whois.nic.live + + LIVING - - + whois.registry.click LK @@ -2994,11 +3068,12 @@ Generated 02/21/2022 03:25:53--> LLC - whois.nic.llc + + LLP - whois.uniregistry.net + whois.nic.llp LOAN @@ -3006,7 +3081,8 @@ Generated 02/21/2022 03:25:53--> LOANS - whois.nic.loans + + LOCKER @@ -3014,16 +3090,12 @@ Generated 02/21/2022 03:25:53--> LOCUS - whois.nic.locus - - - LOFT LOL - whois.uniregistry.net + whois.nic.lol LONDON @@ -3035,7 +3107,8 @@ Generated 02/21/2022 03:25:53--> LOTTO - whois.nic.lotto + + LOVE @@ -3064,11 +3137,12 @@ Generated 02/21/2022 03:25:53--> LTD - whois.nic.ltd + + LTDA - whois.afilias-srs.net + whois.nic.ltda LU @@ -3098,22 +3172,18 @@ Generated 02/21/2022 03:25:53--> MA whois.registre.ma - - MACYS - whois.nic.macys - MADRID whois.nic.madrid MAIF - - + whois.nic.maif MAISON - whois.nic.maison + + MAKEUP @@ -3125,7 +3195,8 @@ Generated 02/21/2022 03:25:53--> MANAGEMENT - whois.nic.management + + MANGO @@ -3133,33 +3204,33 @@ Generated 02/21/2022 03:25:53--> MAP - whois.nic.google + + MARKET - whois.nic.market + + MARKETING - whois.nic.marketing + + MARKETS - whois.nic.markets + + MARRIOTT - whois.afilias-srs.net + whois.nic.marriott MARSHALLS - - MASERATI - whois.nic.maserati - MATTEL @@ -3167,12 +3238,12 @@ Generated 02/21/2022 03:25:53--> MBA - whois.nic.mba + + MC - - + whois.nic.mc MCKINSEY @@ -3188,15 +3259,18 @@ Generated 02/21/2022 03:25:53--> MED - whois.nic.med + + MEDIA - whois.nic.media + + MEET - whois.nic.google + + MELBOURNE @@ -3204,11 +3278,13 @@ Generated 02/21/2022 03:25:53--> MEME - whois.nic.google + + MEMORIAL - whois.nic.memorial + + MEN @@ -3218,10 +3294,13 @@ Generated 02/21/2022 03:25:53--> MENU whois.nic.menu + + MERCK + whois.nic.merck + MERCKMSD - - + whois.nic.merckmsd MG @@ -3257,7 +3336,7 @@ Generated 02/21/2022 03:25:53--> MIT - whois.afilias-srs.net + whois.nic.mit MITSUBISHI @@ -3269,7 +3348,7 @@ Generated 02/21/2022 03:25:53--> ML - whois.dot.ml + whois.nic.ml MLB @@ -3298,7 +3377,8 @@ Generated 02/21/2022 03:25:53--> MOBI - whois.nic.mobi + + MOBILE @@ -3306,7 +3386,8 @@ Generated 02/21/2022 03:25:53--> MODA - whois.nic.moda + + MOE @@ -3314,11 +3395,12 @@ Generated 02/21/2022 03:25:53--> MOI - whois.nic.moi + + MOM - whois.uniregistry.net + whois.nic.mom MONASH @@ -3326,7 +3408,8 @@ Generated 02/21/2022 03:25:53--> MONEY - whois.nic.money + + MONSTER @@ -3338,7 +3421,8 @@ Generated 02/21/2022 03:25:53--> MORTGAGE - whois.nic.mortgage + + MOSCOW @@ -3346,8 +3430,7 @@ Generated 02/21/2022 03:25:53--> MOTO - - + whois.nic.moto MOTORCYCLES @@ -3355,11 +3438,13 @@ Generated 02/21/2022 03:25:53--> MOV - whois.nic.google + + MOVIE - whois.nic.movie + + MP @@ -3380,8 +3465,7 @@ Generated 02/21/2022 03:25:53--> MSD - - + whois.nic.msd MT @@ -3390,7 +3474,8 @@ Generated 02/21/2022 03:25:53--> MTN - whois.nic.mtn + + MTR @@ -3398,7 +3483,7 @@ Generated 02/21/2022 03:25:53--> MU - whois.nic.mu + whois.tld.mu MUSEUM @@ -3406,13 +3491,7 @@ Generated 02/21/2022 03:25:53--> MUSIC - - - - - MUTUAL - - + whois.registryservices.music MV @@ -3437,7 +3516,8 @@ Generated 02/21/2022 03:25:53--> NA - whois.na-nic.com.na + + NAB @@ -3451,13 +3531,10 @@ Generated 02/21/2022 03:25:53--> NAME whois.nic.name - - NATURA - whois.gtlds.nic.br - NAVY - whois.nic.navy + + NBA @@ -3492,7 +3569,8 @@ Generated 02/21/2022 03:25:53--> NETWORK - whois.nic.network + + NEUSTAR @@ -3501,11 +3579,13 @@ Generated 02/21/2022 03:25:53--> NEW - whois.nic.google + + NEWS - whois.nic.news + + NEXT @@ -3517,7 +3597,8 @@ Generated 02/21/2022 03:25:53--> NEXUS - whois.nic.google + + NF @@ -3534,7 +3615,7 @@ Generated 02/21/2022 03:25:53--> NGO - whois.publicinterestregistry.net + whois.nic.ngo NHK @@ -3560,7 +3641,8 @@ Generated 02/21/2022 03:25:53--> NINJA - whois.nic.ninja + + NISSAN @@ -3580,12 +3662,7 @@ Generated 02/21/2022 03:25:53--> NOKIA - whois.afilias-srs.net - - - NORTHWESTERNMUTUAL - - + whois.nic.nokia NORTON @@ -3593,11 +3670,13 @@ Generated 02/21/2022 03:25:53--> NOW - whois.nic.now + + NOWRUZ - whois.nic.nowruz + + NOWTV @@ -3615,7 +3694,7 @@ Generated 02/21/2022 03:25:53--> NRA - whois.afilias-srs.net + whois.nic.nra NRW @@ -3623,8 +3702,7 @@ Generated 02/21/2022 03:25:53--> NTT - - + whois.nic.ntt NU @@ -3632,12 +3710,11 @@ Generated 02/21/2022 03:25:53--> NYC - - + whois.nic.nyc NZ - whois.srs.net.nz + whois.irs.net.nz OBI @@ -3664,11 +3741,6 @@ Generated 02/21/2022 03:25:53--> OLAYANGROUP whois.nic.olayangroup - - OLDNAVY - - - OLLO whois.nic.ollo @@ -3679,7 +3751,8 @@ Generated 02/21/2022 03:25:53--> OMEGA - whois.nic.omega + + ONE @@ -3687,11 +3760,12 @@ Generated 02/21/2022 03:25:53--> ONG - whois.publicinterestregistry.net + whois.nic.ong ONL - whois.afilias-srs.net + + ONLINE @@ -3703,8 +3777,7 @@ Generated 02/21/2022 03:25:53--> OPEN - - + whois.nic.open ORACLE @@ -3716,11 +3789,12 @@ Generated 02/21/2022 03:25:53--> ORG - whois.pir.org + whois.publicinterestregistry.org ORGANIC - whois.nic.organic + + ORIGINS @@ -3749,7 +3823,8 @@ Generated 02/21/2022 03:25:53--> PAGE - whois.nic.google + + PANASONIC @@ -3761,29 +3836,28 @@ Generated 02/21/2022 03:25:53--> PARS - whois.nic.pars + + PARTNERS - whois.nic.partners + + PARTS - whois.nic.parts + + PARTY whois.nic.party - PASSAGENS + PAY - - PAY - whois.nic.pay - PCCW whois.nic.pccw @@ -3794,7 +3868,8 @@ Generated 02/21/2022 03:25:53--> PET - whois.nic.pet + + PF @@ -3807,8 +3882,7 @@ Generated 02/21/2022 03:25:53--> PG - - + whois.nic.pg PH @@ -3817,11 +3891,13 @@ Generated 02/21/2022 03:25:53--> PHARMACY - whois.nic.pharmacy + + PHD - whois.nic.google + + PHILIPS @@ -3833,15 +3909,17 @@ Generated 02/21/2022 03:25:53--> PHOTO - whois.uniregistry.net + whois.nic.photo PHOTOGRAPHY - whois.nic.photography + + PHOTOS - whois.nic.photos + + PHYSIO @@ -3849,46 +3927,48 @@ Generated 02/21/2022 03:25:53--> PICS - whois.uniregistry.net + whois.nic.pics PICTET - - + whois.nic.pictet PICTURES - whois.nic.pictures + + PID - whois.nic.pid + whois.registry.click PIN - whois.nic.pin + + PING - - + whois.nic.ping PINK - whois.nic.pink + + PIONEER - whois.nic.gmo + + PIZZA - whois.nic.pizza + + PK - - + whois.pknic.net.pk PL @@ -3896,11 +3976,13 @@ Generated 02/21/2022 03:25:53--> PLACE - whois.nic.place + + PLAY - whois.nic.google + + PLAYSTATION @@ -3908,11 +3990,13 @@ Generated 02/21/2022 03:25:53--> PLUMBING - whois.nic.plumbing + + PLUS - whois.nic.plus + + PM @@ -3933,7 +4017,8 @@ Generated 02/21/2022 03:25:53--> POKER - whois.nic.poker + + POLITIE @@ -3945,17 +4030,12 @@ Generated 02/21/2022 03:25:53--> POST - whois.dotpostregistry.net + whois.nic.post PR whois.afilias-srs.net - - PRAMERICA - - - PRAXI @@ -3967,39 +4047,46 @@ Generated 02/21/2022 03:25:53--> PRIME - whois.nic.prime + + PRO - whois.nic.pro + + PROD - whois.nic.google + + PRODUCTIONS - whois.nic.productions + + PROF - whois.nic.google + + PROGRESSIVE - whois.afilias-srs.net + whois.nic.progressive PROMO - whois.nic.promo + + PROPERTIES - whois.nic.properties + + PROPERTY - whois.uniregistry.net + whois.registry.click PROTECTION @@ -4026,7 +4113,8 @@ Generated 02/21/2022 03:25:53--> PUB - whois.nic.pub + + PW @@ -4034,7 +4122,7 @@ Generated 02/21/2022 03:25:53--> PWC - whois.afilias-srs.net + whois.nic.pwc PY @@ -4071,11 +4159,13 @@ Generated 02/21/2022 03:25:53--> READ - whois.nic.read + + REALESTATE - whois.nic.realestate + + REALTOR @@ -4088,31 +4178,32 @@ Generated 02/21/2022 03:25:53--> RECIPES - whois.nic.recipes + + RED - whois.nic.red - - - REDSTONE - whois.nic.redstone + + REDUMBRELLA - whois.afilias-srs.net + whois.nic.redumbrella REHAB - whois.nic.rehab + + REISE - whois.nic.reise + + REISEN - whois.nic.reisen + + REIT @@ -4132,19 +4223,23 @@ Generated 02/21/2022 03:25:53--> RENTALS - whois.nic.rentals + + REPAIR - whois.nic.repair + + REPORT - whois.nic.report + + REPUBLICAN - whois.nic.republican + + REST @@ -4152,7 +4247,8 @@ Generated 02/21/2022 03:25:53--> RESTAURANT - whois.nic.restaurant + + REVIEW @@ -4160,7 +4256,8 @@ Generated 02/21/2022 03:25:53--> REVIEWS - whois.nic.reviews + + REXROTH @@ -4168,7 +4265,7 @@ Generated 02/21/2022 03:25:53--> RICH - whois.afilias-srs.net + whois.nic.rich RICHARDLI @@ -4184,36 +4281,35 @@ Generated 02/21/2022 03:25:53--> RIO - whois.gtlds.nic.br + + RIP - whois.nic.rip + + RO whois.rotld.ro - ROCHER + ROCKS - - ROCKS - whois.nic.rocks - RODEO whois.nic.rodeo ROGERS - whois.afilias-srs.net + whois.nic.rogers ROOM - whois.nic.room + + RS @@ -4221,7 +4317,8 @@ Generated 02/21/2022 03:25:53--> RSVP - whois.nic.google + + RU @@ -4237,12 +4334,12 @@ Generated 02/21/2022 03:25:53--> RUN - whois.nic.run + + RW - - + whois.ricta.org.rw RWE @@ -4262,7 +4359,8 @@ Generated 02/21/2022 03:25:53--> SAFE - whois.nic.safe + + SAFETY @@ -4270,16 +4368,17 @@ Generated 02/21/2022 03:25:53--> SAKURA - - + whois.nic.sakura SALE - whois.nic.sale + + SALON - whois.nic.salon + + SAMSCLUB @@ -4307,7 +4406,8 @@ Generated 02/21/2022 03:25:53--> SARL - whois.nic.sarl + + SAS @@ -4316,7 +4416,8 @@ Generated 02/21/2022 03:25:53--> SAVE - whois.nic.save + + SAXO @@ -4336,11 +4437,7 @@ Generated 02/21/2022 03:25:53--> SC - whois2.afilias-grs.net - - - SCA - whois.nic.sca + whois.nic.sc SCB @@ -4360,11 +4457,13 @@ Generated 02/21/2022 03:25:53--> SCHOOL - whois.nic.school + + SCHULE - whois.nic.schule + + SCHWARZ @@ -4380,8 +4479,7 @@ Generated 02/21/2022 03:25:53--> SD - - + whois.nic.sd SE @@ -4389,7 +4487,8 @@ Generated 02/21/2022 03:25:53--> SEARCH - whois.nic.google + + SEAT @@ -4397,7 +4496,8 @@ Generated 02/21/2022 03:25:53--> SECURE - whois.nic.secure + + SECURITY @@ -4413,16 +4513,12 @@ Generated 02/21/2022 03:25:53--> SENER - - + whois.nic.rwe SERVICES - whois.nic.services - - - SES - whois.nic.ses + + SEVEN @@ -4430,7 +4526,7 @@ Generated 02/21/2022 03:25:53--> SEW - whois.afilias-srs.net + whois.nic.sew SEX @@ -4438,7 +4534,7 @@ Generated 02/21/2022 03:25:53--> SEXY - whois.uniregistry.net + whois.registry.click SFR @@ -4460,25 +4556,25 @@ Generated 02/21/2022 03:25:53--> SHARP whois.nic.gmo - - SHAW - whois.afilias-srs.net - SHELL - whois.nic.shell + + SHIA - whois.nic.shia + + SHIKSHA - whois.nic.shiksha + + SHOES - whois.nic.shoes + + SHOP @@ -4486,7 +4582,8 @@ Generated 02/21/2022 03:25:53--> SHOPPING - whois.nic.shopping + + SHOUJI @@ -4494,11 +4591,8 @@ Generated 02/21/2022 03:25:53--> SHOW - whois.nic.show - - - SHOWTIME - whois.afilias-srs.net + + SI @@ -4506,7 +4600,8 @@ Generated 02/21/2022 03:25:53--> SILK - whois.nic.silk + + SINA @@ -4514,7 +4609,8 @@ Generated 02/21/2022 03:25:53--> SINGLES - whois.nic.singles + + SITE @@ -4531,7 +4627,8 @@ Generated 02/21/2022 03:25:53--> SKI - whois.nic.ski + + SKIN @@ -4539,7 +4636,8 @@ Generated 02/21/2022 03:25:53--> SKY - whois.nic.sky + + SKYPE @@ -4565,7 +4663,8 @@ Generated 02/21/2022 03:25:53--> SMILE - whois.nic.smile + + SN @@ -4581,11 +4680,13 @@ Generated 02/21/2022 03:25:53--> SOCCER - whois.nic.soccer + + SOCIAL - whois.nic.social + + SOFTBANK @@ -4593,7 +4694,8 @@ Generated 02/21/2022 03:25:53--> SOFTWARE - whois.nic.software + + SOHU @@ -4602,16 +4704,17 @@ Generated 02/21/2022 03:25:53--> SOLAR - whois.nic.solar + + SOLUTIONS - whois.nic.solutions + + SONG - - + whois.nic.song SONY @@ -4619,11 +4722,12 @@ Generated 02/21/2022 03:25:53--> SOY - whois.nic.google + + SPA - whois.afilias-srs.net + whois.nic.spa SPACE @@ -4635,16 +4739,16 @@ Generated 02/21/2022 03:25:53--> SPOT - whois.nic.spot + + SR - - + whois.sr SRL - whois.afilias-srs.net + whois.nic.srl SS @@ -4656,7 +4760,7 @@ Generated 02/21/2022 03:25:53--> STADA - whois.afilias-srs.net + whois.nic.stada STAPLES @@ -4686,7 +4790,7 @@ Generated 02/21/2022 03:25:53--> STOCKHOLM - whois.afilias-srs.net + whois.nic.stockholm STORAGE @@ -4702,7 +4806,8 @@ Generated 02/21/2022 03:25:53--> STUDIO - whois.nic.studio + + STUDY @@ -4710,7 +4815,8 @@ Generated 02/21/2022 03:25:53--> STYLE - whois.nic.style + + SU @@ -4722,15 +4828,18 @@ Generated 02/21/2022 03:25:53--> SUPPLIES - whois.nic.supplies + + SUPPLY - whois.nic.supply + + SUPPORT - whois.nic.support + + SURF @@ -4738,7 +4847,8 @@ Generated 02/21/2022 03:25:53--> SURGERY - whois.nic.surgery + + SUZUKI @@ -4751,7 +4861,8 @@ Generated 02/21/2022 03:25:53--> SWATCH - whois.nic.swatch + + SWISS @@ -4771,7 +4882,8 @@ Generated 02/21/2022 03:25:53--> SYSTEMS - whois.nic.systems + + SZ @@ -4788,12 +4900,12 @@ Generated 02/21/2022 03:25:53--> TALK - whois.nic.talk + + TAOBAO - - + whois.nic.taobao TARGET @@ -4810,15 +4922,17 @@ Generated 02/21/2022 03:25:53--> TATTOO - whois.uniregistry.net + whois.nic.tattoo TAX - whois.nic.tax + + TAXI - whois.nic.taxi + + TC @@ -4826,7 +4940,8 @@ Generated 02/21/2022 03:25:53--> TCI - whois.nic.tci + + TD @@ -4838,7 +4953,8 @@ Generated 02/21/2022 03:25:53--> TEAM - whois.nic.team + + TECH @@ -4846,7 +4962,8 @@ Generated 02/21/2022 03:25:53--> TECHNOLOGY - whois.nic.technology + + TEL @@ -4854,11 +4971,12 @@ Generated 02/21/2022 03:25:53--> TEMASEK - whois.afilias-srs.net + whois.nic.temasek TENNIS - whois.nic.tennis + + TEVA @@ -4882,7 +5000,8 @@ Generated 02/21/2022 03:25:53--> THEATER - whois.nic.theater + + THEATRE @@ -4898,19 +5017,18 @@ Generated 02/21/2022 03:25:53--> TIENDA - whois.nic.tienda - - - TIFFANY - whois.nic.tiffany + + TIPS - whois.nic.tips + + TIRES - whois.nic.tires + + TIROL @@ -4950,8 +5068,7 @@ Generated 02/21/2022 03:25:53--> TMALL - - + whois.nic.tmall TN @@ -4959,11 +5076,12 @@ Generated 02/21/2022 03:25:53--> TO - whois.tonic.to + whois.tonicregistry.to TODAY - whois.nic.today + + TOKYO @@ -4971,7 +5089,8 @@ Generated 02/21/2022 03:25:53--> TOOLS - whois.nic.tools + + TOP @@ -4991,11 +5110,13 @@ Generated 02/21/2022 03:25:53--> TOURS - whois.nic.tours + + TOWN - whois.nic.town + + TOYOTA @@ -5003,11 +5124,12 @@ Generated 02/21/2022 03:25:53--> TOYS - whois.nic.toys + + TR - whois.nic.tr + whois.trabis.gov.tr TRADE @@ -5015,35 +5137,34 @@ Generated 02/21/2022 03:25:53--> TRADING - whois.nic.trading + + TRAINING - whois.nic.training + + TRAVEL - whois.nic.travel - - - TRAVELCHANNEL - whois.nic.travelchannel + + TRAVELERS - whois.afilias-srs.net + whois.nic.travelers TRAVELERSINSURANCE - whois.afilias-srs.net + whois.nic.travelersinsurance TRUST - whois.nic.trust + whois.registry.click TRV - whois.afilias-srs.net + whois.nic.trv TT @@ -5052,8 +5173,7 @@ Generated 02/21/2022 03:25:53--> TUBE - - + whois.nic.tube TUI @@ -5061,15 +5181,17 @@ Generated 02/21/2022 03:25:53--> TUNES - whois.nic.tunes + + TUSHU - whois.nic.tushu + + TV - tvwhois.verisign-grs.com + whois.nic.tv TVS @@ -5109,7 +5231,8 @@ Generated 02/21/2022 03:25:53--> UNIVERSITY - whois.nic.university + + UNO @@ -5117,7 +5240,8 @@ Generated 02/21/2022 03:25:53--> UOL - whois.gtlds.nic.br + + UPS @@ -5142,11 +5266,12 @@ Generated 02/21/2022 03:25:53--> VACATIONS - whois.nic.vacations + + VANA - whois.nic.vana + whois.registry.click VANGUARD @@ -5154,7 +5279,7 @@ Generated 02/21/2022 03:25:53--> VC - whois2.afilias-grs.net + whois.identitydigital.services VE @@ -5162,11 +5287,12 @@ Generated 02/21/2022 03:25:53--> VEGAS - whois.afilias-srs.net + whois.nic.vegas VENTURES - whois.nic.ventures + + VERISIGN @@ -5178,7 +5304,8 @@ Generated 02/21/2022 03:25:53--> VET - whois.nic.vet + + VG @@ -5186,32 +5313,35 @@ Generated 02/21/2022 03:25:53--> VI - - + virgil.nic.vi VIAJES - whois.nic.viajes + + VIDEO - whois.nic.video + + VIG - whois.afilias-srs.net + whois.nic.vig VIKING - whois.afilias-srs.net + whois.nic.viking VILLAS - whois.nic.villas + + VIN - whois.nic.vin + + VIP @@ -5219,7 +5349,8 @@ Generated 02/21/2022 03:25:53--> VIRGIN - whois.nic.virgin + + VISA @@ -5227,7 +5358,8 @@ Generated 02/21/2022 03:25:53--> VISION - whois.nic.vision + + VIVA @@ -5240,7 +5372,8 @@ Generated 02/21/2022 03:25:53--> VLAANDEREN - whois.nic.vlaanderen + + VN @@ -5251,17 +5384,14 @@ Generated 02/21/2022 03:25:53--> VODKA whois.nic.vodka - - VOLKSWAGEN - whois.afilias-srs.net - VOLVO whois.nic.volvo VOTE - whois.nic.vote + + VOTING @@ -5269,25 +5399,23 @@ Generated 02/21/2022 03:25:53--> VOTO - whois.nic.voto + + VOYAGE - whois.nic.voyage + + VU whois.dnrs.vu - VUELOS + WALES - - WALES - whois.nic.wales - WALMART whois.nic.walmart @@ -5298,19 +5426,22 @@ Generated 02/21/2022 03:25:53--> WANG - whois.gtld.knet.cn + whois.gtld.zdns.cn WANGGOU - whois.nic.wanggou + + WATCH - whois.nic.watch + + WATCHES - whois.nic.watches + + WEATHER @@ -5336,7 +5467,8 @@ Generated 02/21/2022 03:25:53--> WED - whois.nic.wed + + WEDDING @@ -5348,8 +5480,7 @@ Generated 02/21/2022 03:25:53--> WEIR - - + whois.nic.weir WF @@ -5383,7 +5514,8 @@ Generated 02/21/2022 03:25:53--> WINE - whois.nic.wine + + WINNERS @@ -5394,10 +5526,6 @@ Generated 02/21/2022 03:25:53--> WME whois.nic.wme - - WOLTERSKLUWER - whois.nic.wolterskluwer - WOODSIDE whois.nic.woodside @@ -5408,15 +5536,18 @@ Generated 02/21/2022 03:25:53--> WORKS - whois.nic.works + + WORLD - whois.nic.world + + WOW - whois.nic.wow + + WS @@ -5428,7 +5559,8 @@ Generated 02/21/2022 03:25:53--> WTF - whois.nic.wtf + + XBOX @@ -5439,10 +5571,6 @@ Generated 02/21/2022 03:25:53--> XEROX whois.nic.xerox - - XFINITY - whois.nic.xfinity - XIHUAN whois.teleinfo.cn @@ -5457,8 +5585,7 @@ Generated 02/21/2022 03:25:53--> XN--1CK2E1B - - + whois.nic.xn--1ck2e1b XN--1QQW23A @@ -5466,15 +5593,15 @@ Generated 02/21/2022 03:25:53--> XN--2SCRJ9C - whois.registry.in + whois.nixiregistry.in XN--30RR7Y - whois.gtld.knet.cn + whois.gtld.zdns.cn XN--3BST00M - whois.gtld.knet.cn + whois.gtld.zdns.cn XN--3DS443G @@ -5486,7 +5613,7 @@ Generated 02/21/2022 03:25:53--> XN--3HCRJ9C - whois.registry.in + whois.nixiregistry.in XN--3PXU8K @@ -5498,15 +5625,15 @@ Generated 02/21/2022 03:25:53--> XN--45BR5CYL - whois.registry.in + whois.nixiregistry.in XN--45BRJ9C - whois.registry.in + whois.nixiregistry.in XN--45Q11C - whois.gtld.knet.cn + whois.gtld.zdns.cn XN--4DBRK0CE @@ -5514,7 +5641,7 @@ Generated 02/21/2022 03:25:53--> XN--4GBRIM - whois.afilias-srs.net + whois.nic.xn--4gbrim XN--54B7FTA0CC @@ -5523,7 +5650,7 @@ Generated 02/21/2022 03:25:53--> XN--55QW42G - whois.conac.cn + whois.nic.xn--55qw42g XN--55QX5D @@ -5539,11 +5666,12 @@ Generated 02/21/2022 03:25:53--> XN--6FRZ82G - whois.nic.xn--6frz82g + + XN--6QQ986B3XL - whois.gtld.knet.cn + whois.gtld.zdns.cn XN--80ADXHKS @@ -5587,7 +5715,7 @@ Generated 02/21/2022 03:25:53--> XN--9ET52U - whois.gtld.knet.cn + whois.gtld.zdns.cn XN--9KRT00A @@ -5595,16 +5723,15 @@ Generated 02/21/2022 03:25:53--> XN--B4W605FERD - whois.afilias-srs.net + whois.nic.xn--b4w605ferd XN--BCK1B9A5DRE4C - - + whois.nic.xn--bck1b9a5dre4c XN--C1AVG - whois.publicinterestregistry.net + whois.nic.xn--c1avg XN--C2BR7G @@ -5612,12 +5739,12 @@ Generated 02/21/2022 03:25:53--> XN--CCK2B3B - - + whois.nic.xn--cck2b3b XN--CCKWCXETD - whois.nic.xn--cckwcxetd + + XN--CG4BKI @@ -5625,7 +5752,7 @@ Generated 02/21/2022 03:25:53--> XN--CLCHC0EA0B2G2A9GCD - whois.sgnic.sg + whois.ta.sgnic.sg XN--CZR694B @@ -5634,11 +5761,12 @@ Generated 02/21/2022 03:25:53--> XN--CZRS0T - whois.nic.xn--czrs0t + + XN--CZRU2D - whois.gtld.knet.cn + whois.gtld.zdns.cn XN--D1ACJ3B @@ -5654,17 +5782,15 @@ Generated 02/21/2022 03:25:53--> XN--ECKVDTC9D - - + whois.nic.xn--eckvdtc9d XN--EFVY88H - whois.nic.xn--efvy88h + whois.gtld.zdns.cn XN--FCT429K - - + whois.nic.xn--fct429k XN--FHBEI @@ -5676,27 +5802,29 @@ Generated 02/21/2022 03:25:53--> XN--FIQ64B - whois.gtld.knet.cn + whois.gtld.zdns.cn XN--FIQS8S - cwhois.cnnic.cn + whois.cnnic.cn XN--FIQZ9S - cwhois.cnnic.cn + whois.cnnic.cn XN--FJQ720A - whois.nic.xn--fjq720a + + XN--FLW351E - whois.nic.google + + XN--FPCRJ9C3D - whois.registry.in + whois.nixiregistry.in XN--FZC2C9E2C @@ -5709,42 +5837,39 @@ Generated 02/21/2022 03:25:53--> XN--G2XX48C - - + whois.nic.xn--g2xx48c XN--GCKR3F0F - - + whois.nic.xn--gckr3f0f XN--GECRJ9C - whois.registry.in + whois.nixiregistry.in XN--GK3AT1E - - + whois.nic.xn--gk3at1e XN--H2BREG3EVE - whois.registry.in + whois.nixiregistry.in XN--H2BRJ9C - whois.registry.in + whois.nixiregistry.in XN--H2BRJ9C8C - whois.registry.in + whois.nixiregistry.in XN--HXT814E - whois.gtld.knet.cn + whois.gtld.zdns.cn XN--I1B6B1A6A2E - whois.publicinterestregistry.net + whois.nic.xn--i1b6b1a6a2e XN--IMR513N @@ -5769,16 +5894,12 @@ Generated 02/21/2022 03:25:53--> XN--JLQ480N2RG - whois.nic.xn--jlq480n2rg - - - XN--JLQ61U9W7B - whois.nic.xn--jlq61u9w7b + + XN--JVR189M - - + whois.nic.xn--jvr189m XN--KCRX77D1X4A @@ -5798,8 +5919,7 @@ Generated 02/21/2022 03:25:53--> XN--L1ACC - - + whois.mn XN--LGBBAT1AD8J @@ -5822,10 +5942,6 @@ Generated 02/21/2022 03:25:53--> XN--MGBA7C0BBN0A whois.nic.xn--mgba7c0bbn0a - - XN--MGBAAKC7DVF - whois.centralnic.com - XN--MGBAAM7A8H whois.aeda.net.ae @@ -5850,11 +5966,11 @@ Generated 02/21/2022 03:25:53--> XN--MGBBH1A - whois.registry.in + whois.nixiregistry.in XN--MGBBH1A71E - whois.registry.in + whois.nixiregistry.in XN--MGBC0A9AZCG @@ -5876,7 +5992,7 @@ Generated 02/21/2022 03:25:53--> XN--MGBGU82A - whois.registry.in + whois.nixiregistry.in XN--MGBI4ECEXP @@ -5889,7 +6005,8 @@ Generated 02/21/2022 03:25:53--> XN--MGBT3DHD - whois.nic.xn--mgbt3dhd + + XN--MGBTX2B @@ -5925,11 +6042,12 @@ Generated 02/21/2022 03:25:53--> XN--NODE - whois.itdc.ge + + XN--NQV7F - whois.publicinterestregistry.net + whois.nic.xn--nqv7f XN--NQV7FS00EMA @@ -5955,7 +6073,8 @@ Generated 02/21/2022 03:25:53--> XN--P1ACF - whois.nic.xn--p1acf + + XN--P1AI @@ -5975,11 +6094,13 @@ Generated 02/21/2022 03:25:53--> XN--Q9JYB4C - whois.nic.google + + XN--QCKA1PMC - whois.nic.google + + XN--QXA6A @@ -5997,16 +6118,15 @@ Generated 02/21/2022 03:25:53--> XN--ROVU88B - - + whois.nic.xn--rovu88b XN--RVC1E0AM3E - whois.registry.in + whois.nixiregistry.in XN--S9BRJ9C - whois.registry.in + whois.nixiregistry.in XN--SES554G @@ -6026,7 +6146,8 @@ Generated 02/21/2022 03:25:53--> XN--UNUP4Y - whois.nic.xn--unup4y + + XN--VERMGENSBERATER-CTB @@ -6038,7 +6159,8 @@ Generated 02/21/2022 03:25:53--> XN--VHQUV - whois.nic.xn--vhquv + + XN--VUQ861B @@ -6072,7 +6194,7 @@ Generated 02/21/2022 03:25:53--> XN--XKC2DL3A5EE0H - whois.registry.in + whois.nixiregistry.in XN--Y9A3AQ @@ -6080,7 +6202,7 @@ Generated 02/21/2022 03:25:53--> XN--YFRO4I67O - whois.sgnic.sg + whois.zh.sgnic.sg XN--YGBI2AMMX @@ -6088,7 +6210,7 @@ Generated 02/21/2022 03:25:53--> XN--ZFR164B - whois.conac.cn + whois.nic.xn--zfr164b XXX @@ -6104,22 +6226,20 @@ Generated 02/21/2022 03:25:53--> YAHOO - - + whois.nic.yahoo YAMAXUN - whois.nic.yamaxun + + YANDEX - - + whois.nic.yandex YE - - + whois.y.net.ye YODOBASHI @@ -6135,11 +6255,13 @@ Generated 02/21/2022 03:25:53--> YOU - whois.nic.you + + YOUTUBE - whois.nic.google + + YT @@ -6156,20 +6278,21 @@ Generated 02/21/2022 03:25:53--> ZAPPOS - whois.nic.zappos + + ZARA - whois.afilias-srs.net + whois.nic.zara ZERO - - + whois.nic.zero ZIP - whois.nic.google + + ZM @@ -6177,7 +6300,8 @@ Generated 02/21/2022 03:25:53--> ZONE - whois.nic.zone + + ZUERICH @@ -6188,10 +6312,4 @@ Generated 02/21/2022 03:25:53--> - - - - - - \ No newline at end of file diff --git a/Source/NETworkManager.Models/TigerVNC/TigerVNC.cs b/Source/NETworkManager.Models/TigerVNC/TigerVNC.cs index 80bdca69f9..9babf44269 100644 --- a/Source/NETworkManager.Models/TigerVNC/TigerVNC.cs +++ b/Source/NETworkManager.Models/TigerVNC/TigerVNC.cs @@ -1,10 +1,9 @@ -namespace NETworkManager.Models.TigerVNC +namespace NETworkManager.Models.TigerVNC; + +public static class TigerVNC { - public static class TigerVNC + public static string BuildCommandLine(TigerVNCSessionInfo sessionInfo) { - public static string BuildCommandLine(TigerVNCSessionInfo sessionInfo) - { - return $"{sessionInfo.Host}::{sessionInfo.Port}"; - } + return $"{sessionInfo.Host}::{sessionInfo.Port}"; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/TigerVNC/TigerVNCSessionInfo.cs b/Source/NETworkManager.Models/TigerVNC/TigerVNCSessionInfo.cs index 88a02c5f41..dd9d0b7c9d 100644 --- a/Source/NETworkManager.Models/TigerVNC/TigerVNCSessionInfo.cs +++ b/Source/NETworkManager.Models/TigerVNC/TigerVNCSessionInfo.cs @@ -1,14 +1,29 @@ -namespace NETworkManager.Models.TigerVNC +namespace NETworkManager.Models.TigerVNC; + +/// +/// Class contains information's about a TigerVNC session. +/// +public class TigerVNCSessionInfo { - public class TigerVNCSessionInfo + /// + /// Creates a new instance of the class. + /// + public TigerVNCSessionInfo() { - public string ApplicationFilePath { get; set; } - public string Host { get; set; } - public int Port { get; set; } - - public TigerVNCSessionInfo() - { - - } } -} + + /// + /// Path to the TigerVNC executable. + /// + public string ApplicationFilePath { get; set; } + + /// + /// Hostname or IP address to connect to. + /// + public string Host { get; set; } + + /// + /// Port used for the connection. + /// + public int Port { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/WebConsole/WebConsoleSessionInfo.cs b/Source/NETworkManager.Models/WebConsole/WebConsoleSessionInfo.cs index 6ca356863d..80d5bf97f5 100644 --- a/Source/NETworkManager.Models/WebConsole/WebConsoleSessionInfo.cs +++ b/Source/NETworkManager.Models/WebConsole/WebConsoleSessionInfo.cs @@ -1,12 +1,19 @@ -namespace NETworkManager.Models.WebConsole +namespace NETworkManager.Models.WebConsole; + +/// +/// Class contains information's about a WebConsole session. +/// +public class WebConsoleSessionInfo { - public class WebConsoleSessionInfo + /// + /// Creates a new instance of the class. + /// + public WebConsoleSessionInfo() { - public string Url { get; set; } - - public WebConsoleSessionInfo() - { - - } } -} + + /// + /// URL to connect to. + /// + public string Url { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/Application/PowerShell.cs b/Source/NETworkManager.Profiles/Application/PowerShell.cs index 47be397fc6..8121fd860c 100644 --- a/Source/NETworkManager.Profiles/Application/PowerShell.cs +++ b/Source/NETworkManager.Profiles/Application/PowerShell.cs @@ -1,23 +1,38 @@ using NETworkManager.Models.PowerShell; using NETworkManager.Settings; +using NETworkManager.Utilities; -namespace NETworkManager.Profiles.Application +namespace NETworkManager.Profiles.Application; + +public class PowerShell { - public class PowerShell - { - public static PowerShellSessionInfo CreateSessionInfo(ProfileInfo profile) + public static PowerShellSessionInfo CreateSessionInfo(ProfileInfo profile) + { + // Get group info + var group = ProfileManager.GetGroupByName(profile.Group); + + return new PowerShellSessionInfo { - // Get group info - GroupInfo group = ProfileManager.GetGroup(profile.Group); + EnableRemoteConsole = profile.PowerShell_EnableRemoteConsole, + Host = profile.PowerShell_Host, - return new PowerShellSessionInfo - { - EnableRemoteConsole = profile.PowerShell_EnableRemoteConsole, - Host = profile.Host, - - AdditionalCommandLine = profile.PowerShell_OverrideAdditionalCommandLine ? profile.PowerShell_AdditionalCommandLine : (group.PowerShell_OverrideAdditionalCommandLine ? group.PowerShell_AdditionalCommandLine : SettingsManager.Current.PowerShell_AdditionalCommandLine), - ExecutionPolicy = profile.PowerShell_OverrideExecutionPolicy ? profile.PowerShell_ExecutionPolicy : (group.PowerShell_OverrideExecutionPolicy ? group.PowerShell_ExecutionPolicy : SettingsManager.Current.PowerShell_ExecutionPolicy) - }; - } + Command = profile.PowerShell_OverrideCommand + ? profile.PowerShell_Command + : group.PowerShell_OverrideCommand + ? group.PowerShell_Command + : SettingsManager.Current.PowerShell_Command, + AdditionalCommandLine = PlaceholderHelper.Resolve( + profile.PowerShell_OverrideAdditionalCommandLine + ? profile.PowerShell_AdditionalCommandLine + : group.PowerShell_OverrideAdditionalCommandLine + ? group.PowerShell_AdditionalCommandLine + : SettingsManager.Current.PowerShell_AdditionalCommandLine, + (PlaceholderHelper.Host, profile.Host)), + ExecutionPolicy = profile.PowerShell_OverrideExecutionPolicy + ? profile.PowerShell_ExecutionPolicy + : group.PowerShell_OverrideExecutionPolicy + ? group.PowerShell_ExecutionPolicy + : SettingsManager.Current.PowerShell_ExecutionPolicy + }; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/Application/PuTTY.cs b/Source/NETworkManager.Profiles/Application/PuTTY.cs index 9190c1b7bd..ff425ff576 100644 --- a/Source/NETworkManager.Profiles/Application/PuTTY.cs +++ b/Source/NETworkManager.Profiles/Application/PuTTY.cs @@ -1,31 +1,68 @@ using NETworkManager.Models.PuTTY; using NETworkManager.Settings; +using NETworkManager.Utilities; -namespace NETworkManager.Profiles.Application +namespace NETworkManager.Profiles.Application; + +public static class PuTTY { - public static class PuTTY + public static PuTTYSessionInfo CreateSessionInfo(ProfileInfo profile) { - public static PuTTYSessionInfo CreateSessionInfo(ProfileInfo profile) - { - // Get group info - GroupInfo group = ProfileManager.GetGroup(profile.Group); + // Get group info + var group = ProfileManager.GetGroupByName(profile.Group); - return new PuTTYSessionInfo - { - Mode = profile.PuTTY_ConnectionMode, - HostOrSerialLine = profile.PuTTY_HostOrSerialLine, + return new PuTTYSessionInfo + { + Mode = profile.PuTTY_ConnectionMode, + HostOrSerialLine = profile.PuTTY_HostOrSerialLine, - PortOrBaud = profile.PuTTY_OverridePortOrBaud ? profile.PuTTY_PortOrBaud : Settings.Application.PuTTY.GetPortOrBaudByConnectionMode(profile.PuTTY_ConnectionMode), + PortOrBaud = profile.PuTTY_OverridePortOrBaud + ? profile.PuTTY_PortOrBaud + : Settings.Application.PuTTY.GetPortOrBaudByConnectionMode(profile.PuTTY_ConnectionMode), - Username = profile.PuTTY_OverrideUsername ? profile.PuTTY_Username : (group.PuTTY_OverrideUsername ? group.PuTTY_Username : SettingsManager.Current.PuTTY_Username), - PrivateKey = profile.PuTTY_OverridePrivateKeyFile ? profile.PuTTY_PrivateKeyFile : (group.PuTTY_OverridePrivateKeyFile ? group.PuTTY_PrivateKeyFile : SettingsManager.Current.PuTTY_PrivateKeyFile), - Profile = profile.PuTTY_OverrideProfile ? profile.PuTTY_Profile : (group.PuTTY_OverrideProfile ? group.PuTTY_Profile : SettingsManager.Current.PuTTY_Profile), - EnableLog = profile.PuTTY_OverrideEnableLog ? profile.PuTTY_EnableLog : (group.PuTTY_OverrideEnableLog ? group.PuTTY_EnableLog : SettingsManager.Current.PuTTY_EnableSessionLog), - LogMode = profile.PuTTY_OverrideLogMode ? profile.PuTTY_LogMode : (group.PuTTY_OverrideLogMode ? group.PuTTY_LogMode : SettingsManager.Current.PuTTY_LogMode), - LogPath = profile.PuTTY_OverrideLogPath ? profile.PuTTY_LogPath : (group.PuTTY_OverrideLogPath ? group.PuTTY_LogPath : Settings.Application.PuTTY.LogPath), - LogFileName = profile.PuTTY_OverrideLogFileName ? profile.PuTTY_LogFileName : (group.PuTTY_OverrideLogFileName ? group.PuTTY_LogFileName : SettingsManager.Current.PuTTY_LogFileName), - AdditionalCommandLine = profile.PuTTY_OverrideAdditionalCommandLine ? profile.PuTTY_AdditionalCommandLine : (group.PuTTY_OverrideAdditionalCommandLine ? group.PuTTY_AdditionalCommandLine : SettingsManager.Current.PuTTY_AdditionalCommandLine) - }; - } + Username = profile.PuTTY_OverrideUsername + ? profile.PuTTY_Username + : group.PuTTY_OverrideUsername + ? group.PuTTY_Username + : SettingsManager.Current.PuTTY_Username, + PrivateKey = profile.PuTTY_OverridePrivateKeyFile + ? profile.PuTTY_PrivateKeyFile + : group.PuTTY_OverridePrivateKeyFile + ? group.PuTTY_PrivateKeyFile + : SettingsManager.Current.PuTTY_PrivateKeyFile, + Profile = profile.PuTTY_OverrideProfile + ? profile.PuTTY_Profile + : group.PuTTY_OverrideProfile + ? group.PuTTY_Profile + : SettingsManager.Current.PuTTY_Profile, + Hostkey = profile.PuTTY_OverrideHostkey ? profile.PuTTY_Hostkey : "", + EnableLog = profile.PuTTY_OverrideEnableLog + ? profile.PuTTY_EnableLog + : group.PuTTY_OverrideEnableLog + ? group.PuTTY_EnableLog + : SettingsManager.Current.PuTTY_EnableSessionLog, + LogMode = profile.PuTTY_OverrideLogMode + ? profile.PuTTY_LogMode + : group.PuTTY_OverrideLogMode + ? group.PuTTY_LogMode + : SettingsManager.Current.PuTTY_LogMode, + LogPath = profile.PuTTY_OverrideLogPath + ? profile.PuTTY_LogPath + : group.PuTTY_OverrideLogPath + ? group.PuTTY_LogPath + : Settings.Application.PuTTY.LogPath, + LogFileName = profile.PuTTY_OverrideLogFileName + ? profile.PuTTY_LogFileName + : group.PuTTY_OverrideLogFileName + ? group.PuTTY_LogFileName + : SettingsManager.Current.PuTTY_LogFileName, + AdditionalCommandLine = PlaceholderHelper.Resolve( + profile.PuTTY_OverrideAdditionalCommandLine + ? profile.PuTTY_AdditionalCommandLine + : group.PuTTY_OverrideAdditionalCommandLine + ? group.PuTTY_AdditionalCommandLine + : SettingsManager.Current.PuTTY_AdditionalCommandLine, + (PlaceholderHelper.Host, profile.Host)) + }; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/Application/RemoteDesktop.cs b/Source/NETworkManager.Profiles/Application/RemoteDesktop.cs index 1ed23375b5..304dfdd75f 100644 --- a/Source/NETworkManager.Profiles/Application/RemoteDesktop.cs +++ b/Source/NETworkManager.Profiles/Application/RemoteDesktop.cs @@ -1,218 +1,276 @@ using NETworkManager.Models.RemoteDesktop; using NETworkManager.Settings; -namespace NETworkManager.Profiles.Application +namespace NETworkManager.Profiles.Application; + +public static class RemoteDesktop { - public static class RemoteDesktop + public static RemoteDesktopSessionInfo CreateSessionInfo() { - public static RemoteDesktopSessionInfo CreateSessionInfo() - { - return new RemoteDesktopSessionInfo - { - // Hostname - Hostname = string.Empty, - - // Network - Port = SettingsManager.Current.RemoteDesktop_Port, - - // Display - AdjustScreenAutomatically = SettingsManager.Current.RemoteDesktop_AdjustScreenAutomatically, - UseCurrentViewSize = SettingsManager.Current.RemoteDesktop_UseCurrentViewSize, - DesktopWidth = SettingsManager.Current.RemoteDesktop_UseCustomScreenSize ? SettingsManager.Current.RemoteDesktop_CustomScreenWidth : SettingsManager.Current.RemoteDesktop_ScreenWidth, - DesktopHeight = SettingsManager.Current.RemoteDesktop_UseCustomScreenSize ? SettingsManager.Current.RemoteDesktop_CustomScreenHeight : SettingsManager.Current.RemoteDesktop_ScreenHeight, - ColorDepth = SettingsManager.Current.RemoteDesktop_ColorDepth, - - // Authentication - EnableCredSspSupport = SettingsManager.Current.RemoteDesktop_EnableCredSspSupport, - AuthenticationLevel = SettingsManager.Current.RemoteDesktop_AuthenticationLevel, - - // Remote audio - AudioRedirectionMode = SettingsManager.Current.RemoteDesktop_AudioRedirectionMode, - AudioCaptureRedirectionMode = SettingsManager.Current.RemoteDesktop_AudioCaptureRedirectionMode, - - // Keyboard - KeyboardHookMode = SettingsManager.Current.RemoteDesktop_KeyboardHookMode, - - // Local devices and resources - RedirectClipboard = SettingsManager.Current.RemoteDesktop_RedirectClipboard, - RedirectDevices = SettingsManager.Current.RemoteDesktop_RedirectDevices, - RedirectDrives = SettingsManager.Current.RemoteDesktop_RedirectDrives, - RedirectPorts = SettingsManager.Current.RemoteDesktop_RedirectPorts, - RedirectSmartCards = SettingsManager.Current.RemoteDesktop_RedirectSmartCards, - RedirectPrinters = SettingsManager.Current.RemoteDesktop_RedirectPrinters, - - // Experience - PersistentBitmapCaching = SettingsManager.Current.RemoteDesktop_PersistentBitmapCaching, - ReconnectIfTheConnectionIsDropped = SettingsManager.Current.RemoteDesktop_ReconnectIfTheConnectionIsDropped, - - // Performance - NetworkConnectionType = SettingsManager.Current.RemoteDesktop_NetworkConnectionType, - DesktopBackground = SettingsManager.Current.RemoteDesktop_DesktopBackground, - FontSmoothing = SettingsManager.Current.RemoteDesktop_FontSmoothing, - DesktopComposition = SettingsManager.Current.RemoteDesktop_DesktopComposition, - ShowWindowContentsWhileDragging = SettingsManager.Current.RemoteDesktop_ShowWindowContentsWhileDragging, - MenuAndWindowAnimation = SettingsManager.Current.RemoteDesktop_MenuAndWindowAnimation, - VisualStyles = SettingsManager.Current.RemoteDesktop_VisualStyles - }; - } - - public static RemoteDesktopSessionInfo CreateSessionInfo(ProfileInfo profile) + return new RemoteDesktopSessionInfo { - var info = CreateSessionInfo(); - - // Get group info - GroupInfo group = ProfileManager.GetGroup(profile.Group); - - // Override hostname - info.Hostname = profile.Host; + // Hostname + Hostname = string.Empty, // Network - if (profile.RemoteDesktop_OverridePort) - info.Port = profile.RemoteDesktop_Port; - else if (group.RemoteDesktop_OverridePort) - info.Port = group.RemoteDesktop_Port; + Port = SettingsManager.Current.RemoteDesktop_Port, // Display - if (profile.RemoteDesktop_OverrideDisplay) - { - info.AdjustScreenAutomatically = profile.RemoteDesktop_AdjustScreenAutomatically; - info.UseCurrentViewSize = profile.RemoteDesktop_UseCurrentViewSize; - info.DesktopWidth = profile.RemoteDesktop_UseCustomScreenSize ? profile.RemoteDesktop_CustomScreenWidth : profile.RemoteDesktop_ScreenWidth; - info.DesktopHeight = profile.RemoteDesktop_UseCustomScreenSize ? profile.RemoteDesktop_CustomScreenHeight : profile.RemoteDesktop_ScreenHeight; - info.ColorDepth = profile.RemoteDesktop_ColorDepth; - } - else if (group.RemoteDesktop_OverrideDisplay) - { - info.AdjustScreenAutomatically = group.RemoteDesktop_AdjustScreenAutomatically; - info.UseCurrentViewSize = group.RemoteDesktop_UseCurrentViewSize; - info.DesktopWidth = group.RemoteDesktop_UseCustomScreenSize ? group.RemoteDesktop_CustomScreenWidth : group.RemoteDesktop_ScreenWidth; - info.DesktopHeight = group.RemoteDesktop_UseCustomScreenSize ? group.RemoteDesktop_CustomScreenHeight : group.RemoteDesktop_ScreenHeight; - info.ColorDepth = group.RemoteDesktop_ColorDepth; - } + AdjustScreenAutomatically = SettingsManager.Current.RemoteDesktop_AdjustScreenAutomatically, + UseCurrentViewSize = SettingsManager.Current.RemoteDesktop_UseCurrentViewSize, + DesktopWidth = SettingsManager.Current.RemoteDesktop_UseCustomScreenSize + ? SettingsManager.Current.RemoteDesktop_CustomScreenWidth + : SettingsManager.Current.RemoteDesktop_ScreenWidth, + DesktopHeight = SettingsManager.Current.RemoteDesktop_UseCustomScreenSize + ? SettingsManager.Current.RemoteDesktop_CustomScreenHeight + : SettingsManager.Current.RemoteDesktop_ScreenHeight, + ColorDepth = SettingsManager.Current.RemoteDesktop_ColorDepth, + + // View only + ViewOnly = SettingsManager.Current.RemoteDesktop_ViewOnly, // Authentication - if (profile.RemoteDesktop_OverrideCredSspSupport) - info.EnableCredSspSupport = profile.RemoteDesktop_EnableCredSspSupport; - else if (group.RemoteDesktop_OverrideCredSspSupport) - info.EnableCredSspSupport = group.RemoteDesktop_EnableCredSspSupport; + EnableCredSspSupport = SettingsManager.Current.RemoteDesktop_EnableCredSspSupport, + AuthenticationLevel = SettingsManager.Current.RemoteDesktop_AuthenticationLevel, - if (profile.RemoteDesktop_OverrideAuthenticationLevel) - info.AuthenticationLevel = profile.RemoteDesktop_AuthenticationLevel; - else if (group.RemoteDesktop_OverrideAuthenticationLevel) - info.AuthenticationLevel = group.RemoteDesktop_AuthenticationLevel; + // Gateway server + EnableGatewayServer = SettingsManager.Current.RemoteDesktop_EnableGatewayServer, + GatewayServerHostname = SettingsManager.Current.RemoteDesktop_GatewayServerHostname, + GatewayServerBypassLocalAddresses = SettingsManager.Current.RemoteDesktop_GatewayServerBypassLocalAddresses, + GatewayServerLogonMethod = SettingsManager.Current.RemoteDesktop_GatewayServerLogonMethod, + GatewayServerShareCredentialsWithRemoteComputer = SettingsManager.Current + .RemoteDesktop_GatewayServerShareCredentialsWithRemoteComputer, // Remote audio - if (profile.RemoteDesktop_OverrideAudioRedirectionMode) - info.AudioRedirectionMode = profile.RemoteDesktop_AudioRedirectionMode; - else if (group.RemoteDesktop_OverrideAudioRedirectionMode) - info.AudioRedirectionMode = group.RemoteDesktop_AudioRedirectionMode; - - if (profile.RemoteDesktop_OverrideAudioCaptureRedirectionMode) - info.AudioCaptureRedirectionMode = profile.RemoteDesktop_AudioCaptureRedirectionMode; - else if (group.RemoteDesktop_OverrideAudioCaptureRedirectionMode) - info.AudioCaptureRedirectionMode = group.RemoteDesktop_AudioCaptureRedirectionMode; + AudioRedirectionMode = SettingsManager.Current.RemoteDesktop_AudioRedirectionMode, + AudioCaptureRedirectionMode = SettingsManager.Current.RemoteDesktop_AudioCaptureRedirectionMode, // Keyboard - if (profile.RemoteDesktop_OverrideApplyWindowsKeyCombinations) - info.KeyboardHookMode = profile.RemoteDesktop_KeyboardHookMode; - else if (group.RemoteDesktop_OverrideApplyWindowsKeyCombinations) - info.KeyboardHookMode = group.RemoteDesktop_KeyboardHookMode; + KeyboardHookMode = SettingsManager.Current.RemoteDesktop_KeyboardHookMode, // Local devices and resources - if (profile.RemoteDesktop_OverrideRedirectClipboard) - info.RedirectClipboard = profile.RemoteDesktop_RedirectClipboard; - else if (group.RemoteDesktop_OverrideRedirectClipboard) - info.RedirectClipboard = group.RemoteDesktop_RedirectClipboard; - - if (profile.RemoteDesktop_OverrideRedirectDevices) - info.RedirectDevices = profile.RemoteDesktop_RedirectDevices; - else if (group.RemoteDesktop_OverrideRedirectDevices) - info.RedirectDevices = group.RemoteDesktop_RedirectDevices; - - if (profile.RemoteDesktop_OverrideRedirectDrives) - info.RedirectDrives = profile.RemoteDesktop_RedirectDrives; - else if (group.RemoteDesktop_OverrideRedirectDrives) - info.RedirectDrives = group.RemoteDesktop_RedirectDrives; - - if (profile.RemoteDesktop_OverrideRedirectPorts) - info.RedirectPorts = profile.RemoteDesktop_RedirectPorts; - else if (group.RemoteDesktop_OverrideRedirectPorts) - info.RedirectPorts = group.RemoteDesktop_RedirectPorts; - - if (profile.RemoteDesktop_OverrideRedirectSmartcards) - info.RedirectSmartCards = profile.RemoteDesktop_RedirectSmartCards; - else if (group.RemoteDesktop_OverrideRedirectSmartcards) - info.RedirectSmartCards = group.RemoteDesktop_RedirectSmartCards; - - if (profile.RemoteDesktop_OverrideRedirectPrinters) - info.RedirectPrinters = profile.RemoteDesktop_RedirectPrinters; - else if (group.RemoteDesktop_OverrideRedirectPrinters) - info.RedirectPrinters = group.RemoteDesktop_RedirectPrinters; + RedirectClipboard = SettingsManager.Current.RemoteDesktop_RedirectClipboard, + RedirectDevices = SettingsManager.Current.RemoteDesktop_RedirectDevices, + RedirectDrives = SettingsManager.Current.RemoteDesktop_RedirectDrives, + RedirectPorts = SettingsManager.Current.RemoteDesktop_RedirectPorts, + RedirectSmartCards = SettingsManager.Current.RemoteDesktop_RedirectSmartCards, + RedirectPrinters = SettingsManager.Current.RemoteDesktop_RedirectPrinters, // Experience - if (profile.RemoteDesktop_OverridePersistentBitmapCaching) - info.PersistentBitmapCaching = profile.RemoteDesktop_PersistentBitmapCaching; - else if (group.RemoteDesktop_OverridePersistentBitmapCaching) - info.PersistentBitmapCaching = group.RemoteDesktop_PersistentBitmapCaching; - - if (profile.RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped) - info.ReconnectIfTheConnectionIsDropped = profile.RemoteDesktop_ReconnectIfTheConnectionIsDropped; - else if (group.RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped) - info.ReconnectIfTheConnectionIsDropped = group.RemoteDesktop_ReconnectIfTheConnectionIsDropped; + PersistentBitmapCaching = SettingsManager.Current.RemoteDesktop_PersistentBitmapCaching, + ReconnectIfTheConnectionIsDropped = SettingsManager.Current.RemoteDesktop_ReconnectIfTheConnectionIsDropped, // Performance - if (profile.RemoteDesktop_OverrideNetworkConnectionType) - info.NetworkConnectionType = profile.RemoteDesktop_NetworkConnectionType; - else if (group.RemoteDesktop_OverrideNetworkConnectionType) - info.NetworkConnectionType = group.RemoteDesktop_NetworkConnectionType; - - if (profile.RemoteDesktop_OverrideDesktopBackground) - info.DesktopBackground = profile.RemoteDesktop_DesktopBackground; - else if (group.RemoteDesktop_OverrideDesktopBackground) - info.DesktopBackground = group.RemoteDesktop_DesktopBackground; - - if (profile.RemoteDesktop_OverrideFontSmoothing) - info.FontSmoothing = profile.RemoteDesktop_FontSmoothing; - else if (group.RemoteDesktop_OverrideFontSmoothing) - info.FontSmoothing = group.RemoteDesktop_FontSmoothing; - - if (profile.RemoteDesktop_OverrideDesktopComposition) - info.DesktopComposition = profile.RemoteDesktop_DesktopComposition; - else if (group.RemoteDesktop_OverrideDesktopComposition) - info.DesktopComposition = group.RemoteDesktop_DesktopComposition; - - if (profile.RemoteDesktop_OverrideShowWindowContentsWhileDragging) - info.ShowWindowContentsWhileDragging = profile.RemoteDesktop_ShowWindowContentsWhileDragging; - else if (group.RemoteDesktop_OverrideShowWindowContentsWhileDragging) - info.ShowWindowContentsWhileDragging = group.RemoteDesktop_ShowWindowContentsWhileDragging; - - if (profile.RemoteDesktop_OverrideMenuAndWindowAnimation) - info.MenuAndWindowAnimation = profile.RemoteDesktop_MenuAndWindowAnimation; - else if (group.RemoteDesktop_OverrideMenuAndWindowAnimation) - info.MenuAndWindowAnimation = group.RemoteDesktop_MenuAndWindowAnimation; - - if (profile.RemoteDesktop_OverrideVisualStyles) - info.VisualStyles = profile.RemoteDesktop_VisualStyles; - else if (group.RemoteDesktop_OverrideVisualStyles) - info.VisualStyles = group.RemoteDesktop_VisualStyles; - - // Set credentials - if (profile.RemoteDesktop_UseCredentials) - { - info.CustomCredentials = true; - - info.Username = profile.RemoteDesktop_Username; - info.Password = profile.RemoteDesktop_Password; - } - else if (group.RemoteDesktop_UseCredentials) - { - info.CustomCredentials = true; - - info.Username = group.RemoteDesktop_Username; - info.Password = group.RemoteDesktop_Password; - } - - return info; + NetworkConnectionType = SettingsManager.Current.RemoteDesktop_NetworkConnectionType, + DesktopBackground = SettingsManager.Current.RemoteDesktop_DesktopBackground, + FontSmoothing = SettingsManager.Current.RemoteDesktop_FontSmoothing, + DesktopComposition = SettingsManager.Current.RemoteDesktop_DesktopComposition, + ShowWindowContentsWhileDragging = SettingsManager.Current.RemoteDesktop_ShowWindowContentsWhileDragging, + MenuAndWindowAnimation = SettingsManager.Current.RemoteDesktop_MenuAndWindowAnimation, + VisualStyles = SettingsManager.Current.RemoteDesktop_VisualStyles + }; + } + + public static RemoteDesktopSessionInfo CreateSessionInfo(ProfileInfo profile) + { + var info = CreateSessionInfo(); + + // Get group info + var group = ProfileManager.GetGroupByName(profile.Group); + + // Override hostname + info.Hostname = profile.RemoteDesktop_Host; + + // Set credentials + if (profile.RemoteDesktop_UseCredentials) + { + info.UseCredentials = true; + + info.Username = profile.RemoteDesktop_Username; + info.Domain = profile.RemoteDesktop_Domain; + info.Password = profile.RemoteDesktop_Password; } + else if (group.RemoteDesktop_UseCredentials) + { + info.UseCredentials = true; + + info.Username = group.RemoteDesktop_Username; + info.Domain = group.RemoteDesktop_Domain; + info.Password = group.RemoteDesktop_Password; + } + + // Network + if (profile.RemoteDesktop_OverridePort) + info.Port = profile.RemoteDesktop_Port; + else if (group.RemoteDesktop_OverridePort) + info.Port = group.RemoteDesktop_Port; + + // Display + if (profile.RemoteDesktop_OverrideDisplay) + { + info.AdjustScreenAutomatically = profile.RemoteDesktop_AdjustScreenAutomatically; + info.UseCurrentViewSize = profile.RemoteDesktop_UseCurrentViewSize; + info.DesktopWidth = profile.RemoteDesktop_UseCustomScreenSize + ? profile.RemoteDesktop_CustomScreenWidth + : profile.RemoteDesktop_ScreenWidth; + info.DesktopHeight = profile.RemoteDesktop_UseCustomScreenSize + ? profile.RemoteDesktop_CustomScreenHeight + : profile.RemoteDesktop_ScreenHeight; + info.ColorDepth = profile.RemoteDesktop_ColorDepth; + } + else if (group.RemoteDesktop_OverrideDisplay) + { + info.AdjustScreenAutomatically = group.RemoteDesktop_AdjustScreenAutomatically; + info.UseCurrentViewSize = group.RemoteDesktop_UseCurrentViewSize; + info.DesktopWidth = group.RemoteDesktop_UseCustomScreenSize + ? group.RemoteDesktop_CustomScreenWidth + : group.RemoteDesktop_ScreenWidth; + info.DesktopHeight = group.RemoteDesktop_UseCustomScreenSize + ? group.RemoteDesktop_CustomScreenHeight + : group.RemoteDesktop_ScreenHeight; + info.ColorDepth = group.RemoteDesktop_ColorDepth; + } + + // View only + if (profile.RemoteDesktop_OverrideViewOnly) + info.ViewOnly = profile.RemoteDesktop_ViewOnly; + else if (group.RemoteDesktop_OverrideViewOnly) + info.ViewOnly = group.RemoteDesktop_ViewOnly; + + // Authentication + if (profile.RemoteDesktop_OverrideCredSspSupport) + info.EnableCredSspSupport = profile.RemoteDesktop_EnableCredSspSupport; + else if (group.RemoteDesktop_OverrideCredSspSupport) + info.EnableCredSspSupport = group.RemoteDesktop_EnableCredSspSupport; + + if (profile.RemoteDesktop_OverrideAuthenticationLevel) + info.AuthenticationLevel = profile.RemoteDesktop_AuthenticationLevel; + else if (group.RemoteDesktop_OverrideAuthenticationLevel) + info.AuthenticationLevel = group.RemoteDesktop_AuthenticationLevel; + + // Gateway server + if (profile.RemoteDesktop_OverrideGatewayServer) + { + info.EnableGatewayServer = profile.RemoteDesktop_EnableGatewayServer; + info.GatewayServerHostname = profile.RemoteDesktop_GatewayServerHostname; + info.GatewayServerBypassLocalAddresses = profile.RemoteDesktop_GatewayServerBypassLocalAddresses; + info.GatewayServerLogonMethod = profile.RemoteDesktop_GatewayServerLogonMethod; + info.GatewayServerShareCredentialsWithRemoteComputer = + profile.RemoteDesktop_GatewayServerShareCredentialsWithRemoteComputer; + info.UseGatewayServerCredentials = profile.RemoteDesktop_UseGatewayServerCredentials; + info.GatewayServerUsername = profile.RemoteDesktop_GatewayServerUsername; + info.GatewayServerDomain = profile.RemoteDesktop_GatewayServerDomain; + info.GatewayServerPassword = profile.RemoteDesktop_GatewayServerPassword; + } + else if (group.RemoteDesktop_OverrideGatewayServer) + { + info.EnableGatewayServer = group.RemoteDesktop_EnableGatewayServer; + info.GatewayServerHostname = group.RemoteDesktop_GatewayServerHostname; + info.GatewayServerBypassLocalAddresses = group.RemoteDesktop_GatewayServerBypassLocalAddresses; + info.GatewayServerLogonMethod = group.RemoteDesktop_GatewayServerLogonMethod; + info.GatewayServerShareCredentialsWithRemoteComputer = + group.RemoteDesktop_GatewayServerShareCredentialsWithRemoteComputer; + info.UseGatewayServerCredentials = group.RemoteDesktop_UseGatewayServerCredentials; + info.GatewayServerUsername = group.RemoteDesktop_GatewayServerUsername; + info.GatewayServerDomain = group.RemoteDesktop_GatewayServerDomain; + info.GatewayServerPassword = group.RemoteDesktop_GatewayServerPassword; + } + + // Remote audio + if (profile.RemoteDesktop_OverrideAudioRedirectionMode) + info.AudioRedirectionMode = profile.RemoteDesktop_AudioRedirectionMode; + else if (group.RemoteDesktop_OverrideAudioRedirectionMode) + info.AudioRedirectionMode = group.RemoteDesktop_AudioRedirectionMode; + + if (profile.RemoteDesktop_OverrideAudioCaptureRedirectionMode) + info.AudioCaptureRedirectionMode = profile.RemoteDesktop_AudioCaptureRedirectionMode; + else if (group.RemoteDesktop_OverrideAudioCaptureRedirectionMode) + info.AudioCaptureRedirectionMode = group.RemoteDesktop_AudioCaptureRedirectionMode; + + // Keyboard + if (profile.RemoteDesktop_OverrideApplyWindowsKeyCombinations) + info.KeyboardHookMode = profile.RemoteDesktop_KeyboardHookMode; + else if (group.RemoteDesktop_OverrideApplyWindowsKeyCombinations) + info.KeyboardHookMode = group.RemoteDesktop_KeyboardHookMode; + + // Local devices and resources + if (profile.RemoteDesktop_OverrideRedirectClipboard) + info.RedirectClipboard = profile.RemoteDesktop_RedirectClipboard; + else if (group.RemoteDesktop_OverrideRedirectClipboard) + info.RedirectClipboard = group.RemoteDesktop_RedirectClipboard; + + if (profile.RemoteDesktop_OverrideRedirectDevices) + info.RedirectDevices = profile.RemoteDesktop_RedirectDevices; + else if (group.RemoteDesktop_OverrideRedirectDevices) + info.RedirectDevices = group.RemoteDesktop_RedirectDevices; + + if (profile.RemoteDesktop_OverrideRedirectDrives) + info.RedirectDrives = profile.RemoteDesktop_RedirectDrives; + else if (group.RemoteDesktop_OverrideRedirectDrives) + info.RedirectDrives = group.RemoteDesktop_RedirectDrives; + + if (profile.RemoteDesktop_OverrideRedirectPorts) + info.RedirectPorts = profile.RemoteDesktop_RedirectPorts; + else if (group.RemoteDesktop_OverrideRedirectPorts) + info.RedirectPorts = group.RemoteDesktop_RedirectPorts; + + if (profile.RemoteDesktop_OverrideRedirectSmartcards) + info.RedirectSmartCards = profile.RemoteDesktop_RedirectSmartCards; + else if (group.RemoteDesktop_OverrideRedirectSmartcards) + info.RedirectSmartCards = group.RemoteDesktop_RedirectSmartCards; + + if (profile.RemoteDesktop_OverrideRedirectPrinters) + info.RedirectPrinters = profile.RemoteDesktop_RedirectPrinters; + else if (group.RemoteDesktop_OverrideRedirectPrinters) + info.RedirectPrinters = group.RemoteDesktop_RedirectPrinters; + + // Experience + if (profile.RemoteDesktop_OverridePersistentBitmapCaching) + info.PersistentBitmapCaching = profile.RemoteDesktop_PersistentBitmapCaching; + else if (group.RemoteDesktop_OverridePersistentBitmapCaching) + info.PersistentBitmapCaching = group.RemoteDesktop_PersistentBitmapCaching; + + if (profile.RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped) + info.ReconnectIfTheConnectionIsDropped = profile.RemoteDesktop_ReconnectIfTheConnectionIsDropped; + else if (group.RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped) + info.ReconnectIfTheConnectionIsDropped = group.RemoteDesktop_ReconnectIfTheConnectionIsDropped; + + // Performance + if (profile.RemoteDesktop_OverrideNetworkConnectionType) + info.NetworkConnectionType = profile.RemoteDesktop_NetworkConnectionType; + else if (group.RemoteDesktop_OverrideNetworkConnectionType) + info.NetworkConnectionType = group.RemoteDesktop_NetworkConnectionType; + + if (profile.RemoteDesktop_OverrideDesktopBackground) + info.DesktopBackground = profile.RemoteDesktop_DesktopBackground; + else if (group.RemoteDesktop_OverrideDesktopBackground) + info.DesktopBackground = group.RemoteDesktop_DesktopBackground; + + if (profile.RemoteDesktop_OverrideFontSmoothing) + info.FontSmoothing = profile.RemoteDesktop_FontSmoothing; + else if (group.RemoteDesktop_OverrideFontSmoothing) + info.FontSmoothing = group.RemoteDesktop_FontSmoothing; + + if (profile.RemoteDesktop_OverrideDesktopComposition) + info.DesktopComposition = profile.RemoteDesktop_DesktopComposition; + else if (group.RemoteDesktop_OverrideDesktopComposition) + info.DesktopComposition = group.RemoteDesktop_DesktopComposition; + + if (profile.RemoteDesktop_OverrideShowWindowContentsWhileDragging) + info.ShowWindowContentsWhileDragging = profile.RemoteDesktop_ShowWindowContentsWhileDragging; + else if (group.RemoteDesktop_OverrideShowWindowContentsWhileDragging) + info.ShowWindowContentsWhileDragging = group.RemoteDesktop_ShowWindowContentsWhileDragging; + + if (profile.RemoteDesktop_OverrideMenuAndWindowAnimation) + info.MenuAndWindowAnimation = profile.RemoteDesktop_MenuAndWindowAnimation; + else if (group.RemoteDesktop_OverrideMenuAndWindowAnimation) + info.MenuAndWindowAnimation = group.RemoteDesktop_MenuAndWindowAnimation; + + if (profile.RemoteDesktop_OverrideVisualStyles) + info.VisualStyles = profile.RemoteDesktop_VisualStyles; + else if (group.RemoteDesktop_OverrideVisualStyles) + info.VisualStyles = group.RemoteDesktop_VisualStyles; + + return info; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/Application/SNMP.cs b/Source/NETworkManager.Profiles/Application/SNMP.cs new file mode 100644 index 0000000000..7153580901 --- /dev/null +++ b/Source/NETworkManager.Profiles/Application/SNMP.cs @@ -0,0 +1,68 @@ +using NETworkManager.Models.Network; +using NETworkManager.Settings; + +namespace NETworkManager.Profiles.Application; + +public static class SNMP +{ + public static SNMPSessionInfo CreateSessionInfo() + { + return new SNMPSessionInfo + { + Mode = SettingsManager.Current.SNMP_Mode, + + Version = SettingsManager.Current.SNMP_Version, + Security = SettingsManager.Current.SNMP_Security, + AuthenticationProvider = SettingsManager.Current.SNMP_AuthenticationProvider, + PrivacyProvider = SettingsManager.Current.SNMP_PrivacyProvider + }; + } + + public static SNMPSessionInfo CreateSessionInfo(ProfileInfo profile) + { + SNMPSessionInfo info = new(); + + // Get group info + var group = ProfileManager.GetGroupByName(profile.Group); + + info.Host = profile.SNMP_Host; + + // OID and Mode + if (profile.SNMP_OverrideOIDAndMode) + { + info.Mode = profile.SNMP_Mode; + info.OID = profile.SNMP_OID; + } + else if (group.SNMP_OverrideOIDAndMode) + { + info.Mode = group.SNMP_Mode; + info.OID = group.SNMP_OID; + } + + // Version and Auth + if (profile.SNMP_OverrideVersionAndAuth) + { + info.Version = profile.SNMP_Version; + info.Community = profile.SNMP_Community; + info.Security = profile.SNMP_Security; + info.Username = profile.SNMP_Username; + info.AuthenticationProvider = profile.SNMP_AuthenticationProvider; + info.Auth = profile.SNMP_Auth; + info.PrivacyProvider = profile.SNMP_PrivacyProvider; + info.Priv = profile.SNMP_Priv; + } + else if (group.SNMP_OverrideVersionAndAuth) + { + info.Version = group.SNMP_Version; + info.Community = group.SNMP_Community; + info.Security = group.SNMP_Security; + info.Username = group.SNMP_Username; + info.AuthenticationProvider = group.SNMP_AuthenticationProvider; + info.Auth = group.SNMP_Auth; + info.PrivacyProvider = group.SNMP_PrivacyProvider; + info.Priv = group.SNMP_Priv; + } + + return info; + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/Application/TigerVNC.cs b/Source/NETworkManager.Profiles/Application/TigerVNC.cs index 15b1bcc980..7faa4f19b7 100644 --- a/Source/NETworkManager.Profiles/Application/TigerVNC.cs +++ b/Source/NETworkManager.Profiles/Application/TigerVNC.cs @@ -1,22 +1,24 @@ - -using NETworkManager.Models.TigerVNC; +using NETworkManager.Models.TigerVNC; using NETworkManager.Settings; -namespace NETworkManager.Profiles.Application +namespace NETworkManager.Profiles.Application; + +public static class TigerVNC { - public static class TigerVNC + public static TigerVNCSessionInfo CreateSessionInfo(ProfileInfo profile) { - public static TigerVNCSessionInfo CreateSessionInfo(ProfileInfo profile) - { - // Get group info - GroupInfo group = ProfileManager.GetGroup(profile.Group); + // Get group info + var group = ProfileManager.GetGroupByName(profile.Group); - return new TigerVNCSessionInfo - { - Host = profile.TigerVNC_Host, + return new TigerVNCSessionInfo + { + Host = profile.TigerVNC_Host, - Port = profile.TigerVNC_OverridePort ? profile.TigerVNC_Port : (group.TigerVNC_OverridePort ? group.TigerVNC_Port : SettingsManager.Current.TigerVNC_Port) - }; - } + Port = profile.TigerVNC_OverridePort + ? profile.TigerVNC_Port + : group.TigerVNC_OverridePort + ? group.TigerVNC_Port + : SettingsManager.Current.TigerVNC_Port + }; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/Application/WakeOnLan.cs b/Source/NETworkManager.Profiles/Application/WakeOnLan.cs index 1da3791597..8a3f71c520 100644 --- a/Source/NETworkManager.Profiles/Application/WakeOnLan.cs +++ b/Source/NETworkManager.Profiles/Application/WakeOnLan.cs @@ -1,21 +1,20 @@ -using NETworkManager.Models.Network; +using System.Net; +using NETworkManager.Models.Network; using NETworkManager.Settings; -using System.Net; -namespace NETworkManager.Profiles.Application +namespace NETworkManager.Profiles.Application; + +public static class WakeOnLAN { - public static class WakeOnLAN + public static WakeOnLANInfo CreateInfo(ProfileInfo profileInfo) { - public static WakeOnLANInfo CreateInfo(ProfileInfo profileInfo) + var info = new WakeOnLANInfo { - var info = new WakeOnLANInfo - { - MagicPacket = Models.Network.WakeOnLAN.CreateMagicPacket(profileInfo.WakeOnLAN_MACAddress), - Broadcast = IPAddress.Parse(profileInfo.WakeOnLAN_Broadcast), - Port = profileInfo.WakeOnLAN_OverridePort ? profileInfo.WakeOnLAN_Port : SettingsManager.Current.WakeOnLAN_Port - }; + MagicPacket = Models.Network.WakeOnLAN.CreateMagicPacket(profileInfo.WakeOnLAN_MACAddress), + Broadcast = IPAddress.Parse(profileInfo.WakeOnLAN_Broadcast), + Port = SettingsManager.Current.WakeOnLAN_Port + }; - return info; - } + return info; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/Application/WebConsole.cs b/Source/NETworkManager.Profiles/Application/WebConsole.cs index 34ae3fc1fe..e1f990c49d 100644 --- a/Source/NETworkManager.Profiles/Application/WebConsole.cs +++ b/Source/NETworkManager.Profiles/Application/WebConsole.cs @@ -1,17 +1,17 @@ using NETworkManager.Models.WebConsole; +using NETworkManager.Utilities; -namespace NETworkManager.Profiles.Application +namespace NETworkManager.Profiles.Application; + +public class WebConsole { - public class WebConsole - { - public static WebConsoleSessionInfo CreateSessionInfo(ProfileInfo profileInfo) + public static WebConsoleSessionInfo CreateSessionInfo(ProfileInfo profileInfo) + { + var info = new WebConsoleSessionInfo { - var info = new WebConsoleSessionInfo - { - Url = profileInfo.WebConsole_Url - }; + Url = PlaceholderHelper.Resolve(profileInfo.WebConsole_Url, (PlaceholderHelper.Host, profileInfo.Host)) + }; - return info; - } + return info; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/CsvProfileImportParser.cs b/Source/NETworkManager.Profiles/CsvProfileImportParser.cs new file mode 100644 index 0000000000..8266339156 --- /dev/null +++ b/Source/NETworkManager.Profiles/CsvProfileImportParser.cs @@ -0,0 +1,182 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Security.Cryptography; +using System.Text; + +namespace NETworkManager.Profiles; + +/// +/// Parses a CSV file into s. +/// Expected format: Name;Host with an optional third Description column. +/// The delimiter (;, , or tab) is auto-detected and an optional header row is skipped. +/// +public static class CsvProfileImportParser +{ + private static readonly char[] SupportedDelimiters = [';', ',', '\t']; + + /// + /// Reads the given CSV file and returns one candidate per usable row. + /// + /// Path to the CSV file. + /// + /// Description used when a row does not provide its own (third column). May be empty. + /// + public static IReadOnlyList Parse(string filePath, string fallbackDescription = null) + { + var candidates = new List(); + + var lines = File.ReadAllLines(filePath); + + var delimiter = DetectDelimiter(lines); + var headerChecked = false; + + foreach (var line in lines) + { + if (string.IsNullOrWhiteSpace(line)) + continue; + + var fields = ParseLine(line, delimiter); + + var name = fields.Count > 0 ? fields[0].Trim() : string.Empty; + var host = fields.Count > 1 ? fields[1].Trim() : string.Empty; + var description = fields.Count > 2 ? fields[2].Trim() : string.Empty; + + // Skip an optional header row (only checked on the first non-empty line). + if (!headerChecked) + { + headerChecked = true; + + if (IsHeaderRow(name, host)) + continue; + } + + // Ignore completely empty rows. + if (string.IsNullOrEmpty(name) && string.IsNullOrEmpty(host)) + continue; + + // Fall back to the host as name so we never create a nameless profile. + if (string.IsNullOrEmpty(name)) + name = host; + + candidates.Add(new ProfileImportCandidate( + name: name, + host: host, + description: !string.IsNullOrEmpty(description) ? description : fallbackDescription, + importSource: ProfileImportSource.Csv, + importSourceId: BuildImportSourceId(name, host))); + } + + return candidates; + } + + /// + /// Builds a stable duplicate-detection key from the import source and a hash of name + host. + /// + private static string BuildImportSourceId(string name, string host) + { + var raw = $"Csv|{name.Trim().ToLowerInvariant()}|{host.Trim().ToLowerInvariant()}"; + var hash = SHA256.HashData(Encoding.UTF8.GetBytes(raw)); + + return Convert.ToHexString(hash).ToLowerInvariant(); + } + + /// + /// Picks the delimiter that occurs most often on the first non-empty line. + /// + private static char DetectDelimiter(IReadOnlyList lines) + { + foreach (var line in lines) + { + if (string.IsNullOrWhiteSpace(line)) + continue; + + var bestDelimiter = SupportedDelimiters[0]; + var bestCount = 0; + + foreach (var delimiter in SupportedDelimiters) + { + var count = 0; + + foreach (var c in line) + if (c == delimiter) + count++; + + if (count <= bestCount) + continue; + + bestCount = count; + bestDelimiter = delimiter; + } + + return bestDelimiter; + } + + return SupportedDelimiters[0]; + } + + /// + /// Detects whether the first row is a header (e.g. Name;Host). + /// + private static bool IsHeaderRow(string firstField, string secondField) + { + return string.Equals(firstField, "Name", StringComparison.OrdinalIgnoreCase) && + (string.Equals(secondField, "Host", StringComparison.OrdinalIgnoreCase) || + string.Equals(secondField, "Host/IP", StringComparison.OrdinalIgnoreCase) || + string.Equals(secondField, "Hostname", StringComparison.OrdinalIgnoreCase) || + string.Equals(secondField, "IP", StringComparison.OrdinalIgnoreCase)); + } + + /// + /// Splits a single CSV line by the given delimiter, honoring double-quoted fields. + /// + private static List ParseLine(string line, char delimiter) + { + var fields = new List(); + var builder = new StringBuilder(); + var inQuotes = false; + + for (var i = 0; i < line.Length; i++) + { + var c = line[i]; + + if (inQuotes) + { + if (c == '"') + { + // Escaped quote ("") inside a quoted field. + if (i + 1 < line.Length && line[i + 1] == '"') + { + builder.Append('"'); + i++; + } + else + { + inQuotes = false; + } + } + else + { + builder.Append(c); + } + } + else if (c == '"') + { + inQuotes = true; + } + else if (c == delimiter) + { + fields.Add(builder.ToString()); + builder.Clear(); + } + else + { + builder.Append(c); + } + } + + fields.Add(builder.ToString()); + + return fields; + } +} diff --git a/Source/NETworkManager.Profiles/GroupEditMode.cs b/Source/NETworkManager.Profiles/GroupEditMode.cs index 99da6314af..31bd52f2ff 100644 --- a/Source/NETworkManager.Profiles/GroupEditMode.cs +++ b/Source/NETworkManager.Profiles/GroupEditMode.cs @@ -1,8 +1,7 @@ -namespace NETworkManager.Profiles +namespace NETworkManager.Profiles; + +public enum GroupEditMode { - public enum GroupEditMode - { - Add, - Edit - } -} + Add, + Edit +} \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/GroupInfo.cs b/Source/NETworkManager.Profiles/GroupInfo.cs index 98daf063fa..4842bcccc2 100644 --- a/Source/NETworkManager.Profiles/GroupInfo.cs +++ b/Source/NETworkManager.Profiles/GroupInfo.cs @@ -1,4 +1,5 @@ -using NETworkManager.Models.PowerShell; +using NETworkManager.Models.Network; +using NETworkManager.Models.PowerShell; using NETworkManager.Models.PuTTY; using NETworkManager.Models.RemoteDesktop; using NETworkManager.Settings; @@ -6,218 +7,312 @@ using System.Security; using System.Xml.Serialization; -namespace NETworkManager.Profiles +namespace NETworkManager.Profiles; + +/// +/// Class represents a group. +/// +public class GroupInfo { /// - /// Class represents a group. + /// Initializes a new instance of the class. /// - public class GroupInfo + public GroupInfo() { - /// - /// Name of the group. - /// - public string Name { get; set; } - - [XmlIgnore] - public new List Profiles { get; set; } - - public bool RemoteDesktop_Enabled { get; set; } - public bool RemoteDesktop_UseCredentials { get; set; } - public string RemoteDesktop_Username { get; set; } - - [XmlIgnore] - public SecureString RemoteDesktop_Password { get; set; } - public bool RemoteDesktop_OverrideDisplay { get; set; } - public bool RemoteDesktop_AdjustScreenAutomatically { get; set; } - public bool RemoteDesktop_UseCurrentViewSize { get; set; } - public bool RemoteDesktop_UseFixedScreenSize { get; set; } = true; - public int RemoteDesktop_ScreenWidth { get; set; } = GlobalStaticConfiguration.RemoteDesktop_ScreenWidth; - public int RemoteDesktop_ScreenHeight { get; set; } = GlobalStaticConfiguration.RemoteDesktop_ScreenHeight; - public bool RemoteDesktop_UseCustomScreenSize { get; set; } - public int RemoteDesktop_CustomScreenWidth { get; set; } - public int RemoteDesktop_CustomScreenHeight { get; set; } - public bool RemoteDesktop_OverrideColorDepth { get; set; } - public int RemoteDesktop_ColorDepth { get; set; } = GlobalStaticConfiguration.RemoteDesktop_ColorDepth; - public bool RemoteDesktop_OverridePort { get; set; } - public int RemoteDesktop_Port { get; set; } = GlobalStaticConfiguration.RemoteDesktop_Port; - public bool RemoteDesktop_OverrideCredSspSupport { get; set; } - public bool RemoteDesktop_EnableCredSspSupport { get; set; } - public bool RemoteDesktop_OverrideAuthenticationLevel { get; set; } - public uint RemoteDesktop_AuthenticationLevel { get; set; } = GlobalStaticConfiguration.RemoteDesktop_AuthenticationLevel; - public bool RemoteDesktop_OverrideAudioRedirectionMode { get; set; } - public AudioRedirectionMode RemoteDesktop_AudioRedirectionMode { get; set; } = GlobalStaticConfiguration.RemoteDesktop_AudioRedirectionMode; - public bool RemoteDesktop_OverrideAudioCaptureRedirectionMode { get; set; } - public AudioCaptureRedirectionMode RemoteDesktop_AudioCaptureRedirectionMode { get; set; } = GlobalStaticConfiguration.RemoteDesktop_AudioCaptureRedirectionMode; - public bool RemoteDesktop_OverrideApplyWindowsKeyCombinations { get; set; } - public KeyboardHookMode RemoteDesktop_KeyboardHookMode { get; set; } = GlobalStaticConfiguration.RemoteDesktop_KeyboardHookMode; - public bool RemoteDesktop_OverrideRedirectClipboard { get; set; } - public bool RemoteDesktop_RedirectClipboard { get; set; } = true; - public bool RemoteDesktop_OverrideRedirectDevices { get; set; } - public bool RemoteDesktop_RedirectDevices { get; set; } - public bool RemoteDesktop_OverrideRedirectDrives { get; set; } - public bool RemoteDesktop_RedirectDrives { get; set; } - public bool RemoteDesktop_OverrideRedirectPorts { get; set; } - public bool RemoteDesktop_RedirectPorts { get; set; } - public bool RemoteDesktop_OverrideRedirectSmartcards { get; set; } - public bool RemoteDesktop_RedirectSmartCards { get; set; } - public bool RemoteDesktop_OverrideRedirectPrinters { get; set; } - public bool RemoteDesktop_RedirectPrinters { get; set; } - public bool RemoteDesktop_OverridePersistentBitmapCaching { get; set; } - public bool RemoteDesktop_PersistentBitmapCaching { get; set; } - public bool RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped { get; set; } - public bool RemoteDesktop_ReconnectIfTheConnectionIsDropped { get; set; } - public bool RemoteDesktop_OverrideNetworkConnectionType { get; set; } - public NetworkConnectionType RemoteDesktop_NetworkConnectionType { get; set; } - public bool RemoteDesktop_OverrideDesktopBackground { get; set; } - public bool RemoteDesktop_DesktopBackground { get; set; } - public bool RemoteDesktop_OverrideFontSmoothing { get; set; } - public bool RemoteDesktop_FontSmoothing { get; set; } - public bool RemoteDesktop_OverrideDesktopComposition { get; set; } - public bool RemoteDesktop_DesktopComposition { get; set; } - public bool RemoteDesktop_OverrideShowWindowContentsWhileDragging { get; set; } - public bool RemoteDesktop_ShowWindowContentsWhileDragging { get; set; } - public bool RemoteDesktop_OverrideMenuAndWindowAnimation { get; set; } - public bool RemoteDesktop_MenuAndWindowAnimation { get; set; } - public bool RemoteDesktop_OverrideVisualStyles { get; set; } - public bool RemoteDesktop_VisualStyles { get; set; } - - public bool PowerShell_Enabled { get; set; } - public bool PowerShell_OverrideAdditionalCommandLine { get; set; } - public string PowerShell_AdditionalCommandLine { get; set; } - public bool PowerShell_OverrideExecutionPolicy { get; set; } - public PowerShell.ExecutionPolicy PowerShell_ExecutionPolicy { get; set; } - - public bool PuTTY_Enabled { get; set; } - public bool PuTTY_OverrideUsername { get; set; } - public string PuTTY_Username { get; set; } - public bool PuTTY_OverridePrivateKeyFile { get; set; } - public string PuTTY_PrivateKeyFile { get; set; } - public bool PuTTY_OverrideProfile { get; set; } - public string PuTTY_Profile { get; set; } - public bool PuTTY_OverrideEnableLog { get; set; } - public bool PuTTY_EnableLog { get; set; } - public bool PuTTY_OverrideLogMode { get; set; } - public LogMode PuTTY_LogMode { get; set; } = GlobalStaticConfiguration.PuTTY_LogMode; - public bool PuTTY_OverrideLogPath { get; set; } - public string PuTTY_LogPath { get; set; } = GlobalStaticConfiguration.PuTTY_LogPath; - public bool PuTTY_OverrideLogFileName { get; set; } - public string PuTTY_LogFileName { get; set; } = GlobalStaticConfiguration.PuTTY_LogFileName; - public bool PuTTY_OverrideAdditionalCommandLine { get; set; } - public string PuTTY_AdditionalCommandLine { get; set; } - - public bool TigerVNC_Enabled { get; set; } - public bool TigerVNC_OverridePort { get; set; } - public int TigerVNC_Port { get; set; } - - - /// - /// Initializes a new instance of the class. - /// - public GroupInfo() - { - Profiles = new List(); - } - - /// - /// Initializes a new instance of the class with name. - /// - public GroupInfo(string name) : this() - { - Name = name; - } - - /// - /// Initializes a new instance of the class with properties. - /// - public GroupInfo(GroupInfo group) : this(group.Name) - { - Profiles = group.Profiles; - - RemoteDesktop_Enabled = group.RemoteDesktop_Enabled; - RemoteDesktop_UseCredentials = group.RemoteDesktop_UseCredentials; - RemoteDesktop_Username = group.RemoteDesktop_Username; - RemoteDesktop_Password = group.RemoteDesktop_Password; - RemoteDesktop_OverrideDisplay = group.RemoteDesktop_OverrideDisplay; - RemoteDesktop_AdjustScreenAutomatically = group.RemoteDesktop_AdjustScreenAutomatically; - RemoteDesktop_UseCurrentViewSize = group.RemoteDesktop_UseCurrentViewSize; - RemoteDesktop_UseFixedScreenSize = group.RemoteDesktop_UseFixedScreenSize; - RemoteDesktop_ScreenWidth = group.RemoteDesktop_ScreenWidth; - RemoteDesktop_ScreenHeight = group.RemoteDesktop_ScreenHeight; - RemoteDesktop_UseCustomScreenSize = group.RemoteDesktop_UseCustomScreenSize; - RemoteDesktop_CustomScreenWidth = group.RemoteDesktop_CustomScreenWidth; - RemoteDesktop_CustomScreenHeight = group.RemoteDesktop_CustomScreenHeight; - RemoteDesktop_OverrideColorDepth = group.RemoteDesktop_OverrideColorDepth; - RemoteDesktop_ColorDepth = group.RemoteDesktop_ColorDepth; - RemoteDesktop_OverridePort = group.RemoteDesktop_OverridePort; - RemoteDesktop_Port = group.RemoteDesktop_Port; - RemoteDesktop_OverrideCredSspSupport = group.RemoteDesktop_OverrideCredSspSupport; - RemoteDesktop_EnableCredSspSupport = group.RemoteDesktop_EnableCredSspSupport; - RemoteDesktop_OverrideAuthenticationLevel = group.RemoteDesktop_OverrideAuthenticationLevel; - RemoteDesktop_AuthenticationLevel = group.RemoteDesktop_AuthenticationLevel; - RemoteDesktop_OverrideAudioRedirectionMode = group.RemoteDesktop_OverrideAudioRedirectionMode; - RemoteDesktop_AudioRedirectionMode = group.RemoteDesktop_AudioRedirectionMode; - RemoteDesktop_OverrideAudioCaptureRedirectionMode = group.RemoteDesktop_OverrideAudioCaptureRedirectionMode; - RemoteDesktop_AudioCaptureRedirectionMode = group.RemoteDesktop_AudioCaptureRedirectionMode; - RemoteDesktop_OverrideApplyWindowsKeyCombinations = group.RemoteDesktop_OverrideApplyWindowsKeyCombinations; - RemoteDesktop_KeyboardHookMode = group.RemoteDesktop_KeyboardHookMode; - RemoteDesktop_OverrideRedirectClipboard = group.RemoteDesktop_OverrideRedirectClipboard; - RemoteDesktop_RedirectClipboard = group.RemoteDesktop_RedirectClipboard; - RemoteDesktop_OverrideRedirectDevices = group.RemoteDesktop_OverrideRedirectDevices; - RemoteDesktop_RedirectDevices = group.RemoteDesktop_RedirectDevices; - RemoteDesktop_OverrideRedirectDrives = group.RemoteDesktop_OverrideRedirectDrives; - RemoteDesktop_RedirectDrives = group.RemoteDesktop_RedirectDrives; - RemoteDesktop_OverrideRedirectPorts = group.RemoteDesktop_OverrideRedirectPorts; - RemoteDesktop_RedirectPorts = group.RemoteDesktop_RedirectPorts; - RemoteDesktop_OverrideRedirectSmartcards = group.RemoteDesktop_OverrideRedirectSmartcards; - RemoteDesktop_RedirectSmartCards = group.RemoteDesktop_RedirectSmartCards; - RemoteDesktop_OverrideRedirectPrinters = group.RemoteDesktop_OverrideRedirectPrinters; - RemoteDesktop_RedirectPrinters = group.RemoteDesktop_RedirectPrinters; - RemoteDesktop_OverridePersistentBitmapCaching = group.RemoteDesktop_OverridePersistentBitmapCaching; - RemoteDesktop_PersistentBitmapCaching = group.RemoteDesktop_PersistentBitmapCaching; - RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped = group.RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped; - RemoteDesktop_ReconnectIfTheConnectionIsDropped = group.RemoteDesktop_ReconnectIfTheConnectionIsDropped; - RemoteDesktop_OverrideNetworkConnectionType = group.RemoteDesktop_OverrideNetworkConnectionType; - RemoteDesktop_NetworkConnectionType = group.RemoteDesktop_NetworkConnectionType; - RemoteDesktop_OverrideDesktopBackground = group.RemoteDesktop_OverrideDesktopBackground; - RemoteDesktop_DesktopBackground = group.RemoteDesktop_DesktopBackground; - RemoteDesktop_OverrideFontSmoothing = group.RemoteDesktop_OverrideFontSmoothing; - RemoteDesktop_FontSmoothing = group.RemoteDesktop_FontSmoothing; - RemoteDesktop_OverrideDesktopComposition = group.RemoteDesktop_OverrideDesktopComposition; - RemoteDesktop_DesktopComposition = group.RemoteDesktop_DesktopComposition; - RemoteDesktop_OverrideShowWindowContentsWhileDragging = group.RemoteDesktop_OverrideShowWindowContentsWhileDragging; - RemoteDesktop_ShowWindowContentsWhileDragging = group.RemoteDesktop_ShowWindowContentsWhileDragging; - RemoteDesktop_OverrideMenuAndWindowAnimation = group.RemoteDesktop_OverrideMenuAndWindowAnimation; - RemoteDesktop_MenuAndWindowAnimation = group.RemoteDesktop_MenuAndWindowAnimation; - RemoteDesktop_OverrideVisualStyles = group.RemoteDesktop_OverrideVisualStyles; - RemoteDesktop_VisualStyles = group.RemoteDesktop_VisualStyles; - - PowerShell_Enabled = group.PowerShell_Enabled; - PowerShell_OverrideAdditionalCommandLine = group.PowerShell_OverrideAdditionalCommandLine; - PowerShell_AdditionalCommandLine = group.PowerShell_AdditionalCommandLine; - PowerShell_OverrideExecutionPolicy = group.PowerShell_OverrideExecutionPolicy; - PowerShell_ExecutionPolicy = group.PowerShell_ExecutionPolicy; - - PuTTY_Enabled = group.PuTTY_Enabled; - PuTTY_OverrideUsername = group.PuTTY_OverrideUsername; - PuTTY_Username = group.PuTTY_Username; - PuTTY_OverridePrivateKeyFile = group.PuTTY_OverridePrivateKeyFile; - PuTTY_PrivateKeyFile = group.PuTTY_PrivateKeyFile; - PuTTY_OverrideProfile = group.PuTTY_OverrideProfile; - PuTTY_Profile = group.PuTTY_Profile; - PuTTY_OverrideEnableLog = group.PuTTY_OverrideEnableLog; - PuTTY_EnableLog = group.PuTTY_EnableLog; - PuTTY_OverrideLogMode = group.PuTTY_OverrideLogMode; - PuTTY_LogMode = group.PuTTY_LogMode; - PuTTY_OverrideLogPath = group.PuTTY_OverrideLogPath; - PuTTY_LogPath = group.PuTTY_LogPath; - PuTTY_OverrideLogFileName = group.PuTTY_OverrideLogFileName; - PuTTY_LogFileName = group.PuTTY_LogFileName; - PuTTY_OverrideAdditionalCommandLine = group.PuTTY_OverrideAdditionalCommandLine; - PuTTY_AdditionalCommandLine = group.PuTTY_AdditionalCommandLine; - - TigerVNC_Enabled = group.TigerVNC_Enabled; - TigerVNC_OverridePort = group.TigerVNC_OverridePort; - TigerVNC_Port = group.TigerVNC_Port; - } + Profiles = []; } + + /// + /// Initializes a new instance of the class with name. + /// + public GroupInfo(string name) : this() + { + Name = name; + } + + /// + /// Initializes a new instance of the class with properties. + /// + public GroupInfo(GroupInfo group) : this(group.Name) + { + // General + Description = group.Description; + + // Profiles + Profiles = group.Profiles; + + // Remote Desktop + RemoteDesktop_UseCredentials = group.RemoteDesktop_UseCredentials; + RemoteDesktop_Username = group.RemoteDesktop_Username; + RemoteDesktop_Domain = group.RemoteDesktop_Domain; + RemoteDesktop_Password = group.RemoteDesktop_Password; + RemoteDesktop_AdminSession = group.RemoteDesktop_AdminSession; + RemoteDesktop_OverrideDisplay = group.RemoteDesktop_OverrideDisplay; + RemoteDesktop_AdjustScreenAutomatically = group.RemoteDesktop_AdjustScreenAutomatically; + RemoteDesktop_UseCurrentViewSize = group.RemoteDesktop_UseCurrentViewSize; + RemoteDesktop_UseFixedScreenSize = group.RemoteDesktop_UseFixedScreenSize; + RemoteDesktop_ScreenWidth = group.RemoteDesktop_ScreenWidth; + RemoteDesktop_ScreenHeight = group.RemoteDesktop_ScreenHeight; + RemoteDesktop_UseCustomScreenSize = group.RemoteDesktop_UseCustomScreenSize; + RemoteDesktop_CustomScreenWidth = group.RemoteDesktop_CustomScreenWidth; + RemoteDesktop_CustomScreenHeight = group.RemoteDesktop_CustomScreenHeight; + RemoteDesktop_OverrideColorDepth = group.RemoteDesktop_OverrideColorDepth; + RemoteDesktop_ColorDepth = group.RemoteDesktop_ColorDepth; + RemoteDesktop_OverridePort = group.RemoteDesktop_OverridePort; + RemoteDesktop_Port = group.RemoteDesktop_Port; + RemoteDesktop_OverrideViewOnly = group.RemoteDesktop_OverrideViewOnly; + RemoteDesktop_ViewOnly = group.RemoteDesktop_ViewOnly; + RemoteDesktop_OverrideCredSspSupport = group.RemoteDesktop_OverrideCredSspSupport; + RemoteDesktop_EnableCredSspSupport = group.RemoteDesktop_EnableCredSspSupport; + RemoteDesktop_OverrideAuthenticationLevel = group.RemoteDesktop_OverrideAuthenticationLevel; + RemoteDesktop_AuthenticationLevel = group.RemoteDesktop_AuthenticationLevel; + RemoteDesktop_OverrideGatewayServer = group.RemoteDesktop_OverrideGatewayServer; + RemoteDesktop_EnableGatewayServer = group.RemoteDesktop_EnableGatewayServer; + RemoteDesktop_GatewayServerHostname = group.RemoteDesktop_GatewayServerHostname; + RemoteDesktop_GatewayServerBypassLocalAddresses = group.RemoteDesktop_GatewayServerBypassLocalAddresses; + RemoteDesktop_GatewayServerLogonMethod = group.RemoteDesktop_GatewayServerLogonMethod; + RemoteDesktop_GatewayServerShareCredentialsWithRemoteComputer = + group.RemoteDesktop_GatewayServerShareCredentialsWithRemoteComputer; + RemoteDesktop_UseGatewayServerCredentials = group.RemoteDesktop_UseGatewayServerCredentials; + RemoteDesktop_GatewayServerUsername = group.RemoteDesktop_GatewayServerUsername; + RemoteDesktop_GatewayServerDomain = group.RemoteDesktop_GatewayServerDomain; + RemoteDesktop_GatewayServerPassword = group.RemoteDesktop_GatewayServerPassword; + RemoteDesktop_OverrideAudioRedirectionMode = group.RemoteDesktop_OverrideAudioRedirectionMode; + RemoteDesktop_AudioRedirectionMode = group.RemoteDesktop_AudioRedirectionMode; + RemoteDesktop_OverrideAudioCaptureRedirectionMode = group.RemoteDesktop_OverrideAudioCaptureRedirectionMode; + RemoteDesktop_AudioCaptureRedirectionMode = group.RemoteDesktop_AudioCaptureRedirectionMode; + RemoteDesktop_OverrideApplyWindowsKeyCombinations = group.RemoteDesktop_OverrideApplyWindowsKeyCombinations; + RemoteDesktop_KeyboardHookMode = group.RemoteDesktop_KeyboardHookMode; + RemoteDesktop_OverrideRedirectClipboard = group.RemoteDesktop_OverrideRedirectClipboard; + RemoteDesktop_RedirectClipboard = group.RemoteDesktop_RedirectClipboard; + RemoteDesktop_OverrideRedirectDevices = group.RemoteDesktop_OverrideRedirectDevices; + RemoteDesktop_RedirectDevices = group.RemoteDesktop_RedirectDevices; + RemoteDesktop_OverrideRedirectDrives = group.RemoteDesktop_OverrideRedirectDrives; + RemoteDesktop_RedirectDrives = group.RemoteDesktop_RedirectDrives; + RemoteDesktop_OverrideRedirectPorts = group.RemoteDesktop_OverrideRedirectPorts; + RemoteDesktop_RedirectPorts = group.RemoteDesktop_RedirectPorts; + RemoteDesktop_OverrideRedirectSmartcards = group.RemoteDesktop_OverrideRedirectSmartcards; + RemoteDesktop_RedirectSmartCards = group.RemoteDesktop_RedirectSmartCards; + RemoteDesktop_OverrideRedirectPrinters = group.RemoteDesktop_OverrideRedirectPrinters; + RemoteDesktop_RedirectPrinters = group.RemoteDesktop_RedirectPrinters; + RemoteDesktop_OverridePersistentBitmapCaching = group.RemoteDesktop_OverridePersistentBitmapCaching; + RemoteDesktop_PersistentBitmapCaching = group.RemoteDesktop_PersistentBitmapCaching; + RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped = + group.RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped; + RemoteDesktop_ReconnectIfTheConnectionIsDropped = group.RemoteDesktop_ReconnectIfTheConnectionIsDropped; + RemoteDesktop_OverrideNetworkConnectionType = group.RemoteDesktop_OverrideNetworkConnectionType; + RemoteDesktop_NetworkConnectionType = group.RemoteDesktop_NetworkConnectionType; + RemoteDesktop_OverrideDesktopBackground = group.RemoteDesktop_OverrideDesktopBackground; + RemoteDesktop_DesktopBackground = group.RemoteDesktop_DesktopBackground; + RemoteDesktop_OverrideFontSmoothing = group.RemoteDesktop_OverrideFontSmoothing; + RemoteDesktop_FontSmoothing = group.RemoteDesktop_FontSmoothing; + RemoteDesktop_OverrideDesktopComposition = group.RemoteDesktop_OverrideDesktopComposition; + RemoteDesktop_DesktopComposition = group.RemoteDesktop_DesktopComposition; + RemoteDesktop_OverrideShowWindowContentsWhileDragging = + group.RemoteDesktop_OverrideShowWindowContentsWhileDragging; + RemoteDesktop_ShowWindowContentsWhileDragging = group.RemoteDesktop_ShowWindowContentsWhileDragging; + RemoteDesktop_OverrideMenuAndWindowAnimation = group.RemoteDesktop_OverrideMenuAndWindowAnimation; + RemoteDesktop_MenuAndWindowAnimation = group.RemoteDesktop_MenuAndWindowAnimation; + RemoteDesktop_OverrideVisualStyles = group.RemoteDesktop_OverrideVisualStyles; + RemoteDesktop_VisualStyles = group.RemoteDesktop_VisualStyles; + + // PowerShell + PowerShell_OverrideCommand = group.PowerShell_OverrideCommand; + PowerShell_Command = group.PowerShell_Command; + PowerShell_OverrideAdditionalCommandLine = group.PowerShell_OverrideAdditionalCommandLine; + PowerShell_AdditionalCommandLine = group.PowerShell_AdditionalCommandLine; + PowerShell_OverrideExecutionPolicy = group.PowerShell_OverrideExecutionPolicy; + PowerShell_ExecutionPolicy = group.PowerShell_ExecutionPolicy; + + // PuTTY + PuTTY_OverrideUsername = group.PuTTY_OverrideUsername; + PuTTY_Username = group.PuTTY_Username; + PuTTY_OverridePrivateKeyFile = group.PuTTY_OverridePrivateKeyFile; + PuTTY_PrivateKeyFile = group.PuTTY_PrivateKeyFile; + PuTTY_OverrideProfile = group.PuTTY_OverrideProfile; + PuTTY_Profile = group.PuTTY_Profile; + PuTTY_OverrideEnableLog = group.PuTTY_OverrideEnableLog; + PuTTY_EnableLog = group.PuTTY_EnableLog; + PuTTY_OverrideLogMode = group.PuTTY_OverrideLogMode; + PuTTY_LogMode = group.PuTTY_LogMode; + PuTTY_OverrideLogPath = group.PuTTY_OverrideLogPath; + PuTTY_LogPath = group.PuTTY_LogPath; + PuTTY_OverrideLogFileName = group.PuTTY_OverrideLogFileName; + PuTTY_LogFileName = group.PuTTY_LogFileName; + PuTTY_OverrideAdditionalCommandLine = group.PuTTY_OverrideAdditionalCommandLine; + PuTTY_AdditionalCommandLine = group.PuTTY_AdditionalCommandLine; + + // TigerVNC + TigerVNC_OverridePort = group.TigerVNC_OverridePort; + TigerVNC_Port = group.TigerVNC_Port; + + // SNMP + SNMP_OverrideOIDAndMode = group.SNMP_OverrideOIDAndMode; + SNMP_OID = group.SNMP_OID; + SNMP_Mode = group.SNMP_Mode; + SNMP_OverrideVersionAndAuth = group.SNMP_OverrideVersionAndAuth; + SNMP_Version = group.SNMP_Version; + SNMP_Community = group.SNMP_Community; + SNMP_Security = group.SNMP_Security; + SNMP_Username = group.SNMP_Username; + SNMP_AuthenticationProvider = group.SNMP_AuthenticationProvider; + SNMP_Auth = group.SNMP_Auth; + SNMP_PrivacyProvider = group.SNMP_PrivacyProvider; + SNMP_Priv = group.SNMP_Priv; + } + + /// + /// Name of the group. + /// + public string Name { get; set; } + + /// + /// Description of the group. + /// + public string Description { get; set; } + + [XmlIgnore] public bool IsDynamic { get; set; } + + [XmlIgnore] public List Profiles { get; set; } + + public bool RemoteDesktop_UseCredentials { get; set; } + public string RemoteDesktop_Username { get; set; } + public string RemoteDesktop_Domain { get; set; } + + [XmlIgnore] public SecureString RemoteDesktop_Password { get; set; } + + public bool RemoteDesktop_AdminSession { get; set; } + public bool RemoteDesktop_OverrideDisplay { get; set; } + public bool RemoteDesktop_AdjustScreenAutomatically { get; set; } + + public bool RemoteDesktop_UseCurrentViewSize { get; set; } = + GlobalStaticConfiguration.RemoteDesktop_UseCurrentViewSize; + + public bool RemoteDesktop_UseFixedScreenSize { get; set; } + public int RemoteDesktop_ScreenWidth { get; set; } = GlobalStaticConfiguration.RemoteDesktop_ScreenWidth; + public int RemoteDesktop_ScreenHeight { get; set; } = GlobalStaticConfiguration.RemoteDesktop_ScreenHeight; + public bool RemoteDesktop_UseCustomScreenSize { get; set; } + public int RemoteDesktop_CustomScreenWidth { get; set; } + public int RemoteDesktop_CustomScreenHeight { get; set; } + public bool RemoteDesktop_OverrideColorDepth { get; set; } + public int RemoteDesktop_ColorDepth { get; set; } = GlobalStaticConfiguration.RemoteDesktop_ColorDepth; + public bool RemoteDesktop_OverridePort { get; set; } + public int RemoteDesktop_Port { get; set; } = GlobalStaticConfiguration.RemoteDesktop_Port; + public bool RemoteDesktop_OverrideViewOnly { get; set; } + public bool RemoteDesktop_ViewOnly { get; set; } = GlobalStaticConfiguration.RemoteDesktop_ViewOnly; + public bool RemoteDesktop_OverrideCredSspSupport { get; set; } + public bool RemoteDesktop_EnableCredSspSupport { get; set; } + public bool RemoteDesktop_OverrideAuthenticationLevel { get; set; } + + public uint RemoteDesktop_AuthenticationLevel { get; set; } = + GlobalStaticConfiguration.RemoteDesktop_AuthenticationLevel; + + public bool RemoteDesktop_OverrideGatewayServer { get; set; } + public bool RemoteDesktop_EnableGatewayServer { get; set; } + public string RemoteDesktop_GatewayServerHostname { get; set; } + + public bool RemoteDesktop_GatewayServerBypassLocalAddresses { get; set; } = + GlobalStaticConfiguration.RemoteDesktop_GatewayServerBypassLocalAddresses; + + public GatewayUserSelectedCredsSource RemoteDesktop_GatewayServerLogonMethod { get; set; } = + GlobalStaticConfiguration.RemoteDesktop_GatewayServerLogonMethod; + + public bool RemoteDesktop_GatewayServerShareCredentialsWithRemoteComputer { get; set; } = + GlobalStaticConfiguration.RemoteDesktop_GatewayServerShareCredentialsWithRemoteComputer; + + public bool RemoteDesktop_UseGatewayServerCredentials { get; set; } + public string RemoteDesktop_GatewayServerUsername { get; set; } + public string RemoteDesktop_GatewayServerDomain { get; set; } + + [XmlIgnore] public SecureString RemoteDesktop_GatewayServerPassword { get; set; } + public bool RemoteDesktop_OverrideAudioRedirectionMode { get; set; } + + public AudioRedirectionMode RemoteDesktop_AudioRedirectionMode { get; set; } = + GlobalStaticConfiguration.RemoteDesktop_AudioRedirectionMode; + + public bool RemoteDesktop_OverrideAudioCaptureRedirectionMode { get; set; } + + public AudioCaptureRedirectionMode RemoteDesktop_AudioCaptureRedirectionMode { get; set; } = + GlobalStaticConfiguration.RemoteDesktop_AudioCaptureRedirectionMode; + + public bool RemoteDesktop_OverrideApplyWindowsKeyCombinations { get; set; } + + public KeyboardHookMode RemoteDesktop_KeyboardHookMode { get; set; } = + GlobalStaticConfiguration.RemoteDesktop_KeyboardHookMode; + + public bool RemoteDesktop_OverrideRedirectClipboard { get; set; } + public bool RemoteDesktop_RedirectClipboard { get; set; } = true; + public bool RemoteDesktop_OverrideRedirectDevices { get; set; } + public bool RemoteDesktop_RedirectDevices { get; set; } + public bool RemoteDesktop_OverrideRedirectDrives { get; set; } + public bool RemoteDesktop_RedirectDrives { get; set; } + public bool RemoteDesktop_OverrideRedirectPorts { get; set; } + public bool RemoteDesktop_RedirectPorts { get; set; } + public bool RemoteDesktop_OverrideRedirectSmartcards { get; set; } + public bool RemoteDesktop_RedirectSmartCards { get; set; } + public bool RemoteDesktop_OverrideRedirectPrinters { get; set; } + public bool RemoteDesktop_RedirectPrinters { get; set; } + public bool RemoteDesktop_OverridePersistentBitmapCaching { get; set; } + public bool RemoteDesktop_PersistentBitmapCaching { get; set; } + public bool RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped { get; set; } + public bool RemoteDesktop_ReconnectIfTheConnectionIsDropped { get; set; } + public bool RemoteDesktop_OverrideNetworkConnectionType { get; set; } + public NetworkConnectionType RemoteDesktop_NetworkConnectionType { get; set; } + public bool RemoteDesktop_OverrideDesktopBackground { get; set; } + public bool RemoteDesktop_DesktopBackground { get; set; } + public bool RemoteDesktop_OverrideFontSmoothing { get; set; } + public bool RemoteDesktop_FontSmoothing { get; set; } + public bool RemoteDesktop_OverrideDesktopComposition { get; set; } + public bool RemoteDesktop_DesktopComposition { get; set; } + public bool RemoteDesktop_OverrideShowWindowContentsWhileDragging { get; set; } + public bool RemoteDesktop_ShowWindowContentsWhileDragging { get; set; } + public bool RemoteDesktop_OverrideMenuAndWindowAnimation { get; set; } + public bool RemoteDesktop_MenuAndWindowAnimation { get; set; } + public bool RemoteDesktop_OverrideVisualStyles { get; set; } + public bool RemoteDesktop_VisualStyles { get; set; } + + public bool PowerShell_OverrideCommand { get; set; } + public string PowerShell_Command { get; set; } + public bool PowerShell_OverrideAdditionalCommandLine { get; set; } + public string PowerShell_AdditionalCommandLine { get; set; } + public bool PowerShell_OverrideExecutionPolicy { get; set; } + + public ExecutionPolicy PowerShell_ExecutionPolicy { get; set; } = + GlobalStaticConfiguration.PowerShell_ExecutionPolicy; + + public bool PuTTY_OverrideUsername { get; set; } + public string PuTTY_Username { get; set; } + public bool PuTTY_OverridePrivateKeyFile { get; set; } + public string PuTTY_PrivateKeyFile { get; set; } + public bool PuTTY_OverrideProfile { get; set; } + public string PuTTY_Profile { get; set; } + public bool PuTTY_OverrideEnableLog { get; set; } + public bool PuTTY_EnableLog { get; set; } + public bool PuTTY_OverrideLogMode { get; set; } + public LogMode PuTTY_LogMode { get; set; } = GlobalStaticConfiguration.PuTTY_LogMode; + public bool PuTTY_OverrideLogPath { get; set; } + public string PuTTY_LogPath { get; set; } = GlobalStaticConfiguration.PuTTY_LogPath; + public bool PuTTY_OverrideLogFileName { get; set; } + public string PuTTY_LogFileName { get; set; } = GlobalStaticConfiguration.PuTTY_LogFileName; + public bool PuTTY_OverrideAdditionalCommandLine { get; set; } + public string PuTTY_AdditionalCommandLine { get; set; } + + public bool TigerVNC_OverridePort { get; set; } + public int TigerVNC_Port { get; set; } = GlobalStaticConfiguration.TigerVNC_DefaultVNCPort; + + public bool SNMP_OverrideOIDAndMode { get; set; } + public string SNMP_OID { get; set; } + public SNMPMode SNMP_Mode { get; set; } = GlobalStaticConfiguration.SNMP_Mode; + public bool SNMP_OverrideVersionAndAuth { get; set; } + public SNMPVersion SNMP_Version { get; set; } = GlobalStaticConfiguration.SNMP_Version; + [XmlIgnore] public SecureString SNMP_Community { get; set; } + public SNMPV3Security SNMP_Security { get; set; } = GlobalStaticConfiguration.SNMP_Security; + public string SNMP_Username { get; set; } + + public SNMPV3AuthenticationProvider SNMP_AuthenticationProvider { get; set; } = + GlobalStaticConfiguration.SNMP_AuthenticationProvider; + + [XmlIgnore] public SecureString SNMP_Auth { get; set; } + public SNMPV3PrivacyProvider SNMP_PrivacyProvider { get; set; } = GlobalStaticConfiguration.SNMP_PrivacyProvider; + [XmlIgnore] public SecureString SNMP_Priv { get; set; } } diff --git a/Source/NETworkManager.Profiles/GroupInfoSerializable.cs b/Source/NETworkManager.Profiles/GroupInfoSerializable.cs index 5ae37c6cf7..01e9a03aa1 100644 --- a/Source/NETworkManager.Profiles/GroupInfoSerializable.cs +++ b/Source/NETworkManager.Profiles/GroupInfoSerializable.cs @@ -1,27 +1,45 @@ using System.Collections.Generic; -namespace NETworkManager.Profiles +namespace NETworkManager.Profiles; + +public class GroupInfoSerializable : GroupInfo { - public class GroupInfoSerializable : GroupInfo + public GroupInfoSerializable() + { + } + + public GroupInfoSerializable(GroupInfo profileGroup) : base(profileGroup) { - /// - /// Override the default profiles to make it serializable. - /// - public List Profiles { get; set; } - /// - /// Override the default remote desktop password to make it serializable. - /// - public string RemoteDesktop_Password { get; set; } + } - public GroupInfoSerializable() - { + /// + /// Override the default profiles to make it serializable. + /// + public new List Profiles { get; set; } - } + /// + /// Override the default remote desktop password to make it serializable. + /// + public new string RemoteDesktop_Password { get; set; } - public GroupInfoSerializable(GroupInfo profileGroup) : base(profileGroup) - { + /// + /// Override the default remote desktop gateway password to make it serializable. + /// + public new string RemoteDesktop_GatewayServerPassword { get; set; } - } - } -} + /// + /// Override the default snmp community to make it serializable. + /// + public new string SNMP_Community { get; set; } + + /// + /// Override the default snmp auth to make it serializable. + /// + public new string SNMP_Auth { get; set; } + + /// + /// Override the default snmp priv to make it serializable. + /// + public new string SNMP_Priv { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/GroupViewInfo.cs b/Source/NETworkManager.Profiles/GroupViewInfo.cs index 49918729d7..6975f184e4 100644 --- a/Source/NETworkManager.Profiles/GroupViewInfo.cs +++ b/Source/NETworkManager.Profiles/GroupViewInfo.cs @@ -1,30 +1,29 @@ using System.Windows; using System.Windows.Controls; -namespace NETworkManager.Profiles +namespace NETworkManager.Profiles; + +public class GroupViewInfo { - public class GroupViewInfo + public GroupViewInfo() { - public GroupViewName Name { get; set; } + } - public Canvas Icon { get; set; } + public GroupViewInfo(GroupViewName name, Canvas icon) + { + Name = name; + Icon = icon; + } - public GroupViewInfo() - { - } + public GroupViewInfo(GroupViewName name, UIElement uiElement) + { + Name = name; + var canvas = new Canvas(); + canvas.Children.Add(uiElement); + Icon = canvas; + } - public GroupViewInfo(GroupViewName name, Canvas icon) - { - Name = name; - Icon = icon; - } + public GroupViewName Name { get; set; } - public GroupViewInfo(GroupViewName name, UIElement uiElement) - { - Name = name; - var canvas = new Canvas(); - canvas.Children.Add(uiElement); - Icon = canvas; - } - } -} + public Canvas Icon { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/GroupViewManager.cs b/Source/NETworkManager.Profiles/GroupViewManager.cs index 24e4bea141..4d3a910e75 100644 --- a/Source/NETworkManager.Profiles/GroupViewManager.cs +++ b/Source/NETworkManager.Profiles/GroupViewManager.cs @@ -1,22 +1,22 @@ -using MahApps.Metro.IconPacks; +using System.Collections.Generic; +using MahApps.Metro.IconPacks; using NETworkManager.Models; -using System.Collections.Generic; -namespace NETworkManager.Profiles +namespace NETworkManager.Profiles; + +public static class GroupViewManager { - public static class GroupViewManager - { - // List of all applications - public static List List => new List - { - // General - new GroupViewInfo(GroupViewName.General, new PackIconModern{ Kind = PackIconModernKind.Box }), + // List of all applications + public static List List => + [ + // General + new GroupViewInfo(GroupViewName.General, new PackIconModern { Kind = PackIconModernKind.Box }), - // Applications - new GroupViewInfo(GroupViewName.RemoteDesktop, ApplicationManager.GetIcon(ApplicationName.RemoteDesktop)), - new GroupViewInfo(GroupViewName.PowerShell, ApplicationManager.GetIcon(ApplicationName.PowerShell)), - new GroupViewInfo(GroupViewName.PuTTY, ApplicationManager.GetIcon(ApplicationName.PuTTY)), - new GroupViewInfo(GroupViewName.TigerVNC, ApplicationManager.GetIcon(ApplicationName.TigerVNC)) - }; - } -} + // Applications + new GroupViewInfo(GroupViewName.RemoteDesktop, ApplicationManager.GetIcon(ApplicationName.RemoteDesktop)), + new GroupViewInfo(GroupViewName.PowerShell, ApplicationManager.GetIcon(ApplicationName.PowerShell)), + new GroupViewInfo(GroupViewName.PuTTY, ApplicationManager.GetIcon(ApplicationName.PuTTY)), + new GroupViewInfo(GroupViewName.TigerVNC, ApplicationManager.GetIcon(ApplicationName.TigerVNC)), + new GroupViewInfo(GroupViewName.SNMP, ApplicationManager.GetIcon(ApplicationName.SNMP)) + ]; +} \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/GroupViewName.cs b/Source/NETworkManager.Profiles/GroupViewName.cs index df07c25079..b36d3bffe6 100644 --- a/Source/NETworkManager.Profiles/GroupViewName.cs +++ b/Source/NETworkManager.Profiles/GroupViewName.cs @@ -1,11 +1,11 @@ -namespace NETworkManager.Profiles +namespace NETworkManager.Profiles; + +public enum GroupViewName { - public enum GroupViewName - { - General, - RemoteDesktop, - PowerShell, - PuTTY, - TigerVNC - } -} + General, + RemoteDesktop, + PowerShell, + PuTTY, + TigerVNC, + SNMP +} \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/IProfileHostViewModel.cs b/Source/NETworkManager.Profiles/IProfileHostViewModel.cs new file mode 100644 index 0000000000..dd79ff52ff --- /dev/null +++ b/Source/NETworkManager.Profiles/IProfileHostViewModel.cs @@ -0,0 +1,83 @@ +using NETworkManager.Controls; +using System.ComponentModel; +using System.Windows.Input; + +namespace NETworkManager.Profiles; + +/// +/// Interface for a view model that hosts the shared profile panel (search, tag filter, group list) next to a +/// tool-specific view, extending with the additional members the reusable +/// profile panel control binds to. +/// +public interface IProfileHostViewModel : IProfileManager +{ + /// + /// Gets or sets the selected profile. + /// + ProfileInfo SelectedProfile { get; set; } + + /// + /// Gets or sets the search text. + /// + string Search { get; set; } + + /// + /// Gets or sets a value indicating whether a search is in progress. + /// + bool IsSearching { get; set; } + + /// + /// Gets or sets a value indicating whether the profile filter popup is open. + /// + bool ProfileFilterIsOpen { get; set; } + + /// + /// Gets the view for the profile filter tags. + /// + ICollectionView ProfileFilterTagsView { get; } + + /// + /// Gets or sets a value indicating whether to match any profile filter tag. + /// + bool ProfileFilterTagsMatchAny { get; set; } + + /// + /// Gets or sets a value indicating whether to match all profile filter tags. + /// + bool ProfileFilterTagsMatchAll { get; set; } + + /// + /// Gets or sets a value indicating whether a profile filter is currently applied. + /// + bool IsProfileFilterSet { get; set; } + + /// + /// Gets the group expander state store for the profile list. + /// + GroupExpanderStateStore GroupExpanderStateStore { get; } + + /// + /// Gets the command to open the profile filter popup. + /// + ICommand OpenProfileFilterCommand { get; } + + /// + /// Gets the command to apply the profile filter. + /// + ICommand ApplyProfileFilterCommand { get; } + + /// + /// Gets the command to clear the profile filter. + /// + ICommand ClearProfileFilterCommand { get; } + + /// + /// Gets the command to expand all profile groups. + /// + ICommand ExpandAllProfileGroupsCommand { get; } + + /// + /// Gets the command to collapse all profile groups. + /// + ICommand CollapseAllProfileGroupsCommand { get; } +} diff --git a/Source/NETworkManager.Profiles/IProfileManager.cs b/Source/NETworkManager.Profiles/IProfileManager.cs index efa6665e80..50f45fddc7 100644 --- a/Source/NETworkManager.Profiles/IProfileManager.cs +++ b/Source/NETworkManager.Profiles/IProfileManager.cs @@ -1,17 +1,41 @@ -using System.ComponentModel; +using System.ComponentModel; using System.Windows.Input; -namespace NETworkManager.Profiles +namespace NETworkManager.Profiles; + +/// +/// Interface for a full profile manager view model, extending +/// with profile collection access and profile/group management commands. +/// +public interface IProfileManager : IProfileManagerMinimal { - public interface IProfileManager - { - ICollectionView Profiles { get; } - void OnProfileDialogOpen(); - void OnProfileDialogClose(); - ICommand AddProfileCommand { get; } - ICommand EditProfileCommand { get; } - ICommand CopyAsProfileCommand { get; } - ICommand DeleteProfileCommand { get; } - ICommand EditGroupCommand { get; } - } -} + /// + /// Gets the filtered and sorted view of the profiles collection. + /// + ICollectionView Profiles { get; } + + /// + /// Gets the command to add a new profile. + /// + ICommand AddProfileCommand { get; } + + /// + /// Gets the command to edit the selected profile. + /// + ICommand EditProfileCommand { get; } + + /// + /// Gets the command to create a copy of the selected profile as a new profile. + /// + ICommand CopyAsProfileCommand { get; } + + /// + /// Gets the command to delete the selected profile. + /// + ICommand DeleteProfileCommand { get; } + + /// + /// Gets the command to edit the group of the selected profile. + /// + ICommand EditGroupCommand { get; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/IProfileManagerMinimal.cs b/Source/NETworkManager.Profiles/IProfileManagerMinimal.cs new file mode 100644 index 0000000000..e54c753643 --- /dev/null +++ b/Source/NETworkManager.Profiles/IProfileManagerMinimal.cs @@ -0,0 +1,24 @@ +namespace NETworkManager.Profiles; + +/// +/// Minimal interface for the profile manager, providing lifecycle callbacks +/// for when a dialog is opened or closed. +/// +public interface IProfileManagerMinimal +{ + /// + /// Called when a dialog in the is opened. + /// + public void OnProfileManagerDialogOpen() + { + + } + + /// + /// Called when a dialog in the is closed. + /// + public void OnProfileManagerDialogClose() + { + + } +} diff --git a/Source/NETworkManager.Profiles/NETworkManager.Profiles.csproj b/Source/NETworkManager.Profiles/NETworkManager.Profiles.csproj index e97017af07..f8a0f407e3 100644 --- a/Source/NETworkManager.Profiles/NETworkManager.Profiles.csproj +++ b/Source/NETworkManager.Profiles/NETworkManager.Profiles.csproj @@ -1,36 +1,31 @@ - - - {D3B37F13-E8E6-4218-9E8E-96D52432A9CF} - Library - NETworkManager.Profiles - NETworkManager.Profiles - net6.0-windows10.0.17763.0 - win10-x64 - false - true - false - - - - - - - - - - - - - - PreserveNewest - - - - - - - - - - - \ No newline at end of file + + + {D3B37F13-E8E6-4218-9E8E-96D52432A9CF} + Library + NETworkManager.Profiles + NETworkManager.Profiles + net10.0-windows10.0.22621.0 + false + true + false + false + + + + + + + + + + + + + + + + + + + + diff --git a/Source/NETworkManager.Profiles/ProfileEditMode.cs b/Source/NETworkManager.Profiles/ProfileEditMode.cs index a2f1fdf8b3..17b82abe58 100644 --- a/Source/NETworkManager.Profiles/ProfileEditMode.cs +++ b/Source/NETworkManager.Profiles/ProfileEditMode.cs @@ -1,9 +1,8 @@ -namespace NETworkManager.Profiles +namespace NETworkManager.Profiles; + +public enum ProfileEditMode { - public enum ProfileEditMode - { - Add, - Edit, - Copy - } -} + Add, + Edit, + Copy +} \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/ProfileFileData.cs b/Source/NETworkManager.Profiles/ProfileFileData.cs new file mode 100644 index 0000000000..989a642627 --- /dev/null +++ b/Source/NETworkManager.Profiles/ProfileFileData.cs @@ -0,0 +1,171 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text.Json.Serialization; + +namespace NETworkManager.Profiles; + +/// +/// Represents the data structure for a profile file, including versioning, backup information, and groups of profiles. +/// +/// This class supports property change notification through the +/// interface, allowing consumers to track changes to its properties. The property +/// indicates whether the data has been modified since it was last saved, but is not persisted when serializing the +/// object. Use this class to manage and persist user profile data, including handling schema migrations via the property. +public class ProfileFileData : INotifyPropertyChanged +{ + /// + /// Occurs when a property value changes. + /// + public event PropertyChangedEventHandler PropertyChanged; + + /// + /// Helper method to raise the event and mark data as changed. + /// + /// Name of the property that changed. + private void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + ProfilesChanged = true; + + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + + /// + /// Indicates if the profile file data has been modified and needs to be saved. + /// This is not serialized to the file. + /// + [JsonIgnore] + public bool ProfilesChanged { get; set; } + + /// + /// Schema version for handling future migrations. + /// + public int Version + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = 1; + + /// + /// Date of the last backup (used for daily backup tracking). + /// + public DateTime? LastBackup + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Working copy of groups containing profiles (runtime objects with SecureString passwords). + /// This is the single source of truth for profile data in memory. + /// Not serialized directly - use for JSON serialization. + /// + [JsonIgnore] + public List Groups { get; set; } = []; + + /// + /// Serializable representation of groups for JSON persistence. + /// Gets: Converts working Groups to serializable format. + /// Sets: Converts deserialized data back to working Groups. + /// + [JsonPropertyName("Groups")] + public List GroupsSerializable + { + get => [.. Groups.Select(g => new GroupInfoSerializable(g) + { + Profiles = [.. g.Profiles.Where(p => !p.IsDynamic).Select(p => new ProfileInfoSerializable(p) + { + RemoteDesktop_Password = p.RemoteDesktop_Password != null + ? Utilities.SecureStringHelper.ConvertToString(p.RemoteDesktop_Password) + : string.Empty, + RemoteDesktop_GatewayServerPassword = p.RemoteDesktop_GatewayServerPassword != null + ? Utilities.SecureStringHelper.ConvertToString(p.RemoteDesktop_GatewayServerPassword) + : string.Empty, + SNMP_Community = p.SNMP_Community != null + ? Utilities.SecureStringHelper.ConvertToString(p.SNMP_Community) + : string.Empty, + SNMP_Auth = p.SNMP_Auth != null + ? Utilities.SecureStringHelper.ConvertToString(p.SNMP_Auth) + : string.Empty, + SNMP_Priv = p.SNMP_Priv != null + ? Utilities.SecureStringHelper.ConvertToString(p.SNMP_Priv) + : string.Empty + })], + RemoteDesktop_Password = g.RemoteDesktop_Password != null + ? Utilities.SecureStringHelper.ConvertToString(g.RemoteDesktop_Password) + : string.Empty, + RemoteDesktop_GatewayServerPassword = g.RemoteDesktop_GatewayServerPassword != null + ? Utilities.SecureStringHelper.ConvertToString(g.RemoteDesktop_GatewayServerPassword) + : string.Empty, + SNMP_Community = g.SNMP_Community != null + ? Utilities.SecureStringHelper.ConvertToString(g.SNMP_Community) + : string.Empty, + SNMP_Auth = g.SNMP_Auth != null + ? Utilities.SecureStringHelper.ConvertToString(g.SNMP_Auth) + : string.Empty, + SNMP_Priv = g.SNMP_Priv != null + ? Utilities.SecureStringHelper.ConvertToString(g.SNMP_Priv) + : string.Empty + }).Where(g => !g.IsDynamic)]; + + set + { + Groups = value?.Select(gs => new GroupInfo(gs) + { + Profiles = [.. (gs.Profiles ?? []).Select(ps => new ProfileInfo(ps) + { + TagsCollection = (ps.TagsCollection == null || ps.TagsCollection.Count == 0) && !string.IsNullOrEmpty(ps.Tags) + ? new Controls.ObservableSetCollection(ps.Tags.Split([';'], StringSplitOptions.RemoveEmptyEntries)) + : ps.TagsCollection, + RemoteDesktop_Password = !string.IsNullOrEmpty(ps.RemoteDesktop_Password) + ? Utilities.SecureStringHelper.ConvertToSecureString(ps.RemoteDesktop_Password) + : null, + RemoteDesktop_GatewayServerPassword = !string.IsNullOrEmpty(ps.RemoteDesktop_GatewayServerPassword) + ? Utilities.SecureStringHelper.ConvertToSecureString(ps.RemoteDesktop_GatewayServerPassword) + : null, + SNMP_Community = !string.IsNullOrEmpty(ps.SNMP_Community) + ? Utilities.SecureStringHelper.ConvertToSecureString(ps.SNMP_Community) + : null, + SNMP_Auth = !string.IsNullOrEmpty(ps.SNMP_Auth) + ? Utilities.SecureStringHelper.ConvertToSecureString(ps.SNMP_Auth) + : null, + SNMP_Priv = !string.IsNullOrEmpty(ps.SNMP_Priv) + ? Utilities.SecureStringHelper.ConvertToSecureString(ps.SNMP_Priv) + : null + })], + RemoteDesktop_Password = !string.IsNullOrEmpty(gs.RemoteDesktop_Password) + ? Utilities.SecureStringHelper.ConvertToSecureString(gs.RemoteDesktop_Password) + : null, + RemoteDesktop_GatewayServerPassword = !string.IsNullOrEmpty(gs.RemoteDesktop_GatewayServerPassword) + ? Utilities.SecureStringHelper.ConvertToSecureString(gs.RemoteDesktop_GatewayServerPassword) + : null, + SNMP_Community = !string.IsNullOrEmpty(gs.SNMP_Community) + ? Utilities.SecureStringHelper.ConvertToSecureString(gs.SNMP_Community) + : null, + SNMP_Auth = !string.IsNullOrEmpty(gs.SNMP_Auth) + ? Utilities.SecureStringHelper.ConvertToSecureString(gs.SNMP_Auth) + : null, + SNMP_Priv = !string.IsNullOrEmpty(gs.SNMP_Priv) + ? Utilities.SecureStringHelper.ConvertToSecureString(gs.SNMP_Priv) + : null + }).ToList() ?? []; + } + } +} diff --git a/Source/NETworkManager.Profiles/ProfileFileInfo.cs b/Source/NETworkManager.Profiles/ProfileFileInfo.cs index 4e44dc80a3..601b625d0e 100644 --- a/Source/NETworkManager.Profiles/ProfileFileInfo.cs +++ b/Source/NETworkManager.Profiles/ProfileFileInfo.cs @@ -1,75 +1,118 @@ -using NETworkManager.Utilities; -using System; +using System; using System.Security; +using NETworkManager.Utilities; -namespace NETworkManager.Profiles +namespace NETworkManager.Profiles; + +public class ProfileFileInfo : PropertyChangedBase { - public class ProfileFileInfo + /// + /// Profile file info contains all necessary information's about the profile file and location. + /// + /// of the profile file. + /// of the profile file. + /// indicates if the file is encrypted. + public ProfileFileInfo(string name, string path, bool isEncrypted = false) { - /// - /// Make object unique. - /// - private Guid ID { get; } - - /// - /// Name of the profile. This is the filename without extension. - /// - public string Name { get; set; } - - /// - /// Full path of the profile file. - /// - public string Path { get; set; } + ID = Guid.NewGuid(); + Name = name; + Path = path; + IsEncrypted = isEncrypted; + } - /// - /// Indicates if the profile file is encrypted. - /// - public bool IsEncrypted { get; set; } + /// + /// Make object unique. + /// + private Guid ID { get; } - /// - /// Password to encrypt and decrypt the profile file. - /// - public SecureString Password { get; set; } + /// + /// Name of the profile. This is the filename without extension. + /// + public string Name + { + get; + set + { + if (value == field) + return; - /// - /// Indicates if the password is valid and can be used for encryption or decryption. - /// - public bool IsPasswordValid { get; set; } + field = value; + OnPropertyChanged(); + } + } - /// - /// Profile file info contains all necessary informations about the profile file and location. - /// - /// of the profile file. - /// of the profile file. - /// indicates if the file is encrypted. - public ProfileFileInfo(string name, string path, bool isEncrypted = false) + /// + /// Full path of the profile file. + /// + public string Path + { + get; + set { - ID = Guid.NewGuid(); - Name = name; - Path = path; - IsEncrypted = isEncrypted; + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - /// - /// Overrides the default method. - /// - /// Object from type . - /// Returns true if the is equal to another . - public override bool Equals(object obj) + /// + /// Indicates if the profile file is encrypted. + /// + public bool IsEncrypted + { + get; + set { - if (!(obj is ProfileFileInfo info)) - return false; + if (value == field) + return; - return info.ID == ID; + field = value; + OnPropertyChanged(); } + } + + /// + /// Password to encrypt and decrypt the profile file. + /// + public SecureString Password { get; set; } - /// - /// Overrides the default GetHashCode() method. - /// - /// Return the hashcodes generated by the path of the . - public override int GetHashCode() + /// + /// Indicates if the password is valid and can be used for encryption or decryption. + /// + public bool IsPasswordValid + { + get; + set { - return ID.GetHashCode(); + if (value == field) + return; + + field = value; + OnPropertyChanged(); } } -} + + /// + /// Overrides the default method. + /// + /// Object from type . + /// Returns true if the is equal to another . + public override bool Equals(object obj) + { + if (obj is not ProfileFileInfo info) + return false; + + return info.ID == ID; + } + + /// + /// Overrides the default GetHashCode() method. + /// + /// Return the hashcode generated by the path of the . + public override int GetHashCode() + { + return ID.GetHashCode(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/ProfileFileInfoArgs.cs b/Source/NETworkManager.Profiles/ProfileFileInfoArgs.cs index c9e5d0c56a..ecce229959 100644 --- a/Source/NETworkManager.Profiles/ProfileFileInfoArgs.cs +++ b/Source/NETworkManager.Profiles/ProfileFileInfoArgs.cs @@ -1,15 +1,41 @@ using System; -namespace NETworkManager.Profiles +namespace NETworkManager.Profiles; + +public class ProfileFileInfoArgs : EventArgs { - public class ProfileFileInfoArgs : EventArgs + /// + /// Creates a new instance of the class with the specified parameters. + /// + /// Profile file info which is loaded. + public ProfileFileInfoArgs(ProfileFileInfo profileFileInfo) { - public ProfileFileInfo ProfileFileInfo { get; set; } - + ProfileFileInfo = profileFileInfo; + ProfileFileUpdating = false; + } - public ProfileFileInfoArgs(ProfileFileInfo profileFileInfo) - { - ProfileFileInfo = profileFileInfo; - } + /// + /// Creates a new instance of the class with the specified parameters. + /// + /// Profile file info which should be loaded. + /// + /// If true, the profile will be updated in the UI, but does not trigger a profile load + /// event (e.g. to enter the password for decryption). + /// + public ProfileFileInfoArgs(ProfileFileInfo profileFileInfo, bool profileFileUpdating) + { + ProfileFileInfo = profileFileInfo; + ProfileFileUpdating = profileFileUpdating; } -} + + /// + /// Profile file info which is loaded or should be loaded. + /// + public ProfileFileInfo ProfileFileInfo { get; set; } + + /// + /// If true, the profile will be updated in the UI, but does not trigger a + /// profile load event (e.g. to enter the password for decryption). + /// + public bool ProfileFileUpdating { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/ProfileFilterInfo.cs b/Source/NETworkManager.Profiles/ProfileFilterInfo.cs new file mode 100644 index 0000000000..b835c265c4 --- /dev/null +++ b/Source/NETworkManager.Profiles/ProfileFilterInfo.cs @@ -0,0 +1,24 @@ +using System.Collections.Generic; + +namespace NETworkManager.Profiles; + +/// +/// Class used to filter profiles in the UI. +/// +public class ProfileFilterInfo +{ + /// + /// Search string for filtering profiles. + /// + public string Search { get; set; } = string.Empty; + + /// + /// Tags for filtering profiles. + /// + public IEnumerable Tags { get; set; } = []; + + /// + /// Indicates whether to match any or all tags in the filter. + /// + public ProfileFilterTagsMatch TagsFilterMatch { get; set; } = ProfileFilterTagsMatch.Any; +} diff --git a/Source/NETworkManager.Profiles/ProfileFilterTagsInfo.cs b/Source/NETworkManager.Profiles/ProfileFilterTagsInfo.cs new file mode 100644 index 0000000000..ccdb63a00e --- /dev/null +++ b/Source/NETworkManager.Profiles/ProfileFilterTagsInfo.cs @@ -0,0 +1,41 @@ +using NETworkManager.Utilities; + +namespace NETworkManager.Profiles; + +/// +/// Class used to represent a tag filter in the UI (Popup). +/// +public class ProfileFilterTagsInfo : PropertyChangedBase +{ + /// + /// Indicates whether the tag is selected for filtering. + /// + public bool IsSelected + { + get; + set + { + if (field == value) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Tag name. + /// + public string Name { get; set; } + + /// + /// Creates a new instance of with parameters. + /// + /// Indicates whether the tag is selected for filtering. + /// Tag name. + public ProfileFilterTagsInfo(bool isSelected, string name) + { + IsSelected = isSelected; + Name = name; + } +} diff --git a/Source/NETworkManager.Profiles/ProfileFilterTagsMatch.cs b/Source/NETworkManager.Profiles/ProfileFilterTagsMatch.cs new file mode 100644 index 0000000000..753210e797 --- /dev/null +++ b/Source/NETworkManager.Profiles/ProfileFilterTagsMatch.cs @@ -0,0 +1,17 @@ +namespace NETworkManager.Profiles; + +/// +/// Enumeration for tag filtering options. +/// +public enum ProfileFilterTagsMatch +{ + /// + /// Any of the tags can match. + /// + Any, + + /// + /// All of the tags must match. + /// + All +} \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/ProfileGroup.cs b/Source/NETworkManager.Profiles/ProfileGroup.cs new file mode 100644 index 0000000000..79f67010ad --- /dev/null +++ b/Source/NETworkManager.Profiles/ProfileGroup.cs @@ -0,0 +1,7 @@ +namespace NETworkManager.Profiles; + +public enum ProfileGroup +{ + General, + Application +} \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/ProfileImportCandidate.cs b/Source/NETworkManager.Profiles/ProfileImportCandidate.cs new file mode 100644 index 0000000000..e928d3dabd --- /dev/null +++ b/Source/NETworkManager.Profiles/ProfileImportCandidate.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; + +namespace NETworkManager.Profiles; + +/// +/// A source-agnostic candidate that can be turned into a by an import dialog. +/// +public sealed class ProfileImportCandidate( + string name, + string host, + string description, + ProfileImportSource importSource, + string importSourceId = null) +{ + /// Profile name suggestion (e.g. sAMAccountName without trailing '$'). + public string Name { get; } = name ?? string.Empty; + + /// Host or DNS name used as the profile host. May be empty. + public string Host { get; } = host ?? string.Empty; + + /// Optional free-form description. + public string Description { get; } = description; + + /// Import method. Used together with for duplicate detection on re-import. + public ProfileImportSource ImportSource { get; } = importSource; + + /// Stable ID within the import source (e.g. AD objectGUID). Empty/null if not applicable. + public string ImportSourceId { get; } = importSourceId; +} \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/ProfileImportSource.cs b/Source/NETworkManager.Profiles/ProfileImportSource.cs new file mode 100644 index 0000000000..970b890577 --- /dev/null +++ b/Source/NETworkManager.Profiles/ProfileImportSource.cs @@ -0,0 +1,8 @@ +namespace NETworkManager.Profiles; + +public enum ProfileImportSource +{ + None, + ActiveDirectory, + Csv +} \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/ProfileInfo.cs b/Source/NETworkManager.Profiles/ProfileInfo.cs index 504b956a25..209b19d33b 100644 --- a/Source/NETworkManager.Profiles/ProfileInfo.cs +++ b/Source/NETworkManager.Profiles/ProfileInfo.cs @@ -1,341 +1,496 @@ -using NETworkManager.Models.PowerShell; +//using System.Collections.Generic; +using NETworkManager.Controls; +using NETworkManager.Models.Network; +using NETworkManager.Models.PowerShell; using NETworkManager.Models.PuTTY; using NETworkManager.Models.RemoteDesktop; using NETworkManager.Settings; -using System.Collections.Generic; using System.Security; using System.Xml.Serialization; +//using NETworkManager.Models.Firewall; -namespace NETworkManager.Profiles +// ReSharper disable InconsistentNaming +// ReSharper disable PropertyCanBeMadeInitOnly.Global +// ReSharper disable UnusedAutoPropertyAccessor.Global + +namespace NETworkManager.Profiles; + +/// +/// Class represents a profile. +/// +public class ProfileInfo { /// - /// Class represents a profile. + /// Initializes a new instance of the class. /// - public class ProfileInfo + public ProfileInfo() { - /// - /// Name of the profile. - /// - public string Name { get; set; } - - /// - /// Hostname or IP address of the host. - /// - public string Host { get; set; } - - /// - /// Name of the group. Profiles are grouped based on the name. - /// - public string Group { get; set; } - - /// - /// Tags to classify the profiles and to filter by it. - /// - public string Tags { get; set; } - - public bool NetworkInterface_Enabled { get; set; } - public bool NetworkInterface_EnableStaticIPAddress { get; set; } - public string NetworkInterface_IPAddress { get; set; } - public string NetworkInterface_SubnetmaskOrCidr { get; set; } - public string NetworkInterface_Gateway { get; set; } - public bool NetworkInterface_EnableStaticDNS { get; set; } - public string NetworkInterface_PrimaryDNSServer { get; set; } - public string NetworkInterface_SecondaryDNSServer { get; set; } - - public bool IPScanner_Enabled { get; set; } - public bool IPScanner_InheritHost { get; set; } = true; - public string IPScanner_HostOrIPRange { get; set; } - - public bool PortScanner_Enabled { get; set; } - public bool PortScanner_InheritHost { get; set; } = true; - public string PortScanner_Host { get; set; } - public string PortScanner_Ports { get; set; } - - public bool PingMonitor_Enabled { get; set; } - public bool PingMonitor_InheritHost { get; set; } = true; - public string PingMonitor_Host { get; set; } - - public bool Traceroute_Enabled { get; set; } - public bool Traceroute_InheritHost { get; set; } = true; - public string Traceroute_Host { get; set; } - - public bool DNSLookup_Enabled { get; set; } - public bool DNSLookup_InheritHost { get; set; } = true; - public string DNSLookup_Host { get; set; } - - public bool RemoteDesktop_Enabled { get; set; } - public bool RemoteDesktop_InheritHost { get; set; } = true; - public string RemoteDesktop_Host { get; set; } - - public bool RemoteDesktop_UseCredentials { get; set; } - - public string RemoteDesktop_Username { get; set; } - - [XmlIgnore] - public SecureString RemoteDesktop_Password { get; set; } - public bool RemoteDesktop_OverrideDisplay { get; set; } - public bool RemoteDesktop_AdjustScreenAutomatically { get; set; } - public bool RemoteDesktop_UseCurrentViewSize { get; set; } - public bool RemoteDesktop_UseFixedScreenSize { get; set; } = true; - public int RemoteDesktop_ScreenWidth { get; set; } = GlobalStaticConfiguration.RemoteDesktop_ScreenWidth; - public int RemoteDesktop_ScreenHeight { get; set; } = GlobalStaticConfiguration.RemoteDesktop_ScreenHeight; - public bool RemoteDesktop_UseCustomScreenSize { get; set; } - public int RemoteDesktop_CustomScreenWidth { get; set; } - public int RemoteDesktop_CustomScreenHeight { get; set; } - public bool RemoteDesktop_OverrideColorDepth { get; set; } - public int RemoteDesktop_ColorDepth { get; set; } = GlobalStaticConfiguration.RemoteDesktop_ColorDepth; - public bool RemoteDesktop_OverridePort { get; set; } - public int RemoteDesktop_Port { get; set; } = GlobalStaticConfiguration.RemoteDesktop_Port; - public bool RemoteDesktop_OverrideCredSspSupport { get; set; } - public bool RemoteDesktop_EnableCredSspSupport { get; set; } - public bool RemoteDesktop_OverrideAuthenticationLevel { get; set; } - public uint RemoteDesktop_AuthenticationLevel { get; set; } = GlobalStaticConfiguration.RemoteDesktop_AuthenticationLevel; - public bool RemoteDesktop_OverrideAudioRedirectionMode { get; set; } - public AudioRedirectionMode RemoteDesktop_AudioRedirectionMode { get; set; } = GlobalStaticConfiguration.RemoteDesktop_AudioRedirectionMode; - public bool RemoteDesktop_OverrideAudioCaptureRedirectionMode { get; set; } - public AudioCaptureRedirectionMode RemoteDesktop_AudioCaptureRedirectionMode { get; set; } = GlobalStaticConfiguration.RemoteDesktop_AudioCaptureRedirectionMode; - public bool RemoteDesktop_OverrideApplyWindowsKeyCombinations { get; set; } - public KeyboardHookMode RemoteDesktop_KeyboardHookMode { get; set; } = GlobalStaticConfiguration.RemoteDesktop_KeyboardHookMode; - public bool RemoteDesktop_OverrideRedirectClipboard { get; set; } - public bool RemoteDesktop_RedirectClipboard { get; set; } = true; - public bool RemoteDesktop_OverrideRedirectDevices { get; set; } - public bool RemoteDesktop_RedirectDevices { get; set; } - public bool RemoteDesktop_OverrideRedirectDrives { get; set; } - public bool RemoteDesktop_RedirectDrives { get; set; } - public bool RemoteDesktop_OverrideRedirectPorts { get; set; } - public bool RemoteDesktop_RedirectPorts { get; set; } - public bool RemoteDesktop_OverrideRedirectSmartcards { get; set; } - public bool RemoteDesktop_RedirectSmartCards { get; set; } - public bool RemoteDesktop_OverrideRedirectPrinters { get; set; } - public bool RemoteDesktop_RedirectPrinters { get; set; } - public bool RemoteDesktop_OverridePersistentBitmapCaching { get; set; } - public bool RemoteDesktop_PersistentBitmapCaching { get; set; } - public bool RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped { get; set; } - public bool RemoteDesktop_ReconnectIfTheConnectionIsDropped { get; set; } - public bool RemoteDesktop_OverrideNetworkConnectionType { get; set; } - public NetworkConnectionType RemoteDesktop_NetworkConnectionType { get; set; } - public bool RemoteDesktop_OverrideDesktopBackground { get; set; } - public bool RemoteDesktop_DesktopBackground { get; set; } - public bool RemoteDesktop_OverrideFontSmoothing { get; set; } - public bool RemoteDesktop_FontSmoothing { get; set; } - public bool RemoteDesktop_OverrideDesktopComposition { get; set; } - public bool RemoteDesktop_DesktopComposition { get; set; } - public bool RemoteDesktop_OverrideShowWindowContentsWhileDragging { get; set; } - public bool RemoteDesktop_ShowWindowContentsWhileDragging { get; set; } - public bool RemoteDesktop_OverrideMenuAndWindowAnimation { get; set; } - public bool RemoteDesktop_MenuAndWindowAnimation { get; set; } - public bool RemoteDesktop_OverrideVisualStyles { get; set; } - public bool RemoteDesktop_VisualStyles { get; set; } - - public bool PowerShell_Enabled { get; set; } - public bool PowerShell_EnableRemoteConsole { get; set; } = true; - public bool PowerShell_InheritHost { get; set; } = true; - public string PowerShell_Host { get; set; } - public bool PowerShell_OverrideAdditionalCommandLine { get; set; } - public string PowerShell_AdditionalCommandLine { get; set; } - public bool PowerShell_OverrideExecutionPolicy { get; set; } - public PowerShell.ExecutionPolicy PowerShell_ExecutionPolicy { get; set; } - - public bool PuTTY_Enabled { get; set; } - public ConnectionMode PuTTY_ConnectionMode { get; set; } - public bool PuTTY_InheritHost { get; set; } = true; - public string PuTTY_HostOrSerialLine { get; set; } - public bool PuTTY_OverridePortOrBaud { get; set; } - public int PuTTY_PortOrBaud { get; set; } - public bool PuTTY_OverrideUsername { get; set; } - public string PuTTY_Username { get; set; } - public bool PuTTY_OverridePrivateKeyFile { get; set; } - public string PuTTY_PrivateKeyFile { get; set; } - public bool PuTTY_OverrideProfile { get; set; } - public string PuTTY_Profile { get; set; } - public bool PuTTY_OverrideEnableLog { get; set; } - public bool PuTTY_EnableLog { get; set; } - public bool PuTTY_OverrideLogMode { get; set; } - public LogMode PuTTY_LogMode { get; set; } = GlobalStaticConfiguration.PuTTY_LogMode; - public bool PuTTY_OverrideLogPath { get; set; } - public string PuTTY_LogPath { get; set; } = GlobalStaticConfiguration.PuTTY_LogPath; - public bool PuTTY_OverrideLogFileName { get; set; } - public string PuTTY_LogFileName { get; set; } = GlobalStaticConfiguration.PuTTY_LogFileName; - public bool PuTTY_OverrideAdditionalCommandLine { get; set; } - public string PuTTY_AdditionalCommandLine { get; set; } - - public bool TigerVNC_Enabled { get; set; } - public bool TigerVNC_InheritHost { get; set; } = true; - public string TigerVNC_Host { get; set; } - public bool TigerVNC_OverridePort { get; set; } - public int TigerVNC_Port { get; set; } - - public bool WebConsole_Enabled { get; set; } - public string WebConsole_Url { get; set; } - - public bool WakeOnLAN_Enabled { get; set; } - public string WakeOnLAN_MACAddress { get; set; } - public string WakeOnLAN_Broadcast { get; set; } - public bool WakeOnLAN_OverridePort { get; set; } - public int WakeOnLAN_Port { get; set; } - - public bool Whois_Enabled { get; set; } - public bool Whois_InheritHost { get; set; } = true; - public string Whois_Domain { get; set; } - - /// - /// Initializes a new instance of the class. - /// - public ProfileInfo() - { - - } - - /// - /// Initializes a new instance of the class with properties. - /// - public ProfileInfo(ProfileInfo profile) - { - Name = profile.Name; - Host = profile.Host; - Group = profile.Group; - Tags = profile.Tags; - - NetworkInterface_Enabled = profile.NetworkInterface_Enabled; - NetworkInterface_EnableStaticIPAddress = profile.NetworkInterface_EnableStaticIPAddress; - NetworkInterface_IPAddress = profile.NetworkInterface_IPAddress; - NetworkInterface_SubnetmaskOrCidr = profile.NetworkInterface_SubnetmaskOrCidr; - NetworkInterface_Gateway = profile.NetworkInterface_Gateway; - NetworkInterface_EnableStaticDNS = profile.NetworkInterface_EnableStaticDNS; - NetworkInterface_PrimaryDNSServer = profile.NetworkInterface_PrimaryDNSServer; - NetworkInterface_SecondaryDNSServer = profile.NetworkInterface_SecondaryDNSServer; - - IPScanner_Enabled = profile.IPScanner_Enabled; - IPScanner_InheritHost = profile.IPScanner_InheritHost; - IPScanner_HostOrIPRange = profile.IPScanner_HostOrIPRange; - - PortScanner_Enabled = profile.PortScanner_Enabled; - PortScanner_InheritHost = profile.PortScanner_InheritHost; - PortScanner_Host = profile.PortScanner_Host; - PortScanner_Ports = profile.PortScanner_Ports; - - PingMonitor_Enabled = profile.PingMonitor_Enabled; - PingMonitor_InheritHost = profile.PingMonitor_InheritHost; - PingMonitor_Host = profile.PingMonitor_Host; - - Traceroute_Enabled = profile.Traceroute_Enabled; - Traceroute_InheritHost = profile.Traceroute_InheritHost; - Traceroute_Host = profile.Traceroute_Host; - - DNSLookup_Enabled = profile.DNSLookup_Enabled; - DNSLookup_InheritHost = profile.DNSLookup_InheritHost; - DNSLookup_Host = profile.DNSLookup_Host; - - RemoteDesktop_Enabled = profile.RemoteDesktop_Enabled; - RemoteDesktop_InheritHost = profile.RemoteDesktop_InheritHost; - RemoteDesktop_Host = profile.RemoteDesktop_Host; - RemoteDesktop_UseCredentials = profile.RemoteDesktop_UseCredentials; - RemoteDesktop_Username = profile.RemoteDesktop_Username; - RemoteDesktop_Password = profile.RemoteDesktop_Password; - RemoteDesktop_OverrideDisplay = profile.RemoteDesktop_OverrideDisplay; - RemoteDesktop_AdjustScreenAutomatically = profile.RemoteDesktop_AdjustScreenAutomatically; - RemoteDesktop_UseCurrentViewSize = profile.RemoteDesktop_UseCurrentViewSize; - RemoteDesktop_UseFixedScreenSize = profile.RemoteDesktop_UseFixedScreenSize; - RemoteDesktop_ScreenWidth = profile.RemoteDesktop_ScreenWidth; - RemoteDesktop_ScreenHeight = profile.RemoteDesktop_ScreenHeight; - RemoteDesktop_UseCustomScreenSize = profile.RemoteDesktop_UseCustomScreenSize; - RemoteDesktop_CustomScreenWidth = profile.RemoteDesktop_CustomScreenWidth; - RemoteDesktop_CustomScreenHeight = profile.RemoteDesktop_CustomScreenHeight; - RemoteDesktop_OverrideColorDepth = profile.RemoteDesktop_OverrideColorDepth; - RemoteDesktop_ColorDepth = profile.RemoteDesktop_ColorDepth; - RemoteDesktop_OverridePort = profile.RemoteDesktop_OverridePort; - RemoteDesktop_Port = profile.RemoteDesktop_Port; - RemoteDesktop_OverrideCredSspSupport = profile.RemoteDesktop_OverrideCredSspSupport; - RemoteDesktop_EnableCredSspSupport = profile.RemoteDesktop_EnableCredSspSupport; - RemoteDesktop_OverrideAuthenticationLevel = profile.RemoteDesktop_OverrideAuthenticationLevel; - RemoteDesktop_AuthenticationLevel = profile.RemoteDesktop_AuthenticationLevel; - RemoteDesktop_OverrideAudioRedirectionMode = profile.RemoteDesktop_OverrideAudioRedirectionMode; - RemoteDesktop_AudioRedirectionMode = profile.RemoteDesktop_AudioRedirectionMode; - RemoteDesktop_OverrideAudioCaptureRedirectionMode = profile.RemoteDesktop_OverrideAudioCaptureRedirectionMode; - RemoteDesktop_AudioCaptureRedirectionMode = profile.RemoteDesktop_AudioCaptureRedirectionMode; - RemoteDesktop_OverrideApplyWindowsKeyCombinations = profile.RemoteDesktop_OverrideApplyWindowsKeyCombinations; - RemoteDesktop_KeyboardHookMode = profile.RemoteDesktop_KeyboardHookMode; - RemoteDesktop_OverrideRedirectClipboard = profile.RemoteDesktop_OverrideRedirectClipboard; - RemoteDesktop_RedirectClipboard = profile.RemoteDesktop_RedirectClipboard; - RemoteDesktop_OverrideRedirectDevices = profile.RemoteDesktop_OverrideRedirectDevices; - RemoteDesktop_RedirectDevices = profile.RemoteDesktop_RedirectDevices; - RemoteDesktop_OverrideRedirectDrives = profile.RemoteDesktop_OverrideRedirectDrives; - RemoteDesktop_RedirectDrives = profile.RemoteDesktop_RedirectDrives; - RemoteDesktop_OverrideRedirectPorts = profile.RemoteDesktop_OverrideRedirectPorts; - RemoteDesktop_RedirectPorts = profile.RemoteDesktop_RedirectPorts; - RemoteDesktop_OverrideRedirectSmartcards = profile.RemoteDesktop_OverrideRedirectSmartcards; - RemoteDesktop_RedirectSmartCards = profile.RemoteDesktop_RedirectSmartCards; - RemoteDesktop_OverrideRedirectPrinters = profile.RemoteDesktop_OverrideRedirectPrinters; - RemoteDesktop_RedirectPrinters = profile.RemoteDesktop_RedirectPrinters; - RemoteDesktop_OverridePersistentBitmapCaching = profile.RemoteDesktop_OverridePersistentBitmapCaching; - RemoteDesktop_PersistentBitmapCaching = profile.RemoteDesktop_PersistentBitmapCaching; - RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped = profile.RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped; - RemoteDesktop_ReconnectIfTheConnectionIsDropped = profile.RemoteDesktop_ReconnectIfTheConnectionIsDropped; - RemoteDesktop_OverrideNetworkConnectionType = profile.RemoteDesktop_OverrideNetworkConnectionType; - RemoteDesktop_NetworkConnectionType = profile.RemoteDesktop_NetworkConnectionType; - RemoteDesktop_OverrideDesktopBackground = profile.RemoteDesktop_OverrideDesktopBackground; - RemoteDesktop_DesktopBackground = profile.RemoteDesktop_DesktopBackground; - RemoteDesktop_OverrideFontSmoothing = profile.RemoteDesktop_OverrideFontSmoothing; - RemoteDesktop_FontSmoothing = profile.RemoteDesktop_FontSmoothing; - RemoteDesktop_OverrideDesktopComposition = profile.RemoteDesktop_OverrideDesktopComposition; - RemoteDesktop_DesktopComposition = profile.RemoteDesktop_DesktopComposition; - RemoteDesktop_OverrideShowWindowContentsWhileDragging = profile.RemoteDesktop_OverrideShowWindowContentsWhileDragging; - RemoteDesktop_ShowWindowContentsWhileDragging = profile.RemoteDesktop_ShowWindowContentsWhileDragging; - RemoteDesktop_OverrideMenuAndWindowAnimation = profile.RemoteDesktop_OverrideMenuAndWindowAnimation; - RemoteDesktop_MenuAndWindowAnimation = profile.RemoteDesktop_MenuAndWindowAnimation; - RemoteDesktop_OverrideVisualStyles = profile.RemoteDesktop_OverrideVisualStyles; - RemoteDesktop_VisualStyles = profile.RemoteDesktop_VisualStyles; - - PowerShell_Enabled = profile.PowerShell_Enabled; - PowerShell_EnableRemoteConsole = profile.PowerShell_EnableRemoteConsole; - PowerShell_InheritHost = profile.PowerShell_InheritHost; - PowerShell_Host = profile.PowerShell_Host; - PowerShell_OverrideAdditionalCommandLine = profile.PowerShell_OverrideAdditionalCommandLine; - PowerShell_AdditionalCommandLine = profile.PowerShell_AdditionalCommandLine; - PowerShell_OverrideExecutionPolicy = profile.PowerShell_OverrideExecutionPolicy; - PowerShell_ExecutionPolicy = profile.PowerShell_ExecutionPolicy; - - PuTTY_Enabled = profile.PuTTY_Enabled; - PuTTY_ConnectionMode = profile.PuTTY_ConnectionMode; - PuTTY_InheritHost = profile.PuTTY_InheritHost; - PuTTY_HostOrSerialLine = profile.PuTTY_HostOrSerialLine; - PuTTY_OverridePortOrBaud = profile.PuTTY_OverridePortOrBaud; - PuTTY_PortOrBaud = profile.PuTTY_PortOrBaud; - PuTTY_OverrideUsername = profile.PuTTY_OverrideUsername; - PuTTY_Username = profile.PuTTY_Username; - PuTTY_OverridePrivateKeyFile = profile.PuTTY_OverridePrivateKeyFile; - PuTTY_PrivateKeyFile = profile.PuTTY_PrivateKeyFile; - PuTTY_OverrideProfile = profile.PuTTY_OverrideProfile; - PuTTY_Profile = profile.PuTTY_Profile; - PuTTY_OverrideEnableLog = profile.PuTTY_OverrideEnableLog; - PuTTY_EnableLog = profile.PuTTY_EnableLog; - PuTTY_OverrideLogMode = profile.PuTTY_OverrideLogMode; - PuTTY_LogMode = profile.PuTTY_LogMode; - PuTTY_OverrideLogPath = profile.PuTTY_OverrideLogPath; - PuTTY_LogPath = profile.PuTTY_LogPath; - PuTTY_OverrideLogFileName = profile.PuTTY_OverrideLogFileName; - PuTTY_LogFileName = profile.PuTTY_LogFileName; - PuTTY_OverrideAdditionalCommandLine = profile.PuTTY_OverrideAdditionalCommandLine; - PuTTY_AdditionalCommandLine = profile.PuTTY_AdditionalCommandLine; - - TigerVNC_Enabled = profile.TigerVNC_Enabled; - TigerVNC_InheritHost = profile.TigerVNC_InheritHost; - TigerVNC_Host = profile.TigerVNC_Host; - TigerVNC_OverridePort = profile.TigerVNC_OverridePort; - TigerVNC_Port = profile.TigerVNC_Port; - - WebConsole_Enabled = profile.WebConsole_Enabled; - WebConsole_Url = profile.WebConsole_Url; - - WakeOnLAN_Enabled = profile.WakeOnLAN_Enabled; - WakeOnLAN_MACAddress = profile.WakeOnLAN_MACAddress; - WakeOnLAN_Broadcast = profile.WakeOnLAN_Broadcast; - WakeOnLAN_OverridePort = profile.WakeOnLAN_OverridePort; - WakeOnLAN_Port = profile.WakeOnLAN_Port; - - Whois_Enabled = profile.Whois_Enabled; - Whois_InheritHost = profile.Whois_InheritHost; - Whois_Domain = profile.Whois_Domain; - } } -} + + /// + /// Initializes a new instance of the class with properties. + /// + public ProfileInfo(ProfileInfo profile) + { + Name = profile.Name; + Host = profile.Host; + Description = profile.Description; + Group = profile.Group; + TagsCollection = profile.TagsCollection; + ImportSource = profile.ImportSource; + ImportSourceId = profile.ImportSourceId; + + IsDynamic = profile.IsDynamic; + + // Network Interface + NetworkInterface_Enabled = profile.NetworkInterface_Enabled; + NetworkInterface_EnableStaticIPAddress = profile.NetworkInterface_EnableStaticIPAddress; + NetworkInterface_IPAddress = profile.NetworkInterface_IPAddress; + NetworkInterface_Subnetmask = profile.NetworkInterface_Subnetmask; + NetworkInterface_Gateway = profile.NetworkInterface_Gateway; + NetworkInterface_EnableStaticDNS = profile.NetworkInterface_EnableStaticDNS; + NetworkInterface_PrimaryDNSServer = profile.NetworkInterface_PrimaryDNSServer; + NetworkInterface_SecondaryDNSServer = profile.NetworkInterface_SecondaryDNSServer; + + // IP Scanner + IPScanner_Enabled = profile.IPScanner_Enabled; + IPScanner_InheritHost = profile.IPScanner_InheritHost; + IPScanner_HostOrIPRange = profile.IPScanner_HostOrIPRange; + + // Port Scanner + PortScanner_Enabled = profile.PortScanner_Enabled; + PortScanner_InheritHost = profile.PortScanner_InheritHost; + PortScanner_Host = profile.PortScanner_Host; + PortScanner_Ports = profile.PortScanner_Ports; + + // Ping Monitor + PingMonitor_Enabled = profile.PingMonitor_Enabled; + PingMonitor_InheritHost = profile.PingMonitor_InheritHost; + PingMonitor_Host = profile.PingMonitor_Host; + + // Traceroute + Traceroute_Enabled = profile.Traceroute_Enabled; + Traceroute_InheritHost = profile.Traceroute_InheritHost; + Traceroute_Host = profile.Traceroute_Host; + + // DNS Lookup + DNSLookup_Enabled = profile.DNSLookup_Enabled; + DNSLookup_InheritHost = profile.DNSLookup_InheritHost; + DNSLookup_Host = profile.DNSLookup_Host; + + // Remote Desktop + RemoteDesktop_Enabled = profile.RemoteDesktop_Enabled; + RemoteDesktop_InheritHost = profile.RemoteDesktop_InheritHost; + RemoteDesktop_Host = profile.RemoteDesktop_Host; + RemoteDesktop_UseCredentials = profile.RemoteDesktop_UseCredentials; + RemoteDesktop_Username = profile.RemoteDesktop_Username; + RemoteDesktop_Domain = profile.RemoteDesktop_Domain; + RemoteDesktop_Password = profile.RemoteDesktop_Password; + RemoteDesktop_AdminSession = profile.RemoteDesktop_AdminSession; + RemoteDesktop_OverrideDisplay = profile.RemoteDesktop_OverrideDisplay; + RemoteDesktop_AdjustScreenAutomatically = profile.RemoteDesktop_AdjustScreenAutomatically; + RemoteDesktop_UseCurrentViewSize = profile.RemoteDesktop_UseCurrentViewSize; + RemoteDesktop_UseFixedScreenSize = profile.RemoteDesktop_UseFixedScreenSize; + RemoteDesktop_ScreenWidth = profile.RemoteDesktop_ScreenWidth; + RemoteDesktop_ScreenHeight = profile.RemoteDesktop_ScreenHeight; + RemoteDesktop_UseCustomScreenSize = profile.RemoteDesktop_UseCustomScreenSize; + RemoteDesktop_CustomScreenWidth = profile.RemoteDesktop_CustomScreenWidth; + RemoteDesktop_CustomScreenHeight = profile.RemoteDesktop_CustomScreenHeight; + RemoteDesktop_OverrideColorDepth = profile.RemoteDesktop_OverrideColorDepth; + RemoteDesktop_ColorDepth = profile.RemoteDesktop_ColorDepth; + RemoteDesktop_OverridePort = profile.RemoteDesktop_OverridePort; + RemoteDesktop_Port = profile.RemoteDesktop_Port; + RemoteDesktop_OverrideViewOnly = profile.RemoteDesktop_OverrideViewOnly; + RemoteDesktop_ViewOnly = profile.RemoteDesktop_ViewOnly; + RemoteDesktop_OverrideCredSspSupport = profile.RemoteDesktop_OverrideCredSspSupport; + RemoteDesktop_EnableCredSspSupport = profile.RemoteDesktop_EnableCredSspSupport; + RemoteDesktop_OverrideAuthenticationLevel = profile.RemoteDesktop_OverrideAuthenticationLevel; + RemoteDesktop_AuthenticationLevel = profile.RemoteDesktop_AuthenticationLevel; + RemoteDesktop_OverrideGatewayServer = profile.RemoteDesktop_OverrideGatewayServer; + RemoteDesktop_EnableGatewayServer = profile.RemoteDesktop_EnableGatewayServer; + RemoteDesktop_GatewayServerHostname = profile.RemoteDesktop_GatewayServerHostname; + RemoteDesktop_GatewayServerBypassLocalAddresses = profile.RemoteDesktop_GatewayServerBypassLocalAddresses; + RemoteDesktop_GatewayServerLogonMethod = profile.RemoteDesktop_GatewayServerLogonMethod; + RemoteDesktop_GatewayServerShareCredentialsWithRemoteComputer = + profile.RemoteDesktop_GatewayServerShareCredentialsWithRemoteComputer; + RemoteDesktop_UseGatewayServerCredentials = profile.RemoteDesktop_UseGatewayServerCredentials; + RemoteDesktop_GatewayServerUsername = profile.RemoteDesktop_GatewayServerUsername; + RemoteDesktop_GatewayServerDomain = profile.RemoteDesktop_GatewayServerDomain; + RemoteDesktop_GatewayServerPassword = profile.RemoteDesktop_GatewayServerPassword; + RemoteDesktop_OverrideAudioRedirectionMode = profile.RemoteDesktop_OverrideAudioRedirectionMode; + RemoteDesktop_AudioRedirectionMode = profile.RemoteDesktop_AudioRedirectionMode; + RemoteDesktop_OverrideAudioCaptureRedirectionMode = profile.RemoteDesktop_OverrideAudioCaptureRedirectionMode; + RemoteDesktop_AudioCaptureRedirectionMode = profile.RemoteDesktop_AudioCaptureRedirectionMode; + RemoteDesktop_OverrideApplyWindowsKeyCombinations = profile.RemoteDesktop_OverrideApplyWindowsKeyCombinations; + RemoteDesktop_KeyboardHookMode = profile.RemoteDesktop_KeyboardHookMode; + RemoteDesktop_OverrideRedirectClipboard = profile.RemoteDesktop_OverrideRedirectClipboard; + RemoteDesktop_RedirectClipboard = profile.RemoteDesktop_RedirectClipboard; + RemoteDesktop_OverrideRedirectDevices = profile.RemoteDesktop_OverrideRedirectDevices; + RemoteDesktop_RedirectDevices = profile.RemoteDesktop_RedirectDevices; + RemoteDesktop_OverrideRedirectDrives = profile.RemoteDesktop_OverrideRedirectDrives; + RemoteDesktop_RedirectDrives = profile.RemoteDesktop_RedirectDrives; + RemoteDesktop_OverrideRedirectPorts = profile.RemoteDesktop_OverrideRedirectPorts; + RemoteDesktop_RedirectPorts = profile.RemoteDesktop_RedirectPorts; + RemoteDesktop_OverrideRedirectSmartcards = profile.RemoteDesktop_OverrideRedirectSmartcards; + RemoteDesktop_RedirectSmartCards = profile.RemoteDesktop_RedirectSmartCards; + RemoteDesktop_OverrideRedirectPrinters = profile.RemoteDesktop_OverrideRedirectPrinters; + RemoteDesktop_RedirectPrinters = profile.RemoteDesktop_RedirectPrinters; + RemoteDesktop_OverridePersistentBitmapCaching = profile.RemoteDesktop_OverridePersistentBitmapCaching; + RemoteDesktop_PersistentBitmapCaching = profile.RemoteDesktop_PersistentBitmapCaching; + RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped = + profile.RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped; + RemoteDesktop_ReconnectIfTheConnectionIsDropped = profile.RemoteDesktop_ReconnectIfTheConnectionIsDropped; + RemoteDesktop_OverrideNetworkConnectionType = profile.RemoteDesktop_OverrideNetworkConnectionType; + RemoteDesktop_NetworkConnectionType = profile.RemoteDesktop_NetworkConnectionType; + RemoteDesktop_OverrideDesktopBackground = profile.RemoteDesktop_OverrideDesktopBackground; + RemoteDesktop_DesktopBackground = profile.RemoteDesktop_DesktopBackground; + RemoteDesktop_OverrideFontSmoothing = profile.RemoteDesktop_OverrideFontSmoothing; + RemoteDesktop_FontSmoothing = profile.RemoteDesktop_FontSmoothing; + RemoteDesktop_OverrideDesktopComposition = profile.RemoteDesktop_OverrideDesktopComposition; + RemoteDesktop_DesktopComposition = profile.RemoteDesktop_DesktopComposition; + RemoteDesktop_OverrideShowWindowContentsWhileDragging = + profile.RemoteDesktop_OverrideShowWindowContentsWhileDragging; + RemoteDesktop_ShowWindowContentsWhileDragging = profile.RemoteDesktop_ShowWindowContentsWhileDragging; + RemoteDesktop_OverrideMenuAndWindowAnimation = profile.RemoteDesktop_OverrideMenuAndWindowAnimation; + RemoteDesktop_MenuAndWindowAnimation = profile.RemoteDesktop_MenuAndWindowAnimation; + RemoteDesktop_OverrideVisualStyles = profile.RemoteDesktop_OverrideVisualStyles; + RemoteDesktop_VisualStyles = profile.RemoteDesktop_VisualStyles; + + // PowerShell + PowerShell_Enabled = profile.PowerShell_Enabled; + PowerShell_EnableRemoteConsole = profile.PowerShell_EnableRemoteConsole; + PowerShell_InheritHost = profile.PowerShell_InheritHost; + PowerShell_Host = profile.PowerShell_Host; + PowerShell_OverrideCommand = profile.PowerShell_OverrideCommand; + PowerShell_Command = profile.PowerShell_Command; + PowerShell_OverrideAdditionalCommandLine = profile.PowerShell_OverrideAdditionalCommandLine; + PowerShell_AdditionalCommandLine = profile.PowerShell_AdditionalCommandLine; + PowerShell_OverrideExecutionPolicy = profile.PowerShell_OverrideExecutionPolicy; + PowerShell_ExecutionPolicy = profile.PowerShell_ExecutionPolicy; + + // PuTTY + PuTTY_Enabled = profile.PuTTY_Enabled; + PuTTY_ConnectionMode = profile.PuTTY_ConnectionMode; + PuTTY_InheritHost = profile.PuTTY_InheritHost; + PuTTY_HostOrSerialLine = profile.PuTTY_HostOrSerialLine; + PuTTY_OverridePortOrBaud = profile.PuTTY_OverridePortOrBaud; + PuTTY_PortOrBaud = profile.PuTTY_PortOrBaud; + PuTTY_OverrideUsername = profile.PuTTY_OverrideUsername; + PuTTY_Username = profile.PuTTY_Username; + PuTTY_OverridePrivateKeyFile = profile.PuTTY_OverridePrivateKeyFile; + PuTTY_PrivateKeyFile = profile.PuTTY_PrivateKeyFile; + PuTTY_OverrideProfile = profile.PuTTY_OverrideProfile; + PuTTY_Profile = profile.PuTTY_Profile; + PuTTY_OverrideHostkey = profile.PuTTY_OverrideHostkey; + PuTTY_Hostkey = profile.PuTTY_Hostkey; + PuTTY_OverrideEnableLog = profile.PuTTY_OverrideEnableLog; + PuTTY_EnableLog = profile.PuTTY_EnableLog; + PuTTY_OverrideLogMode = profile.PuTTY_OverrideLogMode; + PuTTY_LogMode = profile.PuTTY_LogMode; + PuTTY_OverrideLogPath = profile.PuTTY_OverrideLogPath; + PuTTY_LogPath = profile.PuTTY_LogPath; + PuTTY_OverrideLogFileName = profile.PuTTY_OverrideLogFileName; + PuTTY_LogFileName = profile.PuTTY_LogFileName; + PuTTY_OverrideAdditionalCommandLine = profile.PuTTY_OverrideAdditionalCommandLine; + PuTTY_AdditionalCommandLine = profile.PuTTY_AdditionalCommandLine; + + // TigerVNC + TigerVNC_Enabled = profile.TigerVNC_Enabled; + TigerVNC_InheritHost = profile.TigerVNC_InheritHost; + TigerVNC_Host = profile.TigerVNC_Host; + TigerVNC_OverridePort = profile.TigerVNC_OverridePort; + TigerVNC_Port = profile.TigerVNC_Port; + + // WebConsole + WebConsole_Enabled = profile.WebConsole_Enabled; + WebConsole_Url = profile.WebConsole_Url; + + // SNMP + SNMP_Enabled = profile.SNMP_Enabled; + SNMP_InheritHost = profile.SNMP_InheritHost; + SNMP_Host = profile.SNMP_Host; + SNMP_OverrideOIDAndMode = profile.SNMP_OverrideOIDAndMode; + SNMP_OID = profile.SNMP_OID; + SNMP_Mode = profile.SNMP_Mode; + SNMP_OverrideVersionAndAuth = profile.SNMP_OverrideVersionAndAuth; + SNMP_Version = profile.SNMP_Version; + SNMP_Community = profile.SNMP_Community; + SNMP_Security = profile.SNMP_Security; + SNMP_Username = profile.SNMP_Username; + SNMP_AuthenticationProvider = profile.SNMP_AuthenticationProvider; + SNMP_Auth = profile.SNMP_Auth; + SNMP_PrivacyProvider = profile.SNMP_PrivacyProvider; + SNMP_Priv = profile.SNMP_Priv; + + // Wake on LAN + WakeOnLAN_Enabled = profile.WakeOnLAN_Enabled; + WakeOnLAN_MACAddress = profile.WakeOnLAN_MACAddress; + WakeOnLAN_Broadcast = profile.WakeOnLAN_Broadcast; + + // Whois + Whois_Enabled = profile.Whois_Enabled; + Whois_InheritHost = profile.Whois_InheritHost; + Whois_Domain = profile.Whois_Domain; + + // IP Geolocation + IPGeolocation_Enabled = profile.IPGeolocation_Enabled; + IPGeolocation_InheritHost = profile.IPGeolocation_InheritHost; + IPGeolocation_Host = profile.IPGeolocation_Host; + } + + /// + /// Name of the profile. + /// + public string Name { get; set; } + + /// + /// Hostname or IP address of the host. + /// + public string Host { get; set; } + + /// + /// Description of the profile. + /// + public string Description { get; set; } + + /// + /// Name of the group. Profiles are grouped based on the name. + /// + public string Group { get; set; } + + /// + /// Tags to classify the profiles and to filter by it. + /// + //[Obsolete("Replaced with TagsList")] + public string Tags { get; set; } + + /// + /// Tags collection to classify the profiles and to filter by it. + /// + public ObservableSetCollection TagsCollection { get; set; } = []; + + /// + /// Import method identifier (e.g. "ActiveDirectory"). Used together with + /// for duplicate detection on re-import. Null if the profile was not created by an import. + /// + public ProfileImportSource ImportSource { get; set; } + + /// + /// Stable ID within the import source (e.g. AD objectGUID). + /// Null if not applicable or not from an import. + /// + public string ImportSourceId { get; set; } + + /// + /// Dynamic profiles (e.g. AWS) are not save to file. + /// + [XmlIgnore] + public bool IsDynamic { get; set; } + + public bool NetworkInterface_Enabled { get; set; } + public bool NetworkInterface_EnableStaticIPAddress { get; set; } + public string NetworkInterface_IPAddress { get; set; } + public string NetworkInterface_Subnetmask { get; set; } + public string NetworkInterface_Gateway { get; set; } + public bool NetworkInterface_EnableStaticDNS { get; set; } + public string NetworkInterface_PrimaryDNSServer { get; set; } + public string NetworkInterface_SecondaryDNSServer { get; set; } + + public bool IPScanner_Enabled { get; set; } + public bool IPScanner_InheritHost { get; set; } = true; + public string IPScanner_HostOrIPRange { get; set; } + + public bool PortScanner_Enabled { get; set; } + public bool PortScanner_InheritHost { get; set; } = true; + public string PortScanner_Host { get; set; } + public string PortScanner_Ports { get; set; } + + public bool PingMonitor_Enabled { get; set; } + public bool PingMonitor_InheritHost { get; set; } = true; + public string PingMonitor_Host { get; set; } + + public bool Traceroute_Enabled { get; set; } + public bool Traceroute_InheritHost { get; set; } = true; + public string Traceroute_Host { get; set; } + + public bool DNSLookup_Enabled { get; set; } + public bool DNSLookup_InheritHost { get; set; } = true; + public string DNSLookup_Host { get; set; } + + public bool RemoteDesktop_Enabled { get; set; } + public bool RemoteDesktop_InheritHost { get; set; } = true; + public string RemoteDesktop_Host { get; set; } + public bool RemoteDesktop_UseCredentials { get; set; } + public string RemoteDesktop_Username { get; set; } + public string RemoteDesktop_Domain { get; set; } + + [XmlIgnore] public SecureString RemoteDesktop_Password { get; set; } + + public bool RemoteDesktop_AdminSession { get; set; } + public bool RemoteDesktop_OverrideDisplay { get; set; } + public bool RemoteDesktop_AdjustScreenAutomatically { get; set; } + + public bool RemoteDesktop_UseCurrentViewSize { get; set; } = + GlobalStaticConfiguration.RemoteDesktop_UseCurrentViewSize; + + public bool RemoteDesktop_UseFixedScreenSize { get; set; } + public int RemoteDesktop_ScreenWidth { get; set; } = GlobalStaticConfiguration.RemoteDesktop_ScreenWidth; + public int RemoteDesktop_ScreenHeight { get; set; } = GlobalStaticConfiguration.RemoteDesktop_ScreenHeight; + public bool RemoteDesktop_UseCustomScreenSize { get; set; } + public int RemoteDesktop_CustomScreenWidth { get; set; } + public int RemoteDesktop_CustomScreenHeight { get; set; } + public bool RemoteDesktop_OverrideColorDepth { get; set; } + public int RemoteDesktop_ColorDepth { get; set; } = GlobalStaticConfiguration.RemoteDesktop_ColorDepth; + public bool RemoteDesktop_OverridePort { get; set; } + public int RemoteDesktop_Port { get; set; } = GlobalStaticConfiguration.RemoteDesktop_Port; + public bool RemoteDesktop_OverrideViewOnly { get; set; } + public bool RemoteDesktop_ViewOnly { get; set; } = GlobalStaticConfiguration.RemoteDesktop_ViewOnly; + public bool RemoteDesktop_OverrideCredSspSupport { get; set; } + public bool RemoteDesktop_EnableCredSspSupport { get; set; } + public bool RemoteDesktop_OverrideAuthenticationLevel { get; set; } + + public uint RemoteDesktop_AuthenticationLevel { get; set; } = + GlobalStaticConfiguration.RemoteDesktop_AuthenticationLevel; + + public bool RemoteDesktop_OverrideGatewayServer { get; set; } + public bool RemoteDesktop_EnableGatewayServer { get; set; } + public string RemoteDesktop_GatewayServerHostname { get; set; } + + public bool RemoteDesktop_GatewayServerBypassLocalAddresses { get; set; } = + GlobalStaticConfiguration.RemoteDesktop_GatewayServerBypassLocalAddresses; + + public GatewayUserSelectedCredsSource RemoteDesktop_GatewayServerLogonMethod { get; set; } = + GlobalStaticConfiguration.RemoteDesktop_GatewayServerLogonMethod; + + public bool RemoteDesktop_GatewayServerShareCredentialsWithRemoteComputer { get; set; } = + GlobalStaticConfiguration.RemoteDesktop_GatewayServerShareCredentialsWithRemoteComputer; + + public bool RemoteDesktop_UseGatewayServerCredentials { get; set; } + public string RemoteDesktop_GatewayServerUsername { get; set; } + public string RemoteDesktop_GatewayServerDomain { get; set; } + + [XmlIgnore] public SecureString RemoteDesktop_GatewayServerPassword { get; set; } + public bool RemoteDesktop_OverrideAudioRedirectionMode { get; set; } + + public AudioRedirectionMode RemoteDesktop_AudioRedirectionMode { get; set; } = + GlobalStaticConfiguration.RemoteDesktop_AudioRedirectionMode; + + public bool RemoteDesktop_OverrideAudioCaptureRedirectionMode { get; set; } + + public AudioCaptureRedirectionMode RemoteDesktop_AudioCaptureRedirectionMode { get; set; } = + GlobalStaticConfiguration.RemoteDesktop_AudioCaptureRedirectionMode; + + public bool RemoteDesktop_OverrideApplyWindowsKeyCombinations { get; set; } + + public KeyboardHookMode RemoteDesktop_KeyboardHookMode { get; set; } = + GlobalStaticConfiguration.RemoteDesktop_KeyboardHookMode; + + public bool RemoteDesktop_OverrideRedirectClipboard { get; set; } + public bool RemoteDesktop_RedirectClipboard { get; set; } = true; + public bool RemoteDesktop_OverrideRedirectDevices { get; set; } + public bool RemoteDesktop_RedirectDevices { get; set; } + public bool RemoteDesktop_OverrideRedirectDrives { get; set; } + public bool RemoteDesktop_RedirectDrives { get; set; } + public bool RemoteDesktop_OverrideRedirectPorts { get; set; } + public bool RemoteDesktop_RedirectPorts { get; set; } + public bool RemoteDesktop_OverrideRedirectSmartcards { get; set; } + public bool RemoteDesktop_RedirectSmartCards { get; set; } + public bool RemoteDesktop_OverrideRedirectPrinters { get; set; } + public bool RemoteDesktop_RedirectPrinters { get; set; } + public bool RemoteDesktop_OverridePersistentBitmapCaching { get; set; } + public bool RemoteDesktop_PersistentBitmapCaching { get; set; } + public bool RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped { get; set; } + public bool RemoteDesktop_ReconnectIfTheConnectionIsDropped { get; set; } + public bool RemoteDesktop_OverrideNetworkConnectionType { get; set; } + public NetworkConnectionType RemoteDesktop_NetworkConnectionType { get; set; } + public bool RemoteDesktop_OverrideDesktopBackground { get; set; } + public bool RemoteDesktop_DesktopBackground { get; set; } + public bool RemoteDesktop_OverrideFontSmoothing { get; set; } + public bool RemoteDesktop_FontSmoothing { get; set; } + public bool RemoteDesktop_OverrideDesktopComposition { get; set; } + public bool RemoteDesktop_DesktopComposition { get; set; } + public bool RemoteDesktop_OverrideShowWindowContentsWhileDragging { get; set; } + public bool RemoteDesktop_ShowWindowContentsWhileDragging { get; set; } + public bool RemoteDesktop_OverrideMenuAndWindowAnimation { get; set; } + public bool RemoteDesktop_MenuAndWindowAnimation { get; set; } + public bool RemoteDesktop_OverrideVisualStyles { get; set; } + public bool RemoteDesktop_VisualStyles { get; set; } + + public bool PowerShell_Enabled { get; set; } + public bool PowerShell_EnableRemoteConsole { get; set; } = true; + public bool PowerShell_InheritHost { get; set; } = true; + public string PowerShell_Host { get; set; } + public bool PowerShell_OverrideCommand { get; set; } + public string PowerShell_Command { get; set; } + public bool PowerShell_OverrideAdditionalCommandLine { get; set; } + public string PowerShell_AdditionalCommandLine { get; set; } + public bool PowerShell_OverrideExecutionPolicy { get; set; } + + public ExecutionPolicy PowerShell_ExecutionPolicy { get; set; } = + GlobalStaticConfiguration.PowerShell_ExecutionPolicy; + + public bool PuTTY_Enabled { get; set; } + public ConnectionMode PuTTY_ConnectionMode { get; set; } + public bool PuTTY_InheritHost { get; set; } = true; + public string PuTTY_HostOrSerialLine { get; set; } + public bool PuTTY_OverridePortOrBaud { get; set; } + public int PuTTY_PortOrBaud { get; set; } + public bool PuTTY_OverrideUsername { get; set; } + public string PuTTY_Username { get; set; } + public bool PuTTY_OverridePrivateKeyFile { get; set; } + public string PuTTY_PrivateKeyFile { get; set; } + public bool PuTTY_OverrideProfile { get; set; } + public string PuTTY_Profile { get; set; } + public bool PuTTY_OverrideHostkey { get; set; } + public string PuTTY_Hostkey { get; set; } + public bool PuTTY_OverrideEnableLog { get; set; } + public bool PuTTY_EnableLog { get; set; } + public bool PuTTY_OverrideLogMode { get; set; } + public LogMode PuTTY_LogMode { get; set; } = GlobalStaticConfiguration.PuTTY_LogMode; + public bool PuTTY_OverrideLogPath { get; set; } + public string PuTTY_LogPath { get; set; } = GlobalStaticConfiguration.PuTTY_LogPath; + public bool PuTTY_OverrideLogFileName { get; set; } + public string PuTTY_LogFileName { get; set; } = GlobalStaticConfiguration.PuTTY_LogFileName; + public bool PuTTY_OverrideAdditionalCommandLine { get; set; } + public string PuTTY_AdditionalCommandLine { get; set; } + + public bool TigerVNC_Enabled { get; set; } + public bool TigerVNC_InheritHost { get; set; } = true; + public string TigerVNC_Host { get; set; } + public bool TigerVNC_OverridePort { get; set; } + public int TigerVNC_Port { get; set; } = GlobalStaticConfiguration.TigerVNC_DefaultVNCPort; + + public bool WebConsole_Enabled { get; set; } + public string WebConsole_Url { get; set; } = "https://{{Host}}"; + + public bool SNMP_Enabled { get; set; } + public bool SNMP_InheritHost { get; set; } = true; + public string SNMP_Host { get; set; } + public bool SNMP_OverrideOIDAndMode { get; set; } + public string SNMP_OID { get; set; } + public SNMPMode SNMP_Mode { get; set; } = GlobalStaticConfiguration.SNMP_Mode; + public bool SNMP_OverrideVersionAndAuth { get; set; } + public SNMPVersion SNMP_Version { get; set; } = GlobalStaticConfiguration.SNMP_Version; + [XmlIgnore] public SecureString SNMP_Community { get; set; } + public SNMPV3Security SNMP_Security { get; set; } = GlobalStaticConfiguration.SNMP_Security; + public string SNMP_Username { get; set; } + + public SNMPV3AuthenticationProvider SNMP_AuthenticationProvider { get; set; } = + GlobalStaticConfiguration.SNMP_AuthenticationProvider; + + [XmlIgnore] public SecureString SNMP_Auth { get; set; } + public SNMPV3PrivacyProvider SNMP_PrivacyProvider { get; set; } = GlobalStaticConfiguration.SNMP_PrivacyProvider; + [XmlIgnore] public SecureString SNMP_Priv { get; set; } + + public bool WakeOnLAN_Enabled { get; set; } + public string WakeOnLAN_MACAddress { get; set; } + public string WakeOnLAN_Broadcast { get; set; } + + public bool Whois_Enabled { get; set; } + public bool Whois_InheritHost { get; set; } = true; + public string Whois_Domain { get; set; } + + public bool IPGeolocation_Enabled { get; set; } + public bool IPGeolocation_InheritHost { get; set; } = true; + public string IPGeolocation_Host { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/ProfileInfoSerializable.cs b/Source/NETworkManager.Profiles/ProfileInfoSerializable.cs index 0821e8fe19..96e14fbe0f 100644 --- a/Source/NETworkManager.Profiles/ProfileInfoSerializable.cs +++ b/Source/NETworkManager.Profiles/ProfileInfoSerializable.cs @@ -1,20 +1,46 @@ -namespace NETworkManager.Profiles +namespace NETworkManager.Profiles; + +public class ProfileInfoSerializable : ProfileInfo { - public class ProfileInfoSerializable : ProfileInfo + /// + /// Initializes a new instance of the class. + /// + public ProfileInfoSerializable() { - /// - /// Override the default remote desktop password to make it serializable. - /// - public new string RemoteDesktop_Password { get; set; } - public ProfileInfoSerializable() - { + } - } + /// + /// Initializes a new instance of the class using the specified profile information. + /// + /// The object that contains the profile data to be serialized. Cannot be null. + public ProfileInfoSerializable(ProfileInfo profile) : base(profile) + { - public ProfileInfoSerializable(ProfileInfo profile) : base(profile) - { - - } } -} + + /// + /// Override the default remote desktop password to make it serializable. + /// + public new string RemoteDesktop_Password { get; set; } + + /// + /// Override the default remote desktop gateway password to make it serializable. + /// + public new string RemoteDesktop_GatewayServerPassword { get; set; } + + /// + /// Override the default snmp community to make it serializable. + /// + public new string SNMP_Community { get; set; } + + /// + /// Override the default snmp auth to make it serializable. + /// + public new string SNMP_Auth { get; set; } + + /// + /// Override the default snmp priv to make it serializable. + /// + public new string SNMP_Priv { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/ProfileManager.cs b/Source/NETworkManager.Profiles/ProfileManager.cs index a290090dff..38ed36f408 100644 --- a/Source/NETworkManager.Profiles/ProfileManager.cs +++ b/Source/NETworkManager.Profiles/ProfileManager.cs @@ -1,832 +1,1499 @@ -using System; +using log4net; +using NETworkManager.Settings; +using NETworkManager.Utilities; +using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Linq; using System.Security; using System.Text; -using System.Threading.Tasks; +using System.Text.Json; +using System.Text.Json.Serialization; using System.Xml.Serialization; -using NETworkManager.Settings; -using NETworkManager.Utilities; -namespace NETworkManager.Profiles +namespace NETworkManager.Profiles; + +public static class ProfileManager { - public static class ProfileManager + #region Variables + private static readonly ILog Log = LogManager.GetLogger(typeof(ProfileManager)); + + /// + /// Profiles directory name. + /// + private const string ProfilesFolderName = "Profiles"; + + /// + /// Profiles backups directory name. + /// + private static string BackupFolderName => "Backups"; + + /// + /// Default profile name. + /// + private const string ProfilesDefaultFileName = "Default"; + + /// + /// Profile file extension. + /// + private const string ProfileFileExtension = ".json"; + + /// + /// Legacy XML profile file extension. + /// + [Obsolete("Legacy XML profiles are no longer used, but the extension is kept for migration purposes.")] + private static string LegacyProfileFileExtension => ".xml"; + + /// + /// Profile file extension for encrypted files. + /// + private const string ProfileFileExtensionEncrypted = ".encrypted"; + + /// + /// JSON serializer options for consistent serialization/deserialization. + /// + private static readonly JsonSerializerOptions JsonOptions = new() + { + WriteIndented = true, + PropertyNameCaseInsensitive = true, + DefaultIgnoreCondition = JsonIgnoreCondition.Never, + Converters = { new JsonStringEnumConverter() } + }; + + /// + /// Maximum number of bytes to check for XML content detection. + /// + private const int XmlDetectionBufferSize = 200; + + /// + /// ObservableCollection of all profile files. + /// + public static ObservableCollection ProfileFiles { get; set; } = []; + + /// + /// Currently loaded profile file. + /// + public static ProfileFileInfo LoadedProfileFile { - #region Variables - /// - /// Name of the profiles directory in the %appdata%\NETworkManager or in the portable location. - /// - private static string ProfilesFolderName => "Profiles"; + get; + private set + { + if (Equals(value, field)) + return; - /// - /// Default profile name. - /// - private static string ProfilesDefaultFileName => "Default"; + field = value; + } + } - /// - /// Profile file extension. - /// - public static string ProfileFileExtension => ".xml"; + /// + /// Currently loaded profile file data (wrapper containing groups and metadata). + /// This is updated during load/save operations. + /// + public static ProfileFileData LoadedProfileFileData + { + get; + private set + { + if (Equals(value, field)) + return; - /// - /// Profile file extension for encrypted files. - /// - public static string ProfileFileExtensionEncrypted => ".encrypted"; + field = value; + } + } = new(); - /// - /// ObservableCollection of all profile files. - /// - public static ObservableCollection ProfileFiles { get; set; } = new ObservableCollection(); + #endregion - private static ProfileFileInfo _profileFileInfo; + #region Constructor - public static ProfileFileInfo LoadedProfileFile - { - get => _profileFileInfo; - set - { - if (value == _profileFileInfo) - return; + /// + /// Static constructor. Load all profile files on startup. + /// + static ProfileManager() + { + LoadProfileFiles(); + } - _profileFileInfo = value; - } - } + #endregion - public static List Groups { get; set; } = new List(); + #region Events - public static bool ProfilesChanged { get; set; } - #endregion + /// + /// Event is fired if the currently loaded is changed. + /// The with the current loaded profile file is passed + /// as argument. + /// + public static event EventHandler OnLoadedProfileFileChangedEvent; - #region Events - /// - /// Event is fired if a loaded profile file is changed. - /// - public static event EventHandler OnLoadedProfileFileChangedEvent; + /// + /// Method to fire the . + /// + /// Loaded . + /// Indicates if the profile file is updating. + private static void LoadedProfileFileChanged(ProfileFileInfo profileFileInfo, bool profileFileUpdating = false) + { + OnLoadedProfileFileChangedEvent?.Invoke(null, new ProfileFileInfoArgs(profileFileInfo, profileFileUpdating)); + } - private static void LoadedProfileFileChanged(ProfileFileInfo profileFileInfo) - { - OnLoadedProfileFileChangedEvent?.Invoke(null, new ProfileFileInfoArgs(profileFileInfo)); - } + /// + /// Occurs when the profile migration process begins. + /// + [Obsolete("Will be removed after some time, as profile migration from legacy XML files is a one-time process.")] + public static event EventHandler OnProfileMigrationStarted; + + /// + /// Raises the event indicating that the profile migration process from legacy XML files has started. + /// + [Obsolete("Will be removed after some time, as profile migration from legacy XML files is a one-time process.")] + private static void ProfileMigrationStarted() + { + OnProfileMigrationStarted?.Invoke(null, EventArgs.Empty); + } - public static event EventHandler OnProfilesUpdated; + /// + /// Occurs when the profile migration from legacy XML files has completed. + /// + [Obsolete("Will be removed after some time, as profile migration from legacy XML files is a one-time process.")] + public static event EventHandler OnProfileMigrationCompleted; + + /// + /// Raises the event indicating that the profile migration from legacy XML files has completed. + /// + [Obsolete("Will be removed after some time, as profile migration from legacy XML files is a one-time process.")] + private static void ProfileMigrationCompleted() + { + OnProfileMigrationCompleted?.Invoke(null, EventArgs.Empty); + } - private static void ProfilesUpdated() - { - ProfilesChanged = true; + /// + /// Event is fired if the profiles have changed. + /// + public static event EventHandler OnProfilesUpdated; - OnProfilesUpdated?.Invoke(null, EventArgs.Empty); - } - #endregion + /// + /// Method to fire the . + /// + private static void ProfilesUpdated(bool profilesChanged = true) + { + LoadedProfileFileData?.ProfilesChanged = profilesChanged; - static ProfileManager() - { - LoadProfileFiles(); - } + OnProfilesUpdated?.Invoke(null, EventArgs.Empty); + } - #region Profiles locations (default, custom, portable) - public static string GetDefaultProfilesLocation() - { - return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), AssemblyManager.Current.Name, ProfilesFolderName); - } + #endregion - public static string GetCustomProfilesLocation() - { - return SettingsManager.Current.Profiles_CustomProfilesLocation; - } + #region Profiles locations, default paths and file names - public static string GetPortableProfilesLocation() + /// + /// Method to get the path of the profiles folder. + /// Priority: + /// 1. Policy override (for IT administrators) + /// 2. Custom user-configured path (not available in portable mode) + /// 3. Portable (same directory as the application) or default location (Documents folder) + /// + /// Path to the profiles folder. + public static string GetProfilesFolderLocation() + { + // 1. Policy override takes precedence (for IT administrators) + if (!string.IsNullOrWhiteSpace(PolicyManager.Current?.Profiles_FolderLocation)) { - return Path.Combine(AssemblyManager.Current.Location ?? throw new InvalidOperationException(), ProfilesFolderName); + var validatedPath = DirectoryHelper.ValidateFolderPath( + PolicyManager.Current.Profiles_FolderLocation, + "Policy-provided", + nameof(PolicyInfo.Profiles_FolderLocation), + "next priority"); + + if (validatedPath != null) + return validatedPath; } - public static string GetProfilesLocation() + // 2. Custom user-configured path (not available in portable mode) + if (!ConfigurationManager.Current.IsPortable && + !string.IsNullOrWhiteSpace(SettingsManager.Current?.Profiles_FolderLocation)) { - return ConfigurationManager.Current.IsPortable ? GetPortableProfilesLocation() : GetProfilesLocationNotPortable(); + var validatedPath = DirectoryHelper.ValidateFolderPath( + SettingsManager.Current.Profiles_FolderLocation, + "Custom", + nameof(SettingsInfo.Profiles_FolderLocation), + "default location"); + + if (validatedPath != null) + return validatedPath; } - public static string GetProfilesLocationNotPortable() - { - var location = GetCustomProfilesLocation(); + // 3. Fall back to portable or default location + if (ConfigurationManager.Current.IsPortable) + return GetPortableProfilesFolderLocation(); + else + return GetDefaultProfilesFolderLocation(); + } + + /// + /// Method to get the default profiles folder location in the user's Documents directory. + /// + /// Path to the default profiles folder location. + public static string GetDefaultProfilesFolderLocation() + { + return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), + AssemblyManager.Current.Name, ProfilesFolderName); + } - if (!string.IsNullOrEmpty(location) && Directory.Exists(location)) - return location; + /// + /// Method to get the portable profiles folder location (in the same directory as the application). + /// + /// Path to the portable profiles folder location. + public static string GetPortableProfilesFolderLocation() + { + return Path.Combine(AssemblyManager.Current.Location, ProfilesFolderName); + } - return GetDefaultProfilesLocation(); - } - #endregion + /// + /// Method to get the path of the profiles backup folder. + /// + /// Path to the profiles backup folder. + public static string GetProfilesBackupFolderLocation() + { + return Path.Combine(GetProfilesFolderLocation(), BackupFolderName); + } - #region FileName, FilePath - public static string GetProfilesDefaultFileName() + /// + /// Method to get the default profile file name. + /// + /// Default profile file name. + private static string GetProfilesDefaultFileName() + { + return $"{ProfilesDefaultFileName}{ProfileFileExtension}"; + } + + /// + /// Method to get the default profile file path. + /// + /// Default profile file path. + private static string GetProfilesDefaultFilePath() + { + return Path.Combine(GetProfilesFolderLocation(), GetProfilesDefaultFileName()); + } + + #endregion + + #region Get and load profile files + + /// + /// Get all files in the folder with the extension or + /// . + /// + /// Path of the profile folder. + /// List of profile files. + private static IEnumerable GetProfileFiles(string location) + { + return Directory.GetFiles(location).Where(x => + Path.GetExtension(x) == ProfileFileExtension || + Path.GetExtension(x) == ProfileFileExtensionEncrypted || + Path.GetExtension(x) == LegacyProfileFileExtension); + } + + /// + /// Method to get the list of profile files from file system and detect if the file is encrypted. + /// + private static void LoadProfileFiles() + { + var location = GetProfilesFolderLocation(); + + // Folder exists + if (Directory.Exists(location)) { - return $"{ProfilesDefaultFileName}{ProfileFileExtension}"; + foreach (var file in GetProfileFiles(location)) + { + // Gets the filename, path and if the file is encrypted. + ProfileFiles.Add(new ProfileFileInfo(Path.GetFileNameWithoutExtension(file), file, + Path.GetFileName(file).EndsWith(ProfileFileExtensionEncrypted))); + } } - public static string GetProfilesDefaultFilePath() - { - var path = Path.Combine(GetProfilesLocation(), GetProfilesDefaultFileName()); + // Create default profile if no profile file exists. + if (ProfileFiles.Count == 0) + ProfileFiles.Add(new ProfileFileInfo(ProfilesDefaultFileName, GetProfilesDefaultFilePath())); + } + + #endregion + + #region Create, rename and delete profile file + + /// + /// Method to create a profile file. + /// + /// Name of the profile file to create. + /// Thrown when profileName is null or empty. + public static void CreateEmptyProfileFile(string profileName) + { + ArgumentException.ThrowIfNullOrWhiteSpace(profileName); + + ProfileFileInfo profileFileInfo = new(profileName, + Path.Combine(GetProfilesFolderLocation(), $"{profileName}{ProfileFileExtension}")); + + Directory.CreateDirectory(GetProfilesFolderLocation()); + + // Create and serialize empty ProfileFileData to new file (without loading it) + var emptyProfileFileData = new ProfileFileData(); + var jsonString = JsonSerializer.Serialize(emptyProfileFileData, JsonOptions); + File.WriteAllText(profileFileInfo.Path, jsonString); + + ProfileFiles.Add(profileFileInfo); + } + + /// + /// Method to rename a profile file. + /// + /// to rename. + /// New of the profile file. + /// Thrown when profileFileInfo is null. + /// Thrown when newProfileName is null or empty. + public static void RenameProfileFile(ProfileFileInfo profileFileInfo, string newProfileName) + { + ArgumentNullException.ThrowIfNull(profileFileInfo); + ArgumentException.ThrowIfNullOrWhiteSpace(newProfileName); - return path; - } - #endregion - #region Get profile files, load profile files, refresh profile files - /// - /// Get all files in the folder with the extension or . - /// - /// Path of the profile folder. - /// List of profile files. - private static IEnumerable GetProfileFiles(string location) + // Check if the profile is currently in use + var switchProfile = false; + + if (LoadedProfileFile != null && LoadedProfileFile.Equals(profileFileInfo)) { - return Directory.GetFiles(location).Where(x => (Path.GetExtension(x) == ProfileFileExtension || Path.GetExtension(x) == ProfileFileExtensionEncrypted)); + Save(); + switchProfile = true; } - /// - /// Method to get the list of profile files from file system and detect if the file is encrypted. - /// - private static void LoadProfileFiles() + // Create backup + Backup(profileFileInfo.Path, + GetProfilesBackupFolderLocation(), + TimestampHelper.GetTimestampFilename(Path.GetFileName(profileFileInfo.Path))); + + // Create new profile info with the new name + ProfileFileInfo newProfileFileInfo = new(newProfileName, + Path.Combine(GetProfilesFolderLocation(), $"{newProfileName}{Path.GetExtension(profileFileInfo.Path)}"), + profileFileInfo.IsEncrypted) { - var location = GetProfilesLocation(); + Password = profileFileInfo.Password, + IsPasswordValid = profileFileInfo.IsPasswordValid + }; - // Folder exists - if (Directory.Exists(location)) - { - foreach (var file in GetProfileFiles(location)) - { - // Gets the filename, path and if the file is encrypted. - ProfileFiles.Add(new ProfileFileInfo(Path.GetFileNameWithoutExtension(file), file, Path.GetFileName(file).EndsWith(ProfileFileExtensionEncrypted))); - } - } + // Copy the profile file to the new location + File.Copy(profileFileInfo.Path, newProfileFileInfo.Path); + ProfileFiles.Add(newProfileFileInfo); - // Create default profile - if (ProfileFiles.Count == 0) - ProfileFiles.Add(new ProfileFileInfo(ProfilesDefaultFileName, GetProfilesDefaultFilePath())); - } - #endregion + MigrateGroupExpandState(profileFileInfo.Path, newProfileFileInfo.Path); - #region Create empty profile file, rename profile file, delete profile file - /// - /// Method to add a profile file. - /// - /// - public static void CreateEmptyProfileFile(string profileName) + // Switch profile, if it was previously loaded + if (switchProfile) { - ProfileFileInfo profileFileInfo = new ProfileFileInfo(profileName, Path.Combine(GetProfilesLocation(), $"{profileName}{ProfileFileExtension}")); + Switch(newProfileFileInfo, false); + LoadedProfileFileChanged(LoadedProfileFile, true); + } - CheckAndCreateDirectory(); + // Remove the old profile file + File.Delete(profileFileInfo.Path); + ProfileFiles.Remove(profileFileInfo); + } - SerializeToFile(profileFileInfo.Path, new List()); + /// + /// Method to delete a profile file. + /// + /// to delete. + /// Thrown when profileFileInfo is null. + public static void DeleteProfileFile(ProfileFileInfo profileFileInfo) + { + ArgumentNullException.ThrowIfNull(profileFileInfo); - ProfileFiles.Add(profileFileInfo); - } - /// - /// Method to rename a profile file. - /// - /// to rename. - /// New of the profile file. - public static void RenameProfileFile(ProfileFileInfo profileFileInfo, string newProfileName) - { - bool switchProfile = false; + // Trigger switch via UI (to get the password if the file is encrypted), if the selected profile file is deleted + if (LoadedProfileFile != null && LoadedProfileFile.Equals(profileFileInfo)) + LoadedProfileFileChanged(ProfileFiles.FirstOrDefault(x => !x.Equals(profileFileInfo))); - if (LoadedProfileFile != null && LoadedProfileFile.Equals(profileFileInfo)) - { - Save(); + RemoveGroupExpandState(profileFileInfo.Path); - switchProfile = true; - } - ProfileFileInfo newProfileFileInfo = new ProfileFileInfo(newProfileName, Path.Combine(GetProfilesLocation(), $"{newProfileName}{Path.GetExtension(profileFileInfo.Path)}"), profileFileInfo.IsEncrypted) - { - Password = profileFileInfo.Password, - IsPasswordValid = profileFileInfo.IsPasswordValid - }; + File.Delete(profileFileInfo.Path); + ProfileFiles.Remove(profileFileInfo); + } - File.Copy(profileFileInfo.Path, newProfileFileInfo.Path); - ProfileFiles.Add(newProfileFileInfo); + #endregion - if (switchProfile) - { - SwitchProfile(newProfileFileInfo, false); - LoadedProfileFileChanged(LoadedProfileFile); - } + #region Enable, disable encryption and change master password - File.Delete(profileFileInfo.Path); - ProfileFiles.Remove(profileFileInfo); - } + /// + /// Method to enable encryption for a profile file. + /// + /// which should be encrypted. + /// Password to encrypt the profile file. + /// Thrown when profileFileInfo or password is null. + public static void EnableEncryption(ProfileFileInfo profileFileInfo, SecureString password) + { + ArgumentNullException.ThrowIfNull(profileFileInfo); + ArgumentNullException.ThrowIfNull(password); - /// - /// Method to delete a profile file. - /// - /// - public static void DeleteProfileFile(ProfileFileInfo profileFileInfo) - { - if (LoadedProfileFile != null && LoadedProfileFile.Equals(profileFileInfo)) - { - SwitchProfile(ProfileFiles.FirstOrDefault(x => !x.Equals(profileFileInfo))); - LoadedProfileFileChanged(LoadedProfileFile); - } + // Check if the profile is currently in use + var switchProfile = false; - File.Delete(profileFileInfo.Path); - ProfileFiles.Remove(profileFileInfo); + if (LoadedProfileFile != null && LoadedProfileFile.Equals(profileFileInfo)) + { + Save(); + switchProfile = true; } - #endregion - #region Enable encryption, disable encryption, change master password - /// - /// Method to enable encryption for a profile file. - /// - /// which should be encrypted. - /// Password to encrypt the profile file. - public static void EnableEncryption(ProfileFileInfo profileFileInfo, SecureString password) - { - // Check if the profile is currently in use - bool switchProfile = false; + // Create backup + Backup(profileFileInfo.Path, + GetProfilesBackupFolderLocation(), + TimestampHelper.GetTimestampFilename(Path.GetFileName(profileFileInfo.Path))); - if (LoadedProfileFile != null && LoadedProfileFile.Equals(profileFileInfo)) - { - Save(); - switchProfile = true; - } + // Create a new profile info with the encryption infos + var newProfileFileInfo = new ProfileFileInfo(profileFileInfo.Name, + Path.ChangeExtension(profileFileInfo.Path, ProfileFileExtensionEncrypted), true) + { + Password = password, + IsPasswordValid = true + }; - // Create a new profile info with the encryption infos - var newProfileFileInfo = new ProfileFileInfo(profileFileInfo.Name, Path.ChangeExtension(profileFileInfo.Path, ProfileFileExtensionEncrypted), true) - { - Password = password, - IsPasswordValid = true - }; + // Save current state to prevent corruption + var previousLoadedProfileFileData = LoadedProfileFileData; - // Load the profiles from the profile file - var profiles = DeserializeFromFile(profileFileInfo.Path); + try + { + // Load the existing profile data (temporarily overwrites LoadedProfileFileData) + if (Path.GetExtension(profileFileInfo.Path) == LegacyProfileFileExtension) + DeserializeFromXmlFile(profileFileInfo.Path); + else + DeserializeFromFile(profileFileInfo.Path); // Save the encrypted file - byte[] decryptedBytes = SerializeToByteArray(profiles); - byte[] encryptedBytes = CryptoHelper.Encrypt(decryptedBytes, SecureStringHelper.ConvertToString(newProfileFileInfo.Password), GlobalStaticConfiguration.Profile_EncryptionKeySize, GlobalStaticConfiguration.Profile_EncryptionIterations); + var decryptedBytes = SerializeToByteArray(); + var encryptedBytes = CryptoHelper.Encrypt(decryptedBytes, + SecureStringHelper.ConvertToString(newProfileFileInfo.Password), + GlobalStaticConfiguration.Profile_EncryptionKeySize, + GlobalStaticConfiguration.Profile_EncryptionIterations); File.WriteAllBytes(newProfileFileInfo.Path, encryptedBytes); + } + finally + { + // Restore previous state if this wasn't the currently loaded profile + if (!switchProfile) + LoadedProfileFileData = previousLoadedProfileFileData; + } - // Add the new profile - ProfileFiles.Add(newProfileFileInfo); + // Add the new profile + ProfileFiles.Add(newProfileFileInfo); - // Switch profile, if it was previously loaded - if (switchProfile) - { - SwitchProfile(newProfileFileInfo, false); - LoadedProfileFileChanged(LoadedProfileFile); - } + MigrateGroupExpandState(profileFileInfo.Path, newProfileFileInfo.Path); - // Remove the old profile file - File.Delete(profileFileInfo.Path); - ProfileFiles.Remove(profileFileInfo); + // Switch profile, if it was previously loaded + if (switchProfile) + { + Switch(newProfileFileInfo, false); + LoadedProfileFileChanged(LoadedProfileFile, true); } - /// - /// Method to change the master password of an encrypted profile file. - /// - /// which should be changed. - /// Password to decrypt the profile file. - /// Password to encrypt the profile file. - public static void ChangeMasterPassword(ProfileFileInfo profileFileInfo, SecureString password, SecureString newPassword) + // Remove the old profile file + if (profileFileInfo.Path != null) + File.Delete(profileFileInfo.Path); + + ProfileFiles.Remove(profileFileInfo); + } + + /// + /// Method to change the master password of an encrypted profile file. + /// + /// which should be changed. + /// Password to decrypt the profile file. + /// Password to encrypt the profile file. + /// Thrown when profileFileInfo, password, or newPassword is null. + public static void ChangeMasterPassword(ProfileFileInfo profileFileInfo, SecureString password, + SecureString newPassword) + { + ArgumentNullException.ThrowIfNull(profileFileInfo); + ArgumentNullException.ThrowIfNull(password); + ArgumentNullException.ThrowIfNull(newPassword); + + // Check if the profile is currently in use + var switchProfile = false; + + if (LoadedProfileFile != null && LoadedProfileFile.Equals(profileFileInfo)) { - // Check if the profile is currently in use - bool switchProfile = false; + Save(); + switchProfile = true; + } - if (LoadedProfileFile != null && LoadedProfileFile.Equals(profileFileInfo)) - { - Save(); - switchProfile = true; - } + // Create backup + Backup(profileFileInfo.Path, + GetProfilesBackupFolderLocation(), + TimestampHelper.GetTimestampFilename(Path.GetFileName(profileFileInfo.Path))); - // Create a new profile info with the encryption infos - var newProfileFileInfo = new ProfileFileInfo(profileFileInfo.Name, Path.ChangeExtension(profileFileInfo.Path, ProfileFileExtensionEncrypted), true) - { - Password = newPassword, - IsPasswordValid = true - }; + // Create new profile info with the encryption infos + var newProfileFileInfo = new ProfileFileInfo(profileFileInfo.Name, + Path.ChangeExtension(profileFileInfo.Path, ProfileFileExtensionEncrypted), true) + { + Password = newPassword, + IsPasswordValid = true + }; + + // Save current state to prevent corruption + var previousLoadedProfileFileData = LoadedProfileFileData; - // Load and decrypt the profiles from the profile file + try + { + // Load and decrypt the profiles from the profile file (temporarily overwrites LoadedProfileFileData) var encryptedBytes = File.ReadAllBytes(profileFileInfo.Path); - var decryptedBytes = CryptoHelper.Decrypt(encryptedBytes, SecureStringHelper.ConvertToString(password), GlobalStaticConfiguration.Profile_EncryptionKeySize, GlobalStaticConfiguration.Profile_EncryptionIterations); - var profiles = DeserializeFromByteArray(decryptedBytes); + var decryptedBytes = CryptoHelper.Decrypt(encryptedBytes, SecureStringHelper.ConvertToString(password), + GlobalStaticConfiguration.Profile_EncryptionKeySize, + GlobalStaticConfiguration.Profile_EncryptionIterations); - // Save the encrypted file - decryptedBytes = SerializeToByteArray(profiles); - encryptedBytes = CryptoHelper.Encrypt(decryptedBytes, SecureStringHelper.ConvertToString(newProfileFileInfo.Password), GlobalStaticConfiguration.Profile_EncryptionKeySize, GlobalStaticConfiguration.Profile_EncryptionIterations); + if (IsXmlContent(decryptedBytes)) + DeserializeFromXmlByteArray(decryptedBytes); + else + DeserializeFromByteArray(decryptedBytes); - File.WriteAllBytes(newProfileFileInfo.Path, encryptedBytes); + // Save the encrypted file with new password + decryptedBytes = SerializeToByteArray(); + encryptedBytes = CryptoHelper.Encrypt(decryptedBytes, + SecureStringHelper.ConvertToString(newProfileFileInfo.Password), + GlobalStaticConfiguration.Profile_EncryptionKeySize, + GlobalStaticConfiguration.Profile_EncryptionIterations); - // Add the new profile - ProfileFiles.Add(newProfileFileInfo); + File.WriteAllBytes(newProfileFileInfo.Path, encryptedBytes); + } + finally + { + // Restore previous state if this wasn't the currently loaded profile + if (!switchProfile) + LoadedProfileFileData = previousLoadedProfileFileData; + } + // Add the new profile + ProfileFiles.Add(newProfileFileInfo); - // Switch profile, if it was previously loaded - if (switchProfile) - { - SwitchProfile(newProfileFileInfo, false); - LoadedProfileFileChanged(LoadedProfileFile); - } + MigrateGroupExpandState(profileFileInfo.Path, newProfileFileInfo.Path); - // Remove the old profile file - ProfileFiles.Remove(profileFileInfo); + // Switch profile, if it was previously loaded + if (switchProfile) + { + Switch(newProfileFileInfo, false); + LoadedProfileFileChanged(LoadedProfileFile, true); } - /// - /// Method to disable encryption for a profile file. - /// - /// which should be decrypted. - /// Password to decrypt the profile file. - public static void DisableEncryption(ProfileFileInfo profileFileInfo, SecureString password) + // Remove the old profile file + ProfileFiles.Remove(profileFileInfo); + } + + /// + /// Method to disable encryption for a profile file. + /// + /// which should be decrypted. + /// Password to decrypt the profile file. + /// Thrown when profileFileInfo or password is null. + public static void DisableEncryption(ProfileFileInfo profileFileInfo, SecureString password) + { + ArgumentNullException.ThrowIfNull(profileFileInfo); + ArgumentNullException.ThrowIfNull(password); + + // Check if the profile is currently in use + var switchProfile = false; + + if (LoadedProfileFile != null && LoadedProfileFile.Equals(profileFileInfo)) { - // Check if the profile is currently in use - bool switchProfile = false; + Save(); + switchProfile = true; + } - if (LoadedProfileFile != null && LoadedProfileFile.Equals(profileFileInfo)) - { - Save(); - switchProfile = true; - } + // Create backup + Backup(profileFileInfo.Path, + GetProfilesBackupFolderLocation(), + TimestampHelper.GetTimestampFilename(Path.GetFileName(profileFileInfo.Path))); + + // Create new profile info + var newProfileFileInfo = new ProfileFileInfo(profileFileInfo.Name, + Path.ChangeExtension(profileFileInfo.Path, ProfileFileExtension)); - // Create a new profile info - var newProfileFileInfo = new ProfileFileInfo(profileFileInfo.Name, Path.ChangeExtension(profileFileInfo.Path, ProfileFileExtension)); + // Save current state to prevent corruption + var previousLoadedProfileFileData = LoadedProfileFileData; - // Load and decrypt the profiles from the profile file + try + { + // Load and decrypt the profiles from the profile file (temporarily overwrites LoadedProfileFileData) var encryptedBytes = File.ReadAllBytes(profileFileInfo.Path); - var decryptedBytes = CryptoHelper.Decrypt(encryptedBytes, SecureStringHelper.ConvertToString(password), GlobalStaticConfiguration.Profile_EncryptionKeySize, GlobalStaticConfiguration.Profile_EncryptionIterations); - var profiles = DeserializeFromByteArray(decryptedBytes); + var decryptedBytes = CryptoHelper.Decrypt(encryptedBytes, SecureStringHelper.ConvertToString(password), + GlobalStaticConfiguration.Profile_EncryptionKeySize, + GlobalStaticConfiguration.Profile_EncryptionIterations); + + if (IsXmlContent(decryptedBytes)) + DeserializeFromXmlByteArray(decryptedBytes); + else + DeserializeFromByteArray(decryptedBytes); // Save the decrypted profiles to the profile file - SerializeToFile(newProfileFileInfo.Path, profiles); + SerializeToFile(newProfileFileInfo.Path); + } + finally + { + // Restore previous state if this wasn't the currently loaded profile + if (!switchProfile) + LoadedProfileFileData = previousLoadedProfileFileData; + } - // Add the new profile - ProfileFiles.Add(newProfileFileInfo); + // Add the new profile + ProfileFiles.Add(newProfileFileInfo); - // Switch profile, if it was previously loaded - if (switchProfile) - { - SwitchProfile(newProfileFileInfo, false); - LoadedProfileFileChanged(LoadedProfileFile); - } + MigrateGroupExpandState(profileFileInfo.Path, newProfileFileInfo.Path); - // Remove the old profile file - File.Delete(profileFileInfo.Path); - ProfileFiles.Remove(profileFileInfo); + // Switch profile, if it was previously loaded + if (switchProfile) + { + Switch(newProfileFileInfo, false); + LoadedProfileFileChanged(LoadedProfileFile, true); } - #endregion - #region Load, save and switch profile - /// - /// Method to load profiles based on the infos provided in the . - /// - /// to be loaded. - private static void Load(ProfileFileInfo profileFileInfo) + // Remove the old profile file + File.Delete(profileFileInfo.Path); + ProfileFiles.Remove(profileFileInfo); + } + + #endregion + + #region Load, save and switch profile + + /// + /// Method to load profiles based on the infos provided in the . + /// + /// to be loaded. + private static void Load(ProfileFileInfo profileFileInfo) + { + var loadedProfileUpdated = false; + + if (File.Exists(profileFileInfo.Path)) { - bool loadedProfileUpdated = false; + Log.Info($"Loading profile file from: {profileFileInfo.Path}"); - if (File.Exists(profileFileInfo.Path)) + // Encrypted profile file + if (profileFileInfo.IsEncrypted) { - if (profileFileInfo.IsEncrypted) + var encryptedBytes = File.ReadAllBytes(profileFileInfo.Path); + var decryptedBytes = CryptoHelper.Decrypt(encryptedBytes, + SecureStringHelper.ConvertToString(profileFileInfo.Password), + GlobalStaticConfiguration.Profile_EncryptionKeySize, + GlobalStaticConfiguration.Profile_EncryptionIterations); + + if (IsXmlContent(decryptedBytes)) { - var encryptedBytes = File.ReadAllBytes(profileFileInfo.Path); - var decryptedBytes = CryptoHelper.Decrypt(encryptedBytes, SecureStringHelper.ConvertToString(profileFileInfo.Password), GlobalStaticConfiguration.Profile_EncryptionKeySize, GlobalStaticConfiguration.Profile_EncryptionIterations); + // + // MIGRATION FROM LEGACY XML PROFILE FILE + // + + Log.Info($"Legacy XML profile file detected inside encrypted profile: {profileFileInfo.Path}. Migration in progress..."); + + // Load from legacy XML byte array + DeserializeFromXmlByteArray(decryptedBytes); - AddGroups(DeserializeFromByteArray(decryptedBytes)); + // Create a backup of the legacy XML file + Backup(profileFileInfo.Path, + GetProfilesBackupFolderLocation(), + TimestampHelper.GetTimestampFilename(Path.GetFileName(profileFileInfo.Path))); - // Password is valid - ProfileFiles.FirstOrDefault(x => x.Equals(profileFileInfo)).IsPasswordValid = true; - profileFileInfo.IsPasswordValid = true; - loadedProfileUpdated = true; + // Save encrypted profile file with new JSON format + var newDecryptedBytes = SerializeToByteArray(); + var newEncryptedBytes = CryptoHelper.Encrypt(newDecryptedBytes, + SecureStringHelper.ConvertToString(profileFileInfo.Password), + GlobalStaticConfiguration.Profile_EncryptionKeySize, + GlobalStaticConfiguration.Profile_EncryptionIterations); + + File.WriteAllBytes(profileFileInfo.Path, newEncryptedBytes); + + Log.Info($"Legacy XML profile file migration completed inside encrypted profile: {profileFileInfo.Path}."); } else { - AddGroups(DeserializeFromFile(profileFileInfo.Path)); + DeserializeFromByteArray(decryptedBytes); } + + // Password is valid + ProfileFiles.FirstOrDefault(x => x.Equals(profileFileInfo))!.IsPasswordValid = true; + profileFileInfo.IsPasswordValid = true; + loadedProfileUpdated = true; } + // Unencrypted profile file else { - // Don't throw an error if it's the default file. - if (profileFileInfo.Path != GetProfilesDefaultFilePath()) - throw new FileNotFoundException($"{profileFileInfo.Path} could not be found!"); - } + if (Path.GetExtension(profileFileInfo.Path) == LegacyProfileFileExtension) + { + // + // MIGRATION FROM LEGACY XML PROFILE FILE + // + Log.Info($"Legacy XML profile file detected: {profileFileInfo.Path}. Migration in progress..."); - ProfilesChanged = false; + // Load from legacy XML file + DeserializeFromXmlFile(profileFileInfo.Path); - LoadedProfileFile = profileFileInfo; + LoadedProfileFile = profileFileInfo; - if (loadedProfileUpdated) - LoadedProfileFileChanged(LoadedProfileFile); - } + // Create a backup of the legacy XML file and delete the original + Backup(profileFileInfo.Path, + GetProfilesBackupFolderLocation(), + TimestampHelper.GetTimestampFilename(Path.GetFileName(profileFileInfo.Path))); - /// - /// Method to save the currently loaded profiles based on the infos provided in the . - /// - public static void Save() - { - if (LoadedProfileFile == null) - return; + // Create new profile file info with JSON extension + var newProfileFileInfo = new ProfileFileInfo(profileFileInfo.Name, + Path.ChangeExtension(profileFileInfo.Path, ProfileFileExtension)); - CheckAndCreateDirectory(); + // Save new JSON file + SerializeToFile(newProfileFileInfo.Path); - // Write to an xml file. - if (LoadedProfileFile.IsEncrypted) - { - // Only if the password provided earlier was valid... - if (LoadedProfileFile.IsPasswordValid) - { - byte[] decryptedBytes = SerializeToByteArray(new List(Groups)); - byte[] encryptedBytes = CryptoHelper.Encrypt(decryptedBytes, SecureStringHelper.ConvertToString(LoadedProfileFile.Password), GlobalStaticConfiguration.Profile_EncryptionKeySize, GlobalStaticConfiguration.Profile_EncryptionIterations); + // Notify migration started + ProfileMigrationStarted(); + + // Add the new profile + ProfileFiles.Add(newProfileFileInfo); + + MigrateGroupExpandState(profileFileInfo.Path, newProfileFileInfo.Path); + + // Switch profile + Log.Info($"Switching to migrated profile file: {newProfileFileInfo.Path}."); + Switch(newProfileFileInfo, false); + LoadedProfileFileChanged(LoadedProfileFile, true); - File.WriteAllBytes(LoadedProfileFile.Path, encryptedBytes); + // Remove the old profile file + File.Delete(profileFileInfo.Path); + ProfileFiles.Remove(profileFileInfo); + + // Notify migration completed + ProfileMigrationCompleted(); + + Log.Info($"Legacy XML profile file migration completed: {profileFileInfo.Path}."); + return; + } + else + { + DeserializeFromFile(profileFileInfo.Path); } } - else - { - SerializeToFile(LoadedProfileFile.Path, new List(Groups)); - } - - ProfilesChanged = false; } - - public static void SwitchProfile(ProfileFileInfo info, bool saveLoadedProfiles = true) + else { - if (saveLoadedProfiles && LoadedProfileFile != null && ProfilesChanged) - Save(); + // Don't throw an error if it's the default file. + if (profileFileInfo.Path != GetProfilesDefaultFilePath()) + throw new FileNotFoundException($"{profileFileInfo.Path} could not be found!"); + } - Reset(); + LoadedProfileFile = profileFileInfo; - Load(info); - } - #endregion + if (loadedProfileUpdated) + LoadedProfileFileChanged(LoadedProfileFile, true); + + // Notify subscribers that profiles have been loaded/updated + ProfilesUpdated(false); + + Log.Info("Profile file loaded successfully."); + } - #region Serialize and deserialize - /// - /// - /// - /// - /// - private static void SerializeToFile(string filePath, List groups) + /// + /// Method to save the currently loaded profiles based on the infos provided in the . + /// + public static void Save() + { + if (LoadedProfileFile == null) { - List groupsSerializable = new(); + Log.Warn("Cannot save profiles because no profile file is loaded or the profile file is encrypted and not yet unlocked."); + + return; + } - string groupRemoteDesktopPassword = string.Empty; + // Ensure the profiles directory exists. + Directory.CreateDirectory(GetProfilesFolderLocation()); - foreach (GroupInfo group in groups) + // Create backup before modifying + CreateDailyBackupIfNeeded(); + + // Write profiles to the profile file (JSON, optionally encrypted). + if (LoadedProfileFile.IsEncrypted) + { + // Only if the password provided earlier was valid... + if (LoadedProfileFile.IsPasswordValid) { - List profilesSerializable = new(); + var decryptedBytes = SerializeToByteArray(); + var encryptedBytes = CryptoHelper.Encrypt(decryptedBytes, + SecureStringHelper.ConvertToString(LoadedProfileFile.Password), + GlobalStaticConfiguration.Profile_EncryptionKeySize, + GlobalStaticConfiguration.Profile_EncryptionIterations); - string profileRemoteDesktopPassword = string.Empty; + File.WriteAllBytes(LoadedProfileFile.Path, encryptedBytes); + } + } + else + { + SerializeToFile(LoadedProfileFile.Path); + } - foreach (ProfileInfo profile in group.Profiles) - { - if (profile.RemoteDesktop_Password != null) - profileRemoteDesktopPassword = SecureStringHelper.ConvertToString(profile.RemoteDesktop_Password); + LoadedProfileFileData?.ProfilesChanged = false; + } - profilesSerializable.Add(new ProfileInfoSerializable(profile) - { - RemoteDesktop_Password = profileRemoteDesktopPassword - }); - } + /// + /// Method to unload the currently loaded profile file. + /// + /// Save loaded profile file (default is true) + public static void Unload(bool saveLoadedProfiles = true) + { + if (saveLoadedProfiles && LoadedProfileFile != null && LoadedProfileFileData?.ProfilesChanged == true) + Save(); - if (group.RemoteDesktop_Password != null) - groupRemoteDesktopPassword = SecureStringHelper.ConvertToString(group.RemoteDesktop_Password); + LoadedProfileFile = null; + LoadedProfileFileData = new ProfileFileData(); - groupsSerializable.Add(new GroupInfoSerializable(group) - { - Profiles = profilesSerializable, - RemoteDesktop_Password = groupRemoteDesktopPassword - }); - } + // Don't mark as changed since we just unloaded + ProfilesUpdated(false); + } - var xmlSerializer = new XmlSerializer(typeof(List)); + /// + /// Method to switch to another profile file. + /// + /// New to load. + /// Save loaded profile file (default is true) + public static void Switch(ProfileFileInfo info, bool saveLoadedProfiles = true) + { + Unload(saveLoadedProfiles); - using var fileStream = new FileStream(filePath, FileMode.Create); + Load(info); + } - xmlSerializer.Serialize(fileStream, groupsSerializable); - } + #endregion - /// - /// - /// - /// - /// - private static byte[] SerializeToByteArray(List groups) - { - List groupsSerializable = new(); + #region Group expand state persistence - string groupRemoteDesktopPassword = string.Empty; + /// + /// Moves the persisted group-expand state (see ) + /// from the old to the new profile file path. No-op if the paths are equal or there is no state for + /// the old path. + /// + private static void MigrateGroupExpandState(string oldPath, string newPath) + { + if (oldPath == newPath) + return; - foreach (GroupInfo group in groups) - { - List profilesSerializable = new(); + if (SettingsManager.Current.Profiles_GroupExpandState.Remove(oldPath, out var state)) + { + SettingsManager.Current.Profiles_GroupExpandState[newPath] = state; + SettingsManager.Current.SettingsChanged = true; + } + } - string profileRemoteDesktopPassword = string.Empty; + /// + /// Removes the persisted group-expand state for a profile file that no longer exists. + /// + private static void RemoveGroupExpandState(string path) + { + if (SettingsManager.Current.Profiles_GroupExpandState.Remove(path)) + SettingsManager.Current.SettingsChanged = true; + } - foreach (ProfileInfo profile in group.Profiles) - { - if (profile.RemoteDesktop_Password != null) - profileRemoteDesktopPassword = SecureStringHelper.ConvertToString(profile.RemoteDesktop_Password); + /// + /// Renames the group key inside the persisted group-expand state for the currently loaded profile file. + /// + private static void MigrateGroupExpandStateKey(string oldGroupName, string newGroupName) + { + if (oldGroupName == newGroupName) + return; - profilesSerializable.Add(new ProfileInfoSerializable(profile) - { - RemoteDesktop_Password = profileRemoteDesktopPassword - }); - } + if (LoadedProfileFile == null) + return; - if (group.RemoteDesktop_Password != null) - groupRemoteDesktopPassword = SecureStringHelper.ConvertToString(group.RemoteDesktop_Password); + if (!SettingsManager.Current.Profiles_GroupExpandState.TryGetValue(LoadedProfileFile.Path, out var state)) + return; - groupsSerializable.Add(new GroupInfoSerializable(group) - { - Profiles = profilesSerializable, - RemoteDesktop_Password = groupRemoteDesktopPassword - }); - } + if (!state.Remove(oldGroupName, out var isExpanded)) + return; - var xmlSerializer = new XmlSerializer(typeof(List)); + state[newGroupName] = isExpanded; + SettingsManager.Current.SettingsChanged = true; + } - using var memoryStream = new MemoryStream(); + /// + /// Removes the group key from the persisted group-expand state for the currently loaded profile file. + /// + private static void RemoveGroupExpandStateKey(string groupName) + { + if (LoadedProfileFile == null) + return; - using var streamWriter = new StreamWriter(memoryStream, Encoding.UTF8); + if (SettingsManager.Current.Profiles_GroupExpandState.TryGetValue(LoadedProfileFile.Path, out var state) + && state.Remove(groupName)) + SettingsManager.Current.SettingsChanged = true; + } - xmlSerializer.Serialize(streamWriter, groupsSerializable); + #endregion - return memoryStream.ToArray(); - } + #region Serialize and deserialize - /// - /// - /// - /// Path of an XML file. - /// List of . - private static List DeserializeFromFile(string filePath) - { - List groups = new(); + /// + /// Method to serialize profile data to a JSON file. + /// + /// Path to a JSON file. + private static void SerializeToFile(string filePath) + { + // Ensure LoadedProfileFileData exists + LoadedProfileFileData ??= new ProfileFileData(); - XmlSerializer xmlSerializer = new(typeof(List)); + var jsonString = JsonSerializer.Serialize(LoadedProfileFileData, JsonOptions); - using (FileStream fileStream = new(filePath, FileMode.Open)) - { - foreach (GroupInfoSerializable groupSerializable in (List)xmlSerializer.Deserialize(fileStream)) - { - List profiles = new(); + File.WriteAllText(filePath, jsonString); + } - foreach (ProfileInfoSerializable profileSerializable in groupSerializable.Profiles) - { - ProfileInfo profile = new(profileSerializable) - { - RemoteDesktop_Password = !string.IsNullOrEmpty(profileSerializable.RemoteDesktop_Password) ? SecureStringHelper.ConvertToSecureString(profileSerializable.RemoteDesktop_Password) : null - }; + /// + /// Method to serialize profile data to a byte array. + /// + /// Serialized profile data as byte array. + private static byte[] SerializeToByteArray() + { + // Ensure LoadedProfileFileData exists + LoadedProfileFileData ??= new ProfileFileData(); - profiles.Add(profile); - } + var jsonString = JsonSerializer.Serialize(LoadedProfileFileData, JsonOptions); - groups.Add(new(groupSerializable) - { - Profiles = profiles, + return Encoding.UTF8.GetBytes(jsonString); + } - // Convert passwort to secure string - RemoteDesktop_Password = !string.IsNullOrEmpty(groupSerializable.RemoteDesktop_Password) ? SecureStringHelper.ConvertToSecureString(groupSerializable.RemoteDesktop_Password) : null - }); - } - } + /// + /// Method to deserialize profile data from a JSON file. + /// + /// Path to a JSON file. + private static void DeserializeFromFile(string filePath) + { + var jsonString = File.ReadAllText(filePath); - return groups; - } + DeserializeFromJson(jsonString); + } - /// - /// - /// - /// XML as Array. - /// List of . - private static List DeserializeFromByteArray(byte[] xml) - { - List groups = new(); + /// + /// Method to deserialize a list of groups as from a legacy XML file. + /// + /// Path to an XML file. + [Obsolete("Legacy XML profile files are no longer used, but the method is kept for migration purposes.")] + private static void DeserializeFromXmlFile(string filePath) + { + using FileStream fileStream = new(filePath, FileMode.Open); - XmlSerializer xmlSerializer = new(typeof(List)); + DeserializeFromXmlStream(fileStream); + } - using MemoryStream memoryStream = new(xml); + /// + /// Method to deserialize profile data from a byte array. + /// + /// Serialized profile data as byte array. + private static void DeserializeFromByteArray(byte[] data) + { + var jsonString = Encoding.UTF8.GetString(data); - foreach (GroupInfoSerializable groupSerializable in (List)xmlSerializer.Deserialize(memoryStream)) - { - List profiles = new(); + DeserializeFromJson(jsonString); + } - foreach (ProfileInfoSerializable profileSerializable in groupSerializable.Profiles) - { - ProfileInfo profile = new(profileSerializable) - { - RemoteDesktop_Password = !string.IsNullOrEmpty(profileSerializable.RemoteDesktop_Password) ? SecureStringHelper.ConvertToSecureString(profileSerializable.RemoteDesktop_Password) : null - }; + /// + /// Method to deserialize a list of groups as from a legacy XML byte array. + /// + /// Serialized list of groups as as XML byte array. + [Obsolete("Legacy XML profile files are no longer used, but the method is kept for migration purposes.")] + private static void DeserializeFromXmlByteArray(byte[] xml) + { + using MemoryStream memoryStream = new(xml); - profiles.Add(profile); - } + DeserializeFromXmlStream(memoryStream); + } - groups.Add(new(groupSerializable) - { - Profiles = profiles, + /// + /// Method to deserialize profile data from JSON string. + /// + /// JSON string to deserialize. + private static void DeserializeFromJson(string jsonString) + { + try + { + var profileFileData = JsonSerializer.Deserialize(jsonString, JsonOptions); - // Convert passwort to secure string - RemoteDesktop_Password = !string.IsNullOrEmpty(groupSerializable.RemoteDesktop_Password) ? SecureStringHelper.ConvertToSecureString(groupSerializable.RemoteDesktop_Password) : null - }); + if (profileFileData != null) + { + LoadedProfileFileData = profileFileData; + return; } - - return groups; } - #endregion - - #region Move profiles - public static Task MoveProfilesAsync(string targedLocation, bool overwrite) + catch (JsonException) { - return Task.Run(() => MoveProfiles(targedLocation, overwrite)); + Log.Info("Failed to deserialize as ProfileFileData, trying legacy format (direct Groups array)..."); } - private static void MoveProfiles(string targedLocation, bool overwrite) - { - // Save the current profile - Save(); + // Fallback: Try to deserialize as legacy format (direct array of GroupInfoSerializable) + var groupsSerializable = JsonSerializer.Deserialize>(jsonString, JsonOptions); - // Create the directory - if (!Directory.Exists(targedLocation)) - Directory.CreateDirectory(targedLocation); + if (groupsSerializable == null) + throw new InvalidOperationException("Failed to deserialize JSON profile file."); - // Copy files - foreach (var profileFile in ProfileFiles) - File.Copy(profileFile.Path, Path.Combine(targedLocation, Path.GetFileName(profileFile.Path)), overwrite); + // Create ProfileFileData wrapper for legacy format + LoadedProfileFileData = new ProfileFileData + { + GroupsSerializable = groupsSerializable + }; + + Log.Info("Successfully loaded profile file in legacy format. It will be migrated to new format on next save."); + } - // Remove old profile files - foreach (var profileFile in ProfileFiles) - File.Delete(profileFile.Path); + /// + /// Method to deserialize a list of groups as from an XML stream. + /// + /// Stream to deserialize. + [Obsolete("Legacy XML profile files are no longer used, but the method is kept for migration purposes.")] + private static void DeserializeFromXmlStream(Stream stream) + { + XmlSerializer xmlSerializer = new(typeof(List)); - // Delete folder, if it is empty - var profileLocation = GetProfilesLocation(); + var groupsSerializable = xmlSerializer.Deserialize(stream) as List; - if (Directory.GetFiles(profileLocation).Length == 0 && Directory.GetDirectories(profileLocation).Length == 0) - Directory.Delete(profileLocation); - } - #endregion + if (groupsSerializable == null) + throw new InvalidOperationException("Failed to deserialize XML profile file."); - #region Add group, remove group, get groups - /// - /// - /// - /// - public static void AddGroups(List groups) + LoadedProfileFileData = new ProfileFileData { - foreach (GroupInfo group in groups) - Groups.Add(group); + GroupsSerializable = groupsSerializable + }; + } - ProfilesUpdated(); - } + /// + /// Method to check if the byte array content is XML. + /// + /// Byte array to check. + /// True if the content is XML. + [Obsolete("Legacy XML profile files are no longer used, but the method is kept for migration purposes.")] + private static bool IsXmlContent(byte[] data) + { + if (data == null || data.Length == 0) + return false; - /// - /// - /// - /// - public static void AddGroup(GroupInfo group) + try { - Groups.Add(group); - - ProfilesUpdated(); + // Only check the first few bytes for performance + var bytesToCheck = Math.Min(XmlDetectionBufferSize, data.Length); + var text = Encoding.UTF8.GetString(data, 0, bytesToCheck).TrimStart(); + // Check for XML declaration or root element that matches profile structure + return text.StartsWith(" x.Name.Equals(name)); + return false; } + } - public static void ReplaceGroup(GroupInfo oldGroup, GroupInfo newGroup) - { - Groups.Remove(oldGroup); - Groups.Add(newGroup); + #endregion - ProfilesUpdated(); - } + #region Add, remove, replace group(s) and more. - /// - /// - /// - /// - public static void RemoveGroup(GroupInfo group) + /// + /// Method to add a list of to the loaded profile data. + /// + /// List of groups as to add. + /// Thrown when groups collection is null. + private static void AddGroups(List groups, bool profilesChanged = true) + { + ArgumentNullException.ThrowIfNull(groups); + + var skippedCount = 0; + foreach (var group in groups) { - Groups.Remove(group); + if (group is null) + { + skippedCount++; + continue; + } - ProfilesUpdated(); + LoadedProfileFileData.Groups.Add(group); } - /// - /// Method to get a list of all group names. - /// - /// List of group names. - public static List GetGroupNames() + if (skippedCount > 0) + Log.Warn($"AddGroups skipped {skippedCount} null group(s) in collection."); + + ProfilesUpdated(profilesChanged); + } + + /// + /// Method to add a to the loaded profile data. + /// + /// Group as to add. + /// Thrown when group is null. + public static void AddGroup(GroupInfo group, bool profilesChanged = true) + { + ArgumentNullException.ThrowIfNull(group); + + LoadedProfileFileData.Groups.Add(group); + + ProfilesUpdated(profilesChanged); + } + + /// + /// Method to get a group by name. + /// + /// Name of the group. + /// Group as . + /// Thrown when name is null or empty. + /// Thrown when group with specified name is not found. + public static GroupInfo GetGroupByName(string name) + { + ArgumentException.ThrowIfNullOrWhiteSpace(name); + + + var group = LoadedProfileFileData.Groups.FirstOrDefault(x => x.Name.Equals(name)); + + if (group == null) + throw new InvalidOperationException($"Group '{name}' not found."); + + return group; + } + + /// + /// Method to replace a group. + /// + /// Old group as . + /// New group as . + /// Thrown when oldGroup or newGroup is null. + public static void ReplaceGroup(GroupInfo oldGroup, GroupInfo newGroup) + { + ArgumentNullException.ThrowIfNull(oldGroup); + ArgumentNullException.ThrowIfNull(newGroup); + + LoadedProfileFileData.Groups.Remove(oldGroup); + LoadedProfileFileData.Groups.Add(newGroup); + + MigrateGroupExpandStateKey(oldGroup.Name, newGroup.Name); + + ProfilesUpdated(); + } + + /// + /// Method to remove a group. + /// + /// Group as to remove + /// Thrown when group is null. + public static void RemoveGroup(GroupInfo group) + { + ArgumentNullException.ThrowIfNull(group); + + LoadedProfileFileData.Groups.Remove(group); + + RemoveGroupExpandStateKey(group.Name); + + ProfilesUpdated(); + } + + /// + /// Method to get a list of all group names. + /// + /// List of group names. + public static IReadOnlyCollection GetGroupNames() + { + return (from groups in LoadedProfileFileData.Groups where !groups.IsDynamic select groups.Name).ToList(); + } + + /// + /// Method to check if a profile exists. + /// + /// Name of the group. + /// True if the profile exists. + public static bool GroupExists(string name) + { + return LoadedProfileFileData.Groups.Any(group => group.Name == name); + } + + /// + /// Method checks if a group has profiles. + /// + /// Name of the group + /// True if the group has no profiles. + /// Thrown when name is null or empty. + /// Thrown when group with specified name is not found. + public static bool IsGroupEmpty(string name) + { + ArgumentException.ThrowIfNullOrWhiteSpace(name); + + var group = LoadedProfileFileData.Groups.FirstOrDefault(x => x.Name == name); + + if (group == null) + throw new InvalidOperationException($"Group '{name}' not found."); + + return group.Profiles.Count == 0; + } + + #endregion + + #region Add, replace and remove profile(s) + + /// + /// Method to add a profile to a group. + /// + /// Profile as to add. + /// Thrown when profile is null. + /// Thrown when profile.Group is null or empty. + /// Thrown when profile's group is not found after creation attempt. + public static void AddProfile(ProfileInfo profile) + { + ArgumentNullException.ThrowIfNull(profile); + ArgumentException.ThrowIfNullOrWhiteSpace(profile.Group, nameof(profile)); + + if (!GroupExists(profile.Group)) + AddGroup(new GroupInfo(profile.Group)); + + var group = LoadedProfileFileData.Groups.FirstOrDefault(x => x.Name.Equals(profile.Group)); + + if (group == null) + throw new InvalidOperationException($"Group '{profile.Group}' not found for profile after creation attempt."); + + group.Profiles.Add(profile); + + ProfilesUpdated(); + } + + /// + /// Method to add multiple profiles, creating missing groups as needed. + /// Fires once after all profiles are added. + /// + /// Profiles to add. + /// Thrown when profiles is null. + public static void AddProfiles(IEnumerable profiles) + { + ArgumentNullException.ThrowIfNull(profiles); + + foreach (var profile in profiles) { - var list = new List(); + if (profile is null) + continue; + + if (!GroupExists(profile.Group)) + AddGroup(new GroupInfo(profile.Group), profilesChanged: false); - foreach (var groups in Groups) - list.Add(groups.Name); + var group = LoadedProfileFileData.Groups.FirstOrDefault(x => x.Name.Equals(profile.Group)); - return list; + if (group == null) + throw new InvalidOperationException($"Group '{profile.Group}' not found after creation attempt."); + + group.Profiles.Add(profile); } - /// - /// Method to check if a profile exists. - /// - /// Name of the group. - /// True if the profile exists. - public static bool GroupExists(string name) + ProfilesUpdated(); + } + + /// + /// Method to replace a profile in a group. + /// + /// Old profile as . + /// New profile as . + /// Thrown when oldProfile or newProfile is null. + /// Thrown when profile groups are null or empty. + /// Thrown when old profile's group is not found. + public static void ReplaceProfile(ProfileInfo oldProfile, ProfileInfo newProfile) + { + ArgumentNullException.ThrowIfNull(oldProfile); + ArgumentNullException.ThrowIfNull(newProfile); + ArgumentException.ThrowIfNullOrWhiteSpace(oldProfile.Group, nameof(oldProfile)); + ArgumentException.ThrowIfNullOrWhiteSpace(newProfile.Group, nameof(newProfile)); + + // Remove from old group + var oldGroup = LoadedProfileFileData.Groups.FirstOrDefault(x => x.Name.Equals(oldProfile.Group)); + + if (oldGroup == null) + throw new InvalidOperationException($"Group '{oldProfile.Group}' not found for old profile."); + + oldGroup.Profiles.Remove(oldProfile); + + // Add to new group (create if doesn't exist) + if (!GroupExists(newProfile.Group)) + AddGroup(new GroupInfo(newProfile.Group)); + + var newGroup = LoadedProfileFileData.Groups.FirstOrDefault(x => x.Name.Equals(newProfile.Group)); + + if (newGroup == null) + throw new InvalidOperationException($"Group '{newProfile.Group}' not found for new profile after creation attempt."); + + newGroup.Profiles.Add(newProfile); + + ProfilesUpdated(); + } + + /// + /// Method to remove a profile from a group. + /// + /// Profile as to remove. + /// Thrown when profile is null. + /// Thrown when profile.Group is null or empty. + /// Thrown when profile's group is not found. + public static void RemoveProfile(ProfileInfo profile) + { + ArgumentNullException.ThrowIfNull(profile); + ArgumentException.ThrowIfNullOrWhiteSpace(profile.Group, nameof(profile)); + + var group = LoadedProfileFileData.Groups.FirstOrDefault(x => x.Name.Equals(profile.Group)); + + if (group == null) + throw new InvalidOperationException($"Group '{profile.Group}' not found."); + + group.Profiles.Remove(profile); + + ProfilesUpdated(); + } + + /// + /// Method to remove a list of profiles from a group. + /// + /// List of profiles as to remove. + /// Thrown when profiles collection is null. + public static void RemoveProfiles(IEnumerable profiles) + { + ArgumentNullException.ThrowIfNull(profiles); + + var skippedCount = 0; + foreach (var profile in profiles) { - foreach (GroupInfo group in Groups) + if (profile is null || string.IsNullOrWhiteSpace(profile.Group)) { - if (group.Name == name) - return true; + skippedCount++; + continue; } - return false; + var group = LoadedProfileFileData.Groups.FirstOrDefault(x => x.Name.Equals(profile.Group)); + + if (group == null) + { + Log.Warn($"RemoveProfiles: Group '{profile.Group}' not found for profile '{profile.Name ?? ""}'."); + skippedCount++; + continue; + } + + group.Profiles.Remove(profile); } - /// - /// Method checks if a group has profiles. - /// - /// Name of the group - /// True if the group has no profiles. - public static bool IsGroupEmpty(string name) + if (skippedCount > 0) + Log.Warn($"RemoveProfiles skipped {skippedCount} null or invalid profile(s) in collection."); + + ProfilesUpdated(); + } + + #endregion + + #region Backup + + /// + /// Creates a backup of the currently loaded profile file if a backup has not already been created for the current day. + /// + private static void CreateDailyBackupIfNeeded() + { + // Skip if daily backups are disabled + if (!SettingsManager.Current.Profiles_IsDailyBackupEnabled) { - return Groups.FirstOrDefault(x => x.Name == name).Profiles.Count == 0; + Log.Info("Daily profile backups are disabled. Skipping backup creation..."); + return; } - #endregion - #region Add profile, remove profile - /// - /// Add a profile to a group. - /// - /// to add. - public static void AddProfile(ProfileInfo profile) + // Skip if no profile is loaded + if (LoadedProfileFile == null || LoadedProfileFileData == null) { - if (!GroupExists(profile.Group)) - AddGroup(new GroupInfo(profile.Group)); - - Groups.First(x => x.Name.Equals(profile.Group)).Profiles.Add(profile); + Log.Info("No profile file is currently loaded. Skipping backup creation..."); + return; + } - ProfilesUpdated(); + // Skip if the profile file doesn't exist yet + if (!File.Exists(LoadedProfileFile.Path)) + { + Log.Warn($"Profile file does not exist yet: {LoadedProfileFile.Path}. Skipping backup creation..."); + return; } - public static void ReplaceProfile(ProfileInfo oldProfile, ProfileInfo newProfile) + // Create backup if needed + var currentDate = DateTime.Now.Date; + var lastBackupDate = LoadedProfileFileData.LastBackup?.Date ?? DateTime.MinValue; + var profileFileName = Path.GetFileName(LoadedProfileFile.Path); + + if (lastBackupDate < currentDate) { - // Remove - Groups.First(x => x.Name.Equals(oldProfile.Group)).Profiles.Remove(oldProfile); + Log.Info($"Creating daily backup for profile: {profileFileName}"); - // Add - if (!GroupExists(newProfile.Group)) - AddGroup(new GroupInfo(newProfile.Group)); + // Create backup + Backup(LoadedProfileFile.Path, + GetProfilesBackupFolderLocation(), + TimestampHelper.GetTimestampFilename(profileFileName)); - Groups.First(x => x.Name.Equals(newProfile.Group)).Profiles.Add(newProfile); + // Cleanup old backups + CleanupBackups(GetProfilesBackupFolderLocation(), + profileFileName, + SettingsManager.Current.Profiles_MaximumNumberOfBackups); - // Notify - ProfilesUpdated(); + LoadedProfileFileData.LastBackup = currentDate; } + } - /// - /// Remove a profile from a group. - /// - /// to remove. - public static void RemoveProfile(ProfileInfo profile) + /// + /// Deletes older backup files in the specified folder to ensure that only the most recent backups, up to the + /// specified maximum, are retained. + /// + /// The full path to the directory containing the backup files to be managed. + /// The profile file name pattern used to identify backup files for cleanup. + /// The maximum number of backup files to retain. Must be greater than zero. + private static void CleanupBackups(string backupFolderPath, string profileFileName, int maxBackupFiles) + { + // Skip if backup directory doesn't exist + if (!Directory.Exists(backupFolderPath)) { - Groups.First(x => x.Name.Equals(profile.Group)).Profiles.Remove(profile); - - ProfilesUpdated(); + Log.Error($"Backup directory does not exist: {backupFolderPath}. Cannot cleanup old backups."); + return; } - /// - /// Remove profiles from a group. - /// - /// to remove. - public static void RemoveProfiles(IList profiles) - { - foreach (ProfileInfo profile in profiles) - Groups.First(x => x.Name.Equals(profile.Group)).Profiles.Remove(profile); + // Extract profile name without extension to match all backup files regardless of extension + // (e.g., "Default" matches "2025-01-19_Default.json", "2025-01-19_Default.encrypted", etc.) + var profileNameWithoutExtension = Path.GetFileNameWithoutExtension(profileFileName); - ProfilesUpdated(); - } - #endregion + // Get all backup files for this specific profile (any extension) sorted by timestamp (newest first) + var backupFiles = Directory.GetFiles(backupFolderPath) + .Where(f => + { + var fileName = Path.GetFileName(f); - #region Helper - /// - /// Method to reset the profiles. - /// - public static void Reset() - { - Groups.Clear(); + // Check if it's a timestamped backup and contains the profile name + return TimestampHelper.IsTimestampedFilename(fileName) && + fileName.Contains($"_{profileNameWithoutExtension}."); + }) + .OrderByDescending(f => TimestampHelper.ExtractTimestampFromFilename(Path.GetFileName(f))) + .ToList(); - ProfilesUpdated(); - } + if (backupFiles.Count > maxBackupFiles) + Log.Info($"Cleaning up old backup files for {profileNameWithoutExtension}... Found {backupFiles.Count} backups, keeping the most recent {maxBackupFiles}."); - /// - /// Create directory if it does not exist. - /// - private static void CheckAndCreateDirectory() + // Delete oldest backups until the maximum number is reached + while (backupFiles.Count > maxBackupFiles) { - var location = GetProfilesLocation(); + var fileToDelete = backupFiles.Last(); - if (!Directory.Exists(location)) - Directory.CreateDirectory(location); + File.Delete(fileToDelete); + + backupFiles.RemoveAt(backupFiles.Count - 1); + + Log.Info($"Backup deleted: {fileToDelete}"); } - #endregion } + + /// + /// Creates a backup of the specified profile file in the given backup folder with the provided backup file name. + /// + /// The full path to the profile file to back up. Cannot be null or empty. + /// The directory path where the backup file will be stored. If the directory does not exist, it will be created. + /// The name to use for the backup file within the backup folder. Cannot be null or empty. + private static void Backup(string filePath, string backupFolderPath, string backupFileName) + { + // Create the backup directory if it does not exist + Directory.CreateDirectory(backupFolderPath); + + // Create the backup file path + var backupFilePath = Path.Combine(backupFolderPath, backupFileName); + + // Copy the current profile file to the backup location + File.Copy(filePath, backupFilePath, true); + + Log.Info($"Backup created: {backupFilePath}"); + } + + #endregion } diff --git a/Source/NETworkManager.Profiles/ProfileName.cs b/Source/NETworkManager.Profiles/ProfileName.cs new file mode 100644 index 0000000000..7db47b880f --- /dev/null +++ b/Source/NETworkManager.Profiles/ProfileName.cs @@ -0,0 +1,22 @@ +namespace NETworkManager.Profiles; + +public enum ProfileName +{ + General, + NetworkInterface, + IPScanner, + PortScanner, + PingMonitor, + Traceroute, + DNSLookup, + RemoteDesktop, + PowerShell, + PuTTY, + TigerVNC, + WebConsole, + SNMP, + Firewall, + WakeOnLAN, + Whois, + IPGeolocation, +} \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/ProfileViewInfo.cs b/Source/NETworkManager.Profiles/ProfileViewInfo.cs index 186d258675..4d96cf6c25 100644 --- a/Source/NETworkManager.Profiles/ProfileViewInfo.cs +++ b/Source/NETworkManager.Profiles/ProfileViewInfo.cs @@ -1,30 +1,67 @@ using System.Windows; using System.Windows.Controls; -namespace NETworkManager.Profiles +namespace NETworkManager.Profiles; + +/// +/// Represents the information required to display a profile, including the profile name, icon, and associated +/// group. +/// +/// The ProfileViewInfo class provides flexibility for representing a profile's icon by allowing either a +/// pre-existing Canvas or a UIElement to be used. This enables customization of the profile's visual appearance. The +/// class is typically used to encapsulate profile display data for UI scenarios where grouping and icon representation +/// are important. +public class ProfileViewInfo { - public class ProfileViewInfo + /// + /// Initializes a new instance of the ProfileViewInfo class with the specified profile name, icon, and group. + /// + /// The name of the profile to associate with this view. Must be a valid ProfileName instance. + /// The icon representing the profile. Cannot be null. + /// The group to which the profile belongs. Must be a valid ProfileGroup instance. + public ProfileViewInfo(ProfileName name, Canvas icon, ProfileGroup group) { - public ProfileViewName Name { get; set; } + Name = name; + Icon = icon; + Group = group; + } - public Canvas Icon { get; set; } + /// + /// Initializes a new instance of the ProfileViewInfo class with the specified profile name, UI element, and profile + /// group. + /// + /// The provided UI element is added to a Canvas, allowing for flexible layout and rendering + /// within the profile view. + /// The name of the profile to associate with this view. Must be a valid ProfileName instance. + /// The UI element to display within the profile view. Cannot be null. + /// The group to which this profile belongs. Must be a valid ProfileGroup instance. + public ProfileViewInfo(ProfileName name, UIElement uiElement, ProfileGroup group) + { + Name = name; + var canvas = new Canvas(); + canvas.Children.Add(uiElement); + Icon = canvas; + Group = group; + } - public ProfileViewInfo() - { - } + /// + /// Gets or sets the name of the profile. + /// + /// The profile name is used to identify the profile in various operations. It should be unique + /// within the context of the application. + public ProfileName Name { get; set; } - public ProfileViewInfo(ProfileViewName name, Canvas icon) - { - Name = name; - Icon = icon; - } + /// + /// Gets or sets the icon displayed on the canvas. + /// + /// This property allows customization of the visual representation of the canvas. The icon can be + /// used to convey additional information or branding associated with the canvas content. + public Canvas Icon { get; set; } - public ProfileViewInfo(ProfileViewName name, UIElement uiElement) - { - Name = name; - var canvas = new Canvas(); - canvas.Children.Add(uiElement); - Icon = canvas; - } - } + /// + /// Gets or sets the profile group associated with the user profile. + /// + /// This property allows for categorizing user profiles into different groups, which can be used + /// for managing permissions and settings based on group membership. + public ProfileGroup Group { get; set; } } diff --git a/Source/NETworkManager.Profiles/ProfileViewManager.cs b/Source/NETworkManager.Profiles/ProfileViewManager.cs index f595c9fade..606041e5b2 100644 --- a/Source/NETworkManager.Profiles/ProfileViewManager.cs +++ b/Source/NETworkManager.Profiles/ProfileViewManager.cs @@ -1,31 +1,64 @@ -using MahApps.Metro.IconPacks; +using System.Collections.Generic; +using MahApps.Metro.IconPacks; using NETworkManager.Models; -using System.Collections.Generic; -namespace NETworkManager.Profiles +namespace NETworkManager.Profiles; + +/// +/// Provides centralized access to all available profile views within the application. +/// +/// The ProfileViewManager class exposes a static list of ProfileViewInfo objects, each representing a +/// distinct application or tool, such as network utilities and monitoring features. This enables developers to +/// enumerate and display profile views, each associated with an icon and a profile group, for use in user interfaces or +/// configuration scenarios. +public static class ProfileViewManager { - public static class ProfileViewManager - { - // List of all applications - public static List List => new List - { - // General - new ProfileViewInfo(ProfileViewName.General, new PackIconModern{ Kind = PackIconModernKind.Box }), + /// + /// Gets a static collection of predefined profile view information, organized by general and application profiles. + /// + /// The collection contains instances of ProfileViewInfo representing various network and + /// application tools, each associated with an icon and a profile group. Use this property to access commonly used + /// profiles for display or selection purposes. + public static List List => + [ + // General + new(ProfileName.General, new PackIconModern { Kind = PackIconModernKind.Box }, + ProfileGroup.General), - // Applications - new ProfileViewInfo(ProfileViewName.NetworkInterface, ApplicationManager.GetIcon(ApplicationName.NetworkInterface)), - new ProfileViewInfo(ProfileViewName.IPScanner, ApplicationManager.GetIcon(ApplicationName.IPScanner)), - new ProfileViewInfo(ProfileViewName.PortScanner, ApplicationManager.GetIcon(ApplicationName.PortScanner)), - new ProfileViewInfo(ProfileViewName.PingMonitor, ApplicationManager.GetIcon(ApplicationName.PingMonitor)), - new ProfileViewInfo(ProfileViewName.Traceroute, ApplicationManager.GetIcon(ApplicationName.Traceroute)), - new ProfileViewInfo(ProfileViewName.DNSLookup, ApplicationManager.GetIcon(ApplicationName.DNSLookup)), - new ProfileViewInfo(ProfileViewName.RemoteDesktop, ApplicationManager.GetIcon(ApplicationName.RemoteDesktop)), - new ProfileViewInfo(ProfileViewName.PowerShell, ApplicationManager.GetIcon(ApplicationName.PowerShell)), - new ProfileViewInfo(ProfileViewName.PuTTY, ApplicationManager.GetIcon(ApplicationName.PuTTY)), - new ProfileViewInfo(ProfileViewName.TigerVNC, ApplicationManager.GetIcon(ApplicationName.TigerVNC)), - new ProfileViewInfo(ProfileViewName.WebConsole, ApplicationManager.GetIcon(ApplicationName.WebConsole)), - new ProfileViewInfo(ProfileViewName.WakeOnLAN, ApplicationManager.GetIcon(ApplicationName.WakeOnLAN)), - new ProfileViewInfo(ProfileViewName.Whois, ApplicationManager.GetIcon(ApplicationName.Whois)) - }; - } -} + // Applications + new(ProfileName.NetworkInterface, ApplicationManager.GetIcon(ApplicationName.NetworkInterface), + ProfileGroup.Application), + new(ProfileName.IPScanner, ApplicationManager.GetIcon(ApplicationName.IPScanner), + ProfileGroup.Application), + new(ProfileName.PortScanner, ApplicationManager.GetIcon(ApplicationName.PortScanner), + ProfileGroup.Application), + new(ProfileName.PingMonitor, ApplicationManager.GetIcon(ApplicationName.PingMonitor), + ProfileGroup.Application), + new(ProfileName.Traceroute, ApplicationManager.GetIcon(ApplicationName.Traceroute), + ProfileGroup.Application), + new(ProfileName.DNSLookup, ApplicationManager.GetIcon(ApplicationName.DNSLookup), + ProfileGroup.Application), + new(ProfileName.RemoteDesktop, ApplicationManager.GetIcon(ApplicationName.RemoteDesktop), + ProfileGroup.Application), + new(ProfileName.PowerShell, ApplicationManager.GetIcon(ApplicationName.PowerShell), + ProfileGroup.Application), + new(ProfileName.PuTTY, ApplicationManager.GetIcon(ApplicationName.PuTTY), + ProfileGroup.Application), + new(ProfileName.TigerVNC, ApplicationManager.GetIcon(ApplicationName.TigerVNC), + ProfileGroup.Application), + new(ProfileName.WebConsole, ApplicationManager.GetIcon(ApplicationName.WebConsole), + ProfileGroup.Application), + new(ProfileName.SNMP, ApplicationManager.GetIcon(ApplicationName.SNMP), + ProfileGroup.Application), + /* + new(ProfileName.Firewall, ApplicationManager.GetIcon(ApplicationName.Firewall), + ProfileGroup.Application), + */ + new(ProfileName.WakeOnLAN, ApplicationManager.GetIcon(ApplicationName.WakeOnLAN), + ProfileGroup.Application), + new(ProfileName.Whois, ApplicationManager.GetIcon(ApplicationName.Whois), + ProfileGroup.Application), + new(ProfileName.IPGeolocation, ApplicationManager.GetIcon(ApplicationName.IPGeolocation), + ProfileGroup.Application), + ]; +} \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/ProfileViewName.cs b/Source/NETworkManager.Profiles/ProfileViewName.cs deleted file mode 100644 index f0ab7dbd38..0000000000 --- a/Source/NETworkManager.Profiles/ProfileViewName.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace NETworkManager.Profiles -{ - public enum ProfileViewName - { - General, - NetworkInterface, - IPScanner, - PortScanner, - PingMonitor, - Traceroute, - DNSLookup, - RemoteDesktop, - PowerShell, - PuTTY, - TigerVNC, - WebConsole, - WakeOnLAN, - Whois - } -} diff --git a/Source/NETworkManager.Profiles/Properties/AssemblyInfo.cs b/Source/NETworkManager.Profiles/Properties/AssemblyInfo.cs index f2a1a6eac6..8cb6506b83 100644 --- a/Source/NETworkManager.Profiles/Properties/AssemblyInfo.cs +++ b/Source/NETworkManager.Profiles/Properties/AssemblyInfo.cs @@ -4,7 +4,5 @@ [assembly: AssemblyTitle("NETworkManager.Profiles")] [assembly: AssemblyDescription("Library contains NETworkManager profiles.")] [assembly: AssemblyProduct("NETworkManager.Profiles")] - [assembly: ComVisible(false)] - [assembly: Guid("d3b37f13-e8e6-4218-9e8e-96d52432a9cf")] \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/Resources/Migrate-Profiles.ps1 b/Source/NETworkManager.Profiles/Resources/Migrate-Profiles.ps1 deleted file mode 100644 index 6d769fe1de..0000000000 --- a/Source/NETworkManager.Profiles/Resources/Migrate-Profiles.ps1 +++ /dev/null @@ -1,116 +0,0 @@ -<# - Migrate NETworkManager profiles - from 2021.11.30.0 and before - to 2021.x.x.x and later -#> - -[CmdletBinding()] -param ( - [Parameter( - Position=0, - Mandatory=$false, - HelpMessage='Profile file or folder path')] - [String]$Path="$($env:APPDATA)\NETworkManager\Profiles", - - [Parameter( - Position=1, - Mandatory=$false, - HelpMessage='Path of the NETworkManager.exe')] - [String]$NETworkManagerPath, - - [Parameter( - Position=2, - Mandatory=$false, - HelpMessage='Version of NETworkManager')] - [String]$NETworkManagerVersion -) - -Write-Host "=== NETworkManager ===`n" -ForegroundColor Green -Write-Host "Migrate profiles to version $NETworkManagerVersion`n" - -Write-Host "If you use encrypted profiles:`n 1) Disable profile encryption for all encrypted profiles with the previous NETworkManager version`n https://borntoberoot.net/NETworkManager/FAQ#how-to-disable-profile-file-encryption`n 2) Run this script to migrate the profiles`n 3) Re-enable profile encryption with the newest release of NETworkManager`n https://borntoberoot.net/NETworkManager/FAQ#how-to-enable-profile-file-encryption`n" -ForegroundColor Yellow - -$defaultValue = $Path -$prompt = Read-Host "Profile file or folder [$($defaultValue)] (Enter to continue | CTRL+C to cancel)" -$prompt = ($defaultValue,$prompt)[[bool]$prompt] - -Write-Host "" - -if(-not(Test-Path -Path $prompt -PathType Container)) -{ - Write-Host "$prompt does not exist!" -ForegroundColor Red - return -} - -foreach($file in Get-ChildItem -Path $prompt -Filter "*.xml") -{ - # Check if the file has the latest format - if(Select-String -Path $file.FullName -Pattern "") - { - Write-Host "$($file.FullName) already has the latest format! [Skipped]" - continue - } - - Copy-Item $file.FullName -Destination "$($file.FullName).$(Get-Date -f yyyyMMdd_HHmmss).backup" - - $Content = Get-Content -Path $file.FullName -Raw - $Content = $Content -replace "","" - $Content = $Content -replace "","" - $Content | Set-Content -Path $file.FullName - - [xml]$XmlDocument = Get-Content -Path $file.FullName - - $Groups = ($XmlDocument.ArrayOfProfileInfo.ProfileInfoSerializable | Group-Object Group) - - $xmlsettings = New-Object System.Xml.XmlWriterSettings - $xmlsettings.Indent = $true - $xmlsettings.IndentChars = " " - - $XmlWriter = [System.XML.XmlWriter]::Create($file.FullName, $xmlsettings) - - $xmlWriter.WriteStartDocument() - - $xmlWriter.WriteStartElement("ArrayOfGroupInfoSerializable") - - foreach($Group in $Groups) - { - $xmlWriter.WriteStartElement("GroupInfoSerializable") - - $xmlWriter.WriteElementString("Name", $Group.Name) - - $xmlWriter.WriteStartElement("Profiles") - - foreach($Profile in $Group.Group) - { - $xmlWriter.WriteStartElement("ProfileInfoSerializable") - $XmlWriter.WriteRaw($Profile.InnerXml) - $xmlWriter.WriteEndElement() # ProfileInfoSerializable - } - - $xmlWriter.WriteEndElement() # Profiles - $xmlWriter.WriteEndElement() # GroupInfoSerializable - } - - $xmlWriter.WriteEndElement() # ArrayOfGroupInfoSerializable - - $xmlWriter.WriteEndDocument() - $xmlWriter.Flush() - $xmlWriter.Close() - - Write-Host "$($file.FullName) successfully converted!" -ForegroundColor Green -} - -Write-Host "`nScript completed!" -ForegroundColor Green - -if(-not([String]::IsNullOrEmpty($NETworkManagerPath))) -{ - Write-Host "`nThe NETworkManager will be restarted afterwards!" - $StartNETworkManager = $true -} - -$x = Read-Host "`nPress enter to continue" - -if($StartNETworkManager) -{ - Start-Process -FilePath $NETworkManagerPath -} diff --git a/Source/NETworkManager.Settings/AccentColorInfo.cs b/Source/NETworkManager.Settings/AccentColorInfo.cs deleted file mode 100644 index 3c028182ea..0000000000 --- a/Source/NETworkManager.Settings/AccentColorInfo.cs +++ /dev/null @@ -1,10 +0,0 @@ - -namespace NETworkManager.Settings -{ - /// - /// Class contains informations about MahApps.Metro accents. - /// - public class AccentColorInfo : BaseColorInfo - { - } -} diff --git a/Source/NETworkManager.Settings/AppearanceManager.cs b/Source/NETworkManager.Settings/AppearanceManager.cs index 62ea5cd7fd..c8c8741b7e 100644 --- a/Source/NETworkManager.Settings/AppearanceManager.cs +++ b/Source/NETworkManager.Settings/AppearanceManager.cs @@ -1,84 +1,186 @@ using ControlzEx.Theming; -using MahApps.Metro.Controls.Dialogs; +using MahApps.Metro.Theming; +using NETworkManager.Models.Appearance; using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Windows; using System.Windows.Media; -namespace NETworkManager.Settings +namespace NETworkManager.Settings; + +/// +/// Class provides static variables and methods to change the theme and accent of the application. +/// +public static class AppearanceManager { + #region Variables + /// + /// Dictionary to override some brushes for the light theme. + /// + private static readonly ResourceDictionary LightThemeOverrideDictionary = new() + { + //["MahApps.Brushes.ThemeBackground"] = new SolidColorBrush(Color.FromRgb(248, 248, 255)), + //["MahApps.Brushes.Control.Background"] = new SolidColorBrush(Color.FromRgb(248, 248, 255)), + ["MahApps.Brushes.Gray3"] = new SolidColorBrush(Color.FromRgb(104, 104, 104)), + ["MahApps.Brushes.Gray5"] = new SolidColorBrush(Color.FromRgb(138, 138, 138)), + ["MahApps.Brushes.Gray8"] = new SolidColorBrush(Color.FromRgb(190, 190, 190)), + }; + + /// + /// Dictionary to override some brushes for the dark theme. + /// + private static readonly ResourceDictionary DarkThemeOverrideDictionary = new() + { + + }; + + /// + /// Name of the folder inside the application directory where the custom themes are stored. + /// + private const string ThemeFolderName = "Themes"; + + /// + /// List who contains all MahApps.Metro themes. + /// + public static List Themes { get; set; } + /// - /// Class provides static variables and methods to change the theme and accent of the application. + /// List who contains all MahApps.Metro custom themes. /// - public static class AppearanceManager + public static List CustomThemes { get; private set; } + + /// + /// List who contains all MahApps.Metro accents. + /// + public static List Accents { get; set; } + #endregion + + #region Constructor + /// + /// Load the MahApps.Metro themes and accents when needed. + /// + static AppearanceManager() + { + Themes = [.. ThemeManager.Current.Themes + .GroupBy(x => x.BaseColorScheme) + .Select(x => x.First()) + .Select(x => new ThemeColorInfo + { Name = x.BaseColorScheme, Color = x.Resources["MahApps.Brushes.ThemeBackground"] as Brush })]; + + Accents = [.. ThemeManager.Current.Themes + .GroupBy(x => x.ColorScheme) + .OrderBy(x => x.Key) + .Select(x => new AccentColorInfo { Name = x.Key, Color = x.First().ShowcaseBrush })]; + + ThemeManager.Current.ThemeChanged += Current_ThemeChanged; + + LoadCustomThemes(); + } + #endregion + + #region Methods + /// + /// Change the appearance based on the user settings. This method should be called once, when starting the application. + /// + public static void Load() { - /// - /// List who contains all MahApps.Metro themes. - /// - public static List Themes { get; set; } - - /// - /// List who contains all MahApps.Metro accents. - /// - public static List Accents { get; set; } - - /// - /// Containes the default settings for a new - /// - public static MetroDialogSettings MetroDialog = new MetroDialogSettings(); - - /// - /// Load the MahApps.Metro themes and accents when needed. - /// - static AppearanceManager() + if (SettingsManager.Current.Appearance_UseCustomTheme && CustomThemes.Count > 0) { - Themes = ThemeManager.Current.Themes - .GroupBy(x => x.BaseColorScheme) - .Select(x => x.First()) - .Select(x => new ThemeColorInfo { Name = x.BaseColorScheme, Color = x.Resources["MahApps.Brushes.ThemeBackground"] as Brush }) - .ToList(); - - Accents = ThemeManager.Current.Themes - .GroupBy(x => x.ColorScheme) - .OrderBy(x => x.Key) - .Select(x => new AccentColorInfo { Name = x.Key, Color = x.First().ShowcaseBrush }) - .ToList(); - - MetroDialog.CustomResourceDictionary = new ResourceDictionary - { - Source = new Uri("NETworkManager;component/Resources/Styles/MetroDialogStyles.xaml", UriKind.RelativeOrAbsolute), - }; - - MetroDialog.DialogButtonFontSize = 14; - MetroDialog.DialogMessageFontSize = 14; + ChangeTheme( + (CustomThemes.FirstOrDefault(x => x.Name == SettingsManager.Current.Appearance_CustomThemeName) ?? + CustomThemes.First()).Name); + + return; } - - /// - /// Change the appearance based on the user settings. This method should be called once, when starting the application. - /// - public static void Load() + + ChangeTheme(SettingsManager.Current.Appearance_Theme, SettingsManager.Current.Appearance_Accent); + } + + /// + /// Method to load the custom themes from a folder into the . + /// + private static void LoadCustomThemes() + { + List customThemes = []; + + foreach (var file in Directory.GetFiles(Path.Combine(ConfigurationManager.Current.ExecutionPath, + ThemeFolderName))) { - ChangeTheme(SettingsManager.Current.Appearance_Theme); - ChangeAccent(SettingsManager.Current.Appearance_Accent); + LibraryTheme libraryTheme = new(new Uri(file), MahAppsLibraryThemeProvider.DefaultInstance); + + customThemes.Add(new ThemeInfo(libraryTheme.Name, libraryTheme.DisplayName)); + + ThemeManager.Current.AddLibraryTheme(libraryTheme); } - /// - /// Method to change the application theme. - /// - /// Name of the theme. - public static void ChangeTheme(string name) + CustomThemes = customThemes; + } + + /// + /// Method to change the application theme (and accent). + /// + /// Theme name as "theme.accent" to apply. + public static void ChangeTheme(string name) + { + ThemeManager.Current.ChangeTheme(System.Windows.Application.Current, name); + } + + /// + /// Method to change the application theme (and accent). + /// + /// Theme name to apply. + /// Accent name to apply. + public static void ChangeTheme(string theme, string accent) + { + ChangeTheme($"{theme}.{accent}"); + } + + /// + /// + /// + /// + private static void ApplyCustomThemeFixes(string theme) + { + // Don't apply on custom themes (only built-in light/dark themes) + if (CustomThemes.Any(x => x.Name.Equals(theme, StringComparison.OrdinalIgnoreCase))) + return; + + // Get application resources + var appResources = System.Windows.Application.Current.Resources; + + // Remove any existing theme overrides + appResources.MergedDictionaries.Remove(LightThemeOverrideDictionary); + appResources.MergedDictionaries.Remove(DarkThemeOverrideDictionary); + + + // Theme name is in format "theme.accent" + switch (theme.ToLowerInvariant().Split('.')[0]) { - ThemeManager.Current.ChangeThemeBaseColor(System.Windows.Application.Current, name); + case "light": + appResources.MergedDictionaries.Add(LightThemeOverrideDictionary); + break; + + case "dark": + appResources.MergedDictionaries.Add(DarkThemeOverrideDictionary); + break; } - /// - /// Method to change the application accent. - /// - /// Name of the accent. - public static void ChangeAccent(string name) + // Refresh UI + foreach (Window window in System.Windows.Application.Current.Windows) { - ThemeManager.Current.ChangeThemeColorScheme(System.Windows.Application.Current, name); + if (window.IsLoaded) + window.InvalidateVisual(); } } + + #endregion + + #region Events + private static void Current_ThemeChanged(object sender, ThemeChangedEventArgs e) + { + ApplyCustomThemeFixes(e.NewTheme.Name); + } + #endregion } diff --git a/Source/NETworkManager.Settings/Application/PuTTY.cs b/Source/NETworkManager.Settings/Application/PuTTY.cs index 7c55941e2f..4b23fd8305 100644 --- a/Source/NETworkManager.Settings/Application/PuTTY.cs +++ b/Source/NETworkManager.Settings/Application/PuTTY.cs @@ -1,38 +1,39 @@ -using NETworkManager.Models.PuTTY; -using System.IO; +using System.IO; +using NETworkManager.Models.PuTTY; -namespace NETworkManager.Settings.Application -{ - public static class PuTTY - { - public static string PortableLogPath => Path.Combine(ConfigurationManager.Current.ExecutionPath, "PuTTY_LogFiles"); +namespace NETworkManager.Settings.Application; - public static string LogPath => ConfigurationManager.Current.IsPortable ? PortableLogPath : SettingsManager.Current.PuTTY_LogPath; +public static class PuTTY +{ + public static string PortableLogPath => Path.Combine(ConfigurationManager.Current.ExecutionPath, "PuTTY_LogFiles"); - public static int GetPortOrBaudByConnectionMode(ConnectionMode mode) - { - var portOrBaud = 0; + public static string LogPath => ConfigurationManager.Current.IsPortable + ? PortableLogPath + : SettingsManager.Current.PuTTY_LogPath; - switch (mode) - { - case ConnectionMode.SSH: - portOrBaud = SettingsManager.Current.PuTTY_SSHPort; - break; - case ConnectionMode.Telnet: - portOrBaud = SettingsManager.Current.PuTTY_TelnetPort; - break; - case ConnectionMode.Rlogin: - portOrBaud = SettingsManager.Current.PuTTY_RloginPort; - break; - case ConnectionMode.RAW: - portOrBaud = SettingsManager.Current.PuTTY_DefaultRaw; - break; - case ConnectionMode.Serial: - portOrBaud = SettingsManager.Current.PuTTY_BaudRate; - break; - } + public static int GetPortOrBaudByConnectionMode(ConnectionMode mode) + { + var portOrBaud = 0; - return portOrBaud; + switch (mode) + { + case ConnectionMode.SSH: + portOrBaud = SettingsManager.Current.PuTTY_SSHPort; + break; + case ConnectionMode.Telnet: + portOrBaud = SettingsManager.Current.PuTTY_TelnetPort; + break; + case ConnectionMode.Rlogin: + portOrBaud = SettingsManager.Current.PuTTY_RloginPort; + break; + case ConnectionMode.RAW: + portOrBaud = SettingsManager.Current.PuTTY_RawPort; + break; + case ConnectionMode.Serial: + portOrBaud = SettingsManager.Current.PuTTY_BaudRate; + break; } + + return portOrBaud; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Settings/AssemblyInfo.cs b/Source/NETworkManager.Settings/AssemblyInfo.cs index 704bef9cb4..0c2d88ecc3 100644 --- a/Source/NETworkManager.Settings/AssemblyInfo.cs +++ b/Source/NETworkManager.Settings/AssemblyInfo.cs @@ -1,17 +1,34 @@ using System; -namespace NETworkManager.Settings +namespace NETworkManager.Settings; + +/// +/// Class contains information about the current executing assembly. +/// +public class AssemblyInfo { - public class AssemblyInfo + /// + /// Creates a new instance of the class. + /// + public AssemblyInfo() { - public string Title { get; set; } - public Version Version { get; set; } - public string Location { get; set; } - public string Name { get; set; } + } - public AssemblyInfo() - { + /// + /// Version of the current executing assembly. + /// Like "2022.12.24.0". + /// + public Version Version { get; set; } - } - } + /// + /// Location of the current executing assembly. + /// Like "C:\Program Files\NETworkManager\NETworkManager.exe". + /// + public string Location { get; set; } + + /// + /// Name of the current executing assembly. + /// Like "NETworkManager". + /// + public string Name { get; set; } } \ No newline at end of file diff --git a/Source/NETworkManager.Settings/AssemblyManager.cs b/Source/NETworkManager.Settings/AssemblyManager.cs index c73333c435..a3b049d58f 100644 --- a/Source/NETworkManager.Settings/AssemblyManager.cs +++ b/Source/NETworkManager.Settings/AssemblyManager.cs @@ -1,24 +1,33 @@ -using System.Reflection; -using System.IO; +using System.IO; +using System.Reflection; -namespace NETworkManager.Settings +namespace NETworkManager.Settings; + +/// +/// Class contains information about the current executing assembly. +/// +public static class AssemblyManager { - public static class AssemblyManager + /// + /// Creates a new instance of the class and + /// sets the property on the first call. + /// + static AssemblyManager() { - public static AssemblyInfo Current { get; set; } - - static AssemblyManager() - { - var assembly = Assembly.GetEntryAssembly(); + var assembly = Assembly.GetEntryAssembly(); - var name = assembly.GetName(); + var name = assembly.GetName(); - Current = new AssemblyInfo - { - Version = name.Version, - Location = Path.GetDirectoryName(assembly.Location), - Name = name.Name - }; - } + Current = new AssemblyInfo + { + Version = name.Version, + Location = Path.GetDirectoryName(assembly.Location), + Name = name.Name + }; } -} + + /// + /// Current executing assembly. + /// + public static AssemblyInfo Current { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Settings/AutostartManager.cs b/Source/NETworkManager.Settings/AutostartManager.cs index ec7186dd04..6a55b5fc0d 100644 --- a/Source/NETworkManager.Settings/AutostartManager.cs +++ b/Source/NETworkManager.Settings/AutostartManager.cs @@ -1,55 +1,74 @@ -using Microsoft.Win32; -using System.Threading.Tasks; +using System.Threading.Tasks; +using Microsoft.Win32; -namespace NETworkManager.Settings +namespace NETworkManager.Settings; + +/// +/// Class to manage the autostart of the application +/// +public class AutostartManager { - public class AutostartManager - { - // Key where the autorun entries for the current user are stored - private const string RunKeyCurrentUser = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"; + // Key where the autorun entries for the current user are stored + private const string RunKeyCurrentUser = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"; - public static bool IsEnabled + /// + /// Indicates if the application autostart is enabled. + /// + public static bool IsEnabled + { + get { - get - { - var registryKey = Registry.CurrentUser.OpenSubKey(RunKeyCurrentUser); + var registryKey = Registry.CurrentUser.OpenSubKey(RunKeyCurrentUser); - return registryKey?.GetValue(ConfigurationManager.Current.ApplicationName) != null; - } + return registryKey?.GetValue(ConfigurationManager.Current.ApplicationName) != null; } + } - public static Task EnableAsync() - { - return Task.Run(() => Enable()); - } + /// + /// Enable the autostart of the application async. + /// + /// to wait for. + public static Task EnableAsync() + { + return Task.Run(() => Enable()); + } - public static void Enable() - { - var registryKey = Registry.CurrentUser.OpenSubKey(RunKeyCurrentUser, true); + /// + /// Enable the autostart of the application. + /// + public static void Enable() + { + var registryKey = Registry.CurrentUser.OpenSubKey(RunKeyCurrentUser, true); - var command = $"{ConfigurationManager.Current.ApplicationFullName} {CommandLineManager.ParameterAutostart}"; + var command = $"{ConfigurationManager.Current.ApplicationFullName} {CommandLineManager.ParameterAutostart}"; - if (registryKey == null) - return; // LOG + if (registryKey == null) + return; // LOG - registryKey.SetValue(ConfigurationManager.Current.ApplicationName, command); - registryKey.Close(); - } + registryKey.SetValue(ConfigurationManager.Current.ApplicationName, command); + registryKey.Close(); + } - public static Task DisableAsync() - { - return Task.Run(() => Disable()); - } + /// + /// Disable the autostart of the application async. + /// + /// to wait for. + public static Task DisableAsync() + { + return Task.Run(() => Disable()); + } - public static void Disable() - { - var registryKey = Registry.CurrentUser.OpenSubKey(RunKeyCurrentUser, true); + /// + /// Disable the autostart of the application. + /// + public static void Disable() + { + var registryKey = Registry.CurrentUser.OpenSubKey(RunKeyCurrentUser, true); - if (registryKey == null) - return; // LOG + if (registryKey == null) + return; // LOG - registryKey.DeleteValue(ConfigurationManager.Current.ApplicationName); - registryKey.Close(); - } + registryKey.DeleteValue(ConfigurationManager.Current.ApplicationName); + registryKey.Close(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Settings/BaseColorInfo.cs b/Source/NETworkManager.Settings/BaseColorInfo.cs deleted file mode 100644 index 9ebe48f2e3..0000000000 --- a/Source/NETworkManager.Settings/BaseColorInfo.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Windows.Media; - -namespace NETworkManager.Settings -{ - /// - /// Base class for MahApps.Metro theme/accent informations. - /// - public abstract class BaseColorInfo - { - public string Name { get; set; } - public Brush Color { get; set; } - } -} diff --git a/Source/NETworkManager.Settings/CommandLineInfo.cs b/Source/NETworkManager.Settings/CommandLineInfo.cs index 688b145aa7..c844843611 100644 --- a/Source/NETworkManager.Settings/CommandLineInfo.cs +++ b/Source/NETworkManager.Settings/CommandLineInfo.cs @@ -1,20 +1,39 @@ using NETworkManager.Models; -namespace NETworkManager.Settings +namespace NETworkManager.Settings; + +/// +/// Class to store the command line parameters +/// +public class CommandLineInfo { - public class CommandLineInfo - { - public bool Help { get; set; } - public bool Autostart { get; set; } - public bool ResetSettings { get; set; } - public int RestartPid { get; set; } = -1; + /// + /// Indicates if the application should show the help dialog + /// + public bool Help { get; set; } + + /// + /// Indicates if the application was started automatically + /// + public bool Autostart { get; set; } + + /// + /// Indicates if the application should reset the settings + /// + public bool ResetSettings { get; set; } - public ApplicationName Application { get; set; } = ApplicationName.None; - public string WrongParameter { get; set; } + /// + /// Process ID of the previous instance of the application to wait for it to close + /// + public int RestartPid { get; set; } = -1; - public CommandLineInfo() - { + /// + /// Name of the application to start + /// + public ApplicationName Application { get; set; } = ApplicationName.None; - } - } -} + /// + /// Wrong parameter(s) detected in the command line to display in the help dialog + /// + public string WrongParameter { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Settings/CommandLineManager.cs b/Source/NETworkManager.Settings/CommandLineManager.cs index b8dec5b39d..f8cb40b26e 100644 --- a/Source/NETworkManager.Settings/CommandLineManager.cs +++ b/Source/NETworkManager.Settings/CommandLineManager.cs @@ -1,72 +1,55 @@ -using NETworkManager.Models; -using System; +using System; +using NETworkManager.Models; -namespace NETworkManager.Settings +namespace NETworkManager.Settings; + +public static class CommandLineManager { - public static class CommandLineManager - { - public const string ParameterIdentifier = "--"; - public const char ValueSplitIdentifier = ':'; + private const string ParameterIdentifier = "--"; + private const char ValueSplitIdentifier = ':'; - // Public - public static string ParameterHelp => $"{ParameterIdentifier}help"; - public static string ParameterResetSettings => $"{ParameterIdentifier}reset-settings"; - public static string ParameterApplication => $"{ParameterIdentifier}application"; + static CommandLineManager() + { + Current = new CommandLineInfo(); - // Internal use only - public static string ParameterAutostart => $"{ParameterIdentifier}autostart"; - public static string ParameterRestartPid => $"{ParameterIdentifier}restart-pid"; + // Detect start parameters + var parameters = Environment.GetCommandLineArgs(); - public static CommandLineInfo Current { get; set; } - - static CommandLineManager() + for (var i = 1; i < parameters.Length; i++) { - Current = new CommandLineInfo(); - - // Detect start parameters - var parameters = Environment.GetCommandLineArgs(); + var param = parameters[i].Split(ValueSplitIdentifier); - for (var i = 1; i < parameters.Length; i++) + if (param[0].StartsWith(ParameterIdentifier)) { - var param = parameters[i].Split(ValueSplitIdentifier); - - if (param[0].StartsWith(ParameterIdentifier)) + if (param[0].Equals(ParameterHelp, StringComparison.InvariantCultureIgnoreCase)) { - if (param[0].Equals(ParameterHelp, StringComparison.InvariantCultureIgnoreCase)) - { - Current.Help = true; - }// Autostart - else if (param[0].Equals(ParameterAutostart, StringComparison.InvariantCultureIgnoreCase)) - { - Current.Autostart = true; - } // Reset Settings - else if (param[0].Equals(ParameterResetSettings, StringComparison.InvariantCultureIgnoreCase)) + Current.Help = true; + } // Autostart + else if (param[0].Equals(ParameterAutostart, StringComparison.InvariantCultureIgnoreCase)) + { + Current.Autostart = true; + } // Reset Settings + else if (param[0].Equals(ParameterResetSettings, StringComparison.InvariantCultureIgnoreCase)) + { + Current.ResetSettings = true; + } // Restart + else if (param[0].Equals(ParameterRestartPid, StringComparison.InvariantCultureIgnoreCase)) + { + if (int.TryParse(param[1], out var restartPid)) { - Current.ResetSettings = true; - } // Restart - else if (param[0].Equals(ParameterRestartPid, StringComparison.InvariantCultureIgnoreCase)) + Current.RestartPid = restartPid; + } + else { - if (int.TryParse(param[1], out int restartPid)) - { - Current.RestartPid = restartPid; - } - else - { - WrongParameterDetected(parameters); - return; - } - } // Application - else if (param[0].Equals(ParameterApplication, StringComparison.InvariantCultureIgnoreCase)) + WrongParameterDetected(parameters); + return; + } + } // Application + else if (param[0].Equals(ParameterApplication, StringComparison.InvariantCultureIgnoreCase)) + { + if (Enum.TryParse(param[1], out ApplicationName application)) { - if (System.Enum.TryParse(param[1], out ApplicationName application)) - { - Current.Application = application; - } - else - { - WrongParameterDetected(parameters); - return; - } + Current.Application = application; } else { @@ -76,25 +59,41 @@ static CommandLineManager() } else { - // Ignore the first parameter because it's the path of the .exe - if (i == 0) - continue; - WrongParameterDetected(parameters); return; } } - } + else + { + // Ignore the first parameter because it's the path of the .exe + if (i == 0) + continue; - public static string GetParameterWithSplitIdentifier(string parameter) - { - return $"{parameter}{ValueSplitIdentifier}"; + WrongParameterDetected(parameters); + return; + } } + } - private static void WrongParameterDetected(string[] parameters) - { - Current.WrongParameter = string.Join(" ", parameters); - Current.Help = true; - } + // Public + public static string ParameterHelp => $"{ParameterIdentifier}help"; + public static string ParameterResetSettings => $"{ParameterIdentifier}reset-settings"; + public static string ParameterApplication => $"{ParameterIdentifier}application"; + + // Internal use only + public static string ParameterAutostart => $"{ParameterIdentifier}autostart"; + public static string ParameterRestartPid => $"{ParameterIdentifier}restart-pid"; + + public static CommandLineInfo Current { get; set; } + + public static string GetParameterWithSplitIdentifier(string parameter) + { + return $"{parameter}{ValueSplitIdentifier}"; + } + + private static void WrongParameterDetected(string[] parameters) + { + Current.WrongParameter = string.Join(" ", parameters); + Current.Help = true; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Settings/ConfigurationInfo.cs b/Source/NETworkManager.Settings/ConfigurationInfo.cs index 94456bc5fc..1ac3974f50 100644 --- a/Source/NETworkManager.Settings/ConfigurationInfo.cs +++ b/Source/NETworkManager.Settings/ConfigurationInfo.cs @@ -1,48 +1,401 @@ -using System; -using System.ComponentModel; -using System.Runtime.CompilerServices; +using NETworkManager.Models; +using NETworkManager.Utilities; -namespace NETworkManager.Settings +namespace NETworkManager.Settings; + +/* + * This class is used to store static and dynamic configuration used in the application + * across multiple windows, views, dialogs, etc. + */ +public class ConfigurationInfo : PropertyChangedBase { - public class ConfigurationInfo : INotifyPropertyChanged + #region Constructor + + /// + /// Create a new instance of with static configuration. + /// + public ConfigurationInfo(bool isAdmin, string executionPath, string applicationFullName, string applicationName, + bool isPortable) + { + IsAdmin = isAdmin; + ExecutionPath = executionPath; + ApplicationFullName = applicationFullName; + ApplicationName = applicationName; + IsPortable = isPortable; + } + + #endregion + + #region Static properties set at startup + + /// + /// Indicates that the application is running as administrator. + /// + public bool IsAdmin { get; } + + /// + /// Execution path of the application like "C:\Program Files\NETworkManager". + /// + public string ExecutionPath { get; } + + /// + /// Full path of the application like "C:\Program Files\NETworkManager\NETworkManager.exe" + /// + public string ApplicationFullName { get; } + + /// + /// Application name like "NETworkManager". + /// + public string ApplicationName { get; } + + /// + /// Indicates if the application is running in portable mode. + /// + public bool IsPortable { get; } + + #endregion + + #region Dynamic properties set at runtime + + /// + /// Shows a reset notice if the settings were corrupted and reset. + /// + public bool ShowSettingsResetNoteOnStartup { get; set; } + + /// + /// Currently selected application. + /// + public ApplicationName CurrentApplication { get; set; } = Models.ApplicationName.None; + + public int IPScannerTabCount + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public int PortScannerTabCount + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public int TracerouteTabCount + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public int DNSLookupTabCount + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public int RemoteDesktopTabCount + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public bool IsRemoteDesktopWindowDragging { - public event PropertyChangedEventHandler PropertyChanged; + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public int PowerShellTabCount + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } - protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) + public bool IsPowerShellWindowDragging + { + get; + set { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - public bool IsAdmin { get; set; } - public string ExecutionPath { get; set; } - public string ApplicationFullName { get; set; } - public string ApplicationName { get; set; } - public bool IsPortable { get; set; } - public Version OSVersion { get; set; } + public int PuTTYTabCount + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } - // Everything below will be set dynamically in the application - public bool ShowSettingsResetNoteOnStartup { get; set; } - public bool ForceRestart { get; set; } + public bool IsPuTTYWindowDragging + { + get; + set + { + if (value == field) + return; - public bool SoftRestart { get; set; } + field = value; + OnPropertyChanged(); + } + } - private bool _isDialogOpen; - public bool FixAirspace + public int TigerVNCTabCount + { + get; + set { - get => _isDialogOpen; - set - { - if (value == _isDialogOpen) - return; + if (value == field) + return; - _isDialogOpen = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - public ConfigurationInfo() + public bool IsTigerVNCWindowDragging + { + get; + set { + if (value == field) + return; + field = value; + OnPropertyChanged(); } } -} + + public int WebConsoleTabCount + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public bool IsWebConsoleWindowDragging + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public int SNMPTabCount + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public int SNTPLookupTabCount + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public int WhoisTabCount + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public int IPGeolocationTabCount + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Indicates if the profile manager is enabled. + /// + public bool ProfileManagerIsEnabled + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Indicates if the profile manager should show an unlock option. + /// + public bool ProfileManagerShowUnlock + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Error message if the profile manager is not enabled. + /// + public string ProfileManagerErrorMessage + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = string.Empty; + + /// + /// Indicates if a child window is open. + /// + public bool IsChildWindowOpen + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Indicates if a profile filter popup is open. + /// + public bool IsProfileFilterPopupOpen + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Indicates if there may be an airspace issue that needs to be fixed. + /// + public bool FixAirspace + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager.Settings/ConfigurationManager.cs b/Source/NETworkManager.Settings/ConfigurationManager.cs index a1a8ece66e..1013d3c9e1 100644 --- a/Source/NETworkManager.Settings/ConfigurationManager.cs +++ b/Source/NETworkManager.Settings/ConfigurationManager.cs @@ -1,26 +1,67 @@ -using System.Security.Principal; +using NETworkManager.Models; using System.IO; +using System.Security.Principal; -namespace NETworkManager.Settings +namespace NETworkManager.Settings; + +/// +/// Class includes static and dynamic configuration used in the application +/// across multiple windows, views, dialogs, etc. +/// +public static class ConfigurationManager { - public static class ConfigurationManager + /// + /// Name of the file that indicates that the application is portable. + /// + private const string IsPortableFileName = "IsPortable"; + + /// + /// Extension of the file that indicates that the application is portable. + /// + private const string IsPortableExtension = "settings"; + + /// + /// Create a new instance of the class and load static configuration. + /// + static ConfigurationManager() { - private const string IsPortableFileName = "IsPortable"; - private const string IsPortableExtension = "settings"; + Current = new ConfigurationInfo( + isAdmin: new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator), + executionPath: AssemblyManager.Current.Location, + applicationFullName: Path.Combine(AssemblyManager.Current.Location, AssemblyManager.Current.Name + ".exe"), + applicationName: AssemblyManager.Current.Name, + isPortable: File.Exists(Path.Combine(AssemblyManager.Current.Location, $"{IsPortableFileName}.{IsPortableExtension}")) + ); + } - public static ConfigurationInfo Current { get; set; } + /// + /// Current that is used in the application. + /// + public static ConfigurationInfo Current { get; } - static ConfigurationManager() + /// + /// Method can be called before opening a dialog to fix airspace issues. + /// Call the method after the dialog has been closed. + /// + public static void OnDialogOpen() + { + switch (Current.CurrentApplication) { - Current = new ConfigurationInfo - { - IsAdmin = new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator), - ExecutionPath = AssemblyManager.Current.Location, - ApplicationFullName = Path.Combine(AssemblyManager.Current.Location, AssemblyManager.Current.Name + ".exe"), - ApplicationName = AssemblyManager.Current.Name, - OSVersion = System.Environment.OSVersion.Version, - IsPortable = File.Exists(Path.Combine(AssemblyManager.Current.Location, $"{IsPortableFileName}.{IsPortableExtension}")) - }; + case ApplicationName.RemoteDesktop when Current.RemoteDesktopTabCount > 0: + case ApplicationName.PowerShell when Current.PowerShellTabCount > 0: + case ApplicationName.PuTTY when Current.PuTTYTabCount > 0: + case ApplicationName.TigerVNC when Current.TigerVNCTabCount > 0: + case ApplicationName.WebConsole when Current.WebConsoleTabCount > 0: + Current.FixAirspace = true; + break; } } -} + + /// + /// Method must be called after closing a dialog if was called before. + /// + public static void OnDialogClose() + { + Current.FixAirspace = false; + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Settings/GlobalStaticConfiguration.cs b/Source/NETworkManager.Settings/GlobalStaticConfiguration.cs index d2f5b65e4d..d71cb6aab6 100644 --- a/Source/NETworkManager.Settings/GlobalStaticConfiguration.cs +++ b/Source/NETworkManager.Settings/GlobalStaticConfiguration.cs @@ -1,186 +1,312 @@ -using System; -using System.IO; -using System.Linq; +using DnsClient; using Lextm.SharpSnmpLib.Messaging; +using NETworkManager.Models; using NETworkManager.Models.Export; using NETworkManager.Models.Network; using NETworkManager.Models.PowerShell; using NETworkManager.Models.PuTTY; -using NETworkManager.Utilities; using NETworkManager.Models.RemoteDesktop; -using DnsClient; -using NETworkManager.Models; +using NETworkManager.Utilities; +using System; +using System.IO; +using System.Linq; + +// ReSharper disable InconsistentNaming + +namespace NETworkManager.Settings; -namespace NETworkManager.Settings +public static class GlobalStaticConfiguration { - public static class GlobalStaticConfiguration - { - // Type to search (average type speed --> 187 chars/min) - public static TimeSpan SearchDispatcherTimerTimeSpan => new TimeSpan(0, 0, 0, 0, 750); - public static TimeSpan CredentialsUILockTime => new TimeSpan(0, 0, 120); - - // Filter - public static string ApplicationFileExtensionFilter => "Application (*.exe)|*.exe"; - public static string PuTTYPrivateKeyFileExtensionFilter => "PuTTY Private Key Files (*.ppk)|*.ppk"; - public static string ZipFileExtensionFilter => "ZIP Archive (*.zip)|*.zip"; - public static string XmlFileExtensionFilter => "XML-File (*.xml)|*.xml"; - - // Settings - public static ApplicationName General_DefaultApplicationViewName => ApplicationName.Dashboard; - public static int General_BackgroundJobInterval => 5; - public static int General_HistoryListEntries => 10; - public static bool SplashScreen_Enabled => true; - public static string Appearance_Theme => "Dark"; - public static string Appearance_Accent => "Lime"; - public static bool Status_ShowWindowOnNetworkChange => true; - public static int Status_WindowCloseTime => 10; - public static string Status_IPAddressToDetectLocalIPAddressBasedOnRouting => "1.1.1.1"; - - // Fixes - public static double FloatPointFix => 1.0; - - // HotKey - public static int HotKey_ShowWindowKey => 79; - public static int HotKey_ShowWindowModifier => 3; - - // Profile - public static double Profile_WidthCollapsed => 40; - public static double Profile_DefaultWidthExpanded => 250; - public static double Profile_MaxWidthExpanded => 350; - public static int Profile_EncryptionKeySize => 256; - public static int Profile_EncryptionIterations => 1000000; - - // Application: Dashboard - public static string Dashboard_PublicIPv4Address => "1.1.1.1"; - public static string Dashboard_PublicIPv6Address => "2606:4700:4700::1111"; - public static bool Dashboard_CheckPublicIPAddress => true; - public static string Dashboard_PublicIPv4AddressAPI => "https://api.ipify.org"; - public static string Dashboard_PublicIPv6AddressAPI => "https://api6.ipify.org"; - - // Application: WiFi - public static bool WiFi_Show2dot4GHzNetworks => true; - public static bool WiFi_Show5GHzNetworks => true; - public static AutoRefreshTimeInfo WiFi_AutoRefreshTime => AutoRefreshTime.GetDefaults.First(x => x.Value == 30 && x.TimeUnit == TimeUnit.Second); - public static ExportManager.ExportFileType WiFi_ExportFileType => ExportManager.ExportFileType.CSV; - - // Application: IP Scanner - public static int IPScanner_Threads => 256; - public static int IPScanner_ICMPAttempts => 2; - public static int IPScanner_ICMPBuffer => 32; - public static int IPScanner_DNSPort => 53; - public static bool IPScanner_DNSUseTCPOnly => false; - public static int IPScanner_DNSTimeout => 2; - public static int IPScanner_DNSRetries => 3; - public static bool IPScanner_DNSShowErrorMessage => false; - public static int IPScanner_ICMPTimeout => 4000; - public static ExportManager.ExportFileType IPScanner_ExportFileType => ExportManager.ExportFileType.CSV; - - // Application: Port Scanner - public static int PortScanner_HostThreads => 5; - public static int PortScanner_PortThreds => 100; - public static int PortScanner_Timeout => 4000; - public static ExportManager.ExportFileType PortScanner_ExportFileType => ExportManager.ExportFileType.CSV; - - // Application: Ping Monitor - public static int PingMonitor_Buffer => 32; - public static int PingMonitor_Timeout => 4000; - public static int PingMonitor_TTL => 64; - public static int PingMonitor_WaitTime => 1000; - public static ExportManager.ExportFileType PingMonitor_ExportFileType => ExportManager.ExportFileType.CSV; - - // Application: Traceroute - public static int Traceroute_MaximumHops => 30; - public static int Traceroute_Timeout => 4000; - public static int Traceroute_Buffer => 32; - public static ExportManager.ExportFileType Traceroute_ExportFileType => ExportManager.ExportFileType.CSV; - - // Application: DNS Lookup - public static QueryClass DNSLookup_QueryClass => QueryClass.IN; - public static QueryType DNSLookup_QueryType => QueryType.ANY; - public static bool DNSLookup_UseTCPOnly => false; - public static int DNSLookup_Retries => 3; - public static int DNSLookup_Timeout => 2; - public static ExportManager.ExportFileType DNSLookup_ExportFileType => ExportManager.ExportFileType.CSV; - - // Application: RemoteDesktop - public static bool RemoteDesktop_UseCurrentViewSize => true; - public static int RemoteDesktop_ScreenWidth => 1280; - public static int RemoteDesktop_ScreenHeight => 768; - - public static int RemoteDesktop_ColorDepth = 32; - public static int RemoteDesktop_Port => 3389; - public static AudioRedirectionMode RemoteDesktop_AudioRedirectionMode => AudioRedirectionMode.PlayOnThisComputer; - public static AudioCaptureRedirectionMode RemoteDesktop_AudioCaptureRedirectionMode => AudioCaptureRedirectionMode.DoNotRecord; - public static KeyboardHookMode RemoteDesktop_KeyboardHookMode => KeyboardHookMode.OnTheRemoteComputer; - public static uint RemoteDesktop_AuthenticationLevel => 2; - - public static NetworkConnectionType RemoteDesktop_NetworkConnectionType => NetworkConnectionType.DetectAutomatically; - - // Application: PowerShell - public static string PowerShell_ApplicationFileLocationPowerShell => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), @"System32\WindowsPowerShell\v1.0\powershell.exe"); - public static PowerShell.ExecutionPolicy PowerShell_ExecutionPolicy => PowerShell.ExecutionPolicy.RemoteSigned; - - // Application: PuTTY - public static ConnectionMode PuTTY_DefaultConnectionMode => ConnectionMode.SSH; - public static string PuTTY_DefaultProfile => "NETworkManager"; - public static LogMode PuTTY_LogMode => LogMode.SessionLog; - public static string PuTTY_LogPath => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), AssemblyManager.Current.Name, "PuTTY_Log"); - public static string PuTTY_LogFileName => "&H_&Y-&M-&D_&T.log"; - public static int PuTTY_SSHPort => 22; - public static string PuTTY_SerialLine => "COM1"; - public static int PuTTY_TelnetPort => 23; - public static int PuTTY_RloginPort => 513; - public static int PuTTY_BaudRate => 9600; - public static int PuTTY_Raw => 0; - - // Application: TigerVNC - public static int TigerVNC_DefaultVNCPort => 5900; - - // WebConsole - public static string WebConsole_Cache => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), AssemblyManager.Current.Name, "WebConsole_Cache"); - - // Application: SNMP - public static WalkMode SNMP_WalkMode => WalkMode.WithinSubtree; - public static int SNMP_Timeout => 60000; - public static SNMP.SNMPMode SNMP_Mode => SNMP.SNMPMode.Walk; - public static SNMP.SNMPVersion SNMP_Version => SNMP.SNMPVersion.V2C; - public static SNMP.SNMPV3Security SNMP_Security => SNMP.SNMPV3Security.AuthPriv; - public static SNMP.SNMPV3AuthenticationProvider SNMP_AuthenticationProvider => SNMP.SNMPV3AuthenticationProvider.SHA1; - public static SNMP.SNMPV3PrivacyProvider SNMP_PrivacyProvider => SNMP.SNMPV3PrivacyProvider.AES; - public static ExportManager.ExportFileType SNMP_ExportFileType => ExportManager.ExportFileType.CSV; - - // Application: Discovery Protocol - public static DiscoveryProtocol.Protocol DiscoveryProtocol_Protocol => DiscoveryProtocol.Protocol.LLDP_CDP; - public static int DiscoveryProtocol_Duration => 60; - - // Application: Wake on LAN - public static int WakeOnLAN_Port => 7; - - // Application: HTTP Header - public static int HTTPHeaders_Timeout => 10000; - public static ExportManager.ExportFileType HTTPHeaders_ExportFileType => ExportManager.ExportFileType.CSV; - - // Application: Subnet Calculator - public static ExportManager.ExportFileType SubnetCalculator_Subnetting_ExportFileType => ExportManager.ExportFileType.CSV; - - // Application: Lookup - public static ExportManager.ExportFileType Lookup_OUI_ExportFileType => ExportManager.ExportFileType.CSV; - public static ExportManager.ExportFileType Lookup_Port_ExportFileType => ExportManager.ExportFileType.CSV; - - // Application: Whois - public static ExportManager.ExportFileType Whois_ExportFileType => ExportManager.ExportFileType.TXT; - - // Application: Connections - public static ExportManager.ExportFileType Connections_ExportFileType => ExportManager.ExportFileType.CSV; - public static AutoRefreshTimeInfo Connections_AutoRefreshTime => AutoRefreshTime.GetDefaults.First(x => x.Value == 30 && x.TimeUnit == TimeUnit.Second); - - // Application: Listeners - public static ExportManager.ExportFileType Listeners_ExportFileType => ExportManager.ExportFileType.CSV; - public static AutoRefreshTimeInfo Listeners_AutoRefreshTime => AutoRefreshTime.GetDefaults.First(x => x.Value == 30 && x.TimeUnit == TimeUnit.Second); - - // Application: ARP Table - public static ExportManager.ExportFileType ARPTable_ExportFileType => ExportManager.ExportFileType.CSV; - public static AutoRefreshTimeInfo ARPTable_AutoRefreshTime => AutoRefreshTime.GetDefaults.First(x => x.Value == 30 && x.TimeUnit == TimeUnit.Second); - - } + #region Global settings + + // Application config + public static int ApplicationUIRefreshInterval => 2500; + + public static int ApplicationUIDelayInterval => 1000; + + // Type to search (average type speed --> 187 chars/min) + public static TimeSpan SearchDispatcherTimerTimeSpan => new(0, 0, 0, 0, 750); + + // Network config + public static int NetworkChangeDetectionDelay => 5000; + + // Notification config + // Minimum interval (ms) between two notification sounds, so a burst of near-simultaneous + // status changes collapses into a single sound instead of an overlapping cacophony. + public static int NotificationSoundThrottle => 3000; + + // Tolerance for comparing two doubles (e.g. a resized panel width/height against a + // known constant) that are expected to be "close enough" rather than bit-for-bit equal. + public static double FloatPointFix => 1.0; + + // Profile config + public static bool Profile_TagsMatchAny => true; + public static bool Profile_ExpandProfileView => true; + public static double Profile_WidthCollapsed => 40; + public static double Profile_DefaultWidthExpanded => 250; + public static double Profile_MaxWidthExpanded => 500; + public static int Profile_EncryptionKeySize => 256; + public static int Profile_EncryptionIterations => 1000000; + + // Filter for file dialog + public static string ApplicationFileExtensionFilter => "Application (*.exe)|*.exe"; + public static string PuTTYPrivateKeyFileExtensionFilter => "PuTTY Private Key Files (*.ppk)|*.ppk"; + public static string ZipFileExtensionFilter => "ZIP Archive (*.zip)|*.zip"; + public static string XmlFileExtensionFilter => "XML-File (*.xml)|*.xml"; + public static string CsvFileExtensionFilter => "CSV-File (*.csv)|*.csv"; + + #endregion + + #region Default settings + + // Settings: General + public static int General_BackgroundJobInterval => 5; + public static int General_ThreadPoolAdditionalMinThreads => 512; + public static int General_HistoryListEntries => 10; + + // Settings: Window + public static bool SplashScreen_Enabled => true; + + // Settings: Appearance + public static string Appearance_Theme => "Dark"; + public static string Appearance_Accent => "Lime"; + public static bool Appearance_UseCustomTheme => false; + + // Settings: Network + public static bool Network_ResolveHostnamePreferIPv4 => true; + + // Settings: Status + public static bool Status_ShowWindowOnNetworkChange => true; + public static int Status_WindowCloseTime => 10; + + // Settings: HotKey + public static int HotKey_ShowWindowKey => 79; + public static int HotKey_ShowWindowModifier => 3; + + // Settings: Update + public static bool Update_CheckForUpdatesAtStartup => true; + public static bool Update_CheckForPreReleases => false; + public static bool Experimental_EnableExperimentalFeatures => false; + + // Settings: Profiles + public static bool Profiles_IsDailyBackupEnabled => true; + public static int Profiles_MaximumNumberOfBackups => 10; + + // Profiles: AD computer import + public static int Profiles_ImportActiveDirectoryPort_Ldap => 389; + public static int Profiles_ImportActiveDirectoryPort_Ldaps => 636; + public static bool Profiles_ImportActiveDirectoryUseSsl => true; + public static bool Profiles_ImportActiveDirectoryExcludeDisabledAccounts => true; + + // Settings: Settings + public static bool Settings_IsDailyBackupEnabled => true; + public static int Settings_MaximumNumberOfBackups => 10; + + // Application: Dashboard + public static string Dashboard_PublicIPv4Address => "1.1.1.1"; + public static string Dashboard_PublicIPv6Address => "2606:4700:4700::1111"; + public static bool Dashboard_CheckPublicIPAddress => true; + public static string Dashboard_PublicIPv4AddressAPI => "https://api.ipify.org"; + public static string Dashboard_PublicIPv6AddressAPI => "https://api6.ipify.org"; + public static bool Dashboard_CheckIPApiIPGeolocation => false; + public static bool Dashboard_CheckIPApiDNSResolver => false; + + // Application: Network Interface + public static ExportFileType NetworkInterface_ExportFileType => ExportFileType.Csv; + public static int NetworkInterface_BandwidthChartTime => 60; + + // Application: WiFi + public static bool WiFi_Show2dot4GHzNetworks => true; + public static bool WiFi_Show5GHzNetworks => true; + public static bool WiFi_Show6GHzNetworks => true; + + + public static AutoRefreshTimeInfo WiFi_AutoRefreshTime => + AutoRefreshTime.GetDefaults.First(x => x.Value == 30 && x.TimeUnit == TimeUnit.Second); + + public static ExportFileType WiFi_ExportFileType => ExportFileType.Csv; + + // Application: IP Scanner + public static int IPScanner_ICMPAttempts => 2; + public static int IPScanner_ICMPTimeout => 4000; + public static int IPScanner_ICMPBuffer => 32; + public static bool IPScanner_ResolveHostname => true; + public static bool IPScanner_PortScanEnabled => true; + public static string IPScanner_PortScanPorts => "22; 53; 80; 139; 389; 636; 443; 445; 3389"; + public static int IPScanner_PortScanTimeout => 4000; + public static int IPScanner_MaxHostThreads => 256; + public static int IPScanner_MaxPortThreads => 5; + public static bool IPScanner_NetBIOSEnabled => true; + public static int IPScanner_NetBIOSTimeout => 4000; + public static ExportFileType IPScanner_ExportFileType => ExportFileType.Csv; + + // Application: Port Scanner + public static int PortScanner_MaxHostThreads => 5; + public static int PortScanner_MaxPortThreads => 256; + public static int PortScanner_Timeout => 4000; + public static ExportFileType PortScanner_ExportFileType => ExportFileType.Csv; + + // Application: Ping Monitor + public static int PingMonitor_Buffer => 32; + public static bool PingMonitor_DontFragment => true; + public static int PingMonitor_Timeout => 4000; + public static int PingMonitor_TTL => 64; + public static int PingMonitor_WaitTime => 1000; + public static bool PingMonitor_ExpandHostView => false; + public static int PingMonitor_ChartTime => 120; + public static ExportFileType PingMonitor_ExportFileType => ExportFileType.Csv; + + // Application: Ping Monitor (notifications) + public static bool PingMonitor_ShowNotificationPopup => true; + public static bool PingMonitor_NotificationSound => true; + public static int PingMonitor_NotificationSuccessThreshold => 1; + public static int PingMonitor_NotificationFailureThreshold => 3; + public static int PingMonitor_NotificationCloseTime => 10; + + // Application: Traceroute + public static int Traceroute_MaximumHops => 30; + public static int Traceroute_Timeout => 4000; + public static int Traceroute_Buffer => 32; + public static bool Traceroute_ResolveHostname => true; + public static bool Traceroute_CheckIPApiIPGeolocation => false; + public static bool Traceroute_ShowMap => true; + public static bool Traceroute_ExpandMapView => true; + public static double Traceroute_MapHeight => 300; + public static ExportFileType Traceroute_ExportFileType => ExportFileType.Csv; + + // Application: DNS Lookup + public static QueryClass DNSLookup_QueryClass => QueryClass.IN; + public static QueryType DNSLookup_QueryType => QueryType.ANY; + public static bool DNSLookup_UseTCPOnly => false; + public static int DNSLookup_Retries => 3; + public static int DNSLookup_Timeout => 2; + public static ExportFileType DNSLookup_ExportFileType => ExportFileType.Csv; + + // Application: Remote Desktop + public static bool RemoteDesktop_UseCurrentViewSize => true; + public static int RemoteDesktop_ScreenWidth => 1280; + public static int RemoteDesktop_ScreenHeight => 768; + + public static int RemoteDesktop_ColorDepth => 32; + public static int RemoteDesktop_Port => 3389; + public static bool RemoteDesktop_ViewOnly => false; + public static bool RemoteDesktop_GatewayServerBypassLocalAddresses => true; + + public static GatewayUserSelectedCredsSource RemoteDesktop_GatewayServerLogonMethod => + GatewayUserSelectedCredsSource.Any; + + public static bool RemoteDesktop_GatewayServerShareCredentialsWithRemoteComputer => true; + public static AudioRedirectionMode RemoteDesktop_AudioRedirectionMode => AudioRedirectionMode.PlayOnThisComputer; + + public static AudioCaptureRedirectionMode RemoteDesktop_AudioCaptureRedirectionMode => + AudioCaptureRedirectionMode.DoNotRecord; + + public static KeyboardHookMode RemoteDesktop_KeyboardHookMode => KeyboardHookMode.OnTheRemoteComputer; + public static bool RemoteDesktop_RedirectClipboard => true; + public static bool RemoteDesktop_EnableCredSspSupport => true; + public static uint RemoteDesktop_AuthenticationLevel => 2; + + public static NetworkConnectionType RemoteDesktop_NetworkConnectionType => + NetworkConnectionType.DetectAutomatically; + + // Application: PowerShell + public static string PowerShell_Command => "Set-Location ~"; + public static ExecutionPolicy PowerShell_ExecutionPolicy => ExecutionPolicy.RemoteSigned; + + // Application: PuTTY + public static ConnectionMode PuTTY_DefaultConnectionMode => ConnectionMode.SSH; + public static string PuTTY_DefaultProfile => "NETworkManager"; + public static LogMode PuTTY_LogMode => LogMode.SessionLog; + + public static string PuTTY_LogPath => + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), + AssemblyManager.Current.Name, "PuTTY_Log"); + + public static string PuTTY_LogFileName => "&H_&Y-&M-&D_&T.log"; + public static int PuTTY_SSHPort => 22; + public static string PuTTY_SerialLine => "COM1"; + public static int PuTTY_TelnetPort => 23; + public static int PuTTY_BaudRate => 9600; + public static int PuTTY_RloginPort => 513; + public static int PuTTY_RawPort => 23; + + // Application: TigerVNC + public static int TigerVNC_DefaultVNCPort => 5900; + + // Application: WebConsole + public static bool WebConsole_ShowAddressBar => true; + + public static bool WebConsole_IsStatusBarEnabled => true; + + public static bool WebConsole_IsPasswordSaveEnabled => true; + + public static string WebConsole_Cache => + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), + AssemblyManager.Current.Name, "WebConsole_Cache"); + + // Application: SNMP + public static WalkMode SNMP_WalkMode => WalkMode.WithinSubtree; + public static int SNMP_Timeout => 60000; + public static SNMPMode SNMP_Mode => SNMPMode.Walk; + public static SNMPVersion SNMP_Version => SNMPVersion.V2C; + public static SNMPV3Security SNMP_Security => SNMPV3Security.AuthPriv; + public static SNMPV3AuthenticationProvider SNMP_AuthenticationProvider => SNMPV3AuthenticationProvider.SHA1; + public static SNMPV3PrivacyProvider SNMP_PrivacyProvider => SNMPV3PrivacyProvider.AES; + public static ExportFileType SNMP_ExportFileType => ExportFileType.Csv; + + // Application: SNTP Lookup + public static int SNTPLookup_Timeout => 4000; + public static ExportFileType SNTPLookup_ExportFileType => ExportFileType.Csv; + + // Application: Hosts File Editor + public static ExportFileType HostsFileEditor_ExportFileType => ExportFileType.Csv; + + // Application: Firewall + public static ExportFileType Firewall_ExportFileType => ExportFileType.Csv; + + // Application: Discovery Protocol + public static DiscoveryProtocol DiscoveryProtocol_Protocol => DiscoveryProtocol.LldpCdp; + public static int DiscoveryProtocol_Duration => 60; + public static ExportFileType DiscoveryProtocol_ExportFileType => ExportFileType.Csv; + + // Application: Wake on LAN + public static int WakeOnLAN_Port => 9; + + // Application: Subnet Calculator + public static ExportFileType SubnetCalculator_Subnetting_ExportFileType => ExportFileType.Csv; + + // Application: Bit Calculator + public static BitCaluclatorUnit BitCalculator_Unit => BitCaluclatorUnit.Bytes; + public static BitCaluclatorNotation BitCalculator_Notation => BitCaluclatorNotation.Binary; + public static ExportFileType BitCalculator_ExportFileType => ExportFileType.Csv; + + // Application: Lookup + public static ExportFileType Lookup_OUI_ExportFileType => ExportFileType.Csv; + public static ExportFileType Lookup_Port_ExportFileType => ExportFileType.Csv; + + // Application: Whois + public static ExportFileType Whois_ExportFileType => ExportFileType.Txt; + + // Application: IP Geolocation + public static ExportFileType IPGeolocation_ExportFileType => ExportFileType.Csv; + + // Application: Connections + public static ExportFileType Connections_ExportFileType => ExportFileType.Csv; + + public static AutoRefreshTimeInfo Connections_AutoRefreshTime => + AutoRefreshTime.GetDefaults.First(x => x.Value == 30 && x.TimeUnit == TimeUnit.Second); + + // Application: Listeners + public static ExportFileType Listeners_ExportFileType => ExportFileType.Csv; + + public static AutoRefreshTimeInfo Listeners_AutoRefreshTime => + AutoRefreshTime.GetDefaults.First(x => x.Value == 30 && x.TimeUnit == TimeUnit.Second); + + // Application: Neighbor Table + public static ExportFileType NeighborTable_ExportFileType => ExportFileType.Csv; + + public static AutoRefreshTimeInfo NeighborTable_AutoRefreshTime => + AutoRefreshTime.GetDefaults.First(x => x.Value == 30 && x.TimeUnit == TimeUnit.Second); + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager.Settings/LocalSettingsInfo.cs b/Source/NETworkManager.Settings/LocalSettingsInfo.cs new file mode 100644 index 0000000000..97edfd4ce5 --- /dev/null +++ b/Source/NETworkManager.Settings/LocalSettingsInfo.cs @@ -0,0 +1,54 @@ +using System.ComponentModel; +using System.Runtime.CompilerServices; +using System.Text.Json.Serialization; + +namespace NETworkManager.Settings; + +/// +/// Class contains local settings that are stored outside the main settings file. +/// These settings control where the main settings file is located. +/// +public class LocalSettingsInfo +{ + /// + /// Occurs when a property value changes. + /// + /// This event is typically used to notify subscribers that a property value has been updated. It + /// is commonly implemented in classes that support data binding or need to signal changes to property + /// values. + public event PropertyChangedEventHandler PropertyChanged; + + /// + /// Helper method to raise the event. + /// + /// Name of the property that changed. + private void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + SettingsChanged = true; + + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + + #region Variables + + [JsonIgnore] public bool SettingsChanged { get; set; } + + /// + /// Location of the folder where the local settings file is stored. + /// This can be changed by the user to move the settings file to a different location. + /// + public string Settings_FolderLocation + { + get; + set + { + if (field == value) + return; + + field = value; + OnPropertyChanged(); + } + } + + #endregion +} diff --git a/Source/NETworkManager.Settings/LocalSettingsManager.cs b/Source/NETworkManager.Settings/LocalSettingsManager.cs index 57e4149cdc..8c5c7747f4 100644 --- a/Source/NETworkManager.Settings/LocalSettingsManager.cs +++ b/Source/NETworkManager.Settings/LocalSettingsManager.cs @@ -1,27 +1,142 @@ -namespace NETworkManager.Settings +using log4net; +using System; +using System.IO; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace NETworkManager.Settings; + +/// +/// Manages local application settings that are stored outside the main settings file. +/// This is used for settings that control where the main settings file is located. +/// +public static class LocalSettingsManager { - public static class LocalSettingsManager + #region Variables + + /// + /// Logger for logging. + /// + private static readonly ILog Log = LogManager.GetLogger(typeof(LocalSettingsManager)); + + /// + /// Settings file name. + /// + private static string SettingsFileName => "Settings.json"; + + /// + /// Settings that are currently loaded. + /// + public static LocalSettingsInfo Current { get; private set; } + + /// + /// JSON serializer options for consistent serialization/deserialization. + /// + private static readonly JsonSerializerOptions JsonOptions = new() { - public static bool UpgradeRequired - { - get { return Properties.Settings.Default.UpgradeRequired; } - set { Properties.Settings.Default.UpgradeRequired = value; } - } + WriteIndented = true, + PropertyNameCaseInsensitive = true, + DefaultIgnoreCondition = JsonIgnoreCondition.Never, + Converters = { new JsonStringEnumConverter() } + }; + #endregion - public static string Settings_CustomSettingsLocation - { - get { return Properties.Settings.Default.Settings_CustomSettingsLocation; } - set { Properties.Settings.Default.Settings_CustomSettingsLocation = value; } - } + #region Methods - public static void Upgrade() - { - Properties.Settings.Default.Upgrade(); - } + /// + /// Method to get the path of the settings folder. + /// + /// Path to the settings folder. + private static string GetSettingsFolderLocation() + { + return Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), + AssemblyManager.Current.Name); + } + + /// + /// Method to get the settings file path + /// + /// Settings file path. + private static string GetSettingsFilePath() + { + return Path.Combine( + GetSettingsFolderLocation(), + SettingsFileName); + } + + /// + /// Initialize new settings () and save them (to a file). + /// + private static void Initialize() + { + Log.Info("Initializing new local settings."); - public static void Save() + Current = new LocalSettingsInfo(); + + Save(); + } + + /// + /// Method to load the settings from a file. + /// + public static void Load() + { + var filePath = GetSettingsFilePath(); + + if (File.Exists(filePath)) { - Properties.Settings.Default.Save(); + try + { + Log.Info($"Loading local settings from: {filePath}"); + + var jsonString = File.ReadAllText(filePath); + + // Treat empty or JSON "null" as "no settings" instead of crashing + if (string.IsNullOrWhiteSpace(jsonString)) + { + Log.Info("Local settings file is empty, initializing new local settings."); + } + else + { + Current = JsonSerializer.Deserialize(jsonString, JsonOptions) ?? new LocalSettingsInfo(); + + Log.Info("Local settings loaded successfully."); + + // Reset change tracking + Current.SettingsChanged = false; + + return; + } + } + catch (Exception ex) + { + Log.Error($"Failed to load local settings from: {filePath}", ex); + } } + + // Initialize new local settings if file does not exist or loading failed + Initialize(); + } + + /// + /// Method to save the current settings to a file. + /// + public static void Save() + { + // Create the directory if it does not exist + Directory.CreateDirectory(GetSettingsFolderLocation()); + + // Serialize to file + var filePath = GetSettingsFilePath(); + + var jsonString = JsonSerializer.Serialize(Current, JsonOptions); + File.WriteAllText(filePath, jsonString); + + Log.Info($"Local settings saved to {filePath}"); + + // Reset change tracking + Current.SettingsChanged = false; } + #endregion } diff --git a/Source/NETworkManager.Settings/NETworkManager.Settings.csproj b/Source/NETworkManager.Settings/NETworkManager.Settings.csproj index d29e436b00..81a4beb21c 100644 --- a/Source/NETworkManager.Settings/NETworkManager.Settings.csproj +++ b/Source/NETworkManager.Settings/NETworkManager.Settings.csproj @@ -1,45 +1,64 @@ - - {954E8703-3E6E-42BF-BD28-F0B19BE10E0C} - Library - NETworkManager.Settings - NETworkManager.Settings - net6.0-windows10.0.17763.0 - win10-x64 - false - true - false - - - - - - - - - - - - - - - - - - - - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - - - - - - \ No newline at end of file + + {954E8703-3E6E-42BF-BD28-F0B19BE10E0C} + Library + NETworkManager.Settings + NETworkManager.Settings + net10.0-windows10.0.22621.0 + false + true + false + false + + + + + + + + + + + + + PreserveNewest + + + PreserveNewest + Designer + + + + PreserveNewest + Designer + + + + PreserveNewest + Designer + + + + PreserveNewest + Designer + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/NETworkManager.Settings/PolicyInfo.cs b/Source/NETworkManager.Settings/PolicyInfo.cs new file mode 100644 index 0000000000..6d24437e36 --- /dev/null +++ b/Source/NETworkManager.Settings/PolicyInfo.cs @@ -0,0 +1,19 @@ +using System.Text.Json.Serialization; + +namespace NETworkManager.Settings; + +/// +/// Class that represents system-wide policies that override user settings. +/// This configuration is loaded from a config.json file in the application directory. +/// +public class PolicyInfo +{ + [JsonPropertyName("Update_CheckForUpdatesAtStartup")] + public bool? Update_CheckForUpdatesAtStartup { get; set; } + + [JsonPropertyName("Profiles_FolderLocation")] + public string? Profiles_FolderLocation { get; set; } + + [JsonPropertyName("Settings_FolderLocation")] + public string? Settings_FolderLocation { get; set; } +} diff --git a/Source/NETworkManager.Settings/PolicyManager.cs b/Source/NETworkManager.Settings/PolicyManager.cs new file mode 100644 index 0000000000..f61fc15d89 --- /dev/null +++ b/Source/NETworkManager.Settings/PolicyManager.cs @@ -0,0 +1,105 @@ +using log4net; +using System; +using System.IO; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace NETworkManager.Settings; + +/// +/// Manager for system-wide policies that are loaded from a config.json file +/// in the application directory. These policies override user settings. +/// +public static class PolicyManager +{ + #region Variables + + /// + /// Logger for logging. + /// + private static readonly ILog Log = LogManager.GetLogger(typeof(PolicyManager)); + + /// + /// Config file name. + /// + private static string ConfigFileName => "config.json"; + + /// + /// System-wide policies that are currently loaded. + /// + public static PolicyInfo Current { get; private set; } + + /// + /// JSON serializer options for consistent serialization/deserialization. + /// + private static readonly JsonSerializerOptions JsonOptions = new() + { + WriteIndented = true, + PropertyNameCaseInsensitive = true, + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, + Converters = { new JsonStringEnumConverter() } + }; + + #endregion + + #region Methods + + /// + /// Method to get the config file path in the application directory. + /// + /// Config file path. + private static string GetConfigFilePath() + { + return Path.Combine(AssemblyManager.Current.Location, ConfigFileName); + } + + /// + /// Method to load the system-wide policies from config.json file in the application directory. + /// + public static void Load() + { + var filePath = GetConfigFilePath(); + + // Check if config file exists + if (File.Exists(filePath)) + { + try + { + Log.Info($"Loading system-wide policies from: {filePath}"); + + var jsonString = File.ReadAllText(filePath); + + // Treat empty or JSON "null" as "no policies" instead of crashing + if (string.IsNullOrWhiteSpace(jsonString)) + { + Current = new PolicyInfo(); + + Log.Info("Config file is empty, no system-wide policies loaded."); + } + else + { + Current = JsonSerializer.Deserialize(jsonString, JsonOptions) ?? new PolicyInfo(); + + Log.Info("System-wide policies loaded successfully."); + + // Log enabled settings + Log.Info($"System-wide policy - Update_CheckForUpdatesAtStartup: {Current.Update_CheckForUpdatesAtStartup?.ToString() ?? "Not set"}"); + Log.Info($"System-wide policy - Profiles_FolderLocation: {Current.Profiles_FolderLocation ?? "Not set"}"); + Log.Info($"System-wide policy - Settings_FolderLocation: {Current.Settings_FolderLocation ?? "Not set"}"); + } + } + catch (Exception ex) + { + Log.Error($"Failed to load system-wide policies from: {filePath}", ex); + Current = new PolicyInfo(); + } + } + else + { + Log.Debug($"No system-wide policy file found at: {filePath}"); + Current = new PolicyInfo(); + } + } + + #endregion +} diff --git a/Source/NETworkManager.Settings/ProfileViewState.cs b/Source/NETworkManager.Settings/ProfileViewState.cs new file mode 100644 index 0000000000..9f4c0e8103 --- /dev/null +++ b/Source/NETworkManager.Settings/ProfileViewState.cs @@ -0,0 +1,123 @@ +using System; +using System.Windows; +using NETworkManager.Utilities; + +namespace NETworkManager.Settings; + +/// +/// Shared expanded/width state of the profile panel, used by every tool that hosts a profile list. Because all +/// tools observe the same instance, resizing or collapsing the profile panel in one tool +/// is reflected in every other tool automatically through data binding - no manual synchronization needed. +/// +/// +/// reads the first time it is accessed. This is +/// only safe once has completed (done early in App.xaml.cs, before the main +/// window - and therefore any tool view - is created). Do not reference from eagerly +/// loaded resources (e.g. App.xaml or globally merged style dictionaries). +/// +public sealed class ProfileViewState : PropertyChangedBase +{ + public static ProfileViewState Current { get; } + + static ProfileViewState() + { + Current = new ProfileViewState(); + } + + private readonly bool _isLoading; + private bool _canProfileWidthChange = true; + private double _tempProfileWidth; + + private ProfileViewState() + { + _isLoading = true; + + // Must be set before ExpandProfileView below, since assigning it can synchronously trigger + // ResizeProfile(false), which reads _tempProfileWidth. + _tempProfileWidth = SettingsManager.Current.Profile_Width; + + ExpandProfileView = SettingsManager.Current.Profile_ExpandView; + + ProfileWidth = ExpandProfileView + ? new GridLength(SettingsManager.Current.Profile_Width) + : new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); + + _isLoading = false; + } + + /// + /// Gets or sets a value indicating whether the profile panel is expanded, shared across all tools. + /// + public bool ExpandProfileView + { + get; + set + { + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.Profile_ExpandView = value; + + field = value; + + if (_canProfileWidthChange) + ResizeProfile(false); + + OnPropertyChanged(); + } + } + + /// + /// Gets or sets the width of the profile panel, shared across all tools. + /// + public GridLength ProfileWidth + { + get; + set + { + if (value == field) + return; + + if (!_isLoading && Math.Abs(value.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > + GlobalStaticConfiguration.FloatPointFix) // Do not save the size when collapsed + SettingsManager.Current.Profile_Width = value.Value; + + field = value; + + if (_canProfileWidthChange) + ResizeProfile(true); + + OnPropertyChanged(); + } + } + + private void ResizeProfile(bool dueToChangedSize) + { + _canProfileWidthChange = false; + + if (dueToChangedSize) + { + ExpandProfileView = Math.Abs(ProfileWidth.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > + GlobalStaticConfiguration.FloatPointFix; + } + else + { + if (ExpandProfileView) + { + ProfileWidth = + Math.Abs(_tempProfileWidth - GlobalStaticConfiguration.Profile_WidthCollapsed) < + GlobalStaticConfiguration.FloatPointFix + ? new GridLength(GlobalStaticConfiguration.Profile_DefaultWidthExpanded) + : new GridLength(_tempProfileWidth); + } + else + { + _tempProfileWidth = ProfileWidth.Value; + ProfileWidth = new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); + } + } + + _canProfileWidthChange = true; + } +} diff --git a/Source/NETworkManager.Settings/Properties/AssemblyInfo.cs b/Source/NETworkManager.Settings/Properties/AssemblyInfo.cs index 29e7639d5f..f1cd324170 100644 --- a/Source/NETworkManager.Settings/Properties/AssemblyInfo.cs +++ b/Source/NETworkManager.Settings/Properties/AssemblyInfo.cs @@ -4,7 +4,5 @@ [assembly: AssemblyTitle("NETworkManager.Settings")] [assembly: AssemblyDescription("Library contains NETworkManager settings.")] [assembly: AssemblyProduct("NETworkManager.Settings")] - [assembly: ComVisible(false)] - [assembly: Guid("954e8703-3e6e-42bf-bd28-f0b19be10e0c")] \ No newline at end of file diff --git a/Source/NETworkManager.Settings/Properties/Settings.Designer.cs b/Source/NETworkManager.Settings/Properties/Settings.Designer.cs deleted file mode 100644 index fe1f915cb4..0000000000 --- a/Source/NETworkManager.Settings/Properties/Settings.Designer.cs +++ /dev/null @@ -1,50 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace NETworkManager.Settings.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.5.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("")] - public string Settings_CustomSettingsLocation { - get { - return ((string)(this["Settings_CustomSettingsLocation"])); - } - set { - this["Settings_CustomSettingsLocation"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("True")] - public bool UpgradeRequired { - get { - return ((bool)(this["UpgradeRequired"])); - } - set { - this["UpgradeRequired"] = value; - } - } - } -} diff --git a/Source/NETworkManager.Settings/Properties/Settings.settings b/Source/NETworkManager.Settings/Properties/Settings.settings deleted file mode 100644 index a696b1bbe3..0000000000 --- a/Source/NETworkManager.Settings/Properties/Settings.settings +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - True - - - \ No newline at end of file diff --git a/Source/NETworkManager.Settings/SettingsFileInfo.cs b/Source/NETworkManager.Settings/SettingsFileInfo.cs deleted file mode 100644 index 3dd52840af..0000000000 --- a/Source/NETworkManager.Settings/SettingsFileInfo.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace NETworkManager.Settings -{ - public class SettingsFileInfo - { - public bool Export { get; set; } - public string FileName { get; set; } - public string FilePath { get; set; } - - public SettingsFileInfo() - { - - } - - public SettingsFileInfo(bool export, string fileName, string filePath) - { - Export = export; - FileName = fileName; - FilePath = filePath; - } - } -} diff --git a/Source/NETworkManager.Settings/SettingsGroup.cs b/Source/NETworkManager.Settings/SettingsGroup.cs new file mode 100644 index 0000000000..91c7e33a21 --- /dev/null +++ b/Source/NETworkManager.Settings/SettingsGroup.cs @@ -0,0 +1,7 @@ +namespace NETworkManager.Settings; + +public enum SettingsGroup +{ + General, + Application +} \ No newline at end of file diff --git a/Source/NETworkManager.Settings/SettingsInfo.cs b/Source/NETworkManager.Settings/SettingsInfo.cs index 6aa5390e7f..eb33ec907c 100644 --- a/Source/NETworkManager.Settings/SettingsInfo.cs +++ b/Source/NETworkManager.Settings/SettingsInfo.cs @@ -1,3736 +1,3969 @@ -using System; -using System.Collections.ObjectModel; -using System.Collections.Specialized; -using System.ComponentModel; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.CompilerServices; -using System.Xml.Serialization; using DnsClient; using Lextm.SharpSnmpLib.Messaging; using NETworkManager.Controls; using NETworkManager.Models; using NETworkManager.Models.Export; using NETworkManager.Models.Network; +using NETworkManager.Models.PowerShell; using NETworkManager.Models.PuTTY; using NETworkManager.Models.RemoteDesktop; using NETworkManager.Utilities; -using static NETworkManager.Models.Network.SNMP; - -namespace NETworkManager.Settings +using NETworkManager.Utilities.ActiveDirectory; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Collections.Specialized; +using System.ComponentModel; +using System.Runtime.CompilerServices; +using System.Text.Json.Serialization; + +// ReSharper disable InconsistentNaming + +namespace NETworkManager.Settings; + +/// +/// Represents the application settings, user preferences, and configuration data for all supported features and +/// modules. Supports property change notification for data binding and persistence scenarios. +/// +/// The class provides a centralized container for storing and managing user-configurable +/// options, operational parameters, and history collections for various application modules, such as network tools, +/// remote access, and calculators. It implements the INotifyPropertyChanged interface to enable data binding and +/// automatic UI updates when settings change. Most properties raise the PropertyChanged event when modified, allowing +/// consumers to track changes and persist settings as needed. This class is typically used as the main settings model +/// in applications that require user customization and state management across sessions. +public class SettingsInfo : INotifyPropertyChanged { - public class SettingsInfo : INotifyPropertyChanged + /// + /// Occurs when a property value changes. + /// + /// This event is typically used to notify subscribers that a property value has been updated. It + /// is commonly implemented in classes that support data binding or need to signal changes to property + /// values. + public event PropertyChangedEventHandler PropertyChanged; + + /// + /// Helper method to raise the event. + /// + /// Name of the property that changed. + private void OnPropertyChanged([CallerMemberName] string propertyName = null) { - #region Events - public event PropertyChangedEventHandler PropertyChanged; + SettingsChanged = true; - protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } - #endregion + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } - #region Variables - [XmlIgnore] public bool SettingsChanged { get; set; } + #region Variables - private bool _firstRun = true; - public bool FirstRun + [JsonIgnore] public bool SettingsChanged { get; set; } + + /// + /// Determines if the welcome dialog should be shown on application start. + /// + public bool WelcomeDialog_Show + { + get; + set { - get => _firstRun; - set - { - if (value == _firstRun) - return; + if (value == field) + return; - _firstRun = value; - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = true; - #region General - // General - private ApplicationName _general_DefaultApplicationViewName = GlobalStaticConfiguration.General_DefaultApplicationViewName; - public ApplicationName General_DefaultApplicationViewName + /// + /// Indicates if the update dialog should be shown on application start. + /// Usually this is set to true if the application has been updated to a new version. + /// + public bool UpgradeDialog_Show + { + get; + set { - get => _general_DefaultApplicationViewName; - set - { - if (value == _general_DefaultApplicationViewName) - return; + if (value == field) + return; - _general_DefaultApplicationViewName = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private int _general_BackgroundJobInterval = GlobalStaticConfiguration.General_BackgroundJobInterval; - public int General_BackgroundJobInterval + /// + /// Version of the settings file. Should be identical to the version of the application. + /// It is used to determine if the settings file needs to be updated. + /// + public string Version + { + get; + set { - get => _general_BackgroundJobInterval; - set - { - if (value == _general_BackgroundJobInterval) - return; + if (value == field) + return; - _general_BackgroundJobInterval = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private int _general_HistoryListEntries = GlobalStaticConfiguration.General_HistoryListEntries; - public int General_HistoryListEntries + /// + /// Stores the date of the last backup of the settings file. + /// + public DateTime LastBackup + { + get; + set { - get => _general_HistoryListEntries; - set - { - if (value == _general_HistoryListEntries) - return; + if (value == field) + return; - _general_HistoryListEntries = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = DateTime.MinValue; - private ObservableSetCollection _general_ApplicationList = new ObservableSetCollection(); - public ObservableSetCollection General_ApplicationList - { - get => _general_ApplicationList; - set - { - if (value == _general_ApplicationList) - return; + #region General - _general_ApplicationList = value; - OnPropertyChanged(); - SettingsChanged = true; - } - } + // General - // Window - private bool _window_ConfirmClose; - public bool Window_ConfirmClose + public ObservableSetCollection General_ApplicationList + { + get; + set { - get => _window_ConfirmClose; - set - { - if (value == _window_ConfirmClose) - return; + if (value == field) + return; - _window_ConfirmClose = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = []; - private bool _window_MinimizeInsteadOfTerminating; - public bool Window_MinimizeInsteadOfTerminating + public int General_BackgroundJobInterval + { + get; + set { - get => _window_MinimizeInsteadOfTerminating; - set - { - if (value == _window_MinimizeInsteadOfTerminating) - return; + if (value == field) + return; - _window_MinimizeInsteadOfTerminating = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.General_BackgroundJobInterval; + - private bool _window_MultipleInstances; - public bool Window_MultipleInstances + public int General_ThreadPoolAdditionalMinThreads + { + get; + set { - get => _window_MultipleInstances; - set - { - if (value == _window_MultipleInstances) - return; + if (value == field) + return; - _window_MultipleInstances = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.General_ThreadPoolAdditionalMinThreads; - private bool _window_MinimizeToTrayInsteadOfTaskbar; - public bool Window_MinimizeToTrayInsteadOfTaskbar + public int General_HistoryListEntries + { + get; + set { - get => _window_MinimizeToTrayInsteadOfTaskbar; - set - { - if (value == _window_MinimizeToTrayInsteadOfTaskbar) - return; + if (value == field) + return; - _window_MinimizeToTrayInsteadOfTaskbar = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.General_HistoryListEntries; - // TrayIcon - private bool _trayIcon_AlwaysShowIcon; - public bool TrayIcon_AlwaysShowIcon + // Profile (shared across all tools with a profile panel) + + public bool Profile_ExpandView + { + get; + set { - get => _trayIcon_AlwaysShowIcon; - set - { - if (value == _trayIcon_AlwaysShowIcon) - return; + if (value == field) + return; - _trayIcon_AlwaysShowIcon = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Profile_ExpandProfileView; - // SplashScreen - private bool _splashScreen_Enabled = GlobalStaticConfiguration.SplashScreen_Enabled; - public bool SplashScreen_Enabled + public double Profile_Width + { + get; + set { - get => _splashScreen_Enabled; - set - { - if (value == _splashScreen_Enabled) - return; + if (Math.Abs(value - field) < GlobalStaticConfiguration.FloatPointFix) + return; - _splashScreen_Enabled = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Profile_DefaultWidthExpanded; + + // Window - // Appearance - private string _appearance_Theme = GlobalStaticConfiguration.Appearance_Theme; - public string Appearance_Theme + public bool Window_ConfirmClose + { + get; + set { - get => _appearance_Theme; - set - { - if (value == _appearance_Theme) - return; + if (value == field) + return; - _appearance_Theme = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private string _appearance_Accent = GlobalStaticConfiguration.Appearance_Accent; - public string Appearance_Accent + public bool Window_MinimizeInsteadOfTerminating + { + get; + set { - get => _appearance_Accent; - set - { - if (value == _appearance_Accent) - return; + if (value == field) + return; - _appearance_Accent = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - // Localization - private string _localization_CultureCode; - public string Localization_CultureCode + public bool Window_MultipleInstances + { + get; + set { - get => _localization_CultureCode; - set - { - if (value == _localization_CultureCode) - return; + if (value == field) + return; - _localization_CultureCode = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - // Status - private bool _status_ShowWindowOnNetworkChange = GlobalStaticConfiguration.Status_ShowWindowOnNetworkChange; - public bool Status_ShowWindowOnNetworkChange + public bool Window_MinimizeToTrayInsteadOfTaskbar + { + get; + set { - get => _status_ShowWindowOnNetworkChange; - set - { - if (value == _status_ShowWindowOnNetworkChange) - return; + if (value == field) + return; - _status_ShowWindowOnNetworkChange = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private int _status_WindowCloseTime = GlobalStaticConfiguration.Status_WindowCloseTime; - public int Status_WindowCloseTime + // TrayIcon + + public bool TrayIcon_AlwaysShowIcon + { + get; + set { - get => _status_WindowCloseTime; - set - { - if (value == _status_WindowCloseTime) - return; + if (value == field) + return; - _status_WindowCloseTime = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } + + // SplashScreen - private string _status_IPAddressToDetectLocalIPAddressBasedOnRouting = GlobalStaticConfiguration.Status_IPAddressToDetectLocalIPAddressBasedOnRouting; - public string Status_IPAddressToDetectLocalIPAddressBasedOnRouting + public bool SplashScreen_Enabled + { + get; + set { - get => _status_IPAddressToDetectLocalIPAddressBasedOnRouting; - set - { - if (value == _status_IPAddressToDetectLocalIPAddressBasedOnRouting) - return; + if (value == field) + return; - _status_IPAddressToDetectLocalIPAddressBasedOnRouting = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.SplashScreen_Enabled; + + // Appearance - // Autostart - private bool _autostart_StartMinimizedInTray; - public bool Autostart_StartMinimizedInTray + public string Appearance_Theme + { + get; + set { - get => _autostart_StartMinimizedInTray; - set - { - if (value == _autostart_StartMinimizedInTray) - return; + if (value == field) + return; - _autostart_StartMinimizedInTray = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Appearance_Theme; - // HotKey - private bool _hotKey_ShowWindowEnabled; - public bool HotKey_ShowWindowEnabled + public string Appearance_Accent + { + get; + set { - get => _hotKey_ShowWindowEnabled; - set - { - if (value == _hotKey_ShowWindowEnabled) - return; + if (value == field) + return; - _hotKey_ShowWindowEnabled = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Appearance_Accent; - private int _hotKey_ShowWindowKey = GlobalStaticConfiguration.HotKey_ShowWindowKey; - public int HotKey_ShowWindowKey + public bool Appearance_UseCustomTheme + { + get; + set { - get => _hotKey_ShowWindowKey; - set - { - if (value == _hotKey_ShowWindowKey) - return; + if (value == field) + return; - _hotKey_ShowWindowKey = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Appearance_UseCustomTheme; - private int _hotKey_ShowWindowModifier = GlobalStaticConfiguration.HotKey_ShowWindowModifier; - public int HotKey_ShowWindowModifier + public string Appearance_CustomThemeName + { + get; + set { - get => _hotKey_ShowWindowModifier; - set - { - if (value == _hotKey_ShowWindowModifier) - return; + if (value == field) + return; - _hotKey_ShowWindowModifier = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - // Update - private bool _update_CheckForUpdatesAtStartup = true; - public bool Update_CheckForUpdatesAtStartup + public bool Appearance_PowerShellModifyGlobalProfile + { + get; + set { - get => _update_CheckForUpdatesAtStartup; - set - { - if (value == _update_CheckForUpdatesAtStartup) - return; + if (value == field) + return; - _update_CheckForUpdatesAtStartup = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } + + // Localization - // Profiles - private string _profiles_CustomProfilesLocation; - public string Profiles_CustomProfilesLocation + public string Localization_CultureCode + { + get; + set { - get => _profiles_CustomProfilesLocation; - set - { - if (value == _profiles_CustomProfilesLocation) - return; + if (value == field) + return; - _profiles_CustomProfilesLocation = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private string _profiles_LastSelected; - public string Profiles_LastSelected + // Network + + public bool Network_UseCustomDNSServer + { + get; + set { - get => _profiles_LastSelected; - set - { - if (value == _profiles_LastSelected) - return; + if (value == field) + return; - _profiles_LastSelected = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } - #endregion + } - #region Others - // Application view - private bool _expandApplicationView; - public bool ExpandApplicationView + public string Network_CustomDNSServer + { + get; + set { - get => _expandApplicationView; - set - { - if (value == _expandApplicationView) - return; + if (value == field) + return; - _expandApplicationView = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } - #endregion + } - #region Dashboard - private string _dashboard_PublicIPv4Address = GlobalStaticConfiguration.Dashboard_PublicIPv4Address; - public string Dashboard_PublicIPv4Address + public bool Network_ResolveHostnamePreferIPv4 + { + get; + set { - get => _dashboard_PublicIPv4Address; - set - { - if (value == _dashboard_PublicIPv4Address) - return; + if (value == field) + return; - _dashboard_PublicIPv4Address = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Network_ResolveHostnamePreferIPv4; - private string _dashboard_PublicIPv6Address = GlobalStaticConfiguration.Dashboard_PublicIPv6Address; - public string Dashboard_PublicIPv6Address + // Status + + public bool Status_ShowWindowOnNetworkChange + { + get; + set { - get => _dashboard_PublicIPv6Address; - set - { - if (value == _dashboard_PublicIPv6Address) - return; + if (value == field) + return; - _dashboard_PublicIPv6Address = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Status_ShowWindowOnNetworkChange; - private bool _dashboard_CheckPublicIPAddress = GlobalStaticConfiguration.Dashboard_CheckPublicIPAddress; - public bool Dashboard_CheckPublicIPAddress + public int Status_WindowCloseTime + { + get; + set { - get => _dashboard_CheckPublicIPAddress; - set - { - if (value == _dashboard_CheckPublicIPAddress) - return; + if (value == field) + return; - _dashboard_CheckPublicIPAddress = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Status_WindowCloseTime; + + // Autostart - private bool _dashboard_UseCustomPublicIPv4AddressAPI; - public bool Dashboard_UseCustomPublicIPv4AddressAPI + public bool Autostart_StartMinimizedInTray + { + get; + set { - get => _dashboard_UseCustomPublicIPv4AddressAPI; - set - { - if (value == _dashboard_UseCustomPublicIPv4AddressAPI) - return; + if (value == field) + return; - _dashboard_UseCustomPublicIPv4AddressAPI = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private string _dashboard_CustomPublicIPv4AddressAPI; - public string Dashboard_CustomPublicIPv4AddressAPI + // HotKey + + public bool HotKey_ShowWindowEnabled + { + get; + set { - get => _dashboard_CustomPublicIPv4AddressAPI; - set - { - if (value == _dashboard_CustomPublicIPv4AddressAPI) - return; + if (value == field) + return; - _dashboard_CustomPublicIPv4AddressAPI = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private bool _dashboard_UseCustomPublicIPv6AddressAPI; - public bool Dashboard_UseCustomPublicIPv6AddressAPI + public int HotKey_ShowWindowKey + { + get; + set { - get => _dashboard_UseCustomPublicIPv6AddressAPI; - set - { - if (value == _dashboard_UseCustomPublicIPv6AddressAPI) - return; + if (value == field) + return; - _dashboard_UseCustomPublicIPv6AddressAPI = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.HotKey_ShowWindowKey; - private string _dashboard_CustomPublicIPv6AddressAPI; - public string Dashboard_CustomPublicIPv6AddressAPI + public int HotKey_ShowWindowModifier + { + get; + set { - get => _dashboard_CustomPublicIPv6AddressAPI; - set - { - if (value == _dashboard_CustomPublicIPv6AddressAPI) - return; + if (value == field) + return; - _dashboard_CustomPublicIPv6AddressAPI = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } - #endregion + } = GlobalStaticConfiguration.HotKey_ShowWindowModifier; + + // Update - #region Network Interface - private string _networkInterface_InterfaceId; - public string NetworkInterface_InterfaceId + public bool Update_CheckForUpdatesAtStartup + { + get; + set { - get => _networkInterface_InterfaceId; - set - { - if (value == _networkInterface_InterfaceId) - return; + if (value == field) + return; - _networkInterface_InterfaceId = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Update_CheckForUpdatesAtStartup; - private bool _networkInterface_ExpandProfileView = true; - public bool NetworkInterface_ExpandProfileView + public bool Update_CheckForPreReleases + { + get; + set { - get => _networkInterface_ExpandProfileView; - set - { - if (value == _networkInterface_ExpandProfileView) - return; + if (value == field) + return; - _networkInterface_ExpandProfileView = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Update_CheckForPreReleases; - private double _networkInterface_ProfileWidth = GlobalStaticConfiguration.Profile_DefaultWidthExpanded; - public double NetworkInterface_ProfileWidth + public bool Experimental_EnableExperimentalFeatures + { + get; + set { - get => _networkInterface_ProfileWidth; - set - { - if (Math.Abs(value - _networkInterface_ProfileWidth) < GlobalStaticConfiguration.FloatPointFix) - return; + if (value == field) + return; - _networkInterface_ProfileWidth = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } - #endregion + } = GlobalStaticConfiguration.Experimental_EnableExperimentalFeatures; + + // Profiles - #region WiFi - private string _wiFi_InterfaceId; - public string WiFi_InterfaceId + public string Profiles_FolderLocation + { + get; + set { - get => _wiFi_InterfaceId; - set - { - if (value == _wiFi_InterfaceId) - return; + if (value == field) + return; - _wiFi_InterfaceId = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private bool _wiFi_Show2dot4GHzNetworks = GlobalStaticConfiguration.WiFi_Show2dot4GHzNetworks; - public bool WiFi_Show2dot4GHzNetworks + public string Profiles_LastSelected + { + get; + set { - get => _wiFi_Show2dot4GHzNetworks; - set - { - if (value == _wiFi_Show2dot4GHzNetworks) - return; + if (value == field) + return; - _wiFi_Show2dot4GHzNetworks = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private bool _wiFi_Show5GHzNetworks = GlobalStaticConfiguration.WiFi_Show5GHzNetworks; - public bool WiFi_Show5GHzNetworks + /// + /// Persisted collapsed/expanded state of profile groups, shared across all tools. Outer key is the + /// full profile file path, inner key is the group name. Mutated in place by callers - since nested + /// dictionary mutations don't raise , callers must explicitly set + /// themselves. + /// + public Dictionary> Profiles_GroupExpandState + { + get; + set { - get => _wiFi_Show5GHzNetworks; - set - { - if (value == _wiFi_Show5GHzNetworks) - return; + if (value == field) + return; - _wiFi_Show5GHzNetworks = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = []; - private bool _wiFi_AutoRefresh; - public bool WiFi_AutoRefresh + public bool Profiles_IsDailyBackupEnabled + { + get; + set { - get => _wiFi_AutoRefresh; - set - { - if (value == _wiFi_AutoRefresh) - return; + if (value == field) + return; - _wiFi_AutoRefresh = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Profiles_IsDailyBackupEnabled; - private AutoRefreshTimeInfo _wiFi_AutoRefreshTime = GlobalStaticConfiguration.WiFi_AutoRefreshTime; - public AutoRefreshTimeInfo WiFi_AutoRefreshTime + public int Profiles_MaximumNumberOfBackups + { + get; + set { - get => _wiFi_AutoRefreshTime; - set - { - if (value == _wiFi_AutoRefreshTime) - return; + if (value == field) + return; - _wiFi_AutoRefreshTime = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Profiles_MaximumNumberOfBackups; - private string _wiFi_ExportFilePath; - public string WiFi_ExportFilePath + public string Profiles_ImportActiveDirectorySearchBase + { + get; + set { - get => _wiFi_ExportFilePath; - set - { - if (value == _wiFi_ExportFilePath) - return; + if (value == field) + return; - _wiFi_ExportFilePath = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private ExportManager.ExportFileType _wiFi_ExportFileType = GlobalStaticConfiguration.WiFi_ExportFileType; - public ExportManager.ExportFileType WiFi_ExportFileType + public string Profiles_ImportActiveDirectoryServer + { + get; + set { - get => _wiFi_ExportFileType; - set - { - if (value == _wiFi_ExportFileType) - return; + if (value == field) + return; - _wiFi_ExportFileType = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } - #endregion + } - #region IPScanner - private bool _ipScanner_ShowScanResultForAllIPAddresses; - public bool IPScanner_ShowScanResultForAllIPAddresses + public int Profiles_ImportActiveDirectoryPort + { + get; + set { - get => _ipScanner_ShowScanResultForAllIPAddresses; - set - { - if (value == _ipScanner_ShowScanResultForAllIPAddresses) - return; + if (value == field) + return; - _ipScanner_ShowScanResultForAllIPAddresses = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Profiles_ImportActiveDirectoryUseSsl ? + GlobalStaticConfiguration.Profiles_ImportActiveDirectoryPort_Ldaps : + GlobalStaticConfiguration.Profiles_ImportActiveDirectoryPort_Ldap; - private int _ipScanner_Threads = GlobalStaticConfiguration.IPScanner_Threads; - public int IPScanner_Threads + public bool Profiles_ImportActiveDirectoryUseSsl + { + get; + set { - get => _ipScanner_Threads; - set - { - if (value == _ipScanner_Threads) - return; + if (value == field) + return; - _ipScanner_Threads = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Profiles_ImportActiveDirectoryUseSsl; - private int _ipScanner_ICMPAttempts = GlobalStaticConfiguration.IPScanner_ICMPAttempts; - public int IPScanner_ICMPAttempts + public bool Profiles_ImportActiveDirectoryExcludeDisabledAccounts + { + get; + set { - get => _ipScanner_ICMPAttempts; - set - { - if (value == _ipScanner_ICMPAttempts) - return; + if (value == field) + return; - _ipScanner_ICMPAttempts = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Profiles_ImportActiveDirectoryExcludeDisabledAccounts; - private int _ipScanner_ICMPBuffer = GlobalStaticConfiguration.IPScanner_ICMPBuffer; - public int IPScanner_ICMPBuffer + public ActiveDirectoryAuthenticationMode Profiles_ImportActiveDirectoryAuthMode + { + get; + set { - get => _ipScanner_ICMPBuffer; - set - { - if (value == _ipScanner_ICMPBuffer) - return; + if (value == field) + return; - _ipScanner_ICMPBuffer = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = ActiveDirectoryAuthenticationMode.CurrentUser; - private ObservableCollection _ipScanner_HostsHistory = new ObservableCollection(); - public ObservableCollection IPScanner_HostsHistory + public string Profiles_ImportActiveDirectoryAdditionalFilter + { + get; + set { - get => _ipScanner_HostsHistory; - set - { - if (value == _ipScanner_HostsHistory) - return; + if (value == field) + return; - _ipScanner_HostsHistory = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private bool _ipScanner_ResolveHostname = true; - public bool IPScanner_ResolveHostname + public string Profiles_ImportCsvLastFilePath + { + get; + set { - get => _ipScanner_ResolveHostname; - set - { - if (value == _ipScanner_ResolveHostname) - return; + if (value == field) + return; - _ipScanner_ResolveHostname = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } + + // Settings - private bool _ipScanner_UseCustomDNSServer; - public bool IPScanner_UseCustomDNSServer + public bool Settings_IsDailyBackupEnabled + { + get; + set { - get => _ipScanner_UseCustomDNSServer; - set - { - if (value == _ipScanner_UseCustomDNSServer) - return; + if (value == field) + return; - _ipScanner_UseCustomDNSServer = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Settings_IsDailyBackupEnabled; - private string _ipScanner_CustomDNSServer; - public string IPScanner_CustomDNSServer + public int Settings_MaximumNumberOfBackups + { + get; + set { - get => _ipScanner_CustomDNSServer; - set - { - if (value == _ipScanner_CustomDNSServer) - return; + if (value == field) + return; - _ipScanner_CustomDNSServer = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Settings_MaximumNumberOfBackups; - private int _ipScanner_CustomDNSPort = GlobalStaticConfiguration.IPScanner_DNSPort; - public int IPScanner_CustomDNSPort - { - get => _ipScanner_CustomDNSPort; - set - { - if (value == _ipScanner_CustomDNSPort) - return; + #endregion - _ipScanner_CustomDNSPort = value; - OnPropertyChanged(); - SettingsChanged = true; - } - } + #region Others - private bool _ipScanner_DNSRecursion = true; - public bool IPScanner_DNSRecursion + // Application view + + public bool ExpandApplicationView + { + get; + set { - get => _ipScanner_DNSRecursion; - set - { - if (value == _ipScanner_DNSRecursion) - return; + if (value == field) + return; - _ipScanner_DNSRecursion = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private bool _ipScanner_DNSUseCache; - public bool IPScanner_DNSUseCache - { - get => _ipScanner_DNSUseCache; - set - { - if (value == _ipScanner_DNSUseCache) - return; + #endregion - _ipScanner_DNSUseCache = value; - OnPropertyChanged(); - SettingsChanged = true; - } - } + #region Dashboard - private bool _ipScanner_DNSUseTCPOnly = GlobalStaticConfiguration.IPScanner_DNSUseTCPOnly; - public bool IPScanner_DNSUseTCPOnly + public string Dashboard_PublicIPv4Address + { + get; + set { - get => _ipScanner_DNSUseTCPOnly; - set - { - if (value == _ipScanner_DNSUseTCPOnly) - return; + if (value == field) + return; - _ipScanner_DNSUseTCPOnly = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Dashboard_PublicIPv4Address; - private int _ipScanner_DNSTimeout = GlobalStaticConfiguration.IPScanner_DNSTimeout; - public int IPScanner_DNSTimeout + public string Dashboard_PublicIPv6Address + { + get; + set { - get => _ipScanner_DNSTimeout; - set - { - if (value == _ipScanner_DNSTimeout) - return; + if (value == field) + return; - _ipScanner_DNSTimeout = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Dashboard_PublicIPv6Address; - private int _ipScanner_DNSRetries = GlobalStaticConfiguration.IPScanner_DNSRetries; - public int IPScanner_DNSRetries + public bool Dashboard_CheckPublicIPAddress + { + get; + set { - get => _ipScanner_DNSRetries; - set - { - if (value == _ipScanner_DNSRetries) - return; + if (value == field) + return; - _ipScanner_DNSRetries = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Dashboard_CheckPublicIPAddress; - private bool _ipScanner_DNSShowErrorMessage = GlobalStaticConfiguration.IPScanner_DNSShowErrorMessage; - public bool IPScanner_DNSShowErrorMessage + public bool Dashboard_UseCustomPublicIPv4AddressAPI + { + get; + set { - get => _ipScanner_DNSShowErrorMessage; - set - { - if (value == _ipScanner_DNSShowErrorMessage) - return; + if (value == field) + return; - _ipScanner_DNSShowErrorMessage = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private bool _ipScanner_ResolveMACAddress; - public bool IPScanner_ResolveMACAddress + public string Dashboard_CustomPublicIPv4AddressAPI + { + get; + set { - get => _ipScanner_ResolveMACAddress; - set - { - if (value == _ipScanner_ResolveMACAddress) - return; + if (value == field) + return; - _ipScanner_ResolveMACAddress = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private int _ipScanner_ICMPTimeout = GlobalStaticConfiguration.IPScanner_ICMPTimeout; - public int IPScanner_ICMPTimeout + public bool Dashboard_UseCustomPublicIPv6AddressAPI + { + get; + set { - get => _ipScanner_ICMPTimeout; - set - { - if (value == _ipScanner_ICMPTimeout) - return; + if (value == field) + return; - _ipScanner_ICMPTimeout = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private ObservableCollection _ipScanner_CustomCommands = new ObservableCollection(); - public ObservableCollection IPScanner_CustomCommands + public string Dashboard_CustomPublicIPv6AddressAPI + { + get; + set { - get => _ipScanner_CustomCommands; - set - { - if (value == _ipScanner_CustomCommands) - return; + if (value == field) + return; - _ipScanner_CustomCommands = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private bool _ipScanner_ExpandProfileView = true; - public bool IPScanner_ExpandProfileView + public bool Dashboard_CheckIPApiIPGeolocation + { + get; + set { - get => _ipScanner_ExpandProfileView; - set - { - if (value == _ipScanner_ExpandProfileView) - return; + if (value == field) + return; - _ipScanner_ExpandProfileView = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Dashboard_CheckIPApiIPGeolocation; - private double _ipScanner_ProfileWidth = GlobalStaticConfiguration.Profile_DefaultWidthExpanded; - public double IPScanner_ProfileWidth + public bool Dashboard_CheckIPApiDNSResolver + { + get; + set { - get => _ipScanner_ProfileWidth; - set - { - if (Math.Abs(value - _ipScanner_ProfileWidth) < GlobalStaticConfiguration.FloatPointFix) - return; + if (value == field) + return; - _ipScanner_ProfileWidth = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Dashboard_CheckIPApiDNSResolver; - private string _ipScanner_ExportFilePath; - public string IPScanner_ExportFilePath - { - get => _ipScanner_ExportFilePath; - set - { - if (value == _ipScanner_ExportFilePath) - return; + #endregion - _ipScanner_ExportFilePath = value; - OnPropertyChanged(); - SettingsChanged = true; - } - } + #region Network Interface - private ExportManager.ExportFileType _ipScanner_ExportFileType = GlobalStaticConfiguration.IPScanner_ExportFileType; - public ExportManager.ExportFileType IPScanner_ExportFileType + public string NetworkInterface_InterfaceId + { + get; + set { - get => _ipScanner_ExportFileType; - set - { - if (value == _ipScanner_ExportFileType) - return; + if (value == field) + return; - _ipScanner_ExportFileType = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } - #endregion + } - #region Port Scanner - private ObservableCollection _portScanner_HostsHistory = new ObservableCollection(); - public ObservableCollection PortScanner_HostsHistory + public string NetworkInterface_ExportFilePath + { + get; + set { - get => _portScanner_HostsHistory; - set - { - if (value == _portScanner_HostsHistory) - return; + if (value == field) + return; - _portScanner_HostsHistory = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private ObservableCollection _portScanner_PortsHistory = new ObservableCollection(); - public ObservableCollection PortScanner_PortsHistory + public ExportFileType NetworkInterface_ExportFileType + { + get; + set { - get => _portScanner_PortsHistory; - set - { - if (value == _portScanner_PortsHistory) - return; + if (value == field) + return; - _portScanner_PortsHistory = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.NetworkInterface_ExportFileType; - private ObservableCollection _portScanner_PortProfiles = new ObservableCollection(); - public ObservableCollection PortScanner_PortProfiles + /// + /// Gets or sets the bandwidth chart time window in seconds. + /// + public int NetworkInterface_BandwidthChartTime + { + get; + set { - get => _portScanner_PortProfiles; - set - { - if (value == _portScanner_PortProfiles) - return; + if (value == field) + return; - _portScanner_PortProfiles = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.NetworkInterface_BandwidthChartTime; - private bool _portScanner_ResolveHostname = true; - public bool PortScanner_ResolveHostname - { - get => _portScanner_ResolveHostname; - set - { - if (value == _portScanner_ResolveHostname) - return; + #endregion - _portScanner_ResolveHostname = value; - OnPropertyChanged(); - SettingsChanged = true; - } - } + #region WiFi - private int _portScanner_HostThreads = GlobalStaticConfiguration.PortScanner_HostThreads; - public int PortScanner_HostThreads + public string WiFi_InterfaceId + { + get; + set { - get => _portScanner_HostThreads; - set - { - if (value == _portScanner_HostThreads) - return; + if (value == field) + return; - _portScanner_HostThreads = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private int _portScanner_PortThreads = GlobalStaticConfiguration.PortScanner_PortThreds; - public int PortScanner_PortThreads + public bool WiFi_Show2dot4GHzNetworks + { + get; + set { - get => _portScanner_PortThreads; - set - { - if (value == _portScanner_PortThreads) - return; + if (value == field) + return; - _portScanner_PortThreads = value; - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.WiFi_Show2dot4GHzNetworks; - private bool _portScanner_ShowClosed; - public bool PortScanner_ShowClosed + public bool WiFi_Show5GHzNetworks + { + get; + set { - get => _portScanner_ShowClosed; - set - { - if (value == _portScanner_ShowClosed) - return; + if (value == field) + return; - _portScanner_ShowClosed = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.WiFi_Show5GHzNetworks; - private int _portScanner_Timeout = GlobalStaticConfiguration.PortScanner_Timeout; - public int PortScanner_Timeout + public bool WiFi_Show6GHzNetworks + { + get; + set { - get => _portScanner_Timeout; - set - { - if (value == _portScanner_Timeout) - return; + if (value == field) + return; - _portScanner_Timeout = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.WiFi_Show6GHzNetworks; - private bool _portScanner_ExpandProfileView = true; - public bool PortScanner_ExpandProfileView + public bool WiFi_AutoRefreshEnabled + { + get; + set { - get => _portScanner_ExpandProfileView; - set - { - if (value == _portScanner_ExpandProfileView) - return; + if (value == field) + return; - _portScanner_ExpandProfileView = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private double _portScanner_ProfileWidth = GlobalStaticConfiguration.Profile_DefaultWidthExpanded; - public double PortScanner_ProfileWidth + public AutoRefreshTimeInfo WiFi_AutoRefreshTime + { + get; + set { - get => _portScanner_ProfileWidth; - set - { - if (Math.Abs(value - _portScanner_ProfileWidth) < GlobalStaticConfiguration.FloatPointFix) - return; + if (value == field) + return; - _portScanner_ProfileWidth = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.WiFi_AutoRefreshTime; - private string _portScanner_ExportFilePath; - public string PortScanner_ExportFilePath + public string WiFi_ExportFilePath + { + get; + set { - get => _portScanner_ExportFilePath; - set - { - if (value == _portScanner_ExportFilePath) - return; + if (value == field) + return; - _portScanner_ExportFilePath = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private ExportManager.ExportFileType _portScanner_ExportFileType = GlobalStaticConfiguration.PortScanner_ExportFileType; - public ExportManager.ExportFileType PortScanner_ExportFileType + public ExportFileType WiFi_ExportFileType + { + get; + set { - get => _portScanner_ExportFileType; - set - { - if (value == _portScanner_ExportFileType) - return; + if (value == field) + return; - _portScanner_ExportFileType = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } - #endregion + } = GlobalStaticConfiguration.WiFi_ExportFileType; - #region Ping Monitor - private ObservableCollection _pingMonitor_HostHistory = new ObservableCollection(); - public ObservableCollection PingMonitor_HostHistory - { - get => _pingMonitor_HostHistory; - set - { - if (value == _pingMonitor_HostHistory) - return; + #endregion - _pingMonitor_HostHistory = value; - OnPropertyChanged(); - SettingsChanged = true; - } - } + #region IPScanner - private int _pingMonitor_Buffer = GlobalStaticConfiguration.PingMonitor_Buffer; - public int PingMonitor_Buffer + public bool IPScanner_ShowAllResults + { + get; + set { - get => _pingMonitor_Buffer; - set - { - if (value == _pingMonitor_Buffer) - return; + if (value == field) + return; - _pingMonitor_Buffer = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private bool _pingMonitor_DontFragement = true; - public bool PingMonitor_DontFragment + public int IPScanner_ICMPTimeout + { + get; + set { - get => _pingMonitor_DontFragement; - set - { - if (value == _pingMonitor_DontFragement) - return; + if (value == field) + return; - _pingMonitor_DontFragement = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.IPScanner_ICMPTimeout; - private int _pingMonitor_Timeout = GlobalStaticConfiguration.PingMonitor_Timeout; - public int PingMonitor_Timeout + public int IPScanner_ICMPAttempts + { + get; + set { - get => _pingMonitor_Timeout; - set - { - if (value == _pingMonitor_Timeout) - return; + if (value == field) + return; - _pingMonitor_Timeout = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.IPScanner_ICMPAttempts; - private int _pingMonitor_TTL = GlobalStaticConfiguration.PingMonitor_TTL; - public int PingMonitor_TTL + public int IPScanner_ICMPBuffer + { + get; + set { - get => _pingMonitor_TTL; - set - { - if (value == _pingMonitor_TTL) - return; + if (value == field) + return; - _pingMonitor_TTL = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.IPScanner_ICMPBuffer; - private int _pingMonitor_WaitTime = GlobalStaticConfiguration.PingMonitor_WaitTime; - public int PingMonitor_WaitTime + public ObservableCollection IPScanner_HostHistory + { + get; + set { - get => _pingMonitor_WaitTime; - set - { - if (value == _pingMonitor_WaitTime) - return; + if (value == field) + return; - _pingMonitor_WaitTime = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = []; - private bool _pingMonitor_ResolveHostnamePreferIPv4 = true; - public bool PingMonitor_ResolveHostnamePreferIPv4 + public bool IPScanner_ResolveHostname + { + get; + set { - get => _pingMonitor_ResolveHostnamePreferIPv4; - set - { - if (value == _pingMonitor_ResolveHostnamePreferIPv4) - return; + if (value == field) + return; - _pingMonitor_ResolveHostnamePreferIPv4 = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.IPScanner_ResolveHostname; - private string _pingMonitor_ExportFilePath; - public string PingMonitor_ExportFilePath + public bool IPScanner_PortScanEnabled + { + get; + set { - get => _pingMonitor_ExportFilePath; - set - { - if (value == _pingMonitor_ExportFilePath) - return; + if (value == IPScanner_PortScanEnabled) + return; - _pingMonitor_ExportFilePath = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.IPScanner_PortScanEnabled; - private ExportManager.ExportFileType _pingMonitor_ExportFileType = GlobalStaticConfiguration.PingMonitor_ExportFileType; - public ExportManager.ExportFileType PingMonitor_ExportFileType + public string IPScanner_PortScanPorts + { + get; + set { - get => _pingMonitor_ExportFileType; - set - { - if (value == _pingMonitor_ExportFileType) - return; + if (value == field) + return; - _pingMonitor_ExportFileType = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.IPScanner_PortScanPorts; - private bool _pingMonitor_ExpandProfileView = true; - public bool PingMonitor_ExpandProfileView + public int IPScanner_PortScanTimeout + { + get; + set { - get => _pingMonitor_ExpandProfileView; - set - { - if (value == _pingMonitor_ExpandProfileView) - return; + if (value == field) + return; - _pingMonitor_ExpandProfileView = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.IPScanner_PortScanTimeout; - private double _pingMonitor_ProfileWidth = GlobalStaticConfiguration.Profile_DefaultWidthExpanded; - public double PingMonitor_ProfileWidth + public bool IPScanner_NetBIOSEnabled + { + get; + set { - get => _pingMonitor_ProfileWidth; - set - { - if (Math.Abs(value - _pingMonitor_ProfileWidth) < GlobalStaticConfiguration.FloatPointFix) - return; + if (value == field) + return; - _pingMonitor_ProfileWidth = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } - #endregion + } = GlobalStaticConfiguration.IPScanner_NetBIOSEnabled; - #region Traceroute - private ObservableCollection _traceroute_HostHistory = new ObservableCollection(); - public ObservableCollection Traceroute_HostHistory + public int IPScanner_NetBIOSTimeout + { + get; + set { - get => _traceroute_HostHistory; - set - { - if (value == _traceroute_HostHistory) - return; + if (value == field) + return; - _traceroute_HostHistory = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.IPScanner_NetBIOSTimeout; - private int _traceroute_MaximumHops = GlobalStaticConfiguration.Traceroute_MaximumHops; - public int Traceroute_MaximumHops + public bool IPScanner_ResolveMACAddress + { + get; + set { - get => _traceroute_MaximumHops; - set - { - if (value == _traceroute_MaximumHops) - return; + if (value == field) + return; - _traceroute_MaximumHops = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private int _traceroute_Timeout = GlobalStaticConfiguration.Traceroute_Timeout; - public int Traceroute_Timeout + public ObservableCollection IPScanner_CustomCommands + { + get; + set { - get => _traceroute_Timeout; - set - { - if (value == _traceroute_Timeout) - return; + if (value == field) + return; - _traceroute_Timeout = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = []; - private int _traceroute_Buffer = GlobalStaticConfiguration.Traceroute_Buffer; - public int Traceroute_Buffer + public int IPScanner_MaxHostThreads + { + get; + set { - get => _traceroute_Buffer; - set - { - if (value == _traceroute_Buffer) - return; + if (value == field) + return; - _traceroute_Buffer = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.IPScanner_MaxHostThreads; - private bool _traceroute_ResolveHostname = true; - public bool Traceroute_ResolveHostname + public int IPScanner_MaxPortThreads + { + get; + set { - get => _traceroute_ResolveHostname; - set - { - if (value == _traceroute_ResolveHostname) - return; + if (value == field) + return; - _traceroute_ResolveHostname = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.IPScanner_MaxPortThreads; - private bool _traceroute_ResolveHostnamePreferIPv4 = true; - public bool Traceroute_ResolveHostnamePreferIPv4 + public string IPScanner_ExportFilePath + { + get; + set { - get => _traceroute_ResolveHostnamePreferIPv4; - set - { - if (value == _traceroute_ResolveHostnamePreferIPv4) - return; + if (value == field) + return; - _traceroute_ResolveHostnamePreferIPv4 = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private bool _traceroute_ExpandProfileView = true; - public bool Traceroute_ExpandProfileView + public ExportFileType IPScanner_ExportFileType + { + get; + set { - get => _traceroute_ExpandProfileView; - set - { - if (value == _traceroute_ExpandProfileView) - return; + if (value == field) + return; - _traceroute_ExpandProfileView = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.IPScanner_ExportFileType; - private double _traceroute_ProfileWidth = GlobalStaticConfiguration.Profile_DefaultWidthExpanded; - public double Traceroute_ProfileWidth - { - get => _traceroute_ProfileWidth; - set - { - if (Math.Abs(value - _traceroute_ProfileWidth) < GlobalStaticConfiguration.FloatPointFix) - return; + #endregion - _traceroute_ProfileWidth = value; - OnPropertyChanged(); - SettingsChanged = true; - } - } + #region Port Scanner - private string _traceroute_ExportFilePath; - public string Traceroute_ExportFilePath + public ObservableCollection PortScanner_HostHistory + { + get; + set { - get => _traceroute_ExportFilePath; - set - { - if (value == _traceroute_ExportFilePath) - return; + if (value == field) + return; - _traceroute_ExportFilePath = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = []; - private ExportManager.ExportFileType _traceroute_ExportFileType = GlobalStaticConfiguration.Traceroute_ExportFileType; - public ExportManager.ExportFileType Traceroute_ExportFileType + public ObservableCollection PortScanner_PortHistory + { + get; + set { - get => _traceroute_ExportFileType; - set - { - if (value == _traceroute_ExportFileType) - return; + if (value == field) + return; - _traceroute_ExportFileType = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } - #endregion + } = []; - #region DNS Lookup - private ObservableCollection _dnsLookup_HostHistory = new ObservableCollection(); - public ObservableCollection DNSLookup_HostHistory + public ObservableCollection PortScanner_PortProfiles + { + get; + set { - get => _dnsLookup_HostHistory; - set - { - if (value == _dnsLookup_HostHistory) - return; + if (value == field) + return; - _dnsLookup_HostHistory = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = []; - private ObservableCollection _dnsLookup_DNSServers = new ObservableCollection(); - public ObservableCollection DNSLookup_DNSServers + public bool PortScanner_ResolveHostname + { + get; + set { - get => _dnsLookup_DNSServers; - set - { - if (value == _dnsLookup_DNSServers) - return; + if (value == field) + return; - _dnsLookup_DNSServers = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = true; - private DNSServerInfo _dnsLookup_SelectedDNSServer = new DNSServerInfo(); - public DNSServerInfo DNSLookup_SelectedDNSServer + public bool PortScanner_ShowAllResults + { + get; + set { - get => _dnsLookup_SelectedDNSServer; - set - { - if (value == _dnsLookup_SelectedDNSServer) - return; + if (value == field) + return; - _dnsLookup_SelectedDNSServer = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private QueryClass _dnsLookup_QueryClass = GlobalStaticConfiguration.DNSLookup_QueryClass; - public QueryClass DNSLookup_QueryClass + public int PortScanner_Timeout + { + get; + set { - get => _dnsLookup_QueryClass; - set - { - if (value == _dnsLookup_QueryClass) - return; + if (value == field) + return; - _dnsLookup_QueryClass = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.PortScanner_Timeout; - private bool _dnsLookup_ShowOnlyMostCommonQueryTypes = true; - public bool DNSLookup_ShowOnlyMostCommonQueryTypes + public int PortScanner_MaxHostThreads + { + get; + set { - get => _dnsLookup_ShowOnlyMostCommonQueryTypes; - set - { - if (value == _dnsLookup_ShowOnlyMostCommonQueryTypes) - return; + if (value == field) + return; - _dnsLookup_ShowOnlyMostCommonQueryTypes = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.PortScanner_MaxHostThreads; - private QueryType _dnsLookup_QueryType = GlobalStaticConfiguration.DNSLookup_QueryType; - public QueryType DNSLookup_QueryType + public int PortScanner_MaxPortThreads + { + get; + set { - get => _dnsLookup_QueryType; - set - { - if (value == _dnsLookup_QueryType) - return; + if (value == field) + return; - _dnsLookup_QueryType = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.PortScanner_MaxPortThreads; - private bool _dnsLookup_AddDNSSuffix = true; - public bool DNSLookup_AddDNSSuffix + public string PortScanner_ExportFilePath + { + get; + set { - get => _dnsLookup_AddDNSSuffix; - set - { - if (value == _dnsLookup_AddDNSSuffix) - return; + if (value == field) + return; - _dnsLookup_AddDNSSuffix = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private bool _dnsLookup_UseCustomDNSSuffix; - public bool DNSLookup_UseCustomDNSSuffix + public ExportFileType PortScanner_ExportFileType + { + get; + set { - get => _dnsLookup_UseCustomDNSSuffix; - set - { - if (value == _dnsLookup_UseCustomDNSSuffix) - return; + if (value == field) + return; - _dnsLookup_UseCustomDNSSuffix = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.PortScanner_ExportFileType; - private string _dnsLookup_CustomDNSSuffix = string.Empty; - public string DNSLookup_CustomDNSSuffix - { - get => _dnsLookup_CustomDNSSuffix; - set - { - if (value == _dnsLookup_CustomDNSSuffix) - return; + #endregion - _dnsLookup_CustomDNSSuffix = value; - OnPropertyChanged(); - SettingsChanged = true; - } - } + #region Ping Monitor - private bool _dnsLookup_Recursion = true; - public bool DNSLookup_Recursion + public ObservableCollection PingMonitor_HostHistory + { + get; + set { - get => _dnsLookup_Recursion; - set - { - if (value == _dnsLookup_Recursion) - return; + if (value == field) + return; - _dnsLookup_Recursion = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = []; - private bool _dnsLookup_UseCache; - public bool DNSLookup_UseCache + public int PingMonitor_Buffer + { + get; + set { - get => _dnsLookup_UseCache; - set - { - if (value == _dnsLookup_UseCache) - return; + if (value == field) + return; - _dnsLookup_UseCache = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.PingMonitor_Buffer; - private bool _dnsLookup_UseTCPOnly = GlobalStaticConfiguration.DNSLookup_UseTCPOnly; - public bool DNSLookup_UseTCPOnly + public bool PingMonitor_DontFragment + { + get; + set { - get => _dnsLookup_UseTCPOnly; - set - { - if (value == _dnsLookup_UseTCPOnly) - return; + if (value == field) + return; - _dnsLookup_UseTCPOnly = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.PingMonitor_DontFragment; - private int _dnsLookup_Retries = GlobalStaticConfiguration.DNSLookup_Retries; - public int DNSLookup_Retries + public int PingMonitor_Timeout + { + get; + set { - get => _dnsLookup_Retries; - set - { - if (value == _dnsLookup_Retries) - return; + if (value == field) + return; - _dnsLookup_Retries = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.PingMonitor_Timeout; - private int _dnsLookup_Timeout = GlobalStaticConfiguration.DNSLookup_Timeout; - public int DNSLookup_Timeout + public int PingMonitor_TTL + { + get; + set { - get => _dnsLookup_Timeout; - set - { - if (value == _dnsLookup_Timeout) - return; + if (value == field) + return; - _dnsLookup_Timeout = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.PingMonitor_TTL; - private bool _dnsLookup_ExpandProfileView = true; - public bool DNSLookup_ExpandProfileView + public int PingMonitor_WaitTime + { + get; + set { - get => _dnsLookup_ExpandProfileView; - set - { - if (value == _dnsLookup_ExpandProfileView) - return; + if (value == field) + return; - _dnsLookup_ExpandProfileView = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.PingMonitor_WaitTime; - private double _dnsLookup_ProfileWidth = GlobalStaticConfiguration.Profile_DefaultWidthExpanded; - public double DNSLookup_ProfileWidth + public bool PingMonitor_ExpandHostView + { + get; + set { - get => _dnsLookup_ProfileWidth; - set - { - if (Math.Abs(value - _dnsLookup_ProfileWidth) < GlobalStaticConfiguration.FloatPointFix) - return; + if (value == field) + return; - _dnsLookup_ProfileWidth = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.PingMonitor_ExpandHostView; - private string _dnsLookup_ExportFilePath; - public string DNSLookup_ExportFilePath + public int PingMonitor_ChartTime + { + get; + set { - get => _dnsLookup_ExportFilePath; - set - { - if (value == _dnsLookup_ExportFilePath) - return; + if (value == field) + return; - _dnsLookup_ExportFilePath = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.PingMonitor_ChartTime; - private ExportManager.ExportFileType _dnsLookup_ExportFileType = GlobalStaticConfiguration.DNSLookup_ExportFileType; - public ExportManager.ExportFileType DNSLookup_ExportFileType + public bool PingMonitor_ShowNotificationPopup + { + get; + set { - get => _dnsLookup_ExportFileType; - set - { - if (value == _dnsLookup_ExportFileType) - return; + if (value == field) + return; - _dnsLookup_ExportFileType = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } - #endregion + } = GlobalStaticConfiguration.PingMonitor_ShowNotificationPopup; - #region Remote Desktop - private ObservableCollection _remoteDesktop_HostHistory = new ObservableCollection(); - public ObservableCollection RemoteDesktop_HostHistory + public bool PingMonitor_NotificationSound + { + get; + set { - get => _remoteDesktop_HostHistory; - set - { - if (value == _remoteDesktop_HostHistory) - return; + if (value == field) + return; - _remoteDesktop_HostHistory = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.PingMonitor_NotificationSound; - private bool _remoteDesktop_AdjustScreenAutomatically; - public bool RemoteDesktop_AdjustScreenAutomatically + public int PingMonitor_NotificationSuccessThreshold + { + get; + set { - get => _remoteDesktop_AdjustScreenAutomatically; - set - { - if (value == _remoteDesktop_AdjustScreenAutomatically) - return; + if (value == field) + return; - _remoteDesktop_AdjustScreenAutomatically = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.PingMonitor_NotificationSuccessThreshold; - private bool _remoteDesktop_UseCurrentViewSize = GlobalStaticConfiguration.RemoteDesktop_UseCurrentViewSize; - public bool RemoteDesktop_UseCurrentViewSize + public int PingMonitor_NotificationFailureThreshold + { + get; + set { - get => _remoteDesktop_UseCurrentViewSize; - set - { - if (value == _remoteDesktop_UseCurrentViewSize) - return; + if (value == field) + return; - _remoteDesktop_UseCurrentViewSize = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.PingMonitor_NotificationFailureThreshold; - private bool _remoteDesktop_UseFixedScreenSize; - public bool RemoteDesktop_UseFixedScreenSize + public int PingMonitor_NotificationCloseTime + { + get; + set { - get => _remoteDesktop_UseFixedScreenSize; - set - { - if (value == _remoteDesktop_UseFixedScreenSize) - return; + if (value == field) + return; - _remoteDesktop_UseFixedScreenSize = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.PingMonitor_NotificationCloseTime; - private int _remoteDesktop_ScreenWidth = GlobalStaticConfiguration.RemoteDesktop_ScreenWidth; - public int RemoteDesktop_ScreenWidth + public string PingMonitor_ExportFilePath + { + get; + set { - get => _remoteDesktop_ScreenWidth; - set - { - if (value == _remoteDesktop_ScreenWidth) - return; + if (value == field) + return; - _remoteDesktop_ScreenWidth = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private int _remoteDesktop_ScreenHeight = GlobalStaticConfiguration.RemoteDesktop_ScreenHeight; - public int RemoteDesktop_ScreenHeight + public ExportFileType PingMonitor_ExportFileType + { + get; + set { - get => _remoteDesktop_ScreenHeight; - set - { - if (value == _remoteDesktop_ScreenHeight) - return; + if (value == field) + return; - _remoteDesktop_ScreenHeight = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.PingMonitor_ExportFileType; - private bool _remoteDesktop_UseCustomScreenSize; - public bool RemoteDesktop_UseCustomScreenSize - { - get => _remoteDesktop_UseCustomScreenSize; - set - { - if (value == _remoteDesktop_UseCustomScreenSize) - return; + #endregion - _remoteDesktop_UseCustomScreenSize = value; - OnPropertyChanged(); - SettingsChanged = true; - } - } + #region Traceroute - private int _remoteDesktop_CustomScreenWidth; - public int RemoteDesktop_CustomScreenWidth + public ObservableCollection Traceroute_HostHistory + { + get; + set { - get => _remoteDesktop_CustomScreenWidth; - set - { - if (value == _remoteDesktop_CustomScreenWidth) - return; + if (value == field) + return; - _remoteDesktop_CustomScreenWidth = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = []; - private int _remoteDesktop_CustomScreenHeight; - public int RemoteDesktop_CustomScreenHeight + public int Traceroute_MaximumHops + { + get; + set { - get => _remoteDesktop_CustomScreenHeight; - set - { - if (value == _remoteDesktop_CustomScreenHeight) - return; + if (value == field) + return; - _remoteDesktop_CustomScreenHeight = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Traceroute_MaximumHops; - private int _remoteDesktop_ColorDepth = GlobalStaticConfiguration.RemoteDesktop_ColorDepth; - public int RemoteDesktop_ColorDepth + public int Traceroute_Timeout + { + get; + set { - get => _remoteDesktop_ColorDepth; - set - { - if (value == _remoteDesktop_ColorDepth) - return; + if (value == field) + return; - _remoteDesktop_ColorDepth = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Traceroute_Timeout; - private int _remoteDesktop_Port = GlobalStaticConfiguration.RemoteDesktop_Port; - public int RemoteDesktop_Port + public int Traceroute_Buffer + { + get; + set { - get => _remoteDesktop_Port; - set - { - if (value == _remoteDesktop_Port) - return; + if (value == field) + return; - _remoteDesktop_Port = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Traceroute_Buffer; - private bool _remoteDesktop_EnableCredSspSupport = true; - public bool RemoteDesktop_EnableCredSspSupport + public bool Traceroute_ResolveHostname + { + get; + set { - get => _remoteDesktop_EnableCredSspSupport; - set - { - if (value == _remoteDesktop_EnableCredSspSupport) - return; + if (value == field) + return; - _remoteDesktop_EnableCredSspSupport = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Traceroute_ResolveHostname; - private uint _remoteDesktop_AuthenticationLevel = GlobalStaticConfiguration.RemoteDesktop_AuthenticationLevel; - public uint RemoteDesktop_AuthenticationLevel + public bool Traceroute_CheckIPApiIPGeolocation + { + get; + set { - get => _remoteDesktop_AuthenticationLevel; - set - { - if (value == _remoteDesktop_AuthenticationLevel) - return; + if (value == field) + return; - _remoteDesktop_AuthenticationLevel = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Traceroute_CheckIPApiIPGeolocation; - private AudioRedirectionMode _remoteDesktop_AudioRedirectionMode = GlobalStaticConfiguration.RemoteDesktop_AudioRedirectionMode; - public AudioRedirectionMode RemoteDesktop_AudioRedirectionMode + public bool Traceroute_ShowMap + { + get; + set { - get => _remoteDesktop_AudioRedirectionMode; - set - { - if (value == _remoteDesktop_AudioRedirectionMode) - return; + if (value == field) + return; - _remoteDesktop_AudioRedirectionMode = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Traceroute_ShowMap; - private AudioCaptureRedirectionMode _remoteDesktop_AudioCaptureRedirectionMode = GlobalStaticConfiguration.RemoteDesktop_AudioCaptureRedirectionMode; - public AudioCaptureRedirectionMode RemoteDesktop_AudioCaptureRedirectionMode + public bool Traceroute_ExpandMapView + { + get; + set { - get => _remoteDesktop_AudioCaptureRedirectionMode; - set - { - if (value == _remoteDesktop_AudioCaptureRedirectionMode) - return; + if (value == field) + return; - _remoteDesktop_AudioCaptureRedirectionMode = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Traceroute_ExpandMapView; - private KeyboardHookMode _remoteDesktop_KeyboardHookMode = GlobalStaticConfiguration.RemoteDesktop_KeyboardHookMode; - public KeyboardHookMode RemoteDesktop_KeyboardHookMode + public double Traceroute_MapHeight + { + get; + set { - get => _remoteDesktop_KeyboardHookMode; - set - { - if (value == _remoteDesktop_KeyboardHookMode) - return; + if (Math.Abs(value - field) < GlobalStaticConfiguration.FloatPointFix) + return; - _remoteDesktop_KeyboardHookMode = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Traceroute_MapHeight; - private bool _remoteDesktop_RedirectClipboard = true; - public bool RemoteDesktop_RedirectClipboard + public string Traceroute_ExportFilePath + { + get; + set { - get => _remoteDesktop_RedirectClipboard; - set - { - if (value == _remoteDesktop_RedirectClipboard) - return; + if (value == field) + return; - _remoteDesktop_RedirectClipboard = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_RedirectDevices; - public bool RemoteDesktop_RedirectDevices + public ExportFileType Traceroute_ExportFileType + { + get; + set { - get => _remoteDesktop_RedirectDevices; - set - { - if (value == _remoteDesktop_RedirectDevices) - return; + if (value == field) + return; - _remoteDesktop_RedirectDevices = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.Traceroute_ExportFileType; - private bool _remoteDesktop_RedirectDrives; - public bool RemoteDesktop_RedirectDrives - { - get => _remoteDesktop_RedirectDrives; - set - { - if (value == _remoteDesktop_RedirectDrives) - return; + #endregion - _remoteDesktop_RedirectDrives = value; - OnPropertyChanged(); - SettingsChanged = true; - } - } + #region DNS Lookup - private bool _remoteDesktop_RedirectPorts; - public bool RemoteDesktop_RedirectPorts + public ObservableCollection DNSLookup_HostHistory + { + get; + set { - get => _remoteDesktop_RedirectPorts; - set - { - if (value == _remoteDesktop_RedirectPorts) - return; + if (value == field) + return; - _remoteDesktop_RedirectPorts = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = []; - private bool _remoteDesktop_RedirectSmartCards; - public bool RemoteDesktop_RedirectSmartCards + public ObservableCollection DNSLookup_DNSServers + { + get; + set { - get => _remoteDesktop_RedirectSmartCards; - set - { - if (value == _remoteDesktop_RedirectSmartCards) - return; + if (value == field) + return; - _remoteDesktop_RedirectSmartCards = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = []; - private bool _remoteDesktop_RedirectPrinters; - public bool RemoteDesktop_RedirectPrinters + [Obsolete("Use DNSLookup_SelectedDNSServer_v2 instead.")] + [field: Obsolete("Use DNSLookup_SelectedDNSServer_v2 instead.")] + public DNSServerConnectionInfoProfile DNSLookup_SelectedDNSServer + { + get; + set { - get => _remoteDesktop_RedirectPrinters; - set - { - if (value == _remoteDesktop_RedirectPrinters) - return; + if (value == field) + return; - _remoteDesktop_RedirectPrinters = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = null; - private bool _remoteDesktop_PersistentBitmapCaching; - public bool RemoteDesktop_PersistentBitmapCaching + public string DNSLookup_SelectedDNSServer_v2 + { + get; + set { - get => _remoteDesktop_PersistentBitmapCaching; - set - { - if (value == _remoteDesktop_PersistentBitmapCaching) - return; + if (value == field) + return; - _remoteDesktop_PersistentBitmapCaching = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_ReconnectIfTheConnectionIsDropped; - public bool RemoteDesktop_ReconnectIfTheConnectionIsDropped + public QueryClass DNSLookup_QueryClass + { + get; + set { - get => _remoteDesktop_ReconnectIfTheConnectionIsDropped; - set - { - if (value == _remoteDesktop_ReconnectIfTheConnectionIsDropped) - return; + if (value == field) + return; - _remoteDesktop_ReconnectIfTheConnectionIsDropped = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.DNSLookup_QueryClass; - private NetworkConnectionType _remoteDesktop_NetworkConnectionType = GlobalStaticConfiguration.RemoteDesktop_NetworkConnectionType; - public NetworkConnectionType RemoteDesktop_NetworkConnectionType + public QueryType DNSLookup_QueryType + { + get; + set { - get => _remoteDesktop_NetworkConnectionType; - set - { - if (value == _remoteDesktop_NetworkConnectionType) - return; + if (value == field) + return; - _remoteDesktop_NetworkConnectionType = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.DNSLookup_QueryType; - private bool _remoteDesktop_DesktopBackground; - public bool RemoteDesktop_DesktopBackground + public bool DNSLookup_AddDNSSuffix + { + get; + set { - get => _remoteDesktop_DesktopBackground; - set - { - if (value == _remoteDesktop_DesktopBackground) - return; + if (value == field) + return; - _remoteDesktop_DesktopBackground = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = true; - private bool _remoteDesktop_FontSmoothing; - public bool RemoteDesktop_FontSmoothing + public bool DNSLookup_UseCustomDNSSuffix + { + get; + set { - get => _remoteDesktop_FontSmoothing; - set - { - if (value == _remoteDesktop_FontSmoothing) - return; + if (value == field) + return; - _remoteDesktop_FontSmoothing = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_DesktopComposition; - public bool RemoteDesktop_DesktopComposition + public string DNSLookup_CustomDNSSuffix + { + get; + set { - get => _remoteDesktop_DesktopComposition; - set - { - if (value == _remoteDesktop_DesktopComposition) - return; + if (value == field) + return; - _remoteDesktop_DesktopComposition = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_ShowWindowContentsWhileDragging; - public bool RemoteDesktop_ShowWindowContentsWhileDragging + public bool DNSLookup_Recursion + { + get; + set { - get => _remoteDesktop_ShowWindowContentsWhileDragging; - set - { - if (value == _remoteDesktop_ShowWindowContentsWhileDragging) - return; + if (value == field) + return; - _remoteDesktop_ShowWindowContentsWhileDragging = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = true; - private bool _remoteDesktop_MenuAndWindowAnimation; - public bool RemoteDesktop_MenuAndWindowAnimation + public bool DNSLookup_UseCache + { + get; + set { - get => _remoteDesktop_MenuAndWindowAnimation; - set - { - if (value == _remoteDesktop_MenuAndWindowAnimation) - return; + if (value == field) + return; - _remoteDesktop_MenuAndWindowAnimation = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_VisualStyles; - public bool RemoteDesktop_VisualStyles + public bool DNSLookup_UseTCPOnly + { + get; + set { - get => _remoteDesktop_VisualStyles; - set - { - if (value == _remoteDesktop_VisualStyles) - return; + if (value == field) + return; - _remoteDesktop_VisualStyles = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.DNSLookup_UseTCPOnly; - private bool _remoteDesktop_ExpandProfileView = true; - public bool RemoteDesktop_ExpandProfileView + public int DNSLookup_Retries + { + get; + set { - get => _remoteDesktop_ExpandProfileView; - set - { - if (value == _remoteDesktop_ExpandProfileView) - return; + if (value == field) + return; - _remoteDesktop_ExpandProfileView = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.DNSLookup_Retries; - private double _remoteDesktop_ProfileWidth = GlobalStaticConfiguration.Profile_DefaultWidthExpanded; - public double RemoteDesktop_ProfileWidth + public int DNSLookup_Timeout + { + get; + set { - get => _remoteDesktop_ProfileWidth; - set - { - if (Math.Abs(value - _remoteDesktop_ProfileWidth) < GlobalStaticConfiguration.FloatPointFix) - return; + if (value == field) + return; - _remoteDesktop_ProfileWidth = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } - #endregion + } = GlobalStaticConfiguration.DNSLookup_Timeout; - #region PowerShell - private ObservableCollection _powerShell_HostHistory = new ObservableCollection(); - public ObservableCollection PowerShell_HostHistory + public string DNSLookup_ExportFilePath + { + get; + set { - get => _powerShell_HostHistory; - set - { - if (value == _powerShell_HostHistory) - return; + if (value == field) + return; - _powerShell_HostHistory = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private string _powerShell_ApplicationFilePath = GlobalStaticConfiguration.PowerShell_ApplicationFileLocationPowerShell; - public string PowerShell_ApplicationFilePath + public ExportFileType DNSLookup_ExportFileType + { + get; + set { - get => _powerShell_ApplicationFilePath; - set - { - if (value == _powerShell_ApplicationFilePath) - return; + if (value == field) + return; - _powerShell_ApplicationFilePath = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.DNSLookup_ExportFileType; - private string _powerShell_AdditionalCommandLine; - public string PowerShell_AdditionalCommandLine - { - get => _powerShell_AdditionalCommandLine; - set - { - if (value == _powerShell_AdditionalCommandLine) - return; + #endregion - _powerShell_AdditionalCommandLine = value; - OnPropertyChanged(); - SettingsChanged = true; - } - } + #region Remote Desktop - private Models.PowerShell.PowerShell.ExecutionPolicy _powerShell_ExecutionPolicy = GlobalStaticConfiguration.PowerShell_ExecutionPolicy; - public Models.PowerShell.PowerShell.ExecutionPolicy PowerShell_ExecutionPolicy + public ObservableCollection RemoteDesktop_HostHistory + { + get; + set { - get => _powerShell_ExecutionPolicy; - set - { - if (value == _powerShell_ExecutionPolicy) - return; + if (value == field) + return; - _powerShell_ExecutionPolicy = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = []; - private bool _powerShell_ExpandProfileView = true; - public bool PowerShell_ExpandProfileView + public bool RemoteDesktop_AdjustScreenAutomatically + { + get; + set { - get => _powerShell_ExpandProfileView; - set - { - if (value == _powerShell_ExpandProfileView) - return; + if (value == field) + return; - _powerShell_ExpandProfileView = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private double _powerShell_ProfileWidth = GlobalStaticConfiguration.Profile_DefaultWidthExpanded; - public double PowerShell_ProfileWidth + public bool RemoteDesktop_UseCurrentViewSize + { + get; + set { - get => _powerShell_ProfileWidth; - set - { - if (Math.Abs(value - _powerShell_ProfileWidth) < GlobalStaticConfiguration.FloatPointFix) - return; + if (value == field) + return; - _powerShell_ProfileWidth = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } - #endregion + } = GlobalStaticConfiguration.RemoteDesktop_UseCurrentViewSize; - #region PuTTY - private ObservableCollection _puTTY_HostHistory = new ObservableCollection(); - public ObservableCollection PuTTY_HostHistory + public bool RemoteDesktop_UseFixedScreenSize + { + get; + set { - get => _puTTY_HostHistory; - set - { - if (value == _puTTY_HostHistory) - return; + if (value == field) + return; - _puTTY_HostHistory = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private ConnectionMode _puTTY_DefaultConnectionMode = GlobalStaticConfiguration.PuTTY_DefaultConnectionMode; - public ConnectionMode PuTTY_DefaultConnectionMode + public int RemoteDesktop_ScreenWidth + { + get; + set { - get => _puTTY_DefaultConnectionMode; - set - { - if (value == _puTTY_DefaultConnectionMode) - return; + if (value == field) + return; - _puTTY_DefaultConnectionMode = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.RemoteDesktop_ScreenWidth; - private string _puTTY_Username; - public string PuTTY_Username + public int RemoteDesktop_ScreenHeight + { + get; + set { - get => _puTTY_Username; - set - { - if (value == _puTTY_Username) - return; + if (value == field) + return; - _puTTY_Username = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.RemoteDesktop_ScreenHeight; - private string _puTTY_PrivateKeyFile; - public string PuTTY_PrivateKeyFile + public bool RemoteDesktop_UseCustomScreenSize + { + get; + set { - get => _puTTY_PrivateKeyFile; - set - { - if (value == _puTTY_PrivateKeyFile) - return; + if (value == field) + return; - _puTTY_PrivateKeyFile = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private string _puTTY_Profile = GlobalStaticConfiguration.PuTTY_DefaultProfile; - public string PuTTY_Profile + public int RemoteDesktop_CustomScreenWidth + { + get; + set { - get => _puTTY_Profile; - set - { - if (value == _puTTY_Profile) - return; + if (value == field) + return; - _puTTY_Profile = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private bool _puTTY_EnableSessionLog; - public bool PuTTY_EnableSessionLog + public int RemoteDesktop_CustomScreenHeight + { + get; + set { - get => _puTTY_EnableSessionLog; - set - { - if (value == _puTTY_EnableSessionLog) - return; + if (value == field) + return; - _puTTY_EnableSessionLog = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private LogMode _puTTY_LogMode = GlobalStaticConfiguration.PuTTY_LogMode; - public LogMode PuTTY_LogMode + public int RemoteDesktop_ColorDepth + { + get; + set { - get => _puTTY_LogMode; - set - { - if (value == _puTTY_LogMode) - return; + if (value == field) + return; - _puTTY_LogMode = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.RemoteDesktop_ColorDepth; - private string _puTTY_LogPath = GlobalStaticConfiguration.PuTTY_LogPath; - public string PuTTY_LogPath + public int RemoteDesktop_Port + { + get; + set { - get => _puTTY_LogPath; - set - { - if (value == _puTTY_LogPath) - return; + if (value == field) + return; - _puTTY_LogPath = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.RemoteDesktop_Port; - private string _puTTY_LogFileName = GlobalStaticConfiguration.PuTTY_LogFileName; - public string PuTTY_LogFileName + public bool RemoteDesktop_ViewOnly + { + get; + set { - get => _puTTY_LogFileName; - set - { - if (value == _puTTY_LogFileName) - return; + if (value == field) + return; - _puTTY_LogFileName = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.RemoteDesktop_ViewOnly; - private string _puTTY_AdditionalCommandLine; - public string PuTTY_AdditionalCommandLine + public bool RemoteDesktop_EnableCredSspSupport + { + get; + set { - get => _puTTY_AdditionalCommandLine; - set - { - if (value == _puTTY_AdditionalCommandLine) - return; + if (value == field) + return; - _puTTY_AdditionalCommandLine = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.RemoteDesktop_EnableCredSspSupport; - private ObservableCollection _puTTY_SerialLineHistory = new ObservableCollection(); - public ObservableCollection PuTTY_SerialLineHistory + public uint RemoteDesktop_AuthenticationLevel + { + get; + set { - get => _puTTY_SerialLineHistory; - set - { - if (value == _puTTY_SerialLineHistory) - return; + if (value == field) + return; - _puTTY_SerialLineHistory = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.RemoteDesktop_AuthenticationLevel; - private ObservableCollection _puTTY_PortHistory = new ObservableCollection(); - public ObservableCollection PuTTY_PortHistory + public bool RemoteDesktop_EnableGatewayServer + { + get; + set { - get => _puTTY_PortHistory; - set - { - if (value == _puTTY_PortHistory) - return; + if (value == field) + return; - _puTTY_PortHistory = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private ObservableCollection _puTTY_BaudHistory = new ObservableCollection(); - public ObservableCollection PuTTY_BaudHistory + public string RemoteDesktop_GatewayServerHostname + { + get; + set { - get => _puTTY_BaudHistory; - set - { - if (value == _puTTY_BaudHistory) - return; + if (value == field) + return; - _puTTY_BaudHistory = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private ObservableCollection _puTTY_UsernameHistory = new ObservableCollection(); - public ObservableCollection PuTTY_UsernameHistory + public bool RemoteDesktop_GatewayServerBypassLocalAddresses + { + get; + set { - get => _puTTY_UsernameHistory; - set - { - if (value == _puTTY_UsernameHistory) - return; + if (value == field) + return; - _puTTY_UsernameHistory = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.RemoteDesktop_GatewayServerBypassLocalAddresses; - private ObservableCollection _puTTY_PrivateKeyFileHistory = new ObservableCollection(); - public ObservableCollection PuTTY_PrivateKeyFileHistory + public GatewayUserSelectedCredsSource RemoteDesktop_GatewayServerLogonMethod + { + get; + set { - get => _puTTY_PrivateKeyFileHistory; - set - { - if (value == _puTTY_PrivateKeyFileHistory) - return; + if (value == field) + return; - _puTTY_PrivateKeyFileHistory = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.RemoteDesktop_GatewayServerLogonMethod; - private ObservableCollection _puTTY_ProfileHistory = new ObservableCollection(); - public ObservableCollection PuTTY_ProfileHistory + public bool RemoteDesktop_GatewayServerShareCredentialsWithRemoteComputer + { + get; + set { - get => _puTTY_ProfileHistory; - set - { - if (value == _puTTY_ProfileHistory) - return; + if (value == field) + return; - _puTTY_ProfileHistory = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.RemoteDesktop_GatewayServerShareCredentialsWithRemoteComputer; - private bool _puTTY_ExpandProfileView = true; - public bool PuTTY_ExpandProfileView + public AudioRedirectionMode RemoteDesktop_AudioRedirectionMode + { + get; + set { - get => _puTTY_ExpandProfileView; - set - { - if (value == _puTTY_ExpandProfileView) - return; + if (value == field) + return; - _puTTY_ExpandProfileView = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.RemoteDesktop_AudioRedirectionMode; - private double _puTTY_ProfileWidth = GlobalStaticConfiguration.Profile_DefaultWidthExpanded; - public double PuTTY_ProfileWidth + public AudioCaptureRedirectionMode RemoteDesktop_AudioCaptureRedirectionMode + { + get; + set { - get => _puTTY_ProfileWidth; - set - { - if (Math.Abs(value - _puTTY_ProfileWidth) < GlobalStaticConfiguration.FloatPointFix) - return; + if (value == field) + return; - _puTTY_ProfileWidth = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.RemoteDesktop_AudioCaptureRedirectionMode; - private string _puTTY_ApplicationFilePath; - public string PuTTY_ApplicationFilePath + public KeyboardHookMode RemoteDesktop_KeyboardHookMode + { + get; + set { - get => _puTTY_ApplicationFilePath; - set - { - if (value == _puTTY_ApplicationFilePath) - return; + if (value == field) + return; - _puTTY_ApplicationFilePath = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.RemoteDesktop_KeyboardHookMode; - private string _puTTY_SerialLine = GlobalStaticConfiguration.PuTTY_SerialLine; - public string PuTTY_SerialLine + public bool RemoteDesktop_RedirectClipboard + { + get; + set { - get => _puTTY_SerialLine; - set - { - if (value == _puTTY_SerialLine) - return; + if (value == field) + return; - _puTTY_SerialLine = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.RemoteDesktop_RedirectClipboard; - private int _puTTY_SSHPort = GlobalStaticConfiguration.PuTTY_SSHPort; - public int PuTTY_SSHPort + public bool RemoteDesktop_RedirectDevices + { + get; + set { - get => _puTTY_SSHPort; - set - { - if (value == _puTTY_SSHPort) - return; + if (value == field) + return; - _puTTY_SSHPort = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private int _puTTY_TelnetPort = GlobalStaticConfiguration.PuTTY_TelnetPort; - public int PuTTY_TelnetPort + public bool RemoteDesktop_RedirectDrives + { + get; + set { - get => _puTTY_TelnetPort; - set - { - if (value == _puTTY_TelnetPort) - return; + if (value == field) + return; - _puTTY_TelnetPort = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private int _puTTY_RloginPort = GlobalStaticConfiguration.PuTTY_RloginPort; - public int PuTTY_RloginPort + public bool RemoteDesktop_RedirectPorts + { + get; + set { - get => _puTTY_RloginPort; - set - { - if (value == _puTTY_RloginPort) - return; + if (value == field) + return; - _puTTY_RloginPort = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private int _puTTY_BaudRate = GlobalStaticConfiguration.PuTTY_BaudRate; - public int PuTTY_BaudRate + public bool RemoteDesktop_RedirectSmartCards + { + get; + set { - get => _puTTY_BaudRate; - set - { - if (value == _puTTY_BaudRate) - return; + if (value == field) + return; - _puTTY_BaudRate = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private int _puTTY_DefaultRaw = GlobalStaticConfiguration.PuTTY_Raw; - public int PuTTY_DefaultRaw + public bool RemoteDesktop_RedirectPrinters + { + get; + set { - get => _puTTY_DefaultRaw; - set - { - if (value == _puTTY_DefaultRaw) - return; + if (value == field) + return; - _puTTY_DefaultRaw = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } - #endregion + } - #region TigerVNC - private ObservableCollection _tigerVNC_HostHistory = new ObservableCollection(); - public ObservableCollection TigerVNC_HostHistory + public bool RemoteDesktop_PersistentBitmapCaching + { + get; + set { - get => _tigerVNC_HostHistory; - set - { - if (value == _tigerVNC_HostHistory) - return; + if (value == field) + return; - _tigerVNC_HostHistory = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private ObservableCollection _tigerVNC_PortHistory = new ObservableCollection(); - public ObservableCollection TigerVNC_PortHistory + public bool RemoteDesktop_ReconnectIfTheConnectionIsDropped + { + get; + set { - get => _tigerVNC_PortHistory; - set - { - if (value == _tigerVNC_PortHistory) - return; + if (value == field) + return; - _tigerVNC_PortHistory = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private bool _tigerVNC_ExpandProfileView = true; - public bool TigerVNC_ExpandProfileView + public NetworkConnectionType RemoteDesktop_NetworkConnectionType + { + get; + set { - get => _tigerVNC_ExpandProfileView; - set - { - if (value == _tigerVNC_ExpandProfileView) - return; + if (value == field) + return; - _tigerVNC_ExpandProfileView = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.RemoteDesktop_NetworkConnectionType; - private double _tigerVNC_ProfileWidth = GlobalStaticConfiguration.Profile_DefaultWidthExpanded; - public double TigerVNC_ProfileWidth + public bool RemoteDesktop_DesktopBackground + { + get; + set { - get => _tigerVNC_ProfileWidth; - set - { - if (Math.Abs(value - _tigerVNC_ProfileWidth) < GlobalStaticConfiguration.FloatPointFix) - return; + if (value == field) + return; - _tigerVNC_ProfileWidth = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private string _tigerVNC_ApplicationFilePath; - public string TigerVNC_ApplicationFilePath + public bool RemoteDesktop_FontSmoothing + { + get; + set { - get => _tigerVNC_ApplicationFilePath; - set - { - if (value == _tigerVNC_ApplicationFilePath) - return; + if (value == field) + return; - _tigerVNC_ApplicationFilePath = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private int _tigerVNC_Port = GlobalStaticConfiguration.TigerVNC_DefaultVNCPort; - public int TigerVNC_Port + public bool RemoteDesktop_DesktopComposition + { + get; + set { - get => _tigerVNC_Port; - set - { - if (value == _tigerVNC_Port) - return; + if (value == field) + return; - _tigerVNC_Port = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } - #endregion + } - #region WebConsole - private ObservableCollection _webConsole_UrlHistory = new ObservableCollection(); - public ObservableCollection WebConsole_UrlHistory + public bool RemoteDesktop_ShowWindowContentsWhileDragging + { + get; + set { - get => _webConsole_UrlHistory; - set - { - if (value == _webConsole_UrlHistory) - return; + if (value == field) + return; - _webConsole_UrlHistory = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private bool _webConsole_ExpandProfileView = true; - public bool WebConsole_ExpandProfileView + public bool RemoteDesktop_MenuAndWindowAnimation + { + get; + set { - get => _webConsole_ExpandProfileView; - set - { - if (value == _webConsole_ExpandProfileView) - return; + if (value == field) + return; - _webConsole_ExpandProfileView = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } + + public bool RemoteDesktop_VisualStyles + { + get; + set + { + if (value == field) + return; - private double _webConsole_ProfileWidth = GlobalStaticConfiguration.Profile_DefaultWidthExpanded; - public double WebConsole_ProfileWidth + field = value; + OnPropertyChanged(); + } + } + + #endregion + + #region PowerShell + + public ObservableCollection PowerShell_HostHistory + { + get; + set { - get => _webConsole_ProfileWidth; - set - { - if (Math.Abs(value - _webConsole_ProfileWidth) < GlobalStaticConfiguration.FloatPointFix) - return; + if (value == field) + return; - _webConsole_ProfileWidth = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } - #endregion + } = []; - #region SNMP - private WalkMode _snmp_WalkMode = GlobalStaticConfiguration.SNMP_WalkMode; - public WalkMode SNMP_WalkMode + public string PowerShell_ApplicationFilePath + { + get; + set { - get => _snmp_WalkMode; - set - { - if (value == _snmp_WalkMode) - return; + if (value == field) + return; - _snmp_WalkMode = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private int _snmp_Timeout = GlobalStaticConfiguration.SNMP_Timeout; - public int SNMP_Timeout + public string PowerShell_Command + { + get; + set { - get => _snmp_Timeout; - set - { - if (value == _snmp_Timeout) - return; + if (value == field) + return; - _snmp_Timeout = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.PowerShell_Command; - private int _snmp_port = 161; - public int SNMP_Port + public string PowerShell_AdditionalCommandLine + { + get; + set { - get => _snmp_port; - set - { - if (value == _snmp_port) - return; + if (value == field) + return; - _snmp_port = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private bool _snmp_ResolveHostnamePreferIPv4 = true; - public bool SNMP_ResolveHostnamePreferIPv4 + public ExecutionPolicy PowerShell_ExecutionPolicy + { + get; + set { - get => _snmp_ResolveHostnamePreferIPv4; - set - { - if (value == _snmp_ResolveHostnamePreferIPv4) - return; + if (value == field) + return; - _snmp_ResolveHostnamePreferIPv4 = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.PowerShell_ExecutionPolicy; + + #endregion - private ObservableCollection _snmp_HostHistory = new ObservableCollection(); - public ObservableCollection SNMP_HostHistory + #region PuTTY + + public ObservableCollection PuTTY_HostHistory + { + get; + set { - get => _snmp_HostHistory; - set - { - if (value == _snmp_HostHistory) - return; + if (value == field) + return; - _snmp_HostHistory = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = []; - private ObservableCollection _snmp_OIDHistory = new ObservableCollection(); - public ObservableCollection SNMP_OIDHistory + public ConnectionMode PuTTY_DefaultConnectionMode + { + get; + set { - get => _snmp_OIDHistory; - set - { - if (value == _snmp_OIDHistory) - return; + if (value == field) + return; - _snmp_OIDHistory = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.PuTTY_DefaultConnectionMode; - private SNMPMode _snmp_Mode = GlobalStaticConfiguration.SNMP_Mode; - public SNMPMode SNMP_Mode + public string PuTTY_Username + { + get; + set { - get => _snmp_Mode; - set - { - if (value == _snmp_Mode) - return; + if (value == field) + return; - _snmp_Mode = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private SNMPVersion _snmp_Version = GlobalStaticConfiguration.SNMP_Version; - public SNMPVersion SNMP_Version + public string PuTTY_PrivateKeyFile + { + get; + set { - get => _snmp_Version; - set - { - if (value == _snmp_Version) - return; + if (value == field) + return; - _snmp_Version = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private SNMPV3Security _snmp_Security = GlobalStaticConfiguration.SNMP_Security; - public SNMPV3Security SNMP_Security + public string PuTTY_Profile + { + get; + set { - get => _snmp_Security; - set - { - if (value == _snmp_Security) - return; + if (value == field) + return; - _snmp_Security = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.PuTTY_DefaultProfile; - private SNMPV3AuthenticationProvider _snmp_AuthenticationProvider = GlobalStaticConfiguration.SNMP_AuthenticationProvider; - public SNMPV3AuthenticationProvider SNMP_AuthenticationProvider + public bool PuTTY_EnableSessionLog + { + get; + set { - get => _snmp_AuthenticationProvider; - set - { - if (value == _snmp_AuthenticationProvider) - return; + if (value == field) + return; - _snmp_AuthenticationProvider = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private SNMPV3PrivacyProvider _snmp_PrivacyProvider = GlobalStaticConfiguration.SNMP_PrivacyProvider; - public SNMPV3PrivacyProvider SNMP_PrivacyProvider + public LogMode PuTTY_LogMode + { + get; + set { - get => _snmp_PrivacyProvider; - set - { - if (value == _snmp_PrivacyProvider) - return; + if (value == field) + return; - _snmp_PrivacyProvider = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.PuTTY_LogMode; - private string _snmp_ExportFilePath; - public string SNMP_ExportFilePath + public string PuTTY_LogPath + { + get; + set { - get => _snmp_ExportFilePath; - set - { - if (value == _snmp_ExportFilePath) - return; + if (value == field) + return; - _snmp_ExportFilePath = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.PuTTY_LogPath; - private ExportManager.ExportFileType _snmp_ExportFileType = GlobalStaticConfiguration.SNMP_ExportFileType; - public ExportManager.ExportFileType SNMP_ExportFileType + public string PuTTY_LogFileName + { + get; + set { - get => _snmp_ExportFileType; - set - { - if (value == _snmp_ExportFileType) - return; + if (value == field) + return; - _snmp_ExportFileType = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } - #endregion + } = GlobalStaticConfiguration.PuTTY_LogFileName; - #region Discovery Protocol - private string _discoveryProtocol_SelectedInterfaceId; - public string DiscoveryProtocol_InterfaceId + public string PuTTY_AdditionalCommandLine + { + get; + set { - get => _discoveryProtocol_SelectedInterfaceId; - set - { - if (value == _discoveryProtocol_SelectedInterfaceId) - return; + if (value == field) + return; - _discoveryProtocol_SelectedInterfaceId = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private DiscoveryProtocol.Protocol _discoveryProtocol_Protocol = GlobalStaticConfiguration.DiscoveryProtocol_Protocol; - public DiscoveryProtocol.Protocol DiscoveryProtocol_Protocol + public ObservableCollection PuTTY_SerialLineHistory + { + get; + set { - get => _discoveryProtocol_Protocol; - set - { - if (value == _discoveryProtocol_Protocol) - return; + if (value == field) + return; - _discoveryProtocol_Protocol = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = []; - private int _discoveryProtocol_Duration = GlobalStaticConfiguration.DiscoveryProtocol_Duration; - public int DiscoveryProtocol_Duration + public ObservableCollection PuTTY_PortHistory + { + get; + set { - get => _discoveryProtocol_Duration; - set - { - if (value == _discoveryProtocol_Duration) - return; + if (value == field) + return; - _discoveryProtocol_Duration = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } - #endregion + } = []; - #region WakeOnLAN - private int _wakeOnLAN_Port = GlobalStaticConfiguration.WakeOnLAN_Port; - public int WakeOnLAN_Port + public ObservableCollection PuTTY_BaudHistory + { + get; + set { - get => _wakeOnLAN_Port; - set - { - if (value == _wakeOnLAN_Port) - return; + if (value == field) + return; - _wakeOnLAN_Port = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = []; - private bool _wakeOnLAN_ExpandClientView = true; - public bool WakeOnLAN_ExpandClientView + public ObservableCollection PuTTY_UsernameHistory + { + get; + set { - get => _wakeOnLAN_ExpandClientView; - set - { - if (value == _wakeOnLAN_ExpandClientView) - return; + if (value == field) + return; - _wakeOnLAN_ExpandClientView = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = []; - private double _wakeOnLAN_ClientWidth = GlobalStaticConfiguration.Profile_DefaultWidthExpanded; - public double WakeOnLAN_ClientWidth + public ObservableCollection PuTTY_PrivateKeyFileHistory + { + get; + set { - get => _wakeOnLAN_ClientWidth; - set - { - if (Math.Abs(value - _wakeOnLAN_ClientWidth) < GlobalStaticConfiguration.FloatPointFix) - return; + if (value == field) + return; - _wakeOnLAN_ClientWidth = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } - #endregion + } = []; - #region Subnet Calculator + public ObservableCollection PuTTY_ProfileHistory + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = []; - #region Calculator - private ObservableCollection _subnetCalculator_Calculator_SubnetHistory = new ObservableCollection(); - public ObservableCollection SubnetCalculator_Calculator_SubnetHistory + public string PuTTY_ApplicationFilePath + { + get; + set { - get => _subnetCalculator_Calculator_SubnetHistory; - set - { - if (value == _subnetCalculator_Calculator_SubnetHistory) - return; + if (value == field) + return; - _subnetCalculator_Calculator_SubnetHistory = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } - #endregion + } - #region Subnetting - private ObservableCollection _subnetCalculator_Subnetting_SubnetHistory = new ObservableCollection(); - public ObservableCollection SubnetCalculator_Subnetting_SubnetHistory + public string PuTTY_SerialLine + { + get; + set { - get => _subnetCalculator_Subnetting_SubnetHistory; - set - { - if (value == _subnetCalculator_Subnetting_SubnetHistory) - return; + if (value == field) + return; - _subnetCalculator_Subnetting_SubnetHistory = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.PuTTY_SerialLine; - private ObservableCollection _subnetCalculator_Subnetting_NewSubnetmaskOrCIDRHistory = new ObservableCollection(); - public ObservableCollection SubnetCalculator_Subnetting_NewSubnetmaskOrCIDRHistory + public int PuTTY_SSHPort + { + get; + set { - get => _subnetCalculator_Subnetting_NewSubnetmaskOrCIDRHistory; - set - { - if (value == _subnetCalculator_Subnetting_NewSubnetmaskOrCIDRHistory) - return; + if (value == field) + return; - _subnetCalculator_Subnetting_NewSubnetmaskOrCIDRHistory = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.PuTTY_SSHPort; - private string _subnetCalculator_Subnetting_ExportFilePath; - public string SubnetCalculator_Subnetting_ExportFilePath + public int PuTTY_TelnetPort + { + get; + set { - get => _subnetCalculator_Subnetting_ExportFilePath; - set - { - if (value == _subnetCalculator_Subnetting_ExportFilePath) - return; + if (value == field) + return; - _subnetCalculator_Subnetting_ExportFilePath = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.PuTTY_TelnetPort; + - private ExportManager.ExportFileType _subnetCalculator_Subnetting_ExportFileType = GlobalStaticConfiguration.SubnetCalculator_Subnetting_ExportFileType; - public ExportManager.ExportFileType SubnetCalculator_Subnetting_ExportFileType + public int PuTTY_BaudRate + { + get; + set { - get => _subnetCalculator_Subnetting_ExportFileType; - set - { - if (value == _subnetCalculator_Subnetting_ExportFileType) - return; + if (value == field) + return; - _subnetCalculator_Subnetting_ExportFileType = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } - #endregion + } = GlobalStaticConfiguration.PuTTY_BaudRate; - #region WideSubnet - private ObservableCollection _subnetCalculator_WideSubnet_Subnet1 = new ObservableCollection(); - public ObservableCollection SubnetCalculator_WideSubnet_Subnet1 + public int PuTTY_RloginPort + { + get; + set { - get => _subnetCalculator_WideSubnet_Subnet1; - set - { - if (value == _subnetCalculator_WideSubnet_Subnet1) - return; + if (value == field) + return; - _subnetCalculator_WideSubnet_Subnet1 = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.PuTTY_RloginPort; - private ObservableCollection _subnetCalculator_WideSubnet_Subnet2 = new ObservableCollection(); - public ObservableCollection SubnetCalculator_WideSubnet_Subnet2 + public int PuTTY_RawPort + { + get; + set { - get => _subnetCalculator_WideSubnet_Subnet2; - set - { - if (value == _subnetCalculator_WideSubnet_Subnet2) - return; + if (value == field) + return; - _subnetCalculator_WideSubnet_Subnet2 = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } - #endregion + } = GlobalStaticConfiguration.PuTTY_RawPort; - #endregion + #endregion - #region Lookup - private ObservableCollection _lookup_OUI_MACAddressOrVendorHistory = new ObservableCollection(); - public ObservableCollection Lookup_OUI_MACAddressOrVendorHistory + #region TigerVNC + + public ObservableCollection TigerVNC_HostHistory + { + get; + set { - get => _lookup_OUI_MACAddressOrVendorHistory; - set - { - if (value == _lookup_OUI_MACAddressOrVendorHistory) - return; + if (value == field) + return; - _lookup_OUI_MACAddressOrVendorHistory = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = []; - private string _lookup_OUI_ExportFilePath; - public string Lookup_OUI_ExportFilePath + public ObservableCollection TigerVNC_PortHistory + { + get; + set { - get => _lookup_OUI_ExportFilePath; - set - { - if (value == _lookup_OUI_ExportFilePath) - return; + if (value == field) + return; - _lookup_OUI_ExportFilePath = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = []; - private ExportManager.ExportFileType _lookup_OUI_ExportFileType = GlobalStaticConfiguration.Lookup_OUI_ExportFileType; - public ExportManager.ExportFileType Lookup_OUI_ExportFileType + public string TigerVNC_ApplicationFilePath + { + get; + set { - get => _lookup_OUI_ExportFileType; - set - { - if (value == _lookup_OUI_ExportFileType) - return; + if (value == field) + return; - _lookup_OUI_ExportFileType = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private ObservableCollection _lookup_Port_PortsHistory = new ObservableCollection(); - public ObservableCollection Lookup_Port_PortsHistory + public int TigerVNC_Port + { + get; + set { - get => _lookup_Port_PortsHistory; - set - { - if (value == _lookup_Port_PortsHistory) - return; + if (value == field) + return; - _lookup_Port_PortsHistory = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.TigerVNC_DefaultVNCPort; + + #endregion - private string _lookup_Port_ExportFilePath; - public string Lookup_Port_ExportFilePath + #region Web Console + + public ObservableCollection WebConsole_UrlHistory + { + get; + set { - get => _lookup_Port_ExportFilePath; - set - { - if (value == _lookup_Port_ExportFilePath) - return; + if (value == field) + return; - _lookup_Port_ExportFilePath = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = []; - private ExportManager.ExportFileType _lookup_Port_ExportFileType = GlobalStaticConfiguration.Lookup_Port_ExportFileType; - public ExportManager.ExportFileType Lookup_Port_ExportFileType + public bool WebConsole_ShowAddressBar + { + get; + set { - get => _lookup_Port_ExportFileType; - set - { - if (value == _lookup_Port_ExportFileType) - return; + if (value == field) + return; - _lookup_Port_ExportFileType = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } - #endregion + } = GlobalStaticConfiguration.WebConsole_ShowAddressBar; - #region Whois - private ObservableCollection _whois_DomainHistory = new ObservableCollection(); - public ObservableCollection Whois_DomainHistory + public bool WebConsole_IsStatusBarEnabled + { + get; + set { - get => _whois_DomainHistory; - set - { - if (value == _whois_DomainHistory) - return; + if (value == field) + return; - _whois_DomainHistory = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.WebConsole_IsStatusBarEnabled; - private bool _whois_ExpandProfileView = true; - public bool Whois_ExpandProfileView + public bool WebConsole_IsPasswordSaveEnabled + { + get; + set { - get => _whois_ExpandProfileView; - set - { - if (value == _whois_ExpandProfileView) - return; + if (value == field) + return; - _whois_ExpandProfileView = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.WebConsole_IsPasswordSaveEnabled; + + #endregion - private double _whois_ProfileWidth = GlobalStaticConfiguration.Profile_DefaultWidthExpanded; - public double Whois_ProfileWidth + #region SNMP + + public ObservableCollection SNMP_HostHistory + { + get; + set { - get => _whois_ProfileWidth; - set - { - if (Math.Abs(value - _whois_ProfileWidth) < GlobalStaticConfiguration.FloatPointFix) - return; + if (value == field) + return; - _whois_ProfileWidth = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = []; - private string _whois_ExportFilePath; - public string Whois_ExportFilePath + public ObservableCollection SNMP_OidHistory + { + get; + set { - get => _whois_ExportFilePath; - set - { - if (value == _whois_ExportFilePath) - return; + if (value == field) + return; - _whois_ExportFilePath = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = []; - private ExportManager.ExportFileType _whois_ExportFileType = GlobalStaticConfiguration.Whois_ExportFileType; - public ExportManager.ExportFileType Whois_ExportFileType + public ObservableCollection SNMP_OidProfiles + { + get; + set { - get => _whois_ExportFileType; - set - { - if (value == _whois_ExportFileType) - return; + if (value == field) + return; - _whois_ExportFileType = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } - #endregion + } = []; - #region Connections - private bool _connections_AutoRefresh; - public bool Connections_AutoRefresh + public int SNMP_Timeout + { + get; + set { - get => _connections_AutoRefresh; - set - { - if (value == _connections_AutoRefresh) - return; + if (value == field) + return; - _connections_AutoRefresh = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.SNMP_Timeout; - private AutoRefreshTimeInfo _connections_AutoRefreshTime = GlobalStaticConfiguration.Connections_AutoRefreshTime; - public AutoRefreshTimeInfo Connections_AutoRefreshTime + public WalkMode SNMP_WalkMode + { + get; + set { - get => _connections_AutoRefreshTime; - set - { - if (value == _connections_AutoRefreshTime) - return; + if (value == field) + return; - _connections_AutoRefreshTime = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.SNMP_WalkMode; - private string _connections_ExportFilePath; - public string Connections_ExportFilePath + public int SNMP_Port + { + get; + set { - get => _connections_ExportFilePath; - set - { - if (value == _connections_ExportFilePath) - return; + if (value == field) + return; - _connections_ExportFilePath = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = 161; - private ExportManager.ExportFileType _connections_ExportFileType = GlobalStaticConfiguration.Connections_ExportFileType; - public ExportManager.ExportFileType Connections_ExportFileType + public SNMPMode SNMP_Mode + { + get; + set { - get => _connections_ExportFileType; - set - { - if (value == _connections_ExportFileType) - return; + if (value == field) + return; - _connections_ExportFileType = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } - #endregion + } = GlobalStaticConfiguration.SNMP_Mode; - #region Listeners - private bool _listeners_AutoRefresh; - public bool Listeners_AutoRefresh + public SNMPVersion SNMP_Version + { + get; + set { - get => _listeners_AutoRefresh; - set - { - if (value == _listeners_AutoRefresh) - return; + if (value == field) + return; - _listeners_AutoRefresh = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.SNMP_Version; - private AutoRefreshTimeInfo _listeners_AutoRefreshTime = GlobalStaticConfiguration.Listeners_AutoRefreshTime; - public AutoRefreshTimeInfo Listeners_AutoRefreshTime + public SNMPV3Security SNMP_Security + { + get; + set { - get => _listeners_AutoRefreshTime; - set - { - if (value == _listeners_AutoRefreshTime) - return; + if (value == field) + return; - _listeners_AutoRefreshTime = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.SNMP_Security; - private string _listeners_ExportFilePath; - public string Listeners_ExportFilePath + public SNMPV3AuthenticationProvider SNMP_AuthenticationProvider + { + get; + set { - get => _listeners_ExportFilePath; - set - { - if (value == _listeners_ExportFilePath) - return; + if (value == field) + return; - _listeners_ExportFilePath = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.SNMP_AuthenticationProvider; - private ExportManager.ExportFileType _listeners_ExportFileType = GlobalStaticConfiguration.Listeners_ExportFileType; - public ExportManager.ExportFileType Listeners_ExportFileType + public SNMPV3PrivacyProvider SNMP_PrivacyProvider + { + get; + set { - get => _listeners_ExportFileType; - set - { - if (value == _listeners_ExportFileType) - return; + if (value == field) + return; - _listeners_ExportFileType = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } - #endregion + } = GlobalStaticConfiguration.SNMP_PrivacyProvider; + - #region ARPTable - private bool _arpTable_AutoRefresh; - public bool ARPTable_AutoRefresh + public string SNMP_ExportFilePath + { + get; + set { - get => _arpTable_AutoRefresh; - set - { - if (value == _arpTable_AutoRefresh) - return; + if (value == field) + return; - _arpTable_AutoRefresh = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } - private AutoRefreshTimeInfo _arpTable_AutoRefreshTime = GlobalStaticConfiguration.ARPTable_AutoRefreshTime; - public AutoRefreshTimeInfo ARPTable_AutoRefreshTime + public ExportFileType SNMP_ExportFileType + { + get; + set { - get => _arpTable_AutoRefreshTime; - set - { - if (value == _arpTable_AutoRefreshTime) - return; + if (value == field) + return; - _arpTable_AutoRefreshTime = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.SNMP_ExportFileType; + + #endregion - private string _arpTable_ExportFilePath; - public string ARPTable_ExportFilePath + #region SNTP Lookup + + public ObservableCollection SNTPLookup_SNTPServers + { + get; + set { - get => _arpTable_ExportFilePath; - set - { - if (value == _arpTable_ExportFilePath) - return; + if (value == field) + return; - _arpTable_ExportFilePath = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } + } = []; - private ExportManager.ExportFileType _arpTable_ExportFileType = GlobalStaticConfiguration.ARPTable_ExportFileType; - public ExportManager.ExportFileType ARPTable_ExportFileType + public ServerConnectionInfoProfile SNTPLookup_SelectedSNTPServer + { + get; + set { - get => _arpTable_ExportFileType; - set - { - if (value == _arpTable_ExportFileType) - return; + if (value == field) + return; - _arpTable_ExportFileType = value; - OnPropertyChanged(); - SettingsChanged = true; - } + field = value; + OnPropertyChanged(); } - #endregion + } = new(); - #endregion + public int SNTPLookup_Timeout + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.SNTPLookup_Timeout; - #region Constructor - public SettingsInfo() + public string SNTPLookup_ExportFilePath + { + get; + set { - // General - General_ApplicationList.CollectionChanged += CollectionChanged; + if (value == field) + return; - // IP Scanner - IPScanner_HostsHistory.CollectionChanged += CollectionChanged; - IPScanner_CustomCommands.CollectionChanged += CollectionChanged; + field = value; + OnPropertyChanged(); + } + } - // Port Scanner - PortScanner_HostsHistory.CollectionChanged += CollectionChanged; - PortScanner_PortsHistory.CollectionChanged += CollectionChanged; - PortScanner_PortProfiles.CollectionChanged += CollectionChanged; + public ExportFileType SNTPLookup_ExportFileType + { + get; + set + { + if (value == field) + return; - // Ping Monitor - PingMonitor_HostHistory.CollectionChanged += CollectionChanged; + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.SNTPLookup_ExportFileType; - // Traceroute - Traceroute_HostHistory.CollectionChanged += CollectionChanged; + #endregion - // DNS Lookup - DNSLookup_HostHistory.CollectionChanged += CollectionChanged; - DNSLookup_DNSServers.CollectionChanged += CollectionChanged; + #region Hosts File Editor - // Remote Desktop - RemoteDesktop_HostHistory.CollectionChanged += CollectionChanged; + public string HostsFileEditor_ExportFilePath + { + get; + set + { + if (value == field) + return; - // PowerShell - PowerShell_HostHistory.CollectionChanged += CollectionChanged; + field = value; + OnPropertyChanged(); + } + } - // PuTTY - PuTTY_HostHistory.CollectionChanged += CollectionChanged; - PuTTY_SerialLineHistory.CollectionChanged += CollectionChanged; - PuTTY_PortHistory.CollectionChanged += CollectionChanged; - PuTTY_BaudHistory.CollectionChanged += CollectionChanged; - PuTTY_UsernameHistory.CollectionChanged += CollectionChanged; - PuTTY_PrivateKeyFileHistory.CollectionChanged += CollectionChanged; - PuTTY_ProfileHistory.CollectionChanged += CollectionChanged; + public ExportFileType HostsFileEditor_ExportFileType + { + get; + set + { + if (value == field) + return; - // TigerVNC - TigerVNC_HostHistory.CollectionChanged += CollectionChanged; - TigerVNC_PortHistory.CollectionChanged += CollectionChanged; + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.HostsFileEditor_ExportFileType; - // WebConsole - WebConsole_UrlHistory.CollectionChanged += CollectionChanged; + #endregion - // SNMP - SNMP_HostHistory.CollectionChanged += CollectionChanged; - SNMP_OIDHistory.CollectionChanged += CollectionChanged; + #region Firewall + public string Firewall_ExportFilePath + { + get; + set + { + if (value == field) + return; - // Subnet Calculator / Calculator - SubnetCalculator_Calculator_SubnetHistory.CollectionChanged += CollectionChanged; + field = value; + OnPropertyChanged(); + } + } - // Subnet Calculator / Subnetting - SubnetCalculator_Subnetting_SubnetHistory.CollectionChanged += CollectionChanged; - SubnetCalculator_Subnetting_NewSubnetmaskOrCIDRHistory.CollectionChanged += CollectionChanged; + public ExportFileType Firewall_ExportFileType + { + get; + set + { + if (value == field) + return; - // Subnet Calculator / Supernetting - SubnetCalculator_WideSubnet_Subnet1.CollectionChanged += CollectionChanged; - SubnetCalculator_WideSubnet_Subnet2.CollectionChanged += CollectionChanged; + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.Firewall_ExportFileType; - // Lookup / OUI - Lookup_OUI_MACAddressOrVendorHistory.CollectionChanged += CollectionChanged; + #endregion - // Lookup / Port - Lookup_Port_PortsHistory.CollectionChanged += CollectionChanged; + #region Discovery Protocol + + public DiscoveryProtocol DiscoveryProtocol_Protocol + { + get; + set + { + if (value == field) + return; - // Whois - Whois_DomainHistory.CollectionChanged += CollectionChanged; + field = value; + OnPropertyChanged(); } + } = GlobalStaticConfiguration.DiscoveryProtocol_Protocol; - private void CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) + public int DiscoveryProtocol_Duration + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.DiscoveryProtocol_Duration; + + public string DiscoveryProtocol_ExportFilePath + { + get; + set { - SettingsChanged = true; + if (value == field) + return; + + field = value; + OnPropertyChanged(); } - #endregion } + + public ExportFileType DiscoveryProtocol_ExportFileType + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.DiscoveryProtocol_ExportFileType; + + #endregion + + #region WakeOnLAN + + public int WakeOnLAN_Port + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.WakeOnLAN_Port; + + public ObservableCollection WakeOnLan_MACAddressHistory + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = []; + + public ObservableCollection WakeOnLan_BroadcastHistory + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = []; + + #endregion + + #region Whois + + public ObservableCollection Whois_DomainHistory + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = []; + + public string Whois_ExportFilePath + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public ExportFileType Whois_ExportFileType + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.Whois_ExportFileType; + + #endregion + + #region IP Geolocation + + public ObservableCollection IPGeolocation_HostHistory + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = []; + + public string IPGeolocation_ExportFilePath + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public ExportFileType IPGeolocation_ExportFileType + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.IPGeolocation_ExportFileType; + + #endregion + + #region Subnet Calculator + + #region Calculator + + public ObservableCollection SubnetCalculator_Calculator_SubnetHistory + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = []; + + #endregion + + #region Subnetting + + public ObservableCollection SubnetCalculator_Subnetting_SubnetHistory + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = []; + + public ObservableCollection SubnetCalculator_Subnetting_NewSubnetmaskHistory + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = []; + + public string SubnetCalculator_Subnetting_ExportFilePath + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public ExportFileType SubnetCalculator_Subnetting_ExportFileType + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.SubnetCalculator_Subnetting_ExportFileType; + + #endregion + + #region WideSubnet + + public ObservableCollection SubnetCalculator_WideSubnet_Subnet1 + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = []; + + public ObservableCollection SubnetCalculator_WideSubnet_Subnet2 + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = []; + + #endregion + + #endregion + + #region Bit Calculator + + public ObservableCollection BitCalculator_InputHistory + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = []; + + public BitCaluclatorUnit BitCalculator_Unit + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.BitCalculator_Unit; + + + public BitCaluclatorNotation BitCalculator_Notation + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.BitCalculator_Notation; + + public string BitCalculator_ExportFilePath + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public ExportFileType BitCalculator_ExportFileType + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.BitCalculator_ExportFileType; + + #endregion + + #region Lookup + + public ObservableCollection Lookup_OUI_SearchHistory + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = []; + + public string Lookup_OUI_ExportFilePath + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public ExportFileType Lookup_OUI_ExportFileType + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.Lookup_OUI_ExportFileType; + + public ObservableCollection Lookup_Port_SearchHistory + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = []; + + public string Lookup_Port_ExportFilePath + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public ExportFileType Lookup_Port_ExportFileType + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.Lookup_Port_ExportFileType; + + #endregion + + #region Connections + + public bool Connections_AutoRefreshEnabled + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public AutoRefreshTimeInfo Connections_AutoRefreshTime + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.Connections_AutoRefreshTime; + + public string Connections_ExportFilePath + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public ExportFileType Connections_ExportFileType + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.Connections_ExportFileType; + + #endregion + + #region Listeners + + public bool Listeners_AutoRefreshEnabled + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public AutoRefreshTimeInfo Listeners_AutoRefreshTime + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.Listeners_AutoRefreshTime; + + public string Listeners_ExportFilePath + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public ExportFileType Listeners_ExportFileType + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.Listeners_ExportFileType; + + #endregion + + #region NeighborTable + + public bool NeighborTable_AutoRefreshEnabled + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public AutoRefreshTimeInfo NeighborTable_AutoRefreshTime + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.NeighborTable_AutoRefreshTime; + + public string NeighborTable_ExportFilePath + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public ExportFileType NeighborTable_ExportFileType + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.NeighborTable_ExportFileType; + + public string NeighborTable_InterfaceName + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + #endregion + + #endregion + + #region Constructor + + public SettingsInfo() + { + // General + General_ApplicationList.CollectionChanged += CollectionChanged; + + // IP Scanner + IPScanner_HostHistory.CollectionChanged += CollectionChanged; + IPScanner_CustomCommands.CollectionChanged += CollectionChanged; + + // Port Scanner + PortScanner_HostHistory.CollectionChanged += CollectionChanged; + PortScanner_PortHistory.CollectionChanged += CollectionChanged; + PortScanner_PortProfiles.CollectionChanged += CollectionChanged; + + // Ping Monitor + PingMonitor_HostHistory.CollectionChanged += CollectionChanged; + + // Traceroute + Traceroute_HostHistory.CollectionChanged += CollectionChanged; + + // DNS Lookup + DNSLookup_HostHistory.CollectionChanged += CollectionChanged; + DNSLookup_DNSServers.CollectionChanged += CollectionChanged; + + // Remote Desktop + RemoteDesktop_HostHistory.CollectionChanged += CollectionChanged; + + // PowerShell + PowerShell_HostHistory.CollectionChanged += CollectionChanged; + + // PuTTY + PuTTY_HostHistory.CollectionChanged += CollectionChanged; + PuTTY_SerialLineHistory.CollectionChanged += CollectionChanged; + PuTTY_PortHistory.CollectionChanged += CollectionChanged; + PuTTY_BaudHistory.CollectionChanged += CollectionChanged; + PuTTY_UsernameHistory.CollectionChanged += CollectionChanged; + PuTTY_PrivateKeyFileHistory.CollectionChanged += CollectionChanged; + PuTTY_ProfileHistory.CollectionChanged += CollectionChanged; + + // TigerVNC + TigerVNC_HostHistory.CollectionChanged += CollectionChanged; + TigerVNC_PortHistory.CollectionChanged += CollectionChanged; + + // WebConsole + WebConsole_UrlHistory.CollectionChanged += CollectionChanged; + + // SNMP + SNMP_HostHistory.CollectionChanged += CollectionChanged; + SNMP_OidHistory.CollectionChanged += CollectionChanged; + SNMP_OidProfiles.CollectionChanged += CollectionChanged; + + // SNTP Lookup + SNTPLookup_SNTPServers.CollectionChanged += CollectionChanged; + + // Wake on LAN + WakeOnLan_MACAddressHistory.CollectionChanged += CollectionChanged; + WakeOnLan_BroadcastHistory.CollectionChanged += CollectionChanged; + + // Whois + Whois_DomainHistory.CollectionChanged += CollectionChanged; + + // IP Geolocation + IPGeolocation_HostHistory.CollectionChanged += CollectionChanged; + + // Subnet Calculator > Calculator + SubnetCalculator_Calculator_SubnetHistory.CollectionChanged += CollectionChanged; + + // Subnet Calculator > Subnetting + SubnetCalculator_Subnetting_SubnetHistory.CollectionChanged += CollectionChanged; + SubnetCalculator_Subnetting_NewSubnetmaskHistory.CollectionChanged += CollectionChanged; + + // Subnet Calculator > Supernetting + SubnetCalculator_WideSubnet_Subnet1.CollectionChanged += CollectionChanged; + SubnetCalculator_WideSubnet_Subnet2.CollectionChanged += CollectionChanged; + + // Bit Calculator + BitCalculator_InputHistory.CollectionChanged += CollectionChanged; + + // Lookup > OUI + Lookup_OUI_SearchHistory.CollectionChanged += CollectionChanged; + + // Lookup > Port + Lookup_Port_SearchHistory.CollectionChanged += CollectionChanged; + } + + private void CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) + { + SettingsChanged = true; + } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager.Settings/SettingsManager.cs b/Source/NETworkManager.Settings/SettingsManager.cs index b775f8fb89..93da62186f 100644 --- a/Source/NETworkManager.Settings/SettingsManager.cs +++ b/Source/NETworkManager.Settings/SettingsManager.cs @@ -1,199 +1,746 @@ -using System; +using log4net; +using NETworkManager.Models; +using NETworkManager.Models.Network; +using NETworkManager.Utilities; +using System; using System.IO; -using System.IO.Compression; -using System.Threading.Tasks; +using System.Linq; +using System.Text.Json; +using System.Text.Json.Serialization; +using System.Text.RegularExpressions; using System.Xml.Serialization; -namespace NETworkManager.Settings +namespace NETworkManager.Settings; + +public static class SettingsManager { - public static class SettingsManager + #region Variables + + /// + /// Logger for logging. + /// + private static readonly ILog Log = LogManager.GetLogger(typeof(SettingsManager)); + + /// + /// Settings directory name. + /// + private static string SettingsFolderName => "Settings"; + + /// + /// Settings backups directory name. + /// + private static string BackupFolderName => "Backups"; + + /// + /// Settings file name. + /// + private static string SettingsFileName => "Settings"; + + /// + /// Settings file extension. + /// + private static string SettingsFileExtension => ".json"; + + /// + /// Legacy XML settings file extension. + /// + [Obsolete("Legacy XML settings are no longer used, but the extension is kept for migration purposes.")] + private static string LegacySettingsFileExtension => ".xml"; + + /// + /// Settings that are currently loaded. + /// + public static SettingsInfo Current { get; private set; } + + /// + /// Indicates if the HotKeys have changed. May need to be reworked if we add more HotKeys. + /// + public static bool HotKeysChanged { get; set; } + + /// + /// JSON serializer options for consistent serialization/deserialization. + /// + private static readonly JsonSerializerOptions JsonOptions = new() { - #region Variables - private static string SettingsFolderName => "Settings"; - private static string SettingsFileName => "Settings"; - private static string SettingsFileExtension => ".xml"; - - public static SettingsInfo Current { get; set; } - - public static bool HotKeysChanged { get; set; } - #endregion - - #region Methods - #region Settings locations (default, custom, portable) - public static string GetDefaultSettingsLocation() + WriteIndented = true, + PropertyNameCaseInsensitive = true, + DefaultIgnoreCondition = JsonIgnoreCondition.Never, + Converters = { new JsonStringEnumConverter() } + }; + + #endregion + + #region Settings location, default paths and file names + + /// + /// Method to get the path of the settings folder. + /// Priority: + /// 1. Policy override (for IT administrators) + /// 2. Custom user-configured path (not available in portable mode) + /// 3. Portable (same directory as the application) or default location (Documents folder) + /// + /// Path to the settings folder. + public static string GetSettingsFolderLocation() + { + // 1. Policy override takes precedence (for IT administrators) + if (!string.IsNullOrWhiteSpace(PolicyManager.Current?.Settings_FolderLocation)) { - return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), AssemblyManager.Current.Name, SettingsFolderName); + var validatedPath = DirectoryHelper.ValidateFolderPath( + PolicyManager.Current.Settings_FolderLocation, + "Policy-provided", + nameof(PolicyInfo.Settings_FolderLocation), + "next priority"); + + if (validatedPath != null) + return validatedPath; } - public static string GetCustomSettingsLocation() + // 2. Custom user-configured path (not available in portable mode) + if (!ConfigurationManager.Current.IsPortable && + !string.IsNullOrWhiteSpace(LocalSettingsManager.Current?.Settings_FolderLocation)) { - return LocalSettingsManager.Settings_CustomSettingsLocation; + var validatedPath = DirectoryHelper.ValidateFolderPath( + LocalSettingsManager.Current.Settings_FolderLocation, + "Custom", + nameof(LocalSettingsInfo.Settings_FolderLocation), + "default location"); + + if (validatedPath != null) + return validatedPath; } - public static string GetPortableSettingsLocation() - { + // 3. Fall back to portable or default location + if (ConfigurationManager.Current.IsPortable) + return GetPortableSettingsFolderLocation(); + else + return GetDefaultSettingsFolderLocation(); + } - return Path.Combine(AssemblyManager.Current.Location ?? throw new InvalidOperationException(), SettingsFolderName); - } + /// + /// Method to get the default settings folder location in the user's Documents directory. + /// + /// Path to the default settings folder location. + public static string GetDefaultSettingsFolderLocation() + { + return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), + AssemblyManager.Current.Name, SettingsFolderName); + } - public static string GetSettingsLocation() - { - return ConfigurationManager.Current.IsPortable ? GetPortableSettingsLocation() : GetSettingsLocationNotPortable(); - } + /// + /// Method to get the portable settings folder location (in the same directory as the application). + /// + /// Path to the portable settings folder location. + public static string GetPortableSettingsFolderLocation() + { + return Path.Combine(AssemblyManager.Current.Location, SettingsFolderName); + } - public static string GetSettingsLocationNotPortable() - { - var settingsLocation = GetCustomSettingsLocation(); + /// + /// Method to get the path of the settings backup folder. + /// + /// Path to the settings backup folder. + public static string GetSettingsBackupFolderLocation() + { + return Path.Combine(GetSettingsFolderLocation(), BackupFolderName); + } - if (!string.IsNullOrEmpty(settingsLocation) && Directory.Exists(settingsLocation)) - return settingsLocation; + /// + /// Method to get the settings file name. + /// + /// Settings file name. + public static string GetSettingsFileName() + { + return $"{SettingsFileName}{SettingsFileExtension}"; + } - return GetDefaultSettingsLocation(); - } - #endregion + /// + /// Method to get the legacy settings file name. + /// + /// Legacy settings file name. + [Obsolete("Legacy XML settings are no longer used, but the method is kept for migration purposes.")] + public static string GetLegacySettingsFileName() + { + return $"{SettingsFileName}{LegacySettingsFileExtension}"; + } - #region FileName, FilePath - public static string GetSettingsFileName() - { - return $"{SettingsFileName}{SettingsFileExtension}"; - } + /// + /// Method to get the settings file path. + /// + /// Settings file path. + public static string GetSettingsFilePath() + { + return Path.Combine(GetSettingsFolderLocation(), GetSettingsFileName()); + } - public static string GetSettingsFilePath() - { - return Path.Combine(GetSettingsLocation(), GetSettingsFileName()); - } + /// + /// Method to get the legacy XML settings file path. + /// + /// Legacy XML settings file path. + [Obsolete("Legacy XML settings are no longer used, but the method is kept for migration purposes.")] + private static string GetLegacySettingsFilePath() + { + return Path.Combine(GetSettingsFolderLocation(), GetLegacySettingsFileName()); + } + #endregion + + #region Initialize, load and save - #endregion + /// + /// Initialize new settings () and save them (to a file). + /// + public static void Initialize() + { + Log.Info("Initializing new settings."); - #region Load, Save - public static void Load() + Current = new SettingsInfo { - var filePath = GetSettingsFilePath(); + Version = AssemblyManager.Current.Version.ToString() + }; + + Save(); + } - if (File.Exists(filePath) && !CommandLineManager.Current.ResetSettings) + /// + /// Method to load the settings (from a file). + /// + public static void Load() + { + var filePath = GetSettingsFilePath(); + var legacyFilePath = GetLegacySettingsFilePath(); + + // Check if JSON file exists + if (File.Exists(filePath)) + { + try { + Log.Info($"Loading settings from: {filePath}"); + Current = DeserializeFromFile(filePath); + Log.Info("Settings loaded successfully."); + + // Reset change tracking Current.SettingsChanged = false; + + return; } - else + catch (Exception ex) { - Current = new SettingsInfo(); + Log.Error($"Failed to load settings from: {filePath}", ex); + + Backup(filePath, + GetSettingsFolderLocation(), + $"{TimestampHelper.GetTimestamp()}_corrupted_{Path.GetFileName(filePath)}"); + + ConfigurationManager.Current.ShowSettingsResetNoteOnStartup = true; } } - - private static SettingsInfo DeserializeFromFile(string filePath) + // Check if legacy XML file exists and migrate it + else if (File.Exists(legacyFilePath)) { - SettingsInfo settingsInfo; + try + { + Log.Info("Legacy XML settings file found. Migrating to JSON format..."); - var xmlSerializer = new XmlSerializer(typeof(SettingsInfo)); + Current = DeserializeFromXmlFile(legacyFilePath); - using (var fileStream = new FileStream(filePath, FileMode.Open)) + Current.SettingsChanged = false; + + // Save in new JSON format + Save(); + + // Create a backup of the legacy XML file and delete the original + Backup(legacyFilePath, + GetSettingsBackupFolderLocation(), + TimestampHelper.GetTimestampFilename(GetLegacySettingsFileName())); + + File.Delete(legacyFilePath); + + Log.Info("Settings migration from XML to JSON completed successfully."); + + return; + } + catch (Exception ex) { - settingsInfo = (SettingsInfo)xmlSerializer.Deserialize(fileStream); + Log.Error($"Failed to load legacy settings from: {legacyFilePath}", ex); + + Backup(legacyFilePath, + GetSettingsFolderLocation(), + $"{TimestampHelper.GetTimestamp()}_corrupted_{Path.GetFileName(legacyFilePath)}"); + + ConfigurationManager.Current.ShowSettingsResetNoteOnStartup = true; } + } + + // Initialize new settings if file does not exist or loading failed + Initialize(); + } + + /// + /// Method to deserialize the settings from a JSON file. + /// + /// Path to the settings file. + /// Settings as . + private static SettingsInfo DeserializeFromFile(string filePath) + { + var jsonString = File.ReadAllText(filePath); + + var settingsInfo = JsonSerializer.Deserialize(jsonString, JsonOptions); + + return settingsInfo; + } + + /// + /// Method to deserialize the settings from a legacy XML file. + /// + /// Path to the XML settings file. + /// Settings as . + [Obsolete("Legacy XML settings are no longer used, but the method is kept for migration purposes.")] + private static SettingsInfo DeserializeFromXmlFile(string filePath) + { + var xmlSerializer = new XmlSerializer(typeof(SettingsInfo)); + + using var fileStream = new FileStream(filePath, FileMode.Open); + + var settingsInfo = xmlSerializer.Deserialize(fileStream) as SettingsInfo; + + return settingsInfo; + } - return settingsInfo; + /// + /// Method to save the currently loaded settings (to a file). + /// + public static void Save() + { + // Create the directory if it does not exist + Directory.CreateDirectory(GetSettingsFolderLocation()); + + // Create backup before modifying + CreateDailyBackupIfNeeded(); + + // Serialize to file + var filePath = GetSettingsFilePath(); + + var jsonString = JsonSerializer.Serialize(Current, JsonOptions); + + File.WriteAllText(filePath, jsonString); + + Log.Info($"Settings saved to {filePath}"); + + // Reset change tracking + Current.SettingsChanged = false; + } + #endregion + + #region Backup + /// + /// Creates a backup of the settings file if a backup has not already been created for the current day. + /// + /// This method checks whether a backup for the current date exists and, if not, creates a new + /// backup of the settings file. It also removes old backups according to the configured maximum number of backups. + /// If the settings file does not exist, no backup is created and a warning is logged. This method is intended to be + /// called as part of a daily maintenance routine. + private static void CreateDailyBackupIfNeeded() + { + // Skip if daily backups are disabled + if (!Current.Settings_IsDailyBackupEnabled) + { + Log.Info("Daily backups are disabled. Skipping backup creation..."); + return; } - public static void Save() + // Skip if settings file doesn't exist yet + if (!File.Exists(GetSettingsFilePath())) { - var location = GetSettingsLocation(); + Log.Warn("Settings file does not exist yet. Skipping backup creation..."); + return; + } - // Create the directory if it does not exist - if (!Directory.Exists(location)) - Directory.CreateDirectory(location); + // Create backup if needed + var currentDate = DateTime.Now.Date; + var lastBackupDate = Current.LastBackup.Date; - SerializeToFile(GetSettingsFilePath()); + if (lastBackupDate < currentDate) + { + Log.Info("Creating daily backup of settings..."); + + // Create backup + Backup(GetSettingsFilePath(), + GetSettingsBackupFolderLocation(), + TimestampHelper.GetTimestampFilename(GetSettingsFileName())); + + // Cleanup old backups + CleanupBackups(GetSettingsBackupFolderLocation(), + GetSettingsFileName(), + Current.Settings_MaximumNumberOfBackups); - // Set the setting changed to false after saving them as file... - Current.SettingsChanged = false; + Current.LastBackup = currentDate; } + } - private static void SerializeToFile(string filePath) - { - var xmlSerializer = new XmlSerializer(typeof(SettingsInfo)); + /// + /// Deletes older backup files in the specified folder to ensure that only the most recent backups, up to the + /// specified maximum, are retained. + /// + /// This method removes the oldest backup files first, keeping only the most recent backups as + /// determined by the timestamp in the filename. It is intended to prevent excessive accumulation of backup files and manage + /// disk space usage. + /// The full path to the directory containing the backup files to be managed. Cannot be null or empty. + /// The file name pattern used to identify backup files for cleanup. + /// The maximum number of backup files to retain. Must be greater than zero. + private static void CleanupBackups(string backupFolderPath, string settingsFileName, int maxBackupFiles) + { + // Extract settings name without extension to match all backup files regardless of extension + // (e.g., "Settings" matches "2025-01-19_Settings.json", "2025-01-19_Settings.xml") + var settingsNameWithoutExtension = Path.GetFileNameWithoutExtension(settingsFileName); - using (var fileStream = new FileStream(filePath, FileMode.Create)) + // Get all backup files for settings (any extension) sorted by timestamp (newest first) + var backupFiles = Directory.GetFiles(backupFolderPath) + .Where(f => { - xmlSerializer.Serialize(fileStream, Current); - } - } - #endregion + var fileName = Path.GetFileName(f); + + // Check if it's a timestamped backup and contains the settings name + return TimestampHelper.IsTimestampedFilename(fileName) && + fileName.Contains($"_{settingsNameWithoutExtension}."); + }) + .OrderByDescending(f => TimestampHelper.ExtractTimestampFromFilename(Path.GetFileName(f))) + .ToList(); + + if (backupFiles.Count > maxBackupFiles) + Log.Info($"Cleaning up old backup files for {settingsNameWithoutExtension}... Found {backupFiles.Count} backups, keeping the most recent {maxBackupFiles}."); - #region Move settings - public static Task MoveSettingsAsync(string targedLocation) + // Delete oldest backups until the maximum number is reached + while (backupFiles.Count > maxBackupFiles) { - return Task.Run(() => MoveSettings(targedLocation)); + var fileToDelete = backupFiles.Last(); + + File.Delete(fileToDelete); + + backupFiles.RemoveAt(backupFiles.Count - 1); + + Log.Info($"Backup deleted: {fileToDelete}"); } + } - private static void MoveSettings(string targedLocation) - { - // Save the current settings - Save(); + /// + /// Creates a backup of the specified settings file in the given backup folder with the provided backup file name. + /// + /// The full path to the settings file to back up. Cannot be null or empty. + /// The directory path where the backup file will be stored. If the directory does not exist, it will be created. + /// The name to use for the backup file within the backup folder. Cannot be null or empty. + private static void Backup(string filePath, string backupFolderPath, string backupFileName) + { + // Create the backup directory if it does not exist + Directory.CreateDirectory(backupFolderPath); - // Create the dircetory and copy the files to the new location - if (!Directory.Exists(targedLocation)) - Directory.CreateDirectory(targedLocation); + // Create the backup file path + var backupFilePath = Path.Combine(backupFolderPath, backupFileName); - var settingsFilePath = GetSettingsFilePath(); + // Copy the current settings file to the backup location + File.Copy(filePath, backupFilePath, true); - // Copy file - File.Copy(settingsFilePath, Path.Combine(targedLocation, GetSettingsFileName()), true); + Log.Info($"Backup created: {backupFilePath}"); + } - // Delete file - File.Delete(settingsFilePath); + #endregion - // Delete folder if it is empty - var settingsLocation = GetSettingsLocation(); + #region Upgrade - if (Directory.GetFiles(settingsLocation).Length == 0 && Directory.GetDirectories(settingsLocation).Length == 0) - Directory.Delete(settingsLocation); - } + /// + /// Method to upgrade the settings. + /// + /// Previous used version. + /// Target version. + public static void Upgrade(Version fromVersion, Version toVersion) + { + Log.Info($"Start settings upgrade from {fromVersion} to {toVersion}..."); + + // Create backup + Backup(GetSettingsFilePath(), + GetSettingsBackupFolderLocation(), + TimestampHelper.GetTimestampFilename(GetSettingsFileName())); + + // 2023.3.7.0 + if (fromVersion < new Version(2023, 3, 7, 0)) + UpgradeTo_2023_3_7_0(); - #endregion + // 2023.4.26.0 + if (fromVersion < new Version(2023, 4, 26, 0)) + UpgradeTo_2023_4_26_0(); + + // 2023.6.27.0 + if (fromVersion < new Version(2023, 6, 27, 0)) + UpgradeTo_2023_6_27_0(); + + // 2023.11.28.0 + if (fromVersion < new Version(2023, 11, 28, 0)) + UpgradeTo_2023_11_28_0(); + + // 2024.11.11.0 + if (fromVersion < new Version(2024, 11, 11, 0)) + UpgradeTo_2024_11_11_0(); + + // 2025.8.11.0 + if (fromVersion < new Version(2025, 8, 11, 0)) + UpgradeTo_2025_8_11_0(); + + // 2026.2.22.0 + if (fromVersion < new Version(2026, 2, 22, 0)) + UpgradeTo_2026_2_22_0(); + + // 2026.7.7.0 + if (fromVersion < new Version(2026, 7, 7, 0)) + UpgradeTo_2026_7_7_0(); + + // Latest + if (fromVersion < toVersion) + UpgradeToLatest(toVersion); + + // Update to the latest version and save + Current.UpgradeDialog_Show = true; + Current.Version = toVersion.ToString(); + + Save(); + + Log.Info("Settings upgrade finished!"); + } - #region Import, Export - public static void Import(string filePath) + /// + /// Method to apply changes for version 2023.3.7.0. + /// + private static void UpgradeTo_2023_3_7_0() + { + Log.Info("Apply update to 2023.3.7.0..."); + + // Add NTP Lookup application + Log.Info("Add new app \"SNTPLookup\"..."); + Current.General_ApplicationList.Add(ApplicationManager.GetDefaultList() + .First(x => x.Name == ApplicationName.SNTPLookup)); + Current.SNTPLookup_SNTPServers = + [.. SNTPServer.GetDefaultList()]; + + // Add IP Scanner custom commands + foreach (var customCommand in from customCommand in IPScannerCustomCommand.GetDefaultList() + let customCommandFound = + Current.IPScanner_CustomCommands.FirstOrDefault(x => x.Name == customCommand.Name) + where customCommandFound == null + select customCommand) { - using (var zipArchive = ZipFile.OpenRead(filePath)) - { - zipArchive.GetEntry(GetSettingsFileName()).ExtractToFile(GetSettingsFilePath(), true); - } + Log.Info($"Add \"{customCommand.Name}\" to \"IPScanner_CustomCommands\"..."); + Current.IPScanner_CustomCommands.Add(customCommand); } - public static void Export(string filePath) + // Add or update Port Scanner port profiles + foreach (var portProfile in PortProfile.GetDefaultList()) { - // Delete existing file - File.Delete(filePath); + var portProfileFound = Current.PortScanner_PortProfiles.FirstOrDefault(x => x.Name == portProfile.Name); - // Create archiv - using (var zipArchive = ZipFile.Open(filePath, ZipArchiveMode.Create)) + if (portProfileFound == null) { - // Copy file - zipArchive.CreateEntryFromFile(GetSettingsFilePath(), GetSettingsFileName(), CompressionLevel.Optimal); + Log.Info($"Add \"{portProfile.Name}\" to \"PortScanner_PortProfiles\"..."); + Current.PortScanner_PortProfiles.Add(portProfile); + } + else if (!portProfile.Ports.Equals(portProfileFound.Ports)) + { + Log.Info($"Update \"{portProfile.Name}\" in \"PortScanner_PortProfiles\"..."); + Current.PortScanner_PortProfiles.Remove(portProfileFound); + Current.PortScanner_PortProfiles.Add(portProfile); } } - #endregion - #region Init, Reset - public static void InitDefault() + // Add new DNS lookup profiles + Log.Info("Init \"DNSLookup_DNSServers_v2\" with default DNS servers..."); + Current.DNSLookup_DNSServers = + [.. DNSServer.GetDefaultList()]; + } + + /// + /// Method to apply changes for version 2023.4.26.0. + /// + private static void UpgradeTo_2023_4_26_0() + { + Log.Info("Apply update to 2023.4.26.0..."); + + // Add SNMP OID profiles + Log.Info("Add SNMP OID profiles..."); + Current.SNMP_OidProfiles = [.. SNMPOIDProfile.GetDefaultList()]; + } + + /// + /// Method to apply changes for version 2023.6.27.0. + /// + private static void UpgradeTo_2023_6_27_0() + { + Log.Info("Apply update to 2023.6.27.0..."); + + // Update Wake on LAN settings + Log.Info($"Update \"WakeOnLAN_Port\" to {GlobalStaticConfiguration.WakeOnLAN_Port}"); + Current.WakeOnLAN_Port = GlobalStaticConfiguration.WakeOnLAN_Port; + } + + /// + /// Method to apply changes for version 2023.11.28.0. + /// + private static void UpgradeTo_2023_11_28_0() + { + Log.Info("Apply upgrade to 2023.11.28.0..."); + + // First run is required due to the new settings + Log.Info("Set \"FirstRun\" to true..."); + Current.WelcomeDialog_Show = true; + + // Add IP geolocation application + Log.Info("Add new app \"IP Geolocation\"..."); + Current.General_ApplicationList.Add(ApplicationManager.GetDefaultList() + .First(x => x.Name == ApplicationName.IPGeolocation)); + + // Add DNS lookup profiles after refactoring + Log.Info("Init \"DNSLookup_DNSServers\" with default DNS servers..."); + Current.DNSLookup_DNSServers = + [.. DNSServer.GetDefaultList()]; + } + + /// + /// Method to apply changes for version 2024.11.11.0. + /// + private static void UpgradeTo_2024_11_11_0() + { + Log.Info("Apply upgrade to 2024.11.11.0..."); + + Log.Info("Reset ApplicationList to default..."); + Current.General_ApplicationList = + [.. ApplicationManager.GetDefaultList()]; + } + + /// + /// Method to apply changes for version 2025.8.11.0. + /// + private static void UpgradeTo_2025_8_11_0() + { + Log.Info("Apply upgrade to 2025.8.11.0..."); + + // Add Hosts editor application + Log.Info("Add new app \"Hosts File Editor\"..."); + + Current.General_ApplicationList.Insert( + ApplicationManager.GetDefaultList().ToList().FindIndex(x => x.Name == ApplicationName.HostsFileEditor), + ApplicationManager.GetDefaultList().First(x => x.Name == ApplicationName.HostsFileEditor)); + } + + /// + /// Method to apply changes for version 2026.2.22.0. + /// + private static void UpgradeTo_2026_2_22_0() + { + Log.Info("Apply upgrade to 2026.2.22.0..."); + + // DNS Lookup + Log.Info("Migrate DNS Lookup settings to new structure..."); + + Current.DNSLookup_SelectedDNSServer_v2 = Current.DNSLookup_SelectedDNSServer?.Name; + + Log.Info($"Selected DNS server set to \"{Current.DNSLookup_SelectedDNSServer_v2}\""); + + // AWS Session Manager + Log.Info("Removing deprecated app \"AWS Session Manager\", if it exists..."); + + var appToRemove = Current.General_ApplicationList + .FirstOrDefault(x => x.Name == ApplicationName.AWSSessionManager); + + if (appToRemove != null) { - // Init new Settings with default data - Current = new SettingsInfo + if (appToRemove.IsDefault) { - SettingsChanged = true - }; + Log.Info("\"AWS Session Manager\" is set as the default app. Setting the new default app to the first visible app..."); + + var newDefaultApp = Current.General_ApplicationList.FirstOrDefault(x => x.IsVisible); + + if (newDefaultApp != null) + { + Log.Info($"Set \"{newDefaultApp.Name}\" as the new default app"); + newDefaultApp.IsDefault = true; + } + else + { + Log.Error("No visible app found to set as the new default app."); + } + } + + Current.General_ApplicationList.Remove(appToRemove); } + } + + /// + /// Method to apply changes for version 2026.7.7.0. + /// + private static void UpgradeTo_2026_7_7_0() + { + Log.Info("Apply upgrade to 2026.7.7.0..."); + + // Add Firewall application + Log.Info($"Add new app {nameof(ApplicationName.Firewall)}."); - public static void Reset() + Current.General_ApplicationList.Insert( + ApplicationManager.GetDefaultList().ToList().FindIndex(x => x.Name == ApplicationName.Firewall), + ApplicationManager.GetDefaultList().First(x => x.Name == ApplicationName.Firewall)); + + // Replace ARPTable with NeighborTable +#pragma warning disable CS0618 + var arpTableEntry = Current.General_ApplicationList.FirstOrDefault(x => x.Name == ApplicationName.ARPTable); +#pragma warning restore CS0618 + + if (arpTableEntry != null) { - InitDefault(); + Log.Info("Replacing obsolete \"ARPTable\" app entry with \"NeighborTable\"..."); + + var index = Current.General_ApplicationList.IndexOf(arpTableEntry); + var neighborTableEntry = ApplicationManager.GetDefaultList().First(x => x.Name == ApplicationName.NeighborTable); - // Save manually, settings are not saved on a forced restart... - Save(); + neighborTableEntry.IsVisible = arpTableEntry.IsVisible; + neighborTableEntry.IsDefault = arpTableEntry.IsDefault; + + Current.General_ApplicationList[index] = neighborTableEntry; } - #endregion - #endregion + + // IP Scanner - Custom commands + Log.Info("Migrating IP Scanner custom command placeholder syntax from \"$$var$$\" to \"{{Var}}\"..."); + + foreach (var customCommand in Current.IPScanner_CustomCommands) + { + var filePath = customCommand.FilePath; + + if (!string.IsNullOrEmpty(filePath)) + { + filePath = Regex.Replace(filePath, "\\$\\$ipaddress\\$\\$", "{{IPAddress}}", RegexOptions.IgnoreCase); + filePath = Regex.Replace(filePath, "\\$\\$hostname\\$\\$", "{{Hostname}}", RegexOptions.IgnoreCase); + } + + var arguments = customCommand.Arguments; + + if (!string.IsNullOrEmpty(arguments)) + { + arguments = Regex.Replace(arguments, "\\$\\$ipaddress\\$\\$", "{{IPAddress}}", RegexOptions.IgnoreCase); + arguments = Regex.Replace(arguments, "\\$\\$hostname\\$\\$", "{{Hostname}}", RegexOptions.IgnoreCase); + } + + if (filePath == customCommand.FilePath && arguments == customCommand.Arguments) + continue; + + Log.Info($"Migrated custom command \"{customCommand.Name}\"..."); + + customCommand.FilePath = filePath; + customCommand.Arguments = arguments; + } + } + + /// + /// Method to apply changes for the latest version. + /// + /// Latest version. + private static void UpgradeToLatest(Version version) + { + Log.Info($"Apply upgrade to {version}..."); } -} \ No newline at end of file + #endregion +} diff --git a/Source/NETworkManager.Settings/SettingsName.cs b/Source/NETworkManager.Settings/SettingsName.cs new file mode 100644 index 0000000000..e54842d6c2 --- /dev/null +++ b/Source/NETworkManager.Settings/SettingsName.cs @@ -0,0 +1,33 @@ +namespace NETworkManager.Settings; + +public enum SettingsName +{ + General, + Window, + Appearance, + Language, + Network, + Status, + HotKeys, + Autostart, + Update, + Profiles, + Settings, + Dashboard, + NetworkInterface, + IPScanner, + PortScanner, + PingMonitor, + Traceroute, + DNSLookup, + RemoteDesktop, + PowerShell, + PuTTY, + TigerVNC, + WebConsole, + SNMP, + SNTPLookup, + Firewall, + WakeOnLAN, + BitCalculator, +} \ No newline at end of file diff --git a/Source/NETworkManager.Settings/SettingsViewGroup.cs b/Source/NETworkManager.Settings/SettingsViewGroup.cs deleted file mode 100644 index 3219f1401e..0000000000 --- a/Source/NETworkManager.Settings/SettingsViewGroup.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace NETworkManager.Settings -{ - public enum SettingsViewGroup - { - General, - Applications - } -} diff --git a/Source/NETworkManager.Settings/SettingsViewInfo.cs b/Source/NETworkManager.Settings/SettingsViewInfo.cs index 98bec38395..791c01eef6 100644 --- a/Source/NETworkManager.Settings/SettingsViewInfo.cs +++ b/Source/NETworkManager.Settings/SettingsViewInfo.cs @@ -1,32 +1,63 @@ using System.Windows; using System.Windows.Controls; -namespace NETworkManager.Settings +namespace NETworkManager.Settings; + +/// +/// Represents the view information for a settings item, including its name, icon, and associated group. +/// +/// This class provides constructors to initialize the settings view with either a Canvas icon or a +/// UIElement. The icon is displayed in the settings interface, and the group categorizes the settings item. +public class SettingsViewInfo { - public class SettingsViewInfo + /// + /// Initializes a new instance of the SettingsViewInfo class with the specified settings view name, icon, and group. + /// + /// The name of the settings view to associate with this instance. Must be a valid value from the SettingsName + /// enumeration. + /// The icon to display for the settings view. Represents a graphical element of type Canvas. + /// The group to which the settings view belongs. Must be a valid value from the SettingsGroup enumeration. + public SettingsViewInfo(SettingsName name, Canvas icon, SettingsGroup group) + { + Name = name; + Icon = icon; + Group = group; + } + + /// + /// Initializes a new instance of the SettingsViewInfo class with the specified settings name, UI element, and + /// settings group. + /// + /// The UI element is added to a Canvas, which serves as the container for the settings view's + /// visual representation. + /// The name of the settings, represented by the SettingsName enumeration. + /// The UI element to be displayed within the settings view. + /// The group to which this settings view belongs, represented by the SettingsGroup enumeration. + public SettingsViewInfo(SettingsName name, UIElement uiElement, SettingsGroup group) { - public SettingsViewName Name { get; set; } - public Canvas Icon { get; set; } - public SettingsViewGroup Group { get; set; } + Name = name; + var canvas = new Canvas(); + canvas.Children.Add(uiElement); + Icon = canvas; + Group = group; + } - public SettingsViewInfo() - { - } + /// + /// Gets or sets the name of the settings. + /// + public SettingsName Name { get; set; } - public SettingsViewInfo(SettingsViewName name, Canvas icon, SettingsViewGroup group) - { - Name = name; - Icon = icon; - Group = group; - } + /// + /// Gets or sets the icon displayed on the canvas. + /// + /// This property allows customization of the visual representation of the canvas. The icon can + /// be used to convey additional information or branding associated with the canvas content. + public Canvas Icon { get; set; } - public SettingsViewInfo(SettingsViewName name, UIElement uiElement, SettingsViewGroup group) - { - Name = name; - var canvas = new Canvas(); - canvas.Children.Add(uiElement); - Icon = canvas; - Group = group; - } - } -} \ No newline at end of file + /// + /// Gets or sets the settings group associated with the current configuration. + /// + /// This property allows for categorizing settings into distinct groups, facilitating better + /// organization and management of configuration options. + public SettingsGroup Group { get; set; } +} diff --git a/Source/NETworkManager.Settings/SettingsViewManager.cs b/Source/NETworkManager.Settings/SettingsViewManager.cs index 03fa9fa8d7..7843409dff 100644 --- a/Source/NETworkManager.Settings/SettingsViewManager.cs +++ b/Source/NETworkManager.Settings/SettingsViewManager.cs @@ -1,41 +1,82 @@ -using MahApps.Metro.IconPacks; +using System.Collections.Generic; +using MahApps.Metro.IconPacks; using NETworkManager.Models; -using System.Collections.Generic; -namespace NETworkManager.Settings +namespace NETworkManager.Settings; + +/// +/// Provides access to a categorized list of all available settings views for the application. +/// +/// The settings views are grouped into general and application-specific categories, each represented by +/// a SettingsViewInfo object containing the view's name, icon, and group classification. This class is intended to +/// facilitate configuration and display of settings within the application. +public static class SettingsViewManager { - public static class SettingsViewManager - { - // List of all applications - public static List List => new List - { - // General - new SettingsViewInfo(SettingsViewName.General, new PackIconMaterial{ Kind = PackIconMaterialKind.Layers }, SettingsViewGroup.General), - new SettingsViewInfo(SettingsViewName.Window, new PackIconPicolIcons { Kind = PackIconPicolIconsKind.BrowserWindow }, SettingsViewGroup.General), - new SettingsViewInfo(SettingsViewName.Appearance, new PackIconMaterial { Kind = PackIconMaterialKind.Palette }, SettingsViewGroup.General), - new SettingsViewInfo(SettingsViewName.Language, new PackIconMaterial { Kind = PackIconMaterialKind.Translate }, SettingsViewGroup.General), - new SettingsViewInfo(SettingsViewName.Status, new PackIconModern { Kind = PackIconModernKind.Network }, SettingsViewGroup.General), - new SettingsViewInfo(SettingsViewName.HotKeys, new PackIconOcticons { Kind = PackIconOcticonsKind.Keyboard }, SettingsViewGroup.General), - new SettingsViewInfo(SettingsViewName.Autostart, new PackIconMaterial { Kind = PackIconMaterialKind.Power }, SettingsViewGroup.General), - new SettingsViewInfo(SettingsViewName.Update, new PackIconMaterialLight { Kind = PackIconMaterialLightKind.Download }, SettingsViewGroup.General), - new SettingsViewInfo(SettingsViewName.Profiles, new PackIconMaterial { Kind = PackIconMaterialKind.FormatListBulletedType }, SettingsViewGroup.General), - new SettingsViewInfo(SettingsViewName.Settings, new PackIconMaterialLight { Kind = PackIconMaterialLightKind.Cog }, SettingsViewGroup.General), - - // Applications - new SettingsViewInfo(SettingsViewName.Dashboard, ApplicationManager.GetIcon(ApplicationName.Dashboard), SettingsViewGroup.Applications), - new SettingsViewInfo(SettingsViewName.IPScanner, ApplicationManager.GetIcon(ApplicationName.IPScanner), SettingsViewGroup.Applications), - new SettingsViewInfo(SettingsViewName.PortScanner, ApplicationManager.GetIcon(ApplicationName.PortScanner), SettingsViewGroup.Applications), - new SettingsViewInfo(SettingsViewName.PingMonitor, ApplicationManager.GetIcon(ApplicationName.PingMonitor), SettingsViewGroup.Applications), - new SettingsViewInfo(SettingsViewName.Traceroute, ApplicationManager.GetIcon(ApplicationName.Traceroute), SettingsViewGroup.Applications), - new SettingsViewInfo(SettingsViewName.DNSLookup, ApplicationManager.GetIcon(ApplicationName.DNSLookup), SettingsViewGroup.Applications ), - new SettingsViewInfo(SettingsViewName.RemoteDesktop, ApplicationManager.GetIcon(ApplicationName.RemoteDesktop), SettingsViewGroup.Applications), - new SettingsViewInfo(SettingsViewName.PowerShell, ApplicationManager.GetIcon(ApplicationName.PowerShell), SettingsViewGroup.Applications), - new SettingsViewInfo(SettingsViewName.PuTTY, ApplicationManager.GetIcon(ApplicationName.PuTTY), SettingsViewGroup.Applications), - new SettingsViewInfo(SettingsViewName.TigerVNC, ApplicationManager.GetIcon(ApplicationName.TigerVNC), SettingsViewGroup.Applications), - new SettingsViewInfo(SettingsViewName.SNMP, ApplicationManager.GetIcon(ApplicationName.SNMP), SettingsViewGroup.Applications), - new SettingsViewInfo(SettingsViewName.WakeOnLAN, ApplicationManager.GetIcon(ApplicationName.WakeOnLAN), SettingsViewGroup.Applications), - // new SettingsViewInfo(SettingsViewName.Whois, ApplicationManager.GetIcon(ApplicationName.Whois), SettingsViewGroup.Applications) - }; - } -} + /// + /// Gets a static, categorized list of available settings view information for the application. + /// + /// The collection includes both general and application-specific settings, each represented by a + /// SettingsViewInfo object containing the setting's name, icon, and group. This list enables easy access to + /// configuration options and is intended for use in settings navigation or display scenarios. + public static List List => + [ + // General + new(SettingsName.General, new PackIconModern { Kind = PackIconModernKind.Layer }, + SettingsGroup.General), + new(SettingsName.Window, new PackIconOcticons { Kind = PackIconOcticonsKind.Browser }, + SettingsGroup.General), + new(SettingsName.Appearance, new PackIconMaterial { Kind = PackIconMaterialKind.Palette }, + SettingsGroup.General), + new(SettingsName.Language, new PackIconMaterial { Kind = PackIconMaterialKind.Translate }, + SettingsGroup.General), + new(SettingsName.Network, new PackIconModern { Kind = PackIconModernKind.Network }, + SettingsGroup.General), + new(SettingsName.Status, new PackIconMaterial { Kind = PackIconMaterialKind.Pulse }, + SettingsGroup.General), + new(SettingsName.HotKeys, + new PackIconFontAwesome { Kind = PackIconFontAwesomeKind.KeyboardRegular }, + SettingsGroup.General), + new(SettingsName.Autostart, new PackIconMaterial { Kind = PackIconMaterialKind.Power }, + SettingsGroup.General), + new(SettingsName.Update, + new PackIconMaterial { Kind = PackIconMaterialKind.RocketLaunchOutline }, SettingsGroup.General), + new(SettingsName.Profiles, + new PackIconFontAwesome { Kind = PackIconFontAwesomeKind.ServerSolid }, SettingsGroup.General), + new(SettingsName.Settings, new PackIconMaterialLight { Kind = PackIconMaterialLightKind.Cog }, + SettingsGroup.General), + // Applications + new(SettingsName.Dashboard, ApplicationManager.GetIcon(ApplicationName.Dashboard), + SettingsGroup.Application), + new(SettingsName.NetworkInterface, ApplicationManager.GetIcon(ApplicationName.NetworkInterface), + SettingsGroup.Application), + new(SettingsName.IPScanner, ApplicationManager.GetIcon(ApplicationName.IPScanner), + SettingsGroup.Application), + new(SettingsName.PortScanner, ApplicationManager.GetIcon(ApplicationName.PortScanner), + SettingsGroup.Application), + new(SettingsName.PingMonitor, ApplicationManager.GetIcon(ApplicationName.PingMonitor), + SettingsGroup.Application), + new(SettingsName.Traceroute, ApplicationManager.GetIcon(ApplicationName.Traceroute), + SettingsGroup.Application), + new(SettingsName.DNSLookup, ApplicationManager.GetIcon(ApplicationName.DNSLookup), + SettingsGroup.Application), + new(SettingsName.RemoteDesktop, ApplicationManager.GetIcon(ApplicationName.RemoteDesktop), + SettingsGroup.Application), + new(SettingsName.PowerShell, ApplicationManager.GetIcon(ApplicationName.PowerShell), + SettingsGroup.Application), + new(SettingsName.PuTTY, ApplicationManager.GetIcon(ApplicationName.PuTTY), + SettingsGroup.Application), + new(SettingsName.TigerVNC, ApplicationManager.GetIcon(ApplicationName.TigerVNC), + SettingsGroup.Application), + new(SettingsName.WebConsole, ApplicationManager.GetIcon(ApplicationName.WebConsole), + SettingsGroup.Application), + new(SettingsName.SNMP, ApplicationManager.GetIcon(ApplicationName.SNMP), + SettingsGroup.Application), + new(SettingsName.SNTPLookup, ApplicationManager.GetIcon(ApplicationName.SNTPLookup), + SettingsGroup.Application), + new(SettingsName.WakeOnLAN, ApplicationManager.GetIcon(ApplicationName.WakeOnLAN), + SettingsGroup.Application), + new(SettingsName.BitCalculator, ApplicationManager.GetIcon(ApplicationName.BitCalculator), + SettingsGroup.Application), + ]; +} diff --git a/Source/NETworkManager.Settings/SettingsViewName.cs b/Source/NETworkManager.Settings/SettingsViewName.cs deleted file mode 100644 index bfba865f8c..0000000000 --- a/Source/NETworkManager.Settings/SettingsViewName.cs +++ /dev/null @@ -1,29 +0,0 @@ -namespace NETworkManager.Settings -{ - public enum SettingsViewName - { - General, - Window, - Appearance, - Language, - Status, - HotKeys, - Autostart, - Update, - Profiles, - Settings, - Dashboard, - IPScanner, - PortScanner, - PingMonitor, - Traceroute, - DNSLookup, - RemoteDesktop, - PowerShell, - PuTTY, - TigerVNC, - SNMP, - WakeOnLAN, - Whois - } -} diff --git a/Source/NETworkManager.Settings/ThemeColorInfo.cs b/Source/NETworkManager.Settings/ThemeColorInfo.cs deleted file mode 100644 index 639a5295bf..0000000000 --- a/Source/NETworkManager.Settings/ThemeColorInfo.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace NETworkManager.Settings -{ - /// - /// Class contains informations about MahApps.Metro themes. - /// - public class ThemeColorInfo : BaseColorInfo - { - } -} diff --git a/Source/NETworkManager.Settings/Themes/Dark.Accent1.xaml b/Source/NETworkManager.Settings/Themes/Dark.Accent1.xaml new file mode 100644 index 0000000000..e793779b76 --- /dev/null +++ b/Source/NETworkManager.Settings/Themes/Dark.Accent1.xaml @@ -0,0 +1,821 @@ + + + + Dark.Accent1 + MahAppsMetroThemesSample + Accent1 (Dark) + Dark + Accent1 + #FFD80073 + + + + + + + + #FF9F0055 + #FFD80073 + + #CCD80073 + + #99D80073 + + #66D80073 + + #33D80073 + + + #FFFFFFFF + #FF000000 + White + + #FFF9F9F9 + #FF7F7F7F + #FF9D9D9D + #FFA59F93 + #FFB9B9B9 + #FFCCCCCC + #FF7E7E7E + #FF454545 + #5EC9C9C9 + #FF2F2F2F + + #FF7D7D7D + #FFAAAAAA + #40808080 + + #FF2B2B2B + + + #33878787 + #33959595 + #4C000000 + #4C000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #FFFFFFFF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #FFF0A30A + + #FF000000 + #33000000 + #99000000 + #CC000000 + #66000000 + #FFFFFFFF + #33FFFFFF + #99FFFFFF + #CCFFFFFF + #66FFFFFF + #FFF2F2F2 + #FF000000 + #33000000 + #66000000 + #CC000000 + #FF333333 + #FF858585 + #FF767676 + #FF171717 + #FF1F1F1F + #FF2B2B2B + #FFFFFFFF + #FF767676 + #19FFFFFF + #33FFFFFF + #FFF000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/NETworkManager.Settings/Themes/Dark.Accent2.xaml b/Source/NETworkManager.Settings/Themes/Dark.Accent2.xaml new file mode 100644 index 0000000000..ab7e759c9f --- /dev/null +++ b/Source/NETworkManager.Settings/Themes/Dark.Accent2.xaml @@ -0,0 +1,819 @@ + + + + Dark.Accent2 + MahAppsMetroThemesSample + Accent2 (Dark) + Dark + Accent2 + #FFFA6800 + + + + + + + + #FFB94C00 + #FFFA6800 + + #CCFA6800 + + #99FA6800 + + #66FA6800 + + #33FA6800 + + + #CCCCCC + #323232 + White + + #FFF9F9F9 + #FF7F7F7F + #FF9D9D9D + #FFA59F93 + #FFB9B9B9 + #FFCCCCCC + #FF7E7E7E + #FF454545 + #5EC9C9C9 + #FF2F2F2F + + #FF7D7D7D + #FFAAAAAA + #40808080 + + #FF2B2B2B + + + #33878787 + #33959595 + #4C000000 + #4C000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #FFFFFFFF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #FFF0A30A + + #FF000000 + #33000000 + #99000000 + #CC000000 + #66000000 + #FFFFFFFF + #33FFFFFF + #99FFFFFF + #CCFFFFFF + #66FFFFFF + #FFF2F2F2 + #FF000000 + #33000000 + #66000000 + #CC000000 + #FF333333 + #FF858585 + #FF767676 + #FF171717 + #FF1F1F1F + #FF2B2B2B + #FFFFFFFF + #FF767676 + #19FFFFFF + #33FFFFFF + #FFF000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/NETworkManager.Settings/Themes/Light.Accent1.xaml b/Source/NETworkManager.Settings/Themes/Light.Accent1.xaml new file mode 100644 index 0000000000..9dc79fc25c --- /dev/null +++ b/Source/NETworkManager.Settings/Themes/Light.Accent1.xaml @@ -0,0 +1,821 @@ + + + + Light.Accent1 + MahAppsMetroThemesSample + Accent1 (Light) + Light + Accent1 + #FFD80073 + + + + + + + + #FF9F0055 + #FFD80073 + + #CCD80073 + + #99D80073 + + #66D80073 + + #33D80073 + + + #FF000000 + #FFFFFFFF + White + + #FF333333 + #FF7F7F7F + #FF9D9D9D + #FFA59F93 + #FFB9B9B9 + #FFCCCCCC + #FFD8D8D9 + #FFE0E0E0 + #5EC9C9C9 + #FFF7F7F7 + + #FFBEBEBE + #FF333333 + #40808080 + + #FFFFFFFF + + + #33878787 + #33959595 + #4C000000 + #4C000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #FF000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #FFF0A30A + + #FFFFFFFF + #33FFFFFF + #99FFFFFF + #CCFFFFFF + #66FFFFFF + #FF000000 + #33000000 + #99000000 + #CC000000 + #66000000 + #FF171717 + #FF000000 + #33000000 + #66000000 + #CC000000 + #FFCCCCCC + #FF7A7A7A + #FFCCCCCC + #FFF2F2F2 + #FFE6E6E6 + #FFF2F2F2 + #FFFFFFFF + #FF767676 + #19000000 + #33000000 + #C50500 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/NETworkManager.Settings/Themes/Light.Accent2.xaml b/Source/NETworkManager.Settings/Themes/Light.Accent2.xaml new file mode 100644 index 0000000000..6c81e177e5 --- /dev/null +++ b/Source/NETworkManager.Settings/Themes/Light.Accent2.xaml @@ -0,0 +1,821 @@ + + + + Light.Accent2 + MahAppsMetroThemesSample + Accent2 (Light) + Light + Accent2 + #FFFA6800 + + + + + + + + #FFB94C00 + #FFFA6800 + + #CCFA6800 + + #99FA6800 + + #66FA6800 + + #33FA6800 + + + #191919 + #ECECEC + White + + #FF333333 + #FF7F7F7F + #FF9D9D9D + #FFA59F93 + #FFB9B9B9 + #FFCCCCCC + #FFD8D8D9 + #FFE0E0E0 + #5EC9C9C9 + #FFF7F7F7 + + #FFBEBEBE + #FF333333 + #40808080 + + #FFFFFFFF + + + #33878787 + #33959595 + #4C000000 + #4C000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #FF000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #FFF0A30A + + #FFFFFFFF + #33FFFFFF + #99FFFFFF + #CCFFFFFF + #66FFFFFF + #FF000000 + #33000000 + #99000000 + #CC000000 + #66000000 + #FF171717 + #FF000000 + #33000000 + #66000000 + #CC000000 + #FFCCCCCC + #FF7A7A7A + #FFCCCCCC + #FFF2F2F2 + #FFE6E6E6 + #FFF2F2F2 + #FFFFFFFF + #FF767676 + #19000000 + #33000000 + #C50500 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/NETworkManager.Settings/app.config b/Source/NETworkManager.Settings/app.config deleted file mode 100644 index 7ae6dfeca4..0000000000 --- a/Source/NETworkManager.Settings/app.config +++ /dev/null @@ -1,18 +0,0 @@ - - - - -
- - - - - - - - - True - - - - \ No newline at end of file diff --git a/Source/NETworkManager.Settings/config.json.example b/Source/NETworkManager.Settings/config.json.example new file mode 100644 index 0000000000..2bf8307cfb --- /dev/null +++ b/Source/NETworkManager.Settings/config.json.example @@ -0,0 +1,5 @@ +{ + "Update_CheckForUpdatesAtStartup": false, + "Profiles_FolderLocation": "\\\\Server\\Shared\\NETworkManager\\Profiles", + "Settings_FolderLocation": "%UserProfile%\\NETworkManager\\Settings" +} \ No newline at end of file diff --git a/Source/NETworkManager.Setup/Components.wxs b/Source/NETworkManager.Setup/Components.wxs new file mode 100644 index 0000000000..780c227a44 --- /dev/null +++ b/Source/NETworkManager.Setup/Components.wxs @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/NETworkManager.Setup/Folders.wxs b/Source/NETworkManager.Setup/Folders.wxs new file mode 100644 index 0000000000..9ed4dd7432 --- /dev/null +++ b/Source/NETworkManager.Setup/Folders.wxs @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Source/NETworkManager.Setup/NETworkManager.Setup.wixproj b/Source/NETworkManager.Setup/NETworkManager.Setup.wixproj new file mode 100644 index 0000000000..b72b419617 --- /dev/null +++ b/Source/NETworkManager.Setup/NETworkManager.Setup.wixproj @@ -0,0 +1,19 @@ + + + + ICE69 + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/NETworkManager.Setup/Package.en-us.wxl b/Source/NETworkManager.Setup/Package.en-us.wxl new file mode 100644 index 0000000000..7fa02fa558 --- /dev/null +++ b/Source/NETworkManager.Setup/Package.en-us.wxl @@ -0,0 +1,8 @@ + + + + + + diff --git a/Source/NETworkManager.Setup/Package.wxs b/Source/NETworkManager.Setup/Package.wxs new file mode 100644 index 0000000000..94da282346 --- /dev/null +++ b/Source/NETworkManager.Setup/Package.wxs @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/NETworkManager.Setup/Resources/LICENSE.rtf b/Source/NETworkManager.Setup/Resources/LICENSE.rtf new file mode 100644 index 0000000000..0a7b5e34ab --- /dev/null +++ b/Source/NETworkManager.Setup/Resources/LICENSE.rtf @@ -0,0 +1,265 @@ +{\rtf1\ansi\ansicpg1252\deff0\nouicompat{\fonttbl{\f0\fnil\fcharset0 Courier New;}} +{\colortbl ;\red0\green0\blue255;} +{\*\generator Riched20 10.0.22621}\viewkind4\uc1 +\pard\f0\fs18\lang1031 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007\par +\par +\par +Copyright (C) 2007 Free Software Foundation, Inc. <{{\field{\*\fldinst{HYPERLINK "https://fsf.org/"}}{\fldrslt{https://fsf.org/\ul0\cf0}}}}\f0\fs18 >\par +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.\par +\par +\par +PREAMBLE\par +\par +The GNU General Public License is a free, copyleft license for software and other kinds of works.\par +\par +The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to\par +your programs, too.\par +\par +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.\par +\par +To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.\par +\par +For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.\par +\par +Developers that use the GNU GPL protect your rights with two steps:\par +(1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.\par +For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.\par +\par +Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.\par +\par +Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.\par +\par +The precise terms and conditions for copying, distribution and modification follow.\par +\par +\par +TERMS AND CONDITIONS\par +\par +0. Definitions.\par +\par +"This License" refers to version 3 of the GNU General Public License.\par +\par +"Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.\par +\par +"The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations.\par +\par +To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work.\par +\par +\par +A "covered work" means either the unmodified Program or a work based on the Program.\par +\par +To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the\par +public, and in some countries other activities as well.\par +\par +To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.\par +\par +An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.\par +\par +1. Source Code.\par +\par +The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work.\par +\par +A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.\par +\par +The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.\par +\par +The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.\par +\par +The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.\par +\par +The Corresponding Source for a work in source code form is that same work.\par +\par +2. Basic Permissions.\par +\par +All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your\par +rights of fair use or other equivalent, as provided by copyright law.\par +\par +You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works\par +for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.\par +\par +Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.\par +\par +3. Protecting Users' Legal Rights From Anti-Circumvention Law.\par +\par +No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.\par +\par +When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.\par +\par +4. Conveying Verbatim Copies.\par +\par +You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code;\par +keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.\par +\par +You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.\par +\par +5. Conveying Modified Source Versions.\par +\par +You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:\par +\par +a)\tab The work must carry prominent notices stating that you modified it, and giving a relevant date.\par +b)\tab The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices".\par +c)\tab You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.\par +d)\tab If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.\par +A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.\par +\par +6. Conveying Non-Source Forms.\par +\par +You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:\par +\par +a)\tab Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.\par +b)\tab Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.\par +c)\tab Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.\par +d)\tab Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.\par +e)\tab Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.\par + \par +A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.\par +\par +A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.\par +\par +"Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.\par +\par +If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the\par +Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).\par +\par +The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.\par +\par +Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.\par +\par +7. Additional Terms.\par +\par +"Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately\par +under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.\par +\par +When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.\par +\par +Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:\par +\par +e)\tab Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or\par +b)\tab Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or\par +c)\tab Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or\par +d)\tab Limiting the use for publicity purposes of names of licensors or authors of the material; or\par +e)\tab Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or\par +f)\tab Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.\par +\par +All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains\par +a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.\par +\par +If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.\par +\par +Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.\par +\par +8. Termination.\par +\par +You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).\par +\par +However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means\par +prior to 60 days after the cessation.\par +\par +Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.\par +\par +Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.\par +\par +9. Acceptance Not Required for Having Copies.\par +\par +You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do\par +not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.\par +\par +10. Automatic Licensing of Downstream Recipients.\par +\par +Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.\par +\par +An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever\par +licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.\par +\par +You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that\par +any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.\par +\par +11. Patents.\par +\par +A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version".\par +\par +A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a\par +consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.\par +\par +Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.\par +\par +In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.\par +\par +If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the\par +patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that\par +country that you have reason to believe are valid.\par +\par +If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered\par +work and works based on it.\par +\par +A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is\par +in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work\par +conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.\par +\par +Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.\par +\par +12. No Surrender of Others' Freedom.\par +\par +If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.\par +\par +13. Use with the GNU Affero General Public License.\par +\par +Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the\par +combination as such.\par +\par +14. Revised Versions of this License.\par +\par +The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.\par +\par +Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.\par +\par +If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.\par +\par +Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.\par +\par +15. Disclaimer of Warranty.\par +\par +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\par +\par +16. Limitation of Liability.\par +\par +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\par +\par +17. Interpretation of Sections 15 and 16.\par +\par +If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.\par +\par +END OF TERMS AND CONDITIONS\par +\par +\par +How to Apply These Terms to Your New Programs\par +\par +If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.\par +\par +To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.\par +\par +\par +Copyright (C) \par +\par +This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\par +\par +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\par +\par +You should have received a copy of the GNU General Public License along with this program. If not, see <{{\field{\*\fldinst{HYPERLINK "https://www.gnu.org/licenses/"}}{\fldrslt{https://www.gnu.org/licenses/\ul0\cf0}}}}\f0\fs18 >.\par +\par +Also add information on how to contact you by electronic and paper mail.\par +\par +If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:\par +\par + Copyright (C) \par +This program comes with ABSOLUTELY NO WARRANTY; for details type `show\'c2\~w'.\par +This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.\par +\par +The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box".\par +\par +You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary.\par +For more information on this, and how to apply and follow the GNU GPL, see <{{\field{\*\fldinst{HYPERLINK "https://www.gnu.org/licenses/"}}{\fldrslt{https://www.gnu.org/licenses/\ul0\cf0}}}}\f0\fs18 >.\par +\par +The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read <{{\field{\*\fldinst{HYPERLINK "https://www.gnu.org/licenses/why-not-lgpl.html"}}{\fldrslt{https://www.gnu.org/licenses/why-not-lgpl.html\ul0\cf0}}}}\f0\fs18 >.\par +\par +} + \ No newline at end of file diff --git a/Source/NETworkManager.Setup/Resources/WixUIBanner.png b/Source/NETworkManager.Setup/Resources/WixUIBanner.png new file mode 100644 index 0000000000..d569da5534 Binary files /dev/null and b/Source/NETworkManager.Setup/Resources/WixUIBanner.png differ diff --git a/Source/NETworkManager.Setup/Resources/WixUIDialog.png b/Source/NETworkManager.Setup/Resources/WixUIDialog.png new file mode 100644 index 0000000000..5214f18590 Binary files /dev/null and b/Source/NETworkManager.Setup/Resources/WixUIDialog.png differ diff --git a/Source/NETworkManager.Update/NETworkManager.Update.csproj b/Source/NETworkManager.Update/NETworkManager.Update.csproj index 39f2a8cd28..893d354c45 100644 --- a/Source/NETworkManager.Update/NETworkManager.Update.csproj +++ b/Source/NETworkManager.Update/NETworkManager.Update.csproj @@ -1,26 +1,21 @@ - - - {008467AF-D83F-4B1E-8733-B65136F595F2} - Library - Properties - NETworkManager.Update - NETworkManager.Update - net6.0-windows10.0.17763.0 - win10-x64 - false - true - false - - - - - - - - - - - - \ No newline at end of file + + + {008467AF-D83F-4B1E-8733-B65136F595F2} + Library + Properties + NETworkManager.Update + NETworkManager.Update + net10.0-windows10.0.22621.0 + false + true + false + false + + + + + + + + + diff --git a/Source/NETworkManager.Update/Properties/AssemblyInfo.cs b/Source/NETworkManager.Update/Properties/AssemblyInfo.cs index b5c5bb26b1..8defd699ce 100644 --- a/Source/NETworkManager.Update/Properties/AssemblyInfo.cs +++ b/Source/NETworkManager.Update/Properties/AssemblyInfo.cs @@ -4,7 +4,5 @@ [assembly: AssemblyTitle("NETworkManager.Update")] [assembly: AssemblyDescription("Library contains NETworkManager update.")] [assembly: AssemblyProduct("NETworkManager.Update")] - [assembly: ComVisible(false)] - [assembly: Guid("008467af-d83f-4b1e-8733-b65136f595f2")] \ No newline at end of file diff --git a/Source/NETworkManager.Update/UpdateAvailableArgs.cs b/Source/NETworkManager.Update/UpdateAvailableArgs.cs index 24f0c43226..ec53bd6296 100644 --- a/Source/NETworkManager.Update/UpdateAvailableArgs.cs +++ b/Source/NETworkManager.Update/UpdateAvailableArgs.cs @@ -1,24 +1,24 @@ using System; +using Octokit; -namespace NETworkManager.Update +namespace NETworkManager.Update; + +/// +/// Contains informations about a program update. +/// +public class UpdateAvailableArgs : EventArgs { /// - /// Contains informations about a program update. + /// Initializes a new instance of the class with parameters. /// - public class UpdateAvailableArgs : EventArgs + /// Release of the program update. + public UpdateAvailableArgs(Release release) { - /// - /// Version of the program update. - /// - public Version Version { get; private set; } - - /// - /// Initializes a new instance of the class and passes the as paramter. - /// - /// Version of the program update. - public UpdateAvailableArgs(Version version) - { - Version = version; - } + Release = release; } -} + + /// + /// Release of the program update. + /// + public Release Release { get; private set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Update/Updater.cs b/Source/NETworkManager.Update/Updater.cs index 34d72e10ac..7f840af7f4 100644 --- a/Source/NETworkManager.Update/Updater.cs +++ b/Source/NETworkManager.Update/Updater.cs @@ -1,85 +1,105 @@ using System; using System.Threading.Tasks; +using log4net; using Octokit; -namespace NETworkManager.Update +namespace NETworkManager.Update; + +/// +/// Updater to check if a new program version is available. +/// +public sealed class Updater { + private static readonly ILog Log = LogManager.GetLogger(typeof(Updater)); + + #region Methods + /// - /// Updater to check if a new program version is available. + /// Checks on GitHub whether a new version of the program is available /// - public class Updater + /// GitHub username like "BornToBeRoot". + /// GitHub repository like "NETworkManager". + /// Version like 1.2.0.0. + /// Include pre-release versions + public void CheckOnGitHub(string userName, string projectName, Version currentVersion, bool includePreRelease) { - #region Events - /// - /// Is triggered when update check is complete and an update is available. - /// - public event EventHandler UpdateAvailable; - - /// - /// Triggers the event. - /// - /// Passes to the event. - protected virtual void OnUpdateAvailable(UpdateAvailableArgs e) - { - UpdateAvailable?.Invoke(this, e); - } - - /// - /// Is triggered when update check is complete and no update is available. - /// - public event EventHandler NoUpdateAvailable; - - /// - /// Triggers the event. - /// - protected virtual void OnNoUpdateAvailable() - { - NoUpdateAvailable?.Invoke(this, EventArgs.Empty); - } - - /// - /// Is triggered when an error occurs during the update check. - /// - public event EventHandler Error; - - /// - /// Triggers the event. - /// - protected virtual void OnError() + Task.Run(() => { - Error?.Invoke(this, EventArgs.Empty); - } - #endregion - - #region Methods - /// - /// Checks on GitHub whether a new version of the program is available - /// - /// GitHub username like "BornToBeRoot". - /// GitHub repository like "NETworkManager". - /// Version like 1.2.0.0. - public void CheckOnGitHub(string userName, string projectName, Version currentVersion) - { - Task.Run(() => + try { - try - { - var client = new GitHubClient(new ProductHeaderValue(userName + "_" + projectName)); + Log.Info("Checking for new version on GitHub..."); + + // Create GitHub client + var client = new GitHubClient(new ProductHeaderValue(userName + "_" + projectName)); - var latestVersion = new Version(client.Repository.Release.GetLatest(userName, projectName).Result.TagName); + // Get latest or pre-release version + var release = includePreRelease + ? client.Repository.Release.GetAll(userName, projectName).Result[0] + : client.Repository.Release.GetLatest(userName, projectName).Result; - // Compare versions (tag=2021.2.15.0, version=2021.2.15.0) - if (latestVersion > currentVersion) - OnUpdateAvailable(new UpdateAvailableArgs(latestVersion)); - else - OnNoUpdateAvailable(); + // Compare versions (tag=2021.2.15.0, version=2021.2.15.0) + if (new Version(release.TagName) > currentVersion) + { + Log.Info($"Version \"{release.TagName}\" is available!"); + OnUpdateAvailable(new UpdateAvailableArgs(release)); } - catch + else { - OnError(); + Log.Info("No newer version found!"); + OnNoUpdateAvailable(); } - }); - } - #endregion + } + catch (Exception ex) + { + Log.Error("Error while checking for new version on GitHub!", ex); + OnError(); + } + }); } -} + + #endregion + + #region Events + + /// + /// Is triggered when update check is complete and an update is available. + /// + public event EventHandler UpdateAvailable; + + /// + /// Triggers the event. + /// + /// Passes to the event. + private void OnUpdateAvailable(UpdateAvailableArgs e) + { + UpdateAvailable?.Invoke(this, e); + } + + /// + /// Is triggered when update check is complete and no update is available. + /// + public event EventHandler NoUpdateAvailable; + + /// + /// Triggers the event. + /// + private void OnNoUpdateAvailable() + { + NoUpdateAvailable?.Invoke(this, EventArgs.Empty); + } + + /// + /// Is triggered when an error occurs during the update check. + /// + public event EventHandler Error; + + /// + /// Triggers the event. + /// + private void OnError() + { + Error?.Invoke(this, EventArgs.Empty); + } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities.WPF/BindingProxy.cs b/Source/NETworkManager.Utilities.WPF/BindingProxy.cs index 91590ffb50..8b31683a6b 100644 --- a/Source/NETworkManager.Utilities.WPF/BindingProxy.cs +++ b/Source/NETworkManager.Utilities.WPF/BindingProxy.cs @@ -1,20 +1,43 @@ using System.Windows; -namespace NETworkManager.Utilities.WPF +namespace NETworkManager.Utilities.WPF; + +/// +/// Provides a binding proxy class for enabling bindings to data contexts that are not directly +/// accessible within a XAML element's logical or visual tree. +/// +/// +/// This class inherits from and uses a dependency property to hold the +/// data context. It is particularly useful in scenarios where bindings are required in data templates +/// or styles, and the desired data context is otherwise inaccessible. +/// +public class BindingProxy : Freezable { - public class BindingProxy : Freezable - { - protected override Freezable CreateInstanceCore() - { - return new BindingProxy(); - } + /// + /// Dependency property used to hold a generic object. + /// This property allows data binding scenarios where a proxy + /// is required to transfer data between binding contexts. + /// + public static readonly DependencyProperty DataProperty = + DependencyProperty.Register(nameof(Data), typeof(object), typeof(BindingProxy)); - public object Data - { - get => GetValue(DataProperty); - set => SetValue(DataProperty, value); - } + /// + /// Gets or sets the data object used for binding in WPF applications. + /// + public object Data + { + get => GetValue(DataProperty); + set => SetValue(DataProperty, value); + } - public static readonly DependencyProperty DataProperty = DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy)); + /// + /// Creates a new instance of the class. + /// + /// + /// A new instance of the class. + /// + protected override Freezable CreateInstanceCore() + { + return new BindingProxy(); } } diff --git a/Source/NETworkManager.Utilities.WPF/DataGridHelper.cs b/Source/NETworkManager.Utilities.WPF/DataGridHelper.cs new file mode 100644 index 0000000000..1d2aaf1ba6 --- /dev/null +++ b/Source/NETworkManager.Utilities.WPF/DataGridHelper.cs @@ -0,0 +1,60 @@ +using System; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Threading; + +namespace NETworkManager.Utilities.WPF; + +/// +/// Attached-property helpers for . +/// +public static class DataGridHelper +{ + /// + /// When set to , forces star-sized columns to recompute their width after + /// the first row is realized. Without this, an initially empty sizes star + /// columns to MinWidth because the inner + /// measures with infinite width; only a window resize would otherwise trigger a correct re-measure. + /// The handler unsubscribes itself after the first row so there is no ongoing overhead. + /// + public static readonly DependencyProperty RefreshStarColumnsOnFirstRowProperty = + DependencyProperty.RegisterAttached( + "RefreshStarColumnsOnFirstRow", + typeof(bool), + typeof(DataGridHelper), + new PropertyMetadata(false, OnRefreshStarColumnsOnFirstRowChanged)); + + public static void SetRefreshStarColumnsOnFirstRow(DataGrid element, bool value) => + element.SetValue(RefreshStarColumnsOnFirstRowProperty, value); + + public static bool GetRefreshStarColumnsOnFirstRow(DataGrid element) => + (bool)element.GetValue(RefreshStarColumnsOnFirstRowProperty); + + private static void OnRefreshStarColumnsOnFirstRowChanged(DependencyObject d, + DependencyPropertyChangedEventArgs e) + { + if (d is not DataGrid dataGrid || e.NewValue is not bool enabled || !enabled) + return; + + dataGrid.LoadingRow += Handler; + return; + + void Handler(object sender, DataGridRowEventArgs args) + { + dataGrid.LoadingRow -= Handler; + + dataGrid.Dispatcher.BeginInvoke(new Action(() => + { + foreach (var column in dataGrid.Columns) + { + if (!column.Width.IsStar) + continue; + + var width = column.Width; + column.Width = 0; + column.Width = width; + } + }), DispatcherPriority.ContextIdle); + } + } +} diff --git a/Source/NETworkManager.Utilities.WPF/NETworkManager.Utilities.WPF.csproj b/Source/NETworkManager.Utilities.WPF/NETworkManager.Utilities.WPF.csproj index b8f135a11a..34ffbec737 100644 --- a/Source/NETworkManager.Utilities.WPF/NETworkManager.Utilities.WPF.csproj +++ b/Source/NETworkManager.Utilities.WPF/NETworkManager.Utilities.WPF.csproj @@ -1,25 +1,19 @@ - - - {93733008-7269-460D-8390-AB281C75DB91} - Library - NETworkManager.Utilities.WPF - NETworkManager.Utilities.WPF - net6.0-windows10.0.17763.0 - win10-x64 - false - true - false - - - - - - - - - - - - \ No newline at end of file + + + {93733008-7269-460D-8390-AB281C75DB91} + Library + NETworkManager.Utilities.WPF + NETworkManager.Utilities.WPF + net10.0-windows10.0.22621.0 + false + true + false + false + + + + + + + + diff --git a/Source/NETworkManager.Utilities.WPF/PasswordBoxBindingBehavior.cs b/Source/NETworkManager.Utilities.WPF/PasswordBoxBindingBehavior.cs index 7d7ddc3b47..2e1ccc273d 100644 --- a/Source/NETworkManager.Utilities.WPF/PasswordBoxBindingBehavior.cs +++ b/Source/NETworkManager.Utilities.WPF/PasswordBoxBindingBehavior.cs @@ -1,40 +1,38 @@ -using Microsoft.Xaml.Behaviors; -using System.Security; +using System.Security; using System.Windows; using System.Windows.Controls; using System.Windows.Data; +using Microsoft.Xaml.Behaviors; -namespace NETworkManager.Utilities.WPF +namespace NETworkManager.Utilities.WPF; + +public class PasswordBoxBindingBehavior : Behavior { - public class PasswordBoxBindingBehavior : Behavior + public static readonly DependencyProperty PasswordProperty = DependencyProperty.Register("Password", + typeof(SecureString), typeof(PasswordBoxBindingBehavior), new PropertyMetadata(null)); + + public SecureString Password + { + get => (SecureString)GetValue(PasswordProperty); + set => SetValue(PasswordProperty, value); + } + + /// + /// + protected override void OnAttached() { - /// - /// - /// - protected override void OnAttached() - { - AssociatedObject.PasswordChanged += OnPasswordBoxValueChanged; - } - - public SecureString Password - { - get => (SecureString)GetValue(PasswordProperty); - set => SetValue(PasswordProperty, value); - } - - public static readonly DependencyProperty PasswordProperty = DependencyProperty.Register("Password", typeof(SecureString), typeof(PasswordBoxBindingBehavior), new PropertyMetadata(null)); - - private void OnPasswordBoxValueChanged(object sender, RoutedEventArgs e) - { - var binding = BindingOperations.GetBindingExpression(this, PasswordProperty); - - if (binding == null) - return; - - var property = binding.DataItem.GetType().GetProperty(binding.ParentBinding.Path.Path); - - if (property != null) - property.SetValue(binding.DataItem, AssociatedObject.SecurePassword, null); - } + AssociatedObject.PasswordChanged += OnPasswordBoxValueChanged; + } + + private void OnPasswordBoxValueChanged(object sender, RoutedEventArgs e) + { + var binding = BindingOperations.GetBindingExpression(this, PasswordProperty); + + if (binding == null) + return; + + var property = binding.DataItem.GetType().GetProperty(binding.ParentBinding.Path.Path); + + property?.SetValue(binding.DataItem, AssociatedObject.SecurePassword, null); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities.WPF/Properties/AssemblyInfo.cs b/Source/NETworkManager.Utilities.WPF/Properties/AssemblyInfo.cs index 99e2857515..613995d7e9 100644 --- a/Source/NETworkManager.Utilities.WPF/Properties/AssemblyInfo.cs +++ b/Source/NETworkManager.Utilities.WPF/Properties/AssemblyInfo.cs @@ -4,7 +4,5 @@ [assembly: AssemblyTitle("NETworkManager.Utilities.WPF")] [assembly: AssemblyDescription("Library contains NETworkManager utilities for wpf.")] [assembly: AssemblyProduct("NETworkManager.Utilities.WPF")] - [assembly: ComVisible(false)] - [assembly: Guid("93733008-7269-460d-8390-ab281c75db91")] \ No newline at end of file diff --git a/Source/NETworkManager.Utilities.WPF/ProtocolSettingsLayout.cs b/Source/NETworkManager.Utilities.WPF/ProtocolSettingsLayout.cs deleted file mode 100644 index 7bd9216b71..0000000000 --- a/Source/NETworkManager.Utilities.WPF/ProtocolSettingsLayout.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.ComponentModel; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; - -namespace NETworkManager.Utilities.WPF -{ - public class ProtocolSettingsLayout - { - public static readonly DependencyProperty MVVMHasErrorProperty = DependencyProperty.RegisterAttached("MVVMHasError", typeof(bool), typeof(ProtocolSettingsLayout), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, null, CoerceMVVMHasError)); - - public static bool GetMVVMHasError(DependencyObject dependencyObject) - { - return (bool)dependencyObject.GetValue(MVVMHasErrorProperty); - } - - public static void SetMVVMHasError(DependencyObject dependencyObject, bool value) - { - dependencyObject.SetValue(MVVMHasErrorProperty, value); - } - - private static object CoerceMVVMHasError(DependencyObject dependencyObject, object baseValue) - { - bool hasError = (bool)baseValue; - - if (BindingOperations.IsDataBound(dependencyObject, MVVMHasErrorProperty)) - { - if (GetHasErrorDescriptor(dependencyObject) == null) - { - DependencyPropertyDescriptor descriptor = DependencyPropertyDescriptor.FromProperty(Validation.HasErrorProperty, dependencyObject.GetType()); - descriptor.AddValueChanged(dependencyObject, OnHasErrorChanged); - SetHasErrorDescriptor(dependencyObject, descriptor); - hasError = Validation.GetHasError(dependencyObject); - } - } - else - { - if (GetHasErrorDescriptor(dependencyObject) != null) - { - DependencyPropertyDescriptor descriptor = GetHasErrorDescriptor(dependencyObject); - descriptor.RemoveValueChanged(dependencyObject, OnHasErrorChanged); - SetHasErrorDescriptor(dependencyObject, null); - } - } - - return hasError; - } - - private static readonly DependencyProperty HasErrorDescriptorProperty = DependencyProperty.RegisterAttached("HasErrorDescriptor", typeof(DependencyPropertyDescriptor), typeof(ProtocolSettingsLayout)); - - private static DependencyPropertyDescriptor GetHasErrorDescriptor(DependencyObject dependencyObject) - { - object descriptor = dependencyObject.GetValue(HasErrorDescriptorProperty); - return descriptor as DependencyPropertyDescriptor; - } - - private static void OnHasErrorChanged(object sender, EventArgs e) - { - if (sender is DependencyObject dependencyObject) - { - dependencyObject.SetValue(MVVMHasErrorProperty, dependencyObject.GetValue(Validation.HasErrorProperty)); - } - } - - private static void SetHasErrorDescriptor(DependencyObject dependencyObject, DependencyPropertyDescriptor descriptor) - { - dependencyObject.SetValue(HasErrorDescriptorProperty, descriptor); - } - } -} diff --git a/Source/NETworkManager.Utilities.WPF/ReloadAnimationHelper.cs b/Source/NETworkManager.Utilities.WPF/ReloadAnimationHelper.cs new file mode 100644 index 0000000000..28e6a31f31 --- /dev/null +++ b/Source/NETworkManager.Utilities.WPF/ReloadAnimationHelper.cs @@ -0,0 +1,48 @@ +using System; +using System.Windows; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Shapes; + +namespace NETworkManager.Utilities.WPF; + +public static class ReloadAnimationHelper +{ + public static readonly DependencyProperty IsReloadingProperty = + DependencyProperty.RegisterAttached( + "IsReloading", + typeof(bool), + typeof(ReloadAnimationHelper), + new PropertyMetadata(false, OnIsReloadingChanged)); + + public static void SetIsReloading(UIElement element, bool value) => + element.SetValue(IsReloadingProperty, value); + + public static bool GetIsReloading(UIElement element) => + (bool)element.GetValue(IsReloadingProperty); + + private static void OnIsReloadingChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not Rectangle rect || e.NewValue is not bool isReloading) + return; + + if (isReloading) + { + var rotate = new RotateTransform + { + CenterX = rect.Width / 2, + CenterY = rect.Height / 2 + }; + + rect.RenderTransform = rotate; + + var animation = new DoubleAnimation(0, 720, new Duration(TimeSpan.FromSeconds(2))); + + rotate.BeginAnimation(RotateTransform.AngleProperty, animation); + } + else + { + rect.RenderTransform = null; + } + } +} diff --git a/Source/NETworkManager.Utilities/ActiveDirectory/ActiveDirectoryAuthenticationMode.cs b/Source/NETworkManager.Utilities/ActiveDirectory/ActiveDirectoryAuthenticationMode.cs new file mode 100644 index 0000000000..9c960d4ed3 --- /dev/null +++ b/Source/NETworkManager.Utilities/ActiveDirectory/ActiveDirectoryAuthenticationMode.cs @@ -0,0 +1,17 @@ +namespace NETworkManager.Utilities.ActiveDirectory; + +/// +/// How the LDAP bind authenticates against the directory. +/// +public enum ActiveDirectoryAuthenticationMode +{ + /// + /// Bind with the current Windows identity (no explicit credentials). + /// + CurrentUser, + + /// + /// Bind with an explicit username and password. + /// + Custom +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/ActiveDirectory/ActiveDirectoryComputerRecord.cs b/Source/NETworkManager.Utilities/ActiveDirectory/ActiveDirectoryComputerRecord.cs new file mode 100644 index 0000000000..99910ab576 --- /dev/null +++ b/Source/NETworkManager.Utilities/ActiveDirectory/ActiveDirectoryComputerRecord.cs @@ -0,0 +1,16 @@ +namespace NETworkManager.Utilities.ActiveDirectory; + +/// +/// Represents a computer account returned from Active Directory LDAP search. +/// +/// +/// Suggested profile name derived from the sAMAccountName (trailing '$' stripped), +/// falling back to the CN if sAMAccountName is absent. +/// +/// DNS host name of the computer. May be empty if the attribute is not set. +/// +/// String representation of the AD objectGUID (e.g. 550e8400-e29b-41d4-a716-446655440000). +/// Stable across renames and OU moves; useful as an idempotency key when re-importing profiles. +/// Empty string if the attribute could not be read. +/// +public readonly record struct ActiveDirectoryComputerRecord(string ProfileName, string DnsHostName, string ObjectGuid); diff --git a/Source/NETworkManager.Utilities/ActiveDirectory/ActiveDirectoryComputerSearcher.cs b/Source/NETworkManager.Utilities/ActiveDirectory/ActiveDirectoryComputerSearcher.cs new file mode 100644 index 0000000000..4b7248991a --- /dev/null +++ b/Source/NETworkManager.Utilities/ActiveDirectory/ActiveDirectoryComputerSearcher.cs @@ -0,0 +1,188 @@ +using System; +using System.Collections.Generic; +using System.DirectoryServices; +using System.Runtime.InteropServices; + +namespace NETworkManager.Utilities.ActiveDirectory; + +/// +/// Queries Active Directory for computer accounts under a search base, including subtrees. +/// Supports current-user binds as well as explicit credentials, optional server/port overrides +/// and LDAPS, plus an optional additional filter clause. +/// +public static class ActiveDirectoryComputerSearcher +{ + private const int LdapPageSize = 500; + + /// + /// Returns computer accounts under with subtree scope. + /// + /// When is null. + /// When the search base is missing. + /// When the directory search fails. + public static IReadOnlyList GetComputersInSubtree(ActiveDirectorySearchOptions options) + { + ArgumentNullException.ThrowIfNull(options); + ArgumentException.ThrowIfNullOrWhiteSpace(options.SearchBase); + + var ldapPath = BuildLdapPath(options); + var ldapFilter = BuildLdapFilter(options); + + try + { + using var directoryEntry = CreateDirectoryEntry(ldapPath, options); + using var directorySearcher = new DirectorySearcher(directoryEntry); + directorySearcher.SearchScope = SearchScope.Subtree; + directorySearcher.Filter = ldapFilter; + directorySearcher.PageSize = LdapPageSize; + directorySearcher.Tombstone = false; + directorySearcher.ClientTimeout = TimeSpan.FromSeconds(30); + directorySearcher.ServerTimeLimit = TimeSpan.FromSeconds(30); + directorySearcher.PropertiesToLoad.Add("dnsHostName"); + directorySearcher.PropertiesToLoad.Add("name"); + directorySearcher.PropertiesToLoad.Add("sAMAccountName"); + directorySearcher.PropertiesToLoad.Add("objectGUID"); + + var computers = new List(); + + using var searchResults = directorySearcher.FindAll(); + foreach (SearchResult searchResult in searchResults) + { + var dnsHostName = GetFirstPropertyString(searchResult, "dnsHostName"); + var nameAttribute = GetFirstPropertyString(searchResult, "name"); + var samAccountName = GetFirstPropertyString(searchResult, "sAMAccountName"); + var objectGuid = GetObjectGuid(searchResult); + + var profileName = samAccountName.TrimEnd('$'); + if (string.IsNullOrWhiteSpace(profileName)) + profileName = nameAttribute; + + if (string.IsNullOrWhiteSpace(profileName)) + continue; + + computers.Add(new ActiveDirectoryComputerRecord(profileName.Trim(), dnsHostName, objectGuid)); + } + + computers.Sort((left, right) => + string.Compare(left.ProfileName, right.ProfileName, StringComparison.OrdinalIgnoreCase)); + + return computers; + } + catch (COMException exception) + { + throw new InvalidOperationException( + $"Active Directory search failed for '{ldapPath}': {exception.Message}", + exception); + } + } + + /// + /// Creates and returns a bound to . + /// When is empty the entry binds with + /// the current Windows identity; otherwise it uses explicit credentials with + /// (plus + /// when SSL is requested). + /// + private static DirectoryEntry CreateDirectoryEntry(string ldapPath, ActiveDirectorySearchOptions options) + { + var authTypes = AuthenticationTypes.Secure; + + if (options.UseSsl) + authTypes |= AuthenticationTypes.SecureSocketsLayer; + + if (string.IsNullOrEmpty(options.Username)) + return new DirectoryEntry(ldapPath, null, null, authTypes); + + var plainPassword = SecureStringHelper.ConvertToString(options.Password); + return new DirectoryEntry(ldapPath, options.Username, plainPassword, authTypes); + } + + /// + /// Builds the LDAP(S) path from . + /// If the search base already starts with a known protocol prefix (LDAP://, LDAPS://, + /// GC://) it is returned as-is. Otherwise the protocol is prepended and, when a server is + /// specified, the server and port are inserted between the protocol and the search base. + /// + private static string BuildLdapPath(ActiveDirectorySearchOptions options) + { + var trimmedBase = options.SearchBase.Trim(); + + if (StartsWithProtocol(trimmedBase)) + return trimmedBase; + + var protocol = options.UseSsl ? "LDAPS://" : "LDAP://"; + + var server = options.Server?.Trim() ?? string.Empty; + if (server.Length == 0) + return protocol + trimmedBase; + + return $"{protocol}{server}:{options.Port}/{trimmedBase}"; + } + + /// + /// Builds the LDAP search filter. The base filter targets objectCategory=computer and + /// objectClass=computer; when + /// is set, an additional clause excludes accounts with the ACCOUNTDISABLE UAC bit. + /// If an is supplied it is AND-combined + /// with the base filter. + /// + /// + /// Thrown when is not a valid LDAP + /// expression (must start with ( and end with )). + /// + private static string BuildLdapFilter(ActiveDirectorySearchOptions options) + { + var baseFilter = options.ExcludeDisabledAccounts + ? "(&(objectCategory=computer)(objectClass=computer)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))" + : "(&(objectCategory=computer)(objectClass=computer))"; + + var additional = options.AdditionalFilter?.Trim(); + if (string.IsNullOrEmpty(additional)) + return baseFilter; + + if (!additional.StartsWith('(') || !additional.EndsWith(')')) + throw new InvalidOperationException( + "Additional LDAP filter must be a valid LDAP expression starting with '(' and ending with ')'."); + + return $"(&{baseFilter}{additional})"; + } + + /// + /// Returns when begins with a recognised + /// LDAP protocol prefix (LDAP://, LDAPS://, or GC://), indicating + /// that the search base already contains a fully-qualified path. + /// + private static bool StartsWithProtocol(string value) + { + return value.StartsWith("LDAP://", StringComparison.OrdinalIgnoreCase) || + value.StartsWith("LDAPS://", StringComparison.OrdinalIgnoreCase) || + value.StartsWith("GC://", StringComparison.OrdinalIgnoreCase); + } + + /// + /// Returns the string value of the first entry in a property collection. + /// Returns when the property is absent or has no values. + /// + private static string GetFirstPropertyString(SearchResult searchResult, string propertyName) + { + if (!searchResult.Properties.Contains(propertyName) || searchResult.Properties[propertyName].Count == 0) + return string.Empty; + + return searchResult.Properties[propertyName][0].ToString() ?? string.Empty; + } + + /// + /// Reads the objectGUID attribute from a and returns it as a + /// lower-case hyphenated GUID string (e.g. 550e8400-e29b-41d4-a716-446655440000). + /// Returns when the attribute is absent or not a 16-byte value. + /// + private static string GetObjectGuid(SearchResult searchResult) + { + const string attr = "objectGUID"; + + if (!searchResult.Properties.Contains(attr) || searchResult.Properties[attr].Count == 0 || searchResult.Properties[attr][0] is not byte[] { Length: 16 } bytes) + return string.Empty; + + return new Guid(bytes).ToString(); + } +} diff --git a/Source/NETworkManager.Utilities/ActiveDirectory/ActiveDirectorySearchOptions.cs b/Source/NETworkManager.Utilities/ActiveDirectory/ActiveDirectorySearchOptions.cs new file mode 100644 index 0000000000..0f9b24efab --- /dev/null +++ b/Source/NETworkManager.Utilities/ActiveDirectory/ActiveDirectorySearchOptions.cs @@ -0,0 +1,51 @@ +using System.Security; + +namespace NETworkManager.Utilities.ActiveDirectory; + +/// +/// Options for an Active Directory computer search. +/// +public sealed class ActiveDirectorySearchOptions +{ + /// + /// Distinguished name of the search root (e.g. OU=Servers,DC=contoso,DC=local). + /// + public string SearchBase { get; init; } = string.Empty; + + /// + /// Optional domain controller host name. Empty = let DirectoryServices auto-locate. + /// + public string Server { get; init; } = string.Empty; + + /// + /// LDAP port. Ignored by the searcher when no is set (then auto-discovery + /// via the current domain handles the default port). + /// + public int Port { get; init; } = 389; + + /// + /// When true the bind uses LDAPS:// with SSL. + /// + public bool UseSsl { get; init; } + + /// + /// When true, computer accounts with ACCOUNTDISABLE are skipped server-side. + /// + public bool ExcludeDisabledAccounts { get; init; } = true; + + /// + /// Optional username. Empty = bind with current Windows credentials. + /// + public string Username { get; init; } = string.Empty; + + /// + /// Optional password (used together with ). + /// + public SecureString Password { get; init; } + + /// + /// Optional additional LDAP filter clause that is AND-combined with the base computer filter. + /// Must be a valid LDAP expression starting with ( and ending with ). + /// + public string AdditionalFilter { get; init; } = string.Empty; +} diff --git a/Source/NETworkManager.Utilities/ApplicationHelper.cs b/Source/NETworkManager.Utilities/ApplicationHelper.cs new file mode 100644 index 0000000000..3778cdc11c --- /dev/null +++ b/Source/NETworkManager.Utilities/ApplicationHelper.cs @@ -0,0 +1,34 @@ +using System; +using System.IO; +using System.Linq; + +namespace NETworkManager.Utilities; + +/// +/// Helper class to interact with the applications on the system. +/// +public static class ApplicationHelper +{ + /// + /// Find an application in the system PATH. + /// This is similar to the `where` command in Windows. + /// + /// The name of the application to find (like `notepad` or `notepad.exe`). + /// The full path to the application if found, otherwise `null`. + public static string Find(string fileName) + { + var path = Environment.GetEnvironmentVariable("PATH"); + + if (path == null) + return null; + + var directories = path.Split(';'); + + if (!fileName.EndsWith(".exe")) + fileName += ".exe"; + + return directories + .Select(dir => Path.Combine(dir, fileName)) + .FirstOrDefault(File.Exists); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/ArrayHelper.cs b/Source/NETworkManager.Utilities/ArrayHelper.cs index 418cb3ced3..4f3cb87ea1 100644 --- a/Source/NETworkManager.Utilities/ArrayHelper.cs +++ b/Source/NETworkManager.Utilities/ArrayHelper.cs @@ -1,25 +1,24 @@ using System; -namespace NETworkManager.Utilities +namespace NETworkManager.Utilities; + +/// +/// Collection of useful methods to interact with an array. +/// +public static class ArrayHelper { /// - /// Collection of useful methods to interact with an array. + /// Create a sub array from an array. /// - public static class ArrayHelper + /// Object array. + /// Any array. + /// Start index. + /// Length of the new array. + /// Sub array of the array. + public static T[] SubArray(this T[] data, int index, int length) { - /// - /// Create a sub array from an array. - /// - /// Object array. - /// Any array. - /// Start index. - /// Length of the new array. - /// Sub array of the array. - public static T[] SubArray(this T[] data, int index, int length) - { - var result = new T[length]; - Array.Copy(data, index, result, 0, length); - return result; - } + var result = new T[length]; + Array.Copy(data, index, result, 0, length); + return result; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/AutoRefreshTime.cs b/Source/NETworkManager.Utilities/AutoRefreshTime.cs index f42018f3dc..2919b22e88 100644 --- a/Source/NETworkManager.Utilities/AutoRefreshTime.cs +++ b/Source/NETworkManager.Utilities/AutoRefreshTime.cs @@ -1,47 +1,46 @@ using System; using System.Collections.Generic; -namespace NETworkManager.Utilities +namespace NETworkManager.Utilities; + +/// +/// Class provides static methods to manage auto refresh time. +/// +public static class AutoRefreshTime { /// - /// Class provides static methods to manage auto refresh time. + /// Method returns a list with default s. /// - public static class AutoRefreshTime + public static IEnumerable GetDefaults => new List { - /// - /// Method returns a list with default s. - /// - public static IEnumerable GetDefaults => new List - { - new AutoRefreshTimeInfo(5, TimeUnit.Second), - new AutoRefreshTimeInfo(15, TimeUnit.Second), - new AutoRefreshTimeInfo(30, TimeUnit.Second), - new AutoRefreshTimeInfo(1, TimeUnit.Minute), - new AutoRefreshTimeInfo(5, TimeUnit.Minute), - }; + new(5, TimeUnit.Second), + new(15, TimeUnit.Second), + new(30, TimeUnit.Second), + new(1, TimeUnit.Minute), + new(5, TimeUnit.Minute) + }; - /// - /// Method to calculate a based on . - /// - /// to calculate - /// Returns the calculated . - public static TimeSpan CalculateTimeSpan(AutoRefreshTimeInfo info) + /// + /// Method to calculate a based on . + /// + /// to calculate + /// Returns the calculated . + public static TimeSpan CalculateTimeSpan(AutoRefreshTimeInfo info) + { + switch (info.TimeUnit) { - switch (info.TimeUnit) - { - // Calculate the seconds - case TimeUnit.Second: - return new TimeSpan(0, 0, info.Value); - // Calculate the minutes - case TimeUnit.Minute: - return new TimeSpan(0, info.Value * 60, 0); - // Calculate the hours - case TimeUnit.Hour: - return new TimeSpan(info.Value * 60, 0, 0); - case TimeUnit.None: - default: - throw new Exception("Wrong time unit."); - } - } + // Calculate the seconds + case TimeUnit.Second: + return new TimeSpan(0, 0, info.Value); + // Calculate the minutes + case TimeUnit.Minute: + return new TimeSpan(0, info.Value * 60, 0); + // Calculate the hours + case TimeUnit.Hour: + return new TimeSpan(info.Value * 60, 0, 0); + case TimeUnit.None: + default: + throw new Exception("Wrong time unit."); + } } } \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/AutoRefreshTimeInfo.cs b/Source/NETworkManager.Utilities/AutoRefreshTimeInfo.cs index 0093f4f34a..31cd69a493 100644 --- a/Source/NETworkManager.Utilities/AutoRefreshTimeInfo.cs +++ b/Source/NETworkManager.Utilities/AutoRefreshTimeInfo.cs @@ -1,38 +1,36 @@ -namespace NETworkManager.Utilities +namespace NETworkManager.Utilities; + +/// +/// Class stores auto refresh time informations. +/// +public class AutoRefreshTimeInfo { /// - /// Class stores auto refresh time informations. + /// Initializes a new instance of the class. /// - public class AutoRefreshTimeInfo + public AutoRefreshTimeInfo() { - /// - /// Value is combined with . - /// Example: 5 Mintues, 2 Hours. - /// - public int Value { get; set; } - - /// - /// is combined with . - /// - public TimeUnit TimeUnit { get; set; } + } - /// - /// Initializes a new instance of the class. - /// - public AutoRefreshTimeInfo() - { + /// + /// Initializes a new instance of the class with parameters. + /// + /// . + /// . + public AutoRefreshTimeInfo(int value, TimeUnit timenUnit) + { + Value = value; + TimeUnit = timenUnit; + } - } + /// + /// Value is combined with . + /// Example: 5 Mintues, 2 Hours. + /// + public int Value { get; set; } - /// - /// Initializes a new instance of the class with parameters. - /// - /// . - /// . - public AutoRefreshTimeInfo(int value, TimeUnit timenUnit) - { - Value = value; - TimeUnit = timenUnit; - } - } + /// + /// is combined with . + /// + public TimeUnit TimeUnit { get; set; } } \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/ByteHelper.cs b/Source/NETworkManager.Utilities/ByteHelper.cs new file mode 100644 index 0000000000..eeff6e044a --- /dev/null +++ b/Source/NETworkManager.Utilities/ByteHelper.cs @@ -0,0 +1,21 @@ +using System; + +namespace NETworkManager.Utilities; + +public static class ByteHelper +{ + /// + /// Compare two byte arrays. + /// + /// Byte array to compare. + /// Byte array to compare. + /// 0 if the byte arrays are equal, otherwise a negative or positive value. + public static int Compare(byte[] x, byte[] y) + { + for (var i = 0; i < Math.Min(x.Length, y.Length); i++) + if (x[i] != y[i]) + return x[i] - y[i]; + + return x.Length - y.Length; + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/ChildWindowIcon.cs b/Source/NETworkManager.Utilities/ChildWindowIcon.cs new file mode 100644 index 0000000000..be174ce035 --- /dev/null +++ b/Source/NETworkManager.Utilities/ChildWindowIcon.cs @@ -0,0 +1,27 @@ +namespace NETworkManager.Utilities; + +/// +/// Ions for child dialogs. +/// +public enum ChildWindowIcon +{ + /// + /// Information icon. + /// + Info, + + /// + /// Question icon. + /// + Question, + + /// + /// Warning icon. + /// + Warn, + + /// + /// Error icon. + /// + Error, +} diff --git a/Source/NETworkManager.Utilities/ClipboardHelper.cs b/Source/NETworkManager.Utilities/ClipboardHelper.cs index a93ef271c2..a02958b7f9 100644 --- a/Source/NETworkManager.Utilities/ClipboardHelper.cs +++ b/Source/NETworkManager.Utilities/ClipboardHelper.cs @@ -1,19 +1,29 @@ -using System.Windows; +using System; +using System.Windows; +using log4net; -namespace NETworkManager.Utilities +namespace NETworkManager.Utilities; + +/// +/// Class provides static methods to interact with the clipboard. +/// +public static class ClipboardHelper { + private static readonly ILog Log = LogManager.GetLogger(typeof(ClipboardHelper)); + /// - /// Class provides static methods to interact with the clipboard. + /// Methods to set a text to the clipboard. /// - public static class ClipboardHelper + /// Some text... + public static void SetClipboard(string text) { - /// - /// Methods to set a text to the clipboard. - /// - /// Some text... - public static void SetClipboard(string text) + try { Clipboard.SetDataObject(text, true); } + catch (Exception e) + { + Log.Error($"Failed to set clipboard: {e.Message}"); + } } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/CryptoHelper.cs b/Source/NETworkManager.Utilities/CryptoHelper.cs index 69b1300dcf..1bde5a3f98 100644 --- a/Source/NETworkManager.Utilities/CryptoHelper.cs +++ b/Source/NETworkManager.Utilities/CryptoHelper.cs @@ -1,63 +1,63 @@ using System; using System.Security.Cryptography; -namespace NETworkManager.Utilities +namespace NETworkManager.Utilities; + +public static class CryptoHelper { - public static class CryptoHelper + private static readonly int blockSize = 128; + + /// + /// + /// + /// + /// + /// + /// + public static byte[] Encrypt(byte[] decryptedBytes, string password, int keySize, int iterations) { - private static readonly int blockSize = 128; - /// - /// - /// - /// - /// - /// - /// - /// - public static byte[] Encrypt(byte[] decryptedBytes, string password, int keySize, int iterations) - { - ReadOnlySpan salt = RandomNumberGenerator.GetBytes(keySize / 8); // Generate salt based - ReadOnlySpan iv = RandomNumberGenerator.GetBytes(blockSize / 8); // Generate iv, has to be the same as the block size - - byte[] key = Rfc2898DeriveBytes.Pbkdf2(password, salt, iterations, HashAlgorithmName.SHA512, keySize / 8); - - using Aes aes = Aes.Create(); - aes.Key = key; - - int encryptedSize = aes.GetCiphertextLengthCbc(decryptedBytes.Length); - - byte[] cipher = new byte[salt.Length + iv.Length + encryptedSize]; - - Span cipherSpan = cipher; - - salt.CopyTo(cipherSpan); - iv.CopyTo(cipherSpan[salt.Length..]); - - int encrypted = aes.EncryptCbc(decryptedBytes, iv, cipherSpan[(salt.Length + iv.Length)..]); - - return cipher; - } - - /// - /// - /// - /// - /// - /// - /// - /// - public static byte[] Decrypt(byte[] encryptedBytesWithSaltAndIV, string password, int keySize, int iterations) - { - ReadOnlySpan salt = encryptedBytesWithSaltAndIV.AsSpan(0, keySize / 8); // Take salt bytes - ReadOnlySpan iv = encryptedBytesWithSaltAndIV.AsSpan(keySize / 8, blockSize / 8); // Skip salt bytes, take iv bytes - ReadOnlySpan cipher = encryptedBytesWithSaltAndIV.AsSpan((keySize / 8) + (blockSize / 8)); - - byte[] key = Rfc2898DeriveBytes.Pbkdf2(password, salt, iterations, HashAlgorithmName.SHA512, keySize / 8); - - using Aes aes = Aes.Create(); - aes.Key = key; - - return aes.DecryptCbc(cipher, iv); - } + ReadOnlySpan salt = RandomNumberGenerator.GetBytes(keySize / 8); // Generate salt based + ReadOnlySpan + iv = RandomNumberGenerator.GetBytes(blockSize / 8); // Generate iv, has to be the same as the block size + + var key = Rfc2898DeriveBytes.Pbkdf2(password, salt, iterations, HashAlgorithmName.SHA512, keySize / 8); + + using var aes = Aes.Create(); + aes.Key = key; + + var encryptedSize = aes.GetCiphertextLengthCbc(decryptedBytes.Length); + + var cipher = new byte[salt.Length + iv.Length + encryptedSize]; + + Span cipherSpan = cipher; + + salt.CopyTo(cipherSpan); + iv.CopyTo(cipherSpan[salt.Length..]); + + var encrypted = aes.EncryptCbc(decryptedBytes, iv, cipherSpan[(salt.Length + iv.Length)..]); + + return cipher; + } + + /// + /// + /// + /// + /// + /// + /// + public static byte[] Decrypt(byte[] encryptedBytesWithSaltAndIV, string password, int keySize, int iterations) + { + ReadOnlySpan salt = encryptedBytesWithSaltAndIV.AsSpan(0, keySize / 8); // Take salt bytes + ReadOnlySpan + iv = encryptedBytesWithSaltAndIV.AsSpan(keySize / 8, blockSize / 8); // Skip salt bytes, take iv bytes + ReadOnlySpan cipher = encryptedBytesWithSaltAndIV.AsSpan(keySize / 8 + blockSize / 8); + + var key = Rfc2898DeriveBytes.Pbkdf2(password, salt, iterations, HashAlgorithmName.SHA512, keySize / 8); + + using var aes = Aes.Create(); + aes.Key = key; + + return aes.DecryptCbc(cipher, iv); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/CsvHelper.cs b/Source/NETworkManager.Utilities/CsvHelper.cs new file mode 100644 index 0000000000..9e33df352f --- /dev/null +++ b/Source/NETworkManager.Utilities/CsvHelper.cs @@ -0,0 +1,15 @@ +namespace NETworkManager.Utilities; + +public static class CsvHelper +{ + /// + /// Wraps a string value in double quotes and escapes any internal double quotes + /// per RFC 4180 (doubles them). Null values are returned as an empty quoted field. + /// + /// The string value to quote. + /// The value wrapped in double quotes with internal quotes escaped. + public static string QuoteString(string? value) + { + return $"\"{value?.Replace("\"", "\"\"")}\""; + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/CustomCommand.cs b/Source/NETworkManager.Utilities/CustomCommand.cs index 0d45f46d9d..5a83e17259 100644 --- a/Source/NETworkManager.Utilities/CustomCommand.cs +++ b/Source/NETworkManager.Utilities/CustomCommand.cs @@ -1,31 +1,16 @@ -using System; -using System.Collections.Generic; +namespace NETworkManager.Utilities; -namespace NETworkManager.Utilities +/// +/// Class provides static methods to manage custom commands. +/// +public static class CustomCommand { /// - /// Class provides static methods to manage custom commands. + /// Method to execute a . /// - public static class CustomCommand + /// which is executed. + public static void Run(CustomCommandInfo info) { - /// - /// Method returns a list of default custom commands (see . - /// - /// List with s. - public static List GetDefaults() => new List - { - new CustomCommandInfo(Guid.NewGuid(), "Internet Explorer", "iexplore.exe", @"http://$$ipaddress$$/"), - new CustomCommandInfo(Guid.NewGuid(), "Internet Explorer (https)", "iexplore.exe", @"https://$$ipaddress$$/"), - new CustomCommandInfo(Guid.NewGuid(), "Windows Explorer (c$)", "explorer.exe", @"\\$$ipaddress$$\c$"), - }; - - /// - /// Method to execute a . - /// - /// which is executed. - public static void Run(CustomCommandInfo info) - { - ExternalProcessStarter.RunProcess(info.FilePath, info.Arguments); - } + ExternalProcessStarter.RunProcess(info.FilePath, info.Arguments); } } \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/CustomCommandInfo.cs b/Source/NETworkManager.Utilities/CustomCommandInfo.cs index 64ff6daeb9..0eb9bc9e5c 100644 --- a/Source/NETworkManager.Utilities/CustomCommandInfo.cs +++ b/Source/NETworkManager.Utilities/CustomCommandInfo.cs @@ -1,72 +1,70 @@ using System; -namespace NETworkManager.Utilities +namespace NETworkManager.Utilities; + +/// +/// Class stores custom command informations. +/// +public class CustomCommandInfo : ICloneable { /// - /// Class stores custom command informations. + /// Create an empty with an /// - public class CustomCommandInfo : ICloneable + public CustomCommandInfo() { + ID = Guid.NewGuid(); + } - /// - /// Unique Identifiert for this custom command. - /// - public Guid ID { get; set; } - - /// - /// Name of this custom command. - /// - public string Name { get; set; } + /// + /// Create an . + /// + /// . + /// . + /// . + public CustomCommandInfo(Guid id, string name, string filePath) + { + ID = id; + Name = name; + FilePath = filePath; + } - /// - /// Filepath to the application to execute. - /// - public string FilePath { get; set; } + /// + /// Create an . + /// + /// . + /// . + /// . + /// . + public CustomCommandInfo(Guid id, string name, string filePath, string arguments) : this(id, name, filePath) + { + Arguments = arguments; + } - /// - /// Arguments to start the application. - /// - public string Arguments { get; set; } + /// + /// Unique Identifiert for this custom command. + /// + public Guid ID { get; set; } - /// - /// Create an empty with an - /// - public CustomCommandInfo() - { - ID = Guid.NewGuid(); - } + /// + /// Name of this custom command. + /// + public string Name { get; set; } - /// - /// Create an . - /// - /// . - /// . - /// . - public CustomCommandInfo(Guid id, string name, string filePath) - { - ID = id; - Name = name; - FilePath = filePath; - } + /// + /// Filepath to the application to execute. + /// + public string FilePath { get; set; } - /// - /// Create an . - /// - /// . - /// . - /// . - /// . - public CustomCommandInfo(Guid id, string name, string filePath, string arguments) : this(id, name, filePath) - { - Arguments = arguments; - } + /// + /// Arguments to start the application. + /// + public string Arguments { get; set; } - /// - /// Method to clone this object. - /// - public object Clone() - { - return MemberwiseClone(); - } + /// + /// Method to clone this object. + /// + public object Clone() + { + return MemberwiseClone(); } } \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/DNSClient.cs b/Source/NETworkManager.Utilities/DNSClient.cs new file mode 100644 index 0000000000..91156be90d --- /dev/null +++ b/Source/NETworkManager.Utilities/DNSClient.cs @@ -0,0 +1,280 @@ +using DnsClient; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Threading.Tasks; +using log4net; + +namespace NETworkManager.Utilities; + +public class DNSClient : SingletonBase +{ + private static readonly ILog Log = LogManager.GetLogger(typeof(DNSClient)); + + /// + /// Error message which is returned when the DNS client is not configured. + /// + private const string NotConfiguredMessage = "DNS client is not configured. Call Configure() first."; + + /// + /// Hold the current instance of the LookupClient. + /// + private LookupClient _client; + + /// + /// Indicates if the DNS client is configured. + /// + private bool _isConfigured; + + /// + /// Store the current DNS settings. + /// + private DNSClientSettings _settings; + + /// + /// Method to configure the DNS client. + /// + /// + public void Configure(DNSClientSettings settings) + { + _settings = settings; + + Log.Debug("Configure - Configuring DNS client..."); + + if (_settings.UseCustomDNSServers) + { + Log.Debug("Configure - Using custom DNS servers..."); + + // Setup custom DNS servers + List servers = []; + + foreach (var (server, port) in _settings.DNSServers) + { + Log.Debug($"Configure - Adding custom DNS server: {server}:{port}"); + servers.Add(new IPEndPoint(IPAddress.Parse(server), port)); + } + + Log.Debug("Configure - Creating LookupClient with custom DNS servers..."); + _client = new LookupClient(new LookupClientOptions(servers.ToArray())); + } + else + { + Log.Debug("Configure - Creating LookupClient with Windows default DNS servers..."); + _client = new LookupClient(); + } + + Log.Debug("Configure - DNS client configured."); + _isConfigured = true; + } + + /// + /// Method to update the (Windows) name servers of the DNS client + /// when they may have changed due to a network update. + /// + public void UpdateWindowsDNSSever() + { + Log.Debug("UpdateWindowsDNSSever - Recreating LookupClient with with Windows default DNS servers..."); + _client = new LookupClient(); + } + + /// + /// Resolve an IPv4 address from a hostname or FQDN. + /// + /// Hostname or FQDN as string like "example.com". + /// of the host. + public async Task ResolveAAsync(string query) + { + if (!_isConfigured) + throw new DNSClientNotConfiguredException(NotConfiguredMessage); + + try + { + var result = await _client.QueryAsync(query, QueryType.A); + + // Pass the error we got from the lookup client (dns server). + // NXDOMAIN is not a real failure like a timeout - flag it via IsNotFound so callers can + // treat it as "no record". SERVFAIL/REFUSED are not included here: for a forward lookup + // they mean the resolver actually failed or refused the query, not "record does not exist". + if (result.HasError) + return new DNSClientResultIPAddress(result.HasError, result.ErrorMessage, $"{result.NameServer}") + { IsNotFound = IsNotFoundResponseCode(result.Header.ResponseCode) }; + + // Validate result because of https://github.com/BornToBeRoot/NETworkManager/issues/1934 + var record = result.Answers.ARecords().FirstOrDefault(); + + return record != null + ? new DNSClientResultIPAddress(record.Address, $"{result.NameServer}") + : new DNSClientResultIPAddress(true, + $"IP address for \"{query}\" could not be resolved and the DNS server did not return an error. Try to check your DNS server with: dig @{result.NameServer.Address} {query}", + $"{result.NameServer}") + { IsNotFound = true }; + } + catch (DnsResponseException ex) + { + return new DNSClientResultIPAddress(true, ex.Message); + } + catch (Exception ex) + { + Log.Error($"Error while resolving A record (Query string is \"{query}\".", ex); + return new DNSClientResultIPAddress(true, ex.Message); + } + } + + /// + /// Resolve an IPv6 address from a hostname or FQDN. + /// + /// Hostname or FQDN as string like "example.com". + /// of the host. + public async Task ResolveAaaaAsync(string query) + { + if (!_isConfigured) + throw new DNSClientNotConfiguredException(NotConfiguredMessage); + + try + { + var result = await _client.QueryAsync(query, QueryType.AAAA); + + // Pass the error we got from the lookup client (dns server). + // NXDOMAIN is not a real failure like a timeout - flag it via IsNotFound so callers can + // treat it as "no record". SERVFAIL/REFUSED are not included here: for a forward lookup + // they mean the resolver actually failed or refused the query, not "record does not exist". + if (result.HasError) + return new DNSClientResultIPAddress(result.HasError, result.ErrorMessage, $"{result.NameServer}") + { IsNotFound = IsNotFoundResponseCode(result.Header.ResponseCode) }; + + // Validate result because of https://github.com/BornToBeRoot/NETworkManager/issues/1934 + var record = result.Answers.AaaaRecords().FirstOrDefault(); + + return record != null + ? new DNSClientResultIPAddress(record.Address, $"{result.NameServer}") + : new DNSClientResultIPAddress(true, + $"IP address for \"{query}\" could not be resolved and the DNS server did not return an error. Try to check your DNS server with: dig @{result.NameServer.Address} {query}", + $"{result.NameServer}") + { IsNotFound = true }; + } + catch (DnsResponseException ex) + { + return new DNSClientResultIPAddress(true, ex.Message); + } + catch (Exception ex) + { + Log.Error($"Error while resolving AAAA record (Query string is \"{query}\".", ex); + return new DNSClientResultIPAddress(true, ex.Message); + } + } + + /// + /// Resolve a CNAME from a hostname or FQDN. + /// + /// Hostname or FQDN as string like "example.com". + /// CNAME of the host. + public async Task ResolveCnameAsync(string query) + { + if (!_isConfigured) + throw new DNSClientNotConfiguredException(NotConfiguredMessage); + + try + { + var result = await _client.QueryAsync(query, QueryType.CNAME); + + // Pass the error we got from the lookup client (dns server). + // NXDOMAIN is not a real failure like a timeout - flag it via IsNotFound so callers can + // treat it as "no record". SERVFAIL/REFUSED are not included here: for a forward lookup + // they mean the resolver actually failed or refused the query, not "record does not exist". + if (result.HasError) + return new DNSClientResultString(result.HasError, result.ErrorMessage, $"{result.NameServer}") + { IsNotFound = IsNotFoundResponseCode(result.Header.ResponseCode) }; + + // Validate result because of https://github.com/BornToBeRoot/NETworkManager/issues/1934 + var record = result.Answers.CnameRecords().FirstOrDefault(); + + return record != null + ? new DNSClientResultString(record.CanonicalName, $"{result.NameServer}") + : new DNSClientResultString(true, + $"CNAME for \"{query}\" could not be resolved and the DNS server did not return an error. Try to check your DNS server with: dig @{result.NameServer.Address} {query}", + $"{result.NameServer}") + { IsNotFound = true }; + } + catch (DnsResponseException ex) + { + return new DNSClientResultString(true, ex.Message); + } + catch (Exception ex) + { + Log.Error($"Error while resolving CNAME record (Query string is \"{query}\".", ex); + return new DNSClientResultString(true, ex.Message); + } + } + + /// + /// Resolve a PTR for an IP address. + /// + /// IP address of the host. + /// PTR domain name. + public async Task ResolvePtrAsync(IPAddress ipAddress) + { + if (!_isConfigured) + throw new DNSClientNotConfiguredException(NotConfiguredMessage); + + try + { + var result = await _client.QueryReverseAsync(ipAddress); + + // Pass the error we got from the lookup client (dns server). + // NXDOMAIN is always a clean "no record". For private/ULA IP ranges (the common case for + // router/computer PTR lookups) many resolvers also return SERVFAIL/REFUSED instead of a + // clean NXDOMAIN when there is no reverse zone, so those are treated as "not found" too - + // but only for private ranges, since for a public IP a SERVFAIL/REFUSED usually means the + // resolver actually failed or refused the query. + if (result.HasError) + return new DNSClientResultString(result.HasError, result.ErrorMessage, $"{result.NameServer}") + { + IsNotFound = IsNotFoundResponseCode(result.Header.ResponseCode, + IPAddressHelper.IsPrivateIPAddress(ipAddress)) + }; + + // Validate result because of https://github.com/BornToBeRoot/NETworkManager/issues/1934 + var record = result.Answers.PtrRecords().FirstOrDefault(); + + return record != null + ? new DNSClientResultString(record.PtrDomainName, $"{result.NameServer}") + : new DNSClientResultString(true, + $"PTR for \"{ipAddress}\" could not be resolved and the DNS server did not return an error. Try to check your DNS server with: dig @{result.NameServer.Address} -x {ipAddress}", + $"{result.NameServer}") + { IsNotFound = true }; + } + catch (DnsResponseException ex) + { + return new DNSClientResultString(true, ex.Message); + } + catch (Exception ex) + { + Log.Error($"Error while resolving PTR record (IP address is \"{ipAddress}\".", ex); + return new DNSClientResultString(true, ex.Message); + } + } + + /// + /// Determines whether a DNS response code means "no record" rather than a real failure. + /// NXDOMAIN is always a clean "does not exist". SERVFAIL and REFUSED are only treated as + /// "no record" when is set, since outside of + /// that case they usually indicate the resolver actually failed or refused the query rather + /// than a confirmed absence of the record. + /// + /// The DNS response code to check. + /// + /// Whether SERVFAIL/REFUSED should also count as "no record" - true for reverse (PTR) lookups + /// on private/RFC1918/ULA IP ranges, where many resolvers return them instead of a clean + /// NXDOMAIN when there is no reverse zone. + /// + private static bool IsNotFoundResponseCode(DnsHeaderResponseCode responseCode, + bool treatServerErrorsAsNotFound = false) + { + if (responseCode is DnsHeaderResponseCode.NotExistentDomain) + return true; + + return treatServerErrorsAsNotFound + && responseCode is DnsHeaderResponseCode.ServerFailure or DnsHeaderResponseCode.Refused; + } +} diff --git a/Source/NETworkManager.Utilities/DNSClientHelper.cs b/Source/NETworkManager.Utilities/DNSClientHelper.cs new file mode 100644 index 0000000000..6c420d8fe2 --- /dev/null +++ b/Source/NETworkManager.Utilities/DNSClientHelper.cs @@ -0,0 +1,47 @@ +using System.Threading.Tasks; + +namespace NETworkManager.Utilities; + +public static class DNSClientHelper +{ + public static async Task ResolveAorAaaaAsync(string query, bool preferIPv4) + { + DNSClientResultIPAddress firstResult = null; + + for (var i = 0; i < 2; i++) + { + if (preferIPv4) + { + var resultIPv4 = await DNSClient.GetInstance().ResolveAAsync(query); + + if (!resultIPv4.HasError) + return resultIPv4; + firstResult ??= resultIPv4; + } + else + { + var resultIPv6 = await DNSClient.GetInstance().ResolveAaaaAsync(query); + + if (!resultIPv6.HasError) + return resultIPv6; + firstResult ??= resultIPv6; + } + + preferIPv4 = !preferIPv4; + } + + return firstResult; + } + + public static string FormatDNSClientResultError(string query, DNSClientResult result) + { + var statusMessage = $"{query}"; + + if (string.IsNullOrEmpty(result.DNSServer)) + statusMessage += $" ==> {result.ErrorMessage}"; + else + statusMessage += $" @ {result.DNSServer} ==> {result.ErrorMessage}"; + + return statusMessage; + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/DNSClientNotConfiguredException.cs b/Source/NETworkManager.Utilities/DNSClientNotConfiguredException.cs new file mode 100644 index 0000000000..9973fed56b --- /dev/null +++ b/Source/NETworkManager.Utilities/DNSClientNotConfiguredException.cs @@ -0,0 +1,24 @@ +using System; + +namespace NETworkManager.Utilities; + +/// +/// Exception which is thrown when the is not configured. +/// +public class DNSClientNotConfiguredException : Exception +{ + /// + /// Create an instance of . + /// + public DNSClientNotConfiguredException() + { + } + + /// + /// Create an instance of with parameters. + /// + /// Message that is shown, if the is not configured. + public DNSClientNotConfiguredException(string message) : base(message) + { + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/DNSClientResult.cs b/Source/NETworkManager.Utilities/DNSClientResult.cs new file mode 100644 index 0000000000..dbe7f0b276 --- /dev/null +++ b/Source/NETworkManager.Utilities/DNSClientResult.cs @@ -0,0 +1,69 @@ +namespace NETworkManager.Utilities; + +/// +/// Base class for the result from a query. +/// +public abstract class DNSClientResult +{ + /// + /// Create an instance of . + /// + public DNSClientResult() + { + } + + /// + /// Create an instance of with parameters. + /// + /// DNS server which was used for resolving the query. + public DNSClientResult(string dnsServer) + { + DNSServer = dnsServer; + } + + /// + /// Create an instance of with parameters if an error has occurred. + /// + /// Indicates if an error has occurred. + /// Error message when an error has occurred. + public DNSClientResult(bool hasError, string errorMessage) + { + HasError = hasError; + ErrorMessage = errorMessage; + } + + /// + /// Create an instance of with parameters if an error has occurred. + /// + /// Indicates if an error has occurred. + /// Error message when an error has occurred. + /// DNS server which was used for resolving the query. + public DNSClientResult(bool hasError, string errorMessage, string dnsServer) : this(dnsServer) + { + HasError = hasError; + ErrorMessage = errorMessage; + } + + /// + /// DNS server which was used for resolving the query. + /// + public string DNSServer { get; set; } + + /// + /// Indicates if an error has occurred. + /// + public bool HasError { get; set; } + + /// + /// Error message when an error has occurred. + /// + public string ErrorMessage { get; set; } + + /// + /// Indicates that is set because no matching record was found (NXDOMAIN, + /// or SERVFAIL/REFUSED on a reverse lookup for a private/RFC1918/ULA IP range), rather than a real + /// failure like a timeout, an unreachable server, or SERVFAIL/REFUSED for any other query. This is + /// a normal outcome (e.g. no PTR record configured) and not a sign of a broken DNS setup. + /// + public bool IsNotFound { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/DNSClientResultIPAddress.cs b/Source/NETworkManager.Utilities/DNSClientResultIPAddress.cs new file mode 100644 index 0000000000..1db9e5b0d1 --- /dev/null +++ b/Source/NETworkManager.Utilities/DNSClientResultIPAddress.cs @@ -0,0 +1,44 @@ +using System.Net; + +namespace NETworkManager.Utilities; + +/// +/// Class is used to store the result from a query. +/// +public class DNSClientResultIPAddress : DNSClientResult +{ + /// + /// Create an instance of with parameters. + /// + /// Query result as . + /// DNS server which was used for resolving the query. + public DNSClientResultIPAddress(IPAddress value, string dnsServer) : base(dnsServer) + { + Value = value; + } + + /// + /// Create an instance of with parameters if an error has occurred. + /// + /// Indicates if an error has occurred. + /// Error message when an error has occurred. + public DNSClientResultIPAddress(bool hasError, string errorMessage) : base(hasError, errorMessage) + { + } + + /// + /// Create an instance of with parameters if an error has occurred. + /// + /// Indicates if an error has occurred. + /// Error message when an error has occurred. + /// DNS server which was used for resolving the query. + public DNSClientResultIPAddress(bool hasError, string errorMessage, string dnsServer) : base(hasError, errorMessage, + dnsServer) + { + } + + /// + /// Query result as . + /// + public IPAddress Value { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/DNSClientResultString.cs b/Source/NETworkManager.Utilities/DNSClientResultString.cs new file mode 100644 index 0000000000..b600898741 --- /dev/null +++ b/Source/NETworkManager.Utilities/DNSClientResultString.cs @@ -0,0 +1,41 @@ +namespace NETworkManager.Utilities; + +/// +/// Class is used to store the result from a query. +/// +public class DNSClientResultString : DNSClientResult +{ + /// + /// Create an instance of with parameters. + /// + /// Query result as . + /// DNS server which was used for resolving the query. + public DNSClientResultString(string value, string dnsServer) : base(dnsServer) + { + Value = value; + } + + /// + /// Create an instance of with parameters if an error has occurred. + /// + /// Indicates if an error has occurred. + /// Error message when an error has occurred. + public DNSClientResultString(bool hasError, string errorMessage) : base(hasError, errorMessage) + { + } + + /// + /// Create an instance of with parameters if an error has occurred. + /// + /// Indicates if an error has occurred. + /// Error message when an error has occurred. + /// DNS server which was used for resolving the query. + public DNSClientResultString(bool hasError, string errorMessage, string dnsServer) : base(hasError, errorMessage, dnsServer) + { + } + + /// + /// Query result as . + /// + public string Value { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/DNSClientSettings.cs b/Source/NETworkManager.Utilities/DNSClientSettings.cs new file mode 100644 index 0000000000..d08a8191e3 --- /dev/null +++ b/Source/NETworkManager.Utilities/DNSClientSettings.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; + +namespace NETworkManager.Utilities; + +/// +/// Class is used to store settings for the . +/// +public class DNSClientSettings +{ + /// + /// Create an instance of . + /// + public DNSClientSettings() + { + } + + /// + /// Use custom DNS servers. + /// + public bool UseCustomDNSServers { get; set; } + + /// + /// List of name servers as Tuple (string Server, int Port). + /// + public IEnumerable<(string Server, int Port)> DNSServers { get; set; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/DateTimeHelper.cs b/Source/NETworkManager.Utilities/DateTimeHelper.cs new file mode 100644 index 0000000000..36cf287c44 --- /dev/null +++ b/Source/NETworkManager.Utilities/DateTimeHelper.cs @@ -0,0 +1,29 @@ +using System; + +namespace NETworkManager.Utilities; + +/// +/// Class provides static methods to convert DateTime to string. +/// +public static class DateTimeHelper +{ + /// + /// Convert a DateTime to a string with the format "yyyy-MM-dd HH:mm:ss.fff". + /// + /// DateTime to convert. + /// String with the format "yyyy-MM-dd HH:mm:ss.fff". + public static string DateTimeToFullDateTimeString(DateTime dateTime) + { + return dateTime.ToString("yyyy-MM-dd HH:mm:ss.fff"); + } + + /// + /// Convert a DateTime to a string with the format "HH:mm:ss". + /// + /// DateTime to convert. + /// String with the format "HH:mm:ss". + public static string DateTimeToTimeString(DateTime dateTime) + { + return dateTime.ToString("HH:mm:ss"); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/DirectoryCreator.cs b/Source/NETworkManager.Utilities/DirectoryCreator.cs deleted file mode 100644 index 0ab5d43a56..0000000000 --- a/Source/NETworkManager.Utilities/DirectoryCreator.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.IO; - - -namespace NETworkManager.Utilities -{ - /// - /// Contains methods to create a directory with sub directories. - /// - public static class DirectoryCreator - { - /// - /// Create a directory with subdirectories and resolve environment variables. - /// - /// Path like "%AppDataLocal%\Folder1". - public static void CreateWithEnvironmentVariables(string path) - { - Directory.CreateDirectory(Environment.ExpandEnvironmentVariables(path)); - } - } -} diff --git a/Source/NETworkManager.Utilities/DirectoryHelper.cs b/Source/NETworkManager.Utilities/DirectoryHelper.cs new file mode 100644 index 0000000000..c7aeef7efb --- /dev/null +++ b/Source/NETworkManager.Utilities/DirectoryHelper.cs @@ -0,0 +1,89 @@ +using System; +using System.IO; +using System.Security; +using log4net; + +namespace NETworkManager.Utilities; + +/// +/// Contains methods interact with directories. +/// +public static class DirectoryHelper +{ + /// + /// Logger for logging. + /// + private static readonly ILog Log = LogManager.GetLogger(typeof(DirectoryHelper)); + + /// + /// Create a directory with subdirectories and resolve environment variables. + /// + /// Path like "%AppDataLocal%\Folder1". + public static void CreateWithEnvironmentVariables(string path) + { + Directory.CreateDirectory(Environment.ExpandEnvironmentVariables(path)); + } + + /// + /// Validates a folder path for correctness and accessibility. + /// Expands environment variables, checks that the path is absolute, + /// validates characters, and ensures it does not point to a file. + /// + /// The path to validate. + /// Description of the path source for logging (e.g., "Policy-provided", "Custom"). + /// Name of the property being validated for logging (e.g., "Settings_FolderLocation"). + /// Message describing what happens on validation failure (e.g., "next priority", "default location"). + /// The validated full path if valid; otherwise, null. + public static string ValidateFolderPath(string path, string pathSource, string propertyName, string fallbackMessage) + { + // Expand environment variables first (e.g. %userprofile%\settings -> C:\Users\...\settings) + path = Environment.ExpandEnvironmentVariables(path); + + // Validate that the path is rooted (absolute) + if (!Path.IsPathRooted(path)) + { + Log.Error($"{pathSource} {propertyName} is not an absolute path: {path}. Falling back to {fallbackMessage}."); + return null; + } + + // Validate that the path doesn't contain invalid characters + try + { + var fullPath = Path.GetFullPath(path); + + // Check if the path is a directory (not a file) + if (File.Exists(fullPath)) + { + Log.Error($"{pathSource} {propertyName} is a file, not a directory: {path}. Falling back to {fallbackMessage}."); + return null; + } + + return Path.TrimEndingDirectorySeparator(fullPath); + } + catch (ArgumentException ex) + { + Log.Error($"{pathSource} {propertyName} contains invalid characters: {path}. Falling back to {fallbackMessage}.", ex); + return null; + } + catch (NotSupportedException ex) + { + Log.Error($"{pathSource} {propertyName} format is not supported: {path}. Falling back to {fallbackMessage}.", ex); + return null; + } + catch (SecurityException ex) + { + Log.Error($"Insufficient permissions to access {pathSource} {propertyName}: {path}. Falling back to {fallbackMessage}.", ex); + return null; + } + catch (PathTooLongException ex) + { + Log.Error($"{pathSource} {propertyName} path is too long: {path}. Falling back to {fallbackMessage}.", ex); + return null; + } + catch (IOException ex) + { + Log.Error($"{pathSource} {propertyName} caused an I/O error: {path}. Falling back to {fallbackMessage}.", ex); + return null; + } + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/DnsLookupHelper.cs b/Source/NETworkManager.Utilities/DnsLookupHelper.cs deleted file mode 100644 index 89fee04ad5..0000000000 --- a/Source/NETworkManager.Utilities/DnsLookupHelper.cs +++ /dev/null @@ -1,92 +0,0 @@ -using DnsClient; -using System; -using System.Net; -using System.Net.NetworkInformation; -using System.Net.Sockets; -using System.Threading.Tasks; - -namespace NETworkManager.Utilities -{ - /// - /// Class provides static helper methods for dns lookup. - /// - public static class DnsLookupHelper - { - - /// - /// Variable holds a dns lookup client, which is initialized with the class. - /// - private static readonly LookupClient DnsLookupClient = new LookupClient(); - - /// - /// Task to asynchronously resolve an hostname from . - /// - /// to resolve. - /// Resolved hostname. - public async static Task ResolveHostname(IPAddress ipAddress) - { - string hostname = string.Empty; - - try - { - var answer = await DnsLookupClient.GetHostNameAsync(ipAddress); - - if (!string.IsNullOrEmpty(answer)) - hostname = answer; - } - -#pragma warning disable CA1031 // Empty string will be returned on error. - catch { } -#pragma warning restore CA1031 - - return hostname; - } - - /// - /// Task to asynchronously resolve an ip address from hostname. - /// - /// Hostname to resolve. - /// Prefer IPv4 address. - /// Resovled . - public async static Task ResolveIPAddress(string hostname, bool preferIPv4 = true) - { - // Append dns suffix to hostname - if (hostname.IndexOf(".", StringComparison.OrdinalIgnoreCase) == -1) - { - var dnsSuffix = IPGlobalProperties.GetIPGlobalProperties().DomainName; - - if (!string.IsNullOrEmpty(dnsSuffix)) - hostname += $".{dnsSuffix}"; - } - - try - { - // Try to resolve the hostname - var ipHostEntrys = await DnsLookupClient.GetHostEntryAsync(hostname); - - if (ipHostEntrys.AddressList.Length != 0) - { - foreach (var ip in ipHostEntrys.AddressList) - { - if (ip.AddressFamily == AddressFamily.InterNetwork && preferIPv4) - return ip; - - if (ip.AddressFamily == AddressFamily.InterNetworkV6 && !preferIPv4) - return ip; - } - - // Fallback --> If we could not resolve our prefered ip protocol for the hostname - foreach (var ip in ipHostEntrys.AddressList) - { - return ip; - } - } - } -#pragma warning disable CA1031 // Null will be returned on error. - catch { } -#pragma warning restore CA1031 - - return null; - } - } -} diff --git a/Source/NETworkManager.Utilities/ExternalProcessStarter.cs b/Source/NETworkManager.Utilities/ExternalProcessStarter.cs index b215a52707..1b973e9a9a 100644 --- a/Source/NETworkManager.Utilities/ExternalProcessStarter.cs +++ b/Source/NETworkManager.Utilities/ExternalProcessStarter.cs @@ -1,46 +1,54 @@ using System.Diagnostics; -namespace NETworkManager.Utilities +namespace NETworkManager.Utilities; + +/// +/// Provides helper methods for starting external processes and opening URLs. +/// +public static class ExternalProcessStarter { - public static class ExternalProcessStarter + /// + /// Open a url with the default browser. + /// + /// Url like: https://github.com/BornToBeRoot + public static void OpenUrl(string url) { - /// - /// Open an url with the default browser. - /// - /// Url like: https://github.com/BornToBeRoot - public static void OpenUrl(string url) - { - // Escape the $ in the command promp - url = url.Replace("&", "^&"); - - Process.Start(new ProcessStartInfo("cmd", $"/c start {url}") { CreateNoWindow = true }); - } + // Escape the $ in the command prompt + url = url.Replace("&", "^&"); - public static void RunProcess(string filename) - { - RunProcess(filename, false); - } + Process.Start(new ProcessStartInfo("cmd", $"/c start {url}") { CreateNoWindow = true }); + } - public static void RunProcess(string filename, bool asAdmin) - { - RunProcess(filename, "", asAdmin); - } + /// + /// Starts an external process by filename. + /// + /// The name or path of the executable to run (e.g. "WF.msc"). + /// If true, the process is started with elevated privileges via UAC. + public static void RunProcess(string filename, bool asAdmin = false) + { + RunProcess(filename, null, asAdmin); + } - public static void RunProcess(string filename, string arguments = "", bool asAdmin = false) + /// + /// Starts an external process by filename with optional arguments. + /// + /// The name or path of the executable to run. + /// Optional command-line arguments to pass to the process. + /// If true, the process is started with elevated privileges via UAC. + public static void RunProcess(string filename, string arguments, bool asAdmin = false) + { + ProcessStartInfo info = new() { - ProcessStartInfo info = new() - { - FileName = filename, - UseShellExecute = true - }; + FileName = filename, + UseShellExecute = true + }; - if (!string.IsNullOrEmpty(arguments)) - info.Arguments = arguments; + if (!string.IsNullOrEmpty(arguments)) + info.Arguments = arguments; - if (asAdmin) - info.Verb = "runas"; + if (asAdmin) + info.Verb = "runas"; - Process.Start(info); - } + Process.Start(info); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/FileSizeConverter.cs b/Source/NETworkManager.Utilities/FileSizeConverter.cs index 68fce62d0d..0e5c655239 100644 --- a/Source/NETworkManager.Utilities/FileSizeConverter.cs +++ b/Source/NETworkManager.Utilities/FileSizeConverter.cs @@ -1,77 +1,77 @@ -namespace NETworkManager.Utilities +namespace NETworkManager.Utilities; + +/// +/// Class provides static methods to convert file size. +/// +public static class FileSizeConverter { /// - /// Class provides static methods to convert file size. + /// Returns the human-readable file size for an arbitrary, 64-bit file size. + /// The default format is "0.### XB", e.g. "4.2 KB" or "1.434 GB". + /// See also: + /// https://stackoverflow.com/questions/281640/how-do-i-get-a-human-readable-file-size-in-bytes-abbreviation-using-net /// - public static class FileSizeConverter + /// File size as to convert. + /// File size as human readable . + public static string GetBytesReadable(long i) { - /// - /// Returns the human-readable file size for an arbitrary, 64-bit file size. - /// The default format is "0.### XB", e.g. "4.2 KB" or "1.434 GB". - /// See also: https://stackoverflow.com/questions/281640/how-do-i-get-a-human-readable-file-size-in-bytes-abbreviation-using-net - /// - /// File size as to convert. - /// File size as human readable . - public static string GetBytesReadable(long i) - { - // Get absolute value - var absolute_i = (i < 0 ? -i : i); - - // Determine the suffix and readable value - string suffix; - double readable; + // Get absolute value + var absolute_i = i < 0 ? -i : i; - if (absolute_i >= 0x1000000000000000) // Exabyte - { - suffix = "EB"; - readable = (i >> 50); - } - else if (absolute_i >= 0x4000000000000) // Petabyte - { - suffix = "PB"; - readable = (i >> 40); - } - else if (absolute_i >= 0x10000000000) // Terabyte - { - suffix = "TB"; - readable = (i >> 30); - } - else if (absolute_i >= 0x40000000) // Gigabyte - { - suffix = "GB"; - readable = (i >> 20); - } - else if (absolute_i >= 0x100000) // Megabyte - { - suffix = "MB"; - readable = (i >> 10); - } - else if (absolute_i >= 0x400) // Kilobyte - { - suffix = "KB"; - readable = i; - } - else - { - return i.ToString("0 B"); // Byte - } + // Determine the suffix and readable value + string suffix; + double readable; - // Divide by 1024 to get fractional value - readable = (readable / 1024); - - // Return formatted number with suffix - return readable.ToString("0.## ") + suffix; + if (absolute_i >= 0x1000000000000000) // Exabyte + { + suffix = "EB"; + readable = i >> 50; } - - /// - /// Method to convert speed as bytes to human readable string. - /// - /// Bytes as . - /// Suffix which is appended to the converted bytes. - /// Speed as human readable . - public static string GetBytesSpeedReadable(long i, string suffix) + else if (absolute_i >= 0x4000000000000) // Petabyte + { + suffix = "PB"; + readable = i >> 40; + } + else if (absolute_i >= 0x10000000000) // Terabyte + { + suffix = "TB"; + readable = i >> 30; + } + else if (absolute_i >= 0x40000000) // Gigabyte + { + suffix = "GB"; + readable = i >> 20; + } + else if (absolute_i >= 0x100000) // Megabyte { - return GetBytesReadable(i) + suffix; + suffix = "MB"; + readable = i >> 10; } + else if (absolute_i >= 0x400) // Kilobyte + { + suffix = "KB"; + readable = i; + } + else + { + return i.ToString("0 B"); // Byte + } + + // Divide by 1024 to get fractional value + readable /= 1024; + + // Return formatted number with suffix + return readable.ToString("0.## ") + suffix; + } + + /// + /// Method to convert speed as bytes to human readable string. + /// + /// Bytes as . + /// Suffix which is appended to the converted bytes. + /// Speed as human readable . + public static string GetBytesSpeedReadable(long i, string suffix) + { + return GetBytesReadable(i) + suffix; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/HotKeys.cs b/Source/NETworkManager.Utilities/HotKeys.cs index a097506e57..95dc903bee 100644 --- a/Source/NETworkManager.Utilities/HotKeys.cs +++ b/Source/NETworkManager.Utilities/HotKeys.cs @@ -1,98 +1,97 @@ -using System.Windows.Input; +using System.Windows.Forms; +using System.Windows.Input; -namespace NETworkManager.Utilities +namespace NETworkManager.Utilities; + +/// +/// Class provides static methods for hotkeys. +/// +public static class HotKeys { /// - /// Class provides static methods for hotkeys. + /// Method to calculate the sum of the modifier keys. /// - public static class HotKeys + /// . + /// Sum of the calculated modifier keys. + public static int GetModifierKeysSum(ModifierKeys modifierKeys) { - /// - /// Method to calculate the sum of the modifier keys. - /// - /// . - /// Sum of the calculated modifier keys. - public static int GetModifierKeysSum(ModifierKeys modifierKeys) - { - var sum = 0x0000; + var sum = 0x0000; - if (modifierKeys.HasFlag(ModifierKeys.Alt)) - sum += 0x0001; + if (modifierKeys.HasFlag(ModifierKeys.Alt)) + sum += 0x0001; - if (modifierKeys.HasFlag(ModifierKeys.Control)) - sum += 0x0002; + if (modifierKeys.HasFlag(ModifierKeys.Control)) + sum += 0x0002; - if (modifierKeys.HasFlag(ModifierKeys.Shift)) - sum += 0x0004; + if (modifierKeys.HasFlag(ModifierKeys.Shift)) + sum += 0x0004; - if (modifierKeys.HasFlag(ModifierKeys.Windows)) - sum += 0x0008; + if (modifierKeys.HasFlag(ModifierKeys.Windows)) + sum += 0x0008; - return sum; - } + return sum; + } - /// - /// Method to convert WPF key to WinForms key. - /// - /// WPF key. - /// WinForms key. - public static System.Windows.Forms.Keys WpfKeyToFormsKeys(Key key) - { - return (System.Windows.Forms.Keys)KeyInterop.VirtualKeyFromKey(key); - } + /// + /// Method to convert WPF key to WinForms key. + /// + /// WPF key. + /// WinForms key. + public static Keys WpfKeyToFormsKeys(Key key) + { + return (Keys)KeyInterop.VirtualKeyFromKey(key); + } - /// - /// Method to convert WinForms key to WPF key. - /// - /// WinForms key. - /// WPF key. - public static Key FormsKeysToWpfKey(System.Windows.Forms.Keys keys) + /// + /// Method to convert WinForms key to WPF key. + /// + /// WinForms key. + /// WPF key. + public static Key FormsKeysToWpfKey(Keys keys) + { + return FormsKeysToWpfKey((int)keys); + } + + /// + /// Method to convert WinForms key to WPF key. + /// + /// WinForms key as . + /// WPF key. + public static Key FormsKeysToWpfKey(int keys) + { + return KeyInterop.KeyFromVirtualKey(keys); + } + + /// + /// Method to get modifier keys from an value. + /// + /// Modifier key as . + /// Return . + public static ModifierKeys GetModifierKeysFromInt(int modifierKeys) + { + var modKeys = ModifierKeys.None; + + if (modifierKeys - 0x0008 >= 0) { - return FormsKeysToWpfKey((int)keys); + modKeys |= ModifierKeys.Windows; + modifierKeys -= 0x0008; } - /// - /// Method to convert WinForms key to WPF key. - /// - /// WinForms key as . - /// WPF key. - - public static Key FormsKeysToWpfKey(int keys) + if (modifierKeys - 0x0004 >= 0) { - return KeyInterop.KeyFromVirtualKey(keys); + modKeys |= ModifierKeys.Shift; + modifierKeys -= 0x0004; } - /// - /// Method to get modifier keys from an value. - /// - /// Modifier key as . - /// Return . - public static ModifierKeys GetModifierKeysFromInt(int modifierKeys) + if (modifierKeys - 0x0002 >= 0) { - var modKeys = ModifierKeys.None; - - if (modifierKeys - 0x0008 >= 0) - { - modKeys |= ModifierKeys.Windows; - modifierKeys -= 0x0008; - } - - if (modifierKeys - 0x0004 >= 0) - { - modKeys |= ModifierKeys.Shift; - modifierKeys -= 0x0004; - } - - if (modifierKeys - 0x0002 >= 0) - { - modKeys |= ModifierKeys.Control; - modifierKeys -= 0x0002; - } - - if (modifierKeys - 0x0001 >= 0) - modKeys |= ModifierKeys.Alt; - - return modKeys; + modKeys |= ModifierKeys.Control; + modifierKeys -= 0x0002; } + + if (modifierKeys - 0x0001 >= 0) + modKeys |= ModifierKeys.Alt; + + return modKeys; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/IPAddressComparer.cs b/Source/NETworkManager.Utilities/IPAddressComparer.cs new file mode 100644 index 0000000000..cddb9e42d5 --- /dev/null +++ b/Source/NETworkManager.Utilities/IPAddressComparer.cs @@ -0,0 +1,21 @@ +using System.Collections.Generic; +using System.Net; + +namespace NETworkManager.Utilities; + +/// +/// IP address comparer. +/// +public class IPAddressComparer : IComparer +{ + /// + /// Compare two IP addresses. + /// + /// First IP address. + /// Second IP address. + /// 0 if the IP addresses are equal, otherwise a negative or positive value. + public int Compare(IPAddress x, IPAddress y) + { + return IPAddressHelper.CompareIPAddresses(x, y); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/IPAddressHelper.cs b/Source/NETworkManager.Utilities/IPAddressHelper.cs new file mode 100644 index 0000000000..0a7a1255de --- /dev/null +++ b/Source/NETworkManager.Utilities/IPAddressHelper.cs @@ -0,0 +1,40 @@ +using System.Net; + +namespace NETworkManager.Utilities; + +public static class IPAddressHelper +{ + /// + /// Test if an IP address is a private address. + /// + /// IP address. + /// True if the IP address is a private address, otherwise false. + public static bool IsPrivateIPAddress(IPAddress ipAddress) + { + var addressBytes = ipAddress.GetAddressBytes(); + + switch (addressBytes.Length) + { + // Check for IPv4 private addresses + case 4 when addressBytes[0] == 10 + || (addressBytes[0] == 172 && addressBytes[1] >= 16 && addressBytes[1] <= 31) + || (addressBytes[0] == 192 && addressBytes[1] == 168): + // Check for IPv6 unique local addresses (ULA) + case 16 when addressBytes[0] == 0xFC || addressBytes[0] == 0xFD: + return true; + default: + return false; + } + } + + /// + /// Compare two IP addresses. + /// + /// First IP address. + /// Second IP address. + /// 0 if the IP addresses are equal, otherwise a negative or positive value. + public static int CompareIPAddresses(IPAddress x, IPAddress y) + { + return ByteHelper.Compare(x.GetAddressBytes(), y.GetAddressBytes()); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/ListHelper.cs b/Source/NETworkManager.Utilities/ListHelper.cs index 099d11ae95..93815c0c3c 100644 --- a/Source/NETworkManager.Utilities/ListHelper.cs +++ b/Source/NETworkManager.Utilities/ListHelper.cs @@ -1,35 +1,38 @@ -using System.Collections.Generic; - -namespace NETworkManager.Utilities +using System; +using System.Collections.Generic; + +namespace NETworkManager.Utilities; +/// +/// Helper class for modifying lists by adding new entries and removing old ones if the list exceeds a specified length. +/// +public static class ListHelper { - public static class ListHelper + /// + /// Modify a list by adding the and removing the oldest entry if the list is full. + /// If an entry or multiple ones already exist in the list, they will be removed before adding the new entry. + /// + /// List to modify. Used with to add and remove entries. + /// Entry to add to the list. + /// Maximum length of the list. Oldest entries will be removed if the list exceeds this length. + /// Type of the list entries. Currently or . + /// Modified list with the new entry added and oldest entries removed if necessary. + public static List Modify(List list, T entry, int length) { - public static List Modify(List list, string entry, int length) - { - var index = list.IndexOf(entry); - - if (index != -1) - list.RemoveAt(index); - else if (list.Count == length) - list.RemoveAt(length - 1); - - list.Insert(0, entry); + int index; - return list; + while ((index = list.IndexOf(entry)) != -1) + { + list.RemoveAt(index); } - public static List Modify(List list, int entry, int length) - { - var index = list.IndexOf(entry); + if (length <= 0) + throw new ArgumentOutOfRangeException(nameof(length), "Length must be greater than zero."); - if (index != -1) - list.RemoveAt(index); - else if (list.Count == length) - list.RemoveAt(length - 1); + while (list.Count >= length) + list.RemoveAt(list.Count - 1); - list.Insert(0, entry); + list.Insert(0, entry); - return list; - } + return list; } } diff --git a/Source/NETworkManager.Utilities/LvlChartsDefaultInfo.cs b/Source/NETworkManager.Utilities/LvlChartsDefaultInfo.cs index 3d31ad5813..974029e9ee 100644 --- a/Source/NETworkManager.Utilities/LvlChartsDefaultInfo.cs +++ b/Source/NETworkManager.Utilities/LvlChartsDefaultInfo.cs @@ -1,15 +1,9 @@ using System; -namespace NETworkManager.Utilities -{ - public class LvlChartsDefaultInfo - { - public DateTime DateTime { get; } - public double Value { get; set; } - public LvlChartsDefaultInfo(DateTime dateTime, double value) - { - DateTime = dateTime; - Value = value; - } - } -} +namespace NETworkManager.Utilities; + +public class LvlChartsDefaultInfo(DateTime dateTime, double value) +{ + public DateTime DateTime { get; } = dateTime; + public double Value { get; } = value; +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/MACAddressHelper.cs b/Source/NETworkManager.Utilities/MACAddressHelper.cs index 60c6bdca92..9b581f93e1 100644 --- a/Source/NETworkManager.Utilities/MACAddressHelper.cs +++ b/Source/NETworkManager.Utilities/MACAddressHelper.cs @@ -3,51 +3,87 @@ using System.Net.NetworkInformation; using System.Text.RegularExpressions; -namespace NETworkManager.Utilities +namespace NETworkManager.Utilities; + +public static class MACAddressHelper { - public static class MACAddressHelper + /// + /// Convert a MAC-Address to a byte array + /// + /// MAC-Address to convert + /// Byte array of the MAC-Address + public static byte[] ConvertStringToByteArray(string macAddress) { - /// - /// Convert a MAC-Address to a byte array - /// - /// - /// - public static byte[] ConvertStringToByteArray(string macAddress) - { - // Regex to replace "-" and ":" in MAC-Address - var regex = new Regex("[-|:|.]"); - var mac = regex.Replace(macAddress, ""); + // Regex to replace "-" and ":" in MAC-Address + var regex = new Regex("[-|:|.]"); + var mac = regex.Replace(macAddress, ""); - // Build the byte-array - var bytes = new byte[mac.Length / 2]; + // Build the byte-array + var bytes = new byte[mac.Length / 2]; - // Convert the MAC-Address into byte and fill it... - for (var i = 0; i < 12; i += 2) - bytes[i / 2] = Convert.ToByte(mac.Substring(i, 2), 16); + // Convert the MAC-Address into byte and fill it... + for (var i = 0; i < 12; i += 2) + bytes[i / 2] = Convert.ToByte(mac.Substring(i, 2), 16); - return bytes; - } + return bytes; + } - public static string GetDefaultFormat(string macAddress) - { - macAddress = macAddress.ToUpper(); - if (macAddress.Contains("-")) - return macAddress.Replace("-", ":"); + /// + /// Format a MAC-Address to the default format (00:00:00:00:00:00). + /// + /// MAC-Address to format + /// MAC-Address in default format + public static string GetDefaultFormat(string macAddress) + { + return Format(macAddress, ":"); + } - return !macAddress.Contains(":") ? string.Join(":", Enumerable.Range(0, 6).Select(i => macAddress.Substring(i * 2, 2))) : macAddress; - } + /// + /// Format a MAC-Address to a specific format (e.g. 00:00:00:00:00:00, 00-00-00-00-00-00, 0000.0000.0000 or + /// 000000000000) + /// + /// MAC-Address to format + /// Separator to use (e.g. -, :, . or empty) + /// Convert the MAC-Address to upper case + /// + public static string Format(string macAddress, string separator = "", bool toUpper = true) + { + macAddress = macAddress.Replace("-", "") + .Replace(":", "") + .Replace(".", ""); - public static string GetDefaultFormat(PhysicalAddress macAddress) - { - return GetDefaultFormat(macAddress.ToString()); - } + if (toUpper) + macAddress = macAddress.ToUpper(); - public static string Format(string macAddress, string separator = "") + return separator switch { - macAddress = macAddress.ToUpper().Replace("-", "").Replace(":", ""); + "-" => string.Join(separator, Enumerable.Range(0, 6).Select(i => macAddress.Substring(i * 2, 2))), + ":" => string.Join(separator, Enumerable.Range(0, 6).Select(i => macAddress.Substring(i * 2, 2))), + "." => string.Join(separator, Enumerable.Range(0, 3).Select(i => macAddress.Substring(i * 4, 4))), + _ => macAddress + }; + } - return string.Join(separator, Enumerable.Range(0, 6).Select(i => macAddress.Substring(i * 2, 2))); - } + /// + /// Compare two MAC-Addresses. + /// + /// First MAC-Address. + /// Second MAC-Address. + /// 0 if the MAC-Addresses are equal, otherwise a negative or positive value. + public static int CompareMACAddresses(string x, string y) + { + return ByteHelper.Compare(ConvertStringToByteArray(x), ConvertStringToByteArray(y)); + } + + /// + /// Compare two MAC-Addresses. + /// + /// First MAC-Address. + /// Second MAC-Address. + /// 0 if the MAC-Addresses are equal, otherwise a negative or positive value. + public static int CompareMACAddresses(PhysicalAddress x, PhysicalAddress y) + { + return ByteHelper.Compare(x.GetAddressBytes(), y.GetAddressBytes()); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/NETworkManager.Utilities.csproj b/Source/NETworkManager.Utilities/NETworkManager.Utilities.csproj index d1be0f0986..9c362597b9 100644 --- a/Source/NETworkManager.Utilities/NETworkManager.Utilities.csproj +++ b/Source/NETworkManager.Utilities/NETworkManager.Utilities.csproj @@ -1,26 +1,21 @@ - - - {5C3D1749-D260-4566-B448-B94B3AD9EEFF} - Library - NETworkManager.Utilities - NETworkManager.Utilities - net6.0-windows10.0.17763.0 - win10-x64 - false - true - true - false - - - - - - - - - - - - \ No newline at end of file + + + {5C3D1749-D260-4566-B448-B94B3AD9EEFF} + Library + NETworkManager.Utilities + NETworkManager.Utilities + net10.0-windows10.0.22621.0 + false + true + true + false + false + + + + + + + + + diff --git a/Source/NETworkManager.Utilities/NativeMethods.cs b/Source/NETworkManager.Utilities/NativeMethods.cs index cd3b0ab8fd..0314edab17 100644 --- a/Source/NETworkManager.Utilities/NativeMethods.cs +++ b/Source/NETworkManager.Utilities/NativeMethods.cs @@ -1,77 +1,233 @@ // Source: https://github.com/jimradford/superputty/blob/master/SuperPutty/Utils/NativeMethods.cs using System; -using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; -namespace NETworkManager.Utilities +namespace NETworkManager.Utilities; + +public class NativeMethods { - public class NativeMethods + #region Win32 Constants + + public const int GWL_STYLE = -16; + public const int WS_THICKFRAME = 0x00040000; + public const int SWP_NOZORDER = 0x0004; + public const int SWP_NOACTIVATE = 0x0010; + public const long WS_POPUP = 0x80000000L; + public const long WS_CAPTION = 0x00C00000L; + + /// The value returned by CreateFile on failure. + public static readonly IntPtr INVALID_HANDLE_VALUE = new(-1); + + #endregion + + #region Enum + + public enum WindowShowStyle : uint { - #region Win32 Constants - public const int GWL_STYLE = -16; - public const int WS_THICKFRAME = 0x00040000; - public const int SWP_NOZORDER = 0x0004; - public const int SWP_NOACTIVATE = 0x0010; - public const long WS_POPUP = 0x80000000L; - public const long WS_CAPTION = 0x00C00000L; - #endregion - - #region Enum - - public enum WindowShowStyle : uint - { - Hide = 0, - ShowNormal = 1, - ShowMinimized = 2, - ShowMaximized = 3, - Maximize = 3, - ShowNormalNoActivate = 4, - Show = 5, - Minimize = 6, - ShowMinNoActivate = 7, - ShowNoActivate = 8, - Restore = 9, - ShowDefault = 10, - ForceMinimized = 11 - } + Hide = 0, + ShowNormal = 1, + ShowMinimized = 2, + ShowMaximized = 3, + Maximize = 3, + ShowNormalNoActivate = 4, + Show = 5, + Minimize = 6, + ShowMinNoActivate = 7, + ShowNoActivate = 8, + Restore = 9, + ShowDefault = 10, + ForceMinimized = 11 + } - public enum WM : uint - { - SYSCOMMAND = 0x0112 - } - #endregion + public enum WM : uint + { + SYSCOMMAND = 0x0112 + } + + #endregion + + #region Structs + + [StructLayout(LayoutKind.Sequential)] + public struct RECT + { + public int left, top, right, bottom; + } + + [StructLayout(LayoutKind.Sequential)] + public struct COORD + { + public short X; + public short Y; + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct CONSOLE_FONT_INFOEX + { + public uint cbSize; + public uint nFont; + public COORD dwFontSize; + public uint FontFamily; + public uint FontWeight; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] + public string FaceName; + } + + #endregion + + #region Pinvoke/Win32 Methods + + [DllImport("user32.dll", SetLastError = true)] + public static extern long SetParent(IntPtr hWndChild, IntPtr hWndParent); + + [DllImport("user32.dll", EntryPoint = "GetWindowLongA", SetLastError = true)] + public static extern long GetWindowLong(IntPtr hWnd, int nIndex); + + // https://msdn.microsoft.com/en-us/library/windows/desktop/ms644898%28v=vs.85%29.aspx + public static IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong) + { + return IntPtr.Size == 8 + ? SetWindowLongPtr64(hWnd, nIndex, dwNewLong) + : new IntPtr(SetWindowLong32(hWnd, nIndex, dwNewLong)); + } + + [DllImport("user32.dll", EntryPoint = "SetWindowLong")] + private static extern int SetWindowLong32(IntPtr hWnd, int nIndex, IntPtr dwNewLong); + + [DllImport("user32.dll", EntryPoint = "SetWindowLongPtr")] + private static extern IntPtr SetWindowLongPtr64(IntPtr hWnd, int nIndex, IntPtr dwNewLong); + + [DllImport("user32.dll", EntryPoint = "SetWindowPos")] + public static extern IntPtr SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int Y, int cx, int cy, + int wFlags); + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); + + [DllImport("user32.dll")] + public static extern bool ShowWindow(IntPtr hWnd, WindowShowStyle nCmdShow); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] + public static extern bool SetForegroundWindow(IntPtr hWnd); + + /// + /// Returns the DPI (dots per inch) value for the monitor that contains the specified window. + /// Returns 0 if the window handle is invalid. Available on Windows 10 version 1607+. + /// + [DllImport("user32.dll")] + public static extern uint GetDpiForWindow(IntPtr hWnd); + + [DllImport("user32.dll", SetLastError = true)] + public static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect); + + [DllImport("kernel32.dll", SetLastError = true)] + public static extern bool AttachConsole(uint dwProcessId); + + [DllImport("kernel32.dll", SetLastError = true)] + public static extern bool FreeConsole(); + + [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] + private static extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess, uint dwShareMode, + IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile); + + [DllImport("kernel32.dll", SetLastError = true)] + private static extern bool CloseHandle(IntPtr hObject); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + private static extern bool GetCurrentConsoleFontEx(IntPtr hConsoleOutput, bool bMaximumWindow, + ref CONSOLE_FONT_INFOEX lpConsoleCurrentFontEx); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + private static extern bool SetCurrentConsoleFontEx(IntPtr hConsoleOutput, bool bMaximumWindow, + ref CONSOLE_FONT_INFOEX lpConsoleCurrentFontEx); - #region Pinvoke/Win32 Methods - [DllImport("user32.dll", SetLastError = true)] - public static extern long SetParent(IntPtr hWndChild, IntPtr hWndParent); + #endregion - [DllImport("user32.dll", EntryPoint = "GetWindowLongA", SetLastError = true)] - public static extern long GetWindowLong(IntPtr hWnd, int nIndex); + #region Helpers - // http://msdn.microsoft.com/en-us/library/windows/desktop/ms644898%28v=vs.85%29.aspx - public static IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong) + /// + /// Attaches to 's console and rescales its current font + /// by using SetCurrentConsoleFontEx. + /// This is a cross-process-safe approach that bypasses WM_DPICHANGED message passing + /// entirely. Works for any conhost-based console (PowerShell, cmd, etc.). + /// + public static void TryRescaleConsoleFont(uint processId, double scaleFactor) + { + if (Math.Abs(scaleFactor - 1.0) < 0.01) + return; + + if (!AttachConsole(processId)) + return; + + const uint GENERIC_READ_WRITE = 0xC0000000u; + const uint FILE_SHARE_READ_WRITE = 3u; + const uint OPEN_EXISTING = 3u; + + var hOut = CreateFile("CONOUT$", GENERIC_READ_WRITE, FILE_SHARE_READ_WRITE, + IntPtr.Zero, OPEN_EXISTING, 0u, IntPtr.Zero); + + try + { + if (hOut == INVALID_HANDLE_VALUE) + return; + + try + { + var fi = new CONSOLE_FONT_INFOEX { cbSize = (uint)Marshal.SizeOf() }; + if (GetCurrentConsoleFontEx(hOut, false, ref fi)) + { + fi.dwFontSize.Y = (short)Math.Max(1, (int)Math.Round(fi.dwFontSize.Y * scaleFactor)); + fi.cbSize = (uint)Marshal.SizeOf(); + SetCurrentConsoleFontEx(hOut, false, ref fi); + } + } + finally + { + CloseHandle(hOut); + } + } + finally { - return IntPtr.Size == 8 ? SetWindowLongPtr64(hWnd, nIndex, dwNewLong) : new IntPtr(SetWindowLong32(hWnd, nIndex, dwNewLong)); + FreeConsole(); } + } - [DllImport("user32.dll", EntryPoint = "SetWindowLong")] - private static extern int SetWindowLong32(IntPtr hWnd, int nIndex, IntPtr dwNewLong); + /// + /// Sends a WM_DPICHANGED message to a GUI window (e.g. PuTTY) so it can + /// rescale its fonts and layout internally. This is necessary because + /// WM_DPICHANGED is not reliably forwarded to cross-process child windows + /// embedded via SetParent. Requires PuTTY 0.75+ to take effect. + /// + public static void TrySendDpiChangedMessage(IntPtr hWnd, double oldDpi, double newDpi) + { + if (hWnd == IntPtr.Zero) + return; - [DllImport("user32.dll", EntryPoint = "SetWindowLongPtr")] - private static extern IntPtr SetWindowLongPtr64(IntPtr hWnd, int nIndex, IntPtr dwNewLong); + if (Math.Abs(newDpi - oldDpi) < 0.01) + return; - [DllImport("user32.dll", EntryPoint = "SetWindowPos")] - public static extern IntPtr SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags); + const uint WM_DPICHANGED = 0x02E0; - [DllImport("user32.dll", CharSet = CharSet.Auto)] - public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); + var newDpiInt = (int)Math.Round(newDpi); + var wParam = (IntPtr)((newDpiInt << 16) | newDpiInt); // HIWORD = Y DPI, LOWORD = X DPI - [DllImport("user32.dll", SetLastError = true)] - public static extern bool MoveWindow(IntPtr hWnd, int x, int y, int cx, int cy, bool repaint); + // Build the suggested new rect from the current window position. + var rect = new RECT(); + GetWindowRect(hWnd, ref rect); - [DllImport("user32.dll")] - public static extern bool ShowWindow(IntPtr hWnd, WindowShowStyle nCmdShow); - #endregion + // lParam must point to a RECT with the suggested new size/position. + var lParam = Marshal.AllocHGlobal(Marshal.SizeOf()); + try + { + Marshal.StructureToPtr(rect, lParam, false); + SendMessage(hWnd, WM_DPICHANGED, wParam, lParam); + } + finally + { + Marshal.FreeHGlobal(lParam); + } } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/PlaceholderHelper.cs b/Source/NETworkManager.Utilities/PlaceholderHelper.cs new file mode 100644 index 0000000000..2e206f1c9e --- /dev/null +++ b/Source/NETworkManager.Utilities/PlaceholderHelper.cs @@ -0,0 +1,53 @@ +using System.Text.RegularExpressions; + +namespace NETworkManager.Utilities; + +/// +/// Helper class to resolve {{name}} placeholders in a string. +/// +public static class PlaceholderHelper +{ + /// + /// Placeholder name for the host (e.g. of a profile). + /// + public const string Host = "host"; + + /// + /// Placeholder name for a hostname. + /// + public const string Hostname = "hostname"; + + /// + /// Placeholder name for an IP address. + /// + public const string IPAddress = "ipaddress"; + + /// + /// Replaces a {{name}} placeholder (case-insensitive) with the given value. + /// + /// Input string that may contain the placeholder. + /// Name of the placeholder, without the surrounding braces (e.g. "hostname"). + /// Value to insert in place of the placeholder. + /// The input with the placeholder resolved. + public static string Replace(string input, string name, string value) + { + return string.IsNullOrEmpty(input) + ? input + : Regex.Replace(input, $"\\{{\\{{{Regex.Escape(name)}\\}}\\}}", value ?? string.Empty, + RegexOptions.IgnoreCase); + } + + /// + /// Replaces multiple {{name}} placeholders (case-insensitive) with the given values. + /// + /// Input string that may contain the placeholders. + /// Placeholder name/value pairs to resolve, e.g. (PlaceholderHelper.Host, "10.0.0.1"). + /// The input with all placeholders resolved. + public static string Resolve(string input, params (string name, string value)[] placeholders) + { + foreach (var (name, value) in placeholders) + input = Replace(input, name, value); + + return input; + } +} diff --git a/Source/NETworkManager.Utilities/PortRangeHelper.cs b/Source/NETworkManager.Utilities/PortRangeHelper.cs index dbd7217c94..b2b40586b7 100644 --- a/Source/NETworkManager.Utilities/PortRangeHelper.cs +++ b/Source/NETworkManager.Utilities/PortRangeHelper.cs @@ -1,38 +1,32 @@ -using System.Threading.Tasks; -using System.Collections.Generic; +using System.Collections.Generic; +using System.Threading.Tasks; -namespace NETworkManager.Utilities +namespace NETworkManager.Utilities; + +public static class PortRangeHelper { - public static class PortRangeHelper + public static Task ConvertPortRangeToIntArrayAsync(string portRange) { - public static Task ConvertPortRangeToIntArrayAsync(string portRange) - { - return Task.Run(() => ConvertPortRangeToIntArray(portRange)); - } + return Task.Run(() => ConvertPortRangeToIntArray(portRange)); + } - // Generate from a string like "9; 11-13; 15" an list with "9,11,12,13,15" - public static int[] ConvertPortRangeToIntArray(string portRange) - { - var list = new List(); + // Generate from a string like "9; 11-13; 15" an list with "9,11,12,13,15" + public static int[] ConvertPortRangeToIntArray(string portRange) + { + var list = new List(); - foreach (var portOrRange in portRange.Replace(" ", "").Split(';')) + foreach (var portOrRange in portRange.Replace(" ", "").Split(';')) + if (portOrRange.Contains('-')) { - if (portOrRange.Contains("-")) - { - var portRangeSplit = portOrRange.Split('-'); + var portRangeSplit = portOrRange.Split('-'); - for (var i = int.Parse(portRangeSplit[0]); i < int.Parse(portRangeSplit[1]) + 1; i++) - { - list.Add(i); - } - } - else - { - list.Add(int.Parse(portOrRange)); - } + for (var i = int.Parse(portRangeSplit[0]); i < int.Parse(portRangeSplit[1]) + 1; i++) list.Add(i); + } + else + { + list.Add(int.Parse(portOrRange)); } - return list.ToArray(); - } + return list.ToArray(); } } \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/PowerShellHelper.cs b/Source/NETworkManager.Utilities/PowerShellHelper.cs index 78f3280c7c..42296e9d90 100644 --- a/Source/NETworkManager.Utilities/PowerShellHelper.cs +++ b/Source/NETworkManager.Utilities/PowerShellHelper.cs @@ -1,28 +1,10 @@ -using System.Diagnostics; +namespace NETworkManager.Utilities; -namespace NETworkManager.Utilities +public static class PowerShellHelper { - public static class PowerShellHelper - { - public static void ExecuteCommand(string command, bool asAdmin = false, ProcessWindowStyle windowStyle = ProcessWindowStyle.Hidden) - { - var info = new ProcessStartInfo() - { - FileName = "powershell.exe", - Arguments = $"-NoProfile -NoLogo -Command {command}", - UseShellExecute = true, - WindowStyle = windowStyle - }; - - if (asAdmin) - info.Verb = "runas"; - - using var process = new Process(); - - process.StartInfo = info; - - process.Start(); - process.WaitForExit(); - } - } + /// + /// Escapes a string for safe embedding inside a PowerShell single-quoted string + /// by doubling any single-quote characters. + /// + public static string EscapeSingleQuotes(string value) => value.Replace("'", "''"); } diff --git a/Source/NETworkManager.Utilities/Properties/AssemblyInfo.cs b/Source/NETworkManager.Utilities/Properties/AssemblyInfo.cs index 2a46c5f934..e2345bdf42 100644 --- a/Source/NETworkManager.Utilities/Properties/AssemblyInfo.cs +++ b/Source/NETworkManager.Utilities/Properties/AssemblyInfo.cs @@ -4,8 +4,5 @@ [assembly: AssemblyTitle("NETworkManager.Utilities")] [assembly: AssemblyDescription("Library contains NETworkManager utilities.")] [assembly: AssemblyProduct("NETworkManager.Utilities")] - - [assembly: ComVisible(false)] - [assembly: Guid("5c3d1749-d260-4566-b448-b94b3ad9eeff")] \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/PropertyChangedBase.cs b/Source/NETworkManager.Utilities/PropertyChangedBase.cs new file mode 100644 index 0000000000..5a16bf302f --- /dev/null +++ b/Source/NETworkManager.Utilities/PropertyChangedBase.cs @@ -0,0 +1,14 @@ +using System.ComponentModel; +using System.Runtime.CompilerServices; + +namespace NETworkManager.Utilities; + +public abstract class PropertyChangedBase : INotifyPropertyChanged +{ + public event PropertyChangedEventHandler PropertyChanged; + + protected void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/RegexHelper.cs b/Source/NETworkManager.Utilities/RegexHelper.cs index 020c2d704e..0785fc2fa6 100644 --- a/Source/NETworkManager.Utilities/RegexHelper.cs +++ b/Source/NETworkManager.Utilities/RegexHelper.cs @@ -1,90 +1,195 @@ -using System.Diagnostics.CodeAnalysis; +using System.Text.RegularExpressions; -namespace NETworkManager.Utilities -{ - public static class RegexHelper - { - /// - /// Match an IPv4-Address like 192.168.178.1 - /// - private const string IPv4AddressValues = @"((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"; - - /// - /// Match exactly an IPv4-Address like 192.168.178.1 - /// - public const string IPv4AddressRegex = "^" + IPv4AddressValues + "$"; - - // Match IPv4-Address within a string - public const string IPv4AddressExctractRegex = IPv4AddressValues; - - // Match IPv4-Address Range like 192.168.178.1-192.168.178.127 - public const string IPv4AddressRangeRegex = "^" + IPv4AddressValues + "-" + IPv4AddressValues + "$"; - - // Match a MAC-Address 000000000000 00:00:00:00:00:00, 00-00-00-00-00-00-00 or 0000.0000.0000 - public const string MACAddressRegex = @"^^[A-Fa-f0-9]{12}$|^[A-Fa-f0-9]{2}(:|-){1}[A-Fa-f0-9]{2}(:|-){1}[A-Fa-f0-9]{2}(:|-){1}[A-Fa-f0-9]{2}(:|-){1}[A-Fa-f0-9]{2}(:|-){1}[A-Fa-f0-9]{2}$|^[A-Fa-f0-9]{4}.[A-Fa-f0-9]{4}.[A-Fa-f0-9]{4}$$"; - - // Matche the first 3 bytes of a MAC-Address 000000, 00:00:00, 00-00-00 - public const string MACAddressFirst3BytesRegex = @"^[A-Fa-f0-9]{6}$|^[A-Fa-f0-9]{2}(:|-){1}[A-Fa-f0-9]{2}(:|-){1}[A-Fa-f0-9]{2}$|^[A-Fa-f0-9]{4}.[A-Fa-f0-9]{2}$"; - - // Private subnetmask / cidr values - private const string SubnetmaskValues = @"(((255\.){3}(255|254|252|248|240|224|192|128|0+))|((255\.){2}(255|254|252|248|240|224|192|128|0+)\.0)|((255\.)(255|254|252|248|240|224|192|128|0+)(\.0+){2})|((255|254|252|248|240|224|192|128|0+)(\.0+){3}))"; - private const string CidrRegex = @"([1-9]|[1-2][0-9]|3[0-2])"; - - // Match a Subnetmask like 255.255.255.0 - public const string SubnetmaskRegex = @"^" + SubnetmaskValues + @"$"; - - // Match a subnet from 192.168.178.0/1 to 192.168.178.0/32 - public const string IPv4AddressCidrRegex = @"^" + IPv4AddressValues + @"\/" + CidrRegex + @"$"; - - // Match a subnet from 192.168.178.0/0 to 192.168.178.0/32 - public const string SubnetCalculatorIPv4AddressCidrRegex = @"^" + IPv4AddressValues + @"\/" + CidrRegex + @"$"; - - // Match a subnet from 192.168.178.0/192.0.0.0 to 192.168.178.0/255.255.255.255 - public const string IPv4AddressSubnetmaskRegex = @"^" + IPv4AddressValues + @"\/" + SubnetmaskValues + @"$"; - - // Match a subnet from 192.168.178.0/0.0.0.0 to 192.168.178.0/255.255.255.255 - public const string SubnetCalculatorIPv4AddressSubnetmaskRegex = "^" + IPv4AddressValues + @"\/" + SubnetmaskValues + @"$"; - - // Match IPv6 address - public const string IPv6AddressRegex = @"(?:^|(?<=\s))(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))(?=\s|$)"; +namespace NETworkManager.Utilities; - // Match IPv6 address within a string - public const string IPv6AddressExctractRegex = IPv6AddressRegex; - - // Match a subnet like 2001:0db8::/64 - public const string IPv6AddressCidrRegex = @"^s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))(%.+)?s*(\/([0-9]|[1-9][0-9]|1[0-1][0-9]|12[0-8])){1}?$"; - - // Match a range like [0-255], [0,2,4] and [2,4-6] - public const string SpecialRangeRegex = @"\[((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)-(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)))([,]((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)-(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))))*\]"; - - // Match a IPv4-Address like 192.168.[50-100].1 - public const string IPv4AddressSpecialRangeRegex = @"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|" + SpecialRangeRegex + @")\.){3}((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|" + SpecialRangeRegex + @")$"; - - // Private hostname values - private const string HostnameValues = @"(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])"; - - // Hostname regex - public const string HostnameRegex = @"^" + HostnameValues + @"$"; - - // Match a hostname with cidr like server-01.example.com/24 - public const string HostnameCidrRegex = @"^" + HostnameValues + @"\/" + CidrRegex + @"$"; - - // Match a hostname with subnetmask like server-01.example.com/255.255.255.0 - public const string HostnameSubnetmaskRegex = @"^" + HostnameValues + @"\/" + SubnetmaskValues + @"$"; - - // Match a domain local.example.com - public const string DomainRegex = @"^(?!:\/\/)([a-zA-Z0-9-_]+\.)*[a-zA-Z0-9][a-zA-Z0-9-_]+\.[a-zA-Z]{2,11}?$"; - - // Private port values - private const string PortValues = @"((6553[0-5])|(655[0-2][0-9])|(65[0-4][0-9]{2})|(6[0-4][0-9]{3})|([1-5][0-9]{4})|([0-5]{0,5})|([0-9]{1,4}))"; - - // Match a port between 1-65535 - public const string PortRegex = @"^" + PortValues + @"$"; - - // Match any filepath (like "c:\temp\") --> https://www.codeproject.com/Tips/216238/Regular-Expression-to-Validate-File-Path-and-Exten - public const string FilePath = @"^(?:[\w]\:|\\)(\\[a-z_\-\s0-9\.]+)+$"; - - // Match any fullname (like "c:\temp\test.txt") --> https://www.codeproject.com/Tips/216238/Regular-Expression-to-Validate-File-Path-and-Exten - public const string FullName = @"^(?:[\w]\:|\\)(\\[a-z_\-\s0-9\.]+)+\.[a-zA-z0-9]{1,4}$"; - } -} +public static partial class RegexHelper +{ + /// + /// Represents a regular expression pattern that matches valid IPv4 address values. + /// + private const string IPv4AddressValues = + @"((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"; + + /// + /// Represents a regular expression pattern that matches valid IPv4 subnet mask values. + /// + private const string SubnetmaskValues = + @"(((255\.){3}(255|254|252|248|240|224|192|128|0+))|((255\.){2}(255|254|252|248|240|224|192|128|0+)\.0)|((255\.)(255|254|252|248|240|224|192|128|0+)(\.0+){2})|((255|254|252|248|240|224|192|128|0+)(\.0+){3}))"; + + /// + /// Represents the regular expression pattern used to validate CIDR notation values for IPv4 subnet masks. + /// + private const string CidrRegexValues = @"([1-9]|[1-2][0-9]|3[0-2])"; + + /// + /// Represents a regular expression pattern that matches valid hostnames or fully qualified domain names (FQDNs). + /// + private const string HostnameOrDomainValues = + @"(?=.{1,255}$)(?!-)[A-Za-z0-9-]{1,63}(? + /// Provides a compiled regular expression that matches valid IPv4 addresses in dot-decimal notation like "192.168.178.0". + /// + /// A instance that matches IPv4 addresses in the format "x.x.x.x", where each x is a number + /// from 0 to 255. + [GeneratedRegex($"^{IPv4AddressValues}$")] + public static partial Regex IPv4AddressRegex(); + + /// + /// Provides a compiled regular expression that matches valid IPv4 addresses within input text like "192.168.178.0". + /// + /// A instance that can be used to extract IPv4 addresses from strings. + [GeneratedRegex(IPv4AddressValues)] + public static partial Regex IPv4AddressExtractRegex(); + + /// + /// Provides a compiles regular expression that matches IPv4 address ranges in the format "start-end" like + /// "192.168.178.0-192.168.178.255". + /// + /// A instance that matches strings representing IPv4 address ranges, such as + /// "192.168.1.1-192.168.1.100". + [GeneratedRegex($"^{IPv4AddressValues}-{IPv4AddressValues}$")] + public static partial Regex IPv4AddressRangeRegex(); + + /// + /// Provides a compiled regular expression that matches valid IPv4 subnet mask like "255.255.0.0". + /// + /// A instance that matches strings representing valid IPv4 subnet masks. + [GeneratedRegex($"^{SubnetmaskValues}$")] + public static partial Regex SubnetmaskRegex(); + + /// + /// Provides a compiled regular expression that matches IPv4 addresses with subnet masks like + /// "192.168.178.0/255.255.255.0". + /// + /// A instance that matches strings containing an IPv4 address followed by a subnet mask, + /// separated by a forward slash. + [GeneratedRegex($@"^{IPv4AddressValues}\/{SubnetmaskValues}$")] + public static partial Regex IPv4AddressSubnetmaskRegex(); + + /// + /// Provides a compiled regular expression that matches an IPv4 address with CIDR like + /// "192.168.178.0/24". + /// + /// A instance that matches strings containing an IPv4 address followed by a slash and a valid + /// CIDR prefix length. + [GeneratedRegex($@"^{IPv4AddressValues}\/{CidrRegexValues}$")] + public static partial Regex IPv4AddressCidrRegex(); + + /// + /// Provides a compiled regular expression that matches IPv4 addresses, allowing for a special range in one or more octets like + /// "192.168.[0-50].1". + /// + /// A instance that matches IPv4 addresses with support for custom special ranges like + /// "192.168.[0-50].1". + [GeneratedRegex($@"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|{SpecialRangeRegex})\.){{3}}((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|{SpecialRangeRegex})$")] + public static partial Regex IPv4AddressSpecialRangeRegex(); + + /// + /// Provides a compiled regular expression that matches valid hostnames or fully qualified domain names (FQDNs) like + /// server-01 or server-01.example.com. + /// + /// A instance that matches valid hostnames or FQDNs. + [GeneratedRegex($@"^{HostnameOrDomainValues}$")] + public static partial Regex HostnameOrDomainRegex(); + + /// + /// Creates a regular expression that matches a local directory path or one using environment variables, + /// like "C:\Temp", "C:\My Settings", "%AppData%\settings". + /// + /// A instance that matches valid local directory paths. + [GeneratedRegex($@"^(?:%[^%]+%|[a-zA-Z]\:)(\\[a-zA-Z0-9_\-\s\.]+)+\\?$")] + public static partial Regex DirectoryPathWithEnvironmentVariablesRegex(); + + /// + /// Creates a regular expression that matches a UNC path like "\\server\share", "\\server\c$\settings". + /// The share name may end with $ for hidden shares. + /// + /// A instance that matches valid UNC paths. + [GeneratedRegex($@"^\\\\[a-zA-Z0-9_\-\.]+(\\[a-zA-Z0-9_\-\s\.]+\$?)(\\[a-zA-Z0-9_\-\s\.]+)*\\?$")] + public static partial Regex UncPathRegex(); + + // Match a MAC-Address 000000000000 00:00:00:00:00:00, 00-00-00-00-00-00-00 or 0000.0000.0000 + public const string MACAddressRegex = + @"^^[A-Fa-f0-9]{12}$|^[A-Fa-f0-9]{2}(:|-){1}[A-Fa-f0-9]{2}(:|-){1}[A-Fa-f0-9]{2}(:|-){1}[A-Fa-f0-9]{2}(:|-){1}[A-Fa-f0-9]{2}(:|-){1}[A-Fa-f0-9]{2}$|^[A-Fa-f0-9]{4}.[A-Fa-f0-9]{4}.[A-Fa-f0-9]{4}$$"; + + // Match the first 3 bytes of a MAC-Address 000000, 00:00:00, 00-00-00 + public const string MACAddressFirst3BytesRegex = + @"^[A-Fa-f0-9]{6}$|^[A-Fa-f0-9]{2}(:|-){1}[A-Fa-f0-9]{2}(:|-){1}[A-Fa-f0-9]{2}$|^[A-Fa-f0-9]{4}.[A-Fa-f0-9]{2}$"; + + // Match IPv6 address like ::1 + // ReSharper disable once InconsistentNaming + public const string IPv6AddressRegex = + @"(?:^|(?<=\s))(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))(?=\s|$)"; + + // Match a subnet like 2001:0db8::/64 + // ReSharper disable once InconsistentNaming + public const string IPv6AddressCidrRegex = + @"^s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))(%.+)?s*(\/([0-9]|[1-9][0-9]|1[0-1][0-9]|12[0-8])){1}?$"; + + // Match a range like [0-255], [0,2,4] and [2,4-6] + public const string SpecialRangeRegex = + @"\[((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)-(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)))([,]((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)-(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))))*\]"; + + // Match a hostname with cidr like server-01.example.com/24 + public const string HostnameOrDomainWithCidrRegex = $@"^{HostnameOrDomainValues}\/{CidrRegexValues}$"; + + // Match a hostname with subnetmask like server-01.example.com/255.255.255.0 + public const string HostnameOrDomainWithSubnetmaskRegex = $@"^{HostnameOrDomainValues}\/{SubnetmaskValues}$"; + + // Match a domain local.example.com + public const string DomainRegex = + @"^(?=.{1,255}$)[a-zA-Z0-9\-_]{1,63}((\.[a-zA-Z0-9\-_]+){1,63})*\.[a-zA-Z]{2,}\.?$"; + + // Private port values + private const string PortValues = + @"((6553[0-5])|(655[0-2][0-9])|(65[0-4][0-9]{2})|(6[0-4][0-9]{3})|([1-5][0-9]{4})|([0-5]{0,5})|([0-9]{1,4}))"; + + // Match a port between 1-65535 + public const string PortRegex = $@"^{PortValues}$"; + + // Match any fullname (like "c:\temp\test.txt") --> https://www.codeproject.com/Tips/216238/Regular-Expression-to-Validate-File-Path-and-Exten + public const string FullNameRegex = + @"^(?:[\w]\:|\\)(\\[a-zA-Z0-9_\-\s\.()~!@#$%^&=+';,{}\[\]]+)+\.[a-zA-z0-9]{1,4}$"; + + // Match a string that doesn't end with ";" (like "80; ldap; ssh; 443") + public const string StringNotEndWithSemicolonRegex = @"^.*[^;]$"; + + // Match a number (like 12, 12.4, 12,3) + public const string NumberRegex = @"^\d+((\.|,)\d+)?$"; + + // Match an SNMP OID (like 1.3.6.1 or .1.3.6.2) + public const string SnmpOidRegex = @"^\.?[012]\.(?:[0-9]|[1-3][0-9])(\.\d+)*$"; + + /// + /// Provides a compiled regular expression that matches a Windows username in SAM format (DOMAIN\user or .\user), + /// UPN format (user@domain.com), or a simple username (user). + /// + /// A instance that matches Windows usernames. + [GeneratedRegex(@"^([\w.-]+\\)?[\w.-]+(@[\w.-]+)?$")] + public static partial Regex WindowsUsernameRegex(); + + /// + /// Provides a compiled regular expression that matches a valid LDAP distinguished name like "DC=example,DC=com". + /// Each component must have the form attr=value; deep syntax is left to the directory server. + /// + /// A instance that matches LDAP distinguished names. + [GeneratedRegex(@"^[A-Za-z][A-Za-z0-9-]*=[^,]+(,\s*[A-Za-z][A-Za-z0-9-]*=[^,]+)*$")] + public static partial Regex LdapSearchBaseRegex(); + + // Match a hosts file entry with optional comments, supporting IPv4, IPv6, and hostnames + // ^* : Matches the beginning of the line + // (#)? : Optionally matches a comment (#) at the start of the line + // \s* : Matches any whitespace after the comment (or before the IP) + // ((?:(?:\d{1,3}\.){3}\d{1,3}) : Matches an IPv4 address (e.g., 192.168.1.1) + // | : OR (alternation between IPv4 and IPv6) + // (?:(?:[A-Fa-f0-9:]+:+)+[A-Fa-f0-9]+) : Matches an IPv6 address (e.g., 2001:db8::1) + // \s+ : Matches one or more spaces between the IP and the hostnames + // ([\w.-]+(?:\s+[\w.-]+)*) : Matches one or more hostnames, separated by spaces + // \s* : Matches optional whitespace after hostnames + // (#.*)? : Optionally matches a comment after hostnames + // $ : Anchors the match to the end of the line + public static string HostsEntryRegex => + @"^(#)?\s*((?:(?:\d{1,3}\.){3}\d{1,3})|(?:(?:[A-Fa-f0-9:]+:+)+[A-Fa-f0-9]+))\s+([\w.-]+(?:\s+[\w.-]+)*)\s*(#.*)?$"; + +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/RelayCommand.cs b/Source/NETworkManager.Utilities/RelayCommand.cs index 48bbbb57d3..13c90a9415 100644 --- a/Source/NETworkManager.Utilities/RelayCommand.cs +++ b/Source/NETworkManager.Utilities/RelayCommand.cs @@ -4,46 +4,46 @@ // Source: https://msdn.microsoft.com/en-us/magazine/dd419663.aspx?f=255&MSPPError=-2147217396#id0090030 -namespace NETworkManager.Utilities +namespace NETworkManager.Utilities; + +public class RelayCommand : ICommand { - public class RelayCommand : ICommand + #region Constructors + + public RelayCommand(Action execute, Predicate canExecute = null) + { + _execute = execute ?? throw new ArgumentNullException(nameof(execute)); + _canExecute = canExecute; + } + + #endregion + + #region Fields + + private readonly Action _execute; + + private readonly Predicate _canExecute; + + #endregion + + #region ICommand Members + + [DebuggerStepThrough] + public bool CanExecute(object parameter) + { + return _canExecute?.Invoke(parameter) ?? true; + } + + public event EventHandler CanExecuteChanged { - #region Fields - - private readonly Action _execute; - - private readonly Predicate _canExecute; - #endregion - - #region Constructors - public RelayCommand(Action execute) : this(execute, null) - { - - } - - public RelayCommand(Action execute, Predicate canExecute) - { - _execute = execute ?? throw new ArgumentNullException(nameof(execute)); _canExecute = canExecute; - } - #endregion - - #region ICommand Members - [DebuggerStepThrough] - public bool CanExecute(object parameter) - { - return _canExecute?.Invoke(parameter) ?? true; - } - - public event EventHandler CanExecuteChanged - { - add => CommandManager.RequerySuggested += value; - remove => CommandManager.RequerySuggested -= value; - } - - public void Execute(object parameter) - { - _execute(parameter); - } - #endregion + add => CommandManager.RequerySuggested += value; + remove => CommandManager.RequerySuggested -= value; } -} + + public void Execute(object parameter) + { + _execute(parameter); + } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/SNMPOIDHelper.cs b/Source/NETworkManager.Utilities/SNMPOIDHelper.cs new file mode 100644 index 0000000000..8ab59fa000 --- /dev/null +++ b/Source/NETworkManager.Utilities/SNMPOIDHelper.cs @@ -0,0 +1,26 @@ +using System; + +namespace NETworkManager.Utilities; + +public static class SNMPOIDHelper +{ + /// + /// Compare two OIDs. + /// + /// First OID + /// Second OID + /// 0 if the OIDs are equal, otherwise a negative or positive value. + public static int CompareOIDs(string x, string y) + { + var xArray = Array.ConvertAll(x.Split('.'), int.Parse); + var yArray = Array.ConvertAll(y.Split('.'), int.Parse); + + // Compare each element of the OIDs and return the first non-equal element. + for (var i = 0; i < Math.Min(xArray.Length, yArray.Length); i++) + if (xArray[i] != yArray[i]) + return xArray[i] - yArray[i]; + + // If the OIDs are equal up to this point, the shorter OID is smaller. + return xArray.Length - yArray.Length; + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/SecureStringHelper.cs b/Source/NETworkManager.Utilities/SecureStringHelper.cs index 33d2fb5ed3..e3370badb0 100644 --- a/Source/NETworkManager.Utilities/SecureStringHelper.cs +++ b/Source/NETworkManager.Utilities/SecureStringHelper.cs @@ -1,37 +1,37 @@ -using System.Security; -using System; +using System; using System.Runtime.InteropServices; +using System.Security; -namespace NETworkManager.Utilities +namespace NETworkManager.Utilities; + +public static class SecureStringHelper { - public static class SecureStringHelper + public static string ConvertToString(SecureString secureString) { - public static string ConvertToString(SecureString secureString) + var valuePtr = IntPtr.Zero; + + try { - var valuePtr = IntPtr.Zero; - try - { - valuePtr = Marshal.SecureStringToGlobalAllocUnicode(secureString); - return Marshal.PtrToStringUni(valuePtr); - } - finally - { - Marshal.ZeroFreeGlobalAllocUnicode(valuePtr); - } + valuePtr = Marshal.SecureStringToGlobalAllocUnicode(secureString); + return Marshal.PtrToStringUni(valuePtr); } - - public static SecureString ConvertToSecureString(string clearText) + finally { - if (clearText == null) - throw new ArgumentNullException(nameof(clearText)); + Marshal.ZeroFreeGlobalAllocUnicode(valuePtr); + } + } + + public static SecureString ConvertToSecureString(string clearText) + { + if (clearText == null) + throw new ArgumentNullException(nameof(clearText)); - var securePassword = new SecureString(); + var securePassword = new SecureString(); - foreach (var c in clearText) - securePassword.AppendChar(c); + foreach (var c in clearText) + securePassword.AppendChar(c); - securePassword.MakeReadOnly(); - return securePassword; - } + securePassword.MakeReadOnly(); + return securePassword; } } \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/SingleInstance.cs b/Source/NETworkManager.Utilities/SingleInstance.cs index 6cd09216b4..0ab0259051 100644 --- a/Source/NETworkManager.Utilities/SingleInstance.cs +++ b/Source/NETworkManager.Utilities/SingleInstance.cs @@ -1,18 +1,18 @@ -// Source: http://sanity-free.org/143/csharp_dotnet_single_instance_application.html +// Source: https://sanity-free.org/143/csharp_dotnet_single_instance_application.html using System; -using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; -namespace NETworkManager.Utilities -{ - public class SingleInstance - { - public const int HWND_BROADCAST = 0xffff; - public static readonly int WM_SHOWME = RegisterWindowMessage("WM_SHOWME"); - [DllImport("user32")] - public static extern bool PostMessage(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam); - [DllImport("user32")] - public static extern int RegisterWindowMessage(string message); - } -} +namespace NETworkManager.Utilities; + +public class SingleInstance +{ + public const int HWND_BROADCAST = 0xffff; + public static readonly int WM_SHOWME = RegisterWindowMessage("WM_SHOWME"); + + [DllImport("user32")] + public static extern bool PostMessage(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam); + + [DllImport("user32")] + public static extern int RegisterWindowMessage(string message); +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/SingletonBase.cs b/Source/NETworkManager.Utilities/SingletonBase.cs index beb562df80..956c7f1275 100644 --- a/Source/NETworkManager.Utilities/SingletonBase.cs +++ b/Source/NETworkManager.Utilities/SingletonBase.cs @@ -1,26 +1,24 @@ -namespace NETworkManager.Utilities +namespace NETworkManager.Utilities; + +/// +/// Abstract class to implement a generic singleton. +/// +/// Class +public abstract class SingletonBase where T : class, new() { /// - /// Abstract class to implement a generic singleton. + /// Holds the instance of the class. /// - /// Class - public abstract class SingletonBase where T : class, new() - { - /// - /// Holds the instance of the class. - /// - private static T _instance; + private static T _instance; - /// - /// Returns the current instance of the class. - /// - /// Instance of the class. - public static T GetInstance() - { - if (_instance == null) - _instance = new T(); + /// + /// Returns the current instance of the class. + /// + /// Instance of the class. + public static T GetInstance() + { + _instance ??= new T(); - return _instance; - } + return _instance; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/StringHelper.cs b/Source/NETworkManager.Utilities/StringHelper.cs new file mode 100644 index 0000000000..269a235b95 --- /dev/null +++ b/Source/NETworkManager.Utilities/StringHelper.cs @@ -0,0 +1,16 @@ +using System.Text.RegularExpressions; + +namespace NETworkManager.Utilities; + +public static class StringHelper +{ + /// + /// Method to remove whitespaces from a string. + /// + /// Text with whitespaces. + /// Text without whitespaces. + public static string RemoveWhitespace(string input) + { + return Regex.Replace(input, @"\s+", ""); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/SubnetmaskHelper.cs b/Source/NETworkManager.Utilities/SubnetmaskHelper.cs new file mode 100644 index 0000000000..1a66a56aff --- /dev/null +++ b/Source/NETworkManager.Utilities/SubnetmaskHelper.cs @@ -0,0 +1,5 @@ +namespace NETworkManager.Utilities; + +public static class SubnetmaskHelper +{ +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/TimeUnit.cs b/Source/NETworkManager.Utilities/TimeUnit.cs index dabaf0ac13..813c139ae7 100644 --- a/Source/NETworkManager.Utilities/TimeUnit.cs +++ b/Source/NETworkManager.Utilities/TimeUnit.cs @@ -1,28 +1,27 @@ -namespace NETworkManager.Utilities +namespace NETworkManager.Utilities; + +/// +/// Enum for time units. +/// +public enum TimeUnit { /// - /// Enum for time units. + /// No time unit. /// - public enum TimeUnit - { - /// - /// No time unit. - /// - None, + None, - /// - /// Second(s) time unit. - /// - Second, + /// + /// Second(s) time unit. + /// + Second, - /// - /// Minute(s) time unit. - /// - Minute, + /// + /// Minute(s) time unit. + /// + Minute, - /// - /// Hour(s) time unit. - /// - Hour - } -} + /// + /// Hour(s) time unit. + /// + Hour +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/TimestampHelper.cs b/Source/NETworkManager.Utilities/TimestampHelper.cs index e02206d9bd..6ee5e83c09 100644 --- a/Source/NETworkManager.Utilities/TimestampHelper.cs +++ b/Source/NETworkManager.Utilities/TimestampHelper.cs @@ -1,12 +1,57 @@ using System; +using System.Globalization; +using System.IO; -namespace NETworkManager.Utilities +namespace NETworkManager.Utilities; + +public static class TimestampHelper { - public static class TimestampHelper + public static string GetTimestamp() + { + return DateTime.Now.ToString("yyyyMMddHHmmss"); + } + + /// + /// Generates a filename by prefixing the specified filename with a timestamp string. + /// + /// The original filename to be prefixed with a timestamp. Cannot be null or empty. + /// A string containing the timestamp followed by an underscore and the original filename. + public static string GetTimestampFilename(string fileName) + { + return $"{GetTimestamp()}_{fileName}"; + } + + /// + /// Determines whether the specified file name begins with a valid timestamp in the format "yyyyMMddHHmmss". + /// + /// This method checks only the first 14 characters of the file name for a valid timestamp and + /// does not validate the remainder of the file name. + /// The file name to evaluate. The file name is expected to start with a 14-digit timestamp followed by an + /// underscore and at least one additional character. + /// true if the file name starts with a valid timestamp in the format "yyyyMMddHHmmss"; otherwise, false. + public static bool IsTimestampedFilename(string fileName) { - public static string GetTimestamp() - { - return DateTime.Now.ToString("yyyyMMddHHmmss"); - } + // Ensure the filename is long enough to contain a timestamp, an underscore, and at least one character after it + if (fileName.Length < 16) + return false; + + var timestampString = fileName[..14]; + + return DateTime.TryParseExact(timestampString, "yyyyMMddHHmmss", CultureInfo.InvariantCulture, DateTimeStyles.None, out _); + } + + /// + /// Extracts the timestamp from a filename that starts with a timestamp prefix. + /// + /// Filenames are expected to start with yyyyMMddHHmmss_* format (14 characters). + /// This method extracts the timestamp portion and parses it as a DateTime. + /// The full path to the file or just the filename. + /// The timestamp extracted from the filename. + public static DateTime ExtractTimestampFromFilename(string fileName) + { + // Extract the timestamp prefix (yyyyMMddHHmmss format, 14 characters) + var timestampString = fileName.Substring(0, 14); + + return DateTime.ParseExact(timestampString, "yyyyMMddHHmmss", CultureInfo.InvariantCulture); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities/VisualTreeHelper.cs b/Source/NETworkManager.Utilities/VisualTreeHelper.cs index fcd0830627..86d560131d 100644 --- a/Source/NETworkManager.Utilities/VisualTreeHelper.cs +++ b/Source/NETworkManager.Utilities/VisualTreeHelper.cs @@ -1,29 +1,39 @@ using System.Collections.Generic; using System.Windows; -namespace NETworkManager.Utilities +namespace NETworkManager.Utilities; + +/// +/// Provides helper methods for traversing and querying the visual tree of WPF elements. +/// +/// The VisualTreeHelper class contains static methods that facilitate searching for and enumerating +/// visual child elements within a WPF application's visual tree. These methods are useful for scenarios where you need +/// to locate elements of a specific type or perform operations on all descendants of a visual element. +public class VisualTreeHelper { - public class VisualTreeHelper + /// + /// Enumerates all descendant visual children of a specified type from the visual tree starting at the given + /// dependency object. + /// + /// This method performs a recursive depth-first traversal of the visual tree. It yields each + /// descendant of the specified type, including those nested at any depth. The enumeration is deferred and elements + /// are returned as they are discovered. + /// The type of visual child to search for. Must derive from DependencyObject. + /// The root of the visual tree to search. Cannot be null. + /// An enumerable collection of all descendant elements of type T found in the visual tree. The collection is empty + /// if no matching elements are found. + public static IEnumerable FindVisualChildren(DependencyObject depObj) where T : DependencyObject { - public static IEnumerable FindVisualChildren(DependencyObject depObj) where T : DependencyObject - { - if (depObj == null) - yield break; + if (depObj == null) + yield break; - for (var i = 0; i < System.Windows.Media.VisualTreeHelper.GetChildrenCount(depObj); i++) - { - var child = System.Windows.Media.VisualTreeHelper.GetChild(depObj, i); + for (var i = 0; i < System.Windows.Media.VisualTreeHelper.GetChildrenCount(depObj); i++) + { + var child = System.Windows.Media.VisualTreeHelper.GetChild(depObj, i); - if (child is T variable) - { - yield return variable; - } + if (child is T variable) yield return variable; - foreach (var childOfChild in FindVisualChildren(child)) - { - yield return childOfChild; - } - } + foreach (var childOfChild in FindVisualChildren(child)) yield return childOfChild; } } } diff --git a/Source/NETworkManager.Utilities/app.config b/Source/NETworkManager.Utilities/app.config deleted file mode 100644 index f6e7dca8dc..0000000000 --- a/Source/NETworkManager.Utilities/app.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/Source/NETworkManager.Validators/BaudValidator.cs b/Source/NETworkManager.Validators/BaudValidator.cs index ae83515ca0..b8429c56e4 100644 --- a/Source/NETworkManager.Validators/BaudValidator.cs +++ b/Source/NETworkManager.Validators/BaudValidator.cs @@ -1,28 +1,31 @@ using System.Globalization; using System.Linq; using System.Windows.Controls; +using NETworkManager.Localization.Resources; -namespace NETworkManager.Validators +namespace NETworkManager.Validators; + +public class BaudValidator : ValidationRule { - public class BaudValidator : ValidationRule - { - /// - /// Possible baud rates. - /// - private readonly int[] _bauds = { 75, 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200 }; + /// + /// Possible baud rates. + /// + private readonly int[] _bauds = + { 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200, 128000, 256000, 512000, 921600 }; - /// - /// Check if the int is a valid baud rate. - /// - /// Baud like 9600. - /// Culture to use for validation. - /// True if the value is a valid baut rate. - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - if (!int.TryParse(value as string, out var baud)) - return new ValidationResult(false, Localization.Resources.Strings.EnterValidBaud); + /// + /// Check if the int is a valid baud rate. + /// + /// Baud like 9600. + /// Culture to use for validation. + /// True if the value is a valid baut rate. + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + if (!int.TryParse(value as string, out var baud)) + return new ValidationResult(false, Strings.EnterValidBaud); - return _bauds.Contains(baud) ? ValidationResult.ValidResult : new ValidationResult(false, Localization.Resources.Strings.EnterValidBaud); - } + return _bauds.Contains(baud) + ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.EnterValidBaud); } } \ No newline at end of file diff --git a/Source/NETworkManager.Validators/ContainsTextValidator.cs b/Source/NETworkManager.Validators/ContainsTextValidator.cs new file mode 100644 index 0000000000..bbde93577b --- /dev/null +++ b/Source/NETworkManager.Validators/ContainsTextValidator.cs @@ -0,0 +1,16 @@ +using System.Globalization; +using System.Linq; +using System.Windows.Controls; +using NETworkManager.Localization.Resources; + +namespace NETworkManager.Validators; + +public class ContainsTextValidator : ValidationRule +{ + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + return ((string)value).All(char.IsWhiteSpace) + ? new ValidationResult(false, Strings.InputDoesNotContainAnyText) + : ValidationResult.ValidResult; + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/DirectoryPathWithEnvironmentVariablesValidator.cs b/Source/NETworkManager.Validators/DirectoryPathWithEnvironmentVariablesValidator.cs index 9027c41c3a..c532afb9bb 100644 --- a/Source/NETworkManager.Validators/DirectoryPathWithEnvironmentVariablesValidator.cs +++ b/Source/NETworkManager.Validators/DirectoryPathWithEnvironmentVariablesValidator.cs @@ -1,28 +1,32 @@ using System.Globalization; -using System.Text.RegularExpressions; using System.Windows.Controls; using NETworkManager.Localization.Resources; using NETworkManager.Utilities; -using System; -namespace NETworkManager.Validators +namespace NETworkManager.Validators; + +/// +/// Provides a validation rule that determines whether a value represents a syntactically valid directory path, +/// supporting the inclusion of environment variable references like %UserProfile%. +/// +public class DirectoryPathWithEnvironmentVariablesValidator : ValidationRule { /// - /// Check if the string is a valid directory path (like "C:\Temp\" or "%AppData%\Temp"). The directory path does not have to exist on the local system. - /// - public class DirectoryPathWithEnvironmentVariablesValidator : ValidationRule + /// Validates whether the specified value represents a valid directory path, allowing for the inclusion of + /// environment variables like %UserProfile%. + /// + /// The value to validate as a directory path. May include environment variable references. Can be a string or an + /// object convertible to a string. + /// The culture-specific information relevant to the validation process. This parameter is not used in this + /// implementation. + /// A ValidationResult that indicates whether the value is a valid directory path. Returns + /// ValidationResult.ValidResult if the value is valid; otherwise, returns a ValidationResult with an error message. + public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - /// - /// Check if the string is a valid directory path (like "C:\Temp\" or "%AppData%\Temp"). The directory path does not have to exist on the local system. - /// - /// Directory path like "C:\test" or "%AppData%\test". - /// Culture to use for validation. - /// True if the directory path is valid. - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - var path = Environment.ExpandEnvironmentVariables((string)value); + var path = $"{value}"; - return new Regex(RegexHelper.FilePath, RegexOptions.IgnoreCase).IsMatch(path) ? ValidationResult.ValidResult : new ValidationResult(false, Strings.EnterValidFilePath); - } + return RegexHelper.DirectoryPathWithEnvironmentVariablesRegex().IsMatch(path) || RegexHelper.UncPathRegex().IsMatch(path) + ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.EnterValidFolderPath); } -} \ No newline at end of file +} diff --git a/Source/NETworkManager.Validators/DomainValidator.cs b/Source/NETworkManager.Validators/DomainValidator.cs index 4bee9747b0..cd43daaced 100644 --- a/Source/NETworkManager.Validators/DomainValidator.cs +++ b/Source/NETworkManager.Validators/DomainValidator.cs @@ -4,13 +4,17 @@ using NETworkManager.Localization.Resources; using NETworkManager.Utilities; -namespace NETworkManager.Validators +namespace NETworkManager.Validators; + +public class DomainValidator : ValidationRule { - public class DomainValidator : ValidationRule + public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - return Regex.IsMatch((string) value, RegexHelper.DomainRegex) ? ValidationResult.ValidResult : new ValidationResult(false,Strings.EnterValidDomain); - } + if (value is not string domain) + return new ValidationResult(false, Strings.EnterValidDomain); + + return Regex.IsMatch(domain, RegexHelper.DomainRegex) + ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.EnterValidDomain); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/EmptyOrFileExistsValidator.cs b/Source/NETworkManager.Validators/EmptyOrFileExistsValidator.cs index 1c043ef3b5..d669e71e4d 100644 --- a/Source/NETworkManager.Validators/EmptyOrFileExistsValidator.cs +++ b/Source/NETworkManager.Validators/EmptyOrFileExistsValidator.cs @@ -1,17 +1,19 @@ using System.Globalization; using System.IO; using System.Windows.Controls; +using NETworkManager.Localization.Resources; -namespace NETworkManager.Validators +namespace NETworkManager.Validators; + +public class EmptyOrFileExistsValidator : ValidationRule { - public class EmptyOrFileExistsValidator : ValidationRule + public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - if (string.IsNullOrEmpty(value as string)) - return ValidationResult.ValidResult; + if (string.IsNullOrEmpty(value as string)) + return ValidationResult.ValidResult; - return File.Exists((string)value) ? ValidationResult.ValidResult : new ValidationResult(false, Localization.Resources.Strings.FileDoesNotExist); - } + return File.Exists((string)value) + ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.FileDoesNotExist); } } \ No newline at end of file diff --git a/Source/NETworkManager.Validators/EmptyOrFirewallAddressValidator.cs b/Source/NETworkManager.Validators/EmptyOrFirewallAddressValidator.cs new file mode 100644 index 0000000000..8deb67b336 --- /dev/null +++ b/Source/NETworkManager.Validators/EmptyOrFirewallAddressValidator.cs @@ -0,0 +1,99 @@ +using System; +using System.Globalization; +using System.Net; +using System.Net.Sockets; +using System.Windows.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Utilities; + +namespace NETworkManager.Validators; + +/// +/// Validates that the input is empty (meaning "Any") or contains semicolon-separated +/// valid IPv4/IPv6 addresses, IPv4/IPv6 CIDR subnets, IPv4 subnets in subnet-mask +/// notation (e.g. 10.0.0.0/255.0.0.0), IPv4/IPv6 ranges (e.g. 1.2.3.4-1.2.3.7), +/// or recognized Windows Firewall keywords (Any, LocalSubnet, DNS, DHCP, WINS, DefaultGateway, +/// Internet, Intranet, IntranetRemoteAccess, PlayToDevice, CaptivePortal). Keywords may be +/// suffixed with 4 or 6 to restrict matching to IPv4 or IPv6 (e.g. LocalSubnet4). +/// +public class EmptyOrFirewallAddressValidator : ValidationRule +{ + private static readonly string[] Keywords = + [ + "Any", "LocalSubnet", "DNS", "DHCP", "WINS", "DefaultGateway", + "Internet", "Intranet", "IntranetRemoteAccess", "PlayToDevice", "CaptivePortal" + ]; + + /// + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + if (string.IsNullOrEmpty(value as string)) + return ValidationResult.ValidResult; + + foreach (var entry in ((string)value).Split(';')) + { + var token = entry.Trim(); + + if (string.IsNullOrEmpty(token)) + continue; + + if (IsKeyword(token)) + continue; + + if (!token.Contains('/') && token.Contains('-')) + { + if (IsValidRange(token)) + continue; + + return new ValidationResult(false, Strings.EnterValidFirewallAddress); + } + + var slashIndex = token.IndexOf('/'); + var addressPart = slashIndex > 0 ? token[..slashIndex] : token; + + if (!IPAddress.TryParse(addressPart, out var ip)) + return new ValidationResult(false, Strings.EnterValidFirewallAddress); + + if (slashIndex <= 0) + continue; + + var suffix = token[(slashIndex + 1)..]; + + if (ip.AddressFamily == AddressFamily.InterNetwork && RegexHelper.SubnetmaskRegex().IsMatch(suffix)) + continue; + + var maxPrefix = ip.AddressFamily == AddressFamily.InterNetworkV6 ? 128 : 32; + + if (!int.TryParse(suffix, out var prefix) || prefix < 0 || prefix > maxPrefix) + return new ValidationResult(false, Strings.EnterValidFirewallAddress); + } + + return ValidationResult.ValidResult; + } + + private static bool IsKeyword(string token) + { + if (Array.Exists(Keywords, k => k.Equals(token, StringComparison.OrdinalIgnoreCase))) + return true; + + if (token.Length < 2 || (token[^1] != '4' && token[^1] != '6')) + return false; + + var bare = token[..^1]; + return Array.Exists(Keywords, k => k.Equals(bare, StringComparison.OrdinalIgnoreCase)); + } + + private static bool IsValidRange(string token) + { + var dashIndex = token.IndexOf('-'); + + if (dashIndex <= 0 || dashIndex >= token.Length - 1) + return false; + + if (!IPAddress.TryParse(token[..dashIndex], out var start) || + !IPAddress.TryParse(token[(dashIndex + 1)..], out var end)) + return false; + + return start.AddressFamily == end.AddressFamily; + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/EmptyOrIPAddressOrHostnameValidator.cs b/Source/NETworkManager.Validators/EmptyOrIPAddressOrHostnameValidator.cs new file mode 100644 index 0000000000..5557a926f4 --- /dev/null +++ b/Source/NETworkManager.Validators/EmptyOrIPAddressOrHostnameValidator.cs @@ -0,0 +1,29 @@ +using System.Globalization; +using System.Text.RegularExpressions; +using System.Windows.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Utilities; + +namespace NETworkManager.Validators; + +public class EmptyOrIPAddressOrHostnameValidator : ValidationRule +{ + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + var input = (value as string)?.Trim(); + + if (string.IsNullOrEmpty(input)) + return ValidationResult.ValidResult; + + if (RegexHelper.IPv4AddressRegex().IsMatch(input)) + return ValidationResult.ValidResult; + + if (Regex.IsMatch(input, RegexHelper.IPv6AddressRegex)) + return ValidationResult.ValidResult; + + if (RegexHelper.HostnameOrDomainRegex().IsMatch(input)) + return ValidationResult.ValidResult; + + return new ValidationResult(false, Strings.EnterValidHostnameOrIPAddress); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/EmptyOrIPv4AddressValidator.cs b/Source/NETworkManager.Validators/EmptyOrIPv4AddressValidator.cs index 9a02dbe4e5..53acea2a99 100644 --- a/Source/NETworkManager.Validators/EmptyOrIPv4AddressValidator.cs +++ b/Source/NETworkManager.Validators/EmptyOrIPv4AddressValidator.cs @@ -1,18 +1,21 @@ -using NETworkManager.Utilities; +using ControlzEx.Standard; +using NETworkManager.Localization.Resources; +using NETworkManager.Utilities; using System.Globalization; using System.Text.RegularExpressions; using System.Windows.Controls; -namespace NETworkManager.Validators +namespace NETworkManager.Validators; + +public class EmptyOrIPv4AddressValidator : ValidationRule { - public class EmptyOrIPv4AddressValidator : ValidationRule + public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - if (string.IsNullOrEmpty(value as string)) - return ValidationResult.ValidResult; + if (string.IsNullOrEmpty(value as string)) + return ValidationResult.ValidResult; - return Regex.IsMatch((string)value, RegexHelper.IPv4AddressRegex) ? ValidationResult.ValidResult : new ValidationResult(false, Localization.Resources.Strings.EnterValidIPv4Address); - } + return RegexHelper.IPv4AddressRegex().IsMatch((string)value) + ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.EnterValidIPv4Address); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/EmptyOrLdapFilterValidator.cs b/Source/NETworkManager.Validators/EmptyOrLdapFilterValidator.cs new file mode 100644 index 0000000000..066e5681ea --- /dev/null +++ b/Source/NETworkManager.Validators/EmptyOrLdapFilterValidator.cs @@ -0,0 +1,25 @@ +using System.Globalization; +using System.Windows.Controls; +using NETworkManager.Localization.Resources; + +namespace NETworkManager.Validators; + +/// +/// Accepts an empty value or a string that looks like an LDAP filter expression +/// (starts with '(' and ends with ')'). Heavy syntax checking is deferred to +/// the directory server itself. +/// +public class EmptyOrLdapFilterValidator : ValidationRule +{ + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + var input = (value as string)?.Trim(); + + if (string.IsNullOrEmpty(input)) + return ValidationResult.ValidResult; + + return input.StartsWith('(') && input.EndsWith(')') + ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.ActiveDirectoryAdditionalLdapFilterInvalid); + } +} diff --git a/Source/NETworkManager.Validators/EmptyOrPortRangeValidator.cs b/Source/NETworkManager.Validators/EmptyOrPortRangeValidator.cs index 1ac15fe70e..888a9e101b 100644 --- a/Source/NETworkManager.Validators/EmptyOrPortRangeValidator.cs +++ b/Source/NETworkManager.Validators/EmptyOrPortRangeValidator.cs @@ -1,51 +1,49 @@ using System.Globalization; using System.Windows.Controls; +using NETworkManager.Localization.Resources; -namespace NETworkManager.Validators +namespace NETworkManager.Validators; + +public class EmptyOrPortRangeValidator : ValidationRule { - public class EmptyOrPortRangeValidator : ValidationRule + public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - if (string.IsNullOrEmpty(value as string)) - return ValidationResult.ValidResult; - - var isValid = true; + if (string.IsNullOrEmpty(value as string)) + return ValidationResult.ValidResult; - if (value == null) - return new ValidationResult(false, Localization.Resources.Strings.EnterValidPortOrPortRange); + var isValid = true; - foreach (var portOrRange in ((string)value).Replace(" ", "").Split(';')) + foreach (var portOrRange in ((string)value).Replace(" ", "").Split(';')) + if (portOrRange.Contains('-')) { - if (portOrRange.Contains("-")) - { - var portRange = portOrRange.Split('-'); + var portRange = portOrRange.Split('-'); - if (int.TryParse(portRange[0], out var startPort) && int.TryParse(portRange[1], out var endPort)) - { - if (!((startPort > 0) && (startPort < 65536) && (endPort > 0) && (endPort < 65536) && (startPort < endPort))) - isValid = false; - } - else - { + if (int.TryParse(portRange[0], out var startPort) && int.TryParse(portRange[1], out var endPort)) + { + if (!(startPort > 0 && startPort < 65536 && endPort > 0 && endPort < 65536 && + startPort < endPort)) isValid = false; - } } else { - if (int.TryParse(portOrRange, out var portNumber)) - { - if (!((portNumber > 0) && (portNumber < 65536))) - isValid = false; - } - else - { + isValid = false; + } + } + else + { + if (int.TryParse(portOrRange, out var portNumber)) + { + if (!(portNumber > 0 && portNumber < 65536)) isValid = false; - } + } + else + { + isValid = false; } } - return isValid ? ValidationResult.ValidResult : new ValidationResult(false, Localization.Resources.Strings.EnterValidPortOrPortRange); - } + return isValid + ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.EnterValidPortOrPortRange); } } \ No newline at end of file diff --git a/Source/NETworkManager.Validators/EmptyOrWindowsDomainValidator.cs b/Source/NETworkManager.Validators/EmptyOrWindowsDomainValidator.cs new file mode 100644 index 0000000000..33217399a2 --- /dev/null +++ b/Source/NETworkManager.Validators/EmptyOrWindowsDomainValidator.cs @@ -0,0 +1,25 @@ +using System.Globalization; +using System.Windows.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Utilities; + +namespace NETworkManager.Validators; + +public class EmptyOrWindowsDomainValidator : ValidationRule +{ + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + var domain = value as string; + + if (string.IsNullOrEmpty(domain)) + return ValidationResult.ValidResult; + + // For local authentication "." is a valid domain + if (domain.Equals(".")) + return ValidationResult.ValidResult; + + return RegexHelper.HostnameOrDomainRegex().IsMatch(domain) + ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.EnterValidDomain); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/EmptyValidator.cs b/Source/NETworkManager.Validators/EmptyValidator.cs index f3fa89a0db..c1fcfa9348 100644 --- a/Source/NETworkManager.Validators/EmptyValidator.cs +++ b/Source/NETworkManager.Validators/EmptyValidator.cs @@ -1,13 +1,15 @@ using System.Globalization; using System.Windows.Controls; +using NETworkManager.Localization.Resources; -namespace NETworkManager.Validators +namespace NETworkManager.Validators; + +public class EmptyValidator : ValidationRule { - public class EmptyValidator : ValidationRule + public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - return string.IsNullOrEmpty((string)value) ? new ValidationResult(false, Localization.Resources.Strings.FieldCannotBeEmpty) : ValidationResult.ValidResult; - } + return string.IsNullOrEmpty((string)value) + ? new ValidationResult(false, Strings.FieldCannotBeEmpty) + : ValidationResult.ValidResult; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/FileExistsValidator.cs b/Source/NETworkManager.Validators/FileExistsValidator.cs index 4ae9a14618..2e061a5b02 100644 --- a/Source/NETworkManager.Validators/FileExistsValidator.cs +++ b/Source/NETworkManager.Validators/FileExistsValidator.cs @@ -1,14 +1,16 @@ using System.Globalization; using System.IO; using System.Windows.Controls; +using NETworkManager.Localization.Resources; -namespace NETworkManager.Validators +namespace NETworkManager.Validators; + +public class FileExistsValidator : ValidationRule { - public class FileExistsValidator : ValidationRule + public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - return File.Exists((string)value) ? ValidationResult.ValidResult : new ValidationResult(false, Localization.Resources.Strings.FileDoesNotExist); - } + return File.Exists((string)value) + ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.FileDoesNotExist); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/FileNameValidator.cs b/Source/NETworkManager.Validators/FileNameValidator.cs index 5a5888c66b..7defc70b48 100644 --- a/Source/NETworkManager.Validators/FileNameValidator.cs +++ b/Source/NETworkManager.Validators/FileNameValidator.cs @@ -4,25 +4,28 @@ using System.Windows.Controls; using NETworkManager.Localization.Resources; -namespace NETworkManager.Validators +namespace NETworkManager.Validators; + +/// +/// Check if the filename is a valid file name (like "text.txt"). The file name does not have to exist on the local +/// system. +/// +public class FileNameValidator : ValidationRule { /// - /// Check if the filename is a valid file name (like "text.txt"). The file name does not have to exist on the local system. + /// Check if the filename is a valid file name (like "text.txt"). The filen ame does not have to exist on the local + /// system. /// - public class FileNameValidator : ValidationRule + /// File name like "test.txt" or "README.md". + /// Culture to use for validation. + /// True if the file name is valid. + public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - /// - /// Check if the filename is a valid file name (like "text.txt"). The filen ame does not have to exist on the local system. - /// - /// File name like "test.txt" or "README.md". - /// Culture to use for validation. - /// True if the file name is valid. - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - var filename = (string)value; + var filename = (string)value; - // Check if the filename has valid chars and a dot. - return filename.IndexOfAny(Path.GetInvalidFileNameChars()) < 0 && new Regex(@"^.+\..+$").IsMatch(filename) ? ValidationResult.ValidResult : new ValidationResult(false, Strings.EnterValidFileName); - } + // Check if the filename has valid chars and a dot. + return filename.IndexOfAny(Path.GetInvalidFileNameChars()) < 0 && new Regex(@"^.+\..+$").IsMatch(filename) + ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.EnterValidFileName); } } \ No newline at end of file diff --git a/Source/NETworkManager.Validators/FilePathValidator.cs b/Source/NETworkManager.Validators/FilePathValidator.cs index ed9c199622..73fa83b3c5 100644 --- a/Source/NETworkManager.Validators/FilePathValidator.cs +++ b/Source/NETworkManager.Validators/FilePathValidator.cs @@ -4,22 +4,25 @@ using NETworkManager.Localization.Resources; using NETworkManager.Utilities; -namespace NETworkManager.Validators +namespace NETworkManager.Validators; + +/// +/// Check if the string is a valid file path (like "C:\Temp\Test.txt"). The file path does not have to exist on the +/// local system. +/// +public class FilePathValidator : ValidationRule { /// - /// Check if the string is a valid file path (like "C:\Temp\Test.txt"). The file path does not have to exist on the local system. + /// Check if the string is a valid file path (like "C:\Temp\Test.txt"). The file path does not have to exist on the + /// local system. /// - public class FilePathValidator : ValidationRule + /// File path like "C:\Temp\Test.txt"". + /// Culture to use for validation. + /// True if the file path is valid. + public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - /// - /// Check if the string is a valid file path (like "C:\Temp\Test.txt"). The file path does not have to exist on the local system. - /// - /// File path like "C:\Temp\Test.txt"". - /// Culture to use for validation. - /// True if the file path is valid. - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - return new Regex(RegexHelper.FullName, RegexOptions.IgnoreCase).IsMatch((string)value) ? ValidationResult.ValidResult : new ValidationResult(false, Strings.EnterValidFilePath); - } + return new Regex(RegexHelper.FullNameRegex, RegexOptions.IgnoreCase).IsMatch((string)value) + ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.EnterValidFilePath); } } \ No newline at end of file diff --git a/Source/NETworkManager.Validators/FolderInPathExistsValidator.cs b/Source/NETworkManager.Validators/FolderInPathExistsValidator.cs new file mode 100644 index 0000000000..d4be4dabf2 --- /dev/null +++ b/Source/NETworkManager.Validators/FolderInPathExistsValidator.cs @@ -0,0 +1,28 @@ +using System.Globalization; +using System.IO; +using System.Windows.Controls; +using NETworkManager.Localization.Resources; + +namespace NETworkManager.Validators; + +/// +/// Check if the folder in the full path exists on the system (like "C:\Temp" from "C:\Temp\export.json"). +/// +public class FolderInPathExistsValidator : ValidationRule +{ + /// + /// Check if the string is a valid file path (like "C:\Temp\Test.txt"). The file path does not have to exist on the + /// local system. + /// + /// File path like "C:\Temp\Test.txt"". + /// Culture to use for validation. + /// True if the folder exists. + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + var path = Path.GetDirectoryName((string)value); + + if (Directory.Exists(path)) + return ValidationResult.ValidResult; + return new ValidationResult(false, Strings.FolderDoesNotExist); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/GroupNameValidator.cs b/Source/NETworkManager.Validators/GroupNameValidator.cs new file mode 100644 index 0000000000..344366477d --- /dev/null +++ b/Source/NETworkManager.Validators/GroupNameValidator.cs @@ -0,0 +1,22 @@ +using System.Globalization; +using System.Windows.Controls; +using NETworkManager.Localization.Resources; + +namespace NETworkManager.Validators; + +public class GroupNameValidator : ValidationRule +{ + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + var groupName = value as string; + + if (string.IsNullOrEmpty(groupName)) + return ValidationResult.ValidResult; + + if (groupName.StartsWith($"~")) + return new ValidationResult(false, + string.Format(Strings.GroupNameCannotStartWithX, "~")); + + return ValidationResult.ValidResult; + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/HostsFileEntryHostnameValidator.cs b/Source/NETworkManager.Validators/HostsFileEntryHostnameValidator.cs new file mode 100644 index 0000000000..d99c9700bf --- /dev/null +++ b/Source/NETworkManager.Validators/HostsFileEntryHostnameValidator.cs @@ -0,0 +1,33 @@ +using NETworkManager.Localization.Resources; +using NETworkManager.Utilities; +using System.Diagnostics; +using System.Globalization; +using System.Windows.Controls; + +namespace NETworkManager.Validators; + +public class HostsFileEntryHostnameValidator : ValidationRule +{ + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + var input = (value as string); + + var isValid = true; + + Debug.WriteLine(input); + + foreach (var hostname in input.Split(' ')) + { + if (RegexHelper.HostnameOrDomainRegex().IsMatch(hostname) == false) + { + isValid = false; + break; + } + } + + if (isValid) + return ValidationResult.ValidResult; + + return new ValidationResult(false, Strings.EnterValidHostsFileEntryHostname); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/HttpAndHttpsUriValidator.cs b/Source/NETworkManager.Validators/HttpAndHttpsUriValidator.cs index bd8d4821b5..11d836cbc6 100644 --- a/Source/NETworkManager.Validators/HttpAndHttpsUriValidator.cs +++ b/Source/NETworkManager.Validators/HttpAndHttpsUriValidator.cs @@ -1,14 +1,17 @@ using System; using System.Globalization; using System.Windows.Controls; +using NETworkManager.Localization.Resources; -namespace NETworkManager.Validators +namespace NETworkManager.Validators; + +public class HttpAndHttpsUriValidator : ValidationRule { - public class HttpAndHttpsUriValidator : ValidationRule + public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - return Uri.TryCreate(value as string, UriKind.Absolute, out var uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps) ? ValidationResult.ValidResult : new ValidationResult(false, Localization.Resources.Strings.EnterValidWebsiteUri); - } + return Uri.TryCreate(value as string, UriKind.Absolute, out var uriResult) && + (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps) + ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.EnterValidWebsiteUri); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/IPAddressOrHostnameAsRangeValidator.cs b/Source/NETworkManager.Validators/IPAddressOrHostnameAsRangeValidator.cs new file mode 100644 index 0000000000..86b9efd9a6 --- /dev/null +++ b/Source/NETworkManager.Validators/IPAddressOrHostnameAsRangeValidator.cs @@ -0,0 +1,34 @@ +using NETworkManager.Localization.Resources; +using NETworkManager.Utilities; +using System.DirectoryServices.ActiveDirectory; +using System.Globalization; +using System.Text.RegularExpressions; +using System.Windows.Controls; + +namespace NETworkManager.Validators; + +public class IPAddressOrHostnameAsRangeValidator : ValidationRule +{ + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + var input = (value as string)?.Trim(); + + if (string.IsNullOrEmpty(input)) + return new ValidationResult(false, Strings.EnterValidHostnameOrIPAddress); + + foreach (var item in input.Split(";")) + { + var localItem = item.Trim(); + + // Check if it is a valid IPv4 address like 192.168.0.1, a valid IPv6 address like ::1 or a valid hostname like server-01 or server-01.example.com + var isValid = RegexHelper.IPv4AddressRegex().IsMatch(localItem) || + Regex.IsMatch(localItem, RegexHelper.IPv6AddressRegex) || + RegexHelper.HostnameOrDomainRegex().IsMatch(localItem); + + if (!isValid) + return new ValidationResult(false, Strings.EnterValidHostnameOrIPAddress); + } + + return ValidationResult.ValidResult; + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/IPAddressOrHostnameValidator.cs b/Source/NETworkManager.Validators/IPAddressOrHostnameValidator.cs new file mode 100644 index 0000000000..40ad7d72c8 --- /dev/null +++ b/Source/NETworkManager.Validators/IPAddressOrHostnameValidator.cs @@ -0,0 +1,33 @@ +using NETworkManager.Localization.Resources; +using NETworkManager.Utilities; +using System.DirectoryServices.ActiveDirectory; +using System.Globalization; +using System.Text.RegularExpressions; +using System.Windows.Controls; + +namespace NETworkManager.Validators; + +public class IPAddressOrHostnameValidator : ValidationRule +{ + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + var input = (value as string)?.Trim(); + + if (string.IsNullOrEmpty(input)) + return new ValidationResult(false, Strings.EnterValidHostnameOrIPAddress); + + // Check if it is a valid IPv4 address like 192.168.0.1 + if (RegexHelper.IPv4AddressRegex().IsMatch(input)) + return ValidationResult.ValidResult; + + // Check if it is a valid IPv6 address like ::1 + if (Regex.IsMatch(input, RegexHelper.IPv6AddressRegex)) + return ValidationResult.ValidResult; + + // Check if it is a valid hostname like server-01 or server-01.example.com + if (RegexHelper.HostnameOrDomainRegex().IsMatch(input)) + return ValidationResult.ValidResult; + + return new ValidationResult(false, Strings.EnterValidHostnameOrIPAddress); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/IPAddressValidator.cs b/Source/NETworkManager.Validators/IPAddressValidator.cs index 4c79d4a969..b1ed9c647d 100644 --- a/Source/NETworkManager.Validators/IPAddressValidator.cs +++ b/Source/NETworkManager.Validators/IPAddressValidator.cs @@ -1,18 +1,19 @@ -using NETworkManager.Utilities; +using NETworkManager.Localization.Resources; using System.Globalization; -using System.Text.RegularExpressions; +using System.Net.Sockets; using System.Windows.Controls; -namespace NETworkManager.Validators +namespace NETworkManager.Validators; + +public class IPAddressValidator : ValidationRule { - public class IPAddressValidator : ValidationRule + public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - if (value != null && (Regex.IsMatch((string)value, RegexHelper.IPv4AddressRegex) || Regex.IsMatch((string)value, RegexHelper.IPv6AddressRegex))) - return ValidationResult.ValidResult; + var input = (value as string); + + if (System.Net.IPAddress.TryParse(input, out var address) && (address.AddressFamily == AddressFamily.InterNetwork || address.AddressFamily == AddressFamily.InterNetworkV6)) + return ValidationResult.ValidResult; - return new ValidationResult(false, Localization.Resources.Strings.EnterValidIPAddress); - } + return new ValidationResult(false, Strings.EnterValidIPAddress); } } diff --git a/Source/NETworkManager.Validators/IPv4AddressValidator.cs b/Source/NETworkManager.Validators/IPv4AddressValidator.cs index 8e04a0a1dd..2ed8c3060a 100644 --- a/Source/NETworkManager.Validators/IPv4AddressValidator.cs +++ b/Source/NETworkManager.Validators/IPv4AddressValidator.cs @@ -1,15 +1,21 @@ -using NETworkManager.Utilities; +using NETworkManager.Localization.Resources; +using NETworkManager.Utilities; using System.Globalization; -using System.Text.RegularExpressions; using System.Windows.Controls; -namespace NETworkManager.Validators +namespace NETworkManager.Validators; + +public class IPv4AddressValidator : ValidationRule { - public class IPv4AddressValidator : ValidationRule + public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - return value != null && Regex.IsMatch((string) value, RegexHelper.IPv4AddressRegex) ? ValidationResult.ValidResult : new ValidationResult(false, Localization.Resources.Strings.EnterValidIPv4Address); - } + var ipAddress = (value as string)?.Trim(); + + if (string.IsNullOrEmpty(ipAddress)) + return new ValidationResult(false, Strings.EnterValidIPv4Address); + + return RegexHelper.IPv4AddressRegex().IsMatch(ipAddress) + ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.EnterValidIPv4Address); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/IPv4IPv6SubnetValidator.cs b/Source/NETworkManager.Validators/IPv4IPv6SubnetValidator.cs index 31b730a3fa..2da5665ec6 100644 --- a/Source/NETworkManager.Validators/IPv4IPv6SubnetValidator.cs +++ b/Source/NETworkManager.Validators/IPv4IPv6SubnetValidator.cs @@ -1,25 +1,32 @@ using System.Globalization; using System.Text.RegularExpressions; using System.Windows.Controls; +using NETworkManager.Localization.Resources; using NETworkManager.Utilities; -namespace NETworkManager.Validators + +namespace NETworkManager.Validators; + +public class IPv4IPv6SubnetValidator : ValidationRule { - public class IPv4IPv6SubnetValidator : ValidationRule + public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - var subnet = (value as string)?.Trim(); + var subnet = (value as string)?.Trim(); + + if (string.IsNullOrEmpty(subnet)) + return new ValidationResult(false, Strings.EnterValidSubnet); - if (subnet != null && Regex.IsMatch(subnet, RegexHelper.SubnetCalculatorIPv4AddressCidrRegex)) - return ValidationResult.ValidResult; + // Check if it is a IPv4 address with a cidr like 192.168.0.0/24 + if (RegexHelper.IPv4AddressCidrRegex().IsMatch(subnet)) + return ValidationResult.ValidResult; - if (subnet != null && Regex.IsMatch(subnet, RegexHelper.SubnetCalculatorIPv4AddressSubnetmaskRegex)) - return ValidationResult.ValidResult; + // Check if it is a IPv4 address with a subnetmask like 255.255.255.0 + if (RegexHelper.IPv4AddressSubnetmaskRegex().IsMatch(subnet)) + return ValidationResult.ValidResult; - if (subnet != null && Regex.IsMatch(subnet, RegexHelper.IPv6AddressCidrRegex)) - return ValidationResult.ValidResult; + // check if it is a IPv6 address with a cidr like ::1/64 + if (Regex.IsMatch(subnet, RegexHelper.IPv6AddressCidrRegex)) + return ValidationResult.ValidResult; - return new ValidationResult(false, Localization.Resources.Strings.EnterValidSubnet); - } + return new ValidationResult(false, Strings.EnterValidSubnet); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/IPv4IPv6SubnetmaskOrCIDRValidator.cs b/Source/NETworkManager.Validators/IPv4IPv6SubnetmaskOrCIDRValidator.cs index 08bb26cb67..769efc1e9b 100644 --- a/Source/NETworkManager.Validators/IPv4IPv6SubnetmaskOrCIDRValidator.cs +++ b/Source/NETworkManager.Validators/IPv4IPv6SubnetmaskOrCIDRValidator.cs @@ -1,32 +1,28 @@ using System.Globalization; -using System.Text.RegularExpressions; using System.Windows.Controls; +using NETworkManager.Localization.Resources; using NETworkManager.Utilities; -namespace NETworkManager.Validators +namespace NETworkManager.Validators; + +public class IPv4IPv6SubnetmaskOrCIDRValidator : ValidationRule { - public class IPv4IPv6SubnetmaskOrCIDRValidator : ValidationRule + public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - if (value == null) - return new ValidationResult(false, Localization.Resources.Strings.EnterValidSubnetmaskOrCIDR); - - var subnetmaskOrCidr = value as string; - - if (subnetmaskOrCidr != null && Regex.IsMatch(subnetmaskOrCidr, RegexHelper.SubnetmaskRegex)) - return ValidationResult.ValidResult; + var subnetmaskOrCidr = (value as string)?.Trim(); - if (subnetmaskOrCidr == null || !subnetmaskOrCidr.StartsWith("/")) - return new ValidationResult(false, Localization.Resources.Strings.EnterValidSubnetmaskOrCIDR); + if (string.IsNullOrEmpty(subnetmaskOrCidr)) + return new ValidationResult(false, Strings.EnterValidSubnetmaskOrCIDR); - if (!int.TryParse(subnetmaskOrCidr.TrimStart('/'), out var cidr)) - return new ValidationResult(false, Localization.Resources.Strings.EnterValidSubnetmaskOrCIDR); + // Check if it is a subnetmask like 255.255.255.0 + if (RegexHelper.SubnetmaskRegex().IsMatch(subnetmaskOrCidr)) + return ValidationResult.ValidResult; + // Check if it is a CIDR like /24 + if (int.TryParse(subnetmaskOrCidr.TrimStart('/'), out var cidr)) if (cidr >= 0 && cidr < 129) return ValidationResult.ValidResult; - return new ValidationResult(false, Localization.Resources.Strings.EnterValidSubnetmaskOrCIDR); - } + return new ValidationResult(false, Strings.EnterValidSubnetmaskOrCIDR); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/IPv4SubnetValidator.cs b/Source/NETworkManager.Validators/IPv4SubnetValidator.cs index a772bc5032..5927b8f22e 100644 --- a/Source/NETworkManager.Validators/IPv4SubnetValidator.cs +++ b/Source/NETworkManager.Validators/IPv4SubnetValidator.cs @@ -1,23 +1,25 @@ using System.Globalization; -using System.Text.RegularExpressions; using System.Windows.Controls; +using NETworkManager.Localization.Resources; using NETworkManager.Utilities; -namespace NETworkManager.Validators +namespace NETworkManager.Validators; + +public class IPv4SubnetValidator : ValidationRule { - public class IPv4SubnetValidator : ValidationRule + public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - var subnet = (value as string)?.Trim(); + var subnet = (value as string)?.Trim(); + + if (string.IsNullOrEmpty(subnet)) + return new ValidationResult(false, Strings.EnterValidSubnet); - if (subnet != null && Regex.IsMatch(subnet, RegexHelper.IPv4AddressCidrRegex)) - return ValidationResult.ValidResult; + if (RegexHelper.IPv4AddressCidrRegex().IsMatch(subnet)) + return ValidationResult.ValidResult; - if (subnet != null && Regex.IsMatch(subnet, RegexHelper.IPv4AddressSubnetmaskRegex)) - return ValidationResult.ValidResult; + if (RegexHelper.IPv4AddressSubnetmaskRegex().IsMatch(subnet)) + return ValidationResult.ValidResult; - return new ValidationResult(false, Localization.Resources.Strings.EnterValidSubnet); - } + return new ValidationResult(false, Strings.EnterValidSubnet); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/IPv4SubnetmaskOrCIDRValidator.cs b/Source/NETworkManager.Validators/IPv4SubnetmaskOrCIDRValidator.cs index f49febaeb4..a189e89179 100644 --- a/Source/NETworkManager.Validators/IPv4SubnetmaskOrCIDRValidator.cs +++ b/Source/NETworkManager.Validators/IPv4SubnetmaskOrCIDRValidator.cs @@ -1,29 +1,27 @@ using System.Globalization; -using System.Text.RegularExpressions; using System.Windows.Controls; +using NETworkManager.Localization.Resources; using NETworkManager.Utilities; -namespace NETworkManager.Validators +namespace NETworkManager.Validators; + +public class IPv4SubnetmaskOrCIDRValidator : ValidationRule { - public class IPv4SubnetmaskOrCIDRValidator : ValidationRule + public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - var subnetmaskOrCidr = value as string; + var subnetmaskOrCidr = (value as string)?.Trim(); - if (subnetmaskOrCidr != null && Regex.IsMatch(subnetmaskOrCidr, RegexHelper.SubnetmaskRegex)) - return ValidationResult.ValidResult; + if (string.IsNullOrEmpty(subnetmaskOrCidr)) + return new ValidationResult(false, Strings.EnterValidSubnetmaskOrCIDR); - if (subnetmaskOrCidr == null || !subnetmaskOrCidr.StartsWith("/")) - return new ValidationResult(false, Localization.Resources.Strings.EnterValidSubnetmaskOrCIDR); - if (!int.TryParse(subnetmaskOrCidr.TrimStart('/'), out var cidr)) - return new ValidationResult(false, Localization.Resources.Strings.EnterValidSubnetmaskOrCIDR); + if (RegexHelper.SubnetmaskRegex().IsMatch(subnetmaskOrCidr)) + return ValidationResult.ValidResult; + if (int.TryParse(subnetmaskOrCidr.TrimStart('/'), out var cidr)) if (cidr >= 0 && cidr < 33) return ValidationResult.ValidResult; - return new ValidationResult(false, Localization.Resources.Strings.EnterValidSubnetmaskOrCIDR); - } + return new ValidationResult(false, Strings.EnterValidSubnetmaskOrCIDR); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/IPv6AddressValidator.cs b/Source/NETworkManager.Validators/IPv6AddressValidator.cs index 340bb6ef59..1087fd7eff 100644 --- a/Source/NETworkManager.Validators/IPv6AddressValidator.cs +++ b/Source/NETworkManager.Validators/IPv6AddressValidator.cs @@ -1,15 +1,19 @@ -using NETworkManager.Utilities; +using NETworkManager.Localization.Resources; using System.Globalization; -using System.Text.RegularExpressions; +using System.Net.Sockets; using System.Windows.Controls; -namespace NETworkManager.Validators -{ - public class IPv6AddressValidator : ValidationRule +namespace NETworkManager.Validators; + +public class IPv6AddressValidator : ValidationRule +{ + public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - return value != null && Regex.IsMatch((string) value, RegexHelper.IPv6AddressRegex) ? ValidationResult.ValidResult : new ValidationResult(false, Localization.Resources.Strings.EnterValidIPv6Address); - } + var input = (value as string); + + if (System.Net.IPAddress.TryParse(input, out var address) && address.AddressFamily == AddressFamily.InterNetworkV6) + return ValidationResult.ValidResult; + + return new ValidationResult(false, Strings.EnterValidIPv6Address); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/Int32Validator.cs b/Source/NETworkManager.Validators/Int32Validator.cs index 6d720a1994..24f255f6f5 100644 --- a/Source/NETworkManager.Validators/Int32Validator.cs +++ b/Source/NETworkManager.Validators/Int32Validator.cs @@ -1,13 +1,15 @@ using System.Globalization; using System.Windows.Controls; +using NETworkManager.Localization.Resources; -namespace NETworkManager.Validators +namespace NETworkManager.Validators; + +public class Int32Validator : ValidationRule { - public class Int32Validator : ValidationRule + public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - return int.TryParse(value as string, out var x) && x > 0 ? ValidationResult.ValidResult : new ValidationResult(false, Localization.Resources.Strings.EnterValidNumber); - } + return int.TryParse(value as string, out var x) && x > 0 + ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.EnterValidNumber); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/IsDNSLookupDNSServersNameUnique.cs b/Source/NETworkManager.Validators/IsDNSLookupDNSServersNameUnique.cs deleted file mode 100644 index 44ff2a5a40..0000000000 --- a/Source/NETworkManager.Validators/IsDNSLookupDNSServersNameUnique.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Globalization; -using System.Linq; -using System.Windows.Controls; -using NETworkManager.Settings; - -namespace NETworkManager.Validators -{ - public class IsDNSLookupDNSServersNameUnique : ValidationRule - { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - return SettingsManager.Current.DNSLookup_DNSServers.Any(x => string.Equals(x.Name, value as string, StringComparison.OrdinalIgnoreCase)) ? new ValidationResult(false, Localization.Resources.Strings.DNSServerWithThisNameAlreadyExists) : ValidationResult.ValidResult; - } - } -} diff --git a/Source/NETworkManager.Validators/IsNameUnique.cs b/Source/NETworkManager.Validators/IsNameUnique.cs new file mode 100644 index 0000000000..51e9309c31 --- /dev/null +++ b/Source/NETworkManager.Validators/IsNameUnique.cs @@ -0,0 +1,19 @@ +using System; +using System.Globalization; +using System.Linq; +using System.Windows.Controls; +using NETworkManager.Localization.Resources; + +namespace NETworkManager.Validators; + +public class IsNameUnique : ValidationRule +{ + public IsNameUniqueDependencyObjectWrapper Wrapper { get; set; } + + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + return Wrapper.UsedNames.Any(x => x.Equals(value as string, StringComparison.OrdinalIgnoreCase)) + ? new ValidationResult(false, Strings.ErrorMessage_NameIsAlreadyUsed) + : ValidationResult.ValidResult; + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/IsNameUniqueDependencyObjectWrapper.cs b/Source/NETworkManager.Validators/IsNameUniqueDependencyObjectWrapper.cs new file mode 100644 index 0000000000..4adc94f2b0 --- /dev/null +++ b/Source/NETworkManager.Validators/IsNameUniqueDependencyObjectWrapper.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; +using System.Windows; + +namespace NETworkManager.Validators; + +public class IsNameUniqueDependencyObjectWrapper : DependencyObject +{ + public static readonly DependencyProperty UsedNamesProperty = DependencyProperty.Register("UsedNames", + typeof(List), + typeof(IsNameUniqueDependencyObjectWrapper)); + + public List UsedNames + { + get => GetValue(UsedNamesProperty) as List; + set => SetValue(UsedNamesProperty, value); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/LdapSearchBaseValidator.cs b/Source/NETworkManager.Validators/LdapSearchBaseValidator.cs new file mode 100644 index 0000000000..bc1cbb4dea --- /dev/null +++ b/Source/NETworkManager.Validators/LdapSearchBaseValidator.cs @@ -0,0 +1,21 @@ +using System.Globalization; +using System.Windows.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Utilities; + +namespace NETworkManager.Validators; + +public class LdapSearchBaseValidator : ValidationRule +{ + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + var input = (value as string)?.Trim(); + + if (string.IsNullOrEmpty(input)) + return new ValidationResult(false, Strings.FieldCannotBeEmpty); + + return RegexHelper.LdapSearchBaseRegex().IsMatch(input) + ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.ActiveDirectorySearchBaseInvalid); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/MACAddressValidator.cs b/Source/NETworkManager.Validators/MACAddressValidator.cs index 2691bc196d..8185e50453 100644 --- a/Source/NETworkManager.Validators/MACAddressValidator.cs +++ b/Source/NETworkManager.Validators/MACAddressValidator.cs @@ -1,15 +1,17 @@ -using NETworkManager.Utilities; -using System.Globalization; +using System.Globalization; using System.Text.RegularExpressions; using System.Windows.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Utilities; -namespace NETworkManager.Validators +namespace NETworkManager.Validators; + +public class MACAddressValidator : ValidationRule { - public class MACAddressValidator : ValidationRule + public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - return value != null && Regex.IsMatch((string) value, RegexHelper.MACAddressRegex) ? ValidationResult.ValidResult : new ValidationResult(false, Localization.Resources.Strings.EnterValidMACAddress); - } + return value != null && Regex.IsMatch((string)value, RegexHelper.MACAddressRegex) + ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.EnterValidMACAddress); } } \ No newline at end of file diff --git a/Source/NETworkManager.Validators/MultipleHostsRangeValidator.cs b/Source/NETworkManager.Validators/MultipleHostsRangeValidator.cs index df01589f35..a2674ce8ae 100644 --- a/Source/NETworkManager.Validators/MultipleHostsRangeValidator.cs +++ b/Source/NETworkManager.Validators/MultipleHostsRangeValidator.cs @@ -1,93 +1,96 @@ -using System.Globalization; -using System.Text.RegularExpressions; -using System.Windows.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Models.Network; using NETworkManager.Utilities; +using System.DirectoryServices.ActiveDirectory; +using System.Globalization; using System.Net; -using NETworkManager.Models.Network; +using System.Text.RegularExpressions; +using System.Windows.Controls; -namespace NETworkManager.Validators +namespace NETworkManager.Validators; + +public class MultipleHostsRangeValidator : ValidationRule { - public class MultipleHostsRangeValidator : ValidationRule + public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - var isValid = true; + var isValid = true; - if (value == null) - return new ValidationResult(false, Localization.Resources.Strings.EnterValidIPScanRange); + if (value == null) + return new ValidationResult(false, Strings.EnterValidIPScanRange); - foreach (var ipHostOrRange in ((string)value).Replace(" ", "").Split(';')) - { - // 192.168.0.1 - if (Regex.IsMatch(ipHostOrRange, RegexHelper.IPv4AddressRegex)) - continue; + foreach (var ipHostOrRange in ((string)value).Replace(" ", "").Split(';')) + { + // 192.168.0.1 + if (RegexHelper.IPv4AddressRegex().IsMatch(ipHostOrRange)) + continue; - // 192.168.0.0/24 - if (Regex.IsMatch(ipHostOrRange, RegexHelper.IPv4AddressCidrRegex)) - continue; + // 192.168.0.0/24 + if (RegexHelper.IPv4AddressCidrRegex().IsMatch(ipHostOrRange)) + continue; - // 192.168.0.0/255.255.255.0 - if (Regex.IsMatch(ipHostOrRange, RegexHelper.IPv4AddressSubnetmaskRegex)) - continue; + // 192.168.0.0/255.255.255.0 + if (RegexHelper.IPv4AddressSubnetmaskRegex().IsMatch(ipHostOrRange)) + continue; - // 192.168.0.0 - 192.168.0.100 - if (Regex.IsMatch(ipHostOrRange, RegexHelper.IPv4AddressRangeRegex)) - { - var range = ipHostOrRange.Split('-'); + // 192.168.0.0 - 192.168.0.100 + if (RegexHelper.IPv4AddressRangeRegex().IsMatch(ipHostOrRange)) + { + var range = ipHostOrRange.Split('-'); - if (IPv4Address.ToInt32(IPAddress.Parse(range[0])) > IPv4Address.ToInt32(IPAddress.Parse(range[1]))) - isValid = false; + if (IPv4Address.ToInt32(IPAddress.Parse(range[0])) > IPv4Address.ToInt32(IPAddress.Parse(range[1]))) + isValid = false; - continue; - } + continue; + } + + // 192.168.[50-100].1 + if (RegexHelper.IPv4AddressSpecialRangeRegex().IsMatch(ipHostOrRange)) + { + var octets = ipHostOrRange.Split('.'); - // 192.168.[50-100].1 - if (Regex.IsMatch(ipHostOrRange, RegexHelper.IPv4AddressSpecialRangeRegex)) + foreach (var octet in octets) { - var octets = ipHostOrRange.Split('.'); + // Match [50-100] + if (!Regex.IsMatch(octet, RegexHelper.SpecialRangeRegex)) + continue; - foreach (var octet in octets) + foreach (var numberOrRange in octet.Substring(1, octet.Length - 2).Split(',')) { - // Match [50-100] - if (!Regex.IsMatch(octet, RegexHelper.SpecialRangeRegex)) + if (!numberOrRange.Contains('-')) continue; - foreach (var numberOrRange in octet.Substring(1, octet.Length - 2).Split(',')) - { - if (!numberOrRange.Contains("-")) - continue; + // 50-100 --> {50, 100} + var rangeNumber = numberOrRange.Split('-'); - // 50-100 --> {50, 100} - var rangeNumber = numberOrRange.Split('-'); - - if (int.Parse(rangeNumber[0]) > int.Parse(rangeNumber[1])) - isValid = false; - } + if (int.Parse(rangeNumber[0]) > int.Parse(rangeNumber[1])) + isValid = false; } - - continue; } - // 2001:db8:85a3::8a2e:370:7334 - if (Regex.IsMatch(ipHostOrRange, RegexHelper.IPv6AddressRegex)) - continue; + continue; + } - // server-01.example.com - if (Regex.IsMatch(ipHostOrRange, RegexHelper.HostnameRegex)) - continue; + // 2001:db8:85a3::8a2e:370:7334 + if (Regex.IsMatch(ipHostOrRange, RegexHelper.IPv6AddressRegex)) + continue; - // server-01.example.com/24 - if (Regex.IsMatch(ipHostOrRange, RegexHelper.HostnameCidrRegex)) - continue; + // server-01.example.com + if (RegexHelper.HostnameOrDomainRegex().IsMatch(ipHostOrRange)) + continue; - // server-01.example.com/255.255.255.0 - if (Regex.IsMatch(ipHostOrRange, RegexHelper.HostnameSubnetmaskRegex)) - continue; + // server-01.example.com/24 + if (Regex.IsMatch(ipHostOrRange, RegexHelper.HostnameOrDomainWithCidrRegex)) + continue; - isValid = false; - } + // server-01.example.com/255.255.255.0 + if (Regex.IsMatch(ipHostOrRange, RegexHelper.HostnameOrDomainWithSubnetmaskRegex)) + continue; - return isValid ? ValidationResult.ValidResult : new ValidationResult(false, Localization.Resources.Strings.EnterValidIPScanRange); + isValid = false; } + + return isValid + ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.EnterValidIPScanRange); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/MultipleIPAddressesValidator.cs b/Source/NETworkManager.Validators/MultipleIPAddressesValidator.cs index a0a93ff50b..ed0d1a3d83 100644 --- a/Source/NETworkManager.Validators/MultipleIPAddressesValidator.cs +++ b/Source/NETworkManager.Validators/MultipleIPAddressesValidator.cs @@ -1,26 +1,27 @@ -using NETworkManager.Utilities; +using NETworkManager.Localization.Resources; +using NETworkManager.Utilities; using System.Globalization; using System.Text.RegularExpressions; using System.Windows.Controls; -namespace NETworkManager.Validators +namespace NETworkManager.Validators; + +public class MultipleIPAddressesValidator : ValidationRule { - public class MultipleIPAddressesValidator : ValidationRule + public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - if (value == null) - return ValidationResult.ValidResult; - - for (var index = 0; index < ((string)value).Split(';').Length; index++) - { - var ipAddress = ((string)value).Split(';')[index]; + if (value == null) + return ValidationResult.ValidResult; - if (!Regex.IsMatch(ipAddress.Trim(), RegexHelper.IPv4AddressRegex) && !Regex.IsMatch(ipAddress.Trim(), RegexHelper.IPv6AddressRegex)) - return new ValidationResult(false, Localization.Resources.Strings.EnterOneOrMoreValidIPAddresses); - } + for (var index = 0; index < ((string)value).Split(';').Length; index++) + { + var ipAddress = ((string)value).Split(';')[index].Trim(); - return ValidationResult.ValidResult; + if (!RegexHelper.IPv4AddressRegex().IsMatch(ipAddress) && + !Regex.IsMatch(ipAddress.Trim(), RegexHelper.IPv6AddressRegex)) + return new ValidationResult(false, Strings.EnterOneOrMoreValidIPAddresses); } + + return ValidationResult.ValidResult; } } diff --git a/Source/NETworkManager.Validators/NETworkManager.Validators.csproj b/Source/NETworkManager.Validators/NETworkManager.Validators.csproj index ee119e42ae..c6a3013c3f 100644 --- a/Source/NETworkManager.Validators/NETworkManager.Validators.csproj +++ b/Source/NETworkManager.Validators/NETworkManager.Validators.csproj @@ -1,29 +1,24 @@ - - - {29172E71-52AF-4E64-9683-30C5F4D0C746} - Library - NETworkManager.Validators - NETworkManager.Validators - net6.0-windows10.0.17763.0 - win10-x64 - false - true - false - - - - - - - - - - - - - - - - \ No newline at end of file + + + {29172E71-52AF-4E64-9683-30C5F4D0C746} + Library + NETworkManager.Validators + NETworkManager.Validators + net10.0-windows10.0.22621.0 + false + true + false + false + + + + + + + + + + + + + diff --git a/Source/NETworkManager.Validators/NoSpacesValidator.cs b/Source/NETworkManager.Validators/NoSpacesValidator.cs index 2c75c4911c..7a4880641d 100644 --- a/Source/NETworkManager.Validators/NoSpacesValidator.cs +++ b/Source/NETworkManager.Validators/NoSpacesValidator.cs @@ -1,17 +1,17 @@ using System.Globalization; using System.Linq; using System.Windows.Controls; +using NETworkManager.Localization.Resources; -namespace NETworkManager.Validators +namespace NETworkManager.Validators; + +public class NoSpacesValidator : ValidationRule { - public class NoSpacesValidator : ValidationRule + public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - if (string.IsNullOrEmpty(value as string) || !((string) value).Any(char.IsWhiteSpace)) - return ValidationResult.ValidResult; + if (string.IsNullOrEmpty(value as string) || !((string)value).Any(char.IsWhiteSpace)) + return ValidationResult.ValidResult; - return new ValidationResult(false, Localization.Resources.Strings.SpacesAreNotAllowed); - } + return new ValidationResult(false, Strings.SpacesAreNotAllowed); } } \ No newline at end of file diff --git a/Source/NETworkManager.Validators/NotEndWithSemicolonValidator.cs b/Source/NETworkManager.Validators/NotEndWithSemicolonValidator.cs new file mode 100644 index 0000000000..a2a06d2303 --- /dev/null +++ b/Source/NETworkManager.Validators/NotEndWithSemicolonValidator.cs @@ -0,0 +1,17 @@ +using System.Globalization; +using System.Text.RegularExpressions; +using System.Windows.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Utilities; + +namespace NETworkManager.Validators; + +public class NotEndWithSemicolonValidator : ValidationRule +{ + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + return Regex.IsMatch(((string)value).Trim(), RegexHelper.StringNotEndWithSemicolonRegex) + ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.InputCannotEndWithSemicolon); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/NumberValidator.cs b/Source/NETworkManager.Validators/NumberValidator.cs new file mode 100644 index 0000000000..d7b0132ca1 --- /dev/null +++ b/Source/NETworkManager.Validators/NumberValidator.cs @@ -0,0 +1,17 @@ +using System.Globalization; +using System.Text.RegularExpressions; +using System.Windows.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Utilities; + +namespace NETworkManager.Validators; + +public class NumberValidator : ValidationRule +{ + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + return Regex.IsMatch(((string)value).Trim(), RegexHelper.NumberRegex) + ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.OnlyNumbersCanBeEntered); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/OIDValidator.cs b/Source/NETworkManager.Validators/OIDValidator.cs deleted file mode 100644 index 8dd5f0ad74..0000000000 --- a/Source/NETworkManager.Validators/OIDValidator.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Lextm.SharpSnmpLib; -using System.Globalization; -using System.Windows.Controls; - -namespace NETworkManager.Validators -{ - public class OIDValidator : ValidationRule - { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - // Use SharpSNMP new ObjectIdentifiert to validate oid - try - { - var oid = new ObjectIdentifier(value as string); - } - catch (System.ArgumentException) - { - return new ValidationResult(false, Localization.Resources.Strings.EnterValidOID); - } - - return ValidationResult.ValidResult; - } - } -} diff --git a/Source/NETworkManager.Validators/OpacityTextboxValidator.cs b/Source/NETworkManager.Validators/OpacityTextboxValidator.cs deleted file mode 100644 index 29d1169c13..0000000000 --- a/Source/NETworkManager.Validators/OpacityTextboxValidator.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.Globalization; -using System.Windows.Controls; - -namespace NETworkManager.Validators -{ - public class OpacityTextboxValidator : ValidationRule - { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - if (!int.TryParse(value as string, out var result)) - return new ValidationResult(false,Localization.Resources.Strings.OnlyNumbersCanBeEntered); - - if (result < 10 || result > 100) - return new ValidationResult(false, Localization.Resources.Strings.EnterValidValueBetween25and100); - - return ValidationResult.ValidResult; - - } - } -} diff --git a/Source/NETworkManager.Validators/PortRangeValidator.cs b/Source/NETworkManager.Validators/PortRangeValidator.cs index 25f0ba5252..526b255662 100644 --- a/Source/NETworkManager.Validators/PortRangeValidator.cs +++ b/Source/NETworkManager.Validators/PortRangeValidator.cs @@ -1,48 +1,49 @@ using System.Globalization; using System.Windows.Controls; +using NETworkManager.Localization.Resources; -namespace NETworkManager.Validators +namespace NETworkManager.Validators; + +public class PortRangeValidator : ValidationRule { - public class PortRangeValidator : ValidationRule + public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - var isValid = true; + var isValid = true; - if (value == null) - return new ValidationResult(false, Localization.Resources.Strings.EnterValidPortOrPortRange); + if (value == null) + return new ValidationResult(false, Strings.EnterValidPortOrPortRange); - foreach (var portOrRange in ((string)value).Replace(" ", "").Split(';')) + foreach (var portOrRange in ((string)value).Replace(" ", "").Split(';')) + if (portOrRange.Contains('-')) { - if (portOrRange.Contains("-")) - { - var portRange = portOrRange.Split('-'); + var portRange = portOrRange.Split('-'); - if (int.TryParse(portRange[0], out var startPort) && int.TryParse(portRange[1], out var endPort)) - { - if (!((startPort > 0) && (startPort < 65536) && (endPort > 0) && (endPort < 65536) && (startPort < endPort))) - isValid = false; - } - else - { + if (int.TryParse(portRange[0], out var startPort) && int.TryParse(portRange[1], out var endPort)) + { + if (!(startPort > 0 && startPort < 65536 && endPort > 0 && endPort < 65536 && + startPort < endPort)) isValid = false; - } } else { - if (int.TryParse(portOrRange, out var portNumber)) - { - if (!((portNumber > 0) && (portNumber < 65536))) - isValid = false; - } - else - { + isValid = false; + } + } + else + { + if (int.TryParse(portOrRange, out var portNumber)) + { + if (!(portNumber > 0 && portNumber < 65536)) isValid = false; - } + } + else + { + isValid = false; } } - return isValid ? ValidationResult.ValidResult : new ValidationResult(false, Localization.Resources.Strings.EnterValidPortOrPortRange); - } + return isValid + ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.EnterValidPortOrPortRange); } } \ No newline at end of file diff --git a/Source/NETworkManager.Validators/PortValidator.cs b/Source/NETworkManager.Validators/PortValidator.cs index 75c4b9c194..6e51b0d372 100644 --- a/Source/NETworkManager.Validators/PortValidator.cs +++ b/Source/NETworkManager.Validators/PortValidator.cs @@ -1,19 +1,19 @@ using System.Globalization; using System.Windows.Controls; +using NETworkManager.Localization.Resources; -namespace NETworkManager.Validators +namespace NETworkManager.Validators; + +public class PortValidator : ValidationRule { - public class PortValidator : ValidationRule + public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - if (!int.TryParse(value as string, out var portNumber)) - return new ValidationResult(false, Localization.Resources.Strings.EnterValidPort); + if (!int.TryParse(value as string, out var portNumber)) + return new ValidationResult(false, Strings.EnterValidPort); - if (portNumber > 0 && (portNumber < 65536)) - return ValidationResult.ValidResult; + if (portNumber > 0 && portNumber < 65536) + return ValidationResult.ValidResult; - return new ValidationResult(false, Localization.Resources.Strings.EnterValidPort); - } + return new ValidationResult(false, Strings.EnterValidPort); } } \ No newline at end of file diff --git a/Source/NETworkManager.Validators/PowerShellPathValidator.cs b/Source/NETworkManager.Validators/PowerShellPathValidator.cs new file mode 100644 index 0000000000..92b703d776 --- /dev/null +++ b/Source/NETworkManager.Validators/PowerShellPathValidator.cs @@ -0,0 +1,19 @@ +using System.Globalization; +using System.IO; +using System.Linq; +using System.Windows.Controls; +using NETworkManager.Localization.Resources; + +namespace NETworkManager.Validators; + +public class PowerShellPathValidator : ValidationRule +{ + private static readonly string[] fileNames = { "powershell.exe", "pwsh.exe" }; + + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + return fileNames.Contains(Path.GetFileName((string)value).ToLower()) + ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.NoValidPowerShellPath); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/ProfileFileUniqueValidator.cs b/Source/NETworkManager.Validators/ProfileFileUniqueValidator.cs index 0611bfdd4d..4d7fdc15fa 100644 --- a/Source/NETworkManager.Validators/ProfileFileUniqueValidator.cs +++ b/Source/NETworkManager.Validators/ProfileFileUniqueValidator.cs @@ -1,15 +1,19 @@ -using NETworkManager.Profiles; +using System; using System.Globalization; -using System.Windows.Controls; using System.Linq; +using System.Windows.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Profiles; + +namespace NETworkManager.Validators; -namespace NETworkManager.Validators +public class ProfileFileUniqueValidator : ValidationRule { - public class ProfileFileUniqueValidator : ValidationRule + public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - return ProfileManager.ProfileFiles.Any(x => x.Name == value as string) ? new ValidationResult(false, Localization.Resources.Strings.ProfileNameAlreadyExists) : ValidationResult.ValidResult; - } + return ProfileManager.ProfileFiles.Any(x => + string.Equals(x.Name, value as string, StringComparison.OrdinalIgnoreCase)) + ? new ValidationResult(false, Strings.ProfileNameAlreadyExists) + : ValidationResult.ValidResult; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/Properties/AssemblyInfo.cs b/Source/NETworkManager.Validators/Properties/AssemblyInfo.cs index 33731d3bbb..c0b2f3e22f 100644 --- a/Source/NETworkManager.Validators/Properties/AssemblyInfo.cs +++ b/Source/NETworkManager.Validators/Properties/AssemblyInfo.cs @@ -4,7 +4,5 @@ [assembly: AssemblyTitle("NETworkManager.Validators")] [assembly: AssemblyDescription("Library contains NETworkManager validators.")] [assembly: AssemblyProduct("NETworkManager.Validators")] - [assembly: ComVisible(false)] - [assembly: Guid("29172e71-52af-4e64-9683-30c5f4d0c746")] \ No newline at end of file diff --git a/Source/NETworkManager.Validators/PuTTYPathValidator.cs b/Source/NETworkManager.Validators/PuTTYPathValidator.cs new file mode 100644 index 0000000000..296dc39ca7 --- /dev/null +++ b/Source/NETworkManager.Validators/PuTTYPathValidator.cs @@ -0,0 +1,19 @@ +using System.Globalization; +using System.IO; +using System.Linq; +using System.Windows.Controls; +using NETworkManager.Localization.Resources; + +namespace NETworkManager.Validators; + +public class PuTTYPathValidator : ValidationRule +{ + private static readonly string[] fileNames = { "putty.exe" }; + + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + return fileNames.Contains(Path.GetFileName((string)value).ToLower()) + ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.NoValidPuTTYPath); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/RemoteDesktopHostnameAndPortValidator.cs b/Source/NETworkManager.Validators/RemoteDesktopHostnameAndPortValidator.cs index 6acfde7a70..32b78db059 100644 --- a/Source/NETworkManager.Validators/RemoteDesktopHostnameAndPortValidator.cs +++ b/Source/NETworkManager.Validators/RemoteDesktopHostnameAndPortValidator.cs @@ -1,30 +1,32 @@ -using System.Globalization; +using NETworkManager.Localization.Resources; +using NETworkManager.Utilities; +using System.DirectoryServices.ActiveDirectory; +using System.Globalization; using System.Text.RegularExpressions; using System.Windows.Controls; -using NETworkManager.Localization.Resources; -using NETworkManager.Utilities; -namespace NETworkManager.Validators +namespace NETworkManager.Validators; + +public class RemoteDesktopHostnameAndPortValidator : ValidationRule { - public class RemoteDesktopHostnameAndPortValidator : ValidationRule + public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) + var hostnameAndPort = (string)value; + + if (hostnameAndPort.Contains(':')) { - string hostnameAndPort = (string)value; + var hostnameAndPortValues = hostnameAndPort.Split(':'); - if(hostnameAndPort.Contains(":")) - { - string[] hostnameAndPortValues = hostnameAndPort.Split(':'); + if (RegexHelper.HostnameOrDomainRegex().IsMatch(hostnameAndPortValues[0]) && + !string.IsNullOrEmpty(hostnameAndPortValues[1]) && + Regex.IsMatch(hostnameAndPortValues[1], RegexHelper.PortRegex)) + return ValidationResult.ValidResult; - if (Regex.IsMatch(hostnameAndPortValues[0], RegexHelper.HostnameRegex) && !string.IsNullOrEmpty(hostnameAndPortValues[1]) && Regex.IsMatch(hostnameAndPortValues[1], RegexHelper.PortRegex)) - return ValidationResult.ValidResult; - - return new ValidationResult(false, Strings.EnterValidHostnameAndPort); - } - else - { - return Regex.IsMatch((string)value, RegexHelper.HostnameRegex) ? ValidationResult.ValidResult : new ValidationResult(false, Strings.EnterValidHostname); - } + return new ValidationResult(false, Strings.EnterValidHostnameAndPort); } + + return RegexHelper.HostnameOrDomainRegex().IsMatch((string)value) + ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.EnterValidHostname); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/SNMPOIDDependencyObjectWrapper.cs b/Source/NETworkManager.Validators/SNMPOIDDependencyObjectWrapper.cs new file mode 100644 index 0000000000..e2abb3fa26 --- /dev/null +++ b/Source/NETworkManager.Validators/SNMPOIDDependencyObjectWrapper.cs @@ -0,0 +1,17 @@ +using System.Windows; +using NETworkManager.Models.Network; + +namespace NETworkManager.Validators; + +public class SNMPOIDDependencyObjectWrapper : DependencyObject +{ + public static readonly DependencyProperty ModeProperty = DependencyProperty.Register("Mode", + typeof(SNMPMode), + typeof(SNMPOIDDependencyObjectWrapper)); + + public SNMPMode Mode + { + get => (SNMPMode)GetValue(ModeProperty); + set => SetValue(ModeProperty, value); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/SNMPOIDValidator.cs b/Source/NETworkManager.Validators/SNMPOIDValidator.cs new file mode 100644 index 0000000000..96c06e2012 --- /dev/null +++ b/Source/NETworkManager.Validators/SNMPOIDValidator.cs @@ -0,0 +1,28 @@ +using System.Globalization; +using System.Linq; +using System.Text.RegularExpressions; +using System.Windows.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Models.Network; +using NETworkManager.Utilities; + +namespace NETworkManager.Validators; + +public class SNMPOIDValidator : ValidationRule +{ + public SNMPOIDDependencyObjectWrapper Wrapper { get; set; } + + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + var oidValue = (value as string)!.Replace(" ", ""); + + if (Wrapper.Mode != SNMPMode.Get || !oidValue.Contains(';')) + return Regex.IsMatch(oidValue, RegexHelper.SnmpOidRegex) + ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.EnterValidOID); + + return oidValue.Split(';').Any(oid => !Regex.IsMatch(oid, RegexHelper.SnmpOidRegex)) + ? new ValidationResult(false, Strings.EnterValidOID) + : ValidationResult.ValidResult; + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/ServerDependencyObjectWrapper.cs b/Source/NETworkManager.Validators/ServerDependencyObjectWrapper.cs new file mode 100644 index 0000000000..8e9197612b --- /dev/null +++ b/Source/NETworkManager.Validators/ServerDependencyObjectWrapper.cs @@ -0,0 +1,17 @@ +using System.Windows; + +namespace NETworkManager.Validators; + +public class ServerDependencyObjectWrapper : DependencyObject +{ + public static readonly DependencyProperty AllowOnlyIPAddressProperty = DependencyProperty.Register( + "AllowOnlyIPAddress", + typeof(bool), + typeof(ServerDependencyObjectWrapper)); + + public bool AllowOnlyIPAddress + { + get => (bool)GetValue(AllowOnlyIPAddressProperty); + set => SetValue(AllowOnlyIPAddressProperty, value); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/ServerValidator.cs b/Source/NETworkManager.Validators/ServerValidator.cs new file mode 100644 index 0000000000..bdd0416db3 --- /dev/null +++ b/Source/NETworkManager.Validators/ServerValidator.cs @@ -0,0 +1,40 @@ +using System.Globalization; +using System.Text.RegularExpressions; +using System.Windows.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Utilities; + +namespace NETworkManager.Validators; + +public partial class ServerValidator : ValidationRule +{ + public ServerDependencyObjectWrapper Wrapper { get; set; } + + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + var allowOnlyIPAddress = Wrapper.AllowOnlyIPAddress; + + var genericErrorResult = + allowOnlyIPAddress ? Strings.EnterValidIPAddress : Strings.EnterValidHostnameOrIPAddress; + + var input = (value as string)?.Trim(); + + // Empty input is considered invalid + if (string.IsNullOrEmpty(input)) + return new ValidationResult(false, genericErrorResult); + + // Check if it is a valid IPv4 address like 192.168.0.1 + if (RegexHelper.IPv4AddressRegex().IsMatch(input)) + return ValidationResult.ValidResult; + + // Check if it is a valid IPv6 address like ::1 + if (Regex.IsMatch(input, RegexHelper.IPv6AddressRegex)) + return ValidationResult.ValidResult; + + // Check if it is a valid hostname like server-01 or server-01.example.com + if (RegexHelper.HostnameOrDomainRegex().IsMatch(input) && !allowOnlyIPAddress) + return ValidationResult.ValidResult; + + return new ValidationResult(false, genericErrorResult); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/SettingsFolderExistsValidator.cs b/Source/NETworkManager.Validators/SettingsFolderExistsValidator.cs deleted file mode 100644 index bb51698af1..0000000000 --- a/Source/NETworkManager.Validators/SettingsFolderExistsValidator.cs +++ /dev/null @@ -1,20 +0,0 @@ -using NETworkManager.Settings; -using System.Globalization; -using System.IO; -using System.Windows.Controls; - -namespace NETworkManager.Validators -{ - public class SettingsFolderExistsValidator : ValidationRule - { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - var path = value as string; - - if (Directory.Exists(path) || SettingsManager.GetDefaultSettingsLocation() == path) - return ValidationResult.ValidResult; - - return new ValidationResult(false, Localization.Resources.Strings.FolderDoesNotExist); - } - } -} diff --git a/Source/NETworkManager.Validators/SubnetmaskValidator.cs b/Source/NETworkManager.Validators/SubnetmaskValidator.cs index 06cce5674d..044c3da1e7 100644 --- a/Source/NETworkManager.Validators/SubnetmaskValidator.cs +++ b/Source/NETworkManager.Validators/SubnetmaskValidator.cs @@ -1,15 +1,16 @@ -using NETworkManager.Utilities; -using System.Globalization; -using System.Text.RegularExpressions; +using System.Globalization; using System.Windows.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Utilities; -namespace NETworkManager.Validators +namespace NETworkManager.Validators; + +public class SubnetmaskValidator : ValidationRule { - public class SubnetmaskValidator : ValidationRule + public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - return value != null && Regex.IsMatch((string) value, RegexHelper.SubnetmaskRegex) ? ValidationResult.ValidResult : new ValidationResult(false, Localization.Resources.Strings.EnterValidSubnetmask); - } + return value != null && RegexHelper.SubnetmaskRegex().IsMatch((string)value) + ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.EnterValidSubnetmask); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/TigerVNCPathValidator.cs b/Source/NETworkManager.Validators/TigerVNCPathValidator.cs new file mode 100644 index 0000000000..d1c9fdb791 --- /dev/null +++ b/Source/NETworkManager.Validators/TigerVNCPathValidator.cs @@ -0,0 +1,22 @@ +using System.Globalization; +using System.IO; +using System.Linq; +using System.Windows.Controls; +using NETworkManager.Localization.Resources; + +namespace NETworkManager.Validators; + +public class TigerVNCPathValidator : ValidationRule +{ + private static readonly string[] fileNames = { "vncviewer-", "vncviewer64-" }; + + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + var fileName = Path.GetFileName((string)value).ToLower(); + + if (fileNames.Any(x => fileName.StartsWith(x) && fileName.EndsWith(".exe"))) + return ValidationResult.ValidResult; + + return new ValidationResult(false, Strings.NoValidTigerVNCPath); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/WebConsoleProfileUrlValidator.cs b/Source/NETworkManager.Validators/WebConsoleProfileUrlValidator.cs new file mode 100644 index 0000000000..c60fe56330 --- /dev/null +++ b/Source/NETworkManager.Validators/WebConsoleProfileUrlValidator.cs @@ -0,0 +1,25 @@ +using System; +using System.Globalization; +using System.Windows.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Utilities; + +namespace NETworkManager.Validators; + +/// +/// Validates the WebConsole URL field on a profile, which may contain the {{Host}} placeholder. +/// +public class WebConsoleProfileUrlValidator : ValidationRule +{ + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + // Substitute the {{Host}} placeholder with a dummy host so the structural + // URL validation (scheme, format) still applies, without rejecting the placeholder itself. + var input = PlaceholderHelper.Replace(value as string ?? "", PlaceholderHelper.Host, "placeholder-host"); + + return Uri.TryCreate(input, UriKind.Absolute, out var uriResult) && + (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps) + ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.EnterValidWebsiteUri); + } +} diff --git a/Source/NETworkManager.Validators/WindowsUsernameValidator.cs b/Source/NETworkManager.Validators/WindowsUsernameValidator.cs new file mode 100644 index 0000000000..a96a4b9ea9 --- /dev/null +++ b/Source/NETworkManager.Validators/WindowsUsernameValidator.cs @@ -0,0 +1,21 @@ +using System.Globalization; +using System.Windows.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Utilities; + +namespace NETworkManager.Validators; + +public class WindowsUsernameValidator : ValidationRule +{ + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + var input = (value as string)?.Trim(); + + if (string.IsNullOrEmpty(input)) + return new ValidationResult(false, Strings.EnterValidUsername); + + return RegexHelper.WindowsUsernameRegex().IsMatch(input) + ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.EnterValidUsername); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.sln b/Source/NETworkManager.sln index 2961a85dbe..bffc498bae 100644 --- a/Source/NETworkManager.sln +++ b/Source/NETworkManager.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.28803.352 +# Visual Studio Version 18 +VisualStudioVersion = 18.4.11626.88 stable MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NETworkManager", "NETworkManager\NETworkManager.csproj", "{E825EC30-AFA2-476A-AC2C-7537630A645B}" EndProject @@ -32,9 +32,17 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NETworkManager.Profiles", " EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{BA113DB7-AC5E-4AAF-B11B-6A6B644D255A}" ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + ..\agent.md = ..\agent.md GlobalAssemblyInfo.cs = GlobalAssemblyInfo.cs EndProjectSection EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "3rdparty", "3rdparty", "{B44F92AE-A764-4EA0-B663-FA2B82DA1E80}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dragablz", "3rdparty\Dragablz\Dragablz\Dragablz.csproj", "{6178E008-0BAB-4B83-9FBA-BAF897D51E9D}" +EndProject +Project("{B7DD6F7E-DEF8-4E67-B5B7-07EF123DB6F0}") = "NETworkManager.Setup", "NETworkManager.Setup\NETworkManager.Setup.wixproj", "{B474758D-E657-4DA6-AB2B-63764C5FBAF1}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -290,10 +298,53 @@ Global {D3B37F13-E8E6-4218-9E8E-96D52432A9CF}.Release|x64.Build.0 = Release|Any CPU {D3B37F13-E8E6-4218-9E8E-96D52432A9CF}.Release|x86.ActiveCfg = Release|Any CPU {D3B37F13-E8E6-4218-9E8E-96D52432A9CF}.Release|x86.Build.0 = Release|Any CPU + {6178E008-0BAB-4B83-9FBA-BAF897D51E9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6178E008-0BAB-4B83-9FBA-BAF897D51E9D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6178E008-0BAB-4B83-9FBA-BAF897D51E9D}.Debug|ARM.ActiveCfg = Debug|Any CPU + {6178E008-0BAB-4B83-9FBA-BAF897D51E9D}.Debug|ARM.Build.0 = Debug|Any CPU + {6178E008-0BAB-4B83-9FBA-BAF897D51E9D}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {6178E008-0BAB-4B83-9FBA-BAF897D51E9D}.Debug|ARM64.Build.0 = Debug|Any CPU + {6178E008-0BAB-4B83-9FBA-BAF897D51E9D}.Debug|x64.ActiveCfg = Debug|Any CPU + {6178E008-0BAB-4B83-9FBA-BAF897D51E9D}.Debug|x64.Build.0 = Debug|Any CPU + {6178E008-0BAB-4B83-9FBA-BAF897D51E9D}.Debug|x86.ActiveCfg = Debug|Any CPU + {6178E008-0BAB-4B83-9FBA-BAF897D51E9D}.Debug|x86.Build.0 = Debug|Any CPU + {6178E008-0BAB-4B83-9FBA-BAF897D51E9D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6178E008-0BAB-4B83-9FBA-BAF897D51E9D}.Release|Any CPU.Build.0 = Release|Any CPU + {6178E008-0BAB-4B83-9FBA-BAF897D51E9D}.Release|ARM.ActiveCfg = Release|Any CPU + {6178E008-0BAB-4B83-9FBA-BAF897D51E9D}.Release|ARM.Build.0 = Release|Any CPU + {6178E008-0BAB-4B83-9FBA-BAF897D51E9D}.Release|ARM64.ActiveCfg = Release|Any CPU + {6178E008-0BAB-4B83-9FBA-BAF897D51E9D}.Release|ARM64.Build.0 = Release|Any CPU + {6178E008-0BAB-4B83-9FBA-BAF897D51E9D}.Release|x64.ActiveCfg = Release|Any CPU + {6178E008-0BAB-4B83-9FBA-BAF897D51E9D}.Release|x64.Build.0 = Release|Any CPU + {6178E008-0BAB-4B83-9FBA-BAF897D51E9D}.Release|x86.ActiveCfg = Release|Any CPU + {6178E008-0BAB-4B83-9FBA-BAF897D51E9D}.Release|x86.Build.0 = Release|Any CPU + {B474758D-E657-4DA6-AB2B-63764C5FBAF1}.Debug|Any CPU.ActiveCfg = Debug|x64 + {B474758D-E657-4DA6-AB2B-63764C5FBAF1}.Debug|Any CPU.Build.0 = Debug|x64 + {B474758D-E657-4DA6-AB2B-63764C5FBAF1}.Debug|ARM.ActiveCfg = Debug|x64 + {B474758D-E657-4DA6-AB2B-63764C5FBAF1}.Debug|ARM.Build.0 = Debug|x64 + {B474758D-E657-4DA6-AB2B-63764C5FBAF1}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {B474758D-E657-4DA6-AB2B-63764C5FBAF1}.Debug|ARM64.Build.0 = Debug|ARM64 + {B474758D-E657-4DA6-AB2B-63764C5FBAF1}.Debug|x64.ActiveCfg = Debug|x64 + {B474758D-E657-4DA6-AB2B-63764C5FBAF1}.Debug|x64.Build.0 = Debug|x64 + {B474758D-E657-4DA6-AB2B-63764C5FBAF1}.Debug|x86.ActiveCfg = Debug|x86 + {B474758D-E657-4DA6-AB2B-63764C5FBAF1}.Debug|x86.Build.0 = Debug|x86 + {B474758D-E657-4DA6-AB2B-63764C5FBAF1}.Release|Any CPU.ActiveCfg = Release|x64 + {B474758D-E657-4DA6-AB2B-63764C5FBAF1}.Release|Any CPU.Build.0 = Release|x64 + {B474758D-E657-4DA6-AB2B-63764C5FBAF1}.Release|ARM.ActiveCfg = Release|x64 + {B474758D-E657-4DA6-AB2B-63764C5FBAF1}.Release|ARM.Build.0 = Release|x64 + {B474758D-E657-4DA6-AB2B-63764C5FBAF1}.Release|ARM64.ActiveCfg = Release|ARM64 + {B474758D-E657-4DA6-AB2B-63764C5FBAF1}.Release|ARM64.Build.0 = Release|ARM64 + {B474758D-E657-4DA6-AB2B-63764C5FBAF1}.Release|x64.ActiveCfg = Release|x64 + {B474758D-E657-4DA6-AB2B-63764C5FBAF1}.Release|x64.Build.0 = Release|x64 + {B474758D-E657-4DA6-AB2B-63764C5FBAF1}.Release|x86.ActiveCfg = Release|x86 + {B474758D-E657-4DA6-AB2B-63764C5FBAF1}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {6178E008-0BAB-4B83-9FBA-BAF897D51E9D} = {B44F92AE-A764-4EA0-B663-FA2B82DA1E80} + EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {0D35FFD6-8915-433B-9899-258AEAE2AEFF} EndGlobalSection diff --git a/Source/NETworkManager.sln.DotSettings b/Source/NETworkManager.sln.DotSettings new file mode 100644 index 0000000000..69bfc8ae74 --- /dev/null +++ b/Source/NETworkManager.sln.DotSettings @@ -0,0 +1,100 @@ + + AES + API + ARP + ARPMAC + AWS + AWSCLI + BIOS + CDP + CSV + DBM + DES + DNS + ICMP + ID + IP + LAN + LLDP + MAC + MD + OI + OID + OK + OUI + RAW + SHA + SNMP + SNMPOID + SNMPV + SNTP + SSH + TCP + TTL + TTY + VLAN + VNC + DNS + IP + MAC + TTY + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + True + True + True + True + True + True + True + True + True + True + True + True + True \ No newline at end of file diff --git a/Source/NETworkManager/App.config b/Source/NETworkManager/App.config deleted file mode 100644 index abd91b2c28..0000000000 --- a/Source/NETworkManager/App.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/Source/NETworkManager/App.xaml b/Source/NETworkManager/App.xaml index 780e52d305..36c4e5454a 100644 --- a/Source/NETworkManager/App.xaml +++ b/Source/NETworkManager/App.xaml @@ -6,23 +6,19 @@ - - + + - - - - + + + - - - - - - - @@ -30,12 +26,15 @@ + - + + + @@ -51,7 +50,7 @@ - + @@ -59,7 +58,7 @@ - + diff --git a/Source/NETworkManager/App.xaml.cs b/Source/NETworkManager/App.xaml.cs index 85c342cf5c..74ac6812a3 100644 --- a/Source/NETworkManager/App.xaml.cs +++ b/Source/NETworkManager/App.xaml.cs @@ -1,157 +1,292 @@ -using NETworkManager.Utilities; -using NETworkManager.Settings; -using System; +using System; using System.Diagnostics; using System.Linq; using System.Threading; using System.Windows; using System.Windows.Threading; -using NETworkManager.Profiles; +using log4net; using NETworkManager.Localization; +using NETworkManager.Localization.Resources; +using NETworkManager.Profiles; +using NETworkManager.Settings; +using NETworkManager.Utilities; + +namespace NETworkManager; -namespace NETworkManager +/* + * Class: App + * 1) Get command line args + * 2) Detect current configuration + * 3) Get assembly info + * 4) Load system-wide policies + * 5) Load local settings + * 6) Load settings + * 7) Load localization / language + * + * Class: MainWindow + * 8) Load appearance + * 9) Load profiles + */ + +public partial class App { - /* - * Class: App - * 1) Get command line args - * 2) Detect current configuration - * 3) Get assembly info - * 4) Load settings - * 5) Load localization / language - * - * Class: MainWindow - * 6) Load appearance - * 7) Load profiles - */ - - public partial class App + // Single instance identifier + private const string Guid = "6A3F34B2-161F-4F70-A8BC-A19C40F79CFB"; + private static readonly ILog Log = LogManager.GetLogger(typeof(App)); + private DispatcherTimer _dispatcherTimer; + private Mutex _mutex; + + private bool _singleInstanceClose; + + public App() { - // Single instance identifier - private const string GUID = "6A3F34B2-161F-4F70-A8BC-A19C40F79CFB"; - private Mutex _mutex; - private DispatcherTimer _dispatcherTimer; + ShutdownMode = ShutdownMode.OnMainWindowClose; + } - private bool _singleInstanceClose; + private void Application_Startup(object sender, StartupEventArgs e) + { + var startLog = $@" + _ _ _____ _____ _ __ __ + | \ | | ____|_ _|_ _____ _ __| | _| \/ | __ _ _ __ __ _ __ _ ___ _ __ + | \| | _| | | \ \ /\ / / _ \| '__| |/ / |\/| |/ _` | '_ \ / _` |/ _` |/ _ \ '__| + | |\ | |___ | | \ V V / (_) | | | <| | | | (_| | | | | (_| | (_| | __/ | + |_| \_|_____| |_| \_/\_/ \___/|_| |_|\_\_| |_|\__,_|_| |_|\__,_|\__, |\___|_| + |___/ + + by BornToBeRoot + GitHub.com/BornToBeRoot/NETworkManager + + Version: {AssemblyManager.Current.Version} +"; + Log.Info(startLog); + + // Catch unhandled exception globally + AppDomain.CurrentDomain.UnhandledException += (_, args) => + { + Log.Fatal("Unhandled exception occured!"); + + Log.Fatal($"Exception raised by: {args.ExceptionObject}"); + }; - public App() + // Wait until the previous instance has been closed (restart from ui) + if (CommandLineManager.Current.RestartPid != -1) { - ShutdownMode = ShutdownMode.OnMainWindowClose; + Log.Info( + $"Waiting for another NETworkManager process with Pid {CommandLineManager.Current.RestartPid} to exit..."); + + var processList = Process.GetProcesses(); + var process = processList.FirstOrDefault(x => x.Id == CommandLineManager.Current.RestartPid); + process?.WaitForExit(); + + Log.Info($"NETworkManager process with Pid {CommandLineManager.Current.RestartPid} has been exited."); } - private void Application_Startup(object sender, StartupEventArgs e) - { - // If we have restart our application... wait until it has finished - if (CommandLineManager.Current.RestartPid != -1) - { - var processList = Process.GetProcesses(); + // Load system-wide policies + PolicyManager.Load(); - var process = processList.FirstOrDefault(x => x.Id == CommandLineManager.Current.RestartPid); + // Load (or initialize) local settings + LocalSettingsManager.Load(); - process?.WaitForExit(); - } + // Load (or initialize) settings + if (CommandLineManager.Current.ResetSettings) + SettingsManager.Initialize(); + else + SettingsManager.Load(); - // Update integrated settings %LocalAppData%\NETworkManager\NETworkManager_GUID (custom settings path) - if (LocalSettingsManager.UpgradeRequired) - { - LocalSettingsManager.Upgrade(); - LocalSettingsManager.UpgradeRequired = false; - } + // Upgrade settings if necessary + var settingsVersion = Version.Parse(SettingsManager.Current.Version); - // Load settings - try - { - SettingsManager.Load(); - } - catch (InvalidOperationException) - { - SettingsManager.InitDefault(); + if (settingsVersion < AssemblyManager.Current.Version) + SettingsManager.Upgrade(settingsVersion, AssemblyManager.Current.Version); + else + Log.Info($"Application settings are already on version {AssemblyManager.Current.Version}."); - ConfigurationManager.Current.ShowSettingsResetNoteOnStartup = true; - } - - // Init the location with the culture code... - Localization.Resources.Strings.Culture = LocalizationManager.GetInstance(SettingsManager.Current.Localization_CultureCode).Culture; + // Initialize localization + var localizationManager = LocalizationManager.GetInstance(SettingsManager.Current.Localization_CultureCode); - if (CommandLineManager.Current.Help) - { - StartupUri = new Uri("CommandLineWindow.xaml", UriKind.Relative); - return; - } + Strings.Culture = localizationManager.Culture; - // Create mutex - _mutex = new Mutex(true, "{" + GUID + "}"); - var mutexIsAcquired = _mutex.WaitOne(TimeSpan.Zero, true); + Log.Info( + $"Application localization culture has been set to {localizationManager.Current.Code} (Settings value is \"{SettingsManager.Current.Localization_CultureCode}\")."); - // Release mutex - if (mutexIsAcquired) - _mutex.ReleaseMutex(); + // Show help window + if (CommandLineManager.Current.Help) + { + Log.Info("Set StartupUri to CommandLineWindow.xaml..."); + StartupUri = new Uri("CommandLineWindow.xaml", UriKind.Relative); - if (SettingsManager.Current.Window_MultipleInstances || mutexIsAcquired) - { - if (SettingsManager.Current.General_BackgroundJobInterval != 0) - { - _dispatcherTimer = new DispatcherTimer - { - Interval = TimeSpan.FromMinutes(SettingsManager.Current.General_BackgroundJobInterval) - }; + return; + } - _dispatcherTimer.Tick += DispatcherTimer_Tick; + // Create mutex (to detect single instance) + Log.Info($"Try to acquire mutex with GUID {Guid} for single instance detection..."); - _dispatcherTimer.Start(); - } + _mutex = new Mutex(true, "{" + Guid + "}"); + var mutexIsAcquired = _mutex.WaitOne(TimeSpan.Zero, true); - // Show splash screen - if (SettingsManager.Current.SplashScreen_Enabled) - new SplashScreen(@"SplashScreen.png").Show(true, true); + Log.Info($"Mutex value for {Guid} is {mutexIsAcquired}"); - // Show main window - StartupUri = new Uri("MainWindow.xaml", UriKind.Relative); - } - else - { - // Bring the already running application into the foreground - SingleInstance.PostMessage((IntPtr)SingleInstance.HWND_BROADCAST, SingleInstance.WM_SHOWME, IntPtr.Zero, IntPtr.Zero); + // Release mutex + if (mutexIsAcquired) + _mutex.ReleaseMutex(); - _singleInstanceClose = true; - Shutdown(); - } + // If another instance is running, bring it to the foreground + if (!mutexIsAcquired && !SettingsManager.Current.Window_MultipleInstances) + { + // Bring the already running application into the foreground + Log.Info( + "Another NETworkManager process is already running. Trying to bring the window to the foreground..."); + SingleInstance.PostMessage(SingleInstance.HWND_BROADCAST, SingleInstance.WM_SHOWME, IntPtr.Zero, + IntPtr.Zero); + + // Close the application + _singleInstanceClose = true; + Shutdown(); + + return; } - private void DispatcherTimer_Tick(object sender, EventArgs e) + + // Setup background job + if (SettingsManager.Current.General_BackgroundJobInterval != 0) { - Save(); - } + Log.Info( + $"Setup background job with interval {SettingsManager.Current.General_BackgroundJobInterval} minute(s)..."); - protected override void OnSessionEnding(SessionEndingCancelEventArgs e) + _dispatcherTimer = new DispatcherTimer + { + Interval = TimeSpan.FromMinutes(SettingsManager.Current.General_BackgroundJobInterval) + }; + _dispatcherTimer.Tick += DispatcherTimer_Tick; + _dispatcherTimer.Start(); + } + else { - base.OnSessionEnding(e); + Log.Info("Background job is disabled."); + } - e.Cancel = true; + // Setup ThreadPool for the application + ThreadPool.GetMaxThreads(out var workerThreadsMax, out var completionPortThreadsMax); + ThreadPool.GetMinThreads(out var workerThreadsMin, out var completionPortThreadsMin); - Shutdown(); - } + var workerThreadsMinNew = workerThreadsMin + SettingsManager.Current.General_ThreadPoolAdditionalMinThreads; + var completionPortThreadsMinNew = completionPortThreadsMin + + SettingsManager.Current.General_ThreadPoolAdditionalMinThreads; - private void Application_Exit(object sender, ExitEventArgs e) - { - // Save settings, when the application is normally closed - if (_singleInstanceClose || ConfigurationManager.Current.ForceRestart || CommandLineManager.Current.Help) - return; + if (workerThreadsMinNew > workerThreadsMax) + workerThreadsMinNew = workerThreadsMax; + + if (completionPortThreadsMinNew > completionPortThreadsMax) + completionPortThreadsMinNew = completionPortThreadsMax; - _dispatcherTimer?.Stop(); + if (ThreadPool.SetMinThreads(workerThreadsMinNew, completionPortThreadsMinNew)) + Log.Info( + $"ThreadPool min threads set to: workerThreads: {workerThreadsMinNew}, completionPortThreads: {completionPortThreadsMinNew}"); + else + Log.Warn( + $"ThreadPool min threads could not be set to workerThreads: {workerThreadsMinNew}, completionPortThreads: {completionPortThreadsMinNew}"); - Save(); + // Show splash screen + if (SettingsManager.Current.SplashScreen_Enabled) + { + Log.Info("Show SplashScreen while application is loading..."); + new SplashScreen(@"SplashScreen.png").Show(true, true); } - private void Save() + // Show main window + Log.Info("Set StartupUri to MainWindow.xaml..."); + StartupUri = new Uri("MainWindow.xaml", UriKind.Relative); + } + + /// + /// Handles the tick event of the dispatcher timer to trigger a background job and save data. + /// + /// The source of the event, typically the dispatcher timer instance. + /// The event data associated with the timer tick. + private void DispatcherTimer_Tick(object sender, EventArgs e) + { + Log.Info("Run background job..."); + + Save(); + } + + /// + /// Handles the session ending event by canceling the session termination and initiating application shutdown. + /// + /// This method overrides the default session ending behavior to prevent the session from ending + /// automatically. Instead, it cancels the session termination and shuts down the application gracefully. Use this + /// override to implement custom shutdown logic when the user logs off or shuts down the system. + /// The event data for the session ending event. Provides information about the session ending request and allows + /// cancellation of the event. + protected override void OnSessionEnding(SessionEndingCancelEventArgs e) + { + base.OnSessionEnding(e); + + e.Cancel = true; + + Shutdown(); + } + + /// + /// Handles the application exit event to perform cleanup operations such as stopping background tasks and saving + /// settings. + /// + /// This method is intended to be called when the application is shutting down. It ensures that + /// any running background jobs are stopped and application settings are saved, unless the application is closed due + /// to a single instance or help command scenario. + /// The source of the event, typically the application instance. + /// The event data associated with the application exit event. + private void Application_Exit(object sender, ExitEventArgs e) + { + Log.Info("Exiting NETworkManager..."); + + // Save settings, when the application is normally closed + if (_singleInstanceClose || CommandLineManager.Current.Help) + return; + + Log.Info("Stop background job, if it exists..."); + + _dispatcherTimer?.Stop(); + + Save(); + + Log.Info("Bye!"); + } + + /// + /// Saves application settings and profile data if changes have been detected. + /// + /// This method saves settings only if they have been modified. Profile data is saved if a + /// profile file is loaded, its data is available, and changes have been made. If no profile file is loaded or the + /// file is encrypted and not unlocked, profile data will not be saved and a warning is logged. + private void Save() + { + // Save local settings if they have changed + if (LocalSettingsManager.Current.SettingsChanged) { - // Save local settings (custom settings path in AppData/Local) + Log.Info("Save local settings..."); LocalSettingsManager.Save(); + } - if (SettingsManager.Current.SettingsChanged) - SettingsManager.Save(); + // Save settings if they have changed + if (SettingsManager.Current.SettingsChanged) + { + Log.Info("Save application settings..."); + SettingsManager.Save(); + } - if (ProfileManager.ProfilesChanged) + // Save profiles if they have changed + if (ProfileManager.LoadedProfileFile != null && ProfileManager.LoadedProfileFileData != null) + { + if (ProfileManager.LoadedProfileFileData.ProfilesChanged) + { + Log.Info($"Save current profile file \"{ProfileManager.LoadedProfileFile.Name}\"..."); ProfileManager.Save(); + } + } + else + { + Log.Warn("Cannot save profiles because no profile file is loaded or the profile file is encrypted and not yet unlocked."); } } } diff --git a/Source/NETworkManager/AssemblyInfo.cs b/Source/NETworkManager/AssemblyInfo.cs new file mode 100644 index 0000000000..d390d192c3 --- /dev/null +++ b/Source/NETworkManager/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using log4net.Config; + +[assembly: XmlConfigurator(ConfigFile = "log4net.config")] \ No newline at end of file diff --git a/Source/NETworkManager/CommandLineWindow.xaml b/Source/NETworkManager/CommandLineWindow.xaml index 258078fba6..ab50673937 100644 --- a/Source/NETworkManager/CommandLineWindow.xaml +++ b/Source/NETworkManager/CommandLineWindow.xaml @@ -1,26 +1,32 @@  + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:mahAppsControls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro" + xmlns:converters="clr-namespace:NETworkManager.Converters;assembly=NETworkManager.Converters" + xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" + xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" + xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" + xmlns:resources="clr-namespace:NETworkManager.Properties" + mc:Ignorable="d" + Title="{x:Static resources:Resources.NETworkManager_ProjectName}" Topmost="True" + Style="{DynamicResource DefaultWindow}" MinHeight="500" Height="500" MinWidth="650" + Width="650" WindowStartupLocation="CenterOwner" IsMinButtonEnabled="False" + IsMaxRestoreButtonEnabled="False" ShowInTaskbar="False" + d:DataContext="{d:DesignInstance viewModels:CommandLineViewModel}"> - + - + + + + + diff --git a/Source/NETworkManager/Controls/TracerouteMapControl.xaml.cs b/Source/NETworkManager/Controls/TracerouteMapControl.xaml.cs new file mode 100644 index 0000000000..a45b45b869 --- /dev/null +++ b/Source/NETworkManager/Controls/TracerouteMapControl.xaml.cs @@ -0,0 +1,1754 @@ +using log4net; +using NETworkManager.Localization.Resources; +using NETworkManager.Models.IPApi; +using NETworkManager.Models.Network; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.IO; +using System.Linq; +using System.Net.NetworkInformation; +using System.Reflection; +using System.Text.Json.Serialization; +using System.Threading; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Shapes; +using System.Windows.Threading; +using NETworkManager.ViewModels; +using NETworkManager.Views; +using Path = System.Windows.Shapes.Path; + +namespace NETworkManager.Controls; + +/// +/// Control that visualizes traceroute hops with known geolocation on an abstract, offline world +/// map (no tile/network requests) with mouse-wheel zoom and drag-to-pan. +/// +/// +/// Known limitations (flagged in PR #3520's review, deliberately left as-is for now): +/// - Arrows are drawn using the raw longitude delta between two points, so a route crossing the +/// antimeridian (e.g. Tokyo to the US west coast) is fitted/drawn the long way around the map +/// instead of wrapping across the edge. +/// - Markers/arrows are only reachable via mouse hover (no keyboard focus or automation names), +/// so their info panel isn't accessible via keyboard or screen reader. +/// - Cluster-ring members (see AssignClusterOffsets) are placed at a naive fixed angle in +/// encounter order; their arrows aren't reordered to minimize visual crossings between ring +/// members. Not worth the complexity for the small cluster sizes seen in practice. +/// +public partial class TracerouteMapControl +{ + private static readonly ILog Log = LogManager.GetLogger(typeof(TracerouteMapControl)); + + private const double MapWidth = 1000; + private const double MapHeight = 500; + + // Country labels are only shown once zoomed in this far past the fit-to-view scale, + // otherwise all ~240 names would overlap into an unreadable mess. + private const double LabelVisibleScaleFactor = 1.5; + + private const double HopMarkerSize = 14; + private const double HopMarkerHitTestSize = 32; + private const double CityDotSize = 3; + private const double CityLabelGapScreenPixels = 4; + private const double HopLabelGapScreenPixels = 6; + private const double ArrowStrokeThickness = 2; + private const double ArrowHitTestStrokeThickness = 14; + private const double ArrowHeadLength = 12; + private const double CountryBorderStrokeThickness = 0.75; + + // How far every arrow path bows to one side (see UpdateArrowGeometry), as a fraction of its + // own length, capped so very long segments still look reasonable. No floor: short segments + // curve proportionally less, not up to a fixed minimum. Applied uniformly to every arrow (a + // "flight path" look) rather than only to overlapping reverse routes - kept subtle on purpose, + // not a half-loop. + private const double ArrowCurveFraction = 0.08; + private const double ArrowCurveMaxOffset = 18; + + private const double ArrowDefaultOpacity = 0.55; + + private static readonly Lazy> Countries = new(LoadCountries); + private static readonly Lazy CountriesGeometry = new(BuildCountriesGeometry); + private static readonly Lazy> CountryLabels = new(BuildCountryLabels); + private static readonly Lazy> Cities = new(LoadCities); + + // Hops/arrows and country labels follow the theme (accent / muted gray, via + // SetResourceReference per element so they track theme switches a frozen brush couldn't). + // Cities deliberately don't: they keep a fixed brand blue (the speedtest download series' + // "#1ba1e2") so they stay a consistent "reference point" color that doesn't compete with the + // accent-colored traceroute path in either theme. + private static readonly Brush CityBrush = FreezeBrush(Color.FromRgb(0x1B, 0xA1, 0xE2)); + + // Shared by every label/dot so a single assignment (in ApplyTransform) keeps their on-screen + // size constant while the map itself is scaled by the parent Canvas' zoom transform. Elements + // using this must be scaled around their own center (RenderTransformOrigin 0.5,0.5), since + // that's the only anchor a single shared transform can honor for differently-positioned elements. + private readonly ScaleTransform _inverseScaleTransform = new(1, 1); + + // Arrow lines/heads can't use the shared transform above: an endpoint attached to a clustered + // marker (see HopMarkerVisual) moves in map units every time the zoom level changes, since its + // on-screen offset from the marker's true geo anchor must stay a constant number of screen + // pixels. So the full curve geometry - not just stroke thickness/arrowhead size - is recomputed + // from scratch every zoom step; tracked here so ApplyTransform can drive that. + private readonly List _arrows = []; + + // Every label's Tag holds (Point Anchor, Size TextSize): the anchor it's positioned relative + // to, and its measured size cached at build time. The size can NOT be read back later via + // TextBlock.DesiredSize - WPF resets DesiredSize to (0,0) for a Collapsed element on every + // Measure() call, including ones WPF's own layout system performs internally once the + // element is added to the tree, silently invalidating a perfectly good earlier measurement. + // + // Tracked in separate lists (rather than distinguished via Tag type) so ApplyTransform and + // DeclutterReferenceLabels don't need to re-scan/re-classify LabelsCanvas.Children every time. + private readonly List _countryLabels = []; + private readonly List _cityLabels = []; + + // One entry per drawn hop marker, tracked (rather than Tag-scanned, same reasoning as _arrows) + // so ApplyTransform can re-resolve each marker's on-screen position - true geo anchor plus a + // constant-screen-pixel cluster offset (see AssignClusterOffsets) - every time the zoom level + // changes, instead of baking a stale offset into a static map coordinate. + private readonly List _markers = []; + + // Last drawn hop anchor points (never cluster-displaced), cached so a resize or "Reset" click + // can re-fit to the same hops. _hopClusterPaddingScreenPixels is the largest cluster ring + // radius among them plus its label allowance (see RedrawHops), so that re-fit still leaves + // room for the ring and its hop-number label instead of clipping them. + private List _hopPoints = []; + private double _hopClusterPaddingScreenPixels; + + // Scale value the label/arrow visuals were last recomputed for; panning alone never + // invalidates them (see ApplyTransform), only an actual zoom change does. + private double _lastScaleDependentUpdateScale = -1; + + private double _scale = 1; + private double _minScale = 1; + private double _maxScale = 1; + private double _panX; + private double _panY; + + private bool _isPanning; + private Point _panStartMouse; + private double _panStartX; + private double _panStartY; + + public TracerouteMapControl() + { + InitializeComponent(); + + Loaded += TracerouteMapControl_Loaded; + } + + #region Dependency properties + + /// + /// Gets or sets the traceroute hops (e.g. ) to plot on the map. + /// + public static readonly DependencyProperty HopsProperty = DependencyProperty.Register( + nameof(Hops), typeof(IEnumerable), typeof(TracerouteMapControl), + new PropertyMetadata(null, OnHopsChanged)); + + public IEnumerable Hops + { + get => (IEnumerable)GetValue(HopsProperty); + set => SetValue(HopsProperty, value); + } + + private static void OnHopsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + ((TracerouteMapControl)d).OnHopsChanged(e.OldValue as INotifyCollectionChanged); + } + + private void OnHopsChanged(INotifyCollectionChanged oldCollection) + { + if (oldCollection != null) + oldCollection.CollectionChanged -= Hops_CollectionChanged; + + if (Hops is INotifyCollectionChanged newCollection) + newCollection.CollectionChanged += Hops_CollectionChanged; + + RedrawHops(); + } + + private void Hops_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) + { + RedrawHops(); + } + + /// + /// Gets or sets whether the host (e.g. ) currently shows this + /// control at full size, vs. collapsed down to just its top-left toggle button. Two-way + /// bindable so the host's collapse row-height logic and this control's own chevron icon + /// (see the DataTrigger on the toggle button in XAML) both stay in sync with a single value. + /// + public static readonly DependencyProperty IsExpandedProperty = DependencyProperty.Register( + nameof(IsExpanded), typeof(bool), typeof(TracerouteMapControl), + new PropertyMetadata(true, OnIsExpandedChanged)); + + public bool IsExpanded + { + get => (bool)GetValue(IsExpandedProperty); + set => SetValue(IsExpandedProperty, value); + } + + private void ButtonToggleExpand_Click(object sender, RoutedEventArgs e) + { + IsExpanded = !IsExpanded; + } + + // Set whenever RedrawHops is skipped because the control is collapsed (see RedrawHops) - + // triggers a real redraw once expanded again, with the now-correct (no longer collapsed-strip) + // size available. + private bool _hopsRedrawPending; + + private static void OnIsExpandedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + var view = (TracerouteMapControl)d; + + if (!(bool)e.NewValue || !view._hopsRedrawPending) + return; + + // Deferred for the same reason as the initial RedrawHops call in TracerouteMapControl_Loaded: + // MapRow.Height was just changed (by TracerouteView's ExpandMapRow, in response to this + // same IsExpanded change reaching it through the ExpandMapView binding), but that resize + // - and with it BorderHost.ActualWidth/Height - has not actually been applied by WPF's + // layout system yet at this exact point. Redrawing right now would still see the old, + // collapsed size and reproduce the very bug this deferral exists to avoid. + view.Dispatcher.BeginInvoke(view.RedrawHops, DispatcherPriority.Loaded); + } + + #endregion + + #region Load, draw + + // Guards EnsureMapDataInitialized so the (per-instance) ~900-element label/city build below + // only ever runs once per control, regardless of how many times Loaded or IsVisibleChanged fire. + private bool _mapDataInitialized; + + private void TracerouteMapControl_Loaded(object sender, RoutedEventArgs e) + { + // TracerouteView binds this control's Visibility to ShowMap, which is false whenever IP + // geolocation checking is disabled - the map can then never show anything (no hop has a + // location to plot), so building ~900 city/country WPF elements for it here would be pure + // waste. Defer until it's actually shown; if it already is, this fires immediately below. + if (IsVisible) + EnsureMapDataInitialized(); + else + IsVisibleChanged += TracerouteMapControl_IsVisibleChanged; + } + + private void TracerouteMapControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) + { + if (!IsVisible) + return; + + IsVisibleChanged -= TracerouteMapControl_IsVisibleChanged; + EnsureMapDataInitialized(); + } + + private void EnsureMapDataInitialized() + { + if (_mapDataInitialized) + return; + + _mapDataInitialized = true; + + // The embedded world map is ~1.4 MB of JSON; parsing it and building the (frozen) + // country geometry synchronously here would briefly hitch the UI thread the first time a + // Traceroute tab is opened. Materialize the shared Lazy caches on a background thread + // instead - they hold pure data plus a frozen Freezable, both safe to build off the UI + // thread - then hop back to the UI thread to create the actual WPF label/city elements + // and draw. Hops themselves need none of this data (they project directly), so a trace + // arriving while this is still loading still renders fine on its own. + Task.Run(() => + { + try + { + // CountriesGeometry.Value also forces Countries.Value. + _ = CountriesGeometry.Value; + _ = CountryLabels.Value; + _ = Cities.Value; + } + catch + { + // Swallowed so the task never faults (which would surface as an unobserved task + // exception) - the continuation re-touches the same Lazy values and logs there. + } + }).ContinueWith(_ => + { + try + { + CountriesPath.Data = CountriesGeometry.Value; + BuildLabels(); + BuildCities(); + } + catch (Exception ex) + { + Log.Error("Error while loading the embedded world map data", ex); + } + + // Deferred: right after Loaded, ancestors (Expander/Grid/tab) can still be mid-layout, + // so BorderHost.ActualWidth/Height may read as 0 even after an explicit UpdateLayout() + // call. Waiting for the current layout pass to fully settle guarantees FitToHops/ + // FitToView can compute the real scale/pan on the very first run, instead of hop/city + // labels sitting at their approximate build-time position until the user zooms. + Dispatcher.BeginInvoke(RedrawHops, DispatcherPriority.Loaded); + }, CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()); + } + + private void BuildLabels() + { + LabelsCanvas.Children.Clear(); + _countryLabels.Clear(); + + foreach (var (name, position) in CountryLabels.Value) + { + var label = new TextBlock + { + Text = name, + FontSize = 12, + IsHitTestVisible = false, + RenderTransform = _inverseScaleTransform, + RenderTransformOrigin = new Point(0.5, 0.5) + }; + + label.SetResourceReference(TextBlock.ForegroundProperty, "MahApps.Brushes.Gray3"); + + // Must run while still Visibility.Visible (the default) - see the comment on the + // _countryLabels/_cityLabels fields for why this measurement has to be cached now. + label.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); + var size = label.DesiredSize; + label.Tag = (position, size); + + // Hidden by default so a fully zoomed-out view never briefly shows the full, + // unfiltered wall of ~240 country + 660 city names before the first zoom-driven + // ApplyTransform call has a chance to declutter/hide them. + label.Visibility = Visibility.Collapsed; + + Canvas.SetLeft(label, position.X - size.Width / 2); + Canvas.SetTop(label, position.Y - size.Height / 2); + + LabelsCanvas.Children.Add(label); + _countryLabels.Add(label); + } + } + + /// + /// Draws a small dot for every major city (always visible) plus a name label next to it + /// (added to , so it shares the country labels' zoom-based visibility). + /// + private void BuildCities() + { + CitiesCanvas.Children.Clear(); + _cityLabels.Clear(); + + foreach (var city in Cities.Value) + { + var point = Project(city.Lat, city.Lon); + + var dot = new Ellipse + { + Width = CityDotSize, + Height = CityDotSize, + Fill = CityBrush, + RenderTransform = _inverseScaleTransform, + RenderTransformOrigin = new Point(0.5, 0.5) + }; + + CenterOn(dot, point); + + CitiesCanvas.Children.Add(dot); + + // Renders to the left of the dot (hop number labels render to the right - see + // DrawHopMarker), so a hop located exactly in a labelled city doesn't collide with + // its own number. Uses the same center-pivot scaling (RenderTransformOrigin 0.5,0.5) + // as every other label/dot, just centered on an offset point instead of the dot itself. + var label = new TextBlock + { + Text = city.N, + FontSize = 11, + Foreground = CityBrush, + IsHitTestVisible = false, + RenderTransform = _inverseScaleTransform, + RenderTransformOrigin = new Point(0.5, 0.5) + }; + + // Must run while still Visibility.Visible - see the comment on the + // _countryLabels/_cityLabels fields for why this measurement has to be cached now. + label.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); + var size = label.DesiredSize; + + // Stashes the anchor point + measured size so ApplyTransform can keep the gap to the + // dot a constant number of screen pixels instead of it growing while zooming in. + label.Tag = (point, size); + + // Hidden by default - see the matching comment in BuildLabels. + label.Visibility = Visibility.Collapsed; + + // Approximates the gap assuming scale=1 as a sane default before the first + // ApplyTransform call recomputes it precisely for the actual current zoom. + var halfWidth = size.Width / 2; + Canvas.SetLeft(label, point.X - CityLabelGapScreenPixels - halfWidth - halfWidth); + Canvas.SetTop(label, point.Y - size.Height / 2); + + LabelsCanvas.Children.Add(label); + _cityLabels.Add(label); + } + } + + private void RedrawHops() + { + // While collapsed, BorderHost is just the thin strip behind the toggle button (see + // TracerouteView's CollapseMapRow) - fitting against that tiny size would compute a + // _scale wildly more zoomed-out than the real one, badly distorting FitToHops' padding + // and, transitively, the cluster ring radius resolved against it (see AssignClusterOffsets/ + // RepositionMarker). Deferring the redraw until the control is actually expanded again - + // see OnIsExpandedChanged - avoids ever computing against that bogus collapsed size. + if (!IsExpanded) + { + _hopsRedrawPending = true; + return; + } + + _hopsRedrawPending = false; + + HopsCanvas.Children.Clear(); + _arrows.Clear(); + _markers.Clear(); + + // Forces the FitToHops -> ApplyTransform call at the end of this method to fully + // recompute positions even if it lands on the same scale as before - otherwise the + // brand-new hop labels just created below would keep their scale=1 build-time + // approximation whenever a new hop doesn't happen to change the required zoom. + _lastScaleDependentUpdateScale = -1; + + var groups = new List<(List Hops, Point Point, IPGeolocationInfo Info)>(); + + if (Hops != null) + { + foreach (var item in Hops) + { + if (item is not TracerouteHopInfo hop) + continue; + + var info = hop.IPGeolocationResult?.Info; + + // Skip hops without a resolved geolocation (e.g. private/local addresses). + if (info == null || (info.Lat == 0 && info.Lon == 0)) + continue; + + // Merge into the previous group if it's the same city/country and directly + // follows it, so a run of hops within the same city gets a single marker + // instead of several overlapping dots. "Directly follows" is checked against the + // group's last actual hop number (not just group adjacency) - otherwise an + // unresolved hop skipped by the check above (e.g. resolved hops 2 and 4 in the + // same city with unresolved hop 3 between them) would silently merge into the + // same marker and its "Hops 2-4" label would wrongly imply hop 3 belongs to it. + if (groups.Count > 0 && groups[^1].Hops[^1].Hop == hop.Hop - 1 && + IsSameLocation(groups[^1].Info, info)) + { + groups[^1].Hops.Add(hop); + continue; + } + + groups.Add(([hop], Project(info.Lat, info.Lon), info)); + } + } + + var rawPoints = groups.Select(g => g.Point).ToList(); + + // Fans out repeat visits to the same city that weren't merged above (something was in + // between - e.g. Frankfurt -> Cologne -> Frankfurt) into a small ring around the shared + // point, so their markers don't overlap; see AssignClusterOffsets. Grouped by + // AssignClusterIds (same name/country OR coinciding coordinates - see its own doc comment + // for why either alone isn't enough). Unlike the old vertical-stack approach, this offset + // is a constant *screen*-pixel vector, not converted to map units here - RepositionMarker/ + // UpdateArrowGeometry resolve it against the *current* _scale every zoom step, so the ring + // stays a constant size on screen no matter how far the user zooms in past this route's + // initial fit (see the doc comment on AssignClusterOffsets). + var clusterOffsets = AssignClusterOffsets( + AssignClusterIds(groups.Select(g => (g.Point, g.Info)).ToList())); + + var positions = groups.Select((g, i) => new ClusteredPoint(g.Point, clusterOffsets[i])).ToList(); + + _hopPoints = rawPoints; + + // Only the ring itself is budgeted here (via the max cluster offset length) - the + // hop-number label RepositionMarker renders further out from a ring-displaced marker adds + // its own extent on top, hence the extra ClusterLabelPaddingAllowanceScreenPixels below, + // applied only when a cluster is actually present (an unclustered route stays as tightly + // fitted as before). + var maxClusterRingRadius = clusterOffsets.Count > 0 ? clusterOffsets.Max(v => v.Length) : 0; + _hopClusterPaddingScreenPixels = maxClusterRingRadius > 0 + ? maxClusterRingRadius + ClusterLabelPaddingAllowanceScreenPixels + : 0; + + // FitToHops reserves _hopClusterPaddingScreenPixels of extra screen-pixel margin so a + // cluster ring (plus its hop-number label) near the fitted view's edge doesn't render + // outside it. + FitToHops(rawPoints, _hopClusterPaddingScreenPixels); + + // Markers are drawn first (so their highlight callbacks exist for the arrows below to + // wire up), but given a higher Panel.ZIndex so they still render on top of the arrows, + // regardless of add order. + var markerHighlighters = new List>(); + var markerHitTargets = new List(); + + for (var i = 0; i < groups.Count; i++) + { + var (highlighter, hitTarget) = DrawHopMarker(groups[i].Hops, groups[i].Info, positions[i]); + markerHighlighters.Add(highlighter); + markerHitTargets.Add(hitTarget); + } + + var arrowHighlighters = new List>(); + + for (var i = 0; i < groups.Count - 1; i++) + arrowHighlighters.Add(DrawArrow( + (groups[i].Hops, positions[i], groups[i].Info), + (groups[i + 1].Hops, positions[i + 1], groups[i + 1].Info), + markerHighlighters[i], markerHighlighters[i + 1])); + + // Wires each marker to also highlight its adjacent arrow(s) when hovered, now that both + // markers and arrows (and their highlight callbacks) exist. + for (var i = 0; i < groups.Count; i++) + { + var incoming = i > 0 ? arrowHighlighters[i - 1] : null; + var outgoing = i < groups.Count - 1 ? arrowHighlighters[i] : null; + + if (incoming == null && outgoing == null) + continue; + + var hitTarget = markerHitTargets[i]; + + hitTarget.MouseEnter += (_, _) => + { + incoming?.Invoke(true); + outgoing?.Invoke(true); + }; + + hitTarget.MouseLeave += (_, _) => + { + incoming?.Invoke(false); + outgoing?.Invoke(false); + }; + } + } + + // Tuning for AssignClusterOffsets: N=2 gets a small, tight ring; each additional member grows + // the ring a bit so members stay roughly readable apart (they already tolerate some hit-target + // overlap today, same as the old 26px vertical spacing did against the 32px hit-test size). + private const double ClusterRingBaseRadiusScreenPixels = 13; + private const double ClusterRingRadiusGrowthPerMarker = 4; + + // Extra fit-view margin (see RedrawHops/FitToHops) added on top of a cluster's own ring radius + // to also cover its hop-number label, which RepositionMarker renders HopLabelGapScreenPixels + // plus its own half-width further out from the ring-resolved marker position. A generous + // estimate (covers a two-digit hop range like "12-18" in bold 11pt with room to spare) rather + // than the label's actual measured width, since that's only known once DrawHopMarker measures + // it - after this padding has already been used to fit the view. + private const double ClusterLabelPaddingAllowanceScreenPixels = 34; + + /// + /// Assigns each repeat occurrence of the same location an offset vector, in constant *screen* + /// pixels, arranged evenly around a small ring centered on the true geo point (angle = + /// 2*pi*i/N), so a route that revisits a city (e.g. hairpins through Frankfurt twice) gets + /// visually distinguishable markers instead of one hiding another. Grouped by a caller-supplied + /// cluster id (see AssignClusterIds) rather than the point itself, since different IPs at the + /// same real location commonly resolve to slightly different lat/lon. + /// + /// + /// Deliberately returns a *screen*-pixel vector rather than converting it to map units here - + /// that's the key difference from this method's predecessor (a vertical stack that baked a + /// map-unit offset, computed from whatever _scale the whole route's initial fit happened to + /// produce, directly into each marker's coordinate). That baked offset never shrank back down + /// as the user zoomed in further, so a stack of markers visually drifted apart the more they + /// zoomed past the original fit. RepositionMarker/UpdateArrowGeometry instead resolve this + /// vector against the *current* _scale on every zoom step (same pattern already used for + /// labels/arrow stroke thickness), so the ring stays a constant on-screen size at any zoom. + /// + private static List AssignClusterOffsets(List clusterIds) + { + var result = new Vector[clusterIds.Count]; + + // Grouped by original index (rather than the two-dictionary occurrence-counting this + // replaced) so each group's size (n) and each member's position within it (i) both fall + // out of a single pass, with results written back into their original slot in one go. + var groups = clusterIds.Select((id, index) => (id, index)).GroupBy(x => x.id); + + foreach (var group in groups) + { + var members = group.ToList(); + var n = members.Count; + + if (n <= 1) + { + result[members[0].index] = new Vector(0, 0); + continue; + } + + var radius = ClusterRingBaseRadiusScreenPixels + Math.Max(0, n - 2) * ClusterRingRadiusGrowthPerMarker; + + for (var i = 0; i < n; i++) + { + var angle = -Math.PI / 2 + 2 * Math.PI * i / n; // start pointing "up" - cosmetic only + result[members[i].index] = new Vector(radius * Math.Cos(angle), radius * Math.Sin(angle)); + } + } + + return result.ToList(); + } + + /// + /// Draws a hop marker and returns a callback to toggle its highlight (invoked both on its + /// own hover and, from RedrawHops, when an adjacent arrow is hovered) plus its hit-test + /// element (so RedrawHops can wire the reverse: hovering this marker highlighting its + /// adjacent arrows too). 's ClusterOffset is Vector(0,0) if this + /// marker isn't part of a cluster (see AssignClusterOffsets); it's resolved against the + /// current _scale by RepositionMarker, both now and again every time the zoom level changes. + /// + private (Action SetHighlighted, UIElement HitTarget) DrawHopMarker(List hops, IPGeolocationInfo info, ClusteredPoint position) + { + var tooltip = BuildHopTooltip(hops, info); + + // Markers render above arrows regardless of add order - RedrawHops creates all markers + // before the arrows, so their highlight callbacks exist for the arrows to wire up. + const int markerZIndex = 1; + + // An invisible, much larger hit target behind the visible dot - the marker itself is + // only ~9 screen pixels, too small to reliably hover. + var hitTarget = new Ellipse + { + Width = HopMarkerHitTestSize, + Height = HopMarkerHitTestSize, + Fill = Brushes.Transparent, + RenderTransform = _inverseScaleTransform, + RenderTransformOrigin = new Point(0.5, 0.5) + }; + + Panel.SetZIndex(hitTarget, markerZIndex); + + HopsCanvas.Children.Add(hitTarget); + + // Purely visual - IsHitTestVisible=false so it never shadows hitTarget underneath it; + // without this, hovering exactly on the (smaller) visible dot hit *this* element instead + // (topmost at that point, since it's added after hitTarget), which has no handlers, so + // nothing happened - only hovering the "donut" around it (hitTarget without ellipse on + // top) worked. + var ellipse = new Ellipse + { + Width = HopMarkerSize, + Height = HopMarkerSize, + IsHitTestVisible = false, + RenderTransform = _inverseScaleTransform, + RenderTransformOrigin = new Point(0.5, 0.5) + }; + + ellipse.SetResourceReference(Shape.FillProperty, "MahApps.Brushes.Accent"); + + Panel.SetZIndex(ellipse, markerZIndex); + + HopsCanvas.Children.Add(ellipse); + + // Renders to the right of the dot - see the matching comment on city labels in + // BuildCities for why this uses a center-pivot offset instead of an edge anchor. + var numberLabel = new TextBlock + { + Text = hops.Count == 1 ? $"{hops[0].Hop}" : $"{hops[0].Hop}–{hops[^1].Hop}", + FontSize = 11, + FontWeight = FontWeights.Bold, + IsHitTestVisible = false, + RenderTransform = _inverseScaleTransform, + RenderTransformOrigin = new Point(0.5, 0.5) + }; + + numberLabel.SetResourceReference(TextBlock.ForegroundProperty, "MahApps.Brushes.Gray3"); + + numberLabel.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); + var size = numberLabel.DesiredSize; + Panel.SetZIndex(numberLabel, markerZIndex); + + HopsCanvas.Children.Add(numberLabel); + + var marker = new HopMarkerVisual + { + Position = position, + HitTarget = hitTarget, + Dot = ellipse, + NumberLabel = numberLabel, + NumberLabelSize = size + }; + + // RedrawHops fits the view to the route before calling this, so _scale is already + // correct here - unlike BuildCities/BuildLabels (which run once at Loaded, before any + // fit has happened), this can position exactly instead of approximating at scale=1. + RepositionMarker(marker, 1 / _scale); + _markers.Add(marker); + + // Purely visual - deliberately does NOT touch the info panel itself, since this is also + // invoked from RedrawHops when an *adjacent arrow* is hovered (cross-highlighting this + // marker), and that shouldn't replace whatever info the arrow itself is showing. + void SetHighlighted(bool highlighted) + { + // Fetched live (rather than a frozen field) so the ring keeps matching the current + // theme even if the user switches theme while this view is still alive. + ellipse.Stroke = highlighted + ? (Brush)Application.Current.FindResource("MahApps.Brushes.ThemeForeground") + : null; + ellipse.StrokeThickness = highlighted ? 2 : 0; + } + + // Only this marker's own hover (not cross-highlighting) shows/hides its info. + hitTarget.MouseEnter += (_, _) => + { + SetHighlighted(true); + ShowInfoPanel(tooltip); + }; + + hitTarget.MouseLeave += (_, _) => + { + SetHighlighted(false); + HideInfoPanel(); + }; + + return (SetHighlighted, hitTarget); + } + + /// + /// Centers a fixed-size shape (Width/Height already set) on the given point via Canvas.Left/Top. + /// + private static void CenterOn(Shape shape, Point center) + { + Canvas.SetLeft(shape, center.X - shape.Width / 2); + Canvas.SetTop(shape, center.Y - shape.Height / 2); + } + + /// + /// Resolves a marker's on-screen position (see ClusteredPoint.Resolve) and repositions its hit + /// target/dot/number label accordingly. Called once when the marker is first drawn and again + /// from ApplyTransform every time the zoom level changes, so the cluster offset - which must + /// represent a fixed number of *screen* pixels, not map units - doesn't drift the further the + /// user zooms in past the route's initial fit (see the doc comment on AssignClusterOffsets). + /// + private static void RepositionMarker(HopMarkerVisual marker, double inverseScale) + { + var resolved = marker.Position.Resolve(inverseScale); + + CenterOn(marker.HitTarget, resolved); + CenterOn(marker.Dot, resolved); + + // Positions directly from the already-resolved point rather than round-tripping through + // Tag (as city/country labels do) - Tag's documented meaning elsewhere in this file is a + // stable, build-time-fixed anchor (see the _countryLabels/_cityLabels field comment), which + // a hop number label's cluster-resolved position is not: it moves every zoom step. + PositionOffsetLabel(marker.NumberLabel, resolved, marker.NumberLabelSize, HopLabelGapScreenPixels, inverseScale, growLeft: false); + Canvas.SetTop(marker.NumberLabel, resolved.Y - marker.NumberLabelSize.Height / 2); + } + + private static bool IsSameLocation(IPGeolocationInfo a, IPGeolocationInfo b) + { + // A missing city (e.g. a rural hop the geolocation service could only place in a + // country, not a specific city) must not compare equal to another missing city - two + // such hops are otherwise treated as the "same" location purely because both are blank, + // even when their actual coordinates are far apart. Fall back to comparing the resolved + // coordinate directly instead. + if (string.IsNullOrEmpty(a.City) || string.IsNullOrEmpty(b.City)) + return a.Lat.Equals(b.Lat) && a.Lon.Equals(b.Lon); + + return string.Equals(a.City, b.City, StringComparison.OrdinalIgnoreCase) && + string.Equals(a.Country, b.Country, StringComparison.OrdinalIgnoreCase); + } + + // Tolerance for IsSameProjectedPoint, in map units - see its own doc comment. ~0.036 degrees + // on this projection, a few km: tight enough not to conflate distinct nearby cities/suburbs, + // loose enough to absorb float noise between two lookups that really are the same place. + private const double SameProjectedPointToleranceMapUnits = 0.1; + + /// + /// Treats two projected points as the same location when they're within + /// SameProjectedPointToleranceMapUnits of each other. Used alongside IsSameLocation by + /// AssignClusterIds - see its doc comment for why coordinate proximity has to be checked in + /// addition to the city/country name, not instead of it. + /// + private static bool IsSameProjectedPoint(Point a, Point b) + { + return Math.Abs(a.X - b.X) < SameProjectedPointToleranceMapUnits && + Math.Abs(a.Y - b.Y) < SameProjectedPointToleranceMapUnits; + } + + /// + /// Assigns every group a cluster id for AssignClusterOffsets, unioning two groups together + /// when they're either the same named city/country (IsSameLocation) or their projected points + /// coincide (IsSameProjectedPoint). + /// + /// + /// Checking both, rather than only IsSameLocation, matters in practice: some geolocation + /// lookups label the same real city differently between hops (e.g. "Frankfurt" vs "Frankfurt + /// am Main" for two hops a few IPs apart in the same network) - a name-only check treats those + /// as unrelated locations, so AssignClusterOffsets never rings them apart even though they + /// project to (nearly) the same point and visibly overlap on the map. Union-find (rather than a + /// single hashable key, e.g. the string key this replaced) is needed because "same name OR same + /// coordinates" isn't a single equivalence a per-item key can express on its own - group A might + /// only share a name with B, and B only share coordinates with C, but A/B/C still all belong in + /// the same cluster. Squarely O(n^2) over the group count, which is fine given it's at most a + /// few dozen hops. + /// + private static List AssignClusterIds(IReadOnlyList<(Point Point, IPGeolocationInfo Info)> entries) + { + var parent = Enumerable.Range(0, entries.Count).ToArray(); + + int Find(int x) + { + while (parent[x] != x) + { + parent[x] = parent[parent[x]]; + x = parent[x]; + } + + return x; + } + + for (var i = 0; i < entries.Count; i++) + { + for (var j = i + 1; j < entries.Count; j++) + { + if (!IsSameLocation(entries[i].Info, entries[j].Info) && + !IsSameProjectedPoint(entries[i].Point, entries[j].Point)) + continue; + + var rootI = Find(i); + var rootJ = Find(j); + + if (rootI != rootJ) + parent[rootI] = rootJ; + } + } + + return Enumerable.Range(0, entries.Count).Select(Find).ToList(); + } + + private static string BuildHopTooltip(List hops, IPGeolocationInfo info) + { + var firstHop = hops[0]; + + var hopLabel = hops.Count == 1 + ? $"{Strings.Hop} {firstHop.Hop}" + : $"{Strings.Hops} {firstHop.Hop}–{hops[^1].Hop}"; + + var lines = new List { hopLabel, FormatLocation(info, includeRegion: true) }; + + if (!string.IsNullOrEmpty(info.Isp)) + lines.Add(info.Isp); + + if (!string.IsNullOrEmpty(info.As)) + lines.Add(info.As); + + if (!string.IsNullOrEmpty(firstHop.Hostname)) + lines.Add(firstHop.Hostname); + + var ipLine = firstHop.IPAddress?.ToString() ?? "-"; + + if (hops.Count > 1) + ipLine += " " + string.Format(Strings.PlusXMore, hops.Count - 1); + + lines.Add(ipLine); + + var averageRoundTripTime = GetAverageRoundTripTime(hops); + + if (averageRoundTripTime.HasValue) + lines.Add($"Ø {averageRoundTripTime.Value:F0} ms"); + + return string.Join("\n", lines); + } + + /// + /// Averages every valid ping across all hops in a group (e.g. "Hops 3-6"), since showing + /// just the first hop's own times would be misleading for a merged marker. A "valid" ping + /// is Success OR TtlExpired - matching Ping.TimeToString's own definition of a real reply, + /// since intermediate router hops normally answer with TtlExpired, not Success (only the + /// actual destination host does) - checking Success alone would only ever find a time for + /// the very last hop. + /// + private static double? GetAverageRoundTripTime(List hops) + { + var times = new List(); + + foreach (var hop in hops) + { + if (IsValidPingStatus(hop.Status1)) + times.Add(hop.Time1); + + if (IsValidPingStatus(hop.Status2)) + times.Add(hop.Time2); + + if (IsValidPingStatus(hop.Status3)) + times.Add(hop.Time3); + } + + return times.Count > 0 ? times.Average() : null; + } + + private static bool IsValidPingStatus(IPStatus status) + { + return status is IPStatus.Success or IPStatus.TtlExpired; + } + + private static string FormatLocation(IPGeolocationInfo info, bool includeRegion = false) + { + var parts = new List(); + + if (!string.IsNullOrEmpty(info.City)) + parts.Add(info.City); + + if (includeRegion && !string.IsNullOrEmpty(info.RegionName)) + parts.Add(info.RegionName); + + if (!string.IsNullOrEmpty(info.Country)) + parts.Add(info.Country); + + return parts.Count > 0 ? string.Join(", ", parts) : "-"; + } + + /// + /// Draws an arrow and returns a callback to toggle its highlight (invoked both on its own + /// hover and, via RedrawHops, when either endpoint marker is hovered). Also wires the + /// reverse: hovering this arrow highlights the two marker callbacks passed in. Each endpoint + /// is a ClusteredPoint, same as DrawHopMarker - see the doc comment on ArrowVisual/ + /// UpdateArrowGeometry for why the full curve geometry, not just the marker-edge trim, has to + /// be resolved fresh from these every zoom step. + /// + private Action DrawArrow((List Hops, ClusteredPoint Position, IPGeolocationInfo Info) from, + (List Hops, ClusteredPoint Position, IPGeolocationInfo Info) to, + Action highlightFromMarker, Action highlightToMarker) + { + // A hop between these two groups was dropped for lacking geolocation (see the filter in + // RedrawHops) - the direct line drawn below isn't the actual route then, just the closest + // honest approximation. Rendered in a muted gray (see below) and labelled "Unknown" in the + // tooltip instead of the usual accent color, so it doesn't read as an equally-confident, + // fully observed segment. + var isGap = to.Hops[0].Hop != from.Hops[^1].Hop + 1; + + // Skip hops that resolve to (nearly) the same on-screen position. Judged on the resolved, + // cluster-displaced positions (at the route's own just-computed fit scale) rather than the + // raw geo anchors - two cluster members of the same location group (see AssignClusterIds) + // often share the same anchor, but AssignClusterOffsets always gives them distinct ring + // offsets, so they resolve to different points and must still get a connecting arrow. Only + // anchors that are *both* identical and unclustered (offset zero + // on both ends) collapse to the same resolved point here. + var fromResolved = from.Position.Resolve(1 / _scale); + var toResolved = to.Position.Resolve(1 / _scale); + var resolvedDx = toResolved.X - fromResolved.X; + var resolvedDy = toResolved.Y - fromResolved.Y; + + if (Math.Sqrt(resolvedDx * resolvedDx + resolvedDy * resolvedDy) < 0.01) + return static _ => { }; + + var tooltip = isGap + ? $"{FormatLocation(from.Info, includeRegion: true)}\n↓\n{Strings.Unknown}\n↓\n{FormatLocation(to.Info, includeRegion: true)}" + : $"{FormatLocation(from.Info, includeRegion: true)}\n↓\n{FormatLocation(to.Info, includeRegion: true)}"; + + var geometry = new PathGeometry(); + var figure = new PathFigure { IsClosed = false }; + var segment = new QuadraticBezierSegment(); + figure.Segments.Add(segment); + geometry.Figures.Add(figure); + + // An invisible, much wider hit target along the same curve - the visible stroke is only + // ~1-2 screen pixels, too thin to reliably hover. Shares the same (mutable) geometry + // object with the visible path below, so both update together in UpdateArrowGeometry. + var hitPath = new Path + { + Data = geometry, + Stroke = Brushes.Transparent + }; + + HopsCanvas.Children.Add(hitPath); + + // The curve's endpoints must stay exactly on the hops it connects. Kept semi-transparent + // by default (see hitPath's MouseEnter/Leave below) so a dense tangle of arrows doesn't + // visually dominate the map; hovering highlights just that one. IsHitTestVisible=false so + // it never shadows hitPath underneath it - see the matching comment on the ellipse in + // DrawHopMarker for why that matters. + var path = new Path + { + Data = geometry, + StrokeDashArray = [3, 2.2], + // Rounded dash caps/joins read softer/more modern than the default hard rectangular + // ends on each dash segment. + StrokeStartLineCap = PenLineCap.Round, + StrokeEndLineCap = PenLineCap.Round, + StrokeDashCap = PenLineCap.Round, + Opacity = ArrowDefaultOpacity, + IsHitTestVisible = false + }; + + path.SetResourceReference(Shape.StrokeProperty, isGap ? "MahApps.Brushes.Gray3" : "MahApps.Brushes.Accent"); + + HopsCanvas.Children.Add(path); + + var headTransform = new ScaleTransform(); + + var arrowHead = new Polygon + { + RenderTransform = headTransform, + Opacity = ArrowDefaultOpacity, + IsHitTestVisible = false + }; + + arrowHead.SetResourceReference(Shape.FillProperty, isGap ? "MahApps.Brushes.Gray3" : "MahApps.Brushes.Accent"); + + HopsCanvas.Children.Add(arrowHead); + + var arrow = new ArrowVisual + { + From = from.Position, + To = to.Position, + Figure = figure, + Segment = segment, + Path = path, + HitPath = hitPath, + ArrowHead = arrowHead, + HeadTransform = headTransform + }; + + // Positions everything for the current scale right away - RedrawHops fits the view before + // drawing, so _scale is already correct. ApplyTransform calls UpdateArrowGeometry again on + // every zoom (see its doc) so both endpoints - and the whole curve built from them - keep + // tracking their markers' constant screen offsets instead of freezing at this route's + // auto-fit scale. + UpdateArrowGeometry(arrow, 1 / _scale); + + _arrows.Add(arrow); + + // Purely visual - deliberately does NOT touch the info panel; see the matching comment + // in DrawHopMarker (this is also invoked when this arrow's own endpoint markers are + // hovered, cross-highlighting it, and that shouldn't replace the marker's own info). + void SetHighlighted(bool highlighted) + { + var opacity = highlighted ? 1 : ArrowDefaultOpacity; + path.Opacity = opacity; + arrowHead.Opacity = opacity; + highlightFromMarker(highlighted); + highlightToMarker(highlighted); + } + + // Only this arrow's own hover (not cross-highlighting) shows/hides its info. + hitPath.MouseEnter += (_, _) => + { + SetHighlighted(true); + ShowInfoPanel(tooltip); + }; + + hitPath.MouseLeave += (_, _) => + { + SetHighlighted(false); + HideInfoPanel(); + }; + + return SetHighlighted; + } + + /// + /// Resolves both endpoints (see ClusteredPoint.Resolve) against the given inverseScale, then + /// rebuilds the whole curve - control point, tangent angles, marker-edge trim, arrowhead, + /// stroke thickness - from scratch. Called once when the arrow is first drawn and again from + /// ApplyTransform every time the user zooms. + /// + /// + /// Unlike labels/city dots, an arrow endpoint attached to a clustered marker isn't a fixed map + /// point: its cluster offset must represent a constant number of *screen* pixels, so its + /// resolved map-unit position - and with it the segment's direction and length - changes every + /// time inverseScale does. That's why this recomputes the full curve every call rather than + /// just the marker-edge trim (as a prior version of this method did, back when both endpoints + /// were assumed fixed) - the control point/tangent angles are no longer scale-independent. + /// Given the small hop counts involved, recomputing unconditionally (even for unclustered + /// arrows, where the endpoints don't actually move) is not worth special-casing. + /// + private static void UpdateArrowGeometry(ArrowVisual arrow, double inverseScale) + { + var fromPoint = arrow.From.Resolve(inverseScale); + var toPoint = arrow.To.Resolve(inverseScale); + + var dx = toPoint.X - fromPoint.X; + var dy = toPoint.Y - fromPoint.Y; + + // Floored so perpX/perpY and the atan2 tangent angles below stay well-defined even in the + // (rare) case two ring positions resolve to nearly the same point. + var length = Math.Max(Math.Sqrt(dx * dx + dy * dy), 0.0001); + + // Every arrow bows slightly to one side, consistently relative to its own direction of + // travel (a "flight path" look, closer to how a great-circle route would actually bend on + // this projection) - a segment and its reverse (e.g. Frankfurt -> Cologne -> Frankfurt) + // automatically curve to opposite sides purely as a side effect of perpX/perpY flipping + // sign with the reversed dx/dy, so they never draw on top of each other without needing to + // special-case repeated location pairs. No lower floor on the offset (unlike the upper + // ArrowCurveMaxOffset cap) - a short segment (e.g. two hops in the same city) should curve + // proportionally less than a long one, not get forced up to a fixed minimum that would + // dwarf it into a near-loop instead of a slight curve. + var perpX = -dy / length; + var perpY = dx / length; + var curveOffset = Math.Min(length * ArrowCurveFraction, ArrowCurveMaxOffset); + var controlPoint = new Point( + (fromPoint.X + toPoint.X) / 2 + perpX * curveOffset, + (fromPoint.Y + toPoint.Y) / 2 + perpY * curveOffset); + + var startAngle = Math.Atan2(controlPoint.Y - fromPoint.Y, controlPoint.X - fromPoint.X); + var endAngle = Math.Atan2(toPoint.Y - controlPoint.Y, toPoint.X - controlPoint.X); + + // Capped to a fraction of this segment's own length: a route might also contain a hop far + // away (e.g. another continent), which forces a much more zoomed-out auto-fit _scale for + // the whole view - inverseScale (and so the trim, in map units) grows accordingly, and + // for a short segment (e.g. two hops in the same city) an uncapped trim could eat most or + // all of it, badly distorting - or even inverting - the curve. + var markerRadius = Math.Min(HopMarkerSize / 2 * inverseScale, length * 0.3); + + var startPoint = new Point( + fromPoint.X + Math.Cos(startAngle) * markerRadius, + fromPoint.Y + Math.Sin(startAngle) * markerRadius); + var endPoint = new Point( + toPoint.X - Math.Cos(endAngle) * markerRadius, + toPoint.Y - Math.Sin(endAngle) * markerRadius); + + arrow.Figure.StartPoint = startPoint; + arrow.Segment.Point1 = controlPoint; + arrow.Segment.Point2 = endPoint; + + const double arrowAngle = 25 * Math.PI / 180; + + var p1 = new Point( + endPoint.X - ArrowHeadLength * Math.Cos(endAngle - arrowAngle), + endPoint.Y - ArrowHeadLength * Math.Sin(endAngle - arrowAngle)); + var p2 = new Point( + endPoint.X - ArrowHeadLength * Math.Cos(endAngle + arrowAngle), + endPoint.Y - ArrowHeadLength * Math.Sin(endAngle + arrowAngle)); + + arrow.ArrowHead.Points = [endPoint, p1, p2]; + + // Scaled around the trimmed tip, so the arrowhead keeps a constant on-screen size while + // staying pinned exactly to the marker edge it points at. + arrow.HeadTransform.CenterX = endPoint.X; + arrow.HeadTransform.CenterY = endPoint.Y; + arrow.HeadTransform.ScaleX = inverseScale; + arrow.HeadTransform.ScaleY = inverseScale; + + arrow.Path.StrokeThickness = ArrowStrokeThickness * inverseScale; + arrow.HitPath.StrokeThickness = ArrowHitTestStrokeThickness * inverseScale; + } + + /// + /// Shows the fixed info panel (bottom-right) with the given text - see the XAML comment on + /// InfoPanel for why this replaces a WPF ToolTip popup for hop markers/arrows. + /// + private void ShowInfoPanel(string text) + { + InfoPanelText.Text = text; + InfoPanel.Visibility = Visibility.Visible; + } + + private void HideInfoPanel() + { + InfoPanel.Visibility = Visibility.Collapsed; + } + + /// + /// Projects WGS84 latitude/longitude to the map's equirectangular canvas coordinates. + /// + private static Point Project(double lat, double lon) + { + var x = (lon + 180.0) / 360.0 * MapWidth; + var y = (90.0 - lat) / 180.0 * MapHeight; + + return new Point(x, y); + } + + // Latitude the empty (no-trace) view centers on vertically. ~40°N keeps populated land + // (USA / Europe / Mediterranean) around the middle instead of the empty equator ocean. + private const double DefaultViewCenterLatitude = 40; + + #endregion + + #region Zoom & pan + + private void UpdateScaleBounds() + { + _minScale = Math.Min(BorderHost.ActualWidth / MapWidth, BorderHost.ActualHeight / MapHeight); + _maxScale = _minScale * 30; + } + + private void FitToView() + { + // Forces any pending layout to complete so ActualWidth/Height are already correct the + // very first time this runs (e.g. right after Loaded), instead of silently bailing out + // on a still-zero size and leaving labels stuck at their un-transformed Canvas.Left=0. + BorderHost.UpdateLayout(); + + if (BorderHost.ActualWidth <= 0 || BorderHost.ActualHeight <= 0) + return; + + UpdateScaleBounds(); + + // Fill the view with the map ("cover", not "contain"): the map row is usually much wider + // than tall, so scaling to fit the whole world would leave big empty side margins with a + // small map floating in the middle. Scaling to the larger axis instead makes the map fill + // BorderHost; any overflow on the other axis is clipped by BorderHost's own ClipToBounds. + _scale = Math.Clamp(Math.Max(BorderHost.ActualWidth / MapWidth, BorderHost.ActualHeight / MapHeight), _minScale, _maxScale); + + // Center horizontally on the map's middle and vertically on a populated latitude (see + // DefaultViewCenterLatitude) instead of the empty equator. ClampPan keeps either axis from + // exposing blank canvas past the map's edge (and just centers an axis that already fits). + var centerX = MapWidth / 2; + var centerY = Project(DefaultViewCenterLatitude, 0).Y; + + _panX = ClampPan(BorderHost.ActualWidth / 2 - centerX * _scale, MapWidth * _scale, + BorderHost.ActualWidth); + _panY = ClampPan(BorderHost.ActualHeight / 2 - centerY * _scale, MapHeight * _scale, + BorderHost.ActualHeight); + + ApplyTransform(); + } + + /// + /// Keeps a pan offset from showing blank canvas past the map's real edge on one side while + /// content still reaches the opposite viewport edge. Centers instead whenever the scaled map + /// is already smaller than the viewport on this axis, since then no pan can make real content + /// reach both edges anyway. + /// + private static double ClampPan(double pan, double scaledContentSize, double viewportSize) + { + if (scaledContentSize <= viewportSize) + return (viewportSize - scaledContentSize) / 2; + + return Math.Clamp(pan, viewportSize - scaledContentSize, 0); + } + + /// + /// Zooms/pans so all given (already projected, anchor-only) points are visible, falling back + /// to the whole world when there are none. Called after every hop redraw, on resize, and on + /// Reset. optionally reserves extra margin for + /// content that extends past the anchors themselves by a constant number of screen pixels - + /// namely a hop's cluster ring plus its label (see AssignClusterOffsets/RedrawHops) - which + /// can't be included in directly since it's expressed in *screen* + /// pixels, not map units. See ComputeHopsFit for how that's resolved in one exact pass. + /// + private void FitToHops(IReadOnlyList points, double extraPaddingScreenPixels = 0) + { + if (points.Count == 0) + { + FitToView(); + return; + } + + // See FitToView: forces layout so a still-pending initial measure can't leave this + // bailing out silently and labels stuck un-transformed. + BorderHost.UpdateLayout(); + + if (BorderHost.ActualWidth <= 0 || BorderHost.ActualHeight <= 0) + return; + + UpdateScaleBounds(); + + (_scale, _panX, _panY) = ComputeHopsFit(points, extraPaddingScreenPixels); + + ApplyTransform(); + } + + /// + /// Pure bounding-box fit for FitToHops: given the anchor points and a screen-pixel margin to + /// reserve around them, computes the scale/pan that fits them into BorderHost. + /// + /// + /// The paddingFraction/minPaddingMapUnits margin below scales with the content itself, so it + /// can be added directly in map units before dividing. extraPaddingScreenPixels can't be + /// handled the same way - its map-unit size depends on the very scale being solved for - so + /// instead of converting it via an intermediate scale (which a prior version of this method did + /// in a second pass, and which only approximately delivered the requested margin since that + /// intermediate scale generally isn't the final one), it's reserved exactly by shrinking the + /// *available* viewport before dividing: content / (viewport - 2 * extra) is already the scale + /// that leaves exactly extraPaddingScreenPixels free on each side, with no second pass needed. + /// + private (double Scale, double PanX, double PanY) ComputeHopsFit(IReadOnlyList points, double extraPaddingScreenPixels) + { + // Padding scales with the hops' own spread (~12.5% border on each side), so a route + // across continents and a cluster of hops in one city both end up a similarly tight fit. + // Floored for degenerate spans (e.g. a single hop), so it doesn't zoom in indefinitely. + const double paddingFraction = 0.125; + const double minPaddingMapUnits = 3; + + var rawMinX = points.Min(p => p.X); + var rawMaxX = points.Max(p => p.X); + var rawMinY = points.Min(p => p.Y); + var rawMaxY = points.Max(p => p.Y); + + var paddingX = Math.Max((rawMaxX - rawMinX) * paddingFraction, minPaddingMapUnits); + var paddingY = Math.Max((rawMaxY - rawMinY) * paddingFraction, minPaddingMapUnits); + + var width = Math.Max(rawMaxX - rawMinX + 2 * paddingX, 1); + var height = Math.Max(rawMaxY - rawMinY + 2 * paddingY, 1); + + var availableWidth = Math.Max(BorderHost.ActualWidth - 2 * extraPaddingScreenPixels, 1); + var availableHeight = Math.Max(BorderHost.ActualHeight - 2 * extraPaddingScreenPixels, 1); + + var scale = Math.Clamp(Math.Min(availableWidth / width, availableHeight / height), + _minScale, _maxScale); + + var centerX = (rawMinX + rawMaxX) / 2; + var centerY = (rawMinY + rawMaxY) / 2; + + // Clamped the same way as FitToView/wheel zoom/drag-pan - otherwise a route near the map's + // edge (e.g. close to +/-180 deg longitude or a pole) can center a pan that leaves blank + // canvas past the map's real edge in the viewport. + var panX = ClampPan(BorderHost.ActualWidth / 2 - centerX * scale, MapWidth * scale, BorderHost.ActualWidth); + var panY = ClampPan(BorderHost.ActualHeight / 2 - centerY * scale, MapHeight * scale, BorderHost.ActualHeight); + + return (scale, panX, panY); + } + + private void ApplyTransform() + { + ZoomTransform.ScaleX = _scale; + ZoomTransform.ScaleY = _scale; + PanTransform.X = _panX; + PanTransform.Y = _panY; + + // Counter-scaling, arrow geometry and label repositioning only depend on the zoom level + // (panning shifts every point by the same offset), so skip them while the user is just + // dragging the map around. + var scaleChanged = Math.Abs(_scale - _lastScaleDependentUpdateScale) >= 1e-9; + + if (scaleChanged) + { + _lastScaleDependentUpdateScale = _scale; + + // Counter-scale the labels/dots so their on-screen size stays constant. + var inverseScale = 1 / _scale; + _inverseScaleTransform.ScaleX = inverseScale; + _inverseScaleTransform.ScaleY = inverseScale; + + // Country border StrokeThickness is otherwise in map units like everything else in + // RootCanvas, so at high zoom (up to 30x) it would render many screen pixels thick. + CountriesPath.StrokeThickness = CountryBorderStrokeThickness * inverseScale; + + foreach (var arrow in _arrows) + UpdateArrowGeometry(arrow, inverseScale); + + // Hop markers always stay visible regardless of zoom/declutter - they're the actual + // traceroute data, not the reference layer. Re-resolves each marker's on-screen + // position (anchor + cluster offset) so a cluster ring stays a constant screen size. + foreach (var marker in _markers) + RepositionMarker(marker, inverseScale); + + // City labels grow to the left instead (see BuildCities). + foreach (var label in _cityLabels) + RepositionOffsetLabel(label, CityLabelGapScreenPixels, inverseScale, growLeft: true); + } + + // Unlike the block above, *which* reference labels are in view changes with panning too, + // and DeclutterReferenceLabels culls off-screen ones - so it must also re-run on pan, + // otherwise a label panned into view would stay hidden from when it was still off-screen + // (leaving just the city dots). Cheap on pan: off-screen labels are dropped by a single + // viewport check before the overlap pass. Below the visibility threshold nothing shows + // regardless of pan, so there only a scale change needs to act (to collapse them once). + var referenceLabelsVisible = _scale > _minScale * LabelVisibleScaleFactor; + + if (scaleChanged || referenceLabelsVisible) + DeclutterReferenceLabels(referenceLabelsVisible); + } + + /// + /// Repositions a label center-pivoted (RenderTransformOrigin 0.5,0.5 - set in BuildCities/ + /// DrawHopMarker) on a point offset a constant number of screen pixels to the left or right + /// of its anchor (Tag), so the gap doesn't grow while zooming in. For city/country labels, + /// whose anchor is a stable, build-time-fixed point - see PositionOffsetLabel for the same + /// math against an anchor that isn't stashed in Tag (e.g. a cluster-resolved hop marker). + /// + private static void RepositionOffsetLabel(TextBlock label, double gapScreenPixels, double inverseScale, bool growLeft) + { + if (label.Tag is not (Point anchor, Size size)) + return; + + PositionOffsetLabel(label, anchor, size, gapScreenPixels, inverseScale, growLeft); + } + + /// + /// Core of RepositionOffsetLabel, taking the anchor/size directly instead of reading them from + /// Tag - lets RepositionMarker supply an already cluster-resolved anchor that changes every + /// zoom step, without needing to write a transient value into Tag (which elsewhere in this file + /// means a stable, build-time-fixed point) just to hand it back through. + /// + private static void PositionOffsetLabel(TextBlock label, Point anchor, Size size, double gapScreenPixels, double inverseScale, bool growLeft) + { + var halfWidth = size.Width / 2; + var centerOffset = growLeft ? -(gapScreenPixels + halfWidth) : gapScreenPixels + halfWidth; + Canvas.SetLeft(label, anchor.X + centerOffset * inverseScale - halfWidth); + } + + /// + /// Hides overlapping country/city labels instead of letting them render on top of each + /// other. Cities take priority over countries, since they're the more specific reference + /// near a hop. Deliberately does NOT consider hop markers/numbers here: a city label must + /// stay visible even right next to a hop, since that's the one piece of on-map context + /// (e.g. "Frankfurt") the user actually needs there - only text-on-text overlap is fixed. + /// + private void DeclutterReferenceLabels(bool referenceLabelsVisible) + { + if (!referenceLabelsVisible) + { + foreach (var label in _cityLabels) + label.Visibility = Visibility.Collapsed; + + foreach (var label in _countryLabels) + label.Visibility = Visibility.Collapsed; + + return; + } + + var placedRects = new List(); + + // Only labels actually inside the viewport can matter: culling the (often large) + // off-screen majority up front keeps this pass roughly O(visible^2) instead of O(all^2) + // over all ~900 country + city labels on every zoom step - and an off-screen label is + // hidden anyway, so this changes nothing visible. + var viewport = new Rect(0, 0, BorderHost.ActualWidth, BorderHost.ActualHeight); + + foreach (var label in _cityLabels.Concat(_countryLabels)) + { + var rect = GetLabelScreenRect(label); + + if (!viewport.IntersectsWith(rect)) + { + label.Visibility = Visibility.Collapsed; + continue; + } + + if (placedRects.Any(r => r.IntersectsWith(rect))) + { + label.Visibility = Visibility.Collapsed; + continue; + } + + label.Visibility = Visibility.Visible; + placedRects.Add(rect); + } + } + + /// + /// Computes the actual on-screen rect of a label. Every label is center-pivoted + /// (RenderTransformOrigin 0.5,0.5) with a constant on-screen size, so its rendered center is + /// simply its Canvas.Left/Top center run through the current zoom/pan, and the rect spans + /// its cached (zoom-independent) size around that center. + /// + private Rect GetLabelScreenRect(TextBlock label) + { + if (label.Tag is not (Point, Size size)) + return Rect.Empty; + + var centerX = (Canvas.GetLeft(label) + size.Width / 2) * _scale + _panX; + var centerY = (Canvas.GetTop(label) + size.Height / 2) * _scale + _panY; + + return new Rect(centerX - size.Width / 2, centerY - size.Height / 2, size.Width, size.Height); + } + + private void BorderHost_SizeChanged(object sender, SizeChangedEventArgs e) + { + // While collapsed, BorderHost is just the thin strip behind the toggle button - its width + // can still change (e.g. an outer window resize) even though its height stays collapsed- + // thin, and fitting against that tiny size would compute a wildly zoomed-out _scale (same + // reasoning as the matching guard in RedrawHops). Deferred via the same _hopsRedrawPending + // flag OnIsExpandedChanged already watches, so re-expanding re-fits against whatever size + // BorderHost ended up at, instead of leaving a stale/corrupted transform from before. + if (!IsExpanded) + { + _hopsRedrawPending = true; + return; + } + + // Re-fit to the last drawn points, exactly like the Reset button. Lightweight (just + // recomputes the transform, no marker rebuild), so dragging the GridSplitter stays smooth + // and the view ends up properly fitted instead of needing a manual Reset afterwards. + FitToHops(_hopPoints, _hopClusterPaddingScreenPixels); + } + + private void BorderHost_MouseWheel(object sender, MouseWheelEventArgs e) + { + // Zooming a strip too thin to show anything meaningful doesn't make sense - see + // BorderHost_MouseLeftButtonDown for the matching "click to expand" behavior instead. + if (!IsExpanded) + return; + + var position = e.GetPosition(BorderHost); + var oldScale = _scale; + var factor = e.Delta > 0 ? 1.15 : 1 / 1.15; + var newScale = Math.Clamp(oldScale * factor, _minScale, _maxScale); + + if (Math.Abs(newScale - oldScale) < 0.0001) + return; + + // Keep the point under the cursor fixed while zooming. + _panX = position.X - (position.X - _panX) * (newScale / oldScale); + _panY = position.Y - (position.Y - _panY) * (newScale / oldScale); + _scale = newScale; + + // Clamp so the cursor-anchored pan above can't leave blank canvas past the map's edge + // inside the viewport (same reasoning as FitToView), e.g. when zooming near an edge. + _panX = ClampPan(_panX, MapWidth * _scale, BorderHost.ActualWidth); + _panY = ClampPan(_panY, MapHeight * _scale, BorderHost.ActualHeight); + + ApplyTransform(); + + e.Handled = true; + } + + private void BorderHost_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) + { + // While collapsed, BorderHost is just the thin strip behind the toggle button - too + // small to usefully pan/zoom, so a click there expands the map instead (matching the + // toggle button) rather than starting a drag that can't show anything meaningful. + if (!IsExpanded) + { + IsExpanded = true; + e.Handled = true; + return; + } + + _isPanning = true; + _panStartMouse = e.GetPosition(BorderHost); + _panStartX = _panX; + _panStartY = _panY; + + BorderHost.CaptureMouse(); + } + + private void BorderHost_MouseMove(object sender, MouseEventArgs e) + { + if (!_isPanning || !IsExpanded) + return; + + var current = e.GetPosition(BorderHost); + + _panX = _panStartX + (current.X - _panStartMouse.X); + _panY = _panStartY + (current.Y - _panStartMouse.Y); + + // Clamp so the map can't be dragged off-screen into blank canvas (same reasoning as + // FitToView / the mouse-wheel zoom); Reset re-centers on the route if needed. + _panX = ClampPan(_panX, MapWidth * _scale, BorderHost.ActualWidth); + _panY = ClampPan(_panY, MapHeight * _scale, BorderHost.ActualHeight); + + ApplyTransform(); + } + + private void BorderHost_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) + { + _isPanning = false; + BorderHost.ReleaseMouseCapture(); + } + + // Mouse capture can be lost without a matching MouseLeftButtonUp (e.g. Alt+Tab while + // dragging) - without this, _isPanning would stay true and the next mouse move over + // BorderHost would keep panning the map even though the button is no longer held. + private void BorderHost_LostMouseCapture(object sender, MouseEventArgs e) + { + _isPanning = false; + } + + private void ButtonResetView_Click(object sender, RoutedEventArgs e) + { + FitToHops(_hopPoints, _hopClusterPaddingScreenPixels); + } + + #endregion + + #region Country data + + private static Brush FreezeBrush(Color color) + { + var brush = new SolidColorBrush(color); + brush.Freeze(); + + return brush; + } + + private static StreamGeometry BuildCountriesGeometry() + { + var geometry = new StreamGeometry(); + + using (var context = geometry.Open()) + { + foreach (var country in Countries.Value) + { + if (country.R == null) + continue; + + foreach (var ring in country.R) + { + if (ring.Count < 2) + continue; + + var points = ring.Select(coordinate => Project(coordinate[1], coordinate[0])).ToList(); + + context.BeginFigure(points[0], true, true); + context.PolyLineTo(points.Skip(1).ToList(), true, false); + } + } + } + + geometry.Freeze(); + + return geometry; + } + + /// + /// Picks a label anchor per country: the bounding-box center of its largest ring (by bounding- + /// box area), so a mainland-plus-islands country gets labelled on the mainland. Bounding box + /// rather than a true polygon centroid (e.g. shoelace) because the simplified, coordinate- + /// rounded ring data can self-intersect, and a shoelace centroid is only guaranteed inside a + /// simple polygon - for a self-intersecting ring it can land outside the landmass entirely. + /// + private static List<(string Name, Point Position)> BuildCountryLabels() + { + var labels = new List<(string, Point)>(); + + foreach (var country in Countries.Value) + { + if (string.IsNullOrEmpty(country.N) || country.R == null) + continue; + + var bestBoundsArea = -1.0; + var bestCenter = default(Point); + + foreach (var ring in country.R) + { + if (ring.Count < 3) + continue; + + var points = ring.Select(coordinate => Project(coordinate[1], coordinate[0])).ToList(); + + var minX = points.Min(p => p.X); + var maxX = points.Max(p => p.X); + var minY = points.Min(p => p.Y); + var maxY = points.Max(p => p.Y); + + var boundsArea = (maxX - minX) * (maxY - minY); + + if (boundsArea <= bestBoundsArea) + continue; + + bestBoundsArea = boundsArea; + bestCenter = new Point((minX + maxX) / 2, (minY + maxY) / 2); + } + + if (bestBoundsArea >= 0) + labels.Add((country.N, bestCenter)); + } + + return labels; + } + + private static List LoadCountries() + { + const string resourceName = "NETworkManager.Resources.Maps.world-map.json"; + + var assembly = Assembly.GetExecutingAssembly(); + + using var stream = assembly.GetManifestResourceStream(resourceName) ?? + throw new FileNotFoundException($"Embedded resource \"{resourceName}\" not found."); + using var reader = new StreamReader(stream); + + return System.Text.Json.JsonSerializer.Deserialize>(reader.ReadToEnd()) ?? []; + } + + /// + /// Minimal representation of a simplified country outline (name + outer ring coordinates as [lon, lat] pairs). + /// + private sealed class CountryData + { + [JsonPropertyName("n")] + public string N { get; set; } + + [JsonPropertyName("r")] + public List>> R { get; set; } + } + + private static List LoadCities() + { + const string resourceName = "NETworkManager.Resources.Maps.world-cities.json"; + + var assembly = Assembly.GetExecutingAssembly(); + + using var stream = assembly.GetManifestResourceStream(resourceName) ?? + throw new FileNotFoundException($"Embedded resource \"{resourceName}\" not found."); + using var reader = new StreamReader(stream); + + return System.Text.Json.JsonSerializer.Deserialize>(reader.ReadToEnd()) ?? []; + } + + /// + /// Minimal representation of a major city (national capital or population above the script's threshold). + /// + private sealed class CityData + { + [JsonPropertyName("n")] + public string N { get; set; } + + [JsonPropertyName("lat")] + public double Lat { get; set; } + + [JsonPropertyName("lon")] + public double Lon { get; set; } + } + + #endregion + + /// + /// A true geo anchor plus a constant-screen-pixel cluster offset (see AssignClusterOffsets). + /// Shared by every marker/arrow endpoint so there's a single place that knows how to resolve + /// one into an actual on-screen position - see Resolve. + /// + private readonly record struct ClusteredPoint(Point Anchor, Vector ClusterOffset) + { + /// + /// Resolves this point's on-screen position for the given inverseScale. The cluster offset + /// must represent a fixed number of *screen* pixels, not map units, so it's added here - + /// scaled by the *current* inverseScale - rather than ever being baked into Anchor once; + /// see the doc comment on AssignClusterOffsets for why that distinction is the whole point + /// of this type. + /// + public Point Resolve(double inverseScale) => Anchor + ClusterOffset * inverseScale; + } + + /// + /// One drawn hop marker: its resolved-on-demand position (see ClusteredPoint) and the three + /// visual elements RepositionMarker keeps in sync with it every time the zoom level changes. + /// NumberLabelSize is measured once at build time - see the comment on the + /// _countryLabels/_cityLabels fields for why it can't be read back later via + /// TextBlock.DesiredSize. + /// + private sealed class HopMarkerVisual + { + public ClusteredPoint Position { get; init; } + public Ellipse HitTarget { get; init; } + public Ellipse Dot { get; init; } + public TextBlock NumberLabel { get; init; } + public Size NumberLabelSize { get; init; } + } + + /// + /// The endpoints (as ClusteredPoint, same as HopMarkerVisual) plus the visual elements for one + /// hop-to-hop arrow. All derived geometry - resolved endpoints, control point, tangent angles, + /// marker-edge trim - is transient and rebuilt from these every call to UpdateArrowGeometry, + /// since a clustered endpoint's resolved position moves every time the zoom level changes. + /// + private sealed class ArrowVisual + { + public ClusteredPoint From { get; init; } + public ClusteredPoint To { get; init; } + public PathFigure Figure { get; init; } + public QuadraticBezierSegment Segment { get; init; } + public Path Path { get; init; } + public Path HitPath { get; init; } + public Polygon ArrowHead { get; init; } + public ScaleTransform HeadTransform { get; init; } + } +} diff --git a/Source/NETworkManager/Controls/UserControlBase.cs b/Source/NETworkManager/Controls/UserControlBase.cs new file mode 100644 index 0000000000..a0b9085bdd --- /dev/null +++ b/Source/NETworkManager/Controls/UserControlBase.cs @@ -0,0 +1,19 @@ +using System.ComponentModel; +using System.Runtime.CompilerServices; +using System.Windows.Controls; + +namespace NETworkManager.Controls; + +public abstract class UserControlBase : UserControl, INotifyPropertyChanged +{ + #region PropertyChangedEventHandler + + public event PropertyChangedEventHandler PropertyChanged; + + protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager/Controls/WebConsoleControl.xaml b/Source/NETworkManager/Controls/WebConsoleControl.xaml index 8f75d0f1ac..92b8056c28 100644 --- a/Source/NETworkManager/Controls/WebConsoleControl.xaml +++ b/Source/NETworkManager/Controls/WebConsoleControl.xaml @@ -1,27 +1,32 @@ - - + + + - + + - + @@ -34,7 +39,7 @@ - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -228,17 +434,21 @@ - - + + + + + - - + + - - + + - + - + @@ -435,53 +730,80 @@ - + - + - - + - - + - diff --git a/Source/NETworkManager/MainWindow.xaml.cs b/Source/NETworkManager/MainWindow.xaml.cs index 3142361d8e..264269aec4 100644 --- a/Source/NETworkManager/MainWindow.xaml.cs +++ b/Source/NETworkManager/MainWindow.xaml.cs @@ -1,497 +1,549 @@ -using System; +using Dragablz; +using log4net; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Controls; +using NETworkManager.Documentation; +using NETworkManager.Localization; +using NETworkManager.Localization.Resources; +using NETworkManager.Models; +using NETworkManager.Models.EventSystem; +using NETworkManager.Models.Network; +using NETworkManager.Profiles; +using NETworkManager.Settings; +using NETworkManager.Update; +using NETworkManager.Utilities; +using NETworkManager.ViewModels; +using NETworkManager.Views; +using System; +using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; -using System.Windows; -using System.Windows.Data; -using System.Windows.Input; using System.Drawing; -using System.Windows.Forms; -using System.Text.RegularExpressions; using System.Linq; -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.Views; -using NETworkManager.Settings; +using System.Net.NetworkInformation; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using System.Security.Cryptography; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Data; +using System.Windows.Forms; +using System.Windows.Input; using System.Windows.Interop; -using System.Collections.Generic; -using NETworkManager.Utilities; -using System.Runtime.CompilerServices; using System.Windows.Markup; -using NETworkManager.Controls; -using NETworkManager.Documentation; -using NETworkManager.ViewModels; -using ContextMenu = System.Windows.Controls.ContextMenu; -using NETworkManager.Profiles; -using NETworkManager.Localization; -using NETworkManager.Localization.Translators; -using NETworkManager.Update; -using NETworkManager.Models; -using NETworkManager.Models.EventSystem; using System.Windows.Threading; -using System.Threading.Tasks; -using System.Net.NetworkInformation; -using System.IO; +using Application = System.Windows.Application; +using ContextMenu = System.Windows.Controls.ContextMenu; +using MouseEventArgs = System.Windows.Forms.MouseEventArgs; -namespace NETworkManager +namespace NETworkManager; + +public sealed partial class MainWindow : INotifyPropertyChanged { - public partial class MainWindow : INotifyPropertyChanged - { - #region PropertyChangedEventHandler - public event PropertyChangedEventHandler PropertyChanged; + #region Events - protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) + private void SettingsManager_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + switch (e.PropertyName) { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + // Show restart required note for some settings + case nameof(SettingsInfo.Localization_CultureCode): + IsRestartRequired = true; + + break; + + // Update TrayIcon if changed in the settings + case nameof(SettingsInfo.TrayIcon_AlwaysShowIcon): + if (SettingsManager.Current.TrayIcon_AlwaysShowIcon && _notifyIcon == null) + InitNotifyIcon(); + + if (_notifyIcon != null) + _notifyIcon.Visible = SettingsManager.Current.TrayIcon_AlwaysShowIcon; + + break; + + // Update DNS server if changed in the settings + case nameof(SettingsInfo.Network_UseCustomDNSServer): + case nameof(SettingsInfo.Network_CustomDNSServer): + ConfigureDNSServer(); + + break; } - #endregion + } - #region Variables - private NotifyIcon _notifyIcon; - private StatusWindow _statusWindow; + #endregion - private readonly bool _isLoading; - private bool _isProfileLoading; - private bool _isProfileUpdating; - private bool _isApplicationListLoading; + #region Bugfixes - private bool _isInTray; - private bool _closeApplication; + private void ScrollViewer_ManipulationBoundaryFeedback(object sender, ManipulationBoundaryFeedbackEventArgs e) + { + e.Handled = true; + } - // Indicates a restart message, when settings changed - private string _cultureCode; + #endregion - private bool _expandApplicationView; - public bool ExpandApplicationView - { - get => _expandApplicationView; - set - { - if (value == _expandApplicationView) - return; + #region PropertyChangedEventHandler - if (!_isLoading) - SettingsManager.Current.ExpandApplicationView = value; + public event PropertyChangedEventHandler PropertyChanged; - if (!value) - ClearSearchOnApplicationListMinimize(); + private void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } - _expandApplicationView = value; - OnPropertyChanged(); - } - } + #endregion + + #region Variables + + private static readonly ILog Log = LogManager.GetLogger(typeof(MainWindow)); + + private NotifyIcon _notifyIcon; + private StatusWindow _statusWindow; - private bool _isTextBoxSearchFocused; - public bool IsTextBoxSearchFocused + private readonly bool _isLoading; + private bool _isProfileFilesLoading; + private bool _isProfileFileUpdating; + private bool _isApplicationViewLoading; + private bool _isNetworkChanging; + + private bool _isInTray; + private bool _isClosing; + + public bool ApplicationViewIsExpanded + { + get; + set { - get => _isTextBoxSearchFocused; - set - { - if (value == _isTextBoxSearchFocused) - return; + if (value == field) + return; - if (!value) - ClearSearchOnApplicationListMinimize(); + if (!_isLoading) + SettingsManager.Current.ExpandApplicationView = value; - _isTextBoxSearchFocused = value; - OnPropertyChanged(); - } + if (!value) + ClearSearchOnApplicationListMinimize(); + + field = value; + OnPropertyChanged(); } + } - private bool _isApplicationListOpen; - public bool IsApplicationListOpen + public bool TextBoxApplicationSearchIsFocused + { + get; + set { - get => _isApplicationListOpen; - set - { - if (value == _isApplicationListOpen) - return; + if (value == field) + return; - if (!value) - ClearSearchOnApplicationListMinimize(); + if (!value) + ClearSearchOnApplicationListMinimize(); - _isApplicationListOpen = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isMouseOverApplicationList; - public bool IsMouseOverApplicationList + public bool ApplicationViewIsOpen + { + get; + set { - get => _isMouseOverApplicationList; - set - { - if (value == _isMouseOverApplicationList) - return; + if (value == field) + return; - if (!value) - ClearSearchOnApplicationListMinimize(); + if (!value) + ClearSearchOnApplicationListMinimize(); - _isMouseOverApplicationList = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private ICollectionView _applications; - public ICollectionView Applications + public bool ApplicationViewIsMouseOver + { + get; + set { - get => _applications; - set - { - if (value == _applications) - return; + if (value == field) + return; - _applications = value; - OnPropertyChanged(); - } + if (!value) + ClearSearchOnApplicationListMinimize(); + + field = value; + OnPropertyChanged(); } + } - private ApplicationInfo _selectedApplication; - public ApplicationInfo SelectedApplication + public ICollectionView Applications + { + get; + private set { - get => _selectedApplication; - set - { - if (_isApplicationListLoading) - return; + if (value == field) + return; - if (Equals(value, _selectedApplication)) - return; + field = value; + OnPropertyChanged(); + } + } - if (value != null) - ChangeApplicationView(value.Name); + public ApplicationInfo SelectedApplication + { + get; + set + { + // Do not change the application view if the application view is loading + if (_isApplicationViewLoading) + return; - _selectedApplication = value; - OnPropertyChanged(); - } - } + // Should only be null if we try to re-set the selected application via search + if (value == null && !_applicationViewIsEmpty) + return; - private ApplicationName _filterLastViewName; - private int? _filterLastCount; + // Don't update the application view if the application is the same + if (Equals(value, field)) + return; - private string _search = string.Empty; - public string Search - { - get => _search; - set + if (value != null && !_applicationViewIsEmpty) { - if (value == _search) - return; + // Hide the old application view + if (field != null) + OnApplicationViewHide(field.Name); - _search = value; + // Show the new application view + OnApplicationViewVisible(value.Name); - if (SelectedApplication != null) - _filterLastViewName = SelectedApplication.Name; + // Store the last selected application name + ConfigurationManager.Current.CurrentApplication = value.Name; + } - Applications.Refresh(); + field = value; + OnPropertyChanged(); + } + } - var sourceCollection = Applications.SourceCollection.Cast(); - var filteredCollection = Applications.Cast(); + private ApplicationInfo _previousSelectedApplication; - var sourceInfos = sourceCollection as ApplicationInfo[] ?? sourceCollection.ToArray(); - var filteredInfos = filteredCollection as ApplicationInfo[] ?? filteredCollection.ToArray(); + private bool _applicationViewIsEmpty; - if (_filterLastCount == null) - _filterLastCount = sourceInfos.Length; + public string ApplicationSearch + { + get; + set + { + if (value == field) + return; - SelectedApplication = _filterLastCount > filteredInfos.Length ? filteredInfos.FirstOrDefault() : sourceInfos.FirstOrDefault(x => x.Name == _filterLastViewName); + field = value; - _filterLastCount = filteredInfos.Length; + // Store the current selected application name + if (SelectedApplication != null) + _previousSelectedApplication = SelectedApplication; - // Show note when there was nothing found - SearchNothingFound = filteredInfos.Length == 0; + // Refresh (apply filter) + Applications.Refresh(); - OnPropertyChanged(); + if (Applications.IsEmpty) + { + _applicationViewIsEmpty = true; } - } - - private bool _searchNothingFound; - public bool SearchNothingFound - { - get => _searchNothingFound; - set + else if (_applicationViewIsEmpty) // Not empty anymore { - if (value == _searchNothingFound) - return; + SelectedApplication = null; - _searchNothingFound = value; - OnPropertyChanged(); + // Try to select the last selected application, otherwise select the first one + SelectedApplication = Applications.Cast() + .FirstOrDefault(x => x.Name == _previousSelectedApplication.Name) ?? + Applications.Cast().FirstOrDefault(); + + _applicationViewIsEmpty = false; } + + OnPropertyChanged(); } + } = string.Empty; - private SettingsView _settingsView; + private SettingsView _settingsView; - private bool _showSettingsView; - public bool ShowSettingsView + public bool SettingsViewIsOpen + { + get; + set { - get => _showSettingsView; - set - { - if (value == _showSettingsView) - return; + if (value == field) + return; - _showSettingsView = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isUpdateAvailable; - public bool IsUpdateAvailable + public bool FlyoutRunCommandIsOpen + { + get; + set { - get => _isUpdateAvailable; - set - { - if (value == _isUpdateAvailable) - return; + if (value == field) + return; - _isUpdateAvailable = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private ICollectionView _profileFiles; - public ICollectionView ProfileFiles + public bool IsRestartRequired + { + get; + set { - get => _profileFiles; - set - { - if (value == _profileFiles) - return; + if (value == field) + return; - _profileFiles = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private ProfileFileInfo _selectedProfileFile = null; - public ProfileFileInfo SelectedProfileFile + public bool IsUpdateAvailable + { + get; + set { - get => _selectedProfileFile; - set - { - if (_isProfileLoading) - return; - - if (value != null && value.Equals(_selectedProfileFile)) - return; - - _selectedProfileFile = value; - - if (value != null) - { - if (!_isProfileUpdating) - LoadProfile(value); - - if (SettingsManager.Current.Profiles_LastSelected != value.Name) - SettingsManager.Current.Profiles_LastSelected = value.Name; - } + if (value == field) + return; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isProfileFileLocked; - public bool IsProfileFileLocked + public string UpdateReleaseUrl + { + get; + private set { - get => _isProfileFileLocked; - set - { - if (value == _isProfileFileLocked) - return; + if (value == field) + return; - _isProfileFileLocked = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion + } - #region Constructor, window load and close events - public MainWindow() + public ICollectionView ProfileFiles + { + get; + private set { - _isLoading = true; - - InitializeComponent(); - DataContext = this; + if (value == field) + return; - // Language Meta - LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(LocalizationManager.GetInstance().Culture.IetfLanguageTag))); + field = value; + OnPropertyChanged(); + } + } - // Load / Change appearance - AppearanceManager.Load(); + public ProfileFileInfo SelectedProfileFile + { + get; + set + { + if (_isProfileFilesLoading) + return; - // Set title - Title = $"NETworkManager {AssemblyManager.Current.Version}"; + if (value != null && value.Equals(field)) + return; - // NotifyIcon for autostart - if (CommandLineManager.Current.Autostart && SettingsManager.Current.Autostart_StartMinimizedInTray || SettingsManager.Current.TrayIcon_AlwaysShowIcon) - InitNotifyIcon(); + field = value; - // Load settings - ExpandApplicationView = SettingsManager.Current.ExpandApplicationView; + if (value != null) + { + if (!_isProfileFileUpdating) + LoadProfile(value); - // Register event system... - SettingsManager.Current.PropertyChanged += SettingsManager_PropertyChanged; - //EventSystem.RedirectProfileToApplicationEvent += EventSystem_RedirectProfileToApplicationEvent; - EventSystem.OnRedirectDataToApplicationEvent += EventSystem_RedirectDataToApplicationEvent; - EventSystem.OnRedirectToSettingsEvent += EventSystem_RedirectToSettingsEvent; + ConfigurationManager.Current.ProfileManagerShowUnlock = value.IsEncrypted && !value.IsPasswordValid; + SettingsManager.Current.Profiles_LastSelected = value.Name; + } - _isLoading = false; + OnPropertyChanged(); } + } - protected override async void OnContentRendered(EventArgs e) + public bool IsProfileFileDropDownOpened + { + get; + set { - base.OnContentRendered(e); + if (value == field) + return; - // Show settings reset note... - if (ConfigurationManager.Current.ShowSettingsResetNoteOnStartup) - { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Localization.Resources.Strings.OK; + field = value; + OnPropertyChanged(); + } + } - ConfigurationManager.Current.FixAirspace = true; + #endregion - await this.ShowMessageAsync(Localization.Resources.Strings.SettingsHaveBeenReset, Localization.Resources.Strings.SettingsFileFoundWasCorruptOrNotCompatibleMessage, MessageDialogStyle.Affirmative, settings); + #region Constructor, window load and close events - ConfigurationManager.Current.FixAirspace = false; - } + public MainWindow() + { + _isLoading = true; - if (SettingsManager.Current.FirstRun) - { - // Show first run dialog... - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.Welcome - }; + InitializeComponent(); + DataContext = this; - var arpTableAddEntryViewModel = new FirstRunViewModel(async instance => - { - await this.HideMetroDialogAsync(customDialog); + // Language metadata + LanguageProperty.OverrideMetadata(typeof(FrameworkElement), + new FrameworkPropertyMetadata( + XmlLanguage.GetLanguage(LocalizationManager.GetInstance().Culture.IetfLanguageTag))); - SettingsManager.Current.FirstRun = false; - SettingsManager.Current.Update_CheckForUpdatesAtStartup = instance.CheckForUpdatesAtStartup; - SettingsManager.Current.Dashboard_CheckPublicIPAddress = instance.CheckPublicIPAddress; + // Load and change appearance + AppearanceManager.Load(); - AfterContentRendered(); - }); + // Load and configure DNS server + ConfigureDNSServer(); - customDialog.Content = new FirstRunDialog - { - DataContext = arpTableAddEntryViewModel - }; + // Set window title + Title = $"NETworkManager {AssemblyManager.Current.Version}"; - await this.ShowMetroDialogAsync(customDialog).ConfigureAwait(true); - } - else - { - AfterContentRendered(); - } - } + // Register event system... + SettingsManager.Current.PropertyChanged += SettingsManager_PropertyChanged; - private void AfterContentRendered() - { - // Load application list, filter, sort, etc. - LoadApplicationList(); + EventSystem.OnRedirectDataToApplicationEvent += EventSystem_RedirectDataToApplicationEvent; + EventSystem.OnRedirectToSettingsEvent += EventSystem_RedirectToSettingsEvent; - // Load profiles - _isProfileLoading = true; - ProfileFiles = new CollectionViewSource { Source = ProfileManager.ProfileFiles }.View; - ProfileFiles.SortDescriptions.Add(new SortDescription(nameof(ProfileFileInfo.Name), ListSortDirection.Ascending)); - _isProfileLoading = false; + _isLoading = false; + } + + private void MetroMainWindow_ContentRendered(object sender, EventArgs e) + { + WelcomeThenLoadAsync(); + } - ProfileManager.OnLoadedProfileFileChangedEvent += ProfileManager_OnLoadedProfileFileChangedEvent; + private async void WelcomeThenLoadAsync() + { + // Show a note if settings have been reset + if (ConfigurationManager.Current.ShowSettingsResetNoteOnStartup) + { + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.SettingsHaveBeenReset, + Strings.SettingsFileFoundWasCorruptOrNotCompatibleMessage, ChildWindowIcon.Error); + } - SelectedProfileFile = ProfileFiles.SourceCollection.Cast().FirstOrDefault(x => x.Name == SettingsManager.Current.Profiles_LastSelected); + // Show welcome dialog + if (SettingsManager.Current.WelcomeDialog_Show) + { + var childWindow = new WelcomeChildWindow(); - if (SelectedProfileFile == null) - SelectedProfileFile = ProfileFiles.SourceCollection.Cast().FirstOrDefault(); + var viewModel = new WelcomeViewModel(instance => + { + childWindow.IsOpen = false; + + ConfigurationManager.Current.IsChildWindowOpen = false; + + // Set settings based on user choice + SettingsManager.Current.Update_CheckForUpdatesAtStartup = instance.CheckForUpdatesAtStartup; + SettingsManager.Current.Dashboard_CheckPublicIPAddress = instance.CheckPublicIPAddress; + SettingsManager.Current.Dashboard_CheckIPApiIPGeolocation = + instance.CheckIPApiIPGeolocation; + SettingsManager.Current.Dashboard_CheckIPApiDNSResolver = instance.CheckIPApiDNSResolver; + SettingsManager.Current.Traceroute_CheckIPApiIPGeolocation = instance.CheckIPApiIPGeolocation; + SettingsManager.Current.Appearance_PowerShellModifyGlobalProfile = + instance.PowerShellModifyGlobalProfile; + + // Generate lists at runtime + SettingsManager.Current.General_ApplicationList = [.. ApplicationManager.GetDefaultList()]; + SettingsManager.Current.IPScanner_CustomCommands = [.. IPScannerCustomCommand.GetDefaultList()]; + SettingsManager.Current.PortScanner_PortProfiles = [.. PortProfile.GetDefaultList()]; + SettingsManager.Current.DNSLookup_DNSServers = [.. DNSServer.GetDefaultList()]; + SettingsManager.Current.SNMP_OidProfiles = [.. SNMPOIDProfile.GetDefaultList()]; + SettingsManager.Current.SNTPLookup_SNTPServers = [.. SNTPServer.GetDefaultList()]; + SettingsManager.Current.WelcomeDialog_Show = false; + + // Save it to create a settings file + SettingsManager.Save(); - // Hide to tray after the window shows up... not nice, but otherwise the hotkeys do not work - if (CommandLineManager.Current.Autostart && SettingsManager.Current.Autostart_StartMinimizedInTray) - HideWindowToTray(); + Load(); + }); - // Init status window - _statusWindow = new StatusWindow(this); + childWindow.DataContext = viewModel; - // Detect if network address or status changed... - NetworkChange.NetworkAvailabilityChanged += (sender, args) => OnNetworkHasChanged(); - NetworkChange.NetworkAddressChanged += (sender, args) => OnNetworkHasChanged(); + ConfigurationManager.Current.IsChildWindowOpen = true; - // Search for updates... - if (SettingsManager.Current.Update_CheckForUpdatesAtStartup) - CheckForUpdates(); + await this.ShowChildWindowAsync(childWindow); } - - private void LoadApplicationList() + else if (SettingsManager.Current.UpgradeDialog_Show) { - _isApplicationListLoading = true; + var childWindow = new UpgradeChildWindow(); - // Create a new list if empty - if (SettingsManager.Current.General_ApplicationList.Count == 0) - { - SettingsManager.Current.General_ApplicationList = new ObservableSetCollection(ApplicationManager.GetList()); - } - else // Check for missing applications and add them + var viewModel = new UpgradeViewModel(instance => { - foreach (ApplicationInfo info in ApplicationManager.GetList()) - { - bool isInList = false; + childWindow.IsOpen = false; - foreach (ApplicationInfo info2 in SettingsManager.Current.General_ApplicationList) - { - if (info.Name == info2.Name) - isInList = true; - } + ConfigurationManager.Current.IsChildWindowOpen = false; - if (!isInList) - SettingsManager.Current.General_ApplicationList.Add(info); - } - } + SettingsManager.Current.UpgradeDialog_Show = false; - Applications = new CollectionViewSource { Source = SettingsManager.Current.General_ApplicationList }.View; + SettingsManager.Save(); - Applications.SortDescriptions.Add(new SortDescription(nameof(ApplicationInfo.Name), ListSortDirection.Ascending)); // Always have the same order, even if it is translated... - Applications.Filter = o => - { - if (!(o is ApplicationInfo info)) - return false; + Load(); + }); - if (string.IsNullOrEmpty(Search)) - return info.IsVisible; + childWindow.DataContext = viewModel; - var regex = new Regex(@" |-"); + ConfigurationManager.Current.IsChildWindowOpen = true; - var search = regex.Replace(Search, ""); + await this.ShowChildWindowAsync(childWindow); + } + else + { + Load(); + } + } - // Search by TranslatedName and Name - return info.IsVisible && (regex.Replace(ApplicationNameTranslator.GetInstance().Translate(info.Name), "").IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1 || regex.Replace(info.Name.ToString(), "").IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0); - }; + private void Load() + { + // Load application list, filter, sort, etc. + LoadApplicationList(); - SettingsManager.Current.General_ApplicationList.CollectionChanged += (sender, args) => Applications.Refresh(); + // Load run commands + SetRunCommandsView(); - _isApplicationListLoading = false; + // Load the profiles + LoadProfiles(); - // Select the application - SelectedApplication = Applications.SourceCollection.Cast().FirstOrDefault(x => x.Name == (CommandLineManager.Current.Application != ApplicationName.None ? CommandLineManager.Current.Application : SettingsManager.Current.General_DefaultApplicationViewName)); + // Init notify icon + if (SettingsManager.Current.TrayIcon_AlwaysShowIcon) + InitNotifyIcon(); - // Scroll into view - if (SelectedApplication != null) - ListViewApplication.ScrollIntoView(SelectedApplication); - } + // Hide to tray after the window shows up... not nice, but otherwise the hotkeys do not work + if (CommandLineManager.Current.Autostart && SettingsManager.Current.Autostart_StartMinimizedInTray) + HideWindowToTray(); - private async void MetroWindowMain_Closing(object sender, CancelEventArgs e) - { - // Force restart --> e.g. Import or reset settings - // Soft restart --> e.g. change profile path - if (!_closeApplication && (ConfigurationManager.Current.ForceRestart || ConfigurationManager.Current.SoftRestart)) - { - e.Cancel = true; + // Init status window + _statusWindow = new StatusWindow(this); - RestartApplication(); + // Detect network changes... + NetworkChange.NetworkAvailabilityChanged += (_, _) => OnNetworkHasChanged(); + NetworkChange.NetworkAddressChanged += (_, _) => OnNetworkHasChanged(); - return; - } + // Search for updates... + if (PolicyManager.Current?.Update_CheckForUpdatesAtStartup + ?? SettingsManager.Current.Update_CheckForUpdatesAtStartup) + CheckForUpdates(); + else + Log.Info("Skipping update check at startup because it is disabled in the settings or via policy"); + } + private async void MetroWindowMain_Closing(object sender, CancelEventArgs e) + { + if (!_isClosing) + { // Hide the application to tray - if (!_closeApplication && (SettingsManager.Current.Window_MinimizeInsteadOfTerminating && WindowState != WindowState.Minimized)) + if (SettingsManager.Current.Window_MinimizeInsteadOfTerminating && WindowState != WindowState.Minimized) { e.Cancel = true; @@ -501,7 +553,7 @@ private async void MetroWindowMain_Closing(object sender, CancelEventArgs e) } // Confirm close - if (!_closeApplication && SettingsManager.Current.Window_ConfirmClose) + if (SettingsManager.Current.Window_ConfirmClose) { e.Cancel = true; @@ -509,955 +561,1423 @@ private async void MetroWindowMain_Closing(object sender, CancelEventArgs e) if (WindowState == WindowState.Minimized) BringWindowToFront(); - var settings = AppearanceManager.MetroDialog; - - settings.AffirmativeButtonText = Localization.Resources.Strings.Close; - settings.NegativeButtonText = Localization.Resources.Strings.Cancel; - settings.DefaultButtonFocus = MessageDialogResult.Affirmative; + ConfigurationManager.OnDialogOpen(); - // Fix airspace issues - ConfigurationManager.Current.FixAirspace = true; + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, Strings.ConfirmClose, + Strings.ConfirmCloseMessage, ChildWindowIcon.Question, Strings.Close, Strings.Cancel); - var result = await this.ShowMessageAsync(Localization.Resources.Strings.Confirm, Localization.Resources.Strings.ConfirmCloseMessage, MessageDialogStyle.AffirmativeAndNegative, settings); + ConfigurationManager.OnDialogClose(); - ConfigurationManager.Current.FixAirspace = false; - - if (result != MessageDialogResult.Affirmative) + if (!result) return; - _closeApplication = true; + _isClosing = true; Close(); return; } + } - // Unregister HotKeys - if (_registeredHotKeys.Count > 0) - UnregisterHotKeys(); + // Unregister HotKeys + if (_registeredHotKeys.Count > 0) + UnregisterHotKeys(); - // Dispose the notify icon to prevent errors - _notifyIcon?.Dispose(); - } - #endregion - - #region Application Views - private DashboardView _dashboardView; - private NetworkInterfaceView _networkInterfaceView; - private WiFiView _wiFiView; - private IPScannerHostView _ipScannerHostView; - private PortScannerHostView _portScannerHostView; - private PingMonitorHostView _pingMonitorHostView; - private TracerouteHostView _tracerouteHostView; - private DNSLookupHostView _dnsLookupHostView; - private RemoteDesktopHostView _remoteDesktopHostView; - private PowerShellHostView _powerShellHostView; - private PuTTYHostView _puttyHostView; - private TigerVNCHostView _tigerVNCHostView; - private WebConsoleHostView _webConsoleHostView; - private SNMPHostView _snmpHostView; - private DiscoveryProtocolView _discoveryProtocolView; - private WakeOnLANView _wakeOnLanView; - private SubnetCalculatorHostView _subnetCalculatorHostView; - private LookupHostView _lookupHostView; - private WhoisHostView _whoisHostView; - private ConnectionsView _connectionsView; - private ListenersView _listenersView; - private ARPTableView _arpTableView; - - private ApplicationName _currentApplicationViewName = ApplicationName.None; - - private void ChangeApplicationView(ApplicationName name, bool refresh = false) - { - if (!refresh && _currentApplicationViewName == name) - return; + // Dispose the notify icon to prevent errors + _notifyIcon?.Dispose(); + } - // Stop some functions on the old view - switch (_currentApplicationViewName) - { - case ApplicationName.Dashboard: - _dashboardView?.OnViewHide(); - break; - case ApplicationName.NetworkInterface: - _networkInterfaceView?.OnViewHide(); - break; - case ApplicationName.WiFi: - _wiFiView?.OnViewHide(); - break; - case ApplicationName.IPScanner: - _ipScannerHostView?.OnViewHide(); - break; - case ApplicationName.PortScanner: - _portScannerHostView?.OnViewHide(); - break; - case ApplicationName.PingMonitor: - _pingMonitorHostView?.OnViewHide(); - break; - case ApplicationName.Traceroute: - _tracerouteHostView?.OnViewHide(); - break; - case ApplicationName.DNSLookup: - _dnsLookupHostView?.OnViewHide(); - break; - case ApplicationName.RemoteDesktop: - _remoteDesktopHostView?.OnViewHide(); - break; - case ApplicationName.PowerShell: - _powerShellHostView?.OnViewHide(); - break; - case ApplicationName.PuTTY: - _puttyHostView?.OnViewHide(); - break; - case ApplicationName.TigerVNC: - _tigerVNCHostView?.OnViewHide(); - break; - case ApplicationName.WebConsole: - _webConsoleHostView?.OnViewHide(); - break; - case ApplicationName.SNMP: - _snmpHostView?.OnViewHide(); - break; - case ApplicationName.DiscoveryProtocol: - _discoveryProtocolView?.OnViewHide(); - break; - case ApplicationName.WakeOnLAN: - _wakeOnLanView?.OnViewHide(); - break; - //case ApplicationName.SubnetCalculator: - // _subnetCalculatorHostView?.OnViewHide(); - // break; - //case ApplicationName.Lookup: - // _lookupHostView?.OnViewHide(); - // break; - case ApplicationName.Connections: - _connectionsView?.OnViewHide(); - break; - case ApplicationName.Listeners: - _listenersView?.OnViewHide(); - break; - case ApplicationName.ARPTable: - _arpTableView?.OnViewHide(); - break; - } + #endregion - // Create new view / start some functions - switch (name) - { - case ApplicationName.Dashboard: - if (_dashboardView == null) - _dashboardView = new DashboardView(); - else - _dashboardView.OnViewVisible(); - - ContentControlApplication.Content = _dashboardView; - break; - case ApplicationName.NetworkInterface: - if (_networkInterfaceView == null) - _networkInterfaceView = new NetworkInterfaceView(); - else - _networkInterfaceView.OnViewVisible(); - - ContentControlApplication.Content = _networkInterfaceView; - break; - case ApplicationName.WiFi: - if (_wiFiView == null) - _wiFiView = new WiFiView(); - else - _wiFiView.OnViewVisible(); - - ContentControlApplication.Content = _wiFiView; - break; - case ApplicationName.IPScanner: - if (_ipScannerHostView == null) - _ipScannerHostView = new IPScannerHostView(); - else - _ipScannerHostView.OnViewVisible(); - - ContentControlApplication.Content = _ipScannerHostView; - break; - case ApplicationName.PortScanner: - if (_portScannerHostView == null) - _portScannerHostView = new PortScannerHostView(); - else - _portScannerHostView.OnViewVisible(); - - ContentControlApplication.Content = _portScannerHostView; - break; - case ApplicationName.PingMonitor: - if (_pingMonitorHostView == null) - _pingMonitorHostView = new PingMonitorHostView(); - else - _pingMonitorHostView.OnViewVisible(); - - ContentControlApplication.Content = _pingMonitorHostView; - break; - case ApplicationName.Traceroute: - if (_tracerouteHostView == null) - _tracerouteHostView = new TracerouteHostView(); - else - _tracerouteHostView.OnViewVisible(); - - ContentControlApplication.Content = _tracerouteHostView; - break; - case ApplicationName.DNSLookup: - if (_dnsLookupHostView == null) - _dnsLookupHostView = new DNSLookupHostView(); - else - _dnsLookupHostView.OnViewVisible(); - - ContentControlApplication.Content = _dnsLookupHostView; - break; - case ApplicationName.RemoteDesktop: - if (_remoteDesktopHostView == null) - _remoteDesktopHostView = new RemoteDesktopHostView(); - else - _remoteDesktopHostView.OnViewVisible(); - - ContentControlApplication.Content = _remoteDesktopHostView; - break; - case ApplicationName.PowerShell: - if (_powerShellHostView == null) - _powerShellHostView = new PowerShellHostView(); - else - _powerShellHostView.OnViewVisible(); - - ContentControlApplication.Content = _powerShellHostView; - break; - case ApplicationName.PuTTY: - if (_puttyHostView == null) - _puttyHostView = new PuTTYHostView(); - else - _puttyHostView.OnViewVisible(); - - ContentControlApplication.Content = _puttyHostView; - break; - case ApplicationName.TigerVNC: - if (_tigerVNCHostView == null) - _tigerVNCHostView = new TigerVNCHostView(); - else - _tigerVNCHostView.OnViewVisible(); - - ContentControlApplication.Content = _tigerVNCHostView; - break; - case ApplicationName.WebConsole: - if (_webConsoleHostView == null) - _webConsoleHostView = new WebConsoleHostView(); - else - _webConsoleHostView.OnViewVisible(); - - ContentControlApplication.Content = _webConsoleHostView; - break; - case ApplicationName.SNMP: - if (_snmpHostView == null) - _snmpHostView = new SNMPHostView(); - else - _snmpHostView.OnViewVisible(); - - ContentControlApplication.Content = _snmpHostView; - break; - case ApplicationName.DiscoveryProtocol: - if (_discoveryProtocolView == null) - _discoveryProtocolView = new DiscoveryProtocolView(); - else - _discoveryProtocolView.OnViewVisible(); - - ContentControlApplication.Content = _discoveryProtocolView; - break; - case ApplicationName.WakeOnLAN: - if (_wakeOnLanView == null) - _wakeOnLanView = new WakeOnLANView(); - else - _wakeOnLanView.OnViewVisible(); - - ContentControlApplication.Content = _wakeOnLanView; - break; - case ApplicationName.Whois: - if (_whoisHostView == null) - _whoisHostView = new WhoisHostView(); - else - _whoisHostView.OnViewVisible(); - - ContentControlApplication.Content = _whoisHostView; - break; - case ApplicationName.SubnetCalculator: - if (_subnetCalculatorHostView == null) - _subnetCalculatorHostView = new SubnetCalculatorHostView(); - //else - // _subnetCalculatorHostView.OnViewVisible(); - - ContentControlApplication.Content = _subnetCalculatorHostView; - break; - case ApplicationName.Lookup: - if (_lookupHostView == null) - _lookupHostView = new LookupHostView(); - //else - // _lookupHostView.OnViewVisible(); - - ContentControlApplication.Content = _lookupHostView; - break; - case ApplicationName.Connections: - if (_connectionsView == null) - _connectionsView = new ConnectionsView(); - else - _connectionsView.OnViewVisible(); - - ContentControlApplication.Content = _connectionsView; - break; - case ApplicationName.Listeners: - if (_listenersView == null) - _listenersView = new ListenersView(); - else - _listenersView.OnViewVisible(); - - ContentControlApplication.Content = _listenersView; - break; - case ApplicationName.ARPTable: - if (_arpTableView == null) - _arpTableView = new ARPTableView(); - else - _arpTableView.OnViewVisible(); - - ContentControlApplication.Content = _arpTableView; - break; - case ApplicationName.None: - break; - default: - throw new ArgumentOutOfRangeException(nameof(name), name, null); - } + #region Application - _currentApplicationViewName = name; - } + private void LoadApplicationList() + { + _isApplicationViewLoading = true; - private void ClearSearchOnApplicationListMinimize() + Applications = new CollectionViewSource { - if (ExpandApplicationView) - return; + Source = SettingsManager.Current.General_ApplicationList + }.View; - if (IsApplicationListOpen && IsTextBoxSearchFocused) - return; + Applications.Filter = o => + { + if (o is not ApplicationInfo info) + return false; - if (IsApplicationListOpen && IsMouseOverApplicationList) - return; + if (string.IsNullOrEmpty(ApplicationSearch)) + return info.IsVisible; - Search = string.Empty; + var regex = new Regex(@" |-"); - // Scroll into view - ListViewApplication.ScrollIntoView(SelectedApplication); - } + var search = regex.Replace(ApplicationSearch, ""); - private void EventSystem_RedirectDataToApplicationEvent(object sender, EventArgs e) - { - if (!(e is EventSystemRedirectArgs data)) - return; + // Search by TranslatedName and Name + return info.IsVisible && ( + regex.Replace(ResourceTranslator.Translate(ResourceIdentifier.ApplicationName, info.Name), "") + .IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1 || regex + .Replace(info.Name.ToString(), "").Contains(search, StringComparison.OrdinalIgnoreCase) + ); + }; - // Change view - SelectedApplication = Applications.SourceCollection.Cast().FirstOrDefault(x => x.Name == data.Application); + SettingsManager.Current.General_ApplicationList.CollectionChanged += (_, _) => Applications.Refresh(); - // Crate a new tab / perform action - switch (data.Application) - { - case ApplicationName.IPScanner: - _ipScannerHostView.AddTab(data.Args); - break; - case ApplicationName.PortScanner: - _portScannerHostView.AddTab(data.Args); - break; - case ApplicationName.PingMonitor: - _pingMonitorHostView.AddHost(data.Args); - break; - case ApplicationName.Traceroute: - _tracerouteHostView.AddTab(data.Args); - break; - case ApplicationName.DNSLookup: - _dnsLookupHostView.AddTab(data.Args); - break; - case ApplicationName.RemoteDesktop: - _remoteDesktopHostView.AddTab(data.Args); - break; - case ApplicationName.PowerShell: - _powerShellHostView.AddTab(data.Args); - break; - case ApplicationName.PuTTY: - _puttyHostView.AddTab(data.Args); - break; - case ApplicationName.TigerVNC: - _tigerVNCHostView.AddTab(data.Args); - break; - case ApplicationName.SNMP: - _snmpHostView.AddTab(data.Args); - break; - case ApplicationName.NetworkInterface: - break; - case ApplicationName.WakeOnLAN: - break; - case ApplicationName.Whois: - break; - case ApplicationName.SubnetCalculator: - break; - case ApplicationName.Lookup: - break; - case ApplicationName.Connections: - break; - case ApplicationName.Listeners: - break; - case ApplicationName.ARPTable: - break; - case ApplicationName.None: - break; - default: - throw new ArgumentOutOfRangeException(); - } - } - #endregion + _isApplicationViewLoading = false; - #region Settings - private void OpenSettings() - { - // Save current language code - if (string.IsNullOrEmpty(_cultureCode)) - _cultureCode = SettingsManager.Current.Localization_CultureCode; + // Select the application + // Set application via command line, or select the default one, fallback to the first visible one + var applicationList = Applications.Cast().ToArray(); - // Init settings view - if (_settingsView == null) - { - _settingsView = new SettingsView(SelectedApplication.Name); - ContentControlSettings.Content = _settingsView; - } - else // Change view - { - _settingsView.ChangeSettingsView(SelectedApplication.Name); - _settingsView.Refresh(); - } + if (CommandLineManager.Current.Application != ApplicationName.None) + SelectedApplication = applicationList.FirstOrDefault(x => x.Name == CommandLineManager.Current.Application); + else + SelectedApplication = applicationList.FirstOrDefault(x => x.IsDefault) ?? + applicationList.FirstOrDefault(x => x.IsVisible); - // Show the view (this will hide other content) - ShowSettingsView = true; + // Scroll into view + if (SelectedApplication != null) + ListViewApplication.ScrollIntoView(SelectedApplication); - // Bring window to front - ShowWindowAction(); - } + // Expand application view + ApplicationViewIsExpanded = SettingsManager.Current.ExpandApplicationView; + } - private void EventSystem_RedirectToSettingsEvent(object sender, EventArgs e) - { - OpenSettings(); + private DashboardView _dashboardView; + private NetworkInterfaceView _networkInterfaceView; + private WiFiView _wiFiView; + private IPScannerHostView _ipScannerHostView; + private PortScannerHostView _portScannerHostView; + private PingMonitorHostView _pingMonitorHostView; + private TracerouteHostView _tracerouteHostView; + private DNSLookupHostView _dnsLookupHostView; + private RemoteDesktopHostView _remoteDesktopHostView; + private PowerShellHostView _powerShellHostView; + private PuTTYHostView _puttyHostView; + private TigerVNCHostView _tigerVNCHostView; + private WebConsoleHostView _webConsoleHostView; + private SNMPHostView _snmpHostView; + private SNTPLookupHostView _sntpLookupHostView; + private HostsFileEditorView _hostsFileEditorView; + private FirewallView _firewallView; + private DiscoveryProtocolView _discoveryProtocolView; + private WakeOnLANView _wakeOnLanView; + private SubnetCalculatorHostView _subnetCalculatorHostView; + private BitCalculatorView _bitCalculatorView; + private LookupHostView _lookupHostView; + private WhoisHostView _whoisHostView; + private IPGeolocationHostView _ipGeolocationHostView; + private ConnectionsView _connectionsView; + private ListenersView _listenersView; + private NeighborTableView _neighborTableView; + + /// + /// Method when the application view becomes visible (again). Either when switching the applications + /// or after opening and closing the settings. + /// + /// Name of the application + private void OnApplicationViewVisible(ApplicationName name) + { + switch (name) + { + case ApplicationName.Dashboard: + if (_dashboardView == null) + _dashboardView = new DashboardView(); + else + _dashboardView.OnViewVisible(); + + ContentControlApplication.Content = _dashboardView; + break; + case ApplicationName.NetworkInterface: + if (_networkInterfaceView == null) + _networkInterfaceView = new NetworkInterfaceView(); + else + _networkInterfaceView.OnViewVisible(); + + ContentControlApplication.Content = _networkInterfaceView; + break; + case ApplicationName.WiFi: + if (_wiFiView == null) + _wiFiView = new WiFiView(); + else + _wiFiView.OnViewVisible(); + + ContentControlApplication.Content = _wiFiView; + break; + case ApplicationName.IPScanner: + if (_ipScannerHostView == null) + _ipScannerHostView = new IPScannerHostView(); + else + _ipScannerHostView.OnViewVisible(); + + ContentControlApplication.Content = _ipScannerHostView; + break; + case ApplicationName.PortScanner: + if (_portScannerHostView == null) + _portScannerHostView = new PortScannerHostView(); + else + _portScannerHostView.OnViewVisible(); + + ContentControlApplication.Content = _portScannerHostView; + break; + case ApplicationName.PingMonitor: + if (_pingMonitorHostView == null) + _pingMonitorHostView = new PingMonitorHostView(); + else + _pingMonitorHostView.OnViewVisible(); + + ContentControlApplication.Content = _pingMonitorHostView; + break; + case ApplicationName.Traceroute: + if (_tracerouteHostView == null) + _tracerouteHostView = new TracerouteHostView(); + else + _tracerouteHostView.OnViewVisible(); + + ContentControlApplication.Content = _tracerouteHostView; + break; + case ApplicationName.DNSLookup: + if (_dnsLookupHostView == null) + _dnsLookupHostView = new DNSLookupHostView(); + else + _dnsLookupHostView.OnViewVisible(); + + ContentControlApplication.Content = _dnsLookupHostView; + break; + case ApplicationName.RemoteDesktop: + if (_remoteDesktopHostView == null) + _remoteDesktopHostView = new RemoteDesktopHostView(); + else + _remoteDesktopHostView.OnViewVisible(); + + ContentControlApplication.Content = _remoteDesktopHostView; + break; + case ApplicationName.PowerShell: + if (_powerShellHostView == null) + _powerShellHostView = new PowerShellHostView(); + else + _powerShellHostView.OnViewVisible(); + + ContentControlApplication.Content = _powerShellHostView; + break; + case ApplicationName.PuTTY: + if (_puttyHostView == null) + _puttyHostView = new PuTTYHostView(); + else + _puttyHostView.OnViewVisible(); + + ContentControlApplication.Content = _puttyHostView; + break; + case ApplicationName.TigerVNC: + if (_tigerVNCHostView == null) + _tigerVNCHostView = new TigerVNCHostView(); + else + _tigerVNCHostView.OnViewVisible(); + + ContentControlApplication.Content = _tigerVNCHostView; + break; + case ApplicationName.WebConsole: + if (_webConsoleHostView == null) + _webConsoleHostView = new WebConsoleHostView(); + else + _webConsoleHostView.OnViewVisible(); + + ContentControlApplication.Content = _webConsoleHostView; + break; + case ApplicationName.SNMP: + if (_snmpHostView == null) + _snmpHostView = new SNMPHostView(); + else + _snmpHostView.OnViewVisible(); + + ContentControlApplication.Content = _snmpHostView; + break; + case ApplicationName.SNTPLookup: + if (_sntpLookupHostView == null) + _sntpLookupHostView = new SNTPLookupHostView(); + else + _sntpLookupHostView.OnViewVisible(); + + ContentControlApplication.Content = _sntpLookupHostView; + break; + case ApplicationName.HostsFileEditor: + if (_hostsFileEditorView == null) + _hostsFileEditorView = new HostsFileEditorView(); + else + _hostsFileEditorView.OnViewVisible(); + + ContentControlApplication.Content = _hostsFileEditorView; + break; + case ApplicationName.Firewall: + if (_firewallView is null) + _firewallView = new FirewallView(); + else + _firewallView.OnViewVisible(); + + ContentControlApplication.Content = _firewallView; + break; + case ApplicationName.DiscoveryProtocol: + if (_discoveryProtocolView == null) + _discoveryProtocolView = new DiscoveryProtocolView(); + else + _discoveryProtocolView.OnViewVisible(); + + ContentControlApplication.Content = _discoveryProtocolView; + break; + case ApplicationName.WakeOnLAN: + if (_wakeOnLanView == null) + _wakeOnLanView = new WakeOnLANView(); + else + _wakeOnLanView.OnViewVisible(); + + ContentControlApplication.Content = _wakeOnLanView; + break; + case ApplicationName.Whois: + if (_whoisHostView == null) + _whoisHostView = new WhoisHostView(); + else + _whoisHostView.OnViewVisible(); + + ContentControlApplication.Content = _whoisHostView; + break; + case ApplicationName.IPGeolocation: + if (_ipGeolocationHostView == null) + _ipGeolocationHostView = new IPGeolocationHostView(); + else + _ipGeolocationHostView.OnViewVisible(); + + ContentControlApplication.Content = _ipGeolocationHostView; + break; + case ApplicationName.SubnetCalculator: + if (_subnetCalculatorHostView == null) + _subnetCalculatorHostView = new SubnetCalculatorHostView(); + else + _subnetCalculatorHostView.OnViewVisible(); + + ContentControlApplication.Content = _subnetCalculatorHostView; + break; + case ApplicationName.BitCalculator: + if (_bitCalculatorView == null) + _bitCalculatorView = new BitCalculatorView(); + else + _bitCalculatorView.OnViewVisible(); + + ContentControlApplication.Content = _bitCalculatorView; + break; + case ApplicationName.Lookup: + if (_lookupHostView == null) + _lookupHostView = new LookupHostView(); + else + _lookupHostView.OnViewVisible(); + + ContentControlApplication.Content = _lookupHostView; + break; + case ApplicationName.Connections: + if (_connectionsView == null) + _connectionsView = new ConnectionsView(); + else + _connectionsView.OnViewVisible(); + + ContentControlApplication.Content = _connectionsView; + break; + case ApplicationName.Listeners: + if (_listenersView == null) + _listenersView = new ListenersView(); + else + _listenersView.OnViewVisible(); + + ContentControlApplication.Content = _listenersView; + break; + case ApplicationName.NeighborTable: + if (_neighborTableView == null) + _neighborTableView = new NeighborTableView(); + else + _neighborTableView.OnViewVisible(); + + ContentControlApplication.Content = _neighborTableView; + break; + default: + Log.Error("Cannot show unknown application view: " + name); + break; } + } - private async Task CloseSettings() - { - ShowSettingsView = false; - - // Enable/disable tray icon - if (!_isInTray) - { - if (SettingsManager.Current.TrayIcon_AlwaysShowIcon && _notifyIcon == null) - InitNotifyIcon(); + private void OnApplicationViewHide(ApplicationName name) + { + switch (name) + { + case ApplicationName.Dashboard: + _dashboardView?.OnViewHide(); + break; + case ApplicationName.NetworkInterface: + _networkInterfaceView?.OnViewHide(); + break; + case ApplicationName.WiFi: + _wiFiView?.OnViewHide(); + break; + case ApplicationName.IPScanner: + _ipScannerHostView?.OnViewHide(); + break; + case ApplicationName.PortScanner: + _portScannerHostView?.OnViewHide(); + break; + case ApplicationName.PingMonitor: + _pingMonitorHostView?.OnViewHide(); + break; + case ApplicationName.Traceroute: + _tracerouteHostView?.OnViewHide(); + break; + case ApplicationName.DNSLookup: + _dnsLookupHostView?.OnViewHide(); + break; + case ApplicationName.RemoteDesktop: + _remoteDesktopHostView?.OnViewHide(); + break; + case ApplicationName.PowerShell: + _powerShellHostView?.OnViewHide(); + break; + case ApplicationName.PuTTY: + _puttyHostView?.OnViewHide(); + break; + case ApplicationName.TigerVNC: + _tigerVNCHostView?.OnViewHide(); + break; + case ApplicationName.WebConsole: + _webConsoleHostView?.OnViewHide(); + break; + case ApplicationName.SNMP: + _snmpHostView?.OnViewHide(); + break; + case ApplicationName.SNTPLookup: + _sntpLookupHostView?.OnViewHide(); + break; + case ApplicationName.HostsFileEditor: + _hostsFileEditorView?.OnViewHide(); + break; + case ApplicationName.Firewall: + _firewallView?.OnViewHide(); + break; + case ApplicationName.DiscoveryProtocol: + _discoveryProtocolView?.OnViewHide(); + break; + case ApplicationName.WakeOnLAN: + _wakeOnLanView?.OnViewHide(); + break; + case ApplicationName.Whois: + _whoisHostView?.OnViewHide(); + break; + case ApplicationName.IPGeolocation: + _ipGeolocationHostView?.OnViewHide(); + break; + case ApplicationName.Lookup: + _lookupHostView?.OnViewHide(); + break; + case ApplicationName.SubnetCalculator: + _subnetCalculatorHostView?.OnViewHide(); + break; + case ApplicationName.BitCalculator: + _bitCalculatorView?.OnViewHide(); + break; + case ApplicationName.Connections: + _connectionsView?.OnViewHide(); + break; + case ApplicationName.Listeners: + _listenersView?.OnViewHide(); + break; + case ApplicationName.NeighborTable: + _neighborTableView?.OnViewHide(); + break; + default: + Log.Error("Cannot hide unknown application view: " + name); + break; + } + } - if (_notifyIcon != null) - _notifyIcon.Visible = SettingsManager.Current.TrayIcon_AlwaysShowIcon; + private void ClearSearchOnApplicationListMinimize() + { + if (ApplicationViewIsExpanded) + return; - MetroMainWindow.HideOverlay(); - } + if (ApplicationViewIsOpen && TextBoxApplicationSearchIsFocused) + return; - // Ask the user to restart (if he has changed the language) - if (_cultureCode != SettingsManager.Current.Localization_CultureCode) - { - ShowWindowAction(); + if (ApplicationViewIsOpen && ApplicationViewIsMouseOver) + return; - var settings = AppearanceManager.MetroDialog; + ApplicationSearch = string.Empty; - settings.AffirmativeButtonText = Localization.Resources.Strings.RestartNow; - settings.NegativeButtonText = Localization.Resources.Strings.OK; - settings.DefaultButtonFocus = MessageDialogResult.Affirmative; + // Scroll into view + ListViewApplication.ScrollIntoView(SelectedApplication); + } - ConfigurationManager.Current.FixAirspace = true; + private async void EventSystem_RedirectDataToApplicationEvent(object sender, EventArgs e) + { + if (e is not EventSystemRedirectArgs data) + return; + + // Try to find the application + var application = Applications.Cast().FirstOrDefault(x => x.Name == data.Application); + + // Show error message if the application was not found + if (application == null) + { + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + string.Format(Strings.CouldNotFindApplicationXXXMessage, + $"{data.Application}"), ChildWindowIcon.Error); + + return; + } + + // Change application view + SelectedApplication = application; + + if (string.IsNullOrEmpty(data.Args)) + return; + + // Crate a new tab / perform action + switch (data.Application) + { + case ApplicationName.Dashboard: + case ApplicationName.NetworkInterface: + case ApplicationName.WiFi: + break; + case ApplicationName.IPScanner: + _ipScannerHostView.AddTab(data.Args); + break; + case ApplicationName.PortScanner: + _portScannerHostView.AddTab(data.Args); + break; + case ApplicationName.PingMonitor: + _pingMonitorHostView.AddHost(data.Args); + break; + case ApplicationName.Traceroute: + _tracerouteHostView.AddTab(data.Args); + break; + case ApplicationName.DNSLookup: + _dnsLookupHostView.AddTab(data.Args); + break; + case ApplicationName.RemoteDesktop: + _remoteDesktopHostView.AddTab(data.Args); + break; + case ApplicationName.PowerShell: + _powerShellHostView.AddTab(data.Args); + break; + case ApplicationName.PuTTY: + _puttyHostView.AddTab(data.Args); + break; + case ApplicationName.TigerVNC: + _tigerVNCHostView.AddTab(data.Args); + break; + case ApplicationName.WebConsole: + break; + case ApplicationName.SNMP: + _snmpHostView.AddTab(data.Args); + break; + case ApplicationName.SNTPLookup: + case ApplicationName.HostsFileEditor: + case ApplicationName.Firewall: + case ApplicationName.DiscoveryProtocol: + case ApplicationName.WakeOnLAN: + case ApplicationName.Whois: + case ApplicationName.IPGeolocation: + case ApplicationName.SubnetCalculator: + case ApplicationName.BitCalculator: + case ApplicationName.Lookup: + case ApplicationName.Connections: + case ApplicationName.Listeners: + case ApplicationName.NeighborTable: + break; + default: + Log.Error($"Cannot redirect data to unknown application: {data.Application}"); + break; + } + } - if (await this.ShowMessageAsync(Localization.Resources.Strings.RestartRequired, Localization.Resources.Strings.RestartRequiredSettingsChangedMessage, MessageDialogStyle.AffirmativeAndNegative, settings) == MessageDialogResult.Affirmative) - { - RestartApplication(); - return; - } + /// + /// Disable copy, cut, paste because we cannot handle it properly in the TextBoxApplicationSearch. + /// + /// + /// + private void TextBoxApplicationSearch_OnPreviewExecuted(object sender, ExecutedRoutedEventArgs e) + { + // Disable copy, cut, paste + if (e.Command == ApplicationCommands.Copy || + e.Command == ApplicationCommands.Cut || + e.Command == ApplicationCommands.Paste) + e.Handled = true; + } - ConfigurationManager.Current.FixAirspace = false; - } + #endregion - // Change HotKeys - if (SettingsManager.HotKeysChanged) - { - UnregisterHotKeys(); - RegisterHotKeys(); + #region Run Command - SettingsManager.HotKeysChanged = false; - } + #region Variables - // Save the settings - /* Disabled (07.09.2021) - because settings are saved on app shutdown - if (SettingsManager.Current.SettingsChanged) - SettingsManager.Save(); - */ + public ICollectionView RunCommands + { + get; + private set + { + if (value == field) + return; - // Refresh the view - ChangeApplicationView(SelectedApplication.Name, true); + field = value; + OnPropertyChanged(); } + } - private void SettingsManager_PropertyChanged(object sender, PropertyChangedEventArgs e) + public RunCommandInfo SelectedRunCommand + { + get; + set { + if (value == field) + return; + field = value; + OnPropertyChanged(); } - #endregion + } - #region Profiles - private async Task LoadProfile(ProfileFileInfo info) + public string RunCommandSearch + { + get; + set { - if (info.IsEncrypted && !info.IsPasswordValid) - { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.MasterPassword - }; + if (value == field) + return; - var credentialsPasswordViewModel = new CredentialsPasswordViewModel(async instance => - { - await this.HideMetroDialogAsync(customDialog).ConfigureAwait(true); + field = value; - info.Password = instance.Password; + RefreshRunCommandsView(); - SwitchProfile(info); - }, async instance => - { - await this.HideMetroDialogAsync(customDialog).ConfigureAwait(false); + OnPropertyChanged(); + } + } - IsProfileFileLocked = true; - }); + #endregion - customDialog.Content = new CredentialsPasswordDialog - { - DataContext = credentialsPasswordViewModel - }; + #region ICommands & Actions - await this.ShowMetroDialogAsync(customDialog).ConfigureAwait(false); - } - else - { - SwitchProfile(info); - } - } + public ICommand OpenRunCommand => new RelayCommand(_ => OpenRunAction()); - private async Task SwitchProfile(ProfileFileInfo info) - { - try - { - ProfileManager.SwitchProfile(info); + private void OpenRunAction() + { + ConfigurationManager.OnDialogOpen(); - IsProfileFileLocked = false; - } - catch (System.Security.Cryptography.CryptographicException) - { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Localization.Resources.Strings.OK; + FlyoutRunCommandIsOpen = true; + } - ConfigurationManager.Current.FixAirspace = true; + public ICommand RunCommandDoCommand => new RelayCommand(_ => RunCommandDoAction()); - await this.ShowMessageAsync(Localization.Resources.Strings.WrongPassword, Localization.Resources.Strings.WrongPasswordDecryptionFailedMessage, MessageDialogStyle.Affirmative, settings); + private void RunCommandDoAction() + { + RunCommandDo(); + } - IsProfileFileLocked = true; + public ICommand RunCommandCloseCommand => new RelayCommand(_ => RunCommandCloseAction()); - ConfigurationManager.Current.FixAirspace = false; - } - catch - { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Localization.Resources.Strings.Migrate; - settings.NegativeButtonText = Localization.Resources.Strings.Cancel; - settings.DefaultButtonFocus = MessageDialogResult.Affirmative; + private void RunCommandCloseAction() + { + RunCommandFlyoutClose(); + } - ConfigurationManager.Current.FixAirspace = true; + #endregion - // ToDo: Improve Message + #region Methods - var result = await this.ShowMessageAsync(Localization.Resources.Strings.ProfileCouldNotBeLoaded, Localization.Resources.Strings.ProfileCouldNotBeLoadedMessage, MessageDialogStyle.AffirmativeAndNegative, settings); + private void SetRunCommandsView(RunCommandInfo selectedRunCommand = null) + { + RunCommands = new CollectionViewSource { Source = RunCommandManager.GetList() }.View; - ConfigurationManager.Current.FixAirspace = false; + RunCommands.Filter = o => + { + if (o is not RunCommandInfo info) + return false; - if(result == MessageDialogResult.Affirmative) - { - ExternalProcessStarter.RunProcess("powershell.exe", $"-NoLogo -NoProfile -ExecutionPolicy ByPass -File \"{Path.Combine(ConfigurationManager.Current.ExecutionPath, "Resources", "Migrate-Profiles.ps1")}\" -Path \"{ProfileManager.GetProfilesLocation()}\" -NETworkManagerPath \"{ConfigurationManager.Current.ApplicationFullName}\" -NETworkManagerVersion \"{AssemblyManager.Current.Version}\""); - CloseApplication(); - } - } - } + if (string.IsNullOrEmpty(RunCommandSearch)) + return true; - /// - /// Update the view when the loaded profile file changed - /// - /// - /// - private void ProfileManager_OnLoadedProfileFileChangedEvent(object sender, ProfileFileInfoArgs e) - { - _isProfileUpdating = true; + return info.TranslatedName.IndexOf(RunCommandSearch, StringComparison.OrdinalIgnoreCase) > -1 || + info.Name.IndexOf(RunCommandSearch, StringComparison.OrdinalIgnoreCase) > -1; + }; - SelectedProfileFile = ProfileFiles.SourceCollection.Cast().FirstOrDefault(x => x.Equals(e.ProfileFileInfo)); + if (selectedRunCommand != null) + SelectedRunCommand = RunCommands.Cast() + .FirstOrDefault(x => x.Name == selectedRunCommand.Name); - _isProfileUpdating = false; - } - #endregion + SelectedRunCommand ??= RunCommands.Cast().FirstOrDefault(); + } + + private void RefreshRunCommandsView() + { + SetRunCommandsView(SelectedRunCommand); + } - #region Handle WndProc messages (Single instance, handle HotKeys) - private HwndSource _hwndSoure; + /// + /// Execute the selected run command. + /// + private void RunCommandDo() + { + // Do nothing if no command is selected + if (SelectedRunCommand == null) + return; - // This is called after MainWindow() and before OnContentRendered() --> to register hotkeys... - protected override void OnSourceInitialized(EventArgs e) + // Do the command + switch (SelectedRunCommand.Type) { - base.OnSourceInitialized(e); + // Redirect to application + case RunCommandType.Application: + if (SettingsViewIsOpen) + CloseSettings(); - _hwndSoure = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle); + var applicationName = (ApplicationName)Enum.Parse(typeof(ApplicationName), SelectedRunCommand.Name); + EventSystem.RedirectToApplication(applicationName, string.Empty); + break; + // Redirect to settings + case RunCommandType.Setting: + EventSystem.RedirectToSettings(); + break; + } - _hwndSoure?.AddHook(HwndHook); + // Close the flyout + RunCommandFlyoutClose(true); + } - RegisterHotKeys(); - } + /// + /// Close the run command flyout and clear the search. + /// + private void RunCommandFlyoutClose(bool clearSearch = false) + { + if (!FlyoutRunCommandIsOpen) + return; - [DebuggerStepThrough] - private IntPtr HwndHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) - { - // Single instance or Hotkey --> Show window - if (msg == SingleInstance.WM_SHOWME || msg == WmHotkey && wParam.ToInt32() == 1) - { - ShowWindowAction(); - handled = true; - } + FlyoutRunCommandIsOpen = false; - return IntPtr.Zero; - } - #endregion + ConfigurationManager.OnDialogClose(); - #region Update check - private void CheckForUpdates() - { - var updater = new Updater(); + // Clear the search + if (clearSearch) + RunCommandSearch = string.Empty; + } - updater.UpdateAvailable += Updater_UpdateAvailable; - updater.Error += Updater_Error; - updater.CheckOnGitHub(Properties.Resources.NETworkManager_GitHub_User, Properties.Resources.NETworkManager_GitHub_Repo, AssemblyManager.Current.Version); - } + #endregion + + #region Events + + private void ListViewRunCommand_OnPreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e) + { + RunCommandDo(); + } + + private void FlyoutRunCommand_IsKeyboardFocusWithinChanged(object sender, DependencyPropertyChangedEventArgs e) + { + // Close flyout if the focus is lost. + if (e.NewValue is not false) + return; - private static void Updater_Error(object sender, EventArgs e) + RunCommandFlyoutClose(); + } + + #endregion + + #endregion + + #region Settings + + private void OpenSettings() + { + OnApplicationViewHide(SelectedApplication.Name); + + if (_settingsView == null) { - // Log + _settingsView = new SettingsView(); + ContentControlSettings.Content = _settingsView; } - - private void Updater_UpdateAvailable(object sender, UpdateAvailableArgs e) + else { - IsUpdateAvailable = true; + _settingsView.OnViewVisible(); } - #endregion - #region HotKeys (Register / Unregister) - [DllImport("user32.dll")] - private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk); - [DllImport("user32.dll")] - private static extern bool UnregisterHotKey(IntPtr hWnd, int id); + _settingsView.ChangeSettingsView(SelectedApplication.Name); - // WM_HOTKEY - private const int WmHotkey = 0x0312; + // Show the view (this will hide other content) + SettingsViewIsOpen = true; + } - /* ID | Command - * ---|------------------- - * 1 | ShowWindowAction() - */ + private void EventSystem_RedirectToSettingsEvent(object sender, EventArgs e) + { + OpenSettings(); + } - private readonly List _registeredHotKeys = new List(); + private void CloseSettings() + { + SettingsViewIsOpen = false; + + _settingsView.OnViewHide(); - private void RegisterHotKeys() + // Change HotKeys + if (SettingsManager.HotKeysChanged) { - if (!SettingsManager.Current.HotKey_ShowWindowEnabled) - return; + UnregisterHotKeys(); + RegisterHotKeys(); - RegisterHotKey(new WindowInteropHelper(this).Handle, 1, SettingsManager.Current.HotKey_ShowWindowModifier, SettingsManager.Current.HotKey_ShowWindowKey); - _registeredHotKeys.Add(1); + SettingsManager.HotKeysChanged = false; } - private void UnregisterHotKeys() - { - // Unregister all registred keys - foreach (var i in _registeredHotKeys) - UnregisterHotKey(new WindowInteropHelper(this).Handle, i); + // Refresh the application view + OnApplicationViewVisible(SelectedApplication.Name); + } - // Clear list - _registeredHotKeys.Clear(); - } - #endregion + #endregion + + #region Profiles + + private void LoadProfiles() + { + _isProfileFilesLoading = true; + ProfileFiles = new CollectionViewSource { Source = ProfileManager.ProfileFiles }.View; + ProfileFiles.SortDescriptions.Add( + new SortDescription(nameof(ProfileFileInfo.Name), ListSortDirection.Ascending)); + _isProfileFilesLoading = false; + + ProfileManager.OnLoadedProfileFileChangedEvent += ProfileManager_OnLoadedProfileFileChangedEvent; + ProfileManager.OnProfileMigrationStarted += ProfileManager_OnProfileMigrationStarted; + ProfileManager.OnProfileMigrationCompleted += ProfileManager_OnProfileMigrationCompleted; + + SelectedProfileFile = ProfileFiles.SourceCollection.Cast() + .FirstOrDefault(x => x.Name == SettingsManager.Current.Profiles_LastSelected); + SelectedProfileFile ??= ProfileFiles.SourceCollection.Cast().FirstOrDefault(); + } - #region NotifyIcon - private void InitNotifyIcon() + private async void LoadProfile(ProfileFileInfo info, bool showWrongPassword = false) + { + // Disable profile management while switching profiles + ConfigurationManager.Current.ProfileManagerIsEnabled = false; + ConfigurationManager.Current.ProfileManagerErrorMessage = string.Empty; + + if (info.IsEncrypted && !info.IsPasswordValid) { - _notifyIcon = new NotifyIcon(); + var childWindow = new CredentialsPasswordProfileFileChildWindow(); - // Get the application icon for the tray - using (var iconStream = System.Windows.Application.GetResourceStream(new Uri("pack://application:,,,/NETworkManager.ico"))?.Stream) + var viewModel = new CredentialsPasswordProfileFileViewModel(instance => { - if (iconStream != null) - _notifyIcon.Icon = new Icon(iconStream); - } + childWindow.IsOpen = false; - _notifyIcon.Text = Title; - _notifyIcon.Click += NotifyIcon_Click; - _notifyIcon.MouseDown += NotifyIcon_MouseDown; - _notifyIcon.Visible = SettingsManager.Current.TrayIcon_AlwaysShowIcon; - } + ConfigurationManager.Current.IsChildWindowOpen = false; - private void NotifyIcon_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) - { - if (e.Button != MouseButtons.Right) - return; + ConfigurationManager.OnDialogClose(); - var trayMenu = (ContextMenu)FindResource("ContextMenuNotifyIcon"); + info.Password = instance.Password; - trayMenu.IsOpen = true; - } + SwitchProfile(info); + }, _ => + { + childWindow.IsOpen = false; - private void NotifyIcon_Click(object sender, EventArgs e) - { - System.Windows.Forms.MouseEventArgs mouse = (System.Windows.Forms.MouseEventArgs)e; + ConfigurationManager.Current.IsChildWindowOpen = false; - if (mouse.Button != MouseButtons.Left) - return; + ConfigurationManager.OnDialogClose(); + + ProfileManager.Unload(); + }, info.Name, showWrongPassword); - if (OpenStatusWindowCommand.CanExecute(null)) - OpenStatusWindowCommand.Execute(null); + childWindow.Title = Strings.UnlockProfileFile; + + childWindow.DataContext = viewModel; + + ConfigurationManager.OnDialogOpen(); + + ConfigurationManager.Current.IsChildWindowOpen = true; + + await this.ShowChildWindowAsync(childWindow); + } + else + { + SwitchProfile(info); } + } - private void MetroWindowMain_StateChanged(object sender, EventArgs e) + private async void SwitchProfile(ProfileFileInfo info) + { + try { - if (WindowState != WindowState.Minimized) - return; + ProfileManager.Switch(info); - if (SettingsManager.Current.Window_MinimizeToTrayInsteadOfTaskbar) - HideWindowToTray(); - } + // Enable profile management after successfully loading the profiles + ConfigurationManager.Current.ProfileManagerShowUnlock = false; + ConfigurationManager.Current.ProfileManagerIsEnabled = true; - private void ContextMenu_Opened(object sender, RoutedEventArgs e) + OnProfilesLoaded(SelectedApplication.Name); + } + catch (CryptographicException) { - if (sender is ContextMenu menu) - menu.DataContext = this; + // Wrong password, try again... + LoadProfile(info, true); } - - private void HideWindowToTray() + catch (Exception ex) { - if (_notifyIcon == null) - InitNotifyIcon(); + ConfigurationManager.Current.ProfileManagerErrorMessage = + Strings.ProfileFileCouldNotBeLoaded; - _isInTray = true; + ConfigurationManager.OnDialogOpen(); - _notifyIcon.Visible = true; + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.ProfileFileCouldNotBeLoaded, + string.Format(Strings.ProfileFileCouldNotBeLoadedMessage, ex.Message), ChildWindowIcon.Error); - Hide(); + ConfigurationManager.OnDialogClose(); } + } - private void ShowWindowFromTray() + /// + /// Called after profiles are loaded (e.g. to load dynamic profiles once the profile file is decrypted). + /// + /// Name of the currently selected application, used to perform application-specific actions after loading. + private void OnProfilesLoaded(ApplicationName name) + { + /* + switch (name) { - _isInTray = false; + case ApplicationName.XXX: + // Do stuff... + break; + } + */ + } - Show(); + /// + /// Update the view when the loaded profile file changed + /// + /// + /// + private void ProfileManager_OnLoadedProfileFileChangedEvent(object sender, ProfileFileInfoArgs e) + { + _isProfileFileUpdating = e.ProfileFileUpdating; - _notifyIcon.Visible = SettingsManager.Current.TrayIcon_AlwaysShowIcon; - } + SelectedProfileFile = ProfileFiles.SourceCollection.Cast() + .FirstOrDefault(x => x.Equals(e.ProfileFileInfo)); - private void BringWindowToFront() - { - if (WindowState == WindowState.Minimized) - WindowState = WindowState.Normal; + _isProfileFileUpdating = false; + } - Activate(); - } - #endregion + private void ProfileManager_OnProfileMigrationCompleted(object sender, EventArgs e) + { + _isProfileFileUpdating = false; + } - #region ICommands & Actions - public ICommand OpenStatusWindowCommand => new RelayCommand(p => OpenStatusWindowAction()); + private void ProfileManager_OnProfileMigrationStarted(object sender, EventArgs e) + { + _isProfileFileUpdating = true; + } - private void OpenStatusWindowAction() - { - OpenStatusWindow(true); - } + #endregion - public ICommand OpenWebsiteCommand => new RelayCommand(OpenWebsiteAction); + #region Update check - private static void OpenWebsiteAction(object url) - { - ExternalProcessStarter.OpenUrl((string)url); - } + private void CheckForUpdates() + { + var updater = new Updater(); - public ICommand OpenDocumentationCommand - { - get { return new RelayCommand(p => OpenDocumentationAction()); } - } + updater.UpdateAvailable += Updater_UpdateAvailable; - private void OpenDocumentationAction() - { - DocumentationManager.OpenDocumentation(ShowSettingsView ? DocumentationIdentifier.Default : DocumentationManager.GetIdentifierByAppliactionName(SelectedApplication.Name)); - } + updater.CheckOnGitHub(Properties.Resources.NETworkManager_GitHub_User, + Properties.Resources.NETworkManager_GitHub_Repo, AssemblyManager.Current.Version, + SettingsManager.Current.Update_CheckForPreReleases); + } - public ICommand OpenApplicationListCommand - { - get { return new RelayCommand(p => OpenApplicationListAction()); } - } + private void Updater_UpdateAvailable(object sender, UpdateAvailableArgs e) + { + UpdateReleaseUrl = e.Release.Prerelease + ? e.Release.HtmlUrl + : Properties.Resources.NETworkManager_LatestReleaseUrl; + IsUpdateAvailable = true; + } - private void OpenApplicationListAction() - { - IsApplicationListOpen = true; - TextBoxSearch.Focus(); - } + #endregion - public ICommand UnlockProfileCommand - { - get { return new RelayCommand(p => UnlockProfileAction()); } - } + #region Handle WndProc messages (Single instance, handle HotKeys, handle window size events) - private void UnlockProfileAction() - { - LoadProfile(SelectedProfileFile); - } + private HwndSource _hwndSource; - public ICommand OpenSettingsCommand - { - get { return new RelayCommand(p => OpenSettingsAction()); } - } + private const int WmExitSizeMove = 0x232; + private const int WmSysCommand = 0x0112; + private const int ScMaximize = 0xF030; + private const int ScRestore = 0xF120; - private void OpenSettingsAction() - { - OpenSettings(); - } + // This is called after MainWindow() and before OnContentRendered() --> to register hotkeys... + protected override void OnSourceInitialized(EventArgs e) + { + base.OnSourceInitialized(e); - public ICommand CloseSettingsCommand - { - get { return new RelayCommand(p => CloseSettingsAction()); } - } + _hwndSource = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle); + _hwndSource?.AddHook(HwndHook); - private void CloseSettingsAction() - { - CloseSettings(); - } + RegisterHotKeys(); + } - public ICommand ShowWindowCommand + [DebuggerStepThrough] + private IntPtr HwndHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) + { + // Single instance or Hotkey --> Show window + if (msg == SingleInstance.WM_SHOWME || (msg == WmHotkey && wParam.ToInt32() == 1)) { - get { return new RelayCommand(p => ShowWindowAction()); } + ShowWindow(); + handled = true; + + return IntPtr.Zero; } - private void ShowWindowAction() + // Window size events + switch (msg) { - if (_isInTray) - ShowWindowFromTray(); + // Handle window resize and move events + case WmExitSizeMove: + UpdateOnWindowResize(); + break; - if (!IsActive) - BringWindowToFront(); - } + // Handle system commands (like maximize and restore) + case WmSysCommand: - public ICommand CloseApplicationCommand - { - get { return new RelayCommand(p => CloseApplicationAction()); } - } + switch (wParam.ToInt32()) + { + // Window is maximized + case ScMaximize: + // Window is restored (back to normal size from maximized state) + case ScRestore: + UpdateOnWindowResize(); + break; + } - private void CloseApplicationAction() - { - CloseApplication(); + break; } - public void CloseApplication() + handled = false; + + return IntPtr.Zero; + } + + private void UpdateOnWindowResize() + { + foreach (var tabablzControl in VisualTreeHelper.FindVisualChildren(this)) { - _closeApplication = true; + // Skip if no items + if (tabablzControl.Items.Count == 0) + continue; - // Make it thread safe when it's called inside a dialog - System.Windows.Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(delegate + foreach (var item in tabablzControl.Items.OfType()) { - Close(); - })); + if (item.View is RemoteDesktopControl control) + control.UpdateOnWindowResize(); + } } + } - public void RestartApplication(bool asAdmin = false) - { - ExternalProcessStarter.RunProcess(ConfigurationManager.Current.ApplicationFullName, $"{CommandLineManager.GetParameterWithSplitIdentifier(CommandLineManager.ParameterRestartPid)}{Process.GetCurrentProcess().Id} {CommandLineManager.GetParameterWithSplitIdentifier(CommandLineManager.ParameterApplication)}{_currentApplicationViewName}", asAdmin); + #endregion - CloseApplication(); - } + #region Global HotKeys - public ICommand ApplicationListMouseEnterCommand - { - get { return new RelayCommand(p => ApplicationListMouseEnterAction()); } - } + [DllImport("user32.dll")] + private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk); - private void ApplicationListMouseEnterAction() - { - IsMouseOverApplicationList = true; - } + [DllImport("user32.dll")] - public ICommand ApplicationListMouseLeaveCommand - { - get { return new RelayCommand(p => ApplicationListMouseLeaveAction()); } - } + private static extern bool UnregisterHotKey(IntPtr hWnd, int id); - private void ApplicationListMouseLeaveAction() - { - // Don't minmize the list, if the user has accidently moved the mouse while searching - if (!IsTextBoxSearchFocused) - IsApplicationListOpen = false; + // WM_HOTKEY + private const int WmHotkey = 0x0312; - IsMouseOverApplicationList = false; - } + /* ID | Command + * ---|------------------- + * 1 | ShowWindow() + */ - public ICommand TextBoxSearchGotKeyboardFocusCommand - { - get { return new RelayCommand(p => TextBoxSearchGotKeyboardFocusAction()); } - } + private readonly List _registeredHotKeys = []; - private void TextBoxSearchGotKeyboardFocusAction() + private void RegisterHotKeys() + { + if (SettingsManager.Current.HotKey_ShowWindowEnabled) { - IsTextBoxSearchFocused = true; + RegisterHotKey(new WindowInteropHelper(this).Handle, 1, SettingsManager.Current.HotKey_ShowWindowModifier, + SettingsManager.Current.HotKey_ShowWindowKey); + _registeredHotKeys.Add(1); } + } + + private void UnregisterHotKeys() + { + // Unregister all registered keys + foreach (var i in _registeredHotKeys) + UnregisterHotKey(new WindowInteropHelper(this).Handle, i); + + // Clear list + _registeredHotKeys.Clear(); + } + + #endregion + + #region NotifyIcon + + private void InitNotifyIcon() + { + _notifyIcon = new NotifyIcon(); - public ICommand TextBoxSearchLostKeyboardFocusCommand + // Get the application icon for the tray + using (var iconStream = Application + .GetResourceStream(new Uri("pack://application:,,,/NETworkManager.ico"))?.Stream) { - get { return new RelayCommand(p => TextBoxSearchLostKeyboardFocusAction()); } + if (iconStream != null) + _notifyIcon.Icon = new Icon(iconStream); } - private void TextBoxSearchLostKeyboardFocusAction() - { - if (!IsMouseOverApplicationList) - IsApplicationListOpen = false; + _notifyIcon.Text = Title; + _notifyIcon.Click += NotifyIcon_Click; + _notifyIcon.MouseDown += NotifyIcon_MouseDown; + _notifyIcon.Visible = true; + } - IsTextBoxSearchFocused = false; - } + private void NotifyIcon_MouseDown(object sender, MouseEventArgs e) + { + if (e.Button != MouseButtons.Right) + return; + + var trayMenu = (ContextMenu)FindResource("ContextMenuNotifyIcon"); + + trayMenu.IsOpen = true; + } + + private void NotifyIcon_Click(object sender, EventArgs e) + { + var mouse = (MouseEventArgs)e; + + if (mouse.Button != MouseButtons.Left) + return; + + if (OpenStatusWindowCommand.CanExecute(null)) + OpenStatusWindowCommand.Execute(null); + } + + private void MetroWindowMain_StateChanged(object sender, EventArgs e) + { + if (WindowState != WindowState.Minimized) + return; + + if (SettingsManager.Current.Window_MinimizeToTrayInsteadOfTaskbar) + HideWindowToTray(); + } + + private void ContextMenu_Opened(object sender, RoutedEventArgs e) + { + if (sender is ContextMenu menu) + menu.DataContext = this; + } + + #endregion + + #region ICommands & Actions + + public ICommand OpenStatusWindowCommand => new RelayCommand(_ => OpenStatusWindowAction()); + + private void OpenStatusWindowAction() + { + OpenStatusWindow(); + } + + public ICommand RestartApplicationCommand => new RelayCommand(_ => RestartApplicationAction()); + + private void RestartApplicationAction() + { + RestartApplication(); + } + + public ICommand OpenWebsiteCommand => new RelayCommand(OpenWebsiteAction); + + private static void OpenWebsiteAction(object url) + { + ExternalProcessStarter.OpenUrl((string)url); + } + + public ICommand OpenDocumentationCommand => new RelayCommand(_ => OpenDocumentationAction()); + + private void OpenDocumentationAction() + { + DocumentationManager.OpenDocumentation(SettingsViewIsOpen + ? _settingsView.GetDocumentationIdentifier() + : DocumentationManager.GetIdentifierByApplicationName(SelectedApplication.Name)); + } + + public ICommand OpenApplicationListCommand => new RelayCommand(_ => OpenApplicationListAction()); + + private void OpenApplicationListAction() + { + ApplicationViewIsOpen = true; + TextBoxApplicationSearch.Focus(); + } + + public ICommand UnlockProfileCommand => new RelayCommand(_ => UnlockProfileAction()); + + private void UnlockProfileAction() + { + LoadProfile(SelectedProfileFile); + } + + public ICommand OpenSettingsCommand => new RelayCommand(_ => OpenSettingsAction()); + + private void OpenSettingsAction() + { + OpenSettings(); + } + + public ICommand OpenSettingsFromTrayCommand => new RelayCommand(_ => OpenSettingsFromTrayAction()); + + private void OpenSettingsFromTrayAction() + { + // Bring window to front + ShowWindow(); + + OpenSettings(); + } + + public ICommand CloseSettingsCommand => new RelayCommand(_ => CloseSettingsAction()); + + private void CloseSettingsAction() + { + CloseSettings(); + } + + public ICommand ShowWindowCommand => new RelayCommand(_ => ShowWindowAction()); - public ICommand ClearSearchCommand + private void ShowWindowAction() + { + ShowWindow(); + } + + public ICommand CloseApplicationCommand => new RelayCommand(_ => CloseApplicationAction()); + + private void CloseApplicationAction() + { + CloseApplication(); + } + + private void CloseApplication() + { + _isClosing = true; + + // Make it thread safe when it's called inside a dialog + Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(Close)); + } + + public void RestartApplication(bool asAdmin = false) + { + ExternalProcessStarter.RunProcess(ConfigurationManager.Current.ApplicationFullName, + $"{CommandLineManager.GetParameterWithSplitIdentifier(CommandLineManager.ParameterRestartPid)}{Environment.ProcessId} {CommandLineManager.GetParameterWithSplitIdentifier(CommandLineManager.ParameterApplication)}{SelectedApplication.Name}", + asAdmin); + + CloseApplication(); + } + + public ICommand ApplicationListMouseEnterCommand => new RelayCommand(_ => ApplicationListMouseEnterAction()); + + private void ApplicationListMouseEnterAction() + { + ApplicationViewIsMouseOver = true; + } + + public ICommand ApplicationListMouseLeaveCommand => new RelayCommand(_ => ApplicationListMouseLeaveAction()); + + private void ApplicationListMouseLeaveAction() + { + // Don't minimize the list, if the user has accidentally moved the mouse while searching + if (!TextBoxApplicationSearchIsFocused) + ApplicationViewIsOpen = false; + + ApplicationViewIsMouseOver = false; + } + + public ICommand TextBoxSearchGotFocusCommand => new RelayCommand(_ => TextBoxSearchGotFocusAction()); + + private void TextBoxSearchGotFocusAction() + { + TextBoxApplicationSearchIsFocused = true; + } + + public ICommand TextBoxSearchLostFocusCommand => new RelayCommand(_ => TextBoxSearchLostFocusAction()); + + private void TextBoxSearchLostFocusAction() + { + if (!ApplicationViewIsMouseOver) + ApplicationViewIsOpen = false; + + TextBoxApplicationSearchIsFocused = false; + } + + public ICommand ClearSearchCommand => new RelayCommand(_ => ClearSearchAction()); + + private void ClearSearchAction() + { + ApplicationSearch = string.Empty; + } + + #endregion + + #region Methods + + private void ShowWindow() + { + if (_isInTray) + ShowWindowFromTray(); + + if (!IsActive) + BringWindowToFront(); + } + + private void HideWindowToTray() + { + if (_notifyIcon == null) + InitNotifyIcon(); + + _isInTray = true; + + if (_notifyIcon != null) + _notifyIcon.Visible = true; + + Hide(); + } + + private void ShowWindowFromTray() + { + _isInTray = false; + + Show(); + + _notifyIcon.Visible = SettingsManager.Current.TrayIcon_AlwaysShowIcon; + } + + private void BringWindowToFront() + { + if (WindowState == WindowState.Minimized) + WindowState = WindowState.Normal; + + Activate(); + } + + private void ConfigureDNSServer() + { + Log.Info("Configure application DNS servers..."); + + DNSClientSettings dnsSettings = new(); + + if (SettingsManager.Current.Network_UseCustomDNSServer) { - get { return new RelayCommand(p => ClearSearchAction()); } - } + if (!string.IsNullOrEmpty(SettingsManager.Current.Network_CustomDNSServer)) + { + Log.Info($"Use custom DNS servers ({SettingsManager.Current.Network_CustomDNSServer})..."); + + List<(string Server, int Port)> dnsServers = SettingsManager.Current.Network_CustomDNSServer.Split(";") + .Select(dnsServer => (dnsServer, 53)) + .ToList(); - private void ClearSearchAction() + dnsSettings.UseCustomDNSServers = true; + dnsSettings.DNSServers = dnsServers; + } + else + { + Log.Info( + $"Custom DNS servers could not be set (Setting \"{nameof(SettingsManager.Current.Network_CustomDNSServer)}\" has value \"{SettingsManager.Current.Network_CustomDNSServer}\")! Fallback to Windows default DNS servers..."); + } + } + else { - Search = string.Empty; + Log.Info("Use Windows default DNS servers..."); } - #endregion - #region Status window - private void OpenStatusWindow(bool activate) + DNSClient.GetInstance().Configure(dnsSettings); + } + + #endregion + + #region Status window + + private void OpenStatusWindow(bool enableCloseTimer = false) + { + _statusWindow.ShowWindow(enableCloseTimer); + } + + private async void OnNetworkHasChanged() + { + if (_isNetworkChanging) + return; + + _isNetworkChanging = true; + + // Wait, because the event may be triggered several times. + await Task.Delay(GlobalStaticConfiguration.NetworkChangeDetectionDelay); + + Log.Info("Network availability or address has changed!"); + + // Update DNS server if network changed + if (!SettingsManager.Current.Network_UseCustomDNSServer) { - _statusWindow.ShowWindow(activate); + Log.Info("Update Windows default DNS servers..."); + DNSClient.GetInstance().UpdateWindowsDNSSever(); } - private void OnNetworkHasChanged() + // Show status window on network change + if (SettingsManager.Current.Status_ShowWindowOnNetworkChange) { - if (!SettingsManager.Current.Status_ShowWindowOnNetworkChange) - return; - - Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(delegate + await Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(delegate { - OpenStatusWindow(false); + OpenStatusWindow(true); })); } - #endregion - #region Bugfixes - private void ScrollViewer_ManipulationBoundaryFeedback(object sender, ManipulationBoundaryFeedbackEventArgs e) - { - e.Handled = true; + _isNetworkChanging = false; + } + + #endregion + + #region Focus embedded window + + private void MetroMainWindow_Activated(object sender, EventArgs e) + { + FocusEmbeddedWindow(); + } + + private async void FocusEmbeddedWindow() + { + // Delay the focus to prevent blocking the ui + // Detect if window is resizing + do + { + await Task.Delay(250); + } while (Control.MouseButtons == MouseButtons.Left); + + /* Don't continue if + - Application is not set + - Settings are opened + - Profile file DropDown is opened + - Application search TextBox is opened + - Profile filter (tags) popup is opened + - Dialog over an embedded window is opened (FixAirspace) + */ + if (SelectedApplication == null || + // MainWindow + SettingsViewIsOpen || + IsProfileFileDropDownOpened || + TextBoxApplicationSearchIsFocused || + // Global dialogs + ConfigurationManager.Current.IsProfileFilterPopupOpen || + ConfigurationManager.Current.FixAirspace) + return; + + // Switch by name + switch (SelectedApplication.Name) + { + case ApplicationName.PowerShell: + _powerShellHostView?.FocusEmbeddedWindow(); + break; + case ApplicationName.PuTTY: + _puttyHostView?.FocusEmbeddedWindow(); + break; } - #endregion } + + #endregion } diff --git a/Source/NETworkManager/NETworkManager.csproj b/Source/NETworkManager/NETworkManager.csproj index e05afd4dbe..cf003cb092 100644 --- a/Source/NETworkManager/NETworkManager.csproj +++ b/Source/NETworkManager/NETworkManager.csproj @@ -1,117 +1,162 @@  - - WinExe - net6.0-windows10.0.17763.0 - win10-x64 - false - sdk + + + WinExe NETworkManager NETworkManager - true - true - NETworkManager.App - NETworkManager.ico + net10.0-windows10.0.22621.0 + + win-x64;win-arm64 + win-x64 + x64 + false + sdk + true + true + NETworkManager.App + app.manifest + NETworkManager.ico false - BornToBeRoot - https://github.com/BornToBeRoot/NETworkManager - https://github.com/BornToBeRoot/NETworkManager - NETworkManager.txt - NETworkManager.ico - en - A powerful tool for managing networks and troubleshoot network problems! - x64 - - - - - - True - - - - True - - - - - - - - - - - - - - - - - - - - - - - - $(TargetDir)\AxMSTSCLib.dll - - - $(TargetDir)\MSTSCLib.dll - - - - - - - - - - - - - - - - - - - - - - - True - True - Resources.resx - - - - - PublicResXFileCodeGenerator - Resources.Designer.cs - - - - - - - - $(DefaultXamlRuntime) - - - $(DefaultXamlRuntime) - Designer - - - $(DefaultXamlRuntime) - - - $(DefaultXamlRuntime) - - - Designer - - - - - - \ No newline at end of file + false + BornToBeRoot + https://github.com/BornToBeRoot/NETworkManager + https://github.com/BornToBeRoot/NETworkManager + NETworkManager.txt + NETworkManager.ico + en + A powerful open-source tool for managing networks and troubleshooting network problems! + + + False + ../lib + ./lib + + + False + False + False + False + Info + + + + + + + + True + + + + + PreserveNewest + + + + + + + + + + + + + + + + + + + + + + + + + $(TargetDir)\lib\AxMSTSCLib.dll + + + $(TargetDir)\lib\MSTSCLib.dll + + + + + + + + RuntimeIdentifier;RuntimeIdentifiers;PlatformTarget;SelfContained + + + + + + + + + + + + + + + + + + + + + + + + + + + True + True + Resources.resx + + + + + PublicResXFileCodeGenerator + Resources.Designer.cs + + + + + MSBuild:Compile + Wpf + Designer + + + MSBuild:Compile + Wpf + Designer + + + MSBuild:Compile + Wpf + Designer + + + MSBuild:Compile + Wpf + Designer + + + MSBuild:Compile + Wpf + Designer + + + + + + diff --git a/Source/NETworkManager/NETworkManager.ico b/Source/NETworkManager/NETworkManager.ico index 54ace0e188..14917c41bb 100644 Binary files a/Source/NETworkManager/NETworkManager.ico and b/Source/NETworkManager/NETworkManager.ico differ diff --git a/Source/NETworkManager/NotificationManager.cs b/Source/NETworkManager/NotificationManager.cs new file mode 100644 index 0000000000..409202794d --- /dev/null +++ b/Source/NETworkManager/NotificationManager.cs @@ -0,0 +1,98 @@ +using MahApps.Metro.IconPacks; +using NETworkManager.Settings; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Media; +using System.Threading; +using System.Windows; + +namespace NETworkManager; + +/// +/// Shows and manages stackable notification popups. Follows the same pattern as +/// — callers pass display parameters; internals are hidden. +/// +public static class NotificationManager +{ + private static readonly List ActiveWindows = []; + + /// + /// Margin (in DIP) between the screen edges and between stacked notification windows. + /// + internal const double WindowMargin = 10.0; + + // Throttles the notification sound (see GlobalStaticConfiguration.NotificationSoundThrottle) + // so a burst of near-simultaneous status changes collapses into a single sound. + private static readonly Lock SoundLock = new(); + private static DateTime _lastSoundPlayed = DateTime.MinValue; + + /// + /// Shows a notification popup in the bottom-right corner of the primary screen. + /// Safe to call from any thread. + /// + /// The Material icon shown on the left of the popup. + /// The icon fill color (e.g. "Red" or "#badc58"). + /// The bold header text (e.g. the host title). + /// The gray subtext below the header (e.g. "Host is up"). + /// Seconds before the popup closes automatically. + public static void Show(PackIconMaterialKind iconKind, string iconColor, string title, string message, int closeTimeSeconds) + { + // A late ping callback during application shutdown may find no Application instance. + if (Application.Current is null) + return; + + Application.Current.Dispatcher.BeginInvoke(() => + { + var window = new NotificationWindow(iconKind, iconColor, title, message, closeTimeSeconds); + + window.Closed += (_, _) => + { + ActiveWindows.Remove(window); + RepositionAll(); + }; + + ActiveWindows.Add(window); + window.Show(); // triggers OnSourceInitialized → window positions itself + }); + } + + /// + /// Returns the combined height (including margins) of all windows stacked below the given + /// window, i.e. the vertical offset from the bottom edge at which it should be placed. + /// + internal static double GetStackOffset(NotificationWindow window) + { + return ActiveWindows.TakeWhile(w => !ReferenceEquals(w, window)).Sum(w => w.ActualHeight + WindowMargin); + } + + /// + /// Plays a notification sound, throttled so that a burst of near-simultaneous status changes + /// (e.g. many hosts going down at once) results in a single sound. Safe to call from any thread. + /// + /// The system sound to play. + public static void PlaySound(SystemSound sound) + { + lock (SoundLock) + { + var now = DateTime.UtcNow; + + if ((now - _lastSoundPlayed).TotalMilliseconds < GlobalStaticConfiguration.NotificationSoundThrottle) + return; + + _lastSoundPlayed = now; + } + + sound.Play(); + } + + /// + /// Repositions all active windows, e.g. after one closes or its height changes so the stack + /// stays bottom-anchored without gaps or overlap. + /// + internal static void RepositionAll() + { + foreach (var window in ActiveWindows) + window.Reposition(); + } +} diff --git a/Source/NETworkManager/NotificationWindow.xaml b/Source/NETworkManager/NotificationWindow.xaml new file mode 100644 index 0000000000..fba46904b6 --- /dev/null +++ b/Source/NETworkManager/NotificationWindow.xaml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/NETworkManager/NotificationWindow.xaml.cs b/Source/NETworkManager/NotificationWindow.xaml.cs new file mode 100644 index 0000000000..a638ec2615 --- /dev/null +++ b/Source/NETworkManager/NotificationWindow.xaml.cs @@ -0,0 +1,195 @@ +using MahApps.Metro.IconPacks; +using NETworkManager.Utilities; +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Forms; +using System.Windows.Input; +using System.Windows.Threading; + +namespace NETworkManager; + +/// +/// A generic, stackable notification popup shown in the bottom-right corner of the primary +/// screen. Contains no feature-specific knowledge — icon, color, title and message are all +/// supplied by the caller (via ). +/// +public partial class NotificationWindow : INotifyPropertyChanged +{ + #region PropertyChangedEventHandler + + public event PropertyChangedEventHandler PropertyChanged; + + private void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + + #endregion + + #region Variables + + private readonly DispatcherTimer _timer = new(DispatcherPriority.Render); + private readonly Stopwatch _stopwatch = new(); + + // Bound properties — all set once in the constructor, no change notifications needed. + // Note: the header property is named NotificationTitle (not Title) to avoid clashing with + // the inherited Window.Title property, which a "{Binding Title}" would otherwise resolve to. + public PackIconMaterialKind IconKind { get; } + public string IconColor { get; } + public string NotificationTitle { get; } + public string Message { get; } + + // Timestamp shown in the header — captured when the notification is created, which is the + // moment the status change occurred. + public string Time { get; } + + public double TimeMax { get; } + + public double TimeRemaining + { + get; + private set + { + if (Math.Abs(value - field) < 0.001) + return; + + field = value; + OnPropertyChanged(); + } + } + + // Command — initialized once in the constructor, not recreated on every binding access + public ICommand CloseCommand { get; } + + #endregion + + #region Constructor + + public NotificationWindow(PackIconMaterialKind iconKind, string iconColor, string title, string message, int closeTimeSeconds) + { + InitializeComponent(); + DataContext = this; + + IconKind = iconKind; + IconColor = iconColor; + NotificationTitle = title; + Message = message; + Time = DateTime.Now.ToString("HH:mm:ss"); + TimeMax = closeTimeSeconds; + TimeRemaining = closeTimeSeconds; + + CloseCommand = new RelayCommand(_ => CloseWindow()); + + // The window auto-sizes its height to the content (SizeToContent=Height), so when the + // message wraps to more lines the whole stack must re-anchor to the bottom edge. + SizeChanged += (_, _) => NotificationManager.RepositionAll(); + + _timer.Interval = TimeSpan.FromMilliseconds(33); + _timer.Tick += Timer_Tick; + } + + #endregion + + #region ICommands & Actions + + private void ShowMainWindow() + { + CloseWindow(); + + if (System.Windows.Application.Current.MainWindow is MainWindow mainWindow && + mainWindow.ShowWindowCommand.CanExecute(null)) + mainWindow.ShowWindowCommand.Execute(null); + } + + #endregion + + #region Methods + + /// + /// Called by when the stack changes (a sibling closes or + /// resizes) and this window may need to move. + /// + internal void Reposition() + { + ApplyPosition(); + } + + private void ApplyPosition() + { + if (Screen.PrimaryScreen == null) + return; + + var scale = System.Windows.Media.VisualTreeHelper.GetDpi(this).DpiScaleX; + var area = Screen.PrimaryScreen.WorkingArea; + + // Offset = total height (incl. margins) of all windows stacked below this one. Using the + // actual heights keeps variable-height popups (wrapped messages) bottom-anchored. + var offset = NotificationManager.GetStackOffset(this); + + Left = area.Right / scale - Width - NotificationManager.WindowMargin; + Top = area.Bottom / scale - ActualHeight - NotificationManager.WindowMargin - offset; + } + + private void CloseWindow() + { + _timer.Stop(); + _stopwatch.Stop(); + + Closing -= MetroWindow_Closing; + Close(); // fires Window.Closed → NotificationManager removes from stack and repositions + } + + #endregion + + #region Events + + // Lifecycle — the HWND exists here, so DPI is safe to read for positioning + protected override void OnSourceInitialized(EventArgs e) + { + base.OnSourceInitialized(e); + + ApplyPosition(); + + _stopwatch.Restart(); + _timer.Start(); + } + + // Clicking anywhere on the popup opens the main window. The close button handles its own + // mouse events, so clicking [×] does not bubble up here. + private void Root_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) + { + ShowMainWindow(); + } + + // Intercept Alt+F4 / OS close so the stack cleanup always runs through CloseWindow() + private void MetroWindow_Closing(object sender, CancelEventArgs e) + { + e.Cancel = true; + CloseWindow(); + } + + private async void Timer_Tick(object sender, EventArgs e) + { + // Use a local for the close decision — the TimeRemaining setter ignores sub-0.001 changes + // (to throttle the progress bar), so reading the property back could stay stuck at a tiny + // positive value and the window would never close. + var remaining = Math.Max(0.0, TimeMax - _stopwatch.Elapsed.TotalSeconds); + TimeRemaining = remaining; + + if (remaining > 0) + return; + + _timer.Stop(); + _stopwatch.Stop(); + + await Task.Delay(250); // let the bar visually reach zero before closing + + CloseWindow(); + } + + #endregion +} diff --git a/Source/NETworkManager/ProfileDialogManager.cs b/Source/NETworkManager/ProfileDialogManager.cs index 7d9965774f..f2e733c241 100644 --- a/Source/NETworkManager/ProfileDialogManager.cs +++ b/Source/NETworkManager/ProfileDialogManager.cs @@ -1,484 +1,797 @@ -using MahApps.Metro.Controls.Dialogs; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Models; +using NETworkManager.Models.Network; +using NETworkManager.Models.PuTTY; +using NETworkManager.Models.RemoteDesktop; using NETworkManager.Profiles; +using NETworkManager.Utilities; using NETworkManager.ViewModels; using NETworkManager.Views; +using System; using System.Collections.Generic; -using System.Diagnostics; using System.Security; using System.Threading.Tasks; using System.Windows; -namespace NETworkManager +namespace NETworkManager; + +public static class ProfileDialogManager { - public static class ProfileDialogManager + #region Methods to add and remove profile + + private static ProfileInfo ParseProfileInfo(ProfileViewModel instance) { - #region Variables - private static string DialogResourceKey = "LargeMetroDialog"; - #endregion + return new ProfileInfo + { + Name = instance.Name.Trim(), + Host = instance.Host.Trim(), + Description = instance.Description?.Trim(), + Group = instance.Group.Trim(), + TagsCollection = new ObservableSetCollection(instance.TagsCollection), + + // Network Interface + NetworkInterface_Enabled = instance.NetworkInterface_Enabled, + NetworkInterface_EnableStaticIPAddress = instance.NetworkInterface_EnableStaticIPAddress, + NetworkInterface_IPAddress = instance.NetworkInterface_IPAddress?.Trim(), + NetworkInterface_Gateway = instance.NetworkInterface_Gateway?.Trim(), + NetworkInterface_Subnetmask = instance.NetworkInterface_Subnetmask?.Trim(), + NetworkInterface_EnableStaticDNS = instance.NetworkInterface_EnableStaticDNS, + NetworkInterface_PrimaryDNSServer = instance.NetworkInterface_PrimaryDNSServer?.Trim(), + NetworkInterface_SecondaryDNSServer = instance.NetworkInterface_SecondaryDNSServer?.Trim(), + + // IP Scanner + IPScanner_Enabled = instance.IPScanner_Enabled, + IPScanner_InheritHost = instance.IPScanner_InheritHost, + IPScanner_HostOrIPRange = instance.IPScanner_InheritHost + ? instance.Host?.Trim() + : instance.IPScanner_HostOrIPRange?.Trim(), + + // Port Scanner + PortScanner_Enabled = instance.PortScanner_Enabled, + PortScanner_InheritHost = instance.PortScanner_InheritHost, + PortScanner_Host = instance.PortScanner_InheritHost + ? instance.Host?.Trim() + : instance.PortScanner_Host?.Trim(), + PortScanner_Ports = instance.PortScanner_Ports?.Trim(), + + // Ping Monitor + PingMonitor_Enabled = instance.PingMonitor_Enabled, + PingMonitor_InheritHost = instance.PingMonitor_InheritHost, + PingMonitor_Host = instance.PingMonitor_InheritHost + ? instance.Host?.Trim() + : instance.PingMonitor_Host?.Trim(), + + // Traceroute + Traceroute_Enabled = instance.Traceroute_Enabled, + Traceroute_InheritHost = instance.Traceroute_InheritHost, + Traceroute_Host = + instance.Traceroute_InheritHost ? instance.Host?.Trim() : instance.Traceroute_Host?.Trim(), + + // DNS Lookup + DNSLookup_Enabled = instance.DNSLookup_Enabled, + DNSLookup_InheritHost = instance.Traceroute_InheritHost, + DNSLookup_Host = instance.DNSLookup_InheritHost ? instance.Host?.Trim() : instance.DNSLookup_Host?.Trim(), + + // Remote Desktop + RemoteDesktop_Enabled = instance.RemoteDesktop_Enabled, + RemoteDesktop_InheritHost = instance.RemoteDesktop_InheritHost, + RemoteDesktop_Host = instance.RemoteDesktop_InheritHost + ? instance.Host?.Trim() + : instance.RemoteDesktop_Host?.Trim(), + RemoteDesktop_UseCredentials = instance.RemoteDesktop_UseCredentials, + RemoteDesktop_Username = + instance.RemoteDesktop_UseCredentials + ? instance.RemoteDesktop_Username + : string.Empty, // Remove sensitive info on disable + RemoteDesktop_Domain = + instance.RemoteDesktop_UseCredentials + ? instance.RemoteDesktop_Domain + : string.Empty, // Remove sensitive info on disable + RemoteDesktop_Password = instance.RemoteDesktop_UseCredentials + ? instance.RemoteDesktop_Password + : new SecureString(), // Remove sensitive info on disable + RemoteDesktop_AdminSession = instance.RemoteDesktop_AdminSession, + RemoteDesktop_OverrideDisplay = instance.RemoteDesktop_OverrideDisplay, + RemoteDesktop_AdjustScreenAutomatically = instance.RemoteDesktop_AdjustScreenAutomatically, + RemoteDesktop_UseCurrentViewSize = instance.RemoteDesktop_UseCurrentViewSize, + RemoteDesktop_UseFixedScreenSize = instance.RemoteDesktop_UseFixedScreenSize, + RemoteDesktop_ScreenWidth = instance.RemoteDesktop_ScreenWidth, + RemoteDesktop_ScreenHeight = instance.RemoteDesktop_ScreenHeight, + RemoteDesktop_UseCustomScreenSize = instance.RemoteDesktop_UseCustomScreenSize, + RemoteDesktop_CustomScreenWidth = int.Parse(instance.RemoteDesktop_CustomScreenWidth), + RemoteDesktop_CustomScreenHeight = int.Parse(instance.RemoteDesktop_CustomScreenHeight), + RemoteDesktop_OverrideColorDepth = instance.RemoteDesktop_OverrideColorDepth, + RemoteDesktop_ColorDepth = instance.RemoteDesktop_SelectedColorDepth, + RemoteDesktop_OverridePort = instance.RemoteDesktop_OverridePort, + RemoteDesktop_Port = instance.RemoteDesktop_Port, + RemoteDesktop_OverrideViewOnly = instance.RemoteDesktop_OverrideViewOnly, + RemoteDesktop_ViewOnly = instance.RemoteDesktop_ViewOnly, + RemoteDesktop_OverrideCredSspSupport = instance.RemoteDesktop_OverrideCredSspSupport, + RemoteDesktop_EnableCredSspSupport = instance.RemoteDesktop_EnableCredSspSupport, + RemoteDesktop_OverrideAuthenticationLevel = instance.RemoteDesktop_OverrideAuthenticationLevel, + RemoteDesktop_AuthenticationLevel = instance.RemoteDesktop_AuthenticationLevel, + RemoteDesktop_OverrideGatewayServer = instance.RemoteDesktop_OverrideGatewayServer, + RemoteDesktop_EnableGatewayServer = instance.RemoteDesktop_EnableGatewayServer, + RemoteDesktop_GatewayServerHostname = instance.RemoteDesktop_GatewayServerHostname, + RemoteDesktop_GatewayServerBypassLocalAddresses = instance.RemoteDesktop_GatewayServerBypassLocalAddresses, + RemoteDesktop_GatewayServerLogonMethod = instance.RemoteDesktop_GatewayServerLogonMethod, + RemoteDesktop_GatewayServerShareCredentialsWithRemoteComputer = + instance.RemoteDesktop_GatewayServerShareCredentialsWithRemoteComputer, + RemoteDesktop_UseGatewayServerCredentials = instance.RemoteDesktop_UseGatewayServerCredentials, + RemoteDesktop_GatewayServerUsername = instance.RemoteDesktop_EnableGatewayServer && + Equals(instance.RemoteDesktop_GatewayServerLogonMethod, + GatewayUserSelectedCredsSource.Userpass) && + instance.RemoteDesktop_UseGatewayServerCredentials + ? instance.RemoteDesktop_GatewayServerUsername + : string.Empty, // Remove sensitive info on disable + RemoteDesktop_GatewayServerDomain = instance.RemoteDesktop_EnableGatewayServer && + Equals(instance.RemoteDesktop_GatewayServerLogonMethod, + GatewayUserSelectedCredsSource.Userpass) && + instance.RemoteDesktop_UseGatewayServerCredentials + ? instance.RemoteDesktop_GatewayServerDomain + : string.Empty, // Remove sensitive info on disable + RemoteDesktop_GatewayServerPassword = instance.RemoteDesktop_EnableGatewayServer && + Equals(instance.RemoteDesktop_GatewayServerLogonMethod, + GatewayUserSelectedCredsSource.Userpass) && + instance.RemoteDesktop_UseGatewayServerCredentials + ? instance.RemoteDesktop_GatewayServerPassword + : new SecureString(), // Remove sensitive info on disable + RemoteDesktop_OverrideAudioRedirectionMode = instance.RemoteDesktop_OverrideAudioRedirectionMode, + RemoteDesktop_AudioRedirectionMode = instance.RemoteDesktop_AudioRedirectionMode, + RemoteDesktop_OverrideAudioCaptureRedirectionMode = + instance.RemoteDesktop_OverrideAudioCaptureRedirectionMode, + RemoteDesktop_AudioCaptureRedirectionMode = instance.RemoteDesktop_AudioCaptureRedirectionMode, + RemoteDesktop_OverrideApplyWindowsKeyCombinations = + instance.RemoteDesktop_OverrideApplyWindowsKeyCombinations, + RemoteDesktop_KeyboardHookMode = instance.RemoteDesktop_KeyboardHookMode, + RemoteDesktop_OverrideRedirectClipboard = instance.RemoteDesktop_OverrideRedirectClipboard, + RemoteDesktop_RedirectClipboard = instance.RemoteDesktop_RedirectClipboard, + RemoteDesktop_OverrideRedirectDevices = instance.RemoteDesktop_OverrideRedirectDevices, + RemoteDesktop_RedirectDevices = instance.RemoteDesktop_RedirectDevices, + RemoteDesktop_OverrideRedirectDrives = instance.RemoteDesktop_OverrideRedirectDrives, + RemoteDesktop_RedirectDrives = instance.RemoteDesktop_RedirectDrives, + RemoteDesktop_OverrideRedirectPorts = instance.RemoteDesktop_OverrideRedirectPorts, + RemoteDesktop_RedirectPorts = instance.RemoteDesktop_RedirectPorts, + RemoteDesktop_OverrideRedirectSmartcards = instance.RemoteDesktop_OverrideRedirectSmartcards, + RemoteDesktop_RedirectSmartCards = instance.RemoteDesktop_RedirectSmartCards, + RemoteDesktop_OverrideRedirectPrinters = instance.RemoteDesktop_OverrideRedirectPrinters, + RemoteDesktop_RedirectPrinters = instance.RemoteDesktop_RedirectPrinters, + RemoteDesktop_OverridePersistentBitmapCaching = instance.RemoteDesktop_OverridePersistentBitmapCaching, + RemoteDesktop_PersistentBitmapCaching = instance.RemoteDesktop_PersistentBitmapCaching, + RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped = + instance.RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped, + RemoteDesktop_ReconnectIfTheConnectionIsDropped = instance.RemoteDesktop_ReconnectIfTheConnectionIsDropped, + RemoteDesktop_OverrideNetworkConnectionType = instance.RemoteDesktop_OverrideNetworkConnectionType, + RemoteDesktop_NetworkConnectionType = instance.RemoteDesktop_NetworkConnectionType, + RemoteDesktop_DesktopBackground = instance.RemoteDesktop_DesktopBackground, + RemoteDesktop_FontSmoothing = instance.RemoteDesktop_FontSmoothing, + RemoteDesktop_DesktopComposition = instance.RemoteDesktop_DesktopComposition, + RemoteDesktop_ShowWindowContentsWhileDragging = instance.RemoteDesktop_ShowWindowContentsWhileDragging, + RemoteDesktop_MenuAndWindowAnimation = instance.RemoteDesktop_MenuAndWindowAnimation, + RemoteDesktop_VisualStyles = instance.RemoteDesktop_VisualStyles, + + // PowerShell + PowerShell_Enabled = instance.PowerShell_Enabled, + PowerShell_EnableRemoteConsole = instance.PowerShell_EnableRemoteConsole, + PowerShell_InheritHost = instance.PowerShell_InheritHost, + PowerShell_Host = + instance.PowerShell_InheritHost ? instance.Host?.Trim() : instance.PowerShell_Host?.Trim(), + PowerShell_OverrideCommand = instance.PowerShell_OverrideCommand, + PowerShell_Command = instance.PowerShell_Command, + PowerShell_OverrideAdditionalCommandLine = instance.PowerShell_OverrideAdditionalCommandLine, + PowerShell_AdditionalCommandLine = instance.PowerShell_AdditionalCommandLine, + PowerShell_OverrideExecutionPolicy = instance.PowerShell_OverrideExecutionPolicy, + PowerShell_ExecutionPolicy = instance.PowerShell_ExecutionPolicy, + + // PuTTY + PuTTY_Enabled = instance.PuTTY_Enabled, + PuTTY_ConnectionMode = instance.PuTTY_ConnectionMode, + PuTTY_InheritHost = instance.PuTTY_InheritHost, + PuTTY_HostOrSerialLine = instance.PuTTY_ConnectionMode == ConnectionMode.Serial + ? instance.PuTTY_SerialLine?.Trim() + : instance.PuTTY_InheritHost + ? instance.Host?.Trim() + : instance.PuTTY_Host?.Trim(), + PuTTY_OverridePortOrBaud = instance.PuTTY_OverridePortOrBaud, + PuTTY_PortOrBaud = instance.PuTTY_ConnectionMode == ConnectionMode.Serial + ? instance.PuTTY_Baud + : instance.PuTTY_Port, + PuTTY_OverrideUsername = instance.PuTTY_OverrideUsername, + PuTTY_Username = instance.PuTTY_Username?.Trim(), + PuTTY_OverridePrivateKeyFile = instance.PuTTY_OverridePrivateKeyFile, + PuTTY_PrivateKeyFile = instance.PuTTY_PrivateKeyFile, + PuTTY_OverrideProfile = instance.PuTTY_OverrideProfile, + PuTTY_Profile = instance.PuTTY_Profile?.Trim(), + PuTTY_OverrideHostkey = instance.PuTTY_OverrideHostkey, + PuTTY_Hostkey = instance.PuTTY_Hostkey?.Trim(), + PuTTY_OverrideEnableLog = instance.PuTTY_OverrideEnableLog, + PuTTY_EnableLog = instance.PuTTY_EnableLog, + PuTTY_OverrideLogMode = instance.PuTTY_OverrideLogMode, + PuTTY_LogMode = instance.PuTTY_LogMode, + PuTTY_OverrideLogPath = instance.PuTTY_OverrideLogPath, + PuTTY_LogPath = instance.PuTTY_LogPath, + PuTTY_OverrideLogFileName = instance.PuTTY_OverrideLogFileName, + PuTTY_LogFileName = instance.PuTTY_LogFileName, + PuTTY_OverrideAdditionalCommandLine = instance.PuTTY_OverrideAdditionalCommandLine, + PuTTY_AdditionalCommandLine = instance.PuTTY_AdditionalCommandLine?.Trim(), + + // TigerVNC + TigerVNC_Enabled = instance.TigerVNC_Enabled, + TigerVNC_InheritHost = instance.TigerVNC_InheritHost, + TigerVNC_Host = instance.TigerVNC_InheritHost ? instance.Host?.Trim() : instance.TigerVNC_Host?.Trim(), + TigerVNC_OverridePort = instance.TigerVNC_OverridePort, + TigerVNC_Port = instance.TigerVNC_Port, + + // WebConsole + WebConsole_Enabled = instance.WebConsole_Enabled, + WebConsole_Url = instance.WebConsole_Url, + + // SNMP + SNMP_Enabled = instance.SNMP_Enabled, + SNMP_InheritHost = instance.SNMP_InheritHost, + SNMP_Host = instance.SNMP_InheritHost ? instance.Host?.Trim() : instance.SNMP_Host?.Trim(), + SNMP_OverrideOIDAndMode = instance.SNMP_OverrideOIDAndMode, + SNMP_OID = instance.SNMP_OID, + SNMP_Mode = instance.SNMP_Mode, + SNMP_OverrideVersionAndAuth = instance.SNMP_OverrideVersionAndAuth, + SNMP_Version = instance.SNMP_Version, + SNMP_Community = + instance.SNMP_OverrideVersionAndAuth && instance.SNMP_Version != SNMPVersion.V3 + ? instance.SNMP_Community + : new SecureString(), + SNMP_Security = instance.SNMP_Security, + SNMP_Username = instance.SNMP_Username, + SNMP_AuthenticationProvider = instance.SNMP_AuthenticationProvider, + SNMP_Auth = instance.SNMP_OverrideVersionAndAuth && + instance.SNMP_Version == SNMPVersion.V3 && + instance.SNMP_Security != SNMPV3Security.NoAuthNoPriv + ? instance.SNMP_Auth + : new SecureString(), + SNMP_PrivacyProvider = instance.SNMP_PrivacyProvider, + SNMP_Priv = instance.SNMP_OverrideVersionAndAuth && + instance.SNMP_Version == SNMPVersion.V3 && + instance.SNMP_Security == SNMPV3Security.AuthPriv + ? instance.SNMP_Priv + : new SecureString(), + + // Wake on LAN + WakeOnLAN_Enabled = instance.WakeOnLAN_Enabled, + WakeOnLAN_MACAddress = instance.WakeOnLAN_MACAddress?.Trim(), + WakeOnLAN_Broadcast = instance.WakeOnLAN_Broadcast?.Trim(), + + // Whois + Whois_Enabled = instance.Whois_Enabled, + Whois_InheritHost = instance.Whois_InheritHost, + Whois_Domain = instance.Whois_InheritHost ? instance.Host?.Trim() : instance.Whois_Domain?.Trim(), + + // IP Geolocation + IPGeolocation_Enabled = instance.IPGeolocation_Enabled, + IPGeolocation_InheritHost = instance.IPGeolocation_InheritHost, + IPGeolocation_Host = instance.IPGeolocation_InheritHost + ? instance.Host?.Trim() + : instance.IPGeolocation_Host?.Trim(), + }; + } + + #endregion - #region Dialog to add, edit, copy as and delete profile - public static async Task ShowAddProfileDialog(IProfileManager viewModel, IDialogCoordinator dialogCoordinator, string group = null) + #region Methods to add and remove group + + private static GroupInfo ParseGroupInfo(GroupViewModel instance) + { + var profiles = instance.Group.Profiles; + + var name = instance.Name.Trim(); + + // Update group in profiles + if (profiles.Count > 0) + if (!string.IsNullOrEmpty(instance.Group.Name) && + !string.Equals(instance.Group.Name, name, StringComparison.OrdinalIgnoreCase)) + foreach (var profile in profiles) + profile.Group = name; + //else + // Debug.WriteLine("Cannot update group in profiles"); + return new GroupInfo { - CustomDialog customDialog = new() - { - Title = Localization.Resources.Strings.AddProfile, - Style = (Style)Application.Current.FindResource(DialogResourceKey) - }; + Name = name, + Description = instance.Description?.Trim(), + + Profiles = profiles, + + // Remote Desktop + RemoteDesktop_UseCredentials = instance.RemoteDesktop_UseCredentials, + RemoteDesktop_Username = + instance.RemoteDesktop_UseCredentials + ? instance.RemoteDesktop_Username + : string.Empty, // Remove sensitive info on disable + RemoteDesktop_Domain = + instance.RemoteDesktop_UseCredentials + ? instance.RemoteDesktop_Domain + : string.Empty, // Remove sensitive info on disable + RemoteDesktop_Password = instance.RemoteDesktop_UseCredentials + ? instance.RemoteDesktop_Password + : new SecureString(), // Remove sensitive info on disable + RemoteDesktop_AdminSession = instance.RemoteDesktop_AdminSession, + RemoteDesktop_OverrideDisplay = instance.RemoteDesktop_OverrideDisplay, + RemoteDesktop_AdjustScreenAutomatically = instance.RemoteDesktop_AdjustScreenAutomatically, + RemoteDesktop_UseCurrentViewSize = instance.RemoteDesktop_UseCurrentViewSize, + RemoteDesktop_UseFixedScreenSize = instance.RemoteDesktop_UseFixedScreenSize, + RemoteDesktop_ScreenWidth = instance.RemoteDesktop_ScreenWidth, + RemoteDesktop_ScreenHeight = instance.RemoteDesktop_ScreenHeight, + RemoteDesktop_UseCustomScreenSize = instance.RemoteDesktop_UseCustomScreenSize, + RemoteDesktop_CustomScreenWidth = int.Parse(instance.RemoteDesktop_CustomScreenWidth), + RemoteDesktop_CustomScreenHeight = int.Parse(instance.RemoteDesktop_CustomScreenHeight), + RemoteDesktop_OverrideColorDepth = instance.RemoteDesktop_OverrideColorDepth, + RemoteDesktop_ColorDepth = instance.RemoteDesktop_SelectedColorDepth, + RemoteDesktop_OverridePort = instance.RemoteDesktop_OverridePort, + RemoteDesktop_Port = instance.RemoteDesktop_Port, + RemoteDesktop_OverrideViewOnly = instance.RemoteDesktop_OverrideViewOnly, + RemoteDesktop_ViewOnly = instance.RemoteDesktop_ViewOnly, + RemoteDesktop_OverrideCredSspSupport = instance.RemoteDesktop_OverrideCredSspSupport, + RemoteDesktop_EnableCredSspSupport = instance.RemoteDesktop_EnableCredSspSupport, + RemoteDesktop_OverrideAuthenticationLevel = instance.RemoteDesktop_OverrideAuthenticationLevel, + RemoteDesktop_AuthenticationLevel = instance.RemoteDesktop_AuthenticationLevel, + RemoteDesktop_OverrideGatewayServer = instance.RemoteDesktop_OverrideGatewayServer, + RemoteDesktop_EnableGatewayServer = instance.RemoteDesktop_EnableGatewayServer, + RemoteDesktop_GatewayServerHostname = instance.RemoteDesktop_GatewayServerHostname, + RemoteDesktop_GatewayServerBypassLocalAddresses = instance.RemoteDesktop_GatewayServerBypassLocalAddresses, + RemoteDesktop_GatewayServerLogonMethod = instance.RemoteDesktop_GatewayServerLogonMethod, + RemoteDesktop_GatewayServerShareCredentialsWithRemoteComputer = + instance.RemoteDesktop_GatewayServerShareCredentialsWithRemoteComputer, + RemoteDesktop_UseGatewayServerCredentials = instance.RemoteDesktop_UseGatewayServerCredentials, + RemoteDesktop_GatewayServerUsername = instance.RemoteDesktop_EnableGatewayServer && + Equals(instance.RemoteDesktop_GatewayServerLogonMethod, + GatewayUserSelectedCredsSource.Userpass) && + instance.RemoteDesktop_UseGatewayServerCredentials + ? instance.RemoteDesktop_GatewayServerUsername + : string.Empty, // Remove sensitive info on disable + RemoteDesktop_GatewayServerDomain = instance.RemoteDesktop_EnableGatewayServer && + Equals(instance.RemoteDesktop_GatewayServerLogonMethod, + GatewayUserSelectedCredsSource.Userpass) && + instance.RemoteDesktop_UseGatewayServerCredentials + ? instance.RemoteDesktop_GatewayServerDomain + : string.Empty, // Remove sensitive info on disable + RemoteDesktop_GatewayServerPassword = instance.RemoteDesktop_EnableGatewayServer && + Equals(instance.RemoteDesktop_GatewayServerLogonMethod, + GatewayUserSelectedCredsSource.Userpass) && + instance.RemoteDesktop_UseGatewayServerCredentials + ? instance.RemoteDesktop_GatewayServerPassword + : new SecureString(), // Remove sensitive info on disable + RemoteDesktop_OverrideAudioRedirectionMode = instance.RemoteDesktop_OverrideAudioRedirectionMode, + RemoteDesktop_AudioRedirectionMode = instance.RemoteDesktop_AudioRedirectionMode, + RemoteDesktop_OverrideAudioCaptureRedirectionMode = + instance.RemoteDesktop_OverrideAudioCaptureRedirectionMode, + RemoteDesktop_AudioCaptureRedirectionMode = instance.RemoteDesktop_AudioCaptureRedirectionMode, + RemoteDesktop_OverrideApplyWindowsKeyCombinations = + instance.RemoteDesktop_OverrideApplyWindowsKeyCombinations, + RemoteDesktop_KeyboardHookMode = instance.RemoteDesktop_KeyboardHookMode, + RemoteDesktop_OverrideRedirectClipboard = instance.RemoteDesktop_OverrideRedirectClipboard, + RemoteDesktop_RedirectClipboard = instance.RemoteDesktop_RedirectClipboard, + RemoteDesktop_OverrideRedirectDevices = instance.RemoteDesktop_OverrideRedirectDevices, + RemoteDesktop_RedirectDevices = instance.RemoteDesktop_RedirectDevices, + RemoteDesktop_OverrideRedirectDrives = instance.RemoteDesktop_OverrideRedirectDrives, + RemoteDesktop_RedirectDrives = instance.RemoteDesktop_RedirectDrives, + RemoteDesktop_OverrideRedirectPorts = instance.RemoteDesktop_OverrideRedirectPorts, + RemoteDesktop_RedirectPorts = instance.RemoteDesktop_RedirectPorts, + RemoteDesktop_OverrideRedirectSmartcards = instance.RemoteDesktop_OverrideRedirectSmartcards, + RemoteDesktop_RedirectSmartCards = instance.RemoteDesktop_RedirectSmartCards, + RemoteDesktop_OverrideRedirectPrinters = instance.RemoteDesktop_OverrideRedirectPrinters, + RemoteDesktop_RedirectPrinters = instance.RemoteDesktop_RedirectPrinters, + RemoteDesktop_OverridePersistentBitmapCaching = instance.RemoteDesktop_OverridePersistentBitmapCaching, + RemoteDesktop_PersistentBitmapCaching = instance.RemoteDesktop_PersistentBitmapCaching, + RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped = + instance.RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped, + RemoteDesktop_ReconnectIfTheConnectionIsDropped = instance.RemoteDesktop_ReconnectIfTheConnectionIsDropped, + RemoteDesktop_OverrideNetworkConnectionType = instance.RemoteDesktop_OverrideNetworkConnectionType, + RemoteDesktop_NetworkConnectionType = instance.RemoteDesktop_NetworkConnectionType, + RemoteDesktop_DesktopBackground = instance.RemoteDesktop_DesktopBackground, + RemoteDesktop_FontSmoothing = instance.RemoteDesktop_FontSmoothing, + RemoteDesktop_DesktopComposition = instance.RemoteDesktop_DesktopComposition, + RemoteDesktop_ShowWindowContentsWhileDragging = instance.RemoteDesktop_ShowWindowContentsWhileDragging, + RemoteDesktop_MenuAndWindowAnimation = instance.RemoteDesktop_MenuAndWindowAnimation, + RemoteDesktop_VisualStyles = instance.RemoteDesktop_VisualStyles, + + // PowerShell + PowerShell_OverrideCommand = instance.PowerShell_OverrideCommand, + PowerShell_Command = instance.PowerShell_Command, + PowerShell_OverrideAdditionalCommandLine = instance.PowerShell_OverrideAdditionalCommandLine, + PowerShell_AdditionalCommandLine = instance.PowerShell_AdditionalCommandLine, + PowerShell_OverrideExecutionPolicy = instance.PowerShell_OverrideExecutionPolicy, + PowerShell_ExecutionPolicy = instance.PowerShell_ExecutionPolicy, + + // PuTTY + PuTTY_OverrideUsername = instance.PuTTY_OverrideUsername, + PuTTY_Username = instance.PuTTY_Username?.Trim(), + PuTTY_OverridePrivateKeyFile = instance.PuTTY_OverridePrivateKeyFile, + PuTTY_PrivateKeyFile = instance.PuTTY_PrivateKeyFile, + PuTTY_OverrideProfile = instance.PuTTY_OverrideProfile, + PuTTY_Profile = instance.PuTTY_Profile?.Trim(), + PuTTY_OverrideEnableLog = instance.PuTTY_OverrideEnableLog, + PuTTY_EnableLog = instance.PuTTY_EnableLog, + PuTTY_OverrideLogMode = instance.PuTTY_OverrideLogMode, + PuTTY_LogMode = instance.PuTTY_LogMode, + PuTTY_OverrideLogPath = instance.PuTTY_OverrideLogPath, + PuTTY_LogPath = instance.PuTTY_LogPath, + PuTTY_OverrideLogFileName = instance.PuTTY_OverrideLogFileName, + PuTTY_LogFileName = instance.PuTTY_LogFileName, + PuTTY_OverrideAdditionalCommandLine = instance.PuTTY_OverrideAdditionalCommandLine, + PuTTY_AdditionalCommandLine = instance.PuTTY_AdditionalCommandLine?.Trim(), + + // TigerVNC + TigerVNC_OverridePort = instance.TigerVNC_OverridePort, + TigerVNC_Port = instance.TigerVNC_Port, + + // SNMP + SNMP_OverrideOIDAndMode = instance.SNMP_OverrideOIDAndMode, + SNMP_OID = instance.SNMP_OID, + SNMP_Mode = instance.SNMP_Mode, + SNMP_OverrideVersionAndAuth = instance.SNMP_OverrideVersionAndAuth, + SNMP_Version = instance.SNMP_Version, + SNMP_Community = + instance.SNMP_OverrideVersionAndAuth && instance.SNMP_Version != SNMPVersion.V3 + ? instance.SNMP_Community + : new SecureString(), + SNMP_Security = instance.SNMP_Security, + SNMP_Username = instance.SNMP_Username, + SNMP_AuthenticationProvider = instance.SNMP_AuthenticationProvider, + SNMP_Auth = instance.SNMP_OverrideVersionAndAuth && + instance.SNMP_Version == SNMPVersion.V3 && + instance.SNMP_Security != SNMPV3Security.NoAuthNoPriv + ? instance.SNMP_Auth + : new SecureString(), + SNMP_PrivacyProvider = instance.SNMP_PrivacyProvider, + SNMP_Priv = instance.SNMP_OverrideVersionAndAuth && + instance.SNMP_Version == SNMPVersion.V3 && + instance.SNMP_Security == SNMPV3Security.AuthPriv + ? instance.SNMP_Priv + : new SecureString() + }; + } - ProfileViewModel profileViewModel = new(async instance => - { - await dialogCoordinator.HideMetroDialogAsync(viewModel, customDialog); - viewModel.OnProfileDialogClose(); + #endregion - ProfileManager.AddProfile(ParseProfileInfo(instance)); - }, async instance => - { - await dialogCoordinator.HideMetroDialogAsync(viewModel, customDialog); - viewModel.OnProfileDialogClose(); - }, ProfileManager.GetGroupNames(), group); + #region Dialog to add, edit, copy as and delete profile - customDialog.Content = new ProfileDialog - { - DataContext = profileViewModel - }; + public static Task ShowAddProfileDialog(Window parentWindow, IProfileManagerMinimal viewModel, ProfileInfo profile = null, string group = null, ApplicationName applicationName = ApplicationName.None) + { + var childWindow = new ProfileChildWindow(parentWindow); - viewModel.OnProfileDialogOpen(); + void CloseChild() + { + childWindow.IsOpen = false; + Settings.ConfigurationManager.Current.IsChildWindowOpen = false; - await dialogCoordinator.ShowMetroDialogAsync(viewModel, customDialog); + viewModel.OnProfileManagerDialogClose(); } - public static async Task ShowEditProfileDialog(IProfileManager viewModel, IDialogCoordinator dialogCoordinator, ProfileInfo profile) + ProfileViewModel childWindowViewModel = new(instance => { - CustomDialog customDialog = new() - { - Title = Localization.Resources.Strings.EditProfile, - Style = (Style)Application.Current.FindResource(DialogResourceKey) - }; + CloseChild(); - ProfileViewModel profileViewModel = new(async instance => - { - await dialogCoordinator.HideMetroDialogAsync(viewModel, customDialog); - viewModel.OnProfileDialogClose(); + ProfileManager.AddProfile(ParseProfileInfo(instance)); + }, _ => CloseChild(), ProfileManager.GetGroupNames(), group, ProfileEditMode.Add, profile, applicationName); - ProfileManager.ReplaceProfile(profile, ParseProfileInfo(instance)); - }, async instance => - { - await dialogCoordinator.HideMetroDialogAsync(viewModel, customDialog); - viewModel.OnProfileDialogClose(); - }, ProfileManager.GetGroupNames(), profile.Group, ProfileEditMode.Edit, profile); + childWindow.Title = Strings.AddProfile; - customDialog.Content = new ProfileDialog - { - DataContext = profileViewModel - }; + childWindow.DataContext = childWindowViewModel; + + viewModel.OnProfileManagerDialogOpen(); + + Settings.ConfigurationManager.Current.IsChildWindowOpen = true; + + return parentWindow.ShowChildWindowAsync(childWindow); + } + + public static Task ShowEditProfileDialog(Window parentWindow, IProfileManagerMinimal viewModel, ProfileInfo profile) + { + var childWindow = new ProfileChildWindow(parentWindow); + + void CloseChild() + { + childWindow.IsOpen = false; + Settings.ConfigurationManager.Current.IsChildWindowOpen = false; - viewModel.OnProfileDialogOpen(); - await dialogCoordinator.ShowMetroDialogAsync(viewModel, customDialog); + viewModel.OnProfileManagerDialogClose(); } - public static async Task ShowCopyAsProfileDialog(IProfileManager viewModel, IDialogCoordinator dialogCoordinator, ProfileInfo profile) + ProfileViewModel childWindowViewModel = new(instance => { - CustomDialog customDialog = new() - { - Title = Localization.Resources.Strings.CopyProfile, - Style = (Style)Application.Current.FindResource(DialogResourceKey) - }; + CloseChild(); - ProfileViewModel profileViewModel = new(async instance => - { - await dialogCoordinator.HideMetroDialogAsync(viewModel, customDialog); - viewModel.OnProfileDialogClose(); + ProfileManager.ReplaceProfile(profile, ParseProfileInfo(instance)); + }, _ => CloseChild(), ProfileManager.GetGroupNames(), profile.Group, ProfileEditMode.Edit, profile); - ProfileManager.AddProfile(ParseProfileInfo(instance)); - }, async instance => - { - await dialogCoordinator.HideMetroDialogAsync(viewModel, customDialog); - viewModel.OnProfileDialogClose(); - }, ProfileManager.GetGroupNames(), profile.Group, ProfileEditMode.Copy, profile); + childWindow.Title = Strings.EditProfile; - customDialog.Content = new ProfileDialog - { - DataContext = profileViewModel - }; + childWindow.DataContext = childWindowViewModel; + + viewModel.OnProfileManagerDialogOpen(); + + Settings.ConfigurationManager.Current.IsChildWindowOpen = true; + + return parentWindow.ShowChildWindowAsync(childWindow); + } - viewModel.OnProfileDialogOpen(); - await dialogCoordinator.ShowMetroDialogAsync(viewModel, customDialog); + public static Task ShowCopyAsProfileDialog(Window parentWindow, IProfileManagerMinimal viewModel, ProfileInfo profile) + { + var childWindow = new ProfileChildWindow(parentWindow); + + void CloseChild() + { + childWindow.IsOpen = false; + Settings.ConfigurationManager.Current.IsChildWindowOpen = false; + + viewModel.OnProfileManagerDialogClose(); } - public static async Task ShowDeleteProfileDialog(IProfileManager viewModel, IDialogCoordinator dialogCoordinator, IList profiles) + ProfileViewModel childWindowViewModel = new(instance => { - CustomDialog customDialog = new() - { - Title = profiles.Count == 1 ? Localization.Resources.Strings.DeleteProfile : Localization.Resources.Strings.DeleteProfiles - }; + CloseChild(); - ConfirmDeleteViewModel confirmDeleteViewModel = new(async instance => - { - await dialogCoordinator.HideMetroDialogAsync(viewModel, customDialog); - viewModel.OnProfileDialogClose(); + ProfileManager.AddProfile(ParseProfileInfo(instance)); + }, _ => CloseChild(), ProfileManager.GetGroupNames(), profile.Group, ProfileEditMode.Copy, profile); - ProfileManager.RemoveProfiles(profiles); + childWindow.Title = Strings.CopyProfile; - }, async instance => - { - await dialogCoordinator.HideMetroDialogAsync(viewModel, customDialog); - viewModel.OnProfileDialogClose(); - }, profiles.Count == 1 ? Localization.Resources.Strings.DeleteProfileMessage : Localization.Resources.Strings.DeleteProfilesMessage); + childWindow.DataContext = childWindowViewModel; - customDialog.Content = new ConfirmDeleteDialog - { - DataContext = confirmDeleteViewModel - }; + viewModel.OnProfileManagerDialogOpen(); + + Settings.ConfigurationManager.Current.IsChildWindowOpen = true; - viewModel.OnProfileDialogOpen(); - await dialogCoordinator.ShowMetroDialogAsync(viewModel, customDialog); + return parentWindow.ShowChildWindowAsync(childWindow); + } + + public static async Task ShowDeleteProfileDialog(Window parentWindow, IProfileManagerMinimal viewModel, IList profiles) + { + viewModel.OnProfileManagerDialogOpen(); + + var result = await DialogHelper.ShowConfirmationMessageAsync(parentWindow, + profiles.Count == 1 ? Strings.DeleteProfile : Strings.DeleteProfiles, + profiles.Count == 1 ? Strings.DeleteProfileMessage : Strings.DeleteProfilesMessage, + ChildWindowIcon.Info, + Strings.Delete); + + viewModel.OnProfileManagerDialogClose(); + + if (!result) + return; + + ProfileManager.RemoveProfiles(profiles); + } + + public static Task ShowImportProfilesDialog(Window parentWindow, IProfileManagerMinimal viewModel, + string targetGroup) + { + var childWindow = new ImportProfilesChildWindow(); + + void CloseChild() + { + childWindow.IsOpen = false; + Settings.ConfigurationManager.Current.IsChildWindowOpen = false; + + viewModel.OnProfileManagerDialogClose(); } - #endregion - #region Dialog to add, edit and delete group - public static async Task ShowAddGroupDialog(IProfileManager viewModel, IDialogCoordinator dialogCoordinator) + var childWindowViewModel = new ImportProfilesViewModel(instance => { - CustomDialog customDialog = new() - { - Title = Localization.Resources.Strings.EditGroup, - Style = (Style)Application.Current.FindResource(DialogResourceKey) - }; + CloseChild(); - GroupViewModel groupViewModel = new(async instance => + switch (instance.SelectedMethod.Method) { - await dialogCoordinator.HideMetroDialogAsync(viewModel, customDialog); - viewModel.OnProfileDialogClose(); + case ProfileImportSource.ActiveDirectory: + _ = ShowSearchAdComputersDialog(parentWindow, viewModel, targetGroup, previousState: null); + break; + case ProfileImportSource.Csv: + _ = ShowImportCsvFileDialog(parentWindow, viewModel, targetGroup, previousState: null); + break; + } + }, _ => CloseChild()); - ProfileManager.AddGroup(ParseGroupInfo(instance)); - }, async instance => - { - await dialogCoordinator.HideMetroDialogAsync(viewModel, customDialog); - viewModel.OnProfileDialogClose(); - }, ProfileManager.GetGroupNames()); + childWindow.Title = Strings.ImportProfiles; + childWindow.DataContext = childWindowViewModel; - customDialog.Content = new GroupDialog - { - DataContext = groupViewModel - }; + viewModel.OnProfileManagerDialogOpen(); - viewModel.OnProfileDialogOpen(); - await dialogCoordinator.ShowMetroDialogAsync(viewModel, customDialog); - } + Settings.ConfigurationManager.Current.IsChildWindowOpen = true; + + return parentWindow.ShowChildWindowAsync(childWindow); + } - public static async Task ShowEditGroupDialog(IProfileManager viewModel, IDialogCoordinator dialogCoordinator, GroupInfo group) + private static Task ShowSearchAdComputersDialog(Window parentWindow, IProfileManagerMinimal viewModel, + string targetGroup, ImportAdComputersViewModel previousState) + { + var childWindow = new ImportAdComputersChildWindow(parentWindow); + + void CloseChild() { - CustomDialog customDialog = new() - { - Title = Localization.Resources.Strings.EditGroup, - Style = (Style)Application.Current.FindResource(DialogResourceKey) - }; + childWindow.IsOpen = false; + Settings.ConfigurationManager.Current.IsChildWindowOpen = false; - GroupViewModel groupViewModel = new(async instance => - { - await dialogCoordinator.HideMetroDialogAsync(viewModel, customDialog); - viewModel.OnProfileDialogClose(); + viewModel.OnProfileManagerDialogClose(); + } - ProfileManager.ReplaceGroup(instance.Group, ParseGroupInfo(instance)); - }, async instance => + var childWindowViewModel = new ImportAdComputersViewModel( + (candidates, searchViewModel) => { - await dialogCoordinator.HideMetroDialogAsync(viewModel, customDialog); - viewModel.OnProfileDialogClose(); - }, ProfileManager.GetGroupNames(), GroupEditMode.Edit, group); + CloseChild(); - customDialog.Content = new GroupDialog - { - DataContext = groupViewModel - }; + _ = ShowImportProfilesResultDialog(parentWindow, viewModel, targetGroup, candidates, + ProfileImportSource.ActiveDirectory, Strings.ImportProfiles_Source_ActiveDirectory, + backToSourceCallback: () => _ = ShowSearchAdComputersDialog(parentWindow, viewModel, targetGroup, searchViewModel)); + }, CloseChild, previousState); - viewModel.OnProfileDialogOpen(); - await dialogCoordinator.ShowMetroDialogAsync(viewModel, customDialog); - } + childWindow.Title = Strings.ImportComputersFromActiveDirectory; + childWindow.DataContext = childWindowViewModel; + + viewModel.OnProfileManagerDialogOpen(); + + Settings.ConfigurationManager.Current.IsChildWindowOpen = true; + + return parentWindow.ShowChildWindowAsync(childWindow); + } + + private static Task ShowImportCsvFileDialog(Window parentWindow, IProfileManagerMinimal viewModel, + string targetGroup, ImportCsvFileViewModel previousState) + { + var childWindow = new ImportCsvFileChildWindow(); - public static async Task ShowDeleteGroupDialog(IProfileManager viewModel, IDialogCoordinator dialogCoordinator, GroupInfo group) + void CloseChild() { - CustomDialog customDialog = new() - { - Title = Localization.Resources.Strings.DeleteGroup - }; + childWindow.IsOpen = false; + Settings.ConfigurationManager.Current.IsChildWindowOpen = false; - ConfirmDeleteViewModel confirmDeleteViewModel = new(async instance => - { - await dialogCoordinator.HideMetroDialogAsync(viewModel, customDialog); - viewModel.OnProfileDialogClose(); + viewModel.OnProfileManagerDialogClose(); + } - ProfileManager.RemoveGroup(group); - }, async instance => + var childWindowViewModel = new ImportCsvFileViewModel( + (candidates, csvViewModel) => { - await dialogCoordinator.HideMetroDialogAsync(viewModel, customDialog); - viewModel.OnProfileDialogClose(); - }, Localization.Resources.Strings.DeleteGroupMessage); + CloseChild(); - customDialog.Content = new ConfirmDeleteDialog - { - DataContext = confirmDeleteViewModel - }; + _ = ShowImportProfilesResultDialog(parentWindow, viewModel, targetGroup, candidates, + ProfileImportSource.Csv, Strings.ImportProfiles_Source_Csv, + backToSourceCallback: () => _ = ShowImportCsvFileDialog(parentWindow, viewModel, targetGroup, csvViewModel)); + }, CloseChild, previousState); + + childWindow.Title = Strings.ImportProfilesFromCsvFile; + childWindow.DataContext = childWindowViewModel; + + viewModel.OnProfileManagerDialogOpen(); + + Settings.ConfigurationManager.Current.IsChildWindowOpen = true; + + return parentWindow.ShowChildWindowAsync(childWindow); + } + + private static Task ShowImportProfilesResultDialog(Window parentWindow, IProfileManagerMinimal viewModel, + string targetGroup, IReadOnlyList candidates, ProfileImportSource importSource, string sourceLabel, + Action backToSourceCallback) + { + var childWindow = new ImportProfilesResultChildWindow(parentWindow); + + void CloseChild() + { + childWindow.IsOpen = false; + Settings.ConfigurationManager.Current.IsChildWindowOpen = false; - viewModel.OnProfileDialogOpen(); - await dialogCoordinator.ShowMetroDialogAsync(viewModel, customDialog); + viewModel.OnProfileManagerDialogClose(); } - #endregion - #region Methods to add and remove profile - public static ProfileInfo ParseProfileInfo(ProfileViewModel instance) + async void ShowSummary(int imported, int skippedDuplicates, int skippedNoHost) { - return new ProfileInfo + CloseChild(); + + Settings.ConfigurationManager.OnDialogOpen(); + + await DialogHelper.ShowMessageAsync(parentWindow, Strings.ImportResults, + string.Format(Strings.ProfileImportSummary, imported, skippedDuplicates, skippedNoHost)); + + Settings.ConfigurationManager.OnDialogClose(); + } + + var childWindowViewModel = new ImportProfilesResultViewModel(candidates, importSource, targetGroup, + backCallback: () => { - Name = instance.Name.Trim(), - Host = instance.Host.Trim(), - Group = instance.Group.Trim(), - Tags = instance.Tags?.Trim(), - - NetworkInterface_Enabled = instance.NetworkInterface_Enabled, - NetworkInterface_EnableStaticIPAddress = instance.NetworkInterface_EnableStaticIPAddress, - NetworkInterface_IPAddress = instance.NetworkInterface_IPAddress?.Trim(), - NetworkInterface_Gateway = instance.NetworkInterface_Gateway?.Trim(), - NetworkInterface_SubnetmaskOrCidr = instance.NetworkInterface_SubnetmaskOrCidr?.Trim(), - NetworkInterface_EnableStaticDNS = instance.NetworkInterface_EnableStaticDNS, - NetworkInterface_PrimaryDNSServer = instance.NetworkInterface_PrimaryDNSServer?.Trim(), - NetworkInterface_SecondaryDNSServer = instance.NetworkInterface_SecondaryDNSServer?.Trim(), - - IPScanner_Enabled = instance.IPScanner_Enabled, - IPScanner_InheritHost = instance.IPScanner_InheritHost, - IPScanner_HostOrIPRange = instance.IPScanner_InheritHost ? instance.Host?.Trim() : instance.IPScanner_HostOrIPRange?.Trim(), - - PortScanner_Enabled = instance.PortScanner_Enabled, - PortScanner_InheritHost = instance.PortScanner_InheritHost, - PortScanner_Host = instance.PortScanner_InheritHost ? instance.Host?.Trim() : instance.PortScanner_Host?.Trim(), - PortScanner_Ports = instance.PortScanner_Ports?.Trim(), - - PingMonitor_Enabled = instance.PingMonitor_Enabled, - PingMonitor_InheritHost = instance.PingMonitor_InheritHost, - PingMonitor_Host = instance.PingMonitor_InheritHost ? instance.Host?.Trim() : instance.PingMonitor_Host?.Trim(), - - Traceroute_Enabled = instance.Traceroute_Enabled, - Traceroute_InheritHost = instance.Traceroute_InheritHost, - Traceroute_Host = instance.Traceroute_InheritHost ? instance.Host?.Trim() : instance.Traceroute_Host?.Trim(), - - DNSLookup_Enabled = instance.DNSLookup_Enabled, - DNSLookup_InheritHost = instance.Traceroute_InheritHost, - DNSLookup_Host = instance.DNSLookup_InheritHost ? instance.Host?.Trim() : instance.DNSLookup_Host?.Trim(), - - RemoteDesktop_Enabled = instance.RemoteDesktop_Enabled, - RemoteDesktop_InheritHost = instance.RemoteDesktop_InheritHost, - RemoteDesktop_Host = instance.RemoteDesktop_InheritHost ? instance.Host?.Trim() : instance.RemoteDesktop_Host?.Trim(), - RemoteDesktop_UseCredentials = instance.RemoteDesktop_UseCredentials, - RemoteDesktop_Username = instance.RemoteDesktop_UseCredentials ? instance.RemoteDesktop_Username : string.Empty, // Remove sensitive info on disable - RemoteDesktop_Password = instance.RemoteDesktop_UseCredentials ? instance.RemoteDesktop_Password : new SecureString(), // Remove sensitive info on disable - RemoteDesktop_OverrideDisplay = instance.RemoteDesktop_OverrideDisplay, - RemoteDesktop_AdjustScreenAutomatically = instance.RemoteDesktop_AdjustScreenAutomatically, - RemoteDesktop_UseCurrentViewSize = instance.RemoteDesktop_UseCurrentViewSize, - RemoteDesktop_UseFixedScreenSize = instance.RemoteDesktop_UseFixedScreenSize, - RemoteDesktop_ScreenWidth = instance.RemoteDesktop_ScreenWidth, - RemoteDesktop_ScreenHeight = instance.RemoteDesktop_ScreenHeight, - RemoteDesktop_UseCustomScreenSize = instance.RemoteDesktop_UseCustomScreenSize, - RemoteDesktop_CustomScreenWidth = int.Parse(instance.RemoteDesktop_CustomScreenWidth), - RemoteDesktop_CustomScreenHeight = int.Parse(instance.RemoteDesktop_CustomScreenHeight), - RemoteDesktop_OverrideColorDepth = instance.RemoteDesktop_OverrideColorDepth, - RemoteDesktop_ColorDepth = instance.RemoteDesktop_SelectedColorDepth, - RemoteDesktop_OverridePort = instance.RemoteDesktop_OverridePort, - RemoteDesktop_Port = instance.RemoteDesktop_Port, - RemoteDesktop_OverrideCredSspSupport = instance.RemoteDesktop_OverrideCredSspSupport, - RemoteDesktop_EnableCredSspSupport = instance.RemoteDesktop_EnableCredSspSupport, - RemoteDesktop_OverrideAuthenticationLevel = instance.RemoteDesktop_OverrideAuthenticationLevel, - RemoteDesktop_AuthenticationLevel = instance.RemoteDesktop_AuthenticationLevel, - RemoteDesktop_OverrideAudioRedirectionMode = instance.RemoteDesktop_OverrideAudioRedirectionMode, - RemoteDesktop_AudioRedirectionMode = instance.RemoteDesktop_AudioRedirectionMode, - RemoteDesktop_OverrideAudioCaptureRedirectionMode = instance.RemoteDesktop_OverrideAudioCaptureRedirectionMode, - RemoteDesktop_AudioCaptureRedirectionMode = instance.RemoteDesktop_AudioCaptureRedirectionMode, - RemoteDesktop_OverrideApplyWindowsKeyCombinations = instance.RemoteDesktop_OverrideApplyWindowsKeyCombinations, - RemoteDesktop_KeyboardHookMode = instance.RemoteDesktop_KeyboardHookMode, - RemoteDesktop_OverrideRedirectClipboard = instance.RemoteDesktop_OverrideRedirectClipboard, - RemoteDesktop_RedirectClipboard = instance.RemoteDesktop_RedirectClipboard, - RemoteDesktop_OverrideRedirectDevices = instance.RemoteDesktop_OverrideRedirectDevices, - RemoteDesktop_RedirectDevices = instance.RemoteDesktop_RedirectDevices, - RemoteDesktop_OverrideRedirectDrives = instance.RemoteDesktop_OverrideRedirectDrives, - RemoteDesktop_RedirectDrives = instance.RemoteDesktop_RedirectDrives, - RemoteDesktop_OverrideRedirectPorts = instance.RemoteDesktop_OverrideRedirectPorts, - RemoteDesktop_RedirectPorts = instance.RemoteDesktop_RedirectPorts, - RemoteDesktop_OverrideRedirectSmartcards = instance.RemoteDesktop_OverrideRedirectSmartcards, - RemoteDesktop_RedirectSmartCards = instance.RemoteDesktop_RedirectSmartCards, - RemoteDesktop_OverrideRedirectPrinters = instance.RemoteDesktop_OverrideRedirectPrinters, - RemoteDesktop_RedirectPrinters = instance.RemoteDesktop_RedirectPrinters, - RemoteDesktop_OverridePersistentBitmapCaching = instance.RemoteDesktop_OverridePersistentBitmapCaching, - RemoteDesktop_PersistentBitmapCaching = instance.RemoteDesktop_PersistentBitmapCaching, - RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped = instance.RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped, - RemoteDesktop_ReconnectIfTheConnectionIsDropped = instance.RemoteDesktop_ReconnectIfTheConnectionIsDropped, - RemoteDesktop_OverrideNetworkConnectionType = instance.RemoteDesktop_OverrideNetworkConnectionType, - RemoteDesktop_NetworkConnectionType = instance.RemoteDesktop_NetworkConnectionType, - RemoteDesktop_DesktopBackground = instance.RemoteDesktop_DesktopBackground, - RemoteDesktop_FontSmoothing = instance.RemoteDesktop_FontSmoothing, - RemoteDesktop_DesktopComposition = instance.RemoteDesktop_DesktopComposition, - RemoteDesktop_ShowWindowContentsWhileDragging = instance.RemoteDesktop_ShowWindowContentsWhileDragging, - RemoteDesktop_MenuAndWindowAnimation = instance.RemoteDesktop_MenuAndWindowAnimation, - RemoteDesktop_VisualStyles = instance.RemoteDesktop_VisualStyles, - - PowerShell_Enabled = instance.PowerShell_Enabled, - PowerShell_EnableRemoteConsole = instance.PowerShell_EnableRemoteConsole, - PowerShell_InheritHost = instance.PowerShell_InheritHost, - PowerShell_Host = instance.PowerShell_InheritHost ? instance.Host?.Trim() : instance.PowerShell_Host?.Trim(), - PowerShell_OverrideAdditionalCommandLine = instance.PowerShell_OverrideAdditionalCommandLine, - PowerShell_AdditionalCommandLine = instance.PowerShell_AdditionalCommandLine, - PowerShell_OverrideExecutionPolicy = instance.PowerShell_OverrideExecutionPolicy, - PowerShell_ExecutionPolicy = instance.PowerShell_ExecutionPolicy, - - PuTTY_Enabled = instance.PuTTY_Enabled, - PuTTY_ConnectionMode = instance.PuTTY_ConnectionMode, - PuTTY_InheritHost = instance.PuTTY_InheritHost, - PuTTY_HostOrSerialLine = instance.PuTTY_ConnectionMode == Models.PuTTY.ConnectionMode.Serial ? instance.PuTTY_HostOrSerialLine?.Trim() : (instance.PuTTY_InheritHost ? instance.Host?.Trim() : instance.PuTTY_HostOrSerialLine?.Trim()), - PuTTY_OverridePortOrBaud = instance.PuTTY_OverridePortOrBaud, - PuTTY_PortOrBaud = instance.PuTTY_PortOrBaud, - PuTTY_OverrideUsername = instance.PuTTY_OverrideUsername, - PuTTY_Username = instance.PuTTY_Username?.Trim(), - PuTTY_OverridePrivateKeyFile = instance.PuTTY_OverridePrivateKeyFile, - PuTTY_PrivateKeyFile = instance.PuTTY_PrivateKeyFile, - PuTTY_OverrideProfile = instance.PuTTY_OverrideProfile, - PuTTY_Profile = instance.PuTTY_Profile?.Trim(), - PuTTY_OverrideEnableLog = instance.PuTTY_OverrideEnableLog, - PuTTY_EnableLog = instance.PuTTY_EnableLog, - PuTTY_OverrideLogMode = instance.PuTTY_OverrideLogMode, - PuTTY_LogMode = instance.PuTTY_LogMode, - PuTTY_OverrideLogPath = instance.PuTTY_OverrideLogPath, - PuTTY_LogPath = instance.PuTTY_LogPath, - PuTTY_OverrideLogFileName = instance.PuTTY_OverrideLogFileName, - PuTTY_LogFileName = instance.PuTTY_LogFileName, - PuTTY_OverrideAdditionalCommandLine = instance.PuTTY_OverrideAdditionalCommandLine, - PuTTY_AdditionalCommandLine = instance.PuTTY_AdditionalCommandLine?.Trim(), - - TigerVNC_Enabled = instance.TigerVNC_Enabled, - TigerVNC_InheritHost = instance.TigerVNC_InheritHost, - TigerVNC_Host = instance.TigerVNC_InheritHost ? instance.Host?.Trim() : instance.TigerVNC_Host?.Trim(), - TigerVNC_OverridePort = instance.TigerVNC_OverridePort, - TigerVNC_Port = instance.TigerVNC_Port, - - WebConsole_Enabled = instance.WebConsole_Enabled, - WebConsole_Url = instance.WebConsole_Url, - - WakeOnLAN_Enabled = instance.WakeOnLAN_Enabled, - WakeOnLAN_MACAddress = instance.WakeOnLAN_MACAddress?.Trim(), - WakeOnLAN_Broadcast = instance.WakeOnLAN_Broadcast?.Trim(), - WakeOnLAN_OverridePort = instance.WakeOnLAN_OverridePort, - WakeOnLAN_Port = instance.WakeOnLAN_Port, - - Whois_Enabled = instance.Whois_Enabled, - Whois_InheritHost = instance.Whois_InheritHost, - Whois_Domain = instance.Whois_InheritHost ? instance.Host?.Trim() : instance.Whois_Domain?.Trim() - }; + CloseChild(); + backToSourceCallback(); + }, cancelCallback: CloseChild, completedCallback: ShowSummary); + + childWindow.Title = $"{Strings.ImportResults} - {string.Format(Strings.ImportResultsHeader, sourceLabel, candidates.Count)}"; + childWindow.DataContext = childWindowViewModel; + + viewModel.OnProfileManagerDialogOpen(); + + Settings.ConfigurationManager.Current.IsChildWindowOpen = true; + + return parentWindow.ShowChildWindowAsync(childWindow); + } + + #endregion + + #region Dialog to add, edit and delete group + + public static Task ShowAddGroupDialog(Window parentWindow, IProfileManagerMinimal viewModel) + { + var childWindow = new GroupChildWindow(parentWindow); + + void CloseChild() + { + childWindow.IsOpen = false; + Settings.ConfigurationManager.Current.IsChildWindowOpen = false; + + viewModel.OnProfileManagerDialogClose(); } - #endregion - #region Methods to add and remove group - public static GroupInfo ParseGroupInfo(GroupViewModel instance) + GroupViewModel childWindowViewModel = new(instance => { - List profiles = instance.Group.Profiles; + CloseChild(); - string name = instance.Name.Trim(); + ProfileManager.AddGroup(ParseGroupInfo(instance)); + }, _ => CloseChild(), ProfileManager.GetGroupNames()); - // Update group in profiles - if(profiles.Count > 0) - { - if(!string.IsNullOrEmpty(instance.Group.Name) && !string.Equals(instance.Group.Name, name, System.StringComparison.Ordinal)) - { - foreach (ProfileInfo profile in profiles) - profile.Group = name; - } - else - { - Debug.WriteLine("Cannot update group in profiles"); - } - } + childWindow.Title = Strings.AddGroup; - return new GroupInfo - { - Name = name, - - Profiles = profiles, - - RemoteDesktop_Enabled = instance.RemoteDesktop_Enabled, - RemoteDesktop_UseCredentials = instance.RemoteDesktop_UseCredentials, - RemoteDesktop_Username = instance.RemoteDesktop_UseCredentials ? instance.RemoteDesktop_Username : string.Empty, // Remove sensitive info on disable - RemoteDesktop_Password = instance.RemoteDesktop_UseCredentials ? instance.RemoteDesktop_Password : new SecureString(), // Remove sensitive info on disable - RemoteDesktop_OverrideDisplay = instance.RemoteDesktop_OverrideDisplay, - RemoteDesktop_AdjustScreenAutomatically = instance.RemoteDesktop_AdjustScreenAutomatically, - RemoteDesktop_UseCurrentViewSize = instance.RemoteDesktop_UseCurrentViewSize, - RemoteDesktop_UseFixedScreenSize = instance.RemoteDesktop_UseFixedScreenSize, - RemoteDesktop_ScreenWidth = instance.RemoteDesktop_ScreenWidth, - RemoteDesktop_ScreenHeight = instance.RemoteDesktop_ScreenHeight, - RemoteDesktop_UseCustomScreenSize = instance.RemoteDesktop_UseCustomScreenSize, - RemoteDesktop_CustomScreenWidth = int.Parse(instance.RemoteDesktop_CustomScreenWidth), - RemoteDesktop_CustomScreenHeight = int.Parse(instance.RemoteDesktop_CustomScreenHeight), - RemoteDesktop_OverrideColorDepth = instance.RemoteDesktop_OverrideColorDepth, - RemoteDesktop_ColorDepth = instance.RemoteDesktop_SelectedColorDepth, - RemoteDesktop_OverridePort = instance.RemoteDesktop_OverridePort, - RemoteDesktop_Port = instance.RemoteDesktop_Port, - RemoteDesktop_OverrideCredSspSupport = instance.RemoteDesktop_OverrideCredSspSupport, - RemoteDesktop_EnableCredSspSupport = instance.RemoteDesktop_EnableCredSspSupport, - RemoteDesktop_OverrideAuthenticationLevel = instance.RemoteDesktop_OverrideAuthenticationLevel, - RemoteDesktop_AuthenticationLevel = instance.RemoteDesktop_AuthenticationLevel, - RemoteDesktop_OverrideAudioRedirectionMode = instance.RemoteDesktop_OverrideAudioRedirectionMode, - RemoteDesktop_AudioRedirectionMode = instance.RemoteDesktop_AudioRedirectionMode, - RemoteDesktop_OverrideAudioCaptureRedirectionMode = instance.RemoteDesktop_OverrideAudioCaptureRedirectionMode, - RemoteDesktop_AudioCaptureRedirectionMode = instance.RemoteDesktop_AudioCaptureRedirectionMode, - RemoteDesktop_OverrideApplyWindowsKeyCombinations = instance.RemoteDesktop_OverrideApplyWindowsKeyCombinations, - RemoteDesktop_KeyboardHookMode = instance.RemoteDesktop_KeyboardHookMode, - RemoteDesktop_OverrideRedirectClipboard = instance.RemoteDesktop_OverrideRedirectClipboard, - RemoteDesktop_RedirectClipboard = instance.RemoteDesktop_RedirectClipboard, - RemoteDesktop_OverrideRedirectDevices = instance.RemoteDesktop_OverrideRedirectDevices, - RemoteDesktop_RedirectDevices = instance.RemoteDesktop_RedirectDevices, - RemoteDesktop_OverrideRedirectDrives = instance.RemoteDesktop_OverrideRedirectDrives, - RemoteDesktop_RedirectDrives = instance.RemoteDesktop_RedirectDrives, - RemoteDesktop_OverrideRedirectPorts = instance.RemoteDesktop_OverrideRedirectPorts, - RemoteDesktop_RedirectPorts = instance.RemoteDesktop_RedirectPorts, - RemoteDesktop_OverrideRedirectSmartcards = instance.RemoteDesktop_OverrideRedirectSmartcards, - RemoteDesktop_RedirectSmartCards = instance.RemoteDesktop_RedirectSmartCards, - RemoteDesktop_OverrideRedirectPrinters = instance.RemoteDesktop_OverrideRedirectPrinters, - RemoteDesktop_RedirectPrinters = instance.RemoteDesktop_RedirectPrinters, - RemoteDesktop_OverridePersistentBitmapCaching = instance.RemoteDesktop_OverridePersistentBitmapCaching, - RemoteDesktop_PersistentBitmapCaching = instance.RemoteDesktop_PersistentBitmapCaching, - RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped = instance.RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped, - RemoteDesktop_ReconnectIfTheConnectionIsDropped = instance.RemoteDesktop_ReconnectIfTheConnectionIsDropped, - RemoteDesktop_OverrideNetworkConnectionType = instance.RemoteDesktop_OverrideNetworkConnectionType, - RemoteDesktop_NetworkConnectionType = instance.RemoteDesktop_NetworkConnectionType, - RemoteDesktop_DesktopBackground = instance.RemoteDesktop_DesktopBackground, - RemoteDesktop_FontSmoothing = instance.RemoteDesktop_FontSmoothing, - RemoteDesktop_DesktopComposition = instance.RemoteDesktop_DesktopComposition, - RemoteDesktop_ShowWindowContentsWhileDragging = instance.RemoteDesktop_ShowWindowContentsWhileDragging, - RemoteDesktop_MenuAndWindowAnimation = instance.RemoteDesktop_MenuAndWindowAnimation, - RemoteDesktop_VisualStyles = instance.RemoteDesktop_VisualStyles, - - PowerShell_Enabled = instance.PowerShell_Enabled, - PowerShell_OverrideAdditionalCommandLine = instance.PowerShell_OverrideAdditionalCommandLine, - PowerShell_AdditionalCommandLine = instance.PowerShell_AdditionalCommandLine, - PowerShell_OverrideExecutionPolicy = instance.PowerShell_OverrideExecutionPolicy, - PowerShell_ExecutionPolicy = instance.PowerShell_ExecutionPolicy, - - PuTTY_Enabled = instance.PuTTY_Enabled, - PuTTY_OverrideUsername = instance.PuTTY_OverrideUsername, - PuTTY_Username = instance.PuTTY_Username?.Trim(), - PuTTY_OverridePrivateKeyFile = instance.PuTTY_OverridePrivateKeyFile, - PuTTY_PrivateKeyFile = instance.PuTTY_PrivateKeyFile, - PuTTY_OverrideProfile = instance.PuTTY_OverrideProfile, - PuTTY_Profile = instance.PuTTY_Profile?.Trim(), - PuTTY_OverrideEnableLog = instance.PuTTY_OverrideEnableLog, - PuTTY_EnableLog = instance.PuTTY_EnableLog, - PuTTY_OverrideLogMode = instance.PuTTY_OverrideLogMode, - PuTTY_LogMode = instance.PuTTY_LogMode, - PuTTY_OverrideLogPath = instance.PuTTY_OverrideLogPath, - PuTTY_LogPath = instance.PuTTY_LogPath, - PuTTY_OverrideLogFileName = instance.PuTTY_OverrideLogFileName, - PuTTY_LogFileName = instance.PuTTY_LogFileName, - PuTTY_OverrideAdditionalCommandLine = instance.PuTTY_OverrideAdditionalCommandLine, - PuTTY_AdditionalCommandLine = instance.PuTTY_AdditionalCommandLine?.Trim(), - - TigerVNC_Enabled = instance.TigerVNC_Enabled, - TigerVNC_OverridePort = instance.TigerVNC_OverridePort, - TigerVNC_Port = instance.TigerVNC_Port - }; + childWindow.DataContext = childWindowViewModel; + + viewModel.OnProfileManagerDialogOpen(); + + Settings.ConfigurationManager.Current.IsChildWindowOpen = true; + + return parentWindow.ShowChildWindowAsync(childWindow); + } + + public static Task ShowEditGroupDialog(Window parentWindow, IProfileManagerMinimal viewModel, + GroupInfo group) + { + var childWindow = new GroupChildWindow(parentWindow); + + void CloseChild() + { + childWindow.IsOpen = false; + Settings.ConfigurationManager.Current.IsChildWindowOpen = false; + + viewModel.OnProfileManagerDialogClose(); } - #endregion + + GroupViewModel childWindowViewModel = new(instance => + { + CloseChild(); + + ProfileManager.ReplaceGroup(group, ParseGroupInfo(instance)); + }, _ => CloseChild(), ProfileManager.GetGroupNames(), GroupEditMode.Edit, group); + + childWindow.Title = Strings.EditGroup; + + childWindow.DataContext = childWindowViewModel; + + viewModel.OnProfileManagerDialogOpen(); + + Settings.ConfigurationManager.Current.IsChildWindowOpen = true; + + return parentWindow.ShowChildWindowAsync(childWindow); } + + public static async Task ShowDeleteGroupDialog(Window parentWindow, IProfileManagerMinimal viewModel, + GroupInfo group) + { + viewModel.OnProfileManagerDialogOpen(); + + var result = await DialogHelper.ShowConfirmationMessageAsync(parentWindow, + Strings.DeleteGroup, + Strings.DeleteGroupMessage, + ChildWindowIcon.Info, + Strings.Delete); + + viewModel.OnProfileManagerDialogClose(); + + if (!result) + return; + + ProfileManager.RemoveGroup(group); + } + + #endregion } diff --git a/Source/NETworkManager/Properties/AssemblyInfo.cs b/Source/NETworkManager/Properties/AssemblyInfo.cs index d82a6c7308..b11d0e39d7 100644 --- a/Source/NETworkManager/Properties/AssemblyInfo.cs +++ b/Source/NETworkManager/Properties/AssemblyInfo.cs @@ -3,12 +3,10 @@ using System.Windows; [assembly: AssemblyTitle("NETworkManager")] -[assembly: AssemblyDescription("A powerful tool for managing networks and troubleshoot network problems!")] +[assembly: AssemblyDescription("A powerful open-source tool for managing networks and troubleshooting network problems!")] [assembly: AssemblyProduct("NETworkManager")] - [assembly: ComVisible(false)] - [assembly: ThemeInfo( - ResourceDictionaryLocation.None, + ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly )] \ No newline at end of file diff --git a/Source/NETworkManager/Properties/Resources.Designer.cs b/Source/NETworkManager/Properties/Resources.Designer.cs index bfc5d5ff98..79d39ad2e6 100644 --- a/Source/NETworkManager/Properties/Resources.Designer.cs +++ b/Source/NETworkManager/Properties/Resources.Designer.cs @@ -19,7 +19,7 @@ namespace NETworkManager.Properties { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class Resources { @@ -70,7 +70,7 @@ public static string MicrosoftEdgeWebView2Runtime_DownloadUrl { } /// - /// Looks up a localized string similar to https://github.com/BornToBeRoot/NETworkManager/blob/master/Contributors.md. + /// Looks up a localized string similar to https://github.com/BornToBeRoot/NETworkManager/blob/main/CONTRIBUTORS. /// public static string NETworkManager_Contributors { get { @@ -78,6 +78,15 @@ public static string NETworkManager_Contributors { } } + /// + /// Looks up a localized string similar to https://github.com/BornToBeRoot/NETworkManager#-donate. + /// + public static string NETworkManager_DonateUrl { + get { + return ResourceManager.GetString("NETworkManager_DonateUrl", resourceCulture); + } + } + /// /// Looks up a localized string similar to NETworkManager. /// @@ -96,6 +105,24 @@ public static string NETworkManager_GitHub_User { } } + /// + /// Looks up a localized string similar to https://github.com/BornToBeRoot/NETworkManager/issues/new/choose. + /// + public static string NETworkManager_GitHubNewIssueUrl { + get { + return ResourceManager.GetString("NETworkManager_GitHubNewIssueUrl", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to https://github.com/BornToBeRoot/NETworkManager. + /// + public static string NETworkManager_GitHubRepoUrl { + get { + return ResourceManager.GetString("NETworkManager_GitHubRepoUrl", resourceCulture); + } + } + /// /// Looks up a localized string similar to https://borntoberoot.net/NETworkManager/Download. /// @@ -115,7 +142,7 @@ public static string NETworkManager_License { } /// - /// Looks up a localized string similar to https://github.com/BornToBeRoot/NETworkManager/blob/master/LICENSE. + /// Looks up a localized string similar to https://github.com/BornToBeRoot/NETworkManager/blob/main/LICENSE. /// public static string NETworkManager_LicenseUrl { get { @@ -123,15 +150,6 @@ public static string NETworkManager_LicenseUrl { } } - /// - /// Looks up a localized string similar to https://github.com/BornToBeRoot/NETworkManager/issues/new/choose. - /// - public static string NETworkManager_NewIssueUrl { - get { - return ResourceManager.GetString("NETworkManager_NewIssueUrl", resourceCulture); - } - } - /// /// Looks up a localized string similar to NETworkManager. /// @@ -150,15 +168,6 @@ public static string NETworkManager_ProjectUrl { } } - /// - /// Looks up a localized string similar to https://github.com/BornToBeRoot/NETworkManager. - /// - public static string NETworkManager_RepoUrl { - get { - return ResourceManager.GetString("NETworkManager_RepoUrl", resourceCulture); - } - } - /// /// Looks up a localized string similar to https://www.transifex.com/BornToBeRoot/NETworkManager/. /// @@ -169,11 +178,11 @@ public static string NETworkManager_TranslationUrl { } /// - /// Looks up a localized string similar to https://twitter.com/_BornToBeRoot. + /// Looks up a localized string similar to https://x.com/_BornToBeRoot. /// - public static string NETworkManager_TwitterUrl { + public static string NETworkManager_XContactUrl { get { - return ResourceManager.GetString("NETworkManager_TwitterUrl", resourceCulture); + return ResourceManager.GetString("NETworkManager_XContactUrl", resourceCulture); } } } diff --git a/Source/NETworkManager/Properties/Resources.resx b/Source/NETworkManager/Properties/Resources.resx index a0c7f0dfa1..2091375921 100644 --- a/Source/NETworkManager/Properties/Resources.resx +++ b/Source/NETworkManager/Properties/Resources.resx @@ -112,16 +112,19 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 https://developer.microsoft.com/en-us/microsoft-edge/webview2/ - https://github.com/BornToBeRoot/NETworkManager/blob/master/Contributors.md + https://github.com/BornToBeRoot/NETworkManager/blob/main/CONTRIBUTORS.md + + + https://github.com/BornToBeRoot/NETworkManager#-donate NETworkManager @@ -136,9 +139,9 @@ GNU General Public License v3.0 - https://github.com/BornToBeRoot/NETworkManager/blob/master/LICENSE + https://github.com/BornToBeRoot/NETworkManager/blob/main/LICENSE - + https://github.com/BornToBeRoot/NETworkManager/issues/new/choose @@ -147,13 +150,13 @@ https://borntoberoot.net/NETworkManager/ - + https://github.com/BornToBeRoot/NETworkManager https://www.transifex.com/BornToBeRoot/NETworkManager/ - - https://twitter.com/_BornToBeRoot + + https://x.com/_BornToBeRoot \ No newline at end of file diff --git a/Source/NETworkManager/Resources/ContextMenu/ContextMenu.xaml b/Source/NETworkManager/Resources/ContextMenu/ContextMenu.xaml index feb27e9c1e..096157919f 100644 --- a/Source/NETworkManager/Resources/ContextMenu/ContextMenu.xaml +++ b/Source/NETworkManager/Resources/ContextMenu/ContextMenu.xaml @@ -22,7 +22,7 @@ @@ -30,13 +30,13 @@ - + @@ -47,13 +47,13 @@ - + @@ -70,7 +70,7 @@ @@ -78,17 +78,17 @@ - + - + diff --git a/Source/NETworkManager/Resources/Maps/world-cities.json b/Source/NETworkManager/Resources/Maps/world-cities.json new file mode 100644 index 0000000000..a1fb546b9d --- /dev/null +++ b/Source/NETworkManager/Resources/Maps/world-cities.json @@ -0,0 +1 @@ +[{"n":"Vatican City","lat":41.9,"lon":12.45},{"n":"Bari","lat":41.11,"lon":16.87},{"n":"Rouen","lat":49.43,"lon":1.08},{"n":"San Marino","lat":43.92,"lon":12.47},{"n":"Vaduz","lat":47.13,"lon":9.52},{"n":"Edinburgh","lat":55.95,"lon":-3.22},{"n":"Cardiff","lat":51.5,"lon":-3.23},{"n":"Luxembourg","lat":49.61,"lon":6.13},{"n":"Turin","lat":45.07,"lon":7.67},{"n":"Matsuyama","lat":33.85,"lon":132.77},{"n":"Toulouse","lat":43.62,"lon":1.45},{"n":"Lille","lat":50.65,"lon":3.08},{"n":"Genoa","lat":44.41,"lon":8.93},{"n":"Palikir","lat":6.92,"lon":158.15},{"n":"Majuro","lat":7.1,"lon":171.38},{"n":"Funafuti","lat":-8.52,"lon":179.22},{"n":"Melekeok","lat":7.49,"lon":134.63},{"n":"Monaco","lat":43.74,"lon":7.41},{"n":"Tarawa","lat":1.34,"lon":173.02},{"n":"Moroni","lat":-11.7,"lon":43.24},{"n":"Macau","lat":22.2,"lon":113.55},{"n":"Andorra","lat":42.5,"lon":1.52},{"n":"San Bernardino","lat":34.12,"lon":-117.3},{"n":"Bridgeport","lat":41.18,"lon":-73.2},{"n":"Rochester","lat":43.17,"lon":-77.62},{"n":"Manchester","lat":53.5,"lon":-2.25},{"n":"Gujranwala","lat":32.16,"lon":74.19},{"n":"Incheon","lat":37.48,"lon":126.64},{"n":"Benin City","lat":6.34,"lon":5.62},{"n":"Xiamen","lat":24.45,"lon":118.08},{"n":"Nanchong","lat":30.78,"lon":106.13},{"n":"Neijiang","lat":29.58,"lon":105.05},{"n":"Nanyang","lat":33.0,"lon":112.53},{"n":"Jinxi","lat":40.75,"lon":120.83},{"n":"Yantai","lat":37.53,"lon":121.4},{"n":"Zaozhuang","lat":34.88,"lon":117.57},{"n":"Suzhou","lat":31.3,"lon":120.62},{"n":"Xuzhou","lat":34.28,"lon":117.18},{"n":"Wuxi","lat":31.58,"lon":120.3},{"n":"Jilin","lat":43.85,"lon":126.55},{"n":"Chandigarh","lat":30.72,"lon":76.78},{"n":"Jammu","lat":32.71,"lon":74.85},{"n":"Sholapur","lat":17.67,"lon":75.9},{"n":"Aurangabad","lat":19.9,"lon":75.32},{"n":"Nasik","lat":20.0,"lon":73.78},{"n":"Jullundur","lat":31.33,"lon":75.57},{"n":"Allahabad","lat":25.45,"lon":81.84},{"n":"Moradabad","lat":28.84,"lon":78.76},{"n":"Ghaziabad","lat":28.66,"lon":77.41},{"n":"Agra","lat":27.17,"lon":78.02},{"n":"Aligarh","lat":27.89,"lon":78.06},{"n":"Meerut","lat":29.0,"lon":77.7},{"n":"Dhanbad","lat":23.8,"lon":86.42},{"n":"Gwalior","lat":26.23,"lon":78.18},{"n":"Vadodara","lat":22.31,"lon":73.18},{"n":"Rajkot","lat":22.31,"lon":70.8},{"n":"St. Paul","lat":44.94,"lon":-93.08},{"n":"Vancouver","lat":45.63,"lon":-122.64},{"n":"Tucson","lat":32.2,"lon":-110.89},{"n":"Fresno","lat":36.75,"lon":-119.77},{"n":"Albuquerque","lat":35.1,"lon":-106.64},{"n":"Kansas City","lat":39.11,"lon":-94.6},{"n":"Tulsa","lat":36.12,"lon":-95.93},{"n":"Ft. Worth","lat":32.74,"lon":-97.34},{"n":"Austin","lat":30.27,"lon":-97.74},{"n":"El Paso","lat":31.78,"lon":-106.51},{"n":"Orlando","lat":28.51,"lon":-81.38},{"n":"Jacksonville","lat":30.33,"lon":-81.67},{"n":"Indianapolis","lat":39.75,"lon":-86.17},{"n":"Knoxville","lat":35.97,"lon":-83.92},{"n":"Richmond","lat":37.55,"lon":-77.45},{"n":"Baltimore","lat":39.3,"lon":-76.62},{"n":"Syracuse","lat":43.05,"lon":-76.15},{"n":"Port-of-Spain","lat":10.65,"lon":-61.52},{"n":"Taizz","lat":13.6,"lon":44.04},{"n":"Lvov","lat":49.83,"lon":24.03},{"n":"Odessa","lat":46.49,"lon":30.71},{"n":"Dnipro","lat":48.48,"lon":35.0},{"n":"Donetsk","lat":48.0,"lon":37.83},{"n":"Kharkiv","lat":50.0,"lon":36.25},{"n":"Andijon","lat":40.79,"lon":72.34},{"n":"Haiphong","lat":20.83,"lon":106.68},{"n":"Da Nang","lat":16.06,"lon":108.25},{"n":"Douala","lat":4.06,"lon":9.71},{"n":"Birmingham","lat":52.47,"lon":-1.92},{"n":"İzmir","lat":38.44,"lon":27.15},{"n":"Bursa","lat":40.2,"lon":29.07},{"n":"Samsun","lat":41.28,"lon":36.34},{"n":"Konya","lat":37.88,"lon":32.48},{"n":"Adana","lat":36.99,"lon":35.32},{"n":"Kigali","lat":-1.95,"lon":30.06},{"n":"Mbabane","lat":-26.32,"lon":31.13},{"n":"Arequipa","lat":-16.42,"lon":-71.53},{"n":"Bilbao","lat":43.25,"lon":-2.93},{"n":"Medina","lat":24.5,"lon":39.58},{"n":"Tabuk","lat":28.38,"lon":36.55},{"n":"Omdurman","lat":15.62,"lon":32.48},{"n":"The Hague","lat":52.08,"lon":4.27},{"n":"Ljubljana","lat":46.06,"lon":14.51},{"n":"Bratislava","lat":48.15,"lon":17.12},{"n":"Doha","lat":25.29,"lon":51.53},{"n":"Quetta","lat":30.22,"lon":67.02},{"n":"Podgorica","lat":42.47,"lon":19.27},{"n":"Yaroslavl","lat":57.62,"lon":39.87},{"n":"Rostov","lat":47.23,"lon":39.71},{"n":"Krasnodar","lat":45.02,"lon":39.0},{"n":"Penza","lat":53.18,"lon":45.0},{"n":"Ryazan","lat":54.62,"lon":39.72},{"n":"Voronezh","lat":51.73,"lon":39.27},{"n":"Chelyabinsk","lat":55.15,"lon":61.44},{"n":"Astrakhan","lat":46.35,"lon":48.05},{"n":"Orenburg","lat":51.78,"lon":55.11},{"n":"Saratov","lat":51.58,"lon":46.03},{"n":"Ulyanovsk","lat":54.33,"lon":48.41},{"n":"Omsk","lat":54.99,"lon":73.4},{"n":"Tyumen","lat":57.14,"lon":65.53},{"n":"Novokuznetsk","lat":53.75,"lon":87.11},{"n":"Daejeon","lat":36.34,"lon":127.43},{"n":"Gwangju","lat":35.17,"lon":126.91},{"n":"Busan","lat":35.1,"lon":129.01},{"n":"Zamboanga","lat":6.92,"lon":122.08},{"n":"General Santos","lat":6.11,"lon":125.17},{"n":"Khabarovsk","lat":48.45,"lon":135.12},{"n":"Mexicali","lat":32.65,"lon":-115.48},{"n":"Torreón","lat":25.57,"lon":-103.42},{"n":"Culiacán","lat":24.83,"lon":-107.38},{"n":"Hermosillo","lat":29.1,"lon":-110.95},{"n":"San Luis Potosí","lat":22.17,"lon":-101.0},{"n":"Matamoros","lat":25.88,"lon":-97.5},{"n":"Oaxaca","lat":17.08,"lon":-96.67},{"n":"León","lat":21.15,"lon":-101.7},{"n":"Maiduguri","lat":11.85,"lon":13.16},{"n":"Port Harcourt","lat":4.81,"lon":7.01},{"n":"Ibadan","lat":7.38,"lon":3.93},{"n":"Ogbomosho","lat":8.13,"lon":4.24},{"n":"Warri","lat":5.52,"lon":5.76},{"n":"Kaduna","lat":10.52,"lon":7.44},{"n":"Gdańsk","lat":54.36,"lon":18.64},{"n":"Kraków","lat":50.06,"lon":19.96},{"n":"Bern","lat":46.92,"lon":7.47},{"n":"Florence","lat":43.78,"lon":11.25},{"n":"Catania","lat":37.5,"lon":15.08},{"n":"Pristina","lat":42.67,"lon":21.17},{"n":"Banda Aceh","lat":5.55,"lon":95.32},{"n":"George Town","lat":5.41,"lon":100.33},{"n":"Tianshui","lat":34.6,"lon":105.92},{"n":"Yulin","lat":22.63,"lon":110.15},{"n":"Lupanshui","lat":26.59,"lon":104.83},{"n":"Quanzhou","lat":24.9,"lon":118.58},{"n":"Hefei","lat":31.85,"lon":117.28},{"n":"Suzhou","lat":33.64,"lon":116.98},{"n":"Zhanjiang","lat":21.2,"lon":110.38},{"n":"Shaoguan","lat":24.8,"lon":113.58},{"n":"Kuching","lat":1.53,"lon":110.33},{"n":"Surakarta","lat":-7.56,"lon":110.83},{"n":"Bandar Lampung","lat":-5.43,"lon":105.27},{"n":"Malang","lat":-7.98,"lon":112.61},{"n":"Santiago de Cuba","lat":20.03,"lon":-75.82},{"n":"Santiago","lat":19.5,"lon":-70.67},{"n":"Barranquilla","lat":10.96,"lon":-74.8},{"n":"Roseau","lat":15.3,"lon":-61.39},{"n":"Suez","lat":30.0,"lon":32.55},{"n":"Bur Said","lat":31.26,"lon":32.29},{"n":"Kisangani","lat":0.52,"lon":25.22},{"n":"Djibouti","lat":11.6,"lon":43.15},{"n":"Dresden","lat":51.05,"lon":13.75},{"n":"Ankang","lat":32.68,"lon":109.02},{"n":"Yueyang","lat":29.38,"lon":113.1},{"n":"Hengyang","lat":26.88,"lon":112.59},{"n":"Mianyang","lat":31.47,"lon":104.77},{"n":"Baoshan","lat":25.12,"lon":99.15},{"n":"Shijianzhuang","lat":38.05,"lon":114.48},{"n":"Handan","lat":36.58,"lon":114.48},{"n":"Anshan","lat":41.12,"lon":122.94},{"n":"Dalian","lat":38.92,"lon":121.63},{"n":"Qingdao","lat":36.09,"lon":120.33},{"n":"Linyi","lat":35.08,"lon":118.33},{"n":"Huaiyin","lat":33.58,"lon":119.03},{"n":"Wenzhou","lat":28.02,"lon":120.65},{"n":"Ningbo","lat":29.88,"lon":121.55},{"n":"Fukuoka","lat":33.6,"lon":130.41},{"n":"Naha","lat":26.21,"lon":127.67},{"n":"Tongliao","lat":43.62,"lon":122.27},{"n":"Hohhot","lat":40.82,"lon":111.66},{"n":"Chifeng","lat":42.27,"lon":118.95},{"n":"Jiamusi","lat":46.83,"lon":130.35},{"n":"Daqing","lat":46.58,"lon":125.0},{"n":"Jixi","lat":45.3,"lon":130.97},{"n":"Nagoya","lat":35.15,"lon":136.91},{"n":"Nagano","lat":36.65,"lon":138.17},{"n":"Kyoto","lat":35.03,"lon":135.75},{"n":"Sendai","lat":38.29,"lon":141.02},{"n":"Kananga","lat":-5.89,"lon":22.4},{"n":"Mbuji-Mayi","lat":-6.15,"lon":23.6},{"n":"Blantyre","lat":-15.79,"lon":34.99},{"n":"Quetzaltenango","lat":14.83,"lon":-91.52},{"n":"Banjul","lat":13.45,"lon":-16.59},{"n":"Faridabad","lat":28.43,"lon":77.32},{"n":"Srinagar","lat":34.1,"lon":74.82},{"n":"Vijayawada","lat":16.52,"lon":80.63},{"n":"Thiruvananthapuram","lat":8.5,"lon":76.95},{"n":"Kochi","lat":10.02,"lon":76.22},{"n":"Cuttack","lat":20.47,"lon":85.89},{"n":"Hubli","lat":15.36,"lon":75.13},{"n":"Mangalore","lat":12.9,"lon":74.85},{"n":"Mysore","lat":12.31,"lon":76.66},{"n":"Kolhapur","lat":16.7,"lon":74.22},{"n":"Nanded","lat":19.17,"lon":77.3},{"n":"Akola","lat":20.71,"lon":77.01},{"n":"Guwahati","lat":26.16,"lon":91.77},{"n":"Bordeaux","lat":44.85,"lon":-0.6},{"n":"Marseille","lat":43.29,"lon":5.38},{"n":"Skopje","lat":42.0,"lon":21.43},{"n":"Kirkuk","lat":35.47,"lon":44.39},{"n":"Mosul","lat":36.35,"lon":43.15},{"n":"An Najaf","lat":32.0,"lon":44.34},{"n":"Ahvaz","lat":31.28,"lon":48.72},{"n":"Basra","lat":30.51,"lon":47.81},{"n":"Hamadan","lat":34.8,"lon":48.52},{"n":"Tabriz","lat":38.09,"lon":46.3},{"n":"Ludhiana","lat":30.93,"lon":75.87},{"n":"Kota","lat":25.18,"lon":75.83},{"n":"Jodhpur","lat":26.29,"lon":73.02},{"n":"Lucknow","lat":26.86,"lon":80.91},{"n":"Ranchi","lat":23.37,"lon":85.33},{"n":"Raipur","lat":21.23,"lon":81.64},{"n":"Jabalpur","lat":23.18,"lon":79.96},{"n":"Indore","lat":22.72,"lon":75.87},{"n":"Salem","lat":11.67,"lon":78.18},{"n":"Tiruchirappalli","lat":10.81,"lon":78.69},{"n":"Pointe-Noire","lat":-4.77,"lon":11.88},{"n":"Bouaké","lat":7.69,"lon":-5.03},{"n":"São Luís","lat":-2.52,"lon":-44.27},{"n":"Belo Horizonte","lat":-19.92,"lon":-43.92},{"n":"Uberlândia","lat":-18.9,"lon":-48.28},{"n":"Cuiabá","lat":-15.57,"lon":-56.08},{"n":"Teresina","lat":-5.1,"lon":-42.78},{"n":"Maceió","lat":-9.62,"lon":-35.73},{"n":"Vila Velha","lat":-20.37,"lon":-40.32},{"n":"Natal","lat":-5.78,"lon":-35.24},{"n":"Salta","lat":-24.78,"lon":-65.42},{"n":"Tucumán","lat":-26.82,"lon":-65.22},{"n":"Rosario","lat":-32.95,"lon":-60.67},{"n":"Campinas","lat":-22.9,"lon":-47.1},{"n":"Sorocaba","lat":-23.49,"lon":-47.47},{"n":"Ribeirão Preto","lat":-21.17,"lon":-47.83},{"n":"Bridgetown","lat":13.1,"lon":-59.62},{"n":"Annaba","lat":36.92,"lon":7.76},{"n":"Constantine","lat":36.36,"lon":6.6},{"n":"Khulna","lat":22.84,"lon":89.56},{"n":"Gold Coast","lat":-28.08,"lon":153.45},{"n":"Rajshahi","lat":24.37,"lon":88.61},{"n":"Mandalay","lat":21.97,"lon":96.09},{"n":"Bujumbura","lat":-3.38,"lon":29.36},{"n":"Kingstown","lat":13.15,"lon":-61.21},{"n":"Castries","lat":14.0,"lon":-61.0},{"n":"Basseterre","lat":17.3,"lon":-62.72},{"n":"Port Louis","lat":-20.17,"lon":57.5},{"n":"Gaza","lat":31.53,"lon":34.45},{"n":"Saint George's","lat":12.05,"lon":-61.74},{"n":"Manama","lat":26.24,"lon":50.58},{"n":"Saint John's","lat":17.12,"lon":-61.85},{"n":"Taichung","lat":24.15,"lon":120.68},{"n":"Kozhikode","lat":11.25,"lon":75.77},{"n":"Bhubaneshwar","lat":20.27,"lon":85.83},{"n":"Jamshedpur","lat":22.79,"lon":86.2},{"n":"Montevideo","lat":-34.86,"lon":-56.17},{"n":"San Jose","lat":37.3,"lon":-121.85},{"n":"Sacramento","lat":38.58,"lon":-121.47},{"n":"Las Vegas","lat":36.21,"lon":-115.22},{"n":"Portland","lat":45.52,"lon":-122.68},{"n":"Salt Lake City","lat":40.78,"lon":-111.93},{"n":"Omaha","lat":41.24,"lon":-96.01},{"n":"Oklahoma City","lat":35.47,"lon":-97.52},{"n":"San Antonio","lat":29.49,"lon":-98.51},{"n":"Valencia","lat":10.23,"lon":-67.98},{"n":"Raleigh","lat":35.82,"lon":-78.64},{"n":"Cleveland","lat":41.47,"lon":-81.69},{"n":"Cincinnati","lat":39.16,"lon":-84.46},{"n":"Nashville","lat":36.17,"lon":-86.78},{"n":"Memphis","lat":35.12,"lon":-90.0},{"n":"Norfolk","lat":36.85,"lon":-76.28},{"n":"Milwaukee","lat":43.05,"lon":-87.92},{"n":"Buffalo","lat":42.88,"lon":-78.88},{"n":"Pittsburgh","lat":40.43,"lon":-80.0},{"n":"Ciudad Guayana","lat":8.37,"lon":-62.62},{"n":"Lomé","lat":6.13,"lon":1.22},{"n":"Tunis","lat":36.8,"lon":10.18},{"n":"Abu Dhabi","lat":24.47,"lon":54.37},{"n":"Ashgabat","lat":37.95,"lon":58.38},{"n":"Samarqand","lat":39.67,"lon":66.94},{"n":"Lusaka","lat":-15.42,"lon":28.28},{"n":"Harare","lat":-17.82,"lon":31.04},{"n":"Bulawayo","lat":-20.17,"lon":28.58},{"n":"Dili","lat":-8.56,"lon":125.58},{"n":"Port Vila","lat":-17.73,"lon":168.32},{"n":"Tegucigalpa","lat":14.1,"lon":-87.22},{"n":"Georgetown","lat":6.8,"lon":-58.17},{"n":"Reykjavík","lat":64.15,"lon":-21.95},{"n":"Port-au-Prince","lat":18.54,"lon":-72.34},{"n":"Glasgow","lat":55.87,"lon":-4.25},{"n":"Kampala","lat":0.32,"lon":32.58},{"n":"Aden","lat":12.78,"lon":45.01},{"n":"Paramaribo","lat":5.84,"lon":-55.17},{"n":"Seville","lat":37.41,"lon":-5.98},{"n":"Niamey","lat":13.52,"lon":2.12},{"n":"Dushanbe","lat":38.56,"lon":68.77},{"n":"Trujillo","lat":-8.12,"lon":-79.02},{"n":"Asunción","lat":-25.3,"lon":-57.64},{"n":"Managua","lat":12.15,"lon":-86.27},{"n":"Freetown","lat":8.47,"lon":-13.23},{"n":"Islamabad","lat":33.7,"lon":73.17},{"n":"Multan","lat":30.2,"lon":71.46},{"n":"Hyderabad","lat":25.38,"lon":68.37},{"n":"Peshawar","lat":34.01,"lon":71.54},{"n":"Kathmandu","lat":27.72,"lon":85.32},{"n":"Bloemfontein","lat":-29.12,"lon":26.23},{"n":"Pretoria","lat":-25.71,"lon":28.23},{"n":"Port Moresby","lat":-9.46,"lon":147.19},{"n":"Honiara","lat":-9.44,"lon":159.95},{"n":"Panama City","lat":8.97,"lon":-79.53},{"n":"Fez","lat":34.05,"lon":-5.0},{"n":"Rabat","lat":34.03,"lon":-6.84},{"n":"Marrakesh","lat":31.63,"lon":-8.0},{"n":"Chișinău","lat":47.01,"lon":28.86},{"n":"Beira","lat":-19.82,"lon":34.87},{"n":"Port Elizabeth","lat":-33.97,"lon":25.6},{"n":"Maputo","lat":-25.96,"lon":32.59},{"n":"Tomsk","lat":56.49,"lon":84.98},{"n":"Nizhny Novgorod","lat":56.33,"lon":44.0},{"n":"Volgograd","lat":48.71,"lon":44.5},{"n":"Ufa","lat":54.79,"lon":56.04},{"n":"Yekaterinburg","lat":56.85,"lon":60.6},{"n":"Samara","lat":53.2,"lon":50.15},{"n":"Kazan","lat":55.75,"lon":49.13},{"n":"Barnaul","lat":53.35,"lon":83.75},{"n":"Novosibirsk","lat":55.03,"lon":82.96},{"n":"Mogadishu","lat":2.07,"lon":45.37},{"n":"Muscat","lat":23.61,"lon":58.59},{"n":"Colombo","lat":6.93,"lon":79.86},{"n":"Cebu","lat":10.32,"lon":123.9},{"n":"Davao","lat":7.11,"lon":125.63},{"n":"Irkutsk","lat":52.32,"lon":104.25},{"n":"Krasnoyarsk","lat":56.01,"lon":92.87},{"n":"Vladivostok","lat":43.13,"lon":131.91},{"n":"Tijuana","lat":32.5,"lon":-117.08},{"n":"Chihuahua","lat":28.64,"lon":-106.08},{"n":"Tampico","lat":22.3,"lon":-97.87},{"n":"Acapulco","lat":16.85,"lon":-99.92},{"n":"Veracruz","lat":19.18,"lon":-96.16},{"n":"Cancún","lat":21.17,"lon":-86.83},{"n":"Mérida","lat":20.97,"lon":-89.62},{"n":"Enugu","lat":6.45,"lon":7.5},{"n":"Sokoto","lat":13.06,"lon":5.24},{"n":"Perm","lat":58.0,"lon":56.25},{"n":"Ulaanbaatar","lat":47.92,"lon":106.92},{"n":"Windhoek","lat":-22.57,"lon":17.08},{"n":"Valencia","lat":39.49,"lon":-0.4},{"n":"Abuja","lat":9.08,"lon":7.53},{"n":"Padang","lat":-0.96,"lon":100.36},{"n":"Bissau","lat":11.87,"lon":-15.6},{"n":"Palermo","lat":38.13,"lon":13.35},{"n":"Amman","lat":31.95,"lon":35.93},{"n":"Vilnius","lat":54.68,"lon":25.32},{"n":"Riga","lat":56.95,"lon":24.1},{"n":"Bishkek","lat":42.87,"lon":74.59},{"n":"Xining","lat":36.62,"lon":101.77},{"n":"Guilin","lat":25.28,"lon":110.28},{"n":"Huainan","lat":32.63,"lon":116.98},{"n":"Shantou","lat":23.37,"lon":116.67},{"n":"Mombasa","lat":-4.04,"lon":39.69},{"n":"Maseru","lat":-29.32,"lon":27.48},{"n":"Antananarivo","lat":-18.92,"lon":47.52},{"n":"Semarang","lat":-6.97,"lon":110.42},{"n":"Palembang","lat":-2.98,"lon":104.75},{"n":"Bandjarmasin","lat":-3.33,"lon":114.58},{"n":"Ujungpandang","lat":-5.14,"lon":119.43},{"n":"Lyon","lat":45.77,"lon":4.83},{"n":"Quito","lat":-0.21,"lon":-78.5},{"n":"San José","lat":9.94,"lon":-84.08},{"n":"San Salvador","lat":13.71,"lon":-89.2},{"n":"Kingston","lat":17.98,"lon":-76.77},{"n":"Cartagena","lat":10.4,"lon":-75.51},{"n":"Ndjamena","lat":12.11,"lon":15.05},{"n":"Malabo","lat":3.75,"lon":8.78},{"n":"Luxor","lat":25.7,"lon":32.65},{"n":"Asmara","lat":15.33,"lon":38.93},{"n":"Zagreb","lat":45.8,"lon":16.0},{"n":"Tallinn","lat":59.43,"lon":24.73},{"n":"Kashgar","lat":39.48,"lon":75.97},{"n":"Yinchuan","lat":38.47,"lon":106.27},{"n":"Pingxiang","lat":27.62,"lon":113.85},{"n":"Qiqihar","lat":47.34,"lon":123.99},{"n":"Kikwit","lat":-5.03,"lon":18.85},{"n":"Lubumbashi","lat":-11.68,"lon":27.48},{"n":"Lilongwe","lat":-13.98,"lon":33.78},{"n":"Guatemala","lat":14.62,"lon":-90.53},{"n":"Libreville","lat":0.39,"lon":9.46},{"n":"Vishakhapatnam","lat":17.73,"lon":83.3},{"n":"Suva","lat":-18.13,"lon":178.44},{"n":"Valparaíso","lat":-33.05,"lon":-71.62},{"n":"Concepción","lat":-36.83,"lon":-73.05},{"n":"Nouakchott","lat":18.09,"lon":-15.98},{"n":"Bamako","lat":12.65,"lon":-8.0},{"n":"Banghazi","lat":32.12,"lon":20.07},{"n":"Thessaloniki","lat":40.7,"lon":22.89},{"n":"Beirut","lat":33.87,"lon":35.51},{"n":"Tbilisi","lat":41.73,"lon":44.79},{"n":"Astana","lat":51.18,"lon":71.43},{"n":"Almaty","lat":43.32,"lon":76.92},{"n":"Isfahan","lat":32.7,"lon":51.7},{"n":"Shiraz","lat":29.63,"lon":52.57},{"n":"Amritsar","lat":31.64,"lon":74.87},{"n":"Varanasi","lat":25.33,"lon":83.0},{"n":"Asansol","lat":23.68,"lon":86.98},{"n":"Bhilai","lat":21.22,"lon":81.43},{"n":"Bhopal","lat":23.25,"lon":77.41},{"n":"Madurai","lat":9.92,"lon":78.12},{"n":"Coimbatore","lat":11.0,"lon":76.95},{"n":"Vientiane","lat":17.97,"lon":102.6},{"n":"Brazzaville","lat":-4.26,"lon":15.28},{"n":"Conakry","lat":9.53,"lon":-13.68},{"n":"Yamoussoukro","lat":6.82,"lon":-5.28},{"n":"Manaus","lat":-3.1,"lon":-60.0},{"n":"Campo Grande","lat":-20.45,"lon":-54.62},{"n":"Florianópolis","lat":-27.58,"lon":-48.52},{"n":"Winnipeg","lat":49.88,"lon":-97.17},{"n":"Calgary","lat":51.08,"lon":-114.08},{"n":"Ottawa","lat":45.42,"lon":-75.7},{"n":"Québec","lat":46.84,"lon":-71.25},{"n":"Belgrade","lat":44.82,"lon":20.47},{"n":"Bandar Seri Begawan","lat":4.88,"lon":114.93},{"n":"Mendoza","lat":-32.88,"lon":-68.82},{"n":"Sucre","lat":-19.04,"lon":-65.26},{"n":"Mar del Plata","lat":-38.0,"lon":-57.58},{"n":"Córdoba","lat":-31.4,"lon":-64.18},{"n":"Belmopan","lat":17.25,"lon":-88.77},{"n":"Bangui","lat":4.37,"lon":18.56},{"n":"Yaounde","lat":3.87,"lon":11.52},{"n":"Tirana","lat":41.33,"lon":19.82},{"n":"Yerevan","lat":40.18,"lon":44.51},{"n":"Baku","lat":40.4,"lon":49.86},{"n":"Kandahar","lat":31.61,"lon":65.69},{"n":"Phnom Penh","lat":11.55,"lon":104.92},{"n":"Huambo","lat":-12.75,"lon":15.76},{"n":"La Paz","lat":-16.5,"lon":-68.15},{"n":"Santa Cruz","lat":-17.75,"lon":-63.23},{"n":"Oran","lat":35.71,"lon":-0.62},{"n":"Cotonou","lat":6.4,"lon":2.52},{"n":"Sofia","lat":42.68,"lon":23.32},{"n":"Minsk","lat":53.9,"lon":27.57},{"n":"Thimphu","lat":27.47,"lon":89.64},{"n":"Gaborone","lat":-24.65,"lon":25.91},{"n":"Canberra","lat":-35.28,"lon":149.13},{"n":"Newcastle","lat":-32.85,"lon":151.82},{"n":"Adelaide","lat":-34.93,"lon":138.6},{"n":"Brisbane","lat":-27.46,"lon":153.04},{"n":"Ouagadougou","lat":12.37,"lon":-1.52},{"n":"Sarajevo","lat":43.85,"lon":18.38},{"n":"Naypyidaw","lat":19.77,"lon":96.12},{"n":"San Juan","lat":18.44,"lon":-66.13},{"n":"Hamilton","lat":32.29,"lon":-64.78},{"n":"Nukualofa","lat":-21.14,"lon":-175.22},{"n":"Hargeysa","lat":9.56,"lon":44.07},{"n":"Victoria","lat":-4.62,"lon":55.45},{"n":"São Tomé","lat":0.33,"lon":6.73},{"n":"Apia","lat":-13.84,"lon":-171.74},{"n":"Valletta","lat":35.9,"lon":14.51},{"n":"Malé","lat":4.17,"lon":73.5},{"n":"Jerusalem","lat":31.78,"lon":35.21},{"n":"Praia","lat":14.92,"lon":-23.52},{"n":"Nassau","lat":25.08,"lon":-77.35},{"n":"Nicosia","lat":35.17,"lon":33.37},{"n":"Kaohsiung","lat":22.63,"lon":120.27},{"n":"Wellington","lat":-41.3,"lon":174.78},{"n":"Shenzhen","lat":22.55,"lon":114.12},{"n":"Zibo","lat":36.8,"lon":118.05},{"n":"Minneapolis","lat":44.98,"lon":-93.25},{"n":"Honolulu","lat":21.31,"lon":-157.86},{"n":"Seattle","lat":47.57,"lon":-122.34},{"n":"Phoenix","lat":33.54,"lon":-112.07},{"n":"San Diego","lat":32.82,"lon":-117.18},{"n":"St. Louis","lat":38.64,"lon":-90.24},{"n":"New Orleans","lat":30.0,"lon":-90.04},{"n":"Dallas","lat":32.82,"lon":-96.84},{"n":"Maracaibo","lat":10.73,"lon":-71.66},{"n":"Boston","lat":42.33,"lon":-71.07},{"n":"Tampa","lat":27.95,"lon":-82.46},{"n":"Philadelphia","lat":40.0,"lon":-75.17},{"n":"Detroit","lat":42.33,"lon":-83.08},{"n":"Hanoi","lat":21.03,"lon":105.85},{"n":"Ho Chi Minh City","lat":10.78,"lon":106.7},{"n":"Ankara","lat":39.93,"lon":32.86},{"n":"Budapest","lat":47.5,"lon":19.08},{"n":"Sanaa","lat":15.35,"lon":44.21},{"n":"Barcelona","lat":41.38,"lon":2.18},{"n":"Bucharest","lat":44.43,"lon":26.1},{"n":"Aleppo","lat":36.23,"lon":37.17},{"n":"Damascus","lat":33.5,"lon":36.3},{"n":"Zürich","lat":47.38,"lon":8.55},{"n":"Lisbon","lat":38.72,"lon":-9.14},{"n":"Khartoum","lat":15.59,"lon":32.53},{"n":"Jeddah","lat":21.52,"lon":39.22},{"n":"Makkah","lat":21.43,"lon":39.82},{"n":"Oslo","lat":59.92,"lon":10.75},{"n":"Lahore","lat":31.56,"lon":74.35},{"n":"Karachi","lat":24.87,"lon":66.99},{"n":"Durban","lat":-29.87,"lon":30.98},{"n":"St. Petersburg","lat":59.94,"lon":30.32},{"n":"Guadalajara","lat":20.67,"lon":-103.33},{"n":"Puebla","lat":19.05,"lon":-98.2},{"n":"Kano","lat":12.0,"lon":8.52},{"n":"Warsaw","lat":52.25,"lon":21.0},{"n":"Pyongyang","lat":39.02,"lon":125.75},{"n":"Dar es Salaam","lat":-6.8,"lon":39.27},{"n":"Medan","lat":3.58,"lon":98.65},{"n":"Dublin","lat":53.33,"lon":-6.25},{"n":"Monrovia","lat":6.31,"lon":-10.8},{"n":"Naples","lat":40.84,"lon":14.25},{"n":"Milan","lat":45.47,"lon":9.21},{"n":"Kuala Lumpur","lat":3.17,"lon":101.7},{"n":"Lanzhou","lat":36.06,"lon":103.79},{"n":"Nanning","lat":22.82,"lon":108.32},{"n":"Guiyang","lat":26.58,"lon":106.72},{"n":"Chongqing","lat":29.56,"lon":106.59},{"n":"Fuzhou","lat":26.08,"lon":119.3},{"n":"Guangzhou","lat":23.14,"lon":113.33},{"n":"Dongguan","lat":23.05,"lon":113.74},{"n":"Bandung","lat":-6.95,"lon":107.57},{"n":"Surabaya","lat":-7.25,"lon":112.75},{"n":"Guayaquil","lat":-2.22,"lon":-79.92},{"n":"Medellín","lat":6.28,"lon":-75.58},{"n":"Cali","lat":3.4,"lon":-76.5},{"n":"Havana","lat":23.13,"lon":-82.36},{"n":"Alexandria","lat":31.2,"lon":29.95},{"n":"Frankfurt","lat":50.1,"lon":8.68},{"n":"Hamburg","lat":53.55,"lon":10.0},{"n":"Munich","lat":48.13,"lon":11.57},{"n":"Prague","lat":50.08,"lon":14.47},{"n":"Kuwait","lat":29.37,"lon":47.98},{"n":"Xian","lat":34.28,"lon":108.89},{"n":"Taiyuan","lat":37.88,"lon":112.55},{"n":"Wuhan","lat":30.58,"lon":114.27},{"n":"Changsha","lat":28.2,"lon":112.97},{"n":"Kunming","lat":25.07,"lon":102.68},{"n":"Zhengzhou","lat":34.75,"lon":113.67},{"n":"Shenyeng","lat":41.8,"lon":123.45},{"n":"Jinan","lat":36.67,"lon":117.0},{"n":"Tianjin","lat":39.13,"lon":117.2},{"n":"Nanchang","lat":28.68,"lon":115.88},{"n":"Nanjing","lat":32.05,"lon":118.78},{"n":"Hangzhou","lat":30.25,"lon":120.17},{"n":"Hiroshima","lat":34.39,"lon":132.44},{"n":"Changchun","lat":43.87,"lon":125.34},{"n":"Baotou","lat":40.65,"lon":109.82},{"n":"Harbin","lat":45.75,"lon":126.65},{"n":"Sapporo","lat":43.07,"lon":141.34},{"n":"Santo Domingo","lat":18.47,"lon":-69.9},{"n":"Accra","lat":5.55,"lon":-0.22},{"n":"Delhi","lat":28.67,"lon":77.23},{"n":"Hyderabad","lat":17.4,"lon":78.48},{"n":"Pune","lat":18.53,"lon":73.85},{"n":"Nagpur","lat":21.17,"lon":79.09},{"n":"Tripoli","lat":32.89,"lon":13.18},{"n":"Tel Aviv-Yafo","lat":32.08,"lon":34.77},{"n":"Helsinki","lat":60.18,"lon":24.93},{"n":"Mashhad","lat":36.27,"lon":59.57},{"n":"Jaipur","lat":26.92,"lon":75.81},{"n":"Kanpur","lat":26.46,"lon":80.32},{"n":"Patna","lat":25.62,"lon":85.13},{"n":"Chennai","lat":13.09,"lon":80.28},{"n":"Ahmedabad","lat":23.03,"lon":72.58},{"n":"Surat","lat":21.2,"lon":72.84},{"n":"København","lat":55.68,"lon":12.56},{"n":"Abidjan","lat":5.32,"lon":-4.04},{"n":"Belém","lat":-1.45,"lon":-48.48},{"n":"Brasília","lat":-15.78,"lon":-47.92},{"n":"Porto Alegre","lat":-30.05,"lon":-51.2},{"n":"Curitiba","lat":-25.42,"lon":-49.32},{"n":"Fortaleza","lat":-3.75,"lon":-38.58},{"n":"Salvador","lat":-12.97,"lon":-38.48},{"n":"Edmonton","lat":53.55,"lon":-113.5},{"n":"Montréal","lat":45.5,"lon":-73.58},{"n":"Goiânia","lat":-16.72,"lon":-49.3},{"n":"Recife","lat":-8.08,"lon":-34.92},{"n":"Brussels","lat":50.83,"lon":4.33},{"n":"Dhaka","lat":23.72,"lon":90.41},{"n":"Luanda","lat":-8.84,"lon":13.23},{"n":"Algiers","lat":36.76,"lon":3.05},{"n":"Chittagong","lat":22.33,"lon":91.8},{"n":"Perth","lat":-31.96,"lon":115.84},{"n":"Rangoon","lat":16.78,"lon":96.17},{"n":"San Francisco","lat":37.74,"lon":-122.46},{"n":"Denver","lat":39.74,"lon":-104.98},{"n":"Houston","lat":29.82,"lon":-95.34},{"n":"Miami","lat":25.79,"lon":-80.22},{"n":"Atlanta","lat":33.83,"lon":-84.4},{"n":"Chicago","lat":41.83,"lon":-87.75},{"n":"Caracas","lat":10.5,"lon":-66.92},{"n":"Kiev","lat":50.43,"lon":30.52},{"n":"Dubai","lat":25.23,"lon":55.28},{"n":"Tashkent","lat":41.31,"lon":69.29},{"n":"Madrid","lat":40.4,"lon":-3.68},{"n":"Geneva","lat":46.21,"lon":6.14},{"n":"Stockholm","lat":59.35,"lon":18.1},{"n":"Bangkok","lat":13.75,"lon":100.52},{"n":"Lima","lat":-12.05,"lon":-77.05},{"n":"Dakar","lat":14.72,"lon":-17.47},{"n":"Johannesburg","lat":-26.17,"lon":28.03},{"n":"Amsterdam","lat":52.35,"lon":4.92},{"n":"Casablanca","lat":33.6,"lon":-7.62},{"n":"Seoul","lat":37.57,"lon":127.0},{"n":"Manila","lat":14.6,"lon":120.98},{"n":"Monterrey","lat":25.67,"lon":-100.33},{"n":"Berlin","lat":52.52,"lon":13.4},{"n":"Ürümqi","lat":43.81,"lon":87.58},{"n":"Chengdu","lat":30.67,"lon":104.07},{"n":"Ōsaka","lat":34.75,"lon":135.46},{"n":"Kinshasa","lat":-4.33,"lon":15.31},{"n":"New Delhi","lat":28.6,"lon":77.2},{"n":"Bangalore","lat":12.97,"lon":77.56},{"n":"Athens","lat":37.98,"lon":23.73},{"n":"Baghdad","lat":33.34,"lon":44.39},{"n":"Addis Ababa","lat":9.03,"lon":38.7},{"n":"Tehran","lat":35.67,"lon":51.42},{"n":"Vancouver","lat":49.27,"lon":-123.12},{"n":"Toronto","lat":43.7,"lon":-79.42},{"n":"Buenos Aires","lat":-34.6,"lon":-58.4},{"n":"Kabul","lat":34.52,"lon":69.18},{"n":"Vienna","lat":48.2,"lon":16.37},{"n":"Melbourne","lat":-37.82,"lon":144.98},{"n":"Taipei","lat":25.04,"lon":121.57},{"n":"Auckland","lat":-36.85,"lon":174.76},{"n":"Los Angeles","lat":33.99,"lon":-118.18},{"n":"Washington, D.C.","lat":38.9,"lon":-77.01},{"n":"New York","lat":40.75,"lon":-73.98},{"n":"London","lat":51.5,"lon":-0.12},{"n":"Istanbul","lat":41.1,"lon":29.01},{"n":"Riyadh","lat":24.64,"lon":46.77},{"n":"Cape Town","lat":-33.92,"lon":18.43},{"n":"Moscow","lat":55.75,"lon":37.62},{"n":"Mexico City","lat":19.44,"lon":-99.13},{"n":"Lagos","lat":6.44,"lon":3.39},{"n":"Rome","lat":41.9,"lon":12.48},{"n":"Beijing","lat":39.93,"lon":116.39},{"n":"Nairobi","lat":-1.28,"lon":36.82},{"n":"Jakarta","lat":-6.17,"lon":106.83},{"n":"Bogota","lat":4.6,"lon":-74.08},{"n":"Cairo","lat":30.05,"lon":31.25},{"n":"Shanghai","lat":31.22,"lon":121.44},{"n":"Tokyo","lat":35.69,"lon":139.75},{"n":"Mumbai","lat":19.02,"lon":72.86},{"n":"Paris","lat":48.87,"lon":2.33},{"n":"Santiago","lat":-33.45,"lon":-70.67},{"n":"Kolkata","lat":22.49,"lon":88.32},{"n":"Rio de Janeiro","lat":-22.93,"lon":-43.23},{"n":"São Paulo","lat":-23.56,"lon":-46.63},{"n":"Sydney","lat":-33.92,"lon":151.19},{"n":"Singapore","lat":1.29,"lon":103.86},{"n":"Hong Kong","lat":22.3,"lon":114.19}] diff --git a/Source/NETworkManager/Resources/Maps/world-map.json b/Source/NETworkManager/Resources/Maps/world-map.json new file mode 100644 index 0000000000..870e91f463 --- /dev/null +++ b/Source/NETworkManager/Resources/Maps/world-map.json @@ -0,0 +1 @@ +[{"n":"Aruba","r":[[[-69.9,12.45],[-69.9,12.42],[-69.94,12.44],[-70.0,12.5],[-70.07,12.55],[-70.05,12.6],[-70.04,12.61],[-69.97,12.57],[-69.91,12.48],[-69.9,12.45]]]},{"n":"Afghanistan","r":[[[74.53,37.03],[74.54,37.02],[74.43,36.98],[74.19,36.9],[74.04,36.83],[74.0,36.82],[73.91,36.85],[73.77,36.89],[73.73,36.89],[73.41,36.88],[73.12,36.87],[72.99,36.85],[72.77,36.84],[72.62,36.83],[72.53,36.8],[72.43,36.77],[72.33,36.74],[72.25,36.73],[72.16,36.7],[72.1,36.63],[71.92,36.53],[71.82,36.49],[71.77,36.43],[71.72,36.43],[71.62,36.44],[71.55,36.38],[71.46,36.29],[71.31,36.17],[71.23,36.12],[71.19,36.04],[71.22,36.0],[71.34,35.94],[71.4,35.88],[71.43,35.83],[71.48,35.71],[71.52,35.6],[71.57,35.55],[71.59,35.46],[71.6,35.41],[71.57,35.37],[71.55,35.33],[71.55,35.29],[71.58,35.25],[71.61,35.21],[71.62,35.18],[71.6,35.15],[71.55,35.1],[71.52,35.05],[71.46,34.97],[71.36,34.91],[71.29,34.87],[71.23,34.78],[71.11,34.68],[71.07,34.6],[71.02,34.55],[70.97,34.53],[70.98,34.49],[71.02,34.43],[71.1,34.37],[71.09,34.27],[71.09,34.2],[71.09,34.12],[71.05,34.05],[70.85,33.98],[70.65,33.95],[70.42,33.95],[70.33,33.96],[70.25,33.98],[69.99,34.05],[69.89,34.01],[69.87,33.9],[70.06,33.72],[70.13,33.62],[70.22,33.45],[70.28,33.37],[70.26,33.29],[70.09,33.2],[69.92,33.11],[69.7,33.09],[69.57,33.06],[69.5,33.02],[69.45,32.83],[69.4,32.76],[69.41,32.68],[69.36,32.59],[69.29,32.53],[69.24,32.43],[69.26,32.25],[69.28,31.94],[69.19,31.84],[69.08,31.74],[68.97,31.67],[68.87,31.63],[68.78,31.65],[68.71,31.71],[68.67,31.76],[68.6,31.8],[68.52,31.79],[68.44,31.75],[68.32,31.77],[68.21,31.81],[68.16,31.8],[68.13,31.76],[68.02,31.68],[67.74,31.55],[67.63,31.54],[67.58,31.51],[67.6,31.45],[67.65,31.41],[67.73,31.38],[67.74,31.34],[67.66,31.31],[67.6,31.28],[67.45,31.23],[67.29,31.22],[67.12,31.24],[67.03,31.3],[66.92,31.31],[66.83,31.26],[66.73,31.19],[66.62,31.05],[66.6,31.02],[66.57,31.0],[66.5,30.96],[66.4,30.91],[66.35,30.8],[66.29,30.61],[66.3,30.5],[66.31,30.32],[66.28,30.19],[66.24,30.11],[66.25,30.04],[66.31,29.97],[66.29,29.92],[66.23,29.87],[66.18,29.84],[65.96,29.78],[65.67,29.7],[65.47,29.65],[65.18,29.58],[65.1,29.56],[64.92,29.55],[64.83,29.56],[64.7,29.57],[64.52,29.56],[64.39,29.54],[64.27,29.51],[64.17,29.46],[64.12,29.41],[64.1,29.39],[63.97,29.43],[63.57,29.5],[62.48,29.41],[62.37,29.43],[62.0,29.53],[61.52,29.67],[61.22,29.75],[60.84,29.86],[61.1,30.13],[61.33,30.36],[61.56,30.6],[61.78,30.83],[61.81,30.91],[61.81,31.07],[61.76,31.29],[61.66,31.38],[61.35,31.42],[61.11,31.45],[60.85,31.48],[60.82,31.5],[60.79,31.66],[60.8,31.73],[60.79,31.88],[60.79,31.99],[60.83,32.17],[60.83,32.25],[60.71,32.6],[60.64,32.79],[60.58,32.99],[60.56,33.06],[60.56,33.14],[60.72,33.32],[60.77,33.36],[60.86,33.46],[60.92,33.51],[60.91,33.54],[60.81,33.56],[60.65,33.56],[60.57,33.59],[60.51,33.64],[60.49,33.71],[60.53,33.84],[60.49,34.09],[60.57,34.22],[60.64,34.31],[60.89,34.32],[60.8,34.42],[60.76,34.48],[60.74,34.49],[60.73,34.52],[60.74,34.54],[60.8,34.55],[60.85,34.59],[60.91,34.63],[60.95,34.65],[60.96,34.71],[60.99,34.75],[61.04,34.8],[61.08,34.86],[61.07,34.92],[61.11,35.0],[61.12,35.05],[61.15,35.09],[61.13,35.16],[61.11,35.21],[61.1,35.27],[61.14,35.29],[61.19,35.31],[61.2,35.36],[61.23,35.42],[61.25,35.47],[61.28,35.51],[61.28,35.55],[61.26,35.62],[61.34,35.63],[61.38,35.59],[61.42,35.55],[61.54,35.46],[61.62,35.43],[61.72,35.42],[61.84,35.43],[61.94,35.45],[61.98,35.44],[62.09,35.38],[62.21,35.29],[62.25,35.25],[62.27,35.19],[62.31,35.17],[62.39,35.23],[62.46,35.25],[62.53,35.24],[62.61,35.23],[62.69,35.26],[62.72,35.27],[62.86,35.35],[62.98,35.41],[63.06,35.45],[63.08,35.57],[63.12,35.64],[63.17,35.68],[63.15,35.73],[63.13,35.77],[63.11,35.82],[63.13,35.85],[63.18,35.86],[63.3,35.86],[63.52,35.91],[63.7,35.97],[63.86,36.01],[63.94,36.02],[64.01,36.01],[64.04,36.03],[64.05,36.07],[64.09,36.11],[64.18,36.15],[64.36,36.23],[64.51,36.34],[64.57,36.43],[64.6,36.55],[64.67,36.75],[64.75,36.96],[64.78,37.06],[64.82,37.13],[64.95,37.19],[65.09,37.24],[65.3,37.25],[65.55,37.25],[65.61,37.37],[65.64,37.47],[65.68,37.52],[65.74,37.56],[65.77,37.57],[65.9,37.51],[66.11,37.41],[66.35,37.37],[66.47,37.34],[66.52,37.35],[66.83,37.37],[67.07,37.33],[67.2,37.24],[67.32,37.21],[67.44,37.26],[67.52,37.27],[67.55,37.24],[67.61,37.22],[67.7,37.23],[67.75,37.2],[67.76,37.17],[67.77,37.14],[67.83,37.06],[67.96,36.97],[68.07,36.95],[68.21,37.02],[68.26,37.01],[68.28,37.04],[68.3,37.09],[68.39,37.14],[68.55,37.18],[68.64,37.22],[68.67,37.26],[68.72,37.27],[68.78,37.26],[68.82,37.27],[68.84,37.3],[68.86,37.32],[68.89,37.33],[68.91,37.33],[68.96,37.33],[69.05,37.27],[69.18,37.16],[69.26,37.11],[69.3,37.12],[69.35,37.15],[69.41,37.21],[69.43,37.29],[69.4,37.4],[69.42,37.49],[69.49,37.55],[69.63,37.59],[69.82,37.61],[69.94,37.6],[69.98,37.57],[70.04,37.55],[70.12,37.54],[70.19,37.58],[70.25,37.66],[70.25,37.77],[70.2,37.89],[70.21,37.92],[70.24,37.94],[70.31,37.98],[70.42,38.08],[70.52,38.19],[70.62,38.33],[70.74,38.42],[70.88,38.46],[71.05,38.42],[71.26,38.31],[71.33,38.17],[71.28,38.01],[71.28,37.92],[71.32,37.9],[71.39,37.91],[71.49,37.93],[71.55,37.93],[71.58,37.91],[71.58,37.86],[71.55,37.8],[71.51,37.6],[71.48,37.44],[71.45,37.27],[71.43,37.13],[71.47,37.02],[71.53,36.85],[71.6,36.73],[71.67,36.7],[71.73,36.68],[71.8,36.69],[71.94,36.77],[72.15,36.9],[72.36,36.98],[72.66,37.03],[72.76,37.17],[72.9,37.27],[73.21,37.41],[73.38,37.46],[73.48,37.47],[73.6,37.45],[73.63,37.44],[73.66,37.43],[73.72,37.42],[73.73,37.38],[73.72,37.33],[73.65,37.29],[73.63,37.26],[73.65,37.24],[73.75,37.23],[73.95,37.28],[74.08,37.32],[74.17,37.33],[74.2,37.37],[74.26,37.42],[74.35,37.42],[74.44,37.4],[74.52,37.38],[74.66,37.39],[74.73,37.36],[74.83,37.29],[74.88,37.24],[74.89,37.23],[74.84,37.23],[74.77,37.25],[74.74,37.29],[74.73,37.29],[74.67,37.27],[74.56,37.24],[74.37,37.16],[74.38,37.14],[74.5,37.06],[74.53,37.03]]]},{"n":"Angola","r":[[[14.4,-5.89],[14.66,-5.89],[14.75,-5.88],[15.09,-5.87],[15.42,-5.87],[15.73,-5.86],[16.06,-5.86],[16.32,-5.87],[16.43,-5.9],[16.54,-5.97],[16.59,-6.03],[16.61,-6.05],[16.64,-6.11],[16.7,-6.16],[16.72,-6.24],[16.7,-6.35],[16.71,-6.47],[16.74,-6.62],[16.81,-6.77],[16.92,-6.93],[16.97,-7.06],[16.95,-7.16],[16.98,-7.26],[17.06,-7.36],[17.12,-7.42],[17.16,-7.46],[17.25,-7.62],[17.41,-7.88],[17.54,-8.08],[17.58,-8.1],[17.64,-8.09],[17.78,-8.07],[17.91,-8.07],[18.01,-8.11],[18.05,-8.1],[18.19,-8.02],[18.33,-8.0],[18.48,-7.97],[18.56,-7.94],[18.65,-7.94],[18.9,-8.0],[18.94,-8.0],[19.14,-8.0],[19.34,-7.97],[19.37,-7.71],[19.37,-7.66],[19.42,-7.56],[19.48,-7.47],[19.49,-7.39],[19.48,-7.28],[19.53,-7.14],[19.66,-7.04],[19.88,-6.99],[20.0,-6.98],[20.19,-6.95],[20.48,-6.92],[20.59,-6.92],[20.6,-6.94],[20.54,-7.12],[20.54,-7.18],[20.56,-7.24],[20.61,-7.28],[20.91,-7.28],[21.19,-7.28],[21.51,-7.3],[21.75,-7.31],[21.78,-7.31],[21.81,-7.33],[21.84,-7.42],[21.83,-7.6],[21.78,-7.87],[21.8,-8.11],[21.9,-8.34],[21.91,-8.69],[21.87,-8.9],[21.83,-9.17],[21.81,-9.47],[21.86,-9.59],[21.95,-9.73],[22.09,-9.86],[22.2,-10.04],[22.27,-10.26],[22.3,-10.4],[22.28,-10.45],[22.28,-10.55],[22.31,-10.69],[22.28,-10.78],[22.2,-10.83],[22.18,-10.89],[22.22,-11.01],[22.23,-11.12],[22.26,-11.16],[22.28,-11.19],[22.31,-11.2],[22.39,-11.16],[22.49,-11.09],[22.56,-11.06],[22.67,-11.06],[22.81,-11.08],[23.08,-11.09],[23.16,-11.07],[23.4,-10.98],[23.46,-10.97],[23.56,-10.98],[23.7,-11.01],[23.83,-11.01],[23.9,-10.98],[23.91,-10.94],[23.93,-10.89],[23.97,-10.87],[23.99,-11.0],[24.01,-11.18],[24.03,-11.32],[24.04,-11.37],[24.05,-11.41],[24.03,-11.44],[24.01,-11.52],[23.99,-11.59],[23.97,-11.64],[23.98,-11.72],[23.97,-11.85],[23.96,-11.99],[23.96,-12.12],[24.0,-12.35],[23.99,-12.42],[23.94,-12.54],[23.91,-12.64],[23.89,-12.74],[23.88,-12.8],[23.97,-12.96],[23.96,-12.99],[23.9,-13.0],[23.84,-13.0],[23.64,-13.0],[23.34,-13.0],[23.04,-13.0],[22.74,-13.0],[22.47,-13.0],[22.21,-13.0],[21.98,-13.0],[21.98,-13.16],[21.98,-13.48],[21.98,-13.8],[21.98,-14.12],[21.98,-14.44],[21.98,-14.76],[21.98,-15.08],[21.98,-15.4],[21.98,-15.72],[21.98,-15.96],[22.04,-16.26],[22.15,-16.6],[22.19,-16.63],[22.31,-16.69],[22.46,-16.82],[22.55,-16.91],[22.72,-17.08],[22.96,-17.29],[23.18,-17.47],[23.38,-17.64],[23.07,-17.7],[22.62,-17.78],[22.32,-17.84],[21.96,-17.91],[21.72,-17.95],[21.42,-18.0],[21.37,-18.0],[21.29,-17.96],[21.11,-17.96],[20.91,-18.01],[20.75,-18.02],[20.63,-18.0],[20.51,-17.95],[20.39,-17.89],[20.19,-17.86],[19.91,-17.88],[19.64,-17.87],[19.38,-17.83],[19.19,-17.81],[19.08,-17.82],[18.96,-17.8],[18.83,-17.77],[18.72,-17.7],[18.59,-17.57],[18.49,-17.44],[18.46,-17.42],[18.43,-17.41],[18.4,-17.4],[18.11,-17.4],[17.84,-17.39],[17.68,-17.39],[17.3,-17.39],[16.91,-17.39],[16.53,-17.39],[16.15,-17.39],[15.77,-17.39],[15.38,-17.39],[15.0,-17.39],[14.62,-17.39],[14.41,-17.39],[14.23,-17.4],[14.02,-17.41],[13.99,-17.4],[13.94,-17.39],[13.9,-17.36],[13.79,-17.29],[13.69,-17.23],[13.56,-17.14],[13.48,-17.04],[13.4,-17.01],[13.28,-16.99],[13.18,-16.97],[13.1,-16.97],[12.96,-17.02],[12.86,-17.06],[12.79,-17.11],[12.66,-17.16],[12.55,-17.21],[12.36,-17.21],[12.32,-17.21],[12.21,-17.21],[12.11,-17.16],[12.01,-17.17],[11.9,-17.23],[11.74,-17.25],[11.78,-16.87],[11.82,-16.7],[11.82,-16.5],[11.8,-15.99],[11.77,-15.92],[11.75,-15.83],[11.85,-15.77],[11.9,-15.72],[11.97,-15.63],[12.02,-15.51],[12.07,-15.25],[12.28,-14.64],[12.38,-14.04],[12.5,-13.76],[12.55,-13.44],[12.9,-13.03],[12.98,-12.78],[13.16,-12.65],[13.42,-12.52],[13.6,-12.29],[13.69,-12.12],[13.79,-11.81],[13.78,-11.49],[13.85,-11.05],[13.83,-10.93],[13.74,-10.76],[13.72,-10.63],[13.63,-10.51],[13.54,-10.42],[13.5,-10.26],[13.33,-10.0],[13.29,-9.83],[13.21,-9.7],[13.2,-9.55],[13.16,-9.39],[13.08,-9.23],[13.0,-9.05],[13.0,-8.99],[13.05,-8.92],[13.09,-8.9],[13.08,-8.93],[13.05,-8.98],[13.05,-9.01],[13.36,-8.69],[13.38,-8.62],[13.37,-8.55],[13.37,-8.47],[13.38,-8.37],[13.09,-7.78],[12.86,-7.23],[12.82,-6.95],[12.52,-6.59],[12.4,-6.35],[12.33,-6.19],[12.28,-6.12],[12.3,-6.09],[12.38,-6.08],[12.55,-6.05],[12.79,-6.0],[13.01,-5.91],[13.07,-5.86],[13.18,-5.86],[13.3,-5.88],[13.35,-5.86],[13.37,-5.86],[13.65,-5.86],[13.76,-5.86],[13.98,-5.86],[14.11,-5.87],[14.19,-5.88],[14.4,-5.89]],[[12.64,-4.53],[12.72,-4.47],[12.8,-4.43],[12.85,-4.43],[12.88,-4.45],[12.97,-4.55],[13.05,-4.62],[13.07,-4.63],[13.06,-4.65],[12.95,-4.7],[12.83,-4.74],[12.67,-4.91],[12.6,-4.98],[12.57,-5.0],[12.5,-5.04],[12.45,-5.07],[12.45,-5.09],[12.49,-5.11],[12.52,-5.15],[12.52,-5.42],[12.5,-5.7],[12.48,-5.72],[12.39,-5.73],[12.26,-5.75],[12.21,-5.76],[12.2,-5.73],[12.16,-5.63],[12.18,-5.54],[12.21,-5.47],[12.18,-5.32],[12.11,-5.2],[12.04,-5.04],[12.02,-5.0],[12.08,-4.95],[12.17,-4.84],[12.2,-4.78],[12.31,-4.77],[12.35,-4.72],[12.37,-4.66],[12.38,-4.62],[12.5,-4.59],[12.64,-4.53]]]},{"n":"Anguilla","r":[[[-63.0,18.22],[-63.16,18.17],[-63.15,18.2],[-63.03,18.27],[-62.98,18.26],[-63.0,18.22]]]},{"n":"Albania","r":[[[20.06,42.55],[20.1,42.52],[20.19,42.43],[20.24,42.34],[20.35,42.31],[20.41,42.27],[20.49,42.22],[20.52,42.17],[20.58,42.01],[20.58,41.92],[20.57,41.87],[20.55,41.86],[20.51,41.71],[20.52,41.63],[20.52,41.57],[20.48,41.55],[20.45,41.52],[20.49,41.39],[20.49,41.34],[20.49,41.27],[20.57,41.13],[20.61,41.08],[20.66,41.06],[20.71,40.93],[20.74,40.91],[20.87,40.92],[20.93,40.9],[20.96,40.87],[20.96,40.85],[20.96,40.78],[20.99,40.72],[21.03,40.66],[21.03,40.62],[21.0,40.56],[20.95,40.49],[20.88,40.47],[20.81,40.45],[20.77,40.39],[20.75,40.33],[20.72,40.29],[20.7,40.25],[20.66,40.15],[20.66,40.12],[20.61,40.08],[20.53,40.07],[20.46,40.07],[20.41,40.05],[20.38,40.02],[20.34,39.99],[20.31,39.98],[20.31,39.95],[20.34,39.89],[20.38,39.84],[20.38,39.8],[20.36,39.79],[20.31,39.8],[20.29,39.78],[20.29,39.74],[20.27,39.7],[20.25,39.68],[20.21,39.65],[20.13,39.66],[20.06,39.7],[20.02,39.71],[20.0,39.71],[20.0,39.8],[19.96,39.87],[19.85,40.04],[19.48,40.21],[19.4,40.28],[19.36,40.35],[19.32,40.41],[19.36,40.41],[19.39,40.39],[19.44,40.38],[19.46,40.41],[19.44,40.47],[19.34,40.62],[19.34,40.66],[19.38,40.79],[19.46,40.93],[19.46,41.11],[19.48,41.24],[19.45,41.32],[19.44,41.42],[19.5,41.56],[19.55,41.6],[19.58,41.64],[19.58,41.79],[19.47,41.86],[19.34,41.87],[19.35,41.92],[19.36,42.0],[19.35,42.02],[19.36,42.07],[19.33,42.13],[19.28,42.17],[19.33,42.25],[19.4,42.34],[19.47,42.42],[19.54,42.49],[19.6,42.57],[19.65,42.63],[19.7,42.65],[19.73,42.63],[19.74,42.61],[19.74,42.53],[19.75,42.5],[19.79,42.48],[19.86,42.49],[19.94,42.51],[20.05,42.55],[20.06,42.55]]]},{"n":"Aland","r":[[[20.61,60.04],[20.6,60.02],[20.52,60.01],[20.49,60.03],[20.41,60.03],[20.4,60.04],[20.43,60.06],[20.49,60.07],[20.57,60.07],[20.61,60.04]],[[19.66,60.19],[19.67,60.16],[19.63,60.17],[19.6,60.16],[19.58,60.14],[19.54,60.14],[19.52,60.18],[19.55,60.24],[19.63,60.25],[19.66,60.19]],[[19.99,60.35],[20.02,60.35],[20.03,60.36],[20.09,60.35],[20.17,60.31],[20.18,60.29],[20.24,60.28],[20.26,60.26],[20.19,60.19],[20.16,60.19],[20.13,60.2],[20.07,60.19],[20.04,60.18],[20.03,60.15],[20.03,60.09],[19.8,60.08],[19.75,60.1],[19.67,60.23],[19.69,60.27],[19.74,60.28],[19.78,60.29],[19.79,60.21],[19.85,60.22],[19.87,60.27],[19.87,60.3],[19.85,60.32],[19.81,60.33],[19.79,60.35],[19.82,60.39],[19.89,60.41],[19.94,60.36],[19.99,60.35]]]},{"n":"Andorra","r":[[[1.49,42.43],[1.45,42.44],[1.43,42.46],[1.43,42.5],[1.42,42.53],[1.41,42.55],[1.43,42.6],[1.46,42.62],[1.5,42.64],[1.57,42.64],[1.71,42.6],[1.74,42.58],[1.74,42.56],[1.71,42.53],[1.71,42.5],[1.68,42.5],[1.59,42.46],[1.53,42.44],[1.49,42.43]]]},{"n":"United Arab Emirates","r":[[[53.93,24.18],[53.93,24.14],[53.83,24.15],[53.8,24.14],[53.72,24.15],[53.63,24.17],[53.69,24.21],[53.83,24.26],[53.89,24.22],[53.93,24.18]],[[52.62,24.29],[52.6,24.28],[52.58,24.34],[52.58,24.35],[52.63,24.38],[52.66,24.33],[52.62,24.29]],[[53.33,24.26],[53.26,24.25],[53.19,24.29],[53.33,24.34],[53.37,24.36],[53.41,24.41],[53.45,24.37],[53.41,24.31],[53.38,24.28],[53.33,24.26]],[[54.47,24.44],[54.46,24.42],[54.43,24.43],[54.36,24.44],[54.33,24.47],[54.38,24.5],[54.4,24.51],[54.43,24.47],[54.47,24.44]],[[56.3,25.65],[56.36,25.57],[56.37,25.02],[56.39,24.98],[56.35,24.97],[56.31,24.93],[56.27,24.87],[56.2,24.83],[56.15,24.8],[56.11,24.75],[56.06,24.74],[56.01,24.8],[55.97,24.86],[55.98,24.87],[56.01,24.88],[56.02,24.91],[56.0,24.95],[55.96,24.97],[55.92,24.97],[55.87,24.95],[55.82,24.91],[55.8,24.87],[55.79,24.78],[55.8,24.68],[55.8,24.64],[55.78,24.58],[55.77,24.49],[55.79,24.42],[55.8,24.38],[55.81,24.35],[55.76,24.24],[55.8,24.22],[55.93,24.22],[55.97,24.14],[55.99,24.09],[55.99,24.06],[55.89,24.04],[55.78,24.02],[55.7,24.02],[55.55,23.99],[55.47,23.94],[55.49,23.91],[55.52,23.89],[55.53,23.82],[55.51,23.72],[55.47,23.63],[55.41,23.52],[55.35,23.39],[55.27,23.19],[55.2,23.03],[55.19,22.92],[55.19,22.85],[55.19,22.7],[55.12,22.62],[55.1,22.62],[55.02,22.63],[55.0,22.63],[54.92,22.64],[54.8,22.66],[54.65,22.68],[54.47,22.7],[54.27,22.72],[54.05,22.75],[53.83,22.78],[53.61,22.8],[53.39,22.83],[53.19,22.85],[53.01,22.88],[52.86,22.9],[52.74,22.91],[52.67,22.92],[52.64,22.92],[52.56,22.93],[52.51,22.99],[52.45,23.05],[52.4,23.12],[52.34,23.18],[52.29,23.25],[52.23,23.31],[52.18,23.38],[52.12,23.45],[52.07,23.51],[52.01,23.58],[51.96,23.64],[51.9,23.71],[51.85,23.77],[51.79,23.84],[51.74,23.9],[51.68,23.97],[51.63,24.04],[51.59,24.08],[51.57,24.13],[51.57,24.26],[51.57,24.29],[51.61,24.34],[51.62,24.3],[51.66,24.25],[51.73,24.26],[51.77,24.25],[51.79,24.07],[51.84,24.01],[51.91,23.99],[52.12,23.97],[52.25,24.0],[52.51,24.11],[52.65,24.15],[53.03,24.15],[53.33,24.1],[53.8,24.07],[53.89,24.08],[54.15,24.17],[54.3,24.25],[54.4,24.28],[54.46,24.36],[54.5,24.46],[54.53,24.53],[54.58,24.56],[54.62,24.62],[54.66,24.72],[54.75,24.81],[55.1,25.04],[55.3,25.24],[55.32,25.3],[55.43,25.39],[55.52,25.5],[55.94,25.79],[56.03,25.92],[56.07,26.05],[56.08,26.06],[56.12,26.07],[56.17,26.05],[56.17,25.95],[56.15,25.85],[56.15,25.75],[56.14,25.69],[56.18,25.64],[56.25,25.63],[56.28,25.63],[56.3,25.65]]]},{"n":"Argentina","r":[[[-64.55,-54.72],[-64.44,-54.74],[-64.22,-54.72],[-64.11,-54.72],[-64.05,-54.73],[-64.03,-54.74],[-63.88,-54.72],[-63.82,-54.73],[-63.83,-54.77],[-63.97,-54.81],[-64.03,-54.79],[-64.32,-54.8],[-64.45,-54.84],[-64.51,-54.84],[-64.64,-54.9],[-64.73,-54.86],[-64.76,-54.83],[-64.69,-54.77],[-64.63,-54.77],[-64.58,-54.75],[-64.55,-54.72]],[[-68.65,-54.85],[-68.65,-54.63],[-68.64,-54.32],[-68.64,-54.05],[-68.64,-53.79],[-68.64,-53.52],[-68.63,-53.24],[-68.63,-52.95],[-68.63,-52.65],[-68.57,-52.69],[-68.34,-52.9],[-68.28,-52.98],[-68.24,-53.08],[-68.33,-53.02],[-68.43,-53.06],[-68.48,-53.11],[-68.52,-53.18],[-68.52,-53.22],[-68.49,-53.26],[-68.39,-53.29],[-68.16,-53.31],[-68.14,-53.32],[-68.01,-53.56],[-67.94,-53.62],[-67.86,-53.66],[-67.68,-53.79],[-67.5,-53.92],[-67.29,-54.05],[-67.07,-54.15],[-66.87,-54.22],[-66.67,-54.31],[-66.46,-54.44],[-66.24,-54.53],[-65.99,-54.6],[-65.75,-54.65],[-65.37,-54.63],[-65.25,-54.64],[-65.18,-54.68],[-65.25,-54.79],[-65.35,-54.88],[-65.47,-54.91],[-65.6,-54.93],[-65.72,-54.93],[-65.84,-54.91],[-65.95,-54.92],[-66.06,-54.96],[-66.17,-54.98],[-66.29,-54.98],[-66.4,-55.01],[-66.51,-55.03],[-66.63,-55.01],[-66.93,-54.92],[-67.13,-54.9],[-67.79,-54.87],[-68.01,-54.85],[-68.22,-54.82],[-68.33,-54.82],[-68.49,-54.84],[-68.62,-54.83],[-68.65,-54.85]],[[-61.88,-39.17],[-61.87,-39.23],[-61.92,-39.23],[-62.04,-39.17],[-62.08,-39.11],[-62.09,-39.09],[-61.97,-39.11],[-61.91,-39.14],[-61.88,-39.17]],[[-60.26,-24.01],[-60.11,-24.01],[-59.89,-24.09],[-59.61,-24.27],[-59.44,-24.39],[-59.37,-24.45],[-59.19,-24.56],[-58.72,-24.79],[-58.52,-24.84],[-58.42,-24.89],[-58.37,-24.96],[-58.31,-24.98],[-58.25,-24.95],[-58.14,-24.98],[-57.96,-25.05],[-57.82,-25.14],[-57.64,-25.33],[-57.59,-25.41],[-57.56,-25.47],[-57.57,-25.53],[-57.63,-25.6],[-57.73,-25.67],[-57.75,-25.7],[-57.76,-25.73],[-57.78,-25.78],[-57.87,-25.91],[-57.89,-25.96],[-57.89,-26.01],[-57.94,-26.05],[-58.08,-26.14],[-58.11,-26.18],[-58.12,-26.22],[-58.14,-26.25],[-58.15,-26.26],[-58.18,-26.31],[-58.2,-26.38],[-58.21,-26.48],[-58.19,-26.59],[-58.19,-26.63],[-58.22,-26.65],[-58.24,-26.68],[-58.25,-26.73],[-58.27,-26.77],[-58.32,-26.8],[-58.33,-26.82],[-58.32,-26.86],[-58.36,-26.89],[-58.44,-26.92],[-58.49,-26.97],[-58.5,-27.03],[-58.55,-27.08],[-58.62,-27.13],[-58.64,-27.2],[-58.6,-27.31],[-58.17,-27.27],[-57.81,-27.32],[-57.39,-27.43],[-57.11,-27.47],[-56.97,-27.44],[-56.87,-27.44],[-56.81,-27.48],[-56.72,-27.49],[-56.6,-27.47],[-56.51,-27.49],[-56.44,-27.55],[-56.37,-27.54],[-56.31,-27.44],[-56.24,-27.37],[-56.16,-27.32],[-56.07,-27.31],[-55.95,-27.33],[-55.86,-27.36],[-55.79,-27.42],[-55.71,-27.41],[-55.63,-27.36],[-55.59,-27.29],[-55.6,-27.21],[-55.56,-27.15],[-55.5,-27.12],[-55.45,-27.07],[-55.43,-27.01],[-55.35,-26.97],[-55.21,-26.96],[-55.14,-26.93],[-55.13,-26.89],[-55.09,-26.84],[-55.01,-26.81],[-54.96,-26.76],[-54.93,-26.7],[-54.89,-26.67],[-54.83,-26.65],[-54.76,-26.53],[-54.68,-26.31],[-54.63,-26.01],[-54.62,-25.58],[-54.54,-25.58],[-54.5,-25.61],[-54.44,-25.62],[-54.38,-25.59],[-54.33,-25.57],[-54.25,-25.57],[-54.21,-25.53],[-54.15,-25.52],[-54.12,-25.55],[-54.09,-25.57],[-54.01,-25.58],[-53.95,-25.65],[-53.89,-25.67],[-53.86,-25.75],[-53.82,-25.96],[-53.75,-26.08],[-53.67,-26.23],[-53.67,-26.29],[-53.71,-26.35],[-53.72,-26.44],[-53.74,-26.67],[-53.75,-26.75],[-53.73,-26.8],[-53.72,-26.88],[-53.76,-26.98],[-53.84,-27.12],[-53.92,-27.16],[-53.94,-27.16],[-54.04,-27.24],[-54.11,-27.27],[-54.16,-27.25],[-54.21,-27.29],[-54.26,-27.38],[-54.33,-27.42],[-54.45,-27.45],[-54.48,-27.46],[-54.55,-27.45],[-54.62,-27.48],[-54.67,-27.53],[-54.72,-27.54],[-54.78,-27.53],[-54.83,-27.55],[-54.88,-27.6],[-54.9,-27.65],[-54.91,-27.71],[-54.96,-27.75],[-55.04,-27.77],[-55.07,-27.8],[-55.06,-27.84],[-55.1,-27.87],[-55.24,-27.9],[-55.35,-27.96],[-55.41,-28.04],[-55.48,-28.09],[-55.58,-28.12],[-55.73,-28.2],[-55.75,-28.26],[-55.69,-28.3],[-55.67,-28.34],[-55.69,-28.38],[-55.73,-28.39],[-55.81,-28.36],[-55.86,-28.35],[-55.89,-28.37],[-55.91,-28.4],[-55.9,-28.44],[-55.93,-28.47],[-55.98,-28.49],[-56.02,-28.52],[-56.03,-28.58],[-56.1,-28.65],[-56.23,-28.74],[-56.32,-28.85],[-56.39,-29.0],[-56.48,-29.09],[-56.57,-29.14],[-56.64,-29.2],[-56.67,-29.29],[-56.77,-29.42],[-56.94,-29.59],[-57.09,-29.72],[-57.22,-29.78],[-57.3,-29.86],[-57.32,-29.94],[-57.41,-30.03],[-57.56,-30.14],[-57.61,-30.19],[-57.65,-30.23],[-57.65,-30.3],[-57.71,-30.38],[-57.83,-30.5],[-57.87,-30.59],[-57.82,-30.71],[-57.81,-30.86],[-57.83,-30.92],[-57.89,-30.94],[-57.9,-30.98],[-57.87,-31.03],[-57.87,-31.1],[-57.89,-31.2],[-57.95,-31.3],[-58.03,-31.42],[-58.05,-31.49],[-58.01,-31.53],[-57.99,-31.58],[-57.99,-31.62],[-58.01,-31.68],[-58.04,-31.77],[-58.1,-31.83],[-58.17,-31.87],[-58.19,-31.92],[-58.16,-31.99],[-58.16,-32.05],[-58.18,-32.12],[-58.16,-32.18],[-58.12,-32.25],[-58.12,-32.32],[-58.2,-32.47],[-58.22,-32.56],[-58.17,-32.96],[-58.2,-33.01],[-58.25,-33.08],[-58.31,-33.08],[-58.38,-33.07],[-58.42,-33.11],[-58.45,-33.29],[-58.55,-33.66],[-58.53,-33.75],[-58.46,-33.9],[-58.43,-33.99],[-58.41,-34.06],[-58.39,-34.19],[-58.44,-34.25],[-58.48,-34.26],[-58.53,-34.3],[-58.47,-34.46],[-58.42,-34.53],[-58.28,-34.68],[-57.76,-34.89],[-57.55,-35.02],[-57.3,-35.19],[-57.17,-35.36],[-57.16,-35.51],[-57.35,-35.72],[-57.38,-35.9],[-57.34,-36.03],[-57.26,-36.14],[-57.08,-36.3],[-56.94,-36.35],[-56.75,-36.35],[-56.72,-36.39],[-56.7,-36.43],[-56.67,-36.74],[-56.67,-36.85],[-56.73,-36.96],[-57.09,-37.45],[-57.4,-37.74],[-57.51,-37.91],[-57.55,-38.09],[-57.65,-38.17],[-58.18,-38.44],[-59.01,-38.67],[-59.68,-38.8],[-59.83,-38.84],[-60.9,-38.97],[-61.11,-38.99],[-61.38,-38.98],[-61.6,-39.0],[-61.85,-38.96],[-62.07,-38.92],[-62.19,-38.81],[-62.33,-38.8],[-62.37,-38.85],[-62.3,-38.99],[-62.34,-39.15],[-62.3,-39.24],[-62.21,-39.26],[-62.13,-39.31],[-62.05,-39.37],[-62.18,-39.38],[-62.13,-39.43],[-62.08,-39.46],[-62.08,-39.57],[-62.13,-39.83],[-62.25,-39.88],[-62.29,-39.9],[-62.32,-39.95],[-62.4,-40.2],[-62.43,-40.36],[-62.39,-40.46],[-62.25,-40.67],[-62.3,-40.81],[-62.4,-40.89],[-62.8,-41.05],[-62.96,-41.11],[-63.21,-41.15],[-63.62,-41.16],[-63.77,-41.15],[-64.12,-41.01],[-64.38,-40.92],[-64.62,-40.85],[-64.85,-40.81],[-64.82,-40.79],[-64.8,-40.76],[-64.87,-40.74],[-64.92,-40.73],[-65.07,-40.81],[-65.13,-40.88],[-65.15,-40.95],[-65.15,-41.11],[-65.13,-41.24],[-65.02,-41.57],[-65.01,-41.75],[-65.06,-41.97],[-64.99,-42.1],[-64.9,-42.16],[-64.7,-42.22],[-64.62,-42.26],[-64.54,-42.25],[-64.51,-42.27],[-64.52,-42.3],[-64.57,-42.36],[-64.57,-42.42],[-64.42,-42.43],[-64.26,-42.42],[-64.1,-42.4],[-64.06,-42.35],[-64.06,-42.27],[-64.25,-42.25],[-64.23,-42.22],[-64.08,-42.18],[-63.89,-42.12],[-63.8,-42.11],[-63.73,-42.15],[-63.68,-42.19],[-63.63,-42.28],[-63.6,-42.41],[-63.59,-42.56],[-63.62,-42.7],[-63.64,-42.75],[-63.69,-42.81],[-64.03,-42.88],[-64.13,-42.86],[-64.22,-42.76],[-64.25,-42.65],[-64.32,-42.57],[-64.49,-42.51],[-64.65,-42.53],[-64.81,-42.63],[-64.97,-42.67],[-65.03,-42.76],[-64.63,-42.91],[-64.44,-42.95],[-64.38,-42.95],[-64.32,-42.97],[-64.38,-43.02],[-64.43,-43.06],[-64.72,-43.14],[-64.84,-43.19],[-64.99,-43.29],[-65.19,-43.52],[-65.25,-43.57],[-65.28,-43.63],[-65.3,-43.79],[-65.24,-44.05],[-65.31,-44.16],[-65.27,-44.28],[-65.29,-44.36],[-65.36,-44.48],[-65.65,-44.66],[-65.7,-44.8],[-65.6,-44.88],[-65.61,-44.95],[-65.64,-45.01],[-65.76,-45.01],[-66.19,-44.96],[-66.35,-45.03],[-66.49,-45.12],[-66.53,-45.16],[-66.59,-45.18],[-66.88,-45.23],[-66.94,-45.26],[-67.26,-45.58],[-67.39,-45.78],[-67.56,-45.97],[-67.6,-46.05],[-67.61,-46.17],[-67.59,-46.27],[-67.56,-46.35],[-67.51,-46.44],[-67.39,-46.55],[-66.78,-47.01],[-66.65,-47.05],[-66.0,-47.09],[-65.85,-47.16],[-65.77,-47.26],[-65.74,-47.34],[-65.78,-47.57],[-65.81,-47.64],[-65.89,-47.7],[-66.04,-47.78],[-66.23,-47.83],[-66.17,-47.86],[-66.1,-47.85],[-65.93,-47.83],[-65.86,-47.85],[-65.81,-47.94],[-65.91,-47.98],[-65.94,-48.02],[-66.02,-48.08],[-66.39,-48.34],[-66.6,-48.42],[-66.78,-48.52],[-67.03,-48.63],[-67.13,-48.69],[-67.26,-48.81],[-67.47,-48.95],[-67.68,-49.25],[-67.69,-49.3],[-67.66,-49.34],[-67.78,-49.86],[-67.83,-49.92],[-67.91,-49.98],[-68.15,-50.09],[-68.26,-50.1],[-68.4,-50.04],[-68.49,-49.98],[-68.57,-49.87],[-68.67,-49.75],[-68.67,-49.79],[-68.64,-49.86],[-68.66,-49.94],[-68.91,-49.97],[-68.98,-50.0],[-68.75,-49.99],[-68.6,-50.01],[-68.53,-50.04],[-68.47,-50.09],[-68.42,-50.16],[-68.47,-50.19],[-68.59,-50.23],[-68.75,-50.28],[-68.94,-50.38],[-69.04,-50.5],[-69.09,-50.58],[-69.14,-50.75],[-69.15,-50.86],[-69.24,-50.95],[-69.36,-51.03],[-69.35,-51.05],[-69.27,-51.01],[-69.2,-50.99],[-69.14,-51.1],[-69.07,-51.3],[-69.03,-51.45],[-69.04,-51.49],[-69.06,-51.55],[-69.22,-51.56],[-69.36,-51.56],[-69.47,-51.58],[-69.41,-51.61],[-69.31,-51.6],[-69.18,-51.66],[-69.03,-51.64],[-68.97,-51.68],[-68.92,-51.71],[-68.69,-52.01],[-68.49,-52.2],[-68.39,-52.31],[-68.44,-52.36],[-68.46,-52.29],[-68.59,-52.27],[-68.72,-52.26],[-68.92,-52.21],[-69.21,-52.14],[-69.49,-52.14],[-69.71,-52.08],[-69.96,-52.01],[-70.48,-52.0],[-70.94,-52.0],[-71.41,-51.99],[-71.72,-51.99],[-71.92,-51.99],[-71.97,-51.96],[-71.95,-51.88],[-72.03,-51.82],[-72.14,-51.74],[-72.27,-51.69],[-72.33,-51.62],[-72.41,-51.54],[-72.37,-51.47],[-72.3,-51.3],[-72.3,-51.22],[-72.36,-51.17],[-72.38,-51.1],[-72.36,-51.06],[-72.31,-51.03],[-72.28,-50.91],[-72.3,-50.79],[-72.34,-50.68],[-72.39,-50.63],[-72.46,-50.61],[-72.51,-50.61],[-72.62,-50.65],[-72.8,-50.64],[-72.87,-50.65],[-72.96,-50.7],[-73.08,-50.76],[-73.15,-50.74],[-73.17,-50.67],[-73.22,-50.61],[-73.25,-50.56],[-73.27,-50.47],[-73.31,-50.36],[-73.39,-50.23],[-73.5,-50.13],[-73.51,-50.03],[-73.53,-49.91],[-73.47,-49.79],[-73.5,-49.7],[-73.58,-49.58],[-73.55,-49.46],[-73.48,-49.4],[-73.46,-49.31],[-73.14,-49.3],[-73.15,-49.19],[-73.09,-49.1],[-73.03,-49.01],[-72.98,-48.98],[-72.87,-48.94],[-72.73,-48.9],[-72.65,-48.84],[-72.61,-48.79],[-72.59,-48.73],[-72.59,-48.66],[-72.61,-48.52],[-72.58,-48.48],[-72.5,-48.42],[-72.35,-48.37],[-72.29,-48.23],[-72.33,-48.11],[-72.41,-48.02],[-72.51,-47.97],[-72.52,-47.88],[-72.47,-47.78],[-72.41,-47.69],[-72.34,-47.57],[-72.35,-47.49],[-72.28,-47.45],[-72.1,-47.34],[-72.04,-47.24],[-71.98,-47.21],[-71.9,-47.2],[-71.9,-47.14],[-71.95,-47.09],[-71.96,-47.02],[-71.96,-46.94],[-71.94,-46.83],[-71.86,-46.79],[-71.73,-46.71],[-71.7,-46.65],[-71.7,-46.58],[-71.73,-46.43],[-71.76,-46.32],[-71.78,-46.28],[-71.83,-46.21],[-71.88,-46.16],[-71.81,-46.1],[-71.68,-46.04],[-71.63,-45.95],[-71.68,-45.88],[-71.75,-45.84],[-71.77,-45.72],[-71.75,-45.58],[-71.69,-45.53],[-71.51,-45.51],[-71.49,-45.44],[-71.35,-45.33],[-71.35,-45.23],[-71.44,-45.17],[-71.53,-45.07],[-71.6,-44.98],[-71.81,-44.93],[-72.04,-44.9],[-72.07,-44.82],[-72.06,-44.77],[-71.96,-44.79],[-71.78,-44.77],[-71.65,-44.77],[-71.56,-44.76],[-71.46,-44.75],[-71.36,-44.79],[-71.26,-44.76],[-71.22,-44.63],[-71.16,-44.56],[-71.15,-44.49],[-71.21,-44.44],[-71.33,-44.42],[-71.82,-44.38],[-71.84,-44.33],[-71.83,-44.24],[-71.81,-44.15],[-71.81,-44.11],[-71.77,-44.07],[-71.72,-43.98],[-71.68,-43.93],[-71.72,-43.86],[-71.79,-43.75],[-71.74,-43.7],[-71.73,-43.65],[-71.75,-43.59],[-71.83,-43.53],[-71.9,-43.44],[-71.9,-43.35],[-71.82,-43.32],[-71.76,-43.29],[-71.75,-43.24],[-71.78,-43.17],[-71.9,-43.15],[-72.05,-43.1],[-72.1,-43.07],[-72.15,-42.99],[-72.11,-42.78],[-72.13,-42.65],[-72.14,-42.58],[-72.11,-42.52],[-72.05,-42.47],[-72.08,-42.36],[-72.12,-42.3],[-72.11,-42.25],[-72.06,-42.21],[-72.03,-42.15],[-71.99,-42.13],[-71.94,-42.17],[-71.86,-42.15],[-71.76,-42.1],[-71.75,-42.05],[-71.77,-41.97],[-71.84,-41.77],[-71.91,-41.65],[-71.9,-41.61],[-71.87,-41.56],[-71.89,-41.39],[-71.89,-41.29],[-71.88,-40.99],[-71.87,-40.89],[-71.94,-40.79],[-71.93,-40.69],[-71.88,-40.62],[-71.84,-40.52],[-71.8,-40.44],[-71.77,-40.4],[-71.71,-40.38],[-71.7,-40.34],[-71.72,-40.3],[-71.8,-40.24],[-71.82,-40.18],[-71.8,-40.12],[-71.76,-40.09],[-71.7,-40.09],[-71.66,-40.02],[-71.65,-39.93],[-71.64,-39.89],[-71.67,-39.83],[-71.7,-39.71],[-71.72,-39.64],[-71.69,-39.61],[-71.65,-39.59],[-71.59,-39.61],[-71.54,-39.6],[-71.53,-39.56],[-71.53,-39.52],[-71.51,-39.5],[-71.47,-39.4],[-71.42,-39.29],[-71.41,-39.21],[-71.43,-38.99],[-71.4,-38.94],[-71.35,-38.89],[-71.29,-38.85],[-71.2,-38.81],[-71.09,-38.76],[-70.95,-38.74],[-70.9,-38.68],[-70.86,-38.6],[-70.85,-38.54],[-70.9,-38.5],[-70.97,-38.45],[-71.0,-38.31],[-71.02,-38.19],[-71.03,-38.04],[-71.1,-37.91],[-71.17,-37.76],[-71.19,-37.63],[-71.16,-37.56],[-71.13,-37.45],[-71.16,-37.39],[-71.2,-37.3],[-71.16,-37.23],[-71.12,-37.11],[-71.12,-37.06],[-71.16,-36.92],[-71.19,-36.84],[-71.16,-36.76],[-71.11,-36.69],[-71.07,-36.64],[-71.07,-36.58],[-71.06,-36.52],[-70.98,-36.49],[-70.91,-36.42],[-70.85,-36.41],[-70.79,-36.41],[-70.75,-36.39],[-70.73,-36.34],[-70.72,-36.28],[-70.62,-36.21],[-70.56,-36.15],[-70.46,-36.13],[-70.4,-36.06],[-70.4,-35.97],[-70.42,-35.88],[-70.38,-35.77],[-70.42,-35.61],[-70.42,-35.52],[-70.46,-35.45],[-70.45,-35.38],[-70.47,-35.33],[-70.53,-35.31],[-70.56,-35.25],[-70.53,-35.22],[-70.47,-35.19],[-70.39,-35.15],[-70.34,-34.92],[-70.31,-34.85],[-70.29,-34.77],[-70.29,-34.73],[-70.25,-34.67],[-70.21,-34.58],[-70.14,-34.49],[-70.1,-34.43],[-70.06,-34.35],[-70.05,-34.3],[-70.0,-34.28],[-69.95,-34.27],[-69.88,-34.25],[-69.85,-34.22],[-69.86,-34.18],[-69.86,-34.08],[-69.88,-33.93],[-69.89,-33.73],[-69.88,-33.6],[-69.84,-33.47],[-69.8,-33.4],[-69.81,-33.34],[-69.82,-33.28],[-69.9,-33.25],[-69.97,-33.28],[-70.02,-33.27],[-70.08,-33.2],[-70.1,-33.13],[-70.09,-33.03],[-70.04,-32.96],[-70.02,-32.88],[-70.05,-32.86],[-70.12,-32.81],[-70.18,-32.63],[-70.17,-32.47],[-70.23,-32.43],[-70.26,-32.31],[-70.32,-32.27],[-70.34,-32.18],[-70.36,-32.08],[-70.36,-32.04],[-70.29,-32.03],[-70.25,-31.96],[-70.28,-31.92],[-70.33,-31.88],[-70.39,-31.88],[-70.45,-31.84],[-70.53,-31.67],[-70.59,-31.57],[-70.57,-31.43],[-70.55,-31.32],[-70.53,-31.22],[-70.52,-31.15],[-70.47,-31.11],[-70.43,-31.13],[-70.39,-31.12],[-70.35,-31.06],[-70.31,-31.02],[-70.31,-30.99],[-70.34,-30.96],[-70.35,-30.9],[-70.32,-30.83],[-70.27,-30.68],[-70.19,-30.5],[-70.16,-30.44],[-70.17,-30.39],[-70.15,-30.36],[-70.1,-30.39],[-69.96,-30.36],[-69.91,-30.28],[-69.89,-30.21],[-69.84,-30.18],[-69.86,-30.12],[-69.92,-30.1],[-69.96,-30.08],[-69.95,-30.02],[-69.92,-29.87],[-69.93,-29.77],[-69.98,-29.55],[-70.03,-29.32],[-70.0,-29.25],[-69.9,-29.15],[-69.83,-29.1],[-69.81,-29.05],[-69.74,-28.78],[-69.73,-28.64],[-69.69,-28.56],[-69.66,-28.41],[-69.53,-28.29],[-69.49,-28.2],[-69.44,-28.19],[-69.41,-28.17],[-69.34,-28.07],[-69.25,-27.97],[-69.17,-27.92],[-69.16,-27.85],[-69.12,-27.74],[-69.04,-27.57],[-69.0,-27.45],[-68.94,-27.41],[-68.88,-27.25],[-68.85,-27.15],[-68.77,-27.12],[-68.71,-27.1],[-68.65,-27.15],[-68.59,-27.14],[-68.54,-27.09],[-68.41,-27.05],[-68.35,-27.03],[-68.32,-26.97],[-68.32,-26.88],[-68.37,-26.81],[-68.49,-26.67],[-68.58,-26.52],[-68.59,-26.47],[-68.59,-26.42],[-68.58,-26.35],[-68.53,-26.28],[-68.41,-26.15],[-68.43,-26.07],[-68.51,-25.74],[-68.54,-25.65],[-68.6,-25.49],[-68.59,-25.42],[-68.54,-25.24],[-68.5,-25.16],[-68.43,-25.15],[-68.4,-25.12],[-68.38,-25.09],[-68.43,-25.05],[-68.45,-25.0],[-68.47,-24.93],[-68.53,-24.9],[-68.56,-24.84],[-68.56,-24.75],[-68.51,-24.63],[-68.45,-24.6],[-68.42,-24.55],[-68.36,-24.5],[-68.3,-24.46],[-68.25,-24.39],[-68.05,-24.31],[-67.89,-24.24],[-67.57,-24.12],[-67.36,-24.03],[-67.34,-23.97],[-67.32,-23.93],[-67.22,-23.63],[-67.09,-23.25],[-67.01,-23.0],[-67.19,-22.82],[-67.16,-22.77],[-67.06,-22.65],[-67.03,-22.55],[-66.99,-22.51],[-66.8,-22.41],[-66.77,-22.34],[-66.75,-22.27],[-66.71,-22.22],[-66.64,-22.21],[-66.51,-22.16],[-66.37,-22.11],[-66.32,-22.05],[-66.28,-21.95],[-66.25,-21.83],[-66.22,-21.8],[-66.17,-21.81],[-66.1,-21.84],[-66.06,-21.88],[-65.86,-22.02],[-65.77,-22.1],[-65.69,-22.11],[-65.52,-22.09],[-65.48,-22.1],[-65.06,-22.1],[-64.99,-22.11],[-64.84,-22.14],[-64.76,-22.17],[-64.7,-22.19],[-64.61,-22.23],[-64.52,-22.37],[-64.48,-22.49],[-64.45,-22.59],[-64.37,-22.76],[-64.33,-22.83],[-64.31,-22.8],[-64.27,-22.6],[-64.21,-22.49],[-64.13,-22.37],[-63.98,-22.07],[-63.92,-22.03],[-63.86,-22.01],[-63.82,-22.01],[-63.78,-22.03],[-63.72,-22.03],[-63.68,-22.0],[-63.27,-22.0],[-62.84,-22.0],[-62.83,-22.0],[-62.82,-22.05],[-62.74,-22.16],[-62.67,-22.22],[-62.65,-22.23],[-62.63,-22.26],[-62.63,-22.29],[-62.54,-22.35],[-62.37,-22.44],[-62.21,-22.61],[-62.07,-22.87],[-61.93,-23.06],[-61.8,-23.18],[-61.68,-23.27],[-61.57,-23.32],[-61.51,-23.36],[-61.51,-23.39],[-61.4,-23.46],[-61.21,-23.56],[-61.08,-23.66],[-61.03,-23.76],[-60.84,-23.86],[-60.51,-23.96],[-60.26,-24.01]]]},{"n":"Armenia","r":[[[45.55,40.62],[45.51,40.6],[45.48,40.61],[45.48,40.65],[45.5,40.66],[45.53,40.66],[45.56,40.65],[45.55,40.62]],[[46.49,38.91],[46.32,38.91],[46.17,38.87],[46.11,38.88],[46.08,38.95],[46.05,39.02],[45.95,39.18],[45.98,39.24],[45.92,39.28],[45.8,39.35],[45.77,39.38],[45.78,39.42],[45.8,39.49],[45.78,39.55],[45.75,39.56],[45.69,39.56],[45.61,39.55],[45.46,39.49],[45.35,39.53],[45.29,39.57],[45.25,39.6],[45.17,39.57],[45.15,39.58],[45.15,39.66],[45.12,39.7],[45.08,39.74],[45.03,39.77],[44.87,39.72],[44.77,39.7],[44.73,39.75],[44.56,39.89],[44.4,40.0],[44.29,40.04],[44.18,40.04],[44.01,40.01],[43.94,40.02],[43.79,40.07],[43.67,40.13],[43.68,40.15],[43.71,40.17],[43.68,40.24],[43.61,40.36],[43.62,40.39],[43.59,40.44],[43.57,40.48],[43.67,40.57],[43.71,40.65],[43.72,40.72],[43.7,40.79],[43.63,40.93],[43.59,40.97],[43.52,41.0],[43.46,41.06],[43.44,41.11],[43.49,41.12],[43.65,41.12],[43.79,41.13],[43.91,41.16],[44.08,41.18],[44.15,41.2],[44.23,41.21],[44.47,41.19],[44.56,41.21],[44.84,41.21],[44.85,41.22],[44.81,41.25],[44.81,41.26],[44.98,41.28],[45.0,41.29],[45.02,41.25],[45.08,41.2],[45.15,41.18],[45.19,41.15],[45.19,41.13],[45.07,41.1],[45.06,41.09],[45.07,41.08],[45.11,41.07],[45.27,41.01],[45.37,41.0],[45.42,40.99],[45.44,40.95],[45.52,40.9],[45.59,40.85],[45.59,40.83],[45.58,40.8],[45.4,40.71],[45.38,40.67],[45.38,40.64],[45.45,40.53],[45.57,40.42],[45.74,40.33],[45.96,40.23],[45.97,40.17],[45.93,40.1],[45.9,40.06],[45.89,40.02],[45.86,40.01],[45.63,40.01],[45.6,40.0],[45.58,39.99],[45.58,39.98],[45.66,39.96],[45.79,39.88],[45.86,39.81],[45.94,39.78],[46.03,39.72],[46.09,39.66],[46.2,39.59],[46.32,39.62],[46.48,39.56],[46.49,39.51],[46.48,39.48],[46.38,39.43],[46.37,39.42],[46.37,39.4],[46.38,39.38],[46.44,39.35],[46.51,39.3],[46.58,39.22],[46.55,39.2],[46.48,39.2],[46.42,39.21],[46.4,39.19],[46.4,39.17],[46.48,39.11],[46.49,39.07],[46.49,39.0],[46.49,38.91]]]},{"n":"American Samoa","r":[[[-170.73,-14.35],[-170.77,-14.36],[-170.82,-14.31],[-170.72,-14.28],[-170.69,-14.26],[-170.57,-14.27],[-170.64,-14.28],[-170.73,-14.35]]]},{"n":"Antarctica","r":[[[-161.99,-83.12],[-162.3,-83.14],[-163.05,-83.1],[-163.24,-83.06],[-163.35,-83.02],[-163.55,-82.99],[-163.6,-82.97],[-163.6,-82.93],[-163.63,-82.9],[-163.7,-82.88],[-163.74,-82.86],[-163.8,-82.84],[-162.8,-82.86],[-162.41,-82.9],[-162.34,-82.92],[-161.64,-83.03],[-161.83,-83.04],[-161.99,-83.12]],[[-157.99,-82.1],[-158.08,-82.11],[-158.15,-82.06],[-158.55,-81.95],[-158.77,-81.88],[-158.93,-81.82],[-158.99,-81.78],[-158.91,-81.78],[-158.35,-81.9],[-158.26,-81.95],[-157.83,-82.03],[-157.99,-82.1]],[[-160.47,-81.59],[-160.57,-81.6],[-163.25,-81.48],[-163.77,-81.44],[-163.89,-81.42],[-163.94,-81.4],[-163.95,-81.39],[-163.93,-81.35],[-163.87,-81.32],[-163.2,-81.28],[-162.46,-81.31],[-161.56,-81.4],[-160.94,-81.46],[-160.62,-81.52],[-160.49,-81.57],[-160.47,-81.59]],[[-153.93,-80.03],[-154.11,-80.04],[-154.35,-80.03],[-154.53,-80.0],[-154.94,-79.97],[-155.04,-79.9],[-155.53,-79.85],[-155.75,-79.83],[-155.67,-79.77],[-155.16,-79.85],[-154.54,-79.94],[-154.03,-79.99],[-153.93,-80.03]],[[-59.73,-80.34],[-59.77,-80.56],[-59.77,-80.66],[-59.83,-80.73],[-59.93,-80.77],[-60.12,-80.84],[-60.27,-80.88],[-60.58,-80.95],[-62.02,-80.89],[-62.67,-80.83],[-62.94,-80.77],[-62.99,-80.73],[-63.07,-80.63],[-63.14,-80.59],[-63.71,-80.62],[-64.07,-80.65],[-64.13,-80.67],[-64.22,-80.73],[-64.27,-80.75],[-65.2,-80.61],[-66.18,-80.44],[-66.59,-80.36],[-66.73,-80.32],[-66.77,-80.29],[-66.68,-80.26],[-66.59,-80.24],[-66.48,-80.22],[-66.38,-80.22],[-66.3,-80.23],[-66.22,-80.26],[-66.17,-80.35],[-66.12,-80.36],[-65.98,-80.38],[-62.52,-80.37],[-62.23,-80.37],[-61.63,-80.34],[-61.31,-80.31],[-61.19,-80.26],[-61.48,-80.24],[-61.6,-80.21],[-61.69,-80.13],[-61.72,-80.07],[-61.68,-80.02],[-61.3,-80.0],[-61.25,-79.98],[-61.35,-79.95],[-61.34,-79.89],[-61.11,-79.86],[-61.03,-79.81],[-60.58,-79.74],[-59.87,-79.78],[-59.71,-79.88],[-59.75,-79.94],[-59.79,-80.0],[-59.79,-80.1],[-59.5,-80.12],[-59.41,-80.15],[-59.32,-80.2],[-59.43,-80.2],[-59.53,-80.21],[-59.61,-80.26],[-59.68,-80.32],[-59.73,-80.34]],[[-31.12,-79.8],[-30.99,-79.82],[-30.84,-79.77],[-30.86,-79.73],[-30.78,-79.65],[-30.66,-79.73],[-29.87,-79.82],[-29.61,-79.91],[-29.72,-79.93],[-29.8,-79.93],[-30.03,-79.94],[-30.42,-80.01],[-30.84,-79.94],[-31.59,-79.89],[-31.82,-79.85],[-32.0,-79.73],[-31.68,-79.63],[-31.6,-79.64],[-31.12,-79.8]],[[-32.34,-79.67],[-32.51,-79.68],[-32.58,-79.66],[-32.5,-79.59],[-32.38,-79.53],[-32.15,-79.53],[-31.93,-79.57],[-31.96,-79.6],[-32.0,-79.61],[-32.34,-79.67]],[[-66.17,-80.08],[-66.27,-80.08],[-66.32,-80.08],[-66.37,-80.05],[-66.41,-79.97],[-66.9,-79.91],[-66.96,-79.87],[-66.99,-79.79],[-67.08,-79.76],[-67.72,-79.62],[-67.77,-79.59],[-67.81,-79.55],[-67.69,-79.53],[-67.44,-79.56],[-66.98,-79.57],[-66.88,-79.58],[-66.79,-79.61],[-66.27,-79.61],[-66.01,-79.62],[-65.87,-79.74],[-65.58,-79.77],[-65.54,-79.84],[-65.5,-79.95],[-65.9,-80.04],[-65.99,-80.05],[-66.17,-80.08]],[[-67.26,-79.45],[-67.43,-79.5],[-68.16,-79.48],[-68.41,-79.46],[-68.55,-79.44],[-68.42,-79.33],[-68.32,-79.3],[-68.23,-79.28],[-68.03,-79.23],[-67.71,-79.21],[-67.47,-79.22],[-67.07,-79.27],[-67.17,-79.31],[-67.24,-79.33],[-67.3,-79.39],[-67.26,-79.45]],[[-33.93,-79.32],[-34.05,-79.36],[-36.48,-79.29],[-36.6,-79.28],[-36.57,-79.21],[-36.24,-79.2],[-36.05,-79.18],[-35.79,-79.15],[-35.6,-79.09],[-35.53,-79.09],[-34.39,-79.22],[-33.99,-79.28],[-33.95,-79.31],[-33.93,-79.32]],[[-159.05,-79.81],[-160.3,-79.84],[-160.81,-79.81],[-161.87,-79.7],[-163.32,-79.5],[-163.71,-79.44],[-163.97,-79.39],[-164.23,-79.32],[-164.28,-79.25],[-164.24,-79.14],[-164.2,-79.05],[-164.13,-79.0],[-163.81,-78.93],[-163.66,-78.86],[-163.35,-78.78],[-163.26,-78.72],[-163.12,-78.72],[-162.87,-78.73],[-162.62,-78.74],[-162.39,-78.76],[-162.16,-78.79],[-161.64,-78.9],[-161.28,-79.01],[-160.76,-79.13],[-160.25,-79.27],[-159.96,-79.32],[-159.68,-79.4],[-159.42,-79.51],[-159.37,-79.55],[-159.26,-79.59],[-159.19,-79.64],[-159.12,-79.67],[-159.05,-79.69],[-159.0,-79.74],[-159.01,-79.78],[-159.05,-79.81]],[[-70.33,-79.68],[-70.55,-79.68],[-70.98,-79.67],[-71.41,-79.64],[-71.53,-79.62],[-71.69,-79.57],[-71.74,-79.54],[-71.78,-79.5],[-71.78,-79.44],[-71.67,-79.25],[-71.45,-79.13],[-71.25,-79.06],[-70.63,-78.9],[-70.54,-78.88],[-69.97,-78.81],[-69.75,-78.77],[-69.4,-78.69],[-67.48,-78.36],[-67.04,-78.32],[-66.84,-78.35],[-66.73,-78.38],[-66.79,-78.42],[-67.05,-78.51],[-67.17,-78.57],[-67.48,-78.68],[-68.16,-78.87],[-68.64,-79.01],[-69.25,-79.21],[-69.39,-79.28],[-69.69,-79.44],[-69.63,-79.52],[-69.73,-79.62],[-70.12,-79.67],[-70.33,-79.68]],[[167.64,-78.14],[167.52,-78.22],[167.38,-78.25],[166.94,-78.22],[166.63,-78.28],[166.28,-78.31],[166.12,-78.27],[166.05,-78.21],[166.01,-78.13],[166.01,-78.1],[166.11,-78.09],[166.57,-78.15],[166.76,-78.2],[166.86,-78.2],[167.14,-78.13],[167.36,-78.05],[167.42,-78.01],[167.5,-77.99],[167.59,-78.02],[167.64,-78.11],[167.64,-78.14]],[[-45.22,-78.81],[-45.09,-78.81],[-44.57,-78.8],[-44.04,-78.81],[-43.72,-78.82],[-43.63,-78.85],[-43.54,-78.9],[-43.45,-78.99],[-43.36,-79.08],[-43.27,-79.16],[-43.21,-79.3],[-43.12,-79.35],[-42.97,-79.48],[-42.94,-79.58],[-42.99,-79.8],[-43.07,-79.89],[-43.27,-79.98],[-43.5,-79.97],[-43.6,-79.97],[-43.7,-79.99],[-43.74,-80.0],[-43.76,-80.02],[-43.49,-80.1],[-43.46,-80.12],[-43.45,-80.16],[-43.49,-80.18],[-43.53,-80.19],[-49.19,-80.64],[-49.41,-80.67],[-49.63,-80.71],[-49.7,-80.75],[-49.77,-80.78],[-54.16,-80.87],[-54.2,-80.86],[-54.24,-80.85],[-54.35,-80.76],[-54.37,-80.62],[-54.35,-80.57],[-54.13,-80.52],[-54.04,-80.49],[-53.68,-80.28],[-53.48,-80.19],[-53.39,-80.11],[-53.35,-80.11],[-53.18,-80.16],[-53.05,-80.18],[-52.81,-80.16],[-52.57,-80.1],[-52.46,-80.07],[-52.36,-80.08],[-52.34,-80.13],[-52.3,-80.14],[-51.71,-79.99],[-51.18,-79.82],[-50.66,-79.63],[-50.4,-79.51],[-50.34,-79.48],[-50.29,-79.43],[-50.33,-79.38],[-50.38,-79.34],[-50.42,-79.32],[-50.46,-79.31],[-50.73,-79.28],[-50.65,-79.23],[-50.57,-79.17],[-50.52,-79.1],[-50.5,-79.02],[-50.51,-78.98],[-50.5,-78.95],[-50.38,-78.92],[-50.3,-78.88],[-50.24,-78.83],[-50.34,-78.82],[-50.38,-78.78],[-50.29,-78.7],[-50.22,-78.61],[-50.14,-78.56],[-49.94,-78.46],[-49.35,-78.22],[-49.14,-78.09],[-49.08,-78.05],[-47.69,-77.84],[-47.46,-77.82],[-47.03,-77.79],[-46.83,-77.79],[-46.26,-77.8],[-45.99,-77.83],[-45.53,-77.88],[-44.85,-77.99],[-44.59,-78.04],[-44.34,-78.09],[-44.09,-78.17],[-43.85,-78.26],[-43.81,-78.29],[-43.78,-78.34],[-43.78,-78.39],[-43.79,-78.43],[-43.85,-78.53],[-43.95,-78.6],[-45.07,-78.66],[-45.21,-78.69],[-45.29,-78.74],[-45.35,-78.79],[-45.22,-78.81]],[[-149.22,-77.34],[-148.93,-77.39],[-149.44,-77.37],[-149.66,-77.3],[-149.52,-77.27],[-149.38,-77.28],[-149.25,-77.32],[-149.22,-77.34]],[[-150.4,-77.37],[-150.47,-77.37],[-151.34,-77.3],[-151.51,-77.27],[-151.22,-77.23],[-151.02,-77.22],[-150.5,-77.34],[-150.36,-77.35],[-150.4,-77.37]],[[167.08,-77.32],[167.46,-77.39],[168.45,-77.39],[169.28,-77.45],[169.35,-77.52],[169.12,-77.56],[168.75,-77.65],[168.52,-77.68],[168.32,-77.68],[167.92,-77.64],[167.39,-77.65],[167.28,-77.7],[167.03,-77.76],[166.73,-77.85],[166.65,-77.77],[166.53,-77.7],[166.24,-77.55],[166.22,-77.52],[166.38,-77.49],[166.46,-77.44],[166.63,-77.38],[166.61,-77.34],[166.47,-77.29],[166.41,-77.25],[166.51,-77.19],[166.72,-77.16],[166.99,-77.19],[167.11,-77.27],[167.08,-77.31],[167.08,-77.32]],[[-148.6,-77.01],[-149.01,-77.02],[-149.24,-76.99],[-149.3,-76.92],[-149.24,-76.9],[-148.7,-76.94],[-148.51,-76.95],[-148.44,-76.98],[-148.47,-77.0],[-148.6,-77.01]],[[-149.23,-77.12],[-149.29,-77.14],[-149.73,-77.13],[-149.82,-77.11],[-149.86,-77.1],[-150.46,-77.08],[-150.74,-77.0],[-150.79,-76.98],[-150.68,-76.95],[-150.48,-76.93],[-150.39,-76.9],[-149.87,-76.88],[-149.79,-76.89],[-149.74,-76.93],[-149.51,-77.0],[-149.44,-77.05],[-149.42,-77.08],[-149.29,-77.09],[-149.23,-77.12]],[[-146.61,-76.96],[-146.98,-77.01],[-147.08,-76.99],[-147.04,-76.93],[-147.1,-76.89],[-147.12,-76.87],[-147.09,-76.84],[-146.87,-76.84],[-146.24,-76.88],[-146.16,-76.95],[-146.61,-76.96]],[[-149.33,-76.72],[-148.93,-76.73],[-148.66,-76.72],[-148.38,-76.74],[-148.32,-76.77],[-148.37,-76.79],[-148.67,-76.8],[-148.81,-76.84],[-148.98,-76.85],[-149.24,-76.82],[-149.47,-76.76],[-149.33,-76.72]],[[-150.23,-76.78],[-150.66,-76.79],[-150.83,-76.76],[-150.87,-76.74],[-150.84,-76.71],[-150.18,-76.69],[-150.1,-76.72],[-150.08,-76.74],[-150.23,-76.78]],[[-147.59,-76.65],[-147.58,-76.66],[-147.73,-76.65],[-147.95,-76.6],[-148.0,-76.58],[-147.9,-76.56],[-147.77,-76.58],[-147.65,-76.61],[-147.59,-76.65]],[[-146.79,-76.63],[-146.91,-76.71],[-147.22,-76.67],[-147.36,-76.62],[-147.28,-76.55],[-147.14,-76.53],[-146.95,-76.55],[-146.88,-76.56],[-146.79,-76.63]],[[-146.69,-76.25],[-146.89,-76.26],[-147.15,-76.2],[-147.35,-76.15],[-147.41,-76.1],[-147.42,-76.09],[-147.42,-76.07],[-147.36,-76.06],[-146.95,-76.1],[-146.69,-76.25]],[[162.97,-75.57],[162.79,-75.7],[162.66,-75.69],[162.59,-75.67],[162.72,-75.6],[162.84,-75.57],[162.92,-75.56],[162.97,-75.57]],[[-145.24,-75.71],[-145.35,-75.72],[-145.54,-75.69],[-146.04,-75.61],[-146.15,-75.57],[-146.08,-75.53],[-145.9,-75.5],[-145.76,-75.51],[-145.42,-75.59],[-145.32,-75.64],[-145.25,-75.68],[-145.24,-75.71]],[[163.98,-74.83],[163.84,-74.83],[163.76,-74.8],[163.74,-74.73],[163.74,-74.71],[164.0,-74.63],[164.21,-74.61],[164.1,-74.73],[164.06,-74.75],[163.98,-74.83]],[[-132.39,-74.44],[-132.55,-74.5],[-132.86,-74.46],[-132.83,-74.42],[-132.55,-74.39],[-132.36,-74.41],[-132.39,-74.44]],[[-131.07,-74.58],[-131.18,-74.6],[-131.6,-74.55],[-131.84,-74.54],[-131.95,-74.51],[-132.03,-74.49],[-132.05,-74.46],[-132.16,-74.43],[-131.94,-74.35],[-131.76,-74.32],[-131.59,-74.33],[-131.56,-74.37],[-131.23,-74.41],[-130.98,-74.41],[-130.96,-74.46],[-130.97,-74.52],[-131.07,-74.58]],[[-127.37,-74.62],[-127.52,-74.64],[-127.82,-74.57],[-127.92,-74.54],[-128.0,-74.49],[-128.07,-74.48],[-128.1,-74.47],[-128.13,-74.33],[-128.04,-74.31],[-127.85,-74.33],[-127.49,-74.41],[-127.23,-74.43],[-127.15,-74.48],[-127.23,-74.58],[-127.37,-74.62]],[[-116.74,-74.17],[-117.23,-74.19],[-117.36,-74.16],[-117.4,-74.12],[-117.38,-74.08],[-116.38,-73.87],[-116.2,-73.9],[-116.15,-73.91],[-116.45,-74.02],[-116.58,-74.06],[-116.61,-74.07],[-116.53,-74.08],[-116.51,-74.1],[-116.57,-74.13],[-116.74,-74.17]],[[-119.55,-74.11],[-119.76,-74.12],[-119.82,-74.12],[-119.89,-74.1],[-119.91,-74.08],[-119.8,-74.03],[-119.69,-74.01],[-119.66,-73.99],[-119.8,-73.81],[-119.67,-73.81],[-119.52,-73.77],[-119.22,-73.78],[-118.96,-73.81],[-118.91,-73.83],[-118.88,-73.88],[-118.99,-73.97],[-119.06,-74.0],[-119.45,-74.08],[-119.55,-74.11]],[[-120.56,-73.76],[-120.38,-73.86],[-120.31,-73.92],[-120.27,-73.99],[-120.99,-74.16],[-121.02,-74.17],[-121.05,-74.26],[-121.04,-74.28],[-121.0,-74.29],[-121.0,-74.33],[-121.06,-74.34],[-122.29,-74.4],[-122.86,-74.34],[-122.94,-74.3],[-122.96,-74.24],[-122.89,-74.23],[-122.76,-74.22],[-122.79,-74.19],[-122.88,-74.14],[-122.88,-74.1],[-122.71,-73.99],[-122.62,-73.97],[-122.95,-73.87],[-122.99,-73.84],[-123.03,-73.84],[-123.19,-73.85],[-123.35,-73.84],[-123.29,-73.8],[-123.25,-73.74],[-123.11,-73.68],[-123.01,-73.67],[-122.91,-73.68],[-122.44,-73.68],[-121.97,-73.71],[-121.5,-73.73],[-120.72,-73.75],[-120.56,-73.76]],[[-20.61,-73.89],[-20.65,-74.1],[-20.64,-74.15],[-20.6,-74.2],[-20.42,-74.32],[-20.41,-74.41],[-20.42,-74.44],[-20.49,-74.49],[-20.74,-74.48],[-20.82,-74.45],[-20.85,-74.44],[-20.98,-74.23],[-21.05,-74.18],[-21.17,-74.13],[-21.61,-74.09],[-22.04,-74.11],[-21.93,-74.06],[-21.29,-73.99],[-21.13,-73.94],[-21.02,-73.88],[-20.98,-73.79],[-20.87,-73.68],[-20.69,-73.63],[-20.58,-73.62],[-20.52,-73.71],[-20.52,-73.8],[-20.61,-73.89]],[[169.84,-73.6],[169.71,-73.63],[169.52,-73.56],[169.48,-73.54],[169.66,-73.42],[169.65,-73.38],[169.67,-73.35],[169.74,-73.32],[169.78,-73.32],[169.89,-73.46],[169.96,-73.51],[169.86,-73.57],[169.84,-73.6]],[[-126.33,-73.29],[-126.07,-73.31],[-125.98,-73.36],[-125.86,-73.39],[-125.74,-73.41],[-125.63,-73.45],[-125.56,-73.54],[-125.5,-73.56],[-125.33,-73.62],[-125.26,-73.67],[-125.28,-73.69],[-125.61,-73.71],[-125.72,-73.7],[-125.83,-73.72],[-125.86,-73.75],[-125.86,-73.78],[-125.8,-73.8],[-125.67,-73.82],[-125.55,-73.82],[-125.33,-73.8],[-125.22,-73.8],[-125.11,-73.83],[-124.99,-73.83],[-124.69,-73.75],[-124.62,-73.74],[-124.54,-73.74],[-124.13,-73.83],[-124.04,-73.88],[-124.1,-73.91],[-124.15,-73.94],[-124.13,-73.97],[-123.93,-74.01],[-123.85,-74.06],[-123.8,-74.08],[-123.81,-74.12],[-123.84,-74.17],[-123.84,-74.23],[-123.94,-74.26],[-123.98,-74.26],[-124.2,-74.23],[-124.87,-74.21],[-125.09,-74.18],[-125.42,-74.07],[-125.55,-74.06],[-125.68,-74.04],[-125.89,-73.95],[-126.24,-73.89],[-126.47,-73.81],[-126.47,-73.75],[-126.5,-73.7],[-126.54,-73.68],[-126.58,-73.67],[-126.71,-73.65],[-126.84,-73.66],[-126.9,-73.68],[-127.01,-73.73],[-127.12,-73.73],[-127.21,-73.72],[-127.23,-73.71],[-127.23,-73.59],[-127.33,-73.57],[-127.41,-73.52],[-127.43,-73.45],[-127.39,-73.38],[-127.27,-73.3],[-127.12,-73.29],[-126.98,-73.31],[-126.83,-73.29],[-126.6,-73.28],[-126.33,-73.29]],[[-73.88,-73.36],[-73.97,-73.38],[-74.04,-73.37],[-74.15,-73.32],[-74.13,-73.28],[-74.08,-73.25],[-74.05,-73.22],[-73.83,-73.11],[-73.67,-73.1],[-73.54,-73.12],[-73.68,-73.22],[-73.72,-73.3],[-73.88,-73.36]],[[-104.54,-73.17],[-104.66,-73.21],[-104.88,-73.2],[-105.05,-73.13],[-105.12,-73.03],[-105.13,-72.99],[-105.08,-72.97],[-104.97,-72.94],[-104.54,-73.17]],[[-74.35,-73.1],[-74.5,-73.23],[-74.52,-73.24],[-74.67,-73.28],[-74.62,-73.31],[-74.58,-73.33],[-74.55,-73.37],[-74.47,-73.43],[-74.37,-73.46],[-74.45,-73.57],[-74.57,-73.61],[-75.9,-73.33],[-76.0,-73.29],[-76.05,-73.25],[-76.09,-73.2],[-76.1,-73.15],[-76.06,-73.11],[-76.02,-73.09],[-75.9,-73.06],[-75.77,-73.05],[-75.51,-73.11],[-75.47,-73.1],[-75.42,-73.05],[-75.28,-73.05],[-75.24,-73.01],[-75.44,-72.99],[-75.6,-72.95],[-75.7,-72.91],[-75.73,-72.88],[-75.38,-72.82],[-74.47,-72.89],[-74.34,-72.92],[-74.28,-72.95],[-74.22,-73.0],[-74.35,-73.1]],[[-93.8,-72.92],[-93.97,-72.92],[-94.08,-72.88],[-94.11,-72.86],[-94.05,-72.82],[-94.0,-72.82],[-93.8,-72.88],[-93.76,-72.91],[-93.8,-72.92]],[[-91.16,-73.18],[-91.34,-73.21],[-91.51,-73.2],[-91.45,-72.97],[-91.36,-72.91],[-91.38,-72.87],[-91.55,-72.75],[-91.67,-72.62],[-91.61,-72.59],[-91.3,-72.55],[-90.95,-72.56],[-90.81,-72.61],[-90.76,-72.68],[-90.78,-72.73],[-90.9,-72.82],[-90.78,-72.85],[-90.75,-72.92],[-90.78,-72.99],[-90.89,-73.08],[-91.0,-73.14],[-91.16,-73.18]],[[-95.03,-72.67],[-95.22,-72.67],[-95.27,-72.65],[-95.22,-72.6],[-94.75,-72.52],[-94.57,-72.47],[-94.54,-72.48],[-94.51,-72.49],[-94.43,-72.59],[-94.43,-72.61],[-95.03,-72.67]],[[-16.1,-72.68],[-16.17,-72.7],[-16.32,-72.7],[-16.45,-72.65],[-16.51,-72.58],[-16.52,-72.53],[-16.46,-72.47],[-16.36,-72.46],[-16.3,-72.48],[-16.17,-72.6],[-16.1,-72.68]],[[68.46,-72.3],[68.41,-72.3],[68.44,-72.26],[68.57,-72.19],[68.67,-72.1],[68.73,-72.09],[68.84,-72.17],[68.82,-72.23],[68.67,-72.28],[68.46,-72.3]],[[-12.51,-72.17],[-12.59,-72.2],[-12.72,-72.19],[-12.89,-72.14],[-12.94,-72.1],[-12.96,-72.06],[-12.91,-72.01],[-12.88,-72.0],[-12.79,-72.01],[-12.64,-72.07],[-12.53,-72.14],[-12.51,-72.17]],[[69.92,-71.92],[69.79,-72.05],[69.74,-72.04],[69.69,-71.97],[69.74,-71.92],[69.8,-71.89],[69.9,-71.91],[69.92,-71.92]],[[-98.09,-71.91],[-98.18,-72.02],[-98.17,-72.12],[-97.92,-72.12],[-97.82,-71.92],[-97.58,-71.88],[-97.47,-72.0],[-97.58,-72.1],[-97.53,-72.15],[-97.46,-72.19],[-97.35,-72.19],[-97.24,-72.13],[-97.2,-72.09],[-97.15,-72.05],[-97.09,-71.94],[-96.87,-71.85],[-96.38,-71.84],[-96.12,-71.9],[-96.3,-72.05],[-96.71,-72.13],[-96.98,-72.22],[-96.89,-72.25],[-96.8,-72.26],[-96.72,-72.26],[-96.48,-72.21],[-95.91,-72.12],[-95.69,-72.06],[-95.61,-72.07],[-95.61,-72.18],[-95.53,-72.25],[-95.58,-72.41],[-95.83,-72.44],[-96.08,-72.45],[-96.01,-72.52],[-96.03,-72.55],[-96.05,-72.58],[-96.69,-72.55],[-96.8,-72.56],[-96.91,-72.58],[-97.03,-72.57],[-97.25,-72.52],[-97.37,-72.52],[-97.6,-72.55],[-97.83,-72.56],[-98.16,-72.56],[-98.41,-72.55],[-98.64,-72.49],[-98.88,-72.47],[-99.15,-72.47],[-99.43,-72.41],[-99.67,-72.38],[-100.01,-72.31],[-100.1,-72.29],[-100.2,-72.27],[-100.36,-72.28],[-101.6,-72.18],[-101.78,-72.18],[-101.9,-72.19],[-102.02,-72.18],[-102.26,-72.14],[-102.31,-72.08],[-102.29,-72.03],[-102.24,-72.01],[-102.13,-71.99],[-100.4,-71.87],[-100.22,-71.83],[-100.08,-71.84],[-99.99,-71.94],[-99.83,-72.05],[-99.78,-72.04],[-99.73,-72.03],[-99.56,-71.94],[-99.25,-71.97],[-99.08,-71.93],[-98.96,-71.85],[-98.62,-71.76],[-98.39,-71.78],[-98.19,-71.82],[-98.09,-71.91]],[[-2.95,-71.21],[-3.06,-71.24],[-3.2,-71.23],[-3.31,-71.2],[-3.39,-71.14],[-3.4,-71.12],[-3.39,-71.08],[-3.4,-71.06],[-3.26,-71.05],[-3.21,-71.08],[-3.19,-71.09],[-2.95,-71.21]],[[-60.55,-71.05],[-60.65,-71.06],[-60.79,-71.04],[-60.91,-71.01],[-60.95,-70.97],[-60.89,-70.93],[-60.78,-70.91],[-60.61,-70.92],[-60.53,-70.96],[-60.52,-71.0],[-60.54,-71.04],[-60.55,-71.05]],[[-2.53,-70.77],[-2.42,-70.8],[-2.26,-70.8],[-2.09,-70.82],[-2.12,-70.86],[-2.21,-70.9],[-2.29,-71.0],[-2.37,-71.04],[-2.61,-71.14],[-2.78,-71.17],[-2.83,-71.11],[-2.82,-71.06],[-2.81,-71.01],[-2.8,-70.98],[-2.96,-70.94],[-2.98,-70.88],[-3.01,-70.85],[-3.49,-70.74],[-3.57,-70.7],[-3.54,-70.68],[-3.04,-70.67],[-2.75,-70.69],[-2.53,-70.77]],[[-73.71,-70.64],[-73.55,-70.72],[-73.69,-70.79],[-74.21,-70.92],[-74.5,-70.97],[-74.81,-71.01],[-76.18,-71.13],[-76.27,-71.13],[-76.36,-71.12],[-76.42,-71.09],[-76.51,-70.99],[-76.5,-70.94],[-76.38,-70.89],[-76.25,-70.86],[-76.03,-70.84],[-75.21,-70.77],[-75.13,-70.75],[-75.06,-70.71],[-75.04,-70.65],[-75.01,-70.61],[-74.95,-70.59],[-74.9,-70.59],[-74.79,-70.63],[-74.59,-70.79],[-74.53,-70.77],[-74.47,-70.73],[-74.46,-70.59],[-74.4,-70.58],[-74.22,-70.61],[-74.11,-70.66],[-74.11,-70.58],[-74.04,-70.55],[-73.96,-70.56],[-73.88,-70.58],[-73.71,-70.64]],[[-60.74,-70.71],[-60.83,-70.71],[-60.9,-70.69],[-60.96,-70.63],[-60.98,-70.6],[-60.94,-70.53],[-60.88,-70.52],[-60.55,-70.51],[-60.45,-70.54],[-60.45,-70.6],[-60.49,-70.65],[-60.74,-70.71]],[[-5.89,-70.55],[-6.16,-70.61],[-6.18,-70.59],[-6.27,-70.55],[-6.44,-70.45],[-6.24,-70.45],[-6.07,-70.4],[-5.97,-70.42],[-5.95,-70.43],[-5.89,-70.55]],[[3.04,-70.6],[2.7,-70.62],[2.62,-70.59],[2.58,-70.53],[2.63,-70.5],[3.07,-70.38],[3.19,-70.39],[3.23,-70.4],[3.26,-70.45],[3.22,-70.52],[3.17,-70.55],[3.04,-70.6]],[[-3.28,-70.53],[-3.44,-70.54],[-3.49,-70.51],[-3.5,-70.49],[-3.29,-70.34],[-3.17,-70.31],[-2.95,-70.28],[-2.81,-70.29],[-2.71,-70.32],[-2.68,-70.38],[-2.68,-70.46],[-2.74,-70.51],[-3.28,-70.53]],[[-71.7,-70.27],[-71.65,-70.3],[-71.43,-70.27],[-71.35,-70.3],[-71.34,-70.32],[-71.44,-70.39],[-71.55,-70.44],[-71.68,-70.44],[-71.78,-70.32],[-71.8,-70.29],[-71.7,-70.27]],[[72.0,-70.63],[71.93,-70.63],[71.84,-70.62],[71.73,-70.55],[71.66,-70.5],[71.64,-70.44],[71.65,-70.34],[71.71,-70.28],[71.8,-70.26],[71.84,-70.31],[71.85,-70.37],[71.88,-70.41],[72.0,-70.46],[72.06,-70.5],[72.07,-70.52],[72.1,-70.57],[72.08,-70.61],[72.0,-70.63]],[[4.53,-70.48],[4.37,-70.5],[4.18,-70.45],[4.13,-70.42],[4.08,-70.33],[4.07,-70.29],[4.11,-70.27],[4.26,-70.24],[4.5,-70.25],[4.59,-70.29],[4.62,-70.37],[4.59,-70.43],[4.53,-70.48]],[[26.86,-70.38],[26.79,-70.42],[26.61,-70.41],[26.47,-70.45],[26.36,-70.43],[26.01,-70.37],[25.96,-70.29],[25.95,-70.26],[25.98,-70.2],[26.3,-70.07],[26.43,-70.06],[26.6,-70.08],[26.69,-70.11],[26.74,-70.19],[26.87,-70.33],[26.86,-70.38]],[[1.3,-70.26],[1.21,-70.38],[1.16,-70.38],[1.1,-70.3],[0.99,-70.22],[0.95,-70.17],[0.95,-70.09],[1.03,-70.05],[1.31,-70.02],[1.41,-70.04],[1.46,-70.14],[1.3,-70.26]],[[-61.16,-69.98],[-61.31,-69.98],[-61.38,-69.95],[-61.4,-69.93],[-61.39,-69.89],[-61.33,-69.86],[-61.15,-69.88],[-61.11,-69.96],[-61.16,-69.98]],[[-74.99,-69.73],[-74.81,-69.75],[-74.55,-69.86],[-74.47,-69.92],[-74.44,-69.95],[-74.46,-69.97],[-74.58,-70.0],[-74.67,-70.13],[-74.85,-70.18],[-75.27,-70.15],[-75.73,-70.1],[-75.76,-70.09],[-75.8,-70.04],[-75.81,-69.98],[-75.76,-69.92],[-75.68,-69.88],[-75.34,-69.84],[-75.31,-69.82],[-75.26,-69.75],[-75.18,-69.74],[-75.14,-69.74],[-74.99,-69.73]],[[16.22,-70.01],[16.16,-70.07],[15.84,-69.98],[15.66,-69.96],[15.61,-69.94],[15.57,-69.88],[15.56,-69.86],[15.6,-69.83],[15.7,-69.77],[15.91,-69.73],[16.25,-69.7],[16.57,-69.72],[16.63,-69.75],[16.32,-69.84],[16.22,-70.01]],[[-71.99,-69.7],[-72.2,-69.74],[-72.34,-69.71],[-72.78,-69.65],[-72.96,-69.53],[-72.94,-69.47],[-72.86,-69.43],[-72.73,-69.41],[-72.46,-69.45],[-72.33,-69.49],[-71.99,-69.7]],[[-62.0,-69.72],[-62.09,-69.73],[-62.17,-69.64],[-62.22,-69.49],[-62.5,-69.29],[-62.57,-69.18],[-62.52,-69.15],[-62.44,-69.15],[-62.24,-69.18],[-62.12,-69.21],[-61.98,-69.3],[-61.82,-69.38],[-61.78,-69.44],[-61.81,-69.51],[-61.91,-69.53],[-61.91,-69.59],[-61.97,-69.69],[-62.0,-69.72]],[[-70.05,-69.19],[-70.08,-69.31],[-69.91,-69.27],[-69.85,-69.28],[-69.71,-69.32],[-69.42,-69.58],[-69.35,-69.67],[-69.23,-69.91],[-69.09,-70.09],[-68.73,-70.41],[-68.55,-70.58],[-68.46,-70.68],[-68.45,-70.82],[-68.34,-70.86],[-68.31,-70.91],[-68.28,-71.1],[-68.25,-71.31],[-68.23,-71.73],[-68.24,-71.82],[-68.39,-71.98],[-68.46,-72.09],[-68.54,-72.16],[-68.64,-72.21],[-69.15,-72.43],[-69.21,-72.53],[-70.06,-72.63],[-70.54,-72.66],[-70.73,-72.62],[-70.92,-72.61],[-71.16,-72.63],[-71.85,-72.64],[-72.37,-72.67],[-72.43,-72.66],[-72.48,-72.62],[-72.53,-72.59],[-72.67,-72.6],[-72.78,-72.58],[-72.89,-72.55],[-73.01,-72.48],[-73.06,-72.45],[-73.09,-72.41],[-72.85,-72.3],[-72.74,-72.28],[-72.62,-72.28],[-72.38,-72.3],[-72.13,-72.33],[-71.61,-72.36],[-70.87,-72.37],[-70.67,-72.36],[-70.43,-72.32],[-70.21,-72.23],[-70.31,-72.19],[-70.42,-72.17],[-70.53,-72.16],[-70.64,-72.17],[-70.95,-72.23],[-71.18,-72.26],[-71.41,-72.28],[-71.66,-72.25],[-71.89,-72.15],[-71.9,-72.12],[-71.11,-72.05],[-71.03,-72.03],[-70.89,-71.99],[-70.84,-71.95],[-70.82,-71.91],[-71.35,-71.84],[-71.46,-71.84],[-71.57,-71.85],[-71.82,-71.82],[-72.05,-71.74],[-72.26,-71.64],[-72.34,-71.63],[-72.41,-71.66],[-72.93,-71.92],[-72.97,-71.92],[-73.17,-71.9],[-73.41,-71.85],[-73.63,-71.83],[-73.78,-71.85],[-73.83,-71.87],[-73.69,-71.93],[-73.57,-71.98],[-73.54,-72.02],[-73.9,-72.15],[-74.0,-72.17],[-74.15,-72.16],[-74.21,-72.14],[-74.32,-72.07],[-74.43,-72.06],[-74.66,-72.07],[-74.79,-72.06],[-74.91,-72.03],[-75.02,-71.99],[-75.13,-71.96],[-75.26,-71.91],[-75.35,-71.88],[-75.38,-71.83],[-75.37,-71.78],[-75.33,-71.75],[-75.32,-71.73],[-75.35,-71.68],[-75.34,-71.65],[-75.29,-71.61],[-75.1,-71.56],[-74.86,-71.54],[-74.64,-71.62],[-74.49,-71.64],[-74.42,-71.64],[-74.39,-71.64],[-74.37,-71.62],[-74.38,-71.58],[-74.42,-71.51],[-74.43,-71.46],[-74.38,-71.41],[-74.31,-71.4],[-74.24,-71.39],[-74.19,-71.38],[-74.04,-71.41],[-73.94,-71.44],[-73.72,-71.52],[-73.55,-71.57],[-73.48,-71.58],[-73.43,-71.56],[-73.38,-71.53],[-73.59,-71.45],[-73.62,-71.4],[-73.6,-71.35],[-73.47,-71.32],[-73.4,-71.32],[-73.02,-71.37],[-72.82,-71.38],[-72.62,-71.39],[-72.21,-71.34],[-72.43,-71.28],[-72.91,-71.22],[-72.99,-71.19],[-73.06,-71.13],[-72.71,-71.07],[-72.36,-71.07],[-71.72,-71.15],[-71.5,-71.11],[-71.31,-71.01],[-71.19,-70.98],[-70.74,-70.99],[-70.38,-70.95],[-70.32,-70.95],[-70.27,-70.96],[-69.92,-71.13],[-69.87,-71.13],[-69.84,-71.09],[-69.82,-71.03],[-69.82,-70.97],[-69.83,-70.91],[-69.88,-70.88],[-69.93,-70.88],[-69.99,-70.9],[-70.09,-70.88],[-70.2,-70.85],[-70.3,-70.84],[-70.66,-70.82],[-70.92,-70.79],[-71.05,-70.76],[-71.17,-70.71],[-71.19,-70.66],[-71.06,-70.54],[-70.56,-70.4],[-70.33,-70.36],[-70.09,-70.35],[-69.98,-70.36],[-69.7,-70.41],[-69.66,-70.41],[-69.62,-70.4],[-69.88,-70.31],[-70.12,-70.23],[-70.23,-70.18],[-70.33,-70.16],[-70.72,-70.14],[-70.93,-70.19],[-71.02,-70.2],[-71.12,-70.2],[-71.7,-70.07],[-71.73,-70.05],[-71.81,-70.01],[-71.85,-69.97],[-71.88,-69.91],[-71.87,-69.85],[-71.85,-69.81],[-71.77,-69.65],[-71.72,-69.52],[-71.74,-69.42],[-71.83,-69.37],[-71.96,-69.33],[-72.08,-69.27],[-72.11,-69.23],[-72.14,-69.18],[-72.14,-69.11],[-72.11,-69.06],[-72.06,-69.0],[-71.99,-68.97],[-71.87,-68.94],[-71.39,-68.87],[-70.42,-68.79],[-70.31,-68.83],[-70.15,-68.92],[-70.11,-68.96],[-70.05,-69.14],[-70.05,-69.19]],[[-90.54,-68.8],[-90.55,-68.8],[-90.57,-68.8],[-90.58,-68.8],[-90.6,-68.8],[-90.61,-68.8],[-90.62,-68.8],[-90.62,-68.8],[-90.62,-68.8],[-90.63,-68.8],[-90.64,-68.79],[-90.65,-68.78],[-90.65,-68.77],[-90.65,-68.76],[-90.64,-68.75],[-90.64,-68.75],[-90.64,-68.74],[-90.63,-68.73],[-90.63,-68.72],[-90.63,-68.72],[-90.63,-68.71],[-90.62,-68.71],[-90.6,-68.71],[-90.59,-68.71],[-90.57,-68.71],[-90.56,-68.72],[-90.55,-68.72],[-90.54,-68.73],[-90.53,-68.74],[-90.53,-68.74],[-90.52,-68.75],[-90.52,-68.76],[-90.52,-68.76],[-90.51,-68.77],[-90.52,-68.78],[-90.53,-68.79],[-90.53,-68.8],[-90.54,-68.8]],[[-60.66,-68.77],[-60.69,-68.8],[-60.82,-68.78],[-60.89,-68.76],[-61.01,-68.71],[-60.95,-68.68],[-60.81,-68.69],[-60.7,-68.72],[-60.66,-68.77]],[[-67.35,-67.77],[-67.54,-67.79],[-67.69,-67.76],[-67.69,-67.69],[-67.73,-67.68],[-67.74,-67.66],[-67.56,-67.6],[-67.42,-67.59],[-67.25,-67.6],[-67.17,-67.62],[-67.15,-67.65],[-67.28,-67.71],[-67.3,-67.74],[-67.35,-67.77]],[[164.83,-67.54],[164.75,-67.57],[164.69,-67.56],[164.64,-67.5],[164.7,-67.41],[164.68,-67.29],[164.68,-67.26],[164.82,-67.33],[164.85,-67.36],[164.91,-67.42],[164.92,-67.45],[164.86,-67.5],[164.83,-67.54]],[[-67.36,-66.89],[-67.41,-66.9],[-67.52,-66.9],[-67.59,-66.88],[-67.5,-66.8],[-67.51,-66.76],[-67.43,-66.74],[-67.33,-66.75],[-67.27,-66.82],[-67.26,-66.84],[-67.36,-66.89]],[[85.82,-66.95],[85.65,-66.98],[85.62,-66.97],[85.62,-66.95],[85.36,-66.85],[85.31,-66.78],[85.34,-66.72],[85.55,-66.73],[85.81,-66.77],[85.94,-66.89],[85.82,-66.95]],[[48.55,-66.78],[48.38,-66.81],[48.3,-66.8],[48.3,-66.77],[48.29,-66.75],[48.3,-66.72],[48.36,-66.7],[48.64,-66.7],[48.75,-66.72],[48.78,-66.73],[48.79,-66.77],[48.77,-66.78],[48.55,-66.78]],[[163.3,-66.82],[163.28,-66.88],[163.23,-66.87],[163.16,-66.82],[163.09,-66.7],[163.16,-66.69],[163.24,-66.71],[163.27,-66.77],[163.3,-66.8],[163.3,-66.82]],[[86.54,-66.77],[86.43,-66.79],[86.34,-66.79],[86.23,-66.73],[86.28,-66.7],[86.38,-66.67],[86.52,-66.69],[86.56,-66.71],[86.65,-66.72],[86.54,-66.77]],[[-67.99,-67.47],[-68.09,-67.54],[-68.18,-67.56],[-68.25,-67.54],[-68.33,-67.53],[-68.38,-67.56],[-68.44,-67.66],[-68.51,-67.71],[-68.58,-67.73],[-68.62,-67.72],[-68.66,-67.72],[-68.73,-67.75],[-68.82,-67.75],[-68.9,-67.74],[-68.98,-67.68],[-69.1,-67.6],[-69.12,-67.58],[-69.14,-67.52],[-69.13,-67.45],[-69.08,-67.4],[-68.82,-67.23],[-68.73,-67.16],[-68.66,-67.07],[-68.57,-66.99],[-68.42,-66.85],[-68.34,-66.8],[-67.94,-66.66],[-67.83,-66.62],[-67.71,-66.63],[-67.68,-66.71],[-67.74,-66.75],[-67.93,-66.84],[-67.97,-66.98],[-67.97,-67.03],[-67.95,-67.04],[-67.88,-67.06],[-67.83,-67.08],[-67.76,-67.12],[-67.69,-67.15],[-67.85,-67.22],[-67.96,-67.26],[-68.03,-67.3],[-68.18,-67.34],[-68.24,-67.37],[-68.14,-67.38],[-68.01,-67.42],[-67.97,-67.45],[-67.99,-67.47]],[[85.33,-66.61],[85.22,-66.64],[85.14,-66.64],[85.08,-66.6],[85.07,-66.58],[85.12,-66.52],[85.16,-66.52],[85.19,-66.56],[85.33,-66.61]],[[98.85,-66.47],[98.75,-66.48],[98.66,-66.45],[98.61,-66.4],[98.6,-66.38],[98.75,-66.37],[98.95,-66.42],[98.85,-66.47]],[[162.61,-66.48],[162.56,-66.53],[162.51,-66.52],[162.3,-66.4],[162.33,-66.35],[162.3,-66.3],[162.3,-66.26],[162.31,-66.25],[162.56,-66.43],[162.61,-66.48]],[[100.26,-66.22],[100.13,-66.23],[100.08,-66.2],[100.08,-66.19],[100.17,-66.13],[100.29,-66.11],[100.28,-66.18],[100.26,-66.22]],[[-66.6,-66.2],[-66.82,-66.31],[-66.85,-66.31],[-66.87,-66.29],[-66.87,-66.27],[-66.79,-66.23],[-66.78,-66.11],[-66.63,-66.07],[-66.58,-66.08],[-66.62,-66.13],[-66.59,-66.18],[-66.6,-66.2]],[[96.61,-66.04],[96.73,-66.06],[96.93,-66.06],[97.01,-66.1],[97.02,-66.14],[97.02,-66.16],[96.93,-66.2],[96.39,-66.22],[96.31,-66.19],[96.4,-66.08],[96.5,-66.05],[96.61,-66.04]],[[92.6,-65.81],[92.47,-65.82],[92.33,-65.81],[92.26,-65.76],[92.25,-65.74],[92.3,-65.71],[92.5,-65.7],[92.63,-65.73],[92.66,-65.76],[92.67,-65.77],[92.6,-65.81]],[[-65.85,-65.84],[-66.06,-65.88],[-66.18,-65.87],[-66.18,-65.83],[-66.15,-65.77],[-66.05,-65.74],[-66.07,-65.67],[-66.0,-65.63],[-65.97,-65.57],[-65.83,-65.53],[-65.64,-65.55],[-65.67,-65.63],[-65.67,-65.65],[-65.78,-65.67],[-65.81,-65.69],[-65.84,-65.74],[-65.84,-65.81],[-65.85,-65.84]],[[100.98,-65.68],[100.55,-65.7],[100.51,-65.68],[100.35,-65.67],[100.29,-65.65],[100.27,-65.6],[100.32,-65.52],[100.41,-65.47],[100.55,-65.41],[100.61,-65.4],[100.88,-65.38],[101.08,-65.4],[101.22,-65.47],[101.26,-65.53],[101.24,-65.56],[100.98,-65.68]],[[103.4,-65.45],[103.34,-65.47],[103.18,-65.45],[103.14,-65.44],[103.12,-65.34],[103.11,-65.31],[103.05,-65.29],[102.79,-65.24],[102.76,-65.17],[102.8,-65.14],[102.89,-65.13],[103.14,-65.19],[103.19,-65.24],[103.18,-65.31],[103.19,-65.33],[103.26,-65.38],[103.38,-65.43],[103.4,-65.45]],[[-63.32,-64.86],[-63.47,-64.91],[-63.56,-64.91],[-63.46,-64.8],[-63.37,-64.79],[-63.22,-64.73],[-63.18,-64.74],[-63.26,-64.79],[-63.32,-64.86]],[[-57.24,-64.57],[-57.33,-64.57],[-57.43,-64.54],[-57.45,-64.49],[-57.45,-64.46],[-57.37,-64.44],[-57.31,-64.44],[-57.02,-64.35],[-56.89,-64.33],[-56.95,-64.38],[-56.95,-64.43],[-56.99,-64.47],[-57.24,-64.57]],[[-63.18,-64.47],[-63.28,-64.57],[-63.13,-64.57],[-63.03,-64.53],[-62.93,-64.52],[-62.84,-64.57],[-63.03,-64.61],[-63.2,-64.68],[-63.28,-64.72],[-63.35,-64.73],[-63.46,-64.73],[-63.56,-64.73],[-63.65,-64.8],[-63.74,-64.83],[-63.77,-64.81],[-63.8,-64.79],[-64.01,-64.77],[-64.1,-64.73],[-64.18,-64.71],[-64.27,-64.7],[-64.23,-64.64],[-64.17,-64.58],[-63.87,-64.51],[-63.9,-64.49],[-63.92,-64.46],[-63.67,-64.42],[-63.67,-64.38],[-63.68,-64.34],[-63.61,-64.31],[-63.53,-64.27],[-63.49,-64.26],[-63.33,-64.27],[-63.23,-64.32],[-63.27,-64.38],[-63.18,-64.47]],[[-62.33,-64.42],[-62.4,-64.46],[-62.46,-64.47],[-62.51,-64.45],[-62.58,-64.51],[-62.73,-64.5],[-62.78,-64.48],[-62.75,-64.47],[-62.72,-64.44],[-62.64,-64.39],[-62.5,-64.25],[-62.48,-64.21],[-62.59,-64.14],[-62.61,-64.12],[-62.59,-64.08],[-62.54,-64.05],[-62.45,-64.01],[-62.33,-64.01],[-62.27,-64.04],[-62.27,-64.09],[-62.06,-64.14],[-62.09,-64.23],[-62.17,-64.3],[-62.19,-64.37],[-62.3,-64.4],[-62.33,-64.42]],[[-61.95,-64.08],[-62.04,-64.08],[-62.02,-64.03],[-61.94,-63.99],[-61.8,-63.97],[-61.89,-64.03],[-61.91,-64.05],[-61.95,-64.08]],[[-57.85,-64.05],[-57.81,-64.07],[-57.77,-64.06],[-57.74,-64.05],[-57.71,-64.02],[-57.59,-63.97],[-57.48,-63.96],[-57.52,-64.01],[-57.25,-64.1],[-57.27,-64.17],[-57.22,-64.22],[-57.33,-64.24],[-57.41,-64.3],[-57.34,-64.32],[-57.29,-64.37],[-57.39,-64.38],[-57.58,-64.35],[-57.68,-64.36],[-57.67,-64.31],[-57.7,-64.29],[-57.82,-64.3],[-57.87,-64.4],[-57.91,-64.41],[-57.95,-64.39],[-57.92,-64.33],[-57.97,-64.32],[-58.02,-64.32],[-58.17,-64.37],[-58.21,-64.37],[-58.3,-64.31],[-58.02,-64.24],[-58.14,-64.21],[-58.16,-64.16],[-58.15,-64.1],[-58.25,-64.11],[-58.35,-64.13],[-58.4,-64.13],[-58.44,-64.11],[-58.42,-64.07],[-58.34,-63.99],[-58.27,-63.92],[-58.15,-63.88],[-58.07,-63.85],[-57.97,-63.83],[-57.93,-63.81],[-57.83,-63.8],[-57.78,-63.87],[-57.78,-63.91],[-57.83,-63.95],[-57.85,-64.05]],[[-57.37,-63.81],[-57.36,-63.82],[-57.16,-63.82],[-57.1,-63.84],[-57.22,-63.88],[-57.25,-63.87],[-57.34,-63.88],[-57.62,-63.85],[-57.68,-63.81],[-57.44,-63.79],[-57.37,-63.81]],[[-60.65,-63.87],[-60.78,-63.9],[-60.85,-63.89],[-60.97,-63.85],[-60.81,-63.84],[-60.8,-63.72],[-60.71,-63.67],[-60.56,-63.7],[-60.66,-63.76],[-60.69,-63.81],[-60.65,-63.85],[-60.65,-63.87]],[[-55.87,-63.54],[-55.96,-63.58],[-56.18,-63.51],[-56.24,-63.47],[-56.21,-63.44],[-55.86,-63.41],[-55.76,-63.42],[-55.72,-63.49],[-55.87,-63.54]],[[-57.02,-63.37],[-56.93,-63.51],[-56.78,-63.57],[-56.83,-63.63],[-56.97,-63.62],[-57.12,-63.64],[-57.15,-63.57],[-57.1,-63.52],[-57.15,-63.48],[-57.28,-63.49],[-57.46,-63.51],[-57.58,-63.55],[-57.74,-63.62],[-57.86,-63.66],[-58.26,-63.76],[-58.53,-63.92],[-58.72,-64.08],[-58.84,-64.19],[-59.01,-64.19],[-59.05,-64.23],[-58.98,-64.27],[-58.92,-64.28],[-58.8,-64.29],[-58.82,-64.34],[-58.91,-64.35],[-58.9,-64.39],[-58.81,-64.44],[-58.79,-64.52],[-58.89,-64.54],[-59.05,-64.45],[-59.23,-64.44],[-59.37,-64.4],[-59.46,-64.35],[-59.55,-64.36],[-59.61,-64.44],[-59.57,-64.53],[-59.65,-64.58],[-59.73,-64.56],[-59.77,-64.45],[-59.85,-64.43],[-59.96,-64.43],[-60.24,-64.55],[-60.34,-64.55],[-60.39,-64.61],[-60.56,-64.68],[-60.66,-64.73],[-60.92,-64.91],[-61.06,-64.98],[-61.33,-65.02],[-61.44,-65.02],[-61.5,-65.0],[-61.6,-64.99],[-61.7,-64.99],[-61.74,-65.03],[-61.58,-65.19],[-61.66,-65.24],[-61.86,-65.24],[-61.95,-65.19],[-62.02,-65.23],[-62.08,-65.27],[-62.15,-65.33],[-62.05,-65.46],[-61.9,-65.51],[-61.8,-65.52],[-61.76,-65.57],[-61.99,-65.59],[-62.15,-65.7],[-62.22,-65.78],[-62.31,-65.84],[-62.29,-65.92],[-62.17,-66.03],[-62.01,-66.11],[-61.84,-66.12],[-61.62,-66.09],[-61.57,-66.07],[-61.36,-66.06],[-61.27,-65.98],[-61.2,-65.97],[-61.14,-65.99],[-61.04,-65.99],[-60.99,-65.94],[-60.91,-65.92],[-60.81,-65.93],[-60.62,-65.93],[-60.57,-65.98],[-60.62,-66.03],[-60.74,-66.11],[-60.86,-66.07],[-60.96,-66.07],[-61.01,-66.11],[-60.9,-66.19],[-60.94,-66.26],[-61.03,-66.34],[-61.13,-66.29],[-61.15,-66.21],[-61.29,-66.16],[-61.43,-66.14],[-61.53,-66.23],[-61.68,-66.25],[-61.7,-66.34],[-61.76,-66.43],[-61.84,-66.4],[-61.88,-66.3],[-62.12,-66.21],[-62.24,-66.2],[-62.49,-66.22],[-62.58,-66.22],[-62.68,-66.24],[-62.75,-66.31],[-62.65,-66.36],[-62.62,-66.44],[-62.62,-66.49],[-62.64,-66.51],[-62.66,-66.56],[-62.54,-66.62],[-62.54,-66.71],[-62.63,-66.71],[-62.7,-66.68],[-63.0,-66.45],[-63.18,-66.35],[-63.26,-66.26],[-63.45,-66.24],[-63.59,-66.24],[-63.75,-66.28],[-63.69,-66.32],[-63.65,-66.38],[-63.76,-66.41],[-63.88,-66.51],[-63.96,-66.59],[-64.02,-66.61],[-64.08,-66.65],[-63.81,-66.76],[-63.77,-66.8],[-63.75,-66.87],[-63.84,-66.91],[-64.04,-66.93],[-64.4,-66.85],[-64.55,-66.85],[-64.61,-66.8],[-64.69,-66.81],[-64.74,-66.89],[-64.79,-66.97],[-64.88,-67.02],[-64.85,-67.1],[-64.79,-67.12],[-64.84,-67.16],[-64.95,-67.18],[-65.03,-67.21],[-64.86,-67.24],[-64.83,-67.27],[-64.82,-67.31],[-65.08,-67.34],[-65.25,-67.34],[-65.35,-67.31],[-65.44,-67.33],[-65.5,-67.38],[-65.52,-67.44],[-65.5,-67.53],[-65.47,-67.59],[-65.45,-67.61],[-65.42,-67.66],[-65.57,-67.79],[-65.59,-67.82],[-65.6,-67.88],[-65.53,-67.93],[-65.47,-68.01],[-65.55,-68.05],[-65.64,-68.13],[-65.55,-68.15],[-65.39,-68.15],[-65.22,-68.14],[-64.96,-68.07],[-64.88,-68.06],[-64.85,-68.08],[-64.83,-68.13],[-64.9,-68.17],[-65.37,-68.29],[-65.45,-68.34],[-65.33,-68.36],[-65.09,-68.37],[-65.0,-68.41],[-65.05,-68.45],[-65.14,-68.49],[-65.24,-68.58],[-65.16,-68.62],[-64.9,-68.67],[-64.43,-68.75],[-64.08,-68.77],[-64.16,-68.69],[-64.17,-68.58],[-63.92,-68.5],[-63.8,-68.47],[-63.22,-68.42],[-63.06,-68.42],[-62.93,-68.44],[-62.98,-68.49],[-63.11,-68.47],[-63.35,-68.5],[-63.71,-68.59],[-63.77,-68.63],[-63.75,-68.7],[-63.44,-68.76],[-63.34,-68.81],[-63.48,-68.95],[-63.46,-69.04],[-63.3,-69.14],[-63.09,-69.25],[-62.99,-69.33],[-62.84,-69.37],[-62.59,-69.48],[-62.45,-69.58],[-62.41,-69.83],[-62.2,-70.03],[-61.96,-70.12],[-61.93,-70.2],[-62.01,-70.28],[-62.22,-70.23],[-62.33,-70.28],[-62.38,-70.36],[-62.23,-70.42],[-62.0,-70.5],[-61.5,-70.49],[-61.49,-70.57],[-61.61,-70.62],[-61.7,-70.68],[-61.81,-70.71],[-61.99,-70.73],[-62.04,-70.8],[-61.96,-70.9],[-61.7,-70.86],[-61.51,-70.85],[-61.31,-70.87],[-61.25,-71.0],[-61.02,-71.17],[-60.96,-71.24],[-61.0,-71.32],[-61.15,-71.34],[-61.24,-71.4],[-61.37,-71.45],[-61.52,-71.48],[-61.79,-71.62],[-61.91,-71.63],[-61.96,-71.66],[-61.73,-71.67],[-61.56,-71.68],[-61.21,-71.56],[-61.08,-71.59],[-61.0,-71.66],[-60.95,-71.75],[-61.04,-71.82],[-61.64,-71.86],[-61.94,-71.9],[-62.26,-72.02],[-61.89,-72.07],[-61.63,-72.05],[-61.49,-72.07],[-61.31,-72.11],[-61.11,-72.09],[-60.95,-72.05],[-60.83,-72.05],[-60.72,-72.07],[-60.7,-72.14],[-60.69,-72.27],[-60.66,-72.36],[-60.73,-72.43],[-61.05,-72.47],[-61.28,-72.47],[-61.29,-72.6],[-60.94,-72.7],[-60.72,-72.65],[-60.53,-72.67],[-60.53,-72.83],[-60.38,-73.01],[-60.25,-73.02],[-60.15,-72.94],[-60.01,-72.94],[-59.96,-73.03],[-60.02,-73.19],[-60.12,-73.28],[-60.4,-73.24],[-60.56,-73.21],[-60.69,-73.27],[-60.9,-73.32],[-61.08,-73.33],[-61.24,-73.25],[-61.43,-73.19],[-61.73,-73.16],[-62.01,-73.15],[-61.91,-73.22],[-61.79,-73.25],[-61.74,-73.38],[-61.64,-73.5],[-61.41,-73.47],[-61.08,-73.54],[-60.88,-73.61],[-60.79,-73.71],[-60.9,-73.87],[-61.09,-73.93],[-61.2,-73.96],[-61.4,-73.9],[-61.55,-73.9],[-61.69,-73.92],[-61.74,-74.0],[-61.84,-74.03],[-61.32,-74.04],[-61.16,-74.06],[-61.04,-74.12],[-61.23,-74.21],[-61.57,-74.19],[-61.72,-74.23],[-61.84,-74.29],[-61.33,-74.33],[-61.12,-74.31],[-60.78,-74.24],[-60.7,-74.31],[-60.84,-74.37],[-61.01,-74.48],[-61.37,-74.51],[-61.64,-74.51],[-61.99,-74.48],[-62.09,-74.45],[-62.24,-74.44],[-62.23,-74.51],[-62.13,-74.55],[-61.89,-74.71],[-61.86,-74.78],[-61.93,-74.86],[-62.14,-74.93],[-62.37,-74.95],[-62.57,-74.9],[-62.71,-74.74],[-62.89,-74.69],[-63.07,-74.68],[-63.18,-74.68],[-63.17,-74.76],[-63.13,-74.85],[-63.2,-74.91],[-63.36,-74.88],[-63.56,-74.91],[-63.75,-74.95],[-63.92,-75.0],[-63.57,-75.03],[-63.34,-75.03],[-63.17,-75.11],[-63.23,-75.15],[-63.55,-75.17],[-63.86,-75.21],[-64.28,-75.29],[-63.97,-75.33],[-63.68,-75.33],[-63.47,-75.34],[-63.3,-75.35],[-63.26,-75.4],[-63.36,-75.45],[-64.05,-75.58],[-64.78,-75.74],[-65.04,-75.79],[-65.32,-75.82],[-65.97,-75.95],[-66.37,-76.01],[-67.52,-76.11],[-69.3,-76.35],[-69.92,-76.52],[-70.1,-76.65],[-70.21,-76.67],[-70.55,-76.72],[-70.9,-76.74],[-71.8,-76.75],[-72.72,-76.69],[-73.47,-76.68],[-73.88,-76.7],[-75.27,-76.58],[-75.44,-76.59],[-75.66,-76.61],[-75.83,-76.61],[-75.96,-76.59],[-76.24,-76.59],[-77.19,-76.63],[-77.29,-76.7],[-77.17,-76.83],[-76.82,-76.99],[-76.25,-77.27],[-75.94,-77.33],[-75.75,-77.4],[-75.39,-77.47],[-74.58,-77.48],[-73.48,-77.54],[-72.85,-77.59],[-72.88,-77.69],[-73.25,-77.89],[-73.49,-77.97],[-74.04,-78.11],[-74.81,-78.18],[-75.4,-78.16],[-76.44,-78.04],[-77.74,-77.94],[-79.68,-77.84],[-80.1,-77.8],[-80.6,-77.75],[-80.89,-77.8],[-81.1,-77.84],[-81.58,-77.85],[-81.44,-77.89],[-79.51,-78.15],[-77.86,-78.35],[-77.66,-78.4],[-77.43,-78.43],[-77.45,-78.56],[-77.55,-78.66],[-77.87,-78.75],[-78.71,-78.75],[-79.77,-78.82],[-80.29,-78.82],[-80.82,-78.75],[-81.93,-78.56],[-82.61,-78.41],[-83.08,-78.25],[-83.41,-78.11],[-83.78,-77.98],[-83.75,-78.07],[-83.69,-78.15],[-83.51,-78.25],[-83.25,-78.36],[-83.23,-78.4],[-83.35,-78.41],[-83.54,-78.36],[-83.71,-78.4],[-83.76,-78.46],[-83.7,-78.54],[-83.6,-78.61],[-83.26,-78.77],[-82.97,-78.82],[-82.59,-78.92],[-81.66,-79.1],[-81.5,-79.16],[-81.22,-79.3],[-81.16,-79.4],[-80.89,-79.5],[-80.7,-79.52],[-80.53,-79.51],[-80.48,-79.43],[-80.49,-79.32],[-80.42,-79.29],[-80.15,-79.27],[-79.46,-79.3],[-76.5,-79.33],[-76.22,-79.39],[-76.11,-79.47],[-76.03,-79.63],[-76.34,-79.82],[-76.56,-79.9],[-76.9,-79.96],[-77.22,-79.99],[-77.7,-80.01],[-78.69,-80.0],[-79.66,-80.0],[-78.91,-80.09],[-78.18,-80.17],[-77.16,-80.15],[-76.76,-80.13],[-76.41,-80.09],[-76.26,-80.16],[-75.99,-80.3],[-75.82,-80.34],[-75.71,-80.38],[-75.56,-80.53],[-75.49,-80.62],[-75.34,-80.72],[-75.24,-80.8],[-75.08,-80.86],[-74.81,-80.89],[-74.51,-80.84],[-73.94,-80.82],[-73.38,-80.89],[-73.03,-80.92],[-72.55,-80.85],[-72.17,-80.76],[-71.38,-80.68],[-71.23,-80.65],[-71.02,-80.62],[-70.69,-80.63],[-70.56,-80.65],[-70.39,-80.74],[-70.24,-80.86],[-70.01,-80.92],[-69.77,-80.96],[-69.63,-80.97],[-69.18,-81.0],[-68.59,-80.97],[-68.33,-81.0],[-68.28,-81.07],[-68.14,-81.13],[-67.97,-81.15],[-65.57,-81.46],[-64.75,-81.52],[-63.48,-81.55],[-62.49,-81.56],[-62.35,-81.58],[-62.17,-81.64],[-62.54,-81.68],[-62.95,-81.68],[-63.55,-81.67],[-63.77,-81.68],[-64.23,-81.66],[-64.48,-81.67],[-64.7,-81.65],[-65.02,-81.7],[-65.62,-81.73],[-65.49,-81.78],[-65.26,-81.79],[-64.81,-81.8],[-64.19,-81.79],[-64.14,-81.87],[-64.71,-81.89],[-65.92,-81.9],[-66.04,-81.91],[-66.13,-81.95],[-65.95,-81.97],[-65.84,-81.99],[-65.79,-82.05],[-65.91,-82.18],[-65.71,-82.28],[-65.57,-82.29],[-65.42,-82.28],[-65.17,-82.32],[-64.92,-82.37],[-64.4,-82.37],[-63.77,-82.3],[-63.47,-82.31],[-62.65,-82.26],[-61.9,-82.27],[-60.86,-82.19],[-60.69,-82.19],[-60.53,-82.2],[-60.82,-82.28],[-62.09,-82.47],[-62.55,-82.5],[-62.74,-82.53],[-62.63,-82.62],[-62.47,-82.72],[-62.13,-82.82],[-61.92,-82.98],[-61.71,-83.01],[-61.31,-82.94],[-61.22,-82.99],[-61.2,-83.1],[-61.3,-83.18],[-61.44,-83.23],[-61.53,-83.28],[-61.59,-83.34],[-61.43,-83.4],[-60.98,-83.43],[-60.4,-83.44],[-59.85,-83.44],[-59.52,-83.46],[-58.29,-83.12],[-57.8,-82.96],[-57.56,-82.89],[-57.35,-82.84],[-56.32,-82.63],[-56.08,-82.57],[-55.8,-82.48],[-55.29,-82.46],[-54.6,-82.32],[-53.99,-82.2],[-53.74,-82.18],[-53.56,-82.17],[-53.34,-82.14],[-52.8,-82.15],[-52.41,-82.13],[-51.73,-82.06],[-51.21,-82.02],[-50.65,-81.98],[-50.03,-81.97],[-48.36,-81.89],[-47.89,-81.93],[-47.36,-82.0],[-47.02,-82.0],[-46.57,-81.98],[-46.26,-81.95],[-46.12,-82.04],[-46.05,-82.16],[-46.2,-82.27],[-46.45,-82.34],[-46.52,-82.45],[-46.18,-82.51],[-45.79,-82.49],[-45.04,-82.44],[-44.45,-82.37],[-44.29,-82.32],[-44.06,-82.33],[-43.67,-82.27],[-43.18,-82.02],[-42.56,-81.76],[-42.05,-81.6],[-41.71,-81.41],[-41.43,-81.3],[-41.13,-81.21],[-40.91,-81.17],[-40.44,-81.17],[-39.76,-81.03],[-38.77,-80.88],[-38.01,-80.95],[-37.21,-81.06],[-36.81,-80.97],[-36.5,-80.96],[-36.23,-80.92],[-35.97,-80.89],[-35.78,-80.81],[-35.52,-80.75],[-35.33,-80.65],[-34.35,-80.6],[-33.33,-80.54],[-33.19,-80.52],[-33.06,-80.53],[-32.71,-80.51],[-32.26,-80.46],[-31.63,-80.44],[-31.31,-80.45],[-31.02,-80.31],[-30.43,-80.28],[-29.8,-80.22],[-29.53,-80.18],[-29.33,-80.17],[-24.24,-80.06],[-24.02,-80.01],[-23.57,-79.96],[-23.41,-79.86],[-24.09,-79.81],[-24.3,-79.77],[-24.53,-79.76],[-24.67,-79.77],[-25.26,-79.76],[-29.95,-79.6],[-30.05,-79.59],[-30.21,-79.49],[-30.18,-79.3],[-30.32,-79.16],[-30.65,-79.12],[-30.99,-79.13],[-31.41,-79.15],[-32.54,-79.22],[-32.99,-79.23],[-34.2,-79.11],[-34.99,-78.98],[-35.52,-78.93],[-35.89,-78.84],[-36.24,-78.77],[-36.27,-78.62],[-36.18,-78.47],[-35.51,-78.04],[-35.09,-77.84],[-34.81,-77.82],[-34.55,-77.73],[-34.29,-77.52],[-34.08,-77.43],[-33.59,-77.31],[-33.38,-77.28],[-32.61,-77.14],[-32.41,-77.14],[-32.06,-77.16],[-31.68,-77.03],[-30.49,-76.76],[-30.22,-76.66],[-29.89,-76.6],[-28.93,-76.37],[-28.08,-76.26],[-27.65,-76.23],[-27.13,-76.16],[-26.56,-76.05],[-26.06,-75.96],[-24.27,-75.77],[-23.2,-75.72],[-22.47,-75.66],[-21.95,-75.69],[-21.43,-75.68],[-20.99,-75.63],[-20.78,-75.59],[-20.49,-75.49],[-19.49,-75.54],[-18.85,-75.47],[-18.59,-75.46],[-18.3,-75.43],[-18.42,-75.4],[-18.52,-75.39],[-18.62,-75.34],[-18.75,-75.24],[-18.62,-75.12],[-18.52,-75.05],[-18.22,-74.97],[-18.07,-74.86],[-17.92,-74.7],[-17.44,-74.38],[-17.3,-74.33],[-16.99,-74.32],[-16.73,-74.33],[-16.43,-74.32],[-15.67,-74.41],[-15.53,-74.38],[-15.29,-74.28],[-15.09,-74.16],[-14.66,-73.99],[-14.57,-73.94],[-14.61,-73.85],[-15.26,-73.89],[-15.75,-73.95],[-16.22,-73.92],[-16.28,-73.87],[-16.18,-73.83],[-16.0,-73.82],[-15.94,-73.76],[-16.1,-73.71],[-16.39,-73.68],[-16.52,-73.64],[-16.51,-73.56],[-16.44,-73.43],[-16.28,-73.39],[-16.15,-73.33],[-15.8,-73.15],[-15.6,-73.1],[-15.01,-73.05],[-14.32,-73.12],[-14.16,-73.1],[-14.0,-73.0],[-14.17,-72.84],[-14.3,-72.78],[-14.3,-72.73],[-13.94,-72.76],[-13.6,-72.79],[-13.21,-72.79],[-12.75,-72.63],[-12.09,-72.5],[-11.78,-72.44],[-11.5,-72.41],[-11.35,-72.28],[-11.12,-72.03],[-10.96,-71.9],[-10.96,-71.82],[-11.01,-71.76],[-11.18,-71.78],[-11.33,-71.79],[-11.7,-71.72],[-12.15,-71.61],[-12.28,-71.5],[-12.35,-71.39],[-12.21,-71.33],[-12.07,-71.3],[-11.93,-71.29],[-11.66,-71.33],[-11.33,-71.44],[-11.16,-71.48],[-10.97,-71.56],[-10.83,-71.55],[-10.66,-71.44],[-10.52,-71.3],[-10.41,-71.25],[-10.23,-71.2],[-10.03,-71.13],[-10.12,-71.06],[-10.33,-71.02],[-10.36,-70.98],[-10.27,-70.94],[-10.1,-70.93],[-9.89,-71.03],[-9.6,-71.1],[-9.4,-71.12],[-9.23,-71.17],[-8.97,-71.36],[-8.65,-71.67],[-8.5,-71.67],[-8.22,-71.65],[-7.92,-71.64],[-7.71,-71.55],[-7.67,-71.32],[-7.59,-71.22],[-7.62,-71.12],[-7.76,-71.02],[-7.87,-70.94],[-7.85,-70.88],[-7.75,-70.84],[-7.62,-70.83],[-7.39,-70.79],[-7.03,-70.84],[-6.84,-70.84],[-6.55,-70.82],[-6.25,-70.76],[-5.94,-70.71],[-5.69,-70.75],[-5.59,-70.86],[-5.71,-70.97],[-5.9,-71.05],[-6.08,-71.15],[-6.13,-71.27],[-6.12,-71.33],[-5.95,-71.34],[-4.45,-71.33],[-4.25,-71.34],[-3.99,-71.34],[-3.71,-71.37],[-3.24,-71.36],[-2.81,-71.32],[-2.61,-71.32],[-2.26,-71.36],[-2.01,-71.43],[-1.5,-71.41],[-1.35,-71.39],[-1.22,-71.28],[-1.07,-71.27],[-0.9,-71.35],[-0.84,-71.54],[-0.76,-71.63],[-0.54,-71.71],[-0.33,-71.64],[-0.18,-71.56],[0.15,-71.4],[0.54,-71.27],[0.83,-71.2],[1.55,-71.08],[1.91,-71.0],[2.61,-70.9],[3.51,-70.84],[5.11,-70.66],[5.64,-70.64],[6.51,-70.59],[6.95,-70.54],[7.4,-70.49],[7.68,-70.36],[8.31,-70.46],[8.52,-70.47],[8.82,-70.39],[9.14,-70.18],[9.61,-70.27],[9.89,-70.4],[10.22,-70.51],[10.97,-70.69],[11.2,-70.73],[11.7,-70.77],[11.83,-70.74],[12.07,-70.62],[12.31,-70.44],[12.46,-70.37],[12.68,-70.31],[12.93,-70.21],[12.86,-70.16],[12.72,-70.14],[12.6,-70.12],[12.63,-70.07],[13.07,-70.05],[13.3,-70.23],[13.53,-70.29],[13.82,-70.34],[14.49,-70.3],[15.06,-70.29],[15.56,-70.33],[15.81,-70.32],[16.03,-70.19],[16.38,-70.15],[16.58,-70.2],[16.71,-70.4],[17.17,-70.45],[18.12,-70.54],[18.23,-70.52],[18.35,-70.42],[18.43,-70.29],[18.63,-70.27],[18.88,-70.2],[19.01,-70.21],[19.2,-70.29],[19.13,-70.49],[19.03,-70.67],[19.15,-70.82],[19.27,-70.9],[19.41,-70.92],[19.65,-70.92],[19.94,-70.91],[20.13,-70.92],[21.07,-70.84],[21.19,-70.68],[21.34,-70.5],[21.7,-70.26],[21.85,-70.28],[21.96,-70.3],[22.22,-70.42],[22.37,-70.48],[22.4,-70.56],[22.23,-70.64],[22.28,-70.7],[22.45,-70.74],[22.98,-70.81],[23.15,-70.8],[23.41,-70.72],[23.66,-70.58],[23.8,-70.4],[24.02,-70.41],[24.24,-70.45],[24.39,-70.54],[24.39,-70.7],[24.59,-70.82],[24.76,-70.89],[25.19,-70.97],[25.65,-70.99],[25.97,-71.04],[26.5,-71.02],[26.75,-70.97],[26.92,-70.95],[27.21,-70.91],[27.51,-70.81],[27.7,-70.77],[28.39,-70.68],[28.91,-70.58],[29.46,-70.41],[30.0,-70.3],[30.83,-70.25],[31.06,-70.22],[31.38,-70.23],[32.16,-70.1],[32.46,-70.03],[32.62,-70.0],[32.81,-69.91],[32.91,-69.73],[32.99,-69.62],[32.98,-69.52],[32.9,-69.38],[32.74,-69.25],[32.57,-69.07],[32.64,-68.87],[32.78,-68.78],[33.12,-68.69],[33.47,-68.67],[33.85,-68.68],[34.19,-68.7],[34.22,-68.79],[34.07,-68.89],[33.88,-68.98],[33.77,-69.02],[33.81,-69.1],[34.06,-69.11],[34.6,-69.09],[34.75,-69.17],[35.13,-69.49],[35.22,-69.64],[35.36,-69.68],[35.57,-69.66],[36.02,-69.66],[36.33,-69.64],[36.59,-69.64],[36.72,-69.65],[36.86,-69.73],[37.11,-69.81],[37.37,-69.75],[37.56,-69.72],[37.79,-69.73],[38.14,-69.82],[38.5,-70.06],[38.89,-70.17],[38.91,-70.1],[38.86,-70.01],[39.02,-69.92],[39.21,-69.79],[39.49,-69.61],[39.71,-69.43],[39.76,-69.17],[39.86,-68.97],[40.04,-68.87],[40.22,-68.8],[40.48,-68.74],[40.82,-68.72],[41.13,-68.58],[41.36,-68.51],[41.82,-68.43],[42.41,-68.35],[42.82,-68.12],[42.96,-68.1],[43.17,-68.06],[43.55,-68.05],[44.18,-67.97],[44.37,-67.96],[44.7,-67.9],[44.99,-67.77],[45.2,-67.73],[45.57,-67.74],[45.89,-67.66],[46.15,-67.66],[46.4,-67.62],[46.44,-67.53],[46.32,-67.48],[46.32,-67.4],[46.45,-67.3],[46.56,-67.27],[46.88,-67.27],[47.15,-67.36],[47.35,-67.36],[47.4,-67.41],[47.23,-67.47],[47.12,-67.57],[47.31,-67.66],[47.49,-67.73],[47.7,-67.72],[47.96,-67.66],[48.21,-67.7],[48.32,-67.79],[48.32,-67.92],[48.37,-67.99],[48.55,-67.93],[48.65,-67.79],[48.62,-67.63],[48.63,-67.52],[49.05,-67.35],[49.22,-67.23],[48.92,-67.2],[48.71,-67.22],[48.6,-67.17],[48.47,-67.04],[48.83,-66.94],[49.25,-66.94],[49.49,-67.03],[50.01,-67.18],[50.29,-67.17],[50.55,-67.19],[50.61,-67.15],[50.51,-66.94],[50.52,-66.82],[50.31,-66.75],[50.24,-66.6],[50.33,-66.44],[50.59,-66.36],[50.94,-66.32],[51.69,-66.07],[51.88,-66.02],[52.38,-65.97],[52.96,-65.95],[53.67,-65.86],[54.95,-65.92],[55.29,-65.95],[55.5,-66.0],[55.71,-66.08],[55.97,-66.21],[56.36,-66.37],[56.86,-66.42],[57.0,-66.47],[57.19,-66.61],[56.99,-66.7],[56.82,-66.71],[56.51,-66.66],[56.29,-66.6],[56.15,-66.63],[56.29,-66.72],[56.45,-66.78],[56.48,-66.86],[56.39,-66.97],[55.8,-67.2],[56.15,-67.26],[56.37,-67.21],[56.56,-67.12],[56.76,-67.07],[56.89,-67.06],[57.36,-67.05],[57.63,-67.01],[57.83,-67.04],[58.03,-67.1],[58.32,-67.16],[58.74,-67.23],[59.25,-67.48],[59.65,-67.46],[59.87,-67.4],[60.48,-67.39],[61.01,-67.5],[61.31,-67.54],[62.17,-67.58],[62.69,-67.65],[63.02,-67.56],[63.24,-67.53],[63.7,-67.51],[63.93,-67.53],[64.57,-67.62],[65.71,-67.72],[66.49,-67.77],[67.17,-67.77],[67.5,-67.81],[68.1,-67.85],[68.33,-67.89],[68.9,-67.86],[69.17,-67.82],[69.42,-67.74],[69.56,-67.76],[69.66,-67.86],[69.6,-68.04],[69.7,-68.16],[69.79,-68.28],[69.91,-68.38],[69.98,-68.46],[69.93,-68.54],[69.76,-68.6],[69.53,-68.74],[69.55,-68.86],[69.65,-68.93],[69.53,-69.02],[69.61,-69.15],[69.63,-69.23],[69.55,-69.29],[69.37,-69.33],[69.06,-69.34],[68.91,-69.37],[68.88,-69.47],[68.96,-69.54],[69.14,-69.58],[69.19,-69.65],[69.16,-69.77],[69.08,-69.87],[68.92,-69.91],[68.74,-69.92],[68.42,-69.9],[68.18,-69.84],[68.03,-69.89],[67.92,-69.95],[67.58,-70.09],[67.42,-70.18],[67.27,-70.27],[67.66,-70.33],[67.94,-70.42],[68.56,-70.41],[68.76,-70.37],[69.02,-70.33],[69.16,-70.33],[69.25,-70.43],[69.2,-70.59],[69.19,-70.7],[68.87,-71.04],[68.77,-71.09],[68.62,-71.18],[68.45,-71.25],[68.31,-71.29],[68.04,-71.39],[67.87,-71.58],[67.69,-71.74],[67.43,-72.0],[67.28,-72.29],[67.21,-72.46],[67.11,-72.64],[66.89,-72.95],[66.75,-73.0],[66.5,-73.13],[66.57,-73.21],[66.76,-73.22],[67.0,-73.24],[67.32,-73.3],[67.75,-73.17],[67.97,-73.09],[68.02,-72.92],[67.97,-72.75],[68.11,-72.65],[68.42,-72.52],[69.16,-72.42],[69.31,-72.41],[69.55,-72.37],[69.77,-72.25],[69.96,-72.13],[70.29,-72.06],[70.57,-71.93],[70.62,-71.84],[70.73,-71.82],[71.08,-71.74],[71.17,-71.67],[71.28,-71.62],[71.35,-71.51],[71.38,-71.31],[71.46,-71.15],[71.63,-70.95],[71.77,-70.8],[71.9,-70.71],[72.26,-70.66],[72.42,-70.6],[72.62,-70.47],[72.76,-70.4],[72.74,-70.24],[72.82,-70.1],[73.04,-70.01],[73.32,-69.85],[73.68,-69.83],[73.94,-69.74],[74.23,-69.8],[74.57,-69.88],[75.15,-69.86],[75.42,-69.89],[75.64,-69.85],[75.82,-69.73],[75.89,-69.58],[76.11,-69.49],[76.36,-69.49],[76.77,-69.34],[77.19,-69.21],[77.54,-69.17],[77.82,-69.07],[78.02,-68.89],[78.23,-68.76],[78.49,-68.63],[78.56,-68.39],[78.73,-68.28],[79.04,-68.18],[79.29,-68.12],[80.36,-67.95],[81.19,-67.83],[82.02,-67.69],[82.27,-67.69],[82.61,-67.61],[83.16,-67.61],[83.3,-67.6],[83.49,-67.44],[83.9,-67.29],[84.16,-67.24],[84.49,-67.11],[84.75,-67.1],[85.12,-67.13],[85.43,-67.16],[85.71,-67.16],[86.12,-67.05],[86.75,-67.04],[86.95,-66.99],[87.08,-66.94],[87.98,-66.79],[88.31,-66.82],[88.79,-66.79],[89.08,-66.8],[89.35,-66.82],[89.7,-66.82],[90.29,-66.77],[90.55,-66.73],[91.02,-66.6],[91.55,-66.57],[91.78,-66.54],[92.07,-66.51],[92.31,-66.56],[92.49,-66.6],[92.59,-66.61],[92.73,-66.62],[93.07,-66.57],[93.36,-66.59],[93.72,-66.64],[93.96,-66.69],[94.09,-66.69],[94.31,-66.65],[94.59,-66.54],[94.84,-66.5],[95.08,-66.53],[95.25,-66.57],[95.54,-66.63],[95.99,-66.62],[96.42,-66.6],[96.79,-66.55],[97.1,-66.5],[97.39,-66.58],[97.72,-66.61],[98.26,-66.47],[98.46,-66.5],[98.6,-66.53],[98.72,-66.55],[98.86,-66.67],[99.37,-66.65],[99.82,-66.55],[100.21,-66.47],[100.59,-66.43],[100.89,-66.36],[101.33,-66.1],[101.32,-66.02],[101.38,-65.97],[101.47,-65.95],[102.17,-65.95],[102.39,-65.93],[102.67,-65.87],[103.17,-65.92],[103.64,-66.0],[103.76,-65.99],[103.95,-65.99],[104.29,-66.04],[104.67,-66.14],[105.0,-66.16],[106.39,-66.41],[107.17,-66.47],[107.57,-66.55],[107.67,-66.58],[107.79,-66.66],[107.99,-66.67],[108.16,-66.64],[108.38,-66.77],[108.91,-66.86],[109.46,-66.91],[109.82,-66.83],[110.44,-66.62],[110.62,-66.52],[110.59,-66.31],[110.91,-66.08],[111.45,-65.96],[112.13,-65.9],[112.55,-65.85],[113.1,-65.8],[113.37,-65.85],[113.5,-65.89],[113.71,-65.93],[113.95,-66.06],[114.34,-66.36],[114.62,-66.47],[114.87,-66.48],[115.08,-66.49],[115.31,-66.56],[115.64,-66.77],[115.44,-66.96],[115.27,-67.03],[114.57,-67.11],[114.26,-67.17],[113.99,-67.21],[113.91,-67.37],[114.03,-67.44],[114.32,-67.41],[114.66,-67.39],[114.93,-67.36],[115.17,-67.31],[115.38,-67.24],[115.89,-67.2],[116.21,-67.14],[116.51,-67.11],[116.71,-67.05],[116.92,-67.06],[117.13,-67.11],[117.3,-67.11],[117.74,-67.13],[117.95,-67.09],[118.14,-67.08],[118.33,-67.12],[118.52,-67.16],[118.71,-67.17],[118.96,-67.14],[119.32,-67.07],[119.77,-66.99],[120.19,-66.97],[120.29,-66.97],[120.37,-66.98],[119.95,-67.08],[119.28,-67.2],[118.92,-67.32],[119.13,-67.37],[120.4,-67.24],[120.98,-67.14],[121.49,-67.09],[121.61,-67.06],[122.03,-66.9],[122.18,-66.86],[122.63,-66.8],[123.22,-66.75],[123.67,-66.68],[123.97,-66.61],[124.2,-66.6],[124.37,-66.65],[124.6,-66.71],[124.82,-66.69],[125.1,-66.64],[125.29,-66.52],[125.4,-66.42],[125.6,-66.39],[125.87,-66.36],[126.08,-66.4],[126.42,-66.46],[126.66,-66.5],[126.87,-66.76],[127.37,-66.99],[127.54,-67.05],[127.97,-67.03],[128.43,-67.12],[128.63,-67.11],[128.82,-67.08],[128.98,-67.1],[129.24,-67.04],[129.5,-66.75],[129.74,-66.47],[129.98,-66.34],[130.12,-66.29],[130.3,-66.27],[130.58,-66.21],[130.95,-66.19],[131.23,-66.22],[131.83,-66.24],[132.32,-66.17],[132.87,-66.18],[133.15,-66.09],[133.44,-66.08],[133.84,-66.15],[133.96,-66.2],[134.18,-66.28],[134.23,-66.35],[134.29,-66.48],[134.4,-66.48],[134.77,-66.35],[134.97,-66.33],[135.35,-66.13],[135.55,-66.18],[136.01,-66.27],[136.19,-66.29],[136.55,-66.44],[136.74,-66.41],[136.89,-66.34],[137.34,-66.35],[137.75,-66.41],[137.93,-66.46],[138.14,-66.54],[138.27,-66.56],[138.38,-66.54],[139.24,-66.57],[139.61,-66.64],[139.9,-66.72],[140.9,-66.75],[141.29,-66.83],[141.52,-66.79],[141.97,-66.81],[142.16,-66.87],[142.33,-66.95],[142.69,-67.01],[142.89,-67.0],[143.17,-66.95],[143.45,-66.88],[143.73,-66.88],[143.86,-66.94],[143.91,-67.09],[144.12,-67.09],[144.35,-67.02],[144.55,-67.04],[144.62,-67.14],[144.52,-67.28],[144.26,-67.48],[144.15,-67.64],[143.94,-67.79],[143.98,-67.86],[144.19,-67.9],[144.4,-67.79],[144.88,-67.72],[145.13,-67.63],[145.56,-67.59],[145.98,-67.62],[146.28,-67.75],[146.83,-67.96],[146.85,-68.04],[146.9,-68.12],[146.88,-68.19],[146.8,-68.27],[147.09,-68.37],[147.35,-68.38],[147.57,-68.38],[148.46,-68.47],[148.88,-68.43],[149.26,-68.43],[149.72,-68.42],[150.07,-68.42],[150.34,-68.44],[150.67,-68.4],[150.94,-68.36],[151.07,-68.38],[151.12,-68.62],[151.14,-68.76],[151.29,-68.82],[151.45,-68.76],[151.56,-68.69],[152.27,-68.73],[152.55,-68.73],[152.81,-68.77],[153.08,-68.86],[153.34,-68.82],[153.5,-68.76],[153.71,-68.73],[153.77,-68.64],[153.79,-68.49],[153.78,-68.35],[153.91,-68.32],[154.03,-68.35],[154.2,-68.42],[154.58,-68.63],[154.87,-68.77],[154.99,-68.84],[155.16,-68.89],[155.52,-69.02],[156.01,-69.08],[156.49,-69.18],[157.05,-69.18],[157.48,-69.31],[157.78,-69.2],[157.93,-69.18],[158.16,-69.21],[158.43,-69.3],[158.65,-69.32],[159.39,-69.47],[159.78,-69.52],[159.93,-69.63],[160.13,-69.73],[160.13,-69.84],[160.21,-69.97],[160.65,-70.08],[160.83,-70.18],[161.04,-70.32],[161.42,-70.83],[161.63,-70.92],[161.92,-70.91],[162.19,-71.04],[162.28,-71.02],[162.29,-70.97],[162.04,-70.62],[162.02,-70.44],[162.22,-70.33],[162.67,-70.3],[163.03,-70.5],[163.35,-70.62],[163.57,-70.64],[164.0,-70.64],[164.4,-70.51],[164.72,-70.56],[165.21,-70.57],[165.85,-70.65],[166.13,-70.63],[166.63,-70.66],[167.23,-70.77],[167.57,-70.81],[167.64,-70.85],[167.8,-70.92],[167.88,-71.01],[167.97,-71.09],[168.17,-71.18],[168.38,-71.2],[168.8,-71.27],[169.66,-71.51],[169.98,-71.58],[170.16,-71.63],[170.25,-71.57],[170.28,-71.44],[170.44,-71.42],[170.6,-71.6],[170.78,-71.75],[170.86,-71.87],[170.68,-71.97],[170.41,-71.95],[170.22,-71.95],[170.03,-72.12],[169.95,-72.4],[170.13,-72.4],[170.26,-72.37],[170.29,-72.48],[170.21,-72.57],[170.05,-72.6],[169.77,-72.53],[169.44,-72.49],[169.07,-72.47],[168.72,-72.38],[168.58,-72.38],[168.43,-72.38],[168.62,-72.47],[168.82,-72.55],[169.27,-72.62],[169.83,-72.73],[169.84,-72.79],[169.71,-72.88],[169.55,-73.05],[169.03,-73.2],[168.74,-73.09],[168.38,-73.07],[168.2,-73.13],[167.85,-73.12],[167.16,-73.15],[166.88,-73.01],[166.45,-72.94],[166.47,-73.0],[166.83,-73.22],[167.23,-73.28],[167.62,-73.34],[167.71,-73.39],[167.53,-73.45],[167.3,-73.44],[167.0,-73.54],[166.43,-73.53],[166.16,-73.53],[166.0,-73.58],[165.86,-73.59],[165.97,-73.63],[166.11,-73.74],[165.91,-73.82],[165.73,-73.87],[165.55,-73.85],[165.35,-73.88],[165.25,-73.78],[165.24,-73.57],[165.13,-73.38],[165.0,-73.37],[164.81,-73.4],[164.75,-73.56],[164.89,-73.84],[164.98,-73.93],[164.91,-74.0],[164.78,-74.03],[165.04,-74.26],[165.26,-74.43],[165.4,-74.48],[165.41,-74.56],[165.3,-74.59],[165.0,-74.56],[164.85,-74.58],[164.69,-74.57],[164.41,-74.53],[164.17,-74.52],[163.94,-74.57],[163.74,-74.56],[163.56,-74.42],[163.4,-74.38],[163.27,-74.43],[163.17,-74.6],[162.96,-74.66],[162.75,-74.74],[162.6,-74.82],[162.53,-75.17],[162.41,-75.24],[162.23,-75.23],[162.09,-75.26],[161.91,-75.23],[161.68,-75.22],[160.91,-75.33],[161.03,-75.4],[161.23,-75.39],[161.9,-75.4],[162.19,-75.47],[162.24,-75.62],[162.35,-75.69],[162.58,-75.76],[162.75,-75.79],[162.82,-75.85],[162.75,-75.95],[162.65,-76.05],[162.44,-76.15],[162.5,-76.21],[162.73,-76.23],[162.82,-76.46],[162.67,-76.57],[162.75,-76.66],[162.76,-76.75],[162.61,-76.83],[162.49,-76.87],[162.45,-76.96],[162.68,-77.01],[162.85,-77.02],[163.09,-77.03],[163.25,-77.13],[163.46,-77.27],[163.61,-77.39],[163.62,-77.58],[163.77,-77.7],[164.05,-77.77],[164.04,-77.85],[164.23,-77.88],[164.42,-77.88],[164.49,-77.95],[164.43,-78.04],[164.11,-78.15],[163.98,-78.22],[164.3,-78.24],[164.63,-78.32],[165.05,-78.23],[165.27,-78.13],[165.42,-78.04],[165.52,-78.06],[165.53,-78.15],[165.66,-78.31],[166.21,-78.45],[166.51,-78.5],[166.8,-78.52],[167.06,-78.52],[167.13,-78.61],[167.05,-78.69],[166.85,-78.68],[166.52,-78.69],[166.29,-78.63],[166.12,-78.57],[164.63,-78.6],[164.3,-78.63],[163.9,-78.72],[163.5,-78.76],[162.9,-78.84],[162.64,-78.9],[161.97,-78.69],[161.76,-78.54],[161.67,-78.54],[161.51,-78.57],[161.5,-78.68],[161.81,-78.91],[161.95,-78.97],[161.95,-79.03],[161.86,-79.06],[161.74,-79.06],[161.55,-79.02],[161.19,-78.98],[160.87,-79.05],[160.48,-79.2],[160.57,-79.3],[160.67,-79.36],[160.65,-79.43],[160.21,-79.55],[160.07,-79.56],[159.98,-79.59],[160.08,-79.63],[160.32,-79.64],[160.35,-79.69],[160.26,-79.74],[159.87,-79.79],[159.9,-79.86],[160.11,-79.89],[160.39,-79.88],[160.56,-79.93],[160.56,-80.01],[160.38,-80.05],[160.18,-80.09],[158.77,-80.29],[158.56,-80.35],[158.57,-80.42],[159.07,-80.44],[160.54,-80.42],[160.64,-80.45],[160.6,-80.51],[160.52,-80.58],[160.6,-80.64],[160.82,-80.67],[160.83,-80.73],[160.72,-80.75],[160.5,-80.78],[160.26,-80.79],[160.28,-80.85],[160.61,-80.9],[160.72,-80.91],[160.73,-81.11],[160.72,-81.2],[160.54,-81.24],[160.48,-81.27],[160.47,-81.34],[160.91,-81.39],[161.58,-81.61],[161.73,-81.61],[162.0,-81.65],[162.43,-81.76],[162.58,-81.83],[162.82,-81.87],[162.85,-81.92],[163.0,-81.97],[163.6,-82.12],[163.68,-82.19],[162.43,-82.31],[161.17,-82.41],[161.28,-82.49],[162.64,-82.48],[163.01,-82.53],[163.17,-82.52],[163.27,-82.46],[164.0,-82.4],[164.75,-82.35],[164.98,-82.38],[165.98,-82.63],[166.45,-82.72],[166.74,-82.76],[166.96,-82.76],[167.12,-82.8],[167.27,-82.88],[167.23,-82.95],[167.3,-82.99],[167.4,-83.0],[167.6,-83.05],[167.83,-83.03],[168.09,-82.97],[168.28,-82.99],[168.61,-83.07],[168.48,-83.13],[168.41,-83.16],[168.32,-83.21],[168.24,-83.23],[167.97,-83.24],[167.83,-83.24],[167.67,-83.23],[167.66,-83.27],[167.84,-83.32],[168.11,-83.36],[169.84,-83.4],[170.33,-83.48],[170.82,-83.44],[171.04,-83.45],[171.22,-83.48],[171.29,-83.56],[171.54,-83.58],[171.92,-83.64],[172.45,-83.68],[172.87,-83.67],[173.4,-83.76],[173.66,-83.76],[173.82,-83.81],[175.01,-83.84],[175.19,-83.88],[175.32,-83.94],[175.61,-83.97],[175.91,-83.97],[177.58,-84.07],[178.21,-84.13],[178.35,-84.13],[178.5,-84.14],[178.94,-84.18],[179.4,-84.21],[179.62,-84.27],[180.0,-84.35],[180.0,-90.0],[178.59,-90.0],[177.19,-90.0],[175.78,-90.0],[174.38,-90.0],[172.97,-90.0],[171.56,-90.0],[170.16,-90.0],[168.75,-90.0],[167.34,-90.0],[165.94,-90.0],[164.53,-90.0],[163.12,-90.0],[161.72,-90.0],[160.31,-90.0],[158.91,-90.0],[157.5,-90.0],[156.09,-90.0],[154.69,-90.0],[153.28,-90.0],[151.88,-90.0],[150.47,-90.0],[149.06,-90.0],[147.66,-90.0],[146.25,-90.0],[144.84,-90.0],[143.44,-90.0],[142.03,-90.0],[140.62,-90.0],[139.22,-90.0],[137.81,-90.0],[136.41,-90.0],[135.0,-90.0],[133.59,-90.0],[132.19,-90.0],[130.78,-90.0],[129.38,-90.0],[127.97,-90.0],[126.56,-90.0],[125.16,-90.0],[123.75,-90.0],[122.34,-90.0],[120.94,-90.0],[119.53,-90.0],[118.12,-90.0],[116.72,-90.0],[115.31,-90.0],[113.91,-90.0],[112.5,-90.0],[111.09,-90.0],[109.69,-90.0],[108.28,-90.0],[106.88,-90.0],[105.47,-90.0],[104.06,-90.0],[102.66,-90.0],[101.25,-90.0],[99.84,-90.0],[98.44,-90.0],[97.03,-90.0],[95.62,-90.0],[94.22,-90.0],[92.81,-90.0],[91.41,-90.0],[90.0,-90.0],[88.59,-90.0],[87.19,-90.0],[85.78,-90.0],[84.38,-90.0],[82.97,-90.0],[81.56,-90.0],[80.16,-90.0],[78.75,-90.0],[77.34,-90.0],[75.94,-90.0],[74.53,-90.0],[73.12,-90.0],[71.72,-90.0],[70.31,-90.0],[68.91,-90.0],[67.5,-90.0],[66.09,-90.0],[64.69,-90.0],[63.28,-90.0],[61.88,-90.0],[60.47,-90.0],[59.06,-90.0],[57.66,-90.0],[56.25,-90.0],[54.84,-90.0],[53.44,-90.0],[52.03,-90.0],[50.62,-90.0],[49.22,-90.0],[47.81,-90.0],[46.41,-90.0],[45.0,-90.0],[43.59,-90.0],[42.19,-90.0],[40.78,-90.0],[39.38,-90.0],[37.97,-90.0],[36.56,-90.0],[35.16,-90.0],[33.75,-90.0],[32.34,-90.0],[30.94,-90.0],[29.53,-90.0],[28.12,-90.0],[26.72,-90.0],[25.31,-90.0],[23.91,-90.0],[22.5,-90.0],[21.09,-90.0],[19.69,-90.0],[18.28,-90.0],[16.88,-90.0],[15.47,-90.0],[14.06,-90.0],[12.66,-90.0],[11.25,-90.0],[9.84,-90.0],[8.44,-90.0],[7.03,-90.0],[5.62,-90.0],[4.22,-90.0],[2.81,-90.0],[1.41,-90.0],[0.0,-90.0],[-1.41,-90.0],[-2.81,-90.0],[-4.22,-90.0],[-5.63,-90.0],[-7.03,-90.0],[-8.44,-90.0],[-9.84,-90.0],[-11.25,-90.0],[-12.66,-90.0],[-14.06,-90.0],[-15.47,-90.0],[-16.88,-90.0],[-18.28,-90.0],[-19.69,-90.0],[-21.09,-90.0],[-22.5,-90.0],[-23.91,-90.0],[-25.31,-90.0],[-26.72,-90.0],[-28.12,-90.0],[-29.53,-90.0],[-30.94,-90.0],[-32.34,-90.0],[-33.75,-90.0],[-35.16,-90.0],[-36.56,-90.0],[-37.97,-90.0],[-39.38,-90.0],[-40.78,-90.0],[-42.19,-90.0],[-43.59,-90.0],[-45.0,-90.0],[-46.41,-90.0],[-47.81,-90.0],[-49.22,-90.0],[-50.62,-90.0],[-52.03,-90.0],[-53.44,-90.0],[-54.84,-90.0],[-56.25,-90.0],[-57.66,-90.0],[-59.06,-90.0],[-60.47,-90.0],[-61.88,-90.0],[-63.28,-90.0],[-64.69,-90.0],[-66.09,-90.0],[-67.5,-90.0],[-68.91,-90.0],[-70.31,-90.0],[-71.72,-90.0],[-73.12,-90.0],[-74.53,-90.0],[-75.94,-90.0],[-77.34,-90.0],[-78.75,-90.0],[-80.16,-90.0],[-81.56,-90.0],[-82.97,-90.0],[-84.38,-90.0],[-85.78,-90.0],[-87.19,-90.0],[-88.59,-90.0],[-90.0,-90.0],[-91.41,-90.0],[-92.81,-90.0],[-94.22,-90.0],[-95.62,-90.0],[-97.03,-90.0],[-98.44,-90.0],[-99.84,-90.0],[-101.25,-90.0],[-102.66,-90.0],[-104.06,-90.0],[-105.47,-90.0],[-106.88,-90.0],[-108.28,-90.0],[-109.69,-90.0],[-111.09,-90.0],[-112.5,-90.0],[-113.91,-90.0],[-115.31,-90.0],[-116.72,-90.0],[-118.12,-90.0],[-119.53,-90.0],[-120.94,-90.0],[-122.34,-90.0],[-123.75,-90.0],[-125.16,-90.0],[-126.56,-90.0],[-127.97,-90.0],[-129.38,-90.0],[-130.78,-90.0],[-132.19,-90.0],[-133.59,-90.0],[-135.0,-90.0],[-136.41,-90.0],[-137.81,-90.0],[-139.22,-90.0],[-140.62,-90.0],[-142.03,-90.0],[-143.44,-90.0],[-144.84,-90.0],[-146.25,-90.0],[-147.66,-90.0],[-149.06,-90.0],[-150.47,-90.0],[-151.88,-90.0],[-153.28,-90.0],[-154.69,-90.0],[-156.09,-90.0],[-157.5,-90.0],[-158.91,-90.0],[-160.31,-90.0],[-161.72,-90.0],[-163.12,-90.0],[-164.53,-90.0],[-165.94,-90.0],[-167.34,-90.0],[-168.75,-90.0],[-170.16,-90.0],[-171.56,-90.0],[-172.97,-90.0],[-174.38,-90.0],[-175.78,-90.0],[-177.19,-90.0],[-178.59,-90.0],[-180.0,-90.0],[-180.0,-89.58],[-180.0,-89.29],[-180.0,-88.59],[-180.0,-87.88],[-180.0,-87.18],[-180.0,-86.47],[-180.0,-85.76],[-180.0,-85.06],[-180.0,-84.35],[-178.39,-84.34],[-178.07,-84.35],[-177.73,-84.4],[-176.99,-84.4],[-176.29,-84.42],[-176.11,-84.48],[-175.87,-84.51],[-175.38,-84.48],[-174.99,-84.47],[-174.66,-84.46],[-171.7,-84.54],[-168.67,-84.68],[-168.05,-84.73],[-167.49,-84.83],[-166.91,-84.82],[-163.46,-84.9],[-162.93,-84.9],[-160.82,-84.99],[-157.13,-85.19],[-156.81,-85.19],[-156.46,-85.19],[-156.64,-85.08],[-156.99,-84.98],[-157.45,-84.91],[-157.15,-84.89],[-156.49,-84.89],[-156.62,-84.84],[-156.99,-84.81],[-158.3,-84.78],[-163.57,-84.53],[-163.69,-84.51],[-163.76,-84.49],[-163.9,-84.47],[-164.11,-84.45],[-164.92,-84.43],[-165.14,-84.41],[-165.24,-84.38],[-165.18,-84.37],[-165.13,-84.37],[-163.9,-84.35],[-163.77,-84.32],[-163.76,-84.31],[-163.82,-84.29],[-164.03,-84.27],[-164.53,-84.19],[-164.69,-84.15],[-164.6,-84.1],[-164.5,-84.07],[-164.12,-84.05],[-164.01,-84.02],[-164.08,-83.95],[-164.95,-83.81],[-165.54,-83.76],[-165.92,-83.79],[-166.65,-83.79],[-167.55,-83.81],[-167.8,-83.79],[-168.05,-83.74],[-168.35,-83.64],[-168.5,-83.61],[-168.79,-83.53],[-169.17,-83.45],[-171.19,-83.26],[-171.54,-83.2],[-174.07,-82.9],[-174.17,-82.85],[-174.24,-82.79],[-173.07,-82.92],[-172.85,-82.92],[-172.59,-82.88],[-172.39,-82.89],[-172.12,-82.86],[-171.82,-82.85],[-171.03,-82.94],[-169.44,-83.1],[-169.02,-83.15],[-168.79,-83.19],[-168.6,-83.2],[-168.42,-83.23],[-168.19,-83.21],[-168.05,-83.23],[-167.72,-83.22],[-166.22,-83.2],[-165.62,-83.22],[-164.92,-83.29],[-164.64,-83.41],[-164.45,-83.47],[-164.06,-83.42],[-163.73,-83.37],[-163.11,-83.33],[-162.91,-83.35],[-162.57,-83.41],[-162.2,-83.52],[-160.59,-83.49],[-159.92,-83.49],[-159.44,-83.54],[-157.7,-83.38],[-157.43,-83.35],[-157.03,-83.23],[-157.36,-83.2],[-157.59,-83.19],[-157.68,-83.13],[-157.52,-83.11],[-157.02,-83.08],[-156.04,-83.03],[-155.46,-82.98],[-155.15,-82.86],[-153.82,-82.67],[-153.4,-82.59],[-153.01,-82.45],[-153.88,-82.18],[-154.72,-81.94],[-154.45,-81.87],[-154.19,-81.81],[-154.06,-81.77],[-153.96,-81.7],[-154.23,-81.62],[-154.49,-81.57],[-154.91,-81.51],[-156.49,-81.38],[-157.03,-81.32],[-156.82,-81.23],[-156.53,-81.16],[-155.92,-81.13],[-152.03,-81.03],[-148.12,-80.9],[-148.02,-80.84],[-148.54,-80.76],[-148.98,-80.74],[-149.15,-80.72],[-149.21,-80.67],[-149.21,-80.6],[-149.26,-80.59],[-149.43,-80.59],[-150.13,-80.51],[-150.28,-80.48],[-150.52,-80.41],[-150.58,-80.35],[-150.44,-80.21],[-150.22,-80.15],[-149.85,-80.12],[-149.58,-80.11],[-148.77,-80.11],[-148.45,-80.09],[-148.32,-80.07],[-148.34,-80.0],[-148.43,-79.97],[-148.43,-79.93],[-148.3,-79.91],[-148.13,-79.91],[-148.08,-79.86],[-148.18,-79.78],[-148.42,-79.73],[-149.05,-79.66],[-150.49,-79.55],[-151.05,-79.46],[-151.37,-79.39],[-151.64,-79.32],[-151.9,-79.28],[-152.09,-79.24],[-152.05,-79.19],[-152.14,-79.12],[-152.24,-79.1],[-152.7,-79.13],[-153.52,-79.12],[-154.52,-79.05],[-155.21,-78.96],[-156.11,-78.74],[-156.47,-78.64],[-156.21,-78.56],[-155.92,-78.51],[-154.72,-78.4],[-154.54,-78.36],[-154.29,-78.26],[-154.7,-78.22],[-155.04,-78.22],[-155.34,-78.19],[-156.57,-78.19],[-157.27,-78.2],[-157.85,-78.07],[-158.29,-77.95],[-158.41,-77.89],[-158.5,-77.78],[-158.35,-77.61],[-158.23,-77.5],[-158.25,-77.35],[-158.21,-77.16],[-158.0,-77.09],[-157.84,-77.08],[-157.47,-77.23],[-157.14,-77.24],[-156.67,-77.21],[-156.37,-77.13],[-156.21,-77.11],[-155.92,-77.1],[-155.36,-77.13],[-155.1,-77.12],[-154.81,-77.13],[-153.91,-77.23],[-153.71,-77.27],[-153.61,-77.31],[-153.57,-77.36],[-153.46,-77.42],[-153.08,-77.44],[-152.0,-77.41],[-151.72,-77.43],[-150.96,-77.57],[-150.31,-77.73],[-150.08,-77.77],[-149.72,-77.8],[-149.59,-77.77],[-149.47,-77.71],[-149.13,-77.64],[-148.34,-77.55],[-148.16,-77.46],[-148.26,-77.41],[-148.56,-77.36],[-148.74,-77.34],[-148.84,-77.28],[-148.84,-77.2],[-148.78,-77.12],[-148.57,-77.11],[-148.2,-77.21],[-147.73,-77.31],[-147.57,-77.33],[-147.44,-77.32],[-147.21,-77.29],[-146.93,-77.26],[-146.39,-77.47],[-146.07,-77.49],[-145.68,-77.49],[-145.6,-77.46],[-145.65,-77.4],[-145.71,-77.34],[-145.79,-77.33],[-145.81,-77.27],[-145.63,-77.22],[-145.52,-77.2],[-145.56,-77.16],[-145.75,-77.1],[-145.86,-77.09],[-145.97,-77.07],[-145.93,-77.03],[-145.81,-77.01],[-145.63,-76.95],[-145.69,-76.88],[-145.68,-76.8],[-145.75,-76.75],[-146.17,-76.66],[-146.78,-76.51],[-147.34,-76.44],[-148.6,-76.49],[-149.05,-76.46],[-149.34,-76.42],[-149.65,-76.37],[-149.28,-76.31],[-148.89,-76.27],[-148.78,-76.24],[-148.63,-76.17],[-148.46,-76.12],[-148.32,-76.1],[-147.86,-76.13],[-146.82,-76.32],[-146.6,-76.34],[-145.89,-76.42],[-145.69,-76.43],[-145.44,-76.41],[-145.64,-76.33],[-145.86,-76.27],[-146.38,-76.1],[-146.32,-76.02],[-145.99,-75.89],[-145.11,-75.88],[-144.72,-75.83],[-144.22,-75.73],[-143.57,-75.56],[-143.02,-75.54],[-142.33,-75.49],[-142.09,-75.53],[-141.51,-75.69],[-141.13,-75.75],[-141.01,-75.75],[-140.87,-75.75],[-141.22,-75.55],[-141.0,-75.52],[-140.71,-75.5],[-140.47,-75.45],[-140.29,-75.41],[-139.69,-75.21],[-139.15,-75.16],[-137.62,-75.08],[-137.09,-75.15],[-136.65,-75.16],[-136.55,-75.14],[-136.46,-75.04],[-136.23,-74.84],[-136.03,-74.77],[-135.36,-74.69],[-134.84,-74.69],[-134.47,-74.78],[-134.12,-74.83],[-133.8,-74.85],[-133.47,-74.85],[-132.99,-74.81],[-132.35,-74.79],[-132.05,-74.77],[-131.71,-74.81],[-130.86,-74.83],[-130.2,-74.89],[-129.79,-74.89],[-129.24,-74.83],[-128.94,-74.82],[-127.86,-74.72],[-127.02,-74.7],[-126.38,-74.74],[-125.35,-74.71],[-124.31,-74.74],[-123.89,-74.77],[-121.54,-74.75],[-119.68,-74.65],[-119.42,-74.62],[-119.02,-74.52],[-118.8,-74.42],[-118.66,-74.39],[-118.34,-74.38],[-117.81,-74.4],[-117.07,-74.47],[-116.43,-74.45],[-115.22,-74.49],[-115.11,-74.46],[-114.99,-74.28],[-114.79,-73.99],[-114.62,-73.9],[-114.35,-73.92],[-113.51,-74.09],[-113.49,-74.16],[-113.57,-74.21],[-113.71,-74.23],[-113.75,-74.37],[-113.64,-74.41],[-113.45,-74.39],[-113.33,-74.45],[-113.6,-74.56],[-113.78,-74.62],[-113.9,-74.64],[-113.98,-74.84],[-114.1,-74.91],[-114.11,-74.98],[-113.93,-74.98],[-113.75,-74.95],[-113.59,-74.94],[-113.09,-74.89],[-112.17,-74.83],[-111.87,-74.8],[-111.7,-74.79],[-111.58,-74.75],[-111.74,-74.65],[-111.79,-74.57],[-111.7,-74.5],[-111.72,-74.39],[-111.81,-74.27],[-111.63,-74.18],[-111.47,-74.2],[-111.18,-74.19],[-111.02,-74.23],[-110.77,-74.27],[-110.53,-74.29],[-110.31,-74.37],[-110.23,-74.54],[-110.3,-74.71],[-110.53,-74.84],[-110.97,-74.95],[-111.46,-75.13],[-111.36,-75.22],[-111.1,-75.19],[-109.99,-75.2],[-109.27,-75.19],[-108.82,-75.21],[-108.25,-75.25],[-107.8,-75.32],[-107.27,-75.33],[-106.93,-75.31],[-106.62,-75.34],[-105.4,-75.2],[-104.9,-75.12],[-104.62,-75.16],[-104.16,-75.12],[-103.9,-75.15],[-103.42,-75.1],[-103.12,-75.1],[-102.77,-75.12],[-101.71,-75.13],[-101.63,-75.22],[-101.3,-75.37],[-101.04,-75.42],[-100.71,-75.4],[-100.46,-75.35],[-100.08,-75.37],[-99.53,-75.31],[-98.98,-75.33],[-98.75,-75.32],[-98.65,-75.28],[-98.56,-75.19],[-98.73,-75.14],[-99.21,-75.08],[-99.65,-74.95],[-99.85,-74.92],[-100.16,-74.94],[-100.31,-74.91],[-100.47,-74.87],[-100.26,-74.82],[-100.01,-74.66],[-100.12,-74.52],[-100.24,-74.48],[-100.53,-74.49],[-100.88,-74.54],[-101.02,-74.5],[-101.25,-74.49],[-101.34,-74.35],[-101.59,-74.1],[-101.72,-74.02],[-102.11,-73.96],[-102.44,-73.93],[-102.77,-73.88],[-102.86,-73.78],[-102.8,-73.65],[-102.41,-73.62],[-102.04,-73.63],[-101.83,-73.66],[-101.59,-73.67],[-101.31,-73.7],[-101.13,-73.73],[-100.99,-73.76],[-100.72,-73.76],[-99.78,-73.72],[-99.66,-73.69],[-99.54,-73.65],[-99.34,-73.63],[-99.16,-73.64],[-98.9,-73.61],[-99.2,-73.57],[-99.53,-73.5],[-100.02,-73.4],[-100.44,-73.35],[-101.19,-73.32],[-101.57,-73.33],[-101.82,-73.31],[-102.68,-73.32],[-102.91,-73.29],[-103.08,-73.18],[-103.31,-72.95],[-103.38,-72.82],[-103.22,-72.77],[-103.11,-72.72],[-102.86,-72.72],[-102.48,-72.74],[-102.36,-72.76],[-102.27,-72.83],[-102.36,-72.91],[-102.48,-72.95],[-102.41,-72.99],[-102.03,-73.0],[-101.84,-73.02],[-101.68,-73.03],[-101.33,-73.0],[-100.82,-72.98],[-100.56,-73.02],[-100.26,-73.04],[-99.81,-73.0],[-98.21,-73.02],[-98.01,-73.03],[-97.82,-73.1],[-97.65,-73.14],[-97.48,-73.13],[-96.96,-73.21],[-96.68,-73.27],[-96.39,-73.3],[-96.15,-73.31],[-95.88,-73.29],[-95.53,-73.24],[-95.24,-73.22],[-95.03,-73.24],[-94.59,-73.25],[-94.25,-73.31],[-93.98,-73.29],[-93.71,-73.22],[-92.83,-73.16],[-92.24,-73.18],[-91.17,-73.31],[-90.92,-73.32],[-90.43,-73.24],[-90.27,-73.12],[-90.3,-72.98],[-90.15,-72.94],[-90.04,-72.96],[-89.82,-72.86],[-89.52,-72.87],[-89.34,-72.89],[-89.23,-72.83],[-89.13,-72.69],[-88.78,-72.68],[-88.53,-72.7],[-88.19,-72.79],[-88.19,-72.86],[-88.33,-72.93],[-88.56,-73.12],[-88.42,-73.23],[-88.2,-73.22],[-87.94,-73.24],[-87.61,-73.19],[-87.4,-73.19],[-87.04,-73.35],[-86.79,-73.36],[-86.6,-73.35],[-85.98,-73.21],[-85.8,-73.19],[-85.58,-73.26],[-85.26,-73.41],[-84.98,-73.5],[-84.57,-73.56],[-84.21,-73.57],[-83.8,-73.65],[-83.56,-73.71],[-83.04,-73.71],[-82.82,-73.73],[-82.18,-73.86],[-81.61,-73.8],[-81.31,-73.74],[-81.16,-73.63],[-81.24,-73.47],[-81.26,-73.31],[-81.18,-73.25],[-81.02,-73.24],[-80.34,-73.41],[-80.38,-73.31],[-80.44,-73.22],[-80.61,-73.08],[-80.59,-72.98],[-80.44,-72.94],[-80.15,-73.0],[-79.81,-73.03],[-79.52,-73.09],[-78.96,-73.31],[-78.79,-73.51],[-78.41,-73.56],[-78.14,-73.55],[-77.85,-73.52],[-77.44,-73.49],[-77.14,-73.5],[-76.85,-73.46],[-76.76,-73.57],[-77.03,-73.72],[-77.13,-73.82],[-77.05,-73.84],[-76.89,-73.82],[-76.75,-73.79],[-76.29,-73.81],[-75.92,-73.74],[-75.6,-73.71],[-75.29,-73.64],[-75.04,-73.65],[-74.86,-73.66],[-74.59,-73.72],[-74.35,-73.68],[-74.2,-73.7],[-74.0,-73.7],[-72.93,-73.45],[-72.69,-73.45],[-72.38,-73.44],[-71.99,-73.38],[-71.7,-73.35],[-71.45,-73.35],[-71.02,-73.26],[-70.32,-73.27],[-69.97,-73.23],[-69.28,-73.17],[-68.82,-73.11],[-68.0,-72.94],[-67.67,-72.83],[-67.31,-72.61],[-67.08,-72.39],[-66.83,-72.09],[-66.95,-71.9],[-67.08,-71.81],[-67.2,-71.72],[-67.46,-71.53],[-67.53,-71.28],[-67.5,-71.06],[-67.6,-70.84],[-67.69,-70.69],[-67.89,-70.42],[-68.13,-70.25],[-68.4,-70.02],[-68.4,-69.81],[-68.47,-69.64],[-68.64,-69.53],[-68.71,-69.43],[-68.58,-69.41],[-68.46,-69.38],[-68.14,-69.35],[-67.37,-69.41],[-67.3,-69.32],[-67.11,-69.25],[-66.97,-69.16],[-67.02,-69.03],[-67.19,-68.97],[-67.39,-68.86],[-67.3,-68.77],[-67.13,-68.77],[-67.05,-68.67],[-67.12,-68.57],[-67.04,-68.45],[-66.89,-68.3],[-66.79,-68.24],[-66.98,-68.15],[-67.15,-68.02],[-67.11,-67.93],[-67.02,-67.83],[-66.92,-67.69],[-66.77,-67.59],[-66.68,-67.56],[-66.7,-67.53],[-66.92,-67.49],[-67.12,-67.49],[-67.49,-67.55],[-67.54,-67.53],[-67.56,-67.5],[-67.59,-67.44],[-67.55,-67.27],[-67.49,-67.11],[-67.44,-67.09],[-67.3,-67.07],[-67.16,-66.95],[-67.03,-66.95],[-66.96,-66.98],[-66.93,-67.14],[-66.89,-67.18],[-66.9,-67.26],[-66.84,-67.28],[-66.76,-67.23],[-66.61,-67.21],[-66.55,-67.26],[-66.5,-67.29],[-66.47,-67.24],[-66.49,-67.11],[-66.52,-67.06],[-66.53,-66.98],[-66.5,-66.94],[-66.46,-66.88],[-66.53,-66.74],[-66.5,-66.69],[-66.37,-66.61],[-66.31,-66.59],[-66.18,-66.59],[-65.95,-66.65],[-65.85,-66.65],[-65.77,-66.62],[-65.72,-66.57],[-65.68,-66.4],[-65.78,-66.34],[-65.77,-66.29],[-65.72,-66.25],[-65.62,-66.14],[-65.47,-66.13],[-65.32,-66.14],[-65.17,-66.12],[-65.22,-66.07],[-65.27,-65.99],[-65.11,-65.96],[-65.0,-65.95],[-64.72,-65.99],[-64.61,-66.02],[-64.51,-65.96],[-64.55,-65.9],[-64.65,-65.87],[-64.67,-65.81],[-64.65,-65.75],[-64.47,-65.78],[-64.44,-65.77],[-64.39,-65.71],[-64.42,-65.68],[-64.44,-65.64],[-64.21,-65.63],[-64.18,-65.62],[-64.13,-65.57],[-64.07,-65.55],[-63.86,-65.56],[-63.82,-65.53],[-63.8,-65.48],[-63.91,-65.47],[-64.05,-65.42],[-64.07,-65.28],[-64.04,-65.18],[-63.91,-65.09],[-63.76,-65.03],[-63.48,-65.08],[-63.26,-65.07],[-63.18,-65.13],[-63.06,-65.14],[-63.03,-65.08],[-63.09,-65.03],[-63.12,-64.94],[-62.77,-64.84],[-62.66,-64.86],[-62.53,-64.83],[-62.58,-64.76],[-62.5,-64.66],[-62.4,-64.64],[-62.34,-64.73],[-62.24,-64.75],[-62.14,-64.73],[-61.88,-64.63],[-61.76,-64.61],[-61.63,-64.6],[-61.5,-64.55],[-61.47,-64.48],[-61.4,-64.43],[-61.17,-64.36],[-61.08,-64.31],[-60.89,-64.15],[-60.92,-64.11],[-60.86,-64.07],[-60.28,-63.92],[-59.99,-63.91],[-59.51,-63.82],[-59.22,-63.71],[-59.04,-63.67],[-58.87,-63.55],[-58.67,-63.53],[-58.22,-63.45],[-57.87,-63.32],[-57.39,-63.23],[-57.17,-63.23],[-57.08,-63.26],[-57.02,-63.37]],[[-55.53,-63.17],[-55.47,-63.2],[-55.22,-63.2],[-55.16,-63.2],[-55.11,-63.25],[-55.08,-63.32],[-55.16,-63.35],[-55.59,-63.34],[-55.75,-63.3],[-55.83,-63.3],[-56.01,-63.34],[-56.08,-63.38],[-56.38,-63.44],[-56.46,-63.42],[-56.5,-63.36],[-56.51,-63.33],[-56.48,-63.32],[-56.46,-63.3],[-56.47,-63.28],[-56.39,-63.23],[-56.04,-63.16],[-55.59,-63.13],[-55.53,-63.16],[-55.53,-63.17]],[[-56.06,-63.08],[-56.26,-63.17],[-56.35,-63.17],[-56.55,-63.1],[-56.6,-63.06],[-56.61,-63.05],[-56.49,-62.98],[-56.14,-63.01],[-56.06,-63.01],[-56.06,-63.02],[-56.05,-63.05],[-56.06,-63.08]],[[-60.5,-62.97],[-60.55,-62.98],[-60.62,-62.97],[-60.62,-62.99],[-60.56,-63.01],[-60.62,-63.02],[-60.69,-63.0],[-60.74,-62.95],[-60.71,-62.91],[-60.64,-62.9],[-60.5,-62.97]],[[-62.62,-63.07],[-62.66,-63.07],[-62.64,-63.03],[-62.53,-62.92],[-62.32,-62.87],[-62.34,-62.92],[-62.41,-62.97],[-62.62,-63.07]],[[-60.62,-62.56],[-60.58,-62.57],[-60.14,-62.55],[-60.0,-62.62],[-59.85,-62.61],[-60.22,-62.75],[-60.32,-62.71],[-60.35,-62.68],[-60.38,-62.62],[-60.62,-62.63],[-60.7,-62.62],[-60.8,-62.66],[-61.0,-62.68],[-61.06,-62.68],[-61.15,-62.63],[-61.15,-62.59],[-60.97,-62.59],[-60.84,-62.53],[-60.8,-62.48],[-60.73,-62.49],[-60.62,-62.56]],[[-59.39,-62.44],[-59.53,-62.45],[-59.62,-62.4],[-59.66,-62.35],[-59.48,-62.35],[-59.4,-62.37],[-59.35,-62.41],[-59.39,-62.44]],[[-58.84,-62.3],[-59.06,-62.35],[-59.17,-62.3],[-59.2,-62.28],[-59.06,-62.24],[-58.99,-62.25],[-58.96,-62.26],[-58.88,-62.27],[-58.84,-62.3]],[[-57.98,-61.91],[-57.85,-61.94],[-57.74,-61.92],[-57.68,-61.94],[-57.64,-62.0],[-57.64,-62.02],[-57.81,-62.01],[-57.96,-62.08],[-58.15,-62.06],[-58.17,-62.12],[-58.13,-62.15],[-58.18,-62.17],[-58.34,-62.12],[-58.47,-62.14],[-58.51,-62.23],[-58.56,-62.24],[-58.59,-62.25],[-58.64,-62.23],[-58.75,-62.22],[-58.76,-62.21],[-58.82,-62.17],[-59.0,-62.21],[-58.96,-62.16],[-58.71,-62.04],[-58.68,-62.01],[-58.4,-61.94],[-58.27,-61.95],[-57.98,-61.91]],[[-54.07,-61.3],[-54.12,-61.31],[-54.18,-61.27],[-54.19,-61.25],[-54.12,-61.2],[-54.05,-61.14],[-54.02,-61.14],[-54.04,-61.26],[-54.07,-61.3]],[[-55.17,-61.22],[-55.3,-61.25],[-55.35,-61.21],[-55.37,-61.15],[-55.44,-61.11],[-55.39,-61.07],[-54.67,-61.12],[-54.71,-61.14],[-55.06,-61.17],[-55.17,-61.22]],[[-45.72,-60.52],[-45.5,-60.55],[-45.39,-60.58],[-45.36,-60.62],[-45.23,-60.64],[-45.21,-60.65],[-45.19,-60.67],[-45.17,-60.7],[-45.17,-60.73],[-45.4,-60.65],[-45.71,-60.65],[-45.78,-60.59],[-45.94,-60.62],[-45.95,-60.6],[-45.96,-60.57],[-45.93,-60.53],[-45.83,-60.54],[-45.72,-60.52]]]},{"n":"Ashmore and Cartier Islands","r":[[[123.59,-12.43],[123.6,-12.44],[123.57,-12.43],[123.57,-12.42],[123.59,-12.43]]]},{"n":"French Southern and Antarctic Lands","r":[[[69.28,-49.06],[69.22,-49.07],[69.2,-49.03],[69.2,-48.99],[69.17,-48.96],[69.15,-48.92],[69.17,-48.88],[69.27,-48.88],[69.37,-48.89],[69.39,-48.95],[69.32,-49.03],[69.28,-49.06]],[[69.18,-49.11],[69.27,-49.12],[69.31,-49.11],[69.53,-48.97],[69.59,-48.97],[69.59,-49.07],[69.64,-49.12],[69.57,-49.13],[69.44,-49.12],[69.41,-49.18],[69.54,-49.26],[69.61,-49.27],[69.67,-49.26],[69.77,-49.25],[69.85,-49.22],[69.98,-49.16],[70.06,-49.14],[70.21,-49.13],[70.28,-49.08],[70.32,-49.06],[70.41,-49.06],[70.48,-49.08],[70.53,-49.14],[70.56,-49.2],[70.54,-49.27],[70.49,-49.33],[70.39,-49.37],[70.41,-49.41],[70.39,-49.43],[70.34,-49.44],[70.3,-49.42],[70.24,-49.37],[70.17,-49.34],[69.99,-49.34],[69.92,-49.35],[69.9,-49.39],[69.86,-49.42],[69.82,-49.44],[69.76,-49.43],[69.75,-49.45],[69.78,-49.49],[69.86,-49.54],[69.99,-49.58],[70.06,-49.59],[70.07,-49.52],[70.17,-49.51],[70.25,-49.53],[70.31,-49.58],[70.26,-49.6],[70.22,-49.63],[70.21,-49.67],[70.12,-49.7],[70.08,-49.71],[69.92,-49.69],[69.83,-49.64],[69.8,-49.61],[69.75,-49.6],[69.68,-49.64],[69.61,-49.65],[69.48,-49.62],[69.35,-49.56],[69.27,-49.54],[69.15,-49.53],[69.09,-49.65],[68.99,-49.7],[68.87,-49.71],[68.81,-49.7],[68.78,-49.65],[68.79,-49.6],[68.81,-49.55],[68.85,-49.5],[68.87,-49.44],[68.86,-49.39],[68.82,-49.35],[68.84,-49.29],[68.8,-49.23],[68.81,-49.19],[68.88,-49.16],[68.85,-49.14],[68.82,-49.14],[68.79,-49.1],[68.77,-49.07],[68.8,-48.99],[68.84,-48.93],[68.83,-48.85],[68.9,-48.78],[68.96,-48.69],[69.0,-48.66],[69.06,-48.66],[69.08,-48.68],[69.09,-48.72],[69.07,-48.75],[69.12,-48.77],[69.14,-48.86],[69.1,-48.9],[69.1,-48.94],[69.03,-49.02],[69.05,-49.08],[69.18,-49.11]],[[51.83,-46.44],[51.76,-46.45],[51.7,-46.43],[51.66,-46.37],[51.74,-46.33],[51.78,-46.36],[51.82,-46.39],[51.83,-46.44]]]},{"n":"Antigua and Barbuda","r":[[[-61.72,17.04],[-61.75,17.0],[-61.86,17.01],[-61.88,17.06],[-61.89,17.1],[-61.82,17.17],[-61.74,17.14],[-61.71,17.11],[-61.69,17.1],[-61.69,17.07],[-61.69,17.05],[-61.72,17.04]],[[-61.75,17.57],[-61.76,17.55],[-61.84,17.6],[-61.87,17.69],[-61.87,17.7],[-61.85,17.71],[-61.82,17.7],[-61.78,17.69],[-61.75,17.66],[-61.75,17.57]]]},{"n":"Australia","r":[[[158.88,-54.71],[158.85,-54.75],[158.84,-54.7],[158.9,-54.51],[158.96,-54.47],[158.95,-54.58],[158.88,-54.71]],[[147.36,-43.4],[147.31,-43.5],[147.23,-43.48],[147.15,-43.5],[147.1,-43.43],[147.1,-43.41],[147.16,-43.43],[147.18,-43.41],[147.2,-43.38],[147.22,-43.37],[147.23,-43.33],[147.28,-43.28],[147.31,-43.28],[147.34,-43.35],[147.36,-43.4]],[[147.43,-43.24],[147.37,-43.24],[147.35,-43.23],[147.34,-43.18],[147.3,-43.16],[147.32,-43.15],[147.33,-43.11],[147.35,-43.08],[147.4,-43.12],[147.43,-43.24]],[[148.1,-42.71],[148.05,-42.72],[148.03,-42.71],[148.03,-42.66],[148.02,-42.64],[148.07,-42.59],[148.14,-42.62],[148.17,-42.65],[148.1,-42.68],[148.1,-42.71]],[[145.04,-40.79],[145.16,-40.79],[145.22,-40.77],[145.28,-40.77],[145.35,-40.83],[145.43,-40.86],[145.49,-40.85],[145.53,-40.86],[145.58,-40.9],[145.69,-40.94],[145.73,-40.96],[145.78,-41.0],[145.82,-41.02],[146.11,-41.12],[146.32,-41.16],[146.57,-41.14],[146.65,-41.12],[146.72,-41.08],[146.79,-41.11],[146.85,-41.17],[146.84,-41.11],[146.86,-41.06],[146.92,-41.02],[146.99,-40.99],[147.11,-40.99],[147.22,-40.98],[147.27,-40.96],[147.32,-40.96],[147.39,-40.99],[147.45,-41.0],[147.5,-40.96],[147.58,-40.88],[147.62,-40.84],[147.82,-40.87],[147.87,-40.87],[147.97,-40.78],[148.03,-40.78],[148.22,-40.85],[148.29,-40.95],[148.29,-41.12],[148.29,-41.17],[148.31,-41.23],[148.31,-41.35],[148.29,-41.47],[148.29,-41.55],[148.3,-41.65],[148.29,-41.82],[148.32,-41.93],[148.3,-42.0],[148.3,-42.04],[148.33,-42.07],[148.34,-42.11],[148.33,-42.16],[148.34,-42.22],[148.33,-42.26],[148.29,-42.25],[148.28,-42.22],[148.28,-42.17],[148.28,-42.14],[148.26,-42.1],[148.18,-42.06],[148.2,-42.04],[148.24,-42.02],[148.21,-41.97],[148.17,-42.01],[148.14,-42.07],[148.16,-42.09],[148.13,-42.1],[148.07,-42.17],[148.02,-42.26],[148.0,-42.35],[148.01,-42.44],[147.97,-42.51],[147.92,-42.57],[147.91,-42.66],[147.92,-42.82],[147.96,-42.96],[147.98,-43.16],[147.95,-43.18],[147.84,-43.2],[147.79,-43.22],[147.7,-43.12],[147.65,-43.02],[147.69,-42.98],[147.77,-43.0],[147.8,-42.98],[147.81,-42.95],[147.8,-42.93],[147.69,-42.87],[147.57,-42.85],[147.54,-42.88],[147.55,-42.97],[147.54,-43.0],[147.45,-43.03],[147.41,-42.89],[147.3,-42.79],[147.3,-42.84],[147.35,-42.93],[147.34,-42.96],[147.32,-43.01],[147.28,-43.03],[147.26,-43.07],[147.26,-43.13],[147.25,-43.22],[147.17,-43.26],[147.0,-43.16],[146.98,-43.19],[146.99,-43.22],[147.08,-43.28],[147.04,-43.32],[147.0,-43.37],[146.95,-43.5],[146.87,-43.61],[146.83,-43.62],[146.7,-43.6],[146.55,-43.51],[146.41,-43.52],[146.19,-43.51],[146.04,-43.55],[146.01,-43.44],[145.98,-43.41],[145.99,-43.38],[146.11,-43.35],[146.23,-43.36],[146.21,-43.32],[146.18,-43.3],[146.13,-43.31],[145.98,-43.28],[145.87,-43.29],[145.8,-43.24],[145.68,-43.08],[145.61,-43.0],[145.57,-42.97],[145.52,-42.95],[145.49,-42.93],[145.27,-42.54],[145.24,-42.46],[145.2,-42.23],[145.37,-42.34],[145.43,-42.41],[145.47,-42.49],[145.53,-42.39],[145.52,-42.35],[145.36,-42.23],[145.34,-42.19],[145.33,-42.15],[145.29,-42.19],[145.23,-42.2],[145.26,-42.11],[145.24,-42.02],[145.06,-41.83],[144.92,-41.64],[144.78,-41.42],[144.77,-41.39],[144.76,-41.34],[144.7,-41.19],[144.66,-41.08],[144.65,-40.98],[144.71,-40.78],[144.72,-40.67],[144.82,-40.72],[145.04,-40.79]],[[148.24,-40.52],[148.19,-40.59],[148.13,-40.54],[148.12,-40.52],[148.19,-40.5],[148.22,-40.51],[148.24,-40.52]],[[144.78,-40.51],[144.75,-40.59],[144.71,-40.49],[144.75,-40.47],[144.78,-40.43],[144.79,-40.44],[144.78,-40.51]],[[148.33,-40.31],[148.42,-40.37],[148.47,-40.43],[148.4,-40.49],[148.35,-40.5],[148.32,-40.43],[148.21,-40.46],[148.1,-40.45],[148.02,-40.4],[148.01,-40.38],[148.06,-40.36],[148.2,-40.36],[148.33,-40.31]],[[148.0,-39.76],[148.18,-39.94],[148.27,-39.97],[148.3,-39.99],[148.29,-40.07],[148.25,-40.1],[148.32,-40.14],[148.31,-40.17],[148.3,-40.17],[148.21,-40.23],[148.11,-40.26],[148.07,-40.24],[148.05,-40.21],[148.02,-40.17],[147.89,-40.01],[147.91,-39.97],[147.88,-39.91],[147.81,-39.91],[147.77,-39.87],[147.84,-39.83],[147.93,-39.73],[148.0,-39.76]],[[143.93,-40.12],[143.9,-40.12],[143.88,-40.06],[143.89,-39.98],[143.84,-39.9],[143.87,-39.82],[143.86,-39.74],[143.88,-39.7],[143.94,-39.66],[143.95,-39.58],[144.0,-39.58],[144.09,-39.64],[144.12,-39.79],[144.11,-39.87],[144.14,-39.95],[144.11,-40.02],[144.04,-40.08],[143.93,-40.12]],[[145.31,-38.49],[145.35,-38.54],[145.36,-38.56],[145.27,-38.52],[145.13,-38.53],[145.22,-38.46],[145.29,-38.47],[145.31,-38.49]],[[145.49,-38.35],[145.34,-38.42],[145.28,-38.39],[145.29,-38.34],[145.3,-38.32],[145.43,-38.31],[145.49,-38.35]],[[137.6,-35.74],[137.84,-35.76],[137.93,-35.73],[138.05,-35.76],[138.12,-35.85],[138.07,-35.9],[138.01,-35.91],[137.84,-35.87],[137.67,-35.9],[137.62,-35.94],[137.59,-36.03],[137.45,-36.07],[137.38,-36.02],[137.21,-35.98],[137.15,-36.04],[137.03,-36.02],[136.91,-36.05],[136.76,-36.03],[136.59,-35.94],[136.54,-35.89],[136.58,-35.81],[136.64,-35.75],[137.09,-35.66],[137.33,-35.59],[137.53,-35.61],[137.58,-35.62],[137.64,-35.66],[137.6,-35.72],[137.6,-35.74]],[[153.54,-27.44],[153.45,-27.71],[153.43,-27.71],[153.4,-27.67],[153.4,-27.51],[153.44,-27.41],[153.52,-27.42],[153.54,-27.44]],[[153.44,-27.32],[153.42,-27.33],[153.38,-27.24],[153.37,-27.14],[153.38,-27.05],[153.43,-27.03],[153.47,-27.04],[153.43,-27.2],[153.44,-27.32]],[[113.18,-26.05],[113.16,-26.09],[112.96,-25.78],[112.91,-25.57],[112.95,-25.53],[112.98,-25.52],[113.1,-25.82],[113.13,-25.88],[113.13,-25.95],[113.15,-25.97],[113.18,-26.05]],[[153.08,-25.75],[153.05,-25.78],[153.01,-25.73],[152.98,-25.55],[153.0,-25.45],[153.05,-25.35],[153.06,-25.3],[153.04,-25.19],[153.19,-25.07],[153.23,-25.01],[153.24,-24.92],[153.19,-24.83],[153.14,-24.81],[153.18,-24.76],[153.22,-24.74],[153.26,-24.73],[153.28,-24.74],[153.3,-24.92],[153.36,-24.98],[153.35,-25.06],[153.14,-25.51],[153.08,-25.68],[153.08,-25.75]],[[151.15,-23.49],[151.18,-23.52],[151.21,-23.51],[151.24,-23.53],[151.23,-23.59],[151.27,-23.67],[151.3,-23.72],[151.26,-23.76],[151.24,-23.78],[151.18,-23.74],[151.03,-23.53],[151.06,-23.46],[151.15,-23.49]],[[150.52,-22.32],[150.49,-22.32],[150.46,-22.31],[150.48,-22.27],[150.49,-22.21],[150.52,-22.23],[150.55,-22.31],[150.52,-22.32]],[[149.93,-22.19],[149.89,-22.22],[149.87,-22.15],[149.88,-22.07],[149.91,-22.05],[149.93,-22.15],[149.93,-22.19]],[[115.45,-20.79],[115.39,-20.87],[115.32,-20.85],[115.31,-20.81],[115.35,-20.75],[115.43,-20.67],[115.46,-20.72],[115.45,-20.79]],[[149.04,-20.29],[149.02,-20.3],[148.99,-20.3],[148.94,-20.28],[148.98,-20.15],[149.0,-20.22],[149.05,-20.28],[149.04,-20.29]],[[148.94,-20.15],[148.91,-20.15],[148.89,-20.14],[148.91,-20.1],[148.93,-20.07],[148.97,-20.04],[148.96,-20.13],[148.94,-20.15]],[[146.28,-18.23],[146.3,-18.33],[146.34,-18.4],[146.33,-18.45],[146.3,-18.48],[146.24,-18.45],[146.19,-18.36],[146.12,-18.29],[146.1,-18.25],[146.19,-18.26],[146.23,-18.24],[146.25,-18.23],[146.28,-18.23]],[[139.46,-17.11],[139.42,-17.13],[139.41,-17.09],[139.46,-17.05],[139.49,-16.99],[139.56,-17.04],[139.57,-17.09],[139.46,-17.11]],[[139.51,-16.57],[139.43,-16.66],[139.39,-16.65],[139.35,-16.7],[139.28,-16.72],[139.24,-16.72],[139.16,-16.74],[139.15,-16.71],[139.16,-16.63],[139.23,-16.53],[139.29,-16.47],[139.46,-16.44],[139.59,-16.4],[139.6,-16.4],[139.7,-16.51],[139.56,-16.53],[139.51,-16.57]],[[137.09,-15.78],[137.05,-15.82],[137.0,-15.78],[136.99,-15.73],[136.94,-15.71],[136.96,-15.67],[136.99,-15.65],[137.01,-15.59],[137.06,-15.66],[137.07,-15.74],[137.09,-15.78]],[[136.59,-15.63],[136.53,-15.63],[136.51,-15.63],[136.5,-15.58],[136.52,-15.54],[136.59,-15.53],[136.61,-15.54],[136.59,-15.63]],[[136.86,-15.62],[136.85,-15.63],[136.85,-15.54],[136.88,-15.5],[136.89,-15.59],[136.86,-15.62]],[[124.6,-15.4],[124.56,-15.43],[124.52,-15.42],[124.52,-15.38],[124.48,-15.34],[124.5,-15.29],[124.52,-15.27],[124.55,-15.27],[124.56,-15.31],[124.61,-15.36],[124.6,-15.4]],[[125.2,-14.58],[125.13,-14.64],[125.09,-14.59],[125.12,-14.49],[125.16,-14.46],[125.2,-14.47],[125.19,-14.55],[125.2,-14.58]],[[136.71,-13.8],[136.76,-13.85],[136.8,-13.84],[136.85,-13.75],[136.87,-13.76],[136.89,-13.79],[136.91,-13.83],[136.84,-13.9],[136.81,-13.91],[136.79,-13.95],[136.75,-14.07],[136.75,-14.12],[136.79,-14.16],[136.89,-14.2],[136.93,-14.18],[136.95,-14.18],[136.93,-14.25],[136.89,-14.29],[136.76,-14.27],[136.65,-14.28],[136.46,-14.23],[136.36,-14.23],[136.34,-14.21],[136.39,-14.18],[136.43,-14.13],[136.41,-14.01],[136.42,-13.86],[136.53,-13.79],[136.58,-13.72],[136.66,-13.68],[136.7,-13.68],[136.7,-13.73],[136.71,-13.8]],[[136.24,-13.82],[136.21,-13.84],[136.12,-13.82],[136.12,-13.78],[136.13,-13.75],[136.16,-13.74],[136.22,-13.66],[136.26,-13.71],[136.28,-13.79],[136.24,-13.82]],[[136.34,-11.6],[136.18,-11.68],[136.27,-11.58],[136.45,-11.49],[136.48,-11.47],[136.47,-11.51],[136.38,-11.58],[136.34,-11.6]],[[130.46,-11.68],[130.54,-11.7],[130.58,-11.74],[130.6,-11.77],[130.61,-11.82],[130.5,-11.84],[130.32,-11.77],[130.13,-11.82],[130.08,-11.83],[130.04,-11.79],[130.07,-11.68],[130.14,-11.7],[130.2,-11.66],[130.19,-11.54],[130.15,-11.48],[130.25,-11.36],[130.29,-11.34],[130.34,-11.34],[130.38,-11.42],[130.39,-11.51],[130.43,-11.59],[130.46,-11.68]],[[130.62,-11.38],[130.75,-11.38],[130.91,-11.31],[130.99,-11.34],[131.02,-11.33],[131.14,-11.26],[131.22,-11.24],[131.27,-11.19],[131.32,-11.25],[131.44,-11.31],[131.47,-11.38],[131.52,-11.42],[131.54,-11.44],[131.47,-11.51],[131.46,-11.59],[131.38,-11.58],[131.29,-11.71],[130.95,-11.93],[130.64,-11.74],[130.51,-11.62],[130.42,-11.45],[130.4,-11.3],[130.37,-11.21],[130.38,-11.19],[130.4,-11.18],[130.43,-11.18],[130.52,-11.28],[130.56,-11.31],[130.62,-11.38]],[[136.6,-11.38],[136.53,-11.44],[136.52,-11.39],[136.56,-11.36],[136.65,-11.21],[136.69,-11.18],[136.71,-11.16],[136.73,-11.1],[136.73,-11.02],[136.78,-11.01],[136.74,-11.19],[136.6,-11.38]],[[132.59,-11.3],[132.57,-11.32],[132.49,-11.16],[132.52,-11.12],[132.48,-11.04],[132.54,-11.03],[132.58,-10.97],[132.59,-11.0],[132.6,-11.11],[132.63,-11.17],[132.59,-11.3]],[[143.18,-11.95],[143.15,-12.08],[143.1,-12.17],[143.1,-12.23],[143.11,-12.3],[143.19,-12.36],[143.25,-12.4],[143.29,-12.5],[143.4,-12.64],[143.4,-12.74],[143.46,-12.86],[143.51,-13.09],[143.53,-13.3],[143.59,-13.44],[143.55,-13.74],[143.59,-13.86],[143.64,-13.96],[143.71,-14.16],[143.76,-14.35],[143.82,-14.4],[143.96,-14.46],[144.11,-14.39],[144.21,-14.3],[144.32,-14.28],[144.47,-14.23],[144.59,-14.35],[144.65,-14.49],[144.92,-14.67],[145.06,-14.79],[145.18,-14.86],[145.29,-14.94],[145.28,-15.03],[145.25,-15.1],[145.28,-15.2],[145.29,-15.33],[145.27,-15.48],[145.35,-15.7],[145.38,-15.88],[145.46,-16.06],[145.45,-16.24],[145.44,-16.3],[145.43,-16.41],[145.49,-16.53],[145.55,-16.63],[145.64,-16.73],[145.75,-16.88],[145.84,-16.91],[145.91,-16.91],[145.9,-17.07],[146.05,-17.38],[146.13,-17.64],[146.07,-17.98],[146.02,-18.18],[146.03,-18.27],[146.22,-18.51],[146.33,-18.55],[146.31,-18.67],[146.3,-18.84],[146.38,-18.98],[146.48,-19.08],[146.59,-19.14],[146.69,-19.19],[146.83,-19.24],[147.0,-19.26],[147.09,-19.33],[147.14,-19.39],[147.28,-19.41],[147.34,-19.4],[147.42,-19.38],[147.47,-19.42],[147.51,-19.47],[147.59,-19.62],[147.74,-19.77],[147.85,-19.79],[147.92,-19.87],[148.0,-19.89],[148.08,-19.9],[148.19,-19.96],[148.37,-20.09],[148.53,-20.11],[148.6,-20.15],[148.76,-20.29],[148.82,-20.37],[148.88,-20.48],[148.81,-20.49],[148.73,-20.47],[148.68,-20.58],[148.79,-20.74],[148.91,-20.85],[149.06,-20.96],[149.2,-21.13],[149.24,-21.25],[149.28,-21.3],[149.33,-21.48],[149.45,-21.58],[149.46,-21.77],[149.52,-22.02],[149.6,-22.26],[149.65,-22.33],[149.7,-22.44],[149.77,-22.43],[149.82,-22.39],[149.92,-22.5],[149.97,-22.55],[150.01,-22.52],[149.94,-22.31],[149.98,-22.18],[150.02,-22.17],[150.08,-22.16],[150.14,-22.27],[150.23,-22.37],[150.41,-22.47],[150.54,-22.56],[150.58,-22.56],[150.56,-22.49],[150.57,-22.38],[150.62,-22.37],[150.67,-22.42],[150.76,-22.58],[150.78,-22.9],[150.78,-23.18],[150.84,-23.46],[150.93,-23.53],[150.99,-23.6],[151.09,-23.7],[151.15,-23.78],[151.24,-23.82],[151.5,-24.01],[151.58,-24.03],[151.69,-24.04],[151.83,-24.12],[151.9,-24.2],[152.06,-24.49],[152.13,-24.6],[152.28,-24.7],[152.35,-24.73],[152.46,-24.8],[152.49,-24.9],[152.5,-24.96],[152.56,-25.07],[152.65,-25.2],[152.79,-25.27],[152.91,-25.43],[152.92,-25.69],[152.98,-25.82],[153.03,-25.87],[153.13,-25.92],[153.16,-25.96],[153.08,-26.3],[153.16,-26.98],[153.12,-27.19],[153.2,-27.4],[153.39,-27.77],[153.43,-27.9],[153.45,-28.05],[153.58,-28.24],[153.57,-28.53],[153.62,-28.67],[153.6,-28.85],[153.46,-29.05],[153.35,-29.29],[153.35,-29.5],[153.27,-29.89],[153.22,-30.0],[153.19,-30.16],[153.03,-30.56],[153.02,-30.72],[153.05,-30.91],[153.02,-31.09],[152.98,-31.21],[152.94,-31.43],[152.79,-31.79],[152.56,-32.05],[152.55,-32.24],[152.52,-32.33],[152.47,-32.44],[152.33,-32.56],[152.25,-32.61],[152.22,-32.68],[152.14,-32.68],[152.13,-32.7],[152.19,-32.72],[152.16,-32.76],[151.95,-32.82],[151.81,-32.9],[151.67,-33.1],[151.61,-33.2],[151.53,-33.3],[151.48,-33.35],[151.46,-33.4],[151.43,-33.52],[151.36,-33.54],[151.29,-33.58],[151.32,-33.7],[151.29,-33.83],[151.28,-33.93],[151.24,-33.99],[151.2,-33.96],[151.17,-33.97],[151.12,-34.01],[151.19,-34.02],[151.23,-34.03],[151.09,-34.16],[150.96,-34.3],[150.93,-34.39],[150.87,-34.5],[150.82,-34.75],[150.78,-34.89],[150.81,-34.99],[150.8,-35.01],[150.77,-35.02],[150.76,-35.01],[150.7,-35.04],[150.68,-35.08],[150.71,-35.12],[150.72,-35.13],[150.71,-35.16],[150.69,-35.18],[150.63,-35.18],[150.57,-35.21],[150.37,-35.58],[150.29,-35.68],[150.2,-35.83],[150.16,-35.97],[150.13,-36.12],[150.1,-36.37],[150.06,-36.55],[149.99,-36.72],[149.96,-36.85],[149.95,-37.08],[149.99,-37.26],[149.96,-37.35],[149.96,-37.44],[149.93,-37.53],[149.81,-37.55],[149.71,-37.62],[149.57,-37.73],[149.48,-37.77],[149.3,-37.8],[148.94,-37.79],[148.26,-37.83],[148.13,-37.86],[147.88,-37.93],[147.63,-38.06],[147.4,-38.22],[146.86,-38.66],[146.44,-38.71],[146.36,-38.71],[146.29,-38.7],[146.22,-38.73],[146.22,-38.78],[146.29,-38.84],[146.34,-38.89],[146.43,-38.82],[146.47,-38.84],[146.48,-38.98],[146.48,-39.07],[146.46,-39.11],[146.4,-39.15],[146.34,-39.12],[146.33,-39.08],[146.25,-38.96],[146.16,-38.87],[146.07,-38.83],[146.02,-38.87],[145.94,-38.9],[145.87,-38.78],[145.79,-38.67],[145.69,-38.66],[145.61,-38.66],[145.54,-38.61],[145.4,-38.54],[145.42,-38.48],[145.46,-38.42],[145.54,-38.39],[145.52,-38.31],[145.48,-38.24],[145.37,-38.23],[145.29,-38.24],[145.25,-38.29],[145.19,-38.38],[144.96,-38.5],[144.85,-38.44],[144.72,-38.34],[144.78,-38.35],[144.91,-38.34],[145.02,-38.26],[145.07,-38.2],[145.12,-38.09],[145.05,-38.01],[144.98,-37.95],[144.89,-37.9],[144.54,-38.08],[144.47,-38.1],[144.4,-38.14],[144.52,-38.17],[144.59,-38.16],[144.67,-38.21],[144.54,-38.28],[144.45,-38.3],[144.33,-38.35],[144.1,-38.46],[143.81,-38.7],[143.69,-38.77],[143.54,-38.82],[143.34,-38.76],[143.23,-38.74],[143.08,-38.65],[142.84,-38.58],[142.61,-38.45],[142.46,-38.39],[142.34,-38.37],[142.19,-38.4],[141.92,-38.28],[141.72,-38.27],[141.59,-38.39],[141.49,-38.38],[141.42,-38.36],[141.21,-38.17],[141.01,-38.08],[140.63,-38.03],[140.39,-37.9],[140.21,-37.64],[139.87,-37.35],[139.78,-37.25],[139.74,-37.14],[139.74,-37.06],[139.78,-36.9],[139.85,-36.75],[139.86,-36.66],[139.73,-36.37],[139.55,-36.1],[139.47,-36.01],[139.24,-35.83],[139.04,-35.69],[138.99,-35.62],[138.97,-35.58],[139.07,-35.6],[139.11,-35.54],[139.18,-35.52],[139.23,-35.6],[139.29,-35.61],[139.29,-35.49],[139.33,-35.43],[139.3,-35.4],[139.28,-35.38],[139.19,-35.35],[139.09,-35.39],[139.02,-35.44],[138.92,-35.49],[138.88,-35.54],[138.77,-35.54],[138.73,-35.55],[138.52,-35.64],[138.39,-35.64],[138.18,-35.61],[138.25,-35.49],[138.33,-35.41],[138.4,-35.33],[138.51,-35.02],[138.49,-34.76],[138.44,-34.66],[138.26,-34.44],[138.19,-34.31],[138.09,-34.17],[138.04,-34.25],[138.01,-34.33],[137.92,-34.46],[137.87,-34.73],[137.69,-35.14],[137.57,-35.15],[137.46,-35.13],[137.27,-35.18],[137.14,-35.24],[137.03,-35.24],[136.97,-35.25],[136.88,-35.24],[137.01,-34.92],[137.13,-34.92],[137.25,-34.91],[137.31,-34.92],[137.39,-34.91],[137.45,-34.76],[137.49,-34.6],[137.47,-34.49],[137.46,-34.38],[137.48,-34.25],[137.49,-34.16],[137.65,-33.86],[137.78,-33.7],[137.93,-33.58],[137.91,-33.46],[137.87,-33.31],[137.85,-33.2],[137.92,-33.17],[137.99,-33.09],[137.91,-32.77],[137.86,-32.67],[137.78,-32.58],[137.78,-32.7],[137.79,-32.82],[137.68,-32.98],[137.54,-33.09],[137.44,-33.19],[137.35,-33.43],[137.24,-33.63],[137.13,-33.7],[137.03,-33.72],[136.94,-33.75],[136.78,-33.83],[136.64,-33.9],[136.53,-33.98],[136.43,-34.03],[136.12,-34.43],[135.98,-34.56],[135.95,-34.62],[135.89,-34.66],[135.9,-34.72],[135.95,-34.77],[136.0,-34.94],[135.97,-34.98],[135.92,-34.96],[135.79,-34.86],[135.71,-34.9],[135.65,-34.94],[135.48,-34.76],[135.41,-34.72],[135.32,-34.64],[135.23,-34.58],[135.19,-34.57],[135.12,-34.59],[135.13,-34.54],[135.18,-34.5],[135.22,-34.49],[135.29,-34.55],[135.38,-34.6],[135.43,-34.6],[135.45,-34.58],[135.37,-34.38],[135.31,-34.2],[135.29,-34.14],[135.22,-33.96],[135.19,-33.91],[135.04,-33.78],[134.89,-33.63],[134.85,-33.44],[134.79,-33.33],[134.72,-33.26],[134.61,-33.19],[134.3,-33.17],[134.17,-32.98],[134.1,-32.75],[134.16,-32.73],[134.23,-32.73],[134.25,-32.66],[134.23,-32.55],[133.93,-32.41],[133.79,-32.27],[133.67,-32.21],[133.55,-32.18],[133.4,-32.19],[133.21,-32.18],[132.76,-31.96],[132.65,-31.95],[132.32,-32.02],[132.21,-32.01],[131.72,-31.7],[131.39,-31.55],[131.28,-31.52],[131.14,-31.5],[131.03,-31.53],[130.95,-31.57],[130.78,-31.6],[130.13,-31.58],[129.57,-31.63],[129.19,-31.66],[128.95,-31.7],[128.55,-31.89],[128.07,-32.07],[127.68,-32.15],[127.32,-32.26],[127.08,-32.3],[126.78,-32.31],[126.14,-32.26],[125.92,-32.3],[125.57,-32.51],[125.46,-32.56],[125.27,-32.61],[124.76,-32.88],[124.52,-32.94],[124.37,-32.96],[124.24,-33.02],[124.13,-33.13],[123.97,-33.45],[123.87,-33.6],[123.65,-33.84],[123.51,-33.92],[123.37,-33.91],[123.21,-33.99],[123.07,-33.9],[122.96,-33.88],[122.78,-33.89],[122.15,-33.99],[122.06,-33.87],[121.95,-33.86],[121.73,-33.86],[121.41,-33.83],[120.81,-33.87],[120.53,-33.92],[120.42,-33.96],[120.21,-33.94],[119.85,-33.97],[119.73,-34.04],[119.64,-34.1],[119.45,-34.37],[119.25,-34.46],[119.08,-34.46],[118.9,-34.48],[118.52,-34.74],[118.14,-34.99],[118.01,-35.01],[117.86,-35.05],[117.68,-35.07],[117.58,-35.1],[117.14,-35.03],[116.87,-35.03],[116.52,-34.99],[116.22,-34.87],[115.99,-34.8],[115.73,-34.53],[115.57,-34.43],[115.28,-34.3],[115.19,-34.31],[115.13,-34.34],[115.01,-34.26],[115.01,-34.15],[114.97,-34.05],[114.98,-33.8],[114.99,-33.52],[115.1,-33.58],[115.18,-33.64],[115.36,-33.64],[115.52,-33.53],[115.6,-33.37],[115.68,-33.19],[115.67,-33.0],[115.62,-32.67],[115.65,-32.6],[115.71,-32.57],[115.73,-32.4],[115.74,-31.89],[115.7,-31.69],[115.45,-31.3],[115.29,-30.96],[115.18,-30.81],[115.08,-30.56],[114.99,-30.22],[114.97,-30.04],[114.94,-29.72],[114.97,-29.54],[114.96,-29.43],[114.86,-29.14],[114.63,-28.87],[114.59,-28.77],[114.59,-28.67],[114.54,-28.54],[114.35,-28.29],[114.17,-28.08],[114.13,-27.98],[114.1,-27.54],[114.03,-27.35],[113.71,-26.85],[113.33,-26.42],[113.23,-26.24],[113.18,-26.18],[113.21,-26.17],[113.25,-26.2],[113.3,-26.24],[113.32,-26.24],[113.35,-26.21],[113.34,-26.13],[113.36,-26.08],[113.39,-26.11],[113.43,-26.2],[113.55,-26.44],[113.58,-26.56],[113.73,-26.6],[113.78,-26.56],[113.84,-26.5],[113.85,-26.33],[113.78,-26.26],[113.71,-26.22],[113.59,-26.1],[113.51,-25.9],[113.4,-25.71],[113.4,-25.65],[113.45,-25.6],[113.54,-25.63],[113.62,-25.73],[113.71,-25.83],[113.7,-26.0],[113.68,-26.05],[113.69,-26.09],[113.72,-26.13],[113.77,-26.16],[113.81,-26.12],[113.85,-26.01],[113.88,-26.03],[113.94,-26.26],[113.99,-26.32],[114.09,-26.39],[114.18,-26.34],[114.22,-26.29],[114.2,-26.13],[114.23,-25.97],[114.21,-25.85],[113.99,-25.54],[113.79,-25.17],[113.67,-24.98],[113.57,-24.69],[113.5,-24.59],[113.42,-24.44],[113.41,-24.25],[113.42,-24.13],[113.49,-23.87],[113.55,-23.73],[113.76,-23.42],[113.77,-23.28],[113.76,-23.18],[113.79,-23.02],[113.8,-22.91],[113.77,-22.81],[113.68,-22.64],[113.8,-22.33],[113.96,-21.94],[114.02,-21.88],[114.12,-21.83],[114.14,-21.91],[114.09,-22.18],[114.16,-22.32],[114.14,-22.48],[114.21,-22.46],[114.3,-22.43],[114.38,-22.34],[114.42,-22.26],[114.6,-21.94],[114.71,-21.82],[114.86,-21.74],[115.16,-21.63],[115.46,-21.49],[115.6,-21.36],[115.77,-21.24],[115.89,-21.12],[116.01,-21.03],[116.61,-20.71],[116.71,-20.65],[116.84,-20.65],[117.0,-20.66],[117.14,-20.64],[117.29,-20.71],[117.41,-20.72],[117.68,-20.64],[117.83,-20.57],[118.09,-20.42],[118.2,-20.38],[118.46,-20.33],[118.75,-20.26],[119.1,-20.0],[119.36,-20.01],[119.59,-20.04],[119.77,-19.96],[120.2,-19.91],[120.43,-19.84],[120.88,-19.67],[121.0,-19.6],[121.18,-19.48],[121.34,-19.32],[121.49,-19.11],[121.59,-18.92],[121.63,-18.82],[121.72,-18.66],[121.78,-18.54],[121.83,-18.48],[122.01,-18.39],[122.26,-18.16],[122.35,-18.11],[122.36,-18.04],[122.31,-17.99],[122.24,-17.97],[122.19,-17.72],[122.15,-17.55],[122.14,-17.43],[122.16,-17.31],[122.26,-17.14],[122.33,-17.06],[122.43,-16.97],[122.52,-16.94],[122.6,-16.86],[122.72,-16.79],[122.77,-16.71],[122.85,-16.55],[122.92,-16.43],[122.97,-16.44],[123.07,-16.72],[123.14,-16.86],[123.27,-17.04],[123.38,-17.29],[123.48,-17.41],[123.53,-17.49],[123.56,-17.52],[123.57,-17.47],[123.56,-17.42],[123.61,-17.22],[123.59,-17.08],[123.59,-17.03],[123.62,-17.01],[123.66,-17.02],[123.75,-17.1],[123.8,-17.13],[123.83,-17.12],[123.83,-17.0],[123.87,-16.92],[123.86,-16.86],[123.78,-16.87],[123.75,-16.8],[123.68,-16.72],[123.61,-16.67],[123.52,-16.54],[123.49,-16.49],[123.53,-16.47],[123.58,-16.47],[123.63,-16.42],[123.65,-16.34],[123.61,-16.22],[123.65,-16.18],[123.73,-16.19],[123.86,-16.38],[123.92,-16.36],[123.96,-16.29],[124.04,-16.26],[124.13,-16.28],[124.19,-16.33],[124.3,-16.39],[124.45,-16.38],[124.53,-16.4],[124.69,-16.39],[124.77,-16.4],[124.76,-16.37],[124.67,-16.34],[124.57,-16.33],[124.45,-16.34],[124.4,-16.3],[124.39,-16.2],[124.42,-16.13],[124.43,-16.1],[124.51,-16.12],[124.58,-16.11],[124.59,-16.02],[124.61,-15.94],[124.65,-15.87],[124.65,-15.81],[124.61,-15.82],[124.5,-15.97],[124.46,-15.85],[124.38,-15.76],[124.4,-15.63],[124.44,-15.49],[124.51,-15.48],[124.56,-15.5],[124.64,-15.42],[124.69,-15.36],[124.68,-15.31],[124.69,-15.27],[124.75,-15.29],[124.97,-15.4],[125.02,-15.47],[125.06,-15.44],[125.08,-15.37],[125.07,-15.31],[125.02,-15.32],[124.91,-15.31],[124.88,-15.27],[124.89,-15.24],[124.84,-15.16],[124.91,-15.11],[124.98,-15.11],[125.02,-15.07],[125.02,-15.02],[125.04,-15.0],[125.07,-15.03],[125.19,-15.05],[125.3,-15.11],[125.36,-15.12],[125.38,-15.09],[125.38,-15.02],[125.24,-14.94],[125.24,-14.87],[125.18,-14.79],[125.18,-14.71],[125.27,-14.65],[125.28,-14.58],[125.34,-14.56],[125.44,-14.56],[125.5,-14.5],[125.58,-14.48],[125.6,-14.36],[125.6,-14.28],[125.63,-14.26],[125.7,-14.29],[125.68,-14.39],[125.68,-14.48],[125.66,-14.53],[125.69,-14.53],[125.71,-14.5],[125.74,-14.44],[125.82,-14.47],[125.84,-14.53],[125.85,-14.6],[125.89,-14.62],[125.95,-14.52],[126.02,-14.49],[126.02,-14.37],[126.04,-14.28],[126.05,-14.22],[126.1,-14.18],[126.11,-14.11],[126.07,-14.07],[126.05,-13.98],[126.12,-13.96],[126.18,-14.0],[126.23,-14.11],[126.26,-14.16],[126.3,-14.14],[126.32,-14.06],[126.4,-14.02],[126.48,-14.08],[126.57,-14.16],[126.68,-14.09],[126.78,-13.96],[126.76,-13.87],[126.78,-13.79],[126.9,-13.74],[127.01,-13.78],[127.1,-13.87],[127.29,-13.93],[127.46,-14.03],[127.53,-14.09],[127.67,-14.2],[127.76,-14.3],[127.89,-14.49],[128.18,-14.71],[128.2,-14.75],[128.16,-14.83],[128.12,-14.92],[128.08,-15.09],[128.07,-15.33],[128.11,-15.31],[128.16,-15.23],[128.2,-15.24],[128.25,-15.3],[128.26,-15.25],[128.23,-15.21],[128.17,-15.1],[128.18,-15.04],[128.22,-15.0],[128.29,-14.94],[128.36,-14.9],[128.4,-14.87],[128.41,-14.83],[128.48,-14.79],[128.58,-14.77],[128.64,-14.78],[129.06,-14.88],[129.17,-14.99],[129.18,-15.12],[129.22,-15.16],[129.24,-15.08],[129.23,-14.91],[129.27,-14.87],[129.38,-14.9],[129.46,-14.93],[129.57,-15.05],[129.59,-15.1],[129.63,-15.14],[129.65,-15.09],[129.63,-15.01],[129.61,-14.93],[129.64,-14.85],[129.76,-14.85],[129.85,-14.83],[129.81,-14.8],[129.75,-14.79],[129.66,-14.72],[129.6,-14.65],[129.7,-14.58],[129.7,-14.56],[129.61,-14.56],[129.48,-14.49],[129.38,-14.39],[129.46,-14.21],[129.62,-14.04],[129.71,-13.98],[129.72,-13.92],[129.76,-13.81],[129.79,-13.72],[129.8,-13.65],[129.84,-13.57],[129.94,-13.5],[130.07,-13.48],[130.14,-13.45],[130.2,-13.38],[130.26,-13.3],[130.13,-13.15],[130.15,-13.06],[130.17,-12.96],[130.32,-12.88],[130.4,-12.69],[130.45,-12.66],[130.57,-12.66],[130.62,-12.65],[130.61,-12.49],[130.62,-12.43],[130.67,-12.41],[130.74,-12.43],[130.78,-12.5],[130.87,-12.56],[130.9,-12.52],[130.88,-12.46],[130.87,-12.37],[130.96,-12.35],[131.02,-12.34],[131.03,-12.27],[131.02,-12.21],[131.05,-12.19],[131.22,-12.18],[131.27,-12.12],[131.29,-12.07],[131.31,-12.1],[131.34,-12.21],[131.44,-12.28],[131.73,-12.28],[131.89,-12.23],[131.96,-12.26],[132.06,-12.28],[132.18,-12.23],[132.25,-12.19],[132.37,-12.24],[132.41,-12.3],[132.44,-12.18],[132.51,-12.13],[132.58,-12.11],[132.68,-12.13],[132.71,-12.12],[132.63,-12.04],[132.64,-11.95],[132.63,-11.84],[132.64,-11.73],[132.67,-11.65],[132.48,-11.49],[132.28,-11.47],[132.13,-11.5],[132.07,-11.47],[131.94,-11.35],[131.82,-11.3],[131.81,-11.27],[131.96,-11.18],[132.02,-11.2],[132.11,-11.28],[132.16,-11.31],[132.2,-11.3],[132.22,-11.24],[132.26,-11.2],[132.33,-11.22],[132.56,-11.37],[132.68,-11.51],[132.75,-11.47],[132.86,-11.39],[132.96,-11.41],[133.02,-11.45],[133.11,-11.62],[133.19,-11.71],[133.36,-11.73],[133.44,-11.76],[133.53,-11.82],[133.65,-11.81],[133.9,-11.83],[134.14,-11.94],[134.24,-12.01],[134.35,-12.03],[134.42,-12.05],[134.54,-12.06],[134.73,-11.98],[134.82,-12.05],[134.85,-12.1],[135.03,-12.19],[135.22,-12.22],[135.35,-12.13],[135.55,-12.06],[135.69,-11.96],[135.79,-11.91],[135.89,-11.82],[135.92,-11.83],[135.84,-11.91],[135.83,-11.95],[135.9,-11.97],[135.89,-11.99],[135.8,-12.05],[135.7,-12.15],[135.7,-12.21],[135.74,-12.24],[135.79,-12.23],[135.86,-12.18],[135.94,-12.15],[136.01,-12.19],[136.03,-12.33],[136.08,-12.42],[136.19,-12.44],[136.26,-12.43],[136.33,-12.31],[136.29,-12.2],[136.25,-12.17],[136.27,-12.13],[136.44,-11.95],[136.54,-11.96],[136.61,-12.13],[136.72,-12.23],[136.84,-12.22],[136.9,-12.24],[136.95,-12.35],[136.54,-12.78],[136.52,-12.83],[136.57,-12.91],[136.59,-13.0],[136.46,-13.23],[136.41,-13.24],[136.36,-13.18],[136.29,-13.14],[136.23,-13.16],[136.17,-13.18],[135.93,-13.3],[135.93,-13.62],[135.99,-13.81],[135.95,-13.93],[135.88,-14.15],[135.81,-14.23],[135.74,-14.29],[135.54,-14.58],[135.47,-14.66],[135.41,-14.76],[135.43,-14.86],[135.45,-14.92],[135.53,-15.0],[135.83,-15.16],[135.97,-15.27],[136.21,-15.4],[136.26,-15.5],[136.29,-15.57],[136.46,-15.66],[136.58,-15.71],[136.62,-15.69],[136.64,-15.68],[136.67,-15.68],[136.7,-15.69],[136.7,-15.75],[136.69,-15.79],[136.7,-15.83],[136.78,-15.89],[136.92,-15.89],[137.0,-15.88],[137.09,-15.94],[137.17,-15.98],[137.3,-16.07],[137.53,-16.17],[137.7,-16.23],[137.91,-16.48],[138.07,-16.62],[138.25,-16.72],[138.51,-16.79],[138.63,-16.78],[138.82,-16.86],[139.01,-16.9],[139.11,-17.01],[139.14,-17.1],[139.15,-17.17],[139.25,-17.33],[139.44,-17.38],[139.69,-17.54],[139.89,-17.61],[139.95,-17.65],[140.04,-17.7],[140.21,-17.7],[140.51,-17.62],[140.65,-17.54],[140.83,-17.41],[140.92,-17.19],[140.97,-17.01],[141.22,-16.65],[141.29,-16.46],[141.36,-16.22],[141.41,-16.07],[141.39,-15.9],[141.45,-15.61],[141.58,-15.2],[141.63,-15.06],[141.6,-14.85],[141.52,-14.47],[141.56,-14.34],[141.59,-14.15],[141.54,-14.02],[141.48,-13.93],[141.47,-13.8],[141.53,-13.55],[141.59,-13.43],[141.65,-13.26],[141.61,-12.94],[141.73,-12.83],[141.78,-12.78],[141.88,-12.78],[141.92,-12.8],[141.93,-12.74],[141.89,-12.68],[141.88,-12.61],[141.85,-12.58],[141.79,-12.57],[141.75,-12.53],[141.68,-12.49],[141.69,-12.35],[141.81,-12.08],[141.87,-11.98],[141.91,-12.02],[141.96,-12.05],[141.97,-11.98],[141.95,-11.9],[142.04,-11.63],[142.14,-11.27],[142.17,-10.95],[142.33,-10.88],[142.41,-10.8],[142.46,-10.71],[142.54,-10.71],[142.61,-10.75],[142.57,-10.82],[142.55,-10.87],[142.72,-11.01],[142.78,-11.12],[142.8,-11.21],[142.84,-11.31],[142.85,-11.43],[142.85,-11.63],[142.87,-11.82],[142.93,-11.88],[142.99,-11.92],[143.07,-11.92],[143.18,-11.95]],[[142.27,-10.7],[142.19,-10.76],[142.14,-10.73],[142.13,-10.67],[142.13,-10.64],[142.2,-10.59],[142.27,-10.7]],[[142.34,-10.19],[142.28,-10.25],[142.22,-10.24],[142.2,-10.2],[142.22,-10.15],[142.3,-10.14],[142.34,-10.19]],[[142.17,-10.15],[142.14,-10.18],[142.1,-10.12],[142.15,-10.05],[142.19,-10.09],[142.17,-10.15]]]},{"n":"Austria","r":[[[16.95,48.6],[16.95,48.59],[16.94,48.55],[16.9,48.5],[16.86,48.44],[16.87,48.39],[16.97,48.2],[17.07,48.08],[17.09,48.04],[17.15,48.01],[17.09,47.96],[17.08,47.9],[17.04,47.87],[17.03,47.84],[17.05,47.8],[17.05,47.76],[17.07,47.71],[16.97,47.7],[16.86,47.7],[16.82,47.69],[16.79,47.68],[16.75,47.69],[16.65,47.74],[16.59,47.75],[16.55,47.75],[16.52,47.72],[16.47,47.7],[16.42,47.67],[16.43,47.66],[16.64,47.61],[16.68,47.54],[16.64,47.48],[16.62,47.45],[16.57,47.42],[16.51,47.4],[16.44,47.4],[16.43,47.37],[16.46,47.27],[16.44,47.25],[16.42,47.22],[16.44,47.15],[16.48,47.14],[16.49,47.12],[16.48,47.09],[16.48,47.06],[16.46,47.02],[16.45,47.01],[16.42,47.0],[16.33,47.0],[16.25,46.97],[16.09,46.86],[16.04,46.84],[15.98,46.8],[15.98,46.71],[15.97,46.7],[15.96,46.68],[15.77,46.71],[15.76,46.71],[15.63,46.7],[15.55,46.65],[15.44,46.63],[15.22,46.64],[15.0,46.63],[14.95,46.61],[14.89,46.61],[14.84,46.58],[14.81,46.54],[14.76,46.5],[14.68,46.46],[14.6,46.44],[14.58,46.41],[14.55,46.4],[14.5,46.42],[14.47,46.42],[14.42,46.43],[14.27,46.44],[14.1,46.46],[14.02,46.48],[13.93,46.5],[13.83,46.51],[13.74,46.51],[13.7,46.52],[13.49,46.56],[13.35,46.56],[13.17,46.57],[12.81,46.63],[12.7,46.65],[12.6,46.65],[12.48,46.67],[12.39,46.7],[12.33,46.76],[12.27,46.84],[12.15,46.94],[12.13,46.98],[12.17,47.03],[12.2,47.06],[12.2,47.08],[12.17,47.08],[11.97,47.04],[11.78,46.99],[11.7,46.98],[11.63,47.0],[11.53,47.0],[11.43,46.98],[11.24,46.98],[11.13,46.94],[11.06,46.86],[11.03,46.8],[10.99,46.78],[10.93,46.77],[10.83,46.78],[10.76,46.79],[10.69,46.85],[10.58,46.85],[10.48,46.86],[10.45,46.86],[10.45,46.9],[10.41,46.96],[10.35,46.98],[10.18,46.86],[10.13,46.85],[10.0,46.89],[9.88,46.94],[9.86,46.98],[9.85,47.01],[9.75,47.04],[9.62,47.06],[9.58,47.06],[9.6,47.08],[9.61,47.11],[9.6,47.13],[9.57,47.16],[9.56,47.19],[9.55,47.21],[9.54,47.23],[9.54,47.25],[9.53,47.27],[9.61,47.39],[9.63,47.47],[9.55,47.51],[9.52,47.52],[9.55,47.53],[9.65,47.53],[9.72,47.55],[9.75,47.58],[9.84,47.55],[9.97,47.51],[10.03,47.47],[10.06,47.45],[10.07,47.43],[10.07,47.39],[10.1,47.38],[10.16,47.37],[10.2,47.36],[10.19,47.32],[10.18,47.28],[10.24,47.28],[10.31,47.31],[10.37,47.37],[10.4,47.42],[10.43,47.54],[10.44,47.55],[10.48,47.54],[10.66,47.55],[10.74,47.52],[10.87,47.52],[10.87,47.5],[10.89,47.47],[10.95,47.43],[10.98,47.4],[11.04,47.39],[11.14,47.41],[11.19,47.43],[11.21,47.41],[11.3,47.42],[11.37,47.46],[11.39,47.49],[11.47,47.51],[11.57,47.55],[11.72,47.58],[12.19,47.62],[12.2,47.65],[12.2,47.71],[12.21,47.72],[12.27,47.7],[12.36,47.69],[12.44,47.67],[12.48,47.64],[12.53,47.64],[12.59,47.66],[12.69,47.67],[12.77,47.64],[12.8,47.61],[12.78,47.59],[12.78,47.56],[12.81,47.54],[12.88,47.51],[12.97,47.48],[13.01,47.48],[13.03,47.51],[13.05,47.58],[13.05,47.66],[13.03,47.7],[12.99,47.71],[12.93,47.71],[12.9,47.72],[12.91,47.75],[12.95,47.81],[12.95,47.89],[12.85,47.98],[12.76,48.08],[12.76,48.11],[12.81,48.16],[12.9,48.2],[13.08,48.28],[13.14,48.29],[13.22,48.3],[13.32,48.33],[13.37,48.36],[13.41,48.39],[13.46,48.56],[13.47,48.57],[13.49,48.58],[13.68,48.52],[13.69,48.53],[13.72,48.54],[13.79,48.59],[13.8,48.62],[13.8,48.69],[13.8,48.75],[13.81,48.77],[13.84,48.76],[13.92,48.73],[13.99,48.69],[14.05,48.6],[14.19,48.58],[14.37,48.58],[14.43,48.62],[14.49,48.63],[14.55,48.61],[14.69,48.6],[14.71,48.67],[14.79,48.75],[14.82,48.77],[14.92,48.77],[14.95,48.83],[14.97,48.98],[14.99,49.0],[15.07,49.0],[15.14,48.97],[15.16,48.95],[15.2,48.95],[15.25,48.96],[15.31,48.97],[15.4,48.96],[15.6,48.89],[15.7,48.86],[15.77,48.87],[15.83,48.86],[16.06,48.75],[16.22,48.74],[16.37,48.74],[16.41,48.77],[16.48,48.8],[16.54,48.8],[16.6,48.78],[16.71,48.73],[16.76,48.72],[16.83,48.71],[16.88,48.7],[16.93,48.62],[16.95,48.6]]]},{"n":"Azerbaijan","r":[[[44.77,39.7],[44.87,39.72],[45.03,39.77],[45.08,39.74],[45.12,39.7],[45.15,39.66],[45.15,39.58],[45.17,39.57],[45.25,39.6],[45.29,39.57],[45.35,39.53],[45.46,39.49],[45.61,39.55],[45.69,39.56],[45.75,39.56],[45.78,39.55],[45.8,39.49],[45.78,39.42],[45.77,39.38],[45.8,39.35],[45.92,39.28],[45.98,39.24],[45.95,39.18],[46.05,39.02],[46.08,38.95],[46.11,38.88],[45.92,38.91],[45.58,38.97],[45.48,39.01],[45.39,39.1],[45.34,39.14],[45.26,39.19],[45.19,39.22],[45.14,39.25],[45.11,39.31],[45.07,39.36],[45.0,39.42],[44.84,39.63],[44.82,39.65],[44.78,39.68],[44.77,39.7]],[[46.49,38.91],[46.49,39.0],[46.49,39.07],[46.48,39.11],[46.4,39.17],[46.4,39.19],[46.42,39.21],[46.48,39.2],[46.55,39.2],[46.58,39.22],[46.51,39.3],[46.44,39.35],[46.38,39.38],[46.37,39.4],[46.37,39.42],[46.38,39.43],[46.48,39.48],[46.49,39.51],[46.48,39.56],[46.32,39.62],[46.2,39.59],[46.09,39.66],[46.03,39.72],[45.94,39.78],[45.86,39.81],[45.79,39.88],[45.66,39.96],[45.58,39.98],[45.58,39.99],[45.6,40.0],[45.63,40.01],[45.86,40.01],[45.89,40.02],[45.9,40.06],[45.93,40.1],[45.97,40.17],[45.96,40.23],[45.74,40.33],[45.57,40.42],[45.45,40.53],[45.38,40.64],[45.38,40.67],[45.4,40.71],[45.58,40.8],[45.59,40.83],[45.59,40.85],[45.52,40.9],[45.44,40.95],[45.42,40.99],[45.37,41.0],[45.27,41.01],[45.11,41.07],[45.07,41.08],[45.06,41.09],[45.07,41.1],[45.19,41.13],[45.19,41.15],[45.15,41.18],[45.08,41.2],[45.02,41.25],[45.0,41.29],[45.22,41.42],[45.28,41.45],[45.42,41.43],[45.72,41.34],[45.7,41.29],[45.73,41.26],[45.79,41.22],[45.92,41.19],[46.03,41.17],[46.09,41.18],[46.17,41.2],[46.28,41.15],[46.38,41.1],[46.43,41.08],[46.46,41.07],[46.53,41.09],[46.63,41.16],[46.66,41.25],[46.67,41.29],[46.62,41.34],[46.51,41.41],[46.38,41.46],[46.31,41.51],[46.25,41.6],[46.2,41.61],[46.19,41.62],[46.18,41.66],[46.18,41.7],[46.2,41.74],[46.25,41.75],[46.3,41.76],[46.35,41.79],[46.41,41.86],[46.43,41.89],[46.54,41.87],[46.55,41.81],[46.57,41.8],[46.62,41.81],[46.69,41.83],[46.75,41.81],[46.83,41.74],[46.93,41.67],[46.99,41.62],[47.01,41.59],[47.06,41.55],[47.14,41.52],[47.21,41.46],[47.26,41.32],[47.32,41.28],[47.52,41.23],[47.59,41.22],[47.79,41.2],[47.86,41.21],[47.96,41.33],[48.06,41.46],[48.14,41.48],[48.3,41.55],[48.39,41.6],[48.43,41.66],[48.52,41.78],[48.57,41.84],[48.66,41.79],[48.82,41.63],[49.05,41.37],[49.11,41.3],[49.14,41.22],[49.17,41.12],[49.23,41.03],[49.46,40.8],[49.56,40.72],[49.72,40.61],[49.78,40.58],[49.85,40.58],[49.99,40.58],[50.12,40.53],[50.18,40.5],[50.25,40.46],[50.31,40.41],[50.37,40.28],[50.14,40.32],[49.92,40.32],[49.79,40.29],[49.67,40.25],[49.55,40.19],[49.48,40.09],[49.42,39.84],[49.32,39.61],[49.33,39.5],[49.37,39.4],[49.36,39.35],[49.32,39.33],[49.27,39.29],[49.2,39.07],[49.17,39.03],[49.12,39.0],[49.11,39.03],[49.11,39.08],[49.01,39.13],[48.96,39.08],[48.93,38.96],[48.85,38.84],[48.85,38.82],[48.87,38.44],[48.84,38.44],[48.64,38.4],[48.59,38.41],[48.42,38.59],[48.38,38.61],[48.31,38.61],[48.26,38.64],[48.23,38.69],[48.2,38.72],[48.02,38.82],[48.0,38.85],[47.99,38.88],[48.02,38.91],[48.05,38.94],[48.14,38.96],[48.24,38.98],[48.28,38.99],[48.29,39.02],[48.29,39.06],[48.27,39.1],[48.13,39.17],[48.11,39.2],[48.1,39.24],[48.11,39.28],[48.14,39.31],[48.26,39.35],[48.32,39.4],[48.28,39.45],[48.15,39.56],[48.0,39.68],[47.89,39.69],[47.77,39.65],[47.58,39.54],[47.48,39.5],[47.34,39.42],[47.19,39.34],[47.07,39.25],[46.99,39.18],[46.85,39.15],[46.78,39.09],[46.55,38.9],[46.49,38.91]],[[44.97,41.03],[44.96,41.05],[44.96,41.08],[44.99,41.09],[45.02,41.08],[45.03,41.05],[45.02,41.03],[45.0,41.02],[44.97,41.03]]]},{"n":"Burundi","r":[[[30.55,-2.4],[30.53,-2.43],[30.44,-2.61],[30.42,-2.64],[30.43,-2.66],[30.47,-2.69],[30.45,-2.75],[30.44,-2.77],[30.42,-2.82],[30.43,-2.87],[30.46,-2.89],[30.52,-2.92],[30.6,-2.94],[30.71,-2.98],[30.78,-2.98],[30.8,-3.02],[30.79,-3.07],[30.81,-3.12],[30.81,-3.2],[30.79,-3.27],[30.68,-3.31],[30.63,-3.35],[30.61,-3.37],[30.62,-3.39],[30.63,-3.42],[30.53,-3.49],[30.42,-3.59],[30.4,-3.65],[30.38,-3.73],[30.35,-3.78],[30.27,-3.85],[30.19,-3.99],[30.15,-4.09],[29.95,-4.31],[29.77,-4.42],[29.72,-4.46],[29.4,-4.45],[29.38,-4.3],[29.33,-4.1],[29.22,-3.91],[29.21,-3.83],[29.22,-3.68],[29.22,-3.48],[29.21,-3.36],[29.21,-3.28],[29.23,-3.14],[29.22,-3.05],[29.15,-2.96],[29.06,-2.85],[29.02,-2.8],[29.01,-2.76],[29.01,-2.72],[29.03,-2.66],[29.06,-2.6],[29.1,-2.6],[29.2,-2.62],[29.3,-2.67],[29.35,-2.79],[29.39,-2.81],[29.46,-2.81],[29.65,-2.79],[29.7,-2.79],[29.78,-2.77],[29.87,-2.72],[29.89,-2.66],[29.91,-2.55],[29.93,-2.34],[29.97,-2.34],[30.09,-2.41],[30.12,-2.42],[30.14,-2.41],[30.18,-2.38],[30.23,-2.35],[30.27,-2.35],[30.41,-2.31],[30.48,-2.38],[30.53,-2.4],[30.55,-2.4]]]},{"n":"Belgium","r":[[[5.99,50.75],[6.01,50.73],[6.12,50.68],[6.15,50.64],[6.24,50.6],[6.17,50.55],[6.18,50.52],[6.2,50.5],[6.29,50.49],[6.34,50.45],[6.34,50.4],[6.36,50.32],[6.18,50.23],[6.12,50.14],[6.12,50.12],[6.11,50.12],[6.09,50.15],[6.05,50.15],[5.98,50.17],[5.87,50.08],[5.82,50.01],[5.79,49.96],[5.74,49.92],[5.74,49.88],[5.74,49.86],[5.73,49.83],[5.72,49.81],[5.79,49.76],[5.8,49.73],[5.88,49.64],[5.86,49.61],[5.84,49.58],[5.82,49.55],[5.79,49.54],[5.71,49.54],[5.61,49.53],[5.54,49.51],[5.51,49.51],[5.43,49.55],[5.35,49.62],[5.3,49.65],[5.28,49.68],[5.22,49.69],[5.12,49.72],[5.06,49.76],[5.01,49.78],[4.93,49.79],[4.87,49.79],[4.85,49.85],[4.84,49.91],[4.79,49.96],[4.86,50.14],[4.82,50.15],[4.77,50.14],[4.71,50.1],[4.68,50.05],[4.66,50.0],[4.55,49.96],[4.37,49.94],[4.18,49.96],[4.15,49.97],[4.14,49.98],[4.14,50.0],[4.15,50.02],[4.18,50.05],[4.19,50.09],[4.16,50.13],[4.14,50.14],[4.14,50.18],[4.17,50.22],[4.17,50.25],[4.04,50.32],[3.95,50.34],[3.86,50.34],[3.79,50.35],[3.75,50.34],[3.72,50.32],[3.69,50.31],[3.67,50.32],[3.63,50.46],[3.6,50.48],[3.48,50.5],[3.32,50.51],[3.27,50.53],[3.25,50.59],[3.23,50.66],[3.18,50.73],[3.15,50.75],[3.11,50.78],[3.02,50.77],[2.92,50.73],[2.86,50.72],[2.84,50.71],[2.76,50.75],[2.67,50.81],[2.6,50.88],[2.58,50.91],[2.6,50.96],[2.57,50.99],[2.54,51.05],[2.52,51.1],[2.96,51.27],[3.23,51.35],[3.35,51.38],[3.38,51.29],[3.4,51.26],[3.43,51.25],[3.47,51.24],[3.52,51.26],[3.58,51.29],[3.68,51.28],[3.76,51.25],[3.78,51.23],[3.83,51.21],[3.9,51.21],[4.04,51.25],[4.17,51.31],[4.21,51.35],[4.23,51.39],[4.3,51.36],[4.37,51.36],[4.4,51.37],[4.38,51.43],[4.44,51.46],[4.5,51.47],[4.53,51.45],[4.59,51.42],[4.63,51.42],[4.76,51.49],[4.78,51.48],[4.81,51.45],[4.82,51.43],[4.82,51.41],[4.85,51.4],[4.94,51.41],[4.99,51.45],[5.03,51.47],[5.06,51.45],[5.07,51.41],[5.1,51.35],[5.21,51.28],[5.31,51.26],[5.43,51.27],[5.48,51.29],[5.51,51.28],[5.54,51.24],[5.61,51.2],[5.75,51.17],[5.8,51.15],[5.83,51.13],[5.82,51.09],[5.75,50.99],[5.74,50.96],[5.75,50.95],[5.74,50.93],[5.65,50.87],[5.64,50.84],[5.67,50.81],[5.69,50.77],[5.69,50.77],[5.75,50.76],[5.8,50.75],[5.99,50.75]]]},{"n":"Benin","r":[[[3.6,11.7],[3.55,11.63],[3.49,11.5],[3.49,11.4],[3.64,11.18],[3.66,11.15],[3.7,11.12],[3.72,11.08],[3.73,10.97],[3.74,10.85],[3.76,10.77],[3.83,10.65],[3.83,10.61],[3.78,10.44],[3.77,10.42],[3.76,10.41],[3.68,10.43],[3.65,10.41],[3.6,10.35],[3.58,10.29],[3.58,10.27],[3.65,10.16],[3.6,10.0],[3.56,9.91],[3.48,9.85],[3.4,9.84],[3.35,9.81],[3.33,9.78],[3.33,9.67],[3.22,9.57],[3.16,9.49],[3.14,9.45],[3.15,9.32],[3.11,9.19],[3.04,9.08],[2.9,9.06],[2.77,9.05],[2.73,8.78],[2.73,8.61],[2.72,8.44],[2.7,8.37],[2.71,8.27],[2.7,8.05],[2.69,7.87],[2.71,7.83],[2.72,7.72],[2.72,7.62],[2.75,7.54],[2.79,7.48],[2.78,7.44],[2.77,7.42],[2.75,7.4],[2.75,7.14],[2.76,7.07],[2.75,7.02],[2.72,6.98],[2.73,6.85],[2.75,6.77],[2.77,6.71],[2.75,6.66],[2.74,6.6],[2.71,6.43],[2.71,6.37],[2.29,6.33],[1.82,6.26],[1.62,6.22],[1.61,6.25],[1.78,6.29],[1.74,6.43],[1.64,6.58],[1.6,6.61],[1.58,6.69],[1.6,6.74],[1.59,6.77],[1.58,6.88],[1.53,6.99],[1.62,7.0],[1.62,7.37],[1.62,7.73],[1.62,8.03],[1.62,8.27],[1.61,8.56],[1.6,8.77],[1.6,9.05],[1.57,9.14],[1.42,9.29],[1.39,9.36],[1.38,9.46],[1.35,9.57],[1.35,9.75],[1.34,9.96],[1.33,10.0],[1.18,10.1],[0.96,10.24],[0.79,10.35],[0.78,10.36],[0.76,10.39],[0.79,10.71],[0.82,10.75],[0.87,10.89],[0.9,10.99],[0.92,10.99],[0.96,11.03],[0.99,11.08],[1.01,11.07],[1.06,11.06],[1.08,11.08],[1.08,11.12],[1.1,11.16],[1.14,11.17],[1.15,11.21],[1.15,11.25],[1.18,11.26],[1.23,11.26],[1.28,11.27],[1.32,11.3],[1.36,11.38],[1.39,11.41],[1.4,11.43],[1.43,11.45],[1.5,11.46],[1.56,11.45],[1.6,11.4],[1.86,11.44],[1.98,11.42],[2.23,11.63],[2.29,11.69],[2.36,11.84],[2.39,11.9],[2.41,12.0],[2.36,12.19],[2.37,12.22],[2.47,12.26],[2.6,12.29],[2.65,12.3],[2.68,12.31],[2.73,12.35],[2.81,12.38],[2.85,12.37],[2.88,12.37],[3.15,12.12],[3.27,11.99],[3.3,11.93],[3.36,11.88],[3.45,11.85],[3.53,11.79],[3.6,11.7]]]},{"n":"Burkina Faso","r":[[[2.39,11.9],[2.36,11.84],[2.29,11.69],[2.23,11.63],[1.98,11.42],[1.86,11.44],[1.6,11.4],[1.56,11.45],[1.5,11.46],[1.43,11.45],[1.4,11.43],[1.39,11.41],[1.36,11.38],[1.32,11.3],[1.28,11.27],[1.23,11.26],[1.18,11.26],[1.15,11.25],[1.15,11.21],[1.14,11.17],[1.1,11.16],[1.08,11.12],[1.08,11.08],[1.06,11.06],[1.01,11.07],[0.99,11.08],[0.96,11.03],[0.92,10.99],[0.9,10.99],[0.64,10.98],[0.55,10.96],[0.49,10.95],[0.49,10.98],[0.48,10.99],[0.16,11.07],[-0.07,11.12],[-0.3,11.17],[-0.31,11.12],[-0.35,11.09],[-0.4,11.09],[-0.43,11.09],[-0.45,11.06],[-0.49,11.01],[-0.55,10.98],[-0.6,10.95],[-0.63,10.93],[-0.65,10.93],[-0.7,10.99],[-0.77,11.0],[-0.9,10.98],[-0.96,11.0],[-1.04,11.01],[-1.23,11.0],[-1.54,11.02],[-1.59,11.01],[-1.6,11.0],[-1.9,10.99],[-2.23,10.99],[-2.51,10.99],[-2.75,10.99],[-2.75,11.0],[-2.83,11.0],[-2.84,10.98],[-2.91,10.73],[-2.91,10.59],[-2.88,10.51],[-2.84,10.45],[-2.79,10.43],[-2.79,10.4],[-2.82,10.36],[-2.82,10.32],[-2.78,10.28],[-2.77,10.24],[-2.79,10.19],[-2.78,10.08],[-2.75,9.91],[-2.75,9.8],[-2.78,9.75],[-2.77,9.66],[-2.71,9.53],[-2.7,9.48],[-2.72,9.46],[-2.77,9.42],[-2.82,9.43],[-2.88,9.5],[-2.9,9.53],[-2.95,9.61],[-2.99,9.69],[-3.04,9.72],[-3.1,9.75],[-3.16,9.85],[-3.22,9.9],[-3.29,9.88],[-3.39,9.9],[-3.58,9.92],[-3.79,9.92],[-3.88,9.89],[-3.96,9.86],[-4.18,9.78],[-4.27,9.74],[-4.33,9.65],[-4.41,9.65],[-4.48,9.68],[-4.53,9.72],[-4.63,9.71],[-4.72,9.76],[-4.81,9.84],[-4.88,9.87],[-4.97,9.93],[-4.99,10.05],[-5.05,10.13],[-5.1,10.24],[-5.18,10.29],[-5.26,10.32],[-5.38,10.31],[-5.46,10.36],[-5.52,10.43],[-5.51,10.48],[-5.48,10.57],[-5.48,10.64],[-5.46,10.77],[-5.47,10.93],[-5.49,11.04],[-5.42,11.09],[-5.35,11.13],[-5.3,11.21],[-5.25,11.38],[-5.23,11.52],[-5.24,11.58],[-5.27,11.62],[-5.29,11.68],[-5.3,11.76],[-5.29,11.83],[-5.23,11.89],[-5.16,11.94],[-5.11,11.97],[-4.97,11.99],[-4.8,12.03],[-4.7,12.08],[-4.63,12.12],[-4.59,12.16],[-4.55,12.23],[-4.48,12.28],[-4.43,12.34],[-4.42,12.49],[-4.42,12.58],[-4.46,12.63],[-4.48,12.67],[-4.23,12.79],[-4.23,12.88],[-4.26,12.98],[-4.31,13.05],[-4.33,13.12],[-4.26,13.2],[-4.2,13.26],[-4.15,13.31],[-4.05,13.38],[-3.95,13.4],[-3.85,13.37],[-3.58,13.19],[-3.53,13.18],[-3.47,13.2],[-3.4,13.24],[-3.3,13.28],[-3.27,13.4],[-3.27,13.58],[-3.25,13.66],[-3.2,13.67],[-3.04,13.64],[-3.0,13.64],[-2.95,13.65],[-2.92,13.68],[-2.92,13.74],[-2.93,13.79],[-2.87,13.95],[-2.78,14.07],[-2.59,14.23],[-2.53,14.26],[-2.46,14.27],[-2.11,14.17],[-2.06,14.19],[-1.97,14.46],[-1.88,14.48],[-1.77,14.49],[-1.7,14.51],[-1.66,14.53],[-1.49,14.63],[-1.2,14.76],[-1.05,14.82],[-1.02,14.84],[-0.91,14.94],[-0.76,15.05],[-0.67,15.07],[-0.54,15.08],[-0.45,15.06],[-0.43,15.03],[-0.41,15.01],[-0.24,15.06],[0.01,14.98],[0.22,14.91],[0.2,14.87],[0.2,14.78],[0.19,14.65],[0.16,14.5],[0.25,14.4],[0.35,14.29],[0.38,14.25],[0.35,14.14],[0.37,14.08],[0.43,13.97],[0.52,13.84],[0.62,13.7],[0.68,13.69],[0.75,13.67],[0.79,13.65],[0.84,13.63],[0.9,13.61],[0.95,13.58],[0.98,13.55],[1.02,13.47],[1.13,13.41],[1.2,13.36],[1.17,13.33],[1.08,13.34],[0.99,13.36],[0.98,13.32],[0.97,13.17],[0.99,13.04],[1.01,13.02],[1.1,13.0],[1.31,12.83],[1.5,12.68],[1.56,12.64],[1.67,12.62],[1.79,12.61],[1.84,12.63],[1.96,12.71],[2.02,12.72],[2.07,12.71],[2.1,12.7],[2.16,12.64],[2.21,12.54],[2.23,12.47],[2.22,12.43],[2.2,12.41],[2.11,12.39],[2.07,12.38],[2.06,12.36],[2.07,12.31],[2.09,12.28],[2.19,12.14],[2.34,11.95],[2.39,11.9]]]},{"n":"Bangladesh","r":[[[91.95,21.51],[91.89,21.5],[91.86,21.53],[91.87,21.57],[91.86,21.71],[91.91,21.72],[91.93,21.72],[91.95,21.68],[91.96,21.61],[91.95,21.51]],[[91.87,21.83],[91.84,21.75],[91.82,21.81],[91.84,21.89],[91.85,21.93],[91.86,21.93],[91.88,21.88],[91.87,21.83]],[[91.15,22.18],[91.04,22.11],[91.08,22.52],[91.16,22.37],[91.18,22.28],[91.15,22.18]],[[91.56,22.38],[91.51,22.35],[91.47,22.38],[91.41,22.48],[91.44,22.6],[91.46,22.62],[91.48,22.58],[91.52,22.49],[91.55,22.43],[91.56,22.38]],[[90.78,22.09],[90.6,22.05],[90.52,22.07],[90.68,22.33],[90.67,22.44],[90.65,22.54],[90.56,22.62],[90.56,22.67],[90.52,22.75],[90.5,22.84],[90.6,22.86],[90.67,22.81],[90.68,22.79],[90.7,22.71],[90.74,22.64],[90.87,22.48],[90.87,22.39],[90.83,22.16],[90.78,22.09]],[[90.64,22.96],[90.66,22.92],[90.6,22.95],[90.56,22.98],[90.54,23.01],[90.58,23.04],[90.64,22.96]],[[88.94,26.25],[88.97,26.25],[88.98,26.29],[88.95,26.34],[88.92,26.38],[88.95,26.41],[88.98,26.42],[89.02,26.41],[89.07,26.38],[89.1,26.31],[89.11,26.2],[89.19,26.11],[89.29,26.04],[89.37,26.01],[89.47,25.98],[89.55,26.01],[89.59,26.07],[89.57,26.13],[89.59,26.19],[89.62,26.22],[89.67,26.21],[89.71,26.17],[89.82,25.94],[89.8,25.84],[89.82,25.56],[89.8,25.38],[89.8,25.34],[89.81,25.31],[89.83,25.29],[89.87,25.29],[90.0,25.26],[90.12,25.22],[90.25,25.18],[90.44,25.16],[90.56,25.17],[90.61,25.17],[90.73,25.16],[91.04,25.17],[91.29,25.18],[91.4,25.15],[91.48,25.14],[91.76,25.16],[92.05,25.17],[92.2,25.11],[92.37,25.02],[92.47,24.94],[92.49,24.9],[92.48,24.87],[92.44,24.85],[92.38,24.85],[92.25,24.9],[92.23,24.88],[92.23,24.79],[92.23,24.77],[92.2,24.69],[92.12,24.49],[92.1,24.41],[92.09,24.39],[92.06,24.37],[92.0,24.37],[91.95,24.36],[91.93,24.33],[91.9,24.26],[91.88,24.2],[91.85,24.18],[91.77,24.21],[91.73,24.21],[91.67,24.19],[91.61,24.15],[91.57,24.11],[91.53,24.09],[91.39,24.1],[91.37,24.09],[91.35,24.06],[91.34,24.02],[91.23,23.92],[91.19,23.76],[91.16,23.66],[91.17,23.58],[91.25,23.37],[91.32,23.1],[91.34,23.08],[91.36,23.07],[91.37,23.07],[91.37,23.13],[91.37,23.2],[91.4,23.21],[91.44,23.2],[91.47,23.14],[91.51,23.03],[91.55,22.99],[91.62,22.98],[91.69,23.0],[91.75,23.05],[91.77,23.11],[91.76,23.21],[91.75,23.29],[91.79,23.36],[91.92,23.47],[91.94,23.5],[91.93,23.6],[91.93,23.69],[91.98,23.69],[92.04,23.68],[92.13,23.72],[92.15,23.72],[92.19,23.68],[92.25,23.68],[92.29,23.49],[92.33,23.32],[92.33,23.24],[92.34,23.07],[92.36,22.93],[92.39,22.9],[92.43,22.82],[92.46,22.73],[92.49,22.69],[92.51,22.53],[92.53,22.41],[92.56,22.05],[92.57,21.98],[92.58,21.94],[92.58,21.61],[92.59,21.47],[92.63,21.35],[92.63,21.31],[92.6,21.27],[92.57,21.26],[92.54,21.32],[92.47,21.36],[92.37,21.41],[92.33,21.44],[92.28,21.43],[92.21,21.36],[92.18,21.29],[92.19,21.2],[92.21,21.11],[92.26,21.06],[92.27,21.0],[92.29,20.93],[92.31,20.86],[92.32,20.79],[92.31,20.79],[92.25,20.88],[92.19,20.98],[92.06,21.17],[92.01,21.52],[92.01,21.68],[91.91,21.88],[91.85,22.16],[91.82,22.23],[91.86,22.32],[91.86,22.35],[91.85,22.34],[91.8,22.3],[91.73,22.41],[91.69,22.5],[91.53,22.71],[91.48,22.8],[91.48,22.88],[91.41,22.8],[91.31,22.74],[91.22,22.64],[91.15,22.61],[90.95,22.6],[90.83,22.72],[90.66,23.03],[90.63,23.09],[90.66,23.27],[90.62,23.44],[90.62,23.53],[90.6,23.59],[90.57,23.58],[90.56,23.54],[90.57,23.47],[90.56,23.42],[90.41,23.43],[90.27,23.46],[90.39,23.37],[90.52,23.35],[90.59,23.27],[90.6,23.2],[90.6,23.13],[90.53,23.08],[90.47,23.05],[90.48,22.99],[90.55,22.9],[90.46,22.88],[90.44,22.83],[90.44,22.75],[90.48,22.68],[90.5,22.63],[90.49,22.59],[90.53,22.54],[90.6,22.44],[90.62,22.36],[90.59,22.26],[90.55,22.22],[90.49,22.18],[90.36,22.05],[90.29,21.9],[90.23,21.83],[90.16,21.82],[90.13,21.85],[90.07,21.89],[90.07,21.96],[90.09,22.02],[90.21,22.16],[90.14,22.14],[90.07,22.1],[89.95,22.02],[89.92,22.12],[89.89,22.2],[89.89,22.31],[89.99,22.47],[89.88,22.39],[89.85,22.29],[89.87,22.17],[89.85,22.09],[89.81,21.98],[89.76,21.92],[89.67,21.88],[89.63,21.81],[89.57,21.77],[89.57,21.86],[89.55,21.98],[89.48,22.28],[89.47,22.21],[89.5,22.03],[89.5,21.91],[89.45,21.82],[89.35,21.72],[89.28,21.71],[89.23,21.72],[89.17,21.78],[89.09,21.87],[89.08,22.01],[89.05,22.09],[89.06,22.19],[89.05,22.27],[88.97,22.51],[88.92,22.63],[88.93,22.67],[88.92,22.69],[88.9,22.84],[88.87,22.94],[88.85,23.04],[88.93,23.19],[88.9,23.21],[88.81,23.23],[88.72,23.25],[88.7,23.29],[88.74,23.44],[88.7,23.49],[88.64,23.55],[88.62,23.57],[88.6,23.6],[88.57,23.67],[88.62,23.83],[88.7,24.0],[88.71,24.07],[88.73,24.19],[88.73,24.23],[88.72,24.27],[88.64,24.33],[88.5,24.35],[88.4,24.39],[88.34,24.45],[88.29,24.48],[88.22,24.46],[88.15,24.49],[88.08,24.55],[88.02,24.63],[88.03,24.66],[88.05,24.71],[88.15,24.91],[88.19,24.92],[88.28,24.88],[88.31,24.88],[88.37,24.96],[88.46,25.19],[88.57,25.19],[88.68,25.18],[88.75,25.17],[88.82,25.18],[88.89,25.19],[88.93,25.22],[88.95,25.26],[88.94,25.29],[88.85,25.33],[88.82,25.37],[88.8,25.46],[88.77,25.49],[88.59,25.5],[88.5,25.54],[88.45,25.57],[88.36,25.7],[88.25,25.79],[88.15,25.81],[88.11,25.84],[88.08,25.89],[88.1,25.96],[88.13,26.02],[88.15,26.09],[88.24,26.18],[88.33,26.26],[88.38,26.31],[88.44,26.37],[88.45,26.4],[88.44,26.44],[88.39,26.47],[88.35,26.48],[88.35,26.5],[88.37,26.56],[88.42,26.57],[88.52,26.52],[88.62,26.43],[88.68,26.35],[88.68,26.29],[88.72,26.28],[88.76,26.28],[88.83,26.25],[88.9,26.26],[88.94,26.25]]]},{"n":"Bulgaria","r":[[[28.59,43.74],[28.56,43.5],[28.47,43.39],[28.32,43.43],[28.13,43.4],[28.04,43.27],[27.98,43.23],[27.93,43.19],[27.9,43.02],[27.89,42.75],[27.82,42.72],[27.75,42.71],[27.48,42.47],[27.64,42.4],[27.71,42.35],[27.82,42.21],[27.98,42.05],[28.01,41.97],[27.88,41.99],[27.83,41.98],[27.8,41.96],[27.74,41.96],[27.66,41.96],[27.58,41.93],[27.53,41.92],[27.47,41.95],[27.36,42.03],[27.29,42.08],[27.24,42.09],[27.19,42.08],[27.01,42.06],[26.97,42.03],[26.88,41.99],[26.8,41.98],[26.68,41.96],[26.62,41.96],[26.58,41.95],[26.55,41.9],[26.53,41.85],[26.51,41.83],[26.36,41.8],[26.33,41.77],[26.32,41.74],[26.32,41.72],[26.2,41.74],[26.11,41.73],[26.09,41.7],[26.07,41.67],[26.08,41.64],[26.11,41.61],[26.14,41.52],[26.16,41.43],[26.14,41.39],[26.07,41.35],[25.92,41.31],[25.78,41.33],[25.72,41.32],[25.62,41.31],[25.53,41.3],[25.38,41.26],[25.25,41.24],[25.13,41.32],[24.99,41.36],[24.85,41.39],[24.8,41.37],[24.77,41.36],[24.65,41.42],[24.6,41.44],[24.57,41.47],[24.52,41.55],[24.49,41.56],[24.39,41.52],[24.29,41.53],[24.23,41.53],[24.06,41.53],[24.03,41.47],[24.01,41.46],[23.97,41.45],[23.88,41.46],[23.76,41.41],[23.64,41.39],[23.54,41.39],[23.43,41.4],[23.37,41.39],[23.24,41.38],[23.16,41.32],[23.03,41.33],[22.92,41.34],[22.93,41.36],[22.95,41.61],[23.01,41.72],[23.0,41.74],[22.99,41.76],[22.94,41.78],[22.91,41.84],[22.84,41.99],[22.8,42.03],[22.68,42.06],[22.58,42.1],[22.5,42.17],[22.34,42.31],[22.42,42.33],[22.45,42.36],[22.52,42.44],[22.53,42.48],[22.52,42.5],[22.47,42.54],[22.44,42.63],[22.46,42.71],[22.47,42.75],[22.44,42.79],[22.47,42.84],[22.52,42.87],[22.56,42.88],[22.71,42.88],[22.8,42.99],[22.86,43.02],[22.92,43.08],[22.94,43.1],[22.97,43.14],[22.98,43.19],[22.86,43.25],[22.82,43.3],[22.77,43.35],[22.7,43.39],[22.55,43.45],[22.5,43.52],[22.47,43.6],[22.44,43.67],[22.39,43.71],[22.39,43.74],[22.37,43.78],[22.37,43.86],[22.4,43.97],[22.42,44.01],[22.47,44.02],[22.6,44.08],[22.6,44.15],[22.63,44.19],[22.67,44.22],[22.71,44.24],[22.78,44.2],[22.95,44.13],[23.03,44.08],[23.02,44.05],[22.99,44.02],[22.91,43.99],[22.87,43.95],[22.86,43.9],[22.87,43.86],[22.92,43.83],[23.22,43.87],[23.53,43.85],[23.95,43.79],[24.23,43.76],[24.43,43.79],[24.81,43.74],[25.16,43.69],[25.5,43.67],[25.69,43.71],[25.82,43.77],[25.93,43.87],[26.22,44.01],[26.49,44.08],[26.85,44.15],[27.09,44.17],[27.12,44.15],[27.43,44.02],[27.56,44.02],[27.67,44.0],[27.71,43.96],[27.74,43.96],[27.88,43.99],[27.95,43.92],[28.05,43.82],[28.22,43.77],[28.38,43.74],[28.42,43.74],[28.59,43.74]]]},{"n":"Bahrain","r":[[[50.61,25.88],[50.57,25.81],[50.54,25.83],[50.47,25.97],[50.49,26.06],[50.45,26.19],[50.47,26.23],[50.56,26.25],[50.59,26.24],[50.56,26.2],[50.61,26.12],[50.62,26.0],[50.61,25.88]]]},{"n":"The Bahamas","r":[[[-73.03,21.19],[-73.06,21.12],[-73.16,20.98],[-73.4,20.94],[-73.66,20.94],[-73.68,20.98],[-73.69,21.01],[-73.67,21.06],[-73.67,21.08],[-73.68,21.1],[-73.59,21.13],[-73.52,21.19],[-73.42,21.2],[-73.3,21.16],[-73.24,21.15],[-73.14,21.2],[-73.06,21.31],[-73.01,21.3],[-73.03,21.19]],[[-72.92,21.51],[-73.05,21.46],[-73.06,21.52],[-72.99,21.56],[-72.92,21.51]],[[-73.04,22.43],[-72.98,22.41],[-72.95,22.42],[-72.83,22.39],[-72.76,22.34],[-72.75,22.33],[-72.78,22.29],[-72.89,22.36],[-72.98,22.37],[-73.11,22.37],[-73.16,22.38],[-73.13,22.46],[-73.04,22.43]],[[-74.21,22.21],[-74.28,22.18],[-74.26,22.24],[-74.13,22.32],[-74.05,22.4],[-74.01,22.43],[-73.99,22.45],[-73.94,22.48],[-73.91,22.53],[-73.91,22.57],[-73.98,22.64],[-73.98,22.68],[-73.95,22.72],[-73.85,22.73],[-73.88,22.68],[-73.84,22.54],[-73.97,22.36],[-74.09,22.31],[-74.21,22.21]],[[-74.06,22.72],[-74.03,22.71],[-74.1,22.67],[-74.24,22.72],[-74.27,22.71],[-74.3,22.76],[-74.31,22.8],[-74.31,22.84],[-74.22,22.81],[-74.18,22.76],[-74.06,22.72]],[[-74.84,22.89],[-74.85,22.87],[-74.97,23.07],[-75.13,23.12],[-75.22,23.17],[-75.2,23.19],[-75.14,23.2],[-75.13,23.27],[-75.16,23.34],[-75.24,23.47],[-75.29,23.57],[-75.31,23.59],[-75.32,23.67],[-75.22,23.55],[-75.18,23.44],[-75.11,23.33],[-75.06,23.15],[-74.94,23.09],[-74.85,23.0],[-74.84,22.89]],[[-75.66,23.45],[-75.71,23.44],[-75.78,23.47],[-75.96,23.59],[-76.04,23.6],[-76.01,23.67],[-75.95,23.65],[-75.81,23.54],[-75.75,23.49],[-75.66,23.45]],[[-74.43,24.07],[-74.51,23.96],[-74.55,23.97],[-74.53,24.11],[-74.47,24.13],[-74.45,24.13],[-74.43,24.07]],[[-77.66,24.25],[-77.66,24.23],[-77.76,24.16],[-77.68,24.12],[-77.62,24.22],[-77.56,24.14],[-77.53,23.99],[-77.54,23.96],[-77.53,23.94],[-77.52,23.91],[-77.52,23.87],[-77.57,23.74],[-77.77,23.75],[-77.78,23.86],[-77.81,23.88],[-77.85,24.04],[-77.91,24.09],[-78.0,24.22],[-77.95,24.25],[-77.88,24.24],[-77.85,24.26],[-77.76,24.27],[-77.7,24.29],[-77.66,24.25]],[[-75.31,24.2],[-75.3,24.15],[-75.37,24.16],[-75.47,24.14],[-75.5,24.14],[-75.48,24.17],[-75.41,24.22],[-75.41,24.27],[-75.49,24.33],[-75.59,24.49],[-75.64,24.53],[-75.66,24.59],[-75.74,24.65],[-75.73,24.69],[-75.71,24.7],[-75.65,24.68],[-75.53,24.45],[-75.52,24.43],[-75.31,24.2]],[[-77.35,25.01],[-77.46,24.99],[-77.54,25.01],[-77.56,25.03],[-77.53,25.06],[-77.45,25.08],[-77.33,25.08],[-77.28,25.06],[-77.27,25.04],[-77.35,25.01]],[[-77.74,24.71],[-77.75,24.59],[-77.74,24.5],[-77.75,24.46],[-77.85,24.4],[-77.88,24.37],[-77.98,24.33],[-78.04,24.29],[-78.08,24.36],[-78.14,24.41],[-78.15,24.49],[-78.19,24.47],[-78.26,24.48],[-78.37,24.54],[-78.44,24.63],[-78.34,24.64],[-78.32,24.59],[-78.24,24.65],[-78.26,24.69],[-78.27,24.69],[-78.3,24.75],[-78.18,24.92],[-78.16,25.02],[-78.21,25.19],[-78.16,25.2],[-78.03,25.14],[-77.98,25.08],[-77.97,25.0],[-77.92,24.94],[-77.84,24.79],[-77.74,24.71]],[[-76.65,25.49],[-76.48,25.37],[-76.34,25.33],[-76.19,25.19],[-76.13,25.14],[-76.11,25.09],[-76.14,24.89],[-76.17,24.76],[-76.17,24.65],[-76.21,24.68],[-76.24,24.75],[-76.3,24.8],[-76.32,24.82],[-76.21,24.82],[-76.2,24.94],[-76.15,25.03],[-76.16,25.12],[-76.28,25.22],[-76.37,25.31],[-76.5,25.34],[-76.62,25.43],[-76.69,25.44],[-76.78,25.43],[-76.75,25.48],[-76.73,25.55],[-76.71,25.56],[-76.65,25.49]],[[-78.49,26.73],[-78.37,26.7],[-78.31,26.7],[-78.27,26.72],[-78.09,26.71],[-77.94,26.74],[-77.92,26.69],[-77.93,26.66],[-78.23,26.64],[-78.52,26.56],[-78.67,26.51],[-78.74,26.5],[-78.8,26.53],[-78.99,26.69],[-78.94,26.67],[-78.8,26.58],[-78.71,26.6],[-78.63,26.66],[-78.62,26.7],[-78.63,26.73],[-78.6,26.8],[-78.49,26.73]],[[-77.23,25.9],[-77.25,25.9],[-77.33,26.0],[-77.4,26.02],[-77.29,26.1],[-77.25,26.16],[-77.25,26.29],[-77.22,26.36],[-77.23,26.42],[-77.21,26.49],[-77.24,26.56],[-77.33,26.62],[-77.51,26.85],[-77.8,26.9],[-77.94,26.9],[-77.86,26.94],[-77.79,26.94],[-77.67,26.91],[-77.53,26.9],[-77.45,26.84],[-77.37,26.75],[-77.3,26.71],[-77.27,26.69],[-77.27,26.66],[-77.26,26.64],[-77.16,26.6],[-77.07,26.53],[-77.04,26.33],[-77.17,26.24],[-77.19,25.96],[-77.23,25.9]]]},{"n":"Bosnia and Herzegovina","r":[[[19.01,44.87],[19.04,44.87],[19.13,44.9],[19.24,44.91],[19.31,44.9],[19.35,44.88],[19.36,44.86],[19.33,44.78],[19.29,44.7],[19.22,44.61],[19.15,44.53],[19.13,44.48],[19.13,44.41],[19.12,44.36],[19.13,44.33],[19.15,44.3],[19.23,44.28],[19.34,44.23],[19.43,44.15],[19.55,44.07],[19.58,44.04],[19.58,44.01],[19.55,43.99],[19.45,43.98],[19.35,43.99],[19.31,43.99],[19.27,43.98],[19.25,43.97],[19.26,43.94],[19.36,43.84],[19.49,43.7],[19.5,43.64],[19.48,43.6],[19.45,43.56],[19.4,43.57],[19.36,43.59],[19.3,43.59],[19.25,43.58],[19.19,43.53],[19.16,43.54],[19.11,43.53],[19.08,43.52],[19.03,43.53],[18.97,43.54],[18.95,43.53],[18.94,43.5],[18.97,43.44],[19.04,43.36],[19.03,43.29],[18.98,43.29],[18.93,43.34],[18.9,43.35],[18.85,43.35],[18.75,43.28],[18.67,43.23],[18.66,43.19],[18.63,43.15],[18.62,43.12],[18.62,43.03],[18.49,43.01],[18.46,43.0],[18.44,42.97],[18.46,42.84],[18.47,42.78],[18.54,42.67],[18.55,42.64],[18.53,42.62],[18.48,42.58],[18.45,42.56],[18.44,42.56],[18.35,42.59],[18.3,42.6],[18.12,42.69],[18.04,42.74],[17.92,42.81],[17.84,42.85],[17.8,42.9],[17.74,42.92],[17.67,42.9],[17.59,42.94],[17.64,42.96],[17.66,42.98],[17.65,43.01],[17.62,43.04],[17.4,43.2],[17.29,43.31],[17.28,43.34],[17.27,43.45],[17.25,43.47],[17.08,43.52],[16.9,43.65],[16.71,43.78],[16.69,43.82],[16.59,43.91],[16.47,44.0],[16.38,44.06],[16.3,44.12],[16.21,44.22],[16.17,44.35],[16.13,44.47],[16.1,44.52],[16.05,44.54],[15.88,44.68],[15.74,44.77],[15.74,44.86],[15.76,45.01],[15.79,45.18],[15.82,45.2],[15.89,45.22],[15.96,45.21],[16.03,45.19],[16.16,45.07],[16.23,45.03],[16.29,45.01],[16.37,45.06],[16.45,45.16],[16.53,45.22],[16.79,45.2],[16.92,45.28],[17.13,45.17],[17.21,45.16],[17.26,45.17],[17.32,45.16],[17.47,45.13],[17.5,45.12],[17.55,45.12],[17.65,45.16],[17.69,45.16],[17.81,45.08],[17.87,45.08],[17.95,45.11],[18.0,45.14],[18.14,45.12],[18.22,45.13],[18.28,45.13],[18.36,45.12],[18.42,45.1],[18.49,45.09],[18.66,45.08],[18.75,45.03],[18.78,44.98],[18.78,44.95],[18.79,44.91],[18.84,44.88],[18.94,44.87],[19.01,44.87]]]},{"n":"Saint Barthelemy","r":[[[-62.83,17.88],[-62.85,17.88],[-62.86,17.88],[-62.87,17.9],[-62.88,17.91],[-62.87,17.92],[-62.87,17.92],[-62.8,17.91],[-62.81,17.9],[-62.82,17.89],[-62.83,17.88]]]},{"n":"Belarus","r":[[[28.15,56.14],[28.28,56.06],[28.32,56.05],[28.39,56.09],[28.41,56.09],[28.56,56.09],[28.64,56.06],[28.69,56.0],[28.74,55.96],[28.79,55.94],[28.95,56.0],[29.03,56.02],[29.09,56.02],[29.28,55.97],[29.38,55.94],[29.4,55.91],[29.4,55.88],[29.37,55.83],[29.35,55.78],[29.41,55.72],[29.48,55.68],[29.63,55.75],[29.68,55.77],[29.74,55.77],[29.82,55.8],[29.88,55.83],[29.94,55.85],[30.04,55.84],[30.23,55.85],[30.46,55.79],[30.48,55.77],[30.59,55.7],[30.63,55.67],[30.66,55.66],[30.72,55.62],[30.8,55.6],[30.86,55.61],[30.88,55.6],[30.91,55.57],[30.91,55.53],[30.9,55.4],[30.86,55.36],[30.82,55.33],[30.81,55.31],[30.81,55.28],[30.88,55.22],[30.96,55.14],[30.98,55.09],[30.98,55.05],[30.87,54.94],[30.83,54.91],[30.8,54.86],[30.79,54.81],[30.8,54.78],[30.98,54.7],[31.12,54.65],[31.15,54.63],[31.15,54.61],[31.08,54.52],[31.07,54.49],[31.18,54.45],[31.25,54.39],[31.3,54.29],[31.4,54.2],[31.63,54.11],[31.79,54.06],[31.83,54.03],[31.84,54.0],[31.83,53.94],[31.78,53.85],[31.75,53.81],[31.82,53.79],[31.99,53.8],[32.2,53.78],[32.45,53.69],[32.45,53.65],[32.43,53.62],[32.44,53.58],[32.47,53.55],[32.69,53.45],[32.71,53.42],[32.71,53.37],[32.7,53.34],[32.64,53.33],[32.58,53.31],[32.47,53.27],[32.43,53.21],[32.25,53.13],[32.14,53.09],[32.06,53.09],[31.85,53.11],[31.78,53.15],[31.75,53.18],[31.67,53.2],[31.56,53.2],[31.42,53.2],[31.39,53.18],[31.36,53.14],[31.3,53.06],[31.26,53.02],[31.3,52.99],[31.35,52.93],[31.44,52.86],[31.54,52.8],[31.56,52.76],[31.56,52.73],[31.52,52.7],[31.53,52.63],[31.62,52.55],[31.59,52.53],[31.58,52.43],[31.58,52.31],[31.6,52.28],[31.65,52.26],[31.69,52.22],[31.76,52.13],[31.76,52.1],[31.57,52.11],[31.35,52.11],[31.22,52.05],[31.17,52.06],[31.08,52.08],[30.98,52.05],[30.85,51.95],[30.76,51.9],[30.67,51.81],[30.64,51.77],[30.58,51.69],[30.53,51.6],[30.56,51.53],[30.6,51.47],[30.61,51.41],[30.63,51.36],[30.58,51.32],[30.54,51.27],[30.45,51.27],[30.33,51.33],[30.31,51.4],[30.22,51.45],[30.16,51.48],[30.06,51.48],[29.91,51.46],[29.71,51.44],[29.55,51.43],[29.47,51.41],[29.35,51.38],[29.3,51.41],[29.23,51.5],[29.17,51.58],[29.14,51.62],[29.1,51.63],[29.06,51.63],[29.01,51.6],[28.98,51.57],[28.93,51.56],[28.85,51.54],[28.79,51.51],[28.73,51.43],[28.69,51.44],[28.65,51.46],[28.6,51.54],[28.53,51.56],[28.42,51.56],[28.29,51.58],[28.18,51.61],[28.14,51.6],[28.08,51.57],[28.01,51.56],[27.86,51.59],[27.83,51.58],[27.79,51.53],[27.74,51.48],[27.7,51.48],[27.68,51.49],[27.69,51.57],[27.6,51.6],[27.45,51.61],[27.35,51.59],[27.3,51.6],[27.27,51.61],[27.14,51.75],[27.07,51.76],[26.95,51.75],[26.77,51.77],[26.57,51.8],[26.45,51.81],[26.39,51.84],[26.27,51.86],[25.93,51.91],[25.79,51.92],[25.58,51.92],[25.27,51.94],[25.07,51.93],[24.97,51.91],[24.87,51.9],[24.69,51.89],[24.61,51.89],[24.5,51.88],[24.36,51.87],[24.32,51.84],[24.28,51.77],[24.13,51.66],[23.98,51.59],[23.95,51.59],[23.86,51.62],[23.79,51.64],[23.71,51.64],[23.65,51.63],[23.61,51.61],[23.61,51.53],[23.61,51.52],[23.54,51.62],[23.54,51.71],[23.58,51.76],[23.63,51.81],[23.61,51.88],[23.65,51.97],[23.65,52.04],[23.63,52.07],[23.6,52.1],[23.5,52.14],[23.46,52.17],[23.33,52.21],[23.2,52.26],[23.18,52.29],[23.18,52.31],[23.2,52.34],[23.3,52.43],[23.41,52.52],[23.48,52.55],[23.84,52.66],[23.9,52.7],[23.92,52.77],[23.92,52.82],[23.91,52.9],[23.89,53.03],[23.86,53.11],[23.79,53.27],[23.6,53.6],[23.48,53.94],[23.56,53.92],[23.73,53.91],[23.87,53.94],[23.94,53.94],[24.01,53.93],[24.1,53.95],[24.19,53.95],[24.24,53.92],[24.32,53.89],[24.48,53.93],[24.62,53.98],[24.77,53.97],[24.79,54.0],[24.83,54.12],[24.87,54.15],[25.05,54.13],[25.11,54.15],[25.18,54.21],[25.28,54.25],[25.37,54.25],[25.46,54.29],[25.51,54.26],[25.53,54.22],[25.5,54.18],[25.51,54.16],[25.57,54.14],[25.68,54.14],[25.75,54.16],[25.77,54.18],[25.77,54.22],[25.75,54.26],[25.7,54.29],[25.62,54.31],[25.56,54.31],[25.55,54.33],[25.57,54.38],[25.62,54.46],[25.69,54.54],[25.72,54.56],[25.73,54.59],[25.72,54.64],[25.72,54.72],[25.78,54.83],[25.86,54.92],[25.96,54.95],[26.09,54.96],[26.18,55.0],[26.22,55.05],[26.23,55.09],[26.25,55.12],[26.29,55.14],[26.6,55.13],[26.65,55.2],[26.68,55.22],[26.73,55.25],[26.78,55.27],[26.76,55.29],[26.68,55.31],[26.5,55.32],[26.46,55.34],[26.47,55.37],[26.52,55.45],[26.57,55.55],[26.59,55.62],[26.59,55.67],[26.62,55.68],[26.77,55.69],[26.82,55.71],[26.95,55.81],[27.05,55.83],[27.31,55.8],[27.43,55.81],[27.46,55.8],[27.58,55.8],[27.59,55.81],[27.64,55.91],[27.69,55.94],[27.9,56.08],[28.03,56.13],[28.12,56.15],[28.15,56.14]]]},{"n":"Belize","r":[[[-87.85,17.42],[-87.93,17.28],[-87.93,17.32],[-87.9,17.43],[-87.86,17.46],[-87.83,17.5],[-87.83,17.55],[-87.79,17.52],[-87.8,17.48],[-87.85,17.42]],[[-87.95,17.92],[-88.0,17.91],[-87.96,17.96],[-87.95,18.0],[-87.9,18.15],[-87.86,18.15],[-87.85,18.14],[-87.95,17.92]],[[-89.16,17.81],[-89.16,17.9],[-89.13,17.97],[-89.05,18.0],[-88.94,17.94],[-88.9,17.91],[-88.86,17.93],[-88.81,17.97],[-88.74,18.07],[-88.59,18.29],[-88.52,18.45],[-88.46,18.48],[-88.37,18.48],[-88.3,18.47],[-88.35,18.36],[-88.3,18.34],[-88.25,18.35],[-88.13,18.35],[-88.09,18.23],[-88.1,18.12],[-88.21,17.85],[-88.22,17.75],[-88.27,17.61],[-88.2,17.52],[-88.27,17.39],[-88.29,17.31],[-88.29,17.19],[-88.26,16.96],[-88.31,16.63],[-88.4,16.49],[-88.46,16.43],[-88.56,16.29],[-88.7,16.25],[-88.88,16.02],[-88.91,15.96],[-88.89,15.89],[-88.94,15.89],[-89.11,15.9],[-89.23,15.89],[-89.24,15.89],[-89.23,16.14],[-89.21,16.53],[-89.2,16.81],[-89.19,17.08],[-89.18,17.29],[-89.17,17.57],[-89.16,17.81]]]},{"n":"Bermuda","r":[[[-64.73,32.29],[-64.82,32.26],[-64.85,32.26],[-64.86,32.27],[-64.77,32.31],[-64.69,32.39],[-64.67,32.38],[-64.73,32.29]]]},{"n":"Bolivia","r":[[[-62.65,-22.23],[-62.67,-22.22],[-62.74,-22.16],[-62.82,-22.05],[-62.83,-22.0],[-62.84,-22.0],[-63.27,-22.0],[-63.68,-22.0],[-63.72,-22.03],[-63.78,-22.03],[-63.82,-22.01],[-63.86,-22.01],[-63.92,-22.03],[-63.98,-22.07],[-64.13,-22.37],[-64.21,-22.49],[-64.27,-22.6],[-64.31,-22.8],[-64.33,-22.83],[-64.37,-22.76],[-64.45,-22.59],[-64.48,-22.49],[-64.52,-22.37],[-64.61,-22.23],[-64.7,-22.19],[-64.76,-22.17],[-64.84,-22.14],[-64.99,-22.11],[-65.06,-22.1],[-65.48,-22.1],[-65.52,-22.09],[-65.69,-22.11],[-65.77,-22.1],[-65.86,-22.02],[-66.06,-21.88],[-66.1,-21.84],[-66.17,-21.81],[-66.22,-21.8],[-66.25,-21.83],[-66.28,-21.95],[-66.32,-22.05],[-66.37,-22.11],[-66.51,-22.16],[-66.64,-22.21],[-66.71,-22.22],[-66.75,-22.27],[-66.77,-22.34],[-66.8,-22.41],[-66.99,-22.51],[-67.03,-22.55],[-67.06,-22.65],[-67.16,-22.77],[-67.19,-22.82],[-67.36,-22.86],[-67.58,-22.89],[-67.71,-22.89],[-67.79,-22.88],[-67.82,-22.86],[-67.88,-22.82],[-67.89,-22.78],[-67.89,-22.73],[-67.87,-22.63],[-67.88,-22.49],[-67.95,-22.33],[-67.94,-22.28],[-67.95,-22.2],[-67.99,-22.06],[-68.08,-21.98],[-68.1,-21.86],[-68.11,-21.75],[-68.19,-21.62],[-68.2,-21.45],[-68.2,-21.3],[-68.31,-21.13],[-68.44,-20.95],[-68.53,-20.92],[-68.56,-20.9],[-68.57,-20.85],[-68.57,-20.77],[-68.56,-20.72],[-68.49,-20.64],[-68.48,-20.63],[-68.5,-20.61],[-68.7,-20.49],[-68.75,-20.46],[-68.76,-20.42],[-68.76,-20.38],[-68.71,-20.34],[-68.69,-20.31],[-68.73,-20.23],[-68.73,-20.15],[-68.76,-20.12],[-68.76,-20.09],[-68.73,-20.07],[-68.6,-20.04],[-68.56,-19.97],[-68.56,-19.9],[-68.58,-19.86],[-68.7,-19.74],[-68.7,-19.72],[-68.58,-19.56],[-68.49,-19.45],[-68.46,-19.43],[-68.47,-19.41],[-68.49,-19.38],[-68.55,-19.34],[-68.62,-19.3],[-68.68,-19.24],[-68.76,-19.16],[-68.86,-19.09],[-68.93,-19.03],[-68.97,-18.97],[-68.97,-18.91],[-68.98,-18.81],[-69.03,-18.66],[-69.04,-18.55],[-69.06,-18.43],[-69.08,-18.36],[-69.09,-18.28],[-69.13,-18.2],[-69.15,-18.14],[-69.12,-18.1],[-69.09,-18.07],[-69.09,-18.05],[-69.28,-17.96],[-69.31,-17.94],[-69.36,-17.77],[-69.5,-17.62],[-69.51,-17.51],[-69.51,-17.5],[-69.51,-17.46],[-69.52,-17.39],[-69.56,-17.33],[-69.63,-17.29],[-69.65,-17.25],[-69.62,-17.2],[-69.5,-17.1],[-69.44,-17.09],[-69.42,-17.04],[-69.38,-17.0],[-69.27,-16.86],[-69.2,-16.77],[-69.13,-16.71],[-69.05,-16.67],[-69.02,-16.64],[-69.04,-16.54],[-69.03,-16.48],[-69.01,-16.43],[-68.93,-16.39],[-68.86,-16.35],[-68.84,-16.34],[-68.85,-16.31],[-68.91,-16.26],[-69.05,-16.22],[-69.13,-16.22],[-69.19,-16.18],[-69.22,-16.15],[-69.39,-15.74],[-69.42,-15.64],[-69.42,-15.6],[-69.3,-15.4],[-69.25,-15.33],[-69.17,-15.24],[-69.19,-15.2],[-69.33,-15.04],[-69.37,-14.96],[-69.37,-14.89],[-69.36,-14.8],[-69.28,-14.75],[-69.25,-14.67],[-69.23,-14.6],[-69.2,-14.57],[-69.16,-14.53],[-69.12,-14.47],[-69.05,-14.42],[-69.01,-14.38],[-69.0,-14.27],[-68.97,-14.23],[-68.88,-14.2],[-68.87,-14.17],[-68.89,-14.09],[-68.94,-14.01],[-68.97,-13.98],[-69.02,-13.78],[-69.07,-13.68],[-69.05,-13.64],[-69.02,-13.59],[-68.98,-13.5],[-68.97,-13.38],[-68.98,-12.96],[-68.98,-12.88],[-68.93,-12.82],[-68.87,-12.76],[-68.81,-12.73],[-68.76,-12.69],[-68.76,-12.61],[-68.73,-12.56],[-68.69,-12.5],[-68.82,-12.27],[-68.94,-12.07],[-69.05,-11.88],[-69.17,-11.65],[-69.26,-11.51],[-69.36,-11.33],[-69.45,-11.17],[-69.58,-10.95],[-69.46,-10.95],[-69.23,-10.96],[-69.0,-10.99],[-68.85,-11.01],[-68.78,-11.04],[-68.77,-11.1],[-68.73,-11.12],[-68.68,-11.11],[-68.62,-11.11],[-68.5,-11.05],[-68.4,-11.02],[-68.31,-10.98],[-68.27,-10.93],[-68.16,-10.79],[-68.07,-10.7],[-67.99,-10.67],[-67.84,-10.66],[-67.79,-10.69],[-67.72,-10.68],[-67.67,-10.6],[-67.58,-10.51],[-67.42,-10.39],[-67.33,-10.36],[-67.28,-10.32],[-67.19,-10.31],[-67.11,-10.27],[-66.73,-9.98],[-66.58,-9.9],[-66.48,-9.89],[-66.4,-9.87],[-66.26,-9.83],[-65.92,-9.79],[-65.71,-9.77],[-65.64,-9.81],[-65.56,-9.8],[-65.49,-9.73],[-65.44,-9.71],[-65.4,-9.71],[-65.34,-9.79],[-65.31,-9.87],[-65.33,-9.94],[-65.32,-10.03],[-65.3,-10.15],[-65.31,-10.25],[-65.4,-10.39],[-65.44,-10.45],[-65.45,-10.51],[-65.44,-10.59],[-65.4,-10.71],[-65.33,-10.89],[-65.32,-11.02],[-65.37,-11.11],[-65.39,-11.18],[-65.39,-11.25],[-65.37,-11.29],[-65.34,-11.32],[-65.33,-11.36],[-65.32,-11.44],[-65.28,-11.51],[-65.21,-11.58],[-65.18,-11.65],[-65.19,-11.71],[-65.19,-11.75],[-65.16,-11.77],[-65.14,-11.75],[-65.12,-11.74],[-65.09,-11.74],[-65.04,-11.83],[-65.03,-11.85],[-65.0,-11.92],[-64.99,-11.98],[-64.91,-12.01],[-64.83,-12.03],[-64.78,-12.06],[-64.69,-12.15],[-64.61,-12.2],[-64.51,-12.25],[-64.48,-12.33],[-64.42,-12.44],[-64.26,-12.48],[-64.06,-12.51],[-63.94,-12.53],[-63.79,-12.47],[-63.69,-12.48],[-63.59,-12.52],[-63.54,-12.55],[-63.47,-12.61],[-63.35,-12.68],[-63.25,-12.71],[-63.18,-12.67],[-63.12,-12.65],[-63.07,-12.67],[-63.04,-12.75],[-63.02,-12.81],[-62.96,-12.85],[-62.84,-12.95],[-62.77,-13.0],[-62.69,-12.99],[-62.53,-13.06],[-62.35,-13.13],[-62.26,-13.14],[-62.18,-13.13],[-62.12,-13.16],[-62.09,-13.24],[-61.94,-13.41],[-61.87,-13.47],[-61.79,-13.53],[-61.58,-13.52],[-61.51,-13.54],[-61.42,-13.53],[-61.13,-13.5],[-61.08,-13.49],[-60.91,-13.56],[-60.72,-13.66],[-60.6,-13.75],[-60.51,-13.79],[-60.46,-13.86],[-60.42,-13.94],[-60.4,-14.02],[-60.43,-14.1],[-60.46,-14.13],[-60.47,-14.18],[-60.46,-14.26],[-60.4,-14.33],[-60.37,-14.42],[-60.34,-14.57],[-60.3,-14.62],[-60.27,-15.09],[-60.4,-15.09],[-60.58,-15.1],[-60.53,-15.14],[-60.38,-15.32],[-60.24,-15.48],[-60.22,-15.74],[-60.21,-15.9],[-60.19,-16.13],[-60.18,-16.27],[-59.83,-16.28],[-59.43,-16.3],[-58.96,-16.31],[-58.54,-16.33],[-58.5,-16.33],[-58.42,-16.31],[-58.38,-16.28],[-58.35,-16.28],[-58.34,-16.34],[-58.35,-16.41],[-58.35,-16.49],[-58.47,-16.65],[-58.48,-16.7],[-58.46,-16.91],[-58.42,-17.08],[-58.4,-17.23],[-58.35,-17.28],[-58.21,-17.36],[-57.99,-17.51],[-57.91,-17.53],[-57.83,-17.51],[-57.79,-17.57],[-57.78,-17.67],[-57.66,-17.95],[-57.59,-18.12],[-57.55,-18.18],[-57.5,-18.21],[-57.51,-18.24],[-57.55,-18.25],[-57.57,-18.28],[-57.64,-18.48],[-57.72,-18.73],[-57.78,-18.91],[-57.73,-18.92],[-57.73,-18.97],[-57.72,-19.04],[-57.78,-19.05],[-57.8,-19.08],[-57.87,-19.23],[-57.97,-19.42],[-58.07,-19.63],[-58.13,-19.74],[-58.03,-19.83],[-57.86,-19.98],[-57.89,-20.02],[-57.96,-20.04],[-58.02,-20.06],[-58.07,-20.11],[-58.09,-20.15],[-58.16,-20.16],[-58.14,-20.0],[-58.16,-19.85],[-58.18,-19.82],[-58.47,-19.65],[-58.74,-19.49],[-59.09,-19.29],[-59.54,-19.29],[-60.01,-19.3],[-60.45,-19.39],[-60.89,-19.48],[-61.1,-19.52],[-61.51,-19.61],[-61.76,-19.65],[-61.82,-19.81],[-61.92,-20.06],[-62.01,-20.2],[-62.12,-20.35],[-62.28,-20.56],[-62.28,-20.82],[-62.28,-21.07],[-62.39,-21.41],[-62.48,-21.71],[-62.57,-21.99],[-62.63,-22.18],[-62.65,-22.23]]]},{"n":"Brazil","r":[[[-57.61,-30.19],[-57.56,-30.14],[-57.41,-30.03],[-57.32,-29.94],[-57.3,-29.86],[-57.22,-29.78],[-57.09,-29.72],[-56.94,-29.59],[-56.77,-29.42],[-56.67,-29.29],[-56.64,-29.2],[-56.57,-29.14],[-56.48,-29.09],[-56.39,-29.0],[-56.32,-28.85],[-56.23,-28.74],[-56.1,-28.65],[-56.03,-28.58],[-56.02,-28.52],[-55.98,-28.49],[-55.93,-28.47],[-55.9,-28.44],[-55.91,-28.4],[-55.89,-28.37],[-55.86,-28.35],[-55.81,-28.36],[-55.73,-28.39],[-55.69,-28.38],[-55.67,-28.34],[-55.69,-28.3],[-55.75,-28.26],[-55.73,-28.2],[-55.58,-28.12],[-55.48,-28.09],[-55.41,-28.04],[-55.35,-27.96],[-55.24,-27.9],[-55.1,-27.87],[-55.06,-27.84],[-55.07,-27.8],[-55.04,-27.77],[-54.96,-27.75],[-54.91,-27.71],[-54.9,-27.65],[-54.88,-27.6],[-54.83,-27.55],[-54.78,-27.53],[-54.72,-27.54],[-54.67,-27.53],[-54.62,-27.48],[-54.55,-27.45],[-54.48,-27.46],[-54.45,-27.45],[-54.33,-27.42],[-54.26,-27.38],[-54.21,-27.29],[-54.16,-27.25],[-54.11,-27.27],[-54.04,-27.24],[-53.94,-27.16],[-53.92,-27.16],[-53.84,-27.12],[-53.76,-26.98],[-53.72,-26.88],[-53.73,-26.8],[-53.75,-26.75],[-53.74,-26.67],[-53.72,-26.44],[-53.71,-26.35],[-53.67,-26.29],[-53.67,-26.23],[-53.75,-26.08],[-53.82,-25.96],[-53.86,-25.75],[-53.89,-25.67],[-53.95,-25.65],[-54.01,-25.58],[-54.09,-25.57],[-54.12,-25.55],[-54.15,-25.52],[-54.21,-25.53],[-54.25,-25.57],[-54.33,-25.57],[-54.38,-25.59],[-54.44,-25.62],[-54.5,-25.61],[-54.54,-25.58],[-54.62,-25.58],[-54.61,-25.43],[-54.47,-25.22],[-54.44,-25.12],[-54.45,-25.07],[-54.41,-24.87],[-54.31,-24.53],[-54.28,-24.31],[-54.32,-24.2],[-54.32,-24.13],[-54.27,-24.07],[-54.24,-24.05],[-54.37,-23.97],[-54.44,-23.9],[-54.53,-23.85],[-54.63,-23.81],[-54.67,-23.83],[-54.72,-23.85],[-54.82,-23.89],[-54.93,-23.95],[-54.98,-23.97],[-55.08,-24.0],[-55.19,-24.02],[-55.29,-24.0],[-55.37,-23.99],[-55.42,-23.95],[-55.44,-23.87],[-55.44,-23.79],[-55.46,-23.69],[-55.52,-23.63],[-55.54,-23.58],[-55.54,-23.52],[-55.53,-23.46],[-55.52,-23.42],[-55.53,-23.36],[-55.55,-23.32],[-55.55,-23.25],[-55.56,-23.15],[-55.6,-23.09],[-55.62,-23.03],[-55.62,-22.96],[-55.65,-22.89],[-55.65,-22.81],[-55.63,-22.74],[-55.62,-22.67],[-55.65,-22.62],[-55.7,-22.59],[-55.75,-22.51],[-55.75,-22.41],[-55.8,-22.35],[-55.85,-22.31],[-55.91,-22.31],[-55.99,-22.28],[-56.07,-22.28],[-56.19,-22.28],[-56.25,-22.26],[-56.28,-22.23],[-56.35,-22.18],[-56.39,-22.09],[-56.45,-22.08],[-56.52,-22.1],[-56.55,-22.14],[-56.58,-22.18],[-56.63,-22.23],[-56.7,-22.23],[-56.78,-22.26],[-56.84,-22.26],[-56.94,-22.27],[-57.03,-22.24],[-57.14,-22.22],[-57.24,-22.2],[-57.33,-22.22],[-57.39,-22.2],[-57.48,-22.19],[-57.57,-22.18],[-57.64,-22.13],[-57.72,-22.1],[-57.76,-22.11],[-57.82,-22.14],[-57.88,-22.14],[-57.96,-22.11],[-57.99,-22.05],[-57.98,-22.01],[-57.96,-21.97],[-57.93,-21.91],[-57.95,-21.85],[-57.94,-21.8],[-57.93,-21.75],[-57.92,-21.7],[-57.93,-21.65],[-57.93,-21.6],[-57.94,-21.55],[-57.95,-21.49],[-57.91,-21.42],[-57.87,-21.36],[-57.89,-21.3],[-57.89,-21.27],[-57.86,-21.21],[-57.83,-21.13],[-57.83,-21.0],[-57.86,-20.92],[-57.89,-20.9],[-57.9,-20.87],[-57.88,-20.84],[-57.9,-20.81],[-57.91,-20.78],[-57.89,-20.75],[-57.92,-20.69],[-57.96,-20.67],[-57.98,-20.66],[-58.0,-20.59],[-58.01,-20.52],[-58.0,-20.47],[-58.03,-20.42],[-58.06,-20.39],[-58.09,-20.33],[-58.12,-20.29],[-58.14,-20.24],[-58.16,-20.16],[-58.09,-20.15],[-58.07,-20.11],[-58.02,-20.06],[-57.96,-20.04],[-57.89,-20.02],[-57.86,-19.98],[-58.03,-19.83],[-58.13,-19.74],[-58.07,-19.63],[-57.97,-19.42],[-57.87,-19.23],[-57.8,-19.08],[-57.78,-19.05],[-57.72,-19.04],[-57.73,-18.97],[-57.73,-18.92],[-57.78,-18.91],[-57.72,-18.73],[-57.64,-18.48],[-57.57,-18.28],[-57.55,-18.25],[-57.51,-18.24],[-57.5,-18.21],[-57.55,-18.18],[-57.59,-18.12],[-57.66,-17.95],[-57.78,-17.67],[-57.79,-17.57],[-57.83,-17.51],[-57.91,-17.53],[-57.99,-17.51],[-58.21,-17.36],[-58.35,-17.28],[-58.4,-17.23],[-58.42,-17.08],[-58.46,-16.91],[-58.48,-16.7],[-58.47,-16.65],[-58.35,-16.49],[-58.35,-16.41],[-58.34,-16.34],[-58.35,-16.28],[-58.38,-16.28],[-58.42,-16.31],[-58.5,-16.33],[-58.54,-16.33],[-58.96,-16.31],[-59.43,-16.3],[-59.83,-16.28],[-60.18,-16.27],[-60.19,-16.13],[-60.21,-15.9],[-60.22,-15.74],[-60.24,-15.48],[-60.38,-15.32],[-60.53,-15.14],[-60.58,-15.1],[-60.4,-15.09],[-60.27,-15.09],[-60.3,-14.62],[-60.34,-14.57],[-60.37,-14.42],[-60.4,-14.33],[-60.46,-14.26],[-60.47,-14.18],[-60.46,-14.13],[-60.43,-14.1],[-60.4,-14.02],[-60.42,-13.94],[-60.46,-13.86],[-60.51,-13.79],[-60.6,-13.75],[-60.72,-13.66],[-60.91,-13.56],[-61.08,-13.49],[-61.13,-13.5],[-61.42,-13.53],[-61.51,-13.54],[-61.58,-13.52],[-61.79,-13.53],[-61.87,-13.47],[-61.94,-13.41],[-62.09,-13.24],[-62.12,-13.16],[-62.18,-13.13],[-62.26,-13.14],[-62.35,-13.13],[-62.53,-13.06],[-62.69,-12.99],[-62.77,-13.0],[-62.84,-12.95],[-62.96,-12.85],[-63.02,-12.81],[-63.04,-12.75],[-63.07,-12.67],[-63.12,-12.65],[-63.18,-12.67],[-63.25,-12.71],[-63.35,-12.68],[-63.47,-12.61],[-63.54,-12.55],[-63.59,-12.52],[-63.69,-12.48],[-63.79,-12.47],[-63.94,-12.53],[-64.06,-12.51],[-64.26,-12.48],[-64.42,-12.44],[-64.48,-12.33],[-64.51,-12.25],[-64.61,-12.2],[-64.69,-12.15],[-64.78,-12.06],[-64.83,-12.03],[-64.91,-12.01],[-64.99,-11.98],[-65.0,-11.92],[-65.03,-11.85],[-65.04,-11.83],[-65.09,-11.74],[-65.12,-11.74],[-65.14,-11.75],[-65.16,-11.77],[-65.19,-11.75],[-65.19,-11.71],[-65.18,-11.65],[-65.21,-11.58],[-65.28,-11.51],[-65.32,-11.44],[-65.33,-11.36],[-65.34,-11.32],[-65.37,-11.29],[-65.39,-11.25],[-65.39,-11.18],[-65.37,-11.11],[-65.32,-11.02],[-65.33,-10.89],[-65.4,-10.71],[-65.44,-10.59],[-65.45,-10.51],[-65.44,-10.45],[-65.4,-10.39],[-65.31,-10.25],[-65.3,-10.15],[-65.32,-10.03],[-65.33,-9.94],[-65.31,-9.87],[-65.34,-9.79],[-65.4,-9.71],[-65.44,-9.71],[-65.49,-9.73],[-65.56,-9.8],[-65.64,-9.81],[-65.71,-9.77],[-65.92,-9.79],[-66.26,-9.83],[-66.4,-9.87],[-66.48,-9.89],[-66.58,-9.9],[-66.73,-9.98],[-67.11,-10.27],[-67.19,-10.31],[-67.28,-10.32],[-67.33,-10.36],[-67.42,-10.39],[-67.58,-10.51],[-67.67,-10.6],[-67.72,-10.68],[-67.79,-10.69],[-67.84,-10.66],[-67.99,-10.67],[-68.07,-10.7],[-68.16,-10.79],[-68.27,-10.93],[-68.31,-10.98],[-68.4,-11.02],[-68.5,-11.05],[-68.62,-11.11],[-68.68,-11.11],[-68.73,-11.12],[-68.77,-11.1],[-68.78,-11.04],[-68.85,-11.01],[-69.0,-10.99],[-69.23,-10.96],[-69.46,-10.95],[-69.58,-10.95],[-69.67,-10.95],[-69.84,-10.93],[-69.96,-10.93],[-70.07,-10.98],[-70.22,-11.05],[-70.29,-11.06],[-70.34,-11.07],[-70.39,-11.06],[-70.45,-11.02],[-70.53,-10.95],[-70.6,-10.98],[-70.64,-11.01],[-70.64,-10.84],[-70.64,-10.59],[-70.64,-10.36],[-70.64,-10.18],[-70.64,-9.97],[-70.64,-9.82],[-70.59,-9.77],[-70.57,-9.7],[-70.6,-9.62],[-70.59,-9.54],[-70.57,-9.49],[-70.54,-9.44],[-70.61,-9.46],[-70.64,-9.48],[-70.67,-9.52],[-70.76,-9.57],[-70.82,-9.63],[-70.88,-9.67],[-70.97,-9.77],[-71.04,-9.82],[-71.12,-9.85],[-71.24,-9.97],[-71.34,-9.99],[-71.61,-10.01],[-71.89,-10.01],[-72.14,-10.01],[-72.18,-10.0],[-72.18,-9.91],[-72.17,-9.84],[-72.26,-9.77],[-72.27,-9.69],[-72.29,-9.63],[-72.32,-9.56],[-72.38,-9.51],[-72.46,-9.49],[-72.61,-9.45],[-72.81,-9.41],[-73.01,-9.41],[-73.21,-9.41],[-73.09,-9.27],[-72.97,-9.12],[-72.97,-8.99],[-73.07,-8.88],[-73.12,-8.81],[-73.2,-8.72],[-73.3,-8.65],[-73.36,-8.57],[-73.35,-8.51],[-73.36,-8.48],[-73.4,-8.46],[-73.44,-8.43],[-73.49,-8.39],[-73.55,-8.35],[-73.55,-8.3],[-73.57,-8.25],[-73.61,-8.19],[-73.61,-8.15],[-73.64,-8.07],[-73.68,-8.02],[-73.72,-7.99],[-73.78,-7.94],[-73.77,-7.9],[-73.73,-7.88],[-73.71,-7.83],[-73.72,-7.78],[-73.77,-7.75],[-73.82,-7.74],[-73.89,-7.65],[-73.95,-7.61],[-73.98,-7.59],[-74.0,-7.56],[-73.98,-7.54],[-73.96,-7.51],[-73.95,-7.46],[-73.96,-7.42],[-73.96,-7.38],[-73.93,-7.37],[-73.89,-7.37],[-73.85,-7.35],[-73.8,-7.34],[-73.75,-7.34],[-73.72,-7.31],[-73.72,-7.26],[-73.76,-7.17],[-73.79,-7.14],[-73.8,-7.08],[-73.78,-6.97],[-73.76,-6.91],[-73.69,-6.83],[-73.5,-6.68],[-73.33,-6.57],[-73.24,-6.56],[-73.18,-6.53],[-73.14,-6.47],[-73.13,-6.4],[-73.14,-6.34],[-73.17,-6.26],[-73.21,-6.16],[-73.24,-6.1],[-73.21,-6.03],[-73.16,-5.93],[-73.07,-5.79],[-72.98,-5.63],[-72.97,-5.59],[-72.96,-5.5],[-72.92,-5.3],[-72.9,-5.2],[-72.91,-5.16],[-72.89,-5.12],[-72.83,-5.09],[-72.7,-5.07],[-72.61,-5.01],[-72.47,-4.9],[-72.35,-4.79],[-72.26,-4.75],[-72.08,-4.64],[-71.98,-4.57],[-71.94,-4.55],[-71.84,-4.5],[-71.67,-4.49],[-71.52,-4.47],[-71.44,-4.44],[-71.32,-4.42],[-71.24,-4.39],[-71.14,-4.39],[-70.97,-4.35],[-70.92,-4.3],[-70.87,-4.23],[-70.8,-4.17],[-70.72,-4.16],[-70.63,-4.17],[-70.53,-4.17],[-70.4,-4.15],[-70.34,-4.19],[-70.32,-4.25],[-70.24,-4.3],[-70.18,-4.3],[-70.13,-4.29],[-70.05,-4.33],[-70.0,-4.33],[-69.97,-4.3],[-69.97,-4.24],[-69.95,-4.2],[-69.91,-4.0],[-69.85,-3.66],[-69.79,-3.35],[-69.73,-3.02],[-69.67,-2.67],[-69.6,-2.31],[-69.55,-2.02],[-69.51,-1.77],[-69.48,-1.62],[-69.43,-1.42],[-69.42,-1.25],[-69.4,-1.19],[-69.41,-1.15],[-69.45,-1.09],[-69.45,-1.06],[-69.44,-1.03],[-69.45,-1.0],[-69.49,-0.97],[-69.52,-0.95],[-69.54,-0.92],[-69.55,-0.88],[-69.57,-0.84],[-69.58,-0.8],[-69.61,-0.76],[-69.62,-0.72],[-69.6,-0.68],[-69.59,-0.64],[-69.6,-0.6],[-69.61,-0.55],[-69.63,-0.51],[-69.67,-0.48],[-69.75,-0.45],[-69.83,-0.38],[-69.92,-0.32],[-70.04,-0.2],[-70.07,-0.14],[-70.07,0.02],[-70.07,0.19],[-70.06,0.45],[-70.05,0.58],[-69.99,0.59],[-69.93,0.59],[-69.86,0.6],[-69.81,0.61],[-69.76,0.63],[-69.72,0.65],[-69.67,0.67],[-69.64,0.66],[-69.6,0.68],[-69.56,0.7],[-69.53,0.72],[-69.47,0.73],[-69.42,0.7],[-69.39,0.67],[-69.36,0.65],[-69.33,0.66],[-69.31,0.65],[-69.28,0.63],[-69.25,0.63],[-69.21,0.63],[-69.17,0.64],[-69.16,0.64],[-69.15,0.66],[-69.16,0.69],[-69.18,0.71],[-69.17,0.75],[-69.17,0.8],[-69.16,0.86],[-69.19,0.9],[-69.22,0.96],[-69.26,1.02],[-69.31,1.05],[-69.36,1.06],[-69.4,1.04],[-69.44,1.04],[-69.47,1.06],[-69.52,1.06],[-69.57,1.07],[-69.62,1.07],[-69.72,1.06],[-69.75,1.08],[-69.8,1.08],[-69.85,1.06],[-69.85,1.31],[-69.85,1.54],[-69.85,1.71],[-69.8,1.71],[-69.74,1.73],[-69.65,1.74],[-69.58,1.77],[-69.54,1.77],[-69.47,1.76],[-69.39,1.73],[-69.32,1.72],[-69.12,1.72],[-68.91,1.72],[-68.68,1.72],[-68.44,1.72],[-68.24,1.72],[-68.18,1.72],[-68.21,1.77],[-68.26,1.85],[-68.24,1.9],[-68.22,1.96],[-68.19,1.99],[-68.13,1.96],[-68.08,1.86],[-68.03,1.79],[-67.99,1.75],[-67.94,1.75],[-67.88,1.76],[-67.82,1.79],[-67.71,1.92],[-67.61,2.04],[-67.56,2.07],[-67.5,2.11],[-67.46,2.12],[-67.4,2.12],[-67.35,2.09],[-67.32,2.03],[-67.21,1.84],[-67.12,1.7],[-67.09,1.62],[-67.09,1.4],[-67.09,1.21],[-67.08,1.19],[-67.07,1.18],[-66.88,1.22],[-66.62,0.99],[-66.43,0.82],[-66.35,0.77],[-66.3,0.75],[-66.19,0.76],[-66.06,0.79],[-66.0,0.81],[-65.93,0.86],[-65.81,0.94],[-65.72,0.98],[-65.68,0.98],[-65.64,0.97],[-65.57,0.93],[-65.52,0.84],[-65.56,0.75],[-65.56,0.69],[-65.47,0.69],[-65.41,0.79],[-65.36,0.87],[-65.26,0.93],[-65.17,1.02],[-65.1,1.11],[-65.03,1.16],[-64.91,1.22],[-64.82,1.26],[-64.73,1.25],[-64.67,1.29],[-64.58,1.37],[-64.53,1.43],[-64.49,1.45],[-64.41,1.45],[-64.3,1.46],[-64.21,1.53],[-64.11,1.62],[-64.07,1.77],[-64.04,1.9],[-64.01,1.93],[-63.98,1.95],[-63.94,1.97],[-63.84,1.98],[-63.68,2.05],[-63.57,2.12],[-63.46,2.14],[-63.43,2.16],[-63.39,2.22],[-63.37,2.34],[-63.39,2.41],[-63.58,2.43],[-63.71,2.43],[-63.92,2.45],[-64.02,2.48],[-64.05,2.5],[-64.05,2.53],[-64.03,2.58],[-64.01,2.67],[-64.04,2.8],[-64.14,3.0],[-64.22,3.2],[-64.23,3.34],[-64.23,3.49],[-64.22,3.59],[-64.28,3.66],[-64.57,3.9],[-64.67,4.01],[-64.7,4.09],[-64.82,4.23],[-64.79,4.28],[-64.72,4.27],[-64.67,4.24],[-64.61,4.16],[-64.58,4.14],[-64.53,4.14],[-64.26,4.14],[-64.19,4.13],[-64.15,4.1],[-64.12,4.07],[-64.07,3.97],[-64.02,3.93],[-63.91,3.93],[-63.75,3.93],[-63.65,3.94],[-63.6,3.92],[-63.53,3.89],[-63.38,3.94],[-63.34,3.94],[-63.29,3.92],[-63.14,3.76],[-63.05,3.69],[-62.97,3.59],[-62.86,3.59],[-62.76,3.67],[-62.74,3.94],[-62.71,4.02],[-62.67,4.04],[-62.61,4.04],[-62.54,4.08],[-62.47,4.14],[-62.41,4.16],[-62.15,4.1],[-62.08,4.13],[-61.82,4.2],[-61.55,4.29],[-61.48,4.4],[-61.37,4.43],[-61.28,4.52],[-61.21,4.51],[-61.1,4.5],[-61.04,4.52],[-61.0,4.54],[-60.97,4.57],[-60.91,4.69],[-60.83,4.73],[-60.74,4.77],[-60.68,4.83],[-60.63,4.89],[-60.6,4.95],[-60.6,4.99],[-60.64,5.08],[-60.67,5.16],[-60.71,5.19],[-60.74,5.2],[-60.65,5.22],[-60.58,5.19],[-60.46,5.19],[-60.41,5.21],[-60.34,5.2],[-60.24,5.26],[-60.18,5.24],[-60.14,5.24],[-60.11,5.19],[-60.08,5.14],[-59.99,5.08],[-60.0,4.99],[-60.02,4.91],[-60.03,4.81],[-60.03,4.74],[-60.07,4.67],[-60.12,4.6],[-60.14,4.57],[-60.15,4.53],[-60.11,4.51],[-60.05,4.5],[-59.96,4.5],[-59.91,4.48],[-59.83,4.48],[-59.75,4.42],[-59.7,4.38],[-59.7,4.35],[-59.73,4.29],[-59.74,4.23],[-59.72,4.19],[-59.69,4.16],[-59.62,4.02],[-59.59,3.98],[-59.56,3.96],[-59.55,3.93],[-59.58,3.88],[-59.6,3.82],[-59.67,3.75],[-59.68,3.7],[-59.73,3.67],[-59.85,3.59],[-59.83,3.46],[-59.83,3.4],[-59.83,3.35],[-59.87,3.28],[-59.95,3.09],[-59.97,2.99],[-60.0,2.77],[-59.99,2.69],[-59.96,2.59],[-59.89,2.36],[-59.85,2.33],[-59.76,2.27],[-59.74,2.12],[-59.75,1.96],[-59.76,1.9],[-59.74,1.87],[-59.7,1.86],[-59.67,1.84],[-59.66,1.8],[-59.67,1.75],[-59.6,1.72],[-59.54,1.7],[-59.48,1.63],[-59.38,1.53],[-59.34,1.51],[-59.32,1.46],[-59.23,1.38],[-59.1,1.34],[-58.97,1.3],[-58.92,1.25],[-58.86,1.2],[-58.82,1.2],[-58.79,1.21],[-58.73,1.25],[-58.68,1.28],[-58.61,1.28],[-58.51,1.28],[-58.5,1.31],[-58.49,1.35],[-58.51,1.44],[-58.47,1.47],[-58.4,1.48],[-58.38,1.53],[-58.36,1.56],[-58.34,1.59],[-58.31,1.59],[-58.28,1.57],[-58.23,1.56],[-58.17,1.55],[-58.14,1.52],[-58.09,1.51],[-58.03,1.52],[-58.01,1.54],[-58.0,1.57],[-57.98,1.65],[-57.95,1.65],[-57.87,1.67],[-57.8,1.7],[-57.69,1.7],[-57.59,1.7],[-57.55,1.73],[-57.5,1.77],[-57.41,1.91],[-57.37,1.94],[-57.32,1.96],[-57.28,1.96],[-57.19,1.98],[-57.12,2.01],[-57.09,2.01],[-57.04,1.94],[-57.01,1.92],[-56.97,1.92],[-56.84,1.88],[-56.77,1.89],[-56.69,1.91],[-56.62,1.92],[-56.56,1.91],[-56.53,1.93],[-56.48,1.94],[-56.45,1.93],[-56.39,1.92],[-56.23,1.89],[-56.02,1.84],[-55.96,1.86],[-55.93,1.89],[-55.92,1.98],[-55.92,2.04],[-55.96,2.1],[-56.02,2.16],[-56.07,2.24],[-56.14,2.26],[-56.13,2.3],[-56.09,2.34],[-56.05,2.36],[-56.02,2.39],[-55.99,2.5],[-55.98,2.52],[-55.96,2.52],[-55.94,2.52],[-55.89,2.49],[-55.73,2.41],[-55.66,2.42],[-55.39,2.44],[-55.34,2.49],[-55.29,2.5],[-55.19,2.55],[-55.15,2.55],[-55.11,2.54],[-55.07,2.55],[-55.01,2.59],[-54.98,2.6],[-54.97,2.55],[-54.93,2.5],[-54.88,2.45],[-54.85,2.44],[-54.77,2.45],[-54.72,2.44],[-54.7,2.4],[-54.7,2.36],[-54.66,2.33],[-54.62,2.33],[-54.59,2.31],[-54.55,2.29],[-54.52,2.25],[-54.43,2.21],[-54.29,2.15],[-54.23,2.15],[-54.17,2.14],[-54.13,2.12],[-54.09,2.15],[-53.95,2.23],[-53.88,2.28],[-53.83,2.31],[-53.79,2.35],[-53.77,2.35],[-53.75,2.34],[-53.73,2.31],[-53.68,2.29],[-53.56,2.26],[-53.51,2.25],[-53.43,2.28],[-53.37,2.32],[-53.33,2.34],[-53.29,2.3],[-53.25,2.23],[-53.23,2.2],[-53.18,2.21],[-53.08,2.2],[-53.01,2.18],[-52.96,2.18],[-52.9,2.21],[-52.87,2.27],[-52.78,2.32],[-52.7,2.36],[-52.65,2.43],[-52.58,2.53],[-52.56,2.57],[-52.55,2.65],[-52.46,2.86],[-52.42,2.9],[-52.4,2.97],[-52.36,3.05],[-52.36,3.12],[-52.33,3.18],[-52.27,3.24],[-52.23,3.27],[-52.16,3.36],[-52.12,3.45],[-52.0,3.65],[-51.99,3.7],[-51.94,3.74],[-51.93,3.78],[-51.88,3.83],[-51.83,3.87],[-51.81,3.93],[-51.77,3.99],[-51.68,4.04],[-51.65,4.06],[-51.56,4.23],[-51.55,4.31],[-51.46,4.31],[-51.33,4.22],[-51.22,4.09],[-51.08,3.67],[-51.05,3.28],[-50.99,3.08],[-50.83,2.65],[-50.82,2.57],[-50.79,2.48],[-50.74,2.38],[-50.68,2.21],[-50.68,2.18],[-50.71,2.13],[-50.66,2.13],[-50.61,2.1],[-50.58,2.0],[-50.53,1.93],[-50.46,1.83],[-50.3,1.8],[-50.19,1.79],[-50.05,1.73],[-49.96,1.66],[-49.88,1.42],[-49.91,1.27],[-49.9,1.16],[-49.94,1.12],[-50.05,1.05],[-50.07,1.02],[-50.29,0.84],[-50.34,0.75],[-50.46,0.64],[-50.58,0.42],[-50.76,0.22],[-50.82,0.17],[-50.91,0.16],[-50.97,0.13],[-51.1,-0.03],[-51.28,-0.09],[-51.3,-0.18],[-51.4,-0.39],[-51.5,-0.51],[-51.56,-0.55],[-51.7,-0.76],[-51.72,-0.86],[-51.72,-1.02],[-51.82,-1.12],[-51.92,-1.18],[-51.93,-1.32],[-51.98,-1.37],[-52.02,-1.4],[-52.23,-1.36],[-52.55,-1.51],[-52.66,-1.55],[-52.31,-1.56],[-52.2,-1.64],[-51.95,-1.59],[-51.65,-1.39],[-51.53,-1.35],[-51.3,-1.22],[-51.2,-1.14],[-51.03,-1.03],[-50.99,-0.99],[-50.89,-0.94],[-50.84,-1.0],[-50.84,-1.04],[-50.92,-1.12],[-50.9,-1.16],[-50.84,-1.23],[-50.83,-1.31],[-50.82,-1.38],[-50.79,-1.49],[-50.68,-1.64],[-50.68,-1.69],[-50.69,-1.76],[-50.64,-1.82],[-50.59,-1.85],[-50.4,-2.02],[-50.26,-1.92],[-50.17,-1.9],[-50.12,-1.86],[-50.0,-1.83],[-49.9,-1.87],[-49.72,-1.93],[-49.59,-1.87],[-49.31,-1.73],[-49.4,-1.97],[-49.46,-2.19],[-49.51,-2.28],[-49.55,-2.52],[-49.6,-2.58],[-49.64,-2.66],[-49.58,-2.63],[-49.52,-2.6],[-49.46,-2.5],[-49.41,-2.34],[-49.21,-1.92],[-49.15,-1.88],[-48.99,-1.83],[-48.71,-1.49],[-48.6,-1.49],[-48.53,-1.57],[-48.46,-1.61],[-48.45,-1.52],[-48.35,-1.48],[-48.45,-1.44],[-48.47,-1.39],[-48.48,-1.32],[-48.41,-1.23],[-48.45,-1.15],[-48.31,-1.04],[-48.32,-0.96],[-48.27,-0.9],[-48.2,-0.83],[-48.13,-0.8],[-48.12,-0.74],[-48.07,-0.71],[-48.03,-0.71],[-47.96,-0.77],[-47.88,-0.69],[-47.81,-0.66],[-47.77,-0.68],[-47.73,-0.71],[-47.69,-0.72],[-47.65,-0.72],[-47.56,-0.67],[-47.47,-0.75],[-47.42,-0.77],[-47.43,-0.72],[-47.46,-0.68],[-47.44,-0.65],[-47.4,-0.63],[-47.27,-0.65],[-47.2,-0.68],[-47.13,-0.75],[-47.02,-0.75],[-46.94,-0.74],[-46.89,-0.78],[-46.81,-0.78],[-46.77,-0.84],[-46.64,-0.92],[-46.62,-0.97],[-46.52,-1.0],[-46.42,-1.03],[-46.32,-1.04],[-46.22,-1.03],[-46.21,-1.1],[-46.14,-1.12],[-46.04,-1.1],[-45.97,-1.19],[-45.78,-1.25],[-45.64,-1.35],[-45.56,-1.33],[-45.46,-1.36],[-45.35,-1.57],[-45.33,-1.72],[-45.28,-1.7],[-45.24,-1.63],[-45.18,-1.51],[-45.08,-1.47],[-45.03,-1.51],[-44.92,-1.59],[-44.83,-1.67],[-44.79,-1.72],[-44.72,-1.73],[-44.78,-1.8],[-44.72,-1.79],[-44.65,-1.75],[-44.59,-1.84],[-44.55,-1.95],[-44.54,-2.05],[-44.58,-2.11],[-44.62,-2.15],[-44.66,-2.23],[-44.71,-2.24],[-44.76,-2.27],[-44.7,-2.32],[-44.66,-2.37],[-44.58,-2.23],[-44.52,-2.19],[-44.44,-2.17],[-44.39,-2.27],[-44.38,-2.37],[-44.52,-2.41],[-44.52,-2.48],[-44.56,-2.52],[-44.59,-2.57],[-44.61,-2.68],[-44.64,-2.76],[-44.72,-3.14],[-44.72,-3.2],[-44.62,-3.14],[-44.44,-2.94],[-44.38,-2.74],[-44.31,-2.54],[-44.23,-2.47],[-44.18,-2.47],[-44.11,-2.49],[-44.1,-2.56],[-44.11,-2.6],[-44.19,-2.7],[-44.23,-2.75],[-44.19,-2.81],[-44.01,-2.64],[-43.93,-2.58],[-43.86,-2.6],[-43.73,-2.52],[-43.46,-2.5],[-43.43,-2.41],[-43.38,-2.38],[-43.23,-2.39],[-42.94,-2.47],[-42.83,-2.53],[-42.68,-2.59],[-42.59,-2.66],[-42.25,-2.79],[-42.0,-2.81],[-41.88,-2.75],[-41.72,-2.81],[-41.64,-2.88],[-41.48,-2.92],[-41.32,-2.94],[-41.19,-2.89],[-40.88,-2.87],[-40.47,-2.8],[-40.24,-2.81],[-39.96,-2.86],[-39.77,-2.99],[-39.61,-3.06],[-39.51,-3.13],[-39.35,-3.2],[-39.01,-3.39],[-38.9,-3.5],[-38.69,-3.65],[-38.48,-3.72],[-38.36,-3.88],[-38.27,-3.95],[-38.05,-4.22],[-37.8,-4.4],[-37.63,-4.59],[-37.3,-4.71],[-37.17,-4.91],[-36.95,-4.94],[-36.86,-4.97],[-36.75,-5.05],[-36.59,-5.1],[-36.39,-5.08],[-36.16,-5.09],[-35.98,-5.05],[-35.55,-5.13],[-35.48,-5.17],[-35.39,-5.25],[-35.24,-5.57],[-35.14,-5.92],[-35.1,-6.19],[-34.99,-6.39],[-34.93,-6.79],[-34.88,-6.91],[-34.88,-7.0],[-34.83,-7.02],[-34.81,-7.29],[-34.82,-7.39],[-34.86,-7.53],[-34.86,-7.6],[-34.85,-7.63],[-34.87,-7.69],[-34.88,-7.75],[-34.84,-7.87],[-34.83,-7.97],[-34.89,-8.09],[-34.97,-8.41],[-35.16,-8.93],[-35.34,-9.23],[-35.6,-9.54],[-35.76,-9.7],[-35.83,-9.72],[-35.89,-9.69],[-35.85,-9.77],[-35.89,-9.85],[-36.05,-10.08],[-36.22,-10.23],[-36.4,-10.48],[-36.41,-10.49],[-36.64,-10.59],[-36.77,-10.67],[-36.94,-10.82],[-37.09,-11.05],[-37.13,-11.08],[-37.18,-11.07],[-37.18,-11.19],[-37.32,-11.38],[-37.36,-11.4],[-37.35,-11.35],[-37.33,-11.31],[-37.32,-11.27],[-37.32,-11.22],[-37.36,-11.25],[-37.44,-11.39],[-37.41,-11.5],[-37.47,-11.65],[-37.69,-12.1],[-37.96,-12.48],[-38.02,-12.59],[-38.24,-12.84],[-38.4,-12.97],[-38.45,-12.97],[-38.5,-12.96],[-38.52,-12.76],[-38.65,-12.64],[-38.69,-12.62],[-38.74,-12.75],[-38.79,-12.78],[-38.85,-12.79],[-38.78,-12.84],[-38.76,-12.91],[-38.83,-13.03],[-38.84,-13.15],[-38.96,-13.27],[-39.03,-13.37],[-39.07,-13.48],[-39.09,-13.59],[-39.03,-13.56],[-39.01,-13.58],[-38.99,-13.62],[-39.0,-13.66],[-39.04,-13.76],[-39.03,-13.99],[-39.05,-14.04],[-39.01,-14.1],[-38.97,-14.0],[-38.94,-14.03],[-39.06,-14.65],[-39.01,-14.94],[-39.0,-15.25],[-38.94,-15.56],[-38.89,-15.84],[-38.88,-15.86],[-38.96,-16.19],[-39.06,-16.5],[-39.13,-16.76],[-39.16,-17.04],[-39.2,-17.18],[-39.22,-17.32],[-39.17,-17.64],[-39.15,-17.7],[-39.28,-17.85],[-39.41,-17.92],[-39.49,-17.99],[-39.65,-18.25],[-39.74,-18.64],[-39.74,-18.85],[-39.7,-19.28],[-39.73,-19.45],[-39.78,-19.57],[-39.84,-19.65],[-40.0,-19.74],[-40.14,-19.97],[-40.2,-20.21],[-40.3,-20.29],[-40.32,-20.43],[-40.4,-20.57],[-40.6,-20.78],[-40.73,-20.85],[-40.79,-20.91],[-40.83,-21.03],[-40.95,-21.24],[-41.05,-21.51],[-41.02,-21.6],[-41.02,-21.61],[-40.99,-21.92],[-41.0,-22.0],[-41.12,-22.08],[-41.58,-22.24],[-41.71,-22.31],[-41.98,-22.58],[-42.0,-22.64],[-41.99,-22.74],[-41.94,-22.79],[-41.99,-22.85],[-42.04,-22.95],[-42.12,-22.94],[-42.58,-22.94],[-42.83,-22.97],[-42.96,-22.97],[-43.02,-22.94],[-43.08,-22.9],[-43.1,-22.85],[-43.07,-22.77],[-43.09,-22.72],[-43.15,-22.73],[-43.23,-22.75],[-43.24,-22.8],[-43.24,-22.83],[-43.21,-22.88],[-43.19,-22.94],[-43.22,-22.99],[-43.37,-23.0],[-43.53,-23.05],[-43.74,-23.07],[-43.9,-23.1],[-43.97,-23.06],[-43.9,-23.04],[-43.79,-23.05],[-43.68,-23.01],[-43.7,-22.97],[-43.87,-22.91],[-44.05,-22.94],[-44.15,-23.01],[-44.37,-23.0],[-44.64,-23.06],[-44.68,-23.11],[-44.67,-23.21],[-44.62,-23.23],[-44.57,-23.27],[-44.62,-23.32],[-44.67,-23.34],[-44.95,-23.38],[-45.22,-23.58],[-45.33,-23.6],[-45.42,-23.69],[-45.43,-23.76],[-45.46,-23.8],[-45.53,-23.8],[-45.66,-23.76],[-45.84,-23.76],[-45.97,-23.8],[-46.63,-24.11],[-46.87,-24.24],[-47.14,-24.49],[-47.59,-24.78],[-47.83,-24.95],[-47.88,-25.0],[-47.91,-25.0],[-47.99,-25.04],[-47.96,-25.07],[-47.91,-25.07],[-47.93,-25.17],[-48.02,-25.24],[-48.2,-25.42],[-48.24,-25.4],[-48.19,-25.31],[-48.27,-25.31],[-48.4,-25.27],[-48.46,-25.31],[-48.43,-25.4],[-48.48,-25.44],[-48.56,-25.45],[-48.64,-25.44],[-48.73,-25.37],[-48.69,-25.49],[-48.51,-25.52],[-48.43,-25.55],[-48.4,-25.6],[-48.55,-25.82],[-48.67,-25.84],[-48.68,-25.88],[-48.61,-25.88],[-48.58,-25.94],[-48.62,-26.18],[-48.68,-26.23],[-48.71,-26.23],[-48.75,-26.27],[-48.7,-26.35],[-48.65,-26.41],[-48.66,-26.52],[-48.68,-26.61],[-48.68,-26.7],[-48.62,-26.88],[-48.59,-27.06],[-48.57,-27.12],[-48.55,-27.2],[-48.6,-27.26],[-48.57,-27.37],[-48.64,-27.56],[-48.61,-27.83],[-48.62,-28.08],[-48.65,-28.21],[-48.69,-28.31],[-48.8,-28.44],[-48.8,-28.58],[-49.02,-28.7],[-49.27,-28.87],[-49.5,-29.08],[-49.75,-29.36],[-50.03,-29.8],[-50.3,-30.43],[-50.62,-30.9],[-50.75,-31.07],[-50.92,-31.26],[-51.15,-31.48],[-51.46,-31.7],[-51.8,-31.9],[-51.92,-31.99],[-52.04,-32.11],[-52.07,-32.06],[-52.04,-31.98],[-52.06,-31.91],[-52.06,-31.83],[-52.0,-31.82],[-51.89,-31.87],[-51.84,-31.83],[-51.8,-31.8],[-51.68,-31.77],[-51.45,-31.56],[-51.27,-31.48],[-51.17,-31.34],[-51.16,-31.27],[-51.16,-31.12],[-51.11,-31.08],[-50.98,-31.09],[-50.95,-31.05],[-50.97,-31.01],[-50.94,-30.9],[-50.77,-30.81],[-50.69,-30.7],[-50.72,-30.43],[-50.69,-30.41],[-50.61,-30.46],[-50.58,-30.44],[-50.55,-30.32],[-50.56,-30.25],[-50.65,-30.24],[-50.93,-30.37],[-51.02,-30.37],[-51.04,-30.26],[-51.18,-30.21],[-51.23,-30.12],[-51.25,-30.06],[-51.3,-30.03],[-51.3,-30.14],[-51.28,-30.24],[-51.16,-30.36],[-51.19,-30.41],[-51.25,-30.47],[-51.29,-30.59],[-51.28,-30.75],[-51.32,-30.7],[-51.36,-30.67],[-51.38,-30.85],[-51.46,-30.91],[-51.49,-30.98],[-51.46,-31.05],[-51.51,-31.1],[-51.72,-31.24],[-51.93,-31.34],[-51.97,-31.38],[-51.99,-31.49],[-52.03,-31.6],[-52.12,-31.69],[-52.19,-31.89],[-52.19,-31.97],[-52.17,-32.09],[-52.13,-32.17],[-52.19,-32.22],[-52.27,-32.32],[-52.34,-32.44],[-52.51,-32.88],[-52.65,-33.14],[-52.76,-33.27],[-52.92,-33.4],[-53.37,-33.74],[-53.4,-33.74],[-53.46,-33.71],[-53.52,-33.68],[-53.53,-33.66],[-53.54,-33.62],[-53.53,-33.5],[-53.53,-33.17],[-53.51,-33.11],[-53.48,-33.07],[-53.4,-33.01],[-53.31,-32.93],[-53.21,-32.82],[-53.13,-32.74],[-53.16,-32.68],[-53.23,-32.63],[-53.36,-32.58],[-53.49,-32.5],[-53.6,-32.4],[-53.65,-32.3],[-53.7,-32.19],[-53.75,-32.1],[-53.76,-32.06],[-53.81,-32.04],[-53.88,-31.99],[-53.92,-31.95],[-53.99,-31.93],[-54.1,-31.9],[-54.22,-31.86],[-54.37,-31.75],[-54.48,-31.62],[-54.53,-31.54],[-54.59,-31.49],[-54.9,-31.39],[-55.04,-31.28],[-55.09,-31.31],[-55.17,-31.28],[-55.25,-31.23],[-55.28,-31.18],[-55.31,-31.14],[-55.35,-31.09],[-55.37,-31.05],[-55.45,-30.96],[-55.56,-30.88],[-55.6,-30.85],[-55.63,-30.86],[-55.65,-30.89],[-55.67,-30.92],[-55.71,-30.95],[-55.76,-30.99],[-55.81,-31.04],[-55.87,-31.07],[-55.95,-31.08],[-56.0,-31.08],[-56.02,-31.06],[-56.02,-30.99],[-56.0,-30.84],[-56.04,-30.78],[-56.11,-30.71],[-56.18,-30.63],[-56.41,-30.45],[-56.72,-30.19],[-56.83,-30.11],[-56.94,-30.1],[-57.03,-30.11],[-57.12,-30.14],[-57.19,-30.26],[-57.21,-30.28],[-57.38,-30.28],[-57.55,-30.26],[-57.61,-30.19]],[[-48.49,-27.77],[-48.55,-27.81],[-48.54,-27.57],[-48.51,-27.5],[-48.46,-27.44],[-48.41,-27.4],[-48.38,-27.45],[-48.41,-27.57],[-48.5,-27.71],[-48.49,-27.77]],[[-48.58,-26.4],[-48.6,-26.41],[-48.67,-26.29],[-48.54,-26.17],[-48.5,-26.22],[-48.53,-26.31],[-48.57,-26.38],[-48.58,-26.4]],[[-45.26,-23.89],[-45.26,-23.94],[-45.3,-23.91],[-45.41,-23.93],[-45.45,-23.9],[-45.3,-23.73],[-45.27,-23.75],[-45.25,-23.78],[-45.23,-23.83],[-45.25,-23.85],[-45.26,-23.89]],[[-44.13,-23.14],[-44.1,-23.17],[-44.16,-23.17],[-44.22,-23.19],[-44.32,-23.21],[-44.36,-23.17],[-44.27,-23.12],[-44.24,-23.07],[-44.22,-23.08],[-44.19,-23.11],[-44.13,-23.14]],[[-38.9,-13.47],[-38.94,-13.53],[-38.98,-13.52],[-38.99,-13.48],[-39.02,-13.45],[-39.01,-13.42],[-38.98,-13.4],[-38.91,-13.4],[-38.9,-13.47]],[[-38.74,-13.1],[-38.78,-13.12],[-38.79,-13.06],[-38.68,-12.97],[-38.67,-12.88],[-38.61,-12.92],[-38.6,-12.97],[-38.6,-12.99],[-38.74,-13.1]],[[-44.5,-2.94],[-44.6,-3.04],[-44.57,-2.92],[-44.58,-2.85],[-44.57,-2.78],[-44.5,-2.73],[-44.48,-2.72],[-44.49,-2.79],[-44.48,-2.81],[-44.5,-2.94]],[[-44.88,-1.32],[-44.95,-1.37],[-44.97,-1.39],[-45.02,-1.37],[-45.01,-1.34],[-45.0,-1.35],[-44.98,-1.27],[-44.89,-1.28],[-44.88,-1.32]],[[-51.83,-1.43],[-51.94,-1.45],[-51.8,-1.2],[-51.68,-1.09],[-51.68,-0.86],[-51.55,-0.65],[-51.42,-0.57],[-51.25,-0.54],[-51.16,-0.67],[-51.28,-1.02],[-51.31,-1.02],[-51.47,-1.21],[-51.64,-1.34],[-51.83,-1.43]],[[-49.63,-0.23],[-49.54,-0.23],[-49.4,-0.21],[-49.31,-0.17],[-49.22,-0.16],[-49.12,-0.16],[-48.79,-0.22],[-48.59,-0.23],[-48.52,-0.25],[-48.44,-0.27],[-48.39,-0.3],[-48.38,-0.35],[-48.43,-0.44],[-48.46,-0.53],[-48.5,-0.66],[-48.52,-0.69],[-48.57,-0.68],[-48.54,-0.8],[-48.55,-0.85],[-48.57,-0.89],[-48.62,-0.99],[-48.7,-1.11],[-48.73,-1.13],[-48.79,-1.17],[-48.84,-1.23],[-48.83,-1.28],[-48.8,-1.33],[-48.83,-1.39],[-48.93,-1.48],[-48.99,-1.5],[-49.04,-1.51],[-49.09,-1.51],[-49.17,-1.41],[-49.18,-1.48],[-49.2,-1.56],[-49.23,-1.6],[-49.34,-1.6],[-49.41,-1.56],[-49.51,-1.51],[-49.53,-1.63],[-49.59,-1.71],[-49.65,-1.74],[-49.75,-1.76],[-49.81,-1.79],[-49.91,-1.76],[-50.01,-1.71],[-50.07,-1.7],[-50.11,-1.75],[-50.34,-1.76],[-50.44,-1.8],[-50.51,-1.79],[-50.6,-1.7],[-50.62,-1.64],[-50.67,-1.52],[-50.72,-1.37],[-50.76,-1.24],[-50.73,-1.13],[-50.67,-1.13],[-50.6,-1.15],[-50.58,-1.14],[-50.58,-1.1],[-50.59,-1.07],[-50.71,-1.08],[-50.78,-1.01],[-50.8,-0.91],[-50.78,-0.69],[-50.77,-0.65],[-50.72,-0.58],[-50.7,-0.53],[-50.72,-0.47],[-50.69,-0.36],[-50.65,-0.27],[-50.46,-0.16],[-50.25,-0.12],[-49.63,-0.23]],[[-50.65,-0.13],[-50.93,-0.33],[-51.02,-0.26],[-51.04,-0.23],[-51.02,-0.19],[-51.03,-0.17],[-51.0,-0.11],[-50.84,-0.05],[-50.77,-0.04],[-50.67,-0.06],[-50.65,-0.11],[-50.65,-0.13]],[[-49.44,-0.11],[-49.71,-0.14],[-49.83,-0.09],[-49.8,-0.05],[-49.71,0.02],[-49.6,0.06],[-49.5,0.08],[-49.4,0.06],[-49.37,0.0],[-49.38,-0.06],[-49.44,-0.11]],[[-49.74,0.27],[-49.7,0.22],[-49.84,0.01],[-49.92,-0.02],[-50.0,-0.03],[-50.11,0.03],[-50.29,0.03],[-50.34,0.04],[-50.35,0.13],[-50.27,0.23],[-50.13,0.23],[-49.88,0.3],[-49.74,0.27]],[[-50.43,0.14],[-50.44,-0.01],[-50.62,0.05],[-50.61,0.2],[-50.53,0.25],[-50.45,0.33],[-50.43,0.42],[-50.42,0.56],[-50.4,0.58],[-50.37,0.59],[-50.35,0.58],[-50.34,0.38],[-50.33,0.26],[-50.43,0.14]],[[-50.15,0.39],[-50.26,0.36],[-50.28,0.39],[-50.28,0.52],[-50.25,0.59],[-50.11,0.6],[-50.1,0.62],[-50.06,0.64],[-50.04,0.59],[-50.04,0.52],[-50.15,0.39]],[[-50.3,1.94],[-50.4,1.89],[-50.46,1.91],[-50.51,2.03],[-50.49,2.13],[-50.42,2.16],[-50.36,2.15],[-50.34,2.14],[-50.29,1.98],[-50.3,1.94]]]},{"n":"Barbados","r":[[[-59.49,13.08],[-59.52,13.06],[-59.61,13.1],[-59.64,13.15],[-59.65,13.3],[-59.59,13.32],[-59.49,13.2],[-59.43,13.15],[-59.49,13.08]]]},{"n":"Brunei","r":[[[115.03,4.9],[115.14,4.9],[115.17,4.87],[115.23,4.75],[115.27,4.63],[115.28,4.46],[115.33,4.38],[115.32,4.37],[115.29,4.35],[115.25,4.35],[115.17,4.36],[115.11,4.39],[115.05,4.58],[115.03,4.69],[115.03,4.82],[115.03,4.9]],[[115.03,4.9],[114.94,4.86],[114.86,4.8],[114.78,4.75],[114.75,4.72],[114.76,4.67],[114.78,4.55],[114.79,4.46],[114.82,4.43],[114.84,4.39],[114.83,4.35],[114.78,4.28],[114.81,4.27],[114.78,4.17],[114.72,4.1],[114.65,4.04],[114.61,4.02],[114.57,4.05],[114.51,4.11],[114.45,4.2],[114.42,4.26],[114.32,4.26],[114.29,4.3],[114.29,4.35],[114.26,4.41],[114.22,4.48],[114.17,4.53],[114.1,4.57],[114.06,4.59],[114.18,4.59],[114.3,4.61],[114.42,4.66],[114.54,4.72],[114.65,4.8],[114.74,4.88],[114.84,4.95],[115.0,5.02],[115.05,5.02],[115.05,4.96],[115.03,4.9]]]},{"n":"Bhutan","r":[[[91.63,27.76],[91.63,27.74],[91.6,27.68],[91.58,27.61],[91.59,27.56],[91.66,27.49],[91.74,27.44],[91.85,27.44],[91.95,27.46],[91.99,27.45],[92.04,27.36],[92.08,27.29],[92.03,27.21],[92.0,27.15],[91.99,27.1],[92.0,27.08],[92.03,27.04],[92.07,26.98],[92.07,26.91],[92.05,26.87],[92.0,26.85],[91.94,26.86],[91.9,26.86],[91.84,26.85],[91.75,26.83],[91.67,26.8],[91.52,26.81],[91.46,26.87],[91.43,26.87],[91.29,26.79],[91.13,26.8],[90.86,26.78],[90.74,26.77],[90.62,26.78],[90.56,26.8],[90.45,26.85],[90.35,26.89],[90.24,26.85],[90.21,26.85],[90.12,26.75],[89.94,26.72],[89.76,26.7],[89.71,26.71],[89.61,26.72],[89.61,26.74],[89.61,26.76],[89.59,26.78],[89.55,26.8],[89.47,26.8],[89.38,26.83],[89.33,26.85],[89.15,26.82],[89.04,26.87],[88.92,26.93],[88.86,26.96],[88.84,27.07],[88.81,27.1],[88.77,27.13],[88.74,27.18],[88.76,27.22],[88.88,27.3],[88.89,27.32],[88.95,27.46],[89.03,27.52],[89.1,27.59],[89.16,27.71],[89.27,27.83],[89.4,27.96],[89.48,28.06],[89.54,28.11],[89.65,28.16],[89.75,28.19],[89.82,28.26],[89.9,28.29],[89.98,28.31],[90.1,28.3],[90.22,28.28],[90.35,28.24],[90.36,28.22],[90.35,28.17],[90.33,28.12],[90.33,28.09],[90.35,28.08],[90.48,28.07],[90.63,28.08],[90.72,28.07],[90.91,28.03],[90.96,27.99],[91.02,27.97],[91.08,27.97],[91.15,28.03],[91.23,28.07],[91.27,28.08],[91.31,28.06],[91.37,28.02],[91.49,27.98],[91.61,27.95],[91.64,27.92],[91.63,27.8],[91.63,27.76]]]},{"n":"Botswana","r":[[[25.26,-17.79],[25.24,-17.84],[25.22,-17.92],[25.24,-17.97],[25.28,-18.04],[25.34,-18.1],[25.38,-18.14],[25.44,-18.23],[25.49,-18.35],[25.56,-18.44],[25.76,-18.65],[25.78,-18.72],[25.81,-18.8],[25.94,-18.94],[25.96,-18.99],[25.95,-19.08],[26.08,-19.37],[26.17,-19.54],[26.24,-19.57],[26.47,-19.75],[26.68,-19.89],[26.92,-19.99],[27.09,-20.05],[27.18,-20.1],[27.22,-20.15],[27.26,-20.23],[27.27,-20.38],[27.28,-20.48],[27.47,-20.47],[27.62,-20.48],[27.68,-20.5],[27.7,-20.53],[27.69,-20.59],[27.7,-20.69],[27.7,-20.77],[27.69,-20.85],[27.68,-20.94],[27.67,-21.06],[27.69,-21.11],[27.84,-21.26],[27.91,-21.36],[27.97,-21.51],[28.01,-21.55],[28.05,-21.57],[28.18,-21.59],[28.53,-21.65],[28.75,-21.71],[28.92,-21.77],[28.99,-21.78],[29.03,-21.8],[29.04,-21.81],[29.02,-21.94],[29.02,-21.98],[29.04,-22.02],[29.07,-22.05],[29.11,-22.07],[29.24,-22.08],[29.32,-22.16],[29.36,-22.19],[29.13,-22.21],[29.01,-22.28],[28.95,-22.4],[28.84,-22.48],[28.7,-22.54],[28.54,-22.57],[28.38,-22.59],[28.21,-22.69],[28.03,-22.87],[27.94,-22.99],[27.93,-23.03],[27.89,-23.07],[27.81,-23.11],[27.77,-23.15],[27.76,-23.2],[27.72,-23.22],[27.64,-23.22],[27.59,-23.25],[27.56,-23.32],[27.5,-23.37],[27.4,-23.38],[27.31,-23.42],[27.24,-23.49],[27.19,-23.52],[27.15,-23.52],[27.09,-23.58],[26.99,-23.7],[26.97,-23.76],[26.84,-24.24],[26.76,-24.3],[26.62,-24.4],[26.5,-24.51],[26.45,-24.58],[26.4,-24.61],[26.13,-24.67],[26.03,-24.7],[25.91,-24.75],[25.88,-24.79],[25.85,-24.94],[25.77,-25.15],[25.7,-25.3],[25.66,-25.44],[25.58,-25.61],[25.52,-25.66],[25.44,-25.71],[25.35,-25.74],[25.21,-25.76],[25.09,-25.75],[25.0,-25.75],[24.87,-25.81],[24.75,-25.82],[24.56,-25.78],[24.4,-25.75],[24.33,-25.74],[24.19,-25.63],[24.1,-25.63],[23.97,-25.63],[23.89,-25.6],[23.82,-25.54],[23.67,-25.43],[23.52,-25.34],[23.39,-25.29],[23.27,-25.27],[23.15,-25.29],[23.06,-25.31],[23.02,-25.32],[22.95,-25.37],[22.88,-25.46],[22.82,-25.6],[22.8,-25.68],[22.73,-25.86],[22.64,-26.07],[22.6,-26.13],[22.55,-26.18],[22.47,-26.22],[22.22,-26.39],[22.09,-26.58],[22.01,-26.64],[21.91,-26.66],[21.83,-26.68],[21.79,-26.71],[21.74,-26.81],[21.69,-26.84],[21.65,-26.85],[21.5,-26.84],[21.45,-26.83],[21.07,-26.85],[20.95,-26.82],[20.87,-26.81],[20.74,-26.85],[20.69,-26.82],[20.64,-26.74],[20.62,-26.58],[20.63,-26.44],[20.7,-26.34],[20.76,-26.26],[20.82,-26.16],[20.82,-26.12],[20.81,-26.08],[20.8,-26.0],[20.79,-25.92],[20.71,-25.73],[20.61,-25.49],[20.47,-25.22],[20.43,-25.15],[20.35,-25.03],[20.03,-24.81],[19.98,-24.78],[19.98,-24.75],[19.98,-24.54],[19.98,-24.25],[19.98,-23.96],[19.98,-23.68],[19.98,-23.39],[19.98,-23.1],[19.98,-22.82],[19.98,-22.53],[19.98,-22.24],[19.98,-22.0],[20.21,-22.0],[20.49,-22.0],[20.82,-22.0],[20.97,-22.0],[20.98,-21.96],[20.98,-21.78],[20.98,-21.38],[20.98,-20.97],[20.98,-20.56],[20.98,-20.15],[20.98,-19.74],[20.98,-19.34],[20.98,-18.93],[20.97,-18.52],[20.97,-18.32],[21.23,-18.31],[21.53,-18.27],[22.01,-18.2],[22.46,-18.12],[22.75,-18.07],[23.1,-18.01],[23.22,-18.0],[23.25,-18.01],[23.3,-18.03],[23.46,-18.23],[23.56,-18.39],[23.58,-18.45],[23.6,-18.46],[23.65,-18.45],[23.7,-18.42],[23.86,-18.27],[23.9,-18.23],[24.0,-18.15],[24.13,-18.08],[24.24,-18.02],[24.36,-17.98],[24.41,-17.99],[24.47,-18.03],[24.53,-18.05],[24.79,-17.86],[24.91,-17.82],[25.22,-17.79],[25.26,-17.79]]]},{"n":"Central African Republic","r":[[[22.86,10.92],[22.93,10.8],[22.96,10.75],[23.26,10.46],[23.31,10.39],[23.46,10.17],[23.55,10.03],[23.65,9.82],[23.66,9.71],[23.64,9.61],[23.62,9.34],[23.6,9.26],[23.47,9.11],[23.46,9.05],[23.49,8.99],[23.53,8.97],[23.55,8.94],[23.54,8.82],[23.58,8.77],[23.68,8.73],[23.92,8.71],[24.05,8.69],[24.15,8.67],[24.19,8.65],[24.22,8.61],[24.18,8.46],[24.21,8.37],[24.29,8.29],[24.38,8.26],[24.46,8.24],[24.74,8.19],[24.85,8.14],[25.01,7.96],[25.2,7.81],[25.25,7.72],[25.24,7.65],[25.18,7.56],[25.19,7.52],[25.28,7.43],[25.38,7.33],[25.57,7.23],[25.89,7.06],[26.04,6.96],[26.09,6.87],[26.17,6.78],[26.28,6.7],[26.36,6.64],[26.31,6.46],[26.32,6.4],[26.35,6.34],[26.42,6.27],[26.45,6.18],[26.51,6.07],[26.59,6.02],[26.73,6.0],[26.8,5.95],[26.94,5.85],[27.08,5.78],[27.14,5.72],[27.18,5.68],[27.21,5.62],[27.23,5.56],[27.23,5.44],[27.26,5.29],[27.33,5.19],[27.4,5.11],[27.11,5.2],[27.07,5.2],[27.02,5.18],[26.87,5.08],[26.82,5.06],[26.77,5.07],[26.63,5.09],[26.17,5.17],[25.82,5.25],[25.71,5.28],[25.53,5.31],[25.4,5.26],[25.28,5.06],[25.25,5.02],[25.07,4.97],[24.98,4.98],[24.77,4.93],[24.44,5.01],[24.32,4.99],[24.23,4.95],[23.99,4.87],[23.85,4.82],[23.68,4.77],[23.52,4.7],[23.42,4.66],[23.31,4.66],[23.22,4.7],[23.12,4.74],[22.99,4.74],[22.86,4.72],[22.76,4.65],[22.71,4.59],[22.62,4.45],[22.51,4.21],[22.46,4.16],[22.45,4.16],[22.42,4.13],[21.91,4.25],[21.69,4.28],[21.54,4.24],[21.35,4.31],[21.27,4.32],[21.23,4.3],[21.13,4.33],[20.96,4.41],[20.79,4.45],[20.65,4.44],[20.56,4.46],[20.49,4.54],[20.39,4.69],[20.23,4.83],[20.0,4.94],[19.86,5.03],[19.81,5.09],[19.69,5.12],[19.5,5.13],[19.32,5.07],[19.07,4.89],[18.83,4.52],[18.7,4.38],[18.59,4.35],[18.57,4.26],[18.62,4.12],[18.63,3.95],[18.6,3.68],[18.61,3.48],[18.55,3.51],[18.5,3.6],[18.47,3.62],[18.32,3.58],[18.24,3.54],[18.19,3.51],[18.16,3.5],[18.11,3.55],[18.07,3.56],[18.01,3.55],[17.95,3.55],[17.91,3.56],[17.88,3.55],[17.81,3.58],[17.54,3.66],[17.49,3.69],[17.44,3.68],[17.3,3.62],[17.22,3.6],[17.0,3.56],[16.76,3.54],[16.67,3.54],[16.61,3.51],[16.57,3.46],[16.54,3.37],[16.5,3.21],[16.48,3.17],[16.48,3.1],[16.47,2.99],[16.46,2.9],[16.47,2.83],[16.4,2.7],[16.32,2.54],[16.25,2.41],[16.18,2.27],[16.14,2.36],[16.11,2.47],[16.1,2.6],[16.1,2.63],[16.08,2.67],[16.08,2.68],[16.06,2.77],[16.08,2.84],[16.06,2.91],[16.01,2.98],[15.96,3.03],[15.93,3.08],[15.9,3.1],[15.85,3.1],[15.78,3.13],[15.68,3.23],[15.58,3.33],[15.46,3.46],[15.36,3.57],[15.24,3.7],[15.13,3.83],[15.06,3.95],[15.03,4.02],[15.07,4.02],[15.12,4.02],[15.14,4.04],[15.14,4.07],[15.09,4.16],[15.06,4.28],[15.02,4.36],[14.89,4.47],[14.77,4.56],[14.73,4.6],[14.71,4.67],[14.66,5.07],[14.64,5.18],[14.6,5.23],[14.57,5.25],[14.56,5.28],[14.57,5.35],[14.58,5.41],[14.58,5.44],[14.62,5.5],[14.62,5.87],[14.6,5.88],[14.58,5.92],[14.54,5.91],[14.5,5.92],[14.46,5.97],[14.43,6.04],[14.44,6.09],[14.48,6.13],[14.51,6.16],[14.56,6.19],[14.7,6.25],[14.74,6.28],[14.76,6.32],[14.78,6.37],[14.86,6.56],[14.98,6.75],[15.03,6.78],[15.09,6.91],[15.16,7.06],[15.19,7.13],[15.21,7.21],[15.25,7.26],[15.38,7.36],[15.48,7.52],[15.59,7.52],[15.7,7.49],[15.85,7.48],[15.96,7.51],[16.03,7.57],[16.19,7.62],[16.38,7.68],[16.4,7.77],[16.46,7.82],[16.52,7.86],[16.55,7.87],[16.55,7.84],[16.59,7.74],[16.67,7.65],[16.78,7.55],[16.82,7.56],[16.89,7.63],[17.07,7.68],[17.12,7.7],[17.25,7.81],[17.4,7.88],[17.44,7.89],[17.49,7.91],[17.65,7.98],[17.76,7.97],[17.94,7.99],[18.24,8.02],[18.46,8.03],[18.56,8.05],[18.59,8.06],[18.63,8.17],[18.67,8.2],[18.75,8.24],[18.91,8.41],[19.01,8.54],[19.04,8.59],[19.04,8.59],[19.06,8.6],[19.11,8.66],[19.06,8.72],[18.89,8.84],[18.89,8.85],[18.88,8.87],[18.89,8.89],[18.96,8.94],[19.05,9.0],[19.15,9.02],[19.4,9.01],[19.62,9.02],[19.67,9.02],[19.84,9.05],[19.95,9.08],[20.07,9.13],[20.34,9.13],[20.57,9.27],[20.63,9.3],[20.66,9.32],[20.67,9.35],[20.77,9.41],[20.89,9.53],[20.98,9.64],[21.01,9.71],[21.26,9.97],[21.35,9.97],[21.4,10.0],[21.5,10.18],[21.53,10.21],[21.58,10.22],[21.63,10.24],[21.68,10.29],[21.73,10.37],[21.73,10.46],[21.71,10.54],[21.71,10.57],[21.73,10.61],[21.77,10.64],[21.96,10.74],[22.01,10.78],[22.04,10.82],[22.1,10.83],[22.16,10.83],[22.19,10.85],[22.24,10.89],[22.37,10.95],[22.49,11.0],[22.62,10.98],[22.73,10.95],[22.82,10.93],[22.86,10.92]]]},{"n":"Canada","r":[[[-59.79,43.94],[-59.92,43.9],[-60.04,43.91],[-60.11,43.94],[-60.12,43.95],[-59.94,43.94],[-59.87,43.95],[-59.73,44.0],[-59.79,43.94]],[[-66.27,44.29],[-66.32,44.26],[-66.31,44.29],[-66.25,44.38],[-66.21,44.39],[-66.27,44.29]],[[-66.76,44.68],[-66.9,44.63],[-66.84,44.76],[-66.8,44.81],[-66.75,44.79],[-66.75,44.71],[-66.76,44.68]],[[-60.96,45.49],[-61.0,45.48],[-61.01,45.5],[-61.08,45.54],[-61.08,45.56],[-61.03,45.58],[-60.91,45.57],[-60.95,45.52],[-60.96,45.49]],[[-73.7,45.59],[-73.82,45.56],[-73.86,45.57],[-73.72,45.67],[-73.57,45.69],[-73.7,45.59]],[[-73.57,45.47],[-73.64,45.45],[-73.78,45.47],[-73.92,45.44],[-73.96,45.44],[-73.85,45.52],[-73.69,45.56],[-73.52,45.7],[-73.48,45.7],[-73.54,45.55],[-73.55,45.49],[-73.57,45.47]],[[-71.03,46.87],[-71.12,46.86],[-71.09,46.9],[-70.97,46.96],[-70.88,47.0],[-70.83,47.0],[-70.91,46.92],[-71.03,46.87]],[[-61.11,45.94],[-61.07,45.94],[-60.94,45.99],[-60.87,45.98],[-60.87,45.95],[-60.98,45.91],[-61.04,45.88],[-60.97,45.86],[-60.97,45.84],[-61.05,45.8],[-61.09,45.75],[-61.06,45.7],[-60.93,45.75],[-60.88,45.75],[-60.81,45.74],[-60.74,45.75],[-60.7,45.77],[-60.47,45.95],[-60.46,45.97],[-60.7,45.93],[-60.73,45.96],[-60.57,46.06],[-60.59,46.12],[-60.5,46.2],[-60.43,46.26],[-60.38,46.28],[-60.3,46.31],[-60.24,46.27],[-60.23,46.2],[-60.09,46.21],[-59.96,46.19],[-59.87,46.16],[-59.85,46.14],[-59.85,46.11],[-59.88,46.06],[-59.93,46.02],[-59.83,45.97],[-59.84,45.94],[-60.02,45.88],[-60.11,45.82],[-60.21,45.74],[-60.39,45.65],[-60.67,45.59],[-60.76,45.59],[-60.87,45.61],[-60.98,45.61],[-61.08,45.58],[-61.19,45.59],[-61.24,45.57],[-61.28,45.57],[-61.32,45.6],[-61.41,45.67],[-61.45,45.72],[-61.5,45.94],[-61.48,46.06],[-61.41,46.17],[-61.3,46.24],[-61.24,46.3],[-60.98,46.65],[-60.93,46.73],[-60.87,46.8],[-60.76,46.86],[-60.62,46.98],[-60.57,47.0],[-60.49,47.01],[-60.41,47.0],[-60.43,46.96],[-60.43,46.92],[-60.33,46.77],[-60.33,46.74],[-60.38,46.61],[-60.48,46.41],[-60.51,46.3],[-60.49,46.27],[-60.53,46.21],[-60.58,46.17],[-60.74,46.09],[-60.83,46.07],[-60.91,46.04],[-61.11,45.94]],[[-63.81,46.47],[-63.78,46.45],[-63.74,46.48],[-63.68,46.56],[-63.53,46.54],[-63.46,46.5],[-63.41,46.51],[-63.37,46.51],[-63.29,46.46],[-63.13,46.42],[-62.96,46.43],[-62.71,46.45],[-62.68,46.46],[-62.42,46.48],[-62.16,46.49],[-62.07,46.47],[-62.04,46.45],[-62.02,46.42],[-62.17,46.36],[-62.32,46.28],[-62.53,46.2],[-62.55,46.17],[-62.54,46.1],[-62.54,46.03],[-62.5,46.02],[-62.48,46.0],[-62.53,45.98],[-62.74,45.97],[-62.8,45.97],[-62.88,46.0],[-62.9,46.07],[-62.99,46.06],[-63.02,46.07],[-62.89,46.12],[-62.95,46.2],[-63.02,46.19],[-63.06,46.22],[-63.05,46.27],[-63.0,46.29],[-62.98,46.32],[-63.06,46.3],[-63.12,46.25],[-63.19,46.24],[-63.27,46.2],[-63.15,46.19],[-63.21,46.16],[-63.28,46.15],[-63.57,46.21],[-63.64,46.23],[-63.73,46.29],[-63.8,46.37],[-63.76,46.37],[-63.75,46.38],[-63.76,46.4],[-63.86,46.41],[-64.02,46.4],[-64.11,46.43],[-64.11,46.56],[-64.14,46.6],[-64.24,46.63],[-64.39,46.64],[-64.4,46.69],[-64.35,46.77],[-64.28,46.84],[-64.22,46.9],[-64.16,46.95],[-63.99,47.06],[-64.0,46.98],[-63.98,46.91],[-64.09,46.78],[-63.9,46.64],[-63.88,46.61],[-63.86,46.57],[-63.88,46.54],[-63.91,46.51],[-63.83,46.49],[-63.81,46.47]],[[-61.91,47.28],[-61.88,47.27],[-61.82,47.27],[-61.77,47.26],[-61.83,47.22],[-61.95,47.22],[-62.01,47.23],[-61.92,47.43],[-61.83,47.47],[-61.63,47.59],[-61.55,47.63],[-61.47,47.65],[-61.4,47.64],[-61.48,47.56],[-61.58,47.56],[-61.68,47.5],[-61.75,47.43],[-61.83,47.39],[-61.89,47.34],[-61.91,47.28]],[[-54.23,47.44],[-54.28,47.41],[-54.33,47.41],[-54.32,47.44],[-54.26,47.5],[-54.23,47.54],[-54.23,47.57],[-54.21,47.59],[-54.17,47.61],[-54.13,47.65],[-54.15,47.57],[-54.23,47.44]],[[-64.51,47.89],[-64.53,47.81],[-64.62,47.75],[-64.66,47.75],[-64.68,47.75],[-64.66,47.79],[-64.66,47.86],[-64.59,47.87],[-64.56,47.87],[-64.51,47.89]],[[-64.48,47.96],[-64.59,47.91],[-64.54,47.98],[-64.52,48.01],[-64.5,48.01],[-64.48,48.01],[-64.48,47.96]],[[-123.44,48.75],[-123.48,48.73],[-123.5,48.73],[-123.52,48.75],[-123.58,48.93],[-123.55,48.92],[-123.47,48.87],[-123.49,48.85],[-123.42,48.79],[-123.41,48.76],[-123.44,48.75]],[[-123.37,48.89],[-123.38,48.88],[-123.54,48.95],[-123.65,49.04],[-123.69,49.1],[-123.48,48.95],[-123.38,48.91],[-123.37,48.89]],[[-74.71,45.0],[-74.57,45.04],[-74.27,45.19],[-74.05,45.24],[-73.76,45.4],[-73.56,45.43],[-73.52,45.46],[-73.48,45.59],[-73.47,45.63],[-73.37,45.76],[-73.25,45.86],[-73.16,46.01],[-72.99,46.1],[-72.73,46.18],[-72.5,46.35],[-72.37,46.4],[-72.24,46.44],[-72.19,46.51],[-72.11,46.55],[-71.9,46.63],[-71.67,46.65],[-71.44,46.72],[-71.26,46.76],[-71.15,46.82],[-70.99,46.85],[-70.52,47.03],[-70.39,47.12],[-70.22,47.29],[-70.07,47.38],[-70.02,47.47],[-69.8,47.62],[-69.58,47.82],[-69.47,47.97],[-69.31,48.05],[-68.99,48.28],[-68.82,48.37],[-68.75,48.38],[-68.55,48.46],[-68.43,48.54],[-68.24,48.63],[-67.89,48.73],[-67.56,48.86],[-67.12,48.96],[-66.6,49.13],[-66.18,49.21],[-65.88,49.23],[-65.52,49.27],[-65.4,49.26],[-64.84,49.19],[-64.57,49.1],[-64.26,48.92],[-64.22,48.87],[-64.21,48.81],[-64.37,48.84],[-64.51,48.84],[-64.41,48.8],[-64.25,48.69],[-64.25,48.55],[-64.35,48.42],[-64.63,48.36],[-64.71,48.31],[-64.76,48.23],[-64.82,48.2],[-64.96,48.16],[-65.04,48.11],[-65.26,48.02],[-65.36,48.01],[-65.48,48.03],[-65.75,48.11],[-65.93,48.19],[-66.01,48.15],[-66.08,48.1],[-66.25,48.12],[-66.32,48.1],[-66.45,48.12],[-66.7,48.02],[-66.63,48.01],[-66.43,48.07],[-66.36,48.06],[-66.21,47.99],[-65.85,47.91],[-65.76,47.86],[-65.67,47.7],[-65.61,47.67],[-65.48,47.69],[-65.34,47.77],[-65.23,47.81],[-65.0,47.85],[-65.05,47.79],[-64.87,47.8],[-64.7,47.72],[-64.77,47.67],[-64.85,47.57],[-64.91,47.37],[-65.09,47.23],[-65.32,47.1],[-65.26,47.07],[-65.19,47.05],[-65.04,47.09],[-64.94,47.09],[-64.83,47.06],[-64.87,46.96],[-64.91,46.89],[-64.88,46.82],[-64.82,46.7],[-64.73,46.67],[-64.69,46.51],[-64.64,46.43],[-64.65,46.36],[-64.56,46.31],[-64.54,46.24],[-64.21,46.22],[-64.15,46.19],[-63.92,46.17],[-63.87,46.15],[-63.83,46.11],[-64.06,46.02],[-63.87,45.96],[-63.7,45.86],[-63.57,45.88],[-63.51,45.87],[-63.36,45.81],[-63.32,45.78],[-63.29,45.75],[-63.22,45.76],[-63.11,45.78],[-62.91,45.78],[-62.7,45.74],[-62.72,45.69],[-62.75,45.65],[-62.59,45.66],[-62.48,45.62],[-62.45,45.64],[-62.42,45.66],[-62.22,45.73],[-61.96,45.87],[-61.92,45.85],[-61.91,45.8],[-61.88,45.71],[-61.78,45.66],[-61.66,45.64],[-61.49,45.69],[-61.43,45.65],[-61.35,45.57],[-61.28,45.48],[-61.28,45.44],[-61.38,45.41],[-61.46,45.37],[-61.11,45.35],[-61.07,45.33],[-61.03,45.29],[-61.07,45.25],[-61.1,45.23],[-61.17,45.26],[-61.28,45.24],[-61.39,45.19],[-61.5,45.16],[-61.57,45.15],[-61.65,45.13],[-61.72,45.09],[-61.79,45.08],[-62.03,44.99],[-62.26,44.94],[-62.51,44.84],[-62.77,44.79],[-63.03,44.71],[-63.09,44.71],[-63.16,44.71],[-63.31,44.64],[-63.38,44.65],[-63.46,44.64],[-63.54,44.66],[-63.6,44.68],[-63.56,44.61],[-63.54,44.54],[-63.57,44.51],[-63.61,44.48],[-63.76,44.49],[-63.82,44.51],[-63.89,44.55],[-63.92,44.6],[-64.0,44.64],[-64.04,44.59],[-64.04,44.55],[-64.1,44.49],[-64.17,44.59],[-64.29,44.55],[-64.34,44.44],[-64.31,44.41],[-64.28,44.33],[-64.33,44.29],[-64.38,44.3],[-64.47,44.19],[-64.58,44.14],[-64.69,44.02],[-64.83,43.93],[-64.86,43.87],[-65.09,43.73],[-65.17,43.73],[-65.23,43.73],[-65.33,43.67],[-65.34,43.55],[-65.39,43.57],[-65.43,43.56],[-65.45,43.52],[-65.48,43.52],[-65.56,43.55],[-65.66,43.53],[-65.74,43.56],[-65.84,43.73],[-65.89,43.8],[-65.98,43.81],[-66.0,43.78],[-66.04,43.74],[-66.13,43.81],[-66.19,44.08],[-66.19,44.14],[-66.1,44.37],[-65.87,44.57],[-65.94,44.58],[-66.15,44.44],[-66.13,44.47],[-66.09,44.5],[-66.02,44.56],[-65.92,44.62],[-65.78,44.65],[-65.68,44.65],[-65.62,44.68],[-65.52,44.73],[-65.5,44.76],[-65.59,44.73],[-65.73,44.7],[-65.69,44.74],[-65.66,44.76],[-64.9,45.12],[-64.75,45.18],[-64.45,45.26],[-64.41,45.31],[-64.45,45.34],[-64.33,45.31],[-64.34,45.27],[-64.36,45.24],[-64.37,45.19],[-64.35,45.14],[-64.24,45.11],[-64.14,45.02],[-64.18,45.15],[-64.09,45.22],[-63.75,45.31],[-63.46,45.32],[-63.37,45.36],[-63.61,45.39],[-63.91,45.38],[-64.09,45.41],[-64.34,45.39],[-64.6,45.41],[-64.68,45.38],[-64.75,45.32],[-64.83,45.35],[-64.87,45.35],[-64.91,45.37],[-64.83,45.48],[-64.56,45.63],[-64.4,45.76],[-64.35,45.78],[-64.31,45.84],[-64.4,45.83],[-64.48,45.81],[-64.54,45.87],[-64.63,45.95],[-64.64,45.91],[-64.59,45.81],[-64.78,45.64],[-64.9,45.63],[-65.06,45.54],[-65.28,45.47],[-65.55,45.34],[-65.88,45.22],[-65.96,45.22],[-66.11,45.32],[-66.07,45.36],[-66.03,45.42],[-66.06,45.4],[-66.09,45.38],[-66.18,45.34],[-66.11,45.26],[-66.14,45.23],[-66.25,45.19],[-66.35,45.13],[-66.44,45.1],[-66.51,45.14],[-66.71,45.08],[-66.87,45.07],[-66.91,45.1],[-66.92,45.15],[-66.98,45.16],[-67.08,45.14],[-67.12,45.17],[-67.17,45.18],[-67.21,45.19],[-67.25,45.2],[-67.27,45.19],[-67.29,45.17],[-67.32,45.15],[-67.37,45.17],[-67.4,45.21],[-67.45,45.25],[-67.47,45.28],[-67.46,45.31],[-67.44,45.34],[-67.43,45.38],[-67.45,45.42],[-67.48,45.45],[-67.49,45.47],[-67.49,45.5],[-67.45,45.51],[-67.42,45.53],[-67.41,45.57],[-67.43,45.6],[-67.49,45.62],[-67.53,45.61],[-67.6,45.62],[-67.66,45.64],[-67.7,45.67],[-67.73,45.69],[-67.76,45.69],[-67.78,45.7],[-67.8,45.73],[-67.8,45.77],[-67.79,45.8],[-67.78,45.82],[-67.77,45.84],[-67.78,45.86],[-67.78,45.87],[-67.78,45.89],[-67.77,45.93],[-67.78,45.95],[-67.79,46.04],[-67.79,46.21],[-67.79,46.34],[-67.8,46.5],[-67.8,46.62],[-67.8,46.78],[-67.8,46.94],[-67.81,47.08],[-67.93,47.17],[-68.1,47.27],[-68.24,47.35],[-68.31,47.35],[-68.36,47.34],[-68.38,47.32],[-68.48,47.29],[-68.67,47.25],[-68.83,47.2],[-68.89,47.2],[-68.94,47.21],[-69.0,47.24],[-69.05,47.27],[-69.06,47.34],[-69.05,47.43],[-69.15,47.44],[-69.24,47.46],[-69.3,47.4],[-69.36,47.35],[-69.47,47.24],[-69.63,47.08],[-69.72,46.99],[-69.87,46.84],[-70.01,46.71],[-70.04,46.57],[-70.07,46.44],[-70.18,46.34],[-70.25,46.25],[-70.28,46.15],[-70.3,46.06],[-70.31,45.98],[-70.29,45.94],[-70.3,45.91],[-70.33,45.87],[-70.41,45.8],[-70.42,45.74],[-70.47,45.71],[-70.6,45.64],[-70.7,45.55],[-70.71,45.5],[-70.69,45.46],[-70.69,45.43],[-70.71,45.41],[-70.75,45.41],[-70.8,45.4],[-70.84,45.37],[-70.84,45.31],[-70.87,45.27],[-70.9,45.26],[-70.93,45.29],[-70.96,45.33],[-71.0,45.34],[-71.06,45.31],[-71.13,45.26],[-71.2,45.26],[-71.33,45.29],[-71.42,45.2],[-71.52,45.01],[-71.93,45.01],[-72.35,45.01],[-72.77,45.01],[-73.18,45.01],[-73.6,45.01],[-74.01,45.0],[-74.43,45.0],[-74.66,45.0],[-74.71,45.0]],[[-126.09,49.35],[-126.06,49.26],[-126.19,49.28],[-126.23,49.3],[-126.23,49.34],[-126.21,49.38],[-126.12,49.37],[-126.09,49.35]],[[-54.55,49.59],[-54.71,49.53],[-54.74,49.51],[-54.79,49.5],[-54.82,49.51],[-54.86,49.58],[-54.86,49.6],[-54.81,49.6],[-54.79,49.59],[-54.78,49.57],[-54.76,49.56],[-54.73,49.56],[-54.62,49.62],[-54.56,49.63],[-54.54,49.62],[-54.55,49.59]],[[-54.09,49.74],[-54.02,49.68],[-53.98,49.66],[-54.24,49.59],[-54.27,49.59],[-54.29,49.6],[-54.29,49.66],[-54.28,49.71],[-54.26,49.72],[-54.2,49.69],[-54.14,49.75],[-54.09,49.74]],[[-124.15,49.53],[-124.14,49.51],[-124.36,49.59],[-124.46,49.63],[-124.49,49.67],[-124.52,49.69],[-124.63,49.74],[-124.65,49.76],[-124.62,49.78],[-124.55,49.76],[-124.42,49.73],[-124.31,49.67],[-124.15,49.53]],[[-126.64,49.61],[-126.68,49.6],[-126.74,49.61],[-126.81,49.64],[-126.94,49.72],[-126.95,49.74],[-126.94,49.75],[-126.9,49.76],[-126.9,49.78],[-126.93,49.84],[-126.83,49.87],[-126.74,49.84],[-126.7,49.81],[-126.65,49.75],[-126.63,49.68],[-126.63,49.63],[-126.64,49.61]],[[-61.8,49.09],[-62.22,49.08],[-62.55,49.14],[-62.8,49.17],[-63.04,49.22],[-63.57,49.4],[-63.63,49.46],[-63.68,49.53],[-63.78,49.6],[-63.88,49.66],[-64.44,49.83],[-64.49,49.89],[-64.37,49.93],[-64.24,49.94],[-64.13,49.94],[-63.76,49.88],[-63.29,49.82],[-63.09,49.77],[-62.86,49.71],[-62.63,49.62],[-62.13,49.41],[-62.04,49.39],[-61.82,49.28],[-61.74,49.2],[-61.7,49.14],[-61.75,49.11],[-61.8,49.09]],[[-124.98,50.03],[-125.0,50.02],[-125.03,50.13],[-125.0,50.18],[-124.99,50.2],[-124.99,50.22],[-124.94,50.17],[-124.92,50.13],[-124.91,50.08],[-124.91,50.07],[-124.98,50.03]],[[-125.18,50.1],[-125.2,50.04],[-125.26,50.13],[-125.36,50.31],[-125.35,50.35],[-125.3,50.41],[-125.26,50.42],[-125.2,50.39],[-125.14,50.34],[-125.13,50.32],[-125.09,50.27],[-125.07,50.22],[-125.11,50.16],[-125.18,50.1]],[[-55.54,50.72],[-55.57,50.71],[-55.6,50.71],[-55.63,50.72],[-55.63,50.74],[-55.6,50.78],[-55.53,50.8],[-55.47,50.8],[-55.47,50.78],[-55.5,50.74],[-55.54,50.72]],[[-127.2,50.64],[-126.7,50.52],[-126.2,50.45],[-125.84,50.38],[-125.62,50.36],[-125.53,50.34],[-125.48,50.32],[-125.42,50.25],[-125.31,50.11],[-125.23,50.01],[-125.07,49.85],[-124.93,49.73],[-124.9,49.69],[-124.93,49.67],[-124.93,49.64],[-124.83,49.53],[-124.64,49.43],[-124.5,49.38],[-124.19,49.3],[-124.0,49.22],[-123.94,49.17],[-123.85,49.12],[-123.82,49.08],[-123.75,48.95],[-123.63,48.82],[-123.5,48.58],[-123.47,48.6],[-123.46,48.67],[-123.44,48.69],[-123.42,48.7],[-123.39,48.67],[-123.37,48.61],[-123.28,48.46],[-123.31,48.41],[-123.33,48.41],[-123.45,48.43],[-123.48,48.4],[-123.54,48.34],[-123.57,48.32],[-123.59,48.33],[-123.92,48.39],[-124.12,48.44],[-124.38,48.52],[-124.69,48.6],[-124.87,48.65],[-125.02,48.71],[-125.12,48.76],[-125.14,48.8],[-125.14,48.82],[-124.93,48.96],[-124.85,49.03],[-124.82,49.08],[-124.8,49.14],[-124.81,49.21],[-124.82,49.21],[-124.84,49.14],[-124.87,49.08],[-124.9,49.03],[-124.93,49.01],[-125.17,48.99],[-125.36,49.0],[-125.46,48.94],[-125.49,48.93],[-125.54,48.95],[-125.66,49.03],[-125.83,49.09],[-125.81,49.11],[-125.7,49.14],[-125.64,49.19],[-125.65,49.19],[-125.69,49.19],[-125.73,49.2],[-125.8,49.26],[-125.84,49.28],[-125.92,49.25],[-125.95,49.25],[-125.98,49.29],[-125.94,49.38],[-125.94,49.4],[-126.02,49.37],[-126.05,49.38],[-126.07,49.41],[-126.1,49.42],[-126.17,49.42],[-126.24,49.44],[-126.27,49.43],[-126.28,49.39],[-126.3,49.38],[-126.42,49.45],[-126.44,49.45],[-126.5,49.4],[-126.52,49.4],[-126.55,49.42],[-126.56,49.54],[-126.56,49.58],[-126.54,49.59],[-126.44,49.62],[-126.16,49.65],[-126.13,49.67],[-126.35,49.66],[-126.4,49.68],[-126.46,49.72],[-126.53,49.72],[-126.56,49.73],[-126.59,49.76],[-126.68,49.88],[-126.74,49.9],[-126.85,49.92],[-126.9,49.94],[-126.93,49.93],[-126.95,49.9],[-126.98,49.88],[-127.05,49.87],[-127.11,49.88],[-127.17,49.91],[-127.2,49.95],[-127.21,49.99],[-127.18,50.05],[-127.18,50.07],[-127.19,50.1],[-127.22,50.12],[-127.25,50.14],[-127.27,50.13],[-127.27,50.1],[-127.29,50.07],[-127.35,50.05],[-127.4,50.09],[-127.43,50.13],[-127.47,50.16],[-127.67,50.16],[-127.77,50.12],[-127.82,50.12],[-127.86,50.13],[-127.87,50.15],[-127.83,50.21],[-127.84,50.29],[-127.85,50.31],[-127.95,50.33],[-127.96,50.35],[-127.91,50.45],[-127.87,50.46],[-127.83,50.47],[-127.64,50.48],[-127.58,50.46],[-127.49,50.4],[-127.49,50.43],[-127.52,50.5],[-127.53,50.54],[-127.47,50.58],[-127.53,50.6],[-127.75,50.61],[-127.75,50.58],[-127.73,50.54],[-127.86,50.5],[-127.96,50.49],[-128.06,50.5],[-128.14,50.52],[-128.27,50.61],[-128.35,50.7],[-128.35,50.74],[-128.3,50.79],[-128.24,50.83],[-128.1,50.86],[-127.92,50.86],[-127.71,50.82],[-127.2,50.64]],[[-55.46,51.54],[-55.53,51.44],[-55.58,51.39],[-55.63,51.37],[-55.73,51.36],[-55.94,51.34],[-56.03,51.33],[-56.04,51.26],[-56.03,51.23],[-56.0,51.2],[-55.96,51.19],[-55.87,51.21],[-55.84,51.21],[-55.82,51.19],[-55.8,51.17],[-55.79,51.13],[-55.78,51.09],[-55.8,51.03],[-55.87,50.91],[-55.96,50.84],[-56.08,50.78],[-56.11,50.76],[-56.12,50.73],[-56.14,50.65],[-56.2,50.58],[-56.38,50.42],[-56.45,50.38],[-56.45,50.35],[-56.48,50.27],[-56.54,50.21],[-56.69,50.06],[-56.73,50.01],[-56.75,49.97],[-56.75,49.91],[-56.75,49.88],[-56.79,49.83],[-56.84,49.79],[-56.85,49.77],[-56.83,49.72],[-56.81,49.71],[-56.81,49.67],[-56.82,49.61],[-56.76,49.65],[-56.61,49.79],[-56.5,49.87],[-56.43,49.9],[-56.38,49.93],[-56.32,50.01],[-56.25,50.09],[-56.18,50.11],[-56.15,50.1],[-56.12,50.06],[-56.13,50.02],[-56.16,49.96],[-56.16,49.94],[-56.08,49.98],[-55.93,50.02],[-55.87,50.01],[-55.76,49.96],[-55.67,49.97],[-55.53,50.0],[-55.5,49.98],[-55.53,49.94],[-55.58,49.89],[-55.72,49.83],[-56.04,49.7],[-56.14,49.62],[-56.12,49.62],[-56.05,49.66],[-55.98,49.68],[-55.9,49.68],[-55.87,49.67],[-55.88,49.65],[-55.89,49.58],[-56.09,49.45],[-56.04,49.46],[-55.82,49.52],[-55.68,49.43],[-55.49,49.46],[-55.38,49.49],[-55.38,49.47],[-55.35,49.44],[-55.36,49.38],[-55.34,49.37],[-55.29,49.39],[-55.28,49.41],[-55.28,49.51],[-55.27,49.52],[-55.23,49.51],[-55.21,49.48],[-55.2,49.41],[-55.22,49.33],[-55.26,49.27],[-55.34,49.17],[-55.33,49.13],[-55.35,49.08],[-55.33,49.08],[-55.25,49.12],[-55.25,49.14],[-55.25,49.18],[-55.24,49.2],[-55.18,49.24],[-55.06,49.3],[-55.03,49.31],[-55.01,49.29],[-55.02,49.26],[-54.98,49.27],[-54.91,49.32],[-54.84,49.35],[-54.78,49.36],[-54.72,49.39],[-54.65,49.44],[-54.58,49.49],[-54.5,49.53],[-54.47,49.53],[-54.48,49.47],[-54.47,49.4],[-54.46,49.34],[-54.45,49.33],[-54.39,49.39],[-54.36,49.42],[-54.32,49.42],[-54.27,49.42],[-53.96,49.44],[-53.86,49.43],[-53.75,49.39],[-53.62,49.32],[-53.57,49.26],[-53.56,49.19],[-53.57,49.14],[-53.67,49.08],[-53.76,49.04],[-53.81,48.99],[-53.82,48.95],[-53.85,48.93],[-53.9,48.89],[-54.16,48.79],[-54.1,48.78],[-53.95,48.81],[-53.85,48.81],[-53.85,48.8],[-53.89,48.77],[-53.96,48.74],[-53.97,48.72],[-53.97,48.71],[-53.89,48.68],[-53.78,48.7],[-53.7,48.68],[-53.71,48.66],[-53.77,48.58],[-53.79,48.53],[-53.89,48.48],[-54.07,48.42],[-54.11,48.39],[-54.1,48.39],[-53.94,48.44],[-53.85,48.45],[-53.8,48.45],[-53.74,48.5],[-53.64,48.51],[-53.55,48.48],[-53.41,48.56],[-53.36,48.57],[-53.28,48.56],[-53.22,48.58],[-53.13,48.63],[-53.06,48.66],[-53.04,48.66],[-53.03,48.63],[-53.02,48.57],[-53.04,48.52],[-53.06,48.48],[-53.14,48.4],[-53.18,48.37],[-53.23,48.36],[-53.3,48.37],[-53.33,48.36],[-53.41,48.29],[-53.53,48.23],[-53.61,48.21],[-53.56,48.17],[-53.54,48.11],[-53.57,48.09],[-53.7,48.07],[-53.71,48.06],[-53.76,48.04],[-53.87,48.02],[-53.79,48.01],[-53.65,48.03],[-53.64,48.01],[-53.66,47.97],[-53.7,47.92],[-53.86,47.8],[-53.86,47.79],[-53.84,47.73],[-53.81,47.68],[-53.77,47.65],[-53.67,47.65],[-53.6,47.66],[-53.5,47.74],[-53.28,48.0],[-53.09,48.07],[-52.92,48.15],[-52.88,48.13],[-52.87,48.11],[-52.87,48.09],[-52.95,48.03],[-53.0,47.98],[-53.11,47.81],[-53.15,47.73],[-53.18,47.65],[-53.17,47.51],[-53.16,47.49],[-53.12,47.46],[-53.06,47.48],[-52.95,47.55],[-52.87,47.62],[-52.82,47.73],[-52.78,47.77],[-52.74,47.77],[-52.71,47.75],[-52.7,47.69],[-52.67,47.62],[-52.65,47.55],[-52.67,47.47],[-52.68,47.43],[-52.91,47.1],[-52.89,47.05],[-52.88,47.01],[-52.89,46.97],[-52.96,46.82],[-53.03,46.72],[-53.07,46.68],[-53.11,46.66],[-53.17,46.65],[-53.21,46.66],[-53.25,46.7],[-53.29,46.72],[-53.32,46.72],[-53.38,46.71],[-53.54,46.63],[-53.57,46.63],[-53.59,46.64],[-53.62,46.68],[-53.6,46.89],[-53.58,46.96],[-53.61,47.01],[-53.58,47.1],[-53.58,47.13],[-53.6,47.15],[-53.64,47.14],[-53.7,47.09],[-53.77,47.01],[-53.86,46.94],[-54.01,46.84],[-54.08,46.82],[-54.1,46.82],[-54.13,46.84],[-54.17,46.88],[-54.17,46.92],[-54.16,46.97],[-54.09,47.09],[-53.97,47.26],[-53.87,47.39],[-53.85,47.44],[-53.88,47.46],[-53.9,47.51],[-53.94,47.64],[-53.99,47.76],[-54.05,47.81],[-54.19,47.86],[-54.22,47.85],[-54.23,47.77],[-54.4,47.56],[-54.43,47.46],[-54.46,47.43],[-54.49,47.4],[-54.56,47.38],[-54.54,47.43],[-54.46,47.54],[-54.47,47.55],[-54.57,47.46],[-54.65,47.41],[-54.74,47.4],[-54.8,47.4],[-54.86,47.39],[-55.09,47.17],[-55.1,47.1],[-55.14,47.05],[-55.25,46.94],[-55.32,46.91],[-55.4,46.9],[-55.48,46.92],[-55.53,46.91],[-55.65,46.88],[-55.79,46.87],[-55.84,46.87],[-55.88,46.89],[-55.95,46.93],[-55.96,46.96],[-55.95,46.97],[-55.92,47.02],[-55.84,47.07],[-55.77,47.09],[-55.61,47.12],[-55.49,47.16],[-55.4,47.22],[-55.36,47.26],[-55.19,47.45],[-54.98,47.52],[-54.87,47.57],[-54.8,47.64],[-54.78,47.66],[-54.89,47.63],[-54.95,47.62],[-55.04,47.63],[-55.07,47.66],[-55.2,47.65],[-55.37,47.66],[-55.39,47.64],[-55.41,47.55],[-55.43,47.5],[-55.46,47.48],[-55.5,47.48],[-55.58,47.47],[-55.77,47.5],[-55.81,47.52],[-55.86,47.53],[-56.08,47.5],[-56.13,47.5],[-56.08,47.52],[-55.87,47.59],[-55.84,47.79],[-55.86,47.82],[-55.92,47.79],[-56.02,47.76],[-56.09,47.77],[-56.12,47.79],[-56.15,47.77],[-56.22,47.67],[-56.26,47.66],[-56.33,47.65],[-56.46,47.62],[-56.72,47.59],[-56.77,47.56],[-56.95,47.57],[-57.47,47.63],[-57.66,47.63],[-57.88,47.66],[-57.93,47.67],[-58.24,47.67],[-58.33,47.68],[-58.33,47.72],[-58.34,47.73],[-58.43,47.68],[-58.51,47.65],[-58.61,47.63],[-58.94,47.58],[-59.12,47.57],[-59.22,47.6],[-59.26,47.63],[-59.32,47.74],[-59.36,47.87],[-59.36,47.89],[-59.34,47.93],[-59.27,48.0],[-58.96,48.16],[-58.71,48.33],[-58.6,48.41],[-58.5,48.44],[-58.34,48.51],[-58.33,48.52],[-58.49,48.51],[-58.61,48.53],[-58.72,48.54],[-58.94,48.52],[-59.17,48.52],[-59.17,48.56],[-59.06,48.63],[-58.84,48.75],[-58.82,48.75],[-58.89,48.69],[-58.91,48.65],[-58.88,48.62],[-58.84,48.61],[-58.72,48.6],[-58.69,48.62],[-58.64,48.75],[-58.55,48.9],[-58.49,49.0],[-58.4,49.08],[-58.36,49.1],[-58.32,49.08],[-58.19,49.06],[-58.05,48.99],[-58.01,48.98],[-57.99,48.99],[-58.04,49.01],[-58.08,49.04],[-58.1,49.08],[-58.05,49.18],[-57.99,49.21],[-57.98,49.23],[-58.1,49.23],[-58.19,49.26],[-58.22,49.31],[-58.21,49.39],[-58.18,49.44],[-58.11,49.5],[-58.02,49.54],[-57.96,49.53],[-57.86,49.47],[-57.79,49.49],[-57.8,49.51],[-57.9,49.6],[-57.93,49.67],[-57.93,49.7],[-57.71,50.02],[-57.61,50.2],[-57.47,50.46],[-57.43,50.51],[-57.36,50.58],[-57.33,50.61],[-57.24,50.61],[-57.18,50.61],[-57.26,50.65],[-57.29,50.67],[-57.3,50.7],[-57.27,50.73],[-57.24,50.74],[-57.13,50.79],[-57.05,50.86],[-57.01,50.94],[-57.01,50.97],[-57.04,51.0],[-57.04,51.01],[-56.98,51.03],[-56.83,51.13],[-56.81,51.14],[-56.75,51.27],[-56.68,51.33],[-56.62,51.36],[-56.52,51.4],[-56.21,51.49],[-56.03,51.57],[-55.9,51.56],[-55.87,51.51],[-55.69,51.47],[-55.66,51.51],[-55.7,51.56],[-55.67,51.58],[-55.52,51.6],[-55.5,51.59],[-55.45,51.56],[-55.46,51.54]],[[-127.92,51.47],[-127.94,51.46],[-127.98,51.46],[-128.04,51.47],[-128.09,51.51],[-128.15,51.63],[-128.14,51.65],[-128.12,51.67],[-128.03,51.71],[-128.0,51.7],[-127.99,51.67],[-127.93,51.61],[-127.92,51.59],[-127.92,51.51],[-127.92,51.47]],[[-55.36,51.89],[-55.41,51.89],[-55.42,51.9],[-55.4,51.94],[-55.35,51.98],[-55.27,52.0],[-55.29,51.93],[-55.36,51.89]],[[-79.38,51.95],[-79.43,51.94],[-79.52,51.95],[-79.6,51.98],[-79.64,52.01],[-79.33,52.1],[-79.27,52.09],[-79.27,52.07],[-79.32,52.02],[-79.33,51.99],[-79.35,51.97],[-79.38,51.95]],[[-131.03,51.96],[-131.05,51.96],[-131.08,51.98],[-131.1,52.01],[-131.12,52.1],[-131.11,52.14],[-131.1,52.15],[-131.01,52.1],[-131.03,51.96]],[[-128.37,52.4],[-128.45,52.39],[-128.42,52.44],[-128.41,52.47],[-128.43,52.5],[-128.44,52.56],[-128.44,52.7],[-128.36,52.78],[-128.25,52.78],[-128.25,52.74],[-128.3,52.55],[-128.32,52.46],[-128.34,52.43],[-128.37,52.4]],[[-128.94,52.51],[-128.97,52.46],[-129.1,52.57],[-129.15,52.61],[-129.25,52.72],[-129.27,52.77],[-129.26,52.8],[-129.25,52.81],[-129.22,52.8],[-129.19,52.79],[-128.99,52.66],[-128.94,52.6],[-128.94,52.51]],[[-129.31,52.99],[-129.33,52.98],[-129.37,53.0],[-129.41,53.02],[-129.48,53.1],[-129.5,53.13],[-129.51,53.18],[-129.5,53.19],[-129.47,53.18],[-129.45,53.17],[-129.34,53.05],[-129.31,52.99]],[[-80.73,52.75],[-80.8,52.73],[-81.01,52.76],[-81.1,52.78],[-81.35,52.85],[-81.84,52.96],[-82.01,53.01],[-82.04,53.05],[-81.95,53.13],[-81.9,53.17],[-81.85,53.19],[-81.34,53.22],[-81.14,53.21],[-80.9,53.04],[-80.77,52.92],[-80.71,52.83],[-80.71,52.79],[-80.73,52.75]],[[-131.75,53.2],[-131.65,53.1],[-131.62,53.02],[-131.63,52.92],[-131.8,52.89],[-131.88,52.91],[-131.92,52.91],[-131.97,52.88],[-131.9,52.87],[-131.81,52.82],[-131.73,52.76],[-131.61,52.75],[-131.46,52.7],[-131.57,52.62],[-131.59,52.58],[-131.44,52.45],[-131.43,52.42],[-131.38,52.42],[-131.27,52.43],[-131.26,52.42],[-131.26,52.39],[-131.33,52.32],[-131.32,52.3],[-131.26,52.29],[-131.14,52.29],[-131.12,52.22],[-131.22,52.15],[-131.42,52.24],[-131.51,52.32],[-131.56,52.4],[-131.62,52.44],[-131.81,52.54],[-132.09,52.75],[-132.17,52.78],[-132.24,52.87],[-132.26,52.91],[-132.26,52.93],[-132.23,52.95],[-132.14,52.96],[-132.14,53.0],[-132.47,53.07],[-132.5,53.09],[-132.55,53.14],[-132.52,53.14],[-132.35,53.14],[-132.15,53.16],[-132.04,53.18],[-131.99,53.2],[-131.89,53.23],[-131.85,53.23],[-131.75,53.2]],[[-128.55,52.94],[-128.51,52.62],[-128.51,52.52],[-128.58,52.45],[-128.62,52.34],[-128.68,52.29],[-128.73,52.36],[-128.74,52.47],[-128.75,52.56],[-128.77,52.6],[-128.75,52.76],[-128.77,52.75],[-128.83,52.68],[-128.9,52.67],[-129.02,52.76],[-129.08,52.82],[-129.09,52.89],[-129.18,52.96],[-129.18,52.99],[-129.18,53.02],[-129.11,53.09],[-129.08,53.14],[-129.06,53.24],[-129.03,53.28],[-128.97,53.27],[-128.86,53.23],[-128.74,53.18],[-128.63,53.11],[-128.55,52.94]],[[-129.17,53.12],[-129.17,53.11],[-129.28,53.11],[-129.31,53.12],[-129.32,53.14],[-129.33,53.17],[-129.31,53.21],[-129.25,53.29],[-129.25,53.32],[-129.24,53.33],[-129.2,53.29],[-129.18,53.26],[-129.17,53.12]],[[-79.94,53.3],[-79.94,53.27],[-80.0,53.28],[-80.04,53.3],[-80.07,53.32],[-80.07,53.34],[-80.05,53.36],[-79.97,53.35],[-79.94,53.3]],[[-129.85,53.17],[-129.87,53.16],[-129.93,53.18],[-130.15,53.35],[-130.31,53.41],[-130.41,53.49],[-130.52,53.54],[-130.45,53.63],[-130.39,53.62],[-130.2,53.55],[-130.04,53.48],[-129.94,53.44],[-129.75,53.24],[-129.77,53.22],[-129.85,53.17]],[[-130.24,53.96],[-130.27,53.92],[-130.34,53.87],[-130.38,53.84],[-130.41,53.86],[-130.47,53.86],[-130.54,53.92],[-130.59,53.94],[-130.62,53.94],[-130.64,53.92],[-130.65,53.89],[-130.64,53.86],[-130.64,53.84],[-130.66,53.85],[-130.68,53.86],[-130.7,53.89],[-130.71,53.92],[-130.7,53.95],[-130.65,53.99],[-130.49,54.07],[-130.45,54.09],[-130.4,54.09],[-130.32,54.05],[-130.3,54.04],[-130.24,53.96]],[[-132.66,54.13],[-132.56,54.07],[-132.34,54.11],[-132.3,54.1],[-132.26,54.08],[-132.22,54.03],[-132.17,53.96],[-132.16,53.88],[-132.18,53.85],[-132.21,53.81],[-132.56,53.69],[-132.57,53.68],[-132.57,53.66],[-132.53,53.65],[-132.46,53.65],[-132.19,53.68],[-132.17,53.71],[-132.15,53.81],[-132.11,53.86],[-132.11,53.9],[-132.14,54.0],[-132.13,54.03],[-131.94,54.04],[-131.82,54.08],[-131.7,54.14],[-131.67,54.14],[-131.69,54.02],[-131.7,53.99],[-131.82,53.84],[-131.89,53.71],[-131.92,53.59],[-131.93,53.38],[-131.96,53.31],[-132.01,53.27],[-132.35,53.19],[-132.52,53.19],[-132.67,53.26],[-132.75,53.31],[-132.69,53.37],[-132.65,53.37],[-132.55,53.36],[-132.46,53.34],[-132.43,53.34],[-132.43,53.35],[-132.67,53.46],[-132.85,53.51],[-132.9,53.56],[-132.9,53.61],[-132.91,53.63],[-133.05,53.78],[-133.08,53.84],[-133.1,53.92],[-133.1,54.01],[-133.06,54.14],[-133.05,54.16],[-132.99,54.16],[-132.89,54.14],[-132.66,54.13]],[[-130.93,54.48],[-130.95,54.48],[-130.96,54.5],[-130.95,54.54],[-130.92,54.61],[-130.91,54.63],[-130.78,54.62],[-130.76,54.61],[-130.75,54.6],[-130.76,54.58],[-130.81,54.54],[-130.93,54.48]],[[-130.58,54.77],[-130.49,54.83],[-130.31,54.95],[-130.21,55.03],[-130.2,54.95],[-130.35,54.81],[-130.54,54.75],[-130.58,54.77]],[[-60.99,56.04],[-60.98,56.02],[-61.14,56.03],[-61.19,56.05],[-61.2,56.06],[-61.19,56.09],[-61.16,56.12],[-61.09,56.14],[-61.05,56.13],[-60.97,56.1],[-60.96,56.08],[-60.99,56.04]],[[-78.83,56.15],[-78.88,56.13],[-78.91,56.13],[-78.91,56.17],[-78.86,56.23],[-78.83,56.29],[-78.82,56.34],[-78.8,56.38],[-78.76,56.42],[-78.72,56.44],[-78.67,56.44],[-78.66,56.32],[-78.67,56.26],[-78.71,56.21],[-78.76,56.17],[-78.83,56.15]],[[-79.98,56.21],[-80.03,56.2],[-80.09,56.21],[-80.06,56.29],[-80.01,56.32],[-79.87,56.35],[-79.85,56.37],[-79.81,56.38],[-79.75,56.38],[-79.68,56.4],[-79.61,56.46],[-79.58,56.47],[-79.63,56.39],[-79.69,56.33],[-79.98,56.21]],[[-78.94,56.27],[-79.02,56.16],[-79.08,56.07],[-79.18,55.89],[-79.23,55.88],[-79.27,55.92],[-79.14,56.14],[-79.14,56.16],[-79.14,56.18],[-79.18,56.21],[-79.22,56.18],[-79.41,55.93],[-79.46,55.9],[-79.5,55.87],[-79.53,55.87],[-79.61,55.88],[-79.76,55.81],[-79.5,56.09],[-79.49,56.11],[-79.54,56.13],[-79.56,56.12],[-79.78,55.94],[-79.9,55.87],[-79.99,55.89],[-80.01,55.91],[-80.0,55.93],[-79.79,56.11],[-79.6,56.24],[-79.52,56.33],[-79.48,56.4],[-79.47,56.46],[-79.47,56.52],[-79.46,56.54],[-79.45,56.54],[-79.44,56.51],[-79.43,56.45],[-79.48,56.31],[-79.51,56.25],[-79.55,56.19],[-79.54,56.18],[-79.46,56.21],[-79.39,56.28],[-79.34,56.38],[-79.31,56.46],[-79.27,56.6],[-79.26,56.6],[-79.25,56.57],[-79.21,56.55],[-79.16,56.54],[-79.12,56.52],[-79.1,56.47],[-79.08,56.45],[-78.99,56.44],[-78.96,56.42],[-78.94,56.37],[-78.94,56.34],[-78.93,56.33],[-78.91,56.32],[-78.94,56.27]],[[-79.52,56.66],[-79.55,56.64],[-79.58,56.64],[-79.55,56.73],[-79.58,56.76],[-79.58,56.78],[-79.57,56.8],[-79.55,56.8],[-79.51,56.77],[-79.49,56.74],[-79.48,56.71],[-79.48,56.69],[-79.5,56.67],[-79.52,56.66]],[[-79.87,56.77],[-79.89,56.76],[-79.94,56.78],[-79.95,56.83],[-79.9,56.87],[-79.86,56.86],[-79.83,56.84],[-79.84,56.82],[-79.87,56.77]],[[-61.74,57.55],[-61.66,57.52],[-61.64,57.42],[-61.8,57.42],[-61.98,57.5],[-62.01,57.55],[-62.01,57.56],[-61.98,57.57],[-61.94,57.55],[-61.89,57.57],[-61.85,57.58],[-61.74,57.55]],[[-79.72,57.52],[-79.73,57.51],[-79.78,57.51],[-79.79,57.45],[-79.81,57.44],[-79.84,57.48],[-79.82,57.52],[-79.82,57.54],[-79.81,57.56],[-79.77,57.6],[-79.74,57.61],[-79.73,57.6],[-79.71,57.56],[-79.72,57.52]],[[-69.16,59.04],[-69.22,58.97],[-69.3,58.98],[-69.33,58.96],[-69.35,58.96],[-69.32,59.03],[-69.31,59.07],[-69.33,59.12],[-69.3,59.14],[-69.2,59.15],[-69.19,59.09],[-69.18,59.07],[-69.16,59.06],[-69.16,59.04]],[[-80.29,59.62],[-80.32,59.62],[-80.32,59.63],[-80.3,59.67],[-80.26,59.68],[-80.21,59.72],[-80.17,59.71],[-80.18,59.68],[-80.24,59.64],[-80.29,59.62]],[[-80.06,59.77],[-80.17,59.76],[-80.12,59.82],[-80.08,59.85],[-80.04,59.87],[-79.96,59.88],[-79.9,59.85],[-79.95,59.81],[-80.06,59.77]],[[-64.41,60.37],[-64.44,60.3],[-64.56,60.32],[-64.74,60.38],[-64.81,60.41],[-64.83,60.45],[-64.84,60.5],[-64.78,60.51],[-64.65,60.51],[-64.53,60.44],[-64.5,60.43],[-64.41,60.37]],[[-68.23,60.24],[-68.32,60.23],[-68.37,60.25],[-68.37,60.31],[-68.34,60.36],[-68.23,60.46],[-68.14,60.56],[-68.09,60.59],[-67.98,60.57],[-67.91,60.54],[-67.85,60.49],[-67.82,60.45],[-67.84,60.39],[-67.92,60.34],[-68.01,60.3],[-68.23,60.24]],[[-78.53,60.73],[-78.67,60.72],[-78.67,60.73],[-78.61,60.77],[-78.4,60.81],[-78.24,60.82],[-78.28,60.78],[-78.37,60.76],[-78.53,60.73]],[[-64.83,61.37],[-64.86,61.35],[-64.88,61.36],[-64.95,61.41],[-65.05,61.43],[-65.09,61.45],[-65.39,61.56],[-65.43,61.61],[-65.43,61.65],[-65.33,61.67],[-65.13,61.69],[-64.95,61.69],[-64.79,61.66],[-64.76,61.64],[-64.67,61.59],[-64.69,61.54],[-64.7,61.47],[-64.73,61.44],[-64.79,61.41],[-64.83,61.37]],[[-93.04,61.84],[-93.08,61.84],[-93.18,61.89],[-93.2,61.92],[-93.08,61.94],[-92.99,61.89],[-93.0,61.87],[-93.04,61.84]],[[-65.03,61.88],[-65.01,61.87],[-64.98,61.88],[-64.96,61.87],[-64.95,61.84],[-64.92,61.82],[-64.87,61.8],[-64.85,61.78],[-64.85,61.76],[-64.9,61.73],[-64.93,61.73],[-65.17,61.8],[-65.23,61.86],[-65.24,61.9],[-65.21,61.93],[-65.17,61.94],[-65.13,61.94],[-65.07,61.93],[-65.03,61.88]],[[-79.55,62.41],[-79.47,62.38],[-79.34,62.29],[-79.29,62.25],[-79.27,62.19],[-79.31,62.1],[-79.32,62.03],[-79.37,61.97],[-79.46,61.89],[-79.54,61.81],[-79.61,61.71],[-79.67,61.64],[-79.71,61.61],[-79.76,61.6],[-79.82,61.59],[-79.9,61.63],[-80.0,61.7],[-80.09,61.75],[-80.2,61.78],[-80.27,61.82],[-80.28,61.86],[-80.28,61.99],[-80.28,62.05],[-80.26,62.11],[-80.23,62.15],[-80.18,62.21],[-80.02,62.34],[-79.93,62.39],[-79.87,62.4],[-79.71,62.4],[-79.65,62.4],[-79.6,62.41],[-79.55,62.41]],[[-64.82,62.56],[-64.63,62.55],[-64.52,62.55],[-64.47,62.54],[-64.42,62.49],[-64.48,62.42],[-64.55,62.39],[-64.66,62.38],[-64.84,62.41],[-64.9,62.42],[-64.96,62.46],[-64.93,62.49],[-64.84,62.49],[-64.83,62.5],[-64.85,62.53],[-64.85,62.54],[-64.82,62.56]],[[-74.0,62.62],[-74.05,62.61],[-74.25,62.62],[-74.5,62.67],[-74.63,62.71],[-74.62,62.73],[-74.56,62.73],[-74.5,62.73],[-74.39,62.7],[-74.11,62.68],[-74.02,62.66],[-73.99,62.64],[-74.0,62.62]],[[-70.34,62.55],[-70.41,62.54],[-70.54,62.55],[-70.69,62.57],[-70.77,62.6],[-70.84,62.65],[-70.85,62.7],[-70.99,62.79],[-71.14,62.82],[-71.22,62.87],[-71.13,62.88],[-71.01,62.87],[-70.83,62.84],[-70.67,62.81],[-70.44,62.73],[-70.37,62.67],[-70.29,62.62],[-70.27,62.58],[-70.29,62.56],[-70.34,62.55]],[[-82.0,62.95],[-81.96,62.93],[-81.95,62.88],[-81.96,62.83],[-81.99,62.78],[-82.03,62.73],[-82.11,62.65],[-82.39,62.52],[-82.49,62.45],[-82.57,62.4],[-83.02,62.21],[-83.07,62.2],[-83.13,62.2],[-83.25,62.23],[-83.38,62.24],[-83.7,62.16],[-83.71,62.17],[-83.73,62.26],[-83.76,62.3],[-83.9,62.4],[-83.91,62.43],[-83.91,62.45],[-83.9,62.48],[-83.74,62.57],[-83.38,62.9],[-83.29,62.92],[-83.11,62.88],[-83.03,62.87],[-82.97,62.87],[-82.71,62.94],[-82.46,62.94],[-82.23,62.98],[-82.13,62.98],[-82.05,62.97],[-82.0,62.95]],[[-77.88,63.47],[-77.79,63.43],[-77.7,63.43],[-77.65,63.4],[-77.54,63.29],[-77.53,63.27],[-77.53,63.23],[-77.59,63.19],[-77.66,63.16],[-77.79,63.13],[-77.94,63.11],[-78.02,63.14],[-78.26,63.24],[-78.47,63.36],[-78.54,63.42],[-78.51,63.45],[-78.42,63.47],[-78.23,63.49],[-77.93,63.48],[-77.88,63.47]],[[-76.68,63.39],[-76.78,63.38],[-76.92,63.41],[-77.06,63.45],[-77.36,63.59],[-77.13,63.68],[-76.76,63.57],[-76.65,63.5],[-76.68,63.39]],[[-77.64,63.99],[-77.71,63.95],[-77.93,63.96],[-77.96,63.98],[-77.97,63.99],[-77.93,64.01],[-77.71,64.04],[-77.62,64.04],[-77.57,64.03],[-77.56,64.02],[-77.64,63.99]],[[-84.92,65.26],[-84.89,65.25],[-84.84,65.26],[-84.77,65.31],[-84.61,65.45],[-84.57,65.46],[-84.5,65.46],[-84.27,65.37],[-84.18,65.32],[-84.13,65.25],[-84.08,65.22],[-83.9,65.18],[-83.72,65.17],[-83.49,65.13],[-83.41,65.1],[-83.22,64.97],[-83.2,64.96],[-82.99,64.9],[-82.67,64.78],[-82.59,64.76],[-82.27,64.72],[-82.16,64.69],[-82.05,64.64],[-81.93,64.56],[-81.79,64.43],[-81.68,64.21],[-81.67,64.17],[-81.68,64.15],[-81.72,64.12],[-81.9,64.03],[-81.89,64.02],[-81.72,64.02],[-81.34,64.08],[-81.1,64.04],[-81.02,64.03],[-81.01,64.03],[-80.92,64.1],[-80.83,64.09],[-80.69,64.02],[-80.61,63.97],[-80.57,63.93],[-80.58,63.91],[-80.67,63.9],[-80.45,63.86],[-80.26,63.8],[-80.3,63.76],[-80.5,63.67],[-80.71,63.6],[-80.95,63.48],[-81.01,63.46],[-81.05,63.46],[-81.18,63.48],[-81.37,63.54],[-81.96,63.66],[-82.15,63.69],[-82.38,63.71],[-82.41,63.74],[-82.47,63.93],[-82.57,63.96],[-82.93,64.0],[-83.03,64.02],[-83.04,64.06],[-83.02,64.13],[-83.07,64.16],[-83.19,64.16],[-83.3,64.14],[-83.49,64.1],[-83.58,64.06],[-83.62,64.01],[-83.64,63.92],[-83.66,63.87],[-83.73,63.81],[-84.02,63.66],[-84.14,63.61],[-84.26,63.6],[-84.31,63.59],[-84.39,63.53],[-84.51,63.39],[-84.55,63.35],[-84.63,63.31],[-84.8,63.25],[-84.96,63.2],[-85.24,63.14],[-85.39,63.12],[-85.5,63.14],[-85.57,63.27],[-85.71,63.66],[-85.74,63.68],[-85.77,63.7],[-85.8,63.71],[-86.3,63.66],[-86.58,63.66],[-86.85,63.58],[-86.92,63.57],[-87.05,63.57],[-87.15,63.59],[-87.18,63.6],[-87.19,63.63],[-87.19,63.67],[-87.15,63.71],[-87.03,63.83],[-86.93,63.9],[-86.89,63.92],[-86.42,64.05],[-86.31,64.09],[-86.25,64.14],[-86.25,64.18],[-86.27,64.24],[-86.35,64.38],[-86.37,64.5],[-86.37,64.57],[-86.34,64.66],[-86.23,64.9],[-86.19,65.01],[-86.11,65.42],[-86.07,65.53],[-86.02,65.64],[-85.96,65.7],[-85.81,65.83],[-85.7,65.88],[-85.55,65.92],[-85.52,65.91],[-85.5,65.9],[-85.44,65.85],[-85.24,65.8],[-85.18,65.75],[-85.13,65.69],[-85.11,65.62],[-85.13,65.59],[-85.23,65.55],[-85.24,65.53],[-85.24,65.51],[-85.06,65.44],[-84.92,65.26]],[[-84.67,65.58],[-84.73,65.56],[-84.78,65.57],[-84.83,65.6],[-84.87,65.65],[-84.93,65.69],[-85.07,65.74],[-85.1,65.76],[-85.14,65.82],[-85.14,65.89],[-85.17,65.94],[-85.18,65.97],[-85.15,66.02],[-85.03,66.03],[-84.94,66.01],[-84.92,66.0],[-84.89,65.97],[-84.87,65.94],[-84.76,65.86],[-84.69,65.79],[-84.6,65.66],[-84.6,65.63],[-84.63,65.6],[-84.67,65.58]],[[-83.73,65.8],[-83.6,65.76],[-83.47,65.74],[-83.26,65.72],[-83.23,65.72],[-83.23,65.7],[-83.26,65.67],[-83.33,65.63],[-83.38,65.63],[-83.5,65.66],[-83.54,65.67],[-83.58,65.7],[-83.61,65.7],[-83.64,65.69],[-83.64,65.68],[-83.63,65.66],[-83.65,65.66],[-83.79,65.67],[-83.81,65.68],[-83.8,65.71],[-83.7,65.76],[-83.79,65.77],[-83.81,65.79],[-83.94,65.76],[-84.01,65.75],[-84.12,65.77],[-84.13,65.88],[-84.14,65.92],[-84.19,65.94],[-84.22,65.97],[-84.27,65.99],[-84.37,66.01],[-84.45,66.06],[-84.47,66.09],[-84.46,66.11],[-84.41,66.13],[-84.12,66.08],[-83.95,66.03],[-83.79,65.97],[-83.7,65.92],[-83.69,65.89],[-83.71,65.86],[-83.77,65.83],[-83.73,65.8]],[[-83.12,66.28],[-83.02,66.27],[-82.95,66.27],[-82.93,66.26],[-83.01,66.21],[-83.06,66.2],[-83.15,66.23],[-83.21,66.28],[-83.23,66.3],[-83.24,66.33],[-83.22,66.34],[-83.12,66.28]],[[-108.09,67.01],[-107.97,67.0],[-107.81,67.0],[-107.83,66.92],[-107.9,66.87],[-107.94,66.86],[-107.97,66.88],[-108.06,66.95],[-108.09,67.01]],[[-62.68,67.06],[-62.81,67.03],[-62.87,67.06],[-62.83,67.07],[-62.76,67.11],[-62.66,67.15],[-62.63,67.18],[-62.47,67.19],[-62.42,67.19],[-62.4,67.18],[-62.48,67.13],[-62.68,67.06]],[[-107.9,67.4],[-107.95,67.32],[-107.97,67.33],[-108.0,67.37],[-108.07,67.39],[-108.15,67.43],[-108.15,67.52],[-108.12,67.57],[-108.13,67.63],[-108.05,67.66],[-107.99,67.62],[-107.97,67.55],[-107.99,67.51],[-107.93,67.48],[-107.91,67.47],[-107.89,67.44],[-107.9,67.4]],[[-109.17,67.98],[-109.05,67.97],[-108.97,67.98],[-108.91,67.94],[-108.89,67.9],[-108.89,67.88],[-108.92,67.88],[-109.1,67.92],[-109.16,67.95],[-109.18,67.97],[-109.17,67.98]],[[-73.62,67.78],[-74.11,67.78],[-74.37,67.79],[-74.48,67.8],[-74.57,67.83],[-74.68,67.91],[-74.75,67.98],[-74.75,68.02],[-74.73,68.05],[-74.71,68.07],[-74.38,68.09],[-74.11,68.06],[-73.88,68.02],[-73.58,68.02],[-73.49,68.0],[-73.46,67.99],[-73.44,67.97],[-73.4,67.88],[-73.4,67.83],[-73.41,67.79],[-73.62,67.78]],[[-109.32,67.99],[-109.36,67.99],[-109.5,68.05],[-109.47,68.1],[-109.34,68.05],[-109.32,68.01],[-109.32,67.99]],[[-86.6,67.74],[-86.64,67.73],[-86.71,67.75],[-86.86,67.81],[-86.89,67.84],[-86.91,67.87],[-86.91,67.9],[-86.89,67.94],[-86.85,68.01],[-86.94,68.07],[-86.96,68.1],[-86.95,68.12],[-86.9,68.16],[-86.88,68.19],[-86.83,68.23],[-86.7,68.31],[-86.57,68.29],[-86.45,68.23],[-86.42,68.18],[-86.43,68.14],[-86.42,68.07],[-86.39,67.99],[-86.38,67.93],[-86.4,67.89],[-86.45,67.82],[-86.49,67.78],[-86.55,67.75],[-86.6,67.74]],[[-75.68,68.32],[-75.15,68.23],[-75.1,68.2],[-75.08,68.17],[-75.06,68.14],[-75.06,68.08],[-75.07,68.05],[-75.12,67.99],[-75.13,67.97],[-75.09,67.75],[-75.09,67.63],[-75.13,67.54],[-75.2,67.46],[-75.31,67.4],[-75.4,67.37],[-75.78,67.28],[-76.05,67.26],[-76.33,67.26],[-76.69,67.24],[-76.86,67.24],[-76.94,67.25],[-77.0,67.27],[-77.08,67.32],[-77.16,67.41],[-77.22,67.51],[-77.3,67.69],[-77.31,67.71],[-77.23,67.85],[-77.13,67.95],[-76.94,68.09],[-76.74,68.23],[-76.69,68.25],[-76.6,68.28],[-76.36,68.32],[-76.17,68.31],[-76.09,68.31],[-75.98,68.33],[-75.87,68.34],[-75.68,68.32]],[[-78.98,68.19],[-79.06,68.18],[-79.17,68.23],[-79.17,68.26],[-79.15,68.34],[-78.95,68.35],[-78.87,68.31],[-78.83,68.27],[-78.98,68.19]],[[-104.54,68.41],[-104.6,68.4],[-104.7,68.42],[-104.85,68.45],[-104.97,68.49],[-105.04,68.53],[-105.05,68.56],[-104.99,68.57],[-104.91,68.58],[-104.7,68.58],[-104.6,68.56],[-104.47,68.5],[-104.44,68.47],[-104.44,68.45],[-104.46,68.43],[-104.54,68.41]],[[-74.88,68.35],[-74.96,68.34],[-75.07,68.4],[-75.31,68.47],[-75.4,68.53],[-75.4,68.55],[-75.4,68.59],[-75.37,68.64],[-75.29,68.69],[-75.2,68.7],[-75.07,68.68],[-74.98,68.65],[-74.88,68.54],[-74.82,68.49],[-74.8,68.46],[-74.83,68.44],[-74.83,68.42],[-74.81,68.41],[-74.82,68.39],[-74.84,68.37],[-74.88,68.35]],[[-101.85,68.59],[-101.89,68.58],[-101.94,68.6],[-102.27,68.66],[-102.31,68.68],[-102.27,68.71],[-102.15,68.74],[-102.07,68.77],[-102.01,68.83],[-101.83,68.8],[-101.76,68.77],[-101.73,68.75],[-101.72,68.72],[-101.73,68.65],[-101.79,68.64],[-101.85,68.59]],[[-100.22,68.81],[-100.25,68.78],[-100.29,68.77],[-100.37,68.73],[-100.4,68.72],[-100.44,68.75],[-100.48,68.79],[-100.5,68.79],[-100.52,68.79],[-100.57,68.77],[-100.6,68.77],[-100.62,68.78],[-100.63,68.82],[-100.62,68.87],[-100.6,68.94],[-100.6,68.97],[-100.61,68.99],[-100.6,69.01],[-100.57,69.03],[-100.52,69.04],[-100.41,69.03],[-100.33,69.0],[-100.29,68.96],[-100.21,68.93],[-100.18,68.9],[-100.22,68.81]],[[-99.99,69.01],[-100.02,68.95],[-100.14,68.97],[-100.2,68.99],[-100.24,69.04],[-100.25,69.05],[-100.24,69.07],[-100.19,69.11],[-100.15,69.13],[-100.07,69.11],[-100.04,69.09],[-100.01,69.05],[-99.99,69.01]],[[-90.49,69.22],[-90.57,69.21],[-90.63,69.25],[-90.67,69.26],[-90.69,69.29],[-90.77,69.29],[-90.77,69.34],[-90.74,69.36],[-90.66,69.37],[-90.6,69.37],[-90.54,69.32],[-90.51,69.29],[-90.49,69.25],[-90.49,69.22]],[[-79.21,68.85],[-79.28,68.84],[-79.36,68.86],[-79.39,68.89],[-79.41,68.92],[-79.39,68.94],[-79.35,68.96],[-79.31,68.99],[-79.24,69.05],[-79.14,69.09],[-78.93,69.12],[-78.9,69.14],[-78.8,69.24],[-78.77,69.25],[-78.66,69.26],[-78.65,69.28],[-78.69,69.3],[-78.69,69.33],[-78.65,69.35],[-78.6,69.37],[-78.46,69.39],[-78.33,69.39],[-78.3,69.38],[-78.27,69.36],[-78.23,69.31],[-78.23,69.3],[-78.29,69.26],[-78.44,69.2],[-78.53,69.15],[-78.55,69.13],[-78.56,69.11],[-78.6,69.08],[-78.71,69.01],[-78.78,68.95],[-78.85,68.92],[-79.05,68.88],[-79.21,68.85]],[[-90.2,69.42],[-90.18,69.36],[-90.27,69.27],[-90.3,69.26],[-90.33,69.25],[-90.36,69.26],[-90.46,69.33],[-90.49,69.37],[-90.46,69.39],[-90.38,69.42],[-90.32,69.43],[-90.25,69.42],[-90.23,69.44],[-90.2,69.42]],[[-77.0,69.14],[-77.12,69.13],[-77.22,69.14],[-77.28,69.16],[-77.32,69.19],[-77.38,69.27],[-77.36,69.31],[-77.35,69.38],[-77.34,69.4],[-77.32,69.42],[-77.19,69.44],[-77.11,69.44],[-76.99,69.41],[-76.75,69.4],[-76.68,69.38],[-76.67,69.37],[-76.67,69.35],[-76.69,69.33],[-76.81,69.27],[-76.87,69.22],[-76.91,69.17],[-77.0,69.14]],[[-101.17,69.4],[-101.25,69.39],[-101.27,69.39],[-101.26,69.42],[-101.27,69.43],[-101.29,69.44],[-101.22,69.46],[-101.21,69.48],[-101.23,69.49],[-101.33,69.52],[-101.36,69.54],[-101.35,69.56],[-101.31,69.58],[-101.24,69.57],[-101.1,69.54],[-101.03,69.5],[-101.0,69.46],[-101.05,69.46],[-101.09,69.44],[-101.13,69.41],[-101.17,69.4]],[[-95.51,69.57],[-95.38,69.51],[-95.38,69.47],[-95.4,69.42],[-95.44,69.38],[-95.5,69.35],[-95.58,69.34],[-95.68,69.34],[-95.73,69.35],[-95.7,69.39],[-95.67,69.4],[-95.67,69.44],[-95.68,69.5],[-95.7,69.54],[-95.76,69.56],[-95.81,69.56],[-95.82,69.54],[-95.8,69.5],[-95.81,69.45],[-95.86,69.38],[-95.89,69.35],[-95.96,69.37],[-95.99,69.39],[-95.98,69.43],[-95.99,69.47],[-95.98,69.51],[-95.94,69.57],[-95.88,69.61],[-95.8,69.63],[-95.71,69.62],[-95.6,69.6],[-95.51,69.57]],[[-139.04,69.58],[-139.13,69.54],[-139.26,69.58],[-139.29,69.6],[-139.14,69.65],[-139.07,69.65],[-138.93,69.62],[-138.88,69.59],[-139.04,69.58]],[[-67.91,69.54],[-67.94,69.53],[-68.2,69.58],[-68.22,69.62],[-68.09,69.66],[-67.99,69.68],[-67.91,69.68],[-67.83,69.68],[-67.75,69.63],[-67.84,69.59],[-67.91,69.54]],[[-78.03,69.71],[-77.98,69.66],[-77.97,69.64],[-78.04,69.61],[-78.31,69.55],[-78.47,69.5],[-78.55,69.49],[-78.66,69.5],[-78.8,69.48],[-78.85,69.48],[-78.79,69.52],[-78.58,69.64],[-78.4,69.65],[-78.34,69.67],[-78.3,69.67],[-78.27,69.69],[-78.26,69.72],[-78.2,69.74],[-78.15,69.74],[-78.03,69.71]],[[-79.43,69.79],[-79.39,69.73],[-79.36,69.71],[-79.4,69.69],[-79.55,69.63],[-79.88,69.61],[-80.05,69.63],[-79.97,69.56],[-79.95,69.52],[-79.98,69.51],[-80.05,69.51],[-80.16,69.54],[-80.23,69.56],[-80.24,69.59],[-80.27,69.6],[-80.3,69.58],[-80.33,69.59],[-80.4,69.63],[-80.45,69.65],[-80.78,69.68],[-80.79,69.69],[-80.78,69.71],[-80.73,69.74],[-80.65,69.75],[-80.47,69.74],[-80.45,69.74],[-80.44,69.78],[-80.42,69.8],[-80.29,69.79],[-80.21,69.8],[-80.17,69.78],[-80.12,69.74],[-80.06,69.75],[-79.97,69.74],[-79.87,69.76],[-79.71,69.8],[-79.59,69.81],[-79.43,69.79]],[[-97.44,69.64],[-97.41,69.63],[-97.35,69.64],[-97.31,69.67],[-97.28,69.68],[-97.24,69.67],[-97.1,69.61],[-96.99,69.55],[-96.88,69.51],[-96.69,69.47],[-96.3,69.34],[-96.18,69.26],[-96.06,69.13],[-95.95,69.02],[-95.85,68.95],[-95.75,68.9],[-95.59,68.84],[-95.44,68.88],[-95.37,68.89],[-95.32,68.87],[-95.27,68.83],[-95.3,68.81],[-95.36,68.78],[-95.47,68.75],[-95.61,68.75],[-95.69,68.74],[-95.8,68.69],[-95.89,68.63],[-96.02,68.61],[-96.27,68.51],[-96.4,68.47],[-96.6,68.46],[-97.01,68.54],[-97.26,68.53],[-97.47,68.54],[-97.7,68.63],[-97.89,68.67],[-98.24,68.74],[-98.26,68.75],[-98.27,68.77],[-98.28,68.81],[-98.3,68.83],[-98.32,68.84],[-98.38,68.84],[-98.43,68.82],[-98.54,68.8],[-98.7,68.8],[-98.78,68.82],[-98.83,68.84],[-98.86,68.86],[-98.86,68.89],[-98.88,68.92],[-98.9,68.93],[-98.96,68.93],[-99.06,68.92],[-99.09,68.9],[-99.07,68.88],[-99.09,68.86],[-99.25,68.86],[-99.32,68.88],[-99.44,68.92],[-99.49,68.96],[-99.56,69.03],[-99.56,69.05],[-99.51,69.1],[-99.46,69.13],[-99.09,69.15],[-98.91,69.17],[-98.72,69.22],[-98.5,69.31],[-98.46,69.33],[-98.45,69.35],[-98.47,69.38],[-98.54,69.43],[-98.56,69.46],[-98.54,69.48],[-98.45,69.48],[-98.49,69.5],[-98.53,69.53],[-98.55,69.54],[-98.55,69.57],[-98.48,69.58],[-98.39,69.57],[-98.22,69.48],[-98.16,69.47],[-98.04,69.46],[-98.16,69.51],[-98.29,69.63],[-98.3,69.67],[-98.3,69.69],[-98.27,69.75],[-98.24,69.78],[-98.2,69.8],[-98.08,69.83],[-97.89,69.86],[-97.79,69.86],[-97.69,69.84],[-97.6,69.8],[-97.41,69.74],[-97.38,69.71],[-97.39,69.7],[-97.46,69.68],[-97.47,69.67],[-97.44,69.64]],[[-86.91,70.11],[-86.8,70.11],[-86.69,70.12],[-86.61,70.11],[-86.56,70.08],[-86.53,70.05],[-86.52,70.02],[-86.56,70.0],[-86.73,69.98],[-86.85,69.99],[-86.98,70.01],[-87.04,70.0],[-87.19,70.02],[-87.26,70.04],[-87.32,70.08],[-87.32,70.1],[-87.17,70.13],[-87.11,70.15],[-86.91,70.11]],[[-100.31,70.5],[-100.32,70.49],[-100.54,70.53],[-100.62,70.55],[-100.65,70.56],[-100.67,70.6],[-100.68,70.65],[-100.64,70.67],[-100.54,70.67],[-100.43,70.65],[-100.28,70.59],[-100.32,70.58],[-100.32,70.54],[-100.31,70.51],[-100.31,70.5]],[[-74.71,45.0],[-74.76,45.0],[-74.86,45.0],[-75.0,44.97],[-75.18,44.9],[-75.4,44.77],[-75.79,44.5],[-75.82,44.47],[-75.88,44.42],[-76.02,44.36],[-76.15,44.3],[-76.19,44.24],[-76.25,44.21],[-76.46,44.06],[-76.59,43.92],[-76.7,43.78],[-76.82,43.63],[-77.07,43.63],[-77.27,43.63],[-77.6,43.63],[-77.88,43.63],[-78.21,43.63],[-78.46,43.63],[-78.72,43.62],[-78.85,43.58],[-79.0,43.53],[-79.17,43.47],[-79.08,43.33],[-79.06,43.28],[-79.07,43.11],[-79.05,43.09],[-79.03,43.06],[-79.03,43.02],[-79.01,43.0],[-78.98,42.98],[-78.95,42.96],[-78.92,42.94],[-78.92,42.91],[-78.94,42.86],[-79.04,42.8],[-79.17,42.75],[-79.45,42.65],[-79.76,42.54],[-80.04,42.44],[-80.25,42.37],[-80.68,42.3],[-81.03,42.25],[-81.28,42.21],[-81.51,42.1],[-81.76,41.99],[-81.97,41.89],[-82.21,41.78],[-82.44,41.67],[-82.69,41.68],[-82.87,41.75],[-83.03,41.83],[-83.14,41.98],[-83.15,42.14],[-83.11,42.25],[-83.07,42.3],[-83.0,42.33],[-82.87,42.39],[-82.74,42.49],[-82.65,42.56],[-82.55,42.62],[-82.49,42.74],[-82.42,43.02],[-82.41,43.07],[-82.3,43.26],[-82.19,43.47],[-82.14,43.57],[-82.2,43.82],[-82.24,44.02],[-82.28,44.19],[-82.33,44.39],[-82.37,44.57],[-82.41,44.74],[-82.45,44.92],[-82.49,45.08],[-82.52,45.2],[-82.55,45.35],[-82.76,45.45],[-82.92,45.52],[-83.18,45.63],[-83.4,45.73],[-83.59,45.82],[-83.47,45.99],[-83.48,46.02],[-83.52,46.06],[-83.62,46.12],[-83.67,46.12],[-83.76,46.11],[-83.91,46.07],[-83.98,46.08],[-84.03,46.15],[-84.09,46.23],[-84.11,46.29],[-84.12,46.37],[-84.15,46.44],[-84.13,46.48],[-84.12,46.5],[-84.13,46.53],[-84.15,46.54],[-84.19,46.55],[-84.34,46.52],[-84.4,46.52],[-84.44,46.5],[-84.5,46.46],[-84.56,46.46],[-84.67,46.54],[-84.78,46.64],[-84.83,46.77],[-84.88,46.9],[-85.07,46.98],[-85.26,47.06],[-85.46,47.14],[-85.65,47.22],[-85.85,47.3],[-86.04,47.38],[-86.23,47.46],[-86.43,47.54],[-86.5,47.57],[-86.67,47.64],[-86.92,47.74],[-87.21,47.85],[-87.49,47.96],[-87.74,48.06],[-87.92,48.13],[-87.99,48.16],[-88.16,48.23],[-88.38,48.3],[-88.61,48.26],[-88.9,48.16],[-89.06,48.09],[-89.19,48.05],[-89.27,48.02],[-89.46,48.0],[-89.55,48.0],[-89.78,48.02],[-89.9,48.0],[-89.99,48.02],[-90.04,48.08],[-90.09,48.12],[-90.32,48.1],[-90.61,48.11],[-90.74,48.1],[-90.8,48.13],[-90.84,48.2],[-90.92,48.21],[-91.04,48.19],[-91.22,48.1],[-91.39,48.06],[-91.52,48.06],[-91.65,48.1],[-91.86,48.2],[-92.01,48.3],[-92.17,48.34],[-92.3,48.33],[-92.35,48.28],[-92.41,48.28],[-92.46,48.37],[-92.5,48.44],[-92.58,48.47],[-92.73,48.53],[-92.84,48.57],[-93.0,48.61],[-93.05,48.62],[-93.16,48.63],[-93.26,48.63],[-93.38,48.62],[-93.46,48.56],[-93.56,48.54],[-93.71,48.53],[-93.8,48.55],[-93.85,48.61],[-94.06,48.66],[-94.41,48.7],[-94.62,48.74],[-94.68,48.77],[-94.71,48.81],[-94.71,48.86],[-94.71,48.86],[-94.8,49.0],[-94.84,49.12],[-94.86,49.26],[-94.85,49.3],[-94.87,49.32],[-94.94,49.35],[-95.16,49.37],[-95.16,49.2],[-95.16,48.99],[-95.4,48.99],[-95.82,48.99],[-96.25,48.99],[-96.68,48.99],[-97.1,48.99],[-97.53,48.99],[-97.96,48.99],[-98.38,48.99],[-98.81,48.99],[-99.24,48.99],[-99.66,48.99],[-100.09,48.99],[-100.51,48.99],[-100.94,48.99],[-101.37,48.99],[-101.79,48.99],[-102.22,48.99],[-102.65,48.99],[-103.07,48.99],[-103.5,48.99],[-103.93,48.99],[-104.35,48.99],[-104.78,48.99],[-105.2,48.99],[-105.63,48.99],[-106.06,48.99],[-106.48,48.99],[-106.91,48.99],[-107.34,48.99],[-107.76,48.99],[-108.19,48.99],[-108.62,48.99],[-109.04,48.99],[-109.47,48.99],[-109.89,48.99],[-110.32,48.99],[-110.75,48.99],[-111.17,48.99],[-111.6,48.99],[-112.03,48.99],[-112.45,48.99],[-112.88,48.99],[-113.31,48.99],[-113.73,48.99],[-114.16,48.99],[-114.59,48.99],[-115.01,48.99],[-115.44,48.99],[-115.86,48.99],[-116.29,48.99],[-116.72,48.99],[-117.14,48.99],[-117.57,48.99],[-118.0,48.99],[-118.42,48.99],[-118.85,48.99],[-119.28,48.99],[-119.7,48.99],[-120.13,48.99],[-120.55,48.99],[-120.98,48.99],[-121.41,48.99],[-121.83,48.99],[-122.26,48.99],[-122.69,48.99],[-122.79,48.99],[-122.83,49.03],[-122.92,49.07],[-122.96,49.07],[-123.0,49.06],[-123.03,49.04],[-123.05,48.99],[-123.06,48.98],[-123.08,48.98],[-123.09,48.99],[-123.12,49.06],[-123.11,49.08],[-123.08,49.12],[-123.08,49.13],[-123.15,49.12],[-123.18,49.13],[-123.2,49.15],[-123.19,49.22],[-123.23,49.26],[-123.18,49.28],[-123.07,49.29],[-122.95,49.29],[-122.91,49.32],[-122.88,49.4],[-122.96,49.33],[-123.02,49.32],[-123.17,49.35],[-123.28,49.34],[-123.29,49.36],[-123.29,49.37],[-123.26,49.39],[-123.25,49.44],[-123.22,49.59],[-123.19,49.64],[-123.18,49.67],[-123.19,49.68],[-123.32,49.58],[-123.34,49.55],[-123.32,49.52],[-123.34,49.46],[-123.4,49.44],[-123.44,49.45],[-123.51,49.4],[-123.53,49.4],[-123.86,49.48],[-123.89,49.49],[-123.95,49.53],[-124.03,49.6],[-124.05,49.66],[-124.02,49.71],[-123.99,49.74],[-123.96,49.74],[-123.92,49.72],[-123.85,49.64],[-123.82,49.59],[-123.74,49.59],[-123.61,49.66],[-123.58,49.68],[-123.71,49.66],[-123.76,49.66],[-123.82,49.69],[-123.87,49.74],[-123.9,49.8],[-123.9,49.98],[-123.88,50.02],[-123.82,50.04],[-123.78,50.09],[-123.79,50.11],[-123.83,50.14],[-123.88,50.17],[-123.93,50.19],[-123.95,50.18],[-123.86,50.1],[-123.87,50.07],[-123.96,49.99],[-123.97,49.97],[-123.97,49.89],[-123.98,49.88],[-124.06,49.85],[-124.14,49.79],[-124.28,49.77],[-124.41,49.78],[-124.48,49.81],[-124.7,49.96],[-124.78,50.02],[-124.78,50.07],[-124.93,50.26],[-124.93,50.3],[-124.99,50.36],[-125.04,50.36],[-125.06,50.42],[-124.94,50.54],[-124.86,50.64],[-124.85,50.67],[-124.86,50.72],[-124.88,50.83],[-124.86,50.87],[-124.93,50.81],[-124.95,50.76],[-124.93,50.72],[-124.94,50.67],[-124.99,50.59],[-125.06,50.51],[-125.21,50.48],[-125.48,50.5],[-125.51,50.51],[-125.53,50.53],[-125.54,50.65],[-125.56,50.63],[-125.59,50.57],[-125.61,50.49],[-125.64,50.47],[-125.7,50.46],[-125.74,50.48],[-125.77,50.51],[-125.84,50.51],[-125.97,50.49],[-126.02,50.5],[-126.09,50.5],[-126.24,50.52],[-126.4,50.53],[-126.45,50.55],[-126.45,50.59],[-126.42,50.61],[-126.24,50.62],[-126.07,50.66],[-125.9,50.68],[-125.9,50.7],[-125.98,50.71],[-126.37,50.67],[-126.49,50.67],[-126.51,50.68],[-126.52,50.72],[-126.47,50.77],[-126.4,50.81],[-126.37,50.84],[-126.42,50.85],[-126.49,50.84],[-126.52,50.87],[-126.48,50.96],[-126.52,51.06],[-126.56,50.97],[-126.63,50.92],[-126.96,50.89],[-127.01,50.87],[-127.06,50.87],[-127.27,50.92],[-127.36,50.95],[-127.44,50.99],[-127.59,51.09],[-127.71,51.15],[-127.71,51.27],[-127.69,51.34],[-127.63,51.43],[-127.42,51.61],[-127.35,51.64],[-127.28,51.65],[-126.97,51.67],[-126.74,51.69],[-126.69,51.7],[-127.03,51.72],[-127.34,51.71],[-127.44,51.68],[-127.58,51.56],[-127.61,51.51],[-127.64,51.48],[-127.67,51.48],[-127.71,51.49],[-127.73,51.51],[-127.75,51.54],[-127.82,51.6],[-127.85,51.67],[-127.87,51.78],[-127.86,51.82],[-127.83,51.88],[-127.73,51.99],[-127.86,51.99],[-127.84,52.09],[-127.8,52.19],[-127.67,52.25],[-127.55,52.3],[-127.44,52.36],[-127.24,52.4],[-127.18,52.31],[-127.01,52.29],[-126.96,52.25],[-126.9,52.19],[-126.83,52.13],[-126.74,52.06],[-126.71,52.06],[-126.75,52.11],[-126.9,52.23],[-126.9,52.27],[-126.94,52.31],[-127.13,52.37],[-127.16,52.39],[-127.19,52.46],[-127.21,52.5],[-127.19,52.54],[-127.0,52.66],[-126.95,52.72],[-126.95,52.75],[-126.97,52.78],[-127.01,52.84],[-127.02,52.84],[-127.01,52.75],[-127.01,52.72],[-127.03,52.68],[-127.07,52.65],[-127.11,52.63],[-127.52,52.36],[-127.56,52.34],[-127.71,52.32],[-127.79,52.29],[-127.83,52.25],[-127.9,52.15],[-128.0,51.95],[-128.1,51.79],[-128.19,52.0],[-128.36,52.16],[-128.04,52.32],[-128.03,52.34],[-128.06,52.43],[-128.05,52.45],[-128.02,52.49],[-127.94,52.55],[-127.94,52.55],[-128.04,52.53],[-128.18,52.41],[-128.24,52.37],[-128.27,52.36],[-128.28,52.44],[-128.2,52.62],[-128.13,52.81],[-128.11,52.86],[-128.05,52.91],[-128.11,52.91],[-128.37,52.83],[-128.45,52.88],[-128.52,53.14],[-128.65,53.24],[-128.87,53.33],[-129.08,53.37],[-129.13,53.44],[-129.17,53.53],[-129.11,53.64],[-129.02,53.69],[-128.94,53.72],[-128.85,53.7],[-128.85,53.67],[-128.91,53.56],[-128.83,53.55],[-128.54,53.42],[-128.48,53.41],[-128.36,53.46],[-128.29,53.46],[-128.13,53.42],[-128.08,53.37],[-127.93,53.27],[-127.95,53.33],[-128.12,53.45],[-128.21,53.48],[-128.37,53.49],[-128.47,53.47],[-128.51,53.48],[-128.6,53.51],[-128.68,53.55],[-128.75,53.66],[-128.77,53.71],[-128.76,53.75],[-128.75,53.78],[-128.71,53.81],[-128.65,53.83],[-128.56,53.85],[-128.53,53.86],[-128.65,53.92],[-128.7,53.92],[-128.89,53.83],[-128.93,53.82],[-128.94,53.84],[-128.96,53.84],[-129.01,53.8],[-129.06,53.78],[-129.21,53.64],[-129.23,53.58],[-129.24,53.48],[-129.26,53.42],[-129.28,53.39],[-129.46,53.35],[-129.56,53.25],[-129.69,53.33],[-129.82,53.41],[-129.91,53.55],[-130.07,53.58],[-130.26,53.65],[-130.34,53.72],[-130.23,53.87],[-130.09,53.98],[-130.06,54.11],[-130.04,54.13],[-129.79,54.17],[-129.63,54.23],[-129.79,54.24],[-129.9,54.23],[-130.08,54.18],[-130.29,54.27],[-130.4,54.35],[-130.43,54.42],[-130.39,54.48],[-130.39,54.54],[-130.37,54.62],[-130.35,54.66],[-130.31,54.7],[-130.22,54.73],[-130.14,54.82],[-130.11,54.89],[-129.95,55.08],[-129.89,55.16],[-129.78,55.28],[-129.56,55.46],[-129.63,55.45],[-129.67,55.44],[-129.7,55.44],[-129.73,55.46],[-129.77,55.5],[-129.8,55.56],[-129.81,55.53],[-129.82,55.42],[-129.84,55.32],[-129.88,55.25],[-129.99,55.11],[-130.05,55.06],[-130.09,55.11],[-130.06,55.19],[-130.0,55.26],[-129.99,55.36],[-130.04,55.47],[-130.08,55.56],[-130.09,55.63],[-130.09,55.69],[-130.09,55.75],[-130.06,55.81],[-130.02,55.88],[-130.03,55.89],[-130.01,55.95],[-130.02,56.01],[-130.06,56.07],[-130.1,56.11],[-130.21,56.08],[-130.41,56.12],[-130.48,56.23],[-130.65,56.26],[-130.74,56.34],[-130.93,56.38],[-131.08,56.4],[-131.2,56.45],[-131.34,56.5],[-131.47,56.56],[-131.58,56.6],[-131.65,56.6],[-131.82,56.59],[-131.83,56.68],[-131.89,56.74],[-131.87,56.79],[-131.96,56.82],[-132.1,56.86],[-132.06,56.95],[-132.03,57.03],[-132.16,57.05],[-132.34,57.08],[-132.28,57.15],[-132.23,57.2],[-132.3,57.28],[-132.44,57.41],[-132.55,57.5],[-132.69,57.65],[-132.82,57.77],[-132.92,57.88],[-133.0,57.95],[-133.12,58.08],[-133.28,58.22],[-133.42,58.34],[-133.4,58.41],[-133.55,58.5],[-133.67,58.6],[-133.82,58.71],[-133.97,58.76],[-134.07,58.8],[-134.22,58.85],[-134.3,58.9],[-134.33,58.94],[-134.36,58.97],[-134.39,59.01],[-134.41,59.06],[-134.44,59.09],[-134.62,59.16],[-134.68,59.2],[-134.8,59.25],[-134.91,59.27],[-134.94,59.29],[-135.07,59.44],[-135.05,59.5],[-135.04,59.55],[-135.05,59.58],[-135.26,59.7],[-135.37,59.74],[-135.48,59.79],[-135.7,59.73],[-135.93,59.66],[-136.1,59.64],[-136.32,59.6],[-136.25,59.53],[-136.28,59.48],[-136.35,59.46],[-136.47,59.46],[-136.47,59.28],[-136.58,59.15],[-136.81,59.15],[-136.94,59.11],[-137.13,59.04],[-137.28,58.99],[-137.44,58.9],[-137.52,58.92],[-137.48,58.99],[-137.54,59.12],[-137.59,59.23],[-137.7,59.28],[-137.87,59.37],[-138.0,59.44],[-138.19,59.54],[-138.32,59.61],[-138.45,59.68],[-138.63,59.78],[-138.71,59.9],[-138.87,59.95],[-139.04,59.99],[-139.19,60.08],[-139.14,60.17],[-139.08,60.28],[-139.08,60.34],[-139.23,60.34],[-139.47,60.33],[-139.68,60.33],[-139.83,60.25],[-139.97,60.18],[-140.2,60.24],[-140.45,60.3],[-140.53,60.22],[-140.76,60.26],[-141.0,60.3],[-141.0,60.59],[-141.0,60.88],[-141.0,61.18],[-141.0,61.47],[-141.0,61.76],[-141.0,62.05],[-141.0,62.35],[-141.0,62.64],[-141.0,62.93],[-141.0,63.22],[-141.0,63.51],[-141.0,63.81],[-141.0,64.1],[-141.0,64.39],[-141.0,64.68],[-141.0,64.98],[-141.0,65.27],[-141.0,65.56],[-141.0,65.85],[-141.0,66.14],[-141.0,66.44],[-141.0,66.73],[-141.0,67.02],[-141.0,67.31],[-141.0,67.61],[-141.0,67.9],[-141.0,68.19],[-141.0,68.48],[-141.0,68.77],[-141.0,69.07],[-141.0,69.36],[-141.0,69.65],[-140.86,69.64],[-140.41,69.6],[-139.98,69.62],[-139.18,69.52],[-138.69,69.32],[-138.29,69.22],[-138.13,69.15],[-137.87,69.09],[-137.26,68.96],[-137.07,68.95],[-136.72,68.89],[-136.5,68.9],[-136.12,68.88],[-135.87,68.83],[-135.36,68.7],[-135.26,68.68],[-135.23,68.69],[-135.41,68.83],[-135.43,68.84],[-135.64,68.89],[-135.88,68.92],[-135.89,68.93],[-135.94,68.97],[-135.92,68.99],[-135.87,69.0],[-135.7,69.0],[-135.59,69.01],[-135.58,69.03],[-135.65,69.03],[-135.74,69.05],[-135.85,69.08],[-135.91,69.11],[-135.69,69.31],[-135.61,69.29],[-135.5,69.34],[-135.29,69.31],[-135.25,69.32],[-135.23,69.43],[-135.2,69.45],[-135.14,69.47],[-134.85,69.49],[-134.49,69.47],[-134.46,69.48],[-134.49,69.55],[-134.5,69.57],[-134.47,69.63],[-134.45,69.67],[-134.41,69.68],[-134.24,69.67],[-134.19,69.64],[-134.13,69.59],[-134.08,69.56],[-133.9,69.53],[-133.88,69.51],[-133.95,69.43],[-134.02,69.39],[-134.17,69.28],[-134.17,69.25],[-133.95,69.3],[-133.69,69.37],[-133.48,69.41],[-133.29,69.41],[-133.16,69.43],[-133.08,69.47],[-133.03,69.51],[-132.92,69.63],[-132.84,69.65],[-132.53,69.64],[-132.45,69.65],[-132.4,69.66],[-132.41,69.67],[-132.48,69.69],[-132.57,69.7],[-132.57,69.71],[-132.54,69.73],[-132.49,69.74],[-132.33,69.75],[-132.23,69.71],[-132.16,69.7],[-131.93,69.75],[-131.58,69.88],[-131.44,69.92],[-131.32,69.92],[-131.22,69.9],[-131.14,69.91],[-131.03,69.98],[-130.99,70.02],[-130.93,70.05],[-130.67,70.13],[-130.5,70.14],[-130.4,70.13],[-130.27,70.1],[-130.17,70.09],[-130.04,70.1],[-129.94,70.09],[-129.9,70.11],[-129.73,70.19],[-129.68,70.19],[-129.62,70.17],[-129.54,70.11],[-129.54,70.07],[-129.65,70.0],[-130.46,69.78],[-130.71,69.69],[-130.83,69.65],[-130.96,69.63],[-131.21,69.62],[-131.31,69.6],[-131.47,69.58],[-131.86,69.55],[-131.94,69.53],[-131.99,69.52],[-132.13,69.4],[-132.2,69.36],[-132.33,69.31],[-132.48,69.27],[-132.69,69.26],[-132.82,69.21],[-132.97,69.1],[-133.09,69.03],[-133.23,68.97],[-133.38,68.89],[-133.42,68.84],[-133.37,68.79],[-133.35,68.77],[-133.2,68.74],[-133.14,68.75],[-133.19,68.78],[-133.32,68.82],[-133.34,68.84],[-133.3,68.85],[-132.71,68.81],[-132.58,68.85],[-132.53,68.88],[-132.54,68.89],[-132.7,68.9],[-132.74,68.92],[-132.76,68.97],[-132.77,69.01],[-132.76,69.04],[-132.72,69.08],[-132.55,69.14],[-132.36,69.17],[-132.21,69.2],[-132.13,69.23],[-131.92,69.29],[-131.83,69.34],[-131.79,69.37],[-131.78,69.39],[-131.82,69.4],[-131.79,69.43],[-131.63,69.46],[-131.56,69.46],[-131.34,69.44],[-131.3,69.42],[-131.32,69.36],[-131.29,69.36],[-131.21,69.43],[-131.16,69.45],[-131.11,69.46],[-131.06,69.45],[-131.01,69.43],[-130.99,69.36],[-130.98,69.25],[-130.97,69.21],[-130.91,69.28],[-130.88,69.32],[-130.66,69.48],[-130.52,69.57],[-130.35,69.66],[-130.12,69.72],[-129.57,69.83],[-129.26,69.86],[-129.11,69.88],[-129.03,69.9],[-128.98,69.93],[-128.9,69.97],[-128.88,69.96],[-128.92,69.89],[-128.94,69.88],[-129.14,69.83],[-129.16,69.8],[-129.14,69.75],[-129.1,69.72],[-129.05,69.7],[-128.97,69.71],[-128.85,69.75],[-128.71,69.81],[-128.39,69.96],[-128.36,69.99],[-128.28,70.11],[-128.1,70.16],[-127.76,70.22],[-127.68,70.26],[-127.97,70.29],[-128.03,70.32],[-128.04,70.33],[-127.99,70.36],[-128.12,70.4],[-128.17,70.42],[-128.17,70.48],[-128.13,70.52],[-128.04,70.57],[-127.99,70.57],[-127.86,70.55],[-127.75,70.52],[-127.38,70.37],[-127.23,70.3],[-127.14,70.24],[-126.93,70.06],[-126.83,69.96],[-126.76,69.85],[-126.68,69.78],[-126.61,69.73],[-126.25,69.55],[-126.06,69.47],[-125.91,69.42],[-125.73,69.38],[-125.52,69.35],[-125.39,69.35],[-125.17,69.43],[-125.17,69.48],[-125.26,69.57],[-125.36,69.63],[-125.35,69.66],[-125.22,69.73],[-125.23,69.76],[-125.2,69.83],[-125.11,69.82],[-125.08,69.82],[-125.03,69.84],[-124.97,69.89],[-124.89,69.94],[-124.79,69.97],[-124.77,69.99],[-124.86,70.01],[-124.92,70.01],[-124.96,70.01],[-124.99,70.03],[-124.95,70.04],[-124.75,70.08],[-124.71,70.12],[-124.64,70.14],[-124.56,70.15],[-124.5,70.14],[-124.44,70.11],[-124.44,70.06],[-124.47,69.98],[-124.47,69.92],[-124.41,69.77],[-124.35,69.73],[-124.12,69.69],[-124.14,69.65],[-124.4,69.49],[-124.45,69.45],[-124.48,69.43],[-124.47,69.4],[-124.43,69.38],[-124.34,69.36],[-124.11,69.36],[-124.05,69.37],[-123.61,69.38],[-123.53,69.39],[-123.46,69.42],[-123.36,69.5],[-123.25,69.52],[-123.21,69.54],[-123.14,69.63],[-123.11,69.74],[-123.08,69.78],[-123.03,69.81],[-122.96,69.82],[-122.79,69.81],[-122.7,69.82],[-122.39,69.81],[-122.07,69.82],[-121.74,69.8],[-121.53,69.78],[-121.34,69.74],[-120.96,69.66],[-120.81,69.62],[-120.29,69.42],[-120.14,69.38],[-119.85,69.34],[-118.87,69.26],[-118.74,69.23],[-118.49,69.14],[-118.31,69.09],[-118.1,69.04],[-117.83,69.0],[-117.31,68.93],[-117.23,68.91],[-117.13,68.91],[-117.03,68.92],[-116.55,68.88],[-116.42,68.88],[-116.33,68.87],[-116.22,68.85],[-116.06,68.84],[-116.07,68.86],[-116.25,68.96],[-116.24,68.97],[-116.17,68.98],[-115.94,68.96],[-115.88,68.99],[-115.81,68.99],[-115.63,68.97],[-115.44,68.94],[-115.24,68.89],[-114.99,68.85],[-114.62,68.75],[-114.41,68.66],[-114.22,68.55],[-114.11,68.48],[-114.09,68.44],[-114.05,68.41],[-113.99,68.41],[-113.96,68.4],[-114.02,68.31],[-114.05,68.28],[-114.1,68.27],[-114.27,68.25],[-114.77,68.27],[-114.85,68.2],[-115.13,68.13],[-115.18,68.1],[-115.19,68.08],[-115.17,68.02],[-115.2,68.0],[-115.43,67.92],[-115.43,67.9],[-115.29,67.87],[-115.13,67.82],[-115.01,67.81],[-114.86,67.81],[-114.66,67.8],[-114.43,67.75],[-114.27,67.73],[-114.18,67.74],[-114.05,67.73],[-113.89,67.71],[-113.68,67.7],[-113.21,67.7],[-113.07,67.69],[-112.88,67.68],[-112.5,67.68],[-112.44,67.68],[-112.31,67.72],[-112.24,67.73],[-112.1,67.73],[-111.71,67.76],[-111.58,67.76],[-111.45,67.78],[-111.29,67.82],[-111.19,67.82],[-111.15,67.8],[-111.09,67.79],[-110.99,67.79],[-110.8,67.83],[-110.37,67.95],[-110.22,67.95],[-110.1,67.99],[-110.07,67.99],[-110.04,67.98],[-109.94,67.89],[-109.9,67.87],[-109.83,67.87],[-109.76,67.82],[-109.69,67.75],[-109.63,67.73],[-109.22,67.73],[-109.08,67.71],[-109.04,67.69],[-108.99,67.64],[-108.97,67.53],[-108.95,67.49],[-108.89,67.44],[-108.85,67.42],[-108.82,67.44],[-108.72,67.58],[-108.68,67.61],[-108.61,67.6],[-108.59,67.59],[-108.49,67.48],[-108.35,67.4],[-107.99,67.26],[-107.93,67.2],[-107.91,67.16],[-107.93,67.13],[-107.99,67.1],[-108.09,67.07],[-108.22,67.05],[-108.34,67.06],[-108.46,67.09],[-108.5,67.09],[-108.46,67.06],[-108.22,66.94],[-108.16,66.89],[-108.1,66.86],[-108.05,66.84],[-108.0,66.82],[-107.96,66.78],[-107.76,66.68],[-107.7,66.64],[-107.48,66.49],[-107.37,66.43],[-107.29,66.4],[-107.26,66.4],[-107.28,66.42],[-107.56,66.62],[-107.71,66.74],[-107.73,66.77],[-107.74,66.81],[-107.75,66.96],[-107.73,66.98],[-107.63,67.0],[-107.5,66.94],[-107.45,66.93],[-107.42,66.93],[-107.4,66.95],[-107.33,66.93],[-107.2,66.88],[-107.16,66.88],[-107.25,66.98],[-107.32,67.02],[-107.35,67.05],[-107.28,67.1],[-107.32,67.13],[-107.48,67.2],[-107.57,67.27],[-107.64,67.38],[-107.65,67.43],[-107.64,67.47],[-107.65,67.51],[-107.75,67.59],[-107.87,67.64],[-107.95,67.7],[-107.97,67.73],[-107.96,67.82],[-107.89,67.86],[-107.76,67.91],[-107.73,67.96],[-107.79,68.01],[-107.8,68.04],[-107.76,68.03],[-107.51,68.06],[-107.45,68.05],[-107.35,68.06],[-107.22,68.09],[-107.12,68.11],[-106.99,68.11],[-106.92,68.11],[-106.84,68.13],[-106.79,68.14],[-106.71,68.21],[-106.67,68.22],[-106.53,68.21],[-106.46,68.2],[-106.42,68.2],[-106.43,68.29],[-106.4,68.32],[-106.27,68.38],[-106.13,68.39],[-106.04,68.41],[-105.93,68.44],[-105.86,68.48],[-105.78,68.53],[-105.75,68.59],[-105.77,68.61],[-105.93,68.64],[-106.03,68.62],[-106.24,68.58],[-106.46,68.52],[-106.54,68.46],[-106.57,68.39],[-106.61,68.36],[-106.78,68.39],[-106.85,68.39],[-106.95,68.37],[-107.04,68.35],[-107.15,68.3],[-107.3,68.3],[-107.5,68.32],[-107.62,68.33],[-107.74,68.29],[-107.73,68.25],[-107.68,68.2],[-107.73,68.17],[-108.03,68.16],[-108.1,68.17],[-108.26,68.15],[-108.32,68.15],[-108.37,68.18],[-108.69,68.28],[-108.72,68.3],[-108.64,68.38],[-108.35,68.6],[-108.31,68.61],[-107.77,68.65],[-107.44,68.69],[-106.83,68.81],[-106.71,68.82],[-106.32,68.9],[-106.16,68.92],[-106.02,68.91],[-105.8,68.86],[-105.69,68.83],[-105.61,68.78],[-105.54,68.72],[-105.46,68.58],[-105.43,68.46],[-105.38,68.41],[-105.19,68.33],[-105.1,68.3],[-105.04,68.29],[-104.99,68.31],[-104.96,68.31],[-104.94,68.3],[-104.91,68.25],[-104.88,68.25],[-104.77,68.25],[-104.65,68.23],[-104.64,68.21],[-104.66,68.15],[-104.63,68.12],[-104.49,68.06],[-104.35,68.04],[-104.19,68.03],[-103.9,68.04],[-103.66,68.07],[-103.47,68.12],[-103.32,68.06],[-103.02,67.94],[-102.84,67.85],[-102.69,67.81],[-102.39,67.76],[-102.32,67.74],[-102.21,67.73],[-102.06,67.75],[-101.88,67.75],[-101.69,67.71],[-101.55,67.69],[-101.1,67.76],[-101.03,67.77],[-100.86,67.8],[-100.75,67.81],[-100.62,67.81],[-100.52,67.82],[-100.46,67.84],[-100.21,67.84],[-99.77,67.81],[-99.47,67.78],[-99.29,67.75],[-99.15,67.72],[-99.03,67.72],[-98.92,67.73],[-98.81,67.74],[-98.7,67.78],[-98.45,67.8],[-98.41,67.81],[-98.42,67.83],[-98.47,67.86],[-98.61,67.91],[-98.7,67.97],[-98.72,68.0],[-98.72,68.04],[-98.69,68.07],[-98.63,68.07],[-98.54,68.05],[-98.41,67.99],[-98.06,67.77],[-97.98,67.74],[-97.93,67.71],[-97.61,67.63],[-97.45,67.62],[-97.27,67.67],[-97.19,67.7],[-97.16,67.73],[-97.16,67.75],[-97.14,67.8],[-97.16,67.82],[-97.21,67.86],[-97.34,67.9],[-97.55,67.96],[-97.74,67.98],[-97.91,67.95],[-98.11,67.9],[-98.19,67.92],[-98.44,68.06],[-98.5,68.12],[-98.5,68.13],[-98.39,68.12],[-98.38,68.13],[-98.45,68.2],[-98.49,68.22],[-98.63,68.33],[-98.65,68.36],[-98.56,68.37],[-98.52,68.38],[-98.47,68.38],[-98.22,68.32],[-98.09,68.35],[-97.79,68.39],[-97.91,68.45],[-97.94,68.51],[-97.93,68.52],[-97.83,68.53],[-97.64,68.48],[-97.55,68.47],[-97.48,68.5],[-97.41,68.5],[-97.34,68.48],[-97.27,68.45],[-97.14,68.38],[-97.07,68.33],[-97.0,68.26],[-96.98,68.26],[-96.63,68.25],[-96.43,68.31],[-96.43,68.29],[-96.48,68.24],[-96.73,68.06],[-96.72,68.04],[-96.59,68.05],[-96.53,68.06],[-96.49,68.08],[-96.46,68.14],[-96.44,68.15],[-96.08,68.24],[-95.97,68.25],[-96.04,68.16],[-96.17,67.83],[-96.2,67.72],[-96.23,67.68],[-96.37,67.55],[-96.37,67.51],[-96.21,67.4],[-96.19,67.38],[-96.17,67.29],[-96.14,67.27],[-96.01,67.27],[-95.88,67.3],[-95.72,67.32],[-95.7,67.3],[-95.78,67.19],[-95.78,67.18],[-95.63,67.21],[-95.56,67.22],[-95.53,67.21],[-95.42,67.16],[-95.4,67.12],[-95.41,67.06],[-95.42,67.01],[-95.46,66.99],[-95.5,66.98],[-95.56,66.97],[-95.61,66.98],[-95.77,66.97],[-95.86,66.98],[-95.95,67.01],[-96.02,67.02],[-96.1,66.99],[-96.22,67.0],[-96.35,67.07],[-96.4,67.06],[-96.42,67.05],[-96.42,67.04],[-96.36,66.99],[-95.89,66.74],[-95.81,66.69],[-95.8,66.62],[-95.79,66.62],[-95.74,66.69],[-95.77,66.73],[-96.02,66.87],[-96.05,66.92],[-96.04,66.94],[-95.97,66.95],[-95.63,66.92],[-95.49,66.92],[-95.4,66.95],[-95.35,66.98],[-95.32,67.15],[-95.26,67.26],[-95.3,67.36],[-95.39,67.52],[-95.46,67.61],[-95.63,67.7],[-95.65,67.74],[-95.46,68.02],[-95.43,68.05],[-95.38,68.06],[-95.23,68.06],[-95.13,68.08],[-94.96,68.05],[-94.86,68.04],[-94.74,68.07],[-94.49,68.19],[-94.38,68.23],[-94.25,68.3],[-94.1,68.4],[-93.93,68.47],[-93.65,68.54],[-93.48,68.6],[-93.45,68.62],[-93.61,68.62],[-93.64,68.63],[-93.68,68.69],[-93.66,68.78],[-93.66,68.84],[-93.68,68.89],[-93.72,68.93],[-93.77,68.97],[-93.81,68.99],[-93.85,69.0],[-93.88,69.0],[-93.9,68.98],[-93.94,68.89],[-93.99,68.82],[-94.06,68.78],[-94.22,68.76],[-94.48,68.74],[-94.59,68.78],[-94.6,68.8],[-94.56,68.91],[-94.48,68.96],[-94.24,69.05],[-94.08,69.12],[-94.08,69.14],[-94.22,69.14],[-94.26,69.15],[-94.28,69.24],[-94.28,69.28],[-94.25,69.31],[-94.16,69.34],[-93.85,69.38],[-93.62,69.42],[-93.61,69.4],[-93.8,69.28],[-93.82,69.25],[-93.75,69.23],[-93.57,69.3],[-93.45,69.36],[-93.43,69.38],[-93.54,69.38],[-93.54,69.41],[-93.52,69.45],[-93.53,69.48],[-93.65,69.52],[-93.79,69.5],[-93.92,69.46],[-94.02,69.45],[-94.16,69.45],[-94.27,69.46],[-94.34,69.47],[-94.42,69.52],[-94.51,69.58],[-94.63,69.65],[-94.68,69.66],[-94.71,69.65],[-94.79,69.59],[-94.82,69.58],[-95.29,69.67],[-95.49,69.72],[-95.59,69.76],[-95.71,69.78],[-95.85,69.79],[-95.96,69.8],[-96.05,69.83],[-96.12,69.87],[-96.17,69.92],[-96.27,69.99],[-96.49,70.12],[-96.55,70.21],[-96.56,70.24],[-96.55,70.33],[-96.34,70.47],[-96.3,70.51],[-96.23,70.54],[-96.12,70.56],[-96.05,70.57],[-95.88,70.55],[-95.98,70.59],[-95.99,70.62],[-95.89,70.69],[-95.91,70.7],[-96.19,70.64],[-96.26,70.64],[-96.36,70.68],[-96.55,70.81],[-96.55,70.89],[-96.49,71.0],[-96.47,71.07],[-96.52,71.13],[-96.5,71.14],[-96.45,71.16],[-96.42,71.18],[-96.45,71.24],[-96.41,71.27],[-96.27,71.34],[-96.14,71.4],[-96.06,71.41],[-95.99,71.41],[-95.92,71.39],[-95.85,71.36],[-95.73,71.33],[-95.63,71.32],[-95.56,71.34],[-95.45,71.46],[-95.41,71.49],[-95.45,71.51],[-95.67,71.5],[-95.77,71.51],[-95.83,71.53],[-95.87,71.57],[-95.84,71.6],[-95.62,71.69],[-95.51,71.78],[-95.2,71.9],[-94.89,71.96],[-94.73,71.98],[-94.61,71.99],[-94.56,71.98],[-94.49,71.92],[-94.48,71.85],[-94.31,71.76],[-94.17,71.76],[-94.09,71.77],[-93.81,71.77],[-93.75,71.74],[-93.75,71.72],[-93.78,71.67],[-93.76,71.64],[-93.58,71.57],[-93.41,71.52],[-93.26,71.46],[-93.03,71.34],[-92.98,71.3],[-92.95,71.26],[-92.89,71.12],[-92.88,71.07],[-92.9,70.92],[-92.92,70.89],[-92.98,70.85],[-92.96,70.84],[-92.78,70.8],[-92.64,70.72],[-92.57,70.69],[-92.39,70.65],[-92.36,70.63],[-92.32,70.61],[-92.21,70.49],[-92.05,70.39],[-92.04,70.37],[-92.07,70.32],[-92.05,70.3],[-91.98,70.29],[-91.93,70.29],[-91.88,70.33],[-91.82,70.34],[-91.76,70.33],[-91.72,70.3],[-91.65,70.23],[-91.56,70.18],[-91.57,70.16],[-91.62,70.15],[-91.86,70.13],[-91.99,70.14],[-92.12,70.17],[-92.21,70.2],[-92.29,70.24],[-92.32,70.24],[-92.36,70.2],[-92.45,70.15],[-92.51,70.1],[-92.45,70.08],[-92.13,70.08],[-92.06,70.07],[-91.98,70.04],[-92.07,69.98],[-92.28,69.89],[-92.75,69.71],[-92.89,69.67],[-92.85,69.65],[-92.8,69.65],[-92.64,69.66],[-92.49,69.68],[-92.31,69.67],[-92.23,69.65],[-92.26,69.63],[-92.21,69.6],[-91.91,69.53],[-91.72,69.55],[-91.53,69.62],[-91.38,69.65],[-91.2,69.64],[-91.15,69.64],[-91.17,69.62],[-91.31,69.58],[-91.43,69.54],[-91.44,69.53],[-91.29,69.54],[-90.95,69.52],[-90.79,69.51],[-90.67,69.52],[-90.55,69.5],[-90.45,69.48],[-90.42,69.46],[-90.51,69.45],[-90.61,69.45],[-90.68,69.43],[-90.75,69.39],[-90.79,69.35],[-90.82,69.29],[-90.89,69.27],[-91.0,69.28],[-91.05,69.29],[-91.02,69.32],[-91.06,69.32],[-91.15,69.3],[-91.22,69.3],[-91.24,69.29],[-90.74,69.11],[-90.59,68.95],[-90.48,68.88],[-90.47,68.86],[-90.54,68.82],[-90.54,68.79],[-90.51,68.69],[-90.53,68.61],[-90.57,68.47],[-90.53,68.43],[-90.42,68.39],[-90.36,68.35],[-90.32,68.33],[-90.29,68.29],[-90.25,68.27],[-90.2,68.26],[-90.17,68.27],[-90.16,68.31],[-90.12,68.34],[-90.01,68.4],[-89.9,68.49],[-89.88,68.52],[-89.9,68.59],[-89.88,68.63],[-89.78,68.74],[-89.75,68.81],[-89.72,68.93],[-89.67,69.01],[-89.55,69.08],[-89.35,69.23],[-89.28,69.26],[-89.2,69.27],[-89.06,69.27],[-88.95,69.22],[-88.81,69.14],[-88.64,69.06],[-88.32,68.95],[-88.22,68.92],[-88.04,68.81],[-87.96,68.71],[-87.91,68.56],[-87.87,68.48],[-87.83,68.45],[-87.81,68.4],[-87.81,68.35],[-87.83,68.3],[-87.85,68.27],[-87.89,68.25],[-87.99,68.24],[-88.11,68.25],[-88.15,68.27],[-88.21,68.33],[-88.24,68.34],[-88.35,68.29],[-88.36,68.26],[-88.32,68.17],[-88.33,67.99],[-88.31,67.95],[-88.2,67.77],[-88.0,67.63],[-87.5,67.36],[-87.47,67.32],[-87.42,67.21],[-87.39,67.19],[-87.36,67.18],[-87.32,67.17],[-87.27,67.18],[-87.08,67.27],[-86.92,67.36],[-86.81,67.4],[-86.75,67.41],[-86.68,67.42],[-86.61,67.45],[-86.56,67.48],[-86.54,67.52],[-86.5,67.65],[-86.48,67.71],[-86.4,67.8],[-86.37,67.82],[-85.98,68.05],[-85.95,68.07],[-85.79,68.33],[-85.73,68.45],[-85.72,68.52],[-85.74,68.58],[-85.73,68.63],[-85.69,68.67],[-85.64,68.7],[-85.56,68.73],[-85.52,68.77],[-85.49,68.77],[-85.43,68.77],[-85.34,68.75],[-85.28,68.74],[-84.87,68.77],[-84.87,68.79],[-85.11,68.84],[-85.1,68.87],[-85.08,68.91],[-85.01,68.95],[-84.92,68.96],[-84.9,68.99],[-84.89,69.02],[-84.86,69.07],[-84.89,69.09],[-85.11,69.17],[-85.24,69.16],[-85.28,69.17],[-85.39,69.23],[-85.43,69.32],[-85.43,69.35],[-85.42,69.41],[-85.4,69.43],[-85.41,69.45],[-85.44,69.49],[-85.44,69.52],[-85.42,69.55],[-85.43,69.58],[-85.48,69.62],[-85.5,69.65],[-85.45,69.75],[-85.45,69.78],[-85.5,69.82],[-85.53,69.84],[-85.51,69.85],[-85.42,69.85],[-85.3,69.84],[-85.18,69.81],[-85.02,69.8],[-84.83,69.84],[-84.65,69.85],[-84.32,69.84],[-84.24,69.84],[-83.92,69.75],[-83.67,69.7],[-83.55,69.7],[-82.99,69.69],[-82.75,69.7],[-82.62,69.69],[-82.37,69.64],[-82.39,69.6],[-82.5,69.53],[-82.63,69.52],[-82.75,69.49],[-82.64,69.46],[-82.31,69.41],[-82.23,69.33],[-82.21,69.3],[-82.25,69.26],[-82.23,69.25],[-82.15,69.25],[-81.95,69.28],[-81.73,69.26],[-81.41,69.2],[-81.38,69.19],[-81.32,69.14],[-81.33,69.12],[-81.61,69.0],[-81.76,68.96],[-81.95,68.91],[-81.96,68.88],[-81.69,68.88],[-81.48,68.87],[-81.38,68.85],[-81.33,68.83],[-81.26,68.78],[-81.25,68.74],[-81.26,68.69],[-81.28,68.66],[-81.53,68.56],[-81.64,68.52],[-81.83,68.49],[-81.91,68.46],[-82.01,68.46],[-82.11,68.5],[-82.21,68.51],[-82.4,68.48],[-82.5,68.48],[-82.55,68.47],[-82.55,68.45],[-82.46,68.38],[-82.41,68.36],[-82.39,68.34],[-82.43,68.31],[-82.42,68.3],[-82.39,68.29],[-82.22,68.15],[-82.19,68.13],[-82.15,68.14],[-82.08,68.18],[-82.03,68.2],[-82.01,68.19],[-82.01,68.17],[-82.09,68.05],[-82.1,68.02],[-82.1,67.99],[-82.06,67.93],[-81.98,67.86],[-81.87,67.8],[-81.71,67.72],[-81.49,67.64],[-81.41,67.6],[-81.29,67.5],[-81.27,67.46],[-81.3,67.36],[-81.39,67.19],[-81.44,67.09],[-81.47,67.07],[-81.63,67.0],[-81.72,66.99],[-81.87,66.99],[-81.93,66.97],[-82.01,66.92],[-82.11,66.83],[-82.2,66.76],[-82.26,66.74],[-82.37,66.71],[-82.55,66.62],[-82.64,66.59],[-82.95,66.55],[-83.2,66.43],[-83.3,66.39],[-83.41,66.37],[-83.52,66.37],[-83.59,66.39],[-83.63,66.46],[-83.65,66.48],[-83.74,66.53],[-83.92,66.68],[-84.0,66.73],[-84.05,66.74],[-84.15,66.73],[-84.21,66.74],[-84.32,66.78],[-84.37,66.81],[-84.36,66.82],[-84.27,66.84],[-84.31,66.86],[-84.47,66.93],[-84.53,66.96],[-84.54,66.97],[-84.69,67.02],[-84.85,67.03],[-85.04,66.96],[-85.11,66.91],[-85.11,66.89],[-85.02,66.87],[-84.98,66.88],[-84.9,66.93],[-84.86,66.94],[-84.74,66.93],[-84.64,66.9],[-84.6,66.88],[-84.59,66.86],[-84.32,66.71],[-84.22,66.68],[-84.18,66.65],[-84.15,66.59],[-84.09,66.53],[-83.96,66.42],[-83.83,66.29],[-83.8,66.24],[-83.87,66.21],[-83.91,66.21],[-84.01,66.23],[-84.29,66.29],[-84.32,66.29],[-84.4,66.26],[-84.46,66.19],[-84.48,66.18],[-84.63,66.21],[-84.91,66.27],[-85.1,66.33],[-85.19,66.37],[-85.31,66.44],[-85.44,66.54],[-85.6,66.57],[-85.79,66.53],[-86.06,66.52],[-86.63,66.53],[-86.71,66.52],[-86.74,66.51],[-86.69,66.46],[-86.7,66.44],[-86.74,66.43],[-86.75,66.42],[-86.69,66.36],[-86.58,66.32],[-86.3,66.27],[-86.11,66.23],[-86.0,66.19],[-85.96,66.15],[-85.96,66.12],[-86.01,66.05],[-86.04,66.02],[-86.7,65.67],[-86.95,65.53],[-87.08,65.44],[-87.19,65.38],[-87.29,65.35],[-87.45,65.34],[-87.68,65.34],[-87.97,65.35],[-88.12,65.39],[-88.39,65.52],[-88.59,65.59],[-88.67,65.61],[-88.74,65.68],[-88.81,65.69],[-88.95,65.7],[-89.09,65.74],[-89.42,65.86],[-89.59,65.91],[-89.75,65.94],[-89.89,65.94],[-89.94,65.93],[-89.85,65.87],[-89.89,65.87],[-90.0,65.88],[-90.12,65.88],[-90.32,65.93],[-90.51,65.92],[-90.66,65.93],[-90.83,65.95],[-91.01,65.97],[-91.31,65.96],[-91.41,65.96],[-91.43,65.95],[-91.29,65.89],[-91.04,65.83],[-91.07,65.89],[-91.06,65.9],[-90.98,65.92],[-90.6,65.88],[-90.16,65.81],[-90.05,65.81],[-89.92,65.78],[-89.79,65.74],[-89.6,65.65],[-89.24,65.45],[-89.13,65.4],[-88.97,65.35],[-88.2,65.28],[-87.93,65.28],[-87.39,65.26],[-87.11,65.22],[-87.03,65.2],[-87.0,65.11],[-87.03,65.06],[-87.18,64.93],[-87.28,64.83],[-87.89,64.4],[-87.96,64.3],[-88.0,64.24],[-88.11,64.18],[-88.38,64.09],[-88.65,64.01],[-88.82,63.99],[-88.96,64.01],[-89.06,64.03],[-89.2,64.11],[-89.21,64.11],[-89.11,63.98],[-89.13,63.97],[-89.21,63.98],[-89.4,64.04],[-89.46,64.03],[-89.5,64.01],[-89.55,64.01],[-89.62,64.03],[-89.73,64.08],[-89.76,64.1],[-89.79,64.17],[-89.81,64.18],[-90.04,64.14],[-90.08,64.13],[-89.99,64.1],[-89.95,64.08],[-89.86,63.98],[-89.86,63.96],[-89.92,63.94],[-90.14,63.98],[-90.17,63.98],[-90.06,63.88],[-90.02,63.83],[-90.01,63.8],[-90.15,63.69],[-90.25,63.64],[-90.37,63.62],[-90.45,63.64],[-90.53,63.67],[-90.6,63.66],[-90.64,63.62],[-90.71,63.6],[-90.81,63.58],[-90.95,63.59],[-91.11,63.62],[-91.54,63.73],[-91.67,63.74],[-91.93,63.76],[-91.96,63.77],[-91.95,63.79],[-91.92,63.8],[-91.93,63.81],[-91.98,63.82],[-92.04,63.81],[-92.09,63.78],[-92.2,63.78],[-92.34,63.79],[-92.55,63.83],[-92.97,63.94],[-93.43,64.03],[-93.7,64.15],[-93.6,64.04],[-93.6,64.0],[-93.66,63.97],[-93.66,63.94],[-93.56,63.87],[-93.42,63.84],[-93.27,63.84],[-93.27,63.85],[-93.33,63.87],[-93.38,63.9],[-93.41,63.94],[-93.38,63.95],[-93.25,63.93],[-93.17,63.9],[-92.53,63.76],[-92.34,63.73],[-92.2,63.71],[-92.16,63.69],[-92.21,63.66],[-92.46,63.57],[-92.47,63.56],[-92.29,63.56],[-92.08,63.64],[-91.96,63.68],[-91.84,63.7],[-91.69,63.66],[-91.49,63.56],[-91.33,63.51],[-91.1,63.48],[-90.97,63.44],[-90.75,63.35],[-90.71,63.3],[-90.69,63.11],[-90.7,63.06],[-90.73,63.02],[-90.78,62.97],[-90.87,62.95],[-91.01,62.94],[-91.11,62.92],[-91.35,62.82],[-91.45,62.8],[-91.87,62.83],[-92.03,62.86],[-92.11,62.86],[-92.15,62.84],[-92.2,62.83],[-92.36,62.82],[-92.39,62.8],[-92.38,62.77],[-92.35,62.73],[-92.31,62.71],[-92.24,62.68],[-92.15,62.67],[-91.96,62.64],[-91.94,62.59],[-91.94,62.58],[-92.01,62.54],[-92.08,62.54],[-92.21,62.59],[-92.27,62.59],[-92.32,62.56],[-92.4,62.56],[-92.5,62.56],[-92.55,62.55],[-92.56,62.5],[-92.59,62.47],[-92.71,62.42],[-92.77,62.38],[-92.77,62.35],[-92.7,62.33],[-92.63,62.28],[-92.54,62.2],[-92.53,62.17],[-92.58,62.18],[-92.65,62.21],[-92.73,62.26],[-92.87,62.31],[-93.15,62.37],[-93.21,62.36],[-93.18,62.35],[-92.99,62.29],[-92.91,62.24],[-92.91,62.22],[-93.07,62.15],[-93.07,62.13],[-93.03,62.11],[-93.02,62.09],[-93.07,62.06],[-93.17,62.03],[-93.35,62.03],[-93.37,62.01],[-93.3,61.98],[-93.27,61.96],[-93.33,61.93],[-93.37,61.93],[-93.58,61.94],[-93.53,61.87],[-93.49,61.85],[-93.43,61.81],[-93.31,61.78],[-93.31,61.77],[-93.35,61.74],[-93.42,61.71],[-93.71,61.6],[-93.91,61.48],[-93.94,61.44],[-93.89,61.36],[-93.89,61.34],[-93.94,61.31],[-94.06,61.32],[-94.08,61.3],[-94.06,61.27],[-94.05,61.21],[-94.07,61.14],[-94.15,61.03],[-94.31,60.87],[-94.43,60.73],[-94.51,60.6],[-94.57,60.54],[-94.68,60.54],[-94.76,60.5],[-94.71,60.48],[-94.67,60.45],[-94.65,60.42],[-94.67,60.3],[-94.74,60.11],[-94.79,59.95],[-94.78,59.48],[-94.79,59.27],[-94.82,59.15],[-94.87,59.09],[-94.96,59.07],[-94.85,59.05],[-94.78,59.02],[-94.74,58.98],[-94.71,58.9],[-94.67,58.87],[-94.62,58.88],[-94.58,58.87],[-94.54,58.85],[-94.42,58.75],[-94.29,58.72],[-94.28,58.66],[-94.33,58.34],[-94.33,58.3],[-94.27,58.38],[-94.21,58.63],[-94.12,58.74],[-94.06,58.76],[-93.78,58.77],[-93.49,58.74],[-93.38,58.74],[-93.28,58.76],[-93.18,58.73],[-93.15,58.69],[-93.13,58.56],[-93.1,58.49],[-92.93,58.22],[-92.84,58.08],[-92.74,57.84],[-92.7,57.78],[-92.49,57.47],[-92.45,57.38],[-92.43,57.32],[-92.44,57.28],[-92.48,57.21],[-92.55,57.11],[-92.61,57.04],[-92.68,56.99],[-92.74,56.95],[-92.8,56.93],[-92.8,56.92],[-92.73,56.93],[-92.65,56.96],[-92.51,57.02],[-92.46,57.04],[-92.3,57.05],[-92.3,57.02],[-92.37,56.98],[-92.36,56.97],[-92.25,57.01],[-92.02,57.06],[-91.11,57.24],[-90.9,57.26],[-90.59,57.22],[-90.34,57.15],[-90.08,57.05],[-89.79,56.98],[-89.34,56.92],[-89.21,56.88],[-88.95,56.85],[-88.83,56.81],[-88.68,56.73],[-88.45,56.61],[-88.27,56.54],[-88.08,56.47],[-87.88,56.34],[-87.56,56.06],[-87.48,56.02],[-87.29,55.97],[-86.92,55.91],[-86.38,55.77],[-86.14,55.72],[-85.98,55.7],[-85.83,55.66],[-85.68,55.6],[-85.56,55.54],[-85.48,55.47],[-85.41,55.43],[-85.28,55.38],[-85.22,55.35],[-85.21,55.3],[-85.36,55.1],[-85.37,55.08],[-85.21,55.22],[-85.13,55.27],[-85.06,55.29],[-84.92,55.28],[-84.71,55.26],[-84.52,55.26],[-84.36,55.28],[-84.22,55.29],[-84.11,55.29],[-84.02,55.3],[-83.97,55.31],[-83.91,55.31],[-83.67,55.26],[-83.57,55.26],[-83.21,55.21],[-82.99,55.23],[-82.95,55.22],[-82.87,55.16],[-82.8,55.16],[-82.69,55.17],[-82.58,55.15],[-82.39,55.07],[-82.31,55.0],[-82.23,54.86],[-82.22,54.81],[-82.37,54.48],[-82.42,54.36],[-82.42,54.24],[-82.39,54.18],[-82.26,54.07],[-82.24,54.04],[-82.16,53.89],[-82.14,53.82],[-82.15,53.74],[-82.19,53.61],[-82.18,53.51],[-82.15,53.36],[-82.16,53.26],[-82.22,53.21],[-82.26,53.16],[-82.29,53.07],[-82.29,53.03],[-82.26,52.96],[-82.2,52.92],[-82.11,52.88],[-82.02,52.81],[-81.86,52.65],[-81.74,52.56],[-81.6,52.43],[-81.57,52.37],[-81.61,52.32],[-81.66,52.29],[-81.78,52.25],[-81.83,52.22],[-81.81,52.22],[-81.65,52.24],[-81.55,52.24],[-81.47,52.2],[-81.4,52.14],[-81.29,52.09],[-81.13,52.05],[-80.97,51.97],[-80.71,51.8],[-80.66,51.76],[-80.59,51.67],[-80.5,51.53],[-80.45,51.43],[-80.44,51.39],[-80.5,51.34],[-80.67,51.26],[-80.85,51.12],[-80.79,51.13],[-80.68,51.19],[-80.48,51.31],[-80.37,51.33],[-80.27,51.32],[-80.1,51.28],[-79.96,51.24],[-79.84,51.17],[-79.65,51.01],[-79.46,50.88],[-79.35,50.76],[-79.38,50.83],[-79.45,50.92],[-79.64,51.05],[-79.71,51.12],[-79.73,51.15],[-79.74,51.19],[-79.72,51.25],[-79.69,51.35],[-79.64,51.41],[-79.59,51.45],[-79.55,51.49],[-79.53,51.54],[-79.5,51.57],[-79.34,51.63],[-79.3,51.62],[-79.26,51.55],[-79.23,51.54],[-79.15,51.53],[-79.09,51.5],[-79.04,51.46],[-79.01,51.43],[-78.98,51.39],[-78.94,51.26],[-78.9,51.2],[-78.9,51.27],[-78.86,51.38],[-78.83,51.43],[-78.73,51.5],[-78.74,51.53],[-78.78,51.57],[-78.98,51.73],[-78.98,51.77],[-78.93,51.8],[-78.89,51.85],[-78.87,51.91],[-78.83,51.96],[-78.7,52.03],[-78.59,52.14],[-78.54,52.21],[-78.49,52.25],[-78.45,52.26],[-78.51,52.29],[-78.53,52.31],[-78.53,52.4],[-78.56,52.49],[-78.6,52.54],[-78.72,52.63],[-78.74,52.66],[-78.77,52.76],[-78.75,52.81],[-78.72,52.86],[-78.74,52.9],[-78.85,52.98],[-78.9,53.04],[-78.95,53.21],[-78.99,53.41],[-79.04,53.56],[-79.1,53.66],[-79.11,53.72],[-79.08,53.74],[-79.04,53.82],[-79.0,53.84],[-78.95,53.83],[-78.94,53.84],[-79.03,53.88],[-79.08,53.93],[-79.07,53.95],[-79.0,54.0],[-79.01,54.02],[-79.07,54.05],[-79.24,54.1],[-79.18,54.12],[-79.14,54.16],[-79.15,54.17],[-79.22,54.19],[-79.3,54.22],[-79.36,54.26],[-79.43,54.34],[-79.48,54.39],[-79.52,54.49],[-79.6,54.6],[-79.63,54.63],[-79.67,54.65],[-79.71,54.65],[-79.71,54.67],[-79.67,54.7],[-78.91,54.88],[-78.85,54.91],[-78.48,55.01],[-78.3,55.07],[-78.13,55.15],[-77.89,55.24],[-77.78,55.29],[-77.7,55.34],[-77.32,55.56],[-77.17,55.66],[-77.07,55.76],[-76.94,55.87],[-76.76,56.0],[-76.65,56.11],[-76.6,56.2],[-76.55,56.36],[-76.53,56.5],[-76.52,56.71],[-76.53,56.89],[-76.57,57.18],[-76.6,57.27],[-76.66,57.38],[-76.79,57.6],[-76.81,57.66],[-76.89,57.76],[-77.16,58.02],[-77.49,58.2],[-77.55,58.24],[-77.68,58.29],[-77.88,58.35],[-78.01,58.4],[-78.35,58.58],[-78.46,58.6],[-78.51,58.65],[-78.52,58.68],[-78.5,58.77],[-78.48,58.83],[-78.46,58.87],[-78.43,58.9],[-78.24,59.04],[-78.14,59.14],[-78.07,59.2],[-77.99,59.25],[-77.84,59.31],[-77.76,59.38],[-77.78,59.41],[-77.84,59.44],[-77.86,59.48],[-77.75,59.56],[-77.73,59.58],[-77.75,59.66],[-77.73,59.68],[-77.59,59.68],[-77.4,59.57],[-77.35,59.58],[-77.41,59.61],[-77.49,59.68],[-77.47,59.72],[-77.33,59.8],[-77.33,59.83],[-77.37,59.88],[-77.37,59.93],[-77.29,60.02],[-77.31,60.04],[-77.55,60.06],[-77.59,60.09],[-77.57,60.1],[-77.46,60.13],[-77.45,60.15],[-77.65,60.36],[-77.68,60.43],[-77.6,60.51],[-77.5,60.54],[-77.52,60.56],[-77.64,60.57],[-77.71,60.58],[-77.79,60.64],[-77.76,60.68],[-77.73,60.7],[-77.66,60.79],[-77.59,60.81],[-77.6,60.83],[-77.87,60.79],[-78.0,60.82],[-78.12,60.81],[-78.18,60.82],[-78.16,60.85],[-77.93,61.0],[-77.83,61.08],[-77.77,61.16],[-77.73,61.21],[-77.73,61.23],[-77.75,61.39],[-77.74,61.44],[-77.65,61.48],[-77.51,61.56],[-77.7,61.63],[-77.81,61.69],[-77.89,61.73],[-77.95,61.76],[-78.02,61.83],[-78.08,61.92],[-78.14,62.11],[-78.15,62.21],[-78.13,62.28],[-78.11,62.32],[-78.07,62.36],[-77.9,62.43],[-77.6,62.53],[-77.37,62.57],[-77.21,62.55],[-76.88,62.53],[-76.62,62.47],[-75.82,62.32],[-75.68,62.25],[-75.81,62.19],[-75.79,62.18],[-75.49,62.29],[-75.41,62.31],[-75.34,62.31],[-75.11,62.27],[-75.02,62.26],[-74.91,62.23],[-74.63,62.12],[-74.61,62.13],[-74.69,62.18],[-74.65,62.21],[-74.43,62.27],[-74.21,62.32],[-74.05,62.37],[-73.88,62.43],[-73.76,62.47],[-73.71,62.47],[-73.63,62.45],[-73.43,62.37],[-73.3,62.33],[-73.2,62.28],[-73.05,62.2],[-72.99,62.18],[-72.88,62.13],[-72.73,62.13],[-72.69,62.12],[-72.67,62.11],[-72.65,62.08],[-72.63,62.05],[-72.63,62.03],[-72.67,61.96],[-72.77,61.84],[-72.73,61.84],[-72.66,61.86],[-72.57,61.91],[-72.51,61.92],[-72.36,61.89],[-72.23,61.83],[-72.18,61.8],[-72.13,61.75],[-72.08,61.73],[-72.04,61.68],[-72.04,61.66],[-72.08,61.64],[-72.25,61.6],[-72.22,61.59],[-72.02,61.61],[-71.96,61.64],[-71.92,61.68],[-71.87,61.69],[-71.64,61.62],[-71.6,61.59],[-71.62,61.57],[-71.66,61.55],[-71.76,61.53],[-71.84,61.47],[-71.85,61.44],[-71.79,61.42],[-71.65,61.41],[-71.65,61.4],[-71.73,61.37],[-71.74,61.34],[-71.55,61.21],[-71.42,61.16],[-71.35,61.15],[-71.18,61.15],[-71.03,61.13],[-70.72,61.06],[-70.54,61.04],[-70.38,61.06],[-70.28,61.07],[-70.19,61.04],[-70.16,61.02],[-70.14,60.98],[-70.15,60.92],[-70.1,60.88],[-69.99,60.86],[-69.91,60.86],[-69.8,60.91],[-69.71,60.91],[-69.68,60.95],[-69.65,61.01],[-69.62,61.05],[-69.56,61.06],[-69.5,61.04],[-69.47,61.01],[-69.41,60.92],[-69.4,60.88],[-69.4,60.85],[-69.43,60.81],[-69.49,60.78],[-69.57,60.74],[-69.64,60.69],[-69.72,60.57],[-69.75,60.49],[-69.76,60.44],[-69.76,60.39],[-69.74,60.33],[-69.71,60.29],[-69.63,60.22],[-69.63,60.2],[-69.62,60.15],[-69.63,60.12],[-69.67,60.08],[-69.8,60.03],[-69.96,60.02],[-70.51,60.02],[-70.65,60.03],[-70.62,59.98],[-70.47,59.97],[-70.33,59.97],[-69.81,59.94],[-69.73,59.92],[-69.67,59.87],[-69.63,59.82],[-69.59,59.72],[-69.58,59.68],[-69.6,59.62],[-69.66,59.57],[-69.69,59.49],[-69.71,59.39],[-69.68,59.34],[-69.4,59.34],[-69.34,59.3],[-69.35,59.28],[-69.45,59.18],[-69.46,59.15],[-69.41,59.09],[-69.42,59.07],[-69.45,59.05],[-69.47,59.0],[-69.5,58.92],[-69.53,58.87],[-69.61,58.83],[-69.65,58.82],[-69.68,58.83],[-69.75,58.94],[-69.78,58.96],[-69.81,58.95],[-69.83,58.93],[-69.83,58.91],[-69.84,58.88],[-69.87,58.86],[-69.98,58.82],[-70.16,58.79],[-70.15,58.76],[-70.03,58.75],[-69.88,58.7],[-69.79,58.69],[-69.65,58.73],[-69.38,58.85],[-69.27,58.88],[-69.17,58.9],[-69.06,58.9],[-68.94,58.89],[-68.7,58.9],[-68.64,58.89],[-68.56,58.87],[-68.47,58.82],[-68.41,58.78],[-68.38,58.74],[-68.33,58.6],[-68.25,58.56],[-68.24,58.53],[-68.23,58.48],[-68.23,58.4],[-68.31,58.23],[-68.36,58.16],[-68.47,58.08],[-68.6,58.04],[-68.83,58.0],[-68.95,57.97],[-69.04,57.93],[-69.04,57.9],[-68.78,57.98],[-68.5,58.01],[-68.41,58.05],[-68.35,58.09],[-68.29,58.18],[-68.18,58.4],[-68.11,58.47],[-68.02,58.49],[-67.98,58.46],[-67.89,58.33],[-67.89,58.3],[-67.91,58.27],[-68.06,58.14],[-68.01,58.15],[-67.86,58.27],[-67.82,58.31],[-67.81,58.37],[-67.76,58.4],[-67.74,58.39],[-67.69,58.24],[-67.69,58.14],[-67.68,58.11],[-67.7,58.01],[-67.68,57.99],[-67.63,58.08],[-67.62,58.14],[-67.6,58.19],[-67.57,58.21],[-67.38,58.3],[-67.16,58.37],[-67.02,58.43],[-66.9,58.46],[-66.72,58.49],[-66.61,58.55],[-66.56,58.64],[-66.52,58.7],[-66.48,58.73],[-66.36,58.79],[-66.3,58.79],[-66.24,58.77],[-66.17,58.73],[-66.09,58.66],[-66.04,58.61],[-66.03,58.57],[-66.02,58.43],[-66.0,58.43],[-65.93,58.54],[-65.92,58.57],[-65.93,58.61],[-65.95,58.65],[-66.02,58.73],[-66.05,58.79],[-66.04,58.82],[-65.97,58.84],[-65.85,58.85],[-65.84,58.86],[-65.92,58.9],[-65.92,58.91],[-65.84,58.98],[-65.79,58.98],[-65.7,58.97],[-65.72,59.0],[-65.72,59.02],[-65.7,59.03],[-65.54,59.01],[-65.53,59.04],[-65.4,59.04],[-65.38,59.06],[-65.5,59.09],[-65.61,59.11],[-65.64,59.13],[-65.67,59.15],[-65.7,59.21],[-65.69,59.23],[-65.66,59.23],[-65.61,59.21],[-65.58,59.24],[-65.55,59.32],[-65.51,59.35],[-65.41,59.31],[-65.41,59.33],[-65.49,59.45],[-65.48,59.47],[-65.35,59.48],[-65.27,59.46],[-65.07,59.38],[-65.04,59.39],[-65.07,59.41],[-65.17,59.46],[-65.26,59.5],[-65.35,59.51],[-65.41,59.54],[-65.48,59.62],[-65.49,59.65],[-65.48,59.69],[-65.43,59.78],[-65.41,59.8],[-65.36,59.81],[-65.29,59.82],[-65.21,59.81],[-65.05,59.75],[-65.03,59.77],[-65.11,59.8],[-65.16,59.83],[-65.18,59.87],[-65.17,59.91],[-65.1,59.99],[-65.07,60.06],[-64.93,60.25],[-64.89,60.29],[-64.85,60.31],[-64.82,60.33],[-64.71,60.34],[-64.5,60.27],[-64.44,60.23],[-64.42,60.17],[-64.53,60.09],[-64.71,60.04],[-64.77,60.01],[-64.73,60.0],[-64.56,60.04],[-64.41,60.06],[-64.28,60.06],[-64.18,59.97],[-64.17,59.85],[-64.23,59.74],[-64.15,59.79],[-64.06,59.82],[-63.98,59.75],[-63.97,59.7],[-63.93,59.64],[-63.84,59.57],[-63.75,59.51],[-63.85,59.45],[-63.97,59.41],[-63.95,59.38],[-63.78,59.35],[-63.76,59.32],[-63.78,59.28],[-63.75,59.28],[-63.64,59.34],[-63.54,59.33],[-63.42,59.19],[-63.51,59.12],[-63.65,59.08],[-63.76,59.06],[-63.91,59.07],[-63.97,59.05],[-63.94,59.03],[-63.79,59.03],[-63.57,59.05],[-63.4,59.08],[-63.33,59.08],[-63.25,59.07],[-63.22,59.06],[-63.3,59.03],[-63.31,59.03],[-63.28,59.0],[-63.22,58.93],[-63.22,58.91],[-63.28,58.87],[-63.19,58.86],[-63.05,58.88],[-63.01,58.86],[-62.93,58.77],[-62.87,58.67],[-63.1,58.55],[-63.22,58.52],[-63.39,58.45],[-63.44,58.4],[-63.54,58.33],[-63.47,58.33],[-63.3,58.44],[-63.21,58.47],[-63.15,58.46],[-63.12,58.44],[-63.13,58.41],[-63.08,58.41],[-62.84,58.48],[-62.74,58.49],[-62.61,58.5],[-62.59,58.47],[-62.67,58.32],[-62.81,58.2],[-63.06,58.13],[-63.15,58.08],[-63.26,58.01],[-63.22,58.0],[-62.98,58.09],[-62.82,58.13],[-62.59,58.16],[-62.49,58.15],[-62.31,57.97],[-62.2,57.95],[-62.12,57.96],[-61.96,57.91],[-61.9,57.86],[-61.91,57.83],[-61.97,57.8],[-61.99,57.77],[-61.93,57.67],[-61.97,57.61],[-62.08,57.56],[-62.17,57.54],[-62.25,57.53],[-62.34,57.48],[-62.38,57.48],[-62.5,57.49],[-62.45,57.46],[-62.4,57.45],[-62.3,57.44],[-62.19,57.45],[-62.09,57.45],[-61.92,57.42],[-61.85,57.38],[-61.85,57.37],[-61.89,57.35],[-61.94,57.27],[-61.98,57.25],[-61.94,57.23],[-61.86,57.2],[-61.8,57.19],[-61.72,57.2],[-61.63,57.18],[-61.33,57.01],[-61.35,56.92],[-61.39,56.85],[-61.37,56.78],[-61.37,56.68],[-61.53,56.65],[-62.06,56.7],[-62.37,56.77],[-62.38,56.79],[-62.3,56.83],[-62.37,56.84],[-62.46,56.82],[-62.5,56.8],[-62.4,56.73],[-62.12,56.67],[-61.99,56.59],[-61.85,56.58],[-61.81,56.57],[-61.74,56.53],[-61.76,56.51],[-61.9,56.51],[-62.01,56.45],[-61.94,56.42],[-61.69,56.4],[-61.51,56.39],[-61.43,56.36],[-61.5,56.33],[-61.71,56.29],[-61.71,56.23],[-61.56,56.21],[-61.42,56.22],[-61.36,56.22],[-61.32,56.08],[-61.3,56.05],[-61.45,56.02],[-61.45,56.0],[-61.35,55.97],[-61.19,55.96],[-61.13,55.93],[-61.12,55.89],[-61.09,55.87],[-61.0,55.86],[-60.89,55.91],[-60.83,55.96],[-60.74,55.94],[-60.74,55.89],[-60.63,55.82],[-60.59,55.81],[-60.56,55.73],[-60.48,55.81],[-60.41,55.79],[-60.34,55.78],[-60.37,55.71],[-60.41,55.65],[-60.35,55.61],[-60.31,55.56],[-60.19,55.48],[-60.22,55.44],[-60.36,55.37],[-60.43,55.24],[-60.45,55.2],[-60.52,55.13],[-60.62,55.06],[-60.56,55.07],[-60.34,55.19],[-60.21,55.24],[-59.93,55.26],[-59.86,55.29],[-59.76,55.31],[-59.7,55.27],[-59.69,55.2],[-59.61,55.17],[-59.52,55.2],[-59.44,55.18],[-59.49,55.13],[-59.74,54.94],[-59.82,54.87],[-59.84,54.81],[-59.75,54.89],[-59.43,55.06],[-59.39,55.08],[-59.32,55.15],[-59.26,55.2],[-59.09,55.18],[-59.0,55.15],[-58.96,55.06],[-58.89,54.95],[-58.78,54.84],[-58.5,54.78],[-58.4,54.77],[-58.22,54.81],[-58.2,54.87],[-58.06,54.88],[-57.96,54.88],[-57.93,54.77],[-57.83,54.72],[-57.72,54.67],[-57.63,54.65],[-57.48,54.64],[-57.4,54.59],[-57.4,54.57],[-57.49,54.52],[-57.56,54.44],[-57.7,54.39],[-57.89,54.38],[-58.15,54.35],[-58.16,54.32],[-58.22,54.29],[-58.36,54.25],[-58.44,54.23],[-58.56,54.1],[-58.63,54.05],[-58.72,54.04],[-58.84,54.04],[-58.92,54.03],[-58.98,54.01],[-59.01,53.98],[-59.04,53.96],[-59.2,53.93],[-59.5,53.83],[-59.65,53.83],[-59.75,53.84],[-59.82,53.83],[-59.87,53.81],[-60.01,53.76],[-60.06,53.73],[-60.08,53.7],[-60.1,53.63],[-60.12,53.61],[-60.14,53.6],[-60.26,53.61],[-60.4,53.65],[-60.37,53.61],[-60.16,53.53],[-60.1,53.49],[-60.16,53.45],[-60.29,53.39],[-60.31,53.36],[-60.25,53.34],[-60.27,53.32],[-60.35,53.29],[-60.34,53.28],[-60.33,53.27],[-60.15,53.31],[-59.99,53.39],[-59.88,53.48],[-59.83,53.5],[-59.62,53.54],[-59.5,53.57],[-59.32,53.64],[-59.13,53.74],[-58.92,53.88],[-58.65,53.98],[-58.33,54.05],[-58.09,54.09],[-57.94,54.09],[-57.93,54.1],[-58.06,54.13],[-58.18,54.13],[-58.32,54.11],[-58.36,54.15],[-58.36,54.17],[-58.31,54.2],[-58.19,54.23],[-57.61,54.19],[-57.42,54.16],[-57.2,53.92],[-57.15,53.85],[-57.13,53.79],[-57.16,53.76],[-57.24,53.72],[-57.49,53.63],[-57.52,53.61],[-57.53,53.6],[-57.42,53.58],[-57.39,53.56],[-57.33,53.47],[-57.22,53.53],[-57.01,53.67],[-56.84,53.74],[-56.7,53.76],[-56.52,53.77],[-56.46,53.77],[-56.44,53.72],[-56.35,53.62],[-56.27,53.6],[-56.11,53.59],[-55.97,53.47],[-55.91,53.39],[-55.86,53.34],[-55.86,53.31],[-55.85,53.29],[-55.82,53.25],[-55.8,53.21],[-55.81,53.13],[-55.89,53.0],[-55.83,52.88],[-55.86,52.82],[-55.87,52.74],[-55.82,52.68],[-55.8,52.64],[-55.85,52.62],[-56.17,52.57],[-56.29,52.57],[-56.32,52.54],[-56.23,52.54],[-56.05,52.54],[-55.84,52.51],[-55.75,52.47],[-55.71,52.43],[-55.72,52.39],[-55.78,52.36],[-55.9,52.37],[-56.01,52.39],[-56.0,52.37],[-55.83,52.31],[-55.78,52.28],[-55.69,52.24],[-55.67,52.19],[-55.7,52.14],[-56.02,51.93],[-56.28,51.8],[-56.55,51.68],[-56.98,51.46],[-57.02,51.45],[-57.1,51.44],[-57.3,51.48],[-57.46,51.47],[-57.77,51.43],[-57.85,51.4],[-58.02,51.32],[-58.09,51.31],[-58.27,51.3],[-58.44,51.31],[-58.51,51.3],[-58.59,51.26],[-58.61,51.24],[-58.64,51.17],[-59.05,50.88],[-59.17,50.78],[-59.38,50.68],[-59.61,50.49],[-59.82,50.42],[-59.89,50.32],[-60.08,50.25],[-60.44,50.24],[-60.61,50.22],[-60.81,50.25],[-60.96,50.21],[-61.18,50.19],[-61.29,50.2],[-61.72,50.1],[-61.84,50.2],[-61.92,50.23],[-62.17,50.24],[-62.36,50.28],[-62.54,50.28],[-62.72,50.3],[-62.83,50.3],[-62.95,50.29],[-63.14,50.29],[-63.24,50.24],[-63.59,50.26],[-63.73,50.3],[-63.85,50.31],[-64.02,50.3],[-64.17,50.27],[-64.51,50.31],[-64.87,50.28],[-65.18,50.3],[-65.27,50.32],[-65.76,50.26],[-65.96,50.29],[-66.13,50.2],[-66.24,50.22],[-66.37,50.21],[-66.41,50.22],[-66.5,50.21],[-66.55,50.16],[-66.62,50.16],[-66.74,50.07],[-66.94,49.99],[-67.23,49.6],[-67.26,49.45],[-67.37,49.35],[-67.47,49.33],[-67.55,49.33],[-68.06,49.26],[-68.28,49.2],[-68.22,49.15],[-68.29,49.11],[-68.41,49.1],[-68.54,49.06],[-68.63,49.01],[-68.67,48.94],[-68.93,48.83],[-69.23,48.57],[-69.37,48.39],[-69.55,48.25],[-69.67,48.2],[-69.76,48.19],[-69.85,48.21],[-70.0,48.27],[-70.11,48.28],[-70.38,48.37],[-71.02,48.46],[-70.92,48.42],[-70.84,48.37],[-70.67,48.35],[-70.5,48.35],[-70.15,48.24],[-69.97,48.21],[-69.87,48.17],[-69.78,48.1],[-69.84,47.95],[-69.91,47.83],[-69.99,47.74],[-70.3,47.5],[-70.45,47.42],[-70.71,47.14],[-70.97,47.01],[-71.12,46.92],[-71.27,46.8],[-71.62,46.7],[-71.76,46.67],[-71.88,46.69],[-72.03,46.61],[-72.2,46.56],[-72.26,46.49],[-72.68,46.29],[-72.84,46.26],[-72.98,46.21],[-73.02,46.12],[-73.15,46.07],[-73.18,46.02],[-73.28,45.9],[-73.48,45.74],[-73.71,45.71],[-73.8,45.65],[-73.9,45.56],[-74.04,45.5],[-74.32,45.53],[-74.25,45.49],[-74.0,45.43],[-73.97,45.35],[-74.1,45.32],[-74.36,45.21],[-74.71,45.0]],[[-96.78,72.94],[-96.94,72.93],[-97.09,73.0],[-97.1,73.06],[-97.09,73.1],[-97.07,73.13],[-97.01,73.16],[-96.86,73.19],[-96.79,73.17],[-96.77,73.14],[-96.74,73.13],[-96.65,73.1],[-96.6,73.07],[-96.6,73.04],[-96.64,72.99],[-96.67,72.96],[-96.71,72.95],[-96.78,72.94]],[[-114.52,72.59],[-114.46,72.58],[-114.34,72.59],[-114.17,72.62],[-113.96,72.65],[-113.69,72.67],[-113.62,72.65],[-113.58,72.65],[-113.5,72.69],[-113.49,72.72],[-113.5,72.75],[-113.49,72.82],[-113.45,72.86],[-113.29,72.95],[-113.21,72.98],[-113.07,73.0],[-112.75,72.99],[-112.45,72.94],[-112.05,72.89],[-111.46,72.77],[-111.27,72.71],[-111.25,72.67],[-111.36,72.57],[-111.61,72.44],[-111.82,72.39],[-111.9,72.36],[-111.76,72.34],[-111.68,72.3],[-111.54,72.35],[-111.45,72.41],[-111.31,72.45],[-111.26,72.46],[-111.25,72.45],[-111.28,72.42],[-111.29,72.4],[-111.28,72.38],[-111.27,72.36],[-111.18,72.36],[-111.14,72.37],[-110.96,72.43],[-110.78,72.53],[-110.51,72.6],[-110.44,72.63],[-110.21,72.66],[-110.21,72.68],[-110.2,72.76],[-110.28,72.79],[-110.55,72.86],[-110.69,72.94],[-110.66,73.01],[-110.51,73.0],[-110.09,72.99],[-110.01,72.98],[-109.61,72.88],[-109.47,72.81],[-109.36,72.78],[-109.12,72.73],[-109.04,72.69],[-108.99,72.67],[-108.97,72.65],[-108.99,72.64],[-108.99,72.6],[-108.95,72.58],[-108.8,72.57],[-108.75,72.55],[-108.7,72.5],[-108.63,72.41],[-108.57,72.32],[-108.47,72.14],[-108.28,71.9],[-108.21,71.75],[-108.19,71.72],[-108.14,71.7],[-108.02,71.68],[-107.93,71.64],[-107.81,71.63],[-107.79,71.63],[-107.76,71.66],[-107.69,71.72],[-107.35,71.82],[-107.33,71.84],[-107.37,71.86],[-107.38,71.88],[-107.38,71.89],[-107.31,71.89],[-107.54,72.03],[-107.7,72.15],[-107.79,72.3],[-107.81,72.35],[-107.82,72.44],[-107.86,72.47],[-107.91,72.49],[-107.93,72.52],[-107.92,72.56],[-107.93,72.59],[-108.0,72.65],[-108.24,73.11],[-108.24,73.15],[-108.2,73.18],[-108.12,73.2],[-107.98,73.21],[-107.94,73.22],[-107.99,73.23],[-108.08,73.28],[-108.09,73.3],[-108.03,73.35],[-107.72,73.33],[-107.5,73.29],[-107.11,73.19],[-107.07,73.2],[-107.03,73.25],[-106.95,73.28],[-106.83,73.27],[-106.48,73.2],[-106.08,73.07],[-105.81,73.01],[-105.62,72.93],[-105.5,72.85],[-105.42,72.79],[-105.41,72.76],[-105.43,72.74],[-105.41,72.71],[-105.35,72.67],[-105.32,72.63],[-105.3,72.56],[-105.25,72.46],[-105.23,72.42],[-104.88,71.98],[-104.81,71.9],[-104.77,71.87],[-104.52,71.7],[-104.39,71.58],[-104.37,71.5],[-104.36,71.47],[-104.35,71.43],[-104.36,71.38],[-104.38,71.34],[-104.44,71.3],[-104.49,71.25],[-104.56,71.13],[-104.57,71.1],[-104.51,71.06],[-104.17,70.93],[-103.95,70.76],[-103.85,70.73],[-103.58,70.63],[-103.29,70.57],[-103.2,70.55],[-103.1,70.51],[-103.08,70.51],[-103.02,70.52],[-103.01,70.53],[-103.0,70.54],[-103.08,70.62],[-103.09,70.65],[-103.05,70.66],[-102.75,70.52],[-102.59,70.47],[-102.37,70.41],[-101.99,70.29],[-101.94,70.27],[-101.73,70.29],[-101.68,70.28],[-101.64,70.27],[-101.63,70.25],[-101.62,70.17],[-101.56,70.14],[-101.24,70.15],[-101.15,70.15],[-101.09,70.14],[-101.04,70.11],[-100.97,70.03],[-100.91,69.87],[-100.91,69.81],[-100.94,69.72],[-100.98,69.68],[-101.04,69.67],[-101.22,69.68],[-101.34,69.71],[-101.4,69.75],[-101.46,69.83],[-101.48,69.85],[-101.51,69.83],[-101.57,69.76],[-101.6,69.72],[-101.65,69.7],[-101.73,69.7],[-101.86,69.74],[-102.1,69.82],[-102.18,69.85],[-102.23,69.84],[-102.35,69.81],[-102.52,69.76],[-102.6,69.72],[-102.57,69.69],[-102.54,69.66],[-102.53,69.62],[-102.54,69.59],[-102.56,69.57],[-102.62,69.55],[-102.74,69.55],[-102.92,69.56],[-103.06,69.59],[-103.3,69.67],[-103.36,69.69],[-103.43,69.67],[-103.46,69.64],[-103.42,69.61],[-103.29,69.57],[-103.14,69.5],[-103.1,69.48],[-103.06,69.48],[-103.05,69.47],[-103.03,69.43],[-103.04,69.37],[-103.11,69.24],[-103.12,69.2],[-103.09,69.21],[-102.88,69.34],[-102.78,69.38],[-102.55,69.43],[-102.45,69.48],[-102.15,69.49],[-102.05,69.46],[-101.98,69.43],[-101.98,69.41],[-102.05,69.36],[-102.07,69.34],[-102.07,69.31],[-102.06,69.28],[-102.05,69.26],[-101.99,69.24],[-101.9,69.25],[-101.87,69.24],[-101.82,69.22],[-101.79,69.18],[-101.79,69.13],[-101.86,69.02],[-101.98,68.99],[-102.36,68.92],[-102.49,68.89],[-102.74,68.86],[-102.83,68.83],[-102.9,68.82],[-103.16,68.83],[-103.47,68.81],[-103.82,68.85],[-104.07,68.87],[-104.35,68.93],[-104.46,68.91],[-104.57,68.87],[-105.11,68.92],[-105.17,68.96],[-105.15,68.98],[-105.02,69.05],[-105.01,69.07],[-105.02,69.08],[-105.26,69.09],[-105.53,69.13],[-105.8,69.15],[-106.01,69.15],[-106.14,69.16],[-106.27,69.19],[-106.34,69.22],[-106.35,69.25],[-106.36,69.28],[-106.34,69.34],[-106.36,69.38],[-106.42,69.41],[-106.54,69.44],[-106.66,69.44],[-106.76,69.41],[-106.86,69.35],[-107.03,69.18],[-107.12,69.15],[-107.35,69.03],[-107.44,69.0],[-107.86,68.95],[-108.36,68.93],[-108.55,68.9],[-108.73,68.83],[-108.95,68.76],[-109.47,68.68],[-109.96,68.63],[-110.47,68.61],[-110.85,68.58],[-110.96,68.59],[-111.13,68.59],[-111.31,68.54],[-111.52,68.53],[-112.3,68.52],[-112.67,68.49],[-112.86,68.48],[-113.02,68.48],[-113.13,68.49],[-113.23,68.54],[-113.34,68.6],[-113.55,68.77],[-113.62,68.84],[-113.59,68.96],[-113.61,69.03],[-113.68,69.18],[-113.69,69.2],[-114.07,69.25],[-114.32,69.27],[-114.7,69.27],[-115.16,69.26],[-115.62,69.28],[-115.86,69.3],[-116.1,69.34],[-116.51,69.42],[-116.54,69.43],[-116.57,69.46],[-116.61,69.51],[-116.71,69.58],[-116.99,69.72],[-117.1,69.8],[-117.12,69.83],[-117.15,69.89],[-117.18,69.99],[-117.2,70.05],[-117.16,70.09],[-117.14,70.1],[-116.55,70.18],[-115.53,70.26],[-114.59,70.31],[-114.17,70.31],[-113.92,70.28],[-113.67,70.27],[-113.21,70.26],[-112.64,70.23],[-112.52,70.23],[-112.27,70.25],[-112.19,70.28],[-111.78,70.27],[-111.7,70.29],[-111.63,70.31],[-111.73,70.35],[-112.11,70.45],[-113.15,70.62],[-113.4,70.65],[-113.76,70.69],[-113.97,70.7],[-114.23,70.67],[-114.33,70.68],[-114.59,70.64],[-114.84,70.62],[-115.31,70.6],[-115.99,70.59],[-116.09,70.59],[-116.23,70.62],[-116.33,70.62],[-116.99,70.6],[-117.59,70.63],[-118.26,70.89],[-118.38,70.97],[-118.35,71.0],[-118.27,71.03],[-117.93,71.13],[-117.81,71.16],[-117.31,71.21],[-116.82,71.28],[-116.42,71.34],[-116.23,71.36],[-116.04,71.36],[-115.89,71.38],[-115.92,71.4],[-116.05,71.42],[-116.04,71.45],[-115.98,71.47],[-115.73,71.49],[-115.47,71.47],[-115.34,71.47],[-115.3,71.49],[-115.34,71.51],[-115.59,71.55],[-116.78,71.44],[-117.34,71.43],[-117.72,71.39],[-117.94,71.39],[-118.19,71.44],[-118.22,71.45],[-118.23,71.47],[-118.15,71.53],[-117.88,71.56],[-117.74,71.66],[-117.89,71.66],[-118.37,71.64],[-118.58,71.65],[-118.87,71.69],[-118.95,71.73],[-118.99,71.76],[-118.99,71.8],[-118.98,71.91],[-118.96,71.97],[-118.94,71.99],[-118.59,72.17],[-118.37,72.21],[-118.21,72.26],[-118.21,72.29],[-118.25,72.31],[-118.39,72.37],[-118.45,72.4],[-118.48,72.43],[-118.46,72.47],[-118.37,72.53],[-118.13,72.63],[-117.55,72.83],[-117.26,72.91],[-116.97,72.96],[-116.57,73.05],[-115.55,73.21],[-114.64,73.37],[-114.3,73.33],[-114.21,73.3],[-114.16,73.27],[-114.13,73.23],[-114.1,73.18],[-114.05,73.07],[-114.05,73.01],[-114.05,72.96],[-114.07,72.91],[-114.11,72.86],[-114.18,72.81],[-114.28,72.74],[-114.5,72.63],[-114.52,72.59]],[[-105.29,72.92],[-105.34,72.91],[-105.43,72.94],[-105.57,72.99],[-105.8,73.09],[-106.07,73.2],[-106.11,73.26],[-106.18,73.3],[-106.53,73.41],[-106.75,73.46],[-106.92,73.48],[-106.95,73.51],[-106.83,73.6],[-106.69,73.67],[-106.61,73.7],[-106.36,73.72],[-105.51,73.77],[-105.32,73.77],[-105.11,73.74],[-104.83,73.65],[-104.72,73.64],[-104.65,73.61],[-104.59,73.58],[-104.56,73.54],[-104.55,73.47],[-104.58,73.35],[-104.62,73.31],[-104.79,73.17],[-104.97,73.09],[-105.0,73.04],[-105.07,73.0],[-105.2,72.95],[-105.29,72.92]],[[-79.54,73.65],[-79.37,73.64],[-78.29,73.67],[-78.06,73.65],[-77.38,73.54],[-77.21,73.5],[-77.12,73.45],[-77.04,73.37],[-77.01,73.36],[-76.76,73.31],[-76.66,73.25],[-76.62,73.23],[-76.57,73.16],[-76.46,73.12],[-76.33,73.1],[-76.29,73.08],[-76.31,73.0],[-76.26,72.96],[-76.14,72.91],[-76.09,72.88],[-76.18,72.84],[-76.4,72.82],[-77.01,72.84],[-77.84,72.9],[-78.31,72.88],[-78.55,72.86],[-79.13,72.77],[-79.32,72.76],[-79.5,72.76],[-79.82,72.83],[-79.94,72.86],[-79.98,72.89],[-80.05,72.98],[-80.11,73.08],[-80.15,73.16],[-80.18,73.22],[-80.29,73.25],[-80.62,73.27],[-80.73,73.31],[-80.78,73.33],[-80.82,73.38],[-80.82,73.43],[-80.8,73.47],[-80.78,73.48],[-80.74,73.48],[-80.83,73.53],[-80.86,73.59],[-80.86,73.67],[-80.85,73.72],[-80.82,73.74],[-80.76,73.76],[-80.62,73.77],[-80.41,73.77],[-80.12,73.71],[-79.89,73.7],[-79.54,73.65]],[[-86.59,71.01],[-86.55,70.99],[-86.32,71.02],[-86.13,71.05],[-85.82,71.13],[-85.64,71.15],[-85.09,71.15],[-85.0,71.14],[-85.04,71.09],[-85.07,71.08],[-85.05,71.06],[-84.99,71.03],[-84.87,71.0],[-84.82,71.03],[-84.79,71.09],[-84.71,71.36],[-84.67,71.44],[-84.66,71.51],[-84.66,71.59],[-84.7,71.63],[-84.84,71.66],[-85.03,71.65],[-85.13,71.66],[-85.25,71.68],[-85.34,71.7],[-85.4,71.73],[-85.51,71.82],[-85.6,71.87],[-85.81,71.96],[-85.91,71.99],[-85.86,72.02],[-85.66,72.06],[-85.55,72.1],[-85.41,72.21],[-85.32,72.23],[-85.02,72.22],[-84.61,72.13],[-84.35,72.05],[-84.28,72.04],[-84.28,72.06],[-84.35,72.09],[-84.64,72.19],[-84.78,72.26],[-84.84,72.31],[-84.81,72.33],[-84.64,72.35],[-84.62,72.38],[-84.85,72.41],[-84.96,72.41],[-85.06,72.38],[-85.16,72.38],[-85.34,72.42],[-85.39,72.44],[-85.5,72.51],[-85.55,72.57],[-85.62,72.6],[-85.64,72.63],[-85.65,72.72],[-85.64,72.77],[-85.62,72.82],[-85.57,72.86],[-85.45,72.93],[-85.39,72.95],[-85.26,72.95],[-84.99,72.92],[-84.26,72.8],[-84.27,72.84],[-85.09,73.0],[-85.38,73.05],[-85.45,73.11],[-85.02,73.34],[-84.62,73.39],[-84.42,73.46],[-84.09,73.46],[-83.78,73.42],[-83.78,73.43],[-83.91,73.51],[-83.9,73.53],[-83.73,73.58],[-83.41,73.63],[-83.02,73.68],[-82.94,73.7],[-82.84,73.72],[-82.66,73.73],[-82.2,73.74],[-81.95,73.73],[-81.61,73.7],[-81.41,73.63],[-81.34,73.6],[-81.24,73.48],[-81.15,73.31],[-81.03,73.25],[-80.82,73.21],[-80.68,73.17],[-80.6,73.12],[-80.58,73.06],[-80.62,73.0],[-80.59,72.93],[-80.5,72.86],[-80.43,72.82],[-80.28,72.77],[-80.27,72.75],[-80.32,72.72],[-80.42,72.68],[-80.68,72.56],[-81.0,72.43],[-81.23,72.31],[-81.24,72.28],[-80.76,72.46],[-80.61,72.45],[-80.6,72.43],[-80.7,72.34],[-80.82,72.26],[-80.94,72.21],[-80.92,72.19],[-80.69,72.1],[-80.73,72.09],[-80.84,72.1],[-80.89,72.09],[-80.92,72.07],[-80.94,72.05],[-80.94,72.01],[-80.93,71.97],[-80.93,71.94],[-80.95,71.92],[-80.93,71.91],[-80.86,71.91],[-80.8,71.93],[-80.71,71.99],[-80.39,72.15],[-80.18,72.21],[-80.12,72.21],[-79.93,72.17],[-79.88,72.18],[-80.09,72.3],[-80.11,72.33],[-80.07,72.38],[-80.04,72.39],[-79.93,72.43],[-79.83,72.45],[-79.78,72.44],[-79.69,72.38],[-79.65,72.33],[-79.58,72.31],[-79.43,72.34],[-79.32,72.39],[-79.19,72.36],[-79.0,72.27],[-79.02,72.19],[-79.02,72.1],[-79.01,72.04],[-78.78,71.93],[-78.61,71.88],[-78.59,71.88],[-78.59,71.9],[-78.62,71.93],[-78.71,71.97],[-78.79,72.03],[-78.86,72.1],[-78.82,72.27],[-78.7,72.35],[-78.58,72.33],[-78.43,72.28],[-78.31,72.28],[-78.12,72.28],[-77.73,72.18],[-77.52,72.18],[-77.54,72.22],[-77.69,72.24],[-77.93,72.29],[-78.29,72.36],[-78.45,72.44],[-78.48,72.47],[-78.48,72.51],[-78.46,72.54],[-78.42,72.57],[-78.35,72.6],[-78.0,72.69],[-77.75,72.72],[-77.57,72.74],[-77.26,72.74],[-76.89,72.72],[-76.7,72.7],[-76.47,72.63],[-76.19,72.57],[-76.09,72.56],[-75.97,72.56],[-75.83,72.58],[-75.7,72.57],[-75.29,72.48],[-75.19,72.43],[-75.12,72.38],[-75.07,72.32],[-75.04,72.27],[-75.05,72.23],[-75.39,72.04],[-75.54,72.01],[-75.64,71.94],[-75.79,71.8],[-75.91,71.73],[-75.92,71.72],[-75.9,71.71],[-75.82,71.75],[-75.69,71.84],[-75.6,71.92],[-75.43,71.98],[-75.15,72.06],[-74.9,72.1],[-74.69,72.1],[-74.52,72.09],[-74.38,72.07],[-74.29,72.05],[-74.27,72.04],[-74.21,71.98],[-74.21,71.94],[-74.25,71.89],[-74.32,71.84],[-74.62,71.79],[-74.79,71.74],[-74.89,71.73],[-75.2,71.71],[-75.19,71.69],[-74.96,71.67],[-74.7,71.68],[-74.71,71.65],[-74.83,71.57],[-74.87,71.5],[-74.83,71.45],[-74.84,71.41],[-74.93,71.31],[-75.04,71.23],[-75.0,71.22],[-74.76,71.34],[-74.7,71.47],[-74.6,71.58],[-74.49,71.65],[-74.4,71.67],[-74.14,71.68],[-73.99,71.75],[-73.87,71.77],[-73.81,71.77],[-73.71,71.75],[-73.71,71.72],[-73.87,71.6],[-74.2,71.4],[-74.06,71.43],[-73.97,71.47],[-73.85,71.52],[-73.71,71.59],[-73.62,71.53],[-73.48,71.48],[-73.4,71.37],[-73.26,71.32],[-73.18,71.28],[-73.19,71.35],[-73.31,71.48],[-73.28,71.54],[-73.19,71.56],[-72.9,71.68],[-72.7,71.64],[-72.58,71.61],[-72.52,71.62],[-72.36,71.61],[-72.12,71.59],[-71.88,71.56],[-71.64,71.52],[-71.46,71.46],[-71.33,71.4],[-71.26,71.36],[-71.23,71.34],[-71.19,71.28],[-71.22,71.24],[-71.4,71.15],[-71.5,71.11],[-71.59,71.09],[-71.86,71.1],[-71.94,71.09],[-72.02,71.07],[-72.3,70.94],[-72.45,70.88],[-72.6,70.85],[-72.63,70.83],[-72.31,70.83],[-72.22,70.87],[-72.15,70.94],[-72.01,71.01],[-71.74,71.05],[-71.37,70.98],[-71.19,70.98],[-71.05,71.05],[-70.89,71.1],[-70.83,71.11],[-70.79,71.1],[-70.67,71.05],[-70.64,71.01],[-70.64,70.9],[-70.66,70.87],[-70.76,70.79],[-71.02,70.67],[-71.19,70.63],[-71.38,70.61],[-71.59,70.57],[-71.66,70.53],[-71.73,70.49],[-71.8,70.46],[-71.89,70.43],[-71.77,70.39],[-71.73,70.4],[-71.68,70.42],[-71.56,70.51],[-71.48,70.54],[-71.43,70.55],[-71.38,70.55],[-71.32,70.53],[-71.28,70.5],[-71.28,70.43],[-71.43,70.13],[-71.41,70.13],[-71.31,70.21],[-71.05,70.52],[-70.98,70.58],[-70.85,70.64],[-70.56,70.74],[-70.34,70.79],[-70.08,70.83],[-69.95,70.85],[-69.8,70.83],[-69.7,70.79],[-69.56,70.78],[-69.4,70.79],[-69.29,70.78],[-69.17,70.76],[-69.07,70.73],[-68.89,70.69],[-68.5,70.61],[-68.45,70.59],[-68.4,70.56],[-68.36,70.52],[-68.36,70.48],[-68.42,70.44],[-68.48,70.41],[-68.56,70.41],[-68.64,70.38],[-68.79,70.32],[-68.84,70.31],[-69.08,70.29],[-69.3,70.28],[-69.44,70.25],[-69.7,70.19],[-70.06,70.07],[-70.06,70.04],[-69.91,70.03],[-69.8,70.05],[-69.63,70.13],[-69.48,70.16],[-69.25,70.19],[-68.92,70.21],[-68.78,70.2],[-68.75,70.2],[-68.73,70.18],[-68.72,70.15],[-68.78,70.1],[-68.84,70.08],[-69.01,69.98],[-68.9,69.95],[-68.74,69.94],[-68.66,69.97],[-68.58,70.03],[-68.49,70.06],[-68.39,70.07],[-68.31,70.09],[-68.23,70.11],[-68.21,70.13],[-68.32,70.16],[-68.33,70.18],[-68.28,70.23],[-68.2,70.28],[-68.12,70.31],[-68.06,70.32],[-67.86,70.28],[-67.72,70.22],[-67.36,70.03],[-67.32,70.0],[-67.2,69.86],[-67.17,69.8],[-67.19,69.76],[-67.22,69.73],[-67.26,69.72],[-67.34,69.72],[-67.81,69.78],[-68.02,69.77],[-68.11,69.75],[-68.19,69.73],[-68.25,69.7],[-68.29,69.66],[-68.37,69.64],[-68.67,69.64],[-68.84,69.62],[-69.12,69.57],[-69.23,69.55],[-69.25,69.51],[-69.07,69.52],[-68.79,69.56],[-68.51,69.58],[-68.06,69.48],[-67.91,69.46],[-67.82,69.47],[-67.72,69.48],[-67.36,69.47],[-67.24,69.46],[-67.05,69.42],[-66.77,69.34],[-66.72,69.31],[-66.69,69.29],[-66.68,69.26],[-66.68,69.19],[-66.71,69.17],[-66.8,69.15],[-67.21,69.17],[-67.33,69.18],[-67.48,69.17],[-67.61,69.17],[-67.77,69.2],[-67.94,69.25],[-68.2,69.2],[-68.41,69.23],[-68.62,69.21],[-69.04,69.1],[-68.99,69.08],[-68.42,69.17],[-68.3,69.17],[-68.12,69.13],[-67.83,69.07],[-67.75,69.04],[-67.75,68.93],[-67.8,68.86],[-67.88,68.78],[-68.02,68.79],[-68.32,68.84],[-68.45,68.85],[-68.54,68.84],[-68.67,68.81],[-68.73,68.81],[-69.22,68.87],[-69.33,68.88],[-69.34,68.87],[-69.32,68.86],[-68.87,68.76],[-68.54,68.75],[-68.33,68.73],[-68.21,68.7],[-68.15,68.68],[-68.15,68.62],[-68.04,68.55],[-67.94,68.52],[-67.88,68.52],[-67.77,68.55],[-67.66,68.55],[-67.57,68.53],[-67.46,68.5],[-67.32,68.49],[-67.2,68.47],[-67.11,68.46],[-66.85,68.47],[-66.74,68.46],[-66.71,68.45],[-66.76,68.42],[-67.0,68.37],[-67.03,68.33],[-66.9,68.26],[-66.83,68.22],[-66.83,68.18],[-66.91,68.1],[-66.92,68.07],[-66.9,68.06],[-66.73,68.13],[-66.7,68.12],[-66.68,68.03],[-66.66,68.03],[-66.61,68.11],[-66.63,68.21],[-66.53,68.25],[-66.21,68.28],[-66.27,68.12],[-66.27,68.04],[-66.41,67.9],[-66.53,67.86],[-66.53,67.85],[-66.44,67.83],[-66.39,67.83],[-66.34,67.85],[-66.23,67.96],[-65.99,68.07],[-65.94,68.07],[-65.94,68.03],[-65.97,67.96],[-65.86,67.92],[-65.76,67.96],[-65.7,67.99],[-65.57,67.98],[-65.51,67.97],[-65.49,67.94],[-65.55,67.8],[-65.54,67.77],[-65.4,67.67],[-65.39,67.68],[-65.41,67.72],[-65.44,67.83],[-65.42,67.88],[-65.3,67.94],[-65.06,68.03],[-64.98,68.04],[-64.92,68.03],[-64.84,67.99],[-64.86,67.97],[-64.96,67.94],[-65.03,67.89],[-65.07,67.82],[-65.02,67.79],[-64.83,67.78],[-64.64,67.84],[-64.53,67.81],[-64.4,67.74],[-64.16,67.62],[-64.02,67.65],[-63.85,67.57],[-64.08,67.5],[-64.01,67.35],[-64.3,67.35],[-64.47,67.34],[-64.58,67.36],[-64.7,67.35],[-64.59,67.32],[-64.38,67.3],[-64.36,67.26],[-64.19,67.26],[-64.06,67.27],[-63.84,67.26],[-63.82,67.32],[-63.68,67.35],[-63.59,67.38],[-63.52,67.36],[-63.32,67.34],[-63.04,67.24],[-63.16,67.17],[-63.19,67.12],[-63.24,67.07],[-63.26,67.02],[-63.31,66.99],[-63.7,66.82],[-63.64,66.82],[-63.47,66.86],[-63.14,66.92],[-62.96,66.95],[-62.83,66.93],[-62.77,66.93],[-62.71,66.95],[-62.6,66.93],[-62.38,66.91],[-62.12,67.05],[-61.97,67.02],[-61.82,66.93],[-61.51,66.78],[-61.35,66.69],[-61.3,66.65],[-61.31,66.61],[-61.45,66.57],[-61.53,66.56],[-61.72,66.64],[-61.9,66.68],[-62.01,66.67],[-62.12,66.64],[-62.09,66.63],[-61.65,66.5],[-61.58,66.41],[-61.57,66.37],[-61.86,66.31],[-61.96,66.31],[-62.16,66.34],[-62.28,66.39],[-62.37,66.41],[-62.51,66.42],[-62.55,66.41],[-62.41,66.32],[-62.42,66.29],[-62.5,66.27],[-62.53,66.23],[-62.24,66.15],[-62.02,66.07],[-61.99,66.04],[-62.14,66.01],[-62.24,66.01],[-62.47,66.02],[-62.59,66.03],[-62.62,66.02],[-62.5,65.97],[-62.45,65.95],[-62.41,65.91],[-62.39,65.87],[-62.38,65.83],[-62.49,65.8],[-62.61,65.72],[-62.66,65.64],[-62.77,65.63],[-62.82,65.65],[-62.97,65.62],[-63.17,65.66],[-63.24,65.7],[-63.46,65.85],[-63.46,65.84],[-63.41,65.76],[-63.42,65.71],[-63.65,65.67],[-63.65,65.66],[-63.51,65.64],[-63.34,65.62],[-63.36,65.54],[-63.36,65.23],[-63.4,65.12],[-63.49,65.02],[-63.61,64.93],[-63.74,64.99],[-63.79,65.05],[-63.83,65.08],[-63.9,65.11],[-63.98,65.12],[-64.06,65.12],[-64.15,65.07],[-64.25,65.11],[-64.35,65.17],[-64.31,65.32],[-64.27,65.4],[-64.29,65.4],[-64.34,65.36],[-64.47,65.25],[-64.56,65.12],[-64.67,65.17],[-64.76,65.23],[-64.85,65.3],[-64.98,65.38],[-65.11,65.46],[-65.18,65.57],[-65.21,65.59],[-65.28,65.68],[-65.31,65.7],[-65.34,65.71],[-65.4,65.76],[-65.38,65.82],[-65.28,65.89],[-65.18,65.94],[-65.03,65.99],[-64.85,66.02],[-64.77,66.08],[-64.67,66.19],[-64.56,66.27],[-64.45,66.32],[-64.5,66.33],[-64.66,66.29],[-64.76,66.23],[-64.89,66.14],[-65.0,66.08],[-65.31,66.01],[-65.42,65.99],[-65.54,65.99],[-65.83,66.0],[-65.89,66.02],[-65.86,66.09],[-65.66,66.2],[-65.69,66.21],[-65.76,66.17],[-65.86,66.14],[-65.94,66.13],[-66.06,66.13],[-66.21,66.21],[-66.28,66.23],[-66.42,66.25],[-66.48,66.28],[-66.71,66.46],[-66.76,66.51],[-66.79,66.56],[-66.86,66.6],[-66.99,66.63],[-67.01,66.62],[-66.97,66.58],[-66.97,66.55],[-67.08,66.53],[-67.19,66.53],[-67.31,66.57],[-67.32,66.52],[-67.19,66.43],[-67.19,66.32],[-67.23,66.31],[-67.31,66.3],[-67.37,66.32],[-67.56,66.4],[-67.74,66.46],[-67.87,66.49],[-67.88,66.47],[-67.8,66.37],[-67.7,66.27],[-67.55,66.19],[-67.3,66.09],[-67.18,66.03],[-67.27,65.96],[-67.35,65.93],[-67.4,65.92],[-67.55,65.92],[-67.83,65.97],[-67.96,66.01],[-68.15,66.13],[-68.46,66.25],[-68.53,66.25],[-68.75,66.2],[-68.71,66.19],[-68.57,66.19],[-68.47,66.17],[-68.22,66.08],[-68.2,66.04],[-68.26,65.99],[-68.26,65.94],[-68.19,65.87],[-68.12,65.83],[-67.97,65.8],[-67.89,65.79],[-67.87,65.77],[-67.95,65.62],[-67.96,65.58],[-67.94,65.56],[-67.91,65.56],[-67.72,65.63],[-67.64,65.64],[-67.57,65.64],[-67.49,65.63],[-67.4,65.59],[-67.35,65.55],[-67.33,65.51],[-67.3,65.48],[-67.12,65.44],[-67.13,65.42],[-67.33,65.36],[-67.34,65.35],[-67.3,65.34],[-67.18,65.3],[-67.07,65.24],[-67.0,65.17],[-66.98,65.14],[-66.99,65.1],[-66.97,65.08],[-66.91,65.08],[-66.89,65.09],[-66.86,65.09],[-66.83,65.07],[-66.8,65.02],[-66.73,64.86],[-66.7,64.82],[-66.68,64.81],[-66.67,64.97],[-66.64,65.0],[-66.52,64.97],[-66.35,64.91],[-66.22,64.85],[-66.21,64.83],[-66.3,64.78],[-66.28,64.76],[-66.21,64.72],[-66.15,64.73],[-66.11,64.79],[-66.03,64.85],[-65.94,64.89],[-65.77,64.85],[-65.63,64.77],[-65.61,64.74],[-65.51,64.71],[-65.43,64.73],[-65.27,64.63],[-65.35,64.59],[-65.51,64.53],[-65.53,64.5],[-65.49,64.51],[-65.18,64.51],[-65.09,64.48],[-65.07,64.44],[-65.21,64.3],[-65.34,64.32],[-65.51,64.32],[-65.59,64.31],[-65.58,64.29],[-65.35,64.23],[-65.28,64.18],[-65.19,64.13],[-65.15,64.09],[-65.15,64.07],[-65.19,64.04],[-65.17,64.03],[-65.01,64.01],[-64.91,64.03],[-64.79,64.03],[-64.68,64.03],[-64.67,64.01],[-64.69,63.96],[-64.8,63.92],[-64.77,63.91],[-64.64,63.92],[-64.58,63.9],[-64.5,63.79],[-64.41,63.71],[-64.48,63.69],[-64.56,63.68],[-64.55,63.57],[-64.5,63.46],[-64.5,63.36],[-64.51,63.26],[-64.59,63.24],[-64.66,63.25],[-64.7,63.27],[-64.89,63.55],[-64.93,63.6],[-64.99,63.64],[-65.19,63.76],[-65.18,63.74],[-65.13,63.69],[-65.09,63.61],[-65.03,63.44],[-65.0,63.33],[-65.02,63.29],[-65.06,63.28],[-65.07,63.26],[-65.05,63.23],[-64.89,63.13],[-64.82,63.06],[-64.77,62.99],[-64.72,62.95],[-64.67,62.92],[-64.68,62.9],[-64.75,62.89],[-64.87,62.88],[-64.92,62.89],[-65.13,62.95],[-65.16,62.93],[-65.05,62.7],[-65.05,62.65],[-65.11,62.63],[-65.18,62.65],[-65.27,62.72],[-65.4,62.79],[-65.57,62.87],[-65.74,62.93],[-65.78,62.93],[-65.81,62.91],[-65.83,62.91],[-65.86,62.92],[-65.92,62.97],[-65.98,63.0],[-66.22,63.11],[-66.25,63.11],[-66.23,63.08],[-66.2,63.01],[-66.23,62.99],[-66.29,63.0],[-66.41,63.03],[-66.5,63.1],[-66.6,63.22],[-66.65,63.26],[-66.66,63.23],[-66.63,63.12],[-66.64,63.08],[-66.7,63.07],[-66.72,63.08],[-66.75,63.11],[-66.77,63.16],[-66.83,63.2],[-66.92,63.23],[-66.97,63.26],[-67.0,63.31],[-67.02,63.32],[-67.18,63.31],[-67.26,63.34],[-67.5,63.48],[-67.71,63.63],[-67.84,63.71],[-67.89,63.73],[-67.82,63.64],[-67.74,63.49],[-67.72,63.42],[-67.76,63.42],[-67.84,63.45],[-68.24,63.64],[-68.49,63.73],[-68.63,63.74],[-68.86,63.75],[-68.91,63.7],[-68.79,63.6],[-68.67,63.51],[-68.56,63.46],[-68.37,63.35],[-68.21,63.21],[-68.14,63.17],[-67.92,63.11],[-67.8,63.1],[-67.68,63.09],[-67.66,63.07],[-67.72,63.03],[-67.74,63.01],[-67.47,62.95],[-67.37,62.91],[-67.27,62.86],[-67.21,62.84],[-66.98,62.7],[-66.92,62.68],[-66.71,62.63],[-66.64,62.6],[-66.53,62.51],[-66.46,62.46],[-66.36,62.35],[-66.28,62.3],[-66.1,62.25],[-66.02,62.23],[-65.98,62.21],[-66.0,62.16],[-66.03,62.14],[-66.13,62.1],[-66.12,62.05],[-66.06,61.97],[-66.06,61.91],[-66.12,61.89],[-66.26,61.87],[-66.32,61.87],[-66.42,61.89],[-66.55,61.93],[-66.8,62.01],[-67.18,62.07],[-67.32,62.11],[-67.37,62.13],[-67.44,62.15],[-68.38,62.24],[-68.54,62.26],[-68.63,62.28],[-68.72,62.32],[-69.08,62.41],[-69.13,62.42],[-69.37,62.57],[-69.55,62.74],[-69.6,62.77],[-69.8,62.79],[-69.96,62.78],[-70.07,62.76],[-70.24,62.76],[-70.34,62.79],[-70.57,62.87],[-70.8,62.91],[-71.0,62.98],[-71.11,63.0],[-71.1,63.02],[-70.95,63.12],[-70.99,63.12],[-71.25,63.04],[-71.35,63.07],[-71.5,63.13],[-71.62,63.19],[-71.86,63.36],[-71.99,63.42],[-71.97,63.43],[-71.82,63.44],[-71.7,63.43],[-71.61,63.44],[-71.46,63.51],[-71.39,63.56],[-71.38,63.58],[-71.51,63.59],[-71.54,63.6],[-71.57,63.63],[-71.63,63.66],[-71.73,63.71],[-71.84,63.72],[-72.22,63.71],[-72.29,63.73],[-72.29,63.76],[-72.21,63.84],[-72.17,63.87],[-72.16,63.89],[-72.17,63.89],[-72.23,63.89],[-72.45,63.82],[-72.5,63.82],[-72.59,63.9],[-72.64,63.99],[-72.68,64.02],[-72.73,64.03],[-72.91,64.12],[-73.17,64.28],[-73.27,64.33],[-73.38,64.38],[-73.45,64.4],[-73.44,64.42],[-73.28,64.56],[-73.27,64.58],[-73.41,64.57],[-73.63,64.6],[-73.73,64.57],[-73.79,64.57],[-73.87,64.59],[-73.91,64.58],[-73.95,64.47],[-73.98,64.44],[-74.03,64.42],[-74.06,64.42],[-74.1,64.44],[-74.1,64.47],[-74.13,64.61],[-74.21,64.63],[-74.42,64.63],[-74.46,64.64],[-74.51,64.67],[-74.56,64.72],[-74.59,64.79],[-74.63,64.82],[-74.68,64.83],[-74.72,64.83],[-74.75,64.81],[-74.81,64.8],[-74.92,64.79],[-74.92,64.77],[-74.82,64.72],[-74.73,64.65],[-74.64,64.56],[-74.69,64.5],[-74.89,64.47],[-75.07,64.46],[-75.22,64.47],[-75.33,64.49],[-75.49,64.54],[-75.72,64.52],[-75.77,64.39],[-75.82,64.38],[-76.03,64.39],[-76.12,64.38],[-76.41,64.3],[-76.49,64.29],[-76.56,64.3],[-76.63,64.28],[-76.72,64.24],[-76.86,64.24],[-77.02,64.27],[-77.17,64.29],[-77.28,64.28],[-77.4,64.3],[-77.53,64.34],[-77.63,64.36],[-77.76,64.36],[-77.79,64.37],[-77.98,64.46],[-78.05,64.5],[-78.17,64.62],[-78.2,64.66],[-78.2,64.71],[-78.19,64.75],[-78.14,64.81],[-78.1,64.94],[-78.06,64.98],[-77.99,65.02],[-77.88,65.07],[-77.45,65.16],[-77.36,65.2],[-77.36,65.22],[-77.46,65.33],[-77.46,65.36],[-77.43,65.37],[-77.36,65.44],[-77.33,65.45],[-77.25,65.46],[-77.09,65.43],[-76.96,65.42],[-76.78,65.41],[-76.48,65.37],[-76.07,65.29],[-75.83,65.23],[-75.65,65.14],[-75.52,65.06],[-75.5,65.01],[-75.56,64.95],[-75.59,64.93],[-75.59,64.91],[-75.56,64.88],[-75.45,64.84],[-75.43,64.86],[-75.44,64.9],[-75.41,64.94],[-75.36,64.97],[-75.36,65.01],[-75.4,65.06],[-75.45,65.1],[-75.5,65.14],[-75.77,65.26],[-75.8,65.3],[-75.71,65.32],[-75.32,65.27],[-75.17,65.28],[-75.11,65.33],[-75.05,65.36],[-74.98,65.38],[-74.85,65.39],[-74.67,65.37],[-74.57,65.36],[-74.49,65.37],[-74.39,65.4],[-74.24,65.48],[-74.14,65.5],[-73.99,65.52],[-73.88,65.52],[-73.68,65.48],[-73.55,65.49],[-73.56,65.54],[-73.64,65.65],[-73.75,65.77],[-73.83,65.81],[-74.03,65.88],[-74.28,66.01],[-74.4,66.1],[-74.43,66.14],[-74.42,66.17],[-74.37,66.21],[-73.93,66.36],[-73.58,66.51],[-73.43,66.58],[-73.36,66.64],[-73.28,66.67],[-73.2,66.7],[-73.03,66.73],[-72.99,66.77],[-72.97,66.83],[-72.95,66.88],[-72.79,67.03],[-72.67,67.07],[-72.49,67.1],[-72.36,67.13],[-72.22,67.25],[-72.23,67.28],[-72.3,67.31],[-72.35,67.34],[-72.58,67.66],[-72.73,67.81],[-72.9,67.94],[-73.06,68.11],[-73.33,68.27],[-73.33,68.31],[-73.28,68.36],[-73.31,68.37],[-73.58,68.3],[-73.64,68.29],[-73.75,68.32],[-73.82,68.36],[-73.88,68.43],[-73.87,68.46],[-73.83,68.5],[-73.78,68.58],[-73.78,68.62],[-73.8,68.66],[-73.82,68.69],[-73.85,68.7],[-73.94,68.71],[-74.07,68.71],[-74.12,68.7],[-73.97,68.58],[-73.99,68.55],[-74.18,68.54],[-74.27,68.54],[-74.35,68.56],[-74.42,68.58],[-74.65,68.71],[-74.7,68.76],[-74.68,68.79],[-74.7,68.81],[-74.75,68.8],[-74.81,68.8],[-74.89,68.81],[-74.91,68.82],[-74.75,68.89],[-74.74,68.91],[-74.82,68.94],[-74.93,68.94],[-74.95,68.96],[-74.92,68.98],[-74.77,69.02],[-74.72,69.05],[-74.81,69.06],[-74.85,69.07],[-74.95,69.02],[-75.1,68.94],[-75.21,68.91],[-75.36,68.95],[-75.46,68.96],[-75.52,68.95],[-75.62,68.89],[-75.84,68.84],[-76.23,68.73],[-76.4,68.69],[-76.59,68.7],[-76.62,68.72],[-76.62,68.76],[-76.6,68.79],[-76.58,68.82],[-76.57,68.85],[-76.59,68.97],[-76.56,69.01],[-76.5,69.03],[-76.38,69.05],[-76.09,69.03],[-75.95,69.03],[-75.86,69.06],[-75.76,69.1],[-75.67,69.16],[-75.65,69.21],[-75.75,69.3],[-75.79,69.32],[-76.05,69.39],[-76.19,69.41],[-76.32,69.42],[-76.41,69.44],[-76.46,69.47],[-76.52,69.52],[-76.52,69.55],[-76.52,69.59],[-76.46,69.62],[-76.23,69.65],[-76.23,69.66],[-76.42,69.69],[-76.51,69.68],[-76.59,69.66],[-76.69,69.59],[-76.74,69.57],[-76.92,69.61],[-77.02,69.62],[-77.09,69.64],[-77.13,69.65],[-77.11,69.67],[-77.02,69.69],[-76.87,69.75],[-76.86,69.78],[-76.96,69.82],[-77.02,69.84],[-77.23,69.85],[-77.49,69.84],[-77.59,69.85],[-77.64,69.9],[-77.66,69.97],[-77.67,70.04],[-77.72,70.17],[-77.77,70.24],[-77.84,70.25],[-78.16,70.22],[-78.23,70.22],[-78.28,70.23],[-78.49,70.32],[-78.57,70.35],[-78.62,70.35],[-78.77,70.45],[-78.83,70.46],[-78.9,70.51],[-78.98,70.58],[-79.07,70.6],[-79.16,70.58],[-79.25,70.53],[-79.35,70.48],[-79.4,70.44],[-79.41,70.4],[-79.35,70.37],[-79.02,70.33],[-78.93,70.29],[-78.86,70.24],[-78.81,70.18],[-78.77,70.1],[-78.78,70.05],[-78.82,70.01],[-78.89,69.98],[-79.09,69.93],[-79.3,69.89],[-79.52,69.89],[-79.62,69.89],[-80.16,70.0],[-80.26,70.0],[-80.39,70.01],[-80.67,70.05],[-80.83,70.06],[-81.1,70.09],[-81.56,70.11],[-81.65,70.09],[-81.53,70.05],[-81.42,70.02],[-81.33,70.02],[-81.2,69.98],[-81.02,69.9],[-80.92,69.85],[-80.84,69.79],[-80.84,69.77],[-80.92,69.73],[-81.56,69.94],[-81.96,69.87],[-82.14,69.84],[-82.29,69.84],[-82.49,69.87],[-82.93,69.97],[-83.09,70.0],[-83.15,70.01],[-83.53,69.96],[-83.86,69.96],[-84.52,70.01],[-84.77,70.03],[-84.83,70.06],[-84.91,70.08],[-85.05,70.08],[-85.43,70.11],[-85.78,70.04],[-86.2,70.11],[-86.32,70.15],[-86.36,70.17],[-86.48,70.29],[-86.5,70.35],[-86.47,70.41],[-86.43,70.44],[-86.4,70.47],[-86.62,70.4],[-86.7,70.39],[-86.81,70.39],[-87.12,70.41],[-87.17,70.4],[-87.16,70.38],[-87.07,70.34],[-87.06,70.33],[-87.24,70.31],[-87.5,70.33],[-87.62,70.32],[-87.67,70.31],[-87.79,70.26],[-87.84,70.25],[-87.9,70.25],[-88.18,70.37],[-88.4,70.44],[-88.66,70.47],[-88.78,70.49],[-88.85,70.52],[-89.21,70.76],[-89.26,70.81],[-89.37,71.0],[-89.41,71.04],[-89.46,71.06],[-89.37,71.07],[-89.03,71.04],[-88.7,71.05],[-88.52,71.03],[-88.31,70.98],[-88.04,70.95],[-87.84,70.94],[-87.53,70.96],[-87.18,70.99],[-87.14,71.01],[-87.37,71.05],[-87.57,71.11],[-87.76,71.18],[-87.87,71.21],[-88.06,71.23],[-88.59,71.24],[-89.08,71.29],[-89.42,71.35],[-89.69,71.42],[-89.81,71.46],[-89.85,71.49],[-89.89,71.59],[-89.93,71.74],[-89.98,71.85],[-90.02,71.9],[-90.03,71.95],[-89.93,72.05],[-89.66,72.16],[-89.66,72.18],[-89.71,72.18],[-89.82,72.21],[-89.86,72.25],[-89.87,72.31],[-89.87,72.37],[-89.86,72.41],[-89.82,72.47],[-89.7,72.57],[-89.54,72.69],[-89.36,72.8],[-89.33,72.84],[-89.31,72.94],[-89.29,73.02],[-89.26,73.07],[-89.23,73.11],[-89.11,73.18],[-88.98,73.25],[-88.76,73.31],[-88.74,73.33],[-88.74,73.37],[-88.73,73.39],[-88.71,73.4],[-88.17,73.6],[-87.93,73.67],[-87.72,73.72],[-87.47,73.76],[-86.77,73.83],[-86.41,73.85],[-85.95,73.85],[-85.11,73.81],[-85.01,73.78],[-84.98,73.76],[-84.95,73.72],[-84.97,73.69],[-85.2,73.6],[-85.49,73.53],[-85.68,73.46],[-86.0,73.31],[-86.09,73.26],[-86.48,72.96],[-86.57,72.91],[-86.63,72.87],[-86.67,72.76],[-86.66,72.72],[-86.59,72.66],[-86.38,72.52],[-86.32,72.46],[-86.32,72.4],[-86.35,72.26],[-86.35,72.19],[-86.34,72.12],[-86.3,72.03],[-86.22,71.9],[-86.04,71.77],[-85.75,71.64],[-85.54,71.56],[-85.33,71.49],[-85.08,71.4],[-85.02,71.35],[-85.14,71.3],[-85.41,71.23],[-85.76,71.19],[-85.95,71.16],[-86.18,71.1],[-86.47,71.04],[-86.59,71.01]],[[-100.0,73.95],[-99.16,73.73],[-99.04,73.75],[-98.78,73.76],[-98.52,73.79],[-98.15,73.82],[-97.93,73.87],[-97.83,73.88],[-97.67,73.89],[-97.58,73.89],[-97.33,73.86],[-97.22,73.84],[-97.17,73.82],[-97.11,73.79],[-97.01,73.71],[-97.0,73.67],[-97.0,73.67],[-97.09,73.61],[-97.16,73.59],[-97.28,73.57],[-97.39,73.56],[-97.49,73.53],[-97.6,73.54],[-97.63,73.5],[-97.61,73.48],[-97.59,73.47],[-97.53,73.47],[-97.47,73.49],[-97.35,73.48],[-97.29,73.46],[-97.23,73.42],[-97.27,73.39],[-97.48,73.34],[-97.8,73.29],[-98.18,73.12],[-98.38,73.04],[-98.42,73.02],[-98.44,73.0],[-98.43,72.96],[-98.42,72.94],[-98.37,72.93],[-98.18,72.99],[-98.06,73.02],[-97.94,73.04],[-97.72,73.04],[-97.64,73.03],[-97.48,72.99],[-97.33,72.94],[-97.3,72.92],[-97.31,72.9],[-97.37,72.88],[-97.38,72.86],[-97.24,72.84],[-97.08,72.76],[-97.07,72.72],[-97.14,72.67],[-97.16,72.64],[-97.13,72.63],[-97.05,72.64],[-96.87,72.69],[-96.67,72.71],[-96.59,72.71],[-96.54,72.7],[-96.49,72.63],[-96.45,72.55],[-96.44,72.49],[-96.47,72.43],[-96.52,72.39],[-96.64,72.34],[-96.75,72.32],[-96.8,72.32],[-96.8,72.31],[-96.67,72.27],[-96.62,72.24],[-96.59,72.2],[-96.6,72.17],[-96.62,72.15],[-96.77,72.05],[-96.76,72.03],[-96.72,72.03],[-96.62,71.97],[-96.61,71.83],[-96.95,71.79],[-97.02,71.76],[-97.12,71.71],[-97.22,71.67],[-97.46,71.63],[-97.58,71.63],[-98.18,71.66],[-98.24,71.68],[-98.28,71.72],[-98.31,71.76],[-98.31,71.8],[-98.3,71.83],[-98.31,71.85],[-98.32,71.85],[-98.39,71.82],[-98.46,71.77],[-98.42,71.72],[-98.23,71.56],[-98.2,71.49],[-98.19,71.46],[-98.2,71.44],[-98.41,71.35],[-98.54,71.32],[-98.66,71.3],[-98.78,71.31],[-98.9,71.35],[-98.99,71.37],[-99.17,71.37],[-99.22,71.39],[-99.28,71.42],[-99.4,71.56],[-99.58,71.65],[-99.73,71.76],[-100.12,71.91],[-100.33,72.0],[-100.59,72.15],[-100.71,72.19],[-100.8,72.2],[-100.98,72.21],[-101.03,72.23],[-101.09,72.28],[-101.21,72.32],[-101.25,72.32],[-101.32,72.31],[-101.5,72.28],[-101.72,72.31],[-101.77,72.34],[-101.8,72.39],[-101.83,72.41],[-101.91,72.43],[-101.97,72.49],[-102.4,72.59],[-102.66,72.72],[-102.71,72.76],[-102.71,72.78],[-102.69,72.84],[-102.63,72.91],[-102.55,72.98],[-102.5,73.01],[-102.34,73.06],[-102.2,73.08],[-102.02,73.07],[-101.92,73.06],[-101.84,73.02],[-101.8,72.97],[-101.75,72.94],[-101.62,72.91],[-101.54,72.88],[-101.43,72.82],[-101.35,72.75],[-101.27,72.72],[-101.09,72.71],[-100.9,72.73],[-100.48,72.77],[-100.47,72.78],[-100.44,72.81],[-100.4,72.98],[-100.37,72.98],[-100.23,72.9],[-100.19,72.89],[-100.13,72.91],[-100.09,72.94],[-100.1,72.96],[-100.18,73.06],[-100.24,73.1],[-100.28,73.12],[-100.33,73.13],[-100.45,73.12],[-100.53,73.14],[-100.55,73.16],[-100.54,73.2],[-100.49,73.23],[-100.44,73.25],[-100.34,73.27],[-100.23,73.25],[-100.07,73.21],[-99.97,73.2],[-99.83,73.21],[-100.01,73.24],[-100.26,73.34],[-100.37,73.36],[-100.5,73.32],[-100.59,73.3],[-100.76,73.28],[-100.89,73.28],[-101.45,73.43],[-101.48,73.45],[-101.52,73.49],[-101.52,73.51],[-101.46,73.53],[-101.32,73.57],[-101.11,73.6],[-100.98,73.6],[-100.85,73.57],[-100.68,73.49],[-100.52,73.45],[-100.51,73.47],[-100.54,73.51],[-100.61,73.58],[-100.66,73.59],[-100.78,73.61],[-100.9,73.66],[-100.95,73.69],[-100.98,73.73],[-100.99,73.77],[-100.96,73.79],[-100.92,73.81],[-100.48,73.84],[-100.18,73.8],[-99.99,73.8],[-99.91,73.85],[-99.94,73.86],[-100.04,73.84],[-100.15,73.84],[-100.22,73.87],[-100.23,73.89],[-100.14,73.93],[-100.0,73.95]],[[-98.27,73.87],[-98.56,73.85],[-98.69,73.86],[-98.76,73.83],[-98.82,73.82],[-98.97,73.81],[-99.3,73.86],[-99.39,73.88],[-99.42,73.9],[-99.4,73.91],[-99.35,73.93],[-99.1,73.95],[-99.0,73.96],[-98.97,73.99],[-98.9,74.01],[-98.82,74.02],[-98.58,74.03],[-98.06,74.1],[-97.8,74.11],[-97.7,74.11],[-97.67,74.09],[-97.66,74.07],[-97.67,74.05],[-97.75,74.01],[-97.86,73.97],[-98.15,73.89],[-98.27,73.87]],[[-93.17,74.16],[-92.78,74.11],[-92.59,74.08],[-92.49,74.06],[-92.31,73.99],[-92.22,73.97],[-91.87,74.01],[-91.63,74.03],[-91.09,74.01],[-90.63,73.95],[-90.46,73.91],[-90.35,73.87],[-90.38,73.82],[-90.47,73.75],[-90.57,73.69],[-90.76,73.58],[-90.93,73.53],[-90.98,73.5],[-91.0,73.47],[-91.07,73.42],[-91.25,73.3],[-91.3,73.28],[-91.55,73.24],[-91.47,73.21],[-91.43,73.19],[-91.46,73.15],[-91.62,73.03],[-91.79,72.92],[-91.91,72.85],[-92.12,72.75],[-92.23,72.73],[-92.39,72.72],[-93.34,72.8],[-93.58,72.8],[-94.21,72.76],[-94.15,72.74],[-93.92,72.7],[-93.77,72.67],[-93.57,72.56],[-93.55,72.53],[-93.53,72.5],[-93.54,72.44],[-93.56,72.42],[-93.87,72.25],[-93.97,72.13],[-94.04,72.03],[-94.14,72.0],[-94.5,72.04],[-94.61,72.04],[-95.01,72.01],[-95.19,72.03],[-95.17,72.18],[-95.19,72.34],[-95.25,72.5],[-95.55,72.78],[-95.58,72.83],[-95.6,72.88],[-95.61,72.94],[-95.61,73.0],[-95.59,73.12],[-95.59,73.17],[-95.6,73.33],[-95.64,73.56],[-95.65,73.64],[-95.65,73.67],[-95.63,73.7],[-95.57,73.73],[-95.45,73.75],[-95.39,73.76],[-95.0,73.69],[-94.82,73.66],[-94.7,73.66],[-94.69,73.67],[-94.8,73.69],[-94.9,73.72],[-95.06,73.81],[-95.13,73.88],[-95.15,73.91],[-95.15,73.93],[-95.14,73.96],[-95.12,73.99],[-95.04,74.02],[-94.97,74.04],[-94.73,74.09],[-94.48,74.11],[-93.94,74.13],[-93.78,74.12],[-93.55,74.17],[-93.41,74.18],[-93.17,74.16]],[[-119.74,74.11],[-119.73,74.11],[-119.47,74.2],[-119.31,74.21],[-119.21,74.2],[-119.17,74.19],[-119.15,74.17],[-119.14,74.13],[-119.13,74.03],[-119.12,74.02],[-119.08,74.02],[-119.03,74.04],[-118.74,74.19],[-118.63,74.23],[-118.54,74.24],[-118.2,74.27],[-117.97,74.27],[-117.71,74.25],[-117.51,74.23],[-117.2,74.17],[-116.95,74.1],[-116.72,74.03],[-115.96,73.75],[-115.63,73.67],[-115.51,73.62],[-115.46,73.58],[-115.41,73.54],[-115.39,73.5],[-115.41,73.46],[-115.45,73.44],[-115.52,73.42],[-115.99,73.32],[-116.24,73.29],[-116.48,73.25],[-117.07,73.11],[-117.46,73.04],[-117.98,72.9],[-118.96,72.68],[-119.08,72.64],[-119.13,72.61],[-119.41,72.36],[-119.51,72.3],[-119.77,72.24],[-120.09,72.23],[-120.18,72.21],[-120.19,72.13],[-120.31,71.98],[-120.37,71.89],[-120.44,71.63],[-120.46,71.61],[-120.52,71.56],[-120.62,71.51],[-120.93,71.45],[-121.16,71.41],[-121.47,71.39],[-121.55,71.41],[-121.62,71.45],[-121.7,71.45],[-121.75,71.44],[-122.16,71.27],[-122.55,71.19],[-122.72,71.13],[-122.84,71.1],[-122.94,71.09],[-123.1,71.09],[-123.21,71.12],[-123.31,71.17],[-123.39,71.22],[-123.6,71.42],[-123.68,71.49],[-123.76,71.53],[-123.95,71.65],[-124.01,71.68],[-124.76,71.84],[-125.13,71.92],[-125.21,71.95],[-125.3,71.97],[-125.77,71.96],[-125.83,71.97],[-125.85,71.98],[-125.79,72.03],[-125.77,72.05],[-125.76,72.08],[-125.77,72.13],[-125.76,72.14],[-125.58,72.18],[-125.61,72.19],[-125.63,72.21],[-125.65,72.24],[-125.63,72.25],[-125.58,72.27],[-125.51,72.31],[-125.44,72.38],[-125.38,72.42],[-125.31,72.45],[-125.17,72.52],[-125.07,72.55],[-124.99,72.59],[-124.98,72.6],[-125.02,72.62],[-125.03,72.64],[-125.01,72.73],[-125.02,72.78],[-125.0,72.81],[-124.97,72.84],[-124.93,72.86],[-124.58,72.93],[-124.56,72.94],[-124.56,72.97],[-124.57,72.99],[-124.59,73.01],[-124.64,73.02],[-124.74,73.02],[-124.82,73.06],[-124.84,73.08],[-124.8,73.13],[-124.65,73.2],[-124.59,73.24],[-124.42,73.42],[-124.11,73.53],[-124.03,73.64],[-123.8,73.77],[-123.8,73.79],[-123.87,73.83],[-124.09,73.86],[-124.19,73.9],[-124.26,73.95],[-124.58,74.25],[-124.63,74.27],[-124.65,74.3],[-124.71,74.33],[-124.7,74.35],[-123.47,74.44],[-122.62,74.46],[-121.75,74.54],[-121.5,74.55],[-121.32,74.53],[-121.13,74.49],[-120.88,74.42],[-120.55,74.35],[-119.94,74.25],[-119.56,74.23],[-119.72,74.15],[-119.74,74.13],[-119.74,74.11]],[[-97.36,74.53],[-97.66,74.47],[-97.72,74.49],[-97.75,74.51],[-97.52,74.6],[-97.42,74.63],[-97.32,74.6],[-97.29,74.58],[-97.3,74.56],[-97.36,74.53]],[[-95.31,74.51],[-95.35,74.5],[-95.44,74.51],[-95.78,74.55],[-95.83,74.57],[-95.85,74.58],[-95.77,74.6],[-95.75,74.62],[-95.66,74.64],[-95.51,74.64],[-95.35,74.59],[-95.28,74.54],[-95.27,74.52],[-95.31,74.51]],[[-104.12,75.04],[-104.31,75.03],[-104.63,75.06],[-104.83,75.12],[-104.89,75.15],[-104.88,75.16],[-104.85,75.17],[-104.8,75.21],[-104.69,75.32],[-104.65,75.35],[-104.47,75.41],[-104.35,75.43],[-104.07,75.42],[-103.92,75.39],[-103.85,75.37],[-103.8,75.35],[-103.76,75.29],[-103.75,75.25],[-103.67,75.21],[-103.64,75.19],[-103.64,75.16],[-103.66,75.14],[-103.71,75.11],[-103.81,75.08],[-104.12,75.04]],[[-93.54,75.03],[-93.48,74.95],[-93.47,74.92],[-93.46,74.86],[-93.49,74.77],[-93.51,74.76],[-93.54,74.75],[-93.55,74.73],[-93.55,74.69],[-93.57,74.67],[-93.63,74.66],[-93.98,74.64],[-94.21,74.65],[-94.53,74.64],[-94.7,74.64],[-94.8,74.66],[-94.96,74.7],[-95.29,74.79],[-95.45,74.8],[-95.87,74.83],[-96.09,74.93],[-96.18,74.95],[-96.27,74.92],[-96.29,74.93],[-96.32,74.95],[-96.34,74.98],[-96.39,75.0],[-96.56,74.99],[-96.59,75.0],[-96.6,75.03],[-96.6,75.06],[-96.57,75.1],[-96.38,75.21],[-96.29,75.22],[-96.18,75.24],[-96.12,75.3],[-96.12,75.36],[-95.95,75.44],[-95.85,75.47],[-95.67,75.53],[-95.05,75.62],[-94.88,75.63],[-94.65,75.62],[-94.43,75.59],[-94.26,75.54],[-93.91,75.42],[-93.75,75.35],[-93.67,75.27],[-93.59,75.23],[-93.5,75.14],[-93.53,75.1],[-93.55,75.05],[-93.54,75.03]],[[-96.08,75.51],[-96.16,75.48],[-96.24,75.47],[-96.34,75.51],[-96.46,75.49],[-96.62,75.43],[-96.68,75.39],[-96.72,75.38],[-96.86,75.37],[-96.92,75.38],[-96.97,75.41],[-97.02,75.47],[-96.98,75.51],[-96.86,75.54],[-96.52,75.58],[-96.43,75.61],[-96.42,75.63],[-96.4,75.65],[-96.37,75.65],[-96.15,75.61],[-96.04,75.59],[-95.96,75.55],[-95.97,75.54],[-96.08,75.51]],[[-121.08,75.75],[-121.15,75.74],[-121.24,75.75],[-121.22,75.78],[-121.03,75.85],[-121.02,75.87],[-121.02,75.88],[-121.04,75.9],[-120.99,75.93],[-120.91,75.94],[-120.89,75.93],[-120.88,75.91],[-120.9,75.84],[-120.92,75.81],[-120.95,75.79],[-121.01,75.77],[-121.08,75.75]],[[-94.53,75.75],[-94.62,75.75],[-94.75,75.77],[-94.79,75.79],[-94.81,75.82],[-94.83,75.86],[-94.86,75.89],[-94.89,75.91],[-94.9,75.93],[-94.88,75.95],[-94.84,75.95],[-94.74,75.96],[-94.54,76.0],[-94.5,75.99],[-94.47,75.97],[-94.44,75.92],[-94.41,75.88],[-94.33,75.83],[-94.3,75.79],[-94.3,75.78],[-94.33,75.77],[-94.53,75.75]],[[-118.33,75.58],[-118.61,75.52],[-118.82,75.52],[-119.09,75.57],[-119.31,75.59],[-119.38,75.6],[-119.39,75.62],[-119.32,75.66],[-119.23,75.7],[-119.0,75.77],[-118.63,75.91],[-118.38,75.96],[-118.14,75.99],[-117.89,76.08],[-117.75,76.11],[-117.63,76.12],[-117.51,76.1],[-117.5,76.08],[-117.63,75.97],[-117.72,75.92],[-117.89,75.81],[-118.23,75.61],[-118.33,75.58]],[[-79.06,75.93],[-79.05,75.87],[-79.12,75.87],[-79.36,75.83],[-79.54,75.83],[-79.64,75.84],[-79.7,75.88],[-79.55,75.96],[-79.38,76.01],[-79.18,76.09],[-79.01,76.15],[-78.93,76.13],[-78.85,76.11],[-78.95,76.03],[-79.06,75.99],[-79.06,75.93]],[[-102.23,76.01],[-102.02,75.95],[-102.01,75.94],[-102.05,75.93],[-102.32,75.9],[-102.42,75.87],[-102.51,75.81],[-102.58,75.78],[-102.94,75.76],[-103.31,75.76],[-103.24,75.82],[-103.04,75.92],[-103.2,75.96],[-103.77,75.89],[-103.99,75.93],[-103.8,76.04],[-103.98,76.05],[-104.24,76.05],[-104.41,76.11],[-104.35,76.18],[-104.01,76.22],[-103.57,76.26],[-103.1,76.31],[-102.73,76.31],[-102.58,76.28],[-102.54,76.2],[-102.49,76.1],[-102.43,76.09],[-102.23,76.01]],[[-104.02,76.58],[-103.97,76.58],[-103.82,76.6],[-103.72,76.6],[-103.61,76.56],[-103.58,76.54],[-103.19,76.48],[-103.05,76.45],[-103.03,76.43],[-103.08,76.41],[-103.2,76.37],[-103.31,76.35],[-103.47,76.33],[-104.27,76.33],[-104.36,76.33],[-104.41,76.37],[-104.51,76.48],[-104.58,76.54],[-104.6,76.58],[-104.59,76.61],[-104.5,76.63],[-104.21,76.67],[-104.07,76.67],[-103.99,76.66],[-103.96,76.64],[-103.97,76.61],[-104.02,76.58]],[[-97.7,76.47],[-97.69,76.42],[-97.7,76.39],[-97.74,76.36],[-97.74,76.34],[-97.71,76.3],[-97.57,76.22],[-97.53,76.18],[-97.52,76.14],[-97.53,76.11],[-97.61,76.05],[-97.65,75.98],[-97.65,75.94],[-97.6,75.88],[-97.6,75.85],[-97.69,75.8],[-97.89,75.76],[-97.86,75.74],[-97.44,75.68],[-97.41,75.67],[-97.41,75.55],[-97.34,75.42],[-97.36,75.42],[-97.47,75.46],[-97.65,75.51],[-97.88,75.42],[-97.85,75.26],[-97.7,75.19],[-97.66,75.15],[-97.67,75.13],[-97.8,75.12],[-97.84,75.12],[-97.97,75.15],[-98.05,75.2],[-98.07,75.2],[-98.09,75.18],[-98.08,75.15],[-97.99,75.11],[-97.95,75.06],[-97.99,75.05],[-98.12,75.03],[-98.3,75.03],[-98.57,75.01],[-98.7,75.01],[-98.83,75.02],[-99.01,75.02],[-99.16,75.02],[-99.24,75.03],[-99.33,75.05],[-99.42,75.04],[-99.63,74.98],[-99.95,75.0],[-100.23,75.01],[-100.29,75.03],[-100.36,75.07],[-100.48,75.19],[-100.46,75.22],[-100.15,75.24],[-100.15,75.25],[-100.36,75.29],[-100.61,75.32],[-100.73,75.35],[-100.7,75.39],[-100.71,75.41],[-100.28,75.46],[-99.97,75.57],[-99.77,75.61],[-99.76,75.63],[-99.59,75.66],[-99.21,75.67],[-99.19,75.7],[-99.92,75.68],[-100.9,75.62],[-101.21,75.59],[-101.46,75.61],[-102.54,75.51],[-102.59,75.51],[-102.7,75.54],[-102.8,75.6],[-102.73,75.64],[-102.41,75.71],[-102.25,75.78],[-102.27,75.81],[-102.14,75.88],[-101.94,75.88],[-101.6,75.83],[-101.42,75.78],[-101.26,75.76],[-101.12,75.76],[-100.97,75.8],[-101.01,75.8],[-101.26,75.78],[-101.29,75.79],[-101.41,75.85],[-101.47,75.88],[-101.51,75.92],[-101.51,75.94],[-101.43,75.99],[-101.72,76.01],[-101.82,76.04],[-101.87,76.08],[-101.86,76.1],[-101.77,76.15],[-101.53,76.22],[-101.56,76.24],[-101.91,76.23],[-101.99,76.24],[-102.14,76.28],[-102.1,76.33],[-101.96,76.4],[-101.86,76.44],[-101.79,76.45],[-101.68,76.45],[-101.42,76.42],[-101.34,76.41],[-101.14,76.35],[-101.09,76.31],[-101.09,76.27],[-101.06,76.25],[-100.9,76.21],[-100.23,76.01],[-100.11,75.96],[-100.02,75.94],[-99.87,75.92],[-99.77,75.93],[-99.7,75.94],[-99.69,75.96],[-99.98,76.03],[-100.05,76.07],[-100.11,76.12],[-100.09,76.13],[-100.0,76.14],[-99.79,76.13],[-99.54,76.15],[-99.82,76.17],[-100.0,76.2],[-100.18,76.2],[-100.41,76.24],[-100.41,76.26],[-100.36,76.27],[-100.04,76.29],[-99.98,76.3],[-99.98,76.31],[-100.08,76.34],[-100.17,76.36],[-100.65,76.4],[-100.82,76.44],[-100.87,76.46],[-100.89,76.48],[-100.83,76.52],[-100.57,76.58],[-100.39,76.61],[-100.07,76.63],[-99.81,76.63],[-99.67,76.62],[-99.33,76.52],[-99.17,76.45],[-98.89,76.47],[-98.97,76.54],[-99.02,76.61],[-98.94,76.64],[-98.71,76.69],[-98.53,76.67],[-98.29,76.6],[-98.24,76.58],[-97.97,76.53],[-97.81,76.52],[-97.73,76.5],[-97.7,76.47]],[[-101.23,76.58],[-101.49,76.58],[-101.6,76.59],[-101.61,76.6],[-101.51,76.63],[-101.17,76.67],[-100.96,76.73],[-100.89,76.74],[-100.62,76.75],[-100.47,76.75],[-100.27,76.73],[-100.75,76.65],[-101.23,76.58]],[[-108.29,76.06],[-108.17,76.05],[-108.02,76.07],[-107.85,76.06],[-107.78,76.04],[-107.72,76.0],[-107.72,75.97],[-107.73,75.96],[-107.76,75.94],[-107.97,75.84],[-108.02,75.8],[-107.95,75.8],[-107.92,75.8],[-107.7,75.88],[-107.54,75.9],[-107.42,75.91],[-107.22,75.89],[-107.14,75.88],[-107.08,75.86],[-107.05,75.85],[-106.97,75.77],[-106.91,75.68],[-106.9,75.69],[-106.9,75.74],[-106.89,75.78],[-106.69,75.81],[-106.69,75.82],[-106.76,75.84],[-106.82,75.87],[-106.86,75.93],[-106.85,75.95],[-106.8,75.97],[-106.68,76.02],[-106.53,76.05],[-106.4,76.06],[-105.9,76.01],[-105.71,75.97],[-105.63,75.95],[-105.6,75.93],[-105.56,75.88],[-105.48,75.75],[-105.48,75.7],[-105.52,75.63],[-105.68,75.5],[-105.7,75.41],[-105.86,75.19],[-105.97,75.13],[-106.09,75.09],[-106.59,75.02],[-106.96,74.94],[-107.06,74.93],[-107.15,74.93],[-107.46,74.95],[-107.82,75.0],[-108.02,74.99],[-108.23,74.95],[-108.35,74.94],[-108.47,74.95],[-108.59,74.96],[-108.75,74.99],[-108.67,75.01],[-108.63,75.02],[-108.67,75.04],[-108.83,75.06],[-109.0,75.01],[-109.5,74.88],[-110.18,74.84],[-110.39,74.81],[-110.54,74.78],[-110.62,74.75],[-110.75,74.69],[-110.94,74.64],[-111.29,74.59],[-111.73,74.5],[-112.52,74.42],[-113.02,74.4],[-113.51,74.43],[-113.67,74.45],[-113.84,74.49],[-114.17,74.57],[-114.27,74.6],[-114.38,74.67],[-114.31,74.72],[-114.13,74.77],[-113.86,74.81],[-113.32,74.88],[-112.84,74.98],[-112.66,74.99],[-112.19,75.01],[-111.96,75.0],[-111.78,75.01],[-111.67,75.02],[-111.5,75.06],[-111.26,75.13],[-111.08,75.2],[-111.03,75.23],[-111.09,75.26],[-111.18,75.26],[-111.47,75.19],[-111.62,75.17],[-111.78,75.17],[-112.0,75.14],[-112.21,75.13],[-112.26,75.13],[-112.48,75.2],[-112.6,75.21],[-112.65,75.2],[-112.7,75.19],[-112.8,75.14],[-112.86,75.12],[-112.95,75.11],[-113.34,75.09],[-113.71,75.07],[-113.79,75.08],[-113.84,75.11],[-113.86,75.13],[-113.86,75.19],[-113.89,75.21],[-113.85,75.26],[-113.81,75.3],[-113.76,75.32],[-113.5,75.4],[-113.47,75.42],[-113.59,75.41],[-113.88,75.38],[-113.92,75.39],[-113.98,75.43],[-114.02,75.43],[-114.05,75.42],[-114.07,75.39],[-114.12,75.29],[-114.17,75.24],[-114.28,75.25],[-114.43,75.28],[-114.48,75.29],[-114.51,75.28],[-114.5,75.26],[-114.36,75.17],[-114.36,75.14],[-114.45,75.09],[-114.86,75.0],[-115.02,74.98],[-115.08,74.99],[-115.13,75.01],[-115.17,75.05],[-115.28,75.1],[-115.34,75.11],[-115.41,75.11],[-115.48,75.1],[-115.54,75.08],[-115.57,75.06],[-115.61,75.01],[-115.68,74.97],[-115.73,74.97],[-116.14,75.04],[-116.48,75.17],[-116.84,75.15],[-117.0,75.16],[-117.5,75.2],[-117.57,75.23],[-117.6,75.27],[-117.6,75.29],[-117.58,75.31],[-117.51,75.36],[-117.39,75.42],[-117.34,75.44],[-117.26,75.46],[-117.15,75.47],[-116.89,75.48],[-116.21,75.48],[-116.08,75.49],[-115.34,75.62],[-115.25,75.64],[-115.14,75.68],[-115.12,75.7],[-115.12,75.71],[-116.03,75.61],[-116.43,75.59],[-117.03,75.6],[-117.14,75.62],[-117.16,75.64],[-117.04,75.72],[-116.97,75.75],[-116.8,75.77],[-116.39,75.81],[-115.84,75.84],[-115.48,75.84],[-115.17,75.87],[-114.99,75.9],[-115.6,75.89],[-116.34,75.88],[-116.44,75.89],[-116.65,75.93],[-116.66,75.96],[-116.58,75.99],[-116.55,76.02],[-116.61,76.07],[-116.59,76.1],[-116.45,76.14],[-116.21,76.19],[-116.06,76.2],[-115.77,76.18],[-114.94,76.17],[-114.78,76.17],[-114.88,76.19],[-115.02,76.21],[-115.66,76.24],[-115.8,76.25],[-115.82,76.27],[-115.83,76.3],[-115.83,76.33],[-115.78,76.36],[-115.58,76.44],[-115.0,76.5],[-114.77,76.51],[-114.53,76.5],[-114.3,76.47],[-114.19,76.45],[-114.14,76.42],[-114.12,76.4],[-114.11,76.35],[-114.1,76.33],[-114.06,76.3],[-113.92,76.23],[-113.82,76.21],[-113.36,76.25],[-113.17,76.26],[-112.98,76.24],[-112.7,76.2],[-112.33,76.07],[-111.87,75.94],[-111.87,75.91],[-112.05,75.87],[-112.08,75.85],[-112.06,75.83],[-111.88,75.83],[-111.71,75.83],[-111.55,75.82],[-111.51,75.81],[-111.45,75.76],[-111.37,75.68],[-111.28,75.61],[-111.16,75.57],[-111.05,75.55],[-110.89,75.55],[-110.73,75.56],[-110.46,75.56],[-109.09,75.51],[-109.01,75.51],[-108.95,75.54],[-108.91,75.59],[-108.9,75.62],[-108.92,75.67],[-108.94,75.7],[-109.8,75.86],[-109.87,75.93],[-109.45,76.02],[-109.42,76.04],[-109.42,76.07],[-109.43,76.11],[-109.49,76.14],[-109.71,76.21],[-109.91,76.22],[-110.2,76.29],[-110.25,76.31],[-110.28,76.33],[-110.31,76.37],[-110.31,76.4],[-110.27,76.42],[-109.98,76.48],[-109.86,76.52],[-109.51,76.69],[-109.34,76.76],[-109.22,76.79],[-109.1,76.81],[-108.83,76.82],[-108.55,76.76],[-108.49,76.75],[-108.47,76.74],[-108.48,76.71],[-108.51,76.68],[-108.61,76.63],[-108.64,76.61],[-108.63,76.59],[-108.56,76.54],[-108.54,76.5],[-108.52,76.45],[-108.51,76.44],[-108.35,76.39],[-108.19,76.33],[-108.12,76.23],[-108.18,76.2],[-108.31,76.15],[-108.38,76.12],[-108.41,76.09],[-108.39,76.07],[-108.29,76.06]],[[-89.73,76.51],[-89.77,76.49],[-89.92,76.5],[-89.97,76.49],[-90.05,76.5],[-90.16,76.52],[-90.29,76.58],[-90.44,76.66],[-90.56,76.73],[-90.56,76.75],[-90.52,76.79],[-90.41,76.81],[-90.14,76.84],[-89.95,76.84],[-89.77,76.78],[-89.73,76.76],[-89.7,76.74],[-89.69,76.72],[-89.71,76.7],[-89.79,76.66],[-89.82,76.63],[-89.82,76.6],[-89.8,76.56],[-89.77,76.53],[-89.73,76.52],[-89.73,76.51]],[[-113.56,76.74],[-113.71,76.71],[-114.75,76.76],[-114.81,76.77],[-114.84,76.79],[-114.65,76.85],[-114.42,76.88],[-113.89,76.89],[-113.71,76.87],[-113.59,76.85],[-113.52,76.83],[-113.49,76.78],[-113.56,76.74]],[[-94.29,76.91],[-94.11,76.9],[-93.95,76.92],[-93.81,76.91],[-93.61,76.87],[-93.42,76.81],[-93.28,76.78],[-93.23,76.77],[-93.21,76.75],[-93.19,76.71],[-93.19,76.69],[-93.2,76.67],[-93.26,76.63],[-93.32,76.57],[-93.43,76.53],[-93.48,76.49],[-93.53,76.45],[-93.42,76.47],[-93.0,76.62],[-92.72,76.6],[-92.3,76.62],[-91.79,76.68],[-91.55,76.69],[-91.31,76.68],[-91.12,76.66],[-90.74,76.58],[-90.6,76.54],[-90.55,76.52],[-90.54,76.5],[-90.62,76.46],[-90.86,76.48],[-91.26,76.5],[-91.34,76.51],[-91.4,76.51],[-91.44,76.5],[-91.42,76.46],[-91.33,76.45],[-90.85,76.44],[-89.28,76.3],[-89.22,76.26],[-89.24,76.24],[-89.29,76.22],[-89.41,76.19],[-90.31,76.16],[-90.83,76.19],[-91.26,76.23],[-91.41,76.22],[-91.28,76.16],[-91.02,76.14],[-90.8,76.11],[-90.71,76.08],[-90.25,76.05],[-90.18,76.03],[-90.03,75.97],[-89.91,75.97],[-89.79,75.92],[-89.7,75.85],[-89.65,75.84],[-89.51,75.86],[-89.28,75.8],[-89.2,75.76],[-89.2,75.74],[-89.26,75.7],[-89.36,75.65],[-89.63,75.58],[-89.65,75.57],[-89.34,75.57],[-89.28,75.56],[-88.92,75.45],[-88.87,75.45],[-88.84,75.46],[-88.8,75.5],[-88.82,75.54],[-88.86,75.59],[-88.85,75.62],[-88.78,75.65],[-88.71,75.66],[-88.64,75.66],[-88.57,75.65],[-88.2,75.51],[-87.73,75.58],[-87.64,75.55],[-87.57,75.49],[-87.54,75.48],[-87.36,75.59],[-87.26,75.62],[-86.81,75.49],[-86.54,75.46],[-86.44,75.44],[-86.24,75.41],[-85.95,75.4],[-85.9,75.44],[-86.07,75.5],[-85.97,75.53],[-85.58,75.58],[-85.37,75.57],[-84.99,75.64],[-84.75,75.65],[-84.6,75.65],[-84.13,75.76],[-84.01,75.78],[-83.93,75.82],[-83.74,75.81],[-83.24,75.75],[-83.09,75.76],[-82.55,75.82],[-82.35,75.83],[-82.15,75.83],[-81.65,75.79],[-81.27,75.76],[-81.15,75.74],[-81.19,75.68],[-81.17,75.67],[-81.12,75.66],[-81.0,75.64],[-80.53,75.64],[-80.32,75.63],[-80.16,75.58],[-80.12,75.56],[-80.13,75.54],[-80.29,75.49],[-80.26,75.48],[-80.1,75.47],[-79.74,75.46],[-79.66,75.45],[-79.59,75.38],[-79.51,75.3],[-79.51,75.26],[-79.63,75.2],[-79.98,75.12],[-80.36,75.05],[-80.38,75.03],[-80.26,75.0],[-80.14,74.99],[-80.04,74.99],[-79.73,75.02],[-79.66,75.02],[-79.52,74.99],[-79.46,74.96],[-79.4,74.92],[-79.51,74.88],[-79.94,74.83],[-80.2,74.89],[-80.29,74.91],[-80.35,74.9],[-80.31,74.88],[-80.19,74.83],[-80.15,74.8],[-80.19,74.78],[-80.21,74.75],[-80.21,74.7],[-80.22,74.66],[-80.26,74.58],[-80.28,74.58],[-81.23,74.57],[-81.34,74.55],[-81.61,74.5],[-81.81,74.48],[-81.94,74.47],[-82.07,74.48],[-82.41,74.54],[-82.65,74.53],[-82.74,74.53],[-82.93,74.57],[-82.98,74.58],[-83.06,74.63],[-83.12,74.69],[-83.11,74.73],[-83.09,74.79],[-83.1,74.82],[-83.16,74.82],[-83.22,74.83],[-83.41,74.88],[-83.52,74.9],[-83.54,74.89],[-83.51,74.85],[-83.49,74.83],[-83.36,74.8],[-83.34,74.76],[-83.39,74.67],[-83.41,74.65],[-83.53,74.59],[-83.62,74.57],[-83.87,74.56],[-84.25,74.52],[-84.43,74.51],[-84.67,74.52],[-84.82,74.54],[-84.92,74.57],[-85.01,74.6],[-85.06,74.61],[-85.09,74.53],[-85.13,74.52],[-85.21,74.52],[-85.34,74.54],[-85.44,74.6],[-85.47,74.6],[-85.49,74.57],[-85.51,74.55],[-85.54,74.53],[-85.81,74.5],[-85.96,74.5],[-86.11,74.54],[-86.21,74.54],[-86.34,74.51],[-86.66,74.56],[-86.73,74.56],[-86.67,74.49],[-86.77,74.48],[-86.99,74.48],[-87.36,74.5],[-87.59,74.47],[-88.01,74.49],[-88.42,74.49],[-88.5,74.51],[-88.56,74.54],[-88.56,74.57],[-88.54,74.61],[-88.48,74.67],[-88.37,74.74],[-88.34,74.78],[-88.43,74.8],[-88.49,74.83],[-88.53,74.83],[-88.68,74.8],[-88.78,74.72],[-88.85,74.69],[-88.88,74.71],[-88.91,74.76],[-88.94,74.79],[-88.98,74.79],[-89.02,74.77],[-89.06,74.75],[-89.12,74.74],[-89.19,74.74],[-89.22,74.73],[-89.2,74.7],[-89.19,74.67],[-89.2,74.64],[-89.26,74.61],[-89.45,74.57],[-89.56,74.55],[-89.84,74.55],[-90.02,74.56],[-90.36,74.61],[-90.55,74.61],[-90.78,74.7],[-90.97,74.72],[-90.96,74.75],[-90.88,74.8],[-90.88,74.82],[-91.13,74.74],[-91.16,74.71],[-91.13,74.65],[-91.17,74.65],[-91.34,74.67],[-91.51,74.65],[-91.55,74.66],[-91.67,74.7],[-91.87,74.74],[-91.96,74.79],[-92.1,74.95],[-92.17,75.05],[-92.17,75.07],[-92.06,75.1],[-92.08,75.12],[-92.21,75.18],[-92.35,75.23],[-92.39,75.26],[-92.41,75.3],[-92.43,75.35],[-92.43,75.38],[-92.41,75.41],[-92.33,75.48],[-92.11,75.61],[-92.08,75.63],[-92.07,75.66],[-92.1,75.73],[-92.14,75.8],[-92.19,75.85],[-92.31,75.92],[-92.47,75.99],[-92.71,76.11],[-92.88,76.21],[-93.09,76.35],[-93.19,76.37],[-93.31,76.36],[-93.56,76.31],[-93.64,76.29],[-93.67,76.27],[-93.85,76.27],[-94.38,76.28],[-94.59,76.3],[-94.74,76.29],[-95.0,76.26],[-95.27,76.26],[-95.45,76.36],[-95.84,76.42],[-95.96,76.45],[-96.04,76.49],[-96.01,76.51],[-95.79,76.54],[-95.7,76.56],[-95.65,76.58],[-95.87,76.57],[-95.97,76.57],[-96.64,76.7],[-96.85,76.73],[-96.88,76.74],[-96.9,76.75],[-96.9,76.77],[-96.88,76.8],[-96.68,76.77],[-96.59,76.76],[-96.45,76.77],[-96.4,76.8],[-96.43,76.81],[-96.66,76.86],[-96.77,76.89],[-96.81,76.91],[-96.77,76.95],[-96.76,76.97],[-96.69,76.99],[-96.55,76.99],[-96.38,77.0],[-96.06,77.05],[-95.85,77.07],[-95.64,77.06],[-95.13,77.02],[-94.62,76.96],[-94.29,76.91]],[[-115.55,77.36],[-115.48,77.32],[-115.47,77.31],[-115.51,77.29],[-115.62,77.27],[-116.21,77.18],[-116.33,77.14],[-116.29,77.1],[-116.07,77.03],[-115.86,76.97],[-115.81,76.94],[-115.91,76.91],[-116.11,76.92],[-116.18,76.92],[-116.25,76.9],[-116.23,76.87],[-116.02,76.78],[-115.94,76.74],[-115.95,76.71],[-115.98,76.69],[-116.08,76.65],[-116.22,76.61],[-116.47,76.58],[-117.0,76.53],[-117.02,76.5],[-117.01,76.47],[-117.03,76.4],[-117.04,76.37],[-117.11,76.32],[-117.15,76.3],[-117.23,76.28],[-117.35,76.27],[-117.49,76.27],[-117.73,76.32],[-117.84,76.34],[-117.99,76.41],[-118.02,76.45],[-118.01,76.5],[-117.97,76.57],[-117.9,76.65],[-117.81,76.73],[-117.78,76.78],[-117.82,76.8],[-117.88,76.81],[-118.08,76.77],[-118.2,76.76],[-118.3,76.74],[-118.37,76.7],[-118.41,76.66],[-118.43,76.59],[-118.47,76.55],[-118.57,76.53],[-118.73,76.53],[-118.79,76.51],[-118.82,76.49],[-118.8,76.46],[-118.64,76.42],[-118.62,76.37],[-118.64,76.33],[-118.81,76.28],[-118.85,76.26],[-118.96,76.17],[-118.99,76.14],[-119.08,76.12],[-119.17,76.13],[-119.25,76.16],[-119.37,76.22],[-119.45,76.28],[-119.49,76.32],[-119.52,76.34],[-119.58,76.33],[-119.65,76.28],[-119.65,76.24],[-119.64,76.19],[-119.64,76.16],[-119.74,76.12],[-119.73,76.1],[-119.55,76.05],[-119.53,76.03],[-119.53,76.0],[-119.54,75.98],[-119.61,75.98],[-119.67,75.95],[-119.73,75.92],[-119.91,75.86],[-120.16,75.85],[-120.37,75.82],[-120.41,75.83],[-120.46,75.87],[-120.51,75.96],[-120.56,76.01],[-120.64,76.03],[-120.73,76.13],[-120.77,76.17],[-120.81,76.18],[-120.85,76.18],[-120.9,76.16],[-121.02,76.02],[-121.21,75.98],[-121.32,75.98],[-121.43,75.98],[-121.69,76.02],[-121.91,76.03],[-122.06,76.02],[-122.3,75.96],[-122.4,75.94],[-122.53,75.95],[-122.59,75.97],[-122.64,76.01],[-122.65,76.03],[-122.61,76.04],[-122.55,76.08],[-122.55,76.1],[-122.61,76.12],[-122.61,76.14],[-122.59,76.15],[-122.59,76.16],[-122.62,76.17],[-122.68,76.16],[-122.9,76.13],[-122.88,76.16],[-122.77,76.23],[-122.52,76.35],[-122.42,76.39],[-122.37,76.4],[-121.61,76.44],[-121.56,76.45],[-121.2,76.62],[-121.1,76.66],[-121.0,76.69],[-120.49,76.79],[-120.44,76.82],[-120.36,76.89],[-120.31,76.9],[-120.2,76.93],[-119.83,77.07],[-119.49,77.18],[-119.32,77.24],[-119.09,77.31],[-118.82,77.33],[-118.01,77.38],[-117.42,77.32],[-117.28,77.31],[-117.21,77.33],[-117.15,77.36],[-117.06,77.35],[-116.84,77.34],[-116.8,77.35],[-116.7,77.38],[-116.77,77.4],[-117.03,77.43],[-117.05,77.45],[-117.04,77.47],[-116.95,77.5],[-116.84,77.53],[-116.51,77.55],[-116.36,77.54],[-116.21,77.52],[-116.01,77.46],[-115.55,77.36]],[[-89.83,77.27],[-90.09,77.21],[-90.23,77.21],[-90.99,77.33],[-91.15,77.39],[-91.18,77.43],[-91.19,77.48],[-91.18,77.56],[-91.15,77.61],[-91.11,77.63],[-91.02,77.64],[-90.84,77.65],[-90.67,77.65],[-90.42,77.63],[-90.17,77.59],[-89.84,77.49],[-89.72,77.44],[-89.69,77.38],[-89.69,77.34],[-89.71,77.31],[-89.75,77.29],[-89.83,77.27]],[[-104.56,77.14],[-104.71,77.12],[-105.02,77.16],[-105.22,77.18],[-105.38,77.25],[-105.56,77.35],[-105.7,77.46],[-105.75,77.53],[-105.85,77.56],[-105.88,77.63],[-106.07,77.73],[-106.04,77.74],[-105.86,77.75],[-105.59,77.74],[-105.46,77.7],[-105.29,77.64],[-105.07,77.55],[-105.01,77.51],[-104.99,77.45],[-104.96,77.42],[-104.77,77.41],[-104.54,77.34],[-104.5,77.31],[-104.45,77.25],[-104.46,77.22],[-104.49,77.16],[-104.56,77.14]],[[-95.48,77.79],[-95.23,77.75],[-94.96,77.77],[-94.67,77.78],[-94.01,77.76],[-93.58,77.77],[-93.47,77.76],[-93.3,77.74],[-93.21,77.71],[-93.13,77.66],[-93.34,77.63],[-93.52,77.47],[-93.54,77.47],[-93.74,77.46],[-93.84,77.45],[-94.41,77.47],[-95.99,77.48],[-96.06,77.5],[-96.26,77.59],[-96.28,77.63],[-96.24,77.67],[-96.19,77.7],[-96.14,77.71],[-95.68,77.78],[-95.48,77.79]],[[-101.69,77.7],[-101.83,77.69],[-102.08,77.69],[-102.38,77.73],[-102.46,77.77],[-102.48,77.84],[-102.47,77.87],[-102.45,77.88],[-102.26,77.89],[-101.92,77.9],[-101.64,77.89],[-101.32,77.85],[-101.19,77.83],[-101.13,77.81],[-101.05,77.78],[-101.02,77.76],[-101.0,77.74],[-101.4,77.73],[-101.58,77.72],[-101.69,77.7]],[[-113.83,77.75],[-114.11,77.72],[-114.29,77.72],[-114.61,77.77],[-114.98,77.92],[-115.03,77.97],[-114.89,77.98],[-114.79,77.99],[-114.73,78.02],[-114.61,78.04],[-114.33,78.08],[-114.3,78.06],[-114.3,78.03],[-114.28,78.0],[-114.18,78.0],[-114.09,77.98],[-113.9,77.92],[-113.77,77.9],[-113.72,77.89],[-113.7,77.87],[-113.62,77.83],[-113.62,77.81],[-113.73,77.78],[-113.83,77.75]],[[-110.46,78.1],[-109.66,78.08],[-109.62,78.07],[-109.62,78.06],[-109.68,78.0],[-109.77,77.96],[-110.2,77.9],[-110.75,77.86],[-110.87,77.83],[-110.86,77.82],[-110.81,77.8],[-110.72,77.78],[-110.29,77.79],[-110.19,77.78],[-110.15,77.76],[-110.13,77.74],[-110.12,77.72],[-110.12,77.62],[-110.14,77.57],[-110.2,77.52],[-110.37,77.49],[-110.68,77.45],[-110.89,77.43],[-111.06,77.43],[-111.23,77.43],[-111.95,77.34],[-112.18,77.34],[-112.37,77.36],[-112.64,77.44],[-112.93,77.47],[-113.05,77.51],[-113.16,77.53],[-113.2,77.56],[-113.21,77.58],[-113.19,77.6],[-113.14,77.62],[-113.12,77.63],[-113.17,77.68],[-113.19,77.72],[-113.27,77.78],[-113.28,77.81],[-113.28,77.84],[-113.27,77.86],[-113.22,77.9],[-113.19,77.91],[-113.02,77.92],[-112.8,77.94],[-112.3,78.01],[-111.21,78.09],[-110.87,78.08],[-110.73,78.1],[-110.46,78.1]],[[-103.0,78.15],[-103.12,78.13],[-103.25,78.14],[-103.27,78.15],[-103.27,78.17],[-103.26,78.18],[-103.11,78.25],[-102.97,78.27],[-102.89,78.27],[-102.83,78.25],[-102.79,78.22],[-103.0,78.15]],[[-109.82,78.65],[-109.64,78.59],[-109.58,78.59],[-109.5,78.58],[-109.47,78.57],[-109.36,78.49],[-109.34,78.46],[-109.34,78.41],[-109.35,78.37],[-109.39,78.34],[-109.48,78.32],[-109.71,78.3],[-110.02,78.32],[-110.29,78.3],[-110.42,78.29],[-110.76,78.31],[-110.84,78.32],[-111.03,78.37],[-111.17,78.39],[-111.23,78.38],[-111.3,78.34],[-111.44,78.29],[-111.52,78.27],[-111.76,78.28],[-112.13,78.37],[-112.56,78.34],[-113.0,78.29],[-113.17,78.28],[-113.22,78.3],[-113.29,78.33],[-113.28,78.35],[-113.15,78.41],[-112.86,78.47],[-112.64,78.5],[-112.21,78.55],[-111.71,78.57],[-111.52,78.6],[-111.4,78.64],[-111.07,78.71],[-110.88,78.74],[-110.62,78.76],[-110.41,78.76],[-110.14,78.7],[-109.94,78.68],[-109.82,78.65]],[[-96.2,78.53],[-95.97,78.51],[-95.56,78.52],[-95.41,78.5],[-95.03,78.43],[-94.92,78.39],[-94.89,78.36],[-94.89,78.35],[-95.01,78.31],[-95.27,78.26],[-95.33,78.23],[-95.1,78.18],[-94.99,78.14],[-94.94,78.11],[-94.93,78.08],[-95.09,77.99],[-95.2,77.97],[-95.37,77.97],[-95.45,77.96],[-95.67,77.92],[-96.01,77.89],[-96.48,77.87],[-96.6,77.85],[-96.83,77.81],[-96.99,77.81],[-97.04,77.83],[-97.06,77.86],[-97.05,77.88],[-97.02,77.91],[-97.09,77.93],[-97.43,77.98],[-97.62,78.05],[-97.65,78.07],[-97.66,78.09],[-97.23,78.1],[-97.04,78.12],[-96.96,78.14],[-96.94,78.15],[-97.03,78.16],[-97.32,78.2],[-97.82,78.23],[-97.84,78.26],[-98.05,78.33],[-98.07,78.39],[-98.11,78.4],[-98.25,78.43],[-98.28,78.44],[-98.32,78.48],[-98.32,78.5],[-98.32,78.52],[-98.06,78.56],[-98.1,78.59],[-98.29,78.69],[-98.34,78.75],[-98.33,78.77],[-98.21,78.8],[-98.04,78.81],[-97.6,78.8],[-97.38,78.78],[-97.17,78.76],[-96.94,78.72],[-96.59,78.69],[-96.48,78.67],[-96.27,78.6],[-96.24,78.57],[-96.26,78.55],[-96.2,78.53]],[[-103.43,79.32],[-103.19,79.3],[-102.91,79.23],[-102.65,79.1],[-102.64,79.08],[-102.64,79.05],[-102.65,79.03],[-102.68,78.99],[-102.73,78.97],[-102.6,78.94],[-102.58,78.93],[-102.59,78.9],[-102.58,78.88],[-102.49,78.9],[-102.42,78.93],[-102.41,78.95],[-102.39,79.01],[-102.19,79.04],[-101.97,79.08],[-101.87,79.09],[-101.7,79.08],[-101.3,78.98],[-101.14,78.97],[-101.09,78.96],[-101.04,78.94],[-101.03,78.91],[-101.12,78.86],[-101.15,78.82],[-101.13,78.8],[-100.92,78.78],[-100.44,78.82],[-100.01,78.73],[-99.78,78.62],[-99.61,78.58],[-99.58,78.56],[-99.63,78.54],[-99.68,78.49],[-99.82,78.46],[-99.85,78.44],[-99.77,78.39],[-99.77,78.36],[-99.78,78.33],[-99.75,78.3],[-99.56,78.28],[-99.13,78.12],[-99.05,78.07],[-99.0,78.02],[-99.0,78.0],[-99.06,77.97],[-99.13,77.88],[-99.17,77.86],[-99.34,77.84],[-99.66,77.82],[-99.96,77.79],[-100.27,77.83],[-100.59,77.89],[-100.68,77.93],[-100.76,77.98],[-100.78,78.0],[-100.81,78.07],[-100.83,78.09],[-100.96,78.13],[-101.07,78.19],[-101.3,78.2],[-101.83,78.26],[-102.06,78.28],[-102.28,78.28],[-102.61,78.25],[-102.67,78.26],[-102.72,78.28],[-102.77,78.31],[-102.78,78.33],[-102.73,78.37],[-103.68,78.32],[-103.95,78.26],[-104.32,78.27],[-104.51,78.29],[-104.76,78.35],[-104.88,78.4],[-104.99,78.47],[-105.0,78.52],[-104.91,78.55],[-104.82,78.57],[-104.73,78.58],[-104.21,78.54],[-103.76,78.52],[-103.57,78.54],[-103.48,78.59],[-103.59,78.62],[-104.02,78.63],[-103.93,78.66],[-103.56,78.69],[-103.37,78.74],[-103.41,78.75],[-103.52,78.77],[-104.01,78.76],[-104.19,78.78],[-104.19,78.8],[-104.15,78.81],[-103.88,78.9],[-103.89,78.92],[-104.01,78.95],[-104.11,78.99],[-104.15,78.99],[-104.39,78.96],[-104.74,78.83],[-104.82,78.81],[-104.9,78.81],[-104.97,78.83],[-104.97,78.86],[-104.89,78.89],[-104.74,78.99],[-104.75,79.03],[-104.9,79.05],[-105.31,79.03],[-105.54,79.03],[-105.57,79.06],[-105.58,79.11],[-105.57,79.16],[-105.51,79.24],[-105.44,79.3],[-105.39,79.32],[-104.85,79.31],[-103.96,79.35],[-103.71,79.35],[-103.43,79.32]],[[-98.79,79.98],[-98.77,79.85],[-98.79,79.79],[-98.84,79.74],[-98.89,79.73],[-98.95,79.72],[-99.22,79.76],[-99.3,79.78],[-99.31,79.8],[-99.33,79.84],[-99.52,79.89],[-99.86,79.88],[-100.0,79.88],[-100.06,79.9],[-100.09,79.92],[-100.13,80.0],[-100.12,80.03],[-100.08,80.08],[-100.05,80.09],[-99.8,80.14],[-99.73,80.14],[-99.42,80.13],[-99.15,80.12],[-99.02,80.11],[-98.89,80.08],[-98.82,80.04],[-98.79,79.98]],[[-91.89,81.13],[-91.75,81.05],[-91.27,80.85],[-91.05,80.78],[-90.68,80.69],[-90.64,80.66],[-90.63,80.64],[-90.64,80.59],[-90.54,80.58],[-90.22,80.55],[-89.86,80.5],[-89.8,80.5],[-89.67,80.53],[-89.52,80.54],[-89.33,80.53],[-89.24,80.51],[-89.17,80.48],[-89.14,80.46],[-89.13,80.44],[-89.2,80.41],[-89.2,80.39],[-89.15,80.38],[-89.15,80.36],[-89.22,80.29],[-89.2,80.26],[-89.02,80.2],[-88.86,80.17],[-88.54,80.13],[-88.33,80.13],[-88.2,80.11],[-88.2,80.13],[-88.26,80.17],[-88.38,80.23],[-88.61,80.26],[-88.65,80.29],[-88.66,80.35],[-88.64,80.39],[-88.52,80.42],[-88.42,80.43],[-88.13,80.43],[-87.96,80.42],[-87.68,80.37],[-87.65,80.35],[-87.63,80.3],[-87.62,80.21],[-87.63,80.19],[-87.87,80.13],[-87.92,80.1],[-87.86,80.09],[-87.65,80.08],[-87.33,80.05],[-87.2,80.04],[-87.08,79.97],[-86.98,79.89],[-87.05,79.81],[-87.14,79.66],[-87.22,79.63],[-87.3,79.58],[-87.24,79.57],[-86.93,79.59],[-86.86,79.6],[-86.65,79.65],[-86.34,79.63],[-86.23,79.62],[-86.18,79.61],[-86.09,79.55],[-86.01,79.48],[-85.95,79.49],[-85.8,79.57],[-85.75,79.59],[-85.68,79.62],[-85.65,79.61],[-85.5,79.53],[-85.18,79.39],[-85.06,79.33],[-85.04,79.28],[-85.18,79.23],[-85.29,79.21],[-86.09,79.1],[-86.45,79.04],[-86.63,78.99],[-86.72,78.98],[-86.91,78.98],[-86.96,78.97],[-87.02,78.9],[-87.08,78.87],[-87.25,78.81],[-87.48,78.72],[-87.62,78.68],[-87.86,78.71],[-87.92,78.75],[-87.96,78.85],[-87.96,78.89],[-87.95,78.92],[-87.92,78.95],[-87.82,79.04],[-87.83,79.05],[-87.88,79.04],[-88.04,79.0],[-88.1,78.97],[-88.16,78.93],[-88.19,78.87],[-88.17,78.75],[-88.19,78.7],[-88.25,78.67],[-88.23,78.65],[-88.04,78.63],[-88.0,78.62],[-87.98,78.59],[-87.97,78.56],[-87.98,78.54],[-88.04,78.49],[-88.15,78.48],[-88.28,78.5],[-88.58,78.6],[-88.71,78.6],[-88.74,78.58],[-88.71,78.55],[-88.62,78.46],[-88.61,78.39],[-88.65,78.33],[-88.73,78.24],[-88.79,78.19],[-88.82,78.19],[-88.97,78.18],[-89.1,78.21],[-89.47,78.37],[-89.66,78.44],[-89.93,78.57],[-90.0,78.6],[-90.04,78.61],[-90.08,78.55],[-90.0,78.5],[-89.76,78.37],[-89.61,78.28],[-89.51,78.2],[-89.49,78.17],[-89.53,78.16],[-89.58,78.17],[-89.65,78.19],[-89.87,78.24],[-89.97,78.26],[-90.03,78.29],[-90.14,78.31],[-90.3,78.33],[-90.46,78.33],[-90.62,78.32],[-90.65,78.31],[-90.47,78.27],[-90.41,78.25],[-90.36,78.22],[-90.33,78.18],[-90.39,78.16],[-90.61,78.15],[-90.92,78.16],[-91.41,78.19],[-91.9,78.24],[-92.35,78.31],[-92.68,78.39],[-92.81,78.43],[-92.85,78.46],[-92.73,78.49],[-92.3,78.52],[-91.87,78.54],[-91.93,78.56],[-92.72,78.61],[-92.97,78.61],[-93.11,78.6],[-93.27,78.61],[-93.39,78.64],[-93.55,78.71],[-93.63,78.75],[-93.62,78.77],[-93.56,78.78],[-93.21,78.77],[-93.16,78.78],[-93.34,78.81],[-93.9,78.87],[-94.11,78.93],[-94.15,78.95],[-94.17,78.97],[-94.16,78.99],[-93.95,79.04],[-93.29,79.14],[-93.07,79.16],[-92.84,79.16],[-92.68,79.19],[-92.55,79.28],[-91.87,79.32],[-91.34,79.36],[-91.3,79.37],[-91.69,79.36],[-92.25,79.37],[-92.48,79.44],[-92.64,79.45],[-92.82,79.45],[-93.03,79.43],[-93.38,79.37],[-93.55,79.35],[-93.93,79.29],[-94.04,79.3],[-94.09,79.3],[-94.11,79.32],[-94.04,79.36],[-93.94,79.39],[-93.96,79.4],[-94.11,79.4],[-94.28,79.4],[-94.4,79.39],[-94.85,79.34],[-95.04,79.29],[-95.1,79.29],[-95.32,79.35],[-95.66,79.39],[-95.73,79.42],[-95.66,79.53],[-95.56,79.55],[-95.3,79.57],[-94.52,79.67],[-94.48,79.69],[-94.4,79.74],[-94.58,79.73],[-94.97,79.68],[-95.3,79.65],[-95.55,79.65],[-95.74,79.66],[-95.86,79.67],[-96.0,79.7],[-96.46,79.85],[-96.59,79.92],[-96.61,79.98],[-96.64,80.02],[-96.77,80.14],[-95.78,80.07],[-95.39,80.05],[-94.65,80.05],[-94.61,80.06],[-94.6,80.07],[-94.61,80.1],[-94.61,80.13],[-94.58,80.14],[-94.3,80.18],[-94.26,80.19],[-94.59,80.2],[-95.19,80.13],[-95.41,80.14],[-95.65,80.23],[-95.9,80.21],[-96.03,80.22],[-96.22,80.25],[-96.31,80.27],[-96.37,80.29],[-96.39,80.32],[-96.39,80.33],[-96.33,80.35],[-96.11,80.38],[-96.01,80.38],[-95.75,80.37],[-95.55,80.37],[-95.61,80.4],[-95.9,80.47],[-96.15,80.55],[-96.13,80.69],[-95.93,80.72],[-95.71,80.73],[-95.51,80.69],[-95.23,80.69],[-95.03,80.65],[-94.89,80.57],[-94.73,80.57],[-94.49,80.56],[-93.93,80.56],[-94.03,80.59],[-94.2,80.61],[-94.6,80.64],[-94.79,80.75],[-95.2,80.81],[-95.51,80.84],[-95.51,80.86],[-95.27,81.0],[-94.98,81.05],[-94.52,81.03],[-94.22,81.06],[-93.83,81.11],[-93.44,81.08],[-93.35,81.09],[-93.29,81.1],[-93.24,81.13],[-93.24,81.16],[-93.29,81.18],[-93.41,81.21],[-93.89,81.21],[-94.11,81.22],[-94.19,81.24],[-94.22,81.26],[-94.23,81.29],[-94.23,81.32],[-94.22,81.33],[-94.18,81.34],[-94.06,81.35],[-93.6,81.35],[-93.33,81.36],[-93.03,81.35],[-92.41,81.28],[-92.21,81.24],[-92.0,81.19],[-91.89,81.13]],[[-69.49,83.02],[-68.67,83.0],[-68.41,83.01],[-68.11,82.96],[-67.92,82.96],[-67.62,82.96],[-67.41,82.95],[-66.59,82.94],[-66.42,82.93],[-66.42,82.91],[-66.6,82.86],[-66.84,82.82],[-68.36,82.68],[-68.47,82.65],[-68.17,82.65],[-67.74,82.65],[-67.4,82.67],[-67.0,82.72],[-66.87,82.72],[-66.61,82.74],[-66.12,82.81],[-65.73,82.84],[-65.55,82.83],[-65.4,82.8],[-65.3,82.8],[-65.25,82.82],[-65.16,82.87],[-65.11,82.89],[-64.98,82.9],[-64.9,82.9],[-64.78,82.88],[-64.63,82.82],[-64.5,82.78],[-64.43,82.78],[-64.13,82.82],[-63.98,82.83],[-63.64,82.81],[-63.5,82.79],[-63.47,82.77],[-63.56,82.75],[-63.62,82.73],[-63.64,82.71],[-63.59,82.69],[-63.39,82.65],[-63.09,82.57],[-63.09,82.53],[-63.25,82.47],[-63.25,82.45],[-62.48,82.52],[-61.7,82.49],[-61.48,82.47],[-61.39,82.44],[-61.3,82.4],[-61.21,82.34],[-61.27,82.28],[-61.62,82.18],[-61.97,82.11],[-62.18,82.04],[-62.5,82.01],[-63.59,81.85],[-64.13,81.79],[-64.44,81.74],[-64.57,81.73],[-65.23,81.74],[-65.4,81.72],[-65.5,81.67],[-65.7,81.65],[-66.0,81.63],[-66.63,81.62],[-66.77,81.56],[-66.8,81.53],[-66.86,81.5],[-66.91,81.49],[-68.69,81.29],[-68.72,81.26],[-68.54,81.25],[-68.32,81.26],[-65.74,81.49],[-65.24,81.51],[-64.78,81.49],[-64.83,81.44],[-65.48,81.28],[-66.31,81.15],[-66.73,81.04],[-67.77,80.86],[-68.63,80.68],[-68.96,80.59],[-69.4,80.42],[-69.55,80.38],[-69.73,80.37],[-69.95,80.37],[-70.14,80.4],[-70.4,80.46],[-70.64,80.53],[-70.71,80.54],[-70.67,80.51],[-70.21,80.28],[-70.26,80.23],[-71.1,80.19],[-71.47,80.15],[-71.66,80.14],[-71.8,80.14],[-71.93,80.14],[-72.06,80.12],[-72.06,80.11],[-71.95,80.09],[-71.62,80.07],[-70.88,80.12],[-70.76,80.12],[-70.57,80.09],[-70.56,80.07],[-70.76,80.0],[-71.36,79.91],[-71.28,79.91],[-71.11,79.88],[-71.11,79.85],[-71.3,79.78],[-71.39,79.76],[-71.96,79.7],[-72.22,79.69],[-72.44,79.69],[-73.45,79.83],[-73.81,79.85],[-74.14,79.88],[-74.39,79.87],[-74.66,79.84],[-74.54,79.82],[-74.05,79.78],[-73.64,79.77],[-73.47,79.76],[-73.41,79.73],[-73.23,79.64],[-73.2,79.6],[-73.24,79.55],[-73.29,79.52],[-73.36,79.5],[-73.47,79.5],[-73.87,79.5],[-74.02,79.49],[-74.19,79.46],[-74.41,79.45],[-74.8,79.46],[-75.26,79.42],[-75.5,79.41],[-75.77,79.43],[-76.07,79.47],[-76.38,79.49],[-76.9,79.51],[-76.86,79.49],[-76.67,79.48],[-76.3,79.41],[-76.12,79.33],[-75.95,79.31],[-75.6,79.24],[-75.35,79.23],[-75.09,79.2],[-74.73,79.24],[-74.48,79.23],[-74.53,79.05],[-74.64,79.04],[-75.23,79.04],[-75.51,79.06],[-75.64,79.09],[-75.91,79.12],[-76.16,79.1],[-76.38,79.1],[-76.53,79.09],[-76.77,79.09],[-77.4,79.06],[-77.73,79.06],[-77.97,79.08],[-78.26,79.08],[-78.58,79.08],[-78.56,79.05],[-78.42,79.05],[-78.22,79.02],[-78.04,78.96],[-77.88,78.94],[-77.7,78.95],[-77.51,78.98],[-76.82,79.02],[-76.52,79.02],[-76.26,79.01],[-76.08,78.99],[-75.95,78.96],[-75.8,78.89],[-75.4,78.88],[-75.1,78.86],[-74.62,78.76],[-74.49,78.75],[-74.43,78.72],[-74.54,78.66],[-74.55,78.62],[-74.88,78.54],[-75.4,78.52],[-75.97,78.53],[-76.37,78.52],[-76.42,78.51],[-76.14,78.49],[-75.49,78.4],[-75.24,78.36],[-75.19,78.33],[-75.55,78.22],[-75.87,78.01],[-75.97,77.99],[-76.08,77.99],[-76.36,77.99],[-76.71,77.94],[-76.97,77.93],[-77.46,77.95],[-78.01,77.95],[-78.06,77.91],[-78.08,77.85],[-78.08,77.75],[-78.05,77.62],[-78.08,77.52],[-78.17,77.46],[-78.28,77.41],[-78.49,77.37],[-78.71,77.34],[-78.87,77.33],[-79.14,77.33],[-79.91,77.3],[-80.28,77.3],[-80.57,77.31],[-80.87,77.36],[-81.38,77.48],[-81.52,77.51],[-81.66,77.53],[-81.65,77.5],[-81.5,77.43],[-81.38,77.39],[-81.28,77.37],[-81.3,77.34],[-81.52,77.31],[-81.77,77.3],[-82.06,77.3],[-82.07,77.28],[-81.97,77.25],[-81.84,77.21],[-81.76,77.2],[-81.53,77.21],[-81.28,77.26],[-81.12,77.27],[-80.8,77.26],[-80.67,77.24],[-80.27,77.15],[-80.22,77.15],[-79.92,77.19],[-79.5,77.2],[-79.34,77.16],[-79.28,77.09],[-79.27,77.03],[-79.32,76.98],[-79.22,76.94],[-78.98,76.89],[-78.79,76.88],[-78.66,76.91],[-78.46,76.97],[-78.37,76.98],[-78.29,76.98],[-78.17,76.93],[-78.0,76.85],[-77.98,76.75],[-78.12,76.64],[-78.28,76.57],[-78.93,76.45],[-79.13,76.4],[-79.29,76.35],[-79.51,76.31],[-79.95,76.25],[-80.19,76.24],[-80.69,76.18],[-80.8,76.17],[-80.96,76.18],[-81.0,76.21],[-80.96,76.27],[-80.9,76.32],[-80.83,76.37],[-80.83,76.41],[-80.97,76.47],[-81.07,76.5],[-81.17,76.51],[-81.36,76.5],[-81.47,76.49],[-81.59,76.48],[-81.72,76.49],[-81.82,76.52],[-82.03,76.63],[-82.11,76.64],[-82.22,76.64],[-82.31,76.66],[-82.39,76.69],[-82.53,76.72],[-82.49,76.7],[-82.36,76.64],[-82.26,76.57],[-82.21,76.51],[-82.23,76.47],[-83.39,76.44],[-83.89,76.45],[-83.99,76.5],[-84.22,76.68],[-84.28,76.36],[-85.14,76.3],[-85.34,76.31],[-85.68,76.35],[-86.12,76.43],[-86.3,76.49],[-86.37,76.55],[-86.42,76.58],[-86.45,76.58],[-86.56,76.52],[-86.68,76.38],[-86.98,76.41],[-87.35,76.45],[-87.49,76.59],[-87.5,76.39],[-88.1,76.41],[-88.4,76.41],[-88.48,76.58],[-88.5,76.77],[-88.61,76.65],[-88.56,76.55],[-88.55,76.42],[-88.8,76.46],[-89.37,76.47],[-89.57,76.49],[-89.54,76.66],[-89.5,76.83],[-88.77,76.99],[-88.56,77.07],[-88.4,77.1],[-88.15,77.12],[-87.83,77.14],[-87.61,77.13],[-87.36,77.14],[-87.06,77.17],[-86.85,77.17],[-86.81,77.18],[-86.87,77.2],[-87.1,77.31],[-87.18,77.33],[-87.27,77.34],[-87.43,77.35],[-87.59,77.39],[-87.68,77.44],[-87.78,77.49],[-87.94,77.6],[-88.09,77.72],[-88.02,77.78],[-87.76,77.84],[-87.5,77.87],[-87.24,77.89],[-87.02,77.89],[-86.76,77.86],[-86.39,77.81],[-86.17,77.75],[-85.91,77.61],[-85.73,77.51],[-85.59,77.46],[-84.95,77.37],[-84.74,77.36],[-84.49,77.37],[-83.97,77.39],[-83.72,77.41],[-83.61,77.44],[-83.55,77.48],[-83.48,77.51],[-83.25,77.58],[-82.9,77.73],[-82.71,77.85],[-82.66,77.89],[-82.63,77.94],[-82.6,77.99],[-82.7,77.96],[-83.3,77.67],[-83.43,77.62],[-83.78,77.53],[-83.93,77.52],[-84.17,77.52],[-84.49,77.56],[-84.86,77.5],[-85.09,77.52],[-85.29,77.56],[-85.29,77.76],[-85.55,77.93],[-85.27,78.01],[-85.03,78.06],[-84.62,78.2],[-84.52,78.2],[-84.22,78.18],[-84.39,78.21],[-84.55,78.25],[-84.91,78.24],[-84.78,78.53],[-85.02,78.31],[-85.27,78.2],[-85.42,78.14],[-85.59,78.11],[-86.22,78.08],[-86.06,78.19],[-85.92,78.34],[-86.07,78.28],[-86.43,78.2],[-86.69,78.15],[-86.91,78.13],[-87.34,78.13],[-87.55,78.18],[-87.49,78.28],[-87.49,78.42],[-87.36,78.48],[-87.16,78.56],[-86.95,78.66],[-86.81,78.77],[-86.24,78.82],[-85.69,78.84],[-85.23,78.9],[-85.0,78.91],[-84.79,78.88],[-83.91,78.84],[-83.55,78.8],[-83.39,78.78],[-83.27,78.77],[-83.15,78.81],[-82.99,78.84],[-82.44,78.84],[-82.29,78.85],[-82.15,78.86],[-81.98,78.9],[-81.78,78.95],[-81.75,78.98],[-81.89,78.97],[-82.03,78.96],[-82.24,78.92],[-82.44,78.9],[-82.64,78.91],[-83.06,78.94],[-83.78,78.95],[-84.15,78.96],[-84.32,78.98],[-84.41,79.0],[-84.5,79.03],[-84.57,79.07],[-84.53,79.1],[-84.38,79.12],[-84.26,79.12],[-84.05,79.1],[-83.82,79.06],[-83.58,79.05],[-83.66,79.09],[-83.98,79.16],[-84.2,79.23],[-84.38,79.3],[-84.52,79.38],[-84.84,79.49],[-85.09,79.61],[-85.27,79.66],[-85.46,79.69],[-86.03,79.72],[-86.15,79.74],[-86.42,79.85],[-86.49,80.02],[-86.61,80.12],[-86.5,80.26],[-86.31,80.32],[-85.16,80.27],[-84.68,80.28],[-84.06,80.26],[-83.72,80.23],[-83.34,80.15],[-83.0,80.05],[-82.68,79.99],[-82.38,79.91],[-82.05,79.78],[-81.86,79.72],[-81.69,79.69],[-81.46,79.65],[-81.04,79.61],[-80.67,79.6],[-80.48,79.61],[-80.27,79.64],[-80.12,79.67],[-80.29,79.68],[-80.71,79.67],[-81.01,79.69],[-81.18,79.73],[-81.36,79.79],[-81.64,79.89],[-81.86,79.96],[-82.33,80.07],[-82.68,80.17],[-82.96,80.28],[-82.99,80.32],[-82.78,80.35],[-82.54,80.38],[-80.98,80.45],[-80.05,80.53],[-79.67,80.63],[-79.63,80.65],[-78.39,80.78],[-77.51,80.83],[-77.17,80.84],[-76.86,80.86],[-76.85,80.88],[-77.12,80.9],[-77.39,80.91],[-78.0,80.9],[-78.55,80.92],[-78.72,80.95],[-78.68,81.0],[-78.63,81.04],[-78.46,81.11],[-78.29,81.17],[-77.54,81.32],[-77.03,81.39],[-76.89,81.43],[-77.97,81.33],[-78.35,81.26],[-78.73,81.15],[-78.93,81.12],[-79.07,81.13],[-79.2,81.12],[-79.31,81.09],[-79.4,81.04],[-79.48,80.96],[-79.55,80.91],[-79.61,80.88],[-79.76,80.84],[-80.13,80.76],[-81.01,80.65],[-81.3,80.63],[-81.55,80.62],[-82.37,80.56],[-82.61,80.56],[-82.88,80.58],[-82.77,80.63],[-82.34,80.73],[-82.22,80.77],[-82.5,80.76],[-82.78,80.74],[-83.4,80.71],[-83.65,80.67],[-83.89,80.6],[-84.08,80.56],[-84.22,80.54],[-84.42,80.53],[-85.15,80.52],[-85.31,80.53],[-85.73,80.58],[-86.1,80.56],[-86.25,80.57],[-86.53,80.6],[-86.62,80.63],[-86.6,80.66],[-86.44,80.73],[-86.25,80.79],[-85.64,80.92],[-85.25,80.99],[-84.68,81.04],[-83.35,81.1],[-83.29,81.15],[-84.64,81.1],[-85.78,81.04],[-85.97,81.01],[-86.23,80.95],[-87.08,80.73],[-87.33,80.67],[-87.71,80.66],[-88.0,80.68],[-88.23,80.7],[-88.63,80.77],[-88.92,80.81],[-89.06,80.83],[-89.14,80.85],[-89.21,80.88],[-89.26,80.91],[-89.17,80.94],[-88.41,81.0],[-87.39,80.99],[-86.93,81.0],[-86.48,81.04],[-85.81,81.12],[-85.08,81.25],[-84.94,81.29],[-85.21,81.29],[-85.4,81.29],[-85.88,81.24],[-86.62,81.12],[-87.28,81.08],[-88.89,81.06],[-89.4,81.03],[-89.62,81.03],[-89.79,81.06],[-89.98,81.12],[-89.95,81.17],[-89.56,81.23],[-89.26,81.24],[-89.21,81.25],[-89.64,81.3],[-89.67,81.33],[-89.43,81.39],[-88.89,81.47],[-88.62,81.5],[-88.13,81.52],[-87.62,81.51],[-87.6,81.53],[-88.1,81.56],[-88.48,81.56],[-88.98,81.54],[-90.3,81.4],[-90.42,81.41],[-90.61,81.43],[-90.55,81.46],[-89.85,81.61],[-89.82,81.63],[-90.33,81.63],[-90.48,81.64],[-90.63,81.66],[-90.83,81.64],[-91.1,81.59],[-91.29,81.57],[-91.4,81.58],[-91.68,81.64],[-91.65,81.68],[-91.42,81.74],[-91.22,81.79],[-90.94,81.83],[-90.49,81.88],[-90.16,81.89],[-89.63,81.89],[-89.38,81.92],[-89.16,81.96],[-88.88,82.02],[-88.57,82.06],[-88.06,82.1],[-87.64,82.09],[-87.4,82.05],[-87.22,82.0],[-87.02,81.96],[-87.0,81.99],[-86.83,82.03],[-86.63,82.05],[-86.38,82.05],[-86.16,82.03],[-85.87,81.98],[-85.65,81.95],[-85.54,81.95],[-85.4,81.98],[-85.04,81.98],[-85.05,81.99],[-85.17,82.02],[-85.31,82.04],[-86.58,82.19],[-86.62,82.22],[-86.19,82.25],[-85.92,82.28],[-85.79,82.29],[-85.48,82.37],[-85.28,82.41],[-84.9,82.45],[-84.74,82.44],[-84.55,82.4],[-84.37,82.37],[-83.82,82.35],[-83.59,82.33],[-83.18,82.19],[-83.01,82.14],[-82.77,82.09],[-82.63,82.08],[-82.36,82.07],[-82.33,82.09],[-82.66,82.16],[-82.75,82.2],[-82.71,82.23],[-82.64,82.25],[-82.54,82.25],[-82.28,82.22],[-81.58,82.12],[-80.55,82.0],[-80.15,81.98],[-79.91,81.94],[-79.69,81.89],[-79.47,81.85],[-79.42,81.85],[-79.63,81.93],[-80.13,82.03],[-81.47,82.19],[-82.0,82.28],[-82.25,82.34],[-82.45,82.4],[-82.45,82.43],[-82.27,82.46],[-82.02,82.49],[-81.72,82.51],[-81.68,82.52],[-81.96,82.56],[-82.12,82.6],[-82.12,82.63],[-81.79,82.65],[-81.58,82.64],[-81.19,82.59],[-80.86,82.57],[-80.81,82.59],[-81.15,82.72],[-81.18,82.74],[-81.13,82.76],[-81.01,82.78],[-80.66,82.77],[-80.08,82.71],[-79.04,82.67],[-78.75,82.68],[-78.79,82.69],[-79.21,82.73],[-79.64,82.78],[-79.83,82.82],[-79.97,82.86],[-80.14,82.89],[-80.15,82.91],[-79.89,82.94],[-79.18,82.93],[-78.52,82.89],[-77.97,82.91],[-77.62,82.9],[-77.48,82.88],[-77.23,82.84],[-76.42,82.67],[-76.34,82.64],[-76.24,82.6],[-76.15,82.55],[-76.01,82.54],[-75.74,82.57],[-75.57,82.61],[-75.64,82.64],[-76.09,82.72],[-76.19,82.76],[-76.41,82.82],[-76.91,82.92],[-77.04,82.97],[-77.12,83.01],[-75.74,83.05],[-74.41,83.01],[-74.2,82.99],[-74.06,82.96],[-73.92,82.9],[-73.7,82.85],[-73.27,82.77],[-72.66,82.72],[-72.78,82.76],[-73.23,82.84],[-73.44,82.9],[-73.44,82.95],[-73.4,82.98],[-73.33,83.0],[-72.81,83.08],[-72.07,83.11],[-71.98,83.1],[-71.41,82.97],[-71.13,82.92],[-70.94,82.9],[-70.93,82.91],[-71.2,82.97],[-71.4,83.0],[-71.42,83.02],[-71.08,83.08],[-70.87,83.1],[-69.97,83.12],[-69.87,83.11],[-69.78,83.09],[-69.57,83.02],[-69.49,83.02]]]},{"n":"Switzerland","r":[[[9.58,47.06],[9.62,47.06],[9.75,47.04],[9.85,47.01],[9.86,46.98],[9.88,46.94],[10.0,46.89],[10.13,46.85],[10.18,46.86],[10.35,46.98],[10.41,46.96],[10.45,46.9],[10.45,46.86],[10.41,46.73],[10.4,46.67],[10.44,46.62],[10.44,46.58],[10.43,46.55],[10.36,46.55],[10.27,46.56],[10.2,46.62],[10.14,46.61],[10.09,46.6],[10.06,46.55],[10.04,46.48],[10.05,46.45],[10.08,46.42],[10.11,46.36],[10.13,46.29],[10.15,46.25],[10.13,46.24],[10.08,46.23],[10.04,46.24],[9.97,46.33],[9.94,46.36],[9.88,46.37],[9.79,46.35],[9.64,46.3],[9.58,46.3],[9.53,46.31],[9.48,46.35],[9.44,46.43],[9.43,46.48],[9.4,46.48],[9.3,46.5],[9.26,46.48],[9.26,46.39],[9.25,46.29],[9.2,46.22],[9.07,46.1],[9.02,46.05],[9.0,46.01],[9.0,45.98],[9.02,45.93],[9.05,45.88],[9.02,45.85],[8.95,45.83],[8.9,45.86],[8.89,45.92],[8.78,46.0],[8.83,46.06],[8.82,46.08],[8.64,46.11],[8.57,46.16],[8.46,46.25],[8.44,46.28],[8.44,46.4],[8.44,46.43],[8.42,46.45],[8.37,46.45],[8.3,46.4],[8.23,46.34],[8.1,46.27],[8.08,46.26],[8.13,46.19],[8.13,46.16],[8.01,46.05],[7.99,46.02],[7.85,45.95],[7.79,45.92],[7.59,45.97],[7.54,45.98],[7.45,45.94],[7.33,45.91],[7.13,45.88],[7.06,45.9],[7.02,45.93],[7.0,45.96],[6.95,46.02],[6.9,46.05],[6.86,46.09],[6.81,46.13],[6.77,46.17],[6.82,46.28],[6.78,46.31],[6.77,46.37],[6.78,46.41],[6.76,46.42],[6.58,46.44],[6.43,46.43],[6.32,46.39],[6.23,46.33],[6.22,46.32],[6.23,46.31],[6.27,46.25],[6.2,46.19],[6.09,46.15],[6.01,46.14],[5.97,46.15],[5.97,46.21],[6.04,46.24],[6.1,46.28],[6.12,46.34],[6.12,46.38],[6.06,46.43],[6.07,46.46],[6.11,46.52],[6.13,46.57],[6.16,46.61],[6.29,46.68],[6.41,46.76],[6.43,46.83],[6.44,46.93],[6.46,46.95],[6.62,47.0],[6.67,47.03],[6.69,47.06],[6.82,47.16],[6.95,47.27],[6.98,47.3],[7.0,47.32],[7.0,47.34],[6.98,47.35],[6.92,47.36],[6.9,47.39],[6.97,47.45],[7.05,47.49],[7.14,47.49],[7.17,47.47],[7.17,47.45],[7.2,47.43],[7.27,47.43],[7.34,47.43],[7.42,47.46],[7.47,47.51],[7.49,47.55],[7.62,47.59],[7.7,47.57],[7.93,47.56],[8.09,47.58],[8.2,47.61],[8.33,47.61],[8.41,47.59],[8.43,47.59],[8.45,47.6],[8.48,47.61],[8.56,47.62],[8.57,47.64],[8.57,47.65],[8.55,47.66],[8.45,47.65],[8.41,47.66],[8.4,47.69],[8.44,47.73],[8.51,47.77],[8.57,47.78],[8.62,47.77],[8.73,47.7],[8.75,47.7],[8.77,47.71],[8.79,47.72],[8.83,47.7],[8.87,47.66],[8.88,47.66],[9.13,47.67],[9.18,47.67],[9.35,47.6],[9.52,47.52],[9.55,47.51],[9.63,47.47],[9.61,47.39],[9.53,47.27],[9.48,47.17],[9.48,47.1],[9.49,47.06],[9.5,47.06],[9.58,47.06]]]},{"n":"Chile","r":[[[-68.63,-52.65],[-68.63,-52.95],[-68.63,-53.24],[-68.64,-53.52],[-68.64,-53.79],[-68.64,-54.05],[-68.64,-54.32],[-68.65,-54.63],[-68.65,-54.85],[-68.8,-54.85],[-68.84,-54.88],[-69.08,-54.91],[-69.49,-54.86],[-69.59,-54.81],[-69.72,-54.71],[-69.77,-54.74],[-69.9,-54.78],[-70.03,-54.82],[-70.14,-54.82],[-70.24,-54.78],[-70.26,-54.76],[-70.28,-54.75],[-70.5,-54.81],[-70.74,-54.75],[-70.92,-54.71],[-71.23,-54.69],[-71.44,-54.62],[-71.83,-54.63],[-71.9,-54.6],[-71.93,-54.53],[-71.91,-54.49],[-71.82,-54.47],[-71.8,-54.43],[-71.72,-54.44],[-71.61,-54.5],[-71.57,-54.5],[-71.5,-54.44],[-71.39,-54.4],[-71.36,-54.4],[-71.16,-54.45],[-71.08,-54.44],[-70.97,-54.42],[-70.95,-54.4],[-70.93,-54.36],[-70.9,-54.34],[-70.8,-54.33],[-70.7,-54.35],[-70.69,-54.41],[-70.7,-54.49],[-70.57,-54.5],[-70.42,-54.5],[-70.31,-54.53],[-70.3,-54.49],[-70.47,-54.37],[-70.54,-54.3],[-70.64,-54.26],[-70.76,-54.24],[-70.86,-54.11],[-70.86,-54.0],[-70.87,-53.88],[-70.64,-53.82],[-70.7,-53.73],[-70.62,-53.66],[-70.53,-53.63],[-70.44,-53.89],[-70.38,-53.99],[-70.46,-54.01],[-70.63,-54.01],[-70.54,-54.14],[-70.38,-54.18],[-70.25,-54.28],[-70.24,-54.35],[-70.17,-54.38],[-69.99,-54.38],[-69.87,-54.37],[-69.81,-54.32],[-69.74,-54.31],[-69.62,-54.36],[-69.42,-54.41],[-69.36,-54.44],[-69.33,-54.49],[-69.32,-54.54],[-69.31,-54.57],[-69.25,-54.56],[-69.17,-54.48],[-69.13,-54.46],[-69.08,-54.45],[-69.05,-54.43],[-69.04,-54.41],[-69.2,-54.35],[-69.99,-54.11],[-70.09,-54.01],[-70.15,-53.89],[-70.15,-53.76],[-70.09,-53.72],[-69.95,-53.67],[-69.69,-53.6],[-69.39,-53.5],[-69.35,-53.48],[-69.36,-53.42],[-69.39,-53.37],[-69.51,-53.34],[-69.64,-53.33],[-69.76,-53.34],[-69.87,-53.35],[-70.09,-53.42],[-70.21,-53.41],[-70.33,-53.38],[-70.42,-53.3],[-70.46,-53.21],[-70.46,-53.14],[-70.44,-53.09],[-70.39,-53.03],[-70.32,-53.0],[-70.26,-53.0],[-70.2,-52.99],[-70.16,-52.97],[-70.13,-52.94],[-70.14,-52.92],[-70.16,-52.9],[-70.26,-52.86],[-70.3,-52.82],[-70.38,-52.75],[-70.33,-52.73],[-70.19,-52.72],[-70.09,-52.77],[-69.99,-52.82],[-69.94,-52.82],[-69.88,-52.8],[-69.76,-52.73],[-69.66,-52.65],[-69.57,-52.55],[-69.5,-52.49],[-69.41,-52.49],[-69.17,-52.67],[-69.08,-52.67],[-68.79,-52.58],[-68.76,-52.58],[-68.66,-52.63],[-68.63,-52.65]],[[-67.19,-22.82],[-67.01,-23.0],[-67.09,-23.25],[-67.22,-23.63],[-67.32,-23.93],[-67.34,-23.97],[-67.36,-24.03],[-67.57,-24.12],[-67.89,-24.24],[-68.05,-24.31],[-68.25,-24.39],[-68.3,-24.46],[-68.36,-24.5],[-68.42,-24.55],[-68.45,-24.6],[-68.51,-24.63],[-68.56,-24.75],[-68.56,-24.84],[-68.53,-24.9],[-68.47,-24.93],[-68.45,-25.0],[-68.43,-25.05],[-68.38,-25.09],[-68.4,-25.12],[-68.43,-25.15],[-68.5,-25.16],[-68.54,-25.24],[-68.59,-25.42],[-68.6,-25.49],[-68.54,-25.65],[-68.51,-25.74],[-68.43,-26.07],[-68.41,-26.15],[-68.53,-26.28],[-68.58,-26.35],[-68.59,-26.42],[-68.59,-26.47],[-68.58,-26.52],[-68.49,-26.67],[-68.37,-26.81],[-68.32,-26.88],[-68.32,-26.97],[-68.35,-27.03],[-68.41,-27.05],[-68.54,-27.09],[-68.59,-27.14],[-68.65,-27.15],[-68.71,-27.1],[-68.77,-27.12],[-68.85,-27.15],[-68.88,-27.25],[-68.94,-27.41],[-69.0,-27.45],[-69.04,-27.57],[-69.12,-27.74],[-69.16,-27.85],[-69.17,-27.92],[-69.25,-27.97],[-69.34,-28.07],[-69.41,-28.17],[-69.44,-28.19],[-69.49,-28.2],[-69.53,-28.29],[-69.66,-28.41],[-69.69,-28.56],[-69.73,-28.64],[-69.74,-28.78],[-69.81,-29.05],[-69.83,-29.1],[-69.9,-29.15],[-70.0,-29.25],[-70.03,-29.32],[-69.98,-29.55],[-69.93,-29.77],[-69.92,-29.87],[-69.95,-30.02],[-69.96,-30.08],[-69.92,-30.1],[-69.86,-30.12],[-69.84,-30.18],[-69.89,-30.21],[-69.91,-30.28],[-69.96,-30.36],[-70.1,-30.39],[-70.15,-30.36],[-70.17,-30.39],[-70.16,-30.44],[-70.19,-30.5],[-70.27,-30.68],[-70.32,-30.83],[-70.35,-30.9],[-70.34,-30.96],[-70.31,-30.99],[-70.31,-31.02],[-70.35,-31.06],[-70.39,-31.12],[-70.43,-31.13],[-70.47,-31.11],[-70.52,-31.15],[-70.53,-31.22],[-70.55,-31.32],[-70.57,-31.43],[-70.59,-31.57],[-70.53,-31.67],[-70.45,-31.84],[-70.39,-31.88],[-70.33,-31.88],[-70.28,-31.92],[-70.25,-31.96],[-70.29,-32.03],[-70.36,-32.04],[-70.36,-32.08],[-70.34,-32.18],[-70.32,-32.27],[-70.26,-32.31],[-70.23,-32.43],[-70.17,-32.47],[-70.18,-32.63],[-70.12,-32.81],[-70.05,-32.86],[-70.02,-32.88],[-70.04,-32.96],[-70.09,-33.03],[-70.1,-33.13],[-70.08,-33.2],[-70.02,-33.27],[-69.97,-33.28],[-69.9,-33.25],[-69.82,-33.28],[-69.81,-33.34],[-69.8,-33.4],[-69.84,-33.47],[-69.88,-33.6],[-69.89,-33.73],[-69.88,-33.93],[-69.86,-34.08],[-69.86,-34.18],[-69.85,-34.22],[-69.88,-34.25],[-69.95,-34.27],[-70.0,-34.28],[-70.05,-34.3],[-70.06,-34.35],[-70.1,-34.43],[-70.14,-34.49],[-70.21,-34.58],[-70.25,-34.67],[-70.29,-34.73],[-70.29,-34.77],[-70.31,-34.85],[-70.34,-34.92],[-70.39,-35.15],[-70.47,-35.19],[-70.53,-35.22],[-70.56,-35.25],[-70.53,-35.31],[-70.47,-35.33],[-70.45,-35.38],[-70.46,-35.45],[-70.42,-35.52],[-70.42,-35.61],[-70.38,-35.77],[-70.42,-35.88],[-70.4,-35.97],[-70.4,-36.06],[-70.46,-36.13],[-70.56,-36.15],[-70.62,-36.21],[-70.72,-36.28],[-70.73,-36.34],[-70.75,-36.39],[-70.79,-36.41],[-70.85,-36.41],[-70.91,-36.42],[-70.98,-36.49],[-71.06,-36.52],[-71.07,-36.58],[-71.07,-36.64],[-71.11,-36.69],[-71.16,-36.76],[-71.19,-36.84],[-71.16,-36.92],[-71.12,-37.06],[-71.12,-37.11],[-71.16,-37.23],[-71.2,-37.3],[-71.16,-37.39],[-71.13,-37.45],[-71.16,-37.56],[-71.19,-37.63],[-71.17,-37.76],[-71.1,-37.91],[-71.03,-38.04],[-71.02,-38.19],[-71.0,-38.31],[-70.97,-38.45],[-70.9,-38.5],[-70.85,-38.54],[-70.86,-38.6],[-70.9,-38.68],[-70.95,-38.74],[-71.09,-38.76],[-71.2,-38.81],[-71.29,-38.85],[-71.35,-38.89],[-71.4,-38.94],[-71.43,-38.99],[-71.41,-39.21],[-71.42,-39.29],[-71.47,-39.4],[-71.51,-39.5],[-71.53,-39.52],[-71.53,-39.56],[-71.54,-39.6],[-71.59,-39.61],[-71.65,-39.59],[-71.69,-39.61],[-71.72,-39.64],[-71.7,-39.71],[-71.67,-39.83],[-71.64,-39.89],[-71.65,-39.93],[-71.66,-40.02],[-71.7,-40.09],[-71.76,-40.09],[-71.8,-40.12],[-71.82,-40.18],[-71.8,-40.24],[-71.72,-40.3],[-71.7,-40.34],[-71.71,-40.38],[-71.77,-40.4],[-71.8,-40.44],[-71.84,-40.52],[-71.88,-40.62],[-71.93,-40.69],[-71.94,-40.79],[-71.87,-40.89],[-71.88,-40.99],[-71.89,-41.29],[-71.89,-41.39],[-71.87,-41.56],[-71.9,-41.61],[-71.91,-41.65],[-71.84,-41.77],[-71.77,-41.97],[-71.75,-42.05],[-71.76,-42.1],[-71.86,-42.15],[-71.94,-42.17],[-71.99,-42.13],[-72.03,-42.15],[-72.06,-42.21],[-72.11,-42.25],[-72.12,-42.3],[-72.08,-42.36],[-72.05,-42.47],[-72.11,-42.52],[-72.14,-42.58],[-72.13,-42.65],[-72.11,-42.78],[-72.15,-42.99],[-72.1,-43.07],[-72.05,-43.1],[-71.9,-43.15],[-71.78,-43.17],[-71.75,-43.24],[-71.76,-43.29],[-71.82,-43.32],[-71.9,-43.35],[-71.9,-43.44],[-71.83,-43.53],[-71.75,-43.59],[-71.73,-43.65],[-71.74,-43.7],[-71.79,-43.75],[-71.72,-43.86],[-71.68,-43.93],[-71.72,-43.98],[-71.77,-44.07],[-71.81,-44.11],[-71.81,-44.15],[-71.83,-44.24],[-71.84,-44.33],[-71.82,-44.38],[-71.33,-44.42],[-71.21,-44.44],[-71.15,-44.49],[-71.16,-44.56],[-71.22,-44.63],[-71.26,-44.76],[-71.36,-44.79],[-71.46,-44.75],[-71.56,-44.76],[-71.65,-44.77],[-71.78,-44.77],[-71.96,-44.79],[-72.06,-44.77],[-72.07,-44.82],[-72.04,-44.9],[-71.81,-44.93],[-71.6,-44.98],[-71.53,-45.07],[-71.44,-45.17],[-71.35,-45.23],[-71.35,-45.33],[-71.49,-45.44],[-71.51,-45.51],[-71.69,-45.53],[-71.75,-45.58],[-71.77,-45.72],[-71.75,-45.84],[-71.68,-45.88],[-71.63,-45.95],[-71.68,-46.04],[-71.81,-46.1],[-71.88,-46.16],[-71.83,-46.21],[-71.78,-46.28],[-71.76,-46.32],[-71.73,-46.43],[-71.7,-46.58],[-71.7,-46.65],[-71.73,-46.71],[-71.86,-46.79],[-71.94,-46.83],[-71.96,-46.94],[-71.96,-47.02],[-71.95,-47.09],[-71.9,-47.14],[-71.9,-47.2],[-71.98,-47.21],[-72.04,-47.24],[-72.1,-47.34],[-72.28,-47.45],[-72.35,-47.49],[-72.34,-47.57],[-72.41,-47.69],[-72.47,-47.78],[-72.52,-47.88],[-72.51,-47.97],[-72.41,-48.02],[-72.33,-48.11],[-72.29,-48.23],[-72.35,-48.37],[-72.5,-48.42],[-72.58,-48.48],[-72.61,-48.52],[-72.59,-48.66],[-72.59,-48.73],[-72.61,-48.79],[-72.65,-48.84],[-72.73,-48.9],[-72.87,-48.94],[-72.98,-48.98],[-73.03,-49.01],[-73.09,-49.1],[-73.15,-49.19],[-73.14,-49.3],[-73.46,-49.31],[-73.48,-49.4],[-73.55,-49.46],[-73.58,-49.58],[-73.5,-49.7],[-73.47,-49.79],[-73.53,-49.91],[-73.51,-50.03],[-73.5,-50.13],[-73.39,-50.23],[-73.31,-50.36],[-73.27,-50.47],[-73.25,-50.56],[-73.22,-50.61],[-73.17,-50.67],[-73.15,-50.74],[-73.08,-50.76],[-72.96,-50.7],[-72.87,-50.65],[-72.8,-50.64],[-72.62,-50.65],[-72.51,-50.61],[-72.46,-50.61],[-72.39,-50.63],[-72.34,-50.68],[-72.3,-50.79],[-72.28,-50.91],[-72.31,-51.03],[-72.36,-51.06],[-72.38,-51.1],[-72.36,-51.17],[-72.3,-51.22],[-72.3,-51.3],[-72.37,-51.47],[-72.41,-51.54],[-72.33,-51.62],[-72.27,-51.69],[-72.14,-51.74],[-72.03,-51.82],[-71.95,-51.88],[-71.97,-51.96],[-71.92,-51.99],[-71.72,-51.99],[-71.41,-51.99],[-70.94,-52.0],[-70.48,-52.0],[-69.96,-52.01],[-69.71,-52.08],[-69.49,-52.14],[-69.21,-52.14],[-68.92,-52.21],[-68.72,-52.26],[-68.59,-52.27],[-68.46,-52.29],[-68.44,-52.36],[-69.01,-52.26],[-69.13,-52.21],[-69.24,-52.21],[-69.45,-52.27],[-69.56,-52.42],[-69.62,-52.46],[-69.76,-52.51],[-69.91,-52.51],[-70.39,-52.66],[-70.56,-52.67],[-70.68,-52.71],[-70.8,-52.77],[-70.84,-52.89],[-70.82,-52.96],[-70.95,-53.23],[-70.98,-53.37],[-70.99,-53.45],[-70.95,-53.57],[-71.0,-53.78],[-71.08,-53.82],[-71.3,-53.88],[-71.44,-53.84],[-71.69,-53.8],[-71.87,-53.72],[-72.1,-53.67],[-72.17,-53.63],[-72.38,-53.47],[-72.4,-53.42],[-72.41,-53.35],[-72.31,-53.25],[-72.25,-53.25],[-72.08,-53.25],[-71.94,-53.23],[-71.85,-53.29],[-71.83,-53.4],[-71.87,-53.46],[-71.9,-53.5],[-71.89,-53.52],[-71.79,-53.48],[-71.74,-53.23],[-71.4,-53.11],[-71.29,-53.03],[-71.18,-52.92],[-71.16,-52.89],[-71.16,-52.85],[-71.23,-52.81],[-71.39,-52.76],[-71.9,-53.0],[-72.13,-53.06],[-72.28,-53.13],[-72.46,-53.25],[-72.49,-53.29],[-72.53,-53.37],[-72.55,-53.46],[-72.73,-53.42],[-73.0,-53.29],[-73.05,-53.24],[-73.0,-53.18],[-72.92,-53.12],[-72.91,-52.94],[-72.89,-52.87],[-72.83,-52.82],[-72.73,-52.76],[-72.68,-52.75],[-72.63,-52.77],[-72.63,-52.82],[-72.45,-52.81],[-72.12,-52.65],[-71.98,-52.65],[-71.8,-52.68],[-71.59,-52.66],[-71.55,-52.64],[-71.51,-52.61],[-71.66,-52.56],[-71.81,-52.54],[-72.23,-52.52],[-72.32,-52.54],[-72.44,-52.63],[-72.48,-52.6],[-72.5,-52.56],[-72.64,-52.53],[-72.71,-52.54],[-72.78,-52.58],[-72.77,-52.64],[-72.8,-52.71],[-72.93,-52.78],[-73.02,-52.89],[-73.02,-52.98],[-73.02,-53.02],[-73.06,-53.05],[-73.12,-53.07],[-73.34,-53.05],[-73.46,-52.96],[-73.51,-52.9],[-73.65,-52.84],[-73.35,-52.75],[-73.24,-52.71],[-73.14,-52.6],[-73.07,-52.54],[-73.12,-52.49],[-73.18,-52.49],[-73.18,-52.56],[-73.24,-52.62],[-73.38,-52.6],[-73.59,-52.69],[-73.71,-52.66],[-73.91,-52.69],[-74.01,-52.64],[-74.04,-52.58],[-74.0,-52.51],[-74.04,-52.4],[-74.09,-52.38],[-74.15,-52.38],[-74.18,-52.32],[-74.24,-52.2],[-74.27,-52.17],[-74.3,-52.12],[-74.26,-52.1],[-74.19,-52.12],[-74.13,-52.15],[-74.04,-52.16],[-73.83,-52.23],[-73.75,-52.22],[-73.7,-52.2],[-73.69,-52.14],[-73.68,-52.08],[-73.65,-52.08],[-73.53,-52.15],[-73.46,-52.15],[-73.33,-52.17],[-73.26,-52.16],[-73.14,-52.13],[-72.94,-52.05],[-72.84,-51.96],[-72.8,-51.95],[-72.74,-51.96],[-72.7,-51.99],[-72.69,-52.04],[-72.65,-52.1],[-72.59,-52.15],[-72.57,-52.2],[-72.58,-52.25],[-72.69,-52.33],[-72.71,-52.36],[-72.68,-52.38],[-72.63,-52.37],[-72.57,-52.33],[-72.53,-52.28],[-72.52,-52.26],[-72.52,-52.22],[-72.52,-52.17],[-72.61,-52.04],[-72.62,-52.01],[-72.62,-51.95],[-72.52,-51.89],[-72.49,-51.85],[-72.49,-51.76],[-72.54,-51.71],[-72.76,-51.57],[-73.13,-51.44],[-73.17,-51.45],[-73.2,-51.48],[-73.16,-51.5],[-73.11,-51.5],[-72.79,-51.61],[-72.7,-51.68],[-72.65,-51.7],[-72.58,-51.74],[-72.6,-51.8],[-72.93,-51.86],[-73.19,-51.99],[-73.38,-52.07],[-73.52,-52.04],[-73.58,-51.96],[-73.65,-51.86],[-73.75,-51.8],[-73.81,-51.8],[-73.86,-51.79],[-73.89,-51.76],[-73.97,-51.78],[-74.15,-51.71],[-74.2,-51.68],[-74.07,-51.58],[-73.93,-51.62],[-73.9,-51.33],[-73.94,-51.27],[-74.12,-51.2],[-74.21,-51.2],[-74.33,-51.2],[-74.41,-51.16],[-74.51,-51.15],[-74.59,-51.13],[-74.69,-51.09],[-74.81,-51.06],[-74.98,-50.88],[-75.06,-50.79],[-75.09,-50.68],[-74.84,-50.68],[-74.69,-50.66],[-74.65,-50.62],[-74.7,-50.54],[-74.78,-50.47],[-74.72,-50.41],[-74.64,-50.36],[-74.56,-50.38],[-74.37,-50.49],[-74.33,-50.56],[-74.19,-50.78],[-74.16,-50.8],[-74.14,-50.82],[-73.85,-50.94],[-73.81,-50.94],[-73.82,-50.84],[-73.74,-50.7],[-73.66,-50.65],[-73.62,-50.65],[-73.61,-50.63],[-73.69,-50.57],[-73.65,-50.49],[-73.68,-50.49],[-73.75,-50.54],[-73.89,-50.78],[-73.98,-50.83],[-74.1,-50.72],[-74.16,-50.64],[-74.2,-50.61],[-74.19,-50.49],[-73.95,-50.51],[-74.03,-50.47],[-74.31,-50.4],[-74.37,-50.36],[-74.43,-50.35],[-74.52,-50.27],[-74.63,-50.19],[-74.43,-50.07],[-74.33,-49.97],[-74.02,-50.02],[-73.96,-49.99],[-74.01,-49.93],[-74.07,-49.95],[-74.17,-49.91],[-74.32,-49.78],[-74.32,-49.72],[-74.29,-49.6],[-74.23,-49.58],[-74.1,-49.56],[-73.96,-49.59],[-73.89,-49.62],[-73.84,-49.61],[-73.89,-49.52],[-73.99,-49.49],[-74.09,-49.43],[-74.08,-49.36],[-74.05,-49.31],[-74.02,-49.24],[-74.01,-49.16],[-74.02,-49.09],[-73.98,-49.06],[-73.94,-49.05],[-73.93,-49.02],[-74.03,-49.03],[-74.06,-49.11],[-74.07,-49.19],[-74.14,-49.25],[-74.17,-49.32],[-74.18,-49.4],[-74.22,-49.5],[-74.3,-49.46],[-74.35,-49.43],[-74.37,-49.4],[-74.36,-49.35],[-74.38,-49.05],[-74.38,-48.79],[-74.34,-48.6],[-74.23,-48.52],[-74.18,-48.49],[-74.13,-48.5],[-74.06,-48.5],[-74.01,-48.48],[-74.17,-48.43],[-74.27,-48.45],[-74.34,-48.49],[-74.47,-48.46],[-74.5,-48.36],[-74.58,-48.27],[-74.59,-48.16],[-74.58,-48.0],[-74.4,-48.01],[-74.25,-48.04],[-73.85,-48.04],[-73.53,-48.2],[-73.38,-48.18],[-73.39,-48.15],[-73.5,-48.11],[-73.57,-48.02],[-73.61,-47.99],[-73.63,-47.94],[-73.64,-47.88],[-73.72,-47.66],[-73.75,-47.66],[-73.78,-47.74],[-73.85,-47.87],[-73.94,-47.93],[-74.08,-47.95],[-74.23,-47.97],[-74.35,-47.94],[-74.38,-47.89],[-74.38,-47.83],[-74.43,-47.8],[-74.57,-47.77],[-74.61,-47.76],[-74.65,-47.7],[-74.59,-47.62],[-74.53,-47.57],[-74.47,-47.58],[-74.4,-47.6],[-74.32,-47.67],[-74.24,-47.68],[-74.15,-47.63],[-74.13,-47.59],[-74.19,-47.57],[-74.24,-47.56],[-74.32,-47.53],[-74.48,-47.43],[-74.4,-47.33],[-74.22,-47.21],[-74.16,-47.18],[-74.21,-47.08],[-74.15,-46.97],[-74.21,-46.88],[-74.31,-46.79],[-74.45,-46.77],[-74.48,-46.8],[-74.49,-46.83],[-74.47,-46.86],[-74.48,-46.89],[-74.51,-46.89],[-74.69,-46.86],[-74.81,-46.8],[-75.01,-46.74],[-75.03,-46.7],[-75.05,-46.63],[-74.98,-46.51],[-75.02,-46.51],[-75.15,-46.6],[-75.34,-46.65],[-75.48,-46.66],[-75.54,-46.7],[-75.57,-46.73],[-75.53,-46.75],[-75.45,-46.75],[-75.39,-46.86],[-75.4,-46.91],[-75.43,-46.93],[-75.5,-46.94],[-75.64,-46.86],[-75.71,-46.78],[-75.71,-46.71],[-75.66,-46.61],[-75.44,-46.48],[-75.38,-46.43],[-75.25,-46.37],[-75.07,-46.23],[-74.92,-46.16],[-75.0,-46.1],[-75.07,-46.0],[-75.07,-45.87],[-74.76,-45.82],[-74.63,-45.84],[-74.46,-45.84],[-74.37,-45.81],[-74.3,-45.8],[-74.16,-45.77],[-74.1,-45.72],[-74.08,-45.68],[-74.08,-45.64],[-74.1,-45.6],[-74.12,-45.5],[-74.1,-45.46],[-74.04,-45.42],[-73.96,-45.4],[-73.92,-45.41],[-73.82,-45.45],[-73.84,-45.5],[-73.88,-45.57],[-73.96,-45.84],[-74.0,-45.9],[-74.06,-45.95],[-74.02,-46.06],[-74.08,-46.13],[-74.36,-46.21],[-74.39,-46.22],[-74.37,-46.25],[-74.21,-46.24],[-74.09,-46.22],[-73.97,-46.15],[-73.93,-46.05],[-73.88,-45.85],[-73.81,-45.82],[-73.74,-45.81],[-73.69,-45.86],[-73.71,-45.97],[-73.71,-46.07],[-73.81,-46.38],[-73.93,-46.5],[-73.95,-46.53],[-73.94,-46.57],[-73.85,-46.57],[-73.77,-46.5],[-73.72,-46.42],[-73.66,-46.3],[-73.67,-46.21],[-73.65,-46.16],[-73.63,-45.99],[-73.59,-45.9],[-73.59,-45.78],[-73.66,-45.73],[-73.76,-45.7],[-73.78,-45.63],[-73.73,-45.48],[-73.55,-45.48],[-73.38,-45.38],[-73.27,-45.35],[-73.2,-45.35],[-72.98,-45.45],[-72.93,-45.45],[-72.94,-45.42],[-72.98,-45.39],[-73.06,-45.36],[-73.23,-45.26],[-73.44,-45.24],[-73.4,-45.1],[-73.36,-44.98],[-73.26,-44.96],[-73.08,-44.92],[-72.74,-44.73],[-72.68,-44.59],[-72.66,-44.44],[-72.83,-44.4],[-73.0,-44.29],[-73.14,-44.24],[-73.27,-44.17],[-73.24,-44.07],[-73.22,-43.9],[-73.07,-43.86],[-73.0,-43.63],[-73.1,-43.46],[-73.08,-43.32],[-72.94,-43.21],[-72.92,-43.13],[-72.88,-43.05],[-72.76,-43.04],[-72.76,-42.99],[-72.77,-42.91],[-72.84,-42.81],[-72.85,-42.67],[-72.77,-42.51],[-72.65,-42.52],[-72.63,-42.51],[-72.72,-42.41],[-72.79,-42.3],[-72.77,-42.26],[-72.71,-42.22],[-72.63,-42.2],[-72.55,-42.26],[-72.43,-42.43],[-72.41,-42.39],[-72.46,-42.21],[-72.5,-41.98],[-72.62,-42.01],[-72.74,-41.99],[-72.78,-41.96],[-72.82,-41.91],[-72.78,-41.85],[-72.74,-41.8],[-72.66,-41.74],[-72.49,-41.72],[-72.36,-41.65],[-72.32,-41.5],[-72.36,-41.51],[-72.43,-41.65],[-72.54,-41.69],[-72.6,-41.68],[-72.67,-41.66],[-72.81,-41.54],[-72.88,-41.52],[-72.95,-41.51],[-73.01,-41.54],[-73.17,-41.75],[-73.24,-41.78],[-73.52,-41.8],[-73.62,-41.77],[-73.74,-41.74],[-73.72,-41.69],[-73.69,-41.64],[-73.63,-41.61],[-73.62,-41.58],[-73.71,-41.57],[-73.81,-41.52],[-73.86,-41.45],[-73.88,-41.32],[-73.97,-41.12],[-73.98,-40.97],[-73.92,-40.87],[-73.78,-40.47],[-73.74,-40.26],[-73.67,-40.08],[-73.67,-39.96],[-73.48,-39.85],[-73.41,-39.79],[-73.25,-39.42],[-73.23,-39.22],[-73.48,-38.62],[-73.52,-38.51],[-73.53,-38.37],[-73.47,-38.13],[-73.46,-38.04],[-73.52,-37.91],[-73.66,-37.7],[-73.66,-37.59],[-73.6,-37.48],[-73.66,-37.34],[-73.63,-37.26],[-73.6,-37.19],[-73.37,-37.22],[-73.27,-37.21],[-73.22,-37.17],[-73.17,-37.05],[-73.15,-36.88],[-73.14,-36.8],[-73.12,-36.69],[-73.01,-36.64],[-72.97,-36.54],[-72.87,-36.39],[-72.78,-35.98],[-72.68,-35.88],[-72.59,-35.76],[-72.62,-35.59],[-72.56,-35.51],[-72.51,-35.45],[-72.45,-35.34],[-72.39,-35.24],[-72.22,-35.1],[-72.18,-34.92],[-72.06,-34.62],[-72.03,-34.42],[-71.99,-34.29],[-72.0,-34.17],[-71.93,-34.02],[-71.85,-33.89],[-71.83,-33.82],[-71.66,-33.65],[-71.64,-33.52],[-71.7,-33.43],[-71.7,-33.29],[-71.74,-33.1],[-71.64,-33.02],[-71.59,-32.97],[-71.45,-32.66],[-71.46,-32.54],[-71.42,-32.39],[-71.51,-32.21],[-71.53,-31.81],[-71.58,-31.5],[-71.66,-31.17],[-71.65,-30.99],[-71.71,-30.76],[-71.71,-30.63],[-71.67,-30.33],[-71.4,-30.14],[-71.35,-29.93],[-71.32,-29.65],[-71.33,-29.44],[-71.35,-29.35],[-71.49,-29.2],[-71.52,-28.93],[-71.49,-28.86],[-71.38,-28.78],[-71.31,-28.67],[-71.27,-28.51],[-71.19,-28.38],[-71.15,-28.06],[-71.09,-27.81],[-71.05,-27.73],[-70.95,-27.62],[-70.93,-27.59],[-70.91,-27.51],[-70.91,-27.31],[-70.9,-27.19],[-70.81,-26.95],[-70.8,-26.84],[-70.71,-26.6],[-70.69,-26.42],[-70.65,-26.33],[-70.66,-26.23],[-70.64,-25.99],[-70.7,-25.86],[-70.71,-25.78],[-70.63,-25.55],[-70.58,-25.49],[-70.49,-25.38],[-70.45,-25.25],[-70.45,-25.17],[-70.56,-24.78],[-70.57,-24.64],[-70.55,-24.33],[-70.51,-24.13],[-70.52,-23.97],[-70.51,-23.89],[-70.49,-23.78],[-70.41,-23.66],[-70.39,-23.57],[-70.42,-23.53],[-70.51,-23.48],[-70.59,-23.37],[-70.59,-23.26],[-70.57,-23.17],[-70.56,-23.06],[-70.45,-23.03],[-70.39,-22.97],[-70.33,-22.85],[-70.26,-22.56],[-70.23,-22.19],[-70.19,-21.97],[-70.16,-21.87],[-70.13,-21.64],[-70.09,-21.49],[-70.08,-21.36],[-70.09,-21.25],[-70.2,-20.73],[-70.19,-20.53],[-70.15,-20.23],[-70.15,-19.81],[-70.16,-19.71],[-70.2,-19.61],[-70.21,-19.49],[-70.28,-19.27],[-70.33,-18.83],[-70.34,-18.6],[-70.36,-18.4],[-70.42,-18.35],[-70.38,-18.33],[-70.28,-18.33],[-70.18,-18.33],[-70.06,-18.28],[-69.93,-18.21],[-69.84,-18.09],[-69.8,-17.99],[-69.8,-17.9],[-69.84,-17.79],[-69.85,-17.7],[-69.81,-17.66],[-69.68,-17.65],[-69.59,-17.57],[-69.51,-17.51],[-69.5,-17.62],[-69.36,-17.77],[-69.31,-17.94],[-69.28,-17.96],[-69.09,-18.05],[-69.09,-18.07],[-69.12,-18.1],[-69.15,-18.14],[-69.13,-18.2],[-69.09,-18.28],[-69.08,-18.36],[-69.06,-18.43],[-69.04,-18.55],[-69.03,-18.66],[-68.98,-18.81],[-68.97,-18.91],[-68.97,-18.97],[-68.93,-19.03],[-68.86,-19.09],[-68.76,-19.16],[-68.68,-19.24],[-68.62,-19.3],[-68.55,-19.34],[-68.49,-19.38],[-68.47,-19.41],[-68.46,-19.43],[-68.49,-19.45],[-68.58,-19.56],[-68.7,-19.72],[-68.7,-19.74],[-68.58,-19.86],[-68.56,-19.9],[-68.56,-19.97],[-68.6,-20.04],[-68.73,-20.07],[-68.76,-20.09],[-68.76,-20.12],[-68.73,-20.15],[-68.73,-20.23],[-68.69,-20.31],[-68.71,-20.34],[-68.76,-20.38],[-68.76,-20.42],[-68.75,-20.46],[-68.7,-20.49],[-68.5,-20.61],[-68.48,-20.63],[-68.49,-20.64],[-68.56,-20.72],[-68.57,-20.77],[-68.57,-20.85],[-68.56,-20.9],[-68.53,-20.92],[-68.44,-20.95],[-68.31,-21.13],[-68.2,-21.3],[-68.2,-21.45],[-68.19,-21.62],[-68.11,-21.75],[-68.1,-21.86],[-68.08,-21.98],[-67.99,-22.06],[-67.95,-22.2],[-67.94,-22.28],[-67.95,-22.33],[-67.88,-22.49],[-67.87,-22.63],[-67.89,-22.73],[-67.89,-22.78],[-67.88,-22.82],[-67.82,-22.86],[-67.79,-22.88],[-67.71,-22.89],[-67.58,-22.89],[-67.36,-22.86],[-67.19,-22.82]],[[-67.58,-55.89],[-67.61,-55.89],[-67.7,-55.87],[-67.83,-55.86],[-67.85,-55.86],[-67.85,-55.84],[-67.83,-55.83],[-67.76,-55.82],[-67.54,-55.83],[-67.52,-55.83],[-67.51,-55.84],[-67.55,-55.88],[-67.58,-55.89]],[[-67.29,-55.78],[-67.33,-55.78],[-67.35,-55.77],[-67.39,-55.75],[-67.56,-55.72],[-67.56,-55.71],[-67.55,-55.68],[-67.51,-55.66],[-67.45,-55.64],[-67.4,-55.59],[-67.37,-55.59],[-67.35,-55.61],[-67.31,-55.69],[-67.26,-55.74],[-67.27,-55.76],[-67.29,-55.78]],[[-66.47,-55.23],[-66.55,-55.27],[-66.61,-55.27],[-66.63,-55.25],[-66.64,-55.23],[-66.62,-55.21],[-66.6,-55.19],[-66.54,-55.17],[-66.52,-55.17],[-66.44,-55.19],[-66.47,-55.23]],[[-67.08,-55.15],[-67.11,-55.19],[-67.17,-55.24],[-67.26,-55.28],[-67.34,-55.29],[-67.4,-55.27],[-67.43,-55.24],[-67.44,-55.2],[-67.46,-55.18],[-67.49,-55.18],[-67.54,-55.18],[-67.59,-55.19],[-67.69,-55.24],[-67.74,-55.26],[-67.77,-55.26],[-68.07,-55.22],[-68.1,-55.21],[-68.14,-55.17],[-68.17,-55.07],[-68.3,-54.98],[-68.11,-54.93],[-67.87,-54.93],[-67.42,-54.97],[-67.25,-54.98],[-67.11,-55.06],[-67.09,-55.12],[-67.08,-55.15]],[[-69.7,-54.92],[-68.9,-55.02],[-68.65,-54.96],[-68.46,-54.96],[-68.4,-55.04],[-68.6,-55.13],[-68.61,-55.16],[-68.59,-55.18],[-68.38,-55.19],[-68.33,-55.22],[-68.28,-55.26],[-68.32,-55.31],[-68.33,-55.33],[-68.31,-55.36],[-68.15,-55.44],[-68.09,-55.48],[-68.06,-55.52],[-68.05,-55.59],[-68.05,-55.64],[-68.08,-55.65],[-68.16,-55.63],[-68.23,-55.6],[-68.29,-55.52],[-68.34,-55.51],[-68.47,-55.49],[-68.59,-55.45],[-68.69,-55.45],[-68.79,-55.44],[-68.87,-55.45],[-68.9,-55.42],[-68.93,-55.37],[-68.93,-55.35],[-68.89,-55.26],[-68.89,-55.24],[-68.91,-55.24],[-69.01,-55.26],[-69.05,-55.24],[-69.15,-55.18],[-69.19,-55.17],[-69.3,-55.17],[-69.36,-55.27],[-69.36,-55.3],[-69.3,-55.37],[-69.18,-55.47],[-69.24,-55.48],[-69.41,-55.44],[-69.46,-55.42],[-69.51,-55.37],[-69.61,-55.34],[-69.65,-55.32],[-69.66,-55.3],[-69.66,-55.23],[-69.68,-55.22],[-69.82,-55.24],[-69.85,-55.22],[-69.87,-55.19],[-69.89,-55.17],[-69.98,-55.15],[-69.99,-55.13],[-69.95,-55.11],[-69.92,-55.06],[-69.88,-54.88],[-69.7,-54.92]],[[-70.99,-54.87],[-70.95,-54.93],[-70.93,-54.94],[-70.8,-54.97],[-70.75,-54.95],[-70.62,-54.95],[-70.53,-54.92],[-70.42,-54.91],[-70.28,-55.07],[-70.3,-55.11],[-70.4,-55.17],[-70.48,-55.18],[-70.54,-55.16],[-70.54,-55.13],[-70.55,-55.11],[-70.6,-55.08],[-70.64,-55.08],[-70.71,-55.11],[-70.74,-55.1],[-70.82,-55.08],[-70.94,-55.06],[-70.96,-55.04],[-70.97,-55.01],[-70.99,-54.99],[-71.12,-54.94],[-71.2,-54.89],[-71.27,-54.89],[-71.3,-54.89],[-71.33,-54.91],[-71.39,-54.93],[-71.41,-54.93],[-71.43,-54.91],[-71.44,-54.89],[-71.41,-54.84],[-71.37,-54.83],[-71.2,-54.84],[-71.09,-54.87],[-70.99,-54.87]],[[-71.39,-54.03],[-71.17,-54.11],[-71.02,-54.11],[-71.02,-54.16],[-71.0,-54.25],[-71.03,-54.28],[-71.08,-54.32],[-71.12,-54.37],[-71.14,-54.37],[-71.3,-54.31],[-71.47,-54.23],[-71.56,-54.25],[-71.67,-54.23],[-71.76,-54.23],[-71.82,-54.28],[-71.95,-54.3],[-71.97,-54.21],[-72.09,-54.12],[-72.21,-54.05],[-72.15,-53.94],[-72.07,-53.92],[-72.0,-53.88],[-71.71,-53.92],[-71.55,-53.96],[-71.39,-54.03]],[[-72.92,-53.48],[-72.9,-53.56],[-72.88,-53.58],[-72.81,-53.57],[-72.69,-53.56],[-72.48,-53.59],[-72.46,-53.6],[-72.37,-53.69],[-72.31,-53.73],[-72.21,-53.81],[-72.31,-53.86],[-72.37,-53.94],[-72.37,-53.98],[-72.41,-54.0],[-72.47,-54.03],[-72.56,-54.07],[-72.68,-54.08],[-72.79,-54.1],[-72.84,-54.13],[-72.87,-54.13],[-72.91,-54.11],[-72.95,-54.09],[-72.96,-54.07],[-72.88,-54.04],[-72.78,-53.95],[-72.76,-53.86],[-72.87,-53.85],[-72.94,-53.86],[-72.98,-53.86],[-73.04,-53.83],[-73.07,-53.88],[-73.09,-53.92],[-73.07,-53.98],[-73.08,-54.0],[-73.12,-54.01],[-73.21,-53.99],[-73.3,-53.94],[-73.31,-53.92],[-73.29,-53.84],[-73.29,-53.79],[-73.31,-53.73],[-73.32,-53.72],[-73.36,-53.72],[-73.47,-53.74],[-73.58,-53.66],[-73.64,-53.57],[-73.85,-53.55],[-73.69,-53.43],[-73.45,-53.41],[-73.37,-53.47],[-73.1,-53.51],[-73.12,-53.45],[-73.11,-53.43],[-73.07,-53.4],[-73.05,-53.39],[-73.02,-53.41],[-72.97,-53.42],[-72.95,-53.44],[-72.92,-53.48]],[[-74.39,-52.92],[-74.37,-52.93],[-74.33,-52.93],[-74.27,-52.95],[-74.07,-52.97],[-73.88,-53.01],[-73.78,-53.06],[-73.65,-53.07],[-73.55,-53.13],[-73.5,-53.14],[-73.45,-53.14],[-73.31,-53.25],[-73.3,-53.26],[-73.14,-53.34],[-73.14,-53.35],[-73.23,-53.36],[-73.41,-53.32],[-73.5,-53.32],[-73.57,-53.31],[-73.58,-53.3],[-73.6,-53.25],[-73.62,-53.23],[-73.79,-53.12],[-73.87,-53.1],[-73.99,-53.08],[-74.14,-53.09],[-74.24,-53.08],[-74.27,-53.08],[-74.41,-52.99],[-74.56,-52.92],[-74.62,-52.83],[-74.71,-52.77],[-74.71,-52.75],[-74.67,-52.73],[-74.57,-52.77],[-74.47,-52.84],[-74.42,-52.86],[-74.39,-52.92]],[[-74.14,-51.93],[-74.17,-51.94],[-74.28,-51.92],[-74.34,-51.9],[-74.42,-51.85],[-74.44,-51.79],[-74.48,-51.73],[-74.45,-51.72],[-74.36,-51.75],[-74.33,-51.77],[-74.28,-51.81],[-74.13,-51.87],[-74.12,-51.89],[-74.12,-51.91],[-74.14,-51.93]],[[-74.82,-51.63],[-74.78,-51.82],[-74.75,-51.85],[-74.65,-51.87],[-74.54,-51.97],[-74.53,-51.99],[-74.67,-52.16],[-74.69,-52.28],[-74.85,-52.27],[-74.92,-52.15],[-75.02,-52.04],[-75.05,-51.9],[-75.11,-51.79],[-75.01,-51.72],[-74.92,-51.74],[-74.91,-51.65],[-74.82,-51.63]],[[-74.56,-51.28],[-74.56,-51.36],[-74.59,-51.39],[-74.62,-51.4],[-74.69,-51.37],[-74.73,-51.37],[-74.8,-51.41],[-74.85,-51.43],[-74.94,-51.43],[-75.05,-51.4],[-75.15,-51.52],[-75.19,-51.57],[-75.29,-51.63],[-75.3,-51.56],[-75.24,-51.45],[-75.21,-51.38],[-75.15,-51.28],[-75.04,-51.32],[-74.88,-51.28],[-74.74,-51.21],[-74.61,-51.21],[-74.57,-51.25],[-74.56,-51.28]],[[-75.3,-50.68],[-75.33,-50.77],[-75.41,-50.76],[-75.44,-50.74],[-75.45,-50.68],[-75.48,-50.65],[-75.44,-50.6],[-75.42,-50.53],[-75.43,-50.48],[-75.3,-50.48],[-75.16,-50.5],[-75.12,-50.51],[-75.16,-50.55],[-75.2,-50.58],[-75.29,-50.6],[-75.3,-50.68]],[[-75.05,-50.3],[-75.25,-50.38],[-75.31,-50.34],[-75.45,-50.34],[-75.41,-50.26],[-75.4,-50.19],[-75.38,-50.17],[-75.37,-50.11],[-75.33,-50.01],[-75.21,-50.05],[-75.12,-50.06],[-75.0,-50.09],[-74.88,-50.11],[-74.84,-50.2],[-74.96,-50.24],[-75.05,-50.3]],[[-75.11,-48.84],[-75.12,-48.92],[-75.26,-49.07],[-75.39,-49.16],[-75.51,-49.23],[-75.58,-49.23],[-75.64,-49.2],[-75.57,-49.14],[-75.49,-49.08],[-75.51,-49.01],[-75.54,-48.99],[-75.58,-48.98],[-75.64,-48.94],[-75.62,-48.89],[-75.58,-48.86],[-75.54,-48.84],[-75.49,-48.85],[-75.3,-48.81],[-75.24,-48.78],[-75.12,-48.77],[-75.11,-48.84]],[[-74.48,-49.15],[-74.47,-49.29],[-74.48,-49.44],[-74.52,-49.62],[-74.52,-49.66],[-74.47,-49.67],[-74.46,-49.69],[-74.47,-49.79],[-74.5,-49.86],[-74.54,-49.92],[-74.57,-49.99],[-74.59,-50.01],[-74.7,-50.02],[-74.76,-50.01],[-74.81,-49.93],[-74.82,-49.88],[-74.82,-49.81],[-74.88,-49.73],[-74.88,-49.69],[-74.86,-49.63],[-74.81,-49.61],[-74.8,-49.52],[-74.78,-49.49],[-74.73,-49.45],[-74.72,-49.44],[-74.72,-49.42],[-74.74,-49.42],[-74.96,-49.53],[-74.98,-49.56],[-74.99,-49.61],[-74.99,-49.75],[-75.03,-49.84],[-75.07,-49.85],[-75.17,-49.86],[-75.3,-49.85],[-75.45,-49.77],[-75.55,-49.79],[-75.57,-49.7],[-75.52,-49.62],[-75.34,-49.63],[-75.31,-49.49],[-75.36,-49.46],[-75.43,-49.41],[-75.47,-49.36],[-75.43,-49.32],[-75.33,-49.27],[-75.27,-49.26],[-75.22,-49.29],[-75.09,-49.27],[-75.09,-49.19],[-75.21,-49.15],[-75.18,-49.08],[-75.04,-49.02],[-74.95,-48.96],[-74.95,-48.89],[-74.98,-48.82],[-74.97,-48.79],[-74.9,-48.73],[-74.79,-48.71],[-74.75,-48.71],[-74.65,-48.75],[-74.57,-48.75],[-74.55,-48.77],[-74.53,-48.81],[-74.48,-49.15]],[[-75.51,-48.76],[-75.62,-48.76],[-75.65,-48.59],[-75.52,-48.33],[-75.51,-48.23],[-75.55,-48.16],[-75.57,-48.1],[-75.56,-48.07],[-75.39,-48.02],[-75.34,-48.07],[-75.28,-48.22],[-75.16,-48.43],[-75.16,-48.62],[-75.23,-48.67],[-75.43,-48.72],[-75.51,-48.76]],[[-74.57,-48.59],[-74.59,-48.62],[-74.71,-48.6],[-74.92,-48.63],[-75.01,-48.54],[-75.05,-48.39],[-75.08,-48.36],[-75.13,-48.28],[-75.16,-48.23],[-75.21,-48.14],[-75.23,-48.05],[-75.25,-48.03],[-75.2,-47.97],[-74.98,-47.92],[-74.9,-47.84],[-74.83,-47.85],[-74.85,-48.02],[-74.81,-48.08],[-74.73,-48.13],[-74.72,-48.15],[-74.7,-48.21],[-74.66,-48.3],[-74.62,-48.34],[-74.6,-48.37],[-74.6,-48.39],[-74.62,-48.43],[-74.57,-48.59]],[[-75.11,-47.84],[-75.19,-47.85],[-75.19,-47.82],[-75.26,-47.76],[-75.2,-47.73],[-75.09,-47.69],[-75.0,-47.69],[-74.93,-47.72],[-74.92,-47.76],[-75.05,-47.8],[-75.08,-47.82],[-75.11,-47.84]],[[-74.31,-45.69],[-74.37,-45.74],[-74.47,-45.76],[-74.56,-45.72],[-74.68,-45.74],[-74.69,-45.66],[-74.65,-45.6],[-74.56,-45.53],[-74.49,-45.43],[-74.5,-45.29],[-74.45,-45.25],[-74.42,-45.2],[-74.31,-45.17],[-74.29,-45.28],[-74.32,-45.46],[-74.24,-45.57],[-74.23,-45.61],[-74.24,-45.65],[-74.31,-45.69]],[[-75.04,-44.89],[-75.07,-44.91],[-75.1,-44.9],[-75.12,-44.87],[-75.14,-44.82],[-75.11,-44.8],[-75.08,-44.8],[-75.05,-44.82],[-75.03,-44.87],[-75.04,-44.89]],[[-73.63,-44.82],[-73.66,-44.83],[-73.69,-44.83],[-73.72,-44.8],[-73.73,-44.75],[-73.8,-44.68],[-73.82,-44.65],[-73.82,-44.61],[-73.78,-44.56],[-73.72,-44.54],[-73.69,-44.55],[-73.64,-44.61],[-73.63,-44.68],[-73.62,-44.75],[-73.63,-44.82]],[[-72.99,-44.78],[-73.23,-44.86],[-73.35,-44.83],[-73.4,-44.77],[-73.42,-44.72],[-73.45,-44.64],[-73.4,-44.6],[-73.31,-44.53],[-73.28,-44.49],[-73.27,-44.44],[-73.27,-44.39],[-73.26,-44.35],[-73.21,-44.33],[-73.03,-44.38],[-72.84,-44.46],[-72.78,-44.51],[-72.76,-44.55],[-72.85,-44.64],[-72.9,-44.71],[-72.99,-44.78]],[[-73.74,-44.39],[-73.78,-44.44],[-73.86,-44.45],[-73.98,-44.49],[-74.0,-44.54],[-74.0,-44.59],[-73.92,-44.65],[-73.88,-44.73],[-73.83,-44.84],[-73.79,-44.95],[-73.8,-44.98],[-73.79,-45.03],[-73.73,-45.12],[-73.72,-45.16],[-73.73,-45.2],[-73.75,-45.27],[-73.77,-45.28],[-73.83,-45.28],[-73.83,-45.33],[-73.85,-45.34],[-74.02,-45.34],[-74.1,-45.33],[-74.09,-45.2],[-74.2,-45.14],[-74.27,-45.06],[-74.35,-44.91],[-74.42,-44.87],[-74.5,-44.75],[-74.62,-44.65],[-74.48,-44.58],[-74.5,-44.47],[-74.42,-44.44],[-74.3,-44.4],[-74.21,-44.43],[-74.13,-44.42],[-74.1,-44.39],[-74.11,-44.28],[-74.08,-44.19],[-73.99,-44.14],[-73.9,-44.13],[-73.86,-44.19],[-73.82,-44.23],[-73.7,-44.27],[-73.7,-44.33],[-73.74,-44.39]],[[-73.81,-43.83],[-73.79,-43.88],[-73.83,-43.88],[-73.9,-43.88],[-73.94,-43.91],[-73.96,-43.92],[-74.12,-43.89],[-74.14,-43.87],[-74.14,-43.82],[-73.97,-43.82],[-73.86,-43.78],[-73.84,-43.79],[-73.81,-43.83]],[[-74.67,-43.61],[-74.81,-43.63],[-74.84,-43.6],[-74.84,-43.57],[-74.82,-43.55],[-74.75,-43.54],[-74.7,-43.55],[-74.67,-43.58],[-74.66,-43.6],[-74.67,-43.61]],[[-73.77,-43.35],[-73.85,-43.37],[-73.92,-43.37],[-73.99,-43.36],[-74.11,-43.36],[-74.24,-43.32],[-74.35,-43.26],[-74.39,-43.23],[-74.37,-43.19],[-74.29,-43.08],[-74.21,-42.88],[-74.16,-42.59],[-74.2,-42.48],[-74.19,-42.44],[-74.17,-42.38],[-74.16,-42.33],[-74.17,-42.27],[-74.16,-42.22],[-74.07,-42.11],[-74.06,-42.06],[-74.06,-42.0],[-74.02,-41.89],[-74.03,-41.85],[-74.06,-41.82],[-74.04,-41.8],[-73.73,-41.88],[-73.53,-41.9],[-73.52,-41.98],[-73.48,-42.05],[-73.45,-42.17],[-73.42,-42.19],[-73.44,-42.28],[-73.53,-42.31],[-73.52,-42.39],[-73.47,-42.47],[-73.55,-42.49],[-73.63,-42.51],[-73.65,-42.53],[-73.71,-42.54],[-73.79,-42.59],[-73.77,-42.62],[-73.67,-42.7],[-73.57,-42.76],[-73.51,-42.85],[-73.44,-42.94],[-73.47,-42.99],[-73.54,-43.07],[-73.65,-43.13],[-73.75,-43.16],[-73.74,-43.29],[-73.77,-43.35]],[[-78.8,-33.65],[-78.98,-33.67],[-78.99,-33.66],[-78.98,-33.64],[-78.94,-33.61],[-78.89,-33.58],[-78.88,-33.58],[-78.86,-33.58],[-78.84,-33.59],[-78.78,-33.61],[-78.77,-33.63],[-78.77,-33.64],[-78.8,-33.65]],[[-109.28,-27.14],[-109.43,-27.17],[-109.43,-27.12],[-109.39,-27.07],[-109.28,-27.1],[-109.22,-27.1],[-109.28,-27.14]]]},{"n":"China","r":[[[74.54,37.02],[74.53,37.03],[74.5,37.06],[74.38,37.14],[74.37,37.16],[74.56,37.24],[74.67,37.27],[74.73,37.29],[74.74,37.29],[74.77,37.25],[74.84,37.23],[74.89,37.23],[74.92,37.25],[75.01,37.29],[75.08,37.34],[75.12,37.39],[75.1,37.45],[74.99,37.53],[74.92,37.57],[74.89,37.6],[74.91,37.69],[74.94,37.77],[74.92,37.8],[74.9,37.83],[74.89,37.93],[74.84,38.04],[74.79,38.1],[74.78,38.19],[74.77,38.27],[74.84,38.4],[74.81,38.46],[74.75,38.51],[74.51,38.6],[74.28,38.66],[74.19,38.66],[74.13,38.66],[74.07,38.61],[74.03,38.54],[73.97,38.53],[73.87,38.56],[73.8,38.61],[73.75,38.7],[73.72,38.82],[73.7,38.85],[73.71,38.89],[73.73,38.91],[73.79,38.94],[73.81,38.97],[73.8,39.0],[73.74,39.04],[73.69,39.1],[73.61,39.23],[73.62,39.3],[73.64,39.4],[73.63,39.45],[73.72,39.46],[73.82,39.49],[73.87,39.53],[73.91,39.58],[73.91,39.61],[73.88,39.71],[73.84,39.76],[73.84,39.8],[73.86,39.83],[73.88,39.88],[73.94,39.98],[73.99,40.04],[74.02,40.06],[74.09,40.07],[74.24,40.09],[74.41,40.14],[74.61,40.27],[74.68,40.31],[74.77,40.33],[74.83,40.33],[74.84,40.34],[74.8,40.43],[74.81,40.46],[74.84,40.48],[74.87,40.49],[75.0,40.45],[75.11,40.45],[75.24,40.48],[75.52,40.63],[75.56,40.63],[75.58,40.61],[75.62,40.52],[75.66,40.33],[75.68,40.31],[75.87,40.3],[76.0,40.37],[76.06,40.39],[76.16,40.38],[76.21,40.41],[76.26,40.43],[76.32,40.35],[76.4,40.39],[76.48,40.45],[76.52,40.51],[76.58,40.58],[76.62,40.66],[76.64,40.74],[76.66,40.78],[76.71,40.82],[76.82,40.98],[76.91,41.02],[76.99,41.04],[77.18,41.01],[77.28,41.01],[77.58,40.99],[77.72,41.02],[77.82,41.06],[77.96,41.05],[78.12,41.08],[78.35,41.28],[78.35,41.33],[78.36,41.37],[78.44,41.42],[78.54,41.46],[78.74,41.56],[79.15,41.72],[79.29,41.78],[79.35,41.78],[79.5,41.82],[79.77,41.9],[79.84,42.0],[79.91,42.01],[80.22,42.03],[80.24,42.04],[80.25,42.06],[80.23,42.13],[80.21,42.19],[80.23,42.21],[80.26,42.24],[80.26,42.27],[80.21,42.4],[80.18,42.52],[80.16,42.63],[80.17,42.67],[80.2,42.73],[80.25,42.8],[80.42,42.86],[80.54,42.87],[80.54,42.91],[80.45,42.94],[80.38,42.97],[80.37,43.0],[80.37,43.02],[80.39,43.04],[80.51,43.09],[80.62,43.13],[80.75,43.1],[80.78,43.12],[80.79,43.16],[80.76,43.2],[80.73,43.27],[80.67,43.31],[80.67,43.35],[80.7,43.43],[80.65,43.56],[80.59,43.69],[80.5,43.89],[80.43,43.95],[80.4,44.05],[80.36,44.1],[80.36,44.17],[80.37,44.22],[80.35,44.33],[80.34,44.44],[80.36,44.55],[80.39,44.63],[80.38,44.66],[80.4,44.68],[80.46,44.68],[80.48,44.71],[80.46,44.75],[80.36,44.77],[80.26,44.81],[80.13,44.8],[80.0,44.8],[79.93,44.83],[79.88,44.86],[79.87,44.88],[79.95,44.94],[80.06,45.01],[80.23,45.03],[80.41,45.08],[80.51,45.1],[80.63,45.13],[80.78,45.14],[80.85,45.13],[81.04,45.17],[81.33,45.25],[81.6,45.31],[81.69,45.35],[81.76,45.31],[81.79,45.23],[81.87,45.18],[81.94,45.16],[81.99,45.16],[82.12,45.19],[82.27,45.22],[82.32,45.21],[82.4,45.16],[82.48,45.12],[82.52,45.13],[82.56,45.16],[82.6,45.22],[82.62,45.29],[82.63,45.37],[82.61,45.42],[82.58,45.44],[82.45,45.47],[82.33,45.52],[82.31,45.56],[82.32,45.59],[82.35,45.67],[82.43,45.81],[82.51,46.01],[82.56,46.16],[82.69,46.39],[82.8,46.62],[82.97,46.97],[83.0,47.03],[83.02,47.14],[83.03,47.19],[83.09,47.21],[83.19,47.19],[83.44,47.11],[83.63,47.04],[83.71,47.02],[83.83,47.0],[84.02,46.97],[84.12,46.98],[84.22,46.99],[84.34,47.0],[84.53,46.98],[84.59,46.97],[84.67,46.97],[84.72,46.94],[84.75,46.86],[84.79,46.83],[84.86,46.84],[85.01,46.91],[85.11,46.96],[85.23,47.04],[85.36,47.05],[85.48,47.06],[85.53,47.1],[85.58,47.19],[85.66,47.25],[85.67,47.34],[85.64,47.4],[85.59,47.49],[85.59,47.56],[85.56,47.75],[85.53,47.92],[85.56,48.05],[85.63,48.2],[85.65,48.25],[85.69,48.31],[85.75,48.39],[85.83,48.41],[86.06,48.42],[86.27,48.45],[86.37,48.49],[86.48,48.51],[86.55,48.53],[86.66,48.64],[86.72,48.7],[86.76,48.86],[86.73,48.94],[86.75,49.01],[86.81,49.05],[86.89,49.09],[86.94,49.1],[87.05,49.11],[87.23,49.11],[87.32,49.09],[87.42,49.08],[87.48,49.09],[87.52,49.12],[87.58,49.13],[87.67,49.15],[87.76,49.17],[87.81,49.16],[87.83,49.12],[87.82,49.08],[87.83,49.03],[87.87,49.0],[87.86,48.97],[87.81,48.95],[87.75,48.92],[87.74,48.88],[87.81,48.84],[87.83,48.79],[87.94,48.77],[88.03,48.74],[88.06,48.71],[88.05,48.68],[88.01,48.64],[87.97,48.6],[87.97,48.58],[87.98,48.56],[88.06,48.54],[88.16,48.51],[88.31,48.47],[88.41,48.4],[88.52,48.38],[88.57,48.32],[88.58,48.22],[88.68,48.17],[88.84,48.1],[88.92,48.09],[88.97,48.05],[89.05,48.0],[89.12,47.99],[89.2,47.98],[89.33,48.02],[89.48,48.03],[89.56,48.0],[89.64,47.91],[89.69,47.88],[89.73,47.85],[89.78,47.83],[89.83,47.82],[89.91,47.84],[89.96,47.89],[90.03,47.88],[90.05,47.85],[90.07,47.8],[90.1,47.75],[90.19,47.7],[90.31,47.68],[90.33,47.66],[90.35,47.6],[90.38,47.56],[90.43,47.5],[90.47,47.41],[90.48,47.33],[90.5,47.29],[90.55,47.21],[90.64,47.1],[90.72,47.0],[90.8,46.99],[90.87,46.95],[90.91,46.88],[90.99,46.75],[91.0,46.66],[91.0,46.6],[91.03,46.57],[91.03,46.53],[90.97,46.39],[90.92,46.32],[90.91,46.27],[90.95,46.18],[91.0,46.1],[91.0,46.04],[90.96,45.99],[90.89,45.92],[90.85,45.89],[90.8,45.85],[90.71,45.73],[90.67,45.6],[90.66,45.53],[90.69,45.47],[90.75,45.42],[90.76,45.37],[90.85,45.26],[90.88,45.2],[90.91,45.19],[90.95,45.22],[91.05,45.22],[91.14,45.19],[91.22,45.14],[91.31,45.12],[91.44,45.12],[91.51,45.1],[91.58,45.08],[91.74,45.07],[91.85,45.07],[92.03,45.07],[92.17,45.04],[92.42,45.01],[92.58,45.01],[92.79,45.04],[92.92,45.02],[93.29,44.98],[93.52,44.94],[93.66,44.9],[93.76,44.83],[93.87,44.72],[93.96,44.67],[94.2,44.65],[94.36,44.52],[94.49,44.47],[94.71,44.35],[94.87,44.3],[95.05,44.26],[95.35,44.28],[95.37,44.26],[95.34,44.2],[95.33,44.1],[95.33,44.04],[95.36,44.01],[95.47,43.99],[95.53,43.95],[95.57,43.89],[95.59,43.85],[95.69,43.66],[95.84,43.38],[95.86,43.28],[95.91,43.21],[96.08,43.1],[96.17,43.01],[96.3,42.93],[96.34,42.85],[96.35,42.75],[96.39,42.72],[96.63,42.74],[96.83,42.76],[97.21,42.79],[97.72,42.74],[98.25,42.68],[98.72,42.64],[98.95,42.62],[99.47,42.57],[99.76,42.63],[99.98,42.68],[100.09,42.67],[100.52,42.62],[100.77,42.59],[101.09,42.55],[101.31,42.54],[101.5,42.54],[101.58,42.52],[101.66,42.5],[101.71,42.47],[101.88,42.29],[101.97,42.22],[102.16,42.16],[102.58,42.09],[102.81,42.05],[103.07,42.01],[103.25,41.94],[103.45,41.86],[103.71,41.75],[104.0,41.8],[104.31,41.85],[104.5,41.88],[104.5,41.66],[104.77,41.64],[104.86,41.64],[104.98,41.6],[105.05,41.62],[105.12,41.66],[105.2,41.74],[105.31,41.77],[105.52,41.85],[105.57,41.88],[105.87,41.99],[106.32,42.14],[106.52,42.21],[106.58,42.23],[106.69,42.26],[106.77,42.29],[106.91,42.31],[107.09,42.32],[107.29,42.35],[107.75,42.4],[107.81,42.41],[108.06,42.43],[108.17,42.45],[108.33,42.44],[108.55,42.43],[108.69,42.42],[108.87,42.43],[109.13,42.44],[109.34,42.44],[109.44,42.46],[109.6,42.51],[109.7,42.55],[109.86,42.61],[110.06,42.66],[110.2,42.71],[110.29,42.74],[110.4,42.77],[110.43,42.81],[110.46,42.84],[110.52,42.9],[110.63,42.99],[110.71,43.07],[110.75,43.11],[110.84,43.19],[110.91,43.26],[111.01,43.34],[111.09,43.37],[111.19,43.39],[111.45,43.47],[111.5,43.49],[111.55,43.5],[111.64,43.56],[111.72,43.62],[111.77,43.66],[111.88,43.68],[111.93,43.71],[111.94,43.75],[111.93,43.81],[111.88,43.88],[111.84,43.93],[111.68,44.04],[111.6,44.11],[111.52,44.19],[111.49,44.27],[111.43,44.32],[111.4,44.37],[111.41,44.42],[111.49,44.51],[111.51,44.57],[111.55,44.67],[111.62,44.83],[111.68,44.9],[111.75,44.97],[111.9,45.06],[112.03,45.08],[112.11,45.06],[112.29,45.06],[112.41,45.06],[112.5,45.01],[112.6,44.92],[112.71,44.88],[113.05,44.81],[113.2,44.79],[113.3,44.79],[113.46,44.77],[113.51,44.76],[113.59,44.75],[113.65,44.76],[113.75,44.83],[113.88,44.9],[113.93,44.91],[114.03,44.94],[114.08,44.97],[114.17,45.05],[114.28,45.11],[114.42,45.2],[114.49,45.27],[114.5,45.32],[114.52,45.36],[114.56,45.39],[114.64,45.41],[114.74,45.42],[114.92,45.38],[115.16,45.39],[115.22,45.4],[115.44,45.42],[115.54,45.44],[115.68,45.46],[115.79,45.53],[115.93,45.63],[116.04,45.68],[116.11,45.69],[116.2,45.74],[116.24,45.8],[116.23,45.85],[116.21,45.89],[116.26,45.96],[116.36,46.1],[116.44,46.16],[116.52,46.21],[116.56,46.29],[116.62,46.31],[116.69,46.32],[116.79,46.38],[116.86,46.39],[116.98,46.36],[117.16,46.36],[117.27,46.35],[117.33,46.36],[117.36,46.39],[117.36,46.44],[117.39,46.54],[117.41,46.57],[117.44,46.59],[117.55,46.59],[117.62,46.55],[117.67,46.52],[117.74,46.52],[117.81,46.54],[117.91,46.62],[118.07,46.67],[118.16,46.68],[118.31,46.72],[118.4,46.7],[118.58,46.69],[118.65,46.7],[118.72,46.69],[118.79,46.75],[118.84,46.76],[118.96,46.73],[119.03,46.69],[119.16,46.64],[119.33,46.61],[119.47,46.63],[119.62,46.6],[119.71,46.61],[119.75,46.63],[119.87,46.67],[119.9,46.73],[119.88,46.79],[119.9,46.86],[119.86,46.91],[119.79,46.98],[119.76,47.03],[119.76,47.09],[119.71,47.15],[119.6,47.22],[119.53,47.26],[119.38,47.38],[119.33,47.41],[119.31,47.43],[119.29,47.47],[119.24,47.49],[119.16,47.53],[119.12,47.56],[119.1,47.62],[119.08,47.65],[119.02,47.69],[118.95,47.7],[118.88,47.73],[118.76,47.76],[118.69,47.82],[118.57,47.94],[118.5,47.98],[118.24,48.0],[118.15,48.03],[118.04,48.02],[117.98,48.0],[117.84,48.0],[117.77,47.99],[117.68,47.91],[117.56,47.8],[117.46,47.74],[117.38,47.68],[117.35,47.65],[117.29,47.67],[117.2,47.74],[117.07,47.81],[116.95,47.84],[116.9,47.85],[116.76,47.87],[116.65,47.86],[116.51,47.84],[116.38,47.84],[116.32,47.86],[116.23,47.86],[116.07,47.79],[115.99,47.71],[115.9,47.69],[115.81,47.74],[115.71,47.8],[115.62,47.87],[115.56,47.95],[115.53,48.13],[115.64,48.19],[115.79,48.25],[115.8,48.35],[115.79,48.46],[115.82,48.58],[115.95,48.69],[116.03,48.78],[116.03,48.84],[116.1,48.94],[116.16,49.04],[116.24,49.17],[116.4,49.41],[116.59,49.68],[116.68,49.82],[116.89,49.74],[117.02,49.69],[117.25,49.62],[117.48,49.61],[117.7,49.54],[117.81,49.51],[117.87,49.51],[118.19,49.69],[118.45,49.84],[118.76,49.96],[118.98,49.98],[119.15,50.01],[119.26,50.07],[119.33,50.15],[119.35,50.28],[119.3,50.35],[119.19,50.38],[119.16,50.41],[119.22,50.43],[119.26,50.48],[119.28,50.56],[119.34,50.63],[119.45,50.7],[119.5,50.78],[119.51,50.86],[119.57,50.95],[119.68,51.03],[119.75,51.11],[119.76,51.18],[119.81,51.27],[119.97,51.42],[120.07,51.6],[120.24,51.72],[120.51,51.85],[120.68,51.97],[120.75,52.1],[120.74,52.21],[120.67,52.3],[120.65,52.4],[120.7,52.49],[120.66,52.57],[120.52,52.62],[120.36,52.63],[120.17,52.6],[120.07,52.63],[120.04,52.72],[120.09,52.79],[120.22,52.84],[120.42,52.97],[120.7,53.17],[120.99,53.28],[121.41,53.32],[121.74,53.38],[122.09,53.45],[122.34,53.49],[122.38,53.46],[122.52,53.46],[122.74,53.47],[122.96,53.5],[123.15,53.54],[123.31,53.56],[123.42,53.53],[123.49,53.53],[123.53,53.53],[123.56,53.53],[123.61,53.55],[123.74,53.51],[123.99,53.41],[124.15,53.36],[124.22,53.37],[124.29,53.34],[124.37,53.27],[124.47,53.23],[124.64,53.21],[124.81,53.13],[124.88,53.13],[124.91,53.17],[124.97,53.2],[125.08,53.2],[125.23,53.17],[125.42,53.08],[125.55,53.05],[125.6,53.06],[125.65,53.04],[125.69,53.0],[125.7,52.96],[125.68,52.93],[125.73,52.89],[125.78,52.89],[125.87,52.87],[125.94,52.8],[126.0,52.77],[126.05,52.74],[126.06,52.72],[126.06,52.69],[126.05,52.67],[126.02,52.64],[126.02,52.61],[126.05,52.57],[126.16,52.55],[126.19,52.52],[126.2,52.48],[126.24,52.44],[126.31,52.4],[126.34,52.36],[126.32,52.33],[126.35,52.31],[126.38,52.29],[126.39,52.21],[126.39,52.17],[126.46,52.13],[126.47,52.03],[126.51,51.93],[126.65,51.78],[126.7,51.7],[126.69,51.61],[126.71,51.57],[126.77,51.55],[126.81,51.51],[126.8,51.45],[126.83,51.41],[126.85,51.37],[126.83,51.31],[126.85,51.26],[126.89,51.23],[126.91,51.17],[126.92,51.1],[127.02,50.99],[127.2,50.83],[127.31,50.71],[127.35,50.62],[127.35,50.55],[127.31,50.49],[127.31,50.45],[127.34,50.43],[127.35,50.39],[127.34,50.35],[127.4,50.3],[127.59,50.21],[127.51,50.07],[127.49,49.98],[127.5,49.87],[127.55,49.8],[127.64,49.76],[127.69,49.72],[127.71,49.67],[127.81,49.62],[128.0,49.57],[128.24,49.56],[128.53,49.59],[128.7,49.6],[128.77,49.58],[128.79,49.54],[128.77,49.49],[128.82,49.46],[128.94,49.45],[129.02,49.42],[129.07,49.37],[129.12,49.36],[129.19,49.38],[129.25,49.38],[129.31,49.35],[129.35,49.36],[129.38,49.39],[129.44,49.39],[129.5,49.39],[129.53,49.32],[129.59,49.29],[129.67,49.28],[129.79,49.2],[130.04,48.97],[130.2,48.89],[130.36,48.87],[130.55,48.86],[130.62,48.77],[130.57,48.68],[130.55,48.6],[130.6,48.57],[130.66,48.48],[130.75,48.43],[130.76,48.39],[130.8,48.34],[130.79,48.25],[130.71,48.13],[130.73,48.02],[130.85,47.93],[130.92,47.84],[130.93,47.76],[130.96,47.71],[131.0,47.69],[131.12,47.7],[131.32,47.73],[131.46,47.72],[131.56,47.68],[131.79,47.68],[132.15,47.72],[132.38,47.73],[132.48,47.71],[132.56,47.77],[132.64,47.89],[132.71,47.95],[132.77,47.94],[132.88,47.98],[133.02,48.06],[133.14,48.11],[133.3,48.1],[133.47,48.1],[133.57,48.13],[133.67,48.21],[133.84,48.27],[134.21,48.36],[134.29,48.37],[134.33,48.37],[134.46,48.36],[134.56,48.32],[134.67,48.25],[134.68,48.21],[134.67,48.15],[134.65,48.12],[134.61,48.08],[134.57,48.02],[134.59,47.98],[134.65,47.87],[134.7,47.8],[134.75,47.72],[134.73,47.68],[134.7,47.62],[134.6,47.52],[134.54,47.49],[134.48,47.45],[134.38,47.44],[134.34,47.43],[134.29,47.41],[134.26,47.38],[134.23,47.35],[134.17,47.3],[134.16,47.26],[134.19,47.19],[134.2,47.13],[134.14,47.07],[134.09,46.98],[134.07,46.95],[134.05,46.88],[134.04,46.86],[134.02,46.71],[133.96,46.61],[133.87,46.5],[133.89,46.43],[133.9,46.37],[133.88,46.34],[133.87,46.31],[133.86,46.25],[133.83,46.22],[133.75,46.19],[133.7,46.14],[133.71,46.07],[133.69,46.01],[133.65,45.96],[133.61,45.92],[133.55,45.9],[133.51,45.88],[133.48,45.81],[133.48,45.76],[133.45,45.71],[133.47,45.65],[133.44,45.6],[133.36,45.57],[133.31,45.55],[133.27,45.55],[133.19,45.49],[133.11,45.32],[133.1,45.22],[133.11,45.13],[133.01,45.07],[132.94,45.03],[132.89,45.05],[132.84,45.06],[132.72,45.08],[132.67,45.09],[132.55,45.12],[132.36,45.16],[132.18,45.2],[132.07,45.23],[131.98,45.24],[131.91,45.27],[131.85,45.33],[131.79,45.31],[131.74,45.24],[131.65,45.21],[131.61,45.14],[131.58,45.08],[131.49,45.01],[131.45,44.98],[131.27,44.94],[131.23,44.92],[131.08,44.91],[131.03,44.89],[130.98,44.84],[130.97,44.8],[131.0,44.75],[131.06,44.66],[131.09,44.6],[131.13,44.47],[131.26,44.07],[131.21,44.0],[131.17,43.7],[131.18,43.65],[131.18,43.57],[131.18,43.51],[131.21,43.49],[131.24,43.47],[131.26,43.43],[131.26,43.38],[131.24,43.34],[131.21,43.26],[131.18,43.14],[131.14,43.1],[131.11,43.06],[131.09,43.04],[131.08,42.96],[131.07,42.9],[131.01,42.88],[130.94,42.85],[130.87,42.86],[130.8,42.86],[130.72,42.84],[130.58,42.81],[130.49,42.78],[130.45,42.76],[130.42,42.73],[130.42,42.7],[130.44,42.69],[130.52,42.67],[130.58,42.62],[130.58,42.57],[130.53,42.54],[130.5,42.57],[130.45,42.58],[130.36,42.63],[130.3,42.68],[130.25,42.74],[130.25,42.87],[130.24,42.89],[130.15,42.92],[130.12,42.96],[130.08,42.97],[130.02,42.96],[129.98,42.97],[129.94,43.0],[129.9,43.0],[129.86,42.97],[129.84,42.89],[129.78,42.78],[129.77,42.71],[129.75,42.6],[129.72,42.48],[129.7,42.45],[129.63,42.44],[129.6,42.44],[129.57,42.39],[129.52,42.38],[129.48,42.41],[129.42,42.44],[129.37,42.44],[129.31,42.41],[129.25,42.36],[129.22,42.31],[129.21,42.27],[129.2,42.22],[129.13,42.17],[129.08,42.14],[128.96,42.07],[128.92,42.04],[128.84,42.04],[128.75,42.04],[128.63,42.02],[128.43,42.01],[128.31,42.03],[128.16,42.01],[128.05,41.99],[128.03,41.95],[128.03,41.9],[128.06,41.86],[128.08,41.84],[128.13,41.77],[128.18,41.7],[128.26,41.66],[128.29,41.61],[128.29,41.56],[128.25,41.51],[128.2,41.43],[128.15,41.39],[128.11,41.39],[128.05,41.42],[128.01,41.45],[127.92,41.46],[127.69,41.44],[127.57,41.45],[127.52,41.48],[127.42,41.48],[127.27,41.52],[127.18,41.53],[127.14,41.55],[127.13,41.61],[127.09,41.64],[127.06,41.69],[127.01,41.74],[126.95,41.77],[126.9,41.78],[126.85,41.75],[126.79,41.72],[126.74,41.72],[126.72,41.72],[126.7,41.69],[126.6,41.64],[126.58,41.59],[126.54,41.5],[126.51,41.39],[126.49,41.36],[126.45,41.35],[126.41,41.32],[126.33,41.23],[126.25,41.14],[126.14,41.08],[126.09,41.02],[126.07,40.97],[125.99,40.9],[125.87,40.89],[125.78,40.87],[125.73,40.87],[125.69,40.84],[125.66,40.8],[125.65,40.78],[125.59,40.78],[125.54,40.74],[125.42,40.66],[125.31,40.64],[125.19,40.59],[125.07,40.55],[125.03,40.52],[125.01,40.5],[125.0,40.46],[124.94,40.46],[124.89,40.46],[124.77,40.38],[124.71,40.32],[124.48,40.18],[124.39,40.1],[124.36,40.0],[124.35,40.01],[124.27,39.92],[124.11,39.84],[123.76,39.82],[123.65,39.88],[123.61,39.84],[123.58,39.79],[123.49,39.77],[123.35,39.76],[123.27,39.73],[123.23,39.69],[123.03,39.67],[122.96,39.62],[122.84,39.6],[122.33,39.37],[122.22,39.27],[122.12,39.15],[122.05,39.09],[121.98,39.05],[121.92,39.04],[121.86,39.0],[121.81,38.99],[121.74,39.01],[121.68,39.0],[121.63,38.95],[121.67,38.89],[121.65,38.87],[121.52,38.83],[121.32,38.81],[121.24,38.77],[121.21,38.74],[121.16,38.73],[121.12,38.81],[121.11,38.92],[121.19,38.95],[121.26,38.96],[121.68,39.11],[121.63,39.22],[121.66,39.27],[121.76,39.35],[121.82,39.39],[121.79,39.4],[121.51,39.37],[121.36,39.38],[121.28,39.38],[121.3,39.45],[121.29,39.52],[121.27,39.54],[121.41,39.62],[121.47,39.64],[121.52,39.64],[121.51,39.69],[121.47,39.75],[121.52,39.84],[121.8,39.95],[121.87,40.05],[121.98,40.14],[122.19,40.36],[122.2,40.4],[122.26,40.5],[122.28,40.54],[122.18,40.6],[122.14,40.69],[121.86,40.84],[121.83,40.97],[121.81,40.97],[121.77,40.88],[121.73,40.85],[121.6,40.84],[121.54,40.88],[121.17,40.9],[121.09,40.84],[121.0,40.75],[120.92,40.68],[120.84,40.65],[120.77,40.59],[120.48,40.23],[120.37,40.2],[119.85,39.99],[119.59,39.9],[119.39,39.75],[119.32,39.66],[119.26,39.56],[119.22,39.41],[119.04,39.22],[118.98,39.18],[118.91,39.17],[118.83,39.17],[118.75,39.16],[118.63,39.18],[118.47,39.12],[118.3,39.07],[118.15,39.2],[118.04,39.23],[117.87,39.19],[117.78,39.13],[117.62,38.85],[117.55,38.69],[117.56,38.63],[117.66,38.42],[117.77,38.31],[118.01,38.18],[118.54,38.09],[118.67,38.13],[118.8,38.13],[118.94,38.04],[119.03,37.9],[119.04,37.81],[119.04,37.78],[119.07,37.75],[119.09,37.7],[119.03,37.66],[118.99,37.64],[118.95,37.49],[118.95,37.33],[119.0,37.28],[119.11,37.2],[119.29,37.14],[119.45,37.12],[119.76,37.16],[119.89,37.25],[119.88,37.3],[119.88,37.35],[120.16,37.5],[120.31,37.62],[120.29,37.66],[120.26,37.68],[120.28,37.69],[120.37,37.7],[120.75,37.83],[121.05,37.73],[121.22,37.6],[121.39,37.58],[121.51,37.52],[121.64,37.46],[121.82,37.46],[121.96,37.45],[122.01,37.5],[122.06,37.53],[122.11,37.52],[122.17,37.46],[122.34,37.41],[122.49,37.41],[122.6,37.43],[122.67,37.4],[122.57,37.32],[122.59,37.18],[122.52,37.14],[122.45,37.07],[122.49,37.02],[122.52,37.0],[122.52,36.95],[122.46,36.92],[122.34,36.83],[122.27,36.83],[122.24,36.85],[122.22,36.88],[122.2,36.93],[122.16,36.96],[122.05,36.97],[121.93,36.96],[121.67,36.84],[121.41,36.74],[121.14,36.66],[121.05,36.61],[120.99,36.6],[120.88,36.64],[120.81,36.63],[120.8,36.61],[120.88,36.54],[120.9,36.49],[120.9,36.44],[120.85,36.43],[120.78,36.46],[120.71,36.41],[120.68,36.34],[120.68,36.17],[120.64,36.13],[120.52,36.11],[120.39,36.05],[120.35,36.08],[120.33,36.11],[120.34,36.19],[120.33,36.23],[120.27,36.23],[120.18,36.2],[120.12,36.15],[120.09,36.12],[120.18,36.02],[120.26,36.01],[120.28,35.98],[120.22,35.93],[120.05,35.86],[120.03,35.8],[119.98,35.74],[119.91,35.69],[119.87,35.64],[119.81,35.62],[119.72,35.59],[119.61,35.47],[119.53,35.36],[119.43,35.3],[119.35,35.11],[119.22,35.01],[119.17,34.85],[119.2,34.75],[119.35,34.75],[119.43,34.71],[119.58,34.58],[119.77,34.5],[119.96,34.45],[120.2,34.33],[120.27,34.27],[120.32,34.17],[120.43,33.87],[120.5,33.72],[120.5,33.64],[120.62,33.49],[120.73,33.24],[120.87,33.02],[120.9,32.84],[120.85,32.76],[120.85,32.66],[120.99,32.57],[121.29,32.46],[121.34,32.43],[121.4,32.37],[121.4,32.21],[121.45,32.15],[121.49,32.12],[121.67,32.05],[121.75,31.99],[121.83,31.9],[121.86,31.82],[121.87,31.7],[121.76,31.7],[121.68,31.71],[121.35,31.86],[121.27,31.86],[121.15,31.84],[120.97,31.87],[120.79,32.03],[120.66,32.08],[120.52,32.11],[120.18,31.97],[120.1,31.98],[120.07,31.96],[120.04,31.94],[120.19,31.91],[120.35,31.95],[120.5,32.02],[120.72,31.98],[120.75,31.92],[120.79,31.82],[120.94,31.75],[121.06,31.72],[121.2,31.63],[121.35,31.49],[121.66,31.32],[121.79,31.16],[121.83,31.06],[121.88,30.92],[121.77,30.87],[121.68,30.86],[121.53,30.84],[121.42,30.79],[121.31,30.7],[121.0,30.56],[120.94,30.47],[120.9,30.39],[120.82,30.35],[120.63,30.39],[120.45,30.39],[120.25,30.28],[120.19,30.24],[120.23,30.25],[120.26,30.26],[120.35,30.25],[120.49,30.3],[120.63,30.13],[120.9,30.16],[121.16,30.3],[121.26,30.3],[121.34,30.28],[121.43,30.23],[121.68,29.98],[121.81,29.95],[121.94,29.89],[122.02,29.89],[122.08,29.87],[121.91,29.78],[121.68,29.58],[121.57,29.54],[121.51,29.48],[121.69,29.51],[121.82,29.6],[121.89,29.63],[121.94,29.61],[121.97,29.49],[121.92,29.14],[121.85,29.13],[121.79,29.23],[121.72,29.26],[121.66,29.24],[121.53,29.24],[121.49,29.19],[121.45,29.13],[121.52,29.12],[121.66,29.01],[121.68,28.95],[121.64,28.92],[121.54,28.93],[121.66,28.85],[121.63,28.77],[121.59,28.73],[121.52,28.71],[121.48,28.64],[121.54,28.52],[121.6,28.37],[121.61,28.29],[121.51,28.32],[121.35,28.23],[121.27,28.22],[121.22,28.35],[121.15,28.33],[121.1,28.29],[121.04,28.16],[120.96,28.04],[120.89,28.0],[120.81,28.01],[120.75,28.01],[120.76,27.98],[120.83,27.94],[120.83,27.89],[120.69,27.74],[120.66,27.69],[120.66,27.64],[120.59,27.58],[120.63,27.48],[120.61,27.41],[120.54,27.32],[120.47,27.26],[120.38,27.16],[120.28,27.1],[120.14,26.89],[120.1,26.78],[120.09,26.67],[120.04,26.63],[119.97,26.59],[119.88,26.61],[119.88,26.68],[119.84,26.69],[119.82,26.74],[119.82,26.8],[119.82,26.85],[119.79,26.83],[119.77,26.77],[119.71,26.73],[119.65,26.75],[119.59,26.78],[119.59,26.73],[119.62,26.68],[119.64,26.62],[119.73,26.61],[119.78,26.55],[119.83,26.45],[119.84,26.41],[119.88,26.37],[119.88,26.33],[119.8,26.3],[119.69,26.24],[119.57,26.13],[119.46,26.05],[119.37,26.05],[119.31,26.06],[119.23,26.1],[119.14,26.12],[119.26,25.97],[119.33,25.95],[119.42,25.95],[119.5,26.01],[119.62,26.0],[119.65,25.92],[119.62,25.82],[119.55,25.7],[119.54,25.59],[119.62,25.44],[119.62,25.39],[119.59,25.37],[119.5,25.41],[119.42,25.46],[119.34,25.45],[119.26,25.47],[119.18,25.45],[119.15,25.41],[119.17,25.36],[119.24,25.31],[119.29,25.23],[119.24,25.21],[119.02,25.22],[118.98,25.21],[118.91,25.13],[118.96,25.0],[118.91,24.93],[118.82,24.91],[118.71,24.85],[118.64,24.84],[118.64,24.81],[118.69,24.78],[118.72,24.75],[118.66,24.62],[118.56,24.58],[118.41,24.6],[118.3,24.57],[118.19,24.63],[118.09,24.63],[118.01,24.56],[118.01,24.48],[117.94,24.47],[117.9,24.48],[117.84,24.47],[117.85,24.43],[117.88,24.4],[118.02,24.38],[118.05,24.33],[118.06,24.25],[117.9,24.11],[117.84,24.01],[117.74,24.01],[117.67,23.94],[117.63,23.84],[117.58,23.86],[117.47,23.84],[117.43,23.79],[117.46,23.77],[117.46,23.74],[117.42,23.62],[117.37,23.59],[117.35,23.64],[117.33,23.71],[117.29,23.71],[117.22,23.65],[117.15,23.6],[117.08,23.58],[117.03,23.62],[116.91,23.65],[116.86,23.45],[116.76,23.38],[116.71,23.36],[116.63,23.35],[116.68,23.33],[116.7,23.28],[116.67,23.23],[116.59,23.22],[116.54,23.18],[116.52,23.01],[116.47,22.95],[116.35,22.94],[116.25,22.98],[116.22,22.95],[116.21,22.92],[116.16,22.89],[116.06,22.88],[115.85,22.8],[115.76,22.82],[115.64,22.85],[115.56,22.82],[115.53,22.77],[115.5,22.72],[115.38,22.72],[115.29,22.78],[115.2,22.82],[115.09,22.78],[115.01,22.71],[114.91,22.68],[114.9,22.64],[114.85,22.62],[114.75,22.63],[114.71,22.74],[114.65,22.76],[114.59,22.7],[114.57,22.65],[114.54,22.62],[114.55,22.53],[114.5,22.53],[114.42,22.58],[114.34,22.59],[114.27,22.54],[114.23,22.55],[114.19,22.56],[114.12,22.56],[114.1,22.55],[114.05,22.54],[114.02,22.51],[114.02,22.51],[113.93,22.53],[113.83,22.61],[113.75,22.73],[113.66,22.8],[113.62,22.86],[113.6,22.97],[113.59,23.02],[113.59,23.08],[113.62,23.13],[113.52,23.1],[113.45,23.06],[113.46,23.0],[113.44,22.94],[113.33,22.91],[113.34,22.89],[113.34,22.86],[113.43,22.79],[113.45,22.73],[113.48,22.69],[113.55,22.59],[113.55,22.4],[113.59,22.35],[113.58,22.3],[113.55,22.23],[113.55,22.22],[113.53,22.25],[113.49,22.24],[113.48,22.22],[113.48,22.2],[113.47,22.19],[113.42,22.18],[113.37,22.16],[113.33,22.15],[113.27,22.09],[113.15,22.08],[113.09,22.21],[113.01,22.12],[112.98,21.94],[112.95,21.91],[112.9,21.88],[112.81,21.94],[112.73,21.9],[112.66,21.86],[112.63,21.82],[112.59,21.78],[112.49,21.82],[112.42,21.88],[112.44,21.93],[112.43,21.96],[112.4,21.98],[112.36,21.98],[112.38,21.92],[112.39,21.8],[112.36,21.77],[112.3,21.74],[112.19,21.76],[112.12,21.81],[112.03,21.84],[111.94,21.85],[111.93,21.78],[111.87,21.72],[111.82,21.71],[111.78,21.72],[111.71,21.66],[111.68,21.61],[111.6,21.56],[111.39,21.54],[111.32,21.49],[111.22,21.49],[111.14,21.48],[111.1,21.48],[111.06,21.51],[111.02,21.51],[111.0,21.43],[110.88,21.4],[110.77,21.39],[110.65,21.28],[110.57,21.21],[110.5,21.21],[110.46,21.23],[110.43,21.33],[110.41,21.34],[110.4,21.25],[110.37,21.17],[110.33,21.13],[110.19,21.04],[110.15,20.94],[110.18,20.86],[110.37,20.84],[110.39,20.79],[110.37,20.75],[110.33,20.72],[110.31,20.67],[110.51,20.52],[110.52,20.46],[110.49,20.43],[110.45,20.36],[110.34,20.29],[110.12,20.26],[109.94,20.3],[109.88,20.36],[109.89,20.41],[109.93,20.4],[109.98,20.4],[109.97,20.45],[109.95,20.47],[109.86,20.51],[109.79,20.62],[109.81,20.71],[109.77,20.78],[109.73,20.84],[109.68,20.87],[109.66,20.92],[109.7,21.05],[109.68,21.13],[109.76,21.23],[109.78,21.34],[109.92,21.38],[109.93,21.48],[109.83,21.48],[109.76,21.56],[109.74,21.53],[109.69,21.52],[109.59,21.67],[109.57,21.69],[109.52,21.69],[109.54,21.54],[109.44,21.48],[109.35,21.45],[109.22,21.44],[109.15,21.43],[109.08,21.44],[109.1,21.49],[109.13,21.54],[109.1,21.59],[109.03,21.63],[108.92,21.62],[108.85,21.63],[108.77,21.63],[108.74,21.65],[108.67,21.72],[108.62,21.77],[108.59,21.82],[108.62,21.87],[108.59,21.9],[108.48,21.9],[108.48,21.83],[108.49,21.74],[108.53,21.67],[108.5,21.63],[108.44,21.61],[108.38,21.68],[108.35,21.7],[108.32,21.69],[108.3,21.62],[108.25,21.56],[108.15,21.57],[108.07,21.53],[107.97,21.51],[107.91,21.56],[107.8,21.65],[107.76,21.66],[107.64,21.61],[107.47,21.6],[107.43,21.64],[107.35,21.61],[107.27,21.71],[107.18,21.72],[107.06,21.79],[107.02,21.83],[107.01,21.89],[106.97,21.92],[106.93,21.92],[106.87,21.95],[106.79,21.98],[106.73,22.0],[106.7,21.99],[106.66,21.98],[106.66,22.02],[106.66,22.14],[106.65,22.24],[106.64,22.29],[106.59,22.32],[106.55,22.34],[106.54,22.4],[106.55,22.5],[106.58,22.57],[106.63,22.59],[106.7,22.64],[106.74,22.71],[106.78,22.78],[106.62,22.87],[106.54,22.91],[106.45,22.89],[106.34,22.86],[106.28,22.86],[106.25,22.87],[106.18,22.96],[106.15,22.97],[106.07,22.98],[106.0,22.97],[105.96,22.94],[105.9,22.92],[105.84,22.92],[105.78,22.97],[105.69,23.03],[105.55,23.07],[105.53,23.12],[105.49,23.18],[105.44,23.24],[105.35,23.31],[105.28,23.35],[105.24,23.32],[105.19,23.28],[105.0,23.19],[104.91,23.16],[104.86,23.14],[104.83,23.1],[104.81,23.01],[104.8,22.91],[104.74,22.86],[104.69,22.82],[104.63,22.82],[104.58,22.82],[104.53,22.8],[104.37,22.7],[104.3,22.71],[104.24,22.77],[104.21,22.81],[104.14,22.8],[104.05,22.75],[104.01,22.67],[103.99,22.59],[103.97,22.55],[103.94,22.54],[103.92,22.54],[103.64,22.77],[103.62,22.78],[103.57,22.73],[103.53,22.61],[103.49,22.59],[103.47,22.6],[103.36,22.75],[103.33,22.77],[103.3,22.76],[103.27,22.71],[103.19,22.64],[103.14,22.59],[103.14,22.54],[103.08,22.5],[103.01,22.45],[102.98,22.45],[102.94,22.47],[102.87,22.53],[102.83,22.59],[102.72,22.65],[102.6,22.7],[102.52,22.74],[102.47,22.75],[102.43,22.73],[102.41,22.71],[102.38,22.65],[102.3,22.55],[102.24,22.47],[102.18,22.41],[102.13,22.38],[102.09,22.41],[102.02,22.44],[101.95,22.44],[101.84,22.39],[101.76,22.49],[101.74,22.5],[101.71,22.49],[101.67,22.46],[101.65,22.41],[101.62,22.33],[101.57,22.28],[101.52,22.25],[101.54,22.21],[101.56,22.16],[101.56,22.12],[101.58,22.06],[101.6,21.99],[101.7,21.88],[101.74,21.83],[101.74,21.78],[101.75,21.61],[101.74,21.53],[101.72,21.4],[101.72,21.31],[101.76,21.28],[101.8,21.24],[101.8,21.21],[101.78,21.2],[101.73,21.16],[101.7,21.15],[101.67,21.17],[101.62,21.18],[101.58,21.2],[101.54,21.23],[101.44,21.23],[101.28,21.18],[101.25,21.2],[101.22,21.22],[101.21,21.28],[101.22,21.34],[101.21,21.38],[101.18,21.41],[101.2,21.52],[101.14,21.57],[101.15,21.58],[101.13,21.71],[101.13,21.74],[101.12,21.75],[101.08,21.76],[101.02,21.74],[100.84,21.66],[100.68,21.5],[100.6,21.47],[100.53,21.46],[100.45,21.48],[100.35,21.5],[100.21,21.46],[100.15,21.48],[100.12,21.51],[100.09,21.56],[100.11,21.62],[100.1,21.66],[100.04,21.68],[99.98,21.7],[99.94,21.76],[99.93,21.82],[99.94,21.9],[99.95,21.99],[99.92,22.03],[99.83,22.05],[99.59,22.09],[99.39,22.11],[99.3,22.1],[99.23,22.11],[99.19,22.13],[99.17,22.15],[99.17,22.19],[99.21,22.28],[99.24,22.37],[99.34,22.5],[99.34,22.59],[99.34,22.69],[99.39,22.83],[99.47,22.93],[99.51,22.96],[99.5,23.0],[99.46,23.05],[99.42,23.07],[99.34,23.1],[99.22,23.1],[99.06,23.13],[98.86,23.19],[98.89,23.31],[98.88,23.38],[98.86,23.44],[98.82,23.48],[98.8,23.52],[98.83,23.62],[98.79,23.74],[98.74,23.78],[98.68,23.84],[98.68,23.91],[98.7,23.96],[98.83,24.09],[98.84,24.12],[98.8,24.12],[98.76,24.12],[98.58,24.07],[98.56,24.1],[98.5,24.12],[98.37,24.12],[98.21,24.11],[98.02,24.07],[97.84,23.99],[97.76,23.93],[97.69,23.9],[97.63,23.89],[97.56,23.91],[97.57,23.99],[97.69,24.13],[97.71,24.23],[97.67,24.31],[97.67,24.38],[97.62,24.42],[97.56,24.44],[97.53,24.49],[97.53,24.63],[97.58,24.77],[97.67,24.82],[97.72,24.84],[97.74,24.87],[97.71,24.97],[97.71,25.03],[97.77,25.16],[97.82,25.25],[97.92,25.24],[97.96,25.26],[98.01,25.29],[98.06,25.35],[98.1,25.42],[98.14,25.57],[98.17,25.59],[98.3,25.57],[98.33,25.59],[98.4,25.68],[98.47,25.79],[98.56,25.82],[98.63,25.83],[98.66,25.86],[98.65,25.92],[98.59,26.0],[98.56,26.07],[98.57,26.11],[98.66,26.14],[98.69,26.19],[98.67,26.3],[98.71,26.43],[98.73,26.58],[98.74,26.7],[98.74,26.79],[98.73,26.88],[98.72,27.04],[98.67,27.19],[98.68,27.25],[98.68,27.42],[98.65,27.57],[98.6,27.6],[98.5,27.65],[98.45,27.66],[98.41,27.64],[98.39,27.59],[98.35,27.54],[98.3,27.55],[98.27,27.6],[98.24,27.66],[98.13,27.97],[98.12,28.06],[98.1,28.14],[98.06,28.19],[98.02,28.21],[97.93,28.31],[97.89,28.36],[97.86,28.36],[97.82,28.36],[97.77,28.36],[97.73,28.41],[97.69,28.47],[97.66,28.5],[97.6,28.52],[97.54,28.51],[97.5,28.46],[97.48,28.43],[97.43,28.35],[97.36,28.25],[97.32,28.22],[97.29,28.24],[97.15,28.34],[97.08,28.37],[96.98,28.34],[96.83,28.36],[96.78,28.37],[96.65,28.45],[96.6,28.46],[96.43,28.41],[96.39,28.37],[96.37,28.37],[96.32,28.39],[96.28,28.41],[96.28,28.43],[96.33,28.47],[96.33,28.5],[96.33,28.53],[96.4,28.61],[96.58,28.76],[96.55,28.83],[96.48,28.96],[96.47,29.02],[96.44,29.05],[96.35,29.03],[96.16,28.91],[96.14,28.92],[96.14,28.96],[96.12,29.08],[96.18,29.12],[96.27,29.16],[96.34,29.21],[96.36,29.25],[96.34,29.26],[96.23,29.25],[96.19,29.27],[96.13,29.38],[96.08,29.42],[96.04,29.45],[95.89,29.39],[95.71,29.31],[95.52,29.21],[95.52,29.15],[95.49,29.14],[95.46,29.1],[95.42,29.05],[95.39,29.04],[95.35,29.04],[95.28,29.05],[95.14,29.1],[95.0,29.15],[94.97,29.14],[94.77,29.18],[94.76,29.2],[94.73,29.25],[94.68,29.3],[94.62,29.31],[94.47,29.22],[94.29,29.14],[94.19,29.06],[94.11,28.98],[94.02,28.96],[94.01,28.91],[93.97,28.86],[93.9,28.8],[93.76,28.73],[93.66,28.69],[93.36,28.65],[93.25,28.63],[93.21,28.59],[93.16,28.49],[93.12,28.4],[93.03,28.33],[92.88,28.23],[92.7,28.15],[92.65,28.09],[92.64,28.06],[92.67,28.05],[92.69,28.03],[92.69,27.99],[92.66,27.95],[92.55,27.88],[92.48,27.85],[92.41,27.82],[92.34,27.82],[92.27,27.83],[92.25,27.84],[92.22,27.83],[92.16,27.81],[92.1,27.81],[91.98,27.73],[91.91,27.73],[91.82,27.75],[91.71,27.76],[91.63,27.76],[91.63,27.8],[91.64,27.92],[91.61,27.95],[91.49,27.98],[91.37,28.02],[91.31,28.06],[91.27,28.08],[91.23,28.07],[91.15,28.03],[91.08,27.97],[91.02,27.97],[90.96,27.99],[90.91,28.03],[90.72,28.07],[90.63,28.08],[90.48,28.07],[90.35,28.08],[90.33,28.09],[90.33,28.12],[90.35,28.17],[90.36,28.22],[90.35,28.24],[90.22,28.28],[90.1,28.3],[89.98,28.31],[89.9,28.29],[89.82,28.26],[89.75,28.19],[89.65,28.16],[89.54,28.11],[89.48,28.06],[89.4,27.96],[89.27,27.83],[89.16,27.71],[89.1,27.59],[89.03,27.52],[88.95,27.46],[88.89,27.32],[88.83,27.36],[88.76,27.43],[88.75,27.52],[88.83,27.77],[88.85,27.87],[88.83,27.91],[88.8,28.01],[88.76,28.04],[88.62,28.09],[88.58,28.09],[88.53,28.06],[88.49,28.03],[88.43,28.01],[88.28,27.97],[88.14,27.95],[88.11,27.93],[88.1,27.9],[88.11,27.87],[88.02,27.88],[87.93,27.89],[87.86,27.89],[87.68,27.82],[87.62,27.82],[87.56,27.82],[87.46,27.82],[87.29,27.82],[87.14,27.84],[87.02,27.93],[86.93,27.97],[86.84,28.0],[86.75,28.02],[86.72,28.07],[86.69,28.09],[86.61,28.1],[86.55,28.09],[86.52,27.96],[86.48,27.94],[86.41,27.93],[86.33,27.96],[86.22,28.02],[86.17,28.09],[86.14,28.11],[86.08,28.08],[86.08,27.99],[86.06,27.93],[85.99,27.91],[85.95,27.93],[85.92,27.99],[85.84,28.14],[85.76,28.22],[85.68,28.28],[85.41,28.28],[85.21,28.29],[85.12,28.32],[85.09,28.37],[85.12,28.48],[85.16,28.57],[85.16,28.59],[85.13,28.6],[85.07,28.61],[84.86,28.55],[84.8,28.56],[84.76,28.58],[84.71,28.6],[84.68,28.62],[84.65,28.66],[84.47,28.75],[84.41,28.8],[84.31,28.87],[84.23,28.91],[84.18,29.04],[84.13,29.16],[84.1,29.22],[84.02,29.25],[83.94,29.28],[83.79,29.23],[83.67,29.19],[83.58,29.18],[83.46,29.31],[83.36,29.44],[83.24,29.55],[83.16,29.61],[83.01,29.62],[82.85,29.68],[82.64,29.83],[82.49,29.94],[82.22,30.06],[82.16,30.12],[82.14,30.16],[82.1,30.25],[82.04,30.33],[81.85,30.36],[81.64,30.39],[81.42,30.34],[81.26,30.09],[81.18,30.04],[81.11,30.04],[81.06,30.1],[81.01,30.16],[80.99,30.24],[80.87,30.29],[80.75,30.36],[80.68,30.41],[80.61,30.45],[80.54,30.46],[80.41,30.51],[80.26,30.56],[80.19,30.57],[80.19,30.61],[80.21,30.68],[80.19,30.76],[80.15,30.79],[80.08,30.78],[79.92,30.89],[79.92,30.89],[79.92,30.89],[79.87,30.92],[79.79,30.97],[79.66,30.97],[79.57,30.95],[79.49,30.99],[79.39,31.06],[79.37,31.08],[79.34,31.11],[79.23,31.24],[79.11,31.4],[79.04,31.43],[79.01,31.41],[78.97,31.33],[78.95,31.34],[78.9,31.33],[78.84,31.3],[78.79,31.29],[78.76,31.3],[78.74,31.32],[78.76,31.44],[78.73,31.47],[78.76,31.55],[78.8,31.62],[78.75,31.67],[78.69,31.74],[78.69,31.81],[78.72,31.89],[78.74,31.96],[78.73,31.98],[78.68,32.02],[78.5,32.22],[78.49,32.24],[78.46,32.3],[78.44,32.4],[78.42,32.47],[78.39,32.52],[78.39,32.54],[78.41,32.56],[78.53,32.57],[78.63,32.58],[78.7,32.6],[78.74,32.56],[78.75,32.5],[78.77,32.47],[78.84,32.41],[78.92,32.36],[79.0,32.37],[79.07,32.39],[79.13,32.48],[79.17,32.5],[79.22,32.5],[79.22,32.51],[79.22,32.56],[79.23,32.7],[79.23,32.76],[79.21,32.81],[79.21,32.86],[79.2,32.95],[79.15,33.0],[79.11,33.02],[79.1,33.05],[79.12,33.11],[79.14,33.17],[79.11,33.23],[79.07,33.25],[79.01,33.29],[78.95,33.35],[78.92,33.39],[78.87,33.43],[78.8,33.5],[78.79,33.65],[78.78,33.81],[78.76,33.89],[78.73,34.01],[78.73,34.06],[78.75,34.09],[78.93,34.19],[78.97,34.23],[78.98,34.26],[78.97,34.3],[78.94,34.35],[78.86,34.39],[78.76,34.45],[78.67,34.52],[78.52,34.56],[78.33,34.61],[78.28,34.65],[78.24,34.77],[78.16,34.95],[78.08,35.13],[78.01,35.25],[78.01,35.31],[78.05,35.45],[78.04,35.48],[78.01,35.49],[77.95,35.47],[77.89,35.45],[77.85,35.46],[77.81,35.48],[77.8,35.49],[77.8,35.5],[77.72,35.48],[77.57,35.47],[77.52,35.47],[77.45,35.48],[77.29,35.51],[77.09,35.55],[76.88,35.61],[76.77,35.66],[76.73,35.68],[76.63,35.73],[76.56,35.77],[76.55,35.89],[76.5,35.88],[76.39,35.84],[76.25,35.81],[76.18,35.81],[76.15,35.83],[76.1,35.95],[76.07,35.98],[76.01,36.0],[75.95,36.02],[75.91,36.05],[75.9,36.09],[75.93,36.13],[75.97,36.17],[75.97,36.38],[75.95,36.46],[75.93,36.52],[75.88,36.6],[75.84,36.65],[75.77,36.69],[75.67,36.74],[75.57,36.76],[75.46,36.73],[75.42,36.74],[75.38,36.88],[75.35,36.91],[75.15,36.97],[75.05,36.99],[74.95,36.97],[74.89,36.95],[74.84,36.98],[74.77,37.01],[74.69,37.04],[74.6,37.04],[74.54,37.02]],[[110.89,19.99],[110.94,19.95],[110.97,19.88],[111.0,19.76],[111.01,19.66],[110.91,19.59],[110.82,19.56],[110.64,19.29],[110.6,19.21],[110.57,19.17],[110.56,19.14],[110.57,19.1],[110.52,18.97],[110.48,18.81],[110.45,18.75],[110.4,18.7],[110.33,18.67],[110.29,18.67],[110.25,18.66],[110.16,18.57],[110.05,18.51],[110.07,18.48],[110.07,18.45],[110.02,18.42],[109.97,18.42],[109.82,18.4],[109.76,18.35],[109.7,18.26],[109.68,18.25],[109.59,18.23],[109.52,18.22],[109.4,18.28],[109.34,18.3],[109.18,18.33],[109.03,18.37],[108.92,18.42],[108.7,18.54],[108.68,18.75],[108.64,18.87],[108.64,18.91],[108.65,19.27],[108.67,19.3],[108.69,19.34],[108.79,19.42],[108.9,19.48],[109.06,19.61],[109.18,19.67],[109.28,19.76],[109.22,19.76],[109.18,19.77],[109.22,19.84],[109.26,19.88],[109.31,19.9],[109.42,19.89],[109.51,19.9],[109.58,19.97],[109.65,19.98],[109.91,19.96],[110.08,19.99],[110.17,20.05],[110.21,20.06],[110.34,20.04],[110.39,19.98],[110.39,20.02],[110.39,20.06],[110.42,20.05],[110.59,19.98],[110.59,20.07],[110.6,20.1],[110.65,20.14],[110.68,20.14],[110.74,20.06],[110.81,20.01],[110.89,19.99]],[[110.39,21.09],[110.42,21.06],[110.52,21.08],[110.54,21.04],[110.54,21.02],[110.5,20.97],[110.42,21.01],[110.34,21.0],[110.28,21.0],[110.26,21.03],[110.31,21.07],[110.39,21.09]],[[112.64,21.64],[112.55,21.62],[112.52,21.62],[112.56,21.67],[112.65,21.71],[112.64,21.64]],[[112.79,21.6],[112.77,21.58],[112.74,21.62],[112.73,21.67],[112.71,21.7],[112.76,21.73],[112.78,21.77],[112.84,21.76],[112.86,21.75],[112.81,21.71],[112.8,21.69],[112.79,21.6]],[[113.56,22.8],[113.56,22.76],[113.49,22.83],[113.46,22.83],[113.43,22.86],[113.4,22.9],[113.46,22.9],[113.52,22.85],[113.56,22.8]],[[118.18,24.5],[118.15,24.44],[118.09,24.45],[118.09,24.49],[118.08,24.5],[118.09,24.54],[118.1,24.55],[118.17,24.52],[118.18,24.5]],[[119.82,25.46],[119.75,25.41],[119.7,25.43],[119.7,25.49],[119.72,25.55],[119.7,25.59],[119.72,25.64],[119.78,25.65],[119.8,25.62],[119.83,25.61],[119.84,25.59],[119.84,25.56],[119.81,25.51],[119.83,25.48],[119.82,25.46]],[[121.25,28.09],[121.16,28.06],[121.13,28.06],[121.13,28.14],[121.21,28.2],[121.23,28.18],[121.25,28.15],[121.25,28.09]],[[122.17,29.68],[122.17,29.66],[122.08,29.73],[122.04,29.74],[122.06,29.77],[122.12,29.78],[122.17,29.7],[122.17,29.68]],[[122.4,29.89],[122.39,29.85],[122.37,29.85],[122.33,29.93],[122.35,29.96],[122.4,29.95],[122.4,29.89]],[[122.3,29.96],[122.28,29.94],[122.16,30.0],[122.02,30.01],[121.98,30.06],[121.97,30.14],[122.11,30.14],[122.28,30.07],[122.32,30.03],[122.3,29.96]],[[121.86,31.49],[121.78,31.46],[121.52,31.55],[121.34,31.64],[121.23,31.76],[121.21,31.81],[121.34,31.8],[121.46,31.76],[121.49,31.69],[121.54,31.67],[121.58,31.64],[121.81,31.55],[121.84,31.53],[121.86,31.49]]]},{"n":"Ivory Coast","r":[[[-5.52,10.43],[-5.46,10.36],[-5.38,10.31],[-5.26,10.32],[-5.18,10.29],[-5.1,10.24],[-5.05,10.13],[-4.99,10.05],[-4.97,9.93],[-4.88,9.87],[-4.81,9.84],[-4.72,9.76],[-4.63,9.71],[-4.53,9.72],[-4.48,9.68],[-4.41,9.65],[-4.33,9.65],[-4.27,9.74],[-4.18,9.78],[-3.96,9.86],[-3.88,9.89],[-3.79,9.92],[-3.58,9.92],[-3.39,9.9],[-3.29,9.88],[-3.22,9.9],[-3.16,9.85],[-3.1,9.75],[-3.04,9.72],[-2.99,9.69],[-2.95,9.61],[-2.9,9.53],[-2.88,9.5],[-2.82,9.43],[-2.77,9.42],[-2.72,9.46],[-2.7,9.48],[-2.69,9.43],[-2.71,9.35],[-2.7,9.3],[-2.67,9.28],[-2.69,9.22],[-2.75,9.11],[-2.75,9.05],[-2.69,9.03],[-2.65,8.96],[-2.62,8.84],[-2.6,8.8],[-2.6,8.78],[-2.56,8.49],[-2.51,8.21],[-2.54,8.17],[-2.58,8.16],[-2.61,8.15],[-2.62,8.12],[-2.6,8.08],[-2.61,8.05],[-2.67,8.02],[-2.79,7.93],[-2.8,7.9],[-2.83,7.82],[-2.86,7.77],[-2.9,7.69],[-2.96,7.45],[-2.98,7.26],[-2.99,7.2],[-3.01,7.16],[-3.04,7.1],[-3.17,6.94],[-3.24,6.81],[-3.23,6.75],[-3.22,6.69],[-3.24,6.65],[-3.24,6.54],[-3.22,6.44],[-3.2,6.35],[-3.11,6.09],[-3.06,5.93],[-3.03,5.8],[-3.0,5.71],[-2.97,5.68],[-2.96,5.64],[-2.82,5.62],[-2.79,5.6],[-2.75,5.43],[-2.76,5.36],[-2.79,5.33],[-2.79,5.26],[-2.8,5.18],[-2.82,5.15],[-2.89,5.15],[-2.95,5.12],[-3.02,5.13],[-3.03,5.15],[-3.06,5.16],[-3.17,5.2],[-3.15,5.35],[-3.2,5.35],[-3.24,5.34],[-3.31,5.16],[-3.35,5.13],[-3.87,5.22],[-3.98,5.29],[-4.12,5.31],[-4.36,5.3],[-4.55,5.28],[-4.61,5.24],[-4.12,5.26],[-4.06,5.26],[-4.04,5.23],[-4.66,5.17],[-4.9,5.14],[-4.97,5.15],[-5.02,5.2],[-5.28,5.21],[-5.34,5.19],[-5.37,5.15],[-5.27,5.16],[-5.1,5.16],[-5.06,5.13],[-5.56,5.09],[-5.91,5.01],[-6.06,4.95],[-6.55,4.76],[-6.85,4.67],[-6.92,4.64],[-7.06,4.54],[-7.23,4.49],[-7.43,4.38],[-7.54,4.35],[-7.57,4.39],[-7.57,4.57],[-7.59,4.82],[-7.59,4.92],[-7.57,5.01],[-7.57,5.08],[-7.51,5.11],[-7.49,5.14],[-7.49,5.24],[-7.43,5.32],[-7.43,5.48],[-7.41,5.51],[-7.4,5.55],[-7.42,5.65],[-7.45,5.84],[-7.47,5.85],[-7.48,5.85],[-7.51,5.84],[-7.64,5.91],[-7.73,5.92],[-7.8,5.98],[-7.8,6.04],[-7.83,6.08],[-7.86,6.15],[-7.89,6.23],[-7.98,6.29],[-8.07,6.3],[-8.13,6.29],[-8.2,6.29],[-8.29,6.32],[-8.34,6.35],[-8.4,6.41],[-8.45,6.46],[-8.49,6.46],[-8.54,6.47],[-8.59,6.49],[-8.6,6.51],[-8.4,6.71],[-8.33,6.8],[-8.33,6.86],[-8.32,6.92],[-8.3,6.98],[-8.3,7.07],[-8.41,7.41],[-8.44,7.52],[-8.47,7.55],[-8.49,7.56],[-8.43,7.6],[-8.35,7.59],[-8.23,7.56],[-8.21,7.59],[-8.12,7.76],[-8.12,7.82],[-8.13,7.87],[-8.07,7.98],[-8.03,8.03],[-8.01,8.08],[-8.02,8.14],[-8.05,8.17],[-8.09,8.17],[-8.14,8.18],[-8.22,8.22],[-8.26,8.25],[-8.24,8.41],[-8.24,8.46],[-8.21,8.48],[-8.17,8.49],[-8.05,8.5],[-7.95,8.48],[-7.87,8.47],[-7.82,8.47],[-7.79,8.42],[-7.74,8.38],[-7.7,8.38],[-7.68,8.41],[-7.69,8.56],[-7.72,8.64],[-7.78,8.72],[-7.95,8.79],[-7.95,8.88],[-7.94,8.98],[-7.9,9.02],[-7.78,9.08],[-7.8,9.12],[-7.84,9.15],[-7.92,9.19],[-7.9,9.31],[-7.9,9.42],[-7.96,9.4],[-8.03,9.4],[-8.09,9.43],[-8.14,9.5],[-8.15,9.67],[-8.15,9.88],[-8.16,9.97],[-8.14,10.02],[-8.08,10.07],[-8.01,10.13],[-7.99,10.16],[-7.96,10.16],[-7.88,10.19],[-7.81,10.24],[-7.75,10.34],[-7.66,10.43],[-7.56,10.42],[-7.53,10.44],[-7.5,10.44],[-7.46,10.38],[-7.41,10.34],[-7.39,10.34],[-7.36,10.26],[-7.18,10.23],[-7.1,10.2],[-7.04,10.14],[-7.02,10.14],[-6.99,10.16],[-6.97,10.18],[-6.96,10.2],[-6.99,10.25],[-6.98,10.3],[-6.95,10.34],[-6.9,10.35],[-6.83,10.36],[-6.75,10.36],[-6.69,10.35],[-6.67,10.39],[-6.69,10.51],[-6.69,10.58],[-6.68,10.63],[-6.65,10.66],[-6.56,10.59],[-6.48,10.56],[-6.42,10.56],[-6.41,10.57],[-6.43,10.65],[-6.43,10.67],[-6.4,10.69],[-6.37,10.69],[-6.26,10.72],[-6.25,10.72],[-6.23,10.6],[-6.24,10.56],[-6.22,10.48],[-6.19,10.4],[-6.19,10.37],[-6.21,10.32],[-6.24,10.28],[-6.24,10.26],[-6.2,10.23],[-6.12,10.2],[-6.03,10.19],[-5.99,10.24],[-5.94,10.28],[-5.91,10.31],[-5.9,10.35],[-5.84,10.39],[-5.69,10.43],[-5.56,10.44],[-5.52,10.43]],[[-3.09,5.13],[-3.11,5.09],[-3.25,5.11],[-3.21,5.15],[-3.09,5.13]]]},{"n":"Cameroon","r":[[[15.48,7.52],[15.38,7.36],[15.25,7.26],[15.21,7.21],[15.19,7.13],[15.16,7.06],[15.09,6.91],[15.03,6.78],[14.98,6.75],[14.86,6.56],[14.78,6.37],[14.76,6.32],[14.74,6.28],[14.7,6.25],[14.56,6.19],[14.51,6.16],[14.48,6.13],[14.44,6.09],[14.43,6.04],[14.46,5.97],[14.5,5.92],[14.54,5.91],[14.58,5.92],[14.6,5.88],[14.62,5.87],[14.62,5.5],[14.58,5.44],[14.58,5.41],[14.57,5.35],[14.56,5.28],[14.57,5.25],[14.6,5.23],[14.64,5.18],[14.66,5.07],[14.71,4.67],[14.73,4.6],[14.77,4.56],[14.89,4.47],[15.02,4.36],[15.06,4.28],[15.09,4.16],[15.14,4.07],[15.14,4.04],[15.12,4.02],[15.07,4.02],[15.03,4.02],[15.06,3.95],[15.13,3.83],[15.24,3.7],[15.36,3.57],[15.46,3.46],[15.58,3.33],[15.68,3.23],[15.78,3.13],[15.85,3.1],[15.9,3.1],[15.93,3.08],[15.96,3.03],[16.01,2.98],[16.06,2.91],[16.08,2.84],[16.06,2.77],[16.08,2.68],[16.08,2.67],[16.1,2.63],[16.1,2.6],[16.11,2.47],[16.14,2.36],[16.18,2.27],[16.18,2.26],[16.18,2.2],[16.12,2.17],[16.08,2.11],[16.07,2.02],[16.09,1.92],[16.13,1.8],[16.14,1.72],[16.12,1.71],[16.09,1.69],[16.06,1.68],[15.98,1.76],[15.88,1.82],[15.74,1.91],[15.6,1.95],[15.42,1.96],[15.34,1.94],[15.28,1.98],[15.2,2.02],[15.16,2.04],[15.1,2.0],[15.06,2.0],[15.01,2.01],[14.9,2.01],[14.89,2.07],[14.88,2.08],[14.76,2.08],[14.73,2.12],[14.71,2.12],[14.67,2.13],[14.58,2.2],[14.48,2.15],[14.29,2.16],[14.03,2.16],[13.77,2.16],[13.53,2.16],[13.29,2.16],[13.27,2.22],[13.22,2.26],[13.13,2.26],[12.87,2.25],[12.67,2.26],[12.6,2.27],[12.53,2.28],[12.36,2.3],[12.15,2.28],[12.11,2.29],[11.94,2.29],[11.56,2.3],[11.35,2.3],[11.35,2.26],[11.34,2.23],[11.33,2.17],[11.1,2.17],[10.79,2.17],[10.5,2.17],[10.31,2.17],[9.98,2.17],[9.87,2.21],[9.84,2.24],[9.83,2.28],[9.83,2.3],[9.8,2.3],[9.82,2.54],[9.87,2.73],[9.89,2.92],[9.95,3.08],[9.92,3.24],[9.88,3.31],[9.67,3.54],[9.77,3.62],[9.64,3.61],[9.62,3.7],[9.56,3.8],[9.59,3.81],[9.63,3.87],[9.74,3.85],[9.74,3.88],[9.64,3.97],[9.65,4.01],[9.69,4.06],[9.67,4.08],[9.6,4.03],[9.55,4.03],[9.51,4.06],[9.48,4.07],[9.5,4.0],[9.46,3.94],[9.43,3.92],[9.36,3.93],[9.31,3.94],[9.3,3.97],[9.25,4.0],[9.11,4.04],[9.0,4.09],[8.98,4.23],[8.93,4.29],[8.91,4.36],[8.9,4.44],[8.92,4.55],[8.89,4.57],[8.86,4.58],[8.81,4.57],[8.76,4.58],[8.71,4.65],[8.66,4.67],[8.69,4.55],[8.66,4.52],[8.57,4.53],[8.54,4.57],[8.53,4.61],[8.57,4.75],[8.56,4.76],[8.59,4.83],[8.64,4.93],[8.72,5.05],[8.8,5.2],[8.86,5.46],[8.9,5.63],[8.94,5.78],[9.0,5.92],[9.06,6.01],[9.24,6.19],[9.37,6.32],[9.44,6.37],[9.49,6.42],[9.57,6.47],[9.66,6.53],[9.73,6.65],[9.78,6.76],[9.82,6.78],[9.87,6.8],[10.04,6.92],[10.14,7.0],[10.17,6.96],[10.19,6.91],[10.21,6.89],[10.29,6.88],[10.41,6.88],[10.48,6.89],[10.52,6.93],[10.56,7.04],[10.58,7.06],[10.61,7.06],[10.74,6.99],[10.85,6.88],[10.95,6.78],[11.01,6.74],[11.03,6.7],[11.08,6.51],[11.11,6.46],[11.15,6.44],[11.24,6.45],[11.32,6.48],[11.4,6.53],[11.48,6.6],[11.53,6.66],[11.55,6.7],[11.56,6.85],[11.58,6.89],[11.66,6.95],[11.79,7.06],[11.86,7.12],[11.85,7.14],[11.81,7.2],[11.77,7.27],[11.81,7.35],[11.85,7.4],[12.02,7.59],[12.02,7.65],[12.03,7.73],[12.16,7.94],[12.23,8.23],[12.23,8.28],[12.31,8.42],[12.4,8.6],[12.58,8.62],[12.65,8.67],[12.73,8.75],[12.78,8.82],[12.81,8.89],[12.82,9.02],[12.86,9.17],[12.88,9.3],[12.93,9.43],[13.02,9.49],[13.18,9.54],[13.2,9.56],[13.22,9.65],[13.24,9.81],[13.24,9.92],[13.25,9.96],[13.27,10.04],[13.41,10.17],[13.48,10.38],[13.54,10.61],[13.7,10.87],[13.89,11.14],[13.98,11.21],[14.06,11.25],[14.14,11.25],[14.2,11.27],[14.41,11.4],[14.5,11.45],[14.56,11.49],[14.58,11.53],[14.58,11.59],[14.56,11.73],[14.6,11.83],[14.62,11.99],[14.63,12.11],[14.62,12.15],[14.59,12.21],[14.58,12.22],[14.52,12.3],[14.42,12.34],[14.27,12.36],[14.2,12.38],[14.18,12.45],[14.18,12.48],[14.17,12.52],[14.16,12.61],[14.06,13.08],[14.24,13.08],[14.46,13.02],[14.52,12.98],[14.54,12.82],[14.62,12.73],[14.76,12.66],[14.85,12.5],[14.88,12.27],[14.96,12.13],[14.97,12.11],[15.06,11.91],[15.08,11.85],[15.09,11.72],[15.08,11.64],[15.12,11.54],[15.06,11.37],[15.04,11.26],[15.03,11.11],[15.07,10.85],[15.13,10.65],[15.2,10.48],[15.28,10.36],[15.4,10.22],[15.53,10.09],[15.65,10.01],[15.54,9.96],[15.32,9.95],[15.19,9.98],[15.13,9.98],[15.07,9.97],[14.84,9.94],[14.6,9.95],[14.38,9.99],[14.24,9.98],[14.14,9.9],[14.06,9.78],[13.98,9.69],[14.0,9.59],[14.06,9.53],[14.18,9.41],[14.28,9.29],[14.33,9.2],[14.54,9.03],[14.73,8.87],[14.77,8.84],[14.83,8.81],[14.86,8.8],[14.97,8.71],[15.12,8.56],[15.25,8.32],[15.35,8.08],[15.44,7.85],[15.48,7.81],[15.55,7.79],[15.56,7.74],[15.55,7.66],[15.53,7.6],[15.48,7.52]]]},{"n":"Democratic Republic of the Congo","r":[[[23.97,-10.87],[23.93,-10.89],[23.91,-10.94],[23.9,-10.98],[23.83,-11.01],[23.7,-11.01],[23.56,-10.98],[23.46,-10.97],[23.4,-10.98],[23.16,-11.07],[23.08,-11.09],[22.81,-11.08],[22.67,-11.06],[22.56,-11.06],[22.49,-11.09],[22.39,-11.16],[22.31,-11.2],[22.28,-11.19],[22.26,-11.16],[22.23,-11.12],[22.22,-11.01],[22.18,-10.89],[22.2,-10.83],[22.28,-10.78],[22.31,-10.69],[22.28,-10.55],[22.28,-10.45],[22.3,-10.4],[22.27,-10.26],[22.2,-10.04],[22.09,-9.86],[21.95,-9.73],[21.86,-9.59],[21.81,-9.47],[21.83,-9.17],[21.87,-8.9],[21.91,-8.69],[21.9,-8.34],[21.8,-8.11],[21.78,-7.87],[21.83,-7.6],[21.84,-7.42],[21.81,-7.33],[21.78,-7.31],[21.75,-7.31],[21.51,-7.3],[21.19,-7.28],[20.91,-7.28],[20.61,-7.28],[20.56,-7.24],[20.54,-7.18],[20.54,-7.12],[20.6,-6.94],[20.59,-6.92],[20.48,-6.92],[20.19,-6.95],[20.0,-6.98],[19.88,-6.99],[19.66,-7.04],[19.53,-7.14],[19.48,-7.28],[19.49,-7.39],[19.48,-7.47],[19.42,-7.56],[19.37,-7.66],[19.37,-7.71],[19.34,-7.97],[19.14,-8.0],[18.94,-8.0],[18.9,-8.0],[18.65,-7.94],[18.56,-7.94],[18.48,-7.97],[18.33,-8.0],[18.19,-8.02],[18.05,-8.1],[18.01,-8.11],[17.91,-8.07],[17.78,-8.07],[17.64,-8.09],[17.58,-8.1],[17.54,-8.08],[17.41,-7.88],[17.25,-7.62],[17.16,-7.46],[17.12,-7.42],[17.06,-7.36],[16.98,-7.26],[16.95,-7.16],[16.97,-7.06],[16.92,-6.93],[16.81,-6.77],[16.74,-6.62],[16.71,-6.47],[16.7,-6.35],[16.72,-6.24],[16.7,-6.16],[16.64,-6.11],[16.61,-6.05],[16.59,-6.03],[16.54,-5.97],[16.43,-5.9],[16.32,-5.87],[16.06,-5.86],[15.73,-5.86],[15.42,-5.87],[15.09,-5.87],[14.75,-5.88],[14.66,-5.89],[14.4,-5.89],[14.19,-5.88],[14.11,-5.87],[13.98,-5.86],[13.76,-5.86],[13.65,-5.86],[13.37,-5.86],[13.35,-5.86],[13.3,-5.88],[13.18,-5.86],[13.07,-5.86],[13.0,-5.84],[12.86,-5.85],[12.79,-5.88],[12.68,-5.96],[12.51,-6.0],[12.45,-6.0],[12.41,-5.99],[12.32,-5.9],[12.24,-5.81],[12.21,-5.76],[12.26,-5.75],[12.39,-5.73],[12.48,-5.72],[12.5,-5.7],[12.52,-5.42],[12.52,-5.15],[12.49,-5.11],[12.45,-5.09],[12.45,-5.07],[12.5,-5.04],[12.57,-5.0],[12.6,-4.98],[12.67,-4.91],[12.83,-4.74],[12.95,-4.7],[13.06,-4.65],[13.07,-4.63],[13.09,-4.6],[13.14,-4.6],[13.15,-4.62],[13.18,-4.66],[13.22,-4.71],[13.3,-4.77],[13.38,-4.83],[13.41,-4.84],[13.48,-4.8],[13.55,-4.76],[13.66,-4.72],[13.69,-4.69],[13.7,-4.62],[13.71,-4.54],[13.72,-4.45],[13.74,-4.44],[13.78,-4.43],[13.85,-4.46],[13.88,-4.48],[13.94,-4.48],[13.98,-4.46],[14.05,-4.42],[14.13,-4.4],[14.23,-4.36],[14.32,-4.3],[14.36,-4.3],[14.4,-4.37],[14.44,-4.42],[14.45,-4.45],[14.41,-4.51],[14.37,-4.59],[14.4,-4.68],[14.41,-4.78],[14.41,-4.83],[14.44,-4.85],[14.46,-4.86],[14.49,-4.85],[14.56,-4.86],[14.63,-4.89],[14.71,-4.88],[14.78,-4.85],[14.91,-4.71],[15.11,-4.46],[15.27,-4.31],[15.39,-4.24],[15.48,-4.17],[15.53,-4.09],[15.6,-4.03],[15.75,-3.99],[15.87,-3.93],[15.99,-3.77],[16.15,-3.46],[16.19,-3.19],[16.22,-3.03],[16.2,-2.46],[16.19,-2.28],[16.22,-2.18],[16.27,-2.11],[16.43,-1.96],[16.54,-1.84],[16.62,-1.7],[16.78,-1.38],[16.85,-1.27],[16.88,-1.23],[16.97,-1.14],[17.11,-1.06],[17.28,-1.0],[17.54,-0.78],[17.75,-0.55],[17.72,-0.28],[17.77,-0.05],[17.89,0.23],[17.93,0.54],[17.89,0.86],[17.9,1.12],[18.01,1.42],[18.06,1.53],[18.07,1.72],[18.07,2.01],[18.21,2.41],[18.34,2.66],[18.49,2.92],[18.55,3.09],[18.62,3.3],[18.61,3.48],[18.6,3.68],[18.63,3.95],[18.62,4.12],[18.57,4.26],[18.59,4.35],[18.7,4.38],[18.83,4.52],[19.07,4.89],[19.32,5.07],[19.5,5.13],[19.69,5.12],[19.81,5.09],[19.86,5.03],[20.0,4.94],[20.23,4.83],[20.39,4.69],[20.49,4.54],[20.56,4.46],[20.65,4.44],[20.79,4.45],[20.96,4.41],[21.13,4.33],[21.23,4.3],[21.27,4.32],[21.35,4.31],[21.54,4.24],[21.69,4.28],[21.91,4.25],[22.42,4.13],[22.45,4.16],[22.46,4.16],[22.51,4.21],[22.62,4.45],[22.71,4.59],[22.76,4.65],[22.86,4.72],[22.99,4.74],[23.12,4.74],[23.22,4.7],[23.31,4.66],[23.42,4.66],[23.52,4.7],[23.68,4.77],[23.85,4.82],[23.99,4.87],[24.23,4.95],[24.32,4.99],[24.44,5.01],[24.77,4.93],[24.98,4.98],[25.07,4.97],[25.25,5.02],[25.28,5.06],[25.4,5.26],[25.53,5.31],[25.71,5.28],[25.82,5.25],[26.17,5.17],[26.63,5.09],[26.77,5.07],[26.82,5.06],[26.87,5.08],[27.02,5.18],[27.07,5.2],[27.11,5.2],[27.4,5.11],[27.44,5.04],[27.49,4.97],[27.66,4.85],[27.72,4.78],[27.76,4.7],[27.79,4.64],[27.84,4.6],[27.92,4.57],[27.98,4.53],[28.02,4.48],[28.08,4.42],[28.19,4.35],[28.25,4.35],[28.31,4.34],[28.37,4.32],[28.43,4.32],[28.52,4.37],[28.64,4.45],[28.73,4.5],[28.94,4.49],[29.06,4.45],[29.15,4.39],[29.22,4.39],[29.38,4.5],[29.47,4.61],[29.55,4.64],[29.68,4.59],[29.78,4.48],[29.87,4.33],[29.93,4.27],[30.02,4.18],[30.19,3.98],[30.42,3.88],[30.51,3.84],[30.54,3.79],[30.55,3.72],[30.56,3.65],[30.59,3.62],[30.65,3.63],[30.7,3.64],[30.76,3.62],[30.8,3.57],[30.82,3.53],[30.84,3.49],[30.9,3.46],[30.91,3.41],[30.87,3.34],[30.83,3.28],[30.78,3.16],[30.75,3.04],[30.79,3.0],[30.82,2.97],[30.84,2.93],[30.85,2.89],[30.85,2.85],[30.77,2.68],[30.73,2.53],[30.73,2.46],[30.83,2.4],[30.96,2.4],[31.0,2.37],[31.05,2.32],[31.08,2.29],[31.14,2.29],[31.18,2.27],[31.19,2.23],[31.24,2.19],[31.27,2.15],[31.26,2.09],[31.25,2.04],[31.16,1.92],[30.94,1.68],[30.48,1.24],[30.48,1.24],[30.32,1.19],[30.24,1.1],[30.18,0.97],[30.05,0.86],[29.94,0.82],[29.93,0.79],[29.92,0.67],[29.93,0.5],[29.89,0.42],[29.81,0.26],[29.78,0.17],[29.75,0.15],[29.72,0.1],[29.7,-0.06],[29.68,-0.11],[29.63,-0.44],[29.65,-0.54],[29.61,-0.69],[29.61,-0.78],[29.59,-0.89],[29.56,-0.98],[29.56,-1.12],[29.58,-1.36],[29.58,-1.39],[29.54,-1.41],[29.47,-1.47],[29.4,-1.51],[29.35,-1.52],[29.27,-1.62],[29.2,-1.72],[29.14,-1.82],[29.13,-1.86],[29.14,-1.98],[29.15,-2.13],[29.13,-2.2],[29.11,-2.23],[28.99,-2.31],[28.91,-2.37],[28.88,-2.4],[28.86,-2.45],[28.89,-2.56],[28.89,-2.64],[28.92,-2.68],[29.01,-2.72],[29.01,-2.76],[29.02,-2.8],[29.06,-2.85],[29.15,-2.96],[29.22,-3.05],[29.23,-3.14],[29.21,-3.28],[29.21,-3.36],[29.22,-3.48],[29.22,-3.68],[29.21,-3.83],[29.22,-3.91],[29.33,-4.1],[29.38,-4.3],[29.4,-4.45],[29.4,-4.5],[29.37,-4.67],[29.33,-4.84],[29.32,-4.9],[29.34,-4.98],[29.42,-5.18],[29.48,-5.32],[29.5,-5.4],[29.54,-5.5],[29.59,-5.65],[29.61,-5.72],[29.6,-5.78],[29.49,-5.97],[29.48,-6.02],[29.51,-6.17],[29.54,-6.31],[29.59,-6.39],[29.71,-6.62],[29.8,-6.69],[29.96,-6.8],[30.11,-6.92],[30.16,-6.97],[30.21,-7.04],[30.31,-7.2],[30.37,-7.34],[30.41,-7.46],[30.49,-7.63],[30.56,-7.78],[30.65,-7.97],[30.72,-8.1],[30.75,-8.19],[30.58,-8.22],[30.33,-8.26],[30.05,-8.3],[29.77,-8.34],[29.48,-8.39],[29.22,-8.43],[28.97,-8.46],[28.9,-8.49],[28.93,-8.59],[28.92,-8.7],[28.87,-8.79],[28.79,-8.89],[28.76,-8.93],[28.68,-9.01],[28.62,-9.07],[28.48,-9.17],[28.4,-9.22],[28.4,-9.28],[28.54,-9.51],[28.6,-9.68],[28.63,-9.83],[28.63,-9.92],[28.62,-10.1],[28.62,-10.31],[28.61,-10.4],[28.65,-10.55],[28.64,-10.67],[28.54,-10.8],[28.52,-10.93],[28.47,-11.11],[28.4,-11.35],[28.36,-11.48],[28.38,-11.57],[28.41,-11.62],[28.43,-11.7],[28.48,-11.81],[28.54,-11.88],[28.57,-11.91],[28.77,-12.05],[28.85,-12.12],[28.97,-12.26],[29.06,-12.35],[29.19,-12.37],[29.34,-12.4],[29.43,-12.43],[29.49,-12.42],[29.5,-12.39],[29.5,-12.32],[29.49,-12.27],[29.51,-12.23],[29.56,-12.2],[29.69,-12.2],[29.75,-12.16],[29.8,-12.16],[29.8,-12.31],[29.8,-12.45],[29.8,-12.63],[29.8,-12.83],[29.8,-12.99],[29.8,-13.17],[29.8,-13.37],[29.8,-13.39],[29.78,-13.44],[29.72,-13.45],[29.65,-13.41],[29.65,-13.37],[29.63,-13.3],[29.6,-13.26],[29.55,-13.25],[29.48,-13.27],[29.38,-13.32],[29.25,-13.37],[29.2,-13.4],[29.11,-13.4],[29.01,-13.37],[28.94,-13.31],[28.92,-13.21],[28.86,-13.12],[28.77,-12.98],[28.73,-12.93],[28.67,-12.86],[28.62,-12.85],[28.55,-12.84],[28.51,-12.74],[28.47,-12.62],[28.45,-12.58],[28.41,-12.52],[28.36,-12.48],[28.24,-12.43],[28.07,-12.37],[27.86,-12.28],[27.76,-12.28],[27.64,-12.27],[27.57,-12.23],[27.53,-12.2],[27.49,-12.08],[27.42,-11.94],[27.24,-11.78],[27.2,-11.61],[27.16,-11.58],[27.1,-11.59],[27.05,-11.62],[27.03,-11.66],[26.98,-11.82],[26.95,-11.9],[26.93,-11.92],[26.89,-11.94],[26.82,-11.97],[26.73,-11.98],[26.6,-11.97],[26.43,-11.95],[26.34,-11.93],[26.1,-11.9],[26.03,-11.89],[25.93,-11.86],[25.85,-11.82],[25.62,-11.74],[25.51,-11.75],[25.46,-11.7],[25.41,-11.67],[25.35,-11.62],[25.32,-11.55],[25.28,-11.4],[25.29,-11.33],[25.32,-11.24],[25.29,-11.21],[25.25,-11.21],[25.18,-11.24],[25.08,-11.26],[24.88,-11.3],[24.81,-11.32],[24.73,-11.34],[24.67,-11.35],[24.52,-11.44],[24.47,-11.45],[24.38,-11.42],[24.34,-11.37],[24.38,-11.32],[24.4,-11.26],[24.37,-11.13],[24.32,-11.07],[24.19,-11.03],[24.14,-11.03],[24.12,-10.96],[24.08,-10.89],[24.0,-10.88],[23.97,-10.87]]]},{"n":"Republic of the Congo","r":[[[13.07,-4.63],[13.05,-4.62],[12.97,-4.55],[12.88,-4.45],[12.85,-4.43],[12.8,-4.43],[12.72,-4.47],[12.64,-4.53],[12.5,-4.59],[12.38,-4.62],[12.37,-4.66],[12.35,-4.72],[12.31,-4.77],[12.2,-4.78],[12.17,-4.84],[12.08,-4.95],[12.02,-5.0],[12.0,-4.98],[11.97,-4.95],[11.89,-4.87],[11.82,-4.76],[11.8,-4.71],[11.78,-4.68],[11.78,-4.57],[11.67,-4.43],[11.39,-4.2],[11.36,-4.13],[11.13,-3.92],[11.19,-3.76],[11.23,-3.69],[11.29,-3.64],[11.5,-3.52],[11.54,-3.52],[11.69,-3.68],[11.73,-3.69],[11.79,-3.69],[11.85,-3.7],[11.88,-3.67],[11.88,-3.63],[11.84,-3.58],[11.83,-3.53],[11.86,-3.48],[11.88,-3.42],[11.93,-3.35],[11.93,-3.32],[11.89,-3.28],[11.78,-3.23],[11.72,-3.18],[11.69,-3.13],[11.71,-3.06],[11.76,-3.01],[11.76,-2.98],[11.71,-2.94],[11.68,-2.89],[11.64,-2.86],[11.54,-2.84],[11.56,-2.77],[11.59,-2.67],[11.6,-2.6],[11.58,-2.4],[11.58,-2.36],[11.61,-2.34],[11.67,-2.36],[11.73,-2.39],[11.89,-2.35],[11.95,-2.34],[12.0,-2.38],[12.06,-2.41],[12.45,-2.33],[12.45,-2.25],[12.48,-2.17],[12.48,-2.11],[12.46,-2.08],[12.44,-2.05],[12.43,-1.99],[12.43,-1.93],[12.47,-1.9],[12.59,-1.83],[12.63,-1.83],[12.71,-1.87],[12.79,-1.93],[12.86,-2.06],[12.91,-2.18],[12.99,-2.31],[13.16,-2.37],[13.36,-2.4],[13.46,-2.4],[13.62,-2.28],[13.71,-2.19],[13.73,-2.14],[13.78,-2.16],[13.84,-2.28],[13.88,-2.33],[13.89,-2.37],[13.86,-2.43],[13.89,-2.47],[13.99,-2.49],[14.09,-2.47],[14.13,-2.42],[14.2,-2.35],[14.2,-2.3],[14.16,-2.27],[14.16,-2.22],[14.2,-2.18],[14.24,-2.08],[14.25,-2.0],[14.29,-1.95],[14.36,-1.92],[14.38,-1.89],[14.42,-1.71],[14.4,-1.65],[14.4,-1.59],[14.45,-1.53],[14.46,-1.41],[14.44,-1.23],[14.42,-1.1],[14.41,-0.97],[14.44,-0.8],[14.48,-0.62],[14.47,-0.57],[14.42,-0.52],[14.36,-0.47],[14.21,-0.43],[14.15,-0.36],[14.1,-0.29],[14.07,-0.27],[13.9,-0.24],[13.86,-0.2],[13.88,-0.09],[13.89,0.08],[13.88,0.19],[13.92,0.28],[13.95,0.35],[14.03,0.43],[14.07,0.51],[14.09,0.54],[14.23,0.55],[14.28,0.59],[14.32,0.62],[14.34,0.67],[14.39,0.76],[14.43,0.81],[14.44,0.85],[14.43,0.9],[14.39,1.0],[14.33,1.09],[14.3,1.12],[14.24,1.32],[14.18,1.37],[14.07,1.4],[13.85,1.42],[13.72,1.38],[13.52,1.31],[13.37,1.27],[13.27,1.24],[13.22,1.25],[13.19,1.28],[13.23,1.31],[13.25,1.37],[13.22,1.45],[13.18,1.54],[13.16,1.65],[13.17,1.79],[13.21,1.92],[13.29,2.09],[13.29,2.16],[13.53,2.16],[13.77,2.16],[14.03,2.16],[14.29,2.16],[14.48,2.15],[14.58,2.2],[14.67,2.13],[14.71,2.12],[14.73,2.12],[14.76,2.08],[14.88,2.08],[14.89,2.07],[14.9,2.01],[15.01,2.01],[15.06,2.0],[15.1,2.0],[15.16,2.04],[15.2,2.02],[15.28,1.98],[15.34,1.94],[15.42,1.96],[15.6,1.95],[15.74,1.91],[15.88,1.82],[15.98,1.76],[16.06,1.68],[16.09,1.69],[16.12,1.71],[16.14,1.72],[16.13,1.8],[16.09,1.92],[16.07,2.02],[16.08,2.11],[16.12,2.17],[16.18,2.2],[16.18,2.26],[16.18,2.27],[16.25,2.41],[16.32,2.54],[16.4,2.7],[16.47,2.83],[16.46,2.9],[16.47,2.99],[16.48,3.1],[16.48,3.17],[16.5,3.21],[16.54,3.37],[16.57,3.46],[16.61,3.51],[16.67,3.54],[16.76,3.54],[17.0,3.56],[17.22,3.6],[17.3,3.62],[17.44,3.68],[17.49,3.69],[17.54,3.66],[17.81,3.58],[17.88,3.55],[17.91,3.56],[17.95,3.55],[18.01,3.55],[18.07,3.56],[18.11,3.55],[18.16,3.5],[18.19,3.51],[18.24,3.54],[18.32,3.58],[18.47,3.62],[18.5,3.6],[18.55,3.51],[18.61,3.48],[18.62,3.3],[18.55,3.09],[18.49,2.92],[18.34,2.66],[18.21,2.41],[18.07,2.01],[18.07,1.72],[18.06,1.53],[18.01,1.42],[17.9,1.12],[17.89,0.86],[17.93,0.54],[17.89,0.23],[17.77,-0.05],[17.72,-0.28],[17.75,-0.55],[17.54,-0.78],[17.28,-1.0],[17.11,-1.06],[16.97,-1.14],[16.88,-1.23],[16.85,-1.27],[16.78,-1.38],[16.62,-1.7],[16.54,-1.84],[16.43,-1.96],[16.27,-2.11],[16.22,-2.18],[16.19,-2.28],[16.2,-2.46],[16.22,-3.03],[16.19,-3.19],[16.15,-3.46],[15.99,-3.77],[15.87,-3.93],[15.75,-3.99],[15.6,-4.03],[15.53,-4.09],[15.48,-4.17],[15.39,-4.24],[15.27,-4.31],[15.11,-4.46],[14.91,-4.71],[14.78,-4.85],[14.71,-4.88],[14.63,-4.89],[14.56,-4.86],[14.49,-4.85],[14.46,-4.86],[14.44,-4.85],[14.41,-4.83],[14.41,-4.78],[14.4,-4.68],[14.37,-4.59],[14.41,-4.51],[14.45,-4.45],[14.44,-4.42],[14.4,-4.37],[14.36,-4.3],[14.32,-4.3],[14.23,-4.36],[14.13,-4.4],[14.05,-4.42],[13.98,-4.46],[13.94,-4.48],[13.88,-4.48],[13.85,-4.46],[13.78,-4.43],[13.74,-4.44],[13.72,-4.45],[13.71,-4.54],[13.7,-4.62],[13.69,-4.69],[13.66,-4.72],[13.55,-4.76],[13.48,-4.8],[13.41,-4.84],[13.38,-4.83],[13.3,-4.77],[13.22,-4.71],[13.18,-4.66],[13.15,-4.62],[13.14,-4.6],[13.09,-4.6],[13.07,-4.63]]]},{"n":"Cook Islands","r":[[[-159.74,-21.25],[-159.77,-21.25],[-159.81,-21.24],[-159.84,-21.24],[-159.84,-21.23],[-159.83,-21.2],[-159.81,-21.19],[-159.77,-21.19],[-159.74,-21.21],[-159.74,-21.24],[-159.74,-21.25]]]},{"n":"Colombia","r":[[[-66.88,1.22],[-67.07,1.18],[-67.08,1.19],[-67.09,1.21],[-67.09,1.4],[-67.09,1.62],[-67.12,1.7],[-67.21,1.84],[-67.32,2.03],[-67.35,2.09],[-67.4,2.12],[-67.46,2.12],[-67.5,2.11],[-67.56,2.07],[-67.61,2.04],[-67.71,1.92],[-67.82,1.79],[-67.88,1.76],[-67.94,1.75],[-67.99,1.75],[-68.03,1.79],[-68.08,1.86],[-68.13,1.96],[-68.19,1.99],[-68.22,1.96],[-68.24,1.9],[-68.26,1.85],[-68.21,1.77],[-68.18,1.72],[-68.24,1.72],[-68.44,1.72],[-68.68,1.72],[-68.91,1.72],[-69.12,1.72],[-69.32,1.72],[-69.39,1.73],[-69.47,1.76],[-69.54,1.77],[-69.58,1.77],[-69.65,1.74],[-69.74,1.73],[-69.8,1.71],[-69.85,1.71],[-69.85,1.54],[-69.85,1.31],[-69.85,1.06],[-69.8,1.08],[-69.75,1.08],[-69.72,1.06],[-69.62,1.07],[-69.57,1.07],[-69.52,1.06],[-69.47,1.06],[-69.44,1.04],[-69.4,1.04],[-69.36,1.06],[-69.31,1.05],[-69.26,1.02],[-69.22,0.96],[-69.19,0.9],[-69.16,0.86],[-69.17,0.8],[-69.17,0.75],[-69.18,0.71],[-69.16,0.69],[-69.15,0.66],[-69.16,0.64],[-69.17,0.64],[-69.21,0.63],[-69.25,0.63],[-69.28,0.63],[-69.31,0.65],[-69.33,0.66],[-69.36,0.65],[-69.39,0.67],[-69.42,0.7],[-69.47,0.73],[-69.53,0.72],[-69.56,0.7],[-69.6,0.68],[-69.64,0.66],[-69.67,0.67],[-69.72,0.65],[-69.76,0.63],[-69.81,0.61],[-69.86,0.6],[-69.93,0.59],[-69.99,0.59],[-70.05,0.58],[-70.06,0.45],[-70.07,0.19],[-70.07,0.02],[-70.07,-0.14],[-70.04,-0.2],[-69.92,-0.32],[-69.83,-0.38],[-69.75,-0.45],[-69.67,-0.48],[-69.63,-0.51],[-69.61,-0.55],[-69.6,-0.6],[-69.59,-0.64],[-69.6,-0.68],[-69.62,-0.72],[-69.61,-0.76],[-69.58,-0.8],[-69.57,-0.84],[-69.55,-0.88],[-69.54,-0.92],[-69.52,-0.95],[-69.49,-0.97],[-69.45,-1.0],[-69.44,-1.03],[-69.45,-1.06],[-69.45,-1.09],[-69.41,-1.15],[-69.4,-1.19],[-69.42,-1.25],[-69.43,-1.42],[-69.48,-1.62],[-69.51,-1.77],[-69.55,-2.02],[-69.6,-2.31],[-69.67,-2.67],[-69.73,-3.02],[-69.79,-3.35],[-69.85,-3.66],[-69.91,-4.0],[-69.95,-4.2],[-69.97,-4.24],[-70.02,-4.16],[-70.09,-4.09],[-70.17,-4.05],[-70.2,-4.0],[-70.24,-3.88],[-70.3,-3.84],[-70.34,-3.81],[-70.38,-3.82],[-70.42,-3.85],[-70.49,-3.87],[-70.53,-3.87],[-70.71,-3.79],[-70.74,-3.78],[-70.62,-3.6],[-70.42,-3.29],[-70.29,-3.09],[-70.15,-2.86],[-70.07,-2.75],[-70.06,-2.73],[-70.06,-2.7],[-70.1,-2.66],[-70.16,-2.64],[-70.24,-2.61],[-70.29,-2.55],[-70.36,-2.53],[-70.42,-2.49],[-70.52,-2.45],[-70.58,-2.42],[-70.65,-2.41],[-70.71,-2.34],[-70.91,-2.22],[-70.97,-2.21],[-71.03,-2.23],[-71.11,-2.25],[-71.2,-2.31],[-71.3,-2.33],[-71.4,-2.33],[-71.45,-2.29],[-71.5,-2.28],[-71.56,-2.22],[-71.67,-2.18],[-71.75,-2.15],[-71.8,-2.17],[-71.87,-2.23],[-71.93,-2.29],[-71.98,-2.33],[-72.05,-2.32],[-72.14,-2.38],[-72.22,-2.4],[-72.3,-2.41],[-72.4,-2.43],[-72.5,-2.4],[-72.59,-2.37],[-72.63,-2.35],[-72.66,-2.36],[-72.71,-2.39],[-72.81,-2.41],[-72.89,-2.41],[-72.94,-2.39],[-72.99,-2.34],[-73.07,-2.31],[-73.15,-2.28],[-73.17,-2.21],[-73.16,-2.16],[-73.13,-2.08],[-73.15,-2.0],[-73.18,-1.88],[-73.2,-1.83],[-73.22,-1.79],[-73.27,-1.77],[-73.35,-1.78],[-73.44,-1.74],[-73.5,-1.69],[-73.53,-1.64],[-73.49,-1.54],[-73.52,-1.45],[-73.58,-1.4],[-73.61,-1.32],[-73.66,-1.25],[-73.74,-1.21],[-73.81,-1.22],[-73.86,-1.2],[-73.93,-1.13],[-73.99,-1.1],[-74.05,-1.03],[-74.18,-1.0],[-74.25,-0.97],[-74.28,-0.93],[-74.33,-0.85],[-74.33,-0.81],[-74.35,-0.77],[-74.37,-0.69],[-74.42,-0.58],[-74.47,-0.52],[-74.51,-0.47],[-74.56,-0.43],[-74.62,-0.37],[-74.69,-0.34],[-74.76,-0.3],[-74.78,-0.24],[-74.8,-0.2],[-74.84,-0.2],[-74.89,-0.2],[-74.95,-0.19],[-75.0,-0.16],[-75.05,-0.12],[-75.14,-0.05],[-75.18,-0.04],[-75.22,-0.04],[-75.28,-0.11],[-75.46,-0.04],[-75.62,0.06],[-75.78,0.09],[-75.88,0.15],[-75.97,0.25],[-76.03,0.31],[-76.07,0.35],[-76.27,0.44],[-76.31,0.45],[-76.39,0.4],[-76.41,0.38],[-76.42,0.3],[-76.43,0.26],[-76.49,0.24],[-76.6,0.24],[-76.68,0.27],[-76.73,0.27],[-76.74,0.25],[-76.77,0.24],[-76.83,0.25],[-76.92,0.27],[-77.0,0.3],[-77.11,0.36],[-77.17,0.35],[-77.29,0.36],[-77.4,0.39],[-77.42,0.42],[-77.47,0.64],[-77.48,0.65],[-77.53,0.66],[-77.6,0.69],[-77.65,0.72],[-77.67,0.78],[-77.7,0.84],[-77.83,0.83],[-78.04,0.9],[-78.18,0.97],[-78.31,1.05],[-78.51,1.2],[-78.59,1.24],[-78.68,1.28],[-78.74,1.36],[-78.83,1.43],[-78.86,1.46],[-78.89,1.52],[-79.03,1.62],[-78.96,1.75],[-78.79,1.85],[-78.58,1.77],[-78.55,1.92],[-78.63,2.06],[-78.62,2.31],[-78.59,2.36],[-78.53,2.42],[-78.46,2.47],[-78.42,2.48],[-78.34,2.46],[-78.3,2.51],[-78.12,2.49],[-78.07,2.51],[-78.03,2.54],[-77.99,2.57],[-77.93,2.63],[-77.9,2.7],[-77.87,2.73],[-77.81,2.72],[-77.81,2.75],[-77.78,2.79],[-77.67,2.88],[-77.67,2.92],[-77.7,3.01],[-77.69,3.04],[-77.63,3.05],[-77.56,3.08],[-77.52,3.16],[-77.47,3.23],[-77.42,3.34],[-77.36,3.35],[-77.32,3.47],[-77.24,3.59],[-77.08,3.91],[-77.13,3.91],[-77.17,3.86],[-77.21,3.87],[-77.26,3.89],[-77.25,4.04],[-77.28,4.06],[-77.36,3.94],[-77.43,4.06],[-77.43,4.13],[-77.4,4.2],[-77.41,4.25],[-77.52,4.21],[-77.52,4.26],[-77.45,4.3],[-77.41,4.35],[-77.35,4.4],[-77.33,4.47],[-77.31,4.59],[-77.29,4.72],[-77.31,4.78],[-77.34,4.84],[-77.37,5.08],[-77.36,5.22],[-77.37,5.32],[-77.4,5.42],[-77.53,5.54],[-77.32,5.68],[-77.25,5.78],[-77.34,6.0],[-77.47,6.18],[-77.47,6.29],[-77.44,6.27],[-77.4,6.28],[-77.36,6.5],[-77.37,6.58],[-77.44,6.69],[-77.53,6.69],[-77.6,6.84],[-77.65,6.87],[-77.68,6.96],[-77.8,7.14],[-77.9,7.23],[-77.83,7.44],[-77.76,7.48],[-77.74,7.54],[-77.77,7.67],[-77.76,7.7],[-77.75,7.71],[-77.73,7.71],[-77.71,7.69],[-77.66,7.63],[-77.62,7.56],[-77.59,7.54],[-77.54,7.57],[-77.35,7.71],[-77.36,7.75],[-77.35,7.84],[-77.28,7.91],[-77.22,7.93],[-77.2,7.97],[-77.21,8.03],[-77.28,8.19],[-77.35,8.27],[-77.39,8.35],[-77.41,8.43],[-77.48,8.5],[-77.45,8.57],[-77.39,8.64],[-77.37,8.66],[-77.34,8.64],[-77.26,8.49],[-77.13,8.4],[-76.99,8.25],[-76.94,8.15],[-76.89,8.13],[-76.85,8.09],[-76.87,8.06],[-76.91,8.03],[-76.92,7.97],[-76.9,7.94],[-76.87,7.92],[-76.79,7.93],[-76.74,8.0],[-76.77,8.31],[-76.82,8.46],[-76.87,8.51],[-76.92,8.57],[-76.89,8.62],[-76.8,8.64],[-76.69,8.69],[-76.28,8.99],[-76.14,9.27],[-76.03,9.37],[-75.91,9.43],[-75.76,9.42],[-75.64,9.45],[-75.6,9.54],[-75.64,9.66],[-75.68,9.73],[-75.64,9.83],[-75.59,9.99],[-75.6,10.13],[-75.54,10.21],[-75.56,10.24],[-75.64,10.17],[-75.71,10.14],[-75.67,10.2],[-75.55,10.33],[-75.49,10.53],[-75.45,10.61],[-75.28,10.73],[-75.25,10.78],[-75.12,10.87],[-74.92,11.06],[-74.84,11.11],[-74.45,10.99],[-74.33,11.0],[-74.35,10.97],[-74.41,10.97],[-74.49,10.93],[-74.52,10.86],[-74.46,10.79],[-74.4,10.77],[-74.35,10.81],[-74.3,10.95],[-74.22,11.11],[-74.2,11.27],[-74.14,11.32],[-74.06,11.34],[-73.91,11.31],[-73.8,11.28],[-73.68,11.27],[-73.31,11.3],[-72.72,11.71],[-72.45,11.8],[-72.28,11.89],[-72.17,12.06],[-72.14,12.19],[-72.06,12.24],[-71.97,12.24],[-71.93,12.27],[-71.92,12.31],[-71.71,12.42],[-71.6,12.43],[-71.49,12.43],[-71.26,12.34],[-71.16,12.16],[-71.14,12.05],[-71.28,11.92],[-71.32,11.86],[-71.36,11.85],[-71.4,11.82],[-71.54,11.77],[-71.72,11.73],[-71.96,11.67],[-72.01,11.6],[-72.25,11.2],[-72.45,11.11],[-72.52,11.05],[-72.57,10.98],[-72.69,10.84],[-72.74,10.73],[-72.87,10.49],[-72.94,10.2],[-72.97,10.03],[-73.01,9.79],[-73.06,9.67],[-73.14,9.55],[-73.22,9.44],[-73.3,9.32],[-73.36,9.23],[-73.37,9.19],[-73.34,9.17],[-73.19,9.19],[-73.14,9.22],[-73.06,9.26],[-73.01,9.24],[-72.96,9.14],[-72.9,9.12],[-72.85,9.14],[-72.8,9.11],[-72.73,8.85],[-72.67,8.63],[-72.53,8.49],[-72.42,8.38],[-72.39,8.29],[-72.36,8.15],[-72.36,8.09],[-72.39,8.05],[-72.45,7.97],[-72.46,7.81],[-72.47,7.76],[-72.48,7.61],[-72.47,7.52],[-72.44,7.45],[-72.39,7.42],[-72.3,7.39],[-72.21,7.37],[-72.16,7.25],[-72.08,7.1],[-72.01,7.03],[-71.89,6.99],[-71.81,7.01],[-71.62,7.03],[-71.46,7.03],[-71.22,6.99],[-71.13,6.99],[-71.01,6.99],[-70.81,7.08],[-70.74,7.09],[-70.66,7.08],[-70.54,7.04],[-70.47,7.01],[-70.39,6.97],[-70.27,6.95],[-70.19,6.95],[-70.13,6.95],[-70.1,6.94],[-69.9,6.7],[-69.74,6.49],[-69.59,6.32],[-69.44,6.13],[-69.43,6.12],[-69.36,6.15],[-69.31,6.14],[-69.27,6.1],[-69.19,6.12],[-69.09,6.18],[-68.94,6.2],[-68.74,6.16],[-68.47,6.16],[-68.14,6.2],[-67.94,6.24],[-67.86,6.29],[-67.73,6.28],[-67.57,6.24],[-67.48,6.18],[-67.47,6.12],[-67.44,6.03],[-67.47,5.93],[-67.58,5.83],[-67.63,5.71],[-67.64,5.56],[-67.69,5.45],[-67.79,5.38],[-67.82,5.27],[-67.8,5.13],[-67.81,4.93],[-67.86,4.67],[-67.86,4.51],[-67.81,4.46],[-67.8,4.38],[-67.8,4.28],[-67.78,4.2],[-67.73,4.09],[-67.66,3.86],[-67.6,3.77],[-67.55,3.73],[-67.5,3.69],[-67.35,3.46],[-67.31,3.42],[-67.32,3.37],[-67.34,3.34],[-67.35,3.32],[-67.51,3.19],[-67.83,2.89],[-67.86,2.86],[-67.86,2.79],[-67.77,2.83],[-67.67,2.8],[-67.62,2.79],[-67.6,2.77],[-67.57,2.69],[-67.53,2.68],[-67.49,2.64],[-67.39,2.56],[-67.31,2.47],[-67.25,2.43],[-67.21,2.39],[-67.2,2.33],[-67.22,2.28],[-67.17,2.14],[-67.13,2.1],[-67.11,2.05],[-67.13,2.0],[-67.09,1.94],[-67.04,1.82],[-66.99,1.68],[-66.98,1.6],[-66.96,1.56],[-66.93,1.46],[-66.88,1.36],[-66.9,1.29],[-66.88,1.22]],[[-78.11,2.54],[-78.14,2.52],[-78.19,2.56],[-78.21,2.61],[-78.18,2.65],[-78.14,2.63],[-78.12,2.6],[-78.11,2.54]]]},{"n":"Comoros","r":[[[43.79,-12.31],[43.86,-12.37],[43.66,-12.34],[43.63,-12.29],[43.63,-12.25],[43.7,-12.26],[43.79,-12.31]],[[44.48,-12.08],[44.53,-12.22],[44.53,-12.32],[44.5,-12.36],[44.46,-12.34],[44.38,-12.25],[44.22,-12.17],[44.29,-12.16],[44.33,-12.17],[44.38,-12.17],[44.41,-12.12],[44.41,-12.09],[44.45,-12.07],[44.48,-12.08]],[[43.47,-11.9],[43.45,-11.91],[43.36,-11.86],[43.3,-11.84],[43.23,-11.75],[43.26,-11.43],[43.28,-11.39],[43.3,-11.37],[43.34,-11.37],[43.39,-11.41],[43.38,-11.61],[43.45,-11.75],[43.49,-11.86],[43.47,-11.9]]]},{"n":"Cabo Verde","r":[[[-24.31,14.86],[-24.39,14.82],[-24.44,14.83],[-24.49,14.87],[-24.52,14.93],[-24.5,14.98],[-24.39,15.04],[-24.33,15.02],[-24.3,14.93],[-24.31,14.86]],[[-23.18,15.14],[-23.21,15.13],[-23.25,15.18],[-23.24,15.24],[-23.25,15.26],[-23.21,15.32],[-23.14,15.32],[-23.12,15.27],[-23.12,15.17],[-23.18,15.14]],[[-23.44,15.01],[-23.5,14.92],[-23.64,14.92],[-23.71,14.96],[-23.79,15.08],[-23.78,15.17],[-23.75,15.24],[-23.76,15.31],[-23.75,15.33],[-23.71,15.32],[-23.7,15.27],[-23.58,15.16],[-23.54,15.14],[-23.44,15.01]],[[-22.92,16.24],[-22.83,16.22],[-22.8,16.23],[-22.75,16.22],[-22.69,16.17],[-22.68,16.11],[-22.71,16.04],[-22.82,15.99],[-22.88,15.99],[-22.96,16.05],[-22.92,16.15],[-22.92,16.24]],[[-24.09,16.62],[-24.05,16.59],[-24.03,16.57],[-24.09,16.56],[-24.24,16.6],[-24.28,16.58],[-24.32,16.49],[-24.4,16.62],[-24.39,16.66],[-24.38,16.68],[-24.27,16.64],[-24.09,16.62]],[[-22.89,16.66],[-22.92,16.61],[-22.96,16.68],[-22.98,16.7],[-22.99,16.81],[-22.93,16.84],[-22.9,16.84],[-22.9,16.73],[-22.89,16.66]],[[-24.89,16.82],[-24.97,16.79],[-25.02,16.8],[-25.09,16.83],[-25.07,16.87],[-24.99,16.91],[-24.94,16.92],[-24.89,16.85],[-24.89,16.82]],[[-25.17,16.95],[-25.27,16.93],[-25.31,16.94],[-25.32,17.02],[-25.34,17.07],[-25.34,17.09],[-25.11,17.19],[-25.03,17.18],[-24.98,17.09],[-25.02,17.05],[-25.17,16.95]]]},{"n":"Costa Rica","r":[[[-83.64,10.92],[-83.62,10.88],[-83.59,10.81],[-83.58,10.73],[-83.45,10.47],[-83.35,10.32],[-83.12,10.04],[-83.03,9.99],[-82.87,9.77],[-82.81,9.73],[-82.78,9.67],[-82.61,9.62],[-82.56,9.58],[-82.57,9.56],[-82.59,9.54],[-82.61,9.52],[-82.64,9.51],[-82.72,9.55],[-82.8,9.59],[-82.84,9.57],[-82.86,9.51],[-82.89,9.48],[-82.93,9.47],[-82.94,9.45],[-82.94,9.25],[-82.94,9.06],[-82.88,9.06],[-82.78,8.99],[-82.74,8.95],[-82.73,8.92],[-82.74,8.9],[-82.81,8.86],[-82.88,8.81],[-82.92,8.74],[-82.86,8.64],[-82.84,8.56],[-82.84,8.49],[-82.86,8.45],[-83.0,8.37],[-83.03,8.34],[-83.02,8.32],[-82.95,8.26],[-82.91,8.2],[-82.88,8.13],[-82.88,8.07],[-82.95,8.18],[-83.04,8.29],[-83.12,8.35],[-83.13,8.51],[-83.16,8.59],[-83.29,8.66],[-83.39,8.72],[-83.47,8.71],[-83.42,8.62],[-83.3,8.51],[-83.29,8.46],[-83.29,8.41],[-83.38,8.41],[-83.45,8.44],[-83.54,8.45],[-83.6,8.48],[-83.73,8.61],[-83.64,8.73],[-83.61,8.8],[-83.62,8.96],[-83.64,9.04],[-83.74,9.15],[-83.9,9.28],[-84.12,9.38],[-84.22,9.46],[-84.48,9.53],[-84.58,9.57],[-84.66,9.65],[-84.67,9.7],[-84.64,9.79],[-84.71,9.9],[-85.03,10.12],[-85.2,10.2],[-85.24,10.24],[-85.26,10.26],[-85.24,10.11],[-85.16,10.02],[-84.96,9.93],[-84.91,9.88],[-84.89,9.82],[-85.0,9.7],[-85.06,9.67],[-85.08,9.6],[-85.11,9.58],[-85.15,9.62],[-85.31,9.81],[-85.62,9.9],[-85.68,9.96],[-85.8,10.13],[-85.85,10.29],[-85.83,10.4],[-85.7,10.56],[-85.66,10.64],[-85.67,10.68],[-85.67,10.75],[-85.71,10.79],[-85.83,10.85],[-85.91,10.9],[-85.89,10.92],[-85.75,10.99],[-85.74,11.04],[-85.74,11.06],[-85.72,11.07],[-85.7,11.08],[-85.69,11.1],[-85.65,11.15],[-85.62,11.18],[-85.58,11.19],[-85.54,11.17],[-85.37,11.11],[-85.18,11.04],[-84.91,10.95],[-84.8,11.01],[-84.7,11.05],[-84.63,11.05],[-84.49,10.99],[-84.4,10.97],[-84.35,10.98],[-84.26,10.9],[-84.2,10.84],[-84.2,10.8],[-84.17,10.78],[-84.1,10.78],[-83.92,10.74],[-83.81,10.74],[-83.71,10.79],[-83.66,10.84],[-83.64,10.92]]]},{"n":"Cuba","r":[[[-82.56,21.57],[-82.65,21.52],[-82.85,21.44],[-82.96,21.44],[-83.07,21.47],[-83.14,21.53],[-83.18,21.59],[-83.18,21.62],[-83.11,21.57],[-83.05,21.55],[-83.01,21.57],[-82.97,21.59],[-83.08,21.79],[-83.08,21.83],[-82.99,21.94],[-82.76,21.91],[-82.71,21.89],[-82.68,21.82],[-82.63,21.77],[-82.57,21.62],[-82.56,21.57]],[[-77.67,21.95],[-77.71,21.92],[-77.76,21.97],[-77.78,21.97],[-77.82,21.99],[-77.9,22.04],[-77.92,22.09],[-77.85,22.09],[-77.77,22.08],[-77.63,22.05],[-77.65,22.0],[-77.67,21.95]],[[-77.88,22.13],[-77.91,22.12],[-78.01,22.17],[-78.04,22.2],[-78.01,22.25],[-78.0,22.3],[-77.99,22.3],[-77.97,22.24],[-77.89,22.21],[-77.89,22.2],[-77.84,22.15],[-77.88,22.13]],[[-78.03,22.29],[-78.05,22.27],[-78.1,22.31],[-78.18,22.32],[-78.23,22.38],[-78.27,22.4],[-78.27,22.42],[-78.2,22.44],[-78.15,22.43],[-78.09,22.39],[-78.06,22.31],[-78.03,22.29]],[[-78.63,22.55],[-78.49,22.53],[-78.45,22.54],[-78.4,22.55],[-78.35,22.54],[-78.28,22.46],[-78.34,22.45],[-78.39,22.45],[-78.42,22.46],[-78.55,22.46],[-78.63,22.49],[-78.67,22.51],[-78.7,22.53],[-78.63,22.55]],[[-79.35,22.66],[-79.35,22.64],[-79.52,22.71],[-79.6,22.79],[-79.63,22.81],[-79.58,22.81],[-79.38,22.68],[-79.35,22.66]],[[-81.84,23.16],[-81.58,23.12],[-81.36,23.13],[-81.26,23.16],[-81.27,23.13],[-81.18,23.06],[-81.14,23.05],[-81.01,23.09],[-80.65,23.1],[-80.61,23.08],[-80.55,23.02],[-80.46,22.98],[-80.36,22.94],[-80.27,22.93],[-80.17,22.95],[-80.08,22.94],[-79.96,22.88],[-79.92,22.87],[-79.82,22.89],[-79.85,22.83],[-79.68,22.74],[-79.55,22.58],[-79.46,22.51],[-79.36,22.45],[-79.28,22.41],[-79.18,22.39],[-78.9,22.4],[-78.84,22.39],[-78.78,22.37],[-78.72,22.36],[-78.69,22.37],[-78.14,22.11],[-77.97,21.97],[-77.87,21.9],[-77.64,21.8],[-77.55,21.77],[-77.5,21.79],[-77.51,21.81],[-77.57,21.87],[-77.58,21.89],[-77.5,21.87],[-77.34,21.76],[-77.3,21.71],[-77.22,21.67],[-77.14,21.64],[-77.18,21.6],[-77.24,21.59],[-77.37,21.61],[-77.27,21.54],[-77.25,21.48],[-77.21,21.48],[-77.14,21.54],[-77.1,21.59],[-76.93,21.46],[-76.84,21.4],[-76.86,21.36],[-76.87,21.33],[-76.76,21.36],[-76.73,21.36],[-76.69,21.34],[-76.65,21.28],[-76.55,21.27],[-76.46,21.27],[-76.26,21.23],[-76.07,21.13],[-75.9,21.11],[-75.72,21.11],[-75.63,21.06],[-75.6,20.99],[-75.64,20.95],[-75.66,20.9],[-75.6,20.84],[-75.74,20.81],[-75.76,20.78],[-75.75,20.74],[-75.72,20.71],[-75.64,20.73],[-75.52,20.72],[-75.34,20.7],[-75.21,20.71],[-74.96,20.67],[-74.88,20.65],[-74.73,20.57],[-74.66,20.52],[-74.51,20.38],[-74.38,20.33],[-74.27,20.32],[-74.23,20.33],[-74.2,20.31],[-74.17,20.29],[-74.14,20.23],[-74.15,20.17],[-74.22,20.12],[-74.25,20.08],[-74.41,20.08],[-74.63,20.06],[-74.85,20.0],[-74.96,19.96],[-75.0,19.93],[-75.12,19.9],[-75.12,19.92],[-75.12,19.95],[-75.15,20.01],[-75.18,19.96],[-75.22,19.92],[-75.29,19.89],[-75.55,19.89],[-75.66,19.93],[-75.77,19.96],[-76.16,19.99],[-76.25,19.99],[-76.52,19.96],[-76.78,19.94],[-76.89,19.92],[-77.0,19.89],[-77.21,19.89],[-77.46,19.86],[-77.72,19.86],[-77.55,20.08],[-77.21,20.3],[-77.15,20.35],[-77.1,20.41],[-77.09,20.45],[-77.11,20.49],[-77.19,20.56],[-77.21,20.61],[-77.23,20.64],[-77.35,20.67],[-77.47,20.69],[-77.59,20.69],[-77.86,20.71],[-78.0,20.72],[-78.12,20.76],[-78.31,20.93],[-78.41,20.97],[-78.45,21.01],[-78.49,21.05],[-78.54,21.3],[-78.58,21.41],[-78.64,21.52],[-78.73,21.59],[-78.82,21.62],[-79.19,21.55],[-79.27,21.56],[-79.36,21.59],[-79.91,21.74],[-80.14,21.83],[-80.23,21.87],[-80.31,21.93],[-80.39,22.03],[-80.49,22.12],[-80.48,22.09],[-80.5,22.06],[-80.96,22.05],[-81.04,22.07],[-81.08,22.1],[-81.12,22.13],[-81.14,22.21],[-81.19,22.27],[-81.2,22.2],[-81.22,22.14],[-81.28,22.11],[-81.36,22.1],[-81.44,22.18],[-81.82,22.2],[-81.85,22.21],[-81.97,22.29],[-82.08,22.39],[-81.97,22.42],[-81.76,22.47],[-81.71,22.5],[-81.68,22.53],[-81.7,22.59],[-81.75,22.63],[-81.79,22.66],[-81.84,22.67],[-81.9,22.68],[-82.74,22.69],[-82.79,22.66],[-82.86,22.6],[-83.01,22.51],[-83.11,22.43],[-83.14,22.39],[-83.19,22.36],[-83.29,22.3],[-83.38,22.22],[-83.49,22.19],[-83.54,22.21],[-83.6,22.21],[-83.64,22.19],[-83.69,22.18],[-83.9,22.17],[-83.93,22.15],[-83.96,22.09],[-84.0,21.98],[-84.03,21.94],[-84.14,21.93],[-84.24,21.9],[-84.45,21.79],[-84.5,21.78],[-84.49,21.85],[-84.5,21.93],[-84.56,21.93],[-84.63,21.92],[-84.68,21.9],[-84.79,21.84],[-84.84,21.83],[-84.89,21.86],[-84.88,21.89],[-84.53,22.03],[-84.49,22.04],[-84.43,22.03],[-84.37,22.04],[-84.33,22.07],[-84.38,22.26],[-84.36,22.38],[-84.28,22.47],[-84.12,22.62],[-84.04,22.67],[-83.26,22.97],[-83.18,22.98],[-82.67,23.04],[-82.59,23.06],[-82.35,23.15],[-82.1,23.19],[-81.84,23.16]]]},{"n":"Curaçao","r":[[[-68.75,12.06],[-68.8,12.05],[-69.0,12.14],[-69.15,12.3],[-69.16,12.38],[-69.12,12.37],[-69.08,12.34],[-69.01,12.23],[-68.83,12.16],[-68.75,12.06]]]},{"n":"Cayman Islands","r":[[[-81.37,19.35],[-81.34,19.33],[-81.3,19.34],[-81.28,19.36],[-81.13,19.35],[-81.11,19.31],[-81.22,19.3],[-81.28,19.28],[-81.3,19.27],[-81.4,19.28],[-81.42,19.37],[-81.39,19.38],[-81.37,19.35]],[[-79.98,19.71],[-79.99,19.7],[-80.02,19.71],[-80.09,19.67],[-80.13,19.67],[-80.12,19.68],[-80.1,19.7],[-80.08,19.71],[-80.07,19.71],[-80.02,19.72],[-79.99,19.72],[-79.98,19.71],[-79.98,19.71]],[[-79.82,19.71],[-79.87,19.7],[-79.91,19.7],[-79.82,19.74],[-79.8,19.76],[-79.79,19.77],[-79.77,19.77],[-79.74,19.76],[-79.74,19.75],[-79.82,19.71]]]},{"n":"Northern Cyprus","r":[[[34.0,35.07],[33.97,35.06],[33.9,35.09],[33.87,35.09],[33.83,35.07],[33.79,35.05],[33.76,35.04],[33.73,35.04],[33.68,35.02],[33.61,35.02],[33.53,35.04],[33.48,35.0],[33.46,35.0],[33.46,35.1],[33.42,35.14],[33.38,35.16],[33.33,35.15],[33.25,35.16],[33.19,35.17],[33.08,35.15],[32.99,35.12],[32.92,35.09],[32.87,35.09],[32.78,35.12],[32.72,35.15],[32.71,35.17],[32.77,35.16],[32.88,35.18],[32.93,35.28],[32.94,35.39],[33.12,35.36],[33.31,35.34],[33.46,35.34],[33.61,35.35],[34.06,35.47],[34.19,35.55],[34.27,35.57],[34.41,35.63],[34.56,35.66],[34.46,35.59],[33.94,35.29],[33.91,35.2],[33.93,35.14],[34.0,35.07]]]},{"n":"Cyprus","r":[[[32.71,35.17],[32.72,35.15],[32.78,35.12],[32.87,35.09],[32.92,35.09],[32.99,35.12],[33.08,35.15],[33.19,35.17],[33.25,35.16],[33.33,35.15],[33.38,35.16],[33.42,35.14],[33.46,35.1],[33.46,35.0],[33.48,35.0],[33.53,35.04],[33.61,35.02],[33.68,35.02],[33.73,35.04],[33.76,35.04],[33.79,35.05],[33.83,35.07],[33.87,35.09],[33.9,35.09],[33.97,35.06],[34.0,35.07],[34.02,35.05],[34.05,34.99],[33.94,34.97],[33.82,34.97],[33.76,34.97],[33.7,34.97],[33.51,34.81],[33.41,34.75],[33.3,34.72],[33.18,34.7],[33.12,34.7],[33.06,34.67],[33.02,34.64],[33.02,34.6],[33.01,34.57],[32.94,34.58],[32.91,34.64],[32.87,34.66],[32.75,34.65],[32.69,34.65],[32.51,34.71],[32.45,34.73],[32.41,34.78],[32.32,34.95],[32.3,35.08],[32.39,35.05],[32.48,35.09],[32.56,35.16],[32.65,35.18],[32.71,35.17]]]},{"n":"Czechia","r":[[[16.95,48.6],[16.93,48.62],[16.88,48.7],[16.83,48.71],[16.76,48.72],[16.71,48.73],[16.6,48.78],[16.54,48.8],[16.48,48.8],[16.41,48.77],[16.37,48.74],[16.22,48.74],[16.06,48.75],[15.83,48.86],[15.77,48.87],[15.7,48.86],[15.6,48.89],[15.4,48.96],[15.31,48.97],[15.25,48.96],[15.2,48.95],[15.16,48.95],[15.14,48.97],[15.07,49.0],[14.99,49.0],[14.97,48.98],[14.95,48.83],[14.92,48.77],[14.82,48.77],[14.79,48.75],[14.71,48.67],[14.69,48.6],[14.55,48.61],[14.49,48.63],[14.43,48.62],[14.37,48.58],[14.19,48.58],[14.05,48.6],[13.99,48.69],[13.92,48.73],[13.84,48.76],[13.81,48.77],[13.77,48.82],[13.68,48.88],[13.55,48.96],[13.44,48.96],[13.4,48.98],[13.38,49.01],[13.34,49.06],[13.29,49.1],[13.23,49.11],[13.14,49.16],[13.02,49.26],[12.92,49.33],[12.81,49.33],[12.75,49.37],[12.68,49.41],[12.63,49.46],[12.56,49.57],[12.5,49.64],[12.46,49.68],[12.41,49.71],[12.39,49.74],[12.45,49.8],[12.47,49.83],[12.5,49.85],[12.51,49.88],[12.51,49.9],[12.46,49.96],[12.38,50.0],[12.28,50.04],[12.21,50.1],[12.18,50.15],[12.18,50.18],[12.13,50.21],[12.09,50.27],[12.09,50.3],[12.1,50.31],[12.13,50.31],[12.17,50.29],[12.23,50.24],[12.28,50.18],[12.31,50.21],[12.36,50.27],[12.45,50.35],[12.55,50.39],[12.64,50.4],[12.71,50.41],[12.77,50.43],[12.87,50.42],[12.94,50.41],[12.97,50.42],[13.0,50.46],[13.02,50.49],[13.18,50.51],[13.24,50.58],[13.27,50.58],[13.31,50.59],[13.34,50.61],[13.37,50.62],[13.4,50.61],[13.44,50.6],[13.47,50.62],[13.53,50.69],[13.56,50.7],[13.7,50.72],[13.9,50.76],[14.0,50.8],[14.1,50.82],[14.2,50.86],[14.37,50.9],[14.38,50.91],[14.3,50.95],[14.27,50.98],[14.26,51.0],[14.28,51.03],[14.32,51.04],[14.37,51.03],[14.51,51.01],[14.55,50.99],[14.56,50.95],[14.6,50.92],[14.62,50.91],[14.61,50.86],[14.66,50.83],[14.72,50.81],[14.77,50.82],[14.8,50.84],[14.81,50.86],[14.9,50.86],[14.98,50.89],[14.99,50.93],[14.98,51.0],[14.99,51.01],[15.13,50.99],[15.26,50.96],[15.28,50.88],[15.31,50.85],[15.35,50.81],[15.39,50.8],[15.46,50.79],[15.64,50.75],[15.73,50.74],[15.82,50.71],[15.89,50.68],[15.95,50.67],[15.97,50.64],[16.01,50.61],[16.07,50.63],[16.28,50.66],[16.36,50.62],[16.41,50.59],[16.42,50.57],[16.39,50.54],[16.38,50.52],[16.36,50.5],[16.28,50.48],[16.24,50.45],[16.21,50.42],[16.23,50.39],[16.29,50.37],[16.33,50.37],[16.35,50.35],[16.49,50.25],[16.6,50.12],[16.64,50.1],[16.68,50.1],[16.73,50.12],[16.78,50.16],[16.84,50.19],[16.9,50.2],[16.99,50.24],[16.99,50.26],[16.91,50.35],[16.87,50.41],[16.88,50.43],[16.98,50.42],[17.15,50.38],[17.42,50.25],[17.46,50.25],[17.55,50.26],[17.65,50.28],[17.7,50.31],[17.72,50.3],[17.74,50.23],[17.71,50.19],[17.59,50.16],[17.6,50.14],[17.63,50.12],[17.68,50.1],[17.75,50.06],[17.79,50.01],[17.83,49.98],[17.87,49.97],[17.98,50.0],[18.01,50.02],[18.03,50.04],[18.05,50.03],[18.09,50.01],[18.1,49.99],[18.21,49.96],[18.27,49.93],[18.31,49.91],[18.35,49.93],[18.52,49.9],[18.56,49.88],[18.58,49.84],[18.57,49.82],[18.59,49.76],[18.81,49.61],[18.83,49.54],[18.83,49.51],[18.81,49.51],[18.75,49.49],[18.68,49.49],[18.6,49.49],[18.53,49.46],[18.48,49.42],[18.42,49.39],[18.38,49.36],[18.36,49.34],[18.16,49.26],[18.13,49.22],[18.11,49.18],[18.1,49.12],[18.09,49.07],[18.05,49.04],[17.94,49.01],[17.91,49.0],[17.89,48.97],[17.83,48.93],[17.76,48.89],[17.63,48.84],[17.48,48.83],[17.3,48.84],[17.19,48.86],[17.14,48.84],[17.06,48.78],[16.99,48.68],[16.95,48.6]]]},{"n":"Germany","r":[[[13.81,48.77],[13.8,48.75],[13.8,48.69],[13.8,48.62],[13.79,48.59],[13.72,48.54],[13.69,48.53],[13.68,48.52],[13.49,48.58],[13.47,48.57],[13.46,48.56],[13.41,48.39],[13.37,48.36],[13.32,48.33],[13.22,48.3],[13.14,48.29],[13.08,48.28],[12.9,48.2],[12.81,48.16],[12.76,48.11],[12.76,48.08],[12.85,47.98],[12.95,47.89],[12.95,47.81],[12.91,47.75],[12.9,47.72],[12.93,47.71],[12.99,47.71],[13.03,47.7],[13.05,47.66],[13.05,47.58],[13.03,47.51],[13.01,47.48],[12.97,47.48],[12.88,47.51],[12.81,47.54],[12.78,47.56],[12.78,47.59],[12.8,47.61],[12.77,47.64],[12.69,47.67],[12.59,47.66],[12.53,47.64],[12.48,47.64],[12.44,47.67],[12.36,47.69],[12.27,47.7],[12.21,47.72],[12.2,47.71],[12.2,47.65],[12.19,47.62],[11.72,47.58],[11.57,47.55],[11.47,47.51],[11.39,47.49],[11.37,47.46],[11.3,47.42],[11.21,47.41],[11.19,47.43],[11.14,47.41],[11.04,47.39],[10.98,47.4],[10.95,47.43],[10.89,47.47],[10.87,47.5],[10.87,47.52],[10.74,47.52],[10.66,47.55],[10.48,47.54],[10.44,47.55],[10.43,47.54],[10.4,47.42],[10.37,47.37],[10.31,47.31],[10.24,47.28],[10.18,47.28],[10.19,47.32],[10.2,47.36],[10.16,47.37],[10.1,47.38],[10.07,47.39],[10.07,47.43],[10.06,47.45],[10.03,47.47],[9.97,47.51],[9.84,47.55],[9.75,47.58],[9.72,47.55],[9.65,47.53],[9.55,47.53],[9.52,47.52],[9.35,47.6],[9.18,47.67],[9.13,47.67],[8.88,47.66],[8.87,47.66],[8.83,47.7],[8.79,47.72],[8.77,47.71],[8.75,47.7],[8.73,47.7],[8.62,47.77],[8.57,47.78],[8.51,47.77],[8.44,47.73],[8.4,47.69],[8.41,47.66],[8.45,47.65],[8.55,47.66],[8.57,47.65],[8.57,47.64],[8.56,47.62],[8.48,47.61],[8.45,47.6],[8.43,47.59],[8.41,47.59],[8.33,47.61],[8.2,47.61],[8.09,47.58],[7.93,47.56],[7.7,47.57],[7.62,47.59],[7.57,47.61],[7.53,47.67],[7.54,47.77],[7.59,47.91],[7.61,48.0],[7.58,48.06],[7.62,48.16],[7.71,48.28],[7.77,48.41],[7.79,48.55],[7.84,48.64],[7.92,48.7],[8.12,48.87],[8.14,48.89],[8.13,48.97],[8.08,48.99],[8.0,49.01],[7.8,49.04],[7.61,49.06],[7.53,49.09],[7.45,49.15],[7.4,49.15],[7.31,49.13],[7.2,49.11],[7.12,49.13],[7.07,49.12],[7.04,49.11],[7.02,49.12],[7.0,49.18],[6.96,49.19],[6.89,49.21],[6.85,49.2],[6.82,49.17],[6.78,49.15],[6.74,49.16],[6.61,49.29],[6.57,49.32],[6.57,49.35],[6.53,49.39],[6.46,49.44],[6.38,49.46],[6.34,49.45],[6.35,49.51],[6.38,49.6],[6.41,49.64],[6.44,49.68],[6.48,49.71],[6.49,49.75],[6.49,49.8],[6.44,49.81],[6.32,49.84],[6.26,49.87],[6.2,49.92],[6.14,49.97],[6.11,50.03],[6.11,50.09],[6.12,50.12],[6.12,50.14],[6.18,50.23],[6.36,50.32],[6.34,50.4],[6.34,50.45],[6.29,50.49],[6.2,50.5],[6.18,50.52],[6.17,50.55],[6.24,50.6],[6.15,50.64],[6.12,50.68],[6.01,50.73],[5.99,50.75],[6.05,50.9],[6.01,50.95],[5.96,50.97],[5.89,50.98],[5.87,51.01],[5.86,51.03],[5.87,51.05],[5.94,51.04],[5.96,51.06],[6.13,51.15],[6.14,51.16],[6.11,51.17],[6.08,51.18],[6.07,51.2],[6.08,51.22],[6.17,51.35],[6.19,51.41],[6.2,51.45],[6.19,51.49],[6.14,51.55],[6.09,51.6],[6.09,51.64],[6.05,51.66],[5.95,51.76],[5.95,51.8],[6.01,51.83],[6.09,51.85],[6.12,51.87],[6.17,51.88],[6.3,51.85],[6.36,51.82],[6.37,51.83],[6.42,51.86],[6.52,51.85],[6.74,51.91],[6.78,51.94],[6.8,51.97],[6.8,51.98],[6.72,52.04],[6.71,52.06],[6.72,52.08],[6.75,52.1],[6.8,52.11],[6.86,52.14],[6.98,52.21],[7.02,52.27],[7.03,52.33],[7.04,52.38],[7.0,52.42],[6.97,52.44],[6.92,52.44],[6.83,52.44],[6.75,52.46],[6.7,52.5],[6.69,52.53],[6.71,52.55],[6.72,52.57],[6.71,52.6],[6.71,52.62],[6.75,52.63],[7.01,52.63],[7.03,52.65],[7.05,52.74],[7.12,52.89],[7.18,52.97],[7.19,53.0],[7.19,53.19],[7.2,53.28],[7.15,53.33],[7.05,53.38],[7.07,53.48],[7.11,53.56],[7.21,53.65],[7.29,53.68],[7.63,53.7],[8.01,53.69],[8.17,53.54],[8.11,53.47],[8.2,53.43],[8.25,53.45],[8.28,53.51],[8.3,53.58],[8.33,53.61],[8.45,53.55],[8.49,53.51],[8.5,53.39],[8.54,53.56],[8.51,53.67],[8.53,53.78],[8.58,53.84],[8.62,53.88],[8.9,53.84],[9.21,53.86],[9.32,53.81],[9.59,53.6],[9.67,53.57],[9.78,53.55],[9.63,53.6],[9.31,53.86],[9.22,53.89],[9.07,53.9],[8.98,53.93],[8.92,53.97],[8.9,54.0],[8.91,54.26],[8.85,54.3],[8.78,54.31],[8.74,54.3],[8.64,54.29],[8.63,54.35],[8.65,54.4],[8.83,54.43],[8.95,54.47],[8.96,54.54],[8.88,54.59],[8.79,54.7],[8.68,54.79],[8.67,54.9],[8.67,54.9],[8.86,54.9],[8.9,54.9],[9.19,54.84],[9.25,54.81],[9.34,54.81],[9.5,54.84],[9.62,54.86],[9.66,54.83],[9.72,54.83],[9.74,54.83],[9.75,54.81],[9.89,54.78],[9.95,54.74],[10.02,54.67],[10.03,54.58],[9.94,54.51],[9.87,54.47],[10.14,54.49],[10.17,54.45],[10.21,54.41],[10.36,54.44],[10.73,54.32],[10.96,54.38],[11.01,54.38],[11.06,54.28],[11.01,54.18],[10.81,54.08],[10.85,54.01],[10.92,54.0],[11.1,54.01],[11.4,53.94],[11.46,53.96],[11.7,54.11],[11.8,54.15],[12.11,54.17],[12.17,54.23],[12.3,54.28],[12.38,54.35],[12.58,54.47],[12.78,54.45],[12.9,54.42],[13.03,54.41],[13.15,54.28],[13.45,54.14],[13.72,54.15],[13.82,54.02],[13.87,53.85],[13.95,53.8],[14.02,53.77],[14.25,53.73],[14.26,53.73],[14.27,53.71],[14.28,53.62],[14.3,53.56],[14.41,53.28],[14.41,53.22],[14.41,53.2],[14.37,53.11],[14.29,53.03],[14.19,52.98],[14.14,52.93],[14.13,52.88],[14.25,52.78],[14.51,52.65],[14.62,52.53],[14.57,52.43],[14.55,52.36],[14.57,52.31],[14.62,52.28],[14.68,52.25],[14.71,52.21],[14.69,52.15],[14.7,52.11],[14.75,52.08],[14.75,52.07],[14.72,52.03],[14.69,51.96],[14.67,51.9],[14.6,51.83],[14.62,51.77],[14.68,51.7],[14.72,51.66],[14.74,51.63],[14.71,51.54],[14.72,51.52],[14.91,51.46],[14.94,51.44],[14.95,51.38],[15.02,51.25],[14.96,51.1],[14.92,51.01],[14.81,50.87],[14.81,50.86],[14.8,50.84],[14.77,50.82],[14.72,50.81],[14.66,50.83],[14.61,50.86],[14.62,50.91],[14.6,50.92],[14.56,50.95],[14.55,50.99],[14.51,51.01],[14.37,51.03],[14.32,51.04],[14.28,51.03],[14.26,51.0],[14.27,50.98],[14.3,50.95],[14.38,50.91],[14.37,50.9],[14.2,50.86],[14.1,50.82],[14.0,50.8],[13.9,50.76],[13.7,50.72],[13.56,50.7],[13.53,50.69],[13.47,50.62],[13.44,50.6],[13.4,50.61],[13.37,50.62],[13.34,50.61],[13.31,50.59],[13.27,50.58],[13.24,50.58],[13.18,50.51],[13.02,50.49],[13.0,50.46],[12.97,50.42],[12.94,50.41],[12.87,50.42],[12.77,50.43],[12.71,50.41],[12.64,50.4],[12.55,50.39],[12.45,50.35],[12.36,50.27],[12.31,50.21],[12.28,50.18],[12.23,50.24],[12.17,50.29],[12.13,50.31],[12.1,50.31],[12.09,50.3],[12.09,50.27],[12.13,50.21],[12.18,50.18],[12.18,50.15],[12.21,50.1],[12.28,50.04],[12.38,50.0],[12.46,49.96],[12.51,49.9],[12.51,49.88],[12.5,49.85],[12.47,49.83],[12.45,49.8],[12.39,49.74],[12.41,49.71],[12.46,49.68],[12.5,49.64],[12.56,49.57],[12.63,49.46],[12.68,49.41],[12.75,49.37],[12.81,49.33],[12.92,49.33],[13.02,49.26],[13.14,49.16],[13.23,49.11],[13.29,49.1],[13.34,49.06],[13.38,49.01],[13.4,48.98],[13.44,48.96],[13.55,48.96],[13.68,48.88],[13.77,48.82],[13.81,48.77]],[[14.21,53.87],[14.17,53.87],[14.05,53.86],[13.93,53.88],[13.9,53.94],[13.92,54.0],[13.87,54.04],[13.83,54.06],[13.82,54.09],[13.83,54.13],[14.04,54.03],[14.21,53.95],[14.2,53.92],[14.21,53.87]],[[11.28,54.42],[11.13,54.42],[11.07,54.46],[11.01,54.47],[11.04,54.52],[11.08,54.53],[11.23,54.5],[11.28,54.44],[11.28,54.42]],[[13.71,54.38],[13.73,54.32],[13.71,54.28],[13.59,54.34],[13.48,54.34],[13.41,54.25],[13.36,54.25],[13.19,54.33],[13.16,54.36],[13.16,54.4],[13.18,54.51],[13.18,54.54],[13.23,54.58],[13.24,54.64],[13.34,54.7],[13.42,54.7],[13.45,54.65],[13.49,54.62],[13.64,54.58],[13.66,54.56],[13.67,54.54],[13.6,54.49],[13.58,54.46],[13.6,54.43],[13.71,54.38]],[[8.59,54.71],[8.55,54.69],[8.45,54.69],[8.4,54.71],[8.42,54.74],[8.47,54.76],[8.51,54.76],[8.57,54.75],[8.59,54.71]],[[8.31,54.79],[8.28,54.77],[8.3,54.91],[8.41,55.06],[8.45,55.06],[8.4,55.01],[8.39,54.99],[8.37,54.93],[8.38,54.9],[8.63,54.89],[8.6,54.87],[8.35,54.85],[8.31,54.79]]]},{"n":"Djibouti","r":[[[43.25,11.5],[43.16,11.37],[43.05,11.19],[42.92,11.0],[42.84,11.0],[42.78,11.01],[42.74,11.04],[42.65,11.08],[42.56,11.08],[42.47,11.05],[42.31,11.01],[42.17,10.99],[42.05,10.97],[41.96,10.94],[41.87,10.96],[41.8,10.98],[41.78,11.19],[41.76,11.41],[41.77,11.59],[41.79,11.69],[41.82,11.72],[41.95,11.86],[42.0,11.91],[42.15,12.13],[42.28,12.32],[42.38,12.47],[42.41,12.49],[42.45,12.52],[42.48,12.51],[42.67,12.38],[42.7,12.38],[42.77,12.42],[42.83,12.57],[42.87,12.62],[42.88,12.62],[43.01,12.66],[43.12,12.71],[43.13,12.66],[43.3,12.46],[43.35,12.37],[43.41,12.19],[43.38,12.09],[43.34,12.03],[43.27,11.97],[43.05,11.83],[42.8,11.74],[42.64,11.56],[42.52,11.57],[42.54,11.5],[42.58,11.5],[42.65,11.51],[42.79,11.56],[42.91,11.59],[43.04,11.59],[43.16,11.57],[43.25,11.5]]]},{"n":"Dominica","r":[[[-61.28,15.25],[-61.38,15.23],[-61.42,15.4],[-61.48,15.53],[-61.47,15.6],[-61.46,15.63],[-61.32,15.59],[-61.28,15.53],[-61.25,15.37],[-61.28,15.25]]]},{"n":"Denmark","r":[[[9.74,54.83],[9.72,54.83],[9.66,54.83],[9.62,54.86],[9.5,54.84],[9.34,54.81],[9.25,54.81],[9.19,54.84],[8.9,54.9],[8.86,54.9],[8.67,54.9],[8.67,54.9],[8.66,54.99],[8.64,55.05],[8.57,55.13],[8.67,55.16],[8.65,55.33],[8.62,55.42],[8.35,55.51],[8.13,55.6],[8.18,55.9],[8.2,55.98],[8.12,56.14],[8.13,56.32],[8.16,56.61],[8.23,56.62],[8.28,56.62],[8.47,56.57],[8.55,56.56],[8.61,56.51],[8.67,56.5],[8.72,56.54],[8.74,56.63],[8.89,56.74],[8.99,56.77],[9.07,56.79],[9.14,56.75],[9.2,56.7],[9.21,56.81],[9.25,57.01],[9.11,57.04],[8.99,57.02],[8.88,56.89],[8.77,56.73],[8.6,56.71],[8.47,56.66],[8.35,56.71],[8.27,56.75],[8.27,56.82],[8.28,56.85],[8.43,56.98],[8.62,57.11],[8.81,57.11],[8.95,57.15],[9.04,57.16],[9.3,57.15],[9.43,57.17],[9.55,57.23],[9.82,57.48],[9.96,57.58],[10.26,57.62],[10.53,57.74],[10.61,57.74],[10.48,57.65],[10.46,57.61],[10.44,57.56],[10.54,57.45],[10.52,57.38],[10.52,57.24],[10.44,57.17],[10.34,57.02],[10.3,57.0],[10.29,56.82],[10.3,56.78],[10.28,56.62],[10.38,56.55],[10.49,56.52],[10.85,56.52],[10.88,56.49],[10.93,56.44],[10.89,56.36],[10.86,56.3],[10.75,56.24],[10.62,56.2],[10.54,56.2],[10.43,56.28],[10.37,56.25],[10.32,56.21],[10.23,56.01],[10.18,55.87],[10.16,55.85],[10.11,55.87],[10.02,55.88],[9.9,55.84],[9.96,55.81],[10.02,55.76],[10.0,55.74],[9.9,55.71],[9.81,55.65],[9.77,55.61],[9.66,55.56],[9.59,55.49],[9.63,55.41],[9.64,55.34],[9.67,55.27],[9.64,55.2],[9.5,55.12],[9.45,55.04],[9.57,55.04],[9.65,55.02],[9.69,55.0],[9.73,54.97],[9.71,54.93],[9.74,54.83]],[[11.36,54.89],[11.54,54.83],[11.66,54.83],[11.74,54.81],[11.76,54.77],[11.77,54.68],[11.68,54.65],[11.59,54.66],[11.46,54.63],[11.04,54.77],[11.04,54.89],[11.06,54.94],[11.26,54.95],[11.36,54.89]],[[10.48,54.85],[10.42,54.84],[10.34,54.86],[10.22,54.94],[10.2,54.96],[10.27,54.95],[10.35,54.91],[10.41,54.9],[10.5,54.86],[10.48,54.85]],[[12.55,54.97],[12.51,54.95],[12.36,54.96],[12.18,54.89],[12.12,54.91],[12.14,54.96],[12.16,54.97],[12.22,54.99],[12.26,55.02],[12.27,55.06],[12.31,55.04],[12.42,55.03],[12.47,55.02],[12.51,55.0],[12.55,54.97]],[[10.06,54.89],[9.96,54.87],[9.9,54.9],[9.81,54.91],[9.77,55.06],[9.78,55.07],[9.83,55.06],[10.0,54.99],[10.06,54.91],[10.06,54.89]],[[10.73,54.75],[10.69,54.75],[10.63,54.83],[10.62,54.85],[10.69,54.9],[10.74,54.96],[10.86,55.05],[10.92,55.16],[10.95,55.16],[10.92,55.06],[10.77,54.8],[10.73,54.75]],[[15.09,55.02],[15.05,55.0],[14.89,55.03],[14.68,55.1],[14.71,55.24],[14.77,55.3],[15.13,55.14],[15.14,55.09],[15.09,55.02]],[[10.65,55.61],[10.69,55.56],[10.74,55.45],[10.82,55.32],[10.79,55.27],[10.81,55.2],[10.79,55.13],[10.62,55.05],[10.44,55.05],[10.25,55.09],[9.99,55.16],[9.97,55.21],[9.93,55.23],[9.86,55.36],[9.86,55.52],[9.99,55.54],[10.29,55.61],[10.35,55.6],[10.42,55.56],[10.51,55.56],[10.62,55.61],[10.65,55.61]],[[12.67,55.6],[12.57,55.55],[12.55,55.56],[12.52,55.61],[12.57,55.65],[12.6,55.68],[12.62,55.68],[12.65,55.65],[12.67,55.6]],[[10.61,55.78],[10.59,55.77],[10.53,55.78],[10.52,55.85],[10.54,55.91],[10.52,55.96],[10.55,55.99],[10.64,55.91],[10.66,55.88],[10.63,55.83],[10.61,55.78]],[[12.57,55.79],[12.57,55.68],[12.55,55.66],[12.51,55.64],[12.41,55.62],[12.32,55.59],[12.24,55.54],[12.22,55.47],[12.28,55.41],[12.39,55.39],[12.41,55.29],[12.32,55.24],[12.09,55.19],[12.07,55.07],[12.07,54.98],[12.07,54.91],[12.05,54.82],[11.86,54.77],[11.74,54.92],[11.74,54.97],[11.7,55.04],[11.7,55.1],[11.65,55.19],[11.48,55.21],[11.41,55.21],[11.31,55.2],[11.29,55.2],[11.17,55.33],[11.19,55.47],[11.13,55.53],[11.12,55.57],[11.12,55.6],[11.07,55.63],[11.01,55.64],[10.98,55.72],[11.05,55.74],[11.22,55.73],[11.28,55.74],[11.32,55.75],[11.46,55.88],[11.46,55.91],[11.47,55.94],[11.63,55.96],[11.7,55.91],[11.68,55.83],[11.69,55.73],[11.78,55.7],[11.82,55.7],[11.86,55.77],[11.89,55.81],[11.92,55.83],[11.93,55.9],[11.91,55.94],[11.87,55.97],[12.04,56.05],[12.22,56.12],[12.32,56.12],[12.43,56.11],[12.53,56.08],[12.58,56.06],[12.61,56.03],[12.54,55.96],[12.52,55.92],[12.57,55.79]],[[11.05,57.25],[11.01,57.23],[10.87,57.26],[10.93,57.31],[11.09,57.33],[11.17,57.32],[11.08,57.28],[11.05,57.25]]]},{"n":"Dominican Republic","r":[[[-71.74,18.73],[-71.73,18.8],[-71.73,18.86],[-71.79,18.92],[-71.81,18.99],[-71.74,19.05],[-71.66,19.13],[-71.65,19.16],[-71.65,19.2],[-71.75,19.29],[-71.75,19.32],[-71.71,19.42],[-71.71,19.49],[-71.76,19.69],[-71.78,19.72],[-71.74,19.74],[-71.71,19.8],[-71.67,19.85],[-71.62,19.88],[-71.56,19.9],[-71.44,19.89],[-71.28,19.85],[-71.24,19.85],[-71.08,19.89],[-70.95,19.91],[-70.83,19.89],[-70.79,19.85],[-70.69,19.79],[-70.64,19.78],[-70.48,19.78],[-70.44,19.77],[-70.3,19.68],[-70.19,19.64],[-70.13,19.64],[-70.01,19.67],[-69.96,19.67],[-69.89,19.59],[-69.88,19.47],[-69.82,19.37],[-69.74,19.3],[-69.32,19.33],[-69.23,19.27],[-69.26,19.23],[-69.32,19.2],[-69.52,19.21],[-69.61,19.21],[-69.62,19.16],[-69.62,19.12],[-69.51,19.11],[-69.4,19.09],[-69.28,19.05],[-69.16,19.03],[-69.03,19.01],[-68.9,18.99],[-68.68,18.9],[-68.45,18.71],[-68.38,18.67],[-68.34,18.61],[-68.36,18.54],[-68.44,18.42],[-68.49,18.38],[-68.56,18.36],[-68.61,18.31],[-68.66,18.22],[-68.69,18.21],[-68.72,18.22],[-68.78,18.27],[-68.82,18.34],[-68.93,18.41],[-69.07,18.4],[-69.27,18.44],[-69.4,18.42],[-69.52,18.42],[-69.64,18.44],[-69.77,18.44],[-69.9,18.42],[-70.02,18.37],[-70.06,18.35],[-70.14,18.28],[-70.18,18.25],[-70.48,18.22],[-70.57,18.27],[-70.64,18.34],[-70.76,18.35],[-70.92,18.29],[-71.03,18.27],[-71.07,18.25],[-71.08,18.22],[-71.08,18.13],[-71.11,18.07],[-71.27,17.85],[-71.36,17.69],[-71.4,17.65],[-71.44,17.64],[-71.52,17.73],[-71.57,17.76],[-71.63,17.77],[-71.66,17.82],[-71.66,17.89],[-71.67,17.95],[-71.71,18.01],[-71.77,18.04],[-71.76,18.2],[-71.74,18.27],[-71.76,18.34],[-71.87,18.42],[-71.94,18.51],[-72.0,18.6],[-71.99,18.61],[-71.87,18.61],[-71.82,18.65],[-71.74,18.73]]]},{"n":"Algeria","r":[[[8.31,35.08],[8.28,34.98],[8.25,34.83],[8.25,34.73],[8.19,34.65],[8.12,34.56],[8.05,34.51],[7.95,34.47],[7.84,34.41],[7.75,34.25],[7.55,34.12],[7.51,34.08],[7.5,33.98],[7.5,33.83],[7.53,33.72],[7.63,33.55],[7.71,33.36],[7.73,33.27],[7.76,33.23],[7.88,33.17],[8.08,33.09],[8.11,33.06],[8.21,32.93],[8.3,32.7],[8.33,32.54],[8.52,32.42],[8.68,32.31],[8.84,32.21],[9.02,32.11],[9.04,32.07],[9.1,31.85],[9.16,31.62],[9.22,31.37],[9.29,31.13],[9.36,30.83],[9.41,30.67],[9.46,30.47],[9.52,30.23],[9.42,30.18],[9.31,30.12],[9.39,29.99],[9.55,29.8],[9.64,29.64],[9.67,29.57],[9.75,29.37],[9.81,29.18],[9.82,29.11],[9.84,28.97],[9.82,28.56],[9.86,28.04],[9.92,27.79],[9.83,27.55],[9.75,27.33],[9.75,27.22],[9.8,27.04],[9.84,26.92],[9.89,26.85],[9.88,26.63],[9.86,26.55],[9.68,26.44],[9.49,26.33],[9.44,26.25],[9.42,26.15],[9.45,26.07],[9.58,25.89],[9.78,25.62],[10.0,25.33],[10.02,25.26],[10.03,25.05],[10.12,24.79],[10.22,24.68],[10.26,24.59],[10.33,24.53],[10.4,24.49],[10.44,24.48],[10.69,24.55],[11.11,24.43],[11.51,24.31],[11.54,24.29],[11.62,24.14],[11.77,23.89],[11.87,23.69],[11.97,23.52],[11.45,23.21],[10.93,22.91],[10.41,22.6],[9.9,22.3],[9.38,21.99],[8.86,21.69],[8.34,21.38],[7.83,21.08],[7.48,20.87],[7.26,20.69],[6.99,20.47],[6.73,20.25],[6.53,20.07],[6.26,19.85],[6.13,19.73],[5.84,19.48],[5.75,19.43],[5.36,19.36],[5.0,19.29],[4.67,19.23],[4.45,19.18],[4.23,19.14],[3.91,19.08],[3.68,19.04],[3.44,19.0],[3.4,18.99],[3.36,18.99],[3.32,18.99],[3.26,19.01],[3.17,19.07],[3.12,19.1],[3.11,19.15],[3.14,19.21],[3.18,19.27],[3.19,19.31],[3.22,19.35],[3.25,19.37],[3.26,19.41],[3.23,19.47],[3.2,19.56],[3.2,19.72],[3.2,19.77],[3.2,19.79],[3.13,19.85],[2.99,19.92],[2.87,19.96],[2.81,19.97],[2.67,19.99],[2.47,20.04],[2.41,20.06],[2.28,20.21],[2.22,20.25],[1.93,20.27],[1.83,20.3],[1.75,20.33],[1.69,20.38],[1.65,20.46],[1.64,20.52],[1.61,20.56],[1.29,20.71],[1.21,20.77],[1.17,20.82],[1.16,20.89],[1.17,20.98],[1.16,21.06],[1.15,21.1],[1.0,21.2],[0.67,21.41],[0.34,21.63],[0.02,21.84],[-0.31,22.05],[-0.64,22.27],[-0.97,22.48],[-1.29,22.7],[-1.62,22.91],[-1.95,23.12],[-2.28,23.34],[-2.6,23.55],[-2.93,23.77],[-3.26,23.98],[-3.59,24.2],[-3.91,24.41],[-4.24,24.62],[-4.52,24.8],[-4.82,25.0],[-5.05,25.14],[-5.28,25.27],[-5.52,25.42],[-5.67,25.52],[-5.86,25.63],[-6.05,25.74],[-6.24,25.85],[-6.43,25.96],[-6.61,26.07],[-6.8,26.18],[-6.99,26.29],[-7.18,26.4],[-7.37,26.51],[-7.56,26.62],[-7.74,26.73],[-7.93,26.84],[-8.12,26.95],[-8.31,27.06],[-8.5,27.18],[-8.68,27.29],[-8.68,27.49],[-8.68,27.66],[-8.68,27.9],[-8.68,28.11],[-8.68,28.32],[-8.68,28.47],[-8.68,28.62],[-8.68,28.69],[-8.66,28.72],[-8.56,28.77],[-8.4,28.88],[-8.34,28.93],[-8.27,28.98],[-8.0,29.13],[-7.94,29.17],[-7.69,29.35],[-7.62,29.38],[-7.49,29.39],[-7.43,29.42],[-7.35,29.49],[-7.23,29.57],[-7.16,29.61],[-7.14,29.62],[-7.09,29.63],[-6.86,29.6],[-6.76,29.58],[-6.64,29.57],[-6.6,29.58],[-6.57,29.6],[-6.52,29.66],[-6.51,29.73],[-6.51,29.78],[-6.5,29.81],[-6.48,29.82],[-6.43,29.82],[-6.36,29.81],[-6.21,29.81],[-6.17,29.82],[-6.0,29.83],[-5.78,29.87],[-5.59,29.92],[-5.45,29.96],[-5.29,30.06],[-5.18,30.17],[-5.06,30.33],[-4.97,30.47],[-4.78,30.55],[-4.62,30.6],[-4.53,30.63],[-4.32,30.7],[-4.15,30.81],[-3.99,30.91],[-3.86,30.93],[-3.7,30.94],[-3.67,30.96],[-3.63,31.0],[-3.62,31.07],[-3.67,31.11],[-3.73,31.14],[-3.77,31.16],[-3.81,31.17],[-3.83,31.2],[-3.82,31.26],[-3.82,31.31],[-3.79,31.36],[-3.8,31.44],[-3.84,31.51],[-3.85,31.57],[-3.85,31.62],[-3.83,31.66],[-3.77,31.69],[-3.7,31.7],[-3.6,31.69],[-3.44,31.7],[-3.02,31.83],[-2.99,31.87],[-2.96,31.96],[-2.93,32.04],[-2.89,32.07],[-2.86,32.07],[-2.72,32.1],[-2.52,32.13],[-2.45,32.13],[-2.23,32.12],[-2.07,32.12],[-1.82,32.1],[-1.64,32.1],[-1.48,32.09],[-1.28,32.09],[-1.23,32.11],[-1.23,32.16],[-1.26,32.27],[-1.24,32.34],[-1.16,32.4],[-1.07,32.47],[-1.11,32.55],[-1.19,32.61],[-1.3,32.68],[-1.35,32.7],[-1.45,32.78],[-1.51,32.88],[-1.55,33.07],[-1.63,33.18],[-1.68,33.32],[-1.63,33.57],[-1.7,33.72],[-1.71,33.78],[-1.71,33.86],[-1.69,33.99],[-1.71,34.18],[-1.79,34.37],[-1.75,34.43],[-1.73,34.47],[-1.74,34.5],[-1.82,34.56],[-1.85,34.61],[-1.83,34.65],[-1.79,34.72],[-1.8,34.75],[-1.92,34.84],[-2.13,34.97],[-2.19,35.03],[-2.22,35.1],[-2.02,35.09],[-1.91,35.09],[-1.67,35.18],[-1.48,35.3],[-1.34,35.36],[-1.21,35.5],[-1.09,35.58],[-0.92,35.67],[-0.43,35.86],[-0.35,35.86],[-0.19,35.82],[-0.05,35.83],[0.05,35.9],[0.15,36.06],[0.31,36.16],[0.51,36.26],[0.79,36.36],[0.97,36.44],[1.26,36.52],[1.97,36.57],[2.34,36.61],[2.59,36.6],[2.85,36.74],[2.97,36.78],[3.52,36.8],[3.78,36.9],[4.76,36.9],[4.88,36.86],[5.0,36.81],[5.2,36.68],[5.3,36.65],[5.42,36.68],[5.73,36.8],[6.06,36.86],[6.25,36.94],[6.33,37.05],[6.49,37.09],[6.58,37.0],[6.93,36.92],[7.14,36.94],[7.24,36.97],[7.2,37.09],[7.43,37.06],[7.61,37.0],[7.79,36.88],[7.91,36.86],[8.13,36.91],[8.58,36.94],[8.6,36.88],[8.6,36.83],[8.51,36.79],[8.44,36.76],[8.37,36.63],[8.23,36.55],[8.21,36.52],[8.21,36.5],[8.3,36.46],[8.33,36.42],[8.35,36.37],[8.31,36.19],[8.28,36.05],[8.25,35.87],[8.25,35.8],[8.28,35.72],[8.32,35.65],[8.33,35.58],[8.32,35.4],[8.36,35.3],[8.39,35.2],[8.31,35.08]]]},{"n":"Ecuador","r":[[[-78.86,1.46],[-78.83,1.43],[-78.74,1.36],[-78.68,1.28],[-78.59,1.24],[-78.51,1.2],[-78.31,1.05],[-78.18,0.97],[-78.04,0.9],[-77.83,0.83],[-77.7,0.84],[-77.67,0.78],[-77.65,0.72],[-77.6,0.69],[-77.53,0.66],[-77.48,0.65],[-77.47,0.64],[-77.42,0.42],[-77.4,0.39],[-77.29,0.36],[-77.17,0.35],[-77.11,0.36],[-77.0,0.3],[-76.92,0.27],[-76.83,0.25],[-76.77,0.24],[-76.74,0.25],[-76.73,0.27],[-76.68,0.27],[-76.6,0.24],[-76.49,0.24],[-76.43,0.26],[-76.42,0.3],[-76.41,0.38],[-76.39,0.4],[-76.31,0.45],[-76.27,0.44],[-76.07,0.35],[-76.03,0.31],[-75.97,0.25],[-75.88,0.15],[-75.78,0.09],[-75.62,0.06],[-75.46,-0.04],[-75.28,-0.11],[-75.34,-0.14],[-75.4,-0.15],[-75.48,-0.16],[-75.58,-0.12],[-75.63,-0.12],[-75.63,-0.16],[-75.56,-0.2],[-75.49,-0.25],[-75.47,-0.32],[-75.42,-0.41],[-75.33,-0.51],[-75.26,-0.56],[-75.26,-0.59],[-75.28,-0.65],[-75.28,-0.71],[-75.25,-0.95],[-75.27,-0.97],[-75.31,-0.97],[-75.35,-0.97],[-75.38,-0.94],[-75.41,-0.92],[-75.42,-0.96],[-75.45,-1.07],[-75.51,-1.32],[-75.57,-1.53],[-75.64,-1.61],[-75.74,-1.73],[-75.89,-1.89],[-76.09,-2.13],[-76.24,-2.24],[-76.36,-2.33],[-76.5,-2.43],[-76.68,-2.56],[-76.88,-2.64],[-77.16,-2.74],[-77.36,-2.81],[-77.51,-2.86],[-77.66,-2.91],[-77.86,-2.98],[-77.94,-3.05],[-78.07,-3.21],[-78.13,-3.28],[-78.18,-3.35],[-78.19,-3.38],[-78.19,-3.4],[-78.16,-3.43],[-78.16,-3.47],[-78.19,-3.49],[-78.23,-3.49],[-78.24,-3.47],[-78.25,-3.44],[-78.28,-3.4],[-78.32,-3.39],[-78.35,-3.4],[-78.35,-3.43],[-78.4,-3.59],[-78.4,-3.67],[-78.42,-3.71],[-78.42,-3.78],[-78.47,-3.84],[-78.49,-3.9],[-78.51,-3.95],[-78.55,-3.99],[-78.57,-4.04],[-78.6,-4.16],[-78.65,-4.25],[-78.68,-4.33],[-78.69,-4.38],[-78.66,-4.43],[-78.65,-4.46],[-78.67,-4.52],[-78.69,-4.56],[-78.74,-4.59],[-78.86,-4.67],[-78.91,-4.71],[-78.93,-4.77],[-78.91,-4.82],[-78.92,-4.86],[-78.98,-4.87],[-79.0,-4.91],[-79.03,-4.97],[-79.08,-4.99],[-79.19,-4.96],[-79.27,-4.96],[-79.33,-4.93],[-79.4,-4.84],[-79.46,-4.77],[-79.5,-4.67],[-79.52,-4.54],[-79.58,-4.5],[-79.64,-4.45],[-79.71,-4.47],[-79.8,-4.48],[-79.85,-4.45],[-79.96,-4.39],[-80.06,-4.33],[-80.14,-4.3],[-80.2,-4.31],[-80.23,-4.35],[-80.29,-4.42],[-80.38,-4.46],[-80.42,-4.46],[-80.48,-4.43],[-80.49,-4.39],[-80.44,-4.34],[-80.35,-4.21],[-80.45,-4.21],[-80.49,-4.17],[-80.49,-4.12],[-80.51,-4.07],[-80.49,-4.01],[-80.44,-3.98],[-80.36,-4.0],[-80.3,-4.01],[-80.27,-3.95],[-80.23,-3.92],[-80.19,-3.91],[-80.18,-3.88],[-80.22,-3.79],[-80.23,-3.74],[-80.22,-3.71],[-80.22,-3.65],[-80.22,-3.61],[-80.24,-3.58],[-80.25,-3.52],[-80.27,-3.49],[-80.27,-3.46],[-80.27,-3.42],[-80.3,-3.41],[-80.32,-3.39],[-80.3,-3.37],[-80.16,-3.32],[-80.1,-3.27],[-80.03,-3.23],[-79.96,-3.16],[-79.92,-3.09],[-79.82,-2.78],[-79.73,-2.58],[-79.75,-2.48],[-79.82,-2.36],[-79.84,-2.17],[-79.83,-2.11],[-79.84,-2.07],[-79.89,-2.15],[-79.88,-2.42],[-79.93,-2.55],[-79.99,-2.58],[-80.03,-2.56],[-80.01,-2.35],[-80.05,-2.39],[-80.13,-2.53],[-80.25,-2.63],[-80.26,-2.66],[-80.28,-2.71],[-80.38,-2.67],[-80.45,-2.63],[-80.68,-2.4],[-80.84,-2.35],[-80.93,-2.27],[-80.95,-2.24],[-80.96,-2.19],[-80.87,-2.14],[-80.77,-2.08],[-80.76,-1.93],[-80.76,-1.82],[-80.84,-1.63],[-80.8,-1.38],[-80.82,-1.29],[-80.9,-1.08],[-80.84,-0.97],[-80.62,-0.9],[-80.55,-0.85],[-80.51,-0.68],[-80.46,-0.59],[-80.36,-0.63],[-80.28,-0.62],[-80.38,-0.58],[-80.47,-0.44],[-80.48,-0.37],[-80.32,-0.17],[-80.24,-0.11],[-80.13,-0.01],[-80.05,0.16],[-80.03,0.41],[-80.06,0.59],[-80.09,0.78],[-80.04,0.83],[-79.9,0.86],[-79.8,0.92],[-79.74,0.98],[-79.61,0.97],[-79.47,1.06],[-79.23,1.1],[-78.9,1.21],[-78.83,1.3],[-78.86,1.46]],[[-80.13,-2.97],[-80.15,-3.01],[-80.25,-3.01],[-80.27,-3.0],[-80.27,-2.95],[-80.25,-2.81],[-80.22,-2.75],[-80.15,-2.7],[-80.08,-2.67],[-80.0,-2.67],[-79.91,-2.73],[-80.01,-2.82],[-80.07,-2.83],[-80.09,-2.85],[-80.13,-2.97]],[[-90.42,-1.34],[-90.46,-1.34],[-90.52,-1.3],[-90.48,-1.22],[-90.43,-1.24],[-90.4,-1.26],[-90.38,-1.29],[-90.42,-1.34]],[[-89.42,-0.91],[-89.54,-0.95],[-89.58,-0.93],[-89.6,-0.91],[-89.61,-0.89],[-89.54,-0.83],[-89.48,-0.79],[-89.42,-0.72],[-89.32,-0.68],[-89.29,-0.69],[-89.27,-0.7],[-89.26,-0.73],[-89.29,-0.79],[-89.36,-0.83],[-89.42,-0.91]],[[-90.33,-0.77],[-90.39,-0.77],[-90.54,-0.68],[-90.53,-0.58],[-90.47,-0.52],[-90.27,-0.48],[-90.19,-0.54],[-90.19,-0.66],[-90.26,-0.74],[-90.32,-0.76],[-90.33,-0.77]],[[-91.43,-0.46],[-91.53,-0.48],[-91.61,-0.44],[-91.65,-0.39],[-91.65,-0.31],[-91.65,-0.28],[-91.46,-0.26],[-91.4,-0.32],[-91.4,-0.42],[-91.43,-0.46]],[[-90.57,-0.33],[-90.62,-0.36],[-90.81,-0.33],[-90.87,-0.27],[-90.82,-0.19],[-90.78,-0.16],[-90.67,-0.19],[-90.55,-0.28],[-90.57,-0.33]],[[-91.27,0.03],[-91.21,-0.04],[-91.18,-0.22],[-90.98,-0.42],[-90.95,-0.53],[-90.97,-0.58],[-90.96,-0.6],[-90.86,-0.67],[-90.8,-0.75],[-90.91,-0.94],[-91.13,-1.02],[-91.37,-1.02],[-91.42,-1.0],[-91.48,-0.92],[-91.5,-0.86],[-91.46,-0.8],[-91.33,-0.71],[-91.14,-0.62],[-91.12,-0.56],[-91.2,-0.5],[-91.25,-0.37],[-91.37,-0.29],[-91.43,-0.02],[-91.47,-0.01],[-91.55,-0.05],[-91.59,-0.01],[-91.6,0.0],[-91.51,0.06],[-91.49,0.11],[-91.36,0.13],[-91.31,0.09],[-91.27,0.03]],[[-78.91,1.25],[-78.97,1.25],[-78.99,1.29],[-78.92,1.35],[-78.9,1.36],[-78.91,1.25]]]},{"n":"Egypt","r":[[[34.25,31.21],[34.33,31.0],[34.4,30.83],[34.49,30.6],[34.52,30.51],[34.53,30.45],[34.66,30.19],[34.74,29.98],[34.79,29.81],[34.87,29.56],[34.9,29.48],[34.85,29.43],[34.74,29.27],[34.62,28.76],[34.45,28.36],[34.43,28.11],[34.4,28.02],[34.32,27.89],[34.22,27.76],[34.05,27.83],[33.76,28.05],[33.59,28.26],[33.42,28.39],[33.25,28.57],[33.2,28.7],[33.2,28.78],[33.13,28.98],[33.08,29.07],[32.87,29.29],[32.81,29.4],[32.77,29.45],[32.72,29.52],[32.65,29.8],[32.57,29.97],[32.47,29.93],[32.49,29.85],[32.41,29.75],[32.36,29.63],[32.4,29.53],[32.57,29.39],[32.6,29.32],[32.64,29.18],[32.63,28.99],[32.66,28.93],[32.78,28.79],[32.83,28.7],[32.86,28.63],[32.9,28.57],[33.02,28.44],[33.2,28.21],[33.37,28.05],[33.49,27.97],[33.55,27.9],[33.56,27.7],[33.55,27.61],[33.66,27.43],[33.7,27.34],[33.8,27.27],[33.85,27.18],[33.89,27.05],[33.96,26.65],[34.05,26.55],[34.33,26.02],[34.57,25.69],[34.68,25.44],[34.85,25.14],[35.19,24.48],[35.4,24.27],[35.48,24.15],[35.62,24.07],[35.78,23.94],[35.63,23.95],[35.59,23.94],[35.54,23.92],[35.52,23.84],[35.5,23.78],[35.52,23.44],[35.56,23.27],[35.7,22.95],[35.8,22.85],[35.85,22.79],[35.91,22.74],[36.23,22.63],[36.41,22.39],[36.83,22.1],[36.87,22.02],[36.87,22.0],[36.54,22.0],[36.22,22.0],[35.89,22.0],[35.56,22.0],[35.23,22.0],[34.9,22.0],[34.57,22.0],[34.25,22.0],[33.92,22.0],[33.59,22.0],[33.26,22.0],[32.93,22.0],[32.61,22.0],[32.28,22.0],[31.95,22.0],[31.62,22.0],[31.43,22.0],[31.47,22.08],[31.49,22.15],[31.46,22.19],[31.4,22.2],[31.36,22.19],[31.26,22.0],[31.21,21.99],[31.09,21.99],[30.71,21.99],[30.33,22.0],[29.95,22.0],[29.56,22.0],[29.18,22.0],[28.8,22.0],[28.42,22.0],[28.04,22.0],[27.65,22.0],[27.27,22.0],[26.89,22.0],[26.51,22.0],[26.13,22.0],[25.74,22.0],[25.36,22.0],[24.98,22.0],[24.98,22.22],[24.98,22.44],[24.98,22.67],[24.98,22.89],[24.98,23.12],[24.98,23.34],[24.98,23.57],[24.98,23.79],[24.98,24.02],[24.98,24.24],[24.98,24.47],[24.98,24.69],[24.98,24.92],[24.98,25.14],[24.98,25.36],[24.98,25.59],[24.98,25.81],[24.98,26.04],[24.98,26.26],[24.98,26.49],[24.98,26.71],[24.98,26.94],[24.98,27.16],[24.98,27.39],[24.98,27.61],[24.98,27.83],[24.98,28.06],[24.98,28.28],[24.98,28.51],[24.98,28.73],[24.98,28.96],[24.98,29.18],[24.97,29.22],[24.92,29.38],[24.87,29.57],[24.81,29.81],[24.8,29.89],[24.71,30.13],[24.7,30.2],[24.73,30.25],[24.88,30.46],[24.92,30.56],[24.96,30.68],[24.97,30.78],[24.93,30.93],[24.88,31.06],[24.86,31.2],[24.85,31.33],[24.93,31.43],[25.02,31.51],[25.06,31.57],[25.11,31.63],[25.15,31.65],[25.23,31.53],[25.38,31.51],[25.89,31.62],[26.46,31.51],[26.77,31.47],[27.25,31.38],[27.54,31.21],[27.62,31.19],[27.83,31.2],[27.97,31.1],[28.51,31.05],[28.81,30.94],[28.97,30.86],[29.07,30.83],[29.16,30.83],[29.28,30.87],[29.43,30.93],[29.59,31.01],[29.93,31.23],[30.05,31.27],[30.13,31.26],[30.22,31.26],[30.26,31.32],[30.31,31.36],[30.34,31.4],[30.4,31.46],[30.57,31.47],[30.92,31.57],[30.88,31.52],[30.56,31.42],[30.7,31.4],[30.84,31.44],[31.0,31.46],[31.03,31.51],[31.05,31.59],[31.08,31.6],[31.19,31.59],[31.52,31.46],[31.61,31.46],[31.84,31.53],[31.89,31.54],[31.96,31.5],[32.14,31.34],[32.08,31.34],[31.89,31.48],[31.88,31.41],[31.77,31.29],[31.9,31.24],[32.01,31.22],[32.07,31.15],[32.1,31.09],[32.21,31.12],[32.28,31.2],[32.24,31.25],[32.22,31.29],[32.25,31.29],[32.32,31.26],[32.53,31.1],[32.6,31.07],[32.68,31.07],[32.85,31.12],[32.9,31.11],[33.13,31.17],[33.16,31.13],[33.19,31.08],[33.38,31.13],[33.67,31.13],[33.9,31.18],[34.18,31.3],[34.2,31.32],[34.21,31.29],[34.25,31.21]]]},{"n":"Eritrea","r":[[[43.12,12.71],[43.01,12.66],[42.88,12.62],[42.87,12.62],[42.83,12.57],[42.77,12.42],[42.7,12.38],[42.67,12.38],[42.48,12.51],[42.45,12.52],[42.41,12.49],[42.38,12.47],[42.29,12.57],[42.22,12.66],[42.13,12.77],[42.05,12.82],[41.95,12.88],[41.86,13.03],[41.77,13.18],[41.62,13.31],[41.36,13.5],[41.12,13.74],[40.94,13.98],[40.82,14.11],[40.77,14.14],[40.52,14.23],[40.35,14.34],[40.22,14.43],[40.14,14.46],[40.06,14.46],[39.9,14.44],[39.76,14.5],[39.7,14.5],[39.6,14.52],[39.53,14.54],[39.45,14.51],[39.27,14.47],[39.2,14.48],[39.16,14.54],[39.14,14.58],[39.07,14.63],[39.02,14.63],[39.0,14.59],[38.81,14.48],[38.5,14.42],[38.43,14.43],[38.38,14.47],[38.22,14.65],[38.18,14.68],[38.14,14.68],[38.07,14.7],[38.0,14.74],[37.94,14.81],[37.88,14.85],[37.82,14.71],[37.71,14.46],[37.65,14.32],[37.57,14.15],[37.55,14.14],[37.51,14.16],[37.35,14.37],[37.26,14.45],[37.19,14.45],[37.13,14.41],[37.1,14.33],[37.06,14.29],[37.02,14.27],[36.94,14.28],[36.81,14.32],[36.68,14.31],[36.54,14.26],[36.52,14.26],[36.49,14.54],[36.47,14.74],[36.45,14.94],[36.43,15.13],[36.52,15.25],[36.57,15.36],[36.68,15.73],[36.72,15.8],[36.81,15.99],[36.83,16.05],[36.91,16.3],[36.91,16.46],[36.89,16.62],[36.94,16.72],[36.98,16.8],[36.98,16.87],[37.0,17.02],[37.01,17.06],[37.06,17.06],[37.17,17.04],[37.25,17.06],[37.34,17.06],[37.41,17.06],[37.45,17.11],[37.51,17.29],[37.55,17.32],[37.58,17.34],[37.66,17.37],[37.73,17.42],[37.78,17.46],[37.8,17.47],[37.86,17.47],[37.92,17.49],[37.95,17.52],[38.03,17.54],[38.1,17.53],[38.15,17.55],[38.18,17.56],[38.22,17.56],[38.25,17.58],[38.27,17.62],[38.29,17.64],[38.35,17.68],[38.37,17.72],[38.39,17.75],[38.4,17.78],[38.42,17.82],[38.52,17.94],[38.61,18.01],[38.91,17.43],[39.03,17.09],[39.14,16.73],[39.22,16.19],[39.3,15.92],[39.42,15.79],[39.51,15.53],[39.58,15.52],[39.63,15.45],[39.72,15.21],[39.79,15.12],[39.82,15.2],[39.82,15.25],[39.79,15.32],[39.81,15.41],[39.86,15.47],[39.98,15.39],[40.04,15.33],[40.06,15.22],[40.08,15.15],[40.2,15.01],[40.31,14.97],[40.44,14.96],[40.55,14.93],[40.63,14.88],[40.8,14.74],[41.18,14.62],[41.48,14.24],[41.66,13.98],[42.25,13.59],[42.35,13.4],[42.4,13.21],[42.52,13.22],[42.73,13.02],[42.8,12.86],[42.97,12.81],[43.0,12.9],[43.08,12.82],[43.12,12.71]],[[40.14,15.7],[40.18,15.64],[40.21,15.65],[40.23,15.67],[40.25,15.7],[40.41,15.63],[40.4,15.58],[40.3,15.58],[40.2,15.6],[40.1,15.59],[39.98,15.61],[39.95,15.7],[40.02,15.66],[40.06,15.67],[40.07,15.68],[40.02,15.73],[39.94,15.74],[39.95,15.79],[39.98,15.81],[40.0,15.83],[39.96,15.89],[40.04,15.88],[40.1,15.84],[40.13,15.8],[40.14,15.7]],[[40.08,16.08],[40.11,15.99],[40.01,16.02],[40.0,16.04],[40.04,16.08],[40.05,16.1],[40.08,16.08]]]},{"n":"Spain","r":[[[1.43,42.6],[1.41,42.55],[1.42,42.53],[1.43,42.5],[1.43,42.46],[1.45,42.44],[1.49,42.43],[1.53,42.44],[1.59,42.46],[1.68,42.5],[1.71,42.5],[1.86,42.46],[1.93,42.43],[1.95,42.39],[1.99,42.36],[2.03,42.35],[2.1,42.39],[2.2,42.42],[2.37,42.39],[2.57,42.35],[2.65,42.34],[2.65,42.36],[2.67,42.39],[2.7,42.41],[2.75,42.41],[2.82,42.43],[2.89,42.46],[2.97,42.47],[3.05,42.45],[3.15,42.43],[3.21,42.43],[3.24,42.37],[3.29,42.34],[3.31,42.29],[3.22,42.26],[3.17,42.26],[3.15,42.16],[3.18,42.14],[3.22,42.11],[3.24,42.08],[3.25,41.94],[3.15,41.86],[3.0,41.77],[2.31,41.47],[2.15,41.32],[2.08,41.29],[1.57,41.2],[1.21,41.1],[1.03,41.06],[0.82,40.89],[0.71,40.82],[0.8,40.8],[0.89,40.72],[0.86,40.69],[0.72,40.63],[0.66,40.61],[0.63,40.62],[0.6,40.61],[0.36,40.32],[0.16,40.11],[0.04,40.01],[-0.08,39.88],[-0.33,39.52],[-0.33,39.42],[-0.2,39.06],[-0.13,38.97],[-0.03,38.89],[0.15,38.82],[0.2,38.76],[0.14,38.7],[-0.05,38.59],[-0.38,38.44],[-0.52,38.32],[-0.55,38.2],[-0.65,38.15],[-0.68,37.99],[-0.74,37.89],[-0.75,37.85],[-0.81,37.77],[-0.82,37.71],[-0.72,37.63],[-0.77,37.6],[-0.82,37.58],[-0.94,37.57],[-1.33,37.56],[-1.64,37.39],[-1.8,37.23],[-1.94,36.95],[-2.11,36.78],[-2.19,36.75],[-2.31,36.82],[-2.45,36.83],[-2.6,36.81],[-2.67,36.75],[-2.79,36.71],[-2.9,36.74],[-3.15,36.76],[-3.26,36.76],[-3.43,36.71],[-3.58,36.74],[-3.83,36.76],[-4.37,36.72],[-4.43,36.7],[-4.5,36.63],[-4.67,36.51],[-4.94,36.5],[-5.17,36.42],[-5.23,36.37],[-5.33,36.24],[-5.36,36.13],[-5.38,36.13],[-5.41,36.16],[-5.44,36.15],[-5.46,36.07],[-5.55,36.04],[-5.63,36.03],[-5.81,36.09],[-5.96,36.18],[-6.04,36.19],[-6.17,36.33],[-6.23,36.43],[-6.27,36.53],[-6.26,36.56],[-6.27,36.6],[-6.38,36.64],[-6.41,36.73],[-6.33,36.85],[-6.26,36.9],[-6.22,36.91],[-6.32,36.91],[-6.4,36.83],[-6.49,36.95],[-6.88,37.19],[-6.86,37.25],[-6.86,37.28],[-6.93,37.21],[-6.97,37.2],[-7.17,37.21],[-7.41,37.18],[-7.47,37.43],[-7.5,37.52],[-7.5,37.59],[-7.44,37.73],[-7.38,37.79],[-7.29,37.91],[-7.19,38.01],[-7.07,38.03],[-7.02,38.04],[-6.98,38.12],[-6.96,38.19],[-6.97,38.19],[-7.11,38.18],[-7.34,38.46],[-7.34,38.5],[-7.31,38.57],[-7.29,38.65],[-7.28,38.71],[-7.22,38.77],[-7.13,38.83],[-7.05,38.91],[-7.01,38.99],[-7.0,39.06],[-7.04,39.11],[-7.17,39.14],[-7.31,39.34],[-7.34,39.47],[-7.36,39.48],[-7.45,39.54],[-7.52,39.64],[-7.54,39.66],[-7.45,39.68],[-7.12,39.68],[-7.05,39.71],[-7.04,39.71],[-6.98,39.8],[-6.91,39.94],[-6.9,40.02],[-6.92,40.06],[-7.03,40.14],[-7.03,40.17],[-7.01,40.21],[-6.95,40.25],[-6.86,40.3],[-6.81,40.34],[-6.82,40.38],[-6.85,40.41],[-6.85,40.44],[-6.84,40.48],[-6.83,40.62],[-6.82,40.65],[-6.84,40.78],[-6.86,40.88],[-6.93,41.01],[-6.92,41.04],[-6.88,41.06],[-6.78,41.11],[-6.69,41.21],[-6.57,41.3],[-6.4,41.38],[-6.29,41.46],[-6.24,41.52],[-6.21,41.53],[-6.22,41.56],[-6.24,41.6],[-6.31,41.64],[-6.39,41.67],[-6.48,41.66],[-6.54,41.67],[-6.56,41.7],[-6.55,41.79],[-6.56,41.87],[-6.58,41.91],[-6.62,41.94],[-6.7,41.93],[-6.78,41.96],[-6.83,41.96],[-6.87,41.95],[-7.03,41.95],[-7.1,41.96],[-7.15,41.98],[-7.18,41.97],[-7.2,41.96],[-7.2,41.93],[-7.21,41.9],[-7.27,41.86],[-7.4,41.83],[-7.51,41.84],[-7.61,41.86],[-7.64,41.87],[-7.69,41.89],[-7.9,41.87],[-7.92,41.88],[-7.99,41.85],[-8.09,41.81],[-8.15,41.81],[-8.17,41.82],[-8.18,41.84],[-8.22,41.9],[-8.21,41.93],[-8.13,42.02],[-8.14,42.04],[-8.17,42.07],[-8.2,42.11],[-8.21,42.13],[-8.27,42.14],[-8.32,42.12],[-8.54,42.07],[-8.59,42.05],[-8.68,42.01],[-8.78,41.94],[-8.85,41.93],[-8.88,41.95],[-8.89,42.11],[-8.77,42.21],[-8.69,42.27],[-8.73,42.29],[-8.82,42.29],[-8.81,42.33],[-8.77,42.36],[-8.73,42.41],[-8.78,42.43],[-8.81,42.47],[-8.81,42.56],[-8.8,42.6],[-8.81,42.64],[-8.99,42.59],[-9.03,42.59],[-9.04,42.66],[-8.94,42.77],[-8.93,42.8],[-9.04,42.81],[-9.13,42.87],[-9.18,42.91],[-9.24,42.98],[-9.24,43.04],[-9.18,43.17],[-9.1,43.21],[-9.02,43.24],[-8.87,43.33],[-8.67,43.32],[-8.54,43.34],[-8.42,43.39],[-8.36,43.4],[-8.25,43.44],[-8.25,43.5],[-8.29,43.54],[-8.26,43.58],[-8.14,43.63],[-8.0,43.69],[-7.85,43.71],[-7.7,43.76],[-7.59,43.73],[-7.5,43.74],[-7.4,43.7],[-7.26,43.59],[-7.06,43.55],[-6.9,43.59],[-6.62,43.59],[-6.48,43.58],[-6.22,43.6],[-6.08,43.59],[-5.85,43.65],[-5.67,43.58],[-5.32,43.55],[-5.11,43.5],[-4.52,43.42],[-4.31,43.41],[-4.02,43.46],[-3.89,43.5],[-3.77,43.48],[-3.6,43.52],[-3.52,43.51],[-3.42,43.45],[-3.05,43.37],[-2.95,43.44],[-2.88,43.45],[-2.61,43.41],[-2.34,43.33],[-2.2,43.32],[-1.99,43.35],[-1.83,43.4],[-1.79,43.41],[-1.79,43.37],[-1.75,43.32],[-1.71,43.31],[-1.63,43.28],[-1.56,43.28],[-1.47,43.27],[-1.41,43.24],[-1.41,43.2],[-1.42,43.15],[-1.46,43.1],[-1.48,43.07],[-1.46,43.05],[-1.43,43.04],[-1.39,43.03],[-1.37,43.04],[-1.35,43.06],[-1.32,43.1],[-1.3,43.1],[-1.3,43.08],[-1.29,43.06],[-1.18,43.02],[-0.93,42.95],[-0.84,42.95],[-0.76,42.94],[-0.74,42.91],[-0.59,42.8],[-0.55,42.8],[-0.48,42.8],[-0.4,42.81],[-0.34,42.83],[-0.3,42.83],[-0.26,42.8],[-0.21,42.79],[-0.14,42.75],[-0.08,42.7],[-0.04,42.69],[0.2,42.72],[0.26,42.69],[0.31,42.69],[0.38,42.7],[0.52,42.69],[0.63,42.69],[0.64,42.7],[0.65,42.8],[0.67,42.84],[0.7,42.85],[0.76,42.84],[1.01,42.78],[1.11,42.74],[1.21,42.71],[1.29,42.71],[1.35,42.69],[1.43,42.6]],[[-17.89,27.81],[-17.98,27.65],[-18.11,27.71],[-18.14,27.73],[-18.16,27.76],[-18.04,27.77],[-17.92,27.85],[-17.89,27.81]],[[-15.4,28.15],[-15.41,28.07],[-15.38,27.99],[-15.39,27.87],[-15.44,27.81],[-15.56,27.75],[-15.66,27.76],[-15.71,27.78],[-15.81,27.89],[-15.81,27.99],[-15.72,28.06],[-15.68,28.15],[-15.45,28.14],[-15.43,28.15],[-15.42,28.16],[-15.4,28.15]],[[-17.18,28.02],[-17.23,28.01],[-17.27,28.04],[-17.32,28.12],[-17.29,28.18],[-17.26,28.2],[-17.21,28.2],[-17.13,28.16],[-17.1,28.11],[-17.1,28.08],[-17.18,28.02]],[[-16.33,28.38],[-16.42,28.15],[-16.5,28.06],[-16.54,28.03],[-16.66,28.01],[-16.79,28.15],[-16.87,28.29],[-16.91,28.34],[-16.84,28.38],[-16.75,28.37],[-16.56,28.4],[-16.52,28.41],[-16.32,28.56],[-16.12,28.58],[-16.12,28.53],[-16.33,28.38]],[[-14.2,28.17],[-14.33,28.06],[-14.47,28.08],[-14.49,28.1],[-14.36,28.13],[-14.23,28.22],[-14.15,28.41],[-14.03,28.62],[-14.0,28.71],[-13.95,28.74],[-13.89,28.74],[-13.86,28.74],[-13.83,28.69],[-13.83,28.59],[-13.86,28.41],[-13.93,28.25],[-14.2,28.17]],[[-17.83,28.49],[-17.86,28.49],[-17.88,28.56],[-18.0,28.76],[-17.93,28.84],[-17.8,28.85],[-17.74,28.79],[-17.73,28.72],[-17.75,28.69],[-17.74,28.62],[-17.76,28.57],[-17.83,28.49]],[[-13.72,28.91],[-13.78,28.85],[-13.86,28.87],[-13.82,29.01],[-13.79,29.06],[-13.65,29.12],[-13.54,29.14],[-13.5,29.21],[-13.46,29.24],[-13.42,29.2],[-13.45,29.15],[-13.48,29.01],[-13.55,28.96],[-13.72,28.91]],[[1.59,38.67],[1.57,38.66],[1.5,38.67],[1.41,38.67],[1.4,38.71],[1.42,38.74],[1.44,38.77],[1.5,38.71],[1.59,38.7],[1.59,38.67]],[[1.45,38.92],[1.41,38.86],[1.26,38.88],[1.22,38.9],[1.26,38.97],[1.3,38.98],[1.3,39.03],[1.35,39.08],[1.56,39.12],[1.61,39.09],[1.62,39.04],[1.49,38.93],[1.45,38.92]],[[3.15,39.79],[3.24,39.76],[3.34,39.79],[3.4,39.78],[3.45,39.76],[3.46,39.7],[3.41,39.63],[3.35,39.56],[3.29,39.48],[3.24,39.39],[3.15,39.33],[3.07,39.3],[2.9,39.37],[2.8,39.39],[2.77,39.41],[2.75,39.51],[2.7,39.54],[2.63,39.56],[2.58,39.53],[2.5,39.48],[2.46,39.53],[2.39,39.54],[2.37,39.57],[2.37,39.61],[2.78,39.85],[2.9,39.91],[3.16,39.97],[3.2,39.96],[3.16,39.92],[3.17,39.91],[3.2,39.89],[3.19,39.86],[3.16,39.84],[3.15,39.79]],[[4.29,39.84],[4.28,39.83],[3.97,39.95],[3.87,39.96],[3.84,39.98],[3.85,40.04],[3.85,40.06],[4.06,40.08],[4.23,40.03],[4.32,39.92],[4.32,39.9],[4.29,39.84]]]},{"n":"Estonia","r":[[[22.62,58.62],[22.69,58.6],[22.75,58.6],[22.82,58.62],[22.96,58.61],[23.29,58.48],[23.32,58.45],[23.13,58.44],[23.08,58.4],[23.04,58.37],[22.98,58.36],[22.89,58.31],[22.76,58.26],[22.73,58.23],[22.5,58.24],[22.37,58.22],[22.27,58.16],[22.23,58.05],[22.15,57.97],[22.08,57.94],[22.0,57.93],[21.98,57.96],[21.99,58.0],[22.15,58.12],[22.19,58.15],[22.1,58.17],[22.03,58.21],[21.88,58.26],[21.85,58.3],[21.89,58.3],[21.92,58.32],[21.97,58.35],[21.98,58.39],[21.86,58.5],[21.92,58.51],[22.0,58.51],[22.08,58.48],[22.17,58.52],[22.21,58.52],[22.27,58.51],[22.33,58.58],[22.47,58.6],[22.55,58.63],[22.62,58.62]],[[23.34,58.55],[23.26,58.54],[23.06,58.61],[23.11,58.66],[23.17,58.68],[23.33,58.65],[23.36,58.58],[23.34,58.55]],[[22.92,58.83],[22.84,58.78],[22.79,58.8],[22.77,58.82],[22.66,58.71],[22.54,58.69],[22.47,58.71],[22.48,58.75],[22.41,58.86],[22.31,58.9],[22.16,58.9],[22.06,58.94],[22.46,58.97],[22.5,59.03],[22.59,59.08],[22.65,59.09],[22.7,59.07],[22.71,59.03],[22.73,59.02],[22.91,58.99],[22.98,58.92],[23.01,58.83],[22.92,58.83]],[[28.01,59.48],[28.07,59.45],[28.13,59.4],[28.15,59.37],[28.13,59.36],[28.06,59.34],[28.05,59.33],[28.02,59.3],[27.94,59.3],[27.9,59.28],[27.85,59.19],[27.76,59.05],[27.62,58.94],[27.51,58.89],[27.46,58.84],[27.43,58.79],[27.43,58.73],[27.53,58.44],[27.53,58.38],[27.51,58.33],[27.49,58.27],[27.5,58.22],[27.57,58.14],[27.64,58.01],[27.67,57.93],[27.72,57.91],[27.77,57.88],[27.78,57.87],[27.78,57.86],[27.75,57.84],[27.54,57.8],[27.51,57.76],[27.49,57.72],[27.4,57.67],[27.37,57.61],[27.35,57.55],[27.35,57.53],[27.33,57.53],[27.19,57.54],[27.03,57.58],[26.97,57.61],[26.9,57.61],[26.82,57.59],[26.53,57.53],[26.46,57.54],[26.3,57.6],[26.22,57.66],[26.03,57.79],[26.02,57.81],[25.99,57.84],[25.79,57.87],[25.72,57.91],[25.66,57.92],[25.57,57.94],[25.34,58.04],[25.28,58.05],[25.27,58.03],[25.27,58.01],[25.26,58.0],[25.23,58.0],[25.18,58.03],[25.11,58.06],[24.91,58.0],[24.84,57.99],[24.78,57.99],[24.46,57.91],[24.36,57.87],[24.32,57.87],[24.33,57.91],[24.46,58.11],[24.49,58.26],[24.54,58.28],[24.55,58.3],[24.53,58.35],[24.39,58.39],[24.34,58.38],[24.29,58.33],[24.24,58.29],[24.11,58.27],[24.01,58.31],[23.77,58.36],[23.71,58.43],[23.69,58.51],[23.56,58.58],[23.51,58.66],[23.53,58.72],[23.65,58.75],[23.68,58.79],[23.53,58.78],[23.5,58.79],[23.5,58.82],[23.43,58.92],[23.49,58.96],[23.52,59.0],[23.47,59.03],[23.48,59.07],[23.52,59.11],[23.49,59.2],[23.64,59.24],[23.78,59.28],[24.08,59.29],[24.05,59.37],[24.18,59.38],[24.38,59.47],[24.58,59.46],[24.88,59.52],[25.44,59.52],[25.52,59.56],[25.51,59.6],[25.51,59.64],[25.62,59.63],[25.79,59.63],[26.46,59.55],[26.62,59.55],[26.85,59.47],[26.97,59.45],[27.34,59.45],[27.89,59.41],[28.0,59.47],[28.01,59.48]]]},{"n":"Ethiopia","r":[[[42.38,12.47],[42.28,12.32],[42.15,12.13],[42.0,11.91],[41.95,11.86],[41.82,11.72],[41.79,11.69],[41.77,11.59],[41.76,11.41],[41.78,11.19],[41.8,10.98],[41.87,10.96],[41.96,10.94],[42.05,10.97],[42.17,10.99],[42.31,11.01],[42.47,11.05],[42.56,11.08],[42.65,11.08],[42.74,11.04],[42.78,11.01],[42.84,11.0],[42.92,11.0],[42.91,10.96],[42.86,10.9],[42.81,10.85],[42.76,10.79],[42.66,10.62],[42.66,10.6],[42.67,10.57],[42.73,10.49],[42.78,10.37],[42.82,10.26],[42.84,10.2],[42.91,10.14],[43.01,10.01],[43.07,9.93],[43.18,9.88],[43.22,9.77],[43.3,9.61],[43.39,9.48],[43.48,9.38],[43.58,9.34],[43.62,9.34],[43.83,9.15],[43.98,9.01],[44.02,8.99],[44.31,8.89],[44.63,8.79],[44.89,8.7],[45.23,8.59],[45.56,8.48],[45.86,8.38],[46.3,8.23],[46.64,8.12],[46.92,8.03],[46.98,8.0],[47.31,8.0],[47.64,8.0],[47.98,8.0],[47.73,7.76],[47.45,7.49],[47.16,7.21],[46.97,7.03],[46.67,6.74],[46.42,6.5],[46.17,6.23],[45.93,6.0],[45.63,5.67],[45.44,5.46],[45.13,5.12],[44.94,4.91],[44.91,4.9],[44.64,4.92],[44.37,4.93],[44.03,4.95],[43.99,4.95],[43.89,4.93],[43.83,4.91],[43.58,4.85],[43.54,4.84],[43.33,4.75],[43.13,4.64],[43.02,4.56],[42.93,4.45],[42.89,4.36],[42.86,4.32],[42.79,4.29],[42.36,4.21],[42.23,4.2],[42.02,4.14],[41.92,4.03],[41.88,3.98],[41.74,3.98],[41.48,3.96],[41.37,3.95],[41.32,3.94],[41.22,3.94],[41.14,3.96],[41.09,3.99],[41.02,4.06],[40.87,4.19],[40.77,4.27],[40.53,4.18],[40.32,4.08],[40.01,3.95],[39.84,3.85],[39.79,3.75],[39.66,3.58],[39.54,3.47],[39.49,3.46],[39.23,3.48],[39.13,3.5],[38.97,3.52],[38.75,3.56],[38.61,3.6],[38.45,3.6],[38.23,3.62],[38.09,3.65],[37.94,3.75],[37.76,3.86],[37.58,3.99],[37.38,4.11],[37.15,4.25],[36.91,4.41],[36.85,4.43],[36.82,4.43],[36.55,4.44],[36.27,4.44],[36.08,4.45],[36.02,4.47],[35.98,4.5],[35.92,4.62],[35.85,4.7],[35.76,4.81],[35.76,4.95],[35.78,5.11],[35.8,5.16],[35.79,5.21],[35.79,5.28],[35.75,5.34],[35.47,5.42],[35.42,5.41],[35.38,5.39],[35.33,5.36],[35.29,5.38],[35.26,5.41],[35.26,5.46],[35.27,5.49],[35.25,5.51],[35.16,5.58],[35.08,5.67],[35.03,5.77],[34.98,5.86],[34.96,6.05],[34.9,6.16],[34.84,6.3],[34.75,6.57],[34.71,6.66],[34.64,6.72],[34.56,6.78],[34.48,6.9],[34.28,7.0],[34.2,7.08],[34.06,7.23],[34.03,7.3],[34.02,7.37],[33.98,7.43],[33.9,7.51],[33.67,7.67],[33.6,7.69],[33.52,7.71],[33.39,7.72],[33.23,7.76],[33.08,7.82],[33.01,7.87],[33.0,7.9],[33.01,7.95],[33.07,8.04],[33.17,8.25],[33.23,8.4],[33.28,8.44],[33.41,8.45],[33.55,8.44],[33.64,8.43],[33.79,8.43],[33.95,8.44],[34.02,8.49],[34.07,8.55],[34.09,8.58],[34.1,8.68],[34.1,8.75],[34.09,9.04],[34.08,9.22],[34.08,9.42],[34.08,9.46],[34.08,9.51],[34.12,9.73],[34.16,9.85],[34.19,9.92],[34.29,10.12],[34.31,10.19],[34.31,10.25],[34.28,10.53],[34.34,10.66],[34.43,10.79],[34.51,10.84],[34.57,10.88],[34.6,10.86],[34.67,10.8],[34.77,10.75],[34.82,10.76],[34.88,10.81],[34.93,10.86],[34.92,10.96],[34.97,11.16],[34.96,11.28],[35.01,11.42],[35.06,11.62],[35.08,11.75],[35.11,11.82],[35.25,11.96],[35.37,12.16],[35.45,12.3],[35.6,12.54],[35.67,12.62],[35.73,12.66],[35.82,12.68],[35.99,12.71],[36.11,12.73],[36.13,12.76],[36.14,12.81],[36.14,12.91],[36.16,13.09],[36.21,13.27],[36.27,13.41],[36.31,13.47],[36.35,13.53],[36.39,13.63],[36.45,13.84],[36.44,13.99],[36.52,14.26],[36.54,14.26],[36.68,14.31],[36.81,14.32],[36.94,14.28],[37.02,14.27],[37.06,14.29],[37.1,14.33],[37.13,14.41],[37.19,14.45],[37.26,14.45],[37.35,14.37],[37.51,14.16],[37.55,14.14],[37.57,14.15],[37.65,14.32],[37.71,14.46],[37.82,14.71],[37.88,14.85],[37.94,14.81],[38.0,14.74],[38.07,14.7],[38.14,14.68],[38.18,14.68],[38.22,14.65],[38.38,14.47],[38.43,14.43],[38.5,14.42],[38.81,14.48],[39.0,14.59],[39.02,14.63],[39.07,14.63],[39.14,14.58],[39.16,14.54],[39.2,14.48],[39.27,14.47],[39.45,14.51],[39.53,14.54],[39.6,14.52],[39.7,14.5],[39.76,14.5],[39.9,14.44],[40.06,14.46],[40.14,14.46],[40.22,14.43],[40.35,14.34],[40.52,14.23],[40.77,14.14],[40.82,14.11],[40.94,13.98],[41.12,13.74],[41.36,13.5],[41.62,13.31],[41.77,13.18],[41.86,13.03],[41.95,12.88],[42.05,12.82],[42.13,12.77],[42.22,12.66],[42.29,12.57],[42.38,12.47]]]},{"n":"Finland","r":[[[21.63,60.11],[21.54,60.1],[21.49,60.13],[21.51,60.15],[21.57,60.17],[21.63,60.17],[21.65,60.14],[21.63,60.11]],[[21.83,60.14],[21.73,60.11],[21.7,60.11],[21.7,60.17],[21.76,60.2],[21.86,60.2],[21.83,60.14]],[[22.18,60.37],[22.3,60.35],[22.35,60.36],[22.42,60.3],[22.31,60.27],[22.31,60.23],[22.35,60.2],[22.36,60.17],[22.26,60.17],[22.21,60.2],[22.19,60.24],[22.14,60.26],[22.08,60.29],[22.11,60.31],[22.13,60.36],[22.18,60.37]],[[21.99,60.34],[21.92,60.33],[21.82,60.38],[21.81,60.4],[21.85,60.41],[21.82,60.45],[21.83,60.47],[21.91,60.44],[21.95,60.4],[21.91,60.39],[21.98,60.36],[21.99,60.34]],[[21.45,60.53],[21.44,60.48],[21.37,60.49],[21.3,60.48],[21.24,60.53],[21.21,60.6],[21.22,60.62],[21.27,60.64],[21.3,60.6],[21.45,60.53]],[[21.22,63.24],[21.23,63.22],[21.29,63.23],[21.37,63.26],[21.42,63.25],[21.42,63.2],[21.38,63.2],[21.37,63.21],[21.32,63.18],[21.31,63.16],[21.25,63.15],[21.15,63.2],[21.08,63.28],[21.24,63.28],[21.22,63.26],[21.22,63.24]],[[24.85,64.99],[24.7,64.96],[24.58,64.98],[24.58,65.04],[24.65,65.07],[24.79,65.09],[24.97,65.06],[25.0,65.04],[24.89,65.03],[24.85,64.99]],[[28.97,69.02],[28.9,69.01],[28.69,68.96],[28.57,68.93],[28.41,68.9],[28.45,68.87],[28.71,68.87],[28.74,68.86],[28.77,68.84],[28.78,68.81],[28.75,68.77],[28.48,68.54],[28.47,68.49],[28.56,68.35],[28.69,68.19],[29.06,68.12],[29.34,68.06],[29.52,67.93],[29.82,67.75],[29.98,67.69],[29.99,67.67],[29.94,67.55],[29.75,67.43],[29.57,67.32],[29.39,67.2],[29.24,67.1],[29.09,66.97],[29.07,66.93],[29.07,66.89],[29.09,66.85],[29.29,66.7],[29.37,66.62],[29.46,66.53],[29.54,66.44],[29.59,66.36],[29.67,66.28],[29.72,66.23],[29.8,66.18],[29.9,66.09],[29.94,66.02],[30.09,65.79],[30.1,65.73],[30.1,65.68],[30.03,65.67],[29.88,65.66],[29.72,65.63],[29.72,65.62],[29.82,65.57],[29.73,65.47],[29.71,65.34],[29.62,65.27],[29.61,65.25],[29.61,65.23],[29.63,65.22],[29.81,65.2],[29.83,65.19],[29.83,65.15],[29.81,65.11],[29.72,65.08],[29.62,65.04],[29.6,65.0],[29.6,64.97],[29.64,64.91],[29.7,64.85],[29.78,64.8],[30.07,64.77],[30.11,64.73],[30.13,64.69],[30.12,64.64],[29.99,64.56],[29.99,64.52],[30.04,64.44],[30.11,64.37],[30.39,64.28],[30.49,64.24],[30.51,64.2],[30.53,64.14],[30.53,64.08],[30.5,64.02],[30.42,63.95],[30.21,63.8],[30.0,63.75],[29.99,63.74],[30.06,63.69],[30.42,63.5],[30.66,63.42],[30.97,63.3],[31.18,63.21],[31.25,63.14],[31.34,63.07],[31.44,63.01],[31.51,62.96],[31.54,62.92],[31.53,62.89],[31.44,62.78],[31.38,62.69],[31.29,62.57],[31.19,62.48],[30.94,62.32],[30.57,62.13],[30.48,62.07],[30.31,61.96],[30.01,61.76],[29.93,61.71],[29.69,61.55],[29.58,61.49],[29.49,61.44],[29.25,61.29],[28.99,61.17],[28.74,61.06],[28.66,61.0],[28.57,60.96],[28.46,60.92],[28.41,60.9],[28.15,60.75],[27.8,60.54],[27.76,60.53],[27.67,60.5],[27.53,60.49],[27.46,60.46],[27.24,60.54],[27.21,60.54],[27.08,60.53],[26.95,60.47],[26.72,60.46],[26.61,60.44],[26.53,60.41],[26.52,60.47],[26.55,60.55],[26.6,60.6],[26.61,60.63],[26.57,60.62],[26.5,60.55],[26.46,60.47],[26.38,60.42],[26.2,60.41],[26.04,60.47],[25.96,60.47],[26.01,60.43],[26.04,60.37],[26.04,60.34],[25.95,60.35],[25.85,60.31],[25.76,60.27],[25.72,60.27],[25.66,60.33],[25.55,60.3],[25.46,60.26],[25.27,60.25],[25.16,60.19],[24.96,60.16],[24.85,60.16],[24.6,60.11],[24.52,60.05],[24.45,60.02],[24.34,60.04],[24.03,60.01],[23.72,59.97],[23.59,59.97],[23.46,59.99],[23.33,59.93],[23.18,59.84],[23.02,59.82],[22.96,59.83],[23.01,59.87],[23.12,59.91],[23.19,59.97],[23.2,60.02],[23.15,60.04],[23.08,60.05],[22.99,60.1],[22.91,60.21],[22.87,60.22],[22.84,60.19],[22.82,60.1],[22.79,60.08],[22.75,60.06],[22.7,60.04],[22.65,60.03],[22.46,60.03],[22.44,60.07],[22.44,60.09],[22.47,60.15],[22.44,60.16],[22.47,60.2],[22.51,60.2],[22.56,60.21],[22.59,60.23],[22.59,60.26],[22.52,60.26],[22.51,60.28],[22.58,60.36],[22.58,60.38],[22.56,60.39],[22.52,60.38],[22.26,60.4],[21.93,60.5],[21.85,60.51],[21.81,60.59],[21.73,60.58],[21.61,60.53],[21.53,60.57],[21.44,60.6],[21.41,60.64],[21.41,60.7],[21.4,60.77],[21.38,60.85],[21.36,60.97],[21.38,61.06],[21.45,61.13],[21.48,61.17],[21.51,61.28],[21.52,61.41],[21.5,61.45],[21.51,61.48],[21.57,61.48],[21.55,61.51],[21.53,61.52],[21.5,61.55],[21.52,61.57],[21.59,61.57],[21.6,61.58],[21.61,61.59],[21.55,61.67],[21.55,61.7],[21.47,61.81],[21.38,61.91],[21.26,61.99],[21.3,62.11],[21.35,62.22],[21.34,62.28],[21.32,62.34],[21.17,62.41],[21.14,62.51],[21.1,62.62],[21.12,62.69],[21.14,62.74],[21.2,62.79],[21.46,62.95],[21.47,63.03],[21.65,63.04],[21.57,63.11],[21.55,63.16],[21.55,63.2],[21.8,63.24],[21.9,63.21],[22.12,63.24],[22.32,63.31],[22.32,63.35],[22.29,63.38],[22.24,63.44],[22.27,63.45],[22.35,63.44],[22.31,63.47],[22.32,63.5],[22.4,63.49],[22.53,63.58],[22.53,63.65],[22.76,63.68],[23.01,63.82],[23.13,63.86],[23.25,63.9],[23.49,64.03],[23.6,64.04],[23.65,64.13],[23.86,64.26],[23.92,64.27],[24.02,64.39],[24.28,64.52],[24.44,64.68],[24.53,64.74],[24.56,64.8],[24.66,64.81],[24.75,64.85],[24.94,64.88],[25.13,64.88],[25.21,64.85],[25.29,64.86],[25.28,64.92],[25.23,64.95],[25.27,64.98],[25.37,65.01],[25.36,65.07],[25.34,65.1],[25.26,65.14],[25.3,65.24],[25.31,65.35],[25.35,65.48],[25.24,65.55],[24.84,65.66],[24.76,65.66],[24.67,65.67],[24.58,65.76],[24.62,65.83],[24.63,65.86],[24.59,65.86],[24.53,65.82],[24.4,65.78],[24.24,65.81],[24.16,65.81],[24.05,65.99],[23.99,66.06],[23.91,66.15],[23.75,66.19],[23.72,66.22],[23.7,66.25],[23.69,66.3],[23.67,66.38],[23.68,66.44],[23.7,66.48],[23.77,66.51],[23.87,66.58],[23.89,66.63],[23.89,66.71],[23.94,66.78],[23.99,66.81],[23.98,66.84],[23.94,66.88],[23.87,66.93],[23.76,67.0],[23.68,67.07],[23.64,67.13],[23.62,67.18],[23.63,67.23],[23.66,67.27],[23.76,67.31],[23.77,67.33],[23.73,67.42],[23.66,67.44],[23.54,67.45],[23.47,67.45],[23.45,67.46],[23.45,67.48],[23.47,67.52],[23.5,67.56],[23.54,67.59],[23.54,67.61],[23.5,67.7],[23.49,67.8],[23.5,67.88],[23.63,67.93],[23.64,67.95],[23.47,68.02],[23.36,68.09],[23.32,68.13],[23.18,68.14],[23.1,68.26],[22.98,68.32],[22.85,68.37],[22.78,68.39],[22.36,68.46],[22.2,68.48],[22.0,68.52],[21.85,68.57],[21.72,68.61],[21.62,68.65],[21.47,68.69],[21.42,68.72],[21.26,68.79],[21.18,68.83],[20.92,68.91],[20.91,68.94],[20.91,68.97],[20.9,68.98],[20.62,69.04],[20.68,69.07],[20.89,69.07],[21.07,69.04],[21.1,69.05],[21.13,69.08],[21.05,69.19],[21.07,69.21],[21.14,69.25],[21.27,69.27],[21.46,69.28],[21.59,69.27],[21.62,69.27],[21.82,69.15],[21.99,69.04],[22.08,68.99],[22.3,68.86],[22.38,68.78],[22.41,68.72],[22.5,68.72],[22.81,68.7],[23.07,68.67],[23.14,68.64],[23.32,68.65],[23.46,68.68],[23.71,68.71],[23.77,68.76],[23.85,68.81],[24.0,68.8],[24.15,68.76],[24.33,68.71],[24.49,68.69],[24.7,68.65],[24.8,68.61],[24.94,68.59],[25.09,68.64],[25.17,68.77],[25.25,68.82],[25.36,68.86],[25.48,68.88],[25.58,68.89],[25.65,68.92],[25.75,68.99],[25.77,69.08],[25.75,69.23],[25.77,69.28],[25.85,69.37],[25.96,69.59],[26.01,69.65],[26.07,69.69],[26.16,69.71],[26.31,69.78],[26.53,69.92],[26.58,69.93],[26.74,69.93],[26.93,69.93],[27.11,69.9],[27.13,69.91],[27.21,69.92],[27.35,69.96],[27.59,70.04],[27.75,70.06],[27.89,70.06],[28.05,69.97],[28.27,69.87],[28.41,69.82],[28.8,69.73],[29.14,69.67],[29.33,69.47],[29.24,69.39],[29.19,69.37],[29.02,69.29],[28.85,69.18],[28.83,69.12],[28.89,69.06],[28.97,69.02]]]},{"n":"Fiji","r":[[[174.63,-21.7],[174.62,-21.71],[174.59,-21.7],[174.59,-21.68],[174.6,-21.67],[174.63,-21.68],[174.63,-21.7]],[[-178.71,-20.67],[-178.71,-20.67],[-178.71,-20.67],[-178.72,-20.67],[-178.73,-20.66],[-178.73,-20.65],[-178.73,-20.65],[-178.72,-20.65],[-178.72,-20.65],[-178.71,-20.66],[-178.71,-20.67]],[[-178.54,-19.17],[-178.55,-19.18],[-178.57,-19.16],[-178.6,-19.15],[-178.6,-19.14],[-178.59,-19.12],[-178.57,-19.11],[-178.56,-19.11],[-178.56,-19.12],[-178.58,-19.13],[-178.57,-19.14],[-178.56,-19.15],[-178.54,-19.16],[-178.54,-19.17]],[[178.49,-18.97],[178.49,-19.02],[178.36,-19.05],[178.32,-19.01],[178.29,-19.0],[178.21,-19.07],[178.19,-19.09],[178.18,-19.11],[178.16,-19.12],[178.02,-19.15],[177.96,-19.12],[178.0,-19.1],[178.05,-19.06],[178.1,-19.07],[178.16,-19.03],[178.21,-18.97],[178.28,-18.96],[178.33,-18.93],[178.42,-18.95],[178.49,-18.97]],[[-179.8,-18.94],[-179.8,-18.97],[-179.81,-18.97],[-179.83,-18.96],[-179.84,-18.96],[-179.85,-18.97],[-179.85,-18.99],[-179.85,-19.0],[-179.87,-19.0],[-179.87,-18.98],[-179.86,-18.96],[-179.86,-18.94],[-179.83,-18.92],[-179.8,-18.94]],[[-178.76,-18.23],[-178.77,-18.25],[-178.83,-18.22],[-178.85,-18.2],[-178.79,-18.19],[-178.76,-18.19],[-178.76,-18.23]],[[179.35,-18.1],[179.34,-18.11],[179.25,-18.03],[179.26,-18.0],[179.27,-17.97],[179.31,-17.94],[179.34,-17.99],[179.36,-18.07],[179.35,-18.1]],[[-178.99,-17.98],[-179.02,-17.99],[-179.04,-17.99],[-179.06,-17.97],[-179.08,-17.94],[-179.05,-17.92],[-179.0,-17.95],[-178.99,-17.98]],[[-178.25,-17.95],[-178.31,-17.96],[-178.36,-17.92],[-178.33,-17.88],[-178.28,-17.89],[-178.25,-17.93],[-178.25,-17.95]],[[178.83,-17.73],[178.78,-17.75],[178.75,-17.69],[178.79,-17.62],[178.83,-17.62],[178.85,-17.68],[178.83,-17.73]],[[178.28,-17.37],[178.28,-17.42],[178.31,-17.44],[178.34,-17.44],[178.41,-17.52],[178.52,-17.6],[178.59,-17.65],[178.6,-17.7],[178.57,-17.75],[178.6,-17.84],[178.62,-17.93],[178.67,-18.08],[178.6,-18.11],[178.49,-18.11],[178.46,-18.14],[178.42,-18.12],[178.33,-18.14],[178.24,-18.18],[178.16,-18.25],[178.06,-18.25],[177.96,-18.26],[177.85,-18.25],[177.77,-18.22],[177.64,-18.18],[177.46,-18.15],[177.38,-18.12],[177.32,-18.08],[177.26,-17.97],[177.25,-17.91],[177.26,-17.86],[177.32,-17.85],[177.36,-17.82],[177.37,-17.79],[177.39,-17.76],[177.41,-17.75],[177.42,-17.74],[177.41,-17.68],[177.4,-17.63],[177.5,-17.54],[177.62,-17.46],[177.82,-17.39],[177.94,-17.4],[178.13,-17.34],[178.19,-17.31],[178.25,-17.33],[178.28,-17.37]],[[179.42,-17.37],[179.39,-17.39],[179.37,-17.26],[179.41,-17.26],[179.43,-17.27],[179.45,-17.31],[179.42,-17.37]],[[-178.96,-17.27],[-178.98,-17.31],[-179.0,-17.29],[-178.98,-17.24],[-178.97,-17.21],[-179.01,-17.18],[-179.02,-17.16],[-179.01,-17.15],[-178.95,-17.18],[-178.92,-17.21],[-178.91,-17.22],[-178.92,-17.25],[-178.96,-17.27]],[[177.23,-17.15],[177.18,-17.16],[177.21,-17.08],[177.24,-17.06],[177.26,-17.05],[177.29,-17.05],[177.28,-17.1],[177.23,-17.15]],[[180.0,-16.96],[179.93,-17.0],[179.9,-16.96],[179.93,-16.88],[180.0,-16.79],[180.0,-16.86],[180.0,-16.96]],[[-179.97,-16.92],[-180.0,-16.96],[-180.0,-16.91],[-180.0,-16.86],[-180.0,-16.82],[-180.0,-16.79],[-179.89,-16.7],[-179.86,-16.69],[-179.82,-16.77],[-179.87,-16.85],[-179.97,-16.92]],[[180.0,-16.54],[179.99,-16.54],[179.98,-16.52],[180.0,-16.49],[180.0,-16.54]],[[-179.93,-16.5],[-180.0,-16.54],[-180.0,-16.49],[-179.94,-16.44],[-179.9,-16.43],[-179.93,-16.48],[-179.93,-16.5]],[[180.0,-16.17],[179.85,-16.3],[179.79,-16.37],[179.75,-16.45],[179.62,-16.53],[179.56,-16.64],[179.57,-16.75],[179.7,-16.63],[179.84,-16.54],[179.88,-16.52],[179.93,-16.52],[179.93,-16.55],[179.91,-16.58],[179.89,-16.67],[179.93,-16.74],[179.82,-16.74],[179.71,-16.74],[179.59,-16.79],[179.47,-16.81],[179.42,-16.81],[179.38,-16.79],[179.35,-16.77],[179.32,-16.72],[179.3,-16.71],[179.2,-16.71],[179.06,-16.81],[179.01,-16.9],[178.95,-16.9],[178.88,-16.89],[178.8,-16.95],[178.71,-16.98],[178.67,-16.92],[178.64,-16.85],[178.6,-16.8],[178.5,-16.79],[178.51,-16.73],[178.54,-16.7],[178.57,-16.66],[178.58,-16.62],[178.63,-16.65],[178.69,-16.67],[178.74,-16.63],[178.81,-16.63],[178.87,-16.54],[178.96,-16.48],[179.09,-16.44],[179.22,-16.41],[179.29,-16.4],[179.36,-16.38],[179.48,-16.29],[179.55,-16.25],[179.64,-16.22],[179.72,-16.21],[179.79,-16.22],[179.85,-16.21],[180.0,-16.15],[180.0,-16.17]],[[-179.96,-16.15],[-180.0,-16.17],[-180.0,-16.16],[-180.0,-16.15],[-179.97,-16.13],[-179.94,-16.13],[-179.96,-16.15]],[[177.12,-12.51],[177.08,-12.52],[177.02,-12.51],[177.01,-12.49],[177.03,-12.49],[177.07,-12.48],[177.12,-12.48],[177.13,-12.49],[177.12,-12.51]]]},{"n":"Falkland Islands","r":[[[-59.68,-52.23],[-59.75,-52.25],[-59.76,-52.24],[-59.78,-52.2],[-59.79,-52.16],[-59.79,-52.13],[-59.75,-52.14],[-59.68,-52.18],[-59.68,-52.23]],[[-58.44,-52.01],[-58.43,-52.1],[-58.51,-52.07],[-58.54,-52.03],[-58.5,-52.0],[-58.46,-52.0],[-58.44,-52.01]],[[-61.02,-51.79],[-60.95,-51.8],[-60.88,-51.79],[-60.92,-51.9],[-60.95,-51.95],[-61.03,-51.94],[-61.12,-51.88],[-61.15,-51.84],[-61.05,-51.81],[-61.02,-51.79]],[[-60.29,-51.46],[-60.14,-51.48],[-60.01,-51.41],[-59.92,-51.39],[-59.84,-51.4],[-59.79,-51.45],[-59.71,-51.44],[-59.49,-51.4],[-59.47,-51.41],[-59.39,-51.36],[-59.32,-51.38],[-59.27,-51.43],[-59.29,-51.48],[-59.35,-51.51],[-59.39,-51.56],[-59.44,-51.59],[-59.51,-51.63],[-59.57,-51.68],[-59.71,-51.81],[-59.92,-51.97],[-59.99,-51.98],[-60.13,-51.99],[-60.19,-51.98],[-60.25,-51.99],[-60.29,-52.07],[-60.35,-52.14],[-60.38,-52.15],[-60.45,-52.16],[-60.48,-52.17],[-60.51,-52.19],[-60.69,-52.19],[-60.81,-52.15],[-60.96,-52.06],[-60.76,-51.95],[-60.59,-51.95],[-60.45,-51.88],[-60.33,-51.84],[-60.29,-51.8],[-60.24,-51.77],[-60.24,-51.73],[-60.28,-51.72],[-60.33,-51.72],[-60.38,-51.74],[-60.5,-51.76],[-60.58,-51.71],[-60.53,-51.7],[-60.47,-51.7],[-60.28,-51.66],[-60.25,-51.64],[-60.3,-51.58],[-60.41,-51.55],[-60.51,-51.49],[-60.52,-51.46],[-60.52,-51.43],[-60.57,-51.36],[-60.52,-51.35],[-60.45,-51.4],[-60.29,-51.46]],[[-60.11,-51.4],[-60.25,-51.4],[-60.28,-51.36],[-60.28,-51.28],[-60.17,-51.27],[-60.07,-51.31],[-60.08,-51.34],[-60.11,-51.4]],[[-58.85,-51.27],[-58.7,-51.33],[-58.51,-51.31],[-58.43,-51.32],[-58.38,-51.37],[-58.41,-51.42],[-58.47,-51.41],[-58.52,-51.42],[-58.51,-51.48],[-58.47,-51.51],[-58.27,-51.57],[-58.23,-51.58],[-58.24,-51.55],[-58.28,-51.51],[-58.29,-51.46],[-58.26,-51.42],[-58.21,-51.4],[-57.98,-51.38],[-57.92,-51.4],[-57.81,-51.52],[-57.92,-51.53],[-57.96,-51.58],[-57.87,-51.6],[-57.79,-51.64],[-57.83,-51.68],[-57.84,-51.71],[-58.0,-51.74],[-58.15,-51.77],[-58.22,-51.82],[-58.34,-51.86],[-58.68,-51.94],[-58.64,-51.99],[-58.64,-52.02],[-58.65,-52.1],[-59.13,-52.01],[-59.2,-52.02],[-59.07,-52.17],[-59.16,-52.2],[-59.26,-52.18],[-59.34,-52.2],[-59.4,-52.31],[-59.53,-52.24],[-59.65,-52.13],[-59.65,-52.08],[-59.54,-51.97],[-59.57,-51.93],[-59.31,-51.78],[-59.26,-51.74],[-59.18,-51.71],[-59.1,-51.7],[-59.06,-51.69],[-59.07,-51.65],[-59.1,-51.59],[-59.1,-51.49],[-58.89,-51.36],[-58.92,-51.27],[-58.85,-51.27]]]},{"n":"France","r":[[[1.71,42.5],[1.71,42.53],[1.74,42.56],[1.74,42.58],[1.71,42.6],[1.57,42.64],[1.5,42.64],[1.46,42.62],[1.43,42.6],[1.35,42.69],[1.29,42.71],[1.21,42.71],[1.11,42.74],[1.01,42.78],[0.76,42.84],[0.7,42.85],[0.67,42.84],[0.65,42.8],[0.64,42.7],[0.63,42.69],[0.52,42.69],[0.38,42.7],[0.31,42.69],[0.26,42.69],[0.2,42.72],[-0.04,42.69],[-0.08,42.7],[-0.14,42.75],[-0.21,42.79],[-0.26,42.8],[-0.3,42.83],[-0.34,42.83],[-0.4,42.81],[-0.48,42.8],[-0.55,42.8],[-0.59,42.8],[-0.74,42.91],[-0.76,42.94],[-0.84,42.95],[-0.93,42.95],[-1.18,43.02],[-1.29,43.06],[-1.3,43.08],[-1.3,43.1],[-1.32,43.1],[-1.35,43.06],[-1.37,43.04],[-1.39,43.03],[-1.43,43.04],[-1.46,43.05],[-1.48,43.07],[-1.46,43.1],[-1.42,43.15],[-1.41,43.2],[-1.41,43.24],[-1.47,43.27],[-1.56,43.28],[-1.63,43.28],[-1.71,43.31],[-1.75,43.32],[-1.79,43.37],[-1.79,43.41],[-1.63,43.44],[-1.48,43.56],[-1.35,44.02],[-1.25,44.56],[-1.17,44.66],[-1.08,44.69],[-1.15,44.76],[-1.2,44.73],[-1.22,44.69],[-1.25,44.67],[-1.19,45.16],[-1.15,45.34],[-1.08,45.53],[-0.94,45.46],[-0.83,45.38],[-0.77,45.31],[-0.69,45.09],[-0.63,45.05],[-0.55,45.0],[-0.58,45.05],[-0.64,45.09],[-0.73,45.38],[-0.79,45.47],[-0.88,45.54],[-1.17,45.69],[-1.2,45.71],[-1.21,45.77],[-1.11,45.77],[-1.03,45.74],[-1.04,45.77],[-1.07,45.81],[-1.1,45.93],[-1.14,46.2],[-1.13,46.25],[-1.15,46.31],[-1.24,46.32],[-1.31,46.33],[-1.39,46.35],[-1.79,46.51],[-1.92,46.68],[-2.06,46.81],[-2.09,46.87],[-2.09,46.92],[-2.02,47.04],[-2.08,47.11],[-2.14,47.13],[-2.2,47.16],[-2.15,47.22],[-2.11,47.26],[-2.03,47.27],[-1.92,47.26],[-1.82,47.23],[-1.74,47.22],[-1.98,47.31],[-2.35,47.28],[-2.43,47.29],[-2.5,47.31],[-2.53,47.38],[-2.48,47.41],[-2.43,47.47],[-2.48,47.51],[-2.55,47.53],[-2.67,47.53],[-2.77,47.51],[-2.8,47.54],[-2.73,47.6],[-2.79,47.63],[-2.86,47.61],[-2.96,47.6],[-3.06,47.62],[-3.16,47.69],[-3.22,47.69],[-3.26,47.69],[-3.33,47.71],[-3.4,47.72],[-3.44,47.71],[-3.51,47.75],[-3.9,47.84],[-4.07,47.85],[-4.23,47.81],[-4.31,47.82],[-4.38,47.88],[-4.43,47.97],[-4.68,48.04],[-4.63,48.09],[-4.51,48.1],[-4.38,48.13],[-4.33,48.17],[-4.43,48.22],[-4.51,48.23],[-4.54,48.25],[-4.58,48.29],[-4.53,48.31],[-4.5,48.3],[-4.4,48.29],[-4.24,48.3],[-4.3,48.35],[-4.36,48.36],[-4.39,48.37],[-4.52,48.37],[-4.58,48.36],[-4.72,48.36],[-4.75,48.41],[-4.76,48.45],[-4.72,48.54],[-4.53,48.62],[-4.06,48.71],[-3.86,48.69],[-3.71,48.71],[-3.55,48.77],[-3.47,48.81],[-3.23,48.84],[-3.0,48.79],[-2.79,48.6],[-2.69,48.54],[-2.45,48.65],[-2.08,48.65],[-2.0,48.58],[-1.97,48.64],[-1.91,48.7],[-1.85,48.67],[-1.82,48.63],[-1.44,48.64],[-1.38,48.65],[-1.48,48.7],[-1.57,48.81],[-1.58,49.2],[-1.69,49.31],[-1.81,49.49],[-1.87,49.6],[-1.88,49.63],[-1.86,49.68],[-1.71,49.68],[-1.59,49.67],[-1.37,49.71],[-1.26,49.68],[-1.26,49.6],[-1.23,49.49],[-1.19,49.44],[-1.14,49.39],[-0.96,49.39],[-0.77,49.36],[-0.52,49.35],[-0.16,49.3],[-0.01,49.33],[0.14,49.4],[0.42,49.45],[0.44,49.47],[0.28,49.46],[0.13,49.51],[0.11,49.56],[0.13,49.6],[0.19,49.7],[0.62,49.86],[0.92,49.91],[1.25,50.0],[1.41,50.09],[1.51,50.21],[1.55,50.23],[1.59,50.25],[1.55,50.29],[1.58,50.74],[1.61,50.82],[1.67,50.89],[1.77,50.94],[1.91,50.99],[2.45,51.07],[2.52,51.1],[2.54,51.05],[2.57,50.99],[2.6,50.96],[2.58,50.91],[2.6,50.88],[2.67,50.81],[2.76,50.75],[2.84,50.71],[2.86,50.72],[2.92,50.73],[3.02,50.77],[3.11,50.78],[3.15,50.75],[3.18,50.73],[3.23,50.66],[3.25,50.59],[3.27,50.53],[3.32,50.51],[3.48,50.5],[3.6,50.48],[3.63,50.46],[3.67,50.32],[3.69,50.31],[3.72,50.32],[3.75,50.34],[3.79,50.35],[3.86,50.34],[3.95,50.34],[4.04,50.32],[4.17,50.25],[4.17,50.22],[4.14,50.18],[4.14,50.14],[4.16,50.13],[4.19,50.09],[4.18,50.05],[4.15,50.02],[4.14,50.0],[4.14,49.98],[4.15,49.97],[4.18,49.96],[4.37,49.94],[4.55,49.96],[4.66,50.0],[4.68,50.05],[4.71,50.1],[4.77,50.14],[4.82,50.15],[4.86,50.14],[4.79,49.96],[4.84,49.91],[4.85,49.85],[4.87,49.79],[4.93,49.79],[5.01,49.78],[5.06,49.76],[5.12,49.72],[5.22,49.69],[5.28,49.68],[5.3,49.65],[5.35,49.62],[5.43,49.55],[5.51,49.51],[5.54,49.51],[5.61,49.53],[5.71,49.54],[5.79,49.54],[5.82,49.51],[5.9,49.49],[5.93,49.48],[5.96,49.45],[6.01,49.45],[6.07,49.45],[6.12,49.49],[6.18,49.5],[6.24,49.49],[6.28,49.48],[6.34,49.45],[6.38,49.46],[6.46,49.44],[6.53,49.39],[6.57,49.35],[6.57,49.32],[6.61,49.29],[6.74,49.16],[6.78,49.15],[6.82,49.17],[6.85,49.2],[6.89,49.21],[6.96,49.19],[7.0,49.18],[7.02,49.12],[7.04,49.11],[7.07,49.12],[7.12,49.13],[7.2,49.11],[7.31,49.13],[7.4,49.15],[7.45,49.15],[7.53,49.09],[7.61,49.06],[7.8,49.04],[8.0,49.01],[8.08,48.99],[8.13,48.97],[8.14,48.89],[8.12,48.87],[7.92,48.7],[7.84,48.64],[7.79,48.55],[7.77,48.41],[7.71,48.28],[7.62,48.16],[7.58,48.06],[7.61,48.0],[7.59,47.91],[7.54,47.77],[7.53,47.67],[7.57,47.61],[7.62,47.59],[7.49,47.55],[7.47,47.51],[7.42,47.46],[7.34,47.43],[7.27,47.43],[7.2,47.43],[7.17,47.45],[7.17,47.47],[7.14,47.49],[7.05,47.49],[6.97,47.45],[6.9,47.39],[6.92,47.36],[6.98,47.35],[7.0,47.34],[7.0,47.32],[6.98,47.3],[6.95,47.27],[6.82,47.16],[6.69,47.06],[6.67,47.03],[6.62,47.0],[6.46,46.95],[6.44,46.93],[6.43,46.83],[6.41,46.76],[6.29,46.68],[6.16,46.61],[6.13,46.57],[6.11,46.52],[6.07,46.46],[6.06,46.43],[6.12,46.38],[6.12,46.34],[6.1,46.28],[6.04,46.24],[5.97,46.21],[5.97,46.15],[6.01,46.14],[6.09,46.15],[6.2,46.19],[6.27,46.25],[6.23,46.31],[6.22,46.32],[6.23,46.33],[6.32,46.39],[6.43,46.43],[6.58,46.44],[6.76,46.42],[6.78,46.41],[6.77,46.37],[6.78,46.31],[6.82,46.28],[6.77,46.17],[6.81,46.13],[6.86,46.09],[6.9,46.05],[6.95,46.02],[7.0,45.96],[7.02,45.93],[6.94,45.87],[6.8,45.81],[6.79,45.78],[6.79,45.74],[6.81,45.71],[6.88,45.67],[6.96,45.58],[7.01,45.5],[7.13,45.42],[7.15,45.4],[7.15,45.38],[7.12,45.35],[7.08,45.24],[7.03,45.22],[6.98,45.22],[6.84,45.14],[6.78,45.15],[6.69,45.14],[6.63,45.12],[6.63,45.07],[6.69,45.02],[6.72,44.97],[6.74,44.92],[6.8,44.88],[6.89,44.86],[6.94,44.86],[6.97,44.85],[6.99,44.83],[7.03,44.72],[7.01,44.69],[6.96,44.68],[6.93,44.63],[6.88,44.56],[6.84,44.51],[6.88,44.46],[6.89,44.43],[6.87,44.39],[6.9,44.34],[6.97,44.28],[7.15,44.2],[7.32,44.14],[7.37,44.13],[7.6,44.17],[7.64,44.16],[7.67,44.12],[7.68,44.08],[7.65,44.03],[7.59,43.97],[7.52,43.91],[7.48,43.86],[7.49,43.82],[7.49,43.77],[7.44,43.75],[7.44,43.76],[7.41,43.77],[7.4,43.77],[7.38,43.75],[7.38,43.73],[7.26,43.7],[7.18,43.66],[6.86,43.44],[6.72,43.37],[6.69,43.33],[6.66,43.26],[6.57,43.2],[6.49,43.17],[6.31,43.14],[6.12,43.07],[6.03,43.1],[5.81,43.1],[5.67,43.18],[5.41,43.23],[5.32,43.34],[5.2,43.35],[5.12,43.35],[5.07,43.37],[5.06,43.41],[5.06,43.44],[4.98,43.43],[4.91,43.43],[4.87,43.41],[4.84,43.39],[4.81,43.41],[4.79,43.4],[4.79,43.38],[4.71,43.37],[4.63,43.39],[4.41,43.45],[4.38,43.46],[4.22,43.48],[4.16,43.5],[4.11,43.56],[4.08,43.58],[4.05,43.59],[3.91,43.56],[3.86,43.52],[3.78,43.46],[3.26,43.19],[3.16,43.08],[3.05,42.92],[3.04,42.84],[3.09,42.59],[3.2,42.46],[3.21,42.43],[3.15,42.43],[3.05,42.45],[2.97,42.47],[2.89,42.46],[2.82,42.43],[2.75,42.41],[2.7,42.41],[2.67,42.39],[2.65,42.36],[2.65,42.34],[2.57,42.35],[2.37,42.39],[2.2,42.42],[2.1,42.39],[2.03,42.35],[1.99,42.36],[1.95,42.39],[1.93,42.43],[1.86,42.46],[1.71,42.5]],[[-51.65,4.06],[-51.68,4.04],[-51.77,3.99],[-51.81,3.93],[-51.83,3.87],[-51.88,3.83],[-51.93,3.78],[-51.94,3.74],[-51.99,3.7],[-52.0,3.65],[-52.12,3.45],[-52.16,3.36],[-52.23,3.27],[-52.27,3.24],[-52.33,3.18],[-52.36,3.12],[-52.36,3.05],[-52.4,2.97],[-52.42,2.9],[-52.46,2.86],[-52.55,2.65],[-52.56,2.57],[-52.58,2.53],[-52.65,2.43],[-52.7,2.36],[-52.78,2.32],[-52.87,2.27],[-52.9,2.21],[-52.96,2.18],[-53.01,2.18],[-53.08,2.2],[-53.18,2.21],[-53.23,2.2],[-53.25,2.23],[-53.29,2.3],[-53.33,2.34],[-53.37,2.32],[-53.43,2.28],[-53.51,2.25],[-53.56,2.26],[-53.68,2.29],[-53.73,2.31],[-53.75,2.34],[-53.77,2.35],[-53.79,2.35],[-53.83,2.31],[-53.88,2.28],[-53.95,2.23],[-54.09,2.15],[-54.13,2.12],[-54.17,2.14],[-54.23,2.15],[-54.29,2.15],[-54.43,2.21],[-54.52,2.25],[-54.55,2.29],[-54.59,2.31],[-54.62,2.33],[-54.6,2.34],[-54.57,2.34],[-54.54,2.34],[-54.49,2.42],[-54.4,2.46],[-54.26,2.71],[-54.2,2.82],[-54.19,2.87],[-54.17,2.99],[-54.2,3.14],[-54.19,3.18],[-54.06,3.35],[-54.01,3.45],[-54.01,3.53],[-53.99,3.59],[-54.01,3.62],[-54.03,3.63],[-54.08,3.71],[-54.11,3.77],[-54.2,3.83],[-54.26,3.9],[-54.35,4.05],[-54.34,4.14],[-54.37,4.17],[-54.4,4.2],[-54.4,4.24],[-54.42,4.34],[-54.44,4.43],[-54.45,4.49],[-54.43,4.58],[-54.44,4.69],[-54.47,4.75],[-54.48,4.84],[-54.47,4.91],[-54.45,4.96],[-54.45,5.01],[-54.33,5.19],[-54.24,5.29],[-54.16,5.36],[-54.09,5.41],[-53.99,5.68],[-53.92,5.77],[-53.85,5.78],[-53.45,5.56],[-53.27,5.54],[-52.9,5.43],[-52.76,5.27],[-52.45,5.02],[-52.29,4.94],[-52.29,4.88],[-52.32,4.77],[-52.22,4.86],[-52.06,4.72],[-52.01,4.65],[-51.96,4.51],[-51.98,4.43],[-52.0,4.39],[-52.0,4.35],[-51.95,4.4],[-51.93,4.44],[-51.92,4.52],[-51.88,4.63],[-51.83,4.64],[-51.79,4.57],[-51.7,4.29],[-51.67,4.23],[-51.65,4.14],[-51.66,4.1],[-51.65,4.06]],[[55.8,-21.34],[55.66,-21.37],[55.56,-21.36],[55.36,-21.27],[55.31,-21.22],[55.23,-21.06],[55.25,-21.0],[55.31,-20.9],[55.45,-20.87],[55.6,-20.88],[55.66,-20.91],[55.74,-21.02],[55.84,-21.14],[55.82,-21.28],[55.8,-21.34]],[[45.18,-12.98],[45.12,-12.98],[45.09,-12.96],[45.07,-12.9],[45.09,-12.84],[45.09,-12.79],[45.04,-12.7],[45.09,-12.65],[45.13,-12.71],[45.16,-12.71],[45.22,-12.75],[45.2,-12.82],[45.21,-12.85],[45.18,-12.92],[45.18,-12.98]],[[-60.83,14.49],[-60.84,14.44],[-60.86,14.43],[-60.9,14.47],[-61.06,14.47],[-61.09,14.51],[-61.09,14.53],[-61.01,14.6],[-61.1,14.62],[-61.14,14.65],[-61.22,14.8],[-61.21,14.85],[-61.18,14.87],[-61.13,14.88],[-61.03,14.83],[-60.95,14.76],[-60.93,14.76],[-60.92,14.74],[-60.93,14.69],[-60.89,14.64],[-60.87,14.61],[-60.83,14.49]],[[-61.23,15.89],[-61.29,15.89],[-61.31,15.89],[-61.32,15.95],[-61.28,16.0],[-61.25,16.01],[-61.21,15.96],[-61.2,15.92],[-61.23,15.89]],[[-61.59,16.01],[-61.67,15.96],[-61.71,15.98],[-61.76,16.06],[-61.79,16.3],[-61.77,16.34],[-61.75,16.36],[-61.64,16.33],[-61.6,16.29],[-61.55,16.27],[-61.58,16.23],[-61.56,16.05],[-61.59,16.01]],[[-61.33,16.23],[-61.44,16.22],[-61.52,16.23],[-61.54,16.3],[-61.5,16.36],[-61.53,16.43],[-61.51,16.48],[-61.47,16.51],[-61.41,16.47],[-61.4,16.41],[-61.36,16.36],[-61.17,16.26],[-61.33,16.23]],[[9.48,42.81],[9.45,42.66],[9.47,42.62],[9.51,42.59],[9.53,42.55],[9.56,42.16],[9.55,42.13],[9.43,41.97],[9.4,41.93],[9.39,41.73],[9.37,41.68],[9.33,41.63],[9.25,41.46],[9.19,41.38],[9.0,41.48],[8.9,41.52],[8.84,41.56],[8.81,41.59],[8.83,41.63],[8.88,41.67],[8.89,41.7],[8.77,41.74],[8.72,41.76],[8.72,41.8],[8.76,41.87],[8.74,41.93],[8.67,41.92],[8.62,41.93],[8.62,41.96],[8.65,42.0],[8.7,42.04],[8.7,42.1],[8.64,42.12],[8.59,42.16],[8.57,42.22],[8.61,42.26],[8.68,42.28],[8.63,42.34],[8.59,42.34],[8.57,42.36],[8.59,42.39],[8.64,42.43],[8.71,42.55],[8.81,42.61],[8.99,42.65],[9.04,42.66],[9.09,42.7],[9.14,42.73],[9.2,42.73],[9.25,42.71],[9.29,42.69],[9.31,42.71],[9.34,42.77],[9.32,42.81],[9.33,42.94],[9.36,43.02],[9.42,43.02],[9.46,42.98],[9.46,42.95],[9.48,42.86],[9.48,42.81]],[[-1.18,45.9],[-1.21,45.82],[-1.28,45.9],[-1.37,45.97],[-1.39,46.03],[-1.39,46.05],[-1.29,46.0],[-1.18,45.9]]]},{"n":"Faroe Islands","r":[[[-6.7,61.44],[-6.68,61.41],[-6.7,61.42],[-6.77,61.45],[-6.89,61.53],[-6.93,61.6],[-6.93,61.63],[-6.91,61.63],[-6.88,61.6],[-6.77,61.58],[-6.74,61.57],[-6.74,61.54],[-6.7,61.5],[-6.7,61.44]],[[-6.62,61.81],[-6.64,61.77],[-6.67,61.77],[-6.76,61.82],[-6.84,61.84],[-6.86,61.86],[-6.88,61.9],[-6.84,61.9],[-6.79,61.9],[-6.66,61.86],[-6.63,61.83],[-6.62,61.81]],[[-7.19,62.14],[-7.1,62.1],[-7.07,62.07],[-7.12,62.05],[-7.18,62.04],[-7.25,62.05],[-7.38,62.07],[-7.42,62.14],[-7.34,62.14],[-7.24,62.15],[-7.19,62.14]],[[-6.63,62.23],[-6.66,62.09],[-6.7,62.09],[-6.77,62.13],[-6.82,62.14],[-6.84,62.12],[-6.84,62.1],[-6.81,62.08],[-6.72,61.99],[-6.71,61.96],[-6.73,61.95],[-6.81,61.98],[-7.01,62.09],[-7.17,62.29],[-6.96,62.32],[-6.8,62.27],[-6.63,62.23]],[[-6.41,62.26],[-6.45,62.19],[-6.52,62.2],[-6.54,62.21],[-6.56,62.22],[-6.55,62.28],[-6.55,62.36],[-6.47,62.29],[-6.41,62.26]]]},{"n":"Federated States of Micronesia","r":[[[162.98,5.33],[162.99,5.28],[162.93,5.3],[162.92,5.32],[162.96,5.34],[162.98,5.33]],[[158.31,6.81],[158.26,6.79],[158.18,6.8],[158.16,6.88],[158.13,6.9],[158.13,6.94],[158.19,6.98],[158.29,6.95],[158.33,6.89],[158.31,6.85],[158.31,6.81]],[[151.65,7.35],[151.64,7.33],[151.58,7.34],[151.57,7.35],[151.58,7.35],[151.6,7.36],[151.61,7.38],[151.59,7.38],[151.61,7.39],[151.63,7.39],[151.64,7.38],[151.65,7.36],[151.65,7.35]],[[151.88,7.43],[151.86,7.43],[151.86,7.43],[151.86,7.46],[151.87,7.47],[151.88,7.47],[151.91,7.46],[151.91,7.45],[151.88,7.43]],[[138.14,9.5],[138.07,9.42],[138.06,9.45],[138.09,9.49],[138.12,9.55],[138.15,9.58],[138.19,9.59],[138.21,9.55],[138.18,9.51],[138.14,9.5]]]},{"n":"Gabon","r":[[[11.33,2.17],[11.34,2.23],[11.35,2.26],[11.35,2.3],[11.56,2.3],[11.94,2.29],[12.11,2.29],[12.15,2.28],[12.36,2.3],[12.53,2.28],[12.6,2.27],[12.67,2.26],[12.87,2.25],[13.13,2.26],[13.22,2.26],[13.27,2.22],[13.29,2.16],[13.29,2.09],[13.21,1.92],[13.17,1.79],[13.16,1.65],[13.18,1.54],[13.22,1.45],[13.25,1.37],[13.23,1.31],[13.19,1.28],[13.22,1.25],[13.27,1.24],[13.37,1.27],[13.52,1.31],[13.72,1.38],[13.85,1.42],[14.07,1.4],[14.18,1.37],[14.24,1.32],[14.3,1.12],[14.33,1.09],[14.39,1.0],[14.43,0.9],[14.44,0.85],[14.43,0.81],[14.39,0.76],[14.34,0.67],[14.32,0.62],[14.28,0.59],[14.23,0.55],[14.09,0.54],[14.07,0.51],[14.03,0.43],[13.95,0.35],[13.92,0.28],[13.88,0.19],[13.89,0.08],[13.88,-0.09],[13.86,-0.2],[13.9,-0.24],[14.07,-0.27],[14.1,-0.29],[14.15,-0.36],[14.21,-0.43],[14.36,-0.47],[14.42,-0.52],[14.47,-0.57],[14.48,-0.62],[14.44,-0.8],[14.41,-0.97],[14.42,-1.1],[14.44,-1.23],[14.46,-1.41],[14.45,-1.53],[14.4,-1.59],[14.4,-1.65],[14.42,-1.71],[14.38,-1.89],[14.36,-1.92],[14.29,-1.95],[14.25,-2.0],[14.24,-2.08],[14.2,-2.18],[14.16,-2.22],[14.16,-2.27],[14.2,-2.3],[14.2,-2.35],[14.13,-2.42],[14.09,-2.47],[13.99,-2.49],[13.89,-2.47],[13.86,-2.43],[13.89,-2.37],[13.88,-2.33],[13.84,-2.28],[13.78,-2.16],[13.73,-2.14],[13.71,-2.19],[13.62,-2.28],[13.46,-2.4],[13.36,-2.4],[13.16,-2.37],[12.99,-2.31],[12.91,-2.18],[12.86,-2.06],[12.79,-1.93],[12.71,-1.87],[12.63,-1.83],[12.59,-1.83],[12.47,-1.9],[12.43,-1.93],[12.43,-1.99],[12.44,-2.05],[12.46,-2.08],[12.48,-2.11],[12.48,-2.17],[12.45,-2.25],[12.45,-2.33],[12.06,-2.41],[12.0,-2.38],[11.95,-2.34],[11.89,-2.35],[11.73,-2.39],[11.67,-2.36],[11.61,-2.34],[11.58,-2.36],[11.58,-2.4],[11.6,-2.6],[11.59,-2.67],[11.56,-2.77],[11.54,-2.84],[11.64,-2.86],[11.68,-2.89],[11.71,-2.94],[11.76,-2.98],[11.76,-3.01],[11.71,-3.06],[11.69,-3.13],[11.72,-3.18],[11.78,-3.23],[11.89,-3.28],[11.93,-3.32],[11.93,-3.35],[11.88,-3.42],[11.86,-3.48],[11.83,-3.53],[11.84,-3.58],[11.88,-3.63],[11.88,-3.67],[11.85,-3.7],[11.79,-3.69],[11.73,-3.69],[11.69,-3.68],[11.54,-3.52],[11.5,-3.52],[11.29,-3.64],[11.23,-3.69],[11.19,-3.76],[11.13,-3.92],[11.03,-3.83],[10.95,-3.66],[10.85,-3.56],[10.64,-3.4],[10.59,-3.28],[10.35,-3.01],[10.01,-2.75],[9.76,-2.52],[9.72,-2.47],[9.76,-2.47],[10.0,-2.59],[10.03,-2.58],[10.06,-2.55],[9.96,-2.49],[9.86,-2.44],[9.77,-2.41],[9.68,-2.42],[9.62,-2.37],[9.59,-2.29],[9.57,-2.23],[9.53,-2.16],[9.4,-2.03],[9.37,-1.98],[9.3,-1.9],[9.34,-1.89],[9.48,-1.96],[9.5,-1.93],[9.48,-1.89],[9.34,-1.83],[9.27,-1.83],[9.25,-1.78],[9.26,-1.73],[9.16,-1.53],[9.05,-1.38],[9.04,-1.31],[9.32,-1.63],[9.36,-1.64],[9.41,-1.63],[9.52,-1.6],[9.5,-1.56],[9.45,-1.51],[9.4,-1.53],[9.33,-1.53],[9.3,-1.52],[9.28,-1.48],[9.35,-1.32],[9.32,-1.33],[9.3,-1.36],[9.26,-1.37],[9.2,-1.38],[9.06,-1.3],[8.94,-1.07],[8.91,-1.02],[8.88,-0.95],[8.84,-0.91],[8.7,-0.59],[8.76,-0.61],[8.82,-0.71],[8.95,-0.69],[9.0,-0.63],[9.04,-0.64],[9.08,-0.62],[9.14,-0.57],[9.3,-0.35],[9.34,-0.06],[9.33,0.12],[9.3,0.29],[9.35,0.34],[9.38,0.31],[9.39,0.25],[9.41,0.2],[9.47,0.16],[9.57,0.15],[9.74,0.08],[9.8,0.04],[9.81,0.13],[10.0,0.19],[9.94,0.22],[9.78,0.19],[9.55,0.3],[9.47,0.36],[9.4,0.49],[9.32,0.55],[9.33,0.61],[9.5,0.66],[9.54,0.66],[9.56,0.59],[9.6,0.57],[9.62,0.58],[9.63,0.63],[9.63,0.78],[9.58,0.99],[9.59,1.03],[9.64,1.05],[9.68,1.07],[9.7,1.08],[9.76,1.07],[9.79,1.03],[9.8,1.0],[9.86,0.99],[9.91,0.96],[9.95,0.97],[9.98,1.0],[10.03,1.0],[10.18,1.0],[10.32,1.0],[10.59,1.0],[10.86,1.0],[11.13,1.0],[11.34,1.0],[11.33,1.12],[11.33,1.31],[11.33,1.53],[11.33,1.74],[11.33,1.94],[11.33,2.17]]]},{"n":"United Kingdom","r":[[[-1.07,50.69],[-1.15,50.66],[-1.18,50.62],[-1.2,50.6],[-1.25,50.59],[-1.31,50.59],[-1.52,50.67],[-1.56,50.67],[-1.52,50.7],[-1.39,50.73],[-1.31,50.77],[-1.14,50.73],[-1.07,50.69]],[[-4.2,53.32],[-4.15,53.3],[-4.05,53.31],[-4.08,53.26],[-4.2,53.22],[-4.28,53.17],[-4.37,53.13],[-4.42,53.18],[-4.47,53.18],[-4.55,53.26],[-4.57,53.39],[-4.46,53.42],[-4.32,53.42],[-4.2,53.32]],[[-6.22,54.09],[-6.3,54.09],[-6.36,54.08],[-6.4,54.06],[-6.44,54.06],[-6.55,54.06],[-6.65,54.06],[-6.66,54.08],[-6.65,54.16],[-6.67,54.18],[-6.77,54.2],[-6.8,54.21],[-6.86,54.27],[-6.87,54.29],[-6.88,54.33],[-6.94,54.37],[-7.01,54.41],[-7.05,54.41],[-7.13,54.36],[-7.2,54.3],[-7.18,54.27],[-7.16,54.24],[-7.19,54.21],[-7.31,54.16],[-7.32,54.13],[-7.36,54.12],[-7.41,54.14],[-7.54,54.13],[-7.61,54.14],[-7.68,54.19],[-7.85,54.22],[-7.88,54.28],[-7.92,54.3],[-8.12,54.41],[-8.14,54.45],[-8.12,54.48],[-8.04,54.51],[-7.79,54.57],[-7.75,54.59],[-7.75,54.62],[-7.82,54.64],[-7.89,54.67],[-7.91,54.68],[-7.91,54.7],[-7.87,54.72],[-7.8,54.72],[-7.74,54.71],[-7.69,54.73],[-7.61,54.75],[-7.55,54.77],[-7.5,54.83],[-7.45,54.88],[-7.45,54.91],[-7.4,55.0],[-7.38,55.03],[-7.22,55.09],[-7.18,55.06],[-7.1,55.05],[-7.03,55.08],[-6.95,55.18],[-6.89,55.19],[-6.82,55.18],[-6.7,55.19],[-6.48,55.24],[-6.38,55.24],[-6.23,55.22],[-6.13,55.22],[-6.04,55.14],[-5.99,55.03],[-5.87,54.92],[-5.72,54.82],[-5.71,54.76],[-5.77,54.72],[-5.88,54.68],[-5.88,54.64],[-5.8,54.66],[-5.74,54.67],[-5.58,54.66],[-5.53,54.62],[-5.49,54.55],[-5.47,54.5],[-5.48,54.44],[-5.53,54.46],[-5.57,54.51],[-5.62,54.54],[-5.67,54.55],[-5.65,54.48],[-5.66,54.38],[-5.63,54.37],[-5.56,54.37],[-5.61,54.27],[-5.71,54.25],[-5.83,54.24],[-5.85,54.2],[-5.88,54.16],[-5.94,54.09],[-6.02,54.05],[-6.12,54.06],[-6.22,54.09]],[[-5.11,55.45],[-5.23,55.45],[-5.28,55.46],[-5.33,55.48],[-5.39,55.62],[-5.37,55.67],[-5.35,55.69],[-5.32,55.71],[-5.25,55.72],[-5.19,55.69],[-5.16,55.67],[-5.1,55.57],[-5.09,55.49],[-5.11,55.45]],[[-6.13,55.93],[-6.09,55.8],[-6.06,55.72],[-6.06,55.7],[-6.09,55.66],[-6.25,55.61],[-6.31,55.61],[-6.31,55.62],[-6.27,55.67],[-6.3,55.73],[-6.29,55.77],[-6.3,55.78],[-6.33,55.77],[-6.45,55.7],[-6.49,55.7],[-6.5,55.71],[-6.47,55.77],[-6.46,55.81],[-6.45,55.83],[-6.41,55.85],[-6.37,55.87],[-6.34,55.87],[-6.31,55.86],[-6.22,55.9],[-6.13,55.93]],[[-5.97,55.81],[-5.99,55.8],[-6.04,55.81],[-6.06,55.82],[-6.07,55.85],[-6.07,55.89],[-6.04,55.93],[-5.91,55.97],[-5.97,55.99],[-5.97,56.0],[-5.94,56.05],[-5.8,56.11],[-5.76,56.12],[-5.73,56.12],[-5.8,56.01],[-5.97,55.81]],[[-5.78,56.34],[-6.18,56.29],[-6.31,56.29],[-6.33,56.32],[-6.3,56.34],[-6.18,56.36],[-6.14,56.49],[-6.31,56.55],[-6.32,56.57],[-6.31,56.6],[-6.29,56.61],[-6.18,56.64],[-6.14,56.65],[-6.1,56.65],[-6.03,56.61],[-5.95,56.53],[-5.84,56.52],[-5.76,56.49],[-5.78,56.34]],[[-6.61,56.59],[-6.66,56.58],[-6.67,56.59],[-6.57,56.66],[-6.51,56.67],[-6.48,56.67],[-6.53,56.63],[-6.61,56.59]],[[-7.42,56.97],[-7.5,56.95],[-7.54,56.96],[-7.54,56.97],[-7.52,57.01],[-7.46,57.02],[-7.41,57.0],[-7.4,56.98],[-7.42,56.97]],[[-6.28,56.96],[-6.31,56.95],[-6.35,56.95],[-6.38,56.97],[-6.43,57.02],[-6.32,57.05],[-6.28,57.03],[-6.26,57.01],[-6.26,56.99],[-6.28,56.96]],[[-7.25,57.12],[-7.29,57.11],[-7.35,57.12],[-7.38,57.13],[-7.42,57.19],[-7.42,57.23],[-7.41,57.3],[-7.41,57.38],[-7.3,57.38],[-7.27,57.37],[-7.25,57.13],[-7.25,57.12]],[[-6.14,57.5],[-6.15,57.46],[-6.16,57.41],[-6.14,57.35],[-6.14,57.31],[-6.09,57.3],[-6.07,57.28],[-5.88,57.26],[-5.71,57.27],[-5.67,57.25],[-5.67,57.23],[-5.7,57.2],[-5.8,57.15],[-5.91,57.06],[-5.95,57.05],[-5.99,57.04],[-6.01,57.05],[-6.03,57.2],[-6.16,57.18],[-6.27,57.18],[-6.32,57.2],[-6.36,57.24],[-6.44,57.33],[-6.68,57.36],[-6.74,57.41],[-6.76,57.44],[-6.75,57.46],[-6.7,57.5],[-6.64,57.48],[-6.61,57.49],[-6.58,57.51],[-6.58,57.52],[-6.62,57.55],[-6.62,57.56],[-6.38,57.6],[-6.36,57.67],[-6.31,57.67],[-6.25,57.65],[-6.17,57.59],[-6.14,57.5]],[[-7.21,57.68],[-7.09,57.63],[-7.18,57.53],[-7.32,57.53],[-7.51,57.6],[-7.52,57.62],[-7.5,57.64],[-7.47,57.65],[-7.44,57.66],[-7.39,57.65],[-7.32,57.66],[-7.27,57.66],[-7.21,57.68]],[[-6.2,58.36],[-6.33,58.19],[-6.38,58.18],[-6.42,58.14],[-6.55,58.09],[-6.44,58.09],[-6.4,58.08],[-6.4,58.04],[-6.43,58.02],[-6.58,57.94],[-6.68,57.91],[-6.8,57.83],[-6.85,57.83],[-6.91,57.77],[-6.96,57.75],[-6.98,57.75],[-7.01,57.76],[-7.08,57.81],[-6.96,57.86],[-6.94,57.89],[-6.86,57.92],[-6.86,57.93],[-7.0,57.97],[-7.06,58.0],[-7.05,58.02],[-6.99,58.05],[-7.02,58.05],[-7.04,58.07],[-7.08,58.08],[-7.09,58.1],[-7.1,58.14],[-7.09,58.18],[-7.04,58.2],[-7.03,58.22],[-7.01,58.23],[-6.95,58.22],[-6.89,58.18],[-6.81,58.2],[-6.73,58.19],[-6.72,58.2],[-6.79,58.28],[-6.78,58.3],[-6.74,58.32],[-6.54,58.38],[-6.3,58.49],[-6.24,58.5],[-6.22,58.49],[-6.19,58.44],[-6.2,58.36]],[[-3.11,58.52],[-3.1,58.43],[-3.11,58.41],[-3.14,58.38],[-3.21,58.32],[-3.41,58.24],[-3.78,58.05],[-3.99,57.96],[-4.02,57.91],[-4.04,57.85],[-3.91,57.84],[-3.86,57.82],[-3.89,57.79],[-4.08,57.68],[-4.13,57.58],[-3.99,57.58],[-3.87,57.6],[-3.63,57.66],[-3.4,57.71],[-3.29,57.71],[-3.08,57.67],[-3.04,57.67],[-2.95,57.69],[-2.86,57.69],[-2.24,57.68],[-2.07,57.7],[-1.96,57.68],[-1.87,57.61],[-1.78,57.49],[-1.78,57.47],[-1.83,57.42],[-1.93,57.35],[-2.02,57.26],[-2.05,57.21],[-2.06,57.15],[-2.09,57.1],[-2.26,56.86],[-2.43,56.73],[-2.5,56.64],[-2.59,56.56],[-2.68,56.51],[-2.78,56.48],[-3.05,56.45],[-3.12,56.43],[-3.21,56.38],[-3.31,56.36],[-3.2,56.37],[-3.09,56.39],[-2.89,56.4],[-2.65,56.32],[-2.67,56.25],[-2.77,56.2],[-2.98,56.19],[-3.18,56.08],[-3.27,56.05],[-3.36,56.03],[-3.48,56.03],[-3.7,56.06],[-3.79,56.1],[-3.7,56.04],[-3.61,56.02],[-3.05,55.95],[-3.02,55.96],[-2.84,56.03],[-2.6,56.03],[-2.15,55.9],[-2.02,55.81],[-1.83,55.67],[-1.73,55.62],[-1.66,55.57],[-1.61,55.5],[-1.52,55.26],[-1.42,55.03],[-1.29,54.77],[-1.23,54.7],[-1.15,54.65],[-0.76,54.54],[-0.67,54.5],[-0.52,54.4],[-0.37,54.28],[-0.23,54.19],[-0.08,54.12],[-0.16,54.08],[-0.21,54.02],[-0.17,53.94],[-0.11,53.87],[0.01,53.74],[0.12,53.61],[0.08,53.63],[0.04,53.64],[-0.02,53.64],[-0.07,53.64],[-0.17,53.69],[-0.27,53.74],[-0.46,53.72],[-0.57,53.73],[-0.66,53.72],[-0.49,53.69],[-0.29,53.69],[0.13,53.47],[0.27,53.34],[0.36,53.16],[0.3,53.08],[0.21,53.03],[0.12,52.97],[0.05,52.91],[0.28,52.81],[0.33,52.81],[0.38,52.83],[0.43,52.86],[0.52,52.94],[0.56,52.97],[0.7,52.98],[0.83,52.97],[0.95,52.95],[1.06,52.96],[1.27,52.92],[1.38,52.89],[1.66,52.75],[1.72,52.68],[1.74,52.58],[1.75,52.47],[1.7,52.37],[1.65,52.28],[1.61,52.16],[1.59,52.12],[1.56,52.09],[1.41,51.99],[1.32,51.96],[1.28,51.97],[1.23,51.97],[1.23,51.95],[1.27,51.9],[1.27,51.85],[1.19,51.8],[1.1,51.79],[0.96,51.81],[0.75,51.73],[0.9,51.69],[0.93,51.65],[0.89,51.57],[0.8,51.54],[0.7,51.52],[0.59,51.52],[0.51,51.5],[0.42,51.47],[0.53,51.48],[0.6,51.47],[0.65,51.4],[0.69,51.39],[0.89,51.36],[1.01,51.36],[1.26,51.38],[1.37,51.37],[1.41,51.36],[1.42,51.31],[1.4,51.18],[1.37,51.16],[1.04,51.05],[0.98,50.97],[0.96,50.93],[0.77,50.93],[0.68,50.89],[0.53,50.85],[0.41,50.82],[0.3,50.78],[0.21,50.76],[-0.2,50.81],[-0.45,50.81],[-0.79,50.77],[-0.87,50.77],[-1.0,50.82],[-1.13,50.84],[-1.29,50.86],[-1.42,50.9],[-1.33,50.82],[-1.52,50.75],[-1.6,50.73],[-1.69,50.74],[-1.87,50.72],[-2.03,50.73],[-2.01,50.67],[-1.96,50.63],[-2.0,50.61],[-2.04,50.6],[-2.35,50.64],[-2.39,50.63],[-2.43,50.6],[-2.55,50.62],[-2.66,50.67],[-2.78,50.71],[-2.9,50.72],[-3.0,50.72],[-3.4,50.63],[-3.49,50.55],[-3.53,50.43],[-3.58,50.32],[-3.68,50.24],[-3.79,50.23],[-3.9,50.29],[-4.1,50.35],[-4.17,50.39],[-4.19,50.39],[-4.22,50.38],[-4.3,50.36],[-4.38,50.36],[-4.51,50.34],[-4.73,50.29],[-4.82,50.26],[-5.01,50.16],[-5.05,50.13],[-5.12,50.04],[-5.23,50.02],[-5.32,50.08],[-5.43,50.1],[-5.55,50.08],[-5.62,50.05],[-5.66,50.08],[-5.66,50.13],[-5.57,50.2],[-5.34,50.25],[-5.14,50.37],[-5.04,50.45],[-5.0,50.5],[-4.96,50.52],[-4.89,50.53],[-4.86,50.58],[-4.58,50.78],[-4.56,50.82],[-4.55,50.9],[-4.52,50.98],[-4.3,51.03],[-4.19,51.19],[-4.16,51.2],[-3.84,51.23],[-3.61,51.23],[-3.38,51.2],[-3.26,51.19],[-3.14,51.21],[-3.04,51.25],[-2.88,51.41],[-2.79,51.47],[-2.69,51.54],[-2.59,51.61],[-2.43,51.74],[-2.54,51.7],[-2.67,51.62],[-2.74,51.58],[-2.98,51.54],[-3.08,51.5],[-3.26,51.4],[-3.29,51.39],[-3.56,51.41],[-3.76,51.54],[-3.89,51.59],[-3.94,51.6],[-4.0,51.58],[-4.12,51.57],[-4.23,51.57],[-4.17,51.63],[-4.09,51.66],[-4.28,51.68],[-4.33,51.7],[-4.39,51.74],[-4.53,51.75],[-4.6,51.74],[-4.72,51.68],[-4.9,51.63],[-5.12,51.71],[-5.17,51.74],[-5.17,51.81],[-5.2,51.86],[-5.26,51.88],[-5.18,51.95],[-5.09,52.0],[-4.88,52.04],[-4.56,52.15],[-4.38,52.2],[-4.22,52.28],[-4.15,52.33],[-4.1,52.39],[-4.05,52.48],[-3.98,52.54],[-4.05,52.56],[-4.08,52.61],[-4.07,52.66],[-4.04,52.7],[-4.07,52.76],[-4.12,52.82],[-4.11,52.87],[-4.1,52.92],[-4.23,52.91],[-4.36,52.9],[-4.47,52.86],[-4.58,52.81],[-4.68,52.81],[-4.68,52.84],[-4.64,52.89],[-4.53,52.96],[-4.41,53.01],[-4.36,53.06],[-4.33,53.11],[-4.27,53.14],[-4.11,53.22],[-3.81,53.3],[-3.76,53.31],[-3.65,53.3],[-3.53,53.31],[-3.43,53.34],[-3.33,53.35],[-3.1,53.26],[-3.17,53.39],[-3.06,53.43],[-2.92,53.31],[-2.86,53.29],[-2.75,53.31],[-2.79,53.33],[-2.85,53.33],[-2.91,53.35],[-2.97,53.39],[-3.06,53.51],[-3.06,53.59],[-3.0,53.66],[-2.93,53.73],[-2.98,53.75],[-3.03,53.77],[-3.05,53.84],[-3.03,53.91],[-2.9,53.96],[-2.86,54.04],[-2.85,54.14],[-2.87,54.18],[-2.99,54.17],[-3.05,54.15],[-3.11,54.13],[-3.17,54.13],[-3.32,54.23],[-3.41,54.31],[-3.57,54.47],[-3.59,54.56],[-3.46,54.77],[-3.27,54.91],[-3.04,54.95],[-3.08,54.96],[-3.43,54.96],[-3.55,54.95],[-3.66,54.89],[-3.72,54.88],[-3.78,54.87],[-3.84,54.84],[-3.9,54.81],[-3.96,54.78],[-4.08,54.79],[-4.13,54.78],[-4.17,54.8],[-4.21,54.84],[-4.25,54.85],[-4.3,54.84],[-4.41,54.79],[-4.52,54.76],[-4.65,54.79],[-4.82,54.85],[-4.85,54.83],[-4.89,54.77],[-4.91,54.69],[-5.03,54.76],[-5.14,54.86],[-5.17,54.92],[-5.17,54.99],[-5.12,55.01],[-5.06,54.99],[-4.97,55.15],[-4.78,55.36],[-4.72,55.42],[-4.68,55.5],[-4.68,55.55],[-4.72,55.6],[-4.89,55.7],[-4.89,55.78],[-4.87,55.87],[-4.83,55.93],[-4.81,55.94],[-4.58,55.94],[-4.67,55.97],[-4.84,56.05],[-4.84,56.08],[-4.8,56.16],[-4.82,56.15],[-4.86,56.11],[-4.93,56.03],[-4.97,56.01],[-5.09,55.99],[-5.11,55.94],[-5.13,55.93],[-5.2,55.93],[-5.21,55.89],[-5.23,55.89],[-5.25,55.93],[-5.25,56.0],[-5.22,56.07],[-5.18,56.12],[-5.0,56.23],[-5.08,56.2],[-5.28,56.09],[-5.38,56.02],[-5.41,56.0],[-5.42,55.98],[-5.42,55.95],[-5.37,55.83],[-5.39,55.77],[-5.56,55.39],[-5.59,55.35],[-5.62,55.33],[-5.65,55.33],[-5.73,55.33],[-5.77,55.36],[-5.77,55.39],[-5.75,55.44],[-5.68,55.62],[-5.65,55.67],[-5.61,55.72],[-5.5,55.8],[-5.51,55.81],[-5.57,55.79],[-5.6,55.8],[-5.62,55.81],[-5.61,56.06],[-5.56,56.13],[-5.53,56.25],[-5.49,56.35],[-5.43,56.42],[-5.39,56.51],[-5.33,56.56],[-5.31,56.62],[-5.24,56.69],[-5.19,56.76],[-5.22,56.75],[-5.56,56.57],[-5.65,56.53],[-5.77,56.54],[-5.86,56.56],[-5.94,56.61],[-5.97,56.69],[-6.06,56.69],[-6.13,56.71],[-6.13,56.72],[-6.03,56.76],[-5.88,56.78],[-5.73,56.85],[-5.86,56.9],[-5.85,56.92],[-5.74,56.96],[-5.59,57.1],[-5.56,57.23],[-5.63,57.29],[-5.66,57.33],[-5.79,57.38],[-5.82,57.44],[-5.8,57.47],[-5.76,57.5],[-5.69,57.52],[-5.58,57.55],[-5.68,57.57],[-5.71,57.6],[-5.74,57.64],[-5.74,57.67],[-5.69,57.78],[-5.67,57.82],[-5.61,57.88],[-5.35,57.88],[-5.32,57.9],[-5.29,57.9],[-5.16,57.88],[-5.18,57.91],[-5.39,58.04],[-5.41,58.07],[-5.35,58.14],[-5.35,58.18],[-5.36,58.21],[-5.34,58.24],[-5.27,58.25],[-5.06,58.25],[-5.01,58.26],[-5.03,58.3],[-5.08,58.35],[-5.09,58.38],[-5.08,58.42],[-5.08,58.49],[-5.07,58.52],[-5.02,58.57],[-4.98,58.58],[-4.92,58.59],[-4.81,58.57],[-4.77,58.55],[-4.72,58.51],[-4.68,58.51],[-4.53,58.56],[-4.49,58.57],[-4.43,58.51],[-4.19,58.56],[-3.86,58.58],[-3.66,58.61],[-3.45,58.62],[-3.26,58.65],[-3.05,58.63],[-3.05,58.62],[-3.06,58.59],[-3.11,58.52]],[[-2.93,58.74],[-2.94,58.74],[-2.98,58.76],[-3.04,58.82],[-2.94,58.84],[-2.9,58.83],[-2.91,58.8],[-2.93,58.74]],[[-3.16,58.79],[-3.22,58.78],[-3.28,58.78],[-3.37,58.84],[-3.4,58.88],[-3.39,58.91],[-3.36,58.92],[-3.27,58.91],[-3.23,58.86],[-3.22,58.83],[-3.21,58.81],[-3.16,58.8],[-3.16,58.79]],[[-3.06,59.03],[-3.07,59.0],[-2.99,59.01],[-2.88,58.98],[-2.82,58.98],[-2.76,58.96],[-2.79,58.91],[-2.83,58.89],[-2.86,58.89],[-2.99,58.94],[-3.17,58.92],[-3.2,58.93],[-3.22,58.94],[-3.23,58.96],[-3.23,58.99],[-3.24,59.0],[-3.3,58.97],[-3.33,58.97],[-3.35,58.99],[-3.35,59.02],[-3.35,59.06],[-3.31,59.13],[-3.25,59.14],[-3.16,59.14],[-3.05,59.1],[-3.02,59.08],[-3.02,59.06],[-3.06,59.03]],[[-2.55,59.23],[-2.66,59.23],[-2.6,59.29],[-2.54,59.3],[-2.41,59.3],[-2.43,59.27],[-2.55,59.23]],[[-2.73,59.19],[-2.82,59.16],[-2.85,59.18],[-2.86,59.25],[-2.96,59.27],[-3.01,59.29],[-3.05,59.32],[-3.04,59.33],[-2.98,59.35],[-2.86,59.29],[-2.82,59.24],[-2.73,59.23],[-2.72,59.22],[-2.73,59.19]],[[-1.31,60.54],[-1.29,60.47],[-1.24,60.49],[-1.16,60.42],[-1.12,60.42],[-1.05,60.44],[-1.07,60.38],[-1.13,60.21],[-1.15,60.18],[-1.17,60.12],[-1.18,60.11],[-1.2,60.01],[-1.25,59.97],[-1.28,59.89],[-1.3,59.88],[-1.36,59.91],[-1.3,60.04],[-1.28,60.11],[-1.29,60.15],[-1.32,60.19],[-1.41,60.19],[-1.48,60.17],[-1.5,60.19],[-1.5,60.22],[-1.52,60.23],[-1.61,60.23],[-1.64,60.24],[-1.66,60.26],[-1.66,60.28],[-1.58,60.3],[-1.49,60.29],[-1.37,60.33],[-1.45,60.47],[-1.55,60.48],[-1.57,60.49],[-1.55,60.52],[-1.5,60.53],[-1.41,60.6],[-1.36,60.61],[-1.3,60.61],[-1.31,60.54]],[[-1.04,60.51],[-1.07,60.5],[-1.17,60.6],[-1.09,60.72],[-1.01,60.72],[-0.99,60.69],[-1.0,60.66],[-1.05,60.66],[-1.05,60.65],[-1.04,60.59],[-1.03,60.53],[-1.04,60.51]],[[-0.77,60.81],[-0.77,60.8],[-0.83,60.72],[-0.83,60.68],[-0.91,60.69],[-0.92,60.7],[-0.94,60.75],[-0.93,60.8],[-0.92,60.81],[-0.89,60.82],[-0.86,60.81],[-0.82,60.83],[-0.8,60.83],[-0.77,60.81]]]},{"n":"Georgia","r":[[[45.0,41.29],[44.98,41.28],[44.81,41.26],[44.81,41.25],[44.85,41.22],[44.84,41.21],[44.56,41.21],[44.47,41.19],[44.23,41.21],[44.15,41.2],[44.08,41.18],[43.91,41.16],[43.79,41.13],[43.65,41.12],[43.49,41.12],[43.44,41.11],[43.44,41.13],[43.43,41.16],[43.4,41.18],[43.36,41.19],[43.28,41.19],[43.21,41.2],[43.15,41.24],[43.14,41.26],[43.17,41.29],[43.15,41.31],[43.06,41.35],[42.91,41.47],[42.82,41.49],[42.79,41.56],[42.75,41.58],[42.68,41.59],[42.61,41.58],[42.59,41.57],[42.57,41.56],[42.51,41.47],[42.47,41.44],[42.36,41.45],[42.28,41.48],[42.21,41.49],[42.08,41.49],[41.93,41.5],[41.82,41.43],[41.78,41.44],[41.7,41.47],[41.58,41.5],[41.51,41.52],[41.7,41.71],[41.76,41.82],[41.76,41.88],[41.76,41.97],[41.66,42.15],[41.58,42.4],[41.49,42.66],[41.42,42.74],[41.13,42.83],[41.06,42.93],[40.84,43.06],[40.52,43.12],[40.46,43.15],[40.19,43.31],[39.98,43.42],[40.02,43.48],[40.08,43.55],[40.15,43.57],[40.34,43.54],[40.52,43.51],[40.65,43.53],[40.8,43.48],[40.94,43.42],[41.08,43.37],[41.36,43.33],[41.46,43.28],[41.58,43.22],[42.05,43.19],[42.09,43.2],[42.12,43.21],[42.28,43.23],[42.42,43.22],[42.57,43.16],[42.66,43.16],[42.76,43.17],[42.89,43.13],[42.99,43.09],[43.0,43.05],[43.09,42.99],[43.35,42.9],[43.56,42.84],[43.62,42.81],[43.78,42.75],[43.8,42.73],[43.8,42.7],[43.75,42.66],[43.74,42.62],[43.76,42.59],[43.83,42.57],[43.96,42.57],[44.0,42.6],[44.1,42.62],[44.2,42.65],[44.33,42.7],[44.51,42.75],[44.58,42.75],[44.64,42.73],[44.69,42.71],[44.77,42.62],[44.85,42.75],[44.87,42.76],[44.94,42.73],[45.07,42.69],[45.16,42.68],[45.21,42.65],[45.34,42.53],[45.56,42.54],[45.66,42.52],[45.71,42.5],[45.73,42.48],[45.69,42.36],[45.63,42.23],[45.64,42.21],[45.73,42.16],[45.85,42.11],[45.91,42.07],[45.95,42.04],[46.05,42.01],[46.16,41.99],[46.21,41.99],[46.27,41.96],[46.41,41.9],[46.43,41.89],[46.41,41.86],[46.35,41.79],[46.3,41.76],[46.25,41.75],[46.2,41.74],[46.18,41.7],[46.18,41.66],[46.19,41.62],[46.2,41.61],[46.25,41.6],[46.31,41.51],[46.38,41.46],[46.51,41.41],[46.62,41.34],[46.67,41.29],[46.66,41.25],[46.63,41.16],[46.53,41.09],[46.46,41.07],[46.43,41.08],[46.38,41.1],[46.28,41.15],[46.17,41.2],[46.09,41.18],[46.03,41.17],[45.92,41.19],[45.79,41.22],[45.73,41.26],[45.7,41.29],[45.72,41.34],[45.42,41.43],[45.28,41.45],[45.22,41.42],[45.0,41.29]]]},{"n":"Guernsey","r":[[[-2.51,49.49],[-2.55,49.43],[-2.64,49.45],[-2.65,49.47],[-2.54,49.51],[-2.52,49.51],[-2.51,49.49]]]},{"n":"Ghana","r":[[[-2.7,9.48],[-2.71,9.53],[-2.77,9.66],[-2.78,9.75],[-2.75,9.8],[-2.75,9.91],[-2.78,10.08],[-2.79,10.19],[-2.77,10.24],[-2.78,10.28],[-2.82,10.32],[-2.82,10.36],[-2.79,10.4],[-2.79,10.43],[-2.84,10.45],[-2.88,10.51],[-2.91,10.59],[-2.91,10.73],[-2.84,10.98],[-2.83,11.0],[-2.75,11.0],[-2.75,10.99],[-2.51,10.99],[-2.23,10.99],[-1.9,10.99],[-1.6,11.0],[-1.59,11.01],[-1.54,11.02],[-1.23,11.0],[-1.04,11.01],[-0.96,11.0],[-0.9,10.98],[-0.77,11.0],[-0.7,10.99],[-0.65,10.93],[-0.63,10.93],[-0.6,10.95],[-0.55,10.98],[-0.49,11.01],[-0.45,11.06],[-0.43,11.09],[-0.4,11.09],[-0.35,11.09],[-0.31,11.12],[-0.3,11.17],[-0.07,11.12],[-0.0,11.06],[0.01,11.02],[-0.01,10.89],[-0.06,10.8],[-0.09,10.72],[-0.09,10.67],[-0.06,10.63],[0.04,10.56],[0.09,10.52],[0.15,10.45],[0.22,10.39],[0.33,10.31],[0.38,10.29],[0.38,10.27],[0.36,10.24],[0.35,9.92],[0.34,9.84],[0.33,9.8],[0.32,9.69],[0.31,9.67],[0.29,9.67],[0.27,9.67],[0.26,9.64],[0.27,9.62],[0.34,9.6],[0.33,9.59],[0.28,9.57],[0.25,9.54],[0.26,9.5],[0.23,9.46],[0.24,9.44],[0.26,9.43],[0.29,9.43],[0.37,9.49],[0.41,9.49],[0.45,9.48],[0.53,9.4],[0.53,9.36],[0.5,9.22],[0.47,9.12],[0.46,8.97],[0.49,8.89],[0.49,8.85],[0.45,8.81],[0.37,8.76],[0.38,8.72],[0.42,8.65],[0.48,8.58],[0.62,8.48],[0.69,8.35],[0.69,8.3],[0.65,8.25],[0.6,8.21],[0.58,8.15],[0.61,7.73],[0.5,7.55],[0.5,7.5],[0.51,7.44],[0.54,7.4],[0.59,7.39],[0.63,7.35],[0.62,7.23],[0.6,7.1],[0.59,7.03],[0.58,7.0],[0.54,6.98],[0.52,6.94],[0.53,6.89],[0.53,6.85],[0.55,6.8],[0.6,6.74],[0.67,6.59],[0.7,6.58],[0.72,6.55],[0.71,6.52],[0.74,6.45],[0.82,6.39],[0.91,6.33],[0.98,6.32],[1.0,6.27],[1.05,6.2],[1.08,6.17],[1.14,6.16],[1.19,6.15],[1.19,6.09],[1.11,6.05],[1.05,5.99],[1.01,5.91],[0.95,5.81],[0.75,5.76],[0.67,5.76],[0.26,5.76],[-0.13,5.57],[-0.35,5.5],[-0.49,5.39],[-0.67,5.32],[-0.8,5.23],[-1.06,5.18],[-1.5,5.04],[-1.64,4.98],[-1.78,4.88],[-2.0,4.76],[-2.09,4.76],[-2.27,4.87],[-2.4,4.93],[-2.72,5.01],[-2.96,5.05],[-3.08,5.08],[-3.11,5.09],[-3.09,5.13],[-3.02,5.13],[-2.95,5.12],[-2.89,5.15],[-2.82,5.15],[-2.8,5.18],[-2.79,5.26],[-2.79,5.33],[-2.76,5.36],[-2.75,5.43],[-2.79,5.6],[-2.82,5.62],[-2.96,5.64],[-2.97,5.68],[-3.0,5.71],[-3.03,5.8],[-3.06,5.93],[-3.11,6.09],[-3.2,6.35],[-3.22,6.44],[-3.24,6.54],[-3.24,6.65],[-3.22,6.69],[-3.23,6.75],[-3.24,6.81],[-3.17,6.94],[-3.04,7.1],[-3.01,7.16],[-2.99,7.2],[-2.98,7.26],[-2.96,7.45],[-2.9,7.69],[-2.86,7.77],[-2.83,7.82],[-2.8,7.9],[-2.79,7.93],[-2.67,8.02],[-2.61,8.05],[-2.6,8.08],[-2.62,8.12],[-2.61,8.15],[-2.58,8.16],[-2.54,8.17],[-2.51,8.21],[-2.56,8.49],[-2.6,8.78],[-2.6,8.8],[-2.62,8.84],[-2.65,8.96],[-2.69,9.03],[-2.75,9.05],[-2.75,9.11],[-2.69,9.22],[-2.67,9.28],[-2.7,9.3],[-2.71,9.35],[-2.69,9.43],[-2.7,9.48]]]},{"n":"Guinea","r":[[[-7.99,10.16],[-8.01,10.13],[-8.08,10.07],[-8.14,10.02],[-8.16,9.97],[-8.15,9.88],[-8.15,9.67],[-8.14,9.5],[-8.09,9.43],[-8.03,9.4],[-7.96,9.4],[-7.9,9.42],[-7.9,9.31],[-7.92,9.19],[-7.84,9.15],[-7.8,9.12],[-7.78,9.08],[-7.9,9.02],[-7.94,8.98],[-7.95,8.88],[-7.95,8.79],[-7.78,8.72],[-7.72,8.64],[-7.69,8.56],[-7.68,8.41],[-7.7,8.38],[-7.74,8.38],[-7.79,8.42],[-7.82,8.47],[-7.87,8.47],[-7.95,8.48],[-8.05,8.5],[-8.17,8.49],[-8.21,8.48],[-8.24,8.46],[-8.24,8.41],[-8.26,8.25],[-8.22,8.22],[-8.14,8.18],[-8.09,8.17],[-8.05,8.17],[-8.02,8.14],[-8.01,8.08],[-8.03,8.03],[-8.07,7.98],[-8.13,7.87],[-8.12,7.82],[-8.12,7.76],[-8.21,7.59],[-8.23,7.56],[-8.35,7.59],[-8.43,7.6],[-8.49,7.56],[-8.52,7.59],[-8.56,7.63],[-8.58,7.68],[-8.61,7.69],[-8.66,7.69],[-8.71,7.66],[-8.73,7.61],[-8.73,7.54],[-8.74,7.5],[-8.77,7.47],[-8.83,7.39],[-8.86,7.32],[-8.89,7.26],[-8.94,7.27],[-8.96,7.27],[-8.98,7.26],[-9.05,7.23],[-9.12,7.22],[-9.13,7.25],[-9.17,7.28],[-9.22,7.33],[-9.26,7.38],[-9.36,7.41],[-9.39,7.39],[-9.44,7.4],[-9.46,7.42],[-9.46,7.44],[-9.41,7.51],[-9.38,7.57],[-9.37,7.64],[-9.37,7.7],[-9.39,7.79],[-9.44,7.87],[-9.45,7.91],[-9.44,7.97],[-9.45,8.02],[-9.46,8.05],[-9.47,8.11],[-9.48,8.16],[-9.51,8.18],[-9.52,8.26],[-9.52,8.35],[-9.55,8.38],[-9.61,8.4],[-9.64,8.44],[-9.66,8.47],[-9.68,8.48],[-9.7,8.48],[-9.72,8.46],[-9.74,8.45],[-9.77,8.53],[-9.78,8.54],[-9.8,8.52],[-10.06,8.43],[-10.08,8.46],[-10.1,8.51],[-10.15,8.52],[-10.23,8.49],[-10.28,8.49],[-10.36,8.5],[-10.39,8.48],[-10.5,8.36],[-10.56,8.32],[-10.6,8.32],[-10.65,8.33],[-10.69,8.32],[-10.71,8.34],[-10.7,8.36],[-10.68,8.4],[-10.63,8.53],[-10.5,8.66],[-10.5,8.69],[-10.55,8.76],[-10.61,8.87],[-10.61,8.98],[-10.62,9.06],[-10.73,9.08],[-10.75,9.1],[-10.75,9.12],[-10.72,9.19],[-10.69,9.26],[-10.68,9.29],[-10.69,9.31],[-10.76,9.39],[-10.86,9.52],[-10.96,9.66],[-11.05,9.79],[-11.12,9.84],[-11.18,9.93],[-11.21,9.98],[-11.27,10.0],[-11.47,10.0],[-11.71,9.99],[-11.91,9.99],[-11.92,9.92],[-12.14,9.88],[-12.28,9.93],[-12.43,9.9],[-12.5,9.86],[-12.52,9.79],[-12.56,9.7],[-12.59,9.67],[-12.6,9.63],[-12.62,9.6],[-12.65,9.56],[-12.68,9.48],[-12.76,9.37],[-12.83,9.3],[-12.96,9.26],[-13.0,9.15],[-13.03,9.1],[-13.08,9.07],[-13.13,9.05],[-13.18,9.06],[-13.23,9.07],[-13.29,9.05],[-13.3,9.08],[-13.27,9.17],[-13.3,9.22],[-13.4,9.31],[-13.41,9.36],[-13.44,9.42],[-13.57,9.54],[-13.69,9.54],[-13.66,9.64],[-13.66,9.78],[-13.7,9.85],[-13.69,9.93],[-13.71,9.92],[-13.75,9.87],[-13.82,9.89],[-13.95,9.97],[-14.02,10.05],[-14.03,10.12],[-14.05,10.14],[-14.09,10.13],[-14.17,10.13],[-14.43,10.25],[-14.61,10.55],[-14.61,10.62],[-14.59,10.73],[-14.59,10.77],[-14.68,10.69],[-14.69,10.74],[-14.76,10.86],[-14.78,10.93],[-14.84,10.96],[-14.89,10.97],[-14.92,10.94],[-14.98,10.8],[-15.01,10.8],[-15.05,10.83],[-15.04,10.94],[-15.0,10.99],[-14.94,11.07],[-14.78,11.41],[-14.72,11.48],[-14.68,11.51],[-14.6,11.51],[-14.45,11.56],[-14.33,11.63],[-14.27,11.66],[-14.12,11.65],[-13.95,11.66],[-13.73,11.74],[-13.73,11.83],[-13.73,11.96],[-13.74,12.01],[-13.82,12.05],[-13.86,12.09],[-13.9,12.14],[-13.95,12.18],[-13.95,12.22],[-13.89,12.25],[-13.85,12.26],[-13.76,12.26],[-13.73,12.28],[-13.71,12.31],[-13.68,12.39],[-13.67,12.48],[-13.73,12.59],[-13.73,12.67],[-13.41,12.66],[-13.37,12.65],[-13.23,12.64],[-13.14,12.64],[-13.08,12.63],[-13.06,12.62],[-13.06,12.58],[-13.08,12.54],[-13.06,12.49],[-13.01,12.48],[-12.99,12.49],[-12.96,12.51],[-12.93,12.53],[-12.89,12.52],[-12.8,12.45],[-12.71,12.43],[-12.62,12.4],[-12.53,12.38],[-12.46,12.38],[-12.4,12.34],[-12.29,12.33],[-12.15,12.38],[-12.04,12.4],[-11.89,12.4],[-11.81,12.39],[-11.57,12.43],[-11.46,12.42],[-11.39,12.4],[-11.42,12.38],[-11.45,12.32],[-11.47,12.25],[-11.5,12.2],[-11.49,12.17],[-11.41,12.1],[-11.31,12.02],[-11.26,12.0],[-11.21,12.02],[-11.13,12.1],[-11.07,12.17],[-11.0,12.21],[-10.93,12.21],[-10.88,12.15],[-10.81,12.03],[-10.74,11.93],[-10.73,11.92],[-10.71,11.9],[-10.68,11.9],[-10.64,11.93],[-10.62,11.94],[-10.59,11.99],[-10.47,12.14],[-10.37,12.18],[-10.34,12.19],[-10.27,12.21],[-10.17,12.18],[-10.01,12.12],[-9.82,12.04],[-9.75,12.03],[-9.71,12.04],[-9.66,12.14],[-9.59,12.18],[-9.49,12.23],[-9.4,12.25],[-9.36,12.26],[-9.34,12.28],[-9.33,12.32],[-9.34,12.37],[-9.39,12.44],[-9.4,12.46],[-9.37,12.48],[-9.3,12.49],[-9.22,12.48],[-9.12,12.45],[-9.04,12.4],[-9.0,12.35],[-8.95,12.23],[-8.91,12.11],[-8.82,11.92],[-8.82,11.81],[-8.82,11.67],[-8.78,11.65],[-8.73,11.64],[-8.71,11.62],[-8.66,11.51],[-8.62,11.49],[-8.57,11.48],[-8.47,11.41],[-8.41,11.39],[-8.4,11.37],[-8.4,11.34],[-8.43,11.3],[-8.46,11.28],[-8.52,11.24],[-8.57,11.18],[-8.66,11.04],[-8.67,11.01],[-8.65,10.99],[-8.61,10.99],[-8.56,11.0],[-8.47,11.05],[-8.4,11.03],[-8.34,10.99],[-8.31,10.95],[-8.31,10.9],[-8.32,10.83],[-8.32,10.75],[-8.3,10.62],[-8.27,10.49],[-8.23,10.44],[-8.01,10.32],[-7.99,10.28],[-7.97,10.23],[-7.99,10.16]]]},{"n":"Gambia","r":[[[-16.76,13.06],[-16.77,13.15],[-16.82,13.34],[-16.75,13.43],[-16.67,13.48],[-16.61,13.44],[-16.6,13.36],[-16.56,13.3],[-16.41,13.27],[-16.27,13.29],[-16.19,13.28],[-16.19,13.33],[-16.16,13.38],[-15.99,13.41],[-15.8,13.43],[-15.62,13.46],[-15.47,13.46],[-15.43,13.47],[-15.44,13.48],[-15.57,13.5],[-15.85,13.46],[-16.14,13.45],[-16.35,13.34],[-16.44,13.35],[-16.53,13.46],[-16.56,13.59],[-16.31,13.6],[-16.0,13.59],[-15.67,13.59],[-15.51,13.59],[-15.43,13.73],[-15.27,13.79],[-15.11,13.81],[-15.02,13.81],[-14.94,13.79],[-14.77,13.67],[-14.66,13.64],[-14.57,13.62],[-14.51,13.56],[-14.41,13.5],[-14.33,13.49],[-14.28,13.5],[-14.2,13.52],[-14.15,13.54],[-13.98,13.54],[-13.85,13.48],[-13.83,13.41],[-13.85,13.34],[-14.01,13.3],[-14.25,13.24],[-14.44,13.27],[-14.67,13.35],[-14.81,13.41],[-14.87,13.43],[-14.95,13.47],[-15.02,13.51],[-15.1,13.54],[-15.15,13.56],[-15.19,13.54],[-15.21,13.49],[-15.24,13.43],[-15.29,13.4],[-15.48,13.38],[-15.66,13.36],[-15.75,13.34],[-15.81,13.33],[-15.83,13.16],[-16.03,13.16],[-16.23,13.16],[-16.43,13.16],[-16.65,13.15],[-16.7,13.12],[-16.76,13.06]]]},{"n":"Guinea-Bissau","r":[[[-13.73,12.67],[-13.73,12.59],[-13.67,12.48],[-13.68,12.39],[-13.71,12.31],[-13.73,12.28],[-13.76,12.26],[-13.85,12.26],[-13.89,12.25],[-13.95,12.22],[-13.95,12.18],[-13.9,12.14],[-13.86,12.09],[-13.82,12.05],[-13.74,12.01],[-13.73,11.96],[-13.73,11.83],[-13.73,11.74],[-13.95,11.66],[-14.12,11.65],[-14.27,11.66],[-14.33,11.63],[-14.45,11.56],[-14.6,11.51],[-14.68,11.51],[-14.72,11.48],[-14.78,11.41],[-14.94,11.07],[-15.0,10.99],[-15.04,10.94],[-15.09,11.01],[-15.05,11.14],[-15.1,11.14],[-15.18,11.03],[-15.22,11.03],[-15.22,11.16],[-15.26,11.16],[-15.32,11.15],[-15.39,11.22],[-15.4,11.27],[-15.39,11.33],[-15.35,11.38],[-15.35,11.4],[-15.4,11.4],[-15.45,11.39],[-15.48,11.41],[-15.43,11.5],[-15.25,11.57],[-15.16,11.58],[-15.07,11.6],[-15.12,11.66],[-15.23,11.69],[-15.32,11.67],[-15.36,11.62],[-15.41,11.62],[-15.5,11.72],[-15.5,11.78],[-15.47,11.84],[-15.42,11.87],[-15.21,11.87],[-15.13,11.91],[-15.1,11.91],[-15.07,11.95],[-15.08,11.97],[-15.11,11.97],[-15.19,11.93],[-15.43,11.94],[-15.51,11.92],[-15.65,11.82],[-15.82,11.76],[-15.94,11.79],[-15.9,11.92],[-15.92,11.94],[-15.96,11.96],[-16.14,11.92],[-16.27,11.98],[-16.33,12.05],[-16.32,12.14],[-16.25,12.21],[-16.24,12.24],[-16.31,12.24],[-16.44,12.2],[-16.71,12.35],[-16.66,12.36],[-16.52,12.35],[-16.42,12.37],[-16.34,12.4],[-16.24,12.44],[-16.14,12.46],[-15.84,12.44],[-15.57,12.49],[-15.38,12.59],[-15.2,12.68],[-14.96,12.68],[-14.71,12.68],[-14.35,12.68],[-14.06,12.68],[-13.73,12.67]],[[-15.9,11.08],[-15.91,11.05],[-15.96,11.06],[-15.95,11.09],[-15.96,11.1],[-15.95,11.18],[-15.94,11.19],[-15.91,11.16],[-15.91,11.15],[-15.9,11.08]],[[-16.11,11.06],[-16.19,11.04],[-16.23,11.09],[-16.24,11.11],[-16.19,11.13],[-16.18,11.13],[-16.14,11.17],[-16.1,11.19],[-16.09,11.2],[-16.07,11.2],[-16.05,11.12],[-16.07,11.08],[-16.11,11.06]],[[-15.73,11.22],[-15.73,11.17],[-15.77,11.18],[-15.78,11.19],[-15.75,11.27],[-15.72,11.3],[-15.67,11.3],[-15.66,11.29],[-15.67,11.26],[-15.69,11.23],[-15.73,11.22]],[[-15.9,11.47],[-15.95,11.43],[-16.0,11.45],[-16.02,11.48],[-16.02,11.53],[-15.96,11.6],[-15.92,11.59],[-15.9,11.47]],[[-15.55,11.54],[-15.56,11.51],[-15.62,11.53],[-15.54,11.62],[-15.48,11.63],[-15.48,11.57],[-15.53,11.55],[-15.55,11.54]],[[-15.99,11.88],[-16.04,11.76],[-16.1,11.77],[-16.15,11.85],[-16.15,11.88],[-16.02,11.89],[-15.99,11.88]]]},{"n":"Equatorial Guinea","r":[[[9.8,2.3],[9.83,2.3],[9.83,2.28],[9.84,2.24],[9.87,2.21],[9.98,2.17],[10.31,2.17],[10.5,2.17],[10.79,2.17],[11.1,2.17],[11.33,2.17],[11.33,1.94],[11.33,1.74],[11.33,1.53],[11.33,1.31],[11.33,1.12],[11.34,1.0],[11.13,1.0],[10.86,1.0],[10.59,1.0],[10.32,1.0],[10.18,1.0],[10.03,1.0],[9.98,1.0],[9.95,0.97],[9.91,0.96],[9.86,0.99],[9.8,1.0],[9.79,1.03],[9.76,1.07],[9.7,1.08],[9.68,1.07],[9.64,1.05],[9.59,1.03],[9.6,1.05],[9.51,1.11],[9.45,1.12],[9.39,1.14],[9.43,1.3],[9.49,1.44],[9.58,1.54],[9.63,1.57],[9.65,1.62],[9.72,1.79],[9.81,1.93],[9.78,2.07],[9.8,2.3]],[[8.74,3.76],[8.76,3.75],[8.91,3.76],[8.95,3.71],[8.95,3.63],[8.79,3.4],[8.76,3.3],[8.7,3.22],[8.65,3.22],[8.47,3.26],[8.44,3.29],[8.43,3.33],[8.45,3.42],[8.46,3.45],[8.55,3.47],[8.58,3.48],[8.62,3.58],[8.64,3.67],[8.68,3.74],[8.74,3.76]]]},{"n":"Greece","r":[[[20.0,39.71],[20.02,39.71],[20.06,39.7],[20.13,39.66],[20.21,39.65],[20.25,39.68],[20.27,39.7],[20.29,39.74],[20.29,39.78],[20.31,39.8],[20.36,39.79],[20.38,39.8],[20.38,39.84],[20.34,39.89],[20.31,39.95],[20.31,39.98],[20.34,39.99],[20.38,40.02],[20.41,40.05],[20.46,40.07],[20.53,40.07],[20.61,40.08],[20.66,40.12],[20.66,40.15],[20.7,40.25],[20.72,40.29],[20.75,40.33],[20.77,40.39],[20.81,40.45],[20.88,40.47],[20.95,40.49],[21.0,40.56],[21.03,40.62],[21.03,40.66],[20.99,40.72],[20.96,40.78],[20.96,40.85],[21.1,40.86],[21.15,40.86],[21.32,40.87],[21.4,40.91],[21.46,40.9],[21.58,40.87],[21.63,40.9],[21.78,40.95],[21.93,41.11],[21.99,41.13],[22.14,41.14],[22.18,41.16],[22.24,41.16],[22.4,41.12],[22.49,41.12],[22.6,41.14],[22.72,41.18],[22.76,41.31],[22.78,41.33],[22.86,41.34],[22.92,41.34],[23.03,41.33],[23.16,41.32],[23.24,41.38],[23.37,41.39],[23.43,41.4],[23.54,41.39],[23.64,41.39],[23.76,41.41],[23.88,41.46],[23.97,41.45],[24.01,41.46],[24.03,41.47],[24.06,41.53],[24.23,41.53],[24.29,41.53],[24.39,41.52],[24.49,41.56],[24.52,41.55],[24.57,41.47],[24.6,41.44],[24.65,41.42],[24.77,41.36],[24.8,41.37],[24.85,41.39],[24.99,41.36],[25.13,41.32],[25.25,41.24],[25.38,41.26],[25.53,41.3],[25.62,41.31],[25.72,41.32],[25.78,41.33],[25.92,41.31],[26.07,41.35],[26.14,41.39],[26.16,41.43],[26.14,41.52],[26.11,41.61],[26.08,41.64],[26.07,41.67],[26.09,41.7],[26.11,41.73],[26.2,41.74],[26.32,41.72],[26.41,41.7],[26.46,41.66],[26.5,41.63],[26.54,41.61],[26.58,41.6],[26.61,41.51],[26.62,41.4],[26.6,41.35],[26.54,41.34],[26.33,41.24],[26.33,41.14],[26.33,41.1],[26.33,41.06],[26.35,41.04],[26.35,41.0],[26.33,40.95],[26.24,40.88],[26.18,40.83],[26.11,40.75],[26.07,40.74],[26.04,40.73],[26.01,40.77],[25.86,40.84],[25.5,40.89],[25.33,40.94],[25.25,40.93],[25.1,40.99],[25.0,40.97],[24.79,40.86],[24.68,40.87],[24.56,40.94],[24.48,40.95],[24.38,40.91],[24.23,40.79],[24.08,40.72],[23.95,40.75],[23.76,40.75],[23.74,40.68],[23.78,40.63],[23.88,40.54],[23.83,40.48],[23.87,40.42],[23.93,40.41],[24.03,40.41],[24.21,40.33],[24.29,40.24],[24.34,40.15],[24.23,40.22],[24.16,40.28],[24.06,40.3],[23.91,40.36],[23.82,40.37],[23.73,40.33],[23.72,40.29],[23.82,40.21],[23.92,40.16],[23.97,40.11],[24.0,40.02],[23.98,39.99],[23.95,39.97],[23.84,40.02],[23.66,40.22],[23.43,40.26],[23.39,40.22],[23.43,40.12],[23.47,40.07],[23.67,39.96],[23.66,39.93],[23.63,39.92],[23.4,39.99],[23.33,40.09],[23.31,40.22],[23.1,40.3],[22.9,40.4],[22.85,40.49],[22.89,40.52],[22.92,40.59],[22.81,40.58],[22.74,40.54],[22.63,40.5],[22.62,40.43],[22.64,40.37],[22.61,40.28],[22.57,40.12],[22.59,40.04],[22.84,39.8],[22.92,39.63],[22.98,39.56],[23.1,39.49],[23.23,39.36],[23.29,39.29],[23.33,39.17],[23.22,39.1],[23.15,39.1],[23.12,39.13],[23.17,39.21],[23.16,39.26],[22.99,39.33],[22.92,39.31],[22.84,39.26],[22.89,39.17],[22.94,39.11],[22.97,39.03],[23.07,39.04],[22.93,38.95],[22.8,38.9],[22.68,38.9],[22.6,38.89],[22.57,38.87],[22.63,38.85],[22.69,38.85],[22.77,38.8],[23.02,38.74],[23.14,38.67],[23.25,38.66],[23.37,38.53],[23.57,38.49],[23.68,38.35],[23.84,38.33],[23.97,38.28],[24.01,38.23],[24.02,38.14],[24.03,37.96],[24.06,37.82],[24.06,37.77],[24.06,37.71],[24.02,37.68],[23.97,37.68],[23.88,37.78],[23.73,37.88],[23.58,38.01],[23.54,38.03],[23.5,38.03],[23.42,37.99],[23.19,37.96],[23.09,37.91],[23.05,37.9],[23.04,37.88],[23.09,37.85],[23.15,37.8],[23.15,37.72],[23.2,37.62],[23.26,37.6],[23.35,37.6],[23.4,37.58],[23.41,37.54],[23.46,37.5],[23.49,37.46],[23.49,37.44],[23.25,37.38],[23.2,37.35],[23.16,37.33],[23.1,37.36],[23.1,37.44],[23.02,37.48],[22.94,37.52],[22.85,37.53],[22.78,37.59],[22.73,37.54],[22.77,37.39],[22.85,37.29],[23.0,37.02],[23.06,36.85],[23.07,36.77],[23.04,36.64],[23.11,36.55],[23.16,36.45],[23.11,36.45],[23.06,36.49],[22.98,36.53],[22.83,36.69],[22.78,36.79],[22.72,36.79],[22.61,36.78],[22.49,36.57],[22.49,36.45],[22.43,36.48],[22.37,36.51],[22.38,36.65],[22.38,36.7],[22.23,36.88],[22.16,36.9],[22.13,36.96],[22.08,37.03],[22.01,37.02],[21.96,36.99],[21.94,36.89],[21.93,36.8],[21.89,36.74],[21.74,36.86],[21.58,37.08],[21.58,37.2],[21.69,37.31],[21.68,37.39],[21.57,37.54],[21.42,37.64],[21.33,37.67],[21.29,37.77],[21.21,37.83],[21.14,37.85],[21.12,37.89],[21.15,37.92],[21.31,38.03],[21.4,38.2],[21.45,38.2],[21.55,38.16],[21.66,38.18],[21.75,38.27],[21.82,38.33],[21.95,38.32],[22.24,38.19],[22.56,38.11],[22.71,38.05],[22.8,37.98],[22.85,37.97],[22.92,37.96],[22.92,38.01],[22.89,38.05],[22.95,38.07],[23.12,38.07],[23.15,38.1],[23.18,38.13],[23.15,38.18],[23.09,38.2],[23.03,38.2],[23.0,38.22],[22.93,38.2],[22.83,38.23],[22.78,38.26],[22.75,38.29],[22.58,38.34],[22.42,38.44],[22.39,38.39],[22.32,38.36],[22.23,38.35],[21.97,38.41],[21.8,38.37],[21.72,38.36],[21.65,38.35],[21.57,38.33],[21.47,38.32],[21.39,38.41],[21.36,38.47],[21.33,38.49],[21.33,38.42],[21.3,38.37],[21.18,38.35],[21.11,38.38],[21.06,38.5],[20.99,38.65],[20.87,38.78],[20.78,38.81],[20.77,38.87],[20.78,38.93],[20.89,38.94],[21.07,38.89],[21.11,38.9],[21.15,38.92],[21.14,38.98],[21.12,39.03],[21.07,39.03],[21.03,39.03],[20.92,39.04],[20.78,39.01],[20.71,39.04],[20.69,39.07],[20.57,39.15],[20.47,39.26],[20.3,39.33],[20.19,39.55],[20.1,39.64],[20.0,39.71]],[[23.85,35.54],[23.92,35.53],[24.01,35.53],[24.03,35.54],[24.09,35.59],[24.17,35.6],[24.2,35.54],[24.12,35.51],[24.11,35.5],[24.12,35.48],[24.18,35.46],[24.26,35.47],[24.26,35.42],[24.27,35.39],[24.31,35.36],[24.35,35.36],[24.44,35.37],[24.53,35.38],[24.63,35.41],[24.72,35.42],[25.0,35.41],[25.1,35.35],[25.3,35.34],[25.48,35.31],[25.57,35.33],[25.73,35.35],[25.76,35.33],[25.74,35.18],[25.75,35.14],[25.79,35.12],[25.84,35.13],[25.89,35.18],[26.03,35.22],[26.17,35.22],[26.29,35.31],[26.32,35.32],[26.3,35.27],[26.28,35.16],[26.26,35.1],[26.24,35.04],[26.17,35.02],[26.05,35.01],[25.83,35.03],[25.61,35.01],[25.21,34.96],[24.8,34.93],[24.75,34.95],[24.74,35.01],[24.74,35.06],[24.71,35.09],[24.58,35.12],[24.46,35.16],[23.99,35.22],[23.88,35.25],[23.7,35.23],[23.64,35.24],[23.59,35.26],[23.56,35.3],[23.55,35.42],[23.57,35.53],[23.61,35.57],[23.63,35.53],[23.67,35.51],[23.72,35.55],[23.72,35.6],[23.74,35.66],[23.77,35.63],[23.79,35.56],[23.85,35.54]],[[27.18,35.47],[27.14,35.41],[27.1,35.46],[27.12,35.51],[27.07,35.6],[27.16,35.73],[27.16,35.79],[27.22,35.82],[27.21,35.71],[27.16,35.63],[27.21,35.56],[27.23,35.48],[27.18,35.47]],[[23.05,36.19],[23.04,36.15],[22.94,36.18],[22.91,36.22],[22.91,36.32],[22.93,36.37],[22.95,36.38],[23.0,36.33],[23.1,36.25],[23.05,36.19]],[[27.84,35.93],[27.77,35.91],[27.75,35.91],[27.72,35.96],[27.76,36.07],[27.72,36.14],[27.72,36.17],[27.77,36.21],[27.82,36.28],[27.91,36.35],[28.17,36.43],[28.23,36.43],[28.23,36.37],[28.14,36.21],[28.07,36.13],[28.09,36.07],[27.97,36.05],[27.84,35.93]],[[25.48,36.39],[25.44,36.34],[25.37,36.36],[25.4,36.38],[25.41,36.4],[25.41,36.44],[25.4,36.47],[25.41,36.47],[25.47,36.44],[25.48,36.39]],[[26.46,36.59],[26.38,36.56],[26.33,36.51],[26.27,36.55],[26.27,36.6],[26.34,36.58],[26.38,36.61],[26.37,36.64],[26.42,36.62],[26.46,36.59]],[[27.86,36.55],[27.84,36.54],[27.79,36.58],[27.79,36.61],[27.84,36.63],[27.86,36.64],[27.87,36.62],[27.87,36.58],[27.86,36.55]],[[24.54,36.76],[24.54,36.71],[24.53,36.68],[24.33,36.66],[24.34,36.72],[24.36,36.74],[24.43,36.71],[24.45,36.73],[24.46,36.75],[24.54,36.76]],[[25.38,36.67],[25.36,36.66],[25.29,36.72],[25.26,36.76],[25.3,36.79],[25.41,36.72],[25.38,36.67]],[[26.95,36.73],[26.92,36.73],[26.96,36.77],[27.06,36.84],[27.21,36.9],[27.27,36.91],[27.35,36.87],[27.19,36.81],[27.15,36.78],[27.03,36.77],[26.95,36.73]],[[25.86,36.79],[25.77,36.78],[25.74,36.79],[25.8,36.81],[25.83,36.83],[25.85,36.85],[25.94,36.89],[26.0,36.94],[26.06,36.9],[25.98,36.88],[25.86,36.79]],[[24.72,36.92],[24.7,36.92],[24.68,36.96],[24.67,37.0],[24.68,37.02],[24.72,37.02],[24.76,36.95],[24.72,36.92]],[[27.02,36.96],[26.92,36.95],[26.94,37.02],[26.89,37.09],[26.97,37.05],[27.02,37.01],[27.04,37.0],[27.03,36.98],[27.02,36.96]],[[25.28,37.07],[25.2,36.99],[25.13,37.0],[25.11,37.03],[25.15,37.11],[25.24,37.15],[25.28,37.14],[25.27,37.08],[25.28,37.07]],[[25.55,36.97],[25.46,36.93],[25.4,36.98],[25.36,37.07],[25.53,37.2],[25.56,37.19],[25.59,37.15],[25.58,37.04],[25.55,36.97]],[[24.52,37.13],[24.49,37.11],[24.42,37.13],[24.44,37.19],[24.48,37.21],[24.53,37.19],[24.54,37.17],[24.52,37.13]],[[24.44,37.34],[24.38,37.31],[24.4,37.38],[24.37,37.42],[24.39,37.45],[24.43,37.48],[24.45,37.45],[24.48,37.41],[24.44,37.34]],[[24.94,37.49],[24.94,37.39],[24.91,37.39],[24.9,37.41],[24.9,37.45],[24.91,37.51],[24.94,37.49]],[[25.4,37.42],[25.31,37.41],[25.31,37.49],[25.35,37.51],[25.46,37.47],[25.46,37.45],[25.4,37.42]],[[26.03,37.53],[25.98,37.53],[26.0,37.57],[26.09,37.63],[26.21,37.64],[26.33,37.67],[26.35,37.67],[26.3,37.62],[26.2,37.57],[26.03,37.53]],[[25.26,37.6],[25.22,37.54],[25.16,37.55],[25.05,37.61],[25.02,37.65],[25.0,37.68],[25.04,37.68],[25.09,37.65],[25.23,37.63],[25.26,37.6]],[[24.36,37.58],[24.29,37.53],[24.28,37.6],[24.32,37.68],[24.38,37.68],[24.4,37.65],[24.36,37.58]],[[26.82,37.81],[26.95,37.78],[26.98,37.78],[27.04,37.77],[27.06,37.71],[26.98,37.7],[26.84,37.64],[26.79,37.66],[26.72,37.71],[26.61,37.71],[26.58,37.72],[26.64,37.78],[26.74,37.81],[26.82,37.81]],[[20.89,37.81],[20.99,37.71],[20.91,37.73],[20.82,37.66],[20.7,37.74],[20.64,37.82],[20.62,37.86],[20.69,37.93],[20.76,37.85],[20.84,37.84],[20.89,37.81]],[[24.99,37.76],[24.96,37.69],[24.88,37.77],[24.8,37.82],[24.77,37.87],[24.71,37.9],[24.7,37.96],[24.76,37.99],[24.79,37.99],[24.86,37.91],[24.96,37.9],[24.95,37.86],[24.98,37.8],[24.99,37.76]],[[23.55,37.93],[23.51,37.9],[23.47,37.9],[23.44,37.91],[23.42,37.93],[23.44,37.94],[23.46,37.98],[23.48,37.99],[23.52,37.99],[23.53,37.97],[23.55,37.93]],[[20.61,38.38],[20.62,38.27],[20.7,38.25],[20.79,38.14],[20.78,38.09],[20.76,38.07],[20.61,38.12],[20.57,38.1],[20.52,38.11],[20.5,38.16],[20.5,38.18],[20.47,38.22],[20.45,38.23],[20.39,38.19],[20.35,38.18],[20.35,38.22],[20.41,38.34],[20.44,38.36],[20.48,38.32],[20.52,38.33],[20.55,38.39],[20.55,38.46],[20.56,38.47],[20.61,38.38]],[[20.76,38.33],[20.71,38.32],[20.65,38.41],[20.62,38.48],[20.65,38.48],[20.67,38.48],[20.7,38.45],[20.7,38.43],[20.71,38.4],[20.74,38.37],[20.76,38.33]],[[26.09,38.22],[26.0,38.16],[25.89,38.24],[25.87,38.27],[25.95,38.3],[25.99,38.35],[25.96,38.42],[25.85,38.51],[25.85,38.57],[26.01,38.6],[26.11,38.54],[26.16,38.54],[26.14,38.49],[26.15,38.47],[26.16,38.3],[26.11,38.28],[26.1,38.23],[26.09,38.22]],[[20.69,38.61],[20.65,38.6],[20.61,38.61],[20.58,38.6],[20.55,38.58],[20.56,38.66],[20.59,38.76],[20.63,38.82],[20.69,38.84],[20.72,38.8],[20.71,38.64],[20.69,38.61]],[[24.67,38.81],[24.57,38.78],[24.54,38.79],[24.56,38.82],[24.57,38.83],[24.46,38.89],[24.47,38.96],[24.49,38.98],[24.56,38.94],[24.58,38.88],[24.67,38.81]],[[23.42,38.96],[23.47,38.85],[23.52,38.81],[23.64,38.77],[23.69,38.76],[23.88,38.69],[24.1,38.67],[24.13,38.65],[24.15,38.59],[24.2,38.54],[24.21,38.5],[24.19,38.46],[24.22,38.34],[24.28,38.22],[24.36,38.16],[24.46,38.15],[24.56,38.15],[24.59,38.12],[24.58,38.02],[24.54,37.98],[24.5,37.97],[24.47,37.98],[24.45,38.0],[24.42,38.02],[24.36,38.02],[24.32,38.06],[24.21,38.12],[24.19,38.15],[24.19,38.2],[24.14,38.24],[24.1,38.32],[24.06,38.34],[24.04,38.37],[24.04,38.39],[23.89,38.4],[23.76,38.4],[23.65,38.44],[23.62,38.55],[23.55,38.58],[23.51,38.61],[23.47,38.66],[23.36,38.74],[23.25,38.8],[23.14,38.84],[23.03,38.87],[22.94,38.84],[22.88,38.85],[22.87,38.87],[22.99,38.92],[23.15,39.0],[23.26,39.03],[23.31,39.03],[23.42,38.96]],[[23.78,39.11],[23.74,39.08],[23.67,39.1],[23.59,39.21],[23.78,39.11]],[[23.89,39.16],[23.84,39.15],[23.89,39.23],[23.97,39.27],[23.94,39.2],[23.89,39.16]],[[26.41,39.33],[26.39,39.27],[26.53,39.17],[26.58,39.11],[26.6,39.05],[26.58,39.03],[26.53,39.06],[26.49,39.07],[26.5,39.03],[26.55,38.99],[26.47,38.97],[26.39,38.97],[26.16,39.03],[26.11,39.08],[26.25,39.16],[26.27,39.2],[26.18,39.19],[26.07,39.1],[25.91,39.14],[25.86,39.18],[25.84,39.2],[25.91,39.29],[26.03,39.28],[26.09,39.3],[26.16,39.33],[26.17,39.37],[26.35,39.38],[26.41,39.33]],[[20.08,39.43],[20.1,39.38],[19.98,39.41],[19.88,39.46],[19.81,39.59],[19.65,39.73],[19.65,39.77],[19.71,39.8],[19.84,39.82],[19.89,39.8],[19.93,39.77],[19.94,39.75],[19.86,39.69],[19.85,39.67],[19.9,39.62],[19.9,39.6],[19.93,39.51],[19.96,39.47],[20.03,39.44],[20.08,39.43]],[[25.44,39.98],[25.4,39.95],[25.37,39.89],[25.36,39.81],[25.3,39.81],[25.26,39.82],[25.25,39.85],[25.25,39.89],[25.22,39.89],[25.2,39.85],[25.19,39.83],[25.13,39.83],[25.06,39.85],[25.07,39.91],[25.05,39.98],[25.06,40.0],[25.23,40.01],[25.29,39.96],[25.35,39.98],[25.37,40.02],[25.45,40.03],[25.44,39.98]],[[25.69,40.43],[25.57,40.4],[25.45,40.48],[25.57,40.52],[25.62,40.49],[25.66,40.46],[25.69,40.43]],[[24.77,40.62],[24.65,40.58],[24.52,40.65],[24.52,40.69],[24.59,40.77],[24.62,40.79],[24.72,40.79],[24.77,40.73],[24.79,40.7],[24.77,40.66],[24.77,40.62]]]},{"n":"Grenada","r":[[[-61.72,12.01],[-61.78,12.01],[-61.76,12.05],[-61.75,12.11],[-61.71,12.19],[-61.66,12.24],[-61.61,12.22],[-61.63,12.05],[-61.72,12.01]]]},{"n":"Greenland","r":[[[-46.27,60.78],[-46.38,60.66],[-46.5,60.69],[-46.55,60.74],[-46.67,60.77],[-46.79,60.76],[-46.79,60.78],[-46.39,60.91],[-46.21,60.94],[-46.22,60.89],[-46.25,60.84],[-46.27,60.78]],[[-37.03,65.53],[-37.19,65.53],[-37.24,65.61],[-37.22,65.7],[-37.05,65.72],[-36.95,65.66],[-36.99,65.58],[-37.03,65.53]],[[-51.01,69.55],[-51.17,69.52],[-51.2,69.53],[-51.23,69.55],[-51.31,69.67],[-51.34,69.73],[-51.32,69.8],[-51.35,69.85],[-51.21,69.91],[-51.09,69.92],[-50.94,69.91],[-50.68,69.85],[-50.7,69.83],[-50.75,69.8],[-50.91,69.76],[-50.97,69.66],[-50.98,69.62],[-50.97,69.58],[-51.01,69.55]],[[-52.73,69.94],[-52.4,69.86],[-52.05,69.81],[-52.01,69.78],[-51.98,69.74],[-51.98,69.72],[-51.99,69.7],[-52.01,69.69],[-51.98,69.66],[-51.91,69.64],[-51.9,69.6],[-51.99,69.55],[-52.11,69.49],[-52.77,69.36],[-53.0,69.34],[-53.58,69.26],[-53.75,69.26],[-53.79,69.26],[-53.9,69.3],[-54.05,69.34],[-54.12,69.36],[-54.18,69.4],[-54.16,69.43],[-54.05,69.44],[-53.89,69.44],[-53.66,69.47],[-53.72,69.49],[-53.78,69.51],[-53.82,69.54],[-53.92,69.53],[-53.99,69.55],[-54.13,69.57],[-54.5,69.58],[-54.73,69.61],[-54.8,69.63],[-54.87,69.67],[-54.92,69.71],[-54.84,69.9],[-54.79,69.95],[-54.66,69.97],[-54.36,69.92],[-54.32,69.94],[-54.65,70.01],[-54.77,70.05],[-54.81,70.09],[-54.83,70.13],[-54.83,70.16],[-54.82,70.19],[-54.79,70.22],[-54.71,70.26],[-54.37,70.32],[-54.01,70.3],[-53.38,70.22],[-53.3,70.21],[-53.1,70.14],[-52.73,69.94]],[[-51.68,70.86],[-51.81,70.85],[-52.12,70.87],[-52.14,70.88],[-52.15,70.9],[-52.11,70.97],[-51.97,70.98],[-51.81,70.94],[-51.63,70.89],[-51.61,70.87],[-51.68,70.86]],[[-25.43,70.92],[-25.4,70.86],[-25.39,70.83],[-25.4,70.81],[-25.42,70.79],[-25.47,70.78],[-25.38,70.74],[-25.35,70.71],[-25.35,70.69],[-25.4,70.65],[-25.8,70.6],[-25.91,70.57],[-26.05,70.51],[-26.22,70.45],[-26.27,70.45],[-26.34,70.51],[-26.6,70.55],[-27.1,70.53],[-27.69,70.48],[-27.9,70.45],[-28.0,70.47],[-28.04,70.49],[-28.04,70.51],[-27.97,70.59],[-27.94,70.62],[-27.81,70.64],[-27.71,70.71],[-27.74,70.79],[-27.71,70.9],[-27.62,70.91],[-27.39,70.88],[-27.24,70.87],[-26.98,70.86],[-26.62,70.88],[-26.34,70.92],[-25.82,71.04],[-25.73,71.04],[-25.66,71.0],[-25.61,70.98],[-25.46,70.94],[-25.43,70.92]],[[-53.54,71.04],[-53.63,71.03],[-53.9,71.09],[-53.94,71.1],[-53.96,71.13],[-53.95,71.16],[-53.86,71.21],[-53.7,71.28],[-53.58,71.3],[-53.51,71.25],[-53.44,71.19],[-53.43,71.15],[-53.44,71.12],[-53.46,71.08],[-53.49,71.06],[-53.54,71.04]],[[-55.02,72.79],[-55.16,72.72],[-55.27,72.68],[-55.52,72.57],[-55.57,72.56],[-55.63,72.58],[-55.69,72.61],[-55.78,72.62],[-55.81,72.64],[-55.83,72.65],[-55.87,72.66],[-55.94,72.67],[-56.04,72.66],[-56.14,72.67],[-56.21,72.72],[-56.08,72.75],[-55.99,72.78],[-55.67,72.79],[-55.57,72.78],[-55.52,72.78],[-55.43,72.79],[-55.23,72.82],[-55.21,72.84],[-55.03,72.82],[-55.02,72.79]],[[-18.0,75.41],[-17.92,75.3],[-17.89,75.2],[-17.76,75.14],[-17.5,75.15],[-17.39,75.04],[-17.59,74.99],[-18.35,75.01],[-18.67,75.0],[-18.89,75.07],[-18.88,75.2],[-18.86,75.32],[-18.64,75.39],[-18.45,75.33],[-18.23,75.37],[-18.0,75.41]],[[-18.58,76.04],[-18.7,76.02],[-19.09,76.43],[-19.09,76.58],[-19.06,76.69],[-18.88,76.7],[-18.73,76.64],[-18.66,76.4],[-18.58,76.04]],[[-71.67,77.33],[-72.02,77.32],[-72.37,77.36],[-72.49,77.39],[-72.49,77.43],[-72.44,77.45],[-72.25,77.46],[-72.09,77.47],[-71.98,77.46],[-71.73,77.43],[-71.55,77.4],[-71.43,77.39],[-71.47,77.35],[-71.67,77.33]],[[-17.95,77.64],[-18.15,77.64],[-18.22,77.67],[-18.17,77.71],[-17.9,77.86],[-17.81,77.87],[-17.68,77.86],[-17.64,77.78],[-17.73,77.71],[-17.95,77.64]],[[-19.0,77.97],[-19.13,77.94],[-19.22,78.04],[-19.3,78.19],[-19.31,78.34],[-19.11,78.42],[-19.01,78.44],[-18.94,78.42],[-18.95,78.35],[-18.95,78.21],[-18.88,78.11],[-19.0,77.97]],[[-17.61,79.83],[-18.04,79.71],[-18.66,79.72],[-19.03,79.77],[-19.14,79.85],[-19.0,79.94],[-18.55,80.01],[-17.98,80.06],[-17.47,80.03],[-17.4,79.94],[-17.61,79.83]],[[-18.66,81.85],[-18.77,81.81],[-19.03,81.83],[-19.37,81.92],[-19.59,81.99],[-19.61,82.08],[-19.49,82.12],[-19.31,82.12],[-19.07,82.05],[-18.81,81.95],[-18.66,81.85]],[[-44.86,82.08],[-45.07,82.07],[-45.49,82.17],[-46.16,82.28],[-46.75,82.35],[-47.31,82.53],[-47.35,82.6],[-47.27,82.66],[-46.79,82.67],[-46.4,82.69],[-45.41,82.58],[-44.92,82.48],[-44.75,82.4],[-44.78,82.24],[-44.86,82.08]],[[-29.95,83.56],[-28.99,83.5],[-28.48,83.43],[-28.38,83.44],[-27.69,83.41],[-27.03,83.38],[-25.95,83.29],[-25.8,83.26],[-25.91,83.24],[-26.18,83.22],[-27.57,83.19],[-30.09,83.16],[-31.53,83.09],[-31.99,83.09],[-32.03,82.98],[-31.84,82.98],[-31.52,82.99],[-30.39,83.09],[-29.96,83.11],[-29.18,83.1],[-28.15,83.06],[-27.74,83.08],[-27.0,83.07],[-26.14,83.1],[-25.12,83.16],[-24.85,83.02],[-24.47,82.88],[-24.17,82.89],[-23.92,82.89],[-23.83,82.84],[-23.69,82.82],[-23.41,82.83],[-22.52,82.79],[-21.92,82.72],[-21.69,82.68],[-21.58,82.63],[-21.52,82.6],[-21.62,82.55],[-21.99,82.46],[-22.47,82.38],[-23.12,82.32],[-23.86,82.29],[-29.58,82.16],[-29.77,82.13],[-29.89,82.05],[-29.81,81.96],[-29.54,81.94],[-28.92,82.0],[-27.84,82.05],[-27.05,82.05],[-25.15,82.0],[-24.59,81.88],[-24.29,81.7],[-23.64,81.74],[-23.5,81.77],[-23.39,81.83],[-23.31,81.89],[-23.25,81.95],[-23.18,81.99],[-23.1,82.01],[-22.94,82.03],[-22.56,82.05],[-21.58,82.07],[-21.34,82.07],[-21.17,81.98],[-21.13,81.93],[-21.12,81.87],[-21.12,81.79],[-21.15,81.7],[-21.23,81.6],[-21.5,81.44],[-21.72,81.35],[-21.96,81.28],[-22.42,81.14],[-22.57,81.1],[-23.07,80.93],[-23.2,80.85],[-23.2,80.79],[-23.12,80.78],[-22.97,80.83],[-22.92,80.87],[-22.83,80.91],[-22.09,81.02],[-21.93,81.05],[-21.45,81.18],[-21.14,81.23],[-20.89,81.28],[-20.76,81.31],[-20.02,81.56],[-19.63,81.64],[-19.22,81.64],[-19.15,81.51],[-18.67,81.49],[-18.46,81.5],[-18.12,81.47],[-17.97,81.44],[-17.72,81.43],[-17.46,81.4],[-17.23,81.43],[-17.16,81.45],[-16.94,81.54],[-16.64,81.63],[-16.36,81.73],[-16.27,81.75],[-16.12,81.78],[-15.97,81.79],[-15.56,81.83],[-15.45,81.84],[-15.23,81.82],[-14.24,81.81],[-13.7,81.79],[-12.96,81.72],[-12.43,81.68],[-12.19,81.65],[-11.84,81.58],[-11.56,81.5],[-11.43,81.48],[-11.43,81.46],[-11.53,81.42],[-12.23,81.31],[-12.46,81.23],[-13.13,81.09],[-13.45,81.04],[-13.8,81.02],[-14.2,81.01],[-14.45,80.99],[-14.49,80.97],[-14.31,80.91],[-14.23,80.87],[-14.24,80.83],[-14.43,80.78],[-14.5,80.76],[-15.19,80.72],[-15.54,80.65],[-16.0,80.64],[-16.32,80.65],[-16.76,80.57],[-16.59,80.51],[-16.43,80.48],[-15.94,80.43],[-15.93,80.4],[-16.17,80.33],[-16.49,80.25],[-16.87,80.2],[-17.01,80.19],[-17.19,80.2],[-17.36,80.2],[-17.72,80.18],[-18.07,80.17],[-18.69,80.21],[-19.03,80.25],[-19.21,80.26],[-19.43,80.26],[-19.52,80.24],[-19.87,80.14],[-20.04,80.08],[-20.15,80.01],[-20.2,79.94],[-20.18,79.86],[-20.14,79.8],[-20.07,79.77],[-19.99,79.76],[-19.84,79.75],[-19.52,79.76],[-19.39,79.75],[-19.35,79.73],[-19.28,79.68],[-19.3,79.64],[-19.35,79.57],[-19.4,79.49],[-19.43,79.4],[-19.41,79.35],[-19.28,79.34],[-19.22,79.34],[-19.15,79.33],[-19.07,79.29],[-19.01,79.25],[-18.97,79.21],[-18.99,79.18],[-19.07,79.15],[-19.26,79.12],[-19.72,79.07],[-19.77,79.05],[-19.81,79.01],[-19.83,78.96],[-19.89,78.91],[-19.97,78.87],[-20.05,78.84],[-20.2,78.83],[-20.4,78.83],[-20.62,78.8],[-21.13,78.66],[-21.14,78.64],[-20.95,78.6],[-20.96,78.56],[-21.19,78.38],[-21.26,78.29],[-21.31,78.17],[-21.4,78.07],[-21.52,77.99],[-21.63,77.9],[-21.75,77.79],[-21.73,77.71],[-21.58,77.65],[-21.38,77.7],[-21.13,77.85],[-20.86,77.91],[-20.57,77.89],[-20.32,77.86],[-20.0,77.8],[-19.72,77.77],[-19.49,77.72],[-19.39,77.68],[-19.3,77.62],[-19.3,77.59],[-19.47,77.57],[-19.52,77.57],[-19.95,77.67],[-20.16,77.69],[-20.44,77.66],[-20.68,77.62],[-20.46,77.45],[-20.23,77.37],[-19.81,77.33],[-19.59,77.29],[-19.43,77.25],[-19.3,77.22],[-19.13,77.23],[-18.9,77.28],[-18.59,77.28],[-18.44,77.26],[-18.34,77.22],[-18.29,77.13],[-18.3,77.01],[-18.34,76.92],[-18.4,76.86],[-18.51,76.78],[-18.61,76.76],[-18.74,76.77],[-18.87,76.78],[-18.98,76.81],[-19.16,76.84],[-19.51,76.86],[-19.86,76.91],[-20.06,76.93],[-20.49,76.92],[-20.94,76.89],[-20.96,76.84],[-21.61,76.69],[-21.75,76.69],[-21.93,76.74],[-22.19,76.79],[-22.33,76.79],[-22.55,76.73],[-22.61,76.7],[-22.61,76.68],[-22.44,76.63],[-22.38,76.61],[-22.29,76.6],[-22.0,76.59],[-21.88,76.57],[-21.76,76.4],[-21.57,76.29],[-21.49,76.27],[-21.42,76.26],[-21.19,76.27],[-20.89,76.3],[-20.78,76.28],[-20.56,76.24],[-20.44,76.23],[-20.28,76.23],[-20.1,76.22],[-19.86,76.12],[-19.96,76.0],[-19.81,75.9],[-19.57,75.79],[-19.51,75.76],[-19.49,75.69],[-19.48,75.64],[-19.46,75.6],[-19.43,75.57],[-19.4,75.49],[-19.37,75.39],[-19.38,75.3],[-19.43,75.23],[-19.53,75.18],[-19.68,75.15],[-19.8,75.16],[-19.89,75.2],[-20.03,75.25],[-20.2,75.31],[-20.48,75.31],[-20.91,75.16],[-21.09,75.15],[-21.25,75.13],[-21.41,75.06],[-21.65,75.02],[-21.86,75.04],[-22.23,75.12],[-22.1,75.07],[-21.9,75.0],[-21.78,74.97],[-21.7,74.96],[-21.6,74.97],[-21.46,75.0],[-21.14,75.07],[-21.06,75.08],[-20.99,75.07],[-20.93,75.05],[-20.86,74.99],[-20.79,74.89],[-20.8,74.81],[-20.89,74.74],[-20.97,74.69],[-21.04,74.67],[-21.04,74.65],[-20.86,74.64],[-20.61,74.73],[-20.53,74.84],[-20.42,74.98],[-20.21,75.02],[-19.98,74.98],[-19.8,74.85],[-19.54,74.62],[-19.43,74.6],[-19.29,74.55],[-19.23,74.48],[-19.24,74.4],[-19.27,74.34],[-19.31,74.31],[-19.37,74.28],[-19.47,74.27],[-19.65,74.26],[-20.05,74.28],[-20.26,74.28],[-20.23,74.2],[-20.65,74.14],[-21.13,74.11],[-21.58,74.16],[-21.95,74.24],[-21.83,74.36],[-21.76,74.48],[-21.94,74.57],[-21.98,74.57],[-21.92,74.44],[-21.97,74.39],[-22.18,74.33],[-22.32,74.3],[-22.33,74.29],[-22.26,74.27],[-22.22,74.25],[-22.2,74.21],[-22.22,74.17],[-22.29,74.12],[-22.33,74.09],[-22.34,74.06],[-22.27,74.03],[-22.13,73.99],[-21.99,73.97],[-21.3,73.96],[-21.02,73.94],[-20.37,73.85],[-20.34,73.82],[-20.45,73.65],[-20.51,73.49],[-20.64,73.46],[-21.33,73.46],[-21.55,73.43],[-21.87,73.36],[-22.19,73.27],[-22.35,73.27],[-22.99,73.35],[-23.23,73.4],[-23.76,73.54],[-24.16,73.76],[-24.34,73.67],[-24.45,73.63],[-24.57,73.61],[-24.68,73.6],[-24.78,73.62],[-24.91,73.65],[-25.11,73.73],[-25.35,73.81],[-25.52,73.85],[-25.53,73.84],[-25.43,73.79],[-25.28,73.74],[-24.91,73.58],[-24.78,73.54],[-24.79,73.51],[-25.03,73.49],[-25.31,73.43],[-25.45,73.39],[-25.67,73.29],[-25.74,73.28],[-26.06,73.25],[-26.17,73.26],[-26.41,73.31],[-26.77,73.35],[-26.98,73.38],[-27.27,73.44],[-27.17,73.37],[-26.6,73.28],[-26.54,73.25],[-26.66,73.19],[-26.73,73.17],[-26.86,73.17],[-27.06,73.18],[-27.26,73.18],[-27.47,73.16],[-27.56,73.14],[-27.53,73.11],[-27.48,73.09],[-27.41,73.07],[-27.35,73.07],[-27.19,73.13],[-27.07,73.14],[-26.75,73.12],[-26.43,73.17],[-26.2,73.19],[-26.03,73.2],[-25.4,73.28],[-25.27,73.36],[-25.06,73.4],[-24.59,73.42],[-24.13,73.41],[-23.9,73.4],[-23.71,73.32],[-23.46,73.26],[-23.24,73.19],[-23.0,73.17],[-22.85,73.08],[-22.45,72.99],[-22.19,72.97],[-22.04,72.92],[-22.02,72.72],[-22.01,72.64],[-22.07,72.4],[-22.28,72.34],[-22.24,72.22],[-22.29,72.12],[-22.5,72.16],[-22.71,72.22],[-23.21,72.33],[-23.67,72.39],[-23.86,72.45],[-24.07,72.5],[-24.36,72.69],[-24.55,72.92],[-24.63,73.04],[-24.79,73.04],[-24.99,73.01],[-25.17,72.98],[-25.26,72.92],[-25.86,72.85],[-26.08,72.79],[-26.21,72.8],[-26.66,72.72],[-26.48,72.68],[-26.39,72.67],[-26.21,72.69],[-26.1,72.72],[-25.69,72.8],[-25.36,72.81],[-25.24,72.84],[-24.98,72.89],[-24.81,72.9],[-24.79,72.89],[-24.77,72.87],[-24.65,72.58],[-24.7,72.51],[-24.84,72.47],[-25.13,72.42],[-25.2,72.39],[-25.12,72.35],[-24.84,72.39],[-24.67,72.44],[-24.57,72.42],[-24.42,72.35],[-24.24,72.31],[-23.8,72.2],[-23.59,72.14],[-23.29,72.08],[-22.96,72.0],[-22.87,71.97],[-22.56,71.93],[-22.5,71.91],[-22.37,71.77],[-22.26,71.75],[-21.96,71.74],[-22.01,71.69],[-22.31,71.56],[-22.46,71.52],[-22.5,71.5],[-22.49,71.46],[-22.48,71.38],[-22.42,71.25],[-22.35,71.37],[-22.3,71.43],[-22.23,71.45],[-22.17,71.45],[-21.96,71.51],[-21.75,71.48],[-21.7,71.34],[-21.67,71.21],[-21.69,71.09],[-21.67,70.92],[-21.67,70.86],[-21.63,70.8],[-21.57,70.59],[-21.52,70.53],[-21.63,70.47],[-21.94,70.44],[-22.07,70.47],[-22.38,70.46],[-22.38,70.51],[-22.4,70.57],[-22.4,70.61],[-22.42,70.65],[-22.44,70.86],[-22.53,70.81],[-22.53,70.76],[-22.56,70.72],[-22.61,70.49],[-22.69,70.44],[-22.94,70.45],[-23.19,70.44],[-23.33,70.45],[-23.79,70.56],[-23.97,70.65],[-24.13,70.79],[-24.23,70.92],[-24.27,71.05],[-24.38,71.15],[-24.56,71.22],[-24.78,71.29],[-25.03,71.33],[-25.25,71.4],[-25.45,71.47],[-25.66,71.53],[-25.89,71.57],[-26.21,71.59],[-26.69,71.58],[-27.01,71.63],[-27.09,71.63],[-27.16,71.6],[-27.11,71.53],[-26.74,71.5],[-26.45,71.49],[-26.07,71.5],[-25.84,71.48],[-25.76,71.44],[-25.7,71.37],[-25.67,71.27],[-25.74,71.18],[-26.01,71.09],[-26.16,71.05],[-26.58,70.97],[-26.72,70.95],[-27.07,70.94],[-27.34,70.95],[-27.69,70.99],[-27.89,71.0],[-28.3,71.01],[-28.4,70.99],[-28.29,70.95],[-28.12,70.92],[-27.99,70.9],[-27.98,70.84],[-28.02,70.76],[-28.07,70.7],[-28.15,70.66],[-28.42,70.57],[-28.53,70.55],[-29.04,70.46],[-29.07,70.44],[-28.95,70.45],[-28.63,70.48],[-28.54,70.48],[-28.02,70.4],[-27.6,70.41],[-26.75,70.48],[-26.68,70.47],[-26.62,70.46],[-26.57,70.44],[-26.51,70.4],[-26.58,70.36],[-26.77,70.32],[-27.07,70.28],[-27.2,70.26],[-27.33,70.22],[-27.56,70.12],[-27.63,70.03],[-27.38,69.99],[-27.27,70.04],[-27.14,70.14],[-27.03,70.2],[-26.75,70.24],[-26.42,70.22],[-26.16,70.25],[-25.62,70.35],[-25.53,70.35],[-24.75,70.3],[-24.04,70.18],[-23.67,70.14],[-23.17,70.11],[-22.28,70.13],[-22.21,70.11],[-22.24,70.07],[-22.29,70.03],[-22.44,69.99],[-22.61,69.95],[-22.73,69.95],[-22.82,69.92],[-23.03,69.9],[-23.09,69.88],[-23.01,69.8],[-23.05,69.79],[-23.24,69.79],[-23.55,69.74],[-23.81,69.74],[-23.87,69.74],[-23.82,69.72],[-23.76,69.68],[-23.71,69.63],[-23.74,69.59],[-23.86,69.57],[-23.94,69.56],[-24.25,69.59],[-24.3,69.59],[-24.25,69.56],[-24.23,69.53],[-24.22,69.48],[-24.3,69.44],[-24.45,69.41],[-24.74,69.32],[-24.87,69.29],[-25.13,69.27],[-25.19,69.26],[-25.08,69.19],[-25.09,69.17],[-25.27,69.09],[-25.54,69.05],[-25.58,69.02],[-25.61,68.95],[-25.63,68.93],[-25.7,68.89],[-25.96,68.82],[-26.14,68.78],[-26.23,68.75],[-26.34,68.7],[-26.48,68.68],[-26.65,68.67],[-26.82,68.65],[-27.08,68.6],[-27.27,68.58],[-27.85,68.49],[-28.13,68.48],[-28.36,68.45],[-28.85,68.36],[-29.09,68.33],[-29.25,68.3],[-29.43,68.29],[-29.71,68.31],[-29.87,68.31],[-29.96,68.3],[-30.05,68.27],[-30.2,68.2],[-30.32,68.19],[-30.72,68.25],[-30.71,68.22],[-30.61,68.16],[-30.61,68.12],[-30.85,68.07],[-30.98,68.06],[-31.17,68.08],[-31.42,68.13],[-31.74,68.23],[-32.14,68.38],[-32.33,68.44],[-32.31,68.39],[-32.27,68.34],[-32.2,68.29],[-32.18,68.26],[-32.22,68.24],[-32.28,68.23],[-32.35,68.23],[-32.37,68.21],[-32.25,68.14],[-32.16,68.06],[-32.16,67.99],[-32.27,67.92],[-32.37,67.88],[-32.45,67.87],[-32.92,67.7],[-33.05,67.68],[-33.11,67.66],[-33.16,67.63],[-33.29,67.49],[-33.35,67.44],[-33.46,67.39],[-33.5,67.38],[-33.52,67.35],[-33.5,67.32],[-33.53,67.26],[-33.61,67.17],[-33.88,66.94],[-34.1,66.73],[-34.2,66.66],[-34.27,66.63],[-34.31,66.64],[-34.42,66.63],[-34.48,66.59],[-34.52,66.52],[-34.58,66.47],[-34.63,66.43],[-35.07,66.28],[-35.19,66.25],[-35.29,66.27],[-35.41,66.26],[-35.66,66.34],[-35.71,66.37],[-35.87,66.44],[-35.86,66.41],[-35.83,66.39],[-35.81,66.36],[-35.76,66.32],[-35.63,66.14],[-35.73,66.1],[-35.82,66.06],[-36.04,65.99],[-36.29,65.86],[-36.38,65.83],[-36.4,65.93],[-36.39,65.96],[-36.53,66.01],[-36.52,65.97],[-36.54,65.94],[-36.64,65.81],[-36.67,65.79],[-36.71,65.8],[-36.82,65.77],[-36.93,65.78],[-37.03,65.84],[-37.06,65.87],[-37.23,65.79],[-37.32,65.79],[-37.33,65.72],[-37.41,65.66],[-37.52,65.63],[-37.66,65.63],[-37.75,65.59],[-37.95,65.63],[-38.0,65.71],[-37.84,65.81],[-37.8,65.86],[-37.83,65.91],[-37.79,65.98],[-37.48,66.19],[-37.28,66.3],[-37.29,66.32],[-37.57,66.35],[-37.81,66.39],[-38.05,66.4],[-38.16,66.39],[-37.99,66.32],[-37.75,66.26],[-37.87,66.2],[-37.97,66.14],[-38.07,65.97],[-38.14,65.9],[-38.4,65.98],[-38.52,66.01],[-38.44,65.92],[-38.22,65.84],[-38.2,65.81],[-38.2,65.71],[-38.64,65.62],[-39.09,65.61],[-39.41,65.59],[-39.96,65.56],[-40.17,65.56],[-40.19,65.52],[-39.66,65.37],[-39.58,65.34],[-39.65,65.29],[-39.76,65.25],[-39.94,65.14],[-40.03,65.1],[-40.25,65.05],[-40.67,65.11],[-40.88,65.08],[-41.08,65.1],[-41.09,65.04],[-41.03,64.99],[-40.97,64.87],[-40.83,64.88],[-40.66,64.92],[-40.52,64.83],[-40.43,64.67],[-40.28,64.6],[-40.21,64.54],[-40.18,64.48],[-40.28,64.42],[-40.48,64.34],[-40.7,64.33],[-40.69,64.27],[-40.78,64.22],[-40.98,64.24],[-41.08,64.27],[-41.18,64.28],[-41.58,64.3],[-41.18,64.18],[-41.03,64.12],[-40.97,64.15],[-40.83,64.16],[-40.62,64.13],[-40.65,63.93],[-40.56,63.76],[-40.55,63.73],[-40.77,63.63],[-40.78,63.53],[-40.91,63.51],[-41.05,63.51],[-41.06,63.41],[-41.15,63.35],[-41.14,63.31],[-41.11,63.27],[-41.2,63.21],[-41.27,63.13],[-41.39,63.06],[-41.45,63.07],[-41.63,63.06],[-41.84,63.07],[-42.02,63.16],[-42.09,63.19],[-42.17,63.21],[-42.14,63.15],[-42.09,63.12],[-41.93,63.05],[-41.63,62.97],[-41.64,62.92],[-41.72,62.89],[-41.91,62.74],[-41.97,62.73],[-42.06,62.69],[-42.32,62.71],[-42.42,62.72],[-42.74,62.71],[-42.85,62.73],[-42.94,62.72],[-42.86,62.68],[-42.67,62.64],[-42.47,62.6],[-42.15,62.57],[-42.16,62.51],[-42.24,62.47],[-42.2,62.4],[-42.23,62.35],[-42.25,62.29],[-42.32,62.15],[-42.24,62.06],[-42.14,62.01],[-42.15,61.95],[-42.11,61.86],[-42.25,61.77],[-42.37,61.77],[-42.53,61.76],[-42.59,61.72],[-42.32,61.68],[-42.35,61.62],[-42.42,61.54],[-42.49,61.36],[-42.65,61.06],[-42.72,60.77],[-43.04,60.52],[-43.16,60.52],[-43.19,60.51],[-43.35,60.52],[-43.6,60.58],[-43.79,60.59],[-43.92,60.6],[-43.94,60.57],[-43.83,60.52],[-43.67,60.5],[-43.53,60.47],[-43.3,60.44],[-43.21,60.39],[-43.16,60.33],[-43.16,60.3],[-43.17,60.26],[-43.12,60.06],[-43.23,59.99],[-43.32,59.93],[-43.62,59.94],[-43.67,59.96],[-43.96,60.03],[-43.94,59.99],[-43.73,59.9],[-43.66,59.86],[-43.71,59.85],[-43.79,59.85],[-43.91,59.82],[-44.12,59.83],[-44.11,59.88],[-44.07,59.92],[-44.16,59.92],[-44.27,59.89],[-44.33,59.9],[-44.38,59.9],[-44.41,59.92],[-44.45,60.01],[-44.4,60.06],[-44.23,60.18],[-44.18,60.24],[-44.22,60.27],[-44.35,60.2],[-44.48,60.1],[-44.53,60.03],[-44.61,60.02],[-44.81,60.05],[-45.38,60.2],[-45.36,60.3],[-45.37,60.37],[-45.2,60.38],[-45.08,60.42],[-44.97,60.46],[-44.85,60.53],[-44.74,60.66],[-44.76,60.66],[-45.08,60.51],[-45.28,60.45],[-45.38,60.44],[-45.43,60.47],[-45.59,60.52],[-45.7,60.54],[-45.93,60.58],[-45.98,60.6],[-46.05,60.62],[-46.14,60.78],[-46.02,60.97],[-45.93,61.03],[-45.88,61.09],[-45.85,61.18],[-45.87,61.22],[-45.94,61.21],[-45.98,61.18],[-45.97,61.13],[-46.01,61.1],[-46.3,61.02],[-46.58,60.96],[-46.72,60.9],[-46.81,60.86],[-46.87,60.82],[-46.98,60.82],[-47.12,60.81],[-47.22,60.78],[-47.37,60.8],[-47.46,60.84],[-47.58,60.85],[-47.71,60.83],[-47.8,60.83],[-47.79,60.8],[-47.73,60.73],[-47.83,60.72],[-48.01,60.72],[-48.11,60.74],[-48.18,60.77],[-48.24,60.81],[-48.21,60.86],[-47.91,60.95],[-47.77,61.0],[-47.86,61.02],[-48.15,61.0],[-48.19,61.01],[-48.39,61.0],[-48.38,61.14],[-48.42,61.17],[-48.43,61.19],[-48.49,61.22],[-48.56,61.23],[-48.6,61.25],[-48.92,61.28],[-48.96,61.35],[-48.99,61.43],[-49.05,61.52],[-49.2,61.55],[-49.29,61.59],[-49.22,61.63],[-49.19,61.69],[-49.27,61.71],[-49.31,61.75],[-49.3,61.77],[-49.36,61.84],[-49.38,61.89],[-49.31,61.94],[-49.13,61.99],[-49.07,62.02],[-49.04,62.04],[-48.83,62.08],[-49.01,62.11],[-49.12,62.11],[-49.2,62.1],[-49.28,62.05],[-49.35,62.01],[-49.62,62.0],[-49.66,62.02],[-49.68,62.09],[-49.67,62.15],[-49.55,62.23],[-49.69,62.27],[-49.81,62.29],[-49.94,62.32],[-50.07,62.36],[-50.18,62.41],[-50.29,62.47],[-50.32,62.47],[-50.28,62.53],[-50.26,62.58],[-50.26,62.68],[-50.3,62.72],[-50.2,62.81],[-50.08,62.9],[-49.79,63.04],[-50.09,62.98],[-50.34,62.83],[-50.39,62.82],[-50.41,62.85],[-50.5,62.94],[-50.57,62.97],[-50.6,63.0],[-50.74,63.05],[-50.8,63.09],[-50.89,63.17],[-51.01,63.26],[-51.19,63.44],[-51.47,63.64],[-51.54,63.76],[-51.45,63.9],[-51.55,64.01],[-51.28,64.05],[-50.9,64.11],[-50.7,64.15],[-50.59,64.16],[-50.34,64.17],[-50.26,64.21],[-50.4,64.2],[-50.49,64.21],[-50.49,64.23],[-50.46,64.27],[-50.44,64.31],[-50.48,64.3],[-50.72,64.22],[-51.07,64.16],[-51.35,64.12],[-51.39,64.12],[-51.49,64.1],[-51.54,64.1],[-51.58,64.1],[-51.68,64.16],[-51.71,64.21],[-51.53,64.31],[-51.4,64.46],[-51.23,64.56],[-51.11,64.57],[-50.91,64.57],[-50.83,64.56],[-50.86,64.62],[-50.85,64.64],[-50.68,64.68],[-50.49,64.69],[-50.36,64.68],[-50.27,64.61],[-50.16,64.49],[-50.01,64.45],[-50.02,64.51],[-50.09,64.58],[-50.12,64.7],[-50.22,64.75],[-50.3,64.78],[-50.52,64.77],[-50.65,64.85],[-50.68,64.89],[-50.68,64.93],[-50.81,65.05],[-50.85,65.11],[-50.92,65.2],[-50.96,65.2],[-50.91,65.1],[-50.85,65.02],[-50.76,64.86],[-50.72,64.8],[-50.78,64.75],[-50.89,64.7],[-50.99,64.66],[-51.22,64.63],[-51.17,64.71],[-51.14,64.79],[-51.26,64.76],[-51.36,64.7],[-51.4,64.62],[-51.47,64.55],[-51.68,64.38],[-51.76,64.28],[-51.83,64.23],[-51.92,64.22],[-52.0,64.26],[-52.06,64.35],[-52.09,64.42],[-52.1,64.6],[-52.09,64.68],[-52.12,64.8],[-52.24,65.06],[-52.26,65.15],[-52.45,65.21],[-52.45,65.22],[-52.5,65.28],[-52.54,65.33],[-52.51,65.35],[-52.46,65.36],[-52.18,65.44],[-51.97,65.53],[-51.72,65.67],[-51.62,65.71],[-51.25,65.75],[-51.09,65.75],[-51.09,65.78],[-51.15,65.79],[-51.39,65.78],[-51.72,65.72],[-51.78,65.7],[-51.92,65.62],[-52.04,65.57],[-52.35,65.46],[-52.55,65.46],[-52.76,65.59],[-52.99,65.57],[-53.15,65.57],[-53.2,65.59],[-53.23,65.77],[-53.11,65.98],[-53.24,65.98],[-53.27,65.99],[-53.34,66.03],[-53.39,66.05],[-53.36,66.07],[-53.02,66.17],[-52.51,66.36],[-52.29,66.44],[-52.16,66.47],[-52.06,66.51],[-51.93,66.59],[-51.89,66.62],[-51.82,66.65],[-51.68,66.68],[-51.52,66.73],[-51.26,66.84],[-51.22,66.88],[-51.28,66.89],[-51.4,66.85],[-51.65,66.75],[-51.82,66.7],[-52.42,66.45],[-52.68,66.36],[-52.81,66.3],[-52.92,66.24],[-53.04,66.2],[-53.16,66.18],[-53.41,66.16],[-53.54,66.14],[-53.61,66.15],[-53.65,66.27],[-53.62,66.34],[-53.63,66.41],[-53.57,66.51],[-53.48,66.58],[-53.44,66.62],[-53.42,66.65],[-53.22,66.72],[-53.11,66.75],[-53.04,66.83],[-52.6,66.85],[-52.49,66.85],[-52.43,66.86],[-52.39,66.88],[-52.43,66.9],[-52.56,66.91],[-52.91,66.91],[-53.23,66.92],[-53.37,66.93],[-53.44,66.92],[-53.56,66.95],[-53.69,66.99],[-53.88,67.14],[-53.81,67.33],[-53.8,67.42],[-53.55,67.5],[-53.41,67.52],[-53.22,67.58],[-52.97,67.69],[-52.67,67.75],[-52.51,67.76],[-52.38,67.75],[-51.91,67.66],[-51.67,67.65],[-51.45,67.67],[-51.18,67.64],[-50.71,67.51],[-50.61,67.53],[-50.64,67.56],[-51.17,67.69],[-51.17,67.73],[-51.03,67.74],[-50.89,67.78],[-50.97,67.81],[-51.32,67.79],[-51.42,67.75],[-51.77,67.74],[-51.94,67.77],[-52.1,67.78],[-52.34,67.84],[-52.55,67.82],[-52.67,67.79],[-52.9,67.77],[-52.98,67.76],[-53.42,67.57],[-53.6,67.54],[-53.74,67.55],[-53.64,67.67],[-53.62,67.72],[-53.62,67.77],[-53.58,67.84],[-53.35,67.97],[-53.21,68.12],[-53.15,68.21],[-53.04,68.22],[-52.89,68.2],[-52.44,68.15],[-52.06,68.08],[-51.78,68.06],[-51.6,68.05],[-51.52,68.08],[-51.46,68.12],[-51.43,68.14],[-51.41,68.2],[-51.39,68.22],[-51.33,68.24],[-51.21,68.33],[-51.17,68.39],[-51.21,68.42],[-51.29,68.42],[-51.46,68.39],[-51.48,68.38],[-51.48,68.37],[-51.63,68.27],[-51.8,68.25],[-52.2,68.22],[-52.38,68.22],[-52.7,68.26],[-52.75,68.28],[-52.78,68.31],[-53.17,68.3],[-53.29,68.29],[-53.38,68.3],[-53.34,68.35],[-53.21,68.41],[-53.04,68.61],[-52.89,68.66],[-52.6,68.71],[-52.3,68.7],[-51.78,68.55],[-51.62,68.53],[-51.48,68.55],[-51.13,68.6],[-51.07,68.62],[-50.95,68.68],[-50.8,68.79],[-50.81,68.82],[-51.03,68.76],[-51.15,68.74],[-51.25,68.74],[-51.16,68.94],[-51.12,69.09],[-51.08,69.13],[-50.79,69.12],[-50.39,69.14],[-50.3,69.17],[-50.3,69.19],[-50.46,69.21],[-50.54,69.25],[-50.67,69.23],[-50.85,69.21],[-51.08,69.21],[-51.06,69.27],[-50.89,69.41],[-50.88,69.47],[-50.81,69.6],[-50.8,69.66],[-50.72,69.73],[-50.46,69.77],[-50.35,69.8],[-50.34,69.83],[-50.5,69.94],[-50.46,69.97],[-50.34,69.99],[-50.29,70.01],[-50.32,70.03],[-50.44,70.04],[-50.61,70.01],[-50.8,70.0],[-50.97,70.04],[-51.11,70.06],[-51.19,70.05],[-51.42,69.99],[-51.5,69.99],[-51.6,70.0],[-52.25,70.06],[-52.34,70.08],[-52.57,70.17],[-52.77,70.23],[-53.02,70.3],[-53.36,70.35],[-53.77,70.39],[-54.01,70.42],[-54.14,70.47],[-54.34,70.57],[-54.5,70.66],[-54.53,70.7],[-54.44,70.75],[-54.34,70.79],[-54.17,70.82],[-53.86,70.81],[-53.69,70.8],[-53.51,70.77],[-53.38,70.76],[-53.09,70.77],[-52.8,70.75],[-52.63,70.73],[-52.41,70.69],[-51.78,70.5],[-51.52,70.44],[-51.41,70.43],[-50.95,70.36],[-50.87,70.36],[-50.68,70.4],[-50.66,70.42],[-50.73,70.44],[-50.93,70.45],[-51.17,70.53],[-51.32,70.59],[-51.34,70.69],[-51.32,70.74],[-51.28,70.77],[-51.26,70.85],[-51.4,70.9],[-51.49,70.92],[-51.75,70.99],[-51.77,71.01],[-51.65,71.02],[-51.53,71.01],[-51.27,70.98],[-51.13,70.97],[-51.03,70.99],[-51.02,71.0],[-51.18,71.04],[-51.38,71.12],[-51.79,71.13],[-52.06,71.12],[-52.23,71.15],[-52.42,71.19],[-52.53,71.2],[-52.78,71.17],[-52.9,71.17],[-53.01,71.18],[-53.12,71.31],[-53.09,71.35],[-53.0,71.37],[-52.94,71.41],[-52.89,71.46],[-52.75,71.5],[-51.97,71.6],[-51.77,71.67],[-51.78,71.68],[-51.91,71.67],[-52.08,71.64],[-52.2,71.63],[-52.66,71.67],[-52.73,71.66],[-52.91,71.6],[-53.17,71.54],[-53.28,71.54],[-53.44,71.58],[-53.46,71.61],[-53.48,71.64],[-53.3,71.69],[-53.25,71.71],[-53.14,71.78],[-53.14,71.81],[-53.33,71.79],[-53.36,71.82],[-53.36,71.87],[-53.37,71.94],[-53.42,72.0],[-53.58,72.1],[-53.64,72.12],[-53.69,72.16],[-53.81,72.29],[-53.78,72.33],[-53.67,72.35],[-53.65,72.36],[-53.9,72.34],[-53.93,72.32],[-53.88,72.28],[-53.85,72.24],[-53.83,72.18],[-53.79,72.13],[-53.7,72.08],[-53.63,72.05],[-53.51,71.98],[-53.46,71.89],[-53.48,71.85],[-53.57,71.81],[-53.72,71.76],[-53.76,71.72],[-53.78,71.68],[-53.89,71.64],[-53.96,71.66],[-54.02,71.66],[-53.95,71.59],[-53.91,71.53],[-53.96,71.46],[-54.1,71.42],[-54.17,71.42],[-54.32,71.38],[-54.69,71.37],[-54.82,71.38],[-55.06,71.41],[-55.34,71.43],[-55.45,71.47],[-55.59,71.55],[-55.67,71.63],[-55.67,71.69],[-55.63,71.74],[-55.55,71.77],[-55.45,71.96],[-55.32,72.11],[-54.97,72.27],[-54.87,72.33],[-54.84,72.36],[-54.84,72.38],[-54.9,72.39],[-55.32,72.2],[-55.58,72.18],[-55.66,72.22],[-55.64,72.3],[-55.59,72.32],[-55.38,72.31],[-55.3,72.35],[-55.43,72.42],[-55.57,72.44],[-55.6,72.45],[-55.46,72.5],[-55.12,72.5],[-55.05,72.53],[-54.92,72.57],[-54.79,72.64],[-54.74,72.7],[-54.73,72.75],[-54.76,72.79],[-54.76,72.83],[-54.74,72.87],[-54.77,72.92],[-54.87,72.97],[-55.07,73.02],[-55.13,72.96],[-55.2,72.94],[-55.29,72.93],[-55.37,72.96],[-55.46,72.96],[-55.55,72.98],[-55.63,72.99],[-55.67,73.01],[-55.69,73.05],[-55.69,73.11],[-55.59,73.14],[-55.45,73.16],[-55.36,73.2],[-55.3,73.26],[-55.29,73.33],[-55.33,73.4],[-55.45,73.46],[-55.66,73.4],[-55.74,73.38],[-55.76,73.43],[-55.79,73.46],[-55.88,73.5],[-55.99,73.54],[-56.1,73.56],[-56.11,73.59],[-56.08,73.63],[-56.03,73.67],[-55.97,73.76],[-55.9,73.75],[-55.84,73.76],[-55.87,73.83],[-55.93,73.9],[-56.0,73.93],[-56.0,73.95],[-56.01,73.96],[-56.07,74.01],[-56.12,74.04],[-56.23,74.13],[-56.3,74.16],[-56.39,74.18],[-56.49,74.18],[-56.66,74.16],[-56.95,74.13],[-57.19,74.12],[-57.23,74.13],[-57.11,74.16],[-56.94,74.2],[-56.71,74.22],[-56.64,74.28],[-56.66,74.33],[-56.65,74.38],[-56.72,74.43],[-56.66,74.46],[-56.45,74.49],[-56.35,74.49],[-56.26,74.53],[-56.52,74.61],[-56.8,74.67],[-56.87,74.69],[-56.93,74.73],[-56.99,74.79],[-57.07,74.84],[-57.19,74.89],[-57.36,74.95],[-57.81,75.04],[-57.97,75.11],[-58.11,75.2],[-58.18,75.25],[-58.25,75.28],[-58.57,75.35],[-58.6,75.39],[-58.28,75.47],[-58.25,75.51],[-58.38,75.61],[-58.52,75.69],[-58.66,75.72],[-58.88,75.73],[-59.08,75.76],[-59.26,75.82],[-59.45,75.86],[-59.72,75.9],[-60.17,75.99],[-60.87,76.1],[-61.19,76.16],[-61.37,76.18],[-61.62,76.19],[-62.1,76.24],[-62.5,76.26],[-62.74,76.25],[-62.82,76.26],[-63.01,76.32],[-63.29,76.35],[-63.44,76.34],[-63.62,76.28],[-63.84,76.22],[-63.96,76.21],[-64.14,76.26],[-64.22,76.3],[-64.31,76.32],[-64.39,76.3],[-64.54,76.25],[-64.69,76.22],[-64.91,76.17],[-65.09,76.15],[-65.31,76.15],[-65.37,76.13],[-65.46,76.13],[-65.57,76.14],[-65.68,76.17],[-65.79,76.22],[-65.88,76.24],[-65.95,76.24],[-66.13,76.22],[-66.36,76.15],[-66.47,76.14],[-66.55,76.15],[-66.66,76.17],[-66.87,76.22],[-66.99,76.21],[-67.08,76.19],[-67.05,76.15],[-66.85,76.05],[-66.67,75.98],[-66.83,75.97],[-68.15,76.07],[-68.32,76.09],[-68.56,76.15],[-68.76,76.19],[-69.11,76.28],[-69.37,76.33],[-69.46,76.37],[-69.48,76.4],[-69.4,76.44],[-68.86,76.56],[-68.66,76.59],[-68.25,76.62],[-68.15,76.64],[-68.11,76.65],[-68.22,76.68],[-68.77,76.67],[-69.25,76.69],[-69.67,76.74],[-69.75,76.75],[-69.82,76.78],[-69.89,76.83],[-69.87,76.88],[-69.77,76.93],[-69.71,76.97],[-69.69,76.99],[-70.22,76.85],[-70.44,76.81],[-70.61,76.82],[-70.73,76.84],[-70.79,76.87],[-70.79,76.9],[-70.77,76.92],[-70.73,76.93],[-71.02,76.98],[-71.14,77.03],[-71.15,77.07],[-71.06,77.12],[-70.96,77.15],[-70.86,77.18],[-70.6,77.19],[-69.66,77.23],[-68.98,77.2],[-68.75,77.31],[-68.59,77.34],[-68.14,77.38],[-67.43,77.38],[-66.94,77.36],[-66.71,77.34],[-66.39,77.28],[-66.37,77.3],[-66.45,77.35],[-66.45,77.39],[-66.33,77.47],[-66.27,77.52],[-66.31,77.56],[-66.45,77.62],[-66.69,77.68],[-66.82,77.69],[-66.97,77.67],[-67.15,77.63],[-67.51,77.54],[-67.69,77.52],[-67.98,77.52],[-68.14,77.53],[-68.29,77.54],[-68.53,77.59],[-68.62,77.6],[-68.73,77.58],[-68.85,77.53],[-68.97,77.49],[-69.09,77.47],[-69.2,77.46],[-69.35,77.47],[-69.98,77.55],[-70.12,77.58],[-70.13,77.64],[-70.32,77.69],[-70.54,77.7],[-70.56,77.72],[-70.29,77.8],[-70.08,77.83],[-70.11,77.84],[-70.41,77.84],[-70.61,77.8],[-70.73,77.79],[-70.99,77.79],[-71.27,77.81],[-71.39,77.83],[-71.51,77.88],[-71.65,77.9],[-72.06,77.94],[-72.16,77.96],[-72.25,77.99],[-72.59,78.09],[-72.79,78.15],[-72.82,78.19],[-72.58,78.28],[-72.57,78.3],[-72.67,78.34],[-72.71,78.36],[-72.68,78.4],[-72.47,78.48],[-72.4,78.5],[-72.02,78.55],[-71.65,78.62],[-71.52,78.64],[-71.39,78.64],[-70.91,78.64],[-70.75,78.66],[-70.63,78.69],[-70.41,78.72],[-69.97,78.78],[-68.99,78.86],[-68.93,78.87],[-68.92,78.88],[-69.01,78.92],[-69.03,78.94],[-68.83,78.98],[-68.38,79.04],[-68.07,79.07],[-67.87,79.07],[-67.71,79.08],[-67.48,79.12],[-67.35,79.12],[-66.58,79.14],[-66.24,79.12],[-66.08,79.12],[-65.97,79.13],[-65.83,79.17],[-65.56,79.28],[-65.42,79.34],[-65.29,79.44],[-65.12,79.59],[-64.99,79.74],[-64.9,79.88],[-64.84,79.97],[-64.79,80.0],[-64.63,80.04],[-64.47,80.07],[-64.18,80.1],[-64.21,80.11],[-64.33,80.13],[-64.44,80.14],[-64.54,80.14],[-64.74,80.1],[-64.98,80.08],[-65.22,80.09],[-65.39,80.08],[-65.55,80.05],[-65.81,80.02],[-65.98,80.03],[-66.29,80.07],[-66.45,80.08],[-66.84,80.08],[-66.96,80.09],[-67.06,80.12],[-67.14,80.17],[-67.2,80.22],[-67.19,80.28],[-67.05,80.38],[-67.0,80.41],[-66.61,80.53],[-66.37,80.58],[-66.14,80.62],[-65.96,80.65],[-65.8,80.66],[-65.65,80.69],[-65.36,80.77],[-65.06,80.84],[-64.69,80.97],[-64.52,81.0],[-63.89,81.06],[-63.72,81.06],[-63.58,81.04],[-63.44,81.01],[-63.06,80.89],[-63.03,80.89],[-63.1,80.94],[-63.24,81.08],[-63.21,81.14],[-62.99,81.21],[-62.9,81.22],[-62.67,81.21],[-62.3,81.19],[-62.05,81.17],[-61.86,81.14],[-61.64,81.12],[-61.52,81.12],[-61.44,81.13],[-61.32,81.19],[-61.16,81.28],[-61.1,81.4],[-61.13,81.53],[-61.18,81.63],[-61.24,81.69],[-61.2,81.75],[-61.02,81.81],[-60.84,81.86],[-60.43,81.92],[-60.1,81.94],[-59.9,81.93],[-59.64,81.9],[-59.28,81.88],[-58.96,81.83],[-58.43,81.69],[-58.08,81.62],[-57.79,81.59],[-57.5,81.54],[-57.08,81.43],[-56.86,81.38],[-56.73,81.37],[-56.62,81.36],[-56.66,81.39],[-56.86,81.46],[-57.17,81.53],[-57.85,81.66],[-58.23,81.75],[-58.57,81.86],[-58.82,81.92],[-59.27,81.98],[-59.26,82.01],[-58.72,82.09],[-57.72,82.17],[-56.59,82.23],[-56.21,82.22],[-55.55,82.25],[-55.49,82.28],[-55.34,82.3],[-54.73,82.35],[-54.55,82.35],[-54.28,82.33],[-53.99,82.28],[-53.85,82.24],[-53.67,82.16],[-53.58,82.06],[-53.6,81.74],[-53.59,81.68],[-53.56,81.65],[-53.43,81.69],[-53.28,81.75],[-53.15,81.8],[-53.04,81.87],[-52.97,81.97],[-52.93,82.04],[-53.1,82.12],[-53.11,82.25],[-53.02,82.32],[-52.78,82.32],[-51.75,82.08],[-51.35,82.03],[-50.89,81.9],[-50.36,81.91],[-49.87,81.89],[-49.65,81.9],[-49.54,81.92],[-49.69,81.97],[-50.39,82.12],[-50.71,82.24],[-50.94,82.38],[-50.99,82.46],[-50.82,82.47],[-50.04,82.47],[-48.86,82.41],[-47.36,82.17],[-46.62,82.1],[-45.29,81.83],[-44.89,81.79],[-44.73,81.78],[-44.61,81.81],[-44.53,81.85],[-44.53,81.9],[-44.59,81.96],[-44.63,82.03],[-44.64,82.1],[-44.55,82.26],[-44.33,82.31],[-44.24,82.37],[-44.33,82.47],[-44.58,82.54],[-45.55,82.73],[-45.56,82.75],[-45.36,82.77],[-45.07,82.78],[-42.65,82.74],[-42.23,82.73],[-42.05,82.71],[-41.98,82.69],[-41.88,82.68],[-41.36,82.7],[-41.37,82.75],[-41.43,82.78],[-44.24,82.86],[-44.76,82.88],[-45.03,82.89],[-45.3,82.87],[-45.87,82.85],[-46.14,82.86],[-46.48,82.95],[-46.17,83.06],[-45.91,83.06],[-45.41,83.02],[-45.12,83.08],[-44.66,83.13],[-44.2,83.15],[-43.19,83.26],[-43.01,83.26],[-42.78,83.26],[-42.26,83.23],[-42.05,83.21],[-41.82,83.15],[-41.68,83.13],[-41.52,83.13],[-41.3,83.1],[-40.98,83.18],[-40.69,83.28],[-40.36,83.33],[-39.89,83.3],[-39.59,83.26],[-39.32,83.2],[-38.93,83.18],[-38.28,83.0],[-38.16,83.0],[-38.1,83.01],[-38.04,83.05],[-38.01,83.09],[-37.93,83.16],[-37.99,83.19],[-38.54,83.26],[-38.64,83.29],[-38.75,83.33],[-38.75,83.37],[-38.65,83.4],[-38.54,83.41],[-38.19,83.4],[-38.07,83.41],[-37.96,83.44],[-37.83,83.49],[-37.72,83.5],[-37.49,83.5],[-37.12,83.47],[-36.8,83.47],[-36.69,83.48],[-36.67,83.51],[-36.64,83.53],[-36.61,83.54],[-35.45,83.54],[-35.17,83.55],[-34.94,83.57],[-34.67,83.57],[-34.43,83.56],[-34.13,83.53],[-33.84,83.53],[-33.4,83.58],[-32.98,83.6],[-30.7,83.59],[-29.95,83.56]]]},{"n":"Guatemala","r":[[[-89.16,17.81],[-89.17,17.57],[-89.18,17.29],[-89.19,17.08],[-89.2,16.81],[-89.21,16.53],[-89.23,16.14],[-89.24,15.89],[-89.23,15.89],[-89.11,15.9],[-88.94,15.89],[-88.89,15.89],[-88.84,15.87],[-88.8,15.86],[-88.71,15.81],[-88.6,15.76],[-88.54,15.85],[-88.57,15.9],[-88.6,15.93],[-88.59,15.95],[-88.23,15.73],[-88.27,15.69],[-88.36,15.62],[-88.53,15.48],[-88.68,15.36],[-88.83,15.25],[-88.96,15.15],[-88.98,15.14],[-89.14,15.07],[-89.17,15.04],[-89.21,14.9],[-89.22,14.87],[-89.19,14.79],[-89.16,14.67],[-89.17,14.61],[-89.29,14.53],[-89.34,14.46],[-89.36,14.42],[-89.38,14.43],[-89.42,14.43],[-89.5,14.41],[-89.54,14.41],[-89.57,14.39],[-89.58,14.35],[-89.56,14.28],[-89.55,14.24],[-89.57,14.22],[-89.67,14.18],[-89.71,14.14],[-89.75,14.08],[-89.79,14.05],[-89.84,14.06],[-89.87,14.05],[-89.94,14.0],[-90.05,13.9],[-90.1,13.83],[-90.11,13.78],[-90.1,13.74],[-90.48,13.9],[-90.61,13.93],[-91.15,13.93],[-91.38,13.99],[-91.64,14.11],[-91.82,14.23],[-92.24,14.55],[-92.21,14.57],[-92.19,14.63],[-92.16,14.69],[-92.18,14.76],[-92.19,14.82],[-92.16,14.9],[-92.16,14.96],[-92.14,15.0],[-92.1,15.03],[-92.07,15.07],[-92.2,15.24],[-92.2,15.28],[-92.19,15.32],[-92.08,15.5],[-91.96,15.7],[-91.82,15.93],[-91.74,16.07],[-91.43,16.07],[-91.23,16.07],[-90.98,16.07],[-90.7,16.07],[-90.52,16.07],[-90.45,16.07],[-90.46,16.16],[-90.45,16.26],[-90.42,16.35],[-90.42,16.39],[-90.47,16.44],[-90.58,16.47],[-90.63,16.51],[-90.63,16.57],[-90.66,16.63],[-90.71,16.71],[-90.82,16.79],[-90.98,16.87],[-91.11,16.98],[-91.22,17.11],[-91.32,17.2],[-91.39,17.24],[-91.41,17.26],[-91.2,17.25],[-90.99,17.25],[-90.99,17.45],[-90.99,17.62],[-90.99,17.82],[-90.62,17.82],[-90.18,17.82],[-89.73,17.82],[-89.37,17.81],[-89.16,17.81]]]},{"n":"Guam","r":[[[144.74,13.26],[144.7,13.26],[144.66,13.29],[144.65,13.31],[144.65,13.43],[144.79,13.53],[144.84,13.62],[144.88,13.61],[144.91,13.6],[144.94,13.57],[144.78,13.41],[144.74,13.26]]]},{"n":"Guyana","r":[[[-56.48,1.94],[-56.53,1.93],[-56.56,1.91],[-56.62,1.92],[-56.69,1.91],[-56.77,1.89],[-56.84,1.88],[-56.97,1.92],[-57.01,1.92],[-57.04,1.94],[-57.09,2.01],[-57.12,2.01],[-57.19,1.98],[-57.28,1.96],[-57.32,1.96],[-57.37,1.94],[-57.41,1.91],[-57.5,1.77],[-57.55,1.73],[-57.59,1.7],[-57.69,1.7],[-57.8,1.7],[-57.87,1.67],[-57.95,1.65],[-57.98,1.65],[-58.0,1.57],[-58.01,1.54],[-58.03,1.52],[-58.09,1.51],[-58.14,1.52],[-58.17,1.55],[-58.23,1.56],[-58.28,1.57],[-58.31,1.59],[-58.34,1.59],[-58.36,1.56],[-58.38,1.53],[-58.4,1.48],[-58.47,1.47],[-58.51,1.44],[-58.49,1.35],[-58.5,1.31],[-58.51,1.28],[-58.61,1.28],[-58.68,1.28],[-58.73,1.25],[-58.79,1.21],[-58.82,1.2],[-58.86,1.2],[-58.92,1.25],[-58.97,1.3],[-59.1,1.34],[-59.23,1.38],[-59.32,1.46],[-59.34,1.51],[-59.38,1.53],[-59.48,1.63],[-59.54,1.7],[-59.6,1.72],[-59.67,1.75],[-59.66,1.8],[-59.67,1.84],[-59.7,1.86],[-59.74,1.87],[-59.76,1.9],[-59.75,1.96],[-59.74,2.12],[-59.76,2.27],[-59.85,2.33],[-59.89,2.36],[-59.96,2.59],[-59.99,2.69],[-60.0,2.77],[-59.97,2.99],[-59.95,3.09],[-59.87,3.28],[-59.83,3.35],[-59.83,3.4],[-59.83,3.46],[-59.85,3.59],[-59.73,3.67],[-59.68,3.7],[-59.67,3.75],[-59.6,3.82],[-59.58,3.88],[-59.55,3.93],[-59.56,3.96],[-59.59,3.98],[-59.62,4.02],[-59.69,4.16],[-59.72,4.19],[-59.74,4.23],[-59.73,4.29],[-59.7,4.35],[-59.7,4.38],[-59.75,4.42],[-59.83,4.48],[-59.91,4.48],[-59.96,4.5],[-60.05,4.5],[-60.11,4.51],[-60.15,4.53],[-60.14,4.57],[-60.12,4.6],[-60.07,4.67],[-60.03,4.74],[-60.03,4.81],[-60.02,4.91],[-60.0,4.99],[-59.99,5.08],[-60.08,5.14],[-60.11,5.19],[-60.14,5.24],[-60.18,5.24],[-60.24,5.26],[-60.34,5.2],[-60.41,5.21],[-60.46,5.19],[-60.58,5.19],[-60.65,5.22],[-60.74,5.2],[-60.95,5.44],[-61.17,5.67],[-61.38,5.91],[-61.39,5.94],[-61.3,6.05],[-61.22,6.13],[-61.16,6.17],[-61.13,6.21],[-61.15,6.39],[-61.15,6.45],[-61.18,6.51],[-61.2,6.59],[-61.18,6.65],[-61.15,6.69],[-61.1,6.71],[-61.01,6.73],[-60.94,6.73],[-60.91,6.76],[-60.87,6.79],[-60.82,6.79],[-60.72,6.77],[-60.67,6.81],[-60.59,6.86],[-60.4,6.95],[-60.35,7.0],[-60.32,7.09],[-60.33,7.13],[-60.35,7.15],[-60.39,7.16],[-60.46,7.17],[-60.52,7.14],[-60.58,7.16],[-60.63,7.21],[-60.64,7.26],[-60.61,7.32],[-60.62,7.36],[-60.72,7.5],[-60.72,7.54],[-60.65,7.6],[-60.61,7.65],[-60.56,7.77],[-60.51,7.81],[-60.38,7.83],[-60.35,7.85],[-60.28,7.92],[-60.18,7.99],[-60.03,8.05],[-59.99,8.16],[-59.96,8.19],[-59.85,8.25],[-59.83,8.28],[-59.83,8.31],[-60.02,8.55],[-59.98,8.53],[-59.84,8.37],[-59.76,8.34],[-59.74,8.34],[-59.74,8.38],[-59.67,8.36],[-59.48,8.25],[-59.2,8.07],[-58.81,7.74],[-58.7,7.61],[-58.63,7.55],[-58.51,7.4],[-58.48,7.33],[-58.48,7.04],[-58.58,6.84],[-58.61,6.7],[-58.61,6.5],[-58.67,6.39],[-58.59,6.45],[-58.57,6.63],[-58.5,6.73],[-58.41,6.85],[-58.3,6.88],[-58.17,6.83],[-58.07,6.82],[-57.98,6.79],[-57.79,6.6],[-57.61,6.45],[-57.54,6.33],[-57.34,6.27],[-57.23,6.18],[-57.19,6.1],[-57.17,5.89],[-57.21,5.56],[-57.19,5.55],[-57.25,5.49],[-57.26,5.45],[-57.29,5.37],[-57.32,5.34],[-57.28,5.25],[-57.24,5.24],[-57.22,5.23],[-57.21,5.21],[-57.21,5.2],[-57.23,5.18],[-57.27,5.16],[-57.31,5.11],[-57.31,5.05],[-57.33,5.02],[-57.41,5.0],[-57.57,5.0],[-57.65,5.0],[-57.71,4.99],[-57.75,4.95],[-57.8,4.93],[-57.84,4.92],[-57.88,4.88],[-57.92,4.82],[-57.9,4.78],[-57.87,4.72],[-57.85,4.67],[-57.87,4.58],[-57.91,4.51],[-57.92,4.45],[-57.95,4.35],[-58.01,4.24],[-58.05,4.17],[-58.05,4.1],[-58.03,4.0],[-57.91,3.86],[-57.87,3.79],[-57.83,3.68],[-57.72,3.59],[-57.65,3.52],[-57.66,3.42],[-57.65,3.39],[-57.6,3.37],[-57.55,3.35],[-57.49,3.35],[-57.44,3.36],[-57.43,3.38],[-57.3,3.38],[-57.29,3.35],[-57.28,3.22],[-57.28,3.16],[-57.25,3.14],[-57.23,3.11],[-57.23,3.08],[-57.22,3.0],[-57.21,2.96],[-57.21,2.88],[-57.2,2.85],[-57.16,2.83],[-57.12,2.78],[-57.11,2.77],[-57.1,2.75],[-57.06,2.67],[-57.04,2.64],[-57.03,2.64],[-57.02,2.61],[-57.0,2.53],[-56.98,2.51],[-56.95,2.46],[-56.93,2.4],[-56.89,2.33],[-56.84,2.28],[-56.82,2.23],[-56.76,2.11],[-56.7,2.04],[-56.63,2.02],[-56.56,2.01],[-56.52,1.97],[-56.48,1.94]]]},{"n":"Hong Kong S.A.R.","r":[[[114.02,22.51],[114.02,22.51],[114.05,22.54],[114.1,22.55],[114.12,22.56],[114.19,22.56],[114.23,22.55],[114.27,22.54],[114.27,22.54],[114.29,22.5],[114.28,22.46],[114.33,22.44],[114.34,22.4],[114.29,22.37],[114.29,22.33],[114.27,22.3],[114.14,22.35],[114.03,22.38],[113.94,22.36],[113.9,22.4],[113.9,22.43],[114.01,22.48],[114.02,22.51]],[[114.23,22.21],[114.21,22.2],[114.14,22.27],[114.13,22.29],[114.19,22.3],[114.25,22.26],[114.24,22.23],[114.23,22.21]],[[114.0,22.21],[113.88,22.21],[113.85,22.22],[113.84,22.24],[113.88,22.28],[114.04,22.33],[114.0,22.28],[114.0,22.21]]]},{"n":"Heard Island and McDonald Islands","r":[[[73.71,-53.14],[73.59,-53.18],[73.47,-53.18],[73.41,-53.15],[73.34,-53.03],[73.29,-53.02],[73.25,-52.99],[73.25,-52.98],[73.31,-52.97],[73.39,-53.0],[73.59,-53.03],[73.73,-53.09],[73.84,-53.11],[73.8,-53.13],[73.71,-53.14]]]},{"n":"Honduras","r":[[[-89.36,14.42],[-89.34,14.46],[-89.29,14.53],[-89.17,14.61],[-89.16,14.67],[-89.19,14.79],[-89.22,14.87],[-89.21,14.9],[-89.17,15.04],[-89.14,15.07],[-88.98,15.14],[-88.96,15.15],[-88.83,15.25],[-88.68,15.36],[-88.53,15.48],[-88.36,15.62],[-88.27,15.69],[-88.23,15.73],[-88.13,15.7],[-88.05,15.76],[-88.01,15.79],[-87.91,15.86],[-87.87,15.88],[-87.7,15.91],[-87.62,15.91],[-87.54,15.83],[-87.49,15.79],[-87.38,15.83],[-87.29,15.83],[-86.91,15.76],[-86.76,15.79],[-86.48,15.8],[-86.36,15.78],[-86.18,15.89],[-86.07,15.91],[-85.94,15.95],[-85.95,16.0],[-85.99,16.02],[-85.78,16.0],[-85.48,15.9],[-85.16,15.92],[-85.05,15.97],[-84.97,15.99],[-84.65,15.88],[-84.56,15.8],[-84.49,15.79],[-84.44,15.81],[-84.43,15.83],[-84.49,15.85],[-84.52,15.87],[-84.26,15.82],[-83.78,15.44],[-83.77,15.41],[-83.97,15.52],[-84.08,15.51],[-84.11,15.49],[-84.11,15.43],[-84.1,15.4],[-84.05,15.4],[-84.01,15.41],[-83.93,15.39],[-83.87,15.35],[-83.8,15.29],[-83.76,15.22],[-83.72,15.22],[-83.67,15.26],[-83.59,15.27],[-83.54,15.22],[-83.5,15.22],[-83.55,15.29],[-83.68,15.37],[-83.65,15.37],[-83.37,15.24],[-83.29,15.08],[-83.23,15.04],[-83.16,14.99],[-83.42,15.01],[-83.54,14.98],[-83.59,14.91],[-83.64,14.88],[-83.67,14.88],[-83.75,14.86],[-83.87,14.79],[-83.97,14.77],[-84.07,14.79],[-84.09,14.77],[-84.1,14.75],[-84.11,14.73],[-84.15,14.72],[-84.19,14.73],[-84.24,14.75],[-84.26,14.74],[-84.27,14.7],[-84.29,14.69],[-84.34,14.71],[-84.39,14.69],[-84.45,14.64],[-84.54,14.63],[-84.65,14.66],[-84.73,14.71],[-84.79,14.79],[-84.86,14.81],[-84.99,14.75],[-85.04,14.69],[-85.05,14.64],[-85.04,14.61],[-85.06,14.58],[-85.12,14.57],[-85.16,14.53],[-85.19,14.45],[-85.2,14.39],[-85.18,14.34],[-85.21,14.31],[-85.28,14.29],[-85.37,14.22],[-85.48,14.11],[-85.58,14.03],[-85.68,13.98],[-85.73,13.93],[-85.73,13.88],[-85.73,13.86],[-85.75,13.85],[-85.79,13.84],[-85.98,13.97],[-86.04,14.05],[-86.09,14.04],[-86.15,13.99],[-86.24,13.9],[-86.33,13.77],[-86.38,13.76],[-86.61,13.77],[-86.73,13.76],[-86.76,13.75],[-86.77,13.7],[-86.76,13.64],[-86.73,13.41],[-86.71,13.31],[-86.73,13.28],[-86.79,13.28],[-86.87,13.27],[-86.92,13.22],[-86.93,13.18],[-86.93,13.12],[-86.96,13.05],[-87.01,13.01],[-87.06,12.99],[-87.34,12.98],[-87.33,13.08],[-87.41,13.13],[-87.46,13.22],[-87.5,13.27],[-87.49,13.31],[-87.49,13.35],[-87.6,13.39],[-87.71,13.36],[-87.77,13.38],[-87.81,13.4],[-87.74,13.45],[-87.73,13.48],[-87.76,13.51],[-87.78,13.52],[-87.77,13.58],[-87.76,13.65],[-87.72,13.81],[-87.73,13.84],[-87.8,13.89],[-87.89,13.89],[-87.99,13.88],[-88.04,13.9],[-88.08,13.96],[-88.15,13.99],[-88.28,13.94],[-88.41,13.88],[-88.45,13.85],[-88.48,13.85],[-88.5,13.9],[-88.5,13.96],[-88.51,13.98],[-88.58,14.0],[-88.67,14.02],[-88.71,14.03],[-88.75,14.07],[-88.85,14.12],[-88.87,14.16],[-89.0,14.25],[-89.03,14.3],[-89.06,14.33],[-89.12,14.37],[-89.17,14.36],[-89.34,14.41],[-89.36,14.42]],[[-86.42,16.38],[-86.58,16.3],[-86.63,16.3],[-86.56,16.36],[-86.44,16.41],[-86.34,16.44],[-86.26,16.43],[-86.42,16.38]],[[-85.87,16.46],[-85.95,16.4],[-85.96,16.43],[-85.92,16.48],[-85.88,16.51],[-85.83,16.51],[-85.84,16.49],[-85.87,16.46]]]},{"n":"Croatia","r":[[[17.67,42.9],[17.74,42.92],[17.8,42.9],[17.84,42.85],[17.92,42.81],[18.04,42.74],[18.12,42.69],[18.3,42.6],[18.35,42.59],[18.44,42.56],[18.44,42.52],[18.48,42.48],[18.52,42.43],[18.33,42.53],[18.16,42.63],[17.82,42.8],[17.58,42.84],[17.26,42.97],[17.05,43.01],[17.13,43.03],[17.22,43.03],[17.72,42.85],[17.67,42.9]],[[19.01,44.87],[18.94,44.87],[18.84,44.88],[18.79,44.91],[18.78,44.95],[18.78,44.98],[18.75,45.03],[18.66,45.08],[18.49,45.09],[18.42,45.1],[18.36,45.12],[18.28,45.13],[18.22,45.13],[18.14,45.12],[18.0,45.14],[17.95,45.11],[17.87,45.08],[17.81,45.08],[17.69,45.16],[17.65,45.16],[17.55,45.12],[17.5,45.12],[17.47,45.13],[17.32,45.16],[17.26,45.17],[17.21,45.16],[17.13,45.17],[16.92,45.28],[16.79,45.2],[16.53,45.22],[16.45,45.16],[16.37,45.06],[16.29,45.01],[16.23,45.03],[16.16,45.07],[16.03,45.19],[15.96,45.21],[15.89,45.22],[15.82,45.2],[15.79,45.18],[15.76,45.01],[15.74,44.86],[15.74,44.77],[15.88,44.68],[16.05,44.54],[16.1,44.52],[16.13,44.47],[16.17,44.35],[16.21,44.22],[16.3,44.12],[16.38,44.06],[16.47,44.0],[16.59,43.91],[16.69,43.82],[16.71,43.78],[16.9,43.65],[17.08,43.52],[17.25,43.47],[17.27,43.45],[17.28,43.34],[17.29,43.31],[17.4,43.2],[17.62,43.04],[17.65,43.01],[17.66,42.98],[17.64,42.96],[17.59,42.94],[17.54,42.96],[17.33,43.11],[17.13,43.21],[16.9,43.39],[16.6,43.46],[16.39,43.54],[16.27,43.53],[16.13,43.51],[16.05,43.51],[15.99,43.52],[15.94,43.57],[15.95,43.61],[15.94,43.66],[15.82,43.74],[15.66,43.81],[15.5,43.91],[15.19,44.17],[15.12,44.26],[15.18,44.27],[15.23,44.27],[15.28,44.29],[15.37,44.29],[15.47,44.27],[15.38,44.33],[15.27,44.38],[14.98,44.6],[14.9,44.71],[14.89,44.82],[14.91,44.97],[14.85,45.08],[14.63,45.22],[14.55,45.3],[14.39,45.34],[14.31,45.34],[14.27,45.28],[14.24,45.16],[14.09,45.0],[14.04,44.93],[13.97,44.84],[13.9,44.83],[13.86,44.84],[13.74,44.99],[13.63,45.11],[13.61,45.16],[13.6,45.23],[13.52,45.48],[13.58,45.52],[13.62,45.48],[13.88,45.43],[13.94,45.45],[13.97,45.48],[13.97,45.5],[13.99,45.51],[14.09,45.48],[14.16,45.49],[14.28,45.49],[14.37,45.48],[14.43,45.51],[14.51,45.6],[14.53,45.65],[14.57,45.66],[14.59,45.65],[14.61,45.61],[14.65,45.57],[14.73,45.51],[14.79,45.48],[14.85,45.47],[14.9,45.49],[14.95,45.5],[15.11,45.45],[15.24,45.44],[15.34,45.47],[15.33,45.5],[15.29,45.54],[15.28,45.58],[15.29,45.61],[15.36,45.65],[15.35,45.66],[15.27,45.72],[15.28,45.73],[15.45,45.8],[15.62,45.83],[15.65,45.86],[15.67,45.9],[15.68,45.98],[15.67,46.05],[15.6,46.11],[15.59,46.14],[15.61,46.17],[15.64,46.2],[15.7,46.21],[15.78,46.23],[15.85,46.26],[15.93,46.28],[16.0,46.31],[16.07,46.37],[16.11,46.38],[16.23,46.37],[16.25,46.39],[16.24,46.48],[16.26,46.51],[16.3,46.52],[16.32,46.53],[16.43,46.52],[16.52,46.5],[16.57,46.49],[16.75,46.42],[16.87,46.34],[16.94,46.25],[17.03,46.19],[17.15,46.14],[17.24,46.08],[17.31,46.0],[17.41,45.95],[17.53,45.94],[17.61,45.91],[17.64,45.87],[17.71,45.83],[17.81,45.79],[17.96,45.77],[18.26,45.77],[18.29,45.76],[18.36,45.75],[18.44,45.77],[18.53,45.8],[18.56,45.81],[18.67,45.91],[18.72,45.9],[18.83,45.91],[18.9,45.93],[18.91,45.93],[18.9,45.91],[18.89,45.87],[18.84,45.84],[18.89,45.77],[18.95,45.66],[18.92,45.6],[18.95,45.56],[19.06,45.53],[19.06,45.51],[19.03,45.5],[19.01,45.47],[19.0,45.4],[19.09,45.34],[19.27,45.28],[19.33,45.27],[19.35,45.25],[19.38,45.23],[19.4,45.21],[19.4,45.19],[19.39,45.17],[19.3,45.17],[19.21,45.17],[19.14,45.2],[19.13,45.18],[19.13,45.15],[19.06,45.14],[19.1,44.97],[19.09,44.93],[19.06,44.91],[19.04,44.92],[19.01,44.92],[19.0,44.9],[19.01,44.87]],[[17.61,42.77],[17.74,42.7],[17.34,42.79],[17.39,42.8],[17.43,42.8],[17.61,42.77]],[[16.65,43.0],[16.84,42.97],[16.97,42.98],[17.09,42.96],[17.17,42.93],[17.19,42.92],[17.09,42.91],[16.98,42.93],[16.85,42.9],[16.74,42.91],[16.7,42.93],[16.67,42.96],[16.65,43.0]],[[17.19,43.13],[17.12,43.12],[16.68,43.12],[16.55,43.14],[16.41,43.2],[16.38,43.21],[16.52,43.23],[16.66,43.21],[16.7,43.17],[17.06,43.14],[17.19,43.13]],[[16.79,43.27],[16.63,43.27],[16.49,43.29],[16.42,43.32],[16.43,43.34],[16.45,43.39],[16.6,43.38],[16.83,43.35],[16.89,43.31],[16.87,43.3],[16.79,43.27]],[[15.37,43.97],[15.44,43.9],[15.37,43.91],[15.31,43.96],[15.27,44.01],[15.37,43.97]],[[15.23,44.06],[15.25,44.03],[15.12,44.09],[15.07,44.14],[15.07,44.16],[15.23,44.06]],[[15.19,43.92],[15.2,43.91],[15.2,43.9],[15.15,43.91],[15.14,43.91],[14.89,44.13],[14.87,44.17],[14.95,44.12],[15.19,43.92]],[[15.19,44.34],[15.16,44.31],[15.1,44.36],[15.04,44.39],[15.0,44.43],[14.91,44.49],[14.88,44.54],[14.76,44.66],[14.74,44.7],[14.8,44.65],[14.86,44.62],[14.9,44.61],[15.01,44.53],[15.11,44.44],[15.24,44.35],[15.21,44.35],[15.19,44.34]],[[14.83,44.76],[14.86,44.71],[14.76,44.75],[14.68,44.77],[14.66,44.8],[14.67,44.82],[14.69,44.85],[14.75,44.84],[14.76,44.82],[14.83,44.76]],[[14.49,44.66],[14.48,44.62],[14.42,44.67],[14.39,44.76],[14.31,44.9],[14.3,44.94],[14.34,44.98],[14.34,45.02],[14.29,45.14],[14.33,45.16],[14.36,45.17],[14.37,45.08],[14.39,45.03],[14.47,44.97],[14.45,44.87],[14.47,44.73],[14.48,44.69],[14.49,44.66]],[[14.81,44.98],[14.69,44.96],[14.63,44.99],[14.61,45.03],[14.51,45.04],[14.45,45.08],[14.44,45.1],[14.52,45.15],[14.57,45.22],[14.63,45.18],[14.7,45.09],[14.74,45.07],[14.81,44.98]]]},{"n":"Haiti","r":[[[-71.78,19.72],[-71.76,19.69],[-71.71,19.49],[-71.71,19.42],[-71.75,19.32],[-71.75,19.29],[-71.65,19.2],[-71.65,19.16],[-71.66,19.13],[-71.74,19.05],[-71.81,18.99],[-71.79,18.92],[-71.73,18.86],[-71.73,18.8],[-71.74,18.73],[-71.82,18.65],[-71.87,18.61],[-71.99,18.61],[-72.0,18.6],[-71.94,18.51],[-71.87,18.42],[-71.76,18.34],[-71.74,18.27],[-71.76,18.2],[-71.77,18.04],[-71.85,18.12],[-71.95,18.19],[-72.0,18.21],[-72.06,18.23],[-72.5,18.22],[-72.55,18.21],[-72.59,18.19],[-72.63,18.18],[-72.76,18.16],[-72.88,18.15],[-73.16,18.21],[-73.27,18.23],[-73.39,18.25],[-73.51,18.25],[-73.64,18.23],[-73.75,18.19],[-73.82,18.12],[-73.84,18.06],[-73.88,18.04],[-73.99,18.14],[-74.09,18.22],[-74.19,18.27],[-74.42,18.35],[-74.46,18.39],[-74.48,18.45],[-74.39,18.62],[-74.28,18.66],[-74.23,18.66],[-74.1,18.64],[-73.98,18.6],[-73.86,18.58],[-73.69,18.57],[-73.59,18.52],[-72.92,18.46],[-72.79,18.43],[-72.74,18.44],[-72.7,18.47],[-72.66,18.52],[-72.62,18.55],[-72.42,18.56],[-72.38,18.57],[-72.35,18.62],[-72.35,18.67],[-72.47,18.74],[-72.65,18.89],[-72.81,19.07],[-72.74,19.13],[-72.77,19.24],[-72.74,19.34],[-72.7,19.44],[-72.86,19.53],[-73.05,19.61],[-73.32,19.64],[-73.4,19.66],[-73.44,19.72],[-73.4,19.81],[-73.32,19.85],[-73.22,19.88],[-73.12,19.9],[-72.88,19.93],[-72.64,19.9],[-72.43,19.81],[-72.22,19.74],[-71.95,19.72],[-71.83,19.7],[-71.78,19.72]],[[-72.8,18.78],[-72.82,18.71],[-73.08,18.79],[-73.29,18.9],[-73.28,18.95],[-73.17,18.97],[-73.07,18.93],[-72.92,18.86],[-72.8,18.78]],[[-72.66,20.04],[-72.62,20.01],[-72.64,19.99],[-72.74,20.0],[-72.84,20.04],[-72.88,20.03],[-72.9,20.03],[-72.96,20.06],[-72.91,20.09],[-72.85,20.09],[-72.79,20.09],[-72.66,20.04]]]},{"n":"Hungary","r":[[[16.09,46.86],[16.25,46.97],[16.33,47.0],[16.42,47.0],[16.45,47.01],[16.46,47.02],[16.48,47.06],[16.48,47.09],[16.49,47.12],[16.48,47.14],[16.44,47.15],[16.42,47.22],[16.44,47.25],[16.46,47.27],[16.43,47.37],[16.44,47.4],[16.51,47.4],[16.57,47.42],[16.62,47.45],[16.64,47.48],[16.68,47.54],[16.64,47.61],[16.43,47.66],[16.42,47.67],[16.47,47.7],[16.52,47.72],[16.55,47.75],[16.59,47.75],[16.65,47.74],[16.75,47.69],[16.79,47.68],[16.82,47.69],[16.86,47.7],[16.97,47.7],[17.07,47.71],[17.05,47.76],[17.05,47.8],[17.03,47.84],[17.04,47.87],[17.08,47.9],[17.09,47.96],[17.15,48.01],[17.17,48.01],[17.28,48.0],[17.3,47.99],[17.32,47.99],[17.48,47.89],[17.64,47.81],[17.76,47.77],[17.95,47.77],[18.15,47.76],[18.48,47.78],[18.72,47.79],[18.74,47.81],[18.78,47.85],[18.75,47.89],[18.75,47.94],[18.79,48.0],[18.91,48.05],[19.27,48.07],[19.47,48.11],[19.5,48.16],[19.56,48.21],[19.63,48.22],[19.71,48.2],[19.81,48.16],[19.9,48.13],[19.95,48.15],[20.13,48.22],[20.33,48.3],[20.48,48.5],[20.49,48.53],[20.64,48.55],[20.87,48.55],[20.98,48.52],[21.07,48.51],[21.2,48.51],[21.38,48.55],[21.45,48.55],[21.5,48.52],[21.56,48.5],[21.6,48.46],[21.63,48.42],[21.65,48.4],[21.67,48.38],[21.72,48.35],[21.77,48.34],[22.11,48.39],[22.13,48.41],[22.23,48.41],[22.23,48.41],[22.25,48.41],[22.27,48.36],[22.27,48.36],[22.3,48.33],[22.32,48.29],[22.35,48.26],[22.42,48.24],[22.52,48.21],[22.58,48.13],[22.68,48.1],[22.68,48.1],[22.7,48.11],[22.77,48.11],[22.78,48.1],[22.84,48.06],[22.86,48.03],[22.85,48.0],[22.86,47.96],[22.88,47.95],[22.85,47.92],[22.68,47.8],[22.61,47.77],[22.56,47.76],[22.49,47.77],[22.42,47.76],[22.35,47.74],[22.29,47.73],[22.24,47.7],[22.19,47.63],[22.11,47.57],[22.04,47.54],[22.0,47.51],[22.0,47.4],[21.95,47.36],[21.9,47.33],[21.87,47.3],[21.79,47.14],[21.72,47.08],[21.66,47.04],[21.65,47.01],[21.65,46.96],[21.58,46.88],[21.49,46.79],[21.48,46.75],[21.5,46.7],[21.41,46.65],[21.36,46.62],[21.32,46.61],[21.29,46.57],[21.25,46.49],[21.26,46.45],[21.26,46.41],[21.19,46.39],[21.17,46.35],[21.15,46.3],[21.12,46.28],[21.04,46.24],[20.84,46.26],[20.76,46.25],[20.74,46.22],[20.73,46.19],[20.71,46.17],[20.66,46.15],[20.61,46.13],[20.51,46.17],[20.28,46.13],[20.24,46.11],[20.21,46.13],[20.16,46.14],[19.93,46.16],[19.84,46.15],[19.72,46.15],[19.61,46.17],[19.53,46.16],[19.46,46.09],[19.42,46.06],[19.39,46.05],[19.33,46.03],[19.28,46.0],[19.21,45.98],[19.15,45.99],[19.09,46.02],[19.07,46.01],[19.05,45.98],[19.02,45.96],[18.93,45.93],[18.91,45.93],[18.9,45.93],[18.83,45.91],[18.72,45.9],[18.67,45.91],[18.56,45.81],[18.53,45.8],[18.44,45.77],[18.36,45.75],[18.29,45.76],[18.26,45.77],[17.96,45.77],[17.81,45.79],[17.71,45.83],[17.64,45.87],[17.61,45.91],[17.53,45.94],[17.41,45.95],[17.31,46.0],[17.24,46.08],[17.15,46.14],[17.03,46.19],[16.94,46.25],[16.87,46.34],[16.75,46.42],[16.57,46.49],[16.52,46.5],[16.51,46.52],[16.42,46.61],[16.38,46.64],[16.38,46.68],[16.37,46.7],[16.34,46.72],[16.32,46.78],[16.31,46.83],[16.28,46.86],[16.09,46.86]]]},{"n":"Indonesia","r":[[[122.95,-10.91],[122.86,-10.91],[122.83,-10.9],[122.82,-10.81],[122.85,-10.76],[123.06,-10.7],[123.15,-10.64],[123.27,-10.52],[123.34,-10.49],[123.36,-10.47],[123.37,-10.47],[123.38,-10.57],[123.41,-10.62],[123.42,-10.65],[123.31,-10.7],[123.21,-10.81],[123.01,-10.88],[122.95,-10.91]],[[121.88,-10.59],[121.83,-10.6],[121.73,-10.57],[121.7,-10.56],[121.8,-10.51],[121.87,-10.44],[121.95,-10.43],[122.0,-10.45],[121.98,-10.53],[121.88,-10.59]],[[123.42,-10.3],[123.33,-10.34],[123.33,-10.26],[123.4,-10.17],[123.46,-10.14],[123.49,-10.18],[123.5,-10.19],[123.41,-10.23],[123.42,-10.3]],[[120.01,-9.37],[120.06,-9.42],[120.22,-9.51],[120.25,-9.54],[120.26,-9.6],[120.29,-9.65],[120.36,-9.65],[120.44,-9.65],[120.5,-9.67],[120.56,-9.72],[120.63,-9.81],[120.7,-9.9],[120.78,-9.96],[120.83,-10.04],[120.8,-10.11],[120.7,-10.21],[120.64,-10.23],[120.56,-10.24],[120.44,-10.29],[120.39,-10.26],[120.26,-10.24],[120.14,-10.2],[120.05,-10.12],[120.0,-10.04],[119.93,-9.97],[119.81,-9.92],[119.6,-9.77],[119.47,-9.76],[119.42,-9.77],[119.36,-9.77],[119.09,-9.71],[119.04,-9.67],[119.01,-9.62],[118.98,-9.57],[118.96,-9.52],[118.99,-9.47],[119.03,-9.44],[119.19,-9.38],[119.3,-9.37],[119.42,-9.37],[119.61,-9.35],[119.8,-9.38],[119.85,-9.36],[119.94,-9.3],[119.97,-9.32],[120.01,-9.37]],[[125.07,-9.51],[125.0,-9.57],[124.96,-9.67],[124.84,-9.76],[124.71,-9.91],[124.6,-9.99],[124.51,-10.09],[124.43,-10.15],[124.33,-10.17],[124.18,-10.18],[123.97,-10.29],[123.86,-10.34],[123.75,-10.35],[123.64,-10.31],[123.6,-10.27],[123.61,-10.22],[123.65,-10.17],[123.69,-10.13],[123.72,-10.08],[123.6,-10.02],[123.59,-9.97],[123.64,-9.84],[123.67,-9.71],[123.71,-9.61],[123.88,-9.45],[123.98,-9.37],[124.04,-9.34],[124.05,-9.38],[124.09,-9.42],[124.12,-9.42],[124.13,-9.41],[124.28,-9.43],[124.32,-9.41],[124.38,-9.35],[124.41,-9.31],[124.44,-9.24],[124.44,-9.19],[124.58,-9.16],[124.65,-9.12],[124.71,-9.06],[124.89,-8.97],[124.92,-8.94],[124.92,-9.03],[124.94,-9.05],[124.97,-9.06],[125.1,-9.0],[125.12,-9.02],[125.15,-9.04],[125.15,-9.12],[125.1,-9.19],[124.98,-9.19],[124.96,-9.21],[124.96,-9.25],[124.97,-9.29],[125.0,-9.33],[125.03,-9.38],[125.07,-9.51]],[[115.61,-8.77],[115.58,-8.8],[115.5,-8.74],[115.48,-8.72],[115.54,-8.68],[115.56,-8.67],[115.61,-8.71],[115.61,-8.77]],[[122.98,-8.55],[122.95,-8.6],[122.89,-8.59],[122.9,-8.53],[122.93,-8.5],[123.01,-8.45],[123.09,-8.44],[123.14,-8.46],[123.15,-8.48],[123.03,-8.49],[122.98,-8.55]],[[119.46,-8.74],[119.42,-8.75],[119.39,-8.74],[119.4,-8.65],[119.38,-8.59],[119.42,-8.54],[119.43,-8.45],[119.45,-8.43],[119.47,-8.46],[119.48,-8.47],[119.5,-8.48],[119.55,-8.48],[119.56,-8.52],[119.56,-8.55],[119.54,-8.59],[119.48,-8.63],[119.44,-8.67],[119.46,-8.74]],[[123.32,-8.35],[123.3,-8.4],[123.03,-8.4],[123.03,-8.34],[123.11,-8.27],[123.13,-8.25],[123.22,-8.24],[123.34,-8.27],[123.32,-8.35]],[[116.64,-8.61],[116.51,-8.82],[116.56,-8.85],[116.59,-8.89],[116.38,-8.93],[116.29,-8.91],[116.24,-8.91],[116.03,-8.87],[115.87,-8.83],[115.86,-8.79],[115.87,-8.74],[115.91,-8.76],[116.03,-8.77],[116.08,-8.74],[116.08,-8.61],[116.06,-8.44],[116.22,-8.3],[116.3,-8.24],[116.4,-8.2],[116.65,-8.28],[116.69,-8.3],[116.72,-8.34],[116.73,-8.39],[116.64,-8.61]],[[124.29,-8.33],[124.23,-8.39],[124.18,-8.5],[124.15,-8.53],[124.07,-8.55],[124.02,-8.44],[123.93,-8.45],[123.97,-8.35],[124.01,-8.32],[124.07,-8.32],[124.1,-8.36],[124.11,-8.36],[124.24,-8.2],[124.27,-8.2],[124.29,-8.21],[124.3,-8.23],[124.29,-8.33]],[[123.92,-8.27],[123.78,-8.3],[123.7,-8.42],[123.63,-8.42],[123.59,-8.48],[123.58,-8.5],[123.59,-8.52],[123.58,-8.54],[123.55,-8.57],[123.49,-8.53],[123.43,-8.58],[123.41,-8.59],[123.33,-8.54],[123.25,-8.54],[123.23,-8.53],[123.32,-8.44],[123.45,-8.35],[123.48,-8.32],[123.43,-8.31],[123.39,-8.3],[123.39,-8.28],[123.47,-8.27],[123.53,-8.27],[123.57,-8.29],[123.6,-8.29],[123.78,-8.19],[123.85,-8.21],[123.9,-8.24],[123.92,-8.27]],[[138.9,-8.39],[138.85,-8.4],[138.59,-8.37],[138.57,-8.33],[138.56,-8.31],[138.62,-8.27],[138.68,-8.2],[138.76,-8.17],[138.8,-8.17],[138.9,-8.34],[138.9,-8.39]],[[117.56,-8.37],[117.53,-8.37],[117.49,-8.35],[117.51,-8.31],[117.48,-8.24],[117.49,-8.18],[117.55,-8.15],[117.67,-8.15],[117.67,-8.19],[117.56,-8.37]],[[119.07,-8.24],[119.03,-8.24],[119.02,-8.2],[119.04,-8.16],[119.08,-8.14],[119.1,-8.14],[119.13,-8.18],[119.13,-8.2],[119.11,-8.22],[119.07,-8.24]],[[124.58,-8.14],[124.6,-8.2],[124.68,-8.17],[124.75,-8.16],[124.92,-8.17],[125.05,-8.18],[125.12,-8.2],[125.13,-8.33],[125.1,-8.35],[124.44,-8.44],[124.38,-8.42],[124.36,-8.39],[124.43,-8.3],[124.39,-8.25],[124.43,-8.18],[124.51,-8.14],[124.58,-8.14]],[[127.82,-8.1],[128.0,-8.14],[128.1,-8.13],[128.12,-8.17],[128.02,-8.26],[127.82,-8.19],[127.79,-8.12],[127.82,-8.1]],[[122.78,-8.61],[122.64,-8.65],[122.55,-8.68],[122.47,-8.73],[122.42,-8.73],[122.32,-8.74],[122.19,-8.73],[122.09,-8.74],[121.84,-8.86],[121.74,-8.87],[121.65,-8.9],[121.62,-8.85],[121.58,-8.82],[121.5,-8.81],[121.41,-8.81],[121.33,-8.92],[121.19,-8.9],[121.14,-8.9],[121.09,-8.93],[121.04,-8.94],[120.98,-8.93],[120.78,-8.85],[120.55,-8.8],[120.32,-8.82],[120.12,-8.78],[120.01,-8.81],[119.91,-8.86],[119.88,-8.81],[119.84,-8.76],[119.81,-8.7],[119.81,-8.62],[119.82,-8.57],[119.85,-8.52],[119.87,-8.47],[119.87,-8.42],[119.92,-8.45],[119.96,-8.44],[120.1,-8.38],[120.23,-8.29],[120.35,-8.26],[120.42,-8.25],[120.49,-8.27],[120.55,-8.26],[120.61,-8.24],[120.71,-8.31],[120.75,-8.32],[120.89,-8.33],[121.01,-8.37],[121.12,-8.42],[121.28,-8.48],[121.37,-8.55],[121.44,-8.58],[121.5,-8.59],[121.55,-8.58],[121.61,-8.53],[121.68,-8.51],[121.75,-8.51],[121.86,-8.49],[121.91,-8.48],[121.97,-8.46],[122.02,-8.47],[122.07,-8.5],[122.26,-8.62],[122.32,-8.63],[122.43,-8.6],[122.47,-8.57],[122.48,-8.51],[122.51,-8.47],[122.56,-8.43],[122.6,-8.4],[122.75,-8.35],[122.85,-8.3],[122.92,-8.22],[122.76,-8.19],[122.79,-8.13],[122.85,-8.09],[122.92,-8.11],[122.98,-8.15],[123.01,-8.33],[122.96,-8.35],[122.92,-8.38],[122.9,-8.42],[122.81,-8.48],[122.85,-8.56],[122.82,-8.6],[122.78,-8.61]],[[130.86,-8.32],[130.78,-8.35],[130.83,-8.27],[131.02,-8.09],[131.09,-8.12],[131.18,-8.13],[131.04,-8.21],[130.91,-8.25],[130.86,-8.32]],[[118.24,-8.32],[118.29,-8.36],[118.34,-8.35],[118.43,-8.29],[118.49,-8.27],[118.55,-8.27],[118.61,-8.28],[118.67,-8.32],[118.69,-8.39],[118.71,-8.41],[118.75,-8.33],[118.79,-8.31],[118.85,-8.29],[118.93,-8.3],[118.99,-8.34],[119.04,-8.46],[119.04,-8.56],[119.06,-8.6],[119.1,-8.63],[119.13,-8.67],[119.1,-8.71],[119.08,-8.73],[119.01,-8.75],[118.97,-8.74],[118.94,-8.71],[118.9,-8.7],[118.82,-8.71],[118.75,-8.74],[118.76,-8.77],[118.82,-8.79],[118.84,-8.81],[118.83,-8.83],[118.81,-8.84],[118.73,-8.81],[118.67,-8.81],[118.48,-8.86],[118.43,-8.86],[118.4,-8.81],[118.4,-8.7],[118.38,-8.67],[118.23,-8.81],[118.19,-8.84],[118.13,-8.86],[118.07,-8.85],[117.86,-8.93],[117.8,-8.92],[117.73,-8.92],[117.51,-9.01],[117.39,-9.03],[117.33,-9.03],[117.27,-9.03],[117.21,-9.03],[117.16,-9.07],[117.06,-9.1],[116.96,-9.08],[116.87,-9.05],[116.79,-9.01],[116.77,-8.96],[116.77,-8.89],[116.81,-8.81],[116.78,-8.66],[116.8,-8.6],[116.84,-8.53],[116.89,-8.51],[116.95,-8.5],[117.06,-8.44],[117.16,-8.37],[117.22,-8.37],[117.36,-8.43],[117.43,-8.43],[117.57,-8.43],[117.62,-8.46],[117.64,-8.54],[117.67,-8.56],[117.71,-8.58],[117.81,-8.71],[117.89,-8.7],[117.97,-8.73],[118.1,-8.65],[118.21,-8.65],[118.23,-8.59],[118.17,-8.53],[118.1,-8.48],[118.06,-8.46],[118.02,-8.47],[117.98,-8.46],[117.81,-8.34],[117.77,-8.28],[117.74,-8.2],[117.76,-8.15],[117.87,-8.1],[117.92,-8.09],[118.12,-8.12],[118.15,-8.15],[118.2,-8.27],[118.24,-8.32]],[[115.45,-8.16],[115.55,-8.21],[115.69,-8.36],[115.7,-8.41],[115.66,-8.45],[115.56,-8.51],[115.33,-8.62],[115.3,-8.66],[115.25,-8.76],[115.24,-8.8],[115.22,-8.82],[115.19,-8.84],[115.14,-8.85],[115.09,-8.83],[115.14,-8.77],[115.14,-8.7],[115.11,-8.63],[115.06,-8.57],[114.95,-8.5],[114.84,-8.43],[114.73,-8.39],[114.61,-8.38],[114.57,-8.35],[114.5,-8.26],[114.48,-8.21],[114.47,-8.17],[114.48,-8.12],[114.5,-8.12],[114.62,-8.13],[114.83,-8.18],[114.94,-8.19],[115.0,-8.17],[115.15,-8.07],[115.19,-8.07],[115.34,-8.12],[115.45,-8.16]],[[129.84,-7.95],[129.78,-8.05],[129.71,-8.04],[129.59,-7.92],[129.6,-7.83],[129.61,-7.8],[129.66,-7.79],[129.81,-7.82],[129.84,-7.89],[129.84,-7.95]],[[126.8,-7.67],[126.81,-7.72],[126.81,-7.74],[126.69,-7.75],[126.58,-7.81],[126.52,-7.87],[126.47,-7.95],[126.31,-7.92],[126.17,-7.91],[126.11,-7.88],[126.04,-7.89],[125.95,-7.91],[125.83,-7.98],[125.8,-7.98],[125.81,-7.88],[125.84,-7.82],[125.98,-7.66],[126.09,-7.7],[126.21,-7.71],[126.36,-7.68],[126.46,-7.61],[126.61,-7.57],[126.73,-7.66],[126.8,-7.67]],[[127.42,-7.62],[127.36,-7.65],[127.38,-7.57],[127.37,-7.51],[127.48,-7.53],[127.47,-7.58],[127.46,-7.6],[127.42,-7.62]],[[138.54,-8.27],[138.3,-8.41],[137.98,-8.38],[137.87,-8.38],[137.69,-8.41],[137.65,-8.39],[137.69,-8.26],[137.83,-7.93],[138.01,-7.64],[138.08,-7.57],[138.19,-7.5],[138.3,-7.44],[138.54,-7.38],[138.77,-7.39],[138.8,-7.41],[138.9,-7.51],[138.96,-7.59],[138.99,-7.7],[138.89,-7.88],[138.79,-8.06],[138.61,-8.2],[138.54,-8.27]],[[131.33,-8.0],[131.31,-8.01],[131.18,-8.0],[131.11,-8.0],[131.12,-7.92],[131.09,-7.87],[131.14,-7.78],[131.14,-7.68],[131.19,-7.67],[131.2,-7.62],[131.26,-7.47],[131.3,-7.44],[131.35,-7.43],[131.41,-7.34],[131.45,-7.32],[131.48,-7.25],[131.54,-7.22],[131.53,-7.17],[131.56,-7.14],[131.64,-7.11],[131.7,-7.14],[131.74,-7.2],[131.64,-7.27],[131.69,-7.44],[131.62,-7.63],[131.58,-7.68],[131.5,-7.73],[131.47,-7.78],[131.38,-7.87],[131.35,-7.95],[131.34,-7.98],[131.33,-8.0]],[[131.98,-7.2],[131.97,-7.25],[131.93,-7.22],[131.88,-7.17],[131.82,-7.16],[131.78,-7.14],[131.75,-7.12],[131.92,-7.1],[131.98,-7.2]],[[114.41,-7.13],[114.4,-7.17],[114.35,-7.16],[114.3,-7.1],[114.32,-7.08],[114.35,-7.07],[114.38,-7.08],[114.41,-7.13]],[[128.67,-7.18],[128.62,-7.21],[128.55,-7.16],[128.53,-7.13],[128.58,-7.08],[128.63,-7.07],[128.66,-7.09],[128.67,-7.11],[128.67,-7.14],[128.67,-7.18]],[[120.77,-7.12],[120.67,-7.12],[120.64,-7.12],[120.63,-7.02],[120.75,-7.06],[120.78,-7.06],[120.77,-7.12]],[[113.84,-7.11],[113.83,-7.12],[113.66,-7.11],[113.55,-7.19],[113.47,-7.22],[113.2,-7.22],[113.17,-7.21],[113.14,-7.21],[113.13,-7.22],[113.04,-7.21],[112.76,-7.14],[112.73,-7.07],[112.77,-7.0],[112.87,-6.9],[113.07,-6.88],[113.97,-6.87],[114.07,-6.96],[114.08,-6.99],[113.89,-7.05],[113.84,-7.11]],[[115.38,-6.97],[115.3,-6.99],[115.22,-6.95],[115.22,-6.91],[115.24,-6.86],[115.35,-6.84],[115.41,-6.84],[115.48,-6.87],[115.52,-6.9],[115.55,-6.94],[115.42,-6.94],[115.38,-6.97]],[[134.67,-6.75],[134.66,-6.77],[134.63,-6.73],[134.63,-6.71],[134.66,-6.66],[134.7,-6.63],[134.74,-6.62],[134.73,-6.67],[134.67,-6.75]],[[105.25,-6.64],[105.19,-6.66],[105.14,-6.64],[105.12,-6.61],[105.19,-6.55],[105.23,-6.53],[105.26,-6.52],[105.28,-6.56],[105.25,-6.64]],[[134.72,-6.55],[134.66,-6.56],[134.63,-6.48],[134.68,-6.46],[134.73,-6.51],[134.72,-6.55]],[[134.82,-6.43],[134.8,-6.44],[134.8,-6.39],[134.82,-6.35],[134.85,-6.32],[134.89,-6.32],[134.82,-6.43]],[[134.54,-6.44],[134.52,-6.51],[134.5,-6.59],[134.41,-6.68],[134.36,-6.81],[134.32,-6.85],[134.2,-6.91],[134.09,-6.83],[134.06,-6.77],[134.11,-6.47],[134.15,-6.48],[134.18,-6.48],[134.19,-6.46],[134.12,-6.43],[134.11,-6.26],[134.11,-6.19],[134.17,-6.18],[134.23,-6.23],[134.32,-6.32],[134.42,-6.39],[134.54,-6.44]],[[107.37,-6.01],[107.47,-6.12],[107.56,-6.18],[107.67,-6.22],[107.78,-6.22],[107.88,-6.23],[108.01,-6.28],[108.14,-6.3],[108.2,-6.29],[108.25,-6.27],[108.3,-6.27],[108.33,-6.29],[108.42,-6.38],[108.52,-6.47],[108.54,-6.52],[108.6,-6.73],[108.68,-6.79],[108.78,-6.81],[108.9,-6.81],[109.02,-6.82],[109.29,-6.87],[109.4,-6.86],[109.5,-6.81],[109.59,-6.84],[109.82,-6.9],[109.94,-6.92],[110.07,-6.9],[110.2,-6.9],[110.26,-6.91],[110.32,-6.94],[110.37,-6.95],[110.43,-6.95],[110.52,-6.9],[110.58,-6.81],[110.63,-6.69],[110.67,-6.57],[110.7,-6.52],[110.74,-6.47],[110.78,-6.44],[110.83,-6.42],[110.97,-6.44],[111.0,-6.46],[111.15,-6.67],[111.18,-6.69],[111.34,-6.7],[111.39,-6.69],[111.48,-6.65],[111.54,-6.65],[111.64,-6.7],[111.69,-6.74],[111.74,-6.77],[111.99,-6.81],[112.09,-6.89],[112.14,-6.91],[112.31,-6.89],[112.43,-6.9],[112.54,-6.93],[112.59,-7.05],[112.63,-7.18],[112.65,-7.22],[112.75,-7.27],[112.79,-7.3],[112.78,-7.43],[112.79,-7.55],[113.01,-7.66],[113.25,-7.72],[113.5,-7.72],[113.75,-7.7],[113.88,-7.68],[114.04,-7.63],[114.07,-7.63],[114.38,-7.77],[114.41,-7.79],[114.44,-7.9],[114.44,-8.0],[114.38,-8.26],[114.38,-8.33],[114.39,-8.41],[114.45,-8.56],[114.48,-8.6],[114.6,-8.68],[114.6,-8.73],[114.58,-8.77],[114.46,-8.74],[114.38,-8.71],[114.34,-8.65],[114.28,-8.61],[114.16,-8.63],[113.94,-8.57],[113.69,-8.48],[113.25,-8.29],[113.13,-8.29],[113.02,-8.31],[112.9,-8.36],[112.77,-8.4],[112.68,-8.41],[112.59,-8.4],[112.35,-8.35],[112.12,-8.32],[111.51,-8.31],[111.34,-8.26],[111.06,-8.24],[110.83,-8.2],[110.61,-8.15],[110.04,-7.89],[109.85,-7.83],[109.28,-7.7],[109.19,-7.69],[108.99,-7.7],[108.86,-7.67],[108.74,-7.67],[108.57,-7.71],[108.52,-7.74],[108.45,-7.8],[108.34,-7.79],[108.22,-7.78],[107.92,-7.72],[107.8,-7.69],[107.7,-7.64],[107.6,-7.57],[107.55,-7.54],[107.28,-7.47],[107.07,-7.45],[106.63,-7.42],[106.54,-7.39],[106.46,-7.37],[106.41,-7.31],[106.42,-7.24],[106.45,-7.18],[106.49,-7.11],[106.52,-7.05],[106.2,-6.93],[105.94,-6.86],[105.83,-6.85],[105.72,-6.85],[105.6,-6.86],[105.48,-6.85],[105.42,-6.83],[105.36,-6.83],[105.3,-6.84],[105.26,-6.84],[105.24,-6.78],[105.27,-6.73],[105.34,-6.67],[105.37,-6.66],[105.39,-6.75],[105.4,-6.77],[105.46,-6.79],[105.48,-6.78],[105.58,-6.67],[105.61,-6.62],[105.66,-6.47],[105.71,-6.5],[105.76,-6.48],[105.79,-6.46],[105.87,-6.12],[105.94,-6.02],[106.03,-5.93],[106.08,-5.91],[106.17,-5.96],[106.35,-5.98],[106.46,-6.02],[106.57,-6.02],[106.68,-6.04],[106.83,-6.1],[106.88,-6.09],[106.93,-6.07],[107.01,-6.01],[107.05,-5.9],[107.16,-5.96],[107.33,-5.98],[107.37,-6.01]],[[124.05,-5.97],[124.04,-6.02],[124.01,-5.97],[123.97,-5.94],[123.98,-5.88],[124.02,-5.9],[124.05,-5.97]],[[120.53,-6.3],[120.49,-6.46],[120.47,-6.41],[120.46,-6.25],[120.44,-6.18],[120.45,-6.09],[120.45,-5.88],[120.48,-5.78],[120.53,-5.9],[120.55,-5.97],[120.53,-6.3]],[[112.72,-5.81],[112.7,-5.85],[112.6,-5.84],[112.59,-5.8],[112.65,-5.73],[112.69,-5.73],[112.73,-5.75],[112.72,-5.81]],[[132.81,-5.85],[132.75,-5.95],[132.7,-5.91],[132.68,-5.91],[132.67,-5.86],[132.68,-5.74],[132.63,-5.61],[132.7,-5.61],[132.72,-5.65],[132.74,-5.66],[132.8,-5.79],[132.81,-5.85]],[[134.75,-5.71],[134.74,-5.75],[134.74,-5.82],[134.75,-5.88],[134.71,-5.95],[134.75,-6.05],[134.76,-6.1],[134.76,-6.17],[134.74,-6.2],[134.71,-6.3],[134.68,-6.33],[134.66,-6.34],[134.64,-6.37],[134.44,-6.33],[134.36,-6.27],[134.28,-6.2],[134.26,-6.17],[134.18,-6.09],[134.15,-6.06],[134.15,-6.02],[134.23,-6.01],[134.3,-6.01],[134.3,-5.97],[134.34,-5.83],[134.23,-5.74],[134.21,-5.71],[134.25,-5.68],[134.34,-5.71],[134.46,-5.56],[134.49,-5.53],[134.51,-5.44],[134.57,-5.43],[134.62,-5.44],[134.65,-5.49],[134.66,-5.54],[134.65,-5.58],[134.7,-5.6],[134.75,-5.71]],[[132.93,-5.9],[132.85,-5.99],[132.92,-5.79],[132.94,-5.68],[133.01,-5.62],[133.11,-5.31],[133.14,-5.32],[133.17,-5.35],[133.12,-5.58],[132.97,-5.74],[132.93,-5.9]],[[102.37,-5.48],[102.29,-5.48],[102.14,-5.36],[102.11,-5.32],[102.15,-5.29],[102.2,-5.29],[102.37,-5.37],[102.41,-5.4],[102.37,-5.48]],[[123.63,-5.27],[123.62,-5.37],[123.58,-5.37],[123.55,-5.33],[123.54,-5.3],[123.54,-5.27],[123.56,-5.25],[123.63,-5.27]],[[122.04,-5.44],[121.98,-5.46],[121.86,-5.35],[121.81,-5.26],[121.82,-5.2],[121.86,-5.16],[121.87,-5.14],[121.87,-5.1],[121.91,-5.07],[121.97,-5.08],[122.0,-5.14],[122.04,-5.16],[122.06,-5.22],[122.04,-5.44]],[[122.65,-5.27],[122.62,-5.34],[122.56,-5.39],[122.52,-5.39],[122.47,-5.38],[122.39,-5.34],[122.37,-5.38],[122.31,-5.38],[122.28,-5.32],[122.33,-5.14],[122.4,-5.07],[122.39,-5.0],[122.33,-4.85],[122.37,-4.77],[122.52,-4.71],[122.66,-4.63],[122.7,-4.62],[122.74,-4.68],[122.76,-4.93],[122.61,-5.14],[122.65,-5.27]],[[123.18,-4.55],[123.2,-4.77],[123.2,-4.82],[123.14,-4.74],[123.12,-4.72],[123.1,-4.74],[123.08,-4.75],[123.06,-4.75],[123.02,-4.83],[123.01,-4.91],[122.99,-4.96],[122.97,-5.14],[122.98,-5.19],[123.02,-5.16],[123.05,-5.16],[123.15,-5.22],[123.2,-5.27],[123.19,-5.33],[123.12,-5.39],[123.04,-5.42],[122.99,-5.39],[122.97,-5.41],[122.93,-5.44],[122.91,-5.48],[122.92,-5.52],[122.85,-5.64],[122.81,-5.67],[122.73,-5.63],[122.68,-5.67],[122.65,-5.66],[122.58,-5.54],[122.59,-5.49],[122.64,-5.43],[122.64,-5.38],[122.67,-5.33],[122.73,-5.26],[122.77,-5.21],[122.77,-5.18],[122.79,-5.05],[122.8,-5.0],[122.82,-4.94],[122.85,-4.83],[122.85,-4.62],[122.95,-4.44],[123.04,-4.39],[123.07,-4.39],[123.07,-4.43],[123.18,-4.55]],[[133.57,-4.25],[133.62,-4.3],[133.5,-4.26],[133.33,-4.17],[133.32,-4.11],[133.46,-4.2],[133.57,-4.25]],[[123.24,-4.11],[123.14,-4.23],[123.08,-4.23],[122.99,-4.15],[122.97,-4.06],[122.97,-4.03],[123.02,-3.98],[123.21,-4.0],[123.25,-4.04],[123.24,-4.11]],[[128.56,-3.59],[128.39,-3.64],[128.43,-3.54],[128.45,-3.51],[128.54,-3.54],[128.56,-3.59]],[[128.28,-3.67],[128.25,-3.71],[128.19,-3.74],[128.14,-3.73],[128.16,-3.7],[128.15,-3.68],[128.11,-3.69],[128.05,-3.71],[127.98,-3.77],[127.93,-3.74],[127.92,-3.7],[127.93,-3.68],[128.02,-3.6],[128.12,-3.59],[128.26,-3.51],[128.33,-3.52],[128.31,-3.56],[128.29,-3.6],[128.28,-3.63],[128.28,-3.67]],[[128.72,-3.55],[128.72,-3.59],[128.71,-3.6],[128.66,-3.59],[128.62,-3.59],[128.59,-3.51],[128.59,-3.49],[128.67,-3.52],[128.69,-3.52],[128.72,-3.55]],[[116.42,-3.46],[116.39,-3.64],[116.33,-3.54],[116.4,-3.42],[116.43,-3.4],[116.42,-3.46]],[[127.61,-3.32],[127.63,-3.36],[127.53,-3.33],[127.49,-3.29],[127.53,-3.26],[127.55,-3.25],[127.61,-3.32]],[[116.3,-3.87],[116.09,-4.05],[116.06,-4.01],[116.08,-3.82],[116.02,-3.7],[116.02,-3.61],[116.06,-3.46],[116.12,-3.34],[116.24,-3.26],[116.27,-3.25],[116.26,-3.39],[116.29,-3.45],[116.3,-3.5],[116.28,-3.53],[116.31,-3.72],[116.32,-3.76],[116.29,-3.82],[116.3,-3.87]],[[126.86,-3.09],[127.03,-3.17],[127.06,-3.22],[127.09,-3.28],[127.12,-3.31],[127.16,-3.34],[127.23,-3.39],[127.24,-3.47],[127.23,-3.63],[127.16,-3.65],[127.09,-3.67],[126.94,-3.76],[126.87,-3.78],[126.79,-3.79],[126.74,-3.81],[126.69,-3.82],[126.55,-3.77],[126.41,-3.71],[126.21,-3.61],[126.18,-3.58],[126.15,-3.52],[126.06,-3.42],[126.03,-3.36],[126.03,-3.17],[126.05,-3.13],[126.09,-3.11],[126.22,-3.15],[126.31,-3.1],[126.56,-3.07],[126.81,-3.07],[126.86,-3.09]],[[127.99,-2.94],[127.94,-3.02],[127.85,-3.02],[127.83,-3.0],[127.94,-2.95],[127.99,-2.94]],[[106.89,-3.01],[106.87,-3.03],[106.81,-3.01],[106.77,-2.99],[106.75,-2.96],[106.74,-2.93],[106.8,-2.9],[106.91,-2.93],[106.89,-3.01]],[[107.47,-2.9],[107.43,-2.93],[107.41,-2.9],[107.4,-2.87],[107.42,-2.84],[107.47,-2.83],[107.5,-2.85],[107.47,-2.9]],[[129.75,-2.87],[129.98,-2.98],[130.1,-2.99],[130.3,-2.98],[130.38,-2.99],[130.57,-3.13],[130.63,-3.23],[130.64,-3.31],[130.67,-3.39],[130.72,-3.41],[130.77,-3.42],[130.85,-3.53],[130.86,-3.57],[130.81,-3.86],[130.58,-3.75],[130.36,-3.63],[130.27,-3.58],[130.02,-3.47],[129.98,-3.44],[129.95,-3.39],[129.84,-3.33],[129.63,-3.32],[129.55,-3.32],[129.51,-3.33],[129.52,-3.36],[129.52,-3.43],[129.47,-3.45],[129.33,-3.41],[129.21,-3.39],[129.11,-3.35],[128.97,-3.33],[128.95,-3.3],[128.96,-3.27],[128.96,-3.24],[128.93,-3.23],[128.86,-3.23],[128.8,-3.27],[128.75,-3.3],[128.68,-3.4],[128.64,-3.43],[128.52,-3.45],[128.47,-3.44],[128.42,-3.42],[128.28,-3.24],[128.23,-3.2],[128.18,-3.17],[128.13,-3.16],[128.08,-3.18],[128.06,-3.24],[128.04,-3.3],[128.03,-3.34],[127.97,-3.44],[127.92,-3.51],[127.9,-3.5],[127.93,-3.4],[127.93,-3.34],[127.9,-3.28],[127.88,-3.22],[128.11,-2.93],[128.2,-2.87],[128.57,-2.84],[128.79,-2.86],[128.91,-2.85],[128.99,-2.83],[129.06,-2.84],[129.07,-2.9],[129.12,-2.94],[129.17,-2.93],[129.28,-2.89],[129.37,-2.82],[129.43,-2.79],[129.48,-2.79],[129.54,-2.79],[129.6,-2.81],[129.75,-2.87]],[[100.43,-3.18],[100.47,-3.33],[100.35,-3.23],[100.35,-3.16],[100.33,-3.11],[100.26,-3.06],[100.2,-2.99],[100.18,-2.82],[100.2,-2.79],[100.25,-2.78],[100.45,-3.0],[100.47,-3.04],[100.46,-3.12],[100.43,-3.14],[100.43,-3.18]],[[108.21,-3.0],[108.19,-3.1],[108.17,-3.14],[108.08,-3.19],[108.06,-3.23],[107.98,-3.22],[107.97,-3.17],[107.94,-3.13],[107.86,-3.09],[107.84,-3.1],[107.82,-3.16],[107.66,-3.21],[107.61,-3.21],[107.64,-3.12],[107.59,-3.06],[107.59,-2.98],[107.58,-2.94],[107.56,-2.92],[107.6,-2.86],[107.6,-2.8],[107.64,-2.73],[107.67,-2.57],[107.84,-2.53],[107.87,-2.56],[108.07,-2.6],[108.22,-2.7],[108.29,-2.83],[108.21,-3.0]],[[100.2,-2.74],[100.13,-2.82],[100.01,-2.82],[99.99,-2.77],[100.0,-2.65],[99.97,-2.61],[99.97,-2.59],[99.99,-2.53],[100.01,-2.51],[100.2,-2.68],[100.2,-2.74]],[[134.37,-2.12],[134.35,-2.14],[134.34,-2.1],[134.35,-2.04],[134.37,-2.03],[134.39,-2.03],[134.42,-2.05],[134.37,-2.12]],[[99.84,-2.34],[99.85,-2.37],[99.69,-2.28],[99.61,-2.26],[99.54,-2.16],[99.56,-2.12],[99.56,-2.05],[99.57,-2.03],[99.62,-2.02],[99.69,-2.06],[99.73,-2.18],[99.82,-2.28],[99.84,-2.34]],[[126.06,-2.45],[126.04,-2.47],[125.98,-2.42],[125.94,-2.26],[125.9,-2.22],[125.86,-2.08],[125.87,-2.04],[125.92,-1.97],[125.96,-1.98],[125.99,-2.01],[125.98,-2.17],[126.07,-2.37],[126.06,-2.45]],[[123.85,-1.96],[123.87,-2.0],[123.8,-1.99],[123.78,-1.92],[123.78,-1.88],[123.85,-1.96]],[[126.02,-1.79],[126.33,-1.82],[126.29,-1.86],[125.96,-1.92],[125.84,-1.91],[125.48,-1.94],[125.43,-1.94],[125.43,-1.88],[125.39,-1.84],[125.44,-1.81],[125.52,-1.8],[125.72,-1.81],[126.02,-1.79]],[[123.15,-1.82],[123.08,-1.9],[123.07,-1.85],[123.09,-1.81],[123.11,-1.79],[123.14,-1.77],[123.15,-1.82]],[[130.35,-1.69],[130.37,-1.75],[130.43,-1.8],[130.4,-1.89],[130.38,-1.9],[130.39,-1.94],[130.42,-1.97],[130.37,-1.99],[130.34,-1.98],[130.28,-2.01],[130.25,-2.05],[130.13,-2.06],[130.09,-2.03],[129.89,-1.99],[129.75,-1.89],[129.74,-1.87],[129.99,-1.76],[130.11,-1.73],[130.2,-1.73],[130.32,-1.69],[130.35,-1.69]],[[124.97,-1.71],[125.06,-1.74],[125.1,-1.74],[125.13,-1.7],[125.15,-1.69],[125.19,-1.71],[125.2,-1.78],[125.26,-1.77],[125.31,-1.79],[125.32,-1.81],[125.31,-1.88],[125.13,-1.89],[125.01,-1.94],[124.83,-1.89],[124.64,-1.98],[124.52,-2.01],[124.42,-2.01],[124.33,-1.86],[124.38,-1.69],[124.42,-1.66],[124.48,-1.64],[124.66,-1.64],[124.97,-1.71]],[[135.47,-1.59],[135.87,-1.64],[135.98,-1.64],[136.2,-1.65],[136.39,-1.72],[136.72,-1.73],[136.82,-1.75],[136.89,-1.8],[136.71,-1.84],[136.62,-1.87],[136.46,-1.89],[136.33,-1.87],[136.23,-1.89],[136.19,-1.86],[136.05,-1.82],[135.87,-1.75],[135.49,-1.67],[135.47,-1.62],[135.47,-1.59]],[[108.95,-1.62],[108.84,-1.66],[108.8,-1.57],[108.88,-1.54],[108.96,-1.56],[108.95,-1.62]],[[106.05,-1.67],[106.08,-1.74],[106.13,-1.8],[106.16,-1.87],[106.21,-2.19],[106.37,-2.46],[106.82,-2.57],[106.74,-2.62],[106.71,-2.66],[106.68,-2.7],[106.61,-2.9],[106.62,-2.94],[106.66,-3.0],[106.67,-3.07],[106.61,-3.07],[106.55,-3.06],[106.5,-3.03],[106.45,-2.99],[106.4,-2.97],[106.34,-2.95],[106.25,-2.89],[106.13,-2.86],[106.0,-2.82],[105.94,-2.74],[105.91,-2.64],[105.94,-2.49],[105.91,-2.45],[105.86,-2.42],[105.81,-2.31],[105.79,-2.18],[105.71,-2.13],[105.6,-2.1],[105.55,-2.08],[105.34,-2.13],[105.29,-2.11],[105.25,-2.08],[105.13,-2.04],[105.14,-1.97],[105.19,-1.92],[105.32,-1.86],[105.37,-1.81],[105.39,-1.75],[105.36,-1.71],[105.37,-1.66],[105.41,-1.61],[105.46,-1.57],[105.59,-1.53],[105.64,-1.61],[105.67,-1.68],[105.7,-1.73],[105.75,-1.66],[105.72,-1.53],[105.82,-1.51],[105.91,-1.5],[105.98,-1.54],[106.03,-1.59],[106.05,-1.67]],[[123.6,-1.7],[123.53,-1.71],[123.48,-1.68],[123.49,-1.53],[123.53,-1.5],[123.55,-1.51],[123.56,-1.55],[123.58,-1.59],[123.62,-1.63],[123.6,-1.7]],[[128.15,-1.66],[128.09,-1.7],[128.06,-1.71],[127.91,-1.69],[127.74,-1.69],[127.56,-1.73],[127.46,-1.7],[127.39,-1.64],[127.4,-1.59],[127.46,-1.45],[127.59,-1.35],[127.65,-1.33],[127.74,-1.36],[127.91,-1.44],[128.03,-1.53],[128.15,-1.6],[128.15,-1.66]],[[123.21,-1.17],[123.23,-1.23],[123.2,-1.29],[123.24,-1.39],[123.34,-1.25],[123.43,-1.24],[123.49,-1.26],[123.53,-1.29],[123.55,-1.34],[123.51,-1.45],[123.45,-1.5],[123.37,-1.51],[123.33,-1.44],[123.27,-1.44],[123.24,-1.58],[123.22,-1.6],[123.17,-1.62],[123.13,-1.58],[123.12,-1.56],[123.18,-1.49],[123.15,-1.3],[123.11,-1.34],[122.98,-1.51],[122.89,-1.59],[122.86,-1.55],[122.81,-1.43],[122.83,-1.28],[122.91,-1.18],[122.97,-1.19],[123.16,-1.16],[123.21,-1.17]],[[109.71,-1.18],[109.51,-1.28],[109.46,-1.28],[109.43,-1.24],[109.45,-1.04],[109.48,-0.99],[109.61,-0.98],[109.7,-1.01],[109.74,-1.04],[109.76,-1.11],[109.75,-1.15],[109.71,-1.18]],[[134.97,-1.12],[134.92,-1.13],[134.86,-1.11],[134.81,-1.04],[134.83,-0.98],[134.89,-0.94],[134.94,-0.98],[134.96,-1.03],[135.0,-1.03],[134.97,-1.12]],[[99.16,-1.78],[99.07,-1.78],[98.87,-1.66],[98.83,-1.61],[98.82,-1.54],[98.63,-1.26],[98.6,-1.2],[98.68,-0.97],[98.87,-0.92],[98.93,-0.95],[98.95,-1.06],[99.07,-1.24],[99.1,-1.34],[99.13,-1.38],[99.14,-1.42],[99.13,-1.44],[99.21,-1.56],[99.27,-1.63],[99.27,-1.74],[99.16,-1.78]],[[131.0,-1.32],[130.97,-1.34],[130.85,-1.32],[130.78,-1.26],[130.74,-1.17],[130.71,-1.1],[130.7,-1.05],[130.67,-0.98],[130.67,-0.96],[130.9,-0.89],[130.94,-0.92],[131.03,-0.92],[131.07,-0.97],[131.05,-1.19],[131.0,-1.32]],[[130.91,-0.78],[130.88,-0.83],[130.83,-0.86],[130.4,-0.92],[130.44,-0.89],[130.46,-0.85],[130.48,-0.83],[130.53,-0.84],[130.55,-0.83],[130.57,-0.82],[130.59,-0.83],[130.64,-0.81],[130.72,-0.82],[130.81,-0.81],[130.81,-0.77],[130.91,-0.78]],[[135.38,-0.65],[135.6,-0.69],[135.67,-0.69],[135.75,-0.73],[135.84,-0.71],[135.89,-0.73],[136.07,-0.88],[136.15,-0.98],[136.28,-1.06],[136.38,-1.09],[136.31,-1.17],[136.16,-1.21],[136.11,-1.22],[136.0,-1.17],[135.92,-1.18],[135.84,-1.12],[135.83,-1.03],[135.75,-0.82],[135.65,-0.88],[135.52,-0.79],[135.49,-0.79],[135.48,-0.8],[135.43,-0.77],[135.39,-0.7],[135.38,-0.65]],[[127.3,-0.78],[127.29,-0.8],[127.18,-0.78],[127.16,-0.76],[127.21,-0.62],[127.26,-0.62],[127.3,-0.76],[127.3,-0.78]],[[130.63,-0.53],[130.57,-0.53],[130.47,-0.49],[130.53,-0.45],[130.56,-0.44],[130.6,-0.42],[130.62,-0.42],[130.66,-0.44],[130.68,-0.47],[130.63,-0.53]],[[121.86,-0.41],[121.91,-0.45],[121.88,-0.5],[121.85,-0.49],[121.76,-0.49],[121.72,-0.49],[121.68,-0.52],[121.66,-0.53],[121.67,-0.48],[121.75,-0.41],[121.8,-0.42],[121.86,-0.41]],[[140.97,-2.61],[140.97,-2.8],[140.97,-3.01],[140.97,-3.21],[140.97,-3.41],[140.97,-3.62],[140.97,-3.82],[140.97,-4.02],[140.97,-4.23],[140.97,-4.43],[140.97,-4.63],[140.97,-4.84],[140.97,-5.04],[140.97,-5.24],[140.97,-5.45],[140.97,-5.65],[140.97,-5.85],[140.97,-6.06],[140.98,-6.26],[140.98,-6.35],[140.94,-6.45],[140.87,-6.61],[140.86,-6.74],[140.92,-6.84],[140.98,-6.91],[140.98,-7.07],[140.98,-7.28],[140.98,-7.48],[140.98,-7.68],[140.98,-7.89],[140.98,-8.09],[140.98,-8.29],[140.98,-8.5],[140.98,-8.7],[140.98,-8.9],[140.98,-9.11],[140.98,-9.12],[140.92,-9.09],[140.79,-8.97],[140.66,-8.85],[140.58,-8.73],[140.49,-8.62],[140.1,-8.3],[140.0,-8.2],[139.98,-8.17],[139.99,-8.14],[140.04,-8.08],[140.12,-7.92],[140.03,-8.02],[139.93,-8.1],[139.79,-8.11],[139.65,-8.13],[139.52,-8.17],[139.39,-8.19],[139.32,-8.17],[139.28,-8.11],[139.26,-8.05],[139.25,-7.98],[139.19,-8.09],[139.08,-8.14],[138.93,-8.26],[138.89,-8.24],[138.86,-8.19],[138.86,-8.15],[138.89,-8.09],[138.91,-8.04],[138.94,-7.91],[139.0,-7.84],[139.05,-7.69],[139.07,-7.64],[139.09,-7.59],[139.05,-7.53],[138.98,-7.51],[138.94,-7.47],[138.89,-7.37],[138.85,-7.34],[138.79,-7.3],[138.75,-7.25],[138.8,-7.22],[138.86,-7.2],[138.92,-7.2],[139.02,-7.23],[139.06,-7.23],[139.18,-7.19],[139.11,-7.2],[139.05,-7.2],[138.85,-7.14],[138.72,-7.07],[138.6,-6.94],[138.6,-6.91],[138.68,-6.89],[138.86,-6.86],[138.81,-6.79],[138.73,-6.73],[138.7,-6.63],[138.64,-6.56],[138.52,-6.45],[138.44,-6.34],[138.37,-6.12],[138.3,-5.95],[138.31,-5.89],[138.37,-5.84],[138.28,-5.84],[138.2,-5.81],[138.24,-5.72],[138.34,-5.68],[138.25,-5.69],[138.17,-5.71],[138.13,-5.72],[138.09,-5.71],[138.07,-5.68],[138.06,-5.63],[138.08,-5.55],[138.06,-5.47],[137.98,-5.43],[137.92,-5.37],[137.89,-5.35],[137.84,-5.35],[137.8,-5.31],[137.76,-5.26],[137.31,-5.01],[137.28,-4.95],[137.24,-4.98],[137.2,-4.99],[137.14,-4.95],[137.09,-4.92],[137.03,-4.93],[136.97,-4.91],[136.92,-4.9],[136.86,-4.89],[136.62,-4.82],[136.39,-4.7],[136.21,-4.65],[136.1,-4.58],[135.98,-4.53],[135.72,-4.48],[135.45,-4.44],[135.35,-4.44],[135.27,-4.45],[135.2,-4.45],[134.75,-4.2],[134.68,-4.08],[134.69,-4.01],[134.71,-3.95],[134.89,-3.94],[134.76,-3.92],[134.71,-3.93],[134.6,-3.98],[134.55,-3.98],[134.47,-3.95],[134.39,-3.91],[134.27,-3.95],[134.2,-3.89],[134.18,-3.83],[134.15,-3.8],[134.1,-3.8],[134.04,-3.82],[133.97,-3.82],[133.93,-3.78],[133.9,-3.72],[133.86,-3.68],[133.81,-3.65],[133.72,-3.58],[133.68,-3.48],[133.68,-3.31],[133.7,-3.25],[133.78,-3.15],[133.84,-3.05],[133.77,-3.04],[133.7,-3.09],[133.67,-3.13],[133.66,-3.19],[133.65,-3.36],[133.6,-3.42],[133.52,-3.41],[133.54,-3.52],[133.51,-3.62],[133.42,-3.73],[133.41,-3.79],[133.42,-3.84],[133.4,-3.9],[133.25,-4.06],[133.2,-4.07],[133.09,-4.07],[132.97,-4.09],[132.91,-4.06],[132.87,-4.01],[132.84,-3.95],[132.79,-3.83],[132.75,-3.7],[132.87,-3.55],[132.83,-3.41],[132.75,-3.29],[132.55,-3.13],[132.35,-2.98],[132.25,-2.94],[132.1,-2.93],[132.05,-2.91],[132.01,-2.86],[131.97,-2.79],[132.07,-2.76],[132.23,-2.68],[132.32,-2.68],[132.58,-2.73],[132.65,-2.77],[132.72,-2.79],[132.9,-2.66],[133.03,-2.49],[133.12,-2.45],[133.19,-2.44],[133.26,-2.45],[133.41,-2.51],[133.53,-2.54],[133.61,-2.55],[133.65,-2.6],[133.7,-2.62],[133.71,-2.54],[133.75,-2.45],[133.83,-2.42],[133.88,-2.42],[133.9,-2.39],[133.9,-2.3],[133.79,-2.29],[133.85,-2.22],[133.9,-2.18],[133.92,-2.15],[133.92,-2.1],[133.71,-2.19],[133.49,-2.23],[133.36,-2.22],[133.22,-2.21],[132.96,-2.27],[132.86,-2.27],[132.63,-2.25],[132.5,-2.22],[132.4,-2.24],[132.31,-2.24],[132.21,-2.18],[132.12,-2.09],[132.08,-2.03],[132.02,-1.99],[132.0,-1.93],[131.94,-1.71],[131.93,-1.56],[131.83,-1.56],[131.73,-1.54],[131.29,-1.39],[131.24,-1.43],[131.18,-1.45],[131.12,-1.46],[131.06,-1.45],[131.0,-1.42],[131.0,-1.38],[131.05,-1.28],[131.09,-1.25],[131.15,-1.22],[131.19,-1.17],[131.25,-1.01],[131.26,-0.95],[131.25,-0.9],[131.26,-0.86],[131.3,-0.83],[131.46,-0.78],[131.8,-0.7],[131.89,-0.66],[131.96,-0.58],[132.05,-0.54],[132.08,-0.49],[132.13,-0.45],[132.39,-0.36],[132.51,-0.35],[132.63,-0.36],[132.86,-0.42],[133.08,-0.51],[133.27,-0.64],[133.47,-0.73],[133.72,-0.74],[133.85,-0.73],[133.97,-0.74],[134.02,-0.77],[134.11,-0.85],[134.09,-0.9],[134.07,-1.0],[134.12,-1.1],[134.19,-1.2],[134.25,-1.31],[134.26,-1.36],[134.24,-1.47],[134.22,-1.53],[134.15,-1.62],[134.11,-1.72],[134.13,-1.84],[134.15,-1.97],[134.14,-2.08],[134.16,-2.2],[134.19,-2.31],[134.36,-2.62],[134.46,-2.83],[134.49,-2.71],[134.48,-2.58],[134.52,-2.54],[134.57,-2.51],[134.63,-2.54],[134.64,-2.59],[134.65,-2.71],[134.7,-2.93],[134.77,-2.94],[134.84,-2.91],[134.86,-2.98],[134.85,-3.11],[134.89,-3.21],[134.92,-3.25],[135.04,-3.33],[135.09,-3.35],[135.25,-3.37],[135.37,-3.37],[135.49,-3.35],[135.56,-3.27],[135.63,-3.19],[135.86,-3.0],[135.93,-2.9],[135.99,-2.76],[136.01,-2.73],[136.24,-2.58],[136.27,-2.53],[136.3,-2.43],[136.35,-2.33],[136.39,-2.27],[136.61,-2.22],[136.84,-2.2],[137.07,-2.11],[137.17,-2.03],[137.18,-1.97],[137.13,-1.88],[137.12,-1.84],[137.18,-1.8],[137.38,-1.69],[137.62,-1.57],[137.81,-1.48],[137.91,-1.48],[138.01,-1.56],[138.11,-1.62],[138.65,-1.79],[138.74,-1.85],[138.81,-1.92],[138.92,-1.97],[139.04,-1.99],[139.15,-2.04],[139.25,-2.1],[139.48,-2.21],[139.79,-2.35],[139.87,-2.36],[140.15,-2.35],[140.2,-2.38],[140.25,-2.41],[140.29,-2.42],[140.62,-2.45],[140.67,-2.47],[140.72,-2.51],[140.75,-2.61],[140.97,-2.61]],[[104.47,-0.33],[104.57,-0.43],[104.59,-0.47],[104.54,-0.52],[104.51,-0.6],[104.49,-0.61],[104.41,-0.58],[104.36,-0.66],[104.33,-0.54],[104.26,-0.46],[104.3,-0.39],[104.32,-0.38],[104.34,-0.38],[104.36,-0.4],[104.47,-0.33]],[[127.57,-0.32],[127.68,-0.47],[127.6,-0.61],[127.66,-0.69],[127.8,-0.69],[127.84,-0.72],[127.86,-0.76],[127.88,-0.81],[127.84,-0.85],[127.76,-0.88],[127.67,-0.83],[127.64,-0.78],[127.62,-0.77],[127.5,-0.8],[127.46,-0.81],[127.44,-0.74],[127.47,-0.64],[127.38,-0.6],[127.3,-0.5],[127.3,-0.46],[127.33,-0.39],[127.33,-0.34],[127.37,-0.33],[127.46,-0.41],[127.49,-0.34],[127.53,-0.31],[127.57,-0.32]],[[127.25,-0.5],[127.19,-0.52],[127.12,-0.52],[127.1,-0.41],[127.13,-0.28],[127.19,-0.26],[127.29,-0.28],[127.25,-0.32],[127.28,-0.39],[127.25,-0.5]],[[103.74,-0.35],[103.61,-0.38],[103.46,-0.36],[103.48,-0.3],[103.55,-0.23],[103.61,-0.23],[103.72,-0.28],[103.76,-0.32],[103.74,-0.35]],[[130.81,-0.0],[130.99,-0.05],[131.03,-0.04],[131.28,-0.15],[131.32,-0.2],[131.3,-0.24],[131.34,-0.29],[131.26,-0.37],[131.22,-0.37],[131.18,-0.35],[131.1,-0.33],[131.01,-0.36],[130.95,-0.34],[130.9,-0.27],[130.81,-0.23],[130.68,-0.08],[130.62,-0.09],[130.64,-0.14],[130.69,-0.18],[130.76,-0.29],[130.8,-0.3],[130.84,-0.3],[130.9,-0.34],[130.9,-0.42],[130.75,-0.44],[130.7,-0.39],[130.69,-0.3],[130.61,-0.33],[130.57,-0.36],[130.55,-0.37],[130.5,-0.27],[130.34,-0.26],[130.24,-0.21],[130.29,-0.15],[130.29,-0.1],[130.36,-0.07],[130.43,-0.1],[130.5,-0.06],[130.55,-0.07],[130.58,-0.05],[130.72,-0.03],[130.81,-0.0]],[[98.46,-0.53],[98.4,-0.58],[98.31,-0.53],[98.34,-0.47],[98.35,-0.38],[98.41,-0.31],[98.43,-0.23],[98.32,-0.0],[98.37,0.01],[98.42,-0.02],[98.48,-0.17],[98.54,-0.26],[98.52,-0.38],[98.46,-0.53]],[[104.78,-0.18],[104.81,-0.19],[104.84,-0.14],[104.91,-0.21],[104.95,-0.25],[105.01,-0.28],[104.95,-0.28],[104.93,-0.32],[104.91,-0.32],[104.7,-0.21],[104.57,-0.25],[104.47,-0.21],[104.45,-0.19],[104.5,-0.13],[104.54,0.02],[104.64,-0.02],[104.66,-0.06],[104.65,-0.08],[104.71,-0.1],[104.78,-0.18]],[[129.55,-0.19],[129.51,-0.19],[129.47,-0.13],[129.37,-0.07],[129.31,0.05],[129.54,-0.14],[129.55,-0.19]],[[127.45,-0.01],[127.45,-0.04],[127.42,0.01],[127.4,0.02],[127.42,0.12],[127.43,0.14],[127.45,0.07],[127.45,-0.01]],[[104.69,0.06],[104.7,0.03],[104.65,0.06],[104.62,0.08],[104.6,0.1],[104.5,0.23],[104.54,0.22],[104.66,0.1],[104.69,0.06]],[[103.28,0.54],[103.17,0.54],[103.14,0.55],[103.15,0.64],[103.19,0.7],[103.24,0.7],[103.3,0.61],[103.28,0.54]],[[127.42,0.64],[127.38,0.63],[127.37,0.63],[127.36,0.68],[127.38,0.74],[127.42,0.74],[127.44,0.73],[127.45,0.68],[127.42,0.64]],[[127.37,0.79],[127.34,0.76],[127.31,0.77],[127.29,0.81],[127.29,0.84],[127.32,0.86],[127.35,0.85],[127.37,0.79]],[[103.45,0.66],[103.43,0.65],[103.34,0.78],[103.37,0.85],[103.39,0.87],[103.43,0.82],[103.47,0.78],[103.5,0.72],[103.45,0.66]],[[103.83,0.8],[103.83,0.77],[103.74,0.83],[103.74,0.87],[103.75,0.89],[103.81,0.85],[103.83,0.8]],[[104.24,0.83],[104.18,0.8],[104.1,0.9],[104.1,0.92],[104.11,0.93],[104.12,0.94],[104.17,0.9],[104.23,0.88],[104.24,0.83]],[[103.03,0.75],[103.01,0.71],[102.97,0.74],[102.78,0.78],[102.71,0.78],[102.54,0.83],[102.49,0.86],[102.45,0.89],[102.47,0.95],[102.49,0.99],[102.51,1.09],[102.55,1.13],[102.63,1.05],[102.73,0.99],[102.78,0.96],[102.94,0.89],[103.0,0.86],[103.03,0.75]],[[103.42,1.05],[103.43,0.99],[103.36,1.01],[103.32,1.07],[103.35,1.12],[103.38,1.13],[103.4,1.07],[103.42,1.05]],[[103.17,0.87],[103.14,0.84],[103.09,0.85],[103.03,0.88],[102.96,0.94],[102.89,1.0],[102.79,1.03],[102.73,1.04],[102.7,1.05],[102.73,1.16],[102.79,1.17],[103.0,1.07],[103.07,1.01],[103.17,0.87]],[[104.02,1.18],[104.09,1.14],[104.14,1.17],[104.14,1.13],[104.13,1.09],[104.07,0.99],[103.96,1.01],[103.94,1.05],[103.93,1.07],[103.95,1.09],[103.96,1.14],[104.0,1.14],[104.02,1.18]],[[104.59,1.22],[104.59,1.14],[104.65,1.1],[104.66,1.05],[104.65,0.96],[104.6,0.86],[104.58,0.83],[104.5,0.85],[104.48,0.89],[104.47,0.91],[104.48,0.93],[104.43,0.96],[104.46,1.0],[104.44,1.05],[104.29,1.02],[104.25,1.01],[104.24,1.08],[104.25,1.1],[104.36,1.18],[104.43,1.2],[104.5,1.18],[104.59,1.22]],[[102.43,0.99],[102.38,0.96],[102.33,1.01],[102.28,1.08],[102.26,1.15],[102.23,1.26],[102.23,1.35],[102.26,1.4],[102.28,1.4],[102.36,1.35],[102.41,1.26],[102.44,1.23],[102.45,1.16],[102.43,1.07],[102.43,0.99]],[[97.48,1.47],[97.7,1.18],[97.79,1.15],[97.9,1.02],[97.93,0.97],[97.9,0.88],[97.88,0.63],[97.82,0.56],[97.68,0.6],[97.68,0.64],[97.6,0.83],[97.46,0.94],[97.41,0.95],[97.37,1.06],[97.3,1.19],[97.08,1.43],[97.24,1.42],[97.32,1.48],[97.34,1.53],[97.36,1.54],[97.48,1.47]],[[102.49,1.46],[102.5,1.33],[102.43,1.36],[102.37,1.42],[102.27,1.45],[102.16,1.47],[102.08,1.5],[102.02,1.56],[102.02,1.59],[102.02,1.61],[102.04,1.63],[102.47,1.51],[102.49,1.46]],[[124.89,1.0],[124.7,0.83],[124.64,0.74],[124.59,0.66],[124.51,0.56],[124.43,0.47],[124.38,0.44],[124.28,0.4],[124.22,0.38],[124.1,0.37],[123.75,0.31],[123.64,0.3],[123.53,0.3],[123.31,0.32],[123.27,0.33],[123.18,0.42],[123.08,0.49],[123.0,0.49],[122.91,0.49],[122.28,0.48],[122.06,0.47],[121.84,0.44],[121.72,0.45],[121.6,0.49],[121.52,0.5],[121.43,0.49],[121.01,0.44],[120.91,0.45],[120.7,0.51],[120.58,0.53],[120.46,0.51],[120.35,0.45],[120.31,0.41],[120.19,0.27],[120.13,0.17],[120.08,0.04],[120.04,-0.09],[120.01,-0.2],[120.01,-0.31],[120.03,-0.43],[120.06,-0.56],[120.1,-0.65],[120.24,-0.87],[120.27,-0.9],[120.43,-0.96],[120.52,-1.04],[120.61,-1.26],[120.67,-1.37],[120.73,-1.37],[120.8,-1.36],[120.92,-1.38],[121.03,-1.41],[121.15,-1.34],[121.21,-1.21],[121.28,-1.12],[121.43,-0.94],[121.52,-0.86],[121.58,-0.83],[121.63,-0.84],[121.68,-0.89],[121.74,-0.93],[121.85,-0.95],[121.97,-0.93],[122.09,-0.88],[122.14,-0.84],[122.17,-0.79],[122.28,-0.76],[122.53,-0.76],[122.66,-0.77],[122.89,-0.76],[122.89,-0.72],[122.84,-0.69],[122.83,-0.66],[122.87,-0.64],[123.02,-0.6],[123.17,-0.57],[123.28,-0.59],[123.38,-0.65],[123.42,-0.71],[123.43,-0.78],[123.4,-0.96],[123.38,-1.0],[123.3,-1.03],[123.23,-1.0],[123.15,-0.91],[123.05,-0.87],[122.9,-0.9],[122.85,-0.93],[122.81,-0.97],[122.72,-1.06],[122.66,-1.18],[122.51,-1.35],[122.33,-1.5],[122.25,-1.56],[122.16,-1.59],[121.86,-1.69],[121.78,-1.77],[121.72,-1.86],[121.65,-1.9],[121.57,-1.91],[121.51,-1.89],[121.39,-1.83],[121.36,-1.88],[121.35,-1.95],[121.41,-1.97],[121.5,-2.05],[121.58,-2.15],[121.62,-2.17],[121.73,-2.21],[121.77,-2.24],[121.85,-2.33],[121.97,-2.54],[122.01,-2.66],[122.08,-2.75],[122.29,-2.91],[122.3,-2.95],[122.29,-3.0],[122.31,-3.05],[122.38,-3.14],[122.4,-3.2],[122.32,-3.28],[122.31,-3.38],[122.26,-3.53],[122.25,-3.58],[122.25,-3.62],[122.29,-3.66],[122.33,-3.69],[122.39,-3.71],[122.43,-3.74],[122.53,-3.85],[122.58,-3.88],[122.61,-3.92],[122.61,-3.98],[122.65,-4.02],[122.69,-4.08],[122.75,-4.1],[122.78,-4.08],[122.8,-4.05],[122.85,-4.06],[122.88,-4.11],[122.89,-4.17],[122.9,-4.23],[122.9,-4.35],[122.87,-4.39],[122.82,-4.39],[122.72,-4.34],[122.72,-4.38],[122.72,-4.41],[122.67,-4.42],[122.61,-4.42],[122.47,-4.42],[122.21,-4.5],[122.11,-4.54],[122.05,-4.62],[122.05,-4.68],[122.07,-4.79],[122.04,-4.83],[121.92,-4.85],[121.75,-4.82],[121.65,-4.79],[121.59,-4.76],[121.51,-4.68],[121.49,-4.58],[121.54,-4.28],[121.56,-4.24],[121.58,-4.21],[121.61,-4.16],[121.62,-4.09],[121.54,-4.01],[121.42,-3.98],[121.31,-3.92],[120.91,-3.56],[120.89,-3.52],[120.89,-3.46],[120.91,-3.4],[121.04,-3.21],[121.05,-3.17],[121.07,-3.01],[121.07,-2.88],[121.05,-2.75],[120.99,-2.67],[120.88,-2.65],[120.77,-2.64],[120.65,-2.67],[120.54,-2.73],[120.34,-2.87],[120.26,-2.95],[120.25,-3.05],[120.3,-3.15],[120.36,-3.25],[120.39,-3.35],[120.44,-3.71],[120.44,-3.75],[120.38,-3.85],[120.36,-4.09],[120.38,-4.42],[120.42,-4.62],[120.4,-4.73],[120.31,-4.96],[120.28,-5.09],[120.28,-5.15],[120.39,-5.39],[120.42,-5.49],[120.43,-5.59],[120.31,-5.54],[120.26,-5.54],[120.2,-5.56],[120.08,-5.58],[119.95,-5.58],[119.91,-5.6],[119.82,-5.66],[119.76,-5.69],[119.72,-5.69],[119.56,-5.61],[119.46,-5.52],[119.38,-5.42],[119.36,-5.31],[119.39,-5.2],[119.43,-5.08],[119.52,-4.88],[119.52,-4.74],[119.54,-4.63],[119.59,-4.52],[119.61,-4.42],[119.62,-4.03],[119.61,-4.0],[119.49,-3.77],[119.48,-3.73],[119.48,-3.67],[119.49,-3.61],[119.49,-3.55],[119.47,-3.51],[119.42,-3.48],[119.36,-3.46],[119.24,-3.48],[118.99,-3.54],[118.92,-3.48],[118.87,-3.4],[118.83,-3.28],[118.81,-3.16],[118.82,-3.04],[118.86,-2.93],[118.83,-2.85],[118.78,-2.76],[118.78,-2.72],[118.81,-2.68],[118.85,-2.65],[118.91,-2.63],[118.96,-2.6],[119.09,-2.48],[119.14,-2.38],[119.14,-2.26],[119.17,-2.14],[119.24,-2.03],[119.32,-1.93],[119.35,-1.83],[119.31,-1.66],[119.32,-1.58],[119.31,-1.5],[119.31,-1.41],[119.36,-1.24],[119.51,-0.91],[119.65,-0.73],[119.71,-0.68],[119.79,-0.76],[119.84,-0.86],[119.85,-0.77],[119.83,-0.69],[119.77,-0.48],[119.72,-0.09],[119.74,-0.05],[119.79,-0.06],[119.84,-0.02],[119.87,0.04],[119.81,0.19],[119.81,0.24],[119.91,0.45],[120.0,0.52],[120.04,0.57],[120.06,0.69],[120.1,0.74],[120.16,0.77],[120.23,0.86],[120.27,0.97],[120.29,0.98],[120.32,0.98],[120.37,0.89],[120.42,0.85],[120.52,0.82],[120.6,0.85],[120.63,0.9],[120.66,0.94],[120.71,0.99],[120.75,1.04],[120.8,1.15],[120.87,1.25],[120.91,1.29],[120.97,1.31],[121.02,1.33],[121.08,1.33],[121.21,1.26],[121.28,1.25],[121.36,1.25],[121.4,1.24],[121.44,1.21],[121.47,1.16],[121.51,1.1],[121.55,1.08],[121.59,1.07],[121.87,1.09],[122.11,1.03],[122.44,1.02],[122.55,0.98],[122.66,0.94],[122.79,0.86],[122.84,0.85],[122.89,0.85],[122.96,0.92],[123.01,0.94],[123.07,0.94],[123.28,0.93],[123.85,0.84],[123.93,0.85],[124.27,1.02],[124.41,1.19],[124.53,1.23],[124.58,1.3],[124.6,1.39],[124.64,1.42],[124.75,1.44],[124.79,1.47],[124.86,1.58],[124.95,1.67],[124.99,1.7],[125.11,1.69],[125.16,1.64],[125.23,1.5],[125.22,1.48],[125.14,1.41],[125.12,1.38],[125.03,1.18],[124.97,1.08],[124.89,1.0]],[[101.71,2.08],[101.76,2.0],[101.77,1.94],[101.73,1.88],[101.72,1.79],[101.6,1.72],[101.5,1.73],[101.47,1.76],[101.4,1.9],[101.41,2.02],[101.45,2.07],[101.54,2.06],[101.64,2.13],[101.71,2.08]],[[127.73,0.85],[127.81,0.83],[127.88,0.83],[127.92,0.88],[127.93,0.93],[127.97,1.04],[128.06,1.12],[128.12,1.13],[128.16,1.16],[128.15,1.24],[128.16,1.32],[128.22,1.4],[128.42,1.52],[128.54,1.56],[128.69,1.57],[128.71,1.53],[128.69,1.46],[128.72,1.37],[128.7,1.11],[128.67,1.07],[128.51,0.98],[128.35,0.91],[128.3,0.88],[128.26,0.8],[128.26,0.73],[128.4,0.64],[128.61,0.55],[128.66,0.51],[128.68,0.44],[128.69,0.36],[128.74,0.32],[128.82,0.31],[128.86,0.27],[128.9,0.22],[128.54,0.34],[128.45,0.39],[128.33,0.4],[128.22,0.41],[128.11,0.46],[127.98,0.47],[127.92,0.44],[127.9,0.37],[127.89,0.3],[127.91,0.21],[127.91,0.15],[127.89,0.05],[127.98,-0.25],[128.09,-0.49],[128.25,-0.73],[128.33,-0.82],[128.43,-0.89],[128.28,-0.87],[128.23,-0.79],[128.05,-0.71],[128.01,-0.66],[127.89,-0.42],[127.85,-0.38],[127.74,-0.3],[127.69,-0.24],[127.67,-0.16],[127.69,-0.08],[127.68,0.03],[127.69,0.15],[127.71,0.29],[127.67,0.34],[127.62,0.38],[127.56,0.49],[127.54,0.61],[127.54,0.68],[127.57,0.74],[127.6,0.8],[127.61,0.85],[127.52,0.92],[127.43,1.14],[127.42,1.25],[127.54,1.47],[127.53,1.57],[127.56,1.63],[127.57,1.7],[127.63,1.84],[127.73,1.97],[127.9,2.14],[127.96,2.17],[128.04,2.2],[128.04,2.16],[128.03,2.12],[127.91,1.95],[127.89,1.91],[127.89,1.83],[127.95,1.79],[128.01,1.7],[128.02,1.58],[128.03,1.46],[128.01,1.33],[127.99,1.29],[127.89,1.16],[127.65,1.01],[127.63,0.98],[127.63,0.94],[127.68,0.89],[127.73,0.85]],[[97.33,2.08],[97.33,2.05],[97.23,2.16],[97.11,2.22],[97.16,2.23],[97.25,2.22],[97.29,2.2],[97.33,2.15],[97.33,2.08]],[[128.45,2.05],[128.3,2.03],[128.26,2.08],[128.22,2.3],[128.33,2.47],[128.47,2.57],[128.57,2.6],[128.6,2.6],[128.69,2.47],[128.62,2.22],[128.55,2.1],[128.45,2.05]],[[125.41,2.65],[125.4,2.63],[125.36,2.75],[125.39,2.81],[125.44,2.78],[125.45,2.76],[125.4,2.71],[125.41,2.65]],[[96.46,2.36],[96.4,2.35],[96.34,2.37],[96.29,2.43],[96.02,2.6],[95.94,2.6],[95.88,2.64],[95.81,2.66],[95.73,2.77],[95.72,2.83],[95.77,2.85],[95.81,2.92],[95.9,2.89],[96.0,2.78],[96.1,2.74],[96.13,2.72],[96.18,2.66],[96.42,2.52],[96.44,2.47],[96.46,2.42],[96.46,2.36]],[[108.89,2.91],[108.84,2.85],[108.79,2.89],[108.87,2.99],[108.89,3.0],[108.89,2.91]],[[105.76,2.86],[105.72,2.86],[105.71,2.89],[105.71,2.94],[105.7,2.98],[105.69,3.01],[105.69,3.06],[105.73,3.04],[105.76,3.01],[105.79,3.0],[105.82,2.98],[105.84,2.98],[105.81,2.9],[105.76,2.86]],[[106.29,3.16],[106.28,3.09],[106.21,3.13],[106.2,3.2],[106.22,3.23],[106.27,3.22],[106.29,3.16]],[[117.66,3.28],[117.65,3.25],[117.56,3.33],[117.54,3.39],[117.55,3.43],[117.64,3.44],[117.68,3.41],[117.66,3.28]],[[125.66,3.44],[125.63,3.41],[125.51,3.46],[125.52,3.55],[125.5,3.59],[125.47,3.64],[125.46,3.68],[125.47,3.73],[125.54,3.67],[125.59,3.57],[125.64,3.48],[125.66,3.44]],[[126.85,3.77],[126.84,3.76],[126.8,3.78],[126.78,3.81],[126.78,3.84],[126.8,3.86],[126.86,3.81],[126.86,3.79],[126.85,3.77]],[[126.72,3.87],[126.72,3.83],[126.66,3.93],[126.64,4.04],[126.69,4.0],[126.74,3.92],[126.72,3.87]],[[117.88,4.19],[117.92,4.09],[117.92,4.05],[117.74,4.0],[117.63,4.12],[117.65,4.17],[117.75,4.17],[117.88,4.19]],[[108.32,3.69],[108.18,3.65],[108.1,3.7],[108.19,3.77],[108.22,3.77],[108.24,3.78],[108.24,3.81],[108.09,3.85],[108.04,3.89],[108.0,3.98],[108.0,4.04],[108.2,4.2],[108.25,4.22],[108.26,4.15],[108.39,3.99],[108.4,3.88],[108.39,3.84],[108.32,3.69]],[[117.57,4.17],[117.57,4.16],[117.5,4.13],[117.47,4.08],[117.56,3.99],[117.57,3.93],[117.64,3.88],[117.73,3.8],[117.73,3.77],[117.76,3.73],[117.78,3.69],[117.71,3.64],[117.63,3.64],[117.57,3.68],[117.51,3.73],[117.49,3.67],[117.45,3.63],[117.29,3.64],[117.17,3.64],[117.06,3.62],[117.11,3.61],[117.17,3.59],[117.35,3.43],[117.38,3.37],[117.32,3.24],[117.35,3.19],[117.42,3.17],[117.51,3.1],[117.57,3.1],[117.61,3.06],[117.61,3.0],[117.64,2.95],[117.57,2.93],[117.64,2.91],[117.7,2.89],[117.66,2.86],[117.64,2.83],[117.67,2.81],[117.75,2.78],[117.79,2.75],[117.8,2.67],[117.89,2.54],[118.03,2.38],[118.07,2.32],[118.07,2.26],[118.04,2.22],[117.96,2.16],[117.89,2.09],[117.88,2.06],[117.79,2.03],[117.83,2.0],[117.86,1.97],[117.93,1.87],[118.08,1.7],[118.16,1.64],[118.47,1.42],[118.64,1.32],[118.85,1.1],[118.96,1.04],[118.98,0.98],[118.89,0.89],[118.76,0.84],[118.53,0.81],[118.31,0.85],[118.2,0.87],[118.1,0.93],[118.02,1.04],[117.91,1.1],[117.95,1.03],[117.98,0.96],[117.96,0.89],[117.92,0.83],[117.85,0.79],[117.78,0.75],[117.75,0.73],[117.55,0.34],[117.52,0.24],[117.46,-0.2],[117.46,-0.32],[117.55,-0.55],[117.56,-0.68],[117.57,-0.73],[117.56,-0.77],[117.52,-0.8],[117.36,-0.87],[117.24,-0.93],[117.15,-1.01],[117.07,-1.11],[117.0,-1.19],[116.91,-1.22],[116.85,-1.22],[116.8,-1.18],[116.76,-1.12],[116.74,-1.04],[116.73,-1.1],[116.73,-1.15],[116.76,-1.21],[116.77,-1.27],[116.75,-1.33],[116.72,-1.38],[116.61,-1.43],[116.55,-1.47],[116.55,-1.55],[116.52,-1.6],[116.48,-1.63],[116.33,-1.71],[116.3,-1.74],[116.28,-1.78],[116.35,-1.78],[116.42,-1.78],[116.43,-1.86],[116.45,-1.92],[116.42,-2.05],[116.31,-2.14],[116.37,-2.16],[116.42,-2.19],[116.53,-2.21],[116.57,-2.3],[116.55,-2.41],[116.53,-2.51],[116.45,-2.54],[116.4,-2.52],[116.35,-2.52],[116.32,-2.55],[116.31,-2.6],[116.38,-2.58],[116.37,-2.71],[116.35,-2.83],[116.33,-2.9],[116.29,-2.96],[116.23,-2.98],[116.17,-2.93],[116.15,-2.98],[116.17,-3.03],[116.26,-3.13],[116.21,-3.15],[116.17,-3.18],[116.15,-3.23],[116.06,-3.35],[116.02,-3.43],[116.0,-3.52],[115.96,-3.6],[115.26,-3.91],[114.69,-4.17],[114.65,-4.15],[114.63,-4.11],[114.61,-3.7],[114.54,-3.49],[114.53,-3.38],[114.45,-3.48],[114.4,-3.47],[114.34,-3.44],[114.3,-3.41],[114.3,-3.36],[114.34,-3.24],[114.29,-3.31],[114.24,-3.36],[114.18,-3.35],[114.13,-3.33],[114.11,-3.29],[114.08,-3.28],[113.96,-3.39],[113.8,-3.46],[113.71,-3.46],[113.63,-3.42],[113.64,-3.33],[113.63,-3.25],[113.61,-3.2],[113.57,-3.18],[113.53,-3.18],[113.41,-3.23],[113.37,-3.22],[113.34,-3.25],[113.03,-2.93],[112.97,-3.19],[112.76,-3.32],[112.6,-3.4],[112.44,-3.37],[112.28,-3.32],[112.13,-3.38],[111.95,-3.53],[111.91,-3.55],[111.86,-3.55],[111.82,-3.53],[111.83,-3.42],[111.84,-3.31],[111.82,-3.06],[111.81,-3.01],[111.76,-2.94],[111.69,-2.89],[111.66,-2.93],[111.63,-2.98],[111.49,-2.97],[111.37,-2.93],[111.26,-2.96],[111.04,-3.06],[110.93,-3.07],[110.87,-3.05],[110.83,-3.0],[110.85,-2.95],[110.9,-2.91],[110.81,-2.94],[110.74,-2.99],[110.7,-3.02],[110.67,-3.0],[110.57,-2.89],[110.38,-2.93],[110.35,-2.95],[110.3,-2.99],[110.26,-2.97],[110.23,-2.93],[110.22,-2.69],[110.12,-2.23],[110.1,-2.0],[110.08,-1.95],[109.96,-1.86],[109.96,-1.74],[110.02,-1.64],[110.04,-1.53],[110.02,-1.4],[109.98,-1.27],[109.94,-1.18],[109.87,-1.1],[109.79,-1.01],[109.68,-0.94],[109.45,-0.87],[109.33,-0.88],[109.29,-0.85],[109.26,-0.81],[109.27,-0.73],[109.31,-0.68],[109.37,-0.67],[109.37,-0.64],[109.26,-0.58],[109.16,-0.49],[109.13,-0.45],[109.12,-0.39],[109.12,-0.27],[109.15,-0.19],[109.16,-0.14],[109.19,-0.01],[109.26,0.03],[109.25,0.06],[109.22,0.07],[109.18,0.12],[109.15,0.17],[109.07,0.25],[108.94,0.36],[108.92,0.53],[108.91,0.79],[108.92,0.91],[108.96,1.13],[109.03,1.2],[109.09,1.22],[109.13,1.25],[109.1,1.26],[109.07,1.25],[109.01,1.24],[109.06,1.44],[109.08,1.5],[109.17,1.61],[109.27,1.71],[109.32,1.82],[109.38,1.92],[109.63,2.03],[109.54,1.9],[109.55,1.85],[109.57,1.81],[109.64,1.78],[109.65,1.61],[109.74,1.52],[109.82,1.44],[109.88,1.4],[109.94,1.34],[109.99,1.28],[110.04,1.24],[110.11,1.19],[110.32,1.0],[110.4,0.94],[110.46,0.88],[110.51,0.86],[110.61,0.88],[110.94,1.02],[111.0,1.03],[111.1,1.05],[111.29,1.04],[111.48,1.0],[111.55,0.99],[111.61,1.02],[111.69,1.01],[111.77,1.0],[111.81,1.01],[111.92,1.11],[112.08,1.14],[112.13,1.24],[112.17,1.34],[112.19,1.44],[112.25,1.48],[112.34,1.51],[112.48,1.56],[112.94,1.57],[112.99,1.55],[113.0,1.5],[112.99,1.46],[113.01,1.43],[113.07,1.43],[113.13,1.41],[113.36,1.33],[113.46,1.3],[113.51,1.31],[113.62,1.24],[113.68,1.26],[113.76,1.31],[113.84,1.38],[113.9,1.43],[114.0,1.46],[114.13,1.45],[114.27,1.47],[114.39,1.5],[114.51,1.45],[114.55,1.47],[114.57,1.51],[114.63,1.62],[114.66,1.69],[114.69,1.82],[114.7,1.85],[114.75,1.87],[114.8,1.89],[114.81,1.93],[114.83,1.98],[114.82,2.02],[114.79,2.05],[114.76,2.16],[114.77,2.21],[114.79,2.25],[114.84,2.27],[114.97,2.35],[115.09,2.45],[115.15,2.49],[115.18,2.52],[115.18,2.57],[115.13,2.61],[115.08,2.63],[115.08,2.69],[115.08,2.72],[115.09,2.76],[115.09,2.79],[115.09,2.84],[115.12,2.89],[115.19,2.97],[115.25,3.03],[115.31,2.99],[115.38,3.01],[115.45,3.03],[115.49,3.13],[115.5,3.17],[115.49,3.21],[115.51,3.34],[115.52,3.36],[115.57,3.45],[115.57,3.5],[115.54,3.63],[115.56,3.73],[115.57,3.94],[115.6,3.98],[115.63,4.08],[115.68,4.19],[115.78,4.25],[115.84,4.33],[115.86,4.35],[115.9,4.35],[116.02,4.29],[116.13,4.36],[116.24,4.36],[116.32,4.35],[116.37,4.33],[116.41,4.31],[116.51,4.37],[116.55,4.36],[116.59,4.34],[116.64,4.34],[116.7,4.35],[116.84,4.34],[117.1,4.34],[117.28,4.3],[117.45,4.19],[117.54,4.17],[117.57,4.17]],[[126.82,4.03],[126.78,4.01],[126.71,4.02],[126.7,4.07],[126.77,4.16],[126.81,4.26],[126.77,4.28],[126.72,4.34],[126.72,4.42],[126.76,4.55],[126.81,4.54],[126.87,4.48],[126.89,4.37],[126.92,4.29],[126.85,4.18],[126.82,4.03]],[[96.49,5.23],[96.62,5.22],[96.84,5.27],[96.97,5.27],[97.09,5.23],[97.19,5.21],[97.45,5.24],[97.5,5.23],[97.55,5.21],[97.59,5.17],[97.71,5.04],[97.91,4.88],[97.97,4.78],[98.0,4.66],[98.02,4.64],[98.25,4.41],[98.27,4.32],[98.24,4.19],[98.31,4.09],[98.53,4.0],[98.66,3.93],[98.69,3.89],[98.71,3.83],[98.78,3.76],[98.87,3.71],[99.15,3.58],[99.52,3.31],[99.73,3.18],[99.91,2.99],[99.97,2.89],[100.02,2.79],[100.13,2.65],[100.31,2.47],[100.35,2.41],[100.4,2.33],[100.46,2.26],[100.52,2.19],[100.6,2.14],[100.69,2.12],[100.82,1.99],[100.89,1.95],[100.88,2.05],[100.82,2.14],[100.82,2.19],[100.83,2.24],[100.88,2.28],[100.94,2.29],[101.05,2.26],[101.23,2.1],[101.3,2.01],[101.36,1.89],[101.41,1.76],[101.48,1.69],[101.58,1.67],[101.68,1.66],[101.78,1.62],[102.02,1.44],[102.1,1.36],[102.16,1.26],[102.2,1.14],[102.22,1.02],[102.24,0.99],[102.39,0.84],[102.47,0.78],[102.57,0.75],[102.85,0.72],[102.95,0.66],[103.03,0.58],[103.07,0.49],[103.01,0.42],[102.79,0.3],[102.55,0.22],[102.78,0.24],[102.9,0.28],[103.0,0.33],[103.11,0.4],[103.28,0.49],[103.34,0.51],[103.41,0.51],[103.48,0.48],[103.58,0.39],[103.67,0.29],[103.74,0.17],[103.79,0.05],[103.71,-0.02],[103.59,-0.07],[103.43,-0.19],[103.41,-0.24],[103.44,-0.27],[103.41,-0.36],[103.5,-0.42],[103.51,-0.47],[103.43,-0.53],[103.44,-0.58],[103.53,-0.75],[103.58,-0.8],[103.72,-0.89],[103.94,-0.98],[104.06,-1.02],[104.2,-1.05],[104.26,-1.05],[104.36,-1.04],[104.38,-1.07],[104.43,-1.25],[104.45,-1.36],[104.48,-1.6],[104.52,-1.7],[104.52,-1.82],[104.57,-1.92],[104.68,-1.99],[104.79,-2.04],[104.85,-2.09],[104.84,-2.17],[104.83,-2.23],[104.79,-2.28],[104.67,-2.39],[104.65,-2.43],[104.63,-2.54],[104.65,-2.6],[104.7,-2.6],[104.74,-2.57],[104.88,-2.42],[104.92,-2.39],[104.97,-2.37],[105.03,-2.36],[105.29,-2.36],[105.4,-2.38],[105.5,-2.43],[105.58,-2.49],[105.9,-2.89],[106.04,-3.11],[106.06,-3.16],[106.06,-3.22],[106.03,-3.26],[105.9,-3.41],[105.89,-3.45],[105.84,-3.61],[105.85,-3.73],[105.9,-3.78],[105.93,-3.83],[105.93,-3.88],[105.84,-4.12],[105.83,-4.16],[105.89,-4.55],[105.89,-4.66],[105.88,-4.79],[105.89,-5.01],[105.82,-5.68],[105.8,-5.72],[105.75,-5.82],[105.68,-5.82],[105.62,-5.8],[105.58,-5.76],[105.56,-5.71],[105.52,-5.67],[105.35,-5.55],[105.3,-5.57],[105.13,-5.72],[105.08,-5.75],[105.02,-5.73],[104.93,-5.68],[104.64,-5.52],[104.62,-5.57],[104.62,-5.64],[104.68,-5.82],[104.68,-5.89],[104.63,-5.91],[104.6,-5.9],[104.48,-5.8],[104.37,-5.69],[104.24,-5.54],[104.15,-5.47],[104.07,-5.39],[103.83,-5.08],[103.77,-5.03],[103.41,-4.82],[103.33,-4.77],[103.24,-4.68],[103.14,-4.6],[102.92,-4.47],[102.54,-4.15],[102.37,-3.97],[102.19,-3.67],[102.13,-3.6],[101.82,-3.38],[101.65,-3.24],[101.58,-3.17],[101.41,-2.9],[101.37,-2.81],[101.31,-2.73],[101.21,-2.66],[101.12,-2.59],[100.94,-2.35],[100.89,-2.25],[100.85,-2.14],[100.86,-1.93],[100.49,-1.3],[100.39,-1.1],[100.31,-0.83],[100.29,-0.8],[100.09,-0.55],[100.02,-0.47],[99.93,-0.4],[99.86,-0.31],[99.72,-0.03],[99.67,0.05],[99.6,0.1],[99.33,0.21],[99.24,0.27],[99.16,0.35],[99.11,0.46],[99.06,0.69],[98.94,1.03],[98.8,1.49],[98.7,1.7],[98.6,1.86],[98.56,1.9],[98.09,2.2],[98.01,2.24],[97.92,2.26],[97.8,2.28],[97.7,2.36],[97.66,2.49],[97.64,2.68],[97.62,2.79],[97.59,2.85],[97.39,2.98],[97.31,3.08],[97.25,3.19],[97.19,3.28],[96.97,3.58],[96.89,3.65],[96.8,3.71],[96.53,3.77],[96.44,3.82],[96.31,3.99],[96.23,4.07],[95.99,4.26],[95.58,4.66],[95.49,4.76],[95.43,4.87],[95.38,4.98],[95.21,5.28],[95.22,5.35],[95.25,5.41],[95.24,5.46],[95.22,5.52],[95.23,5.56],[95.28,5.59],[95.4,5.63],[95.52,5.62],[95.63,5.61],[95.74,5.58],[95.84,5.51],[96.03,5.35],[96.13,5.29],[96.25,5.27],[96.49,5.23]],[[95.36,5.81],[95.34,5.78],[95.28,5.8],[95.22,5.89],[95.24,5.91],[95.28,5.9],[95.36,5.88],[95.37,5.84],[95.36,5.81]]]},{"n":"Isle of Man","r":[[[-4.41,54.19],[-4.61,54.06],[-4.7,54.08],[-4.77,54.07],[-4.79,54.07],[-4.75,54.12],[-4.7,54.22],[-4.61,54.27],[-4.51,54.38],[-4.42,54.41],[-4.4,54.4],[-4.38,54.39],[-4.34,54.27],[-4.39,54.23],[-4.41,54.19]]]},{"n":"India","r":[[[92.57,21.98],[92.56,22.05],[92.53,22.41],[92.51,22.53],[92.49,22.69],[92.46,22.73],[92.43,22.82],[92.39,22.9],[92.36,22.93],[92.34,23.07],[92.33,23.24],[92.33,23.32],[92.29,23.49],[92.25,23.68],[92.19,23.68],[92.15,23.72],[92.13,23.72],[92.04,23.68],[91.98,23.69],[91.93,23.69],[91.93,23.6],[91.94,23.5],[91.92,23.47],[91.79,23.36],[91.75,23.29],[91.76,23.21],[91.77,23.11],[91.75,23.05],[91.69,23.0],[91.62,22.98],[91.55,22.99],[91.51,23.03],[91.47,23.14],[91.44,23.2],[91.4,23.21],[91.37,23.2],[91.37,23.13],[91.37,23.07],[91.36,23.07],[91.34,23.08],[91.32,23.1],[91.25,23.37],[91.17,23.58],[91.16,23.66],[91.19,23.76],[91.23,23.92],[91.34,24.02],[91.35,24.06],[91.37,24.09],[91.39,24.1],[91.53,24.09],[91.57,24.11],[91.61,24.15],[91.67,24.19],[91.73,24.21],[91.77,24.21],[91.85,24.18],[91.88,24.2],[91.9,24.26],[91.93,24.33],[91.95,24.36],[92.0,24.37],[92.06,24.37],[92.09,24.39],[92.1,24.41],[92.12,24.49],[92.2,24.69],[92.23,24.77],[92.23,24.79],[92.23,24.88],[92.25,24.9],[92.38,24.85],[92.44,24.85],[92.48,24.87],[92.49,24.9],[92.47,24.94],[92.37,25.02],[92.2,25.11],[92.05,25.17],[91.76,25.16],[91.48,25.14],[91.4,25.15],[91.29,25.18],[91.04,25.17],[90.73,25.16],[90.61,25.17],[90.56,25.17],[90.44,25.16],[90.25,25.18],[90.12,25.22],[90.0,25.26],[89.87,25.29],[89.83,25.29],[89.81,25.31],[89.8,25.34],[89.8,25.38],[89.82,25.56],[89.8,25.84],[89.82,25.94],[89.71,26.17],[89.67,26.21],[89.62,26.22],[89.59,26.19],[89.57,26.13],[89.59,26.07],[89.55,26.01],[89.47,25.98],[89.37,26.01],[89.29,26.04],[89.19,26.11],[89.11,26.2],[89.1,26.31],[89.07,26.38],[89.02,26.41],[88.98,26.42],[88.95,26.41],[88.92,26.38],[88.95,26.34],[88.98,26.29],[88.97,26.25],[88.94,26.25],[88.9,26.26],[88.83,26.25],[88.76,26.28],[88.72,26.28],[88.68,26.29],[88.68,26.35],[88.62,26.43],[88.52,26.52],[88.42,26.57],[88.37,26.56],[88.35,26.5],[88.35,26.48],[88.39,26.47],[88.44,26.44],[88.45,26.4],[88.44,26.37],[88.38,26.31],[88.33,26.26],[88.24,26.18],[88.15,26.09],[88.13,26.02],[88.1,25.96],[88.08,25.89],[88.11,25.84],[88.15,25.81],[88.25,25.79],[88.36,25.7],[88.45,25.57],[88.5,25.54],[88.59,25.5],[88.77,25.49],[88.8,25.46],[88.82,25.37],[88.85,25.33],[88.94,25.29],[88.95,25.26],[88.93,25.22],[88.89,25.19],[88.82,25.18],[88.75,25.17],[88.68,25.18],[88.57,25.19],[88.46,25.19],[88.37,24.96],[88.31,24.88],[88.28,24.88],[88.19,24.92],[88.15,24.91],[88.05,24.71],[88.03,24.66],[88.02,24.63],[88.08,24.55],[88.15,24.49],[88.22,24.46],[88.29,24.48],[88.34,24.45],[88.4,24.39],[88.5,24.35],[88.64,24.33],[88.72,24.27],[88.73,24.23],[88.73,24.19],[88.71,24.07],[88.7,24.0],[88.62,23.83],[88.57,23.67],[88.6,23.6],[88.62,23.57],[88.64,23.55],[88.7,23.49],[88.74,23.44],[88.7,23.29],[88.72,23.25],[88.81,23.23],[88.9,23.21],[88.93,23.19],[88.85,23.04],[88.87,22.94],[88.9,22.84],[88.92,22.69],[88.93,22.67],[88.92,22.63],[88.97,22.51],[89.05,22.27],[89.06,22.19],[89.05,22.09],[89.03,21.94],[88.95,21.94],[89.02,21.83],[89.04,21.76],[89.05,21.65],[88.97,21.64],[88.91,21.65],[88.86,21.74],[88.83,21.66],[88.75,21.58],[88.71,21.62],[88.69,21.66],[88.69,21.73],[88.74,22.01],[88.73,22.04],[88.71,22.06],[88.66,22.07],[88.64,22.12],[88.57,21.83],[88.6,21.71],[88.58,21.66],[88.45,21.61],[88.31,21.72],[88.29,21.76],[88.28,21.7],[88.25,21.62],[88.12,21.64],[88.06,21.69],[88.1,21.79],[88.18,22.03],[88.2,22.14],[88.09,22.22],[87.99,22.27],[87.94,22.37],[87.96,22.26],[88.01,22.21],[88.08,22.18],[88.16,22.12],[88.1,22.05],[88.05,22.0],[87.95,21.83],[87.82,21.73],[87.68,21.65],[87.2,21.54],[87.1,21.5],[86.95,21.37],[86.86,21.24],[86.84,21.11],[86.9,20.97],[86.94,20.75],[86.98,20.7],[86.92,20.62],[86.84,20.53],[86.76,20.42],[86.77,20.36],[86.75,20.31],[86.5,20.17],[86.45,20.09],[86.38,20.01],[86.29,20.05],[86.25,20.05],[86.31,19.99],[86.3,19.94],[86.28,19.92],[86.22,19.9],[85.85,19.79],[85.58,19.69],[85.5,19.7],[85.51,19.73],[85.56,19.75],[85.56,19.87],[85.5,19.89],[85.46,19.9],[85.25,19.76],[85.16,19.62],[85.18,19.59],[85.23,19.6],[85.37,19.68],[85.44,19.66],[85.44,19.63],[85.23,19.51],[84.77,19.13],[84.75,19.05],[84.69,18.96],[84.61,18.88],[84.46,18.69],[84.18,18.4],[84.1,18.29],[83.65,18.07],[83.57,18.0],[83.39,17.79],[83.2,17.61],[82.98,17.46],[82.59,17.27],[82.36,17.1],[82.29,16.98],[82.28,16.94],[82.31,16.88],[82.35,16.83],[82.36,16.78],[82.34,16.71],[82.33,16.66],[82.26,16.56],[82.14,16.49],[81.76,16.33],[81.71,16.33],[81.4,16.37],[81.29,16.34],[81.24,16.26],[81.13,15.96],[81.03,15.88],[80.99,15.81],[80.98,15.76],[80.92,15.76],[80.86,15.78],[80.83,15.77],[80.78,15.87],[80.71,15.89],[80.65,15.9],[80.38,15.79],[80.29,15.71],[80.1,15.32],[80.05,15.07],[80.1,14.8],[80.17,14.58],[80.18,14.48],[80.17,14.35],[80.14,14.29],[80.11,14.21],[80.14,14.06],[80.22,13.86],[80.24,13.77],[80.25,13.69],[80.31,13.49],[80.27,13.52],[80.23,13.61],[80.16,13.71],[80.06,13.61],[80.11,13.53],[80.29,13.44],[80.34,13.36],[80.23,12.69],[80.14,12.45],[80.04,12.3],[79.98,12.24],[79.86,11.99],[79.77,11.69],[79.75,11.58],[79.79,11.45],[79.75,11.37],[79.69,11.31],[79.8,11.34],[79.84,11.27],[79.85,11.2],[79.85,10.77],[79.84,10.32],[79.76,10.3],[79.67,10.3],[79.59,10.31],[79.53,10.33],[79.39,10.31],[79.31,10.26],[79.25,10.17],[79.26,10.04],[79.0,9.68],[78.94,9.57],[78.92,9.45],[78.95,9.39],[79.02,9.33],[79.11,9.31],[79.28,9.28],[79.36,9.25],[79.41,9.19],[79.21,9.26],[78.98,9.27],[78.42,9.11],[78.27,8.99],[78.19,8.89],[78.14,8.66],[78.13,8.51],[78.06,8.38],[77.77,8.19],[77.59,8.13],[77.52,8.08],[77.3,8.15],[77.07,8.32],[76.97,8.41],[76.62,8.85],[76.55,8.9],[76.48,9.09],[76.47,9.16],[76.45,9.19],[76.42,9.21],[76.4,9.24],[76.32,9.45],[76.29,9.68],[76.24,9.93],[76.28,9.91],[76.34,9.83],[76.37,9.71],[76.38,9.54],[76.42,9.52],[76.46,9.54],[76.35,9.92],[76.25,10.02],[76.22,10.02],[76.2,10.09],[76.19,10.16],[76.2,10.2],[76.12,10.33],[76.1,10.4],[75.92,10.78],[75.84,11.06],[75.72,11.36],[75.65,11.47],[75.52,11.7],[75.42,11.81],[75.31,11.96],[75.23,12.02],[75.2,12.06],[74.95,12.56],[74.87,12.84],[74.8,12.98],[74.77,13.08],[74.68,13.51],[74.68,13.58],[74.67,13.67],[74.61,13.85],[74.5,14.05],[74.47,14.17],[74.47,14.22],[74.4,14.41],[74.38,14.49],[74.34,14.58],[74.28,14.65],[74.22,14.71],[74.09,14.9],[74.04,14.95],[73.95,15.07],[73.88,15.31],[73.8,15.4],[73.93,15.4],[73.85,15.48],[73.81,15.54],[73.77,15.57],[73.83,15.66],[73.73,15.66],[73.68,15.71],[73.61,15.87],[73.48,16.05],[73.45,16.15],[73.34,16.46],[73.24,17.2],[73.15,17.53],[73.16,17.62],[73.05,17.91],[72.99,18.1],[72.97,18.26],[72.94,18.37],[72.92,18.58],[72.88,18.64],[72.87,18.68],[72.9,18.78],[72.98,18.93],[73.01,19.02],[72.97,19.15],[72.9,19.01],[72.83,18.98],[72.8,19.08],[72.8,19.22],[72.79,19.25],[72.81,19.3],[72.99,19.28],[72.79,19.36],[72.76,19.41],[72.76,19.45],[72.8,19.52],[72.73,19.58],[72.7,19.76],[72.68,19.8],[72.67,19.83],[72.71,20.08],[72.88,20.56],[72.89,20.67],[72.88,20.83],[72.84,20.95],[72.82,21.08],[72.81,21.12],[72.75,21.13],[72.69,21.18],[72.62,21.37],[72.69,21.44],[72.73,21.47],[72.67,21.46],[72.61,21.46],[72.72,21.55],[72.81,21.62],[73.02,21.7],[73.11,21.75],[72.98,21.7],[72.84,21.69],[72.54,21.7],[72.59,21.88],[72.64,21.94],[72.7,21.97],[72.62,21.96],[72.52,21.98],[72.55,22.16],[72.63,22.2],[72.71,22.21],[72.81,22.23],[72.7,22.26],[72.59,22.28],[72.46,22.25],[72.33,22.27],[72.18,22.27],[72.24,22.25],[72.31,22.19],[72.27,22.09],[72.24,22.03],[72.16,21.98],[72.09,21.92],[72.08,21.86],[72.04,21.82],[72.1,21.79],[72.17,21.77],[72.21,21.73],[72.26,21.66],[72.25,21.53],[72.08,21.22],[72.02,21.16],[71.57,20.97],[71.4,20.87],[71.02,20.74],[70.88,20.71],[70.72,20.74],[70.49,20.84],[70.13,21.09],[70.03,21.18],[69.75,21.51],[69.54,21.68],[69.39,21.84],[69.19,21.99],[69.01,22.2],[68.97,22.29],[68.98,22.39],[69.05,22.44],[69.13,22.42],[69.19,22.34],[69.24,22.3],[69.28,22.29],[69.55,22.41],[69.66,22.4],[69.73,22.47],[69.82,22.45],[70.01,22.55],[70.08,22.55],[70.18,22.57],[70.33,22.82],[70.44,22.97],[70.51,23.0],[70.51,23.04],[70.49,23.09],[70.43,23.08],[70.4,23.03],[70.37,22.97],[70.34,22.94],[70.25,22.97],[70.19,22.97],[70.12,22.95],[69.85,22.86],[69.74,22.78],[69.66,22.76],[69.24,22.85],[68.82,23.05],[68.64,23.19],[68.53,23.36],[68.42,23.57],[68.45,23.63],[68.63,23.75],[68.78,23.85],[68.64,23.81],[68.5,23.75],[68.42,23.71],[68.34,23.62],[68.23,23.6],[68.19,23.73],[68.17,23.86],[68.23,23.9],[68.28,23.93],[68.38,23.95],[68.49,23.97],[68.59,23.97],[68.72,23.96],[68.73,24.27],[68.74,24.29],[68.76,24.31],[68.78,24.31],[68.8,24.31],[68.83,24.26],[68.86,24.27],[68.9,24.29],[68.98,24.27],[69.05,24.29],[69.12,24.27],[69.24,24.27],[69.44,24.28],[69.56,24.27],[69.63,24.23],[69.72,24.17],[69.81,24.17],[69.93,24.17],[70.02,24.19],[70.07,24.24],[70.1,24.29],[70.29,24.36],[70.49,24.41],[70.55,24.42],[70.57,24.39],[70.56,24.33],[70.58,24.28],[70.66,24.25],[70.72,24.24],[70.77,24.25],[70.81,24.26],[70.89,24.34],[70.93,24.36],[70.98,24.36],[71.04,24.4],[71.05,24.43],[71.01,24.44],[70.97,24.49],[70.98,24.52],[70.97,24.57],[70.98,24.62],[71.0,24.65],[71.05,24.69],[71.02,24.76],[70.95,24.89],[70.88,25.06],[70.8,25.21],[70.7,25.33],[70.65,25.42],[70.66,25.63],[70.65,25.67],[70.61,25.69],[70.57,25.71],[70.51,25.69],[70.45,25.68],[70.33,25.69],[70.26,25.71],[70.1,25.91],[70.08,25.99],[70.08,26.07],[70.13,26.21],[70.15,26.35],[70.16,26.47],[70.15,26.51],[70.11,26.55],[70.06,26.58],[69.91,26.59],[69.74,26.63],[69.6,26.7],[69.51,26.74],[69.48,26.77],[69.47,26.8],[69.49,26.95],[69.54,27.12],[69.57,27.17],[69.62,27.23],[69.66,27.26],[69.72,27.31],[69.9,27.47],[70.05,27.69],[70.14,27.85],[70.19,27.89],[70.24,27.93],[70.32,27.98],[70.4,28.03],[70.49,28.02],[70.57,27.98],[70.63,27.94],[70.65,27.84],[70.69,27.77],[70.74,27.73],[70.8,27.71],[70.87,27.71],[71.18,27.83],[71.29,27.86],[71.54,27.87],[71.72,27.92],[71.87,27.96],[71.89,28.05],[71.95,28.18],[72.13,28.35],[72.18,28.42],[72.23,28.57],[72.29,28.7],[72.34,28.75],[72.63,28.9],[72.9,29.03],[72.95,29.09],[73.13,29.36],[73.23,29.55],[73.26,29.61],[73.32,29.77],[73.38,29.93],[73.47,29.97],[73.66,30.03],[73.81,30.09],[73.89,30.16],[73.93,30.22],[73.92,30.28],[73.88,30.35],[73.89,30.39],[73.9,30.44],[74.01,30.52],[74.22,30.77],[74.34,30.89],[74.38,30.89],[74.51,30.96],[74.63,31.03],[74.63,31.07],[74.61,31.11],[74.54,31.13],[74.52,31.19],[74.53,31.26],[74.59,31.47],[74.58,31.52],[74.51,31.71],[74.53,31.77],[74.56,31.82],[74.64,31.89],[74.74,31.95],[75.07,32.09],[75.14,32.1],[75.25,32.14],[75.32,32.22],[75.33,32.28],[75.3,32.32],[75.23,32.37],[75.1,32.42],[74.99,32.46],[74.79,32.46],[74.69,32.49],[74.66,32.52],[74.64,32.61],[74.66,32.76],[74.63,32.77],[74.59,32.75],[74.48,32.77],[74.35,32.77],[74.31,32.81],[74.33,32.86],[74.32,32.93],[74.3,32.99],[74.28,33.01],[74.22,33.02],[74.13,33.08],[74.05,33.14],[74.0,33.19],[73.99,33.22],[73.99,33.24],[74.05,33.3],[74.12,33.38],[74.14,33.46],[74.15,33.51],[74.13,33.55],[74.07,33.59],[74.0,33.63],[73.98,33.67],[73.98,33.72],[74.0,33.79],[74.08,33.84],[74.22,33.89],[74.25,33.95],[74.25,33.99],[74.21,34.0],[74.11,34.0],[73.95,34.02],[73.92,34.04],[73.9,34.08],[73.9,34.11],[73.94,34.14],[73.98,34.19],[73.97,34.24],[73.92,34.29],[73.81,34.33],[73.79,34.38],[73.81,34.42],[73.85,34.49],[73.88,34.53],[73.96,34.65],[74.06,34.68],[74.17,34.72],[74.3,34.77],[74.5,34.73],[74.59,34.72],[74.79,34.68],[74.95,34.65],[75.12,34.64],[75.19,34.64],[75.26,34.6],[75.45,34.54],[75.61,34.5],[75.71,34.5],[75.86,34.56],[75.94,34.61],[76.04,34.67],[76.17,34.67],[76.46,34.76],[76.51,34.74],[76.59,34.74],[76.7,34.79],[76.75,34.85],[76.76,34.88],[76.78,34.9],[76.89,34.94],[77.0,34.99],[77.03,35.06],[77.05,35.11],[77.17,35.17],[77.29,35.24],[77.42,35.3],[77.57,35.38],[77.7,35.44],[77.8,35.5],[77.8,35.49],[77.81,35.48],[77.85,35.46],[77.89,35.45],[77.95,35.47],[78.01,35.49],[78.04,35.48],[78.05,35.45],[78.01,35.31],[78.01,35.25],[78.08,35.13],[78.16,34.95],[78.24,34.77],[78.28,34.65],[78.33,34.61],[78.52,34.56],[78.67,34.52],[78.76,34.45],[78.86,34.39],[78.94,34.35],[78.97,34.3],[78.98,34.26],[78.97,34.23],[78.93,34.19],[78.75,34.09],[78.73,34.06],[78.73,34.01],[78.76,33.89],[78.78,33.81],[78.79,33.65],[78.8,33.5],[78.87,33.43],[78.92,33.39],[78.95,33.35],[79.01,33.29],[79.07,33.25],[79.11,33.23],[79.14,33.17],[79.12,33.11],[79.1,33.05],[79.11,33.02],[79.15,33.0],[79.2,32.95],[79.21,32.86],[79.21,32.81],[79.23,32.76],[79.23,32.7],[79.22,32.56],[79.22,32.51],[79.22,32.5],[79.17,32.5],[79.13,32.48],[79.07,32.39],[79.0,32.37],[78.92,32.36],[78.84,32.41],[78.77,32.47],[78.75,32.5],[78.74,32.56],[78.7,32.6],[78.63,32.58],[78.53,32.57],[78.41,32.56],[78.39,32.54],[78.39,32.52],[78.42,32.47],[78.44,32.4],[78.46,32.3],[78.49,32.24],[78.5,32.22],[78.68,32.02],[78.73,31.98],[78.74,31.96],[78.72,31.89],[78.69,31.81],[78.69,31.74],[78.75,31.67],[78.8,31.62],[78.76,31.55],[78.73,31.47],[78.76,31.44],[78.74,31.32],[78.76,31.3],[78.79,31.29],[78.84,31.3],[78.9,31.33],[78.95,31.34],[78.97,31.33],[79.01,31.41],[79.04,31.43],[79.11,31.4],[79.23,31.24],[79.34,31.11],[79.37,31.08],[79.39,31.06],[79.49,30.99],[79.57,30.95],[79.66,30.97],[79.79,30.97],[79.87,30.92],[79.92,30.89],[79.92,30.89],[79.92,30.89],[80.08,30.78],[80.15,30.79],[80.19,30.76],[80.21,30.68],[80.19,30.61],[80.19,30.57],[80.26,30.56],[80.41,30.51],[80.54,30.46],[80.61,30.45],[80.68,30.41],[80.75,30.36],[80.87,30.29],[80.99,30.24],[81.01,30.16],[80.97,30.18],[80.91,30.17],[80.85,30.14],[80.82,30.12],[80.68,29.99],[80.61,29.96],[80.55,29.9],[80.4,29.73],[80.32,29.57],[80.25,29.42],[80.26,29.32],[80.23,29.19],[80.17,29.12],[80.13,29.1],[80.08,28.99],[80.05,28.87],[80.07,28.83],[80.15,28.78],[80.23,28.72],[80.32,28.67],[80.42,28.61],[80.48,28.6],[80.5,28.64],[80.52,28.67],[80.59,28.65],[80.67,28.6],[80.73,28.55],[80.75,28.54],[80.9,28.47],[81.02,28.41],[81.17,28.34],[81.21,28.29],[81.24,28.24],[81.31,28.18],[81.49,28.06],[81.64,27.98],[81.76,27.91],[81.85,27.87],[81.9,27.87],[81.95,27.9],[81.99,27.91],[82.04,27.9],[82.11,27.86],[82.29,27.76],[82.45,27.67],[82.63,27.69],[82.68,27.67],[82.71,27.6],[82.73,27.52],[82.93,27.47],[83.06,27.44],[83.21,27.4],[83.29,27.37],[83.37,27.41],[83.38,27.44],[83.45,27.47],[83.55,27.46],[83.75,27.4],[83.83,27.38],[83.9,27.44],[84.02,27.46],[84.09,27.49],[84.23,27.43],[84.48,27.35],[84.61,27.3],[84.64,27.25],[84.65,27.2],[84.65,27.09],[84.69,27.04],[84.94,26.93],[85.02,26.88],[85.09,26.86],[85.13,26.86],[85.15,26.85],[85.17,26.78],[85.19,26.77],[85.24,26.75],[85.29,26.74],[85.46,26.8],[85.57,26.84],[85.65,26.83],[85.7,26.78],[85.71,26.71],[85.74,26.64],[85.79,26.6],[85.86,26.6],[86.01,26.65],[86.13,26.61],[86.24,26.6],[86.37,26.57],[86.41,26.56],[86.54,26.5],[86.7,26.44],[86.76,26.44],[87.02,26.56],[87.04,26.54],[87.09,26.43],[87.17,26.39],[87.29,26.36],[87.41,26.42],[87.51,26.4],[87.63,26.4],[87.75,26.43],[87.85,26.44],[88.0,26.38],[88.03,26.4],[88.05,26.43],[88.11,26.59],[88.16,26.72],[88.16,26.81],[88.11,26.93],[87.99,27.09],[87.98,27.13],[88.02,27.41],[88.07,27.57],[88.11,27.64],[88.15,27.75],[88.15,27.8],[88.15,27.84],[88.11,27.87],[88.1,27.9],[88.11,27.93],[88.14,27.95],[88.28,27.97],[88.43,28.01],[88.49,28.03],[88.53,28.06],[88.58,28.09],[88.62,28.09],[88.76,28.04],[88.8,28.01],[88.83,27.91],[88.85,27.87],[88.83,27.77],[88.75,27.52],[88.76,27.43],[88.83,27.36],[88.89,27.32],[88.88,27.3],[88.76,27.22],[88.74,27.18],[88.77,27.13],[88.81,27.1],[88.84,27.07],[88.86,26.96],[88.92,26.93],[89.04,26.87],[89.15,26.82],[89.33,26.85],[89.38,26.83],[89.47,26.8],[89.55,26.8],[89.59,26.78],[89.61,26.76],[89.61,26.74],[89.61,26.72],[89.71,26.71],[89.76,26.7],[89.94,26.72],[90.12,26.75],[90.21,26.85],[90.24,26.85],[90.35,26.89],[90.45,26.85],[90.56,26.8],[90.62,26.78],[90.74,26.77],[90.86,26.78],[91.13,26.8],[91.29,26.79],[91.43,26.87],[91.46,26.87],[91.52,26.81],[91.67,26.8],[91.75,26.83],[91.84,26.85],[91.9,26.86],[91.94,26.86],[92.0,26.85],[92.05,26.87],[92.07,26.91],[92.07,26.98],[92.03,27.04],[92.0,27.08],[91.99,27.1],[92.0,27.15],[92.03,27.21],[92.08,27.29],[92.04,27.36],[91.99,27.45],[91.95,27.46],[91.85,27.44],[91.74,27.44],[91.66,27.49],[91.59,27.56],[91.58,27.61],[91.6,27.68],[91.63,27.74],[91.63,27.76],[91.71,27.76],[91.82,27.75],[91.91,27.73],[91.98,27.73],[92.1,27.81],[92.16,27.81],[92.22,27.83],[92.25,27.84],[92.27,27.83],[92.34,27.82],[92.41,27.82],[92.48,27.85],[92.55,27.88],[92.66,27.95],[92.69,27.99],[92.69,28.03],[92.67,28.05],[92.64,28.06],[92.65,28.09],[92.7,28.15],[92.88,28.23],[93.03,28.33],[93.12,28.4],[93.16,28.49],[93.21,28.59],[93.25,28.63],[93.36,28.65],[93.66,28.69],[93.76,28.73],[93.9,28.8],[93.97,28.86],[94.01,28.91],[94.02,28.96],[94.11,28.98],[94.19,29.06],[94.29,29.14],[94.47,29.22],[94.62,29.31],[94.68,29.3],[94.73,29.25],[94.76,29.2],[94.77,29.18],[94.97,29.14],[95.0,29.15],[95.14,29.1],[95.28,29.05],[95.35,29.04],[95.39,29.04],[95.42,29.05],[95.46,29.1],[95.49,29.14],[95.52,29.15],[95.52,29.21],[95.71,29.31],[95.89,29.39],[96.04,29.45],[96.08,29.42],[96.13,29.38],[96.19,29.27],[96.23,29.25],[96.34,29.26],[96.36,29.25],[96.34,29.21],[96.27,29.16],[96.18,29.12],[96.12,29.08],[96.14,28.96],[96.14,28.92],[96.16,28.91],[96.35,29.03],[96.44,29.05],[96.47,29.02],[96.48,28.96],[96.55,28.83],[96.58,28.76],[96.4,28.61],[96.33,28.53],[96.33,28.5],[96.33,28.47],[96.28,28.43],[96.28,28.41],[96.32,28.39],[96.37,28.37],[96.39,28.37],[96.43,28.41],[96.6,28.46],[96.65,28.45],[96.78,28.37],[96.83,28.36],[96.98,28.34],[97.08,28.37],[97.15,28.34],[97.29,28.24],[97.32,28.22],[97.31,28.16],[97.3,28.09],[97.34,28.03],[97.34,27.98],[97.34,27.94],[97.31,27.91],[97.23,27.89],[97.16,27.84],[97.05,27.76],[96.96,27.7],[96.9,27.64],[96.88,27.59],[96.88,27.51],[96.9,27.44],[97.1,27.16],[97.1,27.12],[97.04,27.1],[96.95,27.13],[96.88,27.18],[96.8,27.3],[96.73,27.33],[96.67,27.34],[96.27,27.28],[96.19,27.26],[96.06,27.22],[95.97,27.13],[95.91,27.05],[95.84,27.01],[95.74,26.95],[95.46,26.76],[95.31,26.67],[95.2,26.64],[95.13,26.6],[95.09,26.53],[95.06,26.47],[95.05,26.35],[95.07,26.19],[95.11,26.09],[95.13,26.07],[95.13,26.04],[95.09,25.99],[95.04,25.94],[95.02,25.91],[94.99,25.77],[94.95,25.7],[94.86,25.6],[94.79,25.52],[94.67,25.46],[94.62,25.41],[94.58,25.32],[94.55,25.24],[94.55,25.22],[94.57,25.19],[94.62,25.16],[94.68,25.14],[94.7,25.1],[94.71,25.05],[94.66,24.93],[94.58,24.77],[94.49,24.64],[94.4,24.51],[94.38,24.47],[94.29,24.32],[94.22,24.11],[94.17,23.97],[94.13,23.88],[94.07,23.87],[94.01,23.9],[93.86,23.94],[93.76,23.98],[93.68,24.01],[93.63,24.01],[93.56,23.99],[93.49,23.97],[93.45,23.99],[93.36,24.07],[93.33,24.06],[93.31,24.02],[93.37,23.77],[93.41,23.68],[93.41,23.53],[93.39,23.34],[93.37,23.13],[93.35,23.08],[93.31,23.03],[93.25,23.02],[93.2,23.04],[93.16,23.03],[93.15,23.0],[93.16,22.91],[93.11,22.81],[93.08,22.72],[93.09,22.63],[93.11,22.55],[93.16,22.36],[93.16,22.29],[93.15,22.23],[93.12,22.21],[93.07,22.21],[93.04,22.18],[93.02,22.15],[92.96,22.0],[92.91,21.99],[92.85,22.01],[92.77,22.1],[92.72,22.13],[92.69,22.13],[92.67,22.11],[92.65,22.05],[92.63,22.01],[92.57,21.98]],[[93.89,6.83],[93.83,6.75],[93.71,7.0],[93.66,7.02],[93.66,7.14],[93.68,7.18],[93.82,7.24],[93.86,7.21],[93.93,6.97],[93.89,6.83]],[[93.73,7.36],[93.64,7.26],[93.6,7.32],[93.61,7.36],[93.65,7.38],[93.69,7.41],[93.73,7.36]],[[93.44,7.88],[93.37,7.88],[93.34,7.92],[93.31,7.96],[93.33,8.01],[93.38,8.02],[93.43,7.95],[93.45,7.9],[93.44,7.88]],[[93.54,8.06],[93.49,8.02],[93.48,8.02],[93.47,8.05],[93.47,8.07],[93.46,8.11],[93.46,8.17],[93.49,8.22],[93.53,8.21],[93.51,8.16],[93.54,8.06]],[[73.07,8.27],[73.05,8.26],[73.04,8.25],[73.03,8.25],[73.02,8.27],[73.03,8.28],[73.04,8.26],[73.06,8.27],[73.08,8.31],[73.08,8.32],[73.08,8.31],[73.08,8.29],[73.07,8.27]],[[93.14,8.25],[93.17,8.21],[93.12,8.22],[93.06,8.27],[93.08,8.33],[93.1,8.35],[93.14,8.25]],[[92.79,9.14],[92.74,9.13],[92.72,9.17],[92.71,9.2],[92.74,9.23],[92.76,9.24],[92.79,9.24],[92.81,9.17],[92.79,9.14]],[[92.5,10.55],[92.47,10.52],[92.37,10.55],[92.38,10.65],[92.35,10.75],[92.37,10.79],[92.45,10.87],[92.51,10.9],[92.55,10.8],[92.57,10.7],[92.5,10.55]],[[72.78,11.2],[72.77,11.2],[72.77,11.21],[72.78,11.24],[72.79,11.26],[72.8,11.26],[72.79,11.24],[72.79,11.22],[72.78,11.2]],[[92.69,11.38],[92.64,11.36],[92.6,11.39],[92.63,11.43],[92.64,11.51],[92.69,11.46],[92.69,11.41],[92.69,11.38]],[[93.02,12.04],[93.06,11.9],[92.98,11.96],[92.96,12.0],[93.0,12.03],[93.02,12.04]],[[92.72,12.86],[92.69,12.8],[92.68,12.94],[92.69,12.96],[92.71,12.96],[92.73,12.95],[92.72,12.86]],[[92.72,11.54],[92.7,11.51],[92.67,11.54],[92.58,11.72],[92.56,11.83],[92.53,11.87],[92.57,11.93],[92.61,11.95],[92.63,12.01],[92.64,12.11],[92.68,12.19],[92.69,12.21],[92.77,12.22],[92.79,12.23],[92.78,12.3],[92.73,12.34],[92.72,12.36],[92.72,12.54],[92.73,12.62],[92.76,12.67],[92.74,12.78],[92.75,12.82],[92.81,12.88],[92.83,13.0],[92.81,13.04],[92.86,13.23],[92.86,13.36],[92.92,13.49],[93.03,13.54],[93.06,13.55],[93.07,13.44],[93.08,13.4],[93.02,13.34],[93.07,13.25],[93.07,13.22],[93.04,13.15],[93.0,13.09],[92.95,13.06],[92.91,12.98],[92.89,12.94],[92.97,12.85],[92.99,12.54],[92.93,12.45],[92.86,12.44],[92.88,12.23],[92.87,12.18],[92.8,12.08],[92.79,12.03],[92.75,11.99],[92.76,11.94],[92.8,11.92],[92.8,11.87],[92.77,11.76],[92.76,11.64],[92.72,11.54]]]},{"n":"Indian Ocean Territories","r":[[[96.92,-12.19],[96.91,-12.2],[96.9,-12.2],[96.89,-12.19],[96.89,-12.19],[96.9,-12.19],[96.91,-12.18],[96.92,-12.17],[96.92,-12.16],[96.93,-12.17],[96.92,-12.18],[96.92,-12.19]],[[96.84,-12.18],[96.85,-12.19],[96.87,-12.18],[96.87,-12.19],[96.85,-12.2],[96.83,-12.18],[96.83,-12.15],[96.83,-12.13],[96.83,-12.13],[96.83,-12.14],[96.83,-12.14],[96.84,-12.16],[96.84,-12.17],[96.84,-12.18]],[[105.73,-10.49],[105.7,-10.56],[105.64,-10.52],[105.58,-10.51],[105.6,-10.46],[105.65,-10.45],[105.67,-10.45],[105.71,-10.43],[105.73,-10.49]]]},{"n":"British Indian Ocean Territory","r":[[[72.49,-7.38],[72.47,-7.42],[72.43,-7.44],[72.41,-7.33],[72.35,-7.26],[72.37,-7.26],[72.43,-7.3],[72.45,-7.4],[72.47,-7.37],[72.46,-7.34],[72.47,-7.31],[72.47,-7.28],[72.44,-7.23],[72.45,-7.22],[72.49,-7.26],[72.5,-7.29],[72.49,-7.38]]]},{"n":"Ireland","r":[[[-7.22,55.09],[-7.38,55.03],[-7.4,55.0],[-7.45,54.91],[-7.45,54.88],[-7.5,54.83],[-7.55,54.77],[-7.61,54.75],[-7.69,54.73],[-7.74,54.71],[-7.8,54.72],[-7.87,54.72],[-7.91,54.7],[-7.91,54.68],[-7.89,54.67],[-7.82,54.64],[-7.75,54.62],[-7.75,54.59],[-7.79,54.57],[-8.04,54.51],[-8.12,54.48],[-8.14,54.45],[-8.12,54.41],[-7.92,54.3],[-7.88,54.28],[-7.85,54.22],[-7.68,54.19],[-7.61,54.14],[-7.54,54.13],[-7.41,54.14],[-7.36,54.12],[-7.32,54.13],[-7.31,54.16],[-7.19,54.21],[-7.16,54.24],[-7.18,54.27],[-7.2,54.3],[-7.13,54.36],[-7.05,54.41],[-7.01,54.41],[-6.94,54.37],[-6.88,54.33],[-6.87,54.29],[-6.86,54.27],[-6.8,54.21],[-6.77,54.2],[-6.67,54.18],[-6.65,54.16],[-6.66,54.08],[-6.65,54.06],[-6.55,54.06],[-6.44,54.06],[-6.4,54.06],[-6.36,54.08],[-6.3,54.09],[-6.22,54.09],[-6.18,54.05],[-6.16,54.02],[-6.23,54.0],[-6.31,54.01],[-6.35,53.99],[-6.35,53.94],[-6.32,53.88],[-6.27,53.84],[-6.23,53.75],[-6.19,53.64],[-6.14,53.58],[-6.13,53.5],[-6.14,53.46],[-6.13,53.39],[-6.15,53.37],[-6.13,53.3],[-6.07,53.17],[-6.05,53.09],[-6.03,52.93],[-6.07,52.87],[-6.13,52.81],[-6.17,52.74],[-6.2,52.66],[-6.22,52.54],[-6.35,52.4],[-6.4,52.37],[-6.46,52.35],[-6.32,52.25],[-6.44,52.2],[-6.56,52.19],[-6.7,52.21],[-6.78,52.21],[-6.86,52.18],[-6.89,52.16],[-6.91,52.17],[-6.97,52.25],[-7.0,52.17],[-7.08,52.14],[-7.22,52.14],[-7.44,52.12],[-7.53,52.1],[-7.56,52.06],[-7.59,52.02],[-7.62,51.99],[-7.66,51.98],[-7.84,51.95],[-7.87,51.94],[-7.95,51.87],[-8.06,51.83],[-8.15,51.81],[-8.22,51.85],[-8.25,51.88],[-8.29,51.89],[-8.41,51.89],[-8.37,51.88],[-8.35,51.85],[-8.34,51.79],[-8.35,51.74],[-8.41,51.71],[-8.48,51.71],[-8.59,51.65],[-8.73,51.64],[-8.81,51.58],[-9.3,51.5],[-9.32,51.5],[-9.39,51.52],[-9.46,51.53],[-9.53,51.52],[-9.74,51.47],[-9.84,51.48],[-9.71,51.6],[-9.54,51.66],[-9.52,51.68],[-9.58,51.69],[-9.9,51.65],[-10.01,51.61],[-10.12,51.6],[-10.07,51.66],[-9.93,51.73],[-9.85,51.77],[-9.8,51.78],[-9.75,51.82],[-9.6,51.87],[-10.08,51.77],[-10.21,51.78],[-10.24,51.81],[-10.34,51.8],[-10.38,51.87],[-10.23,51.97],[-10.15,52.02],[-10.04,52.04],[-9.95,52.08],[-9.91,52.12],[-9.96,52.14],[-10.25,52.13],[-10.39,52.13],[-10.38,52.17],[-10.36,52.21],[-10.21,52.27],[-10.13,52.28],[-10.06,52.28],[-9.99,52.26],[-9.94,52.24],[-9.77,52.25],[-9.84,52.29],[-9.85,52.38],[-9.91,52.4],[-9.84,52.44],[-9.76,52.47],[-9.63,52.55],[-9.59,52.56],[-9.33,52.58],[-9.06,52.62],[-8.78,52.68],[-8.92,52.71],[-8.99,52.76],[-9.1,52.67],[-9.18,52.63],[-9.39,52.62],[-9.46,52.63],[-9.56,52.65],[-9.59,52.64],[-9.62,52.62],[-9.76,52.58],[-9.92,52.57],[-9.74,52.65],[-9.51,52.78],[-9.46,52.82],[-9.39,52.9],[-9.42,52.93],[-9.46,52.95],[-9.3,53.1],[-9.24,53.12],[-9.14,53.13],[-9.06,53.15],[-9.03,53.15],[-9.0,53.16],[-8.93,53.21],[-9.03,53.24],[-9.14,53.25],[-9.47,53.23],[-9.51,53.24],[-9.56,53.25],[-9.58,53.27],[-9.6,53.32],[-9.63,53.33],[-9.7,53.33],[-9.77,53.32],[-9.83,53.32],[-9.88,53.34],[-9.8,53.39],[-9.9,53.41],[-10.0,53.4],[-10.09,53.41],[-10.09,53.45],[-10.05,53.48],[-10.11,53.51],[-10.12,53.55],[-10.06,53.57],[-10.0,53.56],[-9.88,53.59],[-9.72,53.6],[-9.86,53.63],[-9.91,53.66],[-9.91,53.7],[-9.9,53.73],[-9.75,53.78],[-9.58,53.81],[-9.59,53.84],[-9.58,53.88],[-9.75,53.89],[-9.91,53.86],[-9.9,53.94],[-9.86,54.0],[-9.85,54.05],[-9.86,54.1],[-9.93,54.08],[-9.94,54.14],[-9.98,54.19],[-10.09,54.16],[-10.09,54.22],[-10.06,54.26],[-10.0,54.28],[-9.94,54.27],[-9.82,54.27],[-9.72,54.3],[-9.56,54.31],[-9.32,54.3],[-9.15,54.21],[-9.1,54.23],[-9.03,54.28],[-9.0,54.29],[-8.75,54.26],[-8.59,54.23],[-8.55,54.24],[-8.57,54.3],[-8.62,54.35],[-8.55,54.4],[-8.47,54.44],[-8.42,54.46],[-8.29,54.48],[-8.23,54.51],[-8.19,54.58],[-8.13,54.64],[-8.46,54.61],[-8.76,54.68],[-8.72,54.73],[-8.65,54.76],[-8.54,54.78],[-8.53,54.81],[-8.47,54.83],[-8.38,54.89],[-8.41,54.97],[-8.39,55.02],[-8.33,55.06],[-8.3,55.11],[-8.27,55.15],[-8.14,55.16],[-8.01,55.2],[-7.96,55.19],[-7.8,55.2],[-7.75,55.19],[-7.76,55.25],[-7.67,55.26],[-7.63,55.24],[-7.61,55.2],[-7.57,55.17],[-7.56,55.12],[-7.59,55.08],[-7.63,55.05],[-7.59,55.03],[-7.66,54.97],[-7.58,54.99],[-7.48,55.05],[-7.48,55.09],[-7.5,55.14],[-7.53,55.19],[-7.52,55.25],[-7.46,55.28],[-7.3,55.3],[-7.37,55.36],[-7.31,55.37],[-7.25,55.35],[-7.16,55.31],[-7.06,55.27],[-6.96,55.24],[-7.06,55.18],[-7.17,55.14],[-7.22,55.09]],[[-9.95,53.91],[-9.95,53.88],[-10.03,53.92],[-10.06,53.96],[-10.27,53.98],[-10.18,54.02],[-10.14,54.01],[-10.0,54.0],[-9.96,53.99],[-9.95,53.91]]]},{"n":"Iran","r":[[[61.26,35.62],[61.28,35.55],[61.28,35.51],[61.25,35.47],[61.23,35.42],[61.2,35.36],[61.19,35.31],[61.14,35.29],[61.1,35.27],[61.11,35.21],[61.13,35.16],[61.15,35.09],[61.12,35.05],[61.11,35.0],[61.07,34.92],[61.08,34.86],[61.04,34.8],[60.99,34.75],[60.96,34.71],[60.95,34.65],[60.91,34.63],[60.85,34.59],[60.8,34.55],[60.74,34.54],[60.73,34.52],[60.74,34.49],[60.76,34.48],[60.8,34.42],[60.89,34.32],[60.64,34.31],[60.57,34.22],[60.49,34.09],[60.53,33.84],[60.49,33.71],[60.51,33.64],[60.57,33.59],[60.65,33.56],[60.81,33.56],[60.91,33.54],[60.92,33.51],[60.86,33.46],[60.77,33.36],[60.72,33.32],[60.56,33.14],[60.56,33.06],[60.58,32.99],[60.64,32.79],[60.71,32.6],[60.83,32.25],[60.83,32.17],[60.79,31.99],[60.79,31.88],[60.8,31.73],[60.79,31.66],[60.82,31.5],[60.85,31.48],[61.11,31.45],[61.35,31.42],[61.66,31.38],[61.76,31.29],[61.81,31.07],[61.81,30.91],[61.78,30.83],[61.56,30.6],[61.33,30.36],[61.1,30.13],[60.84,29.86],[61.03,29.66],[61.15,29.54],[61.32,29.37],[61.34,29.33],[61.34,29.26],[61.51,29.01],[61.57,28.87],[61.62,28.79],[61.76,28.67],[61.89,28.55],[62.03,28.49],[62.13,28.48],[62.35,28.41],[62.43,28.36],[62.56,28.24],[62.72,28.25],[62.75,28.25],[62.76,28.24],[62.76,28.2],[62.74,28.0],[62.78,27.8],[62.81,27.5],[62.8,27.44],[62.76,27.36],[62.76,27.3],[62.75,27.27],[62.76,27.25],[62.81,27.23],[62.92,27.22],[63.17,27.25],[63.2,27.24],[63.26,27.21],[63.3,27.15],[63.31,27.12],[63.24,27.08],[63.23,27.0],[63.25,26.88],[63.24,26.86],[63.19,26.84],[63.17,26.67],[63.16,26.65],[63.09,26.63],[62.79,26.64],[62.75,26.64],[62.64,26.59],[62.44,26.56],[62.39,26.54],[62.31,26.49],[62.26,26.43],[62.25,26.37],[62.24,26.36],[62.13,26.37],[62.09,26.32],[61.87,26.24],[61.84,26.23],[61.81,26.17],[61.78,26.0],[61.75,25.84],[61.74,25.82],[61.67,25.77],[61.66,25.75],[61.67,25.69],[61.64,25.58],[61.62,25.29],[61.59,25.2],[61.53,25.2],[61.49,25.15],[61.41,25.1],[61.24,25.14],[61.11,25.18],[60.66,25.28],[60.62,25.33],[60.59,25.41],[60.51,25.44],[60.4,25.31],[60.02,25.38],[59.9,25.36],[59.82,25.4],[59.62,25.4],[59.46,25.48],[59.23,25.43],[59.05,25.42],[58.8,25.55],[58.53,25.59],[58.31,25.58],[58.2,25.59],[58.02,25.64],[57.94,25.69],[57.8,25.65],[57.73,25.72],[57.33,25.79],[57.26,25.92],[57.21,26.04],[57.2,26.16],[57.1,26.37],[57.07,26.68],[57.04,26.8],[56.98,26.91],[56.91,26.99],[56.81,27.09],[56.73,27.13],[56.36,27.2],[56.28,27.19],[56.12,27.14],[55.94,27.04],[55.65,26.98],[55.59,26.93],[55.52,26.83],[55.42,26.77],[55.29,26.79],[55.15,26.73],[54.9,26.56],[54.76,26.51],[54.64,26.51],[54.52,26.59],[54.25,26.7],[54.07,26.73],[53.82,26.71],[53.71,26.73],[53.51,26.85],[53.45,26.94],[53.34,27.0],[52.98,27.14],[52.69,27.32],[52.64,27.39],[52.6,27.49],[52.48,27.62],[52.19,27.72],[52.03,27.82],[51.84,27.85],[51.67,27.84],[51.59,27.86],[51.52,27.91],[51.28,28.13],[51.28,28.22],[51.13,28.44],[51.09,28.51],[51.06,28.73],[51.02,28.78],[50.87,28.87],[50.84,28.93],[50.88,29.0],[50.88,29.06],[50.8,29.12],[50.68,29.15],[50.65,29.21],[50.67,29.34],[50.65,29.42],[50.54,29.55],[50.39,29.68],[50.23,29.87],[50.17,29.92],[50.13,30.05],[50.07,30.2],[49.98,30.21],[49.55,30.03],[49.43,30.13],[49.05,30.31],[49.03,30.33],[49.0,30.37],[49.05,30.4],[49.1,30.41],[49.19,30.38],[49.25,30.41],[49.22,30.47],[49.13,30.51],[49.0,30.51],[49.04,30.45],[48.92,30.4],[48.89,30.33],[48.91,30.24],[48.92,30.12],[48.87,30.06],[48.83,30.04],[48.67,30.03],[48.6,29.98],[48.55,29.96],[48.48,30.0],[48.43,30.04],[48.4,30.11],[48.39,30.16],[48.4,30.19],[48.38,30.23],[48.33,30.29],[48.28,30.32],[48.23,30.32],[48.18,30.36],[48.15,30.42],[48.07,30.46],[48.01,30.47],[48.01,30.66],[48.01,30.82],[48.01,30.99],[47.84,31.0],[47.68,31.0],[47.68,31.14],[47.68,31.4],[47.75,31.6],[47.83,31.79],[47.71,31.94],[47.59,32.09],[47.51,32.15],[47.42,32.34],[47.37,32.42],[47.33,32.46],[47.29,32.47],[47.12,32.47],[46.97,32.57],[46.79,32.69],[46.57,32.83],[46.38,32.93],[46.3,32.95],[46.11,32.96],[46.09,32.98],[46.08,33.03],[46.08,33.09],[46.14,33.17],[46.15,33.23],[46.02,33.42],[45.98,33.47],[45.87,33.49],[45.89,33.55],[45.89,33.58],[45.88,33.61],[45.85,33.62],[45.82,33.62],[45.74,33.6],[45.67,33.69],[45.47,33.93],[45.41,33.95],[45.4,33.97],[45.45,34.04],[45.53,34.15],[45.54,34.22],[45.53,34.28],[45.44,34.42],[45.46,34.47],[45.5,34.53],[45.5,34.58],[45.56,34.57],[45.64,34.57],[45.66,34.61],[45.66,34.75],[45.68,34.8],[45.92,35.03],[46.04,35.08],[46.13,35.13],[46.15,35.2],[46.14,35.23],[46.12,35.28],[46.11,35.32],[46.01,35.42],[45.98,35.48],[45.97,35.52],[46.0,35.61],[46.04,35.67],[46.18,35.71],[46.26,35.74],[46.27,35.77],[46.17,35.82],[45.94,35.84],[45.78,35.82],[45.72,35.84],[45.65,35.93],[45.56,35.98],[45.48,36.01],[45.41,36.0],[45.36,36.02],[45.35,36.05],[45.24,36.36],[45.21,36.4],[45.16,36.41],[45.11,36.41],[45.08,36.43],[45.05,36.47],[45.03,36.53],[45.03,36.6],[45.03,36.66],[45.02,36.7],[44.98,36.74],[44.93,36.77],[44.88,36.8],[44.8,37.06],[44.77,37.14],[44.77,37.14],[44.77,37.16],[44.76,37.22],[44.8,37.27],[44.79,37.29],[44.72,37.36],[44.6,37.42],[44.57,37.44],[44.57,37.51],[44.58,37.56],[44.57,37.61],[44.55,37.64],[44.55,37.66],[44.59,37.71],[44.56,37.74],[44.4,37.83],[44.34,37.87],[44.22,37.88],[44.21,37.91],[44.23,37.97],[44.27,38.04],[44.33,38.11],[44.35,38.15],[44.37,38.21],[44.38,38.25],[44.45,38.32],[44.45,38.33],[44.43,38.36],[44.38,38.37],[44.32,38.37],[44.3,38.39],[44.29,38.42],[44.3,38.56],[44.28,38.64],[44.26,38.7],[44.27,38.84],[44.23,38.86],[44.17,38.93],[44.14,38.99],[44.16,39.02],[44.17,39.06],[44.18,39.11],[44.18,39.14],[44.12,39.18],[44.08,39.22],[44.07,39.26],[44.06,39.31],[44.03,39.35],[44.02,39.38],[44.04,39.39],[44.12,39.41],[44.24,39.4],[44.34,39.4],[44.39,39.42],[44.46,39.67],[44.52,39.73],[44.59,39.77],[44.72,39.68],[44.78,39.65],[44.82,39.65],[44.84,39.63],[45.0,39.42],[45.07,39.36],[45.11,39.31],[45.14,39.25],[45.19,39.22],[45.26,39.19],[45.34,39.14],[45.39,39.1],[45.48,39.01],[45.58,38.97],[45.92,38.91],[46.11,38.88],[46.17,38.87],[46.32,38.91],[46.49,38.91],[46.55,38.9],[46.78,39.09],[46.85,39.15],[46.99,39.18],[47.07,39.25],[47.19,39.34],[47.34,39.42],[47.48,39.5],[47.58,39.54],[47.77,39.65],[47.89,39.69],[48.0,39.68],[48.15,39.56],[48.28,39.45],[48.32,39.4],[48.26,39.35],[48.14,39.31],[48.11,39.28],[48.1,39.24],[48.11,39.2],[48.13,39.17],[48.27,39.1],[48.29,39.06],[48.29,39.02],[48.28,38.99],[48.24,38.98],[48.14,38.96],[48.05,38.94],[48.02,38.91],[47.99,38.88],[48.0,38.85],[48.02,38.82],[48.2,38.72],[48.23,38.69],[48.26,38.64],[48.31,38.61],[48.38,38.61],[48.42,38.59],[48.59,38.41],[48.64,38.4],[48.84,38.44],[48.87,38.44],[48.87,38.39],[48.9,38.14],[48.93,38.02],[48.96,37.89],[49.02,37.78],[49.08,37.67],[49.17,37.6],[49.37,37.52],[49.47,37.5],[49.73,37.48],[49.98,37.44],[50.13,37.41],[50.18,37.38],[50.21,37.34],[50.34,37.15],[50.53,37.01],[50.93,36.81],[51.12,36.74],[51.76,36.61],[52.19,36.62],[53.37,36.87],[53.77,36.93],[53.92,36.93],[53.83,36.88],[53.68,36.85],[53.77,36.82],[53.91,36.81],[53.97,36.82],[54.02,36.85],[54.02,36.9],[54.02,36.95],[53.95,37.18],[53.91,37.34],[54.19,37.33],[54.3,37.35],[54.46,37.41],[54.58,37.44],[54.64,37.44],[54.7,37.47],[54.75,37.5],[54.85,37.72],[54.9,37.78],[55.08,37.9],[55.22,37.98],[55.38,38.05],[55.58,38.1],[55.84,38.09],[56.05,38.08],[56.17,38.08],[56.23,38.07],[56.27,38.08],[56.3,38.09],[56.32,38.19],[56.37,38.22],[56.44,38.25],[56.54,38.25],[56.67,38.26],[56.77,38.25],[56.91,38.21],[57.08,38.21],[57.19,38.22],[57.26,38.18],[57.31,38.13],[57.33,38.09],[57.34,38.03],[57.34,37.99],[57.35,37.97],[57.42,37.95],[57.52,37.93],[57.71,37.91],[57.89,37.86],[57.98,37.83],[58.11,37.78],[58.26,37.67],[58.32,37.65],[58.39,37.64],[58.44,37.64],[58.55,37.69],[58.65,37.65],[58.7,37.66],[58.82,37.68],[58.94,37.65],[59.24,37.52],[59.27,37.52],[59.3,37.51],[59.33,37.48],[59.34,37.44],[59.37,37.33],[59.45,37.25],[59.56,37.18],[59.69,37.14],[59.95,37.04],[60.06,36.96],[60.18,36.83],[60.32,36.65],[60.34,36.64],[60.71,36.64],[61.12,36.64],[61.17,36.57],[61.16,36.43],[61.18,36.29],[61.21,36.19],[61.21,36.1],[61.18,36.05],[61.16,36.0],[61.15,35.98],[61.21,35.94],[61.25,35.87],[61.26,35.76],[61.24,35.71],[61.24,35.66],[61.26,35.62]],[[56.19,26.92],[56.09,26.8],[55.95,26.7],[55.89,26.73],[55.85,26.73],[55.75,26.69],[55.67,26.69],[55.54,26.62],[55.42,26.58],[55.34,26.59],[55.31,26.59],[55.3,26.64],[55.3,26.66],[55.35,26.65],[55.53,26.71],[55.76,26.81],[55.78,26.86],[55.75,26.93],[55.76,26.95],[55.91,26.91],[56.07,26.98],[56.21,27.0],[56.28,26.95],[56.19,26.92]]]},{"n":"Iraq","r":[[[44.77,37.14],[44.77,37.14],[44.8,37.06],[44.88,36.8],[44.93,36.77],[44.98,36.74],[45.02,36.7],[45.03,36.66],[45.03,36.6],[45.03,36.53],[45.05,36.47],[45.08,36.43],[45.11,36.41],[45.16,36.41],[45.21,36.4],[45.24,36.36],[45.35,36.05],[45.36,36.02],[45.41,36.0],[45.48,36.01],[45.56,35.98],[45.65,35.93],[45.72,35.84],[45.78,35.82],[45.94,35.84],[46.17,35.82],[46.27,35.77],[46.26,35.74],[46.18,35.71],[46.04,35.67],[46.0,35.61],[45.97,35.52],[45.98,35.48],[46.01,35.42],[46.11,35.32],[46.12,35.28],[46.14,35.23],[46.15,35.2],[46.13,35.13],[46.04,35.08],[45.92,35.03],[45.68,34.8],[45.66,34.75],[45.66,34.61],[45.64,34.57],[45.56,34.57],[45.5,34.58],[45.5,34.53],[45.46,34.47],[45.44,34.42],[45.53,34.28],[45.54,34.22],[45.53,34.15],[45.45,34.04],[45.4,33.97],[45.41,33.95],[45.47,33.93],[45.67,33.69],[45.74,33.6],[45.82,33.62],[45.85,33.62],[45.88,33.61],[45.89,33.58],[45.89,33.55],[45.87,33.49],[45.98,33.47],[46.02,33.42],[46.15,33.23],[46.14,33.17],[46.08,33.09],[46.08,33.03],[46.09,32.98],[46.11,32.96],[46.3,32.95],[46.38,32.93],[46.57,32.83],[46.79,32.69],[46.97,32.57],[47.12,32.47],[47.29,32.47],[47.33,32.46],[47.37,32.42],[47.42,32.34],[47.51,32.15],[47.59,32.09],[47.71,31.94],[47.83,31.79],[47.75,31.6],[47.68,31.4],[47.68,31.14],[47.68,31.0],[47.84,31.0],[48.01,30.99],[48.01,30.82],[48.01,30.66],[48.01,30.47],[48.07,30.46],[48.15,30.42],[48.18,30.36],[48.23,30.32],[48.28,30.32],[48.33,30.29],[48.38,30.23],[48.4,30.19],[48.39,30.16],[48.4,30.11],[48.43,30.04],[48.48,30.0],[48.55,29.96],[48.45,29.94],[48.35,29.96],[48.14,30.04],[48.07,30.04],[47.98,30.01],[47.98,29.98],[47.75,30.08],[47.67,30.1],[47.64,30.1],[47.51,30.1],[47.33,30.08],[47.22,30.04],[47.15,30.0],[47.11,29.96],[47.1,29.94],[47.04,29.82],[46.98,29.67],[46.91,29.54],[46.77,29.35],[46.69,29.26],[46.53,29.1],[46.36,29.06],[45.95,29.1],[45.5,29.13],[45.05,29.17],[44.72,29.19],[44.69,29.2],[44.36,29.44],[44.1,29.62],[43.77,29.85],[43.44,30.08],[43.1,30.32],[42.86,30.5],[42.56,30.72],[42.29,30.92],[42.07,31.08],[41.8,31.22],[41.59,31.33],[41.27,31.49],[41.02,31.62],[40.81,31.73],[40.48,31.89],[40.37,31.94],[40.03,32.0],[39.7,32.04],[39.37,32.09],[39.15,32.12],[39.29,32.24],[39.25,32.35],[39.14,32.33],[39.04,32.31],[38.98,32.47],[39.06,32.49],[38.99,32.71],[38.91,32.93],[38.85,33.15],[38.77,33.37],[39.06,33.51],[39.27,33.62],[39.56,33.77],[39.85,33.91],[40.12,34.05],[40.42,34.2],[40.69,34.33],[40.94,34.39],[40.99,34.43],[41.1,34.61],[41.19,34.77],[41.2,34.81],[41.2,35.03],[41.22,35.29],[41.25,35.43],[41.3,35.55],[41.35,35.64],[41.36,35.72],[41.35,35.81],[41.3,35.94],[41.25,36.07],[41.25,36.2],[41.26,36.27],[41.3,36.38],[41.35,36.46],[41.42,36.51],[41.65,36.57],[41.79,36.6],[41.97,36.74],[42.08,36.83],[42.24,36.96],[42.35,37.06],[42.36,37.1],[42.36,37.11],[42.46,37.13],[42.64,37.25],[42.74,37.36],[42.77,37.37],[42.87,37.33],[42.94,37.32],[43.09,37.37],[43.19,37.34],[43.26,37.32],[43.31,37.31],[43.52,37.24],[43.57,37.24],[43.68,37.23],[43.84,37.22],[43.94,37.27],[44.01,37.31],[44.06,37.31],[44.11,37.3],[44.16,37.28],[44.19,37.25],[44.21,37.2],[44.2,37.05],[44.22,37.01],[44.25,36.98],[44.28,36.98],[44.33,37.01],[44.4,37.06],[44.5,37.11],[44.57,37.16],[44.61,37.18],[44.67,37.17],[44.73,37.17],[44.77,37.14]]]},{"n":"Iceland","r":[[[-15.54,66.23],[-15.43,66.22],[-15.24,66.26],[-15.16,66.28],[-14.97,66.36],[-14.86,66.38],[-14.68,66.38],[-14.6,66.38],[-14.59,66.37],[-14.7,66.34],[-14.79,66.33],[-14.91,66.28],[-15.03,66.18],[-15.12,66.13],[-15.12,66.1],[-15.01,66.06],[-14.89,66.04],[-14.79,66.06],[-14.74,66.05],[-14.7,66.02],[-14.67,65.99],[-14.67,65.96],[-14.69,65.9],[-14.75,65.83],[-14.84,65.78],[-14.83,65.76],[-14.76,65.76],[-14.43,65.79],[-14.39,65.79],[-14.37,65.77],[-14.37,65.74],[-14.35,65.71],[-14.32,65.68],[-14.33,65.66],[-14.47,65.58],[-14.3,65.63],[-14.17,65.64],[-13.94,65.62],[-13.84,65.59],[-13.79,65.53],[-13.71,65.55],[-13.67,65.55],[-13.62,65.52],[-13.62,65.49],[-13.65,65.44],[-13.67,65.4],[-13.71,65.38],[-13.78,65.37],[-13.8,65.35],[-13.77,65.32],[-13.72,65.29],[-13.65,65.29],[-13.64,65.28],[-13.64,65.26],[-13.65,65.24],[-13.67,65.22],[-13.71,65.22],[-13.75,65.19],[-13.58,65.14],[-13.56,65.12],[-13.56,65.1],[-13.57,65.07],[-13.6,65.04],[-13.65,65.02],[-13.78,65.01],[-13.85,64.99],[-13.83,64.96],[-13.83,64.91],[-13.85,64.86],[-13.95,64.78],[-14.04,64.74],[-14.14,64.71],[-14.3,64.72],[-14.39,64.75],[-14.38,64.68],[-14.47,64.64],[-14.45,64.6],[-14.42,64.58],[-14.43,64.54],[-14.48,64.49],[-14.55,64.45],[-14.63,64.42],[-14.79,64.38],[-14.93,64.32],[-15.02,64.3],[-15.26,64.3],[-15.49,64.26],[-15.83,64.18],[-16.06,64.11],[-16.24,64.04],[-16.47,63.92],[-16.64,63.87],[-16.74,63.85],[-16.93,63.84],[-17.1,63.81],[-17.63,63.75],[-17.82,63.71],[-17.84,63.68],[-17.91,63.64],[-17.92,63.62],[-17.89,63.61],[-17.88,63.59],[-17.95,63.54],[-18.08,63.5],[-18.14,63.5],[-18.22,63.53],[-18.25,63.53],[-18.27,63.52],[-18.27,63.51],[-18.22,63.47],[-18.3,63.45],[-18.65,63.41],[-19.25,63.44],[-19.49,63.48],[-19.78,63.54],[-19.95,63.55],[-20.2,63.56],[-20.4,63.64],[-20.49,63.69],[-20.5,63.71],[-20.49,63.73],[-20.47,63.75],[-20.44,63.76],[-20.37,63.76],[-20.36,63.76],[-20.41,63.81],[-20.46,63.79],[-20.59,63.74],[-20.65,63.74],[-20.73,63.77],[-20.73,63.79],[-20.88,63.8],[-21.01,63.84],[-21.14,63.89],[-21.16,63.91],[-21.09,63.93],[-21.11,63.94],[-21.15,63.94],[-21.25,63.94],[-21.39,63.87],[-21.45,63.86],[-22.37,63.84],[-22.61,63.84],[-22.65,63.83],[-22.69,63.87],[-22.73,63.96],[-22.74,64.02],[-22.73,64.05],[-22.7,64.08],[-22.65,64.08],[-22.6,64.05],[-22.56,64.01],[-22.51,63.99],[-22.19,64.04],[-22.06,64.07],[-22.0,64.1],[-21.94,64.15],[-21.87,64.18],[-21.83,64.21],[-21.77,64.28],[-21.72,64.32],[-21.67,64.35],[-21.61,64.37],[-21.46,64.38],[-21.56,64.4],[-21.65,64.4],[-21.95,64.31],[-22.05,64.31],[-22.05,64.33],[-22.01,64.35],[-21.9,64.39],[-21.97,64.39],[-22.0,64.41],[-22.0,64.45],[-21.95,64.51],[-21.7,64.6],[-21.62,64.61],[-21.59,64.63],[-21.62,64.64],[-21.67,64.65],[-21.92,64.56],[-22.11,64.53],[-22.16,64.54],[-22.25,64.57],[-22.28,64.59],[-22.32,64.62],[-22.32,64.65],[-22.23,64.71],[-22.25,64.73],[-22.31,64.73],[-22.47,64.79],[-22.72,64.79],[-23.35,64.82],[-23.48,64.81],[-23.69,64.76],[-23.82,64.74],[-23.88,64.75],[-23.93,64.78],[-23.98,64.82],[-24.03,64.86],[-24.01,64.9],[-23.92,64.92],[-23.86,64.92],[-23.69,64.91],[-23.49,64.95],[-23.35,64.95],[-23.31,64.96],[-23.24,64.99],[-23.2,65.0],[-23.14,64.99],[-23.11,64.97],[-22.9,65.0],[-22.83,65.02],[-22.82,65.03],[-22.79,65.05],[-22.68,65.03],[-22.6,65.03],[-22.49,65.04],[-22.31,65.05],[-21.89,65.05],[-21.83,65.08],[-21.8,65.11],[-21.76,65.17],[-21.78,65.19],[-22.04,65.13],[-22.1,65.13],[-22.4,65.16],[-22.51,65.2],[-22.47,65.23],[-22.31,65.29],[-22.15,65.34],[-21.91,65.4],[-21.85,65.42],[-21.84,65.45],[-22.01,65.49],[-22.31,65.48],[-22.39,65.54],[-22.64,65.57],[-22.81,65.55],[-22.9,65.58],[-23.12,65.53],[-23.6,65.47],[-23.8,65.42],[-23.9,65.41],[-24.02,65.45],[-24.22,65.49],[-24.45,65.5],[-24.48,65.53],[-24.34,65.6],[-24.25,65.61],[-24.16,65.61],[-23.98,65.55],[-23.86,65.54],[-24.01,65.62],[-24.01,65.65],[-24.02,65.69],[-24.07,65.71],[-24.11,65.76],[-24.09,65.78],[-24.03,65.78],[-23.91,65.77],[-23.62,65.68],[-23.47,65.69],[-23.39,65.73],[-23.29,65.75],[-23.32,65.76],[-23.57,65.76],[-23.7,65.78],[-23.77,65.81],[-23.83,65.85],[-23.81,65.87],[-23.74,65.88],[-23.52,65.88],[-23.67,65.95],[-23.77,66.0],[-23.78,66.02],[-23.77,66.04],[-23.76,66.06],[-23.74,66.07],[-23.49,66.03],[-23.43,66.02],[-23.48,66.05],[-23.59,66.09],[-23.6,66.11],[-23.55,66.12],[-23.53,66.15],[-23.53,66.16],[-23.45,66.18],[-23.38,66.18],[-23.3,66.17],[-23.06,66.09],[-23.03,66.06],[-23.02,66.03],[-23.03,66.0],[-23.02,65.98],[-22.93,65.99],[-22.85,65.98],[-22.82,65.98],[-22.72,66.04],[-22.66,66.03],[-22.62,66.0],[-22.61,65.98],[-22.6,65.94],[-22.62,65.88],[-22.62,65.87],[-22.55,65.91],[-22.44,65.91],[-22.43,65.93],[-22.42,66.0],[-22.43,66.06],[-22.45,66.07],[-22.81,66.15],[-22.87,66.17],[-22.95,66.21],[-22.93,66.23],[-22.86,66.25],[-22.76,66.26],[-22.51,66.26],[-22.48,66.27],[-22.53,66.29],[-22.65,66.3],[-22.67,66.31],[-22.69,66.34],[-22.82,66.32],[-22.97,66.32],[-23.12,66.34],[-23.12,66.36],[-23.06,66.38],[-22.94,66.43],[-22.89,66.44],[-22.72,66.43],[-22.56,66.45],[-22.43,66.43],[-22.32,66.39],[-22.17,66.31],[-21.97,66.26],[-21.95,66.24],[-21.84,66.2],[-21.63,66.09],[-21.41,66.03],[-21.4,66.01],[-21.43,65.99],[-21.52,65.97],[-21.5,65.96],[-21.39,65.94],[-21.31,65.9],[-21.3,65.88],[-21.37,65.74],[-21.41,65.71],[-21.46,65.7],[-21.66,65.72],[-21.61,65.68],[-21.47,65.64],[-21.43,65.61],[-21.46,65.58],[-21.44,65.58],[-21.39,65.59],[-21.36,65.58],[-21.37,65.54],[-21.4,65.5],[-21.43,65.47],[-21.42,65.46],[-21.37,65.47],[-21.31,65.46],[-21.23,65.42],[-21.16,65.3],[-21.13,65.27],[-21.11,65.3],[-21.08,65.38],[-21.05,65.43],[-21.02,65.43],[-21.0,65.44],[-20.98,65.47],[-20.94,65.57],[-20.8,65.64],[-20.74,65.66],[-20.68,65.66],[-20.65,65.65],[-20.55,65.58],[-20.49,65.57],[-20.45,65.57],[-20.41,65.62],[-20.36,65.72],[-20.34,65.83],[-20.37,65.95],[-20.36,66.03],[-20.29,66.08],[-20.21,66.1],[-20.1,66.08],[-20.03,66.05],[-19.87,65.93],[-19.75,65.87],[-19.65,65.8],[-19.59,65.78],[-19.49,65.77],[-19.46,65.77],[-19.44,65.79],[-19.43,65.81],[-19.46,65.98],[-19.43,66.04],[-19.38,66.08],[-19.2,66.1],[-19.09,66.12],[-18.99,66.16],[-18.91,66.18],[-18.85,66.18],[-18.78,66.17],[-18.71,66.14],[-18.59,66.07],[-18.45,65.96],[-18.28,65.88],[-18.18,65.76],[-18.16,65.74],[-18.14,65.73],[-18.12,65.75],[-18.1,65.77],[-18.1,65.83],[-18.15,65.91],[-18.32,66.09],[-18.32,66.13],[-18.3,66.16],[-18.18,66.16],[-17.91,66.14],[-17.82,66.11],[-17.63,66.0],[-17.58,65.97],[-17.55,65.96],[-17.54,65.98],[-17.47,66.0],[-17.42,66.03],[-17.33,66.09],[-17.15,66.2],[-17.12,66.21],[-17.06,66.2],[-16.97,66.17],[-16.93,66.14],[-16.84,66.13],[-16.75,66.13],[-16.62,66.17],[-16.49,66.2],[-16.44,66.25],[-16.43,66.28],[-16.54,66.45],[-16.49,66.48],[-16.25,66.52],[-16.04,66.53],[-15.99,66.51],[-15.85,66.43],[-15.76,66.39],[-15.71,66.36],[-15.7,66.29],[-15.65,66.26],[-15.54,66.23]]]},{"n":"Israel","r":[[[34.9,29.48],[34.87,29.56],[34.79,29.81],[34.74,29.98],[34.66,30.19],[34.53,30.45],[34.52,30.51],[34.49,30.6],[34.4,30.83],[34.33,31.0],[34.25,31.21],[34.35,31.29],[34.35,31.36],[34.53,31.53],[34.52,31.54],[34.48,31.58],[34.48,31.59],[34.68,31.9],[34.8,32.2],[34.92,32.61],[35.01,32.83],[35.08,32.97],[35.11,33.08],[35.22,33.09],[35.31,33.08],[35.41,33.08],[35.49,33.12],[35.53,33.25],[35.58,33.27],[35.6,33.24],[35.63,33.28],[35.73,33.33],[35.79,33.37],[35.84,33.42],[35.87,33.43],[35.85,33.37],[35.84,33.33],[35.84,33.28],[35.86,33.25],[35.89,33.19],[35.91,33.14],[35.87,33.09],[35.87,33.04],[35.88,33.0],[35.91,32.95],[35.86,32.86],[35.8,32.78],[35.79,32.73],[35.73,32.73],[35.61,32.68],[35.59,32.67],[35.57,32.64],[35.57,32.62],[35.55,32.4],[35.48,32.4],[35.4,32.45],[35.39,32.49],[35.36,32.51],[35.3,32.51],[35.19,32.53],[35.07,32.46],[35.01,32.34],[35.0,32.28],[34.96,32.16],[34.97,32.09],[34.98,31.99],[34.99,31.91],[34.98,31.87],[34.95,31.84],[34.96,31.82],[34.98,31.82],[35.05,31.84],[35.13,31.82],[35.2,31.78],[35.2,31.75],[35.15,31.73],[35.03,31.67],[34.95,31.6],[34.93,31.54],[34.87,31.4],[34.88,31.37],[34.91,31.35],[35.1,31.37],[35.28,31.42],[35.41,31.48],[35.45,31.48],[35.42,31.33],[35.42,31.32],[35.4,31.23],[35.41,31.21],[35.44,31.13],[35.38,30.98],[35.32,30.86],[35.3,30.8],[35.24,30.67],[35.17,30.52],[35.14,30.42],[35.15,30.38],[35.13,30.2],[35.14,30.14],[35.07,29.98],[35.05,29.9],[35.02,29.79],[34.97,29.56],[34.9,29.48]]]},{"n":"Italy","r":[[[10.45,46.86],[10.48,46.86],[10.58,46.85],[10.69,46.85],[10.76,46.79],[10.83,46.78],[10.93,46.77],[10.99,46.78],[11.03,46.8],[11.06,46.86],[11.13,46.94],[11.24,46.98],[11.43,46.98],[11.53,47.0],[11.63,47.0],[11.7,46.98],[11.78,46.99],[11.97,47.04],[12.17,47.08],[12.2,47.08],[12.2,47.06],[12.17,47.03],[12.13,46.98],[12.15,46.94],[12.27,46.84],[12.33,46.76],[12.39,46.7],[12.48,46.67],[12.6,46.65],[12.7,46.65],[12.81,46.63],[13.17,46.57],[13.35,46.56],[13.49,46.56],[13.7,46.52],[13.68,46.46],[13.64,46.45],[13.56,46.42],[13.48,46.37],[13.4,46.32],[13.38,46.26],[13.4,46.22],[13.42,46.21],[13.45,46.22],[13.49,46.22],[13.54,46.2],[13.63,46.18],[13.63,46.16],[13.62,46.13],[13.55,46.09],[13.49,46.04],[13.48,46.01],[13.49,45.99],[13.51,45.97],[13.6,45.98],[13.61,45.96],[13.57,45.83],[13.58,45.81],[13.66,45.79],[13.72,45.76],[13.83,45.68],[13.87,45.61],[13.84,45.59],[13.78,45.58],[13.72,45.59],[13.78,45.63],[13.63,45.77],[13.56,45.77],[13.47,45.71],[13.21,45.77],[13.16,45.75],[13.12,45.7],[13.03,45.64],[12.9,45.61],[12.76,45.54],[12.61,45.5],[12.5,45.46],[12.43,45.47],[12.54,45.54],[12.49,45.55],[12.35,45.49],[12.27,45.45],[12.25,45.37],[12.23,45.24],[12.29,45.21],[12.39,45.04],[12.52,44.97],[12.5,44.9],[12.46,44.85],[12.38,44.8],[12.32,44.83],[12.28,44.83],[12.25,44.72],[12.3,44.43],[12.4,44.22],[12.49,44.13],[12.69,43.99],[12.91,43.92],[13.3,43.69],[13.51,43.61],[13.56,43.57],[13.69,43.39],[13.8,43.18],[13.92,42.85],[14.01,42.69],[14.18,42.51],[14.54,42.24],[14.87,42.05],[15.17,41.93],[15.4,41.91],[15.96,41.94],[16.06,41.93],[16.16,41.9],[16.19,41.81],[16.15,41.76],[16.03,41.7],[15.91,41.62],[15.9,41.51],[16.01,41.44],[16.55,41.23],[17.1,41.06],[17.28,40.98],[17.47,40.84],[17.95,40.66],[18.04,40.56],[18.33,40.37],[18.46,40.22],[18.49,40.1],[18.42,39.99],[18.39,39.9],[18.34,39.82],[18.22,39.85],[18.08,39.94],[17.87,40.28],[17.48,40.31],[17.4,40.34],[17.26,40.4],[17.25,40.44],[17.22,40.49],[17.18,40.5],[17.03,40.51],[16.93,40.46],[16.81,40.33],[16.67,40.14],[16.53,39.86],[16.52,39.75],[16.6,39.64],[16.82,39.58],[17.0,39.48],[17.11,39.38],[17.12,39.14],[17.17,39.0],[17.1,38.92],[16.95,38.94],[16.76,38.89],[16.62,38.8],[16.56,38.71],[16.57,38.49],[16.55,38.41],[16.28,38.25],[16.14,38.09],[16.11,38.02],[16.06,37.94],[15.72,37.94],[15.65,38.03],[15.64,38.18],[15.7,38.26],[15.82,38.3],[15.9,38.48],[15.88,38.61],[15.93,38.67],[15.97,38.71],[16.07,38.74],[16.2,38.76],[16.21,38.94],[16.11,39.02],[16.07,39.14],[16.02,39.35],[15.85,39.63],[15.76,39.87],[15.69,39.99],[15.59,40.05],[15.39,40.05],[15.29,40.07],[14.95,40.24],[14.93,40.26],[14.93,40.31],[14.99,40.38],[14.95,40.47],[14.91,40.56],[14.84,40.63],[14.77,40.67],[14.61,40.64],[14.56,40.63],[14.46,40.63],[14.38,40.6],[14.34,40.6],[14.46,40.73],[14.43,40.76],[14.31,40.81],[14.15,40.82],[14.1,40.83],[14.08,40.79],[14.04,40.81],[14.05,40.87],[13.86,41.13],[13.73,41.24],[13.67,41.25],[13.55,41.23],[13.36,41.28],[13.25,41.29],[13.18,41.28],[13.09,41.24],[13.04,41.27],[13.02,41.3],[12.85,41.41],[12.63,41.47],[12.21,41.81],[12.08,41.94],[11.81,42.08],[11.64,42.29],[11.5,42.36],[11.3,42.42],[11.25,42.42],[11.19,42.39],[11.14,42.39],[11.1,42.42],[11.14,42.44],[11.18,42.46],[11.17,42.54],[10.94,42.74],[10.8,42.8],[10.77,42.84],[10.74,42.9],[10.71,42.94],[10.64,42.96],[10.59,42.95],[10.51,42.97],[10.52,43.07],[10.53,43.14],[10.52,43.2],[10.45,43.37],[10.32,43.51],[10.25,43.85],[10.19,43.95],[10.05,44.02],[9.73,44.1],[9.29,44.32],[9.2,44.32],[8.93,44.41],[8.77,44.42],[8.55,44.35],[8.29,44.14],[8.08,43.92],[8.0,43.88],[7.73,43.8],[7.49,43.77],[7.49,43.82],[7.48,43.86],[7.52,43.91],[7.59,43.97],[7.65,44.03],[7.68,44.08],[7.67,44.12],[7.64,44.16],[7.6,44.17],[7.37,44.13],[7.32,44.14],[7.15,44.2],[6.97,44.28],[6.9,44.34],[6.87,44.39],[6.89,44.43],[6.88,44.46],[6.84,44.51],[6.88,44.56],[6.93,44.63],[6.96,44.68],[7.01,44.69],[7.03,44.72],[6.99,44.83],[6.97,44.85],[6.94,44.86],[6.89,44.86],[6.8,44.88],[6.74,44.92],[6.72,44.97],[6.69,45.02],[6.63,45.07],[6.63,45.12],[6.69,45.14],[6.78,45.15],[6.84,45.14],[6.98,45.22],[7.03,45.22],[7.08,45.24],[7.12,45.35],[7.15,45.38],[7.15,45.4],[7.13,45.42],[7.01,45.5],[6.96,45.58],[6.88,45.67],[6.81,45.71],[6.79,45.74],[6.79,45.78],[6.8,45.81],[6.94,45.87],[7.02,45.93],[7.06,45.9],[7.13,45.88],[7.33,45.91],[7.45,45.94],[7.54,45.98],[7.59,45.97],[7.79,45.92],[7.85,45.95],[7.99,46.02],[8.01,46.05],[8.13,46.16],[8.13,46.19],[8.08,46.26],[8.1,46.27],[8.23,46.34],[8.3,46.4],[8.37,46.45],[8.42,46.45],[8.44,46.43],[8.44,46.4],[8.44,46.28],[8.46,46.25],[8.57,46.16],[8.64,46.11],[8.82,46.08],[8.83,46.06],[8.78,46.0],[8.89,45.92],[8.9,45.86],[8.95,45.83],[9.02,45.85],[9.05,45.88],[9.02,45.93],[9.0,45.98],[9.0,46.01],[9.02,46.05],[9.07,46.1],[9.2,46.22],[9.25,46.29],[9.26,46.39],[9.26,46.48],[9.3,46.5],[9.4,46.48],[9.43,46.48],[9.44,46.43],[9.48,46.35],[9.53,46.31],[9.58,46.3],[9.64,46.3],[9.79,46.35],[9.88,46.37],[9.94,46.36],[9.97,46.33],[10.04,46.24],[10.08,46.23],[10.13,46.24],[10.15,46.25],[10.13,46.29],[10.11,46.36],[10.08,46.42],[10.05,46.45],[10.04,46.48],[10.06,46.55],[10.09,46.6],[10.14,46.61],[10.2,46.62],[10.27,46.56],[10.36,46.55],[10.43,46.55],[10.44,46.58],[10.44,46.62],[10.4,46.67],[10.41,46.73],[10.45,46.86]],[[12.05,36.76],[12.0,36.75],[11.94,36.78],[11.94,36.83],[11.95,36.84],[12.02,36.82],[12.05,36.78],[12.05,36.76]],[[15.58,38.22],[15.51,38.11],[15.48,38.06],[15.23,37.78],[15.21,37.72],[15.19,37.65],[15.16,37.59],[15.13,37.53],[15.1,37.46],[15.11,37.38],[15.12,37.33],[15.15,37.31],[15.19,37.28],[15.23,37.24],[15.17,37.21],[15.24,37.14],[15.29,37.1],[15.3,37.06],[15.29,37.01],[15.19,36.93],[15.14,36.89],[15.12,36.84],[15.1,36.79],[15.12,36.74],[15.11,36.69],[15.0,36.69],[14.89,36.72],[14.78,36.71],[14.61,36.77],[14.56,36.78],[14.5,36.8],[14.37,36.97],[14.26,37.05],[14.14,37.1],[14.02,37.11],[13.91,37.1],[13.8,37.14],[13.59,37.25],[13.36,37.35],[13.26,37.41],[13.22,37.45],[13.17,37.48],[13.04,37.51],[12.92,37.57],[12.87,37.58],[12.76,37.57],[12.7,37.57],[12.64,37.59],[12.53,37.67],[12.45,37.77],[12.44,37.82],[12.49,37.94],[12.55,38.05],[12.6,38.08],[12.66,38.11],[12.7,38.14],[12.73,38.18],[12.85,38.06],[12.9,38.03],[12.96,38.04],[13.05,38.08],[13.06,38.13],[13.16,38.19],[13.29,38.19],[13.35,38.18],[13.38,38.13],[13.43,38.11],[13.49,38.1],[13.68,38.0],[13.73,37.98],[13.79,37.98],[13.94,38.02],[14.05,38.04],[14.29,38.02],[14.42,38.04],[14.51,38.05],[14.64,38.09],[14.74,38.15],[14.79,38.17],[14.85,38.17],[14.98,38.17],[15.12,38.15],[15.18,38.17],[15.22,38.21],[15.28,38.23],[15.34,38.22],[15.5,38.29],[15.57,38.3],[15.63,38.27],[15.58,38.22]],[[8.48,39.07],[8.42,38.97],[8.36,39.04],[8.36,39.1],[8.37,39.12],[8.44,39.09],[8.48,39.07]],[[13.94,40.71],[13.89,40.7],[13.87,40.71],[13.85,40.72],[13.87,40.76],[13.96,40.74],[13.96,40.72],[13.94,40.71]],[[8.29,41.04],[8.25,40.99],[8.21,41.0],[8.22,41.03],[8.27,41.1],[8.32,41.12],[8.34,41.1],[8.32,41.06],[8.29,41.04]],[[9.63,40.88],[9.68,40.82],[9.79,40.56],[9.81,40.5],[9.78,40.44],[9.75,40.4],[9.64,40.27],[9.66,40.16],[9.7,40.09],[9.71,40.02],[9.69,39.92],[9.62,39.35],[9.58,39.25],[9.56,39.17],[9.49,39.14],[9.39,39.17],[9.26,39.22],[9.21,39.21],[9.15,39.2],[9.1,39.21],[9.06,39.24],[9.02,39.04],[8.97,38.96],[8.88,38.91],[8.8,38.91],[8.72,38.93],[8.65,38.93],[8.6,38.96],[8.55,39.03],[8.49,39.11],[8.42,39.21],[8.41,39.29],[8.4,39.48],[8.42,39.52],[8.45,39.56],[8.46,39.65],[8.45,39.72],[8.47,39.75],[8.51,39.72],[8.54,39.73],[8.54,39.77],[8.55,39.84],[8.5,39.9],[8.41,39.92],[8.4,39.98],[8.41,40.04],[8.46,40.08],[8.47,40.13],[8.47,40.29],[8.41,40.35],[8.39,40.44],[8.35,40.5],[8.3,40.56],[8.23,40.61],[8.19,40.65],[8.18,40.77],[8.2,40.87],[8.22,40.91],[8.25,40.91],[8.31,40.86],[8.36,40.85],[8.47,40.83],[8.57,40.85],[8.7,40.9],[8.82,40.95],[9.0,41.11],[9.11,41.14],[9.16,41.19],[9.18,41.24],[9.23,41.26],[9.28,41.2],[9.35,41.2],[9.46,41.15],[9.5,41.11],[9.54,41.05],[9.58,41.03],[9.62,41.02],[9.62,41.0],[9.59,40.99],[9.55,40.93],[9.57,40.91],[9.63,40.88]],[[10.4,42.86],[10.43,42.82],[10.43,42.8],[10.41,42.77],[10.42,42.71],[10.34,42.76],[10.21,42.74],[10.13,42.74],[10.11,42.79],[10.13,42.81],[10.25,42.82],[10.29,42.83],[10.36,42.82],[10.4,42.86]]]},{"n":"Jamaica","r":[[[-77.26,18.46],[-77.14,18.42],[-77.01,18.4],[-76.96,18.4],[-76.91,18.39],[-76.79,18.3],[-76.7,18.26],[-76.35,18.15],[-76.23,17.97],[-76.21,17.91],[-76.3,17.88],[-76.42,17.87],[-76.52,17.87],[-76.63,17.9],[-76.67,17.93],[-76.77,17.94],[-76.75,17.96],[-76.79,17.98],[-76.85,17.97],[-76.9,17.9],[-76.94,17.85],[-77.04,17.85],[-77.07,17.9],[-77.12,17.88],[-77.16,17.85],[-77.2,17.71],[-77.28,17.78],[-77.36,17.83],[-77.46,17.86],[-77.67,17.86],[-77.77,17.88],[-77.85,17.99],[-77.88,18.02],[-77.96,18.05],[-78.04,18.17],[-78.07,18.19],[-78.29,18.22],[-78.34,18.29],[-78.33,18.35],[-78.25,18.43],[-78.22,18.45],[-78.09,18.44],[-77.98,18.47],[-77.93,18.5],[-77.87,18.52],[-77.45,18.47],[-77.35,18.47],[-77.26,18.46]]]},{"n":"Jersey","r":[[[-2.02,49.23],[-2.01,49.18],[-2.05,49.17],[-2.09,49.19],[-2.17,49.19],[-2.24,49.18],[-2.22,49.27],[-2.08,49.26],[-2.02,49.23]]]},{"n":"Jordan","r":[[[38.77,33.37],[38.85,33.15],[38.91,32.93],[38.99,32.71],[39.06,32.49],[38.98,32.47],[39.04,32.31],[39.14,32.33],[39.25,32.35],[39.29,32.24],[39.15,32.12],[39.0,32.01],[38.96,31.99],[38.77,31.95],[38.38,31.85],[38.11,31.78],[37.77,31.7],[37.49,31.63],[37.22,31.56],[36.96,31.49],[37.11,31.36],[37.33,31.15],[37.48,31.01],[37.66,30.83],[37.81,30.67],[37.98,30.5],[37.86,30.44],[37.67,30.35],[37.65,30.33],[37.63,30.31],[37.55,30.14],[37.49,30.01],[37.47,30.0],[37.2,29.95],[36.93,29.9],[36.76,29.87],[36.7,29.83],[36.59,29.67],[36.48,29.5],[36.28,29.36],[36.07,29.2],[36.02,29.19],[35.86,29.21],[35.6,29.25],[35.34,29.29],[35.16,29.32],[34.95,29.35],[34.98,29.48],[34.97,29.56],[35.02,29.79],[35.05,29.9],[35.07,29.98],[35.14,30.14],[35.13,30.2],[35.15,30.38],[35.14,30.42],[35.17,30.52],[35.24,30.67],[35.3,30.8],[35.32,30.86],[35.38,30.98],[35.44,31.13],[35.41,31.21],[35.4,31.23],[35.42,31.32],[35.42,31.33],[35.45,31.48],[35.47,31.56],[35.5,31.67],[35.56,31.77],[35.53,31.98],[35.53,32.1],[35.57,32.24],[35.55,32.4],[35.57,32.62],[35.57,32.64],[35.59,32.67],[35.61,32.68],[35.73,32.73],[35.79,32.73],[35.89,32.71],[35.96,32.67],[36.06,32.53],[36.22,32.5],[36.28,32.46],[36.37,32.39],[36.48,32.36],[36.82,32.32],[37.09,32.47],[37.32,32.59],[37.58,32.73],[37.75,32.83],[38.06,32.99],[38.25,33.1],[38.52,33.24],[38.77,33.37]]]},{"n":"Japan","r":[[[123.89,24.28],[123.83,24.27],[123.75,24.28],[123.68,24.29],[123.68,24.32],[123.75,24.35],[123.75,24.39],[123.77,24.41],[123.93,24.36],[123.93,24.32],[123.89,24.28]],[[124.29,24.52],[124.23,24.36],[124.19,24.34],[124.14,24.35],[124.08,24.44],[124.12,24.47],[124.17,24.45],[124.21,24.46],[124.3,24.59],[124.32,24.57],[124.29,24.52]],[[125.44,24.74],[125.36,24.72],[125.27,24.73],[125.28,24.87],[125.31,24.85],[125.33,24.8],[125.4,24.78],[125.44,24.74]],[[142.19,26.62],[142.17,26.62],[142.11,26.72],[142.13,26.73],[142.16,26.71],[142.2,26.65],[142.19,26.62]],[[128.26,26.65],[128.16,26.61],[128.13,26.55],[128.04,26.53],[127.95,26.46],[127.87,26.44],[127.87,26.38],[127.9,26.33],[127.85,26.32],[127.79,26.26],[127.79,26.21],[127.81,26.17],[127.8,26.15],[127.73,26.1],[127.65,26.09],[127.65,26.15],[127.65,26.2],[127.73,26.31],[127.73,26.43],[127.8,26.45],[127.82,26.47],[127.93,26.56],[127.95,26.59],[127.89,26.63],[127.89,26.67],[127.91,26.69],[127.99,26.68],[128.03,26.65],[128.05,26.64],[128.1,26.67],[128.12,26.71],[128.22,26.8],[128.25,26.88],[128.33,26.81],[128.31,26.72],[128.26,26.65]],[[129.0,27.72],[128.96,27.7],[128.9,27.73],[128.88,27.84],[128.91,27.9],[128.95,27.91],[128.99,27.81],[129.02,27.77],[129.0,27.72]],[[129.32,28.1],[129.33,28.08],[129.23,28.1],[129.19,28.19],[129.26,28.18],[129.28,28.14],[129.32,28.1]],[[129.45,28.21],[129.37,28.13],[129.27,28.2],[129.16,28.25],[129.22,28.26],[129.25,28.28],[129.25,28.31],[129.32,28.36],[129.46,28.4],[129.51,28.4],[129.56,28.43],[129.58,28.46],[129.6,28.48],[129.69,28.52],[129.71,28.47],[129.71,28.43],[129.64,28.41],[129.57,28.36],[129.51,28.3],[129.46,28.27],[129.44,28.25],[129.45,28.21]],[[130.62,30.26],[130.51,30.24],[130.45,30.26],[130.39,30.39],[130.5,30.47],[130.64,30.39],[130.67,30.37],[130.62,30.26]],[[130.96,30.4],[130.87,30.39],[130.87,30.44],[130.94,30.58],[130.95,30.67],[131.01,30.79],[131.04,30.82],[131.06,30.83],[131.08,30.79],[131.06,30.64],[130.99,30.53],[130.96,30.4]],[[129.72,31.66],[129.69,31.64],[129.71,31.72],[129.79,31.79],[129.79,31.74],[129.72,31.66]],[[130.38,32.42],[130.29,32.42],[130.26,32.43],[130.24,32.46],[130.37,32.53],[130.46,32.52],[130.42,32.46],[130.38,32.42]],[[130.08,32.23],[130.0,32.19],[129.99,32.23],[129.96,32.24],[130.02,32.29],[130.02,32.31],[129.98,32.35],[130.02,32.47],[130.01,32.52],[130.17,32.54],[130.2,32.49],[130.2,32.34],[130.08,32.23]],[[128.67,32.78],[128.7,32.76],[128.76,32.77],[128.81,32.78],[128.84,32.76],[128.88,32.69],[128.89,32.65],[128.82,32.65],[128.79,32.64],[128.75,32.59],[128.69,32.6],[128.66,32.63],[128.65,32.66],[128.67,32.78]],[[139.84,33.06],[139.82,33.05],[139.78,33.08],[139.77,33.11],[139.78,33.13],[139.81,33.13],[139.87,33.09],[139.84,33.06]],[[129.08,32.84],[129.05,32.83],[129.02,32.92],[129.0,32.95],[129.03,32.97],[129.11,33.13],[129.12,33.07],[129.15,33.0],[129.18,32.99],[129.15,32.95],[129.11,32.93],[129.08,32.84]],[[129.49,33.22],[129.42,33.18],[129.37,33.18],[129.42,33.23],[129.42,33.26],[129.46,33.33],[129.54,33.36],[129.57,33.36],[129.51,33.28],[129.49,33.22]],[[129.8,33.75],[129.73,33.71],[129.67,33.74],[129.7,33.83],[129.72,33.86],[129.78,33.83],[129.8,33.75]],[[131.17,33.6],[131.31,33.57],[131.37,33.57],[131.42,33.58],[131.5,33.62],[131.58,33.65],[131.64,33.64],[131.7,33.6],[131.72,33.55],[131.71,33.5],[131.62,33.39],[131.54,33.27],[131.72,33.25],[131.9,33.25],[131.85,33.18],[131.85,33.12],[131.9,33.09],[131.95,33.05],[131.94,33.01],[131.91,32.97],[132.01,32.92],[132.0,32.88],[131.98,32.84],[131.73,32.59],[131.66,32.47],[131.61,32.33],[131.56,32.22],[131.53,32.12],[131.51,32.0],[131.46,31.88],[131.48,31.78],[131.46,31.67],[131.34,31.4],[131.25,31.41],[131.14,31.44],[131.07,31.44],[131.04,31.38],[131.1,31.26],[130.9,31.11],[130.69,31.02],[130.68,31.06],[130.7,31.09],[130.74,31.12],[130.76,31.16],[130.79,31.27],[130.77,31.38],[130.71,31.53],[130.7,31.58],[130.75,31.6],[130.78,31.6],[130.8,31.62],[130.8,31.67],[130.78,31.71],[130.71,31.72],[130.66,31.72],[130.61,31.67],[130.56,31.56],[130.53,31.46],[130.54,31.4],[130.57,31.35],[130.64,31.27],[130.62,31.22],[130.59,31.18],[130.31,31.27],[130.25,31.27],[130.2,31.29],[130.15,31.41],[130.26,31.44],[130.29,31.45],[130.31,31.49],[130.32,31.6],[130.27,31.7],[130.22,31.73],[130.19,31.77],[130.21,31.85],[130.2,31.95],[130.19,32.09],[130.21,32.12],[130.32,32.14],[130.39,32.22],[130.46,32.3],[130.56,32.46],[130.64,32.62],[130.56,32.63],[130.5,32.66],[130.57,32.73],[130.55,32.83],[130.44,32.95],[130.38,33.09],[130.29,33.15],[130.24,33.18],[130.18,33.14],[130.13,33.1],[130.17,33.01],[130.17,32.93],[130.18,32.85],[130.22,32.85],[130.28,32.87],[130.33,32.85],[130.35,32.81],[130.36,32.76],[130.34,32.7],[130.3,32.67],[130.25,32.68],[130.19,32.71],[130.15,32.75],[130.05,32.77],[129.95,32.72],[129.85,32.62],[129.77,32.57],[129.81,32.65],[129.83,32.73],[129.79,32.78],[129.69,32.88],[129.67,32.93],[129.66,32.99],[129.68,33.06],[129.78,32.99],[129.83,32.89],[129.9,32.85],[129.99,32.85],[129.92,32.99],[129.9,33.02],[129.8,33.08],[129.67,33.19],[129.58,33.24],[129.61,33.34],[129.66,33.36],[129.7,33.36],[129.84,33.32],[129.86,33.38],[129.84,33.4],[129.83,33.44],[129.92,33.48],[130.07,33.52],[130.1,33.54],[130.13,33.58],[130.17,33.6],[130.28,33.6],[130.37,33.63],[130.44,33.73],[130.46,33.79],[130.48,33.83],[130.67,33.92],[130.72,33.93],[130.84,33.92],[130.95,33.87],[131.01,33.78],[131.06,33.67],[131.17,33.6]],[[132.27,33.95],[132.31,33.91],[132.43,33.92],[132.44,33.91],[132.41,33.88],[132.36,33.85],[132.27,33.87],[132.21,33.87],[132.2,33.93],[132.21,33.95],[132.27,33.95]],[[132.58,34.12],[132.55,34.08],[132.46,34.09],[132.5,34.12],[132.52,34.16],[132.54,34.17],[132.56,34.13],[132.58,34.12]],[[129.28,34.12],[129.21,34.08],[129.19,34.15],[129.21,34.32],[129.34,34.28],[129.34,34.23],[129.28,34.12]],[[134.36,34.26],[134.5,34.21],[134.64,34.23],[134.64,34.04],[134.66,33.98],[134.7,33.93],[134.67,33.85],[134.74,33.82],[134.55,33.73],[134.38,33.61],[134.31,33.53],[134.24,33.44],[134.21,33.35],[134.18,33.25],[134.12,33.29],[133.96,33.45],[133.85,33.49],[133.69,33.52],[133.63,33.51],[133.29,33.36],[133.24,33.25],[133.15,33.08],[133.1,33.03],[133.05,33.01],[133.02,32.98],[132.98,32.84],[132.87,32.75],[132.8,32.75],[132.69,32.78],[132.64,32.76],[132.71,32.9],[132.6,32.92],[132.5,32.92],[132.49,33.01],[132.43,33.06],[132.48,33.13],[132.48,33.18],[132.51,33.21],[132.52,33.26],[132.51,33.29],[132.45,33.3],[132.41,33.33],[132.41,33.43],[132.37,33.43],[132.28,33.42],[132.09,33.34],[132.03,33.34],[132.11,33.39],[132.29,33.47],[132.37,33.51],[132.54,33.63],[132.64,33.69],[132.7,33.79],[132.72,33.85],[132.75,33.91],[132.78,33.99],[132.84,34.02],[132.94,34.1],[132.99,34.09],[133.05,34.0],[133.13,33.93],[133.19,33.93],[133.3,33.97],[133.35,33.98],[133.47,33.97],[133.58,34.02],[133.63,34.07],[133.64,34.13],[133.6,34.24],[133.66,34.23],[133.71,34.24],[133.83,34.31],[133.95,34.35],[134.08,34.36],[134.22,34.32],[134.36,34.26]],[[134.35,34.48],[134.33,34.46],[134.32,34.47],[134.25,34.42],[134.24,34.47],[134.19,34.5],[134.18,34.52],[134.33,34.53],[134.37,34.52],[134.35,34.48]],[[134.93,34.29],[134.82,34.2],[134.73,34.21],[134.68,34.25],[134.67,34.29],[134.76,34.37],[134.83,34.47],[134.9,34.52],[134.96,34.54],[135.0,34.54],[134.91,34.4],[134.93,34.29]],[[129.39,34.35],[129.37,34.31],[129.3,34.34],[129.27,34.37],[129.33,34.52],[129.32,34.58],[129.33,34.61],[129.45,34.69],[129.47,34.67],[129.48,34.65],[129.47,34.62],[129.48,34.54],[129.38,34.42],[129.39,34.35]],[[139.46,34.73],[139.45,34.68],[139.39,34.69],[139.37,34.72],[139.37,34.78],[139.43,34.78],[139.46,34.73]],[[133.37,36.2],[133.32,36.17],[133.24,36.18],[133.19,36.23],[133.21,36.29],[133.3,36.34],[133.38,36.25],[133.37,36.2]],[[138.34,37.82],[138.25,37.82],[138.23,37.83],[138.28,37.85],[138.29,37.9],[138.32,37.97],[138.32,37.99],[138.25,37.99],[138.25,38.08],[138.31,38.16],[138.46,38.29],[138.5,38.32],[138.51,38.26],[138.46,38.12],[138.45,38.08],[138.58,38.07],[138.5,37.9],[138.34,37.82]],[[141.23,41.37],[141.27,41.35],[141.46,41.4],[141.42,41.25],[141.4,41.1],[141.41,40.84],[141.43,40.72],[141.46,40.61],[141.54,40.53],[141.65,40.47],[141.8,40.29],[141.88,40.07],[141.94,39.96],[141.98,39.84],[141.99,39.79],[141.99,39.74],[141.98,39.67],[141.99,39.61],[141.98,39.43],[141.91,39.22],[141.9,39.11],[141.84,39.09],[141.81,39.04],[141.78,39.02],[141.74,39.0],[141.69,39.0],[141.66,38.97],[141.64,38.92],[141.62,38.87],[141.58,38.82],[141.55,38.76],[141.52,38.63],[141.51,38.5],[141.47,38.4],[141.37,38.38],[141.25,38.38],[141.11,38.34],[141.08,38.31],[140.96,38.15],[140.93,38.05],[140.93,37.95],[140.96,37.82],[141.0,37.7],[141.04,37.47],[141.0,37.11],[140.97,37.0],[140.9,36.93],[140.84,36.89],[140.79,36.85],[140.73,36.73],[140.63,36.5],[140.62,36.45],[140.62,36.39],[140.59,36.31],[140.57,36.23],[140.59,36.14],[140.62,36.06],[140.76,35.85],[140.81,35.78],[140.87,35.72],[140.64,35.66],[140.6,35.63],[140.46,35.51],[140.41,35.39],[140.42,35.27],[140.39,35.22],[140.35,35.18],[140.31,35.16],[140.16,35.1],[140.06,35.04],[139.96,34.95],[139.92,34.9],[139.84,34.91],[139.8,34.96],[139.84,35.01],[139.83,35.07],[139.85,35.23],[139.83,35.3],[139.91,35.35],[139.94,35.42],[140.03,35.49],[140.09,35.54],[140.1,35.59],[140.04,35.63],[139.99,35.67],[139.91,35.67],[139.83,35.66],[139.79,35.61],[139.77,35.55],[139.77,35.52],[139.77,35.49],[139.65,35.41],[139.67,35.32],[139.7,35.27],[139.74,35.25],[139.73,35.22],[139.68,35.15],[139.64,35.14],[139.56,35.24],[139.47,35.3],[139.36,35.3],[139.25,35.28],[139.16,35.21],[139.13,35.15],[139.12,35.1],[139.12,34.96],[139.09,34.84],[139.02,34.74],[138.98,34.7],[138.9,34.63],[138.84,34.62],[138.8,34.65],[138.76,34.7],[138.8,34.88],[138.8,34.97],[138.9,35.03],[138.82,35.1],[138.72,35.12],[138.58,35.09],[138.54,35.04],[138.51,34.99],[138.43,34.92],[138.35,34.85],[138.25,34.73],[138.19,34.6],[137.98,34.64],[137.86,34.65],[137.75,34.65],[137.54,34.66],[137.32,34.64],[137.06,34.58],[137.08,34.62],[137.29,34.7],[137.3,34.73],[137.28,34.77],[137.22,34.77],[137.1,34.76],[137.03,34.77],[137.01,34.81],[136.96,34.83],[136.93,34.82],[136.94,34.72],[136.91,34.71],[136.87,34.73],[136.88,34.81],[136.86,34.91],[136.85,34.98],[136.9,35.04],[136.85,35.06],[136.8,35.05],[136.74,35.02],[136.69,34.98],[136.58,34.79],[136.53,34.68],[136.62,34.59],[136.84,34.46],[136.88,34.43],[136.88,34.38],[136.85,34.32],[136.79,34.3],[136.54,34.26],[136.33,34.18],[136.27,34.09],[136.07,33.78],[135.92,33.56],[135.7,33.49],[135.45,33.55],[135.39,33.63],[135.35,33.72],[135.26,33.81],[135.18,33.9],[135.13,34.01],[135.14,34.18],[135.1,34.29],[135.13,34.32],[135.27,34.38],[135.31,34.42],[135.38,34.5],[135.41,34.55],[135.42,34.62],[135.36,34.65],[135.2,34.65],[135.04,34.63],[134.93,34.66],[134.78,34.75],[134.74,34.77],[134.58,34.77],[134.47,34.75],[134.36,34.72],[134.25,34.71],[134.21,34.7],[134.07,34.59],[133.97,34.53],[133.88,34.49],[133.68,34.49],[133.58,34.46],[133.47,34.43],[133.45,34.43],[133.34,34.39],[133.21,34.34],[133.14,34.3],[133.02,34.33],[132.77,34.26],[132.66,34.25],[132.53,34.29],[132.42,34.35],[132.31,34.32],[132.24,34.23],[132.2,34.03],[132.16,33.94],[132.15,33.84],[132.09,33.86],[131.76,34.05],[131.74,34.05],[131.48,34.02],[131.41,34.0],[131.32,33.97],[131.23,33.95],[131.15,33.98],[131.07,34.02],[131.0,34.01],[130.92,33.98],[130.89,34.26],[130.9,34.3],[130.95,34.35],[131.0,34.39],[131.13,34.41],[131.26,34.39],[131.35,34.41],[131.43,34.47],[131.52,34.55],[131.61,34.62],[131.73,34.67],[131.86,34.73],[131.96,34.81],[132.06,34.9],[132.16,34.97],[132.26,35.02],[132.41,35.16],[132.62,35.31],[132.7,35.42],[132.75,35.45],[132.92,35.51],[133.16,35.56],[133.27,35.56],[133.38,35.46],[133.44,35.47],[133.49,35.5],[133.62,35.51],[133.74,35.5],[133.86,35.49],[133.98,35.51],[134.21,35.54],[134.34,35.58],[134.46,35.63],[134.88,35.66],[135.17,35.75],[135.22,35.74],[135.27,35.72],[135.27,35.66],[135.23,35.59],[135.27,35.55],[135.33,35.53],[135.6,35.52],[135.68,35.5],[135.8,35.55],[135.9,35.61],[136.02,35.68],[136.1,35.77],[136.02,35.87],[136.01,35.99],[136.07,36.12],[136.16,36.22],[136.26,36.29],[136.36,36.36],[136.56,36.57],[136.7,36.74],[136.75,36.95],[136.72,37.2],[136.84,37.38],[136.96,37.41],[137.2,37.5],[137.32,37.52],[137.34,37.49],[137.34,37.44],[137.15,37.28],[137.05,37.22],[136.98,37.2],[136.92,37.17],[136.9,37.12],[136.99,37.03],[137.02,36.96],[137.01,36.9],[137.02,36.84],[137.12,36.77],[137.25,36.75],[137.3,36.75],[137.34,36.77],[137.48,36.92],[137.51,36.95],[137.91,37.06],[138.11,37.15],[138.22,37.17],[138.32,37.22],[138.55,37.39],[138.63,37.47],[138.71,37.56],[138.77,37.66],[138.82,37.77],[138.89,37.84],[139.25,38.01],[139.36,38.1],[139.4,38.14],[139.45,38.27],[139.48,38.4],[139.52,38.5],[139.58,38.6],[139.66,38.7],[139.75,38.79],[139.8,38.88],[139.88,39.1],[139.91,39.23],[139.94,39.27],[139.98,39.31],[140.01,39.36],[140.04,39.41],[140.05,39.46],[140.06,39.62],[140.05,39.75],[139.99,39.86],[139.95,39.89],[139.89,39.89],[139.81,39.88],[139.74,39.92],[139.76,39.96],[139.83,39.97],[139.87,39.99],[139.91,40.02],[139.97,40.14],[140.01,40.26],[140.01,40.31],[139.96,40.41],[139.92,40.53],[139.92,40.6],[139.97,40.67],[140.03,40.73],[140.09,40.75],[140.15,40.75],[140.2,40.77],[140.25,40.81],[140.28,40.85],[140.33,40.95],[140.34,41.01],[140.32,41.16],[140.34,41.2],[140.39,41.23],[140.44,41.21],[140.5,41.21],[140.56,41.21],[140.63,41.2],[140.64,41.16],[140.68,40.89],[140.7,40.86],[140.75,40.83],[140.8,40.83],[140.85,40.88],[140.88,40.93],[140.94,40.94],[141.12,40.88],[141.18,40.92],[141.23,40.99],[141.26,41.1],[141.24,41.21],[141.2,41.24],[141.16,41.24],[141.12,41.21],[141.07,41.19],[140.8,41.14],[140.8,41.25],[140.86,41.43],[140.89,41.48],[140.94,41.51],[141.05,41.48],[141.11,41.46],[141.23,41.37]],[[139.48,42.08],[139.46,42.08],[139.43,42.08],[139.41,42.16],[139.43,42.2],[139.5,42.23],[139.56,42.24],[139.51,42.1],[139.48,42.08]],[[141.3,45.12],[141.23,45.11],[141.15,45.15],[141.14,45.21],[141.19,45.25],[141.25,45.23],[141.31,45.18],[141.33,45.15],[141.3,45.12]],[[141.07,45.33],[141.03,45.27],[140.98,45.36],[140.97,45.47],[141.0,45.46],[141.06,45.45],[141.07,45.4],[141.07,45.33]],[[143.82,44.12],[143.95,44.11],[144.01,44.12],[144.1,44.1],[144.48,43.95],[144.6,43.93],[144.72,43.93],[144.8,43.94],[144.87,43.98],[145.1,44.17],[145.34,44.33],[145.37,44.33],[145.37,44.28],[145.35,44.23],[145.25,44.08],[145.13,43.87],[145.1,43.76],[145.14,43.66],[145.21,43.58],[145.27,43.46],[145.34,43.3],[145.44,43.28],[145.49,43.28],[145.58,43.33],[145.67,43.39],[145.75,43.4],[145.83,43.39],[145.73,43.34],[145.62,43.29],[145.54,43.19],[145.51,43.17],[145.4,43.18],[145.35,43.18],[145.23,43.14],[145.13,43.09],[145.03,43.03],[144.92,43.0],[144.81,42.99],[144.63,42.95],[144.52,42.94],[144.3,42.98],[144.2,42.97],[143.97,42.88],[143.76,42.75],[143.58,42.6],[143.43,42.42],[143.37,42.33],[143.33,42.22],[143.33,42.15],[143.31,42.08],[143.28,42.04],[143.24,42.0],[143.11,42.02],[142.91,42.12],[142.51,42.26],[142.09,42.47],[141.85,42.58],[141.41,42.55],[140.99,42.34],[140.95,42.36],[140.79,42.5],[140.71,42.56],[140.62,42.57],[140.55,42.57],[140.48,42.56],[140.39,42.49],[140.35,42.44],[140.32,42.38],[140.32,42.33],[140.33,42.29],[140.42,42.2],[140.53,42.13],[140.58,42.12],[140.68,42.12],[140.73,42.12],[140.91,41.98],[141.11,41.85],[141.15,41.81],[141.08,41.76],[141.0,41.74],[140.91,41.74],[140.82,41.76],[140.66,41.82],[140.59,41.77],[140.49,41.67],[140.43,41.57],[140.38,41.52],[140.27,41.46],[140.15,41.42],[140.09,41.43],[140.04,41.47],[140.01,41.52],[140.0,41.58],[140.02,41.7],[140.08,41.8],[140.11,41.91],[140.06,42.07],[140.02,42.1],[139.9,42.19],[139.84,42.28],[139.82,42.39],[139.83,42.45],[139.86,42.58],[139.89,42.65],[139.95,42.67],[140.02,42.68],[140.11,42.73],[140.22,42.8],[140.33,42.87],[140.43,42.95],[140.49,43.05],[140.4,43.17],[140.38,43.24],[140.39,43.3],[140.49,43.34],[140.58,43.31],[140.78,43.21],[140.82,43.21],[140.95,43.2],[141.14,43.18],[141.25,43.19],[141.3,43.2],[141.37,43.28],[141.41,43.38],[141.4,43.51],[141.4,43.64],[141.45,43.75],[141.6,43.92],[141.64,44.02],[141.66,44.26],[141.72,44.37],[141.76,44.48],[141.78,44.72],[141.72,44.94],[141.66,45.05],[141.58,45.16],[141.59,45.26],[141.65,45.35],[141.65,45.38],[141.67,45.4],[141.78,45.42],[141.83,45.44],[141.88,45.48],[141.94,45.51],[141.98,45.48],[142.02,45.44],[142.17,45.33],[142.42,45.12],[142.7,44.82],[142.88,44.67],[143.08,44.53],[143.29,44.4],[143.51,44.28],[143.65,44.22],[143.76,44.13],[143.82,44.12]]]},{"n":"Siachen Glacier","r":[[[76.77,35.66],[76.88,35.61],[77.09,35.55],[77.29,35.51],[77.45,35.48],[77.52,35.47],[77.57,35.47],[77.72,35.48],[77.8,35.5],[77.7,35.44],[77.57,35.38],[77.42,35.3],[77.29,35.24],[77.17,35.17],[77.05,35.11],[77.0,35.2],[76.98,35.25],[76.93,35.35],[76.88,35.44],[76.81,35.57],[76.77,35.66]]]},{"n":"Kazakhstan","r":[[[87.32,49.09],[87.23,49.11],[87.05,49.11],[86.94,49.1],[86.89,49.09],[86.81,49.05],[86.75,49.01],[86.73,48.94],[86.76,48.86],[86.72,48.7],[86.66,48.64],[86.55,48.53],[86.48,48.51],[86.37,48.49],[86.27,48.45],[86.06,48.42],[85.83,48.41],[85.75,48.39],[85.69,48.31],[85.65,48.25],[85.63,48.2],[85.56,48.05],[85.53,47.92],[85.56,47.75],[85.59,47.56],[85.59,47.49],[85.64,47.4],[85.67,47.34],[85.66,47.25],[85.58,47.19],[85.53,47.1],[85.48,47.06],[85.36,47.05],[85.23,47.04],[85.11,46.96],[85.01,46.91],[84.86,46.84],[84.79,46.83],[84.75,46.86],[84.72,46.94],[84.67,46.97],[84.59,46.97],[84.53,46.98],[84.34,47.0],[84.22,46.99],[84.12,46.98],[84.02,46.97],[83.83,47.0],[83.71,47.02],[83.63,47.04],[83.44,47.11],[83.19,47.19],[83.09,47.21],[83.03,47.19],[83.02,47.14],[83.0,47.03],[82.97,46.97],[82.8,46.62],[82.69,46.39],[82.56,46.16],[82.51,46.01],[82.43,45.81],[82.35,45.67],[82.32,45.59],[82.31,45.56],[82.33,45.52],[82.45,45.47],[82.58,45.44],[82.61,45.42],[82.63,45.37],[82.62,45.29],[82.6,45.22],[82.56,45.16],[82.52,45.13],[82.48,45.12],[82.4,45.16],[82.32,45.21],[82.27,45.22],[82.12,45.19],[81.99,45.16],[81.94,45.16],[81.87,45.18],[81.79,45.23],[81.76,45.31],[81.69,45.35],[81.6,45.31],[81.33,45.25],[81.04,45.17],[80.85,45.13],[80.78,45.14],[80.63,45.13],[80.51,45.1],[80.41,45.08],[80.23,45.03],[80.06,45.01],[79.95,44.94],[79.87,44.88],[79.88,44.86],[79.93,44.83],[80.0,44.8],[80.13,44.8],[80.26,44.81],[80.36,44.77],[80.46,44.75],[80.48,44.71],[80.46,44.68],[80.4,44.68],[80.38,44.66],[80.39,44.63],[80.36,44.55],[80.34,44.44],[80.35,44.33],[80.37,44.22],[80.36,44.17],[80.36,44.1],[80.4,44.05],[80.43,43.95],[80.5,43.89],[80.59,43.69],[80.65,43.56],[80.7,43.43],[80.67,43.35],[80.67,43.31],[80.73,43.27],[80.76,43.2],[80.79,43.16],[80.78,43.12],[80.75,43.1],[80.62,43.13],[80.51,43.09],[80.39,43.04],[80.37,43.02],[80.37,43.0],[80.38,42.97],[80.45,42.94],[80.54,42.91],[80.54,42.87],[80.42,42.86],[80.25,42.8],[80.2,42.73],[80.17,42.67],[80.16,42.63],[80.18,42.52],[80.21,42.4],[80.26,42.27],[80.26,42.24],[80.23,42.21],[80.21,42.19],[80.07,42.3],[79.92,42.41],[79.8,42.44],[79.6,42.46],[79.49,42.46],[79.43,42.48],[79.37,42.55],[79.3,42.6],[79.2,42.67],[79.16,42.76],[79.13,42.78],[79.06,42.76],[78.95,42.77],[78.89,42.77],[78.79,42.79],[78.64,42.83],[78.52,42.86],[78.38,42.87],[78.29,42.86],[78.02,42.86],[77.8,42.9],[77.62,42.9],[77.51,42.9],[77.46,42.9],[77.37,42.9],[77.24,42.91],[77.06,42.97],[76.99,42.97],[76.94,42.97],[76.65,42.93],[76.51,42.92],[76.22,42.92],[75.93,42.93],[75.84,42.94],[75.79,42.93],[75.68,42.83],[75.64,42.81],[75.37,42.84],[75.05,42.9],[74.82,42.98],[74.62,43.06],[74.36,43.18],[74.21,43.24],[74.19,43.21],[74.15,43.19],[74.09,43.19],[73.95,43.2],[73.89,43.13],[73.72,43.09],[73.61,43.05],[73.56,43.0],[73.45,42.7],[73.42,42.59],[73.49,42.41],[73.41,42.42],[73.32,42.47],[73.28,42.5],[73.19,42.53],[72.86,42.56],[72.79,42.6],[72.75,42.64],[72.67,42.66],[72.54,42.68],[72.28,42.76],[72.16,42.76],[71.82,42.82],[71.76,42.82],[71.73,42.82],[71.6,42.78],[71.51,42.77],[71.42,42.78],[71.26,42.73],[71.17,42.67],[71.09,42.59],[71.02,42.54],[71.0,42.46],[70.95,42.42],[70.89,42.34],[70.89,42.29],[70.95,42.25],[70.86,42.21],[70.76,42.19],[70.72,42.17],[70.66,42.11],[70.61,42.05],[70.58,42.04],[70.54,42.04],[70.49,42.08],[70.42,42.08],[70.33,42.03],[70.23,41.95],[70.1,41.82],[69.96,41.75],[69.79,41.7],[69.66,41.67],[69.57,41.63],[69.4,41.54],[69.37,41.49],[69.25,41.46],[69.15,41.43],[69.06,41.37],[69.04,41.26],[68.99,41.21],[68.85,41.12],[68.74,41.04],[68.66,40.96],[68.58,40.88],[68.56,40.83],[68.56,40.77],[68.59,40.71],[68.6,40.66],[68.57,40.62],[68.5,40.61],[68.42,40.62],[68.29,40.66],[68.16,40.72],[68.11,40.75],[68.05,40.81],[68.06,40.86],[68.09,40.96],[68.11,41.03],[68.06,41.06],[68.02,41.1],[67.99,41.13],[67.94,41.2],[67.87,41.18],[67.81,41.16],[67.74,41.19],[67.53,41.18],[67.37,41.17],[67.22,41.16],[67.04,41.15],[66.81,41.14],[66.75,41.16],[66.71,41.18],[66.67,41.27],[66.65,41.35],[66.6,41.49],[66.57,41.61],[66.54,41.74],[66.52,41.89],[66.5,41.99],[66.33,42.0],[66.19,42.0],[66.01,42.0],[66.01,42.09],[66.01,42.19],[66.02,42.31],[66.05,42.47],[66.06,42.61],[66.08,42.77],[66.09,42.87],[66.1,42.99],[66.01,42.95],[65.9,42.91],[65.8,42.88],[65.74,42.97],[65.67,43.06],[65.57,43.21],[65.5,43.31],[65.37,43.37],[65.27,43.42],[65.17,43.49],[65.08,43.57],[65.0,43.65],[64.91,43.71],[64.81,43.69],[64.71,43.65],[64.6,43.61],[64.5,43.57],[64.44,43.55],[64.32,43.56],[64.21,43.57],[64.01,43.58],[63.85,43.59],[63.68,43.6],[63.44,43.61],[63.21,43.63],[63.05,43.61],[62.85,43.58],[62.63,43.56],[62.46,43.54],[62.24,43.51],[62.07,43.49],[61.99,43.49],[61.89,43.58],[61.72,43.71],[61.62,43.8],[61.53,43.88],[61.39,43.99],[61.27,44.08],[61.16,44.17],[61.1,44.25],[61.07,44.35],[61.01,44.39],[60.88,44.46],[60.74,44.52],[60.6,44.59],[60.46,44.65],[60.33,44.72],[60.19,44.78],[60.05,44.85],[59.91,44.92],[59.77,44.98],[59.64,45.05],[59.5,45.11],[59.36,45.18],[59.22,45.24],[59.08,45.31],[58.95,45.38],[58.81,45.44],[58.67,45.51],[58.56,45.56],[58.45,45.54],[58.29,45.51],[58.13,45.47],[57.96,45.44],[57.67,45.38],[57.48,45.34],[57.33,45.3],[57.17,45.27],[56.97,45.22],[56.79,45.18],[56.59,45.13],[56.41,45.09],[56.26,45.06],[56.1,45.02],[55.98,44.99],[55.98,44.77],[55.98,44.54],[55.98,44.31],[55.98,44.08],[55.98,43.85],[55.98,43.62],[55.98,43.39],[55.98,43.16],[55.98,42.93],[55.98,42.7],[55.98,42.47],[55.98,42.24],[55.98,42.01],[55.98,41.78],[55.98,41.55],[55.98,41.32],[55.93,41.32],[55.84,41.31],[55.68,41.28],[55.55,41.26],[55.49,41.27],[55.43,41.3],[55.39,41.35],[55.32,41.41],[55.25,41.46],[55.16,41.56],[55.1,41.64],[54.95,41.81],[54.93,41.86],[54.9,41.92],[54.85,41.97],[54.68,42.08],[54.47,42.18],[54.27,42.28],[54.21,42.3],[54.12,42.34],[54.01,42.34],[53.93,42.33],[53.69,42.3],[53.5,42.26],[53.25,42.21],[53.06,42.15],[53.01,42.13],[52.87,42.06],[52.7,41.94],[52.49,41.78],[52.47,41.89],[52.46,42.05],[52.46,42.1],[52.52,42.24],[52.57,42.33],[52.62,42.43],[52.64,42.56],[52.6,42.76],[52.55,42.81],[52.49,42.82],[52.43,42.82],[52.32,42.82],[52.27,42.8],[52.18,42.87],[52.08,42.88],[52.02,42.86],[51.96,42.85],[51.9,42.87],[51.84,42.91],[51.81,42.95],[51.79,43.0],[51.7,43.1],[51.62,43.16],[51.51,43.17],[51.35,43.17],[51.3,43.17],[51.29,43.23],[51.31,43.36],[51.31,43.42],[51.3,43.48],[51.27,43.53],[51.24,43.58],[51.14,43.65],[51.06,43.75],[50.94,43.96],[50.83,44.19],[50.78,44.23],[50.68,44.27],[50.47,44.29],[50.33,44.33],[50.28,44.36],[50.25,44.41],[50.25,44.46],[50.26,44.53],[50.3,44.58],[50.41,44.62],[50.65,44.63],[50.86,44.63],[51.05,44.53],[51.11,44.51],[51.18,44.5],[51.31,44.53],[51.38,44.54],[51.54,44.53],[51.49,44.58],[51.43,44.6],[51.37,44.6],[51.31,44.62],[51.22,44.71],[51.06,44.81],[51.02,44.85],[51.01,44.92],[51.04,44.98],[51.15,45.04],[51.25,45.12],[51.29,45.23],[51.33,45.28],[51.42,45.36],[51.54,45.34],[51.73,45.4],[52.05,45.39],[52.43,45.4],[52.53,45.4],[52.77,45.34],[52.91,45.32],[53.08,45.31],[53.2,45.33],[53.09,45.41],[52.84,45.5],[52.77,45.57],[52.89,45.78],[53.04,45.97],[53.14,46.19],[53.11,46.41],[53.06,46.48],[53.08,46.55],[53.13,46.61],[53.17,46.67],[53.14,46.74],[53.07,46.86],[53.03,46.89],[52.92,46.95],[52.68,46.96],[52.48,46.99],[52.42,46.96],[52.38,46.92],[52.34,46.89],[52.19,46.84],[52.14,46.83],[52.09,46.84],[52.01,46.9],[51.95,46.89],[51.74,46.93],[51.65,47.02],[51.62,47.03],[51.29,47.1],[51.18,47.11],[50.92,47.04],[50.73,46.95],[50.68,46.94],[50.58,46.88],[50.53,46.87],[50.47,46.88],[50.42,46.88],[50.31,46.79],[50.1,46.7],[50.0,46.63],[49.89,46.6],[49.76,46.57],[49.63,46.57],[49.58,46.55],[49.44,46.54],[49.35,46.52],[49.34,46.49],[49.36,46.41],[49.29,46.44],[49.21,46.39],[49.23,46.34],[49.18,46.35],[48.96,46.44],[48.77,46.51],[48.61,46.57],[48.59,46.58],[48.54,46.61],[48.51,46.65],[48.5,46.7],[48.52,46.73],[48.56,46.76],[48.61,46.77],[48.65,46.76],[48.69,46.74],[48.78,46.71],[48.88,46.71],[48.95,46.73],[48.96,46.77],[48.83,46.95],[48.71,47.1],[48.6,47.26],[48.55,47.32],[48.41,47.46],[48.28,47.59],[48.17,47.71],[48.11,47.75],[47.93,47.76],[47.6,47.79],[47.48,47.8],[47.39,47.77],[47.29,47.74],[47.2,47.79],[47.13,47.88],[47.09,47.95],[47.11,48.02],[47.12,48.13],[47.06,48.23],[47.0,48.28],[46.85,48.32],[46.66,48.41],[46.61,48.57],[46.7,48.81],[46.85,48.97],[46.96,49.04],[47.01,49.1],[47.03,49.15],[47.02,49.2],[46.95,49.25],[46.85,49.3],[46.8,49.37],[46.82,49.5],[46.89,49.7],[46.99,49.85],[47.13,49.94],[47.25,50.0],[47.3,50.06],[47.3,50.14],[47.29,50.22],[47.33,50.27],[47.38,50.32],[47.43,50.36],[47.5,50.4],[47.6,50.41],[47.71,50.38],[47.85,50.28],[48.06,50.09],[48.18,49.97],[48.22,49.93],[48.33,49.86],[48.43,49.83],[48.6,49.87],[48.76,49.93],[48.81,49.96],[48.84,50.01],[48.82,50.1],[48.78,50.16],[48.75,50.23],[48.7,50.35],[48.67,50.55],[48.63,50.61],[48.66,50.62],[48.73,50.61],[48.81,50.6],[48.91,50.64],[49.06,50.73],[49.32,50.85],[49.38,50.93],[49.42,51.03],[49.5,51.08],[49.67,51.1],[49.82,51.13],[49.93,51.2],[50.1,51.25],[50.25,51.29],[50.31,51.32],[50.35,51.37],[50.52,51.51],[50.64,51.59],[50.76,51.68],[50.79,51.73],[50.88,51.72],[51.02,51.68],[51.16,51.65],[51.27,51.59],[51.29,51.54],[51.3,51.5],[51.34,51.48],[51.4,51.47],[51.47,51.48],[51.61,51.48],[51.78,51.55],[52.01,51.67],[52.22,51.71],[52.33,51.68],[52.42,51.59],[52.5,51.51],[52.57,51.48],[52.62,51.48],[52.64,51.48],[52.73,51.5],[52.74,51.5],[52.82,51.49],[52.9,51.47],[53.04,51.46],[53.23,51.48],[53.25,51.49],[53.34,51.48],[53.45,51.44],[53.53,51.4],[53.69,51.25],[53.78,51.21],[53.96,51.16],[54.04,51.12],[54.14,51.04],[54.19,51.0],[54.3,50.91],[54.42,50.78],[54.44,50.67],[54.47,50.58],[54.52,50.54],[54.56,50.54],[54.6,50.55],[54.64,50.59],[54.65,50.66],[54.64,50.78],[54.61,50.88],[54.57,50.91],[54.55,50.95],[54.57,50.99],[54.64,51.01],[54.73,51.0],[54.87,50.94],[55.01,50.87],[55.2,50.74],[55.36,50.67],[55.54,50.6],[55.69,50.58],[55.8,50.6],[55.93,50.65],[56.05,50.71],[56.1,50.78],[56.14,50.84],[56.33,50.94],[56.49,51.02],[56.57,51.0],[56.62,50.98],[56.79,51.03],[56.85,51.05],[57.01,51.07],[57.18,51.04],[57.31,50.95],[57.44,50.89],[57.56,50.9],[57.65,50.93],[57.72,50.98],[57.76,51.05],[57.83,51.09],[57.84,51.09],[58.05,51.07],[58.17,51.07],[58.19,51.08],[58.36,51.06],[58.55,50.97],[58.66,50.87],[58.81,50.74],[58.88,50.69],[58.98,50.68],[59.06,50.67],[59.17,50.65],[59.45,50.62],[59.5,50.6],[59.52,50.58],[59.5,50.51],[59.52,50.49],[59.75,50.54],[59.81,50.58],[59.89,50.69],[59.96,50.8],[60.01,50.84],[60.06,50.85],[60.11,50.83],[60.19,50.77],[60.29,50.7],[60.42,50.68],[60.51,50.67],[60.64,50.66],[60.94,50.7],[61.23,50.77],[61.39,50.86],[61.47,50.99],[61.51,51.14],[61.59,51.23],[61.55,51.32],[61.41,51.41],[61.36,51.44],[61.01,51.49],[60.99,51.53],[60.97,51.54],[60.63,51.62],[60.46,51.65],[60.42,51.7],[60.39,51.77],[60.28,51.83],[60.07,51.89],[60.03,51.93],[60.07,51.98],[60.23,52.02],[60.43,52.13],[60.5,52.15],[60.67,52.15],[60.83,52.23],[60.94,52.28],[60.99,52.34],[60.98,52.39],[60.82,52.57],[60.77,52.68],[60.8,52.74],[60.89,52.82],[60.94,52.86],[61.01,52.93],[61.05,52.97],[61.21,52.99],[61.4,53.0],[61.53,52.98],[61.72,52.97],[61.89,52.96],[61.97,52.94],[62.04,52.97],[62.08,53.01],[62.08,53.06],[62.01,53.11],[61.77,53.17],[61.66,53.23],[61.58,53.22],[61.44,53.24],[61.31,53.28],[61.2,53.29],[61.16,53.34],[61.19,53.41],[61.23,53.45],[61.31,53.47],[61.4,53.46],[61.5,53.48],[61.53,53.5],[61.53,53.52],[61.52,53.55],[61.47,53.58],[61.41,53.59],[61.34,53.57],[61.25,53.55],[61.1,53.58],[60.98,53.62],[60.99,53.66],[61.07,53.71],[61.11,53.75],[61.11,53.81],[61.11,53.88],[61.14,53.96],[61.23,54.02],[61.33,54.05],[61.6,53.99],[61.93,53.95],[61.99,53.95],[62.0,53.98],[62.04,54.0],[62.5,54.01],[62.59,54.04],[62.63,54.07],[63.07,54.11],[63.13,54.14],[63.19,54.17],[63.29,54.17],[63.41,54.18],[63.58,54.22],[63.7,54.24],[63.72,54.25],[63.85,54.24],[64.0,54.27],[64.04,54.28],[64.06,54.3],[64.2,54.35],[64.46,54.38],[64.53,54.36],[64.65,54.35],[64.81,54.37],[64.93,54.4],[65.0,54.37],[65.09,54.34],[65.16,54.36],[65.19,54.44],[65.24,54.52],[65.32,54.55],[65.38,54.56],[65.43,54.59],[65.48,54.62],[65.71,54.62],[65.91,54.69],[65.95,54.66],[66.22,54.67],[66.56,54.72],[66.75,54.74],[67.1,54.79],[67.26,54.83],[67.48,54.85],[67.69,54.87],[67.83,54.94],[67.94,54.95],[68.07,54.96],[68.16,54.98],[68.21,55.0],[68.24,55.05],[68.23,55.12],[68.21,55.16],[68.3,55.19],[68.44,55.19],[68.52,55.2],[68.71,55.31],[68.84,55.36],[68.98,55.39],[69.25,55.37],[69.49,55.36],[69.74,55.31],[69.87,55.25],[69.98,55.2],[70.09,55.18],[70.18,55.16],[70.29,55.18],[70.37,55.21],[70.42,55.25],[70.49,55.28],[70.74,55.31],[70.79,55.26],[70.91,55.13],[70.99,54.95],[71.13,54.72],[71.19,54.6],[71.16,54.54],[71.16,54.46],[71.15,54.36],[71.05,54.26],[71.09,54.21],[71.34,54.16],[71.68,54.18],[71.89,54.22],[72.0,54.21],[72.07,54.23],[72.11,54.31],[72.19,54.33],[72.27,54.27],[72.33,54.18],[72.39,54.12],[72.38,54.05],[72.4,53.96],[72.45,53.94],[72.53,53.98],[72.59,54.0],[72.6,54.02],[72.58,54.06],[72.56,54.09],[72.58,54.12],[72.62,54.13],[72.74,54.12],[72.91,54.11],[73.12,53.98],[73.23,53.96],[73.28,53.96],[73.38,53.96],[73.51,54.0],[73.59,54.04],[73.62,54.07],[73.67,54.06],[73.71,54.04],[73.72,54.0],[73.68,53.93],[73.55,53.87],[73.4,53.81],[73.31,53.71],[73.29,53.6],[73.33,53.54],[73.36,53.51],[73.37,53.45],[73.41,53.45],[73.47,53.47],[73.64,53.58],[73.73,53.6],[73.86,53.62],[74.07,53.61],[74.21,53.58],[74.28,53.53],[74.35,53.49],[74.4,53.5],[74.43,53.55],[74.43,53.6],[74.45,53.65],[74.68,53.75],[74.83,53.83],[74.89,53.83],[74.99,53.82],[75.05,53.83],[75.22,53.89],[75.38,53.97],[75.39,54.02],[75.4,54.07],[75.44,54.09],[75.66,54.11],[75.69,54.11],[75.88,54.17],[76.14,54.26],[76.27,54.31],[76.5,54.34],[76.54,54.35],[76.62,54.39],[76.76,54.44],[76.84,54.44],[76.79,54.32],[76.7,54.18],[76.65,54.15],[76.42,54.15],[76.42,54.11],[76.46,54.06],[76.48,54.02],[76.51,53.99],[76.58,53.94],[76.82,53.82],[77.13,53.67],[77.47,53.5],[77.7,53.38],[77.8,53.32],[77.86,53.27],[78.03,53.09],[78.2,52.93],[78.48,52.64],[78.72,52.36],[78.99,52.05],[79.15,51.87],[79.47,51.49],[79.55,51.38],[79.72,51.16],[79.86,50.96],[79.99,50.77],[80.07,50.76],[80.07,50.81],[80.09,50.84],[80.13,50.86],[80.22,50.91],[80.27,50.92],[80.35,50.92],[80.42,50.95],[80.45,51.0],[80.43,51.09],[80.42,51.14],[80.45,51.18],[80.49,51.2],[80.55,51.22],[80.61,51.22],[80.65,51.28],[80.74,51.29],[80.81,51.28],[80.88,51.28],[80.93,51.24],[80.97,51.19],[81.03,51.19],[81.13,51.19],[81.14,51.15],[81.11,51.07],[81.08,51.01],[81.07,50.97],[81.12,50.95],[81.32,50.97],[81.39,50.96],[81.41,50.91],[81.44,50.87],[81.45,50.82],[81.43,50.77],[81.47,50.74],[81.63,50.74],[81.75,50.76],[81.93,50.77],[82.1,50.71],[82.21,50.72],[82.33,50.74],[82.49,50.73],[82.61,50.77],[82.69,50.83],[82.72,50.87],[82.76,50.89],[82.92,50.89],[83.02,50.9],[83.09,50.96],[83.16,50.99],[83.27,50.99],[83.36,50.99],[83.58,50.94],[83.72,50.89],[83.86,50.82],[83.95,50.77],[84.0,50.68],[84.1,50.6],[84.18,50.52],[84.19,50.44],[84.26,50.29],[84.32,50.24],[84.4,50.24],[84.5,50.22],[84.61,50.2],[84.84,50.09],[84.92,50.09],[84.99,50.06],[85.0,50.01],[84.98,49.95],[85.0,49.89],[85.08,49.82],[85.14,49.75],[85.21,49.66],[85.23,49.62],[85.29,49.6],[85.37,49.62],[85.5,49.61],[85.88,49.56],[85.93,49.55],[85.97,49.5],[86.03,49.5],[86.09,49.51],[86.18,49.5],[86.24,49.55],[86.29,49.59],[86.42,49.64],[86.52,49.71],[86.61,49.77],[86.68,49.78],[86.73,49.75],[86.73,49.7],[86.67,49.66],[86.61,49.61],[86.63,49.56],[86.71,49.56],[86.81,49.49],[86.95,49.32],[87.0,49.29],[87.07,49.25],[87.15,49.24],[87.23,49.22],[87.3,49.15],[87.32,49.09]],[[50.18,44.85],[50.15,44.83],[50.1,44.83],[50.0,44.94],[50.02,45.04],[50.06,45.07],[50.11,45.08],[50.12,45.06],[50.05,45.01],[50.04,44.95],[50.1,44.88],[50.18,44.85]],[[50.31,44.97],[50.28,44.96],[50.26,45.02],[50.29,45.08],[50.35,45.08],[50.33,45.0],[50.31,44.97]],[[52.68,45.41],[52.66,45.4],[52.6,45.43],[52.55,45.47],[52.61,45.53],[52.66,45.52],[52.69,45.46],[52.68,45.41]]]},{"n":"Kenya","r":[[[35.27,5.49],[35.26,5.46],[35.26,5.41],[35.29,5.38],[35.33,5.36],[35.38,5.39],[35.42,5.41],[35.47,5.42],[35.75,5.34],[35.79,5.28],[35.79,5.21],[35.8,5.16],[35.78,5.11],[35.76,4.95],[35.76,4.81],[35.85,4.7],[35.92,4.62],[35.98,4.5],[36.02,4.47],[36.08,4.45],[36.27,4.44],[36.55,4.44],[36.82,4.43],[36.85,4.43],[36.91,4.41],[37.15,4.25],[37.38,4.11],[37.58,3.99],[37.76,3.86],[37.94,3.75],[38.09,3.65],[38.23,3.62],[38.45,3.6],[38.61,3.6],[38.75,3.56],[38.97,3.52],[39.13,3.5],[39.23,3.48],[39.49,3.46],[39.54,3.47],[39.66,3.58],[39.79,3.75],[39.84,3.85],[40.01,3.95],[40.32,4.08],[40.53,4.18],[40.77,4.27],[40.87,4.19],[41.02,4.06],[41.09,3.99],[41.14,3.96],[41.22,3.94],[41.32,3.94],[41.37,3.95],[41.48,3.96],[41.74,3.98],[41.88,3.98],[41.76,3.8],[41.61,3.59],[41.34,3.2],[41.13,3.0],[40.98,2.84],[40.96,2.81],[40.97,2.64],[40.97,2.22],[40.97,1.38],[40.97,0.54],[40.98,-0.31],[40.98,-0.73],[40.98,-0.87],[41.12,-1.05],[41.25,-1.22],[41.43,-1.45],[41.52,-1.57],[41.54,-1.61],[41.53,-1.7],[41.39,-1.87],[41.27,-1.95],[41.11,-1.98],[41.06,-1.98],[41.0,-1.95],[40.97,-1.99],[40.95,-2.06],[40.92,-2.04],[40.89,-2.02],[40.91,-2.14],[40.92,-2.19],[40.9,-2.27],[40.82,-2.34],[40.81,-2.39],[40.64,-2.54],[40.4,-2.56],[40.28,-2.63],[40.22,-2.69],[40.18,-2.82],[40.19,-3.02],[40.13,-3.17],[40.12,-3.25],[39.99,-3.35],[39.94,-3.44],[39.9,-3.54],[39.86,-3.58],[39.82,-3.79],[39.76,-3.91],[39.75,-3.96],[39.73,-3.99],[39.69,-4.07],[39.66,-4.12],[39.64,-4.15],[39.49,-4.48],[39.38,-4.63],[39.29,-4.61],[39.23,-4.67],[39.22,-4.69],[39.19,-4.68],[39.12,-4.62],[38.96,-4.51],[38.81,-4.4],[38.65,-4.29],[38.5,-4.18],[38.35,-4.07],[38.19,-3.96],[38.04,-3.85],[37.89,-3.74],[37.8,-3.67],[37.76,-3.64],[37.73,-3.56],[37.71,-3.54],[37.67,-3.52],[37.62,-3.51],[37.61,-3.5],[37.61,-3.46],[37.63,-3.41],[37.68,-3.31],[37.69,-3.25],[37.68,-3.18],[37.66,-3.07],[37.64,-3.05],[37.54,-2.99],[37.33,-2.87],[37.12,-2.75],[36.9,-2.63],[36.69,-2.51],[36.48,-2.39],[36.26,-2.27],[36.05,-2.16],[35.84,-2.04],[35.62,-1.92],[35.41,-1.8],[35.2,-1.68],[34.98,-1.56],[34.77,-1.44],[34.56,-1.32],[34.34,-1.2],[34.13,-1.08],[34.05,-1.04],[33.98,-1.0],[33.9,-1.0],[33.9,-0.83],[33.92,-0.4],[33.92,-0.02],[33.94,0.17],[34.04,0.29],[34.08,0.38],[34.11,0.51],[34.16,0.61],[34.27,0.69],[34.29,0.73],[34.41,0.87],[34.48,1.04],[34.54,1.1],[34.6,1.16],[34.65,1.19],[34.73,1.21],[34.79,1.23],[34.8,1.24],[34.8,1.27],[34.78,1.38],[34.81,1.42],[34.85,1.49],[34.9,1.56],[34.94,1.6],[34.97,1.64],[34.98,1.72],[34.98,1.77],[34.98,1.86],[34.96,2.06],[34.91,2.23],[34.88,2.42],[34.91,2.48],[34.87,2.59],[34.85,2.6],[34.81,2.62],[34.77,2.72],[34.74,2.82],[34.72,2.84],[34.59,2.92],[34.52,3.12],[34.45,3.16],[34.41,3.36],[34.4,3.41],[34.44,3.61],[34.44,3.65],[34.39,3.69],[34.27,3.73],[34.17,3.81],[34.18,3.84],[34.19,3.87],[34.13,3.89],[33.98,4.22],[34.18,4.42],[34.38,4.62],[34.64,4.88],[34.88,5.11],[35.08,5.31],[35.27,5.49]],[[40.99,-2.16],[40.96,-2.17],[40.98,-2.11],[41.09,-2.04],[41.13,-2.05],[41.14,-2.07],[41.14,-2.09],[41.12,-2.1],[40.99,-2.16]]]},{"n":"Kyrgyzstan","r":[[[80.21,42.19],[80.23,42.13],[80.25,42.06],[80.24,42.04],[80.22,42.03],[79.91,42.01],[79.84,42.0],[79.77,41.9],[79.5,41.82],[79.35,41.78],[79.29,41.78],[79.15,41.72],[78.74,41.56],[78.54,41.46],[78.44,41.42],[78.36,41.37],[78.35,41.33],[78.35,41.28],[78.12,41.08],[77.96,41.05],[77.82,41.06],[77.72,41.02],[77.58,40.99],[77.28,41.01],[77.18,41.01],[76.99,41.04],[76.91,41.02],[76.82,40.98],[76.71,40.82],[76.66,40.78],[76.64,40.74],[76.62,40.66],[76.58,40.58],[76.52,40.51],[76.48,40.45],[76.4,40.39],[76.32,40.35],[76.26,40.43],[76.21,40.41],[76.16,40.38],[76.06,40.39],[76.0,40.37],[75.87,40.3],[75.68,40.31],[75.66,40.33],[75.62,40.52],[75.58,40.61],[75.56,40.63],[75.52,40.63],[75.24,40.48],[75.11,40.45],[75.0,40.45],[74.87,40.49],[74.84,40.48],[74.81,40.46],[74.8,40.43],[74.84,40.34],[74.83,40.33],[74.77,40.33],[74.68,40.31],[74.61,40.27],[74.41,40.14],[74.24,40.09],[74.09,40.07],[74.02,40.06],[73.99,40.04],[73.94,39.98],[73.88,39.88],[73.86,39.83],[73.84,39.8],[73.84,39.76],[73.88,39.71],[73.91,39.61],[73.91,39.58],[73.87,39.53],[73.82,39.49],[73.72,39.46],[73.63,39.45],[73.58,39.46],[73.47,39.46],[73.39,39.44],[73.34,39.41],[73.23,39.37],[73.11,39.36],[72.95,39.36],[72.87,39.36],[72.64,39.39],[72.56,39.38],[72.49,39.36],[72.36,39.34],[72.29,39.27],[72.25,39.22],[72.23,39.21],[72.15,39.26],[72.08,39.31],[72.04,39.35],[71.99,39.35],[71.81,39.28],[71.78,39.28],[71.73,39.31],[71.74,39.38],[71.73,39.42],[71.67,39.45],[71.55,39.45],[71.5,39.48],[71.51,39.52],[71.52,39.55],[71.5,39.58],[71.47,39.6],[71.4,39.6],[71.33,39.57],[71.27,39.54],[71.2,39.52],[71.12,39.51],[71.07,39.49],[71.0,39.41],[70.8,39.39],[70.73,39.41],[70.68,39.47],[70.61,39.56],[70.57,39.58],[70.5,39.59],[70.39,39.58],[70.24,39.54],[70.21,39.58],[70.17,39.58],[70.14,39.56],[70.1,39.56],[69.96,39.55],[69.77,39.56],[69.67,39.57],[69.6,39.57],[69.46,39.53],[69.39,39.53],[69.3,39.52],[69.28,39.67],[69.23,39.76],[69.24,39.83],[69.28,39.92],[69.31,39.97],[69.37,39.95],[69.43,39.91],[69.48,39.92],[69.49,39.95],[69.47,39.99],[69.47,40.02],[69.49,40.06],[69.53,40.1],[69.77,40.16],[69.97,40.2],[70.07,40.17],[70.27,40.1],[70.38,40.07],[70.45,40.05],[70.52,39.95],[70.56,39.95],[70.6,39.97],[70.62,40.0],[70.64,40.08],[70.74,40.13],[70.95,40.19],[70.96,40.22],[70.96,40.24],[70.99,40.25],[71.09,40.27],[71.3,40.29],[71.38,40.28],[71.46,40.24],[71.52,40.21],[71.58,40.21],[71.63,40.22],[71.65,40.21],[71.67,40.18],[71.69,40.15],[71.77,40.19],[71.85,40.23],[71.9,40.24],[71.96,40.26],[71.97,40.29],[72.01,40.34],[72.13,40.44],[72.19,40.45],[72.23,40.45],[72.23,40.44],[72.25,40.42],[72.36,40.4],[72.39,40.43],[72.41,40.46],[72.37,40.52],[72.37,40.54],[72.38,40.57],[72.4,40.58],[72.57,40.52],[72.6,40.53],[72.68,40.56],[72.75,40.61],[72.77,40.65],[73.11,40.79],[73.14,40.81],[73.13,40.83],[72.99,40.86],[72.93,40.84],[72.87,40.84],[72.83,40.86],[72.66,40.87],[72.62,40.88],[72.51,40.98],[72.43,41.02],[72.36,41.04],[72.29,41.04],[72.21,41.01],[72.19,41.03],[72.18,41.07],[72.18,41.12],[72.16,41.17],[72.12,41.19],[72.05,41.16],[71.96,41.19],[71.88,41.2],[71.86,41.31],[71.83,41.36],[71.79,41.41],[71.76,41.43],[71.7,41.45],[71.7,41.52],[71.69,41.53],[71.66,41.54],[71.64,41.53],[71.6,41.5],[71.62,41.44],[71.61,41.37],[71.59,41.33],[71.55,41.31],[71.5,41.31],[71.42,41.34],[71.41,41.14],[71.39,41.12],[71.3,41.15],[71.22,41.14],[71.11,41.15],[71.03,41.19],[70.96,41.2],[70.86,41.22],[70.78,41.26],[70.73,41.4],[70.69,41.45],[70.65,41.46],[70.47,41.41],[70.41,41.45],[70.29,41.5],[70.2,41.51],[70.18,41.54],[70.18,41.57],[70.45,41.73],[70.56,41.83],[70.63,41.88],[70.73,41.91],[70.8,41.92],[70.84,42.02],[70.86,42.03],[70.91,42.04],[71.03,42.08],[71.23,42.16],[71.23,42.19],[71.21,42.21],[71.13,42.25],[71.04,42.28],[70.98,42.27],[70.95,42.25],[70.89,42.29],[70.89,42.34],[70.95,42.42],[71.0,42.46],[71.02,42.54],[71.09,42.59],[71.17,42.67],[71.26,42.73],[71.42,42.78],[71.51,42.77],[71.6,42.78],[71.73,42.82],[71.76,42.82],[71.82,42.82],[72.16,42.76],[72.28,42.76],[72.54,42.68],[72.67,42.66],[72.75,42.64],[72.79,42.6],[72.86,42.56],[73.19,42.53],[73.28,42.5],[73.32,42.47],[73.41,42.42],[73.49,42.41],[73.42,42.59],[73.45,42.7],[73.56,43.0],[73.61,43.05],[73.72,43.09],[73.89,43.13],[73.95,43.2],[74.09,43.19],[74.15,43.19],[74.19,43.21],[74.21,43.24],[74.36,43.18],[74.62,43.06],[74.82,42.98],[75.05,42.9],[75.37,42.84],[75.64,42.81],[75.68,42.83],[75.79,42.93],[75.84,42.94],[75.93,42.93],[76.22,42.92],[76.51,42.92],[76.65,42.93],[76.94,42.97],[76.99,42.97],[77.06,42.97],[77.24,42.91],[77.37,42.9],[77.46,42.9],[77.51,42.9],[77.62,42.9],[77.8,42.9],[78.02,42.86],[78.29,42.86],[78.38,42.87],[78.52,42.86],[78.64,42.83],[78.79,42.79],[78.89,42.77],[78.95,42.77],[79.06,42.76],[79.13,42.78],[79.16,42.76],[79.2,42.67],[79.3,42.6],[79.37,42.55],[79.43,42.48],[79.49,42.46],[79.6,42.46],[79.8,42.44],[79.92,42.41],[80.07,42.3],[80.21,42.19]]]},{"n":"Cambodia","r":[[[103.32,10.72],[103.28,10.68],[103.22,10.76],[103.22,10.78],[103.32,10.72]],[[103.05,11.29],[103.03,11.28],[103.01,11.28],[102.99,11.29],[103.0,11.35],[103.01,11.38],[103.04,11.39],[103.05,11.29]],[[104.43,10.41],[104.26,10.54],[103.94,10.59],[103.9,10.64],[103.87,10.66],[103.84,10.58],[103.66,10.51],[103.59,10.55],[103.53,10.6],[103.54,10.67],[103.59,10.72],[103.68,10.76],[103.72,10.89],[103.65,11.06],[103.6,11.11],[103.53,11.15],[103.47,11.08],[103.41,10.98],[103.35,10.92],[103.27,10.91],[103.15,10.91],[103.11,11.07],[103.09,11.21],[103.11,11.37],[103.13,11.46],[103.01,11.59],[103.0,11.71],[102.95,11.77],[102.93,11.74],[102.93,11.71],[102.92,11.73],[102.74,12.09],[102.71,12.26],[102.74,12.38],[102.76,12.43],[102.7,12.49],[102.63,12.57],[102.5,12.67],[102.49,12.83],[102.46,13.02],[102.42,13.08],[102.36,13.19],[102.33,13.29],[102.32,13.54],[102.34,13.56],[102.43,13.57],[102.55,13.59],[102.57,13.63],[102.54,13.66],[102.62,13.72],[102.73,13.84],[102.81,13.97],[102.87,14.05],[102.91,14.14],[103.03,14.25],[103.2,14.33],[103.31,14.35],[103.43,14.38],[103.55,14.42],[103.6,14.42],[103.74,14.37],[103.82,14.36],[103.9,14.36],[103.98,14.36],[104.05,14.36],[104.23,14.4],[104.41,14.37],[104.58,14.39],[104.78,14.43],[104.88,14.4],[104.97,14.37],[104.98,14.29],[105.0,14.25],[105.03,14.23],[105.07,14.23],[105.13,14.28],[105.17,14.34],[105.18,14.35],[105.19,14.32],[105.21,14.26],[105.25,14.2],[105.28,14.16],[105.35,14.11],[105.39,14.11],[105.53,14.16],[105.74,14.08],[105.76,14.05],[105.83,13.98],[105.9,13.92],[106.07,13.92],[106.12,14.05],[106.1,14.13],[106.0,14.26],[105.98,14.34],[106.01,14.36],[106.17,14.37],[106.19,14.39],[106.23,14.48],[106.27,14.47],[106.35,14.45],[106.45,14.52],[106.5,14.58],[106.53,14.55],[106.56,14.51],[106.6,14.48],[106.67,14.44],[106.74,14.39],[106.78,14.34],[106.82,14.31],[106.91,14.33],[106.94,14.33],[106.99,14.39],[107.03,14.43],[107.06,14.42],[107.11,14.42],[107.21,14.5],[107.26,14.57],[107.29,14.59],[107.38,14.56],[107.41,14.56],[107.47,14.66],[107.52,14.71],[107.54,14.65],[107.49,14.55],[107.45,14.45],[107.36,14.37],[107.36,14.31],[107.33,14.13],[107.34,14.07],[107.36,14.02],[107.39,13.99],[107.46,13.82],[107.53,13.65],[107.59,13.52],[107.61,13.44],[107.55,13.23],[107.48,13.03],[107.48,12.93],[107.51,12.84],[107.54,12.71],[107.56,12.54],[107.54,12.43],[107.51,12.36],[107.45,12.3],[107.39,12.26],[107.33,12.32],[107.28,12.32],[107.21,12.3],[107.16,12.28],[107.05,12.18],[106.93,12.08],[106.76,12.05],[106.7,11.98],[106.63,11.97],[106.5,11.97],[106.41,11.95],[106.42,11.91],[106.41,11.74],[106.41,11.7],[106.4,11.69],[106.34,11.68],[106.24,11.71],[106.1,11.75],[106.01,11.76],[105.96,11.68],[105.93,11.65],[105.89,11.65],[105.85,11.64],[105.84,11.6],[105.84,11.56],[105.85,11.49],[105.86,11.37],[105.86,11.29],[105.89,11.24],[106.1,11.08],[106.16,11.04],[106.17,11.01],[106.13,10.92],[106.16,10.79],[106.1,10.8],[105.99,10.85],[105.94,10.89],[105.88,10.86],[105.85,10.86],[105.81,10.93],[105.76,10.99],[105.7,10.99],[105.58,10.97],[105.45,10.95],[105.41,10.95],[105.39,10.94],[105.31,10.85],[105.28,10.86],[105.16,10.9],[105.05,10.91],[105.02,10.89],[105.04,10.81],[105.06,10.73],[105.05,10.7],[104.98,10.66],[104.9,10.59],[104.85,10.53],[104.82,10.52],[104.69,10.52],[104.56,10.52],[104.51,10.46],[104.47,10.42],[104.43,10.41]]]},{"n":"Kiribati","r":[[[-151.78,-11.44],[-151.79,-11.46],[-151.81,-11.45],[-151.82,-11.43],[-151.82,-11.41],[-151.81,-11.39],[-151.8,-11.39],[-151.79,-11.41],[-151.78,-11.44]],[[-155.86,-5.63],[-155.89,-5.63],[-155.91,-5.63],[-155.93,-5.62],[-155.93,-5.61],[-155.92,-5.61],[-155.91,-5.61],[-155.87,-5.61],[-155.86,-5.62],[-155.86,-5.63]],[[-174.51,-4.68],[-174.5,-4.69],[-174.5,-4.69],[-174.51,-4.69],[-174.52,-4.69],[-174.53,-4.68],[-174.52,-4.69],[-174.51,-4.69],[-174.52,-4.67],[-174.53,-4.67],[-174.54,-4.66],[-174.54,-4.66],[-174.53,-4.66],[-174.51,-4.68]],[[-172.21,-4.51],[-172.21,-4.52],[-172.19,-4.52],[-172.18,-4.51],[-172.19,-4.52],[-172.22,-4.52],[-172.23,-4.51],[-172.21,-4.49],[-172.2,-4.49],[-172.2,-4.5],[-172.2,-4.5],[-172.2,-4.5],[-172.21,-4.5],[-172.21,-4.51]],[[-171.23,-4.46],[-171.24,-4.47],[-171.25,-4.47],[-171.26,-4.46],[-171.26,-4.45],[-171.25,-4.44],[-171.24,-4.44],[-171.23,-4.45],[-171.23,-4.46]],[[-154.96,-4.09],[-154.96,-4.09],[-154.97,-4.09],[-154.99,-4.07],[-155.01,-4.05],[-155.02,-4.05],[-154.99,-4.04],[-154.95,-4.03],[-154.94,-4.04],[-154.95,-4.06],[-154.96,-4.09]],[[-171.09,-3.14],[-171.09,-3.14],[-171.1,-3.14],[-171.09,-3.13],[-171.09,-3.12],[-171.08,-3.12],[-171.09,-3.14]],[[-171.7,-2.77],[-171.66,-2.79],[-171.64,-2.81],[-171.63,-2.85],[-171.63,-2.86],[-171.65,-2.86],[-171.67,-2.84],[-171.69,-2.83],[-171.7,-2.83],[-171.7,-2.82],[-171.68,-2.82],[-171.66,-2.84],[-171.64,-2.85],[-171.64,-2.83],[-171.66,-2.8],[-171.67,-2.79],[-171.69,-2.78],[-171.71,-2.77],[-171.72,-2.78],[-171.72,-2.78],[-171.73,-2.77],[-171.73,-2.77],[-171.72,-2.76],[-171.7,-2.77]],[[174.77,-1.21],[174.78,-1.26],[174.76,-1.26],[174.75,-1.24],[174.74,-1.18],[174.72,-1.13],[174.74,-1.15],[174.77,-1.19],[174.77,-1.21]],[[169.55,-0.87],[169.54,-0.88],[169.52,-0.87],[169.53,-0.85],[169.54,-0.85],[169.56,-0.86],[169.55,-0.87]],[[174.51,-0.8],[174.48,-0.83],[174.46,-0.8],[174.48,-0.77],[174.45,-0.65],[174.41,-0.63],[174.38,-0.59],[174.39,-0.59],[174.44,-0.63],[174.47,-0.64],[174.5,-0.73],[174.51,-0.8]],[[173.03,1.01],[173.09,0.97],[173.08,0.95],[173.06,0.92],[172.99,0.84],[172.97,0.84],[173.04,0.91],[173.07,0.96],[173.03,1.0],[173.01,0.99],[173.0,0.99],[172.99,1.03],[173.0,1.03],[173.03,1.01]],[[173.04,1.34],[173.01,1.34],[173.03,1.36],[173.14,1.38],[173.15,1.39],[173.17,1.38],[173.17,1.36],[173.16,1.36],[173.11,1.36],[173.06,1.35],[173.04,1.34]],[[173.03,1.72],[172.99,1.71],[173.02,1.73],[173.03,1.75],[173.02,1.81],[173.04,1.8],[173.04,1.78],[173.05,1.74],[173.03,1.72]],[[173.02,1.85],[173.02,1.82],[172.97,1.89],[172.93,1.93],[172.93,1.94],[172.95,1.93],[172.97,1.91],[172.98,1.9],[173.02,1.85]],[[-157.34,1.86],[-157.18,1.74],[-157.25,1.73],[-157.42,1.79],[-157.58,1.9],[-157.53,1.93],[-157.51,1.89],[-157.44,1.85],[-157.39,1.93],[-157.37,1.95],[-157.49,2.03],[-157.44,2.03],[-157.32,1.97],[-157.34,1.86]],[[172.84,3.05],[172.77,3.01],[172.75,3.03],[172.78,3.03],[172.83,3.07],[172.89,3.07],[172.88,3.05],[172.84,3.05]],[[172.97,3.13],[172.91,3.1],[172.89,3.1],[172.96,3.15],[172.96,3.14],[172.97,3.13]],[[-159.34,3.92],[-159.26,3.84],[-159.27,3.8],[-159.33,3.8],[-159.36,3.82],[-159.31,3.82],[-159.31,3.84],[-159.33,3.86],[-159.35,3.88],[-159.37,3.88],[-159.38,3.85],[-159.41,3.87],[-159.39,3.9],[-159.37,3.92],[-159.34,3.92]]]},{"n":"Saint Kitts and Nevis","r":[[[-62.53,17.12],[-62.58,17.1],[-62.62,17.13],[-62.62,17.2],[-62.57,17.2],[-62.53,17.17],[-62.53,17.12]],[[-62.63,17.24],[-62.66,17.22],[-62.7,17.29],[-62.78,17.3],[-62.84,17.34],[-62.84,17.35],[-62.84,17.37],[-62.83,17.39],[-62.79,17.4],[-62.71,17.35],[-62.68,17.29],[-62.64,17.26],[-62.63,17.24]]]},{"n":"South Korea","r":[[[126.33,33.22],[126.28,33.2],[126.24,33.21],[126.23,33.23],[126.18,33.28],[126.17,33.31],[126.2,33.37],[126.34,33.46],[126.7,33.55],[126.76,33.55],[126.9,33.52],[126.93,33.44],[126.91,33.38],[126.87,33.34],[126.71,33.27],[126.58,33.24],[126.33,33.22]],[[126.75,34.34],[126.77,34.3],[126.69,34.31],[126.65,34.35],[126.65,34.39],[126.7,34.4],[126.75,34.34]],[[126.23,34.37],[126.17,34.36],[126.13,34.39],[126.11,34.4],[126.12,34.44],[126.23,34.53],[126.25,34.56],[126.34,34.54],[126.38,34.5],[126.34,34.43],[126.23,34.37]],[[127.8,34.62],[127.79,34.58],[127.74,34.63],[127.79,34.68],[127.8,34.62]],[[126.17,34.73],[126.16,34.71],[126.12,34.71],[126.07,34.78],[126.05,34.84],[126.01,34.87],[126.08,34.91],[126.17,34.83],[126.17,34.73]],[[128.07,34.81],[128.05,34.71],[127.98,34.7],[127.94,34.77],[127.9,34.74],[127.87,34.73],[127.84,34.81],[127.83,34.87],[127.92,34.92],[127.97,34.89],[128.04,34.88],[128.07,34.81]],[[128.74,34.8],[128.65,34.74],[128.52,34.82],[128.49,34.87],[128.59,34.93],[128.67,35.01],[128.72,35.01],[128.74,34.8]],[[126.42,36.49],[126.4,36.43],[126.34,36.47],[126.32,36.61],[126.39,36.57],[126.42,36.49]],[[130.92,37.48],[130.87,37.45],[130.82,37.48],[130.81,37.51],[130.84,37.54],[130.9,37.55],[130.93,37.53],[130.92,37.48]],[[126.52,37.74],[126.52,37.6],[126.46,37.61],[126.42,37.62],[126.41,37.65],[126.37,37.77],[126.41,37.82],[126.49,37.78],[126.52,37.74]],[[128.37,38.62],[128.62,38.18],[128.85,37.89],[129.05,37.68],[129.34,37.27],[129.42,37.06],[129.43,36.93],[129.47,36.74],[129.43,36.64],[129.45,36.47],[129.43,36.39],[129.39,36.32],[129.39,36.2],[129.4,36.14],[129.4,36.05],[129.43,36.02],[129.46,36.01],[129.51,36.04],[129.57,36.05],[129.56,35.95],[129.49,35.69],[129.42,35.5],[129.33,35.33],[129.21,35.18],[129.08,35.12],[128.98,35.1],[128.8,35.09],[128.64,35.12],[128.51,35.1],[128.46,35.07],[128.42,35.02],[128.45,34.93],[128.44,34.87],[128.39,34.88],[128.28,34.91],[128.15,34.92],[128.09,34.93],[128.04,35.02],[127.98,35.02],[127.87,34.97],[127.71,34.95],[127.66,34.93],[127.64,34.89],[127.66,34.84],[127.74,34.78],[127.72,34.72],[127.63,34.69],[127.57,34.77],[127.52,34.84],[127.48,34.84],[127.4,34.82],[127.39,34.74],[127.42,34.69],[127.48,34.63],[127.4,34.55],[127.38,34.5],[127.32,34.46],[127.17,34.55],[127.19,34.61],[127.26,34.66],[127.27,34.72],[127.25,34.76],[127.03,34.61],[126.9,34.44],[126.83,34.45],[126.8,34.49],[126.75,34.51],[126.61,34.4],[126.58,34.32],[126.53,34.31],[126.51,34.35],[126.51,34.43],[126.48,34.49],[126.33,34.59],[126.26,34.67],[126.3,34.72],[126.43,34.69],[126.52,34.7],[126.5,34.74],[126.47,34.76],[126.54,34.78],[126.59,34.82],[126.55,34.84],[126.48,34.81],[126.42,34.82],[126.4,34.93],[126.33,35.05],[126.29,35.15],[126.36,35.22],[126.4,35.31],[126.46,35.46],[126.49,35.5],[126.58,35.53],[126.61,35.57],[126.56,35.59],[126.49,35.61],[126.49,35.65],[126.54,35.67],[126.6,35.71],[126.72,35.77],[126.75,35.87],[126.72,35.9],[126.65,35.92],[126.66,35.97],[126.69,36.01],[126.68,36.04],[126.6,36.11],[126.54,36.17],[126.56,36.24],[126.54,36.34],[126.55,36.43],[126.55,36.48],[126.51,36.59],[126.49,36.69],[126.43,36.68],[126.39,36.65],[126.23,36.69],[126.18,36.69],[126.16,36.77],[126.22,36.87],[126.35,36.96],[126.43,36.97],[126.49,37.01],[126.58,37.02],[126.69,36.96],[126.78,36.95],[126.84,36.85],[126.87,36.82],[126.88,36.86],[126.96,36.91],[126.98,36.94],[126.96,36.96],[126.87,36.98],[126.79,37.1],[126.78,37.16],[126.75,37.19],[126.79,37.29],[126.7,37.41],[126.65,37.45],[126.66,37.55],[126.61,37.62],[126.58,37.65],[126.56,37.72],[126.58,37.74],[126.62,37.76],[126.63,37.78],[126.66,37.8],[126.67,37.83],[126.67,37.92],[126.75,37.98],[126.88,38.11],[126.94,38.18],[127.01,38.24],[127.09,38.28],[127.17,38.3],[127.29,38.31],[127.53,38.3],[127.58,38.31],[127.75,38.32],[127.78,38.31],[127.91,38.3],[128.04,38.31],[128.11,38.33],[128.17,38.36],[128.22,38.42],[128.28,38.52],[128.34,38.61],[128.37,38.62]]]},{"n":"Kosovo","r":[[[20.57,41.87],[20.58,41.92],[20.58,42.01],[20.52,42.17],[20.49,42.22],[20.41,42.27],[20.35,42.31],[20.24,42.34],[20.19,42.43],[20.1,42.52],[20.06,42.55],[20.07,42.56],[20.09,42.63],[20.07,42.69],[20.03,42.73],[20.05,42.76],[20.13,42.76],[20.19,42.75],[20.22,42.8],[20.34,42.83],[20.47,42.86],[20.49,42.88],[20.46,42.92],[20.48,42.95],[20.62,43.03],[20.65,43.07],[20.66,43.1],[20.64,43.13],[20.61,43.18],[20.62,43.2],[20.7,43.23],[20.76,43.26],[20.8,43.26],[20.82,43.24],[20.82,43.21],[20.84,43.17],[20.89,43.15],[20.97,43.12],[21.06,43.09],[21.13,43.04],[21.22,42.96],[21.24,42.91],[21.32,42.87],[21.4,42.83],[21.39,42.75],[21.66,42.68],[21.72,42.68],[21.75,42.67],[21.75,42.65],[21.73,42.6],[21.62,42.42],[21.61,42.39],[21.53,42.35],[21.52,42.33],[21.54,42.28],[21.56,42.25],[21.56,42.25],[21.39,42.22],[21.33,42.19],[21.3,42.13],[21.29,42.1],[21.26,42.1],[21.21,42.13],[21.14,42.18],[21.06,42.17],[20.78,42.07],[20.75,42.02],[20.74,41.9],[20.72,41.87],[20.69,41.85],[20.58,41.87],[20.57,41.87]]]},{"n":"Kuwait","r":[[[46.53,29.1],[46.69,29.26],[46.77,29.35],[46.91,29.54],[46.98,29.67],[47.04,29.82],[47.1,29.94],[47.11,29.96],[47.15,30.0],[47.22,30.04],[47.33,30.08],[47.51,30.1],[47.64,30.1],[47.67,30.1],[47.75,30.08],[47.98,29.98],[47.97,29.95],[48.01,29.84],[48.08,29.72],[48.14,29.62],[48.14,29.57],[48.09,29.58],[48.05,29.6],[47.97,29.62],[47.82,29.49],[47.73,29.42],[47.72,29.39],[47.85,29.37],[47.94,29.37],[48.0,29.39],[48.05,29.36],[48.09,29.28],[48.1,29.21],[48.18,28.98],[48.25,28.9],[48.34,28.76],[48.37,28.69],[48.39,28.63],[48.44,28.54],[48.27,28.54],[48.05,28.54],[47.87,28.54],[47.67,28.53],[47.58,28.63],[47.55,28.73],[47.52,28.84],[47.43,28.99],[47.14,29.03],[46.98,29.05],[46.72,29.07],[46.53,29.1]],[[48.28,29.62],[48.22,29.6],[48.18,29.61],[48.14,29.67],[48.08,29.8],[48.11,29.85],[48.11,29.87],[48.12,29.89],[48.14,29.9],[48.16,29.96],[48.18,29.98],[48.23,29.94],[48.35,29.78],[48.35,29.72],[48.34,29.69],[48.28,29.62]]]},{"n":"Laos","r":[[[101.14,21.57],[101.2,21.52],[101.18,21.41],[101.21,21.38],[101.22,21.34],[101.21,21.28],[101.22,21.22],[101.25,21.2],[101.28,21.18],[101.44,21.23],[101.54,21.23],[101.58,21.2],[101.62,21.18],[101.67,21.17],[101.7,21.15],[101.73,21.16],[101.78,21.2],[101.8,21.21],[101.8,21.24],[101.76,21.28],[101.72,21.31],[101.72,21.4],[101.74,21.53],[101.75,21.61],[101.74,21.78],[101.74,21.83],[101.7,21.88],[101.6,21.99],[101.58,22.06],[101.56,22.12],[101.56,22.16],[101.54,22.21],[101.52,22.25],[101.57,22.28],[101.62,22.33],[101.65,22.41],[101.67,22.46],[101.71,22.49],[101.74,22.5],[101.76,22.49],[101.84,22.39],[101.95,22.44],[102.02,22.44],[102.09,22.41],[102.13,22.38],[102.18,22.28],[102.3,22.18],[102.44,22.03],[102.49,21.96],[102.58,21.9],[102.61,21.85],[102.63,21.77],[102.64,21.71],[102.66,21.68],[102.7,21.66],[102.74,21.68],[102.77,21.71],[102.8,21.8],[102.82,21.81],[102.85,21.73],[102.88,21.72],[102.92,21.71],[102.95,21.68],[102.96,21.63],[102.95,21.57],[102.91,21.51],[102.89,21.44],[102.87,21.34],[102.85,21.27],[102.88,21.2],[103.1,20.89],[103.21,20.84],[103.46,20.78],[103.55,20.74],[103.64,20.7],[103.71,20.72],[103.79,20.81],[103.88,20.86],[104.05,20.94],[104.1,20.95],[104.2,20.91],[104.35,20.82],[104.46,20.73],[104.53,20.69],[104.58,20.65],[104.58,20.6],[104.53,20.55],[104.48,20.53],[104.41,20.49],[104.37,20.44],[104.39,20.42],[104.5,20.41],[104.62,20.37],[104.66,20.33],[104.66,20.29],[104.68,20.22],[104.7,20.21],[104.81,20.22],[104.85,20.2],[104.89,20.17],[104.93,20.08],[104.93,20.02],[104.85,19.95],[104.82,19.9],[104.8,19.84],[104.74,19.75],[104.59,19.62],[104.55,19.61],[104.26,19.69],[104.13,19.68],[104.06,19.68],[104.03,19.68],[104.01,19.65],[104.05,19.56],[104.06,19.48],[104.03,19.42],[103.93,19.37],[103.9,19.34],[103.89,19.3],[103.92,19.27],[104.01,19.23],[104.11,19.2],[104.45,18.98],[104.52,18.93],[104.61,18.86],[104.72,18.8],[104.99,18.73],[105.12,18.68],[105.15,18.65],[105.15,18.62],[105.11,18.57],[105.09,18.5],[105.09,18.45],[105.11,18.41],[105.16,18.34],[105.27,18.24],[105.33,18.19],[105.4,18.18],[105.46,18.15],[105.52,18.08],[105.59,17.98],[105.6,17.92],[105.63,17.83],[105.69,17.74],[105.78,17.64],[105.9,17.53],[105.97,17.45],[106.01,17.42],[106.27,17.22],[106.33,17.14],[106.43,17.0],[106.47,16.98],[106.5,16.95],[106.53,16.88],[106.53,16.82],[106.55,16.65],[106.59,16.6],[106.64,16.54],[106.66,16.49],[106.7,16.46],[106.74,16.45],[106.79,16.49],[106.83,16.53],[106.85,16.52],[106.89,16.4],[106.93,16.35],[107.0,16.31],[107.07,16.28],[107.22,16.14],[107.3,16.08],[107.35,16.07],[107.4,16.04],[107.41,16.0],[107.39,15.95],[107.36,15.92],[107.19,15.84],[107.17,15.8],[107.19,15.75],[107.23,15.68],[107.28,15.62],[107.34,15.56],[107.46,15.47],[107.56,15.39],[107.62,15.31],[107.65,15.26],[107.63,15.19],[107.59,15.12],[107.56,15.06],[107.5,15.02],[107.48,14.98],[107.5,14.92],[107.52,14.87],[107.51,14.82],[107.52,14.71],[107.47,14.66],[107.41,14.56],[107.38,14.56],[107.29,14.59],[107.26,14.57],[107.21,14.5],[107.11,14.42],[107.06,14.42],[107.03,14.43],[106.99,14.39],[106.94,14.33],[106.91,14.33],[106.82,14.31],[106.78,14.34],[106.74,14.39],[106.67,14.44],[106.6,14.48],[106.56,14.51],[106.53,14.55],[106.5,14.58],[106.45,14.52],[106.35,14.45],[106.27,14.47],[106.23,14.48],[106.19,14.39],[106.17,14.37],[106.01,14.36],[105.98,14.34],[106.0,14.26],[106.1,14.13],[106.12,14.05],[106.07,13.92],[105.9,13.92],[105.83,13.98],[105.76,14.05],[105.74,14.08],[105.53,14.16],[105.39,14.11],[105.35,14.11],[105.28,14.16],[105.25,14.2],[105.21,14.26],[105.19,14.32],[105.18,14.35],[105.24,14.37],[105.34,14.42],[105.42,14.47],[105.48,14.53],[105.5,14.59],[105.5,14.66],[105.52,14.84],[105.55,14.93],[105.53,15.04],[105.49,15.13],[105.49,15.26],[105.51,15.32],[105.51,15.36],[105.57,15.41],[105.62,15.49],[105.64,15.59],[105.64,15.66],[105.62,15.7],[105.56,15.74],[105.46,15.78],[105.4,15.83],[105.37,15.89],[105.38,15.94],[105.41,15.99],[105.33,16.04],[105.15,16.09],[105.05,16.16],[105.03,16.24],[104.95,16.34],[104.82,16.47],[104.75,16.65],[104.74,16.88],[104.76,17.08],[104.82,17.3],[104.74,17.46],[104.66,17.55],[104.54,17.61],[104.43,17.7],[104.32,17.82],[104.2,17.99],[104.05,18.22],[103.95,18.32],[103.9,18.3],[103.79,18.32],[103.63,18.38],[103.49,18.42],[103.37,18.42],[103.29,18.41],[103.25,18.37],[103.25,18.34],[103.28,18.3],[103.26,18.28],[103.2,18.26],[103.15,18.22],[103.09,18.14],[103.05,18.03],[102.99,17.99],[102.9,17.98],[102.81,17.95],[102.72,17.89],[102.68,17.85],[102.68,17.82],[102.66,17.82],[102.62,17.83],[102.6,17.87],[102.6,17.93],[102.55,17.97],[102.46,17.98],[102.35,18.05],[102.23,18.15],[102.15,18.2],[102.1,18.21],[102.03,18.17],[101.95,18.08],[101.88,18.05],[101.82,18.06],[101.77,18.03],[101.74,17.95],[101.69,17.89],[101.56,17.82],[101.56,17.81],[101.41,17.72],[101.3,17.62],[101.17,17.5],[101.11,17.48],[101.05,17.51],[100.96,17.54],[100.91,17.58],[101.0,17.8],[101.11,18.03],[101.14,18.14],[101.15,18.22],[101.14,18.29],[101.09,18.35],[101.05,18.41],[101.05,18.44],[101.06,18.48],[101.11,18.53],[101.17,18.62],[101.22,18.79],[101.29,18.98],[101.28,19.09],[101.23,19.21],[101.2,19.33],[101.22,19.49],[101.21,19.55],[101.15,19.58],[100.97,19.61],[100.91,19.61],[100.86,19.59],[100.81,19.54],[100.74,19.51],[100.63,19.5],[100.51,19.55],[100.42,19.64],[100.4,19.76],[100.47,19.89],[100.51,20.0],[100.54,20.09],[100.54,20.13],[100.52,20.18],[100.49,20.18],[100.43,20.24],[100.37,20.34],[100.32,20.39],[100.27,20.38],[100.22,20.34],[100.17,20.27],[100.14,20.25],[100.11,20.26],[100.12,20.32],[100.13,20.37],[100.18,20.59],[100.25,20.73],[100.33,20.8],[100.41,20.82],[100.49,20.81],[100.57,20.83],[100.62,20.86],[100.62,20.88],[100.55,20.88],[100.52,20.92],[100.54,20.99],[100.57,21.04],[100.61,21.06],[100.66,21.13],[100.7,21.25],[100.76,21.31],[100.82,21.31],[100.93,21.37],[101.08,21.47],[101.14,21.57]]]},{"n":"Lebanon","r":[[[35.87,33.43],[35.84,33.42],[35.79,33.37],[35.73,33.33],[35.63,33.28],[35.6,33.24],[35.58,33.27],[35.53,33.25],[35.49,33.12],[35.41,33.08],[35.31,33.08],[35.22,33.09],[35.11,33.08],[35.16,33.16],[35.2,33.26],[35.25,33.39],[35.34,33.5],[35.51,33.88],[35.61,34.03],[35.65,34.25],[35.8,34.44],[35.92,34.49],[35.98,34.55],[35.98,34.63],[36.15,34.63],[36.26,34.63],[36.3,34.68],[36.38,34.66],[36.43,34.61],[36.39,34.57],[36.33,34.51],[36.33,34.5],[36.38,34.5],[36.46,34.47],[36.5,34.43],[36.58,34.22],[36.54,34.13],[36.46,34.06],[36.42,34.05],[36.35,34.01],[36.3,33.96],[36.28,33.93],[36.28,33.89],[36.36,33.86],[36.37,33.84],[36.35,33.83],[36.28,33.84],[36.2,33.84],[36.15,33.84],[36.09,33.83],[36.02,33.78],[35.99,33.75],[35.97,33.73],[35.94,33.67],[35.97,33.62],[36.03,33.6],[36.03,33.59],[36.02,33.56],[35.97,33.53],[35.93,33.5],[35.91,33.47],[35.87,33.43]]]},{"n":"Liberia","r":[[[-8.49,7.56],[-8.47,7.55],[-8.44,7.52],[-8.41,7.41],[-8.3,7.07],[-8.3,6.98],[-8.32,6.92],[-8.33,6.86],[-8.33,6.8],[-8.4,6.71],[-8.6,6.51],[-8.59,6.49],[-8.54,6.47],[-8.49,6.46],[-8.45,6.46],[-8.4,6.41],[-8.34,6.35],[-8.29,6.32],[-8.2,6.29],[-8.13,6.29],[-8.07,6.3],[-7.98,6.29],[-7.89,6.23],[-7.86,6.15],[-7.83,6.08],[-7.8,6.04],[-7.8,5.98],[-7.73,5.92],[-7.64,5.91],[-7.51,5.84],[-7.48,5.85],[-7.47,5.85],[-7.45,5.84],[-7.42,5.65],[-7.4,5.55],[-7.41,5.51],[-7.43,5.48],[-7.43,5.32],[-7.49,5.24],[-7.49,5.14],[-7.51,5.11],[-7.57,5.08],[-7.57,5.01],[-7.59,4.92],[-7.59,4.82],[-7.57,4.57],[-7.57,4.39],[-7.54,4.35],[-7.66,4.37],[-8.0,4.51],[-8.26,4.59],[-9.13,5.05],[-9.37,5.24],[-9.65,5.52],[-10.28,6.08],[-10.42,6.17],[-10.6,6.21],[-10.71,6.26],[-10.79,6.31],[-10.85,6.47],[-11.0,6.56],[-11.29,6.69],[-11.51,6.91],[-11.45,6.95],[-11.38,7.09],[-11.27,7.23],[-11.17,7.31],[-11.09,7.4],[-11.0,7.46],[-10.88,7.54],[-10.69,7.74],[-10.65,7.76],[-10.62,7.9],[-10.57,8.07],[-10.52,8.13],[-10.39,8.16],[-10.36,8.19],[-10.31,8.31],[-10.29,8.45],[-10.28,8.49],[-10.23,8.49],[-10.15,8.52],[-10.1,8.51],[-10.08,8.46],[-10.06,8.43],[-9.8,8.52],[-9.78,8.54],[-9.77,8.53],[-9.74,8.45],[-9.72,8.46],[-9.7,8.48],[-9.68,8.48],[-9.66,8.47],[-9.64,8.44],[-9.61,8.4],[-9.55,8.38],[-9.52,8.35],[-9.52,8.26],[-9.51,8.18],[-9.48,8.16],[-9.47,8.11],[-9.46,8.05],[-9.45,8.02],[-9.44,7.97],[-9.45,7.91],[-9.44,7.87],[-9.39,7.79],[-9.37,7.7],[-9.37,7.64],[-9.38,7.57],[-9.41,7.51],[-9.46,7.44],[-9.46,7.42],[-9.44,7.4],[-9.39,7.39],[-9.36,7.41],[-9.26,7.38],[-9.22,7.33],[-9.17,7.28],[-9.13,7.25],[-9.12,7.22],[-9.05,7.23],[-8.98,7.26],[-8.96,7.27],[-8.94,7.27],[-8.89,7.26],[-8.86,7.32],[-8.83,7.39],[-8.77,7.47],[-8.74,7.5],[-8.73,7.54],[-8.73,7.61],[-8.71,7.66],[-8.66,7.69],[-8.61,7.69],[-8.58,7.68],[-8.56,7.63],[-8.52,7.59],[-8.49,7.56]]]},{"n":"Libya","r":[[[11.97,23.52],[11.87,23.69],[11.77,23.89],[11.62,24.14],[11.54,24.29],[11.51,24.31],[11.11,24.43],[10.69,24.55],[10.44,24.48],[10.4,24.49],[10.33,24.53],[10.26,24.59],[10.22,24.68],[10.12,24.79],[10.03,25.05],[10.02,25.26],[10.0,25.33],[9.78,25.62],[9.58,25.89],[9.45,26.07],[9.42,26.15],[9.44,26.25],[9.49,26.33],[9.68,26.44],[9.86,26.55],[9.88,26.63],[9.89,26.85],[9.84,26.92],[9.8,27.04],[9.75,27.22],[9.75,27.33],[9.83,27.55],[9.92,27.79],[9.86,28.04],[9.82,28.56],[9.84,28.97],[9.82,29.11],[9.81,29.18],[9.75,29.37],[9.67,29.57],[9.64,29.64],[9.55,29.8],[9.39,29.99],[9.31,30.12],[9.42,30.18],[9.52,30.23],[9.64,30.28],[9.81,30.34],[9.9,30.39],[9.93,30.43],[10.06,30.58],[10.13,30.67],[10.22,30.78],[10.26,30.86],[10.26,30.94],[10.24,31.03],[10.17,31.25],[10.11,31.46],[10.16,31.55],[10.2,31.59],[10.27,31.68],[10.31,31.7],[10.48,31.74],[10.54,31.8],[10.6,31.89],[10.61,31.93],[10.68,31.98],[10.77,32.02],[10.83,32.08],[11.01,32.17],[11.17,32.26],[11.36,32.35],[11.5,32.41],[11.54,32.47],[11.53,32.52],[11.45,32.64],[11.45,32.78],[11.46,32.9],[11.47,32.97],[11.5,33.16],[11.5,33.18],[11.66,33.12],[11.81,33.09],[12.28,32.86],[12.43,32.83],[12.75,32.8],[13.14,32.9],[13.28,32.91],[13.54,32.82],[13.65,32.8],[13.84,32.79],[14.16,32.71],[14.24,32.68],[14.42,32.55],[14.51,32.51],[15.18,32.39],[15.27,32.31],[15.36,32.16],[15.36,31.97],[15.41,31.83],[15.5,31.66],[15.6,31.53],[15.71,31.43],[15.83,31.36],[16.12,31.26],[16.45,31.23],[16.78,31.21],[17.35,31.08],[17.83,30.93],[17.95,30.85],[18.19,30.78],[18.67,30.42],[18.94,30.29],[19.12,30.27],[19.29,30.29],[19.59,30.41],[19.71,30.49],[20.01,30.8],[20.11,30.96],[20.15,31.08],[20.14,31.2],[20.1,31.3],[20.02,31.41],[19.96,31.56],[19.93,31.82],[19.97,32.0],[20.03,32.11],[20.12,32.22],[20.37,32.43],[20.62,32.58],[21.06,32.78],[21.32,32.78],[21.42,32.8],[21.64,32.94],[21.72,32.94],[21.84,32.91],[22.19,32.92],[22.34,32.88],[22.52,32.79],[22.75,32.74],[22.92,32.69],[23.09,32.62],[23.13,32.45],[23.11,32.4],[23.11,32.33],[23.29,32.21],[23.8,32.16],[23.9,32.13],[24.04,32.04],[24.13,32.01],[24.48,32.0],[24.68,32.02],[24.88,31.98],[24.95,31.95],[25.02,31.88],[25.12,31.71],[25.15,31.65],[25.11,31.63],[25.06,31.57],[25.02,31.51],[24.93,31.43],[24.85,31.33],[24.86,31.2],[24.88,31.06],[24.93,30.93],[24.97,30.78],[24.96,30.68],[24.92,30.56],[24.88,30.46],[24.73,30.25],[24.7,30.2],[24.71,30.13],[24.8,29.89],[24.81,29.81],[24.87,29.57],[24.92,29.38],[24.97,29.22],[24.98,29.18],[24.98,28.96],[24.98,28.73],[24.98,28.51],[24.98,28.28],[24.98,28.06],[24.98,27.83],[24.98,27.61],[24.98,27.39],[24.98,27.16],[24.98,26.94],[24.98,26.71],[24.98,26.49],[24.98,26.26],[24.98,26.04],[24.98,25.81],[24.98,25.59],[24.98,25.36],[24.98,25.14],[24.98,24.92],[24.98,24.69],[24.98,24.47],[24.98,24.24],[24.98,24.02],[24.98,23.79],[24.98,23.57],[24.98,23.34],[24.98,23.12],[24.98,22.89],[24.98,22.67],[24.98,22.44],[24.98,22.22],[24.98,22.0],[24.98,21.5],[24.98,21.0],[24.98,20.5],[24.98,20.0],[24.98,20.0],[24.97,20.0],[24.97,20.0],[24.97,20.0],[24.72,20.0],[24.47,20.0],[24.23,20.0],[23.98,20.0],[23.98,19.87],[23.98,19.75],[23.98,19.62],[23.98,19.5],[23.5,19.73],[23.02,19.97],[22.54,20.21],[22.06,20.44],[21.58,20.68],[21.11,20.92],[20.63,21.15],[20.15,21.39],[19.67,21.63],[19.19,21.86],[18.71,22.1],[18.23,22.34],[17.75,22.57],[17.27,22.81],[16.79,23.05],[16.32,23.28],[15.98,23.45],[15.63,23.29],[15.35,23.16],[14.98,23.0],[14.98,23.0],[14.56,22.78],[14.23,22.62],[14.22,22.62],[14.2,22.62],[13.86,22.9],[13.6,23.12],[13.48,23.18],[12.98,23.29],[12.49,23.4],[11.97,23.52]]]},{"n":"Saint Lucia","r":[[[-60.9,13.82],[-60.95,13.72],[-61.06,13.78],[-61.07,13.87],[-61.06,13.92],[-61.0,14.01],[-60.94,14.07],[-60.91,14.09],[-60.89,14.01],[-60.9,13.82]]]},{"n":"Liechtenstein","r":[[[9.53,47.27],[9.54,47.25],[9.54,47.23],[9.55,47.21],[9.56,47.19],[9.57,47.16],[9.6,47.13],[9.61,47.11],[9.6,47.08],[9.58,47.06],[9.5,47.06],[9.49,47.06],[9.48,47.1],[9.48,47.17],[9.53,47.27]]]},{"n":"Sri Lanka","r":[[[79.87,9.05],[79.9,8.98],[79.82,9.03],[79.77,9.07],[79.75,9.1],[79.86,9.07],[79.87,9.05]],[[79.97,9.63],[79.91,9.62],[79.86,9.69],[79.85,9.71],[79.86,9.73],[79.87,9.74],[79.89,9.74],[79.91,9.68],[79.97,9.63]],[[79.98,9.81],[80.08,9.81],[80.18,9.81],[80.25,9.8],[80.38,9.64],[80.71,9.37],[80.89,9.09],[80.91,9.02],[80.94,8.97],[80.98,8.96],[81.02,8.93],[81.2,8.66],[81.22,8.61],[81.22,8.55],[81.23,8.51],[81.27,8.48],[81.33,8.47],[81.37,8.43],[81.42,8.22],[81.42,8.15],[81.44,8.12],[81.67,7.78],[81.68,7.74],[81.68,7.71],[81.68,7.68],[81.73,7.62],[81.8,7.46],[81.83,7.43],[81.87,7.29],[81.88,7.02],[81.86,6.9],[81.82,6.76],[81.77,6.61],[81.71,6.51],[81.64,6.43],[81.38,6.24],[81.31,6.2],[80.97,6.09],[80.72,5.98],[80.5,5.95],[80.27,6.01],[80.1,6.15],[80.01,6.36],[79.95,6.58],[79.86,6.83],[79.79,7.59],[79.76,7.8],[79.71,8.07],[79.71,8.18],[79.75,8.29],[79.75,8.05],[79.78,8.02],[79.81,8.05],[79.83,8.3],[79.85,8.41],[79.94,8.69],[79.94,8.74],[79.93,8.85],[79.93,8.9],[80.06,9.1],[80.1,9.21],[80.12,9.33],[80.11,9.45],[80.09,9.58],[80.2,9.54],[80.26,9.49],[80.32,9.47],[80.37,9.48],[80.43,9.48],[80.39,9.55],[80.26,9.61],[80.05,9.65],[79.98,9.7],[79.95,9.74],[79.97,9.79],[79.98,9.81]]]},{"n":"Lesotho","r":[[[27.21,-29.55],[27.29,-29.52],[27.36,-29.46],[27.42,-29.36],[27.46,-29.3],[27.49,-29.28],[27.53,-29.24],[27.59,-29.15],[27.66,-29.05],[27.74,-28.94],[27.83,-28.91],[27.96,-28.87],[28.08,-28.78],[28.23,-28.7],[28.47,-28.62],[28.58,-28.59],[28.63,-28.58],[28.65,-28.6],[28.68,-28.65],[28.72,-28.69],[28.82,-28.76],[28.86,-28.78],[28.95,-28.88],[29.06,-28.95],[29.18,-29.04],[29.26,-29.08],[29.3,-29.09],[29.34,-29.16],[29.37,-29.22],[29.39,-29.27],[29.39,-29.32],[29.35,-29.44],[29.29,-29.57],[29.25,-29.62],[29.2,-29.65],[29.14,-29.7],[29.12,-29.8],[29.1,-29.92],[29.03,-29.97],[28.98,-30.0],[28.9,-30.04],[28.74,-30.1],[28.65,-30.13],[28.63,-30.13],[28.58,-30.12],[28.5,-30.13],[28.44,-30.14],[28.39,-30.15],[28.32,-30.22],[28.18,-30.41],[28.14,-30.45],[28.13,-30.53],[28.1,-30.58],[28.06,-30.63],[28.02,-30.64],[27.9,-30.62],[27.75,-30.6],[27.67,-30.54],[27.59,-30.47],[27.55,-30.41],[27.51,-30.38],[27.49,-30.36],[27.43,-30.34],[27.41,-30.33],[27.39,-30.32],[27.36,-30.28],[27.35,-30.25],[27.36,-30.16],[27.31,-30.11],[27.24,-30.02],[27.19,-29.94],[27.13,-29.84],[27.09,-29.75],[27.05,-29.66],[27.06,-29.63],[27.1,-29.6],[27.21,-29.55]]]},{"n":"Lithuania","r":[[[26.59,55.67],[26.59,55.62],[26.57,55.55],[26.52,55.45],[26.47,55.37],[26.46,55.34],[26.5,55.32],[26.68,55.31],[26.76,55.29],[26.78,55.27],[26.73,55.25],[26.68,55.22],[26.65,55.2],[26.6,55.13],[26.29,55.14],[26.25,55.12],[26.23,55.09],[26.22,55.05],[26.18,55.0],[26.09,54.96],[25.96,54.95],[25.86,54.92],[25.78,54.83],[25.72,54.72],[25.72,54.64],[25.73,54.59],[25.72,54.56],[25.69,54.54],[25.62,54.46],[25.57,54.38],[25.55,54.33],[25.56,54.31],[25.62,54.31],[25.7,54.29],[25.75,54.26],[25.77,54.22],[25.77,54.18],[25.75,54.16],[25.68,54.14],[25.57,54.14],[25.51,54.16],[25.5,54.18],[25.53,54.22],[25.51,54.26],[25.46,54.29],[25.37,54.25],[25.28,54.25],[25.18,54.21],[25.11,54.15],[25.05,54.13],[24.87,54.15],[24.83,54.12],[24.79,54.0],[24.77,53.97],[24.62,53.98],[24.48,53.93],[24.32,53.89],[24.24,53.92],[24.19,53.95],[24.1,53.95],[24.01,53.93],[23.94,53.94],[23.87,53.94],[23.73,53.91],[23.56,53.92],[23.48,53.94],[23.48,53.96],[23.48,54.01],[23.48,54.08],[23.45,54.14],[23.37,54.2],[23.28,54.24],[23.17,54.28],[23.09,54.3],[23.04,54.3],[23.03,54.33],[23.02,54.35],[22.98,54.37],[22.89,54.39],[22.82,54.4],[22.77,54.36],[22.72,54.41],[22.68,54.49],[22.68,54.56],[22.71,54.63],[22.83,54.84],[22.82,54.87],[22.74,54.93],[22.63,54.97],[22.57,55.06],[22.35,55.06],[22.14,55.06],[22.07,55.06],[21.87,55.1],[21.68,55.16],[21.55,55.2],[21.45,55.23],[21.39,55.28],[21.3,55.26],[21.24,55.26],[21.24,55.27],[21.2,55.34],[21.24,55.46],[21.17,55.62],[21.06,55.81],[21.05,56.02],[21.05,56.07],[21.31,56.19],[21.65,56.31],[21.73,56.33],[22.04,56.4],[22.08,56.41],[22.37,56.39],[22.59,56.38],[22.77,56.38],[22.88,56.4],[22.97,56.38],[23.04,56.32],[23.12,56.33],[23.2,56.37],[23.61,56.33],[23.71,56.33],[23.81,56.33],[24.01,56.3],[24.12,56.26],[24.37,56.28],[24.47,56.28],[24.53,56.3],[24.7,56.38],[24.77,56.4],[24.84,56.41],[24.9,56.4],[24.94,56.33],[25.07,56.2],[25.21,56.18],[25.59,56.13],[25.66,56.1],[25.88,55.99],[26.0,55.94],[26.09,55.9],[26.21,55.81],[26.28,55.75],[26.4,55.7],[26.54,55.67],[26.59,55.67]],[[20.96,55.28],[20.9,55.29],[21.01,55.4],[21.06,55.48],[21.09,55.58],[21.11,55.62],[21.12,55.57],[21.1,55.49],[21.03,55.35],[20.96,55.28]]]},{"n":"Luxembourg","r":[[[5.79,49.54],[5.82,49.55],[5.84,49.58],[5.86,49.61],[5.88,49.64],[5.8,49.73],[5.79,49.76],[5.72,49.81],[5.73,49.83],[5.74,49.86],[5.74,49.88],[5.74,49.92],[5.79,49.96],[5.82,50.01],[5.87,50.08],[5.98,50.17],[6.05,50.15],[6.09,50.15],[6.11,50.12],[6.12,50.12],[6.11,50.09],[6.11,50.03],[6.14,49.97],[6.2,49.92],[6.26,49.87],[6.32,49.84],[6.44,49.81],[6.49,49.8],[6.49,49.75],[6.48,49.71],[6.44,49.68],[6.41,49.64],[6.38,49.6],[6.35,49.51],[6.34,49.45],[6.28,49.48],[6.24,49.49],[6.18,49.5],[6.12,49.49],[6.07,49.45],[6.01,49.45],[5.96,49.45],[5.93,49.48],[5.9,49.49],[5.82,49.51],[5.79,49.54]]]},{"n":"Latvia","r":[[[28.15,56.14],[28.12,56.15],[28.03,56.13],[27.9,56.08],[27.69,55.94],[27.64,55.91],[27.59,55.81],[27.58,55.8],[27.46,55.8],[27.43,55.81],[27.31,55.8],[27.05,55.83],[26.95,55.81],[26.82,55.71],[26.77,55.69],[26.62,55.68],[26.59,55.67],[26.54,55.67],[26.4,55.7],[26.28,55.75],[26.21,55.81],[26.09,55.9],[26.0,55.94],[25.88,55.99],[25.66,56.1],[25.59,56.13],[25.21,56.18],[25.07,56.2],[24.94,56.33],[24.9,56.4],[24.84,56.41],[24.77,56.4],[24.7,56.38],[24.53,56.3],[24.47,56.28],[24.37,56.28],[24.12,56.26],[24.01,56.3],[23.81,56.33],[23.71,56.33],[23.61,56.33],[23.2,56.37],[23.12,56.33],[23.04,56.32],[22.97,56.38],[22.88,56.4],[22.77,56.38],[22.59,56.38],[22.37,56.39],[22.08,56.41],[22.04,56.4],[21.73,56.33],[21.65,56.31],[21.31,56.19],[21.05,56.07],[21.01,56.26],[21.03,56.64],[21.07,56.82],[21.26,56.93],[21.35,57.02],[21.41,57.13],[21.42,57.24],[21.46,57.32],[21.73,57.57],[21.94,57.6],[22.23,57.67],[22.55,57.72],[22.62,57.65],[22.65,57.6],[23.04,57.39],[23.14,57.32],[23.29,57.09],[23.65,56.97],[23.93,57.01],[24.05,57.07],[24.28,57.17],[24.38,57.25],[24.4,57.32],[24.36,57.65],[24.3,57.78],[24.32,57.87],[24.36,57.87],[24.46,57.91],[24.78,57.99],[24.84,57.99],[24.91,58.0],[25.11,58.06],[25.18,58.03],[25.23,58.0],[25.26,58.0],[25.27,58.01],[25.27,58.03],[25.28,58.05],[25.34,58.04],[25.57,57.94],[25.66,57.92],[25.72,57.91],[25.79,57.87],[25.99,57.84],[26.02,57.81],[26.03,57.79],[26.22,57.66],[26.3,57.6],[26.46,57.54],[26.53,57.53],[26.82,57.59],[26.9,57.61],[26.97,57.61],[27.03,57.58],[27.19,57.54],[27.33,57.53],[27.35,57.53],[27.47,57.52],[27.51,57.51],[27.54,57.43],[27.67,57.37],[27.8,57.32],[27.83,57.29],[27.84,57.25],[27.83,57.19],[27.81,57.17],[27.76,57.14],[27.72,57.05],[27.71,56.98],[27.64,56.85],[27.66,56.84],[27.81,56.87],[27.85,56.85],[27.88,56.82],[27.89,56.74],[27.94,56.7],[27.99,56.65],[28.01,56.6],[28.1,56.55],[28.11,56.51],[28.17,56.39],[28.19,56.32],[28.2,56.26],[28.17,56.19],[28.15,56.14]]]},{"n":"Macao S.A.R","r":[[[113.48,22.2],[113.48,22.22],[113.49,22.24],[113.53,22.25],[113.55,22.22],[113.55,22.22],[113.5,22.2],[113.48,22.2],[113.48,22.2]]]},{"n":"Saint Martin","r":[[[-63.01,18.07],[-63.12,18.07],[-63.11,18.09],[-63.06,18.12],[-63.02,18.11],[-63.01,18.1],[-63.01,18.07]]]},{"n":"Morocco","r":[[[-2.22,35.1],[-2.19,35.03],[-2.13,34.97],[-1.92,34.84],[-1.8,34.75],[-1.79,34.72],[-1.83,34.65],[-1.85,34.61],[-1.82,34.56],[-1.74,34.5],[-1.73,34.47],[-1.75,34.43],[-1.79,34.37],[-1.71,34.18],[-1.69,33.99],[-1.71,33.86],[-1.71,33.78],[-1.7,33.72],[-1.63,33.57],[-1.68,33.32],[-1.63,33.18],[-1.55,33.07],[-1.51,32.88],[-1.45,32.78],[-1.35,32.7],[-1.3,32.68],[-1.19,32.61],[-1.11,32.55],[-1.07,32.47],[-1.16,32.4],[-1.24,32.34],[-1.26,32.27],[-1.23,32.16],[-1.23,32.11],[-1.28,32.09],[-1.48,32.09],[-1.64,32.1],[-1.82,32.1],[-2.07,32.12],[-2.23,32.12],[-2.45,32.13],[-2.52,32.13],[-2.72,32.1],[-2.86,32.07],[-2.89,32.07],[-2.93,32.04],[-2.96,31.96],[-2.99,31.87],[-3.02,31.83],[-3.44,31.7],[-3.6,31.69],[-3.7,31.7],[-3.77,31.69],[-3.83,31.66],[-3.85,31.62],[-3.85,31.57],[-3.84,31.51],[-3.8,31.44],[-3.79,31.36],[-3.82,31.31],[-3.82,31.26],[-3.83,31.2],[-3.81,31.17],[-3.77,31.16],[-3.73,31.14],[-3.67,31.11],[-3.62,31.07],[-3.63,31.0],[-3.67,30.96],[-3.7,30.94],[-3.86,30.93],[-3.99,30.91],[-4.15,30.81],[-4.32,30.7],[-4.53,30.63],[-4.62,30.6],[-4.78,30.55],[-4.97,30.47],[-5.06,30.33],[-5.18,30.17],[-5.29,30.06],[-5.45,29.96],[-5.59,29.92],[-5.78,29.87],[-6.0,29.83],[-6.17,29.82],[-6.21,29.81],[-6.36,29.81],[-6.43,29.82],[-6.48,29.82],[-6.5,29.81],[-6.51,29.78],[-6.51,29.73],[-6.52,29.66],[-6.57,29.6],[-6.6,29.58],[-6.64,29.57],[-6.76,29.58],[-6.86,29.6],[-7.09,29.63],[-7.14,29.62],[-7.16,29.61],[-7.23,29.57],[-7.35,29.49],[-7.43,29.42],[-7.49,29.39],[-7.62,29.38],[-7.69,29.35],[-7.94,29.17],[-8.0,29.13],[-8.27,28.98],[-8.34,28.93],[-8.4,28.88],[-8.56,28.77],[-8.66,28.72],[-8.68,28.69],[-8.68,28.62],[-8.68,28.47],[-8.68,28.32],[-8.68,28.11],[-8.68,27.9],[-8.68,27.66],[-8.82,27.66],[-8.82,27.66],[-8.81,27.61],[-8.78,27.53],[-8.77,27.46],[-8.79,27.42],[-8.8,27.36],[-8.8,27.31],[-8.77,27.25],[-8.75,27.19],[-8.75,27.15],[-8.79,27.12],[-8.89,27.1],[-9.0,27.09],[-9.08,27.09],[-9.21,27.1],[-9.29,27.1],[-9.35,27.1],[-9.41,27.09],[-9.49,27.05],[-9.57,26.99],[-9.67,26.91],[-9.74,26.86],[-9.82,26.85],[-9.9,26.85],[-9.98,26.89],[-10.03,26.91],[-10.07,26.91],[-10.12,26.88],[-10.19,26.86],[-10.25,26.86],[-10.35,26.9],[-10.48,26.96],[-10.55,26.99],[-10.65,27.0],[-10.76,27.02],[-10.83,27.01],[-10.92,27.01],[-11.05,26.97],[-11.15,26.94],[-11.26,26.91],[-11.39,26.88],[-11.36,26.79],[-11.32,26.74],[-11.32,26.68],[-11.34,26.63],[-11.4,26.58],[-11.47,26.52],[-11.51,26.47],[-11.55,26.4],[-11.58,26.36],[-11.64,26.3],[-11.68,26.21],[-11.7,26.16],[-11.72,26.1],[-11.75,26.09],[-11.88,26.07],[-11.96,26.05],[-12.03,26.03],[-12.06,26.0],[-12.06,25.99],[-12.08,25.92],[-12.08,25.87],[-12.1,25.83],[-12.13,25.73],[-12.17,25.64],[-12.2,25.52],[-12.23,25.42],[-12.27,25.26],[-12.31,25.11],[-12.36,24.97],[-12.4,24.88],[-12.43,24.83],[-12.5,24.77],[-12.56,24.73],[-12.63,24.68],[-12.71,24.63],[-12.82,24.57],[-12.91,24.52],[-12.95,24.5],[-12.99,24.47],[-13.06,24.4],[-13.12,24.3],[-13.16,24.22],[-13.23,24.09],[-13.28,24.02],[-13.31,23.98],[-13.39,23.94],[-13.48,23.91],[-13.58,23.87],[-13.66,23.83],[-13.77,23.79],[-13.84,23.75],[-13.89,23.69],[-13.93,23.62],[-13.98,23.52],[-14.02,23.41],[-14.04,23.34],[-14.1,23.1],[-14.12,22.96],[-14.14,22.87],[-14.17,22.76],[-14.19,22.59],[-14.19,22.45],[-14.21,22.37],[-14.22,22.31],[-14.27,22.24],[-14.31,22.19],[-14.38,22.12],[-14.44,22.08],[-14.46,22.04],[-14.52,21.99],[-14.58,21.91],[-14.63,21.86],[-14.62,21.82],[-14.61,21.75],[-14.64,21.68],[-14.67,21.6],[-14.75,21.5],[-14.84,21.45],[-14.97,21.44],[-15.15,21.44],[-15.29,21.45],[-15.46,21.45],[-15.61,21.47],[-15.75,21.49],[-15.92,21.5],[-16.04,21.5],[-16.19,21.48],[-16.58,21.48],[-16.73,21.47],[-16.95,21.43],[-17.0,21.42],[-17.0,21.42],[-16.93,21.9],[-16.79,22.16],[-16.68,22.27],[-16.51,22.33],[-16.36,22.59],[-16.3,22.83],[-16.2,22.95],[-16.17,23.03],[-16.21,23.1],[-16.11,23.23],[-16.0,23.43],[-15.94,23.55],[-15.81,23.75],[-15.79,23.79],[-15.8,23.84],[-15.86,23.8],[-15.91,23.73],[-15.98,23.67],[-15.95,23.74],[-15.9,23.84],[-15.78,23.95],[-15.59,24.07],[-15.19,24.48],[-15.04,24.55],[-14.9,24.72],[-14.86,24.87],[-14.84,25.22],[-14.79,25.4],[-14.71,25.55],[-14.6,25.81],[-14.52,25.93],[-14.47,26.16],[-14.41,26.25],[-14.31,26.3],[-14.17,26.42],[-13.95,26.49],[-13.7,26.64],[-13.58,26.74],[-13.5,26.87],[-13.41,27.15],[-13.26,27.43],[-13.18,27.65],[-13.18,27.66],[-13.04,27.77],[-12.95,27.91],[-12.79,27.98],[-12.47,28.01],[-11.99,28.13],[-11.55,28.31],[-11.43,28.38],[-11.3,28.53],[-11.08,28.71],[-10.67,28.94],[-10.49,29.06],[-10.2,29.38],[-10.01,29.64],[-9.85,29.81],[-9.74,29.96],[-9.67,30.11],[-9.62,30.35],[-9.65,30.45],[-9.77,30.6],[-9.85,30.64],[-9.88,30.72],[-9.83,30.85],[-9.83,31.07],[-9.81,31.42],[-9.67,31.71],[-9.35,32.09],[-9.29,32.24],[-9.25,32.49],[-9.25,32.57],[-8.84,32.92],[-8.6,33.19],[-8.51,33.25],[-8.3,33.37],[-7.56,33.64],[-7.14,33.83],[-6.9,33.97],[-6.76,34.13],[-6.35,34.78],[-5.96,35.68],[-5.92,35.79],[-5.75,35.82],[-5.62,35.83],[-5.52,35.86],[-5.4,35.93],[-5.28,35.9],[-5.34,35.86],[-5.34,35.75],[-5.25,35.61],[-5.11,35.47],[-4.84,35.28],[-4.63,35.21],[-4.33,35.16],[-3.98,35.24],[-3.79,35.24],[-3.69,35.28],[-3.59,35.23],[-3.39,35.21],[-3.21,35.24],[-3.06,35.32],[-2.97,35.41],[-2.96,35.36],[-2.95,35.32],[-2.93,35.29],[-2.87,35.17],[-2.84,35.13],[-2.73,35.14],[-2.64,35.11],[-2.42,35.12],[-2.22,35.1]]]},{"n":"Monaco","r":[[[7.38,43.73],[7.38,43.75],[7.4,43.77],[7.41,43.77],[7.44,43.76],[7.44,43.75],[7.38,43.73]]]},{"n":"Moldova","r":[[[28.21,45.45],[28.16,45.51],[28.11,45.57],[28.07,45.6],[28.09,45.61],[28.13,45.63],[28.16,45.65],[28.16,45.71],[28.13,45.79],[28.12,45.83],[28.11,45.88],[28.1,45.97],[28.12,46.14],[28.2,46.35],[28.24,46.45],[28.22,46.51],[28.24,46.64],[28.2,46.71],[28.15,46.79],[28.07,46.98],[27.97,47.04],[27.85,47.11],[27.8,47.17],[27.77,47.23],[27.7,47.29],[27.61,47.34],[27.52,47.48],[27.46,47.54],[27.45,47.55],[27.34,47.64],[27.28,47.72],[27.25,47.78],[27.23,47.84],[27.15,47.96],[27.08,48.05],[27.01,48.11],[26.98,48.16],[26.9,48.21],[26.79,48.26],[26.71,48.26],[26.62,48.26],[26.64,48.29],[26.85,48.39],[26.9,48.37],[27.01,48.37],[27.23,48.37],[27.34,48.43],[27.4,48.42],[27.46,48.44],[27.55,48.48],[27.56,48.47],[27.57,48.46],[27.71,48.45],[27.82,48.42],[27.89,48.37],[27.96,48.33],[28.04,48.32],[28.08,48.3],[28.09,48.26],[28.16,48.24],[28.29,48.24],[28.35,48.21],[28.33,48.16],[28.34,48.14],[28.39,48.16],[28.42,48.15],[28.44,48.11],[28.46,48.09],[28.53,48.15],[28.6,48.14],[28.77,48.12],[28.87,48.0],[28.92,47.95],[28.97,47.93],[29.04,47.95],[29.09,47.98],[29.13,47.96],[29.19,47.88],[29.21,47.78],[29.21,47.73],[29.19,47.66],[29.15,47.58],[29.12,47.53],[29.13,47.49],[29.16,47.46],[29.2,47.44],[29.33,47.38],[29.38,47.33],[29.46,47.29],[29.51,47.29],[29.54,47.27],[29.55,47.25],[29.54,47.19],[29.51,47.13],[29.52,47.09],[29.56,47.05],[29.57,47.0],[29.57,46.96],[29.6,46.94],[29.72,46.88],[29.88,46.83],[29.92,46.78],[29.94,46.72],[29.93,46.62],[29.92,46.54],[30.13,46.42],[30.11,46.4],[30.08,46.38],[29.88,46.36],[29.84,46.35],[29.75,46.44],[29.71,46.45],[29.66,46.42],[29.61,46.4],[29.56,46.41],[29.49,46.43],[29.46,46.45],[29.43,46.46],[29.39,46.44],[29.34,46.45],[29.3,46.47],[29.25,46.39],[29.22,46.38],[29.2,46.38],[29.2,46.5],[29.19,46.52],[29.15,46.53],[29.05,46.5],[28.96,46.46],[28.93,46.42],[28.93,46.36],[28.94,46.29],[29.01,46.18],[28.97,46.13],[28.95,46.05],[28.85,45.98],[28.74,45.94],[28.73,45.85],[28.67,45.79],[28.56,45.74],[28.49,45.67],[28.51,45.62],[28.51,45.57],[28.5,45.54],[28.5,45.52],[28.47,45.51],[28.31,45.5],[28.26,45.48],[28.21,45.45]]]},{"n":"Madagascar","r":[[[49.94,-16.9],[49.82,-17.09],[49.86,-16.93],[49.99,-16.71],[50.02,-16.7],[49.94,-16.9]],[[48.34,-13.36],[48.34,-13.4],[48.21,-13.39],[48.19,-13.26],[48.26,-13.26],[48.27,-13.2],[48.31,-13.2],[48.35,-13.31],[48.34,-13.36]],[[49.54,-12.43],[49.58,-12.54],[49.64,-12.64],[49.8,-12.88],[49.88,-12.97],[49.94,-13.07],[49.97,-13.27],[50.07,-13.58],[50.17,-14.04],[50.2,-14.51],[50.24,-14.73],[50.31,-14.94],[50.44,-15.15],[50.48,-15.39],[50.4,-15.63],[50.29,-15.86],[50.26,-15.9],[50.21,-15.96],[50.18,-15.96],[50.09,-15.9],[50.02,-15.8],[49.93,-15.57],[49.89,-15.46],[49.85,-15.44],[49.74,-15.45],[49.66,-15.52],[49.65,-15.57],[49.67,-15.7],[49.7,-15.81],[49.71,-15.93],[49.71,-16.08],[49.74,-16.12],[49.79,-16.16],[49.83,-16.26],[49.84,-16.49],[49.81,-16.6],[49.73,-16.7],[49.74,-16.76],[49.77,-16.82],[49.74,-16.85],[49.64,-16.89],[49.6,-16.93],[49.54,-17.03],[49.45,-17.24],[49.44,-17.35],[49.49,-17.67],[49.48,-17.9],[49.36,-18.34],[49.3,-18.54],[49.2,-18.79],[49.06,-19.12],[48.92,-19.53],[48.8,-19.95],[48.71,-20.21],[48.61,-20.46],[48.47,-20.9],[48.35,-21.35],[48.18,-21.84],[47.93,-22.39],[47.91,-22.47],[47.86,-22.75],[47.8,-22.99],[47.74,-23.23],[47.6,-23.63],[47.59,-23.76],[47.56,-23.87],[47.43,-24.13],[47.37,-24.22],[47.33,-24.32],[47.31,-24.44],[47.27,-24.56],[47.18,-24.79],[47.03,-24.98],[46.94,-25.05],[46.73,-25.15],[46.62,-25.17],[46.39,-25.17],[46.16,-25.23],[45.92,-25.34],[45.69,-25.47],[45.6,-25.53],[45.51,-25.56],[45.21,-25.57],[45.12,-25.54],[44.81,-25.33],[44.7,-25.3],[44.47,-25.27],[44.41,-25.25],[44.35,-25.23],[44.26,-25.12],[44.08,-25.02],[44.04,-25.0],[44.01,-24.93],[43.99,-24.86],[43.94,-24.79],[43.91,-24.64],[43.85,-24.54],[43.69,-24.36],[43.67,-24.3],[43.66,-24.11],[43.66,-23.98],[43.65,-23.74],[43.66,-23.63],[43.72,-23.53],[43.7,-23.42],[43.64,-23.31],[43.61,-23.19],[43.57,-23.08],[43.4,-22.89],[43.36,-22.79],[43.33,-22.69],[43.26,-22.38],[43.26,-22.28],[43.27,-22.05],[43.29,-21.93],[43.33,-21.85],[43.34,-21.79],[43.37,-21.74],[43.41,-21.7],[43.44,-21.65],[43.5,-21.36],[43.58,-21.29],[43.7,-21.25],[43.8,-21.18],[43.86,-21.08],[43.91,-20.87],[44.06,-20.66],[44.12,-20.55],[44.24,-20.38],[44.35,-20.15],[44.38,-20.04],[44.4,-19.92],[44.43,-19.67],[44.45,-19.55],[44.45,-19.43],[44.39,-19.3],[44.24,-19.08],[44.23,-19.03],[44.25,-18.86],[44.23,-18.74],[44.18,-18.62],[44.11,-18.5],[44.04,-18.29],[44.01,-17.93],[44.01,-17.8],[43.99,-17.69],[43.94,-17.58],[43.98,-17.39],[44.42,-16.7],[44.44,-16.62],[44.42,-16.41],[44.43,-16.29],[44.44,-16.24],[44.48,-16.22],[44.55,-16.2],[44.91,-16.17],[44.96,-16.15],[45.04,-16.1],[45.17,-15.98],[45.22,-15.95],[45.27,-15.96],[45.3,-16.01],[45.34,-16.04],[45.49,-15.99],[45.54,-15.98],[45.6,-15.99],[45.62,-15.95],[45.64,-15.88],[45.66,-15.84],[45.7,-15.81],[45.89,-15.8],[46.0,-15.78],[46.16,-15.74],[46.19,-15.75],[46.31,-15.9],[46.35,-15.92],[46.4,-15.92],[46.44,-15.9],[46.34,-15.81],[46.33,-15.77],[46.33,-15.71],[46.39,-15.6],[46.48,-15.51],[46.67,-15.38],[46.88,-15.23],[46.94,-15.22],[46.99,-15.24],[47.03,-15.42],[47.03,-15.45],[47.06,-15.46],[47.1,-15.43],[47.13,-15.36],[47.14,-15.3],[47.11,-15.24],[47.09,-15.2],[47.09,-15.15],[47.2,-15.04],[47.28,-14.94],[47.32,-14.82],[47.35,-14.77],[47.44,-14.7],[47.46,-14.71],[47.49,-14.76],[47.5,-14.82],[47.47,-14.87],[47.44,-14.92],[47.43,-15.0],[47.48,-15.01],[47.52,-14.99],[47.59,-14.86],[47.67,-14.74],[47.72,-14.68],[47.77,-14.64],[47.87,-14.65],[47.96,-14.67],[47.81,-14.54],[47.77,-14.37],[47.96,-14.07],[47.96,-14.0],[47.98,-13.98],[48.0,-13.96],[47.9,-13.86],[47.88,-13.81],[47.9,-13.73],[47.94,-13.66],[47.98,-13.61],[48.04,-13.6],[48.09,-13.62],[48.19,-13.71],[48.26,-13.72],[48.34,-13.64],[48.41,-13.54],[48.51,-13.47],[48.62,-13.43],[48.8,-13.27],[48.91,-12.94],[48.92,-12.84],[48.89,-12.72],[48.85,-12.61],[48.79,-12.47],[48.8,-12.44],[48.9,-12.46],[48.93,-12.44],[49.04,-12.32],[49.21,-12.08],[49.26,-12.08],[49.31,-12.12],[49.33,-12.19],[49.36,-12.24],[49.48,-12.35],[49.54,-12.43]]]},{"n":"Maldives","r":[[[73.42,3.23],[73.4,3.23],[73.38,3.25],[73.38,3.27],[73.4,3.29],[73.43,3.29],[73.44,3.27],[73.43,3.25],[73.42,3.23]],[[73.51,4.16],[73.49,4.16],[73.48,4.16],[73.47,4.17],[73.48,4.19],[73.49,4.21],[73.5,4.23],[73.52,4.25],[73.53,4.24],[73.53,4.23],[73.52,4.21],[73.52,4.19],[73.51,4.16]]]},{"n":"Mexico","r":[[[-88.3,18.47],[-88.37,18.48],[-88.46,18.48],[-88.52,18.45],[-88.59,18.29],[-88.74,18.07],[-88.81,17.97],[-88.86,17.93],[-88.9,17.91],[-88.94,17.94],[-89.05,18.0],[-89.13,17.97],[-89.16,17.9],[-89.16,17.81],[-89.37,17.81],[-89.73,17.82],[-90.18,17.82],[-90.62,17.82],[-90.99,17.82],[-90.99,17.62],[-90.99,17.45],[-90.99,17.25],[-91.2,17.25],[-91.41,17.26],[-91.39,17.24],[-91.32,17.2],[-91.22,17.11],[-91.11,16.98],[-90.98,16.87],[-90.82,16.79],[-90.71,16.71],[-90.66,16.63],[-90.63,16.57],[-90.63,16.51],[-90.58,16.47],[-90.47,16.44],[-90.42,16.39],[-90.42,16.35],[-90.45,16.26],[-90.46,16.16],[-90.45,16.07],[-90.52,16.07],[-90.7,16.07],[-90.98,16.07],[-91.23,16.07],[-91.43,16.07],[-91.74,16.07],[-91.82,15.93],[-91.96,15.7],[-92.08,15.5],[-92.19,15.32],[-92.2,15.28],[-92.2,15.24],[-92.07,15.07],[-92.1,15.03],[-92.14,15.0],[-92.16,14.96],[-92.16,14.9],[-92.19,14.82],[-92.18,14.76],[-92.16,14.69],[-92.19,14.63],[-92.21,14.57],[-92.24,14.55],[-92.26,14.57],[-92.53,14.84],[-92.81,15.14],[-92.92,15.24],[-93.02,15.31],[-93.17,15.45],[-93.54,15.75],[-93.73,15.89],[-93.92,16.05],[-94.08,16.15],[-94.24,16.21],[-94.31,16.24],[-94.37,16.28],[-94.41,16.29],[-94.43,16.23],[-94.37,16.2],[-94.3,16.17],[-94.25,16.17],[-94.19,16.15],[-94.03,16.06],[-94.0,16.02],[-94.47,16.19],[-94.66,16.2],[-94.68,16.23],[-94.59,16.32],[-94.62,16.35],[-94.65,16.35],[-94.75,16.29],[-94.79,16.29],[-94.8,16.33],[-94.79,16.36],[-94.86,16.42],[-94.9,16.42],[-94.93,16.38],[-95.02,16.31],[-95.02,16.28],[-94.85,16.25],[-94.79,16.23],[-94.8,16.21],[-94.95,16.21],[-95.13,16.18],[-95.46,15.97],[-95.77,15.89],[-96.21,15.69],[-96.41,15.68],[-96.51,15.65],[-96.81,15.73],[-97.18,15.91],[-97.75,15.97],[-98.14,16.21],[-98.52,16.3],[-98.76,16.53],[-98.91,16.54],[-99.0,16.58],[-99.35,16.66],[-99.69,16.72],[-100.02,16.92],[-100.24,16.98],[-100.43,17.06],[-100.85,17.2],[-101.0,17.28],[-101.15,17.39],[-101.39,17.51],[-101.49,17.62],[-101.6,17.65],[-101.76,17.84],[-101.85,17.92],[-101.92,17.96],[-102.0,17.97],[-102.22,17.96],[-102.55,18.04],[-102.7,18.06],[-103.02,18.19],[-103.44,18.33],[-103.58,18.48],[-103.7,18.63],[-103.91,18.83],[-104.05,18.91],[-104.28,19.01],[-104.41,19.09],[-104.6,19.15],[-104.94,19.31],[-105.05,19.44],[-105.11,19.56],[-105.29,19.71],[-105.48,19.98],[-105.53,20.08],[-105.57,20.23],[-105.62,20.32],[-105.67,20.39],[-105.64,20.44],[-105.54,20.5],[-105.38,20.51],[-105.26,20.58],[-105.24,20.63],[-105.25,20.67],[-105.33,20.75],[-105.42,20.78],[-105.49,20.78],[-105.51,20.81],[-105.46,20.84],[-105.39,20.93],[-105.3,21.03],[-105.24,21.12],[-105.22,21.25],[-105.23,21.38],[-105.21,21.49],[-105.43,21.62],[-105.46,21.67],[-105.53,21.82],[-105.65,21.99],[-105.65,22.33],[-105.79,22.63],[-105.94,22.78],[-106.02,22.83],[-106.23,23.06],[-106.4,23.2],[-106.57,23.45],[-106.73,23.61],[-106.94,23.88],[-107.08,24.02],[-107.76,24.47],[-107.73,24.47],[-107.53,24.36],[-107.49,24.37],[-107.49,24.42],[-107.51,24.49],[-107.55,24.5],[-107.6,24.49],[-107.67,24.5],[-107.71,24.53],[-107.82,24.54],[-107.95,24.61],[-108.01,24.69],[-108.02,24.78],[-108.21,24.97],[-108.28,25.08],[-108.24,25.07],[-108.19,25.03],[-108.14,25.02],[-108.08,25.02],[-108.04,25.04],[-108.05,25.07],[-108.09,25.09],[-108.37,25.19],[-108.47,25.27],[-108.7,25.38],[-108.75,25.42],[-108.79,25.54],[-108.84,25.54],[-108.89,25.51],[-109.03,25.48],[-109.06,25.52],[-109.07,25.55],[-108.97,25.59],[-108.88,25.7],[-108.89,25.73],[-108.94,25.69],[-109.01,25.64],[-109.08,25.62],[-109.2,25.59],[-109.25,25.61],[-109.3,25.63],[-109.38,25.73],[-109.43,26.03],[-109.35,26.14],[-109.27,26.24],[-109.2,26.31],[-109.16,26.26],[-109.12,26.25],[-109.15,26.31],[-109.22,26.36],[-109.24,26.4],[-109.24,26.45],[-109.28,26.53],[-109.48,26.71],[-109.68,26.7],[-109.75,26.7],[-109.83,26.77],[-109.89,26.88],[-109.92,26.98],[-109.93,27.03],[-109.94,27.08],[-110.28,27.16],[-110.38,27.23],[-110.48,27.32],[-110.52,27.4],[-110.56,27.45],[-110.59,27.54],[-110.62,27.65],[-110.58,27.8],[-110.53,27.86],[-110.76,27.92],[-110.85,27.92],[-110.92,27.89],[-110.99,27.93],[-111.12,27.97],[-111.28,28.12],[-111.47,28.38],[-111.68,28.47],[-111.75,28.56],[-111.83,28.65],[-111.91,28.75],[-111.92,28.8],[-111.94,28.82],[-112.04,28.9],[-112.16,29.02],[-112.19,29.12],[-112.22,29.27],[-112.3,29.32],[-112.38,29.35],[-112.39,29.42],[-112.39,29.46],[-112.41,29.54],[-112.57,29.72],[-112.65,29.87],[-112.7,29.92],[-112.74,29.99],[-112.76,30.13],[-112.82,30.3],[-112.95,30.51],[-113.06,30.65],[-113.11,30.79],[-113.09,30.94],[-113.1,31.03],[-113.12,31.05],[-113.11,31.08],[-113.07,31.06],[-113.04,31.09],[-113.05,31.18],[-113.08,31.21],[-113.19,31.24],[-113.23,31.26],[-113.48,31.29],[-113.62,31.35],[-113.63,31.47],[-113.7,31.52],[-113.76,31.56],[-113.95,31.63],[-113.98,31.59],[-114.0,31.53],[-114.08,31.51],[-114.15,31.51],[-114.26,31.55],[-114.55,31.73],[-114.61,31.76],[-114.7,31.78],[-114.74,31.81],[-114.93,31.9],[-114.9,31.85],[-114.84,31.8],[-114.79,31.65],[-114.85,31.54],[-114.88,31.16],[-114.84,31.08],[-114.76,30.96],[-114.7,30.77],[-114.69,30.62],[-114.63,30.51],[-114.65,30.24],[-114.63,30.16],[-114.55,30.02],[-114.4,29.9],[-114.37,29.83],[-114.18,29.73],[-114.06,29.61],[-113.83,29.44],[-113.76,29.37],[-113.55,29.1],[-113.54,29.02],[-113.5,28.93],[-113.38,28.95],[-113.33,28.87],[-113.34,28.84],[-113.32,28.81],[-113.26,28.82],[-113.21,28.8],[-113.09,28.51],[-113.03,28.47],[-112.96,28.46],[-112.87,28.42],[-112.87,28.35],[-112.87,28.29],[-112.8,28.21],[-112.81,28.09],[-112.75,27.99],[-112.76,27.9],[-112.73,27.83],[-112.55,27.66],[-112.33,27.52],[-112.28,27.35],[-112.19,27.19],[-112.1,27.15],[-112.0,27.08],[-112.02,27.01],[-112.01,26.97],[-111.88,26.84],[-111.86,26.68],[-111.75,26.57],[-111.72,26.56],[-111.7,26.58],[-111.78,26.69],[-111.82,26.76],[-111.82,26.87],[-111.8,26.88],[-111.57,26.71],[-111.55,26.58],[-111.47,26.51],[-111.46,26.41],[-111.42,26.35],[-111.4,26.27],[-111.33,26.13],[-111.33,25.93],[-111.29,25.79],[-111.15,25.57],[-111.03,25.53],[-111.01,25.42],[-110.89,25.14],[-110.76,24.99],[-110.69,24.87],[-110.68,24.79],[-110.73,24.67],[-110.73,24.59],[-110.66,24.34],[-110.55,24.21],[-110.42,24.18],[-110.4,24.17],[-110.41,24.13],[-110.37,24.1],[-110.32,24.14],[-110.3,24.19],[-110.32,24.26],[-110.33,24.31],[-110.3,24.34],[-110.26,24.34],[-110.02,24.17],[-109.98,24.11],[-109.89,24.03],[-109.81,23.94],[-109.78,23.86],[-109.71,23.8],[-109.68,23.66],[-109.51,23.6],[-109.42,23.48],[-109.41,23.41],[-109.46,23.21],[-109.5,23.16],[-109.63,23.08],[-109.73,22.98],[-109.82,22.92],[-109.92,22.89],[-110.01,22.89],[-110.09,23.01],[-110.18,23.34],[-110.24,23.41],[-110.29,23.52],[-110.36,23.6],[-110.63,23.74],[-110.76,23.88],[-110.9,23.97],[-111.04,24.11],[-111.42,24.33],[-111.58,24.44],[-111.68,24.56],[-111.75,24.55],[-111.8,24.54],[-111.82,24.57],[-111.83,24.63],[-111.85,24.67],[-112.07,24.84],[-112.12,24.93],[-112.13,25.04],[-112.08,25.32],[-112.06,25.49],[-112.07,25.57],[-112.09,25.58],[-112.11,25.63],[-112.12,25.77],[-112.17,25.91],[-112.38,26.21],[-112.53,26.27],[-112.66,26.32],[-113.02,26.58],[-113.12,26.72],[-113.14,26.79],[-113.16,26.95],[-113.21,26.86],[-113.27,26.79],[-113.43,26.8],[-113.6,26.72],[-113.7,26.79],[-113.76,26.87],[-113.84,26.97],[-113.94,26.99],[-114.0,26.99],[-114.11,27.11],[-114.2,27.14],[-114.33,27.16],[-114.45,27.22],[-114.48,27.28],[-114.5,27.38],[-114.54,27.43],[-114.72,27.54],[-114.86,27.66],[-114.99,27.74],[-115.03,27.8],[-115.04,27.84],[-114.82,27.83],[-114.57,27.78],[-114.45,27.8],[-114.37,27.84],[-114.3,27.87],[-114.29,27.84],[-114.3,27.78],[-114.23,27.72],[-114.14,27.67],[-114.07,27.68],[-114.14,27.73],[-114.18,27.83],[-114.16,27.87],[-114.16,27.92],[-114.25,27.91],[-114.27,27.93],[-114.19,28.01],[-114.09,28.22],[-114.05,28.43],[-114.15,28.61],[-114.31,28.73],[-114.66,29.09],[-114.88,29.28],[-114.94,29.35],[-114.99,29.38],[-115.17,29.43],[-115.31,29.53],[-115.57,29.68],[-115.67,29.76],[-115.75,29.94],[-115.81,29.96],[-115.79,30.08],[-115.82,30.3],[-115.86,30.36],[-116.0,30.41],[-116.03,30.56],[-116.04,30.71],[-116.06,30.8],[-116.3,30.97],[-116.31,31.05],[-116.31,31.13],[-116.33,31.2],[-116.46,31.36],[-116.61,31.5],[-116.66,31.56],[-116.67,31.7],[-116.72,31.73],[-116.7,31.74],[-116.65,31.74],[-116.62,31.76],[-116.62,31.85],[-116.85,32.0],[-116.91,32.2],[-117.03,32.31],[-117.06,32.34],[-117.13,32.53],[-116.84,32.55],[-116.56,32.58],[-116.27,32.6],[-115.98,32.62],[-115.7,32.64],[-115.41,32.66],[-115.13,32.68],[-114.84,32.7],[-114.72,32.72],[-114.79,32.56],[-114.84,32.51],[-114.36,32.36],[-113.89,32.21],[-113.41,32.06],[-112.94,31.92],[-112.46,31.77],[-111.99,31.62],[-111.52,31.47],[-111.04,31.32],[-110.69,31.32],[-110.34,31.33],[-109.98,31.33],[-109.63,31.33],[-109.27,31.33],[-108.92,31.33],[-108.57,31.33],[-108.21,31.33],[-108.21,31.44],[-108.21,31.55],[-108.21,31.67],[-108.21,31.78],[-107.99,31.78],[-107.77,31.78],[-107.55,31.78],[-107.33,31.77],[-107.11,31.77],[-106.89,31.77],[-106.67,31.77],[-106.45,31.77],[-106.45,31.77],[-106.44,31.76],[-106.35,31.68],[-106.26,31.54],[-106.15,31.45],[-106.02,31.4],[-105.81,31.24],[-105.51,30.98],[-105.28,30.81],[-105.1,30.72],[-104.98,30.65],[-104.92,30.58],[-104.84,30.45],[-104.68,30.13],[-104.68,29.99],[-104.62,29.85],[-104.5,29.68],[-104.4,29.57],[-104.31,29.54],[-104.22,29.48],[-104.11,29.39],[-103.99,29.32],[-103.85,29.29],[-103.66,29.21],[-103.42,29.07],[-103.26,29.0],[-103.17,29.0],[-103.09,29.04],[-103.02,29.13],[-102.96,29.19],[-102.89,29.22],[-102.87,29.26],[-102.88,29.32],[-102.83,29.44],[-102.73,29.64],[-102.61,29.75],[-102.48,29.77],[-102.39,29.81],[-102.34,29.86],[-102.27,29.87],[-102.16,29.83],[-101.99,29.8],[-101.75,29.78],[-101.61,29.79],[-101.57,29.81],[-101.55,29.81],[-101.54,29.78],[-101.51,29.77],[-101.44,29.78],[-101.38,29.74],[-101.3,29.63],[-101.04,29.46],[-101.04,29.46],[-101.02,29.4],[-100.92,29.31],[-100.75,29.18],[-100.66,29.07],[-100.64,28.97],[-100.55,28.82],[-100.4,28.61],[-100.33,28.5],[-100.35,28.49],[-100.34,28.43],[-100.3,28.33],[-100.22,28.24],[-100.11,28.17],[-100.0,28.05],[-99.89,27.87],[-99.75,27.73],[-99.6,27.64],[-99.51,27.55],[-99.48,27.47],[-99.49,27.4],[-99.51,27.34],[-99.5,27.29],[-99.46,27.23],[-99.44,27.17],[-99.46,27.08],[-99.46,27.06],[-99.46,27.06],[-99.44,27.04],[-99.3,26.88],[-99.23,26.76],[-99.17,26.57],[-99.17,26.56],[-99.11,26.45],[-99.02,26.4],[-98.87,26.38],[-98.77,26.34],[-98.69,26.28],[-98.6,26.24],[-98.49,26.22],[-98.38,26.18],[-98.28,26.11],[-98.08,26.06],[-97.8,26.04],[-97.59,25.98],[-97.44,25.89],[-97.38,25.87],[-97.36,25.87],[-97.35,25.88],[-97.34,25.91],[-97.28,25.94],[-97.15,25.96],[-97.16,25.75],[-97.22,25.59],[-97.42,25.23],[-97.51,25.01],[-97.67,24.39],[-97.72,23.98],[-97.73,23.79],[-97.74,23.76],[-97.73,23.73],[-97.77,23.31],[-97.75,22.94],[-97.76,22.89],[-97.82,22.78],[-97.86,22.62],[-97.84,22.56],[-97.84,22.51],[-97.78,22.28],[-97.76,22.11],[-97.58,21.81],[-97.48,21.7],[-97.36,21.61],[-97.31,21.56],[-97.34,21.44],[-97.39,21.37],[-97.41,21.27],[-97.43,21.36],[-97.42,21.47],[-97.38,21.52],[-97.38,21.57],[-97.46,21.61],[-97.59,21.76],[-97.75,22.03],[-97.64,21.6],[-97.6,21.54],[-97.57,21.51],[-97.51,21.48],[-97.5,21.43],[-97.5,21.4],[-97.36,21.1],[-97.19,20.8],[-97.19,20.72],[-97.12,20.61],[-96.71,20.19],[-96.46,19.87],[-96.37,19.57],[-96.32,19.47],[-96.29,19.34],[-96.12,19.2],[-96.07,19.11],[-95.98,19.05],[-95.91,18.9],[-95.78,18.81],[-95.81,18.8],[-95.93,18.85],[-95.92,18.82],[-95.82,18.75],[-95.63,18.69],[-95.58,18.69],[-95.65,18.72],[-95.72,18.77],[-95.7,18.77],[-95.56,18.72],[-95.18,18.7],[-95.01,18.57],[-94.8,18.51],[-94.68,18.35],[-94.55,18.17],[-94.46,18.17],[-94.39,18.17],[-94.19,18.2],[-93.87,18.3],[-93.76,18.36],[-93.55,18.43],[-93.23,18.44],[-93.13,18.42],[-92.88,18.47],[-92.77,18.52],[-92.73,18.57],[-92.71,18.61],[-92.49,18.66],[-92.44,18.68],[-92.21,18.68],[-92.1,18.7],[-91.97,18.72],[-91.88,18.64],[-91.88,18.6],[-91.94,18.56],[-91.91,18.53],[-91.8,18.47],[-91.6,18.45],[-91.53,18.46],[-91.44,18.54],[-91.28,18.62],[-91.28,18.72],[-91.31,18.77],[-91.36,18.78],[-91.37,18.81],[-91.33,18.88],[-91.34,18.9],[-91.45,18.83],[-91.47,18.83],[-91.46,18.86],[-91.44,18.89],[-91.14,19.04],[-91.06,19.1],[-90.96,19.15],[-90.74,19.35],[-90.69,19.73],[-90.65,19.8],[-90.51,19.91],[-90.49,19.95],[-90.48,20.03],[-90.49,20.22],[-90.48,20.38],[-90.48,20.56],[-90.46,20.71],[-90.44,20.76],[-90.35,21.01],[-90.18,21.12],[-89.89,21.25],[-89.82,21.27],[-88.88,21.41],[-88.75,21.45],[-88.58,21.54],[-88.47,21.57],[-88.25,21.57],[-88.18,21.58],[-88.17,21.59],[-88.17,21.6],[-88.13,21.62],[-88.01,21.6],[-87.77,21.55],[-87.69,21.54],[-87.48,21.47],[-87.25,21.45],[-87.22,21.46],[-87.19,21.48],[-87.16,21.51],[-87.19,21.55],[-87.21,21.54],[-87.25,21.53],[-87.3,21.52],[-87.39,21.55],[-87.37,21.57],[-87.28,21.57],[-87.22,21.58],[-87.13,21.62],[-87.03,21.59],[-86.91,21.46],[-86.82,21.42],[-86.82,21.23],[-86.8,21.2],[-86.77,21.15],[-86.82,21.01],[-86.86,20.89],[-86.93,20.79],[-87.06,20.63],[-87.22,20.51],[-87.42,20.23],[-87.47,20.1],[-87.47,20.0],[-87.43,19.9],[-87.44,19.86],[-87.47,19.82],[-87.51,19.83],[-87.59,19.78],[-87.69,19.64],[-87.69,19.59],[-87.65,19.55],[-87.59,19.57],[-87.51,19.57],[-87.47,19.59],[-87.42,19.58],[-87.43,19.5],[-87.48,19.44],[-87.51,19.43],[-87.57,19.42],[-87.63,19.38],[-87.66,19.35],[-87.66,19.26],[-87.62,19.25],[-87.55,19.32],[-87.51,19.32],[-87.5,19.29],[-87.59,19.05],[-87.65,18.8],[-87.73,18.66],[-87.76,18.45],[-87.8,18.36],[-87.85,18.27],[-87.88,18.27],[-87.96,18.44],[-88.04,18.48],[-88.06,18.52],[-88.01,18.73],[-88.03,18.84],[-88.07,18.83],[-88.13,18.77],[-88.2,18.72],[-88.2,18.64],[-88.28,18.51],[-88.3,18.47]],[[-91.68,18.68],[-91.8,18.65],[-91.82,18.68],[-91.59,18.78],[-91.55,18.77],[-91.54,18.76],[-91.65,18.71],[-91.68,18.68]],[[-110.91,18.74],[-110.97,18.72],[-111.06,18.78],[-111.04,18.83],[-110.99,18.86],[-110.94,18.8],[-110.91,18.74]],[[-86.94,20.3],[-86.99,20.27],[-87.02,20.38],[-86.98,20.49],[-86.93,20.55],[-86.83,20.56],[-86.76,20.58],[-86.76,20.55],[-86.81,20.47],[-86.94,20.3]],[[-86.71,21.24],[-86.7,21.19],[-86.71,21.2],[-86.74,21.23],[-86.75,21.28],[-86.74,21.28],[-86.73,21.26],[-86.71,21.24]],[[-106.5,21.61],[-106.53,21.53],[-106.61,21.56],[-106.63,21.61],[-106.64,21.7],[-106.6,21.71],[-106.54,21.68],[-106.52,21.65],[-106.5,21.61]],[[-109.81,24.15],[-109.83,24.15],[-109.88,24.2],[-109.9,24.33],[-109.89,24.34],[-109.79,24.18],[-109.8,24.16],[-109.81,24.15]],[[-111.7,24.39],[-111.71,24.35],[-112.01,24.53],[-111.94,24.55],[-111.86,24.54],[-111.7,24.39]],[[-110.57,25.0],[-110.54,24.89],[-110.59,24.91],[-110.66,24.97],[-110.7,25.05],[-110.7,25.08],[-110.69,25.09],[-110.6,25.04],[-110.57,25.0]],[[-112.06,24.55],[-112.08,24.53],[-112.16,24.65],[-112.18,24.73],[-112.21,24.76],[-112.3,24.79],[-112.22,24.95],[-112.16,25.29],[-112.13,25.22],[-112.2,24.89],[-112.2,24.84],[-112.16,24.8],[-112.13,24.73],[-112.13,24.65],[-112.07,24.58],[-112.06,24.55]],[[-111.1,26.02],[-111.09,25.98],[-111.09,25.97],[-111.14,26.0],[-111.2,25.85],[-111.22,25.84],[-111.18,26.04],[-111.14,26.07],[-111.09,26.08],[-111.1,26.02]],[[-115.17,28.07],[-115.18,28.04],[-115.35,28.1],[-115.26,28.22],[-115.27,28.34],[-115.23,28.37],[-115.2,28.33],[-115.15,28.17],[-115.17,28.07]],[[-118.24,28.94],[-118.29,28.9],[-118.4,29.11],[-118.4,29.16],[-118.37,29.19],[-118.31,29.18],[-118.31,29.13],[-118.27,29.09],[-118.25,29.04],[-118.24,28.94]],[[-112.2,29.01],[-112.28,28.77],[-112.36,28.77],[-112.51,28.85],[-112.53,28.89],[-112.47,29.17],[-112.42,29.2],[-112.29,29.24],[-112.26,29.21],[-112.25,29.13],[-112.2,29.01]],[[-113.16,29.05],[-113.16,29.03],[-113.26,29.1],[-113.5,29.31],[-113.58,29.41],[-113.59,29.46],[-113.59,29.57],[-113.51,29.56],[-113.42,29.49],[-113.38,29.42],[-113.37,29.34],[-113.2,29.3],[-113.18,29.13],[-113.16,29.05]],[[-114.69,31.71],[-114.73,31.7],[-114.79,31.75],[-114.78,31.79],[-114.77,31.79],[-114.71,31.76],[-114.69,31.72],[-114.69,31.71]]]},{"n":"Marshall Islands","r":[[[169.64,5.83],[169.62,5.8],[169.59,5.8],[169.61,5.82],[169.63,5.86],[169.65,5.95],[169.7,5.98],[169.73,6.01],[169.73,5.98],[169.67,5.94],[169.64,5.83]],[[171.58,7.05],[171.61,7.03],[171.69,7.03],[171.76,6.97],[171.73,6.98],[171.69,7.0],[171.66,7.01],[171.61,7.01],[171.59,7.02],[171.58,7.05]],[[171.1,7.14],[171.23,7.09],[171.39,7.11],[171.37,7.1],[171.3,7.08],[171.26,7.07],[171.24,7.07],[171.2,7.07],[171.1,7.11],[171.04,7.16],[171.05,7.17],[171.1,7.14]],[[168.83,7.31],[168.82,7.29],[168.72,7.3],[168.68,7.32],[168.68,7.34],[168.76,7.32],[168.83,7.31]],[[166.89,11.15],[166.86,11.15],[166.84,11.15],[166.86,11.17],[166.89,11.17],[166.9,11.17],[166.89,11.15]]]},{"n":"Macedonia","r":[[[20.96,40.85],[20.96,40.87],[20.93,40.9],[20.87,40.92],[20.74,40.91],[20.71,40.93],[20.66,41.06],[20.61,41.08],[20.57,41.13],[20.49,41.27],[20.49,41.34],[20.49,41.39],[20.45,41.52],[20.48,41.55],[20.52,41.57],[20.52,41.63],[20.51,41.71],[20.55,41.86],[20.57,41.87],[20.58,41.87],[20.69,41.85],[20.72,41.87],[20.74,41.9],[20.75,42.02],[20.78,42.07],[21.06,42.17],[21.14,42.18],[21.21,42.13],[21.26,42.1],[21.29,42.1],[21.3,42.13],[21.33,42.19],[21.39,42.22],[21.56,42.25],[21.56,42.25],[21.62,42.24],[21.74,42.27],[21.81,42.3],[21.85,42.31],[21.9,42.32],[21.98,42.32],[22.05,42.3],[22.15,42.32],[22.24,42.36],[22.28,42.35],[22.32,42.32],[22.34,42.31],[22.5,42.17],[22.58,42.1],[22.68,42.06],[22.8,42.03],[22.84,41.99],[22.91,41.84],[22.94,41.78],[22.99,41.76],[23.0,41.74],[23.01,41.72],[22.95,41.61],[22.93,41.36],[22.92,41.34],[22.86,41.34],[22.78,41.33],[22.76,41.31],[22.72,41.18],[22.6,41.14],[22.49,41.12],[22.4,41.12],[22.24,41.16],[22.18,41.16],[22.14,41.14],[21.99,41.13],[21.93,41.11],[21.78,40.95],[21.63,40.9],[21.58,40.87],[21.46,40.9],[21.4,40.91],[21.32,40.87],[21.15,40.86],[21.1,40.86],[20.96,40.85]]]},{"n":"Mali","r":[[[0.22,14.91],[0.01,14.98],[-0.24,15.06],[-0.41,15.01],[-0.43,15.03],[-0.45,15.06],[-0.54,15.08],[-0.67,15.07],[-0.76,15.05],[-0.91,14.94],[-1.02,14.84],[-1.05,14.82],[-1.2,14.76],[-1.49,14.63],[-1.66,14.53],[-1.7,14.51],[-1.77,14.49],[-1.88,14.48],[-1.97,14.46],[-2.06,14.19],[-2.11,14.17],[-2.46,14.27],[-2.53,14.26],[-2.59,14.23],[-2.78,14.07],[-2.87,13.95],[-2.93,13.79],[-2.92,13.74],[-2.92,13.68],[-2.95,13.65],[-3.0,13.64],[-3.04,13.64],[-3.2,13.67],[-3.25,13.66],[-3.27,13.58],[-3.27,13.4],[-3.3,13.28],[-3.4,13.24],[-3.47,13.2],[-3.53,13.18],[-3.58,13.19],[-3.85,13.37],[-3.95,13.4],[-4.05,13.38],[-4.15,13.31],[-4.2,13.26],[-4.26,13.2],[-4.33,13.12],[-4.31,13.05],[-4.26,12.98],[-4.23,12.88],[-4.23,12.79],[-4.48,12.67],[-4.46,12.63],[-4.42,12.58],[-4.42,12.49],[-4.43,12.34],[-4.48,12.28],[-4.55,12.23],[-4.59,12.16],[-4.63,12.12],[-4.7,12.08],[-4.8,12.03],[-4.97,11.99],[-5.11,11.97],[-5.16,11.94],[-5.23,11.89],[-5.29,11.83],[-5.3,11.76],[-5.29,11.68],[-5.27,11.62],[-5.24,11.58],[-5.23,11.52],[-5.25,11.38],[-5.3,11.21],[-5.35,11.13],[-5.42,11.09],[-5.49,11.04],[-5.47,10.93],[-5.46,10.77],[-5.48,10.64],[-5.48,10.57],[-5.51,10.48],[-5.52,10.43],[-5.56,10.44],[-5.69,10.43],[-5.84,10.39],[-5.9,10.35],[-5.91,10.31],[-5.94,10.28],[-5.99,10.24],[-6.03,10.19],[-6.12,10.2],[-6.2,10.23],[-6.24,10.26],[-6.24,10.28],[-6.21,10.32],[-6.19,10.37],[-6.19,10.4],[-6.22,10.48],[-6.24,10.56],[-6.23,10.6],[-6.25,10.72],[-6.26,10.72],[-6.37,10.69],[-6.4,10.69],[-6.43,10.67],[-6.43,10.65],[-6.41,10.57],[-6.42,10.56],[-6.48,10.56],[-6.56,10.59],[-6.65,10.66],[-6.68,10.63],[-6.69,10.58],[-6.69,10.51],[-6.67,10.39],[-6.69,10.35],[-6.75,10.36],[-6.83,10.36],[-6.9,10.35],[-6.95,10.34],[-6.98,10.3],[-6.99,10.25],[-6.96,10.2],[-6.97,10.18],[-6.99,10.16],[-7.02,10.14],[-7.04,10.14],[-7.1,10.2],[-7.18,10.23],[-7.36,10.26],[-7.39,10.34],[-7.41,10.34],[-7.46,10.38],[-7.5,10.44],[-7.53,10.44],[-7.56,10.42],[-7.66,10.43],[-7.75,10.34],[-7.81,10.24],[-7.88,10.19],[-7.96,10.16],[-7.99,10.16],[-7.97,10.23],[-7.99,10.28],[-8.01,10.32],[-8.23,10.44],[-8.27,10.49],[-8.3,10.62],[-8.32,10.75],[-8.32,10.83],[-8.31,10.9],[-8.31,10.95],[-8.34,10.99],[-8.4,11.03],[-8.47,11.05],[-8.56,11.0],[-8.61,10.99],[-8.65,10.99],[-8.67,11.01],[-8.66,11.04],[-8.57,11.18],[-8.52,11.24],[-8.46,11.28],[-8.43,11.3],[-8.4,11.34],[-8.4,11.37],[-8.41,11.39],[-8.47,11.41],[-8.57,11.48],[-8.62,11.49],[-8.66,11.51],[-8.71,11.62],[-8.73,11.64],[-8.78,11.65],[-8.82,11.67],[-8.82,11.81],[-8.82,11.92],[-8.91,12.11],[-8.95,12.23],[-9.0,12.35],[-9.04,12.4],[-9.12,12.45],[-9.22,12.48],[-9.3,12.49],[-9.37,12.48],[-9.4,12.46],[-9.39,12.44],[-9.34,12.37],[-9.33,12.32],[-9.34,12.28],[-9.36,12.26],[-9.4,12.25],[-9.49,12.23],[-9.59,12.18],[-9.66,12.14],[-9.71,12.04],[-9.75,12.03],[-9.82,12.04],[-10.01,12.12],[-10.17,12.18],[-10.27,12.21],[-10.34,12.19],[-10.37,12.18],[-10.47,12.14],[-10.59,11.99],[-10.62,11.94],[-10.64,11.93],[-10.68,11.9],[-10.71,11.9],[-10.73,11.92],[-10.74,11.93],[-10.81,12.03],[-10.88,12.15],[-10.93,12.21],[-11.0,12.21],[-11.07,12.17],[-11.13,12.1],[-11.21,12.02],[-11.26,12.0],[-11.31,12.02],[-11.41,12.1],[-11.49,12.17],[-11.5,12.2],[-11.47,12.25],[-11.45,12.32],[-11.42,12.38],[-11.39,12.4],[-11.38,12.48],[-11.45,12.53],[-11.45,12.56],[-11.44,12.63],[-11.41,12.78],[-11.42,12.83],[-11.39,12.94],[-11.43,12.99],[-11.44,13.03],[-11.49,13.09],[-11.55,13.17],[-11.56,13.24],[-11.58,13.29],[-11.63,13.37],[-11.67,13.38],[-11.76,13.39],[-11.77,13.37],[-11.8,13.33],[-11.83,13.32],[-11.88,13.36],[-11.9,13.41],[-11.89,13.44],[-11.96,13.51],[-12.05,13.63],[-12.04,13.73],[-11.98,13.79],[-11.97,13.83],[-11.96,13.88],[-11.99,13.93],[-12.02,13.97],[-12.01,14.07],[-12.02,14.21],[-12.07,14.27],[-12.11,14.32],[-12.18,14.38],[-12.23,14.46],[-12.21,14.57],[-12.19,14.65],[-12.28,14.81],[-12.1,14.75],[-12.08,14.77],[-12.02,14.8],[-11.94,14.89],[-11.87,15.0],[-11.84,15.13],[-11.83,15.24],[-11.8,15.34],[-11.76,15.43],[-11.68,15.51],[-11.6,15.57],[-11.5,15.64],[-11.46,15.63],[-11.37,15.54],[-11.17,15.36],[-11.01,15.22],[-10.95,15.15],[-10.9,15.15],[-10.82,15.28],[-10.73,15.39],[-10.7,15.42],[-10.59,15.43],[-10.49,15.44],[-10.41,15.44],[-10.26,15.42],[-10.19,15.4],[-10.13,15.38],[-9.94,15.37],[-9.76,15.4],[-9.58,15.44],[-9.45,15.46],[-9.44,15.51],[-9.45,15.57],[-9.43,15.62],[-9.39,15.67],[-9.35,15.68],[-9.34,15.53],[-9.29,15.5],[-9.18,15.5],[-8.99,15.5],[-8.78,15.5],[-8.58,15.5],[-8.38,15.5],[-8.17,15.5],[-7.97,15.5],[-7.76,15.5],[-7.56,15.5],[-7.36,15.5],[-7.15,15.5],[-6.95,15.5],[-6.74,15.5],[-6.54,15.5],[-6.34,15.5],[-6.13,15.5],[-5.93,15.5],[-5.72,15.5],[-5.51,15.5],[-5.46,15.79],[-5.4,16.06],[-5.36,16.28],[-5.51,16.44],[-5.63,16.57],[-5.66,16.81],[-5.68,17.06],[-5.71,17.31],[-5.74,17.56],[-5.77,17.8],[-5.8,18.05],[-5.83,18.3],[-5.86,18.55],[-5.88,18.8],[-5.91,19.05],[-5.94,19.3],[-5.97,19.54],[-6.0,19.79],[-6.03,20.04],[-6.05,20.29],[-6.08,20.54],[-6.11,20.79],[-6.14,21.04],[-6.17,21.29],[-6.2,21.53],[-6.23,21.78],[-6.25,22.03],[-6.28,22.28],[-6.31,22.53],[-6.34,22.78],[-6.37,23.03],[-6.4,23.27],[-6.43,23.52],[-6.45,23.77],[-6.48,24.02],[-6.51,24.27],[-6.54,24.52],[-6.57,24.77],[-6.59,24.99],[-6.29,24.99],[-5.96,24.99],[-5.64,25.0],[-5.17,25.0],[-4.82,25.0],[-4.52,24.8],[-4.24,24.62],[-3.91,24.41],[-3.59,24.2],[-3.26,23.98],[-2.93,23.77],[-2.6,23.55],[-2.28,23.34],[-1.95,23.12],[-1.62,22.91],[-1.29,22.7],[-0.97,22.48],[-0.64,22.27],[-0.31,22.05],[0.02,21.84],[0.34,21.63],[0.67,21.41],[1.0,21.2],[1.15,21.1],[1.16,21.06],[1.17,20.98],[1.16,20.89],[1.17,20.82],[1.21,20.77],[1.29,20.71],[1.61,20.56],[1.64,20.52],[1.65,20.46],[1.69,20.38],[1.75,20.33],[1.83,20.3],[1.93,20.27],[2.22,20.25],[2.28,20.21],[2.41,20.06],[2.47,20.04],[2.67,19.99],[2.81,19.97],[2.87,19.96],[2.99,19.92],[3.13,19.85],[3.2,19.79],[3.2,19.77],[3.2,19.72],[3.2,19.56],[3.23,19.47],[3.26,19.41],[3.25,19.37],[3.22,19.35],[3.19,19.31],[3.18,19.27],[3.14,19.21],[3.11,19.15],[3.12,19.1],[3.17,19.07],[3.26,19.01],[3.32,18.99],[3.36,18.99],[3.4,18.99],[3.44,19.0],[3.68,19.04],[3.91,19.08],[4.23,19.14],[4.23,18.97],[4.23,18.7],[4.23,18.41],[4.23,18.14],[4.23,17.83],[4.23,17.58],[4.23,17.29],[4.23,17.0],[4.2,16.96],[4.19,16.8],[4.18,16.58],[4.12,16.36],[4.01,16.19],[3.98,16.04],[3.95,15.95],[3.91,15.9],[3.9,15.84],[3.88,15.76],[3.84,15.7],[3.82,15.67],[3.71,15.64],[3.52,15.48],[3.5,15.36],[3.29,15.39],[3.06,15.43],[3.03,15.42],[3.01,15.41],[3.0,15.34],[2.69,15.33],[2.42,15.32],[2.09,15.31],[1.86,15.3],[1.57,15.29],[1.3,15.27],[1.12,15.13],[0.96,14.99],[0.95,14.98],[0.72,14.95],[0.43,14.98],[0.29,14.98],[0.23,14.96],[0.22,14.91]]]},{"n":"Malta","r":[[[14.57,35.85],[14.53,35.82],[14.44,35.82],[14.35,35.87],[14.35,35.98],[14.45,35.96],[14.54,35.89],[14.57,35.85]],[[14.31,36.03],[14.25,36.01],[14.19,36.04],[14.18,36.06],[14.26,36.08],[14.3,36.06],[14.32,36.04],[14.31,36.03]]]},{"n":"Myanmar","r":[[[92.32,20.79],[92.31,20.86],[92.29,20.93],[92.27,21.0],[92.26,21.06],[92.21,21.11],[92.19,21.2],[92.18,21.29],[92.21,21.36],[92.28,21.43],[92.33,21.44],[92.37,21.41],[92.47,21.36],[92.54,21.32],[92.57,21.26],[92.6,21.27],[92.63,21.31],[92.63,21.35],[92.59,21.47],[92.58,21.61],[92.58,21.94],[92.57,21.98],[92.63,22.01],[92.65,22.05],[92.67,22.11],[92.69,22.13],[92.72,22.13],[92.77,22.1],[92.85,22.01],[92.91,21.99],[92.96,22.0],[93.02,22.15],[93.04,22.18],[93.07,22.21],[93.12,22.21],[93.15,22.23],[93.16,22.29],[93.16,22.36],[93.11,22.55],[93.09,22.63],[93.08,22.72],[93.11,22.81],[93.16,22.91],[93.15,23.0],[93.16,23.03],[93.2,23.04],[93.25,23.02],[93.31,23.03],[93.35,23.08],[93.37,23.13],[93.39,23.34],[93.41,23.53],[93.41,23.68],[93.37,23.77],[93.31,24.02],[93.33,24.06],[93.36,24.07],[93.45,23.99],[93.49,23.97],[93.56,23.99],[93.63,24.01],[93.68,24.01],[93.76,23.98],[93.86,23.94],[94.01,23.9],[94.07,23.87],[94.13,23.88],[94.17,23.97],[94.22,24.11],[94.29,24.32],[94.38,24.47],[94.4,24.51],[94.49,24.64],[94.58,24.77],[94.66,24.93],[94.71,25.05],[94.7,25.1],[94.68,25.14],[94.62,25.16],[94.57,25.19],[94.55,25.22],[94.55,25.24],[94.58,25.32],[94.62,25.41],[94.67,25.46],[94.79,25.52],[94.86,25.6],[94.95,25.7],[94.99,25.77],[95.02,25.91],[95.04,25.94],[95.09,25.99],[95.13,26.04],[95.13,26.07],[95.11,26.09],[95.07,26.19],[95.05,26.35],[95.06,26.47],[95.09,26.53],[95.13,26.6],[95.2,26.64],[95.31,26.67],[95.46,26.76],[95.74,26.95],[95.84,27.01],[95.91,27.05],[95.97,27.13],[96.06,27.22],[96.19,27.26],[96.27,27.28],[96.67,27.34],[96.73,27.33],[96.8,27.3],[96.88,27.18],[96.95,27.13],[97.04,27.1],[97.1,27.12],[97.1,27.16],[96.9,27.44],[96.88,27.51],[96.88,27.59],[96.9,27.64],[96.96,27.7],[97.05,27.76],[97.16,27.84],[97.23,27.89],[97.31,27.91],[97.34,27.94],[97.34,27.98],[97.34,28.03],[97.3,28.09],[97.31,28.16],[97.32,28.22],[97.36,28.25],[97.43,28.35],[97.48,28.43],[97.5,28.46],[97.54,28.51],[97.6,28.52],[97.66,28.5],[97.69,28.47],[97.73,28.41],[97.77,28.36],[97.82,28.36],[97.86,28.36],[97.89,28.36],[97.93,28.31],[98.02,28.21],[98.06,28.19],[98.1,28.14],[98.12,28.06],[98.13,27.97],[98.24,27.66],[98.27,27.6],[98.3,27.55],[98.35,27.54],[98.39,27.59],[98.41,27.64],[98.45,27.66],[98.5,27.65],[98.6,27.6],[98.65,27.57],[98.68,27.42],[98.68,27.25],[98.67,27.19],[98.72,27.04],[98.73,26.88],[98.74,26.79],[98.74,26.7],[98.73,26.58],[98.71,26.43],[98.67,26.3],[98.69,26.19],[98.66,26.14],[98.57,26.11],[98.56,26.07],[98.59,26.0],[98.65,25.92],[98.66,25.86],[98.63,25.83],[98.56,25.82],[98.47,25.79],[98.4,25.68],[98.33,25.59],[98.3,25.57],[98.17,25.59],[98.14,25.57],[98.1,25.42],[98.06,25.35],[98.01,25.29],[97.96,25.26],[97.92,25.24],[97.82,25.25],[97.77,25.16],[97.71,25.03],[97.71,24.97],[97.74,24.87],[97.72,24.84],[97.67,24.82],[97.58,24.77],[97.53,24.63],[97.53,24.49],[97.56,24.44],[97.62,24.42],[97.67,24.38],[97.67,24.31],[97.71,24.23],[97.69,24.13],[97.57,23.99],[97.56,23.91],[97.63,23.89],[97.69,23.9],[97.76,23.93],[97.84,23.99],[98.02,24.07],[98.21,24.11],[98.37,24.12],[98.5,24.12],[98.56,24.1],[98.58,24.07],[98.76,24.12],[98.8,24.12],[98.84,24.12],[98.83,24.09],[98.7,23.96],[98.68,23.91],[98.68,23.84],[98.74,23.78],[98.79,23.74],[98.83,23.62],[98.8,23.52],[98.82,23.48],[98.86,23.44],[98.88,23.38],[98.89,23.31],[98.86,23.19],[99.06,23.13],[99.22,23.1],[99.34,23.1],[99.42,23.07],[99.46,23.05],[99.5,23.0],[99.51,22.96],[99.47,22.93],[99.39,22.83],[99.34,22.69],[99.34,22.59],[99.34,22.5],[99.24,22.37],[99.21,22.28],[99.17,22.19],[99.17,22.15],[99.19,22.13],[99.23,22.11],[99.3,22.1],[99.39,22.11],[99.59,22.09],[99.83,22.05],[99.92,22.03],[99.95,21.99],[99.94,21.9],[99.93,21.82],[99.94,21.76],[99.98,21.7],[100.04,21.68],[100.1,21.66],[100.11,21.62],[100.09,21.56],[100.12,21.51],[100.15,21.48],[100.21,21.46],[100.35,21.5],[100.45,21.48],[100.53,21.46],[100.6,21.47],[100.68,21.5],[100.84,21.66],[101.02,21.74],[101.08,21.76],[101.12,21.75],[101.13,21.74],[101.13,21.71],[101.15,21.58],[101.14,21.57],[101.08,21.47],[100.93,21.37],[100.82,21.31],[100.76,21.31],[100.7,21.25],[100.66,21.13],[100.61,21.06],[100.57,21.04],[100.54,20.99],[100.52,20.92],[100.55,20.88],[100.62,20.88],[100.62,20.86],[100.57,20.83],[100.49,20.81],[100.41,20.82],[100.33,20.8],[100.25,20.73],[100.18,20.59],[100.13,20.37],[100.12,20.32],[100.0,20.38],[99.95,20.42],[99.89,20.42],[99.83,20.38],[99.77,20.34],[99.72,20.33],[99.64,20.32],[99.53,20.34],[99.46,20.36],[99.45,20.35],[99.49,20.26],[99.5,20.19],[99.49,20.15],[99.45,20.12],[99.4,20.09],[99.34,20.08],[99.28,20.08],[99.2,20.12],[99.13,20.12],[99.07,20.1],[99.04,20.07],[99.02,20.04],[98.99,19.86],[98.96,19.8],[98.92,19.77],[98.88,19.77],[98.82,19.78],[98.76,19.77],[98.49,19.7],[98.45,19.69],[98.37,19.69],[98.29,19.69],[98.24,19.69],[98.11,19.76],[98.05,19.77],[98.02,19.75],[97.99,19.65],[97.92,19.59],[97.82,19.46],[97.79,19.27],[97.8,19.13],[97.71,19.0],[97.71,18.93],[97.75,18.62],[97.75,18.59],[97.73,18.57],[97.67,18.56],[97.58,18.53],[97.52,18.5],[97.48,18.49],[97.4,18.52],[97.37,18.52],[97.38,18.49],[97.45,18.36],[97.52,18.3],[97.6,18.3],[97.63,18.29],[97.62,18.26],[97.65,18.17],[97.72,18.04],[97.74,17.94],[97.7,17.83],[97.71,17.8],[97.73,17.78],[97.79,17.68],[97.93,17.53],[98.06,17.37],[98.17,17.24],[98.26,17.15],[98.44,16.98],[98.47,16.9],[98.48,16.73],[98.52,16.64],[98.56,16.57],[98.59,16.51],[98.66,16.33],[98.69,16.31],[98.84,16.42],[98.87,16.39],[98.89,16.35],[98.89,16.3],[98.87,16.24],[98.82,16.18],[98.59,16.05],[98.57,15.94],[98.56,15.77],[98.55,15.56],[98.57,15.4],[98.56,15.37],[98.54,15.35],[98.45,15.36],[98.33,15.28],[98.29,15.27],[98.23,15.24],[98.19,15.2],[98.18,15.15],[98.2,14.98],[98.25,14.81],[98.33,14.7],[98.4,14.6],[98.5,14.47],[98.57,14.36],[98.72,14.24],[98.93,14.05],[99.01,13.95],[99.09,13.82],[99.14,13.72],[99.16,13.58],[99.17,13.5],[99.18,13.23],[99.14,13.17],[99.11,13.1],[99.12,13.03],[99.17,12.96],[99.17,12.88],[99.22,12.74],[99.3,12.65],[99.37,12.59],[99.41,12.55],[99.39,12.47],[99.42,12.39],[99.43,12.31],[99.46,12.19],[99.52,12.09],[99.61,11.78],[99.61,11.75],[99.57,11.69],[99.52,11.63],[99.48,11.61],[99.44,11.55],[99.36,11.39],[99.19,11.11],[99.03,10.92],[98.89,10.79],[98.79,10.71],[98.76,10.66],[98.76,10.62],[98.78,10.56],[98.77,10.43],[98.75,10.35],[98.72,10.27],[98.7,10.19],[98.66,10.18],[98.56,10.03],[98.52,10.11],[98.5,10.18],[98.52,10.35],[98.46,10.68],[98.5,10.72],[98.54,10.74],[98.6,10.86],[98.68,10.99],[98.68,11.13],[98.74,11.24],[98.73,11.33],[98.73,11.44],[98.75,11.52],[98.74,11.59],[98.79,11.67],[98.88,11.72],[98.84,11.74],[98.8,11.78],[98.69,11.72],[98.64,11.74],[98.62,11.8],[98.64,11.87],[98.64,11.91],[98.69,11.96],[98.69,12.05],[98.66,12.13],[98.7,12.23],[98.63,12.23],[98.6,12.25],[98.62,12.3],[98.68,12.35],[98.62,12.44],[98.66,12.54],[98.66,12.66],[98.64,12.77],[98.64,12.85],[98.6,12.99],[98.58,13.16],[98.49,13.29],[98.42,13.48],[98.25,13.73],[98.25,13.84],[98.24,13.93],[98.2,13.98],[98.15,13.65],[98.11,13.71],[98.1,13.9],[98.07,13.99],[98.1,14.16],[98.0,14.34],[97.98,14.46],[97.91,14.65],[97.93,14.7],[98.02,14.65],[97.94,14.76],[97.87,14.74],[97.81,14.86],[97.8,15.18],[97.74,15.31],[97.77,15.43],[97.71,15.88],[97.58,16.02],[97.61,16.14],[97.64,16.25],[97.63,16.46],[97.66,16.52],[97.73,16.57],[97.67,16.55],[97.62,16.54],[97.51,16.53],[97.38,16.52],[97.33,16.67],[97.27,16.74],[97.21,16.89],[97.18,17.06],[97.2,17.1],[97.1,17.16],[97.07,17.21],[96.97,17.32],[96.85,17.4],[96.88,17.34],[96.91,17.3],[96.85,17.2],[96.91,17.03],[96.86,16.92],[96.81,16.78],[96.77,16.71],[96.62,16.56],[96.51,16.51],[96.43,16.5],[96.36,16.52],[96.28,16.6],[96.26,16.66],[96.25,16.77],[96.22,16.78],[96.19,16.77],[96.24,16.63],[96.24,16.57],[96.32,16.44],[96.29,16.41],[96.14,16.34],[96.08,16.35],[96.04,16.34],[96.03,16.28],[96.01,16.25],[95.76,16.17],[95.71,16.07],[95.68,15.98],[95.56,15.84],[95.39,15.72],[95.35,15.73],[95.3,15.76],[95.31,15.88],[95.36,15.99],[95.35,16.1],[95.33,16.03],[95.23,15.88],[95.18,15.83],[95.08,15.84],[94.94,15.82],[94.89,15.98],[94.89,16.04],[94.88,16.09],[94.9,16.14],[94.89,16.18],[94.86,16.1],[94.85,16.03],[94.8,15.97],[94.66,15.9],[94.66,15.99],[94.65,16.06],[94.68,16.13],[94.68,16.24],[94.72,16.4],[94.72,16.45],[94.7,16.51],[94.68,16.43],[94.67,16.34],[94.64,16.31],[94.59,16.29],[94.5,16.19],[94.44,16.09],[94.3,16.01],[94.22,16.02],[94.21,16.13],[94.27,16.52],[94.33,16.57],[94.35,16.64],[94.4,16.87],[94.45,16.95],[94.47,17.14],[94.49,17.17],[94.56,17.31],[94.59,17.57],[94.56,17.7],[94.49,17.82],[94.43,18.2],[94.27,18.51],[94.25,18.61],[94.17,18.73],[94.25,18.74],[94.09,18.85],[94.07,18.89],[94.04,19.15],[94.04,19.29],[94.02,19.27],[94.0,19.18],[93.94,19.15],[93.97,19.0],[93.96,18.96],[93.93,18.9],[93.8,18.96],[93.71,19.03],[93.6,19.19],[93.49,19.37],[93.53,19.4],[93.58,19.4],[93.73,19.27],[93.82,19.24],[93.89,19.27],[93.96,19.33],[94.0,19.44],[93.96,19.48],[93.89,19.5],[93.84,19.53],[93.77,19.61],[93.76,19.65],[93.74,19.7],[93.67,19.73],[93.61,19.78],[93.66,19.85],[93.71,19.91],[93.58,19.91],[93.44,20.01],[93.41,20.04],[93.36,20.06],[93.25,20.07],[93.16,20.04],[93.2,19.9],[93.19,19.85],[93.13,19.86],[93.0,20.07],[93.04,20.13],[93.1,20.18],[93.07,20.19],[93.02,20.19],[93.07,20.38],[93.04,20.41],[93.02,20.35],[92.99,20.29],[92.88,20.15],[92.83,20.18],[92.79,20.21],[92.84,20.28],[92.87,20.3],[92.89,20.34],[92.85,20.41],[92.79,20.47],[92.74,20.56],[92.71,20.56],[92.73,20.45],[92.72,20.3],[92.61,20.47],[92.38,20.72],[92.32,20.79]],[[98.18,9.93],[98.13,9.88],[98.12,9.88],[98.14,9.97],[98.22,10.05],[98.29,10.05],[98.28,10.01],[98.23,9.95],[98.18,9.93]],[[98.21,10.95],[98.29,10.78],[98.28,10.75],[98.27,10.74],[98.25,10.74],[98.22,10.84],[98.16,10.9],[98.08,10.89],[98.14,10.96],[98.17,10.98],[98.21,10.95]],[[98.54,10.96],[98.52,10.96],[98.5,10.96],[98.48,10.98],[98.53,11.09],[98.54,10.96]],[[98.22,11.48],[98.22,11.46],[98.21,11.46],[98.19,11.47],[98.2,11.57],[98.24,11.64],[98.28,11.76],[98.3,11.78],[98.31,11.72],[98.28,11.59],[98.26,11.52],[98.22,11.48]],[[98.55,11.74],[98.53,11.54],[98.46,11.57],[98.43,11.57],[98.4,11.68],[98.4,11.71],[98.38,11.79],[98.52,11.8],[98.55,11.74]],[[98.08,11.69],[98.08,11.64],[98.02,11.7],[98.01,11.86],[98.06,11.76],[98.08,11.73],[98.08,11.69]],[[98.52,11.91],[98.47,11.9],[98.45,12.06],[98.47,12.08],[98.53,12.01],[98.61,11.96],[98.58,11.93],[98.52,11.91]],[[98.14,12.15],[98.13,12.14],[98.11,12.15],[98.08,12.16],[98.04,12.23],[98.06,12.28],[98.07,12.29],[98.1,12.29],[98.12,12.28],[98.13,12.26],[98.12,12.22],[98.12,12.19],[98.14,12.15]],[[98.07,12.39],[98.06,12.35],[98.0,12.28],[97.95,12.32],[97.94,12.35],[97.99,12.39],[98.05,12.39],[98.06,12.4],[98.07,12.39]],[[98.41,12.6],[98.44,12.57],[98.47,12.57],[98.46,12.47],[98.38,12.35],[98.33,12.34],[98.31,12.34],[98.33,12.51],[98.3,12.61],[98.31,12.68],[98.4,12.65],[98.41,12.6]],[[98.32,13.1],[98.31,12.93],[98.26,13.01],[98.25,13.1],[98.25,13.19],[98.27,13.2],[98.27,13.19],[98.3,13.15],[98.32,13.1]],[[94.8,15.82],[94.78,15.79],[94.74,15.81],[94.73,15.82],[94.83,15.93],[94.84,15.89],[94.8,15.82]],[[94.48,15.95],[94.41,15.85],[94.39,15.99],[94.49,16.08],[94.55,16.15],[94.6,16.21],[94.62,16.14],[94.57,16.02],[94.48,15.95]],[[97.58,16.25],[97.54,16.24],[97.48,16.31],[97.47,16.46],[97.52,16.5],[97.54,16.51],[97.58,16.49],[97.59,16.46],[97.6,16.43],[97.59,16.4],[97.58,16.25]],[[93.69,18.68],[93.67,18.68],[93.57,18.76],[93.49,18.87],[93.62,18.89],[93.74,18.87],[93.75,18.81],[93.72,18.72],[93.69,18.68]],[[93.71,19.56],[93.83,19.48],[93.87,19.48],[93.95,19.43],[93.95,19.41],[93.93,19.37],[93.9,19.33],[93.82,19.3],[93.76,19.33],[93.73,19.42],[93.66,19.46],[93.64,19.5],[93.69,19.54],[93.71,19.56]],[[93.49,19.89],[93.51,19.75],[93.44,19.81],[93.42,19.88],[93.41,19.95],[93.49,19.89]],[[93.01,19.92],[93.02,19.83],[92.98,19.87],[92.91,20.0],[92.91,20.09],[92.96,20.05],[93.01,19.92]]]},{"n":"Montenegro","r":[[[20.06,42.55],[20.05,42.55],[19.94,42.51],[19.86,42.49],[19.79,42.48],[19.75,42.5],[19.74,42.53],[19.74,42.61],[19.73,42.63],[19.7,42.65],[19.65,42.63],[19.6,42.57],[19.54,42.49],[19.47,42.42],[19.4,42.34],[19.33,42.25],[19.28,42.17],[19.33,42.13],[19.36,42.07],[19.35,42.02],[19.36,42.0],[19.35,41.92],[19.34,41.87],[19.19,41.95],[19.12,42.06],[18.89,42.25],[18.63,42.38],[18.62,42.4],[18.63,42.42],[18.65,42.44],[18.59,42.44],[18.55,42.43],[18.52,42.43],[18.48,42.48],[18.44,42.52],[18.44,42.56],[18.45,42.56],[18.48,42.58],[18.53,42.62],[18.55,42.64],[18.54,42.67],[18.47,42.78],[18.46,42.84],[18.44,42.97],[18.46,43.0],[18.49,43.01],[18.62,43.03],[18.62,43.12],[18.63,43.15],[18.66,43.19],[18.67,43.23],[18.75,43.28],[18.85,43.35],[18.9,43.35],[18.93,43.34],[18.98,43.29],[19.03,43.29],[19.04,43.36],[18.97,43.44],[18.94,43.5],[18.95,43.53],[18.97,43.54],[19.03,43.53],[19.08,43.52],[19.11,43.53],[19.16,43.54],[19.19,43.53],[19.19,43.52],[19.2,43.49],[19.22,43.45],[19.3,43.41],[19.41,43.34],[19.55,43.21],[19.61,43.17],[19.67,43.16],[19.78,43.11],[19.86,43.1],[19.94,43.08],[20.17,42.97],[20.27,42.94],[20.34,42.89],[20.35,42.85],[20.34,42.83],[20.22,42.8],[20.19,42.75],[20.13,42.76],[20.05,42.76],[20.03,42.73],[20.07,42.69],[20.09,42.63],[20.07,42.56],[20.06,42.55]]]},{"n":"Mongolia","r":[[[116.68,49.82],[116.59,49.68],[116.4,49.41],[116.24,49.17],[116.16,49.04],[116.1,48.94],[116.03,48.84],[116.03,48.78],[115.95,48.69],[115.82,48.58],[115.79,48.46],[115.8,48.35],[115.79,48.25],[115.64,48.19],[115.53,48.13],[115.56,47.95],[115.62,47.87],[115.71,47.8],[115.81,47.74],[115.9,47.69],[115.99,47.71],[116.07,47.79],[116.23,47.86],[116.32,47.86],[116.38,47.84],[116.51,47.84],[116.65,47.86],[116.76,47.87],[116.9,47.85],[116.95,47.84],[117.07,47.81],[117.2,47.74],[117.29,47.67],[117.35,47.65],[117.38,47.68],[117.46,47.74],[117.56,47.8],[117.68,47.91],[117.77,47.99],[117.84,48.0],[117.98,48.0],[118.04,48.02],[118.15,48.03],[118.24,48.0],[118.5,47.98],[118.57,47.94],[118.69,47.82],[118.76,47.76],[118.88,47.73],[118.95,47.7],[119.02,47.69],[119.08,47.65],[119.1,47.62],[119.12,47.56],[119.16,47.53],[119.24,47.49],[119.29,47.47],[119.31,47.43],[119.33,47.41],[119.38,47.38],[119.53,47.26],[119.6,47.22],[119.71,47.15],[119.76,47.09],[119.76,47.03],[119.79,46.98],[119.86,46.91],[119.9,46.86],[119.88,46.79],[119.9,46.73],[119.87,46.67],[119.75,46.63],[119.71,46.61],[119.62,46.6],[119.47,46.63],[119.33,46.61],[119.16,46.64],[119.03,46.69],[118.96,46.73],[118.84,46.76],[118.79,46.75],[118.72,46.69],[118.65,46.7],[118.58,46.69],[118.4,46.7],[118.31,46.72],[118.16,46.68],[118.07,46.67],[117.91,46.62],[117.81,46.54],[117.74,46.52],[117.67,46.52],[117.62,46.55],[117.55,46.59],[117.44,46.59],[117.41,46.57],[117.39,46.54],[117.36,46.44],[117.36,46.39],[117.33,46.36],[117.27,46.35],[117.16,46.36],[116.98,46.36],[116.86,46.39],[116.79,46.38],[116.69,46.32],[116.62,46.31],[116.56,46.29],[116.52,46.21],[116.44,46.16],[116.36,46.1],[116.26,45.96],[116.21,45.89],[116.23,45.85],[116.24,45.8],[116.2,45.74],[116.11,45.69],[116.04,45.68],[115.93,45.63],[115.79,45.53],[115.68,45.46],[115.54,45.44],[115.44,45.42],[115.22,45.4],[115.16,45.39],[114.92,45.38],[114.74,45.42],[114.64,45.41],[114.56,45.39],[114.52,45.36],[114.5,45.32],[114.49,45.27],[114.42,45.2],[114.28,45.11],[114.17,45.05],[114.08,44.97],[114.03,44.94],[113.93,44.91],[113.88,44.9],[113.75,44.83],[113.65,44.76],[113.59,44.75],[113.51,44.76],[113.46,44.77],[113.3,44.79],[113.2,44.79],[113.05,44.81],[112.71,44.88],[112.6,44.92],[112.5,45.01],[112.41,45.06],[112.29,45.06],[112.11,45.06],[112.03,45.08],[111.9,45.06],[111.75,44.97],[111.68,44.9],[111.62,44.83],[111.55,44.67],[111.51,44.57],[111.49,44.51],[111.41,44.42],[111.4,44.37],[111.43,44.32],[111.49,44.27],[111.52,44.19],[111.6,44.11],[111.68,44.04],[111.84,43.93],[111.88,43.88],[111.93,43.81],[111.94,43.75],[111.93,43.71],[111.88,43.68],[111.77,43.66],[111.72,43.62],[111.64,43.56],[111.55,43.5],[111.5,43.49],[111.45,43.47],[111.19,43.39],[111.09,43.37],[111.01,43.34],[110.91,43.26],[110.84,43.19],[110.75,43.11],[110.71,43.07],[110.63,42.99],[110.52,42.9],[110.46,42.84],[110.43,42.81],[110.4,42.77],[110.29,42.74],[110.2,42.71],[110.06,42.66],[109.86,42.61],[109.7,42.55],[109.6,42.51],[109.44,42.46],[109.34,42.44],[109.13,42.44],[108.87,42.43],[108.69,42.42],[108.55,42.43],[108.33,42.44],[108.17,42.45],[108.06,42.43],[107.81,42.41],[107.75,42.4],[107.29,42.35],[107.09,42.32],[106.91,42.31],[106.77,42.29],[106.69,42.26],[106.58,42.23],[106.52,42.21],[106.32,42.14],[105.87,41.99],[105.57,41.88],[105.52,41.85],[105.31,41.77],[105.2,41.74],[105.12,41.66],[105.05,41.62],[104.98,41.6],[104.86,41.64],[104.77,41.64],[104.5,41.66],[104.5,41.88],[104.31,41.85],[104.0,41.8],[103.71,41.75],[103.45,41.86],[103.25,41.94],[103.07,42.01],[102.81,42.05],[102.58,42.09],[102.16,42.16],[101.97,42.22],[101.88,42.29],[101.71,42.47],[101.66,42.5],[101.58,42.52],[101.5,42.54],[101.31,42.54],[101.09,42.55],[100.77,42.59],[100.52,42.62],[100.09,42.67],[99.98,42.68],[99.76,42.63],[99.47,42.57],[98.95,42.62],[98.72,42.64],[98.25,42.68],[97.72,42.74],[97.21,42.79],[96.83,42.76],[96.63,42.74],[96.39,42.72],[96.35,42.75],[96.34,42.85],[96.3,42.93],[96.17,43.01],[96.08,43.1],[95.91,43.21],[95.86,43.28],[95.84,43.38],[95.69,43.66],[95.59,43.85],[95.57,43.89],[95.53,43.95],[95.47,43.99],[95.36,44.01],[95.33,44.04],[95.33,44.1],[95.34,44.2],[95.37,44.26],[95.35,44.28],[95.05,44.26],[94.87,44.3],[94.71,44.35],[94.49,44.47],[94.36,44.52],[94.2,44.65],[93.96,44.67],[93.87,44.72],[93.76,44.83],[93.66,44.9],[93.52,44.94],[93.29,44.98],[92.92,45.02],[92.79,45.04],[92.58,45.01],[92.42,45.01],[92.17,45.04],[92.03,45.07],[91.85,45.07],[91.74,45.07],[91.58,45.08],[91.51,45.1],[91.44,45.12],[91.31,45.12],[91.22,45.14],[91.14,45.19],[91.05,45.22],[90.95,45.22],[90.91,45.19],[90.88,45.2],[90.85,45.26],[90.76,45.37],[90.75,45.42],[90.69,45.47],[90.66,45.53],[90.67,45.6],[90.71,45.73],[90.8,45.85],[90.85,45.89],[90.89,45.92],[90.96,45.99],[91.0,46.04],[91.0,46.1],[90.95,46.18],[90.91,46.27],[90.92,46.32],[90.97,46.39],[91.03,46.53],[91.03,46.57],[91.0,46.6],[91.0,46.66],[90.99,46.75],[90.91,46.88],[90.87,46.95],[90.8,46.99],[90.72,47.0],[90.64,47.1],[90.55,47.21],[90.5,47.29],[90.48,47.33],[90.47,47.41],[90.43,47.5],[90.38,47.56],[90.35,47.6],[90.33,47.66],[90.31,47.68],[90.19,47.7],[90.1,47.75],[90.07,47.8],[90.05,47.85],[90.03,47.88],[89.96,47.89],[89.91,47.84],[89.83,47.82],[89.78,47.83],[89.73,47.85],[89.69,47.88],[89.64,47.91],[89.56,48.0],[89.48,48.03],[89.33,48.02],[89.2,47.98],[89.12,47.99],[89.05,48.0],[88.97,48.05],[88.92,48.09],[88.84,48.1],[88.68,48.17],[88.58,48.22],[88.57,48.32],[88.52,48.38],[88.41,48.4],[88.31,48.47],[88.16,48.51],[88.06,48.54],[87.98,48.56],[87.97,48.58],[87.97,48.6],[88.01,48.64],[88.05,48.68],[88.06,48.71],[88.03,48.74],[87.94,48.77],[87.83,48.79],[87.81,48.84],[87.74,48.88],[87.75,48.92],[87.81,48.95],[87.86,48.97],[87.87,49.0],[87.83,49.03],[87.82,49.08],[87.83,49.12],[87.81,49.16],[87.82,49.16],[87.93,49.16],[87.99,49.19],[88.03,49.22],[88.12,49.26],[88.13,49.3],[88.14,49.38],[88.19,49.45],[88.34,49.47],[88.39,49.48],[88.45,49.47],[88.54,49.48],[88.63,49.49],[88.68,49.46],[88.75,49.45],[88.83,49.45],[88.86,49.48],[88.86,49.53],[88.9,49.54],[88.95,49.51],[88.97,49.48],[89.01,49.47],[89.11,49.5],[89.18,49.53],[89.2,49.6],[89.24,49.63],[89.3,49.61],[89.4,49.61],[89.48,49.66],[89.58,49.7],[89.65,49.72],[89.67,49.75],[89.63,49.82],[89.64,49.9],[89.74,49.95],[89.88,49.95],[89.98,49.98],[90.0,50.07],[90.05,50.09],[90.1,50.1],[90.22,50.12],[90.31,50.15],[90.36,50.17],[90.52,50.21],[90.66,50.22],[90.71,50.26],[90.76,50.31],[90.84,50.32],[90.92,50.36],[91.02,50.42],[91.06,50.42],[91.23,50.45],[91.3,50.46],[91.34,50.47],[91.42,50.47],[91.45,50.52],[91.52,50.56],[91.6,50.58],[91.63,50.62],[91.71,50.67],[91.8,50.69],[91.96,50.7],[92.1,50.69],[92.19,50.7],[92.27,50.78],[92.28,50.81],[92.3,50.85],[92.35,50.86],[92.43,50.8],[92.49,50.77],[92.58,50.73],[92.63,50.69],[92.68,50.68],[92.74,50.71],[92.78,50.78],[92.86,50.79],[92.94,50.78],[92.96,50.74],[92.97,50.71],[93.01,50.65],[93.1,50.6],[93.22,50.61],[93.27,50.62],[93.39,50.61],[93.5,50.6],[93.63,50.59],[93.66,50.58],[93.8,50.58],[93.99,50.57],[94.08,50.57],[94.25,50.56],[94.29,50.51],[94.32,50.4],[94.35,50.3],[94.35,50.22],[94.4,50.18],[94.46,50.17],[94.5,50.13],[94.56,50.09],[94.61,50.02],[94.68,50.03],[94.72,50.04],[94.81,50.05],[94.93,50.04],[95.01,50.01],[95.04,49.96],[95.11,49.94],[95.17,49.94],[95.33,49.94],[95.39,49.94],[95.44,49.92],[95.52,49.91],[95.57,49.94],[95.71,49.97],[95.79,50.01],[95.85,50.01],[95.9,49.99],[95.94,49.96],[95.99,49.97],[96.02,50.0],[96.07,50.0],[96.11,49.98],[96.23,49.95],[96.32,49.9],[96.38,49.9],[96.47,49.91],[96.51,49.92],[96.54,49.89],[96.6,49.88],[96.64,49.9],[96.71,49.91],[96.99,49.88],[97.05,49.83],[97.1,49.81],[97.14,49.76],[97.21,49.73],[97.36,49.74],[97.42,49.77],[97.54,49.84],[97.59,49.91],[97.65,49.93],[97.72,49.94],[97.79,49.94],[97.85,49.95],[97.94,50.0],[98.0,50.01],[98.1,50.08],[98.12,50.11],[98.17,50.18],[98.2,50.23],[98.25,50.3],[98.28,50.42],[98.29,50.49],[98.28,50.53],[98.22,50.56],[98.15,50.57],[98.08,50.6],[98.03,50.64],[98.0,50.7],[97.96,50.77],[97.96,50.82],[97.95,50.86],[97.92,50.89],[97.86,50.94],[97.83,50.99],[97.84,51.05],[97.91,51.17],[97.92,51.22],[97.93,51.25],[97.92,51.28],[97.95,51.35],[97.99,51.38],[98.04,51.45],[98.1,51.48],[98.18,51.49],[98.22,51.51],[98.24,51.58],[98.28,51.63],[98.3,51.67],[98.35,51.72],[98.64,51.8],[98.76,51.91],[98.8,51.96],[98.85,52.07],[98.89,52.12],[98.96,52.1],[99.03,52.04],[99.09,52.03],[99.18,52.0],[99.41,51.92],[99.53,51.9],[99.61,51.89],[99.72,51.87],[99.79,51.83],[99.92,51.76],[100.03,51.74],[100.23,51.73],[100.47,51.73],[100.54,51.71],[100.71,51.66],[100.9,51.6],[101.09,51.55],[101.22,51.51],[101.3,51.47],[101.38,51.45],[101.46,51.47],[101.57,51.47],[101.82,51.42],[101.98,51.38],[102.11,51.35],[102.16,51.31],[102.16,51.26],[102.14,51.22],[102.15,51.11],[102.19,51.05],[102.21,50.97],[102.23,50.9],[102.22,50.83],[102.24,50.79],[102.28,50.77],[102.32,50.72],[102.3,50.67],[102.29,50.63],[102.29,50.59],[102.34,50.54],[102.41,50.54],[102.47,50.53],[102.55,50.46],[102.68,50.39],[102.77,50.37],[102.86,50.33],[103.04,50.3],[103.16,50.29],[103.23,50.26],[103.3,50.2],[103.42,50.19],[103.5,50.16],[103.63,50.14],[103.72,50.15],[103.8,50.18],[103.86,50.17],[103.96,50.16],[104.08,50.15],[104.18,50.17],[104.26,50.21],[104.35,50.28],[104.47,50.31],[104.6,50.32],[104.69,50.34],[104.98,50.38],[105.09,50.39],[105.19,50.43],[105.27,50.46],[105.38,50.47],[105.54,50.44],[105.69,50.41],[105.88,50.41],[106.0,50.37],[106.08,50.33],[106.22,50.3],[106.37,50.32],[106.57,50.33],[106.71,50.31],[106.85,50.25],[106.94,50.2],[107.04,50.09],[107.14,50.03],[107.23,49.99],[107.35,49.99],[107.63,49.98],[107.79,49.96],[107.92,49.95],[107.95,49.92],[107.93,49.85],[107.94,49.74],[107.94,49.69],[107.97,49.65],[108.01,49.65],[108.03,49.59],[108.1,49.56],[108.21,49.52],[108.41,49.4],[108.52,49.34],[108.61,49.32],[108.73,49.34],[108.92,49.34],[109.24,49.33],[109.45,49.3],[109.53,49.27],[109.75,49.24],[109.99,49.21],[110.2,49.17],[110.32,49.22],[110.43,49.22],[110.53,49.19],[110.63,49.14],[110.71,49.14],[110.83,49.17],[111.2,49.3],[111.34,49.36],[111.43,49.34],[111.51,49.36],[111.57,49.38],[111.74,49.4],[111.83,49.4],[111.93,49.42],[112.08,49.42],[112.38,49.51],[112.49,49.53],[112.7,49.51],[112.81,49.52],[112.91,49.57],[113.06,49.62],[113.09,49.69],[113.16,49.8],[113.32,49.87],[113.45,49.94],[113.57,50.01],[113.73,50.06],[113.88,50.1],[114.07,50.2],[114.22,50.26],[114.3,50.27],[114.39,50.26],[114.55,50.24],[114.67,50.25],[114.74,50.23],[114.88,50.18],[115.0,50.14],[115.1,50.06],[115.27,49.95],[115.37,49.91],[115.43,49.9],[115.59,49.89],[115.72,49.88],[115.8,49.91],[115.93,49.95],[116.13,50.01],[116.22,50.01],[116.35,49.98],[116.55,49.92],[116.63,49.88],[116.68,49.82]]]},{"n":"Northern Mariana Islands","r":[[[145.26,14.16],[145.22,14.11],[145.18,14.12],[145.16,14.14],[145.15,14.16],[145.23,14.19],[145.27,14.18],[145.26,14.16]],[[145.66,14.97],[145.62,14.92],[145.59,15.0],[145.59,15.03],[145.62,15.06],[145.65,15.06],[145.66,14.97]],[[145.75,15.13],[145.75,15.11],[145.7,15.11],[145.68,15.13],[145.71,15.22],[145.79,15.26],[145.82,15.27],[145.79,15.22],[145.78,15.17],[145.75,15.13]],[[145.71,16.34],[145.69,16.33],[145.66,16.34],[145.64,16.35],[145.63,16.38],[145.7,16.38],[145.72,16.36],[145.71,16.34]],[[145.78,18.08],[145.73,18.06],[145.79,18.16],[145.81,18.17],[145.84,18.14],[145.78,18.08]],[[145.71,18.76],[145.68,18.73],[145.65,18.75],[145.65,18.81],[145.69,18.8],[145.71,18.79],[145.71,18.76]]]},{"n":"Mozambique","r":[[[32.11,-26.84],[32.11,-26.52],[32.08,-26.45],[32.05,-26.35],[32.04,-26.28],[32.06,-26.22],[32.07,-26.11],[32.06,-26.02],[31.97,-25.97],[31.95,-25.96],[31.93,-25.89],[31.92,-25.77],[31.98,-25.63],[31.98,-25.36],[31.99,-25.26],[31.99,-25.07],[31.98,-24.84],[31.98,-24.64],[31.99,-24.46],[31.97,-24.38],[31.95,-24.33],[31.91,-24.24],[31.86,-24.04],[31.8,-23.89],[31.72,-23.79],[31.7,-23.74],[31.68,-23.67],[31.6,-23.55],[31.55,-23.48],[31.53,-23.43],[31.53,-23.28],[31.47,-23.02],[31.42,-22.83],[31.35,-22.62],[31.3,-22.48],[31.29,-22.45],[31.29,-22.4],[31.43,-22.3],[31.57,-22.15],[31.74,-21.98],[31.89,-21.83],[32.02,-21.7],[32.19,-21.52],[32.37,-21.33],[32.41,-21.31],[32.43,-21.3],[32.35,-21.14],[32.48,-20.95],[32.48,-20.83],[32.48,-20.71],[32.49,-20.66],[32.53,-20.61],[32.67,-20.52],[32.78,-20.36],[32.87,-20.22],[32.99,-19.98],[33.0,-19.93],[33.01,-19.87],[32.97,-19.8],[32.89,-19.67],[32.83,-19.56],[32.78,-19.39],[32.83,-19.24],[32.85,-19.15],[32.85,-19.1],[32.83,-19.06],[32.77,-19.02],[32.72,-19.0],[32.7,-18.94],[32.7,-18.87],[32.72,-18.83],[32.85,-18.76],[32.88,-18.73],[32.9,-18.69],[32.9,-18.63],[32.94,-18.49],[32.99,-18.36],[33.0,-18.31],[32.98,-18.27],[32.96,-18.2],[32.96,-18.08],[32.95,-17.77],[32.98,-17.44],[32.97,-17.25],[32.88,-17.04],[32.88,-16.88],[32.94,-16.78],[32.95,-16.71],[32.9,-16.7],[32.81,-16.7],[32.74,-16.68],[32.64,-16.59],[32.45,-16.52],[32.24,-16.45],[31.94,-16.43],[31.69,-16.21],[31.49,-16.18],[31.43,-16.15],[31.24,-16.02],[30.94,-16.01],[30.63,-16.0],[30.44,-16.0],[30.41,-15.98],[30.4,-15.8],[30.4,-15.64],[30.38,-15.51],[30.35,-15.35],[30.31,-15.29],[30.25,-15.18],[30.22,-15.07],[30.22,-15.01],[30.23,-14.99],[30.45,-14.91],[30.54,-14.87],[30.67,-14.82],[30.92,-14.75],[31.13,-14.69],[31.33,-14.64],[31.54,-14.58],[31.62,-14.54],[31.73,-14.5],[31.98,-14.41],[32.05,-14.39],[32.2,-14.34],[32.27,-14.32],[32.55,-14.23],[32.87,-14.12],[32.99,-14.08],[33.2,-14.01],[33.24,-14.04],[33.39,-14.29],[33.51,-14.43],[33.64,-14.57],[33.66,-14.56],[33.7,-14.53],[33.76,-14.52],[33.97,-14.49],[34.05,-14.49],[34.1,-14.45],[34.21,-14.42],[34.33,-14.41],[34.38,-14.42],[34.51,-14.6],[34.52,-14.73],[34.55,-14.92],[34.56,-15.02],[34.56,-15.14],[34.54,-15.3],[34.43,-15.48],[34.41,-15.57],[34.36,-15.71],[34.28,-15.77],[34.25,-15.83],[34.25,-15.89],[34.29,-15.94],[34.38,-16.02],[34.4,-16.08],[34.4,-16.13],[34.4,-16.2],[34.42,-16.25],[34.44,-16.27],[34.53,-16.32],[34.61,-16.43],[34.76,-16.57],[34.93,-16.76],[35.02,-16.82],[35.08,-16.83],[35.11,-16.9],[35.09,-16.97],[35.04,-17.02],[35.06,-17.08],[35.09,-17.11],[35.12,-17.13],[35.2,-17.13],[35.27,-17.12],[35.29,-17.1],[35.28,-16.81],[35.23,-16.64],[35.18,-16.57],[35.17,-16.56],[35.19,-16.5],[35.24,-16.38],[35.29,-16.25],[35.32,-16.19],[35.36,-16.16],[35.6,-16.13],[35.71,-16.1],[35.76,-16.06],[35.79,-15.96],[35.82,-15.68],[35.83,-15.42],[35.81,-15.27],[35.84,-15.03],[35.89,-14.89],[35.87,-14.86],[35.85,-14.67],[35.69,-14.47],[35.49,-14.2],[35.38,-14.06],[35.25,-13.9],[35.01,-13.64],[34.91,-13.55],[34.85,-13.52],[34.66,-13.49],[34.61,-13.44],[34.56,-13.36],[34.55,-13.22],[34.54,-13.11],[34.52,-12.93],[34.48,-12.67],[34.47,-12.59],[34.41,-12.4],[34.36,-12.21],[34.36,-12.16],[34.38,-12.12],[34.46,-11.98],[34.52,-11.89],[34.55,-11.83],[34.61,-11.69],[34.62,-11.62],[34.66,-11.59],[34.83,-11.58],[34.96,-11.58],[35.18,-11.57],[35.42,-11.58],[35.45,-11.59],[35.5,-11.6],[35.56,-11.6],[35.63,-11.58],[35.7,-11.53],[35.79,-11.45],[35.91,-11.45],[36.08,-11.54],[36.18,-11.61],[36.19,-11.67],[36.31,-11.71],[36.52,-11.72],[36.67,-11.68],[36.77,-11.61],[36.87,-11.57],[36.98,-11.57],[37.06,-11.59],[37.11,-11.65],[37.22,-11.69],[37.37,-11.71],[37.54,-11.68],[37.72,-11.58],[37.83,-11.48],[37.86,-11.38],[37.89,-11.32],[37.92,-11.29],[38.02,-11.28],[38.18,-11.28],[38.32,-11.31],[38.49,-11.41],[38.6,-11.35],[38.79,-11.23],[38.99,-11.17],[39.17,-11.17],[39.32,-11.12],[39.44,-11.03],[39.56,-10.98],[39.69,-10.95],[39.82,-10.91],[39.99,-10.82],[40.17,-10.69],[40.35,-10.55],[40.46,-10.46],[40.52,-10.57],[40.61,-10.66],[40.56,-10.72],[40.49,-10.77],[40.6,-10.83],[40.52,-10.93],[40.51,-11.0],[40.53,-11.03],[40.54,-11.07],[40.49,-11.18],[40.42,-11.27],[40.4,-11.33],[40.47,-11.45],[40.43,-11.66],[40.49,-11.84],[40.51,-11.94],[40.53,-12.0],[40.5,-12.12],[40.51,-12.31],[40.52,-12.39],[40.49,-12.49],[40.55,-12.53],[40.58,-12.64],[40.57,-12.76],[40.55,-12.82],[40.45,-12.9],[40.44,-12.94],[40.44,-12.98],[40.57,-12.98],[40.57,-13.06],[40.56,-13.12],[40.57,-13.22],[40.55,-13.29],[40.58,-13.37],[40.55,-13.46],[40.56,-13.53],[40.56,-13.62],[40.59,-13.85],[40.6,-14.12],[40.6,-14.17],[40.65,-14.2],[40.72,-14.21],[40.71,-14.29],[40.64,-14.39],[40.64,-14.45],[40.65,-14.54],[40.73,-14.42],[40.78,-14.42],[40.82,-14.47],[40.81,-14.54],[40.83,-14.57],[40.82,-14.63],[40.84,-14.72],[40.84,-14.79],[40.78,-14.84],[40.7,-14.93],[40.69,-15.01],[40.69,-15.07],[40.64,-15.08],[40.62,-15.12],[40.65,-15.19],[40.65,-15.26],[40.56,-15.47],[40.31,-15.76],[40.21,-15.87],[40.11,-15.98],[40.11,-16.03],[40.1,-16.07],[39.98,-16.23],[39.86,-16.25],[39.79,-16.29],[39.84,-16.44],[39.76,-16.47],[39.63,-16.58],[39.24,-16.79],[39.18,-16.84],[39.08,-16.97],[38.96,-17.0],[38.88,-17.04],[38.76,-17.06],[38.71,-17.05],[38.67,-17.05],[38.63,-17.08],[38.38,-17.17],[38.14,-17.24],[38.09,-17.28],[38.05,-17.32],[37.84,-17.39],[37.51,-17.57],[37.24,-17.74],[37.05,-17.91],[37.0,-17.93],[36.94,-17.99],[36.92,-18.08],[36.9,-18.13],[36.76,-18.31],[36.54,-18.52],[36.5,-18.58],[36.41,-18.69],[36.4,-18.77],[36.33,-18.79],[36.26,-18.72],[36.24,-18.86],[36.18,-18.87],[36.12,-18.84],[35.98,-18.91],[35.85,-18.99],[35.65,-19.16],[35.37,-19.49],[34.95,-19.81],[34.89,-19.82],[34.85,-19.82],[34.72,-19.71],[34.65,-19.7],[34.71,-19.77],[34.76,-19.82],[34.75,-19.93],[34.75,-20.09],[34.7,-20.4],[34.71,-20.47],[34.76,-20.56],[34.88,-20.67],[34.98,-20.81],[35.12,-21.2],[35.13,-21.4],[35.27,-21.65],[35.27,-21.76],[35.33,-22.04],[35.33,-22.26],[35.32,-22.4],[35.38,-22.45],[35.41,-22.4],[35.4,-22.32],[35.42,-22.18],[35.46,-22.12],[35.49,-22.12],[35.5,-22.19],[35.53,-22.25],[35.54,-22.3],[35.54,-22.38],[35.49,-22.66],[35.51,-22.77],[35.58,-22.96],[35.49,-23.19],[35.38,-23.71],[35.37,-23.8],[35.4,-23.84],[35.46,-23.85],[35.49,-23.78],[35.52,-23.78],[35.54,-23.82],[35.49,-24.07],[35.44,-24.17],[35.25,-24.43],[35.16,-24.54],[34.99,-24.65],[34.61,-24.82],[33.84,-25.07],[33.53,-25.19],[33.35,-25.26],[32.96,-25.49],[32.79,-25.64],[32.72,-25.82],[32.66,-25.9],[32.59,-26.0],[32.65,-26.09],[32.7,-26.16],[32.77,-26.2],[32.8,-26.24],[32.85,-26.27],[32.89,-26.13],[32.92,-26.09],[32.95,-26.08],[32.93,-26.25],[32.89,-26.83],[32.89,-26.85],[32.78,-26.85],[32.59,-26.86],[32.48,-26.86],[32.35,-26.86],[32.2,-26.83],[32.11,-26.84]]]},{"n":"Mauritania","r":[[[-8.68,27.29],[-8.5,27.18],[-8.31,27.06],[-8.12,26.95],[-7.93,26.84],[-7.74,26.73],[-7.56,26.62],[-7.37,26.51],[-7.18,26.4],[-6.99,26.29],[-6.8,26.18],[-6.61,26.07],[-6.43,25.96],[-6.24,25.85],[-6.05,25.74],[-5.86,25.63],[-5.67,25.52],[-5.52,25.42],[-5.28,25.27],[-5.05,25.14],[-4.82,25.0],[-5.17,25.0],[-5.64,25.0],[-5.96,24.99],[-6.29,24.99],[-6.59,24.99],[-6.57,24.77],[-6.54,24.52],[-6.51,24.27],[-6.48,24.02],[-6.45,23.77],[-6.43,23.52],[-6.4,23.27],[-6.37,23.03],[-6.34,22.78],[-6.31,22.53],[-6.28,22.28],[-6.25,22.03],[-6.23,21.78],[-6.2,21.53],[-6.17,21.29],[-6.14,21.04],[-6.11,20.79],[-6.08,20.54],[-6.05,20.29],[-6.03,20.04],[-6.0,19.79],[-5.97,19.54],[-5.94,19.3],[-5.91,19.05],[-5.88,18.8],[-5.86,18.55],[-5.83,18.3],[-5.8,18.05],[-5.77,17.8],[-5.74,17.56],[-5.71,17.31],[-5.68,17.06],[-5.66,16.81],[-5.63,16.57],[-5.51,16.44],[-5.36,16.28],[-5.4,16.06],[-5.46,15.79],[-5.51,15.5],[-5.72,15.5],[-5.93,15.5],[-6.13,15.5],[-6.34,15.5],[-6.54,15.5],[-6.74,15.5],[-6.95,15.5],[-7.15,15.5],[-7.36,15.5],[-7.56,15.5],[-7.76,15.5],[-7.97,15.5],[-8.17,15.5],[-8.38,15.5],[-8.58,15.5],[-8.78,15.5],[-8.99,15.5],[-9.18,15.5],[-9.29,15.5],[-9.34,15.53],[-9.35,15.68],[-9.39,15.67],[-9.43,15.62],[-9.45,15.57],[-9.44,15.51],[-9.45,15.46],[-9.58,15.44],[-9.76,15.4],[-9.94,15.37],[-10.13,15.38],[-10.19,15.4],[-10.26,15.42],[-10.41,15.44],[-10.49,15.44],[-10.59,15.43],[-10.7,15.42],[-10.73,15.39],[-10.82,15.28],[-10.9,15.15],[-10.95,15.15],[-11.01,15.22],[-11.17,15.36],[-11.37,15.54],[-11.46,15.63],[-11.5,15.64],[-11.6,15.57],[-11.68,15.51],[-11.76,15.43],[-11.8,15.34],[-11.83,15.24],[-11.84,15.13],[-11.87,15.0],[-11.94,14.89],[-12.02,14.8],[-12.08,14.77],[-12.1,14.75],[-12.28,14.81],[-12.3,14.82],[-12.41,14.89],[-12.46,14.97],[-12.54,15.04],[-12.66,15.08],[-12.74,15.13],[-12.77,15.19],[-12.81,15.22],[-12.86,15.24],[-12.86,15.26],[-12.85,15.29],[-12.86,15.34],[-12.93,15.45],[-12.99,15.5],[-13.05,15.5],[-13.08,15.51],[-13.1,15.54],[-13.11,15.57],[-13.14,15.6],[-13.21,15.62],[-13.26,15.7],[-13.3,15.85],[-13.35,15.97],[-13.41,16.06],[-13.45,16.09],[-13.49,16.1],[-13.5,16.11],[-13.51,16.14],[-13.56,16.14],[-13.62,16.12],[-13.68,16.13],[-13.71,16.17],[-13.76,16.17],[-13.81,16.14],[-13.87,16.15],[-13.93,16.2],[-13.97,16.26],[-13.98,16.31],[-14.09,16.42],[-14.3,16.58],[-14.53,16.66],[-14.79,16.65],[-14.93,16.65],[-14.96,16.68],[-14.99,16.68],[-15.02,16.65],[-15.06,16.64],[-15.09,16.66],[-15.11,16.64],[-15.12,16.6],[-15.21,16.58],[-15.38,16.58],[-15.52,16.56],[-15.62,16.51],[-15.77,16.49],[-15.96,16.49],[-16.07,16.51],[-16.11,16.54],[-16.17,16.55],[-16.24,16.53],[-16.3,16.45],[-16.36,16.31],[-16.4,16.22],[-16.44,16.2],[-16.48,16.1],[-16.5,15.92],[-16.54,15.84],[-16.54,16.29],[-16.48,16.45],[-16.46,16.6],[-16.35,16.93],[-16.21,17.19],[-16.08,17.55],[-16.03,17.89],[-16.05,18.22],[-16.08,18.52],[-16.15,18.72],[-16.21,19.0],[-16.31,19.15],[-16.48,19.29],[-16.51,19.36],[-16.47,19.39],[-16.37,19.41],[-16.31,19.51],[-16.44,19.47],[-16.28,19.79],[-16.23,20.0],[-16.24,20.14],[-16.21,20.23],[-16.33,20.42],[-16.43,20.65],[-16.48,20.69],[-16.53,20.71],[-16.53,20.65],[-16.56,20.6],[-16.62,20.63],[-16.73,20.81],[-16.88,21.09],[-16.93,21.11],[-16.97,21.08],[-17.0,21.04],[-17.05,20.81],[-17.06,20.9],[-17.04,21.01],[-17.01,21.14],[-16.96,21.33],[-16.84,21.33],[-16.61,21.33],[-16.38,21.33],[-16.15,21.33],[-15.92,21.33],[-15.69,21.33],[-15.46,21.33],[-15.23,21.33],[-15.0,21.33],[-14.77,21.33],[-14.54,21.33],[-14.31,21.33],[-14.08,21.33],[-13.86,21.33],[-13.63,21.33],[-13.4,21.33],[-13.17,21.33],[-13.02,21.33],[-13.03,21.47],[-13.03,21.57],[-13.04,21.71],[-13.05,21.85],[-13.06,22.0],[-13.07,22.13],[-13.08,22.26],[-13.09,22.38],[-13.09,22.5],[-13.11,22.56],[-13.16,22.69],[-13.17,22.75],[-13.15,22.82],[-13.12,22.88],[-13.03,23.0],[-12.9,23.09],[-12.74,23.19],[-12.62,23.27],[-12.56,23.29],[-12.37,23.32],[-12.23,23.38],[-12.08,23.44],[-12.02,23.47],[-12.02,23.58],[-12.02,23.7],[-12.02,23.83],[-12.02,23.97],[-12.02,24.11],[-12.02,24.24],[-12.02,24.38],[-12.02,24.51],[-12.02,24.65],[-12.02,24.79],[-12.02,24.92],[-12.02,25.06],[-12.02,25.2],[-12.02,25.33],[-12.02,25.47],[-12.02,25.6],[-12.02,25.74],[-12.02,25.88],[-12.02,26.0],[-11.87,26.0],[-11.68,26.0],[-11.49,26.0],[-11.31,26.0],[-11.12,26.0],[-10.94,26.0],[-10.75,26.0],[-10.56,26.0],[-10.38,26.0],[-10.19,26.0],[-10.0,26.0],[-9.82,26.0],[-9.63,26.0],[-9.44,26.0],[-9.26,26.0],[-9.07,26.0],[-8.89,26.0],[-8.68,26.0],[-8.68,26.11],[-8.68,26.27],[-8.68,26.5],[-8.68,26.72],[-8.68,26.92],[-8.68,27.12],[-8.68,27.29]],[[-16.37,19.71],[-16.44,19.61],[-16.47,19.65],[-16.48,19.71],[-16.42,19.8],[-16.39,19.85],[-16.34,19.87],[-16.37,19.71]]]},{"n":"Montserrat","r":[[[-62.15,16.74],[-62.15,16.68],[-62.22,16.7],[-62.22,16.75],[-62.19,16.8],[-62.18,16.81],[-62.15,16.74]]]},{"n":"Mauritius","r":[[[57.65,-20.48],[57.52,-20.51],[57.38,-20.5],[57.33,-20.45],[57.32,-20.43],[57.37,-20.41],[57.36,-20.34],[57.39,-20.23],[57.42,-20.18],[57.49,-20.14],[57.52,-20.06],[57.58,-20.0],[57.66,-19.99],[57.74,-20.1],[57.79,-20.21],[57.78,-20.33],[57.72,-20.37],[57.71,-20.43],[57.65,-20.48]]]},{"n":"Malawi","r":[[[34.96,-11.58],[34.83,-11.58],[34.66,-11.59],[34.62,-11.62],[34.61,-11.69],[34.55,-11.83],[34.52,-11.89],[34.46,-11.98],[34.38,-12.12],[34.36,-12.16],[34.36,-12.21],[34.41,-12.4],[34.47,-12.59],[34.48,-12.67],[34.52,-12.93],[34.54,-13.11],[34.55,-13.22],[34.56,-13.36],[34.61,-13.44],[34.66,-13.49],[34.85,-13.52],[34.91,-13.55],[35.01,-13.64],[35.25,-13.9],[35.38,-14.06],[35.49,-14.2],[35.69,-14.47],[35.85,-14.67],[35.87,-14.86],[35.89,-14.89],[35.84,-15.03],[35.81,-15.27],[35.83,-15.42],[35.82,-15.68],[35.79,-15.96],[35.76,-16.06],[35.71,-16.1],[35.6,-16.13],[35.36,-16.16],[35.32,-16.19],[35.29,-16.25],[35.24,-16.38],[35.19,-16.5],[35.17,-16.56],[35.18,-16.57],[35.23,-16.64],[35.28,-16.81],[35.29,-17.1],[35.27,-17.12],[35.2,-17.13],[35.12,-17.13],[35.09,-17.11],[35.06,-17.08],[35.04,-17.02],[35.09,-16.97],[35.11,-16.9],[35.08,-16.83],[35.02,-16.82],[34.93,-16.76],[34.76,-16.57],[34.61,-16.43],[34.53,-16.32],[34.44,-16.27],[34.42,-16.25],[34.4,-16.2],[34.4,-16.13],[34.4,-16.08],[34.38,-16.02],[34.29,-15.94],[34.25,-15.89],[34.25,-15.83],[34.28,-15.77],[34.36,-15.71],[34.41,-15.57],[34.43,-15.48],[34.54,-15.3],[34.56,-15.14],[34.56,-15.02],[34.55,-14.92],[34.52,-14.73],[34.51,-14.6],[34.38,-14.42],[34.33,-14.41],[34.21,-14.42],[34.1,-14.45],[34.05,-14.49],[33.97,-14.49],[33.76,-14.52],[33.7,-14.53],[33.66,-14.56],[33.64,-14.57],[33.51,-14.43],[33.39,-14.29],[33.24,-14.04],[33.2,-14.01],[33.15,-13.94],[33.1,-13.96],[33.04,-14.01],[33.01,-14.02],[32.99,-14.02],[32.98,-14.01],[32.97,-13.98],[32.92,-13.88],[32.87,-13.82],[32.81,-13.79],[32.77,-13.76],[32.79,-13.73],[32.81,-13.71],[32.8,-13.69],[32.77,-13.66],[32.67,-13.61],[32.67,-13.59],[32.76,-13.55],[32.81,-13.5],[32.85,-13.46],[32.9,-13.36],[32.94,-13.26],[32.97,-13.22],[32.98,-13.16],[32.97,-13.08],[32.99,-12.99],[33.0,-12.9],[32.97,-12.86],[32.95,-12.8],[32.98,-12.7],[33.02,-12.63],[33.24,-12.56],[33.4,-12.49],[33.43,-12.46],[33.48,-12.4],[33.51,-12.35],[33.49,-12.33],[33.37,-12.33],[33.34,-12.31],[33.25,-12.11],[33.3,-11.89],[33.31,-11.8],[33.3,-11.69],[33.29,-11.61],[33.25,-11.58],[33.23,-11.53],[33.23,-11.42],[33.27,-11.4],[33.35,-11.25],[33.38,-11.16],[33.34,-11.09],[33.29,-10.98],[33.27,-10.92],[33.26,-10.89],[33.29,-10.85],[33.34,-10.81],[33.4,-10.8],[33.46,-10.78],[33.66,-10.59],[33.66,-10.55],[33.63,-10.49],[33.55,-10.39],[33.54,-10.35],[33.53,-10.23],[33.5,-10.2],[33.39,-10.12],[33.31,-10.04],[33.34,-9.95],[33.35,-9.86],[33.31,-9.81],[33.25,-9.76],[33.21,-9.68],[33.2,-9.63],[33.15,-9.6],[33.1,-9.6],[33.07,-9.64],[33.04,-9.64],[33.0,-9.62],[32.98,-9.57],[32.98,-9.52],[32.95,-9.48],[32.92,-9.43],[32.92,-9.41],[32.94,-9.4],[32.97,-9.4],[33.13,-9.5],[33.23,-9.5],[33.33,-9.52],[33.42,-9.61],[33.47,-9.62],[33.53,-9.61],[33.7,-9.6],[33.77,-9.61],[33.85,-9.66],[33.89,-9.67],[33.94,-9.67],[33.95,-9.66],[33.96,-9.63],[33.95,-9.57],[33.96,-9.53],[34.0,-9.5],[34.09,-9.54],[34.32,-9.73],[34.33,-9.76],[34.48,-9.95],[34.52,-10.03],[34.52,-10.07],[34.57,-10.24],[34.58,-10.32],[34.57,-10.38],[34.57,-10.43],[34.59,-10.5],[34.58,-10.53],[34.64,-10.63],[34.66,-10.71],[34.67,-10.79],[34.65,-10.87],[34.61,-10.99],[34.6,-11.04],[34.61,-11.08],[34.64,-11.13],[34.69,-11.18],[34.73,-11.24],[34.75,-11.31],[34.77,-11.34],[34.8,-11.34],[34.85,-11.35],[34.89,-11.39],[34.94,-11.46],[34.95,-11.54],[34.96,-11.58]],[[34.64,-12.01],[34.62,-12.07],[34.58,-12.07],[34.54,-12.02],[34.55,-11.98],[34.59,-11.97],[34.62,-11.98],[34.64,-12.01]],[[34.71,-12.0],[34.74,-12.01],[34.76,-12.03],[34.76,-12.06],[34.75,-12.09],[34.72,-12.11],[34.68,-12.12],[34.66,-12.1],[34.67,-12.05],[34.68,-12.01],[34.71,-12.0]]]},{"n":"Malaysia","r":[[[115.03,4.9],[115.03,4.82],[115.03,4.69],[115.05,4.58],[115.11,4.39],[115.17,4.36],[115.25,4.35],[115.29,4.35],[115.32,4.37],[115.33,4.38],[115.28,4.46],[115.27,4.63],[115.23,4.75],[115.17,4.87],[115.14,4.9],[115.37,4.93],[115.43,4.97],[115.52,5.05],[115.55,5.09],[115.58,5.19],[115.47,5.25],[115.42,5.33],[115.42,5.41],[115.56,5.57],[115.6,5.6],[115.62,5.55],[115.69,5.54],[115.74,5.53],[115.8,5.54],[115.88,5.61],[115.92,5.72],[116.06,5.88],[116.11,6.0],[116.14,6.13],[116.49,6.52],[116.54,6.58],[116.75,6.98],[116.78,6.99],[116.83,6.95],[116.85,6.83],[116.84,6.77],[116.81,6.69],[116.79,6.61],[116.81,6.61],[116.91,6.66],[117.02,6.8],[117.08,6.92],[117.13,6.97],[117.23,6.94],[117.25,6.92],[117.25,6.83],[117.25,6.78],[117.29,6.68],[117.38,6.61],[117.5,6.57],[117.61,6.51],[117.65,6.47],[117.67,6.43],[117.69,6.35],[117.7,6.27],[117.62,6.2],[117.65,6.07],[117.64,6.0],[117.62,5.94],[117.5,5.88],[117.82,5.94],[117.9,5.97],[118.0,6.05],[118.06,5.98],[118.12,5.86],[118.07,5.83],[117.93,5.79],[117.93,5.77],[117.97,5.71],[118.03,5.71],[118.14,5.75],[118.25,5.82],[118.3,5.82],[118.35,5.81],[118.46,5.76],[118.51,5.73],[118.56,5.68],[118.59,5.59],[118.71,5.56],[118.96,5.43],[119.0,5.42],[119.05,5.42],[119.18,5.43],[119.22,5.41],[119.26,5.37],[119.27,5.31],[119.26,5.25],[119.25,5.2],[119.22,5.16],[119.13,5.1],[118.91,5.02],[118.67,4.96],[118.55,4.97],[118.38,5.02],[118.32,5.01],[118.26,4.99],[118.19,4.83],[118.32,4.67],[118.56,4.5],[118.6,4.46],[118.59,4.41],[118.55,4.38],[118.5,4.36],[118.36,4.34],[118.23,4.32],[118.12,4.29],[118.01,4.25],[117.9,4.26],[117.74,4.34],[117.7,4.34],[117.65,4.3],[117.6,4.2],[117.57,4.17],[117.54,4.17],[117.45,4.19],[117.28,4.3],[117.1,4.34],[116.84,4.34],[116.7,4.35],[116.64,4.34],[116.59,4.34],[116.55,4.36],[116.51,4.37],[116.41,4.31],[116.37,4.33],[116.32,4.35],[116.24,4.36],[116.13,4.36],[116.02,4.29],[115.9,4.35],[115.86,4.35],[115.84,4.33],[115.78,4.25],[115.68,4.19],[115.63,4.08],[115.6,3.98],[115.57,3.94],[115.56,3.73],[115.54,3.63],[115.57,3.5],[115.57,3.45],[115.52,3.36],[115.51,3.34],[115.49,3.21],[115.5,3.17],[115.49,3.13],[115.45,3.03],[115.38,3.01],[115.31,2.99],[115.25,3.03],[115.19,2.97],[115.12,2.89],[115.09,2.84],[115.09,2.79],[115.09,2.76],[115.08,2.72],[115.08,2.69],[115.08,2.63],[115.13,2.61],[115.18,2.57],[115.18,2.52],[115.15,2.49],[115.09,2.45],[114.97,2.35],[114.84,2.27],[114.79,2.25],[114.77,2.21],[114.76,2.16],[114.79,2.05],[114.82,2.02],[114.83,1.98],[114.81,1.93],[114.8,1.89],[114.75,1.87],[114.7,1.85],[114.69,1.82],[114.66,1.69],[114.63,1.62],[114.57,1.51],[114.55,1.47],[114.51,1.45],[114.39,1.5],[114.27,1.47],[114.13,1.45],[114.0,1.46],[113.9,1.43],[113.84,1.38],[113.76,1.31],[113.68,1.26],[113.62,1.24],[113.51,1.31],[113.46,1.3],[113.36,1.33],[113.13,1.41],[113.07,1.43],[113.01,1.43],[112.99,1.46],[113.0,1.5],[112.99,1.55],[112.94,1.57],[112.48,1.56],[112.34,1.51],[112.25,1.48],[112.19,1.44],[112.17,1.34],[112.13,1.24],[112.08,1.14],[111.92,1.11],[111.81,1.01],[111.77,1.0],[111.69,1.01],[111.61,1.02],[111.55,0.99],[111.48,1.0],[111.29,1.04],[111.1,1.05],[111.0,1.03],[110.94,1.02],[110.61,0.88],[110.51,0.86],[110.46,0.88],[110.4,0.94],[110.32,1.0],[110.11,1.19],[110.04,1.24],[109.99,1.28],[109.94,1.34],[109.88,1.4],[109.82,1.44],[109.74,1.52],[109.65,1.61],[109.64,1.78],[109.57,1.81],[109.55,1.85],[109.54,1.9],[109.63,2.03],[109.69,1.89],[109.72,1.86],[109.86,1.76],[109.98,1.72],[110.11,1.7],[110.25,1.69],[110.3,1.7],[110.35,1.72],[110.4,1.7],[110.68,1.55],[110.78,1.52],[110.89,1.53],[110.94,1.52],[111.1,1.4],[111.15,1.39],[111.22,1.4],[111.12,1.45],[111.06,1.49],[111.03,1.56],[111.05,1.63],[111.11,1.68],[111.15,1.74],[111.17,1.9],[111.2,1.99],[111.25,2.06],[111.27,2.14],[111.21,2.2],[111.2,2.3],[111.21,2.38],[111.24,2.44],[111.3,2.4],[111.35,2.36],[111.41,2.37],[111.44,2.38],[111.45,2.42],[111.44,2.5],[111.44,2.63],[111.51,2.74],[111.62,2.82],[111.73,2.85],[112.12,2.91],[112.74,3.07],[112.92,3.13],[112.99,3.16],[113.04,3.21],[113.14,3.34],[113.32,3.56],[113.45,3.74],[113.71,4.0],[113.92,4.24],[113.95,4.29],[113.99,4.42],[113.99,4.48],[113.98,4.55],[114.01,4.58],[114.05,4.59],[114.06,4.59],[114.1,4.57],[114.17,4.53],[114.22,4.48],[114.26,4.41],[114.29,4.35],[114.29,4.3],[114.32,4.26],[114.42,4.26],[114.45,4.2],[114.51,4.11],[114.57,4.05],[114.61,4.02],[114.65,4.04],[114.72,4.1],[114.78,4.17],[114.81,4.27],[114.78,4.28],[114.83,4.35],[114.84,4.39],[114.82,4.43],[114.79,4.46],[114.78,4.55],[114.76,4.67],[114.75,4.72],[114.78,4.75],[114.86,4.8],[114.94,4.86],[115.03,4.9]],[[117.88,4.19],[117.75,4.17],[117.65,4.17],[117.67,4.2],[117.66,4.25],[117.71,4.26],[117.76,4.25],[117.88,4.19]],[[111.39,2.42],[111.36,2.4],[111.31,2.44],[111.3,2.74],[111.33,2.77],[111.36,2.76],[111.38,2.71],[111.38,2.58],[111.38,2.46],[111.39,2.42]],[[104.22,2.73],[104.17,2.72],[104.15,2.73],[104.13,2.77],[104.17,2.86],[104.18,2.87],[104.22,2.77],[104.22,2.73]],[[101.32,2.99],[101.27,2.97],[101.27,3.0],[101.27,3.03],[101.31,3.07],[101.33,3.05],[101.32,2.99]],[[100.29,5.29],[100.26,5.27],[100.19,5.28],[100.2,5.45],[100.25,5.47],[100.31,5.44],[100.34,5.41],[100.29,5.29]],[[99.85,6.47],[99.92,6.36],[99.88,6.31],[99.87,6.3],[99.82,6.31],[99.78,6.27],[99.74,6.26],[99.7,6.34],[99.66,6.37],[99.65,6.42],[99.71,6.43],[99.75,6.41],[99.82,6.45],[99.85,6.47]],[[102.1,6.24],[102.27,6.2],[102.34,6.17],[102.53,5.86],[102.79,5.64],[102.9,5.56],[102.98,5.52],[103.1,5.41],[103.2,5.26],[103.42,4.85],[103.45,4.67],[103.47,4.39],[103.42,3.98],[103.36,3.77],[103.37,3.67],[103.45,3.52],[103.43,3.38],[103.45,3.26],[103.44,2.93],[103.49,2.84],[103.54,2.77],[103.81,2.58],[103.83,2.51],[103.97,2.26],[104.22,1.72],[104.29,1.48],[104.28,1.42],[104.25,1.39],[104.18,1.36],[104.11,1.41],[104.09,1.45],[104.1,1.49],[104.08,1.53],[104.02,1.58],[103.98,1.62],[103.99,1.55],[103.99,1.45],[103.92,1.45],[103.82,1.48],[103.69,1.45],[103.55,1.33],[103.48,1.33],[103.43,1.43],[103.4,1.5],[103.36,1.55],[102.9,1.79],[102.73,1.86],[102.55,2.04],[102.15,2.25],[101.89,2.45],[101.78,2.57],[101.52,2.68],[101.41,2.81],[101.35,2.84],[101.3,2.89],[101.35,3.01],[101.33,3.14],[101.3,3.25],[101.12,3.47],[101.02,3.62],[100.85,3.78],[100.78,3.86],[100.72,3.97],[100.76,4.0],[100.8,4.02],[100.76,4.1],[100.66,4.23],[100.61,4.37],[100.61,4.65],[100.47,5.04],[100.35,5.59],[100.37,5.78],[100.34,5.98],[100.26,6.18],[100.16,6.32],[100.12,6.44],[100.14,6.49],[100.16,6.64],[100.18,6.67],[100.22,6.69],[100.26,6.68],[100.35,6.55],[100.56,6.47],[100.63,6.45],[100.72,6.48],[100.75,6.46],[100.79,6.43],[100.82,6.33],[100.87,6.25],[100.99,6.26],[101.03,6.25],[101.05,6.24],[101.08,6.17],[101.09,6.03],[101.08,5.96],[100.99,5.85],[100.98,5.77],[101.03,5.72],[101.08,5.67],[101.11,5.64],[101.15,5.64],[101.19,5.67],[101.23,5.73],[101.26,5.79],[101.4,5.85],[101.56,5.91],[101.58,5.9],[101.6,5.88],[101.65,5.8],[101.68,5.78],[101.72,5.77],[101.79,5.78],[101.87,5.83],[101.92,5.91],[101.94,5.98],[102.06,6.1],[102.07,6.18],[102.1,6.24]],[[117.14,7.17],[117.08,7.12],[117.06,7.18],[117.06,7.26],[117.15,7.34],[117.26,7.35],[117.28,7.29],[117.27,7.22],[117.24,7.18],[117.14,7.17]]]},{"n":"Namibia","r":[[[11.74,-17.25],[11.9,-17.23],[12.01,-17.17],[12.11,-17.16],[12.21,-17.21],[12.32,-17.21],[12.36,-17.21],[12.55,-17.21],[12.66,-17.16],[12.79,-17.11],[12.86,-17.06],[12.96,-17.02],[13.1,-16.97],[13.18,-16.97],[13.28,-16.99],[13.4,-17.01],[13.48,-17.04],[13.56,-17.14],[13.69,-17.23],[13.79,-17.29],[13.9,-17.36],[13.94,-17.39],[13.99,-17.4],[14.02,-17.41],[14.23,-17.4],[14.41,-17.39],[14.62,-17.39],[15.0,-17.39],[15.38,-17.39],[15.77,-17.39],[16.15,-17.39],[16.53,-17.39],[16.91,-17.39],[17.3,-17.39],[17.68,-17.39],[17.84,-17.39],[18.11,-17.4],[18.4,-17.4],[18.43,-17.41],[18.46,-17.42],[18.49,-17.44],[18.59,-17.57],[18.72,-17.7],[18.83,-17.77],[18.96,-17.8],[19.08,-17.82],[19.19,-17.81],[19.38,-17.83],[19.64,-17.87],[19.91,-17.88],[20.19,-17.86],[20.39,-17.89],[20.51,-17.95],[20.63,-18.0],[20.75,-18.02],[20.91,-18.01],[21.11,-17.96],[21.29,-17.96],[21.37,-18.0],[21.42,-18.0],[21.72,-17.95],[21.96,-17.91],[22.32,-17.84],[22.62,-17.78],[23.07,-17.7],[23.38,-17.64],[23.59,-17.6],[23.8,-17.56],[24.04,-17.52],[24.23,-17.49],[24.27,-17.48],[24.73,-17.52],[24.93,-17.54],[25.0,-17.57],[25.09,-17.63],[25.26,-17.79],[25.22,-17.79],[24.91,-17.82],[24.79,-17.86],[24.53,-18.05],[24.47,-18.03],[24.41,-17.99],[24.36,-17.98],[24.24,-18.02],[24.13,-18.08],[24.0,-18.15],[23.9,-18.23],[23.86,-18.27],[23.7,-18.42],[23.65,-18.45],[23.6,-18.46],[23.58,-18.45],[23.56,-18.39],[23.46,-18.23],[23.3,-18.03],[23.25,-18.01],[23.22,-18.0],[23.1,-18.01],[22.75,-18.07],[22.46,-18.12],[22.01,-18.2],[21.53,-18.27],[21.23,-18.31],[20.97,-18.32],[20.97,-18.52],[20.98,-18.93],[20.98,-19.34],[20.98,-19.74],[20.98,-20.15],[20.98,-20.56],[20.98,-20.97],[20.98,-21.38],[20.98,-21.78],[20.98,-21.96],[20.97,-22.0],[20.82,-22.0],[20.49,-22.0],[20.21,-22.0],[19.98,-22.0],[19.98,-22.24],[19.98,-22.53],[19.98,-22.82],[19.98,-23.1],[19.98,-23.39],[19.98,-23.68],[19.98,-23.96],[19.98,-24.25],[19.98,-24.54],[19.98,-24.75],[19.98,-24.78],[19.98,-25.2],[19.98,-25.64],[19.98,-26.09],[19.98,-26.53],[19.98,-26.98],[19.98,-27.42],[19.98,-27.87],[19.98,-28.31],[19.98,-28.45],[19.88,-28.45],[19.67,-28.5],[19.54,-28.57],[19.48,-28.66],[19.41,-28.71],[19.31,-28.73],[19.27,-28.78],[19.28,-28.85],[19.25,-28.9],[19.16,-28.94],[19.03,-28.93],[18.84,-28.87],[18.6,-28.86],[18.31,-28.89],[18.1,-28.87],[17.98,-28.81],[17.84,-28.78],[17.7,-28.77],[17.62,-28.74],[17.45,-28.7],[17.42,-28.62],[17.4,-28.56],[17.35,-28.5],[17.34,-28.45],[17.38,-28.41],[17.39,-28.35],[17.36,-28.27],[17.31,-28.23],[17.25,-28.23],[17.2,-28.2],[17.19,-28.13],[17.15,-28.08],[17.06,-28.03],[16.93,-28.07],[16.88,-28.13],[16.84,-28.22],[16.81,-28.26],[16.79,-28.34],[16.79,-28.39],[16.76,-28.45],[16.72,-28.48],[16.69,-28.46],[16.63,-28.49],[16.49,-28.57],[16.45,-28.62],[16.34,-28.54],[16.01,-28.23],[15.89,-28.15],[15.72,-27.97],[15.34,-27.39],[15.29,-27.28],[15.22,-27.0],[15.13,-26.79],[15.12,-26.67],[15.16,-26.6],[15.14,-26.51],[15.1,-26.43],[14.97,-26.32],[14.93,-25.96],[14.85,-25.73],[14.86,-25.53],[14.82,-25.36],[14.82,-25.25],[14.84,-25.03],[14.77,-24.79],[14.63,-24.55],[14.5,-24.2],[14.48,-24.05],[14.5,-23.64],[14.47,-23.48],[14.47,-23.28],[14.42,-23.08],[14.4,-22.97],[14.44,-22.88],[14.46,-22.91],[14.5,-22.92],[14.52,-22.81],[14.53,-22.7],[14.46,-22.45],[14.32,-22.19],[13.97,-21.77],[13.89,-21.61],[13.84,-21.47],[13.45,-20.92],[13.28,-20.52],[13.17,-20.18],[13.04,-20.03],[12.46,-18.93],[12.33,-18.75],[12.1,-18.54],[12.04,-18.47],[11.95,-18.27],[11.78,-18.0],[11.73,-17.75],[11.72,-17.47],[11.74,-17.25]]]},{"n":"New Caledonia","r":[[[167.54,-22.62],[167.51,-22.66],[167.47,-22.65],[167.44,-22.64],[167.42,-22.62],[167.44,-22.54],[167.53,-22.58],[167.54,-22.62]],[[168.01,-21.43],[168.06,-21.45],[168.14,-21.45],[168.12,-21.62],[168.01,-21.64],[167.97,-21.64],[167.94,-21.61],[167.88,-21.58],[167.88,-21.52],[167.82,-21.39],[167.93,-21.37],[167.99,-21.34],[167.98,-21.37],[167.99,-21.41],[168.01,-21.43]],[[167.4,-21.16],[167.35,-21.17],[167.27,-21.1],[167.13,-21.06],[167.07,-21.0],[167.03,-20.92],[167.11,-20.9],[167.19,-20.8],[167.14,-20.77],[167.05,-20.76],[167.06,-20.72],[167.2,-20.67],[167.27,-20.7],[167.3,-20.73],[167.29,-20.89],[167.36,-20.94],[167.43,-21.06],[167.43,-21.09],[167.4,-21.16]],[[166.55,-20.7],[166.49,-20.71],[166.56,-20.62],[166.56,-20.56],[166.59,-20.45],[166.58,-20.41],[166.62,-20.42],[166.67,-20.45],[166.62,-20.48],[166.6,-20.53],[166.6,-20.59],[166.62,-20.6],[166.59,-20.66],[166.55,-20.7]],[[164.2,-20.25],[164.32,-20.31],[164.44,-20.28],[164.59,-20.38],[164.98,-20.68],[165.11,-20.74],[165.19,-20.77],[165.25,-20.82],[165.31,-20.89],[165.38,-20.94],[165.41,-20.98],[165.42,-21.04],[165.45,-21.08],[165.58,-21.18],[165.66,-21.27],[165.77,-21.31],[165.82,-21.36],[165.89,-21.39],[165.95,-21.44],[166.06,-21.48],[166.3,-21.64],[166.49,-21.78],[166.59,-21.87],[166.69,-21.95],[166.82,-22.02],[166.94,-22.09],[167.0,-22.26],[166.97,-22.32],[166.9,-22.35],[166.83,-22.36],[166.77,-22.38],[166.57,-22.27],[166.52,-22.25],[166.47,-22.26],[166.44,-22.23],[166.42,-22.2],[166.29,-22.16],[166.18,-22.09],[166.14,-22.04],[166.12,-21.99],[166.1,-21.96],[165.93,-21.91],[165.82,-21.85],[165.74,-21.78],[165.62,-21.72],[165.43,-21.62],[165.33,-21.58],[165.24,-21.53],[165.01,-21.33],[164.93,-21.29],[164.86,-21.2],[164.66,-20.99],[164.56,-20.91],[164.45,-20.83],[164.37,-20.74],[164.31,-20.63],[164.17,-20.48],[164.15,-20.41],[164.16,-20.35],[164.12,-20.3],[164.07,-20.28],[164.04,-20.23],[164.04,-20.17],[164.06,-20.14],[164.2,-20.25]],[[159.95,-19.31],[159.94,-19.33],[159.93,-19.17],[159.96,-19.11],[159.98,-19.24],[159.95,-19.31]]]},{"n":"Niger","r":[[[3.6,11.7],[3.53,11.79],[3.45,11.85],[3.36,11.88],[3.3,11.93],[3.27,11.99],[3.15,12.12],[2.88,12.37],[2.85,12.37],[2.81,12.38],[2.73,12.35],[2.68,12.31],[2.65,12.3],[2.6,12.29],[2.47,12.26],[2.37,12.22],[2.36,12.19],[2.41,12.0],[2.39,11.9],[2.34,11.95],[2.19,12.14],[2.09,12.28],[2.07,12.31],[2.06,12.36],[2.07,12.38],[2.11,12.39],[2.2,12.41],[2.22,12.43],[2.23,12.47],[2.21,12.54],[2.16,12.64],[2.1,12.7],[2.07,12.71],[2.02,12.72],[1.96,12.71],[1.84,12.63],[1.79,12.61],[1.67,12.62],[1.56,12.64],[1.5,12.68],[1.31,12.83],[1.1,13.0],[1.01,13.02],[0.99,13.04],[0.97,13.17],[0.98,13.32],[0.99,13.36],[1.08,13.34],[1.17,13.33],[1.2,13.36],[1.13,13.41],[1.02,13.47],[0.98,13.55],[0.95,13.58],[0.9,13.61],[0.84,13.63],[0.79,13.65],[0.75,13.67],[0.68,13.69],[0.62,13.7],[0.52,13.84],[0.43,13.97],[0.37,14.08],[0.35,14.14],[0.38,14.25],[0.35,14.29],[0.25,14.4],[0.16,14.5],[0.19,14.65],[0.2,14.78],[0.2,14.87],[0.22,14.91],[0.23,14.96],[0.29,14.98],[0.43,14.98],[0.72,14.95],[0.95,14.98],[0.96,14.99],[1.12,15.13],[1.3,15.27],[1.57,15.29],[1.86,15.3],[2.09,15.31],[2.42,15.32],[2.69,15.33],[3.0,15.34],[3.01,15.41],[3.03,15.42],[3.06,15.43],[3.29,15.39],[3.5,15.36],[3.52,15.48],[3.71,15.64],[3.82,15.67],[3.84,15.7],[3.88,15.76],[3.9,15.84],[3.91,15.9],[3.95,15.95],[3.98,16.04],[4.01,16.19],[4.12,16.36],[4.18,16.58],[4.19,16.8],[4.2,16.96],[4.23,17.0],[4.23,17.29],[4.23,17.58],[4.23,17.83],[4.23,18.14],[4.23,18.41],[4.23,18.7],[4.23,18.97],[4.23,19.14],[4.45,19.18],[4.67,19.23],[5.0,19.29],[5.36,19.36],[5.75,19.43],[5.84,19.48],[6.13,19.73],[6.26,19.85],[6.53,20.07],[6.73,20.25],[6.99,20.47],[7.26,20.69],[7.48,20.87],[7.83,21.08],[8.34,21.38],[8.86,21.69],[9.38,21.99],[9.9,22.3],[10.41,22.6],[10.93,22.91],[11.45,23.21],[11.97,23.52],[12.49,23.4],[12.98,23.29],[13.48,23.18],[13.6,23.12],[13.86,22.9],[14.2,22.62],[14.22,22.62],[14.23,22.62],[14.56,22.78],[14.98,23.0],[14.98,23.0],[15.09,22.42],[15.17,21.92],[15.18,21.61],[15.18,21.52],[15.22,21.47],[15.29,21.41],[15.61,20.95],[15.54,20.87],[15.59,20.73],[15.67,20.67],[15.93,20.4],[15.96,20.35],[15.95,20.3],[15.77,19.98],[15.74,19.9],[15.7,19.5],[15.67,19.21],[15.64,18.81],[15.6,18.34],[15.56,17.94],[15.52,17.41],[15.47,16.91],[15.21,16.63],[14.75,16.15],[14.37,15.75],[14.18,15.48],[13.81,14.97],[13.64,14.63],[13.51,14.46],[13.45,14.38],[13.51,14.13],[13.61,13.7],[13.43,13.7],[13.32,13.67],[13.19,13.57],[13.05,13.53],[12.87,13.45],[12.76,13.38],[12.65,13.33],[12.51,13.19],[12.46,13.09],[12.32,13.07],[12.12,13.09],[11.99,13.19],[11.69,13.3],[11.5,13.34],[11.41,13.35],[10.96,13.37],[10.48,13.33],[10.23,13.28],[10.18,13.27],[10.05,13.21],[9.93,13.14],[9.62,12.81],[9.2,12.82],[8.96,12.86],[8.75,12.91],[8.46,13.06],[8.1,13.29],[7.96,13.32],[7.83,13.34],[7.79,13.34],[7.36,13.11],[7.27,13.11],[7.17,13.09],[7.11,13.03],[7.06,13.0],[7.01,13.0],[6.94,13.01],[6.87,13.04],[6.8,13.11],[6.63,13.36],[6.59,13.41],[6.51,13.49],[6.39,13.6],[6.3,13.66],[6.25,13.67],[6.18,13.66],[5.84,13.77],[5.49,13.87],[5.42,13.86],[5.36,13.84],[5.24,13.76],[5.1,13.74],[4.92,13.75],[4.82,13.76],[4.66,13.73],[4.56,13.7],[4.42,13.65],[4.24,13.5],[4.19,13.48],[4.15,13.46],[4.09,13.06],[4.04,12.93],[3.95,12.78],[3.77,12.62],[3.65,12.53],[3.64,12.41],[3.63,12.2],[3.63,12.06],[3.64,11.97],[3.62,11.93],[3.61,11.89],[3.62,11.83],[3.65,11.8],[3.66,11.76],[3.65,11.73],[3.6,11.7]]]},{"n":"Norfolk Island","r":[[[167.94,-29.02],[167.96,-29.03],[167.98,-29.03],[167.99,-29.04],[167.99,-29.06],[167.98,-29.08],[167.97,-29.08],[167.96,-29.09],[167.96,-29.09],[167.96,-29.09],[167.96,-29.1],[167.95,-29.08],[167.94,-29.07],[167.93,-29.07],[167.93,-29.08],[167.92,-29.08],[167.92,-29.07],[167.91,-29.06],[167.91,-29.05],[167.92,-29.05],[167.92,-29.04],[167.92,-29.03],[167.92,-29.03],[167.91,-29.03],[167.92,-29.01],[167.94,-29.02]]]},{"n":"Nigeria","r":[[[2.71,6.37],[2.71,6.43],[2.74,6.6],[2.75,6.66],[2.77,6.71],[2.75,6.77],[2.73,6.85],[2.72,6.98],[2.75,7.02],[2.76,7.07],[2.75,7.14],[2.75,7.4],[2.77,7.42],[2.78,7.44],[2.79,7.48],[2.75,7.54],[2.72,7.62],[2.72,7.72],[2.71,7.83],[2.69,7.87],[2.7,8.05],[2.71,8.27],[2.7,8.37],[2.72,8.44],[2.73,8.61],[2.73,8.78],[2.77,9.05],[2.9,9.06],[3.04,9.08],[3.11,9.19],[3.15,9.32],[3.14,9.45],[3.16,9.49],[3.22,9.57],[3.33,9.67],[3.33,9.78],[3.35,9.81],[3.4,9.84],[3.48,9.85],[3.56,9.91],[3.6,10.0],[3.65,10.16],[3.58,10.27],[3.58,10.29],[3.6,10.35],[3.65,10.41],[3.68,10.43],[3.76,10.41],[3.77,10.42],[3.78,10.44],[3.83,10.61],[3.83,10.65],[3.76,10.77],[3.74,10.85],[3.73,10.97],[3.72,11.08],[3.7,11.12],[3.66,11.15],[3.64,11.18],[3.49,11.4],[3.49,11.5],[3.55,11.63],[3.6,11.7],[3.65,11.73],[3.66,11.76],[3.65,11.8],[3.62,11.83],[3.61,11.89],[3.62,11.93],[3.64,11.97],[3.63,12.06],[3.63,12.2],[3.64,12.41],[3.65,12.53],[3.77,12.62],[3.95,12.78],[4.04,12.93],[4.09,13.06],[4.15,13.46],[4.19,13.48],[4.24,13.5],[4.42,13.65],[4.56,13.7],[4.66,13.73],[4.82,13.76],[4.92,13.75],[5.1,13.74],[5.24,13.76],[5.36,13.84],[5.42,13.86],[5.49,13.87],[5.84,13.77],[6.18,13.66],[6.25,13.67],[6.3,13.66],[6.39,13.6],[6.51,13.49],[6.59,13.41],[6.63,13.36],[6.8,13.11],[6.87,13.04],[6.94,13.01],[7.01,13.0],[7.06,13.0],[7.11,13.03],[7.17,13.09],[7.27,13.11],[7.36,13.11],[7.79,13.34],[7.83,13.34],[7.96,13.32],[8.1,13.29],[8.46,13.06],[8.75,12.91],[8.96,12.86],[9.2,12.82],[9.62,12.81],[9.93,13.14],[10.05,13.21],[10.18,13.27],[10.23,13.28],[10.48,13.33],[10.96,13.37],[11.41,13.35],[11.5,13.34],[11.69,13.3],[11.99,13.19],[12.12,13.09],[12.32,13.07],[12.46,13.09],[12.51,13.19],[12.65,13.33],[12.76,13.38],[12.87,13.45],[13.05,13.53],[13.19,13.57],[13.32,13.67],[13.43,13.7],[13.61,13.7],[13.76,13.49],[13.93,13.26],[14.06,13.08],[14.16,12.61],[14.17,12.52],[14.18,12.48],[14.18,12.45],[14.2,12.38],[14.27,12.36],[14.42,12.34],[14.52,12.3],[14.58,12.22],[14.59,12.21],[14.62,12.15],[14.63,12.11],[14.62,11.99],[14.6,11.83],[14.56,11.73],[14.58,11.59],[14.58,11.53],[14.56,11.49],[14.5,11.45],[14.41,11.4],[14.2,11.27],[14.14,11.25],[14.06,11.25],[13.98,11.21],[13.89,11.14],[13.7,10.87],[13.54,10.61],[13.48,10.38],[13.41,10.17],[13.27,10.04],[13.25,9.96],[13.24,9.92],[13.24,9.81],[13.22,9.65],[13.2,9.56],[13.18,9.54],[13.02,9.49],[12.93,9.43],[12.88,9.3],[12.86,9.17],[12.82,9.02],[12.81,8.89],[12.78,8.82],[12.73,8.75],[12.65,8.67],[12.58,8.62],[12.4,8.6],[12.31,8.42],[12.23,8.28],[12.23,8.23],[12.16,7.94],[12.03,7.73],[12.02,7.65],[12.02,7.59],[11.85,7.4],[11.81,7.35],[11.77,7.27],[11.81,7.2],[11.85,7.14],[11.86,7.12],[11.79,7.06],[11.66,6.95],[11.58,6.89],[11.56,6.85],[11.55,6.7],[11.53,6.66],[11.48,6.6],[11.4,6.53],[11.32,6.48],[11.24,6.45],[11.15,6.44],[11.11,6.46],[11.08,6.51],[11.03,6.7],[11.01,6.74],[10.95,6.78],[10.85,6.88],[10.74,6.99],[10.61,7.06],[10.58,7.06],[10.56,7.04],[10.52,6.93],[10.48,6.89],[10.41,6.88],[10.29,6.88],[10.21,6.89],[10.19,6.91],[10.17,6.96],[10.14,7.0],[10.04,6.92],[9.87,6.8],[9.82,6.78],[9.78,6.76],[9.73,6.65],[9.66,6.53],[9.57,6.47],[9.49,6.42],[9.44,6.37],[9.37,6.32],[9.24,6.19],[9.06,6.01],[9.0,5.92],[8.94,5.78],[8.9,5.63],[8.86,5.46],[8.8,5.2],[8.72,5.05],[8.64,4.93],[8.59,4.83],[8.56,4.76],[8.54,4.76],[8.51,4.72],[8.43,4.75],[8.39,4.81],[8.34,4.82],[8.25,4.92],[8.23,4.91],[8.33,4.66],[8.29,4.56],[8.03,4.56],[7.8,4.52],[7.64,4.53],[7.57,4.56],[7.53,4.66],[7.52,4.65],[7.51,4.59],[7.46,4.56],[7.28,4.55],[7.21,4.61],[7.14,4.68],[7.08,4.72],[7.09,4.69],[7.16,4.62],[7.15,4.51],[7.01,4.4],[6.92,4.39],[6.87,4.44],[6.84,4.52],[6.82,4.65],[6.79,4.72],[6.77,4.72],[6.79,4.65],[6.79,4.59],[6.79,4.47],[6.86,4.37],[6.76,4.34],[6.72,4.34],[6.63,4.34],[6.62,4.38],[6.6,4.46],[6.58,4.48],[6.55,4.34],[6.5,4.33],[6.46,4.33],[6.3,4.3],[6.26,4.31],[6.26,4.33],[6.28,4.37],[6.27,4.43],[6.21,4.39],[6.21,4.29],[6.17,4.28],[6.08,4.29],[5.97,4.34],[5.91,4.39],[5.8,4.46],[5.59,4.65],[5.55,4.73],[5.49,4.84],[5.45,4.95],[5.38,5.13],[5.4,5.14],[5.45,5.13],[5.48,5.15],[5.39,5.17],[5.37,5.2],[5.36,5.26],[5.37,5.34],[5.44,5.37],[5.5,5.38],[5.53,5.43],[5.55,5.47],[5.39,5.4],[5.23,5.48],[5.2,5.53],[5.22,5.57],[5.29,5.58],[5.39,5.57],[5.46,5.61],[5.42,5.62],[5.35,5.62],[5.33,5.65],[5.33,5.71],[5.31,5.69],[5.28,5.64],[5.17,5.6],[5.11,5.64],[5.11,5.73],[5.09,5.77],[5.04,5.8],[4.86,6.03],[4.63,6.22],[4.43,6.35],[4.13,6.41],[3.49,6.41],[3.45,6.43],[3.49,6.46],[3.55,6.48],[3.75,6.58],[3.72,6.6],[3.5,6.53],[3.43,6.52],[3.34,6.4],[2.77,6.38],[2.71,6.37]],[[7.3,4.42],[7.2,4.39],[7.14,4.4],[7.23,4.53],[7.27,4.5],[7.33,4.49],[7.3,4.42]]]},{"n":"Nicaragua","r":[[[-83.64,10.92],[-83.66,10.84],[-83.71,10.79],[-83.81,10.74],[-83.92,10.74],[-84.1,10.78],[-84.17,10.78],[-84.2,10.8],[-84.2,10.84],[-84.26,10.9],[-84.35,10.98],[-84.4,10.97],[-84.49,10.99],[-84.63,11.05],[-84.7,11.05],[-84.8,11.01],[-84.91,10.95],[-85.18,11.04],[-85.37,11.11],[-85.54,11.17],[-85.58,11.19],[-85.62,11.18],[-85.65,11.15],[-85.69,11.1],[-85.7,11.08],[-85.72,11.07],[-85.74,11.06],[-85.75,11.09],[-85.83,11.2],[-85.96,11.33],[-86.47,11.74],[-86.66,11.98],[-86.76,12.16],[-86.85,12.25],[-87.13,12.43],[-87.19,12.51],[-87.46,12.76],[-87.67,12.9],[-87.67,12.97],[-87.59,13.04],[-87.54,13.04],[-87.5,12.98],[-87.42,12.92],[-87.39,12.92],[-87.34,12.95],[-87.34,12.98],[-87.06,12.99],[-87.01,13.01],[-86.96,13.05],[-86.93,13.12],[-86.93,13.18],[-86.92,13.22],[-86.87,13.27],[-86.79,13.28],[-86.73,13.28],[-86.71,13.31],[-86.73,13.41],[-86.76,13.64],[-86.77,13.7],[-86.76,13.75],[-86.73,13.76],[-86.61,13.77],[-86.38,13.76],[-86.33,13.77],[-86.24,13.9],[-86.15,13.99],[-86.09,14.04],[-86.04,14.05],[-85.98,13.97],[-85.79,13.84],[-85.75,13.85],[-85.73,13.86],[-85.73,13.88],[-85.73,13.93],[-85.68,13.98],[-85.58,14.03],[-85.48,14.11],[-85.37,14.22],[-85.28,14.29],[-85.21,14.31],[-85.18,14.34],[-85.2,14.39],[-85.19,14.45],[-85.16,14.53],[-85.12,14.57],[-85.06,14.58],[-85.04,14.61],[-85.05,14.64],[-85.04,14.69],[-84.99,14.75],[-84.86,14.81],[-84.79,14.79],[-84.73,14.71],[-84.65,14.66],[-84.54,14.63],[-84.45,14.64],[-84.39,14.69],[-84.34,14.71],[-84.29,14.69],[-84.27,14.7],[-84.26,14.74],[-84.24,14.75],[-84.19,14.73],[-84.15,14.72],[-84.11,14.73],[-84.1,14.75],[-84.09,14.77],[-84.07,14.79],[-83.97,14.77],[-83.87,14.79],[-83.75,14.86],[-83.67,14.88],[-83.64,14.88],[-83.59,14.91],[-83.54,14.98],[-83.42,15.01],[-83.16,14.99],[-83.19,14.96],[-83.22,14.93],[-83.28,14.81],[-83.3,14.8],[-83.31,14.89],[-83.34,14.9],[-83.39,14.87],[-83.41,14.83],[-83.37,14.77],[-83.34,14.77],[-83.3,14.75],[-83.19,14.34],[-83.21,14.27],[-83.28,14.15],[-83.35,14.06],[-83.41,14.0],[-83.49,13.74],[-83.57,13.32],[-83.51,12.94],[-83.54,12.6],[-83.52,12.51],[-83.51,12.41],[-83.57,12.39],[-83.6,12.4],[-83.63,12.46],[-83.62,12.51],[-83.59,12.58],[-83.58,12.67],[-83.59,12.71],[-83.63,12.61],[-83.68,12.57],[-83.72,12.55],[-83.75,12.5],[-83.72,12.41],[-83.67,12.34],[-83.65,12.29],[-83.67,12.23],[-83.68,12.02],[-83.7,12.03],[-83.72,12.06],[-83.77,12.06],[-83.77,11.98],[-83.77,11.93],[-83.81,11.9],[-83.83,11.86],[-83.79,11.84],[-83.75,11.82],[-83.7,11.82],[-83.66,11.72],[-83.65,11.64],[-83.74,11.57],[-83.78,11.5],[-83.83,11.43],[-83.86,11.35],[-83.87,11.3],[-83.83,11.13],[-83.77,11.01],[-83.71,10.93],[-83.64,10.92]]]},{"n":"Niue","r":[[[-169.8,-19.08],[-169.9,-19.14],[-169.95,-19.07],[-169.91,-18.99],[-169.86,-18.97],[-169.83,-18.97],[-169.79,-19.04],[-169.8,-19.08]]]},{"n":"Netherlands","r":[[[5.99,50.75],[5.8,50.75],[5.75,50.76],[5.69,50.77],[5.69,50.77],[5.67,50.81],[5.64,50.84],[5.65,50.87],[5.74,50.93],[5.75,50.95],[5.74,50.96],[5.75,50.99],[5.82,51.09],[5.83,51.13],[5.8,51.15],[5.75,51.17],[5.61,51.2],[5.54,51.24],[5.51,51.28],[5.48,51.29],[5.43,51.27],[5.31,51.26],[5.21,51.28],[5.1,51.35],[5.07,51.41],[5.06,51.45],[5.03,51.47],[4.99,51.45],[4.94,51.41],[4.85,51.4],[4.82,51.41],[4.82,51.43],[4.81,51.45],[4.78,51.48],[4.76,51.49],[4.63,51.42],[4.59,51.42],[4.53,51.45],[4.5,51.47],[4.44,51.46],[4.38,51.43],[4.4,51.37],[4.37,51.36],[4.3,51.36],[4.23,51.39],[4.14,51.4],[4.01,51.44],[3.82,51.41],[3.69,51.45],[3.59,51.45],[3.52,51.49],[3.45,51.54],[3.5,51.58],[3.55,51.59],[3.74,51.6],[3.89,51.57],[4.14,51.46],[4.21,51.46],[4.27,51.47],[4.24,51.5],[4.18,51.52],[4.08,51.55],[4.0,51.6],[4.18,51.61],[4.16,51.63],[4.13,51.67],[3.95,51.81],[3.98,51.85],[4.03,51.93],[4.08,51.99],[4.13,52.01],[4.21,52.06],[4.38,52.2],[4.48,52.31],[4.56,52.44],[4.68,52.81],[4.71,52.87],[4.77,52.94],[4.84,52.93],[4.89,52.91],[5.06,52.96],[5.36,53.1],[5.45,53.21],[5.53,53.27],[5.87,53.38],[6.06,53.41],[6.35,53.42],[6.56,53.43],[6.82,53.44],[6.91,53.38],[6.97,53.33],[7.06,53.3],[7.2,53.28],[7.19,53.19],[7.19,53.0],[7.18,52.97],[7.12,52.89],[7.05,52.74],[7.03,52.65],[7.01,52.63],[6.75,52.63],[6.71,52.62],[6.71,52.6],[6.72,52.57],[6.71,52.55],[6.69,52.53],[6.7,52.5],[6.75,52.46],[6.83,52.44],[6.92,52.44],[6.97,52.44],[7.0,52.42],[7.04,52.38],[7.03,52.33],[7.02,52.27],[6.98,52.21],[6.86,52.14],[6.8,52.11],[6.75,52.1],[6.72,52.08],[6.71,52.06],[6.72,52.04],[6.8,51.98],[6.8,51.97],[6.78,51.94],[6.74,51.91],[6.52,51.85],[6.42,51.86],[6.37,51.83],[6.36,51.82],[6.3,51.85],[6.17,51.88],[6.12,51.87],[6.09,51.85],[6.01,51.83],[5.95,51.8],[5.95,51.76],[6.05,51.66],[6.09,51.64],[6.09,51.6],[6.14,51.55],[6.19,51.49],[6.2,51.45],[6.19,51.41],[6.17,51.35],[6.08,51.22],[6.07,51.2],[6.08,51.18],[6.11,51.17],[6.14,51.16],[6.13,51.15],[5.96,51.06],[5.94,51.04],[5.87,51.05],[5.86,51.03],[5.87,51.01],[5.89,50.98],[5.96,50.97],[6.01,50.95],[6.05,50.9],[5.99,50.75]],[[4.23,51.39],[4.21,51.35],[4.17,51.31],[4.04,51.25],[3.9,51.21],[3.83,51.21],[3.78,51.23],[3.76,51.25],[3.68,51.28],[3.58,51.29],[3.52,51.26],[3.47,51.24],[3.43,51.25],[3.4,51.26],[3.38,51.29],[3.35,51.38],[3.43,51.39],[3.59,51.4],[3.72,51.37],[3.88,51.35],[4.01,51.4],[4.11,51.36],[4.23,51.39]],[[-68.21,12.14],[-68.25,12.03],[-68.28,12.08],[-68.29,12.17],[-68.31,12.21],[-68.35,12.23],[-68.37,12.26],[-68.37,12.3],[-68.22,12.23],[-68.21,12.14]],[[-62.94,17.5],[-62.96,17.48],[-62.98,17.48],[-63.0,17.5],[-63.0,17.53],[-62.98,17.52],[-62.97,17.52],[-62.97,17.51],[-62.94,17.5]],[[-63.23,17.62],[-63.24,17.62],[-63.25,17.63],[-63.25,17.65],[-63.24,17.65],[-63.23,17.65],[-63.23,17.63],[-63.23,17.62]],[[3.95,51.74],[4.05,51.68],[4.07,51.67],[4.08,51.65],[3.95,51.63],[3.82,51.69],[3.73,51.68],[3.7,51.71],[3.7,51.73],[3.79,51.75],[3.95,51.74]],[[4.89,53.07],[4.79,53.0],[4.73,53.02],[4.71,53.04],[4.74,53.09],[4.89,53.18],[4.89,53.07]],[[5.11,53.31],[4.92,53.23],[4.91,53.25],[5.03,53.31],[5.11,53.31]],[[5.33,53.39],[5.23,53.38],[5.19,53.39],[5.42,53.43],[5.56,53.44],[5.58,53.44],[5.33,53.39]],[[5.93,53.46],[5.73,53.44],[5.67,53.45],[5.65,53.47],[5.71,53.47],[5.88,53.48],[5.93,53.46],[5.93,53.46]],[[6.33,53.51],[6.19,53.48],[6.16,53.48],[6.17,53.49],[6.29,53.51],[6.33,53.51]],[[6.73,53.58],[6.64,53.58],[6.67,53.61],[6.75,53.63],[6.8,53.63],[6.73,53.58]]]},{"n":"Norway","r":[[[28.97,69.02],[28.89,69.06],[28.83,69.12],[28.85,69.18],[29.02,69.29],[29.19,69.37],[29.24,69.39],[29.33,69.47],[29.14,69.67],[28.8,69.73],[28.41,69.82],[28.27,69.87],[28.05,69.97],[27.89,70.06],[27.75,70.06],[27.59,70.04],[27.35,69.96],[27.21,69.92],[27.13,69.91],[27.11,69.9],[26.93,69.93],[26.74,69.93],[26.58,69.93],[26.53,69.92],[26.31,69.78],[26.16,69.71],[26.07,69.69],[26.01,69.65],[25.96,69.59],[25.85,69.37],[25.77,69.28],[25.75,69.23],[25.77,69.08],[25.75,68.99],[25.65,68.92],[25.58,68.89],[25.48,68.88],[25.36,68.86],[25.25,68.82],[25.17,68.77],[25.09,68.64],[24.94,68.59],[24.8,68.61],[24.7,68.65],[24.49,68.69],[24.33,68.71],[24.15,68.76],[24.0,68.8],[23.85,68.81],[23.77,68.76],[23.71,68.71],[23.46,68.68],[23.32,68.65],[23.14,68.64],[23.07,68.67],[22.81,68.7],[22.5,68.72],[22.41,68.72],[22.38,68.78],[22.3,68.86],[22.08,68.99],[21.99,69.04],[21.82,69.15],[21.62,69.27],[21.59,69.27],[21.46,69.28],[21.27,69.27],[21.14,69.25],[21.07,69.21],[21.05,69.19],[21.13,69.08],[21.1,69.05],[21.07,69.04],[20.89,69.07],[20.68,69.07],[20.62,69.04],[20.49,69.03],[20.12,69.02],[20.28,68.93],[20.34,68.9],[20.35,68.85],[20.32,68.75],[20.24,68.67],[20.15,68.61],[19.97,68.54],[20.24,68.48],[20.06,68.39],[19.97,68.36],[19.87,68.36],[19.69,68.39],[19.26,68.47],[19.05,68.49],[18.87,68.5],[18.77,68.5],[18.38,68.56],[18.3,68.56],[18.16,68.53],[18.15,68.47],[18.16,68.32],[18.18,68.2],[18.12,68.13],[18.07,68.09],[17.92,67.96],[17.56,68.05],[17.32,68.1],[17.17,68.03],[16.78,67.9],[16.59,67.63],[16.57,67.62],[16.46,67.55],[16.31,67.52],[16.19,67.51],[16.13,67.43],[16.28,67.31],[16.36,67.25],[16.43,67.16],[16.42,67.09],[16.4,67.05],[16.24,66.98],[15.88,66.77],[15.56,66.55],[15.42,66.49],[15.48,66.31],[15.37,66.25],[15.15,66.19],[15.04,66.17],[14.92,66.15],[14.54,66.13],[14.61,65.93],[14.64,65.85],[14.63,65.79],[14.6,65.74],[14.55,65.65],[14.48,65.3],[14.43,65.26],[14.35,65.17],[14.12,64.95],[13.92,64.8],[13.65,64.58],[13.87,64.51],[14.08,64.46],[14.12,64.39],[14.15,64.26],[14.14,64.17],[14.06,64.1],[14.0,64.04],[13.96,64.01],[13.67,64.04],[13.3,64.07],[13.2,64.08],[12.99,64.05],[12.79,64.0],[12.69,63.96],[12.66,63.94],[12.53,63.84],[12.3,63.67],[12.18,63.6],[12.21,63.49],[12.0,63.29],[12.14,63.09],[12.14,63.08],[12.22,63.0],[12.14,62.95],[12.11,62.92],[12.12,62.83],[12.14,62.72],[12.12,62.66],[12.11,62.59],[12.3,62.29],[12.3,62.21],[12.29,62.17],[12.23,61.98],[12.16,61.72],[12.29,61.65],[12.49,61.57],[12.6,61.54],[12.76,61.45],[12.88,61.35],[12.86,61.29],[12.83,61.22],[12.78,61.17],[12.73,61.11],[12.71,61.06],[12.68,61.05],[12.47,61.04],[12.35,61.02],[12.29,61.0],[12.31,60.89],[12.45,60.69],[12.55,60.55],[12.59,60.45],[12.55,60.35],[12.52,60.31],[12.51,60.24],[12.49,60.11],[12.4,60.04],[12.29,59.97],[12.17,59.91],[12.07,59.9],[11.99,59.89],[11.93,59.86],[11.88,59.78],[11.83,59.7],[11.68,59.59],[11.68,59.56],[11.74,59.43],[11.8,59.29],[11.75,59.16],[11.71,59.02],[11.64,58.93],[11.54,58.89],[11.47,58.91],[11.39,59.04],[11.39,59.07],[11.37,59.1],[11.13,59.14],[11.09,59.14],[11.0,59.16],[10.95,59.17],[10.83,59.18],[10.74,59.3],[10.64,59.39],[10.63,59.43],[10.63,59.6],[10.6,59.68],[10.6,59.76],[10.53,59.7],[10.57,59.59],[10.49,59.54],[10.4,59.52],[10.41,59.46],[10.45,59.44],[10.45,59.38],[10.43,59.28],[10.24,59.06],[10.21,59.04],[10.18,59.01],[10.08,59.03],[9.96,58.97],[9.84,58.96],[9.8,59.03],[9.64,59.12],[9.56,59.11],[9.63,59.07],[9.7,59.01],[9.66,58.97],[9.62,58.95],[9.55,58.93],[9.31,58.86],[9.4,58.81],[9.32,58.75],[9.24,58.74],[9.19,58.71],[9.18,58.68],[8.93,58.57],[8.52,58.3],[8.31,58.22],[8.17,58.15],[8.04,58.15],[7.88,58.08],[7.47,58.02],[7.19,58.05],[7.0,58.02],[6.9,58.07],[6.89,58.1],[6.9,58.12],[6.91,58.14],[6.88,58.15],[6.8,58.15],[6.77,58.13],[6.77,58.08],[6.73,58.07],[6.59,58.1],[6.56,58.12],[6.61,58.18],[6.69,58.22],[6.68,58.23],[6.66,58.26],[6.62,58.27],[6.49,58.26],[6.39,58.27],[6.05,58.38],[5.98,58.43],[5.71,58.52],[5.59,58.62],[5.52,58.73],[5.52,58.82],[5.56,58.98],[5.61,59.01],[5.85,58.96],[6.1,58.87],[6.14,58.87],[6.21,58.94],[6.36,59.0],[6.32,59.02],[6.1,58.95],[6.02,58.99],[5.89,59.06],[5.89,59.1],[5.95,59.14],[5.97,59.19],[5.94,59.23],[5.95,59.3],[6.05,59.37],[6.2,59.44],[6.31,59.51],[6.42,59.55],[6.4,59.56],[6.28,59.53],[6.16,59.49],[6.02,59.41],[5.85,59.35],[5.72,59.33],[5.66,59.31],[5.56,59.29],[5.47,59.2],[5.36,59.17],[5.17,59.16],[5.13,59.23],[5.19,59.45],[5.24,59.56],[5.3,59.64],[5.4,59.66],[5.47,59.71],[5.53,59.71],[5.58,59.69],[5.77,59.66],[5.87,59.73],[5.99,59.74],[6.22,59.82],[6.21,59.83],[6.06,59.82],[5.97,59.81],[5.83,59.79],[5.76,59.81],[5.73,59.86],[5.78,59.91],[6.0,60.03],[6.07,60.08],[6.11,60.13],[6.11,60.17],[6.14,60.23],[6.35,60.35],[6.52,60.41],[6.57,60.36],[6.53,60.21],[6.53,60.15],[6.66,60.37],[6.72,60.42],[6.79,60.45],[6.95,60.48],[7.0,60.51],[6.81,60.5],[6.35,60.42],[6.15,60.35],[6.1,60.29],[5.97,60.21],[5.9,60.15],[5.88,60.07],[5.8,60.03],[5.7,60.01],[5.56,59.91],[5.49,59.83],[5.35,59.76],[5.26,59.71],[5.23,59.69],[5.19,59.64],[5.15,59.64],[5.11,59.67],[5.1,59.73],[5.12,59.83],[5.19,59.91],[5.22,59.98],[5.17,60.05],[5.21,60.09],[5.27,60.09],[5.38,60.07],[5.49,60.07],[5.69,60.12],[5.66,60.15],[5.57,60.16],[5.42,60.15],[5.29,60.21],[5.18,60.31],[5.14,60.45],[5.17,60.48],[5.55,60.62],[5.65,60.69],[5.59,60.69],[5.45,60.62],[5.24,60.57],[5.12,60.64],[5.05,60.71],[5.01,60.86],[5.02,60.94],[5.01,61.04],[5.1,61.07],[5.19,61.05],[5.29,61.05],[5.51,61.06],[5.98,61.12],[6.29,61.08],[6.42,61.08],[6.61,61.14],[6.78,61.14],[6.9,61.1],[6.97,61.06],[6.98,60.99],[7.04,60.95],[7.08,60.97],[7.05,61.02],[7.04,61.09],[7.55,61.18],[7.6,61.21],[7.4,61.22],[7.35,61.3],[7.45,61.42],[7.44,61.43],[7.33,61.37],[7.28,61.28],[7.3,61.21],[7.28,61.18],[7.17,61.17],[6.94,61.16],[6.79,61.19],[6.66,61.21],[6.61,61.23],[6.63,61.28],[6.6,61.29],[6.54,61.24],[6.49,61.15],[6.38,61.13],[6.08,61.17],[5.65,61.15],[5.45,61.1],[5.32,61.11],[5.11,61.19],[5.02,61.25],[4.99,61.38],[5.0,61.43],[5.17,61.46],[5.26,61.46],[5.34,61.49],[5.27,61.51],[5.17,61.54],[5.1,61.62],[5.0,61.65],[4.93,61.71],[4.91,61.81],[4.93,61.88],[4.99,61.9],[5.12,61.89],[5.47,61.9],[5.79,61.83],[6.02,61.79],[6.47,61.81],[6.73,61.87],[6.68,61.89],[6.4,61.85],[6.13,61.85],[5.66,61.92],[5.47,61.95],[5.27,61.94],[5.16,61.96],[5.1,62.03],[5.14,62.16],[5.24,62.19],[5.29,62.15],[5.36,62.15],[5.42,62.21],[5.48,62.24],[5.53,62.31],[5.72,62.38],[5.8,62.38],[5.91,62.42],[5.98,62.41],[6.03,62.38],[6.08,62.35],[6.21,62.35],[6.58,62.41],[6.62,62.42],[6.69,62.47],[6.46,62.45],[6.26,62.42],[6.14,62.41],[6.12,62.45],[6.16,62.48],[6.24,62.52],[6.27,62.58],[6.35,62.61],[6.44,62.61],[6.62,62.62],[6.74,62.64],[6.96,62.63],[7.28,62.6],[7.49,62.54],[7.57,62.55],[7.65,62.56],[7.69,62.59],[7.53,62.61],[7.52,62.65],[7.54,62.67],[7.8,62.72],[8.1,62.73],[8.05,62.77],[7.41,62.71],[7.24,62.75],[7.11,62.75],[7.02,62.73],[6.78,62.7],[6.73,62.72],[6.78,62.79],[6.93,62.9],[6.94,62.93],[7.01,62.96],[7.39,63.02],[7.57,63.1],[7.65,63.11],[7.74,63.1],[7.86,63.11],[8.1,63.09],[8.21,63.0],[8.31,62.97],[8.62,62.85],[8.61,62.88],[8.34,63.04],[8.24,63.08],[8.16,63.16],[8.18,63.24],[8.27,63.29],[8.58,63.31],[8.64,63.34],[8.64,63.39],[8.59,63.43],[8.48,63.42],[8.39,63.45],[8.36,63.5],[8.4,63.54],[8.58,63.6],[8.67,63.62],[8.84,63.65],[9.14,63.59],[9.16,63.57],[9.08,63.5],[9.08,63.46],[9.16,63.46],[9.32,63.57],[9.52,63.59],[9.6,63.61],[9.7,63.62],[9.83,63.52],[9.89,63.49],[9.94,63.48],[9.98,63.4],[10.02,63.39],[10.08,63.43],[10.19,63.45],[10.34,63.47],[10.59,63.45],[10.7,63.46],[10.76,63.46],[10.71,63.54],[10.67,63.56],[10.73,63.62],[10.78,63.65],[10.95,63.7],[11.12,63.72],[11.23,63.76],[11.37,63.8],[11.35,63.84],[11.31,63.88],[11.21,63.88],[11.18,63.9],[11.29,63.95],[11.46,64.0],[11.43,64.02],[11.31,64.05],[11.21,64.03],[11.08,63.99],[10.91,63.92],[10.97,63.9],[11.05,63.85],[10.93,63.77],[10.34,63.57],[10.06,63.51],[9.92,63.52],[9.89,63.58],[9.83,63.62],[9.77,63.7],[9.66,63.7],[9.59,63.68],[9.57,63.71],[9.61,63.79],[9.71,63.86],[9.86,63.92],[9.94,63.98],[10.01,64.08],[10.24,64.18],[10.57,64.42],[10.83,64.49],[10.93,64.58],[11.09,64.61],[11.23,64.68],[11.33,64.69],[11.52,64.74],[11.63,64.81],[11.56,64.82],[11.39,64.77],[11.3,64.75],[11.3,64.83],[11.35,64.91],[11.49,64.98],[12.16,65.18],[12.23,65.15],[12.31,65.09],[12.51,65.1],[12.74,65.21],[12.92,65.34],[12.82,65.32],[12.72,65.27],[12.51,65.2],[12.42,65.18],[12.36,65.19],[12.33,65.24],[12.26,65.26],[12.2,65.25],[12.13,65.28],[12.12,65.36],[12.21,65.49],[12.27,65.57],[12.34,65.63],[12.63,65.81],[12.69,65.9],[12.82,65.95],[12.98,65.94],[13.03,65.96],[12.98,66.02],[12.79,66.07],[12.78,66.1],[13.39,66.18],[13.67,66.18],[13.76,66.22],[13.92,66.25],[14.03,66.3],[13.97,66.32],[13.68,66.27],[13.5,66.25],[13.42,66.25],[13.35,66.24],[13.12,66.23],[13.07,66.43],[13.1,66.54],[13.19,66.54],[13.21,66.64],[13.31,66.7],[13.45,66.72],[13.52,66.74],[13.62,66.79],[13.79,66.78],[13.96,66.79],[13.92,66.82],[13.7,66.85],[13.65,66.91],[13.73,66.94],[13.81,66.96],[13.88,66.96],[14.02,67.07],[14.11,67.12],[14.21,67.11],[14.34,67.16],[14.47,67.14],[14.6,67.17],[14.78,67.19],[15.42,67.2],[15.43,67.25],[15.3,67.26],[14.82,67.27],[14.58,67.27],[14.48,67.26],[14.44,67.27],[14.45,67.3],[14.54,67.34],[14.58,67.39],[14.75,67.5],[14.96,67.57],[15.12,67.56],[15.29,67.48],[15.41,67.47],[15.47,67.45],[15.55,67.35],[15.59,67.35],[15.58,67.44],[15.69,67.52],[15.66,67.54],[15.49,67.51],[15.35,67.54],[15.25,67.6],[15.22,67.66],[15.28,67.71],[15.35,67.73],[15.3,67.77],[15.04,67.68],[14.85,67.66],[14.78,67.67],[14.82,67.75],[14.8,67.81],[15.05,67.96],[15.13,67.97],[15.27,67.96],[15.4,67.92],[15.51,67.93],[15.62,67.95],[15.61,67.99],[15.36,68.0],[15.29,68.04],[15.32,68.07],[15.49,68.1],[15.66,68.16],[15.85,68.18],[16.01,68.23],[16.04,68.22],[16.06,68.2],[16.12,68.03],[16.26,67.89],[16.31,67.88],[16.26,68.0],[16.31,68.04],[16.37,68.06],[16.39,68.09],[16.32,68.1],[16.26,68.14],[16.17,68.28],[16.2,68.32],[16.39,68.39],[16.62,68.41],[16.86,68.36],[16.95,68.35],[17.09,68.37],[17.34,68.41],[17.48,68.43],[17.55,68.43],[17.57,68.45],[17.5,68.46],[17.48,68.47],[17.43,68.48],[17.2,68.46],[16.58,68.47],[16.53,68.49],[16.51,68.53],[16.58,68.59],[16.65,68.63],[16.88,68.69],[17.13,68.69],[17.39,68.8],[17.49,68.88],[17.55,69.0],[17.7,69.1],[18.1,69.16],[18.12,69.18],[18.08,69.23],[18.08,69.33],[18.19,69.43],[18.26,69.47],[18.29,69.48],[18.38,69.44],[18.48,69.36],[18.65,69.32],[18.86,69.31],[18.92,69.34],[18.75,69.38],[18.62,69.43],[18.61,69.49],[18.67,69.52],[18.77,69.52],[18.88,69.52],[18.99,69.56],[19.01,69.59],[19.01,69.62],[19.04,69.66],[19.2,69.75],[19.69,69.8],[19.72,69.78],[19.7,69.61],[19.64,69.5],[19.64,69.42],[19.74,69.5],[19.86,69.72],[19.96,69.82],[20.07,69.88],[20.15,69.9],[20.22,69.93],[20.32,69.95],[20.36,69.92],[20.39,69.87],[20.33,69.68],[20.34,69.62],[20.28,69.54],[20.04,69.36],[20.05,69.33],[20.11,69.34],[20.2,69.37],[20.49,69.54],[20.74,69.52],[20.74,69.53],[20.66,69.58],[20.56,69.63],[20.53,69.69],[20.55,69.85],[20.62,69.91],[20.84,69.91],[20.97,69.92],[21.03,69.89],[21.16,69.89],[21.25,70.0],[21.43,70.01],[21.59,69.94],[21.78,69.89],[21.93,69.81],[21.97,69.83],[21.89,70.0],[21.8,70.07],[21.61,70.1],[21.4,70.17],[21.35,70.21],[21.36,70.23],[21.54,70.26],[21.78,70.23],[22.0,70.29],[22.05,70.28],[22.22,70.31],[22.32,70.26],[22.38,70.28],[22.42,70.34],[22.68,70.37],[22.85,70.34],[22.94,70.3],[22.98,70.24],[23.05,70.1],[23.18,70.03],[23.26,69.99],[23.35,69.98],[23.4,70.02],[23.31,70.06],[23.29,70.1],[23.33,70.21],[23.38,70.25],[23.66,70.4],[23.9,70.48],[24.04,70.49],[24.29,70.66],[24.36,70.69],[24.42,70.7],[24.4,70.75],[24.27,70.77],[24.26,70.83],[24.44,70.89],[24.66,71.0],[24.76,71.01],[24.83,70.98],[25.04,70.93],[25.17,70.87],[25.26,70.84],[25.33,70.85],[25.38,70.89],[25.44,70.91],[25.57,70.9],[25.65,70.87],[25.71,70.87],[25.77,70.85],[25.78,70.82],[25.67,70.78],[25.47,70.67],[25.27,70.55],[25.21,70.49],[25.15,70.32],[24.99,70.22],[24.98,70.14],[25.04,70.11],[25.21,70.14],[25.42,70.24],[25.47,70.34],[25.99,70.63],[26.23,70.78],[26.51,70.91],[26.66,70.94],[26.73,70.85],[26.68,70.74],[26.56,70.67],[26.64,70.64],[26.63,70.55],[26.6,70.5],[26.58,70.45],[26.59,70.41],[26.67,70.42],[26.99,70.51],[27.07,70.61],[27.15,70.68],[27.18,70.74],[27.31,70.8],[27.55,70.8],[27.56,70.83],[27.27,70.91],[27.24,70.95],[27.33,71.0],[27.6,71.09],[27.73,71.08],[27.82,71.06],[28.14,71.04],[28.39,70.98],[28.38,70.87],[28.33,70.83],[28.27,70.8],[27.95,70.72],[27.9,70.68],[28.0,70.66],[28.22,70.7],[28.27,70.67],[28.2,70.58],[28.19,70.44],[28.17,70.36],[28.17,70.29],[28.19,70.25],[28.28,70.4],[28.31,70.44],[28.44,70.5],[28.48,70.62],[28.61,70.76],[28.75,70.84],[28.83,70.86],[29.1,70.86],[29.22,70.83],[29.32,70.76],[29.4,70.73],[29.64,70.71],[29.72,70.67],[29.74,70.65],[29.8,70.64],[29.96,70.69],[30.07,70.7],[30.24,70.62],[30.2,70.56],[30.21,70.54],[30.42,70.55],[30.6,70.52],[30.93,70.4],[30.96,70.34],[30.94,70.27],[30.47,70.2],[30.26,70.12],[29.93,70.1],[28.78,70.15],[28.8,70.09],[29.6,69.98],[29.65,69.94],[29.62,69.87],[29.62,69.82],[29.64,69.78],[29.69,69.74],[29.79,69.73],[29.99,69.74],[30.09,69.72],[30.16,69.75],[30.18,69.84],[30.24,69.86],[30.35,69.83],[30.4,69.73],[30.43,69.72],[30.48,69.79],[30.59,69.79],[30.71,69.8],[30.87,69.78],[30.92,69.65],[30.92,69.61],[30.9,69.56],[30.86,69.54],[30.79,69.53],[30.62,69.53],[30.38,69.58],[30.23,69.63],[30.18,69.64],[30.16,69.63],[30.2,69.58],[30.19,69.54],[30.16,69.5],[30.13,69.46],[30.09,69.43],[29.99,69.39],[29.83,69.36],[29.39,69.3],[29.35,69.27],[29.21,69.1],[29.17,69.07],[29.12,69.05],[28.97,69.02]],[[5.09,60.31],[5.09,60.19],[5.0,60.2],[4.96,60.24],[4.94,60.27],[4.95,60.34],[4.93,60.41],[4.96,60.45],[4.99,60.45],[5.05,60.39],[5.09,60.31]],[[4.96,61.08],[4.87,61.07],[4.8,61.08],[4.82,61.18],[4.86,61.19],[4.92,61.2],[4.97,61.15],[4.96,61.08]],[[8.1,63.34],[8.0,63.34],[7.89,63.35],[7.82,63.39],[7.8,63.41],[7.94,63.45],[8.07,63.47],[8.14,63.43],[8.14,63.37],[8.1,63.34]],[[8.47,63.67],[8.36,63.66],[8.29,63.69],[8.45,63.73],[8.71,63.77],[8.73,63.8],[8.76,63.8],[8.81,63.77],[8.81,63.73],[8.79,63.7],[8.47,63.67]],[[11.23,64.87],[11.18,64.84],[11.06,64.86],[10.83,64.84],[10.74,64.87],[10.81,64.92],[11.02,64.98],[11.13,64.98],[11.25,64.91],[11.23,64.87]],[[11.97,65.63],[11.9,65.6],[11.78,65.6],[11.77,65.63],[11.8,65.68],[11.88,65.71],[11.97,65.7],[12.0,65.68],[11.97,65.63]],[[12.51,65.9],[12.43,65.9],[12.43,65.94],[12.48,65.98],[12.55,66.0],[12.64,66.01],[12.75,66.01],[12.78,65.99],[12.72,65.96],[12.51,65.9]],[[12.42,66.04],[12.33,66.04],[12.34,66.08],[12.42,66.12],[12.45,66.15],[12.46,66.19],[12.53,66.21],[12.62,66.18],[12.62,66.12],[12.58,66.07],[12.42,66.04]],[[12.97,67.87],[12.82,67.82],[12.88,67.92],[12.96,68.02],[13.07,68.07],[13.12,68.05],[13.1,68.0],[13.1,67.96],[13.07,67.93],[12.97,67.87]],[[13.87,68.27],[13.93,68.25],[14.09,68.25],[14.12,68.25],[14.1,68.22],[14.03,68.19],[13.89,68.17],[13.82,68.12],[13.78,68.1],[13.66,68.1],[13.58,68.09],[13.5,68.05],[13.42,68.08],[13.4,68.06],[13.39,68.02],[13.35,68.01],[13.23,68.0],[13.2,68.09],[13.26,68.12],[13.3,68.16],[13.37,68.17],[13.43,68.16],[13.54,68.25],[13.69,68.27],[13.78,68.28],[13.87,68.27]],[[15.21,68.94],[15.34,68.84],[15.4,68.78],[15.35,68.67],[15.22,68.62],[15.03,68.61],[14.89,68.61],[14.8,68.64],[14.79,68.67],[14.74,68.68],[14.61,68.64],[14.52,68.63],[14.4,68.66],[14.37,68.71],[14.5,68.77],[14.55,68.82],[14.69,68.81],[14.72,68.8],[14.8,68.79],[14.85,68.85],[14.84,68.89],[14.87,68.91],[15.04,68.89],[15.04,69.0],[15.1,69.01],[15.13,69.0],[15.18,68.98],[15.21,68.94]],[[15.76,68.56],[15.77,68.55],[15.91,68.65],[16.06,68.68],[16.07,68.71],[16.13,68.75],[16.12,68.8],[16.15,68.84],[16.23,68.85],[16.28,68.87],[16.33,68.88],[16.43,68.84],[16.48,68.8],[16.55,68.72],[16.52,68.63],[16.34,68.57],[16.19,68.54],[16.05,68.46],[15.98,68.4],[15.91,68.39],[15.87,68.39],[15.84,68.41],[15.76,68.41],[15.68,68.36],[15.44,68.31],[15.34,68.33],[15.34,68.38],[15.28,68.37],[15.19,68.31],[15.1,68.29],[15.04,68.28],[14.93,68.31],[14.63,68.2],[14.35,68.18],[14.26,68.19],[14.26,68.26],[14.44,68.34],[14.59,68.4],[15.1,68.44],[15.41,68.62],[15.49,68.81],[15.56,68.87],[15.53,68.91],[15.44,68.92],[15.44,68.98],[15.48,69.04],[15.65,69.13],[15.74,69.17],[15.89,69.28],[15.97,69.3],[16.05,69.3],[16.13,69.27],[16.11,69.22],[15.99,69.11],[15.81,69.02],[15.83,68.96],[15.91,68.91],[15.92,68.82],[15.93,68.73],[15.79,68.62],[15.76,68.56]],[[17.5,69.6],[17.62,69.54],[17.68,69.56],[17.78,69.56],[17.86,69.54],[17.93,69.51],[18.0,69.5],[18.05,69.46],[18.08,69.4],[18.02,69.35],[17.94,69.33],[17.92,69.27],[17.95,69.2],[17.77,69.17],[17.57,69.16],[17.49,69.2],[17.32,69.13],[17.16,69.03],[17.08,69.01],[17.08,69.05],[16.96,69.07],[16.81,69.07],[16.82,69.1],[16.84,69.11],[16.97,69.14],[17.0,69.19],[16.97,69.28],[17.0,69.33],[17.0,69.36],[17.08,69.4],[17.36,69.38],[17.39,69.42],[17.37,69.44],[17.23,69.48],[17.25,69.5],[17.36,69.53],[17.45,69.53],[17.48,69.57],[17.49,69.59],[17.5,69.6]],[[29.96,69.8],[29.77,69.77],[29.74,69.79],[29.79,69.83],[29.84,69.91],[29.91,69.9],[29.99,69.87],[30.06,69.84],[29.96,69.8]],[[20.78,70.09],[20.73,70.07],[20.64,70.06],[20.6,70.07],[20.53,70.08],[20.46,70.08],[20.41,70.12],[20.41,70.15],[20.49,70.2],[20.65,70.23],[20.79,70.22],[20.82,70.21],[20.78,70.09]],[[19.26,70.07],[19.34,70.01],[19.42,70.02],[19.45,70.04],[19.5,70.05],[19.61,70.02],[19.59,69.97],[19.44,69.91],[19.33,69.82],[19.2,69.8],[19.13,69.81],[19.01,69.76],[18.91,69.71],[18.81,69.64],[18.8,69.61],[18.78,69.58],[18.41,69.55],[18.27,69.54],[18.13,69.56],[18.06,69.6],[18.08,69.63],[18.23,69.64],[18.23,69.68],[18.27,69.7],[18.32,69.72],[18.35,69.77],[18.41,69.78],[18.51,69.77],[18.58,69.81],[18.62,69.81],[18.67,69.78],[18.7,69.82],[18.67,69.86],[18.69,69.89],[18.82,69.96],[18.88,70.01],[18.97,70.04],[19.05,70.04],[19.07,70.09],[19.05,70.13],[19.06,70.17],[19.13,70.24],[19.21,70.25],[19.25,70.18],[19.26,70.07]],[[19.77,70.22],[19.82,70.2],[19.87,70.21],[19.91,70.2],[19.99,70.15],[20.08,70.13],[20.09,70.1],[20.01,70.08],[19.9,70.07],[19.78,70.08],[19.75,70.11],[19.71,70.17],[19.61,70.22],[19.6,70.27],[19.68,70.27],[19.77,70.22]],[[23.62,70.55],[23.63,70.5],[23.64,70.46],[23.55,70.41],[23.33,70.33],[23.35,70.32],[23.27,70.3],[23.16,70.28],[23.1,70.3],[23.11,70.36],[23.09,70.38],[23.01,70.35],[22.92,70.38],[22.92,70.42],[22.94,70.44],[23.02,70.49],[23.16,70.52],[23.25,70.51],[23.55,70.62],[23.58,70.59],[23.62,70.55]],[[24.02,70.57],[23.83,70.53],[23.72,70.56],[23.67,70.6],[23.66,70.68],[23.69,70.72],[23.78,70.75],[23.84,70.73],[23.85,70.71],[23.96,70.7],[24.08,70.65],[24.02,70.57]],[[23.44,70.82],[23.42,70.78],[23.39,70.75],[23.31,70.72],[23.07,70.59],[22.93,70.57],[22.88,70.55],[22.83,70.54],[22.66,70.56],[22.61,70.53],[22.56,70.52],[22.43,70.51],[22.36,70.51],[22.17,70.56],[22.06,70.61],[21.99,70.66],[22.17,70.66],[22.23,70.67],[22.35,70.66],[22.42,70.7],[22.57,70.7],[22.86,70.73],[22.96,70.71],[23.2,70.82],[23.28,70.81],[23.4,70.84],[23.44,70.82]],[[25.59,71.14],[25.85,71.1],[25.95,71.1],[26.08,71.03],[26.15,71.04],[26.13,71.0],[26.0,70.98],[25.79,70.96],[25.76,70.95],[25.58,70.96],[25.48,71.02],[25.31,71.03],[25.32,71.05],[25.42,71.1],[25.59,71.14]],[[-8.95,70.84],[-9.05,70.83],[-9.1,70.85],[-8.96,70.92],[-8.52,71.03],[-8.34,71.14],[-8.0,71.18],[-7.98,71.12],[-8.0,71.04],[-8.3,70.98],[-8.64,70.94],[-8.95,70.84]],[[19.22,74.39],[19.1,74.35],[18.92,74.41],[18.8,74.49],[18.86,74.51],[19.18,74.52],[19.26,74.48],[19.27,74.46],[19.22,74.39]],[[21.61,78.6],[21.75,78.57],[22.04,78.58],[22.21,78.41],[22.3,78.23],[22.45,78.22],[22.73,78.24],[22.99,78.25],[23.12,78.24],[23.35,78.19],[23.45,78.15],[23.36,78.12],[23.15,78.09],[23.12,77.99],[23.33,77.96],[23.68,77.88],[23.88,77.86],[24.24,77.9],[24.57,77.83],[24.9,77.76],[24.13,77.66],[24.06,77.63],[23.95,77.56],[23.84,77.5],[23.74,77.46],[23.51,77.4],[23.38,77.38],[23.1,77.39],[23.0,77.36],[22.9,77.31],[22.8,77.28],[22.55,77.27],[22.43,77.32],[22.47,77.33],[22.49,77.36],[22.44,77.43],[22.68,77.5],[22.73,77.54],[22.69,77.55],[22.62,77.55],[22.45,77.57],[22.4,77.57],[22.25,77.53],[22.06,77.5],[21.86,77.49],[21.05,77.44],[20.93,77.46],[20.87,77.57],[21.2,77.62],[21.25,77.71],[21.33,77.77],[21.43,77.81],[21.61,77.92],[21.65,77.92],[21.21,78.01],[21.04,78.06],[20.84,78.17],[20.79,78.25],[20.53,78.33],[20.56,78.42],[20.37,78.41],[20.23,78.48],[20.36,78.51],[21.05,78.56],[21.45,78.6],[21.61,78.6]],[[26.88,78.65],[26.73,78.65],[26.46,78.72],[26.41,78.78],[26.46,78.81],[26.59,78.81],[26.79,78.72],[27.01,78.7],[26.88,78.65]],[[11.25,78.61],[11.26,78.54],[11.42,78.55],[11.62,78.48],[11.83,78.44],[11.88,78.41],[11.93,78.37],[12.06,78.31],[12.12,78.23],[11.97,78.22],[11.76,78.33],[11.59,78.39],[11.37,78.44],[11.2,78.44],[11.12,78.46],[10.84,78.64],[10.79,78.69],[10.63,78.75],[10.56,78.84],[10.56,78.9],[10.77,78.89],[10.96,78.85],[11.12,78.75],[11.15,78.72],[11.08,78.69],[11.15,78.64],[11.25,78.61]],[[29.05,78.91],[29.35,78.91],[29.65,78.92],[29.7,78.9],[29.31,78.85],[28.88,78.88],[28.49,78.89],[28.04,78.83],[27.89,78.85],[28.12,78.91],[28.37,78.93],[28.41,78.96],[28.51,78.97],[28.85,78.97],[29.05,78.91]],[[16.79,79.91],[16.84,79.9],[16.89,79.92],[16.93,79.94],[16.97,79.96],[17.22,79.94],[17.58,79.88],[17.68,79.86],[17.83,79.8],[17.96,79.7],[17.86,79.64],[17.73,79.57],[17.69,79.53],[17.73,79.48],[17.72,79.43],[17.67,79.39],[17.86,79.44],[18.27,79.6],[18.33,79.61],[18.4,79.61],[18.58,79.57],[18.75,79.49],[18.79,79.46],[18.82,79.43],[18.83,79.38],[18.82,79.34],[18.81,79.3],[18.72,79.28],[18.68,79.26],[18.77,79.26],[18.88,79.23],[18.98,79.18],[19.09,79.16],[19.49,79.18],[19.75,79.15],[19.89,79.06],[20.11,79.08],[20.11,79.12],[20.16,79.15],[20.46,79.13],[20.61,79.11],[20.77,79.06],[20.5,78.98],[20.72,78.91],[21.09,78.85],[21.31,78.8],[21.35,78.77],[21.39,78.74],[21.24,78.7],[21.1,78.68],[20.72,78.67],[20.39,78.64],[19.77,78.62],[19.68,78.61],[19.65,78.6],[19.62,78.56],[19.38,78.48],[19.15,78.38],[19.06,78.32],[18.98,78.23],[18.96,78.18],[19.01,78.13],[19.0,78.08],[18.82,78.04],[18.71,78.04],[18.57,78.05],[18.44,78.03],[18.43,77.99],[18.44,77.94],[18.4,77.79],[18.36,77.68],[18.3,77.58],[18.23,77.52],[18.14,77.51],[17.85,77.5],[17.62,77.4],[17.44,77.23],[17.35,77.16],[17.15,77.05],[17.19,77.01],[17.25,76.97],[17.14,76.89],[16.98,76.81],[16.98,76.78],[17.04,76.72],[17.06,76.66],[16.94,76.61],[16.7,76.58],[16.46,76.61],[16.35,76.64],[16.24,76.7],[16.12,76.74],[16.0,76.76],[15.55,76.89],[15.12,77.09],[14.74,77.16],[14.49,77.2],[14.37,77.23],[14.25,77.28],[14.15,77.34],[14.05,77.4],[14.0,77.45],[14.0,77.51],[14.03,77.55],[14.07,77.56],[14.38,77.58],[14.49,77.57],[14.6,77.54],[14.7,77.53],[14.92,77.69],[16.21,77.78],[16.62,77.8],[17.03,77.8],[16.97,77.84],[16.91,77.9],[16.85,77.91],[16.54,77.88],[16.06,77.85],[15.83,77.85],[15.59,77.87],[15.34,77.86],[15.1,77.81],[14.85,77.78],[14.6,77.77],[14.09,77.77],[13.96,77.8],[13.79,77.85],[13.75,77.88],[13.71,77.92],[13.68,78.03],[13.72,78.06],[13.77,78.07],[13.82,78.09],[13.94,78.09],[14.05,78.07],[14.31,78.01],[14.25,78.07],[14.99,78.15],[15.34,78.22],[15.52,78.23],[15.7,78.23],[15.66,78.26],[15.66,78.3],[15.78,78.33],[15.88,78.34],[16.15,78.35],[16.78,78.35],[17.0,78.37],[17.17,78.42],[16.99,78.4],[16.81,78.4],[16.73,78.41],[16.54,78.45],[16.45,78.5],[16.7,78.61],[16.78,78.66],[16.53,78.66],[16.45,78.64],[16.16,78.54],[15.94,78.49],[15.68,78.47],[15.42,78.47],[15.36,78.49],[15.28,78.55],[15.25,78.59],[15.26,78.61],[15.35,78.66],[15.39,78.72],[15.38,78.77],[15.32,78.78],[15.23,78.73],[15.14,78.66],[15.02,78.63],[14.89,78.64],[14.84,78.67],[14.79,78.71],[14.74,78.72],[14.69,78.72],[14.58,78.7],[14.47,78.68],[14.51,78.63],[14.52,78.58],[14.47,78.54],[14.43,78.49],[14.55,78.46],[14.64,78.41],[14.5,78.39],[14.36,78.36],[14.24,78.31],[14.11,78.27],[13.91,78.27],[13.65,78.25],[13.15,78.24],[12.91,78.3],[12.87,78.33],[12.82,78.35],[12.66,78.38],[12.43,78.48],[12.26,78.59],[12.14,78.61],[11.96,78.64],[11.87,78.67],[11.77,78.72],[11.75,78.77],[11.76,78.81],[11.86,78.83],[11.61,78.88],[11.37,78.95],[11.46,78.97],[11.55,78.98],[12.27,78.9],[12.32,78.91],[12.4,78.95],[12.38,78.97],[12.25,78.98],[12.09,78.98],[12.05,78.98],[11.98,79.03],[11.93,79.08],[11.9,79.11],[11.89,79.15],[12.02,79.21],[12.08,79.27],[11.98,79.29],[11.68,79.29],[11.58,79.28],[11.62,79.21],[11.52,79.15],[11.34,79.11],[11.21,79.13],[11.11,79.23],[10.98,79.3],[10.93,79.35],[10.89,79.42],[10.83,79.46],[10.74,79.52],[10.72,79.56],[10.74,79.58],[10.81,79.64],[10.75,79.69],[10.69,79.73],[10.68,79.76],[10.75,79.79],[10.8,79.8],[10.87,79.8],[11.05,79.76],[11.15,79.72],[11.19,79.72],[11.25,79.78],[11.34,79.8],[11.7,79.82],[12.1,79.74],[12.21,79.72],[12.29,79.71],[12.25,79.75],[12.22,79.8],[12.28,79.82],[12.6,79.77],[12.75,79.78],[13.11,79.83],[13.69,79.86],[13.91,79.82],[13.93,79.79],[13.92,79.76],[13.91,79.75],[13.78,79.72],[13.04,79.69],[12.56,79.57],[13.22,79.59],[13.33,79.57],[13.38,79.48],[13.43,79.47],[13.6,79.46],[13.72,79.43],[13.83,79.38],[13.96,79.34],[14.03,79.34],[14.06,79.38],[14.03,79.43],[14.01,79.48],[14.02,79.54],[14.04,79.59],[14.18,79.62],[14.38,79.73],[14.59,79.8],[14.83,79.77],[15.05,79.68],[15.25,79.55],[15.44,79.41],[15.66,79.23],[15.76,79.17],[15.86,79.16],[16.29,78.98],[16.34,78.98],[16.25,79.11],[16.03,79.34],[15.88,79.52],[15.84,79.59],[15.82,79.68],[15.83,79.71],[15.85,79.73],[15.96,79.84],[16.1,79.88],[16.06,79.95],[16.09,80.01],[16.25,80.05],[16.39,80.05],[16.52,80.02],[16.79,79.91]],[[32.53,80.12],[31.58,80.08],[31.48,80.11],[33.02,80.22],[33.1,80.23],[33.38,80.24],[33.63,80.22],[33.56,80.2],[32.53,80.12]],[[18.74,80.3],[18.52,80.25],[18.16,80.29],[18.21,80.33],[18.29,80.36],[18.52,80.35],[18.74,80.3]],[[20.9,80.25],[21.0,80.24],[21.55,80.24],[21.65,80.22],[21.7,80.16],[21.78,80.14],[21.9,80.13],[22.19,80.06],[22.29,80.05],[22.38,80.09],[22.44,80.19],[22.45,80.31],[22.42,80.37],[22.45,80.4],[22.55,80.42],[22.67,80.41],[22.79,80.43],[22.9,80.47],[23.01,80.47],[23.25,80.45],[23.32,80.43],[23.25,80.38],[23.22,80.32],[23.11,80.19],[23.35,80.18],[23.69,80.21],[23.77,80.24],[23.95,80.3],[24.14,80.3],[24.23,80.3],[24.28,80.33],[24.3,80.36],[24.4,80.36],[24.55,80.3],[24.61,80.29],[24.74,80.3],[24.79,80.3],[24.91,80.28],[25.47,80.23],[25.67,80.21],[25.75,80.19],[25.84,80.18],[26.44,80.18],[26.86,80.16],[27.02,80.13],[27.15,80.06],[27.2,79.91],[27.08,79.87],[26.22,79.68],[26.01,79.62],[25.9,79.56],[25.73,79.44],[25.64,79.4],[25.24,79.35],[25.15,79.34],[24.84,79.37],[24.75,79.36],[24.38,79.3],[24.26,79.26],[24.13,79.22],[23.95,79.19],[23.76,79.21],[22.9,79.23],[22.79,79.26],[22.7,79.33],[22.87,79.41],[21.91,79.38],[20.86,79.4],[20.81,79.41],[20.76,79.44],[20.4,79.46],[20.13,79.49],[19.9,79.53],[19.67,79.59],[19.75,79.62],[19.82,79.63],[20.01,79.64],[20.19,79.63],[20.49,79.63],[20.56,79.69],[20.69,79.71],[20.78,79.75],[20.46,79.77],[20.12,79.78],[19.9,79.74],[19.64,79.73],[19.4,79.73],[18.94,79.74],[18.73,79.76],[18.43,79.82],[18.32,79.86],[18.28,79.89],[18.26,79.93],[18.59,79.97],[18.73,80.0],[18.86,80.04],[18.34,80.06],[18.13,80.09],[17.92,80.14],[18.09,80.17],[18.78,80.19],[18.96,80.17],[19.14,80.14],[19.34,80.12],[19.54,80.16],[19.35,80.19],[19.19,80.26],[19.16,80.3],[19.18,80.33],[19.26,80.34],[19.33,80.32],[19.57,80.25],[19.75,80.23],[19.8,80.29],[19.81,80.33],[19.78,80.35],[19.69,80.4],[19.61,80.46],[19.73,80.48],[19.85,80.47],[20.1,80.43],[20.36,80.4],[20.48,80.37],[20.69,80.3],[20.9,80.25]]]},{"n":"Nepal","r":[[[81.01,30.16],[81.06,30.1],[81.11,30.04],[81.18,30.04],[81.26,30.09],[81.42,30.34],[81.64,30.39],[81.85,30.36],[82.04,30.33],[82.1,30.25],[82.14,30.16],[82.16,30.12],[82.22,30.06],[82.49,29.94],[82.64,29.83],[82.85,29.68],[83.01,29.62],[83.16,29.61],[83.24,29.55],[83.36,29.44],[83.46,29.31],[83.58,29.18],[83.67,29.19],[83.79,29.23],[83.94,29.28],[84.02,29.25],[84.1,29.22],[84.13,29.16],[84.18,29.04],[84.23,28.91],[84.31,28.87],[84.41,28.8],[84.47,28.75],[84.65,28.66],[84.68,28.62],[84.71,28.6],[84.76,28.58],[84.8,28.56],[84.86,28.55],[85.07,28.61],[85.13,28.6],[85.16,28.59],[85.16,28.57],[85.12,28.48],[85.09,28.37],[85.12,28.32],[85.21,28.29],[85.41,28.28],[85.68,28.28],[85.76,28.22],[85.84,28.14],[85.92,27.99],[85.95,27.93],[85.99,27.91],[86.06,27.93],[86.08,27.99],[86.08,28.08],[86.14,28.11],[86.17,28.09],[86.22,28.02],[86.33,27.96],[86.41,27.93],[86.48,27.94],[86.52,27.96],[86.55,28.09],[86.61,28.1],[86.69,28.09],[86.72,28.07],[86.75,28.02],[86.84,28.0],[86.93,27.97],[87.02,27.93],[87.14,27.84],[87.29,27.82],[87.46,27.82],[87.56,27.82],[87.62,27.82],[87.68,27.82],[87.86,27.89],[87.93,27.89],[88.02,27.88],[88.11,27.87],[88.15,27.84],[88.15,27.8],[88.15,27.75],[88.11,27.64],[88.07,27.57],[88.02,27.41],[87.98,27.13],[87.99,27.09],[88.11,26.93],[88.16,26.81],[88.16,26.72],[88.11,26.59],[88.05,26.43],[88.03,26.4],[88.0,26.38],[87.85,26.44],[87.75,26.43],[87.63,26.4],[87.51,26.4],[87.41,26.42],[87.29,26.36],[87.17,26.39],[87.09,26.43],[87.04,26.54],[87.02,26.56],[86.76,26.44],[86.7,26.44],[86.54,26.5],[86.41,26.56],[86.37,26.57],[86.24,26.6],[86.13,26.61],[86.01,26.65],[85.86,26.6],[85.79,26.6],[85.74,26.64],[85.71,26.71],[85.7,26.78],[85.65,26.83],[85.57,26.84],[85.46,26.8],[85.29,26.74],[85.24,26.75],[85.19,26.77],[85.17,26.78],[85.15,26.85],[85.13,26.86],[85.09,26.86],[85.02,26.88],[84.94,26.93],[84.69,27.04],[84.65,27.09],[84.65,27.2],[84.64,27.25],[84.61,27.3],[84.48,27.35],[84.23,27.43],[84.09,27.49],[84.02,27.46],[83.9,27.44],[83.83,27.38],[83.75,27.4],[83.55,27.46],[83.45,27.47],[83.38,27.44],[83.37,27.41],[83.29,27.37],[83.21,27.4],[83.06,27.44],[82.93,27.47],[82.73,27.52],[82.71,27.6],[82.68,27.67],[82.63,27.69],[82.45,27.67],[82.29,27.76],[82.11,27.86],[82.04,27.9],[81.99,27.91],[81.95,27.9],[81.9,27.87],[81.85,27.87],[81.76,27.91],[81.64,27.98],[81.49,28.06],[81.31,28.18],[81.24,28.24],[81.21,28.29],[81.17,28.34],[81.02,28.41],[80.9,28.47],[80.75,28.54],[80.73,28.55],[80.67,28.6],[80.59,28.65],[80.52,28.67],[80.5,28.64],[80.48,28.6],[80.42,28.61],[80.32,28.67],[80.23,28.72],[80.15,28.78],[80.07,28.83],[80.05,28.87],[80.08,28.99],[80.13,29.1],[80.17,29.12],[80.23,29.19],[80.26,29.32],[80.25,29.42],[80.32,29.57],[80.4,29.73],[80.55,29.9],[80.61,29.96],[80.68,29.99],[80.82,30.12],[80.85,30.14],[80.91,30.17],[80.97,30.18],[81.01,30.16]]]},{"n":"Nauru","r":[[[166.96,-0.52],[166.94,-0.55],[166.92,-0.55],[166.91,-0.52],[166.91,-0.5],[166.94,-0.49],[166.96,-0.5],[166.96,-0.52]]]},{"n":"New Zealand","r":[[[169.18,-52.5],[169.23,-52.55],[169.13,-52.57],[169.08,-52.55],[169.04,-52.53],[169.02,-52.5],[169.08,-52.5],[169.13,-52.49],[169.18,-52.5]],[[166.22,-50.76],[166.24,-50.85],[166.19,-50.85],[166.07,-50.82],[166.04,-50.79],[166.01,-50.78],[165.97,-50.82],[165.9,-50.82],[165.89,-50.81],[165.92,-50.76],[166.07,-50.68],[166.1,-50.57],[166.1,-50.54],[166.23,-50.53],[166.25,-50.54],[166.27,-50.56],[166.26,-50.58],[166.21,-50.61],[166.21,-50.65],[166.22,-50.69],[166.18,-50.71],[166.2,-50.75],[166.22,-50.76]],[[168.14,-46.86],[168.15,-46.9],[168.04,-46.89],[168.04,-46.93],[168.13,-46.96],[168.16,-46.99],[168.24,-46.98],[168.26,-47.03],[168.24,-47.07],[168.18,-47.1],[168.02,-47.12],[167.91,-47.18],[167.81,-47.17],[167.78,-47.18],[167.68,-47.24],[167.55,-47.26],[167.52,-47.26],[167.54,-47.2],[167.63,-47.14],[167.63,-47.09],[167.65,-47.04],[167.74,-47.01],[167.74,-46.96],[167.8,-46.91],[167.77,-46.8],[167.78,-46.7],[167.96,-46.69],[168.14,-46.86]],[[166.75,-45.66],[166.74,-45.7],[166.73,-45.73],[166.69,-45.73],[166.64,-45.72],[166.59,-45.7],[166.56,-45.71],[166.53,-45.7],[166.57,-45.64],[166.69,-45.62],[166.73,-45.64],[166.75,-45.66]],[[166.98,-45.18],[167.02,-45.3],[166.93,-45.28],[166.89,-45.24],[166.96,-45.18],[166.98,-45.18]],[[-176.18,-44.32],[-176.22,-44.33],[-176.21,-44.27],[-176.23,-44.24],[-176.15,-44.22],[-176.12,-44.27],[-176.18,-44.32]],[[-176.18,-43.74],[-176.21,-43.77],[-176.27,-43.76],[-176.38,-43.87],[-176.38,-43.79],[-176.41,-43.76],[-176.5,-43.77],[-176.52,-43.78],[-176.45,-43.8],[-176.44,-43.82],[-176.5,-43.86],[-176.44,-43.95],[-176.39,-43.95],[-176.33,-44.03],[-176.33,-44.05],[-176.45,-44.08],[-176.52,-44.12],[-176.57,-44.11],[-176.6,-44.11],[-176.63,-44.04],[-176.63,-44.01],[-176.56,-43.95],[-176.52,-43.9],[-176.56,-43.85],[-176.63,-43.82],[-176.81,-43.83],[-176.85,-43.82],[-176.76,-43.76],[-176.67,-43.77],[-176.57,-43.72],[-176.18,-43.74]],[[173.91,-40.86],[173.78,-40.92],[173.79,-40.88],[173.81,-40.79],[173.87,-40.75],[173.9,-40.75],[173.96,-40.71],[173.96,-40.79],[173.91,-40.86]],[[173.12,-41.28],[173.23,-41.28],[173.34,-41.21],[173.45,-41.15],[173.56,-41.1],[173.74,-40.99],[173.78,-40.97],[173.9,-40.95],[173.95,-40.92],[174.0,-40.92],[173.95,-40.98],[173.89,-41.01],[173.88,-41.03],[173.92,-41.07],[173.86,-41.12],[173.86,-41.19],[173.8,-41.27],[173.9,-41.24],[173.93,-41.19],[173.91,-41.16],[173.96,-41.1],[174.02,-41.07],[174.0,-41.03],[174.0,-40.99],[174.08,-41.01],[174.12,-41.0],[174.15,-40.99],[174.21,-40.99],[174.22,-41.02],[174.3,-41.02],[174.27,-41.07],[174.21,-41.13],[174.2,-41.16],[174.1,-41.22],[174.04,-41.24],[174.14,-41.25],[174.28,-41.17],[174.37,-41.1],[174.37,-41.19],[174.3,-41.26],[174.24,-41.31],[174.17,-41.33],[174.1,-41.37],[174.07,-41.43],[174.07,-41.47],[174.09,-41.51],[174.16,-41.56],[174.08,-41.67],[174.17,-41.66],[174.22,-41.68],[174.28,-41.74],[174.24,-41.81],[174.22,-41.85],[174.05,-42.0],[173.97,-42.08],[173.89,-42.13],[173.89,-42.21],[173.84,-42.27],[173.59,-42.47],[173.55,-42.52],[173.35,-42.84],[173.22,-42.98],[173.15,-43.02],[173.07,-43.06],[172.89,-43.12],[172.81,-43.2],[172.72,-43.26],[172.62,-43.27],[172.63,-43.3],[172.69,-43.31],[172.73,-43.35],[172.7,-43.4],[172.63,-43.43],[172.56,-43.44],[172.53,-43.46],[172.69,-43.44],[172.74,-43.47],[172.75,-43.52],[172.77,-43.56],[172.81,-43.62],[172.95,-43.66],[173.07,-43.68],[173.1,-43.7],[173.12,-43.8],[173.09,-43.84],[173.07,-43.87],[173.02,-43.89],[172.92,-43.89],[172.82,-43.87],[172.75,-43.81],[172.55,-43.83],[172.5,-43.84],[172.48,-43.83],[172.58,-43.77],[172.53,-43.74],[172.48,-43.73],[172.43,-43.75],[172.4,-43.78],[172.39,-43.83],[172.35,-43.86],[172.3,-43.87],[172.22,-43.82],[172.15,-43.76],[172.04,-43.7],[172.05,-43.74],[172.14,-43.83],[172.18,-43.9],[172.08,-43.95],[171.98,-43.98],[171.89,-44.01],[171.81,-44.04],[171.71,-44.1],[171.66,-44.12],[171.52,-44.12],[171.44,-44.14],[171.42,-44.21],[171.36,-44.25],[171.24,-44.26],[171.29,-44.28],[171.31,-44.3],[171.23,-44.52],[171.21,-44.61],[171.2,-44.77],[171.15,-44.91],[171.0,-44.91],[171.02,-44.94],[171.13,-44.98],[171.11,-45.04],[170.99,-45.15],[170.94,-45.22],[170.89,-45.37],[170.82,-45.52],[170.7,-45.68],[170.7,-45.71],[170.74,-45.76],[170.79,-45.79],[170.79,-45.84],[170.78,-45.87],[170.72,-45.88],[170.67,-45.9],[170.42,-45.94],[170.34,-45.99],[170.27,-46.08],[170.19,-46.16],[169.92,-46.33],[169.76,-46.48],[169.73,-46.52],[169.69,-46.55],[169.34,-46.62],[169.1,-46.63],[168.97,-46.61],[168.84,-46.58],[168.77,-46.57],[168.63,-46.59],[168.57,-46.61],[168.47,-46.59],[168.38,-46.61],[168.36,-46.59],[168.33,-46.55],[168.34,-46.49],[168.32,-46.45],[168.27,-46.42],[168.23,-46.39],[168.19,-46.36],[168.08,-46.35],[167.9,-46.37],[167.84,-46.37],[167.72,-46.23],[167.68,-46.19],[167.54,-46.15],[167.49,-46.15],[167.41,-46.23],[167.37,-46.24],[167.1,-46.25],[166.83,-46.23],[166.73,-46.2],[166.71,-46.13],[166.92,-45.96],[166.86,-45.98],[166.73,-46.05],[166.65,-46.04],[166.73,-45.96],[166.73,-45.93],[166.72,-45.89],[166.61,-45.96],[166.49,-45.96],[166.48,-45.9],[166.49,-45.83],[166.51,-45.81],[166.84,-45.77],[166.95,-45.75],[167.0,-45.71],[166.81,-45.7],[166.8,-45.65],[166.83,-45.6],[166.99,-45.53],[166.87,-45.55],[166.73,-45.54],[166.74,-45.47],[166.78,-45.41],[166.92,-45.41],[166.88,-45.37],[166.87,-45.31],[166.91,-45.31],[167.05,-45.38],[167.16,-45.41],[167.11,-45.35],[167.12,-45.32],[167.15,-45.3],[167.23,-45.29],[167.21,-45.28],[167.13,-45.27],[167.03,-45.22],[167.02,-45.18],[167.03,-45.12],[167.13,-45.05],[167.19,-45.09],[167.26,-45.08],[167.21,-45.05],[167.17,-45.0],[167.19,-44.96],[167.41,-44.83],[167.47,-44.96],[167.48,-44.92],[167.48,-44.87],[167.46,-44.84],[167.46,-44.8],[167.48,-44.77],[167.58,-44.74],[167.7,-44.64],[167.79,-44.6],[167.86,-44.62],[167.91,-44.66],[167.9,-44.62],[167.87,-44.59],[167.86,-44.5],[168.02,-44.36],[168.2,-44.22],[168.37,-44.08],[168.46,-44.03],[168.65,-43.97],[168.77,-44.0],[168.81,-43.99],[168.99,-43.89],[169.07,-43.86],[169.14,-43.9],[169.18,-43.91],[169.14,-43.82],[169.17,-43.78],[169.32,-43.7],[169.52,-43.62],[169.66,-43.59],[169.77,-43.54],[169.83,-43.54],[169.82,-43.5],[169.84,-43.46],[169.89,-43.46],[169.91,-43.45],[169.86,-43.43],[170.02,-43.35],[170.1,-43.27],[170.15,-43.25],[170.19,-43.22],[170.24,-43.16],[170.3,-43.14],[170.36,-43.15],[170.4,-43.18],[170.37,-43.13],[170.3,-43.11],[170.38,-43.07],[170.46,-43.04],[170.54,-43.06],[170.61,-43.09],[170.54,-43.04],[170.52,-43.01],[170.62,-42.97],[170.67,-42.96],[170.74,-43.03],[170.73,-42.98],[170.74,-42.93],[170.84,-42.85],[170.97,-42.72],[171.01,-42.76],[171.02,-42.82],[171.01,-42.89],[171.04,-42.86],[171.05,-42.8],[171.03,-42.7],[171.19,-42.5],[171.22,-42.48],[171.26,-42.47],[171.31,-42.46],[171.3,-42.43],[171.25,-42.4],[171.3,-42.3],[171.32,-42.19],[171.36,-42.08],[171.42,-41.97],[171.49,-41.79],[171.54,-41.76],[171.67,-41.74],[171.73,-41.72],[171.83,-41.66],[171.95,-41.54],[172.01,-41.44],[172.09,-41.2],[172.14,-40.95],[172.27,-40.76],[172.47,-40.62],[172.64,-40.52],[172.71,-40.5],[172.83,-40.49],[172.94,-40.52],[172.73,-40.54],[172.71,-40.61],[172.7,-40.67],[172.73,-40.72],[172.77,-40.77],[172.87,-40.82],[172.99,-40.85],[173.04,-40.95],[173.05,-41.08],[173.07,-41.19],[173.12,-41.28]],[[175.54,-36.28],[175.55,-36.33],[175.47,-36.31],[175.44,-36.27],[175.36,-36.23],[175.35,-36.22],[175.34,-36.13],[175.38,-36.09],[175.39,-36.08],[175.41,-36.07],[175.44,-36.11],[175.51,-36.18],[175.54,-36.28]],[[173.27,-34.93],[173.28,-34.98],[173.34,-34.95],[173.38,-34.9],[173.45,-34.84],[173.44,-34.93],[173.47,-34.95],[173.69,-35.01],[173.74,-35.05],[173.79,-35.07],[173.81,-35.04],[173.84,-35.03],[173.92,-35.06],[174.1,-35.14],[174.12,-35.17],[174.11,-35.22],[174.12,-35.26],[174.14,-35.3],[174.2,-35.31],[174.28,-35.25],[174.32,-35.25],[174.37,-35.32],[174.39,-35.37],[174.38,-35.37],[174.42,-35.41],[174.46,-35.45],[174.54,-35.58],[174.53,-35.63],[174.51,-35.67],[174.58,-35.79],[174.53,-35.79],[174.39,-35.77],[174.4,-35.8],[174.48,-35.88],[174.55,-36.01],[174.6,-36.08],[174.8,-36.31],[174.77,-36.39],[174.78,-36.44],[174.75,-36.49],[174.82,-36.61],[174.78,-36.65],[174.75,-36.77],[174.72,-36.8],[174.72,-36.84],[174.8,-36.85],[174.85,-36.87],[174.89,-36.91],[174.92,-36.87],[174.95,-36.85],[175.05,-36.91],[175.25,-36.97],[175.3,-36.99],[175.33,-37.04],[175.35,-37.16],[175.39,-37.21],[175.46,-37.22],[175.54,-37.2],[175.57,-37.16],[175.55,-37.05],[175.49,-36.87],[175.49,-36.81],[175.5,-36.75],[175.49,-36.69],[175.46,-36.63],[175.43,-36.59],[175.39,-36.56],[175.4,-36.5],[175.46,-36.48],[175.5,-36.52],[175.53,-36.58],[175.68,-36.75],[175.77,-36.74],[175.78,-36.8],[175.84,-36.88],[175.88,-36.96],[175.92,-37.2],[175.99,-37.44],[176.11,-37.54],[176.13,-37.59],[176.05,-37.56],[176.03,-37.58],[176.04,-37.6],[176.11,-37.65],[176.19,-37.67],[176.24,-37.66],[176.29,-37.68],[176.61,-37.83],[176.77,-37.89],[177.16,-37.99],[177.27,-37.99],[177.34,-37.99],[177.45,-37.96],[177.56,-37.9],[177.65,-37.81],[177.73,-37.71],[177.81,-37.66],[177.91,-37.62],[177.96,-37.58],[178.01,-37.55],[178.27,-37.57],[178.36,-37.62],[178.48,-37.66],[178.54,-37.69],[178.52,-37.76],[178.45,-37.85],[178.39,-37.96],[178.35,-38.2],[178.32,-38.44],[178.27,-38.55],[178.18,-38.63],[178.08,-38.69],[177.98,-38.72],[177.93,-38.86],[177.91,-39.02],[177.92,-39.06],[177.95,-39.09],[177.97,-39.14],[177.91,-39.24],[177.88,-39.23],[177.83,-39.14],[177.79,-39.11],[177.66,-39.09],[177.52,-39.07],[177.41,-39.08],[177.3,-39.12],[177.13,-39.19],[177.08,-39.22],[177.03,-39.27],[176.95,-39.37],[176.94,-39.49],[176.94,-39.56],[176.97,-39.61],[177.11,-39.67],[176.97,-39.91],[176.84,-40.16],[176.77,-40.23],[176.69,-40.29],[176.61,-40.44],[176.48,-40.57],[176.39,-40.67],[176.31,-40.77],[176.25,-40.88],[176.12,-41.03],[176.06,-41.13],[175.98,-41.21],[175.84,-41.32],[175.69,-41.41],[175.45,-41.54],[175.38,-41.58],[175.31,-41.61],[175.22,-41.57],[175.2,-41.53],[175.18,-41.45],[175.17,-41.42],[175.05,-41.39],[174.91,-41.43],[174.88,-41.42],[174.88,-41.4],[174.88,-41.28],[174.9,-41.24],[174.87,-41.22],[174.83,-41.23],[174.82,-41.26],[174.84,-41.29],[174.76,-41.33],[174.67,-41.33],[174.64,-41.31],[174.64,-41.29],[174.66,-41.25],[174.68,-41.22],[174.85,-41.06],[175.02,-40.85],[175.16,-40.62],[175.2,-40.51],[175.25,-40.29],[175.21,-40.2],[175.16,-40.11],[175.01,-39.95],[174.81,-39.86],[174.69,-39.85],[174.57,-39.81],[174.45,-39.74],[174.35,-39.64],[174.15,-39.57],[173.93,-39.51],[173.81,-39.43],[173.78,-39.38],[173.76,-39.32],[173.77,-39.27],[173.78,-39.21],[173.81,-39.17],[173.84,-39.14],[174.07,-39.03],[174.31,-38.97],[174.36,-38.97],[174.4,-38.96],[174.46,-38.93],[174.57,-38.84],[174.6,-38.79],[174.62,-38.61],[174.65,-38.43],[174.72,-38.23],[174.81,-38.1],[174.84,-38.02],[174.8,-37.9],[174.84,-37.85],[174.88,-37.82],[174.93,-37.8],[174.85,-37.69],[174.75,-37.5],[174.73,-37.45],[174.74,-37.39],[174.77,-37.34],[174.71,-37.33],[174.67,-37.27],[174.59,-37.1],[174.61,-37.07],[174.66,-37.09],[174.73,-37.22],[174.75,-37.15],[174.8,-37.11],[174.86,-37.09],[174.93,-37.08],[174.78,-36.94],[174.73,-36.95],[174.67,-36.97],[174.6,-36.99],[174.54,-36.97],[174.48,-36.94],[174.44,-36.88],[174.41,-36.77],[174.38,-36.73],[174.19,-36.49],[174.25,-36.48],[174.4,-36.6],[174.43,-36.56],[174.45,-36.51],[174.45,-36.45],[174.41,-36.41],[174.35,-36.38],[174.35,-36.32],[174.4,-36.27],[174.39,-36.24],[174.3,-36.17],[174.27,-36.16],[174.25,-36.2],[174.28,-36.24],[174.25,-36.25],[174.04,-36.12],[173.97,-36.02],[173.91,-35.91],[173.91,-35.95],[173.92,-36.02],[174.0,-36.15],[174.14,-36.29],[174.17,-36.33],[174.15,-36.38],[174.1,-36.39],[174.05,-36.36],[173.99,-36.24],[173.95,-36.18],[173.41,-35.54],[173.48,-35.46],[173.59,-35.39],[173.61,-35.36],[173.63,-35.32],[173.58,-35.31],[173.54,-35.33],[173.5,-35.36],[173.45,-35.4],[173.4,-35.48],[173.38,-35.5],[173.31,-35.44],[173.29,-35.41],[173.29,-35.37],[173.27,-35.34],[173.23,-35.33],[173.16,-35.25],[173.12,-35.21],[173.19,-35.12],[173.19,-35.02],[173.12,-34.9],[173.03,-34.8],[172.86,-34.63],[172.71,-34.46],[172.87,-34.43],[173.04,-34.43],[172.96,-34.54],[173.0,-34.6],[173.05,-34.65],[173.17,-34.81],[173.18,-34.85],[173.24,-34.9],[173.27,-34.93]],[[-171.19,-9.36],[-171.19,-9.36],[-171.19,-9.35],[-171.2,-9.34],[-171.2,-9.33],[-171.2,-9.33],[-171.19,-9.34],[-171.19,-9.35],[-171.19,-9.36]],[[-172.48,-8.58],[-172.48,-8.58],[-172.49,-8.57],[-172.49,-8.56],[-172.5,-8.55],[-172.5,-8.55],[-172.49,-8.56],[-172.48,-8.57],[-172.48,-8.58]]]},{"n":"Oman","r":[[[55.19,22.7],[55.19,22.85],[55.19,22.92],[55.2,23.03],[55.27,23.19],[55.35,23.39],[55.41,23.52],[55.47,23.63],[55.51,23.72],[55.53,23.82],[55.52,23.89],[55.49,23.91],[55.47,23.94],[55.55,23.99],[55.7,24.02],[55.78,24.02],[55.89,24.04],[55.99,24.06],[55.99,24.09],[55.97,24.14],[55.93,24.22],[55.8,24.22],[55.76,24.24],[55.81,24.35],[55.8,24.38],[55.79,24.42],[55.77,24.49],[55.78,24.58],[55.8,24.64],[55.8,24.68],[55.79,24.78],[55.8,24.87],[55.82,24.91],[55.87,24.95],[55.92,24.97],[55.96,24.97],[56.0,24.95],[56.02,24.91],[56.01,24.88],[55.98,24.87],[55.97,24.86],[56.01,24.8],[56.06,24.74],[56.11,24.75],[56.15,24.8],[56.2,24.83],[56.27,24.87],[56.31,24.93],[56.35,24.97],[56.39,24.98],[56.49,24.72],[56.64,24.47],[56.77,24.33],[56.91,24.15],[57.12,23.98],[57.22,23.92],[57.61,23.8],[57.83,23.76],[58.12,23.72],[58.32,23.62],[58.39,23.62],[58.5,23.65],[58.58,23.64],[58.77,23.52],[58.83,23.4],[58.91,23.33],[58.98,23.23],[59.03,23.13],[59.19,22.97],[59.31,22.79],[59.43,22.66],[59.54,22.58],[59.7,22.55],[59.82,22.51],[59.84,22.42],[59.82,22.31],[59.8,22.22],[59.68,22.05],[59.65,21.95],[59.52,21.78],[59.37,21.5],[59.3,21.44],[59.07,21.29],[58.9,21.11],[58.69,20.81],[58.53,20.5],[58.47,20.41],[58.35,20.39],[58.27,20.4],[58.21,20.42],[58.23,20.51],[58.25,20.6],[58.17,20.59],[58.1,20.57],[57.95,20.34],[57.86,20.24],[57.84,20.12],[57.8,19.95],[57.74,19.8],[57.71,19.68],[57.72,19.61],[57.76,19.43],[57.76,19.25],[57.79,19.15],[57.81,19.02],[57.74,18.98],[57.68,18.96],[57.43,18.94],[57.18,18.9],[56.96,18.83],[56.83,18.75],[56.66,18.59],[56.55,18.17],[56.38,17.99],[56.27,17.95],[56.0,17.94],[55.61,17.89],[55.48,17.84],[55.26,17.59],[55.24,17.5],[55.28,17.45],[55.3,17.38],[55.28,17.32],[55.17,17.16],[55.06,17.04],[54.77,16.96],[54.66,17.01],[54.57,17.03],[54.38,17.03],[54.07,17.01],[53.95,16.92],[53.78,16.86],[53.61,16.76],[53.3,16.72],[53.09,16.65],[53.02,16.78],[52.96,16.91],[52.9,17.04],[52.84,17.18],[52.8,17.27],[52.73,17.3],[52.69,17.4],[52.64,17.5],[52.6,17.6],[52.55,17.7],[52.51,17.8],[52.46,17.9],[52.42,18.0],[52.38,18.1],[52.33,18.2],[52.29,18.3],[52.24,18.4],[52.2,18.5],[52.15,18.6],[52.11,18.7],[52.07,18.8],[52.02,18.9],[51.98,19.0],[52.12,19.04],[52.29,19.1],[52.46,19.16],[52.63,19.22],[52.81,19.27],[52.98,19.33],[53.15,19.39],[53.32,19.44],[53.49,19.5],[53.67,19.56],[53.84,19.62],[54.01,19.67],[54.18,19.73],[54.35,19.79],[54.53,19.85],[54.7,19.9],[54.87,19.96],[54.98,20.0],[55.02,20.13],[55.06,20.24],[55.09,20.35],[55.13,20.46],[55.17,20.57],[55.2,20.68],[55.24,20.79],[55.28,20.9],[55.31,21.01],[55.35,21.13],[55.39,21.24],[55.42,21.35],[55.46,21.46],[55.5,21.57],[55.53,21.68],[55.57,21.79],[55.61,21.9],[55.64,22.0],[55.58,22.1],[55.49,22.23],[55.4,22.37],[55.32,22.5],[55.26,22.59],[55.19,22.7]],[[56.3,25.65],[56.28,25.63],[56.25,25.63],[56.18,25.64],[56.14,25.69],[56.15,25.75],[56.15,25.85],[56.17,25.95],[56.17,26.05],[56.12,26.07],[56.08,26.06],[56.16,26.21],[56.2,26.23],[56.23,26.22],[56.31,26.24],[56.35,26.31],[56.38,26.36],[56.41,26.35],[56.43,26.33],[56.42,26.21],[56.42,26.11],[56.37,25.8],[56.33,25.75],[56.31,25.71],[56.3,25.65]],[[56.21,25.21],[56.22,25.27],[56.23,25.3],[56.28,25.3],[56.29,25.28],[56.28,25.24],[56.24,25.21],[56.21,25.21]],[[58.72,20.22],[58.66,20.2],[58.64,20.21],[58.64,20.34],[58.79,20.5],[58.88,20.68],[58.95,20.52],[58.84,20.42],[58.77,20.27],[58.72,20.22]]]},{"n":"Pakistan","r":[[[60.84,29.86],[61.22,29.75],[61.52,29.67],[62.0,29.53],[62.37,29.43],[62.48,29.41],[63.57,29.5],[63.97,29.43],[64.1,29.39],[64.12,29.41],[64.17,29.46],[64.27,29.51],[64.39,29.54],[64.52,29.56],[64.7,29.57],[64.83,29.56],[64.92,29.55],[65.1,29.56],[65.18,29.58],[65.47,29.65],[65.67,29.7],[65.96,29.78],[66.18,29.84],[66.23,29.87],[66.29,29.92],[66.31,29.97],[66.25,30.04],[66.24,30.11],[66.28,30.19],[66.31,30.32],[66.3,30.5],[66.29,30.61],[66.35,30.8],[66.4,30.91],[66.5,30.96],[66.57,31.0],[66.6,31.02],[66.62,31.05],[66.73,31.19],[66.83,31.26],[66.92,31.31],[67.03,31.3],[67.12,31.24],[67.29,31.22],[67.45,31.23],[67.6,31.28],[67.66,31.31],[67.74,31.34],[67.73,31.38],[67.65,31.41],[67.6,31.45],[67.58,31.51],[67.63,31.54],[67.74,31.55],[68.02,31.68],[68.13,31.76],[68.16,31.8],[68.21,31.81],[68.32,31.77],[68.44,31.75],[68.52,31.79],[68.6,31.8],[68.67,31.76],[68.71,31.71],[68.78,31.65],[68.87,31.63],[68.97,31.67],[69.08,31.74],[69.19,31.84],[69.28,31.94],[69.26,32.25],[69.24,32.43],[69.29,32.53],[69.36,32.59],[69.41,32.68],[69.4,32.76],[69.45,32.83],[69.5,33.02],[69.57,33.06],[69.7,33.09],[69.92,33.11],[70.09,33.2],[70.26,33.29],[70.28,33.37],[70.22,33.45],[70.13,33.62],[70.06,33.72],[69.87,33.9],[69.89,34.01],[69.99,34.05],[70.25,33.98],[70.33,33.96],[70.42,33.95],[70.65,33.95],[70.85,33.98],[71.05,34.05],[71.09,34.12],[71.09,34.2],[71.09,34.27],[71.1,34.37],[71.02,34.43],[70.98,34.49],[70.97,34.53],[71.02,34.55],[71.07,34.6],[71.11,34.68],[71.23,34.78],[71.29,34.87],[71.36,34.91],[71.46,34.97],[71.52,35.05],[71.55,35.1],[71.6,35.15],[71.62,35.18],[71.61,35.21],[71.58,35.25],[71.55,35.29],[71.55,35.33],[71.57,35.37],[71.6,35.41],[71.59,35.46],[71.57,35.55],[71.52,35.6],[71.48,35.71],[71.43,35.83],[71.4,35.88],[71.34,35.94],[71.22,36.0],[71.19,36.04],[71.23,36.12],[71.31,36.17],[71.46,36.29],[71.55,36.38],[71.62,36.44],[71.72,36.43],[71.77,36.43],[71.82,36.49],[71.92,36.53],[72.1,36.63],[72.16,36.7],[72.25,36.73],[72.33,36.74],[72.43,36.77],[72.53,36.8],[72.62,36.83],[72.77,36.84],[72.99,36.85],[73.12,36.87],[73.41,36.88],[73.73,36.89],[73.77,36.89],[73.91,36.85],[74.0,36.82],[74.04,36.83],[74.19,36.9],[74.43,36.98],[74.54,37.02],[74.6,37.04],[74.69,37.04],[74.77,37.01],[74.84,36.98],[74.89,36.95],[74.95,36.97],[75.05,36.99],[75.15,36.97],[75.35,36.91],[75.38,36.88],[75.42,36.74],[75.46,36.73],[75.57,36.76],[75.67,36.74],[75.77,36.69],[75.84,36.65],[75.88,36.6],[75.93,36.52],[75.95,36.46],[75.97,36.38],[75.97,36.17],[75.93,36.13],[75.9,36.09],[75.91,36.05],[75.95,36.02],[76.01,36.0],[76.07,35.98],[76.1,35.95],[76.15,35.83],[76.18,35.81],[76.25,35.81],[76.39,35.84],[76.5,35.88],[76.55,35.89],[76.56,35.77],[76.63,35.73],[76.73,35.68],[76.77,35.66],[76.81,35.57],[76.88,35.44],[76.93,35.35],[76.98,35.25],[77.0,35.2],[77.05,35.11],[77.03,35.06],[77.0,34.99],[76.89,34.94],[76.78,34.9],[76.76,34.88],[76.75,34.85],[76.7,34.79],[76.59,34.74],[76.51,34.74],[76.46,34.76],[76.17,34.67],[76.04,34.67],[75.94,34.61],[75.86,34.56],[75.71,34.5],[75.61,34.5],[75.45,34.54],[75.26,34.6],[75.19,34.64],[75.12,34.64],[74.95,34.65],[74.79,34.68],[74.59,34.72],[74.5,34.73],[74.3,34.77],[74.17,34.72],[74.06,34.68],[73.96,34.65],[73.88,34.53],[73.85,34.49],[73.81,34.42],[73.79,34.38],[73.81,34.33],[73.92,34.29],[73.97,34.24],[73.98,34.19],[73.94,34.14],[73.9,34.11],[73.9,34.08],[73.92,34.04],[73.95,34.02],[74.11,34.0],[74.21,34.0],[74.25,33.99],[74.25,33.95],[74.22,33.89],[74.08,33.84],[74.0,33.79],[73.98,33.72],[73.98,33.67],[74.0,33.63],[74.07,33.59],[74.13,33.55],[74.15,33.51],[74.14,33.46],[74.12,33.38],[74.05,33.3],[73.99,33.24],[73.99,33.22],[74.0,33.19],[74.05,33.14],[74.13,33.08],[74.22,33.02],[74.28,33.01],[74.3,32.99],[74.32,32.93],[74.33,32.86],[74.31,32.81],[74.35,32.77],[74.48,32.77],[74.59,32.75],[74.63,32.77],[74.66,32.76],[74.64,32.61],[74.66,32.52],[74.69,32.49],[74.79,32.46],[74.99,32.46],[75.1,32.42],[75.23,32.37],[75.3,32.32],[75.33,32.28],[75.32,32.22],[75.25,32.14],[75.14,32.1],[75.07,32.09],[74.74,31.95],[74.64,31.89],[74.56,31.82],[74.53,31.77],[74.51,31.71],[74.58,31.52],[74.59,31.47],[74.53,31.26],[74.52,31.19],[74.54,31.13],[74.61,31.11],[74.63,31.07],[74.63,31.03],[74.51,30.96],[74.38,30.89],[74.34,30.89],[74.22,30.77],[74.01,30.52],[73.9,30.44],[73.89,30.39],[73.88,30.35],[73.92,30.28],[73.93,30.22],[73.89,30.16],[73.81,30.09],[73.66,30.03],[73.47,29.97],[73.38,29.93],[73.32,29.77],[73.26,29.61],[73.23,29.55],[73.13,29.36],[72.95,29.09],[72.9,29.03],[72.63,28.9],[72.34,28.75],[72.29,28.7],[72.23,28.57],[72.18,28.42],[72.13,28.35],[71.95,28.18],[71.89,28.05],[71.87,27.96],[71.72,27.92],[71.54,27.87],[71.29,27.86],[71.18,27.83],[70.87,27.71],[70.8,27.71],[70.74,27.73],[70.69,27.77],[70.65,27.84],[70.63,27.94],[70.57,27.98],[70.49,28.02],[70.4,28.03],[70.32,27.98],[70.24,27.93],[70.19,27.89],[70.14,27.85],[70.05,27.69],[69.9,27.47],[69.72,27.31],[69.66,27.26],[69.62,27.23],[69.57,27.17],[69.54,27.12],[69.49,26.95],[69.47,26.8],[69.48,26.77],[69.51,26.74],[69.6,26.7],[69.74,26.63],[69.91,26.59],[70.06,26.58],[70.11,26.55],[70.15,26.51],[70.16,26.47],[70.15,26.35],[70.13,26.21],[70.08,26.07],[70.08,25.99],[70.1,25.91],[70.26,25.71],[70.33,25.69],[70.45,25.68],[70.51,25.69],[70.57,25.71],[70.61,25.69],[70.65,25.67],[70.66,25.63],[70.65,25.42],[70.7,25.33],[70.8,25.21],[70.88,25.06],[70.95,24.89],[71.02,24.76],[71.05,24.69],[71.0,24.65],[70.98,24.62],[70.97,24.57],[70.98,24.52],[70.97,24.49],[71.01,24.44],[71.05,24.43],[71.04,24.4],[70.98,24.36],[70.93,24.36],[70.89,24.34],[70.81,24.26],[70.77,24.25],[70.72,24.24],[70.66,24.25],[70.58,24.28],[70.56,24.33],[70.57,24.39],[70.55,24.42],[70.49,24.41],[70.29,24.36],[70.1,24.29],[70.07,24.24],[70.02,24.19],[69.93,24.17],[69.81,24.17],[69.72,24.17],[69.63,24.23],[69.56,24.27],[69.44,24.28],[69.24,24.27],[69.12,24.27],[69.05,24.29],[68.98,24.27],[68.9,24.29],[68.86,24.27],[68.83,24.26],[68.8,24.31],[68.78,24.31],[68.76,24.31],[68.74,24.29],[68.73,24.27],[68.72,23.96],[68.59,23.97],[68.49,23.97],[68.38,23.95],[68.28,23.93],[68.23,23.9],[68.17,23.86],[68.15,23.8],[68.12,23.75],[68.07,23.82],[68.04,23.85],[68.0,23.83],[67.95,23.83],[67.86,23.9],[67.82,23.83],[67.67,23.81],[67.65,23.87],[67.65,23.92],[67.56,23.88],[67.5,23.94],[67.48,24.02],[67.45,24.04],[67.43,24.06],[67.37,24.09],[67.31,24.17],[67.3,24.26],[67.29,24.37],[67.17,24.76],[67.1,24.79],[66.7,24.86],[66.68,24.93],[66.71,25.11],[66.7,25.23],[66.57,25.38],[66.53,25.48],[66.43,25.58],[66.32,25.6],[66.22,25.59],[66.16,25.55],[66.13,25.49],[66.36,25.51],[66.41,25.49],[66.47,25.45],[66.4,25.45],[66.33,25.47],[66.23,25.46],[65.88,25.42],[65.68,25.36],[65.41,25.37],[65.06,25.31],[64.78,25.31],[64.66,25.18],[64.59,25.21],[64.54,25.24],[64.15,25.33],[64.12,25.37],[64.06,25.4],[63.99,25.35],[63.94,25.34],[63.72,25.39],[63.56,25.35],[63.5,25.3],[63.49,25.21],[63.29,25.23],[63.17,25.25],[63.02,25.22],[62.66,25.26],[62.57,25.25],[62.44,25.2],[62.39,25.15],[62.32,25.13],[62.25,25.2],[62.2,25.22],[62.15,25.21],[62.09,25.16],[61.91,25.13],[61.74,25.14],[61.57,25.19],[61.59,25.2],[61.62,25.29],[61.64,25.58],[61.67,25.69],[61.66,25.75],[61.67,25.77],[61.74,25.82],[61.75,25.84],[61.78,26.0],[61.81,26.17],[61.84,26.23],[61.87,26.24],[62.09,26.32],[62.13,26.37],[62.24,26.36],[62.25,26.37],[62.26,26.43],[62.31,26.49],[62.39,26.54],[62.44,26.56],[62.64,26.59],[62.75,26.64],[62.79,26.64],[63.09,26.63],[63.16,26.65],[63.17,26.67],[63.19,26.84],[63.24,26.86],[63.25,26.88],[63.23,27.0],[63.24,27.08],[63.31,27.12],[63.3,27.15],[63.26,27.21],[63.2,27.24],[63.17,27.25],[62.92,27.22],[62.81,27.23],[62.76,27.25],[62.75,27.27],[62.76,27.3],[62.76,27.36],[62.8,27.44],[62.81,27.5],[62.78,27.8],[62.74,28.0],[62.76,28.2],[62.76,28.24],[62.75,28.25],[62.72,28.25],[62.56,28.24],[62.43,28.36],[62.35,28.41],[62.13,28.48],[62.03,28.49],[61.89,28.55],[61.76,28.67],[61.62,28.79],[61.57,28.87],[61.51,29.01],[61.34,29.26],[61.34,29.33],[61.32,29.37],[61.15,29.54],[61.03,29.66],[60.84,29.86]]]},{"n":"Panama","r":[[[-77.37,8.66],[-77.39,8.64],[-77.45,8.57],[-77.48,8.5],[-77.41,8.43],[-77.39,8.35],[-77.35,8.27],[-77.28,8.19],[-77.21,8.03],[-77.2,7.97],[-77.22,7.93],[-77.28,7.91],[-77.35,7.84],[-77.36,7.75],[-77.35,7.71],[-77.54,7.57],[-77.59,7.54],[-77.62,7.56],[-77.66,7.63],[-77.71,7.69],[-77.73,7.71],[-77.75,7.71],[-77.76,7.7],[-77.77,7.67],[-77.74,7.54],[-77.76,7.48],[-77.83,7.44],[-77.9,7.23],[-77.93,7.26],[-78.17,7.54],[-78.38,7.9],[-78.42,8.06],[-78.37,8.07],[-78.32,8.07],[-78.29,8.09],[-78.25,8.14],[-78.28,8.25],[-78.18,8.33],[-78.14,8.39],[-78.11,8.38],[-78.05,8.28],[-77.95,8.23],[-77.83,8.15],[-77.76,8.13],[-77.85,8.22],[-78.01,8.33],[-78.06,8.4],[-78.1,8.5],[-78.16,8.45],[-78.19,8.42],[-78.22,8.4],[-78.25,8.42],[-78.26,8.45],[-78.35,8.46],[-78.37,8.49],[-78.4,8.51],[-78.39,8.44],[-78.37,8.4],[-78.38,8.36],[-78.41,8.36],[-78.44,8.4],[-78.47,8.45],[-78.51,8.63],[-78.62,8.71],[-78.67,8.74],[-78.71,8.75],[-78.77,8.81],[-78.85,8.84],[-78.96,8.93],[-79.09,9.0],[-79.25,9.02],[-79.44,9.01],[-79.51,8.97],[-79.55,8.92],[-79.57,8.9],[-79.69,8.85],[-79.73,8.78],[-79.76,8.71],[-79.82,8.64],[-79.75,8.6],[-80.13,8.35],[-80.2,8.31],[-80.37,8.29],[-80.41,8.26],[-80.46,8.21],[-80.47,8.14],[-80.46,8.08],[-80.41,8.03],[-80.37,8.0],[-80.26,7.85],[-80.08,7.67],[-80.04,7.6],[-80.01,7.5],[-80.07,7.45],[-80.11,7.43],[-80.29,7.43],[-80.35,7.39],[-80.37,7.32],[-80.44,7.27],[-80.67,7.23],[-80.85,7.22],[-80.9,7.28],[-80.91,7.44],[-81.04,7.71],[-81.06,7.9],[-81.09,7.88],[-81.16,7.85],[-81.18,7.81],[-81.2,7.67],[-81.22,7.62],[-81.27,7.63],[-81.37,7.68],[-81.5,7.72],[-81.68,8.02],[-81.69,8.07],[-81.73,8.14],[-81.86,8.17],[-81.97,8.22],[-82.1,8.22],[-82.16,8.19],[-82.22,8.23],[-82.24,8.31],[-82.36,8.27],[-82.53,8.29],[-82.68,8.32],[-82.78,8.3],[-82.87,8.25],[-82.85,8.1],[-82.88,8.07],[-82.88,8.13],[-82.91,8.2],[-82.95,8.26],[-83.02,8.32],[-83.03,8.34],[-83.0,8.37],[-82.86,8.45],[-82.84,8.49],[-82.84,8.56],[-82.86,8.64],[-82.92,8.74],[-82.88,8.81],[-82.81,8.86],[-82.74,8.9],[-82.73,8.92],[-82.74,8.95],[-82.78,8.99],[-82.88,9.06],[-82.94,9.06],[-82.94,9.25],[-82.94,9.45],[-82.93,9.47],[-82.89,9.48],[-82.86,9.51],[-82.84,9.57],[-82.8,9.59],[-82.72,9.55],[-82.64,9.51],[-82.61,9.52],[-82.59,9.54],[-82.57,9.56],[-82.56,9.58],[-82.5,9.52],[-82.37,9.43],[-82.36,9.38],[-82.38,9.34],[-82.34,9.21],[-82.27,9.19],[-82.2,9.22],[-82.19,9.19],[-82.2,9.17],[-82.24,9.14],[-82.24,9.03],[-82.13,8.98],[-82.08,8.93],[-81.89,8.96],[-81.83,8.94],[-81.78,8.96],[-81.83,9.05],[-81.9,9.11],[-81.89,9.14],[-81.84,9.12],[-81.8,9.07],[-81.71,9.02],[-81.55,8.83],[-81.35,8.78],[-81.2,8.79],[-81.06,8.81],[-80.84,8.89],[-80.68,9.02],[-80.55,9.08],[-80.13,9.21],[-79.98,9.34],[-79.92,9.36],[-79.86,9.38],[-79.72,9.48],[-79.65,9.56],[-79.58,9.6],[-79.36,9.57],[-79.21,9.53],[-79.11,9.54],[-79.02,9.51],[-78.97,9.45],[-78.93,9.43],[-78.7,9.43],[-78.5,9.41],[-78.08,9.24],[-77.83,9.07],[-77.7,8.89],[-77.37,8.66]],[[-81.6,7.33],[-81.66,7.33],[-81.77,7.37],[-81.85,7.45],[-81.86,7.48],[-81.86,7.51],[-81.81,7.59],[-81.75,7.62],[-81.73,7.62],[-81.67,7.52],[-81.71,7.49],[-81.69,7.42],[-81.61,7.38],[-81.6,7.33]],[[-79.07,8.25],[-79.11,8.21],[-79.13,8.25],[-79.1,8.3],[-79.09,8.3],[-79.07,8.25]],[[-78.9,8.27],[-78.92,8.23],[-78.96,8.33],[-78.96,8.35],[-78.96,8.44],[-78.92,8.46],[-78.88,8.46],[-78.86,8.45],[-78.84,8.35],[-78.85,8.3],[-78.9,8.27]],[[-82.23,9.38],[-82.24,9.33],[-82.32,9.42],[-82.28,9.43],[-82.26,9.43],[-82.23,9.38]]]},{"n":"Pitcairn Islands","r":[[[-128.29,-24.4],[-128.3,-24.41],[-128.32,-24.4],[-128.34,-24.37],[-128.35,-24.34],[-128.33,-24.32],[-128.3,-24.33],[-128.29,-24.36],[-128.29,-24.4]]]},{"n":"Peru","r":[[[-69.58,-10.95],[-69.45,-11.17],[-69.36,-11.33],[-69.26,-11.51],[-69.17,-11.65],[-69.05,-11.88],[-68.94,-12.07],[-68.82,-12.27],[-68.69,-12.5],[-68.73,-12.56],[-68.76,-12.61],[-68.76,-12.69],[-68.81,-12.73],[-68.87,-12.76],[-68.93,-12.82],[-68.98,-12.88],[-68.98,-12.96],[-68.97,-13.38],[-68.98,-13.5],[-69.02,-13.59],[-69.05,-13.64],[-69.07,-13.68],[-69.02,-13.78],[-68.97,-13.98],[-68.94,-14.01],[-68.89,-14.09],[-68.87,-14.17],[-68.88,-14.2],[-68.97,-14.23],[-69.0,-14.27],[-69.01,-14.38],[-69.05,-14.42],[-69.12,-14.47],[-69.16,-14.53],[-69.2,-14.57],[-69.23,-14.6],[-69.25,-14.67],[-69.28,-14.75],[-69.36,-14.8],[-69.37,-14.89],[-69.37,-14.96],[-69.33,-15.04],[-69.19,-15.2],[-69.17,-15.24],[-69.25,-15.33],[-69.3,-15.4],[-69.42,-15.6],[-69.42,-15.64],[-69.39,-15.74],[-69.22,-16.15],[-69.19,-16.18],[-69.13,-16.22],[-69.05,-16.22],[-68.91,-16.26],[-68.85,-16.31],[-68.84,-16.34],[-68.86,-16.35],[-68.93,-16.39],[-69.01,-16.43],[-69.03,-16.48],[-69.04,-16.54],[-69.02,-16.64],[-69.05,-16.67],[-69.13,-16.71],[-69.2,-16.77],[-69.27,-16.86],[-69.38,-17.0],[-69.42,-17.04],[-69.44,-17.09],[-69.5,-17.1],[-69.62,-17.2],[-69.65,-17.25],[-69.63,-17.29],[-69.56,-17.33],[-69.52,-17.39],[-69.51,-17.46],[-69.51,-17.5],[-69.51,-17.51],[-69.59,-17.57],[-69.68,-17.65],[-69.81,-17.66],[-69.85,-17.7],[-69.84,-17.79],[-69.8,-17.9],[-69.8,-17.99],[-69.84,-18.09],[-69.93,-18.21],[-70.06,-18.28],[-70.18,-18.33],[-70.28,-18.33],[-70.38,-18.33],[-70.42,-18.35],[-70.49,-18.28],[-70.82,-18.05],[-70.94,-17.93],[-71.06,-17.88],[-71.34,-17.68],[-71.36,-17.62],[-71.4,-17.42],[-71.44,-17.37],[-71.53,-17.29],[-71.77,-17.2],[-71.87,-17.15],[-71.97,-17.06],[-72.11,-17.0],[-72.27,-16.88],[-72.36,-16.77],[-72.47,-16.71],[-72.79,-16.61],[-72.96,-16.52],[-73.26,-16.39],[-73.4,-16.3],[-73.73,-16.2],[-73.82,-16.15],[-74.15,-15.91],[-74.37,-15.83],[-74.55,-15.7],[-75.1,-15.41],[-75.19,-15.32],[-75.27,-15.18],[-75.4,-15.09],[-75.53,-14.9],[-75.74,-14.78],[-75.93,-14.63],[-76.01,-14.5],[-76.14,-14.32],[-76.18,-14.23],[-76.29,-14.13],[-76.3,-13.95],[-76.38,-13.86],[-76.32,-13.82],[-76.26,-13.8],[-76.18,-13.52],[-76.22,-13.37],[-76.43,-13.11],[-76.5,-12.98],[-76.56,-12.82],[-76.64,-12.73],[-76.76,-12.53],[-76.83,-12.35],[-76.99,-12.22],[-77.04,-12.17],[-77.06,-12.11],[-77.15,-12.06],[-77.16,-11.92],[-77.22,-11.66],[-77.31,-11.53],[-77.63,-11.29],[-77.64,-11.19],[-77.66,-11.02],[-77.74,-10.84],[-78.1,-10.26],[-78.19,-10.09],[-78.28,-9.81],[-78.36,-9.65],[-78.45,-9.37],[-78.58,-9.16],[-78.66,-8.97],[-78.75,-8.74],[-78.76,-8.62],[-78.93,-8.4],[-79.01,-8.21],[-79.16,-8.05],[-79.31,-7.92],[-79.38,-7.84],[-79.59,-7.42],[-79.62,-7.3],[-79.76,-7.07],[-79.9,-6.9],[-79.99,-6.77],[-80.11,-6.65],[-80.81,-6.28],[-81.06,-6.13],[-81.14,-6.06],[-81.18,-5.94],[-81.16,-5.88],[-81.09,-5.81],[-80.99,-5.86],[-80.93,-5.84],[-80.88,-5.76],[-80.88,-5.64],[-80.94,-5.48],[-81.17,-5.17],[-81.15,-5.1],[-81.11,-5.03],[-81.2,-4.88],[-81.29,-4.76],[-81.34,-4.67],[-81.28,-4.32],[-81.23,-4.23],[-80.89,-3.88],[-80.8,-3.73],[-80.65,-3.64],[-80.5,-3.5],[-80.32,-3.39],[-80.3,-3.41],[-80.27,-3.42],[-80.27,-3.46],[-80.27,-3.49],[-80.25,-3.52],[-80.24,-3.58],[-80.22,-3.61],[-80.22,-3.65],[-80.22,-3.71],[-80.23,-3.74],[-80.22,-3.79],[-80.18,-3.88],[-80.19,-3.91],[-80.23,-3.92],[-80.27,-3.95],[-80.3,-4.01],[-80.36,-4.0],[-80.44,-3.98],[-80.49,-4.01],[-80.51,-4.07],[-80.49,-4.12],[-80.49,-4.17],[-80.45,-4.21],[-80.35,-4.21],[-80.44,-4.34],[-80.49,-4.39],[-80.48,-4.43],[-80.42,-4.46],[-80.38,-4.46],[-80.29,-4.42],[-80.23,-4.35],[-80.2,-4.31],[-80.14,-4.3],[-80.06,-4.33],[-79.96,-4.39],[-79.85,-4.45],[-79.8,-4.48],[-79.71,-4.47],[-79.64,-4.45],[-79.58,-4.5],[-79.52,-4.54],[-79.5,-4.67],[-79.46,-4.77],[-79.4,-4.84],[-79.33,-4.93],[-79.27,-4.96],[-79.19,-4.96],[-79.08,-4.99],[-79.03,-4.97],[-79.0,-4.91],[-78.98,-4.87],[-78.92,-4.86],[-78.91,-4.82],[-78.93,-4.77],[-78.91,-4.71],[-78.86,-4.67],[-78.74,-4.59],[-78.69,-4.56],[-78.67,-4.52],[-78.65,-4.46],[-78.66,-4.43],[-78.69,-4.38],[-78.68,-4.33],[-78.65,-4.25],[-78.6,-4.16],[-78.57,-4.04],[-78.55,-3.99],[-78.51,-3.95],[-78.49,-3.9],[-78.47,-3.84],[-78.42,-3.78],[-78.42,-3.71],[-78.4,-3.67],[-78.4,-3.59],[-78.35,-3.43],[-78.35,-3.4],[-78.32,-3.39],[-78.28,-3.4],[-78.25,-3.44],[-78.24,-3.47],[-78.23,-3.49],[-78.19,-3.49],[-78.16,-3.47],[-78.16,-3.43],[-78.19,-3.4],[-78.19,-3.38],[-78.18,-3.35],[-78.13,-3.28],[-78.07,-3.21],[-77.94,-3.05],[-77.86,-2.98],[-77.66,-2.91],[-77.51,-2.86],[-77.36,-2.81],[-77.16,-2.74],[-76.88,-2.64],[-76.68,-2.56],[-76.5,-2.43],[-76.36,-2.33],[-76.24,-2.24],[-76.09,-2.13],[-75.89,-1.89],[-75.74,-1.73],[-75.64,-1.61],[-75.57,-1.53],[-75.51,-1.32],[-75.45,-1.07],[-75.42,-0.96],[-75.41,-0.92],[-75.38,-0.94],[-75.35,-0.97],[-75.31,-0.97],[-75.27,-0.97],[-75.25,-0.95],[-75.28,-0.71],[-75.28,-0.65],[-75.26,-0.59],[-75.26,-0.56],[-75.33,-0.51],[-75.42,-0.41],[-75.47,-0.32],[-75.49,-0.25],[-75.56,-0.2],[-75.63,-0.16],[-75.63,-0.12],[-75.58,-0.12],[-75.48,-0.16],[-75.4,-0.15],[-75.34,-0.14],[-75.28,-0.11],[-75.22,-0.04],[-75.18,-0.04],[-75.14,-0.05],[-75.05,-0.12],[-75.0,-0.16],[-74.95,-0.19],[-74.89,-0.2],[-74.84,-0.2],[-74.8,-0.2],[-74.78,-0.24],[-74.76,-0.3],[-74.69,-0.34],[-74.62,-0.37],[-74.56,-0.43],[-74.51,-0.47],[-74.47,-0.52],[-74.42,-0.58],[-74.37,-0.69],[-74.35,-0.77],[-74.33,-0.81],[-74.33,-0.85],[-74.28,-0.93],[-74.25,-0.97],[-74.18,-1.0],[-74.05,-1.03],[-73.99,-1.1],[-73.93,-1.13],[-73.86,-1.2],[-73.81,-1.22],[-73.74,-1.21],[-73.66,-1.25],[-73.61,-1.32],[-73.58,-1.4],[-73.52,-1.45],[-73.49,-1.54],[-73.53,-1.64],[-73.5,-1.69],[-73.44,-1.74],[-73.35,-1.78],[-73.27,-1.77],[-73.22,-1.79],[-73.2,-1.83],[-73.18,-1.88],[-73.15,-2.0],[-73.13,-2.08],[-73.16,-2.16],[-73.17,-2.21],[-73.15,-2.28],[-73.07,-2.31],[-72.99,-2.34],[-72.94,-2.39],[-72.89,-2.41],[-72.81,-2.41],[-72.71,-2.39],[-72.66,-2.36],[-72.63,-2.35],[-72.59,-2.37],[-72.5,-2.4],[-72.4,-2.43],[-72.3,-2.41],[-72.22,-2.4],[-72.14,-2.38],[-72.05,-2.32],[-71.98,-2.33],[-71.93,-2.29],[-71.87,-2.23],[-71.8,-2.17],[-71.75,-2.15],[-71.67,-2.18],[-71.56,-2.22],[-71.5,-2.28],[-71.45,-2.29],[-71.4,-2.33],[-71.3,-2.33],[-71.2,-2.31],[-71.11,-2.25],[-71.03,-2.23],[-70.97,-2.21],[-70.91,-2.22],[-70.71,-2.34],[-70.65,-2.41],[-70.58,-2.42],[-70.52,-2.45],[-70.42,-2.49],[-70.36,-2.53],[-70.29,-2.55],[-70.24,-2.61],[-70.16,-2.64],[-70.1,-2.66],[-70.06,-2.7],[-70.06,-2.73],[-70.07,-2.75],[-70.15,-2.86],[-70.29,-3.09],[-70.42,-3.29],[-70.62,-3.6],[-70.74,-3.78],[-70.71,-3.79],[-70.53,-3.87],[-70.49,-3.87],[-70.42,-3.85],[-70.38,-3.82],[-70.34,-3.81],[-70.3,-3.84],[-70.24,-3.88],[-70.2,-4.0],[-70.17,-4.05],[-70.09,-4.09],[-70.02,-4.16],[-69.97,-4.24],[-69.97,-4.3],[-70.0,-4.33],[-70.05,-4.33],[-70.13,-4.29],[-70.18,-4.3],[-70.24,-4.3],[-70.32,-4.25],[-70.34,-4.19],[-70.4,-4.15],[-70.53,-4.17],[-70.63,-4.17],[-70.72,-4.16],[-70.8,-4.17],[-70.87,-4.23],[-70.92,-4.3],[-70.97,-4.35],[-71.14,-4.39],[-71.24,-4.39],[-71.32,-4.42],[-71.44,-4.44],[-71.52,-4.47],[-71.67,-4.49],[-71.84,-4.5],[-71.94,-4.55],[-71.98,-4.57],[-72.08,-4.64],[-72.26,-4.75],[-72.35,-4.79],[-72.47,-4.9],[-72.61,-5.01],[-72.7,-5.07],[-72.83,-5.09],[-72.89,-5.12],[-72.91,-5.16],[-72.9,-5.2],[-72.92,-5.3],[-72.96,-5.5],[-72.97,-5.59],[-72.98,-5.63],[-73.07,-5.79],[-73.16,-5.93],[-73.21,-6.03],[-73.24,-6.1],[-73.21,-6.16],[-73.17,-6.26],[-73.14,-6.34],[-73.13,-6.4],[-73.14,-6.47],[-73.18,-6.53],[-73.24,-6.56],[-73.33,-6.57],[-73.5,-6.68],[-73.69,-6.83],[-73.76,-6.91],[-73.78,-6.97],[-73.8,-7.08],[-73.79,-7.14],[-73.76,-7.17],[-73.72,-7.26],[-73.72,-7.31],[-73.75,-7.34],[-73.8,-7.34],[-73.85,-7.35],[-73.89,-7.37],[-73.93,-7.37],[-73.96,-7.38],[-73.96,-7.42],[-73.95,-7.46],[-73.96,-7.51],[-73.98,-7.54],[-74.0,-7.56],[-73.98,-7.59],[-73.95,-7.61],[-73.89,-7.65],[-73.82,-7.74],[-73.77,-7.75],[-73.72,-7.78],[-73.71,-7.83],[-73.73,-7.88],[-73.77,-7.9],[-73.78,-7.94],[-73.72,-7.99],[-73.68,-8.02],[-73.64,-8.07],[-73.61,-8.15],[-73.61,-8.19],[-73.57,-8.25],[-73.55,-8.3],[-73.55,-8.35],[-73.49,-8.39],[-73.44,-8.43],[-73.4,-8.46],[-73.36,-8.48],[-73.35,-8.51],[-73.36,-8.57],[-73.3,-8.65],[-73.2,-8.72],[-73.12,-8.81],[-73.07,-8.88],[-72.97,-8.99],[-72.97,-9.12],[-73.09,-9.27],[-73.21,-9.41],[-73.01,-9.41],[-72.81,-9.41],[-72.61,-9.45],[-72.46,-9.49],[-72.38,-9.51],[-72.32,-9.56],[-72.29,-9.63],[-72.27,-9.69],[-72.26,-9.77],[-72.17,-9.84],[-72.18,-9.91],[-72.18,-10.0],[-72.14,-10.01],[-71.89,-10.01],[-71.61,-10.01],[-71.34,-9.99],[-71.24,-9.97],[-71.12,-9.85],[-71.04,-9.82],[-70.97,-9.77],[-70.88,-9.67],[-70.82,-9.63],[-70.76,-9.57],[-70.67,-9.52],[-70.64,-9.48],[-70.61,-9.46],[-70.54,-9.44],[-70.57,-9.49],[-70.59,-9.54],[-70.6,-9.62],[-70.57,-9.7],[-70.59,-9.77],[-70.64,-9.82],[-70.64,-9.97],[-70.64,-10.18],[-70.64,-10.36],[-70.64,-10.59],[-70.64,-10.84],[-70.64,-11.01],[-70.6,-10.98],[-70.53,-10.95],[-70.45,-11.02],[-70.39,-11.06],[-70.34,-11.07],[-70.29,-11.06],[-70.22,-11.05],[-70.07,-10.98],[-69.96,-10.93],[-69.84,-10.93],[-69.67,-10.95],[-69.58,-10.95]]]},{"n":"Philippines","r":[[[120.25,5.26],[120.22,5.2],[120.19,5.17],[120.15,5.18],[120.12,5.22],[120.1,5.17],[120.01,5.15],[119.96,5.08],[119.88,5.06],[119.82,5.07],[119.83,5.13],[119.98,5.23],[120.08,5.26],[120.17,5.33],[120.21,5.34],[120.23,5.28],[120.25,5.26]],[[121.16,6.08],[121.21,6.0],[121.28,6.02],[121.39,6.0],[121.41,5.96],[121.41,5.94],[121.29,5.87],[121.22,5.94],[121.08,5.89],[121.02,5.92],[120.93,5.9],[120.88,5.95],[120.9,6.01],[121.04,6.1],[121.16,6.08]],[[122.09,6.43],[121.99,6.41],[121.96,6.42],[121.88,6.52],[121.87,6.56],[121.81,6.61],[121.83,6.66],[121.91,6.68],[122.06,6.74],[122.29,6.64],[122.32,6.6],[122.25,6.58],[122.2,6.48],[122.09,6.43]],[[125.78,6.96],[125.77,6.91],[125.71,7.04],[125.68,7.07],[125.71,7.19],[125.78,7.13],[125.78,6.96]],[[122.94,7.41],[122.95,7.39],[122.94,7.36],[122.84,7.31],[122.8,7.32],[122.8,7.39],[122.82,7.43],[122.87,7.4],[122.91,7.43],[122.94,7.41]],[[117.08,7.88],[117.03,7.81],[116.97,7.89],[116.98,8.02],[116.99,8.05],[117.08,8.07],[117.08,7.88]],[[117.36,8.21],[117.29,8.19],[117.27,8.25],[117.28,8.31],[117.33,8.31],[117.35,8.29],[117.36,8.21]],[[124.81,9.14],[124.78,9.08],[124.67,9.13],[124.64,9.18],[124.65,9.23],[124.71,9.24],[124.74,9.24],[124.79,9.19],[124.81,9.14]],[[123.7,9.24],[123.71,9.13],[123.61,9.1],[123.54,9.13],[123.49,9.19],[123.49,9.22],[123.54,9.21],[123.63,9.27],[123.65,9.28],[123.7,9.24]],[[125.97,9.59],[125.95,9.57],[125.92,9.62],[125.95,9.74],[125.97,9.76],[125.99,9.68],[125.97,9.59]],[[126.01,9.32],[126.09,9.26],[126.19,9.28],[126.19,9.12],[126.21,9.08],[126.3,8.95],[126.32,8.84],[126.26,8.74],[126.22,8.7],[126.14,8.63],[126.14,8.6],[126.17,8.56],[126.28,8.54],[126.37,8.48],[126.38,8.33],[126.46,8.2],[126.46,8.15],[126.43,7.93],[126.44,7.83],[126.49,7.76],[126.54,7.72],[126.57,7.68],[126.59,7.55],[126.59,7.33],[126.58,7.25],[126.55,7.18],[126.44,7.01],[126.29,6.88],[126.22,6.89],[126.19,6.85],[126.24,6.73],[126.22,6.48],[126.19,6.31],[126.14,6.4],[126.11,6.49],[126.08,6.73],[126.04,6.84],[125.98,6.94],[125.96,7.03],[125.9,7.12],[125.82,7.33],[125.77,7.32],[125.69,7.26],[125.67,7.22],[125.66,7.16],[125.64,7.11],[125.54,7.02],[125.46,6.91],[125.4,6.8],[125.38,6.69],[125.43,6.61],[125.49,6.57],[125.56,6.5],[125.59,6.47],[125.67,6.22],[125.67,5.98],[125.61,5.87],[125.46,5.66],[125.35,5.6],[125.29,5.63],[125.24,5.76],[125.23,5.81],[125.26,5.93],[125.27,6.03],[125.23,6.07],[125.19,6.06],[125.17,6.05],[125.08,5.91],[125.04,5.87],[124.98,5.87],[124.93,5.88],[124.64,6.0],[124.4,6.12],[124.21,6.23],[124.08,6.4],[124.05,6.53],[124.05,6.67],[123.99,6.86],[123.98,6.93],[123.99,6.99],[124.05,7.11],[124.12,7.18],[124.16,7.22],[124.19,7.27],[124.21,7.33],[124.21,7.4],[124.18,7.44],[124.07,7.58],[123.97,7.66],[123.76,7.74],[123.72,7.79],[123.67,7.82],[123.61,7.83],[123.55,7.83],[123.49,7.81],[123.48,7.76],[123.48,7.71],[123.48,7.67],[123.39,7.41],[123.28,7.46],[123.18,7.53],[123.15,7.58],[123.14,7.63],[123.12,7.67],[123.1,7.7],[123.05,7.61],[122.99,7.55],[122.92,7.53],[122.84,7.53],[122.82,7.56],[122.79,7.72],[122.71,7.77],[122.62,7.76],[122.5,7.67],[122.47,7.64],[122.45,7.56],[122.32,7.34],[122.25,7.17],[122.18,7.0],[122.14,6.95],[122.1,6.91],[122.03,6.93],[121.96,6.97],[121.9,7.08],[121.92,7.2],[121.99,7.28],[122.05,7.36],[122.11,7.66],[122.12,7.77],[122.13,7.81],[122.24,7.95],[122.34,8.03],[122.39,8.05],[122.59,8.09],[122.67,8.13],[122.8,8.13],[122.91,8.16],[123.0,8.22],[123.0,8.29],[123.0,8.36],[123.02,8.4],[123.05,8.43],[123.1,8.48],[123.15,8.52],[123.29,8.54],[123.34,8.57],[123.38,8.62],[123.43,8.7],[123.5,8.68],[123.56,8.65],[123.68,8.62],[123.78,8.55],[123.85,8.43],[123.86,8.38],[123.88,8.19],[123.85,8.15],[123.75,8.06],[123.8,8.05],[123.93,8.13],[124.0,8.16],[124.16,8.2],[124.2,8.23],[124.23,8.27],[124.28,8.39],[124.33,8.51],[124.36,8.56],[124.4,8.6],[124.45,8.61],[124.62,8.52],[124.73,8.56],[124.76,8.69],[124.79,8.87],[124.81,8.92],[124.87,8.97],[124.94,8.96],[125.05,8.89],[125.14,8.87],[125.18,8.92],[125.21,9.03],[125.25,9.03],[125.38,8.99],[125.5,9.01],[125.53,9.14],[125.51,9.28],[125.41,9.67],[125.47,9.76],[125.52,9.76],[125.64,9.65],[125.88,9.51],[125.95,9.43],[126.01,9.32]],[[126.06,9.77],[126.05,9.76],[125.99,9.84],[126.0,9.93],[126.07,10.06],[126.13,9.94],[126.13,9.89],[126.12,9.87],[126.17,9.8],[126.14,9.77],[126.06,9.77]],[[125.28,9.98],[125.29,9.93],[125.16,10.06],[125.13,10.16],[125.18,10.15],[125.23,10.12],[125.28,9.98]],[[124.59,9.79],[124.58,9.75],[124.51,9.75],[124.48,9.75],[124.4,9.65],[124.36,9.63],[124.12,9.6],[123.94,9.62],[123.87,9.68],[123.83,9.76],[123.82,9.82],[123.86,9.88],[123.91,9.92],[124.06,10.0],[124.09,10.06],[124.17,10.14],[124.34,10.16],[124.35,10.14],[124.37,10.13],[124.41,10.13],[124.49,10.07],[124.58,10.03],[124.56,9.88],[124.58,9.83],[124.59,9.79]],[[125.69,9.91],[125.67,9.89],[125.65,9.94],[125.59,10.0],[125.53,10.09],[125.49,10.12],[125.52,10.19],[125.52,10.31],[125.58,10.36],[125.61,10.38],[125.65,10.44],[125.67,10.44],[125.68,10.39],[125.65,10.25],[125.7,10.07],[125.68,9.96],[125.69,9.94],[125.69,9.91]],[[119.92,10.49],[119.79,10.46],[119.76,10.55],[119.85,10.64],[119.95,10.6],[120.01,10.57],[119.98,10.54],[119.92,10.49]],[[124.32,10.61],[124.29,10.6],[124.33,10.71],[124.37,10.69],[124.38,10.68],[124.38,10.63],[124.32,10.61]],[[122.65,10.47],[122.62,10.46],[122.6,10.46],[122.54,10.42],[122.52,10.49],[122.54,10.61],[122.63,10.7],[122.65,10.72],[122.67,10.74],[122.7,10.74],[122.73,10.71],[122.74,10.65],[122.68,10.5],[122.65,10.47]],[[123.13,9.06],[123.06,9.05],[122.99,9.06],[122.95,9.11],[122.87,9.32],[122.77,9.37],[122.66,9.41],[122.61,9.44],[122.56,9.48],[122.41,9.69],[122.4,9.82],[122.43,9.9],[122.47,9.96],[122.52,9.98],[122.65,9.98],[122.71,9.99],[122.86,10.09],[122.87,10.12],[122.87,10.28],[122.85,10.4],[122.82,10.5],[122.86,10.55],[122.91,10.6],[122.96,10.7],[122.97,10.77],[122.97,10.84],[122.98,10.89],[123.02,10.91],[123.22,10.99],[123.26,10.99],[123.51,10.92],[123.56,10.82],[123.57,10.78],[123.53,10.66],[123.49,10.58],[123.41,10.46],[123.34,10.33],[123.3,10.12],[123.27,10.06],[123.19,9.93],[123.16,9.86],[123.16,9.71],[123.15,9.66],[123.15,9.61],[123.31,9.36],[123.32,9.32],[123.32,9.27],[123.29,9.22],[123.23,9.12],[123.19,9.09],[123.13,9.06]],[[123.37,9.45],[123.33,9.42],[123.32,9.49],[123.33,9.58],[123.4,9.89],[123.39,9.97],[123.51,10.14],[123.59,10.3],[123.71,10.47],[123.73,10.56],[123.83,10.73],[123.93,10.96],[123.92,11.04],[123.95,11.08],[123.96,11.14],[123.97,11.19],[124.04,11.27],[124.06,11.22],[124.04,11.11],[124.04,11.05],[124.05,11.03],[124.05,10.93],[124.03,10.77],[124.05,10.59],[124.0,10.4],[123.95,10.32],[123.87,10.26],[123.79,10.22],[123.7,10.13],[123.64,10.02],[123.63,9.92],[123.49,9.59],[123.37,9.45]],[[123.76,11.28],[123.82,11.15],[123.74,11.15],[123.71,11.25],[123.74,11.28],[123.76,11.28]],[[117.31,8.44],[117.22,8.37],[117.23,8.46],[117.26,8.54],[117.35,8.71],[117.42,8.77],[117.53,8.9],[117.59,8.97],[117.74,9.1],[117.88,9.24],[117.93,9.25],[117.98,9.25],[118.02,9.27],[118.11,9.35],[118.34,9.6],[118.53,9.79],[118.73,10.04],[118.82,10.11],[118.85,10.13],[119.02,10.35],[119.08,10.39],[119.14,10.41],[119.19,10.44],[119.22,10.48],[119.29,10.57],[119.31,10.69],[119.3,10.75],[119.26,10.85],[119.31,10.97],[119.34,11.03],[119.47,11.29],[119.5,11.35],[119.55,11.31],[119.56,11.27],[119.53,11.16],[119.53,11.1],[119.56,11.05],[119.53,10.95],[119.62,10.71],[119.68,10.55],[119.69,10.5],[119.6,10.41],[119.54,10.38],[119.42,10.35],[119.37,10.33],[119.28,10.25],[119.23,10.15],[119.22,10.1],[119.19,10.06],[118.95,9.99],[118.83,9.95],[118.78,9.92],[118.75,9.86],[118.77,9.77],[118.57,9.42],[118.5,9.33],[118.43,9.26],[118.35,9.2],[118.23,9.17],[118.13,9.1],[118.07,8.98],[117.99,8.88],[117.89,8.8],[117.78,8.73],[117.68,8.68],[117.57,8.64],[117.54,8.6],[117.52,8.54],[117.47,8.51],[117.41,8.5],[117.31,8.44]],[[119.86,11.53],[119.88,11.47],[119.85,11.39],[119.83,11.38],[119.8,11.41],[119.73,11.43],[119.73,11.47],[119.76,11.47],[119.83,11.52],[119.86,11.53]],[[124.57,11.34],[124.64,11.31],[124.72,11.32],[124.82,11.4],[124.93,11.37],[124.99,11.26],[125.03,11.21],[125.04,11.14],[125.04,10.95],[125.01,10.79],[125.03,10.75],[125.08,10.72],[125.13,10.68],[125.16,10.64],[125.19,10.58],[125.2,10.46],[125.26,10.35],[125.27,10.31],[125.25,10.26],[125.15,10.27],[125.14,10.24],[125.14,10.19],[125.11,10.22],[125.04,10.32],[124.99,10.37],[125.0,10.2],[125.02,10.12],[125.03,10.03],[124.93,10.1],[124.81,10.13],[124.78,10.17],[124.79,10.27],[124.79,10.33],[124.74,10.44],[124.8,10.68],[124.8,10.73],[124.79,10.78],[124.74,10.88],[124.66,10.96],[124.62,10.96],[124.5,10.9],[124.45,10.92],[124.41,11.15],[124.37,11.37],[124.33,11.43],[124.31,11.49],[124.33,11.54],[124.37,11.51],[124.44,11.46],[124.51,11.42],[124.55,11.4],[124.57,11.34]],[[124.61,11.49],[124.48,11.49],[124.43,11.53],[124.36,11.67],[124.44,11.7],[124.51,11.69],[124.56,11.64],[124.62,11.55],[124.61,11.49]],[[124.85,11.59],[124.84,11.54],[124.81,11.56],[124.78,11.58],[124.74,11.66],[124.73,11.72],[124.79,11.68],[124.82,11.63],[124.85,11.59]],[[122.5,11.62],[122.61,11.56],[122.73,11.61],[122.84,11.6],[122.93,11.53],[122.9,11.49],[122.89,11.44],[123.1,11.54],[123.16,11.54],[123.16,11.44],[123.14,11.36],[123.12,11.29],[123.08,11.2],[123.02,11.12],[122.94,11.06],[122.85,11.02],[122.8,10.99],[122.79,10.94],[122.79,10.88],[122.77,10.82],[122.67,10.8],[122.52,10.69],[122.2,10.62],[122.11,10.58],[122.05,10.51],[121.99,10.46],[121.95,10.44],[121.94,10.47],[121.93,10.49],[121.98,10.64],[121.97,10.7],[121.95,10.76],[121.96,10.87],[122.02,10.98],[122.05,11.1],[122.06,11.33],[122.1,11.64],[122.1,11.68],[122.07,11.72],[121.94,11.76],[121.89,11.79],[121.92,11.85],[121.96,11.9],[122.03,11.9],[122.09,11.86],[122.29,11.77],[122.4,11.7],[122.5,11.62]],[[120.04,11.7],[119.96,11.67],[119.94,11.69],[119.93,11.74],[119.93,11.77],[119.86,11.95],[119.92,11.98],[119.96,11.96],[120.0,11.93],[120.04,11.92],[120.07,11.86],[120.06,11.82],[120.07,11.78],[120.04,11.7]],[[120.1,12.17],[120.15,12.15],[120.19,12.17],[120.23,12.22],[120.26,12.14],[120.34,12.08],[120.31,12.01],[120.24,12.0],[120.17,12.02],[120.1,11.99],[120.01,12.01],[119.96,12.07],[119.9,12.18],[119.87,12.2],[119.87,12.24],[119.89,12.27],[119.88,12.28],[119.89,12.3],[119.9,12.31],[119.92,12.32],[119.96,12.27],[120.08,12.2],[120.1,12.17]],[[122.65,12.31],[122.6,12.29],[122.5,12.38],[122.44,12.43],[122.42,12.46],[122.47,12.49],[122.6,12.49],[122.67,12.42],[122.68,12.38],[122.65,12.31]],[[125.24,12.53],[125.31,12.45],[125.33,12.39],[125.32,12.32],[125.35,12.29],[125.41,12.28],[125.48,12.25],[125.54,12.19],[125.5,12.14],[125.51,12.05],[125.46,11.95],[125.46,11.77],[125.5,11.71],[125.5,11.66],[125.49,11.59],[125.51,11.54],[125.59,11.38],[125.61,11.32],[125.58,11.28],[125.57,11.24],[125.63,11.23],[125.7,11.16],[125.75,11.07],[125.74,11.05],[125.67,11.12],[125.63,11.13],[125.43,11.11],[125.31,11.14],[125.23,11.15],[125.16,11.27],[125.09,11.29],[125.03,11.34],[124.95,11.48],[124.92,11.56],[124.98,11.64],[125.0,11.7],[125.0,11.76],[124.94,11.75],[124.88,11.78],[124.82,11.85],[124.8,11.9],[124.75,11.93],[124.68,12.02],[124.57,12.06],[124.53,12.08],[124.45,12.15],[124.38,12.24],[124.33,12.4],[124.29,12.57],[124.57,12.53],[124.84,12.53],[125.15,12.57],[125.24,12.53]],[[123.72,12.29],[123.91,12.17],[124.04,11.97],[124.06,11.81],[124.05,11.75],[123.98,11.82],[123.85,11.91],[123.75,11.93],[123.73,11.95],[123.74,12.0],[123.67,12.05],[123.67,12.07],[123.61,12.09],[123.53,12.2],[123.47,12.22],[123.42,12.19],[123.29,12.04],[123.16,11.93],[123.16,11.97],[123.21,12.11],[123.25,12.33],[123.27,12.4],[123.24,12.49],[123.24,12.58],[123.34,12.54],[123.46,12.5],[123.56,12.44],[123.57,12.41],[123.72,12.29]],[[122.31,12.53],[122.28,12.5],[122.26,12.5],[122.25,12.56],[122.28,12.59],[122.29,12.59],[122.31,12.53]],[[122.09,12.35],[122.01,12.11],[121.96,12.19],[121.98,12.25],[121.94,12.29],[121.92,12.33],[121.94,12.39],[121.99,12.44],[122.0,12.6],[122.1,12.65],[122.15,12.65],[122.13,12.61],[122.13,12.54],[122.09,12.35]],[[123.78,12.45],[123.78,12.37],[123.74,12.4],[123.62,12.57],[123.59,12.63],[123.62,12.67],[123.71,12.61],[123.78,12.45]],[[123.28,12.85],[123.37,12.7],[123.27,12.81],[123.17,12.88],[123.05,12.99],[122.97,13.03],[122.95,13.06],[122.96,13.11],[123.02,13.12],[123.04,13.11],[123.21,12.91],[123.28,12.85]],[[120.7,13.48],[120.76,13.47],[120.92,13.5],[120.98,13.49],[121.02,13.43],[121.08,13.41],[121.12,13.38],[121.2,13.43],[121.28,13.37],[121.36,13.27],[121.44,13.19],[121.52,13.13],[121.54,13.09],[121.49,13.02],[121.47,12.93],[121.48,12.84],[121.54,12.64],[121.52,12.58],[121.46,12.51],[121.41,12.42],[121.42,12.39],[121.4,12.36],[121.39,12.3],[121.36,12.31],[121.32,12.3],[121.29,12.28],[121.24,12.22],[121.16,12.24],[121.12,12.25],[121.11,12.3],[121.08,12.34],[121.05,12.36],[120.96,12.45],[120.92,12.51],[120.92,12.58],[120.9,12.65],[120.85,12.7],[120.8,12.75],[120.78,12.79],[120.77,12.84],[120.76,12.97],[120.68,13.13],[120.65,13.17],[120.57,13.21],[120.51,13.26],[120.48,13.31],[120.46,13.39],[120.44,13.41],[120.39,13.4],[120.34,13.41],[120.35,13.47],[120.4,13.52],[120.47,13.52],[120.65,13.5],[120.7,13.48]],[[121.91,13.54],[121.98,13.54],[122.0,13.55],[122.11,13.46],[122.11,13.42],[122.12,13.37],[122.05,13.27],[122.04,13.24],[122.0,13.2],[121.88,13.28],[121.83,13.33],[121.82,13.42],[121.87,13.57],[121.91,13.54]],[[120.27,13.75],[120.27,13.68],[120.1,13.78],[120.1,13.82],[120.1,13.84],[120.12,13.86],[120.21,13.82],[120.27,13.75]],[[124.35,13.63],[124.33,13.57],[124.29,13.59],[124.25,13.59],[124.18,13.53],[124.06,13.61],[124.04,13.66],[124.12,13.79],[124.12,13.98],[124.15,14.03],[124.19,14.06],[124.22,14.08],[124.31,13.95],[124.34,13.93],[124.42,13.87],[124.4,13.75],[124.4,13.68],[124.35,13.63]],[[122.18,14.05],[122.17,14.01],[121.96,14.16],[121.95,14.18],[121.95,14.21],[121.96,14.23],[122.18,14.05]],[[122.03,15.01],[122.05,14.97],[122.03,14.97],[122.02,14.97],[121.97,14.89],[122.02,14.76],[121.99,14.66],[121.93,14.66],[121.91,14.67],[121.92,14.71],[121.93,14.74],[121.92,14.8],[121.89,14.84],[121.86,14.92],[121.82,14.96],[121.84,15.04],[121.97,15.05],[122.03,15.01]],[[121.1,18.62],[121.25,18.56],[121.59,18.38],[121.72,18.33],[121.85,18.3],[121.95,18.29],[122.04,18.33],[122.08,18.37],[122.15,18.49],[122.22,18.5],[122.27,18.46],[122.3,18.4],[122.32,18.32],[122.29,18.23],[122.22,18.16],[122.18,18.06],[122.15,17.76],[122.15,17.66],[122.18,17.58],[122.24,17.43],[122.27,17.4],[122.36,17.34],[122.39,17.31],[122.39,17.24],[122.41,17.18],[122.47,17.16],[122.52,17.12],[122.5,17.06],[122.47,16.99],[122.43,16.82],[122.23,16.44],[122.21,16.35],[122.14,16.18],[121.97,16.16],[121.79,16.08],[121.69,16.01],[121.6,15.93],[121.56,15.83],[121.59,15.78],[121.61,15.73],[121.61,15.67],[121.58,15.62],[121.49,15.51],[121.45,15.42],[121.41,15.38],[121.39,15.32],[121.4,15.27],[121.43,15.22],[121.54,15.0],[121.66,14.79],[121.69,14.77],[121.7,14.74],[121.63,14.68],[121.63,14.58],[121.65,14.48],[121.75,14.23],[121.77,14.17],[121.8,14.11],[121.85,14.06],[121.91,14.02],[122.08,13.95],[122.14,13.93],[122.21,13.93],[122.23,13.98],[122.29,14.0],[122.27,14.04],[122.2,14.11],[122.2,14.15],[122.24,14.18],[122.28,14.19],[122.38,14.26],[122.49,14.32],[122.63,14.32],[122.76,14.28],[122.86,14.25],[122.93,14.19],[123.01,14.08],[123.07,13.96],[123.07,13.9],[123.06,13.85],[123.06,13.79],[123.1,13.75],[123.23,13.75],[123.3,13.84],[123.31,13.94],[123.26,13.98],[123.28,14.02],[123.32,14.06],[123.38,14.03],[123.43,13.97],[123.63,13.9],[123.68,13.9],[123.73,13.88],[123.82,13.84],[123.86,13.8],[123.81,13.72],[123.61,13.7],[123.55,13.65],[123.61,13.53],[123.7,13.43],[123.76,13.35],[123.82,13.27],[123.82,13.19],[123.79,13.11],[123.87,13.12],[123.96,13.1],[124.07,13.03],[124.1,13.02],[124.14,13.04],[124.14,12.79],[124.06,12.57],[123.96,12.59],[123.88,12.69],[123.89,12.8],[123.95,12.92],[123.92,12.94],[123.86,12.93],[123.8,12.91],[123.74,12.9],[123.63,12.91],[123.4,13.03],[123.31,13.04],[123.29,13.1],[123.3,13.22],[123.21,13.35],[123.19,13.4],[123.16,13.44],[122.9,13.59],[122.86,13.62],[122.78,13.74],[122.6,13.91],[122.54,13.93],[122.49,13.93],[122.47,13.89],[122.49,13.82],[122.5,13.76],[122.5,13.7],[122.51,13.66],[122.6,13.56],[122.61,13.52],[122.67,13.4],[122.68,13.25],[122.6,13.19],[122.52,13.26],[122.51,13.31],[122.5,13.36],[122.41,13.49],[122.38,13.52],[122.21,13.65],[122.07,13.79],[121.78,13.94],[121.74,13.95],[121.69,13.93],[121.64,13.92],[121.5,13.84],[121.45,13.79],[121.45,13.71],[121.34,13.65],[121.2,13.64],[121.1,13.68],[121.01,13.76],[120.93,13.76],[120.84,13.88],[120.73,13.9],[120.64,13.8],[120.62,14.0],[120.62,14.19],[120.64,14.24],[120.69,14.29],[120.92,14.49],[120.95,14.56],[120.94,14.65],[120.89,14.72],[120.8,14.76],[120.71,14.78],[120.64,14.82],[120.58,14.88],[120.55,14.77],[120.58,14.59],[120.59,14.48],[120.56,14.44],[120.5,14.44],[120.44,14.45],[120.4,14.49],[120.37,14.61],[120.28,14.68],[120.25,14.79],[120.21,14.81],[120.14,14.8],[120.08,14.85],[120.04,14.98],[120.04,15.11],[120.0,15.23],[119.96,15.34],[119.93,15.43],[119.89,15.84],[119.88,15.88],[119.86,15.91],[119.81,15.95],[119.77,16.01],[119.76,16.05],[119.77,16.26],[119.79,16.3],[119.83,16.33],[119.89,16.29],[119.93,16.24],[119.99,16.22],[120.03,16.18],[120.12,16.07],[120.16,16.05],[120.27,16.05],[120.34,16.07],[120.37,16.11],[120.39,16.16],[120.39,16.22],[120.32,16.4],[120.31,16.53],[120.3,16.65],[120.32,16.76],[120.41,16.96],[120.42,17.09],[120.41,17.27],[120.43,17.38],[120.42,17.44],[120.37,17.54],[120.36,17.64],[120.51,18.16],[120.55,18.26],[120.58,18.37],[120.6,18.51],[120.71,18.55],[120.81,18.6],[120.87,18.6],[120.92,18.59],[121.05,18.61],[121.1,18.62]],[[121.92,18.89],[121.86,18.82],[121.83,18.84],[121.86,18.91],[121.86,18.94],[121.89,18.99],[121.94,19.01],[121.99,18.96],[121.92,18.89]],[[121.25,19.08],[121.25,19.02],[121.2,19.05],[121.18,19.1],[121.19,19.14],[121.21,19.18],[121.24,19.14],[121.25,19.08]],[[121.52,19.36],[121.53,19.27],[121.47,19.27],[121.38,19.33],[121.37,19.36],[121.38,19.38],[121.39,19.4],[121.52,19.36]],[[121.96,20.37],[121.94,20.35],[121.91,20.36],[121.94,20.45],[121.99,20.48],[122.03,20.47],[121.96,20.37]],[[121.88,20.78],[121.83,20.7],[121.79,20.7],[121.8,20.75],[121.85,20.84],[121.87,20.84],[121.88,20.78]]]},{"n":"Palau","r":[[[131.17,3.03],[131.15,3.02],[131.13,3.03],[131.14,3.04],[131.15,3.05],[131.17,3.06],[131.19,3.06],[131.19,3.04],[131.17,3.03]],[[134.6,7.38],[134.53,7.36],[134.51,7.44],[134.52,7.53],[134.56,7.59],[134.6,7.62],[134.61,7.62],[134.65,7.71],[134.66,7.66],[134.63,7.5],[134.6,7.44],[134.6,7.38]]]},{"n":"Papua New Guinea","r":[[[140.98,-9.12],[140.98,-9.11],[140.98,-8.9],[140.98,-8.7],[140.98,-8.5],[140.98,-8.29],[140.98,-8.09],[140.98,-7.89],[140.98,-7.68],[140.98,-7.48],[140.98,-7.28],[140.98,-7.07],[140.98,-6.91],[140.92,-6.84],[140.86,-6.74],[140.87,-6.61],[140.94,-6.45],[140.98,-6.35],[140.98,-6.26],[140.97,-6.06],[140.97,-5.85],[140.97,-5.65],[140.97,-5.45],[140.97,-5.24],[140.97,-5.04],[140.97,-4.84],[140.97,-4.63],[140.97,-4.43],[140.97,-4.23],[140.97,-4.02],[140.97,-3.82],[140.97,-3.62],[140.97,-3.41],[140.97,-3.21],[140.97,-3.01],[140.97,-2.8],[140.97,-2.61],[141.0,-2.61],[141.1,-2.61],[141.19,-2.63],[141.69,-2.85],[141.84,-2.93],[141.89,-2.95],[141.94,-2.95],[141.99,-2.96],[142.21,-3.08],[142.55,-3.2],[142.91,-3.32],[143.02,-3.34],[143.13,-3.36],[143.38,-3.4],[143.51,-3.43],[143.7,-3.57],[143.8,-3.62],[143.89,-3.7],[144.02,-3.78],[144.07,-3.81],[144.12,-3.82],[144.25,-3.82],[144.37,-3.8],[144.43,-3.81],[144.48,-3.83],[144.52,-3.86],[144.55,-3.91],[144.63,-3.99],[144.74,-4.03],[144.84,-4.1],[144.94,-4.19],[145.01,-4.28],[145.09,-4.35],[145.21,-4.38],[145.33,-4.39],[145.77,-4.82],[145.79,-4.89],[145.79,-5.18],[145.75,-5.4],[145.85,-5.47],[146.0,-5.5],[146.21,-5.55],[146.4,-5.62],[147.03,-5.92],[147.12,-5.95],[147.25,-5.95],[147.38,-5.95],[147.42,-5.97],[147.52,-6.02],[147.57,-6.06],[147.65,-6.15],[147.73,-6.26],[147.76,-6.29],[147.8,-6.32],[147.82,-6.37],[147.85,-6.55],[147.85,-6.66],[147.81,-6.7],[147.71,-6.72],[147.36,-6.74],[147.12,-6.72],[146.95,-6.83],[146.95,-6.88],[146.96,-6.93],[147.1,-7.17],[147.19,-7.38],[147.26,-7.46],[147.37,-7.53],[147.46,-7.62],[147.55,-7.71],[147.72,-7.88],[147.82,-7.94],[147.94,-7.98],[148.13,-8.1],[148.15,-8.16],[148.21,-8.34],[148.23,-8.46],[148.23,-8.51],[148.25,-8.55],[148.41,-8.66],[148.45,-8.69],[148.53,-8.94],[148.58,-9.05],[148.68,-9.09],[148.79,-9.09],[149.1,-9.02],[149.14,-9.01],[149.2,-9.03],[149.25,-9.07],[149.26,-9.18],[149.22,-9.3],[149.2,-9.41],[149.26,-9.5],[149.42,-9.57],[149.48,-9.59],[149.76,-9.61],[149.87,-9.63],[149.97,-9.66],[150.01,-9.69],[149.98,-9.74],[149.93,-9.76],[149.86,-9.77],[149.76,-9.81],[149.76,-9.87],[149.82,-9.93],[149.87,-10.01],[149.92,-10.04],[149.97,-10.06],[150.09,-10.09],[150.21,-10.13],[150.28,-10.16],[150.36,-10.19],[150.54,-10.21],[150.67,-10.26],[150.85,-10.24],[150.69,-10.32],[150.64,-10.34],[150.45,-10.31],[150.41,-10.34],[150.49,-10.43],[150.61,-10.48],[150.65,-10.52],[150.62,-10.56],[150.48,-10.64],[150.43,-10.65],[150.32,-10.65],[150.14,-10.62],[150.02,-10.58],[149.98,-10.52],[149.95,-10.48],[149.83,-10.4],[149.75,-10.35],[149.65,-10.34],[149.54,-10.34],[149.35,-10.29],[148.94,-10.26],[148.84,-10.23],[148.71,-10.17],[148.65,-10.16],[148.59,-10.18],[148.43,-10.19],[148.38,-10.19],[148.27,-10.13],[148.15,-10.11],[148.1,-10.12],[148.05,-10.13],[147.89,-10.09],[147.77,-10.07],[147.67,-10.01],[147.61,-9.96],[147.55,-9.91],[147.5,-9.79],[147.41,-9.67],[147.3,-9.58],[147.06,-9.43],[147.02,-9.39],[146.93,-9.25],[146.93,-9.15],[146.96,-9.06],[146.91,-9.09],[146.86,-9.09],[146.7,-9.03],[146.63,-8.95],[146.52,-8.75],[146.46,-8.64],[146.3,-8.46],[146.25,-8.34],[146.18,-8.25],[146.14,-8.21],[146.11,-8.17],[146.08,-8.11],[146.03,-8.08],[145.81,-7.99],[145.77,-7.97],[145.73,-7.95],[145.56,-7.94],[145.47,-7.93],[145.29,-7.86],[145.19,-7.84],[145.08,-7.83],[144.97,-7.8],[144.92,-7.78],[144.89,-7.73],[144.86,-7.63],[144.77,-7.64],[144.68,-7.62],[144.6,-7.59],[144.51,-7.57],[144.45,-7.6],[144.43,-7.68],[144.4,-7.68],[144.35,-7.67],[144.33,-7.68],[144.27,-7.71],[144.23,-7.76],[144.14,-7.76],[143.97,-7.71],[143.9,-7.67],[143.83,-7.62],[143.78,-7.55],[143.72,-7.5],[143.65,-7.46],[143.74,-7.55],[143.94,-7.94],[143.89,-7.95],[143.84,-7.94],[143.89,-8.02],[143.83,-8.03],[143.78,-8.03],[143.67,-8.0],[143.55,-7.98],[143.52,-8.0],[143.54,-8.03],[143.58,-8.11],[143.61,-8.2],[143.45,-8.24],[143.28,-8.26],[143.09,-8.31],[142.91,-8.31],[142.81,-8.29],[142.71,-8.27],[142.62,-8.29],[142.52,-8.32],[142.45,-8.32],[142.4,-8.25],[142.38,-8.21],[142.35,-8.17],[142.28,-8.17],[142.21,-8.2],[142.33,-8.2],[142.36,-8.25],[142.39,-8.31],[142.47,-8.37],[142.58,-8.34],[142.8,-8.35],[143.01,-8.44],[143.06,-8.46],[143.11,-8.47],[143.22,-8.57],[143.31,-8.66],[143.38,-8.76],[143.39,-8.8],[143.39,-8.91],[143.37,-8.96],[143.23,-9.04],[143.08,-9.09],[142.86,-9.2],[142.65,-9.33],[142.54,-9.3],[142.44,-9.24],[142.4,-9.22],[142.29,-9.18],[142.23,-9.17],[141.98,-9.2],[141.73,-9.21],[141.62,-9.21],[141.52,-9.19],[141.41,-9.15],[141.29,-9.17],[141.22,-9.21],[141.13,-9.22],[140.98,-9.12]],[[153.54,-11.48],[153.7,-11.53],[153.76,-11.59],[153.7,-11.61],[153.55,-11.63],[153.52,-11.6],[153.38,-11.56],[153.36,-11.5],[153.29,-11.52],[153.32,-11.47],[153.23,-11.42],[153.21,-11.35],[153.2,-11.32],[153.31,-11.36],[153.54,-11.48]],[[154.28,-11.36],[154.27,-11.42],[154.23,-11.4],[154.12,-11.43],[154.06,-11.42],[154.03,-11.37],[154.02,-11.35],[154.12,-11.37],[154.1,-11.31],[154.24,-11.34],[154.28,-11.36]],[[150.9,-10.57],[150.88,-10.64],[150.8,-10.62],[150.79,-10.6],[150.8,-10.55],[150.87,-10.55],[150.9,-10.57]],[[151.08,-10.02],[151.12,-10.02],[151.19,-9.95],[151.26,-9.92],[151.3,-9.96],[151.23,-10.19],[151.18,-10.16],[150.96,-10.09],[150.95,-10.0],[150.9,-9.97],[150.86,-9.88],[150.79,-9.77],[150.78,-9.71],[150.82,-9.74],[150.86,-9.8],[151.05,-9.94],[151.04,-9.98],[151.08,-10.02]],[[150.53,-9.35],[150.67,-9.43],[150.75,-9.4],[150.79,-9.42],[150.88,-9.51],[150.88,-9.58],[150.9,-9.64],[150.89,-9.67],[150.84,-9.7],[150.85,-9.66],[150.81,-9.65],[150.68,-9.66],[150.58,-9.63],[150.44,-9.62],[150.5,-9.56],[150.51,-9.54],[150.43,-9.43],[150.43,-9.39],[150.44,-9.36],[150.5,-9.35],[150.53,-9.35]],[[150.35,-9.49],[150.33,-9.52],[150.27,-9.5],[150.11,-9.36],[150.13,-9.26],[150.21,-9.21],[150.32,-9.26],[150.36,-9.35],[150.37,-9.4],[150.35,-9.49]],[[152.63,-8.96],[152.69,-8.97],[152.81,-8.97],[152.85,-9.02],[152.91,-9.04],[152.95,-9.07],[153.0,-9.11],[153.0,-9.13],[152.98,-9.15],[152.96,-9.17],[152.97,-9.21],[152.92,-9.2],[152.87,-9.22],[152.76,-9.18],[152.72,-9.17],[152.71,-9.13],[152.64,-9.06],[152.52,-9.01],[152.58,-8.97],[152.63,-8.96]],[[143.59,-8.63],[143.61,-8.68],[143.46,-8.62],[143.32,-8.52],[143.25,-8.49],[143.21,-8.42],[143.29,-8.47],[143.44,-8.52],[143.59,-8.63]],[[151.11,-8.73],[151.12,-8.8],[151.05,-8.73],[151.08,-8.64],[151.09,-8.6],[151.08,-8.57],[151.0,-8.52],[151.05,-8.45],[151.09,-8.43],[151.12,-8.42],[151.12,-8.52],[151.14,-8.57],[151.11,-8.73]],[[143.59,-8.48],[143.54,-8.48],[143.37,-8.42],[143.32,-8.37],[143.53,-8.38],[143.58,-8.39],[143.59,-8.46],[143.59,-8.48]],[[148.03,-5.83],[147.99,-5.83],[147.97,-5.79],[147.87,-5.75],[147.78,-5.63],[147.78,-5.52],[147.79,-5.49],[147.85,-5.49],[148.05,-5.61],[148.08,-5.65],[148.06,-5.76],[148.03,-5.83]],[[155.96,-6.69],[155.93,-6.78],[155.91,-6.8],[155.89,-6.76],[155.8,-6.8],[155.76,-6.83],[155.72,-6.86],[155.62,-6.86],[155.52,-6.83],[155.43,-6.78],[155.34,-6.72],[155.26,-6.63],[155.21,-6.53],[155.23,-6.41],[155.2,-6.31],[155.04,-6.23],[155.01,-6.21],[154.94,-6.11],[154.87,-6.06],[154.78,-5.97],[154.76,-5.93],[154.72,-5.82],[154.71,-5.75],[154.74,-5.55],[154.73,-5.44],[154.77,-5.45],[154.82,-5.49],[154.87,-5.52],[155.0,-5.54],[155.09,-5.62],[155.19,-5.78],[155.2,-5.83],[155.23,-5.87],[155.32,-5.93],[155.37,-5.97],[155.47,-6.15],[155.52,-6.18],[155.58,-6.2],[155.64,-6.22],[155.73,-6.3],[155.82,-6.38],[155.88,-6.47],[155.93,-6.57],[155.96,-6.69]],[[147.18,-5.43],[147.12,-5.44],[147.03,-5.34],[147.01,-5.31],[147.01,-5.26],[147.13,-5.19],[147.21,-5.25],[147.22,-5.38],[147.18,-5.43]],[[154.65,-5.43],[154.63,-5.44],[154.58,-5.31],[154.58,-5.22],[154.56,-5.15],[154.54,-5.11],[154.61,-5.03],[154.63,-5.01],[154.68,-5.05],[154.69,-5.14],[154.73,-5.22],[154.7,-5.38],[154.65,-5.43]],[[146.02,-4.73],[145.95,-4.76],[145.9,-4.73],[145.88,-4.67],[145.9,-4.6],[145.96,-4.55],[146.0,-4.54],[146.04,-4.57],[146.05,-4.64],[146.02,-4.73]],[[151.92,-4.3],[151.97,-4.32],[152.12,-4.21],[152.2,-4.29],[152.3,-4.32],[152.41,-4.34],[152.36,-4.49],[152.38,-4.56],[152.4,-4.63],[152.4,-4.73],[152.35,-4.82],[152.26,-4.95],[152.22,-4.98],[152.17,-4.99],[152.01,-5.0],[151.98,-5.07],[151.99,-5.15],[152.08,-5.25],[152.14,-5.36],[152.08,-5.46],[151.97,-5.53],[151.87,-5.56],[151.69,-5.54],[151.52,-5.55],[151.48,-5.59],[151.48,-5.65],[151.46,-5.7],[151.42,-5.75],[151.33,-5.84],[151.23,-5.92],[151.09,-6.0],[151.04,-6.02],[150.92,-6.03],[150.81,-6.07],[150.76,-6.11],[150.71,-6.15],[150.59,-6.19],[150.47,-6.26],[150.43,-6.28],[150.19,-6.29],[149.85,-6.29],[149.75,-6.3],[149.65,-6.29],[149.6,-6.26],[149.48,-6.12],[149.38,-6.08],[149.27,-6.08],[149.13,-6.13],[149.1,-6.12],[148.81,-5.92],[148.72,-5.87],[148.62,-5.83],[148.51,-5.81],[148.4,-5.77],[148.34,-5.67],[148.34,-5.54],[148.43,-5.47],[148.56,-5.51],[148.62,-5.51],[148.67,-5.49],[148.72,-5.49],[148.78,-5.51],[149.0,-5.48],[149.12,-5.52],[149.25,-5.57],[149.36,-5.58],[149.48,-5.57],[149.63,-5.52],[149.68,-5.52],[149.83,-5.52],[149.96,-5.45],[150.01,-5.14],[150.05,-5.03],[150.09,-5.01],[150.12,-5.02],[150.17,-5.07],[150.11,-5.14],[150.08,-5.19],[150.07,-5.31],[150.11,-5.43],[150.18,-5.52],[150.3,-5.54],[150.4,-5.47],[150.52,-5.46],[150.63,-5.52],[150.73,-5.51],[150.78,-5.47],[150.84,-5.45],[150.9,-5.45],[150.95,-5.42],[151.02,-5.32],[151.07,-5.2],[151.14,-5.11],[151.33,-4.96],[151.38,-4.94],[151.44,-4.93],[151.57,-4.94],[151.67,-4.88],[151.68,-4.76],[151.66,-4.64],[151.55,-4.35],[151.54,-4.3],[151.56,-4.25],[151.59,-4.2],[151.7,-4.2],[151.82,-4.22],[151.86,-4.26],[151.92,-4.3]],[[153.66,-4.1],[153.65,-4.12],[153.59,-4.1],[153.64,-4.04],[153.66,-4.04],[153.66,-4.1]],[[152.67,-3.13],[152.65,-3.22],[152.59,-3.17],[152.54,-3.1],[152.57,-3.06],[152.64,-3.04],[152.67,-3.13]],[[152.1,-2.95],[152.09,-3.0],[152.06,-2.99],[151.97,-2.9],[151.95,-2.87],[151.97,-2.85],[152.07,-2.92],[152.1,-2.95]],[[151.96,-2.83],[151.93,-2.83],[151.93,-2.75],[151.95,-2.71],[152.0,-2.74],[152.01,-2.81],[151.96,-2.83]],[[152.97,-4.76],[152.89,-4.83],[152.85,-4.76],[152.79,-4.7],[152.74,-4.64],[152.68,-4.5],[152.68,-4.43],[152.69,-4.36],[152.7,-4.28],[152.67,-4.13],[152.6,-3.99],[152.36,-3.67],[152.28,-3.58],[152.19,-3.51],[152.14,-3.49],[152.02,-3.47],[151.97,-3.45],[151.88,-3.4],[151.79,-3.34],[151.58,-3.15],[151.47,-3.1],[151.41,-3.04],[151.07,-2.83],[150.97,-2.78],[150.85,-2.78],[150.75,-2.74],[150.83,-2.71],[150.84,-2.64],[150.83,-2.57],[151.0,-2.69],[151.17,-2.79],[151.23,-2.87],[151.31,-2.88],[151.48,-2.94],[151.59,-3.0],[151.69,-3.07],[151.81,-3.17],[152.03,-3.25],[152.07,-3.28],[152.18,-3.41],[152.33,-3.52],[152.38,-3.58],[153.02,-4.11],[153.12,-4.25],[153.13,-4.35],[153.11,-4.39],[153.04,-4.48],[153.05,-4.58],[153.02,-4.67],[152.97,-4.76]],[[150.44,-2.66],[150.24,-2.68],[150.17,-2.66],[150.1,-2.6],[150.04,-2.51],[149.99,-2.49],[149.96,-2.47],[150.1,-2.4],[150.23,-2.38],[150.43,-2.47],[150.45,-2.51],[150.45,-2.54],[150.45,-2.63],[150.44,-2.66]],[[147.88,-2.28],[147.84,-2.34],[147.77,-2.33],[147.74,-2.32],[147.79,-2.31],[147.81,-2.26],[147.84,-2.25],[147.88,-2.28]],[[147.07,-1.96],[147.4,-2.03],[147.42,-2.02],[147.42,-2.0],[147.42,-1.99],[147.44,-2.01],[147.44,-2.06],[147.39,-2.07],[147.34,-2.07],[147.3,-2.09],[147.21,-2.18],[147.14,-2.17],[147.06,-2.19],[146.93,-2.19],[146.75,-2.15],[146.7,-2.18],[146.64,-2.17],[146.57,-2.21],[146.55,-2.21],[146.53,-2.15],[146.53,-2.13],[146.61,-2.1],[146.6,-2.02],[146.66,-1.97],[146.76,-1.98],[146.86,-1.95],[147.07,-1.96]],[[149.77,-1.55],[149.76,-1.59],[149.69,-1.57],[149.67,-1.58],[149.55,-1.47],[149.55,-1.41],[149.58,-1.35],[149.63,-1.36],[149.73,-1.43],[149.77,-1.55]]]},{"n":"Poland","r":[[[23.48,53.94],[23.6,53.6],[23.79,53.27],[23.86,53.11],[23.89,53.03],[23.91,52.9],[23.92,52.82],[23.92,52.77],[23.9,52.7],[23.84,52.66],[23.48,52.55],[23.41,52.52],[23.3,52.43],[23.2,52.34],[23.18,52.31],[23.18,52.29],[23.2,52.26],[23.33,52.21],[23.46,52.17],[23.5,52.14],[23.6,52.1],[23.63,52.07],[23.65,52.04],[23.65,51.97],[23.61,51.88],[23.63,51.81],[23.58,51.76],[23.54,51.71],[23.54,51.62],[23.61,51.52],[23.66,51.45],[23.68,51.39],[23.66,51.35],[23.66,51.31],[23.71,51.27],[23.86,51.13],[23.94,50.99],[23.99,50.94],[24.1,50.87],[24.11,50.84],[24.06,50.82],[24.03,50.82],[24.0,50.81],[23.98,50.79],[24.01,50.76],[24.05,50.72],[24.09,50.62],[24.09,50.53],[24.05,50.51],[24.0,50.46],[23.97,50.41],[23.71,50.38],[23.65,50.33],[23.51,50.23],[23.41,50.17],[23.26,50.07],[23.04,49.9],[22.95,49.83],[22.89,49.77],[22.71,49.61],[22.65,49.54],[22.66,49.48],[22.72,49.35],[22.73,49.3],[22.72,49.24],[22.7,49.19],[22.71,49.17],[22.76,49.14],[22.85,49.08],[22.85,49.06],[22.84,49.04],[22.81,49.02],[22.7,49.04],[22.58,49.08],[22.54,49.07],[22.47,49.08],[22.2,49.15],[22.02,49.21],[22.0,49.25],[21.97,49.3],[21.89,49.34],[21.71,49.38],[21.64,49.41],[21.35,49.43],[21.22,49.43],[21.14,49.42],[21.08,49.42],[21.0,49.34],[20.95,49.32],[20.87,49.31],[20.8,49.33],[20.73,49.37],[20.62,49.39],[20.53,49.38],[20.47,49.39],[20.42,49.39],[20.4,49.38],[20.36,49.39],[20.3,49.37],[20.24,49.34],[20.16,49.32],[20.11,49.27],[20.06,49.18],[19.92,49.22],[19.87,49.2],[19.8,49.19],[19.76,49.2],[19.77,49.24],[19.79,49.27],[19.79,49.32],[19.77,49.37],[19.73,49.39],[19.66,49.4],[19.63,49.41],[19.63,49.42],[19.59,49.45],[19.53,49.5],[19.48,49.58],[19.44,49.6],[19.39,49.56],[19.3,49.52],[19.25,49.51],[19.15,49.4],[18.97,49.4],[18.96,49.45],[18.94,49.5],[18.83,49.51],[18.83,49.54],[18.81,49.61],[18.59,49.76],[18.57,49.82],[18.58,49.84],[18.56,49.88],[18.52,49.9],[18.35,49.93],[18.31,49.91],[18.27,49.93],[18.21,49.96],[18.1,49.99],[18.09,50.01],[18.05,50.03],[18.03,50.04],[18.01,50.02],[17.98,50.0],[17.87,49.97],[17.83,49.98],[17.79,50.01],[17.75,50.06],[17.68,50.1],[17.63,50.12],[17.6,50.14],[17.59,50.16],[17.71,50.19],[17.74,50.23],[17.72,50.3],[17.7,50.31],[17.65,50.28],[17.55,50.26],[17.46,50.25],[17.42,50.25],[17.15,50.38],[16.98,50.42],[16.88,50.43],[16.87,50.41],[16.91,50.35],[16.99,50.26],[16.99,50.24],[16.9,50.2],[16.84,50.19],[16.78,50.16],[16.73,50.12],[16.68,50.1],[16.64,50.1],[16.6,50.12],[16.49,50.25],[16.35,50.35],[16.33,50.37],[16.29,50.37],[16.23,50.39],[16.21,50.42],[16.24,50.45],[16.28,50.48],[16.36,50.5],[16.38,50.52],[16.39,50.54],[16.42,50.57],[16.41,50.59],[16.36,50.62],[16.28,50.66],[16.07,50.63],[16.01,50.61],[15.97,50.64],[15.95,50.67],[15.89,50.68],[15.82,50.71],[15.73,50.74],[15.64,50.75],[15.46,50.79],[15.39,50.8],[15.35,50.81],[15.31,50.85],[15.28,50.88],[15.26,50.96],[15.13,50.99],[14.99,51.01],[14.98,51.0],[14.99,50.93],[14.98,50.89],[14.9,50.86],[14.81,50.86],[14.81,50.87],[14.92,51.01],[14.96,51.1],[15.02,51.25],[14.95,51.38],[14.94,51.44],[14.91,51.46],[14.72,51.52],[14.71,51.54],[14.74,51.63],[14.72,51.66],[14.68,51.7],[14.62,51.77],[14.6,51.83],[14.67,51.9],[14.69,51.96],[14.72,52.03],[14.75,52.07],[14.75,52.08],[14.7,52.11],[14.69,52.15],[14.71,52.21],[14.68,52.25],[14.62,52.28],[14.57,52.31],[14.55,52.36],[14.57,52.43],[14.62,52.53],[14.51,52.65],[14.25,52.78],[14.13,52.88],[14.14,52.93],[14.19,52.98],[14.29,53.03],[14.37,53.11],[14.41,53.2],[14.41,53.22],[14.41,53.28],[14.3,53.56],[14.28,53.62],[14.27,53.71],[14.26,53.73],[14.49,53.67],[14.58,53.64],[14.57,53.68],[14.55,53.71],[14.56,53.75],[14.56,53.82],[14.35,53.86],[14.21,53.87],[14.2,53.92],[14.21,53.95],[14.25,53.93],[14.38,53.92],[14.72,54.02],[15.29,54.14],[15.9,54.25],[16.04,54.27],[16.19,54.29],[16.24,54.33],[16.29,54.36],[16.38,54.44],[16.56,54.55],[16.89,54.6],[17.01,54.65],[17.26,54.73],[17.84,54.82],[18.09,54.84],[18.32,54.84],[18.54,54.77],[18.76,54.68],[18.8,54.63],[18.68,54.67],[18.5,54.74],[18.44,54.74],[18.59,54.51],[18.67,54.43],[18.84,54.37],[18.98,54.35],[19.41,54.39],[19.56,54.43],[19.6,54.46],[19.64,54.45],[19.92,54.43],[20.21,54.42],[20.66,54.41],[21.14,54.39],[21.63,54.38],[22.17,54.36],[22.73,54.35],[22.77,54.36],[22.82,54.4],[22.89,54.39],[22.98,54.37],[23.02,54.35],[23.03,54.33],[23.04,54.3],[23.09,54.3],[23.17,54.28],[23.28,54.24],[23.37,54.2],[23.45,54.14],[23.48,54.08],[23.48,54.01],[23.48,53.96],[23.48,53.94]]]},{"n":"Puerto Rico","r":[[[-67.87,18.06],[-67.88,18.06],[-67.89,18.06],[-67.9,18.06],[-67.9,18.07],[-67.93,18.09],[-67.94,18.1],[-67.93,18.12],[-67.92,18.12],[-67.86,18.12],[-67.86,18.12],[-67.84,18.11],[-67.84,18.1],[-67.85,18.1],[-67.86,18.08],[-67.86,18.08],[-67.87,18.07],[-67.87,18.06],[-67.87,18.06]],[[-65.43,18.11],[-65.5,18.1],[-65.56,18.11],[-65.57,18.14],[-65.48,18.17],[-65.37,18.16],[-65.3,18.14],[-65.29,18.13],[-65.43,18.11]],[[-66.13,18.44],[-66.1,18.43],[-66.07,18.43],[-66.09,18.47],[-66.07,18.47],[-65.88,18.44],[-65.76,18.4],[-65.63,18.38],[-65.62,18.24],[-65.72,18.19],[-65.78,18.13],[-65.83,18.06],[-65.97,17.97],[-66.14,17.95],[-66.25,17.95],[-66.29,17.95],[-66.33,17.96],[-66.41,17.95],[-66.51,17.99],[-66.6,17.98],[-66.77,17.99],[-66.84,17.96],[-66.9,17.95],[-66.96,17.95],[-67.01,17.97],[-67.14,17.97],[-67.2,17.99],[-67.17,18.15],[-67.17,18.22],[-67.2,18.28],[-67.24,18.32],[-67.26,18.36],[-67.21,18.39],[-67.17,18.44],[-67.16,18.5],[-67.11,18.51],[-67.06,18.52],[-66.81,18.49],[-66.19,18.48],[-66.15,18.47],[-66.13,18.44]]]},{"n":"North Korea","r":[[[124.36,40.0],[124.39,40.1],[124.48,40.18],[124.71,40.32],[124.77,40.38],[124.89,40.46],[124.94,40.46],[125.0,40.46],[125.01,40.5],[125.03,40.52],[125.07,40.55],[125.19,40.59],[125.31,40.64],[125.42,40.66],[125.54,40.74],[125.59,40.78],[125.65,40.78],[125.66,40.8],[125.69,40.84],[125.73,40.87],[125.78,40.87],[125.87,40.89],[125.99,40.9],[126.07,40.97],[126.09,41.02],[126.14,41.08],[126.25,41.14],[126.33,41.23],[126.41,41.32],[126.45,41.35],[126.49,41.36],[126.51,41.39],[126.54,41.5],[126.58,41.59],[126.6,41.64],[126.7,41.69],[126.72,41.72],[126.74,41.72],[126.79,41.72],[126.85,41.75],[126.9,41.78],[126.95,41.77],[127.01,41.74],[127.06,41.69],[127.09,41.64],[127.13,41.61],[127.14,41.55],[127.18,41.53],[127.27,41.52],[127.42,41.48],[127.52,41.48],[127.57,41.45],[127.69,41.44],[127.92,41.46],[128.01,41.45],[128.05,41.42],[128.11,41.39],[128.15,41.39],[128.2,41.43],[128.25,41.51],[128.29,41.56],[128.29,41.61],[128.26,41.66],[128.18,41.7],[128.13,41.77],[128.08,41.84],[128.06,41.86],[128.03,41.9],[128.03,41.95],[128.05,41.99],[128.16,42.01],[128.31,42.03],[128.43,42.01],[128.63,42.02],[128.75,42.04],[128.84,42.04],[128.92,42.04],[128.96,42.07],[129.08,42.14],[129.13,42.17],[129.2,42.22],[129.21,42.27],[129.22,42.31],[129.25,42.36],[129.31,42.41],[129.37,42.44],[129.42,42.44],[129.48,42.41],[129.52,42.38],[129.57,42.39],[129.6,42.44],[129.63,42.44],[129.7,42.45],[129.72,42.48],[129.75,42.6],[129.77,42.71],[129.78,42.78],[129.84,42.89],[129.86,42.97],[129.9,43.0],[129.94,43.0],[129.98,42.97],[130.02,42.96],[130.08,42.97],[130.12,42.96],[130.15,42.92],[130.24,42.89],[130.25,42.87],[130.25,42.74],[130.3,42.68],[130.36,42.63],[130.45,42.58],[130.5,42.57],[130.53,42.54],[130.55,42.47],[130.62,42.42],[130.65,42.37],[130.66,42.33],[130.69,42.3],[130.64,42.27],[130.57,42.29],[130.46,42.3],[130.31,42.21],[130.24,42.18],[130.18,42.1],[130.07,42.05],[130.01,41.99],[129.93,41.9],[129.88,41.81],[129.76,41.71],[129.69,41.59],[129.68,41.49],[129.76,41.39],[129.77,41.3],[129.71,41.12],[129.74,40.93],[129.71,40.86],[129.34,40.73],[129.25,40.66],[129.11,40.49],[128.95,40.43],[128.84,40.36],[128.7,40.32],[128.61,40.2],[128.51,40.13],[128.39,40.09],[128.3,40.04],[128.11,40.03],[127.97,40.0],[127.87,39.9],[127.57,39.78],[127.53,39.7],[127.55,39.56],[127.55,39.46],[127.52,39.38],[127.46,39.4],[127.42,39.37],[127.38,39.3],[127.39,39.21],[127.5,39.18],[127.58,39.14],[127.7,39.13],[127.79,39.08],[127.97,38.9],[128.12,38.82],[128.16,38.79],[128.25,38.75],[128.33,38.68],[128.37,38.62],[128.34,38.61],[128.28,38.52],[128.22,38.42],[128.17,38.36],[128.11,38.33],[128.04,38.31],[127.91,38.3],[127.78,38.31],[127.75,38.32],[127.58,38.31],[127.53,38.3],[127.29,38.31],[127.17,38.3],[127.09,38.28],[127.01,38.24],[126.94,38.18],[126.88,38.11],[126.75,37.98],[126.67,37.92],[126.67,37.83],[126.66,37.8],[126.63,37.78],[126.62,37.79],[126.57,37.8],[126.37,37.88],[126.2,37.83],[126.16,37.76],[126.12,37.74],[126.05,37.87],[125.94,37.87],[125.77,37.99],[125.7,37.96],[125.68,37.92],[125.58,37.82],[125.45,37.73],[125.41,37.72],[125.36,37.72],[125.36,37.75],[125.31,37.84],[125.1,37.88],[125.03,37.92],[124.99,37.93],[125.19,38.04],[125.25,38.06],[125.21,38.08],[125.16,38.09],[125.0,38.08],[124.91,38.11],[124.78,38.1],[124.69,38.13],[124.87,38.23],[124.88,38.29],[124.88,38.34],[124.97,38.48],[125.07,38.56],[125.31,38.67],[125.42,38.68],[125.49,38.68],[125.55,38.69],[125.49,38.73],[125.42,38.75],[125.3,38.74],[125.17,38.81],[125.16,38.87],[125.41,39.29],[125.41,39.33],[125.37,39.43],[125.36,39.53],[125.18,39.58],[125.1,39.59],[124.87,39.7],[124.78,39.76],[124.74,39.74],[124.73,39.65],[124.7,39.63],[124.64,39.62],[124.61,39.72],[124.56,39.79],[124.4,39.87],[124.35,39.91],[124.38,40.0],[124.36,40.0]],[[124.91,39.54],[124.85,39.51],[124.85,39.56],[124.89,39.6],[124.93,39.61],[124.91,39.54]]]},{"n":"Portugal","r":[[[-8.78,41.94],[-8.68,42.01],[-8.59,42.05],[-8.54,42.07],[-8.32,42.12],[-8.27,42.14],[-8.21,42.13],[-8.2,42.11],[-8.17,42.07],[-8.14,42.04],[-8.13,42.02],[-8.21,41.93],[-8.22,41.9],[-8.18,41.84],[-8.17,41.82],[-8.15,41.81],[-8.09,41.81],[-7.99,41.85],[-7.92,41.88],[-7.9,41.87],[-7.69,41.89],[-7.64,41.87],[-7.61,41.86],[-7.51,41.84],[-7.4,41.83],[-7.27,41.86],[-7.21,41.9],[-7.2,41.93],[-7.2,41.96],[-7.18,41.97],[-7.15,41.98],[-7.1,41.96],[-7.03,41.95],[-6.87,41.95],[-6.83,41.96],[-6.78,41.96],[-6.7,41.93],[-6.62,41.94],[-6.58,41.91],[-6.56,41.87],[-6.55,41.79],[-6.56,41.7],[-6.54,41.67],[-6.48,41.66],[-6.39,41.67],[-6.31,41.64],[-6.24,41.6],[-6.22,41.56],[-6.21,41.53],[-6.24,41.52],[-6.29,41.46],[-6.4,41.38],[-6.57,41.3],[-6.69,41.21],[-6.78,41.11],[-6.88,41.06],[-6.92,41.04],[-6.93,41.01],[-6.86,40.88],[-6.84,40.78],[-6.82,40.65],[-6.83,40.62],[-6.84,40.48],[-6.85,40.44],[-6.85,40.41],[-6.82,40.38],[-6.81,40.34],[-6.86,40.3],[-6.95,40.25],[-7.01,40.21],[-7.03,40.17],[-7.03,40.14],[-6.92,40.06],[-6.9,40.02],[-6.91,39.94],[-6.98,39.8],[-7.04,39.71],[-7.05,39.71],[-7.12,39.68],[-7.45,39.68],[-7.54,39.66],[-7.52,39.64],[-7.45,39.54],[-7.36,39.48],[-7.34,39.47],[-7.31,39.34],[-7.17,39.14],[-7.04,39.11],[-7.0,39.06],[-7.01,38.99],[-7.05,38.91],[-7.13,38.83],[-7.22,38.77],[-7.28,38.71],[-7.29,38.65],[-7.31,38.57],[-7.34,38.5],[-7.34,38.46],[-7.11,38.18],[-6.97,38.19],[-6.96,38.19],[-6.98,38.12],[-7.02,38.04],[-7.07,38.03],[-7.19,38.01],[-7.29,37.91],[-7.38,37.79],[-7.44,37.73],[-7.5,37.59],[-7.5,37.52],[-7.47,37.43],[-7.41,37.18],[-7.49,37.17],[-7.83,37.01],[-7.94,37.01],[-8.14,37.08],[-8.48,37.1],[-8.6,37.12],[-8.74,37.07],[-8.85,37.08],[-8.94,37.02],[-9.0,37.03],[-8.93,37.17],[-8.81,37.43],[-8.82,37.59],[-8.79,37.73],[-8.82,37.87],[-8.88,37.96],[-8.8,38.18],[-8.81,38.3],[-8.88,38.45],[-8.67,38.42],[-8.73,38.48],[-8.8,38.52],[-8.86,38.51],[-8.91,38.51],[-9.1,38.46],[-9.19,38.44],[-9.21,38.45],[-9.2,38.54],[-9.25,38.66],[-9.18,38.69],[-9.09,38.7],[-9.02,38.75],[-8.98,38.8],[-9.0,38.9],[-8.94,39.0],[-8.79,39.08],[-8.87,39.07],[-8.95,39.02],[-9.09,38.83],[-9.14,38.74],[-9.25,38.71],[-9.36,38.7],[-9.41,38.71],[-9.47,38.73],[-9.48,38.8],[-9.47,38.85],[-9.43,38.96],[-9.41,39.11],[-9.35,39.25],[-9.36,39.28],[-9.37,39.34],[-9.32,39.39],[-9.25,39.43],[-9.15,39.54],[-9.0,39.82],[-8.84,40.12],[-8.85,40.15],[-8.89,40.18],[-8.87,40.26],[-8.77,40.61],[-8.73,40.65],[-8.68,40.75],[-8.67,40.92],[-8.66,41.03],[-8.66,41.09],[-8.67,41.15],[-8.74,41.28],[-8.81,41.56],[-8.81,41.65],[-8.76,41.7],[-8.85,41.71],[-8.89,41.76],[-8.88,41.83],[-8.78,41.94]],[[-17.19,32.87],[-17.05,32.82],[-16.93,32.84],[-16.77,32.77],[-16.69,32.76],[-16.77,32.71],[-16.84,32.65],[-17.02,32.66],[-17.17,32.72],[-17.23,32.77],[-17.24,32.81],[-17.19,32.87]],[[-25.03,36.96],[-25.03,36.94],[-25.09,36.95],[-25.16,36.94],[-25.2,37.0],[-25.16,37.02],[-25.08,37.02],[-25.04,37.0],[-25.03,36.96]],[[-25.65,37.84],[-25.59,37.83],[-25.27,37.85],[-25.18,37.84],[-25.19,37.76],[-25.25,37.74],[-25.44,37.72],[-25.73,37.76],[-25.83,37.83],[-25.85,37.87],[-25.85,37.89],[-25.78,37.91],[-25.65,37.84]],[[-28.15,38.45],[-28.06,38.41],[-28.19,38.4],[-28.23,38.38],[-28.33,38.41],[-28.45,38.41],[-28.53,38.46],[-28.55,38.52],[-28.51,38.55],[-28.4,38.55],[-28.15,38.45]],[[-28.64,38.52],[-28.74,38.52],[-28.84,38.6],[-28.7,38.64],[-28.66,38.61],[-28.62,38.59],[-28.61,38.55],[-28.64,38.52]],[[-27.78,38.56],[-27.83,38.54],[-28.09,38.62],[-28.19,38.66],[-28.31,38.74],[-27.96,38.64],[-27.78,38.56]],[[-27.08,38.64],[-27.1,38.63],[-27.3,38.66],[-27.36,38.7],[-27.39,38.77],[-27.35,38.79],[-27.26,38.8],[-27.13,38.79],[-27.04,38.74],[-27.04,38.68],[-27.08,38.64]],[[-31.14,39.41],[-31.18,39.36],[-31.26,39.38],[-31.28,39.39],[-31.26,39.5],[-31.2,39.52],[-31.14,39.48],[-31.14,39.41]]]},{"n":"Paraguay","r":[[[-54.62,-25.58],[-54.63,-26.01],[-54.68,-26.31],[-54.76,-26.53],[-54.83,-26.65],[-54.89,-26.67],[-54.93,-26.7],[-54.96,-26.76],[-55.01,-26.81],[-55.09,-26.84],[-55.13,-26.89],[-55.14,-26.93],[-55.21,-26.96],[-55.35,-26.97],[-55.43,-27.01],[-55.45,-27.07],[-55.5,-27.12],[-55.56,-27.15],[-55.6,-27.21],[-55.59,-27.29],[-55.63,-27.36],[-55.71,-27.41],[-55.79,-27.42],[-55.86,-27.36],[-55.95,-27.33],[-56.07,-27.31],[-56.16,-27.32],[-56.24,-27.37],[-56.31,-27.44],[-56.37,-27.54],[-56.44,-27.55],[-56.51,-27.49],[-56.6,-27.47],[-56.72,-27.49],[-56.81,-27.48],[-56.87,-27.44],[-56.97,-27.44],[-57.11,-27.47],[-57.39,-27.43],[-57.81,-27.32],[-58.17,-27.27],[-58.6,-27.31],[-58.64,-27.2],[-58.62,-27.13],[-58.55,-27.08],[-58.5,-27.03],[-58.49,-26.97],[-58.44,-26.92],[-58.36,-26.89],[-58.32,-26.86],[-58.33,-26.82],[-58.32,-26.8],[-58.27,-26.77],[-58.25,-26.73],[-58.24,-26.68],[-58.22,-26.65],[-58.19,-26.63],[-58.19,-26.59],[-58.21,-26.48],[-58.2,-26.38],[-58.18,-26.31],[-58.15,-26.26],[-58.14,-26.25],[-58.12,-26.22],[-58.11,-26.18],[-58.08,-26.14],[-57.94,-26.05],[-57.89,-26.01],[-57.89,-25.96],[-57.87,-25.91],[-57.78,-25.78],[-57.76,-25.73],[-57.75,-25.7],[-57.73,-25.67],[-57.63,-25.6],[-57.57,-25.53],[-57.56,-25.47],[-57.59,-25.41],[-57.64,-25.33],[-57.82,-25.14],[-57.96,-25.05],[-58.14,-24.98],[-58.25,-24.95],[-58.31,-24.98],[-58.37,-24.96],[-58.42,-24.89],[-58.52,-24.84],[-58.72,-24.79],[-59.19,-24.56],[-59.37,-24.45],[-59.44,-24.39],[-59.61,-24.27],[-59.89,-24.09],[-60.11,-24.01],[-60.26,-24.01],[-60.51,-23.96],[-60.84,-23.86],[-61.03,-23.76],[-61.08,-23.66],[-61.21,-23.56],[-61.4,-23.46],[-61.51,-23.39],[-61.51,-23.36],[-61.57,-23.32],[-61.68,-23.27],[-61.8,-23.18],[-61.93,-23.06],[-62.07,-22.87],[-62.21,-22.61],[-62.37,-22.44],[-62.54,-22.35],[-62.63,-22.29],[-62.63,-22.26],[-62.65,-22.23],[-62.63,-22.18],[-62.57,-21.99],[-62.48,-21.71],[-62.39,-21.41],[-62.28,-21.07],[-62.28,-20.82],[-62.28,-20.56],[-62.12,-20.35],[-62.01,-20.2],[-61.92,-20.06],[-61.82,-19.81],[-61.76,-19.65],[-61.51,-19.61],[-61.1,-19.52],[-60.89,-19.48],[-60.45,-19.39],[-60.01,-19.3],[-59.54,-19.29],[-59.09,-19.29],[-58.74,-19.49],[-58.47,-19.65],[-58.18,-19.82],[-58.16,-19.85],[-58.14,-20.0],[-58.16,-20.16],[-58.14,-20.24],[-58.12,-20.29],[-58.09,-20.33],[-58.06,-20.39],[-58.03,-20.42],[-58.0,-20.47],[-58.01,-20.52],[-58.0,-20.59],[-57.98,-20.66],[-57.96,-20.67],[-57.92,-20.69],[-57.89,-20.75],[-57.91,-20.78],[-57.9,-20.81],[-57.88,-20.84],[-57.9,-20.87],[-57.89,-20.9],[-57.86,-20.92],[-57.83,-21.0],[-57.83,-21.13],[-57.86,-21.21],[-57.89,-21.27],[-57.89,-21.3],[-57.87,-21.36],[-57.91,-21.42],[-57.95,-21.49],[-57.94,-21.55],[-57.93,-21.6],[-57.93,-21.65],[-57.92,-21.7],[-57.93,-21.75],[-57.94,-21.8],[-57.95,-21.85],[-57.93,-21.91],[-57.96,-21.97],[-57.98,-22.01],[-57.99,-22.05],[-57.96,-22.11],[-57.88,-22.14],[-57.82,-22.14],[-57.76,-22.11],[-57.72,-22.1],[-57.64,-22.13],[-57.57,-22.18],[-57.48,-22.19],[-57.39,-22.2],[-57.33,-22.22],[-57.24,-22.2],[-57.14,-22.22],[-57.03,-22.24],[-56.94,-22.27],[-56.84,-22.26],[-56.78,-22.26],[-56.7,-22.23],[-56.63,-22.23],[-56.58,-22.18],[-56.55,-22.14],[-56.52,-22.1],[-56.45,-22.08],[-56.39,-22.09],[-56.35,-22.18],[-56.28,-22.23],[-56.25,-22.26],[-56.19,-22.28],[-56.07,-22.28],[-55.99,-22.28],[-55.91,-22.31],[-55.85,-22.31],[-55.8,-22.35],[-55.75,-22.41],[-55.75,-22.51],[-55.7,-22.59],[-55.65,-22.62],[-55.62,-22.67],[-55.63,-22.74],[-55.65,-22.81],[-55.65,-22.89],[-55.62,-22.96],[-55.62,-23.03],[-55.6,-23.09],[-55.56,-23.15],[-55.55,-23.25],[-55.55,-23.32],[-55.53,-23.36],[-55.52,-23.42],[-55.53,-23.46],[-55.54,-23.52],[-55.54,-23.58],[-55.52,-23.63],[-55.46,-23.69],[-55.44,-23.79],[-55.44,-23.87],[-55.42,-23.95],[-55.37,-23.99],[-55.29,-24.0],[-55.19,-24.02],[-55.08,-24.0],[-54.98,-23.97],[-54.93,-23.95],[-54.82,-23.89],[-54.72,-23.85],[-54.67,-23.83],[-54.63,-23.81],[-54.53,-23.85],[-54.44,-23.9],[-54.37,-23.97],[-54.24,-24.05],[-54.27,-24.07],[-54.32,-24.13],[-54.32,-24.2],[-54.28,-24.31],[-54.31,-24.53],[-54.41,-24.87],[-54.45,-25.07],[-54.44,-25.12],[-54.47,-25.22],[-54.61,-25.43],[-54.62,-25.58]]]},{"n":"Palestine","r":[[[34.25,31.21],[34.21,31.29],[34.2,31.32],[34.39,31.48],[34.48,31.58],[34.52,31.54],[34.53,31.53],[34.35,31.36],[34.35,31.29],[34.25,31.21]],[[35.45,31.48],[35.41,31.48],[35.28,31.42],[35.1,31.37],[34.91,31.35],[34.88,31.37],[34.87,31.4],[34.93,31.54],[34.95,31.6],[35.03,31.67],[35.15,31.73],[35.2,31.75],[35.2,31.78],[35.13,31.82],[35.05,31.84],[34.98,31.82],[34.96,31.82],[34.95,31.84],[34.98,31.87],[34.99,31.91],[34.98,31.99],[34.97,32.09],[34.96,32.16],[35.0,32.28],[35.01,32.34],[35.07,32.46],[35.19,32.53],[35.3,32.51],[35.36,32.51],[35.39,32.49],[35.4,32.45],[35.48,32.4],[35.55,32.4],[35.57,32.24],[35.53,32.1],[35.53,31.98],[35.56,31.77],[35.5,31.67],[35.47,31.56],[35.45,31.48]]]},{"n":"French Polynesia","r":[[[-138.51,-20.86],[-138.53,-20.88],[-138.52,-20.85],[-138.55,-20.8],[-138.57,-20.79],[-138.55,-20.77],[-138.51,-20.81],[-138.51,-20.86]],[[-136.29,-18.54],[-136.31,-18.57],[-136.32,-18.55],[-136.34,-18.53],[-136.38,-18.51],[-136.44,-18.49],[-136.46,-18.49],[-136.48,-18.47],[-136.46,-18.46],[-136.43,-18.47],[-136.38,-18.5],[-136.33,-18.52],[-136.29,-18.54]],[[-140.69,-18.38],[-140.67,-18.42],[-140.7,-18.4],[-140.77,-18.36],[-140.78,-18.33],[-140.69,-18.38]],[[-136.97,-18.34],[-136.97,-18.36],[-137.07,-18.27],[-137.03,-18.27],[-136.97,-18.34]],[[-140.83,-18.19],[-140.82,-18.22],[-140.86,-18.2],[-140.9,-18.15],[-140.96,-18.09],[-140.97,-18.06],[-140.93,-18.08],[-140.89,-18.12],[-140.83,-18.19]],[[-140.81,-17.86],[-140.8,-17.88],[-140.84,-17.87],[-140.85,-17.87],[-140.85,-17.83],[-140.82,-17.79],[-140.8,-17.75],[-140.76,-17.72],[-140.69,-17.68],[-140.65,-17.67],[-140.64,-17.68],[-140.65,-17.68],[-140.78,-17.75],[-140.82,-17.8],[-140.83,-17.84],[-140.83,-17.85],[-140.81,-17.86]],[[-149.32,-17.69],[-149.18,-17.74],[-149.15,-17.81],[-149.18,-17.86],[-149.25,-17.85],[-149.29,-17.82],[-149.34,-17.73],[-149.48,-17.75],[-149.58,-17.73],[-149.63,-17.62],[-149.64,-17.56],[-149.61,-17.53],[-149.51,-17.5],[-149.38,-17.52],[-149.33,-17.59],[-149.32,-17.69]],[[-149.81,-17.55],[-149.84,-17.57],[-149.89,-17.55],[-149.91,-17.53],[-149.91,-17.5],[-149.9,-17.47],[-149.81,-17.47],[-149.78,-17.49],[-149.81,-17.55]],[[-151.41,-16.88],[-151.45,-16.88],[-151.49,-16.86],[-151.48,-16.76],[-151.47,-16.74],[-151.41,-16.77],[-151.36,-16.86],[-151.41,-16.88]],[[-143.44,-16.62],[-143.39,-16.67],[-143.46,-16.64],[-143.55,-16.62],[-143.52,-16.61],[-143.46,-16.61],[-143.44,-16.62]],[[-143.57,-16.63],[-143.61,-16.64],[-143.71,-16.58],[-143.67,-16.58],[-143.61,-16.62],[-143.57,-16.63]],[[-151.47,-16.66],[-151.48,-16.67],[-151.5,-16.65],[-151.51,-16.62],[-151.51,-16.57],[-151.46,-16.6],[-151.44,-16.62],[-151.47,-16.66]],[[-145.49,-16.33],[-145.48,-16.35],[-145.5,-16.35],[-145.54,-16.3],[-145.55,-16.25],[-145.58,-16.2],[-145.61,-16.17],[-145.61,-16.13],[-145.61,-16.08],[-145.58,-16.16],[-145.54,-16.22],[-145.52,-16.28],[-145.49,-16.33]],[[-142.51,-16.1],[-142.53,-16.11],[-142.51,-16.03],[-142.48,-16.02],[-142.51,-16.1]],[[-145.05,-15.86],[-145.06,-15.9],[-145.08,-15.86],[-145.14,-15.79],[-145.16,-15.76],[-145.13,-15.76],[-145.05,-15.86]],[[-138.65,-10.52],[-138.69,-10.53],[-138.69,-10.43],[-138.64,-10.45],[-138.62,-10.46],[-138.63,-10.49],[-138.65,-10.52]],[[-139.06,-9.93],[-139.13,-10.01],[-139.13,-9.93],[-139.11,-9.92],[-139.08,-9.92],[-139.06,-9.93]],[[-139.02,-9.7],[-138.87,-9.75],[-138.83,-9.74],[-138.87,-9.79],[-139.02,-9.82],[-139.07,-9.85],[-139.13,-9.83],[-139.17,-9.77],[-139.02,-9.7]],[[-140.08,-9.43],[-140.1,-9.44],[-140.14,-9.38],[-140.14,-9.36],[-140.07,-9.33],[-140.03,-9.34],[-140.08,-9.43]],[[-139.56,-8.94],[-139.62,-8.95],[-139.63,-8.9],[-139.61,-8.87],[-139.58,-8.86],[-139.53,-8.88],[-139.51,-8.9],[-139.51,-8.92],[-139.56,-8.94]],[[-140.07,-8.91],[-140.17,-8.93],[-140.22,-8.93],[-140.25,-8.85],[-140.24,-8.8],[-140.22,-8.78],[-140.06,-8.8],[-140.04,-8.84],[-140.05,-8.87],[-140.07,-8.91]]]},{"n":"Qatar","r":[[[51.27,24.61],[51.18,24.59],[51.09,24.56],[51.02,24.57],[50.97,24.57],[50.93,24.6],[50.86,24.68],[50.8,24.79],[50.84,24.85],[50.85,24.89],[50.78,25.18],[50.75,25.4],[50.76,25.44],[50.8,25.5],[50.87,25.61],[50.9,25.72],[51.0,25.98],[51.11,26.08],[51.26,26.15],[51.39,26.01],[51.54,25.9],[51.57,25.78],[51.53,25.68],[51.49,25.52],[51.51,25.45],[51.52,25.39],[51.56,25.28],[51.6,25.15],[51.61,25.05],[51.59,24.96],[51.53,24.89],[51.43,24.67],[51.4,24.65],[51.27,24.61]]]},{"n":"Romania","r":[[[28.59,43.74],[28.42,43.74],[28.38,43.74],[28.22,43.77],[28.05,43.82],[27.95,43.92],[27.88,43.99],[27.74,43.96],[27.71,43.96],[27.67,44.0],[27.56,44.02],[27.43,44.02],[27.12,44.15],[27.09,44.17],[26.85,44.15],[26.49,44.08],[26.22,44.01],[25.93,43.87],[25.82,43.77],[25.69,43.71],[25.5,43.67],[25.16,43.69],[24.81,43.74],[24.43,43.79],[24.23,43.76],[23.95,43.79],[23.53,43.85],[23.22,43.87],[22.92,43.83],[22.87,43.86],[22.86,43.9],[22.87,43.95],[22.91,43.99],[22.99,44.02],[23.02,44.05],[23.03,44.08],[22.95,44.13],[22.78,44.2],[22.71,44.24],[22.69,44.25],[22.68,44.29],[22.65,44.32],[22.58,44.34],[22.53,44.38],[22.49,44.44],[22.5,44.49],[22.55,44.54],[22.62,44.56],[22.7,44.56],[22.73,44.57],[22.72,44.61],[22.64,44.65],[22.5,44.71],[22.35,44.68],[22.2,44.56],[22.09,44.54],[22.03,44.62],[21.91,44.67],[21.74,44.68],[21.64,44.71],[21.6,44.76],[21.52,44.79],[21.36,44.83],[21.36,44.86],[21.38,44.87],[21.44,44.87],[21.52,44.88],[21.53,44.9],[21.53,44.92],[21.47,44.94],[21.41,44.96],[21.38,44.97],[21.36,44.99],[21.35,45.01],[21.37,45.02],[21.4,45.02],[21.42,45.03],[21.43,45.08],[21.47,45.11],[21.49,45.12],[21.49,45.15],[21.47,45.17],[21.43,45.19],[21.38,45.21],[21.23,45.24],[21.15,45.29],[21.1,45.29],[21.02,45.32],[20.94,45.37],[20.87,45.43],[20.79,45.47],[20.77,45.48],[20.77,45.5],[20.79,45.52],[20.79,45.54],[20.77,45.6],[20.78,45.66],[20.78,45.72],[20.78,45.75],[20.76,45.76],[20.75,45.75],[20.73,45.74],[20.71,45.74],[20.65,45.78],[20.58,45.87],[20.53,45.9],[20.44,45.94],[20.36,45.98],[20.3,46.05],[20.24,46.11],[20.28,46.13],[20.51,46.17],[20.61,46.13],[20.66,46.15],[20.71,46.17],[20.73,46.19],[20.74,46.22],[20.76,46.25],[20.84,46.26],[21.04,46.24],[21.12,46.28],[21.15,46.3],[21.17,46.35],[21.19,46.39],[21.26,46.41],[21.26,46.45],[21.25,46.49],[21.29,46.57],[21.32,46.61],[21.36,46.62],[21.41,46.65],[21.5,46.7],[21.48,46.75],[21.49,46.79],[21.58,46.88],[21.65,46.96],[21.65,47.01],[21.66,47.04],[21.72,47.08],[21.79,47.14],[21.87,47.3],[21.9,47.33],[21.95,47.36],[22.0,47.4],[22.0,47.51],[22.04,47.54],[22.11,47.57],[22.19,47.63],[22.24,47.7],[22.29,47.73],[22.35,47.74],[22.42,47.76],[22.49,47.77],[22.56,47.76],[22.61,47.77],[22.68,47.8],[22.85,47.92],[22.88,47.95],[22.91,47.96],[23.05,48.01],[23.09,48.05],[23.14,48.09],[23.2,48.08],[23.41,47.99],[23.63,48.0],[23.67,47.99],[23.68,47.99],[23.71,47.98],[24.0,47.94],[24.05,47.94],[24.06,47.94],[24.18,47.91],[24.28,47.91],[24.38,47.94],[24.48,47.95],[24.58,47.93],[24.65,47.88],[24.84,47.76],[24.89,47.72],[24.98,47.72],[25.07,47.75],[25.17,47.82],[25.46,47.91],[25.69,47.93],[25.91,47.97],[26.16,47.99],[26.24,48.06],[26.28,48.11],[26.31,48.2],[26.44,48.23],[26.57,48.25],[26.62,48.26],[26.71,48.26],[26.79,48.26],[26.9,48.21],[26.98,48.16],[27.01,48.11],[27.08,48.05],[27.15,47.96],[27.23,47.84],[27.25,47.78],[27.28,47.72],[27.34,47.64],[27.45,47.55],[27.46,47.54],[27.52,47.48],[27.61,47.34],[27.7,47.29],[27.77,47.23],[27.8,47.17],[27.85,47.11],[27.97,47.04],[28.07,46.98],[28.15,46.79],[28.2,46.71],[28.24,46.64],[28.22,46.51],[28.24,46.45],[28.2,46.35],[28.12,46.14],[28.1,45.97],[28.11,45.88],[28.12,45.83],[28.13,45.79],[28.16,45.71],[28.16,45.65],[28.13,45.63],[28.09,45.61],[28.07,45.6],[28.11,45.57],[28.16,45.51],[28.21,45.45],[28.32,45.35],[28.45,45.29],[28.76,45.23],[28.79,45.24],[28.79,45.25],[28.77,45.27],[28.77,45.29],[28.78,45.31],[28.82,45.31],[28.89,45.29],[29.03,45.32],[29.22,45.4],[29.4,45.42],[29.57,45.37],[29.65,45.31],[29.71,45.26],[29.69,45.19],[29.68,45.15],[29.64,44.98],[29.61,44.92],[29.56,44.84],[29.05,44.76],[29.08,44.8],[29.07,44.87],[29.05,44.93],[29.1,44.98],[28.98,44.99],[28.93,44.97],[28.89,44.92],[28.93,44.81],[28.87,44.75],[28.85,44.72],[28.85,44.64],[28.81,44.6],[28.81,44.57],[28.89,44.57],[28.85,44.51],[28.7,44.37],[28.65,44.3],[28.66,43.98],[28.59,43.8],[28.59,43.74]]]},{"n":"Russia","r":[[[48.57,41.84],[48.52,41.78],[48.43,41.66],[48.39,41.6],[48.3,41.55],[48.14,41.48],[48.06,41.46],[47.96,41.33],[47.86,41.21],[47.79,41.2],[47.59,41.22],[47.52,41.23],[47.32,41.28],[47.26,41.32],[47.21,41.46],[47.14,41.52],[47.06,41.55],[47.01,41.59],[46.99,41.62],[46.93,41.67],[46.83,41.74],[46.75,41.81],[46.69,41.83],[46.62,41.81],[46.57,41.8],[46.55,41.81],[46.54,41.87],[46.43,41.89],[46.41,41.9],[46.27,41.96],[46.21,41.99],[46.16,41.99],[46.05,42.01],[45.95,42.04],[45.91,42.07],[45.85,42.11],[45.73,42.16],[45.64,42.21],[45.63,42.23],[45.69,42.36],[45.73,42.48],[45.71,42.5],[45.66,42.52],[45.56,42.54],[45.34,42.53],[45.21,42.65],[45.16,42.68],[45.07,42.69],[44.94,42.73],[44.87,42.76],[44.85,42.75],[44.77,42.62],[44.69,42.71],[44.64,42.73],[44.58,42.75],[44.51,42.75],[44.33,42.7],[44.2,42.65],[44.1,42.62],[44.0,42.6],[43.96,42.57],[43.83,42.57],[43.76,42.59],[43.74,42.62],[43.75,42.66],[43.8,42.7],[43.8,42.73],[43.78,42.75],[43.62,42.81],[43.56,42.84],[43.35,42.9],[43.09,42.99],[43.0,43.05],[42.99,43.09],[42.89,43.13],[42.76,43.17],[42.66,43.16],[42.57,43.16],[42.42,43.22],[42.28,43.23],[42.12,43.21],[42.09,43.2],[42.05,43.19],[41.58,43.22],[41.46,43.28],[41.36,43.33],[41.08,43.37],[40.94,43.42],[40.8,43.48],[40.65,43.53],[40.52,43.51],[40.34,43.54],[40.15,43.57],[40.08,43.55],[40.02,43.48],[39.98,43.42],[39.87,43.47],[39.52,43.73],[39.33,43.9],[38.72,44.29],[38.64,44.32],[38.31,44.37],[38.18,44.42],[37.85,44.7],[37.7,44.66],[37.57,44.67],[37.5,44.7],[37.41,44.74],[37.35,44.79],[37.28,44.91],[37.2,44.97],[36.94,45.07],[36.65,45.13],[36.63,45.15],[36.62,45.19],[36.87,45.25],[36.94,45.29],[36.81,45.34],[36.76,45.35],[36.72,45.37],[36.79,45.41],[36.87,45.43],[36.98,45.38],[37.1,45.3],[37.21,45.27],[37.26,45.31],[37.65,45.38],[37.67,45.43],[37.67,45.49],[37.63,45.49],[37.61,45.5],[37.61,45.56],[37.67,45.65],[37.84,45.8],[37.93,46.0],[38.01,46.05],[38.07,46.02],[38.07,45.97],[38.08,45.93],[38.13,46.0],[38.18,46.09],[38.31,46.1],[38.4,46.08],[38.49,46.09],[38.32,46.24],[38.08,46.39],[37.98,46.38],[37.91,46.41],[37.81,46.53],[37.77,46.64],[37.87,46.63],[37.97,46.62],[38.16,46.69],[38.23,46.7],[38.34,46.68],[38.5,46.66],[38.49,46.73],[38.44,46.81],[38.63,46.87],[38.8,46.91],[39.13,47.02],[39.27,47.04],[39.29,47.07],[39.29,47.11],[39.24,47.2],[39.2,47.27],[39.02,47.27],[38.93,47.18],[38.67,47.14],[38.55,47.15],[38.64,47.21],[38.74,47.24],[38.76,47.26],[38.58,47.24],[38.48,47.18],[38.21,47.09],[38.21,47.14],[38.2,47.18],[38.22,47.21],[38.27,47.24],[38.28,47.26],[38.28,47.28],[38.24,47.29],[38.21,47.3],[38.2,47.32],[38.21,47.34],[38.24,47.37],[38.26,47.41],[38.26,47.48],[38.29,47.56],[38.37,47.61],[38.51,47.62],[38.64,47.67],[38.72,47.71],[38.82,47.84],[38.9,47.86],[39.06,47.85],[39.16,47.84],[39.39,47.83],[39.66,47.84],[39.74,47.84],[39.78,47.89],[39.78,47.96],[39.81,48.04],[39.89,48.17],[39.96,48.24],[39.96,48.27],[39.92,48.28],[39.87,48.29],[39.85,48.3],[39.85,48.33],[39.89,48.36],[39.88,48.42],[39.86,48.48],[39.84,48.54],[39.77,48.57],[39.64,48.59],[39.67,48.66],[39.7,48.74],[39.76,48.78],[39.79,48.81],[39.9,48.79],[39.98,48.81],[40.0,48.82],[39.99,48.85],[39.86,48.88],[39.75,48.91],[39.71,48.96],[39.69,49.01],[39.76,49.04],[39.89,49.06],[39.98,49.13],[40.07,49.2],[40.11,49.25],[40.13,49.31],[40.13,49.37],[40.06,49.43],[40.06,49.5],[40.09,49.54],[40.08,49.58],[40.03,49.6],[39.96,49.59],[39.88,49.57],[39.78,49.57],[39.63,49.65],[39.46,49.73],[39.37,49.73],[39.3,49.74],[39.25,49.78],[39.21,49.83],[39.17,49.86],[39.11,49.84],[39.03,49.82],[38.92,49.82],[38.78,49.88],[38.65,49.95],[38.55,49.95],[38.45,49.96],[38.26,50.05],[38.21,50.05],[38.18,50.03],[38.16,49.95],[38.15,49.94],[38.11,49.93],[38.05,49.92],[37.95,49.96],[37.7,50.11],[37.61,50.21],[37.58,50.29],[37.5,50.34],[37.42,50.41],[37.34,50.42],[37.25,50.39],[37.17,50.36],[37.13,50.35],[36.99,50.34],[36.76,50.29],[36.7,50.25],[36.62,50.21],[36.56,50.23],[36.5,50.28],[36.37,50.3],[36.31,50.28],[36.24,50.31],[36.19,50.37],[36.12,50.41],[36.01,50.42],[35.89,50.44],[35.8,50.41],[35.67,50.35],[35.59,50.37],[35.55,50.44],[35.49,50.46],[35.41,50.54],[35.39,50.61],[35.41,50.64],[35.44,50.68],[35.44,50.73],[35.42,50.77],[35.38,50.8],[35.35,50.9],[35.31,50.95],[35.31,50.99],[35.33,51.02],[35.31,51.04],[35.27,51.05],[35.2,51.04],[35.16,51.06],[35.12,51.12],[35.09,51.18],[35.06,51.2],[34.99,51.2],[34.87,51.19],[34.76,51.17],[34.71,51.17],[34.62,51.2],[34.49,51.24],[34.23,51.24],[34.21,51.26],[34.23,51.28],[34.28,51.31],[34.28,51.34],[34.23,51.36],[34.21,51.42],[34.21,51.48],[34.2,51.55],[34.15,51.61],[34.12,51.64],[34.12,51.68],[34.24,51.69],[34.38,51.72],[34.4,51.74],[34.4,51.78],[34.11,51.98],[34.02,52.16],[33.92,52.25],[33.82,52.32],[33.74,52.34],[33.61,52.33],[33.45,52.33],[33.29,52.35],[33.15,52.34],[32.9,52.26],[32.81,52.25],[32.65,52.28],[32.51,52.31],[32.44,52.31],[32.39,52.29],[32.36,52.27],[32.28,52.11],[32.22,52.08],[32.12,52.05],[32.04,52.05],[31.97,52.05],[31.88,52.07],[31.78,52.1],[31.76,52.1],[31.76,52.13],[31.69,52.22],[31.65,52.26],[31.6,52.28],[31.58,52.31],[31.58,52.43],[31.59,52.53],[31.62,52.55],[31.53,52.63],[31.52,52.7],[31.56,52.73],[31.56,52.76],[31.54,52.8],[31.44,52.86],[31.35,52.93],[31.3,52.99],[31.26,53.02],[31.3,53.06],[31.36,53.14],[31.39,53.18],[31.42,53.2],[31.56,53.2],[31.67,53.2],[31.75,53.18],[31.78,53.15],[31.85,53.11],[32.06,53.09],[32.14,53.09],[32.25,53.13],[32.43,53.21],[32.47,53.27],[32.58,53.31],[32.64,53.33],[32.7,53.34],[32.71,53.37],[32.71,53.42],[32.69,53.45],[32.47,53.55],[32.44,53.58],[32.43,53.62],[32.45,53.65],[32.45,53.69],[32.2,53.78],[31.99,53.8],[31.82,53.79],[31.75,53.81],[31.78,53.85],[31.83,53.94],[31.84,54.0],[31.83,54.03],[31.79,54.06],[31.63,54.11],[31.4,54.2],[31.3,54.29],[31.25,54.39],[31.18,54.45],[31.07,54.49],[31.08,54.52],[31.15,54.61],[31.15,54.63],[31.12,54.65],[30.98,54.7],[30.8,54.78],[30.79,54.81],[30.8,54.86],[30.83,54.91],[30.87,54.94],[30.98,55.05],[30.98,55.09],[30.96,55.14],[30.88,55.22],[30.81,55.28],[30.81,55.31],[30.82,55.33],[30.86,55.36],[30.9,55.4],[30.91,55.53],[30.91,55.57],[30.88,55.6],[30.86,55.61],[30.8,55.6],[30.72,55.62],[30.66,55.66],[30.63,55.67],[30.59,55.7],[30.48,55.77],[30.46,55.79],[30.23,55.85],[30.04,55.84],[29.94,55.85],[29.88,55.83],[29.82,55.8],[29.74,55.77],[29.68,55.77],[29.63,55.75],[29.48,55.68],[29.41,55.72],[29.35,55.78],[29.37,55.83],[29.4,55.88],[29.4,55.91],[29.38,55.94],[29.28,55.97],[29.09,56.02],[29.03,56.02],[28.95,56.0],[28.79,55.94],[28.74,55.96],[28.69,56.0],[28.64,56.06],[28.56,56.09],[28.41,56.09],[28.39,56.09],[28.32,56.05],[28.28,56.06],[28.15,56.14],[28.17,56.19],[28.2,56.26],[28.19,56.32],[28.17,56.39],[28.11,56.51],[28.1,56.55],[28.01,56.6],[27.99,56.65],[27.94,56.7],[27.89,56.74],[27.88,56.82],[27.85,56.85],[27.81,56.87],[27.66,56.84],[27.64,56.85],[27.71,56.98],[27.72,57.05],[27.76,57.14],[27.81,57.17],[27.83,57.19],[27.84,57.25],[27.83,57.29],[27.8,57.32],[27.67,57.37],[27.54,57.43],[27.51,57.51],[27.47,57.52],[27.35,57.53],[27.35,57.55],[27.37,57.61],[27.4,57.67],[27.49,57.72],[27.51,57.76],[27.54,57.8],[27.75,57.84],[27.78,57.86],[27.78,57.87],[27.77,57.88],[27.72,57.91],[27.67,57.93],[27.64,58.01],[27.57,58.14],[27.5,58.22],[27.49,58.27],[27.51,58.33],[27.53,58.38],[27.53,58.44],[27.43,58.73],[27.43,58.79],[27.46,58.84],[27.51,58.89],[27.62,58.94],[27.76,59.05],[27.85,59.19],[27.9,59.28],[27.94,59.3],[28.02,59.3],[28.05,59.33],[28.06,59.34],[28.13,59.36],[28.15,59.37],[28.13,59.4],[28.07,59.45],[28.01,59.48],[28.06,59.55],[28.05,59.65],[28.01,59.72],[28.06,59.78],[28.13,59.79],[28.21,59.72],[28.33,59.69],[28.42,59.73],[28.45,59.81],[28.52,59.85],[28.6,59.82],[28.75,59.81],[28.87,59.81],[28.95,59.83],[28.98,59.85],[29.01,59.9],[29.08,59.96],[29.15,60.0],[29.67,59.96],[30.12,59.87],[30.16,59.9],[30.17,59.96],[30.06,60.0],[29.98,60.03],[29.87,60.12],[29.72,60.2],[29.57,60.2],[29.37,60.18],[29.07,60.19],[28.81,60.33],[28.64,60.38],[28.52,60.48],[28.49,60.54],[28.62,60.49],[28.64,60.54],[28.65,60.61],[28.58,60.65],[28.51,60.68],[28.18,60.57],[27.8,60.54],[28.15,60.75],[28.41,60.9],[28.46,60.92],[28.57,60.96],[28.66,61.0],[28.74,61.06],[28.99,61.17],[29.25,61.29],[29.49,61.44],[29.58,61.49],[29.69,61.55],[29.93,61.71],[30.01,61.76],[30.31,61.96],[30.48,62.07],[30.57,62.13],[30.94,62.32],[31.19,62.48],[31.29,62.57],[31.38,62.69],[31.44,62.78],[31.53,62.89],[31.54,62.92],[31.51,62.96],[31.44,63.01],[31.34,63.07],[31.25,63.14],[31.18,63.21],[30.97,63.3],[30.66,63.42],[30.42,63.5],[30.06,63.69],[29.99,63.74],[30.0,63.75],[30.21,63.8],[30.42,63.95],[30.5,64.02],[30.53,64.08],[30.53,64.14],[30.51,64.2],[30.49,64.24],[30.39,64.28],[30.11,64.37],[30.04,64.44],[29.99,64.52],[29.99,64.56],[30.12,64.64],[30.13,64.69],[30.11,64.73],[30.07,64.77],[29.78,64.8],[29.7,64.85],[29.64,64.91],[29.6,64.97],[29.6,65.0],[29.62,65.04],[29.72,65.08],[29.81,65.11],[29.83,65.15],[29.83,65.19],[29.81,65.2],[29.63,65.22],[29.61,65.23],[29.61,65.25],[29.62,65.27],[29.71,65.34],[29.73,65.47],[29.82,65.57],[29.72,65.62],[29.72,65.63],[29.88,65.66],[30.03,65.67],[30.1,65.68],[30.1,65.73],[30.09,65.79],[29.94,66.02],[29.9,66.09],[29.8,66.18],[29.72,66.23],[29.67,66.28],[29.59,66.36],[29.54,66.44],[29.46,66.53],[29.37,66.62],[29.29,66.7],[29.09,66.85],[29.07,66.89],[29.07,66.93],[29.09,66.97],[29.24,67.1],[29.39,67.2],[29.57,67.32],[29.75,67.43],[29.94,67.55],[29.99,67.67],[29.98,67.69],[29.82,67.75],[29.52,67.93],[29.34,68.06],[29.06,68.12],[28.69,68.19],[28.56,68.35],[28.47,68.49],[28.48,68.54],[28.75,68.77],[28.78,68.81],[28.77,68.84],[28.74,68.86],[28.71,68.87],[28.45,68.87],[28.41,68.9],[28.57,68.93],[28.69,68.96],[28.9,69.01],[28.97,69.02],[29.12,69.05],[29.17,69.07],[29.21,69.1],[29.35,69.27],[29.39,69.3],[29.83,69.36],[29.99,69.39],[30.09,69.43],[30.13,69.46],[30.16,69.5],[30.19,69.54],[30.2,69.58],[30.16,69.63],[30.18,69.64],[30.23,69.63],[30.38,69.58],[30.62,69.53],[30.79,69.53],[30.86,69.54],[30.9,69.56],[30.92,69.61],[30.92,69.65],[30.87,69.78],[31.05,69.77],[31.45,69.69],[31.55,69.7],[31.67,69.72],[31.79,69.82],[31.88,69.83],[32.0,69.81],[32.03,69.84],[31.97,69.91],[31.98,69.95],[32.39,69.87],[32.57,69.81],[32.94,69.75],[33.01,69.72],[33.01,69.67],[32.99,69.63],[32.92,69.6],[32.75,69.61],[32.18,69.67],[32.09,69.63],[32.16,69.6],[32.33,69.55],[32.38,69.48],[32.64,69.49],[32.88,69.46],[33.0,69.47],[33.02,69.45],[32.94,69.38],[32.98,69.37],[33.26,69.43],[33.38,69.44],[33.45,69.43],[33.46,69.38],[33.42,69.32],[33.41,69.27],[33.33,69.15],[33.2,69.12],[33.14,69.07],[33.33,69.1],[33.44,69.13],[33.63,69.29],[33.68,69.31],[34.23,69.31],[34.35,69.3],[34.86,69.23],[35.01,69.22],[35.18,69.23],[35.23,69.27],[35.29,69.28],[35.86,69.19],[36.62,69.0],[37.73,68.69],[38.36,68.42],[38.43,68.36],[38.66,68.32],[38.71,68.34],[38.83,68.32],[39.57,68.07],[39.82,68.06],[39.79,68.11],[39.75,68.16],[39.81,68.15],[39.9,68.11],[40.04,68.02],[40.21,67.94],[40.38,67.83],[40.53,67.79],[40.66,67.77],[40.77,67.74],[40.97,67.71],[41.06,67.44],[41.13,67.39],[41.13,67.27],[41.26,67.22],[41.36,67.21],[41.35,67.12],[41.28,66.91],[41.19,66.83],[40.52,66.45],[40.1,66.3],[39.29,66.13],[38.65,66.07],[38.4,66.06],[37.9,66.1],[37.63,66.13],[37.29,66.23],[36.98,66.27],[36.77,66.29],[36.37,66.3],[35.51,66.4],[35.36,66.43],[34.82,66.61],[34.61,66.56],[34.48,66.55],[34.4,66.61],[34.43,66.63],[34.45,66.65],[34.15,66.7],[33.89,66.71],[33.76,66.75],[33.6,66.78],[33.52,66.76],[33.48,66.76],[33.15,66.84],[33.0,66.91],[32.85,67.02],[32.89,67.06],[32.93,67.09],[32.4,67.15],[31.9,67.16],[31.98,67.13],[32.2,67.11],[32.34,67.07],[32.5,67.0],[32.46,66.92],[32.69,66.83],[32.86,66.75],[32.86,66.72],[32.93,66.7],[33.18,66.68],[33.22,66.6],[33.18,66.57],[33.22,66.53],[33.41,66.48],[33.52,66.47],[33.66,66.44],[33.59,66.38],[33.48,66.35],[33.36,66.33],[33.42,66.32],[33.57,66.32],[34.11,66.23],[34.4,66.13],[34.69,65.95],[34.79,65.86],[34.79,65.82],[34.78,65.77],[34.73,65.72],[34.72,65.66],[34.62,65.51],[34.54,65.46],[34.41,65.4],[34.54,65.28],[34.67,65.17],[34.8,64.99],[34.83,64.91],[34.83,64.8],[34.95,64.76],[34.91,64.74],[34.86,64.71],[34.87,64.56],[35.04,64.44],[35.28,64.36],[35.43,64.35],[35.65,64.38],[35.8,64.34],[36.15,64.19],[36.3,64.03],[36.36,64.0],[36.71,63.95],[36.98,63.91],[37.37,63.82],[37.44,63.81],[37.64,63.89],[37.97,63.95],[38.07,64.03],[38.06,64.09],[37.98,64.21],[37.95,64.32],[37.84,64.37],[37.74,64.4],[37.43,64.37],[37.29,64.38],[37.18,64.41],[37.04,64.49],[36.77,64.69],[36.62,64.75],[36.58,64.79],[36.53,64.85],[36.53,64.94],[36.65,64.94],[36.79,64.99],[36.88,65.17],[37.05,65.2],[37.14,65.19],[37.53,65.11],[38.01,64.88],[38.12,64.85],[38.23,64.85],[38.41,64.86],[38.44,64.83],[38.54,64.79],[38.61,64.79],[39.05,64.71],[39.57,64.57],[39.76,64.58],[39.83,64.66],[39.85,64.69],[40.06,64.77],[40.2,64.78],[40.41,64.75],[40.44,64.78],[40.38,64.9],[40.28,65.0],[40.14,65.06],[39.9,65.25],[39.8,65.35],[39.75,65.45],[39.78,65.53],[39.82,65.6],[40.33,65.75],[40.51,65.84],[40.69,65.96],[40.77,65.99],[41.08,66.02],[41.48,66.12],[41.78,66.26],[42.08,66.47],[42.21,66.52],[42.31,66.51],[42.45,66.48],[42.6,66.42],[42.81,66.41],[43.01,66.42],[43.23,66.42],[43.55,66.32],[43.6,66.29],[43.65,66.25],[43.55,66.17],[43.54,66.12],[43.62,66.15],[43.74,66.16],[43.84,66.14],[43.94,66.1],[44.02,66.05],[44.1,66.01],[44.13,66.06],[44.15,66.11],[44.1,66.24],[44.22,66.41],[44.32,66.48],[44.49,66.67],[44.44,66.79],[44.43,66.94],[44.4,67.0],[44.29,67.1],[44.07,67.17],[43.86,67.19],[43.78,67.25],[43.8,67.33],[43.86,67.44],[44.04,67.67],[44.23,68.0],[44.23,68.07],[44.21,68.11],[44.23,68.15],[44.2,68.25],[44.17,68.33],[43.4,68.61],[43.36,68.64],[43.33,68.67],[43.41,68.68],[43.47,68.68],[44.05,68.55],[44.18,68.54],[45.08,68.58],[45.52,68.55],[45.89,68.48],[46.16,68.29],[46.43,68.12],[46.68,67.97],[46.69,67.85],[46.43,67.82],[46.17,67.82],[45.53,67.76],[45.37,67.69],[44.94,67.48],[44.9,67.41],[44.94,67.35],[45.14,67.28],[45.56,67.19],[45.75,66.99],[45.89,66.89],[45.99,66.85],[46.08,66.84],[46.3,66.84],[46.45,66.82],[46.49,66.8],[46.55,66.82],[46.69,66.83],[47.5,66.93],[47.66,66.98],[47.71,67.05],[47.77,67.28],[47.84,67.36],[47.91,67.45],[47.88,67.52],[47.87,67.58],[48.28,67.65],[48.65,67.7],[48.83,67.68],[48.88,67.73],[48.76,67.83],[48.7,67.87],[48.75,67.9],[48.84,67.87],[48.95,67.85],[49.16,67.87],[49.93,68.07],[50.23,68.18],[50.41,68.22],[50.7,68.32],[50.84,68.35],[51.08,68.36],[51.34,68.4],[51.62,68.48],[51.99,68.54],[52.06,68.54],[52.13,68.53],[52.29,68.46],[52.23,68.42],[52.18,68.37],[52.26,68.35],[52.32,68.34],[52.4,68.35],[52.48,68.38],[52.67,68.43],[52.72,68.48],[52.65,68.51],[52.55,68.59],[52.44,68.61],[52.34,68.61],[52.68,68.73],[53.41,68.91],[53.8,69.0],[54.19,69.0],[54.49,68.99],[54.38,68.96],[53.87,68.93],[53.8,68.91],[53.8,68.88],[53.92,68.87],[53.97,68.84],[53.93,68.81],[53.89,68.8],[53.83,68.71],[53.76,68.63],[53.92,68.54],[53.93,68.44],[53.83,68.38],[53.69,68.4],[53.57,68.37],[53.34,68.34],[53.29,68.31],[53.26,68.27],[53.4,68.26],[53.52,68.26],[53.91,68.23],[53.97,68.23],[54.1,68.26],[54.23,68.27],[54.39,68.28],[54.48,68.29],[54.56,68.27],[54.72,68.18],[54.86,68.2],[54.92,68.37],[55.15,68.48],[55.42,68.57],[55.68,68.58],[55.92,68.64],[56.04,68.65],[56.28,68.62],[56.62,68.62],[56.91,68.57],[57.13,68.55],[57.44,68.64],[58.17,68.89],[58.24,68.83],[58.35,68.92],[58.92,69.0],[59.06,69.01],[59.06,68.97],[59.11,68.9],[59.22,68.85],[59.37,68.74],[59.3,68.71],[59.22,68.69],[59.11,68.62],[59.1,68.44],[59.31,68.4],[59.6,68.35],[59.73,68.35],[59.83,68.38],[59.86,68.4],[59.9,68.42],[59.92,68.47],[59.94,68.51],[59.87,68.6],[59.9,68.71],[60.16,68.7],[60.49,68.73],[60.64,68.79],[60.82,68.9],[60.93,68.99],[60.86,69.15],[60.66,69.11],[60.34,69.46],[60.17,69.59],[60.28,69.65],[60.56,69.69],[60.81,69.82],[60.91,69.85],[61.02,69.85],[61.77,69.76],[62.63,69.74],[63.36,69.68],[64.19,69.53],[64.59,69.44],[64.93,69.33],[64.9,69.25],[65.03,69.27],[65.33,69.2],[65.53,69.17],[65.74,69.13],[65.81,69.08],[66.08,69.04],[66.37,68.96],[66.42,68.95],[66.76,68.89],[67.0,68.87],[67.15,68.75],[67.64,68.58],[67.73,68.51],[68.16,68.4],[68.37,68.31],[68.5,68.35],[68.83,68.57],[69.02,68.82],[69.14,68.95],[68.92,68.96],[68.76,68.92],[68.66,68.93],[68.54,68.97],[68.36,69.07],[68.12,69.24],[68.07,69.42],[68.01,69.48],[67.77,69.53],[67.62,69.58],[67.06,69.69],[66.96,69.66],[66.93,69.6],[66.9,69.55],[66.84,69.61],[66.8,69.66],[66.8,69.74],[66.83,69.84],[66.93,70.01],[67.07,70.01],[67.14,70.03],[67.24,70.11],[67.2,70.17],[67.15,70.22],[67.16,70.3],[67.25,70.5],[67.28,70.74],[67.21,70.8],[67.14,70.84],[66.82,70.8],[66.7,70.82],[66.68,70.86],[66.67,70.9],[66.76,70.96],[66.85,71.06],[66.69,71.04],[66.64,71.08],[66.77,71.14],[66.92,71.28],[67.27,71.35],[67.54,71.41],[67.96,71.55],[68.27,71.68],[68.47,71.85],[68.61,72.01],[68.83,72.39],[69.04,72.67],[69.39,72.96],[69.61,72.98],[69.69,72.98],[69.71,72.96],[69.66,72.93],[69.65,72.9],[69.74,72.88],[69.89,72.88],[70.17,72.9],[70.66,72.89],[71.5,72.91],[71.62,72.9],[71.93,72.82],[72.1,72.83],[72.45,72.79],[72.63,72.74],[72.81,72.69],[72.79,72.48],[72.75,72.34],[72.62,72.08],[72.57,72.01],[72.38,71.82],[72.28,71.7],[72.13,71.61],[71.91,71.55],[71.88,71.51],[71.87,71.46],[72.08,71.31],[72.58,71.15],[72.7,70.96],[72.73,70.82],[72.7,70.46],[72.65,70.4],[72.56,70.35],[72.47,70.27],[72.53,70.17],[72.6,69.79],[72.62,69.48],[72.56,69.38],[72.53,69.15],[72.53,69.08],[72.58,68.97],[72.68,68.87],[72.81,68.82],[73.19,68.71],[73.55,68.57],[73.57,68.53],[73.59,68.48],[73.47,68.43],[73.27,68.29],[73.14,68.18],[73.13,68.09],[73.17,67.97],[73.15,67.87],[73.07,67.77],[72.95,67.7],[72.59,67.59],[71.85,67.01],[71.67,66.94],[71.37,66.96],[71.45,66.88],[71.55,66.76],[71.54,66.68],[71.34,66.69],[71.07,66.6],[70.94,66.55],[70.72,66.52],[70.56,66.55],[70.38,66.6],[70.41,66.65],[70.44,66.67],[70.57,66.7],[70.69,66.75],[70.63,66.75],[70.58,66.75],[70.44,66.7],[70.28,66.69],[70.09,66.75],[69.95,66.83],[69.88,66.85],[69.74,66.81],[69.22,66.83],[69.08,66.82],[69.01,66.79],[69.05,66.77],[69.09,66.72],[69.14,66.64],[69.19,66.58],[69.41,66.51],[69.7,66.48],[69.98,66.4],[70.34,66.34],[71.15,66.37],[71.36,66.36],[71.57,66.33],[71.92,66.25],[72.07,66.25],[72.32,66.33],[72.38,66.51],[72.42,66.56],[73.34,66.81],[73.51,66.86],[73.79,67.0],[73.88,67.08],[73.99,67.33],[74.07,67.41],[74.68,67.69],[74.77,67.77],[74.79,67.9],[74.78,67.99],[74.74,68.07],[74.63,68.22],[74.51,68.3],[74.39,68.42],[74.48,68.66],[74.58,68.75],[75.12,68.86],[75.59,68.9],[76.11,68.98],[76.32,68.99],[76.46,68.98],[76.61,68.9],[76.74,68.78],[77.11,68.6],[77.24,68.47],[77.26,68.32],[77.25,67.94],[77.17,67.78],[77.33,67.74],[77.4,67.7],[77.58,67.64],[77.68,67.59],[77.77,67.57],[77.99,67.56],[78.59,67.58],[78.92,67.59],[78.89,67.61],[78.84,67.63],[78.56,67.64],[78.16,67.68],[77.59,67.75],[77.52,67.91],[77.54,68.01],[77.66,68.19],[77.76,68.22],[77.87,68.23],[78.0,68.26],[77.96,68.38],[77.91,68.48],[77.79,68.63],[77.65,68.9],[77.47,68.91],[77.33,68.96],[76.64,69.12],[76.0,69.24],[75.56,69.25],[75.42,69.24],[75.05,69.12],[74.81,69.09],[74.36,69.14],[73.98,69.11],[73.84,69.14],[73.78,69.2],[73.89,69.42],[73.83,69.5],[73.66,69.62],[73.56,69.71],[73.58,69.8],[73.83,70.18],[73.94,70.27],[74.21,70.45],[74.34,70.58],[74.31,70.65],[73.73,71.07],[73.58,71.22],[73.51,71.26],[73.37,71.32],[73.15,71.39],[73.09,71.44],[73.67,71.85],[73.94,71.91],[74.31,71.96],[74.49,72.0],[74.8,72.08],[74.99,72.14],[75.05,72.2],[75.09,72.26],[75.1,72.42],[75.06,72.55],[75.01,72.62],[74.9,72.71],[74.79,72.81],[74.86,72.84],[74.94,72.85],[75.15,72.85],[75.37,72.8],[75.47,72.69],[75.6,72.58],[75.6,72.51],[75.59,72.46],[75.64,72.38],[75.69,72.35],[75.74,72.3],[75.69,72.25],[75.64,72.23],[75.55,72.17],[75.39,71.98],[75.27,71.96],[75.25,71.81],[75.5,71.65],[75.47,71.53],[75.42,71.49],[75.28,71.43],[75.3,71.38],[75.33,71.34],[75.73,71.27],[76.11,71.22],[76.74,71.2],[76.93,71.13],[77.0,71.18],[77.59,71.17],[78.07,70.99],[78.32,70.93],[78.53,70.91],[78.94,70.93],[79.02,70.95],[79.08,71.0],[78.89,71.0],[78.8,70.97],[78.72,70.98],[78.59,70.99],[78.49,71.03],[78.39,71.09],[78.21,71.27],[77.91,71.32],[77.71,71.3],[77.48,71.31],[77.11,71.41],[76.87,71.45],[76.43,71.55],[76.31,71.6],[76.22,71.68],[76.1,71.83],[76.03,71.91],[76.12,71.93],[76.42,72.01],[76.87,72.03],[77.06,72.0],[77.55,71.84],[77.78,71.84],[78.19,71.91],[78.23,71.95],[78.14,72.04],[78.02,72.09],[77.78,72.11],[77.49,72.07],[77.41,72.11],[77.44,72.16],[77.47,72.19],[77.63,72.2],[77.73,72.23],[77.97,72.33],[78.23,72.38],[78.48,72.39],[79.42,72.38],[79.95,72.22],[80.47,72.15],[80.7,72.1],[80.76,72.09],[80.81,72.05],[80.86,71.97],[81.51,71.75],[81.66,71.72],[82.08,71.71],[82.55,71.76],[82.76,71.76],[82.99,71.75],[83.11,71.72],[83.23,71.67],[83.17,71.6],[83.11,71.56],[82.98,71.45],[82.92,71.42],[82.49,71.29],[82.32,71.26],[82.28,71.09],[82.25,71.06],[82.24,71.0],[82.32,70.88],[82.34,70.81],[82.27,70.71],[82.16,70.6],[82.18,70.51],[82.22,70.4],[82.24,70.43],[82.23,70.48],[82.26,70.54],[82.45,70.69],[82.59,70.89],[82.74,70.94],[82.87,70.95],[83.01,70.9],[83.05,70.82],[83.06,70.69],[83.03,70.58],[82.92,70.41],[82.74,70.29],[82.68,70.22],[82.77,70.15],[82.86,70.1],[82.96,70.09],[83.08,70.09],[83.11,70.11],[83.13,70.16],[83.09,70.22],[83.07,70.28],[83.29,70.32],[83.5,70.35],[83.66,70.42],[83.7,70.47],[83.74,70.55],[83.65,70.67],[83.58,70.77],[83.33,70.99],[83.15,71.1],[83.27,71.28],[83.46,71.47],[83.53,71.51],[83.55,71.54],[83.57,71.59],[83.55,71.65],[83.53,71.68],[83.34,71.83],[83.2,71.87],[82.76,71.9],[82.65,71.93],[82.32,72.07],[82.28,72.11],[82.21,72.21],[82.18,72.24],[82.09,72.27],[81.79,72.33],[81.59,72.35],[81.28,72.36],[81.1,72.39],[80.83,72.49],[80.8,72.52],[80.72,72.65],[80.66,72.71],[80.68,72.76],[80.77,72.86],[80.84,72.95],[80.76,73.03],[80.64,73.05],[80.51,73.09],[80.46,73.16],[80.42,73.23],[80.42,73.29],[80.4,73.36],[80.46,73.41],[80.6,73.47],[80.56,73.51],[80.58,73.57],[81.47,73.64],[81.82,73.66],[83.54,73.67],[83.67,73.69],[84.42,73.72],[84.74,73.76],[85.08,73.72],[85.2,73.72],[85.45,73.73],[85.61,73.82],[85.98,73.86],[86.59,73.89],[86.89,73.89],[86.96,73.86],[87.03,73.82],[86.7,73.72],[86.37,73.62],[86.09,73.58],[85.83,73.49],[85.8,73.46],[85.79,73.44],[85.8,73.37],[85.82,73.33],[86.1,73.27],[86.31,73.2],[86.51,73.14],[86.68,73.11],[86.72,73.13],[86.12,73.31],[85.97,73.35],[85.91,73.39],[85.94,73.46],[86.0,73.49],[86.09,73.52],[86.16,73.53],[86.38,73.57],[87.12,73.62],[87.29,73.7],[87.37,73.76],[87.57,73.81],[87.5,73.83],[87.34,73.85],[87.21,73.88],[86.7,74.2],[86.57,74.24],[86.18,74.28],[86.0,74.32],[86.18,74.42],[86.4,74.45],[86.54,74.44],[86.66,74.41],[86.9,74.33],[87.23,74.36],[87.11,74.4],[86.89,74.45],[86.7,74.52],[86.43,74.59],[86.12,74.63],[85.79,74.65],[85.88,74.74],[86.06,74.73],[86.12,74.76],[86.2,74.82],[86.65,74.68],[86.86,74.72],[87.04,74.78],[87.42,74.94],[87.47,75.01],[87.29,75.05],[87.14,75.07],[86.94,75.07],[86.92,75.11],[87.01,75.17],[87.17,75.19],[87.67,75.13],[88.5,75.29],[88.73,75.37],[89.31,75.47],[89.6,75.46],[90.18,75.59],[91.0,75.65],[91.48,75.65],[91.85,75.72],[92.41,75.75],[92.6,75.78],[93.55,75.85],[94.08,75.91],[94.16,75.96],[93.69,75.92],[93.57,75.96],[93.48,75.93],[93.41,75.9],[93.18,75.96],[93.12,75.94],[93.07,75.91],[92.99,75.9],[92.89,75.91],[92.86,75.98],[92.97,76.08],[93.1,76.03],[93.26,76.1],[93.36,76.1],[93.65,76.05],[93.84,76.1],[94.1,76.12],[94.39,76.1],[94.51,76.11],[94.58,76.15],[95.04,76.11],[95.36,76.14],[95.58,76.14],[95.92,76.11],[96.08,76.08],[95.99,76.01],[95.65,75.89],[95.74,75.87],[95.93,75.93],[96.51,76.01],[96.6,75.99],[96.54,75.92],[96.5,75.89],[96.88,75.93],[97.21,76.02],[97.35,76.03],[97.5,75.98],[97.64,76.03],[97.67,76.08],[97.92,76.09],[98.02,76.13],[98.19,76.17],[98.34,76.18],[98.66,76.24],[98.77,76.22],[98.98,76.21],[99.19,76.18],[99.56,76.11],[99.62,76.08],[99.66,76.08],[99.77,76.03],[99.69,75.96],[99.6,75.85],[99.44,75.8],[99.54,75.8],[99.61,75.81],[99.74,75.88],[99.85,75.93],[99.83,76.14],[99.62,76.24],[99.46,76.28],[99.09,76.38],[98.97,76.43],[98.81,76.48],[98.87,76.51],[99.58,76.47],[99.94,76.49],[100.32,76.48],[100.84,76.53],[101.06,76.48],[101.31,76.48],[101.6,76.44],[101.68,76.49],[101.21,76.54],[101.0,76.53],[100.93,76.56],[101.01,76.62],[101.1,76.7],[101.01,76.78],[100.92,76.82],[100.91,76.9],[100.99,76.99],[101.19,77.03],[101.29,77.1],[101.52,77.2],[102.61,77.51],[103.13,77.63],[103.33,77.64],[103.56,77.63],[104.01,77.73],[104.18,77.73],[104.81,77.65],[104.97,77.59],[105.31,77.55],[105.71,77.53],[105.89,77.49],[105.98,77.45],[106.06,77.39],[105.73,77.35],[105.38,77.24],[104.91,77.17],[104.32,77.13],[104.2,77.1],[105.32,77.09],[105.65,77.1],[105.71,77.0],[105.82,77.0],[106.15,77.05],[106.34,77.05],[106.71,77.01],[106.78,77.03],[106.94,77.03],[107.28,76.99],[107.43,76.93],[107.19,76.82],[106.94,76.73],[106.64,76.57],[106.55,76.59],[106.38,76.59],[106.41,76.51],[106.68,76.51],[106.83,76.48],[107.16,76.52],[107.62,76.51],[107.72,76.52],[107.9,76.57],[107.95,76.66],[108.03,76.72],[108.18,76.74],[108.35,76.72],[108.64,76.72],[109.37,76.75],[109.98,76.71],[110.47,76.76],[111.11,76.72],[111.39,76.69],[111.6,76.62],[111.79,76.6],[111.94,76.55],[112.09,76.48],[112.02,76.42],[111.94,76.38],[112.14,76.42],[112.3,76.43],[112.41,76.41],[112.62,76.38],[112.68,76.22],[112.74,76.19],[112.8,76.13],[112.72,76.08],[112.66,76.05],[112.82,76.06],[113.05,76.11],[113.09,76.13],[113.15,76.17],[113.07,76.22],[112.99,76.24],[113.09,76.26],[113.27,76.25],[113.37,76.18],[113.43,76.11],[113.56,75.89],[113.86,75.92],[113.87,75.86],[113.75,75.7],[113.62,75.59],[113.57,75.57],[113.49,75.56],[113.52,75.62],[113.47,75.66],[113.39,75.68],[113.13,75.7],[112.63,75.84],[112.5,75.85],[112.47,75.84],[112.45,75.83],[112.73,75.74],[112.96,75.57],[113.16,75.62],[113.24,75.61],[113.36,75.53],[113.56,75.5],[113.73,75.45],[113.61,75.29],[112.92,75.02],[112.19,74.85],[111.87,74.74],[111.3,74.66],[110.89,74.55],[110.37,74.47],[110.23,74.38],[109.84,74.32],[109.87,74.29],[109.91,74.26],[109.86,74.21],[109.81,74.17],[109.51,74.09],[109.08,74.03],[108.2,73.69],[107.77,73.62],[107.27,73.62],[107.17,73.59],[106.79,73.38],[106.68,73.33],[106.19,73.31],[105.68,72.96],[105.39,72.84],[105.14,72.78],[105.4,72.79],[105.71,72.84],[106.07,72.95],[106.16,73.0],[106.21,73.06],[106.32,73.11],[106.48,73.14],[107.11,73.18],[107.37,73.16],[107.75,73.17],[108.0,73.24],[108.15,73.26],[108.29,73.27],[108.35,73.31],[108.58,73.32],[109.09,73.38],[109.17,73.4],[109.33,73.49],[109.64,73.45],[109.86,73.47],[110.43,73.63],[110.77,73.69],[110.87,73.73],[110.8,73.76],[110.72,73.78],[110.39,73.73],[110.09,73.71],[109.75,73.72],[109.71,73.74],[109.67,73.8],[109.77,73.88],[109.87,73.93],[110.08,73.99],[110.26,74.02],[110.92,73.95],[111.06,73.94],[111.13,74.05],[111.34,74.05],[111.55,74.03],[111.46,74.0],[111.23,73.97],[111.3,73.88],[111.4,73.83],[111.8,73.75],[112.15,73.71],[112.4,73.71],[112.8,73.75],[112.86,73.77],[112.94,73.84],[112.84,73.96],[112.93,73.95],[113.03,73.91],[113.18,73.84],[113.33,73.71],[113.42,73.65],[113.36,73.58],[113.16,73.46],[113.28,73.39],[113.49,73.35],[113.49,73.15],[113.47,73.05],[113.37,72.94],[113.25,72.9],[113.13,72.83],[113.16,72.77],[113.19,72.73],[113.31,72.66],[113.66,72.63],[113.71,72.65],[113.63,72.68],[113.39,72.71],[113.3,72.74],[113.22,72.81],[113.31,72.88],[113.42,72.93],[113.54,73.05],[113.58,73.14],[113.56,73.23],[113.64,73.27],[113.77,73.32],[113.83,73.33],[113.89,73.35],[113.8,73.37],[113.71,73.38],[113.54,73.43],[113.51,73.5],[113.86,73.53],[114.06,73.58],[114.82,73.61],[115.34,73.7],[116.5,73.68],[117.31,73.6],[118.45,73.59],[118.87,73.54],[118.91,73.52],[118.94,73.48],[118.75,73.46],[118.46,73.46],[118.38,73.37],[118.43,73.25],[118.96,73.12],[119.43,73.06],[119.75,72.98],[119.92,72.97],[120.6,72.98],[121.0,72.94],[121.35,72.97],[121.75,72.97],[121.89,72.96],[122.03,72.9],[122.26,72.88],[122.54,72.88],[122.69,72.89],[122.75,72.91],[122.73,72.93],[122.5,72.97],[122.53,73.02],[122.62,73.03],[123.0,72.96],[123.16,72.95],[123.3,73.0],[123.4,73.09],[123.46,73.14],[123.52,73.17],[123.57,73.18],[123.62,73.19],[123.5,73.26],[123.38,73.35],[123.36,73.4],[123.32,73.43],[123.31,73.53],[123.42,73.64],[123.49,73.67],[123.8,73.63],[123.93,73.69],[124.02,73.71],[124.39,73.75],[124.54,73.75],[124.8,73.71],[125.62,73.52],[125.6,73.45],[125.79,73.47],[125.89,73.5],[126.11,73.52],[126.25,73.55],[126.3,73.54],[126.34,73.51],[126.31,73.46],[126.26,73.42],[126.29,73.39],[126.34,73.39],[126.55,73.33],[126.84,73.43],[126.96,73.53],[127.03,73.55],[127.74,73.48],[127.96,73.45],[128.0,73.43],[128.03,73.39],[128.14,73.35],[128.28,73.33],[128.26,73.3],[128.26,73.27],[128.59,73.26],[128.73,73.23],[128.89,73.19],[128.87,73.14],[128.91,73.11],[129.06,73.11],[129.1,73.11],[129.05,73.05],[128.85,72.97],[128.74,72.94],[128.6,72.9],[128.67,72.89],[129.02,72.87],[129.23,72.78],[129.25,72.71],[129.12,72.68],[128.82,72.59],[128.63,72.55],[128.51,72.55],[128.42,72.54],[128.55,72.5],[129.12,72.49],[129.28,72.44],[129.41,72.32],[129.41,72.17],[129.28,72.09],[128.93,72.08],[128.48,72.25],[128.2,72.31],[127.8,72.43],[127.73,72.41],[127.84,72.31],[128.03,72.25],[128.36,72.09],[128.91,71.76],[129.04,71.78],[129.12,71.82],[129.15,71.88],[129.12,71.95],[129.21,71.92],[129.29,71.85],[129.46,71.74],[129.23,71.74],[128.95,71.71],[128.84,71.66],[128.92,71.6],[129.13,71.59],[129.22,71.51],[129.39,71.4],[129.76,71.12],[130.03,71.07],[130.28,70.95],[130.54,70.89],[130.67,70.89],[130.76,70.96],[130.83,70.94],[130.9,70.8],[131.02,70.75],[131.16,70.74],[131.27,70.77],[131.43,70.83],[131.56,70.9],[131.77,71.1],[131.91,71.2],[132.04,71.24],[131.99,71.29],[132.0,71.35],[132.1,71.48],[132.23,71.64],[132.33,71.73],[132.56,71.9],[132.65,71.93],[132.72,71.87],[132.77,71.8],[132.8,71.77],[132.84,71.76],[133.13,71.61],[133.43,71.49],[133.69,71.43],[134.1,71.38],[134.7,71.39],[134.81,71.46],[135.02,71.52],[135.36,71.54],[135.56,71.61],[135.88,71.63],[136.09,71.62],[136.41,71.57],[137.12,71.42],[137.32,71.36],[137.42,71.3],[137.65,71.21],[137.8,71.16],[137.94,71.13],[137.99,71.14],[137.97,71.17],[137.9,71.19],[137.84,71.23],[138.01,71.26],[138.03,71.29],[138.09,71.31],[138.31,71.33],[138.1,71.36],[138.02,71.36],[137.92,71.38],[137.93,71.43],[138.0,71.46],[138.05,71.53],[138.12,71.57],[138.23,71.6],[138.32,71.6],[138.53,71.56],[138.67,71.63],[138.78,71.63],[139.0,71.56],[139.21,71.44],[139.32,71.44],[139.63,71.49],[139.98,71.49],[139.94,71.56],[139.7,71.7],[139.72,71.88],[139.55,71.93],[139.36,71.95],[139.64,72.0],[139.85,72.15],[140.01,72.16],[140.19,72.19],[140.13,72.21],[139.62,72.23],[139.51,72.21],[139.43,72.16],[139.18,72.16],[139.15,72.26],[139.14,72.33],[139.47,72.47],[139.6,72.5],[140.45,72.49],[140.71,72.52],[141.08,72.59],[140.98,72.63],[140.97,72.72],[140.65,72.84],[140.68,72.87],[140.71,72.89],[140.81,72.89],[141.31,72.86],[141.52,72.79],[142.06,72.72],[143.52,72.7],[143.68,72.67],[144.3,72.64],[144.57,72.61],[145.2,72.57],[145.49,72.54],[145.71,72.5],[146.08,72.47],[146.25,72.44],[146.23,72.35],[145.47,72.36],[145.21,72.39],[144.9,72.4],[144.78,72.38],[144.59,72.31],[144.36,72.27],[144.17,72.26],[144.29,72.19],[144.47,72.17],[145.04,72.26],[146.59,72.3],[146.83,72.3],[146.81,72.24],[146.6,72.12],[146.4,72.04],[146.11,71.94],[146.01,71.95],[146.23,72.14],[146.14,72.15],[146.05,72.14],[145.8,72.22],[145.76,72.23],[145.71,72.21],[145.71,72.18],[145.66,72.07],[145.76,72.02],[145.76,71.94],[145.41,71.89],[145.27,71.89],[145.13,71.93],[145.06,71.93],[145.05,71.9],[145.08,71.85],[145.07,71.83],[145.02,71.79],[144.99,71.75],[145.08,71.71],[145.19,71.7],[145.8,71.75],[146.07,71.81],[146.37,71.92],[146.89,72.2],[147.13,72.29],[147.26,72.33],[147.43,72.34],[148.4,72.31],[148.96,72.25],[149.5,72.16],[149.77,72.09],[149.96,71.99],[150.0,71.95],[150.02,71.9],[149.88,71.84],[149.28,71.83],[149.05,71.8],[148.97,71.76],[148.95,71.74],[148.92,71.71],[148.97,71.69],[149.24,71.69],[149.5,71.66],[149.86,71.6],[149.91,71.58],[150.03,71.52],[150.06,71.51],[150.6,71.52],[150.63,71.5],[150.67,71.46],[150.53,71.39],[150.38,71.34],[150.1,71.23],[150.24,71.27],[150.82,71.36],[150.97,71.38],[151.15,71.37],[151.58,71.29],[151.76,71.22],[152.09,71.02],[152.0,71.0],[151.76,70.98],[152.51,70.83],[152.8,70.84],[153.46,70.88],[153.79,70.88],[154.41,70.97],[155.03,71.03],[155.6,71.04],[155.9,71.1],[156.68,71.09],[157.45,71.07],[158.04,71.04],[158.7,70.94],[159.35,70.79],[159.73,70.65],[159.8,70.6],[159.91,70.51],[159.96,70.42],[160.01,70.31],[159.98,70.22],[159.89,70.16],[159.83,70.08],[159.84,69.99],[159.73,69.87],[159.83,69.78],[160.12,69.73],[160.74,69.66],[160.91,69.61],[160.93,69.46],[160.98,69.33],[161.04,69.1],[161.14,69.04],[161.31,68.98],[161.34,68.91],[161.13,68.65],[161.0,68.61],[160.86,68.54],[161.1,68.56],[161.23,68.65],[161.37,68.82],[161.5,68.85],[161.57,68.91],[161.57,69.06],[161.48,69.2],[161.48,69.3],[161.54,69.38],[161.95,69.55],[162.17,69.61],[162.38,69.65],[162.94,69.68],[163.2,69.71],[163.5,69.69],[163.71,69.7],[163.95,69.74],[164.16,69.72],[164.51,69.61],[165.76,69.58],[165.98,69.55],[166.82,69.5],[166.88,69.5],[167.07,69.55],[167.63,69.74],[167.86,69.73],[167.95,69.7],[168.05,69.63],[168.15,69.58],[168.23,69.45],[168.3,69.27],[168.42,69.24],[168.59,69.23],[168.95,69.16],[169.31,69.08],[169.41,68.92],[169.61,68.79],[170.07,68.8],[170.54,68.83],[171.0,69.05],[171.0,69.13],[170.88,69.26],[170.71,69.39],[170.58,69.58],[170.16,69.63],[170.2,69.68],[170.36,69.75],[170.5,69.86],[170.53,69.94],[170.49,70.11],[170.87,70.1],[171.25,70.08],[171.97,70.0],[172.56,69.97],[172.87,69.92],[173.06,69.86],[173.28,69.82],[173.35,69.92],[173.44,69.95],[173.73,69.89],[173.95,69.87],[174.32,69.88],[174.79,69.86],[175.3,69.86],[175.75,69.9],[175.92,69.9],[176.11,69.86],[176.41,69.77],[176.92,69.65],[177.39,69.61],[177.93,69.5],[178.44,69.45],[178.85,69.39],[178.91,69.36],[178.92,69.33],[178.95,69.3],[179.27,69.26],[179.87,69.01],[180.0,68.98],[180.0,65.07],[179.83,65.03],[179.65,64.92],[179.45,64.82],[179.15,64.78],[178.7,64.63],[178.52,64.6],[178.29,64.67],[177.75,64.72],[177.58,64.78],[177.34,64.93],[177.25,64.95],[177.18,65.01],[176.88,65.08],[176.62,65.04],[176.41,65.07],[176.34,65.05],[176.45,65.03],[176.65,65.01],[176.94,65.02],[177.04,65.0],[177.12,64.95],[177.22,64.86],[177.15,64.8],[177.07,64.79],[176.83,64.85],[176.56,64.84],[176.43,64.86],[176.06,64.96],[175.78,64.84],[175.4,64.78],[175.1,64.78],[174.55,64.68],[174.7,64.68],[175.1,64.75],[175.33,64.75],[175.68,64.78],[175.86,64.83],[175.95,64.87],[176.06,64.9],[176.17,64.88],[176.25,64.84],[176.3,64.78],[176.35,64.71],[176.28,64.66],[176.22,64.64],[176.14,64.59],[176.51,64.68],[176.73,64.62],[176.84,64.63],[177.05,64.72],[177.39,64.77],[177.43,64.76],[177.47,64.74],[177.41,64.57],[177.43,64.44],[177.69,64.3],[177.95,64.22],[178.04,64.22],[178.13,64.24],[178.16,64.31],[178.23,64.36],[178.31,64.31],[178.38,64.26],[178.48,64.13],[178.47,64.09],[178.45,64.01],[178.54,63.98],[178.65,63.97],[178.69,63.84],[178.73,63.67],[178.68,63.65],[178.63,63.65],[178.44,63.61],[178.47,63.57],[178.65,63.56],[178.71,63.52],[178.67,63.44],[178.68,63.4],[178.74,63.39],[178.79,63.44],[178.78,63.51],[178.79,63.54],[178.92,63.4],[178.92,63.35],[179.03,63.28],[179.33,63.19],[179.39,63.15],[179.41,63.08],[179.33,63.06],[179.26,63.01],[179.3,62.94],[179.38,62.88],[179.51,62.86],[179.57,62.77],[179.57,62.69],[179.48,62.61],[179.29,62.51],[179.18,62.47],[179.13,62.4],[179.12,62.32],[179.04,62.32],[178.96,62.36],[178.02,62.55],[177.66,62.58],[177.35,62.59],[177.29,62.6],[177.3,62.64],[177.32,62.69],[177.36,62.74],[177.34,62.78],[177.3,62.78],[177.26,62.75],[177.17,62.75],[177.09,62.79],[177.02,62.78],[176.99,62.72],[176.96,62.69],[176.96,62.66],[177.01,62.63],[177.19,62.59],[177.16,62.56],[176.91,62.54],[176.7,62.51],[176.44,62.41],[176.33,62.35],[175.61,62.18],[175.44,62.13],[175.37,62.12],[175.27,62.1],[175.19,62.03],[174.8,61.94],[174.72,61.95],[174.61,61.87],[174.51,61.82],[174.28,61.82],[174.14,61.8],[173.82,61.68],[173.62,61.72],[173.39,61.56],[173.13,61.41],[173.05,61.41],[172.86,61.47],[172.81,61.44],[172.84,61.38],[172.91,61.31],[172.87,61.29],[172.79,61.31],[172.73,61.31],[172.69,61.3],[172.7,61.25],[172.58,61.19],[172.5,61.19],[172.4,61.17],[172.36,61.12],[172.39,61.06],[172.21,61.0],[172.07,60.92],[172.0,60.9],[171.92,60.86],[171.83,60.84],[171.73,60.84],[171.49,60.73],[170.95,60.52],[170.8,60.5],[170.61,60.43],[170.59,60.39],[170.59,60.34],[170.51,60.26],[170.42,60.05],[170.4,60.01],[170.35,59.97],[170.15,59.99],[169.98,60.07],[169.93,60.1],[169.9,60.15],[169.89,60.22],[169.85,60.25],[169.81,60.27],[169.62,60.44],[169.28,60.56],[169.23,60.6],[168.79,60.56],[168.67,60.56],[168.46,60.59],[168.14,60.57],[167.75,60.51],[167.63,60.47],[167.23,60.41],[166.96,60.31],[166.45,59.95],[166.33,59.87],[166.27,59.86],[166.19,59.85],[166.15,59.92],[166.14,59.98],[166.17,60.09],[166.23,60.18],[166.29,60.35],[166.31,60.41],[166.35,60.48],[166.18,60.48],[165.94,60.36],[165.58,60.24],[165.42,60.21],[165.29,60.13],[165.19,60.12],[165.08,60.1],[165.07,59.95],[165.02,59.86],[164.95,59.84],[164.85,59.84],[164.78,59.87],[164.67,60.0],[164.53,60.06],[164.44,60.07],[164.38,60.06],[164.25,59.97],[164.11,59.9],[164.14,59.98],[164.02,60.02],[163.91,60.04],[163.78,60.04],[163.74,60.03],[163.69,59.98],[163.57,59.91],[163.49,59.89],[163.41,59.83],[163.36,59.78],[163.32,59.71],[163.27,59.52],[163.27,59.3],[163.08,59.13],[163.01,59.15],[162.97,59.14],[162.94,59.11],[163.0,59.02],[162.97,58.99],[162.93,58.96],[162.85,58.94],[162.64,58.8],[162.45,58.71],[162.14,58.45],[162.05,58.27],[161.96,58.08],[162.0,57.98],[162.04,57.92],[162.1,57.87],[162.2,57.83],[162.41,57.78],[162.39,57.75],[162.39,57.72],[162.47,57.77],[162.52,57.9],[162.65,57.95],[162.72,57.95],[163.15,57.84],[163.23,57.79],[163.21,57.69],[163.19,57.64],[163.11,57.56],[162.96,57.48],[162.78,57.36],[162.76,57.28],[162.76,57.24],[162.81,57.1],[162.81,57.02],[162.79,56.88],[162.8,56.81],[162.85,56.76],[162.92,56.72],[163.05,56.74],[163.17,56.73],[163.26,56.69],[163.24,56.56],[163.29,56.45],[163.34,56.23],[163.26,56.17],[163.19,56.14],[163.05,56.04],[162.97,56.03],[162.84,56.07],[162.63,56.23],[162.71,56.33],[162.89,56.4],[162.98,56.45],[163.04,56.52],[162.94,56.51],[162.88,56.48],[162.67,56.49],[162.59,56.45],[162.49,56.4],[162.53,56.26],[162.46,56.24],[162.33,56.19],[162.15,56.13],[162.08,56.09],[161.92,55.84],[161.78,55.65],[161.72,55.5],[161.73,55.36],[161.78,55.21],[161.82,55.14],[162.0,55.0],[162.08,54.89],[162.11,54.75],[161.97,54.69],[161.73,54.53],[161.62,54.52],[161.29,54.52],[161.13,54.6],[160.94,54.58],[160.77,54.54],[160.52,54.43],[160.29,54.29],[160.07,54.19],[160.01,54.13],[159.92,54.01],[159.84,53.78],[159.87,53.67],[159.91,53.62],[159.96,53.55],[159.9,53.45],[159.9,53.38],[160.0,53.27],[160.03,53.13],[159.95,53.13],[159.77,53.23],[159.59,53.24],[159.14,53.12],[158.95,53.05],[158.75,52.91],[158.68,52.94],[158.64,53.01],[158.56,53.05],[158.47,53.03],[158.43,52.96],[158.56,52.92],[158.61,52.87],[158.53,52.69],[158.48,52.63],[158.5,52.46],[158.49,52.38],[158.46,52.3],[158.33,52.09],[158.1,51.81],[157.82,51.61],[157.63,51.53],[157.53,51.48],[157.49,51.41],[157.2,51.21],[156.85,51.01],[156.75,50.97],[156.72,51.05],[156.71,51.12],[156.67,51.23],[156.54,51.31],[156.52,51.38],[156.5,51.48],[156.49,51.91],[156.38,52.37],[156.36,52.51],[156.23,52.63],[156.15,52.75],[156.11,52.87],[156.1,53.01],[155.95,53.74],[155.9,53.93],[155.71,54.52],[155.62,54.86],[155.56,55.2],[155.55,55.35],[155.64,55.79],[155.72,56.07],[155.98,56.7],[156.03,56.75],[156.07,56.78],[156.53,57.02],[156.73,57.15],[156.85,57.29],[156.98,57.47],[156.96,57.56],[156.95,57.62],[156.9,57.68],[156.79,57.75],[156.83,57.78],[156.87,57.8],[156.99,57.83],[157.22,57.78],[157.45,57.8],[157.67,58.02],[157.97,57.99],[158.21,58.03],[158.28,58.01],[158.32,58.08],[158.45,58.16],[158.69,58.28],[159.04,58.42],[159.21,58.52],[159.31,58.61],[159.45,58.7],[159.59,58.8],[159.85,59.13],[160.35,59.39],[160.55,59.55],[160.71,59.6],[160.86,59.63],[161.22,59.85],[161.45,60.03],[161.75,60.15],[161.85,60.23],[162.0,60.42],[162.07,60.47],[162.27,60.54],[162.71,60.66],[162.97,60.78],[163.35,60.8],[163.47,60.85],[163.59,60.88],[163.71,60.92],[163.55,61.03],[163.59,61.08],[163.62,61.11],[163.89,61.24],[164.01,61.34],[163.99,61.39],[163.97,61.42],[163.8,61.46],[163.84,61.56],[163.88,61.64],[164.02,61.71],[164.07,61.87],[164.07,62.05],[164.21,62.29],[164.29,62.35],[164.6,62.47],[164.67,62.47],[164.89,62.43],[165.12,62.41],[165.21,62.37],[165.23,62.41],[165.21,62.45],[165.28,62.46],[165.42,62.45],[165.4,62.49],[165.04,62.52],[164.79,62.57],[164.57,62.68],[164.42,62.7],[164.26,62.7],[163.33,62.55],[163.29,62.51],[163.24,62.46],[163.3,62.37],[163.26,62.34],[163.21,62.31],[163.16,62.26],[163.12,62.15],[163.13,62.05],[163.02,61.89],[163.01,61.79],[163.21,61.74],[163.26,61.7],[163.2,61.64],[163.14,61.61],[163.09,61.57],[163.05,61.55],[162.99,61.54],[162.92,61.6],[162.86,61.71],[162.75,61.71],[162.72,61.7],[162.7,61.65],[162.61,61.65],[162.51,61.67],[162.39,61.66],[162.19,61.54],[161.04,60.96],[160.92,60.89],[160.77,60.75],[160.48,60.74],[160.37,60.71],[160.29,60.67],[160.17,60.64],[160.18,60.69],[160.2,60.73],[160.23,60.83],[160.38,61.03],[160.28,61.04],[160.18,61.05],[160.0,61.01],[159.88,60.94],[159.79,60.96],[159.83,61.01],[159.95,61.13],[159.91,61.23],[159.88,61.29],[159.93,61.32],[160.16,61.54],[160.25,61.65],[160.32,61.79],[160.32,61.84],[160.31,61.89],[160.24,61.9],[160.18,61.9],[159.72,61.76],[159.55,61.72],[159.5,61.78],[159.42,61.81],[159.3,61.91],[159.19,61.93],[159.08,61.92],[158.82,61.85],[158.55,61.81],[158.33,61.83],[158.15,61.76],[158.07,61.75],[157.8,61.8],[157.47,61.8],[157.37,61.75],[157.08,61.68],[156.89,61.57],[156.79,61.53],[156.68,61.48],[156.63,61.27],[156.48,61.21],[156.34,61.16],[156.06,61.0],[155.85,60.78],[155.72,60.68],[155.43,60.55],[154.97,60.38],[154.58,60.1],[154.44,59.88],[154.39,59.88],[154.29,59.83],[154.27,59.73],[154.27,59.66],[154.21,59.6],[154.15,59.53],[154.21,59.48],[154.27,59.48],[154.36,59.48],[154.58,59.54],[154.97,59.45],[155.17,59.36],[155.15,59.27],[155.16,59.19],[155.02,59.2],[154.82,59.19],[154.7,59.14],[154.46,59.22],[154.38,59.19],[154.25,59.11],[154.01,59.08],[153.89,59.11],[153.7,59.22],[153.36,59.21],[153.27,59.09],[153.2,59.09],[153.08,59.08],[152.88,58.94],[152.82,58.93],[152.58,58.95],[152.4,59.03],[152.32,59.03],[152.17,59.0],[152.09,58.91],[151.7,58.87],[151.33,58.88],[151.12,59.08],[151.5,59.16],[151.73,59.15],[151.99,59.16],[152.26,59.22],[152.17,59.28],[152.1,59.29],[151.94,59.28],[151.8,59.32],[151.49,59.52],[151.35,59.56],[151.17,59.58],[151.03,59.59],[150.98,59.57],[150.91,59.52],[150.86,59.48],[150.82,59.46],[150.73,59.47],[150.62,59.51],[150.48,59.49],[150.54,59.52],[150.67,59.56],[150.46,59.59],[150.33,59.64],[150.2,59.65],[149.64,59.77],[149.42,59.76],[149.29,59.73],[149.07,59.63],[149.13,59.56],[149.18,59.53],[149.2,59.49],[149.13,59.48],[148.93,59.48],[148.8,59.53],[148.71,59.45],[148.74,59.37],[148.89,59.4],[148.96,59.37],[148.91,59.28],[148.73,59.26],[148.49,59.26],[148.26,59.41],[147.87,59.39],[147.69,59.29],[147.51,59.27],[147.04,59.37],[146.8,59.37],[146.54,59.46],[146.44,59.43],[146.27,59.22],[146.05,59.17],[145.93,59.2],[145.83,59.33],[145.76,59.37],[145.55,59.41],[144.48,59.38],[144.12,59.41],[143.87,59.41],[143.52,59.34],[143.19,59.37],[142.58,59.24],[142.33,59.15],[142.03,59.0],[141.75,58.75],[141.6,58.65],[141.35,58.53],[140.99,58.42],[140.79,58.3],[140.68,58.21],[140.5,57.87],[140.45,57.81],[140.0,57.69],[139.86,57.55],[139.8,57.51],[139.62,57.46],[139.51,57.36],[139.44,57.33],[139.18,57.26],[138.97,57.09],[138.66,56.97],[138.22,56.63],[138.18,56.59],[138.14,56.5],[138.07,56.43],[137.69,56.14],[137.57,56.11],[137.38,55.97],[137.19,55.89],[137.01,55.8],[136.79,55.69],[136.46,55.58],[136.35,55.51],[136.18,55.35],[135.75,55.16],[135.54,55.11],[135.26,54.94],[135.23,54.9],[135.21,54.84],[135.26,54.73],[135.33,54.71],[135.44,54.69],[135.85,54.58],[136.24,54.61],[136.58,54.61],[136.71,54.62],[136.8,54.62],[136.82,54.56],[136.82,54.45],[136.77,54.35],[136.73,54.06],[136.68,53.93],[136.72,53.8],[136.8,53.78],[136.89,53.84],[137.02,53.85],[137.16,53.82],[137.26,54.03],[137.17,54.06],[137.1,54.13],[137.14,54.18],[137.38,54.28],[137.53,54.29],[137.67,54.28],[137.51,54.16],[137.45,54.13],[137.4,54.12],[137.34,54.1],[137.48,54.03],[137.62,53.97],[137.83,53.95],[137.79,53.9],[137.64,53.87],[137.52,53.71],[137.31,53.63],[137.22,53.58],[137.25,53.55],[137.33,53.54],[137.74,53.56],[137.95,53.6],[138.25,53.73],[138.38,53.91],[138.49,53.96],[138.53,53.96],[138.57,53.95],[138.57,53.82],[138.41,53.67],[138.29,53.59],[138.25,53.52],[138.32,53.52],[138.45,53.54],[138.51,53.57],[138.66,53.74],[138.7,53.87],[138.72,54.04],[138.7,54.15],[138.72,54.22],[138.66,54.3],[138.7,54.32],[139.11,54.22],[139.32,54.19],[139.71,54.28],[139.8,54.26],[139.86,54.21],[140.18,54.05],[140.24,54.0],[140.35,53.81],[140.69,53.6],[141.01,53.49],[141.02,53.45],[141.22,53.33],[141.37,53.29],[141.4,53.18],[141.33,53.1],[141.18,53.02],[140.89,53.09],[140.84,53.09],[140.87,53.04],[141.09,52.9],[141.26,52.84],[141.27,52.65],[141.25,52.55],[141.13,52.44],[141.17,52.37],[141.33,52.27],[141.41,52.23],[141.49,52.18],[141.39,52.06],[141.37,51.92],[141.26,51.86],[141.13,51.73],[140.93,51.62],[140.84,51.41],[140.69,51.23],[140.67,51.05],[140.65,50.99],[140.52,50.8],[140.48,50.55],[140.54,50.13],[140.56,50.11],[140.62,50.08],[140.61,50.05],[140.58,50.03],[140.46,49.91],[140.46,49.83],[140.51,49.76],[140.52,49.6],[140.43,49.33],[140.4,49.29],[140.36,49.22],[140.35,49.16],[140.33,49.12],[140.31,49.05],[140.33,48.99],[140.38,48.96],[140.22,48.77],[140.17,48.52],[140.11,48.42],[140.0,48.32],[139.76,48.18],[139.68,48.09],[139.52,47.98],[139.37,47.89],[139.17,47.63],[139.0,47.38],[138.59,47.06],[138.53,46.98],[138.5,46.89],[138.39,46.75],[138.34,46.54],[138.21,46.46],[138.11,46.25],[137.77,45.93],[137.69,45.82],[137.43,45.64],[137.15,45.39],[136.8,45.17],[136.74,45.08],[136.6,44.98],[136.46,44.82],[136.25,44.67],[136.21,44.56],[136.14,44.49],[135.99,44.44],[135.87,44.37],[135.53,43.97],[135.49,43.9],[135.48,43.84],[135.26,43.68],[135.13,43.53],[134.92,43.43],[134.69,43.29],[134.16,43.04],[134.01,42.95],[133.71,42.83],[133.59,42.83],[133.33,42.76],[133.16,42.7],[133.06,42.72],[133.0,42.81],[132.92,42.81],[132.86,42.79],[132.71,42.88],[132.58,42.87],[132.48,42.91],[132.3,42.88],[132.33,43.24],[132.31,43.31],[132.23,43.25],[132.03,43.12],[131.95,43.1],[131.87,43.1],[131.9,43.17],[132.01,43.28],[131.98,43.3],[131.94,43.3],[131.79,43.26],[131.72,43.2],[131.52,43.0],[131.39,42.82],[131.29,42.77],[131.25,42.7],[131.16,42.63],[131.02,42.65],[130.95,42.63],[130.76,42.67],[130.71,42.66],[130.83,42.52],[130.73,42.33],[130.69,42.3],[130.66,42.33],[130.65,42.37],[130.62,42.42],[130.55,42.47],[130.53,42.54],[130.58,42.57],[130.58,42.62],[130.52,42.67],[130.44,42.69],[130.42,42.7],[130.42,42.73],[130.45,42.76],[130.49,42.78],[130.58,42.81],[130.72,42.84],[130.8,42.86],[130.87,42.86],[130.94,42.85],[131.01,42.88],[131.07,42.9],[131.08,42.96],[131.09,43.04],[131.11,43.06],[131.14,43.1],[131.18,43.14],[131.21,43.26],[131.24,43.34],[131.26,43.38],[131.26,43.43],[131.24,43.47],[131.21,43.49],[131.18,43.51],[131.18,43.57],[131.18,43.65],[131.17,43.7],[131.21,44.0],[131.26,44.07],[131.13,44.47],[131.09,44.6],[131.06,44.66],[131.0,44.75],[130.97,44.8],[130.98,44.84],[131.03,44.89],[131.08,44.91],[131.23,44.92],[131.27,44.94],[131.45,44.98],[131.49,45.01],[131.58,45.08],[131.61,45.14],[131.65,45.21],[131.74,45.24],[131.79,45.31],[131.85,45.33],[131.91,45.27],[131.98,45.24],[132.07,45.23],[132.18,45.2],[132.36,45.16],[132.55,45.12],[132.67,45.09],[132.72,45.08],[132.84,45.06],[132.89,45.05],[132.94,45.03],[133.01,45.07],[133.11,45.13],[133.1,45.22],[133.11,45.32],[133.19,45.49],[133.27,45.55],[133.31,45.55],[133.36,45.57],[133.44,45.6],[133.47,45.65],[133.45,45.71],[133.48,45.76],[133.48,45.81],[133.51,45.88],[133.55,45.9],[133.61,45.92],[133.65,45.96],[133.69,46.01],[133.71,46.07],[133.7,46.14],[133.75,46.19],[133.83,46.22],[133.86,46.25],[133.87,46.31],[133.88,46.34],[133.9,46.37],[133.89,46.43],[133.87,46.5],[133.96,46.61],[134.02,46.71],[134.04,46.86],[134.05,46.88],[134.07,46.95],[134.09,46.98],[134.14,47.07],[134.2,47.13],[134.19,47.19],[134.16,47.26],[134.17,47.3],[134.23,47.35],[134.26,47.38],[134.29,47.41],[134.34,47.43],[134.38,47.44],[134.48,47.45],[134.54,47.49],[134.6,47.52],[134.7,47.62],[134.73,47.68],[134.75,47.72],[134.7,47.8],[134.65,47.87],[134.59,47.98],[134.57,48.02],[134.61,48.08],[134.65,48.12],[134.67,48.15],[134.68,48.21],[134.67,48.25],[134.56,48.32],[134.46,48.36],[134.33,48.37],[134.29,48.37],[134.21,48.36],[133.84,48.27],[133.67,48.21],[133.57,48.13],[133.47,48.1],[133.3,48.1],[133.14,48.11],[133.02,48.06],[132.88,47.98],[132.77,47.94],[132.71,47.95],[132.64,47.89],[132.56,47.77],[132.48,47.71],[132.38,47.73],[132.15,47.72],[131.79,47.68],[131.56,47.68],[131.46,47.72],[131.32,47.73],[131.12,47.7],[131.0,47.69],[130.96,47.71],[130.93,47.76],[130.92,47.84],[130.85,47.93],[130.73,48.02],[130.71,48.13],[130.79,48.25],[130.8,48.34],[130.76,48.39],[130.75,48.43],[130.66,48.48],[130.6,48.57],[130.55,48.6],[130.57,48.68],[130.62,48.77],[130.55,48.86],[130.36,48.87],[130.2,48.89],[130.04,48.97],[129.79,49.2],[129.67,49.28],[129.59,49.29],[129.53,49.32],[129.5,49.39],[129.44,49.39],[129.38,49.39],[129.35,49.36],[129.31,49.35],[129.25,49.38],[129.19,49.38],[129.12,49.36],[129.07,49.37],[129.02,49.42],[128.94,49.45],[128.82,49.46],[128.77,49.49],[128.79,49.54],[128.77,49.58],[128.7,49.6],[128.53,49.59],[128.24,49.56],[128.0,49.57],[127.81,49.62],[127.71,49.67],[127.69,49.72],[127.64,49.76],[127.55,49.8],[127.5,49.87],[127.49,49.98],[127.51,50.07],[127.59,50.21],[127.4,50.3],[127.34,50.35],[127.35,50.39],[127.34,50.43],[127.31,50.45],[127.31,50.49],[127.35,50.55],[127.35,50.62],[127.31,50.71],[127.2,50.83],[127.02,50.99],[126.92,51.1],[126.91,51.17],[126.89,51.23],[126.85,51.26],[126.83,51.31],[126.85,51.37],[126.83,51.41],[126.8,51.45],[126.81,51.51],[126.77,51.55],[126.71,51.57],[126.69,51.61],[126.7,51.7],[126.65,51.78],[126.51,51.93],[126.47,52.03],[126.46,52.13],[126.39,52.17],[126.39,52.21],[126.38,52.29],[126.35,52.31],[126.32,52.33],[126.34,52.36],[126.31,52.4],[126.24,52.44],[126.2,52.48],[126.19,52.52],[126.16,52.55],[126.05,52.57],[126.02,52.61],[126.02,52.64],[126.05,52.67],[126.06,52.69],[126.06,52.72],[126.05,52.74],[126.0,52.77],[125.94,52.8],[125.87,52.87],[125.78,52.89],[125.73,52.89],[125.68,52.93],[125.7,52.96],[125.69,53.0],[125.65,53.04],[125.6,53.06],[125.55,53.05],[125.42,53.08],[125.23,53.17],[125.08,53.2],[124.97,53.2],[124.91,53.17],[124.88,53.13],[124.81,53.13],[124.64,53.21],[124.47,53.23],[124.37,53.27],[124.29,53.34],[124.22,53.37],[124.15,53.36],[123.99,53.41],[123.74,53.51],[123.61,53.55],[123.56,53.53],[123.53,53.53],[123.49,53.53],[123.42,53.53],[123.31,53.56],[123.15,53.54],[122.96,53.5],[122.74,53.47],[122.52,53.46],[122.38,53.46],[122.34,53.49],[122.09,53.45],[121.74,53.38],[121.41,53.32],[120.99,53.28],[120.7,53.17],[120.42,52.97],[120.22,52.84],[120.09,52.79],[120.04,52.72],[120.07,52.63],[120.17,52.6],[120.36,52.63],[120.52,52.62],[120.66,52.57],[120.7,52.49],[120.65,52.4],[120.67,52.3],[120.74,52.21],[120.75,52.1],[120.68,51.97],[120.51,51.85],[120.24,51.72],[120.07,51.6],[119.97,51.42],[119.81,51.27],[119.76,51.18],[119.75,51.11],[119.68,51.03],[119.57,50.95],[119.51,50.86],[119.5,50.78],[119.45,50.7],[119.34,50.63],[119.28,50.56],[119.26,50.48],[119.22,50.43],[119.16,50.41],[119.19,50.38],[119.3,50.35],[119.35,50.28],[119.33,50.15],[119.26,50.07],[119.15,50.01],[118.98,49.98],[118.76,49.96],[118.45,49.84],[118.19,49.69],[117.87,49.51],[117.81,49.51],[117.7,49.54],[117.48,49.61],[117.25,49.62],[117.02,49.69],[116.89,49.74],[116.68,49.82],[116.63,49.88],[116.55,49.92],[116.35,49.98],[116.22,50.01],[116.13,50.01],[115.93,49.95],[115.8,49.91],[115.72,49.88],[115.59,49.89],[115.43,49.9],[115.37,49.91],[115.27,49.95],[115.1,50.06],[115.0,50.14],[114.88,50.18],[114.74,50.23],[114.67,50.25],[114.55,50.24],[114.39,50.26],[114.3,50.27],[114.22,50.26],[114.07,50.2],[113.88,50.1],[113.73,50.06],[113.57,50.01],[113.45,49.94],[113.32,49.87],[113.16,49.8],[113.09,49.69],[113.06,49.62],[112.91,49.57],[112.81,49.52],[112.7,49.51],[112.49,49.53],[112.38,49.51],[112.08,49.42],[111.93,49.42],[111.83,49.4],[111.74,49.4],[111.57,49.38],[111.51,49.36],[111.43,49.34],[111.34,49.36],[111.2,49.3],[110.83,49.17],[110.71,49.14],[110.63,49.14],[110.53,49.19],[110.43,49.22],[110.32,49.22],[110.2,49.17],[109.99,49.21],[109.75,49.24],[109.53,49.27],[109.45,49.3],[109.24,49.33],[108.92,49.34],[108.73,49.34],[108.61,49.32],[108.52,49.34],[108.41,49.4],[108.21,49.52],[108.1,49.56],[108.03,49.59],[108.01,49.65],[107.97,49.65],[107.94,49.69],[107.94,49.74],[107.93,49.85],[107.95,49.92],[107.92,49.95],[107.79,49.96],[107.63,49.98],[107.35,49.99],[107.23,49.99],[107.14,50.03],[107.04,50.09],[106.94,50.2],[106.85,50.25],[106.71,50.31],[106.57,50.33],[106.37,50.32],[106.22,50.3],[106.08,50.33],[106.0,50.37],[105.88,50.41],[105.69,50.41],[105.54,50.44],[105.38,50.47],[105.27,50.46],[105.19,50.43],[105.09,50.39],[104.98,50.38],[104.69,50.34],[104.6,50.32],[104.47,50.31],[104.35,50.28],[104.26,50.21],[104.18,50.17],[104.08,50.15],[103.96,50.16],[103.86,50.17],[103.8,50.18],[103.72,50.15],[103.63,50.14],[103.5,50.16],[103.42,50.19],[103.3,50.2],[103.23,50.26],[103.16,50.29],[103.04,50.3],[102.86,50.33],[102.77,50.37],[102.68,50.39],[102.55,50.46],[102.47,50.53],[102.41,50.54],[102.34,50.54],[102.29,50.59],[102.29,50.63],[102.3,50.67],[102.32,50.72],[102.28,50.77],[102.24,50.79],[102.22,50.83],[102.23,50.9],[102.21,50.97],[102.19,51.05],[102.15,51.11],[102.14,51.22],[102.16,51.26],[102.16,51.31],[102.11,51.35],[101.98,51.38],[101.82,51.42],[101.57,51.47],[101.46,51.47],[101.38,51.45],[101.3,51.47],[101.22,51.51],[101.09,51.55],[100.9,51.6],[100.71,51.66],[100.54,51.71],[100.47,51.73],[100.23,51.73],[100.03,51.74],[99.92,51.76],[99.79,51.83],[99.72,51.87],[99.61,51.89],[99.53,51.9],[99.41,51.92],[99.18,52.0],[99.09,52.03],[99.03,52.04],[98.96,52.1],[98.89,52.12],[98.85,52.07],[98.8,51.96],[98.76,51.91],[98.64,51.8],[98.35,51.72],[98.3,51.67],[98.28,51.63],[98.24,51.58],[98.22,51.51],[98.18,51.49],[98.1,51.48],[98.04,51.45],[97.99,51.38],[97.95,51.35],[97.92,51.28],[97.93,51.25],[97.92,51.22],[97.91,51.17],[97.84,51.05],[97.83,50.99],[97.86,50.94],[97.92,50.89],[97.95,50.86],[97.96,50.82],[97.96,50.77],[98.0,50.7],[98.03,50.64],[98.08,50.6],[98.15,50.57],[98.22,50.56],[98.28,50.53],[98.29,50.49],[98.28,50.42],[98.25,50.3],[98.2,50.23],[98.17,50.18],[98.12,50.11],[98.1,50.08],[98.0,50.01],[97.94,50.0],[97.85,49.95],[97.79,49.94],[97.72,49.94],[97.65,49.93],[97.59,49.91],[97.54,49.84],[97.42,49.77],[97.36,49.74],[97.21,49.73],[97.14,49.76],[97.1,49.81],[97.05,49.83],[96.99,49.88],[96.71,49.91],[96.64,49.9],[96.6,49.88],[96.54,49.89],[96.51,49.92],[96.47,49.91],[96.38,49.9],[96.32,49.9],[96.23,49.95],[96.11,49.98],[96.07,50.0],[96.02,50.0],[95.99,49.97],[95.94,49.96],[95.9,49.99],[95.85,50.01],[95.79,50.01],[95.71,49.97],[95.57,49.94],[95.52,49.91],[95.44,49.92],[95.39,49.94],[95.33,49.94],[95.17,49.94],[95.11,49.94],[95.04,49.96],[95.01,50.01],[94.93,50.04],[94.81,50.05],[94.72,50.04],[94.68,50.03],[94.61,50.02],[94.56,50.09],[94.5,50.13],[94.46,50.17],[94.4,50.18],[94.35,50.22],[94.35,50.3],[94.32,50.4],[94.29,50.51],[94.25,50.56],[94.08,50.57],[93.99,50.57],[93.8,50.58],[93.66,50.58],[93.63,50.59],[93.5,50.6],[93.39,50.61],[93.27,50.62],[93.22,50.61],[93.1,50.6],[93.01,50.65],[92.97,50.71],[92.96,50.74],[92.94,50.78],[92.86,50.79],[92.78,50.78],[92.74,50.71],[92.68,50.68],[92.63,50.69],[92.58,50.73],[92.49,50.77],[92.43,50.8],[92.35,50.86],[92.3,50.85],[92.28,50.81],[92.27,50.78],[92.19,50.7],[92.1,50.69],[91.96,50.7],[91.8,50.69],[91.71,50.67],[91.63,50.62],[91.6,50.58],[91.52,50.56],[91.45,50.52],[91.42,50.47],[91.34,50.47],[91.3,50.46],[91.23,50.45],[91.06,50.42],[91.02,50.42],[90.92,50.36],[90.84,50.32],[90.76,50.31],[90.71,50.26],[90.66,50.22],[90.52,50.21],[90.36,50.17],[90.31,50.15],[90.22,50.12],[90.1,50.1],[90.05,50.09],[90.0,50.07],[89.98,49.98],[89.88,49.95],[89.74,49.95],[89.64,49.9],[89.63,49.82],[89.67,49.75],[89.65,49.72],[89.58,49.7],[89.48,49.66],[89.4,49.61],[89.3,49.61],[89.24,49.63],[89.2,49.6],[89.18,49.53],[89.11,49.5],[89.01,49.47],[88.97,49.48],[88.95,49.51],[88.9,49.54],[88.86,49.53],[88.86,49.48],[88.83,49.45],[88.75,49.45],[88.68,49.46],[88.63,49.49],[88.54,49.48],[88.45,49.47],[88.39,49.48],[88.34,49.47],[88.19,49.45],[88.14,49.38],[88.13,49.3],[88.12,49.26],[88.03,49.22],[87.99,49.19],[87.93,49.16],[87.82,49.16],[87.81,49.16],[87.76,49.17],[87.67,49.15],[87.58,49.13],[87.52,49.12],[87.48,49.09],[87.42,49.08],[87.32,49.09],[87.3,49.15],[87.23,49.22],[87.15,49.24],[87.07,49.25],[87.0,49.29],[86.95,49.32],[86.81,49.49],[86.71,49.56],[86.63,49.56],[86.61,49.61],[86.67,49.66],[86.73,49.7],[86.73,49.75],[86.68,49.78],[86.61,49.77],[86.52,49.71],[86.42,49.64],[86.29,49.59],[86.24,49.55],[86.18,49.5],[86.09,49.51],[86.03,49.5],[85.97,49.5],[85.93,49.55],[85.88,49.56],[85.5,49.61],[85.37,49.62],[85.29,49.6],[85.23,49.62],[85.21,49.66],[85.14,49.75],[85.08,49.82],[85.0,49.89],[84.98,49.95],[85.0,50.01],[84.99,50.06],[84.92,50.09],[84.84,50.09],[84.61,50.2],[84.5,50.22],[84.4,50.24],[84.32,50.24],[84.26,50.29],[84.19,50.44],[84.18,50.52],[84.1,50.6],[84.0,50.68],[83.95,50.77],[83.86,50.82],[83.72,50.89],[83.58,50.94],[83.36,50.99],[83.27,50.99],[83.16,50.99],[83.09,50.96],[83.02,50.9],[82.92,50.89],[82.76,50.89],[82.72,50.87],[82.69,50.83],[82.61,50.77],[82.49,50.73],[82.33,50.74],[82.21,50.72],[82.1,50.71],[81.93,50.77],[81.75,50.76],[81.63,50.74],[81.47,50.74],[81.43,50.77],[81.45,50.82],[81.44,50.87],[81.41,50.91],[81.39,50.96],[81.32,50.97],[81.12,50.95],[81.07,50.97],[81.08,51.01],[81.11,51.07],[81.14,51.15],[81.13,51.19],[81.03,51.19],[80.97,51.19],[80.93,51.24],[80.88,51.28],[80.81,51.28],[80.74,51.29],[80.65,51.28],[80.61,51.22],[80.55,51.22],[80.49,51.2],[80.45,51.18],[80.42,51.14],[80.43,51.09],[80.45,51.0],[80.42,50.95],[80.35,50.92],[80.27,50.92],[80.22,50.91],[80.13,50.86],[80.09,50.84],[80.07,50.81],[80.07,50.76],[79.99,50.77],[79.86,50.96],[79.72,51.16],[79.55,51.38],[79.47,51.49],[79.15,51.87],[78.99,52.05],[78.72,52.36],[78.48,52.64],[78.2,52.93],[78.03,53.09],[77.86,53.27],[77.8,53.32],[77.7,53.38],[77.47,53.5],[77.13,53.67],[76.82,53.82],[76.58,53.94],[76.51,53.99],[76.48,54.02],[76.46,54.06],[76.42,54.11],[76.42,54.15],[76.65,54.15],[76.7,54.18],[76.79,54.32],[76.84,54.44],[76.76,54.44],[76.62,54.39],[76.54,54.35],[76.5,54.34],[76.27,54.31],[76.14,54.26],[75.88,54.17],[75.69,54.11],[75.66,54.11],[75.44,54.09],[75.4,54.07],[75.39,54.02],[75.38,53.97],[75.22,53.89],[75.05,53.83],[74.99,53.82],[74.89,53.83],[74.83,53.83],[74.68,53.75],[74.45,53.65],[74.43,53.6],[74.43,53.55],[74.4,53.5],[74.35,53.49],[74.28,53.53],[74.21,53.58],[74.07,53.61],[73.86,53.62],[73.73,53.6],[73.64,53.58],[73.47,53.47],[73.41,53.45],[73.37,53.45],[73.36,53.51],[73.33,53.54],[73.29,53.6],[73.31,53.71],[73.4,53.81],[73.55,53.87],[73.68,53.93],[73.72,54.0],[73.71,54.04],[73.67,54.06],[73.62,54.07],[73.59,54.04],[73.51,54.0],[73.38,53.96],[73.28,53.96],[73.23,53.96],[73.12,53.98],[72.91,54.11],[72.74,54.12],[72.62,54.13],[72.58,54.12],[72.56,54.09],[72.58,54.06],[72.6,54.02],[72.59,54.0],[72.53,53.98],[72.45,53.94],[72.4,53.96],[72.38,54.05],[72.39,54.12],[72.33,54.18],[72.27,54.27],[72.19,54.33],[72.11,54.31],[72.07,54.23],[72.0,54.21],[71.89,54.22],[71.68,54.18],[71.34,54.16],[71.09,54.21],[71.05,54.26],[71.15,54.36],[71.16,54.46],[71.16,54.54],[71.19,54.6],[71.13,54.72],[70.99,54.95],[70.91,55.13],[70.79,55.26],[70.74,55.31],[70.49,55.28],[70.42,55.25],[70.37,55.21],[70.29,55.18],[70.18,55.16],[70.09,55.18],[69.98,55.2],[69.87,55.25],[69.74,55.31],[69.49,55.36],[69.25,55.37],[68.98,55.39],[68.84,55.36],[68.71,55.31],[68.52,55.2],[68.44,55.19],[68.3,55.19],[68.21,55.16],[68.23,55.12],[68.24,55.05],[68.21,55.0],[68.16,54.98],[68.07,54.96],[67.94,54.95],[67.83,54.94],[67.69,54.87],[67.48,54.85],[67.26,54.83],[67.1,54.79],[66.75,54.74],[66.56,54.72],[66.22,54.67],[65.95,54.66],[65.91,54.69],[65.71,54.62],[65.48,54.62],[65.43,54.59],[65.38,54.56],[65.32,54.55],[65.24,54.52],[65.19,54.44],[65.16,54.36],[65.09,54.34],[65.0,54.37],[64.93,54.4],[64.81,54.37],[64.65,54.35],[64.53,54.36],[64.46,54.38],[64.2,54.35],[64.06,54.3],[64.04,54.28],[64.0,54.27],[63.85,54.24],[63.72,54.25],[63.7,54.24],[63.58,54.22],[63.41,54.18],[63.29,54.17],[63.19,54.17],[63.13,54.14],[63.07,54.11],[62.63,54.07],[62.59,54.04],[62.5,54.01],[62.04,54.0],[62.0,53.98],[61.99,53.95],[61.93,53.95],[61.6,53.99],[61.33,54.05],[61.23,54.02],[61.14,53.96],[61.11,53.88],[61.11,53.81],[61.11,53.75],[61.07,53.71],[60.99,53.66],[60.98,53.62],[61.1,53.58],[61.25,53.55],[61.34,53.57],[61.41,53.59],[61.47,53.58],[61.52,53.55],[61.53,53.52],[61.53,53.5],[61.5,53.48],[61.4,53.46],[61.31,53.47],[61.23,53.45],[61.19,53.41],[61.16,53.34],[61.2,53.29],[61.31,53.28],[61.44,53.24],[61.58,53.22],[61.66,53.23],[61.77,53.17],[62.01,53.11],[62.08,53.06],[62.08,53.01],[62.04,52.97],[61.97,52.94],[61.89,52.96],[61.72,52.97],[61.53,52.98],[61.4,53.0],[61.21,52.99],[61.05,52.97],[61.01,52.93],[60.94,52.86],[60.89,52.82],[60.8,52.74],[60.77,52.68],[60.82,52.57],[60.98,52.39],[60.99,52.34],[60.94,52.28],[60.83,52.23],[60.67,52.15],[60.5,52.15],[60.43,52.13],[60.23,52.02],[60.07,51.98],[60.03,51.93],[60.07,51.89],[60.28,51.83],[60.39,51.77],[60.42,51.7],[60.46,51.65],[60.63,51.62],[60.97,51.54],[60.99,51.53],[61.01,51.49],[61.36,51.44],[61.41,51.41],[61.55,51.32],[61.59,51.23],[61.51,51.14],[61.47,50.99],[61.39,50.86],[61.23,50.77],[60.94,50.7],[60.64,50.66],[60.51,50.67],[60.42,50.68],[60.29,50.7],[60.19,50.77],[60.11,50.83],[60.06,50.85],[60.01,50.84],[59.96,50.8],[59.89,50.69],[59.81,50.58],[59.75,50.54],[59.52,50.49],[59.5,50.51],[59.52,50.58],[59.5,50.6],[59.45,50.62],[59.17,50.65],[59.06,50.67],[58.98,50.68],[58.88,50.69],[58.81,50.74],[58.66,50.87],[58.55,50.97],[58.36,51.06],[58.19,51.08],[58.17,51.07],[58.05,51.07],[57.84,51.09],[57.83,51.09],[57.76,51.05],[57.72,50.98],[57.65,50.93],[57.56,50.9],[57.44,50.89],[57.31,50.95],[57.18,51.04],[57.01,51.07],[56.85,51.05],[56.79,51.03],[56.62,50.98],[56.57,51.0],[56.49,51.02],[56.33,50.94],[56.14,50.84],[56.1,50.78],[56.05,50.71],[55.93,50.65],[55.8,50.6],[55.69,50.58],[55.54,50.6],[55.36,50.67],[55.2,50.74],[55.01,50.87],[54.87,50.94],[54.73,51.0],[54.64,51.01],[54.57,50.99],[54.55,50.95],[54.57,50.91],[54.61,50.88],[54.64,50.78],[54.65,50.66],[54.64,50.59],[54.6,50.55],[54.56,50.54],[54.52,50.54],[54.47,50.58],[54.44,50.67],[54.42,50.78],[54.3,50.91],[54.19,51.0],[54.14,51.04],[54.04,51.12],[53.96,51.16],[53.78,51.21],[53.69,51.25],[53.53,51.4],[53.45,51.44],[53.34,51.48],[53.25,51.49],[53.23,51.48],[53.04,51.46],[52.9,51.47],[52.82,51.49],[52.74,51.5],[52.73,51.5],[52.64,51.48],[52.62,51.48],[52.57,51.48],[52.5,51.51],[52.42,51.59],[52.33,51.68],[52.22,51.71],[52.01,51.67],[51.78,51.55],[51.61,51.48],[51.47,51.48],[51.4,51.47],[51.34,51.48],[51.3,51.5],[51.29,51.54],[51.27,51.59],[51.16,51.65],[51.02,51.68],[50.88,51.72],[50.79,51.73],[50.76,51.68],[50.64,51.59],[50.52,51.51],[50.35,51.37],[50.31,51.32],[50.25,51.29],[50.1,51.25],[49.93,51.2],[49.82,51.13],[49.67,51.1],[49.5,51.08],[49.42,51.03],[49.38,50.93],[49.32,50.85],[49.06,50.73],[48.91,50.64],[48.81,50.6],[48.73,50.61],[48.66,50.62],[48.63,50.61],[48.67,50.55],[48.7,50.35],[48.75,50.23],[48.78,50.16],[48.82,50.1],[48.84,50.01],[48.81,49.96],[48.76,49.93],[48.6,49.87],[48.43,49.83],[48.33,49.86],[48.22,49.93],[48.18,49.97],[48.06,50.09],[47.85,50.28],[47.71,50.38],[47.6,50.41],[47.5,50.4],[47.43,50.36],[47.38,50.32],[47.33,50.27],[47.29,50.22],[47.3,50.14],[47.3,50.06],[47.25,50.0],[47.13,49.94],[46.99,49.85],[46.89,49.7],[46.82,49.5],[46.8,49.37],[46.85,49.3],[46.95,49.25],[47.02,49.2],[47.03,49.15],[47.01,49.1],[46.96,49.04],[46.85,48.97],[46.7,48.81],[46.61,48.57],[46.66,48.41],[46.85,48.32],[47.0,48.28],[47.06,48.23],[47.12,48.13],[47.11,48.02],[47.09,47.95],[47.13,47.88],[47.2,47.79],[47.29,47.74],[47.39,47.77],[47.48,47.8],[47.6,47.79],[47.93,47.76],[48.11,47.75],[48.17,47.71],[48.28,47.59],[48.41,47.46],[48.55,47.32],[48.6,47.26],[48.71,47.1],[48.83,46.95],[48.96,46.77],[48.95,46.73],[48.88,46.71],[48.78,46.71],[48.69,46.74],[48.65,46.76],[48.61,46.77],[48.56,46.76],[48.52,46.73],[48.5,46.7],[48.51,46.65],[48.54,46.61],[48.59,46.58],[48.61,46.57],[48.77,46.51],[48.96,46.44],[49.18,46.35],[49.23,46.34],[49.25,46.29],[49.13,46.28],[49.11,46.23],[49.08,46.19],[48.81,46.1],[48.74,46.1],[48.68,46.09],[48.69,46.03],[48.7,45.98],[48.75,45.92],[48.73,45.9],[48.69,45.89],[48.64,45.91],[48.59,45.93],[48.54,45.94],[48.49,45.93],[48.26,45.78],[48.16,45.74],[48.05,45.72],[47.83,45.66],[47.76,45.67],[47.7,45.69],[47.65,45.66],[47.63,45.58],[47.57,45.63],[47.51,45.67],[47.48,45.69],[47.46,45.68],[47.52,45.6],[47.53,45.53],[47.51,45.49],[47.49,45.46],[47.45,45.43],[47.41,45.42],[47.39,45.29],[47.35,45.22],[47.3,45.15],[47.22,45.02],[47.16,44.97],[47.11,44.91],[47.08,44.82],[47.04,44.84],[47.0,44.88],[46.98,44.83],[46.96,44.78],[46.84,44.72],[46.76,44.66],[46.72,44.56],[46.71,44.5],[46.72,44.45],[46.75,44.42],[46.92,44.39],[47.02,44.34],[47.12,44.26],[47.23,44.19],[47.31,44.1],[47.36,43.99],[47.43,43.78],[47.46,43.56],[47.56,43.83],[47.65,43.88],[47.63,43.81],[47.57,43.68],[47.51,43.51],[47.49,43.38],[47.51,43.27],[47.51,43.22],[47.46,43.04],[47.49,43.0],[47.53,42.97],[47.63,42.9],[47.71,42.81],[47.73,42.68],[47.77,42.64],[47.82,42.61],[48.08,42.35],[48.23,42.18],[48.3,42.08],[48.38,41.95],[48.43,41.92],[48.48,41.91],[48.57,41.84]],[[20.9,55.29],[20.96,55.28],[20.86,55.18],[20.59,54.98],[20.68,54.96],[20.77,54.95],[20.89,54.91],[21.0,54.9],[21.19,54.94],[21.22,55.11],[21.24,55.26],[21.3,55.26],[21.39,55.28],[21.45,55.23],[21.55,55.2],[21.68,55.16],[21.87,55.1],[22.07,55.06],[22.14,55.06],[22.35,55.06],[22.57,55.06],[22.63,54.97],[22.74,54.93],[22.82,54.87],[22.83,54.84],[22.71,54.63],[22.68,54.56],[22.68,54.49],[22.72,54.41],[22.77,54.36],[22.73,54.35],[22.17,54.36],[21.63,54.38],[21.14,54.39],[20.66,54.41],[20.21,54.42],[19.92,54.43],[19.64,54.45],[19.6,54.46],[19.76,54.54],[19.86,54.63],[19.94,54.75],[19.95,54.83],[19.97,54.92],[20.11,54.96],[20.4,54.95],[20.52,54.99],[20.68,55.1],[20.85,55.23],[20.9,55.29]],[[146.05,43.41],[146.03,43.41],[146.03,43.42],[146.05,43.43],[146.09,43.45],[146.1,43.44],[146.09,43.43],[146.07,43.42],[146.05,43.41]],[[145.88,43.46],[145.9,43.45],[145.91,43.46],[145.93,43.46],[145.94,43.45],[145.94,43.43],[145.93,43.43],[145.91,43.42],[145.89,43.42],[145.89,43.43],[145.88,43.44],[145.87,43.45],[145.87,43.46],[145.88,43.46]],[[146.36,43.63],[146.33,43.62],[146.29,43.63],[146.27,43.63],[146.28,43.64],[146.31,43.65],[146.33,43.65],[146.35,43.64],[146.36,43.63]],[[146.71,43.74],[146.68,43.72],[146.61,43.74],[146.61,43.8],[146.62,43.81],[146.82,43.86],[146.88,43.83],[146.9,43.8],[146.71,43.74]],[[146.21,44.5],[146.36,44.42],[146.57,44.44],[146.52,44.37],[146.44,44.38],[146.3,44.28],[146.17,44.27],[146.11,44.25],[145.91,44.1],[145.89,44.05],[145.77,43.94],[145.59,43.85],[145.56,43.66],[145.44,43.74],[145.43,43.81],[145.46,43.87],[145.67,44.0],[145.75,44.07],[145.77,44.13],[145.85,44.19],[145.89,44.25],[145.94,44.27],[146.11,44.5],[146.21,44.5]],[[148.6,45.32],[148.41,45.25],[148.26,45.22],[148.01,45.07],[147.91,44.99],[147.78,44.96],[147.66,44.98],[147.62,44.94],[147.61,44.89],[147.56,44.84],[147.31,44.68],[147.21,44.55],[147.1,44.53],[146.9,44.4],[146.93,44.51],[146.97,44.57],[147.14,44.66],[147.15,44.77],[147.25,44.86],[147.43,44.95],[147.56,45.06],[147.66,45.09],[147.77,45.19],[147.89,45.23],[147.87,45.3],[147.92,45.38],[147.96,45.38],[148.06,45.26],[148.13,45.26],[148.32,45.28],[148.61,45.48],[148.71,45.52],[148.77,45.53],[148.81,45.51],[148.83,45.49],[148.83,45.46],[148.8,45.41],[148.84,45.36],[148.79,45.32],[148.6,45.32]],[[47.98,45.49],[47.97,45.47],[47.92,45.56],[47.92,45.62],[47.95,45.65],[47.99,45.55],[47.98,45.49]],[[149.69,45.64],[149.54,45.59],[149.45,45.59],[149.67,45.84],[149.8,45.88],[149.96,46.02],[150.31,46.2],[150.35,46.21],[150.55,46.21],[150.23,46.01],[150.2,45.93],[150.06,45.85],[149.95,45.82],[149.88,45.78],[149.69,45.64]],[[35.0,45.73],[35.02,45.7],[35.26,45.45],[35.37,45.35],[35.46,45.32],[35.56,45.31],[35.75,45.39],[35.83,45.4],[36.01,45.37],[36.08,45.42],[36.17,45.45],[36.29,45.46],[36.43,45.43],[36.58,45.39],[36.51,45.3],[36.45,45.23],[36.43,45.15],[36.39,45.07],[36.23,45.03],[36.05,45.03],[35.87,45.01],[35.8,45.04],[35.76,45.07],[35.68,45.1],[35.57,45.12],[35.47,45.1],[35.36,44.98],[35.15,44.9],[35.09,44.8],[34.89,44.82],[34.72,44.81],[34.47,44.72],[34.28,44.54],[34.07,44.42],[33.91,44.39],[33.76,44.4],[33.66,44.43],[33.45,44.55],[33.46,44.6],[33.49,44.62],[33.53,44.68],[33.61,44.91],[33.6,44.98],[33.56,45.1],[33.39,45.19],[33.26,45.17],[33.19,45.19],[32.92,45.35],[32.77,45.36],[32.61,45.33],[32.55,45.35],[32.51,45.4],[32.83,45.59],[33.14,45.75],[33.28,45.77],[33.47,45.84],[33.66,45.95],[33.64,46.03],[33.59,46.1],[33.65,46.15],[33.66,46.22],[33.81,46.21],[34.03,46.11],[34.13,46.09],[34.22,46.1],[34.35,46.06],[34.45,45.97],[34.52,45.98],[34.69,45.98],[34.79,45.89],[34.8,45.79],[34.95,45.73],[35.0,45.73]],[[152.0,46.9],[151.82,46.79],[151.75,46.79],[151.72,46.83],[151.72,46.85],[151.86,46.87],[152.04,47.01],[152.17,47.11],[152.23,47.14],[152.29,47.14],[152.0,46.9]],[[153.1,47.76],[153.05,47.71],[153.0,47.71],[152.98,47.73],[153.05,47.8],[153.08,47.81],[153.1,47.76]],[[154.08,48.79],[154.04,48.74],[154.0,48.76],[153.99,48.77],[154.09,48.83],[154.13,48.9],[154.2,48.9],[154.23,48.89],[154.2,48.86],[154.08,48.79]],[[154.81,49.31],[154.71,49.27],[154.61,49.29],[154.61,49.38],[154.82,49.65],[154.9,49.63],[154.88,49.57],[154.8,49.47],[154.83,49.35],[154.81,49.31]],[[155.92,50.3],[155.79,50.2],[155.61,50.18],[155.52,50.15],[155.45,50.08],[155.4,50.04],[155.29,50.06],[155.24,50.09],[155.24,50.21],[155.2,50.26],[155.22,50.3],[155.33,50.29],[155.43,50.37],[155.68,50.4],[155.77,50.48],[155.88,50.68],[156.0,50.76],[156.1,50.77],[156.12,50.67],[156.1,50.56],[156.04,50.45],[155.92,50.3]],[[156.41,50.66],[156.37,50.63],[156.33,50.64],[156.2,50.7],[156.17,50.73],[156.21,50.78],[156.38,50.86],[156.46,50.86],[156.49,50.84],[156.48,50.75],[156.41,50.66]],[[155.64,50.82],[155.55,50.81],[155.51,50.84],[155.48,50.87],[155.47,50.91],[155.57,50.93],[155.64,50.91],[155.65,50.85],[155.64,50.82]],[[142.76,54.39],[142.98,54.14],[142.99,54.09],[142.97,54.03],[142.93,53.96],[142.91,53.88],[142.94,53.81],[142.92,53.79],[143.1,53.49],[143.22,53.3],[143.26,53.22],[143.29,53.13],[143.32,52.96],[143.33,52.7],[143.32,52.61],[143.3,52.53],[143.26,52.48],[143.2,52.44],[143.17,52.35],[143.16,52.08],[143.19,51.94],[143.25,51.85],[143.29,51.74],[143.3,51.63],[143.32,51.58],[143.42,51.52],[143.46,51.47],[143.47,51.4],[143.47,51.3],[143.49,51.28],[143.53,51.25],[143.74,50.51],[143.82,50.28],[144.05,49.9],[144.14,49.66],[144.2,49.55],[144.24,49.43],[144.27,49.31],[144.34,49.18],[144.43,49.05],[144.61,48.94],[144.69,48.87],[144.71,48.82],[144.71,48.64],[144.67,48.68],[144.62,48.81],[144.54,48.89],[144.41,48.99],[144.28,49.07],[144.13,49.21],[144.05,49.25],[143.97,49.28],[143.82,49.31],[143.73,49.31],[143.38,49.29],[143.24,49.26],[143.1,49.2],[143.03,49.11],[142.97,48.92],[142.65,48.25],[142.57,48.07],[142.55,47.88],[142.56,47.74],[142.58,47.68],[142.67,47.54],[142.75,47.45],[142.8,47.42],[142.86,47.39],[142.91,47.36],[142.94,47.32],[143.01,47.22],[143.09,47.0],[143.18,46.84],[143.22,46.79],[143.32,46.81],[143.38,46.81],[143.45,46.79],[143.49,46.75],[143.54,46.58],[143.58,46.41],[143.58,46.36],[143.51,46.23],[143.49,46.17],[143.48,46.12],[143.46,46.07],[143.43,46.03],[143.42,46.22],[143.37,46.36],[143.35,46.48],[143.28,46.56],[143.05,46.59],[142.83,46.61],[142.8,46.62],[142.75,46.67],[142.69,46.71],[142.64,46.72],[142.58,46.7],[142.48,46.64],[142.41,46.55],[142.35,46.46],[142.3,46.36],[142.21,46.09],[142.15,46.0],[142.08,45.92],[142.02,45.96],[141.96,46.01],[141.93,46.09],[141.92,46.17],[141.83,46.45],[141.87,46.69],[142.01,47.03],[142.04,47.14],[142.02,47.24],[141.98,47.35],[141.96,47.54],[141.96,47.59],[142.02,47.7],[142.08,47.81],[142.15,47.9],[142.18,48.01],[142.14,48.29],[142.03,48.48],[141.9,48.65],[141.87,48.7],[141.87,48.75],[141.98,48.97],[142.02,49.08],[142.07,49.31],[142.11,49.44],[142.14,49.57],[142.15,50.22],[142.14,50.31],[142.07,50.51],[142.07,50.63],[142.1,50.78],[142.15,50.89],[142.21,51.0],[142.21,51.22],[142.09,51.43],[142.01,51.52],[141.87,51.63],[141.77,51.69],[141.72,51.74],[141.77,51.75],[141.81,51.79],[141.72,51.85],[141.67,51.93],[141.66,52.27],[141.68,52.36],[141.75,52.45],[141.8,52.56],[141.86,52.79],[141.87,53.04],[141.84,53.14],[141.82,53.34],[141.85,53.39],[141.96,53.46],[142.14,53.5],[142.18,53.48],[142.32,53.41],[142.37,53.4],[142.42,53.41],[142.53,53.45],[142.58,53.54],[142.51,53.59],[142.55,53.65],[142.68,53.67],[142.69,53.73],[142.64,53.74],[142.68,53.82],[142.71,53.9],[142.67,53.97],[142.47,54.15],[142.33,54.28],[142.55,54.28],[142.62,54.3],[142.67,54.36],[142.69,54.42],[142.76,54.39]],[[168.04,54.56],[168.08,54.51],[167.68,54.7],[167.49,54.79],[167.44,54.86],[167.51,54.86],[167.59,54.8],[167.71,54.77],[167.88,54.69],[168.04,54.56]],[[137.18,55.1],[137.06,54.93],[136.97,54.92],[136.9,54.96],[136.77,54.95],[136.71,54.96],[136.8,55.01],[137.0,55.09],[137.08,55.09],[137.16,55.11],[137.18,55.1]],[[137.94,55.09],[138.03,55.05],[138.17,55.06],[138.21,55.03],[138.1,54.99],[138.02,54.9],[137.99,54.82],[137.96,54.79],[137.87,54.75],[137.79,54.7],[137.72,54.66],[137.66,54.65],[137.53,54.83],[137.46,54.87],[137.28,54.79],[137.23,54.79],[137.28,54.89],[137.38,55.0],[137.44,55.02],[137.54,55.16],[137.58,55.2],[137.91,55.11],[137.94,55.09]],[[166.65,54.84],[166.65,54.69],[166.52,54.77],[166.46,54.83],[166.38,54.84],[166.32,54.86],[166.23,54.94],[166.12,55.03],[166.08,55.08],[166.07,55.14],[165.99,55.19],[165.75,55.29],[165.83,55.31],[165.93,55.35],[166.21,55.32],[166.28,55.31],[166.23,55.24],[166.25,55.17],[166.4,55.01],[166.48,54.95],[166.58,54.91],[166.65,54.84]],[[150.59,59.02],[150.51,59.01],[150.47,59.03],[150.47,59.05],[150.59,59.1],[150.67,59.16],[150.71,59.12],[150.73,59.1],[150.59,59.02]],[[163.64,58.6],[163.47,58.51],[163.45,58.52],[163.43,58.55],[163.43,58.58],[163.58,58.64],[163.73,58.8],[163.78,58.93],[163.77,58.97],[163.76,59.02],[164.2,59.1],[164.52,59.23],[164.57,59.22],[164.63,59.11],[164.66,58.97],[164.62,58.89],[164.28,58.84],[163.96,58.74],[163.64,58.6]],[[35.82,65.18],[35.85,65.14],[35.86,65.08],[35.83,65.04],[35.84,65.0],[35.78,64.98],[35.68,65.06],[35.62,65.06],[35.56,65.09],[35.53,65.15],[35.59,65.17],[35.61,65.16],[35.73,65.2],[35.82,65.18]],[[70.02,66.5],[69.84,66.49],[69.65,66.57],[69.47,66.72],[69.5,66.75],[69.62,66.74],[69.8,66.74],[69.92,66.71],[70.08,66.7],[70.06,66.63],[70.06,66.6],[70.11,66.57],[70.06,66.52],[70.02,66.5]],[[42.71,66.7],[42.68,66.69],[42.48,66.74],[42.46,66.77],[42.47,66.79],[42.55,66.8],[42.63,66.78],[42.69,66.74],[42.71,66.7]],[[-179.8,68.94],[-179.6,68.91],[-179.51,68.92],[-179.47,68.91],[-179.36,68.85],[-179.28,68.83],[-178.87,68.75],[-178.69,68.68],[-178.54,68.59],[-178.61,68.6],[-178.75,68.66],[-178.74,68.59],[-178.69,68.55],[-178.47,68.5],[-178.24,68.47],[-178.1,68.42],[-178.05,68.39],[-178.02,68.32],[-178.06,68.26],[-177.92,68.29],[-177.8,68.34],[-177.86,68.38],[-178.28,68.52],[-178.37,68.57],[-178.25,68.54],[-177.68,68.36],[-177.53,68.29],[-177.59,68.28],[-177.64,68.24],[-177.59,68.22],[-177.52,68.24],[-177.41,68.25],[-177.3,68.22],[-177.17,68.17],[-176.91,68.12],[-175.35,67.68],[-175.31,67.6],[-175.27,67.57],[-175.24,67.52],[-175.23,67.45],[-175.37,67.36],[-175.16,67.37],[-175.12,67.38],[-175.07,67.41],[-175.0,67.44],[-174.92,67.41],[-174.85,67.35],[-174.87,67.27],[-174.93,67.2],[-174.94,67.09],[-174.89,67.0],[-174.83,66.96],[-174.78,66.92],[-174.77,66.78],[-174.87,66.72],[-174.92,66.62],[-174.86,66.61],[-174.67,66.6],[-174.61,66.59],[-174.5,66.54],[-174.48,66.49],[-174.45,66.43],[-174.42,66.37],[-174.39,66.34],[-174.37,66.35],[-174.26,66.43],[-174.21,66.45],[-174.08,66.47],[-174.02,66.38],[-174.07,66.23],[-174.03,66.23],[-173.99,66.25],[-173.96,66.29],[-173.9,66.31],[-173.83,66.37],[-173.77,66.43],[-173.84,66.49],[-173.92,66.52],[-174.1,66.54],[-174.2,66.58],[-174.23,66.63],[-174.14,66.65],[-174.06,66.69],[-174.01,66.78],[-174.02,66.83],[-174.04,66.88],[-174.09,66.94],[-174.15,66.98],[-174.28,67.0],[-174.34,67.04],[-174.43,67.04],[-174.52,67.05],[-174.55,67.06],[-174.55,67.09],[-174.45,67.1],[-173.88,67.11],[-173.68,67.14],[-173.59,67.13],[-173.49,67.11],[-173.16,67.07],[-173.17,67.05],[-173.22,67.04],[-173.32,66.95],[-173.34,66.91],[-173.35,66.85],[-173.26,66.84],[-173.18,66.86],[-173.22,66.91],[-173.23,66.97],[-173.19,66.99],[-173.15,67.0],[-173.06,66.96],[-172.96,66.94],[-172.64,66.92],[-172.55,66.93],[-172.52,66.95],[-172.58,66.98],[-173.0,67.03],[-173.01,67.06],[-172.62,67.03],[-172.45,66.99],[-172.27,66.97],[-172.03,66.97],[-171.8,66.93],[-171.57,66.82],[-171.36,66.68],[-171.15,66.59],[-170.93,66.53],[-170.56,66.36],[-170.51,66.34],[-170.47,66.32],[-170.54,66.29],[-170.6,66.25],[-170.48,66.28],[-170.36,66.3],[-170.3,66.29],[-170.25,66.27],[-170.21,66.24],[-170.19,66.2],[-170.24,66.17],[-169.89,66.16],[-169.78,66.14],[-169.73,66.06],[-169.83,66.0],[-169.89,66.01],[-169.95,66.03],[-170.0,66.03],[-170.16,66.01],[-170.4,65.93],[-170.54,65.87],[-170.56,65.82],[-170.54,65.71],[-170.56,65.66],[-170.67,65.62],[-170.9,65.64],[-171.0,65.66],[-171.12,65.7],[-171.23,65.74],[-171.38,65.8],[-171.42,65.81],[-171.45,65.79],[-171.4,65.75],[-171.3,65.7],[-171.13,65.63],[-171.05,65.55],[-171.11,65.51],[-171.17,65.5],[-171.22,65.5],[-171.36,65.53],[-171.47,65.53],[-171.79,65.51],[-171.91,65.5],[-171.95,65.51],[-171.96,65.54],[-172.13,65.57],[-172.23,65.57],[-172.28,65.58],[-172.32,65.62],[-172.44,65.67],[-172.61,65.69],[-172.72,65.69],[-172.78,65.68],[-172.56,65.61],[-172.35,65.5],[-172.39,65.47],[-172.42,65.45],[-172.31,65.45],[-172.23,65.46],[-172.21,65.43],[-172.27,65.3],[-172.31,65.28],[-172.66,65.25],[-172.57,65.23],[-172.48,65.22],[-172.38,65.23],[-172.29,65.21],[-172.22,65.13],[-172.21,65.05],[-172.3,65.0],[-172.4,64.96],[-172.59,64.91],[-172.79,64.88],[-172.9,64.89],[-173.0,64.88],[-173.07,64.85],[-173.09,64.82],[-173.0,64.84],[-172.9,64.83],[-172.8,64.79],[-172.81,64.76],[-172.9,64.73],[-172.92,64.7],[-172.89,64.66],[-172.9,64.63],[-172.85,64.61],[-172.75,64.6],[-172.62,64.58],[-172.49,64.54],[-172.44,64.52],[-172.39,64.47],[-172.38,64.43],[-172.4,64.41],[-172.69,64.41],[-172.74,64.41],[-172.76,64.46],[-172.79,64.5],[-172.9,64.53],[-172.95,64.51],[-172.92,64.37],[-172.96,64.33],[-173.01,64.3],[-173.16,64.28],[-173.28,64.29],[-173.38,64.35],[-173.38,64.41],[-173.31,64.44],[-173.31,64.49],[-173.33,64.54],[-173.4,64.48],[-173.47,64.43],[-173.6,64.37],[-173.67,64.36],[-173.73,64.36],[-173.9,64.41],[-174.0,64.45],[-174.2,64.58],[-174.32,64.64],[-174.57,64.72],[-174.83,64.78],[-175.04,64.81],[-175.15,64.81],[-175.26,64.79],[-175.4,64.8],[-175.44,64.82],[-175.48,64.85],[-175.52,64.87],[-175.72,64.95],[-175.85,65.01],[-175.86,65.05],[-175.83,65.11],[-175.86,65.23],[-175.92,65.35],[-176.09,65.47],[-176.55,65.55],[-176.92,65.6],[-177.06,65.61],[-177.18,65.6],[-177.49,65.5],[-177.7,65.49],[-178.31,65.48],[-178.41,65.5],[-178.5,65.54],[-178.53,65.59],[-178.5,65.7],[-178.5,65.74],[-178.53,65.76],[-178.56,65.75],[-178.68,65.8],[-178.79,65.86],[-178.88,65.94],[-178.94,66.03],[-178.86,66.04],[-178.75,66.01],[-178.73,66.04],[-178.69,66.12],[-178.62,66.17],[-178.59,66.2],[-178.53,66.32],[-178.53,66.4],[-178.62,66.36],[-178.75,66.24],[-178.82,66.2],[-178.87,66.19],[-178.92,66.18],[-179.03,66.2],[-179.11,66.23],[-179.11,66.35],[-179.14,66.38],[-179.18,66.35],[-179.19,66.31],[-179.29,66.31],[-179.34,66.29],[-179.32,66.22],[-179.33,66.16],[-179.42,66.14],[-179.62,66.13],[-179.68,66.18],[-179.74,66.11],[-179.78,66.02],[-179.79,65.9],[-179.73,65.8],[-179.64,65.76],[-179.45,65.69],[-179.37,65.64],[-179.34,65.58],[-179.35,65.52],[-179.45,65.45],[-179.52,65.39],[-179.64,65.24],[-179.7,65.19],[-180.0,65.07],[-180.0,65.31],[-180.0,65.56],[-180.0,65.8],[-180.0,66.05],[-180.0,66.29],[-180.0,66.54],[-180.0,66.78],[-180.0,67.03],[-180.0,67.27],[-180.0,67.51],[-180.0,67.76],[-180.0,68.0],[-180.0,68.25],[-180.0,68.49],[-180.0,68.74],[-180.0,68.98],[-179.8,68.94]],[[50.27,69.19],[50.28,69.09],[50.22,69.05],[50.16,69.04],[50.14,69.1],[50.09,69.13],[49.92,69.05],[49.84,68.97],[49.63,68.86],[49.18,68.78],[48.91,68.74],[48.67,68.73],[48.44,68.8],[48.32,68.94],[48.29,68.98],[48.28,69.04],[48.28,69.1],[48.3,69.18],[48.32,69.27],[48.41,69.35],[48.63,69.44],[48.84,69.49],[48.95,69.51],[49.23,69.51],[50.0,69.31],[50.17,69.26],[50.27,69.19]],[[67.34,69.53],[67.26,69.44],[67.1,69.45],[67.05,69.47],[67.03,69.48],[67.22,69.58],[67.33,69.57],[67.34,69.53]],[[161.47,68.9],[161.42,68.9],[161.46,68.97],[161.46,69.0],[161.36,69.04],[161.18,69.08],[161.14,69.11],[161.13,69.2],[161.16,69.33],[161.08,69.41],[161.11,69.47],[161.32,69.54],[161.41,69.6],[161.51,69.64],[161.52,69.63],[161.62,69.59],[161.61,69.5],[161.54,69.44],[161.37,69.41],[161.35,69.37],[161.37,69.29],[161.38,69.19],[161.39,69.11],[161.49,69.02],[161.52,68.97],[161.51,68.93],[161.47,68.9]],[[169.2,69.58],[168.92,69.57],[168.35,69.66],[168.14,69.71],[167.99,69.78],[167.82,69.82],[167.79,69.84],[167.81,69.87],[167.86,69.9],[168.06,69.97],[168.2,70.01],[168.36,70.02],[169.37,69.88],[169.42,69.86],[169.43,69.83],[169.42,69.78],[169.33,69.77],[169.3,69.73],[169.26,69.63],[169.25,69.6],[169.2,69.58]],[[60.45,69.93],[60.48,69.89],[60.48,69.79],[60.44,69.73],[60.33,69.72],[60.22,69.69],[60.03,69.72],[59.92,69.7],[59.81,69.7],[59.72,69.71],[59.64,69.72],[59.58,69.74],[59.58,69.79],[59.5,69.87],[59.38,69.89],[59.27,69.9],[59.14,69.92],[59.08,69.91],[59.0,69.88],[58.95,69.89],[58.68,70.05],[58.63,70.09],[58.61,70.13],[58.57,70.16],[58.47,70.27],[58.52,70.32],[58.62,70.35],[58.68,70.36],[58.79,70.43],[59.01,70.47],[59.05,70.46],[59.09,70.44],[59.31,70.36],[59.43,70.31],[59.53,70.25],[59.64,70.2],[59.96,70.11],[60.17,70.02],[60.39,69.96],[60.45,69.93]],[[66.56,70.54],[66.57,70.5],[66.52,70.51],[66.45,70.56],[66.41,70.62],[66.39,70.73],[66.42,70.76],[66.44,70.77],[66.46,70.77],[66.46,70.7],[66.56,70.54]],[[160.72,70.82],[160.65,70.81],[160.5,70.82],[160.44,70.85],[160.44,70.92],[160.45,70.93],[160.57,70.92],[160.64,70.88],[160.72,70.82]],[[52.9,71.36],[52.99,71.29],[53.07,71.24],[53.14,71.24],[53.19,71.22],[53.21,71.16],[53.07,71.07],[53.05,71.03],[53.11,71.0],[53.12,70.98],[53.02,70.97],[53.0,71.01],[52.95,71.05],[52.84,71.09],[52.79,71.11],[52.74,71.18],[52.55,71.25],[52.43,71.24],[52.29,71.27],[52.25,71.28],[52.24,71.33],[52.3,71.36],[52.51,71.39],[52.62,71.38],[52.73,71.36],[52.72,71.39],[52.73,71.4],[52.78,71.4],[52.9,71.36]],[[178.86,70.83],[178.79,70.82],[178.65,71.0],[178.63,71.05],[178.68,71.11],[178.83,71.18],[178.89,71.23],[179.24,71.32],[179.55,71.45],[179.72,71.47],[179.89,71.52],[180.0,71.54],[180.0,70.99],[179.88,70.98],[179.65,70.9],[179.15,70.88],[178.86,70.83]],[[137.96,71.51],[137.71,71.42],[137.61,71.43],[137.51,71.47],[137.46,71.48],[137.4,71.48],[137.34,71.46],[137.27,71.46],[137.08,71.5],[137.06,71.53],[137.08,71.54],[137.13,71.56],[137.17,71.56],[137.28,71.58],[137.82,71.59],[137.86,71.58],[137.93,71.54],[137.96,71.51]],[[-178.88,71.58],[-178.44,71.54],[-178.35,71.53],[-178.21,71.48],[-178.13,71.47],[-178.06,71.44],[-177.97,71.39],[-177.82,71.34],[-177.58,71.28],[-177.53,71.26],[-177.5,71.22],[-177.52,71.17],[-177.82,71.07],[-178.06,71.04],[-178.53,71.01],[-179.16,70.94],[-179.42,70.92],[-179.51,70.92],[-179.73,70.97],[-180.0,70.99],[-180.0,71.18],[-180.0,71.4],[-180.0,71.54],[-179.84,71.55],[-179.69,71.58],[-179.55,71.58],[-179.4,71.57],[-179.26,71.57],[-179.11,71.6],[-178.99,71.59],[-178.88,71.58]],[[77.63,72.29],[77.15,72.28],[76.91,72.3],[76.87,72.32],[76.9,72.37],[77.15,72.44],[77.26,72.49],[77.38,72.57],[77.58,72.63],[77.75,72.63],[78.28,72.55],[78.35,72.5],[78.37,72.48],[78.15,72.42],[78.01,72.39],[77.78,72.31],[77.63,72.29]],[[79.5,72.72],[79.43,72.71],[78.88,72.75],[78.69,72.8],[78.63,72.85],[78.66,72.89],[79.16,73.09],[79.36,73.04],[79.41,72.98],[79.54,72.92],[79.54,72.77],[79.5,72.72]],[[74.66,72.87],[74.64,72.86],[74.59,72.88],[74.43,72.91],[74.18,72.98],[74.1,73.02],[74.14,73.07],[74.2,73.11],[74.41,73.13],[74.6,73.12],[74.73,73.11],[74.96,73.06],[74.74,73.03],[74.65,72.97],[74.66,72.93],[74.7,72.91],[74.66,72.87]],[[120.26,73.09],[120.01,73.04],[119.79,73.05],[119.64,73.12],[119.76,73.16],[119.96,73.17],[120.08,73.16],[120.24,73.11],[120.26,73.09]],[[55.32,73.31],[55.79,73.27],[56.14,73.26],[56.35,73.23],[56.43,73.2],[56.4,73.14],[56.33,73.11],[56.19,73.03],[56.17,72.98],[56.19,72.9],[56.17,72.85],[56.12,72.81],[56.08,72.79],[55.82,72.79],[55.72,72.77],[55.72,72.72],[55.7,72.67],[55.62,72.6],[55.44,72.58],[55.4,72.55],[55.42,72.5],[55.36,72.47],[55.36,72.41],[55.39,72.38],[55.4,72.31],[55.52,72.22],[55.49,72.18],[55.4,72.11],[55.38,72.01],[55.3,71.94],[55.47,71.87],[55.55,71.78],[55.61,71.69],[55.82,71.51],[56.04,71.35],[56.45,71.11],[56.89,70.93],[57.07,70.88],[57.48,70.79],[57.56,70.77],[57.63,70.73],[57.45,70.66],[57.26,70.64],[57.25,70.61],[57.15,70.59],[56.65,70.65],[56.62,70.66],[56.57,70.7],[56.51,70.73],[56.39,70.73],[56.26,70.71],[56.33,70.68],[56.42,70.66],[56.56,70.59],[56.5,70.57],[56.43,70.56],[56.14,70.66],[56.11,70.65],[56.09,70.62],[55.94,70.65],[55.91,70.63],[55.8,70.62],[55.71,70.64],[55.71,70.68],[55.69,70.69],[55.24,70.67],[55.05,70.67],[54.87,70.68],[54.65,70.74],[54.61,70.71],[54.6,70.68],[54.52,70.69],[54.33,70.74],[54.2,70.76],[53.72,70.81],[53.38,70.87],[53.47,70.9],[53.61,70.91],[53.62,70.95],[53.59,71.0],[53.59,71.05],[53.67,71.09],[53.86,71.07],[53.83,71.13],[53.92,71.14],[54.09,71.11],[54.16,71.13],[53.89,71.2],[53.59,71.3],[53.62,71.33],[53.52,71.34],[53.41,71.34],[53.32,71.4],[53.33,71.48],[53.41,71.53],[53.36,71.54],[52.91,71.5],[52.68,71.51],[52.42,71.54],[52.18,71.49],[51.94,71.47],[51.81,71.49],[51.69,71.53],[51.59,71.57],[51.51,71.65],[51.44,71.78],[51.43,71.83],[51.44,71.93],[51.48,71.98],[51.58,72.07],[51.65,72.1],[51.81,72.14],[51.89,72.15],[52.07,72.13],[52.25,72.13],[52.33,72.15],[52.41,72.2],[52.46,72.25],[52.59,72.28],[52.62,72.3],[52.66,72.34],[52.71,72.39],[52.71,72.44],[52.75,72.48],[52.86,72.55],[52.82,72.59],[52.84,72.62],[52.92,72.67],[52.68,72.68],[52.6,72.7],[52.53,72.74],[52.55,72.77],[52.58,72.79],[52.81,72.88],[52.91,72.9],[53.02,72.91],[53.13,72.91],[53.25,72.9],[53.37,72.92],[53.25,72.97],[53.24,73.01],[53.19,73.1],[53.2,73.15],[53.25,73.18],[53.36,73.22],[53.51,73.24],[53.63,73.26],[53.75,73.29],[53.87,73.3],[54.09,73.28],[54.2,73.28],[54.33,73.3],[54.68,73.37],[54.8,73.39],[54.94,73.38],[55.12,73.36],[55.32,73.31]],[[70.67,73.1],[70.38,73.05],[70.3,73.04],[70.12,73.06],[70.04,73.04],[69.92,73.08],[69.93,73.13],[69.99,73.17],[70.02,73.22],[70.0,73.36],[70.15,73.44],[70.35,73.48],[70.94,73.51],[71.02,73.5],[71.14,73.48],[71.23,73.45],[71.35,73.37],[71.44,73.34],[71.59,73.28],[71.63,73.22],[71.63,73.17],[71.36,73.16],[70.89,73.12],[70.67,73.1]],[[76.76,73.45],[76.66,73.44],[76.23,73.48],[76.08,73.52],[76.14,73.55],[76.25,73.56],[76.76,73.45]],[[75.5,73.46],[75.34,73.43],[75.38,73.48],[75.57,73.54],[75.93,73.57],[76.04,73.56],[76.05,73.55],[75.9,73.48],[75.83,73.46],[75.5,73.46]],[[142.18,73.9],[142.44,73.85],[142.64,73.8],[143.34,73.57],[143.41,73.52],[143.46,73.46],[143.49,73.25],[143.45,73.23],[143.19,73.22],[142.84,73.24],[142.59,73.25],[142.34,73.25],[142.13,73.28],[141.6,73.31],[141.18,73.39],[140.75,73.45],[140.66,73.45],[140.39,73.44],[140.03,73.36],[139.93,73.36],[139.79,73.36],[139.69,73.43],[139.92,73.45],[140.16,73.46],[140.38,73.48],[140.59,73.56],[140.7,73.63],[140.88,73.78],[140.98,73.83],[141.08,73.87],[141.19,73.88],[141.31,73.87],[141.68,73.9],[141.93,73.91],[142.18,73.9]],[[124.54,73.85],[124.48,73.85],[124.37,73.87],[124.34,73.91],[124.34,73.93],[124.43,73.94],[124.55,73.93],[124.64,73.9],[124.65,73.89],[124.54,73.85]],[[83.55,74.07],[83.5,74.05],[83.45,74.05],[83.41,74.04],[83.16,74.08],[82.82,74.09],[82.9,74.13],[83.15,74.15],[83.51,74.12],[83.62,74.09],[83.55,74.07]],[[82.71,74.09],[82.61,74.06],[82.48,74.08],[82.38,74.1],[82.33,74.13],[82.38,74.15],[82.53,74.16],[82.61,74.15],[82.69,74.11],[82.71,74.09]],[[136.2,73.91],[136.12,73.89],[136.05,73.93],[135.71,74.06],[135.63,74.12],[135.45,74.18],[135.4,74.2],[135.39,74.25],[135.63,74.22],[136.04,74.09],[136.26,73.98],[136.2,73.91]],[[141.01,74.0],[140.51,73.92],[140.41,73.92],[140.18,74.0],[140.1,74.18],[140.19,74.24],[140.3,74.26],[140.41,74.27],[140.85,74.27],[140.94,74.26],[141.04,74.24],[141.08,74.21],[141.1,74.17],[141.05,74.05],[141.01,74.0]],[[84.76,74.46],[84.71,74.4],[84.43,74.43],[84.39,74.45],[84.54,74.49],[84.68,74.51],[84.87,74.52],[84.76,74.46]],[[113.39,74.4],[113.35,74.35],[113.3,74.32],[113.26,74.27],[113.19,74.24],[112.98,74.2],[112.81,74.1],[112.78,74.1],[112.2,74.15],[112.11,74.16],[111.91,74.22],[111.64,74.27],[111.5,74.35],[111.57,74.37],[111.64,74.37],[111.88,74.36],[111.95,74.39],[111.98,74.46],[111.99,74.5],[112.01,74.53],[112.08,74.55],[112.95,74.48],[113.29,74.44],[113.39,74.4]],[[86.65,74.98],[86.74,74.96],[87.0,74.99],[87.05,74.98],[87.12,74.94],[87.01,74.86],[86.93,74.83],[86.69,74.85],[86.39,74.85],[86.26,74.89],[86.33,74.94],[86.5,74.97],[86.61,74.99],[86.65,74.98]],[[82.17,75.42],[82.21,75.39],[82.22,75.35],[82.18,75.34],[82.05,75.34],[81.98,75.25],[81.91,75.26],[81.86,75.32],[81.7,75.28],[81.65,75.29],[81.58,75.33],[81.53,75.34],[81.5,75.37],[81.71,75.45],[81.84,75.41],[81.93,75.41],[81.91,75.46],[81.91,75.5],[82.02,75.51],[82.17,75.52],[82.17,75.42]],[[146.8,75.37],[147.06,75.36],[147.44,75.44],[147.5,75.44],[148.43,75.41],[148.51,75.39],[148.52,75.34],[148.49,75.31],[148.48,75.27],[148.59,75.24],[148.89,75.23],[149.08,75.26],[149.65,75.24],[150.1,75.22],[150.28,75.16],[150.42,75.13],[150.53,75.1],[150.61,75.12],[150.69,75.16],[150.76,75.16],[150.82,75.16],[150.65,74.94],[150.58,74.92],[150.33,74.87],[149.84,74.8],[149.6,74.77],[149.05,74.77],[148.3,74.8],[148.09,74.83],[147.97,74.86],[147.74,74.93],[147.63,74.96],[147.26,74.98],[147.14,75.0],[146.92,75.06],[146.7,75.11],[146.15,75.2],[146.19,75.3],[146.26,75.39],[146.34,75.48],[146.44,75.56],[146.54,75.58],[146.75,75.51],[146.75,75.43],[146.8,75.37]],[[135.95,75.41],[135.75,75.38],[135.45,75.39],[135.47,75.46],[135.52,75.5],[135.59,75.58],[135.56,75.64],[135.58,75.71],[135.61,75.77],[135.7,75.85],[135.79,75.8],[135.85,75.73],[135.9,75.69],[136.13,75.63],[136.17,75.61],[135.98,75.52],[135.97,75.49],[136.02,75.44],[135.95,75.41]],[[152.89,76.12],[152.79,76.09],[152.56,76.14],[152.64,76.17],[152.8,76.19],[152.84,76.19],[152.86,76.16],[152.89,76.12]],[[140.05,75.83],[140.15,75.81],[140.27,75.82],[140.39,75.8],[140.5,75.69],[140.55,75.66],[140.6,75.64],[140.66,75.63],[140.82,75.63],[140.89,75.65],[140.94,75.7],[140.94,75.75],[140.93,75.8],[140.93,75.87],[140.95,75.93],[140.99,75.96],[141.03,75.99],[141.3,76.06],[141.49,76.14],[141.74,76.11],[142.0,76.04],[142.46,75.9],[142.67,75.86],[142.93,75.83],[143.19,75.81],[143.31,75.82],[143.56,75.86],[143.69,75.86],[145.26,75.59],[145.31,75.56],[145.36,75.53],[145.02,75.49],[144.8,75.42],[144.73,75.37],[144.81,75.32],[144.88,75.27],[144.41,75.1],[144.22,75.06],[144.02,75.04],[143.63,75.08],[143.4,75.08],[143.17,75.12],[142.92,75.22],[142.82,75.27],[142.73,75.34],[142.7,75.45],[142.73,75.54],[142.87,75.57],[142.99,75.63],[143.0,75.66],[142.94,75.71],[142.55,75.72],[142.31,75.69],[142.09,75.66],[142.15,75.46],[142.2,75.39],[142.26,75.35],[142.62,75.13],[142.7,75.1],[142.93,75.06],[143.13,74.97],[142.78,74.87],[142.63,74.84],[142.47,74.82],[142.38,74.83],[142.29,74.85],[142.18,74.9],[142.1,74.95],[141.99,74.99],[141.75,74.98],[141.53,74.95],[141.31,74.92],[140.66,74.88],[140.46,74.86],[140.27,74.85],[140.01,74.89],[139.76,74.96],[139.68,74.96],[139.61,74.95],[139.55,74.9],[139.51,74.84],[139.43,74.75],[139.33,74.69],[139.22,74.66],[139.1,74.66],[138.98,74.67],[138.87,74.7],[138.09,74.8],[138.0,74.83],[137.92,74.87],[137.68,75.01],[137.57,75.04],[137.45,75.05],[137.22,75.12],[137.01,75.24],[136.96,75.27],[136.95,75.33],[136.98,75.37],[137.17,75.35],[137.29,75.35],[137.22,75.55],[137.27,75.75],[137.36,75.78],[137.71,75.76],[137.59,75.82],[137.5,75.91],[137.56,75.96],[137.63,75.99],[137.77,76.02],[137.98,76.03],[138.04,76.05],[138.1,76.08],[138.21,76.11],[138.43,76.13],[138.81,76.2],[138.92,76.2],[139.02,76.16],[139.11,76.11],[139.21,76.08],[139.53,76.01],[139.74,75.95],[140.05,75.83]],[[96.53,76.28],[96.61,76.26],[96.59,76.22],[96.49,76.23],[96.35,76.21],[96.35,76.18],[96.3,76.12],[96.11,76.16],[95.84,76.16],[95.68,76.19],[95.31,76.21],[95.32,76.26],[95.38,76.29],[95.59,76.25],[95.79,76.29],[96.15,76.27],[96.27,76.31],[96.53,76.28]],[[96.85,76.2],[96.8,76.19],[96.75,76.2],[96.74,76.21],[96.74,76.26],[96.83,76.32],[96.84,76.34],[96.88,76.36],[96.99,76.34],[97.05,76.32],[97.05,76.3],[96.97,76.24],[96.85,76.2]],[[112.48,76.62],[112.63,76.55],[112.66,76.51],[112.61,76.5],[112.59,76.48],[112.57,76.45],[112.53,76.45],[112.39,76.48],[112.3,76.54],[112.15,76.55],[112.0,76.6],[111.97,76.63],[112.01,76.63],[112.28,76.62],[112.39,76.64],[112.48,76.62]],[[97.59,76.6],[97.54,76.58],[97.43,76.59],[97.34,76.63],[97.31,76.69],[97.38,76.71],[97.59,76.6]],[[149.15,76.66],[148.4,76.65],[148.45,76.68],[148.72,76.75],[149.41,76.78],[149.27,76.75],[149.2,76.68],[149.15,76.66]],[[67.77,76.24],[67.37,76.16],[67.13,76.11],[66.89,76.07],[66.66,76.05],[66.28,75.98],[65.62,75.9],[65.2,75.84],[64.74,75.79],[64.26,75.72],[63.78,75.67],[63.66,75.67],[63.32,75.6],[63.05,75.58],[62.07,75.43],[61.62,75.32],[61.49,75.31],[61.36,75.31],[61.25,75.28],[61.15,75.22],[60.94,75.16],[60.83,75.11],[60.72,75.07],[60.66,75.06],[60.53,75.06],[60.48,75.05],[60.28,75.01],[60.24,74.97],[60.45,74.95],[60.5,74.9],[60.44,74.88],[60.3,74.84],[60.22,74.8],[60.08,74.76],[59.98,74.74],[59.75,74.75],[59.73,74.7],[59.77,74.66],[59.75,74.64],[59.67,74.61],[59.6,74.61],[59.24,74.69],[59.18,74.67],[59.16,74.61],[59.15,74.55],[59.1,74.51],[59.04,74.49],[58.93,74.46],[58.53,74.5],[58.5,74.46],[58.56,74.42],[58.65,74.33],[58.67,74.29],[58.62,74.23],[58.44,74.13],[57.77,74.01],[57.78,73.97],[57.85,73.9],[57.87,73.85],[57.84,73.81],[57.76,73.77],[57.66,73.77],[57.6,73.78],[57.45,73.83],[57.31,73.84],[57.29,73.81],[57.46,73.75],[57.54,73.66],[57.46,73.61],[57.13,73.5],[56.96,73.37],[56.63,73.3],[56.43,73.3],[56.23,73.31],[56.03,73.35],[55.55,73.36],[55.28,73.39],[55.01,73.45],[54.77,73.45],[54.57,73.42],[54.3,73.35],[54.13,73.48],[54.2,73.54],[53.84,73.7],[53.76,73.77],[53.85,73.8],[53.96,73.82],[54.17,73.89],[54.39,73.94],[54.61,73.95],[54.64,73.96],[54.73,74.03],[54.83,74.1],[54.92,74.13],[55.02,74.19],[55.34,74.42],[55.42,74.44],[56.08,74.48],[56.14,74.5],[55.95,74.54],[55.75,74.54],[55.66,74.56],[55.61,74.59],[55.58,74.63],[55.66,74.66],[55.91,74.8],[56.22,74.9],[56.5,74.96],[56.43,74.97],[56.34,75.01],[56.0,75.0],[55.86,75.06],[55.82,75.09],[55.81,75.12],[55.92,75.17],[56.04,75.19],[56.16,75.19],[56.29,75.16],[56.39,75.14],[56.49,75.1],[56.57,75.1],[56.88,75.24],[56.83,75.28],[56.81,75.33],[56.84,75.35],[56.99,75.38],[57.09,75.38],[57.3,75.37],[57.61,75.34],[57.63,75.36],[57.71,75.45],[57.78,75.51],[58.09,75.59],[58.07,75.62],[58.06,75.66],[58.42,75.72],[58.65,75.78],[58.88,75.85],[58.99,75.87],[59.11,75.87],[59.35,75.91],[59.78,75.95],[60.04,75.98],[60.12,76.07],[60.28,76.1],[60.61,76.11],[60.73,76.1],[60.8,76.07],[60.94,76.07],[61.0,76.09],[61.05,76.12],[61.04,76.17],[61.03,76.23],[61.16,76.27],[61.2,76.28],[61.57,76.3],[61.79,76.29],[62.24,76.24],[62.47,76.23],[62.78,76.25],[62.97,76.24],[63.53,76.31],[64.46,76.38],[64.71,76.43],[64.95,76.48],[65.07,76.5],[65.2,76.5],[65.31,76.52],[65.53,76.57],[65.64,76.58],[65.76,76.58],[65.86,76.61],[65.96,76.69],[66.06,76.75],[66.35,76.82],[66.83,76.92],[67.26,76.96],[67.53,77.01],[67.65,77.01],[68.02,76.99],[68.49,76.93],[68.7,76.87],[68.87,76.79],[68.91,76.76],[68.94,76.71],[68.89,76.66],[68.86,76.61],[68.9,76.57],[68.56,76.45],[68.22,76.31],[68.17,76.28],[67.77,76.24]],[[96.29,77.03],[96.25,77.01],[96.21,76.99],[96.09,77.0],[95.85,76.97],[95.77,76.99],[95.68,77.02],[95.36,77.01],[95.27,77.02],[95.42,77.06],[95.85,77.1],[96.53,77.21],[96.56,77.15],[96.56,77.13],[96.42,77.07],[96.29,77.03]],[[89.51,77.19],[89.3,77.18],[89.18,77.21],[89.14,77.23],[89.2,77.27],[89.28,77.3],[89.62,77.31],[89.68,77.28],[89.67,77.25],[89.51,77.19]],[[107.41,77.24],[107.3,77.24],[107.27,77.29],[107.37,77.35],[107.49,77.35],[107.59,77.33],[107.63,77.32],[107.66,77.3],[107.68,77.27],[107.41,77.24]],[[107.7,78.13],[107.61,78.08],[107.48,78.06],[107.34,78.1],[107.0,78.1],[106.42,78.14],[106.58,78.17],[107.51,78.19],[107.57,78.19],[107.7,78.13]],[[106.27,78.21],[106.15,78.2],[106.02,78.22],[106.06,78.26],[106.35,78.27],[106.46,78.34],[106.64,78.34],[106.69,78.32],[106.72,78.29],[106.72,78.26],[106.68,78.26],[106.5,78.26],[106.47,78.25],[106.27,78.21]],[[102.88,79.25],[102.79,79.18],[102.75,79.11],[102.45,78.88],[102.41,78.84],[102.59,78.87],[102.75,78.95],[102.84,79.01],[102.95,79.06],[103.08,79.06],[103.2,79.07],[103.43,79.13],[103.67,79.15],[103.8,79.15],[103.93,79.12],[104.0,79.06],[104.09,79.01],[104.4,78.98],[104.45,78.96],[104.48,78.92],[104.45,78.88],[104.63,78.84],[104.88,78.85],[105.01,78.84],[105.15,78.82],[105.2,78.78],[105.26,78.73],[105.31,78.67],[105.34,78.59],[105.31,78.5],[104.83,78.35],[104.74,78.34],[104.52,78.35],[104.3,78.34],[103.72,78.26],[103.0,78.26],[102.8,78.19],[102.73,78.19],[102.67,78.2],[102.62,78.22],[102.18,78.21],[101.69,78.19],[101.2,78.19],[101.04,78.14],[100.54,78.05],[100.08,77.97],[99.85,77.96],[99.5,77.98],[99.39,78.0],[99.29,78.04],[99.44,78.08],[99.55,78.18],[99.68,78.23],[100.02,78.34],[100.06,78.38],[100.12,78.47],[100.16,78.5],[100.22,78.54],[100.26,78.57],[100.26,78.63],[100.28,78.68],[100.42,78.75],[100.52,78.79],[100.62,78.8],[100.88,78.78],[100.96,78.79],[100.9,78.81],[100.86,78.9],[100.86,78.93],[100.9,78.98],[100.97,79.01],[101.03,79.02],[101.07,79.1],[101.05,79.12],[101.15,79.16],[101.2,79.2],[101.31,79.23],[101.54,79.25],[101.56,79.31],[101.59,79.35],[101.64,79.36],[101.76,79.37],[101.82,79.37],[101.91,79.31],[102.01,79.26],[102.13,79.25],[102.25,79.26],[102.18,79.31],[102.18,79.37],[102.23,79.41],[102.28,79.43],[102.4,79.43],[102.79,79.39],[103.04,79.33],[103.1,79.3],[103.05,79.28],[102.94,79.27],[102.88,79.25]],[[76.25,79.65],[76.37,79.62],[76.47,79.64],[77.36,79.56],[77.55,79.52],[77.59,79.5],[76.81,79.49],[76.65,79.49],[76.64,79.54],[76.46,79.55],[76.15,79.58],[76.07,79.63],[76.05,79.64],[76.15,79.66],[76.25,79.65]],[[100.14,79.61],[99.92,79.6],[99.94,79.67],[99.96,79.69],[100.07,79.7],[100.14,79.68],[100.3,79.67],[100.14,79.61]],[[92.68,79.69],[92.44,79.68],[92.15,79.68],[91.68,79.79],[91.38,79.84],[91.13,79.9],[91.07,79.98],[91.23,80.03],[91.43,80.05],[91.75,80.05],[92.17,80.05],[92.59,80.0],[93.48,79.94],[93.8,79.9],[93.6,79.82],[93.38,79.78],[93.16,79.74],[92.93,79.7],[92.68,79.69]],[[51.41,79.94],[51.44,79.93],[51.43,79.92],[51.08,79.93],[50.45,79.92],[50.09,79.98],[50.47,80.04],[50.68,80.05],[50.94,80.09],[51.25,80.05],[51.24,80.01],[51.24,79.99],[51.33,79.97],[51.41,79.94]],[[59.69,79.96],[59.33,79.92],[59.2,79.93],[59.17,79.95],[59.1,79.96],[58.92,79.98],[58.95,80.04],[59.0,80.05],[59.54,80.12],[59.8,80.08],[59.91,79.99],[59.69,79.96]],[[97.67,80.16],[97.9,80.1],[98.02,80.02],[97.91,80.0],[97.81,79.96],[97.76,79.9],[97.63,79.85],[97.59,79.77],[97.65,79.76],[97.72,79.78],[97.87,79.85],[98.06,79.9],[98.27,79.87],[98.35,79.88],[98.5,79.95],[98.47,80.01],[98.53,80.04],[98.6,80.05],[98.87,80.05],[99.29,80.02],[99.37,79.99],[99.47,79.97],[99.54,79.94],[99.73,79.92],[99.82,79.9],[99.95,79.85],[100.06,79.78],[99.92,79.74],[99.84,79.67],[99.81,79.65],[99.78,79.63],[99.77,79.57],[99.75,79.52],[99.72,79.49],[99.71,79.46],[99.72,79.39],[99.68,79.32],[99.54,79.28],[99.39,79.27],[99.17,79.31],[99.1,79.31],[99.04,79.29],[99.32,79.23],[99.52,79.13],[99.75,79.11],[99.81,79.1],[99.9,79.01],[99.93,78.96],[99.54,78.85],[99.44,78.83],[98.82,78.82],[98.41,78.79],[98.28,78.8],[98.05,78.82],[97.91,78.81],[97.69,78.83],[97.56,78.83],[97.25,78.87],[96.93,78.93],[96.87,78.96],[96.81,78.98],[96.43,79.0],[96.35,79.02],[95.8,79.0],[95.7,79.01],[95.53,79.1],[95.44,79.1],[95.13,79.05],[95.02,79.05],[94.79,79.09],[94.65,79.13],[94.63,79.14],[94.62,79.19],[94.48,79.22],[94.31,79.31],[94.22,79.4],[93.76,79.45],[93.48,79.46],[93.27,79.46],[93.07,79.5],[93.4,79.63],[93.85,79.7],[94.04,79.76],[94.26,79.83],[94.35,79.94],[94.72,80.01],[94.82,80.03],[94.95,80.09],[94.99,80.1],[95.28,80.03],[95.34,80.04],[95.39,80.07],[95.5,80.11],[95.86,80.11],[96.16,80.1],[96.28,80.11],[96.42,80.1],[97.12,80.15],[97.59,80.17],[97.67,80.16]],[[50.05,80.07],[49.97,80.06],[49.59,80.14],[49.56,80.16],[49.88,80.23],[50.25,80.22],[50.31,80.19],[50.32,80.17],[50.07,80.11],[50.05,80.07]],[[55.48,80.27],[55.2,80.23],[55.05,80.23],[54.98,80.26],[55.09,80.3],[55.24,80.33],[55.35,80.32],[55.43,80.3],[55.48,80.27]],[[57.08,80.35],[57.12,80.32],[57.12,80.19],[57.07,80.14],[57.08,80.09],[56.99,80.07],[56.2,80.08],[55.81,80.09],[55.72,80.1],[55.94,80.16],[56.01,80.2],[55.99,80.32],[56.02,80.34],[56.66,80.33],[56.71,80.36],[56.94,80.37],[57.08,80.35]],[[53.52,80.19],[52.86,80.17],[52.64,80.18],[52.61,80.19],[52.55,80.2],[52.34,80.21],[52.21,80.26],[52.27,80.28],[52.58,80.3],[52.68,80.32],[52.72,80.35],[52.85,80.4],[53.19,80.41],[53.33,80.4],[53.35,80.37],[53.49,80.32],[53.85,80.27],[53.78,80.23],[53.65,80.22],[53.52,80.19]],[[57.96,80.12],[57.8,80.1],[57.39,80.14],[57.33,80.16],[57.28,80.19],[57.21,80.33],[57.21,80.37],[57.19,80.4],[57.08,80.45],[57.01,80.47],[57.08,80.49],[57.52,80.48],[58.48,80.46],[58.97,80.42],[59.12,80.39],[59.26,80.34],[58.4,80.32],[58.28,80.3],[58.29,80.25],[58.26,80.2],[58.16,80.2],[57.96,80.12]],[[54.42,80.47],[54.28,80.42],[53.81,80.48],[53.85,80.5],[53.9,80.52],[53.9,80.54],[53.86,80.56],[53.88,80.61],[54.18,80.57],[54.21,80.56],[54.41,80.54],[54.44,80.5],[54.42,80.47]],[[47.44,80.85],[47.9,80.81],[48.24,80.82],[48.35,80.82],[48.45,80.81],[48.55,80.78],[48.69,80.72],[48.68,80.63],[48.63,80.63],[48.04,80.67],[47.78,80.76],[47.71,80.77],[47.6,80.74],[47.51,80.69],[47.41,80.67],[47.3,80.61],[47.2,80.61],[47.14,80.61],[47.01,80.56],[46.68,80.56],[46.62,80.54],[46.51,80.48],[46.38,80.46],[46.14,80.45],[46.06,80.48],[46.02,80.54],[45.97,80.57],[45.64,80.54],[45.39,80.56],[45.15,80.6],[44.9,80.61],[45.12,80.65],[46.33,80.74],[46.8,80.76],[47.02,80.81],[47.35,80.85],[47.44,80.85]],[[62.17,80.83],[62.23,80.79],[62.19,80.73],[62.11,80.68],[62.08,80.62],[61.77,80.6],[61.68,80.59],[61.6,80.53],[61.29,80.5],[61.05,80.42],[60.72,80.43],[60.28,80.49],[59.9,80.45],[59.65,80.43],[59.35,80.51],[59.3,80.52],[59.29,80.57],[59.31,80.62],[59.39,80.71],[59.5,80.77],[59.55,80.78],[59.59,80.82],[59.72,80.84],[60.09,80.85],[60.23,80.84],[60.28,80.8],[60.48,80.8],[60.82,80.83],[61.31,80.86],[61.6,80.89],[61.85,80.89],[62.1,80.87],[62.17,80.83]],[[50.28,80.93],[50.43,80.91],[50.8,80.91],[50.92,80.89],[51.45,80.74],[51.59,80.74],[51.7,80.69],[51.15,80.6],[50.96,80.54],[50.28,80.53],[49.85,80.5],[49.75,80.47],[49.79,80.43],[49.59,80.38],[48.9,80.37],[48.81,80.35],[48.68,80.3],[48.69,80.29],[48.92,80.28],[48.96,80.27],[48.99,80.24],[49.01,80.21],[48.98,80.16],[48.89,80.16],[48.8,80.16],[48.58,80.2],[48.55,80.18],[48.53,80.16],[48.47,80.11],[48.39,80.1],[48.17,80.13],[48.1,80.12],[48.03,80.1],[47.94,80.09],[47.74,80.08],[47.63,80.11],[47.72,80.15],[47.98,80.21],[47.89,80.24],[47.64,80.25],[47.44,80.23],[47.34,80.19],[47.25,80.18],[46.99,80.18],[46.85,80.24],[46.74,80.26],[46.64,80.3],[47.4,80.44],[47.66,80.5],[47.9,80.53],[48.21,80.54],[48.31,80.56],[48.4,80.57],[48.46,80.56],[48.63,80.51],[49.09,80.52],[49.19,80.56],[49.19,80.66],[49.15,80.71],[49.24,80.82],[49.51,80.87],[50.12,80.92],[50.28,80.93]],[[80.03,80.85],[79.1,80.81],[79.01,80.83],[78.98,80.85],[79.11,80.92],[79.22,80.96],[79.81,80.98],[80.28,80.95],[80.43,80.93],[80.37,80.88],[80.34,80.87],[80.03,80.85]],[[61.14,80.95],[60.83,80.93],[60.32,80.96],[60.06,80.98],[60.08,81.0],[60.15,81.02],[60.59,81.09],[61.46,81.1],[61.57,81.05],[61.47,81.01],[61.14,80.95]],[[54.72,81.12],[55.47,81.02],[56.17,81.03],[56.47,81.0],[56.91,80.91],[57.57,80.82],[57.69,80.79],[57.58,80.76],[56.81,80.66],[56.32,80.63],[55.88,80.63],[55.71,80.64],[55.54,80.7],[55.12,80.75],[54.67,80.74],[54.62,80.77],[54.53,80.78],[54.38,80.79],[54.07,80.81],[54.05,80.87],[54.24,80.9],[54.37,80.9],[54.42,80.99],[54.63,81.11],[54.72,81.12]],[[58.62,81.04],[58.76,80.99],[58.82,80.93],[58.9,80.9],[58.93,80.83],[58.86,80.78],[58.64,80.77],[58.29,80.76],[57.94,80.79],[57.75,80.89],[57.41,80.92],[57.21,81.02],[57.41,81.05],[57.66,81.03],[58.05,81.12],[58.1,81.11],[58.19,81.09],[58.51,81.06],[58.62,81.04]],[[50.75,81.05],[50.62,81.04],[50.52,81.05],[50.41,81.08],[50.38,81.1],[50.37,81.12],[50.46,81.13],[50.51,81.14],[50.52,81.16],[50.59,81.17],[50.72,81.17],[50.88,81.15],[50.95,81.11],[50.79,81.07],[50.75,81.05]],[[63.37,80.7],[63.19,80.7],[63.0,80.71],[62.76,80.76],[62.52,80.82],[62.59,80.85],[62.82,80.89],[63.12,80.97],[63.61,80.98],[63.86,80.98],[64.1,81.0],[64.17,81.04],[64.21,81.11],[64.26,81.14],[64.31,81.18],[64.58,81.2],[64.8,81.2],[65.03,81.17],[65.17,81.14],[65.31,81.1],[65.38,81.06],[65.36,81.01],[65.37,80.97],[65.44,80.93],[65.0,80.82],[64.55,80.76],[63.37,80.7]],[[91.57,81.14],[91.22,81.06],[89.98,81.11],[89.92,81.15],[89.9,81.17],[90.07,81.21],[91.11,81.2],[91.48,81.18],[91.57,81.14]],[[96.53,81.08],[96.56,81.03],[96.69,80.99],[96.75,80.96],[97.41,80.84],[97.7,80.83],[97.83,80.8],[97.87,80.76],[97.86,80.7],[97.75,80.7],[97.67,80.68],[97.22,80.65],[97.11,80.61],[97.03,80.54],[97.07,80.52],[97.12,80.5],[97.25,80.36],[97.29,80.34],[97.42,80.32],[97.3,80.27],[97.18,80.24],[95.86,80.18],[94.96,80.15],[94.66,80.12],[94.57,80.13],[94.33,80.08],[93.87,80.01],[93.65,80.01],[93.0,80.1],[92.2,80.18],[92.09,80.22],[91.89,80.25],[91.64,80.27],[91.52,80.36],[91.69,80.42],[91.9,80.48],[92.25,80.5],[92.58,80.53],[92.83,80.62],[92.98,80.7],[93.26,80.79],[92.77,80.77],[92.59,80.78],[92.61,80.81],[92.71,80.87],[92.76,80.89],[92.94,80.93],[93.07,80.99],[93.36,81.03],[93.5,81.04],[93.64,81.04],[93.89,81.06],[94.14,81.09],[94.38,81.11],[94.61,81.11],[94.84,81.14],[95.06,81.19],[95.16,81.27],[95.8,81.28],[95.9,81.26],[95.98,81.21],[96.08,81.19],[96.19,81.18],[96.47,81.1],[96.53,81.08]],[[59.31,81.31],[59.1,81.29],[58.72,81.31],[58.61,81.34],[58.63,81.36],[58.88,81.39],[59.08,81.4],[59.28,81.37],[59.37,81.33],[59.31,81.31]],[[57.81,81.55],[57.86,81.51],[58.02,81.48],[58.44,81.46],[58.56,81.42],[58.37,81.39],[57.86,81.37],[57.91,81.3],[58.02,81.25],[57.91,81.2],[57.77,81.17],[57.45,81.14],[57.16,81.18],[56.82,81.24],[56.67,81.2],[56.51,81.18],[56.36,81.18],[56.19,81.22],[55.72,81.19],[55.57,81.23],[55.47,81.31],[55.78,81.33],[56.16,81.3],[56.4,81.39],[56.72,81.42],[56.97,81.51],[57.09,81.54],[57.37,81.54],[57.46,81.54],[57.72,81.56],[57.81,81.55]],[[63.65,81.61],[63.53,81.6],[62.88,81.61],[62.57,81.63],[62.53,81.65],[62.52,81.66],[62.11,81.68],[62.28,81.71],[62.79,81.72],[63.71,81.69],[63.77,81.66],[63.78,81.65],[63.65,81.61]],[[58.3,81.72],[57.96,81.7],[57.92,81.71],[57.91,81.72],[57.95,81.75],[57.98,81.8],[58.13,81.83],[59.26,81.85],[59.41,81.83],[59.36,81.78],[59.36,81.76],[58.3,81.72]]]},{"n":"Rwanda","r":[[[30.55,-2.4],[30.53,-2.4],[30.48,-2.38],[30.41,-2.31],[30.27,-2.35],[30.23,-2.35],[30.18,-2.38],[30.14,-2.41],[30.12,-2.42],[30.09,-2.41],[29.97,-2.34],[29.93,-2.34],[29.91,-2.55],[29.89,-2.66],[29.87,-2.72],[29.78,-2.77],[29.7,-2.79],[29.65,-2.79],[29.46,-2.81],[29.39,-2.81],[29.35,-2.79],[29.3,-2.67],[29.2,-2.62],[29.1,-2.6],[29.06,-2.6],[29.03,-2.66],[29.01,-2.72],[28.92,-2.68],[28.89,-2.64],[28.89,-2.56],[28.86,-2.45],[28.88,-2.4],[28.91,-2.37],[28.99,-2.31],[29.11,-2.23],[29.13,-2.2],[29.15,-2.13],[29.14,-1.98],[29.13,-1.86],[29.14,-1.82],[29.2,-1.72],[29.27,-1.62],[29.35,-1.52],[29.4,-1.51],[29.47,-1.47],[29.54,-1.41],[29.58,-1.39],[29.61,-1.39],[29.83,-1.34],[29.85,-1.35],[29.88,-1.45],[29.9,-1.47],[29.93,-1.47],[29.99,-1.45],[30.1,-1.37],[30.15,-1.32],[30.21,-1.25],[30.28,-1.18],[30.32,-1.11],[30.36,-1.07],[30.41,-1.06],[30.47,-1.07],[30.51,-1.07],[30.48,-1.08],[30.47,-1.13],[30.51,-1.21],[30.63,-1.37],[30.71,-1.4],[30.76,-1.46],[30.81,-1.56],[30.83,-1.69],[30.81,-1.85],[30.82,-1.97],[30.86,-2.04],[30.88,-2.14],[30.85,-2.27],[30.83,-2.34],[30.8,-2.36],[30.76,-2.37],[30.71,-2.36],[30.66,-2.37],[30.59,-2.4],[30.55,-2.4]]]},{"n":"Western Sahara","r":[[[-8.68,27.66],[-8.68,27.49],[-8.68,27.29],[-8.68,27.12],[-8.68,26.92],[-8.68,26.72],[-8.68,26.5],[-8.68,26.27],[-8.68,26.11],[-8.68,26.0],[-8.89,26.0],[-9.07,26.0],[-9.26,26.0],[-9.44,26.0],[-9.63,26.0],[-9.82,26.0],[-10.0,26.0],[-10.19,26.0],[-10.38,26.0],[-10.56,26.0],[-10.75,26.0],[-10.94,26.0],[-11.12,26.0],[-11.31,26.0],[-11.49,26.0],[-11.68,26.0],[-11.87,26.0],[-12.02,26.0],[-12.02,25.88],[-12.02,25.74],[-12.02,25.6],[-12.02,25.47],[-12.02,25.33],[-12.02,25.2],[-12.02,25.06],[-12.02,24.92],[-12.02,24.79],[-12.02,24.65],[-12.02,24.51],[-12.02,24.38],[-12.02,24.24],[-12.02,24.11],[-12.02,23.97],[-12.02,23.83],[-12.02,23.7],[-12.02,23.58],[-12.02,23.47],[-12.08,23.44],[-12.23,23.38],[-12.37,23.32],[-12.56,23.29],[-12.62,23.27],[-12.74,23.19],[-12.9,23.09],[-13.03,23.0],[-13.12,22.88],[-13.15,22.82],[-13.17,22.75],[-13.16,22.69],[-13.11,22.56],[-13.09,22.5],[-13.09,22.38],[-13.08,22.26],[-13.07,22.13],[-13.06,22.0],[-13.05,21.85],[-13.04,21.71],[-13.03,21.57],[-13.03,21.47],[-13.02,21.33],[-13.17,21.33],[-13.4,21.33],[-13.63,21.33],[-13.86,21.33],[-14.08,21.33],[-14.31,21.33],[-14.54,21.33],[-14.77,21.33],[-15.0,21.33],[-15.23,21.33],[-15.46,21.33],[-15.69,21.33],[-15.92,21.33],[-16.15,21.33],[-16.38,21.33],[-16.61,21.33],[-16.84,21.33],[-16.96,21.33],[-17.01,21.14],[-17.04,21.01],[-17.06,20.9],[-17.05,20.81],[-17.1,20.86],[-17.01,21.38],[-17.0,21.42],[-17.0,21.42],[-16.95,21.43],[-16.73,21.47],[-16.58,21.48],[-16.19,21.48],[-16.04,21.5],[-15.92,21.5],[-15.75,21.49],[-15.61,21.47],[-15.46,21.45],[-15.29,21.45],[-15.15,21.44],[-14.97,21.44],[-14.84,21.45],[-14.75,21.5],[-14.67,21.6],[-14.64,21.68],[-14.61,21.75],[-14.62,21.82],[-14.63,21.86],[-14.58,21.91],[-14.52,21.99],[-14.46,22.04],[-14.44,22.08],[-14.38,22.12],[-14.31,22.19],[-14.27,22.24],[-14.22,22.31],[-14.21,22.37],[-14.19,22.45],[-14.19,22.59],[-14.17,22.76],[-14.14,22.87],[-14.12,22.96],[-14.1,23.1],[-14.04,23.34],[-14.02,23.41],[-13.98,23.52],[-13.93,23.62],[-13.89,23.69],[-13.84,23.75],[-13.77,23.79],[-13.66,23.83],[-13.58,23.87],[-13.48,23.91],[-13.39,23.94],[-13.31,23.98],[-13.28,24.02],[-13.23,24.09],[-13.16,24.22],[-13.12,24.3],[-13.06,24.4],[-12.99,24.47],[-12.95,24.5],[-12.91,24.52],[-12.82,24.57],[-12.71,24.63],[-12.63,24.68],[-12.56,24.73],[-12.5,24.77],[-12.43,24.83],[-12.4,24.88],[-12.36,24.97],[-12.31,25.11],[-12.27,25.26],[-12.23,25.42],[-12.2,25.52],[-12.17,25.64],[-12.13,25.73],[-12.1,25.83],[-12.08,25.87],[-12.08,25.92],[-12.06,25.99],[-12.06,26.0],[-12.03,26.03],[-11.96,26.05],[-11.88,26.07],[-11.75,26.09],[-11.72,26.1],[-11.7,26.16],[-11.68,26.21],[-11.64,26.3],[-11.58,26.36],[-11.55,26.4],[-11.51,26.47],[-11.47,26.52],[-11.4,26.58],[-11.34,26.63],[-11.32,26.68],[-11.32,26.74],[-11.36,26.79],[-11.39,26.88],[-11.26,26.91],[-11.15,26.94],[-11.05,26.97],[-10.92,27.01],[-10.83,27.01],[-10.76,27.02],[-10.65,27.0],[-10.55,26.99],[-10.48,26.96],[-10.35,26.9],[-10.25,26.86],[-10.19,26.86],[-10.12,26.88],[-10.07,26.91],[-10.03,26.91],[-9.98,26.89],[-9.9,26.85],[-9.82,26.85],[-9.74,26.86],[-9.67,26.91],[-9.57,26.99],[-9.49,27.05],[-9.41,27.09],[-9.35,27.1],[-9.29,27.1],[-9.21,27.1],[-9.08,27.09],[-9.0,27.09],[-8.89,27.1],[-8.79,27.12],[-8.75,27.15],[-8.75,27.19],[-8.77,27.25],[-8.8,27.31],[-8.8,27.36],[-8.79,27.42],[-8.77,27.46],[-8.78,27.53],[-8.81,27.61],[-8.82,27.66],[-8.82,27.66],[-8.68,27.66]]]},{"n":"Saudi Arabia","r":[[[51.57,24.29],[51.57,24.26],[51.57,24.13],[51.59,24.08],[51.63,24.04],[51.68,23.97],[51.74,23.9],[51.79,23.84],[51.85,23.77],[51.9,23.71],[51.96,23.64],[52.01,23.58],[52.07,23.51],[52.12,23.45],[52.18,23.38],[52.23,23.31],[52.29,23.25],[52.34,23.18],[52.4,23.12],[52.45,23.05],[52.51,22.99],[52.56,22.93],[52.64,22.92],[52.67,22.92],[52.74,22.91],[52.86,22.9],[53.01,22.88],[53.19,22.85],[53.39,22.83],[53.61,22.8],[53.83,22.78],[54.05,22.75],[54.27,22.72],[54.47,22.7],[54.65,22.68],[54.8,22.66],[54.92,22.64],[55.0,22.63],[55.02,22.63],[55.1,22.62],[55.12,22.62],[55.19,22.7],[55.26,22.59],[55.32,22.5],[55.4,22.37],[55.49,22.23],[55.58,22.1],[55.64,22.0],[55.61,21.9],[55.57,21.79],[55.53,21.68],[55.5,21.57],[55.46,21.46],[55.42,21.35],[55.39,21.24],[55.35,21.13],[55.31,21.01],[55.28,20.9],[55.24,20.79],[55.2,20.68],[55.17,20.57],[55.13,20.46],[55.09,20.35],[55.06,20.24],[55.02,20.13],[54.98,20.0],[54.87,19.96],[54.7,19.9],[54.53,19.85],[54.35,19.79],[54.18,19.73],[54.01,19.67],[53.84,19.62],[53.67,19.56],[53.49,19.5],[53.32,19.44],[53.15,19.39],[52.98,19.33],[52.81,19.27],[52.63,19.22],[52.46,19.16],[52.29,19.1],[52.12,19.04],[51.98,19.0],[51.74,18.96],[51.51,18.93],[51.26,18.9],[50.95,18.86],[50.71,18.83],[50.36,18.78],[50.04,18.74],[49.74,18.7],[49.45,18.66],[49.19,18.62],[49.04,18.58],[48.86,18.5],[48.59,18.36],[48.32,18.23],[48.17,18.16],[48.02,17.98],[47.95,17.89],[47.81,17.72],[47.7,17.6],[47.58,17.45],[47.53,17.32],[47.44,17.11],[47.37,17.06],[47.25,16.99],[47.14,16.95],[46.98,16.95],[46.88,17.08],[46.78,17.21],[46.73,17.27],[46.68,17.27],[46.51,17.25],[46.31,17.23],[46.07,17.25],[45.79,17.28],[45.54,17.3],[45.41,17.32],[45.24,17.41],[45.19,17.42],[45.15,17.43],[44.95,17.43],[44.75,17.43],[44.55,17.4],[44.35,17.41],[44.16,17.4],[44.09,17.37],[44.01,17.37],[43.96,17.34],[43.92,17.32],[43.87,17.35],[43.8,17.34],[43.71,17.37],[43.65,17.42],[43.6,17.47],[43.54,17.5],[43.47,17.52],[43.42,17.52],[43.35,17.49],[43.3,17.46],[43.19,17.36],[43.19,17.32],[43.24,17.27],[43.22,17.24],[43.16,17.21],[43.14,17.11],[43.13,17.06],[43.12,16.94],[43.15,16.85],[43.18,16.81],[43.19,16.77],[43.17,16.69],[43.1,16.66],[43.06,16.59],[43.03,16.55],[42.99,16.51],[42.8,16.37],[42.79,16.45],[42.73,16.57],[42.73,16.65],[42.7,16.74],[42.65,16.8],[42.55,16.87],[42.54,16.96],[42.48,17.05],[42.38,17.12],[42.33,17.26],[42.29,17.43],[42.05,17.67],[41.75,17.89],[41.66,18.01],[41.51,18.26],[41.43,18.45],[41.23,18.68],[41.22,18.77],[41.19,18.87],[41.14,18.99],[41.12,19.08],[40.91,19.49],[40.85,19.56],[40.79,19.65],[40.78,19.72],[40.76,19.76],[40.62,19.82],[40.48,19.99],[40.08,20.27],[39.88,20.29],[39.73,20.39],[39.61,20.52],[39.49,20.74],[39.28,20.97],[39.09,21.31],[39.15,21.43],[39.15,21.52],[39.09,21.66],[39.03,21.78],[38.99,21.88],[39.02,22.03],[39.03,22.2],[39.07,22.29],[39.1,22.39],[39.06,22.59],[39.0,22.7],[39.01,22.77],[38.94,22.8],[38.88,22.88],[38.94,22.88],[38.84,22.99],[38.8,23.05],[38.76,23.19],[38.71,23.31],[38.54,23.56],[38.46,23.71],[38.29,23.91],[38.1,24.06],[37.98,24.12],[37.92,24.19],[37.82,24.19],[37.71,24.27],[37.64,24.28],[37.54,24.29],[37.43,24.46],[37.34,24.62],[37.18,24.82],[37.22,24.87],[37.27,24.96],[37.24,25.07],[37.22,25.15],[37.15,25.29],[36.92,25.64],[36.86,25.69],[36.76,25.75],[36.7,25.9],[36.68,26.04],[36.52,26.1],[36.25,26.59],[36.09,26.77],[36.03,26.88],[35.85,27.07],[35.76,27.26],[35.58,27.43],[35.42,27.73],[35.18,28.03],[35.08,28.09],[34.83,28.11],[34.72,28.13],[34.62,28.06],[34.62,28.15],[34.68,28.26],[34.78,28.51],[34.8,28.72],[34.95,29.35],[35.16,29.32],[35.34,29.29],[35.6,29.25],[35.86,29.21],[36.02,29.19],[36.07,29.2],[36.28,29.36],[36.48,29.5],[36.59,29.67],[36.7,29.83],[36.76,29.87],[36.93,29.9],[37.2,29.95],[37.47,30.0],[37.49,30.01],[37.55,30.14],[37.63,30.31],[37.65,30.33],[37.67,30.35],[37.86,30.44],[37.98,30.5],[37.81,30.67],[37.66,30.83],[37.48,31.01],[37.33,31.15],[37.11,31.36],[36.96,31.49],[37.22,31.56],[37.49,31.63],[37.77,31.7],[38.11,31.78],[38.38,31.85],[38.77,31.95],[38.96,31.99],[39.0,32.01],[39.15,32.12],[39.37,32.09],[39.7,32.04],[40.03,32.0],[40.37,31.94],[40.48,31.89],[40.81,31.73],[41.02,31.62],[41.27,31.49],[41.59,31.33],[41.8,31.22],[42.07,31.08],[42.29,30.92],[42.56,30.72],[42.86,30.5],[43.1,30.32],[43.44,30.08],[43.77,29.85],[44.1,29.62],[44.36,29.44],[44.69,29.2],[44.72,29.19],[45.05,29.17],[45.5,29.13],[45.95,29.1],[46.36,29.06],[46.53,29.1],[46.72,29.07],[46.98,29.05],[47.14,29.03],[47.43,28.99],[47.52,28.84],[47.55,28.73],[47.58,28.63],[47.67,28.53],[47.87,28.54],[48.05,28.54],[48.27,28.54],[48.44,28.54],[48.5,28.45],[48.52,28.36],[48.63,28.13],[48.77,27.96],[48.81,27.9],[48.83,27.8],[48.81,27.77],[48.8,27.72],[48.91,27.63],[49.09,27.55],[49.16,27.53],[49.24,27.49],[49.18,27.44],[49.28,27.31],[49.41,27.18],[49.54,27.15],[49.72,26.96],[49.99,26.83],[50.15,26.66],[50.13,26.66],[50.09,26.68],[50.03,26.7],[50.01,26.68],[50.01,26.61],[50.03,26.53],[50.11,26.46],[50.18,26.4],[50.21,26.31],[50.16,26.1],[50.14,26.1],[50.1,26.12],[50.05,26.12],[50.03,26.11],[50.08,25.96],[50.13,25.85],[50.19,25.76],[50.24,25.62],[50.28,25.57],[50.46,25.42],[50.51,25.31],[50.56,25.09],[50.67,24.96],[50.73,24.87],[50.8,24.79],[50.86,24.68],[50.93,24.6],[50.97,24.57],[51.02,24.57],[51.09,24.56],[51.18,24.59],[51.27,24.61],[51.34,24.56],[51.41,24.57],[51.42,24.53],[51.37,24.48],[51.31,24.34],[51.4,24.32],[51.48,24.31],[51.53,24.29],[51.57,24.29]],[[41.99,16.72],[42.07,16.71],[42.03,16.74],[42.03,16.76],[42.06,16.8],[42.17,16.71],[42.17,16.6],[42.16,16.57],[42.13,16.59],[42.11,16.62],[42.1,16.64],[42.07,16.67],[41.96,16.65],[41.9,16.68],[41.8,16.78],[41.78,16.85],[41.82,16.86],[41.86,16.89],[41.88,16.95],[41.86,17.0],[41.92,16.99],[41.95,16.94],[41.95,16.81],[41.96,16.78],[41.95,16.75],[41.99,16.72]],[[36.9,25.38],[36.88,25.38],[36.81,25.45],[36.76,25.5],[36.72,25.53],[36.53,25.6],[36.5,25.65],[36.53,25.69],[36.55,25.65],[36.59,25.62],[36.75,25.56],[36.92,25.43],[36.95,25.41],[36.9,25.38]],[[36.6,25.71],[36.59,25.7],[36.54,25.73],[36.55,25.81],[36.58,25.86],[36.58,25.8],[36.6,25.73],[36.6,25.71]]]},{"n":"Sudan","r":[[[24.15,8.67],[24.05,8.69],[23.92,8.71],[23.68,8.73],[23.58,8.77],[23.54,8.82],[23.55,8.94],[23.53,8.97],[23.49,8.99],[23.46,9.05],[23.47,9.11],[23.6,9.26],[23.62,9.34],[23.64,9.61],[23.66,9.71],[23.65,9.82],[23.55,10.03],[23.46,10.17],[23.31,10.39],[23.26,10.46],[22.96,10.75],[22.93,10.8],[22.86,10.92],[22.89,11.03],[22.94,11.19],[22.94,11.27],[22.92,11.34],[22.85,11.4],[22.78,11.41],[22.75,11.44],[22.7,11.48],[22.64,11.52],[22.59,11.58],[22.56,11.67],[22.58,11.99],[22.56,12.03],[22.49,12.04],[22.47,12.07],[22.48,12.13],[22.44,12.31],[22.39,12.46],[22.41,12.55],[22.35,12.66],[22.23,12.71],[22.12,12.69],[22.0,12.67],[21.93,12.68],[21.88,12.7],[21.84,12.74],[21.83,12.79],[21.84,12.86],[21.91,13.0],[21.99,13.11],[22.16,13.22],[22.2,13.27],[22.23,13.33],[22.23,13.4],[22.22,13.47],[22.2,13.54],[22.15,13.63],[22.11,13.73],[22.11,13.8],[22.13,13.85],[22.17,13.91],[22.26,13.98],[22.28,13.99],[22.34,14.03],[22.39,14.06],[22.51,14.13],[22.54,14.16],[22.53,14.2],[22.5,14.24],[22.45,14.28],[22.44,14.34],[22.42,14.44],[22.4,14.5],[22.38,14.55],[22.42,14.59],[22.47,14.63],[22.53,14.66],[22.63,14.69],[22.67,14.72],[22.68,14.79],[22.68,14.85],[22.71,14.9],[22.76,15.0],[22.8,15.04],[22.87,15.1],[22.93,15.16],[22.96,15.24],[22.97,15.31],[22.93,15.53],[23.01,15.63],[23.11,15.7],[23.24,15.7],[23.46,15.71],[23.6,15.75],[23.71,15.74],[23.95,15.7],[23.97,15.71],[23.97,15.72],[23.98,15.78],[23.98,15.93],[23.98,16.37],[23.98,16.82],[23.98,17.27],[23.98,17.71],[23.98,18.16],[23.98,18.6],[23.98,19.05],[23.98,19.5],[23.98,19.62],[23.98,19.75],[23.98,19.87],[23.98,20.0],[24.23,20.0],[24.47,20.0],[24.72,20.0],[24.97,20.0],[24.97,20.0],[24.97,20.0],[24.98,20.0],[24.98,20.0],[24.98,20.5],[24.98,21.0],[24.98,21.5],[24.98,22.0],[25.36,22.0],[25.74,22.0],[26.13,22.0],[26.51,22.0],[26.89,22.0],[27.27,22.0],[27.65,22.0],[28.04,22.0],[28.42,22.0],[28.8,22.0],[29.18,22.0],[29.56,22.0],[29.95,22.0],[30.33,22.0],[30.71,21.99],[31.09,21.99],[31.21,21.99],[31.26,22.0],[31.36,22.19],[31.4,22.2],[31.46,22.19],[31.49,22.15],[31.47,22.08],[31.43,22.0],[31.62,22.0],[31.95,22.0],[32.28,22.0],[32.61,22.0],[32.93,22.0],[33.26,22.0],[33.59,22.0],[33.92,22.0],[34.25,22.0],[34.57,22.0],[34.9,22.0],[35.23,22.0],[35.56,22.0],[35.89,22.0],[36.22,22.0],[36.54,22.0],[36.87,22.0],[36.88,21.77],[36.93,21.59],[37.08,21.33],[37.21,21.19],[37.26,21.11],[37.26,21.07],[37.26,21.04],[37.22,21.08],[37.15,21.1],[37.14,20.98],[37.16,20.89],[37.17,20.73],[37.23,20.56],[37.19,20.39],[37.19,20.12],[37.26,19.79],[37.25,19.58],[37.36,19.09],[37.47,18.82],[37.53,18.75],[37.6,18.72],[37.73,18.69],[37.92,18.56],[38.07,18.41],[38.13,18.33],[38.2,18.25],[38.25,18.26],[38.28,18.29],[38.33,18.22],[38.57,18.07],[38.61,18.01],[38.52,17.94],[38.42,17.82],[38.4,17.78],[38.39,17.75],[38.37,17.72],[38.35,17.68],[38.29,17.64],[38.27,17.62],[38.25,17.58],[38.22,17.56],[38.18,17.56],[38.15,17.55],[38.1,17.53],[38.03,17.54],[37.95,17.52],[37.92,17.49],[37.86,17.47],[37.8,17.47],[37.78,17.46],[37.73,17.42],[37.66,17.37],[37.58,17.34],[37.55,17.32],[37.51,17.29],[37.45,17.11],[37.41,17.06],[37.34,17.06],[37.25,17.06],[37.17,17.04],[37.06,17.06],[37.01,17.06],[37.0,17.02],[36.98,16.87],[36.98,16.8],[36.94,16.72],[36.89,16.62],[36.91,16.46],[36.91,16.3],[36.83,16.05],[36.81,15.99],[36.72,15.8],[36.68,15.73],[36.57,15.36],[36.52,15.25],[36.43,15.13],[36.45,14.94],[36.47,14.74],[36.49,14.54],[36.52,14.26],[36.44,13.99],[36.45,13.84],[36.39,13.63],[36.35,13.53],[36.31,13.47],[36.27,13.41],[36.21,13.27],[36.16,13.09],[36.14,12.91],[36.14,12.81],[36.13,12.76],[36.11,12.73],[35.99,12.71],[35.82,12.68],[35.73,12.66],[35.67,12.62],[35.6,12.54],[35.45,12.3],[35.37,12.16],[35.25,11.96],[35.11,11.82],[35.08,11.75],[35.06,11.62],[35.01,11.42],[34.96,11.28],[34.97,11.16],[34.92,10.96],[34.93,10.86],[34.88,10.81],[34.82,10.76],[34.77,10.75],[34.67,10.8],[34.6,10.86],[34.57,10.88],[34.51,10.84],[34.43,10.79],[34.34,10.66],[34.28,10.53],[34.31,10.25],[34.31,10.19],[34.29,10.12],[34.19,9.92],[34.16,9.85],[34.12,9.73],[34.08,9.51],[34.08,9.46],[34.08,9.46],[33.89,9.46],[33.89,9.46],[33.88,9.47],[33.88,9.47],[33.88,9.48],[33.87,9.51],[33.87,9.55],[33.87,9.63],[33.89,9.72],[33.96,9.85],[33.96,9.86],[33.96,9.86],[33.96,9.87],[33.96,9.89],[33.95,9.91],[33.95,9.94],[33.96,10.01],[33.96,10.03],[33.96,10.05],[33.95,10.07],[33.91,10.18],[33.89,10.2],[33.46,10.55],[33.38,10.65],[33.37,10.65],[33.36,10.66],[33.14,10.74],[33.13,10.75],[33.13,10.76],[33.14,10.77],[33.16,10.82],[33.17,10.83],[33.17,10.85],[33.07,11.59],[33.07,11.61],[33.08,11.62],[33.08,11.62],[33.09,11.64],[33.11,11.65],[33.12,11.68],[33.12,11.69],[33.14,11.83],[33.14,11.94],[33.19,12.14],[33.2,12.22],[32.72,12.22],[32.72,12.22],[32.72,12.21],[32.72,12.21],[32.72,12.2],[32.72,12.19],[32.72,12.16],[32.72,12.15],[32.72,12.14],[32.72,12.09],[32.74,12.06],[32.74,12.05],[32.74,12.03],[32.74,12.01],[32.07,12.01],[32.34,11.72],[32.34,11.71],[32.34,11.69],[32.34,11.68],[32.35,11.58],[32.34,11.42],[32.34,11.31],[32.35,11.25],[32.43,11.11],[32.42,11.09],[32.4,11.06],[31.93,10.66],[31.92,10.64],[31.85,10.48],[31.79,10.38],[31.76,10.36],[31.65,10.22],[31.22,9.8],[31.15,9.77],[30.94,9.76],[30.83,9.76],[30.81,9.75],[30.79,9.75],[30.78,9.73],[30.77,9.73],[30.76,9.73],[30.74,9.74],[30.47,9.98],[30.0,10.28],[29.96,10.25],[29.69,10.12],[29.64,10.09],[29.61,10.07],[29.6,9.92],[29.56,9.85],[29.47,9.77],[29.24,9.72],[29.12,9.67],[29.0,9.61],[28.98,9.59],[28.98,9.59],[28.93,9.55],[28.84,9.46],[28.83,9.39],[28.84,9.33],[28.05,9.33],[28.0,9.38],[27.89,9.6],[27.88,9.6],[27.8,9.59],[27.07,9.61],[26.97,9.59],[26.76,9.5],[26.66,9.48],[26.55,9.53],[26.17,9.97],[26.09,10.02],[26.06,10.05],[26.0,10.12],[25.92,10.17],[25.89,10.2],[25.88,10.25],[25.89,10.35],[25.86,10.41],[25.8,10.42],[25.29,10.32],[25.21,10.33],[25.1,10.31],[25.07,10.29],[25.02,10.24],[25.01,10.18],[25.02,10.12],[25.0,10.06],[24.96,9.99],[24.82,9.84],[24.79,9.77],[24.79,9.61],[24.78,9.53],[24.76,9.49],[24.7,9.43],[24.67,9.39],[24.66,9.34],[24.66,9.23],[24.65,9.18],[24.57,9.05],[24.55,9.01],[24.54,8.91],[24.53,8.89],[24.3,8.81],[24.21,8.77],[24.16,8.7],[24.15,8.67]]]},{"n":"South Sudan","r":[[[27.4,5.11],[27.33,5.19],[27.26,5.29],[27.23,5.44],[27.23,5.56],[27.21,5.62],[27.18,5.68],[27.14,5.72],[27.08,5.78],[26.94,5.85],[26.8,5.95],[26.73,6.0],[26.59,6.02],[26.51,6.07],[26.45,6.18],[26.42,6.27],[26.35,6.34],[26.32,6.4],[26.31,6.46],[26.36,6.64],[26.28,6.7],[26.17,6.78],[26.09,6.87],[26.04,6.96],[25.89,7.06],[25.57,7.23],[25.38,7.33],[25.28,7.43],[25.19,7.52],[25.18,7.56],[25.24,7.65],[25.25,7.72],[25.2,7.81],[25.01,7.96],[24.85,8.14],[24.74,8.19],[24.46,8.24],[24.38,8.26],[24.29,8.29],[24.21,8.37],[24.18,8.46],[24.22,8.61],[24.19,8.65],[24.15,8.67],[24.16,8.7],[24.21,8.77],[24.3,8.81],[24.53,8.89],[24.54,8.91],[24.55,9.01],[24.57,9.05],[24.65,9.18],[24.66,9.23],[24.66,9.34],[24.67,9.39],[24.7,9.43],[24.76,9.49],[24.78,9.53],[24.79,9.61],[24.79,9.77],[24.82,9.84],[24.96,9.99],[25.0,10.06],[25.02,10.12],[25.01,10.18],[25.02,10.24],[25.07,10.29],[25.1,10.31],[25.21,10.33],[25.29,10.32],[25.8,10.42],[25.86,10.41],[25.89,10.35],[25.88,10.25],[25.89,10.2],[25.92,10.17],[26.0,10.12],[26.06,10.05],[26.09,10.02],[26.17,9.97],[26.55,9.53],[26.66,9.48],[26.76,9.5],[26.97,9.59],[27.07,9.61],[27.8,9.59],[27.88,9.6],[27.89,9.6],[28.0,9.38],[28.05,9.33],[28.84,9.33],[28.83,9.39],[28.84,9.46],[28.93,9.55],[28.98,9.59],[28.98,9.59],[29.0,9.61],[29.12,9.67],[29.24,9.72],[29.47,9.77],[29.56,9.85],[29.6,9.92],[29.61,10.07],[29.64,10.09],[29.69,10.12],[29.96,10.25],[30.0,10.28],[30.47,9.98],[30.74,9.74],[30.76,9.73],[30.77,9.73],[30.78,9.73],[30.79,9.75],[30.81,9.75],[30.83,9.76],[30.94,9.76],[31.15,9.77],[31.22,9.8],[31.65,10.22],[31.76,10.36],[31.79,10.38],[31.85,10.48],[31.92,10.64],[31.93,10.66],[32.4,11.06],[32.42,11.09],[32.43,11.11],[32.35,11.25],[32.34,11.31],[32.34,11.42],[32.35,11.58],[32.34,11.68],[32.34,11.69],[32.34,11.71],[32.34,11.72],[32.07,12.01],[32.74,12.01],[32.74,12.03],[32.74,12.05],[32.74,12.06],[32.72,12.09],[32.72,12.14],[32.72,12.15],[32.72,12.16],[32.72,12.19],[32.72,12.2],[32.72,12.21],[32.72,12.21],[32.72,12.22],[32.72,12.22],[33.2,12.22],[33.19,12.14],[33.14,11.94],[33.14,11.83],[33.12,11.69],[33.12,11.68],[33.11,11.65],[33.09,11.64],[33.08,11.62],[33.08,11.62],[33.07,11.61],[33.07,11.59],[33.17,10.85],[33.17,10.83],[33.16,10.82],[33.14,10.77],[33.13,10.76],[33.13,10.75],[33.14,10.74],[33.36,10.66],[33.37,10.65],[33.38,10.65],[33.46,10.55],[33.89,10.2],[33.91,10.18],[33.95,10.07],[33.96,10.05],[33.96,10.03],[33.96,10.01],[33.95,9.94],[33.95,9.91],[33.96,9.89],[33.96,9.87],[33.96,9.86],[33.96,9.86],[33.96,9.85],[33.89,9.72],[33.87,9.63],[33.87,9.55],[33.87,9.51],[33.88,9.48],[33.88,9.47],[33.88,9.47],[33.89,9.46],[33.89,9.46],[34.08,9.46],[34.08,9.46],[34.08,9.42],[34.08,9.22],[34.09,9.04],[34.1,8.75],[34.1,8.68],[34.09,8.58],[34.07,8.55],[34.02,8.49],[33.95,8.44],[33.79,8.43],[33.64,8.43],[33.55,8.44],[33.41,8.45],[33.28,8.44],[33.23,8.4],[33.17,8.25],[33.07,8.04],[33.01,7.95],[33.0,7.9],[33.01,7.87],[33.08,7.82],[33.23,7.76],[33.39,7.72],[33.52,7.71],[33.6,7.69],[33.67,7.67],[33.9,7.51],[33.98,7.43],[34.02,7.37],[34.03,7.3],[34.06,7.23],[34.2,7.08],[34.28,7.0],[34.48,6.9],[34.56,6.78],[34.64,6.72],[34.71,6.66],[34.75,6.57],[34.84,6.3],[34.9,6.16],[34.96,6.05],[34.98,5.86],[35.03,5.77],[35.08,5.67],[35.16,5.58],[35.25,5.51],[35.27,5.49],[35.08,5.31],[34.88,5.11],[34.64,4.88],[34.38,4.62],[34.18,4.42],[33.98,4.22],[33.74,3.99],[33.57,3.81],[33.54,3.79],[33.49,3.76],[33.32,3.75],[33.15,3.77],[33.0,3.88],[32.84,3.8],[32.74,3.77],[32.68,3.76],[32.53,3.75],[32.34,3.71],[32.25,3.65],[32.2,3.61],[32.16,3.53],[32.14,3.52],[32.1,3.53],[32.05,3.56],[31.94,3.61],[31.89,3.71],[31.84,3.77],[31.8,3.8],[31.63,3.7],[31.55,3.68],[31.48,3.68],[31.36,3.74],[31.22,3.79],[31.15,3.79],[31.05,3.72],[30.93,3.63],[30.87,3.54],[30.84,3.49],[30.82,3.53],[30.8,3.57],[30.76,3.62],[30.7,3.64],[30.65,3.63],[30.59,3.62],[30.56,3.65],[30.55,3.72],[30.54,3.79],[30.51,3.84],[30.42,3.88],[30.19,3.98],[30.02,4.18],[29.93,4.27],[29.87,4.33],[29.78,4.48],[29.68,4.59],[29.55,4.64],[29.47,4.61],[29.38,4.5],[29.22,4.39],[29.15,4.39],[29.06,4.45],[28.94,4.49],[28.73,4.5],[28.64,4.45],[28.52,4.37],[28.43,4.32],[28.37,4.32],[28.31,4.34],[28.25,4.35],[28.19,4.35],[28.08,4.42],[28.02,4.48],[27.98,4.53],[27.92,4.57],[27.84,4.6],[27.79,4.64],[27.76,4.7],[27.72,4.78],[27.66,4.85],[27.49,4.97],[27.44,5.04],[27.4,5.11]]]},{"n":"Senegal","r":[[[-11.39,12.4],[-11.46,12.42],[-11.57,12.43],[-11.81,12.39],[-11.89,12.4],[-12.04,12.4],[-12.15,12.38],[-12.29,12.33],[-12.4,12.34],[-12.46,12.38],[-12.53,12.38],[-12.62,12.4],[-12.71,12.43],[-12.8,12.45],[-12.89,12.52],[-12.93,12.53],[-12.96,12.51],[-12.99,12.49],[-13.01,12.48],[-13.06,12.49],[-13.08,12.54],[-13.06,12.58],[-13.06,12.62],[-13.08,12.63],[-13.14,12.64],[-13.23,12.64],[-13.37,12.65],[-13.41,12.66],[-13.73,12.67],[-14.06,12.68],[-14.35,12.68],[-14.71,12.68],[-14.96,12.68],[-15.2,12.68],[-15.38,12.59],[-15.57,12.49],[-15.84,12.44],[-16.14,12.46],[-16.24,12.44],[-16.34,12.4],[-16.42,12.37],[-16.52,12.35],[-16.66,12.36],[-16.71,12.35],[-16.75,12.4],[-16.78,12.47],[-16.76,12.53],[-16.68,12.56],[-16.55,12.6],[-16.49,12.58],[-16.45,12.58],[-16.44,12.61],[-16.46,12.62],[-16.55,12.66],[-16.6,12.72],[-16.64,12.69],[-16.67,12.62],[-16.7,12.6],[-16.74,12.59],[-16.77,12.63],[-16.78,12.67],[-16.76,12.7],[-16.77,12.88],[-16.76,12.98],[-16.76,13.06],[-16.7,13.12],[-16.65,13.15],[-16.43,13.16],[-16.23,13.16],[-16.03,13.16],[-15.83,13.16],[-15.81,13.33],[-15.75,13.34],[-15.66,13.36],[-15.48,13.38],[-15.29,13.4],[-15.24,13.43],[-15.21,13.49],[-15.19,13.54],[-15.15,13.56],[-15.1,13.54],[-15.02,13.51],[-14.95,13.47],[-14.87,13.43],[-14.81,13.41],[-14.67,13.35],[-14.44,13.27],[-14.25,13.24],[-14.01,13.3],[-13.85,13.34],[-13.83,13.41],[-13.85,13.48],[-13.98,13.54],[-14.15,13.54],[-14.2,13.52],[-14.28,13.5],[-14.33,13.49],[-14.41,13.5],[-14.51,13.56],[-14.57,13.62],[-14.66,13.64],[-14.77,13.67],[-14.94,13.79],[-15.02,13.81],[-15.11,13.81],[-15.27,13.79],[-15.43,13.73],[-15.51,13.59],[-15.67,13.59],[-16.0,13.59],[-16.31,13.6],[-16.56,13.59],[-16.59,13.69],[-16.65,13.77],[-16.75,13.84],[-16.77,13.9],[-16.73,13.96],[-16.64,14.01],[-16.62,14.04],[-16.67,14.04],[-16.74,14.01],[-16.79,14.0],[-16.8,14.09],[-16.88,14.21],[-16.97,14.4],[-17.08,14.48],[-17.17,14.64],[-17.26,14.7],[-17.35,14.73],[-17.42,14.72],[-17.45,14.65],[-17.54,14.76],[-17.41,14.79],[-17.15,14.92],[-16.84,15.29],[-16.57,15.73],[-16.54,15.84],[-16.5,15.92],[-16.48,16.1],[-16.44,16.2],[-16.4,16.22],[-16.36,16.31],[-16.3,16.45],[-16.24,16.53],[-16.17,16.55],[-16.11,16.54],[-16.07,16.51],[-15.96,16.49],[-15.77,16.49],[-15.62,16.51],[-15.52,16.56],[-15.38,16.58],[-15.21,16.58],[-15.12,16.6],[-15.11,16.64],[-15.09,16.66],[-15.06,16.64],[-15.02,16.65],[-14.99,16.68],[-14.96,16.68],[-14.93,16.65],[-14.79,16.65],[-14.53,16.66],[-14.3,16.58],[-14.09,16.42],[-13.98,16.31],[-13.97,16.26],[-13.93,16.2],[-13.87,16.15],[-13.81,16.14],[-13.76,16.17],[-13.71,16.17],[-13.68,16.13],[-13.62,16.12],[-13.56,16.14],[-13.51,16.14],[-13.5,16.11],[-13.49,16.1],[-13.45,16.09],[-13.41,16.06],[-13.35,15.97],[-13.3,15.85],[-13.26,15.7],[-13.21,15.62],[-13.14,15.6],[-13.11,15.57],[-13.1,15.54],[-13.08,15.51],[-13.05,15.5],[-12.99,15.5],[-12.93,15.45],[-12.86,15.34],[-12.85,15.29],[-12.86,15.26],[-12.86,15.24],[-12.81,15.22],[-12.77,15.19],[-12.74,15.13],[-12.66,15.08],[-12.54,15.04],[-12.46,14.97],[-12.41,14.89],[-12.3,14.82],[-12.28,14.81],[-12.19,14.65],[-12.21,14.57],[-12.23,14.46],[-12.18,14.38],[-12.11,14.32],[-12.07,14.27],[-12.02,14.21],[-12.01,14.07],[-12.02,13.97],[-11.99,13.93],[-11.96,13.88],[-11.97,13.83],[-11.98,13.79],[-12.04,13.73],[-12.05,13.63],[-11.96,13.51],[-11.89,13.44],[-11.9,13.41],[-11.88,13.36],[-11.83,13.32],[-11.8,13.33],[-11.77,13.37],[-11.76,13.39],[-11.67,13.38],[-11.63,13.37],[-11.58,13.29],[-11.56,13.24],[-11.55,13.17],[-11.49,13.09],[-11.44,13.03],[-11.43,12.99],[-11.39,12.94],[-11.42,12.83],[-11.41,12.78],[-11.44,12.63],[-11.45,12.56],[-11.45,12.53],[-11.38,12.48],[-11.39,12.4]]]},{"n":"Singapore","r":[[[103.97,1.33],[103.82,1.27],[103.65,1.33],[103.71,1.42],[103.82,1.45],[103.91,1.42],[103.96,1.39],[104.0,1.37],[103.97,1.33]]]},{"n":"South Georgia and the Islands","r":[[[-26.26,-58.44],[-26.26,-58.49],[-26.42,-58.44],[-26.45,-58.42],[-26.4,-58.38],[-26.3,-58.38],[-26.28,-58.4],[-26.26,-58.44]],[[-37.1,-54.07],[-37.01,-54.11],[-36.93,-54.08],[-36.85,-54.09],[-36.81,-54.1],[-36.76,-54.11],[-36.7,-54.11],[-36.61,-54.19],[-36.65,-54.26],[-36.54,-54.25],[-36.45,-54.31],[-36.41,-54.3],[-36.39,-54.28],[-36.33,-54.25],[-36.29,-54.29],[-36.24,-54.36],[-36.17,-54.38],[-36.12,-54.46],[-36.07,-54.55],[-36.03,-54.57],[-35.96,-54.57],[-35.9,-54.55],[-35.92,-54.64],[-35.91,-54.71],[-35.8,-54.76],[-35.87,-54.79],[-35.94,-54.83],[-36.09,-54.87],[-36.12,-54.85],[-36.25,-54.78],[-36.31,-54.69],[-36.45,-54.57],[-36.47,-54.53],[-36.51,-54.51],[-36.63,-54.5],[-36.73,-54.47],[-36.82,-54.4],[-36.85,-54.37],[-36.89,-54.34],[-37.01,-54.34],[-37.08,-54.31],[-37.16,-54.27],[-37.5,-54.16],[-37.63,-54.17],[-37.69,-54.13],[-37.69,-54.08],[-37.62,-54.04],[-37.91,-54.03],[-38.02,-54.01],[-37.95,-54.0],[-37.54,-53.99],[-37.38,-53.98],[-37.37,-54.01],[-37.23,-54.06],[-37.1,-54.07]]]},{"n":"Saint Helena","r":[[[-5.69,-16.0],[-5.78,-16.0],[-5.78,-15.96],[-5.71,-15.91],[-5.66,-15.91],[-5.66,-15.97],[-5.69,-16.0]],[[-14.36,-7.97],[-14.4,-7.98],[-14.41,-7.97],[-14.41,-7.94],[-14.4,-7.91],[-14.38,-7.88],[-14.36,-7.89],[-14.33,-7.91],[-14.3,-7.94],[-14.32,-7.96],[-14.36,-7.97]]]},{"n":"Solomon Islands","r":[[[166.93,-11.67],[166.84,-11.68],[166.81,-11.68],[166.75,-11.59],[166.79,-11.57],[166.86,-11.58],[166.88,-11.63],[166.93,-11.67]],[[160.58,-11.8],[160.51,-11.83],[160.44,-11.81],[160.39,-11.79],[160.36,-11.71],[160.27,-11.66],[160.15,-11.64],[160.1,-11.61],[160.09,-11.59],[160.0,-11.58],[159.98,-11.54],[159.99,-11.49],[160.0,-11.47],[160.08,-11.49],[160.45,-11.7],[160.54,-11.76],[160.58,-11.8]],[[166.13,-10.76],[166.05,-10.78],[166.03,-10.77],[165.97,-10.78],[165.9,-10.85],[165.86,-10.84],[165.82,-10.84],[165.79,-10.78],[165.79,-10.76],[165.84,-10.76],[165.86,-10.7],[165.91,-10.67],[166.02,-10.66],[166.13,-10.68],[166.16,-10.69],[166.13,-10.75],[166.13,-10.76]],[[161.72,-10.39],[161.84,-10.45],[161.91,-10.44],[162.02,-10.48],[162.11,-10.45],[162.16,-10.51],[162.29,-10.71],[162.29,-10.78],[162.37,-10.82],[162.3,-10.83],[162.2,-10.81],[162.12,-10.82],[162.04,-10.78],[161.91,-10.76],[161.79,-10.72],[161.54,-10.57],[161.54,-10.49],[161.5,-10.45],[161.49,-10.36],[161.4,-10.33],[161.29,-10.33],[161.29,-10.28],[161.3,-10.2],[161.38,-10.21],[161.48,-10.24],[161.65,-10.35],[161.7,-10.37],[161.72,-10.39]],[[161.55,-9.63],[161.56,-9.73],[161.55,-9.77],[161.48,-9.69],[161.44,-9.72],[161.41,-9.68],[161.41,-9.6],[161.42,-9.51],[161.4,-9.45],[161.36,-9.35],[161.41,-9.37],[161.55,-9.63]],[[159.75,-9.27],[159.97,-9.43],[160.07,-9.42],[160.35,-9.42],[160.53,-9.54],[160.63,-9.59],[160.68,-9.69],[160.75,-9.72],[160.79,-9.77],[160.82,-9.86],[160.8,-9.88],[160.71,-9.91],[160.65,-9.93],[160.48,-9.89],[160.32,-9.82],[160.0,-9.81],[159.85,-9.79],[159.8,-9.76],[159.76,-9.73],[159.68,-9.64],[159.62,-9.53],[159.61,-9.47],[159.61,-9.35],[159.63,-9.31],[159.69,-9.27],[159.75,-9.27]],[[160.17,-9.0],[160.23,-9.01],[160.25,-9.01],[160.32,-9.06],[160.41,-9.14],[160.37,-9.18],[160.3,-9.16],[160.28,-9.17],[160.27,-9.16],[160.25,-9.12],[160.18,-9.08],[160.11,-9.08],[160.1,-9.03],[160.17,-9.0]],[[159.19,-9.12],[159.18,-9.13],[159.13,-9.11],[159.07,-9.11],[159.04,-9.07],[159.08,-9.03],[159.13,-8.99],[159.15,-9.0],[159.18,-9.02],[159.23,-9.03],[159.23,-9.09],[159.19,-9.12]],[[157.65,-8.76],[157.64,-8.79],[157.59,-8.78],[157.46,-8.73],[157.45,-8.71],[157.53,-8.7],[157.58,-8.7],[157.62,-8.73],[157.65,-8.76]],[[158.2,-8.82],[158.18,-8.83],[158.16,-8.79],[158.21,-8.68],[158.24,-8.76],[158.25,-8.8],[158.2,-8.82]],[[158.11,-8.68],[158.01,-8.76],[157.94,-8.74],[157.88,-8.67],[157.9,-8.59],[157.91,-8.57],[157.94,-8.56],[157.97,-8.54],[158.0,-8.51],[158.11,-8.54],[158.13,-8.56],[158.07,-8.61],[158.09,-8.62],[158.1,-8.65],[158.11,-8.68]],[[157.39,-8.71],[157.39,-8.73],[157.33,-8.7],[157.21,-8.57],[157.23,-8.52],[157.35,-8.43],[157.38,-8.42],[157.41,-8.48],[157.38,-8.56],[157.35,-8.58],[157.33,-8.65],[157.39,-8.71]],[[159.69,-8.51],[159.64,-8.52],[159.57,-8.48],[159.54,-8.45],[159.55,-8.4],[159.59,-8.38],[159.64,-8.41],[159.65,-8.45],[159.69,-8.51]],[[160.75,-8.31],[161.0,-8.61],[160.99,-8.66],[160.95,-8.7],[160.94,-8.8],[160.98,-8.84],[161.04,-8.86],[161.16,-8.96],[161.2,-9.09],[161.21,-9.13],[161.26,-9.19],[161.26,-9.32],[161.37,-9.49],[161.38,-9.57],[161.37,-9.61],[161.32,-9.59],[161.19,-9.39],[161.04,-9.31],[161.02,-9.27],[160.87,-9.16],[160.77,-8.96],[160.66,-8.62],[160.71,-8.54],[160.59,-8.37],[160.6,-8.33],[160.65,-8.34],[160.68,-8.34],[160.7,-8.32],[160.75,-8.31]],[[157.76,-8.24],[157.83,-8.32],[157.9,-8.51],[157.89,-8.57],[157.83,-8.57],[157.82,-8.61],[157.75,-8.52],[157.66,-8.5],[157.59,-8.45],[157.56,-8.34],[157.56,-8.27],[157.5,-8.26],[157.35,-8.28],[157.3,-8.33],[157.23,-8.31],[157.22,-8.26],[157.23,-8.21],[157.32,-8.16],[157.34,-8.1],[157.43,-7.98],[157.49,-7.97],[157.6,-8.01],[157.61,-8.16],[157.65,-8.22],[157.76,-8.24]],[[156.6,-8.17],[156.59,-8.2],[156.54,-8.07],[156.54,-8.01],[156.55,-7.97],[156.57,-7.96],[156.61,-8.1],[156.6,-8.17]],[[157.17,-8.11],[157.15,-8.12],[157.04,-8.12],[156.96,-8.01],[156.96,-7.94],[157.02,-7.87],[157.1,-7.86],[157.15,-7.88],[157.19,-7.94],[157.2,-8.02],[157.19,-8.08],[157.17,-8.11]],[[156.69,-7.92],[156.67,-7.94],[156.64,-7.88],[156.61,-7.87],[156.61,-7.81],[156.51,-7.71],[156.5,-7.64],[156.56,-7.57],[156.64,-7.61],[156.72,-7.7],[156.81,-7.72],[156.79,-7.78],[156.71,-7.88],[156.69,-7.92]],[[159.88,-8.53],[159.88,-8.56],[159.75,-8.47],[159.64,-8.37],[159.35,-8.26],[159.29,-8.2],[159.24,-8.2],[159.09,-8.1],[158.94,-8.04],[158.85,-7.96],[158.83,-7.93],[158.78,-7.91],[158.69,-7.82],[158.6,-7.76],[158.57,-7.65],[158.48,-7.58],[158.46,-7.54],[158.73,-7.6],[158.86,-7.72],[158.97,-7.79],[159.01,-7.84],[159.11,-7.9],[159.2,-7.91],[159.29,-7.98],[159.37,-7.99],[159.43,-8.03],[159.84,-8.33],[159.79,-8.41],[159.85,-8.46],[159.88,-8.53]],[[155.84,-7.1],[155.74,-7.12],[155.68,-7.09],[155.7,-7.01],[155.74,-6.97],[155.86,-7.04],[155.84,-7.1]],[[157.49,-7.33],[157.52,-7.37],[157.44,-7.43],[157.34,-7.39],[157.32,-7.36],[157.31,-7.34],[157.24,-7.35],[157.1,-7.32],[156.9,-7.18],[156.7,-6.91],[156.49,-6.76],[156.46,-6.72],[156.45,-6.64],[156.48,-6.61],[156.6,-6.64],[156.77,-6.76],[157.03,-6.89],[157.1,-6.96],[157.15,-7.11],[157.19,-7.16],[157.34,-7.28],[157.41,-7.31],[157.45,-7.31],[157.49,-7.33]]]},{"n":"Sierra Leone","r":[[[-13.29,9.05],[-13.23,9.07],[-13.18,9.06],[-13.13,9.05],[-13.08,9.07],[-13.03,9.1],[-13.0,9.15],[-12.96,9.26],[-12.83,9.3],[-12.76,9.37],[-12.68,9.48],[-12.65,9.56],[-12.62,9.6],[-12.6,9.63],[-12.59,9.67],[-12.56,9.7],[-12.52,9.79],[-12.5,9.86],[-12.43,9.9],[-12.28,9.93],[-12.14,9.88],[-11.92,9.92],[-11.91,9.99],[-11.71,9.99],[-11.47,10.0],[-11.27,10.0],[-11.21,9.98],[-11.18,9.93],[-11.12,9.84],[-11.05,9.79],[-10.96,9.66],[-10.86,9.52],[-10.76,9.39],[-10.69,9.31],[-10.68,9.29],[-10.69,9.26],[-10.72,9.19],[-10.75,9.12],[-10.75,9.1],[-10.73,9.08],[-10.62,9.06],[-10.61,8.98],[-10.61,8.87],[-10.55,8.76],[-10.5,8.69],[-10.5,8.66],[-10.63,8.53],[-10.68,8.4],[-10.7,8.36],[-10.71,8.34],[-10.69,8.32],[-10.65,8.33],[-10.6,8.32],[-10.56,8.32],[-10.5,8.36],[-10.39,8.48],[-10.36,8.5],[-10.28,8.49],[-10.29,8.45],[-10.31,8.31],[-10.36,8.19],[-10.39,8.16],[-10.52,8.13],[-10.57,8.07],[-10.62,7.9],[-10.65,7.76],[-10.69,7.74],[-10.88,7.54],[-11.0,7.46],[-11.09,7.4],[-11.17,7.31],[-11.27,7.23],[-11.38,7.09],[-11.45,6.95],[-11.51,6.91],[-11.55,6.95],[-11.73,7.09],[-11.93,7.18],[-12.35,7.34],[-12.49,7.39],[-12.48,7.44],[-12.43,7.55],[-12.51,7.67],[-12.48,7.75],[-12.51,7.75],[-12.57,7.7],[-12.7,7.72],[-12.78,7.79],[-12.85,7.82],[-12.88,7.86],[-12.93,8.06],[-12.96,8.15],[-13.02,8.2],[-13.15,8.21],[-13.2,8.34],[-13.27,8.43],[-13.26,8.49],[-13.2,8.48],[-13.16,8.44],[-13.09,8.42],[-12.99,8.53],[-12.91,8.58],[-12.89,8.63],[-12.9,8.66],[-12.95,8.62],[-13.09,8.63],[-13.12,8.59],[-13.18,8.58],[-13.23,8.7],[-13.23,8.77],[-13.21,8.84],[-13.07,8.86],[-13.06,8.88],[-13.15,8.9],[-13.27,8.99],[-13.29,9.05]],[[-12.53,7.44],[-12.54,7.41],[-12.61,7.47],[-12.95,7.57],[-12.85,7.62],[-12.62,7.64],[-12.54,7.61],[-12.51,7.58],[-12.5,7.54],[-12.53,7.44]]]},{"n":"El Salvador","r":[[[-90.1,13.74],[-90.11,13.78],[-90.1,13.83],[-90.05,13.9],[-89.94,14.0],[-89.87,14.05],[-89.84,14.06],[-89.79,14.05],[-89.75,14.08],[-89.71,14.14],[-89.67,14.18],[-89.57,14.22],[-89.55,14.24],[-89.56,14.28],[-89.58,14.35],[-89.57,14.39],[-89.54,14.41],[-89.5,14.41],[-89.42,14.43],[-89.38,14.43],[-89.36,14.42],[-89.34,14.41],[-89.17,14.36],[-89.12,14.37],[-89.06,14.33],[-89.03,14.3],[-89.0,14.25],[-88.87,14.16],[-88.85,14.12],[-88.75,14.07],[-88.71,14.03],[-88.67,14.02],[-88.58,14.0],[-88.51,13.98],[-88.5,13.96],[-88.5,13.9],[-88.48,13.85],[-88.45,13.85],[-88.41,13.88],[-88.28,13.94],[-88.15,13.99],[-88.08,13.96],[-88.04,13.9],[-87.99,13.88],[-87.89,13.89],[-87.8,13.89],[-87.73,13.84],[-87.72,13.81],[-87.76,13.65],[-87.77,13.58],[-87.78,13.52],[-87.76,13.51],[-87.73,13.48],[-87.74,13.45],[-87.81,13.4],[-87.84,13.39],[-87.82,13.29],[-87.88,13.22],[-87.93,13.18],[-88.02,13.17],[-88.18,13.16],[-88.42,13.21],[-88.59,13.28],[-88.69,13.28],[-88.66,13.26],[-88.58,13.24],[-88.48,13.2],[-88.51,13.18],[-88.87,13.28],[-89.28,13.48],[-89.52,13.51],[-89.8,13.56],[-89.97,13.68],[-90.1,13.74]]]},{"n":"San Marino","r":[[[12.4,43.93],[12.44,43.98],[12.5,43.99],[12.51,43.95],[12.49,43.9],[12.43,43.89],[12.4,43.93]]]},{"n":"Somaliland","r":[[[42.92,11.0],[43.05,11.19],[43.16,11.37],[43.25,11.5],[43.44,11.35],[43.63,11.04],[43.85,10.78],[44.16,10.55],[44.28,10.47],[44.39,10.43],[44.94,10.44],[45.34,10.65],[45.7,10.8],[45.82,10.84],[46.02,10.79],[46.25,10.78],[46.46,10.73],[46.57,10.75],[46.97,10.93],[47.23,11.1],[47.4,11.17],[47.47,11.17],[47.71,11.11],[48.02,11.14],[48.44,11.29],[48.57,11.32],[48.67,11.32],[48.9,11.25],[48.94,11.26],[48.94,10.98],[48.94,10.71],[48.94,10.43],[48.94,9.97],[48.94,9.81],[48.94,9.56],[48.94,9.45],[48.79,9.23],[48.62,8.96],[48.43,8.68],[48.27,8.44],[48.13,8.22],[47.98,8.0],[47.64,8.0],[47.31,8.0],[46.98,8.0],[46.92,8.03],[46.64,8.12],[46.3,8.23],[45.86,8.38],[45.56,8.48],[45.23,8.59],[44.89,8.7],[44.63,8.79],[44.31,8.89],[44.02,8.99],[43.98,9.01],[43.83,9.15],[43.62,9.34],[43.58,9.34],[43.48,9.38],[43.39,9.48],[43.3,9.61],[43.22,9.77],[43.18,9.88],[43.07,9.93],[43.01,10.01],[42.91,10.14],[42.84,10.2],[42.82,10.26],[42.78,10.37],[42.73,10.49],[42.67,10.57],[42.66,10.6],[42.66,10.62],[42.76,10.79],[42.81,10.85],[42.86,10.9],[42.91,10.96],[42.92,11.0]]]},{"n":"Somalia","r":[[[41.88,3.98],[41.92,4.03],[42.02,4.14],[42.23,4.2],[42.36,4.21],[42.79,4.29],[42.86,4.32],[42.89,4.36],[42.93,4.45],[43.02,4.56],[43.13,4.64],[43.33,4.75],[43.54,4.84],[43.58,4.85],[43.83,4.91],[43.89,4.93],[43.99,4.95],[44.03,4.95],[44.37,4.93],[44.64,4.92],[44.91,4.9],[44.94,4.91],[45.13,5.12],[45.44,5.46],[45.63,5.67],[45.93,6.0],[46.17,6.23],[46.42,6.5],[46.67,6.74],[46.97,7.03],[47.16,7.21],[47.45,7.49],[47.73,7.76],[47.98,8.0],[48.13,8.22],[48.27,8.44],[48.43,8.68],[48.62,8.96],[48.79,9.23],[48.94,9.45],[48.94,9.56],[48.94,9.81],[48.94,9.97],[48.94,10.43],[48.94,10.71],[48.94,10.98],[48.94,11.26],[49.06,11.27],[49.39,11.34],[49.64,11.45],[50.11,11.53],[50.47,11.73],[50.53,11.82],[50.64,11.94],[50.79,11.98],[51.19,11.84],[51.25,11.83],[51.23,11.75],[51.22,11.66],[51.14,11.51],[51.08,11.34],[51.12,11.08],[51.14,10.66],[51.13,10.6],[51.1,10.54],[51.09,10.49],[51.05,10.47],[51.03,10.44],[51.06,10.43],[51.19,10.48],[51.19,10.53],[51.19,10.55],[51.3,10.5],[51.37,10.48],[51.39,10.42],[51.38,10.39],[51.27,10.4],[51.21,10.43],[51.04,10.39],[50.93,10.34],[50.9,10.25],[50.87,9.92],[50.83,9.71],[50.82,9.43],[50.69,9.24],[50.64,9.11],[50.43,8.85],[50.32,8.62],[50.29,8.51],[50.1,8.2],[49.85,7.96],[49.76,7.66],[49.67,7.47],[49.57,7.3],[49.35,6.99],[49.23,6.78],[49.09,6.41],[49.05,6.17],[48.65,5.49],[48.23,4.95],[47.98,4.5],[47.51,3.97],[46.88,3.29],[46.05,2.48],[45.83,2.31],[44.92,1.81],[44.33,1.39],[44.03,1.11],[43.72,0.86],[43.47,0.62],[42.71,-0.18],[42.63,-0.25],[42.56,-0.32],[42.47,-0.46],[42.4,-0.51],[42.22,-0.74],[42.11,-0.86],[41.98,-0.97],[41.93,-1.06],[41.89,-1.15],[41.85,-1.2],[41.73,-1.43],[41.63,-1.58],[41.53,-1.7],[41.54,-1.61],[41.52,-1.57],[41.43,-1.45],[41.25,-1.22],[41.12,-1.05],[40.98,-0.87],[40.98,-0.73],[40.98,-0.31],[40.97,0.54],[40.97,1.38],[40.97,2.22],[40.97,2.64],[40.96,2.81],[40.98,2.84],[41.13,3.0],[41.34,3.2],[41.61,3.59],[41.76,3.8],[41.88,3.98]]]},{"n":"Saint Pierre and Miquelon","r":[[[-56.15,46.76],[-56.17,46.75],[-56.24,46.77],[-56.21,46.8],[-56.19,46.81],[-56.15,46.81],[-56.14,46.8],[-56.14,46.78],[-56.15,46.76]],[[-56.27,46.84],[-56.35,46.8],[-56.38,46.82],[-56.38,46.85],[-56.33,46.92],[-56.33,46.94],[-56.39,47.07],[-56.38,47.09],[-56.36,47.1],[-56.29,47.07],[-56.28,47.04],[-56.31,46.95],[-56.29,46.9],[-56.26,46.86],[-56.27,46.84]]]},{"n":"Republic of Serbia","r":[[[22.71,44.24],[22.67,44.22],[22.63,44.19],[22.6,44.15],[22.6,44.08],[22.47,44.02],[22.42,44.01],[22.4,43.97],[22.37,43.86],[22.37,43.78],[22.39,43.74],[22.39,43.71],[22.44,43.67],[22.47,43.6],[22.5,43.52],[22.55,43.45],[22.7,43.39],[22.77,43.35],[22.82,43.3],[22.86,43.25],[22.98,43.19],[22.97,43.14],[22.94,43.1],[22.92,43.08],[22.86,43.02],[22.8,42.99],[22.71,42.88],[22.56,42.88],[22.52,42.87],[22.47,42.84],[22.44,42.79],[22.47,42.75],[22.46,42.71],[22.44,42.63],[22.47,42.54],[22.52,42.5],[22.53,42.48],[22.52,42.44],[22.45,42.36],[22.42,42.33],[22.34,42.31],[22.32,42.32],[22.28,42.35],[22.24,42.36],[22.15,42.32],[22.05,42.3],[21.98,42.32],[21.9,42.32],[21.85,42.31],[21.81,42.3],[21.74,42.27],[21.62,42.24],[21.56,42.25],[21.54,42.28],[21.52,42.33],[21.53,42.35],[21.61,42.39],[21.62,42.42],[21.73,42.6],[21.75,42.65],[21.75,42.67],[21.72,42.68],[21.66,42.68],[21.39,42.75],[21.4,42.83],[21.32,42.87],[21.24,42.91],[21.22,42.96],[21.13,43.04],[21.06,43.09],[20.97,43.12],[20.89,43.15],[20.84,43.17],[20.82,43.21],[20.82,43.24],[20.8,43.26],[20.76,43.26],[20.7,43.23],[20.62,43.2],[20.61,43.18],[20.64,43.13],[20.66,43.1],[20.65,43.07],[20.62,43.03],[20.48,42.95],[20.46,42.92],[20.49,42.88],[20.47,42.86],[20.34,42.83],[20.35,42.85],[20.34,42.89],[20.27,42.94],[20.17,42.97],[19.94,43.08],[19.86,43.1],[19.78,43.11],[19.67,43.16],[19.61,43.17],[19.55,43.21],[19.41,43.34],[19.3,43.41],[19.22,43.45],[19.2,43.49],[19.19,43.52],[19.19,43.53],[19.25,43.58],[19.3,43.59],[19.36,43.59],[19.4,43.57],[19.45,43.56],[19.48,43.6],[19.5,43.64],[19.49,43.7],[19.36,43.84],[19.26,43.94],[19.25,43.97],[19.27,43.98],[19.31,43.99],[19.35,43.99],[19.45,43.98],[19.55,43.99],[19.58,44.01],[19.58,44.04],[19.55,44.07],[19.43,44.15],[19.34,44.23],[19.23,44.28],[19.15,44.3],[19.13,44.33],[19.12,44.36],[19.13,44.41],[19.13,44.48],[19.15,44.53],[19.22,44.61],[19.29,44.7],[19.33,44.78],[19.36,44.86],[19.35,44.88],[19.31,44.9],[19.24,44.91],[19.13,44.9],[19.04,44.87],[19.01,44.87],[19.0,44.9],[19.01,44.92],[19.04,44.92],[19.06,44.91],[19.09,44.93],[19.1,44.97],[19.06,45.14],[19.13,45.15],[19.13,45.18],[19.14,45.2],[19.21,45.17],[19.3,45.17],[19.39,45.17],[19.4,45.19],[19.4,45.21],[19.38,45.23],[19.35,45.25],[19.33,45.27],[19.27,45.28],[19.09,45.34],[19.0,45.4],[19.01,45.47],[19.03,45.5],[19.06,45.51],[19.06,45.53],[18.95,45.56],[18.92,45.6],[18.95,45.66],[18.89,45.77],[18.84,45.84],[18.89,45.87],[18.9,45.91],[18.91,45.93],[18.93,45.93],[19.02,45.96],[19.05,45.98],[19.07,46.01],[19.09,46.02],[19.15,45.99],[19.21,45.98],[19.28,46.0],[19.33,46.03],[19.39,46.05],[19.42,46.06],[19.46,46.09],[19.53,46.16],[19.61,46.17],[19.72,46.15],[19.84,46.15],[19.93,46.16],[20.16,46.14],[20.21,46.13],[20.24,46.11],[20.3,46.05],[20.36,45.98],[20.44,45.94],[20.53,45.9],[20.58,45.87],[20.65,45.78],[20.71,45.74],[20.73,45.74],[20.75,45.75],[20.76,45.76],[20.78,45.75],[20.78,45.72],[20.78,45.66],[20.77,45.6],[20.79,45.54],[20.79,45.52],[20.77,45.5],[20.77,45.48],[20.79,45.47],[20.87,45.43],[20.94,45.37],[21.02,45.32],[21.1,45.29],[21.15,45.29],[21.23,45.24],[21.38,45.21],[21.43,45.19],[21.47,45.17],[21.49,45.15],[21.49,45.12],[21.47,45.11],[21.43,45.08],[21.42,45.03],[21.4,45.02],[21.37,45.02],[21.35,45.01],[21.36,44.99],[21.38,44.97],[21.41,44.96],[21.47,44.94],[21.53,44.92],[21.53,44.9],[21.52,44.88],[21.44,44.87],[21.38,44.87],[21.36,44.86],[21.36,44.83],[21.52,44.79],[21.6,44.76],[21.64,44.71],[21.74,44.68],[21.91,44.67],[22.03,44.62],[22.09,44.54],[22.2,44.56],[22.35,44.68],[22.5,44.71],[22.64,44.65],[22.72,44.61],[22.73,44.57],[22.7,44.56],[22.62,44.56],[22.55,44.54],[22.5,44.49],[22.49,44.44],[22.53,44.38],[22.58,44.34],[22.65,44.32],[22.68,44.29],[22.69,44.25],[22.71,44.24]]]},{"n":"Sao Tome and Principe","r":[[[6.66,0.12],[6.56,0.05],[6.52,0.07],[6.5,0.12],[6.47,0.23],[6.48,0.28],[6.52,0.34],[6.63,0.4],[6.69,0.4],[6.75,0.33],[6.75,0.24],[6.66,0.12]],[[7.42,1.57],[7.39,1.54],[7.34,1.56],[7.33,1.6],[7.39,1.68],[7.41,1.7],[7.44,1.68],[7.45,1.66],[7.45,1.63],[7.42,1.57]]]},{"n":"Suriname","r":[[[-54.62,2.33],[-54.66,2.33],[-54.7,2.36],[-54.7,2.4],[-54.72,2.44],[-54.77,2.45],[-54.85,2.44],[-54.88,2.45],[-54.93,2.5],[-54.97,2.55],[-54.98,2.6],[-55.01,2.59],[-55.07,2.55],[-55.11,2.54],[-55.15,2.55],[-55.19,2.55],[-55.29,2.5],[-55.34,2.49],[-55.39,2.44],[-55.66,2.42],[-55.73,2.41],[-55.89,2.49],[-55.94,2.52],[-55.96,2.52],[-55.98,2.52],[-55.99,2.5],[-56.02,2.39],[-56.05,2.36],[-56.09,2.34],[-56.13,2.3],[-56.14,2.26],[-56.07,2.24],[-56.02,2.16],[-55.96,2.1],[-55.92,2.04],[-55.92,1.98],[-55.93,1.89],[-55.96,1.86],[-56.02,1.84],[-56.23,1.89],[-56.39,1.92],[-56.45,1.93],[-56.48,1.94],[-56.52,1.97],[-56.56,2.01],[-56.63,2.02],[-56.7,2.04],[-56.76,2.11],[-56.82,2.23],[-56.84,2.28],[-56.89,2.33],[-56.93,2.4],[-56.95,2.46],[-56.98,2.51],[-57.0,2.53],[-57.02,2.61],[-57.03,2.64],[-57.04,2.64],[-57.06,2.67],[-57.1,2.75],[-57.11,2.77],[-57.12,2.78],[-57.16,2.83],[-57.2,2.85],[-57.21,2.88],[-57.21,2.96],[-57.22,3.0],[-57.23,3.08],[-57.23,3.11],[-57.25,3.14],[-57.28,3.16],[-57.28,3.22],[-57.29,3.35],[-57.3,3.38],[-57.43,3.38],[-57.44,3.36],[-57.49,3.35],[-57.55,3.35],[-57.6,3.37],[-57.65,3.39],[-57.66,3.42],[-57.65,3.52],[-57.72,3.59],[-57.83,3.68],[-57.87,3.79],[-57.91,3.86],[-58.03,4.0],[-58.05,4.1],[-58.05,4.17],[-58.01,4.24],[-57.95,4.35],[-57.92,4.45],[-57.91,4.51],[-57.87,4.58],[-57.85,4.67],[-57.87,4.72],[-57.9,4.78],[-57.92,4.82],[-57.88,4.88],[-57.84,4.92],[-57.8,4.93],[-57.75,4.95],[-57.71,4.99],[-57.65,5.0],[-57.57,5.0],[-57.41,5.0],[-57.33,5.02],[-57.31,5.05],[-57.31,5.11],[-57.27,5.16],[-57.23,5.18],[-57.21,5.2],[-57.21,5.21],[-57.22,5.23],[-57.24,5.24],[-57.28,5.25],[-57.32,5.34],[-57.29,5.37],[-57.26,5.45],[-57.25,5.49],[-57.19,5.55],[-57.18,5.53],[-57.14,5.64],[-57.14,5.74],[-57.1,5.83],[-57.06,5.94],[-56.97,5.99],[-56.47,5.94],[-56.24,5.89],[-55.94,5.8],[-55.9,5.7],[-55.9,5.8],[-55.91,5.89],[-55.83,5.96],[-55.65,5.99],[-55.38,5.95],[-55.15,5.99],[-54.83,5.99],[-54.36,5.91],[-54.14,5.86],[-54.05,5.81],[-54.04,5.72],[-54.05,5.61],[-54.08,5.5],[-54.16,5.36],[-54.24,5.29],[-54.33,5.19],[-54.45,5.01],[-54.45,4.96],[-54.47,4.91],[-54.48,4.84],[-54.47,4.75],[-54.44,4.69],[-54.43,4.58],[-54.45,4.49],[-54.44,4.43],[-54.42,4.34],[-54.4,4.24],[-54.4,4.2],[-54.37,4.17],[-54.34,4.14],[-54.35,4.05],[-54.26,3.9],[-54.2,3.83],[-54.11,3.77],[-54.08,3.71],[-54.03,3.63],[-54.01,3.62],[-53.99,3.59],[-54.01,3.53],[-54.01,3.45],[-54.06,3.35],[-54.19,3.18],[-54.2,3.14],[-54.17,2.99],[-54.19,2.87],[-54.2,2.82],[-54.26,2.71],[-54.4,2.46],[-54.49,2.42],[-54.54,2.34],[-54.57,2.34],[-54.6,2.34],[-54.62,2.33]]]},{"n":"Slovakia","r":[[[17.15,48.01],[17.09,48.04],[17.07,48.08],[16.97,48.2],[16.87,48.39],[16.86,48.44],[16.9,48.5],[16.94,48.55],[16.95,48.59],[16.95,48.6],[16.99,48.68],[17.06,48.78],[17.14,48.84],[17.19,48.86],[17.3,48.84],[17.48,48.83],[17.63,48.84],[17.76,48.89],[17.83,48.93],[17.89,48.97],[17.91,49.0],[17.94,49.01],[18.05,49.04],[18.09,49.07],[18.1,49.12],[18.11,49.18],[18.13,49.22],[18.16,49.26],[18.36,49.34],[18.38,49.36],[18.42,49.39],[18.48,49.42],[18.53,49.46],[18.6,49.49],[18.68,49.49],[18.75,49.49],[18.81,49.51],[18.83,49.51],[18.94,49.5],[18.96,49.45],[18.97,49.4],[19.15,49.4],[19.25,49.51],[19.3,49.52],[19.39,49.56],[19.44,49.6],[19.48,49.58],[19.53,49.5],[19.59,49.45],[19.63,49.42],[19.63,49.41],[19.66,49.4],[19.73,49.39],[19.77,49.37],[19.79,49.32],[19.79,49.27],[19.77,49.24],[19.76,49.2],[19.8,49.19],[19.87,49.2],[19.92,49.22],[20.06,49.18],[20.11,49.27],[20.16,49.32],[20.24,49.34],[20.3,49.37],[20.36,49.39],[20.4,49.38],[20.42,49.39],[20.47,49.39],[20.53,49.38],[20.62,49.39],[20.73,49.37],[20.8,49.33],[20.87,49.31],[20.95,49.32],[21.0,49.34],[21.08,49.42],[21.14,49.42],[21.22,49.43],[21.35,49.43],[21.64,49.41],[21.71,49.38],[21.89,49.34],[21.97,49.3],[22.0,49.25],[22.02,49.21],[22.2,49.15],[22.47,49.08],[22.54,49.07],[22.52,49.03],[22.48,48.98],[22.43,48.93],[22.39,48.87],[22.33,48.75],[22.3,48.69],[22.14,48.57],[22.13,48.41],[22.11,48.39],[21.77,48.34],[21.72,48.35],[21.67,48.38],[21.65,48.4],[21.63,48.42],[21.6,48.46],[21.56,48.5],[21.5,48.52],[21.45,48.55],[21.38,48.55],[21.2,48.51],[21.07,48.51],[20.98,48.52],[20.87,48.55],[20.64,48.55],[20.49,48.53],[20.48,48.5],[20.33,48.3],[20.13,48.22],[19.95,48.15],[19.9,48.13],[19.81,48.16],[19.71,48.2],[19.63,48.22],[19.56,48.21],[19.5,48.16],[19.47,48.11],[19.27,48.07],[18.91,48.05],[18.79,48.0],[18.75,47.94],[18.75,47.89],[18.78,47.85],[18.74,47.81],[18.72,47.79],[18.48,47.78],[18.15,47.76],[17.95,47.77],[17.76,47.77],[17.64,47.81],[17.48,47.89],[17.32,47.99],[17.3,47.99],[17.28,48.0],[17.17,48.01],[17.15,48.01]]]},{"n":"Slovenia","r":[[[13.7,46.52],[13.74,46.51],[13.83,46.51],[13.93,46.5],[14.02,46.48],[14.1,46.46],[14.27,46.44],[14.42,46.43],[14.47,46.42],[14.5,46.42],[14.55,46.4],[14.58,46.41],[14.6,46.44],[14.68,46.46],[14.76,46.5],[14.81,46.54],[14.84,46.58],[14.89,46.61],[14.95,46.61],[15.0,46.63],[15.22,46.64],[15.44,46.63],[15.55,46.65],[15.63,46.7],[15.76,46.71],[15.77,46.71],[15.96,46.68],[15.97,46.7],[15.98,46.71],[15.98,46.8],[16.04,46.84],[16.09,46.86],[16.28,46.86],[16.31,46.83],[16.32,46.78],[16.34,46.72],[16.37,46.7],[16.38,46.68],[16.38,46.64],[16.42,46.61],[16.51,46.52],[16.52,46.5],[16.43,46.52],[16.32,46.53],[16.3,46.52],[16.26,46.51],[16.24,46.48],[16.25,46.39],[16.23,46.37],[16.11,46.38],[16.07,46.37],[16.0,46.31],[15.93,46.28],[15.85,46.26],[15.78,46.23],[15.7,46.21],[15.64,46.2],[15.61,46.17],[15.59,46.14],[15.6,46.11],[15.67,46.05],[15.68,45.98],[15.67,45.9],[15.65,45.86],[15.62,45.83],[15.45,45.8],[15.28,45.73],[15.27,45.72],[15.35,45.66],[15.36,45.65],[15.29,45.61],[15.28,45.58],[15.29,45.54],[15.33,45.5],[15.34,45.47],[15.24,45.44],[15.11,45.45],[14.95,45.5],[14.9,45.49],[14.85,45.47],[14.79,45.48],[14.73,45.51],[14.65,45.57],[14.61,45.61],[14.59,45.65],[14.57,45.66],[14.53,45.65],[14.51,45.6],[14.43,45.51],[14.37,45.48],[14.28,45.49],[14.16,45.49],[14.09,45.48],[13.99,45.51],[13.97,45.5],[13.97,45.48],[13.94,45.45],[13.88,45.43],[13.62,45.48],[13.58,45.52],[13.64,45.54],[13.72,45.59],[13.78,45.58],[13.84,45.59],[13.87,45.61],[13.83,45.68],[13.72,45.76],[13.66,45.79],[13.58,45.81],[13.57,45.83],[13.61,45.96],[13.6,45.98],[13.51,45.97],[13.49,45.99],[13.48,46.01],[13.49,46.04],[13.55,46.09],[13.62,46.13],[13.63,46.16],[13.63,46.18],[13.54,46.2],[13.49,46.22],[13.45,46.22],[13.42,46.21],[13.4,46.22],[13.38,46.26],[13.4,46.32],[13.48,46.37],[13.56,46.42],[13.64,46.45],[13.68,46.46],[13.7,46.52]]]},{"n":"Sweden","r":[[[20.62,69.04],[20.9,68.98],[20.91,68.97],[20.91,68.94],[20.92,68.91],[21.18,68.83],[21.26,68.79],[21.42,68.72],[21.47,68.69],[21.62,68.65],[21.72,68.61],[21.85,68.57],[22.0,68.52],[22.2,68.48],[22.36,68.46],[22.78,68.39],[22.85,68.37],[22.98,68.32],[23.1,68.26],[23.18,68.14],[23.32,68.13],[23.36,68.09],[23.47,68.02],[23.64,67.95],[23.63,67.93],[23.5,67.88],[23.49,67.8],[23.5,67.7],[23.54,67.61],[23.54,67.59],[23.5,67.56],[23.47,67.52],[23.45,67.48],[23.45,67.46],[23.47,67.45],[23.54,67.45],[23.66,67.44],[23.73,67.42],[23.77,67.33],[23.76,67.31],[23.66,67.27],[23.63,67.23],[23.62,67.18],[23.64,67.13],[23.68,67.07],[23.76,67.0],[23.87,66.93],[23.94,66.88],[23.98,66.84],[23.99,66.81],[23.94,66.78],[23.89,66.71],[23.89,66.63],[23.87,66.58],[23.77,66.51],[23.7,66.48],[23.68,66.44],[23.67,66.38],[23.69,66.3],[23.7,66.25],[23.72,66.22],[23.75,66.19],[23.91,66.15],[23.99,66.06],[24.05,65.99],[24.16,65.81],[23.89,65.78],[23.69,65.83],[23.59,65.81],[23.42,65.8],[23.22,65.79],[23.15,65.75],[23.1,65.74],[22.92,65.79],[22.75,65.87],[22.62,65.81],[22.54,65.79],[22.47,65.85],[22.4,65.86],[22.37,65.84],[22.34,65.79],[22.29,65.75],[22.28,65.72],[22.27,65.62],[22.25,65.6],[22.09,65.61],[22.1,65.58],[22.13,65.57],[22.15,65.55],[22.09,65.53],[21.92,65.53],[21.9,65.51],[21.95,65.47],[21.91,65.44],[21.88,65.42],[21.68,65.4],[21.57,65.41],[21.53,65.39],[21.52,65.36],[21.55,65.33],[21.6,65.32],[21.61,65.3],[21.61,65.26],[21.57,65.25],[21.45,65.32],[21.41,65.32],[21.44,65.28],[21.51,65.25],[21.55,65.21],[21.58,65.16],[21.57,65.13],[21.42,65.01],[21.29,64.94],[21.2,64.88],[21.14,64.81],[21.2,64.77],[21.28,64.72],[21.33,64.63],[21.39,64.54],[21.52,64.46],[21.49,64.42],[21.47,64.38],[21.26,64.3],[21.02,64.18],[20.76,63.87],[20.68,63.83],[20.45,63.77],[20.37,63.72],[20.2,63.66],[19.91,63.61],[19.78,63.54],[19.72,63.46],[19.66,63.46],[19.59,63.49],[19.5,63.51],[19.49,63.46],[19.49,63.42],[19.35,63.48],[19.29,63.43],[19.24,63.35],[19.03,63.24],[18.82,63.26],[18.79,63.24],[18.85,63.22],[18.86,63.21],[18.82,63.2],[18.76,63.2],[18.67,63.18],[18.61,63.18],[18.58,63.13],[18.53,63.06],[18.41,63.04],[18.34,63.03],[18.31,63.0],[18.5,62.99],[18.49,62.96],[18.48,62.93],[18.46,62.9],[18.25,62.85],[18.21,62.81],[18.17,62.79],[18.07,62.79],[18.08,62.81],[18.09,62.84],[17.95,62.83],[17.91,62.89],[17.88,62.87],[17.9,62.83],[17.93,62.79],[17.97,62.72],[17.94,62.68],[17.9,62.66],[17.93,62.64],[18.01,62.63],[18.04,62.6],[17.95,62.58],[17.83,62.5],[17.72,62.5],[17.65,62.45],[17.57,62.45],[17.51,62.48],[17.41,62.51],[17.38,62.46],[17.37,62.43],[17.43,62.33],[17.54,62.26],[17.63,62.23],[17.56,62.21],[17.51,62.17],[17.45,62.02],[17.41,61.97],[17.37,61.87],[17.4,61.78],[17.42,61.74],[17.47,61.68],[17.33,61.69],[17.2,61.72],[17.22,61.66],[17.13,61.58],[17.15,61.5],[17.16,61.46],[17.14,61.38],[17.18,61.36],[17.2,61.31],[17.16,61.28],[17.18,61.25],[17.19,61.15],[17.21,60.99],[17.2,60.95],[17.28,60.81],[17.26,60.76],[17.25,60.7],[17.36,60.64],[17.46,60.64],[17.56,60.64],[17.59,60.63],[17.63,60.59],[17.66,60.54],[17.74,60.54],[17.87,60.58],[17.96,60.59],[18.01,60.51],[18.16,60.41],[18.25,60.36],[18.4,60.34],[18.56,60.25],[18.54,60.15],[18.6,60.12],[18.79,60.08],[18.85,60.03],[18.88,59.98],[18.93,59.94],[18.99,59.83],[18.97,59.76],[18.9,59.73],[18.72,59.66],[18.64,59.6],[18.58,59.57],[18.4,59.49],[18.34,59.48],[18.28,59.44],[18.22,59.42],[18.16,59.43],[17.96,59.36],[17.98,59.33],[18.13,59.32],[18.21,59.33],[18.27,59.37],[18.34,59.38],[18.4,59.37],[18.46,59.4],[18.51,59.41],[18.56,59.39],[18.62,59.33],[18.5,59.29],[18.41,59.29],[18.37,59.18],[18.32,59.13],[18.29,59.11],[18.1,59.06],[17.97,59.0],[17.83,58.95],[17.77,58.97],[17.67,58.92],[17.46,58.86],[17.35,58.78],[17.1,58.71],[16.98,58.65],[16.64,58.65],[16.32,58.66],[16.21,58.64],[16.32,58.63],[16.39,58.6],[16.48,58.61],[16.68,58.6],[16.79,58.59],[16.92,58.49],[16.82,58.46],[16.65,58.43],[16.72,58.3],[16.77,58.21],[16.7,58.16],[16.69,57.92],[16.6,57.91],[16.56,57.81],[16.59,57.76],[16.58,57.64],[16.6,57.57],[16.65,57.5],[16.63,57.43],[16.48,57.27],[16.48,57.19],[16.51,57.14],[16.53,57.07],[16.46,56.93],[16.41,56.81],[16.35,56.71],[16.22,56.59],[16.15,56.5],[16.0,56.22],[15.92,56.17],[15.83,56.12],[15.72,56.16],[15.63,56.19],[15.51,56.18],[15.33,56.15],[15.05,56.17],[14.78,56.16],[14.71,56.13],[14.75,56.03],[14.66,56.02],[14.56,56.05],[14.47,56.01],[14.4,55.98],[14.26,55.89],[14.22,55.83],[14.2,55.73],[14.28,55.64],[14.34,55.53],[14.17,55.4],[14.08,55.39],[13.81,55.43],[13.32,55.35],[12.89,55.41],[12.94,55.48],[12.94,55.53],[12.96,55.61],[12.98,55.69],[12.97,55.75],[12.94,55.81],[12.83,55.88],[12.59,56.14],[12.52,56.25],[12.47,56.29],[12.51,56.29],[12.71,56.24],[12.75,56.24],[12.8,56.26],[12.74,56.35],[12.69,56.38],[12.66,56.44],[12.77,56.46],[12.86,56.45],[12.92,56.52],[12.88,56.62],[12.79,56.65],[12.72,56.66],[12.57,56.82],[12.42,56.91],[12.15,57.23],[12.05,57.45],[11.96,57.43],[11.92,57.52],[11.89,57.61],[11.88,57.68],[11.73,57.72],[11.73,57.76],[11.7,57.97],[11.55,58.0],[11.45,58.12],[11.43,58.34],[11.33,58.38],[11.25,58.37],[11.25,58.42],[11.27,58.48],[11.22,58.68],[11.21,58.87],[11.17,58.92],[11.15,58.99],[11.17,59.05],[11.2,59.08],[11.3,59.09],[11.39,59.04],[11.47,58.91],[11.54,58.89],[11.64,58.93],[11.71,59.02],[11.75,59.16],[11.8,59.29],[11.74,59.43],[11.68,59.56],[11.68,59.59],[11.83,59.7],[11.88,59.78],[11.93,59.86],[11.99,59.89],[12.07,59.9],[12.17,59.91],[12.29,59.97],[12.4,60.04],[12.49,60.11],[12.51,60.24],[12.52,60.31],[12.55,60.35],[12.59,60.45],[12.55,60.55],[12.45,60.69],[12.31,60.89],[12.29,61.0],[12.35,61.02],[12.47,61.04],[12.68,61.05],[12.71,61.06],[12.73,61.11],[12.78,61.17],[12.83,61.22],[12.86,61.29],[12.88,61.35],[12.76,61.45],[12.6,61.54],[12.49,61.57],[12.29,61.65],[12.16,61.72],[12.23,61.98],[12.29,62.17],[12.3,62.21],[12.3,62.29],[12.11,62.59],[12.12,62.66],[12.14,62.72],[12.12,62.83],[12.11,62.92],[12.14,62.95],[12.22,63.0],[12.14,63.08],[12.14,63.09],[12.0,63.29],[12.21,63.49],[12.18,63.6],[12.3,63.67],[12.53,63.84],[12.66,63.94],[12.69,63.96],[12.79,64.0],[12.99,64.05],[13.2,64.08],[13.3,64.07],[13.67,64.04],[13.96,64.01],[14.0,64.04],[14.06,64.1],[14.14,64.17],[14.15,64.26],[14.12,64.39],[14.08,64.46],[13.87,64.51],[13.65,64.58],[13.92,64.8],[14.12,64.95],[14.35,65.17],[14.43,65.26],[14.48,65.3],[14.55,65.65],[14.6,65.74],[14.63,65.79],[14.64,65.85],[14.61,65.93],[14.54,66.13],[14.92,66.15],[15.04,66.17],[15.15,66.19],[15.37,66.25],[15.48,66.31],[15.42,66.49],[15.56,66.55],[15.88,66.77],[16.24,66.98],[16.4,67.05],[16.42,67.09],[16.43,67.16],[16.36,67.25],[16.28,67.31],[16.13,67.43],[16.19,67.51],[16.31,67.52],[16.46,67.55],[16.57,67.62],[16.59,67.63],[16.78,67.9],[17.17,68.03],[17.32,68.1],[17.56,68.05],[17.92,67.96],[18.07,68.09],[18.12,68.13],[18.18,68.2],[18.16,68.32],[18.15,68.47],[18.16,68.53],[18.3,68.56],[18.38,68.56],[18.77,68.5],[18.87,68.5],[19.05,68.49],[19.26,68.47],[19.69,68.39],[19.87,68.36],[19.97,68.36],[20.06,68.39],[20.24,68.48],[19.97,68.54],[20.15,68.61],[20.24,68.67],[20.32,68.75],[20.35,68.85],[20.34,68.9],[20.28,68.93],[20.12,69.02],[20.49,69.03],[20.62,69.04]],[[16.53,56.29],[16.48,56.24],[16.43,56.24],[16.4,56.31],[16.39,56.48],[16.41,56.57],[16.63,56.88],[16.73,56.9],[16.86,57.09],[16.9,57.17],[16.96,57.25],[17.0,57.32],[17.03,57.35],[17.09,57.33],[17.12,57.32],[17.05,57.28],[17.06,57.23],[17.05,57.21],[16.88,56.99],[16.84,56.84],[16.78,56.81],[16.53,56.29]],[[19.08,57.84],[18.99,57.81],[18.95,57.74],[18.88,57.73],[18.81,57.71],[18.79,57.48],[18.91,57.4],[18.84,57.39],[18.78,57.36],[18.74,57.32],[18.7,57.24],[18.54,57.2],[18.48,57.16],[18.39,57.09],[18.34,56.98],[18.25,56.93],[18.15,56.92],[18.21,57.01],[18.29,57.08],[18.21,57.13],[18.16,57.21],[18.11,57.27],[18.15,57.34],[18.13,57.45],[18.14,57.56],[18.2,57.61],[18.28,57.66],[18.41,57.76],[18.54,57.83],[18.72,57.86],[18.81,57.83],[18.84,57.9],[18.9,57.92],[18.96,57.9],[19.08,57.84]],[[19.16,57.92],[19.14,57.86],[19.09,57.86],[19.04,57.91],[19.13,57.98],[19.28,57.98],[19.33,57.96],[19.16,57.92]],[[18.42,59.03],[18.37,59.02],[18.35,59.02],[18.38,59.07],[18.4,59.09],[18.46,59.11],[18.49,59.1],[18.42,59.03]],[[18.6,59.47],[18.57,59.44],[18.55,59.48],[18.56,59.49],[18.57,59.53],[18.62,59.55],[18.7,59.53],[18.7,59.52],[18.62,59.49],[18.6,59.47]]]},{"n":"Swaziland","r":[[[31.95,-25.96],[31.97,-25.97],[32.06,-26.02],[32.07,-26.11],[32.06,-26.22],[32.04,-26.28],[32.05,-26.35],[32.08,-26.45],[32.11,-26.52],[32.11,-26.84],[32.08,-26.82],[32.02,-26.81],[31.99,-26.82],[31.97,-26.96],[31.95,-27.17],[31.96,-27.31],[31.74,-27.31],[31.47,-27.3],[31.27,-27.24],[31.06,-27.11],[30.94,-26.92],[30.88,-26.79],[30.81,-26.79],[30.79,-26.76],[30.79,-26.61],[30.79,-26.46],[30.8,-26.41],[30.95,-26.22],[31.03,-26.1],[31.09,-25.98],[31.21,-25.84],[31.34,-25.76],[31.38,-25.74],[31.42,-25.75],[31.64,-25.87],[31.87,-25.98],[31.92,-25.97],[31.95,-25.96]]]},{"n":"Sint Maarten","r":[[[-63.12,18.07],[-63.01,18.07],[-63.01,18.05],[-63.02,18.02],[-63.09,18.04],[-63.12,18.06],[-63.12,18.07]]]},{"n":"Seychelles","r":[[[55.54,-4.69],[55.54,-4.79],[55.49,-4.75],[55.48,-4.69],[55.42,-4.65],[55.38,-4.61],[55.46,-4.56],[55.54,-4.69]]]},{"n":"Syria","r":[[[42.36,37.11],[42.36,37.1],[42.35,37.06],[42.24,36.96],[42.08,36.83],[41.97,36.74],[41.79,36.6],[41.65,36.57],[41.42,36.51],[41.35,36.46],[41.3,36.38],[41.26,36.27],[41.25,36.2],[41.25,36.07],[41.3,35.94],[41.35,35.81],[41.36,35.72],[41.35,35.64],[41.3,35.55],[41.25,35.43],[41.22,35.29],[41.2,35.03],[41.2,34.81],[41.19,34.77],[41.1,34.61],[40.99,34.43],[40.94,34.39],[40.69,34.33],[40.42,34.2],[40.12,34.05],[39.85,33.91],[39.56,33.77],[39.27,33.62],[39.06,33.51],[38.77,33.37],[38.52,33.24],[38.25,33.1],[38.06,32.99],[37.75,32.83],[37.58,32.73],[37.32,32.59],[37.09,32.47],[36.82,32.32],[36.48,32.36],[36.37,32.39],[36.28,32.46],[36.22,32.5],[36.06,32.53],[35.96,32.67],[35.89,32.71],[35.79,32.73],[35.8,32.78],[35.86,32.86],[35.91,32.95],[35.88,33.0],[35.87,33.04],[35.87,33.09],[35.91,33.14],[35.89,33.19],[35.86,33.25],[35.84,33.28],[35.84,33.33],[35.85,33.37],[35.87,33.43],[35.91,33.47],[35.93,33.5],[35.97,33.53],[36.02,33.56],[36.03,33.59],[36.03,33.6],[35.97,33.62],[35.94,33.67],[35.97,33.73],[35.99,33.75],[36.02,33.78],[36.09,33.83],[36.15,33.84],[36.2,33.84],[36.28,33.84],[36.35,33.83],[36.37,33.84],[36.36,33.86],[36.28,33.89],[36.28,33.93],[36.3,33.96],[36.35,34.01],[36.42,34.05],[36.46,34.06],[36.54,34.13],[36.58,34.22],[36.5,34.43],[36.46,34.47],[36.38,34.5],[36.33,34.5],[36.33,34.51],[36.39,34.57],[36.43,34.61],[36.38,34.66],[36.3,34.68],[36.26,34.63],[36.15,34.63],[35.98,34.63],[35.9,34.85],[35.89,34.95],[35.89,35.06],[35.94,35.22],[35.92,35.3],[35.92,35.35],[35.9,35.42],[35.76,35.57],[35.84,35.85],[35.89,35.92],[35.97,35.91],[36.13,35.83],[36.15,35.83],[36.2,35.94],[36.25,35.97],[36.35,36.0],[36.38,36.17],[36.42,36.2],[36.48,36.22],[36.56,36.22],[36.64,36.23],[36.64,36.26],[36.54,36.46],[36.55,36.51],[36.6,36.7],[36.63,36.78],[36.66,36.8],[36.78,36.79],[36.94,36.76],[36.99,36.7],[37.07,36.65],[37.19,36.66],[37.33,36.65],[37.44,36.64],[37.52,36.68],[37.72,36.74],[37.82,36.77],[37.91,36.79],[38.19,36.9],[38.31,36.89],[38.38,36.88],[38.44,36.86],[38.58,36.79],[38.69,36.72],[38.77,36.69],[38.91,36.69],[39.11,36.68],[39.36,36.68],[39.5,36.7],[39.69,36.74],[40.02,36.83],[40.45,37.01],[40.71,37.1],[40.82,37.11],[40.96,37.11],[41.1,37.09],[41.26,37.07],[41.34,37.07],[41.52,37.09],[41.74,37.13],[41.89,37.16],[42.06,37.21],[42.17,37.29],[42.2,37.3],[42.25,37.28],[42.27,37.28],[42.31,37.23],[42.36,37.11]]]},{"n":"Turks and Caicos Islands","r":[[[-72.33,21.85],[-72.22,21.8],[-72.15,21.8],[-72.14,21.79],[-72.18,21.78],[-72.19,21.77],[-72.3,21.76],[-72.34,21.76],[-72.34,21.8],[-72.33,21.85]],[[-71.66,21.77],[-71.67,21.75],[-71.72,21.79],[-71.83,21.79],[-71.85,21.84],[-71.81,21.85],[-71.67,21.83],[-71.64,21.79],[-71.66,21.77]],[[-71.88,21.84],[-71.9,21.83],[-71.96,21.86],[-71.96,21.89],[-71.98,21.89],[-72.02,21.92],[-72.01,21.95],[-71.93,21.95],[-71.9,21.86],[-71.88,21.84]]]},{"n":"Chad","r":[[[22.86,10.92],[22.82,10.93],[22.73,10.95],[22.62,10.98],[22.49,11.0],[22.37,10.95],[22.24,10.89],[22.19,10.85],[22.16,10.83],[22.1,10.83],[22.04,10.82],[22.01,10.78],[21.96,10.74],[21.77,10.64],[21.73,10.61],[21.71,10.57],[21.71,10.54],[21.73,10.46],[21.73,10.37],[21.68,10.29],[21.63,10.24],[21.58,10.22],[21.53,10.21],[21.5,10.18],[21.4,10.0],[21.35,9.97],[21.26,9.97],[21.01,9.71],[20.98,9.64],[20.89,9.53],[20.77,9.41],[20.67,9.35],[20.66,9.32],[20.63,9.3],[20.57,9.27],[20.34,9.13],[20.07,9.13],[19.95,9.08],[19.84,9.05],[19.67,9.02],[19.62,9.02],[19.4,9.01],[19.15,9.02],[19.05,9.0],[18.96,8.94],[18.89,8.89],[18.88,8.87],[18.89,8.85],[18.89,8.84],[19.06,8.72],[19.11,8.66],[19.06,8.6],[19.04,8.59],[19.04,8.59],[19.01,8.54],[18.91,8.41],[18.75,8.24],[18.67,8.2],[18.63,8.17],[18.59,8.06],[18.56,8.05],[18.46,8.03],[18.24,8.02],[17.94,7.99],[17.76,7.97],[17.65,7.98],[17.49,7.91],[17.44,7.89],[17.4,7.88],[17.25,7.81],[17.12,7.7],[17.07,7.68],[16.89,7.63],[16.82,7.56],[16.78,7.55],[16.67,7.65],[16.59,7.74],[16.55,7.84],[16.55,7.87],[16.52,7.86],[16.46,7.82],[16.4,7.77],[16.38,7.68],[16.19,7.62],[16.03,7.57],[15.96,7.51],[15.85,7.48],[15.7,7.49],[15.59,7.52],[15.48,7.52],[15.53,7.6],[15.55,7.66],[15.56,7.74],[15.55,7.79],[15.48,7.81],[15.44,7.85],[15.35,8.08],[15.25,8.32],[15.12,8.56],[14.97,8.71],[14.86,8.8],[14.83,8.81],[14.77,8.84],[14.73,8.87],[14.54,9.03],[14.33,9.2],[14.28,9.29],[14.18,9.41],[14.06,9.53],[14.0,9.59],[13.98,9.69],[14.06,9.78],[14.14,9.9],[14.24,9.98],[14.38,9.99],[14.6,9.95],[14.84,9.94],[15.07,9.97],[15.13,9.98],[15.19,9.98],[15.32,9.95],[15.54,9.96],[15.65,10.01],[15.53,10.09],[15.4,10.22],[15.28,10.36],[15.2,10.48],[15.13,10.65],[15.07,10.85],[15.03,11.11],[15.04,11.26],[15.06,11.37],[15.12,11.54],[15.08,11.64],[15.09,11.72],[15.08,11.85],[15.06,11.91],[14.97,12.11],[14.96,12.13],[14.88,12.27],[14.85,12.5],[14.76,12.66],[14.62,12.73],[14.54,12.82],[14.52,12.98],[14.46,13.02],[14.24,13.08],[14.06,13.08],[13.93,13.26],[13.76,13.49],[13.61,13.7],[13.51,14.13],[13.45,14.38],[13.51,14.46],[13.64,14.63],[13.81,14.97],[14.18,15.48],[14.37,15.75],[14.75,16.15],[15.21,16.63],[15.47,16.91],[15.52,17.41],[15.56,17.94],[15.6,18.34],[15.64,18.81],[15.67,19.21],[15.7,19.5],[15.74,19.9],[15.77,19.98],[15.95,20.3],[15.96,20.35],[15.93,20.4],[15.67,20.67],[15.59,20.73],[15.54,20.87],[15.61,20.95],[15.29,21.41],[15.22,21.47],[15.18,21.52],[15.18,21.61],[15.17,21.92],[15.09,22.42],[14.98,23.0],[15.35,23.16],[15.63,23.29],[15.98,23.45],[16.32,23.28],[16.79,23.05],[17.27,22.81],[17.75,22.57],[18.23,22.34],[18.71,22.1],[19.19,21.86],[19.67,21.63],[20.15,21.39],[20.63,21.15],[21.11,20.92],[21.58,20.68],[22.06,20.44],[22.54,20.21],[23.02,19.97],[23.5,19.73],[23.98,19.5],[23.98,19.05],[23.98,18.6],[23.98,18.16],[23.98,17.71],[23.98,17.27],[23.98,16.82],[23.98,16.37],[23.98,15.93],[23.98,15.78],[23.97,15.72],[23.97,15.71],[23.95,15.7],[23.71,15.74],[23.6,15.75],[23.46,15.71],[23.24,15.7],[23.11,15.7],[23.01,15.63],[22.93,15.53],[22.97,15.31],[22.96,15.24],[22.93,15.16],[22.87,15.1],[22.8,15.04],[22.76,15.0],[22.71,14.9],[22.68,14.85],[22.68,14.79],[22.67,14.72],[22.63,14.69],[22.53,14.66],[22.47,14.63],[22.42,14.59],[22.38,14.55],[22.4,14.5],[22.42,14.44],[22.44,14.34],[22.45,14.28],[22.5,14.24],[22.53,14.2],[22.54,14.16],[22.51,14.13],[22.39,14.06],[22.34,14.03],[22.28,13.99],[22.26,13.98],[22.17,13.91],[22.13,13.85],[22.11,13.8],[22.11,13.73],[22.15,13.63],[22.2,13.54],[22.22,13.47],[22.23,13.4],[22.23,13.33],[22.2,13.27],[22.16,13.22],[21.99,13.11],[21.91,13.0],[21.84,12.86],[21.83,12.79],[21.84,12.74],[21.88,12.7],[21.93,12.68],[22.0,12.67],[22.12,12.69],[22.23,12.71],[22.35,12.66],[22.41,12.55],[22.39,12.46],[22.44,12.31],[22.48,12.13],[22.47,12.07],[22.49,12.04],[22.56,12.03],[22.58,11.99],[22.56,11.67],[22.59,11.58],[22.64,11.52],[22.7,11.48],[22.75,11.44],[22.78,11.41],[22.85,11.4],[22.92,11.34],[22.94,11.27],[22.94,11.19],[22.89,11.03],[22.86,10.92]]]},{"n":"Togo","r":[[[0.9,10.99],[0.87,10.89],[0.82,10.75],[0.79,10.71],[0.76,10.39],[0.78,10.36],[0.79,10.35],[0.96,10.24],[1.18,10.1],[1.33,10.0],[1.34,9.96],[1.35,9.75],[1.35,9.57],[1.38,9.46],[1.39,9.36],[1.42,9.29],[1.57,9.14],[1.6,9.05],[1.6,8.77],[1.61,8.56],[1.62,8.27],[1.62,8.03],[1.62,7.73],[1.62,7.37],[1.62,7.0],[1.53,6.99],[1.58,6.88],[1.59,6.77],[1.6,6.74],[1.58,6.69],[1.6,6.61],[1.64,6.58],[1.74,6.43],[1.78,6.29],[1.61,6.25],[1.62,6.22],[1.31,6.15],[1.19,6.09],[1.19,6.15],[1.14,6.16],[1.08,6.17],[1.05,6.2],[1.0,6.27],[0.98,6.32],[0.91,6.33],[0.82,6.39],[0.74,6.45],[0.71,6.52],[0.72,6.55],[0.7,6.58],[0.67,6.59],[0.6,6.74],[0.55,6.8],[0.53,6.85],[0.53,6.89],[0.52,6.94],[0.54,6.98],[0.58,7.0],[0.59,7.03],[0.6,7.1],[0.62,7.23],[0.63,7.35],[0.59,7.39],[0.54,7.4],[0.51,7.44],[0.5,7.5],[0.5,7.55],[0.61,7.73],[0.58,8.15],[0.6,8.21],[0.65,8.25],[0.69,8.3],[0.69,8.35],[0.62,8.48],[0.48,8.58],[0.42,8.65],[0.38,8.72],[0.37,8.76],[0.45,8.81],[0.49,8.85],[0.49,8.89],[0.46,8.97],[0.47,9.12],[0.5,9.22],[0.53,9.36],[0.53,9.4],[0.45,9.48],[0.41,9.49],[0.37,9.49],[0.29,9.43],[0.26,9.43],[0.24,9.44],[0.23,9.46],[0.26,9.5],[0.25,9.54],[0.28,9.57],[0.33,9.59],[0.34,9.6],[0.27,9.62],[0.26,9.64],[0.27,9.67],[0.29,9.67],[0.31,9.67],[0.32,9.69],[0.33,9.8],[0.34,9.84],[0.35,9.92],[0.36,10.24],[0.38,10.27],[0.38,10.29],[0.33,10.31],[0.22,10.39],[0.15,10.45],[0.09,10.52],[0.04,10.56],[-0.06,10.63],[-0.09,10.67],[-0.09,10.72],[-0.06,10.8],[-0.01,10.89],[0.01,11.02],[-0.0,11.06],[-0.07,11.12],[0.16,11.07],[0.48,10.99],[0.49,10.98],[0.49,10.95],[0.55,10.96],[0.64,10.98],[0.9,10.99]]]},{"n":"Thailand","r":[[[105.18,14.35],[105.17,14.34],[105.13,14.28],[105.07,14.23],[105.03,14.23],[105.0,14.25],[104.98,14.29],[104.97,14.37],[104.88,14.4],[104.78,14.43],[104.58,14.39],[104.41,14.37],[104.23,14.4],[104.05,14.36],[103.98,14.36],[103.9,14.36],[103.82,14.36],[103.74,14.37],[103.6,14.42],[103.55,14.42],[103.43,14.38],[103.31,14.35],[103.2,14.33],[103.03,14.25],[102.91,14.14],[102.87,14.05],[102.81,13.97],[102.73,13.84],[102.62,13.72],[102.54,13.66],[102.57,13.63],[102.55,13.59],[102.43,13.57],[102.34,13.56],[102.32,13.54],[102.33,13.29],[102.36,13.19],[102.42,13.08],[102.46,13.02],[102.49,12.83],[102.5,12.67],[102.63,12.57],[102.7,12.49],[102.76,12.43],[102.74,12.38],[102.71,12.26],[102.74,12.09],[102.92,11.73],[102.93,11.71],[102.91,11.7],[102.88,11.77],[102.79,11.89],[102.76,12.01],[102.65,12.15],[102.59,12.2],[102.57,12.16],[102.54,12.11],[102.43,12.18],[102.34,12.25],[102.26,12.39],[102.25,12.36],[102.23,12.33],[102.13,12.44],[102.03,12.53],[101.94,12.56],[101.89,12.59],[101.84,12.64],[101.72,12.69],[101.44,12.62],[101.09,12.67],[100.95,12.62],[100.9,12.65],[100.86,12.71],[100.9,12.82],[100.9,13.03],[100.95,13.19],[100.93,13.3],[100.95,13.36],[100.96,13.43],[100.91,13.46],[100.66,13.52],[100.6,13.57],[100.54,13.51],[100.24,13.48],[100.12,13.44],[100.02,13.35],[99.99,13.24],[100.05,13.17],[100.09,13.05],[99.98,12.77],[99.96,12.69],[100.01,12.35],[99.99,12.17],[99.93,12.05],[99.84,11.94],[99.8,11.75],[99.73,11.66],[99.63,11.46],[99.56,11.22],[99.51,11.1],[99.49,10.89],[99.28,10.57],[99.24,10.39],[99.17,10.32],[99.19,10.27],[99.19,10.18],[99.17,9.93],[99.16,9.73],[99.19,9.63],[99.29,9.41],[99.27,9.35],[99.25,9.27],[99.34,9.23],[99.39,9.21],[99.72,9.31],[99.84,9.29],[99.88,9.19],[99.9,9.11],[99.96,8.67],[99.99,8.59],[100.06,8.51],[100.13,8.43],[100.15,8.44],[100.16,8.47],[100.16,8.51],[100.23,8.42],[100.28,8.27],[100.45,7.44],[100.5,7.34],[100.55,7.23],[100.44,7.28],[100.41,7.46],[100.38,7.54],[100.34,7.55],[100.28,7.55],[100.28,7.58],[100.32,7.64],[100.32,7.72],[100.26,7.77],[100.16,7.73],[100.16,7.6],[100.2,7.5],[100.37,7.28],[100.42,7.19],[100.49,7.16],[100.59,7.18],[100.7,7.08],[100.79,6.99],[101.02,6.86],[101.15,6.88],[101.3,6.91],[101.4,6.9],[101.5,6.87],[101.61,6.75],[101.8,6.47],[102.1,6.24],[102.07,6.18],[102.06,6.1],[101.94,5.98],[101.92,5.91],[101.87,5.83],[101.79,5.78],[101.72,5.77],[101.68,5.78],[101.65,5.8],[101.6,5.88],[101.58,5.9],[101.56,5.91],[101.4,5.85],[101.26,5.79],[101.23,5.73],[101.19,5.67],[101.15,5.64],[101.11,5.64],[101.08,5.67],[101.03,5.72],[100.98,5.77],[100.99,5.85],[101.08,5.96],[101.09,6.03],[101.08,6.17],[101.05,6.24],[101.03,6.25],[100.99,6.26],[100.87,6.25],[100.82,6.33],[100.79,6.43],[100.75,6.46],[100.72,6.48],[100.63,6.45],[100.56,6.47],[100.35,6.55],[100.26,6.68],[100.22,6.69],[100.18,6.67],[100.16,6.64],[100.14,6.49],[100.12,6.44],[99.87,6.75],[99.7,6.88],[99.72,7.11],[99.67,7.15],[99.6,7.16],[99.55,7.22],[99.6,7.36],[99.53,7.33],[99.44,7.33],[99.36,7.37],[99.3,7.56],[99.26,7.62],[99.18,7.72],[99.08,7.72],[99.04,7.77],[99.05,7.89],[98.97,7.96],[98.87,8.02],[98.79,8.06],[98.7,8.26],[98.64,8.31],[98.58,8.34],[98.5,8.32],[98.47,8.25],[98.42,8.18],[98.36,8.19],[98.31,8.23],[98.24,8.42],[98.23,8.54],[98.24,8.77],[98.33,8.97],[98.37,9.29],[98.44,9.49],[98.49,9.56],[98.56,9.84],[98.7,10.19],[98.72,10.27],[98.75,10.35],[98.77,10.43],[98.78,10.56],[98.76,10.62],[98.76,10.66],[98.79,10.71],[98.89,10.79],[99.03,10.92],[99.19,11.11],[99.36,11.39],[99.44,11.55],[99.48,11.61],[99.52,11.63],[99.57,11.69],[99.61,11.75],[99.61,11.78],[99.52,12.09],[99.46,12.19],[99.43,12.31],[99.42,12.39],[99.39,12.47],[99.41,12.55],[99.37,12.59],[99.3,12.65],[99.22,12.74],[99.17,12.88],[99.17,12.96],[99.12,13.03],[99.11,13.1],[99.14,13.17],[99.18,13.23],[99.17,13.5],[99.16,13.58],[99.14,13.72],[99.09,13.82],[99.01,13.95],[98.93,14.05],[98.72,14.24],[98.57,14.36],[98.5,14.47],[98.4,14.6],[98.33,14.7],[98.25,14.81],[98.2,14.98],[98.18,15.15],[98.19,15.2],[98.23,15.24],[98.29,15.27],[98.33,15.28],[98.45,15.36],[98.54,15.35],[98.56,15.37],[98.57,15.4],[98.55,15.56],[98.56,15.77],[98.57,15.94],[98.59,16.05],[98.82,16.18],[98.87,16.24],[98.89,16.3],[98.89,16.35],[98.87,16.39],[98.84,16.42],[98.69,16.31],[98.66,16.33],[98.59,16.51],[98.56,16.57],[98.52,16.64],[98.48,16.73],[98.47,16.9],[98.44,16.98],[98.26,17.15],[98.17,17.24],[98.06,17.37],[97.93,17.53],[97.79,17.68],[97.73,17.78],[97.71,17.8],[97.7,17.83],[97.74,17.94],[97.72,18.04],[97.65,18.17],[97.62,18.26],[97.63,18.29],[97.6,18.3],[97.52,18.3],[97.45,18.36],[97.38,18.49],[97.37,18.52],[97.4,18.52],[97.48,18.49],[97.52,18.5],[97.58,18.53],[97.67,18.56],[97.73,18.57],[97.75,18.59],[97.75,18.62],[97.71,18.93],[97.71,19.0],[97.8,19.13],[97.79,19.27],[97.82,19.46],[97.92,19.59],[97.99,19.65],[98.02,19.75],[98.05,19.77],[98.11,19.76],[98.24,19.69],[98.29,19.69],[98.37,19.69],[98.45,19.69],[98.49,19.7],[98.76,19.77],[98.82,19.78],[98.88,19.77],[98.92,19.77],[98.96,19.8],[98.99,19.86],[99.02,20.04],[99.04,20.07],[99.07,20.1],[99.13,20.12],[99.2,20.12],[99.28,20.08],[99.34,20.08],[99.4,20.09],[99.45,20.12],[99.49,20.15],[99.5,20.19],[99.49,20.26],[99.45,20.35],[99.46,20.36],[99.53,20.34],[99.64,20.32],[99.72,20.33],[99.77,20.34],[99.83,20.38],[99.89,20.42],[99.95,20.42],[100.0,20.38],[100.12,20.32],[100.11,20.26],[100.14,20.25],[100.17,20.27],[100.22,20.34],[100.27,20.38],[100.32,20.39],[100.37,20.34],[100.43,20.24],[100.49,20.18],[100.52,20.18],[100.54,20.13],[100.54,20.09],[100.51,20.0],[100.47,19.89],[100.4,19.76],[100.42,19.64],[100.51,19.55],[100.63,19.5],[100.74,19.51],[100.81,19.54],[100.86,19.59],[100.91,19.61],[100.97,19.61],[101.15,19.58],[101.21,19.55],[101.22,19.49],[101.2,19.33],[101.23,19.21],[101.28,19.09],[101.29,18.98],[101.22,18.79],[101.17,18.62],[101.11,18.53],[101.06,18.48],[101.05,18.44],[101.05,18.41],[101.09,18.35],[101.14,18.29],[101.15,18.22],[101.14,18.14],[101.11,18.03],[101.0,17.8],[100.91,17.58],[100.96,17.54],[101.05,17.51],[101.11,17.48],[101.17,17.5],[101.3,17.62],[101.41,17.72],[101.56,17.81],[101.56,17.82],[101.69,17.89],[101.74,17.95],[101.77,18.03],[101.82,18.06],[101.88,18.05],[101.95,18.08],[102.03,18.17],[102.1,18.21],[102.15,18.2],[102.23,18.15],[102.35,18.05],[102.46,17.98],[102.55,17.97],[102.6,17.93],[102.6,17.87],[102.62,17.83],[102.66,17.82],[102.68,17.82],[102.68,17.85],[102.72,17.89],[102.81,17.95],[102.9,17.98],[102.99,17.99],[103.05,18.03],[103.09,18.14],[103.15,18.22],[103.2,18.26],[103.26,18.28],[103.28,18.3],[103.25,18.34],[103.25,18.37],[103.29,18.41],[103.37,18.42],[103.49,18.42],[103.63,18.38],[103.79,18.32],[103.9,18.3],[103.95,18.32],[104.05,18.22],[104.2,17.99],[104.32,17.82],[104.43,17.7],[104.54,17.61],[104.66,17.55],[104.74,17.46],[104.82,17.3],[104.76,17.08],[104.74,16.88],[104.75,16.65],[104.82,16.47],[104.95,16.34],[105.03,16.24],[105.05,16.16],[105.15,16.09],[105.33,16.04],[105.41,15.99],[105.38,15.94],[105.37,15.89],[105.4,15.83],[105.46,15.78],[105.56,15.74],[105.62,15.7],[105.64,15.66],[105.64,15.59],[105.62,15.49],[105.57,15.41],[105.51,15.36],[105.51,15.32],[105.49,15.26],[105.49,15.13],[105.53,15.04],[105.55,14.93],[105.52,14.84],[105.5,14.66],[105.5,14.59],[105.48,14.53],[105.42,14.47],[105.34,14.42],[105.24,14.37],[105.18,14.35]],[[99.66,6.52],[99.64,6.52],[99.61,6.6],[99.65,6.71],[99.7,6.57],[99.66,6.52]],[[99.08,7.59],[99.1,7.47],[99.07,7.5],[99.04,7.55],[99.04,7.63],[99.05,7.64],[99.08,7.59]],[[98.59,7.93],[98.58,7.92],[98.53,8.11],[98.6,8.06],[98.59,7.93]],[[98.41,7.9],[98.4,7.83],[98.36,7.83],[98.32,7.78],[98.3,7.78],[98.26,7.93],[98.3,8.14],[98.32,8.17],[98.35,8.11],[98.43,8.09],[98.4,7.96],[98.41,7.9]],[[98.31,9.05],[98.25,9.04],[98.26,9.1],[98.27,9.13],[98.3,9.14],[98.31,9.08],[98.31,9.05]],[[100.07,9.59],[100.08,9.53],[100.05,9.46],[99.96,9.42],[99.93,9.48],[99.94,9.56],[99.95,9.58],[100.04,9.58],[100.07,9.59]],[[100.07,9.7],[100.06,9.68],[100.03,9.71],[100.0,9.75],[99.98,9.79],[100.04,9.79],[100.07,9.75],[100.07,9.7]],[[102.61,11.68],[102.59,11.57],[102.53,11.61],[102.55,11.67],[102.57,11.69],[102.61,11.68]],[[102.43,11.99],[102.43,11.96],[102.38,11.98],[102.36,11.97],[102.3,11.98],[102.27,12.12],[102.28,12.15],[102.32,12.14],[102.38,12.07],[102.41,12.03],[102.43,11.99]]]},{"n":"Tajikistan","r":[[[74.89,37.23],[74.88,37.24],[74.83,37.29],[74.73,37.36],[74.66,37.39],[74.52,37.38],[74.44,37.4],[74.35,37.42],[74.26,37.42],[74.2,37.37],[74.17,37.33],[74.08,37.32],[73.95,37.28],[73.75,37.23],[73.65,37.24],[73.63,37.26],[73.65,37.29],[73.72,37.33],[73.73,37.38],[73.72,37.42],[73.66,37.43],[73.63,37.44],[73.6,37.45],[73.48,37.47],[73.38,37.46],[73.21,37.41],[72.9,37.27],[72.76,37.17],[72.66,37.03],[72.36,36.98],[72.15,36.9],[71.94,36.77],[71.8,36.69],[71.73,36.68],[71.67,36.7],[71.6,36.73],[71.53,36.85],[71.47,37.02],[71.43,37.13],[71.45,37.27],[71.48,37.44],[71.51,37.6],[71.55,37.8],[71.58,37.86],[71.58,37.91],[71.55,37.93],[71.49,37.93],[71.39,37.91],[71.32,37.9],[71.28,37.92],[71.28,38.01],[71.33,38.17],[71.26,38.31],[71.05,38.42],[70.88,38.46],[70.74,38.42],[70.62,38.33],[70.52,38.19],[70.42,38.08],[70.31,37.98],[70.24,37.94],[70.21,37.92],[70.2,37.89],[70.25,37.77],[70.25,37.66],[70.19,37.58],[70.12,37.54],[70.04,37.55],[69.98,37.57],[69.94,37.6],[69.82,37.61],[69.63,37.59],[69.49,37.55],[69.42,37.49],[69.4,37.4],[69.43,37.29],[69.41,37.21],[69.35,37.15],[69.3,37.12],[69.26,37.11],[69.18,37.16],[69.05,37.27],[68.96,37.33],[68.91,37.33],[68.89,37.33],[68.86,37.32],[68.84,37.3],[68.82,37.27],[68.78,37.26],[68.72,37.27],[68.67,37.26],[68.64,37.22],[68.55,37.18],[68.39,37.14],[68.3,37.09],[68.28,37.04],[68.26,37.01],[68.21,37.02],[68.07,36.95],[67.96,36.97],[67.83,37.06],[67.77,37.14],[67.76,37.17],[67.8,37.24],[67.81,37.49],[67.86,37.57],[68.01,37.72],[68.09,37.84],[68.17,37.93],[68.24,37.96],[68.29,38.03],[68.34,38.12],[68.35,38.17],[68.35,38.21],[68.33,38.24],[68.25,38.29],[68.14,38.38],[68.09,38.47],[68.06,38.59],[68.05,38.67],[68.15,38.89],[68.13,38.93],[68.1,38.96],[68.04,38.98],[67.96,38.99],[67.88,38.98],[67.77,38.98],[67.69,38.99],[67.68,39.01],[67.67,39.11],[67.65,39.13],[67.62,39.15],[67.4,39.2],[67.36,39.22],[67.35,39.24],[67.43,39.47],[67.46,39.48],[67.49,39.52],[67.54,39.56],[67.72,39.62],[67.91,39.59],[68.08,39.56],[68.24,39.55],[68.3,39.54],[68.4,39.53],[68.46,39.54],[68.51,39.56],[68.59,39.63],[68.61,39.74],[68.64,39.84],[68.69,39.85],[68.74,39.84],[68.76,39.86],[68.77,39.88],[68.78,39.9],[68.8,39.91],[68.83,39.88],[68.85,39.89],[68.87,39.91],[68.86,39.93],[68.82,39.96],[68.79,40.01],[68.79,40.03],[68.8,40.05],[68.91,40.07],[68.96,40.07],[68.97,40.09],[68.97,40.12],[68.93,40.14],[68.78,40.13],[68.64,40.13],[68.62,40.15],[68.63,40.17],[68.65,40.18],[68.95,40.22],[69.11,40.21],[69.23,40.19],[69.27,40.2],[69.22,40.29],[69.29,40.3],[69.3,40.33],[69.21,40.57],[69.26,40.59],[69.31,40.63],[69.31,40.72],[69.36,40.77],[69.41,40.8],[69.5,40.77],[69.63,40.68],[69.67,40.66],[69.71,40.66],[69.77,40.68],[70.01,40.77],[70.14,40.82],[70.29,40.89],[70.32,40.92],[70.37,41.03],[70.4,41.04],[70.44,41.02],[70.58,40.91],[70.66,40.84],[70.66,40.82],[70.63,40.8],[70.64,40.78],[70.75,40.74],[70.75,40.72],[70.73,40.69],[70.71,40.67],[70.7,40.66],[70.55,40.56],[70.38,40.45],[70.38,40.44],[70.37,40.41],[70.37,40.38],[70.4,40.36],[70.47,40.35],[70.53,40.32],[70.57,40.27],[70.6,40.21],[70.65,40.2],[70.9,40.23],[70.96,40.24],[70.96,40.22],[70.95,40.19],[70.74,40.13],[70.64,40.08],[70.62,40.0],[70.6,39.97],[70.56,39.95],[70.52,39.95],[70.45,40.05],[70.38,40.07],[70.27,40.1],[70.07,40.17],[69.97,40.2],[69.77,40.16],[69.53,40.1],[69.49,40.06],[69.47,40.02],[69.47,39.99],[69.49,39.95],[69.48,39.92],[69.43,39.91],[69.37,39.95],[69.31,39.97],[69.28,39.92],[69.24,39.83],[69.23,39.76],[69.28,39.67],[69.3,39.52],[69.39,39.53],[69.46,39.53],[69.6,39.57],[69.67,39.57],[69.77,39.56],[69.96,39.55],[70.1,39.56],[70.14,39.56],[70.17,39.58],[70.21,39.58],[70.24,39.54],[70.39,39.58],[70.5,39.59],[70.57,39.58],[70.61,39.56],[70.68,39.47],[70.73,39.41],[70.8,39.39],[71.0,39.41],[71.07,39.49],[71.12,39.51],[71.2,39.52],[71.27,39.54],[71.33,39.57],[71.4,39.6],[71.47,39.6],[71.5,39.58],[71.52,39.55],[71.51,39.52],[71.5,39.48],[71.55,39.45],[71.67,39.45],[71.73,39.42],[71.74,39.38],[71.73,39.31],[71.78,39.28],[71.81,39.28],[71.99,39.35],[72.04,39.35],[72.08,39.31],[72.15,39.26],[72.23,39.21],[72.25,39.22],[72.29,39.27],[72.36,39.34],[72.49,39.36],[72.56,39.38],[72.64,39.39],[72.87,39.36],[72.95,39.36],[73.11,39.36],[73.23,39.37],[73.34,39.41],[73.39,39.44],[73.47,39.46],[73.58,39.46],[73.63,39.45],[73.64,39.4],[73.62,39.3],[73.61,39.23],[73.69,39.1],[73.74,39.04],[73.8,39.0],[73.81,38.97],[73.79,38.94],[73.73,38.91],[73.71,38.89],[73.7,38.85],[73.72,38.82],[73.75,38.7],[73.8,38.61],[73.87,38.56],[73.97,38.53],[74.03,38.54],[74.07,38.61],[74.13,38.66],[74.19,38.66],[74.28,38.66],[74.51,38.6],[74.75,38.51],[74.81,38.46],[74.84,38.4],[74.77,38.27],[74.78,38.19],[74.79,38.1],[74.84,38.04],[74.89,37.93],[74.9,37.83],[74.92,37.8],[74.94,37.77],[74.91,37.69],[74.89,37.6],[74.92,37.57],[74.99,37.53],[75.1,37.45],[75.12,37.39],[75.08,37.34],[75.01,37.29],[74.92,37.25],[74.89,37.23]],[[70.7,39.83],[70.61,39.79],[70.56,39.79],[70.52,39.83],[70.49,39.86],[70.48,39.88],[70.5,39.88],[70.57,39.87],[70.66,39.86],[70.7,39.85],[70.7,39.83]],[[70.65,40.94],[70.62,40.93],[70.57,40.98],[70.55,41.01],[70.57,41.02],[70.62,41.0],[70.65,40.96],[70.65,40.94]]]},{"n":"Turkmenistan","r":[[[66.52,37.35],[66.47,37.34],[66.35,37.37],[66.11,37.41],[65.9,37.51],[65.77,37.57],[65.74,37.56],[65.68,37.52],[65.64,37.47],[65.61,37.37],[65.55,37.25],[65.3,37.25],[65.09,37.24],[64.95,37.19],[64.82,37.13],[64.78,37.06],[64.75,36.96],[64.67,36.75],[64.6,36.55],[64.57,36.43],[64.51,36.34],[64.36,36.23],[64.18,36.15],[64.09,36.11],[64.05,36.07],[64.04,36.03],[64.01,36.01],[63.94,36.02],[63.86,36.01],[63.7,35.97],[63.52,35.91],[63.3,35.86],[63.18,35.86],[63.13,35.85],[63.11,35.82],[63.13,35.77],[63.15,35.73],[63.17,35.68],[63.12,35.64],[63.08,35.57],[63.06,35.45],[62.98,35.41],[62.86,35.35],[62.72,35.27],[62.69,35.26],[62.61,35.23],[62.53,35.24],[62.46,35.25],[62.39,35.23],[62.31,35.17],[62.27,35.19],[62.25,35.25],[62.21,35.29],[62.09,35.38],[61.98,35.44],[61.94,35.45],[61.84,35.43],[61.72,35.42],[61.62,35.43],[61.54,35.46],[61.42,35.55],[61.38,35.59],[61.34,35.63],[61.26,35.62],[61.24,35.66],[61.24,35.71],[61.26,35.76],[61.25,35.87],[61.21,35.94],[61.15,35.98],[61.16,36.0],[61.18,36.05],[61.21,36.1],[61.21,36.19],[61.18,36.29],[61.16,36.43],[61.17,36.57],[61.12,36.64],[60.71,36.64],[60.34,36.64],[60.32,36.65],[60.18,36.83],[60.06,36.96],[59.95,37.04],[59.69,37.14],[59.56,37.18],[59.45,37.25],[59.37,37.33],[59.34,37.44],[59.33,37.48],[59.3,37.51],[59.27,37.52],[59.24,37.52],[58.94,37.65],[58.82,37.68],[58.7,37.66],[58.65,37.65],[58.55,37.69],[58.44,37.64],[58.39,37.64],[58.32,37.65],[58.26,37.67],[58.11,37.78],[57.98,37.83],[57.89,37.86],[57.71,37.91],[57.52,37.93],[57.42,37.95],[57.35,37.97],[57.34,37.99],[57.34,38.03],[57.33,38.09],[57.31,38.13],[57.26,38.18],[57.19,38.22],[57.08,38.21],[56.91,38.21],[56.77,38.25],[56.67,38.26],[56.54,38.25],[56.44,38.25],[56.37,38.22],[56.32,38.19],[56.3,38.09],[56.27,38.08],[56.23,38.07],[56.17,38.08],[56.05,38.08],[55.84,38.09],[55.58,38.1],[55.38,38.05],[55.22,37.98],[55.08,37.9],[54.9,37.78],[54.85,37.72],[54.75,37.5],[54.7,37.47],[54.64,37.44],[54.58,37.44],[54.46,37.41],[54.3,37.35],[54.19,37.33],[53.91,37.34],[53.9,37.41],[53.85,37.67],[53.82,37.93],[53.83,38.05],[53.85,38.29],[53.85,38.41],[53.84,38.51],[53.85,38.62],[53.87,38.74],[53.89,38.86],[53.87,38.95],[53.81,39.02],[53.72,39.1],[53.71,39.15],[53.7,39.21],[53.62,39.22],[53.54,39.27],[53.48,39.31],[53.34,39.34],[53.27,39.34],[53.2,39.32],[53.16,39.26],[53.12,39.35],[53.12,39.43],[53.24,39.61],[53.3,39.56],[53.39,39.54],[53.5,39.53],[53.6,39.55],[53.58,39.61],[53.53,39.64],[53.47,39.67],[53.45,39.75],[53.46,39.83],[53.49,39.91],[53.45,39.94],[53.4,39.96],[53.29,39.96],[53.14,39.98],[52.99,39.99],[52.95,39.9],[53.04,39.77],[52.96,39.83],[52.9,39.91],[52.8,40.05],[52.74,40.22],[52.73,40.4],[52.78,40.55],[52.85,40.69],[52.89,40.86],[52.94,41.04],[53.0,40.96],[53.06,40.89],[53.15,40.82],[53.19,40.81],[53.33,40.78],[53.42,40.79],[53.52,40.83],[53.62,40.82],[53.69,40.75],[53.76,40.67],[53.87,40.65],[54.09,40.71],[54.19,40.72],[54.28,40.69],[54.33,40.69],[54.38,40.69],[54.34,40.76],[54.32,40.83],[54.37,40.87],[54.55,40.83],[54.66,40.86],[54.69,40.87],[54.71,40.89],[54.72,40.95],[54.72,41.01],[54.7,41.07],[54.67,41.12],[54.59,41.19],[54.28,41.36],[54.18,41.43],[54.09,41.52],[54.04,41.64],[54.0,41.77],[53.95,41.87],[53.85,42.09],[53.8,42.12],[53.75,42.13],[53.62,42.14],[53.5,42.12],[53.28,42.08],[53.16,42.09],[53.11,42.07],[52.97,41.98],[52.91,41.9],[52.81,41.71],[52.88,41.65],[52.88,41.61],[52.83,41.34],[52.86,41.21],[52.85,41.2],[52.83,41.23],[52.75,41.37],[52.61,41.53],[52.49,41.78],[52.7,41.94],[52.87,42.06],[53.01,42.13],[53.06,42.15],[53.25,42.21],[53.5,42.26],[53.69,42.3],[53.93,42.33],[54.01,42.34],[54.12,42.34],[54.21,42.3],[54.27,42.28],[54.47,42.18],[54.68,42.08],[54.85,41.97],[54.9,41.92],[54.93,41.86],[54.95,41.81],[55.1,41.64],[55.16,41.56],[55.25,41.46],[55.32,41.41],[55.39,41.35],[55.43,41.3],[55.49,41.27],[55.55,41.26],[55.68,41.28],[55.84,41.31],[55.93,41.32],[55.98,41.32],[56.24,41.31],[56.48,41.3],[56.77,41.29],[56.86,41.28],[56.97,41.27],[57.02,41.26],[57.06,41.31],[57.09,41.33],[57.12,41.35],[57.11,41.37],[57.08,41.39],[57.02,41.45],[56.98,41.67],[56.96,41.86],[57.03,41.91],[57.11,41.96],[57.23,42.08],[57.29,42.12],[57.38,42.16],[57.69,42.16],[57.81,42.19],[57.86,42.23],[57.92,42.34],[57.95,42.42],[57.98,42.46],[58.03,42.49],[58.08,42.49],[58.17,42.46],[58.23,42.45],[58.28,42.43],[58.33,42.4],[58.37,42.35],[58.38,42.31],[58.4,42.29],[58.43,42.29],[58.46,42.29],[58.47,42.3],[58.49,42.32],[58.48,42.34],[58.42,42.41],[58.29,42.53],[58.2,42.58],[58.16,42.6],[58.15,42.63],[58.21,42.67],[58.26,42.69],[58.35,42.67],[58.48,42.66],[58.53,42.68],[58.59,42.78],[58.73,42.68],[58.88,42.56],[58.93,42.54],[59.04,42.53],[59.12,42.52],[59.16,42.51],[59.2,42.48],[59.28,42.36],[59.35,42.32],[59.45,42.3],[59.76,42.3],[59.86,42.3],[59.94,42.24],[59.99,42.21],[60.01,42.19],[60.0,42.16],[59.98,42.13],[59.98,42.07],[59.97,42.02],[59.95,42.0],[59.94,41.97],[59.96,41.95],[60.11,41.91],[60.16,41.86],[60.19,41.83],[60.2,41.8],[60.18,41.78],[60.11,41.79],[60.08,41.76],[60.08,41.7],[60.12,41.64],[60.14,41.59],[60.11,41.55],[60.07,41.48],[60.07,41.43],[60.09,41.4],[60.2,41.35],[60.45,41.22],[60.51,41.22],[60.75,41.25],[60.87,41.25],[60.93,41.23],[61.12,41.21],[61.18,41.19],[61.24,41.19],[61.33,41.2],[61.39,41.25],[61.42,41.27],[61.44,41.27],[61.5,41.28],[61.64,41.24],[61.8,41.16],[61.9,41.09],[61.95,41.03],[62.02,40.89],[62.1,40.68],[62.19,40.54],[62.3,40.47],[62.38,40.33],[62.44,40.04],[62.48,39.98],[62.53,39.94],[62.65,39.86],[62.91,39.72],[63.06,39.63],[63.29,39.5],[63.51,39.38],[63.72,39.19],[63.76,39.16],[63.95,39.06],[64.16,38.95],[64.31,38.98],[64.53,38.82],[64.62,38.76],[64.66,38.74],[64.82,38.67],[65.08,38.54],[65.4,38.35],[65.61,38.24],[65.67,38.23],[65.73,38.23],[65.79,38.25],[65.86,38.27],[65.97,38.24],[66.09,38.2],[66.17,38.17],[66.26,38.12],[66.34,38.07],[66.39,38.05],[66.57,38.01],[66.61,37.99],[66.63,37.96],[66.63,37.93],[66.53,37.79],[66.51,37.6],[66.51,37.46],[66.52,37.35]],[[53.11,38.8],[53.1,38.76],[53.05,38.9],[53.02,39.05],[53.05,39.1],[53.09,39.09],[53.06,39.04],[53.11,38.8]]]},{"n":"East Timor","r":[[[124.44,-9.19],[124.44,-9.24],[124.41,-9.31],[124.38,-9.35],[124.32,-9.41],[124.28,-9.43],[124.13,-9.41],[124.12,-9.42],[124.09,-9.42],[124.05,-9.38],[124.04,-9.34],[124.2,-9.26],[124.44,-9.19]],[[125.07,-9.51],[125.03,-9.38],[125.0,-9.33],[124.97,-9.29],[124.96,-9.25],[124.96,-9.21],[124.98,-9.19],[125.1,-9.19],[125.15,-9.12],[125.15,-9.04],[125.12,-9.02],[125.1,-9.0],[124.97,-9.06],[124.94,-9.05],[124.92,-9.03],[124.92,-8.94],[125.03,-8.86],[125.12,-8.71],[125.18,-8.65],[125.32,-8.59],[125.38,-8.58],[125.8,-8.49],[125.91,-8.49],[126.17,-8.49],[126.53,-8.47],[126.62,-8.46],[126.73,-8.42],[126.85,-8.38],[126.9,-8.34],[126.97,-8.32],[127.06,-8.35],[127.21,-8.37],[127.26,-8.39],[127.3,-8.42],[127.11,-8.58],[126.92,-8.72],[126.79,-8.76],[126.67,-8.78],[126.57,-8.83],[126.49,-8.91],[126.38,-8.96],[126.26,-8.97],[126.16,-9.0],[126.07,-9.04],[125.95,-9.12],[125.89,-9.13],[125.84,-9.13],[125.74,-9.16],[125.41,-9.28],[125.21,-9.4],[125.07,-9.51]],[[125.65,-8.14],[125.58,-8.31],[125.51,-8.28],[125.58,-8.18],[125.62,-8.15],[125.65,-8.14]]]},{"n":"Tonga","r":[[[-174.91,-21.3],[-174.92,-21.45],[-174.97,-21.38],[-174.97,-21.35],[-174.92,-21.3],[-174.91,-21.3]],[[-175.16,-21.17],[-175.15,-21.17],[-175.13,-21.14],[-175.08,-21.13],[-175.08,-21.16],[-175.16,-21.26],[-175.2,-21.22],[-175.34,-21.16],[-175.36,-21.11],[-175.32,-21.07],[-175.32,-21.1],[-175.3,-21.11],[-175.23,-21.12],[-175.16,-21.15],[-175.2,-21.16],[-175.16,-21.17]],[[-173.95,-18.64],[-173.99,-18.7],[-174.01,-18.7],[-174.05,-18.66],[-174.07,-18.64],[-174.0,-18.57],[-173.97,-18.57],[-173.92,-18.59],[-173.92,-18.61],[-173.95,-18.64]]]},{"n":"Trinidad and Tobago","r":[[[-61.01,10.13],[-61.17,10.08],[-61.6,10.06],[-61.77,10.09],[-61.91,10.07],[-61.66,10.19],[-61.63,10.24],[-61.53,10.25],[-61.5,10.27],[-61.46,10.54],[-61.48,10.6],[-61.5,10.64],[-61.54,10.66],[-61.64,10.7],[-61.65,10.72],[-61.59,10.75],[-61.46,10.76],[-61.37,10.8],[-61.17,10.8],[-61.08,10.83],[-60.92,10.84],[-61.0,10.72],[-61.03,10.67],[-61.02,10.56],[-61.04,10.48],[-61.02,10.39],[-60.97,10.32],[-61.0,10.26],[-61.0,10.17],[-61.01,10.13]],[[-60.76,11.18],[-60.81,11.17],[-60.8,11.21],[-60.71,11.28],[-60.56,11.32],[-60.53,11.33],[-60.55,11.26],[-60.76,11.18]]]},{"n":"Tunisia","r":[[[9.52,30.23],[9.46,30.47],[9.41,30.67],[9.36,30.83],[9.29,31.13],[9.22,31.37],[9.16,31.62],[9.1,31.85],[9.04,32.07],[9.02,32.11],[8.84,32.21],[8.68,32.31],[8.52,32.42],[8.33,32.54],[8.3,32.7],[8.21,32.93],[8.11,33.06],[8.08,33.09],[7.88,33.17],[7.76,33.23],[7.73,33.27],[7.71,33.36],[7.63,33.55],[7.53,33.72],[7.5,33.83],[7.5,33.98],[7.51,34.08],[7.55,34.12],[7.75,34.25],[7.84,34.41],[7.95,34.47],[8.05,34.51],[8.12,34.56],[8.19,34.65],[8.25,34.73],[8.25,34.83],[8.28,34.98],[8.31,35.08],[8.39,35.2],[8.36,35.3],[8.32,35.4],[8.33,35.58],[8.32,35.65],[8.28,35.72],[8.25,35.8],[8.25,35.87],[8.28,36.05],[8.31,36.19],[8.35,36.37],[8.33,36.42],[8.3,36.46],[8.21,36.5],[8.21,36.52],[8.23,36.55],[8.37,36.63],[8.44,36.76],[8.51,36.79],[8.6,36.83],[8.6,36.88],[8.58,36.94],[8.82,37.0],[9.06,37.16],[9.14,37.19],[9.69,37.34],[9.76,37.33],[9.84,37.31],[9.82,37.25],[9.78,37.21],[9.83,37.14],[9.9,37.18],[9.88,37.21],[9.88,37.25],[9.99,37.26],[10.09,37.25],[10.2,37.21],[10.19,37.03],[10.33,36.87],[10.29,36.78],[10.41,36.73],[10.52,36.79],[10.57,36.88],[10.77,36.93],[10.95,37.06],[11.05,37.07],[11.08,36.97],[11.13,36.87],[11.06,36.84],[10.97,36.74],[10.8,36.49],[10.64,36.42],[10.53,36.32],[10.49,36.25],[10.48,36.18],[10.51,36.03],[10.59,35.89],[10.69,35.8],[10.78,35.77],[11.0,35.63],[11.0,35.55],[11.03,35.45],[11.04,35.34],[11.12,35.24],[10.96,35.03],[10.87,34.88],[10.69,34.68],[10.53,34.54],[10.2,34.35],[10.12,34.28],[10.06,34.21],[10.04,34.14],[10.05,34.06],[10.16,33.85],[10.31,33.73],[10.45,33.66],[10.71,33.69],[10.7,33.61],[10.72,33.51],[10.83,33.52],[10.9,33.53],[10.96,33.63],[11.08,33.56],[11.15,33.37],[11.26,33.31],[11.27,33.29],[11.23,33.27],[11.2,33.25],[11.23,33.23],[11.34,33.21],[11.4,33.22],[11.5,33.18],[11.5,33.16],[11.47,32.97],[11.46,32.9],[11.45,32.78],[11.45,32.64],[11.53,32.52],[11.54,32.47],[11.5,32.41],[11.36,32.35],[11.17,32.26],[11.01,32.17],[10.83,32.08],[10.77,32.02],[10.68,31.98],[10.61,31.93],[10.6,31.89],[10.54,31.8],[10.48,31.74],[10.31,31.7],[10.27,31.68],[10.2,31.59],[10.16,31.55],[10.11,31.46],[10.17,31.25],[10.24,31.03],[10.26,30.94],[10.26,30.86],[10.22,30.78],[10.13,30.67],[10.06,30.58],[9.93,30.43],[9.9,30.39],[9.81,30.34],[9.64,30.28],[9.52,30.23]],[[10.96,33.72],[10.93,33.72],[10.88,33.69],[10.86,33.69],[10.78,33.72],[10.76,33.72],[10.72,33.74],[10.73,33.86],[10.75,33.89],[10.92,33.89],[11.02,33.82],[11.03,33.81],[11.04,33.79],[10.99,33.75],[10.96,33.72]],[[11.28,34.75],[11.12,34.68],[11.15,34.74],[11.25,34.82],[11.28,34.8],[11.28,34.75]]]},{"n":"Turkey","r":[[[43.44,41.11],[43.46,41.06],[43.52,41.0],[43.59,40.97],[43.63,40.93],[43.7,40.79],[43.72,40.72],[43.71,40.65],[43.67,40.57],[43.57,40.48],[43.59,40.44],[43.62,40.39],[43.61,40.36],[43.68,40.24],[43.71,40.17],[43.68,40.15],[43.67,40.13],[43.79,40.07],[43.94,40.02],[44.01,40.01],[44.18,40.04],[44.29,40.04],[44.4,40.0],[44.56,39.89],[44.73,39.75],[44.77,39.7],[44.78,39.68],[44.82,39.65],[44.78,39.65],[44.72,39.68],[44.59,39.77],[44.52,39.73],[44.46,39.67],[44.39,39.42],[44.34,39.4],[44.24,39.4],[44.12,39.41],[44.04,39.39],[44.02,39.38],[44.03,39.35],[44.06,39.31],[44.07,39.26],[44.08,39.22],[44.12,39.18],[44.18,39.14],[44.18,39.11],[44.17,39.06],[44.16,39.02],[44.14,38.99],[44.17,38.93],[44.23,38.86],[44.27,38.84],[44.26,38.7],[44.28,38.64],[44.3,38.56],[44.29,38.42],[44.3,38.39],[44.32,38.37],[44.38,38.37],[44.43,38.36],[44.45,38.33],[44.45,38.32],[44.38,38.25],[44.37,38.21],[44.35,38.15],[44.33,38.11],[44.27,38.04],[44.23,37.97],[44.21,37.91],[44.22,37.88],[44.34,37.87],[44.4,37.83],[44.56,37.74],[44.59,37.71],[44.55,37.66],[44.55,37.64],[44.57,37.61],[44.58,37.56],[44.57,37.51],[44.57,37.44],[44.6,37.42],[44.72,37.36],[44.79,37.29],[44.8,37.27],[44.76,37.22],[44.77,37.16],[44.77,37.14],[44.73,37.17],[44.67,37.17],[44.61,37.18],[44.57,37.16],[44.5,37.11],[44.4,37.06],[44.33,37.01],[44.28,36.98],[44.25,36.98],[44.22,37.01],[44.2,37.05],[44.21,37.2],[44.19,37.25],[44.16,37.28],[44.11,37.3],[44.06,37.31],[44.01,37.31],[43.94,37.27],[43.84,37.22],[43.68,37.23],[43.57,37.24],[43.52,37.24],[43.31,37.31],[43.26,37.32],[43.19,37.34],[43.09,37.37],[42.94,37.32],[42.87,37.33],[42.77,37.37],[42.74,37.36],[42.64,37.25],[42.46,37.13],[42.36,37.11],[42.31,37.23],[42.27,37.28],[42.25,37.28],[42.2,37.3],[42.17,37.29],[42.06,37.21],[41.89,37.16],[41.74,37.13],[41.52,37.09],[41.34,37.07],[41.26,37.07],[41.1,37.09],[40.96,37.11],[40.82,37.11],[40.71,37.1],[40.45,37.01],[40.02,36.83],[39.69,36.74],[39.5,36.7],[39.36,36.68],[39.11,36.68],[38.91,36.69],[38.77,36.69],[38.69,36.72],[38.58,36.79],[38.44,36.86],[38.38,36.88],[38.31,36.89],[38.19,36.9],[37.91,36.79],[37.82,36.77],[37.72,36.74],[37.52,36.68],[37.44,36.64],[37.33,36.65],[37.19,36.66],[37.07,36.65],[36.99,36.7],[36.94,36.76],[36.78,36.79],[36.66,36.8],[36.63,36.78],[36.6,36.7],[36.55,36.51],[36.54,36.46],[36.64,36.26],[36.64,36.23],[36.56,36.22],[36.48,36.22],[36.42,36.2],[36.38,36.17],[36.35,36.0],[36.25,35.97],[36.2,35.94],[36.15,35.83],[36.13,35.83],[35.97,35.91],[35.89,35.92],[35.96,36.0],[35.89,36.16],[35.81,36.31],[35.88,36.41],[36.03,36.52],[36.19,36.66],[36.19,36.74],[36.18,36.81],[36.14,36.85],[36.05,36.91],[35.9,36.85],[35.8,36.78],[35.73,36.76],[35.66,36.72],[35.63,36.65],[35.54,36.6],[35.39,36.58],[35.18,36.63],[34.94,36.73],[34.81,36.8],[34.7,36.82],[34.6,36.78],[34.3,36.6],[34.02,36.34],[33.95,36.3],[33.69,36.18],[33.52,36.14],[33.44,36.15],[33.1,36.1],[32.93,36.1],[32.79,36.04],[32.53,36.1],[32.38,36.18],[32.28,36.27],[32.13,36.45],[32.02,36.54],[31.78,36.61],[31.35,36.8],[31.24,36.82],[30.95,36.85],[30.64,36.87],[30.58,36.8],[30.56,36.53],[30.51,36.45],[30.48,36.31],[30.45,36.27],[30.39,36.24],[30.3,36.29],[30.23,36.31],[30.08,36.25],[29.79,36.17],[29.69,36.16],[29.35,36.26],[29.22,36.32],[29.14,36.4],[29.12,36.52],[29.07,36.59],[29.06,36.64],[29.04,36.69],[28.97,36.72],[28.9,36.67],[28.82,36.68],[28.72,36.7],[28.48,36.8],[28.3,36.81],[28.2,36.69],[28.11,36.65],[28.02,36.63],[28.01,36.67],[28.08,36.75],[27.8,36.74],[27.66,36.67],[27.54,36.68],[27.45,36.71],[27.47,36.75],[27.55,36.76],[27.63,36.79],[27.93,36.81],[28.01,36.83],[28.08,36.92],[28.22,37.0],[28.24,37.03],[28.13,37.03],[27.67,37.01],[27.35,37.02],[27.31,36.98],[27.26,36.98],[27.25,37.08],[27.3,37.13],[27.37,37.12],[27.54,37.16],[27.52,37.25],[27.4,37.31],[27.38,37.34],[27.29,37.35],[27.22,37.39],[27.2,37.49],[27.15,37.6],[27.07,37.66],[27.08,37.69],[27.22,37.73],[27.25,37.88],[27.23,37.98],[27.16,37.99],[26.94,38.06],[26.88,38.05],[26.81,38.14],[26.68,38.2],[26.62,38.18],[26.58,38.15],[26.52,38.16],[26.43,38.21],[26.33,38.24],[26.29,38.28],[26.34,38.37],[26.42,38.37],[26.43,38.44],[26.37,38.56],[26.38,38.62],[26.44,38.64],[26.51,38.63],[26.59,38.56],[26.61,38.49],[26.6,38.42],[26.64,38.35],[26.67,38.34],[26.7,38.41],[26.73,38.42],[26.77,38.39],[26.86,38.37],[27.1,38.42],[27.14,38.45],[26.97,38.45],[26.91,38.48],[26.84,38.56],[26.8,38.63],[26.79,38.66],[26.76,38.71],[26.79,38.74],[26.91,38.78],[27.01,38.89],[26.97,38.92],[26.92,38.93],[26.87,38.92],[26.81,38.96],[26.81,39.01],[26.85,39.06],[26.85,39.12],[26.72,39.26],[26.68,39.29],[26.71,39.34],[26.81,39.42],[26.91,39.52],[26.9,39.55],[26.83,39.56],[26.48,39.52],[26.35,39.48],[26.11,39.47],[26.1,39.52],[26.1,39.57],[26.15,39.66],[26.15,39.87],[26.18,39.99],[26.31,40.02],[26.48,40.2],[26.74,40.4],[27.01,40.4],[27.12,40.45],[27.28,40.46],[27.31,40.41],[27.33,40.38],[27.48,40.32],[27.73,40.33],[27.79,40.35],[27.85,40.38],[27.73,40.48],[27.77,40.51],[27.87,40.51],[27.99,40.49],[27.99,40.47],[27.96,40.44],[27.93,40.38],[27.96,40.37],[28.29,40.4],[28.63,40.38],[28.74,40.39],[29.01,40.39],[29.06,40.42],[28.97,40.47],[28.89,40.48],[28.84,40.5],[28.79,40.53],[28.96,40.63],[29.05,40.65],[29.51,40.71],[29.84,40.74],[29.85,40.76],[29.8,40.76],[29.36,40.81],[29.26,40.85],[29.11,40.94],[29.08,40.96],[29.05,41.01],[29.07,41.1],[29.09,41.18],[29.15,41.22],[29.32,41.23],[29.92,41.15],[30.34,41.2],[30.81,41.08],[31.25,41.11],[31.35,41.16],[31.46,41.32],[32.09,41.59],[32.31,41.73],[32.54,41.81],[32.95,41.89],[33.28,42.0],[33.38,42.02],[34.19,41.96],[34.75,41.96],[35.01,42.06],[35.15,42.03],[35.14,41.99],[35.11,41.96],[35.12,41.89],[35.21,41.79],[35.3,41.73],[35.56,41.63],[35.92,41.71],[35.98,41.7],[36.05,41.68],[36.18,41.43],[36.28,41.34],[36.41,41.27],[36.51,41.26],[36.59,41.33],[36.65,41.35],[36.78,41.36],[36.99,41.28],[37.07,41.18],[37.43,41.11],[37.77,41.08],[37.91,41.0],[38.38,40.92],[38.56,40.94],[38.85,41.02],[39.43,41.11],[39.81,40.98],[39.91,40.97],[40.0,40.98],[40.13,40.94],[40.27,40.96],[40.69,41.11],[40.82,41.19],[40.96,41.21],[41.08,41.26],[41.41,41.42],[41.51,41.52],[41.58,41.5],[41.7,41.47],[41.78,41.44],[41.82,41.43],[41.93,41.5],[42.08,41.49],[42.21,41.49],[42.28,41.48],[42.36,41.45],[42.47,41.44],[42.51,41.47],[42.57,41.56],[42.59,41.57],[42.61,41.58],[42.68,41.59],[42.75,41.58],[42.79,41.56],[42.82,41.49],[42.91,41.47],[43.06,41.35],[43.15,41.31],[43.17,41.29],[43.14,41.26],[43.15,41.24],[43.21,41.2],[43.28,41.19],[43.36,41.19],[43.4,41.18],[43.43,41.16],[43.44,41.13],[43.44,41.11]],[[26.32,41.72],[26.32,41.74],[26.33,41.77],[26.36,41.8],[26.51,41.83],[26.53,41.85],[26.55,41.9],[26.58,41.95],[26.62,41.96],[26.68,41.96],[26.8,41.98],[26.88,41.99],[26.97,42.03],[27.01,42.06],[27.19,42.08],[27.24,42.09],[27.29,42.08],[27.36,42.03],[27.47,41.95],[27.53,41.92],[27.58,41.93],[27.66,41.96],[27.74,41.96],[27.8,41.96],[27.83,41.98],[27.88,41.99],[28.01,41.97],[27.99,41.85],[28.05,41.73],[28.2,41.55],[28.35,41.47],[28.95,41.25],[29.06,41.23],[29.03,41.14],[29.0,41.06],[28.96,41.01],[28.78,40.97],[28.29,41.07],[28.17,41.08],[28.09,41.06],[27.93,40.99],[27.75,41.01],[27.5,40.97],[27.43,40.84],[27.26,40.69],[26.97,40.56],[26.77,40.5],[26.47,40.26],[26.33,40.12],[26.27,40.1],[26.2,40.08],[26.23,40.14],[26.26,40.2],[26.25,40.25],[26.25,40.31],[26.36,40.39],[26.45,40.45],[26.72,40.54],[26.79,40.63],[26.58,40.62],[26.36,40.61],[26.22,40.62],[26.11,40.61],[26.07,40.68],[26.04,40.73],[26.07,40.74],[26.11,40.75],[26.18,40.83],[26.24,40.88],[26.33,40.95],[26.35,41.0],[26.35,41.04],[26.33,41.06],[26.33,41.1],[26.33,41.14],[26.33,41.24],[26.54,41.34],[26.6,41.35],[26.62,41.4],[26.61,41.51],[26.58,41.6],[26.54,41.61],[26.5,41.63],[26.46,41.66],[26.41,41.7],[26.32,41.72]],[[25.97,40.14],[25.74,40.11],[25.67,40.14],[25.74,40.2],[25.87,40.23],[25.92,40.24],[25.98,40.18],[25.97,40.14]]]},{"n":"Taiwan","r":[[[118.41,24.52],[118.45,24.46],[118.43,24.41],[118.3,24.44],[118.29,24.48],[118.34,24.47],[118.41,24.52]],[[121.01,22.62],[120.95,22.5],[120.9,22.38],[120.88,22.26],[120.88,22.14],[120.86,22.03],[120.84,21.92],[120.74,21.96],[120.69,22.03],[120.68,22.16],[120.61,22.31],[120.58,22.36],[120.48,22.44],[120.39,22.48],[120.32,22.55],[120.33,22.54],[120.27,22.63],[120.23,22.72],[120.15,22.97],[120.12,23.04],[120.08,23.09],[120.07,23.15],[120.09,23.21],[120.12,23.31],[120.14,23.4],[120.13,23.53],[120.13,23.65],[120.16,23.71],[120.63,24.48],[120.76,24.64],[120.84,24.72],[120.9,24.81],[120.96,24.93],[121.04,25.03],[121.1,25.07],[121.37,25.16],[121.45,25.25],[121.52,25.28],[121.59,25.28],[121.64,25.23],[121.69,25.18],[121.73,25.15],[121.85,25.1],[121.91,25.06],[121.93,24.97],[121.86,24.9],[121.82,24.82],[121.81,24.75],[121.83,24.64],[121.83,24.53],[121.74,24.29],[121.64,24.13],[121.61,24.05],[121.58,23.86],[121.53,23.67],[121.48,23.42],[121.4,23.17],[121.35,23.07],[121.3,22.97],[121.16,22.78],[121.01,22.62]]]},{"n":"United Republic of Tanzania","r":[[[29.4,-4.45],[29.72,-4.46],[29.77,-4.42],[29.95,-4.31],[30.15,-4.09],[30.19,-3.99],[30.27,-3.85],[30.35,-3.78],[30.38,-3.73],[30.4,-3.65],[30.42,-3.59],[30.53,-3.49],[30.63,-3.42],[30.62,-3.39],[30.61,-3.37],[30.63,-3.35],[30.68,-3.31],[30.79,-3.27],[30.81,-3.2],[30.81,-3.12],[30.79,-3.07],[30.8,-3.02],[30.78,-2.98],[30.71,-2.98],[30.6,-2.94],[30.52,-2.92],[30.46,-2.89],[30.43,-2.87],[30.42,-2.82],[30.44,-2.77],[30.45,-2.75],[30.47,-2.69],[30.43,-2.66],[30.42,-2.64],[30.44,-2.61],[30.53,-2.43],[30.55,-2.4],[30.59,-2.4],[30.66,-2.37],[30.71,-2.36],[30.76,-2.37],[30.8,-2.36],[30.83,-2.34],[30.85,-2.27],[30.88,-2.14],[30.86,-2.04],[30.82,-1.97],[30.81,-1.85],[30.83,-1.69],[30.81,-1.56],[30.76,-1.46],[30.71,-1.4],[30.63,-1.37],[30.51,-1.21],[30.47,-1.13],[30.48,-1.08],[30.51,-1.07],[30.52,-1.06],[30.6,-1.07],[30.67,-1.05],[30.74,-1.01],[30.81,-0.99],[30.82,-1.0],[30.84,-1.0],[30.95,-1.0],[31.13,-1.0],[31.31,-1.0],[31.48,-1.0],[31.66,-1.0],[31.84,-1.0],[32.02,-1.0],[32.19,-1.0],[32.37,-1.0],[32.55,-1.0],[32.73,-1.0],[32.91,-1.0],[33.08,-1.0],[33.26,-1.0],[33.44,-1.0],[33.62,-1.0],[33.79,-1.0],[33.9,-1.0],[33.98,-1.0],[34.05,-1.04],[34.13,-1.08],[34.34,-1.2],[34.56,-1.32],[34.77,-1.44],[34.98,-1.56],[35.2,-1.68],[35.41,-1.8],[35.62,-1.92],[35.84,-2.04],[36.05,-2.16],[36.26,-2.27],[36.48,-2.39],[36.69,-2.51],[36.9,-2.63],[37.12,-2.75],[37.33,-2.87],[37.54,-2.99],[37.64,-3.05],[37.66,-3.07],[37.68,-3.18],[37.69,-3.25],[37.68,-3.31],[37.63,-3.41],[37.61,-3.46],[37.61,-3.5],[37.62,-3.51],[37.67,-3.52],[37.71,-3.54],[37.73,-3.56],[37.76,-3.64],[37.8,-3.67],[37.89,-3.74],[38.04,-3.85],[38.19,-3.96],[38.35,-4.07],[38.5,-4.18],[38.65,-4.29],[38.81,-4.4],[38.96,-4.51],[39.12,-4.62],[39.19,-4.68],[39.22,-4.69],[39.2,-4.78],[39.12,-4.98],[39.12,-5.07],[39.09,-5.17],[39.06,-5.23],[38.98,-5.52],[38.91,-5.63],[38.82,-5.88],[38.8,-6.07],[38.86,-6.2],[38.87,-6.33],[38.98,-6.46],[39.07,-6.5],[39.13,-6.56],[39.23,-6.69],[39.29,-6.81],[39.47,-6.88],[39.55,-7.02],[39.52,-7.12],[39.43,-7.21],[39.35,-7.34],[39.29,-7.52],[39.29,-7.79],[39.33,-7.75],[39.43,-7.81],[39.44,-8.01],[39.34,-8.24],[39.31,-8.35],[39.3,-8.44],[39.38,-8.72],[39.49,-8.86],[39.48,-8.91],[39.45,-8.94],[39.64,-9.19],[39.63,-9.41],[39.7,-9.58],[39.73,-9.72],[39.77,-9.84],[39.78,-9.91],[39.73,-10.0],[39.86,-10.02],[39.95,-10.09],[39.98,-10.16],[40.08,-10.16],[40.14,-10.2],[40.22,-10.24],[40.39,-10.35],[40.44,-10.41],[40.45,-10.44],[40.46,-10.46],[40.35,-10.55],[40.17,-10.69],[39.99,-10.82],[39.82,-10.91],[39.69,-10.95],[39.56,-10.98],[39.44,-11.03],[39.32,-11.12],[39.17,-11.17],[38.99,-11.17],[38.79,-11.23],[38.6,-11.35],[38.49,-11.41],[38.32,-11.31],[38.18,-11.28],[38.02,-11.28],[37.92,-11.29],[37.89,-11.32],[37.86,-11.38],[37.83,-11.48],[37.72,-11.58],[37.54,-11.68],[37.37,-11.71],[37.22,-11.69],[37.11,-11.65],[37.06,-11.59],[36.98,-11.57],[36.87,-11.57],[36.77,-11.61],[36.67,-11.68],[36.52,-11.72],[36.31,-11.71],[36.19,-11.67],[36.18,-11.61],[36.08,-11.54],[35.91,-11.45],[35.79,-11.45],[35.7,-11.53],[35.63,-11.58],[35.56,-11.6],[35.5,-11.6],[35.45,-11.59],[35.42,-11.58],[35.18,-11.57],[34.96,-11.58],[34.95,-11.54],[34.94,-11.46],[34.89,-11.39],[34.85,-11.35],[34.8,-11.34],[34.77,-11.34],[34.75,-11.31],[34.73,-11.24],[34.69,-11.18],[34.64,-11.13],[34.61,-11.08],[34.6,-11.04],[34.61,-10.99],[34.65,-10.87],[34.67,-10.79],[34.66,-10.71],[34.64,-10.63],[34.58,-10.53],[34.59,-10.5],[34.57,-10.43],[34.57,-10.38],[34.58,-10.32],[34.57,-10.24],[34.52,-10.07],[34.52,-10.03],[34.48,-9.95],[34.33,-9.76],[34.32,-9.73],[34.09,-9.54],[34.0,-9.5],[33.96,-9.53],[33.95,-9.57],[33.96,-9.63],[33.95,-9.66],[33.94,-9.67],[33.89,-9.67],[33.85,-9.66],[33.77,-9.61],[33.7,-9.6],[33.53,-9.61],[33.47,-9.62],[33.42,-9.61],[33.33,-9.52],[33.23,-9.5],[33.13,-9.5],[32.97,-9.4],[32.94,-9.4],[32.92,-9.41],[32.86,-9.38],[32.76,-9.32],[32.61,-9.27],[32.49,-9.21],[32.43,-9.16],[32.32,-9.13],[32.22,-9.13],[32.13,-9.07],[32.04,-9.07],[31.94,-9.05],[31.92,-9.02],[31.92,-8.94],[31.89,-8.92],[31.82,-8.9],[31.74,-8.9],[31.7,-8.91],[31.67,-8.91],[31.61,-8.86],[31.56,-8.81],[31.53,-8.71],[31.45,-8.65],[31.35,-8.61],[31.08,-8.61],[31.03,-8.6],[30.97,-8.55],[30.89,-8.47],[30.83,-8.39],[30.78,-8.27],[30.75,-8.19],[30.72,-8.1],[30.65,-7.97],[30.56,-7.78],[30.49,-7.63],[30.41,-7.46],[30.37,-7.34],[30.31,-7.2],[30.21,-7.04],[30.16,-6.97],[30.11,-6.92],[29.96,-6.8],[29.8,-6.69],[29.71,-6.62],[29.59,-6.39],[29.54,-6.31],[29.51,-6.17],[29.48,-6.02],[29.49,-5.97],[29.6,-5.78],[29.61,-5.72],[29.59,-5.65],[29.54,-5.5],[29.5,-5.4],[29.48,-5.32],[29.42,-5.18],[29.34,-4.98],[29.32,-4.9],[29.33,-4.84],[29.37,-4.67],[29.4,-4.5],[29.4,-4.45]],[[39.71,-7.98],[39.66,-7.99],[39.64,-7.98],[39.6,-7.94],[39.66,-7.9],[39.72,-7.83],[39.85,-7.73],[39.89,-7.66],[39.91,-7.65],[39.9,-7.73],[39.82,-7.9],[39.76,-7.91],[39.71,-7.98]],[[39.5,-6.17],[39.57,-6.39],[39.56,-6.43],[39.51,-6.45],[39.48,-6.45],[39.45,-6.42],[39.42,-6.35],[39.38,-6.36],[39.31,-6.28],[39.24,-6.28],[39.18,-6.17],[39.21,-6.08],[39.19,-5.93],[39.27,-5.85],[39.31,-5.72],[39.36,-5.81],[39.37,-5.95],[39.43,-6.12],[39.49,-6.17],[39.5,-6.17]],[[39.87,-4.91],[39.87,-4.96],[39.86,-5.0],[39.86,-5.16],[39.85,-5.26],[39.8,-5.39],[39.75,-5.44],[39.71,-5.43],[39.67,-5.41],[39.65,-5.37],[39.7,-5.11],[39.67,-4.93],[39.78,-4.94],[39.87,-4.91]]]},{"n":"Uganda","r":[[[29.58,-1.39],[29.58,-1.36],[29.56,-1.12],[29.56,-0.98],[29.59,-0.89],[29.61,-0.78],[29.61,-0.69],[29.65,-0.54],[29.63,-0.44],[29.68,-0.11],[29.7,-0.06],[29.72,0.1],[29.75,0.15],[29.78,0.17],[29.81,0.26],[29.89,0.42],[29.93,0.5],[29.92,0.67],[29.93,0.79],[29.94,0.82],[30.05,0.86],[30.18,0.97],[30.24,1.1],[30.32,1.19],[30.48,1.24],[30.48,1.24],[30.94,1.68],[31.16,1.92],[31.25,2.04],[31.26,2.09],[31.27,2.15],[31.24,2.19],[31.19,2.23],[31.18,2.27],[31.14,2.29],[31.08,2.29],[31.05,2.32],[31.0,2.37],[30.96,2.4],[30.83,2.4],[30.73,2.46],[30.73,2.53],[30.77,2.68],[30.85,2.85],[30.85,2.89],[30.84,2.93],[30.82,2.97],[30.79,3.0],[30.75,3.04],[30.78,3.16],[30.83,3.28],[30.87,3.34],[30.91,3.41],[30.9,3.46],[30.84,3.49],[30.87,3.54],[30.93,3.63],[31.05,3.72],[31.15,3.79],[31.22,3.79],[31.36,3.74],[31.48,3.68],[31.55,3.68],[31.63,3.7],[31.8,3.8],[31.84,3.77],[31.89,3.71],[31.94,3.61],[32.05,3.56],[32.1,3.53],[32.14,3.52],[32.16,3.53],[32.2,3.61],[32.25,3.65],[32.34,3.71],[32.53,3.75],[32.68,3.76],[32.74,3.77],[32.84,3.8],[33.0,3.88],[33.15,3.77],[33.32,3.75],[33.49,3.76],[33.54,3.79],[33.57,3.81],[33.74,3.99],[33.98,4.22],[34.13,3.89],[34.19,3.87],[34.18,3.84],[34.17,3.81],[34.27,3.73],[34.39,3.69],[34.44,3.65],[34.44,3.61],[34.4,3.41],[34.41,3.36],[34.45,3.16],[34.52,3.12],[34.59,2.92],[34.72,2.84],[34.74,2.82],[34.77,2.72],[34.81,2.62],[34.85,2.6],[34.87,2.59],[34.91,2.48],[34.88,2.42],[34.91,2.23],[34.96,2.06],[34.98,1.86],[34.98,1.77],[34.98,1.72],[34.97,1.64],[34.94,1.6],[34.9,1.56],[34.85,1.49],[34.81,1.42],[34.78,1.38],[34.8,1.27],[34.8,1.24],[34.79,1.23],[34.73,1.21],[34.65,1.19],[34.6,1.16],[34.54,1.1],[34.48,1.04],[34.41,0.87],[34.29,0.73],[34.27,0.69],[34.16,0.61],[34.11,0.51],[34.08,0.38],[34.04,0.29],[33.94,0.17],[33.92,-0.02],[33.92,-0.4],[33.9,-0.83],[33.9,-1.0],[33.79,-1.0],[33.62,-1.0],[33.44,-1.0],[33.26,-1.0],[33.08,-1.0],[32.91,-1.0],[32.73,-1.0],[32.55,-1.0],[32.37,-1.0],[32.19,-1.0],[32.02,-1.0],[31.84,-1.0],[31.66,-1.0],[31.48,-1.0],[31.31,-1.0],[31.13,-1.0],[30.95,-1.0],[30.84,-1.0],[30.82,-1.0],[30.81,-0.99],[30.74,-1.01],[30.67,-1.05],[30.6,-1.07],[30.52,-1.06],[30.51,-1.07],[30.47,-1.07],[30.41,-1.06],[30.36,-1.07],[30.32,-1.11],[30.28,-1.18],[30.21,-1.25],[30.15,-1.32],[30.1,-1.37],[29.99,-1.45],[29.93,-1.47],[29.9,-1.47],[29.88,-1.45],[29.85,-1.35],[29.83,-1.34],[29.61,-1.39],[29.58,-1.39]]]},{"n":"Ukraine","r":[[[23.61,51.52],[23.61,51.53],[23.61,51.61],[23.65,51.63],[23.71,51.64],[23.79,51.64],[23.86,51.62],[23.95,51.59],[23.98,51.59],[24.13,51.66],[24.28,51.77],[24.32,51.84],[24.36,51.87],[24.5,51.88],[24.61,51.89],[24.69,51.89],[24.87,51.9],[24.97,51.91],[25.07,51.93],[25.27,51.94],[25.58,51.92],[25.79,51.92],[25.93,51.91],[26.27,51.86],[26.39,51.84],[26.45,51.81],[26.57,51.8],[26.77,51.77],[26.95,51.75],[27.07,51.76],[27.14,51.75],[27.27,51.61],[27.3,51.6],[27.35,51.59],[27.45,51.61],[27.6,51.6],[27.69,51.57],[27.68,51.49],[27.7,51.48],[27.74,51.48],[27.79,51.53],[27.83,51.58],[27.86,51.59],[28.01,51.56],[28.08,51.57],[28.14,51.6],[28.18,51.61],[28.29,51.58],[28.42,51.56],[28.53,51.56],[28.6,51.54],[28.65,51.46],[28.69,51.44],[28.73,51.43],[28.79,51.51],[28.85,51.54],[28.93,51.56],[28.98,51.57],[29.01,51.6],[29.06,51.63],[29.1,51.63],[29.14,51.62],[29.17,51.58],[29.23,51.5],[29.3,51.41],[29.35,51.38],[29.47,51.41],[29.55,51.43],[29.71,51.44],[29.91,51.46],[30.06,51.48],[30.16,51.48],[30.22,51.45],[30.31,51.4],[30.33,51.33],[30.45,51.27],[30.54,51.27],[30.58,51.32],[30.63,51.36],[30.61,51.41],[30.6,51.47],[30.56,51.53],[30.53,51.6],[30.58,51.69],[30.64,51.77],[30.67,51.81],[30.76,51.9],[30.85,51.95],[30.98,52.05],[31.08,52.08],[31.17,52.06],[31.22,52.05],[31.35,52.11],[31.57,52.11],[31.76,52.1],[31.78,52.1],[31.88,52.07],[31.97,52.05],[32.04,52.05],[32.12,52.05],[32.22,52.08],[32.28,52.11],[32.36,52.27],[32.39,52.29],[32.44,52.31],[32.51,52.31],[32.65,52.28],[32.81,52.25],[32.9,52.26],[33.15,52.34],[33.29,52.35],[33.45,52.33],[33.61,52.33],[33.74,52.34],[33.82,52.32],[33.92,52.25],[34.02,52.16],[34.11,51.98],[34.4,51.78],[34.4,51.74],[34.38,51.72],[34.24,51.69],[34.12,51.68],[34.12,51.64],[34.15,51.61],[34.2,51.55],[34.21,51.48],[34.21,51.42],[34.23,51.36],[34.28,51.34],[34.28,51.31],[34.23,51.28],[34.21,51.26],[34.23,51.24],[34.49,51.24],[34.62,51.2],[34.71,51.17],[34.76,51.17],[34.87,51.19],[34.99,51.2],[35.06,51.2],[35.09,51.18],[35.12,51.12],[35.16,51.06],[35.2,51.04],[35.27,51.05],[35.31,51.04],[35.33,51.02],[35.31,50.99],[35.31,50.95],[35.35,50.9],[35.38,50.8],[35.42,50.77],[35.44,50.73],[35.44,50.68],[35.41,50.64],[35.39,50.61],[35.41,50.54],[35.49,50.46],[35.55,50.44],[35.59,50.37],[35.67,50.35],[35.8,50.41],[35.89,50.44],[36.01,50.42],[36.12,50.41],[36.19,50.37],[36.24,50.31],[36.31,50.28],[36.37,50.3],[36.5,50.28],[36.56,50.23],[36.62,50.21],[36.7,50.25],[36.76,50.29],[36.99,50.34],[37.13,50.35],[37.17,50.36],[37.25,50.39],[37.34,50.42],[37.42,50.41],[37.5,50.34],[37.58,50.29],[37.61,50.21],[37.7,50.11],[37.95,49.96],[38.05,49.92],[38.11,49.93],[38.15,49.94],[38.16,49.95],[38.18,50.03],[38.21,50.05],[38.26,50.05],[38.45,49.96],[38.55,49.95],[38.65,49.95],[38.78,49.88],[38.92,49.82],[39.03,49.82],[39.11,49.84],[39.17,49.86],[39.21,49.83],[39.25,49.78],[39.3,49.74],[39.37,49.73],[39.46,49.73],[39.63,49.65],[39.78,49.57],[39.88,49.57],[39.96,49.59],[40.03,49.6],[40.08,49.58],[40.09,49.54],[40.06,49.5],[40.06,49.43],[40.13,49.37],[40.13,49.31],[40.11,49.25],[40.07,49.2],[39.98,49.13],[39.89,49.06],[39.76,49.04],[39.69,49.01],[39.71,48.96],[39.75,48.91],[39.86,48.88],[39.99,48.85],[40.0,48.82],[39.98,48.81],[39.9,48.79],[39.79,48.81],[39.76,48.78],[39.7,48.74],[39.67,48.66],[39.64,48.59],[39.77,48.57],[39.84,48.54],[39.86,48.48],[39.88,48.42],[39.89,48.36],[39.85,48.33],[39.85,48.3],[39.87,48.29],[39.92,48.28],[39.96,48.27],[39.96,48.24],[39.89,48.17],[39.81,48.04],[39.78,47.96],[39.78,47.89],[39.74,47.84],[39.66,47.84],[39.39,47.83],[39.16,47.84],[39.06,47.85],[38.9,47.86],[38.82,47.84],[38.72,47.71],[38.64,47.67],[38.51,47.62],[38.37,47.61],[38.29,47.56],[38.26,47.48],[38.26,47.41],[38.24,47.37],[38.21,47.34],[38.2,47.32],[38.21,47.3],[38.24,47.29],[38.28,47.28],[38.28,47.26],[38.27,47.24],[38.22,47.21],[38.2,47.18],[38.21,47.14],[38.21,47.09],[38.18,47.08],[37.83,47.1],[37.76,47.09],[37.54,47.07],[37.34,46.92],[37.22,46.92],[37.05,46.88],[36.93,46.83],[36.79,46.71],[36.69,46.76],[36.56,46.76],[36.43,46.73],[36.28,46.66],[36.19,46.65],[36.02,46.67],[35.83,46.62],[35.4,46.38],[35.26,46.2],[35.2,46.17],[35.13,46.13],[35.06,46.1],[35.01,46.11],[35.22,46.23],[35.28,46.28],[35.29,46.31],[35.29,46.37],[35.23,46.44],[35.06,46.27],[34.97,46.24],[34.85,46.19],[34.84,46.07],[34.86,45.99],[34.91,45.88],[35.0,45.73],[34.95,45.73],[34.8,45.79],[34.79,45.89],[34.69,45.98],[34.52,45.98],[34.45,45.97],[34.35,46.06],[34.22,46.1],[34.13,46.09],[34.03,46.11],[33.81,46.21],[33.66,46.22],[33.65,46.15],[33.59,46.1],[33.5,46.08],[33.43,46.06],[33.26,46.13],[33.2,46.18],[32.94,46.12],[32.8,46.13],[32.48,46.08],[32.33,46.13],[32.04,46.26],[31.93,46.29],[31.83,46.28],[31.78,46.32],[31.84,46.35],[31.92,46.35],[31.99,46.36],[32.01,46.39],[32.01,46.43],[31.86,46.46],[31.71,46.47],[31.62,46.51],[31.55,46.55],[31.72,46.55],[31.88,46.52],[32.13,46.51],[32.36,46.47],[32.42,46.52],[32.55,46.59],[32.58,46.62],[32.35,46.56],[32.13,46.6],[32.04,46.64],[31.97,46.71],[31.94,46.78],[31.96,46.85],[31.94,46.98],[31.86,47.1],[31.84,47.16],[31.76,47.21],[31.84,47.09],[31.87,47.0],[31.91,46.93],[31.9,46.72],[31.87,46.65],[31.78,46.63],[31.66,46.64],[31.53,46.66],[31.56,46.78],[31.5,46.74],[31.4,46.63],[31.32,46.61],[31.14,46.62],[30.8,46.55],[30.77,46.47],[30.72,46.37],[30.67,46.3],[30.66,46.27],[30.51,46.11],[30.49,46.09],[30.22,45.87],[30.18,45.85],[30.01,45.8],[29.9,45.75],[29.82,45.73],[29.69,45.75],[29.63,45.72],[29.6,45.68],[29.6,45.6],[29.67,45.54],[29.73,45.34],[29.71,45.26],[29.65,45.31],[29.57,45.37],[29.4,45.42],[29.22,45.4],[29.03,45.32],[28.89,45.29],[28.82,45.31],[28.78,45.31],[28.77,45.29],[28.77,45.27],[28.79,45.25],[28.79,45.24],[28.76,45.23],[28.45,45.29],[28.32,45.35],[28.21,45.45],[28.26,45.48],[28.31,45.5],[28.47,45.51],[28.5,45.52],[28.5,45.54],[28.51,45.57],[28.51,45.62],[28.49,45.67],[28.56,45.74],[28.67,45.79],[28.73,45.85],[28.74,45.94],[28.85,45.98],[28.95,46.05],[28.97,46.13],[29.01,46.18],[28.94,46.29],[28.93,46.36],[28.93,46.42],[28.96,46.46],[29.05,46.5],[29.15,46.53],[29.19,46.52],[29.2,46.5],[29.2,46.38],[29.22,46.38],[29.25,46.39],[29.3,46.47],[29.34,46.45],[29.39,46.44],[29.43,46.46],[29.46,46.45],[29.49,46.43],[29.56,46.41],[29.61,46.4],[29.66,46.42],[29.71,46.45],[29.75,46.44],[29.84,46.35],[29.88,46.36],[30.08,46.38],[30.11,46.4],[30.13,46.42],[29.92,46.54],[29.93,46.62],[29.94,46.72],[29.92,46.78],[29.88,46.83],[29.72,46.88],[29.6,46.94],[29.57,46.96],[29.57,47.0],[29.56,47.05],[29.52,47.09],[29.51,47.13],[29.54,47.19],[29.55,47.25],[29.54,47.27],[29.51,47.29],[29.46,47.29],[29.38,47.33],[29.33,47.38],[29.2,47.44],[29.16,47.46],[29.13,47.49],[29.12,47.53],[29.15,47.58],[29.19,47.66],[29.21,47.73],[29.21,47.78],[29.19,47.88],[29.13,47.96],[29.09,47.98],[29.04,47.95],[28.97,47.93],[28.92,47.95],[28.87,48.0],[28.77,48.12],[28.6,48.14],[28.53,48.15],[28.46,48.09],[28.44,48.11],[28.42,48.15],[28.39,48.16],[28.34,48.14],[28.33,48.16],[28.35,48.21],[28.29,48.24],[28.16,48.24],[28.09,48.26],[28.08,48.3],[28.04,48.32],[27.96,48.33],[27.89,48.37],[27.82,48.42],[27.71,48.45],[27.57,48.46],[27.56,48.47],[27.55,48.48],[27.46,48.44],[27.4,48.42],[27.34,48.43],[27.23,48.37],[27.01,48.37],[26.9,48.37],[26.85,48.39],[26.64,48.29],[26.62,48.26],[26.57,48.25],[26.44,48.23],[26.31,48.2],[26.28,48.11],[26.24,48.06],[26.16,47.99],[25.91,47.97],[25.69,47.93],[25.46,47.91],[25.17,47.82],[25.07,47.75],[24.98,47.72],[24.89,47.72],[24.84,47.76],[24.65,47.88],[24.58,47.93],[24.48,47.95],[24.38,47.94],[24.28,47.91],[24.18,47.91],[24.06,47.94],[24.05,47.94],[24.0,47.94],[23.71,47.98],[23.68,47.99],[23.67,47.99],[23.63,48.0],[23.41,47.99],[23.2,48.08],[23.14,48.09],[23.09,48.05],[23.05,48.01],[22.91,47.96],[22.88,47.95],[22.86,47.96],[22.85,48.0],[22.86,48.03],[22.84,48.06],[22.78,48.1],[22.77,48.11],[22.7,48.11],[22.68,48.1],[22.68,48.1],[22.58,48.13],[22.52,48.21],[22.42,48.24],[22.35,48.26],[22.32,48.29],[22.3,48.33],[22.27,48.36],[22.27,48.36],[22.25,48.41],[22.23,48.41],[22.23,48.41],[22.13,48.41],[22.14,48.57],[22.3,48.69],[22.33,48.75],[22.39,48.87],[22.43,48.93],[22.48,48.98],[22.52,49.03],[22.54,49.07],[22.58,49.08],[22.7,49.04],[22.81,49.02],[22.84,49.04],[22.85,49.06],[22.85,49.08],[22.76,49.14],[22.71,49.17],[22.7,49.19],[22.72,49.24],[22.73,49.3],[22.72,49.35],[22.66,49.48],[22.65,49.54],[22.71,49.61],[22.89,49.77],[22.95,49.83],[23.04,49.9],[23.26,50.07],[23.41,50.17],[23.51,50.23],[23.65,50.33],[23.71,50.38],[23.97,50.41],[24.0,50.46],[24.05,50.51],[24.09,50.53],[24.09,50.62],[24.05,50.72],[24.01,50.76],[23.98,50.79],[24.0,50.81],[24.03,50.82],[24.06,50.82],[24.11,50.84],[24.1,50.87],[23.99,50.94],[23.94,50.99],[23.86,51.13],[23.71,51.27],[23.66,51.31],[23.66,51.35],[23.68,51.39],[23.66,51.45],[23.61,51.52]],[[32.01,46.2],[32.15,46.15],[32.01,46.17],[31.7,46.21],[31.56,46.26],[31.53,46.31],[31.51,46.37],[31.58,46.3],[31.64,46.27],[32.01,46.2]]]},{"n":"Uruguay","r":[[[-58.2,-32.47],[-58.12,-32.32],[-58.12,-32.25],[-58.16,-32.18],[-58.18,-32.12],[-58.16,-32.05],[-58.16,-31.99],[-58.19,-31.92],[-58.17,-31.87],[-58.1,-31.83],[-58.04,-31.77],[-58.01,-31.68],[-57.99,-31.62],[-57.99,-31.58],[-58.01,-31.53],[-58.05,-31.49],[-58.03,-31.42],[-57.95,-31.3],[-57.89,-31.2],[-57.87,-31.1],[-57.87,-31.03],[-57.9,-30.98],[-57.89,-30.94],[-57.83,-30.92],[-57.81,-30.86],[-57.82,-30.71],[-57.87,-30.59],[-57.83,-30.5],[-57.71,-30.38],[-57.65,-30.3],[-57.65,-30.23],[-57.61,-30.19],[-57.55,-30.26],[-57.38,-30.28],[-57.21,-30.28],[-57.19,-30.26],[-57.12,-30.14],[-57.03,-30.11],[-56.94,-30.1],[-56.83,-30.11],[-56.72,-30.19],[-56.41,-30.45],[-56.18,-30.63],[-56.11,-30.71],[-56.04,-30.78],[-56.0,-30.84],[-56.02,-30.99],[-56.02,-31.06],[-56.0,-31.08],[-55.95,-31.08],[-55.87,-31.07],[-55.81,-31.04],[-55.76,-30.99],[-55.71,-30.95],[-55.67,-30.92],[-55.65,-30.89],[-55.63,-30.86],[-55.6,-30.85],[-55.56,-30.88],[-55.45,-30.96],[-55.37,-31.05],[-55.35,-31.09],[-55.31,-31.14],[-55.28,-31.18],[-55.25,-31.23],[-55.17,-31.28],[-55.09,-31.31],[-55.04,-31.28],[-54.9,-31.39],[-54.59,-31.49],[-54.53,-31.54],[-54.48,-31.62],[-54.37,-31.75],[-54.22,-31.86],[-54.1,-31.9],[-53.99,-31.93],[-53.92,-31.95],[-53.88,-31.99],[-53.81,-32.04],[-53.76,-32.06],[-53.75,-32.1],[-53.7,-32.19],[-53.65,-32.3],[-53.6,-32.4],[-53.49,-32.5],[-53.36,-32.58],[-53.23,-32.63],[-53.16,-32.68],[-53.13,-32.74],[-53.21,-32.82],[-53.31,-32.93],[-53.4,-33.01],[-53.48,-33.07],[-53.51,-33.11],[-53.53,-33.17],[-53.53,-33.5],[-53.54,-33.62],[-53.53,-33.66],[-53.52,-33.68],[-53.46,-33.71],[-53.4,-33.74],[-53.37,-33.74],[-53.42,-33.78],[-53.47,-33.85],[-53.53,-34.02],[-53.74,-34.25],[-53.79,-34.38],[-54.01,-34.52],[-54.17,-34.67],[-54.27,-34.67],[-54.37,-34.73],[-54.9,-34.93],[-55.1,-34.9],[-55.24,-34.9],[-55.37,-34.81],[-55.67,-34.78],[-55.86,-34.81],[-56.12,-34.91],[-56.19,-34.91],[-56.25,-34.9],[-56.39,-34.86],[-56.46,-34.78],[-56.86,-34.68],[-57.17,-34.45],[-57.54,-34.45],[-57.83,-34.48],[-57.87,-34.45],[-57.9,-34.39],[-57.96,-34.31],[-58.21,-34.11],[-58.4,-33.91],[-58.44,-33.72],[-58.41,-33.51],[-58.35,-33.26],[-58.36,-33.18],[-58.29,-33.14],[-58.22,-33.13],[-58.15,-33.06],[-58.09,-32.97],[-58.08,-32.89],[-58.13,-32.76],[-58.16,-32.57],[-58.2,-32.47]]]},{"n":"United States of America","r":[[[-74.71,45.0],[-74.66,45.0],[-74.43,45.0],[-74.01,45.0],[-73.6,45.01],[-73.18,45.01],[-72.77,45.01],[-72.35,45.01],[-71.93,45.01],[-71.52,45.01],[-71.42,45.2],[-71.33,45.29],[-71.2,45.26],[-71.13,45.26],[-71.06,45.31],[-71.0,45.34],[-70.96,45.33],[-70.93,45.29],[-70.9,45.26],[-70.87,45.27],[-70.84,45.31],[-70.84,45.37],[-70.8,45.4],[-70.75,45.41],[-70.71,45.41],[-70.69,45.43],[-70.69,45.46],[-70.71,45.5],[-70.7,45.55],[-70.6,45.64],[-70.47,45.71],[-70.42,45.74],[-70.41,45.8],[-70.33,45.87],[-70.3,45.91],[-70.29,45.94],[-70.31,45.98],[-70.3,46.06],[-70.28,46.15],[-70.25,46.25],[-70.18,46.34],[-70.07,46.44],[-70.04,46.57],[-70.01,46.71],[-69.87,46.84],[-69.72,46.99],[-69.63,47.08],[-69.47,47.24],[-69.36,47.35],[-69.3,47.4],[-69.24,47.46],[-69.15,47.44],[-69.05,47.43],[-69.06,47.34],[-69.05,47.27],[-69.0,47.24],[-68.94,47.21],[-68.89,47.2],[-68.83,47.2],[-68.67,47.25],[-68.48,47.29],[-68.38,47.32],[-68.36,47.34],[-68.31,47.35],[-68.24,47.35],[-68.1,47.27],[-67.93,47.17],[-67.81,47.08],[-67.8,46.94],[-67.8,46.78],[-67.8,46.62],[-67.8,46.5],[-67.79,46.34],[-67.79,46.21],[-67.79,46.04],[-67.78,45.95],[-67.77,45.93],[-67.78,45.89],[-67.78,45.87],[-67.78,45.86],[-67.77,45.84],[-67.78,45.82],[-67.79,45.8],[-67.8,45.77],[-67.8,45.73],[-67.78,45.7],[-67.76,45.69],[-67.73,45.69],[-67.7,45.67],[-67.66,45.64],[-67.6,45.62],[-67.53,45.61],[-67.49,45.62],[-67.43,45.6],[-67.41,45.57],[-67.42,45.53],[-67.45,45.51],[-67.49,45.5],[-67.49,45.47],[-67.48,45.45],[-67.45,45.42],[-67.43,45.38],[-67.44,45.34],[-67.46,45.31],[-67.47,45.28],[-67.45,45.25],[-67.4,45.21],[-67.37,45.17],[-67.32,45.15],[-67.29,45.17],[-67.27,45.19],[-67.25,45.2],[-67.21,45.19],[-67.17,45.18],[-67.12,45.17],[-67.13,45.14],[-67.1,45.09],[-67.08,44.99],[-67.11,44.94],[-67.11,44.89],[-67.01,44.87],[-66.99,44.85],[-66.99,44.83],[-67.19,44.68],[-67.36,44.7],[-67.46,44.66],[-67.56,44.64],[-67.6,44.58],[-67.65,44.56],[-67.73,44.57],[-67.79,44.59],[-67.84,44.58],[-67.91,44.45],[-67.96,44.46],[-67.98,44.42],[-68.01,44.4],[-68.06,44.38],[-68.09,44.44],[-68.12,44.49],[-68.15,44.5],[-68.2,44.52],[-68.25,44.51],[-68.28,44.51],[-68.32,44.47],[-68.37,44.45],[-68.42,44.47],[-68.45,44.51],[-68.48,44.45],[-68.52,44.38],[-68.51,44.3],[-68.53,44.26],[-68.57,44.27],[-68.61,44.31],[-68.72,44.34],[-68.81,44.34],[-68.79,44.38],[-68.71,44.44],[-68.74,44.45],[-68.78,44.45],[-68.79,44.45],[-68.77,44.51],[-68.76,44.57],[-68.8,44.55],[-68.85,44.49],[-68.96,44.43],[-68.96,44.35],[-69.06,44.17],[-69.07,44.1],[-69.14,44.04],[-69.23,43.99],[-69.34,44.0],[-69.43,43.96],[-69.48,43.91],[-69.52,43.9],[-69.54,43.96],[-69.56,43.98],[-69.59,43.89],[-69.62,43.88],[-69.64,43.95],[-69.65,43.99],[-69.7,43.96],[-69.73,43.85],[-69.76,43.86],[-69.77,43.9],[-69.8,43.91],[-69.8,43.87],[-69.79,43.81],[-69.81,43.77],[-69.84,43.79],[-69.87,43.82],[-69.93,43.8],[-69.97,43.79],[-69.97,43.82],[-69.97,43.86],[-70.06,43.83],[-70.18,43.77],[-70.27,43.67],[-70.24,43.66],[-70.2,43.63],[-70.36,43.48],[-70.52,43.35],[-70.64,43.13],[-70.69,43.11],[-70.73,43.07],[-70.78,42.94],[-70.83,42.83],[-70.8,42.77],[-70.78,42.72],[-70.74,42.67],[-70.7,42.66],[-70.65,42.67],[-70.62,42.67],[-70.6,42.65],[-70.61,42.62],[-70.66,42.62],[-70.75,42.57],[-70.83,42.55],[-70.87,42.5],[-70.93,42.43],[-71.05,42.33],[-71.0,42.3],[-70.82,42.26],[-70.74,42.23],[-70.62,42.04],[-70.65,42.02],[-70.66,41.99],[-70.55,41.94],[-70.51,41.8],[-70.43,41.76],[-70.3,41.73],[-70.14,41.77],[-70.0,41.83],[-70.01,41.87],[-70.09,41.98],[-70.11,42.03],[-70.17,42.06],[-70.2,42.04],[-70.24,42.07],[-70.24,42.09],[-70.2,42.1],[-70.16,42.1],[-70.11,42.08],[-69.98,41.96],[-69.94,41.81],[-69.93,41.71],[-69.95,41.68],[-69.99,41.68],[-70.06,41.68],[-70.4,41.63],[-70.48,41.58],[-70.66,41.53],[-70.67,41.56],[-70.66,41.61],[-70.67,41.71],[-70.7,41.71],[-70.97,41.55],[-71.08,41.54],[-71.17,41.49],[-71.19,41.52],[-71.2,41.64],[-71.15,41.75],[-71.18,41.74],[-71.27,41.68],[-71.31,41.72],[-71.33,41.76],[-71.36,41.79],[-71.39,41.8],[-71.36,41.7],[-71.43,41.63],[-71.44,41.45],[-71.52,41.38],[-71.77,41.33],[-71.93,41.34],[-72.07,41.33],[-72.27,41.29],[-72.37,41.31],[-72.48,41.28],[-72.85,41.27],[-72.92,41.29],[-73.02,41.22],[-73.18,41.18],[-73.58,41.02],[-73.67,40.97],[-73.78,40.88],[-73.85,40.83],[-73.91,40.82],[-73.95,40.78],[-73.99,40.75],[-73.95,40.84],[-73.91,40.91],[-73.87,41.06],[-73.88,41.17],[-73.93,41.22],[-73.97,41.25],[-73.92,41.14],[-73.91,41.0],[-73.93,40.91],[-74.03,40.76],[-74.07,40.72],[-74.12,40.69],[-74.15,40.67],[-74.19,40.65],[-74.23,40.61],[-74.26,40.53],[-74.24,40.46],[-74.05,40.43],[-74.0,40.45],[-73.97,40.4],[-73.96,40.33],[-73.97,40.25],[-74.0,40.17],[-74.03,40.07],[-74.05,39.92],[-74.08,39.79],[-74.08,39.83],[-74.06,39.99],[-74.1,39.98],[-74.12,39.94],[-74.18,39.73],[-74.26,39.61],[-74.33,39.54],[-74.41,39.55],[-74.39,39.49],[-74.41,39.45],[-74.43,39.39],[-74.47,39.34],[-74.52,39.35],[-74.58,39.32],[-74.6,39.29],[-74.6,39.25],[-74.65,39.21],[-74.79,39.0],[-74.92,38.94],[-74.95,38.95],[-74.92,39.05],[-74.9,39.15],[-74.98,39.19],[-75.05,39.21],[-75.14,39.21],[-75.23,39.28],[-75.35,39.34],[-75.52,39.49],[-75.52,39.53],[-75.52,39.6],[-75.47,39.71],[-75.42,39.79],[-75.35,39.83],[-75.15,39.87],[-75.1,39.93],[-75.07,39.98],[-75.17,39.89],[-75.32,39.86],[-75.4,39.83],[-75.46,39.78],[-75.5,39.72],[-75.59,39.64],[-75.58,39.59],[-75.57,39.55],[-75.57,39.48],[-75.52,39.4],[-75.41,39.28],[-75.39,39.09],[-75.31,38.97],[-75.19,38.82],[-75.09,38.78],[-75.08,38.72],[-75.13,38.63],[-75.19,38.59],[-75.11,38.6],[-75.07,38.58],[-75.04,38.5],[-75.04,38.43],[-75.05,38.38],[-75.07,38.37],[-75.07,38.41],[-75.09,38.43],[-75.12,38.41],[-75.13,38.38],[-75.14,38.3],[-75.16,38.26],[-75.23,38.24],[-75.29,38.13],[-75.35,38.07],[-75.6,37.63],[-75.59,37.56],[-75.63,37.54],[-75.7,37.52],[-75.77,37.47],[-75.81,37.43],[-75.85,37.3],[-75.93,37.15],[-75.98,37.21],[-76.0,37.26],[-75.98,37.4],[-75.89,37.62],[-75.79,37.76],[-75.72,37.82],[-75.66,37.95],[-75.74,37.97],[-75.85,37.97],[-75.83,38.03],[-75.8,38.09],[-75.86,38.14],[-75.89,38.15],[-75.93,38.17],[-75.88,38.21],[-75.86,38.26],[-75.88,38.32],[-75.86,38.36],[-75.89,38.36],[-75.94,38.31],[-75.97,38.29],[-75.99,38.33],[-76.01,38.32],[-76.02,38.29],[-76.05,38.28],[-76.12,38.32],[-76.21,38.36],[-76.26,38.44],[-76.29,38.49],[-76.26,38.6],[-76.2,38.62],[-76.11,38.6],[-76.0,38.6],[-76.02,38.63],[-76.06,38.62],[-76.18,38.71],[-76.21,38.76],[-76.28,38.77],[-76.31,38.72],[-76.34,38.71],[-76.3,38.82],[-76.25,38.82],[-76.17,38.85],[-76.19,38.92],[-76.24,38.94],[-76.33,38.91],[-76.33,38.95],[-76.31,39.01],[-76.25,39.01],[-76.19,38.99],[-76.14,39.08],[-76.13,39.12],[-76.22,39.06],[-76.24,39.19],[-76.15,39.32],[-76.07,39.37],[-75.98,39.37],[-75.88,39.38],[-75.94,39.4],[-76.0,39.41],[-75.95,39.46],[-75.91,39.47],[-75.87,39.51],[-75.97,39.5],[-75.96,39.59],[-76.01,39.57],[-76.06,39.56],[-76.09,39.53],[-76.08,39.47],[-76.1,39.43],[-76.14,39.4],[-76.22,39.38],[-76.22,39.42],[-76.25,39.44],[-76.26,39.35],[-76.28,39.32],[-76.33,39.4],[-76.35,39.39],[-76.35,39.36],[-76.36,39.32],[-76.41,39.3],[-76.4,39.25],[-76.42,39.22],[-76.57,39.27],[-76.57,39.25],[-76.49,39.16],[-76.43,39.13],[-76.42,39.07],[-76.47,39.03],[-76.55,39.07],[-76.56,39.07],[-76.52,39.0],[-76.49,38.95],[-76.52,38.9],[-76.52,38.84],[-76.52,38.79],[-76.54,38.74],[-76.5,38.53],[-76.46,38.47],[-76.42,38.42],[-76.39,38.37],[-76.44,38.36],[-76.51,38.4],[-76.57,38.44],[-76.65,38.54],[-76.66,38.58],[-76.68,38.61],[-76.67,38.54],[-76.64,38.45],[-76.41,38.27],[-76.37,38.2],[-76.33,38.14],[-76.34,38.09],[-76.4,38.13],[-76.45,38.17],[-76.59,38.23],[-76.77,38.26],[-76.87,38.39],[-76.87,38.34],[-76.89,38.29],[-76.95,38.35],[-76.99,38.39],[-77.0,38.45],[-77.08,38.44],[-77.16,38.4],[-77.23,38.41],[-77.24,38.49],[-77.22,38.54],[-77.13,38.65],[-77.05,38.71],[-77.02,38.78],[-77.03,38.89],[-77.05,38.78],[-77.09,38.72],[-77.16,38.68],[-77.26,38.6],[-77.28,38.53],[-77.31,38.4],[-77.27,38.35],[-77.23,38.34],[-77.11,38.37],[-77.05,38.36],[-76.91,38.2],[-76.64,38.13],[-76.55,38.09],[-76.47,38.01],[-76.35,37.96],[-76.26,37.89],[-76.26,37.85],[-76.29,37.79],[-76.31,37.72],[-76.34,37.68],[-76.44,37.67],[-76.49,37.68],[-76.79,37.94],[-76.83,37.96],[-76.94,38.1],[-77.07,38.17],[-77.11,38.17],[-76.93,38.03],[-76.85,37.94],[-76.72,37.81],[-76.62,37.76],[-76.55,37.67],[-76.48,37.63],[-76.31,37.57],[-76.37,37.53],[-76.27,37.5],[-76.25,37.43],[-76.26,37.36],[-76.4,37.39],[-76.41,37.33],[-76.39,37.3],[-76.45,37.27],[-76.54,37.31],[-76.76,37.51],[-76.76,37.48],[-76.74,37.45],[-76.61,37.32],[-76.5,37.25],[-76.4,37.21],[-76.33,37.15],[-76.3,37.11],[-76.28,37.05],[-76.34,37.01],[-76.4,36.99],[-76.46,37.03],[-76.51,37.07],[-76.6,37.14],[-76.63,37.22],[-76.7,37.22],[-77.01,37.32],[-77.25,37.33],[-77.23,37.31],[-77.2,37.3],[-77.0,37.27],[-76.93,37.22],[-76.77,37.18],[-76.67,37.17],[-76.63,37.05],[-76.5,36.96],[-76.49,36.9],[-76.4,36.89],[-76.24,36.95],[-76.14,36.93],[-76.0,36.91],[-75.97,36.86],[-75.94,36.77],[-75.89,36.66],[-75.76,36.23],[-75.56,35.88],[-75.53,35.82],[-75.58,35.87],[-75.73,36.1],[-75.81,36.27],[-75.89,36.57],[-75.92,36.63],[-75.95,36.66],[-75.97,36.64],[-75.97,36.6],[-75.96,36.57],[-75.99,36.47],[-75.98,36.43],[-75.92,36.38],[-75.87,36.27],[-75.82,36.11],[-75.88,36.18],[-75.95,36.21],[-76.05,36.23],[-76.15,36.28],[-76.14,36.22],[-76.15,36.15],[-76.22,36.17],[-76.27,36.19],[-76.23,36.12],[-76.32,36.14],[-76.38,36.13],[-76.42,36.07],[-76.48,36.03],[-76.56,36.02],[-76.68,36.08],[-76.72,36.15],[-76.73,36.23],[-76.74,36.13],[-76.72,36.03],[-76.73,35.96],[-76.61,35.94],[-76.5,35.96],[-76.36,35.95],[-76.26,35.97],[-76.21,35.99],[-76.07,35.97],[-76.06,35.88],[-76.08,35.79],[-76.08,35.69],[-76.05,35.69],[-76.0,35.72],[-75.98,35.9],[-75.85,35.96],[-75.81,35.96],[-75.77,35.9],[-75.76,35.84],[-75.74,35.77],[-75.77,35.65],[-75.97,35.51],[-76.1,35.38],[-76.17,35.35],[-76.28,35.37],[-76.39,35.4],[-76.45,35.41],[-76.49,35.4],[-76.52,35.44],[-76.53,35.51],[-76.58,35.53],[-76.61,35.53],[-76.63,35.45],[-76.74,35.43],[-76.89,35.46],[-77.04,35.53],[-76.97,35.46],[-76.6,35.33],[-76.55,35.31],[-76.51,35.27],[-76.57,35.22],[-76.61,35.15],[-76.61,35.1],[-76.63,35.07],[-76.78,34.99],[-76.86,35.0],[-77.07,35.15],[-76.97,35.03],[-76.9,34.97],[-76.74,34.94],[-76.46,34.99],[-76.36,34.94],[-76.44,34.84],[-76.52,34.78],[-76.62,34.77],[-76.71,34.75],[-76.73,34.71],[-76.8,34.7],[-76.9,34.7],[-77.05,34.7],[-77.13,34.71],[-77.25,34.62],[-77.3,34.6],[-77.36,34.62],[-77.38,34.69],[-77.41,34.73],[-77.41,34.59],[-77.4,34.55],[-77.38,34.53],[-77.52,34.45],[-77.65,34.36],[-77.7,34.33],[-77.75,34.28],[-77.86,34.15],[-77.89,34.05],[-77.93,33.94],[-77.93,33.99],[-77.93,34.07],[-77.95,34.17],[-77.97,33.99],[-78.01,33.91],[-78.41,33.92],[-78.58,33.87],[-78.84,33.72],[-78.92,33.66],[-79.14,33.41],[-79.19,33.24],[-79.24,33.31],[-79.23,33.36],[-79.23,33.4],[-79.28,33.32],[-79.23,33.19],[-79.28,33.14],[-79.42,33.04],[-79.5,33.03],[-79.59,33.0],[-79.61,32.91],[-79.74,32.82],[-79.8,32.79],[-79.93,32.81],[-79.89,32.73],[-79.94,32.67],[-80.02,32.62],[-80.12,32.59],[-80.18,32.59],[-80.23,32.58],[-80.27,32.54],[-80.36,32.5],[-80.46,32.52],[-80.57,32.53],[-80.63,32.51],[-80.53,32.48],[-80.47,32.42],[-80.49,32.35],[-80.51,32.32],[-80.58,32.29],[-80.61,32.29],[-80.63,32.33],[-80.65,32.4],[-80.68,32.38],[-80.68,32.35],[-80.71,32.34],[-80.8,32.45],[-80.8,32.36],[-80.77,32.3],[-80.73,32.27],[-80.7,32.25],[-80.69,32.22],[-80.76,32.14],[-80.79,32.13],[-80.85,32.11],[-80.88,32.07],[-80.87,32.03],[-80.92,31.94],[-81.05,31.89],[-81.08,31.89],[-81.11,31.88],[-81.1,31.84],[-81.07,31.81],[-81.07,31.79],[-81.1,31.75],[-81.16,31.74],[-81.2,31.7],[-81.19,31.67],[-81.17,31.65],[-81.17,31.61],[-81.24,31.57],[-81.26,31.54],[-81.22,31.53],[-81.2,31.54],[-81.18,31.53],[-81.22,31.47],[-81.26,31.44],[-81.29,31.37],[-81.38,31.35],[-81.38,31.33],[-81.33,31.31],[-81.29,31.26],[-81.36,31.17],[-81.41,31.18],[-81.44,31.2],[-81.46,31.13],[-81.45,31.09],[-81.47,31.01],[-81.5,30.91],[-81.52,30.87],[-81.52,30.8],[-81.5,30.73],[-81.46,30.64],[-81.39,30.27],[-81.34,30.14],[-81.25,29.79],[-81.1,29.46],[-80.9,29.05],[-80.56,28.56],[-80.52,28.49],[-80.57,28.43],[-80.58,28.36],[-80.58,28.27],[-80.57,28.18],[-80.53,28.07],[-80.46,27.9],[-80.5,27.93],[-80.61,28.18],[-80.62,28.32],[-80.61,28.52],[-80.63,28.52],[-80.65,28.45],[-80.67,28.37],[-80.69,28.34],[-80.73,28.46],[-80.73,28.52],[-80.69,28.58],[-80.7,28.6],[-80.77,28.63],[-80.78,28.68],[-80.77,28.73],[-80.81,28.76],[-80.84,28.76],[-80.82,28.64],[-80.79,28.56],[-80.75,28.38],[-80.69,28.27],[-80.65,28.18],[-80.23,27.21],[-80.13,27.08],[-80.09,26.99],[-80.05,26.81],[-80.04,26.57],[-80.11,26.13],[-80.13,25.83],[-80.14,25.84],[-80.14,25.87],[-80.16,25.88],[-80.22,25.74],[-80.3,25.62],[-80.33,25.43],[-80.37,25.33],[-80.48,25.23],[-80.56,25.23],[-80.74,25.16],[-80.86,25.18],[-81.01,25.13],[-81.11,25.14],[-81.17,25.23],[-81.16,25.27],[-81.14,25.31],[-81.1,25.32],[-80.97,25.22],[-80.94,25.26],[-80.98,25.31],[-81.06,25.34],[-81.11,25.37],[-81.23,25.58],[-81.35,25.73],[-81.36,25.83],[-81.57,25.89],[-81.72,25.98],[-81.81,26.15],[-81.87,26.44],[-81.93,26.47],[-81.96,26.49],[-81.9,26.6],[-81.83,26.69],[-81.88,26.66],[-81.92,26.63],[-81.97,26.55],[-82.01,26.54],[-82.04,26.55],[-82.08,26.7],[-82.07,26.89],[-82.01,26.96],[-82.1,26.96],[-82.18,26.94],[-82.17,26.87],[-82.18,26.84],[-82.24,26.85],[-82.29,26.87],[-82.35,26.94],[-82.44,27.06],[-82.62,27.4],[-82.66,27.45],[-82.71,27.5],[-82.69,27.52],[-82.64,27.52],[-82.52,27.68],[-82.43,27.77],[-82.4,27.84],[-82.41,27.86],[-82.45,27.9],[-82.5,27.87],[-82.52,27.88],[-82.58,27.96],[-82.64,27.98],[-82.68,27.96],[-82.63,27.9],[-82.6,27.87],[-82.61,27.78],[-82.63,27.75],[-82.66,27.72],[-82.72,27.73],[-82.74,27.71],[-82.78,27.73],[-82.81,27.78],[-82.84,27.85],[-82.75,28.24],[-82.66,28.49],[-82.65,28.77],[-82.64,28.81],[-82.65,28.89],[-82.77,29.05],[-83.29,29.45],[-83.69,29.93],[-84.04,30.1],[-84.31,30.06],[-84.36,30.03],[-84.38,29.98],[-84.36,29.93],[-84.38,29.91],[-84.45,29.91],[-84.55,29.9],[-84.8,29.77],[-84.89,29.78],[-84.97,29.75],[-85.03,29.72],[-85.19,29.71],[-85.32,29.68],[-85.38,29.7],[-85.41,29.77],[-85.41,29.84],[-85.38,29.79],[-85.34,29.74],[-85.31,29.76],[-85.31,29.8],[-85.35,29.88],[-85.5,29.98],[-85.68,30.12],[-85.62,30.12],[-85.61,30.15],[-85.66,30.19],[-85.64,30.24],[-85.6,30.29],[-85.68,30.28],[-85.74,30.24],[-85.74,30.2],[-85.76,30.17],[-85.79,30.17],[-85.86,30.21],[-86.18,30.33],[-86.45,30.4],[-86.24,30.43],[-86.12,30.41],[-86.14,30.44],[-86.17,30.46],[-86.26,30.49],[-86.37,30.48],[-86.45,30.5],[-86.52,30.47],[-86.61,30.42],[-86.68,30.4],[-86.97,30.37],[-87.2,30.34],[-87.16,30.37],[-87.12,30.4],[-86.99,30.43],[-86.97,30.5],[-87.0,30.57],[-87.03,30.55],[-87.07,30.5],[-87.12,30.54],[-87.17,30.54],[-87.18,30.45],[-87.25,30.4],[-87.28,30.34],[-87.48,30.29],[-87.5,30.31],[-87.44,30.36],[-87.45,30.39],[-87.51,30.37],[-87.62,30.26],[-88.01,30.23],[-87.99,30.25],[-87.9,30.26],[-87.79,30.29],[-87.81,30.35],[-87.86,30.41],[-87.9,30.41],[-87.92,30.45],[-87.92,30.56],[-87.95,30.63],[-88.01,30.69],[-88.03,30.68],[-88.08,30.57],[-88.12,30.42],[-88.14,30.37],[-88.25,30.36],[-88.35,30.37],[-88.69,30.36],[-88.82,30.41],[-88.87,30.42],[-88.91,30.42],[-89.05,30.37],[-89.22,30.33],[-89.26,30.34],[-89.32,30.35],[-89.44,30.22],[-89.59,30.17],[-89.95,30.27],[-90.05,30.35],[-90.13,30.37],[-90.23,30.38],[-90.33,30.28],[-90.41,30.14],[-90.28,30.07],[-90.18,30.03],[-89.99,30.06],[-89.89,30.13],[-89.81,30.12],[-89.77,30.14],[-89.74,30.17],[-89.67,30.14],[-89.67,30.12],[-89.71,30.08],[-89.78,30.05],[-89.82,30.01],[-89.74,29.93],[-89.63,29.9],[-89.59,29.92],[-89.56,30.0],[-89.49,30.06],[-89.4,30.05],[-89.41,30.01],[-89.4,29.98],[-89.36,29.92],[-89.36,29.84],[-89.35,29.82],[-89.46,29.78],[-89.53,29.77],[-89.59,29.73],[-89.56,29.7],[-89.62,29.67],[-89.66,29.68],[-89.68,29.67],[-89.69,29.65],[-89.72,29.62],[-89.67,29.54],[-89.58,29.49],[-89.51,29.42],[-89.25,29.33],[-89.18,29.34],[-89.12,29.25],[-89.07,29.22],[-89.02,29.2],[-89.02,29.14],[-89.11,29.1],[-89.13,29.05],[-89.16,29.02],[-89.2,29.05],[-89.24,29.08],[-89.33,29.0],[-89.38,28.98],[-89.35,29.07],[-89.39,29.11],[-89.44,29.19],[-89.52,29.25],[-89.58,29.27],[-89.62,29.3],[-89.67,29.32],[-89.72,29.31],[-89.79,29.33],[-89.8,29.38],[-89.82,29.42],[-89.88,29.46],[-90.16,29.54],[-90.16,29.5],[-90.14,29.48],[-90.1,29.46],[-90.05,29.43],[-90.05,29.34],[-90.07,29.3],[-90.08,29.24],[-90.1,29.18],[-90.14,29.14],[-90.21,29.1],[-90.25,29.13],[-90.3,29.26],[-90.38,29.3],[-90.5,29.3],[-90.59,29.27],[-90.68,29.15],[-90.75,29.13],[-91.0,29.19],[-91.29,29.29],[-91.28,29.32],[-91.24,29.33],[-91.15,29.32],[-91.16,29.35],[-91.24,29.46],[-91.26,29.51],[-91.25,29.56],[-91.28,29.56],[-91.33,29.51],[-91.51,29.56],[-91.56,29.61],[-91.67,29.75],[-91.82,29.75],[-91.89,29.84],[-92.02,29.8],[-92.08,29.76],[-92.14,29.7],[-92.11,29.67],[-92.06,29.62],[-92.08,29.59],[-92.26,29.56],[-92.67,29.6],[-92.79,29.63],[-92.95,29.71],[-93.18,29.78],[-93.28,29.79],[-93.39,29.78],[-93.69,29.77],[-93.77,29.75],[-93.83,29.73],[-93.87,29.76],[-93.88,29.81],[-93.85,29.82],[-93.81,29.85],[-93.77,29.91],[-93.77,29.95],[-93.79,29.98],[-93.84,29.98],[-93.95,29.81],[-93.89,29.72],[-93.89,29.69],[-94.1,29.67],[-94.57,29.48],[-94.76,29.38],[-94.75,29.42],[-94.53,29.55],[-94.61,29.57],[-94.73,29.54],[-94.78,29.55],[-94.72,29.66],[-94.74,29.75],[-94.83,29.75],[-94.89,29.68],[-94.93,29.68],[-94.98,29.71],[-95.02,29.7],[-94.99,29.53],[-94.94,29.46],[-94.89,29.37],[-95.02,29.26],[-95.14,29.17],[-95.15,29.08],[-95.27,28.96],[-95.39,28.9],[-95.66,28.74],[-95.73,28.71],[-95.85,28.64],[-96.02,28.59],[-96.18,28.5],[-96.23,28.49],[-96.13,28.56],[-96.01,28.63],[-96.12,28.62],[-96.28,28.66],[-96.37,28.66],[-96.37,28.63],[-96.45,28.59],[-96.53,28.65],[-96.56,28.68],[-96.58,28.72],[-96.61,28.72],[-96.64,28.71],[-96.52,28.49],[-96.48,28.48],[-96.42,28.46],[-96.49,28.41],[-96.56,28.37],[-96.68,28.34],[-96.77,28.42],[-96.79,28.32],[-96.81,28.22],[-96.84,28.19],[-96.89,28.16],[-96.92,28.19],[-96.93,28.22],[-96.97,28.19],[-97.02,28.16],[-97.1,28.16],[-97.16,28.14],[-97.16,28.1],[-97.14,28.06],[-97.03,28.09],[-97.07,27.99],[-97.17,27.88],[-97.25,27.85],[-97.37,27.87],[-97.4,27.86],[-97.43,27.84],[-97.29,27.67],[-97.38,27.42],[-97.44,27.33],[-97.48,27.32],[-97.52,27.31],[-97.68,27.39],[-97.77,27.46],[-97.69,27.29],[-97.49,27.24],[-97.47,27.17],[-97.48,27.12],[-97.52,27.05],[-97.55,26.97],[-97.53,26.91],[-97.49,26.76],[-97.47,26.69],[-97.44,26.49],[-97.4,26.4],[-97.21,26.07],[-97.15,26.07],[-97.14,26.03],[-97.15,25.96],[-97.28,25.94],[-97.34,25.91],[-97.35,25.88],[-97.36,25.87],[-97.38,25.87],[-97.44,25.89],[-97.59,25.98],[-97.8,26.04],[-98.08,26.06],[-98.28,26.11],[-98.38,26.18],[-98.49,26.22],[-98.6,26.24],[-98.69,26.28],[-98.77,26.34],[-98.87,26.38],[-99.02,26.4],[-99.11,26.45],[-99.17,26.56],[-99.17,26.57],[-99.23,26.76],[-99.3,26.88],[-99.44,27.04],[-99.46,27.06],[-99.46,27.06],[-99.46,27.08],[-99.44,27.17],[-99.46,27.23],[-99.5,27.29],[-99.51,27.34],[-99.49,27.4],[-99.48,27.47],[-99.51,27.55],[-99.6,27.64],[-99.75,27.73],[-99.89,27.87],[-100.0,28.05],[-100.11,28.17],[-100.22,28.24],[-100.3,28.33],[-100.34,28.43],[-100.35,28.49],[-100.33,28.5],[-100.4,28.61],[-100.55,28.82],[-100.64,28.97],[-100.66,29.07],[-100.75,29.18],[-100.92,29.31],[-101.02,29.4],[-101.04,29.46],[-101.04,29.46],[-101.3,29.63],[-101.38,29.74],[-101.44,29.78],[-101.51,29.77],[-101.54,29.78],[-101.55,29.81],[-101.57,29.81],[-101.61,29.79],[-101.75,29.78],[-101.99,29.8],[-102.16,29.83],[-102.27,29.87],[-102.34,29.86],[-102.39,29.81],[-102.48,29.77],[-102.61,29.75],[-102.73,29.64],[-102.83,29.44],[-102.88,29.32],[-102.87,29.26],[-102.89,29.22],[-102.96,29.19],[-103.02,29.13],[-103.09,29.04],[-103.17,29.0],[-103.26,29.0],[-103.42,29.07],[-103.66,29.21],[-103.85,29.29],[-103.99,29.32],[-104.11,29.39],[-104.22,29.48],[-104.31,29.54],[-104.4,29.57],[-104.5,29.68],[-104.62,29.85],[-104.68,29.99],[-104.68,30.13],[-104.84,30.45],[-104.92,30.58],[-104.98,30.65],[-105.1,30.72],[-105.28,30.81],[-105.51,30.98],[-105.81,31.24],[-106.02,31.4],[-106.15,31.45],[-106.26,31.54],[-106.35,31.68],[-106.44,31.76],[-106.45,31.77],[-106.45,31.77],[-106.67,31.77],[-106.89,31.77],[-107.11,31.77],[-107.33,31.77],[-107.55,31.78],[-107.77,31.78],[-107.99,31.78],[-108.21,31.78],[-108.21,31.67],[-108.21,31.55],[-108.21,31.44],[-108.21,31.33],[-108.57,31.33],[-108.92,31.33],[-109.27,31.33],[-109.63,31.33],[-109.98,31.33],[-110.34,31.33],[-110.69,31.32],[-111.04,31.32],[-111.52,31.47],[-111.99,31.62],[-112.46,31.77],[-112.94,31.92],[-113.41,32.06],[-113.89,32.21],[-114.36,32.36],[-114.84,32.51],[-114.79,32.56],[-114.72,32.72],[-114.84,32.7],[-115.13,32.68],[-115.41,32.66],[-115.7,32.64],[-115.98,32.62],[-116.27,32.6],[-116.56,32.58],[-116.84,32.55],[-117.13,32.53],[-117.13,32.54],[-117.14,32.65],[-117.18,32.69],[-117.24,32.66],[-117.27,32.81],[-117.26,32.87],[-117.26,32.94],[-117.32,33.1],[-117.47,33.3],[-117.79,33.54],[-117.95,33.62],[-118.08,33.72],[-118.16,33.75],[-118.26,33.76],[-118.29,33.71],[-118.41,33.74],[-118.39,33.86],[-118.51,34.02],[-118.6,34.04],[-118.83,34.02],[-119.14,34.11],[-119.24,34.16],[-119.27,34.26],[-119.41,34.34],[-119.61,34.42],[-119.71,34.4],[-119.85,34.41],[-120.05,34.47],[-120.17,34.48],[-120.4,34.46],[-120.48,34.47],[-120.56,34.54],[-120.64,34.58],[-120.63,34.67],[-120.64,34.75],[-120.62,34.81],[-120.66,34.95],[-120.63,35.08],[-120.66,35.12],[-120.71,35.16],[-120.86,35.21],[-120.88,35.27],[-120.86,35.37],[-120.9,35.43],[-121.02,35.48],[-121.14,35.61],[-121.28,35.68],[-121.34,35.79],[-121.43,35.86],[-121.46,35.93],[-121.66,36.15],[-121.88,36.33],[-121.91,36.43],[-121.92,36.57],[-121.84,36.66],[-121.79,36.73],[-121.79,36.8],[-121.81,36.85],[-121.88,36.94],[-122.16,36.99],[-122.39,37.21],[-122.41,37.37],[-122.5,37.54],[-122.5,37.65],[-122.51,37.77],[-122.45,37.8],[-122.38,37.79],[-122.39,37.74],[-122.37,37.66],[-122.3,37.59],[-122.23,37.56],[-122.17,37.5],[-122.12,37.48],[-122.07,37.48],[-122.1,37.52],[-122.12,37.54],[-122.16,37.63],[-122.22,37.73],[-122.3,37.79],[-122.33,37.9],[-122.37,37.92],[-122.39,37.96],[-122.31,38.01],[-122.22,38.04],[-122.09,38.05],[-121.72,38.03],[-121.64,38.06],[-121.57,38.05],[-121.53,38.06],[-121.63,38.08],[-121.68,38.07],[-121.75,38.08],[-121.88,38.08],[-121.93,38.09],[-121.99,38.12],[-122.03,38.12],[-122.15,38.07],[-122.21,38.07],[-122.34,38.14],[-122.39,38.14],[-122.48,38.11],[-122.49,37.95],[-122.47,37.84],[-122.52,37.83],[-122.58,37.87],[-122.68,37.9],[-122.76,37.95],[-122.87,38.03],[-122.93,38.06],[-123.0,37.99],[-123.0,38.02],[-122.97,38.1],[-122.98,38.23],[-122.88,38.12],[-122.91,38.2],[-122.99,38.28],[-123.05,38.31],[-123.12,38.45],[-123.29,38.54],[-123.42,38.68],[-123.7,38.91],[-123.72,39.11],[-123.82,39.37],[-123.78,39.51],[-123.78,39.62],[-123.83,39.78],[-123.88,39.86],[-124.11,40.09],[-124.32,40.25],[-124.36,40.37],[-124.37,40.49],[-124.32,40.6],[-124.28,40.71],[-124.25,40.74],[-124.24,40.73],[-124.25,40.7],[-124.22,40.7],[-124.21,40.75],[-124.19,40.77],[-124.22,40.78],[-124.22,40.79],[-124.2,40.82],[-124.13,40.97],[-124.14,41.16],[-124.07,41.38],[-124.07,41.46],[-124.12,41.62],[-124.16,41.72],[-124.24,41.79],[-124.21,41.89],[-124.21,41.98],[-124.36,42.12],[-124.41,42.3],[-124.42,42.38],[-124.41,42.58],[-124.44,42.67],[-124.54,42.81],[-124.5,42.94],[-124.45,43.01],[-124.35,43.34],[-124.32,43.37],[-124.28,43.37],[-124.2,43.42],[-124.23,43.44],[-124.29,43.41],[-124.24,43.54],[-124.18,43.65],[-124.15,43.69],[-124.13,44.06],[-124.1,44.33],[-124.05,44.43],[-124.07,44.52],[-124.04,44.65],[-124.06,44.78],[-123.95,45.4],[-123.96,45.48],[-123.93,45.58],[-123.96,45.84],[-123.95,46.14],[-123.98,46.18],[-123.99,46.22],[-123.96,46.23],[-123.91,46.18],[-123.67,46.18],[-123.52,46.22],[-123.47,46.21],[-123.4,46.15],[-123.32,46.14],[-123.22,46.15],[-123.25,46.17],[-123.3,46.17],[-123.4,46.22],[-123.46,46.27],[-123.65,46.27],[-123.69,46.3],[-123.9,46.27],[-123.96,46.3],[-124.07,46.28],[-124.05,46.37],[-124.05,46.49],[-124.04,46.61],[-124.02,46.52],[-123.95,46.43],[-123.91,46.53],[-123.89,46.66],[-123.96,46.71],[-124.07,46.74],[-124.11,46.86],[-123.84,46.96],[-123.99,46.98],[-124.04,47.03],[-124.11,47.04],[-124.12,47.0],[-124.14,46.95],[-124.16,47.02],[-124.17,47.09],[-124.2,47.21],[-124.31,47.4],[-124.38,47.66],[-124.46,47.78],[-124.62,47.9],[-124.66,47.97],[-124.7,48.15],[-124.68,48.29],[-124.71,48.38],[-124.63,48.38],[-124.43,48.3],[-124.18,48.24],[-124.1,48.2],[-123.98,48.17],[-123.29,48.12],[-123.25,48.12],[-123.16,48.15],[-123.12,48.15],[-123.02,48.08],[-122.97,48.07],[-122.91,48.08],[-122.86,48.09],[-122.78,48.14],[-122.77,48.12],[-122.77,48.08],[-122.74,48.01],[-122.68,47.93],[-122.66,47.88],[-122.78,47.74],[-122.8,47.74],[-122.81,47.78],[-122.82,47.79],[-123.05,47.55],[-123.13,47.44],[-123.14,47.39],[-123.14,47.36],[-123.1,47.35],[-123.03,47.36],[-122.92,47.41],[-122.92,47.42],[-123.02,47.4],[-123.07,47.4],[-123.06,47.45],[-123.05,47.48],[-122.98,47.56],[-122.91,47.61],[-122.81,47.66],[-122.76,47.7],[-122.72,47.76],[-122.61,47.84],[-122.59,47.86],[-122.59,47.92],[-122.59,47.93],[-122.53,47.92],[-122.51,47.82],[-122.52,47.77],[-122.62,47.71],[-122.63,47.69],[-122.61,47.62],[-122.63,47.61],[-122.66,47.62],[-122.68,47.61],[-122.59,47.53],[-122.56,47.46],[-122.55,47.4],[-122.58,47.29],[-122.6,47.27],[-122.65,47.28],[-122.71,47.32],[-122.72,47.31],[-122.77,47.22],[-122.78,47.23],[-122.81,47.33],[-122.83,47.34],[-122.92,47.29],[-122.96,47.24],[-122.99,47.17],[-123.03,47.14],[-122.91,47.13],[-122.81,47.15],[-122.73,47.11],[-122.7,47.11],[-122.63,47.14],[-122.6,47.17],[-122.54,47.28],[-122.51,47.3],[-122.46,47.3],[-122.42,47.31],[-122.35,47.37],[-122.35,47.4],[-122.38,47.53],[-122.37,47.6],[-122.38,47.63],[-122.41,47.65],[-122.41,47.68],[-122.38,47.72],[-122.38,47.75],[-122.4,47.78],[-122.39,47.82],[-122.33,47.9],[-122.32,47.93],[-122.24,48.01],[-122.26,48.04],[-122.32,48.08],[-122.35,48.11],[-122.39,48.17],[-122.42,48.18],[-122.42,48.18],[-122.39,48.09],[-122.39,48.08],[-122.49,48.13],[-122.52,48.16],[-122.53,48.2],[-122.52,48.23],[-122.47,48.26],[-122.4,48.27],[-122.41,48.29],[-122.49,48.37],[-122.54,48.41],[-122.58,48.43],[-122.64,48.43],[-122.66,48.45],[-122.67,48.47],[-122.66,48.49],[-122.63,48.5],[-122.54,48.49],[-122.5,48.51],[-122.5,48.54],[-122.51,48.56],[-122.51,48.67],[-122.55,48.76],[-122.56,48.78],[-122.58,48.78],[-122.6,48.77],[-122.65,48.76],[-122.69,48.79],[-122.72,48.85],[-122.79,48.99],[-122.69,48.99],[-122.26,48.99],[-121.83,48.99],[-121.41,48.99],[-120.98,48.99],[-120.55,48.99],[-120.13,48.99],[-119.7,48.99],[-119.28,48.99],[-118.85,48.99],[-118.42,48.99],[-118.0,48.99],[-117.57,48.99],[-117.14,48.99],[-116.72,48.99],[-116.29,48.99],[-115.86,48.99],[-115.44,48.99],[-115.01,48.99],[-114.59,48.99],[-114.16,48.99],[-113.73,48.99],[-113.31,48.99],[-112.88,48.99],[-112.45,48.99],[-112.03,48.99],[-111.6,48.99],[-111.17,48.99],[-110.75,48.99],[-110.32,48.99],[-109.89,48.99],[-109.47,48.99],[-109.04,48.99],[-108.62,48.99],[-108.19,48.99],[-107.76,48.99],[-107.34,48.99],[-106.91,48.99],[-106.48,48.99],[-106.06,48.99],[-105.63,48.99],[-105.2,48.99],[-104.78,48.99],[-104.35,48.99],[-103.93,48.99],[-103.5,48.99],[-103.07,48.99],[-102.65,48.99],[-102.22,48.99],[-101.79,48.99],[-101.37,48.99],[-100.94,48.99],[-100.51,48.99],[-100.09,48.99],[-99.66,48.99],[-99.24,48.99],[-98.81,48.99],[-98.38,48.99],[-97.96,48.99],[-97.53,48.99],[-97.1,48.99],[-96.68,48.99],[-96.25,48.99],[-95.82,48.99],[-95.4,48.99],[-95.16,48.99],[-95.16,49.2],[-95.16,49.37],[-94.94,49.35],[-94.87,49.32],[-94.85,49.3],[-94.86,49.26],[-94.84,49.12],[-94.8,49.0],[-94.71,48.86],[-94.71,48.86],[-94.71,48.81],[-94.68,48.77],[-94.62,48.74],[-94.41,48.7],[-94.06,48.66],[-93.85,48.61],[-93.8,48.55],[-93.71,48.53],[-93.56,48.54],[-93.46,48.56],[-93.38,48.62],[-93.26,48.63],[-93.16,48.63],[-93.05,48.62],[-93.0,48.61],[-92.84,48.57],[-92.73,48.53],[-92.58,48.47],[-92.5,48.44],[-92.46,48.37],[-92.41,48.28],[-92.35,48.28],[-92.3,48.33],[-92.17,48.34],[-92.01,48.3],[-91.86,48.2],[-91.65,48.1],[-91.52,48.06],[-91.39,48.06],[-91.22,48.1],[-91.04,48.19],[-90.92,48.21],[-90.84,48.2],[-90.8,48.13],[-90.74,48.1],[-90.61,48.11],[-90.32,48.1],[-90.09,48.12],[-90.04,48.08],[-89.99,48.02],[-89.9,48.0],[-89.78,48.02],[-89.55,48.0],[-89.46,48.0],[-89.27,48.02],[-89.19,48.05],[-89.06,48.09],[-88.9,48.16],[-88.61,48.26],[-88.38,48.3],[-88.16,48.23],[-87.99,48.16],[-87.92,48.13],[-87.74,48.06],[-87.49,47.96],[-87.21,47.85],[-86.92,47.74],[-86.67,47.64],[-86.5,47.57],[-86.43,47.54],[-86.23,47.46],[-86.04,47.38],[-85.85,47.3],[-85.65,47.22],[-85.46,47.14],[-85.26,47.06],[-85.07,46.98],[-84.88,46.9],[-84.83,46.77],[-84.78,46.64],[-84.67,46.54],[-84.56,46.46],[-84.5,46.46],[-84.44,46.5],[-84.4,46.52],[-84.34,46.52],[-84.19,46.55],[-84.15,46.54],[-84.13,46.53],[-84.12,46.5],[-84.13,46.48],[-84.15,46.44],[-84.12,46.37],[-84.11,46.29],[-84.09,46.23],[-84.03,46.15],[-83.98,46.08],[-83.91,46.07],[-83.76,46.11],[-83.67,46.12],[-83.62,46.12],[-83.52,46.06],[-83.48,46.02],[-83.47,45.99],[-83.59,45.82],[-83.4,45.73],[-83.18,45.63],[-82.92,45.52],[-82.76,45.45],[-82.55,45.35],[-82.52,45.2],[-82.49,45.08],[-82.45,44.92],[-82.41,44.74],[-82.37,44.57],[-82.33,44.39],[-82.28,44.19],[-82.24,44.02],[-82.2,43.82],[-82.14,43.57],[-82.19,43.47],[-82.3,43.26],[-82.41,43.07],[-82.42,43.02],[-82.49,42.74],[-82.55,42.62],[-82.65,42.56],[-82.74,42.49],[-82.87,42.39],[-83.0,42.33],[-83.07,42.3],[-83.11,42.25],[-83.15,42.14],[-83.14,41.98],[-83.03,41.83],[-82.87,41.75],[-82.69,41.68],[-82.44,41.67],[-82.21,41.78],[-81.97,41.89],[-81.76,41.99],[-81.51,42.1],[-81.28,42.21],[-81.03,42.25],[-80.68,42.3],[-80.25,42.37],[-80.04,42.44],[-79.76,42.54],[-79.45,42.65],[-79.17,42.75],[-79.04,42.8],[-78.94,42.86],[-78.92,42.91],[-78.92,42.94],[-78.95,42.96],[-78.98,42.98],[-79.01,43.0],[-79.03,43.02],[-79.03,43.06],[-79.05,43.09],[-79.07,43.11],[-79.06,43.28],[-79.08,43.33],[-79.17,43.47],[-79.0,43.53],[-78.85,43.58],[-78.72,43.62],[-78.46,43.63],[-78.21,43.63],[-77.88,43.63],[-77.6,43.63],[-77.27,43.63],[-77.07,43.63],[-76.82,43.63],[-76.7,43.78],[-76.59,43.92],[-76.46,44.06],[-76.25,44.21],[-76.19,44.24],[-76.15,44.3],[-76.02,44.36],[-75.88,44.42],[-75.82,44.47],[-75.79,44.5],[-75.4,44.77],[-75.18,44.9],[-75.0,44.97],[-74.86,45.0],[-74.76,45.0],[-74.71,45.0]],[[-130.21,55.03],[-130.31,54.95],[-130.49,54.83],[-130.58,54.77],[-130.62,54.79],[-130.85,54.81],[-130.93,54.95],[-130.98,55.06],[-131.05,55.16],[-131.05,55.18],[-130.98,55.24],[-130.75,55.3],[-130.75,55.32],[-130.84,55.33],[-130.86,55.36],[-130.88,55.46],[-130.87,55.55],[-130.88,55.61],[-130.92,55.74],[-130.98,55.81],[-131.13,55.96],[-131.14,56.0],[-131.07,56.04],[-131.03,56.09],[-131.29,56.01],[-131.64,55.93],[-131.78,55.88],[-131.82,55.85],[-131.83,55.84],[-131.8,55.78],[-131.8,55.77],[-131.83,55.73],[-131.87,55.65],[-131.95,55.55],[-131.98,55.54],[-132.12,55.57],[-132.16,55.6],[-132.22,55.72],[-132.21,55.75],[-132.16,55.78],[-132.09,55.84],[-132.01,55.93],[-131.84,56.16],[-131.74,56.16],[-131.55,56.21],[-131.84,56.23],[-131.89,56.24],[-131.93,56.27],[-131.96,56.32],[-132.02,56.38],[-132.13,56.4],[-132.18,56.42],[-132.26,56.49],[-132.3,56.52],[-132.33,56.56],[-132.34,56.6],[-132.36,56.63],[-132.43,56.63],[-132.48,56.65],[-132.49,56.77],[-132.64,56.8],[-132.7,56.82],[-132.8,56.9],[-132.83,56.93],[-132.84,56.96],[-132.81,57.04],[-132.82,57.06],[-132.91,57.05],[-133.47,57.17],[-133.44,57.34],[-133.54,57.55],[-133.65,57.64],[-133.63,57.68],[-133.6,57.69],[-133.55,57.7],[-133.34,57.63],[-133.14,57.56],[-133.12,57.57],[-133.44,57.73],[-133.52,57.78],[-133.54,57.83],[-133.54,57.86],[-133.51,57.88],[-133.21,57.87],[-133.19,57.88],[-133.5,57.92],[-133.56,57.92],[-133.63,57.86],[-133.66,57.84],[-133.72,57.84],[-133.74,57.85],[-133.82,57.94],[-133.89,57.99],[-134.03,58.07],[-134.06,58.13],[-134.06,58.21],[-134.05,58.29],[-133.93,58.47],[-133.89,58.5],[-133.88,58.52],[-133.91,58.52],[-133.94,58.5],[-134.04,58.42],[-134.13,58.28],[-134.21,58.23],[-134.26,58.24],[-134.33,58.3],[-134.49,58.37],[-134.66,58.38],[-134.78,58.45],[-134.94,58.65],[-134.96,58.74],[-134.99,58.77],[-135.08,58.8],[-135.13,58.84],[-135.22,59.08],[-135.33,59.24],[-135.36,59.32],[-135.35,59.41],[-135.36,59.42],[-135.4,59.35],[-135.41,59.32],[-135.48,59.31],[-135.42,59.24],[-135.4,59.21],[-135.43,59.21],[-135.5,59.2],[-135.39,59.09],[-135.33,58.91],[-135.26,58.78],[-135.21,58.67],[-135.18,58.59],[-135.15,58.51],[-135.06,58.34],[-135.05,58.31],[-135.06,58.28],[-135.09,58.25],[-135.14,58.23],[-135.3,58.26],[-135.36,58.3],[-135.45,58.38],[-135.57,58.41],[-135.87,58.39],[-135.9,58.4],[-135.9,58.46],[-135.86,58.58],[-135.89,58.62],[-136.05,58.79],[-136.04,58.82],[-135.83,58.9],[-135.93,58.9],[-136.02,58.87],[-136.05,58.89],[-136.1,59.0],[-136.13,59.04],[-136.15,59.05],[-136.16,58.95],[-136.12,58.89],[-136.12,58.86],[-136.12,58.82],[-136.15,58.79],[-136.19,58.77],[-136.23,58.77],[-136.3,58.79],[-136.38,58.83],[-136.45,58.85],[-136.48,58.86],[-136.51,58.91],[-136.57,58.94],[-136.83,58.98],[-136.99,59.03],[-137.0,59.02],[-136.95,58.97],[-136.95,58.93],[-136.99,58.93],[-137.06,58.87],[-137.04,58.87],[-136.96,58.88],[-136.88,58.88],[-136.74,58.85],[-136.61,58.81],[-136.57,58.79],[-136.55,58.75],[-136.53,58.74],[-136.41,58.7],[-136.4,58.68],[-136.48,58.62],[-136.32,58.62],[-136.22,58.6],[-136.1,58.51],[-136.06,58.45],[-136.06,58.38],[-136.08,58.36],[-136.13,58.35],[-136.46,58.33],[-136.58,58.25],[-136.61,58.24],[-136.7,58.27],[-136.86,58.33],[-137.07,58.4],[-137.54,58.58],[-137.56,58.59],[-137.56,58.63],[-137.6,58.64],[-137.66,58.66],[-137.75,58.71],[-137.86,58.79],[-137.93,58.85],[-137.96,58.89],[-138.03,58.94],[-138.24,59.05],[-138.35,59.09],[-138.45,59.11],[-138.54,59.12],[-138.56,59.13],[-138.52,59.15],[-138.51,59.17],[-138.7,59.19],[-138.88,59.24],[-139.34,59.38],[-139.58,59.46],[-139.71,59.5],[-139.77,59.53],[-139.8,59.55],[-139.77,59.57],[-139.67,59.59],[-139.61,59.61],[-139.51,59.7],[-139.51,59.73],[-139.56,59.79],[-139.58,59.85],[-139.58,59.88],[-139.57,59.91],[-139.55,59.93],[-139.51,59.95],[-139.48,59.96],[-139.45,59.96],[-139.33,59.88],[-139.31,59.85],[-139.32,59.74],[-139.29,59.61],[-139.28,59.62],[-139.27,59.66],[-139.26,59.74],[-139.25,59.78],[-139.22,59.82],[-139.18,59.84],[-139.05,59.83],[-138.99,59.84],[-139.24,59.89],[-139.4,60.0],[-139.43,60.01],[-139.52,60.02],[-139.61,59.97],[-139.85,59.83],[-139.92,59.81],[-140.22,59.73],[-140.42,59.71],[-140.65,59.72],[-140.84,59.75],[-141.33,59.87],[-141.41,59.9],[-141.29,59.98],[-141.29,60.0],[-141.33,60.08],[-141.36,60.11],[-141.41,60.12],[-141.42,60.11],[-141.42,60.09],[-141.41,60.04],[-141.45,60.02],[-141.53,59.99],[-141.67,59.97],[-142.1,60.03],[-142.55,60.09],[-142.95,60.1],[-143.51,60.06],[-143.81,60.01],[-143.98,60.01],[-144.15,60.02],[-144.16,60.05],[-144.08,60.06],[-144.09,60.08],[-144.19,60.15],[-144.33,60.19],[-144.53,60.21],[-144.64,60.22],[-144.67,60.25],[-144.74,60.27],[-144.85,60.3],[-144.9,60.34],[-144.86,60.46],[-144.82,60.53],[-144.79,60.58],[-144.69,60.67],[-144.72,60.66],[-144.86,60.6],[-144.98,60.54],[-145.1,60.45],[-145.16,60.42],[-145.25,60.38],[-145.38,60.39],[-145.56,60.44],[-145.72,60.47],[-145.85,60.47],[-145.9,60.48],[-145.81,60.52],[-145.76,60.56],[-145.69,60.62],[-145.67,60.65],[-146.15,60.66],[-146.17,60.69],[-146.17,60.72],[-146.18,60.73],[-146.25,60.75],[-146.35,60.74],[-146.5,60.7],[-146.57,60.73],[-146.55,60.75],[-146.5,60.76],[-146.39,60.81],[-146.53,60.84],[-146.6,60.87],[-146.64,60.9],[-146.64,60.99],[-146.6,61.05],[-146.28,61.11],[-146.38,61.14],[-146.58,61.13],[-146.72,61.08],[-146.87,61.0],[-146.98,60.98],[-147.03,61.0],[-147.11,61.0],[-147.2,61.0],[-147.25,60.98],[-147.29,60.95],[-147.32,60.93],[-147.36,60.91],[-147.39,60.92],[-147.43,60.95],[-147.52,60.97],[-147.57,60.99],[-147.59,60.98],[-147.62,60.93],[-147.66,60.91],[-147.81,60.89],[-147.89,60.89],[-147.99,60.95],[-148.01,60.97],[-147.97,61.02],[-147.75,61.22],[-147.77,61.22],[-147.84,61.19],[-147.99,61.11],[-148.05,61.08],[-148.16,61.08],[-148.21,61.09],[-148.27,61.08],[-148.34,61.06],[-148.39,61.04],[-148.41,61.01],[-148.4,61.01],[-148.29,61.04],[-148.23,61.04],[-148.21,61.03],[-148.29,60.94],[-148.34,60.85],[-148.39,60.83],[-148.47,60.84],[-148.56,60.83],[-148.56,60.8],[-148.4,60.73],[-148.34,60.72],[-148.27,60.7],[-148.26,60.68],[-148.28,60.61],[-148.3,60.58],[-148.34,60.57],[-148.47,60.57],[-148.51,60.57],[-148.6,60.52],[-148.64,60.49],[-148.62,60.49],[-148.55,60.51],[-148.44,60.53],[-148.3,60.53],[-148.19,60.55],[-148.12,60.58],[-148.05,60.57],[-147.98,60.52],[-147.96,60.48],[-147.99,60.45],[-148.05,60.43],[-148.13,60.41],[-148.18,60.39],[-148.2,60.36],[-148.22,60.32],[-148.22,60.27],[-148.2,60.17],[-148.21,60.15],[-148.25,60.15],[-148.29,60.15],[-148.33,60.12],[-148.43,59.99],[-148.47,59.97],[-148.51,59.99],[-148.54,59.99],[-148.57,59.97],[-148.64,59.96],[-148.75,59.95],[-148.84,59.95],[-149.0,59.98],[-149.07,60.0],[-149.12,60.03],[-149.27,60.0],[-149.3,60.01],[-149.4,60.11],[-149.41,60.1],[-149.43,60.0],[-149.46,59.97],[-149.55,59.89],[-149.6,59.77],[-149.61,59.77],[-149.63,59.78],[-149.68,59.9],[-149.71,59.92],[-149.79,59.86],[-149.8,59.83],[-149.78,59.75],[-149.8,59.74],[-149.96,59.78],[-150.01,59.78],[-150.02,59.78],[-149.96,59.71],[-149.97,59.69],[-150.2,59.57],[-150.26,59.57],[-150.3,59.58],[-150.34,59.58],[-150.49,59.54],[-150.53,59.54],[-150.58,59.56],[-150.61,59.56],[-150.62,59.54],[-150.62,59.48],[-150.68,59.43],[-150.85,59.34],[-150.9,59.3],[-150.93,59.25],[-150.96,59.24],[-151.06,59.28],[-151.18,59.3],[-151.2,59.29],[-151.16,59.26],[-151.17,59.24],[-151.22,59.23],[-151.29,59.23],[-151.37,59.25],[-151.48,59.23],[-151.62,59.19],[-151.74,59.19],[-151.9,59.26],[-151.95,59.27],[-151.96,59.29],[-151.93,59.34],[-151.88,59.39],[-151.85,59.41],[-151.69,59.46],[-151.51,59.48],[-151.4,59.52],[-151.26,59.59],[-151.19,59.64],[-151.05,59.77],[-151.06,59.78],[-151.09,59.79],[-151.4,59.66],[-151.45,59.65],[-151.51,59.65],[-151.76,59.7],[-151.82,59.72],[-151.85,59.78],[-151.78,59.92],[-151.73,59.99],[-151.61,60.09],[-151.45,60.2],[-151.4,60.27],[-151.31,60.47],[-151.32,60.55],[-151.36,60.66],[-151.36,60.72],[-151.32,60.74],[-150.95,60.84],[-150.78,60.91],[-150.44,61.02],[-150.35,61.02],[-150.28,60.99],[-150.2,60.96],[-150.11,60.93],[-150.0,60.94],[-149.86,60.96],[-149.63,60.95],[-149.17,60.88],[-149.08,60.88],[-149.07,60.89],[-149.14,60.94],[-149.46,60.96],[-149.59,60.99],[-149.97,61.12],[-150.05,61.17],[-150.02,61.19],[-149.93,61.21],[-149.9,61.23],[-149.88,61.26],[-149.83,61.31],[-149.74,61.36],[-149.6,61.42],[-149.33,61.5],[-149.43,61.5],[-149.63,61.49],[-149.7,61.47],[-149.82,61.41],[-149.87,61.37],[-149.95,61.29],[-149.98,61.28],[-150.11,61.27],[-150.47,61.26],[-150.53,61.3],[-150.57,61.31],[-150.61,61.3],[-150.95,61.2],[-151.06,61.15],[-151.15,61.09],[-151.28,61.04],[-151.46,61.01],[-151.59,60.98],[-151.73,60.91],[-151.78,60.86],[-151.78,60.83],[-151.75,60.75],[-151.79,60.74],[-151.87,60.73],[-152.0,60.68],[-152.27,60.53],[-152.31,60.47],[-152.31,60.45],[-152.26,60.41],[-152.29,60.38],[-152.37,60.34],[-152.54,60.27],[-152.65,60.24],[-152.73,60.24],[-152.8,60.25],[-152.92,60.29],[-153.02,60.3],[-153.03,60.29],[-152.89,60.24],[-152.75,60.18],[-152.66,60.13],[-152.63,60.08],[-152.63,60.04],[-152.66,60.0],[-152.76,59.92],[-152.86,59.9],[-153.11,59.88],[-153.19,59.86],[-153.21,59.84],[-153.04,59.81],[-153.02,59.79],[-153.05,59.73],[-153.09,59.71],[-153.24,59.67],[-153.36,59.66],[-153.38,59.67],[-153.36,59.72],[-153.37,59.73],[-153.41,59.74],[-153.48,59.72],[-153.65,59.65],[-153.67,59.63],[-153.61,59.62],[-153.62,59.6],[-153.71,59.55],[-153.75,59.51],[-153.81,59.47],[-154.09,59.36],[-154.07,59.34],[-154.14,59.24],[-154.18,59.16],[-154.13,59.12],[-153.9,59.08],[-153.79,59.07],[-153.66,59.04],[-153.42,58.96],[-153.34,58.91],[-153.33,58.88],[-153.33,58.86],[-153.36,58.82],[-153.44,58.75],[-153.62,58.65],[-153.7,58.63],[-153.82,58.6],[-153.86,58.59],[-154.02,58.49],[-154.06,58.44],[-154.06,58.4],[-154.09,58.37],[-154.29,58.3],[-154.28,58.29],[-154.21,58.29],[-154.24,58.23],[-154.25,58.16],[-154.28,58.15],[-154.41,58.15],[-154.57,58.12],[-154.58,58.11],[-154.58,58.06],[-155.01,58.02],[-155.1,57.91],[-155.15,57.88],[-155.31,57.81],[-155.41,57.78],[-155.53,57.76],[-155.59,57.73],[-155.6,57.7],[-155.63,57.67],[-155.73,57.63],[-155.78,57.57],[-155.81,57.56],[-156.0,57.54],[-156.04,57.53],[-156.06,57.45],[-156.09,57.45],[-156.16,57.46],[-156.24,57.45],[-156.44,57.36],[-156.48,57.33],[-156.47,57.31],[-156.44,57.29],[-156.4,57.24],[-156.4,57.2],[-156.48,57.11],[-156.5,57.09],[-156.59,57.07],[-156.63,57.01],[-156.71,57.02],[-156.78,57.01],[-156.82,56.97],[-156.87,56.95],[-156.92,56.94],[-156.99,56.91],[-157.07,56.86],[-157.14,56.83],[-157.21,56.81],[-157.27,56.81],[-157.33,56.82],[-157.39,56.81],[-157.44,56.79],[-157.49,56.76],[-157.53,56.67],[-157.58,56.63],[-157.61,56.63],[-157.67,56.63],[-157.77,56.65],[-157.87,56.65],[-158.03,56.59],[-158.08,56.55],[-157.98,56.54],[-157.93,56.53],[-157.93,56.52],[-157.98,56.51],[-158.07,56.51],[-158.12,56.5],[-158.19,56.48],[-158.35,56.45],[-158.41,56.44],[-158.54,56.34],[-158.55,56.31],[-158.54,56.31],[-158.47,56.32],[-158.39,56.3],[-158.34,56.28],[-158.32,56.25],[-158.29,56.2],[-158.28,56.2],[-158.43,56.11],[-158.48,56.08],[-158.5,56.06],[-158.52,56.07],[-158.54,56.17],[-158.55,56.18],[-158.59,56.18],[-158.63,56.15],[-158.7,56.04],[-158.79,55.99],[-159.43,55.84],[-159.52,55.81],[-159.54,55.75],[-159.57,55.7],[-159.61,55.65],[-159.66,55.63],[-159.67,55.65],[-159.67,55.79],[-159.68,55.82],[-159.74,55.84],[-159.77,55.84],[-159.81,55.83],[-159.87,55.8],[-159.91,55.79],[-159.96,55.79],[-160.05,55.76],[-160.24,55.66],[-160.37,55.64],[-160.41,55.61],[-160.46,55.56],[-160.5,55.54],[-160.55,55.54],[-160.63,55.55],[-160.68,55.54],[-160.73,55.5],[-160.77,55.48],[-160.9,55.51],[-160.95,55.49],[-161.02,55.44],[-161.1,55.41],[-161.18,55.39],[-161.38,55.37],[-161.46,55.38],[-161.48,55.4],[-161.48,55.46],[-161.44,55.51],[-161.41,55.54],[-161.37,55.56],[-161.31,55.56],[-161.2,55.54],[-161.21,55.56],[-161.26,55.58],[-161.36,55.61],[-161.46,55.63],[-161.52,55.62],[-161.6,55.59],[-161.65,55.56],[-161.68,55.53],[-161.72,55.42],[-161.74,55.39],[-161.98,55.2],[-162.07,55.14],[-162.17,55.14],[-162.21,55.12],[-162.27,55.07],[-162.33,55.05],[-162.39,55.05],[-162.43,55.06],[-162.46,55.08],[-162.45,55.09],[-162.41,55.11],[-162.43,55.15],[-162.5,55.21],[-162.54,55.24],[-162.63,55.25],[-162.64,55.22],[-162.61,55.07],[-162.62,55.04],[-162.67,55.0],[-162.82,54.95],[-162.87,54.95],[-163.0,55.05],[-163.12,55.06],[-163.13,55.03],[-163.1,54.97],[-163.13,54.92],[-163.22,54.86],[-163.29,54.84],[-163.34,54.84],[-163.34,54.88],[-163.3,54.95],[-163.29,55.01],[-163.31,55.06],[-163.3,55.1],[-163.28,55.12],[-163.11,55.19],[-163.05,55.2],[-163.01,55.19],[-162.96,55.18],[-162.91,55.2],[-162.87,55.22],[-162.86,55.25],[-162.79,55.3],[-162.66,55.35],[-162.51,55.45],[-162.35,55.59],[-162.16,55.72],[-161.94,55.82],[-161.7,55.91],[-161.22,56.02],[-161.18,56.01],[-161.22,55.98],[-161.19,55.95],[-161.15,55.95],[-160.97,55.97],[-160.9,55.99],[-160.88,55.97],[-160.9,55.94],[-161.01,55.91],[-161.01,55.89],[-160.85,55.77],[-160.8,55.75],[-160.76,55.76],[-160.75,55.77],[-160.76,55.85],[-160.71,55.87],[-160.6,55.87],[-160.53,55.86],[-160.5,55.84],[-160.44,55.82],[-160.35,55.8],[-160.29,55.81],[-160.27,55.83],[-160.31,55.86],[-160.48,55.94],[-160.53,55.97],[-160.54,56.01],[-160.51,56.06],[-160.46,56.14],[-160.38,56.24],[-160.3,56.31],[-160.15,56.4],[-160.05,56.44],[-159.79,56.56],[-159.28,56.69],[-159.16,56.77],[-158.99,56.86],[-158.92,56.88],[-158.92,56.85],[-158.89,56.82],[-158.78,56.8],[-158.71,56.79],[-158.68,56.79],[-158.67,56.83],[-158.68,56.89],[-158.68,56.94],[-158.68,57.0],[-158.66,57.04],[-158.59,57.11],[-158.47,57.2],[-158.32,57.3],[-158.22,57.34],[-158.13,57.37],[-158.05,57.41],[-157.89,57.51],[-157.85,57.53],[-157.74,57.55],[-157.7,57.54],[-157.67,57.51],[-157.65,57.5],[-157.54,57.48],[-157.46,57.51],[-157.47,57.52],[-157.53,57.53],[-157.57,57.54],[-157.61,57.6],[-157.68,57.64],[-157.7,57.68],[-157.68,57.74],[-157.62,57.9],[-157.61,58.05],[-157.56,58.14],[-157.44,58.17],[-157.19,58.19],[-157.34,58.23],[-157.39,58.23],[-157.49,58.25],[-157.52,58.35],[-157.52,58.42],[-157.46,58.5],[-157.23,58.64],[-156.97,58.74],[-157.01,58.74],[-157.04,58.77],[-156.92,58.96],[-156.81,59.13],[-156.96,58.99],[-157.14,58.88],[-157.67,58.75],[-158.02,58.64],[-158.19,58.61],[-158.3,58.64],[-158.39,58.75],[-158.44,58.78],[-158.5,58.85],[-158.48,58.94],[-158.43,59.0],[-158.31,59.01],[-158.19,58.98],[-158.08,58.98],[-158.22,59.04],[-158.42,59.09],[-158.51,59.07],[-158.58,58.99],[-158.68,58.93],[-158.76,58.95],[-158.81,58.97],[-158.78,58.9],[-158.84,58.79],[-158.86,58.72],[-158.77,58.52],[-158.79,58.44],[-158.95,58.4],[-159.08,58.47],[-159.36,58.72],[-159.45,58.79],[-159.67,58.91],[-159.74,58.89],[-159.83,58.84],[-159.92,58.82],[-160.15,58.91],[-160.26,58.97],[-160.36,59.05],[-160.52,59.01],[-160.66,58.96],[-160.82,58.87],[-160.92,58.87],[-161.22,58.8],[-161.25,58.8],[-161.29,58.76],[-161.33,58.74],[-161.36,58.67],[-161.76,58.61],[-162.14,58.64],[-162.01,58.69],[-161.86,58.72],[-161.72,58.79],[-161.78,58.9],[-161.79,58.95],[-161.79,59.02],[-161.64,59.11],[-161.79,59.11],[-161.89,59.08],[-161.98,59.15],[-162.02,59.28],[-161.92,59.37],[-161.87,59.43],[-161.83,59.51],[-161.83,59.59],[-161.91,59.71],[-162.14,59.98],[-162.24,60.18],[-162.42,60.28],[-162.29,60.46],[-162.14,60.61],[-161.95,60.68],[-161.96,60.7],[-162.07,60.69],[-162.14,60.69],[-162.2,60.63],[-162.27,60.6],[-162.47,60.39],[-162.6,60.3],[-162.68,60.27],[-162.55,60.23],[-162.53,60.2],[-162.5,60.13],[-162.54,60.04],[-162.57,59.99],[-162.73,59.99],[-162.88,59.92],[-163.22,59.85],[-163.68,59.8],[-163.91,59.81],[-164.14,59.9],[-164.14,59.95],[-164.13,59.99],[-164.47,60.15],[-164.66,60.3],[-164.8,60.31],[-164.92,60.35],[-165.06,60.41],[-165.05,60.46],[-165.03,60.5],[-165.11,60.53],[-165.22,60.52],[-165.35,60.54],[-165.02,60.74],[-164.9,60.87],[-164.81,60.89],[-164.68,60.87],[-164.51,60.82],[-164.37,60.8],[-164.32,60.77],[-164.27,60.72],[-164.32,60.65],[-164.37,60.59],[-164.31,60.61],[-164.13,60.69],[-164.0,60.77],[-163.94,60.76],[-163.89,60.75],[-163.82,60.67],[-163.73,60.59],[-163.53,60.66],[-163.42,60.76],[-163.51,60.8],[-163.62,60.82],[-163.91,60.85],[-163.84,60.88],[-163.66,60.88],[-163.59,60.9],[-163.66,60.94],[-163.75,60.97],[-163.99,60.86],[-164.44,60.87],[-164.75,60.93],[-165.07,60.92],[-165.11,60.93],[-165.18,60.97],[-165.0,61.04],[-164.88,61.09],[-164.87,61.11],[-164.94,61.11],[-165.08,61.09],[-165.14,61.13],[-165.13,61.19],[-165.15,61.19],[-165.2,61.15],[-165.28,61.17],[-165.34,61.2],[-165.31,61.23],[-165.24,61.27],[-165.27,61.27],[-165.33,61.27],[-165.39,61.21],[-165.38,61.17],[-165.38,61.11],[-165.48,61.09],[-165.57,61.1],[-165.63,61.17],[-165.69,61.3],[-165.86,61.34],[-165.91,61.4],[-165.8,61.49],[-165.85,61.54],[-165.96,61.55],[-166.09,61.51],[-166.15,61.55],[-166.16,61.59],[-166.17,61.65],[-166.13,61.66],[-166.1,61.65],[-165.83,61.68],[-165.81,61.7],[-166.02,61.75],[-166.08,61.8],[-165.99,61.83],[-165.83,61.84],[-165.61,61.87],[-165.71,61.93],[-165.73,61.96],[-165.74,62.01],[-165.71,62.1],[-165.45,62.3],[-165.19,62.47],[-165.12,62.51],[-165.0,62.53],[-164.89,62.52],[-164.78,62.48],[-164.76,62.5],[-164.8,62.51],[-164.84,62.58],[-164.69,62.61],[-164.6,62.69],[-164.59,62.71],[-164.69,62.68],[-164.79,62.62],[-164.82,62.68],[-164.85,62.8],[-164.8,62.92],[-164.76,62.97],[-164.68,63.02],[-164.43,63.04],[-164.38,63.03],[-164.38,63.05],[-164.53,63.13],[-164.46,63.19],[-164.41,63.22],[-164.11,63.26],[-163.94,63.25],[-163.74,63.19],[-163.62,63.13],[-163.63,63.09],[-163.66,63.07],[-163.73,63.05],[-163.75,63.03],[-163.74,63.02],[-163.65,63.06],[-163.5,63.11],[-163.42,63.08],[-163.36,63.05],[-163.29,63.05],[-163.06,63.08],[-162.95,63.11],[-162.81,63.21],[-162.62,63.27],[-162.36,63.45],[-162.28,63.53],[-162.19,63.54],[-162.11,63.53],[-162.06,63.47],[-161.97,63.45],[-161.51,63.47],[-161.27,63.5],[-161.1,63.56],[-160.93,63.66],[-160.83,63.73],[-160.78,63.82],[-160.84,63.93],[-160.9,64.03],[-160.99,64.25],[-161.22,64.4],[-161.39,64.44],[-161.49,64.43],[-161.41,64.53],[-161.19,64.52],[-161.05,64.53],[-160.93,64.58],[-160.89,64.61],[-160.84,64.68],[-160.86,64.76],[-160.89,64.8],[-160.97,64.84],[-161.06,64.9],[-161.13,64.93],[-161.19,64.92],[-161.47,64.79],[-161.63,64.79],[-161.76,64.82],[-161.87,64.74],[-162.17,64.68],[-162.33,64.61],[-162.64,64.45],[-162.71,64.38],[-162.81,64.37],[-162.88,64.52],[-163.2,64.65],[-163.3,64.61],[-163.25,64.56],[-163.17,64.53],[-163.05,64.52],[-163.1,64.48],[-163.14,64.42],[-163.27,64.48],[-163.49,64.55],[-163.71,64.59],[-164.3,64.58],[-164.69,64.51],[-164.73,64.52],[-164.76,64.53],[-164.83,64.51],[-164.86,64.48],[-164.9,64.46],[-164.98,64.45],[-165.14,64.47],[-165.45,64.51],[-166.14,64.58],[-166.33,64.63],[-166.48,64.73],[-166.48,64.8],[-166.41,64.83],[-166.42,64.93],[-166.55,64.95],[-166.83,65.1],[-166.93,65.16],[-166.91,65.16],[-166.86,65.15],[-166.76,65.13],[-166.53,65.15],[-166.45,65.25],[-166.28,65.27],[-166.12,65.26],[-166.16,65.29],[-166.2,65.31],[-166.61,65.35],[-166.67,65.34],[-167.4,65.42],[-167.99,65.57],[-168.04,65.6],[-168.09,65.66],[-168.01,65.72],[-167.93,65.75],[-167.93,65.71],[-167.91,65.68],[-167.58,65.76],[-167.41,65.86],[-167.07,65.88],[-167.0,65.9],[-166.89,65.96],[-166.75,66.05],[-166.54,66.1],[-166.4,66.14],[-166.21,66.17],[-166.06,66.13],[-166.01,66.12],[-165.72,66.11],[-165.63,66.13],[-165.59,66.15],[-165.56,66.17],[-165.84,66.25],[-165.81,66.29],[-165.78,66.32],[-165.45,66.41],[-165.2,66.44],[-165.06,66.44],[-164.67,66.56],[-164.46,66.59],[-164.06,66.61],[-163.73,66.62],[-163.64,66.57],[-163.82,66.58],[-163.89,66.58],[-163.84,66.56],[-163.78,66.53],[-163.79,66.49],[-163.9,66.38],[-163.89,66.29],[-163.96,66.26],[-164.03,66.22],[-163.7,66.08],[-163.17,66.08],[-162.89,66.1],[-162.72,66.06],[-162.59,66.05],[-162.21,66.07],[-161.93,66.04],[-161.82,66.05],[-161.56,66.25],[-161.46,66.28],[-161.35,66.25],[-161.2,66.22],[-161.11,66.24],[-161.03,66.19],[-161.07,66.29],[-161.12,66.33],[-161.54,66.41],[-161.83,66.37],[-161.92,66.41],[-161.89,66.49],[-162.19,66.69],[-162.32,66.73],[-162.47,66.74],[-162.54,66.81],[-162.61,66.89],[-162.48,66.93],[-162.36,66.95],[-162.25,66.92],[-162.13,66.8],[-162.02,66.78],[-162.05,66.67],[-161.91,66.56],[-161.59,66.46],[-161.34,66.5],[-161.16,66.5],[-161.05,66.47],[-160.78,66.38],[-160.65,66.37],[-160.23,66.42],[-160.23,66.51],[-160.26,66.57],[-160.36,66.61],[-160.64,66.6],[-160.86,66.67],[-161.05,66.65],[-161.4,66.55],[-161.57,66.59],[-161.68,66.65],[-161.86,66.7],[-161.88,66.8],[-161.73,66.92],[-161.62,66.98],[-161.72,67.02],[-161.97,67.05],[-162.39,67.02],[-162.41,67.06],[-162.41,67.1],[-162.58,67.02],[-162.76,67.04],[-163.0,67.03],[-163.53,67.1],[-163.72,67.2],[-163.8,67.27],[-163.94,67.48],[-164.13,67.61],[-165.39,68.05],[-165.96,68.16],[-166.24,68.28],[-166.41,68.31],[-166.57,68.32],[-166.79,68.36],[-166.64,68.41],[-166.55,68.42],[-166.65,68.37],[-166.57,68.36],[-166.45,68.39],[-166.38,68.43],[-166.28,68.57],[-166.18,68.8],[-166.21,68.89],[-165.51,68.87],[-165.04,68.88],[-164.89,68.9],[-164.3,68.94],[-164.15,68.96],[-163.87,69.04],[-163.54,69.17],[-163.25,69.35],[-163.21,69.39],[-163.19,69.38],[-163.16,69.39],[-163.13,69.45],[-163.09,69.61],[-162.95,69.76],[-162.35,70.09],[-162.07,70.23],[-161.98,70.29],[-161.88,70.33],[-161.81,70.29],[-161.78,70.28],[-161.76,70.26],[-161.82,70.25],[-161.91,70.21],[-162.04,70.18],[-162.07,70.16],[-162.0,70.17],[-161.77,70.2],[-161.64,70.23],[-161.0,70.3],[-160.65,70.42],[-160.63,70.45],[-160.12,70.59],[-160.05,70.59],[-159.96,70.57],[-160.11,70.47],[-160.01,70.45],[-160.1,70.33],[-159.91,70.33],[-159.87,70.28],[-159.86,70.32],[-159.86,70.39],[-159.84,70.45],[-159.81,70.5],[-159.68,70.48],[-159.39,70.52],[-159.75,70.53],[-159.96,70.63],[-160.08,70.63],[-159.68,70.79],[-159.31,70.88],[-159.23,70.88],[-159.19,70.86],[-159.18,70.83],[-159.26,70.81],[-159.34,70.78],[-159.3,70.75],[-159.25,70.75],[-159.08,70.77],[-159.0,70.8],[-158.62,70.8],[-158.51,70.82],[-158.48,70.84],[-158.0,70.85],[-157.91,70.86],[-157.61,70.94],[-157.32,71.04],[-157.2,71.09],[-156.97,71.23],[-156.78,71.32],[-156.47,71.41],[-156.4,71.4],[-156.5,71.38],[-156.57,71.34],[-156.47,71.29],[-155.81,71.19],[-155.65,71.18],[-155.58,71.12],[-155.63,71.06],[-155.8,71.0],[-156.15,70.93],[-156.04,70.9],[-155.97,70.84],[-155.87,70.83],[-155.71,70.86],[-155.58,70.89],[-155.31,71.01],[-155.23,71.08],[-155.17,71.1],[-154.94,71.08],[-154.82,71.05],[-154.67,70.99],[-154.73,70.93],[-154.79,70.89],[-154.6,70.85],[-154.39,70.84],[-154.2,70.8],[-153.92,70.88],[-153.7,70.89],[-153.5,70.89],[-153.23,70.93],[-152.78,70.88],[-152.67,70.89],[-152.49,70.88],[-152.3,70.85],[-152.23,70.81],[-152.44,70.73],[-152.47,70.65],[-152.4,70.62],[-152.27,70.61],[-152.25,70.57],[-152.17,70.56],[-151.77,70.56],[-151.8,70.54],[-151.82,70.51],[-151.94,70.45],[-151.22,70.42],[-151.13,70.45],[-150.98,70.46],[-150.66,70.51],[-150.54,70.49],[-150.4,70.44],[-150.27,70.43],[-150.15,70.44],[-149.87,70.51],[-149.54,70.51],[-149.41,70.49],[-149.27,70.5],[-148.84,70.43],[-148.69,70.42],[-148.48,70.32],[-148.37,70.31],[-148.25,70.36],[-148.14,70.36],[-148.04,70.32],[-147.87,70.3],[-147.79,70.24],[-147.71,70.22],[-147.06,70.17],[-146.74,70.19],[-146.28,70.19],[-146.06,70.16],[-145.82,70.16],[-145.44,70.05],[-145.24,70.03],[-145.2,70.01],[-144.62,69.98],[-144.42,70.04],[-144.06,70.05],[-143.75,70.1],[-143.57,70.1],[-143.36,70.09],[-143.28,70.1],[-143.22,70.12],[-142.71,70.03],[-142.42,69.94],[-142.3,69.87],[-141.7,69.77],[-141.53,69.71],[-141.41,69.65],[-141.34,69.65],[-141.29,69.66],[-141.08,69.66],[-141.0,69.65],[-141.0,69.36],[-141.0,69.07],[-141.0,68.77],[-141.0,68.48],[-141.0,68.19],[-141.0,67.9],[-141.0,67.61],[-141.0,67.31],[-141.0,67.02],[-141.0,66.73],[-141.0,66.44],[-141.0,66.14],[-141.0,65.85],[-141.0,65.56],[-141.0,65.27],[-141.0,64.98],[-141.0,64.68],[-141.0,64.39],[-141.0,64.1],[-141.0,63.81],[-141.0,63.51],[-141.0,63.22],[-141.0,62.93],[-141.0,62.64],[-141.0,62.35],[-141.0,62.05],[-141.0,61.76],[-141.0,61.47],[-141.0,61.18],[-141.0,60.88],[-141.0,60.59],[-141.0,60.3],[-140.76,60.26],[-140.53,60.22],[-140.45,60.3],[-140.2,60.24],[-139.97,60.18],[-139.83,60.25],[-139.68,60.33],[-139.47,60.33],[-139.23,60.34],[-139.08,60.34],[-139.08,60.28],[-139.14,60.17],[-139.19,60.08],[-139.04,59.99],[-138.87,59.95],[-138.71,59.9],[-138.63,59.78],[-138.45,59.68],[-138.32,59.61],[-138.19,59.54],[-138.0,59.44],[-137.87,59.37],[-137.7,59.28],[-137.59,59.23],[-137.54,59.12],[-137.48,58.99],[-137.52,58.92],[-137.44,58.9],[-137.28,58.99],[-137.13,59.04],[-136.94,59.11],[-136.81,59.15],[-136.58,59.15],[-136.47,59.28],[-136.47,59.46],[-136.35,59.46],[-136.28,59.48],[-136.25,59.53],[-136.32,59.6],[-136.1,59.64],[-135.93,59.66],[-135.7,59.73],[-135.48,59.79],[-135.37,59.74],[-135.26,59.7],[-135.05,59.58],[-135.04,59.55],[-135.05,59.5],[-135.07,59.44],[-134.94,59.29],[-134.91,59.27],[-134.8,59.25],[-134.68,59.2],[-134.62,59.16],[-134.44,59.09],[-134.41,59.06],[-134.39,59.01],[-134.36,58.97],[-134.33,58.94],[-134.3,58.9],[-134.22,58.85],[-134.07,58.8],[-133.97,58.76],[-133.82,58.71],[-133.67,58.6],[-133.55,58.5],[-133.4,58.41],[-133.42,58.34],[-133.28,58.22],[-133.12,58.08],[-133.0,57.95],[-132.92,57.88],[-132.82,57.77],[-132.69,57.65],[-132.55,57.5],[-132.44,57.41],[-132.3,57.28],[-132.23,57.2],[-132.28,57.15],[-132.34,57.08],[-132.16,57.05],[-132.03,57.03],[-132.06,56.95],[-132.1,56.86],[-131.96,56.82],[-131.87,56.79],[-131.89,56.74],[-131.83,56.68],[-131.82,56.59],[-131.65,56.6],[-131.58,56.6],[-131.47,56.56],[-131.34,56.5],[-131.2,56.45],[-131.08,56.4],[-130.93,56.38],[-130.74,56.34],[-130.65,56.26],[-130.48,56.23],[-130.41,56.12],[-130.21,56.08],[-130.1,56.11],[-130.06,56.07],[-130.02,56.01],[-130.01,55.95],[-130.03,55.89],[-130.07,55.84],[-130.11,55.78],[-130.14,55.72],[-130.15,55.65],[-130.14,55.59],[-130.12,55.52],[-130.06,55.41],[-130.04,55.34],[-130.04,55.3],[-130.17,55.14],[-130.22,55.06],[-130.21,55.03]],[[-155.58,19.01],[-155.63,18.96],[-155.68,18.97],[-155.88,19.07],[-155.91,19.13],[-155.89,19.38],[-155.97,19.59],[-156.05,19.75],[-155.99,19.83],[-155.91,19.89],[-155.82,20.01],[-155.89,20.17],[-155.87,20.26],[-155.83,20.28],[-155.62,20.16],[-155.2,19.99],[-155.09,19.88],[-155.07,19.75],[-154.99,19.73],[-154.95,19.64],[-154.84,19.57],[-154.8,19.52],[-154.85,19.45],[-155.05,19.32],[-155.31,19.26],[-155.54,19.11],[-155.58,19.01]],[[-156.85,20.77],[-156.91,20.74],[-156.97,20.76],[-156.99,20.83],[-157.05,20.91],[-156.94,20.93],[-156.88,20.9],[-156.85,20.88],[-156.81,20.83],[-156.85,20.77]],[[-156.49,20.93],[-156.46,20.91],[-156.35,20.94],[-156.28,20.95],[-156.15,20.89],[-156.1,20.84],[-156.02,20.79],[-155.99,20.76],[-156.01,20.71],[-156.11,20.64],[-156.23,20.63],[-156.31,20.6],[-156.41,20.61],[-156.44,20.62],[-156.45,20.71],[-156.48,20.8],[-156.54,20.79],[-156.62,20.82],[-156.69,20.9],[-156.7,20.95],[-156.66,21.02],[-156.59,21.03],[-156.53,20.99],[-156.49,20.93]],[[-157.21,21.22],[-157.0,21.19],[-156.95,21.2],[-156.92,21.18],[-156.74,21.16],[-156.71,21.16],[-156.75,21.1],[-156.86,21.06],[-157.02,21.1],[-157.29,21.11],[-157.28,21.15],[-157.25,21.18],[-157.25,21.23],[-157.21,21.22]],[[-157.8,21.46],[-157.76,21.45],[-157.72,21.46],[-157.71,21.38],[-157.65,21.33],[-157.64,21.31],[-157.69,21.28],[-157.8,21.27],[-157.85,21.29],[-157.9,21.34],[-157.96,21.33],[-157.97,21.37],[-157.98,21.38],[-158.02,21.37],[-157.98,21.32],[-158.08,21.31],[-158.11,21.32],[-158.14,21.38],[-158.24,21.49],[-158.24,21.53],[-158.27,21.59],[-158.12,21.6],[-158.02,21.69],[-157.96,21.7],[-157.85,21.55],[-157.85,21.51],[-157.83,21.47],[-157.8,21.46]],[[-160.18,21.84],[-160.2,21.8],[-160.23,21.8],[-160.24,21.84],[-160.22,21.9],[-160.16,21.94],[-160.1,22.02],[-160.05,22.0],[-160.08,21.96],[-160.08,21.91],[-160.15,21.88],[-160.18,21.84]],[[-159.37,21.93],[-159.46,21.88],[-159.51,21.9],[-159.61,21.91],[-159.65,21.95],[-159.75,21.99],[-159.79,22.04],[-159.73,22.14],[-159.58,22.22],[-159.35,22.22],[-159.3,22.15],[-159.3,22.11],[-159.33,22.05],[-159.34,21.97],[-159.37,21.93]],[[-81.78,24.54],[-81.81,24.54],[-81.81,24.56],[-81.77,24.58],[-81.74,24.58],[-81.74,24.55],[-81.78,24.54]],[[-81.57,24.6],[-81.63,24.59],[-81.58,24.63],[-81.56,24.69],[-81.53,24.64],[-81.53,24.61],[-81.57,24.6]],[[-81.33,24.65],[-81.36,24.63],[-81.38,24.64],[-81.38,24.67],[-81.42,24.73],[-81.42,24.75],[-81.32,24.69],[-81.32,24.67],[-81.33,24.65]],[[-81.04,24.72],[-81.09,24.69],[-81.14,24.71],[-81.09,24.73],[-80.93,24.76],[-80.99,24.73],[-81.04,24.72]],[[-80.83,24.8],[-80.85,24.8],[-80.84,24.82],[-80.8,24.85],[-80.79,24.84],[-80.79,24.82],[-80.83,24.8]],[[-80.64,24.9],[-80.67,24.9],[-80.63,24.94],[-80.61,24.94],[-80.64,24.9]],[[-80.38,25.14],[-80.58,24.95],[-80.56,25.0],[-80.48,25.1],[-80.46,25.15],[-80.4,25.18],[-80.35,25.23],[-80.35,25.3],[-80.28,25.34],[-80.26,25.35],[-80.38,25.14]],[[-82.04,26.45],[-82.07,26.43],[-82.14,26.45],[-82.18,26.48],[-82.2,26.55],[-82.14,26.48],[-82.12,26.46],[-82.04,26.45]],[[-82.08,26.55],[-82.09,26.49],[-82.14,26.59],[-82.17,26.7],[-82.12,26.67],[-82.08,26.55]],[[-97.17,26.16],[-97.18,26.11],[-97.27,26.33],[-97.4,26.82],[-97.41,27.1],[-97.39,27.2],[-97.35,26.8],[-97.2,26.3],[-97.17,26.16]],[[-97.35,27.3],[-97.38,27.24],[-97.38,27.33],[-97.3,27.52],[-97.13,27.78],[-97.06,27.82],[-97.25,27.54],[-97.35,27.3]],[[-80.19,27.28],[-80.17,27.2],[-80.26,27.38],[-80.38,27.64],[-80.44,27.85],[-80.4,27.79],[-80.36,27.68],[-80.19,27.28]],[[-97.01,27.9],[-97.04,27.9],[-96.99,27.98],[-96.98,28.01],[-96.9,28.12],[-96.86,28.13],[-96.84,28.09],[-96.92,28.02],[-97.01,27.9]],[[-96.76,28.15],[-96.8,28.15],[-96.76,28.2],[-96.68,28.23],[-96.52,28.33],[-96.45,28.34],[-96.42,28.38],[-96.4,28.38],[-96.41,28.34],[-96.54,28.28],[-96.76,28.15]],[[-95.04,29.15],[-95.09,29.14],[-94.87,29.29],[-94.83,29.34],[-94.77,29.34],[-94.86,29.25],[-95.04,29.15]],[[-91.79,29.5],[-91.83,29.49],[-92.0,29.57],[-92.01,29.61],[-91.93,29.64],[-91.88,29.64],[-91.8,29.6],[-91.77,29.58],[-91.75,29.57],[-91.76,29.54],[-91.79,29.5]],[[-84.91,29.64],[-85.01,29.61],[-85.12,29.63],[-85.05,29.64],[-85.0,29.63],[-84.88,29.68],[-84.81,29.72],[-84.74,29.73],[-84.91,29.64]],[[-88.89,29.71],[-88.94,29.66],[-88.94,29.68],[-88.9,29.73],[-88.87,29.75],[-88.89,29.71]],[[-88.83,29.81],[-88.86,29.78],[-88.83,29.93],[-88.87,30.06],[-88.83,30.0],[-88.81,29.93],[-88.83,29.81]],[[-89.22,30.08],[-89.22,30.04],[-89.27,30.06],[-89.34,30.06],[-89.31,30.08],[-89.29,30.09],[-89.28,30.11],[-89.18,30.17],[-89.21,30.13],[-89.22,30.08]],[[-88.56,30.22],[-88.57,30.2],[-88.66,30.23],[-88.71,30.24],[-88.72,30.26],[-88.57,30.23],[-88.56,30.22]],[[-88.07,30.25],[-88.16,30.23],[-88.29,30.23],[-88.32,30.24],[-88.26,30.25],[-88.11,30.27],[-88.07,30.25]],[[-81.42,30.97],[-81.46,30.73],[-81.48,30.81],[-81.48,30.9],[-81.45,30.95],[-81.42,30.97]],[[-118.35,32.83],[-118.41,32.82],[-118.47,32.84],[-118.53,32.94],[-118.59,33.01],[-118.56,33.03],[-118.51,32.96],[-118.38,32.85],[-118.35,32.83]],[[-119.44,33.22],[-119.48,33.22],[-119.54,33.22],[-119.58,33.28],[-119.53,33.28],[-119.48,33.27],[-119.44,33.23],[-119.44,33.22]],[[-118.35,33.39],[-118.3,33.31],[-118.37,33.32],[-118.45,33.32],[-118.47,33.36],[-118.49,33.41],[-118.51,33.43],[-118.56,33.43],[-118.56,33.44],[-118.57,33.46],[-118.55,33.48],[-118.39,33.42],[-118.35,33.39]],[[-120.04,33.92],[-120.11,33.9],[-120.17,33.92],[-120.25,34.01],[-120.07,34.03],[-119.99,33.98],[-119.98,33.97],[-120.04,33.92]],[[-120.31,34.02],[-120.36,34.02],[-120.44,34.03],[-120.41,34.06],[-120.37,34.07],[-120.35,34.06],[-120.31,34.02]],[[-119.88,34.08],[-119.68,34.03],[-119.57,34.05],[-119.55,34.03],[-119.56,34.01],[-119.81,33.97],[-119.89,33.99],[-119.89,34.03],[-119.92,34.07],[-119.88,34.08]],[[-76.55,34.65],[-76.57,34.65],[-76.61,34.66],[-76.66,34.68],[-76.67,34.7],[-76.62,34.69],[-76.55,34.65]],[[-76.5,34.64],[-76.53,34.63],[-76.44,34.76],[-76.26,34.91],[-76.21,34.94],[-76.36,34.8],[-76.5,34.64]],[[-75.78,35.19],[-75.96,35.12],[-75.98,35.12],[-75.86,35.17],[-75.78,35.19]],[[-75.54,35.24],[-75.68,35.21],[-75.69,35.22],[-75.54,35.28],[-75.49,35.48],[-75.48,35.57],[-75.5,35.74],[-75.5,35.77],[-75.48,35.72],[-75.46,35.56],[-75.46,35.45],[-75.51,35.28],[-75.54,35.24]],[[-75.64,35.86],[-75.65,35.84],[-75.72,35.95],[-75.65,35.91],[-75.64,35.88],[-75.64,35.86]],[[-75.33,37.89],[-75.38,37.87],[-75.23,38.07],[-75.14,38.24],[-75.1,38.3],[-75.14,38.18],[-75.2,38.07],[-75.33,37.89]],[[-74.13,39.68],[-74.25,39.53],[-74.25,39.56],[-74.11,39.75],[-74.13,39.68]],[[-74.19,40.52],[-74.24,40.52],[-74.19,40.61],[-74.1,40.66],[-74.07,40.65],[-74.07,40.62],[-74.08,40.59],[-74.14,40.54],[-74.19,40.52]],[[-72.51,40.99],[-72.58,40.92],[-72.52,40.91],[-72.46,40.93],[-72.41,40.97],[-72.29,41.02],[-72.18,41.05],[-72.15,41.05],[-72.1,41.02],[-72.0,41.04],[-71.9,41.06],[-72.34,40.89],[-72.43,40.88],[-72.56,40.83],[-72.68,40.79],[-72.76,40.78],[-73.19,40.65],[-73.23,40.65],[-73.27,40.66],[-73.62,40.6],[-73.77,40.59],[-73.9,40.57],[-73.8,40.62],[-73.8,40.64],[-73.82,40.66],[-73.88,40.65],[-73.93,40.6],[-74.01,40.58],[-74.03,40.64],[-74.0,40.68],[-73.96,40.73],[-73.88,40.79],[-73.76,40.83],[-73.7,40.87],[-73.65,40.84],[-73.64,40.88],[-73.61,40.91],[-73.57,40.92],[-73.49,40.92],[-73.44,40.93],[-73.41,40.94],[-73.37,40.94],[-73.28,40.92],[-73.19,40.93],[-73.11,40.96],[-73.03,40.97],[-72.83,40.97],[-72.63,40.99],[-72.54,41.03],[-72.37,41.13],[-72.27,41.15],[-72.43,41.04],[-72.51,40.99]],[[-69.98,41.27],[-70.06,41.25],[-70.23,41.29],[-70.09,41.32],[-70.06,41.33],[-70.04,41.37],[-70.04,41.4],[-69.99,41.3],[-69.98,41.27]],[[-70.51,41.38],[-70.79,41.33],[-70.83,41.36],[-70.76,41.37],[-70.67,41.45],[-70.62,41.46],[-70.53,41.41],[-70.51,41.38]],[[-71.37,41.49],[-71.39,41.47],[-71.4,41.52],[-71.38,41.57],[-71.36,41.57],[-71.35,41.54],[-71.37,41.49]],[[-71.24,41.49],[-71.29,41.46],[-71.35,41.47],[-71.32,41.51],[-71.31,41.56],[-71.28,41.62],[-71.26,41.64],[-71.23,41.65],[-71.24,41.49]],[[-68.62,44.2],[-68.66,44.18],[-68.7,44.18],[-68.7,44.23],[-68.69,44.25],[-68.68,44.26],[-68.66,44.24],[-68.62,44.2]],[[-68.19,44.33],[-68.25,44.31],[-68.31,44.32],[-68.31,44.27],[-68.32,44.25],[-68.39,44.28],[-68.41,44.29],[-68.41,44.36],[-68.35,44.43],[-68.3,44.46],[-68.24,44.44],[-68.19,44.36],[-68.19,44.33]],[[-122.85,47.2],[-122.86,47.19],[-122.88,47.19],[-122.91,47.23],[-122.91,47.25],[-122.89,47.27],[-122.85,47.22],[-122.85,47.2]],[[-122.39,47.4],[-122.4,47.37],[-122.44,47.35],[-122.46,47.36],[-122.46,47.39],[-122.47,47.39],[-122.51,47.36],[-122.51,47.42],[-122.49,47.49],[-122.47,47.49],[-122.44,47.45],[-122.39,47.4]],[[-122.5,47.59],[-122.5,47.58],[-122.56,47.6],[-122.58,47.62],[-122.57,47.67],[-122.56,47.7],[-122.55,47.7],[-122.52,47.69],[-122.51,47.68],[-122.5,47.59]],[[-122.57,48.16],[-122.52,48.03],[-122.5,48.08],[-122.37,47.99],[-122.37,47.94],[-122.38,47.92],[-122.41,47.92],[-122.44,47.93],[-122.46,47.96],[-122.49,47.98],[-122.56,47.99],[-122.59,48.03],[-122.6,48.06],[-122.61,48.13],[-122.62,48.15],[-122.66,48.16],[-122.69,48.17],[-122.74,48.23],[-122.75,48.24],[-122.72,48.28],[-122.67,48.35],[-122.63,48.38],[-122.6,48.38],[-122.57,48.36],[-122.54,48.32],[-122.54,48.29],[-122.69,48.24],[-122.7,48.23],[-122.62,48.21],[-122.6,48.2],[-122.57,48.16]],[[-122.82,48.43],[-122.84,48.42],[-122.89,48.43],[-122.92,48.46],[-122.93,48.48],[-122.91,48.54],[-122.89,48.55],[-122.87,48.55],[-122.86,48.5],[-122.81,48.45],[-122.82,48.43]],[[-123.01,48.5],[-122.99,48.47],[-123.09,48.49],[-123.14,48.51],[-123.15,48.53],[-123.17,48.59],[-123.16,48.61],[-123.11,48.61],[-123.02,48.54],[-123.01,48.5]],[[-122.78,48.67],[-122.77,48.65],[-122.81,48.63],[-122.84,48.63],[-122.88,48.66],[-122.9,48.66],[-122.89,48.61],[-122.89,48.59],[-122.99,48.63],[-123.0,48.65],[-122.98,48.68],[-122.92,48.71],[-122.9,48.71],[-122.78,48.67]],[[179.45,51.37],[179.28,51.37],[178.93,51.54],[178.75,51.59],[178.65,51.64],[178.69,51.66],[178.91,51.62],[179.08,51.53],[179.18,51.47],[179.29,51.42],[179.42,51.4],[179.45,51.37]],[[-176.29,51.79],[-176.35,51.73],[-176.4,51.76],[-176.41,51.84],[-176.38,51.86],[-176.28,51.8],[-176.29,51.79]],[[-176.01,51.81],[-176.09,51.79],[-176.2,51.83],[-176.19,51.89],[-176.07,51.84],[-176.01,51.81]],[[-177.88,51.65],[-177.9,51.62],[-177.93,51.62],[-178.06,51.67],[-178.08,51.69],[-178.0,51.72],[-177.98,51.74],[-177.99,51.76],[-178.05,51.8],[-178.15,51.85],[-178.19,51.88],[-178.17,51.9],[-178.12,51.92],[-177.95,51.92],[-177.87,51.86],[-177.8,51.84],[-177.64,51.83],[-177.72,51.8],[-177.77,51.78],[-177.83,51.69],[-177.88,51.65]],[[-177.15,51.72],[-177.18,51.7],[-177.23,51.69],[-177.38,51.7],[-177.47,51.7],[-177.58,51.69],[-177.65,51.68],[-177.67,51.7],[-177.67,51.72],[-177.33,51.78],[-177.26,51.8],[-177.21,51.84],[-177.17,51.91],[-177.13,51.93],[-177.11,51.93],[-177.06,51.9],[-177.08,51.87],[-177.12,51.84],[-177.14,51.81],[-177.15,51.72]],[[-176.59,51.87],[-176.59,51.83],[-176.47,51.84],[-176.44,51.82],[-176.44,51.75],[-176.45,51.74],[-176.47,51.73],[-176.51,51.75],[-176.56,51.71],[-176.77,51.63],[-176.84,51.68],[-176.96,51.6],[-176.87,51.79],[-176.77,51.82],[-176.74,51.84],[-176.75,51.89],[-176.7,51.99],[-176.6,51.98],[-176.55,51.94],[-176.55,51.92],[-176.59,51.87]],[[178.58,51.92],[178.51,51.9],[178.48,51.94],[178.48,51.97],[178.51,51.99],[178.57,51.98],[178.61,51.95],[178.58,51.92]],[[179.73,51.91],[179.65,51.88],[179.55,51.89],[179.5,51.93],[179.5,51.98],[179.63,52.03],[179.78,51.97],[179.73,51.91]],[[-176.02,52.0],[-176.05,51.97],[-176.14,52.0],[-176.18,52.03],[-176.18,52.06],[-176.16,52.1],[-176.08,52.1],[-176.03,52.08],[-175.99,52.05],[-175.98,52.03],[-176.02,52.0]],[[177.42,51.88],[177.33,51.84],[177.26,51.88],[177.25,51.9],[177.38,51.98],[177.48,51.99],[177.52,52.02],[177.56,52.11],[177.64,52.11],[177.67,52.1],[177.65,52.06],[177.6,51.99],[177.59,51.95],[177.42,51.88]],[[-173.55,52.14],[-173.36,52.1],[-173.11,52.1],[-173.02,52.09],[-173.02,52.08],[-173.18,52.06],[-173.23,52.07],[-173.37,52.05],[-173.46,52.04],[-173.67,52.06],[-173.84,52.05],[-173.88,52.05],[-173.93,52.07],[-173.99,52.1],[-173.99,52.12],[-173.94,52.13],[-173.79,52.1],[-173.78,52.12],[-173.66,52.14],[-173.55,52.14]],[[-172.46,52.27],[-172.54,52.26],[-172.62,52.27],[-172.58,52.33],[-172.54,52.35],[-172.47,52.39],[-172.38,52.37],[-172.31,52.33],[-172.46,52.27]],[[-174.68,52.04],[-175.21,51.99],[-175.3,52.02],[-175.21,52.04],[-175.12,52.05],[-174.92,52.09],[-174.67,52.13],[-174.47,52.18],[-174.31,52.22],[-174.26,52.27],[-174.41,52.3],[-174.44,52.32],[-174.37,52.34],[-174.31,52.38],[-174.17,52.42],[-174.05,52.37],[-174.02,52.33],[-174.03,52.29],[-174.05,52.25],[-174.16,52.22],[-174.18,52.2],[-174.12,52.14],[-174.34,52.08],[-174.68,52.04]],[[173.72,52.36],[173.66,52.36],[173.62,52.39],[173.4,52.4],[173.42,52.44],[173.52,52.45],[173.66,52.5],[173.78,52.5],[173.74,52.45],[173.72,52.36]],[[-170.73,52.58],[-170.8,52.55],[-170.82,52.56],[-170.83,52.6],[-170.79,52.63],[-170.68,52.7],[-170.61,52.69],[-170.58,52.67],[-170.59,52.64],[-170.61,52.61],[-170.65,52.59],[-170.69,52.59],[-170.73,52.58]],[[-169.69,52.85],[-169.71,52.81],[-169.72,52.79],[-169.88,52.81],[-169.98,52.81],[-169.99,52.83],[-169.98,52.85],[-169.82,52.88],[-169.75,52.88],[-169.71,52.87],[-169.69,52.85]],[[172.81,53.01],[172.98,52.98],[173.1,53.0],[173.25,52.94],[173.44,52.85],[173.39,52.83],[173.35,52.82],[173.3,52.83],[173.16,52.81],[173.08,52.81],[172.94,52.75],[172.78,52.8],[172.72,52.89],[172.6,52.91],[172.49,52.94],[172.68,53.01],[172.81,53.01]],[[-167.96,53.35],[-168.27,53.24],[-168.37,53.16],[-168.45,53.08],[-168.51,53.04],[-168.55,53.04],[-168.6,53.02],[-168.7,52.96],[-168.74,52.96],[-169.07,52.83],[-169.09,52.83],[-169.07,52.86],[-168.97,52.91],[-168.91,52.95],[-168.84,53.02],[-168.8,53.04],[-168.78,53.08],[-168.78,53.15],[-168.76,53.18],[-168.69,53.23],[-168.64,53.26],[-168.57,53.27],[-168.44,53.26],[-168.38,53.28],[-168.36,53.3],[-168.4,53.32],[-168.41,53.35],[-168.4,53.41],[-168.36,53.46],[-168.29,53.5],[-168.19,53.53],[-168.07,53.56],[-167.99,53.56],[-167.83,53.51],[-167.8,53.48],[-167.84,53.43],[-167.87,53.39],[-167.96,53.35]],[[-166.21,53.72],[-166.22,53.72],[-166.25,53.75],[-166.25,53.77],[-166.23,53.78],[-166.19,53.82],[-166.15,53.84],[-166.11,53.84],[-166.1,53.83],[-166.14,53.79],[-166.18,53.76],[-166.21,53.72]],[[-166.62,53.9],[-166.57,53.85],[-166.5,53.88],[-166.44,53.92],[-166.4,53.98],[-166.37,54.0],[-166.34,53.97],[-166.23,53.93],[-166.32,53.87],[-166.49,53.79],[-166.55,53.73],[-166.55,53.7],[-166.38,53.72],[-166.34,53.72],[-166.31,53.7],[-166.35,53.67],[-166.44,53.65],[-166.52,53.61],[-166.7,53.54],[-166.77,53.48],[-166.85,53.45],[-166.96,53.45],[-167.15,53.41],[-167.27,53.37],[-167.3,53.35],[-167.34,53.34],[-167.38,53.34],[-167.43,53.33],[-167.48,53.29],[-167.52,53.28],[-167.59,53.27],[-167.63,53.26],[-167.67,53.26],[-167.78,53.3],[-167.81,53.32],[-167.71,53.37],[-167.64,53.39],[-167.53,53.39],[-167.42,53.44],[-167.2,53.49],[-167.14,53.53],[-167.09,53.64],[-167.04,53.65],[-167.02,53.7],[-166.89,53.7],[-166.84,53.65],[-166.82,53.64],[-166.81,53.65],[-166.8,53.69],[-166.74,53.71],[-166.78,53.73],[-166.89,53.76],[-166.97,53.77],[-167.03,53.77],[-167.07,53.78],[-167.11,53.81],[-167.12,53.84],[-167.12,53.87],[-167.09,53.91],[-167.04,53.94],[-166.98,53.96],[-166.85,53.98],[-166.73,54.0],[-166.67,54.01],[-166.63,54.0],[-166.62,53.9]],[[-165.84,54.07],[-165.88,54.05],[-165.91,54.05],[-165.93,54.06],[-166.04,54.05],[-166.06,54.05],[-166.1,54.11],[-166.11,54.14],[-166.09,54.17],[-166.04,54.19],[-165.97,54.21],[-165.89,54.21],[-165.76,54.15],[-165.7,54.12],[-165.69,54.1],[-165.74,54.08],[-165.84,54.07]],[[-165.56,54.14],[-165.6,54.13],[-165.62,54.14],[-165.62,54.18],[-165.65,54.25],[-165.59,54.28],[-165.55,54.28],[-165.53,54.27],[-165.49,54.22],[-165.44,54.21],[-165.41,54.2],[-165.47,54.18],[-165.56,54.14]],[[-162.55,54.4],[-162.64,54.38],[-162.73,54.4],[-162.81,54.44],[-162.82,54.49],[-162.65,54.46],[-162.61,54.45],[-162.55,54.4]],[[-162.3,54.85],[-162.32,54.84],[-162.39,54.87],[-162.42,54.9],[-162.43,54.93],[-162.29,54.98],[-162.26,54.98],[-162.24,54.95],[-162.23,54.93],[-162.27,54.87],[-162.3,54.85]],[[-163.48,54.98],[-163.38,54.82],[-163.34,54.78],[-163.27,54.77],[-163.19,54.75],[-163.14,54.72],[-163.09,54.69],[-163.08,54.67],[-163.36,54.74],[-163.53,54.64],[-163.58,54.63],[-164.07,54.62],[-164.17,54.6],[-164.23,54.57],[-164.35,54.48],[-164.4,54.45],[-164.46,54.43],[-164.59,54.4],[-164.74,54.41],[-164.82,54.42],[-164.87,54.46],[-164.9,54.54],[-164.9,54.57],[-164.89,54.61],[-164.75,54.66],[-164.71,54.69],[-164.53,54.88],[-164.48,54.91],[-164.42,54.91],[-164.27,54.9],[-164.15,54.96],[-163.87,55.04],[-163.81,55.05],[-163.61,55.05],[-163.55,55.04],[-163.51,55.01],[-163.48,54.98]],[[-159.36,54.97],[-159.39,54.97],[-159.42,54.98],[-159.46,55.03],[-159.46,55.06],[-159.39,55.04],[-159.36,55.0],[-159.36,54.97]],[[-159.52,55.15],[-159.52,55.07],[-159.53,55.06],[-159.56,55.08],[-159.62,55.06],[-159.65,55.07],[-159.64,55.1],[-159.64,55.12],[-159.6,55.13],[-159.59,55.17],[-159.6,55.18],[-159.57,55.22],[-159.55,55.23],[-159.52,55.15]],[[-131.34,55.08],[-131.24,54.95],[-131.23,54.9],[-131.33,54.89],[-131.41,54.89],[-131.45,54.91],[-131.46,54.93],[-131.43,55.0],[-131.48,55.04],[-131.54,55.05],[-131.59,55.03],[-131.6,55.09],[-131.56,55.14],[-131.58,55.2],[-131.58,55.25],[-131.57,55.26],[-131.51,55.26],[-131.4,55.21],[-131.34,55.08]],[[-159.87,55.13],[-159.93,55.11],[-159.95,55.08],[-160.0,55.07],[-160.04,55.04],[-160.17,54.94],[-160.23,54.92],[-160.16,55.01],[-160.15,55.04],[-160.15,55.06],[-160.17,55.12],[-160.13,55.12],[-160.1,55.13],[-160.04,55.19],[-159.98,55.2],[-159.92,55.27],[-159.89,55.27],[-159.87,55.26],[-159.9,55.22],[-159.84,55.18],[-159.85,55.14],[-159.87,55.13]],[[-132.86,54.89],[-132.84,54.88],[-132.81,54.89],[-132.77,54.93],[-132.7,54.92],[-132.65,54.91],[-132.62,54.89],[-132.63,54.84],[-132.65,54.76],[-132.68,54.73],[-132.71,54.68],[-132.81,54.71],[-132.89,54.76],[-133.01,54.85],[-133.08,54.92],[-133.08,54.95],[-133.12,54.97],[-133.2,55.08],[-133.25,55.18],[-133.32,55.19],[-133.42,55.21],[-133.45,55.26],[-133.43,55.3],[-133.3,55.33],[-133.1,55.21],[-133.07,55.17],[-133.0,55.11],[-132.98,55.03],[-132.95,55.0],[-132.86,54.89]],[[-160.33,55.34],[-160.34,55.26],[-160.48,55.31],[-160.52,55.33],[-160.49,55.35],[-160.36,55.36],[-160.33,55.34]],[[-160.68,55.31],[-160.67,55.31],[-160.64,55.32],[-160.57,55.38],[-160.55,55.38],[-160.55,55.36],[-160.58,55.31],[-160.53,55.23],[-160.48,55.2],[-160.49,55.18],[-160.61,55.16],[-160.7,55.18],[-160.75,55.17],[-160.8,55.15],[-160.83,55.17],[-160.85,55.31],[-160.84,55.34],[-160.79,55.38],[-160.72,55.4],[-160.7,55.4],[-160.67,55.38],[-160.67,55.36],[-160.68,55.31]],[[-133.31,55.54],[-133.28,55.52],[-133.28,55.5],[-133.43,55.43],[-133.43,55.42],[-133.46,55.38],[-133.49,55.36],[-133.55,55.32],[-133.65,55.27],[-133.64,55.41],[-133.74,55.5],[-133.63,55.54],[-133.57,55.53],[-133.45,55.52],[-133.35,55.56],[-133.31,55.54]],[[-155.57,55.82],[-155.6,55.79],[-155.68,55.79],[-155.72,55.8],[-155.74,55.83],[-155.62,55.91],[-155.59,55.92],[-155.57,55.92],[-155.56,55.89],[-155.57,55.82]],[[-130.98,55.49],[-131.01,55.38],[-131.08,55.27],[-131.19,55.21],[-131.26,55.22],[-131.32,55.27],[-131.37,55.27],[-131.42,55.28],[-131.45,55.32],[-131.42,55.37],[-131.45,55.41],[-131.47,55.37],[-131.52,55.34],[-131.64,55.3],[-131.72,55.22],[-131.76,55.17],[-131.81,55.22],[-131.84,55.36],[-131.85,55.42],[-131.76,55.5],[-131.65,55.59],[-131.62,55.83],[-131.27,55.96],[-131.24,55.95],[-131.12,55.86],[-131.0,55.73],[-130.97,55.67],[-130.97,55.57],[-130.98,55.49]],[[-133.57,56.34],[-133.38,56.32],[-133.2,56.32],[-133.14,56.28],[-133.1,56.24],[-133.08,56.19],[-133.08,56.16],[-133.08,56.13],[-133.1,56.1],[-133.1,56.09],[-132.76,56.0],[-132.6,55.9],[-132.53,55.84],[-132.5,55.8],[-132.43,55.69],[-132.29,55.56],[-132.21,55.52],[-132.17,55.48],[-132.2,55.48],[-132.3,55.51],[-132.51,55.59],[-132.53,55.59],[-132.55,55.54],[-132.58,55.5],[-132.63,55.47],[-132.59,55.46],[-132.42,55.48],[-132.27,55.4],[-132.22,55.38],[-132.16,55.32],[-132.16,55.3],[-132.19,55.25],[-132.21,55.24],[-132.21,55.22],[-132.17,55.22],[-132.01,55.23],[-131.98,55.21],[-132.0,55.03],[-131.98,54.97],[-131.98,54.94],[-132.0,54.9],[-132.0,54.87],[-131.98,54.83],[-131.98,54.8],[-132.02,54.73],[-132.06,54.71],[-132.13,54.71],[-132.19,54.73],[-132.27,54.8],[-132.34,54.91],[-132.37,54.92],[-132.47,54.94],[-132.49,54.95],[-132.55,54.95],[-132.59,55.0],[-132.59,55.05],[-132.63,55.11],[-132.62,55.14],[-132.67,55.15],[-132.7,55.13],[-132.68,55.07],[-132.7,55.03],[-132.78,55.05],[-132.91,55.19],[-133.06,55.3],[-133.12,55.33],[-133.1,55.36],[-133.03,55.38],[-132.97,55.38],[-132.96,55.4],[-133.08,55.5],[-133.08,55.53],[-133.03,55.59],[-133.09,55.61],[-133.24,55.6],[-133.3,55.61],[-133.34,55.65],[-133.37,55.69],[-133.5,55.7],[-133.55,55.69],[-133.64,55.75],[-133.68,55.79],[-133.66,55.8],[-133.58,55.84],[-133.54,55.83],[-133.45,55.8],[-133.41,55.8],[-133.32,55.84],[-133.31,55.89],[-133.24,55.92],[-133.25,55.96],[-133.29,56.02],[-133.37,56.04],[-133.54,56.0],[-133.68,55.94],[-133.74,55.96],[-133.76,56.0],[-133.6,56.09],[-133.53,56.15],[-133.54,56.18],[-133.59,56.22],[-133.6,56.32],[-133.57,56.34]],[[-132.78,56.25],[-132.83,56.24],[-132.89,56.26],[-133.04,56.34],[-133.04,56.36],[-133.02,56.39],[-132.94,56.44],[-132.9,56.45],[-132.71,56.45],[-132.64,56.44],[-132.63,56.41],[-132.63,56.39],[-132.65,56.36],[-132.66,56.34],[-132.65,56.31],[-132.67,56.29],[-132.78,56.25]],[[-132.11,56.11],[-132.13,55.94],[-132.17,55.95],[-132.21,55.95],[-132.29,55.93],[-132.37,55.94],[-132.41,55.96],[-132.42,55.98],[-132.41,56.03],[-132.45,56.06],[-132.6,56.07],[-132.66,56.08],[-132.69,56.13],[-132.7,56.2],[-132.68,56.22],[-132.6,56.24],[-132.54,56.32],[-132.51,56.34],[-132.38,56.5],[-132.32,56.49],[-132.21,56.39],[-132.07,56.24],[-132.11,56.11]],[[-154.68,56.44],[-154.75,56.41],[-154.77,56.42],[-154.78,56.44],[-154.76,56.47],[-154.73,56.5],[-154.62,56.56],[-154.52,56.6],[-154.46,56.6],[-154.44,56.57],[-154.51,56.52],[-154.68,56.44]],[[-154.21,56.51],[-154.26,56.51],[-154.33,56.54],[-154.32,56.57],[-154.22,56.61],[-154.11,56.6],[-154.1,56.58],[-154.11,56.56],[-154.12,56.54],[-154.15,56.53],[-154.21,56.51]],[[-169.76,56.64],[-169.62,56.62],[-169.55,56.63],[-169.49,56.62],[-169.47,56.59],[-169.59,56.54],[-169.63,56.55],[-169.77,56.61],[-169.76,56.64]],[[-132.75,56.53],[-132.76,56.51],[-132.88,56.51],[-132.93,56.52],[-132.95,56.57],[-132.94,56.61],[-132.91,56.64],[-132.87,56.7],[-132.84,56.79],[-132.66,56.68],[-132.6,56.64],[-132.57,56.58],[-132.63,56.55],[-132.71,56.54],[-132.75,56.53]],[[-133.99,56.84],[-133.92,56.78],[-133.83,56.78],[-133.78,56.73],[-133.74,56.65],[-133.77,56.6],[-133.81,56.61],[-133.86,56.58],[-133.88,56.49],[-133.87,56.39],[-133.88,56.29],[-133.94,56.19],[-133.95,56.13],[-133.97,56.11],[-133.99,56.1],[-134.02,56.12],[-134.07,56.13],[-134.12,56.08],[-134.19,56.08],[-134.25,56.2],[-134.2,56.41],[-134.08,56.46],[-134.15,56.51],[-134.29,56.58],[-134.28,56.62],[-134.38,56.72],[-134.39,56.75],[-134.37,56.84],[-134.27,56.92],[-134.14,56.93],[-134.05,56.9],[-134.0,56.87],[-133.99,56.84]],[[-133.37,57.0],[-133.3,56.97],[-133.26,57.0],[-133.2,57.0],[-133.07,56.97],[-133.0,56.93],[-132.95,56.88],[-132.95,56.85],[-132.96,56.78],[-132.95,56.71],[-132.96,56.68],[-132.98,56.65],[-133.0,56.62],[-133.03,56.62],[-133.13,56.68],[-133.24,56.8],[-133.33,56.83],[-133.33,56.82],[-133.31,56.79],[-133.24,56.73],[-133.23,56.69],[-133.18,56.64],[-133.16,56.61],[-133.14,56.57],[-133.14,56.53],[-133.16,56.5],[-133.18,56.47],[-133.21,56.46],[-133.38,56.47],[-133.48,56.45],[-133.6,56.46],[-133.63,56.48],[-133.65,56.52],[-133.66,56.6],[-133.69,56.71],[-133.68,56.8],[-133.76,56.88],[-133.82,56.92],[-133.92,56.97],[-133.98,57.01],[-133.96,57.04],[-133.87,57.07],[-133.71,57.06],[-133.37,57.0]],[[-153.01,57.12],[-153.13,57.09],[-153.16,57.09],[-153.24,57.03],[-153.3,57.0],[-153.37,57.05],[-153.35,57.13],[-153.29,57.19],[-152.94,57.17],[-152.91,57.15],[-152.91,57.14],[-152.93,57.13],[-153.01,57.12]],[[-170.16,57.18],[-170.26,57.14],[-170.36,57.15],[-170.39,57.19],[-170.39,57.2],[-170.12,57.24],[-170.16,57.18]],[[-134.97,57.35],[-134.88,57.24],[-134.82,57.16],[-134.77,57.05],[-134.68,56.84],[-134.63,56.76],[-134.62,56.72],[-134.61,56.6],[-134.62,56.58],[-134.65,56.56],[-134.66,56.52],[-134.63,56.44],[-134.63,56.3],[-134.65,56.23],[-134.68,56.22],[-134.75,56.24],[-134.81,56.28],[-134.85,56.32],[-134.95,56.46],[-134.98,56.52],[-134.98,56.56],[-134.97,56.6],[-134.93,56.62],[-134.88,56.67],[-134.88,56.68],[-134.93,56.67],[-135.02,56.66],[-135.1,56.7],[-135.16,56.73],[-135.15,56.8],[-135.16,56.82],[-135.28,56.8],[-135.33,56.82],[-135.34,56.85],[-135.34,56.89],[-135.32,56.93],[-135.2,57.03],[-135.21,57.04],[-135.27,57.05],[-135.34,57.08],[-135.38,57.19],[-135.45,57.25],[-135.5,57.24],[-135.61,57.07],[-135.66,57.03],[-135.81,57.01],[-135.78,57.06],[-135.77,57.1],[-135.82,57.23],[-135.82,57.28],[-135.79,57.32],[-135.68,57.33],[-135.62,57.35],[-135.58,57.39],[-135.57,57.42],[-135.49,57.52],[-135.45,57.53],[-135.35,57.53],[-135.13,57.43],[-135.07,57.42],[-134.97,57.35]],[[-153.24,57.85],[-153.27,57.82],[-153.29,57.83],[-153.35,57.86],[-153.47,57.91],[-153.52,57.94],[-153.52,57.96],[-153.48,57.97],[-153.35,57.93],[-153.29,57.9],[-153.24,57.85]],[[-152.9,57.82],[-152.89,57.77],[-152.85,57.78],[-152.7,57.83],[-152.62,57.85],[-152.51,57.85],[-152.43,57.83],[-152.41,57.81],[-152.42,57.78],[-152.49,57.73],[-152.48,57.7],[-152.41,57.65],[-152.24,57.61],[-152.22,57.6],[-152.22,57.58],[-152.34,57.48],[-152.38,57.46],[-152.41,57.45],[-152.63,57.47],[-152.83,57.5],[-152.91,57.51],[-152.94,57.5],[-153.0,57.47],[-152.96,57.46],[-152.78,57.45],[-152.72,57.41],[-152.69,57.38],[-152.68,57.35],[-152.71,57.33],[-152.79,57.32],[-152.88,57.32],[-152.99,57.28],[-153.05,57.24],[-153.27,57.23],[-153.44,57.17],[-153.5,57.14],[-153.52,57.1],[-153.59,57.08],[-153.73,57.05],[-153.65,57.03],[-153.63,57.01],[-153.63,56.98],[-153.64,56.96],[-153.76,56.86],[-153.97,56.77],[-154.03,56.78],[-154.05,56.79],[-154.07,56.8],[-154.07,56.82],[-153.79,56.99],[-153.8,57.0],[-153.88,57.0],[-154.0,57.05],[-154.08,57.02],[-154.1,57.02],[-154.08,57.06],[-154.03,57.11],[-154.04,57.12],[-154.07,57.13],[-154.13,57.14],[-154.24,57.14],[-154.32,57.13],[-154.38,57.11],[-154.38,57.1],[-154.27,57.1],[-154.24,57.09],[-154.21,57.06],[-154.19,57.04],[-154.18,57.01],[-154.21,56.96],[-154.26,56.91],[-154.34,56.92],[-154.5,57.04],[-154.57,57.21],[-154.71,57.34],[-154.71,57.37],[-154.67,57.45],[-154.54,57.56],[-154.39,57.59],[-154.28,57.64],[-154.18,57.65],[-154.12,57.65],[-154.03,57.63],[-154.0,57.59],[-154.02,57.57],[-154.01,57.56],[-153.95,57.53],[-153.88,57.44],[-153.81,57.36],[-153.75,57.33],[-153.69,57.31],[-153.76,57.37],[-153.8,57.44],[-153.82,57.6],[-153.84,57.64],[-153.8,57.65],[-153.69,57.64],[-153.69,57.66],[-153.81,57.71],[-153.88,57.76],[-153.91,57.79],[-153.9,57.82],[-153.84,57.86],[-153.81,57.88],[-153.77,57.88],[-153.7,57.87],[-153.66,57.86],[-153.57,57.76],[-153.52,57.73],[-153.49,57.73],[-153.45,57.75],[-153.42,57.78],[-153.39,57.8],[-153.36,57.8],[-153.25,57.79],[-153.22,57.8],[-153.2,57.82],[-153.2,57.86],[-153.18,57.88],[-153.17,57.91],[-153.23,57.96],[-153.16,57.97],[-152.94,57.94],[-152.85,57.9],[-152.9,57.82]],[[-135.73,58.24],[-135.59,58.15],[-135.59,58.12],[-135.62,58.06],[-135.69,58.04],[-135.67,58.01],[-135.61,57.99],[-135.57,58.01],[-135.42,58.1],[-135.37,58.12],[-135.35,58.12],[-135.16,58.1],[-135.0,58.05],[-134.95,58.02],[-134.93,57.95],[-134.97,57.82],[-135.1,57.79],[-135.16,57.8],[-135.23,57.82],[-135.34,57.77],[-135.25,57.73],[-134.98,57.72],[-134.9,57.65],[-134.87,57.59],[-134.93,57.48],[-135.08,57.51],[-135.22,57.57],[-135.5,57.66],[-135.56,57.67],[-135.61,57.65],[-135.62,57.6],[-135.62,57.48],[-135.69,57.42],[-135.91,57.45],[-136.0,57.53],[-136.08,57.67],[-136.38,57.84],[-136.46,57.87],[-136.57,57.97],[-136.53,58.05],[-136.51,58.1],[-136.45,58.11],[-136.37,58.14],[-136.32,58.22],[-136.25,58.16],[-136.14,58.1],[-136.14,58.15],[-136.09,58.2],[-135.99,58.2],[-135.95,58.21],[-135.88,58.25],[-135.79,58.27],[-135.73,58.24]],[[-134.31,58.23],[-134.32,58.2],[-134.46,58.21],[-134.59,58.24],[-134.66,58.29],[-134.65,58.31],[-134.52,58.33],[-134.4,58.29],[-134.31,58.23]],[[-134.68,58.16],[-134.43,58.14],[-134.24,58.14],[-134.07,57.99],[-133.97,57.87],[-133.9,57.79],[-133.87,57.71],[-133.82,57.63],[-133.83,57.62],[-133.93,57.67],[-134.0,57.78],[-134.03,57.82],[-134.07,57.84],[-134.1,57.88],[-134.18,57.98],[-134.18,58.01],[-134.21,58.04],[-134.25,58.05],[-134.29,58.04],[-134.31,58.03],[-134.3,57.96],[-134.27,57.88],[-134.08,57.71],[-133.96,57.61],[-133.94,57.58],[-133.92,57.49],[-133.97,57.45],[-133.91,57.37],[-133.91,57.35],[-133.93,57.34],[-134.1,57.3],[-134.26,57.15],[-134.44,57.06],[-134.52,57.04],[-134.55,57.06],[-134.59,57.09],[-134.61,57.14],[-134.62,57.2],[-134.58,57.23],[-134.49,57.42],[-134.49,57.48],[-134.59,57.57],[-134.66,57.64],[-134.7,57.74],[-134.75,58.0],[-134.78,58.08],[-134.82,58.15],[-134.87,58.2],[-134.91,58.26],[-134.93,58.33],[-134.92,58.35],[-134.84,58.32],[-134.73,58.22],[-134.68,58.16]],[[-152.42,58.36],[-152.38,58.35],[-152.34,58.41],[-152.32,58.41],[-152.2,58.36],[-152.13,58.37],[-152.08,58.31],[-152.04,58.31],[-152.0,58.31],[-151.97,58.31],[-151.98,58.24],[-152.07,58.18],[-152.11,58.16],[-152.17,58.18],[-152.19,58.18],[-152.22,58.21],[-152.25,58.25],[-152.27,58.25],[-152.33,58.21],[-152.33,58.19],[-152.31,58.15],[-152.31,58.13],[-152.38,58.12],[-152.45,58.13],[-152.54,58.1],[-152.56,58.12],[-152.57,58.17],[-152.6,58.16],[-152.64,58.1],[-152.68,58.06],[-152.76,58.03],[-152.78,58.02],[-152.84,58.01],[-152.93,57.99],[-152.98,58.0],[-153.31,58.06],[-153.38,58.09],[-153.12,58.24],[-152.98,58.3],[-152.9,58.29],[-152.81,58.28],[-152.77,58.28],[-152.77,58.35],[-152.84,58.4],[-152.84,58.42],[-152.67,58.45],[-152.61,58.45],[-152.54,58.43],[-152.48,58.4],[-152.42,58.36]],[[-152.49,58.49],[-152.52,58.48],[-152.59,58.51],[-152.64,58.54],[-152.6,58.57],[-152.46,58.62],[-152.4,58.62],[-152.37,58.61],[-152.36,58.59],[-152.36,58.57],[-152.39,58.54],[-152.49,58.49]],[[-160.92,58.58],[-160.99,58.56],[-161.07,58.57],[-161.13,58.67],[-161.08,58.67],[-160.99,58.74],[-160.77,58.79],[-160.72,58.8],[-160.92,58.58]],[[-144.57,59.82],[-144.61,59.81],[-144.54,59.88],[-144.44,59.95],[-144.35,60.0],[-144.24,60.02],[-144.25,59.98],[-144.4,59.92],[-144.57,59.82]],[[-148.02,60.07],[-148.07,60.03],[-148.27,60.05],[-148.23,60.11],[-148.08,60.15],[-147.91,60.09],[-148.02,60.07]],[[-147.74,59.81],[-147.85,59.8],[-147.87,59.83],[-147.81,59.9],[-147.77,59.94],[-147.73,59.95],[-147.61,60.04],[-147.47,60.1],[-147.34,60.19],[-147.21,60.31],[-147.18,60.36],[-147.12,60.36],[-147.02,60.33],[-146.96,60.29],[-146.99,60.25],[-147.32,60.08],[-147.35,60.05],[-147.38,59.99],[-147.4,59.97],[-147.45,59.96],[-147.48,59.93],[-147.5,59.89],[-147.54,59.87],[-147.6,59.87],[-147.64,59.85],[-147.67,59.83],[-147.74,59.81]],[[-166.14,60.38],[-166.04,60.33],[-165.99,60.33],[-165.84,60.35],[-165.78,60.34],[-165.73,60.31],[-165.7,60.28],[-165.69,60.22],[-165.71,60.17],[-165.71,60.1],[-165.71,60.07],[-165.63,60.03],[-165.61,59.97],[-165.59,59.91],[-165.77,59.89],[-165.95,59.89],[-166.1,59.85],[-166.13,59.82],[-166.11,59.78],[-166.15,59.76],[-166.19,59.77],[-166.26,59.81],[-166.34,59.83],[-166.63,59.86],[-166.99,59.98],[-167.14,60.01],[-167.3,60.1],[-167.44,60.21],[-167.34,60.22],[-167.25,60.23],[-166.84,60.22],[-166.78,60.3],[-166.73,60.32],[-166.6,60.34],[-166.48,60.38],[-166.42,60.38],[-166.36,60.36],[-166.25,60.39],[-166.18,60.4],[-166.14,60.38]],[[-145.12,60.34],[-145.15,60.31],[-145.24,60.32],[-145.28,60.34],[-145.13,60.4],[-145.1,60.39],[-145.12,60.34]],[[-146.39,60.45],[-146.37,60.42],[-146.18,60.43],[-146.12,60.42],[-146.1,60.41],[-146.13,60.39],[-146.2,60.37],[-146.42,60.33],[-146.6,60.27],[-146.62,60.27],[-146.65,60.34],[-146.68,60.36],[-146.7,60.4],[-146.7,60.41],[-146.67,60.43],[-146.61,60.47],[-146.56,60.48],[-146.39,60.45]],[[-147.66,60.45],[-147.66,60.42],[-147.69,60.4],[-147.66,60.35],[-147.71,60.27],[-147.73,60.22],[-147.76,60.19],[-147.79,60.18],[-147.82,60.19],[-147.82,60.2],[-147.81,60.23],[-147.87,60.23],[-147.89,60.3],[-147.85,60.32],[-147.84,60.35],[-147.84,60.37],[-147.79,60.46],[-147.78,60.47],[-147.77,60.44],[-147.76,60.44],[-147.74,60.45],[-147.7,60.49],[-147.69,60.49],[-147.66,60.45]],[[-152.02,60.36],[-152.07,60.36],[-152.0,60.41],[-151.96,60.5],[-151.9,60.49],[-151.89,60.47],[-151.99,60.37],[-152.02,60.36]],[[-172.74,60.46],[-172.53,60.39],[-172.39,60.4],[-172.28,60.34],[-172.23,60.3],[-172.4,60.33],[-172.64,60.33],[-172.96,60.46],[-173.07,60.49],[-173.05,60.57],[-172.92,60.61],[-172.86,60.51],[-172.74,60.46]],[[-147.93,60.83],[-148.06,60.82],[-148.12,60.83],[-148.12,60.84],[-148.1,60.89],[-148.1,60.92],[-148.04,60.92],[-147.96,60.9],[-147.94,60.88],[-147.93,60.83]],[[-171.46,63.64],[-171.45,63.62],[-171.34,63.62],[-171.2,63.61],[-171.03,63.59],[-170.87,63.59],[-170.67,63.67],[-170.55,63.69],[-170.43,63.7],[-170.3,63.68],[-170.17,63.64],[-170.12,63.62],[-170.08,63.58],[-170.06,63.53],[-170.02,63.49],[-169.78,63.45],[-169.62,63.43],[-169.59,63.41],[-169.55,63.37],[-169.43,63.35],[-169.3,63.36],[-169.22,63.35],[-169.0,63.35],[-168.72,63.31],[-168.76,63.21],[-168.85,63.17],[-169.11,63.18],[-169.36,63.17],[-169.47,63.12],[-169.56,63.06],[-169.57,63.0],[-169.62,62.97],[-169.68,62.96],[-169.72,62.99],[-169.78,63.09],[-169.82,63.12],[-169.86,63.14],[-169.99,63.17],[-170.12,63.19],[-170.19,63.2],[-170.24,63.23],[-170.27,63.28],[-170.32,63.31],[-170.42,63.35],[-170.53,63.38],[-170.85,63.44],[-170.95,63.45],[-171.06,63.45],[-171.18,63.42],[-171.29,63.37],[-171.4,63.34],[-171.52,63.33],[-171.63,63.35],[-171.74,63.39],[-171.79,63.42],[-171.82,63.48],[-171.82,63.53],[-171.8,63.58],[-171.75,63.7],[-171.65,63.73],[-171.46,63.64]],[[-166.11,66.23],[-166.15,66.22],[-166.15,66.24],[-166.03,66.28],[-165.82,66.33],[-165.83,66.32],[-165.94,66.28],[-166.11,66.23]]]},{"n":"Uzbekistan","r":[[[67.76,37.17],[67.75,37.2],[67.7,37.23],[67.61,37.22],[67.55,37.24],[67.52,37.27],[67.44,37.26],[67.32,37.21],[67.2,37.24],[67.07,37.33],[66.83,37.37],[66.52,37.35],[66.51,37.46],[66.51,37.6],[66.53,37.79],[66.63,37.93],[66.63,37.96],[66.61,37.99],[66.57,38.01],[66.39,38.05],[66.34,38.07],[66.26,38.12],[66.17,38.17],[66.09,38.2],[65.97,38.24],[65.86,38.27],[65.79,38.25],[65.73,38.23],[65.67,38.23],[65.61,38.24],[65.4,38.35],[65.08,38.54],[64.82,38.67],[64.66,38.74],[64.62,38.76],[64.53,38.82],[64.31,38.98],[64.16,38.95],[63.95,39.06],[63.76,39.16],[63.72,39.19],[63.51,39.38],[63.29,39.5],[63.06,39.63],[62.91,39.72],[62.65,39.86],[62.53,39.94],[62.48,39.98],[62.44,40.04],[62.38,40.33],[62.3,40.47],[62.19,40.54],[62.1,40.68],[62.02,40.89],[61.95,41.03],[61.9,41.09],[61.8,41.16],[61.64,41.24],[61.5,41.28],[61.44,41.27],[61.42,41.27],[61.39,41.25],[61.33,41.2],[61.24,41.19],[61.18,41.19],[61.12,41.21],[60.93,41.23],[60.87,41.25],[60.75,41.25],[60.51,41.22],[60.45,41.22],[60.2,41.35],[60.09,41.4],[60.07,41.43],[60.07,41.48],[60.11,41.55],[60.14,41.59],[60.12,41.64],[60.08,41.7],[60.08,41.76],[60.11,41.79],[60.18,41.78],[60.2,41.8],[60.19,41.83],[60.16,41.86],[60.11,41.91],[59.96,41.95],[59.94,41.97],[59.95,42.0],[59.97,42.02],[59.98,42.07],[59.98,42.13],[60.0,42.16],[60.01,42.19],[59.99,42.21],[59.94,42.24],[59.86,42.3],[59.76,42.3],[59.45,42.3],[59.35,42.32],[59.28,42.36],[59.2,42.48],[59.16,42.51],[59.12,42.52],[59.04,42.53],[58.93,42.54],[58.88,42.56],[58.73,42.68],[58.59,42.78],[58.53,42.68],[58.48,42.66],[58.35,42.67],[58.26,42.69],[58.21,42.67],[58.15,42.63],[58.16,42.6],[58.2,42.58],[58.29,42.53],[58.42,42.41],[58.48,42.34],[58.49,42.32],[58.47,42.3],[58.46,42.29],[58.43,42.29],[58.4,42.29],[58.38,42.31],[58.37,42.35],[58.33,42.4],[58.28,42.43],[58.23,42.45],[58.17,42.46],[58.08,42.49],[58.03,42.49],[57.98,42.46],[57.95,42.42],[57.92,42.34],[57.86,42.23],[57.81,42.19],[57.69,42.16],[57.38,42.16],[57.29,42.12],[57.23,42.08],[57.11,41.96],[57.03,41.91],[56.96,41.86],[56.98,41.67],[57.02,41.45],[57.08,41.39],[57.11,41.37],[57.12,41.35],[57.09,41.33],[57.06,41.31],[57.02,41.26],[56.97,41.27],[56.86,41.28],[56.77,41.29],[56.48,41.3],[56.24,41.31],[55.98,41.32],[55.98,41.55],[55.98,41.78],[55.98,42.01],[55.98,42.24],[55.98,42.47],[55.98,42.7],[55.98,42.93],[55.98,43.16],[55.98,43.39],[55.98,43.62],[55.98,43.85],[55.98,44.08],[55.98,44.31],[55.98,44.54],[55.98,44.77],[55.98,44.99],[56.1,45.02],[56.26,45.06],[56.41,45.09],[56.59,45.13],[56.79,45.18],[56.97,45.22],[57.17,45.27],[57.33,45.3],[57.48,45.34],[57.67,45.38],[57.96,45.44],[58.13,45.47],[58.29,45.51],[58.45,45.54],[58.56,45.56],[58.67,45.51],[58.81,45.44],[58.95,45.38],[59.08,45.31],[59.22,45.24],[59.36,45.18],[59.5,45.11],[59.64,45.05],[59.77,44.98],[59.91,44.92],[60.05,44.85],[60.19,44.78],[60.33,44.72],[60.46,44.65],[60.6,44.59],[60.74,44.52],[60.88,44.46],[61.01,44.39],[61.07,44.35],[61.1,44.25],[61.16,44.17],[61.27,44.08],[61.39,43.99],[61.53,43.88],[61.62,43.8],[61.72,43.71],[61.89,43.58],[61.99,43.49],[62.07,43.49],[62.24,43.51],[62.46,43.54],[62.63,43.56],[62.85,43.58],[63.05,43.61],[63.21,43.63],[63.44,43.61],[63.68,43.6],[63.85,43.59],[64.01,43.58],[64.21,43.57],[64.32,43.56],[64.44,43.55],[64.5,43.57],[64.6,43.61],[64.71,43.65],[64.81,43.69],[64.91,43.71],[65.0,43.65],[65.08,43.57],[65.17,43.49],[65.27,43.42],[65.37,43.37],[65.5,43.31],[65.57,43.21],[65.67,43.06],[65.74,42.97],[65.8,42.88],[65.9,42.91],[66.01,42.95],[66.1,42.99],[66.09,42.87],[66.08,42.77],[66.06,42.61],[66.05,42.47],[66.02,42.31],[66.01,42.19],[66.01,42.09],[66.01,42.0],[66.19,42.0],[66.33,42.0],[66.5,41.99],[66.52,41.89],[66.54,41.74],[66.57,41.61],[66.6,41.49],[66.65,41.35],[66.67,41.27],[66.71,41.18],[66.75,41.16],[66.81,41.14],[67.04,41.15],[67.22,41.16],[67.37,41.17],[67.53,41.18],[67.74,41.19],[67.81,41.16],[67.87,41.18],[67.94,41.2],[67.99,41.13],[68.02,41.1],[68.06,41.06],[68.11,41.03],[68.09,40.96],[68.06,40.86],[68.05,40.81],[68.11,40.75],[68.16,40.72],[68.29,40.66],[68.42,40.62],[68.5,40.61],[68.57,40.62],[68.6,40.66],[68.59,40.71],[68.56,40.77],[68.56,40.83],[68.58,40.88],[68.66,40.96],[68.74,41.04],[68.85,41.12],[68.99,41.21],[69.04,41.26],[69.06,41.37],[69.15,41.43],[69.25,41.46],[69.37,41.49],[69.4,41.54],[69.57,41.63],[69.66,41.67],[69.79,41.7],[69.96,41.75],[70.1,41.82],[70.23,41.95],[70.33,42.03],[70.42,42.08],[70.49,42.08],[70.54,42.04],[70.58,42.04],[70.61,42.05],[70.66,42.11],[70.72,42.17],[70.76,42.19],[70.86,42.21],[70.95,42.25],[70.98,42.27],[71.04,42.28],[71.13,42.25],[71.21,42.21],[71.23,42.19],[71.23,42.16],[71.03,42.08],[70.91,42.04],[70.86,42.03],[70.84,42.02],[70.8,41.92],[70.73,41.91],[70.63,41.88],[70.56,41.83],[70.45,41.73],[70.18,41.57],[70.18,41.54],[70.2,41.51],[70.29,41.5],[70.41,41.45],[70.47,41.41],[70.65,41.46],[70.69,41.45],[70.73,41.4],[70.78,41.26],[70.86,41.22],[70.96,41.2],[71.03,41.19],[71.11,41.15],[71.22,41.14],[71.3,41.15],[71.39,41.12],[71.41,41.14],[71.42,41.34],[71.5,41.31],[71.55,41.31],[71.59,41.33],[71.61,41.37],[71.62,41.44],[71.6,41.5],[71.64,41.53],[71.66,41.54],[71.69,41.53],[71.7,41.52],[71.7,41.45],[71.76,41.43],[71.79,41.41],[71.83,41.36],[71.86,41.31],[71.88,41.2],[71.96,41.19],[72.05,41.16],[72.12,41.19],[72.16,41.17],[72.18,41.12],[72.18,41.07],[72.19,41.03],[72.21,41.01],[72.29,41.04],[72.36,41.04],[72.43,41.02],[72.51,40.98],[72.62,40.88],[72.66,40.87],[72.83,40.86],[72.87,40.84],[72.93,40.84],[72.99,40.86],[73.13,40.83],[73.14,40.81],[73.11,40.79],[72.77,40.65],[72.75,40.61],[72.68,40.56],[72.6,40.53],[72.57,40.52],[72.4,40.58],[72.38,40.57],[72.37,40.54],[72.37,40.52],[72.41,40.46],[72.39,40.43],[72.36,40.4],[72.25,40.42],[72.23,40.44],[72.23,40.45],[72.19,40.45],[72.13,40.44],[72.01,40.34],[71.97,40.29],[71.96,40.26],[71.9,40.24],[71.85,40.23],[71.77,40.19],[71.69,40.15],[71.67,40.18],[71.65,40.21],[71.63,40.22],[71.58,40.21],[71.52,40.21],[71.46,40.24],[71.38,40.28],[71.3,40.29],[71.09,40.27],[70.99,40.25],[70.96,40.24],[70.9,40.23],[70.65,40.2],[70.6,40.21],[70.57,40.27],[70.53,40.32],[70.47,40.35],[70.4,40.36],[70.37,40.38],[70.37,40.41],[70.38,40.44],[70.38,40.45],[70.55,40.56],[70.7,40.66],[70.71,40.67],[70.73,40.69],[70.75,40.72],[70.75,40.74],[70.64,40.78],[70.63,40.8],[70.66,40.82],[70.66,40.84],[70.58,40.91],[70.44,41.02],[70.4,41.04],[70.37,41.03],[70.32,40.92],[70.29,40.89],[70.14,40.82],[70.01,40.77],[69.77,40.68],[69.71,40.66],[69.67,40.66],[69.63,40.68],[69.5,40.77],[69.41,40.8],[69.36,40.77],[69.31,40.72],[69.31,40.63],[69.26,40.59],[69.21,40.57],[69.3,40.33],[69.29,40.3],[69.22,40.29],[69.27,40.2],[69.23,40.19],[69.11,40.21],[68.95,40.22],[68.65,40.18],[68.63,40.17],[68.62,40.15],[68.64,40.13],[68.78,40.13],[68.93,40.14],[68.97,40.12],[68.97,40.09],[68.96,40.07],[68.91,40.07],[68.8,40.05],[68.79,40.03],[68.79,40.01],[68.82,39.96],[68.86,39.93],[68.87,39.91],[68.85,39.89],[68.83,39.88],[68.8,39.91],[68.78,39.9],[68.77,39.88],[68.76,39.86],[68.74,39.84],[68.69,39.85],[68.64,39.84],[68.61,39.74],[68.59,39.63],[68.51,39.56],[68.46,39.54],[68.4,39.53],[68.3,39.54],[68.24,39.55],[68.08,39.56],[67.91,39.59],[67.72,39.62],[67.54,39.56],[67.49,39.52],[67.46,39.48],[67.43,39.47],[67.35,39.24],[67.36,39.22],[67.4,39.2],[67.62,39.15],[67.65,39.13],[67.67,39.11],[67.68,39.01],[67.69,38.99],[67.77,38.98],[67.88,38.98],[67.96,38.99],[68.04,38.98],[68.1,38.96],[68.13,38.93],[68.15,38.89],[68.05,38.67],[68.06,38.59],[68.09,38.47],[68.14,38.38],[68.25,38.29],[68.33,38.24],[68.35,38.21],[68.35,38.17],[68.34,38.12],[68.29,38.03],[68.24,37.96],[68.17,37.93],[68.09,37.84],[68.01,37.72],[67.86,37.57],[67.81,37.49],[67.8,37.24],[67.76,37.17]],[[71.78,39.95],[71.75,39.91],[71.71,39.92],[71.67,39.95],[71.68,39.97],[71.74,39.98],[71.77,39.99],[71.79,40.0],[71.78,39.95]],[[71.01,40.01],[70.97,40.04],[70.96,40.09],[70.98,40.13],[71.01,40.15],[71.02,40.15],[71.08,40.08],[71.13,40.06],[71.23,40.05],[71.18,39.98],[71.22,39.91],[71.21,39.89],[71.16,39.88],[71.06,39.88],[71.01,39.9],[71.04,39.98],[71.04,39.99],[71.04,39.99],[71.01,40.01]]]},{"n":"Vatican","r":[[[12.44,41.9],[12.43,41.9],[12.43,41.9],[12.43,41.91],[12.44,41.91],[12.44,41.9]]]},{"n":"Saint Vincent and the Grenadines","r":[[[-61.33,12.7],[-61.34,12.69],[-61.35,12.7],[-61.35,12.7],[-61.34,12.7],[-61.33,12.71],[-61.34,12.72],[-61.34,12.73],[-61.33,12.73],[-61.32,12.74],[-61.32,12.73],[-61.31,12.72],[-61.32,12.72],[-61.33,12.71],[-61.33,12.7],[-61.33,12.7]],[[-61.23,12.99],[-61.24,12.98],[-61.23,12.98],[-61.24,12.98],[-61.25,12.98],[-61.26,12.99],[-61.27,12.99],[-61.28,12.99],[-61.28,13.0],[-61.26,12.99],[-61.24,13.0],[-61.24,13.01],[-61.25,13.01],[-61.25,13.02],[-61.24,13.03],[-61.21,13.04],[-61.2,13.05],[-61.2,13.05],[-61.2,13.05],[-61.2,13.04],[-61.19,13.04],[-61.21,13.02],[-61.23,12.99]],[[-61.17,13.16],[-61.2,13.14],[-61.28,13.21],[-61.27,13.29],[-61.22,13.33],[-61.18,13.36],[-61.14,13.36],[-61.12,13.29],[-61.13,13.2],[-61.17,13.16]]]},{"n":"Venezuela","r":[[[-60.74,5.2],[-60.71,5.19],[-60.67,5.16],[-60.64,5.08],[-60.6,4.99],[-60.6,4.95],[-60.63,4.89],[-60.68,4.83],[-60.74,4.77],[-60.83,4.73],[-60.91,4.69],[-60.97,4.57],[-61.0,4.54],[-61.04,4.52],[-61.1,4.5],[-61.21,4.51],[-61.28,4.52],[-61.37,4.43],[-61.48,4.4],[-61.55,4.29],[-61.82,4.2],[-62.08,4.13],[-62.15,4.1],[-62.41,4.16],[-62.47,4.14],[-62.54,4.08],[-62.61,4.04],[-62.67,4.04],[-62.71,4.02],[-62.74,3.94],[-62.76,3.67],[-62.86,3.59],[-62.97,3.59],[-63.05,3.69],[-63.14,3.76],[-63.29,3.92],[-63.34,3.94],[-63.38,3.94],[-63.53,3.89],[-63.6,3.92],[-63.65,3.94],[-63.75,3.93],[-63.91,3.93],[-64.02,3.93],[-64.07,3.97],[-64.12,4.07],[-64.15,4.1],[-64.19,4.13],[-64.26,4.14],[-64.53,4.14],[-64.58,4.14],[-64.61,4.16],[-64.67,4.24],[-64.72,4.27],[-64.79,4.28],[-64.82,4.23],[-64.7,4.09],[-64.67,4.01],[-64.57,3.9],[-64.28,3.66],[-64.22,3.59],[-64.23,3.49],[-64.23,3.34],[-64.22,3.2],[-64.14,3.0],[-64.04,2.8],[-64.01,2.67],[-64.03,2.58],[-64.05,2.53],[-64.05,2.5],[-64.02,2.48],[-63.92,2.45],[-63.71,2.43],[-63.58,2.43],[-63.39,2.41],[-63.37,2.34],[-63.39,2.22],[-63.43,2.16],[-63.46,2.14],[-63.57,2.12],[-63.68,2.05],[-63.84,1.98],[-63.94,1.97],[-63.98,1.95],[-64.01,1.93],[-64.04,1.9],[-64.07,1.77],[-64.11,1.62],[-64.21,1.53],[-64.3,1.46],[-64.41,1.45],[-64.49,1.45],[-64.53,1.43],[-64.58,1.37],[-64.67,1.29],[-64.73,1.25],[-64.82,1.26],[-64.91,1.22],[-65.03,1.16],[-65.1,1.11],[-65.17,1.02],[-65.26,0.93],[-65.36,0.87],[-65.41,0.79],[-65.47,0.69],[-65.56,0.69],[-65.56,0.75],[-65.52,0.84],[-65.57,0.93],[-65.64,0.97],[-65.68,0.98],[-65.72,0.98],[-65.81,0.94],[-65.93,0.86],[-66.0,0.81],[-66.06,0.79],[-66.19,0.76],[-66.3,0.75],[-66.35,0.77],[-66.43,0.82],[-66.62,0.99],[-66.88,1.22],[-66.9,1.29],[-66.88,1.36],[-66.93,1.46],[-66.96,1.56],[-66.98,1.6],[-66.99,1.68],[-67.04,1.82],[-67.09,1.94],[-67.13,2.0],[-67.11,2.05],[-67.13,2.1],[-67.17,2.14],[-67.22,2.28],[-67.2,2.33],[-67.21,2.39],[-67.25,2.43],[-67.31,2.47],[-67.39,2.56],[-67.49,2.64],[-67.53,2.68],[-67.57,2.69],[-67.6,2.77],[-67.62,2.79],[-67.67,2.8],[-67.77,2.83],[-67.86,2.79],[-67.86,2.86],[-67.83,2.89],[-67.51,3.19],[-67.35,3.32],[-67.34,3.34],[-67.32,3.37],[-67.31,3.42],[-67.35,3.46],[-67.5,3.69],[-67.55,3.73],[-67.6,3.77],[-67.66,3.86],[-67.73,4.09],[-67.78,4.2],[-67.8,4.28],[-67.8,4.38],[-67.81,4.46],[-67.86,4.51],[-67.86,4.67],[-67.81,4.93],[-67.8,5.13],[-67.82,5.27],[-67.79,5.38],[-67.69,5.45],[-67.64,5.56],[-67.63,5.71],[-67.58,5.83],[-67.47,5.93],[-67.44,6.03],[-67.47,6.12],[-67.48,6.18],[-67.57,6.24],[-67.73,6.28],[-67.86,6.29],[-67.94,6.24],[-68.14,6.2],[-68.47,6.16],[-68.74,6.16],[-68.94,6.2],[-69.09,6.18],[-69.19,6.12],[-69.27,6.1],[-69.31,6.14],[-69.36,6.15],[-69.43,6.12],[-69.44,6.13],[-69.59,6.32],[-69.74,6.49],[-69.9,6.7],[-70.1,6.94],[-70.13,6.95],[-70.19,6.95],[-70.27,6.95],[-70.39,6.97],[-70.47,7.01],[-70.54,7.04],[-70.66,7.08],[-70.74,7.09],[-70.81,7.08],[-71.01,6.99],[-71.13,6.99],[-71.22,6.99],[-71.46,7.03],[-71.62,7.03],[-71.81,7.01],[-71.89,6.99],[-72.01,7.03],[-72.08,7.1],[-72.16,7.25],[-72.21,7.37],[-72.3,7.39],[-72.39,7.42],[-72.44,7.45],[-72.47,7.52],[-72.48,7.61],[-72.47,7.76],[-72.46,7.81],[-72.45,7.97],[-72.39,8.05],[-72.36,8.09],[-72.36,8.15],[-72.39,8.29],[-72.42,8.38],[-72.53,8.49],[-72.67,8.63],[-72.73,8.85],[-72.8,9.11],[-72.85,9.14],[-72.9,9.12],[-72.96,9.14],[-73.01,9.24],[-73.06,9.26],[-73.14,9.22],[-73.19,9.19],[-73.34,9.17],[-73.37,9.19],[-73.36,9.23],[-73.3,9.32],[-73.22,9.44],[-73.14,9.55],[-73.06,9.67],[-73.01,9.79],[-72.97,10.03],[-72.94,10.2],[-72.87,10.49],[-72.74,10.73],[-72.69,10.84],[-72.57,10.98],[-72.52,11.05],[-72.45,11.11],[-72.25,11.2],[-72.01,11.6],[-71.96,11.67],[-71.72,11.73],[-71.54,11.77],[-71.4,11.82],[-71.36,11.85],[-71.32,11.86],[-71.35,11.81],[-71.41,11.76],[-71.49,11.72],[-71.87,11.63],[-71.91,11.61],[-71.96,11.57],[-71.96,11.48],[-71.95,11.41],[-71.84,11.19],[-71.79,11.14],[-71.64,11.01],[-71.68,11.0],[-71.73,10.99],[-71.69,10.84],[-71.6,10.73],[-71.59,10.66],[-71.66,10.44],[-71.79,10.32],[-71.88,10.17],[-71.96,10.11],[-72.11,9.82],[-71.99,9.64],[-71.98,9.55],[-71.87,9.43],[-71.81,9.39],[-71.76,9.34],[-71.78,9.25],[-71.74,9.13],[-71.69,9.07],[-71.62,9.05],[-71.54,9.05],[-71.3,9.13],[-71.24,9.16],[-71.21,9.22],[-71.09,9.35],[-71.08,9.51],[-71.05,9.71],[-71.08,9.83],[-71.21,10.01],[-71.26,10.14],[-71.39,10.26],[-71.46,10.47],[-71.49,10.53],[-71.52,10.62],[-71.54,10.78],[-71.46,10.84],[-71.47,10.96],[-71.26,11.0],[-70.82,11.21],[-70.55,11.26],[-70.23,11.37],[-70.16,11.43],[-70.1,11.52],[-70.05,11.53],[-69.89,11.44],[-69.8,11.47],[-69.77,11.54],[-69.82,11.67],[-69.91,11.67],[-70.19,11.62],[-70.22,11.68],[-70.22,11.73],[-70.29,11.89],[-70.25,12.0],[-70.2,12.1],[-70.12,12.14],[-70.0,12.18],[-69.91,12.11],[-69.86,12.05],[-69.83,12.0],[-69.81,11.84],[-69.76,11.68],[-69.71,11.56],[-69.63,11.48],[-69.57,11.49],[-69.53,11.5],[-69.23,11.52],[-69.05,11.46],[-68.83,11.43],[-68.62,11.31],[-68.4,11.16],[-68.34,11.05],[-68.32,10.95],[-68.27,10.88],[-68.32,10.81],[-68.3,10.69],[-68.23,10.57],[-68.14,10.49],[-67.87,10.47],[-67.58,10.52],[-67.13,10.57],[-66.99,10.61],[-66.25,10.63],[-66.11,10.57],[-66.09,10.52],[-66.09,10.47],[-65.85,10.26],[-65.66,10.23],[-65.49,10.16],[-65.32,10.12],[-65.13,10.07],[-65.02,10.08],[-64.94,10.1],[-64.85,10.1],[-64.19,10.46],[-63.83,10.45],[-63.78,10.47],[-63.73,10.5],[-63.86,10.56],[-64.16,10.58],[-64.25,10.54],[-64.3,10.64],[-64.2,10.63],[-63.87,10.66],[-63.5,10.64],[-63.19,10.71],[-63.04,10.72],[-62.95,10.71],[-62.7,10.75],[-62.24,10.7],[-61.88,10.74],[-61.92,10.68],[-62.04,10.65],[-62.23,10.63],[-62.38,10.55],[-62.69,10.56],[-62.91,10.53],[-62.84,10.51],[-62.84,10.42],[-62.81,10.4],[-62.78,10.4],[-62.71,10.33],[-62.69,10.29],[-62.66,10.2],[-62.69,10.1],[-62.74,10.06],[-62.65,10.07],[-62.6,10.12],[-62.61,10.16],[-62.6,10.22],[-62.55,10.2],[-62.52,10.18],[-62.4,9.92],[-62.32,9.78],[-62.3,9.79],[-62.28,9.79],[-62.26,9.82],[-62.22,9.88],[-62.19,9.84],[-62.17,9.83],[-62.15,9.82],[-62.17,9.88],[-62.15,9.95],[-62.16,9.98],[-62.12,9.98],[-62.08,9.98],[-62.02,9.95],[-61.91,9.87],[-61.84,9.78],[-61.83,9.73],[-61.81,9.71],[-61.76,9.68],[-61.74,9.63],[-61.73,9.7],[-61.76,9.75],[-61.77,9.81],[-61.63,9.82],[-61.59,9.89],[-61.51,9.85],[-61.31,9.63],[-61.23,9.6],[-61.01,9.56],[-60.87,9.45],[-60.79,9.36],[-60.84,9.26],[-60.97,9.22],[-61.02,9.15],[-61.05,9.1],[-61.05,9.04],[-61.09,8.97],[-61.1,8.94],[-61.12,8.84],[-61.18,8.73],[-61.25,8.6],[-61.62,8.6],[-61.53,8.55],[-61.44,8.51],[-61.3,8.41],[-61.19,8.49],[-61.04,8.49],[-60.87,8.58],[-60.8,8.59],[-60.48,8.55],[-60.4,8.61],[-60.34,8.63],[-60.17,8.62],[-60.02,8.55],[-59.83,8.31],[-59.83,8.28],[-59.85,8.25],[-59.96,8.19],[-59.99,8.16],[-60.03,8.05],[-60.18,7.99],[-60.28,7.92],[-60.35,7.85],[-60.38,7.83],[-60.51,7.81],[-60.56,7.77],[-60.61,7.65],[-60.65,7.6],[-60.72,7.54],[-60.72,7.5],[-60.62,7.36],[-60.61,7.32],[-60.64,7.26],[-60.63,7.21],[-60.58,7.16],[-60.52,7.14],[-60.46,7.17],[-60.39,7.16],[-60.35,7.15],[-60.33,7.13],[-60.32,7.09],[-60.35,7.0],[-60.4,6.95],[-60.59,6.86],[-60.67,6.81],[-60.72,6.77],[-60.82,6.79],[-60.87,6.79],[-60.91,6.76],[-60.94,6.73],[-61.01,6.73],[-61.1,6.71],[-61.15,6.69],[-61.18,6.65],[-61.2,6.59],[-61.18,6.51],[-61.15,6.45],[-61.15,6.39],[-61.13,6.21],[-61.16,6.17],[-61.22,6.13],[-61.3,6.05],[-61.39,5.94],[-61.38,5.91],[-61.17,5.67],[-60.95,5.44],[-60.74,5.2]],[[-61.0,8.87],[-61.06,8.85],[-61.07,8.95],[-61.05,8.97],[-60.94,9.06],[-60.92,9.07],[-60.89,9.05],[-60.9,9.03],[-60.85,9.0],[-60.86,8.95],[-60.92,8.9],[-61.0,8.87]],[[-60.82,9.14],[-60.94,9.11],[-60.94,9.13],[-60.91,9.18],[-60.84,9.19],[-60.82,9.21],[-60.78,9.22],[-60.76,9.22],[-60.74,9.2],[-60.79,9.18],[-60.82,9.14]],[[-65.21,10.91],[-65.27,10.88],[-65.37,10.91],[-65.41,10.94],[-65.38,10.97],[-65.3,10.97],[-65.23,10.93],[-65.21,10.91]],[[-63.85,11.13],[-63.82,11.0],[-63.83,10.98],[-63.92,10.89],[-63.99,10.88],[-64.05,10.88],[-64.1,10.9],[-64.16,10.96],[-64.22,10.94],[-64.36,10.96],[-64.4,10.98],[-64.35,11.05],[-64.25,11.08],[-64.21,11.09],[-64.18,11.04],[-64.11,11.01],[-64.03,11.0],[-64.01,11.07],[-63.89,11.17],[-63.85,11.13]]]},{"n":"British Virgin Islands","r":[[[-64.59,18.4],[-64.67,18.4],[-64.7,18.41],[-64.65,18.44],[-64.57,18.45],[-64.55,18.44],[-64.59,18.4]],[[-64.4,18.46],[-64.42,18.46],[-64.44,18.46],[-64.44,18.47],[-64.43,18.51],[-64.32,18.52],[-64.4,18.46]],[[-64.29,18.74],[-64.27,18.71],[-64.28,18.71],[-64.34,18.73],[-64.38,18.73],[-64.4,18.74],[-64.41,18.75],[-64.32,18.75],[-64.29,18.74]]]},{"n":"United States Virgin Islands","r":[[[-64.77,17.79],[-64.68,17.75],[-64.58,17.75],[-64.69,17.71],[-64.89,17.7],[-64.88,17.77],[-64.77,17.79]],[[-64.66,18.35],[-64.73,18.33],[-64.77,18.33],[-64.79,18.34],[-64.75,18.37],[-64.66,18.35]],[[-64.85,18.33],[-64.92,18.32],[-65.02,18.37],[-64.94,18.39],[-64.89,18.37],[-64.85,18.33]]]},{"n":"Vietnam","r":[[[102.13,22.38],[102.18,22.41],[102.24,22.47],[102.3,22.55],[102.38,22.65],[102.41,22.71],[102.43,22.73],[102.47,22.75],[102.52,22.74],[102.6,22.7],[102.72,22.65],[102.83,22.59],[102.87,22.53],[102.94,22.47],[102.98,22.45],[103.01,22.45],[103.08,22.5],[103.14,22.54],[103.14,22.59],[103.19,22.64],[103.27,22.71],[103.3,22.76],[103.33,22.77],[103.36,22.75],[103.47,22.6],[103.49,22.59],[103.53,22.61],[103.57,22.73],[103.62,22.78],[103.64,22.77],[103.92,22.54],[103.94,22.54],[103.97,22.55],[103.99,22.59],[104.01,22.67],[104.05,22.75],[104.14,22.8],[104.21,22.81],[104.24,22.77],[104.3,22.71],[104.37,22.7],[104.53,22.8],[104.58,22.82],[104.63,22.82],[104.69,22.82],[104.74,22.86],[104.8,22.91],[104.81,23.01],[104.83,23.1],[104.86,23.14],[104.91,23.16],[105.0,23.19],[105.19,23.28],[105.24,23.32],[105.28,23.35],[105.35,23.31],[105.44,23.24],[105.49,23.18],[105.53,23.12],[105.55,23.07],[105.69,23.03],[105.78,22.97],[105.84,22.92],[105.9,22.92],[105.96,22.94],[106.0,22.97],[106.07,22.98],[106.15,22.97],[106.18,22.96],[106.25,22.87],[106.28,22.86],[106.34,22.86],[106.45,22.89],[106.54,22.91],[106.62,22.87],[106.78,22.78],[106.74,22.71],[106.7,22.64],[106.63,22.59],[106.58,22.57],[106.55,22.5],[106.54,22.4],[106.55,22.34],[106.59,22.32],[106.64,22.29],[106.65,22.24],[106.66,22.14],[106.66,22.02],[106.66,21.98],[106.7,21.99],[106.73,22.0],[106.79,21.98],[106.87,21.95],[106.93,21.92],[106.97,21.92],[107.01,21.89],[107.02,21.83],[107.06,21.79],[107.18,21.72],[107.27,21.71],[107.35,21.61],[107.43,21.64],[107.47,21.6],[107.64,21.61],[107.76,21.66],[107.8,21.65],[107.91,21.56],[107.97,21.51],[107.93,21.5],[107.81,21.5],[107.71,21.41],[107.64,21.37],[107.53,21.34],[107.41,21.28],[107.38,21.19],[107.37,21.13],[107.35,21.06],[107.16,20.95],[107.11,20.96],[107.08,21.0],[107.02,20.99],[106.98,20.97],[106.94,20.97],[106.89,20.95],[106.82,20.96],[106.76,20.99],[106.73,21.0],[106.68,21.0],[106.68,20.96],[106.74,20.81],[106.75,20.74],[106.55,20.53],[106.57,20.39],[106.52,20.29],[106.4,20.21],[106.17,19.99],[106.06,19.99],[105.98,19.94],[105.81,19.59],[105.81,19.47],[105.79,19.38],[105.79,19.29],[105.72,19.13],[105.64,19.06],[105.62,18.97],[105.73,18.78],[105.74,18.75],[105.81,18.65],[105.84,18.57],[105.89,18.5],[106.07,18.32],[106.14,18.26],[106.24,18.22],[106.41,18.05],[106.5,17.95],[106.46,17.87],[106.48,17.72],[106.36,17.77],[106.37,17.75],[106.52,17.66],[106.74,17.37],[106.93,17.22],[107.12,17.06],[107.18,16.9],[107.36,16.79],[107.55,16.64],[107.54,16.61],[107.59,16.57],[107.72,16.49],[107.8,16.4],[107.83,16.32],[107.88,16.31],[107.94,16.33],[107.99,16.34],[108.03,16.33],[108.09,16.24],[108.17,16.16],[108.21,16.09],[108.24,16.1],[108.27,16.09],[108.27,16.03],[108.29,15.99],[108.4,15.87],[108.45,15.76],[108.58,15.58],[108.67,15.48],[108.74,15.43],[108.82,15.38],[108.9,15.18],[108.94,15.0],[109.02,14.8],[109.08,14.72],[109.09,14.55],[109.14,14.38],[109.19,14.27],[109.21,14.15],[109.22,14.1],[109.24,14.05],[109.3,13.86],[109.29,13.77],[109.25,13.85],[109.25,13.59],[109.29,13.45],[109.27,13.28],[109.31,13.22],[109.38,13.03],[109.42,12.96],[109.42,12.72],[109.44,12.6],[109.38,12.67],[109.34,12.75],[109.27,12.71],[109.22,12.65],[109.3,12.39],[109.21,12.42],[109.22,12.07],[109.26,11.99],[109.26,11.95],[109.25,11.91],[109.22,11.96],[109.21,12.01],[109.2,12.0],[109.2,11.97],[109.17,11.91],[109.16,11.84],[109.19,11.77],[109.2,11.72],[109.17,11.66],[109.13,11.6],[109.04,11.59],[109.02,11.47],[108.99,11.34],[108.82,11.32],[108.7,11.2],[108.55,11.16],[108.42,11.04],[108.27,10.93],[108.18,10.92],[108.09,10.9],[108.0,10.72],[107.85,10.7],[107.56,10.56],[107.47,10.49],[107.38,10.46],[107.26,10.4],[107.24,10.42],[107.19,10.47],[107.09,10.5],[107.04,10.56],[107.02,10.63],[107.01,10.66],[106.98,10.62],[106.97,10.44],[106.95,10.4],[106.9,10.38],[106.81,10.43],[106.73,10.54],[106.61,10.46],[106.64,10.46],[106.7,10.46],[106.74,10.44],[106.78,10.38],[106.78,10.34],[106.76,10.3],[106.64,10.29],[106.49,10.3],[106.46,10.3],[106.6,10.23],[106.73,10.19],[106.79,10.15],[106.79,10.12],[106.71,10.06],[106.66,9.99],[106.66,9.95],[106.66,9.9],[106.6,9.86],[106.56,9.87],[106.45,9.94],[106.14,10.22],[106.18,10.14],[106.51,9.82],[106.56,9.72],[106.57,9.64],[106.54,9.6],[106.48,9.56],[106.38,9.56],[106.2,9.68],[105.93,9.96],[105.83,10.0],[106.11,9.67],[106.16,9.59],[106.21,9.5],[106.19,9.45],[106.17,9.4],[105.5,9.09],[105.4,8.96],[105.32,8.8],[105.19,8.71],[105.11,8.63],[104.89,8.58],[104.77,8.6],[104.9,8.75],[104.82,8.8],[104.81,9.19],[104.85,9.61],[104.9,9.82],[104.99,9.87],[105.09,9.9],[105.09,9.95],[105.08,10.0],[105.03,10.07],[104.97,10.1],[104.87,10.11],[104.8,10.2],[104.75,10.2],[104.66,10.17],[104.61,10.21],[104.59,10.27],[104.52,10.34],[104.43,10.41],[104.47,10.42],[104.51,10.46],[104.56,10.52],[104.69,10.52],[104.82,10.52],[104.85,10.53],[104.9,10.59],[104.98,10.66],[105.05,10.7],[105.06,10.73],[105.04,10.81],[105.02,10.89],[105.05,10.91],[105.16,10.9],[105.28,10.86],[105.31,10.85],[105.39,10.94],[105.41,10.95],[105.45,10.95],[105.58,10.97],[105.7,10.99],[105.76,10.99],[105.81,10.93],[105.85,10.86],[105.88,10.86],[105.94,10.89],[105.99,10.85],[106.1,10.8],[106.16,10.79],[106.13,10.92],[106.17,11.01],[106.16,11.04],[106.1,11.08],[105.89,11.24],[105.86,11.29],[105.86,11.37],[105.85,11.49],[105.84,11.56],[105.84,11.6],[105.85,11.64],[105.89,11.65],[105.93,11.65],[105.96,11.68],[106.01,11.76],[106.1,11.75],[106.24,11.71],[106.34,11.68],[106.4,11.69],[106.41,11.7],[106.41,11.74],[106.42,11.91],[106.41,11.95],[106.5,11.97],[106.63,11.97],[106.7,11.98],[106.76,12.05],[106.93,12.08],[107.05,12.18],[107.16,12.28],[107.21,12.3],[107.28,12.32],[107.33,12.32],[107.39,12.26],[107.45,12.3],[107.51,12.36],[107.54,12.43],[107.56,12.54],[107.54,12.71],[107.51,12.84],[107.48,12.93],[107.48,13.03],[107.55,13.23],[107.61,13.44],[107.59,13.52],[107.53,13.65],[107.46,13.82],[107.39,13.99],[107.36,14.02],[107.34,14.07],[107.33,14.13],[107.36,14.31],[107.36,14.37],[107.45,14.45],[107.49,14.55],[107.54,14.65],[107.52,14.71],[107.51,14.82],[107.52,14.87],[107.5,14.92],[107.48,14.98],[107.5,15.02],[107.56,15.06],[107.59,15.12],[107.63,15.19],[107.65,15.26],[107.62,15.31],[107.56,15.39],[107.46,15.47],[107.34,15.56],[107.28,15.62],[107.23,15.68],[107.19,15.75],[107.17,15.8],[107.19,15.84],[107.36,15.92],[107.39,15.95],[107.41,16.0],[107.4,16.04],[107.35,16.07],[107.3,16.08],[107.22,16.14],[107.07,16.28],[107.0,16.31],[106.93,16.35],[106.89,16.4],[106.85,16.52],[106.83,16.53],[106.79,16.49],[106.74,16.45],[106.7,16.46],[106.66,16.49],[106.64,16.54],[106.59,16.6],[106.55,16.65],[106.53,16.82],[106.53,16.88],[106.5,16.95],[106.47,16.98],[106.43,17.0],[106.33,17.14],[106.27,17.22],[106.01,17.42],[105.97,17.45],[105.9,17.53],[105.78,17.64],[105.69,17.74],[105.63,17.83],[105.6,17.92],[105.59,17.98],[105.52,18.08],[105.46,18.15],[105.4,18.18],[105.33,18.19],[105.27,18.24],[105.16,18.34],[105.11,18.41],[105.09,18.45],[105.09,18.5],[105.11,18.57],[105.15,18.62],[105.15,18.65],[105.12,18.68],[104.99,18.73],[104.72,18.8],[104.61,18.86],[104.52,18.93],[104.45,18.98],[104.11,19.2],[104.01,19.23],[103.92,19.27],[103.89,19.3],[103.9,19.34],[103.93,19.37],[104.03,19.42],[104.06,19.48],[104.05,19.56],[104.01,19.65],[104.03,19.68],[104.06,19.68],[104.13,19.68],[104.26,19.69],[104.55,19.61],[104.59,19.62],[104.74,19.75],[104.8,19.84],[104.82,19.9],[104.85,19.95],[104.93,20.02],[104.93,20.08],[104.89,20.17],[104.85,20.2],[104.81,20.22],[104.7,20.21],[104.68,20.22],[104.66,20.29],[104.66,20.33],[104.62,20.37],[104.5,20.41],[104.39,20.42],[104.37,20.44],[104.41,20.49],[104.48,20.53],[104.53,20.55],[104.58,20.6],[104.58,20.65],[104.53,20.69],[104.46,20.73],[104.35,20.82],[104.2,20.91],[104.1,20.95],[104.05,20.94],[103.88,20.86],[103.79,20.81],[103.71,20.72],[103.64,20.7],[103.55,20.74],[103.46,20.78],[103.21,20.84],[103.1,20.89],[102.88,21.2],[102.85,21.27],[102.87,21.34],[102.89,21.44],[102.91,21.51],[102.95,21.57],[102.96,21.63],[102.95,21.68],[102.92,21.71],[102.88,21.72],[102.85,21.73],[102.82,21.81],[102.8,21.8],[102.77,21.71],[102.74,21.68],[102.7,21.66],[102.66,21.68],[102.64,21.71],[102.63,21.77],[102.61,21.85],[102.58,21.9],[102.49,21.96],[102.44,22.03],[102.3,22.18],[102.18,22.28],[102.13,22.38]],[[106.62,8.68],[106.59,8.68],[106.57,8.7],[106.66,8.77],[106.65,8.72],[106.65,8.7],[106.62,8.68]],[[104.06,10.39],[104.08,10.34],[104.08,10.22],[104.04,10.11],[104.05,10.06],[104.02,10.03],[103.95,10.24],[103.87,10.34],[103.85,10.37],[103.9,10.37],[103.99,10.43],[104.03,10.43],[104.06,10.39]],[[107.17,10.4],[107.08,10.34],[107.08,10.39],[107.15,10.42],[107.18,10.45],[107.19,10.45],[107.17,10.4]],[[107.03,20.75],[106.99,20.74],[106.91,20.82],[106.95,20.87],[107.04,20.84],[107.06,20.82],[107.06,20.8],[107.04,20.76],[107.03,20.75]],[[106.87,20.82],[106.85,20.8],[106.8,20.84],[106.77,20.86],[106.8,20.93],[106.86,20.86],[106.87,20.82]],[[107.52,20.93],[107.47,20.9],[107.4,20.9],[107.48,20.95],[107.52,21.01],[107.55,21.03],[107.55,20.98],[107.52,20.93]],[[107.6,21.22],[107.46,21.09],[107.4,21.09],[107.45,21.24],[107.48,21.27],[107.56,21.22],[107.6,21.22]]]},{"n":"Vanuatu","r":[[[169.9,-20.19],[169.86,-20.24],[169.81,-20.24],[169.74,-20.2],[169.75,-20.15],[169.83,-20.14],[169.85,-20.15],[169.9,-20.19]],[[169.49,-19.54],[169.44,-19.65],[169.35,-19.62],[169.26,-19.55],[169.22,-19.48],[169.25,-19.34],[169.29,-19.32],[169.34,-19.33],[169.36,-19.46],[169.49,-19.54]],[[169.33,-18.94],[169.29,-18.99],[169.25,-18.98],[168.99,-18.87],[169.0,-18.83],[168.99,-18.71],[169.02,-18.64],[169.09,-18.62],[169.14,-18.63],[169.18,-18.73],[169.26,-18.76],[169.2,-18.8],[169.3,-18.87],[169.33,-18.94]],[[168.45,-17.54],[168.55,-17.68],[168.58,-17.7],[168.52,-17.8],[168.4,-17.81],[168.25,-17.78],[168.31,-17.75],[168.28,-17.71],[168.23,-17.7],[168.18,-17.72],[168.16,-17.71],[168.19,-17.64],[168.27,-17.55],[168.3,-17.54],[168.32,-17.54],[168.34,-17.55],[168.45,-17.54]],[[168.45,-16.78],[168.48,-16.79],[168.46,-16.84],[168.32,-16.79],[168.21,-16.81],[168.18,-16.8],[168.15,-16.77],[168.12,-16.69],[168.14,-16.64],[168.18,-16.6],[168.2,-16.59],[168.23,-16.64],[168.27,-16.67],[168.3,-16.68],[168.37,-16.76],[168.45,-16.78]],[[168.3,-16.34],[168.18,-16.35],[168.02,-16.32],[167.96,-16.27],[167.93,-16.23],[167.98,-16.2],[168.06,-16.18],[168.16,-16.08],[168.2,-16.12],[168.24,-16.23],[168.28,-16.26],[168.3,-16.3],[168.3,-16.34]],[[167.41,-16.1],[167.46,-16.12],[167.48,-16.12],[167.5,-16.17],[167.64,-16.26],[167.68,-16.26],[167.71,-16.31],[167.78,-16.34],[167.79,-16.39],[167.84,-16.45],[167.76,-16.52],[167.61,-16.5],[167.53,-16.57],[167.45,-16.55],[167.44,-16.52],[167.45,-16.5],[167.4,-16.4],[167.38,-16.25],[167.35,-16.15],[167.32,-16.12],[167.25,-16.15],[167.22,-16.16],[167.15,-16.08],[167.18,-15.93],[167.2,-15.89],[167.25,-15.88],[167.34,-15.92],[167.41,-16.1]],[[167.22,-15.72],[167.2,-15.75],[167.09,-15.69],[167.12,-15.62],[167.23,-15.65],[167.22,-15.72]],[[168.21,-15.97],[168.2,-15.97],[168.18,-15.93],[168.12,-15.68],[168.16,-15.46],[168.18,-15.51],[168.27,-15.89],[168.26,-15.96],[168.21,-15.97]],[[167.91,-15.44],[167.84,-15.48],[167.72,-15.48],[167.67,-15.45],[167.83,-15.31],[168.0,-15.28],[167.91,-15.44]],[[168.19,-15.33],[168.17,-15.39],[168.13,-15.32],[168.1,-15.02],[168.11,-14.99],[168.14,-14.99],[168.19,-15.2],[168.19,-15.33]],[[166.75,-14.83],[166.81,-15.16],[166.89,-15.16],[166.92,-15.14],[166.97,-15.06],[166.99,-14.94],[167.03,-14.92],[167.08,-14.94],[167.05,-14.97],[167.07,-15.07],[167.11,-15.13],[167.13,-15.14],[167.18,-15.39],[167.2,-15.44],[167.2,-15.49],[167.09,-15.58],[166.94,-15.58],[166.83,-15.63],[166.76,-15.63],[166.76,-15.57],[166.7,-15.52],[166.63,-15.41],[166.65,-15.21],[166.53,-14.85],[166.53,-14.76],[166.57,-14.64],[166.61,-14.64],[166.66,-14.74],[166.75,-14.83]],[[167.58,-14.26],[167.54,-14.31],[167.43,-14.29],[167.4,-14.28],[167.41,-14.2],[167.44,-14.17],[167.51,-14.14],[167.6,-14.18],[167.58,-14.26]],[[167.49,-13.91],[167.47,-13.92],[167.45,-13.91],[167.39,-13.79],[167.41,-13.75],[167.48,-13.71],[167.55,-13.78],[167.55,-13.81],[167.55,-13.85],[167.54,-13.87],[167.5,-13.88],[167.49,-13.91]]]},{"n":"Wallis and Futuna","r":[[[-178.05,-14.32],[-178.1,-14.32],[-178.16,-14.31],[-178.19,-14.26],[-178.18,-14.23],[-178.14,-14.24],[-178.11,-14.28],[-178.04,-14.3],[-178.05,-14.32]],[[-176.16,-13.33],[-176.18,-13.34],[-176.2,-13.3],[-176.17,-13.24],[-176.15,-13.22],[-176.13,-13.27],[-176.16,-13.33]]]},{"n":"Samoa","r":[[[-171.45,-14.05],[-171.73,-14.05],[-171.86,-14.0],[-171.91,-14.0],[-172.03,-13.91],[-172.05,-13.86],[-171.98,-13.82],[-171.86,-13.81],[-171.6,-13.88],[-171.57,-13.94],[-171.51,-13.95],[-171.46,-13.98],[-171.45,-14.02],[-171.45,-14.05]],[[-172.33,-13.47],[-172.22,-13.56],[-172.18,-13.68],[-172.22,-13.8],[-172.33,-13.77],[-172.48,-13.8],[-172.54,-13.79],[-172.66,-13.64],[-172.74,-13.58],[-172.78,-13.52],[-172.67,-13.52],[-172.51,-13.48],[-172.33,-13.47]]]},{"n":"Yemen","r":[[[51.98,19.0],[52.02,18.9],[52.07,18.8],[52.11,18.7],[52.15,18.6],[52.2,18.5],[52.24,18.4],[52.29,18.3],[52.33,18.2],[52.38,18.1],[52.42,18.0],[52.46,17.9],[52.51,17.8],[52.55,17.7],[52.6,17.6],[52.64,17.5],[52.69,17.4],[52.73,17.3],[52.8,17.27],[52.84,17.18],[52.9,17.04],[52.96,16.91],[53.02,16.78],[53.09,16.65],[52.58,16.47],[52.45,16.39],[52.33,16.29],[52.24,16.17],[52.17,15.96],[52.22,15.76],[52.22,15.66],[52.09,15.59],[51.97,15.54],[51.83,15.46],[51.75,15.44],[51.68,15.38],[51.6,15.34],[51.32,15.23],[51.02,15.14],[50.53,15.04],[50.34,14.93],[50.17,14.85],[49.91,14.83],[49.55,14.72],[49.35,14.64],[49.1,14.5],[49.05,14.46],[49.0,14.36],[48.93,14.27],[48.78,14.12],[48.67,14.05],[48.59,14.05],[48.45,14.01],[48.28,14.0],[47.99,14.05],[47.92,14.01],[47.86,13.96],[47.63,13.86],[47.41,13.66],[47.24,13.61],[46.98,13.55],[46.79,13.47],[46.66,13.43],[46.5,13.42],[46.2,13.42],[45.92,13.39],[45.66,13.34],[45.53,13.23],[45.39,13.07],[45.16,13.0],[45.11,12.94],[45.04,12.82],[44.89,12.78],[44.76,12.76],[44.62,12.82],[44.36,12.67],[44.26,12.64],[44.11,12.64],[44.01,12.61],[43.93,12.62],[43.84,12.67],[43.63,12.74],[43.49,12.7],[43.48,12.84],[43.23,13.27],[43.28,13.64],[43.28,13.69],[43.23,13.86],[43.09,14.01],[43.09,14.2],[43.04,14.34],[43.01,14.48],[43.02,14.52],[43.02,14.55],[42.95,14.77],[42.92,14.82],[42.91,14.86],[42.94,14.9],[42.94,14.94],[42.9,15.01],[42.86,15.13],[42.66,15.23],[42.7,15.33],[42.74,15.29],[42.79,15.27],[42.8,15.33],[42.8,15.37],[42.72,15.65],[42.84,16.03],[42.8,16.37],[42.99,16.51],[43.03,16.55],[43.06,16.59],[43.1,16.66],[43.17,16.69],[43.19,16.77],[43.18,16.81],[43.15,16.85],[43.12,16.94],[43.13,17.06],[43.14,17.11],[43.16,17.21],[43.22,17.24],[43.24,17.27],[43.19,17.32],[43.19,17.36],[43.3,17.46],[43.35,17.49],[43.42,17.52],[43.47,17.52],[43.54,17.5],[43.6,17.47],[43.65,17.42],[43.71,17.37],[43.8,17.34],[43.87,17.35],[43.92,17.32],[43.96,17.34],[44.01,17.37],[44.09,17.37],[44.16,17.4],[44.35,17.41],[44.55,17.4],[44.75,17.43],[44.95,17.43],[45.15,17.43],[45.19,17.42],[45.24,17.41],[45.41,17.32],[45.54,17.3],[45.79,17.28],[46.07,17.25],[46.31,17.23],[46.51,17.25],[46.68,17.27],[46.73,17.27],[46.78,17.21],[46.88,17.08],[46.98,16.95],[47.14,16.95],[47.25,16.99],[47.37,17.06],[47.44,17.11],[47.53,17.32],[47.58,17.45],[47.7,17.6],[47.81,17.72],[47.95,17.89],[48.02,17.98],[48.17,18.16],[48.32,18.23],[48.59,18.36],[48.86,18.5],[49.04,18.58],[49.19,18.62],[49.45,18.66],[49.74,18.7],[50.04,18.74],[50.36,18.78],[50.71,18.83],[50.95,18.86],[51.26,18.9],[51.51,18.93],[51.74,18.96],[51.98,19.0]],[[53.76,12.64],[53.82,12.62],[53.92,12.66],[54.19,12.66],[54.51,12.55],[54.45,12.52],[54.41,12.48],[54.27,12.45],[54.13,12.36],[53.72,12.32],[53.6,12.34],[53.5,12.43],[53.32,12.53],[53.39,12.6],[53.4,12.63],[53.43,12.66],[53.53,12.72],[53.64,12.71],[53.76,12.64]],[[42.76,13.7],[42.69,13.67],[42.73,13.75],[42.78,13.77],[42.79,13.77],[42.76,13.7]],[[42.79,13.97],[42.77,13.95],[42.76,13.95],[42.69,14.01],[42.76,14.07],[42.8,14.01],[42.79,13.97]],[[42.59,15.3],[42.56,15.28],[42.55,15.32],[42.57,15.41],[42.6,15.43],[42.62,15.37],[42.61,15.33],[42.59,15.3]]]},{"n":"South Africa","r":[[[19.98,-24.78],[20.03,-24.81],[20.35,-25.03],[20.43,-25.15],[20.47,-25.22],[20.61,-25.49],[20.71,-25.73],[20.79,-25.92],[20.8,-26.0],[20.81,-26.08],[20.82,-26.12],[20.82,-26.16],[20.76,-26.26],[20.7,-26.34],[20.63,-26.44],[20.62,-26.58],[20.64,-26.74],[20.69,-26.82],[20.74,-26.85],[20.87,-26.81],[20.95,-26.82],[21.07,-26.85],[21.45,-26.83],[21.5,-26.84],[21.65,-26.85],[21.69,-26.84],[21.74,-26.81],[21.79,-26.71],[21.83,-26.68],[21.91,-26.66],[22.01,-26.64],[22.09,-26.58],[22.22,-26.39],[22.47,-26.22],[22.55,-26.18],[22.6,-26.13],[22.64,-26.07],[22.73,-25.86],[22.8,-25.68],[22.82,-25.6],[22.88,-25.46],[22.95,-25.37],[23.02,-25.32],[23.06,-25.31],[23.15,-25.29],[23.27,-25.27],[23.39,-25.29],[23.52,-25.34],[23.67,-25.43],[23.82,-25.54],[23.89,-25.6],[23.97,-25.63],[24.1,-25.63],[24.19,-25.63],[24.33,-25.74],[24.4,-25.75],[24.56,-25.78],[24.75,-25.82],[24.87,-25.81],[25.0,-25.75],[25.09,-25.75],[25.21,-25.76],[25.35,-25.74],[25.44,-25.71],[25.52,-25.66],[25.58,-25.61],[25.66,-25.44],[25.7,-25.3],[25.77,-25.15],[25.85,-24.94],[25.88,-24.79],[25.91,-24.75],[26.03,-24.7],[26.13,-24.67],[26.4,-24.61],[26.45,-24.58],[26.5,-24.51],[26.62,-24.4],[26.76,-24.3],[26.84,-24.24],[26.97,-23.76],[26.99,-23.7],[27.09,-23.58],[27.15,-23.52],[27.19,-23.52],[27.24,-23.49],[27.31,-23.42],[27.4,-23.38],[27.5,-23.37],[27.56,-23.32],[27.59,-23.25],[27.64,-23.22],[27.72,-23.22],[27.76,-23.2],[27.77,-23.15],[27.81,-23.11],[27.89,-23.07],[27.93,-23.03],[27.94,-22.99],[28.03,-22.87],[28.21,-22.69],[28.38,-22.59],[28.54,-22.57],[28.7,-22.54],[28.84,-22.48],[28.95,-22.4],[29.01,-22.28],[29.13,-22.21],[29.36,-22.19],[29.38,-22.19],[29.66,-22.15],[29.9,-22.18],[30.19,-22.29],[30.46,-22.33],[30.71,-22.3],[30.92,-22.29],[31.07,-22.31],[31.2,-22.34],[31.29,-22.4],[31.29,-22.45],[31.3,-22.48],[31.35,-22.62],[31.42,-22.83],[31.47,-23.02],[31.53,-23.28],[31.53,-23.43],[31.55,-23.48],[31.6,-23.55],[31.68,-23.67],[31.7,-23.74],[31.72,-23.79],[31.8,-23.89],[31.86,-24.04],[31.91,-24.24],[31.95,-24.33],[31.97,-24.38],[31.99,-24.46],[31.98,-24.64],[31.98,-24.84],[31.99,-25.07],[31.99,-25.26],[31.98,-25.36],[31.98,-25.63],[31.92,-25.77],[31.93,-25.89],[31.95,-25.96],[31.92,-25.97],[31.87,-25.98],[31.64,-25.87],[31.42,-25.75],[31.38,-25.74],[31.34,-25.76],[31.21,-25.84],[31.09,-25.98],[31.03,-26.1],[30.95,-26.22],[30.8,-26.41],[30.79,-26.46],[30.79,-26.61],[30.79,-26.76],[30.81,-26.79],[30.88,-26.79],[30.94,-26.92],[31.06,-27.11],[31.27,-27.24],[31.47,-27.3],[31.74,-27.31],[31.96,-27.31],[31.95,-27.17],[31.97,-26.96],[31.99,-26.82],[32.02,-26.81],[32.08,-26.82],[32.11,-26.84],[32.2,-26.83],[32.35,-26.86],[32.48,-26.86],[32.59,-26.86],[32.78,-26.85],[32.89,-26.85],[32.85,-27.08],[32.71,-27.44],[32.66,-27.61],[32.53,-28.2],[32.38,-28.5],[32.29,-28.62],[32.03,-28.84],[31.96,-28.88],[31.89,-28.91],[31.78,-28.94],[31.34,-29.38],[31.17,-29.59],[31.02,-29.9],[30.88,-30.07],[30.66,-30.43],[30.47,-30.71],[30.29,-30.97],[29.97,-31.32],[29.83,-31.42],[29.74,-31.47],[29.48,-31.67],[29.13,-32.0],[28.86,-32.29],[28.45,-32.62],[28.21,-32.77],[27.86,-33.05],[27.76,-33.1],[27.36,-33.36],[27.08,-33.52],[26.61,-33.71],[26.43,-33.76],[25.99,-33.71],[25.81,-33.74],[25.65,-33.85],[25.64,-34.01],[25.57,-34.04],[25.48,-34.03],[25.17,-33.96],[25.0,-33.97],[24.91,-34.06],[24.83,-34.17],[24.6,-34.17],[24.18,-34.06],[23.7,-33.99],[23.59,-33.99],[23.35,-34.07],[23.27,-34.08],[22.93,-34.06],[22.74,-34.01],[22.55,-34.01],[22.41,-34.05],[22.25,-34.07],[21.79,-34.37],[21.55,-34.37],[21.35,-34.41],[21.25,-34.41],[21.06,-34.36],[20.99,-34.37],[20.88,-34.39],[20.77,-34.44],[20.53,-34.46],[20.43,-34.51],[20.02,-34.79],[19.93,-34.77],[19.85,-34.76],[19.63,-34.75],[19.39,-34.61],[19.3,-34.62],[19.32,-34.57],[19.33,-34.49],[19.28,-34.44],[19.24,-34.41],[19.15,-34.42],[19.1,-34.35],[18.95,-34.34],[18.9,-34.36],[18.83,-34.36],[18.83,-34.3],[18.83,-34.25],[18.83,-34.19],[18.81,-34.11],[18.75,-34.08],[18.71,-34.07],[18.61,-34.08],[18.53,-34.09],[18.5,-34.11],[18.46,-34.17],[18.46,-34.35],[18.41,-34.3],[18.35,-34.19],[18.33,-34.07],[18.35,-33.94],[18.47,-33.89],[18.46,-33.8],[18.43,-33.72],[18.31,-33.51],[18.26,-33.42],[18.16,-33.36],[18.07,-33.21],[17.99,-33.15],[17.96,-33.05],[17.88,-32.96],[17.85,-32.83],[17.9,-32.75],[17.97,-32.71],[18.04,-32.78],[18.12,-32.75],[18.25,-32.65],[18.33,-32.5],[18.33,-32.27],[18.31,-32.12],[18.21,-31.74],[18.16,-31.66],[17.94,-31.38],[17.68,-31.02],[17.35,-30.44],[17.19,-30.1],[16.95,-29.4],[16.74,-29.01],[16.48,-28.64],[16.45,-28.62],[16.49,-28.57],[16.63,-28.49],[16.69,-28.46],[16.72,-28.48],[16.76,-28.45],[16.79,-28.39],[16.79,-28.34],[16.81,-28.26],[16.84,-28.22],[16.88,-28.13],[16.93,-28.07],[17.06,-28.03],[17.15,-28.08],[17.19,-28.13],[17.2,-28.2],[17.25,-28.23],[17.31,-28.23],[17.36,-28.27],[17.39,-28.35],[17.38,-28.41],[17.34,-28.45],[17.35,-28.5],[17.4,-28.56],[17.42,-28.62],[17.45,-28.7],[17.62,-28.74],[17.7,-28.77],[17.84,-28.78],[17.98,-28.81],[18.1,-28.87],[18.31,-28.89],[18.6,-28.86],[18.84,-28.87],[19.03,-28.93],[19.16,-28.94],[19.25,-28.9],[19.28,-28.85],[19.27,-28.78],[19.31,-28.73],[19.41,-28.71],[19.48,-28.66],[19.54,-28.57],[19.67,-28.5],[19.88,-28.45],[19.98,-28.45],[19.98,-28.31],[19.98,-27.87],[19.98,-27.42],[19.98,-26.98],[19.98,-26.53],[19.98,-26.09],[19.98,-25.64],[19.98,-25.2],[19.98,-24.78]],[[37.86,-46.94],[37.81,-46.96],[37.61,-46.95],[37.59,-46.91],[37.65,-46.85],[37.68,-46.82],[37.79,-46.84],[37.87,-46.89],[37.89,-46.9],[37.86,-46.94]]]},{"n":"Zambia","r":[[[23.38,-17.64],[23.18,-17.47],[22.96,-17.29],[22.72,-17.08],[22.55,-16.91],[22.46,-16.82],[22.31,-16.69],[22.19,-16.63],[22.15,-16.6],[22.04,-16.26],[21.98,-15.96],[21.98,-15.72],[21.98,-15.4],[21.98,-15.08],[21.98,-14.76],[21.98,-14.44],[21.98,-14.12],[21.98,-13.8],[21.98,-13.48],[21.98,-13.16],[21.98,-13.0],[22.21,-13.0],[22.47,-13.0],[22.74,-13.0],[23.04,-13.0],[23.34,-13.0],[23.64,-13.0],[23.84,-13.0],[23.9,-13.0],[23.96,-12.99],[23.97,-12.96],[23.88,-12.8],[23.89,-12.74],[23.91,-12.64],[23.94,-12.54],[23.99,-12.42],[24.0,-12.35],[23.96,-12.12],[23.96,-11.99],[23.97,-11.85],[23.98,-11.72],[23.97,-11.64],[23.99,-11.59],[24.01,-11.52],[24.03,-11.44],[24.05,-11.41],[24.04,-11.37],[24.03,-11.32],[24.01,-11.18],[23.99,-11.0],[23.97,-10.87],[24.0,-10.88],[24.08,-10.89],[24.12,-10.96],[24.14,-11.03],[24.19,-11.03],[24.32,-11.07],[24.37,-11.13],[24.4,-11.26],[24.38,-11.32],[24.34,-11.37],[24.38,-11.42],[24.47,-11.45],[24.52,-11.44],[24.67,-11.35],[24.73,-11.34],[24.81,-11.32],[24.88,-11.3],[25.08,-11.26],[25.18,-11.24],[25.25,-11.21],[25.29,-11.21],[25.32,-11.24],[25.29,-11.33],[25.28,-11.4],[25.32,-11.55],[25.35,-11.62],[25.41,-11.67],[25.46,-11.7],[25.51,-11.75],[25.62,-11.74],[25.85,-11.82],[25.93,-11.86],[26.03,-11.89],[26.1,-11.9],[26.34,-11.93],[26.43,-11.95],[26.6,-11.97],[26.73,-11.98],[26.82,-11.97],[26.89,-11.94],[26.93,-11.92],[26.95,-11.9],[26.98,-11.82],[27.03,-11.66],[27.05,-11.62],[27.1,-11.59],[27.16,-11.58],[27.2,-11.61],[27.24,-11.78],[27.42,-11.94],[27.49,-12.08],[27.53,-12.2],[27.57,-12.23],[27.64,-12.27],[27.76,-12.28],[27.86,-12.28],[28.07,-12.37],[28.24,-12.43],[28.36,-12.48],[28.41,-12.52],[28.45,-12.58],[28.47,-12.62],[28.51,-12.74],[28.55,-12.84],[28.62,-12.85],[28.67,-12.86],[28.73,-12.93],[28.77,-12.98],[28.86,-13.12],[28.92,-13.21],[28.94,-13.31],[29.01,-13.37],[29.11,-13.4],[29.2,-13.4],[29.25,-13.37],[29.38,-13.32],[29.48,-13.27],[29.55,-13.25],[29.6,-13.26],[29.63,-13.3],[29.65,-13.37],[29.65,-13.41],[29.72,-13.45],[29.78,-13.44],[29.8,-13.39],[29.8,-13.37],[29.8,-13.17],[29.8,-12.99],[29.8,-12.83],[29.8,-12.63],[29.8,-12.45],[29.8,-12.31],[29.8,-12.16],[29.75,-12.16],[29.69,-12.2],[29.56,-12.2],[29.51,-12.23],[29.49,-12.27],[29.5,-12.32],[29.5,-12.39],[29.49,-12.42],[29.43,-12.43],[29.34,-12.4],[29.19,-12.37],[29.06,-12.35],[28.97,-12.26],[28.85,-12.12],[28.77,-12.05],[28.57,-11.91],[28.54,-11.88],[28.48,-11.81],[28.43,-11.7],[28.41,-11.62],[28.38,-11.57],[28.36,-11.48],[28.4,-11.35],[28.47,-11.11],[28.52,-10.93],[28.54,-10.8],[28.64,-10.67],[28.65,-10.55],[28.61,-10.4],[28.62,-10.31],[28.62,-10.1],[28.63,-9.92],[28.63,-9.83],[28.6,-9.68],[28.54,-9.51],[28.4,-9.28],[28.4,-9.22],[28.48,-9.17],[28.62,-9.07],[28.68,-9.01],[28.76,-8.93],[28.79,-8.89],[28.87,-8.79],[28.92,-8.7],[28.93,-8.59],[28.9,-8.49],[28.97,-8.46],[29.22,-8.43],[29.48,-8.39],[29.77,-8.34],[30.05,-8.3],[30.33,-8.26],[30.58,-8.22],[30.75,-8.19],[30.78,-8.27],[30.83,-8.39],[30.89,-8.47],[30.97,-8.55],[31.03,-8.6],[31.08,-8.61],[31.35,-8.61],[31.45,-8.65],[31.53,-8.71],[31.56,-8.81],[31.61,-8.86],[31.67,-8.91],[31.7,-8.91],[31.74,-8.9],[31.82,-8.9],[31.89,-8.92],[31.92,-8.94],[31.92,-9.02],[31.94,-9.05],[32.04,-9.07],[32.13,-9.07],[32.22,-9.13],[32.32,-9.13],[32.43,-9.16],[32.49,-9.21],[32.61,-9.27],[32.76,-9.32],[32.86,-9.38],[32.92,-9.41],[32.92,-9.43],[32.95,-9.48],[32.98,-9.52],[32.98,-9.57],[33.0,-9.62],[33.04,-9.64],[33.07,-9.64],[33.1,-9.6],[33.15,-9.6],[33.2,-9.63],[33.21,-9.68],[33.25,-9.76],[33.31,-9.81],[33.35,-9.86],[33.34,-9.95],[33.31,-10.04],[33.39,-10.12],[33.5,-10.2],[33.53,-10.23],[33.54,-10.35],[33.55,-10.39],[33.63,-10.49],[33.66,-10.55],[33.66,-10.59],[33.46,-10.78],[33.4,-10.8],[33.34,-10.81],[33.29,-10.85],[33.26,-10.89],[33.27,-10.92],[33.29,-10.98],[33.34,-11.09],[33.38,-11.16],[33.35,-11.25],[33.27,-11.4],[33.23,-11.42],[33.23,-11.53],[33.25,-11.58],[33.29,-11.61],[33.3,-11.69],[33.31,-11.8],[33.3,-11.89],[33.25,-12.11],[33.34,-12.31],[33.37,-12.33],[33.49,-12.33],[33.51,-12.35],[33.48,-12.4],[33.43,-12.46],[33.4,-12.49],[33.24,-12.56],[33.02,-12.63],[32.98,-12.7],[32.95,-12.8],[32.97,-12.86],[33.0,-12.9],[32.99,-12.99],[32.97,-13.08],[32.98,-13.16],[32.97,-13.22],[32.94,-13.26],[32.9,-13.36],[32.85,-13.46],[32.81,-13.5],[32.76,-13.55],[32.67,-13.59],[32.67,-13.61],[32.77,-13.66],[32.8,-13.69],[32.81,-13.71],[32.79,-13.73],[32.77,-13.76],[32.81,-13.79],[32.87,-13.82],[32.92,-13.88],[32.97,-13.98],[32.98,-14.01],[32.99,-14.02],[33.01,-14.02],[33.04,-14.01],[33.1,-13.96],[33.15,-13.94],[33.2,-14.01],[32.99,-14.08],[32.87,-14.12],[32.55,-14.23],[32.27,-14.32],[32.2,-14.34],[32.05,-14.39],[31.98,-14.41],[31.73,-14.5],[31.62,-14.54],[31.54,-14.58],[31.33,-14.64],[31.13,-14.69],[30.92,-14.75],[30.67,-14.82],[30.54,-14.87],[30.45,-14.91],[30.23,-14.99],[30.22,-15.01],[30.22,-15.07],[30.25,-15.18],[30.31,-15.29],[30.35,-15.35],[30.38,-15.51],[30.4,-15.64],[30.25,-15.64],[29.99,-15.64],[29.73,-15.64],[29.49,-15.7],[29.29,-15.78],[29.05,-15.9],[28.97,-15.95],[28.91,-15.99],[28.88,-16.04],[28.86,-16.14],[28.86,-16.31],[28.83,-16.42],[28.76,-16.53],[28.76,-16.53],[28.4,-16.66],[28.16,-16.77],[27.93,-16.9],[27.76,-17.06],[27.64,-17.26],[27.44,-17.51],[27.24,-17.73],[27.02,-17.96],[26.78,-18.04],[26.58,-18.02],[26.33,-17.93],[26.14,-17.91],[26.0,-17.97],[25.86,-17.95],[25.74,-17.86],[25.64,-17.82],[25.56,-17.85],[25.45,-17.85],[25.26,-17.79],[25.09,-17.63],[25.0,-17.57],[24.93,-17.54],[24.73,-17.52],[24.27,-17.48],[24.23,-17.49],[24.04,-17.52],[23.8,-17.56],[23.59,-17.6],[23.38,-17.64]]]},{"n":"Zimbabwe","r":[[[29.36,-22.19],[29.32,-22.16],[29.24,-22.08],[29.11,-22.07],[29.07,-22.05],[29.04,-22.02],[29.02,-21.98],[29.02,-21.94],[29.04,-21.81],[29.03,-21.8],[28.99,-21.78],[28.92,-21.77],[28.75,-21.71],[28.53,-21.65],[28.18,-21.59],[28.05,-21.57],[28.01,-21.55],[27.97,-21.51],[27.91,-21.36],[27.84,-21.26],[27.69,-21.11],[27.67,-21.06],[27.68,-20.94],[27.69,-20.85],[27.7,-20.77],[27.7,-20.69],[27.69,-20.59],[27.7,-20.53],[27.68,-20.5],[27.62,-20.48],[27.47,-20.47],[27.28,-20.48],[27.27,-20.38],[27.26,-20.23],[27.22,-20.15],[27.18,-20.1],[27.09,-20.05],[26.92,-19.99],[26.68,-19.89],[26.47,-19.75],[26.24,-19.57],[26.17,-19.54],[26.08,-19.37],[25.95,-19.08],[25.96,-18.99],[25.94,-18.94],[25.81,-18.8],[25.78,-18.72],[25.76,-18.65],[25.56,-18.44],[25.49,-18.35],[25.44,-18.23],[25.38,-18.14],[25.34,-18.1],[25.28,-18.04],[25.24,-17.97],[25.22,-17.92],[25.24,-17.84],[25.26,-17.79],[25.45,-17.85],[25.56,-17.85],[25.64,-17.82],[25.74,-17.86],[25.86,-17.95],[26.0,-17.97],[26.14,-17.91],[26.33,-17.93],[26.58,-18.02],[26.78,-18.04],[27.02,-17.96],[27.24,-17.73],[27.44,-17.51],[27.64,-17.26],[27.76,-17.06],[27.93,-16.9],[28.16,-16.77],[28.4,-16.66],[28.76,-16.53],[28.76,-16.53],[28.83,-16.42],[28.86,-16.31],[28.86,-16.14],[28.88,-16.04],[28.91,-15.99],[28.97,-15.95],[29.05,-15.9],[29.29,-15.78],[29.49,-15.7],[29.73,-15.64],[29.99,-15.64],[30.25,-15.64],[30.4,-15.64],[30.4,-15.8],[30.41,-15.98],[30.44,-16.0],[30.63,-16.0],[30.94,-16.01],[31.24,-16.02],[31.43,-16.15],[31.49,-16.18],[31.69,-16.21],[31.94,-16.43],[32.24,-16.45],[32.45,-16.52],[32.64,-16.59],[32.74,-16.68],[32.81,-16.7],[32.9,-16.7],[32.95,-16.71],[32.94,-16.78],[32.88,-16.88],[32.88,-17.04],[32.97,-17.25],[32.98,-17.44],[32.95,-17.77],[32.96,-18.08],[32.96,-18.2],[32.98,-18.27],[33.0,-18.31],[32.99,-18.36],[32.94,-18.49],[32.9,-18.63],[32.9,-18.69],[32.88,-18.73],[32.85,-18.76],[32.72,-18.83],[32.7,-18.87],[32.7,-18.94],[32.72,-19.0],[32.77,-19.02],[32.83,-19.06],[32.85,-19.1],[32.85,-19.15],[32.83,-19.24],[32.78,-19.39],[32.83,-19.56],[32.89,-19.67],[32.97,-19.8],[33.01,-19.87],[33.0,-19.93],[32.99,-19.98],[32.87,-20.22],[32.78,-20.36],[32.67,-20.52],[32.53,-20.61],[32.49,-20.66],[32.48,-20.71],[32.48,-20.83],[32.48,-20.95],[32.35,-21.14],[32.43,-21.3],[32.41,-21.31],[32.37,-21.33],[32.19,-21.52],[32.02,-21.7],[31.89,-21.83],[31.74,-21.98],[31.57,-22.15],[31.43,-22.3],[31.29,-22.4],[31.2,-22.34],[31.07,-22.31],[30.92,-22.29],[30.71,-22.3],[30.46,-22.33],[30.19,-22.29],[29.9,-22.18],[29.66,-22.15],[29.38,-22.19],[29.36,-22.19]]]}] diff --git a/Source/NETworkManager/Resources/Styles/ButtonStyles.xaml b/Source/NETworkManager/Resources/Styles/ButtonStyles.xaml index 3680bb1bb6..2af71e7374 100644 --- a/Source/NETworkManager/Resources/Styles/ButtonStyles.xaml +++ b/Source/NETworkManager/Resources/Styles/ButtonStyles.xaml @@ -45,26 +45,26 @@ - - diff --git a/Source/NETworkManager/Resources/Styles/ChildWindowStyles.xaml b/Source/NETworkManager/Resources/Styles/ChildWindowStyles.xaml new file mode 100644 index 0000000000..0840efad21 --- /dev/null +++ b/Source/NETworkManager/Resources/Styles/ChildWindowStyles.xaml @@ -0,0 +1,16 @@ + + + diff --git a/Source/NETworkManager/Resources/Styles/ComboBoxStyles.xaml b/Source/NETworkManager/Resources/Styles/ComboBoxStyles.xaml index 0f64e2bfb2..792cf30b8d 100644 --- a/Source/NETworkManager/Resources/Styles/ComboBoxStyles.xaml +++ b/Source/NETworkManager/Resources/Styles/ComboBoxStyles.xaml @@ -1,11 +1,11 @@  + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"> diff --git a/Source/NETworkManager/Resources/Styles/ContextMenuStyles.xaml b/Source/NETworkManager/Resources/Styles/ContextMenuStyles.xaml index 0074322025..fc1583cf8d 100644 --- a/Source/NETworkManager/Resources/Styles/ContextMenuStyles.xaml +++ b/Source/NETworkManager/Resources/Styles/ContextMenuStyles.xaml @@ -1,6 +1,7 @@  - + + - - - + + - - + - + + + + + + + + + - + \ No newline at end of file diff --git a/Source/NETworkManager/StatusWindow.xaml.cs b/Source/NETworkManager/StatusWindow.xaml.cs index 7e639e84d3..2fdd16828a 100644 --- a/Source/NETworkManager/StatusWindow.xaml.cs +++ b/Source/NETworkManager/StatusWindow.xaml.cs @@ -1,110 +1,222 @@ -using MahApps.Metro.Controls; +using NETworkManager.Settings; using NETworkManager.Utilities; using NETworkManager.Views; +using System; using System.ComponentModel; +using System.Diagnostics; using System.Runtime.CompilerServices; +using System.Threading.Tasks; using System.Windows.Forms; using System.Windows.Input; +using System.Windows.Threading; -namespace NETworkManager +namespace NETworkManager; + +public partial class StatusWindow : INotifyPropertyChanged { - public partial class StatusWindow : MetroWindow, INotifyPropertyChanged + #region Constructor + + public StatusWindow(MainWindow mainWindow) { - #region PropertyChangedEventHandler - public event PropertyChangedEventHandler PropertyChanged; + InitializeComponent(); + DataContext = this; - protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } - #endregion + Title = $"NETworkManager {AssemblyManager.Current.Version} - {Localization.Resources.Strings.NetworkStatus}"; - #region Variables - private MainWindow _mainWindow; - private NetworkConnectionView _networkConnectionView; - #endregion + _mainWindow = mainWindow; - #region Constructor - public StatusWindow(MainWindow mainWindow) - { - InitializeComponent(); - DataContext = this; + _dispatcherTimerClose.Interval = TimeSpan.FromMilliseconds(33); + _dispatcherTimerClose.Tick += DispatcherTimerTime_Tick; - _mainWindow = mainWindow; + _networkConnectionView = new NetworkConnectionWidgetView(); + ContentControlNetworkConnection.Content = _networkConnectionView; - _networkConnectionView = new NetworkConnectionView(); - ContentControlNetworkConnection.Content = _networkConnectionView; - } - #endregion + // With SizeToContent="Height" the height is only known after layout; re-anchor to the + // bottom-right whenever it changes so the window does not drift to the top of the screen. + SizeChanged += (_, _) => UpdatePosition(); + } - #region ICommands & Actions - public ICommand ReloadCommand => new RelayCommand(p => ReloadAction()); + #endregion - private void ReloadAction() - { - Reload(); - } + #region PropertyChangedEventHandler - public ICommand ShowMainWindowCommand => new RelayCommand(p => ShowMainWindowAction()); + public event PropertyChangedEventHandler PropertyChanged; - private void ShowMainWindowAction() - { - Hide(); + private void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } - if (_mainWindow.ShowWindowCommand.CanExecute(null)) - _mainWindow.ShowWindowCommand.Execute(null); - } + #endregion - public ICommand CloseCommand => new RelayCommand(p => CloseAction()); + #region Variables - private void CloseAction() - { - Hide(); - } + private readonly DispatcherTimer _dispatcherTimerClose = new(DispatcherPriority.Render); + private readonly Stopwatch _stopwatch = new(); - #endregion + private readonly MainWindow _mainWindow; + private readonly NetworkConnectionWidgetView _networkConnectionView; - #region Methods - private void Reload() + public bool ShowTime + { + get; + set { - _networkConnectionView.Reload(); + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - /// - /// Show the window on the screen. - /// - /// Focus the window (will automatically hide if the focus is lost). - public void ShowWindow(bool activate) + public double TimeMax + { + get; + private set { - // Show on primary screen in left/bottom corner - // ToDo: User setting... - Left = Screen.PrimaryScreen.WorkingArea.Right - Width - 10; - Top = Screen.PrimaryScreen.WorkingArea.Bottom - Height - 10; + if (value == field) + return; - Show(); + field = value; + OnPropertyChanged(); + } + } - if (activate) - Activate(); + public double Time + { + get; + set + { + // Same guard as NotificationWindow.TimeRemaining: ignore sub-0.001 changes so the + // countdown updates at the same cadence in both windows. + if (Math.Abs(value - field) < 0.001) + return; - Topmost = true; + field = value; + OnPropertyChanged(); } - #endregion + } + + #endregion + + #region ICommands & Actions + + public ICommand ShowMainWindowCommand => new RelayCommand(_ => ShowMainWindowAction()); + + private void ShowMainWindowAction() + { + Hide(); + + if (_mainWindow.ShowWindowCommand.CanExecute(null)) + _mainWindow.ShowWindowCommand.Execute(null); + } + + public ICommand CloseCommand => new RelayCommand(_ => CloseAction()); + + private void CloseAction() + { + Hide(); + } - #region Events - private void MetroWindow_Deactivated(object sender, System.EventArgs e) + #endregion + + #region Methods + + private void Check() + { + _networkConnectionView.Check(); + } + + /// + /// Show the window on the screen. + /// + /// Automatically close the window after a certain time. + public void ShowWindow(bool enableCloseTimer = false) + { + // Position bottom-right on the primary screen. With SizeToContent="Height" the final + // height is only known after layout, so this is refined again in SizeChanged. + UpdatePosition(); + + // Show the window + Show(); + + // Check the network connection + Check(); + + // Close the window after a certain time + if (enableCloseTimer) { - Hide(); + SetupCloseTimer(); + return; } - private void MetroWindow_Closing(object sender, CancelEventArgs e) - { - e.Cancel = true; + // Focus the window + Activate(); + } - Hide(); - } + /// + /// Anchors the window to the bottom-right corner of the primary screen. Uses + /// (not Height, which is NaN while + /// SizeToContent is active) so the window stays bottom-anchored as its height changes. + /// + private void UpdatePosition() + { + // ToDo: User setting... + if (Screen.PrimaryScreen == null) + return; + + var scaleFactor = System.Windows.Media.VisualTreeHelper.GetDpi(this).DpiScaleX; + + Left = Screen.PrimaryScreen.WorkingArea.Right / scaleFactor - Width - 10; + Top = Screen.PrimaryScreen.WorkingArea.Bottom / scaleFactor - ActualHeight - 10; + } + + private void SetupCloseTimer() + { + TimeMax = SettingsManager.Current.Status_WindowCloseTime; + Time = TimeMax; + + _stopwatch.Restart(); + ShowTime = true; + _dispatcherTimerClose.Start(); + } - #endregion + #endregion + #region Events + private void MetroWindow_Deactivated(object sender, EventArgs e) + { + Hide(); } + + private void MetroWindow_Closing(object sender, CancelEventArgs e) + { + e.Cancel = true; + + Hide(); + } + + private async void DispatcherTimerTime_Tick(object sender, EventArgs e) + { + // Use a local for the close decision — the Time setter now ignores sub-0.001 changes, so + // reading the property back could stay stuck at a tiny positive value and never hide. + var remaining = Math.Max(0.0, TimeMax - _stopwatch.Elapsed.TotalSeconds); + Time = remaining; + + if (remaining > 0) + return; + + _dispatcherTimerClose.Stop(); + _stopwatch.Stop(); + + await Task.Delay(250); + + ShowTime = false; + + Hide(); + } + + #endregion } diff --git a/Source/NETworkManager/ViewModels/ARPTableAddEntryViewModel.cs b/Source/NETworkManager/ViewModels/ARPTableAddEntryViewModel.cs deleted file mode 100644 index 17ac633f71..0000000000 --- a/Source/NETworkManager/ViewModels/ARPTableAddEntryViewModel.cs +++ /dev/null @@ -1,47 +0,0 @@ -using NETworkManager.Utilities; -using System; -using System.Windows.Input; - -namespace NETworkManager.ViewModels -{ - public class ArpTableAddEntryViewModel : ViewModelBase - { - public ICommand AddCommand { get; } - - public ICommand CancelCommand { get; } - - private string _ipAddress; - public string IPAddress - { - get => _ipAddress; - set - { - if (value == _ipAddress) - return; - - _ipAddress = value; - OnPropertyChanged(); - } - } - - private string _macAddress; - public string MACAddress - { - get => _macAddress; - set - { - if (value == _macAddress) - return; - - _macAddress = value; - OnPropertyChanged(); - } - } - - public ArpTableAddEntryViewModel(Action addCommand, Action cancelHandler) - { - AddCommand = new RelayCommand(p => addCommand(this)); - CancelCommand = new RelayCommand(p => cancelHandler(this)); - } - } -} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/ARPTableViewModel.cs b/Source/NETworkManager/ViewModels/ARPTableViewModel.cs deleted file mode 100644 index cead72a843..0000000000 --- a/Source/NETworkManager/ViewModels/ARPTableViewModel.cs +++ /dev/null @@ -1,483 +0,0 @@ -using NETworkManager.Models.Network; -using System; -using System.Collections; -using System.Windows.Input; -using System.ComponentModel; -using System.Windows.Data; -using System.Collections.ObjectModel; -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.Views; -using NETworkManager.Utilities; -using NETworkManager.Settings; -using System.Windows.Threading; -using System.Linq; -using System.Windows; -using MahApps.Metro.Controls; -using NETworkManager.Models.Export; -using System.Threading.Tasks; - -namespace NETworkManager.ViewModels -{ - public class ARPTableViewModel : ViewModelBase - { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - - private readonly bool _isLoading; - private readonly DispatcherTimer _autoRefreshTimer = new DispatcherTimer(); - private bool _isTimerPaused; - - private string _search; - public string Search - { - get => _search; - set - { - if (value == _search) - return; - - _search = value; - - ARPInfoResultsView.Refresh(); - - OnPropertyChanged(); - } - } - - private ObservableCollection _arpInfoResults = new ObservableCollection(); - public ObservableCollection ARPInfoResults - { - get => _arpInfoResults; - set - { - if (value == _arpInfoResults) - return; - - _arpInfoResults = value; - OnPropertyChanged(); - } - } - - public ICollectionView ARPInfoResultsView { get; } - - private ARPInfo _selectedARPInfo; - public ARPInfo SelectedARPInfo - { - get => _selectedARPInfo; - set - { - if (value == _selectedARPInfo) - return; - - _selectedARPInfo = value; - OnPropertyChanged(); - } - } - - private IList _selectedARPInfos = new ArrayList(); - public IList SelectedARPInfos - { - get => _selectedARPInfos; - set - { - if (Equals(value, _selectedARPInfos)) - return; - - _selectedARPInfos = value; - OnPropertyChanged(); - } - } - - private bool _autoRefresh; - public bool AutoRefresh - { - get => _autoRefresh; - set - { - if (value == _autoRefresh) - return; - - if (!_isLoading) - SettingsManager.Current.ARPTable_AutoRefresh = value; - - _autoRefresh = value; - - // Start timer to refresh automatically - if (!_isLoading) - { - if (value) - StartAutoRefreshTimer(); - else - StopAutoRefreshTimer(); - } - - OnPropertyChanged(); - } - } - - public ICollectionView AutoRefreshTimes { get; } - - private AutoRefreshTimeInfo _selectedAutoRefreshTime; - public AutoRefreshTimeInfo SelectedAutoRefreshTime - { - get => _selectedAutoRefreshTime; - set - { - if (value == _selectedAutoRefreshTime) - return; - - if (!_isLoading) - SettingsManager.Current.ARPTable_AutoRefreshTime = value; - - _selectedAutoRefreshTime = value; - - if (AutoRefresh) - ChangeAutoRefreshTimerInterval(AutoRefreshTime.CalculateTimeSpan(value)); - - OnPropertyChanged(); - } - } - - private bool _isRefreshing; - public bool IsRefreshing - { - get => _isRefreshing; - set - { - if (value == _isRefreshing) - return; - - _isRefreshing = value; - OnPropertyChanged(); - } - } - - private bool _isStatusMessageDisplayed; - public bool IsStatusMessageDisplayed - { - get => _isStatusMessageDisplayed; - set - { - if (value == _isStatusMessageDisplayed) - return; - - _isStatusMessageDisplayed = value; - OnPropertyChanged(); - } - } - - private string _statusMessage; - public string StatusMessage - { - get => _statusMessage; - set - { - if (value == _statusMessage) - return; - - _statusMessage = value; - OnPropertyChanged(); - } - } - #endregion - - #region Contructor, load settings - public ARPTableViewModel(IDialogCoordinator instance) - { - _isLoading = true; - _dialogCoordinator = instance; - - // Result view + search - ARPInfoResultsView = CollectionViewSource.GetDefaultView(ARPInfoResults); - ARPInfoResultsView.SortDescriptions.Add(new SortDescription(nameof(ARPInfo.IPAddressInt32), ListSortDirection.Ascending)); - ARPInfoResultsView.Filter = o => - { - if (!(o is ARPInfo info)) - return false; - - if (string.IsNullOrEmpty(Search)) - return true; - - // Search by IPAddress and MACAddress - return info.IPAddress.ToString().IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || info.MACAddress.ToString().IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || (info.IsMulticast ? Localization.Resources.Strings.Yes : Localization.Resources.Strings.No).IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1; - }; - - AutoRefreshTimes = CollectionViewSource.GetDefaultView(AutoRefreshTime.GetDefaults); - SelectedAutoRefreshTime = AutoRefreshTimes.SourceCollection.Cast().FirstOrDefault(x => (x.Value == SettingsManager.Current.ARPTable_AutoRefreshTime.Value && x.TimeUnit == SettingsManager.Current.ARPTable_AutoRefreshTime.TimeUnit)); - - _autoRefreshTimer.Tick += AutoRefreshTimer_Tick; - - LoadSettings(); - - _isLoading = false; - - Run(); - } - - private async Task Run() - { - await Refresh(); - - if (AutoRefresh) - StartAutoRefreshTimer(); - } - - private void LoadSettings() - { - AutoRefresh = SettingsManager.Current.ARPTable_AutoRefresh; - } - #endregion - - #region ICommands & Actions - public ICommand RefreshCommand => new RelayCommand(p => RefreshAction(), Refresh_CanExecute); - - private bool Refresh_CanExecute(object paramter) - { - return Application.Current.MainWindow != null && !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen; - } - - private async Task RefreshAction() - { - IsStatusMessageDisplayed = false; - - await Refresh(); - } - - public ICommand DeleteTableCommand => new RelayCommand(p => DeleteTableAction(), DeleteTable_CanExecute); - - private bool DeleteTable_CanExecute(object paramter) - { - return Application.Current.MainWindow != null && !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen; - } - - private async Task DeleteTableAction() - { - IsStatusMessageDisplayed = false; - - try - { - var arpTable = new ARP(); - - arpTable.UserHasCanceled += ArpTable_UserHasCanceled; - - await arpTable.DeleteTableAsync(); - - await Refresh(); - } - catch (Exception ex) - { - StatusMessage = ex.Message; - IsStatusMessageDisplayed = true; - } - } - - public ICommand DeleteEntryCommand => new RelayCommand(p => DeleteEntryAction(), DeleteEntry_CanExecute); - - private bool DeleteEntry_CanExecute(object paramter) => Application.Current.MainWindow != null && !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen; - - private async Task DeleteEntryAction() - { - IsStatusMessageDisplayed = false; - - try - { - var arpTable = new ARP(); - - arpTable.UserHasCanceled += ArpTable_UserHasCanceled; - - await arpTable.DeleteEntryAsync(SelectedARPInfo.IPAddress.ToString()); - - await Refresh(); - } - catch (Exception ex) - { - StatusMessage = ex.Message; - IsStatusMessageDisplayed = true; - } - } - - public ICommand AddEntryCommand => new RelayCommand(p => AddEntryAction(), AddEntry_CanExecute); - - private bool AddEntry_CanExecute(object paramter) => Application.Current.MainWindow != null && !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen; - - private async Task AddEntryAction() - { - IsStatusMessageDisplayed = false; - - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.AddEntry - }; - - var arpTableAddEntryViewModel = new ArpTableAddEntryViewModel(async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - - try - { - var arpTable = new ARP(); - - arpTable.UserHasCanceled += ArpTable_UserHasCanceled; - - await arpTable.AddEntryAsync(instance.IPAddress, MACAddressHelper.Format(instance.MACAddress, "-")); - - await Refresh(); - } - catch (Exception ex) - { - StatusMessage = ex.Message; - IsStatusMessageDisplayed = true; - } - }, instance => - { - _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - }); - - customDialog.Content = new ARPTableAddEntryDialog - { - DataContext = arpTableAddEntryViewModel - }; - - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } - - public ICommand CopySelectedIPAddressCommand => new RelayCommand(p => CopySelectedIPAddressAction()); - - private void CopySelectedIPAddressAction() - { - ClipboardHelper.SetClipboard(SelectedARPInfo.IPAddress.ToString()); - } - - public ICommand CopySelectedMACAddressCommand => new RelayCommand(p => CopySelectedMACAddressAction()); - - private void CopySelectedMACAddressAction() - { - ClipboardHelper.SetClipboard(MACAddressHelper.GetDefaultFormat(SelectedARPInfo.MACAddress.ToString())); - } - - public ICommand CopySelectedMulticastCommand => new RelayCommand(p => CopySelectedMulticastAction()); - - private void CopySelectedMulticastAction() - { - ClipboardHelper.SetClipboard(SelectedARPInfo.IsMulticast ? Localization.Resources.Strings.Yes : Localization.Resources.Strings.No); - } - - public ICommand ExportCommand => new RelayCommand(p => ExportAction()); - - private async Task ExportAction() - { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.Export - }; - - var exportViewModel = new ExportViewModel(async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - - try - { - ExportManager.Export(instance.FilePath, instance.FileType, instance.ExportAll ? ARPInfoResults : new ObservableCollection(SelectedARPInfos.Cast().ToArray())); - } - catch (Exception ex) - { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Localization.Resources.Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Error, Localization.Resources.Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); - } - - SettingsManager.Current.ARPTable_ExportFileType = instance.FileType; - SettingsManager.Current.ARPTable_ExportFilePath = instance.FilePath; - }, instance => { _dialogCoordinator.HideMetroDialogAsync(this, customDialog); }, new ExportManager.ExportFileType[] { ExportManager.ExportFileType.CSV, ExportManager.ExportFileType.XML, ExportManager.ExportFileType.JSON }, true, SettingsManager.Current.ARPTable_ExportFileType, SettingsManager.Current.ARPTable_ExportFilePath); - - customDialog.Content = new ExportDialog - { - DataContext = exportViewModel - }; - - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } - #endregion - - #region Methods - private async Task Refresh() - { - IsRefreshing = true; - - ARPInfoResults.Clear(); - - (await ARP.GetTableAsync()).ForEach(x => ARPInfoResults.Add(x)); - - IsRefreshing = false; - } - - private void ChangeAutoRefreshTimerInterval(TimeSpan timeSpan) - { - _autoRefreshTimer.Interval = timeSpan; - } - - private void StartAutoRefreshTimer() - { - ChangeAutoRefreshTimerInterval(AutoRefreshTime.CalculateTimeSpan(SelectedAutoRefreshTime)); - - _autoRefreshTimer.Start(); - } - - private void StopAutoRefreshTimer() - { - _autoRefreshTimer.Stop(); - } - - private void PauseAutoRefreshTimer() - { - if (!_autoRefreshTimer.IsEnabled) - return; - - _autoRefreshTimer.Stop(); - - _isTimerPaused = true; - } - - private void ResumeAutoRefreshTimer() - { - if (!_isTimerPaused) - return; - - _autoRefreshTimer.Start(); - - _isTimerPaused = false; - } - - public void OnViewHide() - { - PauseAutoRefreshTimer(); - } - - public void OnViewVisible() - { - ResumeAutoRefreshTimer(); - } - #endregion - - #region Events - private void ArpTable_UserHasCanceled(object sender, EventArgs e) - { - StatusMessage = Localization.Resources.Strings.CanceledByUserMessage; - IsStatusMessageDisplayed = true; - } - - private async void AutoRefreshTimer_Tick(object sender, EventArgs e) - { - // Stop timer... - _autoRefreshTimer.Stop(); - - // Refresh - await Refresh(); - - // Restart timer... - _autoRefreshTimer.Start(); - } - #endregion - } -} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/AboutViewModel.cs b/Source/NETworkManager/ViewModels/AboutViewModel.cs index 8d04444ea5..b591eb4e54 100644 --- a/Source/NETworkManager/ViewModels/AboutViewModel.cs +++ b/Source/NETworkManager/ViewModels/AboutViewModel.cs @@ -1,230 +1,339 @@ -using NETworkManager.Settings; -using System.Windows.Input; -using System.Diagnostics; +using NETworkManager.Documentation; +using NETworkManager.Localization.Resources; +using NETworkManager.Properties; +using NETworkManager.Settings; using NETworkManager.Update; +using NETworkManager.Utilities; using System; using System.ComponentModel; +using System.Diagnostics; +using System.Threading.Tasks; using System.Windows.Data; -using NETworkManager.Localization.Resources; -using NETworkManager.Utilities; -using NETworkManager.Documentation; +using System.Windows.Input; + +namespace NETworkManager.ViewModels; -namespace NETworkManager.ViewModels +/// +/// View model for the About view. +/// +public class AboutViewModel : ViewModelBase { - public class AboutViewModel : ViewModelBase + #region Constructor + + /// + /// Initializes a new instance of the class. + /// + public AboutViewModel() { - #region Variables - public string Version => $"{Strings.Version} {AssemblyManager.Current.Version}"; - public string DevelopedByText => string.Format(Strings.DevelopedAndMaintainedByX + " ", Properties.Resources.NETworkManager_GitHub_User); + LibrariesView = CollectionViewSource.GetDefaultView(LibraryManager.List); + LibrariesView.SortDescriptions.Add(new SortDescription(nameof(LibraryInfo.Name), ListSortDirection.Ascending)); - private bool _isUpdateCheckRunning; - public bool IsUpdateCheckRunning - { - get => _isUpdateCheckRunning; - set - { - if (value == _isUpdateCheckRunning) - return; - - _isUpdateCheckRunning = value; - OnPropertyChanged(); - } - } + ExternalServicesView = CollectionViewSource.GetDefaultView(ExternalServicesManager.List); + ExternalServicesView.SortDescriptions.Add(new SortDescription(nameof(ExternalServicesInfo.Name), + ListSortDirection.Ascending)); + + ResourcesView = CollectionViewSource.GetDefaultView(ResourceManager.List); + ResourcesView.SortDescriptions.Add(new SortDescription(nameof(ResourceInfo.Name), ListSortDirection.Ascending)); + } + + #endregion + + #region Methods + + /// + /// Checks for updates asynchronously. + /// + private async Task CheckForUpdatesAsync() + { + IsUpdateAvailable = false; + ShowUpdaterMessage = false; + + IsUpdateCheckRunning = true; + + // Show a loading animation for the user + await Task.Delay(GlobalStaticConfiguration.ApplicationUIRefreshInterval); + + var updater = new Updater(); + + updater.UpdateAvailable += Updater_UpdateAvailable; + updater.NoUpdateAvailable += Updater_NoUpdateAvailable; + updater.Error += Updater_Error; - private bool _updateAvailable; - public bool UpdateAvailable + updater.CheckOnGitHub(Resources.NETworkManager_GitHub_User, Resources.NETworkManager_GitHub_Repo, + AssemblyManager.Current.Version, SettingsManager.Current.Update_CheckForPreReleases); + } + + #endregion + + #region Variables + + /// + /// Gets the application version string. + /// + public string Version => $"{Strings.Version} {AssemblyManager.Current.Version}"; + + /// + /// Gets the text indicating who developed and maintains the application. + /// + public string DevelopedByText => + string.Format(Strings.DevelopedAndMaintainedByX + " ", Resources.NETworkManager_GitHub_User); + + /// + /// Gets or sets a value indicating whether the update check is currently running. + /// + public bool IsUpdateCheckRunning + { + get; + set { - get => _updateAvailable; - set - { - if (value == _updateAvailable) - return; - - _updateAvailable = value; - OnPropertyChanged(); - } + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - private string _updateText; - public string UpdateText + /// + /// Gets or sets a value indicating whether an update is available. + /// + public bool IsUpdateAvailable + { + get; + set { - get => _updateText; - set - { - if (value == _updateText) - return; - - _updateText = value; - OnPropertyChanged(); - } + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - private bool _showUpdaterMessage; - public bool ShowUpdaterMessage + /// + /// Gets the text describing the available update. + /// + public string UpdateText + { + get; + private set { - get => _showUpdaterMessage; - set - { - if (value == _showUpdaterMessage) - return; - - _showUpdaterMessage = value; - OnPropertyChanged(); - } + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - private string _updaterMessage; - public string UpdaterMessage + /// + /// Gets the URL for the release notes or download page. + /// + public string UpdateReleaseUrl + { + get; + private set { - get => _updaterMessage; - set - { - if (value == _updaterMessage) - return; - - _updaterMessage = value; - OnPropertyChanged(); - } - } + if (value == field) + return; - public ICollectionView LibrariesView { get; } + field = value; + OnPropertyChanged(); + } + } - private LibraryInfo _selectedLibraryInfo; - public LibraryInfo SelectedLibraryInfo + /// + /// Gets or sets a value indicating whether to show a message from the updater. + /// + public bool ShowUpdaterMessage + { + get; + set { - get => _selectedLibraryInfo; - set - { - if (value == _selectedLibraryInfo) - return; - - _selectedLibraryInfo = value; - OnPropertyChanged(); - } - } + if (value == field) + return; - public ICollectionView ExternalServicesView { get; } + field = value; + OnPropertyChanged(); + } + } - private ExternalServicesInfo _selectedExternalServicesInfo; - public ExternalServicesInfo SelectedExternalServicesInfo + /// + /// Gets the message from the updater (e.g., no update available, error). + /// + public string UpdaterMessage + { + get; + private set { - get => _selectedExternalServicesInfo; - set - { - if (value == _selectedExternalServicesInfo) - return; - - _selectedExternalServicesInfo = value; - OnPropertyChanged(); - } + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - public ICollectionView ResourcesView { get; } + /// + /// Gets the collection view for the list of used libraries. + /// + public ICollectionView LibrariesView { get; } - private ResourceInfo _selectedResourceInfo; - public ResourceInfo SelectedResourceInfo + /// + /// Gets or sets the currently selected library information. + /// + public LibraryInfo SelectedLibraryInfo + { + get; + set { - get => _selectedResourceInfo; - set - { - if (value == _selectedResourceInfo) - return; - - _selectedResourceInfo = value; - OnPropertyChanged(); - } + if (value == field) + return; + + field = value; + OnPropertyChanged(); } - #endregion + } - #region Constructor - public AboutViewModel() - { - LibrariesView = CollectionViewSource.GetDefaultView(LibraryManager.List); - LibrariesView.SortDescriptions.Add(new SortDescription(nameof(LibraryInfo.Name), ListSortDirection.Ascending)); + /// + /// Gets the collection view for the list of used external services. + /// + public ICollectionView ExternalServicesView { get; } - ExternalServicesView = CollectionViewSource.GetDefaultView(ExternalServicesManager.List); - ExternalServicesView.SortDescriptions.Add(new SortDescription(nameof(ExternalServicesInfo.Name), ListSortDirection.Ascending)); + /// + /// Gets or sets the currently selected external service information. + /// + public ExternalServicesInfo SelectedExternalServicesInfo + { + get; + set + { + if (value == field) + return; - ResourcesView = CollectionViewSource.GetDefaultView(ResourceManager.List); - ResourcesView.SortDescriptions.Add(new SortDescription(nameof(ResourceInfo.Name), ListSortDirection.Ascending)); + field = value; + OnPropertyChanged(); } - #endregion + } - #region Commands & Actions - public ICommand CheckForUpdatesCommand => new RelayCommand(p => CheckForUpdatesAction()); + /// + /// Gets the collection view for the list of used resources. + /// + public ICollectionView ResourcesView { get; } - private void CheckForUpdatesAction() + /// + /// Gets or sets the currently selected resource information. + /// + public ResourceInfo SelectedResourceInfo + { + get; + set { - CheckForUpdates(); + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - public ICommand OpenWebsiteCommand => new RelayCommand(OpenWebsiteAction); + #endregion - private static void OpenWebsiteAction(object url) - { - ExternalProcessStarter.OpenUrl((string)url); - } + #region Commands & Actions - public ICommand OpenDocumentationCommand - { - get { return new RelayCommand(p => OpenDocumentationAction()); } - } + /// + /// Gets the command to check for updates. + /// + public ICommand CheckForUpdatesCommand => new RelayCommand(_ => CheckForUpdatesAction()); - private void OpenDocumentationAction() - { - DocumentationManager.OpenDocumentation(DocumentationIdentifier.Default); - } + /// + /// Action to check for updates. + /// + private void CheckForUpdatesAction() + { + CheckForUpdatesAsync(); + } - public ICommand OpenLicenseFolderCommand => new RelayCommand(p => OpenLicenseFolderAction()); + /// + /// Gets the command to open the website. + /// + public ICommand OpenWebsiteCommand => new RelayCommand(OpenWebsiteAction); - private void OpenLicenseFolderAction() - { - Process.Start("explorer.exe", LibraryManager.GetLicenseLocation()); - } - #endregion + /// + /// Action to open the website. + /// + /// The URL to open. + private static void OpenWebsiteAction(object url) + { + ExternalProcessStarter.OpenUrl((string)url); + } - #region Methods - private void CheckForUpdates() - { - UpdateAvailable = false; - ShowUpdaterMessage = false; + /// + /// Gets the command to open the documentation. + /// + public ICommand OpenDocumentationCommand + { + get { return new RelayCommand(_ => OpenDocumentationAction()); } + } - IsUpdateCheckRunning = true; + /// + /// Action to open the documentation. + /// + private void OpenDocumentationAction() + { + DocumentationManager.OpenDocumentation(DocumentationIdentifier.Default); + } - var updater = new Updater(); + /// + /// Gets the command to open the license folder. + /// + public ICommand OpenLicenseFolderCommand => new RelayCommand(_ => OpenLicenseFolderAction()); - updater.UpdateAvailable += Updater_UpdateAvailable; - updater.NoUpdateAvailable += Updater_NoUpdateAvailable; - updater.Error += Updater_Error; + /// + /// Action to open the license folder. + /// + private void OpenLicenseFolderAction() + { + Process.Start("explorer.exe", LibraryManager.GetLicenseLocation()); + } - updater.CheckOnGitHub(Properties.Resources.NETworkManager_GitHub_User, Properties.Resources.NETworkManager_GitHub_Repo, AssemblyManager.Current.Version); - } - #endregion + #endregion - #region Events - private void Updater_UpdateAvailable(object sender, UpdateAvailableArgs e) - { - UpdateText = string.Format(Strings.VersionxxIsAvailable, e.Version); + #region Events - IsUpdateCheckRunning = false; - UpdateAvailable = true; - } + /// + /// Handles the UpdateAvailable event from the Updater. + /// + private void Updater_UpdateAvailable(object sender, UpdateAvailableArgs e) + { + UpdateText = string.Format(Strings.VersionxxIsAvailable, e.Release.TagName); + UpdateReleaseUrl = e.Release.Prerelease ? e.Release.HtmlUrl : Resources.NETworkManager_LatestReleaseUrl; - private void Updater_NoUpdateAvailable(object sender, EventArgs e) - { - UpdaterMessage = Strings.NoUpdateAvailable; + IsUpdateCheckRunning = false; + IsUpdateAvailable = true; + } - IsUpdateCheckRunning = false; - ShowUpdaterMessage = true; - } + /// + /// Handles the NoUpdateAvailable event from the Updater. + /// + private void Updater_NoUpdateAvailable(object sender, EventArgs e) + { + UpdaterMessage = Strings.NoUpdateAvailable; - private void Updater_Error(object sender, EventArgs e) - { - UpdaterMessage = Strings.ErrorCheckingApiGithubComVerifyYourNetworkConnection; + IsUpdateCheckRunning = false; + ShowUpdaterMessage = true; + } - IsUpdateCheckRunning = false; - ShowUpdaterMessage = true; - } - #endregion + /// + /// Handles the Error event from the Updater. + /// + private void Updater_Error(object sender, EventArgs e) + { + UpdaterMessage = Strings.ErrorCheckingApiGithubComVerifyYourNetworkConnection; + + IsUpdateCheckRunning = false; + ShowUpdaterMessage = true; } -} \ No newline at end of file + + #endregion +} diff --git a/Source/NETworkManager/ViewModels/BitCalculatorSettingsViewModel.cs b/Source/NETworkManager/ViewModels/BitCalculatorSettingsViewModel.cs new file mode 100644 index 0000000000..69dcedd559 --- /dev/null +++ b/Source/NETworkManager/ViewModels/BitCalculatorSettingsViewModel.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NETworkManager.Models.Network; +using NETworkManager.Settings; + +namespace NETworkManager.ViewModels; + +/// +/// View model for the bit calculator settings. +/// +public class BitCalculatorSettingsViewModel : ViewModelBase +{ + #region Variables + + /// + /// Indicates whether the view model is loading. + /// + private readonly bool _isLoading; + + /// + /// Gets the list of available notations. + /// + public List Notations { get; private set; } + + /// + /// Gets or sets the selected notation. + /// + public BitCaluclatorNotation Notation + { + get; + set + { + if (value == field) + return; + + + if (!_isLoading) + SettingsManager.Current.BitCalculator_Notation = value; + + + field = value; + OnPropertyChanged(); + } + } + + #endregion + + #region Constructor, load settings + + /// + /// Initializes a new instance of the class. + /// + public BitCalculatorSettingsViewModel() + { + _isLoading = true; + + LoadSettings(); + + _isLoading = false; + } + + /// + /// Loads the settings. + /// + private void LoadSettings() + { + Notations = Enum.GetValues(typeof(BitCaluclatorNotation)).Cast() + .OrderBy(x => x.ToString()).ToList(); + Notation = Notations.First(x => x == SettingsManager.Current.BitCalculator_Notation); + } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/BitCalculatorViewModel.cs b/Source/NETworkManager/ViewModels/BitCalculatorViewModel.cs new file mode 100644 index 0000000000..01a24481e0 --- /dev/null +++ b/Source/NETworkManager/ViewModels/BitCalculatorViewModel.cs @@ -0,0 +1,305 @@ +using log4net; +using MahApps.Metro.Controls; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Localization.Resources; +using NETworkManager.Models.Export; +using NETworkManager.Models.Network; +using NETworkManager.Settings; +using NETworkManager.Utilities; +using NETworkManager.Views; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Data; +using System.Windows.Input; + +namespace NETworkManager.ViewModels; + +/// +/// View model for the bit calculator view. +/// +public class BitCalculatorViewModel : ViewModelBase +{ + #region Variables + + private static readonly ILog Log = LogManager.GetLogger(typeof(BitCalculatorViewModel)); + + /// + /// Indicates whether the view model is loading. + /// + private readonly bool _isLoading; + + /// + /// Gets or sets the input value. + /// + public string Input + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets the collection view for the input history. + /// + public ICollectionView InputHistoryView { get; } + + /// + /// Gets the list of available units. + /// + public List Units + { + get; + private init + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = new(); + + /// + /// Gets or sets the selected unit. + /// + public BitCaluclatorUnit Unit + { + get; + set + { + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.BitCalculator_Unit = value; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets or sets a value indicating whether the calculation is running. + /// + public bool IsRunning + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets or sets a value indicating whether the result is visible. + /// + public bool IsResultVisible + { + get; + set + { + if (value == field) + return; + + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets the calculation result. + /// + public BitCaluclatorInfo Result + { + get; + private set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = new(); + + #endregion + + #region Constructor, load settings + + /// + /// Initializes a new instance of the class. + /// + public BitCalculatorViewModel() + { + _isLoading = true; + + InputHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.BitCalculator_InputHistory); + + Units = Enum.GetValues(typeof(BitCaluclatorUnit)).Cast().ToList(); + Unit = Units.First(x => x == SettingsManager.Current.BitCalculator_Unit); + + LoadSettings(); + + _isLoading = false; + } + + /// + /// Loads the settings. + /// + private void LoadSettings() + { + } + + #endregion + + #region ICommands & Actions + + /// + /// Gets the command to calculate the result. + /// + public ICommand CalculateCommand => new RelayCommand(_ => CalculateAction(), Calculate_CanExecute); + + /// + /// Checks if the calculate command can be executed. + /// + /// The command parameter. + /// true if the command can be executed; otherwise, false. + private bool Calculate_CanExecute(object parameter) + { + return Application.Current.MainWindow != null && + !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && + !ConfigurationManager.Current.IsChildWindowOpen; + } + + /// + /// Action to calculate the result. + /// + private void CalculateAction() + { + Calculate(); + } + + /// + /// Gets the command to export the result. + /// + public ICommand ExportCommand => new RelayCommand(parameter => { _ = ExportAction(); }); + + /// + /// Action to export the result. + /// + private Task ExportAction() + { + var childWindow = new ExportChildWindow(); + + var childWindowViewModel = new ExportViewModel(async instance => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + try + { + ExportManager.Export(instance.FilePath, instance.FileType, + [Result]); + } + catch (Exception ex) + { + Log.Error("Error while exporting data as " + instance.FileType, ex); + + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); + } + + SettingsManager.Current.BitCalculator_ExportFileType = instance.FileType; + SettingsManager.Current.BitCalculator_ExportFilePath = instance.FilePath; + }, _ => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, [ + ExportFileType.Csv, ExportFileType.Xml, ExportFileType.Json + ], false, SettingsManager.Current.BitCalculator_ExportFileType, + SettingsManager.Current.BitCalculator_ExportFilePath); + + childWindow.Title = Strings.Export; + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } + + #endregion + + #region Methods + + /// + /// Calculates the result based on the input. + /// + private async void Calculate() + { + IsResultVisible = false; + IsRunning = true; + + if (double.TryParse(Input.Replace('.', ','), out var input)) + Result = await BitCaluclator.CalculateAsync(input, Unit, SettingsManager.Current.BitCalculator_Notation); + else + Log.Error($"Could not parse input \"{Input}\" into double!"); + + IsResultVisible = true; + + AddInputToHistory(Input); + + IsRunning = false; + } + + /// + /// Adds the input to the history. + /// + /// The input string. + private void AddInputToHistory(string input) + { + // Create the new list + var list = ListHelper.Modify(SettingsManager.Current.BitCalculator_InputHistory.ToList(), input, + SettingsManager.Current.General_HistoryListEntries); + + // Clear the old items + SettingsManager.Current.BitCalculator_InputHistory.Clear(); + OnPropertyChanged(nameof(Input)); // Raise property changed again, after the collection has been cleared + + // Fill with the new items + list.ForEach(x => SettingsManager.Current.BitCalculator_InputHistory.Add(x)); + } + + /// + /// Called when the view becomes visible. + /// + public void OnViewVisible() + { + } + + /// + /// Called when the view is hidden. + /// + public void OnViewHide() + { + } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/CommandLineViewModel.cs b/Source/NETworkManager/ViewModels/CommandLineViewModel.cs index ac5b08b185..9dd0f17305 100644 --- a/Source/NETworkManager/ViewModels/CommandLineViewModel.cs +++ b/Source/NETworkManager/ViewModels/CommandLineViewModel.cs @@ -1,127 +1,158 @@ -using NETworkManager.Documentation; +using System; +using System.Linq; +using System.Windows.Input; +using NETworkManager.Documentation; using NETworkManager.Models; using NETworkManager.Settings; using NETworkManager.Utilities; -using System.Linq; -using System.Windows.Input; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +/// +/// View model for the command line view. +/// +public class CommandLineViewModel : ViewModelBase { - public class CommandLineViewModel : ViewModelBase + #region Constructor, load settings + + /// + /// Initializes a new instance of the class. + /// + public CommandLineViewModel() { - #region Variables - private bool _displayWrongParameter; - public bool DisplayWrongParameter + if (!string.IsNullOrEmpty(CommandLineManager.Current.WrongParameter)) { - get => _displayWrongParameter; - set - { - if (value == _displayWrongParameter) - return; - - _displayWrongParameter = value; - OnPropertyChanged(); - } + WrongParameter = CommandLineManager.Current.WrongParameter; + DisplayWrongParameter = true; } - private string _wrongParameter; - public string WrongParameter - { - get => _wrongParameter; - set - { - if (value == _wrongParameter) - return; - - _wrongParameter = value; - OnPropertyChanged(); - } - } + ParameterHelp = CommandLineManager.ParameterHelp; + ParameterResetSettings = CommandLineManager.ParameterResetSettings; + ParameterApplication = + CommandLineManager.GetParameterWithSplitIdentifier(CommandLineManager.ParameterApplication); + ParameterApplicationValues = string.Join(", ", + Enum.GetValues(typeof(ApplicationName)).Cast().ToList()); + } - private string _parameterHelp; - public string ParameterHelp - { - get => _parameterHelp; - set - { - if (value == _parameterHelp) - return; - - _parameterHelp = value; - OnPropertyChanged(); - } - } + #endregion + + #region Variables - private string _parameterResetSettings; - public string ParameterResetSettings + /// + /// Gets or sets a value indicating whether to display the wrong parameter message. + /// + public bool DisplayWrongParameter + { + get; + set { - get => _parameterResetSettings; - set - { - if (value == _parameterResetSettings) - return; - - _parameterResetSettings = value; - OnPropertyChanged(); - } + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - private string _parameterApplication; - public string ParameterApplication + /// + /// Gets or sets the wrong parameter. + /// + public string WrongParameter + { + get; + set { - get => _parameterApplication; - set - { - if (value == _parameterApplication) - return; - - _parameterApplication = value; - OnPropertyChanged(); - } + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - private string _parameterApplicationValues; - public string ParameterApplicationValues + /// + /// Gets or sets the help parameter. + /// + public string ParameterHelp + { + get; + set { - get => _parameterApplicationValues; - set - { - if (value == _parameterApplicationValues) - return; - - _parameterApplicationValues = value; - OnPropertyChanged(); - } - } + if (value == field) + return; - #endregion + field = value; + OnPropertyChanged(); + } + } - #region Constructor, load settings - public CommandLineViewModel() + /// + /// Gets or sets the reset settings parameter. + /// + public string ParameterResetSettings + { + get; + set { - if (!string.IsNullOrEmpty(CommandLineManager.Current.WrongParameter)) - { - WrongParameter = CommandLineManager.Current.WrongParameter; - DisplayWrongParameter = true; - } - - ParameterHelp = CommandLineManager.ParameterHelp; - ParameterResetSettings = CommandLineManager.ParameterResetSettings; - ParameterApplication = CommandLineManager.GetParameterWithSplitIdentifier(CommandLineManager.ParameterApplication); - ParameterApplicationValues = string.Join(", ", System.Enum.GetValues(typeof(ApplicationName)).Cast().ToList()); + if (value == field) + return; + + field = value; + OnPropertyChanged(); } - #endregion + } - #region ICommand & Actions - public ICommand OpenDocumentationCommand + /// + /// Gets or sets the application parameter. + /// + public string ParameterApplication + { + get; + set { - get { return new RelayCommand(p => OpenDocumentationAction()); } + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - private void OpenDocumentationAction() + /// + /// Gets or sets the available application parameter values. + /// + public string ParameterApplicationValues + { + get; + set { - DocumentationManager.OpenDocumentation(DocumentationIdentifier.CommandLineArguments); + if (value == field) + return; + + field = value; + OnPropertyChanged(); } - #endregion } -} + + #endregion + + #region ICommand & Actions + + /// + /// Gets the command to open the documentation. + /// + public ICommand OpenDocumentationCommand + { + get { return new RelayCommand(_ => OpenDocumentationAction()); } + } + + /// + /// Action to open the documentation. + /// + private void OpenDocumentationAction() + { + DocumentationManager.OpenDocumentation(DocumentationIdentifier.CommandLineArguments); + } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/ConfirmDeleteViewModel.cs b/Source/NETworkManager/ViewModels/ConfirmDeleteViewModel.cs deleted file mode 100644 index 4879edd6eb..0000000000 --- a/Source/NETworkManager/ViewModels/ConfirmDeleteViewModel.cs +++ /dev/null @@ -1,35 +0,0 @@ -using NETworkManager.Utilities; -using System; -using System.Windows.Input; - -namespace NETworkManager.ViewModels -{ - public class ConfirmDeleteViewModel : ViewModelBase - { - public ICommand DeleteCommand { get; } - - public ICommand CancelCommand { get; } - - private string _message; - public string Message - { - get => _message; - set - { - if (value == _message) - return; - - _message = value; - OnPropertyChanged(); - } - } - - public ConfirmDeleteViewModel(Action deleteCommand, Action cancelHandler, string message) - { - DeleteCommand = new RelayCommand(p => deleteCommand(this)); - CancelCommand = new RelayCommand(p => cancelHandler(this)); - - Message = message; - } - } -} diff --git a/Source/NETworkManager/ViewModels/ConnectionCheckItem.cs b/Source/NETworkManager/ViewModels/ConnectionCheckItem.cs new file mode 100644 index 0000000000..202b832fc3 --- /dev/null +++ b/Source/NETworkManager/ViewModels/ConnectionCheckItem.cs @@ -0,0 +1,79 @@ +using NETworkManager.Models.Network; +using NETworkManager.Utilities; + +namespace NETworkManager.ViewModels; + +/// +/// Represents a single "is checking / value / state" row (e.g. Computer IPv4, Router DNS, ...) +/// shown by . +/// +public class ConnectionCheckItem : PropertyChangedBase +{ + /// + /// Gets or sets a value indicating whether this item is currently being checked. + /// + public bool IsChecking + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets or sets the checked value (e.g. an IP address or hostname). + /// + public string Value + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = ""; + + /// + /// Gets or sets the connection state of this item. + /// + public ConnectionState State + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = ConnectionState.None; + + /// + /// Resets the item to its initial "checking" state. + /// + public void Reset() + { + IsChecking = true; + Value = ""; + State = ConnectionState.None; + } + + /// + /// Completes the check with the given value and state. + /// + public void Complete(string value, ConnectionState state) + { + Value = value; + State = state; + IsChecking = false; + } +} diff --git a/Source/NETworkManager/ViewModels/ConnectionsViewModel.cs b/Source/NETworkManager/ViewModels/ConnectionsViewModel.cs index b3582dc0c0..2f303d7fe1 100644 --- a/Source/NETworkManager/ViewModels/ConnectionsViewModel.cs +++ b/Source/NETworkManager/ViewModels/ConnectionsViewModel.cs @@ -1,399 +1,436 @@ -using NETworkManager.Models.Network; +using log4net; +using MahApps.Metro.Controls; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Localization; +using NETworkManager.Localization.Resources; +using NETworkManager.Models.Export; +using NETworkManager.Models.Network; +using NETworkManager.Settings; +using NETworkManager.Utilities; +using NETworkManager.Views; using System; using System.Collections; -using System.Windows.Input; -using System.ComponentModel; -using System.Windows.Data; +using System.Collections.Generic; using System.Collections.ObjectModel; -using NETworkManager.Utilities; -using NETworkManager.Settings; -using System.Windows.Threading; +using System.ComponentModel; using System.Linq; -using System.Windows; -using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.Models.Export; -using NETworkManager.Views; using System.Threading.Tasks; -using NETworkManager.Localization; -using NETworkManager.Localization.Translators; - -namespace NETworkManager.ViewModels -{ - public class ConnectionsViewModel : ViewModelBase - { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; +using System.Windows; +using System.Windows.Data; +using System.Windows.Input; +using System.Windows.Threading; - private readonly bool _isLoading; - private readonly DispatcherTimer _autoRefreshTimer = new DispatcherTimer(); - private bool _isTimerPaused; +namespace NETworkManager.ViewModels; - private string _search; - public string Search - { - get => _search; - set - { - if (value == _search) - return; +/// +/// View model for the connections view. +/// +public class ConnectionsViewModel : ViewModelBase +{ + #region Contructor, load settings - _search = value; + /// + /// Initializes a new instance of the class. + /// + public ConnectionsViewModel() + { + _isLoading = true; - ConnectionResultsView.Refresh(); + // Result view + search + ResultsView = CollectionViewSource.GetDefaultView(Results); - OnPropertyChanged(); - } - } + ((ListCollectionView)ResultsView).CustomSort = Comparer.Create((x, y) => + IPAddressHelper.CompareIPAddresses(x.LocalIPAddress, y.LocalIPAddress)); - private ObservableCollection _connectionResults = new ObservableCollection(); - public ObservableCollection ConnectionResults + ResultsView.Filter = o => { - get => _connectionResults; - set - { - if (value == _connectionResults) - return; - - _connectionResults = value; - OnPropertyChanged(); - } - } + if (string.IsNullOrEmpty(Search)) + return true; + + if (o is not ConnectionInfo info) + return false; + + // Search by local/remote IP Address, local/remote Port, Protocol and State + return info.LocalIPAddress.ToString().IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || + info.LocalPort.ToString().IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || + info.RemoteIPAddress.ToString().IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || + info.RemoteHostname.IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || + info.RemotePort.ToString().IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || + info.Protocol.ToString().IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || + ResourceTranslator.Translate(ResourceIdentifier.TcpState, info.TcpState) + .IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || + info.ProcessId.ToString().IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || + info.ProcessName.IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || + info.ProcessPath.IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1; + }; + + // Get connections + _ = Refresh(true); + + // Auto refresh + _autoRefreshTimer.Tick += AutoRefreshTimer_Tick; + + AutoRefreshTimes = CollectionViewSource.GetDefaultView(AutoRefreshTime.GetDefaults); + SelectedAutoRefreshTime = AutoRefreshTimes.SourceCollection.Cast().FirstOrDefault(x => + x.Value == SettingsManager.Current.Connections_AutoRefreshTime.Value && + x.TimeUnit == SettingsManager.Current.Connections_AutoRefreshTime.TimeUnit); + AutoRefreshEnabled = SettingsManager.Current.Connections_AutoRefreshEnabled; + + _isLoading = false; + } - public ICollectionView ConnectionResultsView { get; } + #endregion - private ConnectionInfo _selectedConnectionInfo; - public ConnectionInfo SelectedConnectionInfo - { - get => _selectedConnectionInfo; - set - { - if (value == _selectedConnectionInfo) - return; - - _selectedConnectionInfo = value; - OnPropertyChanged(); - } - } + #region Events - private IList _selectedConnectionInfos = new ArrayList(); - public IList SelectedConnectionInfos - { - get => _selectedConnectionInfos; - set - { - if (Equals(value, _selectedConnectionInfos)) - return; + /// + /// Handles the Tick event of the auto-refresh timer. + /// + private async void AutoRefreshTimer_Tick(object sender, EventArgs e) + { + // Stop timer... + _autoRefreshTimer.Stop(); - _selectedConnectionInfos = value; - OnPropertyChanged(); - } - } + // Refresh + await Refresh(); - private bool _autoRefresh; - public bool AutoRefresh - { - get => _autoRefresh; - set - { - if (value == _autoRefresh) - return; + // Restart timer... + _autoRefreshTimer.Start(); + } - if (!_isLoading) - SettingsManager.Current.Connections_AutoRefresh = value; + #endregion - _autoRefresh = value; + #region Variables - // Start timer to refresh automatically - if (!_isLoading) - { - if (value) - StartAutoRefreshTimer(); - else - StopAutoRefreshTimer(); - } + private static readonly ILog Log = LogManager.GetLogger(typeof(ConnectionsViewModel)); - OnPropertyChanged(); - } - } + /// + /// Indicates whether the view model is loading. + /// + private readonly bool _isLoading; - public ICollectionView AutoRefreshTimes { get; } + /// + /// The timer for auto-refresh. + /// + private readonly DispatcherTimer _autoRefreshTimer = new(); - private AutoRefreshTimeInfo _selectedAutoRefreshTime; - public AutoRefreshTimeInfo SelectedAutoRefreshTime + /// + /// Gets or sets the search text. + /// + public string Search + { + get; + set { - get => _selectedAutoRefreshTime; - set - { - if (value == _selectedAutoRefreshTime) - return; - - if (!_isLoading) - SettingsManager.Current.Connections_AutoRefreshTime = value; + if (value == field) + return; - _selectedAutoRefreshTime = value; + field = value; - if (AutoRefresh) - ChangeAutoRefreshTimerInterval(AutoRefreshTime.CalculateTimeSpan(value)); + ResultsView.Refresh(); - OnPropertyChanged(); - } + OnPropertyChanged(); } + } - private bool _isRefreshing; - public bool IsRefreshing + /// + /// Gets or sets the collection of connection results. + /// + public ObservableCollection Results + { + get; + set { - get => _isRefreshing; - set - { - if (value == _isRefreshing) - return; + if (value == field) + return; - _isRefreshing = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = new(); + + /// + /// Gets the collection view for the connection results. + /// + public ICollectionView ResultsView { get; } - private bool _isStatusMessageDisplayed; - public bool IsStatusMessageDisplayed + /// + /// Gets or sets the currently selected connection result. + /// + public ConnectionInfo SelectedResult + { + get; + set { - get => _isStatusMessageDisplayed; - set - { - if (value == _isStatusMessageDisplayed) - return; + if (value == field) + return; - _isStatusMessageDisplayed = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _statusMessage; - public string StatusMessage + /// + /// Gets or sets the list of selected connection results. + /// + public IList SelectedResults + { + get; + set { - get => _statusMessage; - set - { - if (value == _statusMessage) - return; + if (Equals(value, field)) + return; - _statusMessage = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion + } = new ArrayList(); - #region Contructor, load settings - public ConnectionsViewModel(IDialogCoordinator instance) + /// + /// Gets or sets a value indicating whether auto-refresh is enabled. + /// + public bool AutoRefreshEnabled + { + get; + set { - _isLoading = true; + if (value == field) + return; - _dialogCoordinator = instance; + if (!_isLoading) + SettingsManager.Current.Connections_AutoRefreshEnabled = value; - // Result view + search - ConnectionResultsView = CollectionViewSource.GetDefaultView(ConnectionResults); - ConnectionResultsView.SortDescriptions.Add(new SortDescription(nameof(ConnectionInfo.LocalIPAddressInt32), ListSortDirection.Ascending)); - ConnectionResultsView.Filter = o => + field = value; + + // Start timer to refresh automatically + if (value) + { + _autoRefreshTimer.Interval = AutoRefreshTime.CalculateTimeSpan(SelectedAutoRefreshTime); + _autoRefreshTimer.Start(); + } + else { - if (string.IsNullOrEmpty(Search)) - return true; - - // Search by local/remote IP Address, local/remote Port, Protocol and State - return o is ConnectionInfo info && (info.LocalIPAddress.ToString().IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || info.LocalPort.ToString().IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || info.RemoteIPAddress.ToString().IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || info.RemotePort.ToString().IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || info.Protocol.ToString().IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || TcpStateTranslator.GetInstance().Translate(info.TcpState).IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1); - }; + _autoRefreshTimer.Stop(); + } - AutoRefreshTimes = CollectionViewSource.GetDefaultView(AutoRefreshTime.GetDefaults); - SelectedAutoRefreshTime = AutoRefreshTimes.SourceCollection.Cast().FirstOrDefault(x => (x.Value == SettingsManager.Current.Connections_AutoRefreshTime.Value && x.TimeUnit == SettingsManager.Current.Connections_AutoRefreshTime.TimeUnit)); + OnPropertyChanged(); + } + } - _autoRefreshTimer.Tick += AutoRefreshTimer_Tick; + /// + /// Gets the collection view for the auto-refresh times. + /// + public ICollectionView AutoRefreshTimes { get; } - LoadSettings(); + /// + /// Gets or sets the selected auto-refresh time. + /// + public AutoRefreshTimeInfo SelectedAutoRefreshTime + { + get; + set + { + if (value == field) + return; - _isLoading = false; + if (!_isLoading) + SettingsManager.Current.Connections_AutoRefreshTime = value; - Run(); - } + field = value; - private async Task Run() - { - await Refresh(); + if (AutoRefreshEnabled) + { + _autoRefreshTimer.Interval = AutoRefreshTime.CalculateTimeSpan(value); + _autoRefreshTimer.Start(); + } - if (AutoRefresh) - StartAutoRefreshTimer(); + OnPropertyChanged(); } + } - private void LoadSettings() + /// + /// Gets or sets a value indicating whether the view model is currently refreshing. + /// + public bool IsRefreshing + { + get; + set { - AutoRefresh = SettingsManager.Current.Connections_AutoRefresh; - } - #endregion - - #region ICommands & Actions - public ICommand RefreshCommand => new RelayCommand(p => RefreshAction(), Refresh_CanExecute); + if (value == field) + return; - private bool Refresh_CanExecute(object paramter) - { - return Application.Current.MainWindow != null && !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen; + field = value; + OnPropertyChanged(); } + } - private async Task RefreshAction() + /// + /// Gets or sets a value indicating whether the status message is displayed. + /// + public bool IsStatusMessageDisplayed + { + get; + set { - IsStatusMessageDisplayed = false; + if (value == field) + return; - await Refresh(); + field = value; + OnPropertyChanged(); } + } - public ICommand CopySelectedLocalIpAddressCommand => new RelayCommand(p => CopySelectedLocalIpAddressAction()); - - private void CopySelectedLocalIpAddressAction() + /// + /// Gets or sets the status message. + /// + public string StatusMessage + { + get; + set { - ClipboardHelper.SetClipboard(SelectedConnectionInfo.LocalIPAddress.ToString()); - } - - public ICommand CopySelectedLocalPortCommand => new RelayCommand(p => CopySelectedLocalPortAction()); + if (value == field) + return; - private void CopySelectedLocalPortAction() - { - ClipboardHelper.SetClipboard(SelectedConnectionInfo.LocalPort.ToString()); + field = value; + OnPropertyChanged(); } + } - public ICommand CopySelectedRemoteIpAddressCommand => new RelayCommand(p => CopySelectedRemoteIpAddressAction()); - - private void CopySelectedRemoteIpAddressAction() - { - ClipboardHelper.SetClipboard(SelectedConnectionInfo.RemoteIPAddress.ToString()); - } + #endregion - public ICommand CopySelectedRemotePortCommand => new RelayCommand(p => CopySelectedRemotePortAction()); + #region ICommands & Actions - private void CopySelectedRemotePortAction() - { - ClipboardHelper.SetClipboard(SelectedConnectionInfo.RemotePort.ToString()); - } + /// + /// Gets the command to refresh the connections. + /// + public ICommand RefreshCommand => new RelayCommand(parameter => { _ = RefreshAction(); }, Refresh_CanExecute); - public ICommand CopySelectedProtocolCommand => new RelayCommand(p => CopySelectedProtocolAction()); + /// + /// Checks if the refresh command can be executed. + /// + /// The command parameter. + /// true if the command can be executed; otherwise, false. + private bool Refresh_CanExecute(object parameter) + { + return Application.Current.MainWindow != null && + !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && + !ConfigurationManager.Current.IsChildWindowOpen && + !IsRefreshing && + !AutoRefreshEnabled; + } - private void CopySelectedProtocolAction() - { - ClipboardHelper.SetClipboard(SelectedConnectionInfo.Protocol.ToString()); - } + /// + /// Action to refresh the connections. + /// + private async Task RefreshAction() + { + IsStatusMessageDisplayed = false; - public ICommand CopySelectedStateCommand => new RelayCommand(p => CopySelectedStateAction()); + await Refresh(); + } - private void CopySelectedStateAction() - { - ClipboardHelper.SetClipboard(TcpStateTranslator.GetInstance().Translate(SelectedConnectionInfo.TcpState)); - } + /// + /// Gets the command to export the connections. + /// + public ICommand ExportCommand => new RelayCommand(parameter => { _ = ExportAction(); }); - public ICommand ExportCommand => new RelayCommand(p => ExportAction()); + /// + /// Action to export the connections. + /// + private Task ExportAction() + { + var childWindow = new ExportChildWindow(); - private async Task ExportAction() + var childWindowViewModel = new ExportViewModel(async instance => { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.Export - }; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - var exportViewModel = new ExportViewModel(async instance => + try { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - - try - { - ExportManager.Export(instance.FilePath, instance.FileType, instance.ExportAll ? ConnectionResults : new ObservableCollection(SelectedConnectionInfos.Cast().ToArray())); - } - catch (Exception ex) - { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Localization.Resources.Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Error, Localization.Resources.Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); - } - - SettingsManager.Current.Connections_ExportFileType = instance.FileType; - SettingsManager.Current.Connections_ExportFilePath = instance.FilePath; - }, instance => { _dialogCoordinator.HideMetroDialogAsync(this, customDialog); }, new ExportManager.ExportFileType[] { ExportManager.ExportFileType.CSV, ExportManager.ExportFileType.XML, ExportManager.ExportFileType.JSON }, true, SettingsManager.Current.Connections_ExportFileType, SettingsManager.Current.Connections_ExportFilePath); - - customDialog.Content = new ExportDialog + ExportManager.Export(instance.FilePath, instance.FileType, + instance.ExportAll + ? Results + : new ObservableCollection(SelectedResults.Cast() + .ToArray())); + } + catch (Exception ex) { - DataContext = exportViewModel - }; + Log.Error("Error while exporting data as " + instance.FileType, ex); - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } - #endregion + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); + } - #region Methods - private async Task Refresh() + SettingsManager.Current.Connections_ExportFileType = instance.FileType; + SettingsManager.Current.Connections_ExportFilePath = instance.FilePath; + }, _ => { - IsRefreshing = true; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, + [ + ExportFileType.Csv, ExportFileType.Xml, ExportFileType.Json + ], true, SettingsManager.Current.Connections_ExportFileType, + SettingsManager.Current.Connections_ExportFilePath); - ConnectionResults.Clear(); + childWindow.Title = Strings.Export; - (await Connection.GetActiveTcpConnectionsAsync()).ForEach(x => ConnectionResults.Add(x)); + childWindow.DataContext = childWindowViewModel; - IsRefreshing = false; - } + ConfigurationManager.Current.IsChildWindowOpen = true; - private void ChangeAutoRefreshTimerInterval(TimeSpan timeSpan) - { - _autoRefreshTimer.Interval = timeSpan; - } + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } - private void StartAutoRefreshTimer() - { - ChangeAutoRefreshTimerInterval(AutoRefreshTime.CalculateTimeSpan(SelectedAutoRefreshTime)); + #endregion - _autoRefreshTimer.Start(); - } + #region Methods - private void StopAutoRefreshTimer() - { - _autoRefreshTimer.Stop(); - } + /// + /// Refreshes the connections. + /// + /// Indicates whether this is the initial refresh. + private async Task Refresh(bool init = false) + { + IsRefreshing = true; - private void PauseAutoRefreshTimer() - { - if (!_autoRefreshTimer.IsEnabled) - return; + StatusMessage = Strings.RefreshingDots; + IsStatusMessageDisplayed = true; - _autoRefreshTimer.Stop(); - _isTimerPaused = true; - } + if (init == false) + await Task.Delay(GlobalStaticConfiguration.ApplicationUIRefreshInterval); - private void ResumeAutoRefreshTimer() - { - if (!_isTimerPaused) - return; + Results.Clear(); - _autoRefreshTimer.Start(); - _isTimerPaused = false; - } + (await Connection.GetActiveTcpConnectionsAsync()).ForEach(Results.Add); - public void OnViewVisible() - { - ResumeAutoRefreshTimer(); - } + StatusMessage = string.Format(Strings.ReloadedAtX, DateTime.Now.ToShortTimeString()); + IsStatusMessageDisplayed = true; - public void OnViewHide() - { - PauseAutoRefreshTimer(); - } + IsRefreshing = false; + } - #endregion + /// + /// Called when the view becomes visible. + /// + public void OnViewVisible() + { + // Restart timer... + if (AutoRefreshEnabled) + _autoRefreshTimer.Start(); + } - #region Events - private async void AutoRefreshTimer_Tick(object sender, EventArgs e) - { - // Stop timer... + /// + /// Called when the view is hidden. + /// + public void OnViewHide() + { + // Temporarily stop timer... + if (AutoRefreshEnabled) _autoRefreshTimer.Stop(); - - // Refresh - await Refresh(); - - // Restart timer... - _autoRefreshTimer.Start(); - } - #endregion } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/CredentialsChangePasswordViewModel.cs b/Source/NETworkManager/ViewModels/CredentialsChangePasswordViewModel.cs index 2d6c04961a..1ef9488185 100644 --- a/Source/NETworkManager/ViewModels/CredentialsChangePasswordViewModel.cs +++ b/Source/NETworkManager/ViewModels/CredentialsChangePasswordViewModel.cs @@ -1,155 +1,136 @@ -using NETworkManager.Utilities; using System; using System.Security; using System.Windows.Input; +using NETworkManager.Utilities; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +/// +/// View model for changing the credentials password. +/// +public class CredentialsChangePasswordViewModel : ViewModelBase { - public class CredentialsChangePasswordViewModel : ViewModelBase + /// + /// Initialize a new class with and + /// . + /// + /// which is executed on OK click. + /// which is executed on cancel click. + public CredentialsChangePasswordViewModel(Action okCommand, + Action cancelHandler) { - /// - /// Command which is called when the OK button is clicked. - /// - public ICommand OKCommand { get; } - - /// - /// Command which is called when the cancel button is clicked. - /// - public ICommand CancelCommand { get; } - - /// - /// Private variable for . - /// - private SecureString _password = new SecureString(); - - /// - /// Password as secure string. - /// - public SecureString Password - { - get => _password; - set - { - if (value == _password) - return; - - _password = value; - - ValidatePassword(); + OKCommand = new RelayCommand(_ => okCommand(this)); + CancelCommand = new RelayCommand(_ => cancelHandler(this)); + } - OnPropertyChanged(); - } - } + /// + /// Command which is called when the OK button is clicked. + /// + public ICommand OKCommand { get; } - /// - /// Private variable for . - /// - private SecureString _newPassword = new SecureString(); + /// + /// Command which is called when the cancel button is clicked. + /// + public ICommand CancelCommand { get; } - /// - /// New password as secure string. - /// - public SecureString NewPassword + /// + /// Password as . + /// + public SecureString Password + { + get; + set { - get => _newPassword; - set - { - if (value == _newPassword) - return; + if (value == field) + return; - _newPassword = value; + field = value; - ValidatePassword(); + ValidatePassword(); - OnPropertyChanged(); - } + OnPropertyChanged(); } + } = new(); - /// - /// Private variable for . - /// - private SecureString _newPasswordRepeat = new SecureString(); - - /// - /// Repeated new password as secure string. - /// - public SecureString NewPasswordRepeat + /// + /// New password as . + /// + public SecureString NewPassword + { + get; + set { - get => _newPasswordRepeat; - set - { - if (value == _newPasswordRepeat) - return; + if (value == field) + return; - _newPasswordRepeat = value; + field = value; - ValidatePassword(); + ValidatePassword(); - OnPropertyChanged(); - } + OnPropertyChanged(); } + } = new(); - /// - /// Private variable for . - /// - private bool _isPasswordEmpty = true; - - /// - /// Indicate if one of the password fields are empty. - /// - public bool IsPasswordEmpty + /// + /// Repeated new password as . + /// + public SecureString NewPasswordRepeat + { + get; + set { - get => _isPasswordEmpty; - set - { - if (value == _isPasswordEmpty) - return; - - _isPasswordEmpty = value; - OnPropertyChanged(); - } - } + if (value == field) + return; - /// - /// Private variable for . - /// - private bool _isRepeatedPasswordEqual; + field = value; - /// - /// Indicate if the is equal to the . - /// - public bool IsRepeatedPasswordEqual - { - get => _isRepeatedPasswordEqual; - set - { - if (value == _isRepeatedPasswordEqual) - return; - - _isRepeatedPasswordEqual = value; - OnPropertyChanged(); - } + ValidatePassword(); + + OnPropertyChanged(); } + } = new(); - /// - /// Check if the passwords are valid and equal. - /// - private void ValidatePassword() + /// + /// Indicate if one of the password fields are empty. + /// + public bool IsPasswordEmpty + { + get; + set { - IsPasswordEmpty = Password == null || Password.Length == 0 || NewPassword == null || NewPassword.Length == 0 || NewPasswordRepeat == null || NewPasswordRepeat.Length == 0; + if (value == field) + return; - IsRepeatedPasswordEqual = !IsPasswordEmpty && SecureStringHelper.ConvertToString(NewPassword).Equals(SecureStringHelper.ConvertToString(NewPasswordRepeat)); + field = value; + OnPropertyChanged(); } + } = true; - /// - /// Initalizes a new class with and . - /// - /// which is executed on OK click. - /// which is executed on cancel click. - public CredentialsChangePasswordViewModel(Action okCommand, Action cancelHandler) + /// + /// Indicate if the is equal to the . + /// + public bool IsRepeatedPasswordEqual + { + get; + set { - OKCommand = new RelayCommand(p => okCommand(this)); - CancelCommand = new RelayCommand(p => cancelHandler(this)); + if (value == field) + return; + + field = value; + OnPropertyChanged(); } } + + /// + /// Check if the passwords are valid and equal. + /// + private void ValidatePassword() + { + IsPasswordEmpty = Password == null || Password.Length == 0 || NewPassword == null || NewPassword.Length == 0 || + NewPasswordRepeat == null || NewPasswordRepeat.Length == 0; + + IsRepeatedPasswordEqual = !IsPasswordEmpty && SecureStringHelper.ConvertToString(NewPassword) + .Equals(SecureStringHelper.ConvertToString(NewPasswordRepeat)); + } } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/CredentialsPasswordProfileFileViewModel.cs b/Source/NETworkManager/ViewModels/CredentialsPasswordProfileFileViewModel.cs new file mode 100644 index 0000000000..4e2e95f61c --- /dev/null +++ b/Source/NETworkManager/ViewModels/CredentialsPasswordProfileFileViewModel.cs @@ -0,0 +1,116 @@ +using NETworkManager.Utilities; +using System; +using System.Security; +using System.Windows.Input; + +namespace NETworkManager.ViewModels; + +/// +/// View model for entering the password for a profile file. +/// +public class CredentialsPasswordProfileFileViewModel : ViewModelBase +{ + /// + /// Initialize a new class with and + /// . + /// + /// which is executed on OK click. + /// which is executed on cancel click. + /// Name of the profile file. + /// Show note that the password is wrong. + public CredentialsPasswordProfileFileViewModel(Action okCommand, + Action cancelHandler, string profileName, + bool showWrongPassword = false) + { + OKCommand = new RelayCommand(_ => okCommand(this)); + CancelCommand = new RelayCommand(_ => cancelHandler(this)); + + ProfileName = profileName; + ShowWrongPassword = showWrongPassword; + } + + /// + /// Command which is called when the OK button is clicked. + /// + public ICommand OKCommand { get; } + + /// + /// Command which is called when the cancel button is clicked. + /// + public ICommand CancelCommand { get; } + + /// + /// Name of the profile file. + /// + public string ProfileName + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Show note that the password is wrong. + /// + public bool ShowWrongPassword + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Password as . + /// + public SecureString Password + { + get; + set + { + if (value == field) + return; + + field = value; + + ValidatePassword(); + + OnPropertyChanged(); + } + } = new(); + + /// + /// Indicate if one of the password fields are empty. + /// + public bool IsPasswordEmpty + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = true; + + /// + /// Check if the passwords are valid. + /// + private void ValidatePassword() + { + IsPasswordEmpty = Password == null || Password.Length == 0; + } +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/CredentialsPasswordViewModel.cs b/Source/NETworkManager/ViewModels/CredentialsPasswordViewModel.cs index a104ddb260..b742e80de4 100644 --- a/Source/NETworkManager/ViewModels/CredentialsPasswordViewModel.cs +++ b/Source/NETworkManager/ViewModels/CredentialsPasswordViewModel.cs @@ -1,82 +1,78 @@ -using NETworkManager.Utilities; using System; using System.Security; using System.Windows.Input; +using NETworkManager.Utilities; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +/// +/// View model for entering a password. +/// +public class CredentialsPasswordViewModel : ViewModelBase { - public class CredentialsPasswordViewModel : ViewModelBase + /// + /// Initialize a new class with and + /// . + /// + /// which is executed on OK click. + /// which is executed on cancel click. + public CredentialsPasswordViewModel(Action okCommand, + Action cancelHandler) { - /// - /// Command which is called when the OK button is clicked. - /// - public ICommand OKCommand { get; } + OKCommand = new RelayCommand(_ => okCommand(this)); + CancelCommand = new RelayCommand(_ => cancelHandler(this)); + } - /// - /// Command which is called when the cancel button is clicked. - /// - public ICommand CancelCommand { get; } + /// + /// Command which is called when the OK button is clicked. + /// + public ICommand OKCommand { get; } - /// - /// Private variable for . - /// - private SecureString _password = new SecureString(); + /// + /// Command which is called when the cancel button is clicked. + /// + public ICommand CancelCommand { get; } - /// - /// Password as secure string. - /// - public SecureString Password + /// + /// Password as . + /// + public SecureString Password + { + get; + set { - get => _password; - set - { - if (value == _password) - return; + if (value == field) + return; - _password = value; + field = value; - ValidatePassword(); + ValidatePassword(); - OnPropertyChanged(); - } + OnPropertyChanged(); } + } = new(); - /// - /// Private variable for . - /// - private bool _isPasswordEmpty; - - /// - /// Indicate if one of the password fields are empty. - /// - public bool IsPasswordEmpty + /// + /// Indicate if one of the password fields are empty. + /// + public bool IsPasswordEmpty + { + get; + set { - get => _isPasswordEmpty; - set - { - if (value == _isPasswordEmpty) - return; + if (value == field) + return; - _isPasswordEmpty = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = true; - - /// - /// Initalizes a new class with and . - /// - /// which is executed on OK click. - /// which is executed on cancel click. - public CredentialsPasswordViewModel(Action okCommand, Action cancelHandler) - { - OKCommand = new RelayCommand(p => okCommand(this)); - CancelCommand = new RelayCommand(p => cancelHandler(this)); - } - - /// - /// Check if the passwords are valid. - /// - private void ValidatePassword() => IsPasswordEmpty = Password == null || Password.Length == 0; + /// + /// Check if the passwords are valid. + /// + private void ValidatePassword() + { + IsPasswordEmpty = Password == null || Password.Length == 0; } } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/CredentialsSetPasswordViewModel.cs b/Source/NETworkManager/ViewModels/CredentialsSetPasswordViewModel.cs index f3a71650a0..2605f73016 100644 --- a/Source/NETworkManager/ViewModels/CredentialsSetPasswordViewModel.cs +++ b/Source/NETworkManager/ViewModels/CredentialsSetPasswordViewModel.cs @@ -1,131 +1,117 @@ -using NETworkManager.Utilities; using System; using System.Security; using System.Windows.Input; +using NETworkManager.Utilities; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +/// +/// View model for setting a password. +/// +public class CredentialsSetPasswordViewModel : ViewModelBase { - public class CredentialsSetPasswordViewModel : ViewModelBase + /// + /// Initialize a new class with and + /// . + /// + /// which is executed on OK click. + /// which is executed on cancel click. + public CredentialsSetPasswordViewModel(Action okCommand, + Action cancelHandler) { - /// - /// Command which is called when the OK button is clicked. - /// - public ICommand OKCommand { get; } - - /// - /// Command which is called when the cancel button is clicked. - /// - public ICommand CancelCommand { get; } - - /// - /// Private variable for . - /// - private SecureString _password = new SecureString(); - - /// - /// Password as secure string. - /// - public SecureString Password - { - get => _password; - set - { - if (value == _password) - return; - - _password = value; - - ValidatePassword(); + OKCommand = new RelayCommand(_ => okCommand(this)); + CancelCommand = new RelayCommand(_ => cancelHandler(this)); + } - OnPropertyChanged(); - } - } + /// + /// Command which is called when the OK button is clicked. + /// + public ICommand OKCommand { get; } - /// - /// Private variable for . - /// - private SecureString _passwordRepeat = new SecureString(); + /// + /// Command which is called when the cancel button is clicked. + /// + public ICommand CancelCommand { get; } - /// - /// Repeated password as secure string. - /// - public SecureString PasswordRepeat + /// + /// Password as . + /// + public SecureString Password + { + get; + set { - get => _passwordRepeat; - set - { - if (value == _passwordRepeat) - return; + if (value == field) + return; - _passwordRepeat = value; + field = value; - ValidatePassword(); + ValidatePassword(); - OnPropertyChanged(); - } + OnPropertyChanged(); } + } = new(); - /// - /// Private variable for . - /// - private bool _isPasswordEmpty = true; - - /// - /// Indicate if one of the password fields are empty. - /// - public bool IsPasswordEmpty + /// + /// Repeated password as . + /// + public SecureString PasswordRepeat + { + get; + set { - get => _isPasswordEmpty; - set - { - if (value == _isPasswordEmpty) - return; - - _isPasswordEmpty = value; - OnPropertyChanged(); - } - } + if (value == field) + return; - /// - /// Private variable for . - /// - private bool _isRepeatedPasswordEqual; + field = value; - /// - /// Indicate if the is equal to the . - /// - public bool IsRepeatedPasswordEqual - { - get => _isRepeatedPasswordEqual; - set - { - if (value == _isRepeatedPasswordEqual) - return; - - _isRepeatedPasswordEqual = value; - OnPropertyChanged(); - } + ValidatePassword(); + + OnPropertyChanged(); } + } = new(); - /// - /// Check if the passwords are valid and equal. - /// - private void ValidatePassword() + /// + /// Indicate if one of the password fields are empty. + /// + public bool IsPasswordEmpty + { + get; + set { - IsPasswordEmpty = Password == null || Password.Length == 0 || PasswordRepeat == null || PasswordRepeat.Length == 0; + if (value == field) + return; - IsRepeatedPasswordEqual = !IsPasswordEmpty && SecureStringHelper.ConvertToString(Password).Equals(SecureStringHelper.ConvertToString(PasswordRepeat)); + field = value; + OnPropertyChanged(); } + } = true; - /// - /// Initalizes a new class with and . - /// - /// which is executed on OK click. - /// which is executed on cancel click. - public CredentialsSetPasswordViewModel(Action okCommand, Action cancelHandler) + /// + /// Indicate if the is equal to the . + /// + public bool IsRepeatedPasswordEqual + { + get; + set { - OKCommand = new RelayCommand(p => okCommand(this)); - CancelCommand = new RelayCommand(p => cancelHandler(this)); + if (value == field) + return; + + field = value; + OnPropertyChanged(); } } + + /// + /// Check if the passwords are valid and equal. + /// + private void ValidatePassword() + { + IsPasswordEmpty = Password == null || Password.Length == 0 || PasswordRepeat == null || + PasswordRepeat.Length == 0; + + IsRepeatedPasswordEqual = !IsPasswordEmpty && SecureStringHelper.ConvertToString(Password) + .Equals(SecureStringHelper.ConvertToString(PasswordRepeat)); + } } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/CustomCommandViewModel.cs b/Source/NETworkManager/ViewModels/CustomCommandViewModel.cs index cccee20cc1..ea1f47bcbc 100644 --- a/Source/NETworkManager/ViewModels/CustomCommandViewModel.cs +++ b/Source/NETworkManager/ViewModels/CustomCommandViewModel.cs @@ -1,135 +1,180 @@ -using NETworkManager.Utilities; using System; using System.Windows.Input; +using NETworkManager.Utilities; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +/// +/// View model for a custom command. +/// +public class CustomCommandViewModel : ViewModelBase { - public class CustomCommandViewModel : ViewModelBase + /// + /// The original custom command info. + /// + private readonly CustomCommandInfo _info; + + /// + /// Indicates whether the view model is loading. + /// + private readonly bool _isLoading; + + /// + /// Backing field for . + /// + private bool _isEdited; + + /// + /// Initializes a new instance of the class. + /// + /// The action to execute when saving. + /// The action to execute when canceling. + /// Indicates if the command is being edited. + /// The custom command info. + public CustomCommandViewModel(Action saveCommand, + Action cancelHandler, bool isEdited = false, CustomCommandInfo info = null) { - private readonly bool _isLoading; + _isLoading = true; + + SaveCommand = new RelayCommand(_ => saveCommand(this)); + CancelCommand = new RelayCommand(_ => cancelHandler(this)); + + _isEdited = isEdited; + + // Create new --> GUID + _info = info ?? new CustomCommandInfo(); + + ID = _info.ID; + Name = _info.Name; + FilePath = _info.FilePath; + Arguments = _info.Arguments; + + _isLoading = false; + } - public ICommand SaveCommand { get; } + /// + /// Gets the save command. + /// + public ICommand SaveCommand { get; } - public ICommand CancelCommand { get; } + /// + /// Gets the cancel command. + /// + public ICommand CancelCommand { get; } - private Guid _id; - public Guid ID + /// + /// Gets the ID of the custom command. + /// + public Guid ID + { + get; + private init { - get => _id; - set - { - if (_id == value) - return; - - _id = value; - OnPropertyChanged(); - } + if (field == value) + return; + + field = value; + OnPropertyChanged(); } + } - private string _name; - public string Name + /// + /// Gets or sets the name of the custom command. + /// + public string Name + { + get; + set { - get => _name; - set - { - if (_name == value) - return; + if (field == value) + return; - _name = value; + field = value; - if (!_isLoading) - CheckInfoChanged(); + if (!_isLoading) + CheckInfoChanged(); - OnPropertyChanged(); - } + OnPropertyChanged(); } + } - private string _filePath; - public string FilePath + /// + /// Gets or sets the file path of the custom command. + /// + public string FilePath + { + get; + set { - get => _filePath; - set - { - if (_filePath == value) - return; + if (field == value) + return; - _filePath = value; + field = value; - if (!_isLoading) - CheckInfoChanged(); + if (!_isLoading) + CheckInfoChanged(); - OnPropertyChanged(); - } + OnPropertyChanged(); } + } - private string _arguments; - public string Arguments + /// + /// Gets or sets the arguments of the custom command. + /// + public string Arguments + { + get; + set { - get => _arguments; - set - { - if (_arguments == value) - return; + if (field == value) + return; - _arguments = value; + field = value; - if (!_isLoading) - CheckInfoChanged(); + if (!_isLoading) + CheckInfoChanged(); - OnPropertyChanged(); - } + OnPropertyChanged(); } + } - private readonly CustomCommandInfo _info; - - private bool _infoChanged; - public bool InfoChanged + /// + /// Gets or sets a value indicating whether the info has changed. + /// + public bool InfoChanged + { + get; + set { - get => _infoChanged; - set - { - if (value == _infoChanged) - return; - - _infoChanged = value; - OnPropertyChanged(); - } - } + if (value == field) + return; - private bool _isEdited; - public bool IsEdited - { - get => _isEdited; - set - { - if (value == _isEdited) - return; - - _isEdited = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - public CustomCommandViewModel(Action saveCommand, Action cancelHandler, bool isEdited = false, CustomCommandInfo info = null) + /// + /// Gets or sets a value indicating whether the command is being edited. + /// + public bool IsEdited + { + get => _isEdited; + set { - _isLoading = true; + if (value == _isEdited) + return; - SaveCommand = new RelayCommand(p => saveCommand(this)); - CancelCommand = new RelayCommand(p => cancelHandler(this)); - - _isEdited = isEdited; - - // Create new --> GUID - _info = info ?? new CustomCommandInfo(); - - ID = _info.ID; - Name = _info.Name; - FilePath = _info.FilePath; - Arguments = _info.Arguments; - - _isLoading = false; + _isEdited = value; + OnPropertyChanged(); } + } - public void CheckInfoChanged() => InfoChanged = _info.Name != null || _info.FilePath != FilePath || _info.Arguments != Arguments; + /// + /// Checks if the info has changed. + /// + private void CheckInfoChanged() + { + InfoChanged = _info.Name != null || _info.FilePath != FilePath || _info.Arguments != Arguments; } } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/DNSLookupHostViewModel.cs b/Source/NETworkManager/ViewModels/DNSLookupHostViewModel.cs index e3c04cfc8e..14e9865f44 100644 --- a/Source/NETworkManager/ViewModels/DNSLookupHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/DNSLookupHostViewModel.cs @@ -1,374 +1,166 @@ -using System; -using System.Collections.ObjectModel; -using System.ComponentModel; -using System.Linq; -using System.Windows; -using System.Windows.Data; -using NETworkManager.Controls; using Dragablz; -using System.Windows.Input; -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.Settings; -using NETworkManager.Views; -using NETworkManager.Utilities; -using NETworkManager.Profiles; -using System.Windows.Threading; +using NETworkManager.Controls; +using NETworkManager.Localization.Resources; using NETworkManager.Models; +using NETworkManager.Profiles; +using NETworkManager.Utilities; +using NETworkManager.Views; +using System; using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Windows.Input; -namespace NETworkManager.ViewModels -{ - public class DNSLookupHostViewModel : ViewModelBase, IProfileManager - { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - private readonly DispatcherTimer _searchDispatcherTimer = new DispatcherTimer(); - - public IInterTabClient InterTabClient { get; } - public ObservableCollection TabItems { get; } - - private readonly bool _isLoading = true; - private bool _isViewActive = true; - - private int _tabId; - - private int _selectedTabIndex; - public int SelectedTabIndex - { - get => _selectedTabIndex; - set - { - if (value == _selectedTabIndex) - return; - - _selectedTabIndex = value; - OnPropertyChanged(); - } - } - - #region Profiles - public ICollectionView Profiles { get; } - - private ProfileInfo _selectedProfile = new ProfileInfo(); - public ProfileInfo SelectedProfile - { - get => _selectedProfile; - set - { - if (value == _selectedProfile) - return; - - _selectedProfile = value; - OnPropertyChanged(); - } - } - - private string _search; - public string Search - { - get => _search; - set - { - if (value == _search) - return; - - _search = value; - - StartDelayedSearch(); - - OnPropertyChanged(); - } - } - - private bool _isSearching; - public bool IsSearching - { - get => _isSearching; - set - { - if (value == _isSearching) - return; - - _isSearching = value; - OnPropertyChanged(); - } - } - - private bool _canProfileWidthChange = true; - private double _tempProfileWidth; - - private bool _expandProfileView; - public bool ExpandProfileView - { - get => _expandProfileView; - set - { - if (value == _expandProfileView) - return; - - if (!_isLoading) - SettingsManager.Current.DNSLookup_ExpandProfileView = value; - - _expandProfileView = value; - - if (_canProfileWidthChange) - ResizeProfile(false); - - OnPropertyChanged(); - } - } - - private GridLength _profileWidth; - public GridLength ProfileWidth - { - get => _profileWidth; - set - { - if (value == _profileWidth) - return; - - if (!_isLoading && Math.Abs(value.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > GlobalStaticConfiguration.FloatPointFix) // Do not save the size when collapsed - SettingsManager.Current.DNSLookup_ProfileWidth = value.Value; - - _profileWidth = value; - - if (_canProfileWidthChange) - ResizeProfile(true); - - OnPropertyChanged(); - } - } - #endregion - #endregion - - #region Constructor, load settings - public DNSLookupHostViewModel(IDialogCoordinator instance) - { - _dialogCoordinator = instance; - - InterTabClient = new DragablzInterTabClient(ApplicationName.DNSLookup); - - TabItems = new ObservableCollection - { - new DragablzTabItem(Localization.Resources.Strings.NewTab, new DNSLookupView (_tabId), _tabId) - }; - - Profiles = new CollectionViewSource { Source = ProfileManager.Groups.SelectMany(x => x.Profiles) }.View; - Profiles.GroupDescriptions.Add(new PropertyGroupDescription(nameof(ProfileInfo.Group))); - Profiles.SortDescriptions.Add(new SortDescription(nameof(ProfileInfo.Group), ListSortDirection.Ascending)); - Profiles.SortDescriptions.Add(new SortDescription(nameof(ProfileInfo.Name), ListSortDirection.Ascending)); - Profiles.Filter = o => - { - if (!(o is ProfileInfo info)) - return false; - - if (string.IsNullOrEmpty(Search)) - return info.DNSLookup_Enabled; - - var search = Search.Trim(); - - // Search by: Tag=xxx (exact match, ignore case) - /* - if (search.StartsWith(ProfileManager.TagIdentifier, StringComparison.OrdinalIgnoreCase)) - return !string.IsNullOrEmpty(info.Tags) && info.DNSLookup_Enabled && info.Tags.Replace(" ", "").Split(';').Any(str => search.Substring(ProfileManager.TagIdentifier.Length, search.Length - ProfileManager.TagIdentifier.Length).Equals(str, StringComparison.OrdinalIgnoreCase)); - */ - - // Search by: Name, DNSLookup_Host - return info.DNSLookup_Enabled && (info.Name.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1 || info.DNSLookup_Host.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1); - }; - - // This will select the first entry as selected item... - SelectedProfile = Profiles.SourceCollection.Cast().Where(x => x.DNSLookup_Enabled).OrderBy(x => x.Group).ThenBy(x => x.Name).FirstOrDefault(); - - ProfileManager.OnProfilesUpdated += ProfileManager_OnProfilesUpdated; - - _searchDispatcherTimer.Interval = GlobalStaticConfiguration.SearchDispatcherTimerTimeSpan; - _searchDispatcherTimer.Tick += SearchDispatcherTimer_Tick; - - LoadSettings(); - - _isLoading = false; - } - - private void LoadSettings() - { - ExpandProfileView = SettingsManager.Current.DNSLookup_ExpandProfileView; - - ProfileWidth = ExpandProfileView ? new GridLength(SettingsManager.Current.DNSLookup_ProfileWidth) : new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); - - _tempProfileWidth = SettingsManager.Current.DNSLookup_ProfileWidth; - } - #endregion - - #region ICommand & Actions - public ICommand AddTabCommand => new RelayCommand(p => AddTabAction()); +namespace NETworkManager.ViewModels; - private void AddTabAction() - { - AddTab(); - } - - public ICommand LookupProfileCommand => new RelayCommand(p => LookupProfileAction(), LookupProfile_CanExecute); +/// +/// View model for the DNS lookup host view. +/// +public class DNSLookupHostViewModel : ProfileHostViewModelBase +{ + #region Variables - private bool LookupProfile_CanExecute(object obj) - { - return !IsSearching && SelectedProfile != null; - } + /// + /// Gets the client for inter-tab operations. + /// + public IInterTabClient InterTabClient { get; } - private void LookupProfileAction() + /// + /// Gets or sets the inter-tab partition key. + /// + public string InterTabPartition + { + get; + set { - AddTab(SelectedProfile.DNSLookup_Host); - } - - public ICommand AddProfileCommand => new RelayCommand(p => AddProfileAction()); + if (value == field) + return; - private void AddProfileAction() - { - ProfileDialogManager.ShowAddProfileDialog(this, _dialogCoordinator); - } - - public ICommand EditProfileCommand => new RelayCommand(p => EditProfileAction()); - - private void EditProfileAction() - { - ProfileDialogManager.ShowEditProfileDialog(this, _dialogCoordinator, SelectedProfile); + field = value; + OnPropertyChanged(); } + } - public ICommand CopyAsProfileCommand => new RelayCommand(p => CopyAsProfileAction()); + /// + /// Gets the collection of tab items. + /// + public ObservableCollection TabItems { get; } - private void CopyAsProfileAction() + /// + /// Gets or sets the index of the selected tab. + /// + public int SelectedTabIndex + { + get; + set { - ProfileDialogManager.ShowCopyAsProfileDialog(this, _dialogCoordinator, SelectedProfile); - } - - public ICommand DeleteProfileCommand => new RelayCommand(p => DeleteProfileAction()); + if (value == field) + return; - private void DeleteProfileAction() - { - ProfileDialogManager.ShowDeleteProfileDialog(this, _dialogCoordinator, new List { SelectedProfile }); + field = value; + OnPropertyChanged(); } + } - public ICommand EditGroupCommand => new RelayCommand(EditGroupAction); + #endregion - private void EditGroupAction(object group) - { - ProfileDialogManager.ShowEditGroupDialog(this, _dialogCoordinator, ProfileManager.GetGroup(group.ToString())); - } + #region Constructor - public ICommand ClearSearchCommand => new RelayCommand(p => ClearSearchAction()); + /// + /// Initializes a new instance of the class. + /// + public DNSLookupHostViewModel() + { + InterTabClient = new DragablzInterTabClient(ApplicationName.DNSLookup); + InterTabPartition = nameof(ApplicationName.DNSLookup); - private void ClearSearchAction() - { - Search = string.Empty; - } + var tabId = Guid.NewGuid(); - public ItemActionCallback CloseItemCommand => CloseItemAction; + TabItems = + [ + new DragablzTabItem(Strings.NewTab, new DNSLookupView(tabId), tabId) + ]; - private static void CloseItemAction(ItemActionCallbackArgs args) - { - ((args.DragablzItem.Content as DragablzTabItem)?.View as DNSLookupView)?.CloseTab(); - } - #endregion + InitializeProfileHost(); + } - #region Methods - private void StartDelayedSearch() - { - if (!IsSearching) - { - IsSearching = true; - - _searchDispatcherTimer.Start(); - } - else - { - _searchDispatcherTimer.Stop(); - _searchDispatcherTimer.Start(); - } - } + #endregion - private void StopDelayedSearch() - { - _searchDispatcherTimer.Stop(); + #region Profile host - RefreshProfiles(); + protected override ApplicationName ApplicationName => ApplicationName.DNSLookup; - IsSearching = false; - } + protected override bool IsProfileEnabled(ProfileInfo profile) => profile.DNSLookup_Enabled; - private void ResizeProfile(bool dueToChangedSize) - { - _canProfileWidthChange = false; - - if (dueToChangedSize) - { - ExpandProfileView = Math.Abs(ProfileWidth.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > GlobalStaticConfiguration.FloatPointFix; - } - else - { - if (ExpandProfileView) - { - ProfileWidth = Math.Abs(_tempProfileWidth - GlobalStaticConfiguration.Profile_WidthCollapsed) < GlobalStaticConfiguration.FloatPointFix ? new GridLength(GlobalStaticConfiguration.Profile_DefaultWidthExpanded) : new GridLength(_tempProfileWidth); - } - else - { - _tempProfileWidth = ProfileWidth.Value; - ProfileWidth = new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); - } - } - - _canProfileWidthChange = true; - } + protected override string GetSearchableField(ProfileInfo profile) => profile.DNSLookup_Host; - public void AddTab(string host = null) - { - _tabId++; + #endregion - TabItems.Add(new DragablzTabItem(host ?? Localization.Resources.Strings.NewTab, new DNSLookupView(_tabId, host), _tabId)); + #region ICommand & Actions - SelectedTabIndex = TabItems.Count - 1; - } + /// + /// Gets the command to add a new tab. + /// + public ICommand AddTabCommand => new RelayCommand(_ => AddTabAction()); - public void OnViewVisible() - { - _isViewActive = true; + /// + /// Action to add a new tab. + /// + private void AddTabAction() + { + AddTab(); + } - RefreshProfiles(); - } + /// + /// Gets the command to lookup the selected profile. + /// + public ICommand LookupProfileCommand => new RelayCommand(_ => LookupProfileAction(), LookupProfile_CanExecute); - public void OnViewHide() - { - _isViewActive = false; - } + /// + /// Checks if the lookup profile command can be executed. + /// + private bool LookupProfile_CanExecute(object obj) + { + return !IsSearching && SelectedProfile != null; + } - public void RefreshProfiles() - { - if (!_isViewActive) - return; + /// + /// Action to lookup the selected profile. + /// + private void LookupProfileAction() + { + AddTab(SelectedProfile.DNSLookup_Host); + } - Profiles.Refresh(); - } + /// + /// Gets the callback for closing a tab item. + /// + public ItemActionCallback CloseItemCommand => CloseItemAction; - public void OnProfileDialogOpen() - { + /// + /// Action to close a tab item. + /// + private static void CloseItemAction(ItemActionCallbackArgs args) + { + ((args.DragablzItem.Content as DragablzTabItem)?.View as IDragablzTabItem)?.CloseTab(); + } - } + #endregion - public void OnProfileDialogClose() - { + #region Methods - } - #endregion + /// + /// Adds a new tab for the specified host. + /// + /// The host to lookup. + public void AddTab(string host = null) + { + var tabId = Guid.NewGuid(); - #region Event - private void ProfileManager_OnProfilesUpdated(object sender, EventArgs e) - { - RefreshProfiles(); - } + TabItems.Add(new DragablzTabItem(host ?? Strings.NewTab, new DNSLookupView(tabId, host), + tabId)); - private void SearchDispatcherTimer_Tick(object sender, EventArgs e) - { - StopDelayedSearch(); - } - #endregion + SelectedTabIndex = TabItems.Count - 1; } -} \ No newline at end of file + + #endregion +} diff --git a/Source/NETworkManager/ViewModels/DNSLookupSettingsViewModel.cs b/Source/NETworkManager/ViewModels/DNSLookupSettingsViewModel.cs index be3ba19f8c..d9dcee5604 100644 --- a/Source/NETworkManager/ViewModels/DNSLookupSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/DNSLookupSettingsViewModel.cs @@ -1,351 +1,416 @@ -using NETworkManager.Settings; +using DnsClient; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Localization.Resources; +using NETworkManager.Models.Network; +using NETworkManager.Settings; using NETworkManager.Utilities; +using NETworkManager.Views; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; +using System.Threading.Tasks; +using System.Windows; using System.Windows.Data; using System.Windows.Input; -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.Models.Network; -using NETworkManager.Views; -using DnsClient; -using System.Threading.Tasks; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +/// +/// View model for the DNS lookup settings. +/// +public class DNSLookupSettingsViewModel : ViewModelBase { - public class DNSLookupSettingsViewModel : ViewModelBase + #region Variables + + /// + /// Indicates whether the view model is loading. + /// + private readonly bool _isLoading; + + /// + /// Default values for the profile dialog. + /// + private readonly ServerConnectionInfo _profileDialogDefaultValues = new("10.0.0.1", 53, TransportProtocol.Udp); + + /// + /// Gets the collection view of DNS servers. + /// + public ICollectionView DNSServers { get; } + + /// + /// Gets or sets the selected DNS server. + /// + public DNSServerConnectionInfoProfile SelectedDNSServer { - #region Variables - private readonly bool _isLoading; - - private readonly IDialogCoordinator _dialogCoordinator; - - public ICollectionView DNSServers { get; } - - private DNSServerInfo _selectedDNSServer = new DNSServerInfo(); - public DNSServerInfo SelectedDNSServer + get; + set { - get => _selectedDNSServer; - set - { - if (value == _selectedDNSServer) - return; - - _selectedDNSServer = value; - OnPropertyChanged(); - } + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - private bool _addDNSSuffix; - public bool AddDNSSuffix + /// + /// Gets the list of server info profile names. + /// + private List ServerInfoProfileNames => + [ + .. SettingsManager.Current.DNSLookup_DNSServers + .Where(x => !x.UseWindowsDNSServer).Select(x => x.Name) + ]; + + /// + /// Gets or sets a value indicating whether to add DNS suffix. + /// + public bool AddDNSSuffix + { + get; + set { - get => _addDNSSuffix; - set - { - if (value == _addDNSSuffix) - return; - - if (!_isLoading) - SettingsManager.Current.DNSLookup_AddDNSSuffix = value; - - _addDNSSuffix = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.DNSLookup_AddDNSSuffix = value; + + field = value; + OnPropertyChanged(); } + } - private bool _useCustomDNSSuffix; - public bool UseCustomDNSSuffix + /// + /// Gets or sets a value indicating whether to use a custom DNS suffix. + /// + public bool UseCustomDNSSuffix + { + get; + set { - get => _useCustomDNSSuffix; - set - { - if (value == _useCustomDNSSuffix) - return; - - if (!_isLoading) - SettingsManager.Current.DNSLookup_UseCustomDNSSuffix = value; - - _useCustomDNSSuffix = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.DNSLookup_UseCustomDNSSuffix = value; + + field = value; + OnPropertyChanged(); } + } - private string _customDNSSuffix; - public string CustomDNSSuffix + /// + /// Gets or sets the custom DNS suffix. + /// + public string CustomDNSSuffix + { + get; + set { - get => _customDNSSuffix; - set - { - if (value == _customDNSSuffix) - return; - - if (!_isLoading) - SettingsManager.Current.DNSLookup_CustomDNSSuffix = value; - - _customDNSSuffix = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.DNSLookup_CustomDNSSuffix = value; + + field = value; + OnPropertyChanged(); } + } - private bool _recursion; - public bool Recursion + /// + /// Gets or sets a value indicating whether recursion is enabled. + /// + public bool Recursion + { + get; + set { - get => _recursion; - set - { - if (value == _recursion) - return; - - if (!_isLoading) - SettingsManager.Current.DNSLookup_Recursion = value; - - _recursion = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.DNSLookup_Recursion = value; + + field = value; + OnPropertyChanged(); } + } - private bool _useCache; - public bool UseCache + /// + /// Gets or sets a value indicating whether to use cache. + /// + public bool UseCache + { + get; + set { - get => _useCache; - set - { - if (value == _useCache) - return; - - if (!_isLoading) - SettingsManager.Current.DNSLookup_UseCache = value; - - _useCache = value; - OnPropertyChanged(); - } - } + if (value == field) + return; - public List QueryClasses { get; set; } + if (!_isLoading) + SettingsManager.Current.DNSLookup_UseCache = value; - private QueryClass _queryClass; - public QueryClass QueryClass - { - get => _queryClass; - set - { - if (value == _queryClass) - return; - - if (!_isLoading) - SettingsManager.Current.DNSLookup_QueryClass = value; - - _queryClass = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + + /// + /// Gets the list of available query classes. + /// + public List QueryClasses { get; private set; } - private bool _showOnlyMostCommonQueryTypes; - public bool ShowOnlyMostCommonQueryTypes + /// + /// Gets or sets the selected query class. + /// + public QueryClass QueryClass + { + get; + set { - get => _showOnlyMostCommonQueryTypes; - set - { - if (value == _showOnlyMostCommonQueryTypes) - return; - - if (!_isLoading) - SettingsManager.Current.DNSLookup_ShowOnlyMostCommonQueryTypes = value; - - _showOnlyMostCommonQueryTypes = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.DNSLookup_QueryClass = value; + + field = value; + OnPropertyChanged(); } + } - private bool _useTCPOnly; - public bool UseTCPOnly + /// + /// Gets or sets a value indicating whether to use TCP only. + /// + public bool UseTCPOnly + { + get; + set { - get => _useTCPOnly; - set - { - if (value == _useTCPOnly) - return; - - if (!_isLoading) - SettingsManager.Current.DNSLookup_UseTCPOnly = value; - - _useTCPOnly = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.DNSLookup_UseTCPOnly = value; + + field = value; + OnPropertyChanged(); } - - private int _retries; - public int Retries + } + + /// + /// Gets or sets the number of retries. + /// + public int Retries + { + get; + set { - get => _retries; - set - { - if (value == _retries) - return; - - if (!_isLoading) - SettingsManager.Current.DNSLookup_Retries = value; - - _retries = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.DNSLookup_Retries = value; + + field = value; + OnPropertyChanged(); } + } - private int _timeout; - public int Timeout + /// + /// Gets or sets the timeout in milliseconds. + /// + public int Timeout + { + get; + set { - get => _timeout; - set - { - if (value == _timeout) - return; - - if (!_isLoading) - SettingsManager.Current.DNSLookup_Timeout = value; - - _timeout = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.DNSLookup_Timeout = value; + + field = value; + OnPropertyChanged(); } - #endregion + } + + #endregion + + #region Constructor, load settings - #region Constructor, load settings - public DNSLookupSettingsViewModel(IDialogCoordinator instance) + /// + /// Initializes a new instance of the class. + /// + public DNSLookupSettingsViewModel() + { + _isLoading = true; + + DNSServers = CollectionViewSource.GetDefaultView(SettingsManager.Current.DNSLookup_DNSServers); + DNSServers.SortDescriptions.Add(new SortDescription(nameof(DNSServerConnectionInfoProfile.Name), + ListSortDirection.Ascending)); + DNSServers.Filter = o => { - _isLoading = true; + if (o is not DNSServerConnectionInfoProfile info) + return false; - _dialogCoordinator = instance; + return !info.UseWindowsDNSServer; + }; - DNSServers = CollectionViewSource.GetDefaultView(SettingsManager.Current.DNSLookup_DNSServers); - DNSServers.SortDescriptions.Add(new SortDescription(nameof(DNSServerInfo.Name), ListSortDirection.Ascending)); - DNSServers.Filter = o => - { - if (!(o is DNSServerInfo info)) - return false; + SelectedDNSServer = DNSServers.Cast().FirstOrDefault(x => !x.UseWindowsDNSServer); - return !info.UseWindowsDNSServer; - }; + LoadSettings(); - LoadSettings(); + _isLoading = false; + } - _isLoading = false; - } + /// + /// Loads the settings. + /// + private void LoadSettings() + { + AddDNSSuffix = SettingsManager.Current.DNSLookup_AddDNSSuffix; + UseCustomDNSSuffix = SettingsManager.Current.DNSLookup_UseCustomDNSSuffix; + CustomDNSSuffix = SettingsManager.Current.DNSLookup_CustomDNSSuffix; + Recursion = SettingsManager.Current.DNSLookup_Recursion; + UseCache = SettingsManager.Current.DNSLookup_UseCache; + QueryClasses = [.. Enum.GetValues().OrderBy(x => x.ToString())]; + QueryClass = QueryClasses.First(x => x == SettingsManager.Current.DNSLookup_QueryClass); + UseTCPOnly = SettingsManager.Current.DNSLookup_UseTCPOnly; + Retries = SettingsManager.Current.DNSLookup_Retries; + Timeout = SettingsManager.Current.DNSLookup_Timeout; + } - private void LoadSettings() - { - AddDNSSuffix = SettingsManager.Current.DNSLookup_AddDNSSuffix; - UseCustomDNSSuffix = SettingsManager.Current.DNSLookup_UseCustomDNSSuffix; - CustomDNSSuffix = SettingsManager.Current.DNSLookup_CustomDNSSuffix; - Recursion = SettingsManager.Current.DNSLookup_Recursion; - UseCache = SettingsManager.Current.DNSLookup_UseCache; - QueryClasses = System.Enum.GetValues(typeof(QueryClass)).Cast().OrderBy(x => x.ToString()).ToList(); - QueryClass = QueryClasses.First(x => x == SettingsManager.Current.DNSLookup_QueryClass); - ShowOnlyMostCommonQueryTypes = SettingsManager.Current.DNSLookup_ShowOnlyMostCommonQueryTypes; - UseTCPOnly = SettingsManager.Current.DNSLookup_UseTCPOnly; - Retries = SettingsManager.Current.DNSLookup_Retries; - Timeout = SettingsManager.Current.DNSLookup_Timeout; - } - #endregion + #endregion - #region ICommand & Actions - public ICommand AddDNSServerCommand => new RelayCommand(p => AddDNSServerAction()); + #region ICommand & Actions - private void AddDNSServerAction() - { - AddDNSServer(); - } + /// + /// Gets the command to add a DNS server. + /// + public ICommand AddDNSServerCommand => new RelayCommand(_ => AddDNSServerAction()); + + /// + /// Action to add a DNS server. + /// + private void AddDNSServerAction() + { + _ = AddDNSServer(); + } - public ICommand EditDNSServerCommand => new RelayCommand(p => EditDNSServerAction()); + /// + /// Gets the command to edit a DNS server. + /// + public ICommand EditDNSServerCommand => new RelayCommand(_ => EditDNSServerAction()); - private void EditDNSServerAction() - { - EditDNSServer(); - } + /// + /// Action to edit a DNS server. + /// + private void EditDNSServerAction() + { + _ = EditDNSServer(); + } + + /// + /// Gets the command to delete a DNS server. + /// + public ICommand DeleteDNSServerCommand => new RelayCommand(_ => DeleteDNSServerAction()); + + /// + /// Action to delete a DNS server. + /// + private void DeleteDNSServerAction() + { + _ = DeleteDNSServer(); + } - public ICommand DeleteDNSServerCommand => new RelayCommand(p => DeleteDNSServerAction()); + #endregion - private void DeleteDNSServerAction() + #region Methods + + /// + /// Adds a new DNS server. + /// + private async Task AddDNSServer() + { + var childWindow = new ServerConnectionInfoProfileChildWindow(); + + var childWindowViewModel = new ServerConnectionInfoProfileViewModel(instance => { - DeleteDNSServer(); - } - #endregion + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - #region Methods - public async Task AddDNSServer() + SettingsManager.Current.DNSLookup_DNSServers.Add( + new DNSServerConnectionInfoProfile(instance.Name, [.. instance.Servers])); + }, _ => { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.AddDNSServer - }; - - var dnsServerViewModel = new DNSServerViewModel(instance => - { - _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - - SettingsManager.Current.DNSLookup_DNSServers.Add(new DNSServerInfo(instance.Name, instance.DNSServers.Replace(" ", "").Split(';').ToList(), instance.Port)); - }, instance => - { - _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - }); - - customDialog.Content = new DNSServerDialog - { - DataContext = dnsServerViewModel - }; - - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, + (ServerInfoProfileNames, false, false), + _profileDialogDefaultValues); + + childWindow.Title = Strings.AddDNSServer; + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } + + /// + /// Edits the selected DNS server. + /// + public async Task EditDNSServer() + { + var childWindow = new ServerConnectionInfoProfileChildWindow(); - public async Task EditDNSServer() + var childWindowViewModel = new ServerConnectionInfoProfileViewModel(instance => { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.EditDNSServer - }; - - var dnsServerViewModel = new DNSServerViewModel(instance => - { - _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - - SettingsManager.Current.DNSLookup_DNSServers.Remove(SelectedDNSServer); - SettingsManager.Current.DNSLookup_DNSServers.Add(new DNSServerInfo(instance.Name, instance.DNSServers.Replace(" ", "").Split(';').ToList(), instance.Port)); - }, instance => - { - _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - }, true, SelectedDNSServer); - - customDialog.Content = new DNSServerDialog - { - DataContext = dnsServerViewModel - }; - - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - public async Task DeleteDNSServer() + SettingsManager.Current.DNSLookup_DNSServers.Remove(SelectedDNSServer); + SettingsManager.Current.DNSLookup_DNSServers.Add( + new DNSServerConnectionInfoProfile(instance.Name, [.. instance.Servers])); + }, _ => { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.DeleteDNSServer - }; - - var confirmDeleteViewModel = new ConfirmDeleteViewModel(instance => - { - _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - - SettingsManager.Current.DNSLookup_DNSServers.Remove(SelectedDNSServer); - }, instance => - { - _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - }, Localization.Resources.Strings.DeleteDNSServerMessage); - - customDialog.Content = new ConfirmDeleteDialog - { - DataContext = confirmDeleteViewModel - }; - - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } - #endregion + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, + (ServerInfoProfileNames, true, false), + _profileDialogDefaultValues, SelectedDNSServer); + + childWindow.Title = Strings.EditDNSServer; + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } + + /// + /// Deletes the selected DNS server. + /// + private async Task DeleteDNSServer() + { + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, + Strings.DeleteDNSServer, + Strings.DeleteDNSServerMessage, + ChildWindowIcon.Info, + Strings.Delete); + + if (!result) + return; + + SettingsManager.Current.DNSLookup_DNSServers.Remove(SelectedDNSServer); + } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/DNSLookupViewModel.cs b/Source/NETworkManager/ViewModels/DNSLookupViewModel.cs index 1516312a87..0f38a429a9 100644 --- a/Source/NETworkManager/ViewModels/DNSLookupViewModel.cs +++ b/Source/NETworkManager/ViewModels/DNSLookupViewModel.cs @@ -1,471 +1,628 @@ -using NETworkManager.Models.Network; +using DnsClient; +using log4net; +using MahApps.Metro.Controls; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Models.Export; +using NETworkManager.Models.Network; using NETworkManager.Settings; +using NETworkManager.Utilities; +using NETworkManager.Views; using System; using System.Collections; using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Linq; +using System.Net; +using System.Threading.Tasks; using System.Windows; +using System.Windows.Data; using System.Windows.Input; using System.Windows.Threading; -using System.Linq; -using System.ComponentModel; -using System.Windows.Data; -using NETworkManager.Utilities; -using System.Collections.ObjectModel; -using NETworkManager.Controls; -using Dragablz; -using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.Models.Export; -using NETworkManager.Views; -using DnsClient; -using System.Threading.Tasks; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +/// +/// View model for the DNS lookup view. +/// +public class DNSLookupViewModel : ViewModelBase { - public class DNSLookupViewModel : ViewModelBase + #region Variables + private static readonly ILog Log = LogManager.GetLogger(typeof(DNSLookupViewModel)); + + private readonly Guid _tabId; + private bool _firstLoad = true; + private bool _closed; + + /// + /// Indicates whether the view model is loading. + /// + private readonly bool _isLoading; + + /// + /// Gets or sets the host to lookup. + /// + public string Host { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - - public readonly int TabId; - private bool _firstLoad = true; - - private string _lastSortDescriptionAscending = string.Empty; + get; + set + { + if (value == field) + return; - private readonly bool _isLoading; + field = value; + OnPropertyChanged(); + } + } - private string _host; - public string Host + /// + /// Gets the collection view of host history. + /// + public ICollectionView HostHistoryView { get; } + + /// + /// Gets the collection view of DNS servers. + /// + public ICollectionView DNSServers { get; } + + /// + /// Gets or sets the selected DNS server. + /// This can either be an ip/host:port or a profile name. + /// + public string DNSServer + { + get; + set { - get => _host; - set - { - if (value == _host) - return; + if (field == value) + return; - _host = value; - OnPropertyChanged(); - } - } + // Try finding matching dns server profile by name, otherwise set to null (de-select) + SelectedDNSServer = SettingsManager.Current.DNSLookup_DNSServers + .FirstOrDefault(x => x.Name == value); - public ICollectionView HostHistoryView { get; } + if (!_isLoading) + SettingsManager.Current.DNSLookup_SelectedDNSServer_v2 = value; - public ICollectionView DNSServers { get; } + field = value; + OnPropertyChanged(); + } + } - private DNSServerInfo _dnsServer = new DNSServerInfo(); - public DNSServerInfo DNSServer + public DNSServerConnectionInfoProfile SelectedDNSServer + { + get; + set { - get => _dnsServer; - set - { - if (value == _dnsServer) - return; - - if (!_isLoading) - SettingsManager.Current.DNSLookup_SelectedDNSServer = value; + if (field == value) + return; - _dnsServer = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private List _queryTypes = new List(); - public List QueryTypes + /// + /// Gets the list of available query types. + /// + public List QueryTypes + { + get; + private set { - get => _queryTypes; - set - { - if (value == _queryTypes) - return; + if (value == field) + return; - _queryTypes = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = []; - private QueryType _queryType; - public QueryType QueryType + /// + /// Gets or sets the selected query type. + /// + public QueryType QueryType + { + get; + set { - get => _queryType; - set - { - if (value == _queryType) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.DNSLookup_QueryType = value; + if (!_isLoading) + SettingsManager.Current.DNSLookup_QueryType = value; - _queryType = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isLookupRunning; - public bool IsLookupRunning + /// + /// Gets or sets a value indicating whether the lookup is running. + /// + public bool IsRunning + { + get; + set { - get => _isLookupRunning; - set - { - if (value == _isLookupRunning) - return; + if (value == field) + return; - _isLookupRunning = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private ObservableCollection _lookupResults = new ObservableCollection(); - public ObservableCollection LookupResults + /// + /// Gets or sets the collection of lookup results. + /// + public ObservableCollection Results + { + get; + set { - get => _lookupResults; - set - { - if (Equals(value, _lookupResults)) - return; + if (Equals(value, field)) + return; - _lookupResults = value; - } + field = value; } + } = []; - public ICollectionView LookupResultsView { get; } + /// + /// Gets the collection view for lookup results. + /// + public ICollectionView ResultsView { get; } - private DNSLookupRecordInfo _selectedLookupResult; - public DNSLookupRecordInfo SelectedLookupResult + /// + /// Gets or sets the selected lookup result. + /// + public DNSLookupRecordInfo SelectedResult + { + get; + set { - get => _selectedLookupResult; - set - { - if (value == _selectedLookupResult) - return; + if (value == field) + return; - _selectedLookupResult = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private IList _selectedLookupResults = new ArrayList(); - public IList SelectedLookupResults + /// + /// Gets or sets the list of selected lookup results. + /// + public IList SelectedResults + { + get; + set { - get => _selectedLookupResults; - set - { - if (Equals(value, _selectedLookupResults)) - return; + if (Equals(value, field)) + return; - _selectedLookupResults = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = new ArrayList(); - private bool _isStatusMessageDisplayed; - public bool IsStatusMessageDisplayed + /// + /// Gets or sets a value indicating whether the status message is displayed. + /// + public bool IsStatusMessageDisplayed + { + get; + set { - get => _isStatusMessageDisplayed; - set - { - if (value == _isStatusMessageDisplayed) - return; + if (value == field) + return; - _isStatusMessageDisplayed = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _statusMessage; - public string StatusMessage + /// + /// Gets the status message. + /// + public string StatusMessage + { + get; + private set { - get => _statusMessage; - set - { - if (value == _statusMessage) - return; + if (value == field) + return; - _statusMessage = value; - OnPropertyChanged(); - } - } - #endregion + field = value; + OnPropertyChanged(); + } + } - #region Contructor, load settings - public DNSLookupViewModel(IDialogCoordinator instance, int tabId, string host) - { - _isLoading = true; + #endregion - _dialogCoordinator = instance; + #region Contructor, load settings - TabId = tabId; - Host = host; + /// + /// Initializes a new instance of the class. + /// + /// The ID of the tab. + /// The host to lookup. + public DNSLookupViewModel(Guid tabId, string host) + { + _isLoading = true; - HostHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.DNSLookup_HostHistory); + ConfigurationManager.Current.DNSLookupTabCount++; - // Add default DNS server... - if (SettingsManager.Current.DNSLookup_DNSServers.Count == 0) - SettingsManager.Current.DNSLookup_DNSServers = new ObservableCollection(Models.Network.DNSServer.DefaultList()); + _tabId = tabId; + Host = host; - DNSServers = new CollectionViewSource { Source = SettingsManager.Current.DNSLookup_DNSServers }.View; - DNSServers.SortDescriptions.Add(new SortDescription(nameof(DNSServerInfo.UseWindowsDNSServer), ListSortDirection.Descending)); - DNSServers.SortDescriptions.Add(new SortDescription(nameof(DNSServerInfo.Name), ListSortDirection.Ascending)); - DNSServer = DNSServers.SourceCollection.Cast().FirstOrDefault(x => x.Name == SettingsManager.Current.DNSLookup_SelectedDNSServer.Name) ?? DNSServers.SourceCollection.Cast().First(); + HostHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.DNSLookup_HostHistory); - LookupResultsView = CollectionViewSource.GetDefaultView(LookupResults); - LookupResultsView.GroupDescriptions.Add(new PropertyGroupDescription(nameof(DNSLookupRecordInfo.DNSServer))); - LookupResultsView.SortDescriptions.Add(new SortDescription(nameof(DNSLookupRecordInfo.DNSServer), ListSortDirection.Descending)); + DNSServers = new CollectionViewSource { Source = SettingsManager.Current.DNSLookup_DNSServers }.View; + DNSServers.SortDescriptions.Add(new SortDescription(nameof(DNSServerConnectionInfoProfile.UseWindowsDNSServer), + ListSortDirection.Descending)); + DNSServers.SortDescriptions.Add(new SortDescription(nameof(DNSServerConnectionInfoProfile.Name), + ListSortDirection.Ascending)); - LoadSettings(); + DNSServer = string.IsNullOrEmpty(SettingsManager.Current.DNSLookup_SelectedDNSServer_v2) + ? SettingsManager.Current.DNSLookup_DNSServers.FirstOrDefault()?.Name + : SettingsManager.Current.DNSLookup_SelectedDNSServer_v2; - // Detect if settings have changed... - SettingsManager.Current.PropertyChanged += SettingsManager_PropertyChanged; + ResultsView = CollectionViewSource.GetDefaultView(Results); + ResultsView.GroupDescriptions.Add(new PropertyGroupDescription(nameof(DNSLookupRecordInfo.NameServerAsString))); + ResultsView.SortDescriptions.Add(new SortDescription(nameof(DNSLookupRecordInfo.NameServerIPAddress), + ListSortDirection.Descending)); - _isLoading = false; - } + LoadSettings(); - public void OnLoaded() - { - if (!_firstLoad) - return; + _isLoading = false; + } - if (!string.IsNullOrEmpty(Host)) - StartLookup(); + /// + /// Called when the view is loaded. + /// + public void OnLoaded() + { + if (!_firstLoad) + return; - _firstLoad = false; - } + if (!string.IsNullOrEmpty(Host)) + _ = QueryAsync(); - private void LoadSettings() - { - LoadTypes(); - } + _firstLoad = false; + } - private void LoadTypes() - { - // Filter by common types... - QueryTypes = SettingsManager.Current.DNSLookup_ShowOnlyMostCommonQueryTypes ? System.Enum.GetValues(typeof(QueryType)).Cast().Where(x => (x == QueryType.A || x == QueryType.AAAA || x == QueryType.ANY || x == QueryType.CNAME || x == QueryType.MX || x == QueryType.NS || x == QueryType.PTR || x == QueryType.SOA || x == QueryType.TXT)).OrderBy(x => x.ToString()).ToList() : System.Enum.GetValues(typeof(QueryType)).Cast().OrderBy(x => x.ToString()).ToList(); - QueryType = QueryTypes.FirstOrDefault(x => x == SettingsManager.Current.DNSLookup_QueryType); + /// + /// Loads the settings. + /// + private void LoadSettings() + { + LoadTypes(); + } - // Fallback - if (QueryType == 0) - QueryType = QueryType.ANY; - } - #endregion + /// + /// Loads the query types. + /// + private void LoadTypes() + { + var queryTypes = (QueryType[])Enum.GetValues(typeof(QueryType)); - #region ICommands & Actions - public ICommand LookupCommand => new RelayCommand(p => LookupAction(), Lookup_CanExecute); + QueryTypes = [.. queryTypes.Where(DNSLookup.QueryTypes.Contains).OrderBy(x => x.ToString())]; + QueryType = QueryTypes.FirstOrDefault(x => x == SettingsManager.Current.DNSLookup_QueryType); - private bool Lookup_CanExecute(object paramter) => Application.Current.MainWindow != null && !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen; + // Fallback + if (QueryType == 0) + QueryType = GlobalStaticConfiguration.DNSLookup_QueryType; + } - private void LookupAction() - { - if (!IsLookupRunning) - StartLookup(); - } + #endregion - public ICommand CopySelectedDomainNameCommand => new RelayCommand(p => CopySelectedDomainNameAction()); + #region ICommands & Actions - private void CopySelectedDomainNameAction() - { - ClipboardHelper.SetClipboard(SelectedLookupResult.DomainName); - } + /// + /// Gets the command to start the query. + /// + public ICommand QueryCommand => new RelayCommand(_ => QueryAction(), Query_CanExecute); - public ICommand CopySelectedTTLCommand => new RelayCommand(p => CopySelectedTTLAction()); + /// + /// Checks if the query command can be executed. + /// + /// The command parameter. + /// true if the command can be executed; otherwise, false. + private bool Query_CanExecute(object parameter) + { + return Application.Current.MainWindow != null && + !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && + !ConfigurationManager.Current.IsChildWindowOpen; + } - private void CopySelectedTTLAction() - { - ClipboardHelper.SetClipboard(SelectedLookupResult.TTL.ToString()); - } + /// + /// Action to start the query. + /// + private void QueryAction() + { + if (!IsRunning) + _ = QueryAsync(); + } - public ICommand CopySelectedClassCommand => new RelayCommand(p => CopySelectedClassAction()); + /// + /// Gets the command to export the results. + /// + public ICommand ExportCommand => new RelayCommand(_ => ExportAction()); - private void CopySelectedClassAction() - { - ClipboardHelper.SetClipboard(SelectedLookupResult.Class); - } + /// + /// Action to export the results. + /// + private void ExportAction() + { + _ = Export(); + } - public ICommand CopySelectedTypeCommand => new RelayCommand(p => CopySelectedTypeAction()); + #endregion - private void CopySelectedTypeAction() - { - ClipboardHelper.SetClipboard(SelectedLookupResult.Type); - } + #region Methods + /// + /// Performs the DNS query. + /// + private async Task QueryAsync() + { + IsStatusMessageDisplayed = false; + StatusMessage = string.Empty; + + IsRunning = true; - public ICommand CopySelectedResultCommand => new RelayCommand(p => CopySelectedResultAction()); + Results.Clear(); - private void CopySelectedResultAction() + DragablzTabItem.SetTabHeader(_tabId, Host); + + AddHostToHistory(Host); + + DNSLookupSettings dnsSettings = new() + { + AddDNSSuffix = SettingsManager.Current.DNSLookup_AddDNSSuffix, + QueryClass = SettingsManager.Current.DNSLookup_QueryClass, + QueryType = QueryType, + Recursion = SettingsManager.Current.DNSLookup_Recursion, + UseCache = SettingsManager.Current.DNSLookup_UseCache, + UseTCPOnly = SettingsManager.Current.DNSLookup_UseTCPOnly, + Retries = SettingsManager.Current.DNSLookup_Retries, + Timeout = TimeSpan.FromSeconds(SettingsManager.Current.DNSLookup_Timeout) + }; + + if (SettingsManager.Current.DNSLookup_UseCustomDNSSuffix) { - ClipboardHelper.SetClipboard(SelectedLookupResult.Result); + dnsSettings.UseCustomDNSSuffix = true; + dnsSettings.CustomDNSSuffix = SettingsManager.Current.DNSLookup_CustomDNSSuffix?.TrimStart('.'); } - public ICommand ExportCommand => new RelayCommand(p => ExportAction()); + // Try to find DNS server profile + var dnsServerProfile = SettingsManager.Current.DNSLookup_DNSServers + .FirstOrDefault(x => x.Name == DNSServer); - private async Task ExportAction() + DNSLookup dnsLookup = null; + List dnsServersToResolve = []; + + // Use DNS server profile if found + if (dnsServerProfile != null) { - var customDialog = new CustomDialog + if (dnsServerProfile.UseWindowsDNSServer) + dnsLookup = new DNSLookup(dnsSettings); + else + dnsServersToResolve = dnsServerProfile.Servers; + } + // Parse DNS server input + else + { + foreach (var dnsServerInput in DNSServer.Split(';')) { - Title = Localization.Resources.Strings.Export - }; + if (ServerConnectionInfo.TryParse(dnsServerInput, out var serverInfo, 53, TransportProtocol.Udp)) + dnsServersToResolve.Add(serverInfo); + else + AppendStatusMessage(Strings.DNSServer + ": " + string.Format(Strings.CouldNotParseX, dnsServerInput)); + } + } - var exportViewModel = new ExportViewModel(async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + // Resolve DNS server hostnames (if any) - not required when using Windows DNS servers + if (dnsLookup == null) + { + List resolvedDNSServers = []; - try - { - ExportManager.Export(instance.FilePath, instance.FileType, instance.ExportAll ? LookupResults : new ObservableCollection(SelectedLookupResults.Cast().ToArray())); - } - catch (Exception ex) + foreach (var dnsServerToResolve in dnsServersToResolve) + { + // Check if already an IP address + if (IPAddress.TryParse(dnsServerToResolve.Server, out _)) { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Localization.Resources.Strings.OK; + resolvedDNSServers.Add(dnsServerToResolve); - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Error, Localization.Resources.Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); + continue; } - SettingsManager.Current.DNSLookup_ExportFileType = instance.FileType; - SettingsManager.Current.DNSLookup_ExportFilePath = instance.FilePath; - }, instance => { _dialogCoordinator.HideMetroDialogAsync(this, customDialog); }, new ExportManager.ExportFileType[] { ExportManager.ExportFileType.CSV, ExportManager.ExportFileType.XML, ExportManager.ExportFileType.JSON }, true, SettingsManager.Current.DNSLookup_ExportFileType, SettingsManager.Current.DNSLookup_ExportFilePath); - - customDialog.Content = new ExportDialog - { - DataContext = exportViewModel - }; - - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } - #endregion + // Resolve hostname to IP address + var dnsResult = await DNSClientHelper.ResolveAorAaaaAsync(dnsServerToResolve.Server, + SettingsManager.Current.Network_ResolveHostnamePreferIPv4); - #region Methods - private void StartLookup() - { - IsStatusMessageDisplayed = false; - StatusMessage = string.Empty; + if (dnsResult.HasError) + { + var dnsErrorMessage = DNSClientHelper.FormatDNSClientResultError(dnsServerToResolve.Server, dnsResult); - IsLookupRunning = true; + AppendStatusMessage($"{Strings.DNSServer}: {dnsErrorMessage}"); - // Reset the latest results - LookupResults.Clear(); + continue; + } - // Change the tab title (not nice, but it works) - var window = Application.Current.Windows.OfType().FirstOrDefault(x => x.IsActive); + resolvedDNSServers.Add(new ServerConnectionInfo( + dnsResult.Value.ToString(), + dnsServerToResolve.Port, + dnsServerToResolve.TransportProtocol) + ); + } - if (window != null) + // Create DNS lookup instance + if (resolvedDNSServers.Count > 0) { - foreach (var tabablzControl in VisualTreeHelper.FindVisualChildren(window)) - { - tabablzControl.Items.OfType().First(x => x.Id == TabId).Header = Host; - } + dnsLookup = new DNSLookup(dnsSettings, resolvedDNSServers); } + else + { + AppendStatusMessage(Strings.CouldNotParseOrResolveDNSServers); - AddHostToHistory(Host); + IsRunning = false; - var dnsLookup = new DNSLookup - { - AddDNSSuffix = SettingsManager.Current.DNSLookup_AddDNSSuffix, - QueryClass = SettingsManager.Current.DNSLookup_QueryClass, - QueryType = QueryType, - Recursion = SettingsManager.Current.DNSLookup_Recursion, - UseCache = SettingsManager.Current.DNSLookup_UseCache, - UseTCPOnly = SettingsManager.Current.DNSLookup_UseTCPOnly, - Retries = SettingsManager.Current.DNSLookup_Retries, - Timeout = TimeSpan.FromSeconds(SettingsManager.Current.DNSLookup_Timeout), - }; - - if (!DNSServer.UseWindowsDNSServer) - { - dnsLookup.UseCustomDNSServer = true; - dnsLookup.CustomDNSServer = DNSServer; + return; } + } - if (SettingsManager.Current.DNSLookup_UseCustomDNSSuffix) - { - dnsLookup.UseCustomDNSSuffix = true; - dnsLookup.CustomDNSSuffix = SettingsManager.Current.DNSLookup_CustomDNSSuffix.TrimStart('.'); - } + dnsLookup.RecordReceived += DNSLookup_RecordReceived; + dnsLookup.LookupError += DNSLookup_LookupError; + dnsLookup.LookupComplete += DNSLookup_LookupComplete; - dnsLookup.RecordReceived += DNSLookup_RecordReceived; - dnsLookup.LookupError += DNSLookup_LookupError; - dnsLookup.LookupComplete += DNSLookup_LookupComplete; + dnsLookup.ResolveAsync([.. Host.Split(';').Select(x => x.Trim())]); + } - dnsLookup.ResolveAsync(Host.Split(';').Select(x => x.Trim()).ToList()); - } + /// + /// Called when the view is closed. + /// + public void OnClose() + { + // Prevent multiple calls + if (_closed) + return; - private void LookupFinished() - { - IsLookupRunning = false; - } + _closed = true; - public void OnClose() - { + ConfigurationManager.Current.DNSLookupTabCount--; + } - } + /// + /// Appends the specified message to the current status message, adding a new line if a message already exists. + /// + /// The status message text to append. Cannot be null. + private void AppendStatusMessage(string message) + { + if (!string.IsNullOrEmpty(StatusMessage)) + StatusMessage += Environment.NewLine; - // Modify history list - private void AddHostToHistory(string host) - { - // Create the new list - var list = ListHelper.Modify(SettingsManager.Current.DNSLookup_HostHistory.ToList(), host, SettingsManager.Current.General_HistoryListEntries); + StatusMessage += message; + IsStatusMessageDisplayed = true; + } - // Clear the old items - SettingsManager.Current.DNSLookup_HostHistory.Clear(); - OnPropertyChanged(nameof(Host)); // Raise property changed again, after the collection has been cleared + // Modify history list + /// + /// Adds the host to the history. + /// + /// The host to add. + private void AddHostToHistory(string host) + { + // Create the new list + var list = ListHelper.Modify([.. SettingsManager.Current.DNSLookup_HostHistory], host, + SettingsManager.Current.General_HistoryListEntries); + + // Clear the old items + SettingsManager.Current.DNSLookup_HostHistory.Clear(); + OnPropertyChanged(nameof(Host)); // Raise property changed again, after the collection has been cleared + + // Fill with the new items + list.ForEach(x => SettingsManager.Current.DNSLookup_HostHistory.Add(x)); + } - // Fill with the new items - list.ForEach(x => SettingsManager.Current.DNSLookup_HostHistory.Add(x)); - } - public void SortResultByPropertyName(string sortDescription) + /// + /// Exports the results. + /// + private Task Export() + { + var window = Application.Current.Windows.OfType().FirstOrDefault(x => x.IsActive); + + var childWindow = new ExportChildWindow(); + + var childWindowViewModel = new ExportViewModel(async instance => { - LookupResultsView.SortDescriptions.Clear(); - LookupResultsView.SortDescriptions.Add(new SortDescription(nameof(DNSLookupRecordInfo.DNSServer), ListSortDirection.Descending)); + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - if (_lastSortDescriptionAscending.Equals(sortDescription)) + try { - LookupResultsView.SortDescriptions.Add(new SortDescription(sortDescription, ListSortDirection.Descending)); - _lastSortDescriptionAscending = string.Empty; + ExportManager.Export(instance.FilePath, instance.FileType, + instance.ExportAll + ? Results + : new ObservableCollection(SelectedResults + .Cast().ToArray())); } - else + catch (Exception ex) { - LookupResultsView.SortDescriptions.Add(new SortDescription(sortDescription, ListSortDirection.Ascending)); - _lastSortDescriptionAscending = sortDescription; + Log.Error("Error while exporting data as " + instance.FileType, ex); + + await DialogHelper.ShowMessageAsync(window, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); } - } - #endregion - #region Events - private void DNSLookup_RecordReceived(object sender, DNSLookupRecordArgs e) + SettingsManager.Current.DNSLookup_ExportFileType = instance.FileType; + SettingsManager.Current.DNSLookup_ExportFilePath = instance.FilePath; + }, _ => { - var dnsLookupRecordInfo = DNSLookupRecordInfo.Parse(e); + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, + [ + ExportFileType.Csv, ExportFileType.Xml, ExportFileType.Json + ], true, + SettingsManager.Current.DNSLookup_ExportFileType, SettingsManager.Current.DNSLookup_ExportFilePath); - Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(delegate - { - //lock (LookupResults) - LookupResults.Add(dnsLookupRecordInfo); - })); - } + childWindow.Title = Strings.Export; - private void DNSLookup_LookupError(object sender, DNSLookupErrorArgs e) - { - if (!string.IsNullOrEmpty(StatusMessage)) - StatusMessage += Environment.NewLine; - - StatusMessage += $"{e.DNSServer.Address}: {e.ErrorCode}"; + childWindow.DataContext = childWindowViewModel; - IsStatusMessageDisplayed = true; + ConfigurationManager.Current.IsChildWindowOpen = true; - LookupFinished(); - } + return window.ShowChildWindowAsync(childWindow); + } - private void DNSLookup_LookupComplete(object sender, EventArgs e) - { - LookupFinished(); - } - - private void SettingsManager_PropertyChanged(object sender, PropertyChangedEventArgs e) + #endregion + + #region Events + + /// + /// Handles the RecordReceived event of the DNS lookup. + /// + private void DNSLookup_RecordReceived(object sender, DNSLookupRecordReceivedArgs e) + { + Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, + new Action(delegate { Results.Add(e.Args); })); + } + + /// + /// Handles the LookupError event of the DNS lookup. + /// + private void DNSLookup_LookupError(object sender, DNSLookupErrorArgs e) + { + Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(delegate { - switch (e.PropertyName) - { - case nameof(SettingsInfo.DNSLookup_ShowOnlyMostCommonQueryTypes): - LoadTypes(); - break; + // Build the message based on the information in the DNSLookupErrorArgs + var statusMessage = $"{e.Query} @ {e.IPEndPoint} ==> {e.ErrorMessage}"; + + // Show the message + if (!IsStatusMessageDisplayed) + { + StatusMessage = statusMessage; + IsStatusMessageDisplayed = true; + + return; } - } - #endregion + + // Append the message + StatusMessage += Environment.NewLine + statusMessage; + })); } + + /// + /// Handles the LookupComplete event of the DNS lookup. + /// + private void DNSLookup_LookupComplete(object sender, EventArgs e) + { + IsRunning = false; + } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/DNSServerViewModel.cs b/Source/NETworkManager/ViewModels/DNSServerViewModel.cs deleted file mode 100644 index e4f6caf9ae..0000000000 --- a/Source/NETworkManager/ViewModels/DNSServerViewModel.cs +++ /dev/null @@ -1,128 +0,0 @@ -using NETworkManager.Utilities; -using System; -using System.Windows.Input; -using NETworkManager.Models.Network; - -namespace NETworkManager.ViewModels -{ - public class DNSServerViewModel : ViewModelBase - { - private readonly bool _isLoading; - - public ICommand SaveCommand { get; } - - public ICommand CancelCommand { get; } - - private string _name; - public string Name - { - get => _name; - set - { - if (_name == value) - return; - - _name = value; - - if (!_isLoading) - CheckInfoChanged(); - - OnPropertyChanged(); - } - } - - private string _dnsServers; - public string DNSServers - { - get => _dnsServers; - set - { - if (_dnsServers == value) - return; - - _dnsServers = value; - - if (!_isLoading) - CheckInfoChanged(); - - OnPropertyChanged(); - } - } - - private int _port; - public int Port - { - get => _port; - set - { - if (_port == value) - return; - - _port = value; - - if (!_isLoading) - CheckInfoChanged(); - - OnPropertyChanged(); - } - } - - private readonly DNSServerInfo _info; - - private string _previousDNSServerAsString; - - private bool _infoChanged; - public bool InfoChanged - { - get => _infoChanged; - set - { - if (value == _infoChanged) - return; - - _infoChanged = value; - OnPropertyChanged(); - } - } - - private bool _isEdited; - public bool IsEdited - { - get => _isEdited; - set - { - if (value == _isEdited) - return; - - _isEdited = value; - OnPropertyChanged(); - } - } - - public DNSServerViewModel(Action saveCommand, Action cancelHandler, bool isEdited = false, DNSServerInfo info = null) - { - _isLoading = true; - - SaveCommand = new RelayCommand(p => saveCommand(this)); - CancelCommand = new RelayCommand(p => cancelHandler(this)); - - IsEdited = isEdited; - - _info = info ?? new DNSServerInfo(); - - Name = _info.Name; - - // List to string - if (_info.Servers != null) - DNSServers = string.Join("; ", _info.Servers); - - _previousDNSServerAsString = DNSServers; - - Port = _info.Port; - - _isLoading = false; - } - - public void CheckInfoChanged() => InfoChanged = _info.Name != Name || _previousDNSServerAsString != DNSServers || _info.Port != Port; - } -} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/DashboardSettingsViewModel.cs b/Source/NETworkManager/ViewModels/DashboardSettingsViewModel.cs index 7a2d68d9ad..5d843accac 100644 --- a/Source/NETworkManager/ViewModels/DashboardSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/DashboardSettingsViewModel.cs @@ -1,152 +1,221 @@ -using NETworkManager.Settings; +using NETworkManager.Settings; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +/// +/// View model for the dashboard settings. +/// +public class DashboardSettingsViewModel : ViewModelBase { - public class DashboardSettingsViewModel : ViewModelBase - { - #region Variables - private readonly bool _isLoading; + #region Variables + + /// + /// Indicates whether the view model is loading. + /// + private readonly bool _isLoading; - private string _publicIPv4Address; - public string PublicIPv4Address + /// + /// Gets or sets the public IPv4 address. + /// + public string PublicIPv4Address + { + get; + set { - get => _publicIPv4Address; - set - { - if (value == _publicIPv4Address) - return; - - if (!_isLoading) - SettingsManager.Current.Dashboard_PublicIPv4Address = value; - - _publicIPv4Address = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.Dashboard_PublicIPv4Address = value; + + field = value; + OnPropertyChanged(); } + } - private string _publicIPv6Address; - public string PublicIPv6Address + /// + /// Gets or sets the public IPv6 address. + /// + public string PublicIPv6Address + { + get; + set { - get => _publicIPv6Address; - set - { - if (value == _publicIPv6Address) - return; - - if (!_isLoading) - SettingsManager.Current.Dashboard_PublicIPv6Address = value; - - _publicIPv6Address = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.Dashboard_PublicIPv6Address = value; + + field = value; + OnPropertyChanged(); } + } - private bool _checkPublicIPAddress; - public bool CheckPublicIPAddress + /// + /// Gets or sets a value indicating whether checking public IP address is enabled. + /// + public bool CheckPublicIPAddressEnabled + { + get; + set { - get => _checkPublicIPAddress; - set - { - if (value == _checkPublicIPAddress) - return; - - if (!_isLoading) - SettingsManager.Current.Dashboard_CheckPublicIPAddress = value; - - _checkPublicIPAddress = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.Dashboard_CheckPublicIPAddress = value; + + field = value; + OnPropertyChanged(); } + } - private bool _usePublicIPv4AddressCustomAPI; - public bool UsePublicIPv4AddressCustomAPI + /// + /// Gets or sets a value indicating whether to use a custom API for public IPv4 address. + /// + public bool UsePublicIPv4AddressCustomAPI + { + get; + set { - get => _usePublicIPv4AddressCustomAPI; - set - { - if (value == _usePublicIPv4AddressCustomAPI) - return; - - if (!_isLoading) - SettingsManager.Current.Dashboard_UseCustomPublicIPv4AddressAPI = value; - - _usePublicIPv4AddressCustomAPI = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.Dashboard_UseCustomPublicIPv4AddressAPI = value; + + field = value; + OnPropertyChanged(); } + } - private string _customPublicIPv4AddressAPI; - public string CustomPublicIPv4AddressAPI + /// + /// Gets or sets the custom API URL for public IPv4 address. + /// + public string CustomPublicIPv4AddressAPI + { + get; + set { - get => _customPublicIPv4AddressAPI; - set - { - if (value == _customPublicIPv4AddressAPI) - return; - - if (!_isLoading) - SettingsManager.Current.Dashboard_CustomPublicIPv4AddressAPI = value; - - _customPublicIPv4AddressAPI = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.Dashboard_CustomPublicIPv4AddressAPI = value; + + field = value; + OnPropertyChanged(); } + } - private bool _usePublicIPv6AddressCustomAPI; - public bool UsePublicIPv6AddressCustomAPI + /// + /// Gets or sets a value indicating whether to use a custom API for public IPv6 address. + /// + public bool UsePublicIPv6AddressCustomAPI + { + get; + set { - get => _usePublicIPv6AddressCustomAPI; - set - { - if (value == _usePublicIPv6AddressCustomAPI) - return; - - if (!_isLoading) - SettingsManager.Current.Dashboard_UseCustomPublicIPv6AddressAPI = value; - - _usePublicIPv6AddressCustomAPI = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.Dashboard_UseCustomPublicIPv6AddressAPI = value; + + field = value; + OnPropertyChanged(); } + } - private string _customPublicIPv6AddressAPI; - public string CustomPublicIPv6AddressAPI + /// + /// Gets or sets the custom API URL for public IPv6 address. + /// + public string CustomPublicIPv6AddressAPI + { + get; + set { - get => _customPublicIPv6AddressAPI; - set - { - if (value == _customPublicIPv6AddressAPI) - return; - - if (!_isLoading) - SettingsManager.Current.Dashboard_CustomPublicIPv6AddressAPI = value; - - _customPublicIPv6AddressAPI = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.Dashboard_CustomPublicIPv6AddressAPI = value; + + field = value; + OnPropertyChanged(); } - #endregion + } - #region Contructor, load settings - public DashboardSettingsViewModel() + /// + /// Gets or sets a value indicating whether checking IP geolocation is enabled. + /// + public bool CheckIPApiIPGeolocationEnabled + { + get; + set { - _isLoading = true; + if (value == field) + return; - LoadSettings(); + if (!_isLoading) + SettingsManager.Current.Dashboard_CheckIPApiIPGeolocation = value; - _isLoading = false; + field = value; + OnPropertyChanged(); } + } - private void LoadSettings() + /// + /// Gets or sets a value indicating whether checking IP API DNS resolver is enabled. + /// + public bool CheckIPApiDNSResolverEnabled + { + get; + set { - PublicIPv4Address = SettingsManager.Current.Dashboard_PublicIPv4Address; - PublicIPv6Address = SettingsManager.Current.Dashboard_PublicIPv6Address; - CheckPublicIPAddress = SettingsManager.Current.Dashboard_CheckPublicIPAddress; - UsePublicIPv4AddressCustomAPI = SettingsManager.Current.Dashboard_UseCustomPublicIPv4AddressAPI; - CustomPublicIPv4AddressAPI = SettingsManager.Current.Dashboard_CustomPublicIPv4AddressAPI; - UsePublicIPv6AddressCustomAPI = SettingsManager.Current.Dashboard_UseCustomPublicIPv6AddressAPI; - CustomPublicIPv6AddressAPI = SettingsManager.Current.Dashboard_CustomPublicIPv6AddressAPI; + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.Dashboard_CheckIPApiDNSResolver = value; + + field = value; + OnPropertyChanged(); } - #endregion } + + #endregion + + #region Contructor, load settings + + /// + /// Initializes a new instance of the class. + /// + public DashboardSettingsViewModel() + { + _isLoading = true; + + LoadSettings(); + + _isLoading = false; + } + + /// + /// Loads the settings. + /// + private void LoadSettings() + { + PublicIPv4Address = SettingsManager.Current.Dashboard_PublicIPv4Address; + PublicIPv6Address = SettingsManager.Current.Dashboard_PublicIPv6Address; + CheckPublicIPAddressEnabled = SettingsManager.Current.Dashboard_CheckPublicIPAddress; + UsePublicIPv4AddressCustomAPI = SettingsManager.Current.Dashboard_UseCustomPublicIPv4AddressAPI; + CustomPublicIPv4AddressAPI = SettingsManager.Current.Dashboard_CustomPublicIPv4AddressAPI; + UsePublicIPv6AddressCustomAPI = SettingsManager.Current.Dashboard_UseCustomPublicIPv6AddressAPI; + CustomPublicIPv6AddressAPI = SettingsManager.Current.Dashboard_CustomPublicIPv6AddressAPI; + CheckIPApiIPGeolocationEnabled = SettingsManager.Current.Dashboard_CheckIPApiIPGeolocation; + CheckIPApiDNSResolverEnabled = SettingsManager.Current.Dashboard_CheckIPApiDNSResolver; + } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/DashboardViewModel.cs b/Source/NETworkManager/ViewModels/DashboardViewModel.cs index 8b14513a3c..ff21c0f634 100644 --- a/Source/NETworkManager/ViewModels/DashboardViewModel.cs +++ b/Source/NETworkManager/ViewModels/DashboardViewModel.cs @@ -1,44 +1,39 @@ -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +/// +/// ViewModel for the Dashboard view. +/// +public class DashboardViewModel : ViewModelBase { - public class DashboardViewModel : ViewModelBase + /// + /// Initializes a new instance of the class. + /// + public DashboardViewModel() { - #region Variables - - #endregion - - #region Constructor, load settings - - public DashboardViewModel() - { - LoadSettings(); - } - - private void LoadSettings() - { - - } - #endregion - - #region ICommands & Actions - - #endregion + LoadSettings(); + } - #region Methods + /// + /// Loads the dashboard settings. + /// + private void LoadSettings() + { - public void OnViewVisible() - { + } - } + /// + /// Called when the view becomes visible. + /// + public void OnViewVisible() + { - public void OnViewHide() - { + } - } - #endregion + /// + /// Called when the view is hidden. + /// + public void OnViewHide() + { - #region Events - - #endregion } -} - +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/DiscoveryProtocolViewModel.cs b/Source/NETworkManager/ViewModels/DiscoveryProtocolViewModel.cs index e982d8d828..c909d4386d 100644 --- a/Source/NETworkManager/ViewModels/DiscoveryProtocolViewModel.cs +++ b/Source/NETworkManager/ViewModels/DiscoveryProtocolViewModel.cs @@ -1,470 +1,472 @@ -using System.Collections.Generic; -using System.Windows.Input; -using System.Net.NetworkInformation; +using log4net; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Localization.Resources; +using NETworkManager.Models.Export; +using NETworkManager.Models.Network; +using NETworkManager.Settings; +using NETworkManager.Utilities; +using NETworkManager.Views; using System; +using System.Collections.Generic; using System.Linq; -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.Settings; -using NETworkManager.Models.Network; using System.Threading.Tasks; -using System.ComponentModel; -using System.Diagnostics; -using NETworkManager.Utilities; +using System.Timers; using System.Windows; -using MahApps.Metro.Controls; -using static NETworkManager.Models.Network.DiscoveryProtocol; +using System.Windows.Input; using System.Windows.Threading; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +/// +/// View model for the discovery protocol view. +/// +public class DiscoveryProtocolViewModel : ViewModelBase { - public class DiscoveryProtocolViewModel : ViewModelBase + #region Variables + private static readonly ILog Log = LogManager.GetLogger(typeof(DiscoveryProtocolViewModel)); + + /// + /// The discovery protocol capture instance. + /// + private readonly DiscoveryProtocolCapture _discoveryProtocolCapture = new(); + + /// + /// Indicates whether the view model is loading. + /// + private readonly bool _isLoading; + + /// + /// The timer for the remaining time. + /// + private readonly Timer _remainingTimer; + + /// + /// The seconds remaining for the capture. + /// + private int _secondsRemaining; + + /// + /// Gets or sets a value indicating whether this is the first run. + /// + public bool FirstRun { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - - private DiscoveryProtocol _discoveryProtocol = new DiscoveryProtocol(); - private readonly bool _isLoading; - System.Timers.Timer _remainingTimer; - private int _secondsRemaining; - - private bool _firstRun = true; - public bool FirstRun + get; + set { - get => _firstRun; - set - { - if (value == _firstRun) - return; - - _firstRun = value; - OnPropertyChanged(); - } - } + if (value == field) + return; - /* - private bool _isNetworkInteraceLoading; - public bool IsNetworkInterfaceLoading - { - get => _isNetworkInteraceLoading; - set - { - if (value == _isNetworkInteraceLoading) - return; - - _isNetworkInteraceLoading = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = true; - private List _networkInterfaces; - public List NetworkInterfaces + /// + /// Gets the list of available discovery protocols. + /// + public List Protocols + { + get; + private set { - get => _networkInterfaces; - set - { - if (value == _networkInterfaces) - return; + if (value == field) + return; - _networkInterfaces = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = new(); - private NetworkInterfaceInfo _selectedNetworkInterface; - public NetworkInterfaceInfo SelectedNetworkInterface + /// + /// Gets or sets the selected discovery protocol. + /// + public DiscoveryProtocol SelectedProtocol + { + get; + set { - get => _selectedNetworkInterface; - set - { - if (value == _selectedNetworkInterface) - return; + if (value == field) + return; - if (value != null) - { - if (!_isLoading) - SettingsManager.Current.DiscoveryProtocol_InterfaceId = value.Id; + if (!_isLoading) + SettingsManager.Current.DiscoveryProtocol_Protocol = value; - CanCapture = value.IsOperational; - } - - _selectedNetworkInterface = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - */ + } - private List _protocols = new List(); - public List Protocols + /// + /// Gets the list of available durations. + /// + public List Durations + { + get; + private set { - get => _protocols; - set - { - if (value == _protocols) - return; + if (value == field) + return; - _protocols = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private Protocol _selectedProtocol; - public Protocol SelectedProtocol + /// + /// Gets or sets the selected duration. + /// + public int SelectedDuration + { + get; + set { - get => _selectedProtocol; - set - { - if (value == _selectedProtocol) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.DiscoveryProtocol_Protocol = value; + if (!_isLoading) + SettingsManager.Current.DiscoveryProtocol_Duration = value; - _selectedProtocol = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private List _durations; - public List Durations + /// + /// Gets or sets a value indicating whether the capture is running. + /// + public bool IsCapturing + { + get; + set { - get => _durations; - set - { - if (value == _durations) - return; + if (value == field) + return; - _durations = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private int _selectedDuration; - public int SelectedDuration + /// + /// Gets the message for the remaining time. + /// + public string TimeRemainingMessage + { + get; + private set { - get => _selectedDuration; - set - { - if (value == _selectedDuration) - return; - - if (!_isLoading) - SettingsManager.Current.DiscoveryProtocol_Duration = value; + if (value == field) + return; - _selectedDuration = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - /* - private bool _canCapture; - public bool CanCapture + /// + /// Gets or sets a value indicating whether the status message is displayed. + /// + public bool IsStatusMessageDisplayed + { + get; + set { - get => _canCapture; - set - { - if (value == _canCapture) - return; + if (value == field) + return; - _canCapture = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - */ + } - private bool _isCapturing; - public bool IsCapturing + /// + /// Gets the status message. + /// + public string StatusMessage + { + get; + private set { - get => _isCapturing; - set - { - if (value == _isCapturing) - return; + if (value == field) + return; - _isCapturing = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _timeRemainingMessage; - public string TimeRemainingMessage - { - get => _timeRemainingMessage; - set - { - if (value == _timeRemainingMessage) - return; - - _timeRemainingMessage = value; - OnPropertyChanged(); - } - } - - private bool _isStatusMessageDisplayed; - public bool IsStatusMessageDisplayed + /// + /// Gets or sets a value indicating whether a discovery package has been received. + /// + public bool DiscoveryPackageReceived + { + get; + set { - get => _isStatusMessageDisplayed; - set - { - if (value == _isStatusMessageDisplayed) - return; + if (value == field) + return; - _isStatusMessageDisplayed = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _statusMessage; - public string StatusMessage + /// + /// Gets the received discovery package. + /// + public DiscoveryProtocolPackageInfo DiscoveryPackage + { + get; + private set { - get => _statusMessage; - set - { - if (value == _statusMessage) - return; + if (value == field) + return; - _statusMessage = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _discoveryPackageReceived; - public bool DiscoveryPackageReceived - { - get => _discoveryPackageReceived; - set - { - if (value == _discoveryPackageReceived) - return; + #endregion - _discoveryPackageReceived = value; - OnPropertyChanged(); - } - } + #region Constructor, LoadSettings - private DiscoveryProtocolPackageInfo _discoveryPackage; - public DiscoveryProtocolPackageInfo DiscoveryPackage - { - get => _discoveryPackage; - set - { - if (value == _discoveryPackage) - return; + /// + /// Initializes a new instance of the class. + /// + /// The dialog coordinator instance. + public DiscoveryProtocolViewModel() + { + _isLoading = true; - _discoveryPackage = value; - OnPropertyChanged(); - } - } - #endregion + _discoveryProtocolCapture.PackageReceived += DiscoveryProtocol_PackageReceived; + _discoveryProtocolCapture.ErrorReceived += DiscoveryProtocol_ErrorReceived; + _discoveryProtocolCapture.WarningReceived += DiscoveryProtocol_WarningReceived; + _discoveryProtocolCapture.Complete += DiscoveryProtocol_Complete; - #region Constructor, LoadSettings - public DiscoveryProtocolViewModel(IDialogCoordinator instance) + _remainingTimer = new Timer { - _isLoading = true; + Interval = 1000 + }; - _dialogCoordinator = instance; + _remainingTimer.Elapsed += Timer_Elapsed; - //LoadNetworkInterfaces(); + LoadSettings(); - // Detect if network address or status changed... - //NetworkChange.NetworkAvailabilityChanged += (sender, args) => ReloadNetworkInterfacesAction(); - //NetworkChange.NetworkAddressChanged += (sender, args) => ReloadNetworkInterfacesAction(); - - _discoveryProtocol.PackageReceived += _discoveryProtocol_PackageReceived; - _discoveryProtocol.ErrorReceived += _discoveryProtocol_ErrorReceived; - _discoveryProtocol.WarningReceived += _discoveryProtocol_WarningReceived; - _discoveryProtocol.Complete += _discoveryProtocol_Complete; - - _remainingTimer = new System.Timers.Timer - { - Interval = 1000 - }; + _isLoading = false; + } - _remainingTimer.Elapsed += Timer_Elapsed; + /// + /// Loads the settings. + /// + private void LoadSettings() + { + Protocols = Enum.GetValues(typeof(DiscoveryProtocol)).Cast().OrderBy(x => x.ToString()) + .ToList(); + SelectedProtocol = Protocols.FirstOrDefault(x => x == SettingsManager.Current.DiscoveryProtocol_Protocol); + Durations = new List { 15, 30, 60, 90, 120 }; + SelectedDuration = Durations.FirstOrDefault(x => x == SettingsManager.Current.DiscoveryProtocol_Duration); + } - LoadSettings(); + #endregion - SettingsManager.Current.PropertyChanged += SettingsManager_PropertyChanged; + #region ICommands & Actions - _isLoading = false; - } + /// + /// Gets the command to restart the application as administrator. + /// + public ICommand RestartAsAdminCommand => new RelayCommand(parameter => { _ = RestartAsAdminAction(); }); - /* - private async Task LoadNetworkInterfaces() + /// + /// Action to restart the application as administrator. + /// + private async Task RestartAsAdminAction() + { + try { - IsNetworkInterfaceLoading = true; - - NetworkInterfaces = await Models.Network.NetworkInterface.GetNetworkInterfacesAsync(); - - // Get the last selected interface, if it is still available on this machine... - if (NetworkInterfaces.Count > 0) - { - var info = NetworkInterfaces.FirstOrDefault(s => s.Id == SettingsManager.Current.DiscoveryProtocol_InterfaceId); - - SelectedNetworkInterface = info ?? NetworkInterfaces[0]; - } - - IsNetworkInterfaceLoading = false; + (Application.Current.MainWindow as MainWindow)?.RestartApplication(true); } - */ - - private void LoadSettings() + catch (Exception ex) { - Protocols = Enum.GetValues(typeof(Protocol)).Cast().OrderBy(x => x.ToString()).ToList(); - SelectedProtocol = Protocols.FirstOrDefault(x => x == SettingsManager.Current.DiscoveryProtocol_Protocol); - Durations = new List() { 15, 30, 60, 90, 120 }; - SelectedDuration = Durations.FirstOrDefault(x => x == SettingsManager.Current.DiscoveryProtocol_Duration); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, ex.Message, ChildWindowIcon.Error); } - #endregion + } - #region ICommands & Actions - /* - public ICommand ReloadNetworkInterfacesCommand => new RelayCommand(p => ReloadNetworkInterfacesAction(), ReloadNetworkInterfaces_CanExecute); + /// + /// Gets the command to start the capture. + /// + public ICommand CaptureCommand => new RelayCommand(parameter => { _ = CaptureAction(); }, Capture_CanExecute); - private bool ReloadNetworkInterfaces_CanExecute(object obj) => !IsNetworkInterfaceLoading && Application.Current.MainWindow != null && !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen; + private bool Capture_CanExecute(object _) => ConfigurationManager.Current.IsAdmin && !IsCapturing; - private async Task ReloadNetworkInterfacesAction() - { - IsNetworkInterfaceLoading = true; + /// + /// Action to start the capture. + /// + private async Task CaptureAction() + { + if (FirstRun) + FirstRun = false; - await Task.Delay(2000); // Make the user happy, let him see a reload animation (and he cannot spam the reload command) + IsStatusMessageDisplayed = false; + StatusMessage = string.Empty; - var id = string.Empty; + DiscoveryPackageReceived = false; - if (SelectedNetworkInterface != null) - id = SelectedNetworkInterface.Id; + IsCapturing = true; - NetworkInterfaces = await Models.Network.NetworkInterface.GetNetworkInterfacesAsync(); + var duration = SelectedDuration + 2; // Capture 2 seconds more than the user chose - // Change interface... - SelectedNetworkInterface = string.IsNullOrEmpty(id) ? NetworkInterfaces.FirstOrDefault() : NetworkInterfaces.FirstOrDefault(x => x.Id == id); + _secondsRemaining = duration + 1; // Init powershell etc. takes some time... - IsNetworkInterfaceLoading = false; - } - */ + TimeRemainingMessage = string.Format(Strings.XXSecondsRemainingDots, _secondsRemaining); - /* - public ICommand OpenNetworkConnectionsCommand => new RelayCommand(p => OpenNetworkConnectionsAction()); + _remainingTimer.Start(); - public async Task OpenNetworkConnectionsAction() + try { - try - { - Process.Start("NCPA.cpl"); - } - catch (Exception ex) - { - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Error, ex.Message, MessageDialogStyle.Affirmative, AppearanceManager.MetroDialog); - } + _discoveryProtocolCapture.CaptureAsync(duration, SelectedProtocol); } - */ + catch (Exception ex) + { + Log.Error("Error while trying to capture", ex); + + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, ex.Message, ChildWindowIcon.Error); + } + } - public ICommand RestartAsAdminCommand => new RelayCommand(p => RestartAsAdminAction()); + /// + /// Gets the command to export the result. + /// + public ICommand ExportCommand => new RelayCommand(parameter => { _ = ExportAction(); }); - public async Task RestartAsAdminAction() + /// + /// Action to export the result. + /// + private Task ExportAction() + { + var childWindow = new ExportChildWindow(); + + var childWindowViewModel = new ExportViewModel(async instance => { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + try { - (Application.Current.MainWindow as MainWindow).RestartApplication(true); + ExportManager.Export(instance.FilePath, instance.FileType, + [DiscoveryPackage]); } catch (Exception ex) { - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Error, ex.Message, MessageDialogStyle.Affirmative, AppearanceManager.MetroDialog); - } - } + Log.Error("Error while exporting data as " + instance.FileType, ex); - public ICommand CaptureCommand => new RelayCommand(p => CaptureAction()); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); + } - public async Task CaptureAction() + SettingsManager.Current.DiscoveryProtocol_ExportFileType = instance.FileType; + SettingsManager.Current.DiscoveryProtocol_ExportFilePath = instance.FilePath; + }, _ => { - if (FirstRun) - FirstRun = false; - - IsStatusMessageDisplayed = false; - StatusMessage = string.Empty; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, + [ + ExportFileType.Csv, ExportFileType.Xml, ExportFileType.Json + ], false, SettingsManager.Current.DiscoveryProtocol_ExportFileType, + SettingsManager.Current.DiscoveryProtocol_ExportFilePath); - DiscoveryPackageReceived = false; + childWindow.Title = Strings.Export; - IsCapturing = true; + childWindow.DataContext = childWindowViewModel; - int duration = SelectedDuration + 2; // Capture 2 seconds more than the user chose + ConfigurationManager.Current.IsChildWindowOpen = true; - _secondsRemaining = duration + 1; // Init powershell etc. takes some time... + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } - TimeRemainingMessage = string.Format(Localization.Resources.Strings.XXSecondsRemainingDots, _secondsRemaining); + #endregion - _remainingTimer.Start(); + #region Methods - try - { - _discoveryProtocol.CaptureAsync(duration, SelectedProtocol); - } - catch (Exception ex) - { - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Error, ex.Message, MessageDialogStyle.Affirmative, AppearanceManager.MetroDialog); - } - } - - private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) + /// + /// Handles the elapsed event of the remaining time timer. + /// + private void Timer_Elapsed(object sender, ElapsedEventArgs e) + { + Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(delegate { - Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(delegate - { - TimeRemainingMessage = string.Format(Localization.Resources.Strings.XXSecondsRemainingDots, _secondsRemaining); - - if (_secondsRemaining > 0) - _secondsRemaining--; - })); - } - #endregion + TimeRemainingMessage = + string.Format(Strings.XXSecondsRemainingDots, _secondsRemaining); - #region Methods - public void OnViewVisible() - { + if (_secondsRemaining > 0) + _secondsRemaining--; + })); + } - } + /// + /// Called when the view becomes visible. + /// + public void OnViewVisible() + { + } - public void OnViewHide() - { + /// + /// Called when the view is hidden. + /// + public void OnViewHide() + { + } - } - #endregion + #endregion - #region Events - private void _discoveryProtocol_PackageReceived(object sender, DiscoveryProtocolPackageArgs e) - { - DiscoveryPackage = DiscoveryProtocolPackageInfo.Parse(e); + #region Events - DiscoveryPackageReceived = true; - } + /// + /// Handles the PackageReceived event of the discovery protocol capture. + /// + private void DiscoveryProtocol_PackageReceived(object sender, DiscoveryProtocolPackageArgs e) + { + DiscoveryPackage = e.PackageInfo; - private void _discoveryProtocol_WarningReceived(object sender, DiscoveryProtocolWarningArgs e) - { - if (!string.IsNullOrEmpty(StatusMessage)) - StatusMessage += Environment.NewLine; + DiscoveryPackageReceived = true; + } - StatusMessage += e.Message; + /// + /// Handles the WarningReceived event of the discovery protocol capture. + /// + private void DiscoveryProtocol_WarningReceived(object sender, DiscoveryProtocolWarningArgs e) + { + if (!string.IsNullOrEmpty(StatusMessage)) + StatusMessage += Environment.NewLine; - IsStatusMessageDisplayed = true; - } + StatusMessage += e.Message; - private void _discoveryProtocol_ErrorReceived(object sender, DiscoveryProtocolErrorArgs e) - { - if (!string.IsNullOrEmpty(StatusMessage)) - StatusMessage += Environment.NewLine; + IsStatusMessageDisplayed = true; + } - StatusMessage += e.Message; + /// + /// Handles the ErrorReceived event of the discovery protocol capture. + /// + private void DiscoveryProtocol_ErrorReceived(object sender, DiscoveryProtocolErrorArgs e) + { + if (!string.IsNullOrEmpty(StatusMessage)) + StatusMessage += Environment.NewLine; - IsStatusMessageDisplayed = true; - } + StatusMessage += e.Message; - private void _discoveryProtocol_Complete(object sender, EventArgs e) - { - _remainingTimer.Stop(); - IsCapturing = false; - } + IsStatusMessageDisplayed = true; + } - private void SettingsManager_PropertyChanged(object sender, PropertyChangedEventArgs e) - { - } - #endregion + /// + /// Handles the Complete event of the discovery protocol capture. + /// + private void DiscoveryProtocol_Complete(object sender, EventArgs e) + { + _remainingTimer.Stop(); + IsCapturing = false; } -} + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/DropdownViewModel.cs b/Source/NETworkManager/ViewModels/DropdownViewModel.cs index db015d3d62..706300abe1 100644 --- a/Source/NETworkManager/ViewModels/DropdownViewModel.cs +++ b/Source/NETworkManager/ViewModels/DropdownViewModel.cs @@ -1,68 +1,90 @@ -using NETworkManager.Utilities; using System; using System.Collections.Generic; using System.Linq; using System.Windows.Input; +using NETworkManager.Utilities; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +/// +/// View model for a dropdown dialog. +/// +public class DropDownViewModel : ViewModelBase { - public class DropdownViewModel : ViewModelBase + /// + /// Initializes a new instance of the class. + /// + /// The action to execute when OK is clicked. + /// The action to execute when Cancel is clicked. + /// The list of values to display in the dropdown. + /// The description of the value. + public DropDownViewModel(Action okCommand, Action cancelHandler, + List values, string valueDescription) { - public ICommand OKCommand { get; } + ValueDescription = valueDescription; + Values = values; - public ICommand CancelCommand { get; } + SelectedValue = Values.FirstOrDefault(); - private string _valueDescription; - public string ValueDescription - { - get => _valueDescription; - set - { - if(value == _valueDescription) - return; + OKCommand = new RelayCommand(_ => okCommand(this)); + CancelCommand = new RelayCommand(_ => cancelHandler(this)); + } - _valueDescription = value; - OnPropertyChanged(); - } - } + /// + /// Gets the command to confirm the selection. + /// + public ICommand OKCommand { get; } + + /// + /// Gets the command to cancel the operation. + /// + public ICommand CancelCommand { get; } - private List _values; - public List Values + /// + /// Gets the description of the value. + /// + public string ValueDescription + { + get; + private init { - get => _values; - set - { - if (value == _values) - return; + if (value == field) + return; - _values = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _selectedValue; - public string SelectedValue + /// + /// Gets the list of values. + /// + public List Values + { + get; + private init { - get => _selectedValue; - set - { - if (value == _selectedValue) - return; + if (value == field) + return; - _selectedValue = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - public DropdownViewModel(Action okCommand, Action cancelHandler, List values, string valueDescription) + /// + /// Gets or sets the selected value. + /// + public string SelectedValue + { + get; + set { - ValueDescription = valueDescription; - Values = values; - - SelectedValue = Values.FirstOrDefault(); + if (value == field) + return; - OKCommand = new RelayCommand(p => okCommand(this)); - CancelCommand = new RelayCommand(p => cancelHandler(this)); - } + field = value; + OnPropertyChanged(); + } } } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/ExportViewModel.cs b/Source/NETworkManager/ViewModels/ExportViewModel.cs index c8dcc597ab..c2920af3f3 100644 --- a/Source/NETworkManager/ViewModels/ExportViewModel.cs +++ b/Source/NETworkManager/ViewModels/ExportViewModel.cs @@ -1,304 +1,343 @@ -using NETworkManager.Utilities; using System; using System.IO; +using System.Linq; using System.Windows.Forms; using System.Windows.Input; -using NETworkManager.Models.Export; using NETworkManager.Localization.Resources; -using System.Linq; +using NETworkManager.Models.Export; +using NETworkManager.Utilities; + +namespace NETworkManager.ViewModels; -namespace NETworkManager.ViewModels +/// +/// View model for exporting data. +/// +public class ExportViewModel : ViewModelBase { /// - /// + /// Initializes a new instance of the class. /// - public class ExportViewModel : ViewModelBase + /// The action to execute when export is confirmed. + /// The action to execute when cancel is clicked. + /// The array of file types to show. + /// Indicates whether to show the "Export selected" option. + private ExportViewModel(Action deleteCommand, Action cancelHandler, + ExportFileType[] showFilesTypes, bool showExportSelected) { - /// - /// - /// - public ICommand ExportCommand { get; } - - /// - /// - /// - public ICommand CancelCommand { get; } - - /// - /// - /// - private bool _exportAll = true; - - /// - /// - /// - public bool ExportAll - { - get => _exportAll; - set - { - if (value == _exportAll) - return; + ExportCommand = new RelayCommand(_ => deleteCommand(this)); + CancelCommand = new RelayCommand(_ => cancelHandler(this)); - _exportAll = value; - OnPropertyChanged(); - } - } + ShowCsv = showFilesTypes.Contains(ExportFileType.Csv); + ShowXml = showFilesTypes.Contains(ExportFileType.Xml); + ShowJson = showFilesTypes.Contains(ExportFileType.Json); + ShowTxt = showFilesTypes.Contains(ExportFileType.Txt); - /// - /// - /// - private bool _showExportSelected; + ShowExportSelected = showExportSelected; + } - /// - /// - /// - public bool ShowExportSelected - { - get => _showExportSelected; - set - { - if (value == _showExportSelected) - return; + /// + /// Initializes a new instance of the class. + /// + /// The action to execute when export is confirmed. + /// The action to execute when cancel is clicked. + /// The array of file types to show. + /// Indicates whether to show the "Export selected" option. + /// The initial file type. + /// The initial file path. + public ExportViewModel(Action deleteCommand, Action cancelHandler, + ExportFileType[] showFilesTypes, bool showExportSelected, ExportFileType fileType, string filePath) : + this(deleteCommand, cancelHandler, showFilesTypes, showExportSelected) + { + FilePath = filePath; - _showExportSelected = value; - OnPropertyChanged(); - } + switch (fileType) + { + case ExportFileType.Csv: + UseCsv = true; + break; + case ExportFileType.Xml: + UseXml = true; + break; + case ExportFileType.Json: + UseJson = true; + break; + case ExportFileType.Txt: + UseTxt = true; + break; + default: + throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); } + } - private bool _exportSelected; - public bool ExportSelected + /// + /// Gets the command to export data. + /// + public ICommand ExportCommand { get; } + + /// + /// Gets the command to cancel the operation. + /// + public ICommand CancelCommand { get; } + + /// + /// Gets or sets a value indicating whether to export all data. + /// + public bool ExportAll + { + get; + set { - get => _exportSelected; - set - { - if (value == _exportSelected) - return; + if (value == field) + return; - _exportSelected = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = true; - public ExportManager.ExportFileType FileType { get; set; } - - private bool _showCSV; - public bool ShowCSV + /// + /// Gets or sets a value indicating whether to show the "Export selected" option. + /// + public bool ShowExportSelected + { + get; + set { - get => _showCSV; - set - { - if (value == _showCSV) - return; + if (value == field) + return; - _showCSV = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _useCSV; - public bool UseCSV + /// + /// Gets or sets a value indicating whether to export only selected data. + /// + public bool ExportSelected + { + get; + set { - get => _useCSV; - set - { - if (value == _useCSV) - return; - - if (value) - { - FileType = ExportManager.ExportFileType.CSV; - ChangeFilePathExtension(FileType); - } + if (value == field) + return; - _useCSV = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + + /// + /// Gets the selected file type for export. + /// + public ExportFileType FileType { get; private set; } - private bool _showXML; - public bool ShowXML + /// + /// Gets or sets a value indicating whether to show the CSV option. + /// + public bool ShowCsv + { + get; + set { - get => _showXML; - set - { - if (value == _showXML) - return; + if (value == field) + return; - _showXML = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _useXML; - public bool UseXML + /// + /// Gets or sets a value indicating whether CSV format is selected. + /// + public bool UseCsv + { + get; + set { - get => _useXML; - set - { - if (value == _useXML) - return; - - if (value) - { - FileType = ExportManager.ExportFileType.XML; - ChangeFilePathExtension(FileType); - } + if (value == field) + return; - _useXML = value; - OnPropertyChanged(); + if (value) + { + FileType = ExportFileType.Csv; + ChangeFilePathExtension(FileType); } - } + field = value; + OnPropertyChanged(); + } + } - private bool _showJSON; - public bool ShowJSON + /// + /// Gets or sets a value indicating whether to show the XML option. + /// + public bool ShowXml + { + get; + set { - get => _showJSON; - set - { - if (value == _showJSON) - return; + if (value == field) + return; - _showJSON = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _useJSON; - public bool UseJSON + /// + /// Gets or sets a value indicating whether XML format is selected. + /// + public bool UseXml + { + get; + set { - get => _useJSON; - set - { - if (value == _useJSON) - return; - - if (value) - { - FileType = ExportManager.ExportFileType.JSON; - ChangeFilePathExtension(FileType); - } + if (value == field) + return; - _useJSON = value; - OnPropertyChanged(); + if (value) + { + FileType = ExportFileType.Xml; + ChangeFilePathExtension(FileType); } + + field = value; + OnPropertyChanged(); } + } - private bool _showTXT; - public bool ShowTXT + /// + /// Gets or sets a value indicating whether to show the JSON option. + /// + public bool ShowJson + { + get; + set { - get => _showTXT; - set - { - if (value == _showTXT) - return; + if (value == field) + return; - _showTXT = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _useTXT; - public bool UseTXT + /// + /// Gets or sets a value indicating whether JSON format is selected. + /// + public bool UseJson + { + get; + set { - get => _useTXT; - set - { - if (value == _useTXT) - return; - - if (value) - { - FileType = ExportManager.ExportFileType.TXT; - ChangeFilePathExtension(FileType); - } + if (value == field) + return; - _useTXT = value; - OnPropertyChanged(); + if (value) + { + FileType = ExportFileType.Json; + ChangeFilePathExtension(FileType); } + + field = value; + OnPropertyChanged(); } + } - private string _filePath; - public string FilePath + /// + /// Gets or sets a value indicating whether to show the TXT option. + /// + public bool ShowTxt + { + get; + set { - get => _filePath; - set - { - if (value == _filePath) - return; + if (value == field) + return; - _filePath = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - public ExportViewModel(Action deleteCommand, Action cancelHandler, ExportManager.ExportFileType[] showFilesTypes, bool showExportSelected) + /// + /// Gets or sets a value indicating whether TXT format is selected. + /// + public bool UseTxt + { + get; + set { - ExportCommand = new RelayCommand(p => deleteCommand(this)); - CancelCommand = new RelayCommand(p => cancelHandler(this)); + if (value == field) + return; - ShowCSV = showFilesTypes.Contains(ExportManager.ExportFileType.CSV); - ShowXML = showFilesTypes.Contains(ExportManager.ExportFileType.XML); - ShowJSON = showFilesTypes.Contains(ExportManager.ExportFileType.JSON); - ShowTXT = showFilesTypes.Contains(ExportManager.ExportFileType.TXT); + if (value) + { + FileType = ExportFileType.Txt; + ChangeFilePathExtension(FileType); + } - ShowExportSelected = showExportSelected; + field = value; + OnPropertyChanged(); } + } - public ExportViewModel(Action deleteCommand, Action cancelHandler, ExportManager.ExportFileType[] showFilesTypes, bool showExportSelected, ExportManager.ExportFileType fileType, string filePath) : - this(deleteCommand, cancelHandler, showFilesTypes, showExportSelected) + /// + /// Gets or sets the file path for export. + /// + public string FilePath + { + get; + set { - FilePath = filePath; + if (value == field) + return; - switch (fileType) - { - case ExportManager.ExportFileType.CSV: - UseCSV = true; - break; - case ExportManager.ExportFileType.XML: - UseXML = true; - break; - case ExportManager.ExportFileType.JSON: - UseJSON = true; - break; - case ExportManager.ExportFileType.TXT: - UseTXT = true; - break; - default: - throw new ArgumentOutOfRangeException(nameof(fileType), fileType, null); - } + field = value; + OnPropertyChanged(); } + } + + /// + /// Gets the command to browse for a file. + /// + public ICommand BrowseFileCommand => new RelayCommand(_ => BrowseFileAction()); - public ICommand BrowseFileCommand => new RelayCommand(p => BrowseFileAction()); + /// + /// Action to browse for a file. + /// + private void BrowseFileAction() + { + var saveFileDialog = new SaveFileDialog(); - private void BrowseFileAction() - { - var saveFileDialog = new SaveFileDialog(); + var fileExtension = ExportManager.GetFileExtensionAsString(FileType); - var fileExtension = ExportManager.GetFileExtensionAsString(FileType); + saveFileDialog.Filter = $@"{fileExtension}-{Strings.File} | *.{fileExtension.ToLower()}"; - saveFileDialog.Filter = $@"{fileExtension}-{Strings.File} | *.{fileExtension.ToLower()}"; + if (saveFileDialog.ShowDialog() == DialogResult.OK) FilePath = saveFileDialog.FileName; + } - if (saveFileDialog.ShowDialog() == DialogResult.OK) - { - FilePath = saveFileDialog.FileName; - } - } + /// + /// Changes the file path extension based on the selected file type. + /// + /// The new file type. + private void ChangeFilePathExtension(ExportFileType fileType) + { + if (string.IsNullOrEmpty(FilePath)) + return; - private void ChangeFilePathExtension(ExportManager.ExportFileType fileType) - { - if (string.IsNullOrEmpty(FilePath)) - return; + var extension = Path.GetExtension(FilePath).Replace(".", ""); - var extension = Path.GetExtension(FilePath).Replace(".", ""); + var newExtension = ExportManager.GetFileExtensionAsString(fileType); - if (extension.Equals(ExportManager.GetFileExtensionAsString(fileType), StringComparison.CurrentCultureIgnoreCase)) - return; + if (newExtension == null) + return; - FilePath = FilePath.Substring(0, FilePath.Length - extension.Length); + if (extension.Equals(newExtension, StringComparison.OrdinalIgnoreCase)) + return; - FilePath += ExportManager.GetFileExtensionAsString(fileType).ToLower(); - } + FilePath = FilePath[..^extension.Length] + newExtension.ToLower(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/FirewallRuleViewModel.cs b/Source/NETworkManager/ViewModels/FirewallRuleViewModel.cs new file mode 100644 index 0000000000..32fe089a06 --- /dev/null +++ b/Source/NETworkManager/ViewModels/FirewallRuleViewModel.cs @@ -0,0 +1,373 @@ +using NETworkManager.Models.Firewall; +using NETworkManager.Utilities; +using System; +using System.Collections.Generic; +using System.Windows.Input; + +namespace NETworkManager.ViewModels; + +/// +/// ViewModel for adding or editing a firewall rule in the FirewallRule dialog. +/// +public class FirewallRuleViewModel : ViewModelBase +{ + /// + /// Creates a new instance of for adding or + /// editing a firewall rule. + /// + /// OK command to save the rule. + /// Cancel command to discard changes. + /// Existing rule to edit; to add a new rule. + public FirewallRuleViewModel(Action okCommand, + Action cancelHandler, FirewallRule entry = null) + { + OKCommand = new RelayCommand(_ => okCommand(this)); + CancelCommand = new RelayCommand(_ => cancelHandler(this)); + + Entry = entry; + + if (entry == null) + { + IsEnabled = true; + Direction = FirewallRuleDirection.Inbound; + Action = FirewallRuleAction.Allow; + Protocol = FirewallProtocol.Any; + InterfaceType = FirewallInterfaceType.Any; + NetworkProfileDomain = true; + NetworkProfilePrivate = true; + NetworkProfilePublic = true; + } + else + { + Name = entry.Name; + IsEnabled = entry.IsEnabled; + Description = entry.Description ?? string.Empty; + Direction = entry.Direction; + Action = entry.Action; + Protocol = entry.Protocol; + LocalPorts = FirewallRule.PortsToString(entry.LocalPorts); + RemotePorts = FirewallRule.PortsToString(entry.RemotePorts); + LocalAddresses = entry.LocalAddresses.Count > 0 ? string.Join("; ", entry.LocalAddresses) : string.Empty; + RemoteAddresses = entry.RemoteAddresses.Count > 0 ? string.Join("; ", entry.RemoteAddresses) : string.Empty; + Program = entry.Program?.Name ?? string.Empty; + InterfaceType = entry.InterfaceType; + NetworkProfileDomain = entry.NetworkProfiles.Length > 0 && entry.NetworkProfiles[0]; + NetworkProfilePrivate = entry.NetworkProfiles.Length > 1 && entry.NetworkProfiles[1]; + NetworkProfilePublic = entry.NetworkProfiles.Length > 2 && entry.NetworkProfiles[2]; + } + } + + /// + /// OK command to save the rule. + /// + public ICommand OKCommand { get; } + + /// + /// Cancel command to discard changes. + /// + public ICommand CancelCommand { get; } + + /// + /// The original firewall rule being edited, or when adding a new rule. + /// + public FirewallRule Entry { get; } + + /// + /// Protocols available in the protocol drop-down. + /// + public IEnumerable Protocols { get; } = + [ + FirewallProtocol.Any, + FirewallProtocol.TCP, + FirewallProtocol.UDP, + FirewallProtocol.ICMPv4, + FirewallProtocol.ICMPv6, + FirewallProtocol.GRE, + FirewallProtocol.L2TP + ]; + + /// + /// Directions available in the direction drop-down. + /// + public IEnumerable Directions { get; } = Enum.GetValues(); + + /// + /// Actions available in the action drop-down. + /// + public IEnumerable Actions { get; } = Enum.GetValues(); + + /// + /// Interface types available in the interface type drop-down. + /// + public IEnumerable InterfaceTypes { get; } = Enum.GetValues(); + + /// + /// Human-readable display name of the rule (without the NETworkManager_ prefix). + /// + public string Name + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Indicates whether the rule is enabled. + /// + public bool IsEnabled + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Optional description of the rule. + /// + public string Description + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = string.Empty; + + /// + /// Traffic direction (Inbound or Outbound). + /// + public FirewallRuleDirection Direction + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Rule action (Allow or Block). + /// + public FirewallRuleAction Action + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Network protocol. When changed away from TCP/UDP, local and remote port fields are cleared. + /// + public FirewallProtocol Protocol + { + get; + set + { + if (value == field) + return; + + field = value; + + if (value is not (FirewallProtocol.TCP or FirewallProtocol.UDP)) + { + LocalPorts = string.Empty; + RemotePorts = string.Empty; + } + + OnPropertyChanged(); + OnPropertyChanged(nameof(PortsVisible)); + } + } + + /// + /// when the current protocol supports port filtering (TCP or UDP). + /// + public bool PortsVisible => Protocol is FirewallProtocol.TCP or FirewallProtocol.UDP; + + /// + /// Semicolon-separated local port numbers or ranges (e.g. "80; 443; 8080-8090"). + /// Only relevant when is TCP or UDP. + /// + public string LocalPorts + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = string.Empty; + + /// + /// Semicolon-separated remote port numbers or ranges. + /// Only relevant when is TCP or UDP. + /// + public string RemotePorts + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = string.Empty; + + /// + /// Semicolon-separated local addresses (IPs, CIDR subnets, or keywords such as LocalSubnet). + /// Empty means "Any". + /// + public string LocalAddresses + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = string.Empty; + + /// + /// Semicolon-separated remote addresses. + /// Empty means "Any". + /// + public string RemoteAddresses + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = string.Empty; + + /// + /// Full path to the executable this rule applies to. Empty means "Any program". + /// + public string Program + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = string.Empty; + + /// + /// Network interface type filter. + /// + public FirewallInterfaceType InterfaceType + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Whether the rule applies to the Domain network profile. + /// + public bool NetworkProfileDomain + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + OnPropertyChanged(nameof(IsNetworkProfileDomainEnabled)); + OnPropertyChanged(nameof(IsNetworkProfilePrivateEnabled)); + OnPropertyChanged(nameof(IsNetworkProfilePublicEnabled)); + } + } + + /// + /// Whether the rule applies to the Private network profile. + /// + public bool NetworkProfilePrivate + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + OnPropertyChanged(nameof(IsNetworkProfileDomainEnabled)); + OnPropertyChanged(nameof(IsNetworkProfilePrivateEnabled)); + OnPropertyChanged(nameof(IsNetworkProfilePublicEnabled)); + } + } + + /// + /// Whether the rule applies to the Public network profile. + /// + public bool NetworkProfilePublic + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + OnPropertyChanged(nameof(IsNetworkProfileDomainEnabled)); + OnPropertyChanged(nameof(IsNetworkProfilePrivateEnabled)); + OnPropertyChanged(nameof(IsNetworkProfilePublicEnabled)); + } + } + + public bool IsNetworkProfileDomainEnabled => NetworkProfilePrivate || NetworkProfilePublic; + public bool IsNetworkProfilePrivateEnabled => NetworkProfileDomain || NetworkProfilePublic; + public bool IsNetworkProfilePublicEnabled => NetworkProfileDomain || NetworkProfilePrivate; +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/FirewallViewModel.cs b/Source/NETworkManager/ViewModels/FirewallViewModel.cs new file mode 100644 index 0000000000..384759b2a0 --- /dev/null +++ b/Source/NETworkManager/ViewModels/FirewallViewModel.cs @@ -0,0 +1,609 @@ +using log4net; +using MahApps.Metro.Controls; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Localization.Resources; +using NETworkManager.Models.Export; +using NETworkManager.Models.Firewall; +using NETworkManager.Settings; +using NETworkManager.Utilities; +using NETworkManager.Views; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Linq; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Data; +using System.Windows.Input; + +namespace NETworkManager.ViewModels; + +/// +/// ViewModel for the Firewall application. +/// +public class FirewallViewModel : ViewModelBase +{ + #region Variables + + private static readonly ILog Log = LogManager.GetLogger(typeof(FirewallViewModel)); + + private readonly bool _isLoading; + + #region Rules + + /// + /// Gets the loaded firewall rules. + /// + public ObservableCollection Results { get; } = []; + + /// + /// Gets the filtered/sorted view over . + /// + public ICollectionView ResultsView { get; } + + /// + /// Gets or sets the currently selected firewall rule. + /// + public FirewallRule SelectedResult + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets or sets the list of selected firewall rules (multi-select). + /// + public IList SelectedResults + { + get; + set + { + if (Equals(value, field)) + return; + + field = value; + OnPropertyChanged(); + } + } = new ArrayList(); + + /// + /// Gets or sets the search text for filtering rules. + /// + public string RulesSearch + { + get; + set + { + if (value == field) + return; + + field = value; + ResultsView.Refresh(); + OnPropertyChanged(); + } + } + + /// + /// Gets or sets whether a refresh is currently running. + /// + public bool IsRefreshing + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets or sets whether the status message bar is shown. + /// + public bool IsStatusMessageDisplayed + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets or sets the status message text. + /// + public string StatusMessage + { + get; + private set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + #endregion + + #endregion + + #region Constructor, load settings + + /// + /// Initializes a new instance of the class. + /// + public FirewallViewModel() + { + _isLoading = true; + + // Rules + ResultsView = CollectionViewSource.GetDefaultView(Results); + ResultsView.Filter = o => + { + if (string.IsNullOrEmpty(RulesSearch)) + return true; + + if (o is not FirewallRule rule) + return false; + + return rule.Name.IndexOf(RulesSearch, StringComparison.OrdinalIgnoreCase) > -1 || + rule.Protocol.ToString().IndexOf(RulesSearch, StringComparison.OrdinalIgnoreCase) > -1 || + rule.Action.ToString().IndexOf(RulesSearch, StringComparison.OrdinalIgnoreCase) > -1 || + rule.Direction.ToString().IndexOf(RulesSearch, StringComparison.OrdinalIgnoreCase) > -1; + }; + + // Load firewall rules + _ = Refresh(true); + + _isLoading = false; + } + + #endregion + + #region ICommand & Actions + + /// + /// Gets the command to refresh the list of firewall rules from the system. + /// Disabled while a refresh is already in progress. + /// + public ICommand RefreshCommand => new RelayCommand(parameter => { _ = RefreshAction(); }, Refresh_CanExecute); + + /// + /// Returns when no refresh is currently running. + /// + private bool Refresh_CanExecute(object _) => !IsRefreshing; + + /// + /// Delegates to to reload the firewall rules. + /// + private async Task RefreshAction() => await Refresh(); + + /// + /// Gets the command to open the dialog for adding a new firewall rule. + /// Only enabled when the application is running as administrator. + /// + public ICommand AddRuleCommand => new RelayCommand(parameter => { _ = AddRule(); }, _ => ModifyRule_CanExecute()); + + /// + /// Opens the add-firewall-rule dialog. On confirmation, creates the rule via PowerShell + /// and refreshes the rule list. + /// + private async Task AddRule() + { + var childWindow = new FirewallRuleChildWindow(); + + var childWindowViewModel = new FirewallRuleViewModel(async instance => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + try + { + await Firewall.AddRuleAsync(BuildRule(instance)); + await Refresh(); + } + catch (Exception ex) + { + Log.Error("Error while adding firewall rule", ex); + + StatusMessage = ex.Message; + IsStatusMessageDisplayed = true; + } + }, _ => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }); + + childWindow.Title = Strings.AddRule; + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } + + /// + /// Gets the command to enable the selected firewall rule. + /// Only executable when the rule is currently disabled and modification is allowed. + /// + public ICommand EnableRuleCommand => new RelayCommand(parameter => { _ = SetRuleEnabled(SelectedResult, true); }, _ => ModifyRule_CanExecute() && SelectedResult is { IsEnabled: false }); + + /// + /// Gets the command to disable the selected firewall rule. + /// Only executable when the rule is currently enabled and modification is allowed. + /// + public ICommand DisableRuleCommand => new RelayCommand(parameter => { _ = SetRuleEnabled(SelectedResult, false); }, _ => ModifyRule_CanExecute() && SelectedResult is { IsEnabled: true }); + + /// + /// Enables or disables the given via PowerShell, + /// then reloads the rule list to reflect the updated state. + /// Any PowerShell error is written to the log and shown in the status bar. + /// + /// + /// The firewall rule to modify. + /// + /// + /// to enable the rule; to disable it. + /// + private async Task SetRuleEnabled(FirewallRule rule, bool enabled) + { + try + { + await Firewall.SetRuleEnabledAsync(rule, enabled); + await Refresh(); + } + catch (Exception ex) + { + Log.Error($"Error while {(enabled ? "enabling" : "disabling")} firewall rule", ex); + + StatusMessage = ex.Message; + IsStatusMessageDisplayed = true; + } + } + + /// + /// Gets the command to open the dialog for editing the selected firewall rule. + /// Only executable when a rule is selected and modification is allowed. + /// + public ICommand EditRuleCommand => new RelayCommand(parameter => { _ = EditRule(); }, _ => ModifyRule_CanExecute() && SelectedResult != null); + + /// + /// Opens the edit-firewall-rule dialog pre-filled with the selected rule's properties. + /// On confirmation, deletes the old rule, creates the updated rule via PowerShell, + /// and refreshes the rule list. + /// + private async Task EditRule() + { + var childWindow = new FirewallRuleChildWindow(); + + var childWindowViewModel = new FirewallRuleViewModel(async instance => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + try + { + await Firewall.DeleteRuleAsync(instance.Entry); + await Firewall.AddRuleAsync(BuildRule(instance)); + await Refresh(); + } + catch (Exception ex) + { + Log.Error("Error while editing firewall rule", ex); + + StatusMessage = ex.Message; + IsStatusMessageDisplayed = true; + } + }, _ => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, SelectedResult); + + childWindow.Title = Strings.EditRule; + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } + + /// + /// Gets the command to permanently delete the selected firewall rule. + /// Only executable when a rule is selected and modification is allowed. + /// + public ICommand DeleteRuleCommand => new RelayCommand(parameter => { _ = DeleteRule(); }, _ => ModifyRule_CanExecute() && SelectedResult != null); + + /// + /// Shows a confirmation dialog and, if confirmed, deletes the selected firewall rule + /// via PowerShell and reloads the rule list. + /// Any PowerShell error is written to the log and shown in the status bar. + /// + private async Task DeleteRule() + { + var result = await DialogHelper.ShowConfirmationMessageAsync( + Application.Current.MainWindow, + Strings.DeleteRule, + string.Format(Strings.DeleteFirewallRuleMessage, SelectedResult.Name), + ChildWindowIcon.Info, + Strings.Delete); + + if (!result) + return; + + try + { + await Firewall.DeleteRuleAsync(SelectedResult); + await Refresh(); + } + catch (Exception ex) + { + Log.Error("Error while deleting firewall rule", ex); + + StatusMessage = ex.Message; + IsStatusMessageDisplayed = true; + } + } + + /// + /// Returns when the application is running as administrator, + /// no dialog is open, and no child window is open — i.e. it is safe to modify a rule. + /// + private static bool ModifyRule_CanExecute() + { + return ConfigurationManager.Current.IsAdmin && + Application.Current.MainWindow != null && + !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && + !ConfigurationManager.Current.IsChildWindowOpen; + } + + /// + /// Gets the command to restart the application with administrator privileges. + /// + public ICommand RestartAsAdminCommand => new RelayCommand(parameter => { _ = RestartAsAdminAction(); }); + + /// + /// Restarts the application elevated. Shows an error dialog if the restart fails. + /// + private async Task RestartAsAdminAction() + { + try + { + (Application.Current.MainWindow as MainWindow)?.RestartApplication(true); + } + catch (Exception ex) + { + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, ex.Message, + ChildWindowIcon.Error); + } + } + + /// + /// Gets the command to export the current firewall rule list to a file. + /// + public ICommand ExportCommand => new RelayCommand(parameter => { _ = ExportAction(); }); + + /// + /// Opens the export child window and writes the selected or all firewall rules to the + /// chosen file format (CSV, XML, or JSON). Shows an error dialog if the export fails. + /// + private Task ExportAction() + { + var childWindow = new ExportChildWindow(); + + var childWindowViewModel = new ExportViewModel(async instance => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + try + { + ExportManager.Export(instance.FilePath, instance.FileType, + instance.ExportAll + ? Results + : new ObservableCollection(SelectedResults.Cast().ToArray())); + } + catch (Exception ex) + { + Log.Error("Error while exporting data as " + instance.FileType, ex); + + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); + } + + SettingsManager.Current.Firewall_ExportFileType = instance.FileType; + SettingsManager.Current.Firewall_ExportFilePath = instance.FilePath; + }, _ => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, [ + ExportFileType.Csv, ExportFileType.Xml, ExportFileType.Json + ], true, SettingsManager.Current.Firewall_ExportFileType, + SettingsManager.Current.Firewall_ExportFilePath); + + childWindow.Title = Strings.Export; + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } + + #region Additional commands + + /// + /// Gets the command to open the Windows Firewall management console (WF.msc). + /// + public ICommand OpenWindowsFirewallCommand => new RelayCommand(parameter => { _ = OpenWindowsFirewallAction(); }); + + /// + /// Action to open the Windows Firewall management console (WF.msc). + /// Shows an error dialog if the process cannot be started. + /// + private async Task OpenWindowsFirewallAction() + { + try + { + ExternalProcessStarter.RunProcess("WF.msc"); + } + catch (Exception ex) + { + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, ex.Message, + ChildWindowIcon.Error); + } + } + + #endregion + + #endregion + + #region Methods + + /// + /// Loads all NETworkManager firewall rules from the system via PowerShell and + /// replaces the contents of with the new list. + /// Updates throughout to reflect loading progress. + /// + /// + /// When the initial UI delay is skipped so the first load + /// on startup feels immediate. + /// + private async Task Refresh(bool init = false) + { + if (IsRefreshing) + return; + + IsRefreshing = true; + StatusMessage = Strings.RefreshingDots; + IsStatusMessageDisplayed = true; + + if (!init) + await Task.Delay(GlobalStaticConfiguration.ApplicationUIRefreshInterval); + + try + { + var rules = await Firewall.GetRulesAsync(); + + Application.Current.Dispatcher.Invoke(() => + { + Results.Clear(); + + foreach (var rule in rules) + Results.Add(rule); + }); + + StatusMessage = string.Format(Strings.ReloadedAtX, DateTime.Now.ToShortTimeString()); + IsStatusMessageDisplayed = true; + } + catch (Exception ex) + { + Log.Error("Error while loading firewall rules", ex); + + StatusMessage = string.Format(Strings.FailedToLoadFirewallRulesMessage, ex.Message); + IsStatusMessageDisplayed = true; + } + + IsRefreshing = false; + } + + /// + /// Builds a from the values the user entered in the dialog. + /// + /// The dialog ViewModel containing the user's input. + private static FirewallRule BuildRule(FirewallRuleViewModel vm) => new() + { + Name = vm.Name, + IsEnabled = vm.IsEnabled, + Description = vm.Description ?? string.Empty, + Direction = vm.Direction, + Action = vm.Action, + Protocol = vm.Protocol, + LocalPorts = ParsePortsString(vm.LocalPorts), + RemotePorts = ParsePortsString(vm.RemotePorts), + LocalAddresses = ParseAddressesString(vm.LocalAddresses), + RemoteAddresses = ParseAddressesString(vm.RemoteAddresses), + Program = string.IsNullOrWhiteSpace(vm.Program) ? null : new FirewallRuleProgram(vm.Program), + InterfaceType = vm.InterfaceType, + NetworkProfiles = [vm.NetworkProfileDomain, vm.NetworkProfilePrivate, vm.NetworkProfilePublic] + }; + + /// + /// Parses a semicolon-separated port string (e.g. "80; 443; 8080-8090") into a + /// list of objects. + /// + /// The semicolon-separated port string from the dialog. + private static List ParsePortsString(string value) + { + var list = new List(); + + if (string.IsNullOrWhiteSpace(value)) + return list; + + foreach (var token in value.Split(';', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)) + { + var dash = token.IndexOf('-'); + + if (dash > 0 && + int.TryParse(token[..dash], out var start) && + int.TryParse(token[(dash + 1)..], out var end)) + { + list.Add(new FirewallPortSpecification(start, end)); + } + else if (int.TryParse(token, out var port)) + { + list.Add(new FirewallPortSpecification(port)); + } + } + + return list; + } + + /// + /// Parses a semicolon-separated address string (e.g. "192.168.1.0/24; LocalSubnet") + /// into a list of address strings. + /// + /// The semicolon-separated address string from the dialog. + private static List ParseAddressesString(string value) + { + if (string.IsNullOrWhiteSpace(value)) + return []; + + return [.. value.Split(';', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)]; + } + + /// + /// Called when the view becomes visible. + /// + public void OnViewVisible() + { + } + + /// + /// Called when the view is hidden. + /// + public void OnViewHide() + { + } + + #endregion +} diff --git a/Source/NETworkManager/ViewModels/FirstRunViewModel.cs b/Source/NETworkManager/ViewModels/FirstRunViewModel.cs deleted file mode 100644 index 1e516f3b92..0000000000 --- a/Source/NETworkManager/ViewModels/FirstRunViewModel.cs +++ /dev/null @@ -1,44 +0,0 @@ -using NETworkManager.Utilities; -using System; -using System.Windows.Input; - -namespace NETworkManager.ViewModels -{ - public class FirstRunViewModel : ViewModelBase - { - public ICommand ContinueCommand { get; } - - private bool _checkForUpdatesAtStartup = true; - public bool CheckForUpdatesAtStartup - { - get => _checkForUpdatesAtStartup; - set - { - if(value == _checkForUpdatesAtStartup) - return; - - _checkForUpdatesAtStartup = value; - OnPropertyChanged(); - } - } - - private bool _checkPublicIPAddress = true; - public bool CheckPublicIPAddress - { - get => _checkPublicIPAddress; - set - { - if(value == _checkPublicIPAddress) - return; - - _checkPublicIPAddress = value; - OnPropertyChanged(); - } - } - - public FirstRunViewModel(Action continueCommand) - { - ContinueCommand = new RelayCommand(p => continueCommand(this)); - } - } -} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/GroupViewModel.cs b/Source/NETworkManager/ViewModels/GroupViewModel.cs index 7984dc1f35..a3debe5d79 100644 --- a/Source/NETworkManager/ViewModels/GroupViewModel.cs +++ b/Source/NETworkManager/ViewModels/GroupViewModel.cs @@ -1,8 +1,8 @@ -using NETworkManager.Models.PowerShell; +using NETworkManager.Models.Network; +using NETworkManager.Models.PowerShell; using NETworkManager.Models.PuTTY; using NETworkManager.Models.RemoteDesktop; using NETworkManager.Profiles; -using NETworkManager.Settings; using NETworkManager.Utilities; using System; using System.Collections.Generic; @@ -12,1363 +12,1765 @@ using System.Windows.Data; using System.Windows.Input; -namespace NETworkManager.ViewModels +// ReSharper disable InconsistentNaming + +namespace NETworkManager.ViewModels; + +/// +/// View model for a profile group. +/// +public class GroupViewModel : ViewModelBase { - public class GroupViewModel : ViewModelBase + #region Variables + + /// + /// Indicates whether the view model is loading. + /// + private readonly bool _isLoading = true; + + /// + /// Gets a value indicating whether the profile file is encrypted. + /// + public bool IsProfileFileEncrypted => ProfileManager.LoadedProfileFile.IsEncrypted; + + /// + /// Gets the collection view of group views. + /// + public ICollectionView GroupViews { get; } + + /// + /// Gets the group info. + /// + public GroupInfo Group { get; } + + /// + /// The list of existing group names. + /// + private IReadOnlyCollection _groups { get; } + + #region General + + /// + /// Gets or sets a value indicating whether the name is valid. + /// + public bool NameIsValid { - private readonly bool _isLoading = true; + get; + set + { + if (value == field) + return; - public bool IsProfileFileEncrypted => ProfileManager.LoadedProfileFile.IsEncrypted; + field = value; + OnPropertyChanged(); + } + } = true; + + /// + /// Gets or sets the name of the group. + /// + public string Name + { + get; + set + { + if (value == field) + return; - public ICollectionView GroupViews { get; } - public GroupInfo Group { get; } + // Check name for duplicate... + if (_groups.Contains(value, StringComparer.OrdinalIgnoreCase) && + !value.Equals(Group.Name, StringComparison.OrdinalIgnoreCase)) + NameIsValid = false; + else + NameIsValid = true; - private List _groups { get; } + field = value; + OnPropertyChanged(); + } + } - #region General - private bool _nameIsValid = true; - public bool NameIsValid + /// + /// Gets or sets the description of the group. + /// + public string Description + { + get; + set { - get => _nameIsValid; - set - { - if (value == _nameIsValid) - return; + if (value == field) + return; - _nameIsValid = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + + #endregion - private string _name; - public string Name + #region Remote Desktop + + /// + /// Gets or sets a value indicating whether to use credentials for Remote Desktop. + /// + public bool RemoteDesktop_UseCredentials + { + get; + set { - get => _name; - set - { - if (value == _name) - return; + if (value == field) + return; - // Check name for duplicate... - if (_groups.Contains(value) && !value.Equals(Group.Name)) - NameIsValid = false; - else - NameIsValid = true; + field = value; + OnPropertyChanged(); + } + } - _name = value; - OnPropertyChanged(); - } + /// + /// Gets or sets the username for Remote Desktop. + /// + public string RemoteDesktop_Username + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); } - #endregion + } - #region Remote Desktop - private bool _remoteDesktop_Enabled; - public bool RemoteDesktop_Enabled + /// + /// Gets or sets the domain for Remote Desktop. + /// + public string RemoteDesktop_Domain + { + get; + set { - get => _remoteDesktop_Enabled; - set - { - if (value == _remoteDesktop_Enabled) - return; + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } - _remoteDesktop_Enabled = value; + public bool RemoteDesktop_IsPasswordEmpty + { + get; + set + { + if (value == field) + return; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = true; - private bool _remoteDesktop_UseCredentials; - public bool RemoteDesktop_UseCredentials + public SecureString RemoteDesktop_Password + { + get; + set { - get => _remoteDesktop_UseCredentials; - set - { - if (value == _remoteDesktop_UseCredentials) - return; + if (value == field) + return; + + // Validate the password string + RemoteDesktop_IsPasswordEmpty = + value == null || string.IsNullOrEmpty(SecureStringHelper.ConvertToString(value)); - _remoteDesktop_UseCredentials = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _remoteDesktop_Username; - public string RemoteDesktop_Username + public bool RemoteDesktop_AdminSession + { + get; + set { - get => _remoteDesktop_Username; - set - { - if (value == _remoteDesktop_Username) - return; + if (value == field) + return; - _remoteDesktop_Username = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_IsPasswordEmpty = true; // Initial it's empty - public bool RemoteDesktop_IsPasswordEmpty + public bool RemoteDesktop_OverrideDisplay + { + get; + set { - get => _remoteDesktop_IsPasswordEmpty; - set - { - if (value == _remoteDesktop_IsPasswordEmpty) - return; + if (value == field) + return; - _remoteDesktop_IsPasswordEmpty = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private SecureString _remoteDesktop_Password; + public bool RemoteDesktop_AdjustScreenAutomatically + { + get; + set + { + if (value == field) + return; - /// - /// RemoteDesktop password as secure string. - /// - public SecureString RemoteDesktop_Password + field = value; + OnPropertyChanged(); + } + } + + public bool RemoteDesktop_UseCurrentViewSize + { + get; + set { - get => _remoteDesktop_Password; - set - { - if (value == _remoteDesktop_Password) - return; + if (value == field) + return; - // Validate the password string - RemoteDesktop_IsPasswordEmpty = value == null || string.IsNullOrEmpty(SecureStringHelper.ConvertToString(value)); + field = value; + OnPropertyChanged(); + } + } - _remoteDesktop_Password = value; - OnPropertyChanged(); - } + public bool RemoteDesktop_UseFixedScreenSize + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } + + public IEnumerable RemoteDesktop_ScreenResolutions => RemoteDesktop.ScreenResolutions; - private bool _remoteDesktop_PasswordChanged; - public bool RemoteDesktop_PasswordChanged + public int RemoteDesktop_ScreenWidth; + public int RemoteDesktop_ScreenHeight; + + public string RemoteDesktop_SelectedScreenResolution + { + get; + set { - get => _remoteDesktop_PasswordChanged; - set - { - if (value == _remoteDesktop_PasswordChanged) - return; + if (value == field) + return; + + var resolution = value.Split('x'); - _remoteDesktop_PasswordChanged = value; - OnPropertyChanged(); - } + RemoteDesktop_ScreenWidth = int.Parse(resolution[0]); + RemoteDesktop_ScreenHeight = int.Parse(resolution[1]); + + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_OverrideDisplay; - public bool RemoteDesktop_OverrideDisplay + public bool RemoteDesktop_UseCustomScreenSize + { + get; + set { - get => _remoteDesktop_OverrideDisplay; - set - { - if (value == _remoteDesktop_OverrideDisplay) - return; + if (value == field) + return; - _remoteDesktop_OverrideDisplay = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_AdjustScreenAutomatically; - public bool RemoteDesktop_AdjustScreenAutomatically + public string RemoteDesktop_CustomScreenWidth + { + get; + set { - get => _remoteDesktop_AdjustScreenAutomatically; - set - { - if (value == _remoteDesktop_AdjustScreenAutomatically) - return; + if (value == field) + return; - _remoteDesktop_AdjustScreenAutomatically = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_UseCurrentViewSize; - public bool RemoteDesktop_UseCurrentViewSize + public string RemoteDesktop_CustomScreenHeight + { + get; + set { - get => _remoteDesktop_UseCurrentViewSize; - set - { - if (value == _remoteDesktop_UseCurrentViewSize) - return; + if (value == field) + return; - _remoteDesktop_UseCurrentViewSize = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_UseFixedScreenSize; - public bool RemoteDesktop_UseFixedScreenSize + public bool RemoteDesktop_OverrideColorDepth + { + get; + set { - get => _remoteDesktop_UseFixedScreenSize; - set - { - if (value == _remoteDesktop_UseFixedScreenSize) - return; + if (value == field) + return; - _remoteDesktop_UseFixedScreenSize = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + + public List RemoteDesktop_ColorDepths => RemoteDesktop.ColorDepths; - public List RemoteDesktop_ScreenResolutions => RemoteDesktop.ScreenResolutions; + public int RemoteDesktop_SelectedColorDepth + { + get; + set + { + if (value == field) + return; - public int RemoteDesktop_ScreenWidth; - public int RemoteDesktop_ScreenHeight; + field = value; + OnPropertyChanged(); + } + } - private string _remoteDesktop_SelectedScreenResolution; - public string RemoteDesktop_SelectedScreenResolution + public bool RemoteDesktop_OverridePort + { + get; + set { - get => _remoteDesktop_SelectedScreenResolution; - set - { - if (value == _remoteDesktop_SelectedScreenResolution) - return; + if (value == field) + return; - var resolution = value.Split('x'); + field = value; + OnPropertyChanged(); + } + } - RemoteDesktop_ScreenWidth = int.Parse(resolution[0]); - RemoteDesktop_ScreenHeight = int.Parse(resolution[1]); + public int RemoteDesktop_Port + { + get; + set + { + if (value == field) + return; - _remoteDesktop_SelectedScreenResolution = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_UseCustomScreenSize; - public bool RemoteDesktop_UseCustomScreenSize + public bool RemoteDesktop_OverrideViewOnly + { + get; + set { - get => _remoteDesktop_UseCustomScreenSize; - set - { - if (value == _remoteDesktop_UseCustomScreenSize) - return; + if (value == field) + return; - _remoteDesktop_UseCustomScreenSize = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _remoteDesktop_CustomScreenWidth; - public string RemoteDesktop_CustomScreenWidth + public bool RemoteDesktop_ViewOnly + { + get; + set { - get => _remoteDesktop_CustomScreenWidth; - set - { - if (value == _remoteDesktop_CustomScreenWidth) - return; + if (value == field) + return; - _remoteDesktop_CustomScreenWidth = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _remoteDesktop_CustomScreenHeight; - public string RemoteDesktop_CustomScreenHeight + public bool RemoteDesktop_OverrideCredSspSupport + { + get; + set { - get => _remoteDesktop_CustomScreenHeight; - set - { - if (value == _remoteDesktop_CustomScreenHeight) - return; + if (value == field) + return; - _remoteDesktop_CustomScreenHeight = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_OverrideColorDepth; - public bool RemoteDesktop_OverrideColorDepth + public bool RemoteDesktop_EnableCredSspSupport + { + get; + set { - get => _remoteDesktop_OverrideColorDepth; - set - { - if (value == _remoteDesktop_OverrideColorDepth) - return; + if (value == field) + return; - _remoteDesktop_OverrideColorDepth = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + + public bool RemoteDesktop_OverrideAuthenticationLevel + { + get; + set + { + if (value == field) + return; - public List RemoteDesktop_ColorDepths => RemoteDesktop.ColorDepths; + field = value; + OnPropertyChanged(); + } + } - private int _remoteDesktop_SelectedColorDepth; - public int RemoteDesktop_SelectedColorDepth + public uint RemoteDesktop_AuthenticationLevel + { + get; + set { - get => _remoteDesktop_SelectedColorDepth; - set - { - if (value == _remoteDesktop_SelectedColorDepth) - return; + if (value == field) + return; - _remoteDesktop_SelectedColorDepth = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_OverridePort; - public bool RemoteDesktop_OverridePort + public bool RemoteDesktop_OverrideGatewayServer + { + get; + set { - get => _remoteDesktop_OverridePort; - set - { - if (value == _remoteDesktop_OverridePort) - return; + if (value == field) + return; - _remoteDesktop_OverridePort = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private int _remoteDesktop_Port; - public int RemoteDesktop_Port + public bool RemoteDesktop_EnableGatewayServer + { + get; + set { - get => _remoteDesktop_Port; - set - { - if (value == _remoteDesktop_Port) - return; + if (value == field) + return; - _remoteDesktop_Port = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_OverrideCredSspSupport; - public bool RemoteDesktop_OverrideCredSspSupport + public string RemoteDesktop_GatewayServerHostname + { + get; + set { - get => _remoteDesktop_OverrideCredSspSupport; - set - { - if (value == _remoteDesktop_OverrideCredSspSupport) - return; + if (value == field) + return; - _remoteDesktop_OverrideCredSspSupport = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_EnableCredSspSupport; - public bool RemoteDesktop_EnableCredSspSupport + public bool RemoteDesktop_GatewayServerBypassLocalAddresses + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public IEnumerable RemoteDesktop_GatewayServerLogonMethods => + Enum.GetValues(typeof(GatewayUserSelectedCredsSource)).Cast(); + + public GatewayUserSelectedCredsSource RemoteDesktop_GatewayServerLogonMethod + { + get; + set + { + if (Equals(value, field)) + return; + + field = value; + OnPropertyChanged(); + } + } + + public bool RemoteDesktop_GatewayServerShareCredentialsWithRemoteComputer + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public bool RemoteDesktop_UseGatewayServerCredentials + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public string RemoteDesktop_GatewayServerUsername + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public string RemoteDesktop_GatewayServerDomain + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public bool RemoteDesktop_IsGatewayServerPasswordEmpty + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = true; + + public SecureString RemoteDesktop_GatewayServerPassword + { + get; + set + { + if (value == field) + return; + + // Validate the password string + RemoteDesktop_IsGatewayServerPasswordEmpty = + value == null || string.IsNullOrEmpty(SecureStringHelper.ConvertToString(value)); + + field = value; + OnPropertyChanged(); + } + } + + public bool RemoteDesktop_OverrideAudioRedirectionMode + { + get; + set { - get => _remoteDesktop_EnableCredSspSupport; - set - { - if (value == _remoteDesktop_EnableCredSspSupport) - return; + if (value == field) + return; - _remoteDesktop_EnableCredSspSupport = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_OverrideAuthenticationLevel; - public bool RemoteDesktop_OverrideAuthenticationLevel + public IEnumerable RemoteDesktop_AudioRedirectionModes => + Enum.GetValues(typeof(AudioRedirectionMode)).Cast(); + + public AudioRedirectionMode RemoteDesktop_AudioRedirectionMode + { + get; + set { - get => _remoteDesktop_OverrideAuthenticationLevel; - set - { - if (value == _remoteDesktop_OverrideAuthenticationLevel) - return; + if (Equals(value, field)) + return; - _remoteDesktop_OverrideAuthenticationLevel = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private uint _remoteDesktop_AuthenticationLevel; - public uint RemoteDesktop_AuthenticationLevel + + public bool RemoteDesktop_OverrideAudioCaptureRedirectionMode + { + get; + set { - get => _remoteDesktop_AuthenticationLevel; - set - { - if (value == _remoteDesktop_AuthenticationLevel) - return; + if (value == field) + return; - _remoteDesktop_AuthenticationLevel = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + + public IEnumerable RemoteDesktop_AudioCaptureRedirectionModes => + Enum.GetValues(typeof(AudioCaptureRedirectionMode)).Cast(); + + public AudioCaptureRedirectionMode RemoteDesktop_AudioCaptureRedirectionMode + { + get; + set + { + if (Equals(value, field)) + return; + + field = value; + OnPropertyChanged(); + } + } + + + public bool RemoteDesktop_OverrideApplyWindowsKeyCombinations + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public IEnumerable RemoteDesktop_KeyboardHookModes => + Enum.GetValues(typeof(KeyboardHookMode)).Cast(); + + public KeyboardHookMode RemoteDesktop_KeyboardHookMode + { + get; + set + { + if (Equals(value, field)) + return; + + field = value; + OnPropertyChanged(); + } + } + + public bool RemoteDesktop_OverrideRedirectClipboard + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public bool RemoteDesktop_RedirectClipboard + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } - private bool _remoteDesktop_OverrideAudioRedirectionMode; - public bool RemoteDesktop_OverrideAudioRedirectionMode + public bool RemoteDesktop_OverrideRedirectDevices + { + get; + set { - get => _remoteDesktop_OverrideAudioRedirectionMode; - set - { - if (value == _remoteDesktop_OverrideAudioRedirectionMode) - return; + if (value == field) + return; - _remoteDesktop_OverrideAudioRedirectionMode = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + + public bool RemoteDesktop_RedirectDevices + { + get; + set + { + if (value == field) + return; - public IEnumerable RemoteDesktop_AudioRedirectionModes => Enum.GetValues(typeof(AudioRedirectionMode)).Cast(); + field = value; + OnPropertyChanged(); + } + } - private AudioRedirectionMode _remoteDesktop_AudioRedirectionMode; - public AudioRedirectionMode RemoteDesktop_AudioRedirectionMode + public bool RemoteDesktop_OverrideRedirectDrives + { + get; + set { - get => _remoteDesktop_AudioRedirectionMode; - set - { - if (Equals(value, _remoteDesktop_AudioRedirectionMode)) - return; + if (value == field) + return; - _remoteDesktop_AudioRedirectionMode = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + public bool RemoteDesktop_RedirectDrives + { + get; + set + { + if (value == field) + return; - private bool _remoteDesktop_OverrideAudioCaptureRedirectionMode; - public bool RemoteDesktop_OverrideAudioCaptureRedirectionMode + field = value; + OnPropertyChanged(); + } + } + + public bool RemoteDesktop_OverrideRedirectPorts + { + get; + set { - get => _remoteDesktop_OverrideAudioCaptureRedirectionMode; - set - { - if (value == _remoteDesktop_OverrideAudioCaptureRedirectionMode) - return; + if (value == field) + return; - _remoteDesktop_OverrideAudioCaptureRedirectionMode = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - public IEnumerable RemoteDesktop_AudioCaptureRedirectionModes => Enum.GetValues(typeof(AudioCaptureRedirectionMode)).Cast(); + public bool RemoteDesktop_RedirectPorts + { + get; + set + { + if (value == field) + return; - private AudioCaptureRedirectionMode _remoteDesktop_AudioCaptureRedirectionMode; - public AudioCaptureRedirectionMode RemoteDesktop_AudioCaptureRedirectionMode + field = value; + OnPropertyChanged(); + } + } + + public bool RemoteDesktop_OverrideRedirectSmartcards + { + get; + set { - get => _remoteDesktop_AudioCaptureRedirectionMode; - set - { - if (Equals(value, _remoteDesktop_AudioCaptureRedirectionMode)) - return; + if (value == field) + return; - _remoteDesktop_AudioCaptureRedirectionMode = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + public bool RemoteDesktop_RedirectSmartCards + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } - private bool _remoteDesktop_OverrideApplyWindowsKeyCombinations; - public bool RemoteDesktop_OverrideApplyWindowsKeyCombinations + public bool RemoteDesktop_OverrideRedirectPrinters + { + get; + set { - get => _remoteDesktop_OverrideApplyWindowsKeyCombinations; - set - { - if (value == _remoteDesktop_OverrideApplyWindowsKeyCombinations) - return; + if (value == field) + return; - _remoteDesktop_OverrideApplyWindowsKeyCombinations = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + + public bool RemoteDesktop_RedirectPrinters + { + get; + set + { + if (value == field) + return; - public IEnumerable RemoteDesktop_KeyboardHookModes => System.Enum.GetValues(typeof(KeyboardHookMode)).Cast(); + field = value; + OnPropertyChanged(); + } + } - private KeyboardHookMode _remoteDesktop_KeyboardHookMode; - public KeyboardHookMode RemoteDesktop_KeyboardHookMode + public bool RemoteDesktop_OverridePersistentBitmapCaching + { + get; + set { - get => _remoteDesktop_KeyboardHookMode; - set - { - if (Equals(value, _remoteDesktop_KeyboardHookMode)) - return; + if (value == field) + return; - _remoteDesktop_KeyboardHookMode = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_OverrideRedirectClipboard; - public bool RemoteDesktop_OverrideRedirectClipboard + public bool RemoteDesktop_PersistentBitmapCaching + { + get; + set { - get => _remoteDesktop_OverrideRedirectClipboard; - set - { - if (value == _remoteDesktop_OverrideRedirectClipboard) - return; + if (value == field) + return; - _remoteDesktop_OverrideRedirectClipboard = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_RedirectClipboard; - public bool RemoteDesktop_RedirectClipboard + public bool RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped + { + get; + set { - get => _remoteDesktop_RedirectClipboard; - set - { - if (value == _remoteDesktop_RedirectClipboard) - return; + if (value == field) + return; - _remoteDesktop_RedirectClipboard = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_OverrideRedirectDevices; - public bool RemoteDesktop_OverrideRedirectDevices + public bool RemoteDesktop_ReconnectIfTheConnectionIsDropped + { + get; + set { - get => _remoteDesktop_OverrideRedirectDevices; - set - { - if (value == _remoteDesktop_OverrideRedirectDevices) - return; + if (value == field) + return; - _remoteDesktop_OverrideRedirectDevices = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_RedirectDevices; - public bool RemoteDesktop_RedirectDevices + public bool RemoteDesktop_OverrideNetworkConnectionType + { + get; + set { - get => _remoteDesktop_RedirectDevices; - set - { - if (value == _remoteDesktop_RedirectDevices) - return; + if (value == field) + return; - _remoteDesktop_RedirectDevices = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + + public IEnumerable RemoteDesktop_NetworkConnectionTypes => + Enum.GetValues(typeof(NetworkConnectionType)).Cast(); - private bool _remoteDesktop_OverrideRedirectDrives; - public bool RemoteDesktop_OverrideRedirectDrives + public NetworkConnectionType RemoteDesktop_NetworkConnectionType + { + get; + set { - get => _remoteDesktop_OverrideRedirectDrives; - set - { - if (value == _remoteDesktop_OverrideRedirectDrives) - return; + if (Equals(value, field)) + return; + + if (!_isLoading) + ChangeNetworkConnectionTypeSettings(value); - _remoteDesktop_OverrideRedirectDrives = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_RedirectDrives; - public bool RemoteDesktop_RedirectDrives + public bool RemoteDesktop_DesktopBackground + { + get; + set { - get => _remoteDesktop_RedirectDrives; - set - { - if (value == _remoteDesktop_RedirectDrives) - return; + if (value == field) + return; - _remoteDesktop_RedirectDrives = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_OverrideRedirectPorts; - public bool RemoteDesktop_OverrideRedirectPorts + public bool RemoteDesktop_FontSmoothing + { + get; + set { - get => _remoteDesktop_OverrideRedirectPorts; - set - { - if (value == _remoteDesktop_OverrideRedirectPorts) - return; + if (value == field) + return; - _remoteDesktop_OverrideRedirectPorts = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_RedirectPorts; - public bool RemoteDesktop_RedirectPorts + public bool RemoteDesktop_DesktopComposition + { + get; + set { - get => _remoteDesktop_RedirectPorts; - set - { - if (value == _remoteDesktop_RedirectPorts) - return; + if (value == field) + return; - _remoteDesktop_RedirectPorts = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_OverrideRedirectSmartcards; - public bool RemoteDesktop_OverrideRedirectSmartcards + public bool RemoteDesktop_ShowWindowContentsWhileDragging + { + get; + set { - get => _remoteDesktop_OverrideRedirectSmartcards; - set - { - if (value == _remoteDesktop_OverrideRedirectSmartcards) - return; + if (value == field) + return; - _remoteDesktop_OverrideRedirectSmartcards = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_RedirectSmartCards; - public bool RemoteDesktop_RedirectSmartCards + public bool RemoteDesktop_MenuAndWindowAnimation + { + get; + set { - get => _remoteDesktop_RedirectSmartCards; - set - { - if (value == _remoteDesktop_RedirectSmartCards) - return; + if (value == field) + return; - _remoteDesktop_RedirectSmartCards = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_OverrideRedirectPrinters; - public bool RemoteDesktop_OverrideRedirectPrinters + public bool RemoteDesktop_VisualStyles + { + get; + set { - get => _remoteDesktop_OverrideRedirectPrinters; - set - { - if (value == _remoteDesktop_OverrideRedirectPrinters) - return; + if (value == field) + return; - _remoteDesktop_OverrideRedirectPrinters = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_RedirectPrinters; - public bool RemoteDesktop_RedirectPrinters + #endregion + + #region PowerShell + + public bool PowerShell_OverrideCommand + { + get; + set { - get => _remoteDesktop_RedirectPrinters; - set - { - if (value == _remoteDesktop_RedirectPrinters) - return; + if (value == field) + return; - _remoteDesktop_RedirectPrinters = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_OverridePersistentBitmapCaching; - public bool RemoteDesktop_OverridePersistentBitmapCaching + public string PowerShell_Command + { + get; + set { - get => _remoteDesktop_OverridePersistentBitmapCaching; - set - { - if (value == _remoteDesktop_OverridePersistentBitmapCaching) - return; + if (value == field) + return; - _remoteDesktop_OverridePersistentBitmapCaching = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_PersistentBitmapCaching; - public bool RemoteDesktop_PersistentBitmapCaching + public bool PowerShell_OverrideAdditionalCommandLine + { + get; + set { - get => _remoteDesktop_PersistentBitmapCaching; - set - { - if (value == _remoteDesktop_PersistentBitmapCaching) - return; + if (value == field) + return; - _remoteDesktop_PersistentBitmapCaching = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_OverrideReconnectIfTheConnectionIsDropped; - public bool RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped + public string PowerShell_AdditionalCommandLine + { + get; + set { - get => _remoteDesktop_OverrideReconnectIfTheConnectionIsDropped; - set - { - if (value == _remoteDesktop_OverrideReconnectIfTheConnectionIsDropped) - return; + if (value == field) + return; - _remoteDesktop_OverrideReconnectIfTheConnectionIsDropped = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_ReconnectIfTheConnectionIsDropped; - public bool RemoteDesktop_ReconnectIfTheConnectionIsDropped + public bool PowerShell_OverrideExecutionPolicy + { + get; + set { - get => _remoteDesktop_ReconnectIfTheConnectionIsDropped; - set - { - if (value == _remoteDesktop_ReconnectIfTheConnectionIsDropped) - return; + if (value == field) + return; - _remoteDesktop_ReconnectIfTheConnectionIsDropped = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + + public IEnumerable PowerShell_ExecutionPolicies { get; set; } - private bool _remoteDesktop_OverrideNetworkConnectionType; - public bool RemoteDesktop_OverrideNetworkConnectionType + public ExecutionPolicy PowerShell_ExecutionPolicy + { + get; + set { - get => _remoteDesktop_OverrideNetworkConnectionType; - set - { - if (value == _remoteDesktop_OverrideNetworkConnectionType) - return; + if (value == field) + return; - _remoteDesktop_OverrideNetworkConnectionType = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + + #endregion - public IEnumerable RemoteDesktop_NetworkConnectionTypes => Enum.GetValues(typeof(NetworkConnectionType)).Cast(); + #region PuTTY - private NetworkConnectionType _remoteDesktop_NetworkConnectionType; - public NetworkConnectionType RemoteDesktop_NetworkConnectionType + public bool PuTTY_OverrideUsername + { + get; + set { - get => _remoteDesktop_NetworkConnectionType; - set - { - if (Equals(value, _remoteDesktop_NetworkConnectionType)) - return; + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } - if (!_isLoading) - ChangeNetworkConnectionTypeSettings(value); + public string PuTTY_Username + { + get; + set + { + if (value == field) + return; - _remoteDesktop_NetworkConnectionType = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_DesktopBackground; - public bool RemoteDesktop_DesktopBackground + public bool PuTTY_OverridePrivateKeyFile + { + get; + set { - get => _remoteDesktop_DesktopBackground; - set - { - if (value == _remoteDesktop_DesktopBackground) - return; + if (value == field) + return; - _remoteDesktop_DesktopBackground = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_FontSmoothing; - public bool RemoteDesktop_FontSmoothing + public string PuTTY_PrivateKeyFile + { + get; + set { - get => _remoteDesktop_FontSmoothing; - set - { - if (value == _remoteDesktop_FontSmoothing) - return; + if (value == field) + return; - _remoteDesktop_FontSmoothing = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_DesktopComposition; - public bool RemoteDesktop_DesktopComposition + public bool PuTTY_OverrideProfile + { + get; + set { - get => _remoteDesktop_DesktopComposition; - set - { - if (value == _remoteDesktop_DesktopComposition) - return; + if (value == field) + return; - _remoteDesktop_DesktopComposition = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_ShowWindowContentsWhileDragging; - public bool RemoteDesktop_ShowWindowContentsWhileDragging + public string PuTTY_Profile + { + get; + set { - get => _remoteDesktop_ShowWindowContentsWhileDragging; - set - { - if (value == _remoteDesktop_ShowWindowContentsWhileDragging) - return; + if (value == field) + return; - _remoteDesktop_ShowWindowContentsWhileDragging = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_MenuAndWindowAnimation; - public bool RemoteDesktop_MenuAndWindowAnimation + public bool PuTTY_OverrideEnableLog + { + get; + set { - get => _remoteDesktop_MenuAndWindowAnimation; - set - { - if (value == _remoteDesktop_MenuAndWindowAnimation) - return; + if (value == field) + return; - _remoteDesktop_MenuAndWindowAnimation = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_VisualStyles; - public bool RemoteDesktop_VisualStyles + public bool PuTTY_EnableLog + { + get; + set { - get => _remoteDesktop_VisualStyles; - set - { - if (value == _remoteDesktop_VisualStyles) - return; + if (value == field) + return; - _remoteDesktop_VisualStyles = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion + } - #region PowerShell - private bool _powerShell_Enabled; - public bool PowerShell_Enabled + public bool PuTTY_OverrideLogMode + { + get; + set { - get => _powerShell_Enabled; - set - { - if (value == _powerShell_Enabled) - return; + if (value == field) + return; - _powerShell_Enabled = value; + field = value; + OnPropertyChanged(); + } + } + + public IEnumerable PuTTY_LogModes => Enum.GetValues(typeof(LogMode)).Cast(); + + public LogMode PuTTY_LogMode + { + get; + set + { + if (Equals(value, field)) + return; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _powerShell_OverrideAdditionalCommandLine; - public bool PowerShell_OverrideAdditionalCommandLine + public bool PuTTY_OverrideLogPath + { + get; + set { - get => _powerShell_OverrideAdditionalCommandLine; - set - { - if (value == _powerShell_OverrideAdditionalCommandLine) - return; + if (value == field) + return; - _powerShell_OverrideAdditionalCommandLine = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _powerShell_AdditionalCommandLine; - public string PowerShell_AdditionalCommandLine + public string PuTTY_LogPath + { + get; + set { - get => _powerShell_AdditionalCommandLine; - set - { - if (value == _powerShell_AdditionalCommandLine) - return; + if (value == field) + return; - _powerShell_AdditionalCommandLine = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private List _powerShell_ExecutionPolicies = new List(); - public List PowerShell_ExecutionPolicies + public bool PuTTY_OverrideLogFileName + { + get; + set { - get => _powerShell_ExecutionPolicies; - set - { - if (value == _powerShell_ExecutionPolicies) - return; + if (value == field) + return; - _powerShell_ExecutionPolicies = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _powerShell_OverrideExecutionPolicy; - public bool PowerShell_OverrideExecutionPolicy + public string PuTTY_LogFileName + { + get; + set { - get => _powerShell_OverrideExecutionPolicy; - set - { - if (value == _powerShell_OverrideExecutionPolicy) - return; + if (value == field) + return; - _powerShell_OverrideExecutionPolicy = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private PowerShell.ExecutionPolicy _powerShell_ExecutionPolicy; - public PowerShell.ExecutionPolicy PowerShell_ExecutionPolicy + public bool PuTTY_OverrideAdditionalCommandLine + { + get; + set { - get => _powerShell_ExecutionPolicy; - set - { - if (value == _powerShell_ExecutionPolicy) - return; + if (value == field) + return; - _powerShell_ExecutionPolicy = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion + } - #region PuTTY - private bool _puTTY_Enabled; - public bool PuTTY_Enabled + public string PuTTY_AdditionalCommandLine + { + get; + set { - get => _puTTY_Enabled; - set - { - if (value == _puTTY_Enabled) - return; + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } - _puTTY_Enabled = value; + public ConnectionMode PuTTY_ConnectionMode + { + get; + set + { + if (value == field) + return; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + + #endregion + + #region TigerVNC - private bool _puTTY_OverrideUsername; - public bool PuTTY_OverrideUsername + public bool TigerVNC_OverridePort + { + get; + set { - get => _puTTY_OverrideUsername; - set - { - if (value == _puTTY_OverrideUsername) - return; + if (value == field) + return; - _puTTY_OverrideUsername = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _puTTY__Username; - public string PuTTY_Username + public int TigerVNC_Port + { + get; + set { - get => _puTTY__Username; - set - { - if (value == _puTTY__Username) - return; + if (value == field) + return; - _puTTY__Username = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + + #endregion - private bool _puTTY_OverridePrivateKeyFile; - public bool PuTTY_OverridePrivateKeyFile + #region SNMP + + public bool SNMP_OverrideOIDAndMode + { + get; + set { - get => _puTTY_OverridePrivateKeyFile; - set - { - if (value == _puTTY_OverridePrivateKeyFile) - return; + if (value == field) + return; - _puTTY_OverridePrivateKeyFile = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _puTTY__PrivateKeyFile; - public string PuTTY_PrivateKeyFile + public string SNMP_OID + { + get; + set { - get => _puTTY__PrivateKeyFile; - set - { - if (value == _puTTY__PrivateKeyFile) - return; + if (value == field) + return; - _puTTY__PrivateKeyFile = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + + public IEnumerable SNMP_Modes { get; set; } - private bool _puTTY_OverrideProfile; - public bool PuTTY_OverrideProfile + public SNMPMode SNMP_Mode + { + get; + set { - get => _puTTY_OverrideProfile; - set - { - if (value == _puTTY_OverrideProfile) - return; + if (value == field) + return; + + field = value; + OnPropertyChanged(); - _puTTY_OverrideProfile = value; - OnPropertyChanged(); - } + // Re-validate OID if mode changed + OnPropertyChanged(nameof(SNMP_OID)); } + } - private string _puTTY_Profile; - public string PuTTY_Profile + public bool SNMP_OverrideVersionAndAuth + { + get; + set { - get => _puTTY_Profile; - set - { - if (value == _puTTY_Profile) - return; + if (value == field) + return; - _puTTY_Profile = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _puTTY_OverrideEnableLog; - public bool PuTTY_OverrideEnableLog + public IEnumerable SNMP_Versions { get; } + + public SNMPVersion SNMP_Version + { + get; + set { - get => _puTTY_OverrideEnableLog; - set - { - if (value == _puTTY_OverrideEnableLog) - return; + if (value == field) + return; - _puTTY_OverrideEnableLog = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _puTTY_EnableLog; - public bool PuTTY_EnableLog + public bool SNMP_IsCommunityEmpty + { + get; + set { - get => _puTTY_EnableLog; - set - { - if (value == _puTTY_EnableLog) - return; + if (value == field) + return; - _puTTY_EnableLog = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = true; - private bool _puTTY_OverrideLogMode; - public bool PuTTY_OverrideLogMode + public SecureString SNMP_Community + { + get; + set { - get => _puTTY_OverrideLogMode; - set - { - if (value == _puTTY_OverrideLogMode) - return; + if (value == field) + return; + + // Validate the password string + SNMP_IsCommunityEmpty = value == null || string.IsNullOrEmpty(SecureStringHelper.ConvertToString(value)); - _puTTY_OverrideLogMode = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - public IEnumerable PuTTY_LogModes => Enum.GetValues(typeof(LogMode)).Cast(); + public IEnumerable SNMP_Securities { get; } - private LogMode _puTTY_LogMode; - public LogMode PuTTY_LogMode + public SNMPV3Security SNMP_Security + { + get; + set { - get => _puTTY_LogMode; - set - { - if (Equals(value, _puTTY_LogMode)) - return; + if (value == field) + return; - _puTTY_LogMode = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _puTTY_OverrideLogPath; - public bool PuTTY_OverrideLogPath + public string SNMP_Username + { + get; + set { - get => _puTTY_OverrideLogPath; - set - { - if (value == _puTTY_OverrideLogPath) - return; + if (value == field) + return; - _puTTY_OverrideLogPath = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + + public IEnumerable SNMP_AuthenticationProviders { get; } - private string _puTTY_LogPath; - public string PuTTY_LogPath + public SNMPV3AuthenticationProvider SNMP_AuthenticationProvider + { + get; + set { - get => _puTTY_LogPath; - set - { - if (value == _puTTY_LogPath) - return; + if (value == field) + return; - _puTTY_LogPath = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _puTTY_OverrideLogFileName; - public bool PuTTY_OverrideLogFileName + public bool SNMP_IsAuthEmpty + { + get; + set { - get => _puTTY_OverrideLogFileName; - set - { - if (value == _puTTY_OverrideLogFileName) - return; + if (value == field) + return; - _puTTY_OverrideLogFileName = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = true; - private string _puTTY_LogFileName; - public string PuTTY_LogFileName + public SecureString SNMP_Auth + { + get; + set { - get => _puTTY_LogFileName; - set - { - if (value == _puTTY_LogFileName) - return; + if (value == field) + return; + + // Validate the password string + SNMP_IsAuthEmpty = value == null || string.IsNullOrEmpty(SecureStringHelper.ConvertToString(value)); - _puTTY_LogFileName = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _puTTY_OverrideAdditionalCommandLine; - public bool PuTTY_OverrideAdditionalCommandLine + public IEnumerable SNMP_PrivacyProviders { get; } + + public SNMPV3PrivacyProvider SNMP_PrivacyProvider + { + get; + set { - get => _puTTY_OverrideAdditionalCommandLine; - set - { - if (value == _puTTY_OverrideAdditionalCommandLine) - return; + if (value == field) + return; - _puTTY_OverrideAdditionalCommandLine = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _puTTY_AdditionalCommandLine; - public string PuTTY_AdditionalCommandLine + public bool SNMP_IsPrivEmpty + { + get; + set { - get => _puTTY_AdditionalCommandLine; - set - { - if (value == _puTTY_AdditionalCommandLine) - return; + if (value == field) + return; - _puTTY_AdditionalCommandLine = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = true; - private ConnectionMode _puTTY_ConnectionMode; - public ConnectionMode PuTTY_ConnectionMode + public SecureString SNMP_Priv + { + get; + set { - get => _puTTY_ConnectionMode; - set - { - if (value == _puTTY_ConnectionMode) - return; + if (value == field) + return; + + // Validate the password string + SNMP_IsPrivEmpty = value == null || string.IsNullOrEmpty(SecureStringHelper.ConvertToString(value)); + + field = value; + OnPropertyChanged(); + } + } + + #endregion + + #endregion + + #region Constructor + + public GroupViewModel(Action saveCommand, Action cancelHandler, + IReadOnlyCollection groups, GroupEditMode editMode = GroupEditMode.Add, GroupInfo group = null) + { + // Load the view + GroupViews = new CollectionViewSource { Source = GroupViewManager.List }.View; + GroupViews.SortDescriptions.Add(new SortDescription(nameof(GroupViewInfo.Name), ListSortDirection.Ascending)); + + SaveCommand = new RelayCommand(_ => saveCommand(this)); + CancelCommand = new RelayCommand(_ => cancelHandler(this)); + + var groupInfo = group ?? new GroupInfo(); + + Group = groupInfo; + _groups = groups; + + // General + Name = groupInfo.Name; + Description = groupInfo.Description; + + // Remote Desktop + RemoteDesktop_UseCredentials = groupInfo.RemoteDesktop_UseCredentials; + RemoteDesktop_Username = groupInfo.RemoteDesktop_Username; + RemoteDesktop_Domain = groupInfo.RemoteDesktop_Domain; + RemoteDesktop_Password = groupInfo.RemoteDesktop_Password; + RemoteDesktop_AdminSession = groupInfo.RemoteDesktop_AdminSession; + RemoteDesktop_OverrideDisplay = groupInfo.RemoteDesktop_OverrideDisplay; + RemoteDesktop_AdjustScreenAutomatically = groupInfo.RemoteDesktop_AdjustScreenAutomatically; + RemoteDesktop_UseCurrentViewSize = groupInfo.RemoteDesktop_UseCurrentViewSize; + RemoteDesktop_UseFixedScreenSize = groupInfo.RemoteDesktop_UseFixedScreenSize; + RemoteDesktop_SelectedScreenResolution = RemoteDesktop_ScreenResolutions.FirstOrDefault(x => + x == $"{groupInfo.RemoteDesktop_ScreenWidth}x{groupInfo.RemoteDesktop_ScreenHeight}"); + RemoteDesktop_UseCustomScreenSize = groupInfo.RemoteDesktop_UseCustomScreenSize; + RemoteDesktop_CustomScreenWidth = groupInfo.RemoteDesktop_CustomScreenWidth.ToString(); + RemoteDesktop_CustomScreenHeight = groupInfo.RemoteDesktop_CustomScreenHeight.ToString(); + RemoteDesktop_OverrideColorDepth = groupInfo.RemoteDesktop_OverrideColorDepth; + RemoteDesktop_SelectedColorDepth = + RemoteDesktop_ColorDepths.FirstOrDefault(x => x == groupInfo.RemoteDesktop_ColorDepth); + RemoteDesktop_OverridePort = groupInfo.RemoteDesktop_OverridePort; + RemoteDesktop_Port = groupInfo.RemoteDesktop_Port; + RemoteDesktop_OverrideViewOnly = groupInfo.RemoteDesktop_OverrideViewOnly; + RemoteDesktop_ViewOnly = groupInfo.RemoteDesktop_ViewOnly; + RemoteDesktop_OverrideCredSspSupport = groupInfo.RemoteDesktop_OverrideCredSspSupport; + RemoteDesktop_EnableCredSspSupport = groupInfo.RemoteDesktop_EnableCredSspSupport; + RemoteDesktop_OverrideAuthenticationLevel = groupInfo.RemoteDesktop_OverrideAuthenticationLevel; + RemoteDesktop_AuthenticationLevel = groupInfo.RemoteDesktop_AuthenticationLevel; + RemoteDesktop_OverrideGatewayServer = groupInfo.RemoteDesktop_OverrideGatewayServer; + RemoteDesktop_EnableGatewayServer = groupInfo.RemoteDesktop_EnableGatewayServer; + RemoteDesktop_GatewayServerHostname = groupInfo.RemoteDesktop_GatewayServerHostname; + RemoteDesktop_GatewayServerBypassLocalAddresses = groupInfo.RemoteDesktop_GatewayServerBypassLocalAddresses; + RemoteDesktop_GatewayServerLogonMethod = groupInfo.RemoteDesktop_GatewayServerLogonMethod; + RemoteDesktop_GatewayServerShareCredentialsWithRemoteComputer = + groupInfo.RemoteDesktop_GatewayServerShareCredentialsWithRemoteComputer; + RemoteDesktop_UseGatewayServerCredentials = groupInfo.RemoteDesktop_UseGatewayServerCredentials; + RemoteDesktop_GatewayServerUsername = groupInfo.RemoteDesktop_GatewayServerUsername; + RemoteDesktop_GatewayServerDomain = groupInfo.RemoteDesktop_GatewayServerDomain; + RemoteDesktop_GatewayServerPassword = groupInfo.RemoteDesktop_GatewayServerPassword; + RemoteDesktop_OverrideAudioRedirectionMode = groupInfo.RemoteDesktop_OverrideAudioRedirectionMode; + RemoteDesktop_AudioRedirectionMode = + RemoteDesktop_AudioRedirectionModes.FirstOrDefault(x => x == groupInfo.RemoteDesktop_AudioRedirectionMode); + RemoteDesktop_OverrideAudioCaptureRedirectionMode = groupInfo.RemoteDesktop_OverrideAudioCaptureRedirectionMode; + RemoteDesktop_AudioCaptureRedirectionMode = + RemoteDesktop_AudioCaptureRedirectionModes.FirstOrDefault(x => + x == groupInfo.RemoteDesktop_AudioCaptureRedirectionMode); + RemoteDesktop_OverrideApplyWindowsKeyCombinations = groupInfo.RemoteDesktop_OverrideApplyWindowsKeyCombinations; + RemoteDesktop_KeyboardHookMode = + RemoteDesktop_KeyboardHookModes.FirstOrDefault(x => x == groupInfo.RemoteDesktop_KeyboardHookMode); + RemoteDesktop_OverrideRedirectClipboard = groupInfo.RemoteDesktop_OverrideRedirectClipboard; + RemoteDesktop_RedirectClipboard = groupInfo.RemoteDesktop_RedirectClipboard; + RemoteDesktop_OverrideRedirectDevices = groupInfo.RemoteDesktop_OverrideRedirectDevices; + RemoteDesktop_RedirectDevices = groupInfo.RemoteDesktop_RedirectDevices; + RemoteDesktop_OverrideRedirectDrives = groupInfo.RemoteDesktop_OverrideRedirectDrives; + RemoteDesktop_RedirectDrives = groupInfo.RemoteDesktop_RedirectDrives; + RemoteDesktop_OverrideRedirectPorts = groupInfo.RemoteDesktop_OverrideRedirectPorts; + RemoteDesktop_RedirectPorts = groupInfo.RemoteDesktop_RedirectPorts; + RemoteDesktop_OverrideRedirectSmartcards = groupInfo.RemoteDesktop_OverrideRedirectSmartcards; + RemoteDesktop_RedirectSmartCards = groupInfo.RemoteDesktop_RedirectSmartCards; + RemoteDesktop_OverrideRedirectPrinters = groupInfo.RemoteDesktop_OverrideRedirectPrinters; + RemoteDesktop_RedirectPrinters = groupInfo.RemoteDesktop_RedirectPrinters; + RemoteDesktop_OverridePersistentBitmapCaching = groupInfo.RemoteDesktop_OverridePersistentBitmapCaching; + RemoteDesktop_PersistentBitmapCaching = groupInfo.RemoteDesktop_PersistentBitmapCaching; + RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped = + groupInfo.RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped; + RemoteDesktop_ReconnectIfTheConnectionIsDropped = groupInfo.RemoteDesktop_ReconnectIfTheConnectionIsDropped; + RemoteDesktop_NetworkConnectionType = + RemoteDesktop_NetworkConnectionTypes.FirstOrDefault(x => + x == groupInfo.RemoteDesktop_NetworkConnectionType); + RemoteDesktop_DesktopBackground = groupInfo.RemoteDesktop_DesktopBackground; + RemoteDesktop_FontSmoothing = groupInfo.RemoteDesktop_FontSmoothing; + RemoteDesktop_DesktopComposition = groupInfo.RemoteDesktop_DesktopComposition; + RemoteDesktop_ShowWindowContentsWhileDragging = groupInfo.RemoteDesktop_ShowWindowContentsWhileDragging; + RemoteDesktop_MenuAndWindowAnimation = groupInfo.RemoteDesktop_MenuAndWindowAnimation; + RemoteDesktop_VisualStyles = groupInfo.RemoteDesktop_VisualStyles; + + // PowerShell + PowerShell_OverrideCommand = groupInfo.PowerShell_OverrideCommand; + PowerShell_Command = groupInfo.PowerShell_Command; + PowerShell_OverrideAdditionalCommandLine = groupInfo.PowerShell_OverrideAdditionalCommandLine; + PowerShell_AdditionalCommandLine = groupInfo.PowerShell_AdditionalCommandLine; + PowerShell_OverrideExecutionPolicy = groupInfo.PowerShell_OverrideExecutionPolicy; + PowerShell_ExecutionPolicies = Enum.GetValues(typeof(ExecutionPolicy)).Cast().ToList(); + PowerShell_ExecutionPolicy = + PowerShell_ExecutionPolicies.FirstOrDefault(x => x == groupInfo.PowerShell_ExecutionPolicy); + + // PuTTY + PuTTY_OverrideUsername = groupInfo.PuTTY_OverrideUsername; + PuTTY_Username = groupInfo.PuTTY_Username; + PuTTY_OverridePrivateKeyFile = groupInfo.PuTTY_OverridePrivateKeyFile; + PuTTY_PrivateKeyFile = groupInfo.PuTTY_PrivateKeyFile; + PuTTY_OverrideProfile = groupInfo.PuTTY_OverrideProfile; + PuTTY_Profile = groupInfo.PuTTY_Profile; + PuTTY_OverrideEnableLog = groupInfo.PuTTY_OverrideEnableLog; + PuTTY_EnableLog = groupInfo.PuTTY_EnableLog; + PuTTY_OverrideLogMode = groupInfo.PuTTY_OverrideLogMode; + PuTTY_LogMode = PuTTY_LogModes.FirstOrDefault(x => x == groupInfo.PuTTY_LogMode); + PuTTY_OverrideLogPath = groupInfo.PuTTY_OverrideLogPath; + PuTTY_LogPath = groupInfo.PuTTY_LogPath; + PuTTY_OverrideLogFileName = groupInfo.PuTTY_OverrideLogFileName; + PuTTY_LogFileName = groupInfo.PuTTY_LogFileName; + PuTTY_OverrideAdditionalCommandLine = groupInfo.PuTTY_OverrideAdditionalCommandLine; + PuTTY_AdditionalCommandLine = groupInfo.PuTTY_AdditionalCommandLine; + + // TigerVNC + TigerVNC_OverridePort = groupInfo.TigerVNC_OverridePort; + TigerVNC_Port = groupInfo.TigerVNC_Port; + + // SNMP + SNMP_OverrideOIDAndMode = groupInfo.SNMP_OverrideOIDAndMode; + SNMP_OID = groupInfo.SNMP_OID; + SNMP_Modes = [SNMPMode.Get, SNMPMode.Walk, SNMPMode.Set]; + SNMP_Mode = SNMP_Modes.FirstOrDefault(x => x == groupInfo.SNMP_Mode); + SNMP_OverrideVersionAndAuth = groupInfo.SNMP_OverrideVersionAndAuth; + SNMP_Versions = Enum.GetValues(typeof(SNMPVersion)).Cast().ToList(); + SNMP_Version = SNMP_Versions.FirstOrDefault(x => x == groupInfo.SNMP_Version); + SNMP_Community = groupInfo.SNMP_Community; + SNMP_Securities = [SNMPV3Security.NoAuthNoPriv, SNMPV3Security.AuthNoPriv, SNMPV3Security.AuthPriv]; + SNMP_Security = SNMP_Securities.FirstOrDefault(x => x == groupInfo.SNMP_Security); + SNMP_Username = groupInfo.SNMP_Username; + SNMP_AuthenticationProviders = [.. Enum.GetValues(typeof(SNMPV3AuthenticationProvider)).Cast()]; + SNMP_AuthenticationProvider = + SNMP_AuthenticationProviders.FirstOrDefault(x => x == groupInfo.SNMP_AuthenticationProvider); + SNMP_Auth = groupInfo.SNMP_Auth; + SNMP_PrivacyProviders = Enum.GetValues(typeof(SNMPV3PrivacyProvider)).Cast().ToList(); + SNMP_PrivacyProvider = SNMP_PrivacyProviders.FirstOrDefault(x => x == groupInfo.SNMP_PrivacyProvider); + SNMP_Priv = groupInfo.SNMP_Priv; + + _isLoading = false; + } + + #endregion - _puTTY_ConnectionMode = value; - } - } - #endregion - - #region TigerVNC - private bool _tigerVNC_Enabled; - public bool TigerVNC_Enabled - { - get => _tigerVNC_Enabled; - set - { - if (value == _tigerVNC_Enabled) - return; - - _tigerVNC_Enabled = value; - - OnPropertyChanged(); - } - } - - private bool _tigerVNC_OverridePort; - public bool TigerVNC_OverridePort - { - get => _tigerVNC_OverridePort; - set - { - if (value == _tigerVNC_OverridePort) - return; - - _tigerVNC_OverridePort = value; - OnPropertyChanged(); - } - } - - private int _tigerVNC_Port; - public int TigerVNC_Port - { - get => _tigerVNC_Port; - set - { - if (value == _tigerVNC_Port) - return; - - _tigerVNC_Port = value; - OnPropertyChanged(); - } - } - #endregion - - public GroupViewModel(Action saveCommand, Action cancelHandler, List groups, GroupEditMode editMode = GroupEditMode.Add, GroupInfo group = null) - { - // Load the view - GroupViews = new CollectionViewSource { Source = GroupViewManager.List }.View; - GroupViews.SortDescriptions.Add(new SortDescription(nameof(GroupViewInfo.Name), ListSortDirection.Ascending)); - - SaveCommand = new RelayCommand(p => saveCommand(this)); - CancelCommand = new RelayCommand(p => cancelHandler(this)); - - var groupInfo = group ?? new GroupInfo(); - - Group = groupInfo; - _groups = groups; - - // General - Name = groupInfo.Name; - - // Remote Desktop - RemoteDesktop_Enabled = groupInfo.RemoteDesktop_Enabled; - RemoteDesktop_UseCredentials = groupInfo.RemoteDesktop_UseCredentials; - RemoteDesktop_Username = groupInfo.RemoteDesktop_Username; - RemoteDesktop_Password = groupInfo.RemoteDesktop_Password; - RemoteDesktop_OverrideDisplay = groupInfo.RemoteDesktop_OverrideDisplay; - RemoteDesktop_AdjustScreenAutomatically = groupInfo.RemoteDesktop_AdjustScreenAutomatically; - RemoteDesktop_UseCurrentViewSize = groupInfo.RemoteDesktop_UseCurrentViewSize; - RemoteDesktop_UseFixedScreenSize = groupInfo.RemoteDesktop_UseFixedScreenSize; - RemoteDesktop_SelectedScreenResolution = RemoteDesktop_ScreenResolutions.FirstOrDefault(x => x == $"{groupInfo.RemoteDesktop_ScreenWidth}x{groupInfo.RemoteDesktop_ScreenHeight}"); - RemoteDesktop_UseCustomScreenSize = groupInfo.RemoteDesktop_UseCustomScreenSize; - RemoteDesktop_CustomScreenWidth = groupInfo.RemoteDesktop_CustomScreenWidth.ToString(); - RemoteDesktop_CustomScreenHeight = groupInfo.RemoteDesktop_CustomScreenHeight.ToString(); - RemoteDesktop_OverrideColorDepth = groupInfo.RemoteDesktop_OverrideColorDepth; - RemoteDesktop_SelectedColorDepth = RemoteDesktop_ColorDepths.FirstOrDefault(x => x == groupInfo.RemoteDesktop_ColorDepth); - RemoteDesktop_OverridePort = groupInfo.RemoteDesktop_OverridePort; - RemoteDesktop_Port = groupInfo.RemoteDesktop_Port; - RemoteDesktop_OverrideCredSspSupport = groupInfo.RemoteDesktop_OverrideCredSspSupport; - RemoteDesktop_EnableCredSspSupport = groupInfo.RemoteDesktop_EnableCredSspSupport; - RemoteDesktop_OverrideAuthenticationLevel = groupInfo.RemoteDesktop_OverrideAuthenticationLevel; - RemoteDesktop_AuthenticationLevel = groupInfo.RemoteDesktop_AuthenticationLevel; - RemoteDesktop_OverrideAudioRedirectionMode = groupInfo.RemoteDesktop_OverrideAudioRedirectionMode; - RemoteDesktop_AudioRedirectionMode = RemoteDesktop_AudioRedirectionModes.FirstOrDefault(x => x == groupInfo.RemoteDesktop_AudioRedirectionMode); - RemoteDesktop_OverrideAudioCaptureRedirectionMode = groupInfo.RemoteDesktop_OverrideAudioCaptureRedirectionMode; - RemoteDesktop_AudioCaptureRedirectionMode = RemoteDesktop_AudioCaptureRedirectionModes.FirstOrDefault(x => x == groupInfo.RemoteDesktop_AudioCaptureRedirectionMode); - RemoteDesktop_OverrideApplyWindowsKeyCombinations = groupInfo.RemoteDesktop_OverrideApplyWindowsKeyCombinations; - RemoteDesktop_KeyboardHookMode = RemoteDesktop_KeyboardHookModes.FirstOrDefault(x => x == groupInfo.RemoteDesktop_KeyboardHookMode); - RemoteDesktop_OverrideRedirectClipboard = groupInfo.RemoteDesktop_OverrideRedirectClipboard; - RemoteDesktop_RedirectClipboard = groupInfo.RemoteDesktop_RedirectClipboard; - RemoteDesktop_OverrideRedirectDevices = groupInfo.RemoteDesktop_OverrideRedirectDevices; - RemoteDesktop_RedirectDevices = groupInfo.RemoteDesktop_RedirectDevices; - RemoteDesktop_OverrideRedirectDrives = groupInfo.RemoteDesktop_OverrideRedirectDrives; - RemoteDesktop_RedirectDrives = groupInfo.RemoteDesktop_RedirectDrives; - RemoteDesktop_OverrideRedirectPorts = groupInfo.RemoteDesktop_OverrideRedirectPorts; - RemoteDesktop_RedirectPorts = groupInfo.RemoteDesktop_RedirectPorts; - RemoteDesktop_OverrideRedirectSmartcards = groupInfo.RemoteDesktop_OverrideRedirectSmartcards; - RemoteDesktop_RedirectSmartCards = groupInfo.RemoteDesktop_RedirectSmartCards; - RemoteDesktop_OverrideRedirectPrinters = groupInfo.RemoteDesktop_OverrideRedirectPrinters; - RemoteDesktop_RedirectPrinters = groupInfo.RemoteDesktop_RedirectPrinters; - RemoteDesktop_OverridePersistentBitmapCaching = groupInfo.RemoteDesktop_OverridePersistentBitmapCaching; - RemoteDesktop_PersistentBitmapCaching = groupInfo.RemoteDesktop_PersistentBitmapCaching; - RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped = groupInfo.RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped; - RemoteDesktop_ReconnectIfTheConnectionIsDropped = groupInfo.RemoteDesktop_ReconnectIfTheConnectionIsDropped; - RemoteDesktop_NetworkConnectionType = RemoteDesktop_NetworkConnectionTypes.FirstOrDefault(x => x == groupInfo.RemoteDesktop_NetworkConnectionType); - RemoteDesktop_DesktopBackground = groupInfo.RemoteDesktop_DesktopBackground; - RemoteDesktop_FontSmoothing = groupInfo.RemoteDesktop_FontSmoothing; - RemoteDesktop_DesktopComposition = groupInfo.RemoteDesktop_DesktopComposition; - RemoteDesktop_ShowWindowContentsWhileDragging = groupInfo.RemoteDesktop_ShowWindowContentsWhileDragging; - RemoteDesktop_MenuAndWindowAnimation = groupInfo.RemoteDesktop_MenuAndWindowAnimation; - RemoteDesktop_VisualStyles = groupInfo.RemoteDesktop_VisualStyles; - - // PowerShell - PowerShell_Enabled = groupInfo.PowerShell_Enabled; - PowerShell_OverrideAdditionalCommandLine = groupInfo.PowerShell_OverrideAdditionalCommandLine; - PowerShell_AdditionalCommandLine = groupInfo.PowerShell_AdditionalCommandLine; - PowerShell_ExecutionPolicies = Enum.GetValues(typeof(PowerShell.ExecutionPolicy)).Cast().ToList(); - PowerShell_OverrideExecutionPolicy = groupInfo.PowerShell_OverrideExecutionPolicy; - PowerShell_ExecutionPolicy = editMode != GroupEditMode.Add ? groupInfo.PowerShell_ExecutionPolicy : PowerShell_ExecutionPolicies.FirstOrDefault(x => x == SettingsManager.Current.PowerShell_ExecutionPolicy); ; - - // PuTTY - PuTTY_Enabled = groupInfo.PuTTY_Enabled; - PuTTY_OverrideUsername = groupInfo.PuTTY_OverrideUsername; - PuTTY_Username = groupInfo.PuTTY_Username; - PuTTY_OverridePrivateKeyFile = groupInfo.PuTTY_OverridePrivateKeyFile; - PuTTY_PrivateKeyFile = groupInfo.PuTTY_PrivateKeyFile; - PuTTY_OverrideProfile = groupInfo.PuTTY_OverrideProfile; - PuTTY_Profile = groupInfo.PuTTY_Profile; - PuTTY_OverrideEnableLog = groupInfo.PuTTY_OverrideEnableLog; - PuTTY_EnableLog = groupInfo.PuTTY_EnableLog; - PuTTY_OverrideLogMode = groupInfo.PuTTY_OverrideLogMode; - PuTTY_LogMode = PuTTY_LogModes.FirstOrDefault(x => x == groupInfo.PuTTY_LogMode); - PuTTY_OverrideLogPath = groupInfo.PuTTY_OverrideLogPath; - PuTTY_LogPath = groupInfo.PuTTY_LogPath; - PuTTY_OverrideLogFileName = groupInfo.PuTTY_OverrideLogFileName; - PuTTY_LogFileName = groupInfo.PuTTY_LogFileName; - PuTTY_OverrideAdditionalCommandLine = groupInfo.PuTTY_OverrideAdditionalCommandLine; - PuTTY_AdditionalCommandLine = groupInfo.PuTTY_AdditionalCommandLine; - - // TigerVNC - TigerVNC_Enabled = groupInfo.TigerVNC_Enabled; - TigerVNC_OverridePort = groupInfo.TigerVNC_OverridePort; - TigerVNC_Port = groupInfo.TigerVNC_OverridePort ? groupInfo.TigerVNC_Port : SettingsManager.Current.TigerVNC_Port; - - _isLoading = false; - } - - #region ICommand & Actions - public ICommand SaveCommand { get; } - - public ICommand CancelCommand { get; } - - public ICommand RemoteDesktopPasswordChangedCommand => new RelayCommand(p => RemoteDesktopPasswordChangedAction()); - #endregion - - #region Methods - private void RemoteDesktopPasswordChangedAction() - { - RemoteDesktop_PasswordChanged = true; - } - - private void ChangeNetworkConnectionTypeSettings(NetworkConnectionType connectionSpeed) - { - switch (connectionSpeed) - { - case NetworkConnectionType.Modem: - RemoteDesktop_DesktopBackground = false; - RemoteDesktop_FontSmoothing = false; - RemoteDesktop_DesktopComposition = false; - RemoteDesktop_ShowWindowContentsWhileDragging = false; - RemoteDesktop_MenuAndWindowAnimation = false; - RemoteDesktop_VisualStyles = false; - break; - case NetworkConnectionType.BroadbandLow: - RemoteDesktop_DesktopBackground = false; - RemoteDesktop_FontSmoothing = false; - RemoteDesktop_DesktopComposition = false; - RemoteDesktop_ShowWindowContentsWhileDragging = false; - RemoteDesktop_MenuAndWindowAnimation = false; - RemoteDesktop_VisualStyles = true; - break; - case NetworkConnectionType.Satellite: - case NetworkConnectionType.BroadbandHigh: - RemoteDesktop_DesktopBackground = false; - RemoteDesktop_FontSmoothing = false; - RemoteDesktop_DesktopComposition = true; - RemoteDesktop_ShowWindowContentsWhileDragging = false; - RemoteDesktop_MenuAndWindowAnimation = false; - RemoteDesktop_VisualStyles = true; - break; - case NetworkConnectionType.WAN: - case NetworkConnectionType.LAN: - RemoteDesktop_DesktopBackground = true; - RemoteDesktop_FontSmoothing = true; - RemoteDesktop_DesktopComposition = true; - RemoteDesktop_ShowWindowContentsWhileDragging = true; - RemoteDesktop_MenuAndWindowAnimation = true; - RemoteDesktop_VisualStyles = true; - break; - } - } - #endregion + #region Methods + + private void ChangeNetworkConnectionTypeSettings(NetworkConnectionType connectionSpeed) + { + switch (connectionSpeed) + { + case NetworkConnectionType.Modem: + RemoteDesktop_DesktopBackground = false; + RemoteDesktop_FontSmoothing = false; + RemoteDesktop_DesktopComposition = false; + RemoteDesktop_ShowWindowContentsWhileDragging = false; + RemoteDesktop_MenuAndWindowAnimation = false; + RemoteDesktop_VisualStyles = false; + break; + case NetworkConnectionType.BroadbandLow: + RemoteDesktop_DesktopBackground = false; + RemoteDesktop_FontSmoothing = false; + RemoteDesktop_DesktopComposition = false; + RemoteDesktop_ShowWindowContentsWhileDragging = false; + RemoteDesktop_MenuAndWindowAnimation = false; + RemoteDesktop_VisualStyles = true; + break; + case NetworkConnectionType.Satellite: + case NetworkConnectionType.BroadbandHigh: + RemoteDesktop_DesktopBackground = false; + RemoteDesktop_FontSmoothing = false; + RemoteDesktop_DesktopComposition = true; + RemoteDesktop_ShowWindowContentsWhileDragging = false; + RemoteDesktop_MenuAndWindowAnimation = false; + RemoteDesktop_VisualStyles = true; + break; + case NetworkConnectionType.WAN: + case NetworkConnectionType.LAN: + RemoteDesktop_DesktopBackground = true; + RemoteDesktop_FontSmoothing = true; + RemoteDesktop_DesktopComposition = true; + RemoteDesktop_ShowWindowContentsWhileDragging = true; + RemoteDesktop_MenuAndWindowAnimation = true; + RemoteDesktop_VisualStyles = true; + break; + } } + + #endregion + + #region ICommand & Actions + + public ICommand SaveCommand { get; } + + public ICommand CancelCommand { get; } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/HostsFileEditorEntryViewModel.cs b/Source/NETworkManager/ViewModels/HostsFileEditorEntryViewModel.cs new file mode 100644 index 0000000000..766145ca8b --- /dev/null +++ b/Source/NETworkManager/ViewModels/HostsFileEditorEntryViewModel.cs @@ -0,0 +1,122 @@ +using NETworkManager.Models.HostsFileEditor; +using NETworkManager.Utilities; +using System; +using System.Windows.Input; + +namespace NETworkManager.ViewModels; + +/// +/// ViewModel for adding or editing a hosts file entry in the HostsFileEditor dialog. +/// +public class HostsFileEditorEntryViewModel : ViewModelBase +{ + /// + /// Creates a new instance of for adding or + /// editing a hosts file entry. + /// + /// OK command to save the entry. + /// Cancel command to discard the entry. + /// Entry to edit, if null a new entry will be created. + public HostsFileEditorEntryViewModel(Action okCommand, + Action cancelHandler, HostsFileEntry entry = null) + { + OKCommand = new RelayCommand(_ => okCommand(this)); + CancelCommand = new RelayCommand(_ => cancelHandler(this)); + + Entry = entry; + + // Add entry + if (Entry == null) + { + IsEnabled = true; + } + // Edit entry + else + { + IsEnabled = entry.IsEnabled; + IPAddress = entry.IPAddress; + Hostname = entry.Hostname; + Comment = entry.Comment; + } + } + + /// + /// OK command to save the entry. + /// + public ICommand OKCommand { get; } + + /// + /// Cancel command to discard the entry. + /// + public ICommand CancelCommand { get; } + + /// + /// Gets the hosts file entry. + /// + public HostsFileEntry Entry { get; } = null; + + /// + /// Indicates whether the entry is enabled or not. + /// + public bool IsEnabled + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// IP address of the host. + /// + public string IPAddress + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Host name(s) of the host. Multiple host names are separated by a + /// space (equal to the hosts file format). + /// + public string Hostname + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Comment of the host. + /// + public string Comment + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/HostsFileEditorViewModel.cs b/Source/NETworkManager/ViewModels/HostsFileEditorViewModel.cs new file mode 100644 index 0000000000..0b69b39d89 --- /dev/null +++ b/Source/NETworkManager/ViewModels/HostsFileEditorViewModel.cs @@ -0,0 +1,627 @@ +using log4net; +using MahApps.Metro.Controls; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Localization.Resources; +using NETworkManager.Models.Export; +using NETworkManager.Models.HostsFileEditor; +using NETworkManager.Settings; +using NETworkManager.Utilities; +using NETworkManager.Views; +using System; +using System.Collections; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Linq; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Data; +using System.Windows.Input; + +namespace NETworkManager.ViewModels; + +/// +/// View model for the hosts file editor. +/// +public class HostsFileEditorViewModel : ViewModelBase +{ + #region Variables + + private static readonly ILog Log = LogManager.GetLogger(typeof(HostsFileEditorViewModel)); + + /// + /// Indicates whether the view model is loading. + /// + private readonly bool _isLoading; + + /// + /// Gets or sets the search text. + /// + public string Search + { + get; + set + { + if (value == field) + return; + + field = value; + + ResultsView.Refresh(); + + OnPropertyChanged(); + } + } + + /// + /// Gets or sets the collection of hosts file entries. + /// + public ObservableCollection Results + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = []; + + /// + /// Gets the collection view for the hosts file entries. + /// + public ICollectionView ResultsView { get; } + + /// + /// Gets or sets the selected hosts file entry. + /// + public HostsFileEntry SelectedResult + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets or sets the list of selected hosts file entries. + /// + public IList SelectedResults + { + get; + set + { + if (Equals(value, field)) + return; + + field = value; + OnPropertyChanged(); + } + } = new ArrayList(); + + /// + /// Gets or sets a value indicating whether the view model is modifying an entry. + /// + public bool IsModifying + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets or sets a value indicating whether the view model is currently refreshing. + /// + public bool IsRefreshing + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets or sets a value indicating whether the status message is displayed. + /// + public bool IsStatusMessageDisplayed + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets the status message. + /// + public string StatusMessage + { + get; + private set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + #endregion + + #region Constructor, LoadSettings + + /// + /// Initializes a new instance of the class. + /// + public HostsFileEditorViewModel() + { + _isLoading = true; + + // Result view + search + ResultsView = CollectionViewSource.GetDefaultView(Results); + ResultsView.Filter = o => + { + if (string.IsNullOrEmpty(Search)) + return true; + + if (o is not HostsFileEntry entry) + return false; + + return entry.IPAddress.IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || + entry.Hostname.IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || + entry.Comment.IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1; + }; + + // Get hosts file entries + _ = Refresh(true); + + // Watch hosts file for changes + HostsFileEditor.HostsFileChanged += (_, _) => + { + Application.Current.Dispatcher.Invoke(() => { _ = Refresh(); }); + }; + + _isLoading = false; + } + + /// + /// Loads the settings. + /// + private void LoadSettings() + { + } + + #endregion + + #region ICommands & Actions + + /// + /// Gets the command to refresh the entries. + /// + public ICommand RefreshCommand => new RelayCommand(parameter => { _ = RefreshAction(); }, Refresh_CanExecute); + + /// + /// Checks if the refresh command can be executed. + /// + /// The command parameter. + /// true if the command can be executed; otherwise, false. + private bool Refresh_CanExecute(object parameter) + { + return Application.Current.MainWindow != null && + !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && + !ConfigurationManager.Current.IsChildWindowOpen && + !IsRefreshing && + !IsModifying; + } + + /// + /// Action to refresh the entries. + /// + private async Task RefreshAction() + { + await Refresh(); + } + + /// + /// Gets the command to export the entries. + /// + public ICommand ExportCommand => new RelayCommand(parameter => { _ = ExportAction(); }); + + /// + /// Action to export the entries. + /// + private Task ExportAction() + { + var childWindow = new ExportChildWindow(); + + var childWindowViewModel = new ExportViewModel(async instance => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + try + { + ExportManager.Export(instance.FilePath, instance.FileType, + instance.ExportAll + ? Results + : new ObservableCollection(SelectedResults.Cast() + .ToArray())); + } + catch (Exception ex) + { + Log.Error("Error while exporting data as " + instance.FileType, ex); + + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); + } + + SettingsManager.Current.HostsFileEditor_ExportFileType = instance.FileType; + SettingsManager.Current.HostsFileEditor_ExportFilePath = instance.FilePath; + }, _ => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, [ + ExportFileType.Csv, ExportFileType.Xml, ExportFileType.Json + ], true, SettingsManager.Current.HostsFileEditor_ExportFileType, + SettingsManager.Current.HostsFileEditor_ExportFilePath); + + childWindow.Title = Strings.Export; + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } + + /// + /// Gets the command to enable the selected entry. + /// + public ICommand EnableEntryCommand => + new RelayCommand(parameter => { _ = EnableEntryAction(); }, ModifyEntry_CanExecute); + + /// + /// Action to enable the selected entry. + /// + private async Task EnableEntryAction() + { + IsModifying = true; + + var result = await HostsFileEditor.EnableEntryAsync(SelectedResult); + + if (result != HostsFileEntryModifyResult.Success) + await ShowErrorMessageAsync(result); + + IsModifying = false; + } + + /// + /// Gets the command to disable the selected entry. + /// + public ICommand DisableEntryCommand => + new RelayCommand(parameter => { _ = DisableEntryAction(); }, ModifyEntry_CanExecute); + + /// + /// Action to disable the selected entry. + /// + private async Task DisableEntryAction() + { + IsModifying = true; + + var result = await HostsFileEditor.DisableEntryAsync(SelectedResult); + + if (result != HostsFileEntryModifyResult.Success) + await ShowErrorMessageAsync(result); + + IsModifying = false; + } + + /// + /// Gets the command to add a new entry. + /// + public ICommand AddEntryCommand => + new RelayCommand(parameter => { _ = AddEntryAction(); }, ModifyEntry_CanExecute); + + /// + /// Action to add a new entry. + /// + private async Task AddEntryAction() + { + IsModifying = true; + + var childWindow = new HostsFileEditorEntryChildWindow(); + + var childWindowViewModel = new HostsFileEditorEntryViewModel(async instance => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + var result = await HostsFileEditor.AddEntryAsync(new HostsFileEntry + ( + instance.IsEnabled, + instance.IPAddress, + instance.Hostname, + instance.Comment + ) + ); + + if (result != HostsFileEntryModifyResult.Success) + await ShowErrorMessageAsync(result); + + IsModifying = false; + }, _ => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + IsModifying = false; + }); + + childWindow.Title = Strings.AddEntry; + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } + + /// + /// Gets the command to edit the selected entry. + /// + public ICommand EditEntryCommand => + new RelayCommand(parameter => { _ = EditEntryAction(); }, ModifyEntry_CanExecute); + + /// + /// Action to edit the selected entry. + /// + private async Task EditEntryAction() + { + IsModifying = true; + + var childWindow = new HostsFileEditorEntryChildWindow(); + + var childWindowViewModel = new HostsFileEditorEntryViewModel(async instance => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + var result = await HostsFileEditor.EditEntryAsync(instance.Entry, new HostsFileEntry + ( + instance.IsEnabled, + instance.IPAddress, + instance.Hostname, + instance.Comment + ) + ); + + if (result != HostsFileEntryModifyResult.Success) + await ShowErrorMessageAsync(result); + + IsModifying = false; + }, _ => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + IsModifying = false; + }, SelectedResult); + + childWindow.Title = Strings.EditEntry; + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } + + /// + /// Gets the command to delete the selected entry. + /// + public ICommand DeleteEntryCommand => + new RelayCommand(parameter => { _ = DeleteEntryAction(); }, ModifyEntry_CanExecute); + + /// + /// Action to delete the selected entry. + /// + private async Task DeleteEntryAction() + { + IsModifying = true; + + var result = await DialogHelper.ShowConfirmationMessageAsync( + Application.Current.MainWindow, + Strings.DeleteEntry, + string.Format(Strings.DeleteHostsFileEntryMessage, SelectedResult.IPAddress, SelectedResult.Hostname, + string.IsNullOrEmpty(SelectedResult.Comment) ? "" : $"# {SelectedResult.Comment}"), + ChildWindowIcon.Info, + Strings.Delete); + + if (!result) + { + IsModifying = false; + return; + } + + + var modifyResult = await HostsFileEditor.DeleteEntryAsync(SelectedResult); + + if (modifyResult != HostsFileEntryModifyResult.Success) + await ShowErrorMessageAsync(modifyResult); + + IsModifying = false; + } + + /// + /// Checks if the entry modification commands can be executed. + /// + private bool ModifyEntry_CanExecute(object obj) + { + return ConfigurationManager.Current.IsAdmin && + Application.Current.MainWindow != null && + !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && + !ConfigurationManager.Current.IsChildWindowOpen && + !IsRefreshing && + !IsModifying; + } + + /// + /// Shows an error message for the given result. + /// + /// The result of the modification. + private async Task ShowErrorMessageAsync(HostsFileEntryModifyResult result) + { + var message = result switch + { + HostsFileEntryModifyResult.ReadError => Strings.HostsFileReadErrorMessage, + HostsFileEntryModifyResult.WriteError => Strings.HostsFileWriteErrorMessage, + HostsFileEntryModifyResult.NotFound => Strings.HostsFileEntryNotFoundMessage, + HostsFileEntryModifyResult.BackupError => Strings.HostsFileBackupErrorMessage, + _ => Strings.UnkownError + }; + + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, message, + ChildWindowIcon.Error); + } + + /// + /// Gets the command to restart the application as administrator. + /// + public ICommand RestartAsAdminCommand => new RelayCommand(parameter => { _ = RestartAsAdminAction(); }); + + /// + /// Action to restart the application as administrator. + /// + private async Task RestartAsAdminAction() + { + try + { + (Application.Current.MainWindow as MainWindow)?.RestartApplication(true); + } + catch (Exception ex) + { + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, ex.Message, + ChildWindowIcon.Error); + } + } + + /// + /// Gets the command to open the hosts file with the system default editor. + /// + public ICommand OpenHostsFileCommand => new RelayCommand(parameter => { _ = OpenHostsFileAction(); }); + + /// + /// Opens the hosts file with the system default editor. + /// Shows an error dialog if the process cannot be started. + /// + private async Task OpenHostsFileAction() + { + try + { + ExternalProcessStarter.RunProcess(HostsFileEditor.HostsFilePath); + } + catch (Exception ex) + { + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, ex.Message, + ChildWindowIcon.Error); + } + } + + #endregion + + #region Methods + + /// + /// Refreshes the hosts file entries. + /// + /// Indicates whether this is the initial refresh. + private async Task Refresh(bool init = false) + { + if (IsRefreshing) + return; + + IsRefreshing = true; + + StatusMessage = Strings.RefreshingDots; + IsStatusMessageDisplayed = true; + + // Retry 3 times if the hosts file is locked + for (var i = 1; i < 4; i++) + { + // Wait for 2.5 seconds on refresh + if (init == false || i > 1) + await Task.Delay(GlobalStaticConfiguration.ApplicationUIRefreshInterval); + + try + { + var entries = await HostsFileEditor.GetHostsFileEntriesAsync(); + + Results.Clear(); + + entries.ToList().ForEach(Results.Add); + + StatusMessage = string.Format(Strings.ReloadedAtX, DateTime.Now.ToShortTimeString()); + IsStatusMessageDisplayed = true; + + break; + } + catch (Exception ex) + { + Log.Error(ex); + + StatusMessage = string.Format(Strings.FailedToLoadHostsFileMessage, ex.Message); + + if (i < 3) + StatusMessage += Environment.NewLine + string.Format(Strings.RetryingInXSecondsDots, + GlobalStaticConfiguration.ApplicationUIRefreshInterval / 1000); + + IsStatusMessageDisplayed = true; + + await Task.Delay(GlobalStaticConfiguration.ApplicationUIRefreshInterval); + } + } + + IsRefreshing = false; + } + + /// + /// Called when the view becomes visible. + /// + public void OnViewVisible() + { + } + + /// + /// Called when the view is hidden. + /// + public void OnViewHide() + { + } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/IPAddressAndSubnetmaskViewModel.cs b/Source/NETworkManager/ViewModels/IPAddressAndSubnetmaskViewModel.cs index c4b8f6d268..515ff88a0b 100644 --- a/Source/NETworkManager/ViewModels/IPAddressAndSubnetmaskViewModel.cs +++ b/Source/NETworkManager/ViewModels/IPAddressAndSubnetmaskViewModel.cs @@ -1,47 +1,65 @@ -using NETworkManager.Utilities; using System; using System.Windows.Input; +using NETworkManager.Utilities; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +/// +/// View model for an IP address and a subnet mask. +/// +public class IPAddressAndSubnetmaskViewModel : ViewModelBase { - public class IPAddressAndSubnetmaskViewModel : ViewModelBase + /// + /// Initializes a new instance of the class. + /// + /// The action to execute when OK is clicked. + /// The action to execute when Cancel is clicked. + public IPAddressAndSubnetmaskViewModel(Action okCommand, + Action cancelHandler) { - public ICommand OKCommand { get; } + OKCommand = new RelayCommand(_ => okCommand(this)); + CancelCommand = new RelayCommand(_ => cancelHandler(this)); + } - public ICommand CancelCommand { get; } + /// + /// Gets the command to confirm the operation. + /// + public ICommand OKCommand { get; } - private string _ipAddress; - public string IPAddress - { - get => _ipAddress; - set - { - if (value == _ipAddress) - return; - - _ipAddress = value; - OnPropertyChanged(); - } - } + /// + /// Gets the command to cancel the operation. + /// + public ICommand CancelCommand { get; } - private string _subnetmaskOrCidr; - public string SubnetmaskOrCidr + /// + /// Gets or sets the IP address. + /// + public string IPAddress + { + get; + set { - get => _subnetmaskOrCidr; - set - { - if (value == _subnetmaskOrCidr) - return; - - _subnetmaskOrCidr = value; - OnPropertyChanged(); - } + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - public IPAddressAndSubnetmaskViewModel(Action okCommand, Action cancelHandler) + /// + /// Gets or sets the subnet mask. + /// + public string Subnetmask + { + get; + set { - OKCommand = new RelayCommand(p => okCommand(this)); - CancelCommand = new RelayCommand(p => cancelHandler(this)); - } + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } } } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/IPAddressViewModel.cs b/Source/NETworkManager/ViewModels/IPAddressViewModel.cs index 6b61a59d18..0fced4befa 100644 --- a/Source/NETworkManager/ViewModels/IPAddressViewModel.cs +++ b/Source/NETworkManager/ViewModels/IPAddressViewModel.cs @@ -1,33 +1,48 @@ -using NETworkManager.Utilities; using System; using System.Windows.Input; +using NETworkManager.Utilities; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +/// +/// View model for an IP address. +/// +public abstract class IPAddressViewModel : ViewModelBase { - public class IPAddressViewModel : ViewModelBase + /// + /// Initializes a new instance of the class. + /// + /// The action to execute when OK is clicked. + /// The action to execute when Cancel is clicked. + protected IPAddressViewModel(Action okCommand, Action cancelHandler) { - public ICommand OKCommand { get; } + OKCommand = new RelayCommand(_ => okCommand(this)); + CancelCommand = new RelayCommand(_ => cancelHandler(this)); + } + + /// + /// Gets the command to confirm the operation. + /// + public ICommand OKCommand { get; } - public ICommand CancelCommand { get; } + /// + /// Gets the command to cancel the operation. + /// + public ICommand CancelCommand { get; } - private string _ipAddress; - public string IPAddress + /// + /// Gets or sets the IP address. + /// + public string IPAddress + { + get; + set { - get => _ipAddress; - set - { - if (value == _ipAddress) - return; + if (value == field) + return; - _ipAddress = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - - public IPAddressViewModel(Action okCommand, Action cancelHandler) - { - OKCommand = new RelayCommand(p => okCommand(this)); - CancelCommand = new RelayCommand(p => cancelHandler(this)); - } } } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/IPApiDNSResolverWidgetViewModel.cs b/Source/NETworkManager/ViewModels/IPApiDNSResolverWidgetViewModel.cs new file mode 100644 index 0000000000..e04b17a819 --- /dev/null +++ b/Source/NETworkManager/ViewModels/IPApiDNSResolverWidgetViewModel.cs @@ -0,0 +1,111 @@ +using System.Threading.Tasks; +using System.Windows.Input; +using NETworkManager.Models.IPApi; +using NETworkManager.Settings; +using NETworkManager.Utilities; + +namespace NETworkManager.ViewModels; + +/// +/// View model for the IP API DNS resolver widget. +/// +public class IPApiDNSResolverWidgetViewModel : ViewModelBase +{ + #region Variables + + /// + /// Gets or sets a value indicating whether the check is running. + /// + public bool IsRunning + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets the result of the DNS resolver check. + /// + public DNSResolverResult Result + { + get; + private set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + #endregion + + #region Constructor, load settings + + /// + /// Initializes a new instance of the class. + /// + public IPApiDNSResolverWidgetViewModel() + { + LoadSettings(); + Check(); + } + + /// + /// Loads the settings. + /// + private void LoadSettings() + { + + } + + #endregion + + #region ICommands & Actions + + /// + /// Gets the command to check the DNS resolver. + /// + public ICommand CheckCommand => new RelayCommand(_ => Check(), _ => !IsRunning); + + #endregion + + #region Methods + + /// + /// Checks the DNS resolver. + /// + private void Check() + { + _ = CheckAsync(); + } + + /// + /// Checks the DNS resolver asynchronously. + /// + private async Task CheckAsync() + { + // Check is disabled via settings + if (!SettingsManager.Current.Dashboard_CheckIPApiDNSResolver) + return; + + IsRunning = true; + Result = null; + + // Make the user happy, let him see a reload animation (and he cannot spam the reload command) + await Task.Delay(GlobalStaticConfiguration.ApplicationUIRefreshInterval); + + Result = await DNSResolverService.GetInstance().GetDNSResolverAsync(); + + IsRunning = false; + } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/IPApiIPGeolocationWidgetViewModel.cs b/Source/NETworkManager/ViewModels/IPApiIPGeolocationWidgetViewModel.cs new file mode 100644 index 0000000000..201395dded --- /dev/null +++ b/Source/NETworkManager/ViewModels/IPApiIPGeolocationWidgetViewModel.cs @@ -0,0 +1,121 @@ +using System.Threading.Tasks; +using System.Windows.Input; +using log4net; +using NETworkManager.Models.IPApi; +using NETworkManager.Settings; +using NETworkManager.Utilities; + +namespace NETworkManager.ViewModels; + +/// +/// View model for the IP API IP geolocation widget. +/// +public class IPApiIPGeolocationWidgetViewModel : ViewModelBase +{ + #region Variables + + private static readonly ILog Log = LogManager.GetLogger(typeof(IPApiIPGeolocationWidgetViewModel)); + + /// + /// Gets or sets a value indicating whether the check is running. + /// + public bool IsRunning + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets the result of the IP geolocation check. + /// + public IPGeolocationResult Result + { + get; + private set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + #endregion + + #region Constructor, load settings + + /// + /// Initializes a new instance of the class. + /// + public IPApiIPGeolocationWidgetViewModel() + { + LoadSettings(); + Check(); + } + + /// + /// Loads the settings. + /// + private void LoadSettings() + { + } + + #endregion + + #region ICommands & Actions + + /// + /// Gets the command to check the IP geolocation. + /// + public ICommand CheckCommand => new RelayCommand(_ => Check(), _ => !IsRunning); + + #endregion + + #region Methods + + /// + /// Checks the IP geolocation. + /// + private void Check() + { + _ = CheckAsync(); + } + + /// + /// Checks the IP geolocation asynchronously. + /// + private async Task CheckAsync() + { + // Check is disabled via settings + if (!SettingsManager.Current.Dashboard_CheckIPApiIPGeolocation) + return; + + IsRunning = true; + Result = null; + + // Make the user happy, let him see a reload animation (and he cannot spam the reload command) + await Task.Delay(GlobalStaticConfiguration.ApplicationUIRefreshInterval); + + Result = await IPGeolocationService.GetInstance().GetIPGeolocationAsync(); + + // Log error + if (Result.HasError) + Log.Error($"ip-api.com error: {Result.ErrorMessage}, error code: {Result.ErrorCode}"); + + // Log rate limit + if (Result.RateLimitIsReached) + Log.Warn($"ip-api.com rate limit reached. Try again in {Result.RateLimitRemainingTime} seconds."); + + IsRunning = false; + } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/IPGeolocationHostViewModel.cs b/Source/NETworkManager/ViewModels/IPGeolocationHostViewModel.cs new file mode 100644 index 0000000000..dc6cac0a84 --- /dev/null +++ b/Source/NETworkManager/ViewModels/IPGeolocationHostViewModel.cs @@ -0,0 +1,165 @@ +using Dragablz; +using NETworkManager.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Models; +using NETworkManager.Profiles; +using NETworkManager.Utilities; +using NETworkManager.Views; +using System; +using System.Collections.ObjectModel; +using System.Windows.Input; + +namespace NETworkManager.ViewModels; + +/// +/// View model for the IP geolocation host view. +/// +public class IPGeolocationHostViewModel : ProfileHostViewModelBase +{ + #region Variables + + /// + /// Gets the client for inter-tab operations. + /// + public IInterTabClient InterTabClient { get; } + + /// + /// Gets or sets the inter-tab partition key. + /// + public string InterTabPartition + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets the collection of tab items. + /// + public ObservableCollection TabItems { get; } + + /// + /// Gets or sets the index of the selected tab. + /// + public int SelectedTabIndex + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + #endregion + + #region Constructor + + /// + /// Initializes a new instance of the class. + /// + public IPGeolocationHostViewModel() + { + InterTabClient = new DragablzInterTabClient(ApplicationName.IPGeolocation); + InterTabPartition = nameof(ApplicationName.IPGeolocation); + + var tabId = Guid.NewGuid(); + + TabItems = + [ + new DragablzTabItem(Strings.NewTab, new IPGeolocationView(tabId), tabId) + ]; + + InitializeProfileHost(); + } + + #endregion + + #region Profile host + + protected override ApplicationName ApplicationName => ApplicationName.IPGeolocation; + + protected override bool IsProfileEnabled(ProfileInfo profile) => profile.IPGeolocation_Enabled; + + protected override string GetSearchableField(ProfileInfo profile) => profile.IPGeolocation_Host; + + #endregion + + #region ICommand & Actions + + /// + /// Gets the command to add a new tab. + /// + public ICommand AddTabCommand => new RelayCommand(_ => AddTabAction()); + + /// + /// Action to add a new tab. + /// + private void AddTabAction() + { + AddTab(); + } + + /// + /// Gets the command to query the selected profile. + /// + public ICommand QueryProfileCommand => new RelayCommand(_ => QueryProfileAction(), QueryProfile_CanExecute); + + /// + /// Checks if the query profile command can be executed. + /// + private bool QueryProfile_CanExecute(object obj) + { + return !IsSearching && SelectedProfile != null; + } + + /// + /// Action to query the selected profile. + /// + private void QueryProfileAction() + { + AddTab(SelectedProfile.IPGeolocation_Host); + } + + /// + /// Gets the callback for closing a tab item. + /// + public ItemActionCallback CloseItemCommand => CloseItemAction; + + /// + /// Action to close a tab item. + /// + private static void CloseItemAction(ItemActionCallbackArgs args) + { + ((args.DragablzItem.Content as DragablzTabItem)?.View as IDragablzTabItem)?.CloseTab(); + } + + #endregion + + #region Methods + + /// + /// Adds a new tab for the specified domain. + /// + /// The domain to query. + private void AddTab(string domain = null) + { + var tabId = Guid.NewGuid(); + + TabItems.Add(new DragablzTabItem(domain ?? Strings.NewTab, + new IPGeolocationView(tabId, domain), tabId)); + + SelectedTabIndex = TabItems.Count - 1; + } + + #endregion +} diff --git a/Source/NETworkManager/ViewModels/IPGeolocationViewModel.cs b/Source/NETworkManager/ViewModels/IPGeolocationViewModel.cs new file mode 100644 index 0000000000..40b009ee88 --- /dev/null +++ b/Source/NETworkManager/ViewModels/IPGeolocationViewModel.cs @@ -0,0 +1,357 @@ +using log4net; +using MahApps.Metro.Controls; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Models.Export; +using NETworkManager.Models.IPApi; +using NETworkManager.Settings; +using NETworkManager.Utilities; +using NETworkManager.Views; +using System; +using System.ComponentModel; +using System.Linq; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Data; +using System.Windows.Input; + +namespace NETworkManager.ViewModels; + +/// +/// View model for the IP geolocation view. +/// +public class IPGeolocationViewModel : ViewModelBase +{ + #region Variables + + private static readonly ILog Log = LogManager.GetLogger(typeof(IPGeolocationViewModel)); + + private readonly Guid _tabId; + private bool _firstLoad = true; + private bool _closed; + + /// + /// Gets or sets the host to query. + /// + public string Host + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets the collection view of host history. + /// + public ICollectionView HostHistoryView { get; } + + /// + /// Gets or sets a value indicating whether the query is running. + /// + public bool IsRunning + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets or sets a value indicating whether the result is visible. + /// + public bool IsResultVisible + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets the IP geolocation result. + /// + public IPGeolocationInfo Result + { + get; + private set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets or sets a value indicating whether the status message is displayed. + /// + public bool IsStatusMessageDisplayed + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets the status message. + /// + public string StatusMessage + { + get; + private set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + #endregion + + #region Contructor, load settings + + /// + /// Initializes a new instance of the class. + /// + /// The ID of the tab. + /// The host to query. + public IPGeolocationViewModel(Guid tabId, string host) + { + ConfigurationManager.Current.IPGeolocationTabCount++; + + _tabId = tabId; + Host = host; + + // Set collection view + HostHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.IPGeolocation_HostHistory); + + LoadSettings(); + } + + /// + /// Called when the view is loaded. + /// + public void OnLoaded() + { + if (!_firstLoad) + return; + + if (!string.IsNullOrEmpty(Host)) + _ = Query(); + + _firstLoad = false; + } + + /// + /// Loads the settings. + /// + private void LoadSettings() + { + } + + #endregion + + #region ICommands & Actions + + /// + /// Gets the command to start the query. + /// + public ICommand QueryCommand => new RelayCommand(_ => QueryAction(), Query_CanExecute); + + /// + /// Checks if the query command can be executed. + /// + /// The command parameter. + /// true if the command can be executed; otherwise, false. + private bool Query_CanExecute(object parameter) + { + return Application.Current.MainWindow != null && + !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && + !ConfigurationManager.Current.IsChildWindowOpen; + } + + /// + /// Action to start the query. + /// + private void QueryAction() + { + _ = Query(); + } + + /// + /// Gets the command to export the result. + /// + public ICommand ExportCommand => new RelayCommand(_ => ExportAction()); + + /// + /// Action to export the result. + /// + private void ExportAction() + { + _ = Export(); + } + + #endregion + + #region Methods + + /// + /// Performs the IP geolocation query. + /// + private async Task Query() + { + IsStatusMessageDisplayed = false; + IsResultVisible = false; + IsRunning = true; + + Result = null; + + DragablzTabItem.SetTabHeader(_tabId, Host); + + try + { + var result = await IPGeolocationService.GetInstance().GetIPGeolocationAsync(Host); + + if (result.HasError) + { + Log.Error($"ip-api.com error: {result.ErrorMessage}, error code: {result.ErrorCode}"); + + StatusMessage = $"ip-api.com: {result.ErrorMessage}"; + IsStatusMessageDisplayed = true; + + return; + } + + if (result.RateLimitIsReached) + { + Log.Warn($"ip-api.com rate limit reached. Try again in {result.RateLimitRemainingTime} seconds."); + + StatusMessage = + $"ip-api.com {string.Format(Strings.RateLimitReachedTryAgainInXSeconds, result.RateLimitRemainingTime)}"; + IsStatusMessageDisplayed = true; + + return; + } + + Result = result.Info; + IsResultVisible = true; + + AddHostToHistory(Host); + } + catch (Exception ex) + { + StatusMessage = ex.Message; + IsStatusMessageDisplayed = true; + } + + IsRunning = false; + } + + /// + /// Exports the result. + /// + private Task Export() + { + var window = Application.Current.Windows.OfType().FirstOrDefault(x => x.IsActive); + + var childWindow = new ExportChildWindow(); + + var childWindowViewModel = new ExportViewModel(async instance => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + try + { + ExportManager.Export(instance.FilePath, instance.FileType, + [Result]); + } + catch (Exception ex) + { + Log.Error("Error while exporting data as " + instance.FileType, ex); + + await DialogHelper.ShowMessageAsync(window, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); + } + + SettingsManager.Current.IPGeolocation_ExportFileType = instance.FileType; + SettingsManager.Current.IPGeolocation_ExportFilePath = instance.FilePath; + }, _ => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, [ + ExportFileType.Csv, ExportFileType.Xml, ExportFileType.Json + ], false, SettingsManager.Current.IPGeolocation_ExportFileType, + SettingsManager.Current.IPGeolocation_ExportFilePath); + + childWindow.Title = Strings.Export; + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + return window.ShowChildWindowAsync(childWindow); + } + + /// + /// Called when the view is closed. + /// + public void OnClose() + { + // Prevent multiple calls + if (_closed) + return; + + _closed = true; + + ConfigurationManager.Current.IPGeolocationTabCount--; + } + + /// + /// Adds the host to the history. + /// + /// The host to add. + private void AddHostToHistory(string host) + { + // Create the new list + var list = ListHelper.Modify(SettingsManager.Current.IPGeolocation_HostHistory.ToList(), host, + SettingsManager.Current.General_HistoryListEntries); + + // Clear the old items + SettingsManager.Current.IPGeolocation_HostHistory.Clear(); + OnPropertyChanged(nameof(Host)); // Raise property changed again, after the collection has been cleared + + // Fill with the new items + list.ForEach(x => SettingsManager.Current.Whois_DomainHistory.Add(x)); + } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/IPScannerHostViewModel.cs b/Source/NETworkManager/ViewModels/IPScannerHostViewModel.cs index c3e946a280..9ca9e59493 100644 --- a/Source/NETworkManager/ViewModels/IPScannerHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/IPScannerHostViewModel.cs @@ -1,380 +1,174 @@ -using System.Collections.ObjectModel; -using NETworkManager.Controls; using Dragablz; -using System.Windows.Input; -using NETworkManager.Views; +using NETworkManager.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Models; +using NETworkManager.Profiles; using NETworkManager.Utilities; -using NETworkManager.Settings; -using System.ComponentModel; +using NETworkManager.Views; using System; -using System.Windows.Data; -using MahApps.Metro.Controls.Dialogs; -using System.Windows; -using System.Linq; -using NETworkManager.Profiles; -using System.Windows.Threading; -using NETworkManager.Models; -using System.Collections.Generic; - -namespace NETworkManager.ViewModels -{ - public class IPScannerHostViewModel : ViewModelBase, IProfileManager - { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - private readonly DispatcherTimer _searchDispatcherTimer = new DispatcherTimer(); - - public IInterTabClient InterTabClient { get; } - public ObservableCollection TabItems { get; } - - private readonly bool _isLoading = true; - private bool _isViewActive = true; - - private int _tabId; - - private int _selectedTabIndex; - public int SelectedTabIndex - { - get => _selectedTabIndex; - set - { - if (value == _selectedTabIndex) - return; - - _selectedTabIndex = value; - OnPropertyChanged(); - } - } - - #region Profiles - public ICollectionView Profiles { get; } - - private ProfileInfo _selectedProfile = new ProfileInfo(); - public ProfileInfo SelectedProfile - { - get => _selectedProfile; - set - { - if (value == _selectedProfile) - return; - - _selectedProfile = value; - OnPropertyChanged(); - } - } - - private string _search; - public string Search - { - get => _search; - set - { - if (value == _search) - return; - - _search = value; - - StartDelayedSearch(); - - OnPropertyChanged(); - } - } - - private bool _isSearching; - public bool IsSearching - { - get => _isSearching; - set - { - if (value == _isSearching) - return; - - _isSearching = value; - OnPropertyChanged(); - } - } - - private bool _canProfileWidthChange = true; - private double _tempProfileWidth; - - private bool _expandProfileView; - public bool ExpandProfileView - { - get => _expandProfileView; - set - { - if (value == _expandProfileView) - return; - - if (!_isLoading) - SettingsManager.Current.IPScanner_ExpandProfileView = value; - - _expandProfileView = value; - - if (_canProfileWidthChange) - ResizeProfile(false); - - OnPropertyChanged(); - } - } - - private GridLength _profileWidth; - public GridLength ProfileWidth - { - get => _profileWidth; - set - { - if (value == _profileWidth) - return; - - if (!_isLoading && Math.Abs(value.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > GlobalStaticConfiguration.FloatPointFix) // Do not save the size when collapsed - SettingsManager.Current.IPScanner_ProfileWidth = value.Value; - - _profileWidth = value; - - if (_canProfileWidthChange) - ResizeProfile(true); - - OnPropertyChanged(); - } - } - #endregion - #endregion - - #region Constructor, load settings - public IPScannerHostViewModel(IDialogCoordinator instance) - { - _dialogCoordinator = instance; - - InterTabClient = new DragablzInterTabClient(ApplicationName.IPScanner); - - TabItems = new ObservableCollection - { - new DragablzTabItem(Localization.Resources.Strings.NewTab, new IPScannerView(_tabId), _tabId) - }; - - Profiles = new CollectionViewSource { Source = ProfileManager.Groups.SelectMany(x => x.Profiles) }.View; - Profiles.GroupDescriptions.Add(new PropertyGroupDescription(nameof(ProfileInfo.Group))); - Profiles.SortDescriptions.Add(new SortDescription(nameof(ProfileInfo.Group), ListSortDirection.Ascending)); - Profiles.SortDescriptions.Add(new SortDescription(nameof(ProfileInfo.Name), ListSortDirection.Ascending)); - Profiles.Filter = o => - { - if (!(o is ProfileInfo info)) - return false; - - if (string.IsNullOrEmpty(Search)) - return info.IPScanner_Enabled; - - var search = Search.Trim(); - - // Search by: Tag=xxx (exact match, ignore case) - /* - if (search.StartsWith(ProfileManager.TagIdentifier, StringComparison.OrdinalIgnoreCase)) - return !string.IsNullOrEmpty(info.Tags) && info.IPScanner_Enabled && info.Tags.Replace(" ", "").Split(';').Any(str => search.Substring(ProfileManager.TagIdentifier.Length, search.Length - ProfileManager.TagIdentifier.Length).Equals(str, StringComparison.OrdinalIgnoreCase)); - */ - - // Search by: Name, IPScanner_IPRange - return info.IPScanner_Enabled && (info.Name.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1 || info.IPScanner_HostOrIPRange.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1); - }; - - // This will select the first entry as selected item... - SelectedProfile = Profiles.SourceCollection.Cast().Where(x => x.IPScanner_Enabled).OrderBy(x => x.Group).ThenBy(x => x.Name).FirstOrDefault(); - - ProfileManager.OnProfilesUpdated += ProfileManager_OnProfilesUpdated; - - _searchDispatcherTimer.Interval = GlobalStaticConfiguration.SearchDispatcherTimerTimeSpan; - _searchDispatcherTimer.Tick += SearchDispatcherTimer_Tick; - - LoadSettings(); - - _isLoading = false; - } - - private void LoadSettings() - { - ExpandProfileView = SettingsManager.Current.IPScanner_ExpandProfileView; - - ProfileWidth = ExpandProfileView ? new GridLength(SettingsManager.Current.IPScanner_ProfileWidth) : new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); - - _tempProfileWidth = SettingsManager.Current.IPScanner_ProfileWidth; - } - #endregion - - #region ICommand & Actions - public ICommand AddTabCommand => new RelayCommand(p => AddTabAction()); +using System.Collections.ObjectModel; +using System.Windows.Input; - private void AddTabAction() - { - AddTab(); - } +namespace NETworkManager.ViewModels; - public ICommand ScanProfileCommand => new RelayCommand(p => ScanProfileAction(), ScanProfile_CanExecute); +/// +/// View model for the IP scanner host view. +/// +public class IPScannerHostViewModel : ProfileHostViewModelBase +{ + #region Variables - private bool ScanProfile_CanExecute(object obj) - { - return !IsSearching && SelectedProfile != null; - } + /// + /// Gets the client for inter-tab operations. + /// + public IInterTabClient InterTabClient { get; } - private void ScanProfileAction() + /// + /// Gets or sets the inter-tab partition key. + /// + public string InterTabPartition + { + get; + set { - AddTab(SelectedProfile); - } - - public ICommand AddProfileCommand => new RelayCommand(p => AddProfileAction()); + if (value == field) + return; - private void AddProfileAction() - { - ProfileDialogManager.ShowAddProfileDialog(this, _dialogCoordinator); + field = value; + OnPropertyChanged(); } + } - public ICommand EditProfileCommand => new RelayCommand(p => EditProfileAction()); + /// + /// Gets the collection of tab items. + /// + public ObservableCollection TabItems { get; } - private void EditProfileAction() + /// + /// Gets or sets the index of the selected tab. + /// + public int SelectedTabIndex + { + get; + set { - ProfileDialogManager.ShowEditProfileDialog(this, _dialogCoordinator, SelectedProfile); - } - - public ICommand CopyAsProfileCommand => new RelayCommand(p => CopyAsProfileAction()); + if (value == field) + return; - private void CopyAsProfileAction() - { - ProfileDialogManager.ShowCopyAsProfileDialog(this, _dialogCoordinator, SelectedProfile); + field = value; + OnPropertyChanged(); } + } - public ICommand DeleteProfileCommand => new RelayCommand(p => DeleteProfileAction()); + #endregion - private void DeleteProfileAction() - { - ProfileDialogManager.ShowDeleteProfileDialog(this, _dialogCoordinator, new List { SelectedProfile }); - } + #region Constructor - public ICommand EditGroupCommand => new RelayCommand(EditGroupAction); + /// + /// Initializes a new instance of the class. + /// + public IPScannerHostViewModel() + { + InterTabClient = new DragablzInterTabClient(ApplicationName.IPScanner); + InterTabPartition = nameof(ApplicationName.IPScanner); - private void EditGroupAction(object group) - { - ProfileDialogManager.ShowEditGroupDialog(this, _dialogCoordinator, ProfileManager.GetGroup(group.ToString())); - } + var tabId = Guid.NewGuid(); - public ICommand ClearSearchCommand => new RelayCommand(p => ClearSearchAction()); + TabItems = + [ + new DragablzTabItem(Strings.NewTab, new IPScannerView(tabId), tabId) + ]; - private void ClearSearchAction() - { - Search = string.Empty; - } + InitializeProfileHost(); + } - public ItemActionCallback CloseItemCommand => CloseItemAction; + #endregion - private static void CloseItemAction(ItemActionCallbackArgs args) - { - ((args.DragablzItem.Content as DragablzTabItem)?.View as IPScannerView)?.CloseTab(); - } - #endregion + #region Profile host - #region Methods - private void StartDelayedSearch() - { - if (!IsSearching) - { - IsSearching = true; - - _searchDispatcherTimer.Start(); - } - else - { - _searchDispatcherTimer.Stop(); - _searchDispatcherTimer.Start(); - } - } + protected override ApplicationName ApplicationName => ApplicationName.IPScanner; - private void StopDelayedSearch() - { - _searchDispatcherTimer.Stop(); + protected override bool IsProfileEnabled(ProfileInfo profile) => profile.IPScanner_Enabled; - RefreshProfiles(); + protected override string GetSearchableField(ProfileInfo profile) => profile.IPScanner_HostOrIPRange; - IsSearching = false; - } - - private void ResizeProfile(bool dueToChangedSize) - { - _canProfileWidthChange = false; - - if (dueToChangedSize) - { - ExpandProfileView = Math.Abs(ProfileWidth.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > GlobalStaticConfiguration.FloatPointFix; - } - else - { - if (ExpandProfileView) - { - ProfileWidth = Math.Abs(_tempProfileWidth - GlobalStaticConfiguration.Profile_WidthCollapsed) < GlobalStaticConfiguration.FloatPointFix ? new GridLength(GlobalStaticConfiguration.Profile_DefaultWidthExpanded) : new GridLength(_tempProfileWidth); - } - else - { - _tempProfileWidth = ProfileWidth.Value; - ProfileWidth = new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); - } - } - - _canProfileWidthChange = true; - } + #endregion - public void AddTab(string hostOrIPRange = null) - { - _tabId++; + #region ICommand & Actions - TabItems.Add(new DragablzTabItem(Localization.Resources.Strings.NewTab, new IPScannerView(_tabId, hostOrIPRange), _tabId)); + /// + /// Gets the command to add a new tab. + /// + public ICommand AddTabCommand => new RelayCommand(_ => AddTabAction()); - SelectedTabIndex = TabItems.Count - 1; - } + /// + /// Action to add a new tab. + /// + private void AddTabAction() + { + AddTab(); + } - public void AddTab(ProfileInfo profile) - { - AddTab(profile.IPScanner_HostOrIPRange); - } + /// + /// Gets the command to scan the selected profile. + /// + public ICommand ScanProfileCommand => new RelayCommand(_ => ScanProfileAction(), ScanProfile_CanExecute); - public void OnViewVisible() - { - _isViewActive = true; + /// + /// Checks if the scan profile command can be executed. + /// + private bool ScanProfile_CanExecute(object obj) + { + return !IsSearching && SelectedProfile != null; + } - RefreshProfiles(); - } + /// + /// Action to scan the selected profile. + /// + private void ScanProfileAction() + { + AddTab(SelectedProfile); + } - public void OnViewHide() - { - _isViewActive = false; - } - - public void RefreshProfiles() - { - if (!_isViewActive) - return; + /// + /// Gets the callback for closing a tab item. + /// + public ItemActionCallback CloseItemCommand => CloseItemAction; - Profiles.Refresh(); - } - - public void OnProfileDialogOpen() - { + /// + /// Action to close a tab item. + /// + private static void CloseItemAction(ItemActionCallbackArgs args) + { + ((args.DragablzItem.Content as DragablzTabItem)?.View as IDragablzTabItem)?.CloseTab(); + } - } + #endregion - public void OnProfileDialogClose() - { + #region Methods - } + /// + /// Adds a new tab for the specified host or IP range. + /// + /// The host or IP range to scan. + public void AddTab(string hostOrIPRange = null) + { + var tabId = Guid.NewGuid(); - #endregion + TabItems.Add(new DragablzTabItem(Strings.NewTab, new IPScannerView(tabId, hostOrIPRange), + tabId)); - #region Event - private void ProfileManager_OnProfilesUpdated(object sender, EventArgs e) - { - RefreshProfiles(); - } + SelectedTabIndex = TabItems.Count - 1; + } - private void SearchDispatcherTimer_Tick(object sender, EventArgs e) - { - StopDelayedSearch(); - } - #endregion + /// + /// Adds a new tab for the specified profile. + /// + /// The profile to scan. + private void AddTab(ProfileInfo profile) + { + AddTab(profile.IPScanner_HostOrIPRange); } -} \ No newline at end of file + + #endregion +} diff --git a/Source/NETworkManager/ViewModels/IPScannerSettingsViewModel.cs b/Source/NETworkManager/ViewModels/IPScannerSettingsViewModel.cs index 2810cabe76..b41389cd73 100644 --- a/Source/NETworkManager/ViewModels/IPScannerSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/IPScannerSettingsViewModel.cs @@ -1,448 +1,463 @@ -using MahApps.Metro.Controls.Dialogs; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Localization.Resources; using NETworkManager.Settings; using NETworkManager.Utilities; using NETworkManager.Views; using System.ComponentModel; +using System.Threading.Tasks; +using System.Windows; using System.Windows.Data; using System.Windows.Input; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +/// +/// View model for the IP scanner settings. +/// +public class IPScannerSettingsViewModel : ViewModelBase { - public class IPScannerSettingsViewModel : ViewModelBase - { - #region Variables - private readonly bool _isLoading; + #region Variables - private readonly IDialogCoordinator _dialogCoordinator; + /// + /// Indicates whether the view model is loading. + /// + private readonly bool _isLoading; - private bool _showScanResultForAllIPAddresses; - public bool ShowScanResultForAllIPAddresses + /// + /// Gets or sets a value indicating whether to show all results. + /// + public bool ShowAllResults + { + get; + set { - get => _showScanResultForAllIPAddresses; - set - { - if (value == _showScanResultForAllIPAddresses) - return; - - if (!_isLoading) - SettingsManager.Current.IPScanner_ShowScanResultForAllIPAddresses = value; - - _showScanResultForAllIPAddresses = value; - OnPropertyChanged(); - } - } + if (value == field) + return; - private int _threads; - public int Threads - { - get => _threads; - set - { - if (value == _threads) - return; - - if (!_isLoading) - SettingsManager.Current.IPScanner_Threads = value; - - _threads = value; - OnPropertyChanged(); - } - } + if (!_isLoading) + SettingsManager.Current.IPScanner_ShowAllResults = value; - private int _icmpTimeout; - public int ICMPTimeout - { - get => _icmpTimeout; - set - { - if (value == _icmpTimeout) - return; - - if (!_isLoading) - SettingsManager.Current.IPScanner_ICMPTimeout = value; - - _icmpTimeout = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private int _icmpBuffer; - public int ICMPBuffer + /// + /// Gets or sets the number of ICMP attempts. + /// + public int ICMPAttempts + { + get; + set { - get => _icmpBuffer; - set - { - if (value == _icmpBuffer) - return; - - if (!_isLoading) - SettingsManager.Current.IPScanner_ICMPBuffer = value; - - _icmpBuffer = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.IPScanner_ICMPAttempts = value; + + field = value; + OnPropertyChanged(); } + } - private int _icmpAttempts; - public int ICMPAttempts + /// + /// Gets or sets the ICMP timeout in milliseconds. + /// + public int ICMPTimeout + { + get; + set { - get => _icmpAttempts; - set - { - if (value == _icmpAttempts) - return; - - if (!_isLoading) - SettingsManager.Current.IPScanner_ICMPAttempts = value; - - _icmpAttempts = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.IPScanner_ICMPTimeout = value; + + field = value; + OnPropertyChanged(); } + } - private bool _resolveHostname; - public bool ResolveHostname + /// + /// Gets or sets the ICMP buffer size. + /// + public int ICMPBuffer + { + get; + set { - get => _resolveHostname; - set - { - if (value == _resolveHostname) - return; - - if (!_isLoading) - SettingsManager.Current.IPScanner_ResolveHostname = value; - - _resolveHostname = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.IPScanner_ICMPBuffer = value; + + field = value; + OnPropertyChanged(); } + } - private bool _useCustomDNSServer; - public bool UseCustomDNSServer + /// + /// Gets or sets a value indicating whether to resolve the hostname. + /// + public bool ResolveHostname + { + get; + set { - get => _useCustomDNSServer; - set - { - if (value == _useCustomDNSServer) - return; - - if (!_isLoading) - SettingsManager.Current.IPScanner_UseCustomDNSServer = value; - - _useCustomDNSServer = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.IPScanner_ResolveHostname = value; + + field = value; + OnPropertyChanged(); } + } - private string _customDNSServer; - public string CustomDNSServer + /// + /// Gets or sets a value indicating whether port scanning is enabled. + /// + public bool PortScanEnabled + { + get; + set { - get => _customDNSServer; - set - { - if (value == _customDNSServer) - return; - - if (!_isLoading) - SettingsManager.Current.IPScanner_CustomDNSServer = value; - - _customDNSServer = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.IPScanner_PortScanEnabled = value; + + field = value; + OnPropertyChanged(); } + } - private int _dnsPort; - public int DNSPort + /// + /// Gets or sets the ports to scan. + /// + public string PortScanPorts + { + get; + set { - get => _dnsPort; - set - { - if (value == _dnsPort) - return; - - if (!_isLoading) - SettingsManager.Current.IPScanner_CustomDNSPort = value; - - _dnsPort = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.IPScanner_PortScanPorts = value; + + field = value; + OnPropertyChanged(); } + } - private bool _dnsRecursion; - public bool DNSRecursion + /// + /// Gets or sets the port scan timeout in milliseconds. + /// + public int PortScanTimeout + { + get; + set { - get => _dnsRecursion; - set - { - if (value == _dnsRecursion) - return; - - if (!_isLoading) - SettingsManager.Current.IPScanner_DNSRecursion = value; - - _dnsRecursion = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.IPScanner_PortScanTimeout = value; + + field = value; + OnPropertyChanged(); } + } - private bool _dnsUseCache; - public bool DNSUseCache + /// + /// Gets or sets a value indicating whether NetBIOS is enabled. + /// + public bool NetBIOSEnabled + { + get; + set { - get => _dnsUseCache; - set - { - if (value == _dnsUseCache) - return; - - if (!_isLoading) - SettingsManager.Current.IPScanner_DNSUseCache = value; - - _dnsUseCache = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.IPScanner_NetBIOSEnabled = value; + + field = value; + OnPropertyChanged(); } - - private bool _dnsUseTCPOnly; - public bool DNSUseTCPOnly + } + + /// + /// Gets or sets the NetBIOS timeout in milliseconds. + /// + public int NetBIOSTimeout + { + get; + set { - get => _dnsUseTCPOnly; - set - { - if (value == _dnsUseTCPOnly) - return; - - if (!_isLoading) - SettingsManager.Current.IPScanner_DNSUseTCPOnly = value; - - _dnsUseTCPOnly = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.IPScanner_NetBIOSTimeout = value; + + field = value; + OnPropertyChanged(); } + } - private int _dnsRetries; - public int DNSRetries + /// + /// Gets or sets a value indicating whether to resolve the MAC address. + /// + public bool ResolveMACAddress + { + get; + set { - get => _dnsRetries; - set - { - if (value == _dnsRetries) - return; - - if (!_isLoading) - SettingsManager.Current.IPScanner_DNSRetries = value; - - _dnsRetries = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.IPScanner_ResolveMACAddress = value; + + field = value; + OnPropertyChanged(); } + } + + /// + /// Gets the collection view of custom commands. + /// + public ICollectionView CustomCommands { get; } - private int _dnsTimeout; - public int DNSTimeout + /// + /// Gets or sets the selected custom command. + /// + public CustomCommandInfo SelectedCustomCommand + { + get; + set { - get => _dnsTimeout; - set - { - if (value == _dnsTimeout) - return; - - if (!_isLoading) - SettingsManager.Current.IPScanner_DNSTimeout = value; - - _dnsTimeout = value; - OnPropertyChanged(); - } + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } = new(); - private bool _dnsShowErrorMessage; - public bool DNSShowErrorMessage + /// + /// Gets or sets the maximum number of host threads. + /// + public int MaxHostThreads + { + get; + set { - get => _dnsShowErrorMessage; - set - { - if (value == _dnsShowErrorMessage) - return; - - if (!_isLoading) - SettingsManager.Current.IPScanner_DNSShowErrorMessage = value; - - _dnsShowErrorMessage = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.IPScanner_MaxHostThreads = value; + + field = value; + OnPropertyChanged(); } + } - private bool _resolveMACAddress; - public bool ResolveMACAddress + /// + /// Gets or sets the maximum number of port threads. + /// + public int MaxPortThreads + { + get; + set { - get => _resolveMACAddress; - set - { - if (value == _resolveMACAddress) - return; - - if (!_isLoading) - SettingsManager.Current.IPScanner_ResolveMACAddress = value; - - _resolveMACAddress = value; - OnPropertyChanged(); - } - } + if (value == field) + return; - public ICollectionView CustomCommands { get; } + if (!_isLoading) + SettingsManager.Current.IPScanner_MaxPortThreads = value; - private CustomCommandInfo _selectedCustomCommand = new CustomCommandInfo(); - public CustomCommandInfo SelectedCustomCommand - { - get => _selectedCustomCommand; - set - { - if (value == _selectedCustomCommand) - return; - - _selectedCustomCommand = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion + } - #region Constructor, load settings - public IPScannerSettingsViewModel(IDialogCoordinator instance) - { - _isLoading = true; + #endregion - _dialogCoordinator = instance; + #region Constructor, load settings - CustomCommands = CollectionViewSource.GetDefaultView(SettingsManager.Current.IPScanner_CustomCommands); - CustomCommands.SortDescriptions.Add(new SortDescription(nameof(CustomCommandInfo.Name), ListSortDirection.Ascending)); + /// + /// Initializes a new instance of the class. + /// + public IPScannerSettingsViewModel() + { + _isLoading = true; - LoadSettings(); + CustomCommands = CollectionViewSource.GetDefaultView(SettingsManager.Current.IPScanner_CustomCommands); + CustomCommands.SortDescriptions.Add(new SortDescription(nameof(CustomCommandInfo.Name), + ListSortDirection.Ascending)); - _isLoading = false; - } + LoadSettings(); - private void LoadSettings() - { - ShowScanResultForAllIPAddresses = SettingsManager.Current.IPScanner_ShowScanResultForAllIPAddresses; - Threads = SettingsManager.Current.IPScanner_Threads; - ICMPTimeout = SettingsManager.Current.IPScanner_ICMPTimeout; - ICMPBuffer = SettingsManager.Current.IPScanner_ICMPBuffer; - ICMPAttempts = SettingsManager.Current.IPScanner_ICMPAttempts; - ResolveHostname = SettingsManager.Current.IPScanner_ResolveHostname; - UseCustomDNSServer = SettingsManager.Current.IPScanner_UseCustomDNSServer; - - if (SettingsManager.Current.IPScanner_CustomDNSServer != null) - CustomDNSServer = string.Join("; ", SettingsManager.Current.IPScanner_CustomDNSServer); - - DNSPort = SettingsManager.Current.IPScanner_CustomDNSPort; - DNSRecursion = SettingsManager.Current.IPScanner_DNSRecursion; - DNSUseCache = SettingsManager.Current.IPScanner_DNSUseCache; - DNSUseTCPOnly = SettingsManager.Current.IPScanner_DNSUseTCPOnly; - DNSRetries = SettingsManager.Current.IPScanner_DNSRetries; - DNSTimeout = SettingsManager.Current.IPScanner_DNSTimeout; - DNSShowErrorMessage = SettingsManager.Current.IPScanner_DNSShowErrorMessage; - ResolveMACAddress = SettingsManager.Current.IPScanner_ResolveMACAddress; - } - #endregion + _isLoading = false; + } - #region ICommand & Actions - public ICommand AddCustomCommandCommand => new RelayCommand(p => AddCustomCommandAction()); + /// + /// Loads the settings. + /// + private void LoadSettings() + { + ShowAllResults = SettingsManager.Current.IPScanner_ShowAllResults; + ICMPAttempts = SettingsManager.Current.IPScanner_ICMPAttempts; + ICMPTimeout = SettingsManager.Current.IPScanner_ICMPTimeout; + ICMPBuffer = SettingsManager.Current.IPScanner_ICMPBuffer; + ResolveHostname = SettingsManager.Current.IPScanner_ResolveHostname; + PortScanEnabled = SettingsManager.Current.IPScanner_PortScanEnabled; + PortScanPorts = SettingsManager.Current.IPScanner_PortScanPorts; + PortScanTimeout = SettingsManager.Current.IPScanner_PortScanTimeout; + NetBIOSEnabled = SettingsManager.Current.IPScanner_NetBIOSEnabled; + NetBIOSTimeout = SettingsManager.Current.IPScanner_NetBIOSTimeout; + ResolveMACAddress = SettingsManager.Current.IPScanner_ResolveMACAddress; + MaxHostThreads = SettingsManager.Current.IPScanner_MaxHostThreads; + MaxPortThreads = SettingsManager.Current.IPScanner_MaxPortThreads; + } - private void AddCustomCommandAction() - { - AddCustomCommand(); - } + #endregion - public ICommand EditCustomCommandCommand => new RelayCommand(p => EditCustomCommandAction()); + #region ICommand & Actions - private void EditCustomCommandAction() - { - EditCustomCommand(); - } + /// + /// Gets the command to add a custom command. + /// + public ICommand AddCustomCommandCommand => new RelayCommand(_ => AddCustomCommandAction()); - public ICommand DeleteCustomCommandCommand => new RelayCommand(p => DeleteCustomCommandAction()); + /// + /// Action to add a custom command. + /// + private void AddCustomCommandAction() + { + AddCustomCommand(); + } - private void DeleteCustomCommandAction() - { - DeleteCustomCommand(); - } + /// + /// Gets the command to edit a custom command. + /// + public ICommand EditCustomCommandCommand => new RelayCommand(_ => EditCustomCommandAction()); + + /// + /// Action to edit a custom command. + /// + private void EditCustomCommandAction() + { + EditCustomCommand(); + } + + /// + /// Gets the command to delete a custom command. + /// + public ICommand DeleteCustomCommandCommand => new RelayCommand(_ => DeleteCustomCommandAction()); + + /// + /// Action to delete a custom command. + /// + private void DeleteCustomCommandAction() + { + _ = DeleteCustomCommand(); + } - #endregion + #endregion - #region Methods - public async void AddCustomCommand() + #region Methods + + /// + /// Add a new custom command. + /// + private Task AddCustomCommand() + { + var childWindow = new CustomCommandChildWindow(); + + var childWindowViewModel = new CustomCommandViewModel(instance => { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.AddCustomCommand - }; - - var customCommandViewModel = new CustomCommandViewModel(instance => - { - _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - - SettingsManager.Current.IPScanner_CustomCommands.Add(new CustomCommandInfo(instance.ID, instance.Name, instance.FilePath, instance.Arguments)); - }, instance => - { - _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - }); - - customDialog.Content = new CustomCommandDialog - { - DataContext = customCommandViewModel - }; - - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + SettingsManager.Current.IPScanner_CustomCommands.Add(new CustomCommandInfo( + instance.ID, + instance.Name, + instance.FilePath, + instance.Arguments) + ); + }, _ => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }); + + childWindow.Title = Strings.AddCustomCommand; + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } + + /// + /// Edit the selected custom command. + /// + public Task EditCustomCommand() + { - public async void EditCustomCommand() + var childWindow = new CustomCommandChildWindow(); + + var childWindowViewModel = new CustomCommandViewModel(instance => { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.EditCustomCommand - }; - - var customCommandViewModel = new CustomCommandViewModel(instance => - { - _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - - SettingsManager.Current.IPScanner_CustomCommands.Remove(SelectedCustomCommand); - SettingsManager.Current.IPScanner_CustomCommands.Add(new CustomCommandInfo(instance.ID, instance.Name, instance.FilePath, instance.Arguments)); - }, instance => - { - _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - }, true, SelectedCustomCommand); - - customDialog.Content = new CustomCommandDialog - { - DataContext = customCommandViewModel - }; - - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - public async void DeleteCustomCommand() + SettingsManager.Current.IPScanner_CustomCommands.Remove(SelectedCustomCommand); + SettingsManager.Current.IPScanner_CustomCommands.Add(new CustomCommandInfo(instance.ID, instance.Name, + instance.FilePath, instance.Arguments)); + }, _ => { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.DeleteCustomCommand - }; - - var confirmDeleteViewModel = new ConfirmDeleteViewModel(instance => - { - _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - - SettingsManager.Current.IPScanner_CustomCommands.Remove(SelectedCustomCommand); - }, instance => - { - _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - }, Localization.Resources.Strings.DeleteCustomCommandMessage); - - customDialog.Content = new ConfirmDeleteDialog - { - DataContext = confirmDeleteViewModel - }; - - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } - #endregion + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, true, SelectedCustomCommand); + + childWindow.Title = Strings.EditCustomCommand; + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } -} + + /// + /// Deletes the selected custom command. + /// + private async Task DeleteCustomCommand() + { + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, + Strings.DeleteCustomCommand, + Strings.DeleteCustomCommandMessage, + ChildWindowIcon.Info, + Strings.Delete); + + if (!result) + return; + + SettingsManager.Current.IPScanner_CustomCommands.Remove(SelectedCustomCommand); + } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/IPScannerViewModel.cs b/Source/NETworkManager/ViewModels/IPScannerViewModel.cs index d8e6108842..c5321a0d50 100644 --- a/Source/NETworkManager/ViewModels/IPScannerViewModel.cs +++ b/Source/NETworkManager/ViewModels/IPScannerViewModel.cs @@ -1,718 +1,761 @@ -using NETworkManager.Settings; -using System.Collections.ObjectModel; -using System.Net; -using System.Windows.Input; -using System.Windows; -using System; -using System.Collections; -using System.Threading; -using System.Collections.Generic; -using NETworkManager.Models.Network; -using System.Windows.Threading; -using System.ComponentModel; -using System.Windows.Data; -using System.Linq; -using NETworkManager.Utilities; -using Dragablz; +using log4net; using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; +using MahApps.Metro.SimpleChildWindow; using NETworkManager.Controls; -using NETworkManager.Models.Export; -using NETworkManager.Views; -using System.Text.RegularExpressions; -using NETworkManager.Profiles; using NETworkManager.Localization; -using NETworkManager.Localization.Translators; +using NETworkManager.Localization.Resources; using NETworkManager.Models; using NETworkManager.Models.EventSystem; +using NETworkManager.Models.Export; +using NETworkManager.Models.Network; +using NETworkManager.Profiles; +using NETworkManager.Settings; +using NETworkManager.Utilities; +using NETworkManager.Views; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading; using System.Threading.Tasks; +using System.Windows; +using System.Windows.Data; +using System.Windows.Input; +using System.Windows.Threading; -namespace NETworkManager.ViewModels -{ - public class IPScannerViewModel : ViewModelBase - { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; +namespace NETworkManager.ViewModels; - private CancellationTokenSource _cancellationTokenSource; +/// +/// ViewModel for the IP Scanner feature. +/// +public class IPScannerViewModel : ViewModelBase, IProfileManagerMinimal +{ + #region Variables + private static readonly ILog Log = LogManager.GetLogger(typeof(IPScannerViewModel)); - public readonly int TabId; - private bool _firstLoad = true; + private CancellationTokenSource _cancellationTokenSource; - private readonly bool _isLoading; + private readonly Guid _tabId; + private bool _firstLoad = true; + private bool _closed; - private string _hosts; - public string Hosts + /// + /// Gets or sets the host or IP range to scan. + /// + public string Host + { + get; + set { - get => _hosts; - set - { - if (value == _hosts) - return; + if (value == field) + return; - _hosts = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - public ICollectionView HostsHistoryView { get; } + /// + /// Gets the collection view for the host history. + /// + public ICollectionView HostHistoryView { get; } - private bool _isSubnetDetectionRunning; - public bool IsSubnetDetectionRunning + /// + /// Gets or sets a value indicating whether subnet detection is running. + /// + public bool IsSubnetDetectionRunning + { + get; + set { - get => _isSubnetDetectionRunning; - set - { - if (value == _isSubnetDetectionRunning) - return; + if (value == field) + return; - _isSubnetDetectionRunning = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isScanRunning; - public bool IsScanRunning + /// + /// Gets or sets a value indicating whether the scan is currently running. + /// + public bool IsRunning + { + get; + set { - get => _isScanRunning; - set - { - if (value == _isScanRunning) - return; + if (value == field) + return; - _isScanRunning = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _cancelScan; - public bool CancelScan + /// + /// Gets or sets a value indicating whether the scan is being canceled. + /// + public bool IsCanceling + { + get; + set { - get => _cancelScan; - set - { - if (value == _cancelScan) - return; + if (value == field) + return; - _cancelScan = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private ObservableCollection _results = new ObservableCollection(); - public ObservableCollection Results + /// + /// Gets or sets the collection of scan results. + /// + public ObservableCollection Results + { + get; + set { - get => _results; - set - { - if (value != null && value == _results) - return; + if (Equals(value, field)) + return; - _results = value; - } + field = value; } + } = []; - public ICollectionView ResultsView { get; } + /// + /// Gets the collection view for the scan results. + /// + public ICollectionView ResultsView { get; } - private HostInfo _selectedResult; - public HostInfo SelectedResult + /// + /// Gets or sets the currently selected scan result. + /// + public IPScannerHostInfo SelectedResult + { + get; + set { - get => _selectedResult; - set - { - if (value == _selectedResult) - return; + if (value == field) + return; - _selectedResult = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private IList _selectedResults = new ArrayList(); - public IList SelectedResults + /// + /// Gets or sets the list of currently selected scan results (for multi-selection). + /// + public IList SelectedResults + { + get; + set { - get => _selectedResults; - set - { - if (Equals(value, _selectedResults)) - return; + if (Equals(value, field)) + return; - _selectedResults = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = new ArrayList(); - public bool ResolveHostname => SettingsManager.Current.IPScanner_ResolveHostname; - - public bool ResolveMACAddress => SettingsManager.Current.IPScanner_ResolveMACAddress; - - private int _hostsToScan; - public int HostsToScan + /// + /// Gets or sets the total number of hosts to scan. + /// + public int HostsToScan + { + get; + set { - get => _hostsToScan; - set - { - if (value == _hostsToScan) - return; + if (value == field) + return; - _hostsToScan = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private int _hostsScanned; - public int HostsScanned + /// + /// Gets or sets the number of hosts already scanned. + /// + public int HostsScanned + { + get; + set { - get => _hostsScanned; - set - { - if (value == _hostsScanned) - return; + if (value == field) + return; - _hostsScanned = value; - OnPropertyChanged(); - } - } + field = value; + OnPropertyChanged(); + } + } - private bool _preparingScan; - public bool PreparingScan + /// + /// Gets or sets a value indicating whether the scan is being prepared. + /// + public bool PreparingScan + { + get; + set { - get => _preparingScan; - set - { - if (value == _preparingScan) - return; + if (value == field) + return; - _preparingScan = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isStatusMessageDisplayed; - public bool IsStatusMessageDisplayed + /// + /// Gets or sets a value indicating whether the status message is displayed. + /// + public bool IsStatusMessageDisplayed + { + get; + set { - get => _isStatusMessageDisplayed; - set - { - if (value == _isStatusMessageDisplayed) - return; + if (value == field) + return; - _isStatusMessageDisplayed = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _statusMessage; - public string StatusMessage + /// + /// Gets the status message to display. + /// + public string StatusMessage + { + get; + private set { - get => _statusMessage; - set - { - if (value == _statusMessage) - return; - - _statusMessage = value; - OnPropertyChanged(); - } - } - - public IEnumerable CustomCommands => SettingsManager.Current.IPScanner_CustomCommands; - #endregion + if (value == field) + return; - #region Constructor, load settings, shutdown - public IPScannerViewModel(IDialogCoordinator instance, int tabId, string hostOrIPRange) - { - _isLoading = true; + field = value; + OnPropertyChanged(); + } + } - _dialogCoordinator = instance; + /// + /// Gets the available custom commands for the IP Scanner. + /// + public static IEnumerable CustomCommands => SettingsManager.Current.IPScanner_CustomCommands; - TabId = tabId; - Hosts = hostOrIPRange; + #endregion - // Host history - HostsHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.IPScanner_HostsHistory); + #region Constructor, load settings, shutdown - // Result view - ResultsView = CollectionViewSource.GetDefaultView(Results); - ResultsView.SortDescriptions.Add(new SortDescription(nameof(HostInfo.PingInfo) + "." + nameof(PingInfo.IPAddressInt32), ListSortDirection.Ascending)); + /// + /// Initializes a new instance of the class. + /// + /// The unique identifier for the tab. + /// The initial host or IP range to scan. + public IPScannerViewModel(Guid tabId, string hostOrIPRange) + { + ConfigurationManager.Current.IPScannerTabCount++; - // Add default custom commands... - if (SettingsManager.Current.IPScanner_CustomCommands.Count == 0) - SettingsManager.Current.IPScanner_CustomCommands = new ObservableCollection(Utilities.CustomCommand.GetDefaults()); + _tabId = tabId; + Host = hostOrIPRange; - LoadSettings(); + // Host history + HostHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.IPScanner_HostHistory); - // Detect if settings have changed... - SettingsManager.Current.PropertyChanged += SettingsManager_PropertyChanged; + // Result view + ResultsView = CollectionViewSource.GetDefaultView(Results); - _isLoading = false; - } + // Custom comparer to sort by IP address + ((ListCollectionView)ResultsView).CustomSort = Comparer.Create((x, y) => + IPAddressHelper.CompareIPAddresses(x.PingInfo.IPAddress, y.PingInfo.IPAddress)); + } - public void OnLoaded() - { - if (!_firstLoad) - return; + /// + /// Called when the view is loaded. Starts the scan if it's the first load and a host is specified. + /// + public void OnLoaded() + { + if (!_firstLoad) + return; - if (!string.IsNullOrEmpty(Hosts)) - StartScan(); + if (!string.IsNullOrEmpty(Host)) + _ = Start(); - _firstLoad = false; - } + _firstLoad = false; + } - private void LoadSettings() - { + #endregion - } - #endregion + #region ICommands & Actions - #region ICommands & Actions + /// + /// Gets the command to start or stop the scan. + /// + public ICommand ScanCommand => new RelayCommand(_ => ScanAction(), Scan_CanExecute); - public ICommand ScanCommand => new RelayCommand(p => ScanAction(), Scan_CanExecute); + private bool Scan_CanExecute(object parameter) + { + return Application.Current.MainWindow != null && + !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && + !ConfigurationManager.Current.IsChildWindowOpen; + } - private bool Scan_CanExecute(object paramter) - { - return Application.Current.MainWindow != null && !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen; - } + private void ScanAction() + { + if (IsRunning) + Stop(); + else + _ = Start(); + } - private void ScanAction() - { - Scan(); - } + /// + /// Gets the command to detect the local subnet. + /// + public ICommand DetectSubnetCommand => new RelayCommand(_ => DetectSubnetAction()); - public ICommand DetectSubnetCommand => new RelayCommand(p => DetectSubnetAction()); + private void DetectSubnetAction() + { + _ = DetectSubnet(); + } - private void DetectSubnetAction() - { - DetectIPRange(); - } + /// + /// Gets the command to redirect the selected host to another application. + /// + public ICommand RedirectDataToApplicationCommand => new RelayCommand(RedirectDataToApplicationAction); - public ICommand RedirectDataToApplicationCommand => new RelayCommand(RedirectDataToApplicationAction); + private void RedirectDataToApplicationAction(object name) + { + if (name is not ApplicationName applicationName) + return; - private void RedirectDataToApplicationAction(object name) - { - if (!(name is string appName)) - return; + var host = !string.IsNullOrEmpty(SelectedResult.Hostname) + ? SelectedResult.Hostname + : SelectedResult.PingInfo.IPAddress.ToString(); - if (!Enum.TryParse(appName, out ApplicationName applicationName)) - return; + EventSystem.RedirectToApplication(applicationName, host); + } - var host = !string.IsNullOrEmpty(SelectedResult.Hostname) ? SelectedResult.Hostname : SelectedResult.PingInfo.IPAddress.ToString(); + /// + /// Gets the command to perform a DNS lookup for the selected IP address. + /// + public ICommand PerformDNSLookupIPAddressCommand => new RelayCommand(_ => PerformDNSLookupIPAddressAction()); - EventSystem.RedirectToApplication(applicationName, host); - } + private void PerformDNSLookupIPAddressAction() + { + EventSystem.RedirectToApplication(ApplicationName.DNSLookup, SelectedResult.PingInfo.IPAddress.ToString()); + } - public ICommand PerformDNSLookupIPAddressCommand => new RelayCommand(p => PerformDNSLookupIPAddressAction()); + /// + /// Gets the command to perform a DNS lookup for the selected hostname. + /// + public ICommand PerformDNSLookupHostnameCommand => new RelayCommand(_ => PerformDNSLookupHostnameAction()); - private void PerformDNSLookupIPAddressAction() - { - EventSystem.RedirectToApplication(ApplicationName.DNSLookup, SelectedResult.PingInfo.IPAddress.ToString()); - } + private void PerformDNSLookupHostnameAction() + { + EventSystem.RedirectToApplication(ApplicationName.DNSLookup, SelectedResult.Hostname); + } - public ICommand PerformDNSLookupHostnameCommand => new RelayCommand(p => PerformDNSLookupHostnameAction()); + /// + /// Gets the command to execute a custom command for the selected host. + /// + public ICommand CustomCommandCommand => new RelayCommand(CustomCommandAction); - private void PerformDNSLookupHostnameAction() - { - EventSystem.RedirectToApplication(ApplicationName.DNSLookup, SelectedResult.Hostname); - } + private void CustomCommandAction(object guid) + { + _ = CustomCommand(guid); + } - public ICommand CustomCommandCommand => new RelayCommand(CustomCommandAction); + /// + /// Gets the command to add the selected host as a profile. + /// + public ICommand AddProfileSelectedHostCommand => new RelayCommand(_ => AddProfileSelectedHostAction()); - private void CustomCommandAction(object guid) + private async void AddProfileSelectedHostAction() + { + ProfileInfo profileInfo = new() { - CustomCommand(guid); - } + Name = string.IsNullOrEmpty(SelectedResult.Hostname) + ? SelectedResult.PingInfo.IPAddress.ToString() + : SelectedResult.Hostname.TrimEnd('.'), + Host = SelectedResult.PingInfo.IPAddress.ToString(), - public ICommand AddProfileSelectedHostCommand => new RelayCommand(p => AddProfileSelectedHostAction()); + // Additional data + WakeOnLAN_MACAddress = SelectedResult.MACAddress + }; - private async Task AddProfileSelectedHostAction() - { - ProfileInfo profileInfo = new ProfileInfo() - { - Name = string.IsNullOrEmpty(SelectedResult.Hostname) ? SelectedResult.PingInfo.IPAddress.ToString() : SelectedResult.Hostname.TrimEnd('.'), - Host = SelectedResult.PingInfo.IPAddress.ToString() - }; + var window = Application.Current.Windows.OfType().FirstOrDefault(x => x.IsActive); - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.AddProfile - }; + await ProfileDialogManager.ShowAddProfileDialog(window, this, profileInfo, null, + ApplicationName.IPScanner); + } - var profileViewModel = new ProfileViewModel(instance => - { - _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + /// + /// Gets the command to copy the selected ports to the clipboard. + /// + public ICommand CopySelectedPortsCommand => new RelayCommand(_ => CopySelectedPortsAction()); - ProfileManager.AddProfile(ProfileDialogManager.ParseProfileInfo(instance)); - }, instance => - { - _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - }, ProfileManager.GetGroupNames(), null, ProfileEditMode.Add, profileInfo); + private void CopySelectedPortsAction() + { + StringBuilder stringBuilder = new(); - customDialog.Content = new ProfileDialog - { - DataContext = profileViewModel - }; + foreach (var port in SelectedResult.Ports) + stringBuilder.AppendLine( + $"{port.Port}/{port.LookupInfo.Protocol},{ResourceTranslator.Translate(ResourceIdentifier.PortState, port.State)},{port.LookupInfo.Service},{port.LookupInfo.Description}"); - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } + ClipboardHelper.SetClipboard(stringBuilder.ToString()); + } - public ICommand CopySelectedIPAddressCommand => new RelayCommand(p => CopySelectedIPAddressAction()); + /// + /// Gets the command to export the scan results. + /// + public ICommand ExportCommand => new RelayCommand(_ => ExportAction()); - private void CopySelectedIPAddressAction() - { - ClipboardHelper.SetClipboard(SelectedResult.PingInfo.IPAddress.ToString()); - } + private void ExportAction() + { + _ = Export(); + } - public ICommand CopySelectedHostnameCommand => new RelayCommand(p => CopySelectedHostnameAction()); + #endregion - private void CopySelectedHostnameAction() - { - ClipboardHelper.SetClipboard(SelectedResult.Hostname); - } + #region Methods - public ICommand CopySelectedMACAddressCommand => new RelayCommand(p => CopySelectedMACAddressAction()); + /// + /// Starts the IP scan. + /// + private async Task Start() + { + IsStatusMessageDisplayed = false; + IsRunning = true; + PreparingScan = true; - private void CopySelectedMACAddressAction() - { - ClipboardHelper.SetClipboard(MACAddressHelper.GetDefaultFormat(SelectedResult.MACAddress.ToString())); - } + Results.Clear(); - public ICommand CopySelectedVendorCommand => new RelayCommand(p => CopySelectedVendorAction()); + DragablzTabItem.SetTabHeader(_tabId, Host); - private void CopySelectedVendorAction() - { - ClipboardHelper.SetClipboard(SelectedResult.Vendor); - } + _cancellationTokenSource?.Dispose(); + _cancellationTokenSource = new CancellationTokenSource(); - public ICommand CopySelectedBytesCommand => new RelayCommand(p => CopySelectedBytesAction()); + // Resolve hostnames + (List<(IPAddress ipAddress, string hostname)> hosts, List hostnamesNotResolved) hosts; - private void CopySelectedBytesAction() + try { - ClipboardHelper.SetClipboard(SelectedResult.PingInfo.Bytes.ToString()); + hosts = await HostRangeHelper.ResolveAsync(HostRangeHelper.CreateListFromInput(Host), + SettingsManager.Current.Network_ResolveHostnamePreferIPv4, _cancellationTokenSource.Token); } - - public ICommand CopySelectedTimeCommand => new RelayCommand(p => CopySelectedTimeAction()); - - private void CopySelectedTimeAction() + catch (OperationCanceledException) { - ClipboardHelper.SetClipboard(SelectedResult.PingInfo.Time.ToString()); + UserHasCanceled(this, EventArgs.Empty); + return; } - public ICommand CopySelectedTTLCommand => new RelayCommand(p => CopySelectedTTLAction()); - - private void CopySelectedTTLAction() + // Show error message if (some) hostnames could not be resolved + if (hosts.hostnamesNotResolved.Count > 0) { - ClipboardHelper.SetClipboard(SelectedResult.PingInfo.TTL.ToString()); + StatusMessage = + $"{Strings.TheFollowingHostnamesCouldNotBeResolved} {string.Join(", ", hosts.hostnamesNotResolved)}"; + IsStatusMessageDisplayed = true; } - public ICommand CopySelectedStatusCommand => new RelayCommand(p => CopySelectedStatusAction()); + HostsToScan = hosts.hosts.Count; + HostsScanned = 0; + + PreparingScan = false; + + // Add host(s) to the history + AddHostToHistory(Host); + + var ipScanner = new IPScanner(new IPScannerOptions( + SettingsManager.Current.IPScanner_MaxHostThreads, + SettingsManager.Current.IPScanner_MaxPortThreads, + SettingsManager.Current.IPScanner_ICMPAttempts, + SettingsManager.Current.IPScanner_ICMPTimeout, + new byte[SettingsManager.Current.IPScanner_ICMPBuffer], + SettingsManager.Current.IPScanner_ResolveHostname, + SettingsManager.Current.IPScanner_PortScanEnabled, + await PortRangeHelper.ConvertPortRangeToIntArrayAsync(SettingsManager.Current.IPScanner_PortScanPorts), + SettingsManager.Current.IPScanner_PortScanTimeout, + SettingsManager.Current.IPScanner_NetBIOSEnabled, + SettingsManager.Current.IPScanner_NetBIOSTimeout, + SettingsManager.Current.IPScanner_ResolveMACAddress, + SettingsManager.Current.IPScanner_ShowAllResults + )); + + ipScanner.HostScanned += HostScanned; + ipScanner.ScanComplete += ScanComplete; + ipScanner.ProgressChanged += ProgressChanged; + ipScanner.UserHasCanceled += UserHasCanceled; + + ipScanner.ScanAsync(hosts.hosts, _cancellationTokenSource.Token); + } - private void CopySelectedStatusAction() - { - ClipboardHelper.SetClipboard(IPStatusTranslator.GetInstance().Translate(SelectedResult.PingInfo.Status)); - } + /// + /// Stops the IP scan. + /// + private void Stop() + { + IsCanceling = true; + _cancellationTokenSource.Cancel(); + } - public ICommand ExportCommand => new RelayCommand(p => ExportAction()); + /// + /// Attempts to detect the local subnet and updates the host information accordingly. + /// + /// If the subnet or local IP address cannot be detected, an error message is displayed to the + /// user. The method updates the Host property with the detected subnet in CIDR notation when successful. + /// A task that represents the asynchronous subnet detection operation. + private async Task DetectSubnet() + { + IsSubnetDetectionRunning = true; - private void ExportAction() - { - Export(); - } - #endregion + // Try to detect local IP address based on routing to public IP + var localIP = await NetworkInterface.DetectLocalIPAddressBasedOnRoutingAsync(IPAddress.Parse(GlobalStaticConfiguration.Dashboard_PublicIPv4Address)); - #region Methods - private void Scan() - { - if (IsScanRunning) - StopScan(); - else - StartScan(); - } + // Fallback: Try to detect local IP address from network interfaces -> Prefer non link-local addresses + localIP ??= await NetworkInterface.DetectLocalIPAddressFromNetworkInterfaceAsync(System.Net.Sockets.AddressFamily.InterNetwork); - private async Task StartScan() + // If local IP address detected, try to find subnetmask from network interfaces + if (localIP != null) { - IsStatusMessageDisplayed = false; - IsScanRunning = true; - PreparingScan = true; - - Results.Clear(); + var subnetDetected = false; - // Change the tab title (not nice, but it works) - var window = Application.Current.Windows.OfType().FirstOrDefault(x => x.IsActive); + // Get network interfaces, where local IP address is assigned + var networkInterface = (await NetworkInterface.GetNetworkInterfacesAsync()) + .FirstOrDefault(x => x.IPv4Address.Any(y => y.Item1.Equals(localIP))); - if (window != null) + // If found, get subnetmask + if (networkInterface != null) { - foreach (var tabablzControl in VisualTreeHelper.FindVisualChildren(window)) - { - tabablzControl.Items.OfType().First(x => x.Id == TabId).Header = Hosts; - } - } - _cancellationTokenSource = new CancellationTokenSource(); + // Find the correct IP address and the associated subnetmask + var ipAddressWithSubnet = networkInterface.IPv4Address.First(x => x.Item1.Equals(localIP)); - // Resolve hostnames - List ipRanges; + Host = $"{ipAddressWithSubnet.Item1}/{Subnetmask.ConvertSubnetmaskToCidr(ipAddressWithSubnet.Item2)}"; - try - { - ipRanges = await HostRangeHelper.ResolveHostnamesInIPRangesAsync(Hosts.Replace(" ", "").Split(';'), _cancellationTokenSource.Token); - } - catch (OperationCanceledException) - { - UserHasCanceled(this, EventArgs.Empty); - return; - } - catch (AggregateException exceptions) // DNS error (could not resolve hostname...) - { - DnsResolveFailed(exceptions); - return; - } + subnetDetected = true; - // Create ip addresses - IPAddress[] ipAddresses; - - try - { - // Create a list of all ip addresses - ipAddresses = await HostRangeHelper.CreateIPAddressesFromIPRangesAsync(ipRanges.ToArray(), _cancellationTokenSource.Token); - } - catch (OperationCanceledException) - { - UserHasCanceled(this, EventArgs.Empty); - return; + // Fix: If the user clears the TextBox and then clicks again on the button, the TextBox remains empty... + OnPropertyChanged(nameof(Host)); } - HostsToScan = ipAddresses.Length; - HostsScanned = 0; - - PreparingScan = false; - - // Add host(s) to the history - AddHostToHistory(Hosts); - - var ipScanner = new IPScanner - { - Threads = SettingsManager.Current.IPScanner_Threads, - ICMPTimeout = SettingsManager.Current.IPScanner_ICMPTimeout, - ICMPBuffer = new byte[SettingsManager.Current.IPScanner_ICMPBuffer], - ICMPAttempts = SettingsManager.Current.IPScanner_ICMPAttempts, - ResolveHostname = SettingsManager.Current.IPScanner_ResolveHostname, - UseCustomDNSServer = SettingsManager.Current.IPScanner_UseCustomDNSServer, - DNSUseTCPOnly = SettingsManager.Current.IPScanner_DNSUseTCPOnly, - DNSRecursion = SettingsManager.Current.IPScanner_DNSRecursion, - DNSUseCache = SettingsManager.Current.IPScanner_DNSUseCache, - DNSTimeout = TimeSpan.FromSeconds(SettingsManager.Current.IPScanner_DNSTimeout), - DNSRetries = SettingsManager.Current.IPScanner_DNSRetries, - DNSShowErrorMessage = SettingsManager.Current.IPScanner_DNSShowErrorMessage, - ResolveMACAddress = SettingsManager.Current.IPScanner_ResolveMACAddress, - ShowScanResultForAllIPAddresses = SettingsManager.Current.IPScanner_ShowScanResultForAllIPAddresses - }; - - // Set custom dns server... - if (ipScanner.ResolveHostname && ipScanner.UseCustomDNSServer) + // Show error message if subnet could not be detected + if (!subnetDetected) { - ipScanner.CustomDNSServer = IPAddress.Parse(SettingsManager.Current.IPScanner_CustomDNSServer); - ipScanner.CustomDNSPort = SettingsManager.Current.IPScanner_CustomDNSPort; - } - - ipScanner.HostFound += HostFound; - ipScanner.ScanComplete += ScanComplete; - ipScanner.ProgressChanged += ProgressChanged; - ipScanner.UserHasCanceled += UserHasCanceled; + var window = Application.Current.Windows.OfType().FirstOrDefault(x => x.IsActive); - ipScanner.ScanAsync(ipAddresses, _cancellationTokenSource.Token); + await DialogHelper.ShowMessageAsync(window, Strings.Error, Strings.CouldNotDetectSubnetmask, ChildWindowIcon.Error); + } } - - private void StopScan() + else { - CancelScan = true; - _cancellationTokenSource.Cancel(); - } + var window = Application.Current.Windows.OfType().FirstOrDefault(x => x.IsActive); - private void ScanFinished() - { - CancelScan = false; - IsScanRunning = false; + await DialogHelper.ShowMessageAsync(window, Strings.Error, Strings.CouldNotDetectLocalIPAddressMessage, ChildWindowIcon.Error); } - private async Task DetectIPRange() - { - IsSubnetDetectionRunning = true; - - var localIP = await NetworkInterface.DetectLocalIPAddressBasedOnRoutingAsync(IPAddress.Parse("1.1.1.1")); - - // Could not detect local ip address - if (localIP != null) - { - var subnetmaskDetected = false; + IsSubnetDetectionRunning = false; + } - // Get subnetmask, based on ip address - foreach (var networkInterface in await NetworkInterface.GetNetworkInterfacesAsync()) - { - if (networkInterface.IPv4Address.Any(x => x.Item1.Equals(localIP))) - { - subnetmaskDetected = true; + /// + /// Executes a custom command. + /// + /// The GUID of the custom command to execute. + private async Task CustomCommand(object guid) + { + if (guid is Guid id) + { + var info = (CustomCommandInfo)CustomCommands.FirstOrDefault(x => x.ID == id)?.Clone(); - Hosts = $"{localIP}/{Subnetmask.ConvertSubnetmaskToCidr(networkInterface.IPv4Address.First().Item2)}"; + if (info == null) + return; // ToDo: Log and error message - // Fix: If the user clears the textbox and then clicks again on the button, the textbox remains empty... - OnPropertyChanged(nameof(Hosts)); + // Replace vars + var hostname = !string.IsNullOrEmpty(SelectedResult.Hostname) ? SelectedResult.Hostname.TrimEnd('.') : ""; + var ipAddress = SelectedResult.PingInfo.IPAddress.ToString(); - break; - } - } + info.FilePath = PlaceholderHelper.Resolve(info.FilePath, + (PlaceholderHelper.Hostname, hostname), + (PlaceholderHelper.IPAddress, ipAddress)); - if (!subnetmaskDetected) - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Error, Localization.Resources.Strings.CouldNotDetectSubnetmask, MessageDialogStyle.Affirmative, AppearanceManager.MetroDialog); + if (!string.IsNullOrEmpty(info.Arguments)) + { + info.Arguments = PlaceholderHelper.Resolve(info.Arguments, + (PlaceholderHelper.Hostname, hostname), + (PlaceholderHelper.IPAddress, ipAddress)); } - else + + try { - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Error, Localization.Resources.Strings.CouldNotDetectLocalIPAddressMessage, MessageDialogStyle.Affirmative, AppearanceManager.MetroDialog); + Utilities.CustomCommand.Run(info); } + catch (Exception ex) + { + Log.Error("Error trying to run custom command", ex); - IsSubnetDetectionRunning = false; - } + var window = Application.Current.Windows.OfType().FirstOrDefault(x => x.IsActive); - private async Task CustomCommand(object guid) - { - if (guid is Guid id) - { - CustomCommandInfo info = (CustomCommandInfo)CustomCommands.FirstOrDefault(x => x.ID == id).Clone(); - - if (info == null) - return; // ToDo: Log and error message - - // Replace vars - string hostname = !string.IsNullOrEmpty(SelectedResult.Hostname) ? SelectedResult.Hostname.TrimEnd('.') : ""; - string ipAddress = SelectedResult.PingInfo.IPAddress.ToString(); - - info.FilePath = Regex.Replace(info.FilePath, "\\$\\$hostname\\$\\$", hostname, RegexOptions.IgnoreCase); - info.FilePath = Regex.Replace(info.FilePath, "\\$\\$ipaddress\\$\\$", ipAddress, RegexOptions.IgnoreCase); - - if (!string.IsNullOrEmpty(info.Arguments)) - { - info.Arguments = Regex.Replace(info.Arguments, "\\$\\$hostname\\$\\$", hostname, RegexOptions.IgnoreCase); - info.Arguments = Regex.Replace(info.Arguments, "\\$\\$ipaddress\\$\\$", ipAddress, RegexOptions.IgnoreCase); - } - - try - { - Utilities.CustomCommand.Run(info); - } - catch (Exception ex) - { - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.ResourceManager.GetString("Error", LocalizationManager.GetInstance().Culture), ex.Message, MessageDialogStyle.Affirmative, AppearanceManager.MetroDialog); - } + await DialogHelper.ShowMessageAsync(window, Strings.Error, ex.Message, ChildWindowIcon.Error); } } + } - private void AddHostToHistory(string ipRange) - { - // Create the new list - var list = ListHelper.Modify(SettingsManager.Current.IPScanner_HostsHistory.ToList(), ipRange, SettingsManager.Current.General_HistoryListEntries); + /// + /// Adds the scanned host/range to the history. + /// + /// The host or IP range to add. + private void AddHostToHistory(string ipRange) + { + // Create the new list + var list = ListHelper.Modify([.. SettingsManager.Current.IPScanner_HostHistory], ipRange, + SettingsManager.Current.General_HistoryListEntries); - // Clear the old items - SettingsManager.Current.IPScanner_HostsHistory.Clear(); - OnPropertyChanged(nameof(Hosts)); // Raise property changed again, after the collection has been cleared + // Clear the old items + SettingsManager.Current.IPScanner_HostHistory.Clear(); + OnPropertyChanged(nameof(Host)); // Raise property changed again, after the collection has been cleared - // Fill with the new items - list.ForEach(x => SettingsManager.Current.IPScanner_HostsHistory.Add(x)); - } + // Fill with the new items + list.ForEach(SettingsManager.Current.IPScanner_HostHistory.Add); + } + + /// + /// Exports the scan results. + /// + /// A task that represents the asynchronous operation. + private Task Export() + { + var window = Application.Current.Windows.OfType().FirstOrDefault(x => x.IsActive); + + var childWindow = new ExportChildWindow(); - private async Task Export() + var childWindowViewModel = new ExportViewModel(async instance => { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.Export - }; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - var exportViewModel = new ExportViewModel(async instance => + try + { + ExportManager.Export(instance.FilePath, instance.FileType, + instance.ExportAll + ? Results + : new ObservableCollection(SelectedResults.Cast() + .ToArray())); + } + catch (Exception ex) { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + Log.Error("Error while exporting data as " + instance.FileType, ex); - try - { - ExportManager.Export(instance.FilePath, instance.FileType, instance.ExportAll ? Results : new ObservableCollection(SelectedResults.Cast().ToArray())); - } - catch (Exception ex) - { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Localization.Resources.Strings.OK; + await DialogHelper.ShowMessageAsync(window, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); + } - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Error, Localization.Resources.Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); - } + SettingsManager.Current.IPScanner_ExportFileType = instance.FileType; + SettingsManager.Current.IPScanner_ExportFilePath = instance.FilePath; + }, _ => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, [ + ExportFileType.Csv, ExportFileType.Xml, ExportFileType.Json + ], true, SettingsManager.Current.IPScanner_ExportFileType, SettingsManager.Current.IPScanner_ExportFilePath); - SettingsManager.Current.IPScanner_ExportFileType = instance.FileType; - SettingsManager.Current.IPScanner_ExportFilePath = instance.FilePath; - }, instance => { _dialogCoordinator.HideMetroDialogAsync(this, customDialog); }, new ExportManager.ExportFileType[] { ExportManager.ExportFileType.CSV, ExportManager.ExportFileType.XML, ExportManager.ExportFileType.JSON }, true, SettingsManager.Current.IPScanner_ExportFileType, SettingsManager.Current.IPScanner_ExportFilePath); + childWindow.Title = Strings.Export; - customDialog.Content = new ExportDialog - { - DataContext = exportViewModel - }; + childWindow.DataContext = childWindowViewModel; - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } + ConfigurationManager.Current.IsChildWindowOpen = true; - public void OnClose() - { - // Stop scan - if (IsScanRunning) - StopScan(); - } + return window.ShowChildWindowAsync(childWindow); + } - #endregion + /// + /// Called when the tab is closed. Stops any running scan. + /// + public void OnClose() + { + // Prevent multiple calls + if (_closed) + return; - #region Events - private void HostFound(object sender, HostFoundArgs e) - { - var ipScannerHostInfo = HostInfo.Parse(e); + _closed = true; - Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(delegate - { - //lock (Results) - Results.Add(ipScannerHostInfo); - })); - } + // Stop scan + if (IsRunning) + Stop(); - private void ScanComplete(object sender, EventArgs e) - { - ScanFinished(); - } + ConfigurationManager.Current.IPScannerTabCount--; + } - private void ProgressChanged(object sender, ProgressChangedArgs e) - { - HostsScanned = e.Value; - } + #endregion - private void DnsResolveFailed(AggregateException e) - { - StatusMessage = $"{Localization.Resources.Strings.TheFollowingHostnamesCouldNotBeResolved} {string.Join(", ", e.Flatten().InnerExceptions.Select(x => x.Message))}"; - IsStatusMessageDisplayed = true; + #region Events - ScanFinished(); - } + /// + /// Handles the HostScanned event. Adds the result to the list. + /// + /// The source of the event. + /// The instance containing the event data. + private void HostScanned(object sender, IPScannerHostScannedArgs e) + { + Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, + new Action(delegate + { + Results.Add(e.Args); + })); + } - private void UserHasCanceled(object sender, EventArgs e) - { - StatusMessage = Localization.Resources.Strings.CanceledByUserMessage; - IsStatusMessageDisplayed = true; + /// + /// Handles the ProgressChanged event. Updates the progress. + /// + /// The source of the event. + /// The instance containing the event data. + private void ProgressChanged(object sender, ProgressChangedArgs e) + { + HostsScanned = e.Value; + } - ScanFinished(); - } - - private void SettingsManager_PropertyChanged(object sender, PropertyChangedEventArgs e) + /// + /// Handles the ScanComplete event. + /// + /// The source of the event. + /// The instance containing the event data. + private void ScanComplete(object sender, EventArgs e) + { + // Run in UI thread with lower priority than HostScanned event + // to ensure all results are added first #3285 + Application.Current.Dispatcher.Invoke(() => { - switch (e.PropertyName) + if (Results.Count == 0) { - case nameof(SettingsInfo.IPScanner_ResolveMACAddress): - OnPropertyChanged(nameof(ResolveMACAddress)); - break; - case nameof(SettingsInfo.IPScanner_ResolveHostname): - OnPropertyChanged(nameof(ResolveHostname)); - break; + StatusMessage = Strings.NoReachableHostsFound; + IsStatusMessageDisplayed = true; } - } - #endregion + + IsCanceling = false; + IsRunning = false; + }, DispatcherPriority.Background); + } + + /// + /// Handles the UserHasCanceled event. + /// + /// The source of the event. + /// The instance containing the event data. + private void UserHasCanceled(object sender, EventArgs e) + { + StatusMessage = Strings.CanceledByUserMessage; + IsStatusMessageDisplayed = true; + + IsCanceling = false; + IsRunning = false; } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/ImportAdComputersViewModel.cs b/Source/NETworkManager/ViewModels/ImportAdComputersViewModel.cs new file mode 100644 index 0000000000..9258e5f132 --- /dev/null +++ b/Source/NETworkManager/ViewModels/ImportAdComputersViewModel.cs @@ -0,0 +1,338 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security; +using System.Threading.Tasks; +using System.Windows.Input; +using log4net; +using NETworkManager.Profiles; +using NETworkManager.Settings; +using NETworkManager.Utilities; +using NETworkManager.Utilities.ActiveDirectory; + +namespace NETworkManager.ViewModels; + +public sealed class ImportAdComputersViewModel : ViewModelBase +{ + private static readonly ILog Log = LogManager.GetLogger(typeof(ImportAdComputersViewModel)); + + private readonly Action, ImportAdComputersViewModel> _searchCompleted; + + public ImportAdComputersViewModel(Action, ImportAdComputersViewModel> searchCompleted, Action cancelDialog, ImportAdComputersViewModel previousState = null) + { + _searchCompleted = searchCompleted; + + if (previousState != null) + { + LdapSearchBase = previousState.LdapSearchBase; + LdapServer = previousState.LdapServer; + LdapPort = previousState.LdapPort; + UseSsl = previousState.UseSsl; + AuthMode = previousState.AuthMode; + Username = previousState.Username; + Password = previousState.Password; + ExcludeDisabledAccounts = previousState.ExcludeDisabledAccounts; + AdditionalLdapFilter = previousState.AdditionalLdapFilter; + } + else + { + LdapSearchBase = SettingsManager.Current.Profiles_ImportActiveDirectorySearchBase ?? string.Empty; + LdapServer = SettingsManager.Current.Profiles_ImportActiveDirectoryServer ?? string.Empty; + LdapPort = SettingsManager.Current.Profiles_ImportActiveDirectoryPort; + UseSsl = SettingsManager.Current.Profiles_ImportActiveDirectoryUseSsl; + AuthMode = SettingsManager.Current.Profiles_ImportActiveDirectoryAuthMode; + ExcludeDisabledAccounts = SettingsManager.Current.Profiles_ImportActiveDirectoryExcludeDisabledAccounts; + AdditionalLdapFilter = SettingsManager.Current.Profiles_ImportActiveDirectoryAdditionalFilter ?? string.Empty; + } + + SearchCommand = new RelayCommand(_ => SearchAction(), _ => Search_CanExecute()); + CancelCommand = new RelayCommand(_ => cancelDialog()); + } + + public string LdapSearchBase + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public string LdapServer + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public int LdapPort + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public bool UseSsl + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + + LdapPort = value switch + { + // Auto-switch the well-known port when the user hasn't picked a custom one + true when LdapPort == GlobalStaticConfiguration.Profiles_ImportActiveDirectoryPort_Ldap => + GlobalStaticConfiguration.Profiles_ImportActiveDirectoryPort_Ldaps, + false when LdapPort == GlobalStaticConfiguration.Profiles_ImportActiveDirectoryPort_Ldaps => + GlobalStaticConfiguration.Profiles_ImportActiveDirectoryPort_Ldap, + _ => LdapPort + }; + } + } + + public bool ExcludeDisabledAccounts + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public string AdditionalLdapFilter + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + private ActiveDirectoryAuthenticationMode AuthMode + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + OnPropertyChanged(nameof(IsCurrentUserAuth)); + OnPropertyChanged(nameof(IsCustomAuth)); + } + } + + public bool IsCurrentUserAuth + { + get => AuthMode == ActiveDirectoryAuthenticationMode.CurrentUser; + set + { + if (value) + AuthMode = ActiveDirectoryAuthenticationMode.CurrentUser; + } + } + + public bool IsCustomAuth + { + get => AuthMode == ActiveDirectoryAuthenticationMode.Custom; + set + { + if (value) + AuthMode = ActiveDirectoryAuthenticationMode.Custom; + } + } + + public string Username + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = string.Empty; + + public SecureString Password + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + IsPasswordEmpty = value == null || value.Length == 0; + } + } = new(); + + public bool IsPasswordEmpty + { + get; + private set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = true; + + public bool IsSearching + { + get; + private set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public bool IsStatusMessageDisplayed + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public string StatusMessage + { + get; + private set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public ICommand SearchCommand { get; } + + public ICommand CancelCommand { get; } + + private bool Search_CanExecute() + { + return !IsSearching; + } + + private async void SearchAction() + { + IsSearching = true; + StatusMessage = Localization.Resources.Strings.SearchingActiveDirectoryDots; + IsStatusMessageDisplayed = true; + + await Task.Delay(GlobalStaticConfiguration.ApplicationUIDelayInterval); + + var options = new ActiveDirectorySearchOptions + { + SearchBase = LdapSearchBase.Trim(), + Server = LdapServer?.Trim() ?? string.Empty, + Port = LdapPort, + UseSsl = UseSsl, + ExcludeDisabledAccounts = ExcludeDisabledAccounts, + AdditionalFilter = AdditionalLdapFilter?.Trim() ?? string.Empty, + Username = AuthMode == ActiveDirectoryAuthenticationMode.Custom ? Username.Trim() : string.Empty, + Password = AuthMode == ActiveDirectoryAuthenticationMode.Custom ? Password : null + }; + + IReadOnlyList computers; + + try + { + computers = await Task.Run(() => + ActiveDirectoryComputerSearcher.GetComputersInSubtree(options)).ConfigureAwait(true); + + IsSearching = false; + IsStatusMessageDisplayed = false; + } + catch (Exception exception) + { + Log.Error("Active Directory search failed.", exception); + + IsSearching = false; + StatusMessage = exception.Message; + IsStatusMessageDisplayed = true; + + return; + } + + if (computers.Count == 0) + { + StatusMessage = Localization.Resources.Strings.ActiveDirectoryNoComputersFound; + IsStatusMessageDisplayed = true; + + return; + } + + var importedAt = DateTime.Now.ToString("g", System.Globalization.CultureInfo.CurrentUICulture); + var candidates = computers + .Select(c => new ProfileImportCandidate( + name: c.ProfileName, + host: c.DnsHostName, + description: string.Format(Localization.Resources.Strings.ActiveDirectory_ImportDescription, importedAt), + importSource: ProfileImportSource.ActiveDirectory, + importSourceId: c.ObjectGuid)) + .ToList(); + + PersistSettings(options); + + _searchCompleted(candidates, this); + + } + + private void PersistSettings(ActiveDirectorySearchOptions options) + { + SettingsManager.Current.Profiles_ImportActiveDirectorySearchBase = options.SearchBase; + SettingsManager.Current.Profiles_ImportActiveDirectoryServer = options.Server; + SettingsManager.Current.Profiles_ImportActiveDirectoryPort = options.Port; + SettingsManager.Current.Profiles_ImportActiveDirectoryUseSsl = options.UseSsl; + SettingsManager.Current.Profiles_ImportActiveDirectoryExcludeDisabledAccounts = options.ExcludeDisabledAccounts; + SettingsManager.Current.Profiles_ImportActiveDirectoryAdditionalFilter = options.AdditionalFilter; + SettingsManager.Current.Profiles_ImportActiveDirectoryAuthMode = AuthMode; + } +} diff --git a/Source/NETworkManager/ViewModels/ImportCsvFileViewModel.cs b/Source/NETworkManager/ViewModels/ImportCsvFileViewModel.cs new file mode 100644 index 0000000000..b0e2dcb023 --- /dev/null +++ b/Source/NETworkManager/ViewModels/ImportCsvFileViewModel.cs @@ -0,0 +1,144 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Windows.Forms; +using System.Windows.Input; +using log4net; +using NETworkManager.Localization.Resources; +using NETworkManager.Profiles; +using NETworkManager.Settings; +using NETworkManager.Utilities; + +namespace NETworkManager.ViewModels; + +public sealed class ImportCsvFileViewModel : ViewModelBase +{ + private static readonly ILog Log = LogManager.GetLogger(typeof(ImportCsvFileViewModel)); + + private readonly Action, ImportCsvFileViewModel> _parseCompleted; + + public ImportCsvFileViewModel(Action, ImportCsvFileViewModel> parseCompleted, + Action cancelDialog, ImportCsvFileViewModel previousState = null) + { + _parseCompleted = parseCompleted; + + FilePath = previousState != null + ? previousState.FilePath + : SettingsManager.Current.Profiles_ImportCsvLastFilePath ?? string.Empty; + + BrowseFileCommand = new RelayCommand(_ => BrowseFileAction()); + ParseCommand = new RelayCommand(_ => ImportAction()); + CancelCommand = new RelayCommand(_ => cancelDialog()); + } + + public string FilePath + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public bool IsStatusMessageDisplayed + { + get; + private set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public string StatusMessage + { + get; + private set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public ICommand BrowseFileCommand { get; } + + public ICommand ParseCommand { get; } + + public ICommand CancelCommand { get; } + + private void BrowseFileAction() + { + var openFileDialog = new OpenFileDialog + { + Filter = GlobalStaticConfiguration.CsvFileExtensionFilter + }; + + if (openFileDialog.ShowDialog() == DialogResult.OK) + FilePath = openFileDialog.FileName; + } + + /// + /// Set the from drag and drop. + /// + /// Path to the file. + public void SetFilePathFromDragDrop(string filePath) + { + if (!filePath.EndsWith(".csv", StringComparison.OrdinalIgnoreCase)) + { + StatusMessage = Strings.OnlyCsvFilesAllowed; + IsStatusMessageDisplayed = true; + return; + } + + IsStatusMessageDisplayed = false; + FilePath = filePath; + + OnPropertyChanged(nameof(FilePath)); + } + + private void ImportAction() + { + IsStatusMessageDisplayed = false; + + IReadOnlyList candidates; + + try + { + var importedAt = DateTime.Now.ToString("g", CultureInfo.CurrentUICulture); + var fallbackDescription = string.Format(Strings.Csv_ImportDescription, importedAt); + + candidates = CsvProfileImportParser.Parse(FilePath.Trim(), fallbackDescription); + } + catch (Exception exception) + { + Log.Error("CSV import failed.", exception); + + StatusMessage = exception.Message; + IsStatusMessageDisplayed = true; + + return; + } + + if (candidates.Count == 0) + { + StatusMessage = Strings.CsvNoEntriesFound; + IsStatusMessageDisplayed = true; + + return; + } + + SettingsManager.Current.Profiles_ImportCsvLastFilePath = FilePath.Trim(); + + _parseCompleted(candidates, this); + } +} diff --git a/Source/NETworkManager/ViewModels/ImportProfilesResultViewModel.cs b/Source/NETworkManager/ViewModels/ImportProfilesResultViewModel.cs new file mode 100644 index 0000000000..b99b0dc755 --- /dev/null +++ b/Source/NETworkManager/ViewModels/ImportProfilesResultViewModel.cs @@ -0,0 +1,436 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Linq; +using System.Windows.Data; +using System.Windows.Input; +using System.Windows.Threading; +using log4net; +using NETworkManager.Localization; +using NETworkManager.Profiles; +using NETworkManager.Settings; +using NETworkManager.Utilities; + +namespace NETworkManager.ViewModels; + +public sealed class ImportProfilesResultViewModel : ViewModelBase +{ + private static readonly ILog Log = LogManager.GetLogger(typeof(ImportProfilesResultViewModel)); + + private readonly Action _completedCallback; + private readonly DispatcherTimer _searchDispatcherTimer = new(); + + public ImportProfilesResultViewModel(IReadOnlyList candidates, ProfileImportSource importSource, string targetGroup, Action backCallback, Action cancelCallback, Action completedCallback) + { + _completedCallback = completedCallback; + + Candidates = new ObservableCollection(candidates.Select(c => new ImportCandidateItem(c))); + + foreach (var item in Candidates) + item.PropertyChanged += OnCandidateChanged; + + if (importSource != ProfileImportSource.None) + { + var importedIds = new HashSet( + ProfileManager.LoadedProfileFileData.Groups + .SelectMany(g => g.Profiles) + .Where(p => p.ImportSource == importSource && !string.IsNullOrEmpty(p.ImportSourceId)) + .Select(p => p.ImportSourceId), + StringComparer.OrdinalIgnoreCase); + + foreach (var item in Candidates) + item.AlreadyExists = !string.IsNullOrEmpty(item.ImportSourceId) && importedIds.Contains(item.ImportSourceId); + } + + GroupNames = new ObservableCollection(ProfileManager.GetGroupNames()); + GroupName = !string.IsNullOrWhiteSpace(targetGroup) ? targetGroup : GroupNames.FirstOrDefault() ?? string.Empty; + + CandidatesView = CollectionViewSource.GetDefaultView(Candidates); + CandidatesView.Filter = FilterCandidate; + + _searchDispatcherTimer.Interval = GlobalStaticConfiguration.SearchDispatcherTimerTimeSpan; + _searchDispatcherTimer.Tick += SearchDispatcherTimer_Tick; + + ApplicationOptions = BuildApplicationOptions(); + foreach (var tool in ApplicationOptions) + tool.PropertyChanged += OnApplicationOptionChanged; + + HasAnyCandidateSelected = Candidates.Any(c => c.IsSelected); + HasAnyEnabledApplication = ApplicationOptions.Any(t => t.IsEnabled); + + SelectAllCommand = new RelayCommand(_ => SetAllSelections(true)); + DeselectAllCommand = new RelayCommand(_ => SetAllSelections(false)); + BackCommand = new RelayCommand(_ => backCallback()); + CancelCommand = new RelayCommand(_ => cancelCallback()); + ImportCommand = new RelayCommand(_ => ImportAction()); + } + + public string Search + { + get; + set + { + if (value == field) + return; + + field = value; + + IsSearching = true; + _searchDispatcherTimer.Start(); + + OnPropertyChanged(); + } + } = string.Empty; + + public bool IsSearching + { + get; + private set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + private ObservableCollection Candidates { get; } + + public ICollectionView CandidatesView { get; } + + public bool HasAnyCandidateSelected + { + get; + private set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public ObservableCollection ApplicationOptions { get; } + + public bool HasAnyEnabledApplication + { + get; + private set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public ObservableCollection GroupNames { get; } + + public string GroupName + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public bool SkipDuplicates + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = true; + + public bool IsStatusMessageDisplayed + { + get; + private set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public string StatusMessage + { + get; + private set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public ICommand SelectAllCommand { get; } + + public ICommand DeselectAllCommand { get; } + + public ICommand BackCommand { get; } + + public ICommand CancelCommand { get; } + + public ICommand ImportCommand { get; } + + private static ObservableCollection BuildApplicationOptions() + { + return + [ + new ImportApplicationToggleItem(ProfileName.IPScanner), + new ImportApplicationToggleItem(ProfileName.PortScanner), + new ImportApplicationToggleItem(ProfileName.PingMonitor, true), + new ImportApplicationToggleItem(ProfileName.Traceroute), + new ImportApplicationToggleItem(ProfileName.DNSLookup), + new ImportApplicationToggleItem(ProfileName.RemoteDesktop, true), + new ImportApplicationToggleItem(ProfileName.PowerShell, true), + new ImportApplicationToggleItem(ProfileName.PuTTY), + new ImportApplicationToggleItem(ProfileName.TigerVNC), + new ImportApplicationToggleItem(ProfileName.WebConsole), + new ImportApplicationToggleItem(ProfileName.SNMP), + new ImportApplicationToggleItem(ProfileName.Whois), + new ImportApplicationToggleItem(ProfileName.IPGeolocation) + ]; + } + + private static void ApplyToolDefaults(ProfileInfo profile, ProfileName tool) + { + switch (tool) + { + case ProfileName.IPScanner: + profile.IPScanner_Enabled = true; + profile.IPScanner_HostOrIPRange = profile.Host; + break; + case ProfileName.PortScanner: + profile.PortScanner_Enabled = true; + profile.PortScanner_Host = profile.Host; + break; + case ProfileName.PingMonitor: + profile.PingMonitor_Enabled = true; + profile.PingMonitor_Host = profile.Host; + break; + case ProfileName.Traceroute: + profile.Traceroute_Enabled = true; + profile.Traceroute_Host = profile.Host; + break; + case ProfileName.DNSLookup: + profile.DNSLookup_Enabled = true; + profile.DNSLookup_Host = profile.Host; + break; + case ProfileName.RemoteDesktop: + profile.RemoteDesktop_Enabled = true; + profile.RemoteDesktop_Host = profile.Host; + break; + case ProfileName.PowerShell: + profile.PowerShell_Enabled = true; + profile.PowerShell_Host = profile.Host; + break; + case ProfileName.PuTTY: + profile.PuTTY_Enabled = true; + profile.PuTTY_HostOrSerialLine = profile.Host; + break; + case ProfileName.TigerVNC: + profile.TigerVNC_Enabled = true; + profile.TigerVNC_Host = profile.Host; + break; + case ProfileName.WebConsole: + profile.WebConsole_Enabled = true; + break; + case ProfileName.SNMP: + profile.SNMP_Enabled = true; + profile.SNMP_Host = profile.Host; + break; + case ProfileName.Whois: + profile.Whois_Enabled = true; + profile.Whois_Domain = profile.Host; + break; + case ProfileName.IPGeolocation: + profile.IPGeolocation_Enabled = true; + profile.IPGeolocation_Host = profile.Host; + break; + } + } + + private bool FilterCandidate(object obj) + { + if (obj is not ImportCandidateItem item) + return false; + + if (string.IsNullOrEmpty(Search)) + return true; + + return item.Name?.Contains(Search, StringComparison.OrdinalIgnoreCase) == true || + item.Host?.Contains(Search, StringComparison.OrdinalIgnoreCase) == true; + } + + private void SetAllSelections(bool isSelected) + { + foreach (var item in Candidates) + item.IsSelected = isSelected; + } + + private void OnCandidateChanged(object sender, PropertyChangedEventArgs e) + { + if (e.PropertyName == nameof(ImportCandidateItem.IsSelected)) + HasAnyCandidateSelected = Candidates.Any(c => c.IsSelected); + } + + private void OnApplicationOptionChanged(object sender, PropertyChangedEventArgs e) + { + if (e.PropertyName == nameof(ImportApplicationToggleItem.IsEnabled)) + HasAnyEnabledApplication = ApplicationOptions.Any(t => t.IsEnabled); + } + + private void SearchDispatcherTimer_Tick(object sender, EventArgs e) + { + _searchDispatcherTimer.Stop(); + CandidatesView.Refresh(); + IsSearching = false; + } + + private void ImportAction() + { + IsStatusMessageDisplayed = false; + + try + { + var targetGroup = GroupName.Trim(); + var enabledTools = ApplicationOptions.Where(t => t.IsEnabled).ToList(); + + var imported = 0; + var skippedDuplicates = 0; + var skippedNoHost = 0; + var profilesToAdd = new List(); + + foreach (var item in Candidates.Where(c => c.IsSelected)) + { + if (!item.CanImport) + { + skippedNoHost++; + continue; + } + + if (SkipDuplicates && item.AlreadyExists) + { + skippedDuplicates++; + continue; + } + + var profile = new ProfileInfo + { + Name = item.Name, + Host = item.Host.Trim(), + Description = item.Description, + Group = targetGroup, + TagsCollection = [], + ImportSource = item.ImportSource, + ImportSourceId = item.ImportSourceId + }; + + foreach (var tool in enabledTools) + ApplyToolDefaults(profile, tool.ProfileName); + + profilesToAdd.Add(profile); + imported++; + } + + if (profilesToAdd.Count > 0) + ProfileManager.AddProfiles(profilesToAdd); + + _completedCallback(imported, skippedDuplicates, skippedNoHost); + } + catch (Exception exception) + { + Log.Error("Profile import failed.", exception); + StatusMessage = exception.Message; + IsStatusMessageDisplayed = true; + } + } +} + +public sealed class ImportCandidateItem : ViewModelBase +{ + public ImportCandidateItem(ProfileImportCandidate source) + { + Name = source.Name; + Host = source.Host; + Description = source.Description; + ImportSource = source.ImportSource; + ImportSourceId = source.ImportSourceId; + CanImport = !string.IsNullOrWhiteSpace(source.Host); + IsSelected = CanImport; + } + + public string Name { get; } + + public string Host { get; } + + public string Description { get; } + + public ProfileImportSource ImportSource { get; } + + public string ImportSourceId { get; } + + public bool CanImport { get; } + + public bool IsSelected + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public bool AlreadyExists { get; set; } +} + +public sealed class ImportApplicationToggleItem : ViewModelBase +{ + public ImportApplicationToggleItem(ProfileName profileName, bool isEnabled = false) + { + ProfileName = profileName; + DisplayName = ResourceTranslator.Translate(ResourceIdentifier.ApplicationName, profileName); + IsEnabled = isEnabled; + } + + public ProfileName ProfileName { get; } + + public string DisplayName { get; } + + public bool IsEnabled + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/ImportProfilesViewModel.cs b/Source/NETworkManager/ViewModels/ImportProfilesViewModel.cs new file mode 100644 index 0000000000..19cd16e551 --- /dev/null +++ b/Source/NETworkManager/ViewModels/ImportProfilesViewModel.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Windows.Input; +using NETworkManager.Localization.Resources; +using NETworkManager.Profiles; +using NETworkManager.Utilities; + +namespace NETworkManager.ViewModels; + +public sealed class ImportProfilesViewModel : ViewModelBase +{ + public ImportProfilesViewModel(Action importCommand, + Action cancelHandler) + { + Methods = new List + { + new(ProfileImportSource.ActiveDirectory, Strings.ImportProfiles_Method_ActiveDirectory), + new(ProfileImportSource.Csv, Strings.ImportProfiles_Method_Csv) + }; + + SelectedMethod = Methods[0]; + + OKCommand = new RelayCommand(_ => importCommand(this), _ => SelectedMethod != null); + CancelCommand = new RelayCommand(_ => cancelHandler(this)); + } + + public IReadOnlyList Methods { get; } + + public ImportMethodItem SelectedMethod + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public ICommand OKCommand { get; } + + public ICommand CancelCommand { get; } + + public sealed record ImportMethodItem(ProfileImportSource Method, string DisplayName); +} diff --git a/Source/NETworkManager/ViewModels/ListenersViewModel.cs b/Source/NETworkManager/ViewModels/ListenersViewModel.cs index 5e92b61cba..5658ee8c52 100644 --- a/Source/NETworkManager/ViewModels/ListenersViewModel.cs +++ b/Source/NETworkManager/ViewModels/ListenersViewModel.cs @@ -1,377 +1,424 @@ -using NETworkManager.Models.Network; +using log4net; +using MahApps.Metro.Controls; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Localization.Resources; +using NETworkManager.Models.Export; +using NETworkManager.Models.Network; +using NETworkManager.Settings; +using NETworkManager.Utilities; +using NETworkManager.Views; using System; using System.Collections; -using System.Windows.Input; -using System.ComponentModel; -using System.Windows.Data; +using System.Collections.Generic; using System.Collections.ObjectModel; -using NETworkManager.Utilities; -using NETworkManager.Settings; -using System.Windows.Threading; +using System.ComponentModel; using System.Linq; -using System.Windows; -using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.Models.Export; -using NETworkManager.Views; using System.Threading.Tasks; +using System.Windows; +using System.Windows.Data; +using System.Windows.Input; +using System.Windows.Threading; + +namespace NETworkManager.ViewModels; -namespace NETworkManager.ViewModels +/// +/// View model for the listeners view. +/// +public class ListenersViewModel : ViewModelBase { - public class ListenersViewModel : ViewModelBase + #region Contructor, load settings + + /// + /// Initializes a new instance of the class. + /// + public ListenersViewModel() { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; + _isLoading = true; - private readonly bool _isLoading; - private readonly DispatcherTimer _autoRefreshTimer = new DispatcherTimer(); - private bool _isTimerPaused; + // Result view + search + ResultsView = CollectionViewSource.GetDefaultView(Results); - private string _search; - public string Search + ((ListCollectionView)ResultsView).CustomSort = Comparer.Create((x, y) => + IPAddressHelper.CompareIPAddresses(x.IPAddress, y.IPAddress)); + + ResultsView.Filter = o => { - get => _search; - set - { - if (value == _search) - return; + if (string.IsNullOrEmpty(Search)) + return true; - _search = value; + if (o is not ListenerInfo info) + return false; - ListenerResultsView.Refresh(); + // Search by IP Address, Port and Protocol + return info.IPAddress.ToString().IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || + info.Port.ToString().IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || + info.Protocol.ToString().IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1; + }; - OnPropertyChanged(); - } - } + // Get listeners + _ = Refresh(true); - private ObservableCollection _listenerResults = new ObservableCollection(); - public ObservableCollection ListenerResults - { - get => _listenerResults; - set - { - if (value == _listenerResults) - return; + // Auto refresh + _autoRefreshTimer.Tick += AutoRefreshTimer_Tick; - _listenerResults = value; - OnPropertyChanged(); - } - } + AutoRefreshTimes = CollectionViewSource.GetDefaultView(AutoRefreshTime.GetDefaults); + SelectedAutoRefreshTime = AutoRefreshTimes.SourceCollection.Cast().FirstOrDefault(x => + x.Value == SettingsManager.Current.Listeners_AutoRefreshTime.Value && + x.TimeUnit == SettingsManager.Current.Listeners_AutoRefreshTime.TimeUnit); + AutoRefreshEnabled = SettingsManager.Current.Listeners_AutoRefreshEnabled; - public ICollectionView ListenerResultsView { get; } + _isLoading = false; + } - private ListenerInfo _selectedListenerInfo; - public ListenerInfo SelectedListenerInfo - { - get => _selectedListenerInfo; - set - { - if (value == _selectedListenerInfo) - return; + #endregion - _selectedListenerInfo = value; - OnPropertyChanged(); - } - } + #region Events - private IList _selectedListenerInfos = new ArrayList(); - public IList SelectedListenerInfos - { - get => _selectedListenerInfos; - set - { - if (Equals(value, _selectedListenerInfos)) - return; + /// + /// Handles the Tick event of the auto-refresh timer. + /// + private async void AutoRefreshTimer_Tick(object sender, EventArgs e) + { + // Stop timer... + _autoRefreshTimer.Stop(); - _selectedListenerInfos = value; - OnPropertyChanged(); - } - } + // Refresh + await Refresh(); - private bool _autoRefresh; - public bool AutoRefresh - { - get => _autoRefresh; - set - { - if (value == _autoRefresh) - return; + // Restart timer... + _autoRefreshTimer.Start(); + } - if (!_isLoading) - SettingsManager.Current.Listeners_AutoRefresh = value; + #endregion - _autoRefresh = value; + #region Variables - // Start timer to refresh automatically - if (!_isLoading) - { - if (value) - StartAutoRefreshTimer(); - else - StopAutoRefreshTimer(); - } + private static readonly ILog Log = LogManager.GetLogger(typeof(ListenersViewModel)); - OnPropertyChanged(); - } - } + /// + /// Indicates whether the view model is loading. + /// + private readonly bool _isLoading; - public ICollectionView AutoRefreshTimes { get; } + /// + /// The timer for auto-refresh. + /// + private readonly DispatcherTimer _autoRefreshTimer = new(); - private AutoRefreshTimeInfo _selectedAutoRefreshTime; - public AutoRefreshTimeInfo SelectedAutoRefreshTime + /// + /// Gets or sets the search text. + /// + public string Search + { + get; + set { - get => _selectedAutoRefreshTime; - set - { - if (value == _selectedAutoRefreshTime) - return; - - if (!_isLoading) - SettingsManager.Current.Listeners_AutoRefreshTime = value; + if (value == field) + return; - _selectedAutoRefreshTime = value; + field = value; - if (AutoRefresh) - ChangeAutoRefreshTimerInterval(AutoRefreshTime.CalculateTimeSpan(value)); + ResultsView.Refresh(); - OnPropertyChanged(); - } + OnPropertyChanged(); } + } - private bool _isRefreshing; - public bool IsRefreshing + /// + /// Gets or sets the collection of listener results. + /// + public ObservableCollection Results + { + get; + set { - get => _isRefreshing; - set - { - if (value == _isRefreshing) - return; + if (value == field) + return; - _isRefreshing = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = new(); + + /// + /// Gets the collection view for the listener results. + /// + public ICollectionView ResultsView { get; } - private bool _isStatusMessageDisplayed; - public bool IsStatusMessageDisplayed + /// + /// Gets or sets the currently selected listener result. + /// + public ListenerInfo SelectedResult + { + get; + set { - get => _isStatusMessageDisplayed; - set - { - if (value == _isStatusMessageDisplayed) - return; + if (value == field) + return; - _isStatusMessageDisplayed = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _statusMessage; - public string StatusMessage + /// + /// Gets or sets the list of selected listener results. + /// + public IList SelectedResults + { + get; + set { - get => _statusMessage; - set - { - if (value == _statusMessage) - return; + if (Equals(value, field)) + return; - _statusMessage = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion + } = new ArrayList(); - #region Contructor, load settings - public ListenersViewModel(IDialogCoordinator instance) + /// + /// Gets or sets a value indicating whether auto-refresh is enabled. + /// + public bool AutoRefreshEnabled + { + get; + set { - _isLoading = true; + if (value == field) + return; - _dialogCoordinator = instance; + if (!_isLoading) + SettingsManager.Current.Listeners_AutoRefreshEnabled = value; - // Result view + search - ListenerResultsView = CollectionViewSource.GetDefaultView(ListenerResults); - ListenerResultsView.SortDescriptions.Add(new SortDescription(nameof(ListenerInfo.Protocol), ListSortDirection.Ascending)); - ListenerResultsView.SortDescriptions.Add(new SortDescription(nameof(ListenerInfo.IPAddressInt32), ListSortDirection.Ascending)); - ListenerResultsView.Filter = o => - { + field = value; - if (!(o is ListenerInfo info)) - return false; + // Start timer to refresh automatically + if (value) + { + _autoRefreshTimer.Interval = AutoRefreshTime.CalculateTimeSpan(SelectedAutoRefreshTime); + _autoRefreshTimer.Start(); + } + else + { + _autoRefreshTimer.Stop(); + } - if (string.IsNullOrEmpty(Search)) - return true; + OnPropertyChanged(); + } + } - // Search by IP Address, Port and Protocol - return info.IPAddress.ToString().IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || info.Port.ToString().IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || info.Protocol.ToString().IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1; - }; + /// + /// Gets the collection view for the auto-refresh times. + /// + public ICollectionView AutoRefreshTimes { get; } - AutoRefreshTimes = CollectionViewSource.GetDefaultView(AutoRefreshTime.GetDefaults); - SelectedAutoRefreshTime = AutoRefreshTimes.SourceCollection.Cast().FirstOrDefault(x => (x.Value == SettingsManager.Current.Listeners_AutoRefreshTime.Value && x.TimeUnit == SettingsManager.Current.Listeners_AutoRefreshTime.TimeUnit)); + /// + /// Gets or sets the selected auto-refresh time. + /// + public AutoRefreshTimeInfo SelectedAutoRefreshTime + { + get; + set + { + if (value == field) + return; - _autoRefreshTimer.Tick += AutoRefreshTimer_Tick; + if (!_isLoading) + SettingsManager.Current.Listeners_AutoRefreshTime = value; - LoadSettings(); + field = value; - _isLoading = false; + if (AutoRefreshEnabled) + { + _autoRefreshTimer.Interval = AutoRefreshTime.CalculateTimeSpan(value); + _autoRefreshTimer.Start(); + } - Run(); + OnPropertyChanged(); } + } - private async Task Run() + /// + /// Gets or sets a value indicating whether the view model is currently refreshing. + /// + public bool IsRefreshing + { + get; + set { - await Refresh(); + if (value == field) + return; - if (AutoRefresh) - StartAutoRefreshTimer(); + field = value; + OnPropertyChanged(); } + } - - private void LoadSettings() + /// + /// Gets or sets a value indicating whether the status message is displayed. + /// + public bool IsStatusMessageDisplayed + { + get; + set { - AutoRefresh = SettingsManager.Current.Listeners_AutoRefresh; - } - #endregion - - #region ICommands & Actions - public ICommand RefreshCommand => new RelayCommand(p => RefreshAction(), Refresh_CanExecute); + if (value == field) + return; - private bool Refresh_CanExecute(object paramter) => Application.Current.MainWindow != null && !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen; + field = value; + OnPropertyChanged(); + } + } - private async Task RefreshAction() + /// + /// Gets or sets the status message. + /// + public string StatusMessage + { + get; + set { - IsStatusMessageDisplayed = false; + if (value == field) + return; - await Refresh(); + field = value; + OnPropertyChanged(); } + } - public ICommand CopySelectedProtocolCommand => new RelayCommand(p => CopySelectedProtocolAction()); + #endregion - private void CopySelectedProtocolAction() - { - ClipboardHelper.SetClipboard(SelectedListenerInfo.Protocol.ToString()); - } + #region ICommands & Actions - public ICommand CopySelectedIPAddressCommand => new RelayCommand(p => CopySelectedIPAddressAction()); + /// + /// Gets the command to refresh the listeners. + /// + public ICommand RefreshCommand => new RelayCommand(parameter => { _ = RefreshAction(); }, Refresh_CanExecute); - private void CopySelectedIPAddressAction() - { - ClipboardHelper.SetClipboard(SelectedListenerInfo.IPAddress.ToString()); - } + /// + /// Checks if the refresh command can be executed. + /// + /// The command parameter. + /// true if the command can be executed; otherwise, false. + private bool Refresh_CanExecute(object parameter) + { + return Application.Current.MainWindow != null && + !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && + !ConfigurationManager.Current.IsChildWindowOpen && + !IsRefreshing && + !AutoRefreshEnabled; + } - public ICommand CopySelectedPortCommand => new RelayCommand(p => CopySelectedPortAction()); + /// + /// Action to refresh the listeners. + /// + private async Task RefreshAction() + { + IsStatusMessageDisplayed = false; - private void CopySelectedPortAction() - { - ClipboardHelper.SetClipboard(SelectedListenerInfo.Port.ToString()); - } + await Refresh(); + } + + /// + /// Gets the command to export the listeners. + /// + public ICommand ExportCommand => new RelayCommand(parameter => { _ = ExportAction(); }); - public ICommand ExportCommand => new RelayCommand(p => ExportAction()); + /// + /// Action to export the listeners. + /// + private Task ExportAction() + { + var childWindow = new ExportChildWindow(); - private async Task ExportAction() + var childWindowViewModel = new ExportViewModel(async instance => { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.Export - }; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - var exportViewModel = new ExportViewModel(async instance => + try { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - - try - { - ExportManager.Export(instance.FilePath, instance.FileType, instance.ExportAll ? ListenerResults : new ObservableCollection(SelectedListenerInfos.Cast().ToArray())); - } - catch (Exception ex) - { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Localization.Resources.Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Error, Localization.Resources.Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); - } - - SettingsManager.Current.Listeners_ExportFileType = instance.FileType; - SettingsManager.Current.Listeners_ExportFilePath = instance.FilePath; - }, instance => { _dialogCoordinator.HideMetroDialogAsync(this, customDialog); }, new ExportManager.ExportFileType[] { ExportManager.ExportFileType.CSV, ExportManager.ExportFileType.XML, ExportManager.ExportFileType.JSON }, true, SettingsManager.Current.Listeners_ExportFileType, SettingsManager.Current.Listeners_ExportFilePath); - - customDialog.Content = new ExportDialog + ExportManager.Export(instance.FilePath, instance.FileType, + instance.ExportAll + ? Results + : new ObservableCollection(SelectedResults.Cast().ToArray())); + } + catch (Exception ex) { - DataContext = exportViewModel - }; + Log.Error("Error while exporting data as " + instance.FileType, ex); - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } - #endregion + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); + } - #region Methods - private async Task Refresh() + SettingsManager.Current.Listeners_ExportFileType = instance.FileType; + SettingsManager.Current.Listeners_ExportFilePath = instance.FilePath; + }, _ => { - IsRefreshing = true; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, [ + ExportFileType.Csv, ExportFileType.Xml, ExportFileType.Json + ], true, SettingsManager.Current.Listeners_ExportFileType, SettingsManager.Current.Listeners_ExportFilePath); - ListenerResults.Clear(); + childWindow.Title = Strings.Export; - (await Listener.GetAllActiveListenersAsync()).ForEach(x => ListenerResults.Add(x)); + childWindow.DataContext = childWindowViewModel; - IsRefreshing = false; - } + ConfigurationManager.Current.IsChildWindowOpen = true; - private void ChangeAutoRefreshTimerInterval(TimeSpan timeSpan) - { - _autoRefreshTimer.Interval = timeSpan; - } - - private void StartAutoRefreshTimer() - { - ChangeAutoRefreshTimerInterval(AutoRefreshTime.CalculateTimeSpan(SelectedAutoRefreshTime)); + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } - _autoRefreshTimer.Start(); - } + #endregion - private void StopAutoRefreshTimer() - { - _autoRefreshTimer.Stop(); - } + #region Methods - private void PauseAutoRefreshTimer() - { - if (!_autoRefreshTimer.IsEnabled) - return; + /// + /// Refreshes the listeners. + /// + /// Indicates whether this is the initial refresh. + private async Task Refresh(bool init = false) + { + IsRefreshing = true; - _autoRefreshTimer.Stop(); - _isTimerPaused = true; - } + StatusMessage = Strings.RefreshingDots; + IsStatusMessageDisplayed = true; - private void ResumeAutoRefreshTimer() - { - if (!_isTimerPaused) - return; + if (init == false) + await Task.Delay(GlobalStaticConfiguration.ApplicationUIRefreshInterval); - _autoRefreshTimer.Start(); - _isTimerPaused = false; - } - public void OnViewHide() - { - PauseAutoRefreshTimer(); - } + Results.Clear(); - public void OnViewVisible() - { - ResumeAutoRefreshTimer(); - } - #endregion + (await Listener.GetAllActiveListenersAsync()).ForEach(Results.Add); - #region Events - private async void AutoRefreshTimer_Tick(object sender, EventArgs e) - { - // Stop timer... - _autoRefreshTimer.Stop(); + StatusMessage = string.Format(Strings.ReloadedAtX, DateTime.Now.ToShortTimeString()); + IsStatusMessageDisplayed = true; - // Refresh - await Refresh(); + IsRefreshing = false; + } - // Restart timer... + /// + /// Called when the view becomes visible. + /// + public void OnViewVisible() + { + // Restart timer... + if (AutoRefreshEnabled) _autoRefreshTimer.Start(); - } - #endregion } + + /// + /// Called when the view is hidden. + /// + public void OnViewHide() + { + // Temporarily stop timer... + if (AutoRefreshEnabled) + _autoRefreshTimer.Stop(); + } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/LookupHostViewModel.cs b/Source/NETworkManager/ViewModels/LookupHostViewModel.cs index 27e4b692b7..5230198517 100644 --- a/Source/NETworkManager/ViewModels/LookupHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/LookupHostViewModel.cs @@ -1,9 +1,21 @@ -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +/// +/// View model for the lookup host view. +/// +public class LookupHostViewModel : ViewModelBase { - public class LookupHostViewModel : ViewModelBase + /// + /// Called when the view becomes visible. + /// + public void OnViewVisible() { - public LookupHostViewModel() - { - } } -} + + /// + /// Called when the view is hidden. + /// + public void OnViewHide() + { + } +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/LookupOUILookupViewModel.cs b/Source/NETworkManager/ViewModels/LookupOUILookupViewModel.cs index f19e0070d7..fdd320882b 100644 --- a/Source/NETworkManager/ViewModels/LookupOUILookupViewModel.cs +++ b/Source/NETworkManager/ViewModels/LookupOUILookupViewModel.cs @@ -1,255 +1,323 @@ -using System; -using System.Collections; -using System.Windows.Input; -using System.Collections.ObjectModel; -using NETworkManager.Settings; -using System.Collections.Generic; -using System.Text.RegularExpressions; -using System.ComponentModel; -using System.Windows.Data; -using NETworkManager.Models.Lookup; -using System.Linq; -using System.Windows; +using log4net; using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Localization.Resources; using NETworkManager.Models.Export; +using NETworkManager.Models.Lookup; +using NETworkManager.Settings; using NETworkManager.Utilities; using NETworkManager.Views; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Linq; +using System.Text.RegularExpressions; using System.Threading.Tasks; +using System.Windows; +using System.Windows.Data; +using System.Windows.Input; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +/// +/// View model for the OUI lookup view. +/// +public class LookupOUILookupViewModel : ViewModelBase { - public class LookupOUILookupViewModel : ViewModelBase + #region Constructor, Load settings + + /// + /// Initializes a new instance of the class. + /// + public LookupOUILookupViewModel() { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - - private string _macOrVendorAddress; - public string MACAddressOrVendor + // Search history + SearchHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.Lookup_OUI_SearchHistory); + + // Result view + ResultsView = CollectionViewSource.GetDefaultView(Results); + ResultsView.SortDescriptions.Add(new SortDescription(nameof(OUIInfo.MACAddress), ListSortDirection.Ascending)); + } + + #endregion + + #region Methods + + /// + /// Adds the search term to the history. + /// + /// The MAC address or vendor. + private void AddSearchToHistory(string macAddressOrVendor) + { + // Create the new list + var list = ListHelper.Modify(SettingsManager.Current.Lookup_OUI_SearchHistory.ToList(), + macAddressOrVendor, SettingsManager.Current.General_HistoryListEntries); + + // Clear the old items + SettingsManager.Current.Lookup_OUI_SearchHistory.Clear(); + OnPropertyChanged( + nameof(Search)); // Raise property changed again, after the collection has been cleared + + // Fill with the new items + list.ForEach(x => SettingsManager.Current.Lookup_OUI_SearchHistory.Add(x)); + } + + #endregion + + #region Variables + + /// + /// The logger. + /// + private static readonly ILog Log = LogManager.GetLogger(typeof(LookupOUILookupViewModel)); + + /// + /// Gets or sets the search query. + /// + public string Search + { + get; + set { - get => _macOrVendorAddress; - set - { - if (value == _macOrVendorAddress) - return; + if (value == field) + return; - _macOrVendorAddress = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _macAddressOrVendorHasError; - public bool MACAddressOrVendorHasError + /// + /// Gets or sets a value indicating whether there is a validation error. + /// + public bool HasError + { + get; + set { - get => _macAddressOrVendorHasError; - set - { - if (value == _macAddressOrVendorHasError) - return; + if (value == field) + return; - _macAddressOrVendorHasError = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - public ICollectionView MACAddressOrVendorHistoryView { get; } + /// + /// Gets the search history view. + /// + public ICollectionView SearchHistoryView { get; } - private bool _isLookupRunning; - public bool IsLookupRunning + /// + /// Gets or sets a value indicating whether the lookup is running. + /// + public bool IsRunning + { + get; + set { - get => _isLookupRunning; - set - { - if (value == _isLookupRunning) - return; + if (value == field) + return; - _isLookupRunning = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private ObservableCollection _ouiLookupResults = new ObservableCollection(); - public ObservableCollection OUILookupResults + /// + /// Gets or sets the search results. + /// + public ObservableCollection Results + { + get; + set { - get => _ouiLookupResults; - set - { - if (value != null && value == _ouiLookupResults) - return; + if (value != null && value == field) + return; - _ouiLookupResults = value; - } + field = value; } + } = new(); - public ICollectionView OUILookupResultsView { get; } + /// + /// Gets the results view. + /// + public ICollectionView ResultsView { get; } - private OUIInfo _selectedOUILookupResult; - public OUIInfo SelectedOUILookupResult + /// + /// Gets or sets the selected result. + /// + public OUIInfo SelectedResult + { + get; + set { - get => _selectedOUILookupResult; - set - { - if (value == _selectedOUILookupResult) - return; + if (value == field) + return; - _selectedOUILookupResult = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private IList _selectedOUILookupResults = new ArrayList(); - public IList SelectedOUILookupResults + /// + /// Gets or sets the list of selected results. + /// + public IList SelectedResults + { + get; + set { - get => _selectedOUILookupResults; - set - { - if (Equals(value, _selectedOUILookupResults)) - return; + if (Equals(value, field)) + return; - _selectedOUILookupResults = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = new ArrayList(); - private bool _noVendorFound; - public bool NoVendorFound + /// + /// Gets or sets a value indicating whether no results were found. + /// + public bool NothingFound + { + get; + set { - get => _noVendorFound; - set - { - if (value == _noVendorFound) - return; + if (value == field) + return; - _noVendorFound = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion - - #region Constructor, Load settings - public LookupOUILookupViewModel(IDialogCoordinator instance) - { - _dialogCoordinator = instance; + } - // Set collection view - MACAddressOrVendorHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.Lookup_OUI_MACAddressOrVendorHistory); - OUILookupResultsView = CollectionViewSource.GetDefaultView(OUILookupResults); - } - #endregion + #endregion - #region ICommands & Actions - public ICommand OUILookupCommand => new RelayCommand(p => OUILookupAction(), OUILookup_CanExecute); + #region ICommands & Actions - private bool OUILookup_CanExecute(object parameter) => Application.Current.MainWindow != null && !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && !MACAddressOrVendorHasError; + /// + /// Gets the command to perform the OUI lookup. + /// + public ICommand OUILookupCommand => new RelayCommand(_ => OUILookupAction(), OUILookup_CanExecute); - private async void OUILookupAction() - { - IsLookupRunning = true; + /// + /// Checks if the OUI lookup command can be executed. + /// + /// The command parameter. + /// true if the command can be executed; otherwise, false. + private bool OUILookup_CanExecute(object parameter) + { + return Application.Current.MainWindow != null && + !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && + !ConfigurationManager.Current.IsChildWindowOpen && + !HasError; + } - OUILookupResults.Clear(); + /// + /// Performs the OUI lookup. + /// + private async void OUILookupAction() + { + IsRunning = true; - var vendors = new List(); + Results.Clear(); - foreach (var macAddressOrVendor in MACAddressOrVendor.Split(';')) - { - var macAddressOrVendor1 = macAddressOrVendor.Trim(); - - if (Regex.IsMatch(macAddressOrVendor1, RegexHelper.MACAddressRegex) || Regex.IsMatch(macAddressOrVendor1, RegexHelper.MACAddressFirst3BytesRegex)) - { - foreach (var info in await OUILookup.LookupAsync(macAddressOrVendor1)) - { - OUILookupResults.Add(info); - } - } - else - { - vendors.Add(macAddressOrVendor1); - } - } + var macAddresses = new HashSet(); + var vendors = new HashSet(); - foreach (var info in await OUILookup.LookupByVendorAsync(vendors)) - { - OUILookupResults.Add(info); - } + // Parse the input + foreach (var search in Search.Split(';')) + { + var searchTrim = search.Trim(); - if (OUILookupResults.Count == 0) - { - NoVendorFound = true; - } + if (Regex.IsMatch(searchTrim, RegexHelper.MACAddressRegex) || + Regex.IsMatch(searchTrim, RegexHelper.MACAddressFirst3BytesRegex)) + macAddresses.Add(searchTrim); else - { - AddMACAddressOrVendorToHistory(MACAddressOrVendor); - NoVendorFound = false; - } - - IsLookupRunning = false; + vendors.Add(searchTrim); } - public ICommand CopySelectedMACAddressCommand => new RelayCommand(p => CopySelectedMACAddressAction()); + // Temporary collection to avoid duplicate entries + var results = new HashSet(); - private void CopySelectedMACAddressAction() - { - ClipboardHelper.SetClipboard(SelectedOUILookupResult.MACAddress); - } + // Get OUI information's by MAC-Address + // ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator (Doesn't work with async/await) + foreach (var macAddress in macAddresses) + foreach (var info in await OUILookup.LookupByMacAddressAsync(macAddress)) + results.Add(info); - public ICommand CopySelectedVendorCommand => new RelayCommand(p => CopySelectedVendorAction()); + // Get OUI information's by Vendor + foreach (var info in await OUILookup.SearchByVendorsAsync(vendors)) results.Add(info); - private void CopySelectedVendorAction() - { - ClipboardHelper.SetClipboard(SelectedOUILookupResult.Vendor); - } + // Add the results to the collection + foreach (var result in results) + Results.Add(result); - public ICommand ExportCommand => new RelayCommand(p => ExportAction()); + // Show a message if no vendor was found + NothingFound = Results.Count == 0; - private async Task ExportAction() - { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.Export - }; + // Add the MAC-Address or Vendor to the history + AddSearchToHistory(Search); - var exportViewModel = new ExportViewModel(async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + IsRunning = false; + } - try - { - ExportManager.Export(instance.FilePath, instance.FileType, instance.ExportAll ? OUILookupResults : new ObservableCollection(SelectedOUILookupResults.Cast().ToArray())); - } - catch (Exception ex) - { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Localization.Resources.Strings.OK; + /// + /// Gets the command to export the results. + /// + public ICommand ExportCommand => new RelayCommand(parameter => { _ = ExportAction(); }); - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Error, Localization.Resources.Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); - } + /// + /// Exports the results. + /// + /// A task representing the asynchronous operation. + private Task ExportAction() + { + var childWindow = new ExportChildWindow(); - SettingsManager.Current.Lookup_OUI_ExportFileType = instance.FileType; - SettingsManager.Current.Lookup_OUI_ExportFilePath = instance.FilePath; - }, instance => { _dialogCoordinator.HideMetroDialogAsync(this, customDialog); }, new ExportManager.ExportFileType[] { ExportManager.ExportFileType.CSV, ExportManager.ExportFileType.XML, ExportManager.ExportFileType.JSON }, true, SettingsManager.Current.Lookup_OUI_ExportFileType, SettingsManager.Current.Lookup_OUI_ExportFilePath); + var childWindowViewModel = new ExportViewModel(async instance => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - customDialog.Content = new ExportDialog + try + { + ExportManager.Export(instance.FilePath, instance.FileType, + instance.ExportAll + ? Results + : new ObservableCollection(SelectedResults.Cast().ToArray())); + } + catch (Exception ex) { - DataContext = exportViewModel - }; + Log.Error("Error while exporting data as " + instance.FileType, ex); - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } - #endregion + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); + } - #region Methods - private void AddMACAddressOrVendorToHistory(string macAddressOrVendor) + SettingsManager.Current.Lookup_OUI_ExportFileType = instance.FileType; + SettingsManager.Current.Lookup_OUI_ExportFilePath = instance.FilePath; + }, _ => { - // Create the new list - var list = ListHelper.Modify(SettingsManager.Current.Lookup_OUI_MACAddressOrVendorHistory.ToList(), macAddressOrVendor, SettingsManager.Current.General_HistoryListEntries); + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, + [ + ExportFileType.Csv, ExportFileType.Xml, ExportFileType.Json + ], true, SettingsManager.Current.Lookup_OUI_ExportFileType, SettingsManager.Current.Lookup_OUI_ExportFilePath); - // Clear the old items - SettingsManager.Current.Lookup_OUI_MACAddressOrVendorHistory.Clear(); - OnPropertyChanged(nameof(MACAddressOrVendor)); // Raise property changed again, after the collection has been cleared + childWindow.Title = Strings.Export; - // Fill with the new items - list.ForEach(x => SettingsManager.Current.Lookup_OUI_MACAddressOrVendorHistory.Add(x)); - } - #endregion + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/LookupPortViewModel.cs b/Source/NETworkManager/ViewModels/LookupPortViewModel.cs index a594c266c1..62e6aea1e6 100644 --- a/Source/NETworkManager/ViewModels/LookupPortViewModel.cs +++ b/Source/NETworkManager/ViewModels/LookupPortViewModel.cs @@ -1,304 +1,384 @@ -using System; -using System.Collections; -using System.Windows.Input; -using System.Collections.ObjectModel; -using NETworkManager.Settings; -using System.Collections.Generic; -using System.ComponentModel; -using System.Windows.Data; -using NETworkManager.Models.Lookup; -using System.Linq; -using System.Windows; +using log4net; using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Localization.Resources; using NETworkManager.Models.Export; +using NETworkManager.Models.Lookup; +using NETworkManager.Models.Network; +using NETworkManager.Settings; using NETworkManager.Utilities; using NETworkManager.Views; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Linq; +using System.Text.RegularExpressions; using System.Threading.Tasks; +using System.Windows; +using System.Windows.Data; +using System.Windows.Input; + +namespace NETworkManager.ViewModels; -namespace NETworkManager.ViewModels +/// +/// View model for the port lookup view. +/// +public class LookupPortLookupViewModel : ViewModelBase { - public class LookupPortLookupViewModel : ViewModelBase + #region Constructor, Load settings + + /// + /// Initializes a new instance of the class. + /// + public LookupPortLookupViewModel() { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; + SearchHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.Lookup_Port_SearchHistory); + ResultsView = CollectionViewSource.GetDefaultView(Results); + } + + #endregion + + #region Methods + + /// + /// Adds the search term to the history. + /// + /// The port or service. + private void AddSearchToHistory(string portOrService) + { + // Create the new list + var list = ListHelper.Modify(SettingsManager.Current.Lookup_Port_SearchHistory.ToList(), portOrService, + SettingsManager.Current.General_HistoryListEntries); + + // Clear the old items + SettingsManager.Current.Lookup_Port_SearchHistory.Clear(); + OnPropertyChanged(nameof(Search)); // Raise property changed again, after the collection has been cleared - private string _portOrService; - public string PortOrService + // Fill with the new items + list.ForEach(x => SettingsManager.Current.Lookup_Port_SearchHistory.Add(x)); + } + + #endregion + + #region Variables + + /// + /// The logger. + /// + private static readonly ILog Log = LogManager.GetLogger(typeof(LookupPortLookupViewModel)); + + /// + /// Gets or sets the search query. + /// + public string Search + { + get; + set { - get => _portOrService; - set - { - if (value == _portOrService) - return; + if (value == field) + return; - _portOrService = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _portOrServiceHasError; - public bool PortOrServiceHasError + /// + /// Gets or sets a value indicating whether there is a validation error. + /// + public bool HasError + { + get; + set { - get => _portOrServiceHasError; - set - { - if (value == _portOrServiceHasError) - return; - _portOrServiceHasError = value; - OnPropertyChanged(); - } + if (value == field) + return; + field = value; + OnPropertyChanged(); } + } - public ICollectionView PortsOrServicesHistoryView { get; } + /// + /// Gets the search history view. + /// + public ICollectionView SearchHistoryView { get; } - private bool _isLookupRunning; - public bool IsLookupRunning + /// + /// Gets or sets a value indicating whether the lookup is running. + /// + public bool IsRunning + { + get; + set { - get => _isLookupRunning; - set - { - if (value == _isLookupRunning) - return; + if (value == field) + return; - _isLookupRunning = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private ObservableCollection _portLookupResults = new ObservableCollection(); - public ObservableCollection PortLookupResults + /// + /// Gets or sets the search results. + /// + public ObservableCollection Results + { + get; + set { - get => _portLookupResults; - set - { - if (value != null && value == _portLookupResults) - return; + if (value != null && value == field) + return; - _portLookupResults = value; - } + field = value; + OnPropertyChanged(); } + } = new(); - public ICollectionView PortLookupResultsView { get; } + /// + /// Gets the results view. + /// + public ICollectionView ResultsView { get; } - private PortLookupInfo _selectedPortLookupResult; - public PortLookupInfo SelectedPortLookupResult + /// + /// Gets or sets the selected result. + /// + public PortLookupInfo SelectedResult + { + get; + set { - get => _selectedPortLookupResult; - set - { - if (value == _selectedPortLookupResult) - return; + if (value == field) + return; - _selectedPortLookupResult = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private IList _selectedPortLookupResults = new ArrayList(); - public IList SelectedPortLookupResults + /// + /// Gets or sets the list of selected results. + /// + public IList SelectedResults + { + get; + set { - get => _selectedPortLookupResults; - set - { - if (Equals(value, _selectedPortLookupResults)) - return; + if (Equals(value, field)) + return; - _selectedPortLookupResults = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = new ArrayList(); - private bool _noPortsFound; - public bool NoPortsFound - { - get => _noPortsFound; - set - { - if (value == _noPortsFound) - return; - - _noPortsFound = value; - OnPropertyChanged(); - } - } - #endregion - - #region Constructor, Load settings - public LookupPortLookupViewModel(IDialogCoordinator instance) + /// + /// Gets or sets a value indicating whether no results were found. + /// + public bool NothingFound + { + get; + set { - _dialogCoordinator = instance; + if (value == field) + return; - PortsOrServicesHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.Lookup_Port_PortsHistory); - PortLookupResultsView = CollectionViewSource.GetDefaultView(PortLookupResults); + field = value; + OnPropertyChanged(); } - #endregion + } - #region ICommands & Actions - public ICommand PortLookupCommand => new RelayCommand(p => PortLookupAction(), PortLookup_CanExecute); + #endregion - private bool PortLookup_CanExecute(object parameter) => Application.Current.MainWindow != null && !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && !PortOrServiceHasError; + #region ICommands & Actions - private async Task PortLookupAction() - { - IsLookupRunning = true; + /// + /// Gets the command to perform the port lookup. + /// + public ICommand PortLookupCommand => + new RelayCommand(parameter => { _ = PortLookupAction(); }, PortLookup_CanExecute); - PortLookupResults.Clear(); + /// + /// Checks if the port lookup command can be executed. + /// + /// The command parameter. + /// true if the command can be executed; otherwise, false. + private bool PortLookup_CanExecute(object parameter) + { + return Application.Current.MainWindow != null && + !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && + !ConfigurationManager.Current.IsChildWindowOpen && !HasError; + } - var portsByService = new List(); + /// + /// Performs the port lookup. + /// + private async Task PortLookupAction() + { + IsRunning = true; - foreach (var portOrService in PortOrService.Split(';')) - { - var portOrService1 = portOrService.Trim(); + Results.Clear(); - if (portOrService1.Contains("-")) - { - var portRange = portOrService1.Split('-'); + var ports = new HashSet(); + var portsAndProtocols = new HashSet>(); + var services = new HashSet(); - if (int.TryParse(portRange[0], out var startPort) && int.TryParse(portRange[1], out var endPort)) - { - if ((startPort > 0) && (startPort < 65536) && (endPort > 0) && (endPort < 65536) && (startPort < endPort)) - { - for (var i = startPort; i < endPort + 1; i++) - { - foreach (var info in await PortLookup.LookupAsync(i)) - { - PortLookupResults.Add(info); - } - } - } - else - { - portsByService.Add(portOrService1); - } + foreach (var search in Search.Split(';')) + { + var searchTrim = search.Trim(); - } - else - { - portsByService.Add(portOrService1); - } - } - else - { - if (int.TryParse(portOrService1, out int port)) + // Check if the search is a port number like 22 + if (Regex.IsMatch(searchTrim, "^[0-9]{1,5}$")) + if (int.TryParse(searchTrim, out var port)) + if (port is > 0 and < 65536) { - if (port > 0 && port < 65536) - { - foreach (var info in await PortLookup.LookupAsync(port)) - { - PortLookupResults.Add(info); - } - } - else - { - portsByService.Add(portOrService1); - } + ports.Add(port); + continue; } - else + + // Check if the search is a port number with protocol like 22/tcp + if (Regex.IsMatch(searchTrim, "^[0-9]{1,5}/(tcp|udp|sctp)$")) + { + var portAndProtocol = searchTrim.Split('/'); + + if (int.TryParse(portAndProtocol[0], out var port)) + if (port is > 0 and < 65536) { - portsByService.Add(portOrService1); + portsAndProtocols.Add(new Tuple(port, portAndProtocol[1])); + continue; } - } } - foreach (var info in await PortLookup.LookupByServiceAsync(portsByService)) + // Check if the search is a port range like 1-100 + if (Regex.IsMatch(searchTrim, "^[0-9]{1,5}-[0-9]{1,5}$")) { - PortLookupResults.Add(info); - } + var portRange = searchTrim.Split('-'); - if (PortLookupResults.Count == 0) - { - NoPortsFound = true; - } - else - { - AddPortOrServiceToHistory(PortOrService); - NoPortsFound = false; + if (int.TryParse(portRange[0], out var startPort) && int.TryParse(portRange[1], out var endPort)) + if (startPort is > 0 and < 65536 && endPort is > 0 and < 65536 && startPort < endPort) + { + for (var i = startPort; i < endPort + 1; i++) + ports.Add(i); + + continue; + } } - IsLookupRunning = false; - } + // Check if the search is a port range with protocol like 1-100/tcp + if (Regex.IsMatch(searchTrim, "^[0-9]{1,5}-[0-9]{1,5}/(tcp|udp|sctp)$")) + { + var portRangeAndProtocol = searchTrim.Split('/'); - public ICommand CopySelectedPortCommand => new RelayCommand(p => CopySelectedPortAction()); + var portRange = portRangeAndProtocol[0].Split('-'); - private void CopySelectedPortAction() - { - ClipboardHelper.SetClipboard(SelectedPortLookupResult.Number.ToString()); - } + if (int.TryParse(portRange[0], out var startPort) && int.TryParse(portRange[1], out var endPort)) + if (startPort is > 0 and < 65536 && endPort is > 0 and < 65536 && startPort < endPort) + { + for (var i = startPort; i < endPort + 1; i++) + portsAndProtocols.Add(new Tuple(i, portRangeAndProtocol[1])); - public ICommand CopySelectedProtocolCommand => new RelayCommand(p => CopySelectedProtocolAction()); + continue; + } + } - private void CopySelectedProtocolAction() - { - ClipboardHelper.SetClipboard(SelectedPortLookupResult.Protocol.ToString()); + // Assume that everything else is a service like ssh + services.Add(searchTrim); } - public ICommand CopySelectedServiceCommand => new RelayCommand(p => CopySelectedServiceAction()); + // Temporary collection to avoid duplicate entries + var results = new HashSet(); + + // Get Port information's by port number + // ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator (Doesn't work with async/await) + foreach (var port in ports) + foreach (var info in await PortLookup.LookupByPortAsync(port)) + results.Add(info); + + // Get Port information's by port number and protocol + // ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator (Doesn't work with async/await) + foreach (var portAndProtocol in portsAndProtocols) + results.Add( + await PortLookup.LookupByPortAndProtocolAsync( + portAndProtocol.Item1, + (TransportProtocol)Enum.Parse(typeof(TransportProtocol), portAndProtocol.Item2, true)) + ); + + // Get Port information's by service + // ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator (Doesn't work with async/await) + foreach (var service in services) + foreach (var info in await PortLookup.SearchByServiceAsync(service)) + results.Add(info); + + // Add the results to the collection + foreach (var result in results) + Results.Add(result); + + // Show a message if no vendor was found + NothingFound = Results.Count == 0; + + // Add the MAC-Address or Vendor to the history + AddSearchToHistory(Search); + + IsRunning = false; + } - private void CopySelectedServiceAction() - { - ClipboardHelper.SetClipboard(SelectedPortLookupResult.Service); - } + /// + /// Gets the command to export the results. + /// + public ICommand ExportCommand => new RelayCommand(parameter => { _ = ExportAction(); }); - public ICommand CopySelectedDescriptionCommand => new RelayCommand(p => CopySelectedDescriptionAction()); + /// + /// Exports the results. + /// + /// A task representing the asynchronous operation. + private Task ExportAction() + { + var childWindow = new ExportChildWindow(); - private void CopySelectedDescriptionAction() + var childWindowViewModel = new ExportViewModel(async instance => { - ClipboardHelper.SetClipboard(SelectedPortLookupResult.Description); - } + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - public ICommand ExportCommand => new RelayCommand(p => ExportAction()); - - private async Task ExportAction() - { - var customDialog = new CustomDialog + try { - Title = Localization.Resources.Strings.Export - }; - - var exportViewModel = new ExportViewModel(async instance => + ExportManager.Export(instance.FilePath, instance.FileType, + instance.ExportAll + ? Results + : new ObservableCollection(SelectedResults.Cast() + .ToArray())); + } + catch (Exception ex) { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + Log.Error("Error while exporting data as " + instance.FileType, ex); - try - { - ExportManager.Export(instance.FilePath, instance.FileType, instance.ExportAll ? PortLookupResults : new ObservableCollection(SelectedPortLookupResults.Cast().ToArray())); - } - catch (Exception ex) - { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Localization.Resources.Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Error, Localization.Resources.Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); - } - - SettingsManager.Current.Lookup_Port_ExportFileType = instance.FileType; - SettingsManager.Current.Lookup_Port_ExportFilePath = instance.FilePath; - }, instance => { _dialogCoordinator.HideMetroDialogAsync(this, customDialog); }, new ExportManager.ExportFileType[] { ExportManager.ExportFileType.CSV, ExportManager.ExportFileType.XML, ExportManager.ExportFileType.JSON }, true, SettingsManager.Current.Lookup_Port_ExportFileType, SettingsManager.Current.Lookup_Port_ExportFilePath); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); + } - customDialog.Content = new ExportDialog - { - DataContext = exportViewModel - }; + SettingsManager.Current.Lookup_Port_ExportFileType = instance.FileType; + SettingsManager.Current.Lookup_Port_ExportFilePath = instance.FilePath; + }, _ => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, [ + ExportFileType.Csv, ExportFileType.Xml, ExportFileType.Json + ], true, SettingsManager.Current.Lookup_Port_ExportFileType, + SettingsManager.Current.Lookup_Port_ExportFilePath); - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } - #endregion + childWindow.Title = Strings.Export; - #region Methods - private void AddPortOrServiceToHistory(string portOrService) - { - // Create the new list - var list = ListHelper.Modify(SettingsManager.Current.Lookup_Port_PortsHistory.ToList(), portOrService, SettingsManager.Current.General_HistoryListEntries); + childWindow.DataContext = childWindowViewModel; - // Clear the old items - SettingsManager.Current.Lookup_Port_PortsHistory.Clear(); - OnPropertyChanged(nameof(PortOrService)); // Raise property changed again, after the collection has been cleared + ConfigurationManager.Current.IsChildWindowOpen = true; - // Fill with the new items - list.ForEach(x => SettingsManager.Current.Lookup_Port_PortsHistory.Add(x)); - } - #endregion + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/MessageConfirmationViewModel.cs b/Source/NETworkManager/ViewModels/MessageConfirmationViewModel.cs new file mode 100644 index 0000000000..3c3715bd75 --- /dev/null +++ b/Source/NETworkManager/ViewModels/MessageConfirmationViewModel.cs @@ -0,0 +1,106 @@ +using NETworkManager.Utilities; +using System; +using System.Windows.Input; + +namespace NETworkManager.ViewModels; + +/// +/// Represents the ViewModel for a message dialog with OK and Cancel options. +/// +public class MessageConfirmationViewModel : ViewModelBase +{ + /// + /// Initializes a new instance of the class. + /// + /// The action to execute when the confirm button is clicked. + /// The action to execute when the Cancel button is clicked. + /// The message to display. + /// The icon to display in the message window. + /// The text for the confirm button. + /// The text for the cancel button. + public MessageConfirmationViewModel(Action confirmCommand, + Action cancelHandler, string message, ChildWindowIcon icon = ChildWindowIcon.Info, string confirmButtonText = null, string cancelButtonText = null) + { + ConfirmCommand = new RelayCommand(_ => confirmCommand(this)); + CancelCommand = new RelayCommand(_ => cancelHandler(this)); + + Message = message; + + ConfirmButtonText = confirmButtonText ?? Localization.Resources.Strings.OK; + CancelButtonText = cancelButtonText ?? Localization.Resources.Strings.Cancel; + } + + /// + /// Gets the command for the OK button. + /// + public ICommand ConfirmCommand { get; } + + /// + /// Gets the command for the Cancel button. + /// + public ICommand CancelCommand { get; } + + /// + /// Gets the message to display. + /// + public string Message + { + get; + private init + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets the text for the confirm button. + /// + public string ConfirmButtonText + { + get; + private init + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets the text for the cancel button. + /// + public string CancelButtonText + { + get; + private init + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets the icon to display. + /// + public ChildWindowIcon Icon + { + get; + private init + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/MessageViewModel.cs b/Source/NETworkManager/ViewModels/MessageViewModel.cs new file mode 100644 index 0000000000..8164225a0b --- /dev/null +++ b/Source/NETworkManager/ViewModels/MessageViewModel.cs @@ -0,0 +1,81 @@ +using NETworkManager.Utilities; +using System; +using System.Windows.Input; + +namespace NETworkManager.ViewModels; + +/// +/// Represents the ViewModel for a message dialog with an OK option. +/// +public class MessageViewModel : ViewModelBase +{ + /// + /// Initializes a new instance of the class. + /// + /// The action to execute when the confirm button is clicked. + /// The message to display. + /// The icon to display in the message window. + /// The text for the OK button. + public MessageViewModel(Action confirmCommand, string message, ChildWindowIcon icon = ChildWindowIcon.Info, string confirmButtonText = null) + { + ConfirmCommand = new RelayCommand(_ => confirmCommand(this)); + + Message = message; + + ConfirmButtonText = confirmButtonText ?? Localization.Resources.Strings.OK; + Icon = icon; + } + + /// + /// Gets the command for the OK button. + /// + public ICommand ConfirmCommand { get; } + + /// + /// Gets the message to display. + /// + public string Message + { + get; + private init + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets the text for the confirm button. + /// + public string ConfirmButtonText + { + get; + private init + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets the icon to display. + /// + public ChildWindowIcon Icon + { + get; + private init + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } +} diff --git a/Source/NETworkManager/ViewModels/NeighborTableAddEntryViewModel.cs b/Source/NETworkManager/ViewModels/NeighborTableAddEntryViewModel.cs new file mode 100644 index 0000000000..2ae3608504 --- /dev/null +++ b/Source/NETworkManager/ViewModels/NeighborTableAddEntryViewModel.cs @@ -0,0 +1,104 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Input; +using NETworkManager.Settings; +using NETworkManager.Utilities; + +namespace NETworkManager.ViewModels; + +/// +/// View model for adding a neighbor table entry. +/// +public class NeighborTableAddEntryViewModel : ViewModelBase +{ + /// + /// Initializes a new instance of the class. + /// + /// The action to execute when the add command is invoked. + /// The action to execute when the cancel command is invoked. + /// Available network interfaces to select from. + public NeighborTableAddEntryViewModel(Action addCommand, + Action cancelHandler, + List> interfaces) + { + AddCommand = new RelayCommand(_ => addCommand(this)); + CancelCommand = new RelayCommand(_ => cancelHandler(this)); + + Interfaces = interfaces; + + if (interfaces.Count > 0) + { + var lastUsed = interfaces.FirstOrDefault(x => + x.Value == SettingsManager.Current.NeighborTable_InterfaceName); + + SelectedInterface = lastUsed.Value != null ? lastUsed : interfaces[0]; + } + } + + /// + /// Gets the command to add the entry. + /// + public ICommand AddCommand { get; } + + /// + /// Gets the command to cancel the operation. + /// + public ICommand CancelCommand { get; } + + /// + /// Gets or sets the IP address. + /// + public string IPAddress + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets or sets the MAC address. + /// + public string MACAddress + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets the list of available network interfaces. + /// + public List> Interfaces { get; } + + /// + /// Gets or sets the selected network interface. + /// + public KeyValuePair SelectedInterface + { + get; + set + { + if (value.Equals(field)) + return; + + field = value; + + SettingsManager.Current.NeighborTable_InterfaceName = value.Value; + + OnPropertyChanged(); + } + } +} diff --git a/Source/NETworkManager/ViewModels/NeighborTableViewModel.cs b/Source/NETworkManager/ViewModels/NeighborTableViewModel.cs new file mode 100644 index 0000000000..905d09ae13 --- /dev/null +++ b/Source/NETworkManager/ViewModels/NeighborTableViewModel.cs @@ -0,0 +1,501 @@ +using log4net; +using MahApps.Metro.Controls; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Localization.Resources; +using NETworkManager.Models.Export; +using NETworkManager.Models.Network; +using NETworkManager.Settings; +using NETworkManager.Utilities; +using NETworkManager.Views; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Linq; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Data; +using System.Windows.Input; +using System.Windows.Threading; + +namespace NETworkManager.ViewModels; + +/// +/// View model for the neighbor table view (IPv4 ARP + IPv6 NDP). +/// +public class NeighborTableViewModel : ViewModelBase +{ + #region Contructor, load settings + + /// + /// Initializes a new instance of the class. + /// + public NeighborTableViewModel() + { + _isLoading = true; + + // Result view + search + ResultsView = CollectionViewSource.GetDefaultView(Results); + + ((ListCollectionView)ResultsView).CustomSort = Comparer.Create((x, y) => + IPAddressHelper.CompareIPAddresses(x.IPAddress, y.IPAddress)); + + ResultsView.Filter = o => + { + if (string.IsNullOrEmpty(Search)) + return true; + + if (o is not NeighborInfo info) + return false; + + var stateLocalized = ResourceTranslate(info.State); + + return info.IPAddress.ToString().IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || + info.MACAddress.ToString().IndexOf(Search.Replace("-", "").Replace(":", ""), + StringComparison.OrdinalIgnoreCase) > -1 || + (info.InterfaceAlias ?? string.Empty).IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || + info.State.ToString().IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || + stateLocalized.IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || + (info.IsMulticast ? Strings.Yes : Strings.No).IndexOf( + Search, StringComparison.OrdinalIgnoreCase) > -1; + }; + + // Get neighbor table + _ = Refresh(true); + + // Auto refresh + _autoRefreshTimer.Tick += AutoRefreshTimer_Tick; + + AutoRefreshTimes = CollectionViewSource.GetDefaultView(AutoRefreshTime.GetDefaults); + SelectedAutoRefreshTime = AutoRefreshTimes.SourceCollection.Cast().FirstOrDefault(x => + x.Value == SettingsManager.Current.NeighborTable_AutoRefreshTime.Value && + x.TimeUnit == SettingsManager.Current.NeighborTable_AutoRefreshTime.TimeUnit); + AutoRefreshEnabled = SettingsManager.Current.NeighborTable_AutoRefreshEnabled; + + _isLoading = false; + } + + private static string ResourceTranslate(NeighborState state) + { + return Localization.ResourceTranslator.Translate(Localization.ResourceIdentifier.NeighborState, state); + } + #endregion + + #region Variables + + private static readonly ILog Log = LogManager.GetLogger(typeof(NeighborTableViewModel)); + + private readonly bool _isLoading; + + private readonly DispatcherTimer _autoRefreshTimer = new(); + + public string Search + { + get; + set + { + if (value == field) + return; + + field = value; + + ResultsView.Refresh(); + + OnPropertyChanged(); + } + } + + public ObservableCollection Results + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = []; + + public ICollectionView ResultsView { get; } + + public NeighborInfo SelectedResult + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public IList SelectedResults + { + get; + set + { + if (Equals(value, field)) + return; + + field = value; + OnPropertyChanged(); + } + } = new ArrayList(); + + public bool AutoRefreshEnabled + { + get; + set + { + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.NeighborTable_AutoRefreshEnabled = value; + + field = value; + + if (value) + { + _autoRefreshTimer.Interval = AutoRefreshTime.CalculateTimeSpan(SelectedAutoRefreshTime); + _autoRefreshTimer.Start(); + } + else + { + _autoRefreshTimer.Stop(); + } + + OnPropertyChanged(); + } + } + + public ICollectionView AutoRefreshTimes { get; } + + public AutoRefreshTimeInfo SelectedAutoRefreshTime + { + get; + set + { + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.NeighborTable_AutoRefreshTime = value; + + field = value; + + if (AutoRefreshEnabled) + { + _autoRefreshTimer.Interval = AutoRefreshTime.CalculateTimeSpan(value); + _autoRefreshTimer.Start(); + } + + OnPropertyChanged(); + } + } + + public bool IsRefreshing + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public bool IsModifying + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public bool IsStatusMessageDisplayed + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public string StatusMessage + { + get; + private set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + #endregion + + #region ICommands & Actions + + public ICommand RefreshCommand => new RelayCommand(parameter => { _ = RefreshAction(); }, Refresh_CanExecute); + + private bool Refresh_CanExecute(object parameter) + { + return Application.Current.MainWindow != null && + !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && + !ConfigurationManager.Current.IsChildWindowOpen && + !IsRefreshing && + !IsModifying && + !AutoRefreshEnabled; + } + + private async Task RefreshAction() + { + IsStatusMessageDisplayed = false; + + await Refresh(); + } + + public ICommand DeleteTableCommand => + new RelayCommand(parameter => { _ = DeleteTableAction(); }, ModifyEntry_CanExecute); + + private async Task DeleteTableAction() + { + IsModifying = true; + IsStatusMessageDisplayed = false; + + try + { + await NeighborTable.DeleteTableAsync(); + + await Refresh(); + } + catch (Exception ex) + { + StatusMessage = ex.Message; + IsStatusMessageDisplayed = true; + } + finally + { + IsModifying = false; + } + } + + public ICommand DeleteEntryCommand => + new RelayCommand(parameter => { _ = DeleteEntryAction(); }, ModifyEntry_CanExecute); + + private async Task DeleteEntryAction() + { + IsModifying = true; + IsStatusMessageDisplayed = false; + + try + { + await NeighborTable.DeleteEntryAsync(SelectedResult.IPAddress.ToString(), SelectedResult.InterfaceIndex); + + await Refresh(); + } + catch (Exception ex) + { + StatusMessage = ex.Message; + IsStatusMessageDisplayed = true; + } + finally + { + IsModifying = false; + } + } + + public ICommand AddEntryCommand => + new RelayCommand(parameter => { _ = AddEntryAction(); }, ModifyEntry_CanExecute); + + private async Task AddEntryAction() + { + IsModifying = true; + IsStatusMessageDisplayed = false; + + var interfaces = await NeighborTable.GetInterfacesAsync(); + + var childWindow = new NeighborTableAddEntryChildWindow(); + + var childWindowViewModel = new NeighborTableAddEntryViewModel(async instance => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + try + { + await NeighborTable.AddEntryAsync(instance.IPAddress, MACAddressHelper.Format(instance.MACAddress, "-"), instance.SelectedInterface.Key); + + await Refresh(); + } + catch (Exception ex) + { + StatusMessage = ex.Message; + IsStatusMessageDisplayed = true; + } + finally + { + IsModifying = false; + } + }, _ => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + IsModifying = false; + }, interfaces); + + childWindow.Title = Strings.AddEntry; + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } + + private bool ModifyEntry_CanExecute(object parameter) + { + return ConfigurationManager.Current.IsAdmin && + Application.Current.MainWindow != null && + !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && + !ConfigurationManager.Current.IsChildWindowOpen && + !IsRefreshing && + !IsModifying; + } + + public ICommand RestartAsAdminCommand => new RelayCommand(parameter => { _ = RestartAsAdminAction(); }); + + private async Task RestartAsAdminAction() + { + try + { + (Application.Current.MainWindow as MainWindow)?.RestartApplication(true); + } + catch (Exception ex) + { + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, ex.Message, + ChildWindowIcon.Error); + } + } + + public ICommand ExportCommand => new RelayCommand(parameter => { _ = ExportAction(); }); + + private Task ExportAction() + { + var childWindow = new ExportChildWindow(); + + var childWindowViewModel = new ExportViewModel(async instance => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + try + { + ExportManager.Export(instance.FilePath, instance.FileType, + instance.ExportAll + ? Results + : new ObservableCollection(SelectedResults.Cast().ToArray())); + } + catch (Exception ex) + { + Log.Error("Error while exporting data as " + instance.FileType, ex); + + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); + } + + SettingsManager.Current.NeighborTable_ExportFileType = instance.FileType; + SettingsManager.Current.NeighborTable_ExportFilePath = instance.FilePath; + }, _ => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, [ + ExportFileType.Csv, ExportFileType.Xml, ExportFileType.Json + ], true, SettingsManager.Current.NeighborTable_ExportFileType, + SettingsManager.Current.NeighborTable_ExportFilePath); + + childWindow.Title = Strings.Export; + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } + + #endregion + + #region Methods + + private async Task Refresh(bool init = false) + { + IsRefreshing = true; + + StatusMessage = Strings.RefreshingDots; + IsStatusMessageDisplayed = true; + + if (!init) + await Task.Delay(GlobalStaticConfiguration.ApplicationUIRefreshInterval); + + Results.Clear(); + + (await NeighborTable.GetTableAsync()).ForEach(Results.Add); + + StatusMessage = string.Format(Strings.ReloadedAtX, DateTime.Now.ToShortTimeString()); + IsStatusMessageDisplayed = true; + + IsRefreshing = false; + } + + public void OnViewVisible() + { + if (AutoRefreshEnabled) + _autoRefreshTimer.Start(); + } + + public void OnViewHide() + { + if (AutoRefreshEnabled) + _autoRefreshTimer.Stop(); + } + + #endregion + + #region Events + + private async void AutoRefreshTimer_Tick(object sender, EventArgs e) + { + _autoRefreshTimer.Stop(); + + // Skip refresh while a modify operation (add/delete) is in progress to avoid + // clearing the table while the user is interacting with it. + if (!IsModifying) + await Refresh(); + + _autoRefreshTimer.Start(); + } + + #endregion +} diff --git a/Source/NETworkManager/ViewModels/NetworkConnectionViewModel.cs b/Source/NETworkManager/ViewModels/NetworkConnectionViewModel.cs deleted file mode 100644 index da1e2bc69f..0000000000 --- a/Source/NETworkManager/ViewModels/NetworkConnectionViewModel.cs +++ /dev/null @@ -1,803 +0,0 @@ -using NETworkManager.Localization.Resources; -using NETworkManager.Models.Network; -using NETworkManager.Settings; -using NETworkManager.Utilities; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Net; -using System.Net.NetworkInformation; -using System.Net.Sockets; -using System.Text.RegularExpressions; -using System.Threading; -using System.Threading.Tasks; - -namespace NETworkManager.ViewModels -{ - public class NetworkConnectionViewModel : ViewModelBase - { - #region Variables - private bool _isChecking; - public bool IsChecking - { - get => _isChecking; - set - { - if (value == _isChecking) - return; - - _isChecking = value; - OnPropertyChanged(); - } - } - - #region Computer - private bool _isComputerIPv4Checking; - - public bool IsComputerIPv4Checking - { - get => _isComputerIPv4Checking; - set - { - if (value == _isComputerIPv4Checking) - return; - - _isComputerIPv4Checking = value; - OnPropertyChanged(); - } - } - - private string _computerIPv4; - public string ComputerIPv4 - { - get => _computerIPv4; - set - { - if (value == _computerIPv4) - return; - - _computerIPv4 = value; - OnPropertyChanged(); - } - } - - private ConnectionState _computerIPv4State = ConnectionState.None; - public ConnectionState ComputerIPv4State - { - get => _computerIPv4State; - set - { - if (value == _computerIPv4State) - return; - - _computerIPv4State = value; - OnPropertyChanged(); - } - } - - private bool _isComputerIPv6Checking; - public bool IsComputerIPv6Checking - { - get => _isComputerIPv6Checking; - set - { - if (value == _isComputerIPv6Checking) - return; - - _isComputerIPv6Checking = value; - OnPropertyChanged(); - } - } - - private string _computerIPv6; - public string ComputerIPv6 - { - get => _computerIPv6; - set - { - if (value == _computerIPv6) - return; - - _computerIPv6 = value; - OnPropertyChanged(); - } - } - - private ConnectionState _computerIPv6State = ConnectionState.None; - public ConnectionState ComputerIPv6State - { - get => _computerIPv6State; - set - { - if (value == _computerIPv6State) - return; - - _computerIPv6State = value; - OnPropertyChanged(); - } - } - - private bool _isComputerDNSChecking; - public bool IsComputerDNSChecking - { - get => _isComputerDNSChecking; - set - { - if (value == _isComputerDNSChecking) - return; - - _isComputerDNSChecking = value; - OnPropertyChanged(); - } - } - - private string _computerDNS; - public string ComputerDNS - { - get => _computerDNS; - set - { - if (value == _computerDNS) - return; - - _computerDNS = value; - OnPropertyChanged(); - } - } - - private ConnectionState _computerDNSState = ConnectionState.None; - public ConnectionState ComputerDNSState - { - get => _computerDNSState; - set - { - if (value == _computerDNSState) - return; - - _computerDNSState = value; - OnPropertyChanged(); - } - } - #endregion - - #region Router - private bool _isRouterIPv4Checking; - public bool IsRouterIPv4Checking - { - get => _isRouterIPv4Checking; - set - { - if (value == _isRouterIPv4Checking) - return; - - _isRouterIPv4Checking = value; - OnPropertyChanged(); - } - } - - private string _routerIPv4; - public string RouterIPv4 - { - get => _routerIPv4; - set - { - if (value == _routerIPv4) - return; - - _routerIPv4 = value; - OnPropertyChanged(); - } - } - - private ConnectionState _routerIPv4State = ConnectionState.None; - public ConnectionState RouterIPv4State - { - get => _routerIPv4State; - set - { - if (value == _routerIPv4State) - return; - - _routerIPv4State = value; - OnPropertyChanged(); - } - } - - private bool _isRouterIPv6Checking; - public bool IsRouterIPv6Checking - { - get => _isRouterIPv6Checking; - set - { - if (value == _isRouterIPv6Checking) - return; - - _isRouterIPv6Checking = value; - OnPropertyChanged(); - } - } - - private string _routerIPv6; - public string RouterIPv6 - { - get => _routerIPv6; - set - { - if (value == _routerIPv6) - return; - - _routerIPv6 = value; - OnPropertyChanged(); - } - } - - private ConnectionState _routerIPv6State = ConnectionState.None; - public ConnectionState RouterIPv6State - { - get => _routerIPv6State; - set - { - if (value == _routerIPv6State) - return; - - _routerIPv6State = value; - OnPropertyChanged(); - } - } - - private bool _isRouterDNSChecking; - public bool IsRouterDNSChecking - { - get => _isRouterDNSChecking; - set - { - if (value == _isRouterDNSChecking) - return; - - _isRouterDNSChecking = value; - OnPropertyChanged(); - } - } - - private string _routerDNS; - public string RouterDNS - { - get => _routerDNS; - set - { - if (value == _routerDNS) - return; - - _routerDNS = value; - OnPropertyChanged(); - } - } - - private ConnectionState _routerDNSState = ConnectionState.None; - public ConnectionState RouterDNSState - { - get => _routerDNSState; - set - { - if (value == _routerDNSState) - return; - - _routerDNSState = value; - OnPropertyChanged(); - } - } - #endregion - - #region Internet - private bool _isInternetIPv4Checking; - public bool IsInternetIPv4Checking - { - get => _isInternetIPv4Checking; - set - { - if (value == _isInternetIPv4Checking) - return; - - _isInternetIPv4Checking = value; - OnPropertyChanged(); - } - } - - private string _internetIPv4; - public string InternetIPv4 - { - get => _internetIPv4; - set - { - if (value == _internetIPv4) - return; - - _internetIPv4 = value; - OnPropertyChanged(); - } - } - - private ConnectionState _internetIPv4State = ConnectionState.None; - public ConnectionState InternetIPv4State - { - get => _internetIPv4State; - set - { - if (value == _internetIPv4State) - return; - - _internetIPv4State = value; - OnPropertyChanged(); - } - } - - private bool _isInternetIPv6Checking; - public bool IsInternetIPv6Checking - { - get => _isInternetIPv6Checking; - set - { - if (value == _isInternetIPv6Checking) - return; - - _isInternetIPv6Checking = value; - OnPropertyChanged(); - } - } - - private string _internetIPv6; - public string InternetIPv6 - { - get => _internetIPv6; - set - { - if (value == _internetIPv6) - return; - - _internetIPv6 = value; - OnPropertyChanged(); - } - } - - private ConnectionState _internetIPv6State = ConnectionState.None; - public ConnectionState InternetIPv6State - { - get => _internetIPv6State; - set - { - if (value == _internetIPv6State) - return; - - _internetIPv6State = value; - OnPropertyChanged(); - } - } - - private bool _isInternetDNSChecking; - public bool IsInternetDNSChecking - { - get => _isInternetDNSChecking; - set - { - if (value == _isInternetDNSChecking) - return; - - _isInternetDNSChecking = value; - OnPropertyChanged(); - } - } - - private string _internetDNS; - public string InternetDNS - { - get => _internetDNS; - set - { - if (value == _internetDNS) - return; - - _internetDNS = value; - OnPropertyChanged(); - } - } - - private ConnectionState _internetDNSState = ConnectionState.None; - public ConnectionState InternetDNSState - { - get => _internetDNSState; - set - { - if (value == _internetDNSState) - return; - - _internetDNSState = value; - OnPropertyChanged(); - } - } - #endregion - - public bool CheckPublicIPAddress => SettingsManager.Current.Dashboard_CheckPublicIPAddress; - #endregion - - #region Constructor, load settings - - public NetworkConnectionViewModel() - { - // Detect if network address or status changed... - NetworkChange.NetworkAvailabilityChanged += (sender, args) => CheckConnection(); - NetworkChange.NetworkAddressChanged += (sender, args) => CheckConnection(); - - LoadSettings(); - - // Detect if settings have changed... - SettingsManager.Current.PropertyChanged += SettingsManager_PropertyChanged; - } - - private void LoadSettings() - { - - } - #endregion - - #region ICommands & Actions - - #endregion - - #region Methods - public void CheckConnection() - { - CheckConnectionAsync().ConfigureAwait(false); - } - - CancellationTokenSource tokenSource; - CancellationToken ct; - - private async Task CheckConnectionAsync() - { - // already in queue - if (tokenSource != null && tokenSource.IsCancellationRequested) - { - //Debug.WriteLine("Already canceled..."); - return; - } - - // Cancel if running - if (IsChecking) - { - tokenSource.Cancel(); - //Debug.WriteLine("Try to cancel..."); - - while (IsChecking) - { - //Debug.WriteLine("Waiting for cancel.."); - await Task.Delay(500); - } - } - - // Start check - //Debug.WriteLine("Starting a check..."); - IsChecking = true; - - tokenSource = new CancellationTokenSource(); - ct = tokenSource.Token; - - try - { - await Task.Run(async () => - { - List tasks = new List - { - CheckConnectionComputerAsync(ct), - CheckConnectionRouterAsync(ct), - CheckConnectionInternetAsync(ct) - }; - - await Task.WhenAll(tasks); - }, tokenSource.Token); - - //Debug.WriteLine("Check finished..."); - } - catch (OperationCanceledException) - { - //Debug.WriteLine("Check canceled..."); - } - finally - { - tokenSource.Dispose(); - IsChecking = false; - } - } - - private Task CheckConnectionComputerAsync(CancellationToken ct) - { - return Task.Run(() => - { - // Reset variables - IsComputerIPv4Checking = true; - ComputerIPv4 = ""; - ComputerIPv4State = ConnectionState.None; - IsComputerIPv6Checking = true; - ComputerIPv6 = ""; - ComputerIPv6State = ConnectionState.None; - IsComputerDNSChecking = true; - ComputerDNS = ""; - ComputerDNSState = ConnectionState.None; - - // Detect local IPv4 address - try - { - string computerIPv4 = Models.Network.NetworkInterface.DetectLocalIPAddressBasedOnRouting(IPAddress.Parse(SettingsManager.Current.Dashboard_PublicIPv4Address)).ToString(); - - if (ct.IsCancellationRequested) - ct.ThrowIfCancellationRequested(); - - ComputerIPv4 = computerIPv4; - ComputerIPv4State = string.IsNullOrEmpty(ComputerIPv4) ? ConnectionState.Critical : ConnectionState.OK; - } - catch (Exception) - { - ComputerIPv4 = "-/-"; - ComputerIPv4State = ConnectionState.Critical; - } - - IsComputerIPv4Checking = false; - - // Detect local IPv6 address - try - { - string computerIPv6 = Models.Network.NetworkInterface.DetectLocalIPAddressBasedOnRouting(IPAddress.Parse(SettingsManager.Current.Dashboard_PublicIPv6Address)).ToString(); - - if (ct.IsCancellationRequested) - ct.ThrowIfCancellationRequested(); - - ComputerIPv6 = computerIPv6; - ComputerIPv6State = string.IsNullOrEmpty(ComputerIPv6) ? ConnectionState.Critical : ConnectionState.OK; - } - catch (Exception) - { - ComputerIPv6 = "-/-"; - ComputerIPv6State = ConnectionState.Critical; - } - - IsComputerIPv6Checking = false; - - // Get local dns entry - if (!string.IsNullOrEmpty(ComputerIPv4) || !string.IsNullOrEmpty(ComputerIPv6)) - { - try - { - string computerDNS = string.IsNullOrEmpty(ComputerIPv4) ? Dns.GetHostEntry(ComputerIPv6).HostName : Dns.GetHostEntry(ComputerIPv4).HostName; - - if (ct.IsCancellationRequested) - ct.ThrowIfCancellationRequested(); - - ComputerDNS = computerDNS; - ComputerDNSState = ConnectionState.OK; - } - catch (SocketException) - { - ComputerDNS = "-/-"; - ComputerDNSState = ConnectionState.Warning; - } - } - - IsComputerDNSChecking = false; - }); - } - - private Task CheckConnectionRouterAsync(CancellationToken ct) - { - return Task.Run(() => - { - // Reset variables - IsRouterIPv4Checking = true; - RouterIPv4 = ""; - RouterIPv4State = ConnectionState.None; - IsRouterIPv6Checking = true; - RouterIPv6 = ""; - RouterIPv6State = ConnectionState.None; - IsRouterDNSChecking = true; - RouterDNS = ""; - RouterDNSState = ConnectionState.None; - - // Detect router IPv4 and if it is reachable - try - { - IPAddress computerIPv4 = Models.Network.NetworkInterface.DetectLocalIPAddressBasedOnRouting(IPAddress.Parse(SettingsManager.Current.Dashboard_PublicIPv4Address)); - string routerIPv4 = Models.Network.NetworkInterface.DetectGatewayBasedOnLocalIPAddress(computerIPv4).ToString(); - - if (ct.IsCancellationRequested) - ct.ThrowIfCancellationRequested(); - - RouterIPv4 = routerIPv4; - RouterIPv4State = ConnectionState.OK; - } - catch (Exception) - { - RouterIPv4 = "-/-"; - RouterIPv4State = ConnectionState.Critical; - } - - IsRouterIPv4Checking = false; - - // Detect router IPv6 and if it is reachable - try - { - var computerIPv6 = Models.Network.NetworkInterface.DetectLocalIPAddressBasedOnRouting(IPAddress.Parse(SettingsManager.Current.Dashboard_PublicIPv6Address)); - string routerIPv6 = Models.Network.NetworkInterface.DetectGatewayBasedOnLocalIPAddress(computerIPv6).ToString(); - - if (ct.IsCancellationRequested) - ct.ThrowIfCancellationRequested(); - - RouterIPv6 = routerIPv6; - RouterIPv6State = ConnectionState.OK; - } - catch (Exception) - { - RouterIPv6 = "-/-"; - RouterIPv6State = ConnectionState.Critical; - } - - IsRouterIPv6Checking = false; - - // Detect router dns - if (!string.IsNullOrEmpty(RouterIPv4) || !string.IsNullOrEmpty(RouterIPv6)) - { - try - { - string routerDNS = string.IsNullOrEmpty(RouterIPv4) ? Dns.GetHostEntry(RouterIPv6).HostName : Dns.GetHostEntry(RouterIPv4).HostName; - - if (ct.IsCancellationRequested) - ct.ThrowIfCancellationRequested(); - - RouterDNS = routerDNS; - RouterDNSState = ConnectionState.OK; - } - catch (SocketException) - { - RouterDNS = "-/-"; - RouterDNSState = ConnectionState.Warning; - } - } - - IsRouterDNSChecking = false; - }); - } - - private Task CheckConnectionInternetAsync(CancellationToken ct) - { - return Task.Run(() => - { - // Reset variables - IsInternetIPv4Checking = true; - InternetIPv4 = ""; - InternetIPv4State = ConnectionState.None; - IsInternetIPv6Checking = true; - InternetIPv6 = ""; - InternetIPv6State = ConnectionState.None; - IsInternetDNSChecking = true; - InternetDNS = ""; - InternetDNSState = ConnectionState.None; - - // If public IP address check is disabled - if (!SettingsManager.Current.Dashboard_CheckPublicIPAddress) - { - InternetIPv4 = Strings.CheckIsDisabled; - InternetIPv4State = ConnectionState.Info; - IsInternetIPv4Checking = false; - - InternetIPv6 = Strings.CheckIsDisabled; - InternetIPv6State = ConnectionState.Info; - IsInternetIPv6Checking = false; - - InternetDNS = Strings.CheckIsDisabled; - InternetDNSState = ConnectionState.Info; - IsInternetDNSChecking = false; - - return; - } - - // Detect public IPv4 and if it is reachable - var publicIPv4AddressAPI = SettingsManager.Current.Dashboard_UseCustomPublicIPv4AddressAPI ? SettingsManager.Current.Dashboard_CustomPublicIPv4AddressAPI : GlobalStaticConfiguration.Dashboard_PublicIPv4AddressAPI; - - try - { - var webClient = new WebClient(); - var result = webClient.DownloadString(publicIPv4AddressAPI); - - if (ct.IsCancellationRequested) - ct.ThrowIfCancellationRequested(); - - var match = Regex.Match(result, RegexHelper.IPv4AddressExctractRegex); - - if (match.Success) - { - InternetIPv4 = match.Value; - InternetIPv4State = ConnectionState.OK; - } - else - { - InternetIPv4 = "-/-"; - InternetIPv4State = ConnectionState.Critical; - } - } - catch - { - InternetIPv4 = "-/-"; - InternetIPv4State = ConnectionState.Critical; - } - - IsInternetIPv4Checking = false; - - // Detect public IPv6 and if it is reachable - var publicIPv6AddressAPI = SettingsManager.Current.Dashboard_UseCustomPublicIPv6AddressAPI ? SettingsManager.Current.Dashboard_CustomPublicIPv6AddressAPI : GlobalStaticConfiguration.Dashboard_PublicIPv6AddressAPI; - - try - { - var webClient = new WebClient(); - var result = webClient.DownloadString(publicIPv6AddressAPI); - - if (ct.IsCancellationRequested) - ct.ThrowIfCancellationRequested(); - - var match = Regex.Match(result, RegexHelper.IPv6AddressExctractRegex); - - if (match.Success) - { - InternetIPv6 = match.Value; - InternetIPv6State = ConnectionState.OK; - } - else - { - InternetIPv6 = "-/-"; - InternetIPv6State = ConnectionState.Critical; - } - } - catch - { - InternetIPv6 = "-/-"; - InternetIPv6State = ConnectionState.Critical; - } - - IsInternetIPv6Checking = false; - - // Detect public dns - if (!string.IsNullOrEmpty(InternetIPv4) || !string.IsNullOrEmpty(InternetIPv6)) - { - try - { - string internetDNS = string.IsNullOrEmpty(InternetIPv4) ? Dns.GetHostEntry(InternetIPv6).HostName : Dns.GetHostEntry(InternetIPv4).HostName; - - if (ct.IsCancellationRequested) - ct.ThrowIfCancellationRequested(); - - InternetDNS = internetDNS; - InternetDNSState = ConnectionState.OK; - } - catch (SocketException) - { - InternetDNS = "-/-"; - InternetDNSState = ConnectionState.Warning; - } - } - - IsInternetDNSChecking = false; - }); - } - #endregion - - #region Events - private void SettingsManager_PropertyChanged(object sender, PropertyChangedEventArgs e) - { - switch (e.PropertyName) - { - case nameof(SettingsInfo.Dashboard_CheckPublicIPAddress): - OnPropertyChanged(nameof(CheckPublicIPAddress)); - break; - } - } - #endregion - } -} - diff --git a/Source/NETworkManager/ViewModels/NetworkConnectionWidgetViewModel.cs b/Source/NETworkManager/ViewModels/NetworkConnectionWidgetViewModel.cs new file mode 100644 index 0000000000..bf3b080e52 --- /dev/null +++ b/Source/NETworkManager/ViewModels/NetworkConnectionWidgetViewModel.cs @@ -0,0 +1,564 @@ +using NETworkManager.Models.Network; +using NETworkManager.Settings; +using NETworkManager.Utilities; +using System; +using System.Net; +using System.Net.Http; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Input; +using log4net; +using NetworkInterface = NETworkManager.Models.Network.NetworkInterface; +using System.Net.Sockets; + +namespace NETworkManager.ViewModels; + +/// +/// View model for the network connection widget. +/// +public class NetworkConnectionWidgetViewModel : ViewModelBase +{ + #region Variables + + /// + /// The logger. + /// + private static readonly ILog Log = LogManager.GetLogger(typeof(NetworkConnectionWidgetViewModel)); + + /// + /// Shared, timeout-bound HTTP client used to detect the public IPv4/IPv6 address. + /// + private static readonly HttpClient PublicIPHttpClient = new() { Timeout = TimeSpan.FromSeconds(10) }; + + #region Computer + + /// + /// Gets the computer IPv4 check (is checking / value / state). + /// + public ConnectionCheckItem ComputerIPv4 { get; } = new(); + + /// + /// Gets the computer IPv6 check (is checking / value / state). + /// + public ConnectionCheckItem ComputerIPv6 { get; } = new(); + + /// + /// Gets the computer DNS check (is checking / value / state). + /// + public ConnectionCheckItem ComputerDNS { get; } = new(); + + #endregion + + #region Router + + /// + /// Gets the router IPv4 check (is checking / value / state). + /// + public ConnectionCheckItem RouterIPv4 { get; } = new(); + + /// + /// Gets the router IPv6 check (is checking / value / state). + /// + public ConnectionCheckItem RouterIPv6 { get; } = new(); + + /// + /// Gets the router DNS check (is checking / value / state). + /// + public ConnectionCheckItem RouterDNS { get; } = new(); + + #endregion + + #region Internet + + /// + /// Gets the internet IPv4 check (is checking / value / state). + /// + public ConnectionCheckItem InternetIPv4 { get; } = new(); + + /// + /// Gets the internet IPv6 check (is checking / value / state). + /// + public ConnectionCheckItem InternetIPv6 { get; } = new(); + + /// + /// Gets the internet DNS check (is checking / value / state). + /// + public ConnectionCheckItem InternetDNS { get; } = new(); + + #endregion + + /// + /// Gets a value indicating whether checking the public IP address is enabled. + /// + public bool CheckPublicIPAddressEnabled => SettingsManager.Current.Dashboard_CheckPublicIPAddress; + + /// + /// Gets or sets a value indicating whether a check is currently running. + /// + public bool IsChecking + { + get; + private set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + #endregion + + #region ICommands & Actions + + /// + /// Gets the command to check connections. + /// + public ICommand CheckCommand => new RelayCommand(_ => Check()); + + #endregion + + #region Methods + + /// + /// Checks the network connections. + /// + public void Check() + { + _ = CheckAsync(); + } + + /// + /// The cancellation token source. + /// + private CancellationTokenSource _cancellationTokenSource; + + /// + /// The check task. + /// + private Task _checkTask = Task.CompletedTask; + + /// + /// Monotonically increasing id of the current check run. None of the underlying detection/DNS + /// calls support real mid-flight cancellation (see ), so a superseded run + /// can still be executing in the background after a newer run has started. Every write to a + /// is guarded by comparing against this field, so a superseded + /// run's results are silently discarded instead of racing with the current run's writes. + /// + private long _generation; + + /// + /// Checks the network connections asynchronously. + /// + private async Task CheckAsync() + { + Log.Info("Checking network connection..."); + + // Bump the generation immediately so a still-running previous check stops writing + // its results as soon as possible, even before it notices the cancellation below. + var generation = Interlocked.Increment(ref _generation); + + // Cancel previous checks if running + if (!_checkTask.IsCompleted) + { + Log.Info("Cancelling previous checks..."); + await _cancellationTokenSource.CancelAsync(); + + try + { + await _checkTask; + } + catch (OperationCanceledException) + { + Log.Info("Task was cancelled from previous checks."); + } + finally + { + _cancellationTokenSource.Dispose(); + } + } + + _cancellationTokenSource = new CancellationTokenSource(); + var wasCanceled = false; + + IsChecking = true; + + try + { + _checkTask = RunTask(_cancellationTokenSource.Token, generation); + await _checkTask; + } + catch (OperationCanceledException) + { + wasCanceled = true; + Log.Info("Task was cancelled from current checks."); + } + finally + { + IsChecking = false; + _cancellationTokenSource.Dispose(); + + if (!wasCanceled) + Log.Info("Network connection check completed."); + } + } + + /// + /// Runs the check tasks. + /// + /// The cancellation token. + /// The id of this check run, see . + /// A task representing the asynchronous operation. + private async Task RunTask(CancellationToken ct, long generation) + { + ResetAllItems(); + + // Detect the local IPv4/IPv6 address once and share it between the Computer and Router + // checks below, instead of each of them redetecting it independently (both used to + // trigger their own, potentially PowerShell-backed, network interface lookup). + var localIPv4Task = DetectLocalIPv4Async(); + var localIPv6Task = DetectLocalIPv6Async(); + + await Task.WhenAll(localIPv4Task, localIPv6Task); + + if (ct.IsCancellationRequested) + ct.ThrowIfCancellationRequested(); + + var localIPv4 = localIPv4Task.Result; + var localIPv6 = localIPv6Task.Result; + + SetAddressResult(ComputerIPv4, localIPv4, generation); + SetAddressResult(ComputerIPv6, localIPv6, generation); + + await Task.WhenAll( + CheckConnectionComputerDnsAsync(ct, generation), + CheckConnectionRouterAsync(localIPv4, localIPv6, ct, generation), + CheckConnectionInternetAsync(ct, generation) + ); + } + + /// + /// Resets all connection check items to their initial "checking" state. The Internet items are + /// only reset when the public IP address check is enabled, so they stay untouched (not stuck + /// "checking") when it is disabled. + /// + private void ResetAllItems() + { + ComputerIPv4.Reset(); + ComputerIPv6.Reset(); + ComputerDNS.Reset(); + + RouterIPv4.Reset(); + RouterIPv6.Reset(); + RouterDNS.Reset(); + + if (!CheckPublicIPAddressEnabled) + return; + + InternetIPv4.Reset(); + InternetIPv6.Reset(); + InternetDNS.Reset(); + } + + /// + /// Detects the local IPv4 address, based on routing to the configured public IPv4 address, with + /// a fallback to detection based on the network interfaces. + /// + private static async Task DetectLocalIPv4Async() + { + Log.Debug($"{nameof(DetectLocalIPv4Async)} - Detecting local IPv4 address..."); + + IPAddress remoteIPv4 = null; + + try + { + remoteIPv4 = IPAddress.Parse(SettingsManager.Current.Dashboard_PublicIPv4Address); + } + catch (Exception ex) + { + Log.Warn($"{nameof(DetectLocalIPv4Async)} - Invalid Dashboard_PublicIPv4Address setting, skipping routing based detection.", ex); + } + + var detected = remoteIPv4 != null + ? await NetworkInterface.DetectLocalIPAddressBasedOnRoutingAsync(remoteIPv4) + : null; + + if (detected == null) + { + Log.Debug($"{nameof(DetectLocalIPv4Async)} - Local IPv4 address detection via routing failed, trying network interfaces..."); + detected = await NetworkInterface.DetectLocalIPAddressFromNetworkInterfaceAsync(AddressFamily.InterNetwork); + } + + Log.Debug(detected != null + ? $"{nameof(DetectLocalIPv4Async)} - Local IPv4 address detected: " + detected + : $"{nameof(DetectLocalIPv4Async)} - Local IPv4 address not detected."); + + return detected; + } + + /// + /// Detects the local IPv6 address, based on routing to the configured public IPv6 address, with + /// a fallback to detection based on the network interfaces. + /// + private static async Task DetectLocalIPv6Async() + { + Log.Debug($"{nameof(DetectLocalIPv6Async)} - Detecting local IPv6 address..."); + + IPAddress remoteIPv6 = null; + + try + { + remoteIPv6 = IPAddress.Parse(SettingsManager.Current.Dashboard_PublicIPv6Address); + } + catch (Exception ex) + { + Log.Warn($"{nameof(DetectLocalIPv6Async)} - Invalid Dashboard_PublicIPv6Address setting, skipping routing based detection.", ex); + } + + var detected = remoteIPv6 != null + ? await NetworkInterface.DetectLocalIPAddressBasedOnRoutingAsync(remoteIPv6) + : null; + + if (detected == null) + { + Log.Debug($"{nameof(DetectLocalIPv6Async)} - Local IPv6 address detection via routing failed, trying network interfaces..."); + detected = await NetworkInterface.DetectLocalIPAddressFromNetworkInterfaceAsync(AddressFamily.InterNetworkV6); + } + + Log.Debug(detected != null + ? $"{nameof(DetectLocalIPv6Async)} - Local IPv6 address detected: " + detected + : $"{nameof(DetectLocalIPv6Async)} - Local IPv6 address not detected."); + + return detected; + } + + /// + /// Applies a detected address to a , unless a newer check has + /// started in the meantime. + /// + private void SetAddressResult(ConnectionCheckItem item, IPAddress detected, long generation) + { + if (generation != _generation) + return; + + item.Complete(detected?.ToString() ?? "-/-", detected != null ? ConnectionState.OK : ConnectionState.Critical); + } + + /// + /// Resolves the DNS (PTR) name for an address item, trying IPv4 first and falling back to IPv6, + /// unless a newer check has started in the meantime. + /// + /// + /// A PTR lookup that completes without a server error but simply has no record (e.g. most home + /// routers and many ISPs don't configure reverse DNS) is reported as + /// rather than - it's not a sign of a broken DNS setup. + /// + private async Task ResolveDnsAsync(ConnectionCheckItem dnsItem, ConnectionCheckItem addressIPv4, ConnectionCheckItem addressIPv6, long generation, string context) + { + DNSClientResultString ipv4Result = null; + DNSClientResultString ipv6Result = null; + + if (addressIPv4.State == ConnectionState.OK) + { + Log.Debug($"{context} > {nameof(ResolveDnsAsync)} - Resolving DNS based on IPv4..."); + ipv4Result = await DNSClient.GetInstance().ResolvePtrAsync(IPAddress.Parse(addressIPv4.Value)); + } + + if (ipv4Result is not { HasError: false } && addressIPv6.State == ConnectionState.OK) + { + Log.Debug($"{context} > {nameof(ResolveDnsAsync)} - Resolving DNS based on IPv6..."); + ipv6Result = await DNSClient.GetInstance().ResolvePtrAsync(IPAddress.Parse(addressIPv6.Value)); + } + + if (generation != _generation) + return; + + // Prefer a successful resolution from either family. If neither succeeded, a clean + // "not found" from either family still wins over a hard failure from the other - e.g. + // IPv4 has no PTR (NXDOMAIN) while IPv6 times out should show as "no record", not as a + // broken DNS setup. + var resolved = ipv4Result is { HasError: false } ? ipv4Result : ipv6Result is { HasError: false } ? ipv6Result : null; + var notFound = ipv4Result is { IsNotFound: true } || ipv6Result is { IsNotFound: true }; + + if (resolved != null) + { + Log.Debug($"{context} > {nameof(ResolveDnsAsync)} - DNS resolved: " + resolved.Value); + dnsItem.Complete(resolved.Value, ConnectionState.OK); + } + else if (notFound) + { + Log.Debug($"{context} > {nameof(ResolveDnsAsync)} - DNS not resolved (no record found)."); + dnsItem.Complete("-/-", ConnectionState.Info); + } + else + { + Log.Debug($"{context} > {nameof(ResolveDnsAsync)} - DNS not resolved due to error. IPv4: {ipv4Result?.ErrorMessage ?? "n/a"} | IPv6: {ipv6Result?.ErrorMessage ?? "n/a"}"); + dnsItem.Complete("-/-", ConnectionState.Critical); + } + } + + /// + /// Resolves the computer's DNS (PTR) name. + /// + private Task CheckConnectionComputerDnsAsync(CancellationToken ct, long generation) + { + return Task.Run(async () => + { + Log.Debug($"{nameof(CheckConnectionComputerDnsAsync)} - Checking computer DNS..."); + await ResolveDnsAsync(ComputerDNS, ComputerIPv4, ComputerIPv6, generation, nameof(CheckConnectionComputerDnsAsync)); + Log.Debug($"{nameof(CheckConnectionComputerDnsAsync)} - Computer DNS check completed."); + }, ct); + } + + /// + /// Checks the router connection asynchronously. + /// + /// The already-detected local IPv4 address, or null. + /// The already-detected local IPv6 address, or null. + /// The cancellation token. + /// The id of this check run, see . + /// A task representing the asynchronous operation. + private Task CheckConnectionRouterAsync(IPAddress localIPv4, IPAddress localIPv6, CancellationToken ct, long generation) + { + return Task.Run(async () => + { + Log.Debug($"{nameof(CheckConnectionRouterAsync)} - Checking router connection..."); + + // Detect router IPv4 gateway + Log.Debug($"{nameof(CheckConnectionRouterAsync)} - Detecting router IPv4 address..."); + + var routerIPv4 = localIPv4 != null + ? await NetworkInterface.DetectGatewayFromLocalIPAddressAsync(localIPv4) + : null; + + SetAddressResult(RouterIPv4, routerIPv4, generation); + + if (ct.IsCancellationRequested) + ct.ThrowIfCancellationRequested(); + + // Detect router IPv6 gateway + Log.Debug($"{nameof(CheckConnectionRouterAsync)} - Detecting router IPv6 address..."); + + var routerIPv6 = localIPv6 != null + ? await NetworkInterface.DetectGatewayFromLocalIPAddressAsync(localIPv6) + : null; + + SetAddressResult(RouterIPv6, routerIPv6, generation); + + if (ct.IsCancellationRequested) + ct.ThrowIfCancellationRequested(); + + // Resolve router DNS + await ResolveDnsAsync(RouterDNS, RouterIPv4, RouterIPv6, generation, nameof(CheckConnectionRouterAsync)); + + Log.Debug($"{nameof(CheckConnectionRouterAsync)} - Router connection check completed."); + }, ct); + } + + /// + /// Checks the internet connection asynchronously. + /// + /// The cancellation token. + /// The id of this check run, see . + /// A task representing the asynchronous operation. + private Task CheckConnectionInternetAsync(CancellationToken ct, long generation) + { + return Task.Run(async () => + { + // If public IP address check is disabled + if (!CheckPublicIPAddressEnabled) + return; + + Log.Debug($"{nameof(CheckConnectionInternetAsync)} - Checking internet connection..."); + + // Detect public IPv4 and if it is reachable + Log.Debug($"{nameof(CheckConnectionInternetAsync)} - Detecting public IPv4 address..."); + + var publicIPv4AddressAPI = SettingsManager.Current.Dashboard_UseCustomPublicIPv4AddressAPI + ? SettingsManager.Current.Dashboard_CustomPublicIPv4AddressAPI + : GlobalStaticConfiguration.Dashboard_PublicIPv4AddressAPI; + + try + { + Log.Debug($"{nameof(CheckConnectionInternetAsync)} - Checking public IPv4 address from: " + publicIPv4AddressAPI); + + var httpResponse = await PublicIPHttpClient.GetAsync(publicIPv4AddressAPI, ct); + var result = await httpResponse.Content.ReadAsStringAsync(ct); + var match = RegexHelper.IPv4AddressExtractRegex().Match(result); + + if (generation != _generation) + return; + + if (match.Success) + { + Log.Debug($"{nameof(CheckConnectionInternetAsync)} - Public IPv4 address detected: " + match.Value); + InternetIPv4.Complete(match.Value, ConnectionState.OK); + } + else + { + Log.Debug($"{nameof(CheckConnectionInternetAsync)} - Public IPv4 address not detected due to invalid format."); + InternetIPv4.Complete("-/-", ConnectionState.Critical); + } + } + catch (Exception ex) when (ex is not OperationCanceledException) + { + Log.Debug($"{nameof(CheckConnectionInternetAsync)} - Public IPv4 address not detected due to exception: " + ex.Message); + + if (generation == _generation) + InternetIPv4.Complete("-/-", ConnectionState.Critical); + } + + if (ct.IsCancellationRequested) + ct.ThrowIfCancellationRequested(); + + // Detect public IPv6 and if it is reachable + Log.Debug($"{nameof(CheckConnectionInternetAsync)} - Detecting public IPv6 address..."); + + var publicIPv6AddressAPI = SettingsManager.Current.Dashboard_UseCustomPublicIPv6AddressAPI + ? SettingsManager.Current.Dashboard_CustomPublicIPv6AddressAPI + : GlobalStaticConfiguration.Dashboard_PublicIPv6AddressAPI; + + try + { + Log.Debug($"{nameof(CheckConnectionInternetAsync)} - Checking public IPv6 address from: " + publicIPv6AddressAPI); + + var httpResponse = await PublicIPHttpClient.GetAsync(publicIPv6AddressAPI, ct); + var result = await httpResponse.Content.ReadAsStringAsync(ct); + var match = Regex.Match(result, RegexHelper.IPv6AddressRegex); + + if (generation != _generation) + return; + + if (match.Success) + { + Log.Debug($"{nameof(CheckConnectionInternetAsync)} - Public IPv6 address detected: " + match.Value); + InternetIPv6.Complete(match.Value, ConnectionState.OK); + } + else + { + Log.Debug($"{nameof(CheckConnectionInternetAsync)} - Public IPv6 address not detected due to invalid format."); + InternetIPv6.Complete("-/-", ConnectionState.Critical); + } + } + catch (Exception ex) when (ex is not OperationCanceledException) + { + Log.Debug($"{nameof(CheckConnectionInternetAsync)} - Public IPv6 address not detected due to exception: " + ex.Message); + + if (generation == _generation) + InternetIPv6.Complete("-/-", ConnectionState.Critical); + } + + if (ct.IsCancellationRequested) + ct.ThrowIfCancellationRequested(); + + // Resolve internet DNS + await ResolveDnsAsync(InternetDNS, InternetIPv4, InternetIPv6, generation, nameof(CheckConnectionInternetAsync)); + + Log.Debug($"{nameof(CheckConnectionInternetAsync)} - Internet connection check completed."); + }, ct); + } + + #endregion +} diff --git a/Source/NETworkManager/ViewModels/NetworkInterfaceSettingsViewModel.cs b/Source/NETworkManager/ViewModels/NetworkInterfaceSettingsViewModel.cs new file mode 100644 index 0000000000..450a2c5a5c --- /dev/null +++ b/Source/NETworkManager/ViewModels/NetworkInterfaceSettingsViewModel.cs @@ -0,0 +1,55 @@ +using NETworkManager.Settings; + +namespace NETworkManager.ViewModels; + +/// +/// Represents the settings for the Network Interface. +/// +public class NetworkInterfaceSettingsViewModel : ViewModelBase +{ + #region Variables + + private readonly bool _isLoading; + + /// + /// Gets or sets the bandwidth chart time window in seconds. + /// + public int BandwidthChartTime + { + get; + set + { + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.NetworkInterface_BandwidthChartTime = value; + + field = value; + OnPropertyChanged(); + } + } + + #endregion + + #region Constructor, load settings + + /// + /// Initializes a new instance of the class. + /// + public NetworkInterfaceSettingsViewModel() + { + _isLoading = true; + + LoadSettings(); + + _isLoading = false; + } + + private void LoadSettings() + { + BandwidthChartTime = SettingsManager.Current.NetworkInterface_BandwidthChartTime; + } + + #endregion +} diff --git a/Source/NETworkManager/ViewModels/NetworkInterfaceViewModel.cs b/Source/NETworkManager/ViewModels/NetworkInterfaceViewModel.cs index 21cb55dfbe..c3e1f1532c 100644 --- a/Source/NETworkManager/ViewModels/NetworkInterfaceViewModel.cs +++ b/Source/NETworkManager/ViewModels/NetworkInterfaceViewModel.cs @@ -1,1231 +1,1583 @@ -using System.Collections.Generic; -using System.Windows.Input; -using System.Net.NetworkInformation; +using LiveChartsCore; +using LiveChartsCore.Drawing; +using LiveChartsCore.Kernel; +using LiveChartsCore.SkiaSharpView; +using LiveChartsCore.SkiaSharpView.Painting; +using LiveChartsCore.SkiaSharpView.Painting.Effects; +using log4net; +using MahApps.Metro.Controls; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Localization.Resources; +using NETworkManager.Models; +using NETworkManager.Models.EventSystem; +using NETworkManager.Models.Export; +using NETworkManager.Models.Network; +using NETworkManager.Profiles; +using NETworkManager.Settings; +using NETworkManager.Utilities; +using NETworkManager.Views; +using SkiaSharp; using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; using System.Linq; -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.Settings; -using NETworkManager.Models.Network; +using System.Net.NetworkInformation; +using System.Net.Sockets; using System.Threading.Tasks; -using System.Windows.Data; -using System.ComponentModel; -using System.Diagnostics; -using NETworkManager.Views; -using NETworkManager.Utilities; using System.Windows; -using LiveCharts; -using LiveCharts.Configurations; -using LiveCharts.Wpf; -using MahApps.Metro.Controls; -using NETworkManager.Profiles; -using System.Windows.Threading; +using System.Windows.Input; +using NetworkInterface = NETworkManager.Models.Network.NetworkInterface; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +/// +/// ViewModel for the Network Interface feature, allowing management of network adapters. +/// +public class NetworkInterfaceViewModel : ProfileHostViewModelBase { - public class NetworkInterfaceViewModel : ViewModelBase, IProfileManager - { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - private readonly DispatcherTimer _searchDispatcherTimer = new DispatcherTimer(); - private BandwidthMeter _bandwidthMeter; + #region Variables - private readonly bool _isLoading = true; - private bool _isViewActive = true; + private static readonly ILog Log = LogManager.GetLogger(typeof(NetworkInterfaceViewModel)); - private bool _isNetworkInteraceLoading; - public bool IsNetworkInterfaceLoading + private BandwidthMeter _bandwidthMeter; + + private readonly bool _isLoading; + + /// + /// Gets or sets a value indicating whether network interfaces are currently loading. + /// + public bool IsNetworkInterfaceLoading + { + get; + set { - get => _isNetworkInteraceLoading; - set - { - if (value == _isNetworkInteraceLoading) - return; + if (value == field) + return; - _isNetworkInteraceLoading = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _canConfigure; - public bool CanConfigure + /// + /// Gets or sets a value indicating whether configuration is allowed. + /// + public bool CanConfigure + { + get; + set { - get => _canConfigure; - set - { - if (value == _canConfigure) - return; + if (value == field) + return; - _canConfigure = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isConfigurationRunning; - public bool IsConfigurationRunning + /// + /// Gets or sets a value indicating whether a configuration operation is running. + /// + public bool IsConfigurationRunning + { + get; + set { - get => _isConfigurationRunning; - set - { - if (value == _isConfigurationRunning) - return; + if (value == field) + return; - _isConfigurationRunning = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isStatusMessageDisplayed; - public bool IsStatusMessageDisplayed + /// + /// Gets or sets a value indicating whether the status message is displayed. + /// + public bool IsStatusMessageDisplayed + { + get; + set { - get => _isStatusMessageDisplayed; - set - { - if (value == _isStatusMessageDisplayed) - return; + if (value == field) + return; - _isStatusMessageDisplayed = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _statusMessage; - public string StatusMessage + /// + /// Gets the status message. + /// + public string StatusMessage + { + get; + private set { - get => _statusMessage; - set - { - if (value == _statusMessage) - return; + if (value == field) + return; - _statusMessage = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + + #region NetworkInterfaces, SelectedNetworkInterface - #region NetworkInterfaces, SelectedNetworkInterface - private List _networkInterfaces; - public List NetworkInterfaces + /// + /// Gets the collection of network interfaces. + /// + public ObservableCollection NetworkInterfaces + { + get; + private set { - get => _networkInterfaces; - set - { - if (value == _networkInterfaces) - return; + if (value == field) + return; - _networkInterfaces = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = []; - private NetworkInterfaceInfo _selectedNetworkInterface; - public NetworkInterfaceInfo SelectedNetworkInterface + /// + /// Gets or sets the currently selected network interface. + /// + public NetworkInterfaceInfo SelectedNetworkInterface + { + get; + set { - get => _selectedNetworkInterface; - set - { - if (value == _selectedNetworkInterface) - return; + if (value == field) + return; - if (value != null) - { - if (!_isLoading) - SettingsManager.Current.NetworkInterface_InterfaceId = value.Id; - - // Bandwidth - StopBandwidthMeter(); - StartBandwidthMeter(value.Id); + if (value != null) + { + if (!_isLoading) + SettingsManager.Current.NetworkInterface_InterfaceId = value.Id; - // Configuration - SetConfigurationDefaults(value); + // Bandwidth + StopBandwidthMeter(); + StartBandwidthMeter(value.Id); - CanConfigure = value.IsOperational; - } + // Configuration + SetConfigurationDefaults(value); - _selectedNetworkInterface = value; - OnPropertyChanged(); + CanConfigure = value.IsOperational; } + + field = value; + OnPropertyChanged(); } - #endregion + } - #region Bandwidth - private long _bandwidthTotalBytesSentTemp; + #endregion - private long _bandwidthTotalBytesSent; - public long BandwidthTotalBytesSent - { - get => _bandwidthTotalBytesSent; - set - { - if (value == _bandwidthTotalBytesSent) - return; + #region Bandwidth - _bandwidthTotalBytesSent = value; - OnPropertyChanged(); - } - } + private long _bandwidthTotalBytesSentTemp; - private long _bandwidthTotalBytesReceivedTemp; - private long _bandwidthTotalBytesReceived; - public long BandwidthTotalBytesReceived + /// + /// Gets or sets the total bytes sent. + /// + public long BandwidthTotalBytesSent + { + get; + set { - get => _bandwidthTotalBytesReceived; - set - { - if (value == _bandwidthTotalBytesReceived) - return; + if (value == field) + return; - _bandwidthTotalBytesReceived = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private long _bandwidthDiffBytesSent; - public long BandwidthDiffBytesSent - { - get => _bandwidthDiffBytesSent; - set - { - if (value == _bandwidthDiffBytesSent) - return; - - _bandwidthDiffBytesSent = value; - OnPropertyChanged(); - } - } + private long _bandwidthTotalBytesReceivedTemp; - private long _bandwidthDiffBytesReceived; - public long BandwidthDiffBytesReceived + /// + /// Gets or sets the total bytes received. + /// + public long BandwidthTotalBytesReceived + { + get; + set { - get => _bandwidthDiffBytesReceived; - set - { - if (value == _bandwidthDiffBytesReceived) - return; + if (value == field) + return; - _bandwidthDiffBytesReceived = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private long _bandwithBytesReceivedSpeed; - public long BandwidthBytesReceivedSpeed + /// + /// Gets or sets the difference in bytes sent. + /// + public long BandwidthDiffBytesSent + { + get; + set { - get => _bandwithBytesReceivedSpeed; - set - { - if (value == _bandwithBytesReceivedSpeed) - return; + if (value == field) + return; - _bandwithBytesReceivedSpeed = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private long _bandwidthBytesSentSpeed; - public long BandwidthBytesSentSpeed + /// + /// Gets or sets the difference in bytes received. + /// + public long BandwidthDiffBytesReceived + { + get; + set { - get => _bandwidthBytesSentSpeed; - set - { - if (value == _bandwidthBytesSentSpeed) - return; + if (value == field) + return; - _bandwidthBytesSentSpeed = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private DateTime _bandwidthStartTime; - public DateTime BandwidthStartTime + /// + /// Gets or sets the speed of bytes received. + /// + public long BandwidthBytesReceivedSpeed + { + get; + set { - get => _bandwidthStartTime; - set - { - if (value == _bandwidthStartTime) - return; + if (value == field) + return; - _bandwidthStartTime = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private TimeSpan _bandwidthMeasuredTime; - public TimeSpan BandwidthMeasuredTime + /// + /// Gets or sets the speed of bytes sent. + /// + public long BandwidthBytesSentSpeed + { + get; + set { - get => _bandwidthMeasuredTime; - set - { - if (value == _bandwidthMeasuredTime) - return; + if (value == field) + return; - _bandwidthMeasuredTime = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion + } - #region Config - private bool _configEnableDynamicIPAddress = true; - public bool ConfigEnableDynamicIPAddress + /// + /// Gets or sets the start time of the bandwidth measurement. + /// + public DateTime BandwidthStartTime + { + get; + set { - get => _configEnableDynamicIPAddress; - set - { - if (value == _configEnableDynamicIPAddress) - return; + if (value == field) + return; - _configEnableDynamicIPAddress = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _configEnableStaticIPAddress; - public bool ConfigEnableStaticIPAddress + /// + /// Gets or sets the duration of the bandwidth measurement. + /// + public TimeSpan BandwidthMeasuredTime + { + get; + set { - get => _configEnableStaticIPAddress; - set - { - if (value == _configEnableStaticIPAddress) - return; - - ConfigEnableStaticDNS = true; + if (value == field) + return; - _configEnableStaticIPAddress = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _configIPAddress; - public string ConfigIPAddress - { - get => _configIPAddress; - set - { - if (value == _configIPAddress) - return; + #endregion - _configIPAddress = value; - OnPropertyChanged(); - } - } + #region Config - private string _configSubnetmaskOrCidr; - public string ConfigSubnetmaskOrCidr + /// + /// Gets or sets a value indicating whether to enable dynamic IP address (DHCP). + /// + public bool ConfigEnableDynamicIPAddress + { + get; + set { - get => _configSubnetmaskOrCidr; - set - { - if (value == _configSubnetmaskOrCidr) - return; + if (value == field) + return; - _configSubnetmaskOrCidr = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = true; - private string _configGateway; - public string ConfigGateway + /// + /// Gets or sets a value indicating whether to enable static IP address. + /// + public bool ConfigEnableStaticIPAddress + { + get; + set { - get => _configGateway; - set - { - if (value == _configGateway) - return; + if (value == field) + return; - _configGateway = value; - OnPropertyChanged(); - } + ConfigEnableStaticDNS = true; + + field = value; + OnPropertyChanged(); } + } - private bool _configEnableDynamicDNS = true; - public bool ConfigEnableDynamicDNS + /// + /// Gets or sets the static IP address. + /// + public string ConfigIPAddress + { + get; + set { - get => _configEnableDynamicDNS; - set - { - if (value == _configEnableDynamicDNS) - return; + if (value == field) + return; - _configEnableDynamicDNS = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _configEnableStaticDNS; - public bool ConfigEnableStaticDNS + /// + /// Gets or sets the subnet mask. + /// + public string ConfigSubnetmask + { + get; + set { - get => _configEnableStaticDNS; - set - { - if (value == _configEnableStaticDNS) - return; + if (value == field) + return; - _configEnableStaticDNS = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _configPrimaryDNSServer; - public string ConfigPrimaryDNSServer + /// + /// Gets or sets the default gateway. + /// + public string ConfigGateway + { + get; + set { - get => _configPrimaryDNSServer; - set - { - if (value == _configPrimaryDNSServer) - return; + if (value == field) + return; - _configPrimaryDNSServer = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _configSecondaryDNSServer; - public string ConfigSecondaryDNSServer + /// + /// Gets or sets a value indicating whether to enable dynamic DNS (DHCP). + /// + public bool ConfigEnableDynamicDNS + { + get; + set { - get => _configSecondaryDNSServer; - set - { - if (value == _configSecondaryDNSServer) - return; + if (value == field) + return; - _configSecondaryDNSServer = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion + } = true; - #region Profiles - public ICollectionView Profiles { get; } - - private ProfileInfo _selectedProfile = new ProfileInfo(); - public ProfileInfo SelectedProfile + /// + /// Gets or sets a value indicating whether to enable static DNS. + /// + public bool ConfigEnableStaticDNS + { + get; + set { - get => _selectedProfile; - set - { - if (value == _selectedProfile) - return; - - if (value != null) - { - ConfigEnableDynamicIPAddress = !value.NetworkInterface_EnableStaticIPAddress; - ConfigEnableStaticIPAddress = value.NetworkInterface_EnableStaticIPAddress; - ConfigIPAddress = value.NetworkInterface_IPAddress; - ConfigGateway = value.NetworkInterface_Gateway; - ConfigSubnetmaskOrCidr = value.NetworkInterface_SubnetmaskOrCidr; - ConfigEnableDynamicDNS = !value.NetworkInterface_EnableStaticDNS; - ConfigEnableStaticDNS = value.NetworkInterface_EnableStaticDNS; - ConfigPrimaryDNSServer = value.NetworkInterface_PrimaryDNSServer; - ConfigSecondaryDNSServer = value.NetworkInterface_SecondaryDNSServer; - } + if (value == field) + return; - _selectedProfile = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _search; - public string Search + /// + /// Gets or sets the primary DNS server. + /// + public string ConfigPrimaryDNSServer + { + get; + set { - get => _search; - set - { - if (value == _search) - return; - - _search = value; - - StartDelayedSearch(); + if (value == field) + return; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isSearching; - public bool IsSearching + /// + /// Gets or sets the secondary DNS server. + /// + public string ConfigSecondaryDNSServer + { + get; + set { - get => _isSearching; - set - { - if (value == _isSearching) - return; + if (value == field) + return; - _isSearching = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _canProfileWidthChange = true; - private double _tempProfileWidth; + #endregion - private bool _expandProfileView; - public bool ExpandProfileView + /// + /// Gets or sets the selected profile. Pre-fills the Config* fields from the profile. + /// + public override ProfileInfo SelectedProfile + { + get => base.SelectedProfile; + set { - get => _expandProfileView; - set - { - if (value == _expandProfileView) - return; - - if (!_isLoading) - SettingsManager.Current.NetworkInterface_ExpandProfileView = value; - - _expandProfileView = value; - - if (_canProfileWidthChange) - ResizeProfile(false); + if (value == base.SelectedProfile) + return; - OnPropertyChanged(); + if (value != null) + { + ConfigEnableDynamicIPAddress = !value.NetworkInterface_EnableStaticIPAddress; + ConfigEnableStaticIPAddress = value.NetworkInterface_EnableStaticIPAddress; + ConfigIPAddress = value.NetworkInterface_IPAddress; + ConfigGateway = value.NetworkInterface_Gateway; + ConfigSubnetmask = value.NetworkInterface_Subnetmask; + ConfigEnableDynamicDNS = !value.NetworkInterface_EnableStaticDNS; + ConfigEnableStaticDNS = value.NetworkInterface_EnableStaticDNS; + ConfigPrimaryDNSServer = value.NetworkInterface_PrimaryDNSServer; + ConfigSecondaryDNSServer = value.NetworkInterface_SecondaryDNSServer; } - } - - private GridLength _profileWidth; - public GridLength ProfileWidth - { - get => _profileWidth; - set - { - if (value == _profileWidth) - return; - if (!_isLoading && Math.Abs(value.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > GlobalStaticConfiguration.FloatPointFix) // Do not save the size when collapsed - SettingsManager.Current.NetworkInterface_ProfileWidth = value.Value; - - _profileWidth = value; - - if (_canProfileWidthChange) - ResizeProfile(dueToChangedSize: true); - - OnPropertyChanged(); - } + base.SelectedProfile = value; } - #endregion - #endregion - - #region Constructor, LoadSettings, OnShutdown - public NetworkInterfaceViewModel(IDialogCoordinator instance) - { - _dialogCoordinator = instance; - - LoadNetworkInterfaces(); + } - InitialBandwidthChart(); + #endregion - Profiles = new CollectionViewSource { Source = ProfileManager.Groups.SelectMany(x => x.Profiles) }.View; - Profiles.GroupDescriptions.Add(new PropertyGroupDescription(nameof(ProfileInfo.Group))); - Profiles.SortDescriptions.Add(new SortDescription(nameof(ProfileInfo.Group), ListSortDirection.Ascending)); - Profiles.SortDescriptions.Add(new SortDescription(nameof(ProfileInfo.Name), ListSortDirection.Ascending)); - Profiles.Filter = o => - { - if (!(o is ProfileInfo info)) - return false; + #region Constructor, LoadSettings, OnShutdown - if (string.IsNullOrEmpty(Search)) - return info.NetworkInterface_Enabled; + /// + /// Initializes a new instance of the class. + /// + public NetworkInterfaceViewModel() + { + _isLoading = true; - var search = Search.Trim(); + // Initialize the bandwidth chart before loading interfaces, so the chart collections + // exist by the time the (possibly synchronous) interface load selects an interface and + // starts the bandwidth meter. + InitialBandwidthChart(); - // Search by: Tag=xxx (exact match, ignore case) - /* - if (search.StartsWith(ProfileManager.TagIdentifier, StringComparison.OrdinalIgnoreCase)) - return !string.IsNullOrEmpty(info.Tags) && info.NetworkInterface_Enabled && info.Tags.Replace(" ", "").Split(';').Any(str => search.Substring(ProfileManager.TagIdentifier.Length, search.Length - ProfileManager.TagIdentifier.Length).Equals(str, StringComparison.OrdinalIgnoreCase)); - */ + _ = LoadNetworkInterfaces(); - // Search by: Name, IPScanner_IPRange - return info.NetworkInterface_Enabled && (info.Name.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1); - }; + InitializeProfileHost(); - // This will select the first entry as selected item... - SelectedProfile = Profiles.SourceCollection.Cast().Where(x => x.NetworkInterface_Enabled).OrderBy(x => x.Group).ThenBy(x => x.Name).FirstOrDefault(); + // Detect if network address or status changed... + NetworkChange.NetworkAvailabilityChanged += (_, _) => ReloadNetworkInterfaces(); + NetworkChange.NetworkAddressChanged += (_, _) => ReloadNetworkInterfaces(); - ProfileManager.OnProfilesUpdated += ProfileManager_OnProfilesUpdated; + // React to settings changes (e.g. the configurable bandwidth chart time window) + SettingsManager.Current.PropertyChanged += SettingsManager_PropertyChanged; - _searchDispatcherTimer.Interval = GlobalStaticConfiguration.SearchDispatcherTimerTimeSpan; - _searchDispatcherTimer.Tick += SearchDispatcherTimer_Tick; + _isLoading = false; + } - // Detect if network address or status changed... - NetworkChange.NetworkAvailabilityChanged += (sender, args) => ReloadNetworkInterfacesAction(); - NetworkChange.NetworkAddressChanged += (sender, args) => ReloadNetworkInterfacesAction(); + /// + /// The visible chart time window in seconds, configurable via the settings. + /// + private static double BandwidthChartWindowSeconds => SettingsManager.Current.NetworkInterface_BandwidthChartTime; - LoadSettings(); + /// + /// Extra share of samples kept beyond the visible window so the chart has a little + /// off-screen history (smoother left edge while live + minor pan-back headroom). + /// + private const double BandwidthValuesHeadroom = 1.1; - SettingsManager.Current.PropertyChanged += SettingsManager_PropertyChanged; + private int _maxBandwidthValues; + private bool _updatingBandwidthAxisFromCode; + private DateTime _bandwidthSessionStartTime; - _isLoading = false; - } + private ObservableCollection _bandwidthReceivedValues; + private ObservableCollection _bandwidthSentValues; - private void InitialBandwidthChart() - { - var dayConfig = Mappers.Xy() - .X(dayModel => (double)dayModel.DateTime.Ticks / TimeSpan.FromHours(1).Ticks) - .Y(dayModel => dayModel.Value); + // Capped rolling history kept off-screen so the chart can be rebuilt when the user + // returns to live mode after panning/zooming (see BandwidthGoLiveAction). + private readonly List _bandwidthReceivedHistory = []; + private readonly List _bandwidthSentHistory = []; - Series = new SeriesCollection(dayConfig) - { - new LineSeries + private void InitialBandwidthChart() + { + _bandwidthReceivedValues = []; + _bandwidthSentValues = []; + _bandwidthSessionStartTime = DateTime.Now; + + // Start in live mode so samples are plotted immediately, independent of when the meter + // starts relative to this initialization. + IsBandwidthLiveMode = true; + + UpdateMaxBandwidthValues(); + + var downloadColor = SKColor.Parse("#1ba1e2"); + var uploadColor = SKColor.Parse("#7fba00"); + + var labelColor = Application.Current?.TryFindResource("MahApps.Brushes.Gray5") is System.Windows.Media.SolidColorBrush gray5 + ? new SKColor(gray5.Color.R, gray5.Color.G, gray5.Color.B, gray5.Color.A) + : new SKColor(0x68, 0x68, 0x68); + + var separatorColor = Application.Current?.TryFindResource("MahApps.Brushes.Gray8") is System.Windows.Media.SolidColorBrush gray8 + ? new SKColor(gray8.Color.R, gray8.Color.G, gray8.Color.B, gray8.Color.A) + : new SKColor(0x80, 0x80, 0x80); + + Series = + [ + new LineSeries + { + Name = Strings.Download, + Values = _bandwidthReceivedValues, + Mapping = (info, _) => double.IsNaN(info.Value) + ? Coordinate.Empty + : new((info.DateTime - _bandwidthSessionStartTime).TotalSeconds, info.Value), + GeometrySize = 0, + LineSmoothness = 0.3, + DataPadding = new LvcPoint(0, 0), + Stroke = new SolidColorPaint(downloadColor) { StrokeThickness = 1.5f }, + Fill = new SolidColorPaint(downloadColor.WithAlpha(0x33)) + }, + new LineSeries + { + Name = Strings.Upload, + Values = _bandwidthSentValues, + Mapping = (info, _) => double.IsNaN(info.Value) + ? Coordinate.Empty + : new((info.DateTime - _bandwidthSessionStartTime).TotalSeconds, info.Value), + GeometrySize = 0, + LineSmoothness = 0.3, + DataPadding = new LvcPoint(0, 0), + Stroke = new SolidColorPaint(uploadColor) { StrokeThickness = 1.5f }, + Fill = new SolidColorPaint(uploadColor.WithAlpha(0x33)) + } + ]; + + BandwidthXAxes = + [ + new Axis + { + Labeler = value => DateTimeHelper.DateTimeToTimeString( + _bandwidthSessionStartTime.AddSeconds(value)), + TextSize = 10, + Padding = new Padding(0, 4, 0, 0), + LabelsPaint = new SolidColorPaint(labelColor), + SeparatorsPaint = new SolidColorPaint(separatorColor) { - Title = "Download", - Values = new ChartValues(), - PointGeometry = null + StrokeThickness = 1, + PathEffect = new DashEffect([10f, 10f]) }, - new LineSeries + MinStep = BandwidthChartWindowSeconds / 4.0, + ForceStepToMin = true + } + ]; + + BandwidthYAxes = + [ + new Axis + { + MinLimit = 0, + Labeler = value => $"{FileSizeConverter.GetBytesReadable((long)value * 8)}it/s", + TextSize = 11, + Padding = new Padding(4, 0), + LabelsPaint = new SolidColorPaint(labelColor), + SeparatorsPaint = new SolidColorPaint(separatorColor) { - Title = "Upload", - Values = new ChartValues(), - PointGeometry = null + StrokeThickness = 1, + PathEffect = new DashEffect([10f, 10f]) } - }; - - FormatterDate = value => new DateTime((long)(value * TimeSpan.FromHours(1).Ticks)).ToString("hh:mm:ss"); - FormatterSpeed = value => $"{FileSizeConverter.GetBytesReadable((long)value * 8)}it/s"; - } + } + ]; - public Func FormatterDate { get; set; } - public Func FormatterSpeed { get; set; } - public SeriesCollection Series { get; set; } + BandwidthLegendTextPaint = new SolidColorPaint(labelColor) { SKTypeface = SKTypeface.Default }; - private async Task LoadNetworkInterfaces() + BandwidthXAxes[0].PropertyChanged += (_, args) => { - IsNetworkInterfaceLoading = true; + if (_updatingBandwidthAxisFromCode) + return; + + if (args.PropertyName is not (nameof(Axis.MinLimit) or nameof(Axis.MaxLimit))) + return; - NetworkInterfaces = await Models.Network.NetworkInterface.GetNetworkInterfacesAsync(); + IsBandwidthLiveMode = false; - // Get the last selected interface, if it is still available on this machine... - if (NetworkInterfaces.Count > 0) + var axis = BandwidthXAxes[0]; + if (axis.MinLimit.HasValue && axis.MaxLimit.HasValue) { - var info = NetworkInterfaces.FirstOrDefault(s => s.Id == SettingsManager.Current.NetworkInterface_InterfaceId); - - SelectedNetworkInterface = info ?? NetworkInterfaces[0]; + _updatingBandwidthAxisFromCode = true; + axis.MinStep = (axis.MaxLimit.Value - axis.MinLimit.Value) / 4.0; + _updatingBandwidthAxisFromCode = false; } + }; - IsNetworkInterfaceLoading = false; - } + UpdateBandwidthXAxisWindow(DateTime.Now); + } - private void LoadSettings() + /// + /// Gets the series collection for the bandwidth chart (download/upload). + /// + public ISeries[] Series { get; private set; } + + /// + /// Gets the X-axes configuration for the bandwidth chart. + /// + public Axis[] BandwidthXAxes { get; private set; } + + /// + /// Gets the Y-axes configuration for the bandwidth chart. + /// + public Axis[] BandwidthYAxes { get; private set; } + + /// + /// Gets the themed paint used for the chart legend text. + /// + public SolidColorPaint BandwidthLegendTextPaint { get; private set; } + + /// + /// Gets a value indicating whether the bandwidth chart is in live (auto-scrolling) mode. + /// + public bool IsBandwidthLiveMode + { + get; + private set { - ExpandProfileView = SettingsManager.Current.NetworkInterface_ExpandProfileView; - - ProfileWidth = ExpandProfileView ? new GridLength(SettingsManager.Current.NetworkInterface_ProfileWidth) : new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); + if (value == field) + return; - _tempProfileWidth = SettingsManager.Current.NetworkInterface_ProfileWidth; + field = value; + OnPropertyChanged(); } - #endregion + } - #region ICommands & Actions - public ICommand ReloadNetworkInterfacesCommand => new RelayCommand(p => ReloadNetworkInterfacesAction(), ReloadNetworkInterfaces_CanExecute); + private void UpdateMaxBandwidthValues() + { + // Number of samples that fit in the visible window (derived from the meter's sample + // interval), plus a little off-screen headroom. + var samplesPerWindow = BandwidthChartWindowSeconds * 1000 / BandwidthMeter.DefaultUpdateInterval; + _maxBandwidthValues = (int)Math.Ceiling(samplesPerWindow * BandwidthValuesHeadroom); + } + + /// + /// Loads the network interfaces. + /// + private async Task LoadNetworkInterfaces() + { + IsNetworkInterfaceLoading = true; - private bool ReloadNetworkInterfaces_CanExecute(object obj) => !IsNetworkInterfaceLoading && Application.Current.MainWindow != null && !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen; + // Get all network interfaces... + (await NetworkInterface.GetNetworkInterfacesAsync()).ForEach(NetworkInterfaces.Add); - private async Task ReloadNetworkInterfacesAction() + // Get the last selected interface, if it is still available on this machine... + if (NetworkInterfaces.Count > 0) { - IsNetworkInterfaceLoading = true; + var info = NetworkInterfaces.FirstOrDefault(s => + s.Id == SettingsManager.Current.NetworkInterface_InterfaceId); - await Task.Delay(2000); // Make the user happy, let him see a reload animation (and he cannot spam the reload command) + SelectedNetworkInterface = info ?? NetworkInterfaces[0]; + } - var id = string.Empty; + IsNetworkInterfaceLoading = false; + } - if (SelectedNetworkInterface != null) - id = SelectedNetworkInterface.Id; + #endregion - NetworkInterfaces = await Models.Network.NetworkInterface.GetNetworkInterfacesAsync(); + #region Profile host - // Change interface... - SelectedNetworkInterface = string.IsNullOrEmpty(id) ? NetworkInterfaces.FirstOrDefault() : NetworkInterfaces.FirstOrDefault(x => x.Id == id); + protected override ApplicationName ApplicationName => ApplicationName.NetworkInterface; - IsNetworkInterfaceLoading = false; - } + protected override bool IsProfileEnabled(ProfileInfo profile) => profile.NetworkInterface_Enabled; - public ICommand OpenNetworkConnectionsCommand => new RelayCommand(p => OpenNetworkConnectionsAction(), OpenNetworkConnections_CanExecute); + // Unlike other tools, profile search here only matches the profile name (no secondary field). + protected override string GetSearchableField(ProfileInfo profile) => string.Empty; - private bool OpenNetworkConnections_CanExecute(object paramter) => Application.Current.MainWindow != null && !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen; + #endregion - public async Task OpenNetworkConnectionsAction() - { - try + #region ICommands & Actions + + /// + /// Gets the command to reload the network interfaces. + /// + public ICommand ReloadNetworkInterfacesCommand => + new RelayCommand(_ => ReloadNetworkInterfacesAction(), ReloadNetworkInterfaces_CanExecute); + + /// + /// Determines whether the ReloadNetworkInterfaces command can execute. + /// + private bool ReloadNetworkInterfaces_CanExecute(object obj) + { + return !IsNetworkInterfaceLoading && + Application.Current.MainWindow != null && + !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && + !ConfigurationManager.Current.IsChildWindowOpen; + } + + /// + /// Action to reload the network interfaces. + /// + private void ReloadNetworkInterfacesAction() + { + ReloadNetworkInterfaces(); + } + + /// + /// Gets the command to export the network interfaces. + /// + public ICommand ExportCommand => new RelayCommand(parameter => { _ = ExportAction(); }); + + /// + /// Action to export the network interfaces. + /// + private Task ExportAction() + { + var childWindow = new ExportChildWindow(); + + var childWindowViewModel = new ExportViewModel(async instance => { - ProcessStartInfo info = new ProcessStartInfo + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + try { - FileName = "NCPA.cpl", - UseShellExecute = true - }; + ExportManager.Export(instance.FilePath, instance.FileType, + instance.ExportAll ? NetworkInterfaces : [SelectedNetworkInterface]); + } + catch (Exception ex) + { + Log.Error("Error while exporting data as " + instance.FileType, ex); - Process.Start(info); - } - catch (Exception ex) + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); + } + + SettingsManager.Current.NetworkInterface_ExportFileType = instance.FileType; + SettingsManager.Current.NetworkInterface_ExportFilePath = instance.FilePath; + }, _ => { - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Error, ex.Message, MessageDialogStyle.Affirmative, AppearanceManager.MetroDialog); - } - } + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, [ + ExportFileType.Csv, ExportFileType.Xml, ExportFileType.Json + ], true, + SettingsManager.Current.NetworkInterface_ExportFileType, + SettingsManager.Current.NetworkInterface_ExportFilePath); - public ICommand ApplyConfigurationCommand => new RelayCommand(p => ApplyConfigurationAction(), ApplyConfiguration_CanExecute); + childWindow.Title = Strings.Export; - private bool ApplyConfiguration_CanExecute(object paramter) => Application.Current.MainWindow != null && !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen; + childWindow.DataContext = childWindowViewModel; - public void ApplyConfigurationAction() - { - ApplyConfiguration(); - } + ConfigurationManager.Current.IsChildWindowOpen = true; - public ICommand ApplyProfileConfigCommand => new RelayCommand(p => ApplyProfileProfileAction()); + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } - private void ApplyProfileProfileAction() - { - ApplyProfileConfig(); - } + /// + /// Gets the command to apply the network configuration. + /// + public ICommand ApplyConfigurationCommand => + new RelayCommand(_ => ApplyConfigurationAction(), ConfigureCommands_CanExecute); - public ICommand AddProfileCommand => new RelayCommand(p => AddProfileAction()); + /// + /// Action to apply the network configuration. + /// + private void ApplyConfigurationAction() + { + _ = ApplyConfiguration(); + } - private void AddProfileAction() - { - ProfileDialogManager.ShowAddProfileDialog(this, _dialogCoordinator); - } + /// + /// Gets the command to apply the profile configuration. + /// + public ICommand ApplyProfileCommand => new RelayCommand(_ => ApplyProfileAction(), ConfigureCommands_CanExecute); - public ICommand EditProfileCommand => new RelayCommand(p => EditProfileAction()); + private void ApplyProfileAction() + { + _ = ApplyConfigurationFromProfile(); + } - private void EditProfileAction() - { - ProfileDialogManager.ShowEditProfileDialog(this, _dialogCoordinator, SelectedProfile); - } + #region Additional commands - public ICommand CopyAsProfileCommand => new RelayCommand(p => CopyAsProfileAction()); + private bool AdditionalCommands_CanExecute(object parameter) + { + return Application.Current.MainWindow != null && + !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && + !ConfigurationManager.Current.IsChildWindowOpen; + } - private void CopyAsProfileAction() - { - ProfileDialogManager.ShowCopyAsProfileDialog(this, _dialogCoordinator, SelectedProfile); - } + private bool ConfigureCommands_CanExecute(object parameter) => ConfigurationManager.Current.IsAdmin && + Application.Current.MainWindow != null && + !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && + !ConfigurationManager.Current.IsChildWindowOpen; - public ICommand DeleteProfileCommand => new RelayCommand(p => DeleteProfileAction()); + /// + /// Gets the command to restart the application with administrator privileges. + /// + public ICommand RestartAsAdminCommand => new RelayCommand(parameter => { _ = RestartAsAdminAction(); }); - private void DeleteProfileAction() + private async Task RestartAsAdminAction() + { + try { - ProfileDialogManager.ShowDeleteProfileDialog(this, _dialogCoordinator, new List { SelectedProfile }); + (Application.Current.MainWindow as MainWindow)?.RestartApplication(true); } - - public ICommand EditGroupCommand => new RelayCommand(EditGroupAction); - - private void EditGroupAction(object group) + catch (Exception ex) { - ProfileDialogManager.ShowEditGroupDialog(this, _dialogCoordinator, ProfileManager.GetGroup(group.ToString())); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, ex.Message, + ChildWindowIcon.Error); } + } - public ICommand FlushDNSCommand => new RelayCommand(p => FlushDNSAction(), FlushDNS_CanExecute); + /// + /// Gets the command to open network connections. + /// + public ICommand OpenNetworkConnectionsCommand => + new RelayCommand(_ => OpenNetworkConnectionsAction(), AdditionalCommands_CanExecute); - private bool FlushDNS_CanExecute(object paramter) => Application.Current.MainWindow != null && !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen; + private void OpenNetworkConnectionsAction() + { + _ = OpenNetworkConnectionsAsync(); + } - private async Task FlushDNSAction() - { - IsConfigurationRunning = true; - IsStatusMessageDisplayed = false; + /// + /// Gets the command to open IP Scanner. + /// + public ICommand IPScannerCommand => new RelayCommand(_ => IPScannerAction(), AdditionalCommands_CanExecute); - await Models.Network.NetworkInterface.FlushDnsAsync(); + private void IPScannerAction() + { + var ipTuple = SelectedNetworkInterface?.IPv4Address.FirstOrDefault(); - IsConfigurationRunning = false; - } + // ToDo: Log error in the future + if (ipTuple == null) + return; - public ICommand ClearSearchCommand => new RelayCommand(p => ClearSearchAction()); + EventSystem.RedirectToApplication(ApplicationName.IPScanner, + $"{ipTuple.Item1}/{Subnetmask.ConvertSubnetmaskToCidr(ipTuple.Item2)}"); + } - private void ClearSearchAction() - { - Search = string.Empty; - } + /// + /// Gets the command to flush DNS. + /// + public ICommand FlushDNSCommand => new RelayCommand(_ => FlushDNSAction(), ConfigureCommands_CanExecute); - public ICommand ReleaseRenewCommand => new RelayCommand(p => ReleaseRenewAction(), ReleaseRenew_CanExecute); + private void FlushDNSAction() + { + _ = FlushDNSAsync(); + } - private bool ReleaseRenew_CanExecute(object paramter) => Application.Current.MainWindow != null && !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen; + /// + /// Gets the command to release and renew IP address. + /// + public ICommand ReleaseRenewCommand => new RelayCommand(_ => ReleaseRenewAction(), ConfigureCommands_CanExecute); - private async Task ReleaseRenewAction() - { - IsConfigurationRunning = true; + private void ReleaseRenewAction() + { + _ = ReleaseRenewAsync(IPConfigReleaseRenewMode.ReleaseRenew); + } - await Models.Network.NetworkInterface.ReleaseRenewAsync(Models.Network.NetworkInterface.IPConfigReleaseRenewMode.ReleaseRenew); + /// + /// Gets the command to release IP address. + /// + public ICommand ReleaseCommand => new RelayCommand(_ => ReleaseAction(), ConfigureCommands_CanExecute); - IsConfigurationRunning = false; - } + private void ReleaseAction() + { + _ = ReleaseRenewAsync(IPConfigReleaseRenewMode.Release); + } - public ICommand ReleaseCommand => new RelayCommand(p => ReleaseAction(), Release_CanExecute); + /// + /// Gets the command to renew IP address. + /// + public ICommand RenewCommand => new RelayCommand(_ => RenewAction(), ConfigureCommands_CanExecute); - private bool Release_CanExecute(object paramter) => Application.Current.MainWindow != null && !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen; + private void RenewAction() + { + _ = ReleaseRenewAsync(IPConfigReleaseRenewMode.Renew); + } - private async Task ReleaseAction() - { - IsConfigurationRunning = true; + /// + /// Gets the command to release and renew IPv6 address. + /// + public ICommand ReleaseRenew6Command => new RelayCommand(_ => ReleaseRenew6Action(), ConfigureCommands_CanExecute); - await Models.Network.NetworkInterface.ReleaseRenewAsync(Models.Network.NetworkInterface.IPConfigReleaseRenewMode.Release); + private void ReleaseRenew6Action() + { + _ = ReleaseRenewAsync(IPConfigReleaseRenewMode.ReleaseRenew6); + } - IsConfigurationRunning = false; - } + /// + /// Gets the command to release IPv6 address. + /// + public ICommand Release6Command => new RelayCommand(_ => Release6Action(), ConfigureCommands_CanExecute); - public ICommand RenewCommand => new RelayCommand(p => RenewAction(), Renew_CanExecute); + private void Release6Action() + { + _ = ReleaseRenewAsync(IPConfigReleaseRenewMode.Release6); + } + + /// + /// Gets the command to renew IPv6 address. + /// + public ICommand Renew6Command => new RelayCommand(_ => Renew6Action(), ConfigureCommands_CanExecute); + + private void Renew6Action() + { + _ = ReleaseRenewAsync(IPConfigReleaseRenewMode.Renew6); + } + + /// + /// Gets the command to add an IPv4 address. + /// + public ICommand AddIPv4AddressCommand => new RelayCommand(parameter => { _ = AddIPv4AddressAction(); }, + ConfigureCommands_CanExecute); - private bool Renew_CanExecute(object paramter) => Application.Current.MainWindow != null && !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen; + private async Task AddIPv4AddressAction() + { + var childWindow = new IPAddressAndSubnetmaskChildWindow(); - private async Task RenewAction() + var childWindowViewModel = new IPAddressAndSubnetmaskViewModel(async instance => { - IsConfigurationRunning = true; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - await Models.Network.NetworkInterface.ReleaseRenewAsync(Models.Network.NetworkInterface.IPConfigReleaseRenewMode.Renew); + await AddIPv4Address(instance.IPAddress, instance.Subnetmask); + }, _ => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }); - IsConfigurationRunning = false; - } + childWindow.Title = Strings.AddIPv4Address; - public ICommand AddIPv4AddressCommand => new RelayCommand(p => AddIPv4AddressAction(), AddIPv4Address_CanExecute); + childWindow.DataContext = childWindowViewModel; - private bool AddIPv4Address_CanExecute(object paramter) => Application.Current.MainWindow != null && !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen; + ConfigurationManager.Current.IsChildWindowOpen = true; - private async Task AddIPv4AddressAction() - { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.AddIPv4Address - }; + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } - var IPAddressAndSubnetmaskViewModel = new IPAddressAndSubnetmaskViewModel(async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + /// + /// Gets the command to remove an IPv4 address. + /// + public ICommand RemoveIPv4AddressCommand => new RelayCommand(parameter => { _ = RemoveIPv4AddressAction(); }, + ConfigureCommands_CanExecute); + + private async Task RemoveIPv4AddressAction() + { + var childWindow = new DropDownChildWindow(); - AddIPv4Address(instance.IPAddress, instance.SubnetmaskOrCidr); - }, instance => + var childWindowViewModel = new DropDownViewModel(async instance => { - _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - }); + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - customDialog.Content = new IPAddressAndSubnetmaskDialog + await RemoveIPv4Address(instance.SelectedValue.Split("/")[0]); + }, _ => { - DataContext = IPAddressAndSubnetmaskViewModel - }; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, + [.. SelectedNetworkInterface.IPv4Address.Select(x => $"{x.Item1}/{Subnetmask.ConvertSubnetmaskToCidr(x.Item2)}")], + Strings.IPv4Address + ); - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } + childWindow.Title = Strings.RemoveIPv4Address; + childWindow.DataContext = childWindowViewModel; - public ICommand RemoveIPv4AddressCommand => new RelayCommand(p => RemoveIPv4AddressAction(), RemoveIPv4Address_CanExecute); + ConfigurationManager.Current.IsChildWindowOpen = true; - private bool RemoveIPv4Address_CanExecute(object paramter) => Application.Current.MainWindow != null && !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen; + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } - private async Task RemoveIPv4AddressAction() - { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.RemoveIPv4Address - }; + #endregion - var dropdownViewModel = new DropdownViewModel(async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + #endregion - RemoveIPv4Address(instance.SelectedValue.Split("/")[0]); - }, instance => - { - _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - }, SelectedNetworkInterface.IPv4Address.Select(x => $"{x.Item1}/{Subnetmask.ConvertSubnetmaskToCidr(x.Item2)}").ToList(), Localization.Resources.Strings.IPv4Address); + #region Methods - customDialog.Content = new DropdownDialog - { - DataContext = dropdownViewModel - }; + private async void ReloadNetworkInterfaces() + { + // Avoid multiple reloads + if (IsNetworkInterfaceLoading) + return; - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } - #endregion + IsNetworkInterfaceLoading = true; - #region Methods - private void SetConfigurationDefaults(NetworkInterfaceInfo info) + // Make the user happy, let him see a reload animation (and he cannot spam the reload command) + await Task.Delay(GlobalStaticConfiguration.ApplicationUIRefreshInterval); + + // Store the last selected id + var id = SelectedNetworkInterface?.Id ?? string.Empty; + + // Get all network interfaces... + var networkInterfaces = await NetworkInterface.GetNetworkInterfacesAsync(); + + // Invoke on UI thread synchronously + Application.Current.Dispatcher.Invoke(() => { - if (info.DhcpEnabled) - { - ConfigEnableDynamicIPAddress = true; - } - else - { - ConfigEnableStaticIPAddress = true; - ConfigIPAddress = info.IPv4Address.FirstOrDefault()?.Item1.ToString(); - ConfigSubnetmaskOrCidr = info.IPv4Address.FirstOrDefault()?.Item2.ToString(); - ConfigGateway = info.IPv4Gateway?.Any() == true ? info.IPv4Gateway.FirstOrDefault()?.ToString() : string.Empty; - } + // Clear the list + NetworkInterfaces.Clear(); - if (info.DNSAutoconfigurationEnabled) - { - ConfigEnableDynamicDNS = true; - } - else - { - ConfigEnableStaticDNS = true; + // Add all network interfaces to the list + networkInterfaces.ForEach(NetworkInterfaces.Add); + }); - var dnsServers = info.DNSServer.Where(x => x.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).ToList(); - ConfigPrimaryDNSServer = dnsServers.Count > 0 ? dnsServers[0].ToString() : string.Empty; - ConfigSecondaryDNSServer = dnsServers.Count > 1 ? dnsServers[1].ToString() : string.Empty; - } + // Set the last selected interface, if it is still available on this machine... + SelectedNetworkInterface = string.IsNullOrEmpty(id) + ? NetworkInterfaces.FirstOrDefault() + : NetworkInterfaces.FirstOrDefault(x => x.Id == id); + + IsNetworkInterfaceLoading = false; + } + + private void SetConfigurationDefaults(NetworkInterfaceInfo info) + { + if (info.DhcpEnabled) + { + ConfigEnableDynamicIPAddress = true; } - public async Task ApplyConfiguration() + else { - IsConfigurationRunning = true; - IsStatusMessageDisplayed = false; + ConfigEnableStaticIPAddress = true; + ConfigIPAddress = info.IPv4Address.FirstOrDefault()?.Item1.ToString(); + ConfigSubnetmask = info.IPv4Address.FirstOrDefault()?.Item2.ToString(); + ConfigGateway = info.IPv4Gateway?.Any() == true + ? info.IPv4Gateway.FirstOrDefault()?.ToString() + : string.Empty; + } - var subnetmask = ConfigSubnetmaskOrCidr; + if (info.DNSAutoconfigurationEnabled) + { + ConfigEnableDynamicDNS = true; + } + else + { + ConfigEnableStaticDNS = true; - // CIDR to subnetmask - if (ConfigEnableStaticIPAddress && subnetmask.StartsWith("/")) - subnetmask = Subnetmask.GetFromCidr(int.Parse(subnetmask.TrimStart('/'))).Subnetmask; + var dnsServers = info.DNSServer.Where(x => x.AddressFamily == AddressFamily.InterNetwork) + .ToList(); + ConfigPrimaryDNSServer = dnsServers.Count > 0 ? dnsServers[0].ToString() : string.Empty; + ConfigSecondaryDNSServer = dnsServers.Count > 1 ? dnsServers[1].ToString() : string.Empty; + } + } - // If primary and secondary DNS are empty --> autoconfiguration - if (ConfigEnableStaticDNS && string.IsNullOrEmpty(ConfigPrimaryDNSServer) && string.IsNullOrEmpty(ConfigSecondaryDNSServer)) - ConfigEnableDynamicDNS = true; + private async Task ApplyConfiguration() + { + IsConfigurationRunning = true; + IsStatusMessageDisplayed = false; - // When primary DNS is empty, swap it with secondary (if not empty) - if (ConfigEnableStaticDNS && string.IsNullOrEmpty(ConfigPrimaryDNSServer) && !string.IsNullOrEmpty(ConfigSecondaryDNSServer)) - { - ConfigPrimaryDNSServer = ConfigSecondaryDNSServer; - ConfigSecondaryDNSServer = string.Empty; - } + var subnetmask = ConfigSubnetmask; - var config = new NetworkInterfaceConfig - { - Name = SelectedNetworkInterface.Name, - EnableStaticIPAddress = ConfigEnableStaticIPAddress, - IPAddress = ConfigIPAddress, - Subnetmask = subnetmask, - Gateway = ConfigGateway, - EnableStaticDNS = ConfigEnableStaticDNS, - PrimaryDNSServer = ConfigPrimaryDNSServer, - SecondaryDNSServer = ConfigSecondaryDNSServer - }; + // CIDR to subnetmask + if (ConfigEnableStaticIPAddress && subnetmask.StartsWith("/")) + subnetmask = Subnetmask.GetFromCidr(int.Parse(subnetmask.TrimStart('/'))).Subnetmask; - try - { - var networkInterface = new Models.Network.NetworkInterface(); + // If primary and secondary DNS are empty --> autoconfiguration + if (ConfigEnableStaticDNS && string.IsNullOrEmpty(ConfigPrimaryDNSServer) && + string.IsNullOrEmpty(ConfigSecondaryDNSServer)) + ConfigEnableDynamicDNS = true; + + // When primary DNS is empty, swap it with secondary (if not empty) + if (ConfigEnableStaticDNS && string.IsNullOrEmpty(ConfigPrimaryDNSServer) && + !string.IsNullOrEmpty(ConfigSecondaryDNSServer)) + { + ConfigPrimaryDNSServer = ConfigSecondaryDNSServer; + ConfigSecondaryDNSServer = string.Empty; + } - networkInterface.UserHasCanceled += NetworkInterface_UserHasCanceled; + var config = new NetworkInterfaceConfig + { + Name = SelectedNetworkInterface.Name, + EnableStaticIPAddress = ConfigEnableStaticIPAddress, + IPAddress = ConfigIPAddress, + Subnetmask = subnetmask, + Gateway = ConfigGateway, + EnableStaticDNS = ConfigEnableStaticDNS, + PrimaryDNSServer = ConfigPrimaryDNSServer, + SecondaryDNSServer = ConfigSecondaryDNSServer + }; - await networkInterface.ConfigureNetworkInterfaceAsync(config); + try + { + await NetworkInterface.ConfigureNetworkInterfaceAsync(config); - ReloadNetworkInterfacesAction(); - } - catch (Exception ex) - { - StatusMessage = ex.Message; - IsStatusMessageDisplayed = true; - } - finally - { - IsConfigurationRunning = false; - } - } + ReloadNetworkInterfaces(); - public async Task AddIPv4Address(string ipAddress, string subnetmaskOrCidr) + StatusMessage = Strings.NetworkInterfaceConfigurationAppliedSuccessfully; + IsStatusMessageDisplayed = true; + } + catch (Exception ex) + { + StatusMessage = ex.Message; + IsStatusMessageDisplayed = true; + } + finally { - IsConfigurationRunning = true; - IsStatusMessageDisplayed = false; + IsConfigurationRunning = false; + } + } - var subnetmask = subnetmaskOrCidr; + private async Task ApplyConfigurationFromProfile() + { + IsConfigurationRunning = true; + IsStatusMessageDisplayed = false; - // CIDR to subnetmask - if (subnetmask.StartsWith("/")) - subnetmask = Subnetmask.GetFromCidr(int.Parse(subnetmask.TrimStart('/'))).Subnetmask; + var subnetmask = SelectedProfile.NetworkInterface_Subnetmask; - var config = new NetworkInterfaceConfig - { - Name = SelectedNetworkInterface.Name, - IPAddress = ipAddress, - Subnetmask = subnetmask - }; + // CIDR to subnetmask + if (SelectedProfile.NetworkInterface_EnableStaticIPAddress && subnetmask.StartsWith("/")) + subnetmask = Subnetmask.GetFromCidr(int.Parse(subnetmask.TrimStart('/'))).Subnetmask; - try - { - await Models.Network.NetworkInterface.AddIPAddressToNetworkInterfaceAsync(config); + var enableStaticDNS = SelectedProfile.NetworkInterface_EnableStaticDNS; - ReloadNetworkInterfacesAction(); - } - catch (Exception ex) - { - StatusMessage = ex.Message; - IsStatusMessageDisplayed = true; - } - finally - { - IsConfigurationRunning = false; - } + var primaryDNSServer = SelectedProfile.NetworkInterface_PrimaryDNSServer; + var secondaryDNSServer = SelectedProfile.NetworkInterface_SecondaryDNSServer; + + // If primary and secondary DNS are empty --> autoconfiguration + if (enableStaticDNS && string.IsNullOrEmpty(primaryDNSServer) && string.IsNullOrEmpty(secondaryDNSServer)) + enableStaticDNS = false; + + // When primary DNS is empty, swap it with secondary (if not empty) + if (SelectedProfile.NetworkInterface_EnableStaticDNS && string.IsNullOrEmpty(primaryDNSServer) && + !string.IsNullOrEmpty(secondaryDNSServer)) + { + primaryDNSServer = secondaryDNSServer; + secondaryDNSServer = string.Empty; } - public async Task RemoveIPv4Address(string ipAddress) + var config = new NetworkInterfaceConfig { - IsConfigurationRunning = true; - IsStatusMessageDisplayed = false; + Name = SelectedNetworkInterface.Name, + EnableStaticIPAddress = SelectedProfile.NetworkInterface_EnableStaticIPAddress, + IPAddress = SelectedProfile.NetworkInterface_IPAddress, + Subnetmask = subnetmask, + Gateway = SelectedProfile.NetworkInterface_Gateway, + EnableStaticDNS = enableStaticDNS, + PrimaryDNSServer = primaryDNSServer, + SecondaryDNSServer = secondaryDNSServer + }; - var config = new NetworkInterfaceConfig - { - Name = SelectedNetworkInterface.Name, - IPAddress = ipAddress - }; + try + { + await NetworkInterface.ConfigureNetworkInterfaceAsync(config); - try - { - await Models.Network.NetworkInterface.RemoveIPAddressFromNetworkInterfaceAsync(config); + ReloadNetworkInterfaces(); - ReloadNetworkInterfacesAction(); - } - catch (Exception ex) - { - StatusMessage = ex.Message; - IsStatusMessageDisplayed = true; - } - finally - { - IsConfigurationRunning = false; - } + StatusMessage = Strings.NetworkInterfaceConfigurationAppliedSuccessfully; + IsStatusMessageDisplayed = true; + } + catch (Exception ex) + { + StatusMessage = ex.Message; + IsStatusMessageDisplayed = true; + } + finally + { + IsConfigurationRunning = false; } + } - public async Task ApplyProfileConfig() + private async Task OpenNetworkConnectionsAsync() + { + try + { + ExternalProcessStarter.RunProcess("NCPA.cpl"); + } + catch (Exception ex) { - IsConfigurationRunning = true; - IsStatusMessageDisplayed = false; + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, ex.Message, + ChildWindowIcon.Error); + } + } - var subnetmask = SelectedProfile.NetworkInterface_SubnetmaskOrCidr; + private async Task FlushDNSAsync() + { + IsConfigurationRunning = true; + IsStatusMessageDisplayed = false; - // CIDR to subnetmask - if (SelectedProfile.NetworkInterface_EnableStaticIPAddress && subnetmask.StartsWith("/")) - subnetmask = Subnetmask.GetFromCidr(int.Parse(subnetmask.TrimStart('/'))).Subnetmask; + try + { + await NetworkInterface.FlushDnsAsync(); - var enableStaticDNS = SelectedProfile.NetworkInterface_EnableStaticDNS; + StatusMessage = Strings.FlushDNSCacheSuccessfully; + IsStatusMessageDisplayed = true; + } + catch (Exception ex) + { + StatusMessage = ex.Message; + IsStatusMessageDisplayed = true; + } + finally + { + IsConfigurationRunning = false; + } + } - var primaryDNSServer = SelectedProfile.NetworkInterface_PrimaryDNSServer; - var secondaryDNSServer = SelectedProfile.NetworkInterface_SecondaryDNSServer; + private async Task ReleaseRenewAsync(IPConfigReleaseRenewMode releaseRenewMode) + { + IsConfigurationRunning = true; + IsStatusMessageDisplayed = false; - // If primary and secondary DNS are empty --> autoconfiguration - if (enableStaticDNS && string.IsNullOrEmpty(primaryDNSServer) && string.IsNullOrEmpty(secondaryDNSServer)) - enableStaticDNS = false; + try + { + await NetworkInterface.ReleaseRenewAsync(releaseRenewMode, SelectedNetworkInterface.Name); - // When primary DNS is empty, swap it with secondary (if not empty) - if (SelectedProfile.NetworkInterface_EnableStaticDNS && string.IsNullOrEmpty(primaryDNSServer) && !string.IsNullOrEmpty(secondaryDNSServer)) - { - primaryDNSServer = secondaryDNSServer; - secondaryDNSServer = string.Empty; - } + ReloadNetworkInterfaces(); - var config = new NetworkInterfaceConfig + StatusMessage = releaseRenewMode switch { - Name = SelectedNetworkInterface.Name, - EnableStaticIPAddress = SelectedProfile.NetworkInterface_EnableStaticIPAddress, - IPAddress = SelectedProfile.NetworkInterface_IPAddress, - Subnetmask = subnetmask, - Gateway = SelectedProfile.NetworkInterface_Gateway, - EnableStaticDNS = enableStaticDNS, - PrimaryDNSServer = primaryDNSServer, - SecondaryDNSServer = secondaryDNSServer + IPConfigReleaseRenewMode.ReleaseRenew => Strings.IPv4AddressReleasedAndRenewedSuccessfully, + IPConfigReleaseRenewMode.Release => Strings.IPv4AddressReleasedSuccessfully, + IPConfigReleaseRenewMode.Renew => Strings.IPv4AddressRenewedSuccessfully, + IPConfigReleaseRenewMode.ReleaseRenew6 => Strings.IPv6AddressReleasedAndRenewedSuccessfully, + IPConfigReleaseRenewMode.Release6 => Strings.IPv6AddressReleasedSuccessfully, + IPConfigReleaseRenewMode.Renew6 => Strings.IPv6AddressRenewedSuccessfully, + _ => string.Empty }; + IsStatusMessageDisplayed = true; + } + catch (Exception ex) + { + StatusMessage = ex.Message; + IsStatusMessageDisplayed = true; + } + finally + { + IsConfigurationRunning = false; + } + } - try - { - var networkInterface = new Models.Network.NetworkInterface(); + private async Task AddIPv4Address(string ipAddress, string subnetmaskOrCidr) + { + IsConfigurationRunning = true; + IsStatusMessageDisplayed = false; - networkInterface.UserHasCanceled += NetworkInterface_UserHasCanceled; + var subnetmask = subnetmaskOrCidr; - await networkInterface.ConfigureNetworkInterfaceAsync(config); + // CIDR to subnetmask + if (subnetmask.StartsWith("/")) + subnetmask = Subnetmask.GetFromCidr(int.Parse(subnetmask.TrimStart('/'))).Subnetmask; - ReloadNetworkInterfacesAction(); - } - catch (Exception ex) - { - StatusMessage = ex.Message; - IsStatusMessageDisplayed = true; - } - finally - { - IsConfigurationRunning = false; - } - } + var config = new NetworkInterfaceConfig + { + Name = SelectedNetworkInterface.Name, + EnableDhcpStaticIpCoexistence = SelectedNetworkInterface.DhcpEnabled, + IPAddress = ipAddress, + Subnetmask = subnetmask + }; - private void StartDelayedSearch() + try { - if (!IsSearching) - { - IsSearching = true; + await NetworkInterface.AddIPAddressToNetworkInterfaceAsync(config); - _searchDispatcherTimer.Start(); - } - else - { - _searchDispatcherTimer.Stop(); - _searchDispatcherTimer.Start(); - } - } + ReloadNetworkInterfaces(); - private void StopDelayedSearch() + StatusMessage = Strings.IPv4AddressAddedSuccessfully; + IsStatusMessageDisplayed = true; + } + catch (Exception ex) { - _searchDispatcherTimer.Stop(); + StatusMessage = ex.Message; + IsStatusMessageDisplayed = true; + } + finally + { + IsConfigurationRunning = false; + } + } - RefreshProfiles(); + private async Task RemoveIPv4Address(string ipAddress) + { + IsConfigurationRunning = true; + IsStatusMessageDisplayed = false; - IsSearching = false; - } + var config = new NetworkInterfaceConfig + { + Name = SelectedNetworkInterface.Name, + IPAddress = ipAddress + }; - private void ResizeProfile(bool dueToChangedSize) + try { - _canProfileWidthChange = false; + await NetworkInterface.RemoveIPAddressFromNetworkInterfaceAsync(config); - if (dueToChangedSize) - { - ExpandProfileView = Math.Abs(ProfileWidth.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > GlobalStaticConfiguration.FloatPointFix; - } - else - { - if (ExpandProfileView) - { - ProfileWidth = Math.Abs(_tempProfileWidth - GlobalStaticConfiguration.Profile_WidthCollapsed) < GlobalStaticConfiguration.FloatPointFix ? new GridLength(GlobalStaticConfiguration.Profile_DefaultWidthExpanded) : new GridLength(_tempProfileWidth); - } - else - { - _tempProfileWidth = ProfileWidth.Value; - ProfileWidth = new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); - } - } + ReloadNetworkInterfaces(); - _canProfileWidthChange = true; + StatusMessage = Strings.IPv4AddressRemovedSuccessfully; + IsStatusMessageDisplayed = true; } - - public void ResetBandwidthChart() + catch (Exception ex) { - if (Series == null) - return; + StatusMessage = ex.Message; + IsStatusMessageDisplayed = true; + } + finally + { + IsConfigurationRunning = false; + } + } - Series[0].Values.Clear(); - Series[1].Values.Clear(); + private void ResetBandwidthChart() + { + if (_bandwidthReceivedValues == null) + return; - var currentDateTime = DateTime.Now; + _bandwidthReceivedValues.Clear(); + _bandwidthSentValues.Clear(); + _bandwidthReceivedHistory.Clear(); + _bandwidthSentHistory.Clear(); - for (var i = 60; i > 0; i--) - { - var bandwidthInfo = new LvlChartsDefaultInfo(currentDateTime.AddSeconds(-i), double.NaN); + _bandwidthSessionStartTime = DateTime.Now; + IsBandwidthLiveMode = true; - Series[0].Values.Add(bandwidthInfo); - Series[1].Values.Add(bandwidthInfo); - } - } - - private bool _resetBandwidthStatisticOnNextUpdate; + UpdateBandwidthXAxisWindow(DateTime.Now); + } - private void StartBandwidthMeter(string networkInterfaceId) - { - // Reset chart - ResetBandwidthChart(); + private void UpdateBandwidthXAxisWindow(DateTime now) + { + _updatingBandwidthAxisFromCode = true; + var axis = BandwidthXAxes[0]; + var elapsed = (now - _bandwidthSessionStartTime).TotalSeconds; + axis.MinStep = BandwidthChartWindowSeconds / 4.0; + axis.MinLimit = elapsed - BandwidthChartWindowSeconds; + axis.MaxLimit = elapsed; + _updatingBandwidthAxisFromCode = false; + } - // Reset statistic - _resetBandwidthStatisticOnNextUpdate = true; + /// + /// Rescales the Y axis to the current values. The step is derived from a 20% padded + /// max and MaxLimit is set to step * 3, so the top label lands exactly on MaxLimit. + /// + private void UpdateBandwidthYAxis() + { + var maxVal = _bandwidthReceivedValues.Concat(_bandwidthSentValues) + .Where(p => !double.IsNaN(p.Value)) + .Select(p => p.Value) + .DefaultIfEmpty(0) + .Max(); + + if (!(maxVal > 0)) + return; + + var yAxis = BandwidthYAxes[0]; + var step = Math.Ceiling(maxVal * 1.2 / 3.0); + yAxis.MinStep = step; + yAxis.MaxLimit = step * 3; + } - _bandwidthMeter = new BandwidthMeter(networkInterfaceId); - _bandwidthMeter.UpdateSpeed += BandwidthMeter_UpdateSpeed; - _bandwidthMeter.Start(); - } + private void TrimBandwidthHistory(List history) + { + var excess = history.Count - _maxBandwidthValues; + if (excess > 0) + history.RemoveRange(0, excess); + } - private void ResumeBandwidthMeter() - { - if (_bandwidthMeter != null && !_bandwidthMeter.IsRunning) - { - ResetBandwidthChart(); + /// + /// Gets the command to return the bandwidth chart to live (auto-scrolling) mode. + /// + public ICommand BandwidthGoLiveCommand => new RelayCommand(_ => BandwidthGoLiveAction()); - _resetBandwidthStatisticOnNextUpdate = true; + private void BandwidthGoLiveAction() + { + IsBandwidthLiveMode = true; - _bandwidthMeter.Start(); - } - } + // Samples received while inspecting were not added to the chart, so rebuild the + // rolling buffers from the most recent history to resume at the current time. + var recentReceived = _bandwidthReceivedHistory + .Skip(Math.Max(0, _bandwidthReceivedHistory.Count - _maxBandwidthValues)); + var recentSent = _bandwidthSentHistory + .Skip(Math.Max(0, _bandwidthSentHistory.Count - _maxBandwidthValues)); - private void StopBandwidthMeter() - { - if (_bandwidthMeter != null && _bandwidthMeter.IsRunning) - _bandwidthMeter.Stop(); - } + _bandwidthReceivedValues = new ObservableCollection(recentReceived); + _bandwidthSentValues = new ObservableCollection(recentSent); - public void OnViewVisible() - { - _isViewActive = true; + ((LineSeries)Series[0]).Values = _bandwidthReceivedValues; + ((LineSeries)Series[1]).Values = _bandwidthSentValues; - RefreshProfiles(); + UpdateBandwidthXAxisWindow(DateTime.Now); + UpdateBandwidthYAxis(); + } - ResumeBandwidthMeter(); - } + private bool _resetBandwidthStatisticOnNextUpdate; - public void OnViewHide() - { - StopBandwidthMeter(); + private void StartBandwidthMeter(string networkInterfaceId) + { + // Reset chart + ResetBandwidthChart(); - _isViewActive = false; - } + // Reset statistic + _resetBandwidthStatisticOnNextUpdate = true; - public void RefreshProfiles() - { - if (!_isViewActive) - return; + _bandwidthMeter = new BandwidthMeter(networkInterfaceId); + _bandwidthMeter.UpdateSpeed += BandwidthMeter_UpdateSpeed; + _bandwidthMeter.Start(); + } - Profiles.Refresh(); - } + private void ResumeBandwidthMeter() + { + if (_bandwidthMeter is not { IsRunning: false }) + return; - public void OnProfileDialogOpen() - { + // The meter is only paused while this view is hidden (i.e. another application is shown). + // Returning to it starts a fresh measurement: reset the chart and statistics, then start. + ResetBandwidthChart(); - } + _resetBandwidthStatisticOnNextUpdate = true; - public void OnProfileDialogClose() - { + _bandwidthMeter.Start(); + } - } - #endregion + private void StopBandwidthMeter() + { + if (_bandwidthMeter is not { IsRunning: true }) + return; - #region Events - private void ProfileManager_OnProfilesUpdated(object sender, EventArgs e) + _bandwidthMeter.Stop(); + } + + /// + /// Called when the view becomes visible. + /// + public override void OnViewVisible() + { + base.OnViewVisible(); + + ResumeBandwidthMeter(); + } + + /// + /// Called when the view is hidden. + /// + public override void OnViewHide() + { + StopBandwidthMeter(); + + base.OnViewHide(); + } + + #endregion + + #region Events + + private void SettingsManager_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + switch (e.PropertyName) { - RefreshProfiles(); + case nameof(SettingsInfo.NetworkInterface_BandwidthChartTime): + UpdateMaxBandwidthValues(); + + // Re-apply the visible window immediately so the change is reflected while running. + if (IsBandwidthLiveMode && _bandwidthMeter is { IsRunning: true }) + UpdateBandwidthXAxisWindow(DateTime.Now); + break; } + } - private void SearchDispatcherTimer_Tick(object sender, EventArgs e) + private void BandwidthMeter_UpdateSpeed(object sender, BandwidthMeterSpeedArgs e) + { + // Reset statistics + if (_resetBandwidthStatisticOnNextUpdate) { - StopDelayedSearch(); + BandwidthStartTime = DateTime.Now; + _bandwidthTotalBytesReceivedTemp = e.TotalBytesReceived; + _bandwidthTotalBytesSentTemp = e.TotalBytesSent; + + _resetBandwidthStatisticOnNextUpdate = false; } - private void BandwidthMeter_UpdateSpeed(object sender, BandwidthMeterSpeedArgs e) - { - // Reset statistics - if(_resetBandwidthStatisticOnNextUpdate) - { - BandwidthStartTime = DateTime.Now; - _bandwidthTotalBytesReceivedTemp = e.TotalBytesReceived; - _bandwidthTotalBytesSentTemp = e.TotalBytesSent; + // Measured time + BandwidthMeasuredTime = DateTime.Now - BandwidthStartTime; - _resetBandwidthStatisticOnNextUpdate = false; - } + // Interface totals (cumulative, since boot) + current speed + BandwidthTotalBytesReceived = e.TotalBytesReceived; + BandwidthTotalBytesSent = e.TotalBytesSent; + BandwidthBytesReceivedSpeed = e.ByteReceivedSpeed; + BandwidthBytesSentSpeed = e.ByteSentSpeed; - // Measured time - BandwidthMeasuredTime = DateTime.Now - BandwidthStartTime; + // A counter reset (e.g. adapter disable/enable, driver reset, sleep/resume) can drop the + // cumulative totals below the session baseline. Re-baseline in that case so the session + // amounts below never go negative; they then resume counting from the reset point. + if (BandwidthTotalBytesReceived < _bandwidthTotalBytesReceivedTemp) + _bandwidthTotalBytesReceivedTemp = BandwidthTotalBytesReceived; - // Current download/upload - BandwidthTotalBytesReceived = e.TotalBytesReceived; - BandwidthTotalBytesSent = e.TotalBytesSent; - BandwidthBytesReceivedSpeed = e.ByteReceivedSpeed; - BandwidthBytesSentSpeed = e.ByteSentSpeed; + if (BandwidthTotalBytesSent < _bandwidthTotalBytesSentTemp) + _bandwidthTotalBytesSentTemp = BandwidthTotalBytesSent; - // Total download/upload - BandwidthDiffBytesReceived = BandwidthTotalBytesReceived - _bandwidthTotalBytesReceivedTemp; - BandwidthDiffBytesSent = BandwidthTotalBytesSent - _bandwidthTotalBytesSentTemp; + // Amount transferred since the measurement started (this session) + BandwidthDiffBytesReceived = BandwidthTotalBytesReceived - _bandwidthTotalBytesReceivedTemp; + BandwidthDiffBytesSent = BandwidthTotalBytesSent - _bandwidthTotalBytesSentTemp; - // Add chart entry - Series[0].Values.Add(new LvlChartsDefaultInfo(e.DateTime, e.ByteReceivedSpeed)); - Series[1].Values.Add(new LvlChartsDefaultInfo(e.DateTime, e.ByteSentSpeed)); + // Add chart entry + var receivedInfo = new LvlChartsDefaultInfo(e.DateTime, e.ByteReceivedSpeed); + var sentInfo = new LvlChartsDefaultInfo(e.DateTime, e.ByteSentSpeed); - // Remove data older than 60 seconds - if (Series[0].Values.Count > 59) - Series[0].Values.RemoveAt(0); + // Always record history (capped) so the chart can be rebuilt when returning to live mode. + _bandwidthReceivedHistory.Add(receivedInfo); + _bandwidthSentHistory.Add(sentInfo); + TrimBandwidthHistory(_bandwidthReceivedHistory); + TrimBandwidthHistory(_bandwidthSentHistory); - if (Series[1].Values.Count > 59) - Series[1].Values.RemoveAt(0); - } + // While the user inspects the chart (panned/zoomed, i.e. not live), keep the view + // frozen: skip updating the visible buffer and axes. New samples are still recorded + // above and become visible again via BandwidthGoLiveCommand. + if (!IsBandwidthLiveMode) + return; - private void NetworkInterface_UserHasCanceled(object sender, EventArgs e) - { - StatusMessage = Localization.Resources.Strings.CanceledByUserMessage; - IsStatusMessageDisplayed = true; - } + _bandwidthReceivedValues.Add(receivedInfo); + _bandwidthSentValues.Add(sentInfo); - private void SettingsManager_PropertyChanged(object sender, PropertyChangedEventArgs e) - { - } - #endregion + if (_bandwidthReceivedValues.Count > _maxBandwidthValues) + _bandwidthReceivedValues.RemoveAt(0); + + if (_bandwidthSentValues.Count > _maxBandwidthValues) + _bandwidthSentValues.RemoveAt(0); + + UpdateBandwidthXAxisWindow(e.DateTime); + UpdateBandwidthYAxis(); } + + #endregion } diff --git a/Source/NETworkManager/ViewModels/PingMonitorHostViewModel.cs b/Source/NETworkManager/ViewModels/PingMonitorHostViewModel.cs index 9ce5cceb62..5244f1e1b3 100644 --- a/Source/NETworkManager/ViewModels/PingMonitorHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/PingMonitorHostViewModel.cs @@ -1,504 +1,376 @@ -using NETworkManager.Settings; -using System.Windows.Input; -using MahApps.Metro.Controls.Dialogs; -using System.Windows; -using System; +using MahApps.Metro.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Models; using NETworkManager.Models.Network; -using System.ComponentModel; -using System.Windows.Data; +using NETworkManager.Profiles; +using NETworkManager.Settings; using NETworkManager.Utilities; -using System.Linq; -using System.Collections.ObjectModel; using NETworkManager.Views; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Linq; using System.Net; -using NETworkManager.Profiles; -using System.Windows.Threading; +using System.Threading; using System.Threading.Tasks; -using System.Collections.Generic; - -namespace NETworkManager.ViewModels -{ - public class PingMonitorHostViewModel : ViewModelBase, IProfileManager - { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - private readonly DispatcherTimer _searchDispatcherTimer = new DispatcherTimer(); - - private readonly bool _isLoading = true; - private bool _isViewActive = true; - - private int _hostId; - - private string _host; - public string Host - { - get => _host; - set - { - if (value == _host) - return; - - _host = value; - OnPropertyChanged(); - } - } - - public ICollectionView HostHistoryView { get; } - - private bool _isWorking; - public bool IsWorking - { - get => _isWorking; - set - { - if (value == _isWorking) - return; +using System.Windows; +using System.Windows.Data; +using System.Windows.Input; - _isWorking = value; - OnPropertyChanged(); - } - } +namespace NETworkManager.ViewModels; - private bool _isStatusMessageDisplayed; - public bool IsStatusMessageDisplayed - { - get => _isStatusMessageDisplayed; - set - { - if (value == _isStatusMessageDisplayed) - return; +/// +/// ViewModel for the Ping Monitor Host view. +/// +public class PingMonitorHostViewModel : ProfileHostViewModelBase +{ + #region Variables - _isStatusMessageDisplayed = value; - OnPropertyChanged(); - } - } + private CancellationTokenSource _cancellationTokenSource; - private string _statusMessage; - public string StatusMessage - { - get => _statusMessage; - set - { - if (value == _statusMessage) - return; + private string _group = Strings.Hosts; // Default group name - _statusMessage = value; - OnPropertyChanged(); - } - } - - private ObservableCollection _hosts = new ObservableCollection(); - public ObservableCollection Hosts + /// + /// Gets or sets the host to ping. + /// + public string Host + { + get; + set { - get => _hosts; - set - { - if (value != null && value == _hosts) - return; + if (value == field) + return; - _hosts = value; - } + field = value; + OnPropertyChanged(); } + } - public ICollectionView HostsView { get; } + /// + /// Gets the view for the host history. + /// + public ICollectionView HostHistoryView { get; } - private PingMonitorView _selectedHost; - public PingMonitorView SelectedHost + /// + /// Gets or sets a value indicating whether the ping monitor is running. + /// + public bool IsRunning + { + get; + set { - get => _selectedHost; - set - { - if (value == _selectedHost) - return; + if (value == field) + return; - _selectedHost = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - #region Profiles - public ICollectionView Profiles { get; } - - private ProfileInfo _selectedProfile; - public ProfileInfo SelectedProfile + /// + /// Gets or sets a value indicating whether the ping monitor is canceling. + /// + public bool IsCanceling + { + get; + set { - get => _selectedProfile; - set - { - if (value == _selectedProfile) - return; + if (value == field) + return; - _selectedProfile = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _search; - public string Search + /// + /// Gets or sets a value indicating whether the status message is displayed. + /// + public bool IsStatusMessageDisplayed + { + get; + set { - get => _search; - set - { - if (value == _search) - return; - - _search = value; - - StartDelayedSearch(); + if (value == field) + return; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isSearching; - public bool IsSearching + /// + /// Gets the status message. + /// + public string StatusMessage + { + get; + private set { - get => _isSearching; - set - { - if (value == _isSearching) - return; + if (value == field) + return; - _isSearching = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _canProfileWidthChange = true; - private double _tempProfileWidth; - - private bool _expandProfileView; - public bool ExpandProfileView + /// + /// Gets or sets the list of ping monitor views. + /// + public ObservableCollection Hosts + { + get; + set { - get => _expandProfileView; - set - { - if (value == _expandProfileView) - return; - - if (!_isLoading) - SettingsManager.Current.PingMonitor_ExpandProfileView = value; - - _expandProfileView = value; - - if (_canProfileWidthChange) - ResizeProfile(false); + if (value != null && value == field) + return; - OnPropertyChanged(); - } + field = value; } + } = []; - private GridLength _profileWidth; - public GridLength ProfileWidth - { - get => _profileWidth; - set - { - if (value == _profileWidth) - return; + /// + /// Gets the view for the hosts. + /// + public ICollectionView HostsView { get; } - if (!_isLoading && Math.Abs(value.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > GlobalStaticConfiguration.FloatPointFix) // Do not save the size when collapsed - SettingsManager.Current.PingMonitor_ProfileWidth = value.Value; + #endregion - _profileWidth = value; + #region Constructor, load settings - if (_canProfileWidthChange) - ResizeProfile(true); - - OnPropertyChanged(); - } - } - #endregion - #endregion - - #region Constructor, load settings - public PingMonitorHostViewModel(IDialogCoordinator instance) - { - _dialogCoordinator = instance; - - // Host history - HostHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.PingMonitor_HostHistory); + /// + /// Initializes a new instance of the class. + /// + public PingMonitorHostViewModel() + { + // Host history + HostHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.PingMonitor_HostHistory); - // Hosts - HostsView = CollectionViewSource.GetDefaultView(Hosts); + // Hosts + HostsView = CollectionViewSource.GetDefaultView(Hosts); + HostsView.GroupDescriptions.Add(new PropertyGroupDescription(nameof(PingMonitorView.Group))); + HostsView.SortDescriptions.Add(new SortDescription(nameof(PingMonitorView.Group), ListSortDirection.Ascending)); - // Profiles - Profiles = new CollectionViewSource { Source = ProfileManager.Groups.SelectMany(x => x.Profiles) }.View; - Profiles.GroupDescriptions.Add(new PropertyGroupDescription(nameof(ProfileInfo.Group))); - Profiles.SortDescriptions.Add(new SortDescription(nameof(ProfileInfo.Group), ListSortDirection.Ascending)); - Profiles.SortDescriptions.Add(new SortDescription(nameof(ProfileInfo.Name), ListSortDirection.Ascending)); - Profiles.Filter = o => - { - if (!(o is ProfileInfo info)) - return false; + InitializeProfileHost(); + } - if (string.IsNullOrEmpty(Search)) - return info.PingMonitor_Enabled; + #endregion - var search = Search.Trim(); + #region Profile host - // Search by: Tag=xxx (exact match, ignore case) - /* - if (search.StartsWith(ProfileManager.TagIdentifier, StringComparison.OrdinalIgnoreCase)) - return !string.IsNullOrEmpty(info.Tags) && info.PingMonitor_Enabled && info.Tags.Replace(" ", "").Split(';').Any(str => search.Substring(ProfileManager.TagIdentifier.Length, search.Length - ProfileManager.TagIdentifier.Length).Equals(str, StringComparison.OrdinalIgnoreCase)); - */ + protected override ApplicationName ApplicationName => ApplicationName.PingMonitor; - // Search by: Name, Ping_Host - return info.PingMonitor_Enabled && (info.Name.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1 || info.PingMonitor_Host.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1); - }; + protected override bool IsProfileEnabled(ProfileInfo profile) => profile.PingMonitor_Enabled; - // This will select the first entry as selected item... - SelectedProfile = Profiles.SourceCollection.Cast().Where(x => x.PingMonitor_Enabled).OrderBy(x => x.Group).ThenBy(x => x.Name).FirstOrDefault(); + protected override string GetSearchableField(ProfileInfo profile) => profile.PingMonitor_Host; - ProfileManager.OnProfilesUpdated += ProfileManager_OnProfilesUpdated; + #endregion - _searchDispatcherTimer.Interval = GlobalStaticConfiguration.SearchDispatcherTimerTimeSpan; - _searchDispatcherTimer.Tick += SearchDispatcherTimer_Tick; + #region ICommands & Actions - LoadSettings(); + /// + /// Gets the command to start or stop pinging the host. + /// + public ICommand PingCommand => new RelayCommand(_ => PingAction(), Ping_CanExecute); - _isLoading = false; - } + private bool Ping_CanExecute(object parameter) + { + return Application.Current.MainWindow != null && + !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && + !ConfigurationManager.Current.IsChildWindowOpen; + } - private void LoadSettings() - { - ExpandProfileView = SettingsManager.Current.PingMonitor_ExpandProfileView; + private void PingAction() + { + if (IsRunning) + Stop(); + else + _ = Start(); + } - ProfileWidth = ExpandProfileView ? new GridLength(SettingsManager.Current.PingMonitor_ProfileWidth) : new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); + /// + /// Gets the command to ping the selected profile. + /// + public ICommand PingProfileCommand => new RelayCommand(_ => PingProfileAction(), PingProfile_CanExecute); - _tempProfileWidth = SettingsManager.Current.PingMonitor_ProfileWidth; - } - #endregion + private bool PingProfile_CanExecute(object obj) + { + return !IsSearching && SelectedProfile != null; + } - #region ICommands & Actions - public ICommand AddHostCommand => new RelayCommand(p => AddHostAction()); + private void PingProfileAction() + { + if (SetHost(SelectedProfile.PingMonitor_Host, SelectedProfile.Group)) + _ = Start(); + } - private void AddHostAction() - { - AddHost(Host); + /// + /// Gets the command to close a group of hosts. + /// + public ICommand CloseGroupCommand => new RelayCommand(CloseGroupAction); - // Add the hostname or ip address to the history - AddHostToHistory(Host); + private void CloseGroupAction(object group) + { + RemoveGroup(group.ToString()); + } - Host = ""; - } + #endregion - public ICommand ExportCommand => new RelayCommand(p => ExportAction()); + #region Methods - private void ExportAction() + /// + /// Set the host to ping. + /// + /// Host to ping + /// Group to add the host to + /// True if the host was set successfully, otherwise false + public bool SetHost(string host, string group = null) + { + // Check if it is already running or canceling + if (IsRunning || IsCanceling) { - if (SelectedHost != null) - SelectedHost.Export(); - } + DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + Strings.CannotSetHostWhileRunningMessage, ChildWindowIcon.Error); - public ICommand AddHostProfileCommand => new RelayCommand(p => AddHostProfileAction(), AddHostProfile_CanExecute); - - private bool AddHostProfile_CanExecute(object obj) - { - return !IsSearching && SelectedProfile != null; + return false; } - private void AddHostProfileAction() - { - AddHost(SelectedProfile.PingMonitor_Host); - } + if (group != null) + _group = group; - public ICommand AddProfileCommand => new RelayCommand(p => AddProfileAction()); + Host = host; - private void AddProfileAction() - { - ProfileDialogManager.ShowAddProfileDialog(this, _dialogCoordinator); - } + return true; + } - public ICommand EditProfileCommand => new RelayCommand(p => EditProfileAction()); + /// + /// Starts the ping monitor. + /// + public async Task Start() + { + IsStatusMessageDisplayed = false; + IsRunning = true; - private void EditProfileAction() - { - ProfileDialogManager.ShowEditProfileDialog(this, _dialogCoordinator, SelectedProfile); - } + _cancellationTokenSource?.Dispose(); + _cancellationTokenSource = new CancellationTokenSource(); - public ICommand CopyAsProfileCommand => new RelayCommand(p => CopyAsProfileAction()); + // Resolve hostnames + (List<(IPAddress ipAddress, string hostname)> hosts, List hostnamesNotResolved) hosts; - private void CopyAsProfileAction() + try { - ProfileDialogManager.ShowCopyAsProfileDialog(this, _dialogCoordinator, SelectedProfile); + hosts = await HostRangeHelper.ResolveAsync(HostRangeHelper.CreateListFromInput(Host), + SettingsManager.Current.Network_ResolveHostnamePreferIPv4, _cancellationTokenSource.Token); } - - public ICommand DeleteProfileCommand => new RelayCommand(p => DeleteProfileAction()); - - private void DeleteProfileAction() + catch (OperationCanceledException) { - ProfileDialogManager.ShowDeleteProfileDialog(this, _dialogCoordinator, new List { SelectedProfile }); - } - - public ICommand EditGroupCommand => new RelayCommand(EditGroupAction); + UserHasCanceled(); - private void EditGroupAction(object group) - { - ProfileDialogManager.ShowEditGroupDialog(this, _dialogCoordinator, ProfileManager.GetGroup(group.ToString())); + return; } - public ICommand ClearSearchCommand => new RelayCommand(p => ClearSearchAction()); - - private void ClearSearchAction() + // Show error message if (some) hostnames could not be resolved + if (hosts.hostnamesNotResolved.Count > 0) { - Search = string.Empty; + StatusMessage = + $"{Strings.TheFollowingHostnamesCouldNotBeResolved} {string.Join(", ", hosts.hostnamesNotResolved)}"; + IsStatusMessageDisplayed = true; } - #endregion - - #region Methods - public async Task AddHost(string host) - { - IsWorking = true; - IsStatusMessageDisplayed = false; - _hostId++; + // Add host(s) to history + AddHostToHistory(Host); - string hostname = string.Empty; - - // Resolve hostname - if (IPAddress.TryParse(host, out IPAddress ipAddress)) - { - hostname = await DnsLookupHelper.ResolveHostname(ipAddress); - } - else // Resolve ip address - { - hostname = host; - ipAddress = await DnsLookupHelper.ResolveIPAddress(host); - } - - if (ipAddress != null) - { - Hosts.Add(new PingMonitorView(_hostId, RemoveHost, new PingMonitorOptions(hostname, ipAddress))); - } - else - { - StatusMessage = string.Format(Localization.Resources.Strings.CouldNotResolveIPAddressFor, host); - IsStatusMessageDisplayed = true; - } - - IsWorking = false; - } - - private void RemoveHost(int hostId) + // Add host(s) to list and start the ping + foreach (var hostView in hosts.hosts.Select(currentHost => + new PingMonitorView(Guid.NewGuid(), RemoveHostByGuid, currentHost, _group))) { - var index = -1; - - foreach (var host in Hosts) + // Check if the user has canceled the operation + if (_cancellationTokenSource.IsCancellationRequested) { - if (host.HostId == hostId) - index = Hosts.IndexOf(host); - } + UserHasCanceled(); - if (index != -1) - { - Hosts[index].CloseView(); - Hosts.RemoveAt(index); + return; } - } - private void AddHostToHistory(string host) - { - // Create the new list - var list = ListHelper.Modify(SettingsManager.Current.PingMonitor_HostHistory.ToList(), host, SettingsManager.Current.General_HistoryListEntries); + Hosts.Add(hostView); - // Clear the old items - SettingsManager.Current.PingMonitor_HostHistory.Clear(); - OnPropertyChanged(nameof(Host)); // Raise property changed again, after the collection has been cleared + // Start the ping + hostView.Start(); - // Fill with the new items - list.ForEach(x => SettingsManager.Current.PingMonitor_HostHistory.Add(x)); + // Wait a bit to prevent the UI from freezing + await Task.Delay(25); } - private void StartDelayedSearch() - { - if (!IsSearching) - { - IsSearching = true; - - _searchDispatcherTimer.Start(); - } - else - { - _searchDispatcherTimer.Stop(); - _searchDispatcherTimer.Start(); - } - } + Host = string.Empty; + _group = Strings.Hosts; // Reset the group - private void StopDelayedSearch() - { - _searchDispatcherTimer.Stop(); - - RefreshProfiles(); + IsCanceling = false; + IsRunning = false; + } - IsSearching = false; - } + private void Stop() + { + IsCanceling = true; + _cancellationTokenSource.Cancel(); + } - private void ResizeProfile(bool dueToChangedSize) + private void RemoveGroup(string group) + { + for (var i = Hosts.Count - 1; i >= 0; i--) { - _canProfileWidthChange = false; - - if (dueToChangedSize) - { - ExpandProfileView = Math.Abs(ProfileWidth.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > GlobalStaticConfiguration.FloatPointFix; - } - else - { - if (ExpandProfileView) - { - ProfileWidth = Math.Abs(_tempProfileWidth - GlobalStaticConfiguration.Profile_WidthCollapsed) < GlobalStaticConfiguration.FloatPointFix ? new GridLength(GlobalStaticConfiguration.Profile_DefaultWidthExpanded) : new GridLength(_tempProfileWidth); - } - else - { - _tempProfileWidth = ProfileWidth.Value; - ProfileWidth = new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); - } - } + if (!Hosts[i].Group.Equals(group)) + continue; - _canProfileWidthChange = true; + Hosts[i].Stop(); + Hosts[i].Cleanup(); + Hosts.RemoveAt(i); } + } - public void OnViewVisible() - { - _isViewActive = true; + private void RemoveHostByGuid(Guid hostId) + { + var i = -1; - RefreshProfiles(); - } + foreach (var host in Hosts) + if (host.HostId.Equals(hostId)) + i = Hosts.IndexOf(host); - public void OnViewHide() - { - _isViewActive = false; - } + if (i == -1) + return; - public void RefreshProfiles() - { - if (!_isViewActive) - return; + Hosts[i].Stop(); + Hosts[i].Cleanup(); + Hosts.RemoveAt(i); + } - Profiles.Refresh(); - } + private void AddHostToHistory(string host) + { + // Create the new list + var list = ListHelper.Modify([.. SettingsManager.Current.PingMonitor_HostHistory], host, + SettingsManager.Current.General_HistoryListEntries); - public void OnProfileDialogOpen() - { + // Clear the old items + SettingsManager.Current.PingMonitor_HostHistory.Clear(); + OnPropertyChanged(nameof(Host)); // Raise property changed again, after the collection has been cleared - } + // Fill with the new items + list.ForEach(SettingsManager.Current.PingMonitor_HostHistory.Add); + } - public void OnProfileDialogClose() - { + #endregion - } - #endregion + #region Event - #region Event - private void ProfileManager_OnProfilesUpdated(object sender, EventArgs e) - { - RefreshProfiles(); - } + private void UserHasCanceled() + { + StatusMessage = Strings.CanceledByUserMessage; + IsStatusMessageDisplayed = true; - private void SearchDispatcherTimer_Tick(object sender, EventArgs e) - { - StopDelayedSearch(); - } - #endregion + IsCanceling = false; + IsRunning = false; } + + #endregion } diff --git a/Source/NETworkManager/ViewModels/PingMonitorSettingsViewModel.cs b/Source/NETworkManager/ViewModels/PingMonitorSettingsViewModel.cs index 420e21b91f..f3692fbaa7 100644 --- a/Source/NETworkManager/ViewModels/PingMonitorSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/PingMonitorSettingsViewModel.cs @@ -1,153 +1,275 @@ -using NETworkManager.Settings; +using NETworkManager.Settings; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +/// +/// Represents the settings for the Ping Monitor. +/// +public class PingMonitorSettingsViewModel : ViewModelBase { - public class PingMonitorSettingsViewModel : ViewModelBase + #region Variables + + private readonly bool _isLoading; + + /// + /// Gets or sets the timeout in milliseconds. + /// + public int Timeout { - #region Variables - private readonly bool _isLoading; - - private int _timeout; - public int Timeout + get; + set { - get => _timeout; - set - { - if (value == _timeout) - return; - - if (!_isLoading) - SettingsManager.Current.PingMonitor_Timeout = value; - - _timeout = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.PingMonitor_Timeout = value; + + field = value; + OnPropertyChanged(); } + } - private int _buffer; - public int Buffer + /// + /// Gets or sets the buffer size in bytes. + /// + public int Buffer + { + get; + set { - get => _buffer; - set - { - if (value == _buffer) - return; - - if (!_isLoading) - SettingsManager.Current.PingMonitor_Buffer = value; - - _buffer = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.PingMonitor_Buffer = value; + + field = value; + OnPropertyChanged(); } + } - private int _ttl; - public int TTL + /// + /// Gets or sets the time to live (TTL). + /// + public int TTL + { + get; + set { - get => _ttl; - set - { - if (value == _ttl) - return; - - if (!_isLoading) - SettingsManager.Current.PingMonitor_TTL = value; - - _ttl = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.PingMonitor_TTL = value; + + field = value; + OnPropertyChanged(); } + } - private bool _dontFragment; - public bool DontFragment + /// + /// Gets or sets a value indicating whether the Don't Fragment flag is set. + /// + public bool DontFragment + { + get; + set { - get => _dontFragment; - set - { - if (value == _dontFragment) - return; - - if (!_isLoading) - SettingsManager.Current.PingMonitor_DontFragment = value; - - _dontFragment = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.PingMonitor_DontFragment = value; + + field = value; + OnPropertyChanged(); } + } - private int _waitTime; - public int WaitTime + /// + /// Gets or sets the wait time between pings in milliseconds. + /// + public int WaitTime + { + get; + set { - get => _waitTime; - set - { - if (value == _waitTime) - return; - - if (!_isLoading) - SettingsManager.Current.PingMonitor_WaitTime = value; - - _waitTime = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.PingMonitor_WaitTime = value; + + field = value; + OnPropertyChanged(); } + } + /// + /// Gets or sets a value indicating whether the host view is expanded. + /// + public bool ExpandHostView + { + get; + set + { + if (value == field) + return; - private bool _resolveHostnamePreferIPv4; - public bool ResolveHostnamePreferIPv4 + if (!_isLoading) + SettingsManager.Current.PingMonitor_ExpandHostView = value; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets or sets the chart time window in seconds. + /// + public int ChartTime + { + get; + set { - get => _resolveHostnamePreferIPv4; - set - { - if (value == _resolveHostnamePreferIPv4) - return; - - if (!_isLoading) - SettingsManager.Current.PingMonitor_ResolveHostnamePreferIPv4 = value; - - _resolveHostnamePreferIPv4 = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.PingMonitor_ChartTime = value; + + field = value; + OnPropertyChanged(); } + } - private bool _resolveHostnamePreferIPv6; - public bool ResolveHostnamePreferIPv6 + /// + /// Gets or sets a value indicating whether a notification popup is shown on status change. + /// + public bool ShowNotificationPopup + { + get; + set { - get => _resolveHostnamePreferIPv6; - set - { - if (value == _resolveHostnamePreferIPv6) - return; - - _resolveHostnamePreferIPv6 = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.PingMonitor_ShowNotificationPopup = value; + + field = value; + OnPropertyChanged(); } - #endregion + } - #region Contructor, load settings - public PingMonitorSettingsViewModel() + /// + /// Gets or sets a value indicating whether a sound is played on status change. + /// + public bool NotificationSound + { + get; + set { - _isLoading = true; + if (value == field) + return; - LoadSettings(); + if (!_isLoading) + SettingsManager.Current.PingMonitor_NotificationSound = value; - _isLoading = false; + field = value; + OnPropertyChanged(); } + } - private void LoadSettings() - { - Timeout = SettingsManager.Current.PingMonitor_Timeout; - Buffer = SettingsManager.Current.PingMonitor_Buffer; - TTL = SettingsManager.Current.PingMonitor_TTL; - DontFragment = SettingsManager.Current.PingMonitor_DontFragment; - WaitTime = SettingsManager.Current.PingMonitor_WaitTime; - - if (SettingsManager.Current.PingMonitor_ResolveHostnamePreferIPv4) - ResolveHostnamePreferIPv4 = true; - else - ResolveHostnamePreferIPv6 = true; + /// + /// Gets or sets the number of consecutive successful pings required before an UP notification fires. + /// + public int NotificationSuccessThreshold + { + get; + set + { + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.PingMonitor_NotificationSuccessThreshold = value; + + field = value; + OnPropertyChanged(); } - #endregion } + + /// + /// Gets or sets the number of consecutive failed pings required before a DOWN notification fires. + /// + public int NotificationFailureThreshold + { + get; + set + { + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.PingMonitor_NotificationFailureThreshold = value; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets or sets the time in seconds the notification popup is shown before it closes automatically. + /// + public int NotificationCloseTime + { + get; + set + { + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.PingMonitor_NotificationCloseTime = value; + + field = value; + OnPropertyChanged(); + } + } + + #endregion + + #region Contructor, load settings + + /// + /// Initializes a new instance of the class. + /// + public PingMonitorSettingsViewModel() + { + _isLoading = true; + + LoadSettings(); + + _isLoading = false; + } + + private void LoadSettings() + { + Timeout = SettingsManager.Current.PingMonitor_Timeout; + Buffer = SettingsManager.Current.PingMonitor_Buffer; + TTL = SettingsManager.Current.PingMonitor_TTL; + DontFragment = SettingsManager.Current.PingMonitor_DontFragment; + WaitTime = SettingsManager.Current.PingMonitor_WaitTime; + ExpandHostView = SettingsManager.Current.PingMonitor_ExpandHostView; + ChartTime = SettingsManager.Current.PingMonitor_ChartTime; + ShowNotificationPopup = SettingsManager.Current.PingMonitor_ShowNotificationPopup; + NotificationSound = SettingsManager.Current.PingMonitor_NotificationSound; + NotificationSuccessThreshold = SettingsManager.Current.PingMonitor_NotificationSuccessThreshold; + NotificationFailureThreshold = SettingsManager.Current.PingMonitor_NotificationFailureThreshold; + NotificationCloseTime = SettingsManager.Current.PingMonitor_NotificationCloseTime; + } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/PingMonitorViewModel.cs b/Source/NETworkManager/ViewModels/PingMonitorViewModel.cs index 3fb1ccfe09..7604960eb5 100644 --- a/Source/NETworkManager/ViewModels/PingMonitorViewModel.cs +++ b/Source/NETworkManager/ViewModels/PingMonitorViewModel.cs @@ -1,386 +1,873 @@ -using NETworkManager.Models.Network; +using LiveChartsCore; +using LiveChartsCore.Drawing; +using LiveChartsCore.Kernel; +using LiveChartsCore.SkiaSharpView; +using LiveChartsCore.SkiaSharpView.Painting; +using LiveChartsCore.SkiaSharpView.Painting.Effects; +using log4net; +using MahApps.Metro.IconPacks; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Localization.Resources; +using NETworkManager.Models.Export; +using NETworkManager.Models.Network; using NETworkManager.Settings; +using NETworkManager.Utilities; +using NETworkManager.Views; +using SkiaSharp; using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; using System.Net; +using System.Net.NetworkInformation; using System.Threading; +using System.Threading.Tasks; using System.Windows; using System.Windows.Input; using System.Windows.Threading; -using NETworkManager.Utilities; -using LiveCharts; -using LiveCharts.Configurations; -using LiveCharts.Wpf; -using System.Collections.Generic; -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.Views; -using NETworkManager.Models.Export; -using System.Collections.ObjectModel; -using System.Threading.Tasks; +using Ping = NETworkManager.Models.Network.Ping; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +/// +/// ViewModel for the Ping Monitor feature, representing a single monitored host. +/// +public class PingMonitorViewModel : ViewModelBase { - public class PingMonitorViewModel : ViewModelBase + #region Contructor, load settings + + /// + /// Initializes a new instance of the class. + /// + /// The unique identifier for the host. + /// Action to remove the host by its GUID. + /// Tuple containing the IP address and hostname. + /// The group name the host belongs to. + public PingMonitorViewModel(Guid hostId, Action removeHostByGuid, + (IPAddress ipAddress, string hostname) host, string group) { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - private CancellationTokenSource _cancellationTokenSource; + HostId = hostId; + _removeHostByGuid = removeHostByGuid; + + Title = string.IsNullOrEmpty(host.hostname) ? host.ipAddress.ToString() : $"{host.hostname} # {host.ipAddress}"; + + IPAddress = host.ipAddress; + Hostname = host.hostname; + Group = group; - public readonly int HostId; - private readonly Action _closeCallback; - private readonly PingMonitorOptions _pingMonitorOptions; - private bool _firstLoad = true; + InitialTimeChart(); - private List _pingInfoList; + ExpandHostView = SettingsManager.Current.PingMonitor_ExpandHostView; - private string _host; - public string Host + SettingsManager.Current.PropertyChanged += SettingsManager_PropertyChanged; + } + + #endregion + + #region Variables + private static readonly ILog Log = LogManager.GetLogger(typeof(PingMonitorViewModel)); + + private CancellationTokenSource _cancellationTokenSource; + private int _maxPingValues; + private int _sessionId; + private bool _updatingAxisFromCode; + + public readonly Guid HostId; + private readonly Action _removeHostByGuid; + + private List _pingInfoList = []; + + // Notification threshold tracking. The status transition (and notification) only fires once + // the configured number of consecutive successes/failures is reached, to avoid noise from + // flapping hosts. The initial state is established silently (no notification). + private int _consecutiveSuccesses; + private int _consecutiveFailures; + private bool _initialStateEstablished; + + /// + /// Gets the title of the monitor, typically "Hostname # IP". + /// + public string Title + { + get; + private set { - get => _host; - set - { - if (value == _host) - return; + if (value == field) + return; - _host = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private IPAddress _ipAddress; - public IPAddress IPAddress + /// + /// Gets the host display name used as the notification header: the hostname if available, + /// otherwise the IP address as a fallback. + /// + private string NotificationHostDisplay => + string.IsNullOrEmpty(Hostname) ? IPAddress.ToString() : Hostname.TrimEnd('.'); + + /// + /// Gets the hostname of the monitored host. + /// + public string Hostname + { + get; + private set { - get => _ipAddress; - set - { - if (value == _ipAddress) - return; + if (value == field) + return; - _ipAddress = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isRunning; - public bool IsRunning + /// + /// Gets the IP address of the monitored host. + /// + public IPAddress IPAddress + { + get; + private init { - get => _isRunning; - set - { - if (value == _isRunning) - return; + if (Equals(value, field)) + return; - _isRunning = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isReachable; - public bool IsReachable + /// + /// Gets or sets the group the monitored host belongs to. + /// + public string Group + { + get; + set { - get => _isReachable; - set - { - if (value == _isReachable) - return; + if (value == field) + return; - _isReachable = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private DateTime _statusTime; - public DateTime StatusTime + /// + /// Gets or sets a value indicating whether the ping monitoring is currently running. + /// + public bool IsRunning + { + get; + set { - get => _statusTime; - set - { - if (value == _statusTime) - return; + if (value == field) + return; - _statusTime = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private int _transmitted; - public int Transmitted + /// + /// Gets or sets a value indicating whether the host is reachable (responds to ping). + /// + public bool IsReachable + { + get; + set { - get => _transmitted; - set - { - if (value == _transmitted) - return; + if (value == field) + return; - _transmitted = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private int _received; - public int Received + /// + /// Gets the time of the last status update. + /// + public DateTime StatusTime + { + get; + private set { - get => _received; - set - { - if (value == _received) - return; + if (value == field) + return; - _received = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private int _lost; - public int Lost + /// + /// Gets or sets the total number of ping packets transmitted. + /// + public int Transmitted + { + get; + set { - get => _lost; - set - { - if (value == _lost) - return; + if (value == field) + return; - _lost = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private void InitialTimeChart() + /// + /// Gets the total number of ping packets received. + /// + public int Received + { + get; + private set { - var dayConfig = Mappers.Xy() - .X(dayModel => (double)dayModel.DateTime.Ticks / TimeSpan.FromHours(1).Ticks) - .Y(dayModel => dayModel.Value); - - Series = new SeriesCollection(dayConfig) - { - new LineSeries - { - Title = "Time", - Values = new ChartValues(), - PointGeometry = null - } - }; + if (value == field) + return; - FormatterDate = value => new DateTime((long)(value * TimeSpan.FromHours(1).Ticks)).ToString("hh:mm:ss"); - FormatterPingTime = value => $"{value} ms"; + field = value; + OnPropertyChanged(); } + } - public Func FormatterDate { get; set; } - public Func FormatterPingTime { get; set; } - public SeriesCollection Series { get; set; } - #endregion - - #region Contructor, load settings - public PingMonitorViewModel(IDialogCoordinator instance, int hostId, Action closeCallback, PingMonitorOptions options) + /// + /// Gets or sets the total number of ping packets lost. + /// + public int Lost + { + get; + set { - _dialogCoordinator = instance; + if (value == field) + return; - HostId = hostId; - _closeCallback = closeCallback; - _pingMonitorOptions = options; + field = value; + OnPropertyChanged(); + } + } - Host = _pingMonitorOptions.Host; - IPAddress = _pingMonitorOptions.IPAddress; + /// + /// Gets or sets the percentage of packet loss. + /// + public double PacketLoss + { + get; + set + { + if (Math.Abs(value - field) < 0.01) + return; - InitialTimeChart(); + field = value; + OnPropertyChanged(); } + } - public void OnLoaded() + /// + /// Gets or sets the round-trip time in milliseconds of the last ping. + /// + public long TimeMs + { + get; + set { - if (!_firstLoad) + if (value == field) return; - StartPing(); - - _firstLoad = false; + field = value; + OnPropertyChanged(); } - #endregion + } - #region ICommands & Actions - public ICommand PingCommand => new RelayCommand(p => PingAction()); + private ObservableCollection _pingValues; - private void PingAction() - { - Ping(); - } + /// + /// Initializes the time chart configuration. + /// + private void InitialTimeChart() + { + _pingValues = []; - public ICommand CloseCommand => new RelayCommand(p => CloseAction()); + var chartColor = SKColor.Parse("#1ba1e2"); - private void CloseAction() - { - _closeCallback(HostId); - } - #endregion + var labelColor = Application.Current?.TryFindResource("MahApps.Brushes.Gray5") is System.Windows.Media.SolidColorBrush gray5 + ? new SKColor(gray5.Color.R, gray5.Color.G, gray5.Color.B, gray5.Color.A) + : new SKColor(0x68, 0x68, 0x68); - #region Methods - private void Ping() - { - if (IsRunning) - StopPing(); - else - StartPing(); - } + var separatorColor = Application.Current?.TryFindResource("MahApps.Brushes.Gray8") is System.Windows.Media.SolidColorBrush gray8 + ? new SKColor(gray8.Color.R, gray8.Color.G, gray8.Color.B, gray8.Color.A) + : new SKColor(0x80, 0x80, 0x80); - private void StartPing() - { - IsRunning = true; + Series = + [ + new LineSeries + { + Name = Strings.Time, + Values = _pingValues, + Mapping = (info, _) => double.IsNaN(info.Value) + ? Coordinate.Empty + : new((info.DateTime - _sessionStartTime).TotalSeconds, info.Value), + GeometrySize = 0, + LineSmoothness = 0.3, + DataPadding = new LvcPoint(0, 0), + Stroke = new SolidColorPaint(chartColor) { StrokeThickness = 1.5f }, + Fill = new SolidColorPaint(chartColor.WithAlpha(0x33)) + } + ]; - // Reset history - _pingInfoList = new List(); + PingXAxes = + [ + new Axis + { + Labeler = value => DateTimeHelper.DateTimeToTimeString( + _sessionStartTime.AddSeconds(value)), + TextSize = 10, + Padding = new Padding(0, 4, 0, 0), + LabelsPaint = new SolidColorPaint(labelColor), + SeparatorsPaint = new SolidColorPaint(separatorColor) + { + StrokeThickness = 1, + PathEffect = new DashEffect([10f, 10f]) + }, + MinStep = SettingsManager.Current.PingMonitor_ChartTime / 4.0, + ForceStepToMin = true + } + ]; - // Reset the latest results - StatusTime = DateTime.Now; - Transmitted = 0; - Received = 0; - Lost = 0; + PingYAxes = + [ + new Axis + { + MinLimit = 0, + MinStep = 25, + ForceStepToMin = true, + Labeler = value => $"{value} ms", + TextSize = 11, + Padding = new Padding(4, 0), + LabelsPaint = new SolidColorPaint(labelColor), + SeparatorsPaint = new SolidColorPaint(separatorColor) + { + StrokeThickness = 1, + PathEffect = new DashEffect([10f, 10f]) + } + } + ]; - // Reset chart - ResetTimeChart(); + PingXAxes[0].PropertyChanged += (_, args) => + { + if (_updatingAxisFromCode) + return; + + if (args.PropertyName is not (nameof(Axis.MinLimit) or nameof(Axis.MaxLimit))) + return; - _cancellationTokenSource = new CancellationTokenSource(); + IsLiveMode = false; - var ping = new Ping + var axis = PingXAxes[0]; + if (axis.MinLimit.HasValue && axis.MaxLimit.HasValue) { - Timeout = SettingsManager.Current.PingMonitor_Timeout, - Buffer = new byte[SettingsManager.Current.PingMonitor_Buffer], - TTL = SettingsManager.Current.PingMonitor_TTL, - DontFragment = SettingsManager.Current.PingMonitor_DontFragment, - WaitTime = SettingsManager.Current.PingMonitor_WaitTime, - Hostname = Host - }; - - ping.PingReceived += Ping_PingReceived; - ping.PingException += Ping_PingException; - ping.UserHasCanceled += Ping_UserHasCanceled; - - ping.SendAsync(IPAddress, _cancellationTokenSource.Token); + _updatingAxisFromCode = true; + axis.MinStep = (axis.MaxLimit.Value - axis.MinLimit.Value) / 4.0; + _updatingAxisFromCode = false; + } + }; + } + + /// + /// Gets or sets the series collection for the chart. + /// + public ISeries[] Series { get; private set; } + + /// + /// Gets the X-axes configuration for the ping time chart. + /// + public Axis[] PingXAxes { get; private set; } + + /// + /// Gets the Y-axes configuration for the ping time chart. + /// + public Axis[] PingYAxes { get; private set; } + + /// + /// Gets or sets a value indicating whether the chart is in live (auto-scrolling) mode. + /// + public bool IsLiveMode + { + get; + private set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - private void StopPing() + /// + /// Gets the error message if an error occurs. + /// + public string ErrorMessage + { + get; + private set { - _cancellationTokenSource?.Cancel(); + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - private void PingFinished() + /// + /// Gets or sets a value indicating whether the error message is displayed. + /// + public bool IsErrorMessageDisplayed + { + get; + set { - IsRunning = false; + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - public void ResetTimeChart() + /// + /// Gets or sets a value indicating whether the host view is expanded. + /// + public bool ExpandHostView + { + get; + set { - if (Series == null) + if (value == field) return; - Series[0].Values.Clear(); + field = value; + OnPropertyChanged(); + } + } - var currentDateTime = DateTime.Now; + #endregion - for (var i = 30; i > 0; i--) - { - var bandwidthInfo = new LvlChartsDefaultInfo(currentDateTime.AddSeconds(-i), double.NaN); + #region ICommands & Actions - Series[0].Values.Add(bandwidthInfo); - } - } + /// + /// Gets the command to start or stop the ping monitoring. + /// + public ICommand PingCommand => new RelayCommand(_ => PingAction()); - public async Task Export() - { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.Export - }; + /// + /// Action to start or stop the ping monitoring. + /// + private void PingAction() + { + if (IsRunning) + Stop(); + else + Start(); + } - var exportViewModel = new ExportViewModel(async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + /// + /// Gets the command to close the monitor and remove the host. + /// + public ICommand CloseCommand => new RelayCommand(_ => CloseAction()); - try - { - ExportManager.Export(instance.FilePath, instance.FileType, new ObservableCollection (_pingInfoList)); - } - catch (Exception ex) - { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Localization.Resources.Strings.OK; + private void CloseAction() + { + _removeHostByGuid(HostId); + } - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Error, Localization.Resources.Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); - } + /// + /// Gets the command to export the ping monitoring results of this host. + /// + public ICommand ExportCommand => new RelayCommand(_ => ExportAction()); - SettingsManager.Current.PingMonitor_ExportFileType = instance.FileType; - SettingsManager.Current.PingMonitor_ExportFilePath = instance.FilePath; - }, instance => { _dialogCoordinator.HideMetroDialogAsync(this, customDialog); }, new ExportManager.ExportFileType[] { ExportManager.ExportFileType.CSV, ExportManager.ExportFileType.XML, ExportManager.ExportFileType.JSON }, true, SettingsManager.Current.PingMonitor_ExportFileType, SettingsManager.Current.PingMonitor_ExportFilePath); + private void ExportAction() + { + _ = Export(); + } - customDialog.Content = new ExportDialog - { - DataContext = exportViewModel - }; + /// + /// Gets the command to return the chart to live (auto-scrolling) mode. + /// + public ICommand GoLiveCommand => new RelayCommand(_ => GoLiveAction()); - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } + private void GoLiveAction() + { + IsLiveMode = true; - public void OnClose() + // Samples received while inspecting were not added to the chart, so rebuild the + // rolling buffer from the most recent history to resume at the current time. + var recent = _pingInfoList + .Skip(Math.Max(0, _pingInfoList.Count - _maxPingValues)) + .Select(info => new LvlChartsDefaultInfo( + info.Timestamp, info.Status == IPStatus.Success ? info.Time : double.NaN)); + + _pingValues = new ObservableCollection(recent); + ((LineSeries)Series[0]).Values = _pingValues; + + UpdateXAxisWindow(DateTime.Now); + UpdateYAxis(); + } + + #endregion + + #region Methods + + /// + /// Starts the ping monitoring. + /// + public void Start() + { + IsErrorMessageDisplayed = false; + IsRunning = true; + IsLiveMode = true; + + _sessionId++; + + // Reset history + _pingInfoList = []; + + // Reset the latest results + StatusTime = DateTime.Now; + Transmitted = 0; + Received = 0; + Lost = 0; + PacketLoss = 0; + + // Reset notification threshold tracking so the initial state is re-established silently. + // IsReachable is cleared too, so a prior run's state can't linger and show a stale (e.g. + // green "up") icon during the first few pings before the new initial state is established. + _consecutiveSuccesses = 0; + _consecutiveFailures = 0; + _initialStateEstablished = false; + IsReachable = false; + + // Reset chart + _sessionStartTime = DateTime.Now; + ResetTimeChart(); + + _cancellationTokenSource?.Dispose(); + _cancellationTokenSource = new CancellationTokenSource(); + + UpdateMaxPingValues(); + + var ping = new Ping { - // Stop the ping - if (IsRunning) - StopPing(); - } - #endregion + Timeout = SettingsManager.Current.PingMonitor_Timeout, + Buffer = new byte[SettingsManager.Current.PingMonitor_Buffer], + TTL = SettingsManager.Current.PingMonitor_TTL, + DontFragment = SettingsManager.Current.PingMonitor_DontFragment, + WaitTime = SettingsManager.Current.PingMonitor_WaitTime + }; + + ping.PingReceived += Ping_PingReceived; + ping.PingException += Ping_PingException; + ping.HostnameResolved += Ping_HostnameResolved; + ping.UserHasCanceled += Ping_UserHasCanceled; + + ping.SendAsync(IPAddress, _cancellationTokenSource.Token); + } + + /// + /// Stops the ping monitoring. + /// + public void Stop() + { + if (!IsRunning) + return; + + _cancellationTokenSource?.Cancel(); + } + + private DateTime _sessionStartTime; - #region Events - private void Ping_PingReceived(object sender, PingReceivedArgs e) + private void ResetTimeChart() + { + if (_pingValues == null) + return; + + _pingValues.Clear(); + UpdateXAxisWindow(DateTime.Now); + } + + private void UpdateXAxisWindow(DateTime now) + { + _updatingAxisFromCode = true; + var axis = PingXAxes[0]; + var chartTime = SettingsManager.Current.PingMonitor_ChartTime; + var elapsed = (now - _sessionStartTime).TotalSeconds; + axis.MinStep = chartTime / 4.0; + axis.MinLimit = elapsed - chartTime; + axis.MaxLimit = elapsed; + _updatingAxisFromCode = false; + } + + /// + /// Exports the ping monitoring results to a file. + /// + /// A task that represents the asynchronous operation. + public Task Export() + { + var childWindow = new ExportChildWindow(); + + var childWindowViewModel = new ExportViewModel(async instance => { - var pingInfo = PingInfo.Parse(e); + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - // Calculate statistics - Transmitted++; + try + { + ExportManager.Export(instance.FilePath, instance.FileType, + new ObservableCollection(_pingInfoList)); + } + catch (Exception ex) + { + Log.Error("Error while exporting data as " + instance.FileType, ex); - LvlChartsDefaultInfo timeInfo; + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); + } - if (pingInfo.Status == System.Net.NetworkInformation.IPStatus.Success) + SettingsManager.Current.PingMonitor_ExportFileType = instance.FileType; + SettingsManager.Current.PingMonitor_ExportFilePath = instance.FilePath; + }, _ => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, [ + ExportFileType.Csv, ExportFileType.Xml, ExportFileType.Json + ], false, + SettingsManager.Current.PingMonitor_ExportFileType, + SettingsManager.Current.PingMonitor_ExportFilePath); + + childWindow.Title = Strings.Export; + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } + + #endregion + + #region Events + + /// + /// Handles the PingReceived event. Updates statistics and the chart. + /// + /// The source of the event. + /// The instance containing the event data. + private void Ping_PingReceived(object sender, PingReceivedArgs e) + { + // Calculate statistics + Transmitted++; + + LvlChartsDefaultInfo timeInfo; + + var successThreshold = SettingsManager.Current.PingMonitor_NotificationSuccessThreshold; + var failureThreshold = SettingsManager.Current.PingMonitor_NotificationFailureThreshold; + + if (e.Args.Status == IPStatus.Success) + { + _consecutiveSuccesses++; + _consecutiveFailures = 0; + + if (!_initialStateEstablished) { - if (!IsReachable) + if (_consecutiveSuccesses >= successThreshold) { + _initialStateEstablished = true; StatusTime = DateTime.Now; IsReachable = true; + // No notification — this is the initial state being established. } + } + else if (!IsReachable && _consecutiveSuccesses >= successThreshold) + { + StatusTime = DateTime.Now; + IsReachable = true; - Received++; + if (SettingsManager.Current.PingMonitor_NotificationSound) + NotificationManager.PlaySound(System.Media.SystemSounds.Asterisk); // gentle info sound for UP - timeInfo = new LvlChartsDefaultInfo(pingInfo.Timestamp, pingInfo.Time); + if (SettingsManager.Current.PingMonitor_ShowNotificationPopup) + NotificationManager.Show( + PackIconMaterialKind.LanConnect, "#badc58", + NotificationHostDisplay, Strings.HostIsUp, + SettingsManager.Current.PingMonitor_NotificationCloseTime); } - else + + Received++; + + timeInfo = new LvlChartsDefaultInfo(e.Args.Timestamp, e.Args.Time); + } + else + { + _consecutiveFailures++; + _consecutiveSuccesses = 0; + + if (!_initialStateEstablished) { - if (IsReachable) + if (_consecutiveFailures >= failureThreshold) { + _initialStateEstablished = true; StatusTime = DateTime.Now; IsReachable = false; + // No notification or sound — initial state. } + } + else if (IsReachable && _consecutiveFailures >= failureThreshold) + { + StatusTime = DateTime.Now; + IsReachable = false; - Lost++; + if (SettingsManager.Current.PingMonitor_NotificationSound) + NotificationManager.PlaySound(System.Media.SystemSounds.Exclamation); // warning sound for DOWN - timeInfo = new LvlChartsDefaultInfo(pingInfo.Timestamp, double.NaN); + if (SettingsManager.Current.PingMonitor_ShowNotificationPopup) + NotificationManager.Show( + PackIconMaterialKind.LanDisconnect, "Red", + NotificationHostDisplay, Strings.HostIsDown, + SettingsManager.Current.PingMonitor_NotificationCloseTime); } - Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(delegate - { - Series[0].Values.Add(timeInfo); - - if (Series[0].Values.Count > 59) - Series[0].Values.RemoveAt(0); - })); + Lost++; - // Add to history - _pingInfoList.Add(pingInfo); + timeInfo = new LvlChartsDefaultInfo(e.Args.Timestamp, double.NaN); } - private void Ping_UserHasCanceled(object sender, EventArgs e) + PacketLoss = Math.Round((double)Lost / Transmitted * 100, 2); + TimeMs = e.Args.Time; + + // Null exception may occur when the application is closing + var capturedSession = _sessionId; + Application.Current?.Dispatcher.BeginInvoke(DispatcherPriority.Normal, () => { - PingFinished(); - } + if (_sessionId != capturedSession) + return; + + // While the user is inspecting the chart (zoomed/panned, i.e. not live), keep + // the chart frozen: ignore new samples here so the view does not move and the + // buffer does not grow. The sample is still recorded in the history below and + // becomes visible again when the user returns to live mode (see GoLiveAction). + if (!IsLiveMode) + return; + + _pingValues.Add(timeInfo); + if (_pingValues.Count > _maxPingValues) + _pingValues.RemoveAt(0); + + UpdateXAxisWindow(timeInfo.DateTime); + UpdateYAxis(); + }); + + // Add to history + _pingInfoList.Add(e.Args); + } + + /// + /// Handles the UserHasCanceled event. Stops the monitoring. + /// + /// The source of the event. + /// The instance containing the event data. + private void Ping_UserHasCanceled(object sender, EventArgs e) + { + IsRunning = false; + } - private void Ping_PingException(object sender, PingExceptionArgs e) + /// + /// Handles the HostnameResolved event. Updates the hostname and title if necessary. + /// + /// The source of the event. + /// The instance containing the event data. + private void Ping_HostnameResolved(object sender, HostnameArgs e) + { + // Update title if name was not set in the constructor + if (string.IsNullOrEmpty(Hostname)) + Title = $"{e.Hostname.TrimEnd('.')} # {IPAddress}"; + + Hostname = e.Hostname; + } + + /// + /// Handles the PingException event. Stops the monitoring and displays the error. + /// + /// The source of the event. + /// The instance containing the event data. + private void Ping_PingException(object sender, PingExceptionArgs e) + { + IsRunning = false; + + ErrorMessage = e.Message; + IsErrorMessageDisplayed = true; + } + + /// + /// Unsubscribes from global settings changes. Must be called when the host is removed, + /// so this transient view model is not kept alive by the long-lived settings singleton. + /// + public void Cleanup() + { + SettingsManager.Current.PropertyChanged -= SettingsManager_PropertyChanged; + } + + private void SettingsManager_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) + { + switch (e.PropertyName) { - PingFinished(); + case nameof(SettingsInfo.PingMonitor_ChartTime): + UpdateMaxPingValues(); + if (IsRunning && IsLiveMode) + UpdateXAxisWindow(DateTime.Now); + break; + case nameof(SettingsInfo.PingMonitor_WaitTime): + UpdateMaxPingValues(); + break; } - #endregion } -} \ No newline at end of file + + /// + /// Extra share of samples kept beyond the visible window so the chart has a little + /// off-screen history (smoother left edge while live + minor pan-back headroom). + /// + private const double PingValuesHeadroom = 1.1; + + private void UpdateMaxPingValues() + { + var visibleValues = (double)SettingsManager.Current.PingMonitor_ChartTime * 1000 / + SettingsManager.Current.PingMonitor_WaitTime; + + _maxPingValues = (int)Math.Ceiling(visibleValues * PingValuesHeadroom); + } + + /// + /// Rescales the Y axis to the current values. The step is derived from a 20% padded + /// max and MaxLimit is set to step * 3, so the 4th label lands exactly on MaxLimit and + /// is never cut off by rounding. + /// + private void UpdateYAxis() + { + var maxVal = _pingValues.Where(p => !double.IsNaN(p.Value)).Select(p => p.Value).DefaultIfEmpty(0).Max(); + if (!(maxVal > 0)) + return; + + var yAxis = PingYAxes[0]; + var step = Math.Ceiling(maxVal * 1.2 / 3.0); + yAxis.MinStep = step; + yAxis.MaxLimit = step * 3; + } + + #endregion +} diff --git a/Source/NETworkManager/ViewModels/PortProfileViewModel.cs b/Source/NETworkManager/ViewModels/PortProfileViewModel.cs index 5d72d1d432..996da98ec8 100644 --- a/Source/NETworkManager/ViewModels/PortProfileViewModel.cs +++ b/Source/NETworkManager/ViewModels/PortProfileViewModel.cs @@ -1,108 +1,134 @@ -using NETworkManager.Utilities; using System; using System.Windows.Input; using NETworkManager.Models.Network; +using NETworkManager.Utilities; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +/// +/// ViewModel for managing a port profile. +/// +public class PortProfileViewModel : ViewModelBase { - public class PortProfileViewModel : ViewModelBase + private readonly PortProfileInfo _info; + private readonly bool _isLoading; + + private readonly string _previousPortAsString; + + /// + /// Initializes a new instance of the class. + /// + /// The action to execute when saving. + /// The action to execute when cancelling. + /// Indicates whether the profile is being edited. + /// The port profile information. + public PortProfileViewModel(Action saveCommand, Action cancelHandler, + bool isEdited = false, PortProfileInfo info = null) { - private readonly bool _isLoading; - - public ICommand SaveCommand { get; } + _isLoading = true; - public ICommand CancelCommand { get; } + SaveCommand = new RelayCommand(_ => saveCommand(this)); + CancelCommand = new RelayCommand(_ => cancelHandler(this)); - private string _name; - public string Name - { - get => _name; - set - { - if (_name == value) - return; + IsEdited = isEdited; - _name = value; + _info = info ?? new PortProfileInfo(); - if (!_isLoading) - CheckInfoChanged(); + Name = _info.Name; - OnPropertyChanged(); - } - } + // List to string + if (_info.Ports != null) + Ports = _info.Ports; - private string _ports; - public string Ports - { - get => _ports; - set - { - if (_ports == value) - return; + _previousPortAsString = Ports; - _ports = value; + _isLoading = false; + } - if (!_isLoading) - CheckInfoChanged(); + /// + /// Gets the command to save the profile. + /// + public ICommand SaveCommand { get; } - OnPropertyChanged(); - } - } + /// + /// Gets the command to cancel the operation. + /// + public ICommand CancelCommand { get; } - private readonly PortProfileInfo _info; + /// + /// Gets or sets the name of the profile. + /// + public string Name + { + get; + set + { + if (field == value) + return; - private string _previousPortAsString; + field = value; - private bool _infoChanged; - public bool InfoChanged - { - get => _infoChanged; - set - { - if (value == _infoChanged) - return; - - _infoChanged = value; - OnPropertyChanged(); - } - } + if (!_isLoading) + Validate(); - private bool _isEdited; - public bool IsEdited - { - get => _isEdited; - set - { - if (value == _isEdited) - return; - - _isEdited = value; - OnPropertyChanged(); - } + OnPropertyChanged(); } + } - public PortProfileViewModel(Action saveCommand, Action cancelHandler, bool isEdited = false, PortProfileInfo info = null) + /// + /// Gets or sets the ports associated with the profile. + /// + public string Ports + { + get; + set { - _isLoading = true; + if (field == value) + return; - SaveCommand = new RelayCommand(p => saveCommand(this)); - CancelCommand = new RelayCommand(p => cancelHandler(this)); + field = value; - IsEdited = isEdited; + if (!_isLoading) + Validate(); - _info = info ?? new PortProfileInfo(); + OnPropertyChanged(); + } + } - Name = _info.Name; + /// + /// Gets or sets a value indicating whether the profile information has changed. + /// + public bool InfoChanged + { + get; + set + { + if (value == field) + return; - // List to string - if (_info.Ports != null) - Ports = _info.Ports; + field = value; + OnPropertyChanged(); + } + } - _previousPortAsString = Ports; + /// + /// Gets or sets a value indicating whether the profile is being edited. + /// + public bool IsEdited + { + get; + set + { + if (value == field) + return; - _isLoading = false; + field = value; + OnPropertyChanged(); } + } - public void CheckInfoChanged() => InfoChanged = _info.Name != Name || _previousPortAsString != Ports; + private void Validate() + { + InfoChanged = _info.Name != Name || _previousPortAsString != Ports; } } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/PortProfilesViewModel.cs b/Source/NETworkManager/ViewModels/PortProfilesViewModel.cs index 4c29e56389..1ea72bf4c1 100644 --- a/Source/NETworkManager/ViewModels/PortProfilesViewModel.cs +++ b/Source/NETworkManager/ViewModels/PortProfilesViewModel.cs @@ -1,79 +1,126 @@ -using NETworkManager.Utilities; using System; -using System.Windows.Input; -using NETworkManager.Models.Network; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; using System.ComponentModel; +using System.Linq; using System.Windows.Data; +using System.Windows.Input; +using NETworkManager.Models.Network; using NETworkManager.Settings; +using NETworkManager.Utilities; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +/// +/// Represents the view model for managing port profiles. +/// +public class PortProfilesViewModel : ViewModelBase { - public class PortProfilesViewModel : ViewModelBase + #region Constructor + + /// + /// Initializes a new instance of the class. + /// + /// The action to execute when the OK command is invoked. + /// The action to execute when the Cancel command is invoked. + public PortProfilesViewModel(Action okCommand, Action cancelHandler) { - private readonly bool _isLoading; + OKCommand = new RelayCommand(_ => okCommand(this)); + CancelCommand = new RelayCommand(_ => cancelHandler(this)); - public ICommand OKCommand { get; } + PortProfiles = CollectionViewSource.GetDefaultView(SettingsManager.Current.PortScanner_PortProfiles); + PortProfiles.SortDescriptions.Add( + new SortDescription(nameof(PortProfileInfo.Name), ListSortDirection.Ascending)); + PortProfiles.Filter = o => + { + if (string.IsNullOrEmpty(Search)) + return true; - public ICommand CancelCommand { get; } + if (o is not PortProfileInfo info) + return false; + var search = Search.Trim(); - private string _search; - public string Search - { - get => _search; - set - { - if (value == _search) - return; + // Search: Name, Ports + return info.Name.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1 || + info.Ports.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1; + }; - _search = value; + SelectedPortProfiles = new ArrayList { + PortProfiles.Cast().FirstOrDefault() + }; + } - PortProfiles.Refresh(); + #endregion - OnPropertyChanged(); - } - } + #region Variables - public ICollectionView PortProfiles { get; } + /// + /// Gets the command to confirm the selection. + /// + public ICommand OKCommand { get; } - private PortProfileInfo _selectedPortProfile = new PortProfileInfo(); - public PortProfileInfo SelectedPortProfile - { - get => _selectedPortProfile; - set - { - if (value == _selectedPortProfile) - return; + /// + /// Gets the command to cancel the operation. + /// + public ICommand CancelCommand { get; } - _selectedPortProfile = value; - OnPropertyChanged(); - } - } - - public PortProfilesViewModel(Action okCommand, Action cancelHandler) + /// + /// Gets or sets the search text to filter the port profiles. + /// + public string Search + { + get; + set { - _isLoading = true; + if (value == field) + return; + + field = value; - OKCommand = new RelayCommand(p => okCommand(this)); - CancelCommand = new RelayCommand(p => cancelHandler(this)); + PortProfiles.Refresh(); - PortProfiles = CollectionViewSource.GetDefaultView(SettingsManager.Current.PortScanner_PortProfiles); - PortProfiles.SortDescriptions.Add(new SortDescription(nameof(PortProfileInfo.Name), ListSortDirection.Ascending)); - PortProfiles.Filter = o => + SelectedPortProfiles = new ArrayList { - if (string.IsNullOrEmpty(Search)) - return true; + PortProfiles.Cast().FirstOrDefault() + }; - if (!(o is PortProfileInfo info)) - return false; + OnPropertyChanged(); + } + } - var search = Search.Trim(); + /// + /// Gets the collection of port profiles. + /// + public ICollectionView PortProfiles { get; } - // Search: Name, Ports - return info.Name.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1 || info.Ports.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1; - }; + /// + /// Gets or sets the list of selected port profiles. + /// + public IList SelectedPortProfiles + { + get; + set + { + if (Equals(value, field)) + return; - _isLoading = false; + field = value; + OnPropertyChanged(); } + } = new ArrayList(); + + #endregion + + #region Methods + /// + /// Gets the selected port profiles as a typed collection. + /// + /// A collection of selected . + public IEnumerable GetSelectedPortProfiles() + { + return [.. SelectedPortProfiles.Cast()]; } + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/PortScannerHostViewModel.cs b/Source/NETworkManager/ViewModels/PortScannerHostViewModel.cs index e1dc216c49..d2b982af47 100644 --- a/Source/NETworkManager/ViewModels/PortScannerHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/PortScannerHostViewModel.cs @@ -1,379 +1,159 @@ -using System.Collections.ObjectModel; -using NETworkManager.Controls; using Dragablz; -using System.Windows.Input; -using NETworkManager.Views; +using NETworkManager.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Models; +using NETworkManager.Profiles; using NETworkManager.Utilities; -using NETworkManager.Settings; -using System.ComponentModel; +using NETworkManager.Views; using System; -using System.Windows.Data; -using MahApps.Metro.Controls.Dialogs; -using System.Windows; -using System.Linq; -using NETworkManager.Profiles; -using System.Windows.Threading; -using NETworkManager.Models; -using System.Collections.Generic; - -namespace NETworkManager.ViewModels -{ - public class PortScannerHostViewModel : ViewModelBase, IProfileManager - { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - private readonly DispatcherTimer _searchDispatcherTimer = new DispatcherTimer(); - - public IInterTabClient InterTabClient { get; } - public ObservableCollection TabItems { get; } - - private readonly bool _isLoading = true; - private bool _isViewActive = true; - - private int _tabId; - - private int _selectedTabIndex; - public int SelectedTabIndex - { - get => _selectedTabIndex; - set - { - if (value == _selectedTabIndex) - return; - - _selectedTabIndex = value; - OnPropertyChanged(); - } - } - - #region Profiles - public ICollectionView Profiles { get; } - - private ProfileInfo _selectedProfile = new ProfileInfo(); - public ProfileInfo SelectedProfile - { - get => _selectedProfile; - set - { - if (value == _selectedProfile) - return; - - _selectedProfile = value; - OnPropertyChanged(); - } - } - - private string _search; - public string Search - { - get => _search; - set - { - if (value == _search) - return; - - _search = value; - - StartDelayedSearch(); - - OnPropertyChanged(); - } - } - - private bool _isSearching; - public bool IsSearching - { - get => _isSearching; - set - { - if (value == _isSearching) - return; - - _isSearching = value; - OnPropertyChanged(); - } - } - - private bool _canProfileWidthChange = true; - private double _tempProfileWidth; - - private bool _expandProfileView; - public bool ExpandProfileView - { - get => _expandProfileView; - set - { - if (value == _expandProfileView) - return; - - if (!_isLoading) - SettingsManager.Current.PortScanner_ExpandProfileView = value; - - _expandProfileView = value; - - if (_canProfileWidthChange) - ResizeProfile(false); - - OnPropertyChanged(); - } - } - - private GridLength _profileWidth; - public GridLength ProfileWidth - { - get => _profileWidth; - set - { - if (value == _profileWidth) - return; - - if (!_isLoading && Math.Abs(value.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > GlobalStaticConfiguration.FloatPointFix) // Do not save the size when collapsed - SettingsManager.Current.PortScanner_ProfileWidth = value.Value; - - _profileWidth = value; - - if (_canProfileWidthChange) - ResizeProfile(true); - - OnPropertyChanged(); - } - } - #endregion - #endregion - - #region Constructor, load settings - public PortScannerHostViewModel(IDialogCoordinator instance) - { - _dialogCoordinator = instance; - - InterTabClient = new DragablzInterTabClient(ApplicationName.PortScanner); - - TabItems = new ObservableCollection() - { - new DragablzTabItem(Localization.Resources.Strings.NewTab, new PortScannerView(_tabId), _tabId) - }; - - Profiles = new CollectionViewSource { Source = ProfileManager.Groups.SelectMany(x => x.Profiles) }.View; - Profiles.GroupDescriptions.Add(new PropertyGroupDescription(nameof(ProfileInfo.Group))); - Profiles.SortDescriptions.Add(new SortDescription(nameof(ProfileInfo.Group), ListSortDirection.Ascending)); - Profiles.SortDescriptions.Add(new SortDescription(nameof(ProfileInfo.Name), ListSortDirection.Ascending)); - Profiles.Filter = o => - { - if (!(o is ProfileInfo info)) - return false; - - if (string.IsNullOrEmpty(Search)) - return info.PortScanner_Enabled; - - var search = Search.Trim(); - - // Search by: Tag=xxx (exact match, ignore case) - /* - if (search.StartsWith(ProfileManager.TagIdentifier, StringComparison.OrdinalIgnoreCase)) - return !string.IsNullOrEmpty(info.Tags) && info.PortScanner_Enabled && info.Tags.Replace(" ", "").Split(';').Any(str => search.Substring(ProfileManager.TagIdentifier.Length, search.Length - ProfileManager.TagIdentifier.Length).Equals(str, StringComparison.OrdinalIgnoreCase)); - */ - - // Search by: Name, PortScanner_Host - return info.PortScanner_Enabled && (info.Name.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1 || info.PortScanner_Host.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1 || info.PortScanner_Ports.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1); - }; - - // This will select the first entry as selected item... - SelectedProfile = Profiles.SourceCollection.Cast().Where(x => x.PortScanner_Enabled).OrderBy(x => x.Group).ThenBy(x => x.Name).FirstOrDefault(); - - ProfileManager.OnProfilesUpdated += ProfileManager_OnProfilesUpdated; - - _searchDispatcherTimer.Interval = GlobalStaticConfiguration.SearchDispatcherTimerTimeSpan; - _searchDispatcherTimer.Tick += SearchDispatcherTimer_Tick; - - LoadSettings(); - - _isLoading = false; - } - - private void LoadSettings() - { - ExpandProfileView = SettingsManager.Current.PortScanner_ExpandProfileView; - - ProfileWidth = ExpandProfileView ? new GridLength(SettingsManager.Current.PortScanner_ProfileWidth) : new GridLength(40); - - _tempProfileWidth = SettingsManager.Current.PortScanner_ProfileWidth; - } - #endregion - - #region ICommand & Actions - public ICommand AddTabCommand => new RelayCommand(p => AddTabAction()); +using System.Collections.ObjectModel; +using System.Windows.Input; - private void AddTabAction() - { - AddTab(); - } +namespace NETworkManager.ViewModels; - public ICommand ScanProfileCommand => new RelayCommand(p => ScanProfileAction(), ScanProfile_CanExecute); +/// +/// The view model for the Port Scanner host, managing tabs and profiles. +/// +public class PortScannerHostViewModel : ProfileHostViewModelBase +{ + #region Variables - private bool ScanProfile_CanExecute(object obj) - { - return !IsSearching && SelectedProfile != null; - } + /// + /// Gets the InterTabClient for Dragablz. + /// + public IInterTabClient InterTabClient { get; } - private void ScanProfileAction() + /// + /// Gets or sets the InterTab partition identifier. + /// + public string InterTabPartition + { + get; + set { - AddTab(SelectedProfile); - } - - public ICommand AddProfileCommand => new RelayCommand(p => AddProfileAction()); + if (value == field) + return; - private void AddProfileAction() - { - ProfileDialogManager.ShowAddProfileDialog(this, _dialogCoordinator); + field = value; + OnPropertyChanged(); } + } - public ICommand EditProfileCommand => new RelayCommand(p => EditProfileAction()); + /// + /// Gets the collection of tab items. + /// + public ObservableCollection TabItems { get; } - private void EditProfileAction() + /// + /// Gets or sets the index of the selected tab. + /// + public int SelectedTabIndex + { + get; + set { - ProfileDialogManager.ShowEditProfileDialog(this, _dialogCoordinator, SelectedProfile); - } - - public ICommand CopyAsProfileCommand => new RelayCommand(p => CopyAsProfileAction()); + if (value == field) + return; - private void CopyAsProfileAction() - { - ProfileDialogManager.ShowCopyAsProfileDialog(this, _dialogCoordinator, SelectedProfile); + field = value; + OnPropertyChanged(); } + } - public ICommand DeleteProfileCommand => new RelayCommand(p => DeleteProfileAction()); + #endregion - private void DeleteProfileAction() - { - ProfileDialogManager.ShowDeleteProfileDialog(this, _dialogCoordinator, new List { SelectedProfile }); - } + #region Constructor - public ICommand EditGroupCommand => new RelayCommand(EditGroupAction); + /// + /// Initializes a new instance of the class. + /// + public PortScannerHostViewModel() + { + InterTabClient = new DragablzInterTabClient(ApplicationName.PortScanner); + InterTabPartition = nameof(ApplicationName.PortScanner); - private void EditGroupAction(object group) - { - ProfileDialogManager.ShowEditGroupDialog(this, _dialogCoordinator, ProfileManager.GetGroup(group.ToString())); - } + var tabId = Guid.NewGuid(); - public ICommand ClearSearchCommand => new RelayCommand(p => ClearSearchAction()); + TabItems = + [ + new DragablzTabItem(Strings.NewTab, new PortScannerView(tabId), tabId) + ]; - private void ClearSearchAction() - { - Search = string.Empty; - } + InitializeProfileHost(); + } - public ItemActionCallback CloseItemCommand => CloseItemAction; + #endregion - private static void CloseItemAction(ItemActionCallbackArgs args) - { - ((args.DragablzItem.Content as DragablzTabItem)?.View as PortScannerView)?.CloseTab(); - } - #endregion + #region Profile host - #region Methods - private void StartDelayedSearch() - { - if (!IsSearching) - { - IsSearching = true; - - _searchDispatcherTimer.Start(); - } - else - { - _searchDispatcherTimer.Stop(); - _searchDispatcherTimer.Start(); - } - } + protected override ApplicationName ApplicationName => ApplicationName.PortScanner; - private void StopDelayedSearch() - { - _searchDispatcherTimer.Stop(); + protected override bool IsProfileEnabled(ProfileInfo profile) => profile.PortScanner_Enabled; - RefreshProfiles(); + protected override string GetSearchableField(ProfileInfo profile) => profile.PortScanner_Host; - IsSearching = false; - } + #endregion - private void ResizeProfile(bool dueToChangedSize) - { - _canProfileWidthChange = false; - - if (dueToChangedSize) - { - ExpandProfileView = Math.Abs(ProfileWidth.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > GlobalStaticConfiguration.FloatPointFix; - } - else - { - if (ExpandProfileView) - { - ProfileWidth = Math.Abs(_tempProfileWidth - GlobalStaticConfiguration.Profile_WidthCollapsed) < GlobalStaticConfiguration.FloatPointFix ? new GridLength(GlobalStaticConfiguration.Profile_DefaultWidthExpanded) : new GridLength(_tempProfileWidth); - } - else - { - _tempProfileWidth = ProfileWidth.Value; - ProfileWidth = new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); - } - } - - _canProfileWidthChange = true; - } + #region ICommand & Actions - public void AddTab(string host = null, string ports = null) - { - _tabId++; + /// + /// Gets the command to add a new tab. + /// + public ICommand AddTabCommand => new RelayCommand(_ => AddTabAction()); - TabItems.Add(new DragablzTabItem(string.IsNullOrEmpty(host) ? Localization.Resources.Strings.NewTab : host, new PortScannerView(_tabId, host, ports), _tabId)); + private void AddTabAction() + { + AddTab(); + } - SelectedTabIndex = TabItems.Count - 1; - } + /// + /// Gets the command to scan the selected profile. + /// + public ICommand ScanProfileCommand => new RelayCommand(_ => ScanProfileAction(), ScanProfile_CanExecute); - public void AddTab(ProfileInfo profile) - { - AddTab(profile.PortScanner_Host, profile.PortScanner_Ports); - } - - public void OnViewVisible() - { - _isViewActive = true; + private bool ScanProfile_CanExecute(object obj) + { + return !IsSearching && SelectedProfile != null; + } - RefreshProfiles(); - } + private void ScanProfileAction() + { + AddTab(SelectedProfile); + } - public void OnViewHide() - { - _isViewActive = false; - } + /// + /// Gets the callback for closing a tab item. + /// + public ItemActionCallback CloseItemCommand => CloseItemAction; - public void RefreshProfiles() - { - if (!_isViewActive) - return; - - Profiles.Refresh(); - } + private static void CloseItemAction(ItemActionCallbackArgs args) + { + ((args.DragablzItem.Content as DragablzTabItem)?.View as IDragablzTabItem)?.CloseTab(); + } - public void OnProfileDialogOpen() - { + #endregion - } + #region Methods - public void OnProfileDialogClose() - { + /// + /// Adds a new tab with the specified host and ports. + /// + /// The host to scan. + /// The ports to scan. + public void AddTab(string host = null, string ports = null) + { + var tabId = Guid.NewGuid(); - } - #endregion + TabItems.Add(new DragablzTabItem(string.IsNullOrEmpty(host) ? Strings.NewTab : host, + new PortScannerView(tabId, host, ports), tabId)); - #region Event - private void ProfileManager_OnProfilesUpdated(object sender, EventArgs e) - { - RefreshProfiles(); - } + SelectedTabIndex = TabItems.Count - 1; + } - private void SearchDispatcherTimer_Tick(object sender, EventArgs e) - { - StopDelayedSearch(); - } - #endregion + private void AddTab(ProfileInfo profile) + { + AddTab(profile.PortScanner_Host, profile.PortScanner_Ports); } -} \ No newline at end of file + + #endregion +} diff --git a/Source/NETworkManager/ViewModels/PortScannerSettingsViewModel.cs b/Source/NETworkManager/ViewModels/PortScannerSettingsViewModel.cs index 8de4b0c22d..42bb4fff47 100644 --- a/Source/NETworkManager/ViewModels/PortScannerSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/PortScannerSettingsViewModel.cs @@ -1,250 +1,272 @@ -using NETworkManager.Settings; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Localization.Resources; using NETworkManager.Models.Network; -using System.ComponentModel; -using System.Windows.Data; +using NETworkManager.Settings; using NETworkManager.Utilities; -using System.Windows.Input; -using MahApps.Metro.Controls.Dialogs; using NETworkManager.Views; +using System.ComponentModel; +using System.Linq; using System.Threading.Tasks; +using System.Windows; +using System.Windows.Data; +using System.Windows.Input; + +namespace NETworkManager.ViewModels; -namespace NETworkManager.ViewModels +/// +/// ViewModel for the Port Scanner settings. +/// +public class PortScannerSettingsViewModel : ViewModelBase { - public class PortScannerSettingsViewModel : ViewModelBase - { - #region Variables - private readonly bool _isLoading; + #region Variables - private readonly IDialogCoordinator _dialogCoordinator; + private readonly bool _isLoading; - public ICollectionView PortProfiles { get; } + /// + /// Gets the collection view of port profiles. + /// + public ICollectionView PortProfiles { get; } - private PortProfileInfo _selectedPortProfile = new PortProfileInfo(); - public PortProfileInfo SelectedPortProfile + /// + /// Gets or sets the selected port profile. + /// + public PortProfileInfo SelectedPortProfile + { + get; + set { - get => _selectedPortProfile; - set - { - if (value == _selectedPortProfile) - return; - - _selectedPortProfile = value; - OnPropertyChanged(); - } + if (value == field) + return; + field = value; + OnPropertyChanged(); } + } = new(); - private int _hostThreads; - public int HostThreads + /// + /// Gets or sets a value indicating whether to show all results (open and closed ports). + /// + public bool ShowAllResults + { + get; + set { - get => _hostThreads; - set - { - if (value == _hostThreads) - return; - - if (!_isLoading) - SettingsManager.Current.PortScanner_HostThreads = value; - - _hostThreads = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.PortScanner_ShowAllResults = value; + + field = value; + OnPropertyChanged(); } + } - private int _portThreads; - public int PortThreads + /// + /// Gets or sets the timeout for port scanning in milliseconds. + /// + public int Timeout + { + get; + set { - get => _portThreads; - set - { - if (value == _portThreads) - return; - - if (!_isLoading) - SettingsManager.Current.PortScanner_PortThreads = value; - - _portThreads = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.PortScanner_Timeout = value; + + field = value; + OnPropertyChanged(); } + } - private bool _showClosed; - public bool ShowClosed + /// + /// Gets or sets a value indicating whether to resolve hostnames. + /// + public bool ResolveHostname + { + get; + set { - get => _showClosed; - set - { - if (value == _showClosed) - return; - - if (!_isLoading) - SettingsManager.Current.PortScanner_ShowClosed = value; - - _showClosed = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.PortScanner_ResolveHostname = value; + + field = value; + OnPropertyChanged(); } + } - private int _timeout; - public int Timeout + /// + /// Gets or sets the maximum number of threads for scanning hosts. + /// + public int MaxHostThreads + { + get; + set { - get => _timeout; - set - { - if (value == _timeout) - return; - - if (!_isLoading) - SettingsManager.Current.PortScanner_Timeout = value; - - _timeout = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.PortScanner_MaxHostThreads = value; + + field = value; + OnPropertyChanged(); } + } - private bool _resolveHostname; - public bool ResolveHostname + /// + /// Gets or sets the maximum number of threads for scanning ports. + /// + public int MaxPortThreads + { + get; + set { - get => _resolveHostname; - set - { - if (value == _resolveHostname) - return; - - if (!_isLoading) - SettingsManager.Current.PortScanner_ResolveHostname = value; - - _resolveHostname = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.PortScanner_MaxPortThreads = value; + + field = value; + OnPropertyChanged(); } - #endregion + } - #region Constructor, load settings - public PortScannerSettingsViewModel(IDialogCoordinator instance) - { - _isLoading = true; + #endregion - _dialogCoordinator = instance; + #region Constructor, load settings - PortProfiles = CollectionViewSource.GetDefaultView(SettingsManager.Current.PortScanner_PortProfiles); - PortProfiles.SortDescriptions.Add(new SortDescription(nameof(PortProfileInfo.Name), ListSortDirection.Ascending)); + /// + /// Initializes a new instance of the class. + /// + public PortScannerSettingsViewModel() + { + _isLoading = true; - LoadSettings(); + PortProfiles = CollectionViewSource.GetDefaultView(SettingsManager.Current.PortScanner_PortProfiles); + PortProfiles.SortDescriptions.Add( + new SortDescription(nameof(PortProfileInfo.Name), ListSortDirection.Ascending)); - _isLoading = false; - } + SelectedPortProfile = PortProfiles.Cast().FirstOrDefault(); - private void LoadSettings() - { - HostThreads = SettingsManager.Current.PortScanner_HostThreads; - PortThreads = SettingsManager.Current.PortScanner_PortThreads; - ShowClosed = SettingsManager.Current.PortScanner_ShowClosed; - Timeout = SettingsManager.Current.PortScanner_Timeout; - ResolveHostname = SettingsManager.Current.PortScanner_ResolveHostname; - } - #endregion + LoadSettings(); - #region ICommand & Actions - public ICommand AddPortProfileCommand => new RelayCommand(p => AddPortProfileAction()); + _isLoading = false; + } - private void AddPortProfileAction() - { - AddPortProfile(); - } + private void LoadSettings() + { + ShowAllResults = SettingsManager.Current.PortScanner_ShowAllResults; + Timeout = SettingsManager.Current.PortScanner_Timeout; + ResolveHostname = SettingsManager.Current.PortScanner_ResolveHostname; + MaxHostThreads = SettingsManager.Current.PortScanner_MaxHostThreads; + MaxPortThreads = SettingsManager.Current.PortScanner_MaxPortThreads; + } - public ICommand EditPortProfileCommand => new RelayCommand(p => EditPortProfileAction()); + #endregion - private void EditPortProfileAction() - { - EditPortProfile(); - } + #region ICommand & Actions - public ICommand DeletePortProfileCommand => new RelayCommand(p => DeletePortProfileAction()); + public ICommand AddPortProfileCommand => new RelayCommand(_ => AddPortProfileAction()); - private void DeletePortProfileAction() - { - DeletePortProfile(); - } - #endregion + private void AddPortProfileAction() + { + _ = AddPortProfile(); + } + + public ICommand EditPortProfileCommand => new RelayCommand(_ => EditPortProfileAction()); + + private void EditPortProfileAction() + { + _ = EditPortProfile(); + } + public ICommand DeletePortProfileCommand => new RelayCommand(_ => DeletePortProfileAction()); - #region Methods - public async Task AddPortProfile() + private void DeletePortProfileAction() + { + _ = DeletePortProfile(); + } + + #endregion + + #region Methods + + private Task AddPortProfile() + { + var childWindow = new PortProfileChildWindow(); + + var childWindowViewModel = new PortProfileViewModel(async instance => { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.AddPortProfile - }; - - var viewModel = new PortProfileViewModel(instance => - { - _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - - SettingsManager.Current.PortScanner_PortProfiles.Add(new PortProfileInfo(instance.Name, instance.Ports)); - }, instance => - { - _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - }); - - customDialog.Content = new PortProfileDialog - { - DataContext = viewModel - }; - - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - public async Task EditPortProfile() + SettingsManager.Current.PortScanner_PortProfiles.Add(new PortProfileInfo(instance.Name, instance.Ports)); + }, async _ => { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.EditPortProfile - }; - - var viewModel = new PortProfileViewModel(instance => - { - _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - - SettingsManager.Current.PortScanner_PortProfiles.Remove(SelectedPortProfile); - SettingsManager.Current.PortScanner_PortProfiles.Add(new PortProfileInfo(instance.Name, instance.Ports)); - }, instance => - { - _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - }, true, SelectedPortProfile); - - customDialog.Content = new PortProfileDialog - { - DataContext = viewModel - }; - - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }); + + childWindow.Title = Strings.AddPortProfile; - public async Task DeletePortProfile() + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } + + public Task EditPortProfile() + { + var childWindow = new PortProfileChildWindow(); + + var childWindowViewModel = new PortProfileViewModel(async instance => { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.DeletePortProfile - }; - - var confirmDeleteViewModel = new ConfirmDeleteViewModel(instance => - { - _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - - SettingsManager.Current.PortScanner_PortProfiles.Remove(SelectedPortProfile); - }, instance => - { - _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - }, Localization.Resources.Strings.DeletePortProfileMessage); - - customDialog.Content = new ConfirmDeleteDialog - { - DataContext = confirmDeleteViewModel - }; - - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } - #endregion + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + SettingsManager.Current.PortScanner_PortProfiles.Remove(SelectedPortProfile); + SettingsManager.Current.PortScanner_PortProfiles.Add(new PortProfileInfo(instance.Name, + instance.Ports)); + }, async _ => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, true, + SelectedPortProfile); + + childWindow.Title = Strings.EditPortProfile; + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } + + private async Task DeletePortProfile() + { + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, + Strings.DeletePortProfile, + Strings.DeletePortProfileMessage, + ChildWindowIcon.Info, + Strings.Delete); + + if (!result) + return; + + SettingsManager.Current.PortScanner_PortProfiles.Remove(SelectedPortProfile); + + // Select first item after deletion + SelectedPortProfile = PortProfiles.Cast().FirstOrDefault(); } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/PortScannerViewModel.cs b/Source/NETworkManager/ViewModels/PortScannerViewModel.cs index d73c0da7bd..f683de1179 100644 --- a/Source/NETworkManager/ViewModels/PortScannerViewModel.cs +++ b/Source/NETworkManager/ViewModels/PortScannerViewModel.cs @@ -1,609 +1,570 @@ -using System.Windows.Input; -using System.Windows; +using log4net; +using MahApps.Metro.Controls; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Models.Export; +using NETworkManager.Models.Network; +using NETworkManager.Settings; +using NETworkManager.Utilities; +using NETworkManager.Views; using System; using System.Collections; -using System.Collections.ObjectModel; -using NETworkManager.Settings; using System.Collections.Generic; -using NETworkManager.Models.Network; -using System.Threading; -using System.Net; -using System.Windows.Threading; +using System.Collections.ObjectModel; using System.ComponentModel; -using System.Windows.Data; using System.Linq; -using NETworkManager.Utilities; -using Dragablz; -using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.Controls; -using NETworkManager.Models.Export; -using NETworkManager.Views; -using NETworkManager.Localization.Translators; +using System.Net; +using System.Threading; using System.Threading.Tasks; +using System.Windows; +using System.Windows.Data; +using System.Windows.Input; +using System.Windows.Threading; -namespace NETworkManager.ViewModels -{ - public class PortScannerViewModel : ViewModelBase - { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - - private CancellationTokenSource _cancellationTokenSource; +namespace NETworkManager.ViewModels; - public readonly int TabId; - private bool _firstLoad = true; +/// +/// ViewModel for the Port Scanner feature. +/// +public class PortScannerViewModel : ViewModelBase +{ + #region Variables + private static readonly ILog Log = LogManager.GetLogger(typeof(PortScannerViewModel)); - private string _lastSortDescriptionAscending = string.Empty; + private CancellationTokenSource _cancellationTokenSource; - private bool _isLoading; + private readonly Guid _tabId; + private bool _firstLoad = true; + private bool _closed; - private string _hosts; - public string Hosts + /// + /// Gets or sets the host to scan. + /// + public string Host + { + get; + set { - get => _hosts; - set - { - if (value == _hosts) - return; + if (value == field) + return; - _hosts = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - public ICollectionView HostsHistoryView { get; } + /// + /// Gets the collection view for the host history. + /// + public ICollectionView HostHistoryView { get; } - private string _ports; - public string Ports + /// + /// Gets or sets the ports to scan (e.g., "80, 443, 1-100"). + /// + public string Ports + { + get; + set { - get => _ports; - set - { - if (value == _ports) - return; + if (value == field) + return; - _ports = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - public ICollectionView PortsHistoryView { get; } + /// + /// Gets the collection view for the ports history. + /// + public ICollectionView PortsHistoryView { get; } - private bool _isScanRunning; - public bool IsScanRunning + /// + /// Gets or sets a value indicating whether the scan is currently running. + /// + public bool IsRunning + { + get; + set { - get => _isScanRunning; - set - { - if (value == _isScanRunning) - return; + if (value == field) + return; - _isScanRunning = value; + field = value; - OnPropertyChanged(); - } + OnPropertyChanged(); } + } - private bool _cancelScan; - public bool CancelScan + /// + /// Gets or sets a value indicating whether the scan is being canceled. + /// + public bool IsCanceling + { + get; + set { - get => _cancelScan; - set - { - if (value == _cancelScan) - return; + if (value == field) + return; - _cancelScan = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private ObservableCollection _portScanResults = new ObservableCollection(); - public ObservableCollection PortScanResult + /// + /// Gets or sets the collection of scan results. + /// + public ObservableCollection Results + { + get; + set { - get => _portScanResults; - set - { - if (_portScanResults != null && value == _portScanResults) - return; + if (field != null && value == field) + return; - _portScanResults = value; - } + field = value; } + } = []; - public ICollectionView ResultsView { get; } + /// + /// Gets the collection view for the scan results. + /// + public ICollectionView ResultsView { get; } - private PortInfo _selectedResult; - public PortInfo SelectedResult + /// + /// Gets or sets the currently selected scan result. + /// + public PortScannerPortInfo SelectedResult + { + get; + set { - get => _selectedResult; - set - { - if (value == _selectedResult) - return; + if (value == field) + return; - _selectedResult = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private IList _selectedResults = new ArrayList(); - public IList SelectedResults + /// + /// Gets or sets the list of currently selected scan results (for multi-selection). + /// + public IList SelectedResults + { + get; + set { - get => _selectedResults; - set - { - if (Equals(value, _selectedResults)) - return; + if (Equals(value, field)) + return; - _selectedResults = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = new ArrayList(); - public bool ResolveHostname => SettingsManager.Current.PortScanner_ResolveHostname; - - private int _portsToScan; - public int PortsToScan + /// + /// Gets or sets the total number of ports to scan. + /// + public int PortsToScan + { + get; + set { - get => _portsToScan; - set - { - if (value == _portsToScan) - return; + if (value == field) + return; - _portsToScan = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private int _portsScanned; - public int PortsScanned + /// + /// Gets or sets the number of ports already scanned. + /// + public int PortsScanned + { + get; + set { - get => _portsScanned; - set - { - if (value == _portsScanned) - return; + if (value == field) + return; - _portsScanned = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _preparingScan; - public bool PreparingScan + /// + /// Gets or sets a value indicating whether the scan is being prepared. + /// + public bool PreparingScan + { + get; + set { - get => _preparingScan; - set - { - if (value == _preparingScan) - return; + if (value == field) + return; - _preparingScan = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isStatusMessageDisplayed; - public bool IsStatusMessageDisplayed + /// + /// Gets or sets a value indicating whether the status message is displayed. + /// + public bool IsStatusMessageDisplayed + { + get; + set { - get => _isStatusMessageDisplayed; - set - { - if (value == _isStatusMessageDisplayed) - return; + if (value == field) + return; - _isStatusMessageDisplayed = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _statusMessage; - public string StatusMessage + /// + /// Gets the status message to display. + /// + public string StatusMessage + { + get; + private set { - get => _statusMessage; - set - { - if (value == _statusMessage) - return; + if (value == field) + return; - _statusMessage = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion + } - #region Constructor, load settings, shutdown - public PortScannerViewModel(IDialogCoordinator instance, int tabId, string host, string port) - { - _isLoading = true; + #endregion - _dialogCoordinator = instance; + #region Constructor, load settings, shutdown - TabId = tabId; - Hosts = host; - Ports = port; + /// + /// Initializes a new instance of the class. + /// + /// The unique identifier for the tab. + /// The initial host to scan. + /// The initial ports to scan. + public PortScannerViewModel(Guid tabId, string host, string port) + { + ConfigurationManager.Current.PortScannerTabCount++; - // Set collection view - HostsHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.PortScanner_HostsHistory); - PortsHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.PortScanner_PortsHistory); + _tabId = tabId; + Host = host; + Ports = port; - // Add default port profiles... - if (SettingsManager.Current.PortScanner_PortProfiles.Count == 0) - SettingsManager.Current.PortScanner_PortProfiles = new ObservableCollection(PortProfile.DefaultList()); + // Set collection view + HostHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.PortScanner_HostHistory); + PortsHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.PortScanner_PortHistory); - // Result view - ResultsView = CollectionViewSource.GetDefaultView(PortScanResult); - ResultsView.GroupDescriptions.Add(new PropertyGroupDescription(nameof(PortInfo.IPAddress))); - ResultsView.SortDescriptions.Add(new SortDescription(nameof(PortInfo.IPAddressInt32), ListSortDirection.Descending)); + // Result view + ResultsView = CollectionViewSource.GetDefaultView(Results); + ResultsView.GroupDescriptions.Add(new PropertyGroupDescription(nameof(PortScannerPortInfo.HostAsString))); - LoadSettings(); + LoadSettings(); + } - // Detect if settings have changed... - SettingsManager.Current.PropertyChanged += SettingsManager_PropertyChanged; + private void LoadSettings() + { + } - _isLoading = false; - } + public void OnLoaded() + { + if (!_firstLoad) + return; - private void LoadSettings() - { + if (!string.IsNullOrEmpty(Host) && !string.IsNullOrEmpty(Ports)) + _ = Start(); - } + _firstLoad = false; + } - public void OnLoaded() - { - if (!_firstLoad) - return; + public void OnClose() + { + // Prevent multiple calls + if (_closed) + return; - if (!string.IsNullOrEmpty(Hosts) && !string.IsNullOrEmpty(Ports)) - StartScan(); + _closed = true; - _firstLoad = false; - } + // Stop scan + if (IsRunning) + Stop(); - public void OnClose() - { - // Stop scan - if (IsScanRunning) - StopScan(); - } - #endregion + ConfigurationManager.Current.PortScannerTabCount--; + } - #region ICommands & Actions - public ICommand OpenPortProfileSelectionCommand => new RelayCommand(p => OpenPortProfileSelectionAction(), OpenPortProfileSelection_CanExecute); + #endregion - private bool OpenPortProfileSelection_CanExecute(object parameter) => Application.Current.MainWindow != null && !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen; + #region ICommands & Actions - private void OpenPortProfileSelectionAction() - { - OpenPortProfileSelection(); - } + public ICommand OpenPortProfileSelectionCommand => + new RelayCommand(_ => OpenPortProfileSelectionAction(), OpenPortProfileSelection_CanExecute); + + private bool OpenPortProfileSelection_CanExecute(object parameter) + { + return Application.Current.MainWindow != null && + !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && + !ConfigurationManager.Current.IsChildWindowOpen; + } - public ICommand ScanCommand => new RelayCommand(p => ScanAction(), Scan_CanExecute); + private void OpenPortProfileSelectionAction() + { + _ = OpenPortProfileSelection(); + } - private bool Scan_CanExecute(object paramter) => Application.Current.MainWindow != null && !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen; + public ICommand ScanCommand => new RelayCommand(_ => ScanAction(), Scan_CanExecute); - private void ScanAction() - { - if (IsScanRunning) - StopScan(); - else - StartScan(); - } + private bool Scan_CanExecute(object parameter) + { + return Application.Current.MainWindow != null && + !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && + !ConfigurationManager.Current.IsChildWindowOpen; + } - public ICommand CopySelectedIPAddressCommand => new RelayCommand(p => CopySelectedIPAddressAction()); + private void ScanAction() + { + if (IsRunning) + Stop(); + else + _ = Start(); + } - private void CopySelectedIPAddressAction() - { - ClipboardHelper.SetClipboard(SelectedResult.IPAddress.ToString()); - } + public ICommand ExportCommand => new RelayCommand(_ => ExportAction()); - public ICommand CopySelectedHostnameCommand => new RelayCommand(p => CopySelectedHostnameAction()); + private void ExportAction() + { + _ = Export(); + } - private void CopySelectedHostnameAction() - { - ClipboardHelper.SetClipboard(SelectedResult.Hostname); - } + #endregion - public ICommand CopySelectedPortCommand => new RelayCommand(p => CopySelectedPortAction()); + #region Methods - private void CopySelectedPortAction() - { - ClipboardHelper.SetClipboard(SelectedResult.Port.ToString()); - } + private async Task OpenPortProfileSelection() + { + var window = Application.Current.Windows.OfType().FirstOrDefault(x => x.IsActive); - public ICommand CopySelectedStatusCommand => new RelayCommand(p => CopySelectedStatusAction()); + var childWindow = new PortProfilesChildWindow(window); - private void CopySelectedStatusAction() + var childWindowViewModel = new PortProfilesViewModel(async instance => { - ClipboardHelper.SetClipboard(PortStateTranslator.GetInstance().Translate(SelectedResult.State)); - } - - public ICommand CopySelectedProtocolCommand => new RelayCommand(p => CopySelectedProtocolAction()); + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - private void CopySelectedProtocolAction() + Ports = string.Join("; ", instance.GetSelectedPortProfiles().Select(x => x.Ports)); + }, async _ => { - ClipboardHelper.SetClipboard(SelectedResult.LookupInfo.Protocol.ToString()); - } + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }); - public ICommand CopySelectedServiceCommand => new RelayCommand(p => CopySelectedServiceAction()); + childWindow.Title = Strings.SelectPortProfile; - private void CopySelectedServiceAction() - { - ClipboardHelper.SetClipboard(SelectedResult.LookupInfo.Service); - } + childWindow.DataContext = childWindowViewModel; - public ICommand CopySelectedDescriptionCommand => new RelayCommand(p => CopySelectedDescriptionAction()); + ConfigurationManager.Current.IsChildWindowOpen = true; - private void CopySelectedDescriptionAction() - { - ClipboardHelper.SetClipboard(SelectedResult.LookupInfo.Description); - } + await window.ShowChildWindowAsync(childWindow); + } - public ICommand ExportCommand => new RelayCommand(p => ExportAction()); + private async Task Start() + { + IsStatusMessageDisplayed = false; + StatusMessage = string.Empty; - private void ExportAction() - { - Export(); - } - #endregion + IsRunning = true; + PreparingScan = true; - #region Methods - private async Task OpenPortProfileSelection() - { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.SelectPortProfile - }; + Results.Clear(); - var viewModel = new PortProfilesViewModel(instance => - { - _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + DragablzTabItem.SetTabHeader(_tabId, Host); - Ports = instance.SelectedPortProfile.Ports; - }, instance => - { - _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - }); + _cancellationTokenSource?.Dispose(); + _cancellationTokenSource = new CancellationTokenSource(); - customDialog.Content = new PortProfilesDialog - { - DataContext = viewModel - }; + // Resolve hostnames + (List<(IPAddress ipAddress, string hostname)> hosts, List hostnamesNotResolved) hosts; - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); + try + { + hosts = await HostRangeHelper.ResolveAsync(HostRangeHelper.CreateListFromInput(Host), + SettingsManager.Current.Network_ResolveHostnamePreferIPv4, _cancellationTokenSource.Token); + } + catch (OperationCanceledException) + { + UserHasCanceled(this, EventArgs.Empty); + return; } - private async Task StartScan() + // Show error message if (some) hostnames could not be resolved + if (hosts.hostnamesNotResolved.Count > 0) { - _isLoading = true; + StatusMessage = + $"{Strings.TheFollowingHostnamesCouldNotBeResolved} {string.Join(", ", hosts.hostnamesNotResolved)}"; + IsStatusMessageDisplayed = true; + } - IsStatusMessageDisplayed = false; - StatusMessage = string.Empty; + // Convert ports to int array + var ports = await PortRangeHelper.ConvertPortRangeToIntArrayAsync(Ports); - IsScanRunning = true; - PreparingScan = true; + PortsToScan = ports.Length * hosts.hosts.Count; + PortsScanned = 0; - PortScanResult.Clear(); + PreparingScan = false; - // Change the tab title (not nice, but it works) - var window = Application.Current.Windows.OfType().FirstOrDefault(x => x.IsActive); + // Add host(s) to the history + AddHostToHistory(Host); + AddPortToHistory(Ports); - if (window != null) - { - foreach (var tabablzControl in VisualTreeHelper.FindVisualChildren(window)) - { - tabablzControl.Items.OfType().First(x => x.Id == TabId).Header = Hosts; - } - } + var portScanner = new PortScanner(new PortScannerOptions( + SettingsManager.Current.PortScanner_MaxHostThreads, + SettingsManager.Current.PortScanner_MaxPortThreads, + SettingsManager.Current.PortScanner_Timeout, + SettingsManager.Current.PortScanner_ResolveHostname, + SettingsManager.Current.PortScanner_ShowAllResults + )); - _cancellationTokenSource = new CancellationTokenSource(); + portScanner.PortScanned += PortScanned; + portScanner.ScanComplete += ScanComplete; + portScanner.ProgressChanged += ProgressChanged; + portScanner.UserHasCanceled += UserHasCanceled; - // Resolve hostnames - List ipRanges; + portScanner.ScanAsync(hosts.hosts, ports, _cancellationTokenSource.Token); + } - try - { - ipRanges = await HostRangeHelper.ResolveHostnamesInIPRangesAsync(Hosts.Replace(" ", "").Split(';'), _cancellationTokenSource.Token); - } - catch (OperationCanceledException) - { - UserHasCanceled(this, EventArgs.Empty); - return; - } - catch (AggregateException exceptions) // DNS error (could not resolve hostname...) - { - DnsResolveFailed(exceptions); - return; - } + private void Stop() + { + IsCanceling = true; + _cancellationTokenSource.Cancel(); + } - // Create ip addresses - IPAddress[] ipAddresses; + private Task Export() + { + var window = Application.Current.Windows.OfType().FirstOrDefault(x => x.IsActive); + + var childWindow = new ExportChildWindow(); + + var childWindowViewModel = new ExportViewModel(async instance => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; try { - // Create a list of all ip addresses - ipAddresses = await HostRangeHelper.CreateIPAddressesFromIPRangesAsync(ipRanges.ToArray(), _cancellationTokenSource.Token); + ExportManager.Export(instance.FilePath, instance.FileType, + instance.ExportAll + ? Results + : new ObservableCollection(SelectedResults.Cast() + .ToArray())); } - catch (OperationCanceledException) + catch (Exception ex) { - UserHasCanceled(this, EventArgs.Empty); - return; - } - - var ports = await PortRangeHelper.ConvertPortRangeToIntArrayAsync(Ports); - - PortsToScan = ports.Length * ipAddresses.Length; - PortsScanned = 0; + Log.Error("Error while exporting data as " + instance.FileType, ex); - PreparingScan = false; - - // Add host(s) to the history - AddHostToHistory(Hosts); - AddPortToHistory(Ports); - - var portScanner = new PortScanner - { - ResolveHostname = SettingsManager.Current.PortScanner_ResolveHostname, - HostThreads = SettingsManager.Current.PortScanner_HostThreads, - PortThreads = SettingsManager.Current.PortScanner_PortThreads, - ShowClosed = SettingsManager.Current.PortScanner_ShowClosed, - Timeout = SettingsManager.Current.PortScanner_Timeout - }; - - portScanner.PortScanned += PortScanned; - portScanner.ScanComplete += ScanComplete; - portScanner.ProgressChanged += ProgressChanged; - portScanner.UserHasCanceled += UserHasCanceled; - - portScanner.ScanAsync(ipAddresses, ports, _cancellationTokenSource.Token); - } + await DialogHelper.ShowMessageAsync(window, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); + } - private void StopScan() + SettingsManager.Current.PortScanner_ExportFileType = instance.FileType; + SettingsManager.Current.PortScanner_ExportFilePath = instance.FilePath; + }, _ => { - CancelScan = true; - _cancellationTokenSource.Cancel(); - } + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, [ + ExportFileType.Csv, ExportFileType.Xml, ExportFileType.Json + ], true, SettingsManager.Current.PortScanner_ExportFileType, + SettingsManager.Current.PortScanner_ExportFilePath); - private void ScanFinished() - { - CancelScan = false; - IsScanRunning = false; - } + childWindow.Title = Strings.Export; - private async Task Export() - { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.Export - }; + childWindow.DataContext = childWindowViewModel; - var exportViewModel = new ExportViewModel(async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + ConfigurationManager.Current.IsChildWindowOpen = true; - try - { - ExportManager.Export(instance.FilePath, instance.FileType, instance.ExportAll ? PortScanResult : new ObservableCollection(SelectedResults.Cast().ToArray())); - } - catch (Exception ex) - { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Localization.Resources.Strings.OK; + return window.ShowChildWindowAsync(childWindow); + } - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Error, Localization.Resources.Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); - } + private void AddHostToHistory(string host) + { + // Create the new list + var list = ListHelper.Modify(SettingsManager.Current.PortScanner_HostHistory.ToList(), host, + SettingsManager.Current.General_HistoryListEntries); - SettingsManager.Current.PortScanner_ExportFileType = instance.FileType; - SettingsManager.Current.PortScanner_ExportFilePath = instance.FilePath; - }, instance => { _dialogCoordinator.HideMetroDialogAsync(this, customDialog); }, new ExportManager.ExportFileType[] { ExportManager.ExportFileType.CSV, ExportManager.ExportFileType.XML, ExportManager.ExportFileType.JSON }, true, SettingsManager.Current.PortScanner_ExportFileType, SettingsManager.Current.PortScanner_ExportFilePath); + // Clear the old items + SettingsManager.Current.PortScanner_HostHistory.Clear(); + OnPropertyChanged(nameof(Host)); // Raise property changed again, after the collection has been cleared - customDialog.Content = new ExportDialog - { - DataContext = exportViewModel - }; + // Fill with the new items + list.ForEach(x => SettingsManager.Current.PortScanner_HostHistory.Add(x)); + } - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } + private void AddPortToHistory(string port) + { + // Create the new list + var list = ListHelper.Modify(SettingsManager.Current.PortScanner_PortHistory.ToList(), port, + SettingsManager.Current.General_HistoryListEntries); - private void AddHostToHistory(string host) - { - // Create the new list - var list = ListHelper.Modify(SettingsManager.Current.PortScanner_HostsHistory.ToList(), host, SettingsManager.Current.General_HistoryListEntries); + // Clear the old items + SettingsManager.Current.PortScanner_PortHistory.Clear(); + OnPropertyChanged(nameof(Ports)); // Raise property changed again, after the collection has been cleared - // Clear the old items - SettingsManager.Current.PortScanner_HostsHistory.Clear(); - OnPropertyChanged(nameof(Hosts)); // Raise property changed again, after the collection has been cleared + // Fill with the new items + list.ForEach(x => SettingsManager.Current.PortScanner_PortHistory.Add(x)); + } - // Fill with the new items - list.ForEach(x => SettingsManager.Current.PortScanner_HostsHistory.Add(x)); - } + #endregion - private void AddPortToHistory(string port) - { - // Create the new list - var list = ListHelper.Modify(SettingsManager.Current.PortScanner_PortsHistory.ToList(), port, SettingsManager.Current.General_HistoryListEntries); + #region Events - // Clear the old items - SettingsManager.Current.PortScanner_PortsHistory.Clear(); - OnPropertyChanged(nameof(Ports)); // Raise property changed again, after the collection has been cleared + private void PortScanned(object sender, PortScannerPortScannedArgs e) + { + Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, + new Action(delegate { Results.Add(e.Args); })); + } - // Fill with the new items - list.ForEach(x => SettingsManager.Current.PortScanner_PortsHistory.Add(x)); - } + private void ProgressChanged(object sender, ProgressChangedArgs e) + { + PortsScanned = e.Value; + } - public void SortResultByPropertyName(string sortDescription) + private void ScanComplete(object sender, EventArgs e) + { + // Run in UI thread with lower priority than PortScanned event + // to ensure all results are added first #3285 + Application.Current.Dispatcher.Invoke(() => { - ResultsView.SortDescriptions.Clear(); - ResultsView.SortDescriptions.Add(new SortDescription(nameof(PortInfo.IPAddressInt32), ListSortDirection.Descending)); - - if (_lastSortDescriptionAscending.Equals(sortDescription)) + if (Results.Count == 0) { - ResultsView.SortDescriptions.Add(new SortDescription(sortDescription, ListSortDirection.Descending)); - _lastSortDescriptionAscending = string.Empty; + StatusMessage = Strings.NoOpenPortsFound; + IsStatusMessageDisplayed = true; } - else - { - ResultsView.SortDescriptions.Add(new SortDescription(sortDescription, ListSortDirection.Ascending)); - _lastSortDescriptionAscending = sortDescription; - } - } - #endregion - - #region Events - private void UserHasCanceled(object sender, EventArgs e) - { - StatusMessage = Localization.Resources.Strings.CanceledByUserMessage; - IsStatusMessageDisplayed = true; - - ScanFinished(); - } - - private void ProgressChanged(object sender, ProgressChangedArgs e) - { - PortsScanned = e.Value; - } - - private void DnsResolveFailed(AggregateException e) - { - StatusMessage = $"{Localization.Resources.Strings.TheFollowingHostnamesCouldNotBeResolved} {string.Join(", ", e.Flatten().InnerExceptions.Select(x => x.Message))}"; - IsStatusMessageDisplayed = true; - - ScanFinished(); - } - - private void ScanComplete(object sender, EventArgs e) - { - ScanFinished(); - } - private void PortScanned(object sender, PortScannedArgs e) - { - var portInfo = PortInfo.Parse(e); - - Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(delegate () - { - //lock (PortScanResult) - PortScanResult.Add(portInfo); - })); - } - - private void DispatcherTimer_Tick(object sender, EventArgs e) - { + IsCanceling = false; + IsRunning = false; + }, DispatcherPriority.Background); + } - } + private void UserHasCanceled(object sender, EventArgs e) + { + StatusMessage = Strings.CanceledByUserMessage; + IsStatusMessageDisplayed = true; - private void SettingsManager_PropertyChanged(object sender, PropertyChangedEventArgs e) - { - switch (e.PropertyName) - { - case nameof(SettingsInfo.PortScanner_ResolveHostname): - OnPropertyChanged(nameof(ResolveHostname)); - break; - } - } - #endregion + IsCanceling = false; + IsRunning = false; } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/PowerShellConnectViewModel.cs b/Source/NETworkManager/ViewModels/PowerShellConnectViewModel.cs index 41ac7d6cf6..7759b1b059 100644 --- a/Source/NETworkManager/ViewModels/PowerShellConnectViewModel.cs +++ b/Source/NETworkManager/ViewModels/PowerShellConnectViewModel.cs @@ -1,5 +1,3 @@ -using NETworkManager.Settings; -using NETworkManager.Utilities; using System; using System.Collections.Generic; using System.ComponentModel; @@ -7,113 +5,120 @@ using System.Windows.Data; using System.Windows.Input; using NETworkManager.Models.PowerShell; +using NETworkManager.Settings; +using NETworkManager.Utilities; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +public class PowerShellConnectViewModel : ViewModelBase { - public class PowerShellConnectViewModel : ViewModelBase + public PowerShellConnectViewModel(Action connectCommand, + Action cancelHandler, string host = null) { - public ICommand ConnectCommand { get; } - public ICommand CancelCommand { get; } + ConnectCommand = new RelayCommand(_ => connectCommand(this)); + CancelCommand = new RelayCommand(_ => cancelHandler(this)); - private bool _enableRemoteConsole; - public bool EnableRemoteConsole + if (!string.IsNullOrEmpty(host)) { - get => _enableRemoteConsole; - set - { - if (value == _enableRemoteConsole) - return; - - _enableRemoteConsole = value; - OnPropertyChanged(); - } + Host = host; + EnableRemoteConsole = true; } - private string _host; - public string Host - { - get => _host; - set - { - if (value == _host) - return; - - _host = value; - OnPropertyChanged(); - } - } + HostHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.PowerShell_HostHistory); - public ICollectionView HostHistoryView { get; } + LoadSettings(); + } - private string _additionalCommandLine; - public string AdditionalCommandLine - { - get => _additionalCommandLine; - set - { - if (value == _additionalCommandLine) - return; - - _additionalCommandLine = value; - OnPropertyChanged(); - } - } + public ICommand ConnectCommand { get; } + public ICommand CancelCommand { get; } - private List _executionPolicies = new List(); - public List ExecutionPolicies + public bool EnableRemoteConsole + { + get; + set { - get => _executionPolicies; - set - { - if (value == _executionPolicies) - return; - - _executionPolicies = value; - OnPropertyChanged(); - } + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - private PowerShell.ExecutionPolicy _executionPolicy; - public PowerShell.ExecutionPolicy ExecutionPolicy + public string Host + { + get; + set { - get => _executionPolicy; - set - { - if (value == _executionPolicy) - return; - - _executionPolicy = value; - OnPropertyChanged(); - } + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } + + public ICollectionView HostHistoryView { get; } - public PowerShellConnectViewModel(Action connectCommand, Action cancelHandler, string host = null) + public string Command + { + get; + set { - ConnectCommand = new RelayCommand(p => connectCommand(this)); - CancelCommand = new RelayCommand(p => cancelHandler(this)); + if (value == field) + return; - if (!string.IsNullOrEmpty(host)) - { - Host = host; - EnableRemoteConsole = true; - } + field = value; + OnPropertyChanged(); + } + } - HostHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.PowerShell_HostHistory); + public string AdditionalCommandLine + { + get; + set + { + if (value == field) + return; - LoadSettings(); + field = value; + OnPropertyChanged(); } + } - private void LoadSettings() + public List ExecutionPolicies + { + get; + private set { - AdditionalCommandLine = SettingsManager.Current.PowerShell_AdditionalCommandLine; - - LoadExecutionPolicies(); + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } = []; - private void LoadExecutionPolicies() + public ExecutionPolicy ExecutionPolicy + { + get; + set { - ExecutionPolicies = Enum.GetValues(typeof(PowerShell.ExecutionPolicy)).Cast().ToList(); - ExecutionPolicy = ExecutionPolicies.FirstOrDefault(x => x == SettingsManager.Current.PowerShell_ExecutionPolicy); + if (value == field) + return; + + field = value; + OnPropertyChanged(); } } -} + + private void LoadSettings() + { + Command = SettingsManager.Current.PowerShell_Command; + AdditionalCommandLine = SettingsManager.Current.PowerShell_AdditionalCommandLine; + + ExecutionPolicies = Enum.GetValues(typeof(ExecutionPolicy)).Cast().ToList(); + ExecutionPolicy = + ExecutionPolicies.FirstOrDefault(x => x == SettingsManager.Current.PowerShell_ExecutionPolicy); + } +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/PowerShellHostViewModel.cs b/Source/NETworkManager/ViewModels/PowerShellHostViewModel.cs index 9b07cd169b..2f3607b342 100644 --- a/Source/NETworkManager/ViewModels/PowerShellHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/PowerShellHostViewModel.cs @@ -1,504 +1,552 @@ -using System.Collections.ObjectModel; -using NETworkManager.Controls; using Dragablz; -using System.Windows.Input; -using MahApps.Metro.Controls.Dialogs; +using log4net; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Models; +using NETworkManager.Models.EventSystem; +using NETworkManager.Models.PowerShell; +using NETworkManager.Profiles; using NETworkManager.Settings; -using System.Linq; +using NETworkManager.Utilities; using NETworkManager.Views; -using System.ComponentModel; -using System.Windows.Data; using System; +using System.Collections.ObjectModel; +using System.ComponentModel; using System.Diagnostics; using System.IO; -using NETworkManager.Utilities; -using System.Windows; -using NETworkManager.Models.PowerShell; -using NETworkManager.Profiles; -using System.Windows.Threading; -using NETworkManager.Models; -using NETworkManager.Models.EventSystem; +using System.Linq; using System.Threading.Tasks; -using System.Collections.Generic; +using System.Windows; +using System.Windows.Input; +using PowerShellProfile = NETworkManager.Profiles.Application.PowerShell; -namespace NETworkManager.ViewModels -{ - public class PowerShellHostViewModel : ViewModelBase, IProfileManager - { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - private readonly DispatcherTimer _searchDispatcherTimer = new DispatcherTimer(); +namespace NETworkManager.ViewModels; - public IInterTabClient InterTabClient { get; } - public ObservableCollection TabItems { get; } +public class PowerShellHostViewModel : ProfileHostViewModelBase +{ + #region Variables + private static readonly ILog Log = LogManager.GetLogger(typeof(PowerShellHostViewModel)); - private readonly bool _isLoading = true; - private bool _isViewActive = true; + public IInterTabClient InterTabClient { get; } - private bool _isConfigured; - public bool IsConfigured + public string InterTabPartition + { + get; + set { - get => _isConfigured; - set - { - if (value == _isConfigured) - return; + if (value == field) + return; - _isConfigured = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private int _selectedTabIndex; - public int SelectedTabIndex + public ObservableCollection TabItems { get; } + + public bool IsExecutableConfigured + { + get; + set { - get => _selectedTabIndex; - set - { - if (value == _selectedTabIndex) - return; + if (value == field) + return; - _selectedTabIndex = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #region Profiles - - public ICollectionView Profiles { get; } + } - private ProfileInfo _selectedProfile = new ProfileInfo(); - public ProfileInfo SelectedProfile + public int SelectedTabIndex + { + get; + set { - get => _selectedProfile; - set - { - if (value == _selectedProfile) - return; + if (value == field) + return; - _selectedProfile = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _search; - public string Search + public bool HeaderContextMenuIsOpen + { + get; + set { - get => _search; - set - { - if (value == _search) - return; - - _search = value; - - StartDelayedSearch(); + if (value == field) + return; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + + private bool _textBoxSearchIsFocused; - private bool _isSearching; - public bool IsSearching + /// + /// Gets or sets a value indicating whether the profile context menu is open. Bound to + /// so + /// can avoid stealing focus while it is open. + /// + public bool ProfileContextMenuIsOpen + { + get; + set { - get => _isSearching; - set - { - if (value == _isSearching) - return; + if (value == field) + return; - _isSearching = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _canProfileWidthChange = true; - private double _tempProfileWidth; + #endregion - private bool _expandProfileView; - public bool ExpandProfileView - { - get => _expandProfileView; - set - { - if (value == _expandProfileView) - return; + #region Constructor, load settings - if (!_isLoading) - SettingsManager.Current.PowerShell_ExpandProfileView = value; + public PowerShellHostViewModel() + { + // Check if PowerShell executable is configured + CheckExecutable(); - _expandProfileView = value; + // Try to find PowerShell executable - if (_canProfileWidthChange) - ResizeProfile(false); + if (!IsExecutableConfigured) + TryFindExecutable(); - OnPropertyChanged(); - } - } + WriteDefaultProfileToRegistry(); - private GridLength _profileWidth; - public GridLength ProfileWidth - { - get => _profileWidth; - set - { - if (value == _profileWidth) - return; + InterTabClient = new DragablzInterTabClient(ApplicationName.PowerShell); + InterTabPartition = nameof(ApplicationName.PowerShell); - if (!_isLoading && Math.Abs(value.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > GlobalStaticConfiguration.FloatPointFix) // Do not save the size when collapsed - SettingsManager.Current.PowerShell_ProfileWidth = value.Value; + TabItems = []; - _profileWidth = value; + InitializeProfileHost(); - if (_canProfileWidthChange) - ResizeProfile(true); + SettingsManager.Current.PropertyChanged += SettingsManager_PropertyChanged; + } - OnPropertyChanged(); - } - } - #endregion - #endregion + #endregion - #region Constructor, load settings - public PowerShellHostViewModel(IDialogCoordinator instance) - { - _dialogCoordinator = instance; + #region Profile host - // Check if putty is available... - CheckIfConfigured(); + protected override ApplicationName ApplicationName => ApplicationName.PowerShell; - InterTabClient = new DragablzInterTabClient(ApplicationName.PowerShell); + protected override bool IsProfileEnabled(ProfileInfo profile) => profile.PowerShell_Enabled; - TabItems = new ObservableCollection(); + protected override string GetSearchableField(ProfileInfo profile) => profile.PowerShell_Host; - Profiles = new CollectionViewSource { Source = ProfileManager.Groups.SelectMany(x => x.Profiles) }.View; - Profiles.GroupDescriptions.Add(new PropertyGroupDescription(nameof(ProfileInfo.Group))); - Profiles.SortDescriptions.Add(new SortDescription(nameof(ProfileInfo.Group), ListSortDirection.Ascending)); - Profiles.SortDescriptions.Add(new SortDescription(nameof(ProfileInfo.Name), ListSortDirection.Ascending)); - Profiles.Filter = o => - { - if (!(o is ProfileInfo info)) - return false; + /// + /// Also mirrors the popup state into so the main window can suppress + /// global focus-stealing behavior (e.g. re-focusing the embedded terminal) while the filter popup is open. + /// + public new ICommand OpenProfileFilterCommand => new RelayCommand(_ => OpenProfileFilterAction()); - if (string.IsNullOrEmpty(Search)) - return info.PowerShell_Enabled; + private void OpenProfileFilterAction() + { + ConfigurationManager.Current.IsProfileFilterPopupOpen = true; - var search = Search.Trim(); + ProfileFilterIsOpen = true; + } - // Search by: Tag=xxx (exact match, ignore case) - /* - if (search.StartsWith(ProfileManager.TagIdentifier, StringComparison.OrdinalIgnoreCase)) - return !string.IsNullOrEmpty(info.Tags) && info.PowerShell_Enabled && info.Tags.Replace(" ", "").Split(';').Any(str => search.Substring(ProfileManager.TagIdentifier.Length, search.Length - ProfileManager.TagIdentifier.Length).Equals(str, StringComparison.OrdinalIgnoreCase)); - */ + /// + /// Called when the tag-filter popup closes (including an implicit close, e.g. clicking away), to keep + /// in sync. + /// + public ICommand ProfileFilterPopupClosedCommand => new RelayCommand(_ => OnProfileFilterClosed()); - // Search by: Name, TigerVNC_Host - return info.PowerShell_Enabled && (info.Name.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1 || info.PowerShell_Host.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1); - }; + public void OnProfileFilterClosed() + { + ConfigurationManager.Current.IsProfileFilterPopupOpen = false; + } - // This will select the first entry as selected item... - SelectedProfile = Profiles.SourceCollection.Cast().Where(x => x.PowerShell_Enabled).OrderBy(x => x.Group).ThenBy(x => x.Name).FirstOrDefault(); + public override void OnProfileManagerDialogOpen() + { + ConfigurationManager.OnDialogOpen(); + } - ProfileManager.OnProfilesUpdated += ProfileManager_OnProfilesUpdated; - - _searchDispatcherTimer.Interval = GlobalStaticConfiguration.SearchDispatcherTimerTimeSpan; - _searchDispatcherTimer.Tick += SearchDispatcherTimer_Tick; + public override void OnProfileManagerDialogClose() + { + ConfigurationManager.OnDialogClose(); + } - LoadSettings(); + #endregion - SettingsManager.Current.PropertyChanged += Current_PropertyChanged; + #region ICommand & Actions - _isLoading = false; - } - - private void Current_PropertyChanged(object sender, PropertyChangedEventArgs e) - { - if (e.PropertyName == nameof(SettingsInfo.PowerShell_ApplicationFilePath)) - CheckIfConfigured(); - } + public ItemActionCallback CloseItemCommand => CloseItemAction; - private void LoadSettings() - { - ExpandProfileView = SettingsManager.Current.PowerShell_ExpandProfileView; + private void CloseItemAction(ItemActionCallbackArgs args) + { + ((args.DragablzItem.Content as DragablzTabItem)?.View as IDragablzTabItem)?.CloseTab(); + } - ProfileWidth = ExpandProfileView ? new GridLength(SettingsManager.Current.PowerShell_ProfileWidth) : new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); + private bool Connect_CanExecute(object obj) + { + return IsExecutableConfigured; + } - _tempProfileWidth = SettingsManager.Current.PowerShell_ProfileWidth; - } - #endregion + public ICommand ConnectCommand => new RelayCommand(_ => ConnectAction(), Connect_CanExecute); - #region ICommand & Actions - public ItemActionCallback CloseItemCommand => CloseItemAction; + private void ConnectAction() + { + _ = Connect(); + } - private void CloseItemAction(ItemActionCallbackArgs args) - { - ((args.DragablzItem.Content as DragablzTabItem)?.View as PowerShellControl)?.CloseTab(); - } + private bool IsConnected_CanExecute(object view) + { + if (view is PowerShellControl control) + return control.IsConnected; - public ICommand PowerShell_ReconnectCommand => new RelayCommand(PowerShell_ReconnectAction); + return false; + } - private void PowerShell_ReconnectAction(object view) - { - if (view is PowerShellControl control) - { - if (control.ReconnectCommand.CanExecute(null)) - control.ReconnectCommand.Execute(null); - } - } + public ICommand ReconnectCommand => new RelayCommand(ReconnectAction); - public ICommand ConnectCommand => new RelayCommand(p => ConnectAction(), Connect_CanExecute); + private void ReconnectAction(object view) + { + if (view is not PowerShellControl control) + return; - private bool Connect_CanExecute(object obj) => IsConfigured; + if (control.ReconnectCommand.CanExecute(null)) + control.ReconnectCommand.Execute(null); + } - private void ConnectAction() - { - Connect(); - } + public ICommand ResizeWindowCommand => new RelayCommand(ResizeWindowAction, IsConnected_CanExecute); - public ICommand ConnectProfileCommand => new RelayCommand(p => ConnectProfileAction(), ConnectProfile_CanExecute); + private void ResizeWindowAction(object view) + { + if (view is PowerShellControl control) + control.ResizeEmbeddedWindow(); + } - private bool ConnectProfile_CanExecute(object obj) - { - return !IsSearching && SelectedProfile != null; - } + public ICommand ConnectProfileCommand => new RelayCommand(_ => ConnectProfileAction(), ConnectProfile_CanExecute); - private void ConnectProfileAction() - { - ConnectProfile(); - } + private bool ConnectProfile_CanExecute(object obj) + { + return !IsSearching && SelectedProfile != null; + } - public ICommand ConnectProfileExternalCommand => new RelayCommand(p => ConnectProfileExternalAction()); + private void ConnectProfileAction() + { + ConnectProfile(); + } - private void ConnectProfileExternalAction() - { - ConnectProfileExternal(); - } + public ICommand ConnectProfileExternalCommand => new RelayCommand(_ => ConnectProfileExternalAction()); - public ICommand AddProfileCommand => new RelayCommand(p => AddProfileAction()); + private void ConnectProfileExternalAction() + { + ConnectProfileExternal(); + } - private void AddProfileAction() - { - ProfileDialogManager.ShowAddProfileDialog(this, _dialogCoordinator); - } + public ICommand TextBoxSearchGotFocusCommand + { + get { return new RelayCommand(_ => _textBoxSearchIsFocused = true); } + } - public ICommand EditProfileCommand => new RelayCommand(p => EditProfileAction()); + public ICommand TextBoxSearchLostFocusCommand + { + get { return new RelayCommand(_ => _textBoxSearchIsFocused = false); } + } - private void EditProfileAction() - { - ProfileDialogManager.ShowEditProfileDialog(this, _dialogCoordinator, SelectedProfile); - } + public ICommand ClearSearchCommand => new RelayCommand(_ => ClearSearchAction()); - public ICommand CopyAsProfileCommand => new RelayCommand(p => CopyAsProfileAction()); + private void ClearSearchAction() + { + Search = string.Empty; + } - private void CopyAsProfileAction() - { - ProfileDialogManager.ShowCopyAsProfileDialog(this, _dialogCoordinator, SelectedProfile); - } + public ICommand OpenSettingsCommand => new RelayCommand(_ => OpenSettingsAction()); - public ICommand DeleteProfileCommand => new RelayCommand(p => DeleteProfileAction()); + private static void OpenSettingsAction() + { + EventSystem.RedirectToSettings(); + } - private void DeleteProfileAction() - { - ProfileDialogManager.ShowDeleteProfileDialog(this, _dialogCoordinator, new List { SelectedProfile }); - } + #endregion - public ICommand EditGroupCommand => new RelayCommand(EditGroupAction); + #region Methods - private void EditGroupAction(object group) - { - ProfileDialogManager.ShowEditGroupDialog(this, _dialogCoordinator, ProfileManager.GetGroup(group.ToString())); - } + /// + /// Check if the executable is configured and exists. + /// + private void CheckExecutable() + { + IsExecutableConfigured = !string.IsNullOrEmpty(SettingsManager.Current.PowerShell_ApplicationFilePath) && + File.Exists(SettingsManager.Current.PowerShell_ApplicationFilePath); - public ICommand ClearSearchCommand => new RelayCommand(p => ClearSearchAction()); + if (IsExecutableConfigured) + Log.Info($"PowerShell executable found: \"{SettingsManager.Current.PowerShell_ApplicationFilePath}\""); + else + Log.Warn("PowerShell executable not found!"); + } - private void ClearSearchAction() - { - Search = string.Empty; - } + /// + /// Try to find executable. + /// + private void TryFindExecutable() + { + Log.Info("Try to find PowerShell executable..."); - public ICommand OpenSettingsCommand => new RelayCommand(p => OpenSettingsAction()); + var applicationFilePath = ApplicationHelper.Find(PowerShell.PwshFileName); - private static void OpenSettingsAction() + // Workaround for: https://github.com/BornToBeRoot/NETworkManager/issues/3223 + if (applicationFilePath.EndsWith("AppData\\Local\\Microsoft\\WindowsApps\\pwsh.exe")) { - EventSystem.RedirectToSettings(); + Log.Info("Found pwsh.exe in AppData (Microsoft Store installation). Trying to resolve real path..."); + + var realPwshPath = FindRealPwshPath(applicationFilePath); + + if (realPwshPath != null) + applicationFilePath = realPwshPath; } - #endregion - #region Methods - private void CheckIfConfigured() + // Fallback to Windows PowerShell + if (string.IsNullOrEmpty(applicationFilePath)) { - IsConfigured = !string.IsNullOrEmpty(SettingsManager.Current.PowerShell_ApplicationFilePath) && File.Exists(SettingsManager.Current.PowerShell_ApplicationFilePath); + Log.Warn("Failed to resolve pwsh.exe path. Falling back to Windows PowerShell."); + + applicationFilePath = ApplicationHelper.Find(PowerShell.WindowsPowerShellFileName); } - private async Task Connect(string host = null) + SettingsManager.Current.PowerShell_ApplicationFilePath = applicationFilePath; + + CheckExecutable(); + + if (!IsExecutableConfigured) + Log.Warn("Install PowerShell or configure the path in the settings."); + } + + /// + /// Resolves the actual installation path of a PowerShell executable that was installed via the + /// Microsoft Store / WindowsApps and therefore appears as a proxy stub in the user's AppData. + /// + /// Typical input is a path like: + /// C:\Users\{USERNAME}\AppData\Local\Microsoft\WindowsApps\pwsh.exe + /// + /// This helper attempts to locate the corresponding real executable under the Program Files + /// WindowsApps package layout, e.g.: + /// C:\Program Files\WindowsApps\Microsoft.PowerShell_7.*_8wekyb3d8bbwe\pwsh.exe. + /// + /// Workaround for: https://github.com/BornToBeRoot/NETworkManager/issues/3223 + /// + /// Path to the pwsh proxy stub, typically located under the current user's %LocalAppData%\Microsoft\WindowsApps\pwsh.exe. + /// Full path to the real pwsh executable under Program Files WindowsApps when found; otherwise null. + private string FindRealPwshPath(string path) + { + try { - var customDialog = new CustomDialog + var command = "(Get-Command pwsh).Source"; + + ProcessStartInfo psi = new() { - Title = Localization.Resources.Strings.Connect + FileName = path, + Arguments = $"-NoProfile -ExecutionPolicy Bypass -Command \"{command}\"", + RedirectStandardOutput = true, + UseShellExecute = false, + CreateNoWindow = true }; - var connectViewModel = new PowerShellConnectViewModel(async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - ConfigurationManager.Current.FixAirspace = false; - - // Create profile info - var info = new PowerShellSessionInfo - { - EnableRemoteConsole = instance.EnableRemoteConsole, - Host = instance.Host, - AdditionalCommandLine = instance.AdditionalCommandLine, - ExecutionPolicy = instance.ExecutionPolicy - }; - - // Add to history - // Note: The history can only be updated after the values have been read. - // Otherwise, in some cases, incorrect values are taken over. - AddHostToHistory(instance.Host); - - // Connect - Connect(info); - }, async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - ConfigurationManager.Current.FixAirspace = false; - }, host); + using Process process = Process.Start(psi); + + string output = process.StandardOutput.ReadToEnd(); - customDialog.Content = new PowerShellConnectDialog + if (!process.WaitForExit(10000)) { - DataContext = connectViewModel - }; + process.Kill(); + Log.Warn("Timeout while trying to resolve real pwsh path."); - ConfigurationManager.Current.FixAirspace = true; - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } + return null; + } + + if (string.IsNullOrEmpty(output)) + return null; + + output = output.Replace(@"\\", @"\") + .Replace(@"\r", string.Empty) + .Replace(@"\n", string.Empty) + .Replace("\r\n", string.Empty) + .Replace("\n", string.Empty) + .Replace("\r", string.Empty); - private void ConnectProfile() + return output.Trim(); + } + catch (Exception ex) { - Connect(NETworkManager.Profiles.Application.PowerShell.CreateSessionInfo(SelectedProfile), SelectedProfile.Name); + Log.Error($"Failed to resolve real pwsh path: {ex.Message}"); + + return null; } + } - private void ConnectProfileExternal() + private Task Connect(string host = null) + { + var childWindow = new PowerShellConnectChildWindow(); + + var childWindowViewModel = new PowerShellConnectViewModel(instance => { - var info = new ProcessStartInfo + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + ConfigurationManager.OnDialogClose(); + + // Create profile info + var sessionInfo = new PowerShellSessionInfo { - FileName = SettingsManager.Current.PowerShell_ApplicationFilePath, - Arguments = PowerShell.BuildCommandLine(NETworkManager.Profiles.Application.PowerShell.CreateSessionInfo(SelectedProfile)) + EnableRemoteConsole = instance.EnableRemoteConsole, + Host = instance.Host, + Command = instance.Command, + AdditionalCommandLine = PlaceholderHelper.Resolve(instance.AdditionalCommandLine, + (PlaceholderHelper.Host, instance.Host)), + ExecutionPolicy = instance.ExecutionPolicy }; - Process.Start(info); - } + // Add to history + // Note: The history can only be updated after the values have been read. + // Otherwise, in some cases, incorrect values are taken over. + AddHostToHistory(instance.Host); - private void Connect(PowerShellSessionInfo sessionInfo, string header = null) + Connect(sessionInfo); + }, _ => { - sessionInfo.ApplicationFilePath = SettingsManager.Current.PowerShell_ApplicationFilePath; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - TabItems.Add(new DragablzTabItem(header ?? (sessionInfo.EnableRemoteConsole ? sessionInfo.Host : Localization.Resources.Strings.PowerShell), new PowerShellControl(sessionInfo))); + ConfigurationManager.OnDialogClose(); + }, host); - SelectedTabIndex = TabItems.Count - 1; - } + childWindow.Title = Strings.Connect; - public void AddTab(string host) - { - Connect(host); - } + childWindow.DataContext = childWindowViewModel; - // Modify history list - private static void AddHostToHistory(string host) - { - if (string.IsNullOrEmpty(host)) - return; - - SettingsManager.Current.PowerShell_HostHistory = new ObservableCollection(ListHelper.Modify(SettingsManager.Current.PowerShell_HostHistory.ToList(), host, SettingsManager.Current.General_HistoryListEntries)); - } + ConfigurationManager.Current.IsChildWindowOpen = true; - private void StartDelayedSearch() - { - if (!IsSearching) - { - IsSearching = true; + ConfigurationManager.OnDialogOpen(); - _searchDispatcherTimer.Start(); - } - else - { - _searchDispatcherTimer.Stop(); - _searchDispatcherTimer.Start(); - } - } + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } + + private void ConnectProfile() + { + Connect(PowerShellProfile.CreateSessionInfo(SelectedProfile), + SelectedProfile.Name); + } - private void StopDelayedSearch() + private void ConnectProfileExternal() + { + var sessionInfo = + PowerShellProfile.CreateSessionInfo(SelectedProfile); + + Process.Start(new ProcessStartInfo { - _searchDispatcherTimer.Stop(); + FileName = SettingsManager.Current.PowerShell_ApplicationFilePath, + Arguments = PowerShell.BuildCommandLine(sessionInfo) + }); + } - RefreshProfiles(); + private void Connect(PowerShellSessionInfo sessionInfo, string header = null) + { + sessionInfo.ApplicationFilePath = SettingsManager.Current.PowerShell_ApplicationFilePath; - IsSearching = false; - } + var tabId = Guid.NewGuid(); - private void ResizeProfile(bool dueToChangedSize) - { - _canProfileWidthChange = false; + TabItems.Add(new DragablzTabItem( + header ?? (sessionInfo.EnableRemoteConsole ? sessionInfo.Host : Strings.PowerShell), + new PowerShellControl(tabId, sessionInfo), tabId)); - if (dueToChangedSize) - { - ExpandProfileView = Math.Abs(ProfileWidth.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > GlobalStaticConfiguration.FloatPointFix; - } - else - { - if (ExpandProfileView) - { - ProfileWidth = Math.Abs(_tempProfileWidth - GlobalStaticConfiguration.Profile_WidthCollapsed) < GlobalStaticConfiguration.FloatPointFix ? new GridLength(GlobalStaticConfiguration.Profile_DefaultWidthExpanded) : new GridLength(_tempProfileWidth); - } - else - { - _tempProfileWidth = ProfileWidth.Value; - ProfileWidth = new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); - } - } + // Select the added tab + SelectedTabIndex = TabItems.Count - 1; + } - _canProfileWidthChange = true; - } + public void AddTab(string host) + { + _ = Connect(host); + } - public void OnViewVisible() - { - _isViewActive = true; + // Modify history list + private static void AddHostToHistory(string host) + { + if (string.IsNullOrEmpty(host)) + return; - RefreshProfiles(); - } + SettingsManager.Current.PowerShell_HostHistory = new ObservableCollection( + ListHelper.Modify(SettingsManager.Current.PowerShell_HostHistory.ToList(), host, + SettingsManager.Current.General_HistoryListEntries)); + } - public void OnViewHide() - { - _isViewActive = false; - } + public void FocusEmbeddedWindow() + { + /* Don't continue if + - Search TextBox is focused + - Header ContextMenu is opened + - Profile ContextMenu is opened + */ + if (_textBoxSearchIsFocused || HeaderContextMenuIsOpen || ProfileContextMenuIsOpen) + return; - public void RefreshProfiles() - { - if (!_isViewActive) - return; + var window = Application.Current.Windows.OfType().FirstOrDefault(x => x.IsActive); - Profiles.Refresh(); - } + if (window == null) + return; - public void OnProfileDialogOpen() + // Find all TabablzControl in the active window + foreach (var tabablzControl in VisualTreeHelper.FindVisualChildren(window)) { - ConfigurationManager.Current.FixAirspace = true; - } + // Skip if no items + if (tabablzControl.Items.Count == 0) + continue; - public void OnProfileDialogClose() - { - ConfigurationManager.Current.FixAirspace = false; - } - #endregion + // Focus embedded window in the selected tab + (((DragablzTabItem)tabablzControl.SelectedItem)?.View as IEmbeddedWindow)?.FocusEmbeddedWindow(); - #region Event - private void ProfileManager_OnProfilesUpdated(object sender, EventArgs e) - { - RefreshProfiles(); + break; } + } - private void SearchDispatcherTimer_Tick(object sender, EventArgs e) + public override void OnViewVisible() + { + base.OnViewVisible(); + + FocusEmbeddedWindow(); + } + + private void WriteDefaultProfileToRegistry() + { + if (!SettingsManager.Current.Appearance_PowerShellModifyGlobalProfile) + return; + + if (!IsExecutableConfigured) + return; + + Log.Debug("Write PowerShell profile to registry..."); + + PowerShell.WriteDefaultProfileToRegistry( + SettingsManager.Current.Appearance_Theme, + SettingsManager.Current.PowerShell_ApplicationFilePath); + } + + #endregion + + #region Event + + private void SettingsManager_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + switch (e.PropertyName) { - StopDelayedSearch(); + case nameof(SettingsInfo.PowerShell_ApplicationFilePath): + CheckExecutable(); + WriteDefaultProfileToRegistry(); + break; + case nameof(SettingsInfo.Appearance_PowerShellModifyGlobalProfile): + case nameof(SettingsInfo.Appearance_Theme): + WriteDefaultProfileToRegistry(); + break; } - #endregion } -} \ No newline at end of file + + #endregion +} diff --git a/Source/NETworkManager/ViewModels/PowerShellSettingsViewModel.cs b/Source/NETworkManager/ViewModels/PowerShellSettingsViewModel.cs index b4f3cb5b9c..90f20e452a 100644 --- a/Source/NETworkManager/ViewModels/PowerShellSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/PowerShellSettingsViewModel.cs @@ -1,179 +1,191 @@ -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.Settings; -using NETworkManager.Utilities; -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; using System.Windows.Input; +using NETworkManager.Localization.Resources; using NETworkManager.Models.PowerShell; -using System.Threading.Tasks; +using NETworkManager.Settings; +using NETworkManager.Utilities; -namespace NETworkManager.ViewModels -{ - public class PowerShellSettingsViewModel : ViewModelBase - { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; +namespace NETworkManager.ViewModels; - private readonly bool _isLoading; +public class PowerShellSettingsViewModel : ViewModelBase +{ + #region Variables + private readonly bool _isLoading; - private string _applicationFilePath; - public string ApplicationFilePath + public string ApplicationFilePath + { + get; + set { - get => _applicationFilePath; - set - { - if (value == _applicationFilePath) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.PowerShell_ApplicationFilePath = value; + if (!_isLoading) + SettingsManager.Current.PowerShell_ApplicationFilePath = value; - IsConfigured = !string.IsNullOrEmpty(value); + IsConfigured = !string.IsNullOrEmpty(value); - _applicationFilePath = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _additionalCommandLine; - public string AdditionalCommandLine + public string Command + { + get; + set { - get => _additionalCommandLine; - set - { - if(value == _additionalCommandLine) - return; - - if (!_isLoading) - SettingsManager.Current.PowerShell_AdditionalCommandLine = value; - - _additionalCommandLine = value; - OnPropertyChanged(); - } - } + if (value == field) + return; - private List _executionPolicies = new List(); - public List ExecutionPolicies - { - get => _executionPolicies; - set - { - if (value == _executionPolicies) - return; - - _executionPolicies = value; - OnPropertyChanged(); - } + if (!_isLoading) + SettingsManager.Current.PowerShell_Command = value; + + field = value; + OnPropertyChanged(); } + } - private PowerShell.ExecutionPolicy _executionPolicy; - public PowerShell.ExecutionPolicy ExecutionPolicy + public string AdditionalCommandLine + { + get; + set { - get => _executionPolicy; - set - { - if (value == _executionPolicy) - return; - - if (!_isLoading) - SettingsManager.Current.PowerShell_ExecutionPolicy = value; - - _executionPolicy = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.PowerShell_AdditionalCommandLine = value; + + field = value; + OnPropertyChanged(); } + } - private bool _isConfigured; - public bool IsConfigured + public List ExecutionPolicies + { + get; + set { - get => _isConfigured; - set - { - if (value == _isConfigured) - return; - - _isConfigured = value; - OnPropertyChanged(); - } + if (value == field) + return; + + field = value; + OnPropertyChanged(); } - #endregion + } = new(); - #region Contructor, load settings - public PowerShellSettingsViewModel(IDialogCoordinator instance) + public ExecutionPolicy ExecutionPolicy + { + get; + set { - _isLoading = true; + if (value == field) + return; - _dialogCoordinator = instance; + if (!_isLoading) + SettingsManager.Current.PowerShell_ExecutionPolicy = value; - LoadSettings(); - - _isLoading = false; + field = value; + OnPropertyChanged(); } + } - private void LoadSettings() + public bool IsConfigured + { + get; + set { - ApplicationFilePath = SettingsManager.Current.PowerShell_ApplicationFilePath; - IsConfigured = File.Exists(ApplicationFilePath); - AdditionalCommandLine = SettingsManager.Current.PowerShell_AdditionalCommandLine; + if (value == field) + return; - LoadExecutionPolicies(); + field = value; + OnPropertyChanged(); } + } - private void LoadExecutionPolicies() - { - ExecutionPolicies = System.Enum.GetValues(typeof(PowerShell.ExecutionPolicy)).Cast().ToList(); - ExecutionPolicy = ExecutionPolicies.FirstOrDefault(x => x == SettingsManager.Current.PowerShell_ExecutionPolicy); - } - #endregion + #endregion - #region ICommands & Actions - public ICommand BrowseFileCommand => new RelayCommand(p => BrowseFileAction()); + #region Contructor, load settings - private void BrowseFileAction() + public PowerShellSettingsViewModel() + { + _isLoading = true; + + LoadSettings(); + + _isLoading = false; + } + + private void LoadSettings() + { + ApplicationFilePath = SettingsManager.Current.PowerShell_ApplicationFilePath; + IsConfigured = File.Exists(ApplicationFilePath); + Command = SettingsManager.Current.PowerShell_Command; + AdditionalCommandLine = SettingsManager.Current.PowerShell_AdditionalCommandLine; + + LoadExecutionPolicies(); + } + + private void LoadExecutionPolicies() + { + ExecutionPolicies = Enum.GetValues(typeof(ExecutionPolicy)).Cast().ToList(); + ExecutionPolicy = + ExecutionPolicies.FirstOrDefault(x => x == SettingsManager.Current.PowerShell_ExecutionPolicy); + } + + #endregion + + #region ICommands & Actions + + public ICommand BrowseFileCommand => new RelayCommand(_ => BrowseFileAction()); + + private void BrowseFileAction() + { + var openFileDialog = new OpenFileDialog { - var openFileDialog = new System.Windows.Forms.OpenFileDialog - { - Filter = GlobalStaticConfiguration.ApplicationFileExtensionFilter - }; + Filter = GlobalStaticConfiguration.ApplicationFileExtensionFilter + }; - if (openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) - ApplicationFilePath = openFileDialog.FileName; - } + if (openFileDialog.ShowDialog() == DialogResult.OK) + ApplicationFilePath = openFileDialog.FileName; + } + + public ICommand ConfigureCommand => new RelayCommand(_ => ConfigureAction()); + + private void ConfigureAction() + { + _ = Configure(); + } + + #endregion - public ICommand ConfigureCommand => new RelayCommand(p => ConfigureAction()); + #region Methods - private void ConfigureAction() + private async Task Configure() + { + try { - Configure(); + Process.Start(SettingsManager.Current.PowerShell_ApplicationFilePath); } - #endregion - - #region Methods - private async Task Configure() + catch (Exception ex) { - try - { - Process.Start(SettingsManager.Current.PowerShell_ApplicationFilePath); - } - catch (Exception ex) - { - var settings = AppearanceManager.MetroDialog; - - settings.AffirmativeButtonText = Localization.Resources.Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Error, ex.Message, MessageDialogStyle.Affirmative, settings); - } + await DialogHelper.ShowMessageAsync(System.Windows.Application.Current.MainWindow, Strings.Error, ex.Message, ChildWindowIcon.Error); } + } - public void SetFilePathFromDragDrop(string filePath) - { - ApplicationFilePath = filePath; + public void SetFilePathFromDragDrop(string filePath) + { + ApplicationFilePath = filePath; - OnPropertyChanged(nameof(ApplicationFilePath)); - } - #endregion + OnPropertyChanged(nameof(ApplicationFilePath)); } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/ProfileFileViewModel.cs b/Source/NETworkManager/ViewModels/ProfileFileViewModel.cs index 05a325d349..5893825d35 100644 --- a/Source/NETworkManager/ViewModels/ProfileFileViewModel.cs +++ b/Source/NETworkManager/ViewModels/ProfileFileViewModel.cs @@ -1,55 +1,53 @@ -using NETworkManager.Profiles; -using NETworkManager.Utilities; using System; using System.Windows.Input; +using NETworkManager.Profiles; +using NETworkManager.Utilities; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +public class ProfileFileViewModel : ViewModelBase { - public class ProfileFileViewModel : ViewModelBase + public ProfileFileViewModel(Action okCommand, Action cancelHandler, + ProfileFileInfo info = null) { - public ICommand AcceptCommand { get; } + OKCommand = new RelayCommand(_ => okCommand(this)); + CancelCommand = new RelayCommand(_ => cancelHandler(this)); - public ICommand CancelCommand { get; } + if (info == null) + return; - private string _name; - public string Name - { - get => _name; - set - { - if (value == _name) - return; - - _name = value; - OnPropertyChanged(); - } - } - - private bool _isEdit; - public bool IsEdit + Name = info.Name; + + IsEdit = true; + } + + public ICommand OKCommand { get; } + + public ICommand CancelCommand { get; } + + public string Name + { + get; + set { - get => _isEdit; - set - { - if (value == _isEdit) - return; - - _isEdit = value; - OnPropertyChanged(); - } + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - public ProfileFileViewModel(Action addCommand, Action cancelHandler, ProfileFileInfo info = null) + public bool IsEdit + { + get; + set { - AcceptCommand = new RelayCommand(p => addCommand(this)); - CancelCommand = new RelayCommand(p => cancelHandler(this)); - - if (info != null) - { - Name = info.Name; - - IsEdit = true; - } + if (value == field) + return; + + field = value; + OnPropertyChanged(); } } } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/ProfileHostViewModelBase.cs b/Source/NETworkManager/ViewModels/ProfileHostViewModelBase.cs new file mode 100644 index 0000000000..b8c1d66bf1 --- /dev/null +++ b/Source/NETworkManager/ViewModels/ProfileHostViewModelBase.cs @@ -0,0 +1,517 @@ +using NETworkManager.Controls; +using NETworkManager.Models; +using NETworkManager.Profiles; +using NETworkManager.Settings; +using NETworkManager.Utilities; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Linq; +using System.Windows; +using System.Windows.Data; +using System.Windows.Input; +using System.Windows.Threading; + +namespace NETworkManager.ViewModels; + +/// +/// Base class for view models that host the shared profile panel (search, tag filter, group list) next to a +/// tool-specific view. Holds all profile-panel state/commands that are identical across tools; derived +/// classes only need to describe how their tool's profiles are identified and searched. +/// +public abstract class ProfileHostViewModelBase : ViewModelBase, IProfileHostViewModel +{ + #region Variables + + private readonly DispatcherTimer _searchDispatcherTimer = new(); + private bool _searchDisabled; + private bool _isViewActive = true; + + /// + /// Gets the application name used for profile dialogs (add/edit/copy-as/delete) of this tool. + /// + protected abstract ApplicationName ApplicationName { get; } + + /// + /// Determines whether the given profile is enabled for this tool. + /// + protected abstract bool IsProfileEnabled(ProfileInfo profile); + + /// + /// Gets the tool-specific field of the given profile that should also be matched against the search text + /// (in addition to the profile name). + /// + protected abstract string GetSearchableField(ProfileInfo profile); + + /// + /// Gets the view for the profiles. + /// + public ICollectionView Profiles + { + get; + private set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets or sets the selected profile. Virtual so tools that need to react to a profile selection (e.g. + /// pre-filling other fields from the profile) can override it and still participate in the base class's + /// own internal re-selection logic (e.g. in ). + /// + public virtual ProfileInfo SelectedProfile + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets or sets the search text. + /// + public string Search + { + get; + set + { + if (value == field) + return; + + field = value; + + // Start searching... + if (!_searchDisabled) + { + IsSearching = true; + _searchDispatcherTimer.Start(); + } + + OnPropertyChanged(); + } + } + + /// + /// Gets or sets a value indicating whether a search is in progress. + /// + public bool IsSearching + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets or sets a value indicating whether the profile filter popup is open. + /// + public bool ProfileFilterIsOpen + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets the view for the profile filter tags. + /// + public ICollectionView ProfileFilterTagsView { get; private set; } + + private ObservableCollection ProfileFilterTags { get; } = []; + + /// + /// Gets or sets a value indicating whether to match any profile filter tag. + /// + public bool ProfileFilterTagsMatchAny + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.Profile_TagsMatchAny; + + /// + /// Gets or sets a value indicating whether to match all profile filter tags. + /// + public bool ProfileFilterTagsMatchAll + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets or sets a value indicating whether a profile filter is currently applied. + /// + public bool IsProfileFilterSet + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Gets the group expander state store for the profile list. + /// + public GroupExpanderStateStore GroupExpanderStateStore { get; } = new(); + + #endregion + + #region Constructor + + /// + /// Initializes the shared profile-panel state. Must be called by derived constructors after their own + /// tool-specific initialization (and while _isLoading-equivalent guards, if any, are still active). + /// + protected void InitializeProfileHost() + { + LoadGroupExpandState(); + + CreateTags(); + + ProfileFilterTagsView = CollectionViewSource.GetDefaultView(ProfileFilterTags); + ProfileFilterTagsView.SortDescriptions.Add(new SortDescription(nameof(ProfileFilterTagsInfo.Name), + ListSortDirection.Ascending)); + + SetProfilesView(new ProfileFilterInfo()); + + ProfileManager.OnProfilesUpdated += ProfileManager_OnProfilesUpdated; + GroupExpanderStateStore.GroupExpandedChanged += GroupExpanderStateStore_GroupExpandedChanged; + + _searchDispatcherTimer.Interval = GlobalStaticConfiguration.SearchDispatcherTimerTimeSpan; + _searchDispatcherTimer.Tick += SearchDispatcherTimer_Tick; + } + + #endregion + + #region ICommands & Actions + + /// + /// Gets the command to add a new profile. + /// + public ICommand AddProfileCommand => new RelayCommand(_ => AddProfileAction()); + + private void AddProfileAction() + { + _ = ProfileDialogManager + .ShowAddProfileDialog(Application.Current.MainWindow, this, null, null, ApplicationName); + } + + private bool ModifyProfile_CanExecute(object obj) + { + return SelectedProfile is { IsDynamic: false }; + } + + /// + /// Gets the command to edit the selected profile. + /// + public ICommand EditProfileCommand => new RelayCommand(_ => EditProfileAction(), ModifyProfile_CanExecute); + + private void EditProfileAction() + { + _ = ProfileDialogManager.ShowEditProfileDialog(Application.Current.MainWindow, this, SelectedProfile); + } + + /// + /// Gets the command to copy the selected profile as a new profile. + /// + public ICommand CopyAsProfileCommand => new RelayCommand(_ => CopyAsProfileAction(), ModifyProfile_CanExecute); + + private void CopyAsProfileAction() + { + _ = ProfileDialogManager.ShowCopyAsProfileDialog(Application.Current.MainWindow, this, SelectedProfile); + } + + /// + /// Gets the command to delete the selected profile. + /// + public ICommand DeleteProfileCommand => new RelayCommand(_ => DeleteProfileAction(), ModifyProfile_CanExecute); + + private void DeleteProfileAction() + { + _ = ProfileDialogManager + .ShowDeleteProfileDialog(Application.Current.MainWindow, this, new List { SelectedProfile }); + } + + /// + /// Gets the command to edit a group. + /// + public ICommand EditGroupCommand => new RelayCommand(EditGroupAction); + + private void EditGroupAction(object group) + { + _ = ProfileDialogManager + .ShowEditGroupDialog(Application.Current.MainWindow, this, ProfileManager.GetGroupByName($"{group}")); + } + + /// + /// Gets the command to open the profile filter. + /// + public ICommand OpenProfileFilterCommand => new RelayCommand(_ => OpenProfileFilterAction()); + + private void OpenProfileFilterAction() + { + ProfileFilterIsOpen = true; + } + + /// + /// Gets the command to apply the profile filter. + /// + public ICommand ApplyProfileFilterCommand => new RelayCommand(_ => ApplyProfileFilterAction()); + + private void ApplyProfileFilterAction() + { + RefreshProfiles(); + + ProfileFilterIsOpen = false; + } + + /// + /// Gets the command to clear the profile filter. + /// + public ICommand ClearProfileFilterCommand => new RelayCommand(_ => ClearProfileFilterAction()); + + private void ClearProfileFilterAction() + { + _searchDisabled = true; + Search = string.Empty; + _searchDisabled = false; + + foreach (var tag in ProfileFilterTags) + tag.IsSelected = false; + + RefreshProfiles(); + + IsProfileFilterSet = false; + ProfileFilterIsOpen = false; + } + + /// + /// Gets the command to expand all profile groups. + /// + public ICommand ExpandAllProfileGroupsCommand => new RelayCommand(_ => ExpandAllProfileGroupsAction()); + + private void ExpandAllProfileGroupsAction() + { + SetIsExpandedForAllProfileGroups(true); + } + + /// + /// Gets the command to collapse all profile groups. + /// + public ICommand CollapseAllProfileGroupsCommand => new RelayCommand(_ => CollapseAllProfileGroupsAction()); + + private void CollapseAllProfileGroupsAction() + { + SetIsExpandedForAllProfileGroups(false); + } + + #endregion + + #region Methods + + private void SetIsExpandedForAllProfileGroups(bool isExpanded) + { + foreach (var group in Profiles.Groups.Cast()) + GroupExpanderStateStore[group.Name.ToString()] = isExpanded; + } + + /// + /// Loads the persisted group-expand state for the currently loaded profile file into + /// . Always called, even with no persisted state, so that + /// switching to a different profile file doesn't leak state for a same-named group. + /// + private void LoadGroupExpandState() + { + Dictionary state = null; + + if (ProfileManager.LoadedProfileFile != null) + SettingsManager.Current.Profiles_GroupExpandState.TryGetValue( + ProfileManager.LoadedProfileFile.Path, out state); + + GroupExpanderStateStore.LoadState(state); + } + + /// + /// Called when the view becomes visible. + /// + public virtual void OnViewVisible() + { + _isViewActive = true; + + LoadGroupExpandState(); + + RefreshProfiles(); + } + + /// + /// Called when the view is hidden. + /// + public virtual void OnViewHide() + { + _isViewActive = false; + } + + /// + /// Called when a dialog in the is opened. Virtual so tools with an + /// embedded native window (e.g. PowerShell, PuTTY, RemoteDesktop, TigerVNC, WebConsole) can override it to + /// enable while the dialog is shown. + /// + public virtual void OnProfileManagerDialogOpen() + { + } + + /// + /// Called when a dialog in the is closed. + /// + public virtual void OnProfileManagerDialogClose() + { + } + + private void CreateTags() + { + var tags = ProfileManager.LoadedProfileFileData.Groups.SelectMany(x => x.Profiles).Where(IsProfileEnabled) + .SelectMany(x => x.TagsCollection).Distinct().ToList(); + + var tagSet = new HashSet(tags); + + for (var i = ProfileFilterTags.Count - 1; i >= 0; i--) + { + if (!tagSet.Contains(ProfileFilterTags[i].Name)) + ProfileFilterTags.RemoveAt(i); + } + + var existingTagNames = new HashSet(ProfileFilterTags.Select(ft => ft.Name)); + + foreach (var tag in tags.Where(tag => !existingTagNames.Contains(tag))) + { + ProfileFilterTags.Add(new ProfileFilterTagsInfo(false, tag)); + } + } + + private void SetProfilesView(ProfileFilterInfo filter, ProfileInfo profile = null) + { + Profiles = new CollectionViewSource + { + Source = ProfileManager.LoadedProfileFileData.Groups.SelectMany(x => x.Profiles).Where(x => IsProfileEnabled(x) && ( + string.IsNullOrEmpty(filter.Search) || + x.Name.IndexOf(filter.Search, StringComparison.OrdinalIgnoreCase) > -1 || + GetSearchableField(x).IndexOf(filter.Search, StringComparison.OrdinalIgnoreCase) > -1) && ( + // If no tags are selected, show all profiles + (!filter.Tags.Any()) || + // Any tag can match + (filter.TagsFilterMatch == ProfileFilterTagsMatch.Any && + filter.Tags.Any(tag => x.TagsCollection.Contains(tag))) || + // All tags must match + (filter.TagsFilterMatch == ProfileFilterTagsMatch.All && + filter.Tags.All(tag => x.TagsCollection.Contains(tag)))) + ).OrderBy(x => x.Group).ThenBy(x => x.Name) + }.View; + + Profiles.GroupDescriptions.Add(new PropertyGroupDescription(nameof(ProfileInfo.Group))); + + // Set specific profile or first if null + SelectedProfile = null; + + if (profile != null) + SelectedProfile = Profiles.Cast().FirstOrDefault(x => x.Equals(profile)) ?? + Profiles.Cast().FirstOrDefault(); + else + SelectedProfile = Profiles.Cast().FirstOrDefault(); + } + + private void RefreshProfiles() + { + if (!_isViewActive) + return; + + var filter = new ProfileFilterInfo + { + Search = Search, + Tags = [.. ProfileFilterTags.Where(x => x.IsSelected).Select(x => x.Name)], + TagsFilterMatch = ProfileFilterTagsMatchAny ? ProfileFilterTagsMatch.Any : ProfileFilterTagsMatch.All + }; + + SetProfilesView(filter, SelectedProfile); + + IsProfileFilterSet = !string.IsNullOrEmpty(filter.Search) || filter.Tags.Any(); + } + + #endregion + + #region Event + + private void ProfileManager_OnProfilesUpdated(object sender, EventArgs e) + { + CreateTags(); + + RefreshProfiles(); + } + + private void GroupExpanderStateStore_GroupExpandedChanged(object sender, GroupExpandedChangedArgs e) + { + if (ProfileManager.LoadedProfileFile == null) + return; + + var path = ProfileManager.LoadedProfileFile.Path; + + if (!SettingsManager.Current.Profiles_GroupExpandState.TryGetValue(path, out var state)) + { + state = new Dictionary(); + SettingsManager.Current.Profiles_GroupExpandState[path] = state; + } + + state[e.GroupName] = e.IsExpanded; + SettingsManager.Current.SettingsChanged = true; + } + + private void SearchDispatcherTimer_Tick(object sender, EventArgs e) + { + _searchDispatcherTimer.Stop(); + + RefreshProfiles(); + + IsSearching = false; + } + + #endregion +} diff --git a/Source/NETworkManager/ViewModels/ProfileViewModel.cs b/Source/NETworkManager/ViewModels/ProfileViewModel.cs index 1b224ab7d7..4c6ea972fb 100644 --- a/Source/NETworkManager/ViewModels/ProfileViewModel.cs +++ b/Source/NETworkManager/ViewModels/ProfileViewModel.cs @@ -1,2359 +1,2934 @@ -using NETworkManager.Settings; +using NETworkManager.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Models; +using NETworkManager.Models.Network; +using NETworkManager.Models.PowerShell; +using NETworkManager.Models.PuTTY; +using NETworkManager.Models.RemoteDesktop; +using NETworkManager.Profiles; +using NETworkManager.Settings; using NETworkManager.Utilities; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; -using System.Net; -using System.Net.Sockets; +using System.Security; +using System.Threading.Tasks; using System.Windows.Data; using System.Windows.Input; -using NETworkManager.Models.PowerShell; -using NETworkManager.Models.RemoteDesktop; -using NETworkManager.Profiles; -using NETworkManager.Models.PuTTY; -using System.Security; -namespace NETworkManager.ViewModels +// ReSharper disable InconsistentNaming + +namespace NETworkManager.ViewModels; + +public class ProfileViewModel : ViewModelBase { - public class ProfileViewModel : ViewModelBase + #region Constructor + + public ProfileViewModel(Action saveCommand, Action cancelHandler, + IReadOnlyCollection groups, string group = null, ProfileEditMode editMode = ProfileEditMode.Add, + ProfileInfo profile = null, ApplicationName applicationName = ApplicationName.None) + { + // Load the view + ProfileViews = new CollectionViewSource { Source = ProfileViewManager.List }.View; + ProfileViews.SortDescriptions.Add( + new SortDescription(nameof(ProfileViewInfo.Name), ListSortDirection.Ascending)); + + SaveCommand = new RelayCommand(_ => saveCommand(this)); + CancelCommand = new RelayCommand(_ => cancelHandler(this)); + + var profileInfo = profile ?? new ProfileInfo(); + + Name = profileInfo.Name; + + if (editMode == ProfileEditMode.Copy) + Name += " - " + Strings.CopyNoun; + + Host = profileInfo.Host; + + Description = profileInfo.Description; + + // Try to get group (name) as parameter, then from profile, then the first in the list of groups, then the default group + Group = group ?? (string.IsNullOrEmpty(profileInfo.Group) + ? groups.Count > 0 ? groups.OrderBy(x => x).First() : Strings.Default + : profileInfo.Group); + + Groups = CollectionViewSource.GetDefaultView(groups); + Groups.SortDescriptions.Add(new SortDescription()); + + TagsCollection = new ObservableSetCollection(profileInfo.TagsCollection); + + Tags = CollectionViewSource.GetDefaultView(TagsCollection); + Tags.SortDescriptions.Add(new SortDescription("", ListSortDirection.Ascending)); + + // Network Interface + NetworkInterface_Enabled = editMode == ProfileEditMode.Add + ? applicationName == ApplicationName.NetworkInterface + : profileInfo.NetworkInterface_Enabled; + NetworkInterface_EnableDynamicIPAddress = !profileInfo.NetworkInterface_EnableStaticIPAddress; + NetworkInterface_EnableStaticIPAddress = profileInfo.NetworkInterface_EnableStaticIPAddress; + NetworkInterface_IPAddress = profileInfo.NetworkInterface_IPAddress; + NetworkInterface_Gateway = profileInfo.NetworkInterface_Gateway; + NetworkInterface_Subnetmask = profileInfo.NetworkInterface_Subnetmask; + NetworkInterface_EnableDynamicDNS = !profileInfo.NetworkInterface_EnableStaticDNS; + NetworkInterface_EnableStaticDNS = profileInfo.NetworkInterface_EnableStaticDNS; + NetworkInterface_PrimaryDNSServer = profileInfo.NetworkInterface_PrimaryDNSServer; + NetworkInterface_SecondaryDNSServer = profileInfo.NetworkInterface_SecondaryDNSServer; + + // IP Scanner + IPScanner_Enabled = editMode == ProfileEditMode.Add + ? applicationName == ApplicationName.IPScanner + : profileInfo.IPScanner_Enabled; + IPScanner_InheritHost = profileInfo.IPScanner_InheritHost; + IPScanner_HostOrIPRange = profileInfo.IPScanner_HostOrIPRange; + + // Port Scanner + PortScanner_Enabled = editMode == ProfileEditMode.Add + ? applicationName == ApplicationName.PortScanner + : profileInfo.PortScanner_Enabled; + PortScanner_InheritHost = profileInfo.PortScanner_InheritHost; + PortScanner_Host = profileInfo.PortScanner_Host; + PortScanner_Ports = profileInfo.PortScanner_Ports; + + // Ping Monitor + PingMonitor_Enabled = editMode == ProfileEditMode.Add + ? applicationName == ApplicationName.PingMonitor + : profileInfo.PingMonitor_Enabled; + PingMonitor_InheritHost = profileInfo.PingMonitor_InheritHost; + PingMonitor_Host = profileInfo.PingMonitor_Host; + + // Traceroute + Traceroute_Enabled = editMode == ProfileEditMode.Add + ? applicationName == ApplicationName.Traceroute + : profileInfo.Traceroute_Enabled; + Traceroute_InheritHost = profileInfo.Traceroute_InheritHost; + Traceroute_Host = profileInfo.Traceroute_Host; + + // DNS Lookup + DNSLookup_Enabled = editMode == ProfileEditMode.Add + ? applicationName == ApplicationName.DNSLookup + : profileInfo.DNSLookup_Enabled; + DNSLookup_InheritHost = profileInfo.DNSLookup_InheritHost; + DNSLookup_Host = profileInfo.DNSLookup_Host; + + // Remote Desktop + RemoteDesktop_Enabled = editMode == ProfileEditMode.Add + ? applicationName == ApplicationName.RemoteDesktop + : profileInfo.RemoteDesktop_Enabled; + RemoteDesktop_InheritHost = profileInfo.RemoteDesktop_InheritHost; + RemoteDesktop_Host = profileInfo.RemoteDesktop_Host; + RemoteDesktop_UseCredentials = profileInfo.RemoteDesktop_UseCredentials; + RemoteDesktop_Username = profileInfo.RemoteDesktop_Username; + RemoteDesktop_Domain = profileInfo.RemoteDesktop_Domain; + RemoteDesktop_Password = profileInfo.RemoteDesktop_Password; + RemoteDesktop_AdminSession = profileInfo.RemoteDesktop_AdminSession; + RemoteDesktop_OverrideDisplay = profileInfo.RemoteDesktop_OverrideDisplay; + RemoteDesktop_AdjustScreenAutomatically = profileInfo.RemoteDesktop_AdjustScreenAutomatically; + RemoteDesktop_UseCurrentViewSize = profileInfo.RemoteDesktop_UseCurrentViewSize; + RemoteDesktop_UseFixedScreenSize = profileInfo.RemoteDesktop_UseFixedScreenSize; + RemoteDesktop_SelectedScreenResolution = RemoteDesktop_ScreenResolutions.FirstOrDefault(x => + x == $"{profileInfo.RemoteDesktop_ScreenWidth}x{profileInfo.RemoteDesktop_ScreenHeight}"); + RemoteDesktop_UseCustomScreenSize = profileInfo.RemoteDesktop_UseCustomScreenSize; + RemoteDesktop_CustomScreenWidth = profileInfo.RemoteDesktop_CustomScreenWidth.ToString(); + RemoteDesktop_CustomScreenHeight = profileInfo.RemoteDesktop_CustomScreenHeight.ToString(); + RemoteDesktop_OverrideColorDepth = profileInfo.RemoteDesktop_OverrideColorDepth; + RemoteDesktop_SelectedColorDepth = + RemoteDesktop_ColorDepths.FirstOrDefault(x => x == profileInfo.RemoteDesktop_ColorDepth); + RemoteDesktop_OverridePort = profileInfo.RemoteDesktop_OverridePort; + RemoteDesktop_Port = profileInfo.RemoteDesktop_Port; + RemoteDesktop_OverrideViewOnly = profileInfo.RemoteDesktop_OverrideViewOnly; + RemoteDesktop_ViewOnly = profileInfo.RemoteDesktop_ViewOnly; + RemoteDesktop_OverrideCredSspSupport = profileInfo.RemoteDesktop_OverrideCredSspSupport; + RemoteDesktop_EnableCredSspSupport = profileInfo.RemoteDesktop_EnableCredSspSupport; + RemoteDesktop_OverrideAuthenticationLevel = profileInfo.RemoteDesktop_OverrideAuthenticationLevel; + RemoteDesktop_AuthenticationLevel = profileInfo.RemoteDesktop_AuthenticationLevel; + RemoteDesktop_OverrideGatewayServer = profileInfo.RemoteDesktop_OverrideGatewayServer; + RemoteDesktop_EnableGatewayServer = profileInfo.RemoteDesktop_EnableGatewayServer; + RemoteDesktop_GatewayServerHostname = profileInfo.RemoteDesktop_GatewayServerHostname; + RemoteDesktop_GatewayServerBypassLocalAddresses = profileInfo.RemoteDesktop_GatewayServerBypassLocalAddresses; + RemoteDesktop_GatewayServerLogonMethod = profileInfo.RemoteDesktop_GatewayServerLogonMethod; + RemoteDesktop_GatewayServerShareCredentialsWithRemoteComputer = + profileInfo.RemoteDesktop_GatewayServerShareCredentialsWithRemoteComputer; + RemoteDesktop_UseGatewayServerCredentials = profileInfo.RemoteDesktop_UseGatewayServerCredentials; + RemoteDesktop_GatewayServerUsername = profileInfo.RemoteDesktop_GatewayServerUsername; + RemoteDesktop_GatewayServerDomain = profileInfo.RemoteDesktop_GatewayServerDomain; + RemoteDesktop_GatewayServerPassword = profileInfo.RemoteDesktop_GatewayServerPassword; + RemoteDesktop_OverrideAudioRedirectionMode = profileInfo.RemoteDesktop_OverrideAudioRedirectionMode; + RemoteDesktop_AudioRedirectionMode = + RemoteDesktop_AudioRedirectionModes.FirstOrDefault(x => + x == profileInfo.RemoteDesktop_AudioRedirectionMode); + RemoteDesktop_OverrideAudioCaptureRedirectionMode = + profileInfo.RemoteDesktop_OverrideAudioCaptureRedirectionMode; + RemoteDesktop_AudioCaptureRedirectionMode = + RemoteDesktop_AudioCaptureRedirectionModes.FirstOrDefault(x => + x == profileInfo.RemoteDesktop_AudioCaptureRedirectionMode); + RemoteDesktop_OverrideApplyWindowsKeyCombinations = + profileInfo.RemoteDesktop_OverrideApplyWindowsKeyCombinations; + RemoteDesktop_KeyboardHookMode = + RemoteDesktop_KeyboardHookModes.FirstOrDefault(x => x == profileInfo.RemoteDesktop_KeyboardHookMode); + RemoteDesktop_OverrideRedirectClipboard = profileInfo.RemoteDesktop_OverrideRedirectClipboard; + RemoteDesktop_RedirectClipboard = profileInfo.RemoteDesktop_RedirectClipboard; + RemoteDesktop_OverrideRedirectDevices = profileInfo.RemoteDesktop_OverrideRedirectDevices; + RemoteDesktop_RedirectDevices = profileInfo.RemoteDesktop_RedirectDevices; + RemoteDesktop_OverrideRedirectDrives = profileInfo.RemoteDesktop_OverrideRedirectDrives; + RemoteDesktop_RedirectDrives = profileInfo.RemoteDesktop_RedirectDrives; + RemoteDesktop_OverrideRedirectPorts = profileInfo.RemoteDesktop_OverrideRedirectPorts; + RemoteDesktop_RedirectPorts = profileInfo.RemoteDesktop_RedirectPorts; + RemoteDesktop_OverrideRedirectSmartcards = profileInfo.RemoteDesktop_OverrideRedirectSmartcards; + RemoteDesktop_RedirectSmartCards = profileInfo.RemoteDesktop_RedirectSmartCards; + RemoteDesktop_OverrideRedirectPrinters = profileInfo.RemoteDesktop_OverrideRedirectPrinters; + RemoteDesktop_RedirectPrinters = profileInfo.RemoteDesktop_RedirectPrinters; + RemoteDesktop_OverridePersistentBitmapCaching = profileInfo.RemoteDesktop_OverridePersistentBitmapCaching; + RemoteDesktop_PersistentBitmapCaching = profileInfo.RemoteDesktop_PersistentBitmapCaching; + RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped = + profileInfo.RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped; + RemoteDesktop_ReconnectIfTheConnectionIsDropped = profileInfo.RemoteDesktop_ReconnectIfTheConnectionIsDropped; + RemoteDesktop_NetworkConnectionType = + RemoteDesktop_NetworkConnectionTypes.FirstOrDefault(x => + x == profileInfo.RemoteDesktop_NetworkConnectionType); + RemoteDesktop_DesktopBackground = profileInfo.RemoteDesktop_DesktopBackground; + RemoteDesktop_FontSmoothing = profileInfo.RemoteDesktop_FontSmoothing; + RemoteDesktop_DesktopComposition = profileInfo.RemoteDesktop_DesktopComposition; + RemoteDesktop_ShowWindowContentsWhileDragging = profileInfo.RemoteDesktop_ShowWindowContentsWhileDragging; + RemoteDesktop_MenuAndWindowAnimation = profileInfo.RemoteDesktop_MenuAndWindowAnimation; + RemoteDesktop_VisualStyles = profileInfo.RemoteDesktop_VisualStyles; + + // PowerShell + PowerShell_Enabled = editMode == ProfileEditMode.Add + ? applicationName == ApplicationName.PowerShell + : profileInfo.PowerShell_Enabled; + PowerShell_EnableRemoteConsole = profileInfo.PowerShell_EnableRemoteConsole; + PowerShell_InheritHost = profileInfo.PowerShell_InheritHost; + PowerShell_Host = profileInfo.PowerShell_Host; + PowerShell_OverrideCommand = profileInfo.PowerShell_OverrideCommand; + PowerShell_Command = profileInfo.PowerShell_Command; + PowerShell_OverrideAdditionalCommandLine = profileInfo.PowerShell_OverrideAdditionalCommandLine; + PowerShell_AdditionalCommandLine = profileInfo.PowerShell_AdditionalCommandLine; + PowerShell_ExecutionPolicies = Enum.GetValues(typeof(ExecutionPolicy)).Cast().ToList(); + PowerShell_OverrideExecutionPolicy = profileInfo.PowerShell_OverrideExecutionPolicy; + PowerShell_ExecutionPolicy = profileInfo.PowerShell_ExecutionPolicy; + + // PuTTY + PuTTY_Enabled = editMode == ProfileEditMode.Add + ? applicationName == ApplicationName.PuTTY + : profileInfo.PuTTY_Enabled; + + switch (profileInfo.PuTTY_ConnectionMode) + { + // SSH is default + case ConnectionMode.SSH: + PuTTY_UseSSH = true; + break; + case ConnectionMode.Telnet: + PuTTY_UseTelnet = true; + break; + case ConnectionMode.Serial: + PuTTY_UseSerial = true; + break; + case ConnectionMode.Rlogin: + PuTTY_UseRlogin = true; + break; + case ConnectionMode.RAW: + PuTTY_UseRAW = true; + break; + } + + PuTTY_InheritHost = profileInfo.PuTTY_InheritHost; + + if (profileInfo.PuTTY_ConnectionMode != ConnectionMode.Serial) + PuTTY_Host = profileInfo.PuTTY_HostOrSerialLine; + else + PuTTY_SerialLine = profileInfo.PuTTY_HostOrSerialLine; + + PuTTY_OverridePortOrBaud = profileInfo.PuTTY_OverridePortOrBaud; + + if (profileInfo.PuTTY_ConnectionMode != ConnectionMode.Serial) + PuTTY_Port = profileInfo.PuTTY_PortOrBaud; + else + PuTTY_Baud = profileInfo.PuTTY_PortOrBaud; + + PuTTY_OverrideUsername = profileInfo.PuTTY_OverrideUsername; + PuTTY_Username = profileInfo.PuTTY_Username; + PuTTY_OverridePrivateKeyFile = profileInfo.PuTTY_OverridePrivateKeyFile; + PuTTY_PrivateKeyFile = profileInfo.PuTTY_PrivateKeyFile; + PuTTY_OverrideProfile = profileInfo.PuTTY_OverrideProfile; + PuTTY_Profile = profileInfo.PuTTY_Profile; + PuTTY_OverrideHostkey = profileInfo.PuTTY_OverrideHostkey; + PuTTY_Hostkey = profileInfo.PuTTY_Hostkey; + PuTTY_OverrideEnableLog = profileInfo.PuTTY_OverrideEnableLog; + PuTTY_EnableLog = profileInfo.PuTTY_EnableLog; + PuTTY_OverrideLogMode = profileInfo.PuTTY_OverrideLogMode; + PuTTY_LogMode = PuTTY_LogModes.FirstOrDefault(x => x == profileInfo.PuTTY_LogMode); + PuTTY_OverrideLogPath = profileInfo.PuTTY_OverrideLogPath; + PuTTY_LogPath = profileInfo.PuTTY_LogPath; + PuTTY_OverrideLogFileName = profileInfo.PuTTY_OverrideLogFileName; + PuTTY_LogFileName = profileInfo.PuTTY_LogFileName; + PuTTY_OverrideAdditionalCommandLine = profileInfo.PuTTY_OverrideAdditionalCommandLine; + PuTTY_AdditionalCommandLine = profileInfo.PuTTY_AdditionalCommandLine; + + // TigerVNC + TigerVNC_Enabled = editMode == ProfileEditMode.Add + ? applicationName == ApplicationName.TigerVNC + : profileInfo.TigerVNC_Enabled; + TigerVNC_InheritHost = profileInfo.TigerVNC_InheritHost; + TigerVNC_Host = profileInfo.TigerVNC_Host; + TigerVNC_OverridePort = profileInfo.TigerVNC_OverridePort; + TigerVNC_Port = profileInfo.TigerVNC_Port; + + // Web Console + WebConsole_Enabled = editMode == ProfileEditMode.Add + ? applicationName == ApplicationName.WebConsole + : profileInfo.WebConsole_Enabled; + WebConsole_Url = profileInfo.WebConsole_Url; + + // SNMP + SNMP_Enabled = editMode == ProfileEditMode.Add + ? applicationName == ApplicationName.SNMP + : profileInfo.SNMP_Enabled; + SNMP_InheritHost = profileInfo.SNMP_InheritHost; + SNMP_Host = profileInfo.SNMP_Host; + SNMP_OverrideOIDAndMode = profileInfo.SNMP_OverrideOIDAndMode; + SNMP_OID = profileInfo.SNMP_OID; + SNMP_Modes = new List { SNMPMode.Get, SNMPMode.Walk, SNMPMode.Set }; + SNMP_Mode = SNMP_Modes.FirstOrDefault(x => x == profileInfo.SNMP_Mode); + SNMP_OverrideVersionAndAuth = profileInfo.SNMP_OverrideVersionAndAuth; + SNMP_Versions = Enum.GetValues(typeof(SNMPVersion)).Cast().ToList(); + SNMP_Version = SNMP_Versions.FirstOrDefault(x => x == profileInfo.SNMP_Version); + SNMP_Community = profileInfo.SNMP_Community; + SNMP_Securities = new List + { SNMPV3Security.NoAuthNoPriv, SNMPV3Security.AuthNoPriv, SNMPV3Security.AuthPriv }; + SNMP_Security = SNMP_Securities.FirstOrDefault(x => x == profileInfo.SNMP_Security); + SNMP_Username = profileInfo.SNMP_Username; + SNMP_AuthenticationProviders = Enum.GetValues(typeof(SNMPV3AuthenticationProvider)) + .Cast().ToList(); + SNMP_AuthenticationProvider = + SNMP_AuthenticationProviders.FirstOrDefault(x => x == profileInfo.SNMP_AuthenticationProvider); + SNMP_Auth = profileInfo.SNMP_Auth; + SNMP_PrivacyProviders = Enum.GetValues(typeof(SNMPV3PrivacyProvider)).Cast().ToList(); + SNMP_PrivacyProvider = SNMP_PrivacyProviders.FirstOrDefault(x => x == profileInfo.SNMP_PrivacyProvider); + SNMP_Priv = profileInfo.SNMP_Priv; + + // Wake on LAN + WakeOnLAN_Enabled = editMode == ProfileEditMode.Add + ? applicationName == ApplicationName.WakeOnLAN + : profileInfo.WakeOnLAN_Enabled; + WakeOnLAN_MACAddress = profileInfo.WakeOnLAN_MACAddress; + WakeOnLAN_Broadcast = profileInfo.WakeOnLAN_Broadcast; + + // Whois + Whois_Enabled = editMode == ProfileEditMode.Add + ? applicationName == ApplicationName.Whois + : profileInfo.Whois_Enabled; + Whois_InheritHost = profileInfo.Whois_InheritHost; + Whois_Domain = profileInfo.Whois_Domain; + + // IP Geolocation + IPGeolocation_Enabled = editMode == ProfileEditMode.Add + ? applicationName == ApplicationName.IPGeolocation + : profileInfo.IPGeolocation_Enabled; + IPGeolocation_InheritHost = profileInfo.IPGeolocation_InheritHost; + IPGeolocation_Host = profileInfo.IPGeolocation_Host; + + _isLoading = false; + } + #endregion + + #region Methods + + private void ChangeNetworkConnectionTypeSettings(NetworkConnectionType connectionSpeed) { - #region Variables - private readonly bool _isLoading = true; + switch (connectionSpeed) + { + case NetworkConnectionType.Modem: + RemoteDesktop_DesktopBackground = false; + RemoteDesktop_FontSmoothing = false; + RemoteDesktop_DesktopComposition = false; + RemoteDesktop_ShowWindowContentsWhileDragging = false; + RemoteDesktop_MenuAndWindowAnimation = false; + RemoteDesktop_VisualStyles = false; + break; + case NetworkConnectionType.BroadbandLow: + RemoteDesktop_DesktopBackground = false; + RemoteDesktop_FontSmoothing = false; + RemoteDesktop_DesktopComposition = false; + RemoteDesktop_ShowWindowContentsWhileDragging = false; + RemoteDesktop_MenuAndWindowAnimation = false; + RemoteDesktop_VisualStyles = true; + break; + case NetworkConnectionType.Satellite: + case NetworkConnectionType.BroadbandHigh: + RemoteDesktop_DesktopBackground = false; + RemoteDesktop_FontSmoothing = false; + RemoteDesktop_DesktopComposition = true; + RemoteDesktop_ShowWindowContentsWhileDragging = false; + RemoteDesktop_MenuAndWindowAnimation = false; + RemoteDesktop_VisualStyles = true; + break; + case NetworkConnectionType.WAN: + case NetworkConnectionType.LAN: + RemoteDesktop_DesktopBackground = true; + RemoteDesktop_FontSmoothing = true; + RemoteDesktop_DesktopComposition = true; + RemoteDesktop_ShowWindowContentsWhileDragging = true; + RemoteDesktop_MenuAndWindowAnimation = true; + RemoteDesktop_VisualStyles = true; + break; + } + } + #endregion + + #region Variables - public bool IsProfileFileEncrypted => ProfileManager.LoadedProfileFile.IsEncrypted; + private readonly bool _isLoading = true; - public ICollectionView ProfileViews { get; } + public bool IsProfileFileEncrypted => ProfileManager.LoadedProfileFile.IsEncrypted; - #region General - private string _name; - public string Name + public ICollectionView ProfileViews { get; } + + #region General + + public string Name + { + get; + set { - get => _name; - set - { - if (value == _name) - return; + if (value == field) + return; - _name = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _host; - public string Host + public string Host + { + get; + set { - get => _host; - set - { - if (value == _host) - return; + if (value == field) + return; - // Reset, if string has changed - if (!IsResolveHostnameRunning) - ShowCouldNotResolveHostnameWarning = false; + // Reset, if string has changed + if (!IsResolveHostnameRunning) + ShowCouldNotResolveHostnameWarning = false; - _host = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isResolveHostnameRunning; - public bool IsResolveHostnameRunning + public bool IsResolveHostnameRunning + { + get; + set { - get => _isResolveHostnameRunning; - set - { - if (value == _isResolveHostnameRunning) - return; + if (value == field) + return; - _isResolveHostnameRunning = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _showCouldNotResolveHostnameWarning; - public bool ShowCouldNotResolveHostnameWarning + public bool ShowCouldNotResolveHostnameWarning + { + get; + set { - get => _showCouldNotResolveHostnameWarning; - set - { - if (value == _showCouldNotResolveHostnameWarning) - return; + if (value == field) + return; - _showCouldNotResolveHostnameWarning = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _group; - public string Group + public string Description + { + get; + set { - get => _group; - set - { - if (value == _group) - return; + if (value == field) + return; - _group = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); + } + } + + public string Group + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public ICollectionView Groups { get; } + + public string Tag + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - public ICollectionView Groups { get; } + public ICollectionView Tags { get; } - private string _tags; - public string Tags + public ObservableSetCollection TagsCollection + { + get; + private init { - get => _tags; - set - { - if (value == _tags) - return; + if (Equals(value, field)) + return; - _tags = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion + } + + #endregion - #region Network Interface - private bool _networkInterface_Enabled; - public bool NetworkInterface_Enabled + #region Network Interface + + public bool NetworkInterface_Enabled + { + get; + set { - get => _networkInterface_Enabled; - set - { - if (value == _networkInterface_Enabled) - return; + if (value == field) + return; - _networkInterface_Enabled = value; + field = value; - OnPropertyChanged(); - } + OnPropertyChanged(); } + } - private bool _networkInterface_EnableDynamicIPAddress = true; - public bool NetworkInterface_EnableDynamicIPAddress + public bool NetworkInterface_EnableDynamicIPAddress + { + get; + set { - get => _networkInterface_EnableDynamicIPAddress; - set - { - if (value == _networkInterface_EnableDynamicIPAddress) - return; + if (value == field) + return; - _networkInterface_EnableDynamicIPAddress = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _networkInterface_EnableStaticIPAddress; - public bool NetworkInterface_EnableStaticIPAddress + public bool NetworkInterface_EnableStaticIPAddress + { + get; + set { - get => _networkInterface_EnableStaticIPAddress; - set - { - if (value == _networkInterface_EnableStaticIPAddress) - return; + if (value == field) + return; - if (value) - NetworkInterface_EnableStaticDNS = true; + if (value) + NetworkInterface_EnableStaticDNS = true; - _networkInterface_EnableStaticIPAddress = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _networkInterface_IPAddress; - public string NetworkInterface_IPAddress + public string NetworkInterface_IPAddress + { + get; + set { - get => _networkInterface_IPAddress; - set - { - if (value == _networkInterface_IPAddress) - return; + if (value == field) + return; - _networkInterface_IPAddress = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _networkInterface_SubnetmaskOrCidr; - public string NetworkInterface_SubnetmaskOrCidr + public string NetworkInterface_Subnetmask + { + get; + set { - get => _networkInterface_SubnetmaskOrCidr; - set - { - if (value == _networkInterface_SubnetmaskOrCidr) - return; + if (value == field) + return; - _networkInterface_SubnetmaskOrCidr = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _networkInterface_Gateway; - public string NetworkInterface_Gateway + public string NetworkInterface_Gateway + { + get; + set { - get => _networkInterface_Gateway; - set - { - if (value == _networkInterface_Gateway) - return; + if (value == field) + return; - _networkInterface_Gateway = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _networkInterface_EnableDynamicDNS = true; - public bool NetworkInterface_EnableDynamicDNS + public bool NetworkInterface_EnableDynamicDNS + { + get; + set { - get => _networkInterface_EnableDynamicDNS; - set - { - if (value == _networkInterface_EnableDynamicDNS) - return; + if (value == field) + return; - _networkInterface_EnableDynamicDNS = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _networkInterface_EnableStaticDNS; - public bool NetworkInterface_EnableStaticDNS + public bool NetworkInterface_EnableStaticDNS + { + get; + set { - get => _networkInterface_EnableStaticDNS; - set - { - if (value == _networkInterface_EnableStaticDNS) - return; + if (value == field) + return; - _networkInterface_EnableStaticDNS = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _networkInterface_PrimaryDNSServer; - public string NetworkInterface_PrimaryDNSServer + public string NetworkInterface_PrimaryDNSServer + { + get; + set { - get => _networkInterface_PrimaryDNSServer; - set - { - if (value == _networkInterface_PrimaryDNSServer) - return; + if (value == field) + return; - _networkInterface_PrimaryDNSServer = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _networkInterface_SecondaryDNSServer; - public string NetworkInterface_SecondaryDNSServer + public string NetworkInterface_SecondaryDNSServer + { + get; + set { - get => _networkInterface_SecondaryDNSServer; - set - { - if (value == _networkInterface_SecondaryDNSServer) - return; + if (value == field) + return; - _networkInterface_SecondaryDNSServer = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion + } + + #endregion - #region IP Scanner - private bool _ipScanner_Enabled; - public bool IPScanner_Enabled + #region IP Scanner + + public bool IPScanner_Enabled + { + get; + set { - get => _ipScanner_Enabled; - set - { - if (value == _ipScanner_Enabled) - return; + if (value == field) + return; - _ipScanner_Enabled = value; + field = value; - OnPropertyChanged(); - } + OnPropertyChanged(); } + } - private bool _ipScanner_InheritHost; - public bool IPScanner_InheritHost + public bool IPScanner_InheritHost + { + get; + set { - get => _ipScanner_InheritHost; - set - { - if (value == _ipScanner_InheritHost) - return; + if (value == field) + return; - _ipScanner_InheritHost = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _ipScanner_HostOrIPRange; - public string IPScanner_HostOrIPRange + public string IPScanner_HostOrIPRange + { + get; + set { - get => _ipScanner_HostOrIPRange; - set - { - if (value == _ipScanner_HostOrIPRange) - return; + if (value == field) + return; - _ipScanner_HostOrIPRange = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + + #endregion - #endregion + #region Port Scanner - #region Port Scanner - private bool _portScanner_Enabled; - public bool PortScanner_Enabled + public bool PortScanner_Enabled + { + get; + set { - get => _portScanner_Enabled; - set - { - if (value == _portScanner_Enabled) - return; + if (value == field) + return; - _portScanner_Enabled = value; + field = value; - OnPropertyChanged(); - } + OnPropertyChanged(); } + } - private bool _portScanner_InheritHost; - public bool PortScanner_InheritHost + public bool PortScanner_InheritHost + { + get; + set { - get => _portScanner_InheritHost; - set - { - if (value == _portScanner_InheritHost) - return; + if (value == field) + return; - _portScanner_InheritHost = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _portScanner_Host; - public string PortScanner_Host + public string PortScanner_Host + { + get; + set { - get => _portScanner_Host; - set - { - if (value == _portScanner_Host) - return; + if (value == field) + return; - _portScanner_Host = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _portScanner_Ports; - public string PortScanner_Ports + public string PortScanner_Ports + { + get; + set { - get => _portScanner_Ports; - set - { - if (value == _portScanner_Ports) - return; + if (value == field) + return; - _portScanner_Ports = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - #endregion + #endregion - #region Ping Monitor - private bool _pingMonitor_Enabled; - public bool PingMonitor_Enabled + #region Ping Monitor + + public bool PingMonitor_Enabled + { + get; + set { - get => _pingMonitor_Enabled; - set - { - if (value == _pingMonitor_Enabled) - return; + if (value == field) + return; - _pingMonitor_Enabled = value; + field = value; - OnPropertyChanged(); - } + OnPropertyChanged(); } + } - private bool _pingMonitor_InheritHost; - public bool PingMonitor_InheritHost + public bool PingMonitor_InheritHost + { + get; + set { - get => _pingMonitor_InheritHost; - set - { - if (value == _pingMonitor_InheritHost) - return; + if (value == field) + return; - _pingMonitor_InheritHost = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _pingMonitor_Host; - public string PingMonitor_Host + public string PingMonitor_Host + { + get; + set { - get => _pingMonitor_Host; - set - { - if (value == _pingMonitor_Host) - return; + if (value == field) + return; - _pingMonitor_Host = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion + } + + #endregion - #region Traceroute - private bool _traceroute_Enabled; - public bool Traceroute_Enabled + #region Traceroute + + public bool Traceroute_Enabled + { + get; + set { - get => _traceroute_Enabled; - set - { - if (value == _traceroute_Enabled) - return; + if (value == field) + return; - _traceroute_Enabled = value; + field = value; - OnPropertyChanged(); - } + OnPropertyChanged(); } + } - private bool _traceroute_InheritHost; - public bool Traceroute_InheritHost + public bool Traceroute_InheritHost + { + get; + set { - get => _traceroute_InheritHost; - set - { - if (value == _traceroute_InheritHost) - return; + if (value == field) + return; - _traceroute_InheritHost = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _traceroute_Host; - public string Traceroute_Host + public string Traceroute_Host + { + get; + set { - get => _traceroute_Host; - set - { - if (value == _traceroute_Host) - return; + if (value == field) + return; - _traceroute_Host = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + + #endregion - #endregion + #region DNS Lookup - #region DNS Lookup - private bool _dnsLookup_Enabled; - public bool DNSLookup_Enabled + public bool DNSLookup_Enabled + { + get; + set { - get => _dnsLookup_Enabled; - set - { - if (value == _dnsLookup_Enabled) - return; + if (value == field) + return; - _dnsLookup_Enabled = value; + field = value; - OnPropertyChanged(); - } + OnPropertyChanged(); } + } - private bool _dnsLookup_InheritHost; - public bool DNSLookup_InheritHost + public bool DNSLookup_InheritHost + { + get; + set { - get => _dnsLookup_InheritHost; - set - { - if (value == _dnsLookup_InheritHost) - return; + if (value == field) + return; - _dnsLookup_InheritHost = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _dnsLookup_Host; - public string DNSLookup_Host + public string DNSLookup_Host + { + get; + set { - get => _dnsLookup_Host; - set - { - if (value == _dnsLookup_Host) - return; + if (value == field) + return; - _dnsLookup_Host = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion + } - #region Remote Desktop - private bool _remoteDesktop_Enabled; - public bool RemoteDesktop_Enabled + #endregion + + #region Remote Desktop + + public bool RemoteDesktop_Enabled + { + get; + set { - get => _remoteDesktop_Enabled; - set - { - if (value == _remoteDesktop_Enabled) - return; + if (value == field) + return; - _remoteDesktop_Enabled = value; + field = value; - OnPropertyChanged(); - } + OnPropertyChanged(); } + } - private bool _remoteDesktop_InheritHost; - public bool RemoteDesktop_InheritHost + public bool RemoteDesktop_InheritHost + { + get; + set { - get => _remoteDesktop_InheritHost; - set - { - if (value == _remoteDesktop_InheritHost) - return; + if (value == field) + return; - _remoteDesktop_InheritHost = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _remoteDesktop_Host; - public string RemoteDesktop_Host + public string RemoteDesktop_Host + { + get; + set { - get => _remoteDesktop_Host; - set - { - if (value == _remoteDesktop_Host) - return; + if (value == field) + return; - _remoteDesktop_Host = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_UseCredentials; - public bool RemoteDesktop_UseCredentials + public bool RemoteDesktop_UseCredentials + { + get; + set { - get => _remoteDesktop_UseCredentials; - set - { - if (value == _remoteDesktop_UseCredentials) - return; + if (value == field) + return; - _remoteDesktop_UseCredentials = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _remoteDesktop_Username; - public string RemoteDesktop_Username + public string RemoteDesktop_Username + { + get; + set { - get => _remoteDesktop_Username; - set - { - if (value == _remoteDesktop_Username) - return; + if (value == field) + return; - _remoteDesktop_Username = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_IsPasswordEmpty = true; // Initial it's empty - public bool RemoteDesktop_IsPasswordEmpty + public string RemoteDesktop_Domain + { + get; + set { - get => _remoteDesktop_IsPasswordEmpty; - set - { - if (value == _remoteDesktop_IsPasswordEmpty) - return; + if (value == field) + return; - _remoteDesktop_IsPasswordEmpty = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + + public bool RemoteDesktop_IsPasswordEmpty + { + get; + set + { + if (value == field) + return; - private SecureString _remoteDesktop_Password; + field = value; + OnPropertyChanged(); + } + } = true; - /// - /// RemoteDesktop password as secure string. - /// - public SecureString RemoteDesktop_Password + public SecureString RemoteDesktop_Password + { + get; + set { - get => _remoteDesktop_Password; - set - { - if (value == _remoteDesktop_Password) - return; + if (value == field) + return; - // Validate the password string - RemoteDesktop_IsPasswordEmpty = value == null || string.IsNullOrEmpty(SecureStringHelper.ConvertToString(value)); + // Validate the password string + RemoteDesktop_IsPasswordEmpty = + value == null || string.IsNullOrEmpty(SecureStringHelper.ConvertToString(value)); - _remoteDesktop_Password = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_PasswordChanged; - public bool RemoteDesktop_PasswordChanged + public bool RemoteDesktop_AdminSession + { + get; + set { - get => _remoteDesktop_PasswordChanged; - set - { - if (value == _remoteDesktop_PasswordChanged) - return; + if (value == field) + return; - _remoteDesktop_PasswordChanged = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_OverrideDisplay; - public bool RemoteDesktop_OverrideDisplay + public bool RemoteDesktop_OverrideDisplay + { + get; + set { - get => _remoteDesktop_OverrideDisplay; - set - { - if (value == _remoteDesktop_OverrideDisplay) - return; + if (value == field) + return; - _remoteDesktop_OverrideDisplay = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_AdjustScreenAutomatically; - public bool RemoteDesktop_AdjustScreenAutomatically + public bool RemoteDesktop_AdjustScreenAutomatically + { + get; + set { - get => _remoteDesktop_AdjustScreenAutomatically; - set - { - if (value == _remoteDesktop_AdjustScreenAutomatically) - return; + if (value == field) + return; - _remoteDesktop_AdjustScreenAutomatically = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_UseCurrentViewSize; - public bool RemoteDesktop_UseCurrentViewSize + public bool RemoteDesktop_UseCurrentViewSize + { + get; + set { - get => _remoteDesktop_UseCurrentViewSize; - set - { - if (value == _remoteDesktop_UseCurrentViewSize) - return; + if (value == field) + return; - _remoteDesktop_UseCurrentViewSize = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_UseFixedScreenSize; - public bool RemoteDesktop_UseFixedScreenSize + public bool RemoteDesktop_UseFixedScreenSize + { + get; + set { - get => _remoteDesktop_UseFixedScreenSize; - set - { - if (value == _remoteDesktop_UseFixedScreenSize) - return; + if (value == field) + return; - _remoteDesktop_UseFixedScreenSize = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - public List RemoteDesktop_ScreenResolutions => RemoteDesktop.ScreenResolutions; + public List RemoteDesktop_ScreenResolutions => RemoteDesktop.ScreenResolutions; - public int RemoteDesktop_ScreenWidth; - public int RemoteDesktop_ScreenHeight; + public int RemoteDesktop_ScreenWidth; + public int RemoteDesktop_ScreenHeight; - private string _remoteDesktop_SelectedScreenResolution; - public string RemoteDesktop_SelectedScreenResolution + public string RemoteDesktop_SelectedScreenResolution + { + get; + set { - get => _remoteDesktop_SelectedScreenResolution; - set - { - if (value == _remoteDesktop_SelectedScreenResolution) - return; + if (value == field) + return; - var resolution = value.Split('x'); + var resolution = value.Split('x'); - RemoteDesktop_ScreenWidth = int.Parse(resolution[0]); - RemoteDesktop_ScreenHeight = int.Parse(resolution[1]); + RemoteDesktop_ScreenWidth = int.Parse(resolution[0]); + RemoteDesktop_ScreenHeight = int.Parse(resolution[1]); - _remoteDesktop_SelectedScreenResolution = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_UseCustomScreenSize; - public bool RemoteDesktop_UseCustomScreenSize + public bool RemoteDesktop_UseCustomScreenSize + { + get; + set { - get => _remoteDesktop_UseCustomScreenSize; - set - { - if (value == _remoteDesktop_UseCustomScreenSize) - return; + if (value == field) + return; - _remoteDesktop_UseCustomScreenSize = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _remoteDesktop_CustomScreenWidth; - public string RemoteDesktop_CustomScreenWidth + public string RemoteDesktop_CustomScreenWidth + { + get; + set { - get => _remoteDesktop_CustomScreenWidth; - set - { - if (value == _remoteDesktop_CustomScreenWidth) - return; + if (value == field) + return; - _remoteDesktop_CustomScreenWidth = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _remoteDesktop_CustomScreenHeight; - public string RemoteDesktop_CustomScreenHeight + public string RemoteDesktop_CustomScreenHeight + { + get; + set { - get => _remoteDesktop_CustomScreenHeight; - set - { - if (value == _remoteDesktop_CustomScreenHeight) - return; + if (value == field) + return; - _remoteDesktop_CustomScreenHeight = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_OverrideColorDepth; - public bool RemoteDesktop_OverrideColorDepth + public bool RemoteDesktop_OverrideColorDepth + { + get; + set { - get => _remoteDesktop_OverrideColorDepth; - set - { - if (value == _remoteDesktop_OverrideColorDepth) - return; + if (value == field) + return; - _remoteDesktop_OverrideColorDepth = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - public List RemoteDesktop_ColorDepths => RemoteDesktop.ColorDepths; + public List RemoteDesktop_ColorDepths => RemoteDesktop.ColorDepths; - private int _remoteDesktop_SelectedColorDepth; - public int RemoteDesktop_SelectedColorDepth + public int RemoteDesktop_SelectedColorDepth + { + get; + set { - get => _remoteDesktop_SelectedColorDepth; - set - { - if (value == _remoteDesktop_SelectedColorDepth) - return; + if (value == field) + return; - _remoteDesktop_SelectedColorDepth = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_OverridePort; - public bool RemoteDesktop_OverridePort + public bool RemoteDesktop_OverridePort + { + get; + set { - get => _remoteDesktop_OverridePort; - set - { - if (value == _remoteDesktop_OverridePort) - return; + if (value == field) + return; - _remoteDesktop_OverridePort = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private int _remoteDesktop_Port; - public int RemoteDesktop_Port + public int RemoteDesktop_Port + { + get; + set { - get => _remoteDesktop_Port; - set - { - if (value == _remoteDesktop_Port) - return; + if (value == field) + return; - _remoteDesktop_Port = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_OverrideCredSspSupport; - public bool RemoteDesktop_OverrideCredSspSupport + public bool RemoteDesktop_OverrideViewOnly + { + get; + set { - get => _remoteDesktop_OverrideCredSspSupport; - set - { - if (value == _remoteDesktop_OverrideCredSspSupport) - return; + if (value == field) + return; - _remoteDesktop_OverrideCredSspSupport = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_EnableCredSspSupport; - public bool RemoteDesktop_EnableCredSspSupport + public bool RemoteDesktop_ViewOnly + { + get; + set { - get => _remoteDesktop_EnableCredSspSupport; - set - { - if (value == _remoteDesktop_EnableCredSspSupport) - return; + if (value == field) + return; - _remoteDesktop_EnableCredSspSupport = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_OverrideAuthenticationLevel; - public bool RemoteDesktop_OverrideAuthenticationLevel + public bool RemoteDesktop_OverrideCredSspSupport + { + get; + set { - get => _remoteDesktop_OverrideAuthenticationLevel; - set - { - if (value == _remoteDesktop_OverrideAuthenticationLevel) - return; + if (value == field) + return; - _remoteDesktop_OverrideAuthenticationLevel = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private uint _remoteDesktop_AuthenticationLevel; - public uint RemoteDesktop_AuthenticationLevel + public bool RemoteDesktop_EnableCredSspSupport + { + get; + set { - get => _remoteDesktop_AuthenticationLevel; - set - { - if (value == _remoteDesktop_AuthenticationLevel) - return; + if (value == field) + return; - _remoteDesktop_AuthenticationLevel = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_OverrideAudioRedirectionMode; - public bool RemoteDesktop_OverrideAudioRedirectionMode + public bool RemoteDesktop_OverrideAuthenticationLevel + { + get; + set { - get => _remoteDesktop_OverrideAudioRedirectionMode; - set - { - if (value == _remoteDesktop_OverrideAudioRedirectionMode) - return; + if (value == field) + return; - _remoteDesktop_OverrideAudioRedirectionMode = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - public IEnumerable RemoteDesktop_AudioRedirectionModes => Enum.GetValues(typeof(AudioRedirectionMode)).Cast(); - - private AudioRedirectionMode _remoteDesktop_AudioRedirectionMode; - public AudioRedirectionMode RemoteDesktop_AudioRedirectionMode + public uint RemoteDesktop_AuthenticationLevel + { + get; + set { - get => _remoteDesktop_AudioRedirectionMode; - set - { - if (Equals(value, _remoteDesktop_AudioRedirectionMode)) - return; + if (value == field) + return; - _remoteDesktop_AudioRedirectionMode = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - - private bool _remoteDesktop_OverrideAudioCaptureRedirectionMode; - public bool RemoteDesktop_OverrideAudioCaptureRedirectionMode + public bool RemoteDesktop_OverrideGatewayServer + { + get; + set { - get => _remoteDesktop_OverrideAudioCaptureRedirectionMode; - set - { - if (value == _remoteDesktop_OverrideAudioCaptureRedirectionMode) - return; + if (value == field) + return; - _remoteDesktop_OverrideAudioCaptureRedirectionMode = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - public IEnumerable RemoteDesktop_AudioCaptureRedirectionModes => Enum.GetValues(typeof(AudioCaptureRedirectionMode)).Cast(); - - private AudioCaptureRedirectionMode _remoteDesktop_AudioCaptureRedirectionMode; - public AudioCaptureRedirectionMode RemoteDesktop_AudioCaptureRedirectionMode + public bool RemoteDesktop_EnableGatewayServer + { + get; + set { - get => _remoteDesktop_AudioCaptureRedirectionMode; - set - { - if (Equals(value, _remoteDesktop_AudioCaptureRedirectionMode)) - return; + if (value == field) + return; - _remoteDesktop_AudioCaptureRedirectionMode = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - - private bool _remoteDesktop_OverrideApplyWindowsKeyCombinations; - public bool RemoteDesktop_OverrideApplyWindowsKeyCombinations + public string RemoteDesktop_GatewayServerHostname + { + get; + set { - get => _remoteDesktop_OverrideApplyWindowsKeyCombinations; - set - { - if (value == _remoteDesktop_OverrideApplyWindowsKeyCombinations) - return; + if (value == field) + return; - _remoteDesktop_OverrideApplyWindowsKeyCombinations = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - public IEnumerable RemoteDesktop_KeyboardHookModes => System.Enum.GetValues(typeof(KeyboardHookMode)).Cast(); - - private KeyboardHookMode _remoteDesktop_KeyboardHookMode; - public KeyboardHookMode RemoteDesktop_KeyboardHookMode + public bool RemoteDesktop_GatewayServerBypassLocalAddresses + { + get; + set { - get => _remoteDesktop_KeyboardHookMode; - set - { - if (Equals(value, _remoteDesktop_KeyboardHookMode)) - return; + if (value == field) + return; - _remoteDesktop_KeyboardHookMode = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + + public IEnumerable RemoteDesktop_GatewayServerLogonMethods => + Enum.GetValues(typeof(GatewayUserSelectedCredsSource)).Cast(); - private bool _remoteDesktop_OverrideRedirectClipboard; - public bool RemoteDesktop_OverrideRedirectClipboard + public GatewayUserSelectedCredsSource RemoteDesktop_GatewayServerLogonMethod + { + get; + set { - get => _remoteDesktop_OverrideRedirectClipboard; - set - { - if (value == _remoteDesktop_OverrideRedirectClipboard) - return; + if (Equals(value, field)) + return; - _remoteDesktop_OverrideRedirectClipboard = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_RedirectClipboard; - public bool RemoteDesktop_RedirectClipboard + public bool RemoteDesktop_GatewayServerShareCredentialsWithRemoteComputer + { + get; + set { - get => _remoteDesktop_RedirectClipboard; - set - { - if (value == _remoteDesktop_RedirectClipboard) - return; + if (value == field) + return; - _remoteDesktop_RedirectClipboard = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_OverrideRedirectDevices; - public bool RemoteDesktop_OverrideRedirectDevices + public bool RemoteDesktop_UseGatewayServerCredentials + { + get; + set { - get => _remoteDesktop_OverrideRedirectDevices; - set - { - if (value == _remoteDesktop_OverrideRedirectDevices) - return; + if (value == field) + return; - _remoteDesktop_OverrideRedirectDevices = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_RedirectDevices; - public bool RemoteDesktop_RedirectDevices + public string RemoteDesktop_GatewayServerUsername + { + get; + set { - get => _remoteDesktop_RedirectDevices; - set - { - if (value == _remoteDesktop_RedirectDevices) - return; + if (value == field) + return; - _remoteDesktop_RedirectDevices = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_OverrideRedirectDrives; - public bool RemoteDesktop_OverrideRedirectDrives + public string RemoteDesktop_GatewayServerDomain + { + get; + set { - get => _remoteDesktop_OverrideRedirectDrives; - set - { - if (value == _remoteDesktop_OverrideRedirectDrives) - return; + if (value == field) + return; - _remoteDesktop_OverrideRedirectDrives = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_RedirectDrives; - public bool RemoteDesktop_RedirectDrives + public bool RemoteDesktop_IsGatewayServerPasswordEmpty + { + get; + set { - get => _remoteDesktop_RedirectDrives; - set - { - if (value == _remoteDesktop_RedirectDrives) - return; + if (value == field) + return; - _remoteDesktop_RedirectDrives = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = true; - private bool _remoteDesktop_OverrideRedirectPorts; - public bool RemoteDesktop_OverrideRedirectPorts + public SecureString RemoteDesktop_GatewayServerPassword + { + get; + set { - get => _remoteDesktop_OverrideRedirectPorts; - set - { - if (value == _remoteDesktop_OverrideRedirectPorts) - return; + if (value == field) + return; - _remoteDesktop_OverrideRedirectPorts = value; - OnPropertyChanged(); - } + // Validate the password string + RemoteDesktop_IsGatewayServerPasswordEmpty = + value == null || string.IsNullOrEmpty(SecureStringHelper.ConvertToString(value)); + + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_RedirectPorts; - public bool RemoteDesktop_RedirectPorts + public bool RemoteDesktop_OverrideAudioRedirectionMode + { + get; + set { - get => _remoteDesktop_RedirectPorts; - set - { - if (value == _remoteDesktop_RedirectPorts) - return; + if (value == field) + return; - _remoteDesktop_RedirectPorts = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_OverrideRedirectSmartcards; - public bool RemoteDesktop_OverrideRedirectSmartcards + public IEnumerable RemoteDesktop_AudioRedirectionModes => + Enum.GetValues(typeof(AudioRedirectionMode)).Cast(); + + public AudioRedirectionMode RemoteDesktop_AudioRedirectionMode + { + get; + set { - get => _remoteDesktop_OverrideRedirectSmartcards; - set - { - if (value == _remoteDesktop_OverrideRedirectSmartcards) - return; + if (Equals(value, field)) + return; - _remoteDesktop_OverrideRedirectSmartcards = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + - private bool _remoteDesktop_RedirectSmartCards; - public bool RemoteDesktop_RedirectSmartCards + public bool RemoteDesktop_OverrideAudioCaptureRedirectionMode + { + get; + set { - get => _remoteDesktop_RedirectSmartCards; - set - { - if (value == _remoteDesktop_RedirectSmartCards) - return; + if (value == field) + return; - _remoteDesktop_RedirectSmartCards = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_OverrideRedirectPrinters; - public bool RemoteDesktop_OverrideRedirectPrinters + public IEnumerable RemoteDesktop_AudioCaptureRedirectionModes => + Enum.GetValues(typeof(AudioCaptureRedirectionMode)).Cast(); + + public AudioCaptureRedirectionMode RemoteDesktop_AudioCaptureRedirectionMode + { + get; + set { - get => _remoteDesktop_OverrideRedirectPrinters; - set - { - if (value == _remoteDesktop_OverrideRedirectPrinters) - return; + if (Equals(value, field)) + return; - _remoteDesktop_OverrideRedirectPrinters = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + - private bool _remoteDesktop_RedirectPrinters; - public bool RemoteDesktop_RedirectPrinters + public bool RemoteDesktop_OverrideApplyWindowsKeyCombinations + { + get; + set { - get => _remoteDesktop_RedirectPrinters; - set - { - if (value == _remoteDesktop_RedirectPrinters) - return; + if (value == field) + return; - _remoteDesktop_RedirectPrinters = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_OverridePersistentBitmapCaching; - public bool RemoteDesktop_OverridePersistentBitmapCaching + public IEnumerable RemoteDesktop_KeyboardHookModes => + Enum.GetValues(typeof(KeyboardHookMode)).Cast(); + + public KeyboardHookMode RemoteDesktop_KeyboardHookMode + { + get; + set { - get => _remoteDesktop_OverridePersistentBitmapCaching; - set - { - if (value == _remoteDesktop_OverridePersistentBitmapCaching) - return; + if (Equals(value, field)) + return; - _remoteDesktop_OverridePersistentBitmapCaching = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_PersistentBitmapCaching; - public bool RemoteDesktop_PersistentBitmapCaching + public bool RemoteDesktop_OverrideRedirectClipboard + { + get; + set { - get => _remoteDesktop_PersistentBitmapCaching; - set - { - if (value == _remoteDesktop_PersistentBitmapCaching) - return; + if (value == field) + return; - _remoteDesktop_PersistentBitmapCaching = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_OverrideReconnectIfTheConnectionIsDropped; - public bool RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped + public bool RemoteDesktop_RedirectClipboard + { + get; + set { - get => _remoteDesktop_OverrideReconnectIfTheConnectionIsDropped; - set - { - if (value == _remoteDesktop_OverrideReconnectIfTheConnectionIsDropped) - return; + if (value == field) + return; - _remoteDesktop_OverrideReconnectIfTheConnectionIsDropped = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_ReconnectIfTheConnectionIsDropped; - public bool RemoteDesktop_ReconnectIfTheConnectionIsDropped + public bool RemoteDesktop_OverrideRedirectDevices + { + get; + set { - get => _remoteDesktop_ReconnectIfTheConnectionIsDropped; - set - { - if (value == _remoteDesktop_ReconnectIfTheConnectionIsDropped) - return; + if (value == field) + return; - _remoteDesktop_ReconnectIfTheConnectionIsDropped = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_OverrideNetworkConnectionType; - public bool RemoteDesktop_OverrideNetworkConnectionType + public bool RemoteDesktop_RedirectDevices + { + get; + set { - get => _remoteDesktop_OverrideNetworkConnectionType; - set - { - if (value == _remoteDesktop_OverrideNetworkConnectionType) - return; + if (value == field) + return; - _remoteDesktop_OverrideNetworkConnectionType = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - public IEnumerable RemoteDesktop_NetworkConnectionTypes => Enum.GetValues(typeof(NetworkConnectionType)).Cast(); - - private NetworkConnectionType _remoteDesktop_NetworkConnectionType; - public NetworkConnectionType RemoteDesktop_NetworkConnectionType + public bool RemoteDesktop_OverrideRedirectDrives + { + get; + set { - get => _remoteDesktop_NetworkConnectionType; - set - { - if (Equals(value, _remoteDesktop_NetworkConnectionType)) - return; + if (value == field) + return; - if (!_isLoading) - ChangeNetworkConnectionTypeSettings(value); - - _remoteDesktop_NetworkConnectionType = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_DesktopBackground; - public bool RemoteDesktop_DesktopBackground + public bool RemoteDesktop_RedirectDrives + { + get; + set { - get => _remoteDesktop_DesktopBackground; - set - { - if (value == _remoteDesktop_DesktopBackground) - return; + if (value == field) + return; - _remoteDesktop_DesktopBackground = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_FontSmoothing; - public bool RemoteDesktop_FontSmoothing + public bool RemoteDesktop_OverrideRedirectPorts + { + get; + set { - get => _remoteDesktop_FontSmoothing; - set - { - if (value == _remoteDesktop_FontSmoothing) - return; + if (value == field) + return; - _remoteDesktop_FontSmoothing = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_DesktopComposition; - public bool RemoteDesktop_DesktopComposition + public bool RemoteDesktop_RedirectPorts + { + get; + set { - get => _remoteDesktop_DesktopComposition; - set - { - if (value == _remoteDesktop_DesktopComposition) - return; + if (value == field) + return; - _remoteDesktop_DesktopComposition = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_ShowWindowContentsWhileDragging; - public bool RemoteDesktop_ShowWindowContentsWhileDragging + public bool RemoteDesktop_OverrideRedirectSmartcards + { + get; + set { - get => _remoteDesktop_ShowWindowContentsWhileDragging; - set - { - if (value == _remoteDesktop_ShowWindowContentsWhileDragging) - return; + if (value == field) + return; - _remoteDesktop_ShowWindowContentsWhileDragging = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_MenuAndWindowAnimation; - public bool RemoteDesktop_MenuAndWindowAnimation + public bool RemoteDesktop_RedirectSmartCards + { + get; + set { - get => _remoteDesktop_MenuAndWindowAnimation; - set - { - if (value == _remoteDesktop_MenuAndWindowAnimation) - return; + if (value == field) + return; - _remoteDesktop_MenuAndWindowAnimation = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _remoteDesktop_VisualStyles; - public bool RemoteDesktop_VisualStyles + public bool RemoteDesktop_OverrideRedirectPrinters + { + get; + set { - get => _remoteDesktop_VisualStyles; - set - { - if (value == _remoteDesktop_VisualStyles) - return; + if (value == field) + return; - _remoteDesktop_VisualStyles = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion + } - #region PowerShell - private bool _powerShell_Enabled; - public bool PowerShell_Enabled + public bool RemoteDesktop_RedirectPrinters + { + get; + set { - get => _powerShell_Enabled; - set - { - if (value == _powerShell_Enabled) - return; - - _powerShell_Enabled = value; + if (value == field) + return; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _powerShell_EnableRemoteConsole; - public bool PowerShell_EnableRemoteConsole + public bool RemoteDesktop_OverridePersistentBitmapCaching + { + get; + set { - get => _powerShell_EnableRemoteConsole; - set - { - if (value == _powerShell_EnableRemoteConsole) - return; + if (value == field) + return; - _powerShell_EnableRemoteConsole = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _powerShell_InheritHost; - public bool PowerShell_InheritHost + public bool RemoteDesktop_PersistentBitmapCaching + { + get; + set { - get => _powerShell_InheritHost; - set - { - if (value == _powerShell_InheritHost) - return; + if (value == field) + return; - _powerShell_InheritHost = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _powerShell_Host; - public string PowerShell_Host + public bool RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped + { + get; + set { - get => _powerShell_Host; - set - { - if (value == _powerShell_Host) - return; + if (value == field) + return; - _powerShell_Host = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _powerShell_OverrideAdditionalCommandLine; - public bool PowerShell_OverrideAdditionalCommandLine + public bool RemoteDesktop_ReconnectIfTheConnectionIsDropped + { + get; + set { - get => _powerShell_OverrideAdditionalCommandLine; - set - { - if (value == _powerShell_OverrideAdditionalCommandLine) - return; + if (value == field) + return; - _powerShell_OverrideAdditionalCommandLine = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _powerShell_AdditionalCommandLine; - public string PowerShell_AdditionalCommandLine + public bool RemoteDesktop_OverrideNetworkConnectionType + { + get; + set { - get => _powerShell_AdditionalCommandLine; - set - { - if (value == _powerShell_AdditionalCommandLine) - return; + if (value == field) + return; - _powerShell_AdditionalCommandLine = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private List _powerShell_ExecutionPolicies = new List(); - public List PowerShell_ExecutionPolicies + public IEnumerable RemoteDesktop_NetworkConnectionTypes => + Enum.GetValues(typeof(NetworkConnectionType)).Cast(); + + public NetworkConnectionType RemoteDesktop_NetworkConnectionType + { + get; + set { - get => _powerShell_ExecutionPolicies; - set - { - if (value == _powerShell_ExecutionPolicies) - return; + if (Equals(value, field)) + return; - _powerShell_ExecutionPolicies = value; - OnPropertyChanged(); - } + if (!_isLoading) + ChangeNetworkConnectionTypeSettings(value); + + field = value; + OnPropertyChanged(); } + } - private bool _powerShell_OverrideExecutionPolicy; - public bool PowerShell_OverrideExecutionPolicy + public bool RemoteDesktop_DesktopBackground + { + get; + set { - get => _powerShell_OverrideExecutionPolicy; - set - { - if (value == _powerShell_OverrideExecutionPolicy) - return; + if (value == field) + return; - _powerShell_OverrideExecutionPolicy = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private PowerShell.ExecutionPolicy _powerShell_ExecutionPolicy; - public PowerShell.ExecutionPolicy PowerShell_ExecutionPolicy + public bool RemoteDesktop_FontSmoothing + { + get; + set { - get => _powerShell_ExecutionPolicy; - set - { - if (value == _powerShell_ExecutionPolicy) - return; + if (value == field) + return; - _powerShell_ExecutionPolicy = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion + } - #region PuTTY - private bool _puTTY_Enabled; - public bool PuTTY_Enabled + public bool RemoteDesktop_DesktopComposition + { + get; + set { - get => _puTTY_Enabled; - set - { - if (value == _puTTY_Enabled) - return; + if (value == field) + return; - _puTTY_Enabled = value; - - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _puTTY_InheritHost; - public bool PuTTY_InheritHost + public bool RemoteDesktop_ShowWindowContentsWhileDragging + { + get; + set { - get => _puTTY_InheritHost; - set - { - if (value == _puTTY_InheritHost) - return; + if (value == field) + return; - _puTTY_InheritHost = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _puTTY_UseSSH; // Default is SSH - public bool PuTTY_UseSSH + public bool RemoteDesktop_MenuAndWindowAnimation + { + get; + set { - get => _puTTY_UseSSH; - set - { - if (value == _puTTY_UseSSH) - return; - - if (value) - { - if (PuTTY_ConnectionMode == ConnectionMode.Serial) - PuTTY_HostOrSerialLine = Host; + if (value == field) + return; - PuTTY_PortOrBaud = SettingsManager.Current.PuTTY_SSHPort; - PuTTY_ConnectionMode = ConnectionMode.SSH; - } - - _puTTY_UseSSH = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _puTTY_UseTelnet; - public bool PuTTY_UseTelnet + public bool RemoteDesktop_VisualStyles + { + get; + set { - get => _puTTY_UseTelnet; - set - { - if (value == _puTTY_UseTelnet) - return; + if (value == field) + return; - if (value) - { - if (PuTTY_ConnectionMode == ConnectionMode.Serial) - PuTTY_HostOrSerialLine = Host; + field = value; + OnPropertyChanged(); + } + } - PuTTY_PortOrBaud = SettingsManager.Current.PuTTY_TelnetPort; - PuTTY_ConnectionMode = ConnectionMode.Telnet; - } + #endregion - _puTTY_UseTelnet = value; - OnPropertyChanged(); - } - } + #region PowerShell - private bool _puTTY_UseSerial; - public bool PuTTY_UseSerial + public bool PowerShell_Enabled + { + get; + set { - get => _puTTY_UseSerial; - set - { - if (value == _puTTY_UseSerial) - return; - - if (value) - { - if (PuTTY_ConnectionMode != ConnectionMode.Serial) - PuTTY_HostOrSerialLine = SettingsManager.Current.PuTTY_SerialLine; + if (value == field) + return; - PuTTY_PortOrBaud = SettingsManager.Current.PuTTY_BaudRate; - PuTTY_ConnectionMode = ConnectionMode.Serial; - } + field = value; - _puTTY_UseSerial = value; - OnPropertyChanged(); - } + OnPropertyChanged(); } + } - private bool _puTTY_UseRlogin; - public bool PuTTY_UseRlogin + public bool PowerShell_EnableRemoteConsole + { + get; + set { - get => _puTTY_UseRlogin; - set - { - if (value == _puTTY_UseRlogin) - return; - - if (value) - { - if (PuTTY_ConnectionMode == ConnectionMode.Serial) - PuTTY_HostOrSerialLine = Host; - - PuTTY_PortOrBaud = SettingsManager.Current.PuTTY_RloginPort; - PuTTY_ConnectionMode = ConnectionMode.Rlogin; - } + if (value == field) + return; - _puTTY_UseRlogin = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _puTTY_UseRAW; - public bool PuTTY_UseRAW + public bool PowerShell_InheritHost + { + get; + set { - get => _puTTY_UseRAW; - set - { - if (value == _puTTY_UseRAW) - return; + if (value == field) + return; - if (value) - { - if (PuTTY_ConnectionMode == ConnectionMode.Serial) - PuTTY_HostOrSerialLine = Host; - - PuTTY_PortOrBaud = 0; - PuTTY_ConnectionMode = ConnectionMode.RAW; - } - - _puTTY_UseRAW = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _puTTY_HostOrSerialLine; - public string PuTTY_HostOrSerialLine + public string PowerShell_Host + { + get; + set { - get => _puTTY_HostOrSerialLine; - set - { - if (value == _puTTY_HostOrSerialLine) - return; + if (value == field) + return; - _puTTY_HostOrSerialLine = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _puTTY_OverridePortOrBaud; - public bool PuTTY_OverridePortOrBaud + public bool PowerShell_OverrideCommand + { + get; + set { - get => _puTTY_OverridePortOrBaud; - set - { - if (value == _puTTY_OverridePortOrBaud) - return; + if (value == field) + return; - _puTTY_OverridePortOrBaud = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private int _puTTY_PortOrBaud; - public int PuTTY_PortOrBaud + public string PowerShell_Command + { + get; + set { - get => _puTTY_PortOrBaud; - set - { - if (value == _puTTY_PortOrBaud) - return; + if (value == field) + return; - _puTTY_PortOrBaud = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _puTTY_OverrideUsername; - public bool PuTTY_OverrideUsername + public bool PowerShell_OverrideAdditionalCommandLine + { + get; + set { - get => _puTTY_OverrideUsername; - set - { - if (value == _puTTY_OverrideUsername) - return; + if (value == field) + return; - _puTTY_OverrideUsername = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _puTTY__Username; - public string PuTTY_Username + public string PowerShell_AdditionalCommandLine + { + get; + set { - get => _puTTY__Username; - set - { - if (value == _puTTY__Username) - return; + if (value == field) + return; - _puTTY__Username = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _puTTY_OverridePrivateKeyFile; - public bool PuTTY_OverridePrivateKeyFile + public List PowerShell_ExecutionPolicies + { + get; + private init { - get => _puTTY_OverridePrivateKeyFile; - set - { - if (value == _puTTY_OverridePrivateKeyFile) - return; + if (value == field) + return; - _puTTY_OverridePrivateKeyFile = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = new(); - private string _puTTY__PrivateKeyFile; - public string PuTTY_PrivateKeyFile + public bool PowerShell_OverrideExecutionPolicy + { + get; + set { - get => _puTTY__PrivateKeyFile; - set - { - if (value == _puTTY__PrivateKeyFile) - return; + if (value == field) + return; - _puTTY__PrivateKeyFile = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _puTTY_OverrideProfile; - public bool PuTTY_OverrideProfile + public ExecutionPolicy PowerShell_ExecutionPolicy + { + get; + set { - get => _puTTY_OverrideProfile; - set - { - if (value == _puTTY_OverrideProfile) - return; + if (value == field) + return; - _puTTY_OverrideProfile = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _puTTY_Profile; - public string PuTTY_Profile + #endregion + + #region PuTTY + + public bool PuTTY_Enabled + { + get; + set { - get => _puTTY_Profile; - set - { - if (value == _puTTY_Profile) - return; + if (value == field) + return; - _puTTY_Profile = value; - OnPropertyChanged(); - } + field = value; + + OnPropertyChanged(); } + } - private bool _puTTY_OverrideEnableLog; - public bool PuTTY_OverrideEnableLog + public bool PuTTY_InheritHost + { + get; + set { - get => _puTTY_OverrideEnableLog; - set - { - if (value == _puTTY_OverrideEnableLog) - return; + if (value == field) + return; - _puTTY_OverrideEnableLog = value; - OnPropertyChanged(); + field = value; + OnPropertyChanged(); + } + } + + public bool PuTTY_UseSSH + { + get; + set + { + if (value == field) + return; + + if (value) + { + PuTTY_Port = SettingsManager.Current.PuTTY_SSHPort; + PuTTY_ConnectionMode = ConnectionMode.SSH; } + + field = value; + OnPropertyChanged(); } + } - private bool _puTTY_EnableLog; - public bool PuTTY_EnableLog + public bool PuTTY_UseTelnet + { + get; + set { - get => _puTTY_EnableLog; - set + if (value == field) + return; + + if (value) { - if (value == _puTTY_EnableLog) - return; + PuTTY_Port = SettingsManager.Current.PuTTY_TelnetPort; + PuTTY_ConnectionMode = ConnectionMode.Telnet; + } - _puTTY_EnableLog = value; - OnPropertyChanged(); + field = value; + OnPropertyChanged(); + } + } + + public bool PuTTY_UseSerial + { + get; + set + { + if (value == field) + return; + + if (value) + { + PuTTY_Baud = SettingsManager.Current.PuTTY_BaudRate; + PuTTY_ConnectionMode = ConnectionMode.Serial; } + + field = value; + OnPropertyChanged(); } + } - private bool _puTTY_OverrideLogMode; - public bool PuTTY_OverrideLogMode + public bool PuTTY_UseRlogin + { + get; + set { - get => _puTTY_OverrideLogMode; - set + if (value == field) + return; + + if (value) { - if (value == _puTTY_OverrideLogMode) - return; + PuTTY_Port = SettingsManager.Current.PuTTY_RloginPort; + PuTTY_ConnectionMode = ConnectionMode.Rlogin; + } - _puTTY_OverrideLogMode = value; - OnPropertyChanged(); + field = value; + OnPropertyChanged(); + } + } + + public bool PuTTY_UseRAW + { + get; + set + { + if (value == field) + return; + + if (value) + { + PuTTY_Port = SettingsManager.Current.PuTTY_RawPort; + PuTTY_ConnectionMode = ConnectionMode.RAW; } + + field = value; + OnPropertyChanged(); } + } + + public string PuTTY_Host + { + get; + set + { + if (value == field) + return; - public IEnumerable PuTTY_LogModes => Enum.GetValues(typeof(LogMode)).Cast(); + field = value; + OnPropertyChanged(); + } + } - private LogMode _puTTY_LogMode; - public LogMode PuTTY_LogMode + public string PuTTY_SerialLine + { + get; + set { - get => _puTTY_LogMode; - set - { - if (Equals(value, _puTTY_LogMode)) - return; + if (value == field) + return; - _puTTY_LogMode = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _puTTY_OverrideLogPath; - public bool PuTTY_OverrideLogPath + public bool PuTTY_OverridePortOrBaud + { + get; + set { - get => _puTTY_OverrideLogPath; - set - { - if (value == _puTTY_OverrideLogPath) - return; + if (value == field) + return; - _puTTY_OverrideLogPath = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _puTTY_LogPath; - public string PuTTY_LogPath + public int PuTTY_Port + { + get; + set { - get => _puTTY_LogPath; - set - { - if (value == _puTTY_LogPath) - return; + if (value == field) + return; - _puTTY_LogPath = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _puTTY_OverrideLogFileName; - public bool PuTTY_OverrideLogFileName + public int PuTTY_Baud + { + get; + set { - get => _puTTY_OverrideLogFileName; - set - { - if (value == _puTTY_OverrideLogFileName) - return; + if (value == field) + return; - _puTTY_OverrideLogFileName = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _puTTY_LogFileName; - public string PuTTY_LogFileName + public bool PuTTY_OverrideUsername + { + get; + set { - get => _puTTY_LogFileName; - set - { - if (value == _puTTY_LogFileName) - return; + if (value == field) + return; - _puTTY_LogFileName = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _puTTY_OverrideAdditionalCommandLine; - public bool PuTTY_OverrideAdditionalCommandLine + public string PuTTY_Username + { + get; + set { - get => _puTTY_OverrideAdditionalCommandLine; - set - { - if (value == _puTTY_OverrideAdditionalCommandLine) - return; + if (value == field) + return; - _puTTY_OverrideAdditionalCommandLine = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _puTTY_AdditionalCommandLine; - public string PuTTY_AdditionalCommandLine + public bool PuTTY_OverridePrivateKeyFile + { + get; + set { - get => _puTTY_AdditionalCommandLine; - set - { - if (value == _puTTY_AdditionalCommandLine) - return; + if (value == field) + return; - _puTTY_AdditionalCommandLine = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private ConnectionMode _puTTY_ConnectionMode; - public ConnectionMode PuTTY_ConnectionMode + public string PuTTY_PrivateKeyFile + { + get; + set { - get => _puTTY_ConnectionMode; - set - { - if (value == _puTTY_ConnectionMode) - return; + if (value == field) + return; - _puTTY_ConnectionMode = value; - } + field = value; + OnPropertyChanged(); } - #endregion + } - #region TigerVNC - private bool _tigerVNC_Enabled; - public bool TigerVNC_Enabled + public bool PuTTY_OverrideProfile + { + get; + set { - get => _tigerVNC_Enabled; - set - { - if (value == _tigerVNC_Enabled) - return; + if (value == field) + return; - _tigerVNC_Enabled = value; + field = value; + OnPropertyChanged(); + } + } - OnPropertyChanged(); - } + public string PuTTY_Profile + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - private bool _tigerVNC_InheritHost; - public bool TigerVNC_InheritHost + public bool PuTTY_OverrideHostkey + { + get; + set { - get => _tigerVNC_InheritHost; - set - { - if (value == _tigerVNC_InheritHost) - return; + if (value == field) + return; - _tigerVNC_InheritHost = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); + } + } + + public string PuTTY_Hostkey + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - private string _tigerVNC_Host; - public string TigerVNC_Host + public bool PuTTY_OverrideEnableLog + { + get; + set { - get => _tigerVNC_Host; - set - { - if (value == _tigerVNC_Host) - return; + if (value == field) + return; - _tigerVNC_Host = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + + public bool PuTTY_EnableLog + { + get; + set + { + if (value == field) + return; + field = value; + OnPropertyChanged(); + } + } - private bool _tigerVNC_OverridePort; - public bool TigerVNC_OverridePort + public bool PuTTY_OverrideLogMode + { + get; + set { - get => _tigerVNC_OverridePort; - set - { - if (value == _tigerVNC_OverridePort) - return; + if (value == field) + return; - _tigerVNC_OverridePort = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private int _tigerVNC_Port; - public int TigerVNC_Port + public IEnumerable PuTTY_LogModes => Enum.GetValues(typeof(LogMode)).Cast(); + + public LogMode PuTTY_LogMode + { + get; + set { - get => _tigerVNC_Port; - set - { - if (value == _tigerVNC_Port) - return; + if (Equals(value, field)) + return; - _tigerVNC_Port = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion + } - #region Web Console - private bool _webConsole_Enabled; - public bool WebConsole_Enabled + public bool PuTTY_OverrideLogPath + { + get; + set { - get => _webConsole_Enabled; - set - { - if (value == _webConsole_Enabled) - return; + if (value == field) + return; - _webConsole_Enabled = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _webConsole_Url; - public string WebConsole_Url + public string PuTTY_LogPath + { + get; + set { - get => _webConsole_Url; - set - { - if (value == _webConsole_Url) - return; + if (value == field) + return; - _webConsole_Url = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion + } - #region Wake on LAN - private bool _wakeOnLAN_Enabled; - public bool WakeOnLAN_Enabled + public bool PuTTY_OverrideLogFileName + { + get; + set { - get => _wakeOnLAN_Enabled; - set - { - if (value == _wakeOnLAN_Enabled) - return; + if (value == field) + return; - _wakeOnLAN_Enabled = value; + field = value; + OnPropertyChanged(); + } + } - OnPropertyChanged(); - } + public string PuTTY_LogFileName + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - private string _wakeOnLAN_MACAddress; - public string WakeOnLAN_MACAddress + public bool PuTTY_OverrideAdditionalCommandLine + { + get; + set { - get => _wakeOnLAN_MACAddress; - set - { - if (value == _wakeOnLAN_MACAddress) - return; + if (value == field) + return; - _wakeOnLAN_MACAddress = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _wakeOnLAN_Broadcast; - public string WakeOnLAN_Broadcast + public string PuTTY_AdditionalCommandLine + { + get; + set { - get => _wakeOnLAN_Broadcast; - set - { - if (value == _wakeOnLAN_Broadcast) - return; + if (value == field) + return; - _wakeOnLAN_Broadcast = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); + } + } + + public ConnectionMode PuTTY_ConnectionMode + { + get; + private set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - private bool _wakeOnLAN_OverridePort; - public bool WakeOnLAN_OverridePort + #endregion + + #region TigerVNC + + public bool TigerVNC_Enabled + { + get; + set { - get => _wakeOnLAN_OverridePort; - set - { - if (value == _wakeOnLAN_OverridePort) - return; + if (value == field) + return; - _wakeOnLAN_OverridePort = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private int _wakeOnLAN_Port; - public int WakeOnLAN_Port + public bool TigerVNC_InheritHost + { + get; + set { - get => _wakeOnLAN_Port; - set - { - if (value == _wakeOnLAN_Port) - return; + if (value == field) + return; - _wakeOnLAN_Port = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion + } - #region Whois - private bool _whois_Enabled; - public bool Whois_Enabled + public string TigerVNC_Host + { + get; + set { - get => _whois_Enabled; - set - { - if (value == _whois_Enabled) - return; + if (value == field) + return; - _whois_Enabled = value; + field = value; + OnPropertyChanged(); + } + } - OnPropertyChanged(); - } + + public bool TigerVNC_OverridePort + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - private bool _whois_InheritHost; - public bool Whois_InheritHost + public int TigerVNC_Port + { + get; + set { - get => _whois_InheritHost; - set - { - if (value == _whois_InheritHost) - return; + if (value == field) + return; - _whois_InheritHost = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _whois_Domain; - public string Whois_Domain + #endregion + + #region Web Console + + public bool WebConsole_Enabled + { + get; + set { - get => _whois_Domain; - set - { - if (value == _whois_Domain) - return; + if (value == field) + return; - _whois_Domain = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion - #endregion - - public ProfileViewModel(Action saveCommand, Action cancelHandler, IReadOnlyCollection groups, string group = null, ProfileEditMode editMode = ProfileEditMode.Add, ProfileInfo profile = null) - { - // Load the view - ProfileViews = new CollectionViewSource { Source = ProfileViewManager.List }.View; - ProfileViews.SortDescriptions.Add(new SortDescription(nameof(ProfileViewInfo.Name), ListSortDirection.Ascending)); - - SaveCommand = new RelayCommand(p => saveCommand(this)); - CancelCommand = new RelayCommand(p => cancelHandler(this)); - - var profileInfo = profile ?? new ProfileInfo(); - - Name = profileInfo.Name; - - if (editMode == ProfileEditMode.Copy) - Name += " - " + Localization.Resources.Strings.CopyNoun; - - Host = profileInfo.Host; - - // Try to get group (name) as parameter, then from profile, then the first in the list of groups, then the default group - Group = group ?? (string.IsNullOrEmpty(profileInfo.Group) ? (groups.Count > 0 ? groups.OrderBy(x => x).First() : Localization.Resources.Strings.Default) : profileInfo.Group); - - Tags = profileInfo.Tags; - - Groups = CollectionViewSource.GetDefaultView(groups); - Groups.SortDescriptions.Add(new SortDescription()); - - // Network Interface - NetworkInterface_Enabled = profileInfo.NetworkInterface_Enabled; - NetworkInterface_EnableDynamicIPAddress = !profileInfo.NetworkInterface_EnableStaticIPAddress; - NetworkInterface_EnableStaticIPAddress = profileInfo.NetworkInterface_EnableStaticIPAddress; - NetworkInterface_IPAddress = profileInfo.NetworkInterface_IPAddress; - NetworkInterface_Gateway = profileInfo.NetworkInterface_Gateway; - NetworkInterface_SubnetmaskOrCidr = profileInfo.NetworkInterface_SubnetmaskOrCidr; - NetworkInterface_EnableDynamicDNS = !profileInfo.NetworkInterface_EnableStaticDNS; - NetworkInterface_EnableStaticDNS = profileInfo.NetworkInterface_EnableStaticDNS; - NetworkInterface_PrimaryDNSServer = profileInfo.NetworkInterface_PrimaryDNSServer; - NetworkInterface_SecondaryDNSServer = profileInfo.NetworkInterface_SecondaryDNSServer; - - // IP Scanner - IPScanner_Enabled = profileInfo.IPScanner_Enabled; - IPScanner_InheritHost = profileInfo.IPScanner_InheritHost; - IPScanner_HostOrIPRange = profileInfo.IPScanner_HostOrIPRange; - - // Port Scanner - PortScanner_Enabled = profileInfo.PortScanner_Enabled; - PortScanner_InheritHost = profileInfo.PortScanner_InheritHost; - PortScanner_Host = profileInfo.PortScanner_Host; - PortScanner_Ports = profileInfo.PortScanner_Ports; - - // Ping Monitor - PingMonitor_Enabled = profileInfo.PingMonitor_Enabled; - PingMonitor_InheritHost = profileInfo.PingMonitor_InheritHost; - PingMonitor_Host = profileInfo.PingMonitor_Host; - - // Traceroute - Traceroute_Enabled = profileInfo.Traceroute_Enabled; - Traceroute_InheritHost = profileInfo.Traceroute_InheritHost; - Traceroute_Host = profileInfo.Traceroute_Host; - - // DNS Lookup - DNSLookup_Enabled = profileInfo.DNSLookup_Enabled; - DNSLookup_InheritHost = profileInfo.DNSLookup_InheritHost; - DNSLookup_Host = profileInfo.DNSLookup_Host; - - // Remote Desktop - RemoteDesktop_Enabled = profileInfo.RemoteDesktop_Enabled; - RemoteDesktop_InheritHost = profileInfo.RemoteDesktop_InheritHost; - RemoteDesktop_Host = profileInfo.RemoteDesktop_Host; - RemoteDesktop_UseCredentials = profileInfo.RemoteDesktop_UseCredentials; - RemoteDesktop_Username = profileInfo.RemoteDesktop_Username; - RemoteDesktop_Password = profileInfo.RemoteDesktop_Password; - RemoteDesktop_OverrideDisplay = profileInfo.RemoteDesktop_OverrideDisplay; - RemoteDesktop_AdjustScreenAutomatically = profileInfo.RemoteDesktop_AdjustScreenAutomatically; - RemoteDesktop_UseCurrentViewSize = profileInfo.RemoteDesktop_UseCurrentViewSize; - RemoteDesktop_UseFixedScreenSize = profileInfo.RemoteDesktop_UseFixedScreenSize; - RemoteDesktop_SelectedScreenResolution = RemoteDesktop_ScreenResolutions.FirstOrDefault(x => x == $"{profileInfo.RemoteDesktop_ScreenWidth}x{profileInfo.RemoteDesktop_ScreenHeight}"); - RemoteDesktop_UseCustomScreenSize = profileInfo.RemoteDesktop_UseCustomScreenSize; - RemoteDesktop_CustomScreenWidth = profileInfo.RemoteDesktop_CustomScreenWidth.ToString(); - RemoteDesktop_CustomScreenHeight = profileInfo.RemoteDesktop_CustomScreenHeight.ToString(); - RemoteDesktop_OverrideColorDepth = profileInfo.RemoteDesktop_OverrideColorDepth; - RemoteDesktop_SelectedColorDepth = RemoteDesktop_ColorDepths.FirstOrDefault(x => x == profileInfo.RemoteDesktop_ColorDepth); - RemoteDesktop_OverridePort = profileInfo.RemoteDesktop_OverridePort; - RemoteDesktop_Port = profileInfo.RemoteDesktop_Port; - RemoteDesktop_OverrideCredSspSupport = profileInfo.RemoteDesktop_OverrideCredSspSupport; - RemoteDesktop_EnableCredSspSupport = profileInfo.RemoteDesktop_EnableCredSspSupport; - RemoteDesktop_OverrideAuthenticationLevel = profileInfo.RemoteDesktop_OverrideAuthenticationLevel; - RemoteDesktop_AuthenticationLevel = profileInfo.RemoteDesktop_AuthenticationLevel; - RemoteDesktop_OverrideAudioRedirectionMode = profileInfo.RemoteDesktop_OverrideAudioRedirectionMode; - RemoteDesktop_AudioRedirectionMode = RemoteDesktop_AudioRedirectionModes.FirstOrDefault(x => x == profileInfo.RemoteDesktop_AudioRedirectionMode); - RemoteDesktop_OverrideAudioCaptureRedirectionMode = profileInfo.RemoteDesktop_OverrideAudioCaptureRedirectionMode; - RemoteDesktop_AudioCaptureRedirectionMode = RemoteDesktop_AudioCaptureRedirectionModes.FirstOrDefault(x => x == profileInfo.RemoteDesktop_AudioCaptureRedirectionMode); - RemoteDesktop_OverrideApplyWindowsKeyCombinations = profileInfo.RemoteDesktop_OverrideApplyWindowsKeyCombinations; - RemoteDesktop_KeyboardHookMode = RemoteDesktop_KeyboardHookModes.FirstOrDefault(x => x == profileInfo.RemoteDesktop_KeyboardHookMode); - RemoteDesktop_OverrideRedirectClipboard = profileInfo.RemoteDesktop_OverrideRedirectClipboard; - RemoteDesktop_RedirectClipboard = profileInfo.RemoteDesktop_RedirectClipboard; - RemoteDesktop_OverrideRedirectDevices = profileInfo.RemoteDesktop_OverrideRedirectDevices; - RemoteDesktop_RedirectDevices = profileInfo.RemoteDesktop_RedirectDevices; - RemoteDesktop_OverrideRedirectDrives = profileInfo.RemoteDesktop_OverrideRedirectDrives; - RemoteDesktop_RedirectDrives = profileInfo.RemoteDesktop_RedirectDrives; - RemoteDesktop_OverrideRedirectPorts = profileInfo.RemoteDesktop_OverrideRedirectPorts; - RemoteDesktop_RedirectPorts = profileInfo.RemoteDesktop_RedirectPorts; - RemoteDesktop_OverrideRedirectSmartcards = profileInfo.RemoteDesktop_OverrideRedirectSmartcards; - RemoteDesktop_RedirectSmartCards = profileInfo.RemoteDesktop_RedirectSmartCards; - RemoteDesktop_OverrideRedirectPrinters = profileInfo.RemoteDesktop_OverrideRedirectPrinters; - RemoteDesktop_RedirectPrinters = profileInfo.RemoteDesktop_RedirectPrinters; - RemoteDesktop_OverridePersistentBitmapCaching = profileInfo.RemoteDesktop_OverridePersistentBitmapCaching; - RemoteDesktop_PersistentBitmapCaching = profileInfo.RemoteDesktop_PersistentBitmapCaching; - RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped = profileInfo.RemoteDesktop_OverrideReconnectIfTheConnectionIsDropped; - RemoteDesktop_ReconnectIfTheConnectionIsDropped = profileInfo.RemoteDesktop_ReconnectIfTheConnectionIsDropped; - RemoteDesktop_NetworkConnectionType = RemoteDesktop_NetworkConnectionTypes.FirstOrDefault(x => x == profileInfo.RemoteDesktop_NetworkConnectionType); - RemoteDesktop_DesktopBackground = profileInfo.RemoteDesktop_DesktopBackground; - RemoteDesktop_FontSmoothing = profileInfo.RemoteDesktop_FontSmoothing; - RemoteDesktop_DesktopComposition = profileInfo.RemoteDesktop_DesktopComposition; - RemoteDesktop_ShowWindowContentsWhileDragging = profileInfo.RemoteDesktop_ShowWindowContentsWhileDragging; - RemoteDesktop_MenuAndWindowAnimation = profileInfo.RemoteDesktop_MenuAndWindowAnimation; - RemoteDesktop_VisualStyles = profileInfo.RemoteDesktop_VisualStyles; - - // PowerShell - PowerShell_Enabled = profileInfo.PowerShell_Enabled; - PowerShell_EnableRemoteConsole = profileInfo.PowerShell_EnableRemoteConsole; - PowerShell_InheritHost = profileInfo.PowerShell_InheritHost; - PowerShell_Host = profileInfo.PowerShell_Host; - PowerShell_OverrideAdditionalCommandLine = profileInfo.PowerShell_OverrideAdditionalCommandLine; - PowerShell_AdditionalCommandLine = profileInfo.PowerShell_AdditionalCommandLine; - PowerShell_ExecutionPolicies = Enum.GetValues(typeof(PowerShell.ExecutionPolicy)).Cast().ToList(); - PowerShell_OverrideExecutionPolicy = profileInfo.PowerShell_OverrideExecutionPolicy; - PowerShell_ExecutionPolicy = editMode != ProfileEditMode.Add ? profileInfo.PowerShell_ExecutionPolicy : PowerShell_ExecutionPolicies.FirstOrDefault(x => x == SettingsManager.Current.PowerShell_ExecutionPolicy); ; - - // PuTTY - PuTTY_Enabled = profileInfo.PuTTY_Enabled; - - switch (profileInfo.PuTTY_ConnectionMode) - { - // SSH is default - case ConnectionMode.SSH: - PuTTY_UseSSH = true; - break; - case ConnectionMode.Telnet: - PuTTY_UseTelnet = true; - break; - case ConnectionMode.Serial: - PuTTY_UseSerial = true; - break; - case ConnectionMode.Rlogin: - PuTTY_UseRlogin = true; - break; - case ConnectionMode.RAW: - PuTTY_UseRAW = true; - break; - } + } - PuTTY_InheritHost = profileInfo.PuTTY_InheritHost; - PuTTY_HostOrSerialLine = profileInfo.PuTTY_HostOrSerialLine; - PuTTY_OverridePortOrBaud = profileInfo.PuTTY_OverridePortOrBaud; - PuTTY_PortOrBaud = profileInfo.PuTTY_OverridePortOrBaud ? profileInfo.PuTTY_PortOrBaud : Settings.Application.PuTTY.GetPortOrBaudByConnectionMode(PuTTY_ConnectionMode); - PuTTY_OverrideUsername = profileInfo.PuTTY_OverrideUsername; - PuTTY_Username = profileInfo.PuTTY_Username; - PuTTY_OverridePrivateKeyFile = profileInfo.PuTTY_OverridePrivateKeyFile; - PuTTY_PrivateKeyFile = profileInfo.PuTTY_PrivateKeyFile; - PuTTY_OverrideProfile = profileInfo.PuTTY_OverrideProfile; - PuTTY_Profile = profileInfo.PuTTY_Profile; - PuTTY_OverrideEnableLog = profileInfo.PuTTY_OverrideEnableLog; - PuTTY_EnableLog = profileInfo.PuTTY_EnableLog; - PuTTY_OverrideLogMode = profileInfo.PuTTY_OverrideLogMode; - PuTTY_LogMode = PuTTY_LogModes.FirstOrDefault(x => x == profileInfo.PuTTY_LogMode); - PuTTY_OverrideLogPath = profileInfo.PuTTY_OverrideLogPath; - PuTTY_LogPath = profileInfo.PuTTY_LogPath; - PuTTY_OverrideLogFileName = profileInfo.PuTTY_OverrideLogFileName; - PuTTY_LogFileName = profileInfo.PuTTY_LogFileName; - PuTTY_OverrideAdditionalCommandLine = profileInfo.PuTTY_OverrideAdditionalCommandLine; - PuTTY_AdditionalCommandLine = profileInfo.PuTTY_AdditionalCommandLine; - - // TigerVNC - TigerVNC_Enabled = profileInfo.TigerVNC_Enabled; - TigerVNC_InheritHost = profileInfo.TigerVNC_InheritHost; - TigerVNC_Host = profileInfo.TigerVNC_Host; - TigerVNC_OverridePort = profileInfo.TigerVNC_OverridePort; - TigerVNC_Port = profileInfo.TigerVNC_OverridePort ? profileInfo.TigerVNC_Port : SettingsManager.Current.TigerVNC_Port; - - // Web Console - WebConsole_Enabled = profileInfo.WebConsole_Enabled; - WebConsole_Url = profileInfo.WebConsole_Url; - - // Wake on LAN - WakeOnLAN_Enabled = profileInfo.WakeOnLAN_Enabled; - WakeOnLAN_MACAddress = profileInfo.WakeOnLAN_MACAddress; - WakeOnLAN_Broadcast = profileInfo.WakeOnLAN_Broadcast; - WakeOnLAN_OverridePort = profileInfo.WakeOnLAN_OverridePort; - WakeOnLAN_Port = profileInfo.WakeOnLAN_OverridePort ? profileInfo.WakeOnLAN_Port : SettingsManager.Current.WakeOnLAN_Port; - - // Whois - Whois_Enabled = profileInfo.Whois_Enabled; - Whois_InheritHost = profileInfo.Whois_InheritHost; - Whois_Domain = profileInfo.Whois_Domain; - - _isLoading = false; - } - - #region ICommands & Actions - public ICommand SaveCommand { get; } - - public ICommand CancelCommand { get; } - - public ICommand ResolveHostCommand => new RelayCommand(async p => await ResolveHostActionAsync()); - - private async System.Threading.Tasks.Task ResolveHostActionAsync() - { - IsResolveHostnameRunning = true; - - try - { - foreach (var ipAddr in (await Dns.GetHostEntryAsync(Host)).AddressList) - { - if (ipAddr.AddressFamily != AddressFamily.InterNetwork) - continue; + public string WebConsole_Url + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } - Host = ipAddr.ToString(); - break; - } + #endregion - } - catch (SocketException) // DNS Error - { - ShowCouldNotResolveHostnameWarning = true; - } + #region SNMP + + public bool SNMP_Enabled + { + get; + set + { + if (value == field) + return; + + field = value; + + OnPropertyChanged(); + } + } - IsResolveHostnameRunning = false; + public bool SNMP_InheritHost + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - public ICommand RemoteDesktopPasswordChangedCommand => new RelayCommand(p => RemoteDesktopPasswordChangedAction()); + public string SNMP_Host + { + get; + set + { + if (value == field) + return; - #endregion + field = value; + OnPropertyChanged(); + } + } - #region Methods - private void RemoteDesktopPasswordChangedAction() + public bool SNMP_OverrideOIDAndMode + { + get; + set { - RemoteDesktop_PasswordChanged = true; + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - private void ChangeNetworkConnectionTypeSettings(NetworkConnectionType connectionSpeed) + public string SNMP_OID + { + get; + set { - switch (connectionSpeed) - { - case NetworkConnectionType.Modem: - RemoteDesktop_DesktopBackground = false; - RemoteDesktop_FontSmoothing = false; - RemoteDesktop_DesktopComposition = false; - RemoteDesktop_ShowWindowContentsWhileDragging = false; - RemoteDesktop_MenuAndWindowAnimation = false; - RemoteDesktop_VisualStyles = false; - break; - case NetworkConnectionType.BroadbandLow: - RemoteDesktop_DesktopBackground = false; - RemoteDesktop_FontSmoothing = false; - RemoteDesktop_DesktopComposition = false; - RemoteDesktop_ShowWindowContentsWhileDragging = false; - RemoteDesktop_MenuAndWindowAnimation = false; - RemoteDesktop_VisualStyles = true; - break; - case NetworkConnectionType.Satellite: - case NetworkConnectionType.BroadbandHigh: - RemoteDesktop_DesktopBackground = false; - RemoteDesktop_FontSmoothing = false; - RemoteDesktop_DesktopComposition = true; - RemoteDesktop_ShowWindowContentsWhileDragging = false; - RemoteDesktop_MenuAndWindowAnimation = false; - RemoteDesktop_VisualStyles = true; - break; - case NetworkConnectionType.WAN: - case NetworkConnectionType.LAN: - RemoteDesktop_DesktopBackground = true; - RemoteDesktop_FontSmoothing = true; - RemoteDesktop_DesktopComposition = true; - RemoteDesktop_ShowWindowContentsWhileDragging = true; - RemoteDesktop_MenuAndWindowAnimation = true; - RemoteDesktop_VisualStyles = true; - break; - } + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public IEnumerable SNMP_Modes { get; set; } + + public SNMPMode SNMP_Mode + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + + // Re-validate OID if mode changed + OnPropertyChanged(nameof(SNMP_OID)); + } + } + + public bool SNMP_OverrideVersionAndAuth + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public IEnumerable SNMP_Versions { get; } + + public SNMPVersion SNMP_Version + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public bool SNMP_IsCommunityEmpty + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = true; + + public SecureString SNMP_Community + { + get; + set + { + if (value == field) + return; + + // Validate the password string + SNMP_IsCommunityEmpty = value == null || string.IsNullOrEmpty(SecureStringHelper.ConvertToString(value)); + + field = value; + OnPropertyChanged(); + } + } + + public IEnumerable SNMP_Securities { get; } + + public SNMPV3Security SNMP_Security + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public string SNMP_Username + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public IEnumerable SNMP_AuthenticationProviders { get; } + + public SNMPV3AuthenticationProvider SNMP_AuthenticationProvider + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public bool SNMP_IsAuthEmpty + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = true; + + public SecureString SNMP_Auth + { + get; + set + { + if (value == field) + return; + + // Validate the password string + SNMP_IsAuthEmpty = value == null || string.IsNullOrEmpty(SecureStringHelper.ConvertToString(value)); + + field = value; + OnPropertyChanged(); + } + } + + public IEnumerable SNMP_PrivacyProviders { get; } + + public SNMPV3PrivacyProvider SNMP_PrivacyProvider + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public bool SNMP_IsPrivEmpty + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = true; + + public SecureString SNMP_Priv + { + get; + set + { + if (value == field) + return; + + // Validate the password string + SNMP_IsPrivEmpty = value == null || string.IsNullOrEmpty(SecureStringHelper.ConvertToString(value)); + + field = value; + OnPropertyChanged(); + } + } + + #endregion + + #region Wake on LAN + + public bool WakeOnLAN_Enabled + { + get; + set + { + if (value == field) + return; + + field = value; + + OnPropertyChanged(); + } + } + + public string WakeOnLAN_MACAddress + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public string WakeOnLAN_Broadcast + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + #endregion + + #region Whois + + public bool Whois_Enabled + { + get; + set + { + if (value == field) + return; + + field = value; + + OnPropertyChanged(); + } + } + + public bool Whois_InheritHost + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public string Whois_Domain + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + #endregion + + #region IP Geolocation + + public bool IPGeolocation_Enabled + { + get; + set + { + if (value == field) + return; + + field = value; + + OnPropertyChanged(); + } + } + + public bool IPGeolocation_InheritHost + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public string IPGeolocation_Host + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); } - #endregion } + + #endregion + + #endregion + + #region ICommands & Actions + + public ICommand SaveCommand { get; } + + public ICommand CancelCommand { get; } + + public ICommand ResolveHostCommand => new RelayCommand(async _ => await ResolveHostActionAsync()); + + private async Task ResolveHostActionAsync() + { + IsResolveHostnameRunning = true; + + await Task.Delay(GlobalStaticConfiguration.ApplicationUIDelayInterval); + + var dnsResult = + await DNSClientHelper.ResolveAorAaaaAsync(Host, SettingsManager.Current.Network_ResolveHostnamePreferIPv4); + + if (!dnsResult.HasError) + Host = dnsResult.Value.ToString(); + else + ShowCouldNotResolveHostnameWarning = true; + + IsResolveHostnameRunning = false; + } + + public ICommand AddTagCommand => new RelayCommand(_ => AddTagAction()); + + private void AddTagAction() + { + var tagsToAdd = Tag.Split(';', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); + + foreach (var tag in tagsToAdd) + TagsCollection.Add(tag); + + Tag = string.Empty; + } + + public ICommand RemoveTagCommand => new RelayCommand(RemoveTagAction); + + private void RemoveTagAction(object param) + { + if (param is not string tag) + return; + + TagsCollection.Remove(tag); + } + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/ProfilesViewModel.cs b/Source/NETworkManager/ViewModels/ProfilesViewModel.cs index 6de088d0ea..9bfd752aba 100644 --- a/Source/NETworkManager/ViewModels/ProfilesViewModel.cs +++ b/Source/NETworkManager/ViewModels/ProfilesViewModel.cs @@ -1,301 +1,454 @@ -using System.Windows.Input; -using System.ComponentModel; -using System.Windows.Data; -using MahApps.Metro.Controls.Dialogs; -using System; +using NETworkManager.Profiles; +using NETworkManager.Settings; using NETworkManager.Utilities; -using System.Linq; -using System.Collections.Generic; +using System; using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Linq; +using System.Windows; +using System.Windows.Data; +using System.Windows.Input; using System.Windows.Threading; -using NETworkManager.Profiles; -using NETworkManager.Settings; -using System.Diagnostics; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +public class ProfilesViewModel : ViewModelBase, IProfileManager { - public class ProfilesViewModel : ViewModelBase, IProfileManager + #region Constructor + + public ProfilesViewModel() { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - private readonly DispatcherTimer _searchDispatcherTimer = new DispatcherTimer(); + ProfileFilterTagsView = CollectionViewSource.GetDefaultView(ProfileFilterTags); + ProfileFilterTagsView.SortDescriptions.Add(new SortDescription(nameof(ProfileFilterTagsInfo.Name), + ListSortDirection.Ascending)); + + SetGroupsView(); + + ProfileManager.OnProfilesUpdated += ProfileManager_OnProfilesUpdated; + + _searchDispatcherTimer.Interval = GlobalStaticConfiguration.SearchDispatcherTimerTimeSpan; + _searchDispatcherTimer.Tick += SearchDispatcherTimer_Tick; + } + + #endregion + + #region Variables + + private readonly DispatcherTimer _searchDispatcherTimer = new(); + private bool _searchDisabled; + + private bool _isViewActive = true; - public ICollectionView _groups; - public ICollectionView Groups + public ICollectionView Groups + { + get; + private set { - get => _groups; - set - { - if (value == _groups) - return; + if (value == field) + return; - _groups = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + + private bool _disableProfileRefresh; + + private ProfileInfo _lastSelectedProfileOnRefresh; - private GroupInfo _selectedGroup = new GroupInfo(); - public GroupInfo SelectedGroup + public GroupInfo SelectedGroup + { + get; + set { - get => _selectedGroup; - set + if (value == field) + return; + + field = value; + + // Check for null, because a NullReferenceException can occur when a profile file is changed + // Temporarily disable profile refresh to avoid multiple refreshes and prevent the filter from being reset. + if (value != null && !_disableProfileRefresh) { - if (value == _selectedGroup) - return; + // Set/update tags based on current group + CreateTags(); - // NullReferenceException occurs if profile file is changed - if (value == null) - Profiles = null; - else - SetProfilesView(value.Name); + var filter = new ProfileFilterInfo + { + Search = Search, + Tags = [.. ProfileFilterTags.Where(x => x.IsSelected).Select(x => x.Name)], + TagsFilterMatch = ProfileFilterTagsMatchAny + ? ProfileFilterTagsMatch.Any + : ProfileFilterTagsMatch.All + }; - _selectedGroup = value; - OnPropertyChanged(); + SetProfilesView(filter, value, _lastSelectedProfileOnRefresh); + + IsProfileFilterSet = !string.IsNullOrEmpty(filter.Search) || filter.Tags.Any(); } + else + { + Profiles = null; + } + + OnPropertyChanged(); } + } = new(); - public ICollectionView _profiles; - public ICollectionView Profiles + public ICollectionView Profiles + { + get; + private set { - get => _profiles; - set - { - if (value == _profiles) - return; + if (value == field) + return; - _profiles = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private ProfileInfo _selectedProfile = new ProfileInfo(); - public ProfileInfo SelectedProfile + public ProfileInfo SelectedProfile + { + get; + set { - get => _selectedProfile; - set - { - if (value == _selectedProfile) - return; + if (value == field) + return; - _selectedProfile = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = new(); - private IList _selectedProfiles = new ArrayList(); - public IList SelectedProfiles + public IList SelectedProfiles + { + get; + set { - get => _selectedProfiles; - set - { - if (Equals(value, _selectedProfiles)) - return; + if (Equals(value, field)) + return; - _selectedProfiles = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = new ArrayList(); - private string _search; - public string Search + public string Search + { + get; + set { - get => _search; - set - { - if (value == _search) - return; - - _search = value; + if (value == field) + return; - StartDelayedSearch(); + field = value; - OnPropertyChanged(); + // Start searching... + if (!_searchDisabled) + { + IsSearching = true; + _searchDispatcherTimer.Start(); } + + OnPropertyChanged(); } + } - private bool _isSearching; - public bool IsSearching + public bool IsSearching + { + get; + set { - get => _isSearching; - set - { - if (value == _isSearching) - return; + if (value == field) + return; - _isSearching = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion + } - #region Constructor - public ProfilesViewModel(IDialogCoordinator instance) + public bool ProfileFilterIsOpen + { + get; + set { - _dialogCoordinator = instance; + if (value == field) + return; - SetGroupView(); + field = value; + OnPropertyChanged(); + } + } - ProfileManager.OnProfilesUpdated += ProfileManager_OnProfilesUpdated; + public ICollectionView ProfileFilterTagsView { get; } - _searchDispatcherTimer.Interval = GlobalStaticConfiguration.SearchDispatcherTimerTimeSpan; - _searchDispatcherTimer.Tick += SearchDispatcherTimer_Tick; - } + private ObservableCollection ProfileFilterTags { get; } = []; - public void SetGroupView() + public bool ProfileFilterTagsMatchAny + { + get; + set { - Groups = new CollectionViewSource { Source = ProfileManager.Groups }.View; + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.Profile_TagsMatchAny; - Groups.SortDescriptions.Add(new SortDescription(nameof(GroupInfo.Name), ListSortDirection.Ascending)); + public bool ProfileFilterTagsMatchAll + { + get; + set + { + if (value == field) + return; - SelectedGroup = Groups.SourceCollection.Cast().OrderBy(x => x.Name).FirstOrDefault(); + field = value; + OnPropertyChanged(); } + } - public void SetProfilesView(string groupName) + public bool IsProfileFilterSet + { + get; + set { - Profiles = new CollectionViewSource { Source = ProfileManager.Groups.FirstOrDefault(x => x.Name.Equals(groupName)).Profiles }.View; + if (value == field) + return; - Profiles.SortDescriptions.Add(new SortDescription(nameof(ProfileInfo.Name), ListSortDirection.Ascending)); - Profiles.Filter = o => - { - if (string.IsNullOrEmpty(Search)) - return true; + field = value; + OnPropertyChanged(); + } + } - if (o is not ProfileInfo info) - return false; + #endregion - var search = Search.Trim(); + #region Commands & Actions - // Search by: Tag=xxx (exact match, ignore case) - /* - if (search.StartsWith(ProfileManager.TagIdentifier, StringComparison.OrdinalIgnoreCase)) - return !string.IsNullOrEmpty(info.Tags) && info.Tags.Replace(" ", "").Split(';').Any(str => search.Substring(ProfileManager.TagIdentifier.Length, search.Length - ProfileManager.TagIdentifier.Length).Equals(str, StringComparison.OrdinalIgnoreCase)); - */ + public ICommand AddGroupCommand => new RelayCommand(_ => AddGroupAction()); - // Search by: Name - return info.Name.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1; - }; + private void AddGroupAction() + { + _ = ProfileDialogManager.ShowAddGroupDialog(Application.Current.MainWindow, this); + } - // Select first profile, or the last selected profile - SelectedProfile = Profiles.SourceCollection.Cast().OrderBy(x => x.Name).FirstOrDefault(); + public ICommand EditGroupCommand => new RelayCommand(_ => EditGroupAction()); - SelectedProfiles = new List { SelectedProfile }; // Fix --> Count need to be 1 for EditProfile_CanExecute - } - #endregion + private void EditGroupAction() + { + _ = ProfileDialogManager.ShowEditGroupDialog(Application.Current.MainWindow, this, SelectedGroup); + } - #region Commands & Actions - public ICommand AddProfileCommand => new RelayCommand(p => AddProfileAction()); + public ICommand DeleteGroupCommand => new RelayCommand(_ => DeleteGroupAction()); - private void AddProfileAction() - { - ProfileDialogManager.ShowAddProfileDialog(this, _dialogCoordinator, SelectedGroup?.Name); - } + private void DeleteGroupAction() + { + _ = ProfileDialogManager.ShowDeleteGroupDialog(Application.Current.MainWindow, this, SelectedGroup); + } - public ICommand EditProfileCommand => new RelayCommand(p => EditProfileAction(), EditProfile_CanExecute); + public ICommand AddProfileCommand => new RelayCommand(_ => AddProfileAction()); - private bool EditProfile_CanExecute(object paramter) => SelectedProfiles.Count == 1; + private void AddProfileAction() + { + _ = ProfileDialogManager.ShowAddProfileDialog(Application.Current.MainWindow, this, null, SelectedGroup?.Name); + } - private void EditProfileAction() - { - ProfileDialogManager.ShowEditProfileDialog(this, _dialogCoordinator, SelectedProfile); - } + public ICommand EditProfileCommand => new RelayCommand(_ => EditProfileAction(), EditProfile_CanExecute); - public ICommand CopyAsProfileCommand => new RelayCommand(p => CopyAsProfileAction()); + private bool EditProfile_CanExecute(object parameter) + { + return SelectedProfiles.Count == 1; + } - private void CopyAsProfileAction() - { - ProfileDialogManager.ShowCopyAsProfileDialog(this, _dialogCoordinator, SelectedProfile); - } + private void EditProfileAction() + { + _ = ProfileDialogManager.ShowEditProfileDialog(Application.Current.MainWindow, this, SelectedProfile); + } - public ICommand DeleteProfileCommand => new RelayCommand(p => DeleteProfileAction()); + private bool ModifyProfile_CanExecute(object obj) + { + return SelectedProfile is { IsDynamic: false }; + } - private void DeleteProfileAction() - { - ProfileDialogManager.ShowDeleteProfileDialog(this, _dialogCoordinator, new List(SelectedProfiles.Cast())); - } + public ICommand CopyAsProfileCommand => new RelayCommand(_ => CopyAsProfileAction(), ModifyProfile_CanExecute); - public ICommand AddGroupCommand => new RelayCommand(p => AddGroupAction()); + private void CopyAsProfileAction() + { + _ = ProfileDialogManager.ShowCopyAsProfileDialog(Application.Current.MainWindow, this, SelectedProfile); + } - private void AddGroupAction() - { - ProfileDialogManager.ShowAddGroupDialog(this, _dialogCoordinator); - } + public ICommand DeleteProfileCommand => new RelayCommand(_ => DeleteProfileAction(), ModifyProfile_CanExecute); - public ICommand EditGroupCommand => new RelayCommand(p => EditGroupAction()); + private void DeleteProfileAction() + { + _ = ProfileDialogManager + .ShowDeleteProfileDialog(Application.Current.MainWindow, this, [.. SelectedProfiles.Cast()]); + } - private void EditGroupAction() - { - ProfileDialogManager.ShowEditGroupDialog(this, _dialogCoordinator, SelectedGroup); - } + public ICommand ImportProfilesCommand => new RelayCommand(_ => ImportProfilesAction()); - public ICommand DeleteGroupCommand => new RelayCommand(p => DeleteGroupAction()); + private void ImportProfilesAction() + { + _ = ProfileDialogManager + .ShowImportProfilesDialog(Application.Current.MainWindow, this, SelectedGroup?.Name); + } - private void DeleteGroupAction() - { - ProfileDialogManager.ShowDeleteGroupDialog(this, _dialogCoordinator, SelectedGroup); - } - #endregion + public ICommand OpenProfileFilterCommand => new RelayCommand(_ => OpenProfileFilterAction()); - #region Methods - private void StartDelayedSearch() - { - if (!IsSearching) - { - IsSearching = true; + private void OpenProfileFilterAction() + { + ProfileFilterIsOpen = true; + } - _searchDispatcherTimer.Start(); - } - else - { - _searchDispatcherTimer.Stop(); - _searchDispatcherTimer.Start(); - } - } + public ICommand ApplyProfileFilterCommand => new RelayCommand(_ => ApplyProfileFilterAction()); - private void StopDelayedSearch() - { - _searchDispatcherTimer.Stop(); + private void ApplyProfileFilterAction() + { + RefreshProfiles(); - RefreshProfiles(); + ProfileFilterIsOpen = false; + } - IsSearching = false; - } + public ICommand ClearProfileFilterCommand => new RelayCommand(_ => ClearProfileFilterAction()); - public void RefreshProfiles() - { - Debug.WriteLine("ProfilesViewModel: Refresh profiles..."); + private void ClearProfileFilterAction() + { + _searchDisabled = true; + Search = string.Empty; + _searchDisabled = false; - if (SelectedGroup == null) - { - Debug.WriteLine("ProfilesViewModel: SelectedGroup is null, try to set"); - SetGroupView(); - } + foreach (var tag in ProfileFilterTags) + tag.IsSelected = false; - Groups?.Refresh(); - Profiles?.Refresh(); - } + RefreshProfiles(); - public void OnProfileDialogOpen() - { + IsProfileFilterSet = false; + ProfileFilterIsOpen = false; + } + #endregion - } + #region Methods + + public void OnViewVisible() + { + _isViewActive = true; + + RefreshProfiles(); + } + + public void OnViewHide() + { + _isViewActive = false; + } - public void OnProfileDialogClose() + private void SetGroupsView(GroupInfo group = null) + { + _disableProfileRefresh = true; + + Groups = new CollectionViewSource { + Source = ProfileManager.LoadedProfileFileData.Groups.Where(x => !x.IsDynamic).OrderBy(x => x.Name) + }.View; - } - #endregion + // Set to null, so even when the same group is selected, the profiles get refreshed + SelectedGroup = null; + + _disableProfileRefresh = false; + + // Set specific group or first if null + if (group != null) + SelectedGroup = Groups.SourceCollection.Cast().FirstOrDefault(x => x.Equals(group)) ?? + Groups.SourceCollection.Cast().MinBy(x => x.Name); + else + SelectedGroup = Groups.SourceCollection.Cast().MinBy(x => x.Name); + } + + private void CreateTags() + { + // Get all tags from profiles in the selected group + var tags = ProfileManager.LoadedProfileFileData.Groups.First(x => x.Name == SelectedGroup.Name).Profiles + .SelectMany(x => x.TagsCollection).Distinct().ToList(); - #region Event - private void ProfileManager_OnProfilesUpdated(object sender, EventArgs e) + var tagSet = new HashSet(tags); + + for (var i = ProfileFilterTags.Count - 1; i >= 0; i--) { - // Update group view (and profile view) when the profile file has changed - RefreshProfiles(); + if (!tagSet.Contains(ProfileFilterTags[i].Name)) + ProfileFilterTags.RemoveAt(i); } - private void SearchDispatcherTimer_Tick(object sender, EventArgs e) + var existingTagNames = new HashSet(ProfileFilterTags.Select(ft => ft.Name)); + + foreach (var tag in tags.Where(tag => !existingTagNames.Contains(tag))) { - StopDelayedSearch(); + ProfileFilterTags.Add(new ProfileFilterTagsInfo(false, tag)); } - #endregion } + + private void SetProfilesView(ProfileFilterInfo filter, GroupInfo group, ProfileInfo profile = null) + { + Profiles = new CollectionViewSource + { + Source = ProfileManager.LoadedProfileFileData.Groups.FirstOrDefault(x => x.Equals(group))?.Profiles.Where(x => !x.IsDynamic && ( + string.IsNullOrEmpty(Search) || x.Name.IndexOf(filter.Search, StringComparison.OrdinalIgnoreCase) > -1) && ( + // If no tags are selected, show all profiles + (!filter.Tags.Any()) || + // Any tag can match + (filter.TagsFilterMatch == ProfileFilterTagsMatch.Any && + filter.Tags.Any(tag => x.TagsCollection.Contains(tag))) || + // All tags must match + (filter.TagsFilterMatch == ProfileFilterTagsMatch.All && + filter.Tags.All(tag => x.TagsCollection.Contains(tag)))) + ).OrderBy(x => x.Name) + }.View; + + // Set specific profile or first if null + SelectedProfile = null; + + if (profile != null) + SelectedProfile = Profiles.Cast().FirstOrDefault(x => x.Equals(profile)) ?? + Profiles.Cast().FirstOrDefault(); + else + SelectedProfile = Profiles.Cast().FirstOrDefault(); + + SelectedProfiles = new List + { SelectedProfile }; // Fix --> Count need to be 1 for EditProfile_CanExecute + } + + private void RefreshProfiles() + { + if (!_isViewActive) + return; + + _lastSelectedProfileOnRefresh = SelectedProfile; + + SetGroupsView(SelectedGroup); + + _lastSelectedProfileOnRefresh = null; + } + + #endregion + + #region Event + + private void ProfileManager_OnProfilesUpdated(object sender, EventArgs e) + { + RefreshProfiles(); + } + + private void SearchDispatcherTimer_Tick(object sender, EventArgs e) + { + _searchDispatcherTimer.Stop(); + + RefreshProfiles(); + + IsSearching = false; + } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/PuTTYConnectViewModel.cs b/Source/NETworkManager/ViewModels/PuTTYConnectViewModel.cs index 22930d5e06..669c581414 100644 --- a/Source/NETworkManager/ViewModels/PuTTYConnectViewModel.cs +++ b/Source/NETworkManager/ViewModels/PuTTYConnectViewModel.cs @@ -1,303 +1,293 @@ -using NETworkManager.Models.PuTTY; -using NETworkManager.Settings; -using NETworkManager.Utilities; using System; using System.ComponentModel; using System.Windows.Data; using System.Windows.Input; +using NETworkManager.Models.PuTTY; +using NETworkManager.Settings; +using NETworkManager.Utilities; + +namespace NETworkManager.ViewModels; -namespace NETworkManager.ViewModels +public class PuTTYConnectViewModel : ViewModelBase { - - public class PuTTYConnectViewModel : ViewModelBase + public PuTTYConnectViewModel(Action connectCommand, + Action cancelHandler, string host = null) { - public ICommand ConnectCommand { get; } - - public ICommand CancelCommand { get; } + ConnectCommand = new RelayCommand(_ => connectCommand(this)); + CancelCommand = new RelayCommand(_ => cancelHandler(this)); + + if (!string.IsNullOrEmpty(host)) + Host = host; + + HostHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.PuTTY_HostHistory); + SerialLineHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.PuTTY_SerialLineHistory); + PortHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.PuTTY_PortHistory); + BaudHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.PuTTY_BaudHistory); + UsernameHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.PuTTY_UsernameHistory); + PrivateKeyFileHistoryView = + CollectionViewSource.GetDefaultView(SettingsManager.Current.PuTTY_PrivateKeyFileHistory); + ProfileHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.PuTTY_ProfileHistory); + + LoadSettings(); + } - public int DefaultSSHPort => SettingsManager.Current.PuTTY_SSHPort; - public int DefaultTelnetPort => SettingsManager.Current.PuTTY_TelnetPort; - public int DefaultBaudRate => SettingsManager.Current.PuTTY_BaudRate; - public int DefaultRloginPort => SettingsManager.Current.PuTTY_RloginPort; - public int DefaultRaw => SettingsManager.Current.PuTTY_DefaultRaw; + public ICommand ConnectCommand { get; } - public ConnectionMode ConnectionMode { get; set; } + public ICommand CancelCommand { get; } - private bool _useSSH; - public bool UseSSH + public ConnectionMode ConnectionMode + { + get; + set { - get => _useSSH; - set - { - if (value == _useSSH) - return; + if (value == field) + return; - if (value) - { - Port = DefaultSSHPort; - ConnectionMode = ConnectionMode.SSH; - } - - _useSSH = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _useTelnet; - public bool UseTelnet + public bool UseSSH + { + get; + set { - get => _useTelnet; - set - { - if (value == _useTelnet) - return; + if (value == field) + return; - if (value) - { - Port = DefaultTelnetPort; - ConnectionMode = ConnectionMode.Telnet; - } - - _useTelnet = value; - OnPropertyChanged(); + if (value) + { + Port = SettingsManager.Current.PuTTY_SSHPort; + ConnectionMode = ConnectionMode.SSH; } + + field = value; + OnPropertyChanged(); } + } - private bool _useSerial; - public bool UseSerial + public bool UseTelnet + { + get; + set { - get => _useSerial; - set - { - if (value == _useSerial) - return; - - if (value) - { - Baud = DefaultBaudRate; - ConnectionMode = ConnectionMode.Serial; - } + if (value == field) + return; - _useSerial = value; - OnPropertyChanged(); + if (value) + { + Port = SettingsManager.Current.PuTTY_TelnetPort; + ConnectionMode = ConnectionMode.Telnet; } + + field = value; + OnPropertyChanged(); } + } - private bool _useRlogin; - public bool UseRlogin + public bool UseSerial + { + get; + set { - get => _useRlogin; - set - { - if (value == _useRlogin) - return; - - if (value) - { - Port = DefaultRloginPort; - ConnectionMode = ConnectionMode.Rlogin; - } + if (value == field) + return; - _useRlogin = value; - OnPropertyChanged(); + if (value) + { + Baud = SettingsManager.Current.PuTTY_BaudRate; + ConnectionMode = ConnectionMode.Serial; } + + field = value; + OnPropertyChanged(); } + } - private bool _useRAW; - public bool UseRAW + public bool UseRlogin + { + get; + set { - get => _useRAW; - set - { - if (value == _useRAW) - return; + if (value == field) + return; - if (value) - { - Port = DefaultRaw; - ConnectionMode = ConnectionMode.RAW; - } - - _useRAW = value; - OnPropertyChanged(); + if (value) + { + Port = SettingsManager.Current.PuTTY_RloginPort; + ConnectionMode = ConnectionMode.Rlogin; } + + field = value; + OnPropertyChanged(); } + } - private string _host; - public string Host + public bool UseRAW + { + get; + set { - get => _host; - set - { - if (value == _host) - return; + if (value == field) + return; - _host = value; - OnPropertyChanged(); + if (value) + { + Port = SettingsManager.Current.PuTTY_RawPort; + ConnectionMode = ConnectionMode.RAW; } + + field = value; + OnPropertyChanged(); } + } - private string _serialLine; - public string SerialLine + public string Host + { + get; + set { - get => _serialLine; - set - { - if (value == _serialLine) - return; + if (value == field) + return; - _serialLine = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private int _port; - public int Port + public string SerialLine + { + get; + set { - get => _port; - set - { - if (value == _port) - return; + if (value == field) + return; - _port = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private int _baud; - public int Baud + public int Port + { + get; + set { - get => _baud; - set - { - if (value == _baud) - return; + if (value == field) + return; - _baud = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _username; - public string Username + public int Baud + { + get; + set { - get => _username; - set - { - if (value == _username) - return; + if (value == field) + return; - _username = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _privateKeyFile; - public string PrivateKeyFile + public string Username + { + get; + set { - get => _privateKeyFile; - set - { - if (value == _privateKeyFile) - return; + if (value == field) + return; - _privateKeyFile = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - - private string _profile; - public string Profile + public string PrivateKeyFile + { + get; + set { - get => _profile; - set - { - if (value == _profile) - return; + if (value == field) + return; - _profile = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _additionalCommandLine; - public string AdditionalCommandLine + public string Profile + { + get; + set { - get => _additionalCommandLine; - set - { - if (value == _additionalCommandLine) - return; + if (value == field) + return; - _additionalCommandLine = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - public ICollectionView HostHistoryView { get; } - - public ICollectionView SerialLineHistoryView { get; } + public string AdditionalCommandLine + { + get; + set + { + if (value == field) + return; - public ICollectionView PortHistoryView { get; } + field = value; + OnPropertyChanged(); + } + } - public ICollectionView BaudHistoryView { get; } + public ICollectionView HostHistoryView { get; } - public ICollectionView UsernameHistoryView { get; } + public ICollectionView SerialLineHistoryView { get; } - public ICollectionView PrivateKeyFileHistoryView { get; set; } + public ICollectionView PortHistoryView { get; } - public ICollectionView ProfileHistoryView { get; } + public ICollectionView BaudHistoryView { get; } - public PuTTYConnectViewModel(Action connectCommand, Action cancelHandler, string host = null) - { - ConnectCommand = new RelayCommand(p => connectCommand(this)); - CancelCommand = new RelayCommand(p => cancelHandler(this)); + public ICollectionView UsernameHistoryView { get; } - if (!string.IsNullOrEmpty(host)) - Host = host; + public ICollectionView PrivateKeyFileHistoryView { get; set; } - HostHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.PuTTY_HostHistory); - SerialLineHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.PuTTY_SerialLineHistory); - PortHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.PuTTY_PortHistory); - BaudHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.PuTTY_BaudHistory); - UsernameHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.PuTTY_UsernameHistory); - PrivateKeyFileHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.PuTTY_PrivateKeyFileHistory); - ProfileHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.PuTTY_ProfileHistory); + public ICollectionView ProfileHistoryView { get; } - LoadSettings(); - } + private void LoadSettings() + { + ConnectionMode = SettingsManager.Current.PuTTY_DefaultConnectionMode; - private void LoadSettings() + switch (ConnectionMode) { - - ConnectionMode = SettingsManager.Current.PuTTY_DefaultConnectionMode; - - switch (ConnectionMode) - { - case ConnectionMode.SSH: - UseSSH = true; - break; - case ConnectionMode.Telnet: - UseTelnet = true; - break; - case ConnectionMode.Serial: - UseSerial = true; - break; - case ConnectionMode.Rlogin: - UseRlogin = true; - break; - case ConnectionMode.RAW: - UseRAW = true; - break; - } - - Username = SettingsManager.Current.PuTTY_Username; - PrivateKeyFile = SettingsManager.Current.PuTTY_PrivateKeyFile; - Profile = SettingsManager.Current.PuTTY_Profile; - SerialLine = SettingsManager.Current.PuTTY_SerialLine; - AdditionalCommandLine = SettingsManager.Current.PuTTY_AdditionalCommandLine; + case ConnectionMode.SSH: + UseSSH = true; + break; + case ConnectionMode.Telnet: + UseTelnet = true; + break; + case ConnectionMode.Serial: + UseSerial = true; + break; + case ConnectionMode.Rlogin: + UseRlogin = true; + break; + case ConnectionMode.RAW: + UseRAW = true; + break; } + + Username = SettingsManager.Current.PuTTY_Username; + PrivateKeyFile = SettingsManager.Current.PuTTY_PrivateKeyFile; + Profile = SettingsManager.Current.PuTTY_Profile; + SerialLine = SettingsManager.Current.PuTTY_SerialLine; + AdditionalCommandLine = SettingsManager.Current.PuTTY_AdditionalCommandLine; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/PuTTYHostViewModel.cs b/Source/NETworkManager/ViewModels/PuTTYHostViewModel.cs index 266083d231..9ffc59c06d 100644 --- a/Source/NETworkManager/ViewModels/PuTTYHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/PuTTYHostViewModel.cs @@ -1,608 +1,540 @@ -using System.Collections.ObjectModel; -using NETworkManager.Controls; using Dragablz; -using System.Windows.Input; -using MahApps.Metro.Controls.Dialogs; +using log4net; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Models; +using NETworkManager.Models.EventSystem; +using NETworkManager.Models.PuTTY; +using NETworkManager.Profiles; using NETworkManager.Settings; -using System.Linq; +using NETworkManager.Utilities; using NETworkManager.Views; -using System.ComponentModel; -using System.Windows.Data; using System; -using System.IO; -using NETworkManager.Utilities; +using System.Collections.ObjectModel; +using System.ComponentModel; using System.Diagnostics; -using NETworkManager.Models.PuTTY; -using System.Windows; -using NETworkManager.Profiles; -using System.Windows.Threading; -using NETworkManager.Models; -using NETworkManager.Models.EventSystem; +using System.IO; +using System.Linq; using System.Threading.Tasks; -using System.Collections.Generic; - -namespace NETworkManager.ViewModels -{ - public class PuTTYHostViewModel : ViewModelBase, IProfileManager - { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - private readonly DispatcherTimer _searchDispatcherTimer = new DispatcherTimer(); +using System.Windows; +using System.Windows.Input; +using PuTTYProfile = NETworkManager.Settings.Application.PuTTY; - public IInterTabClient InterTabClient { get; } - public ObservableCollection TabItems { get; } +namespace NETworkManager.ViewModels; - private readonly bool _isLoading = true; - private bool _isViewActive = true; +public class PuTTYHostViewModel : ProfileHostViewModelBase +{ + #region Variables - private bool _isConfigured; - public bool IsConfigured - { - get => _isConfigured; - set - { - if (value == _isConfigured) - return; + private static readonly ILog Log = LogManager.GetLogger(typeof(PuTTYHostViewModel)); - _isConfigured = value; - OnPropertyChanged(); - } - } + public IInterTabClient InterTabClient { get; } - private int _selectedTabIndex; - public int SelectedTabIndex + public string InterTabPartition + { + get; + set { - get => _selectedTabIndex; - set - { - if (value == _selectedTabIndex) - return; + if (value == field) + return; - _selectedTabIndex = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - #region Profiles - - public ICollectionView Profiles { get; } + public ObservableCollection TabItems { get; } - private ProfileInfo _selectedProfile = new ProfileInfo(); - public ProfileInfo SelectedProfile + public bool IsExecutableConfigured + { + get; + set { - get => _selectedProfile; - set - { - if (value == _selectedProfile) - return; + if (value == field) + return; - _selectedProfile = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _search; - public string Search + public int SelectedTabIndex + { + get; + set { - get => _search; - set - { - if (value == _search) - return; - - _search = value; - - StartDelayedSearch(); + if (value == field) + return; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isSearching; - public bool IsSearching + public bool HeaderContextMenuIsOpen + { + get; + set { - get => _isSearching; - set - { - if (value == _isSearching) - return; + if (value == field) + return; - _isSearching = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _canProfileWidthChange = true; - private double _tempProfileWidth; + private bool _textBoxSearchIsFocused; - private bool _expandProfileView; - public bool ExpandProfileView + /// + /// Gets or sets a value indicating whether the profile context menu is open. Bound to + /// so + /// can avoid stealing focus while it is open. + /// + public bool ProfileContextMenuIsOpen + { + get; + set { - get => _expandProfileView; - set - { - if (value == _expandProfileView) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.PuTTY_ExpandProfileView = value; + field = value; + OnPropertyChanged(); + } + } - _expandProfileView = value; + #endregion - if (_canProfileWidthChange) - ResizeProfile(false); + #region Constructor, load settings - OnPropertyChanged(); - } - } + public PuTTYHostViewModel() + { + // Check if PuTTY executable is configured + CheckExecutable(); - private GridLength _profileWidth; - public GridLength ProfileWidth - { - get => _profileWidth; - set - { - if (value == _profileWidth) - return; + // Try to find PuTTY executable + if (!IsExecutableConfigured) + TryFindExecutable(); - if (!_isLoading && Math.Abs(value.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > GlobalStaticConfiguration.FloatPointFix) // Do not save the size when collapsed - SettingsManager.Current.PuTTY_ProfileWidth = value.Value; + WriteDefaultProfileToRegistry(); - _profileWidth = value; + InterTabClient = new DragablzInterTabClient(ApplicationName.PuTTY); + InterTabPartition = nameof(ApplicationName.PuTTY); - if (_canProfileWidthChange) - ResizeProfile(true); + TabItems = []; - OnPropertyChanged(); - } - } - #endregion - #endregion + InitializeProfileHost(); - #region Constructor, load settings - public PuTTYHostViewModel(IDialogCoordinator instance) - { - _dialogCoordinator = instance; + SettingsManager.Current.PropertyChanged += SettingsManager_PropertyChanged; + } - // Check if putty is available... - CheckIfConfigured(); + #endregion - // Create default PuTTY profile for NETworkManager - if (IsConfigured) - PuTTY.WriteDefaultProfileToRegistry(SettingsManager.Current.Appearance_Theme); + #region Profile host - InterTabClient = new DragablzInterTabClient(ApplicationName.PuTTY); + protected override ApplicationName ApplicationName => ApplicationName.PuTTY; - TabItems = new ObservableCollection(); + protected override bool IsProfileEnabled(ProfileInfo profile) => profile.PuTTY_Enabled; - Profiles = new CollectionViewSource { Source = ProfileManager.Groups.SelectMany(x => x.Profiles) }.View; - Profiles.GroupDescriptions.Add(new PropertyGroupDescription(nameof(ProfileInfo.Group))); - Profiles.SortDescriptions.Add(new SortDescription(nameof(ProfileInfo.Group), ListSortDirection.Ascending)); - Profiles.SortDescriptions.Add(new SortDescription(nameof(ProfileInfo.Name), ListSortDirection.Ascending)); - Profiles.Filter = o => - { - if (!(o is ProfileInfo info)) - return false; + protected override string GetSearchableField(ProfileInfo profile) => profile.PuTTY_HostOrSerialLine; - if (string.IsNullOrEmpty(Search)) - return info.PuTTY_Enabled; + /// + /// Also mirrors the popup state into so the main window can suppress + /// global focus-stealing behavior (e.g. re-focusing the embedded terminal) while the filter popup is open. + /// + public new ICommand OpenProfileFilterCommand => new RelayCommand(_ => OpenProfileFilterAction()); - var search = Search.Trim(); + private void OpenProfileFilterAction() + { + ConfigurationManager.Current.IsProfileFilterPopupOpen = true; - // Search by: Tag=xxx (exact match, ignore case) - /* - if (search.StartsWith(ProfileManager.TagIdentifier, StringComparison.OrdinalIgnoreCase)) - return !string.IsNullOrEmpty(info.Tags) && info.PuTTY_Enabled && info.Tags.Replace(" ", "").Split(';').Any(str => search.Substring(ProfileManager.TagIdentifier.Length, search.Length - ProfileManager.TagIdentifier.Length).Equals(str, StringComparison.OrdinalIgnoreCase)); - */ + ProfileFilterIsOpen = true; + } - // Search by: Name, PuTTY_HostOrSerialLine - return info.PuTTY_Enabled && (info.Name.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1 || info.PuTTY_HostOrSerialLine.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1); - }; + /// + /// Called when the tag-filter popup closes (including an implicit close, e.g. clicking away), to keep + /// in sync. + /// + public ICommand ProfileFilterPopupClosedCommand => new RelayCommand(_ => OnProfileFilterClosed()); - // This will select the first entry as selected item... - SelectedProfile = Profiles.SourceCollection.Cast().Where(x => x.PuTTY_Enabled).OrderBy(x => x.Group).ThenBy(x => x.Name).FirstOrDefault(); + public void OnProfileFilterClosed() + { + ConfigurationManager.Current.IsProfileFilterPopupOpen = false; + } - ProfileManager.OnProfilesUpdated += ProfileManager_OnProfilesUpdated; + public override void OnProfileManagerDialogOpen() + { + ConfigurationManager.OnDialogOpen(); + } - _searchDispatcherTimer.Interval = GlobalStaticConfiguration.SearchDispatcherTimerTimeSpan; - _searchDispatcherTimer.Tick += SearchDispatcherTimer_Tick; + public override void OnProfileManagerDialogClose() + { + ConfigurationManager.OnDialogClose(); + } - LoadSettings(); + #endregion - SettingsManager.Current.PropertyChanged += Current_PropertyChanged; + #region ICommand & Actions - _isLoading = false; - } + public ItemActionCallback CloseItemCommand => CloseItemAction; - private void Current_PropertyChanged(object sender, PropertyChangedEventArgs e) - { - if (e.PropertyName == nameof(SettingsInfo.PuTTY_ApplicationFilePath)) - CheckIfConfigured(); - } + private void CloseItemAction(ItemActionCallbackArgs args) + { + ((args.DragablzItem.Content as DragablzTabItem)?.View as IDragablzTabItem)?.CloseTab(); + } - private void LoadSettings() - { - ExpandProfileView = SettingsManager.Current.PuTTY_ExpandProfileView; + private bool Connect_CanExecute(object obj) + { + return IsExecutableConfigured; + } - ProfileWidth = ExpandProfileView ? new GridLength(SettingsManager.Current.PuTTY_ProfileWidth) : new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); + public ICommand ConnectCommand => new RelayCommand(_ => ConnectAction(), Connect_CanExecute); - _tempProfileWidth = SettingsManager.Current.PuTTY_ProfileWidth; - } - #endregion + private void ConnectAction() + { + _ = Connect(); + } - #region ICommand & Actions - public ItemActionCallback CloseItemCommand => CloseItemAction; + private bool IsConnected_CanExecute(object view) + { + if (view is PuTTYControl control) + return control.IsConnected; - private void CloseItemAction(ItemActionCallbackArgs args) - { - ((args.DragablzItem.Content as DragablzTabItem)?.View as PuTTYControl)?.CloseTab(); - } + return false; + } - private bool PuTTY_Disconnected_CanExecute(object view) - { - if (view is PuTTYControl control) - return !control.IsConnected; + public ICommand ReconnectCommand => new RelayCommand(ReconnectAction); - return false; - } + private void ReconnectAction(object view) + { + if (view is not PuTTYControl control) + return; - private bool PuTTY_Connected_CanExecute(object view) - { - if (view is PuTTYControl control) - return control.IsConnected; + if (control.ReconnectCommand.CanExecute(null)) + control.ReconnectCommand.Execute(null); + } - return false; - } + public ICommand ResizeWindowCommand => new RelayCommand(ResizeWindowAction, IsConnected_CanExecute); - public ICommand PuTTY_ReconnectCommand => new RelayCommand(PuTTY_ReconnectAction); + private void ResizeWindowAction(object view) + { + if (view is PuTTYControl control) + control.ResizeEmbeddedWindow(); + } - private void PuTTY_ReconnectAction(object view) - { - if (view is PuTTYControl control) - { - if (control.ReconnectCommand.CanExecute(null)) - control.ReconnectCommand.Execute(null); - } - } + public ICommand RestartSessionCommand => new RelayCommand(RestartSessionAction, IsConnected_CanExecute); - public ICommand PuTTY_ResizeWindowCommand => new RelayCommand(PuTTY_ResizeWindowAction, PuTTY_Connected_CanExecute); + private void RestartSessionAction(object view) + { + if (view is PuTTYControl control) + control.RestartSession(); + } - private void PuTTY_ResizeWindowAction(object view) - { - if (view is PuTTYControl control) - control.ResizeEmbeddedWindow(); - } + public ICommand ConnectProfileCommand => new RelayCommand(_ => ConnectProfileAction(), ConnectProfile_CanExecute); - public ICommand PuTTY_RestartSessionCommand => new RelayCommand(PuTTY_RestartSessionAction, PuTTY_Connected_CanExecute); + private bool ConnectProfile_CanExecute(object obj) + { + return !IsSearching && SelectedProfile != null; + } - private void PuTTY_RestartSessionAction(object view) - { - if (view is PuTTYControl control) - control.RestartSession(); - } + private void ConnectProfileAction() + { + ConnectProfile(); + } - public ICommand ConnectCommand => new RelayCommand(p => ConnectAction(), Connect_CanExecute); + public ICommand ConnectProfileExternalCommand => new RelayCommand(_ => ConnectProfileExternalAction()); - private bool Connect_CanExecute(object obj) - { - return IsConfigured; - } + private void ConnectProfileExternalAction() + { + ConnectProfileExternal(); + } - private void ConnectAction() - { - Connect(); - } + public ICommand TextBoxSearchGotFocusCommand + { + get { return new RelayCommand(_ => _textBoxSearchIsFocused = true); } + } - public ICommand ConnectProfileCommand => new RelayCommand(p => ConnectProfileAction(), ConnectProfile_CanExecute); + public ICommand TextBoxSearchLostFocusCommand + { + get { return new RelayCommand(_ => _textBoxSearchIsFocused = false); } + } - private bool ConnectProfile_CanExecute(object obj) - { - return !IsSearching && SelectedProfile != null; - } + public ICommand OpenSettingsCommand => new RelayCommand(_ => OpenSettingsAction()); - private void ConnectProfileAction() - { - ConnectProfile(); - } + private static void OpenSettingsAction() + { + EventSystem.RedirectToSettings(); + } - public ICommand ConnectProfileExternalCommand => new RelayCommand(p => ConnectProfileExternalAction()); + #endregion - private void ConnectProfileExternalAction() - { - ConnectProfileExternal(); - } + #region Methods - public ICommand AddProfileCommand => new RelayCommand(p => AddProfileAction()); + /// + /// Check if executable is configured and exists. + /// + private void CheckExecutable() + { + IsExecutableConfigured = !string.IsNullOrEmpty(SettingsManager.Current.PuTTY_ApplicationFilePath) && + File.Exists(SettingsManager.Current.PuTTY_ApplicationFilePath); - private void AddProfileAction() - { - ProfileDialogManager.ShowAddProfileDialog(this, _dialogCoordinator); - } + if (IsExecutableConfigured) + Log.Info($"PuTTY executable configured: \"{SettingsManager.Current.PuTTY_ApplicationFilePath}\""); + else + Log.Warn("PuTTY executable not found!"); + } - public ICommand EditProfileCommand => new RelayCommand(p => EditProfileAction()); + /// + /// Try to find executable. + /// + private void TryFindExecutable() + { + Log.Info("Try to find PuTTY executable..."); - private void EditProfileAction() - { - ProfileDialogManager.ShowEditProfileDialog(this, _dialogCoordinator, SelectedProfile); - } + SettingsManager.Current.PuTTY_ApplicationFilePath = ApplicationHelper.Find(Models.PuTTY.PuTTY.FileName); - public ICommand CopyAsProfileCommand => new RelayCommand(p => CopyAsProfileAction()); + CheckExecutable(); - private void CopyAsProfileAction() - { - ProfileDialogManager.ShowCopyAsProfileDialog(this, _dialogCoordinator, SelectedProfile); - } + if (!IsExecutableConfigured) + Log.Warn("Install PuTTY or configure the path in the settings."); + } - public ICommand DeleteProfileCommand => new RelayCommand(p => DeleteProfileAction()); + private Task Connect(string host = null) + { + var childWindow = new PuTTYConnectChildWindow(); - private void DeleteProfileAction() + var childWindowViewModel = new PuTTYConnectViewModel(instance => { - ProfileDialogManager.ShowDeleteProfileDialog(this, _dialogCoordinator, new List { SelectedProfile }); - } + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - public ICommand EditGroupCommand => new RelayCommand(EditGroupAction); + ConfigurationManager.OnDialogClose(); - private void EditGroupAction(object group) - { - ProfileDialogManager.ShowEditGroupDialog(this, _dialogCoordinator, ProfileManager.GetGroup(group.ToString())); - } + // Create profile info + var sessionInfo = new PuTTYSessionInfo + { + HostOrSerialLine = instance.ConnectionMode == ConnectionMode.Serial + ? instance.SerialLine + : instance.Host, + Mode = instance.ConnectionMode, + PortOrBaud = instance.ConnectionMode == ConnectionMode.Serial ? instance.Baud : instance.Port, + Username = instance.Username, + PrivateKey = instance.PrivateKeyFile, + Profile = instance.Profile, + EnableLog = SettingsManager.Current.PuTTY_EnableSessionLog, + LogMode = SettingsManager.Current.PuTTY_LogMode, + LogFileName = SettingsManager.Current.PuTTY_LogFileName, + LogPath = PuTTYProfile.LogPath, + AdditionalCommandLine = PlaceholderHelper.Resolve(instance.AdditionalCommandLine, + (PlaceholderHelper.Host, instance.ConnectionMode == ConnectionMode.Serial ? null : instance.Host)) + }; - public ICommand ClearSearchCommand => new RelayCommand(p => ClearSearchAction()); + // Add to history + // Note: The history can only be updated after the values have been read. + // Otherwise, in some cases, incorrect values are taken over. + AddHostToHistory(instance.Host); + AddSerialLineToHistory(instance.SerialLine); + AddPortToHistory(instance.Port); + AddBaudToHistory(instance.Baud); + AddUsernameToHistory(instance.Username); + AddPrivateKeyToHistory(instance.PrivateKeyFile); + AddProfileToHistory(instance.Profile); - private void ClearSearchAction() + Connect(sessionInfo); + }, _ => { - Search = string.Empty; - } + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - public ICommand OpenSettingsCommand => new RelayCommand(p => OpenSettingsAction()); + ConfigurationManager.OnDialogClose(); + }, host); - private static void OpenSettingsAction() - { - EventSystem.RedirectToSettings(); - } - #endregion - - #region Methods - private void CheckIfConfigured() - { - IsConfigured = !string.IsNullOrEmpty(SettingsManager.Current.PuTTY_ApplicationFilePath) && File.Exists(SettingsManager.Current.PuTTY_ApplicationFilePath); - } + childWindow.Title = Strings.Connect; - private async Task Connect(string host = null) - { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.Connect - }; + childWindow.DataContext = childWindowViewModel; - var connectViewModel = new PuTTYConnectViewModel(async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - ConfigurationManager.Current.FixAirspace = false; - - // Create profile info - var info = new PuTTYSessionInfo - { - HostOrSerialLine = instance.ConnectionMode == ConnectionMode.Serial ? instance.SerialLine : instance.Host, - Mode = instance.ConnectionMode, - PortOrBaud = instance.ConnectionMode == ConnectionMode.Serial ? instance.Baud : instance.Port, - Username = instance.Username, - PrivateKey = instance.PrivateKeyFile, - Profile = instance.Profile, - EnableLog = SettingsManager.Current.PuTTY_EnableSessionLog, - LogMode = SettingsManager.Current.PuTTY_LogMode, - LogFileName = SettingsManager.Current.PuTTY_LogFileName, - LogPath = Settings.Application.PuTTY.LogPath, - AdditionalCommandLine = instance.AdditionalCommandLine - }; - - // Add to history - // Note: The history can only be updated after the values have been read. - // Otherwise, in some cases, incorrect values are taken over. - AddHostToHistory(instance.Host); - AddSerialLineToHistory(instance.SerialLine); - AddPortToHistory(instance.Port); - AddBaudToHistory(instance.Baud); - AddUsernameToHistory(instance.Username); - AddPrivateKeyToHistory(instance.PrivateKeyFile); - AddProfileToHistory(instance.Profile); - - Connect(info); - }, async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - ConfigurationManager.Current.FixAirspace = false; - }, host); - - customDialog.Content = new PuTTYConnectDialog - { - DataContext = connectViewModel - }; + ConfigurationManager.Current.IsChildWindowOpen = true; - ConfigurationManager.Current.FixAirspace = true; - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } + ConfigurationManager.OnDialogOpen(); - private void ConnectProfile() - { - Connect(NETworkManager.Profiles.Application.PuTTY.CreateSessionInfo(SelectedProfile), SelectedProfile.Name); - } + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } - private void ConnectProfileExternal() - { - // Create log path - DirectoryCreator.CreateWithEnvironmentVariables(Settings.Application.PuTTY.LogPath); + private void ConnectProfile() + { + Connect(NETworkManager.Profiles.Application.PuTTY.CreateSessionInfo(SelectedProfile), SelectedProfile.Name); + } - ProcessStartInfo info = new ProcessStartInfo - { - FileName = SettingsManager.Current.PuTTY_ApplicationFilePath, - Arguments = PuTTY.BuildCommandLine(NETworkManager.Profiles.Application.PuTTY.CreateSessionInfo(SelectedProfile)) - }; + private void ConnectProfileExternal() + { + // Create log path + DirectoryHelper.CreateWithEnvironmentVariables(PuTTYProfile.LogPath); - Process.Start(info); - } + var sessionInfo = NETworkManager.Profiles.Application.PuTTY.CreateSessionInfo(SelectedProfile); - private void Connect(PuTTYSessionInfo profileInfo, string header = null) + ProcessStartInfo info = new() { - // Must be added here. So that it works with profiles and the connect dialog. - profileInfo.ApplicationFilePath = SettingsManager.Current.PuTTY_ApplicationFilePath; - - TabItems.Add(new DragablzTabItem(header ?? profileInfo.HostOrSerialLine, new PuTTYControl(profileInfo))); + FileName = SettingsManager.Current.PuTTY_ApplicationFilePath, + Arguments = PuTTY.BuildCommandLine(sessionInfo) + }; - SelectedTabIndex = TabItems.Count - 1; - } + Process.Start(info); + } - public void AddTab(string host) - { - Connect(host); - } + private void Connect(PuTTYSessionInfo sessionInfo, string header = null) + { + // Must be added here. So that it works with profiles and the connect dialog. + sessionInfo.ApplicationFilePath = SettingsManager.Current.PuTTY_ApplicationFilePath; - // Modify history list - private static void AddHostToHistory(string host) - { - if (string.IsNullOrEmpty(host)) - return; + var tabId = Guid.NewGuid(); - SettingsManager.Current.PuTTY_HostHistory = new ObservableCollection(ListHelper.Modify(SettingsManager.Current.PuTTY_HostHistory.ToList(), host, SettingsManager.Current.General_HistoryListEntries)); - } + TabItems.Add(new DragablzTabItem(header ?? sessionInfo.HostOrSerialLine, new PuTTYControl(tabId, sessionInfo), + tabId)); - private static void AddSerialLineToHistory(string serialLine) - { - if (string.IsNullOrEmpty(serialLine)) - return; + // Select the added tab + SelectedTabIndex = TabItems.Count - 1; + } - SettingsManager.Current.PuTTY_SerialLineHistory = new ObservableCollection(ListHelper.Modify(SettingsManager.Current.PuTTY_SerialLineHistory.ToList(), serialLine, SettingsManager.Current.General_HistoryListEntries)); - } + public void AddTab(string host) + { + _ = Connect(host); + } - private static void AddPortToHistory(int port) - { - if (port == 0) - return; + // Modify history list + private static void AddHostToHistory(string host) + { + if (string.IsNullOrEmpty(host)) + return; - SettingsManager.Current.PuTTY_PortHistory = new ObservableCollection(ListHelper.Modify(SettingsManager.Current.PuTTY_PortHistory.ToList(), port.ToString(), SettingsManager.Current.General_HistoryListEntries)); - } + SettingsManager.Current.PuTTY_HostHistory = new ObservableCollection( + ListHelper.Modify(SettingsManager.Current.PuTTY_HostHistory.ToList(), host, + SettingsManager.Current.General_HistoryListEntries)); + } - private static void AddBaudToHistory(int baud) - { - if (baud == 0) - return; + private static void AddSerialLineToHistory(string serialLine) + { + if (string.IsNullOrEmpty(serialLine)) + return; - SettingsManager.Current.PuTTY_BaudHistory = new ObservableCollection(ListHelper.Modify(SettingsManager.Current.PuTTY_BaudHistory.ToList(), baud.ToString(), SettingsManager.Current.General_HistoryListEntries)); - } + SettingsManager.Current.PuTTY_SerialLineHistory = new ObservableCollection( + ListHelper.Modify(SettingsManager.Current.PuTTY_SerialLineHistory.ToList(), serialLine, + SettingsManager.Current.General_HistoryListEntries)); + } - private static void AddUsernameToHistory(string username) - { - if (string.IsNullOrEmpty(username)) - return; + private static void AddPortToHistory(int port) + { + if (port == 0) + return; - SettingsManager.Current.PuTTY_UsernameHistory = new ObservableCollection(ListHelper.Modify(SettingsManager.Current.PuTTY_UsernameHistory.ToList(), username, SettingsManager.Current.General_HistoryListEntries)); - } + SettingsManager.Current.PuTTY_PortHistory = new ObservableCollection( + ListHelper.Modify(SettingsManager.Current.PuTTY_PortHistory.ToList(), port.ToString(), + SettingsManager.Current.General_HistoryListEntries)); + } - private static void AddPrivateKeyToHistory(string privateKey) - { - if (string.IsNullOrEmpty(privateKey)) - return; + private static void AddBaudToHistory(int baud) + { + if (baud == 0) + return; - SettingsManager.Current.PuTTY_PrivateKeyFileHistory = new ObservableCollection(ListHelper.Modify(SettingsManager.Current.PuTTY_PrivateKeyFileHistory.ToList(), privateKey, SettingsManager.Current.General_HistoryListEntries)); - } + SettingsManager.Current.PuTTY_BaudHistory = new ObservableCollection( + ListHelper.Modify(SettingsManager.Current.PuTTY_BaudHistory.ToList(), baud.ToString(), + SettingsManager.Current.General_HistoryListEntries)); + } - private static void AddProfileToHistory(string profile) - { - if (string.IsNullOrEmpty(profile)) - return; + private static void AddUsernameToHistory(string username) + { + if (string.IsNullOrEmpty(username)) + return; - SettingsManager.Current.PuTTY_ProfileHistory = new ObservableCollection(ListHelper.Modify(SettingsManager.Current.PuTTY_ProfileHistory.ToList(), profile, SettingsManager.Current.General_HistoryListEntries)); - } + SettingsManager.Current.PuTTY_UsernameHistory = new ObservableCollection( + ListHelper.Modify(SettingsManager.Current.PuTTY_UsernameHistory.ToList(), username, + SettingsManager.Current.General_HistoryListEntries)); + } - private void StartDelayedSearch() - { - if (!IsSearching) - { - IsSearching = true; + private static void AddPrivateKeyToHistory(string privateKey) + { + if (string.IsNullOrEmpty(privateKey)) + return; - _searchDispatcherTimer.Start(); - } - else - { - _searchDispatcherTimer.Stop(); - _searchDispatcherTimer.Start(); - } - } + SettingsManager.Current.PuTTY_PrivateKeyFileHistory = new ObservableCollection( + ListHelper.Modify(SettingsManager.Current.PuTTY_PrivateKeyFileHistory.ToList(), privateKey, + SettingsManager.Current.General_HistoryListEntries)); + } - private void StopDelayedSearch() - { - _searchDispatcherTimer.Stop(); + private static void AddProfileToHistory(string profile) + { + if (string.IsNullOrEmpty(profile)) + return; - RefreshProfiles(); + SettingsManager.Current.PuTTY_ProfileHistory = new ObservableCollection( + ListHelper.Modify(SettingsManager.Current.PuTTY_ProfileHistory.ToList(), profile, + SettingsManager.Current.General_HistoryListEntries)); + } - IsSearching = false; - } + public void FocusEmbeddedWindow() + { + /* Don't continue if + - Search TextBox is focused + - Header ContextMenu is opened + - Profile ContextMenu is opened + */ + if (_textBoxSearchIsFocused || HeaderContextMenuIsOpen || ProfileContextMenuIsOpen) + return; - private void ResizeProfile(bool dueToChangedSize) - { - _canProfileWidthChange = false; + var window = Application.Current.Windows.OfType().FirstOrDefault(x => x.IsActive); - if (dueToChangedSize) - { - ExpandProfileView = Math.Abs(ProfileWidth.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > GlobalStaticConfiguration.FloatPointFix; - } - else - { - if (ExpandProfileView) - { - ProfileWidth = Math.Abs(_tempProfileWidth - GlobalStaticConfiguration.Profile_WidthCollapsed) < GlobalStaticConfiguration.FloatPointFix ? new GridLength(GlobalStaticConfiguration.Profile_DefaultWidthExpanded) : new GridLength(_tempProfileWidth); - } - else - { - _tempProfileWidth = ProfileWidth.Value; - ProfileWidth = new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); - } - } - - _canProfileWidthChange = true; - } + if (window == null) + return; - public void OnViewVisible() + // Find all TabablzControl in the active window + foreach (var tabablzControl in VisualTreeHelper.FindVisualChildren(window)) { - _isViewActive = true; + // Skip if no items + if (tabablzControl.Items.Count == 0) + continue; - RefreshProfiles(); - } + // Focus embedded window in the selected tab + (((DragablzTabItem)tabablzControl.SelectedItem)?.View as IEmbeddedWindow)?.FocusEmbeddedWindow(); - public void OnViewHide() - { - _isViewActive = false; + break; } + } - public void RefreshProfiles() - { - if (!_isViewActive) - return; + public override void OnViewVisible() + { + base.OnViewVisible(); - Profiles.Refresh(); - } + FocusEmbeddedWindow(); + } - public void OnProfileDialogOpen() - { - ConfigurationManager.Current.FixAirspace = true; - } + private void WriteDefaultProfileToRegistry() + { + if (!IsExecutableConfigured) + return; - public void OnProfileDialogClose() - { - ConfigurationManager.Current.FixAirspace = false; - } - #endregion + Log.Debug("Write PuTTY profile to registry..."); - #region Event - private void ProfileManager_OnProfilesUpdated(object sender, EventArgs e) - { - RefreshProfiles(); - } + PuTTY.WriteDefaultProfileToRegistry(SettingsManager.Current.Appearance_Theme); + } + + #endregion - private void SearchDispatcherTimer_Tick(object sender, EventArgs e) + #region Event + + private void SettingsManager_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + switch (e.PropertyName) { - StopDelayedSearch(); + case nameof(SettingsInfo.PuTTY_ApplicationFilePath): + CheckExecutable(); + break; + case nameof(SettingsInfo.Appearance_Theme): + WriteDefaultProfileToRegistry(); + break; } - #endregion } -} \ No newline at end of file + + #endregion +} diff --git a/Source/NETworkManager/ViewModels/PuTTYSettingsViewModel.cs b/Source/NETworkManager/ViewModels/PuTTYSettingsViewModel.cs index 6e25bbdce6..1e8a387099 100644 --- a/Source/NETworkManager/ViewModels/PuTTYSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/PuTTYSettingsViewModel.cs @@ -1,520 +1,500 @@ -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.Settings; -using NETworkManager.Utilities; -using System; +using System; +using System.Collections.Generic; using System.Diagnostics; using System.IO; -using System.Windows.Input; -using NETworkManager.Models.PuTTY; -using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using System.Windows.Forms; +using System.Windows.Input; +using NETworkManager.Localization.Resources; +using NETworkManager.Models.PuTTY; +using NETworkManager.Settings; +using NETworkManager.Utilities; +using PuTTY = NETworkManager.Settings.Application.PuTTY; -namespace NETworkManager.ViewModels -{ - public class PuTTYSettingsViewModel : ViewModelBase - { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; +namespace NETworkManager.ViewModels; - public bool IsPortable => ConfigurationManager.Current.IsPortable; +public class PuTTYSettingsViewModel : ViewModelBase +{ + #region Variables + public bool IsPortable => ConfigurationManager.Current.IsPortable; - public string PortableLogPath => Settings.Application.PuTTY.PortableLogPath; + public string PortableLogPath => PuTTY.PortableLogPath; - private readonly bool _isLoading; + private readonly bool _isLoading; - private string _applicationFilePath; - public string ApplicationFilePath + public string ApplicationFilePath + { + get; + set { - get => _applicationFilePath; - set - { - if (value == _applicationFilePath) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.PuTTY_ApplicationFilePath = value; + if (!_isLoading) + SettingsManager.Current.PuTTY_ApplicationFilePath = value; - IsConfigured = !string.IsNullOrEmpty(value); + IsConfigured = !string.IsNullOrEmpty(value); - _applicationFilePath = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isConfigured; - public bool IsConfigured + public bool IsConfigured + { + get; + set { - get => _isConfigured; - set - { - if (value == _isConfigured) - return; - - _isConfigured = value; - OnPropertyChanged(); - } + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - private bool _useSSH; - public bool UseSSH + public bool UseSSH + { + get; + set { - get => _useSSH; - set - { - if (value == _useSSH) - return; - - if (value) - SettingsManager.Current.PuTTY_DefaultConnectionMode = ConnectionMode.SSH; - - _useSSH = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (value) + SettingsManager.Current.PuTTY_DefaultConnectionMode = ConnectionMode.SSH; + + field = value; + OnPropertyChanged(); } + } - private bool _useTelnet; - public bool UseTelnet + public bool UseTelnet + { + get; + set { - get => _useTelnet; - set - { - if (value == _useTelnet) - return; - - if (value) - SettingsManager.Current.PuTTY_DefaultConnectionMode = ConnectionMode.Telnet; - - _useTelnet = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (value) + SettingsManager.Current.PuTTY_DefaultConnectionMode = ConnectionMode.Telnet; + + field = value; + OnPropertyChanged(); } + } - private bool _useSerial; - public bool UseSerial + public bool UseSerial + { + get; + set { - get => _useSerial; - set - { - if (value == _useSerial) - return; - - if (value) - SettingsManager.Current.PuTTY_DefaultConnectionMode = ConnectionMode.Serial; - - _useSerial = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (value) + SettingsManager.Current.PuTTY_DefaultConnectionMode = ConnectionMode.Serial; + + field = value; + OnPropertyChanged(); } + } - private bool _useRlogin; - public bool UseRlogin + public bool UseRlogin + { + get; + set { - get => _useRlogin; - set - { - if (value == _useRlogin) - return; - - if (value) - SettingsManager.Current.PuTTY_DefaultConnectionMode = ConnectionMode.Rlogin; - - _useRlogin = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (value) + SettingsManager.Current.PuTTY_DefaultConnectionMode = ConnectionMode.Rlogin; + + field = value; + OnPropertyChanged(); } + } - private bool _useRAW; - public bool UseRAW + public bool UseRAW + { + get; + set { - get => _useRAW; - set - { - if (value == _useRAW) - return; - - if (value) - SettingsManager.Current.PuTTY_DefaultConnectionMode = ConnectionMode.RAW; - - _useRAW = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (value) + SettingsManager.Current.PuTTY_DefaultConnectionMode = ConnectionMode.RAW; + + field = value; + OnPropertyChanged(); } + } - private string _username; - public string Username + public string Username + { + get; + set { - get => _username; - set - { - if (value == _username) - return; - - if (!_isLoading) - SettingsManager.Current.PuTTY_Username = value; - - _username = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.PuTTY_Username = value; + + field = value; + OnPropertyChanged(); } + } - private string _privateKeyFile; - public string PrivateKeyFile + public string PrivateKeyFile + { + get; + set { - get => _privateKeyFile; - set - { - if (value == _privateKeyFile) - return; - - if (!_isLoading) - SettingsManager.Current.PuTTY_PrivateKeyFile = value; - - _privateKeyFile = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.PuTTY_PrivateKeyFile = value; + + field = value; + OnPropertyChanged(); } + } - private string _profile; - public string Profile + public string Profile + { + get; + set { - get => _profile; - set - { - if (value == _profile) - return; - - if (!_isLoading) - SettingsManager.Current.PuTTY_Profile = value; - - _profile = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.PuTTY_Profile = value; + + field = value; + OnPropertyChanged(); } + } - private bool _enableLog; - public bool EnableLog + public bool EnableLog + { + get; + set { - get => _enableLog; - set - { - if (value == _enableLog) - return; - - if (!_isLoading) - SettingsManager.Current.PuTTY_EnableSessionLog = value; - - _enableLog = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.PuTTY_EnableSessionLog = value; + + field = value; + OnPropertyChanged(); } + } - public IEnumerable LogModes => Enum.GetValues(typeof(LogMode)).Cast(); + public IEnumerable LogModes => Enum.GetValues(typeof(LogMode)).Cast(); - private LogMode _logMode; - public LogMode LogMode + public LogMode LogMode + { + get; + set { - get => _logMode; - set - { - if (Equals(value, _logMode)) - return; - - if (!_isLoading) - SettingsManager.Current.PuTTY_LogMode = value; - - _logMode = value; - OnPropertyChanged(); - } + if (Equals(value, field)) + return; + + if (!_isLoading) + SettingsManager.Current.PuTTY_LogMode = value; + + field = value; + OnPropertyChanged(); } + } - private string _logPath; - public string LogPath + public string LogPath + { + get; + set { - get => _logPath; - set - { - if (value == _logPath) - return; - - if (!_isLoading) - SettingsManager.Current.PuTTY_LogPath = value; - - _logPath = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.PuTTY_LogPath = value; + + field = value; + OnPropertyChanged(); } + } - private string _logFileName; - public string LogFileName + public string LogFileName + { + get; + set { - get => _logFileName; - set - { - if (value == _logFileName) - return; - - if (!_isLoading) - SettingsManager.Current.PuTTY_LogFileName = value; - - _logFileName = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.PuTTY_LogFileName = value; + + field = value; + OnPropertyChanged(); } + } - private string _additionalCommandLine; - public string AdditionalCommandLine + public string AdditionalCommandLine + { + get; + set { - get => _additionalCommandLine; - set - { - if (value == _additionalCommandLine) - return; - - if (!_isLoading) - SettingsManager.Current.PuTTY_AdditionalCommandLine = value; - - _additionalCommandLine = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.PuTTY_AdditionalCommandLine = value; + + field = value; + OnPropertyChanged(); } + } - private string _serialLine; - public string SerialLine + public string SerialLine + { + get; + set { - get => _serialLine; - set - { - if (value == _serialLine) - return; - - if (!_isLoading) - SettingsManager.Current.PuTTY_SerialLine = value; - - _serialLine = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.PuTTY_SerialLine = value; + + field = value; + OnPropertyChanged(); } + } - private int _sshPort; - public int SSHPort + public int SSHPort + { + get; + set { - get => _sshPort; - set - { - if (value == _sshPort) - return; - - if (!_isLoading) - SettingsManager.Current.PuTTY_SSHPort = value; - - _sshPort = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.PuTTY_SSHPort = value; + + field = value; + OnPropertyChanged(); } + } - private int _telnetPort; - public int TelnetPort + public int TelnetPort + { + get; + set { - get => _telnetPort; - set - { - if (value == _telnetPort) - return; - - if (!_isLoading) - SettingsManager.Current.PuTTY_TelnetPort = value; - - _telnetPort = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.PuTTY_TelnetPort = value; + + field = value; + OnPropertyChanged(); } + } - private int _baudRate; - public int BaudRate + public int BaudRate + { + get; + set { - get => _baudRate; - set - { - if (value == _baudRate) - return; - - if (!_isLoading) - SettingsManager.Current.PuTTY_BaudRate = value; - - _baudRate = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.PuTTY_BaudRate = value; + + field = value; + OnPropertyChanged(); } + } - private int _rloginPort; - public int RloginPort + public int RloginPort + { + get; + set { - get => _rloginPort; - set - { - if (value == _rloginPort) - return; - - if (!_isLoading) - SettingsManager.Current.PuTTY_RloginPort = value; - - _rloginPort = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.PuTTY_RloginPort = value; + + field = value; + OnPropertyChanged(); } - #endregion + } - #region Contructor, load settings - public PuTTYSettingsViewModel(IDialogCoordinator instance) - { - _isLoading = true; + #endregion - _dialogCoordinator = instance; + #region Contructor, load settings - LoadSettings(); + public PuTTYSettingsViewModel() + { + _isLoading = true; - _isLoading = false; - } + LoadSettings(); + + _isLoading = false; + } - private void LoadSettings() + private void LoadSettings() + { + ApplicationFilePath = SettingsManager.Current.PuTTY_ApplicationFilePath; + + switch (SettingsManager.Current.PuTTY_DefaultConnectionMode) { - ApplicationFilePath = SettingsManager.Current.PuTTY_ApplicationFilePath; - - switch (SettingsManager.Current.PuTTY_DefaultConnectionMode) - { - case ConnectionMode.SSH: - UseSSH = true; - break; - case ConnectionMode.Telnet: - UseTelnet = true; - break; - case ConnectionMode.Serial: - UseSerial = true; - break; - case ConnectionMode.Rlogin: - UseRlogin = true; - break; - case ConnectionMode.RAW: - UseRAW = true; - break; - } - - IsConfigured = File.Exists(ApplicationFilePath); - Username = SettingsManager.Current.PuTTY_Username; - PrivateKeyFile = SettingsManager.Current.PuTTY_PrivateKeyFile; - Profile = SettingsManager.Current.PuTTY_Profile; - EnableLog = SettingsManager.Current.PuTTY_EnableSessionLog; - LogMode = LogModes.FirstOrDefault(x => x == SettingsManager.Current.PuTTY_LogMode); - LogPath = SettingsManager.Current.PuTTY_LogPath; - LogFileName = SettingsManager.Current.PuTTY_LogFileName; - AdditionalCommandLine = SettingsManager.Current.PuTTY_AdditionalCommandLine; - SerialLine = SettingsManager.Current.PuTTY_SerialLine; - SSHPort = SettingsManager.Current.PuTTY_SSHPort; - TelnetPort = SettingsManager.Current.PuTTY_TelnetPort; - BaudRate = SettingsManager.Current.PuTTY_BaudRate; - RloginPort = SettingsManager.Current.PuTTY_RloginPort; + case ConnectionMode.SSH: + UseSSH = true; + break; + case ConnectionMode.Telnet: + UseTelnet = true; + break; + case ConnectionMode.Serial: + UseSerial = true; + break; + case ConnectionMode.Rlogin: + UseRlogin = true; + break; + case ConnectionMode.RAW: + UseRAW = true; + break; } - #endregion - #region ICommands & Actions - public ICommand ApplicationBrowseFileCommand => new RelayCommand(p => ApplicationBrowseFileAction()); + IsConfigured = File.Exists(ApplicationFilePath); + Username = SettingsManager.Current.PuTTY_Username; + PrivateKeyFile = SettingsManager.Current.PuTTY_PrivateKeyFile; + Profile = SettingsManager.Current.PuTTY_Profile; + EnableLog = SettingsManager.Current.PuTTY_EnableSessionLog; + LogMode = LogModes.FirstOrDefault(x => x == SettingsManager.Current.PuTTY_LogMode); + LogPath = SettingsManager.Current.PuTTY_LogPath; + LogFileName = SettingsManager.Current.PuTTY_LogFileName; + AdditionalCommandLine = SettingsManager.Current.PuTTY_AdditionalCommandLine; + SerialLine = SettingsManager.Current.PuTTY_SerialLine; + SSHPort = SettingsManager.Current.PuTTY_SSHPort; + TelnetPort = SettingsManager.Current.PuTTY_TelnetPort; + BaudRate = SettingsManager.Current.PuTTY_BaudRate; + RloginPort = SettingsManager.Current.PuTTY_RloginPort; + } - private void ApplicationBrowseFileAction() - { - var openFileDialog = new System.Windows.Forms.OpenFileDialog - { - Filter = GlobalStaticConfiguration.ApplicationFileExtensionFilter - }; + #endregion - if (openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) - ApplicationFilePath = openFileDialog.FileName; - } + #region ICommands & Actions - public ICommand ConfigureCommand => new RelayCommand(p => ConfigureAction()); + public ICommand ApplicationBrowseFileCommand => new RelayCommand(_ => ApplicationBrowseFileAction()); - private void ConfigureAction() + private void ApplicationBrowseFileAction() + { + var openFileDialog = new OpenFileDialog { - Configure(); - } + Filter = GlobalStaticConfiguration.ApplicationFileExtensionFilter + }; + + if (openFileDialog.ShowDialog() == DialogResult.OK) + ApplicationFilePath = openFileDialog.FileName; + } + + public ICommand ConfigureCommand => new RelayCommand(_ => ConfigureAction()); + + private void ConfigureAction() + { + _ = Configure(); + } - public ICommand PrivateKeyFileBrowseFileCommand => new RelayCommand(p => PrivateKeyFileBrowseFileAction()); + public ICommand PrivateKeyFileBrowseFileCommand => new RelayCommand(_ => PrivateKeyFileBrowseFileAction()); - private void PrivateKeyFileBrowseFileAction() + private void PrivateKeyFileBrowseFileAction() + { + var openFileDialog = new OpenFileDialog { - var openFileDialog = new System.Windows.Forms.OpenFileDialog - { - Filter = GlobalStaticConfiguration.PuTTYPrivateKeyFileExtensionFilter - }; + Filter = GlobalStaticConfiguration.PuTTYPrivateKeyFileExtensionFilter + }; - if (openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) - PrivateKeyFile = openFileDialog.FileName; - } + if (openFileDialog.ShowDialog() == DialogResult.OK) + PrivateKeyFile = openFileDialog.FileName; + } - public ICommand LogPathBrowseFolderCommand => new RelayCommand(p => LogPathBrowseFolderAction()); + public ICommand LogPathBrowseFolderCommand => new RelayCommand(_ => LogPathBrowseFolderAction()); - private void LogPathBrowseFolderAction() + private void LogPathBrowseFolderAction() + { + var openFolderDialog = new FolderBrowserDialog { - var openFolderDialog = new System.Windows.Forms.FolderBrowserDialog - { - ShowNewFolderButton = true - }; + ShowNewFolderButton = true + }; - if (openFolderDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) - LogPath = openFolderDialog.SelectedPath; - } - #endregion + if (openFolderDialog.ShowDialog() == DialogResult.OK) + LogPath = openFolderDialog.SelectedPath; + } + + #endregion + + #region Methods - #region Methods - private async Task Configure() + private async Task Configure() + { + try { - try - { - Process.Start(SettingsManager.Current.PuTTY_ApplicationFilePath); - } - catch (Exception ex) - { - var settings = AppearanceManager.MetroDialog; - - settings.AffirmativeButtonText = Localization.Resources.Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Error, ex.Message, MessageDialogStyle.Affirmative, settings); - } + Process.Start(SettingsManager.Current.PuTTY_ApplicationFilePath); } - - /// - /// Method to set the from drag and drop. - /// - /// Path to the file. - public void SetApplicationFilePathFromDragDrop(string filePath) + catch (Exception ex) { - ApplicationFilePath = filePath; - - OnPropertyChanged(nameof(ApplicationFilePath)); + await DialogHelper.ShowMessageAsync(System.Windows.Application.Current.MainWindow, Strings.Error, ex.Message, ChildWindowIcon.Error); } + } - /// - /// Method to set the drag drop. - /// - /// Path to the file. - public void SetPrivateKeyFilePathFromDragDrop(string filePath) - { - PrivateKeyFile = filePath; + /// + /// Method to set the from drag and drop. + /// + /// Path to the file. + public void SetApplicationFilePathFromDragDrop(string filePath) + { + ApplicationFilePath = filePath; - OnPropertyChanged(nameof(PrivateKeyFile)); - } + OnPropertyChanged(nameof(ApplicationFilePath)); + } - /// - /// Method to set the from drag and drop. - /// - /// Path to the folder. - public void SetLogPathFolderPathFromDragDrop(string folderPath) - { - LogPath = folderPath; + /// + /// Method to set the drag drop. + /// + /// Path to the file. + public void SetPrivateKeyFilePathFromDragDrop(string filePath) + { + PrivateKeyFile = filePath; - OnPropertyChanged(nameof(LogPath)); - } - #endregion + OnPropertyChanged(nameof(PrivateKeyFile)); + } + + /// + /// Method to set the from drag and drop. + /// + /// Path to the folder. + public void SetLogPathFolderPathFromDragDrop(string folderPath) + { + LogPath = folderPath; + + OnPropertyChanged(nameof(LogPath)); } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/RemoteDesktopConnectViewModel.cs b/Source/NETworkManager/ViewModels/RemoteDesktopConnectViewModel.cs index 77218ecfb0..a986e969cc 100644 --- a/Source/NETworkManager/ViewModels/RemoteDesktopConnectViewModel.cs +++ b/Source/NETworkManager/ViewModels/RemoteDesktopConnectViewModel.cs @@ -1,4 +1,4 @@ -using NETworkManager.Settings; +using NETworkManager.Settings; using NETworkManager.Utilities; using System; using System.ComponentModel; @@ -6,110 +6,193 @@ using System.Windows.Data; using System.Windows.Input; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +public class RemoteDesktopConnectViewModel : ViewModelBase { - public class RemoteDesktopConnectViewModel : ViewModelBase + #region Variables + + public bool ConnectAs + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public string Name + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public string Host { - public ICommand ConnectCommand { get; } + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } - public ICommand CancelCommand { get; } + public ICollectionView HostHistoryView { get; } - private bool _connectAs; - public bool ConnectAs + public bool UseCredentials + { + get; + set { - get => _connectAs; - set - { - if (value == _connectAs) - return; - - _connectAs = value; - OnPropertyChanged(); - } + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - private string _name; - public string Name + public string Domain + { + get; + set { - get => _name; - set - { - if (value == _name) - return; - - _name = value; - OnPropertyChanged(); - } + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - private string _host; - public string Host + public string Username + { + get; + set { - get => _host; - set - { - if (value == _host) - return; - - _host = value; - OnPropertyChanged(); - } + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } + + public bool IsPasswordEmpty + { + get; + set + { + if (value == field) + return; - public ICollectionView HostHistoryView { get; } + field = value; + OnPropertyChanged(); + } + } = true; - private bool _useCredentials; - public bool UseCredentials + public SecureString Password + { + get; + set { - get => _useCredentials; - set - { - if (value == _useCredentials) - return; - - _useCredentials = value; - OnPropertyChanged(); - } + if (value == field) + return; + + field = value; + + ValidatePassword(); + + OnPropertyChanged(); } - - private string _username; - public string Username + } = new(); + + public bool AdminSession + { + get; + set { - get => _username; - set - { - if (value == _username) - return; - - _username = value; - OnPropertyChanged(); - } + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - private SecureString _password = new SecureString(); - public SecureString Password + public bool ViewOnly + { + get; + set { - get => _password; - set - { - if (value == _password) - return; - - _password = value; - OnPropertyChanged(); - } + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } = SettingsManager.Current.RemoteDesktop_ViewOnly; + + #endregion - - public RemoteDesktopConnectViewModel(Action connectCommand, Action cancelHandler, bool connectAs = false) + #region Constructor + + public RemoteDesktopConnectViewModel(Action connectCommand, + Action cancelHandler, + (string Name, string Host, bool AdminSession, bool ViewOnly)? connectAsOptions = null) + { + ConnectCommand = new RelayCommand(_ => connectCommand(this)); + CancelCommand = new RelayCommand(_ => cancelHandler(this)); + + if (connectAsOptions == null) { - ConnectCommand = new RelayCommand(p => connectCommand(this)); - CancelCommand = new RelayCommand(p => cancelHandler(this)); + HostHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.RemoteDesktop_HostHistory); + } + else + { + ConnectAs = true; + + UseCredentials = true; - ConnectAs = connectAs; + Name = connectAsOptions.Value.Name; + Host = connectAsOptions.Value.Host; - if (!ConnectAs) - HostHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.RemoteDesktop_HostHistory); + AdminSession = connectAsOptions.Value.AdminSession; + ViewOnly = connectAsOptions.Value.ViewOnly; } } -} + + #endregion + + #region Commands + + public ICommand ConnectCommand { get; } + + public ICommand CancelCommand { get; } + #endregion + + #region Methods + + /// + /// Check if the passwords are valid. + /// + private void ValidatePassword() + { + IsPasswordEmpty = Password == null || Password.Length == 0; + } + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/RemoteDesktopHostViewModel.cs b/Source/NETworkManager/ViewModels/RemoteDesktopHostViewModel.cs index 445894d8d2..1de5001b77 100644 --- a/Source/NETworkManager/ViewModels/RemoteDesktopHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/RemoteDesktopHostViewModel.cs @@ -1,589 +1,408 @@ -using System.Collections.ObjectModel; -using NETworkManager.Controls; using Dragablz; -using MahApps.Metro.Controls.Dialogs; -using System.Windows.Input; -using NETworkManager.Views; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Models; +using NETworkManager.Models.RemoteDesktop; +using NETworkManager.Profiles; using NETworkManager.Settings; -using System.ComponentModel; -using System.Windows.Data; +using NETworkManager.Utilities; +using NETworkManager.Views; using System; -using System.Linq; +using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Diagnostics; -using NETworkManager.Utilities; -using System.Windows; -using NETworkManager.Models.RemoteDesktop; -using NETworkManager.Profiles; -using System.Windows.Threading; -using NETworkManager.Models; +using System.Linq; using System.Threading.Tasks; -using System.Collections.Generic; +using System.Windows; +using System.Windows.Input; +using RemoteDesktop = NETworkManager.Profiles.Application.RemoteDesktop; -namespace NETworkManager.ViewModels -{ - public class RemoteDesktopHostViewModel : ViewModelBase, IProfileManager - { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - private readonly DispatcherTimer _searchDispatcherTimer = new DispatcherTimer(); +namespace NETworkManager.ViewModels; - public IInterTabClient InterTabClient { get; } - public ObservableCollection TabItems { get; } +public class RemoteDesktopHostViewModel : ProfileHostViewModelBase +{ + #region Variables - private readonly bool _isLoading = true; - private bool _isViewActive = true; + public IInterTabClient InterTabClient { get; } - private int _selectedTabIndex; - public int SelectedTabIndex + public string InterTabPartition + { + get; + set { - get => _selectedTabIndex; - set - { - if (value == _selectedTabIndex) - return; + if (value == field) + return; - _selectedTabIndex = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - #region Profiles - public ICollectionView Profiles { get; } + public ObservableCollection TabItems { get; } - private ProfileInfo _selectedProfile = new ProfileInfo(); - public ProfileInfo SelectedProfile + public int SelectedTabIndex + { + get; + set { - get => _selectedProfile; - set - { - if (value == _selectedProfile) - return; + if (value == field) + return; - _selectedProfile = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _search; - public string Search - { - get => _search; - set - { - if (value == _search) - return; - - _search = value; + #endregion - StartDelayedSearch(); + #region Constructor - OnPropertyChanged(); - } - } + public RemoteDesktopHostViewModel() + { + InterTabClient = new DragablzInterTabClient(ApplicationName.RemoteDesktop); + InterTabPartition = nameof(ApplicationName.RemoteDesktop); - private bool _isSearching; - public bool IsSearching - { - get => _isSearching; - set - { - if (value == _isSearching) - return; + TabItems = []; - _isSearching = value; - OnPropertyChanged(); - } - } + InitializeProfileHost(); + } - private bool _canProfileWidthChange = true; - private double _tempProfileWidth; + #endregion - private bool _expandProfileView; - public bool ExpandProfileView - { - get => _expandProfileView; - set - { - if (value == _expandProfileView) - return; + #region Profile host - if (!_isLoading) - SettingsManager.Current.RemoteDesktop_ExpandProfileView = value; + protected override ApplicationName ApplicationName => ApplicationName.RemoteDesktop; - _expandProfileView = value; + protected override bool IsProfileEnabled(ProfileInfo profile) => profile.RemoteDesktop_Enabled; - if (_canProfileWidthChange) - ResizeProfile(false); + protected override string GetSearchableField(ProfileInfo profile) => profile.RemoteDesktop_Host; - OnPropertyChanged(); - } - } + public override void OnProfileManagerDialogOpen() + { + ConfigurationManager.OnDialogOpen(); + } - private GridLength _profileWidth; - public GridLength ProfileWidth - { - get => _profileWidth; - set - { - if (value == _profileWidth) - return; + public override void OnProfileManagerDialogClose() + { + ConfigurationManager.OnDialogClose(); + } - if (!_isLoading && Math.Abs(value.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > GlobalStaticConfiguration.FloatPointFix) // Do not save the size when collapsed - SettingsManager.Current.RemoteDesktop_ProfileWidth = value.Value; + #endregion - _profileWidth = value; + #region ICommand & Actions - if (_canProfileWidthChange) - ResizeProfile(true); + public ICommand ConnectCommand => new RelayCommand(_ => ConnectAction()); - OnPropertyChanged(); - } - } - #endregion - #endregion + private void ConnectAction() + { + _ = Connect(); + } - #region Constructor, load settings - public RemoteDesktopHostViewModel(IDialogCoordinator instance) - { - _dialogCoordinator = instance; + private bool IsConnected_CanExecute(object view) + { + if (view is RemoteDesktopControl control) + return control.IsConnected; - InterTabClient = new DragablzInterTabClient(ApplicationName.RemoteDesktop); + return false; + } - TabItems = new ObservableCollection(); + private bool IsDisconnected_CanExecute(object view) + { + if (view is RemoteDesktopControl control) + return !control.IsConnected && !control.IsConnecting; - Profiles = new CollectionViewSource { Source = ProfileManager.Groups.SelectMany(x => x.Profiles) }.View; - Profiles.GroupDescriptions.Add(new PropertyGroupDescription(nameof(ProfileInfo.Group))); - Profiles.SortDescriptions.Add(new SortDescription(nameof(ProfileInfo.Group), ListSortDirection.Ascending)); - Profiles.SortDescriptions.Add(new SortDescription(nameof(ProfileInfo.Name), ListSortDirection.Ascending)); - Profiles.Filter = o => - { - if (!(o is ProfileInfo info)) - return false; + return false; + } - if (string.IsNullOrEmpty(Search)) - return info.RemoteDesktop_Enabled; + // Used to block actions that would bypass view-only mode (e.g. fullscreen, Ctrl+Alt+Del). + private bool IsConnectedAndNotViewOnly_CanExecute(object view) + { + if (view is RemoteDesktopControl control) + return control.IsConnected && !control.IsViewOnly; - var search = Search.Trim(); + return false; + } - // Search by: Tag=xxx (exact match, ignore case) - /* - if (search.StartsWith(ProfileManager.TagIdentifier, StringComparison.OrdinalIgnoreCase)) - return !string.IsNullOrEmpty(info.Tags) && info.RemoteDesktop_Enabled && info.Tags.Replace(" ", "").Split(';').Any(str => search.Substring(ProfileManager.TagIdentifier.Length, search.Length - ProfileManager.TagIdentifier.Length).Equals(str, StringComparison.OrdinalIgnoreCase)); - */ + public ICommand ReconnectCommand => new RelayCommand(ReconnectAction, IsDisconnected_CanExecute); - // Search by: Name, RemoteDesktop_Host - return info.RemoteDesktop_Enabled && (info.Name.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1 || info.RemoteDesktop_Host.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1); - }; + private void ReconnectAction(object view) + { + if (view is RemoteDesktopControl control) + if (control.ReconnectCommand.CanExecute(null)) + control.ReconnectCommand.Execute(null); + } - // This will select the first entry as selected item... - SelectedProfile = Profiles.SourceCollection.Cast().Where(x => x.RemoteDesktop_Enabled).OrderBy(x => x.Group).ThenBy(x => x.Name).FirstOrDefault(); + public ICommand DisconnectCommand => new RelayCommand(DisconnectAction, IsConnected_CanExecute); - ProfileManager.OnProfilesUpdated += ProfileManager_OnProfilesUpdated; + private void DisconnectAction(object view) + { + if (view is RemoteDesktopControl control) + if (control.DisconnectCommand.CanExecute(null)) + control.DisconnectCommand.Execute(null); + } - _searchDispatcherTimer.Interval = GlobalStaticConfiguration.SearchDispatcherTimerTimeSpan; - _searchDispatcherTimer.Tick += SearchDispatcherTimer_Tick; + public ICommand FullscreenCommand => new RelayCommand(FullscreenAction, IsConnectedAndNotViewOnly_CanExecute); - LoadSettings(); + private void FullscreenAction(object view) + { + if (view is RemoteDesktopControl control) + control.FullScreen(); + } - _isLoading = false; - } + public ICommand ViewOnlyCommand => new RelayCommand(ViewOnlyAction, IsConnected_CanExecute); - private void LoadSettings() - { - ExpandProfileView = SettingsManager.Current.RemoteDesktop_ExpandProfileView; + private void ViewOnlyAction(object view) + { + if (view is RemoteDesktopControl control) + control.ToggleViewOnly(); + } - ProfileWidth = ExpandProfileView ? new GridLength(SettingsManager.Current.RemoteDesktop_ProfileWidth) : new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); + public ICommand AdjustScreenCommand => new RelayCommand(AdjustScreenAction, IsConnected_CanExecute); - _tempProfileWidth = SettingsManager.Current.RemoteDesktop_ProfileWidth; - } - #endregion + private void AdjustScreenAction(object view) + { + if (view is RemoteDesktopControl control) + control.AdjustScreen(force: true); + } - #region ICommand & Actions - public ICommand ConnectCommand => new RelayCommand(p => ConnectAction()); + public ICommand SendCtrlAltDelCommand => + new RelayCommand(view => SendKeyAction(view, Keystroke.CtrlAltDel), IsConnectedAndNotViewOnly_CanExecute); - private void ConnectAction() - { - Connect(); - } + public ICommand SendTaskManagerCommand => + new RelayCommand(view => SendKeyAction(view, Keystroke.TaskManager), IsConnectedAndNotViewOnly_CanExecute); - private bool RemoteDesktop_Disconnected_CanExecute(object view) - { - if (view is RemoteDesktopControl control) - return !control.IsConnected; + public ICommand SendLockCommand => + new RelayCommand(view => SendKeyAction(view, Keystroke.Lock), IsConnectedAndNotViewOnly_CanExecute); - return false; - } + public ICommand SendShowDesktopCommand => + new RelayCommand(view => SendKeyAction(view, Keystroke.ShowDesktop), IsConnectedAndNotViewOnly_CanExecute); - private bool RemoteDesktop_Connected_CanExecute(object view) - { - if (view is RemoteDesktopControl control) - return control.IsConnected; + public ICommand SendExplorerCommand => + new RelayCommand(view => SendKeyAction(view, Keystroke.Explorer), IsConnectedAndNotViewOnly_CanExecute); - return false; - } + public ICommand SendRunDialogCommand => + new RelayCommand(view => SendKeyAction(view, Keystroke.RunDialog), IsConnectedAndNotViewOnly_CanExecute); - public ICommand RemoteDesktop_ReconnectCommand => new RelayCommand(RemoteDesktop_ReconnectAction, RemoteDesktop_Disconnected_CanExecute); + private async void SendKeyAction(object view, Keystroke keystroke) + { + if (view is not RemoteDesktopControl control) + return; - private void RemoteDesktop_ReconnectAction(object view) + try { - if (view is RemoteDesktopControl control) - { - if (control.ReconnectCommand.CanExecute(null)) - control.ReconnectCommand.Execute(null); - } + control.SendKey(keystroke); } - - public ICommand RemoteDesktop_DisconnectCommand => new RelayCommand(RemoteDesktop_DisconnectAction, RemoteDesktop_Connected_CanExecute); - - private void RemoteDesktop_DisconnectAction(object view) + catch (Exception ex) { - if (view is RemoteDesktopControl control) - { - if (control.DisconnectCommand.CanExecute(null)) - control.DisconnectCommand.Execute(null); - } - } + ConfigurationManager.OnDialogOpen(); - public ICommand RemoteDesktop_FullscreenCommand => new RelayCommand(RemoteDesktop_FullscreenAction, RemoteDesktop_Connected_CanExecute); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + $"{Strings.CouldNotSendKeystroke}\n\nMessage:\n{ex.Message}", ChildWindowIcon.Error); - private void RemoteDesktop_FullscreenAction(object view) - { - if (view is RemoteDesktopControl control) - control.FullScreen(); + ConfigurationManager.OnDialogClose(); } + } - public ICommand RemoteDesktop_AdjustScreenCommand => new RelayCommand(RemoteDesktop_AdjustScreenAction, RemoteDesktop_Connected_CanExecute); - - private void RemoteDesktop_AdjustScreenAction(object view) - { - if (view is RemoteDesktopControl control) - control.AdjustScreen(); - } + public ICommand ConnectProfileCommand => new RelayCommand(_ => ConnectProfileAction(), ConnectProfile_CanExecute); - public ICommand RemoteDesktop_SendCtrlAltDelCommand => new RelayCommand(RemoteDesktop_SendCtrlAltDelAction, RemoteDesktop_Connected_CanExecute); + private bool ConnectProfile_CanExecute(object obj) + { + return !IsSearching && SelectedProfile != null; + } - private async void RemoteDesktop_SendCtrlAltDelAction(object view) - { - if (view is RemoteDesktopControl control) - { - try - { - control.SendKey(Keystroke.CtrlAltDel); - } - catch (Exception ex) - { - ConfigurationManager.Current.FixAirspace = true; - - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Error, string.Format("{0}\n\nMessage:\n{1}", Localization.Resources.Strings.CouldNotSendKeystroke, ex.Message, MessageDialogStyle.Affirmative, AppearanceManager.MetroDialog)); - - ConfigurationManager.Current.FixAirspace = false; - } - } - } + private void ConnectProfileAction() + { + ConnectProfile(); + } - public ICommand ConnectProfileCommand => new RelayCommand(p => ConnectProfileAction(), ConnectProfile_CanExecute); + public ICommand ConnectProfileAsCommand => new RelayCommand(_ => ConnectProfileAsAction()); - private bool ConnectProfile_CanExecute(object obj) - { - return !IsSearching && SelectedProfile != null; - } + private void ConnectProfileAsAction() + { + _ = ConnectProfileAs(); + } - private void ConnectProfileAction() - { - ConnectProfile(); - } + public ICommand ConnectProfileExternalCommand => new RelayCommand(_ => ConnectProfileExternalAction()); - public ICommand ConnectProfileAsCommand => new RelayCommand(p => ConnectProfileAsAction()); + private void ConnectProfileExternalAction() + { + var args = new List(); - private void ConnectProfileAsAction() - { - ConnectProfileAs(); - } + if (SelectedProfile.RemoteDesktop_AdminSession) + args.Add("/admin"); - public ICommand ConnectProfileExternalCommand => new RelayCommand(p => ConnectProfileExternalAction()); + args.Add($"/V:{SelectedProfile.RemoteDesktop_Host}"); - private void ConnectProfileExternalAction() - { - Process.Start("mstsc.exe", $"/V:{SelectedProfile.RemoteDesktop_Host}"); - } + Process.Start("mstsc.exe", args); + } - public ICommand AddProfileCommand => new RelayCommand(p => AddProfileAction()); + public ItemActionCallback CloseItemCommand => CloseItemAction; - private void AddProfileAction() - { - ProfileDialogManager.ShowAddProfileDialog(this, _dialogCoordinator); - } + private static void CloseItemAction(ItemActionCallbackArgs args) + { + ((args.DragablzItem.Content as DragablzTabItem)?.View as IDragablzTabItem)?.CloseTab(); + } - public ICommand EditProfileCommand => new RelayCommand(p => EditProfileAction()); + #endregion - private void EditProfileAction() - { - ProfileDialogManager.ShowEditProfileDialog(this, _dialogCoordinator, SelectedProfile); - } + #region Methods - public ICommand CopyAsProfileCommand => new RelayCommand(p => CopyAsProfileAction()); + // Connect via Dialog + private Task Connect(string host = null) + { + var childWindow = new RemoteDesktopConnectChildWindow(); - private void CopyAsProfileAction() + var childWindowViewModel = new RemoteDesktopConnectViewModel(instance => { - ProfileDialogManager.ShowCopyAsProfileDialog(this, _dialogCoordinator, SelectedProfile); - } + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - public ICommand DeleteProfileCommand => new RelayCommand(p => DeleteProfileAction()); + ConfigurationManager.OnDialogClose(); - private void DeleteProfileAction() - { - ProfileDialogManager.ShowDeleteProfileDialog(this, _dialogCoordinator, new List { SelectedProfile }); - } + // Create new session info with default settings + var sessionInfo = RemoteDesktop.CreateSessionInfo(); - public ICommand EditGroupCommand => new RelayCommand(EditGroupAction); + if (instance.Host.Contains(':')) + { + // Validate input via UI + sessionInfo.Hostname = instance.Host.Split(':')[0]; + sessionInfo.Port = int.Parse(instance.Host.Split(':')[1]); + } + else + { + sessionInfo.Hostname = instance.Host; + } - private void EditGroupAction(object group) - { - ProfileDialogManager.ShowEditGroupDialog(this, _dialogCoordinator, ProfileManager.GetGroup(group.ToString())); - } + if (instance.UseCredentials) + { + sessionInfo.UseCredentials = true; - public ICommand ClearSearchCommand => new RelayCommand(p => ClearSearchAction()); + sessionInfo.Username = instance.Username; + sessionInfo.Domain = instance.Domain; + sessionInfo.Password = instance.Password; + } - private void ClearSearchAction() - { - Search = string.Empty; - } + sessionInfo.AdminSession = instance.AdminSession; + sessionInfo.ViewOnly = instance.ViewOnly; - public ItemActionCallback CloseItemCommand => CloseItemAction; + // Add to history + // Note: The history can only be updated after the values have been read. + // Otherwise, in some cases, incorrect values are taken over. + AddHostToHistory(instance.Host); - private static void CloseItemAction(ItemActionCallbackArgs args) + Connect(sessionInfo); + }, _ => { - ((args.DragablzItem.Content as DragablzTabItem)?.View as RemoteDesktopControl)?.CloseTab(); - } - #endregion + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - #region Methods - // Connect via Dialog - private async Task Connect(string host = null) + ConfigurationManager.OnDialogClose(); + }) { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.Connect - }; - - var remoteDesktopConnectViewModel = new RemoteDesktopConnectViewModel(async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - ConfigurationManager.Current.FixAirspace = false; - - // Create new session info with default settings - var sessionInfo = NETworkManager.Profiles.Application.RemoteDesktop.CreateSessionInfo(); - - if(instance.Host.Contains(':')) - { - // Validate input via UI - sessionInfo.Hostname = instance.Host.Split(':')[0]; - sessionInfo.Port = int.Parse(instance.Host.Split(':')[1]); - } - else - { - sessionInfo.Hostname = instance.Host; - } - - if (instance.UseCredentials) - { - sessionInfo.CustomCredentials = true; - - sessionInfo.Username = instance.Username; - sessionInfo.Password = instance.Password; - } - - // Add to history - // Note: The history can only be updated after the values have been read. - // Otherwise, in some cases, incorrect values are taken over. - AddHostToHistory(instance.Host); - - Connect(sessionInfo); - }, async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - ConfigurationManager.Current.FixAirspace = false; - }) - { - Host = host - }; + Host = host + }; - customDialog.Content = new RemoteDesktopConnectDialog - { - DataContext = remoteDesktopConnectViewModel - }; + childWindow.Title = Strings.Connect; - ConfigurationManager.Current.FixAirspace = true; - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } + childWindow.DataContext = childWindowViewModel; - // Connect via Profile - private void ConnectProfile() - { - var profileInfo = SelectedProfile; + ConfigurationManager.Current.IsChildWindowOpen = true; - var sessionInfo = NETworkManager.Profiles.Application.RemoteDesktop.CreateSessionInfo(profileInfo); + ConfigurationManager.OnDialogOpen(); - Connect(sessionInfo, profileInfo.Name); - } - - // Connect via Profile with Credentials - private async Task ConnectProfileAs() - { - var profileInfo = SelectedProfile; + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } - var sessionInfo = NETworkManager.Profiles.Application.RemoteDesktop.CreateSessionInfo(profileInfo); + // Connect via Profile + private void ConnectProfile() + { + var profileInfo = SelectedProfile; - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.ConnectAs - }; + var sessionInfo = RemoteDesktop.CreateSessionInfo(profileInfo); - var remoteDesktopConnectViewModel = new RemoteDesktopConnectViewModel(async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - ConfigurationManager.Current.FixAirspace = false; - - if (instance.UseCredentials) - { - sessionInfo.CustomCredentials = true; - sessionInfo.Username = instance.Username; - sessionInfo.Password = instance.Password; - } - - Connect(sessionInfo, instance.Name); - }, async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - ConfigurationManager.Current.FixAirspace = false; - }, true) - { - // Set name, hostname - Name = profileInfo.Name, - Host = profileInfo.RemoteDesktop_Host, + Connect(sessionInfo, profileInfo.Name); + } - // Request credentials - UseCredentials = true - }; + // Connect via Profile with Credentials + private Task ConnectProfileAs() + { + var profileInfo = SelectedProfile; - customDialog.Content = new RemoteDesktopConnectDialog - { - DataContext = remoteDesktopConnectViewModel - }; + var sessionInfo = RemoteDesktop.CreateSessionInfo(profileInfo); - ConfigurationManager.Current.FixAirspace = true; - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } + var childWindow = new RemoteDesktopConnectChildWindow(); - private void Connect(RemoteDesktopSessionInfo sessionInfo, string header = null) + var childWindowViewModel = new RemoteDesktopConnectViewModel(instance => { - TabItems.Add(new DragablzTabItem(header ?? sessionInfo.Hostname, new RemoteDesktopControl(sessionInfo))); - SelectedTabIndex = TabItems.Count - 1; - } + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - public void AddTab(string host) - { - Connect(host); - } - - // Modify history list - private static void AddHostToHistory(string host) - { - if (string.IsNullOrEmpty(host)) - return; - - SettingsManager.Current.RemoteDesktop_HostHistory = new ObservableCollection( ListHelper.Modify(SettingsManager.Current.RemoteDesktop_HostHistory.ToList(), host, SettingsManager.Current.General_HistoryListEntries)); - } + ConfigurationManager.OnDialogClose(); - private void StartDelayedSearch() - { - if (!IsSearching) + if (instance.UseCredentials) { - IsSearching = true; + sessionInfo.UseCredentials = true; - _searchDispatcherTimer.Start(); - } - else - { - _searchDispatcherTimer.Stop(); - _searchDispatcherTimer.Start(); + sessionInfo.Username = instance.Username; + sessionInfo.Domain = instance.Domain; + sessionInfo.Password = instance.Password; } - } - - private void StopDelayedSearch() - { - _searchDispatcherTimer.Stop(); - RefreshProfiles(); + sessionInfo.AdminSession = instance.AdminSession; + sessionInfo.ViewOnly = instance.ViewOnly; - IsSearching = false; - } - - private void ResizeProfile(bool dueToChangedSize) + Connect(sessionInfo, instance.Name); + }, _ => { - _canProfileWidthChange = false; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - if (dueToChangedSize) - { - ExpandProfileView = Math.Abs(ProfileWidth.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > GlobalStaticConfiguration.FloatPointFix; - } - else - { - if (ExpandProfileView) - { - ProfileWidth = Math.Abs(_tempProfileWidth - GlobalStaticConfiguration.Profile_WidthCollapsed) < GlobalStaticConfiguration.FloatPointFix ? new GridLength(GlobalStaticConfiguration.Profile_DefaultWidthExpanded) : new GridLength(_tempProfileWidth); - } - else - { - _tempProfileWidth = ProfileWidth.Value; - ProfileWidth = new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); - } - } + ConfigurationManager.OnDialogClose(); + }, + ( + profileInfo.Name, + profileInfo.RemoteDesktop_Host, + profileInfo.RemoteDesktop_AdminSession, + sessionInfo.ViewOnly + )); - _canProfileWidthChange = true; - } + childWindow.Title = Strings.ConnectAs; - public void OnViewVisible() - { - _isViewActive = true; + childWindow.DataContext = childWindowViewModel; - RefreshProfiles(); - } + ConfigurationManager.Current.IsChildWindowOpen = true; - public void OnViewHide() - { - _isViewActive = false; - } + ConfigurationManager.OnDialogOpen(); - public void RefreshProfiles() - { - if (!_isViewActive) - return; + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } - Profiles.Refresh(); - } + private void Connect(RemoteDesktopSessionInfo sessionInfo, string header = null) + { + var tabId = Guid.NewGuid(); - public void OnProfileDialogOpen() - { - ConfigurationManager.Current.FixAirspace = true; - } + TabItems.Add(new DragablzTabItem(header ?? sessionInfo.Hostname, new RemoteDesktopControl(tabId, sessionInfo), + tabId)); - public void OnProfileDialogClose() - { - ConfigurationManager.Current.FixAirspace = false; - } - #endregion + SelectedTabIndex = TabItems.Count - 1; + } - #region Event - private void ProfileManager_OnProfilesUpdated(object sender, EventArgs e) - { - RefreshProfiles(); - } + public void AddTab(string host) + { + _ = Connect(host); + } - private void SearchDispatcherTimer_Tick(object sender, EventArgs e) - { - StopDelayedSearch(); - } - #endregion + // Modify history list + private static void AddHostToHistory(string host) + { + if (string.IsNullOrEmpty(host)) + return; + + SettingsManager.Current.RemoteDesktop_HostHistory = new ObservableCollection( + ListHelper.Modify(SettingsManager.Current.RemoteDesktop_HostHistory.ToList(), host, + SettingsManager.Current.General_HistoryListEntries)); } -} \ No newline at end of file + + #endregion +} diff --git a/Source/NETworkManager/ViewModels/RemoteDesktopSettingsViewModel.cs b/Source/NETworkManager/ViewModels/RemoteDesktopSettingsViewModel.cs index bb7dc32e46..38edf3780a 100644 --- a/Source/NETworkManager/ViewModels/RemoteDesktopSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/RemoteDesktopSettingsViewModel.cs @@ -1,613 +1,710 @@ -using NETworkManager.Models.RemoteDesktop; -using NETworkManager.Settings; +using System; using System.Collections.Generic; using System.Linq; +using NETworkManager.Models.RemoteDesktop; +using NETworkManager.Settings; + +namespace NETworkManager.ViewModels; -namespace NETworkManager.ViewModels +public class RemoteDesktopSettingsViewModel : ViewModelBase { - public class RemoteDesktopSettingsViewModel : ViewModelBase + #region Methods + + private void ChangeNetworkConnectionTypeSettings(NetworkConnectionType networkConnectionType) { - #region Variables - private readonly bool _isLoading; + switch (networkConnectionType) + { + case NetworkConnectionType.Modem: + DesktopBackground = false; + FontSmoothing = false; + DesktopComposition = false; + ShowWindowContentsWhileDragging = false; + MenuAndWindowAnimation = false; + VisualStyles = false; + break; + case NetworkConnectionType.BroadbandLow: + DesktopBackground = false; + FontSmoothing = false; + DesktopComposition = false; + ShowWindowContentsWhileDragging = false; + MenuAndWindowAnimation = false; + VisualStyles = true; + break; + case NetworkConnectionType.Satellite: + case NetworkConnectionType.BroadbandHigh: + DesktopBackground = false; + FontSmoothing = false; + DesktopComposition = true; + ShowWindowContentsWhileDragging = false; + MenuAndWindowAnimation = false; + VisualStyles = true; + break; + case NetworkConnectionType.WAN: + case NetworkConnectionType.LAN: + DesktopBackground = true; + FontSmoothing = true; + DesktopComposition = true; + ShowWindowContentsWhileDragging = true; + MenuAndWindowAnimation = true; + VisualStyles = true; + break; + } + } - private bool _adjustScreenAutomatically; - public bool AdjustScreenAutomatically + #endregion + + #region Variables + + private readonly bool _isLoading; + + public bool AdjustScreenAutomatically + { + get; + set { - get => _adjustScreenAutomatically; - set - { - if (value == _adjustScreenAutomatically) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.RemoteDesktop_AdjustScreenAutomatically = value; + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_AdjustScreenAutomatically = value; - _adjustScreenAutomatically = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _useCurrentViewSize; - public bool UseCurrentViewSize + public bool UseCurrentViewSize + { + get; + set { - get => _useCurrentViewSize; - set - { - if (value == _useCurrentViewSize) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.RemoteDesktop_UseCurrentViewSize = value; + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_UseCurrentViewSize = value; - _useCurrentViewSize = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _useFixedScreenSize; - public bool UseFixedScreenSize + public bool UseFixedScreenSize + { + get; + set { - get => _useFixedScreenSize; - set - { - if (value == _useFixedScreenSize) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.RemoteDesktop_UseFixedScreenSize = value; + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_UseFixedScreenSize = value; - _useFixedScreenSize = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - public List ScreenResolutions => RemoteDesktop.ScreenResolutions; + public List ScreenResolutions => RemoteDesktop.ScreenResolutions; - private string _selectedScreenResolution; - public string SelectedScreenResolution + public string SelectedScreenResolution + { + get; + set { - get => _selectedScreenResolution; - set + if (value == field) + return; + + if (!_isLoading) { - if (value == _selectedScreenResolution) - return; + var resolution = value.Split('x'); - if (!_isLoading) - { - var resolution = value.Split('x'); + SettingsManager.Current.RemoteDesktop_ScreenWidth = int.Parse(resolution[0]); + SettingsManager.Current.RemoteDesktop_ScreenHeight = int.Parse(resolution[1]); + } - SettingsManager.Current.RemoteDesktop_ScreenWidth = int.Parse(resolution[0]); - SettingsManager.Current.RemoteDesktop_ScreenHeight = int.Parse(resolution[1]); - } + field = value; + OnPropertyChanged(); + } + } - _selectedScreenResolution = value; - OnPropertyChanged(); - } + public bool UseCustomScreenSize + { + get; + set + { + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_UseCustomScreenSize = value; + + field = value; + OnPropertyChanged(); } + } - private bool _useCustomScreenSize; - public bool UseCustomScreenSize + public string CustomScreenWidth + { + get; + set { - get => _useCustomScreenSize; - set - { - if (value == _useCustomScreenSize) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.RemoteDesktop_UseCustomScreenSize = value; + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_CustomScreenWidth = int.Parse(value); - _useCustomScreenSize = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _customScreenWidth; - public string CustomScreenWidth + public string CustomScreenHeight + { + get; + set { - get => _customScreenWidth; - set - { - if (value == _customScreenWidth) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.RemoteDesktop_CustomScreenWidth = int.Parse(value); + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_CustomScreenHeight = int.Parse(value); - _customScreenWidth = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _customScreenHeight; - public string CustomScreenHeight + public List ColorDepths => RemoteDesktop.ColorDepths; + + public int SelectedColorDepth + { + get; + set { - get => _customScreenHeight; - set - { - if (value == _customScreenHeight) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.RemoteDesktop_CustomScreenHeight = int.Parse(value); + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_ColorDepth = value; - _customScreenHeight = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - public List ColorDepths => RemoteDesktop.ColorDepths; + public int Port + { + get; + set + { + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_Port = value; + + field = value; + OnPropertyChanged(); + } + } - private int _selectedColorDepth; - public int SelectedColorDepth + public bool ViewOnly + { + get; + set { - get => _selectedColorDepth; - set - { - if (value == _selectedColorDepth) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.RemoteDesktop_ColorDepth = value; + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_ViewOnly = value; - _selectedColorDepth = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private int _port; - public int Port + public bool EnableCredSspSupport + { + get; + set { - get => _port; - set - { - if (value == _port) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.RemoteDesktop_Port = value; + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_EnableCredSspSupport = value; - _port = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _enableCredSspSupport; - public bool EnableCredSspSupport + public uint AuthenticationLevel + { + get; + set { - get => _enableCredSspSupport; - set - { - if (value == _enableCredSspSupport) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.RemoteDesktop_EnableCredSspSupport = value; + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_AuthenticationLevel = value; - _enableCredSspSupport = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private uint _authenticationLevel; - public uint AuthenticationLevel + public bool EnableGatewayServer + { + get; + set { - get => _authenticationLevel; - set - { - if (value == _authenticationLevel) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.RemoteDesktop_AuthenticationLevel = value; + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_EnableGatewayServer = value; - _authenticationLevel = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - public IEnumerable AudioRedirectionModes => System.Enum.GetValues(typeof(AudioRedirectionMode)).Cast(); + public string GatewayServerHostname + { + get; + set + { + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_GatewayServerHostname = value; + + field = value; + OnPropertyChanged(); + } + } - private AudioRedirectionMode _audioRedirectionMode; - public AudioRedirectionMode AudioRedirectionMode + public bool GatewayServerBypassLocalAddresses + { + get; + set { - get => _audioRedirectionMode; - set - { - if (Equals(value, _audioRedirectionMode)) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.RemoteDesktop_AudioRedirectionMode = value; + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_GatewayServerBypassLocalAddresses = value; - _audioRedirectionMode = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - public IEnumerable AudioCaptureRedirectionModes => System.Enum.GetValues(typeof(AudioCaptureRedirectionMode)).Cast(); + public IEnumerable GatewayServerLogonMethods => Enum + .GetValues(typeof(GatewayUserSelectedCredsSource)).Cast(); - private AudioCaptureRedirectionMode _audioCaptureRedirectionMode; - public AudioCaptureRedirectionMode AudioCaptureRedirectionMode + public GatewayUserSelectedCredsSource GatewayServerLogonMethod + { + get; + set { - get => _audioCaptureRedirectionMode; - set - { - if (Equals(value, _audioCaptureRedirectionMode)) - return; + if (Equals(value, field)) + return; - if (!_isLoading) - SettingsManager.Current.RemoteDesktop_AudioCaptureRedirectionMode = value; + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_GatewayServerLogonMethod = value; - _audioCaptureRedirectionMode = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + + public bool GatewayServerShareCredentialsWithRemoteComputer + { + get; + set + { + if (value == field) + return; - public IEnumerable KeyboardHookModes => System.Enum.GetValues(typeof(KeyboardHookMode)).Cast(); + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_GatewayServerShareCredentialsWithRemoteComputer = value; - private KeyboardHookMode _keyboardHookMode; - public KeyboardHookMode KeyboardHookMode + field = value; + OnPropertyChanged(); + } + } + + public IEnumerable AudioRedirectionModes => + Enum.GetValues(typeof(AudioRedirectionMode)).Cast(); + + public AudioRedirectionMode AudioRedirectionMode + { + get; + set { - get => _keyboardHookMode; - set - { - if (Equals(value, _keyboardHookMode)) - return; + if (Equals(value, field)) + return; - if (!_isLoading) - SettingsManager.Current.RemoteDesktop_KeyboardHookMode = value; + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_AudioRedirectionMode = value; - _keyboardHookMode = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + + public IEnumerable AudioCaptureRedirectionModes => Enum + .GetValues(typeof(AudioCaptureRedirectionMode)).Cast(); - private bool _redirectClipboard; - public bool RedirectClipboard + public AudioCaptureRedirectionMode AudioCaptureRedirectionMode + { + get; + set { - get => _redirectClipboard; - set - { - if (value == _redirectClipboard) - return; + if (Equals(value, field)) + return; - if (!_isLoading) - SettingsManager.Current.RemoteDesktop_RedirectClipboard = value; + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_AudioCaptureRedirectionMode = value; - _redirectClipboard = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + + public IEnumerable KeyboardHookModes => + Enum.GetValues(typeof(KeyboardHookMode)).Cast(); - private bool _redirectDevices; - public bool RedirectDevices + public KeyboardHookMode KeyboardHookMode + { + get; + set { - get => _redirectDevices; - set - { - if (value == _redirectDevices) - return; + if (Equals(value, field)) + return; - if (!_isLoading) - SettingsManager.Current.RemoteDesktop_RedirectDevices = value; + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_KeyboardHookMode = value; - _redirectDevices = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _redirectDrives; - public bool RedirectDrives + public bool RedirectClipboard + { + get; + set { - get => _redirectDrives; - set - { - if (value == _redirectDrives) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.RemoteDesktop_RedirectDrives = value; + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_RedirectClipboard = value; - _redirectDrives = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _redirectPorts; - public bool RedirectPorts + public bool RedirectDevices + { + get; + set { - get => _redirectPorts; - set - { - if (value == _redirectPorts) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.RemoteDesktop_RedirectPorts = value; + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_RedirectDevices = value; - _redirectPorts = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _redirectSmartCards; - public bool RedirectSmartCards + public bool RedirectDrives + { + get; + set { - get => _redirectSmartCards; - set - { - if (value == _redirectSmartCards) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.RemoteDesktop_RedirectSmartCards = value; + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_RedirectDrives = value; - _redirectSmartCards = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _redirectPrinters; - public bool RedirectPrinters + public bool RedirectPorts + { + get; + set { - get => _redirectPrinters; - set - { - if (value == _redirectPrinters) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.RemoteDesktop_RedirectPrinters = value; + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_RedirectPorts = value; - _redirectPrinters = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _persistentBitmapCaching; - public bool PersistentBitmapCaching + public bool RedirectSmartCards + { + get; + set { - get => _persistentBitmapCaching; - set - { - if (value == _persistentBitmapCaching) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.RemoteDesktop_PersistentBitmapCaching = value; + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_RedirectSmartCards = value; - _persistentBitmapCaching = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _reconnectIfTheConnectionIsDropped; - public bool ReconnectIfTheConnectionIsDropped + public bool RedirectPrinters + { + get; + set { - get => _reconnectIfTheConnectionIsDropped; - set - { - if (value == _reconnectIfTheConnectionIsDropped) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.RemoteDesktop_ReconnectIfTheConnectionIsDropped = value; + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_RedirectPrinters = value; - _reconnectIfTheConnectionIsDropped = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - public IEnumerable NetworkConnectionTypes => System.Enum.GetValues(typeof(NetworkConnectionType)).Cast(); + } - private NetworkConnectionType _networkConnectionType; - public NetworkConnectionType NetworkConnectionType + public bool PersistentBitmapCaching + { + get; + set { - get => _networkConnectionType; - set - { - if (Equals(value, _networkConnectionType)) - return; + if (value == field) + return; - if (!_isLoading) - { - ChangeNetworkConnectionTypeSettings(value); - SettingsManager.Current.RemoteDesktop_NetworkConnectionType = value; - } + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_PersistentBitmapCaching = value; - _networkConnectionType = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _desktopBackground; - public bool DesktopBackground + public bool ReconnectIfTheConnectionIsDropped + { + get; + set { - get => _desktopBackground; - set - { - if (value == _desktopBackground) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.RemoteDesktop_DesktopBackground = value; + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_ReconnectIfTheConnectionIsDropped = value; - _desktopBackground = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } + + public IEnumerable NetworkConnectionTypes => + Enum.GetValues(typeof(NetworkConnectionType)).Cast(); - private bool _fontSmoothing; - public bool FontSmoothing + public NetworkConnectionType NetworkConnectionType + { + get; + set { - get => _fontSmoothing; - set + if (Equals(value, field)) + return; + + if (!_isLoading) { - if (value == _fontSmoothing) - return; + ChangeNetworkConnectionTypeSettings(value); + SettingsManager.Current.RemoteDesktop_NetworkConnectionType = value; + } - if (!_isLoading) - SettingsManager.Current.RemoteDesktop_FontSmoothing = value; + field = value; + OnPropertyChanged(); + } + } - _fontSmoothing = value; - OnPropertyChanged(); - } + public bool DesktopBackground + { + get; + set + { + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_DesktopBackground = value; + + field = value; + OnPropertyChanged(); } + } - private bool _desktopComposition; - public bool DesktopComposition + public bool FontSmoothing + { + get; + set { - get => _desktopComposition; - set - { - if (value == _desktopComposition) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.RemoteDesktop_DesktopComposition = value; + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_FontSmoothing = value; - _desktopComposition = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _showWindowContentsWhileDragging; - public bool ShowWindowContentsWhileDragging + public bool DesktopComposition + { + get; + set { - get => _showWindowContentsWhileDragging; - set - { - if (value == _showWindowContentsWhileDragging) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.RemoteDesktop_ShowWindowContentsWhileDragging = value; + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_DesktopComposition = value; - _showWindowContentsWhileDragging = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _menuAndWindowAnimation; - public bool MenuAndWindowAnimation + public bool ShowWindowContentsWhileDragging + { + get; + set { - get => _menuAndWindowAnimation; - set - { - if (value == _menuAndWindowAnimation) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.RemoteDesktop_MenuAndWindowAnimation = value; + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_ShowWindowContentsWhileDragging = value; - _menuAndWindowAnimation = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _visualStyles; - public bool VisualStyles + public bool MenuAndWindowAnimation + { + get; + set { - get => _visualStyles; - set - { - if (value == _visualStyles) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.RemoteDesktop_VisualStyles = value; + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_MenuAndWindowAnimation = value; - _visualStyles = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion - - #region Constructor, load settings - public RemoteDesktopSettingsViewModel() - { - _isLoading = true; - - LoadSettings(); - - _isLoading = false; - } - - private void LoadSettings() - { - AdjustScreenAutomatically = SettingsManager.Current.RemoteDesktop_AdjustScreenAutomatically; - UseCurrentViewSize = SettingsManager.Current.RemoteDesktop_UseCurrentViewSize; - UseFixedScreenSize = SettingsManager.Current.RemoteDesktop_UseFixedScreenSize; - SelectedScreenResolution = ScreenResolutions.FirstOrDefault(x => x == $"{SettingsManager.Current.RemoteDesktop_ScreenWidth}x{SettingsManager.Current.RemoteDesktop_ScreenHeight}"); - UseCustomScreenSize = SettingsManager.Current.RemoteDesktop_UseCustomScreenSize; - CustomScreenWidth = SettingsManager.Current.RemoteDesktop_CustomScreenWidth.ToString(); - CustomScreenHeight = SettingsManager.Current.RemoteDesktop_CustomScreenHeight.ToString(); - SelectedColorDepth = ColorDepths.FirstOrDefault(x => x == SettingsManager.Current.RemoteDesktop_ColorDepth); - Port = SettingsManager.Current.RemoteDesktop_Port; - EnableCredSspSupport = SettingsManager.Current.RemoteDesktop_EnableCredSspSupport; - AuthenticationLevel = SettingsManager.Current.RemoteDesktop_AuthenticationLevel; - AudioRedirectionMode = AudioRedirectionModes.FirstOrDefault(x => x == SettingsManager.Current.RemoteDesktop_AudioRedirectionMode); - AudioCaptureRedirectionMode = AudioCaptureRedirectionModes.FirstOrDefault(x => x == SettingsManager.Current.RemoteDesktop_AudioCaptureRedirectionMode); - KeyboardHookMode = KeyboardHookModes.FirstOrDefault(x => x == SettingsManager.Current.RemoteDesktop_KeyboardHookMode); - RedirectClipboard = SettingsManager.Current.RemoteDesktop_RedirectClipboard; - RedirectDevices = SettingsManager.Current.RemoteDesktop_RedirectDevices; - RedirectDrives = SettingsManager.Current.RemoteDesktop_RedirectDrives; - RedirectPorts = SettingsManager.Current.RemoteDesktop_RedirectPorts; - RedirectSmartCards = SettingsManager.Current.RemoteDesktop_RedirectSmartCards; - RedirectPrinters = SettingsManager.Current.RemoteDesktop_RedirectPrinters; - PersistentBitmapCaching = SettingsManager.Current.RemoteDesktop_PersistentBitmapCaching; - ReconnectIfTheConnectionIsDropped = SettingsManager.Current.RemoteDesktop_ReconnectIfTheConnectionIsDropped; - NetworkConnectionType = NetworkConnectionTypes.FirstOrDefault(x => x == SettingsManager.Current.RemoteDesktop_NetworkConnectionType); - DesktopBackground = SettingsManager.Current.RemoteDesktop_DesktopBackground; - FontSmoothing = SettingsManager.Current.RemoteDesktop_FontSmoothing; - DesktopComposition = SettingsManager.Current.RemoteDesktop_DesktopComposition; - ShowWindowContentsWhileDragging = SettingsManager.Current.RemoteDesktop_ShowWindowContentsWhileDragging; - MenuAndWindowAnimation = SettingsManager.Current.RemoteDesktop_MenuAndWindowAnimation; - VisualStyles = SettingsManager.Current.RemoteDesktop_VisualStyles; - } - #endregion - - #region Methods - private void ChangeNetworkConnectionTypeSettings(NetworkConnectionType networkConnectionType) - { - switch (networkConnectionType) - { - case NetworkConnectionType.Modem: - DesktopBackground = false; - FontSmoothing = false; - DesktopComposition = false; - ShowWindowContentsWhileDragging = false; - MenuAndWindowAnimation = false; - VisualStyles = false; - break; - case NetworkConnectionType.BroadbandLow: - DesktopBackground = false; - FontSmoothing = false; - DesktopComposition = false; - ShowWindowContentsWhileDragging = false; - MenuAndWindowAnimation = false; - VisualStyles = true; - break; - case NetworkConnectionType.Satellite: - case NetworkConnectionType.BroadbandHigh: - DesktopBackground = false; - FontSmoothing = false; - DesktopComposition = true; - ShowWindowContentsWhileDragging = false; - MenuAndWindowAnimation = false; - VisualStyles = true; - break; - case NetworkConnectionType.WAN: - case NetworkConnectionType.LAN: - DesktopBackground = true; - FontSmoothing = true; - DesktopComposition = true; - ShowWindowContentsWhileDragging = true; - MenuAndWindowAnimation = true; - VisualStyles = true; - break; - } + } + + public bool VisualStyles + { + get; + set + { + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.RemoteDesktop_VisualStyles = value; + + field = value; + OnPropertyChanged(); } - #endregion } + + #endregion + + #region Constructor, load settings + + public RemoteDesktopSettingsViewModel() + { + _isLoading = true; + + LoadSettings(); + + _isLoading = false; + } + + private void LoadSettings() + { + AdjustScreenAutomatically = SettingsManager.Current.RemoteDesktop_AdjustScreenAutomatically; + UseCurrentViewSize = SettingsManager.Current.RemoteDesktop_UseCurrentViewSize; + UseFixedScreenSize = SettingsManager.Current.RemoteDesktop_UseFixedScreenSize; + SelectedScreenResolution = ScreenResolutions.FirstOrDefault(x => + x == + $"{SettingsManager.Current.RemoteDesktop_ScreenWidth}x{SettingsManager.Current.RemoteDesktop_ScreenHeight}"); + UseCustomScreenSize = SettingsManager.Current.RemoteDesktop_UseCustomScreenSize; + CustomScreenWidth = SettingsManager.Current.RemoteDesktop_CustomScreenWidth.ToString(); + CustomScreenHeight = SettingsManager.Current.RemoteDesktop_CustomScreenHeight.ToString(); + SelectedColorDepth = ColorDepths.FirstOrDefault(x => x == SettingsManager.Current.RemoteDesktop_ColorDepth); + Port = SettingsManager.Current.RemoteDesktop_Port; + ViewOnly = SettingsManager.Current.RemoteDesktop_ViewOnly; + EnableCredSspSupport = SettingsManager.Current.RemoteDesktop_EnableCredSspSupport; + AuthenticationLevel = SettingsManager.Current.RemoteDesktop_AuthenticationLevel; + EnableGatewayServer = SettingsManager.Current.RemoteDesktop_EnableGatewayServer; + GatewayServerHostname = SettingsManager.Current.RemoteDesktop_GatewayServerHostname; + GatewayServerBypassLocalAddresses = SettingsManager.Current.RemoteDesktop_GatewayServerBypassLocalAddresses; + GatewayServerLogonMethod = + GatewayServerLogonMethods.FirstOrDefault(x => + x == SettingsManager.Current.RemoteDesktop_GatewayServerLogonMethod); + GatewayServerShareCredentialsWithRemoteComputer = + SettingsManager.Current.RemoteDesktop_GatewayServerShareCredentialsWithRemoteComputer; + AudioRedirectionMode = + AudioRedirectionModes.FirstOrDefault(x => x == SettingsManager.Current.RemoteDesktop_AudioRedirectionMode); + AudioCaptureRedirectionMode = AudioCaptureRedirectionModes.FirstOrDefault(x => + x == SettingsManager.Current.RemoteDesktop_AudioCaptureRedirectionMode); + KeyboardHookMode = + KeyboardHookModes.FirstOrDefault(x => x == SettingsManager.Current.RemoteDesktop_KeyboardHookMode); + RedirectClipboard = SettingsManager.Current.RemoteDesktop_RedirectClipboard; + RedirectDevices = SettingsManager.Current.RemoteDesktop_RedirectDevices; + RedirectDrives = SettingsManager.Current.RemoteDesktop_RedirectDrives; + RedirectPorts = SettingsManager.Current.RemoteDesktop_RedirectPorts; + RedirectSmartCards = SettingsManager.Current.RemoteDesktop_RedirectSmartCards; + RedirectPrinters = SettingsManager.Current.RemoteDesktop_RedirectPrinters; + PersistentBitmapCaching = SettingsManager.Current.RemoteDesktop_PersistentBitmapCaching; + ReconnectIfTheConnectionIsDropped = SettingsManager.Current.RemoteDesktop_ReconnectIfTheConnectionIsDropped; + NetworkConnectionType = + NetworkConnectionTypes.FirstOrDefault(x => + x == SettingsManager.Current.RemoteDesktop_NetworkConnectionType); + DesktopBackground = SettingsManager.Current.RemoteDesktop_DesktopBackground; + FontSmoothing = SettingsManager.Current.RemoteDesktop_FontSmoothing; + DesktopComposition = SettingsManager.Current.RemoteDesktop_DesktopComposition; + ShowWindowContentsWhileDragging = SettingsManager.Current.RemoteDesktop_ShowWindowContentsWhileDragging; + MenuAndWindowAnimation = SettingsManager.Current.RemoteDesktop_MenuAndWindowAnimation; + VisualStyles = SettingsManager.Current.RemoteDesktop_VisualStyles; + } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/SNMPHostViewModel.cs b/Source/NETworkManager/ViewModels/SNMPHostViewModel.cs index d00460cad1..f73e4a0601 100644 --- a/Source/NETworkManager/ViewModels/SNMPHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/SNMPHostViewModel.cs @@ -1,83 +1,143 @@ -using System.Collections.ObjectModel; -using NETworkManager.Controls; using Dragablz; -using System.Windows.Input; -using NETworkManager.Views; -using NETworkManager.Utilities; +using NETworkManager.Controls; +using NETworkManager.Localization.Resources; using NETworkManager.Models; +using NETworkManager.Models.Network; +using NETworkManager.Profiles; +using NETworkManager.Profiles.Application; +using NETworkManager.Utilities; +using NETworkManager.Views; +using System; +using System.Collections.ObjectModel; +using System.Windows.Input; + +namespace NETworkManager.ViewModels; -namespace NETworkManager.ViewModels +public class SNMPHostViewModel : ProfileHostViewModelBase { - public class SNMPHostViewModel : ViewModelBase - { - #region Variables - public IInterTabClient InterTabClient { get; } - public ObservableCollection TabItems { get; } + #region Variables - private int _tabId; + public IInterTabClient InterTabClient { get; } - private int _selectedTabIndex; - public int SelectedTabIndex + public string InterTabPartition + { + get; + set { - get => _selectedTabIndex; - set - { - if (value == _selectedTabIndex) - return; - - _selectedTabIndex = value; - OnPropertyChanged(); - } + if (value == field) + return; + + field = value; + OnPropertyChanged(); } - #endregion + } - #region Constructor - public SNMPHostViewModel() + public ObservableCollection TabItems { get; } + + public int SelectedTabIndex + { + get; + set { - InterTabClient = new DragablzInterTabClient(ApplicationName.SNMP); + if (value == field) + return; - TabItems = new ObservableCollection - { - new DragablzTabItem(Localization.Resources.Strings.NewTab, new SNMPView (_tabId), _tabId) - }; + field = value; + OnPropertyChanged(); } - #endregion + } - #region ICommand & Actions - public ICommand AddTabCommand => new RelayCommand(p => AddTabAction()); + #endregion - private void AddTabAction() - { - AddTab(); - } - - public ItemActionCallback CloseItemCommand => CloseItemAction; + #region Constructor - private static void CloseItemAction(ItemActionCallbackArgs args) - { - ((args.DragablzItem.Content as DragablzTabItem)?.View as SNMPView)?.CloseTab(); - } - #endregion + public SNMPHostViewModel() + { + InterTabClient = new DragablzInterTabClient(ApplicationName.SNMP); + InterTabPartition = nameof(ApplicationName.SNMP); - #region Methods - public void AddTab(string host = null) - { - _tabId++; + TabItems = []; + AddTab(); - TabItems.Add(new DragablzTabItem(host ?? Localization.Resources.Strings.NewTab, new SNMPView(_tabId, host), _tabId)); + InitializeProfileHost(); + } - SelectedTabIndex = TabItems.Count - 1; - } + #endregion - public void OnViewVisible() - { - - } + #region Profile host - public void OnViewHide() - { + protected override ApplicationName ApplicationName => ApplicationName.SNMP; - } - #endregion + protected override bool IsProfileEnabled(ProfileInfo profile) => profile.SNMP_Enabled; + + protected override string GetSearchableField(ProfileInfo profile) => profile.SNMP_Host; + + #endregion + + #region ICommand & Actions + + public ICommand AddTabCommand => new RelayCommand(_ => AddTabAction()); + + private void AddTabAction() + { + AddTab(); + } + + public ICommand AddTabProfileCommand => new RelayCommand(_ => AddTabProfileAction(), AddTabProfile_CanExecute); + + private bool AddTabProfile_CanExecute(object obj) + { + return !IsSearching && SelectedProfile != null; } -} \ No newline at end of file + + private void AddTabProfileAction() + { + AddTab(SelectedProfile); + } + + public ItemActionCallback CloseItemCommand => CloseItemAction; + + private static void CloseItemAction(ItemActionCallbackArgs args) + { + ((args.DragablzItem.Content as DragablzTabItem)?.View as IDragablzTabItem)?.CloseTab(); + } + + #endregion + + #region Methods + + private void AddTab(SNMPSessionInfo sessionInfo, string header = null) + { + var tabId = Guid.NewGuid(); + + TabItems.Add(new DragablzTabItem(header ?? sessionInfo.Host ?? Strings.NewTab, + new SNMPView(tabId, sessionInfo), tabId)); + + SelectedTabIndex = TabItems.Count - 1; + } + + private void AddTab() + { + var sessionInfo = SNMP.CreateSessionInfo(); + + AddTab(sessionInfo); + } + + public void AddTab(string host) + { + var sessionInfo = SNMP.CreateSessionInfo(); + + sessionInfo.Host = host; + + AddTab(sessionInfo); + } + + private void AddTab(ProfileInfo profile) + { + var sessionInfo = SNMP.CreateSessionInfo(profile); + + AddTab(sessionInfo, profile.Name); + } + + #endregion +} diff --git a/Source/NETworkManager/ViewModels/SNMPOIDProfileViewModel.cs b/Source/NETworkManager/ViewModels/SNMPOIDProfileViewModel.cs new file mode 100644 index 0000000000..ab7affb027 --- /dev/null +++ b/Source/NETworkManager/ViewModels/SNMPOIDProfileViewModel.cs @@ -0,0 +1,126 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Input; +using NETworkManager.Models.Network; +using NETworkManager.Utilities; + +namespace NETworkManager.ViewModels; + +public class SNMPOIDProfileViewModel : ViewModelBase +{ + private readonly SNMPOIDProfileInfo _info; + private readonly bool _isLoading; + + public SNMPOIDProfileViewModel(Action saveCommand, + Action cancelHandler, bool isEdited = false, SNMPOIDProfileInfo info = null) + { + _isLoading = true; + + SaveCommand = new RelayCommand(_ => saveCommand(this)); + CancelCommand = new RelayCommand(_ => cancelHandler(this)); + + Modes = new List { SNMPMode.Get, SNMPMode.Walk, SNMPMode.Set }; + + IsEdited = isEdited; + + _info = info ?? new SNMPOIDProfileInfo(); + + Name = _info.Name; + OID = _info.OID; + Mode = Modes.FirstOrDefault(x => x == _info.Mode); + + _isLoading = false; + } + + public ICommand SaveCommand { get; } + + public ICommand CancelCommand { get; } + + public string Name + { + get; + set + { + if (field == value) + return; + + field = value; + + if (!_isLoading) + Validate(); + + OnPropertyChanged(); + } + } + + public string OID + { + get; + set + { + if (field == value) + return; + + field = value; + + if (!_isLoading) + Validate(); + + OnPropertyChanged(); + } + } + + public List Modes { get; } + + public SNMPMode Mode + { + get; + set + { + if (value == field) + return; + + field = value; + + if (!_isLoading) + Validate(); + + OnPropertyChanged(); + + // Re-validate OID if mode changed + OnPropertyChanged(nameof(OID)); + } + } + + public bool InfoChanged + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public bool IsEdited + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + private void Validate() + { + InfoChanged = _info.Name != Name || _info.OID != OID || _info.Mode != Mode; + } +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/SNMPOIDProfilesViewModel.cs b/Source/NETworkManager/ViewModels/SNMPOIDProfilesViewModel.cs new file mode 100644 index 0000000000..952e325449 --- /dev/null +++ b/Source/NETworkManager/ViewModels/SNMPOIDProfilesViewModel.cs @@ -0,0 +1,76 @@ +using System; +using System.ComponentModel; +using System.Linq; +using System.Windows.Data; +using System.Windows.Input; +using NETworkManager.Models.Network; +using NETworkManager.Settings; +using NETworkManager.Utilities; + +namespace NETworkManager.ViewModels; + +public class SNMPOIDProfilesViewModel : ViewModelBase +{ + public SNMPOIDProfilesViewModel(Action okCommand, + Action cancelHandler) + { + OKCommand = new RelayCommand(_ => okCommand(this)); + CancelCommand = new RelayCommand(_ => cancelHandler(this)); + + OIDProfiles = CollectionViewSource.GetDefaultView(SettingsManager.Current.SNMP_OidProfiles); + OIDProfiles.SortDescriptions.Add(new SortDescription(nameof(SNMPOIDProfileInfo.Name), + ListSortDirection.Ascending)); + OIDProfiles.Filter = o => + { + if (string.IsNullOrEmpty(Search)) + return true; + + if (o is not SNMPOIDProfileInfo info) + return false; + + var search = Search.Trim(); + + // Search: Name, OID + return info.Name.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1 || + info.OID.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1; + }; + + SelectedOIDProfile = OIDProfiles.Cast().FirstOrDefault(); + } + + public ICommand OKCommand { get; } + public ICommand CancelCommand { get; } + + public string Search + { + get; + set + { + if (value == field) + return; + + field = value; + + OIDProfiles.Refresh(); + + SelectedOIDProfile = OIDProfiles.Cast().FirstOrDefault(); + + OnPropertyChanged(); + } + } + + public ICollectionView OIDProfiles { get; } + + public SNMPOIDProfileInfo SelectedOIDProfile + { + get; + set + { + if (Equals(value, field)) + return; + + field = value; + OnPropertyChanged(); + } + } +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/SNMPSettingsViewModel.cs b/Source/NETworkManager/ViewModels/SNMPSettingsViewModel.cs index 6f3636b563..99a12e45d0 100644 --- a/Source/NETworkManager/ViewModels/SNMPSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/SNMPSettingsViewModel.cs @@ -1,122 +1,217 @@ using Lextm.SharpSnmpLib.Messaging; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Localization.Resources; +using NETworkManager.Models.Network; using NETworkManager.Settings; +using NETworkManager.Utilities; +using NETworkManager.Views; +using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Data; +using System.Windows.Input; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +public class SNMPSettingsViewModel : ViewModelBase { - public class SNMPSettingsViewModel : ViewModelBase - { - #region Variables - private readonly bool _isLoading; - - public List WalkModes { get; set; } + #region Variables - private WalkMode _walkMode; - public WalkMode WalkMode - { - get => _walkMode; - set - { - if (value == _walkMode) - return; - - if (!_isLoading) - SettingsManager.Current.SNMP_WalkMode = value; - - _walkMode = value; - OnPropertyChanged(); - } - } + private readonly bool _isLoading; + + public ICollectionView OIDProfiles { get; } - private int _timeout; - public int Timeout + public SNMPOIDProfileInfo SelectedOIDProfile + { + get; + set { - get => _timeout; - set - { - if (value == _timeout) - return; - - if (!_isLoading) - SettingsManager.Current.SNMP_Timeout = value; - - _timeout = value; - OnPropertyChanged(); - } + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } = new(); - private int _port; - public int Port + public List WalkModes { get; private set; } + + public WalkMode WalkMode + { + get; + set { - get => _port; - set - { - if (value == _port) - return; - - if (!_isLoading) - SettingsManager.Current.SNMP_Port = value; - - _port = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.SNMP_WalkMode = value; + + field = value; + OnPropertyChanged(); } + } - private bool _resolveHostnamePreferIPv4; - public bool ResolveHostnamePreferIPv4 + public int Timeout + { + get; + set { - get => _resolveHostnamePreferIPv4; - set - { - if (value == _resolveHostnamePreferIPv4) - return; - - if (!_isLoading) - SettingsManager.Current.SNMP_ResolveHostnamePreferIPv4 = value; - - _resolveHostnamePreferIPv4 = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.SNMP_Timeout = value; + + field = value; + OnPropertyChanged(); } + } - private bool _resolveHostnamePreferIPv6; - public bool ResolveHostnamePreferIPv6 + public int Port + { + get; + set { - get => _resolveHostnamePreferIPv6; - set - { - if (value == _resolveHostnamePreferIPv6) - return; - - _resolveHostnamePreferIPv6 = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.SNMP_Port = value; + + field = value; + OnPropertyChanged(); } - #endregion + } + + #endregion + + #region Contructor, load settings + + public SNMPSettingsViewModel() + { + _isLoading = true; + + OIDProfiles = CollectionViewSource.GetDefaultView(SettingsManager.Current.SNMP_OidProfiles); + OIDProfiles.SortDescriptions.Add(new SortDescription(nameof(SNMPOIDProfileInfo.Name), + ListSortDirection.Ascending)); + + SelectedOIDProfile = OIDProfiles.Cast().FirstOrDefault(); + + LoadSettings(); + + _isLoading = false; + } + + private void LoadSettings() + { + WalkModes = Enum.GetValues(typeof(WalkMode)).Cast().OrderBy(x => x.ToString()).ToList(); + WalkMode = WalkModes.First(x => x == SettingsManager.Current.SNMP_WalkMode); + Timeout = SettingsManager.Current.SNMP_Timeout; + Port = SettingsManager.Current.SNMP_Port; + } + + #endregion + + #region ICommand & Actions + + public ICommand AddOIDProfileCommand => new RelayCommand(_ => AddOIDProfileAction()); - #region Contructor, load settings - public SNMPSettingsViewModel() + private void AddOIDProfileAction() + { + _ = AddOIDProfile(); + } + + public ICommand EditOIDProfileCommand => new RelayCommand(_ => EditOIDProfileAction()); + + private void EditOIDProfileAction() + { + _ = EditOIDProfile(); + } + + public ICommand DeleteOIDProfileCommand => new RelayCommand(_ => DeleteOIDProfileAction()); + + private void DeleteOIDProfileAction() + { + _ = DeleteOIDProfile(); + } + + #endregion + + #region Methods + + private async Task AddOIDProfile() + { + var childWindow = new SNMPOIDProfileChildWindow(); + + var childWindowViewModel = new SNMPOIDProfileViewModel(async instance => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + SettingsManager.Current.SNMP_OidProfiles.Add(new SNMPOIDProfileInfo( + instance.Name, + instance.OID, + instance.Mode) + ); + }, async _ => { - _isLoading = true; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }); - LoadSettings(); + childWindow.Title = Strings.AddOIDProfile; - _isLoading = false; - } + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; - private void LoadSettings() + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } + + public async Task EditOIDProfile() + { + var childWindow = new SNMPOIDProfileChildWindow(); + + var childWindowViewModel = new SNMPOIDProfileViewModel(async instance => { - WalkModes = System.Enum.GetValues(typeof(WalkMode)).Cast().OrderBy(x => x.ToString()).ToList(); - WalkMode = WalkModes.First(x => x == SettingsManager.Current.SNMP_WalkMode); - Timeout = SettingsManager.Current.SNMP_Timeout; - Port = SettingsManager.Current.SNMP_Port; - - if (SettingsManager.Current.SNMP_ResolveHostnamePreferIPv4) - ResolveHostnamePreferIPv4 = true; - else - ResolveHostnamePreferIPv6 = true; - } - #endregion + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + SettingsManager.Current.SNMP_OidProfiles.Remove(SelectedOIDProfile); + SettingsManager.Current.SNMP_OidProfiles.Add(new SNMPOIDProfileInfo(instance.Name, instance.OID, + instance.Mode)); + }, async _ => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, true, SelectedOIDProfile); + + childWindow.Title = Strings.EditOIDProfile; + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } + + private async Task DeleteOIDProfile() + { + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, + Strings.DeleteOIDProfile, + Strings.DeleteOIDProfileMessage, + ChildWindowIcon.Info, + Strings.Delete); + + if (!result) + return; + + SettingsManager.Current.SNMP_OidProfiles.Remove(SelectedOIDProfile); } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/SNMPViewModel.cs b/Source/NETworkManager/ViewModels/SNMPViewModel.cs index d135bf409b..8119896d37 100644 --- a/Source/NETworkManager/ViewModels/SNMPViewModel.cs +++ b/Source/NETworkManager/ViewModels/SNMPViewModel.cs @@ -1,6 +1,14 @@ -using NETworkManager.Utilities; +using log4net; +using MahApps.Metro.Controls; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Controls; +using NETworkManager.Localization; +using NETworkManager.Localization.Resources; +using NETworkManager.Models.Export; using NETworkManager.Models.Network; using NETworkManager.Settings; +using NETworkManager.Utilities; +using NETworkManager.Views; using System; using System.Collections; using System.Collections.Generic; @@ -8,649 +16,738 @@ using System.ComponentModel; using System.Linq; using System.Net; +using System.Security; +using System.Threading; +using System.Threading.Tasks; using System.Windows; using System.Windows.Data; using System.Windows.Input; using System.Windows.Threading; -using static NETworkManager.Models.Network.SNMP; -using NETworkManager.Controls; -using Dragablz; -using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.Models.Export; -using NETworkManager.Views; -using System.Security; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +public class SNMPViewModel : ViewModelBase { - public class SNMPViewModel : ViewModelBase + #region Contructor, load settings + + public SNMPViewModel(Guid tabId, SNMPSessionInfo sessionInfo) { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; + _isLoading = true; + + ConfigurationManager.Current.SNMPTabCount++; + + _tabId = tabId; + Host = sessionInfo?.Host; + + // Set collection view + HostHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.SNMP_HostHistory); + OidHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.SNMP_OidHistory); + + // Result view + ResultsView = CollectionViewSource.GetDefaultView(QueryResults); - public readonly int TabId; + // Custom comparer to sort by OID + ((ListCollectionView)ResultsView).CustomSort = Comparer.Create((x, y) => + SNMPOIDHelper.CompareOIDs(x.OID, y.OID)); - private readonly bool _isLoading; + // OID + Oid = sessionInfo?.OID; - private string _host; - public string Host + // Modes + Modes = [SNMPMode.Get, SNMPMode.Walk, SNMPMode.Set]; + Mode = Modes.FirstOrDefault(x => x == sessionInfo?.Mode); + + // Versions (v1, v2c, v3) + Versions = Enum.GetValues().Cast().ToList(); + Version = Versions.FirstOrDefault(x => x == sessionInfo?.Version); + + // Community + if (Version != SNMPVersion.V3) + Community = sessionInfo?.Community; + + // Security + Securities = [SNMPV3Security.NoAuthNoPriv, SNMPV3Security.AuthNoPriv, SNMPV3Security.AuthPriv]; + Security = Securities.FirstOrDefault(x => x == sessionInfo?.Security); + + // Username + if (Version == SNMPVersion.V3) + Username = sessionInfo?.Username; + + // Auth + AuthenticationProviders = [.. Enum.GetValues().Cast()]; + AuthenticationProvider = AuthenticationProviders.FirstOrDefault(x => x == sessionInfo?.AuthenticationProvider); + + if (Version == SNMPVersion.V3 && Security != SNMPV3Security.NoAuthNoPriv) + Auth = sessionInfo?.Auth; + + // Priv + PrivacyProviders = [.. Enum.GetValues().Cast()]; + PrivacyProvider = PrivacyProviders.FirstOrDefault(x => x == sessionInfo?.PrivacyProvider); + + if (Version == SNMPVersion.V3 && Security == SNMPV3Security.AuthPriv) + Priv = sessionInfo?.Priv; + + _isLoading = false; + } + + #endregion + + #region Variables + private static readonly ILog Log = LogManager.GetLogger(typeof(SNMPViewModel)); + + private CancellationTokenSource _cancellationTokenSource; + + private readonly Guid _tabId; + private readonly bool _isLoading; + private bool _closed; + + public string Host + { + get; + set { - get => _host; - set - { - if (value == _host) - return; + if (value == field) + return; - _host = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - public ICollectionView HostHistoryView { get; } + public ICollectionView HostHistoryView { get; } - public List Versions { get; set; } + public IEnumerable Modes { get; set; } - private SNMPVersion _version; - public SNMPVersion Version + public SNMPMode Mode + { + get; + set { - get => _version; - set - { - if (value == _version) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.SNMP_Version = value; + if (!_isLoading) + SettingsManager.Current.SNMP_Mode = value; - _version = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); + + // Re-validate OID if mode changed + OnPropertyChanged(nameof(Oid)); } + } - public List Modes { get; set; } + public IEnumerable Versions { get; } - private SNMPMode _mode; - public SNMPMode Mode + public SNMPVersion Version + { + get; + set { - get => _mode; - set - { - if (value == _mode) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.SNMP_Mode = value; + if (!_isLoading) + SettingsManager.Current.SNMP_Version = value; - _mode = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _oid; - public string OID + public string Oid + { + get; + set { - get => _oid; - set - { - if (value == _oid) - return; + if (value == field) + return; - _oid = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - public ICollectionView OIDHistoryView { get; } + public ICollectionView OidHistoryView { get; } - public List Securitys { get; set; } + public IEnumerable Securities { get; } - private SNMPV3Security _security; - public SNMPV3Security Security + public SNMPV3Security Security + { + get; + set { - get => _security; - set - { - if (value == _security) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.SNMP_Security = value; + if (!_isLoading) + SettingsManager.Current.SNMP_Security = value; - _security = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isCommunityEmpty = true; // Initial it's empty - public bool IsCommunityEmpty + public bool IsCommunityEmpty + { + get; + set { - get => _isCommunityEmpty; - set - { - if (value == _isCommunityEmpty) - return; + if (value == field) + return; - _isCommunityEmpty = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = true; - private SecureString _community; - public SecureString Community + public SecureString Community + { + get; + set { - get => _community; - set - { - if (value == _community) - return; + if (value == field) + return; - // Validate the community string - if (value == null) - IsCommunityEmpty = true; - else - IsCommunityEmpty = string.IsNullOrEmpty(SecureStringHelper.ConvertToString(value)); + // Validate the community string + IsCommunityEmpty = value == null || string.IsNullOrEmpty(SecureStringHelper.ConvertToString(value)); - _community = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _username; - public string Username + public string Username + { + get; + set { - get => _username; - set - { - if (value == _username) - return; + if (value == field) + return; - _username = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - public List AuthenticationProviders { get; set; } + public IEnumerable AuthenticationProviders { get; } - private SNMPV3AuthenticationProvider _authenticationProvider; - public SNMPV3AuthenticationProvider AuthenticationProvider + public SNMPV3AuthenticationProvider AuthenticationProvider + { + get; + set { - get => _authenticationProvider; - set - { - if (value == _authenticationProvider) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.SNMP_AuthenticationProvider = value; + if (!_isLoading) + SettingsManager.Current.SNMP_AuthenticationProvider = value; - _authenticationProvider = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isAuthEmpty = true; // Initial it's empty - public bool IsAuthEmpty + public bool IsAuthEmpty + { + get; + set { - get => _isAuthEmpty; - set - { - if (value == _isAuthEmpty) - return; + if (value == field) + return; - _isAuthEmpty = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - - private SecureString _auth; - public SecureString Auth + } = true; + + public SecureString Auth + { + get; + set { - get => _auth; - set - { - if (value == _auth) - return; + if (value == field) + return; - // Validate the auth string - if (value == null) - IsAuthEmpty = true; - else - IsAuthEmpty = string.IsNullOrEmpty(SecureStringHelper.ConvertToString(value)); + // Validate the auth string + IsAuthEmpty = value == null || string.IsNullOrEmpty(SecureStringHelper.ConvertToString(value)); - _auth = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - public List PrivacyProviders { get; set; } + public IEnumerable PrivacyProviders { get; } - private SNMPV3PrivacyProvider _privacyProvider; - public SNMPV3PrivacyProvider PrivacyProvider + public SNMPV3PrivacyProvider PrivacyProvider + { + get; + set { - get => _privacyProvider; - set - { - if (value == _privacyProvider) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.SNMP_PrivacyProvider = value; + if (!_isLoading) + SettingsManager.Current.SNMP_PrivacyProvider = value; - _privacyProvider = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isPrivEmpty = true; // Initial it's empty - public bool IsPrivEmpty + public bool IsPrivEmpty + { + get; + set { - get => _isPrivEmpty; - set - { - if (value == _isPrivEmpty) - return; + if (value == field) + return; - _isPrivEmpty = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = true; - private SecureString _priv; - public SecureString Priv + public SecureString Priv + { + get; + set { - get => _priv; - set - { - if (value == _priv) - return; + if (value == field) + return; - // Validate the auth string - if (value == null) - IsPrivEmpty = true; - else - IsPrivEmpty = string.IsNullOrEmpty(SecureStringHelper.ConvertToString(value)); + // Validate the auth string + IsPrivEmpty = value == null || string.IsNullOrEmpty(SecureStringHelper.ConvertToString(value)); - _priv = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _data = string.Empty; - public string Data + public string Data + { + get; + set { - get => _data; - set - { - if (value == _data) - return; + if (value == field) + return; - _data = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = string.Empty; - private bool _isWorking; - public bool IsWorking + public bool IsRunning + { + get; + set { - get => _isWorking; - set - { - if (value == _isWorking) - return; + if (value == field) + return; - _isWorking = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private ObservableCollection _queryResults = new ObservableCollection(); - public ObservableCollection QueryResults + public bool CancelScan + { + get; + set { - get => _queryResults; - set - { - if (Equals(value, _queryResults)) - return; + if (value == field) + return; - _queryResults = value; - } + field = value; + OnPropertyChanged(); } + } - public ICollectionView QueryResultsView { get; } - - private SNMPReceivedInfo _selectedQueryResult; - public SNMPReceivedInfo SelectedQueryResult + public ObservableCollection QueryResults + { + get; + set { - get => _selectedQueryResult; - set - { - if (value == _selectedQueryResult) - return; + if (Equals(value, field)) + return; - _selectedQueryResult = value; - OnPropertyChanged(); - } + field = value; } + } = []; + + public ICollectionView ResultsView { get; } - private IList _selectedQueryResults = new ArrayList(); - public IList SelectedQueryResults + public SNMPInfo SelectedResult + { + get; + set { - get => _selectedQueryResults; - set - { - if (Equals(value, _selectedQueryResults)) - return; + if (value == field) + return; - _selectedQueryResults = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - - private bool _isStatusMessageDisplayed; - public bool IsStatusMessageDisplayed + public IList SelectedResults + { + get; + set { - get => _isStatusMessageDisplayed; - set - { - if (value == _isStatusMessageDisplayed) - return; + if (Equals(value, field)) + return; - _isStatusMessageDisplayed = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = new ArrayList(); - private string _statusMessage; - public string StatusMessage + + public bool IsStatusMessageDisplayed + { + get; + set { - get => _statusMessage; - set - { - if (value == _statusMessage) - return; + if (value == field) + return; - _statusMessage = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion + } - #region Contructor, load settings - public SNMPViewModel(IDialogCoordinator instance, int tabId, string host) + public string StatusMessage + { + get; + private set { - _isLoading = true; - - _dialogCoordinator = instance; - - TabId = tabId; - Host = host; - - // Set collection view - HostHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.SNMP_HostHistory); - OIDHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.SNMP_OIDHistory); + if (value == field) + return; - // Result view - QueryResultsView = CollectionViewSource.GetDefaultView(QueryResults); - QueryResultsView.SortDescriptions.Add(new SortDescription(nameof(SNMPReceivedInfo.OID), ListSortDirection.Ascending)); + field = value; + OnPropertyChanged(); + } + } - // Versions (v1, v2c, v3) - Versions = System.Enum.GetValues(typeof(SNMPVersion)).Cast().ToList(); + #endregion - // Modes - Modes = new List { SNMPMode.Get, SNMPMode.Walk, SNMPMode.Set }; + #region ICommands & Actions - // Security - Securitys = new List { SNMPV3Security.NoAuthNoPriv, SNMPV3Security.AuthNoPriv, SNMPV3Security.AuthPriv }; + public ICommand WorkCommand => new RelayCommand(_ => WorkAction(), Work_CanExecute); - // Auth / Priv - AuthenticationProviders = new List { SNMPV3AuthenticationProvider.MD5, SNMPV3AuthenticationProvider.SHA1 }; - PrivacyProviders = new List { SNMPV3PrivacyProvider.DES, SNMPV3PrivacyProvider.AES }; + private bool Work_CanExecute(object parameter) + { + return Application.Current.MainWindow != null && + !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && + !ConfigurationManager.Current.IsChildWindowOpen; + } - LoadSettings(); + private void WorkAction() + { + Work(); + } - // Detect if settings have changed... - SettingsManager.Current.PropertyChanged += SettingsManager_PropertyChanged; + public ICommand OpenOIDProfilesCommand => new RelayCommand(_ => OpenOIDProfilesAction()); - _isLoading = false; - } - private void LoadSettings() - { - Version = Versions.FirstOrDefault(x => x == SettingsManager.Current.SNMP_Version); - Mode = Modes.FirstOrDefault(x => x == SettingsManager.Current.SNMP_Mode); - Security = Securitys.FirstOrDefault(x => x == SettingsManager.Current.SNMP_Security); - AuthenticationProvider = AuthenticationProviders.FirstOrDefault(x => x == SettingsManager.Current.SNMP_AuthenticationProvider); - PrivacyProvider = PrivacyProviders.FirstOrDefault(x => x == SettingsManager.Current.SNMP_PrivacyProvider); - } - #endregion + private void OpenOIDProfilesAction() + { + _ = OpenOIDProfileSelection(); + } - #region ICommands & Actions - public ICommand WorkCommand => new RelayCommand(p => WorkAction(), Work_CanExecute); + public ICommand ExportCommand => new RelayCommand(_ => ExportAction()); - private bool Work_CanExecute(object paramter) => Application.Current.MainWindow != null && !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen; + private void ExportAction() + { + _ = Export(); + } - private void WorkAction() - { - Work(); - } + #endregion - public ICommand CopySelectedOIDCommand => new RelayCommand(p => CopySelectedOIDAction()); + #region Methods - private void CopySelectedOIDAction() - { - ClipboardHelper.SetClipboard(SelectedQueryResult.OID); - } + private void Work() + { + if (IsRunning) + StopWork(); + else + StartWork(); + } - public ICommand CopySelectedDataCommand => new RelayCommand(p => CopySelectedDataAction()); + private async void StartWork() + { + IsStatusMessageDisplayed = false; + IsRunning = true; - private void CopySelectedDataAction() - { - ClipboardHelper.SetClipboard(SelectedQueryResult.Data); - } + QueryResults.Clear(); - public ICommand ExportCommand => new RelayCommand(p => ExportAction()); + DragablzTabItem.SetTabHeader(_tabId, Host); - private async void ExportAction() + // Try to parse the string into an IP-Address + if (!IPAddress.TryParse(Host, out var ipAddress)) { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.Export - }; - - var exportViewModel = new ExportViewModel(async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - - try - { - ExportManager.Export(instance.FilePath, instance.FileType, instance.ExportAll ? QueryResults : new ObservableCollection(SelectedQueryResults.Cast().ToArray())); - } - catch (Exception ex) - { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Localization.Resources.Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Error, Localization.Resources.Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); - } + var dnsResult = + await DNSClientHelper.ResolveAorAaaaAsync(Host, + SettingsManager.Current.Network_ResolveHostnamePreferIPv4); - SettingsManager.Current.SNMP_ExportFileType = instance.FileType; - SettingsManager.Current.SNMP_ExportFilePath = instance.FilePath; - }, instance => { _dialogCoordinator.HideMetroDialogAsync(this, customDialog); }, new ExportManager.ExportFileType[] { ExportManager.ExportFileType.CSV, ExportManager.ExportFileType.XML, ExportManager.ExportFileType.JSON }, true, SettingsManager.Current.SNMP_ExportFileType, SettingsManager.Current.SNMP_ExportFilePath); - - customDialog.Content = new ExportDialog + if (dnsResult.HasError) { - DataContext = exportViewModel - }; + StatusMessage = DNSClientHelper.FormatDNSClientResultError(Host, dnsResult); + IsStatusMessageDisplayed = true; + IsRunning = false; + return; + } - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); + ipAddress = dnsResult.Value; } - #endregion - - #region Methods - private async void Work() - { - IsStatusMessageDisplayed = false; - IsWorking = true; - - QueryResults.Clear(); - - // Change the tab title (not nice, but it works) - var window = Application.Current.Windows.OfType().FirstOrDefault(x => x.IsActive); - if (window != null) - { - foreach (var tabablzControl in VisualTreeHelper.FindVisualChildren(window)) - { - tabablzControl.Items.OfType().First(x => x.Id == TabId).Header = Host; - } - } + _cancellationTokenSource?.Dispose(); + _cancellationTokenSource = new CancellationTokenSource(); - // Try to parse the string into an IP-Address - if (!IPAddress.TryParse(Host, out var ipAddress)) - { - ipAddress = await DnsLookupHelper.ResolveIPAddress(Host); - } + // SNMP... + SNMPClient snmpClient = new(); - if (ipAddress == null) - { - Finished(); + snmpClient.Received += SNMPClient_Received; + snmpClient.DataUpdated += SNMPClient_DataUpdated; + snmpClient.Error += SNMPClient_Error; + snmpClient.Canceled += SNMPClient_Canceled; + snmpClient.Complete += SNMPClient_Complete; - StatusMessage = string.Format(Localization.Resources.Strings.CouldNotResolveIPAddressFor, Host); - IsStatusMessageDisplayed = true; + var oidValue = Oid.Replace(" ", ""); - return; - } + // Check if we have multiple OIDs for a Get request + List oids = new(); - // SNMP... - var snmp = new SNMP - { - Port = SettingsManager.Current.SNMP_Port, - Timeout = SettingsManager.Current.SNMP_Timeout - }; + if (Mode == SNMPMode.Get && oidValue.Contains(';')) + oids.AddRange(oidValue.Split(';')); + else + oids.Add(oidValue); - snmp.Received += Snmp_Received; - snmp.TimeoutReached += Snmp_TimeoutReached; - snmp.Error += Snmp_Error; - snmp.UserHasCanceled += Snmp_UserHasCanceled; - snmp.Complete += Snmp_Complete; + // SNMPv1 or v2c + if (Version != SNMPVersion.V3) + { + var snmpOptions = new SNMPOptions( + Community, + Version, + SettingsManager.Current.SNMP_Port, + SettingsManager.Current.SNMP_WalkMode, + _cancellationTokenSource.Token + ); switch (Mode) { case SNMPMode.Get: - if (Version != SNMPVersion.V3) - snmp.GetV1V2CAsync(Version, ipAddress, Community, OID); - else - snmp.Getv3Async(ipAddress, OID, Security, Username, AuthenticationProvider, Auth, PrivacyProvider, Priv); + snmpClient.GetAsync(ipAddress, oids, snmpOptions); break; case SNMPMode.Walk: - if (Version != SNMPVersion.V3) - snmp.WalkV1V2CAsync(Version, ipAddress, Community, OID, SettingsManager.Current.SNMP_WalkMode); - else - snmp.WalkV3Async(ipAddress, OID, Security, Username, AuthenticationProvider, Auth, PrivacyProvider, Priv, SettingsManager.Current.SNMP_WalkMode); + snmpClient.WalkAsync(ipAddress, oids[0], snmpOptions); break; case SNMPMode.Set: - if (Version != SNMPVersion.V3) - snmp.SetV1V2CAsync(Version, ipAddress, Community, OID, Data); - else - snmp.SetV3Async(ipAddress, OID, Security, Username, AuthenticationProvider, Auth, PrivacyProvider, Priv, Data); + snmpClient.SetAsync(ipAddress, oids[0], Data, snmpOptions); break; } - - // Add to history... - AddHostToHistory(Host); - AddOIDToHistory(OID); } + // SNMPv3 + else + { + var snmpOptionsV3 = new SNMPOptionsV3( + Security, + Username, + AuthenticationProvider, + Auth, + PrivacyProvider, + Priv, + SettingsManager.Current.SNMP_Port, + SettingsManager.Current.SNMP_WalkMode, + _cancellationTokenSource.Token + ); - private void Finished() - { - IsWorking = false; + switch (Mode) + { + case SNMPMode.Get: + snmpClient.GetAsyncV3(ipAddress, oids, snmpOptionsV3); + break; + case SNMPMode.Walk: + snmpClient.WalkAsyncV3(ipAddress, oids[0], snmpOptionsV3); + break; + case SNMPMode.Set: + snmpClient.SetAsyncV3(ipAddress, oids[0], Data, snmpOptionsV3); + break; + } } - public void OnClose() - { + // Set timeout + _cancellationTokenSource.CancelAfter(SettingsManager.Current.SNMP_Timeout); - } + // Add to history... + AddHostToHistory(Host); + AddOidToHistory(Oid); + } - private void AddHostToHistory(string host) - { - // Create the new list - var list = ListHelper.Modify(SettingsManager.Current.SNMP_HostHistory.ToList(), host, SettingsManager.Current.General_HistoryListEntries); + private void StopWork() + { + CancelScan = true; + _cancellationTokenSource.Cancel(); + } - // Clear the old items - SettingsManager.Current.SNMP_HostHistory.Clear(); - OnPropertyChanged(nameof(Host)); // Raise property changed again, after the collection has been cleared + public void OnClose() + { + // Prevent multiple calls + if (_closed) + return; - // Fill with the new items - list.ForEach(x => SettingsManager.Current.SNMP_HostHistory.Add(x)); - } + _closed = true; - private void AddOIDToHistory(string oid) - { - // Create the new list - var list = ListHelper.Modify(SettingsManager.Current.SNMP_OIDHistory.ToList(), oid, SettingsManager.Current.General_HistoryListEntries); + ConfigurationManager.Current.SNMPTabCount--; + } - // Clear the old items - SettingsManager.Current.SNMP_OIDHistory.Clear(); - OnPropertyChanged(nameof(OID)); // Raise property changed again, after the collection has been cleared + private async Task OpenOIDProfileSelection() + { + var window = Application.Current.Windows.OfType().FirstOrDefault(x => x.IsActive); - // Fill with the new items - list.ForEach(x => SettingsManager.Current.SNMP_OIDHistory.Add(x)); - } - #endregion + var childWindow = new SNMPOIDProfilesChildWindow(window); - #region Events - private void Snmp_Received(object sender, SNMPReceivedArgs e) + var childWindowViewModel = new SNMPOIDProfilesViewModel(async instance => { - var snmpReceivedInfo = SNMPReceivedInfo.Parse(e); + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(delegate - { - //lock (QueryResults) - QueryResults.Add(snmpReceivedInfo); - })); - } + if (instance.SelectedOIDProfile == null) + return; - private void Snmp_TimeoutReached(object sender, EventArgs e) + Mode = instance.SelectedOIDProfile.Mode; + Oid = instance.SelectedOIDProfile?.OID; + }, async _ => { - StatusMessage = Localization.Resources.Strings.TimeoutOnSNMPQuery; - IsStatusMessageDisplayed = true; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }); - Finished(); - } + childWindow.Title = Strings.SelectOIDProfile; - private void Snmp_Error(object sender, EventArgs e) - { - StatusMessage = Mode == SNMPMode.Set ? Localization.Resources.Strings.ErrorInResponseCheckIfYouHaveWritePermissions : Localization.Resources.Strings.ErrorInResponse; + childWindow.DataContext = childWindowViewModel; - IsStatusMessageDisplayed = true; + ConfigurationManager.Current.IsChildWindowOpen = true; - Finished(); - } + await window.ShowChildWindowAsync(childWindow); + } - private void Snmp_UserHasCanceled(object sender, EventArgs e) - { - StatusMessage = Localization.Resources.Strings.CanceledByUserMessage; - IsStatusMessageDisplayed = true; + private void AddHostToHistory(string host) + { + // Create the new list + var list = ListHelper.Modify(SettingsManager.Current.SNMP_HostHistory.ToList(), host, + SettingsManager.Current.General_HistoryListEntries); - Finished(); - } + // Clear the old items + SettingsManager.Current.SNMP_HostHistory.Clear(); + OnPropertyChanged(nameof(Host)); // Raise property changed again, after the collection has been cleared + + // Fill with the new items + list.ForEach(x => SettingsManager.Current.SNMP_HostHistory.Add(x)); + } + + private void AddOidToHistory(string oid) + { + // Create the new list + var list = ListHelper.Modify(SettingsManager.Current.SNMP_OidHistory.ToList(), oid, + SettingsManager.Current.General_HistoryListEntries); + + // Clear the old items + SettingsManager.Current.SNMP_OidHistory.Clear(); + OnPropertyChanged(nameof(Oid)); // Raise property changed again, after the collection has been cleared - private void Snmp_Complete(object sender, EventArgs e) + // Fill with the new items + list.ForEach(x => SettingsManager.Current.SNMP_OidHistory.Add(x)); + } + + private Task Export() + { + var window = Application.Current.Windows.OfType().FirstOrDefault(x => x.IsActive); + + var childWindow = new ExportChildWindow(); + + var childWindowViewModel = new ExportViewModel(async instance => { - if (Mode == SNMPMode.Set) + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + try { - StatusMessage = Localization.Resources.Strings.DataHasBeenUpdated; - IsStatusMessageDisplayed = true; + ExportManager.Export(instance.FilePath, instance.FileType, + instance.ExportAll + ? QueryResults + : new ObservableCollection(SelectedResults.Cast().ToArray())); } + catch (Exception ex) + { + Log.Error("Error while exporting data as " + instance.FileType, ex); - Finished(); - } + await DialogHelper.ShowMessageAsync(window, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); + } - private void SettingsManager_PropertyChanged(object sender, PropertyChangedEventArgs e) + SettingsManager.Current.SNMP_ExportFileType = instance.FileType; + SettingsManager.Current.SNMP_ExportFilePath = instance.FilePath; + }, _ => { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, [ + ExportFileType.Csv, ExportFileType.Xml, ExportFileType.Json + ], true, SettingsManager.Current.SNMP_ExportFileType, SettingsManager.Current.SNMP_ExportFilePath); - } - #endregion + childWindow.Title = Strings.Export; + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + return window.ShowChildWindowAsync(childWindow); + } + + #endregion + + #region Events + + private void SNMPClient_Received(object sender, SNMPReceivedArgs e) + { + Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, + new Action(delegate { QueryResults.Add(e.Args); })); + } + + private void SNMPClient_DataUpdated(object sender, EventArgs e) + { + StatusMessage = Strings.DataHasBeenUpdated; + IsStatusMessageDisplayed = true; + } + + private void SNMPClient_Error(object sender, SNMPErrorArgs e) + { + if (e.IsErrorCode) + StatusMessage = ResourceTranslator.Translate(ResourceIdentifier.SNMPErrorCode, e.ErrorCode); + else if (e.IsErrorCodeV3) + StatusMessage = ResourceTranslator.Translate(ResourceIdentifier.SNMPV3ErrorCode, e.ErrorCodeV3); + else + StatusMessage = e.ErrorMessage; + + IsStatusMessageDisplayed = true; + } + + private void SNMPClient_Canceled(object sender, EventArgs e) + { + StatusMessage = CancelScan + ? Strings.CanceledByUserMessage + : Strings.TimeoutOnSNMPQuery; + IsStatusMessageDisplayed = true; } + + private void SNMPClient_Complete(object sender, EventArgs e) + { + CancelScan = false; + IsRunning = false; + } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/SNTPLookupHostViewModel.cs b/Source/NETworkManager/ViewModels/SNTPLookupHostViewModel.cs new file mode 100644 index 0000000000..40bee6090a --- /dev/null +++ b/Source/NETworkManager/ViewModels/SNTPLookupHostViewModel.cs @@ -0,0 +1,110 @@ +using System; +using System.Collections.ObjectModel; +using System.Windows.Input; +using Dragablz; +using NETworkManager.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Models; +using NETworkManager.Utilities; +using NETworkManager.Views; + +namespace NETworkManager.ViewModels; + +public class SNTPLookupHostViewModel : ViewModelBase +{ + #region Variables + + public IInterTabClient InterTabClient { get; } + + public string InterTabPartition + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public ObservableCollection TabItems { get; } + + public int SelectedTabIndex + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + #endregion + + #region Constructor, load settings + + public SNTPLookupHostViewModel() + { + InterTabClient = new DragablzInterTabClient(ApplicationName.SNTPLookup); + InterTabPartition = nameof(ApplicationName.SNTPLookup); + + var tabId = Guid.NewGuid(); + + TabItems = + [ + new DragablzTabItem(Strings.NewTab, new SNTPLookupView(tabId), tabId) + ]; + + LoadSettings(); + } + + private void LoadSettings() + { + } + + #endregion + + #region ICommand & Actions + + public ICommand AddTabCommand => new RelayCommand(_ => AddTabAction()); + + private void AddTabAction() + { + AddTab(); + } + + public ItemActionCallback CloseItemCommand => CloseItemAction; + + private static void CloseItemAction(ItemActionCallbackArgs args) + { + ((args.DragablzItem.Content as DragablzTabItem)?.View as IDragablzTabItem)?.CloseTab(); + } + + #endregion + + #region Methods + + private void AddTab() + { + var tabId = Guid.NewGuid(); + + TabItems.Add(new DragablzTabItem(Strings.NewTab, new SNTPLookupView(tabId), tabId)); + + SelectedTabIndex = TabItems.Count - 1; + } + + public void OnViewVisible() + { + } + + public void OnViewHide() + { + } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/SNTPLookupSettingsViewModel.cs b/Source/NETworkManager/ViewModels/SNTPLookupSettingsViewModel.cs new file mode 100644 index 0000000000..6d3eb7ec37 --- /dev/null +++ b/Source/NETworkManager/ViewModels/SNTPLookupSettingsViewModel.cs @@ -0,0 +1,201 @@ +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Localization.Resources; +using NETworkManager.Models.Network; +using NETworkManager.Settings; +using NETworkManager.Utilities; +using NETworkManager.Views; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Data; +using System.Windows.Input; + +namespace NETworkManager.ViewModels; + +public class SNTPLookupSettingsViewModel : ViewModelBase +{ + #region Variables + + private readonly bool _isLoading; + + private readonly ServerConnectionInfo _profileDialogDefaultValues = + new("time.example.com", 123, TransportProtocol.Tcp); + + public ICollectionView SNTPServers + { + get; + private init + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public ServerConnectionInfoProfile SelectedSNTPServer + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = new(); + + private List ServerInfoProfileNames => + SettingsManager.Current.SNTPLookup_SNTPServers.Select(x => x.Name).ToList(); + + public int Timeout + { + get; + set + { + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.SNTPLookup_Timeout = value; + + field = value; + OnPropertyChanged(); + } + } + + #endregion + + #region Constructor, load settings + + public SNTPLookupSettingsViewModel() + { + _isLoading = true; + + SNTPServers = CollectionViewSource.GetDefaultView(SettingsManager.Current.SNTPLookup_SNTPServers); + SNTPServers.SortDescriptions.Add(new SortDescription(nameof(ServerConnectionInfoProfile.Name), + ListSortDirection.Ascending)); + + SelectedSNTPServer = SNTPServers.Cast().FirstOrDefault(); + + LoadSettings(); + + _isLoading = false; + } + + private void LoadSettings() + { + Timeout = SettingsManager.Current.SNTPLookup_Timeout; + } + + #endregion + + #region ICommand & Actions + + public ICommand AddServerCommand => new RelayCommand(_ => AddServerAction()); + + private void AddServerAction() + { + _ = AddServer(); + } + + public ICommand EditServerCommand => new RelayCommand(_ => EditServerAction()); + + private void EditServerAction() + { + _ = EditServer(); + } + + public ICommand DeleteServerCommand => new RelayCommand(_ => DeleteServerAction(), DeleteServer_CanExecute); + + private bool DeleteServer_CanExecute(object obj) + { + return SNTPServers.Cast().Count() > 1; + } + + private void DeleteServerAction() + { + _ = DeleteServer(); + } + + #endregion + + #region Methods + + private async Task AddServer() + { + var childWindow = new ServerConnectionInfoProfileChildWindow(); + + var childWindowViewModel = new ServerConnectionInfoProfileViewModel(instance => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + SettingsManager.Current.SNTPLookup_SNTPServers.Add( + new ServerConnectionInfoProfile(instance.Name, [.. instance.Servers])); + }, _ => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, + (ServerInfoProfileNames, false, false), _profileDialogDefaultValues); + + + childWindow.Title = Strings.AddSNTPServer; + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } + + public async Task EditServer() + { + var childWindow = new ServerConnectionInfoProfileChildWindow(); + + var childWindowViewModel = new ServerConnectionInfoProfileViewModel(instance => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + SettingsManager.Current.SNTPLookup_SNTPServers.Remove(SelectedSNTPServer); + SettingsManager.Current.SNTPLookup_SNTPServers.Add( + new ServerConnectionInfoProfile(instance.Name, [.. instance.Servers])); + }, _ => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, + (ServerInfoProfileNames, true, false), + _profileDialogDefaultValues, SelectedSNTPServer); + + childWindow.Title = Strings.EditSNTPServer; + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } + + private async Task DeleteServer() + { + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, + Strings.DeleteSNTPServer, + Strings.DeleteSNTPServerMessage, + ChildWindowIcon.Info, + Strings.Delete); + + if (!result) + return; + + SettingsManager.Current.SNTPLookup_SNTPServers.Remove(SelectedSNTPServer); + } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/SNTPLookupViewModel.cs b/Source/NETworkManager/ViewModels/SNTPLookupViewModel.cs new file mode 100644 index 0000000000..ce64260c65 --- /dev/null +++ b/Source/NETworkManager/ViewModels/SNTPLookupViewModel.cs @@ -0,0 +1,301 @@ +using log4net; +using MahApps.Metro.Controls; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Models.Export; +using NETworkManager.Models.Network; +using NETworkManager.Settings; +using NETworkManager.Utilities; +using NETworkManager.Views; +using System; +using System.Collections; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Linq; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Data; +using System.Windows.Input; +using System.Windows.Threading; + +namespace NETworkManager.ViewModels; + +public class SNTPLookupViewModel : ViewModelBase +{ + #region Variables + private static readonly ILog Log = LogManager.GetLogger(typeof(SNTPLookupViewModel)); + + private readonly Guid _tabId; + private readonly bool _isLoading; + private bool _closed; + + public ICollectionView SNTPServers { get; } + + public ServerConnectionInfoProfile SNTPServer + { + get; + set + { + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.SNTPLookup_SelectedSNTPServer = value; + + field = value; + OnPropertyChanged(); + } + } = new(); + + public bool IsRunning + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public ObservableCollection Results + { + get; + set + { + if (Equals(value, field)) + return; + + field = value; + } + } = []; + + public ICollectionView ResultsView { get; } + + public SNTPLookupInfo SelectedResult + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public IList SelectedResults + { + get; + set + { + if (Equals(value, field)) + return; + + field = value; + OnPropertyChanged(); + } + } = new ArrayList(); + + public bool IsStatusMessageDisplayed + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public string StatusMessage + { + get; + private set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + #endregion + + #region Contructor, load settings + + public SNTPLookupViewModel(Guid tabId) + { + _isLoading = true; + + ConfigurationManager.Current.SNTPLookupTabCount++; + + _tabId = tabId; + + SNTPServers = new CollectionViewSource { Source = SettingsManager.Current.SNTPLookup_SNTPServers }.View; + SNTPServers.SortDescriptions.Add(new SortDescription(nameof(ServerConnectionInfoProfile.Name), + ListSortDirection.Ascending)); + SNTPServer = + SNTPServers.SourceCollection.Cast().FirstOrDefault(x => + x.Name == SettingsManager.Current.SNTPLookup_SelectedSNTPServer.Name) ?? + SNTPServers.SourceCollection.Cast().First(); + + ResultsView = CollectionViewSource.GetDefaultView(Results); + ResultsView.SortDescriptions.Add( + new SortDescription(nameof(SNTPLookupInfo.Server), ListSortDirection.Ascending)); + + LoadSettings(); + + _isLoading = false; + } + + private void LoadSettings() + { + + } + + #endregion + + #region ICommands & Actions + + public ICommand QueryCommand => new RelayCommand(_ => QueryAction(), Query_CanExecute); + + private bool Query_CanExecute(object parameter) + { + return Application.Current.MainWindow != null && + !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && + !ConfigurationManager.Current.IsChildWindowOpen; + } + + private void QueryAction() + { + if (!IsRunning) + Query(); + } + + public ICommand ExportCommand => new RelayCommand(_ => ExportAction()); + + private void ExportAction() + { + _ = Export(); + } + + #endregion + + #region Methods + + private void Query() + { + IsStatusMessageDisplayed = false; + StatusMessage = string.Empty; + + IsRunning = true; + + // Reset the latest results + Results.Clear(); + + DragablzTabItem.SetTabHeader(_tabId, SNTPServer.Name); + + SNTPLookupSettings settings = new( + SettingsManager.Current.SNTPLookup_Timeout + ); + + SNTPLookup lookup = new(settings); + + lookup.ResultReceived += Lookup_ResultReceived; + lookup.LookupError += Lookup_LookupError; + lookup.LookupComplete += Lookup_LookupComplete; + + lookup.QueryAsync(SNTPServer.Servers, SettingsManager.Current.Network_ResolveHostnamePreferIPv4); + } + + private Task Export() + { + var window = Application.Current.Windows.OfType().FirstOrDefault(x => x.IsActive); + + var childWindow = new ExportChildWindow(); + + var childWindowViewModel = new ExportViewModel(async instance => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + try + { + ExportManager.Export(instance.FilePath, instance.FileType, + instance.ExportAll + ? Results + : new ObservableCollection(SelectedResults.Cast().ToArray())); + } + catch (Exception ex) + { + Log.Error("Error while exporting data as " + instance.FileType, ex); + + await DialogHelper.ShowMessageAsync(window, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); + } + + SettingsManager.Current.SNTPLookup_ExportFileType = instance.FileType; + SettingsManager.Current.SNTPLookup_ExportFilePath = instance.FilePath; + }, _ => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, [ + ExportFileType.Csv, ExportFileType.Xml, ExportFileType.Json + ], true, SettingsManager.Current.SNTPLookup_ExportFileType, SettingsManager.Current.SNTPLookup_ExportFilePath); + + childWindow.Title = Strings.Export; + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + return window.ShowChildWindowAsync(childWindow); + } + + public void OnClose() + { + // Prevent multiple calls + if (_closed) + return; + + _closed = true; + + ConfigurationManager.Current.SNTPLookupTabCount--; + } + + #endregion + + #region Events + + private void Lookup_ResultReceived(object sender, SNTPLookupResultArgs e) + { + Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, + new Action(delegate { Results.Add(e.Args); })); + } + + private void Lookup_LookupError(object sender, SNTPLookupErrorArgs e) + { + if (!string.IsNullOrEmpty(StatusMessage)) + StatusMessage += Environment.NewLine; + + StatusMessage += e.IsDNSError ? e.ErrorMessage : $"{e.Server} ({e.IPEndPoint}) ==> {e.ErrorMessage}"; + IsStatusMessageDisplayed = true; + } + + private void Lookup_LookupComplete(object sender, EventArgs e) + { + IsRunning = false; + } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/ServerConnectionInfoProfileViewModel.cs b/Source/NETworkManager/ViewModels/ServerConnectionInfoProfileViewModel.cs new file mode 100644 index 0000000000..b0def83ee4 --- /dev/null +++ b/Source/NETworkManager/ViewModels/ServerConnectionInfoProfileViewModel.cs @@ -0,0 +1,175 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Windows.Input; +using NETworkManager.Models.Network; +using NETworkManager.Utilities; + +namespace NETworkManager.ViewModels; + +public class ServerConnectionInfoProfileViewModel : ViewModelBase +{ + private readonly ServerConnectionInfo _defaultValues; + + public ServerConnectionInfoProfileViewModel(Action saveCommand, + Action cancelHandler, + (List UsedNames, bool IsEdited, bool allowOnlyIPAddress) options, ServerConnectionInfo defaultValues, + ServerConnectionInfoProfile info = null) + { + SaveCommand = new RelayCommand(_ => saveCommand(this)); + CancelCommand = new RelayCommand(_ => cancelHandler(this)); + + UsedNames = options.UsedNames; + AllowOnlyIPAddress = options.allowOnlyIPAddress; + + _defaultValues = defaultValues; + + info ??= new ServerConnectionInfoProfile(); + + // Remove the current profile name from the list + if (options.IsEdited) + UsedNames.Remove(info.Name); + + Name = info.Name; + Servers = new ObservableCollection(info.Servers); + + ServerWatermark = _defaultValues.Server; + PortWatermark = _defaultValues.Port.ToString(); + Port = _defaultValues.Port; + } + + public ICommand AddServerCommand => new RelayCommand(_ => AddServerAction()); + + public ICommand DeleteServerCommand => new RelayCommand(_ => DeleteServerAction()); + + private void AddServerAction() + { + Servers.Add(new ServerConnectionInfo(Server, Port, _defaultValues.TransportProtocol)); + + Server = string.Empty; + } + + private void DeleteServerAction() + { + // Cast to list to avoid exception: Collection was modified; enumeration operation may not execute. + // This will create a copy of the list and allow us to remove items from the original list (SelectedServers + // is modified when Servers changes). + foreach (var item in SelectedServers.Cast().ToList()) + Servers.Remove(item); + } + + #region Commands + + public ICommand SaveCommand { get; } + + public ICommand CancelCommand { get; } + + #endregion + + #region Variables + + #region Helper + + // ReSharper disable once MemberCanBePrivate.Global + // Used by the view in a BindingProxy + public List UsedNames + { + get; + init + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public bool AllowOnlyIPAddress + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + #endregion + + public string Name + { + get; + set + { + if (field == value) + return; + + field = value; + OnPropertyChanged(); + } + } + + public ObservableCollection Servers + { + get; + private init + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public IList SelectedServers + { + get; + set + { + if (Equals(value, field)) + return; + + field = value; + OnPropertyChanged(); + } + } = new ArrayList(); + + public string ServerWatermark { get; private set; } + + public string Server + { + get; + set + { + if (field == value) + return; + + field = value; + OnPropertyChanged(); + } + } + + public string PortWatermark { get; private set; } + + public int Port + { + get; + set + { + if (field == value) + return; + + field = value; + OnPropertyChanged(); + } + } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/SettingsAppearanceViewModel.cs b/Source/NETworkManager/ViewModels/SettingsAppearanceViewModel.cs index e174fd8a89..8d0b173049 100644 --- a/Source/NETworkManager/ViewModels/SettingsAppearanceViewModel.cs +++ b/Source/NETworkManager/ViewModels/SettingsAppearanceViewModel.cs @@ -1,83 +1,146 @@ -using NETworkManager.Settings; +using NETworkManager.Models.Appearance; +using NETworkManager.Settings; using System.ComponentModel; -using System.Windows.Data; using System.Linq; +using System.Windows.Data; + +namespace NETworkManager.ViewModels; -namespace NETworkManager.ViewModels +public class SettingsAppearanceViewModel : ViewModelBase { - public class SettingsAppearanceViewModel : ViewModelBase + #region Variables + + private readonly bool _isLoading; + + public ICollectionView Themes { get; } + + public ThemeColorInfo SelectedTheme { - #region Variables - private readonly bool _isLoading; + get; + set + { + if (value == field) + return; + + if (!_isLoading && !UseCustomTheme) + { + AppearanceManager.ChangeTheme(value.Name, SelectedAccent.Name); + SettingsManager.Current.Appearance_Theme = value.Name; + } + + field = value; + OnPropertyChanged(); + } + } - public ICollectionView Themes { get; private set; } + public ICollectionView Accents { get; } - private ThemeColorInfo _selectedTheme; - public ThemeColorInfo SelectedTheme + public AccentColorInfo SelectedAccent + { + get; + set { - get => _selectedTheme; - set + if (value == field) + return; + + if (!_isLoading && !UseCustomTheme) { - if (value == _selectedTheme) - return; + AppearanceManager.ChangeTheme(SelectedTheme.Name, value.Name); + SettingsManager.Current.Appearance_Accent = value.Name; + } - if (!_isLoading) - { - AppearanceManager.ChangeTheme(value.Name); - SettingsManager.Current.Appearance_Theme = value.Name; - } + field = value; + OnPropertyChanged(); + } + } - _selectedTheme = value; - OnPropertyChanged(); + public bool UseCustomTheme + { + get; + set + { + if (value == field) + return; + + if (!_isLoading) + { + SettingsManager.Current.Appearance_UseCustomTheme = value; + AppearanceManager.Load(); } + + field = value; + OnPropertyChanged(); } + } + public ICollectionView CustomThemes { get; } - public ICollectionView Accents { get; private set; } - private AccentColorInfo _selectedAccent; - public AccentColorInfo SelectedAccent + public ThemeInfo SelectedCustomTheme + { + get; + set { - get => _selectedAccent; - set + if (value == field) + return; + + if (!_isLoading && UseCustomTheme) { - if (value == _selectedAccent) - return; + AppearanceManager.ChangeTheme(value.Name); + SettingsManager.Current.Appearance_CustomThemeName = value.Name; + } - if (!_isLoading) - { - AppearanceManager.ChangeAccent(value.Name); - SettingsManager.Current.Appearance_Accent = value.Name; - } + field = value; + OnPropertyChanged(); + } + } - _selectedAccent = value; - OnPropertyChanged(); - } + public bool PowerShellModifyGlobalProfile + { + get; + set + { + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.Appearance_PowerShellModifyGlobalProfile = value; + + field = value; + OnPropertyChanged(); } + } - #endregion + #endregion - #region Constructor, LoadSettings - public SettingsAppearanceViewModel() - { - _isLoading = true; + #region Constructor, LoadSettings - Accents = new CollectionViewSource { Source = AppearanceManager.Accents }.View; + public SettingsAppearanceViewModel() + { + _isLoading = true; - // ToDo: Enable White Theme again (Fix: PuTTY and PowerShell) - Themes = new CollectionViewSource { Source = AppearanceManager.Themes }.View; - // Themes = new CollectionViewSource { Source = AppearanceManager.Themes.Where(x => x.Name != "Light") }.View; + Themes = new CollectionViewSource { Source = AppearanceManager.Themes }.View; + Accents = new CollectionViewSource { Source = AppearanceManager.Accents }.View; + CustomThemes = new CollectionViewSource { Source = AppearanceManager.CustomThemes }.View; - LoadSettings(); + LoadSettings(); - _isLoading = false; - } + _isLoading = false; + } - private void LoadSettings() - { - SelectedTheme = Themes.Cast().FirstOrDefault(x => x.Name == SettingsManager.Current.Appearance_Theme); - SelectedAccent = Accents.Cast().FirstOrDefault(x => x.Name == SettingsManager.Current.Appearance_Accent); - } - #endregion + private void LoadSettings() + { + SelectedTheme = Themes.Cast() + .FirstOrDefault(x => x.Name == SettingsManager.Current.Appearance_Theme); + SelectedAccent = Accents.Cast() + .FirstOrDefault(x => x.Name == SettingsManager.Current.Appearance_Accent); + UseCustomTheme = SettingsManager.Current.Appearance_UseCustomTheme; + SelectedCustomTheme = + CustomThemes.Cast() + .FirstOrDefault(x => x.Name == SettingsManager.Current.Appearance_CustomThemeName) ?? + CustomThemes.Cast().FirstOrDefault(); + PowerShellModifyGlobalProfile = SettingsManager.Current.Appearance_PowerShellModifyGlobalProfile; } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/SettingsAutostartViewModel.cs b/Source/NETworkManager/ViewModels/SettingsAutostartViewModel.cs index 2e28935162..c717f50413 100644 --- a/Source/NETworkManager/ViewModels/SettingsAutostartViewModel.cs +++ b/Source/NETworkManager/ViewModels/SettingsAutostartViewModel.cs @@ -1,109 +1,111 @@ -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.Settings; using System; using System.Threading.Tasks; +using System.Windows; +using NETworkManager.Localization.Resources; +using NETworkManager.Settings; +using NETworkManager.Utilities; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +public class SettingsAutostartViewModel : ViewModelBase { - public class SettingsAutostartViewModel : ViewModelBase + #region Constructor + + public SettingsAutostartViewModel() { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; + _isLoading = true; - private readonly bool _isLoading; + LoadSettings(); - private bool _startWithWindows; - public bool StartWithWindows - { - get => _startWithWindows; - set - { - if (value == _startWithWindows) - return; - - if (!_isLoading) - EnableDisableAutostart(value); - - _startWithWindows = value; - OnPropertyChanged(); - } - } + _isLoading = false; + } + + #endregion + + #region Load settings + + private void LoadSettings() + { + StartWithWindows = AutostartManager.IsEnabled; + StartMinimizedInTray = SettingsManager.Current.Autostart_StartMinimizedInTray; + } + + #endregion + + #region Methods + + private async Task EnableDisableAutostart(bool enable) + { + ConfiguringAutostart = true; - private bool _configuringAutostart; - public bool ConfiguringAutostart + try { - get => _configuringAutostart; - set - { - if (value == _configuringAutostart) - return; - - _configuringAutostart = value; - OnPropertyChanged(); - } - } + if (enable) + await AutostartManager.EnableAsync(); + else + await AutostartManager.DisableAsync(); - private bool _startMinimizedInTray; - public bool StartMinimizedInTray + // Make the user happy, let him see a reload animation (and he cannot spam the reload command) + await Task.Delay(GlobalStaticConfiguration.ApplicationUIRefreshInterval); + } + catch (Exception ex) { - get => _startMinimizedInTray; - set - { - if (value == _startMinimizedInTray) - return; - - if (!_isLoading) - SettingsManager.Current.Autostart_StartMinimizedInTray = value; - - _startMinimizedInTray = value; - OnPropertyChanged(); - } + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + ex.Message, ChildWindowIcon.Error); } - #endregion - #region Constructor - public SettingsAutostartViewModel(IDialogCoordinator instance) - { - _isLoading = true; + ConfiguringAutostart = false; + } - _dialogCoordinator = instance; + #endregion + + #region Variables + private readonly bool _isLoading; + + public bool StartWithWindows + { + get; + set + { + if (value == field) + return; - LoadSettings(); + if (!_isLoading) + EnableDisableAutostart(value).ConfigureAwait(true); - _isLoading = false; + field = value; + OnPropertyChanged(); } - #endregion + } - #region Load settings - private void LoadSettings() + public bool ConfiguringAutostart + { + get; + set { - StartWithWindows = AutostartManager.IsEnabled; - StartMinimizedInTray = SettingsManager.Current.Autostart_StartMinimizedInTray; + if (value == field) + return; + + field = value; + OnPropertyChanged(); } - #endregion + } - #region Methods - private async Task EnableDisableAutostart(bool enable) + public bool StartMinimizedInTray + { + get; + set { - ConfiguringAutostart = true; - - try - { - if (enable) - await AutostartManager.EnableAsync(); - else - await AutostartManager.DisableAsync(); - - // Show the user some awesome animation to indicate we are working on it :) - await Task.Delay(2000); - } - catch (Exception ex) - { - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Error, ex.Message, MessageDialogStyle.Affirmative, AppearanceManager.MetroDialog); - } - - ConfiguringAutostart = false; + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.Autostart_StartMinimizedInTray = value; + + field = value; + OnPropertyChanged(); } - #endregion } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/SettingsGeneralViewModel.cs b/Source/NETworkManager/ViewModels/SettingsGeneralViewModel.cs index 7f4dc87651..300ef818ee 100644 --- a/Source/NETworkManager/ViewModels/SettingsGeneralViewModel.cs +++ b/Source/NETworkManager/ViewModels/SettingsGeneralViewModel.cs @@ -1,262 +1,207 @@ -using NETworkManager.Models; -using NETworkManager.Settings; -using NETworkManager.Utilities; using System.ComponentModel; using System.Linq; using System.Windows.Data; using System.Windows.Input; +using NETworkManager.Models; +using NETworkManager.Settings; +using NETworkManager.Utilities; -namespace NETworkManager.ViewModels -{ - public class SettingsGeneralViewModel : ViewModelBase - { - #region Variables - private readonly bool _isLoading; +namespace NETworkManager.ViewModels; - //public ObservableCollection ApplicationViewCollection { get; set; } - public ICollectionView Applications { get; private set; } +public class SettingsGeneralViewModel : ViewModelBase +{ + #region Variables - private ApplicationInfo _defaultApplicationSelectedItem; - public ApplicationInfo DefaultApplicationSelectedItem - { - get => _defaultApplicationSelectedItem; - set - { - if (value == _defaultApplicationSelectedItem) - return; - - if (value != null && !_isLoading) - SettingsManager.Current.General_DefaultApplicationViewName = value.Name; - - _defaultApplicationSelectedItem = value; - OnPropertyChanged(); - } - } + private readonly bool _isLoading; - public ICollectionView ApplicationsVisible { get; private set; } + public ICollectionView Applications { get; private set; } - private ApplicationInfo _visibleApplicationSelectedItem; - public ApplicationInfo VisibleApplicationSelectedItem + public ApplicationInfo ApplicationSelectedItem + { + get; + set { - get => _visibleApplicationSelectedItem; - set - { - if (value == _visibleApplicationSelectedItem) - return; - - _visibleApplicationSelectedItem = value; - - ValidateHideVisibleApplications(); + if (Equals(value, field)) + return; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isVisibleToHideApplicationEnabled; - public bool IsVisibleToHideApplicationEnabled + public int BackgroundJobInterval + { + get; + set { - get => _isVisibleToHideApplicationEnabled; - set - { - if (value == _isVisibleToHideApplicationEnabled) - return; - - _isVisibleToHideApplicationEnabled = value; - OnPropertyChanged(); - } - } + if (value == field) + return; - public ICollectionView ApplicationsHidden { get; private set; } + if (!_isLoading) + SettingsManager.Current.General_BackgroundJobInterval = value; - private ApplicationInfo _hiddenApplicationSelectedItem; - public ApplicationInfo HiddenApplicationSelectedItem - { - get => _hiddenApplicationSelectedItem; - set - { - if (value == _hiddenApplicationSelectedItem) - return; + field = value; + OnPropertyChanged(); + } + } - _hiddenApplicationSelectedItem = value; + public int ThreadPoolAdditionalMinThreads + { + get; + set + { + if (value == field) + return; - ValidateHideVisibleApplications(); + if (!_isLoading) + SettingsManager.Current.General_ThreadPoolAdditionalMinThreads = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isHideToVisibleApplicationEnabled; - public bool IsHideToVisibleApplicationEnabled + public int HistoryListEntries + { + get; + set { - get => _isHideToVisibleApplicationEnabled; - set - { - if (value == _isHideToVisibleApplicationEnabled) - return; - - _isHideToVisibleApplicationEnabled = value; - OnPropertyChanged(); - } - } + if (value == field) + return; - private int _backgroundJobInterval; - public int BackgroundJobInterval - { - get => _backgroundJobInterval; - set - { - if (value == _backgroundJobInterval) - return; - - if (!_isLoading) - SettingsManager.Current.General_BackgroundJobInterval = value; - - _backgroundJobInterval = value; - OnPropertyChanged(); - } - } + if (!_isLoading) + SettingsManager.Current.General_HistoryListEntries = value; - private int _historyListEntries; - public int HistoryListEntries - { - get => _historyListEntries; - set - { - if (value == _historyListEntries) - return; - - if (!_isLoading) - SettingsManager.Current.General_HistoryListEntries = value; - - _historyListEntries = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion + } - #region Constructor, LoadSettings - public SettingsGeneralViewModel() - { - _isLoading = true; + #endregion - LoadSettings(); + #region Constructor, LoadSettings - SettingsManager.Current.General_ApplicationList.CollectionChanged += General_ApplicationList_CollectionChanged; + public SettingsGeneralViewModel() + { + _isLoading = true; - _isLoading = false; - } + LoadSettings(); - private void General_ApplicationList_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) - { - ApplicationsVisible.Refresh(); - ApplicationsHidden.Refresh(); - } + SettingsManager.Current.General_ApplicationList.CollectionChanged += (_, _) => Applications.Refresh(); - private void LoadSettings() - { - //ApplicationViewCollection = new ObservableCollection(SettingsManager.Current.General_ApplicationList); - Applications = new CollectionViewSource { Source = SettingsManager.Current.General_ApplicationList }.View; + _isLoading = false; + } - ApplicationsVisible = new CollectionViewSource { Source = SettingsManager.Current.General_ApplicationList }.View; - ApplicationsVisible.Filter = o => - { - if (!(o is ApplicationInfo info)) - return false; + private void LoadSettings() + { + Applications = new CollectionViewSource + { + Source = SettingsManager.Current.General_ApplicationList + }.View; - return info.IsVisible; - }; + BackgroundJobInterval = SettingsManager.Current.General_BackgroundJobInterval; + ThreadPoolAdditionalMinThreads = SettingsManager.Current.General_ThreadPoolAdditionalMinThreads; + HistoryListEntries = SettingsManager.Current.General_HistoryListEntries; + } - ApplicationsHidden = new CollectionViewSource { Source = SettingsManager.Current.General_ApplicationList }.View; + #endregion - ApplicationsHidden.Filter = o => - { - if (!(o is ApplicationInfo info)) - return false; + #region ICommand & Actions - return !info.IsVisible; - }; + public ICommand SetDefaultApplicationCommand => new RelayCommand(_ => SetDefaultApplicationAction()); - ValidateHideVisibleApplications(); + private void SetDefaultApplicationAction() + { + if (ApplicationSelectedItem == null) + return; - DefaultApplicationSelectedItem = Applications.Cast().FirstOrDefault(x => x.Name == SettingsManager.Current.General_DefaultApplicationViewName); - BackgroundJobInterval = SettingsManager.Current.General_BackgroundJobInterval; - HistoryListEntries = SettingsManager.Current.General_HistoryListEntries; - } - #endregion + SetDefaultApplication(ApplicationSelectedItem.Name); + } - #region ICommands & Actions - public ICommand VisibleToHideApplicationCommand - { - get { return new RelayCommand(p => VisibleToHideApplicationAction()); } - } + public ICommand ShowApplicationCommand => new RelayCommand(_ => ShowApplicationAction()); - private void VisibleToHideApplicationAction() - { - var index = 0; + private void ShowApplicationAction() + { + if (ApplicationSelectedItem == null) + return; - var newDefaultApplication = DefaultApplicationSelectedItem.Name == VisibleApplicationSelectedItem.Name; + ChangeApplicationVisibility(ApplicationSelectedItem.Name, true); + } - for (var i = 0; i < SettingsManager.Current.General_ApplicationList.Count; i++) - { - if (SettingsManager.Current.General_ApplicationList[i].Name != VisibleApplicationSelectedItem.Name) - continue; + public ICommand HideApplicationCommand => new RelayCommand(_ => HideApplicationAction()); - index = i; + private void HideApplicationAction() + { + if (ApplicationSelectedItem == null) + return; - break; - } + ChangeApplicationVisibility(ApplicationSelectedItem.Name, false); + } - // Remove and add will fire a collection changed event --> detected in MainWindow - var info = SettingsManager.Current.General_ApplicationList[index]; + public ICommand RestoreApplicationsDefaultsCommand => new RelayCommand(_ => RestoreApplicationsDefaultsAction()); - info.IsVisible = false; + private void RestoreApplicationsDefaultsAction() + { + // Sort + var defaultList = ApplicationManager.GetDefaultList().ToList(); - SettingsManager.Current.General_ApplicationList.RemoveAt(index); - SettingsManager.Current.General_ApplicationList.Insert(index, info); + var indexMap = SettingsManager.Current.General_ApplicationList + .Select((item, index) => new { Item = item, Index = defaultList.IndexOf(item) }) + .OrderBy(x => x.Index) + .ToList(); - if (newDefaultApplication) - DefaultApplicationSelectedItem = ApplicationsVisible.Cast().FirstOrDefault(); + for (var i = 0; i < indexMap.Count; i++) + { + var currentIndex = SettingsManager.Current.General_ApplicationList.IndexOf(indexMap[i].Item); - ValidateHideVisibleApplications(); + if (currentIndex != i) + SettingsManager.Current.General_ApplicationList.Move(currentIndex, i); } - public ICommand HideToVisibleApplicationCommand - { - get { return new RelayCommand(p => HideToVisibleApplicationAction()); } - } + // Visible + var hiddenApplications = SettingsManager.Current.General_ApplicationList.Where(x => x.IsVisible == false); - private void HideToVisibleApplicationAction() - { - var index = 0; + foreach (var hiddenApplication in hiddenApplications.ToList()) + ChangeApplicationVisibility(hiddenApplication.Name, true); - for (var i = 0; i < SettingsManager.Current.General_ApplicationList.Count; i++) - { - if (SettingsManager.Current.General_ApplicationList[i].Name == HiddenApplicationSelectedItem.Name) - { - index = i; - break; - } - } + // Default + SetDefaultApplication(ApplicationName.Dashboard); + } - // Remove and add will fire a collection changed event --> detected in MainWindow - var info = SettingsManager.Current.General_ApplicationList[index]; + #endregion - info.IsVisible = true; + #region Methods - SettingsManager.Current.General_ApplicationList.RemoveAt(index); - SettingsManager.Current.General_ApplicationList.Insert(index, info); + /// + /// Set the default application that will be shown when the application starts. + /// + /// Name of the application. + private void SetDefaultApplication(ApplicationName applicationName) + { + foreach (var application in SettingsManager.Current.General_ApplicationList) + application.IsDefault = application.Name == applicationName; - ValidateHideVisibleApplications(); - } - #endregion + SettingsManager.Current.SettingsChanged = true; + } - #region Methods + /// + /// Change the visibility of an application. + /// + /// Name of the application. + /// If set to true the application will be visible. + private void ChangeApplicationVisibility(ApplicationName applicationName, bool isVisible) + { + var application = + SettingsManager.Current.General_ApplicationList.FirstOrDefault(x => x.Name == applicationName); - private void ValidateHideVisibleApplications() - { - IsVisibleToHideApplicationEnabled = ApplicationsVisible.Cast().Count() > 1 && VisibleApplicationSelectedItem != null; - IsHideToVisibleApplicationEnabled = ApplicationsHidden.Cast().Any() && HiddenApplicationSelectedItem != null; - } - #endregion + var index = SettingsManager.Current.General_ApplicationList.IndexOf(application); + + application.IsVisible = isVisible; + + SettingsManager.Current.General_ApplicationList.RemoveAt(index); + + SettingsManager.Current.General_ApplicationList.Insert(index, application); } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/SettingsHotKeysViewModel.cs b/Source/NETworkManager/ViewModels/SettingsHotKeysViewModel.cs index 711787f627..1ef0e6974c 100644 --- a/Source/NETworkManager/ViewModels/SettingsHotKeysViewModel.cs +++ b/Source/NETworkManager/ViewModels/SettingsHotKeysViewModel.cs @@ -1,73 +1,75 @@ -using NETworkManager.Settings; using MahApps.Metro.Controls; +using NETworkManager.Settings; using NETworkManager.Utilities; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +public class SettingsHotKeysViewModel : ViewModelBase { - public class SettingsHotKeysViewModel : ViewModelBase - { - #region Variables - private readonly bool _isLoading; + #region Variables - private bool _hotKeyShowWindowEnabled; - public bool HotKeyShowWindowEnabled - { - get => _hotKeyShowWindowEnabled; - set - { - if (value == _hotKeyShowWindowEnabled) - return; + private readonly bool _isLoading; - if (!_isLoading) - { - SettingsManager.Current.HotKey_ShowWindowEnabled = value; + public bool HotKeyShowWindowEnabled + { + get; + set + { + if (value == field) + return; - SettingsManager.HotKeysChanged = true; - } + if (!_isLoading) + { + SettingsManager.Current.HotKey_ShowWindowEnabled = value; - _hotKeyShowWindowEnabled = value; - OnPropertyChanged(); + SettingsManager.HotKeysChanged = true; } + + field = value; + OnPropertyChanged(); } + } - private HotKey _hotKeyShowWindow; - public HotKey HotKeyShowWindow + public HotKey HotKeyShowWindow + { + get; + set { - get => _hotKeyShowWindow; - set - { - if (Equals(value, _hotKeyShowWindow)) - return; - - if (!_isLoading && value != null) - { - SettingsManager.Current.HotKey_ShowWindowKey = (int)HotKeys.WpfKeyToFormsKeys(value.Key); - SettingsManager.Current.HotKey_ShowWindowModifier = HotKeys.GetModifierKeysSum(value.ModifierKeys); + if (Equals(value, field)) + return; - SettingsManager.HotKeysChanged = true; - } + if (!_isLoading && value != null) + { + SettingsManager.Current.HotKey_ShowWindowKey = (int)HotKeys.WpfKeyToFormsKeys(value.Key); + SettingsManager.Current.HotKey_ShowWindowModifier = HotKeys.GetModifierKeysSum(value.ModifierKeys); - _hotKeyShowWindow = value; - OnPropertyChanged(); + SettingsManager.HotKeysChanged = true; } + + field = value; + OnPropertyChanged(); } - #endregion + } - #region Constructor, LoadSettings - public SettingsHotKeysViewModel() - { - _isLoading = true; + #endregion - LoadSettings(); + #region Constructor, LoadSettings - _isLoading = false; - } + public SettingsHotKeysViewModel() + { + _isLoading = true; - private void LoadSettings() - { - HotKeyShowWindowEnabled = SettingsManager.Current.HotKey_ShowWindowEnabled; - HotKeyShowWindow = new HotKey(HotKeys.FormsKeysToWpfKey(SettingsManager.Current.HotKey_ShowWindowKey), HotKeys.GetModifierKeysFromInt(SettingsManager.Current.HotKey_ShowWindowModifier)); - } - #endregion + LoadSettings(); + + _isLoading = false; + } + + private void LoadSettings() + { + HotKeyShowWindowEnabled = SettingsManager.Current.HotKey_ShowWindowEnabled; + HotKeyShowWindow = new HotKey(HotKeys.FormsKeysToWpfKey(SettingsManager.Current.HotKey_ShowWindowKey), + HotKeys.GetModifierKeysFromInt(SettingsManager.Current.HotKey_ShowWindowModifier)); } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/SettingsLanguageViewModel.cs b/Source/NETworkManager/ViewModels/SettingsLanguageViewModel.cs index fb694bcd99..c0b751a919 100644 --- a/Source/NETworkManager/ViewModels/SettingsLanguageViewModel.cs +++ b/Source/NETworkManager/ViewModels/SettingsLanguageViewModel.cs @@ -1,121 +1,103 @@ -using System.Linq; -using System.Windows.Data; -using NETworkManager.Settings; -using NETworkManager.Utilities; -using System.ComponentModel; using System; +using System.ComponentModel; +using System.Linq; +using System.Windows.Data; using System.Windows.Input; using NETworkManager.Localization; +using NETworkManager.Settings; +using NETworkManager.Utilities; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +public class SettingsLanguageViewModel : ViewModelBase { - public class SettingsLanguageViewModel : ViewModelBase - { - #region Variables - private readonly bool _isLoading; + #region Construtor, LoadSettings - public ICollectionView Languages { get; } + public SettingsLanguageViewModel() + { + _isLoading = true; - private string _cultureCode = string.Empty; + Languages = CollectionViewSource.GetDefaultView(LocalizationManager.List); + Languages.SortDescriptions.Add(new SortDescription(nameof(LocalizationInfo.IsOfficial), + ListSortDirection.Descending)); + Languages.SortDescriptions.Add(new SortDescription(nameof(LocalizationInfo.Name), ListSortDirection.Ascending)); - private LocalizationInfo _selectedLanguage; - public LocalizationInfo SelectedLangauge + Languages.Filter = o => { - get => _selectedLanguage; - set - { - if (value == _selectedLanguage) - return; + if (string.IsNullOrEmpty(Search)) + return true; - if (!_isLoading && value != null) // Don't change if the value is null (can happen when a user searchs for a language....) - { - LocalizationManager.GetInstance().Change(value); + if (o is not LocalizationInfo info) + return false; - SettingsManager.Current.Localization_CultureCode = value.Code; + var search = Search.Trim(); - RestartRequired = (value.Code != _cultureCode); - } + // Search by: Name, NativeName + return info.Name.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1 || + info.NativeName.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1; + }; - _selectedLanguage = value; - OnPropertyChanged(); - } - } + SelectedLanguage = Languages.Cast() + .FirstOrDefault(x => x.Code == LocalizationManager.GetInstance().Current.Code); - private string _search; - public string Search - { - get => _search; - set - { - if (value == _search) - return; - - _search = value; + _isLoading = false; + } - Languages.Refresh(); + #endregion - OnPropertyChanged(); - } - } + #region Variables - private bool _restartRequired; - public bool RestartRequired - { - get => _restartRequired; - set - { - if (value == _restartRequired) - return; + private readonly bool _isLoading; - _restartRequired = value; - OnPropertyChanged(); - } - } - #endregion + public ICollectionView Languages { get; } - #region Construtor, LoadSettings - public SettingsLanguageViewModel() + public LocalizationInfo SelectedLanguage + { + get; + set { - _isLoading = true; - - Languages = CollectionViewSource.GetDefaultView(LocalizationManager.List); - Languages.SortDescriptions.Add(new SortDescription(nameof(LocalizationInfo.IsOfficial), ListSortDirection.Descending)); - Languages.SortDescriptions.Add(new SortDescription(nameof(LocalizationInfo.Name), ListSortDirection.Ascending)); + if (value == field) + return; - Languages.Filter = o => + if (!_isLoading && + value != null) // Don't change if the value is null (can happen when a user search for a language....) { - if (string.IsNullOrEmpty(Search)) - return true; + LocalizationManager.GetInstance().Change(value); - if (!(o is LocalizationInfo info)) - return false; + SettingsManager.Current.Localization_CultureCode = value.Code; + } - var search = Search.Trim(); + field = value; + OnPropertyChanged(); + } + } - // Search by: Name, NativeName - return info.Name.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1 || info.NativeName.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1; - }; + public string Search + { + get; + set + { + if (value == field) + return; - SelectedLangauge = Languages.Cast().FirstOrDefault(x => x.Code == LocalizationManager.GetInstance().Current.Code); + field = value; - LoadSettings(); + Languages.Refresh(); - _isLoading = false; + OnPropertyChanged(); } + } - private void LoadSettings() - { - _cultureCode = SettingsManager.Current.Localization_CultureCode; - } - #endregion + #endregion - #region ICommands & Actions - public ICommand ClearSearchCommand => new RelayCommand(p => ClearSearchAction()); + #region ICommands & Actions - private void ClearSearchAction() - { - Search = string.Empty; - } - #endregion + public ICommand ClearSearchCommand => new RelayCommand(_ => ClearSearchAction()); + + private void ClearSearchAction() + { + Search = string.Empty; } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/SettingsNetworkViewModel.cs b/Source/NETworkManager/ViewModels/SettingsNetworkViewModel.cs new file mode 100644 index 0000000000..3ea8b6ce19 --- /dev/null +++ b/Source/NETworkManager/ViewModels/SettingsNetworkViewModel.cs @@ -0,0 +1,100 @@ +using NETworkManager.Settings; + +namespace NETworkManager.ViewModels; + +public class SettingsNetworkViewModel : ViewModelBase +{ + #region Variables + + private readonly bool _isLoading; + + public bool UseCustomDNSServer + { + get; + set + { + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.Network_UseCustomDNSServer = value; + + field = value; + OnPropertyChanged(); + } + } + + + public string CustomDNSServer + { + get; + set + { + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.Network_CustomDNSServer = value.Replace(" ", ""); + + field = value; + OnPropertyChanged(); + } + } + + public bool ResolveHostnamePreferIPv4 + { + get; + set + { + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.Network_ResolveHostnamePreferIPv4 = value; + + field = value; + OnPropertyChanged(); + } + } + + public bool ResolveHostnamePreferIPv6 + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + #endregion + + #region Constructor, LoadSettings + + public SettingsNetworkViewModel() + { + _isLoading = true; + + LoadSettings(); + + _isLoading = false; + } + + private void LoadSettings() + { + UseCustomDNSServer = SettingsManager.Current.Network_UseCustomDNSServer; + + if (SettingsManager.Current.Network_CustomDNSServer != null) + CustomDNSServer = string.Join("; ", SettingsManager.Current.Network_CustomDNSServer); + + if (SettingsManager.Current.Network_ResolveHostnamePreferIPv4) + ResolveHostnamePreferIPv4 = true; + else + ResolveHostnamePreferIPv6 = true; + } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/SettingsProfilesViewModel.cs b/Source/NETworkManager/ViewModels/SettingsProfilesViewModel.cs index 95fb9cda6a..2905a17def 100644 --- a/Source/NETworkManager/ViewModels/SettingsProfilesViewModel.cs +++ b/Source/NETworkManager/ViewModels/SettingsProfilesViewModel.cs @@ -1,4 +1,5 @@ -using MahApps.Metro.Controls.Dialogs; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Localization.Resources; using NETworkManager.Profiles; using NETworkManager.Settings; using NETworkManager.Utilities; @@ -8,481 +9,556 @@ using System.Diagnostics; using System.IO; using System.Linq; +using System.Security.Cryptography; using System.Threading.Tasks; +using System.Windows; using System.Windows.Data; using System.Windows.Input; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +public class SettingsProfilesViewModel : ViewModelBase { - public class SettingsProfilesViewModel : ViewModelBase + #region Variables + + public Action CloseAction { get; set; } + + private readonly bool _isLoading; + + public string Location { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; + get; + set + { + if (value == field) + return; - public Action CloseAction { get; set; } - public bool IsPortable => ConfigurationManager.Current.IsPortable; + if (!_isLoading) + IsLocationChanged = !string.Equals(value, ProfileManager.GetProfilesFolderLocation(), + StringComparison.OrdinalIgnoreCase); - private string _location; - public string Location + field = value; + OnPropertyChanged(); + } + } + + /// + /// Indicates whether the profiles location is managed by a system-wide policy. + /// + public bool IsLocationManagedByPolicy => !string.IsNullOrWhiteSpace(PolicyManager.Current?.Profiles_FolderLocation); + + /// + /// Gets or sets a value indicating whether the location has changed. + /// + public bool IsLocationChanged + { + get; + set { - get => _location; - set - { - if (value == _location) - return; + if (value == field) + return; - _location = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _movingFiles; - public bool MovingFiles + /// + /// Indicates whether the current location is the default profiles folder location. + /// + public bool IsDefaultLocation + { + get; + set { - get => _movingFiles; - set - { - if (value == _movingFiles) - return; + if (value == field) + return; - _movingFiles = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private ICollectionView _profileFiles; - public ICollectionView ProfileFiles + /// + /// Gets the collection view of profile files. + /// + public ICollectionView ProfileFiles + { + get; + private init { - get => _profileFiles; - set - { - if (value == _profileFiles) - return; + if (value == field) + return; - _profileFiles = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private ProfileFileInfo _selectedProfileFile; - public ProfileFileInfo SelectedProfileFile + /// + /// Gets or sets the currently selected profile file information. + /// + public ProfileFileInfo SelectedProfileFile + { + get; + set { - get => _selectedProfileFile; - set - { - if (Equals(value, _selectedProfileFile)) - return; + if (Equals(value, field)) + return; - _selectedProfileFile = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion + } - #region Constructor, LoadSettings - public SettingsProfilesViewModel(IDialogCoordinator instance) + + /// + /// Gets or sets a value indicating whether daily backups are enabled. + /// + public bool IsDailyBackupEnabled + { + get; + set { - _dialogCoordinator = instance; + if (value == field) + return; - ProfileFiles = new CollectionViewSource { Source = ProfileManager.ProfileFiles }.View; - ProfileFiles.SortDescriptions.Add(new SortDescription(nameof(ProfileFileInfo.Name), ListSortDirection.Ascending)); + if (!_isLoading) + SettingsManager.Current.Profiles_IsDailyBackupEnabled = value; - LoadSettings(); + field = value; + OnPropertyChanged(); } + } - private void LoadSettings() + /// + /// Gets or sets the maximum number of backups to keep. + /// + public int MaximumNumberOfBackups + { + get; + set { - Location = ProfileManager.GetProfilesLocation(); + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.Profiles_MaximumNumberOfBackups = value; + + field = value; + OnPropertyChanged(); } - #endregion + } - #region ICommands & Actions - public ICommand BrowseLocationFolderCommand => new RelayCommand(p => BrowseLocationFolderAction()); + #endregion - private void BrowseLocationFolderAction() - { - using (var dialog = new System.Windows.Forms.FolderBrowserDialog()) - { - if (Directory.Exists(Location)) - dialog.SelectedPath = Location; + #region Constructor, LoadSettings - var dialogResult = dialog.ShowDialog(); + /// + /// Initializes a new instance of the class and loads the current profile files. + /// + public SettingsProfilesViewModel() + { + _isLoading = true; - if (dialogResult == System.Windows.Forms.DialogResult.OK) - Location = dialog.SelectedPath; - } - } + ProfileFiles = new CollectionViewSource { Source = ProfileManager.ProfileFiles }.View; + ProfileFiles.SortDescriptions.Add( + new SortDescription(nameof(ProfileFileInfo.Name), ListSortDirection.Ascending)); - public ICommand OpenLocationCommand => new RelayCommand(p => OpenLocationAction()); + SelectedProfileFile = ProfileFiles.Cast().FirstOrDefault(); - private static void OpenLocationAction() - { - Process.Start("explorer.exe", ProfileManager.GetProfilesLocation()); - } + LoadSettings(); - public ICommand ChangeLocationCommand => new RelayCommand(p => ChangeLocationAction()); + _isLoading = false; + } - private async Task ChangeLocationAction() - { - MovingFiles = true; + /// + /// Load view specific settings. + /// + private void LoadSettings() + { + Location = ProfileManager.GetProfilesFolderLocation(); + IsDefaultLocation = string.Equals(Location, ProfileManager.GetDefaultProfilesFolderLocation(), StringComparison.OrdinalIgnoreCase); + IsDailyBackupEnabled = SettingsManager.Current.Profiles_IsDailyBackupEnabled; + MaximumNumberOfBackups = SettingsManager.Current.Profiles_MaximumNumberOfBackups; + } - // Check if a profile file with the same name is in the new folder - var containsDuplicatedFiles = false; + #endregion - var files = Directory.GetFiles(Location); + #region ICommands & Actions + /// + /// Gets the command that opens the location folder selection dialog. + /// + public ICommand BrowseLocationFolderCommand => new RelayCommand(p => BrowseLocationFolderAction()); - var containsOtherFiles = files.Any(); + /// + /// Opens a dialog that allows the user to select a folder location and updates the Location property with the + /// selected path if the user confirms the selection. + /// + private void BrowseLocationFolderAction() + { + using var dialog = new System.Windows.Forms.FolderBrowserDialog(); - foreach (var file in files) - { - var fileName = Path.GetFileName(file); - - foreach (var profileFile in ProfileManager.ProfileFiles) - { - if (fileName == Path.GetFileName(profileFile.Path)) - { - containsDuplicatedFiles = true; - break; - } - } - - if (containsDuplicatedFiles) - break; - } + if (Directory.Exists(Location)) + dialog.SelectedPath = Location; - /* - * -1 Cancel - * 0 Move and overwrite - * 1 Move and merge - * 2 User other path (don't move/overwrite files) - */ - int decision = -1; + var dialogResult = dialog.ShowDialog(); + if (dialogResult == System.Windows.Forms.DialogResult.OK) + Location = dialog.SelectedPath; + } - // Ask to overwrite or just set the new location - if (containsDuplicatedFiles) - { - var settings = AppearanceManager.MetroDialog; - - settings.AffirmativeButtonText = Localization.Resources.Strings.Overwrite; - settings.NegativeButtonText = Localization.Resources.Strings.Cancel; - settings.FirstAuxiliaryButtonText = Localization.Resources.Strings.Merge; - settings.SecondAuxiliaryButtonText = Localization.Resources.Strings.UseOtherFolder; - - var result = await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Overwrite, Localization.Resources.Strings.OverwriteProfilesInDestinationFolderMessage + Environment.NewLine + Environment.NewLine + Localization.Resources.Strings.ApplicationWillBeRestartedAfterwards, MessageDialogStyle.AffirmativeAndNegativeAndSingleAuxiliary, AppearanceManager.MetroDialog); - - switch (result) - { - case MessageDialogResult.Affirmative: - decision = 0; - break; - case MessageDialogResult.FirstAuxiliary: - decision = 1; - break; - case MessageDialogResult.SecondAuxiliary: - decision = 2; - break; - } - } - else if (containsOtherFiles) - { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Localization.Resources.Strings.Merge; - settings.NegativeButtonText = Localization.Resources.Strings.Cancel; - - if (await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Merge, Localization.Resources.Strings.MergeProfileFilesInDestinationFolderMessage + Environment.NewLine + Environment.NewLine + Localization.Resources.Strings.ApplicationWillBeRestartedAfterwards, MessageDialogStyle.AffirmativeAndNegative, AppearanceManager.MetroDialog) == MessageDialogResult.Affirmative) - decision = 1; - } - else - { - var settings = AppearanceManager.MetroDialog; + /// + /// Gets the command that initiates the action to change the location. + /// + public ICommand OpenLocationCommand => new RelayCommand(_ => OpenLocationAction()); - settings.AffirmativeButtonText = Localization.Resources.Strings.OK; - settings.NegativeButtonText = Localization.Resources.Strings.Cancel; + private static void OpenLocationAction() + { + Process.Start("explorer.exe", ProfileManager.GetProfilesFolderLocation()); + } - if (await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Move, Localization.Resources.Strings.ProfileFilesWillBeMovedMessage + Environment.NewLine + Environment.NewLine + Localization.Resources.Strings.ApplicationWillBeRestartedAfterwards, MessageDialogStyle.AffirmativeAndNegative, AppearanceManager.MetroDialog) == MessageDialogResult.Affirmative) - decision = 1; - } + /// + /// Gets the command that initiates the action to change the location. + /// + public ICommand ChangeLocationCommand => new RelayCommand(parameter => { _ = ChangeLocationAction(); }); - // Canceled - if (decision == -1) - { - MovingFiles = false; + /// + /// Prompts the user to confirm and then changes the location of the profiles folder. + /// + /// A task that represents the asynchronous operation. + private async Task ChangeLocationAction() + { + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, + Strings.ChangeLocationQuestion, + string.Format(Strings.ChangeProfilesLocationMessage, ProfileManager.GetProfilesFolderLocation(), Location), + ChildWindowIcon.Question, + Strings.Change); - return; - } + if (!result) + return; - // Move (overwrite or merge) - if (decision == 0 || decision == 1) - { - try - { - var overwrite = decision == 0; + // Save profiles at the current location before changing it to prevent + // unintended saves to the new location (e.g., triggered by background timer or the app close & restart). + ProfileManager.Save(); + + // Set new location in SettingsInfo + SettingsManager.Current.Profiles_FolderLocation = Location; - await ProfileManager.MoveProfilesAsync(Location, overwrite); + // Restart the application + (Application.Current.MainWindow as MainWindow)?.RestartApplication(); + } - // Show the user some awesome animation to indicate we are working on it :) - await Task.Delay(2000); - } - catch (Exception ex) - { - var settings = AppearanceManager.MetroDialog; + /// + /// Gets the command that restores the default location. + /// + public ICommand RestoreDefaultLocationCommand => new RelayCommand(parameter => { _ = RestoreDefaultLocationActionAsync(); }); - settings.AffirmativeButtonText = Localization.Resources.Strings.OK; + /// + /// Restores the profiles folder location to the default path after obtaining user confirmation. + /// + /// A task that represents the asynchronous operation. + private async Task RestoreDefaultLocationActionAsync() + { + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, + Strings.RestoreDefaultLocationQuestion, + string.Format(Strings.RestoreDefaultProfilesLocationMessage, ProfileManager.GetProfilesFolderLocation(), ProfileManager.GetDefaultProfilesFolderLocation()), + ChildWindowIcon.Question, + Strings.Restore); - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Error, ex.Message, MessageDialogStyle.Affirmative, settings); - } - } - - // Set new location - SettingsManager.Current.Profiles_CustomProfilesLocation = Location; - - // Restart the application - ConfigurationManager.Current.SoftRestart = true; - CloseAction(); - - MovingFiles = false; - } + if (!result) + return; + + // Save profiles at the current location before changing it to prevent + // unintended saves to the new location (e.g., triggered by background timer or the app close & restart). + ProfileManager.Save(); - public ICommand RestoreDefaultProfilesLocationCommand => new RelayCommand(p => RestoreDefaultProfilesLocationAction()); + // Clear custom location to revert to default + SettingsManager.Current.Profiles_FolderLocation = null; - private void RestoreDefaultProfilesLocationAction() + // Restart the application + (Application.Current.MainWindow as MainWindow)?.RestartApplication(); + } + + public ICommand AddProfileFileCommand => new RelayCommand(async _ => await AddProfileFileAction().ConfigureAwait(false)); + + private async Task AddProfileFileAction() + { + var profileName = string.Empty; + + var childWindow = new ProfileFileChildWindow(); + + var childWindowViewModel = new ProfileFileViewModel(instance => { - Location = ProfileManager.GetDefaultProfilesLocation(); - } + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - public ICommand AddProfileFileCommand => new RelayCommand(p => AddProfileFileAction()); + profileName = instance.Name; - private async Task AddProfileFileAction() + ProfileManager.CreateEmptyProfileFile(instance.Name); + }, _ => { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.AddProfileFile - }; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }); - var profileFileViewModel = new ProfileFileViewModel(async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + childWindow.Title = Strings.AddProfileFile; - ProfileManager.CreateEmptyProfileFile(instance.Name); - }, async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - }); + childWindow.DataContext = childWindowViewModel; - customDialog.Content = new ProfileFileDialog - { - DataContext = profileFileViewModel - }; + ConfigurationManager.Current.IsChildWindowOpen = true; - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); - public ICommand EditProfileFileCommand => new RelayCommand(p => EditProfileFileAction()); + // Re-select the profile file + if (string.IsNullOrEmpty(profileName)) + return; - private async Task EditProfileFileAction() - { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.EditProfileFile - }; + SelectedProfileFile = ProfileFiles.Cast() + .FirstOrDefault(p => p.Name.Equals(profileName, StringComparison.OrdinalIgnoreCase)); - var profileFileViewModel = new ProfileFileViewModel(async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + // Ask the user if they want to enable encryption for the new profile file + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, + Strings.EnableEncryptionQuestion, + Strings.EnableEncryptionForProfileFileMessage); - ProfileManager.RenameProfileFile(SelectedProfileFile, instance.Name); - }, async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - }, SelectedProfileFile); + if (result) + EnableEncryptionAction(); + } - customDialog.Content = new ProfileFileDialog - { - DataContext = profileFileViewModel - }; + public ICommand EditProfileFileCommand => new RelayCommand(async _ => await EditProfileFileAction().ConfigureAwait(false)); - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } + private async Task EditProfileFileAction() + { + var profileName = string.Empty; - public ICommand DeleteProfileFileCommand => new RelayCommand(p => DeleteProfileFileAction(), DeleteProfileFile_CanExecute); + var childWindow = new ProfileFileChildWindow(); - private bool DeleteProfileFile_CanExecute(object obj) + var childWindowViewModel = new ProfileFileViewModel(instance => { - return ProfileFiles.Cast().Count() > 1; - } + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + profileName = instance.Name; - private async Task DeleteProfileFileAction() + ProfileManager.RenameProfileFile(SelectedProfileFile, instance.Name); + }, _ => { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.DeleteProfileFile - }; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, SelectedProfileFile); - var confirmDeleteViewModel = new ConfirmDeleteViewModel(async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + childWindow.Title = Strings.EditProfileFile; - ProfileManager.DeleteProfileFile(SelectedProfileFile); - }, async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - }, Localization.Resources.Strings.DeleteProfileFileMessage); + childWindow.DataContext = childWindowViewModel; - customDialog.Content = new ConfirmDeleteDialog - { - DataContext = confirmDeleteViewModel - }; + ConfigurationManager.Current.IsChildWindowOpen = true; - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); - public ICommand EnableEncryptionCommand => new RelayCommand(p => EnableEncryptionAction()); + // Re-select the profile file + if (string.IsNullOrEmpty(profileName)) + return; - private async Task EnableEncryptionAction() - { - var settings = AppearanceManager.MetroDialog; + SelectedProfileFile = ProfileFiles.Cast() + .FirstOrDefault(p => p.Name.Equals(profileName, StringComparison.OrdinalIgnoreCase)); + } + + public ICommand DeleteProfileFileCommand => + new RelayCommand(async _ => await DeleteProfileFileAction().ConfigureAwait(false), DeleteProfileFile_CanExecute); - settings.AffirmativeButtonText = Localization.Resources.Strings.OK; - settings.NegativeButtonText = Localization.Resources.Strings.Cancel; - settings.DefaultButtonFocus = MessageDialogResult.Affirmative; + private bool DeleteProfileFile_CanExecute(object obj) + { + return ProfileFiles.Cast().Count() > 1; + } + + private async Task DeleteProfileFileAction() + { + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, + Strings.DeleteProfileFile, + string.Format(Strings.DeleteProfileFileXMessage, SelectedProfileFile.Name), + ChildWindowIcon.Info, + Strings.Delete); + + if (!result) + return; + + ProfileManager.DeleteProfileFile(SelectedProfileFile); + + // Select the first profile file + SelectedProfileFile = ProfileFiles.Cast().FirstOrDefault(); + } + + public ICommand EnableEncryptionCommand => new RelayCommand(async _ => await EnableEncryptionAction().ConfigureAwait(false)); + + private async Task EnableEncryptionAction() + { + // Show encryption disclaimer + if (!await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, + Strings.Disclaimer, + Strings.ProfileEncryptionDisclaimer)) + return; - if (await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Disclaimer, Localization.Resources.Strings.ProfileEncryptionDisclaimer, MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) + + var profileFile = SelectedProfileFile.Name; + + var childWindow = new CredentialsSetPasswordChildWindow(); + + var childWindowViewModel = new CredentialsSetPasswordViewModel(async instance => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + try { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.SetMasterPassword - }; - - var credentialsSetPasswordViewModel = new CredentialsSetPasswordViewModel(async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - - try - { - ProfileManager.EnableEncryption(SelectedProfileFile, instance.Password); - } - catch (Exception ex) - { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Localization.Resources.Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.EncryptionError, $"{Localization.Resources.Strings.EncryptionErrorMessage}\n\n{ex.Message}", MessageDialogStyle.Affirmative, settings); - } - }, async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - }); - - customDialog.Content = new CredentialsSetPasswordDialog - { - DataContext = credentialsSetPasswordViewModel - }; - - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); + ProfileManager.EnableEncryption(SelectedProfileFile, instance.Password); } - } + catch (Exception ex) + { + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, + Strings.EncryptionError, + $"{Strings.EncryptionErrorMessage}\n\n{ex.Message}", + ChildWindowIcon.Error).ConfigureAwait(false); + } + }, _ => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }); + + childWindow.Title = Strings.SetMasterPassword; + + childWindow.DataContext = childWindowViewModel; - public ICommand ChangeMasterPasswordCommand => new RelayCommand(p => ChangeMasterPasswordAction()); + ConfigurationManager.Current.IsChildWindowOpen = true; - private async Task ChangeMasterPasswordAction() + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + + // Re-select the profile file + if (string.IsNullOrEmpty(profileFile)) + return; + + SelectedProfileFile = ProfileFiles.Cast() + .FirstOrDefault(p => p.Name.Equals(profileFile, StringComparison.OrdinalIgnoreCase)); + } + + public ICommand ChangeMasterPasswordCommand => new RelayCommand(async _ => await ChangeMasterPasswordAction().ConfigureAwait(false)); + + private async Task ChangeMasterPasswordAction() + { + var profileName = SelectedProfileFile.Name; + + var childWindow = new CredentialsChangePasswordChildWindow(); + + var childWindowViewModel = new CredentialsChangePasswordViewModel(async instance => { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.ChangeMasterPassword - }; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - var credentialsPasswordViewModel = new CredentialsChangePasswordViewModel(async instance => + try { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - - try - { - ProfileManager.ChangeMasterPassword(SelectedProfileFile, instance.Password, instance.NewPassword); - } - catch (System.Security.Cryptography.CryptographicException) - { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Localization.Resources.Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.WrongPassword, Localization.Resources.Strings.WrongPasswordDecryptionFailedMessage, MessageDialogStyle.Affirmative, settings); - } - catch (Exception ex) - { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Localization.Resources.Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.DecryptionError, $"{Localization.Resources.Strings.DecryptionErrorMessage}\n\n{ex.Message}", MessageDialogStyle.Affirmative, settings); - } - - }, async instance => + ProfileManager.ChangeMasterPassword(SelectedProfileFile, instance.Password, instance.NewPassword); + } + catch (CryptographicException) { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - }); - - customDialog.Content = new CredentialsChangePasswordDialog + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, + Strings.WrongPassword, + Strings.WrongPasswordDecryptionFailedMessage, + ChildWindowIcon.Error).ConfigureAwait(false); + } + catch (Exception ex) { - DataContext = credentialsPasswordViewModel - }; + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, + Strings.DecryptionError, + $"{Strings.DecryptionErrorMessage}\n\n{ex.Message}", + ChildWindowIcon.Error).ConfigureAwait(false); + } + }, _ => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }); - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } + childWindow.Title = Strings.ChangeMasterPassword; - public ICommand DisableEncryptionCommand => new RelayCommand(p => DisableEncryptionAction()); + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + + // Re-select the profile file + if (string.IsNullOrEmpty(profileName)) + return; + + SelectedProfileFile = ProfileFiles.Cast() + .FirstOrDefault(p => p.Name.Equals(profileName, StringComparison.OrdinalIgnoreCase)); + } - private async Task DisableEncryptionAction() + public ICommand DisableEncryptionCommand => new RelayCommand(async _ => await DisableEncryptionAction().ConfigureAwait(false)); + + private async Task DisableEncryptionAction() + { + var profileName = SelectedProfileFile.Name; + + var childWindow = new CredentialsPasswordChildWindow(); + + var childWindowViewModel = new CredentialsPasswordViewModel(async instance => { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.MasterPassword - }; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - var credentialsPasswordViewModel = new CredentialsPasswordViewModel(async instance => + try { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - - try - { - ProfileManager.DisableEncryption(SelectedProfileFile, instance.Password); - } - catch (System.Security.Cryptography.CryptographicException) - { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Localization.Resources.Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.WrongPassword, Localization.Resources.Strings.WrongPasswordDecryptionFailedMessage, MessageDialogStyle.Affirmative, settings); - } - catch (Exception ex) - { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Localization.Resources.Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.DecryptionError, $"{Localization.Resources.Strings.DecryptionErrorMessage}\n\n{ex.Message}", MessageDialogStyle.Affirmative, settings); - } - - }, async instance => + ProfileManager.DisableEncryption(SelectedProfileFile, instance.Password); + } + catch (CryptographicException) { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - }); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, + Strings.WrongPassword, + Strings.WrongPasswordDecryptionFailedMessage, + ChildWindowIcon.Error).ConfigureAwait(false); + } + catch (Exception ex) + { + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, + Strings.DecryptionError, + $"{Strings.DecryptionErrorMessage}\n\n{ex.Message}", + ChildWindowIcon.Error).ConfigureAwait(false); + } - customDialog.Content = new CredentialsPasswordDialog + }, _ => { - DataContext = credentialsPasswordViewModel - }; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }); - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } + childWindow.Title = Strings.MasterPassword; - #endregion + childWindow.DataContext = childWindowViewModel; - #region Methods - public void SetLocationPathFromDragDrop(string path) - { - Location = path; + ConfigurationManager.Current.IsChildWindowOpen = true; - OnPropertyChanged(nameof(Location)); - } - #endregion + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + + // Re-select the profile file + if (string.IsNullOrEmpty(profileName)) + return; + + SelectedProfileFile = ProfileFiles.Cast() + .FirstOrDefault(p => p.Name.Equals(profileName, StringComparison.OrdinalIgnoreCase)); + } + + #endregion + + #region Methods + /// + /// Sets the location path based on the provided drag-and-drop input. + /// + /// The path to set as the location. + public void SetLocationPathFromDragDrop(string path) + { + Location = path; } -} \ No newline at end of file + #endregion +} diff --git a/Source/NETworkManager/ViewModels/SettingsSettingsViewModel.cs b/Source/NETworkManager/ViewModels/SettingsSettingsViewModel.cs index 00dcee3067..13c0e08010 100644 --- a/Source/NETworkManager/ViewModels/SettingsSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/SettingsSettingsViewModel.cs @@ -1,394 +1,293 @@ -using MahApps.Metro.Controls.Dialogs; +using NETworkManager.Localization.Resources; using NETworkManager.Settings; using NETworkManager.Utilities; using System; using System.Diagnostics; using System.IO; using System.Threading.Tasks; +using System.Windows; using System.Windows.Input; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +public class SettingsSettingsViewModel : ViewModelBase { - public class SettingsSettingsViewModel : ViewModelBase + #region Variables + /// + /// Gets or sets the action to execute when the associated object is closed. + /// + public Action CloseAction { get; set; } + + /// + /// Indicates whether the settings are currently being loaded to prevent triggering change events during initialization. + /// + private readonly bool _isLoading; + + /// + /// Gets or sets the file system path to the settings location. + /// + public string Location { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - - public Action CloseAction { get; set; } - - public bool IsPortable => ConfigurationManager.Current.IsPortable; - - private string _location; - public string Location - { - get => _location; - set - { - if (value == _location) - return; - - _location = value; - OnPropertyChanged(); - } - } - - private bool _movingFiles; - public bool MovingFiles - { - get => _movingFiles; - set - { - if (value == _movingFiles) - return; - - _movingFiles = value; - OnPropertyChanged(); - } - } - - private bool _settingsExists; - public bool SettingsExists + get; + set { - get => _settingsExists; - set - { - if (value == _settingsExists) - return; - - _settingsExists = value; - OnPropertyChanged(); - } - } - - private string _importFilePath; - public string ImportFilePath - { - get => _importFilePath; - set - { - if (value == _importFilePath) - return; - - _importFilePath = value; - OnPropertyChanged(); - } - } + if (value == field) + return; - private bool _displayImportStatusMessage; - public bool DisplayImportStatusMessage - { - get => _displayImportStatusMessage; - set - { - if (value == _displayImportStatusMessage) - return; - - _displayImportStatusMessage = value; - OnPropertyChanged(); - } - } + if (!_isLoading) + IsLocationChanged = !string.Equals(value, SettingsManager.GetSettingsFolderLocation(), + StringComparison.OrdinalIgnoreCase); - private string _importStatusMessage; - public string ImportStatusMessage - { - get => _importStatusMessage; - set - { - if (value == _importStatusMessage) - return; - - _importStatusMessage = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _displayExportStatusMessage; - public bool DisplayExportStatusMessage - { - get => _displayExportStatusMessage; - set - { - if (value == _displayExportStatusMessage) - return; - - _displayExportStatusMessage = value; - OnPropertyChanged(); - } - } + /// + /// Indicates whether the settings location is managed by a system-wide policy. + /// + public bool IsLocationManagedByPolicy => !string.IsNullOrWhiteSpace(PolicyManager.Current?.Settings_FolderLocation); - private string _exportStatusMessage; - public string ExportStatusMessage + /// + /// Gets or sets a value indicating whether the location has changed. + /// + public bool IsLocationChanged + { + get; + set { - get => _exportStatusMessage; - set - { - if (value == _exportStatusMessage) - return; - - _exportStatusMessage = value; - OnPropertyChanged(); - } - } + if (value == field) + return; - private bool _resetSettings; - public bool ResetSettings - { - get => _resetSettings; - set - { - if (value == _resetSettings) - return; - - _resetSettings = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion + } - #region Constructor, LoadSettings - public SettingsSettingsViewModel(IDialogCoordinator instance) + /// + /// Indicates whether the current location is the default settings folder location. + /// + public bool IsDefaultLocation + { + get; + set { - _dialogCoordinator = instance; - - LoadSettings(); - } + if (value == field) + return; - private void LoadSettings() - { - Location = SettingsManager.GetSettingsLocation(); + field = value; + OnPropertyChanged(); } - #endregion - - #region ICommands & Actions - public ICommand BrowseLocationFolderCommand => new RelayCommand(p => BrowseLocationFolderAction()); + } - private void BrowseLocationFolderAction() + /// + /// Gets or sets a value indicating whether daily backups are enabled. + /// + public bool IsDailyBackupEnabled + { + get; + set { - using (var dialog = new System.Windows.Forms.FolderBrowserDialog()) - { - if (Directory.Exists(Location)) - dialog.SelectedPath = Location; - - var dialogResult = dialog.ShowDialog(); - - if (dialogResult == System.Windows.Forms.DialogResult.OK) - Location = dialog.SelectedPath; - } - } + if (value == field) + return; - public ICommand OpenLocationCommand => new RelayCommand(p => OpenLocationAction()); + if (!_isLoading) + SettingsManager.Current.Settings_IsDailyBackupEnabled = value; - private static void OpenLocationAction() - { - Process.Start("explorer.exe", SettingsManager.GetSettingsLocation()); + field = value; + OnPropertyChanged(); } + } - public ICommand ChangeLocationCommand => new RelayCommand(p => ChangeLocationAction()); - - private async Task ChangeLocationAction() + /// + /// Gets or sets the maximum number of backups to keep. + /// + public int MaximumNumberOfBackups + { + get; + set { - MovingFiles = true; - - var useFileInOtherLocation = false; - - // Check if settings file exists in new location - if (File.Exists(Path.Combine(Location, SettingsManager.GetSettingsFileName()))) - { - var settings = AppearanceManager.MetroDialog; - - settings.AffirmativeButtonText = Localization.Resources.Strings.Overwrite; - settings.NegativeButtonText = Localization.Resources.Strings.Cancel; - settings.FirstAuxiliaryButtonText = Localization.Resources.Strings.UseOther; - settings.DefaultButtonFocus = MessageDialogResult.FirstAuxiliary; - - var result = await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Overwrite, Localization.Resources.Strings.OverwriteSettingsInDestinationFolderMessage, MessageDialogStyle.AffirmativeAndNegativeAndSingleAuxiliary, AppearanceManager.MetroDialog); - - switch (result) - { - case MessageDialogResult.Negative: - MovingFiles = false; - return; - case MessageDialogResult.FirstAuxiliary: - useFileInOtherLocation = true; - break; - } - } - - // Use other location - if (useFileInOtherLocation) - { - LocalSettingsManager.Settings_CustomSettingsLocation = Location; - - MovingFiles = false; - - // Restart the application - ConfigurationManager.Current.ForceRestart = true; - CloseAction(); - + if (value == field) return; - } - // Move files... - try - { - await SettingsManager.MoveSettingsAsync(Location); + if (!_isLoading) + SettingsManager.Current.Settings_MaximumNumberOfBackups = value; - LocalSettingsManager.Settings_CustomSettingsLocation = Location; - - // Show the user some awesome animation to indicate we are working on it :) - await Task.Delay(2000); - } - catch (Exception ex) - { - var settings = AppearanceManager.MetroDialog; - - settings.AffirmativeButtonText = Localization.Resources.Strings.OK; + field = value; + OnPropertyChanged(); + } + } - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Error, ex.Message, MessageDialogStyle.Affirmative, settings); - } + #endregion - Location = string.Empty; - Location = LocalSettingsManager.Settings_CustomSettingsLocation; + #region Constructor, LoadSettings - MovingFiles = false; - } + /// + /// Initializes a new instance of the class and loads the current settings. + /// + public SettingsSettingsViewModel() + { + _isLoading = true; - public ICommand RestoreDefaultSettingsLocationCommand => new RelayCommand(p => RestoreDefaultSettingsLocationAction()); + LoadSettings(); - private void RestoreDefaultSettingsLocationAction() - { - Location = SettingsManager.GetDefaultSettingsLocation(); - } + _isLoading = false; + } - public ICommand BrowseImportFileCommand => new RelayCommand(p => BrowseFileAction()); + /// + /// Load view specific settings. + /// + private void LoadSettings() + { + Location = SettingsManager.GetSettingsFolderLocation(); + IsDefaultLocation = string.Equals(Location, SettingsManager.GetDefaultSettingsFolderLocation(), StringComparison.OrdinalIgnoreCase); + IsDailyBackupEnabled = SettingsManager.Current.Settings_IsDailyBackupEnabled; + MaximumNumberOfBackups = SettingsManager.Current.Settings_MaximumNumberOfBackups; + } - private void BrowseFileAction() - { - using (var openFileDialog = new System.Windows.Forms.OpenFileDialog - { - Filter = GlobalStaticConfiguration.ZipFileExtensionFilter - }) - { - if (openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) - ImportFilePath = openFileDialog.FileName; - } - } + #endregion - public ICommand ImportSettingsCommand => new RelayCommand(p => ImportSettingsAction()); + #region ICommands & Actions + /// + /// Gets the command that opens the location folder selection dialog. + /// + public ICommand BrowseLocationFolderCommand => new RelayCommand(p => BrowseLocationFolderAction()); - private async Task ImportSettingsAction() - { - var settings = AppearanceManager.MetroDialog; + /// + /// Opens a dialog that allows the user to select a folder location and updates the Location property with the + /// selected path if the user confirms the selection. + /// + private void BrowseLocationFolderAction() + { + using var dialog = new System.Windows.Forms.FolderBrowserDialog(); - settings.AffirmativeButtonText = Localization.Resources.Strings.Continue; - settings.NegativeButtonText = Localization.Resources.Strings.Cancel; + if (Directory.Exists(Location)) + dialog.SelectedPath = Location; - settings.DefaultButtonFocus = MessageDialogResult.Affirmative; + var dialogResult = dialog.ShowDialog(); - if (await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.AreYouSure, Localization.Resources.Strings.SelectedSettingsAreOverwritten + Environment.NewLine + Environment.NewLine + Localization.Resources.Strings.ApplicationWillBeRestartedAfterwards, MessageDialogStyle.AffirmativeAndNegative, settings) != MessageDialogResult.Affirmative) - return; + if (dialogResult == System.Windows.Forms.DialogResult.OK) + Location = dialog.SelectedPath; + } - try - { - SettingsManager.Import(ImportFilePath); - - // Restart the application - ConfigurationManager.Current.ForceRestart = true; - CloseAction(); - } - catch (Exception ex) - { - ImportStatusMessage = string.Format(Localization.Resources.Strings.ClouldNotImportFileSeeErrorMessageXX, ex.Message); - DisplayImportStatusMessage = true; - } - } + /// + /// Gets the command that opens a location when executed. + /// + public ICommand OpenLocationCommand => new RelayCommand(_ => OpenLocationAction()); - public ICommand ExportSettingsCommand => new RelayCommand(p => ExportSettingsAction()); + /// + /// Opens the settings folder location in Windows Explorer. + /// + private static void OpenLocationAction() + { + Process.Start("explorer.exe", SettingsManager.GetSettingsFolderLocation()); + } - private void ExportSettingsAction() - { - DisplayExportStatusMessage = false; - - using (var saveFileDialog = new System.Windows.Forms.SaveFileDialog() - { - Filter = GlobalStaticConfiguration.ZipFileExtensionFilter, - FileName = $"{AssemblyManager.Current.Name}_{Localization.Resources.Strings.Settings}_{Localization.Resources.Strings.Backup}#{TimestampHelper.GetTimestamp()}.zip" - }) - { - if (saveFileDialog.ShowDialog() != System.Windows.Forms.DialogResult.OK) - return; - - try - { - SettingsManager.Export(saveFileDialog.FileName); - - ExportStatusMessage = string.Format(Localization.Resources.Strings.FileExportedToXX, saveFileDialog.FileName); - DisplayExportStatusMessage = true; - } - catch (Exception ex) - { - ExportStatusMessage = string.Format(Localization.Resources.Strings.ClouldNotExportFileSeeErrorMessageXX, ex.Message); - DisplayExportStatusMessage = true; - } - } - } + /// + /// Gets the command that initiates the action to change the location. + /// + public ICommand ChangeLocationCommand => new RelayCommand(parameter => { _ = ChangeLocationAction(); }); - public ICommand ResetSettingsCommand => new RelayCommand(p => ResetSettingsAction()); + /// + /// Prompts the user to confirm and then changes the location of the settings folder. + /// + /// A task that represents the asynchronous operation. + private async Task ChangeLocationAction() + { + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, + Strings.ChangeLocationQuestion, + string.Format(Strings.ChangeSettingsLocationMessage, SettingsManager.GetSettingsFolderLocation(), Location), + ChildWindowIcon.Question, + Strings.Change); - public async Task ResetSettingsAction() - { - var settings = AppearanceManager.MetroDialog; + if (!result) + return; - settings.AffirmativeButtonText = Localization.Resources.Strings.Continue; - settings.NegativeButtonText = Localization.Resources.Strings.Cancel; + // Save settings at the current location before changing it to prevent + // unintended saves to the new location (e.g., triggered by background timer or the app close & restart). + SettingsManager.Save(); - settings.DefaultButtonFocus = MessageDialogResult.Affirmative; + // Set new location + LocalSettingsManager.Current.Settings_FolderLocation = Location; + LocalSettingsManager.Save(); - var message = Localization.Resources.Strings.SelectedSettingsAreReset; + // Restart the application + (Application.Current.MainWindow as MainWindow)?.RestartApplication(); + } - message += Environment.NewLine + Environment.NewLine + $"* {Localization.Resources.Strings.TheSettingsLocationIsNotAffected}"; - message += Environment.NewLine + $"* {Localization.Resources.Strings.ApplicationWillBeRestartedAfterwards}"; + /// + /// Gets the command that restores the default location settings asynchronously. + /// + public ICommand RestoreDefaultLocationCommand => new RelayCommand(parameter => { _ = RestoreDefaultLocationActionAsync(); }); + + /// + /// Restores the application's settings folder location to the default path after obtaining user confirmation. + /// + /// This method prompts the user to confirm the restoration of the default settings location. If + /// the user confirms, it saves the current settings, clears any custom location, and restarts the application to + /// apply the changes. Use this method when you want to revert to the default settings folder and ensure all changes + /// are properly saved and applied. + /// A task that represents the asynchronous operation. + private async Task RestoreDefaultLocationActionAsync() + { + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, + Strings.RestoreDefaultLocationQuestion, + string.Format(Strings.RestoreDefaultSettingsLocationMessage, SettingsManager.GetSettingsFolderLocation(), SettingsManager.GetDefaultSettingsFolderLocation()), + ChildWindowIcon.Question, + Strings.Restore); - if (await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.AreYouSure, message, MessageDialogStyle.AffirmativeAndNegative, settings) != MessageDialogResult.Affirmative) - return; + if (!result) + return; - SettingsManager.Reset(); + // Save settings at the current location before changing it to prevent + // unintended saves to the new location (e.g., triggered by background timer or the app close & restart). + SettingsManager.Save(); - message = Localization.Resources.Strings.SettingsSuccessfullyReset; - message += Environment.NewLine + Environment.NewLine + Localization.Resources.Strings.TheApplicationWillBeRestarted; + // Clear custom location to revert to default + LocalSettingsManager.Current.Settings_FolderLocation = null; + LocalSettingsManager.Save(); - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Success, message, MessageDialogStyle.Affirmative, settings); + // Restart the application + (Application.Current.MainWindow as MainWindow)?.RestartApplication(); + } - // Restart the application - ConfigurationManager.Current.ForceRestart = true; - CloseAction(); - } - #endregion + /// + /// Gets the command that resets the application settings to their default values. + /// + public ICommand ResetSettingsCommand => new RelayCommand(parameter => { _ = ResetSettingsAction(); }); - #region Methods - public void SaveAndCheckSettings() - { - // Save everything - if (SettingsManager.Current.SettingsChanged) - SettingsManager.Save(); + /// + /// Resets the application settings to their default values. + /// + /// A task that represents the asynchronous operation. + private async Task ResetSettingsAction() + { + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, + Strings.ResetSettingsQuestion, + Strings.SettingsAreResetAndApplicationWillBeRestartedMessage, + ChildWindowIcon.Question, + Strings.Reset); - // Check if files exist - SettingsExists = File.Exists(SettingsManager.GetSettingsFilePath()); - } + if (!result) + return; - public void SetLocationPathFromDragDrop(string path) - { - Location = path; + // Init default settings + SettingsManager.Initialize(); - OnPropertyChanged(nameof(Location)); - } + // Restart the application + (Application.Current.MainWindow as MainWindow)?.RestartApplication(); + } - public void SetImportFilePathFromDragDrop(string filePath) - { - ImportFilePath = filePath; + #endregion - OnPropertyChanged(nameof(ImportFilePath)); - } - #endregion + #region Methods + /// + /// Sets the location path based on the provided drag-and-drop input. + /// + /// The path to set as the location. + public void SetLocationPathFromDragDrop(string path) + { + Location = path; } -} \ No newline at end of file + #endregion +} diff --git a/Source/NETworkManager/ViewModels/SettingsStatusViewModel.cs b/Source/NETworkManager/ViewModels/SettingsStatusViewModel.cs index 675fa3b2c9..9c9808dd9c 100644 --- a/Source/NETworkManager/ViewModels/SettingsStatusViewModel.cs +++ b/Source/NETworkManager/ViewModels/SettingsStatusViewModel.cs @@ -1,82 +1,63 @@ -using NETworkManager.Settings; -using NETworkManager.Utilities; +using NETworkManager.Settings; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +public class SettingsStatusViewModel : ViewModelBase { - public class SettingsStatusViewModel : ViewModelBase - { - #region Variables - private readonly bool _isLoading; + #region Variables - private bool _showWindowOnNetworkChange; - public bool ShowWindowOnNetworkChange - { - get => _showWindowOnNetworkChange; - set - { - if (value == _showWindowOnNetworkChange) - return; - - if (!_isLoading) - SettingsManager.Current.Status_ShowWindowOnNetworkChange = value; - - _showWindowOnNetworkChange = value; - OnPropertyChanged(); - } - } + private readonly bool _isLoading; - private string _ipAddressToDetectLocalIPAddressBasedOnRouting; - public string IPAddressToDetectLocalIPAddressBasedOnRouting + public bool ShowWindowOnNetworkChange + { + get; + set { - get => _ipAddressToDetectLocalIPAddressBasedOnRouting; - set - { - if (value == _ipAddressToDetectLocalIPAddressBasedOnRouting) - return; - - if (!_isLoading) - SettingsManager.Current.Status_IPAddressToDetectLocalIPAddressBasedOnRouting = value; - - _ipAddressToDetectLocalIPAddressBasedOnRouting = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.Status_ShowWindowOnNetworkChange = value; + + field = value; + OnPropertyChanged(); } + } - private int _windowCloseTime; - public int WindowCloseTime + public int WindowCloseTime + { + get; + set { - get => _windowCloseTime; - set - { - if (value == _windowCloseTime) - return; - - if (!_isLoading) - SettingsManager.Current.Status_WindowCloseTime = value; - - _windowCloseTime = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.Status_WindowCloseTime = value; + + field = value; + OnPropertyChanged(); } + } - #endregion + #endregion - #region Contructor, load settings - public SettingsStatusViewModel() - { - _isLoading = true; + #region Contructor, load settings - LoadSettings(); + public SettingsStatusViewModel() + { + _isLoading = true; - _isLoading = false; - } + LoadSettings(); - private void LoadSettings() - { - ShowWindowOnNetworkChange = SettingsManager.Current.Status_ShowWindowOnNetworkChange; - IPAddressToDetectLocalIPAddressBasedOnRouting = SettingsManager.Current.Status_IPAddressToDetectLocalIPAddressBasedOnRouting; - WindowCloseTime = SettingsManager.Current.Status_WindowCloseTime; - } - #endregion + _isLoading = false; } + + private void LoadSettings() + { + ShowWindowOnNetworkChange = SettingsManager.Current.Status_ShowWindowOnNetworkChange; + WindowCloseTime = SettingsManager.Current.Status_WindowCloseTime; + } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/SettingsUpdateViewModel.cs b/Source/NETworkManager/ViewModels/SettingsUpdateViewModel.cs index ef63c26647..435ce4d052 100644 --- a/Source/NETworkManager/ViewModels/SettingsUpdateViewModel.cs +++ b/Source/NETworkManager/ViewModels/SettingsUpdateViewModel.cs @@ -1,45 +1,88 @@ -using NETworkManager.Settings; -using NETworkManager.Utilities; +using NETworkManager.Settings; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +public class SettingsUpdateViewModel : ViewModelBase { - public class SettingsUpdateViewModel : ViewModelBase - { - #region Variables - private readonly bool _isLoading; + #region Variables - private bool _checkForUpdatesAtStartup; - public bool CheckForUpdatesAtStartup + private readonly bool _isLoading; + + public bool CheckForUpdatesAtStartup + { + get; + set { - get => _checkForUpdatesAtStartup; - set - { - if (value == _checkForUpdatesAtStartup) - return; - - if (!_isLoading) - SettingsManager.Current.Update_CheckForUpdatesAtStartup = value; - - _checkForUpdatesAtStartup = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.Update_CheckForUpdatesAtStartup = value; + + field = value; + OnPropertyChanged(); } - #endregion + } - #region Constructor, LoadSettings - public SettingsUpdateViewModel() + /// + /// Gets whether the "Check for updates at startup" setting is managed by system-wide policy. + /// + public bool IsUpdateCheckManagedByPolicy => PolicyManager.Current?.Update_CheckForUpdatesAtStartup.HasValue == true; + + public bool CheckForPreReleases + { + get; + set { - _isLoading = true; + if (value == field) + return; - LoadSettings(); + if (!_isLoading) + SettingsManager.Current.Update_CheckForPreReleases = value; - _isLoading = false; + field = value; + OnPropertyChanged(); } + } - private void LoadSettings() + + public bool EnableExperimentalFeatures + { + get; + set { - CheckForUpdatesAtStartup = SettingsManager.Current.Update_CheckForUpdatesAtStartup; + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.Experimental_EnableExperimentalFeatures = value; + + field = value; + OnPropertyChanged(); } - #endregion } + + #endregion + + #region Constructor, LoadSettings + + public SettingsUpdateViewModel() + { + _isLoading = true; + + LoadSettings(); + + _isLoading = false; + } + + private void LoadSettings() + { + // If policy is set, show the policy value; otherwise show the user's setting + CheckForUpdatesAtStartup = PolicyManager.Current?.Update_CheckForUpdatesAtStartup + ?? SettingsManager.Current.Update_CheckForUpdatesAtStartup; + CheckForPreReleases = SettingsManager.Current.Update_CheckForPreReleases; + EnableExperimentalFeatures = SettingsManager.Current.Experimental_EnableExperimentalFeatures; + } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/SettingsViewModel.cs b/Source/NETworkManager/ViewModels/SettingsViewModel.cs index 8496792660..be82a8a755 100644 --- a/Source/NETworkManager/ViewModels/SettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/SettingsViewModel.cs @@ -1,313 +1,358 @@ -using System; +using System; using System.ComponentModel; using System.Linq; using System.Text.RegularExpressions; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Input; -using NETworkManager.Localization.Translators; +using NETworkManager.Documentation; +using NETworkManager.Localization; using NETworkManager.Models; using NETworkManager.Settings; using NETworkManager.Utilities; using NETworkManager.Views; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +public class SettingsViewModel : ViewModelBase { - public class SettingsViewModel : ViewModelBase + #region Variables + + public int SelectedTabIndex { - #region Variables - public ICollectionView SettingsViews { get; private set; } + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } - private string _search; - public string Search + public ICollectionView SettingsViews { get; private set; } + + private SettingsName _searchLastSelectedSettingsName; + + public string Search + { + get; + set { - get => _search; - set - { - if (value == _search) - return; + if (value == field) + return; - _search = value; + field = value; - SettingsViews.Refresh(); + // Store the current selected settings view name + if (SelectedSettingsView != null) + _searchLastSelectedSettingsName = SelectedSettingsView.Name; - // Show note when there was nothing found - SearchNothingFound = !SettingsViews.Cast().Any(); + // Refresh (apply filter) + SettingsViews.Refresh(); - OnPropertyChanged(); - } - } + // Try to select the last selected application + if (!SettingsViews.IsEmpty && SelectedSettingsView == null) + SelectedSettingsView = + SettingsViews.Cast() + .FirstOrDefault(x => x.Name == _searchLastSelectedSettingsName) ?? + SettingsViews.Cast().FirstOrDefault(); - private bool _searchNothingFound; - public bool SearchNothingFound - { - get => _searchNothingFound; - set - { - if (value == _searchNothingFound) - return; - - _searchNothingFound = value; - OnPropertyChanged(); - } + // Show note if nothing was found + SearchNothingFound = SettingsViews.IsEmpty; + + OnPropertyChanged(); } + } - private UserControl _settingsContent; - public UserControl SettingsContent + public bool SearchNothingFound + { + get; + set { - get => _settingsContent; - set - { - if (Equals(value, _settingsContent)) - return; - - _settingsContent = value; - OnPropertyChanged(); - } + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - private SettingsViewInfo _selectedSettingsView; - public SettingsViewInfo SelectedSettingsView + public UserControl SettingsContent + { + get; + private set { - get => _selectedSettingsView; - set - { - if (value == _selectedSettingsView) - return; - - if (value != null) - ChangeSettingsContent(value); - - _selectedSettingsView = value; - OnPropertyChanged(); - } + if (Equals(value, field)) + return; + + field = value; + OnPropertyChanged(); } + } - private SettingsGeneralView _settingsGerneralView; - private SettingsWindowView _settingsWindowView; - private SettingsAppearanceView _settingsApperanceView; - private SettingsLanguageView _settingsLanguageView; - private SettingsStatusView _settingsStatusView; - private SettingsHotKeysView _settingsHotKeysView; - private SettingsAutostartView _settingsAutostartView; - private SettingsUpdateView _settingsUpdateView; - private SettingsSettingsView _settingsSettingsView; - private SettingsProfilesView _settingsProfilesView; - private DashboardSettingsView _dashboardSettingsView; - private IPScannerSettingsView _ipScannerSettingsView; - private PortScannerSettingsView _portScannerSettingsView; - private PingMonitorSettingsView _pingMonitorSettingsView; - private TracerouteSettingsView _tracerouteSettingsView; - private DNSLookupSettingsView _dnsLookupSettingsViewModel; - private RemoteDesktopSettingsView _remoteDesktopSettingsView; - private PowerShellSettingsView _powerShellSettingsView; - private PuTTYSettingsView _puTTYSettingsView; - private TigerVNCSettingsView _tigerVNCSettingsView; - private SNMPSettingsView _snmpSettingsView; - private WakeOnLANSettingsView _wakeOnLANSettingsView; - private WhoisSettingsView _whoisSettingsView; - #endregion - - #region Contructor, load settings - public SettingsViewModel(ApplicationName applicationName) + public SettingsViewInfo SelectedSettingsView + { + get; + set { - LoadSettings(); + if (value == field) + return; + + if (value != null) + ChangeSettingsContent(value); - ChangeSettingsView(applicationName); + field = value; + OnPropertyChanged(); } + } - private void LoadSettings() + private SettingsGeneralView _settingsGeneralView; + private SettingsWindowView _settingsWindowView; + private SettingsAppearanceView _settingsAppearanceView; + private SettingsLanguageView _settingsLanguageView; + private SettingsNetworkView _settingsNetworkView; + private SettingsStatusView _settingsStatusView; + private SettingsHotkeysView _settingsHotKeysView; + private SettingsAutostartView _settingsAutostartView; + private SettingsUpdateView _settingsUpdateView; + private SettingsSettingsView _settingsSettingsView; + private SettingsProfilesView _settingsProfilesView; + private DashboardSettingsView _dashboardSettingsView; + private NetworkInterfaceSettingsView _networkInterfaceSettingsView; + private IPScannerSettingsView _ipScannerSettingsView; + private PortScannerSettingsView _portScannerSettingsView; + private PingMonitorSettingsView _pingMonitorSettingsView; + private TracerouteSettingsView _tracerouteSettingsView; + private DNSLookupSettingsView _dnsLookupSettingsViewModel; + private RemoteDesktopSettingsView _remoteDesktopSettingsView; + private PowerShellSettingsView _powerShellSettingsView; + private PuTTYSettingsView _puTTYSettingsView; + private TigerVNCSettingsView _tigerVNCSettingsView; + private WebConsoleSettingsView _webConsoleSettingsView; + private SNMPSettingsView _snmpSettingsView; + private SNTPLookupSettingsView _sntpLookupSettingsView; + private WakeOnLANSettingsView _wakeOnLANSettingsView; + private BitCalculatorSettingsView _bitCalculatorSettingsView; + + #endregion + + #region Contructor, load settings + + public SettingsViewModel() + { + LoadSettings(); + } + + private void LoadSettings() + { + SettingsViews = new CollectionViewSource { Source = SettingsViewManager.List }.View; + SettingsViews.GroupDescriptions.Add(new PropertyGroupDescription(nameof(SettingsViewInfo.Group))); + SettingsViews.SortDescriptions.Add(new SortDescription(nameof(SettingsViewInfo.Name), + ListSortDirection.Ascending)); + SettingsViews.Filter = o => { - SettingsViews = new CollectionViewSource { Source = SettingsViewManager.List }.View; - SettingsViews.GroupDescriptions.Add(new PropertyGroupDescription(nameof(SettingsViewInfo.Group))); - SettingsViews.SortDescriptions.Add(new SortDescription(nameof(SettingsViewInfo.Name), ListSortDirection.Ascending)); - SettingsViews.Filter = o => - { - if (string.IsNullOrEmpty(Search)) - return true; + if (string.IsNullOrEmpty(Search)) + return true; - if (!(o is SettingsViewInfo info)) - return false; + if (o is not SettingsViewInfo info) + return false; - var regex = new Regex(@" |-"); + var regex = new Regex(@" |-"); - var search = regex.Replace(Search, ""); + var search = regex.Replace(Search, ""); - // Search by TranslatedName and Name - return regex.Replace(SettingsViewNameTranslator.GetInstance().Translate(info.Name), "").IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1 || (regex.Replace(info.Name.ToString(), "").IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1); - }; - } - #endregion + // Search by TranslatedName and Name + return regex.Replace(ResourceTranslator.Translate(ResourceIdentifier.SettingsName, info.Name), "") + .IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1 || regex.Replace(info.Name.ToString(), "") + .IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1; + }; + } - #region ICommands & Actions - public ICommand ClearSearchCommand => new RelayCommand(p => ClearSearchAction()); + #endregion - private void ClearSearchAction() - { - Search = string.Empty; - } - #endregion + #region ICommands & Actions - #region Methods - public void ChangeSettingsView(ApplicationName applicationName) - { - // Don't change the view, if the user has filtered the settings... - if (!string.IsNullOrEmpty(Search)) - return; + public ICommand ClearSearchCommand => new RelayCommand(_ => ClearSearchAction()); - if (System.Enum.GetNames(typeof(SettingsViewName)).Contains(applicationName.ToString()) && ApplicationName.None.ToString() != applicationName.ToString()) - SelectedSettingsView = SettingsViews.SourceCollection.Cast().FirstOrDefault(x => x.Name.ToString() == applicationName.ToString()); - else - SelectedSettingsView = SettingsViews.SourceCollection.Cast().FirstOrDefault(x => x.Name == SettingsViewName.General); - } + private void ClearSearchAction() + { + Search = string.Empty; + } + + #endregion - private void ChangeSettingsContent(SettingsViewInfo settingsViewInfo) + #region Methods + + public void ChangeSettingsView(ApplicationName applicationName) + { + if (SettingsViews.IsEmpty) + return; + + // Try to find application in (filtered) settings views + var selectedApplicationSettingsView = SettingsViews.Cast() + .FirstOrDefault(x => x.Name.ToString() == applicationName.ToString()); + + // Update selected settings view if application is found in (filtered) settings views + if (selectedApplicationSettingsView != null) + SelectedSettingsView = selectedApplicationSettingsView; + + // Set default settings view + SelectedSettingsView ??= SettingsViews.Cast().FirstOrDefault(); + } + + private void ChangeSettingsContent(SettingsViewInfo settingsViewInfo) + { + switch (settingsViewInfo.Name) { - switch (settingsViewInfo.Name) - { - case SettingsViewName.General: - if (_settingsGerneralView == null) - _settingsGerneralView = new SettingsGeneralView(); - - SettingsContent = _settingsGerneralView; - break; - case SettingsViewName.Window: - if (_settingsWindowView == null) - _settingsWindowView = new SettingsWindowView(); - - SettingsContent = _settingsWindowView; - break; - case SettingsViewName.Appearance: - if (_settingsApperanceView == null) - _settingsApperanceView = new SettingsAppearanceView(); - - SettingsContent = _settingsApperanceView; - break; - case SettingsViewName.Language: - if (_settingsLanguageView == null) - _settingsLanguageView = new SettingsLanguageView(); - - SettingsContent = _settingsLanguageView; - break; - case SettingsViewName.Status: - if (_settingsStatusView == null) - _settingsStatusView = new SettingsStatusView(); - - SettingsContent = _settingsStatusView; - break; - case SettingsViewName.HotKeys: - if (_settingsHotKeysView == null) - _settingsHotKeysView = new SettingsHotKeysView(); - - SettingsContent = _settingsHotKeysView; - break; - case SettingsViewName.Autostart: - if (_settingsAutostartView == null) - _settingsAutostartView = new SettingsAutostartView(); - - SettingsContent = _settingsAutostartView; - break; - case SettingsViewName.Update: - if (_settingsUpdateView == null) - _settingsUpdateView = new SettingsUpdateView(); - - SettingsContent = _settingsUpdateView; - break; - case SettingsViewName.Settings: - if (_settingsSettingsView == null) - _settingsSettingsView = new SettingsSettingsView(); - - // Save settings - _settingsSettingsView.OnVisible(); - - SettingsContent = _settingsSettingsView; - break; - case SettingsViewName.Profiles: - if (_settingsProfilesView == null) - _settingsProfilesView = new SettingsProfilesView(); - - SettingsContent = _settingsProfilesView; - break; - case SettingsViewName.Dashboard: - if (_dashboardSettingsView == null) - _dashboardSettingsView = new DashboardSettingsView(); - - SettingsContent = _dashboardSettingsView; - break; - case SettingsViewName.IPScanner: - if (_ipScannerSettingsView == null) - _ipScannerSettingsView = new IPScannerSettingsView(); - - SettingsContent = _ipScannerSettingsView; - break; - case SettingsViewName.PortScanner: - if (_portScannerSettingsView == null) - _portScannerSettingsView = new PortScannerSettingsView(); - - SettingsContent = _portScannerSettingsView; - break; - case SettingsViewName.PingMonitor: - if (_pingMonitorSettingsView == null) - _pingMonitorSettingsView = new PingMonitorSettingsView(); - - SettingsContent = _pingMonitorSettingsView; - break; - case SettingsViewName.Traceroute: - if (_tracerouteSettingsView == null) - _tracerouteSettingsView = new TracerouteSettingsView(); - - SettingsContent = _tracerouteSettingsView; - break; - case SettingsViewName.DNSLookup: - if (_dnsLookupSettingsViewModel == null) - _dnsLookupSettingsViewModel = new DNSLookupSettingsView(); - - SettingsContent = _dnsLookupSettingsViewModel; - break; - case SettingsViewName.RemoteDesktop: - if (_remoteDesktopSettingsView == null) - _remoteDesktopSettingsView = new RemoteDesktopSettingsView(); - - SettingsContent = _remoteDesktopSettingsView; - break; - case SettingsViewName.PowerShell: - if (_powerShellSettingsView == null) - _powerShellSettingsView = new PowerShellSettingsView(); - - SettingsContent = _powerShellSettingsView; - break; - case SettingsViewName.PuTTY: - if (_puTTYSettingsView == null) - _puTTYSettingsView = new PuTTYSettingsView(); - - SettingsContent = _puTTYSettingsView; - break; - case SettingsViewName.TigerVNC: - if (_tigerVNCSettingsView == null) - _tigerVNCSettingsView = new TigerVNCSettingsView(); - - SettingsContent = _tigerVNCSettingsView; - break; - case SettingsViewName.SNMP: - if (_snmpSettingsView == null) - _snmpSettingsView = new SNMPSettingsView(); - - SettingsContent = _snmpSettingsView; - break; - case SettingsViewName.WakeOnLAN: - if (_wakeOnLANSettingsView == null) - _wakeOnLANSettingsView = new WakeOnLANSettingsView(); - - SettingsContent = _wakeOnLANSettingsView; - break; - case SettingsViewName.Whois: - if (_whoisSettingsView == null) - _whoisSettingsView = new WhoisSettingsView(); - - SettingsContent = _whoisSettingsView; - break; - } + case SettingsName.General: + _settingsGeneralView ??= new SettingsGeneralView(); + + SettingsContent = _settingsGeneralView; + break; + case SettingsName.Window: + _settingsWindowView ??= new SettingsWindowView(); + + SettingsContent = _settingsWindowView; + break; + case SettingsName.Appearance: + _settingsAppearanceView ??= new SettingsAppearanceView(); + + SettingsContent = _settingsAppearanceView; + break; + case SettingsName.Language: + _settingsLanguageView ??= new SettingsLanguageView(); + + SettingsContent = _settingsLanguageView; + break; + case SettingsName.Network: + _settingsNetworkView ??= new SettingsNetworkView(); + + SettingsContent = _settingsNetworkView; + break; + case SettingsName.Status: + _settingsStatusView ??= new SettingsStatusView(); + + SettingsContent = _settingsStatusView; + break; + case SettingsName.HotKeys: + _settingsHotKeysView ??= new SettingsHotkeysView(); + + SettingsContent = _settingsHotKeysView; + break; + case SettingsName.Autostart: + _settingsAutostartView ??= new SettingsAutostartView(); + + SettingsContent = _settingsAutostartView; + break; + case SettingsName.Update: + _settingsUpdateView ??= new SettingsUpdateView(); + + SettingsContent = _settingsUpdateView; + break; + case SettingsName.Settings: + _settingsSettingsView ??= new SettingsSettingsView(); + + SettingsContent = _settingsSettingsView; + break; + case SettingsName.Profiles: + _settingsProfilesView ??= new SettingsProfilesView(); + + SettingsContent = _settingsProfilesView; + break; + case SettingsName.Dashboard: + _dashboardSettingsView ??= new DashboardSettingsView(); + + SettingsContent = _dashboardSettingsView; + break; + case SettingsName.NetworkInterface: + _networkInterfaceSettingsView ??= new NetworkInterfaceSettingsView(); + + SettingsContent = _networkInterfaceSettingsView; + break; + case SettingsName.IPScanner: + _ipScannerSettingsView ??= new IPScannerSettingsView(); + + SettingsContent = _ipScannerSettingsView; + break; + case SettingsName.PortScanner: + _portScannerSettingsView ??= new PortScannerSettingsView(); + + SettingsContent = _portScannerSettingsView; + break; + case SettingsName.PingMonitor: + _pingMonitorSettingsView ??= new PingMonitorSettingsView(); + + SettingsContent = _pingMonitorSettingsView; + break; + case SettingsName.Traceroute: + _tracerouteSettingsView ??= new TracerouteSettingsView(); + + SettingsContent = _tracerouteSettingsView; + break; + case SettingsName.DNSLookup: + _dnsLookupSettingsViewModel ??= new DNSLookupSettingsView(); + + SettingsContent = _dnsLookupSettingsViewModel; + break; + case SettingsName.RemoteDesktop: + _remoteDesktopSettingsView ??= new RemoteDesktopSettingsView(); + + SettingsContent = _remoteDesktopSettingsView; + break; + case SettingsName.PowerShell: + _powerShellSettingsView ??= new PowerShellSettingsView(); + + SettingsContent = _powerShellSettingsView; + break; + case SettingsName.PuTTY: + _puTTYSettingsView ??= new PuTTYSettingsView(); + + SettingsContent = _puTTYSettingsView; + break; + case SettingsName.TigerVNC: + _tigerVNCSettingsView ??= new TigerVNCSettingsView(); + + SettingsContent = _tigerVNCSettingsView; + break; + case SettingsName.WebConsole: + _webConsoleSettingsView ??= new WebConsoleSettingsView(); + + SettingsContent = _webConsoleSettingsView; + break; + case SettingsName.SNMP: + _snmpSettingsView ??= new SNMPSettingsView(); + + SettingsContent = _snmpSettingsView; + break; + case SettingsName.SNTPLookup: + _sntpLookupSettingsView ??= new SNTPLookupSettingsView(); + + SettingsContent = _sntpLookupSettingsView; + break; + case SettingsName.WakeOnLAN: + _wakeOnLANSettingsView ??= new WakeOnLANSettingsView(); + + SettingsContent = _wakeOnLANSettingsView; + break; + case SettingsName.BitCalculator: + _bitCalculatorSettingsView ??= new BitCalculatorSettingsView(); + + SettingsContent = _bitCalculatorSettingsView; + break; } - #endregion } + + public DocumentationIdentifier GetDocumentationIdentifier() + { + return SelectedTabIndex switch + { + 0 => DocumentationManager.GetIdentifierBySettingsName(SelectedSettingsView.Name), + 1 => DocumentationIdentifier.Profiles, + _ => DocumentationIdentifier.Default + }; + } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/SettingsWindowViewModel.cs b/Source/NETworkManager/ViewModels/SettingsWindowViewModel.cs index dc2cee1068..33f6ddfd34 100644 --- a/Source/NETworkManager/ViewModels/SettingsWindowViewModel.cs +++ b/Source/NETworkManager/ViewModels/SettingsWindowViewModel.cs @@ -1,134 +1,132 @@ -using NETworkManager.Settings; +using NETworkManager.Settings; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +public class SettingsWindowViewModel : ViewModelBase { - public class SettingsWindowViewModel : ViewModelBase - { - #region Variables - private readonly bool _isLoading; + #region Variables - private bool _minimizeInsteadOfTerminating; - public bool MinimizeInsteadOfTerminating - { - get => _minimizeInsteadOfTerminating; - set - { - if (value == _minimizeInsteadOfTerminating) - return; - - if (!_isLoading) - SettingsManager.Current.Window_MinimizeInsteadOfTerminating = value; - - _minimizeInsteadOfTerminating = value; - OnPropertyChanged(); - } - } + private readonly bool _isLoading; - private bool _minimizeToTrayInsteadOfTaskbar; - public bool MinimizeToTrayInsteadOfTaskbar + public bool MinimizeInsteadOfTerminating + { + get; + set { - get => _minimizeToTrayInsteadOfTaskbar; - set - { - if (value == _minimizeToTrayInsteadOfTaskbar) - return; - - if (!_isLoading) - SettingsManager.Current.Window_MinimizeToTrayInsteadOfTaskbar = value; - - _minimizeToTrayInsteadOfTaskbar = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.Window_MinimizeInsteadOfTerminating = value; + + field = value; + OnPropertyChanged(); } + } - private bool _confirmClose; - public bool ConfirmClose + public bool MinimizeToTrayInsteadOfTaskbar + { + get; + set { - get => _confirmClose; - set - { - if (value == _confirmClose) - return; - - if (!_isLoading) - SettingsManager.Current.Window_ConfirmClose = value; - - OnPropertyChanged(); - _confirmClose = value; - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.Window_MinimizeToTrayInsteadOfTaskbar = value; + + field = value; + OnPropertyChanged(); } + } - private bool _multipleInstances; - public bool MultipleInstances + public bool ConfirmClose + { + get; + set { - get => _multipleInstances; - set - { - if (value == _multipleInstances) - return; - - if (!_isLoading) - SettingsManager.Current.Window_MultipleInstances = value; - - OnPropertyChanged(); - _multipleInstances = value; - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.Window_ConfirmClose = value; + + field = value; + OnPropertyChanged(); } + } - private bool _alwaysShowIconInTray; - public bool AlwaysShowIconInTray + public bool MultipleInstances + { + get; + set { - get => _alwaysShowIconInTray; - set - { - if (value == _alwaysShowIconInTray) - return; - - if (!_isLoading) - SettingsManager.Current.TrayIcon_AlwaysShowIcon = value; - - _alwaysShowIconInTray = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.Window_MultipleInstances = value; + + field = value; + OnPropertyChanged(); } + } - private bool _splashScreenEnabled; - public bool SplashScreenEnabled + public bool AlwaysShowIconInTray + { + get; + set { - get => _splashScreenEnabled; - set - { - if (value == _splashScreenEnabled) - return; - - if (!_isLoading) - SettingsManager.Current.SplashScreen_Enabled = value; - - _splashScreenEnabled = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.TrayIcon_AlwaysShowIcon = value; + + field = value; + OnPropertyChanged(); } - #endregion + } - #region Constructor, LoadSettings - public SettingsWindowViewModel() + public bool SplashScreenEnabled + { + get; + set { - _isLoading = true; + if (value == field) + return; - LoadSettings(); + if (!_isLoading) + SettingsManager.Current.SplashScreen_Enabled = value; - _isLoading = false; - } - private void LoadSettings() - { - MinimizeInsteadOfTerminating = SettingsManager.Current.Window_MinimizeInsteadOfTerminating; - ConfirmClose = SettingsManager.Current.Window_ConfirmClose; - MultipleInstances = SettingsManager.Current.Window_MultipleInstances; - MinimizeToTrayInsteadOfTaskbar = SettingsManager.Current.Window_MinimizeToTrayInsteadOfTaskbar; - AlwaysShowIconInTray = SettingsManager.Current.TrayIcon_AlwaysShowIcon; - SplashScreenEnabled = SettingsManager.Current.SplashScreen_Enabled; + field = value; + OnPropertyChanged(); } - #endregion } -} \ No newline at end of file + + #endregion + + #region Constructor, LoadSettings + + public SettingsWindowViewModel() + { + _isLoading = true; + + LoadSettings(); + + _isLoading = false; + } + + private void LoadSettings() + { + MinimizeInsteadOfTerminating = SettingsManager.Current.Window_MinimizeInsteadOfTerminating; + ConfirmClose = SettingsManager.Current.Window_ConfirmClose; + MultipleInstances = SettingsManager.Current.Window_MultipleInstances; + MinimizeToTrayInsteadOfTaskbar = SettingsManager.Current.Window_MinimizeToTrayInsteadOfTaskbar; + AlwaysShowIconInTray = SettingsManager.Current.TrayIcon_AlwaysShowIcon; + SplashScreenEnabled = SettingsManager.Current.SplashScreen_Enabled; + } + + #endregion +} diff --git a/Source/NETworkManager/ViewModels/SpeedTestWidgetViewModel.cs b/Source/NETworkManager/ViewModels/SpeedTestWidgetViewModel.cs new file mode 100644 index 0000000000..33c785213e --- /dev/null +++ b/Source/NETworkManager/ViewModels/SpeedTestWidgetViewModel.cs @@ -0,0 +1,321 @@ +using System; +using System.Collections.ObjectModel; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Input; +using LiveChartsCore; +using LiveChartsCore.Drawing; +using LiveChartsCore.Kernel.Sketches; +using LiveChartsCore.SkiaSharpView; +using LiveChartsCore.SkiaSharpView.Painting; +using log4net; +using NETworkManager.Localization.Resources; +using NETworkManager.Models.Cloudflare; +using NETworkManager.Utilities; +using SkiaSharp; + +namespace NETworkManager.ViewModels; + +/// +/// View model for the Cloudflare speed test widget. Exposes live values for +/// the metric tiles plus per-sample history for the download/upload sparkline +/// charts (LiveCharts2). +/// +public class SpeedTestWidgetViewModel : ViewModelBase +{ + private static readonly ILog Log = LogManager.GetLogger(typeof(SpeedTestWidgetViewModel)); + + private readonly SpeedTestService _service = new(); + private CancellationTokenSource _cts; + + public bool IsRunning + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// True until the user accepts the privacy disclaimer for the current + /// VM lifetime. Not persisted — the disclaimer is shown on every app + /// start by design. + /// + public bool ShowDisclaimer + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = true; + + public SpeedTestResult Result + { + get; + private set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + OnPropertyChanged(nameof(HasResult)); + } + } + + public bool HasResult => Result != null; + + public string StatusMessage + { + get; + private set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public double? CurrentDownloadMbps + { + get; + private set + { + if (Nullable.Equals(value, field)) + return; + + field = value; + OnPropertyChanged(); + } + } + + public double? CurrentUploadMbps + { + get; + private set + { + if (Nullable.Equals(value, field)) + return; + + field = value; + OnPropertyChanged(); + } + } + + public double? CurrentLatencyMs + { + get; + private set + { + if (Nullable.Equals(value, field)) + return; + + field = value; + OnPropertyChanged(); + } + } + + public double? CurrentJitterMs + { + get; + private set + { + if (Nullable.Equals(value, field)) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// Download samples (Mbps), one per completed HTTP request. + private ObservableCollection DownloadSamples { get; } = []; + + /// Upload samples (Mbps), one per completed HTTP request. + private ObservableCollection UploadSamples { get; } = []; + + /// LiveCharts2 series for the download sparkline. + public ISeries[] DownloadSeries { get; } + + /// LiveCharts2 series for the upload sparkline. + public ISeries[] UploadSeries { get; } + + /// Hidden X-axes for the download sparkline (anchored at 0 so the first sample sits at the left edge). + public ICartesianAxis[] DownloadXAxes { get; } = [new Axis { IsVisible = false, MinLimit = 0, MinStep = 1 }]; + + /// Hidden Y-axes for the download sparkline. + public ICartesianAxis[] DownloadYAxes { get; } = [new Axis { IsVisible = false, MinLimit = 0 }]; + + /// Hidden X-axes for the upload sparkline. + public ICartesianAxis[] UploadXAxes { get; } = [new Axis { IsVisible = false, MinLimit = 0, MinStep = 1 }]; + + /// Hidden Y-axes for the upload sparkline. + public ICartesianAxis[] UploadYAxes { get; } = [new Axis { IsVisible = false, MinLimit = 0 }]; + + public ICommand RunCommand => field ??= new RelayCommand(_ => RunAction()); + + public ICommand AcceptDisclaimerCommand => field ??= new RelayCommand(_ => AcceptDisclaimerAction()); + + public SpeedTestWidgetViewModel() + { + var downloadColor = SKColor.Parse("#1ba1e2"); + DownloadSeries = + [ + new LineSeries + { + Name = Strings.Download, + Values = DownloadSamples, + GeometrySize = 1.5f, + LineSmoothness = 0.3, + DataPadding = new LvcPoint(0, 0), + Stroke = new SolidColorPaint(downloadColor) { StrokeThickness = 1.5f }, + Fill = new SolidColorPaint(downloadColor.WithAlpha(0x33)) + } + ]; + + var uploadColor = SKColor.Parse("#7fba00"); + UploadSeries = + [ + new LineSeries + { + Name = Strings.Upload, + Values = UploadSamples, + GeometrySize = 1.5f, + LineSmoothness = 0.3, + DataPadding = new LvcPoint(0, 0), + Stroke = new SolidColorPaint(uploadColor) { StrokeThickness = 1.5f }, + Fill = new SolidColorPaint(uploadColor.WithAlpha(0x33)) + } + ]; + } + + private void RunAction() + { + if (IsRunning) + { + _cts?.Cancel(); + return; + } + + if (ShowDisclaimer) + return; + + _ = RunAsync(); + } + + private void AcceptDisclaimerAction() + { + ShowDisclaimer = false; + _ = RunAsync(); + } + + private async Task RunAsync() + { + if (IsRunning) + return; + + IsRunning = true; + Result = null; + CurrentDownloadMbps = null; + CurrentUploadMbps = null; + CurrentLatencyMs = null; + CurrentJitterMs = null; + DownloadSamples.Clear(); + UploadSamples.Clear(); + StatusMessage = Strings.FetchingMetadataDots; + + _cts?.Dispose(); + _cts = new CancellationTokenSource(); + + var progress = new Progress(p => + { + StatusMessage = p.Phase switch + { + SpeedTestPhase.FetchingMetadata => Strings.FetchingMetadataDots, + SpeedTestPhase.MeasuringLatency => Strings.MeasuringLatencyDots, + SpeedTestPhase.MeasuringDownload => Strings.MeasuringDownloadSpeedDots, + SpeedTestPhase.MeasuringUpload => Strings.MeasuringUploadSpeedDots, + _ => string.Empty + }; + + if (p.DownloadMbps.HasValue) + CurrentDownloadMbps = p.DownloadMbps; + if (p.UploadMbps.HasValue) + CurrentUploadMbps = p.UploadMbps; + if (p.LatencyMs.HasValue) + CurrentLatencyMs = p.LatencyMs; + if (p.JitterMs.HasValue) + CurrentJitterMs = p.JitterMs; + + if (p.NewDownloadSampleMbps.HasValue) + { + // Seed the first point twice so LiveCharts2 renders the sparkline + // anchored at x=0 rather than starting mid-chart on the first sample. + if (DownloadSamples.Count == 0) + DownloadSamples.Add(p.NewDownloadSampleMbps.Value); + DownloadSamples.Add(p.NewDownloadSampleMbps.Value); + } + if (p.NewUploadSampleMbps.HasValue) + { + // Same workaround as above for the upload sparkline. + if (UploadSamples.Count == 0) + UploadSamples.Add(p.NewUploadSampleMbps.Value); + UploadSamples.Add(p.NewUploadSampleMbps.Value); + } + + if (p.Meta != null) + { + // Populate Result with metadata-only fields so the UI can + // show ISP / location / server while measurements are still running. + Result = new SpeedTestResult + { + Isp = p.Meta.AsOrganization, + ClientCity = p.Meta.City, + ClientCountry = p.Meta.Country, + ServerCity = p.Meta.Colo?.City, + ServerCountry = p.Meta.Colo?.Cca2, + ServerIata = p.Meta.Colo?.Iata + }; + } + }); + + try + { + var result = await _service.RunAsync(progress, _cts.Token); + Result = result; + CurrentDownloadMbps = result.DownloadMbps; + CurrentUploadMbps = result.UploadMbps; + CurrentLatencyMs = result.LatencyMs; + CurrentJitterMs = result.JitterMs; + } + catch (OperationCanceledException) + { + // Partial results remain visible; everything resets at the start of the next run. + } + catch (Exception ex) + { + Log.Error("Speed test failed.", ex); + Result = new SpeedTestResult + { + HasError = true, + ErrorMessage = ex.Message + }; + } + finally + { + IsRunning = false; + } + } +} diff --git a/Source/NETworkManager/ViewModels/SubnetCalculatorCalculatorViewModel.cs b/Source/NETworkManager/ViewModels/SubnetCalculatorCalculatorViewModel.cs index e0ad850185..947254e44e 100644 --- a/Source/NETworkManager/ViewModels/SubnetCalculatorCalculatorViewModel.cs +++ b/Source/NETworkManager/ViewModels/SubnetCalculatorCalculatorViewModel.cs @@ -1,215 +1,135 @@ -using NETworkManager.Settings; -using System.Net; -using System.Windows.Input; using System.ComponentModel; -using System.Windows.Data; using System.Linq; -using NETworkManager.Utilities; -using System.Numerics; +using System.Net; using System.Windows; +using System.Windows.Data; +using System.Windows.Input; using MahApps.Metro.Controls; +using NETworkManager.Models.Network; +using NETworkManager.Settings; +using NETworkManager.Utilities; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +public class SubnetCalculatorCalculatorViewModel : ViewModelBase { - public class SubnetCalculatorCalculatorViewModel : ViewModelBase + #region Constructor, load settings + + public SubnetCalculatorCalculatorViewModel() { - #region Variables - private string _subnet; - public string Subnet - { - get => _subnet; - set - { - if (value == _subnet) - return; - - _subnet = value; - OnPropertyChanged(); - } - } + SubnetHistoryView = + CollectionViewSource.GetDefaultView(SettingsManager.Current.SubnetCalculator_Calculator_SubnetHistory); + } - public ICollectionView SubnetHistoryView { get; } + #endregion - private bool _isResultVisible; - public bool IsResultVisible - { - get => _isResultVisible; - set - { - if (value == _isResultVisible) - return; + #region Variables + public string Subnet + { + get; + set + { + if (value == field) + return; - _isResultVisible = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private IPAddress _networkAddress; - public IPAddress NetworkAddress - { - get => _networkAddress; - set - { - if (Equals(value, _networkAddress)) - return; - - _networkAddress = value; - OnPropertyChanged(); - } - } + public ICollectionView SubnetHistoryView { get; } - private IPAddress _broadcast; - public IPAddress Broadcast + public bool IsRunning + { + get; + set { - get => _broadcast; - set - { - if (Equals(value, _broadcast)) - return; - - _broadcast = value; - OnPropertyChanged(); - } - } + if (value == field) + return; - private BigInteger _ipAddresses; - public BigInteger IPAddresses - { - get => _ipAddresses; - set - { - if (value == _ipAddresses) - return; - - _ipAddresses = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private IPAddress _subnetmask; - public IPAddress Subnetmask + public bool IsResultVisible + { + get; + set { - get => _subnetmask; - set - { - if (Equals(value, _subnetmask)) - return; - - _subnetmask = value; - OnPropertyChanged(); - } - } + if (value == field) + return; - private int _cidr; - public int CIDR - { - get => _cidr; - set - { - if (value == _cidr) - return; - - _cidr = value; - OnPropertyChanged(); - } - } - private IPAddress _firstIPAddress; - public IPAddress FirstIPAddress - { - get => _firstIPAddress; - set - { - if (Equals(value, _firstIPAddress)) - return; - - _firstIPAddress = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private IPAddress _lastIPAddress; - public IPAddress LastIPAddress + public IPNetworkInfo Result + { + get; + private set { - get => _lastIPAddress; - set - { - if (Equals(value, _lastIPAddress)) - return; - - _lastIPAddress = value; - OnPropertyChanged(); - } - } + if (value == field) + return; - private BigInteger _hosts; - public BigInteger Hosts - { - get => _hosts; - set - { - if (value == _hosts) - return; - - _hosts = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion + } - #region Constructor, load settings - public SubnetCalculatorCalculatorViewModel() - { - // Set collection view - SubnetHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.SubnetCalculator_Calculator_SubnetHistory); - } - #endregion + #endregion - #region ICommands - public ICommand CalculateCommand => new RelayCommand(p => CalcualateAction(), Calculate_CanExecute); + #region ICommands - private bool Calculate_CanExecute(object paramter) => Application.Current.MainWindow != null && !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen; + public ICommand CalculateCommand => new RelayCommand(_ => CalculateAction(), Calculate_CanExecute); - private void CalcualateAction() - { - Calculate(); - } - #endregion + private bool Calculate_CanExecute(object parameter) + { + return Application.Current.MainWindow != null && + !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && + !ConfigurationManager.Current.IsChildWindowOpen; + } - #region Methods - private void Calculate() - { - IsResultVisible = false; - - var subnet = IPNetwork.Parse(Subnet); - - NetworkAddress = subnet.Network; - Broadcast = subnet.Broadcast; - Subnetmask = subnet.Netmask; - CIDR = subnet.Cidr; - IPAddresses = subnet.Total; - FirstIPAddress = subnet.FirstUsable; - LastIPAddress = subnet.LastUsable; - Hosts = subnet.Usable; - - IsResultVisible = true; - - AddSubnetToHistory(Subnet); - } + private void CalculateAction() + { + Calculate(); + } - private void AddSubnetToHistory(string subnet) - { - // Create the new list - var list = ListHelper.Modify(SettingsManager.Current.SubnetCalculator_Calculator_SubnetHistory.ToList(), subnet, SettingsManager.Current.General_HistoryListEntries); + #endregion - // Clear the old items - SettingsManager.Current.SubnetCalculator_Calculator_SubnetHistory.Clear(); - OnPropertyChanged(nameof(Subnet)); // Raise property changed again, after the collection has been cleared + #region Methods - // Fill with the new items - list.ForEach(x => SettingsManager.Current.SubnetCalculator_Calculator_SubnetHistory.Add(x)); - } - #endregion + private void Calculate() + { + IsRunning = true; + + var subnet = Subnet.Trim(); + + Result = new IPNetworkInfo(IPNetwork2.Parse(subnet)); + + IsResultVisible = true; + + AddSubnetToHistory(subnet); + + IsRunning = false; } + + private void AddSubnetToHistory(string subnet) + { + // Create the new list + var list = ListHelper.Modify(SettingsManager.Current.SubnetCalculator_Calculator_SubnetHistory.ToList(), subnet, + SettingsManager.Current.General_HistoryListEntries); + + // Clear the old items + SettingsManager.Current.SubnetCalculator_Calculator_SubnetHistory.Clear(); + OnPropertyChanged(nameof(Subnet)); // Raise property changed again, after the collection has been cleared + + // Fill with the new items + list.ForEach(x => SettingsManager.Current.SubnetCalculator_Calculator_SubnetHistory.Add(x)); + } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/SubnetCalculatorHostViewModel.cs b/Source/NETworkManager/ViewModels/SubnetCalculatorHostViewModel.cs index bd4b1710bd..f037c6a6aa 100644 --- a/Source/NETworkManager/ViewModels/SubnetCalculatorHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/SubnetCalculatorHostViewModel.cs @@ -1,10 +1,12 @@ -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +public class SubnetCalculatorHostViewModel : ViewModelBase { - public class SubnetCalculatorHostViewModel : ViewModelBase + public void OnViewVisible() { - public SubnetCalculatorHostViewModel() - { + } - } + public void OnViewHide() + { } -} +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/SubnetCalculatorSubnettingViewModel.cs b/Source/NETworkManager/ViewModels/SubnetCalculatorSubnettingViewModel.cs index 7911239c71..45dcc67af1 100644 --- a/Source/NETworkManager/ViewModels/SubnetCalculatorSubnettingViewModel.cs +++ b/Source/NETworkManager/ViewModels/SubnetCalculatorSubnettingViewModel.cs @@ -1,373 +1,295 @@ -using NETworkManager.Settings; -using System.Windows.Input; +using log4net; +using MahApps.Metro.Controls; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Localization.Resources; +using NETworkManager.Models.Export; +using NETworkManager.Models.Network; +using NETworkManager.Settings; using NETworkManager.Utilities; +using NETworkManager.Views; +using System; +using System.Collections; using System.Collections.ObjectModel; -using System.Windows; -using System.Windows.Data; using System.ComponentModel; -using MahApps.Metro.Controls.Dialogs; using System.Linq; using System.Net; -using System; -using System.Collections; +using System.Net.Sockets; using System.Threading.Tasks; +using System.Windows; +using System.Windows.Data; +using System.Windows.Input; using System.Windows.Threading; -using MahApps.Metro.Controls; -using NETworkManager.Models.Export; -using NETworkManager.Models.Network; -using NETworkManager.Views; -using System.Text.RegularExpressions; - -namespace NETworkManager.ViewModels -{ - public class SubnetCalculatorSubnettingViewModel : ViewModelBase - { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - - private string _subnet; - public string Subnet - { - get => _subnet; - set - { - if (value == _subnet) - return; +using IPAddress = System.Net.IPAddress; - _subnet = value; - OnPropertyChanged(); - } - } +namespace NETworkManager.ViewModels; - public ICollectionView SubnetHistoryView { get; } +public class SubnetCalculatorSubnettingViewModel : ViewModelBase +{ + #region Constructor, load settings - private string _newSubnetmaskOrCIDR; - public string NewSubnetmaskOrCIDR - { - get => _newSubnetmaskOrCIDR; - set - { - if (value == _newSubnetmaskOrCIDR) - return; + public SubnetCalculatorSubnettingViewModel() + { + // Set collection view + SubnetHistoryView = + CollectionViewSource.GetDefaultView(SettingsManager.Current.SubnetCalculator_Subnetting_SubnetHistory); + NewSubnetmaskHistoryView = + CollectionViewSource.GetDefaultView( + SettingsManager.Current.SubnetCalculator_Subnetting_NewSubnetmaskHistory); + + // Result view + ResultsView = CollectionViewSource.GetDefaultView(Results); + } - _newSubnetmaskOrCIDR = value; - OnPropertyChanged(); - } - } + #endregion - public ICollectionView NewSubnetmaskOrCIDRHistoryView { get; } + #region Variables + private static readonly ILog Log = LogManager.GetLogger(typeof(SubnetCalculatorSubnettingViewModel)); - private bool _isCalculationRunning; - public bool IsCalculationRunning + public string Subnet + { + get; + set { - get => _isCalculationRunning; - set - { - if (value == _isCalculationRunning) - return; + if (value == field) + return; - _isCalculationRunning = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isResultVisible; - public bool IsResultVisible - { - get => _isResultVisible; - set - { - if (value == _isResultVisible) - return; - - - _isResultVisible = value; - OnPropertyChanged(); - } - } + public ICollectionView SubnetHistoryView { get; } - private ObservableCollection _subnetsResult = new ObservableCollection(); - public ObservableCollection SubnetsResult + public string NewSubnetmask + { + get; + set { - get => _subnetsResult; - set - { - if (value == _subnetsResult) - return; + if (value == field) + return; - _subnetsResult = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - public ICollectionView SubnetsResultsView { get; } + public ICollectionView NewSubnetmaskHistoryView { get; } - private IPNetworkInfo _selectedSubnetResult; - public IPNetworkInfo SelectedSubnetResult + public bool IsRunning + { + get; + set { - get => _selectedSubnetResult; - set - { - if (value == _selectedSubnetResult) - return; + if (value == field) + return; - _selectedSubnetResult = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - - private IList _selectedSubnetResults = new ArrayList(); - public IList SelectedSubnetResults + public bool IsResultVisible + { + get; + set { - get => _selectedSubnetResults; - set - { - if (Equals(value, _selectedSubnetResults)) - return; - - _selectedSubnetResults = value; - OnPropertyChanged(); - } - } - + if (value == field) + return; - private bool _isStatusMessageDisplayed; - public bool IsStatusMessageDisplayed - { - get => _isStatusMessageDisplayed; - set - { - if (value == _isStatusMessageDisplayed) - return; - _isStatusMessageDisplayed = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _statusMessage; - public string StatusMessage - { - get => _statusMessage; - set - { - if (value == _statusMessage) - return; - - _statusMessage = value; - OnPropertyChanged(); - } - } - #endregion - - #region Constructor, load settings - public SubnetCalculatorSubnettingViewModel(IDialogCoordinator instance) + public ObservableCollection Results + { + get; + set { - _dialogCoordinator = instance; - - // Set collection view - SubnetHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.SubnetCalculator_Subnetting_SubnetHistory); - NewSubnetmaskOrCIDRHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.SubnetCalculator_Subnetting_NewSubnetmaskOrCIDRHistory); + if (value == field) + return; - // Result view - SubnetsResultsView = CollectionViewSource.GetDefaultView(SubnetsResult); + field = value; + OnPropertyChanged(); } - #endregion + } = new(); - #region ICommands & Actions - public ICommand CalculateCommand => new RelayCommand(p => CalculateAction(), Calculate_CanExecute); + public ICollectionView ResultsView { get; } - private bool Calculate_CanExecute(object paramter) => Application.Current.MainWindow != null && !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen; - - private void CalculateAction() + public IPNetworkInfo SelectedResult + { + get; + set { - Calculate(); - } - - public ICommand CopySelectedNetworkAddressCommand => new RelayCommand(p => CopySelectedNetworkAddressAction()); + if (value == field) + return; - private void CopySelectedNetworkAddressAction() - { - ClipboardHelper.SetClipboard(SelectedSubnetResult.Network.ToString()); + field = value; + OnPropertyChanged(); } + } - public ICommand CopySelectedBroadcastCommand => new RelayCommand(p => CopySelectedBroadcastAction()); - private void CopySelectedBroadcastAction() + public IList SelectedResults + { + get; + set { - ClipboardHelper.SetClipboard(SelectedSubnetResult.Broadcast.ToString()); - } + if (Equals(value, field)) + return; - public ICommand CopySelectedIPAddressesCommand => new RelayCommand(p => CopySelectedIPAddressesAction()); - - private void CopySelectedIPAddressesAction() - { - ClipboardHelper.SetClipboard(SelectedSubnetResult.Total.ToString()); + field = value; + OnPropertyChanged(); } + } = new ArrayList(); - public ICommand CopySelectedSubnetmaskCommand => new RelayCommand(p => CopySelectedSubnetmaskAction()); + #endregion - private void CopySelectedSubnetmaskAction() - { - ClipboardHelper.SetClipboard(SelectedSubnetResult.Netmask.ToString()); - } + #region ICommands & Actions - public ICommand CopySelectedCIDRCommand => new RelayCommand(p => CopySelectedCIDRAction()); + public ICommand CalculateCommand => new RelayCommand(_ => CalculateAction(), Calculate_CanExecute); - private void CopySelectedCIDRAction() - { - ClipboardHelper.SetClipboard(SelectedSubnetResult.Cidr.ToString()); - } + private bool Calculate_CanExecute(object parameter) + { + return Application.Current.MainWindow != null && + !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && + !ConfigurationManager.Current.IsChildWindowOpen; + } - public ICommand CopySelectedFirstIPAddressCommand => new RelayCommand(p => CopySelectedFirstIPAddressAction()); + private void CalculateAction() + { + _ = Calculate(); + } - private void CopySelectedFirstIPAddressAction() - { - ClipboardHelper.SetClipboard(SelectedSubnetResult.FirstUsable.ToString()); - } + public ICommand ExportCommand => new RelayCommand(parameter => { _ = ExportAction(); }); - public ICommand CopySelectedLastIPAddressCommand => new RelayCommand(p => CopySelectedLastIPAddressAction()); + private Task ExportAction() + { + var childWindow = new ExportChildWindow(); - private void CopySelectedLastIPAddressAction() + var childWindowViewModel = new ExportViewModel(async instance => { - ClipboardHelper.SetClipboard(SelectedSubnetResult.LastUsable.ToString()); - } + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - public ICommand CopySelectedHostCommand => new RelayCommand(p => CopySelectedHostAction()); - - private void CopySelectedHostAction() - { - ClipboardHelper.SetClipboard(SelectedSubnetResult.Usable.ToString()); - } + try + { + ExportManager.Export(instance.FilePath, instance.FileType, + instance.ExportAll + ? Results + : new ObservableCollection(SelectedResults.Cast().ToArray())); + } + catch (Exception ex) + { + Log.Error("Error while exporting data as " + instance.FileType, ex); - public ICommand ExportCommand => new RelayCommand(p => ExportAction()); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); + } - private async Task ExportAction() + SettingsManager.Current.SubnetCalculator_Subnetting_ExportFileType = instance.FileType; + SettingsManager.Current.SubnetCalculator_Subnetting_ExportFilePath = instance.FilePath; + }, _ => { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.Export - }; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, [ + ExportFileType.Csv, ExportFileType.Xml, ExportFileType.Json + ], true, SettingsManager.Current.SubnetCalculator_Subnetting_ExportFileType, + SettingsManager.Current.SubnetCalculator_Subnetting_ExportFilePath); - var exportViewModel = new ExportViewModel(async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + childWindow.Title = Strings.Export; - try - { - ExportManager.Export(instance.FilePath, instance.FileType, instance.ExportAll ? SubnetsResult : new ObservableCollection(SelectedSubnetResults.Cast().ToArray())); - } - catch (Exception ex) - { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Localization.Resources.Strings.OK; + childWindow.DataContext = childWindowViewModel; - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Error, Localization.Resources.Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); - } + ConfigurationManager.Current.IsChildWindowOpen = true; - SettingsManager.Current.SubnetCalculator_Subnetting_ExportFileType = instance.FileType; - SettingsManager.Current.SubnetCalculator_Subnetting_ExportFilePath = instance.FilePath; - }, instance => { _dialogCoordinator.HideMetroDialogAsync(this, customDialog); }, new ExportManager.ExportFileType[] { ExportManager.ExportFileType.CSV, ExportManager.ExportFileType.XML, ExportManager.ExportFileType.JSON }, true, SettingsManager.Current.SubnetCalculator_Subnetting_ExportFileType, SettingsManager.Current.SubnetCalculator_Subnetting_ExportFilePath); + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } - customDialog.Content = new ExportDialog - { - DataContext = exportViewModel - }; + #endregion - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } - #endregion + #region Methods - #region Methods - private async Task Calculate() - { - IsStatusMessageDisplayed = false; - IsCalculationRunning = true; + private async Task Calculate() + { + IsRunning = true; - SubnetsResult.Clear(); + Results.Clear(); - var subnet = IPNetwork.Parse(Subnet); + var subnet = Subnet.Trim(); + var newSubnetmaskOrCidr = NewSubnetmask.Trim(); - byte newCidr = 0; + var ipNetwork = IPNetwork2.Parse(Subnet.Trim()); + var newCidr = // Support subnetmask like 255.255.255.0 - if (Regex.IsMatch(NewSubnetmaskOrCIDR, RegexHelper.SubnetmaskRegex)) - newCidr = Convert.ToByte(Subnetmask.ConvertSubnetmaskToCidr(IPAddress.Parse(NewSubnetmaskOrCIDR))); - else - newCidr = Convert.ToByte(NewSubnetmaskOrCIDR.TrimStart('/')); + RegexHelper.SubnetmaskRegex().IsMatch(newSubnetmaskOrCidr) + ? Convert.ToByte(Subnetmask.ConvertSubnetmaskToCidr(IPAddress.Parse(newSubnetmaskOrCidr))) + : Convert.ToByte(newSubnetmaskOrCidr.TrimStart('/')); - // Ask the user if there is a large calculation... - var baseCidr = subnet.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork ? 32 : 128; + // Ask the user if there is a large calculation... + var baseCidr = ipNetwork.AddressFamily == AddressFamily.InterNetwork ? 32 : 128; - if (65535 < Math.Pow(2, baseCidr - subnet.Cidr) / Math.Pow(2, (baseCidr - newCidr))) + if (65535 < Math.Pow(2, baseCidr - ipNetwork.Cidr) / Math.Pow(2, baseCidr - newCidr)) + { + if (!await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, Strings.AreYouSure, Strings.TheProcessCanTakeUpSomeTimeAndResources)) { - var settings = AppearanceManager.MetroDialog; - - settings.AffirmativeButtonText = Localization.Resources.Strings.Continue; - settings.NegativeButtonText = Localization.Resources.Strings.Cancel; + IsRunning = false; - settings.DefaultButtonFocus = MessageDialogResult.Affirmative; - - if (await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.AreYouSure, Localization.Resources.Strings.TheProcessCanTakeUpSomeTimeAndResources, MessageDialogStyle.AffirmativeAndNegative, settings) != MessageDialogResult.Affirmative) - { - IsCalculationRunning = false; - - return; - } + return; } - - // This still slows the application / freezes the ui... there are to many updates to the ui thread... - await Task.Run(() => - { - foreach (var network in subnet.Subnet(newCidr)) - { - Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(delegate - { - //lock (SubnetsResult) - SubnetsResult.Add(new IPNetworkInfo(network)); - })); - } - }); - - IsResultVisible = true; - - AddSubnetToHistory(Subnet); - AddNewSubnetmaskOrCIDRToHistory(NewSubnetmaskOrCIDR); - - IsCalculationRunning = false; } - private void AddSubnetToHistory(string subnet) + // This still slows the application / freezes the ui... there are to many updates to the ui thread... + await Task.Run(() => { - // Create the new list - var list = ListHelper.Modify(SettingsManager.Current.SubnetCalculator_Subnetting_SubnetHistory.ToList(), subnet, SettingsManager.Current.General_HistoryListEntries); + foreach (var network in ipNetwork.Subnet(newCidr)) + Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, + new Action(delegate { Results.Add(new IPNetworkInfo(network)); })); + }); - // Clear the old items - SettingsManager.Current.SubnetCalculator_Subnetting_SubnetHistory.Clear(); - OnPropertyChanged(nameof(Subnet)); // Raise property changed again, after the collection has been cleared + IsResultVisible = true; - // Fill with the new items - list.ForEach(x => SettingsManager.Current.SubnetCalculator_Subnetting_SubnetHistory.Add(x)); - } + AddSubnetToHistory(subnet); + AddNewSubnetmaskOrCidrToHistory(newSubnetmaskOrCidr); - private void AddNewSubnetmaskOrCIDRToHistory(string newSubnetmaskOrCIDR) - { - // Create the new list - var list = ListHelper.Modify(SettingsManager.Current.SubnetCalculator_Subnetting_NewSubnetmaskOrCIDRHistory.ToList(), newSubnetmaskOrCIDR, SettingsManager.Current.General_HistoryListEntries); + IsRunning = false; + } - // Clear the old items - SettingsManager.Current.SubnetCalculator_Subnetting_NewSubnetmaskOrCIDRHistory.Clear(); - OnPropertyChanged(nameof(NewSubnetmaskOrCIDR)); // Raise property changed again, after the collection has been cleared + private void AddSubnetToHistory(string subnet) + { + // Create the new list + var list = ListHelper.Modify(SettingsManager.Current.SubnetCalculator_Subnetting_SubnetHistory.ToList(), subnet, + SettingsManager.Current.General_HistoryListEntries); - // Fill with the new items - list.ForEach(x => SettingsManager.Current.SubnetCalculator_Subnetting_NewSubnetmaskOrCIDRHistory.Add(x)); - } + // Clear the old items + SettingsManager.Current.SubnetCalculator_Subnetting_SubnetHistory.Clear(); + OnPropertyChanged(nameof(Subnet)); // Raise property changed again, after the collection has been cleared - public void OnShutdown() - { + // Fill with the new items + list.ForEach(x => SettingsManager.Current.SubnetCalculator_Subnetting_SubnetHistory.Add(x)); + } - } - #endregion + private void AddNewSubnetmaskOrCidrToHistory(string newSubnetmaskOrCidr) + { + // Create the new list + var list = ListHelper.Modify(SettingsManager.Current.SubnetCalculator_Subnetting_NewSubnetmaskHistory.ToList(), + newSubnetmaskOrCidr, SettingsManager.Current.General_HistoryListEntries); + + // Clear the old items + SettingsManager.Current.SubnetCalculator_Subnetting_NewSubnetmaskHistory.Clear(); + OnPropertyChanged(nameof(NewSubnetmask)); // Raise property changed again, after the collection has been cleared + + // Fill with the new items + list.ForEach(x => SettingsManager.Current.SubnetCalculator_Subnetting_NewSubnetmaskHistory.Add(x)); } + + public void OnShutdown() + { + } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/SubnetCalculatorWideSubnetViewModel.cs b/Source/NETworkManager/ViewModels/SubnetCalculatorWideSubnetViewModel.cs index 6e45b0fbc6..c351a0dbad 100644 --- a/Source/NETworkManager/ViewModels/SubnetCalculatorWideSubnetViewModel.cs +++ b/Source/NETworkManager/ViewModels/SubnetCalculatorWideSubnetViewModel.cs @@ -1,275 +1,176 @@ -using NETworkManager.Settings; -using System.Windows.Input; -using NETworkManager.Utilities; -using System.Windows.Data; using System.ComponentModel; using System.Linq; using System.Net; -using System.Numerics; using System.Windows; +using System.Windows.Data; +using System.Windows.Input; using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; +using NETworkManager.Models.Network; +using NETworkManager.Settings; +using NETworkManager.Utilities; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +public class SubnetCalculatorWideSubnetViewModel : ViewModelBase { - public class SubnetCalculatorWideSubnetViewModel : ViewModelBase + #region Constructor, load settings + + public SubnetCalculatorWideSubnetViewModel() { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; + // Set collection view + Subnet1HistoryView = + CollectionViewSource.GetDefaultView(SettingsManager.Current.SubnetCalculator_WideSubnet_Subnet1); + Subnet2HistoryView = + CollectionViewSource.GetDefaultView(SettingsManager.Current.SubnetCalculator_WideSubnet_Subnet2); + } - private string _subnet1; - public string Subnet1 - { - get => _subnet1; - set - { - if (value == _subnet1) - return; - - _subnet1 = value; - OnPropertyChanged(); - } - } + #endregion - public ICollectionView Subnet1HistoryView { get; } + #region Variables - private string _subnet2; - public string Subnet2 + public string Subnet1 + { + get; + set { - get => _subnet2; - set - { - if (value == _subnet2) - return; - - _subnet2 = value; - OnPropertyChanged(); - } - } - - public ICollectionView Subnet2HistoryView { get; } + if (value == field) + return; - private bool _isCalculationRunning; - public bool IsCalculationRunning - { - get => _isCalculationRunning; - set - { - if (value == _isCalculationRunning) - return; - - _isCalculationRunning = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isResultVisible; - public bool IsResultVisible - { - get => _isResultVisible; - set - { - if (value == _isResultVisible) - return; + public ICollectionView Subnet1HistoryView { get; } + public string Subnet2 + { + get; + set + { + if (value == field) + return; - _isResultVisible = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private IPAddress _networkAddress; - public IPAddress NetworkAddress - { - get => _networkAddress; - set - { - if (Equals(value, _networkAddress)) - return; - - _networkAddress = value; - OnPropertyChanged(); - } - } + public ICollectionView Subnet2HistoryView { get; } - private IPAddress _broadcast; - public IPAddress Broadcast + public bool IsRunning + { + get; + set { - get => _broadcast; - set - { - if (Equals(value, _broadcast)) - return; - - _broadcast = value; - OnPropertyChanged(); - } - } + if (value == field) + return; - private BigInteger _ipAddresses; - public BigInteger IPAddresses - { - get => _ipAddresses; - set - { - if (value == _ipAddresses) - return; - - _ipAddresses = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private IPAddress _subnetmask; - public IPAddress Subnetmask + public bool IsResultVisible + { + get; + set { - get => _subnetmask; - set - { - if (Equals(value, _subnetmask)) - return; - - _subnetmask = value; - OnPropertyChanged(); - } - } + if (value == field) + return; - private int _cidr; - public int CIDR - { - get => _cidr; - set - { - if (value == _cidr) - return; - - _cidr = value; - OnPropertyChanged(); - } - } - private IPAddress _firstIPAddress; - public IPAddress FirstIPAddress - { - get => _firstIPAddress; - set - { - if (Equals(value, _firstIPAddress)) - return; - - _firstIPAddress = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private IPAddress _lastIPAddress; - public IPAddress LastIPAddress + public IPNetworkInfo Result + { + get; + private set { - get => _lastIPAddress; - set - { - if (Equals(value, _lastIPAddress)) - return; - - _lastIPAddress = value; - OnPropertyChanged(); - } - } + if (value == field) + return; - private BigInteger _hosts; - public BigInteger Hosts - { - get => _hosts; - set - { - if (value == _hosts) - return; - - _hosts = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion + } - #region Constructor, load settings - public SubnetCalculatorWideSubnetViewModel(IDialogCoordinator instance) - { - _dialogCoordinator = instance; + #endregion - // Set collection view - Subnet1HistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.SubnetCalculator_WideSubnet_Subnet1); - Subnet2HistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.SubnetCalculator_WideSubnet_Subnet2); - } - #endregion + #region ICommands & Actions - #region ICommands & Actions - public ICommand CalculateCommand => new RelayCommand(p => CalculateAction(), Calculate_CanExecute); + public ICommand CalculateCommand => new RelayCommand(_ => CalculateAction(), Calculate_CanExecute); - private bool Calculate_CanExecute(object paramter) => Application.Current.MainWindow != null && !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen; + private bool Calculate_CanExecute(object parameter) + { + return Application.Current.MainWindow != null && + !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && + !ConfigurationManager.Current.IsChildWindowOpen; + } - private void CalculateAction() - { - Calculate(); - } - #endregion + private void CalculateAction() + { + Calculate(); + } - #region Methods - private void Calculate() - { - IsCalculationRunning = true; + #endregion + + #region Methods - var subnet1 = IPNetwork.Parse(Subnet1); - var subnet2 = IPNetwork.Parse(Subnet2); + private void Calculate() + { + IsRunning = true; - var subnet = IPNetwork.WideSubnet(new [] {subnet1, subnet2}); //IPNetwork.WideSubnet(new[] { subnet1, subnet2 }); + var subnet1 = Subnet1.Trim(); + var subnet2 = Subnet2.Trim(); - NetworkAddress = subnet.Network; - Broadcast = subnet.Broadcast; - Subnetmask = subnet.Netmask; - CIDR = subnet.Cidr; - IPAddresses = subnet.Total; - FirstIPAddress = subnet.FirstUsable; - LastIPAddress = subnet.LastUsable; - Hosts = subnet.Usable; + var ipNetwork1 = IPNetwork2.Parse(subnet1); + var ipNetwork2 = IPNetwork2.Parse(subnet2); - IsResultVisible = true; + Result = new IPNetworkInfo(IPNetwork2.WideSubnet([ipNetwork1, ipNetwork2])); - AddSubnet1ToHistory(Subnet1); - AddSubnet2ToHistory(Subnet2); + IsResultVisible = true; - IsCalculationRunning = false; - } + AddSubnet1ToHistory(subnet1); + AddSubnet2ToHistory(subnet2); - private void AddSubnet1ToHistory(string subnet) - { - // Create the new list - var list = ListHelper.Modify(SettingsManager.Current.SubnetCalculator_WideSubnet_Subnet1.ToList(), subnet, SettingsManager.Current.General_HistoryListEntries); + IsRunning = false; + } - // Clear the old items - SettingsManager.Current.SubnetCalculator_WideSubnet_Subnet1.Clear(); - OnPropertyChanged(nameof(Subnet1)); // Raise property changed again, after the collection has been cleared + private void AddSubnet1ToHistory(string subnet) + { + // Create the new list + var list = ListHelper.Modify(SettingsManager.Current.SubnetCalculator_WideSubnet_Subnet1.ToList(), subnet, + SettingsManager.Current.General_HistoryListEntries); - // Fill with the new items - list.ForEach(x => SettingsManager.Current.SubnetCalculator_WideSubnet_Subnet1.Add(x)); - } + // Clear the old items + SettingsManager.Current.SubnetCalculator_WideSubnet_Subnet1.Clear(); + OnPropertyChanged(nameof(Subnet1)); // Raise property changed again, after the collection has been cleared - private void AddSubnet2ToHistory(string subnet) - { - // Create the new list - var list = ListHelper.Modify(SettingsManager.Current.SubnetCalculator_WideSubnet_Subnet2.ToList(), subnet, SettingsManager.Current.General_HistoryListEntries); + // Fill with the new items + list.ForEach(x => SettingsManager.Current.SubnetCalculator_WideSubnet_Subnet1.Add(x)); + } - // Clear the old items - SettingsManager.Current.SubnetCalculator_WideSubnet_Subnet2.Clear(); - OnPropertyChanged(nameof(Subnet2)); // Raise property changed again, after the collection has been cleared + private void AddSubnet2ToHistory(string subnet) + { + // Create the new list + var list = ListHelper.Modify(SettingsManager.Current.SubnetCalculator_WideSubnet_Subnet2.ToList(), subnet, + SettingsManager.Current.General_HistoryListEntries); - // Fill with the new items - list.ForEach(x => SettingsManager.Current.SubnetCalculator_WideSubnet_Subnet2.Add(x)); - } + // Clear the old items + SettingsManager.Current.SubnetCalculator_WideSubnet_Subnet2.Clear(); + OnPropertyChanged(nameof(Subnet2)); // Raise property changed again, after the collection has been cleared - public void OnShutdown() - { + // Fill with the new items + list.ForEach(x => SettingsManager.Current.SubnetCalculator_WideSubnet_Subnet2.Add(x)); + } - } - #endregion + public void OnShutdown() + { } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/TigerVNCConnectViewModel.cs b/Source/NETworkManager/ViewModels/TigerVNCConnectViewModel.cs index abbf3bf071..403d8000b2 100644 --- a/Source/NETworkManager/ViewModels/TigerVNCConnectViewModel.cs +++ b/Source/NETworkManager/ViewModels/TigerVNCConnectViewModel.cs @@ -1,67 +1,64 @@ -using NETworkManager.Settings; -using NETworkManager.Utilities; using System; using System.ComponentModel; -using System.Diagnostics; using System.Windows.Data; using System.Windows.Input; +using NETworkManager.Settings; +using NETworkManager.Utilities; + +namespace NETworkManager.ViewModels; -namespace NETworkManager.ViewModels +public class TigerVNCConnectViewModel : ViewModelBase { - public class TigerVNCConnectViewModel : ViewModelBase + public TigerVNCConnectViewModel(Action connectCommand, + Action cancelHandler, string host = null) { - public ICommand ConnectCommand { get; } - public ICommand CancelCommand { get; } + ConnectCommand = new RelayCommand(_ => connectCommand(this)); + CancelCommand = new RelayCommand(_ => cancelHandler(this)); - private string _host; - public string Host - { - get => _host; - set - { - if (value == _host) - return; + if (!string.IsNullOrEmpty(host)) + Host = host; - _host = value; - OnPropertyChanged(); - } - } - - public ICollectionView HostHistoryView { get; } + HostHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.TigerVNC_HostHistory); + PortHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.TigerVNC_PortHistory); - private int _port; - public int Port - { - get => _port; - set - { - if (value == _port) - return; + LoadSettings(); + } - _port = value; - OnPropertyChanged(); - } - } + public ICommand ConnectCommand { get; } + public ICommand CancelCommand { get; } - public ICollectionView PortHistoryView { get; } - - public TigerVNCConnectViewModel(Action connectCommand, Action cancelHandler, string host = null) + public string Host + { + get; + set { - ConnectCommand = new RelayCommand(p => connectCommand(this)); - CancelCommand = new RelayCommand(p => cancelHandler(this)); + if (value == field) + return; - if (!string.IsNullOrEmpty(host)) - Host = host; - - HostHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.TigerVNC_HostHistory); - PortHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.TigerVNC_PortHistory); - - LoadSettings(); + field = value; + OnPropertyChanged(); } + } + + public ICollectionView HostHistoryView { get; } - private void LoadSettings() + public int Port + { + get; + set { - Port = SettingsManager.Current.TigerVNC_Port; + if (value == field) + return; + + field = value; + OnPropertyChanged(); } } -} + + public ICollectionView PortHistoryView { get; } + + private void LoadSettings() + { + Port = SettingsManager.Current.TigerVNC_Port; + } +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/TigerVNCHostViewModel.cs b/Source/NETworkManager/ViewModels/TigerVNCHostViewModel.cs index 2e96760a32..e9f47e675d 100644 --- a/Source/NETworkManager/ViewModels/TigerVNCHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/TigerVNCHostViewModel.cs @@ -1,512 +1,290 @@ -using System.Collections.ObjectModel; -using NETworkManager.Controls; using Dragablz; -using System.Windows.Input; -using MahApps.Metro.Controls.Dialogs; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Models; +using NETworkManager.Models.EventSystem; +using NETworkManager.Models.TigerVNC; +using NETworkManager.Profiles; using NETworkManager.Settings; -using System.Linq; +using NETworkManager.Utilities; using NETworkManager.Views; -using System.ComponentModel; -using System.Windows.Data; using System; +using System.Collections.ObjectModel; +using System.ComponentModel; using System.Diagnostics; using System.IO; -using NETworkManager.Utilities; -using System.Windows; -using NETworkManager.Models.TigerVNC; -using NETworkManager.Profiles; -using System.Windows.Threading; -using NETworkManager.Models; -using NETworkManager.Models.EventSystem; +using System.Linq; using System.Threading.Tasks; -using System.Collections.Generic; - -namespace NETworkManager.ViewModels -{ - public class TigerVNCHostViewModel : ViewModelBase, IProfileManager - { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - private readonly DispatcherTimer _searchDispatcherTimer = new DispatcherTimer(); - - public IInterTabClient InterTabClient { get; } - public ObservableCollection TabItems { get; } - - private readonly bool _isLoading = true; - private bool _isViewActive = true; - - private bool _isConfigured; - public bool IsConfigured - { - get => _isConfigured; - set - { - if (value == _isConfigured) - return; - - _isConfigured = value; - OnPropertyChanged(); - } - } - - private int _selectedTabIndex; - public int SelectedTabIndex - { - get => _selectedTabIndex; - set - { - if (value == _selectedTabIndex) - return; - - _selectedTabIndex = value; - OnPropertyChanged(); - } - } - - #region Profiles - - public ICollectionView Profiles { get; } - - private ProfileInfo _selectedProfile = new ProfileInfo(); - public ProfileInfo SelectedProfile - { - get => _selectedProfile; - set - { - if (value == _selectedProfile) - return; - - _selectedProfile = value; - OnPropertyChanged(); - } - } - - private string _search; - public string Search - { - get => _search; - set - { - if (value == _search) - return; +using System.Windows; +using System.Windows.Input; +using TigerVNC = NETworkManager.Profiles.Application.TigerVNC; - _search = value; +namespace NETworkManager.ViewModels; - StartDelayedSearch(); +public class TigerVNCHostViewModel : ProfileHostViewModelBase +{ + #region Variables - OnPropertyChanged(); - } - } + public IInterTabClient InterTabClient { get; } - private bool _isSearching; - public bool IsSearching + public string InterTabPartition + { + get; + set { - get => _isSearching; - set - { - if (value == _isSearching) - return; + if (value == field) + return; - _isSearching = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _canProfileWidthChange = true; - private double _tempProfileWidth; + public ObservableCollection TabItems { get; } - private bool _expandProfileView; - public bool ExpandProfileView + public bool IsConfigured + { + get; + set { - get => _expandProfileView; - set - { - if (value == _expandProfileView) - return; - - if (!_isLoading) - SettingsManager.Current.TigerVNC_ExpandProfileView = value; - - _expandProfileView = value; - - if (_canProfileWidthChange) - ResizeProfile(false); + if (value == field) + return; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private GridLength _profileWidth; - public GridLength ProfileWidth + public int SelectedTabIndex + { + get; + set { - get => _profileWidth; - set - { - if (value == _profileWidth) - return; - - if (!_isLoading && Math.Abs(value.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > GlobalStaticConfiguration.FloatPointFix) // Do not save the size when collapsed - SettingsManager.Current.TigerVNC_ProfileWidth = value.Value; - - _profileWidth = value; - - if (_canProfileWidthChange) - ResizeProfile(true); + if (value == field) + return; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion - #endregion - - #region Constructor, load settings - public TigerVNCHostViewModel(IDialogCoordinator instance) - { - _dialogCoordinator = instance; - - // Check if putty is available... - CheckIfConfigured(); - - InterTabClient = new DragablzInterTabClient(ApplicationName.TigerVNC); - - TabItems = new ObservableCollection(); - - Profiles = new CollectionViewSource { Source = ProfileManager.Groups.SelectMany(x => x.Profiles) }.View; - Profiles.GroupDescriptions.Add(new PropertyGroupDescription(nameof(ProfileInfo.Group))); - Profiles.SortDescriptions.Add(new SortDescription(nameof(ProfileInfo.Group), ListSortDirection.Ascending)); - Profiles.SortDescriptions.Add(new SortDescription(nameof(ProfileInfo.Name), ListSortDirection.Ascending)); - Profiles.Filter = o => - { - if (!(o is ProfileInfo info)) - return false; - - if (string.IsNullOrEmpty(Search)) - return info.TigerVNC_Enabled; - - var search = Search.Trim(); - - // Search by: Tag=xxx (exact match, ignore case) - /* - if (search.StartsWith(ProfileManager.TagIdentifier, StringComparison.OrdinalIgnoreCase)) - return !string.IsNullOrEmpty(info.Tags) && info.TigerVNC_Enabled && info.Tags.Replace(" ", "").Split(';').Any(str => search.Substring(ProfileManager.TagIdentifier.Length, search.Length - ProfileManager.TagIdentifier.Length).Equals(str, StringComparison.OrdinalIgnoreCase)); - */ - - // Search by: Name, TigerVNC_Host - return info.TigerVNC_Enabled && (info.Name.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1 || info.TigerVNC_Host.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1); - }; + } - // This will select the first entry as selected item... - SelectedProfile = Profiles.SourceCollection.Cast().Where(x => x.TigerVNC_Enabled).OrderBy(x => x.Group).ThenBy(x => x.Name).FirstOrDefault(); + #endregion - ProfileManager.OnProfilesUpdated += ProfileManager_OnProfilesUpdated; + #region Constructor, load settings - _searchDispatcherTimer.Interval = GlobalStaticConfiguration.SearchDispatcherTimerTimeSpan; - _searchDispatcherTimer.Tick += SearchDispatcherTimer_Tick; + public TigerVNCHostViewModel() + { + CheckSettings(); - LoadSettings(); + InterTabClient = new DragablzInterTabClient(ApplicationName.TigerVNC); + InterTabPartition = nameof(ApplicationName.TigerVNC); - SettingsManager.Current.PropertyChanged += Current_PropertyChanged; + TabItems = []; - _isLoading = false; - } - - private void Current_PropertyChanged(object sender, PropertyChangedEventArgs e) - { - if (e.PropertyName == nameof(SettingsInfo.TigerVNC_ApplicationFilePath)) - CheckIfConfigured(); - } + InitializeProfileHost(); - private void LoadSettings() - { - ExpandProfileView = SettingsManager.Current.TigerVNC_ExpandProfileView; + SettingsManager.Current.PropertyChanged += SettingsManager_PropertyChanged; + } - ProfileWidth = ExpandProfileView ? new GridLength(SettingsManager.Current.TigerVNC_ProfileWidth) : new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); + #endregion - _tempProfileWidth = SettingsManager.Current.TigerVNC_ProfileWidth; - } - #endregion + #region Profile host - #region ICommand & Actions - public ItemActionCallback CloseItemCommand => CloseItemAction; + protected override ApplicationName ApplicationName => ApplicationName.TigerVNC; - private void CloseItemAction(ItemActionCallbackArgs args) - { - ((args.DragablzItem.Content as DragablzTabItem)?.View as TigerVNCControl)?.CloseTab(); - } + protected override bool IsProfileEnabled(ProfileInfo profile) => profile.TigerVNC_Enabled; - public ICommand TigerVNC_ReconnectCommand => new RelayCommand(TigerVNC_ReconnectAction); + protected override string GetSearchableField(ProfileInfo profile) => profile.TigerVNC_Host; - private void TigerVNC_ReconnectAction(object view) - { - if (view is TigerVNCControl control) - { - if (control.ReconnectCommand.CanExecute(null)) - control.ReconnectCommand.Execute(null); - } - } - - public ICommand ConnectCommand => new RelayCommand(p => ConnectAction(), Connect_CanExecute); + public override void OnProfileManagerDialogOpen() + { + ConfigurationManager.OnDialogOpen(); + } - private bool Connect_CanExecute(object obj) => IsConfigured; + public override void OnProfileManagerDialogClose() + { + ConfigurationManager.OnDialogClose(); + } - private void ConnectAction() - { - Connect(); - } + #endregion - public ICommand ConnectProfileCommand => new RelayCommand(p => ConnectProfileAction(), ConnectProfile_CanExecute); + #region ICommand & Actions - private bool ConnectProfile_CanExecute(object obj) - { - return !IsSearching && SelectedProfile != null; - } + public ItemActionCallback CloseItemCommand => CloseItemAction; - private void ConnectProfileAction() - { - ConnectProfile(); - } + private void CloseItemAction(ItemActionCallbackArgs args) + { + ((args.DragablzItem.Content as DragablzTabItem)?.View as IDragablzTabItem)?.CloseTab(); + } - public ICommand ConnectProfileExternalCommand => new RelayCommand(p => ConnectProfileExternalAction()); + private bool Connect_CanExecute(object obj) + { + return IsConfigured; + } - private void ConnectProfileExternalAction() - { - ConnectProfileExternal(); - } + public ICommand ConnectCommand => new RelayCommand(_ => ConnectAction(), Connect_CanExecute); - public ICommand AddProfileCommand => new RelayCommand(p => AddProfileAction()); + private void ConnectAction() + { + _ = Connect(); + } - private void AddProfileAction() - { - ProfileDialogManager.ShowAddProfileDialog(this, _dialogCoordinator); - } + public ICommand ReconnectCommand => new RelayCommand(ReconnectAction); - public ICommand EditProfileCommand => new RelayCommand(p => EditProfileAction()); + private void ReconnectAction(object view) + { + if (view is not TigerVNCControl control) + return; - private void EditProfileAction() - { - ProfileDialogManager.ShowEditProfileDialog(this, _dialogCoordinator, SelectedProfile); - } + if (control.ReconnectCommand.CanExecute(null)) + control.ReconnectCommand.Execute(null); + } - public ICommand CopyAsProfileCommand => new RelayCommand(p => CopyAsProfileAction()); + public ICommand ConnectProfileCommand => new RelayCommand(_ => ConnectProfileAction(), ConnectProfile_CanExecute); - private void CopyAsProfileAction() - { - ProfileDialogManager.ShowCopyAsProfileDialog(this, _dialogCoordinator, SelectedProfile); - } + private bool ConnectProfile_CanExecute(object obj) + { + return !IsSearching && SelectedProfile != null; + } - public ICommand DeleteProfileCommand => new RelayCommand(p => DeleteProfileAction()); + private void ConnectProfileAction() + { + ConnectProfile(); + } - private void DeleteProfileAction() - { - ProfileDialogManager.ShowDeleteProfileDialog(this, _dialogCoordinator, new List { SelectedProfile }); - } + public ICommand ConnectProfileExternalCommand => new RelayCommand(_ => ConnectProfileExternalAction()); - public ICommand EditGroupCommand => new RelayCommand(EditGroupAction); + private void ConnectProfileExternalAction() + { + ConnectProfileExternal(); + } - private void EditGroupAction(object group) - { - ProfileDialogManager.ShowEditGroupDialog(this, _dialogCoordinator, ProfileManager.GetGroup(group.ToString())); - } + public ICommand OpenSettingsCommand => new RelayCommand(_ => OpenSettingsAction()); - public ICommand ClearSearchCommand => new RelayCommand(p => ClearSearchAction()); + private static void OpenSettingsAction() + { + EventSystem.RedirectToSettings(); + } - private void ClearSearchAction() - { - Search = string.Empty; - } + #endregion - public ICommand OpenSettingsCommand => new RelayCommand(p => OpenSettingsAction()); + #region Methods - private static void OpenSettingsAction() - { - EventSystem.RedirectToSettings(); - } - #endregion + private void CheckSettings() + { + IsConfigured = !string.IsNullOrEmpty(SettingsManager.Current.TigerVNC_ApplicationFilePath) && + File.Exists(SettingsManager.Current.TigerVNC_ApplicationFilePath); + } - #region Methods - private void CheckIfConfigured() - { - IsConfigured = !string.IsNullOrEmpty(SettingsManager.Current.TigerVNC_ApplicationFilePath) && File.Exists(SettingsManager.Current.TigerVNC_ApplicationFilePath); - } + private Task Connect(string host = null) + { + var childWindow = new TigerVNCConnectChildWindow(); - private async Task Connect(string host = null) + var childWindowViewModel = new TigerVNCConnectViewModel(async instance => { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.Connect - }; - - var connectViewModel = new TigerVNCConnectViewModel(async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - ConfigurationManager.Current.FixAirspace = false; - - // Create profile info - var info = new TigerVNCSessionInfo - { - Host = instance.Host, - Port = instance.Port - }; - - // Add to history - // Note: The history can only be updated after the values have been read. - // Otherwise, in some cases, incorrect values are taken over. - AddHostToHistory(instance.Host); - AddPortToHistory(instance.Port); - - // Connect - Connect(info); - }, async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - ConfigurationManager.Current.FixAirspace = false; - }, host); - - customDialog.Content = new TigerVNCConnectDialog - { - DataContext = connectViewModel - }; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - ConfigurationManager.Current.FixAirspace = true; - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } - - private void ConnectProfile() - { - Connect(NETworkManager.Profiles.Application.TigerVNC.CreateSessionInfo(SelectedProfile), SelectedProfile.Name); - } + ConfigurationManager.OnDialogClose(); - private void ConnectProfileExternal() - { - var info = new ProcessStartInfo + // Create profile info + var sessionInfo = new TigerVNCSessionInfo { - FileName = SettingsManager.Current.TigerVNC_ApplicationFilePath, - Arguments = TigerVNC.BuildCommandLine(NETworkManager.Profiles.Application.TigerVNC.CreateSessionInfo(SelectedProfile)) + Host = instance.Host, + Port = instance.Port }; - Process.Start(info); - } + // Add to history + // Note: The history can only be updated after the values have been read. + // Otherwise, in some cases, incorrect values are taken over. + AddHostToHistory(instance.Host); + AddPortToHistory(instance.Port); - private void Connect(TigerVNCSessionInfo sessionInfo, string header = null) + // Connect + Connect(sessionInfo); + }, async _ => { - sessionInfo.ApplicationFilePath = SettingsManager.Current.TigerVNC_ApplicationFilePath; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - TabItems.Add(new DragablzTabItem(header ?? sessionInfo.Host, new TigerVNCControl(sessionInfo))); + ConfigurationManager.OnDialogClose(); + }, host); - SelectedTabIndex = TabItems.Count - 1; - } - public void AddTab(string host) - { - Connect(host); - } + childWindow.Title = Strings.Connect; - // Modify history list - private static void AddHostToHistory(string host) - { - if (string.IsNullOrEmpty(host)) - return; + childWindow.DataContext = childWindowViewModel; - SettingsManager.Current.TigerVNC_HostHistory = new ObservableCollection(ListHelper.Modify(SettingsManager.Current.TigerVNC_HostHistory.ToList(), host, SettingsManager.Current.General_HistoryListEntries)); - } + ConfigurationManager.Current.IsChildWindowOpen = true; - private static void AddPortToHistory(int port) - { - if (port == 0) - return; + ConfigurationManager.OnDialogOpen(); - SettingsManager.Current.TigerVNC_PortHistory = new ObservableCollection(ListHelper.Modify(SettingsManager.Current.TigerVNC_PortHistory.ToList(), port, SettingsManager.Current.General_HistoryListEntries)); - } + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } - private void StartDelayedSearch() - { - if (!IsSearching) - { - IsSearching = true; + private void ConnectProfile() + { + Connect(TigerVNC.CreateSessionInfo(SelectedProfile), SelectedProfile.Name); + } - _searchDispatcherTimer.Start(); - } - else - { - _searchDispatcherTimer.Stop(); - _searchDispatcherTimer.Start(); - } - } + private void ConnectProfileExternal() + { + var sessionInfo = TigerVNC.CreateSessionInfo(SelectedProfile); - private void StopDelayedSearch() + Process.Start(new ProcessStartInfo { - _searchDispatcherTimer.Stop(); - - RefreshProfiles(); + FileName = SettingsManager.Current.TigerVNC_ApplicationFilePath, + Arguments = Models.TigerVNC.TigerVNC.BuildCommandLine(sessionInfo) + }); + } - IsSearching = false; - } + private void Connect(TigerVNCSessionInfo sessionInfo, string header = null) + { + sessionInfo.ApplicationFilePath = SettingsManager.Current.TigerVNC_ApplicationFilePath; - private void ResizeProfile(bool dueToChangedSize) - { - _canProfileWidthChange = false; + var tabId = Guid.NewGuid(); - if (dueToChangedSize) - { - ExpandProfileView = Math.Abs(ProfileWidth.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > GlobalStaticConfiguration.FloatPointFix; - } - else - { - if (ExpandProfileView) - { - ProfileWidth = Math.Abs(_tempProfileWidth - GlobalStaticConfiguration.Profile_WidthCollapsed) < GlobalStaticConfiguration.FloatPointFix ? new GridLength(GlobalStaticConfiguration.Profile_DefaultWidthExpanded) : new GridLength(_tempProfileWidth); - } - else - { - _tempProfileWidth = ProfileWidth.Value; - ProfileWidth = new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); - } - } - - _canProfileWidthChange = true; - } + TabItems.Add(new DragablzTabItem(header ?? sessionInfo.Host, new TigerVNCControl(tabId, sessionInfo), tabId)); - public void OnViewVisible() - { - _isViewActive = true; + SelectedTabIndex = TabItems.Count - 1; + } - RefreshProfiles(); - } + public void AddTab(string host) + { + _ = Connect(host); + } - public void OnViewHide() - { - _isViewActive = false; - } + // Modify history list + private static void AddHostToHistory(string host) + { + if (string.IsNullOrEmpty(host)) + return; - public void RefreshProfiles() - { - if (!_isViewActive) - return; + SettingsManager.Current.TigerVNC_HostHistory = new ObservableCollection( + ListHelper.Modify(SettingsManager.Current.TigerVNC_HostHistory.ToList(), host, + SettingsManager.Current.General_HistoryListEntries)); + } - Profiles.Refresh(); - } + private static void AddPortToHistory(int port) + { + if (port == 0) + return; - public void OnProfileDialogOpen() - { - ConfigurationManager.Current.FixAirspace = true; - } + SettingsManager.Current.TigerVNC_PortHistory = new ObservableCollection( + ListHelper.Modify(SettingsManager.Current.TigerVNC_PortHistory.ToList(), port, + SettingsManager.Current.General_HistoryListEntries)); + } - public void OnProfileDialogClose() - { - ConfigurationManager.Current.FixAirspace = false; - } - #endregion + #endregion - #region Event - private void ProfileManager_OnProfilesUpdated(object sender, EventArgs e) - { - RefreshProfiles(); - } + #region Event - private void SearchDispatcherTimer_Tick(object sender, EventArgs e) - { - StopDelayedSearch(); - } - #endregion + private void SettingsManager_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + if (e.PropertyName == nameof(SettingsInfo.TigerVNC_ApplicationFilePath)) + CheckSettings(); } -} \ No newline at end of file + + #endregion +} diff --git a/Source/NETworkManager/ViewModels/TigerVNCSettingsViewModel.cs b/Source/NETworkManager/ViewModels/TigerVNCSettingsViewModel.cs index 92a7000111..a63bc81e6d 100644 --- a/Source/NETworkManager/ViewModels/TigerVNCSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/TigerVNCSettingsViewModel.cs @@ -1,138 +1,134 @@ -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.Settings; -using NETworkManager.Settings; -using NETworkManager.Utilities; -using System; +using System; using System.Diagnostics; using System.IO; using System.Threading.Tasks; +using System.Windows.Forms; using System.Windows.Input; +using NETworkManager.Localization.Resources; +using NETworkManager.Settings; +using NETworkManager.Utilities; + +namespace NETworkManager.ViewModels; -namespace NETworkManager.ViewModels +public class TigerVNCSettingsViewModel : ViewModelBase { - public class TigerVNCSettingsViewModel : ViewModelBase - { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - - private readonly bool _isLoading; + #region Variables + + private readonly bool _isLoading; - private string _applicationFilePath; - public string ApplicationFilePath + public string ApplicationFilePath + { + get; + set { - get => _applicationFilePath; - set - { - if (value == _applicationFilePath) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.TigerVNC_ApplicationFilePath = value; + if (!_isLoading) + SettingsManager.Current.TigerVNC_ApplicationFilePath = value; - IsConfigured = !string.IsNullOrEmpty(value); + IsConfigured = !string.IsNullOrEmpty(value); - _applicationFilePath = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isConfigured; - public bool IsConfigured + public bool IsConfigured + { + get; + set { - get => _isConfigured; - set - { - if (value == _isConfigured) - return; - - _isConfigured = value; - OnPropertyChanged(); - } + if (value == field) + return; + + field = value; + OnPropertyChanged(); } - - private int _port; - public int Port + } + + public int Port + { + get; + set { - get => _port; - set - { - if (value == _port) - return; - - if (!_isLoading) - SettingsManager.Current.TigerVNC_Port = value; - - _port = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.TigerVNC_Port = value; + + field = value; + OnPropertyChanged(); } - #endregion + } - #region Contructor, load settings - public TigerVNCSettingsViewModel(IDialogCoordinator instance) - { - _isLoading = true; + #endregion - _dialogCoordinator = instance; + #region Contructor, load settings - LoadSettings(); + public TigerVNCSettingsViewModel() + { + _isLoading = true; - _isLoading = false; - } + LoadSettings(); - private void LoadSettings() - { - ApplicationFilePath = SettingsManager.Current.TigerVNC_ApplicationFilePath; - IsConfigured = File.Exists(ApplicationFilePath); - Port = SettingsManager.Current.TigerVNC_Port; - } - #endregion + _isLoading = false; + } + + private void LoadSettings() + { + ApplicationFilePath = SettingsManager.Current.TigerVNC_ApplicationFilePath; + IsConfigured = File.Exists(ApplicationFilePath); + Port = SettingsManager.Current.TigerVNC_Port; + } + + #endregion - #region ICommands & Actions - public ICommand BrowseFileCommand => new RelayCommand(p => BrowseFileAction()); + #region ICommands & Actions - private void BrowseFileAction() + public ICommand BrowseFileCommand => new RelayCommand(_ => BrowseFileAction()); + + private void BrowseFileAction() + { + var openFileDialog = new OpenFileDialog { - var openFileDialog = new System.Windows.Forms.OpenFileDialog - { - Filter = GlobalStaticConfiguration.ApplicationFileExtensionFilter - }; + Filter = GlobalStaticConfiguration.ApplicationFileExtensionFilter + }; - if (openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) - ApplicationFilePath = openFileDialog.FileName; - } + if (openFileDialog.ShowDialog() == DialogResult.OK) + ApplicationFilePath = openFileDialog.FileName; + } + + public ICommand ConfigureCommand => new RelayCommand(_ => ConfigureAction()); - public ICommand ConfigureCommand => new RelayCommand(p => ConfigureAction()); + private void ConfigureAction() + { + _ = Configure(); + } + + #endregion - private void ConfigureAction() + #region Methods + + private async Task Configure() + { + try { - Configure(); + Process.Start(SettingsManager.Current.TigerVNC_ApplicationFilePath); } - #endregion - - #region Methods - private async Task Configure() + catch (Exception ex) { - try - { - Process.Start(SettingsManager.Current.TigerVNC_ApplicationFilePath); - } - catch (Exception ex) - { - var settings = AppearanceManager.MetroDialog; - - settings.AffirmativeButtonText = Localization.Resources.Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Error, ex.Message, MessageDialogStyle.Affirmative, settings); - } + await DialogHelper.ShowMessageAsync(System.Windows.Application.Current.MainWindow, Strings.Error, ex.Message, ChildWindowIcon.Error); } + } - public void SetFilePathFromDragDrop(string filePath) - { - ApplicationFilePath = filePath; + public void SetFilePathFromDragDrop(string filePath) + { + ApplicationFilePath = filePath; - OnPropertyChanged(nameof(ApplicationFilePath)); - } - #endregion + OnPropertyChanged(nameof(ApplicationFilePath)); } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/TracerouteHostViewModel.cs b/Source/NETworkManager/ViewModels/TracerouteHostViewModel.cs index 254035349f..40407b6d5f 100644 --- a/Source/NETworkManager/ViewModels/TracerouteHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/TracerouteHostViewModel.cs @@ -1,379 +1,127 @@ -using System.Collections.ObjectModel; -using NETworkManager.Controls; using Dragablz; -using System.Windows.Input; -using NETworkManager.Views; +using NETworkManager.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Models; +using NETworkManager.Profiles; using NETworkManager.Utilities; -using NETworkManager.Settings; -using System.ComponentModel; +using NETworkManager.Views; using System; -using System.Windows.Data; -using System.Linq; -using MahApps.Metro.Controls.Dialogs; -using System.Windows; -using NETworkManager.Profiles; -using System.Windows.Threading; -using NETworkManager.Models; -using System.Collections.Generic; - -namespace NETworkManager.ViewModels -{ - public class TracerouteHostViewModel : ViewModelBase, IProfileManager - { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - private readonly DispatcherTimer _searchDispatcherTimer = new DispatcherTimer(); - - public IInterTabClient InterTabClient { get; } - public ObservableCollection TabItems { get; } - - private readonly bool _isLoading = true; - private bool _isViewActive = true; - - private int _tabId; - - private int _selectedTabIndex; - public int SelectedTabIndex - { - get => _selectedTabIndex; - set - { - if (value == _selectedTabIndex) - return; - - _selectedTabIndex = value; - OnPropertyChanged(); - } - } - - #region Profiles - public ICollectionView Profiles { get; } - - private ProfileInfo _selectedProfile = new ProfileInfo(); - public ProfileInfo SelectedProfile - { - get => _selectedProfile; - set - { - if (value == _selectedProfile) - return; - - _selectedProfile = value; - OnPropertyChanged(); - } - } - - private string _search; - public string Search - { - get => _search; - set - { - if (value == _search) - return; - - _search = value; - - StartDelayedSearch(); - - OnPropertyChanged(); - } - } - - private bool _isSearching; - public bool IsSearching - { - get => _isSearching; - set - { - if (value == _isSearching) - return; - - _isSearching = value; - OnPropertyChanged(); - } - } - - private bool _canProfileWidthChange = true; - private double _tempProfileWidth; - - private bool _expandProfileView; - public bool ExpandProfileView - { - get => _expandProfileView; - set - { - if (value == _expandProfileView) - return; - - if (!_isLoading) - SettingsManager.Current.Traceroute_ExpandProfileView = value; - - _expandProfileView = value; - - if (_canProfileWidthChange) - ResizeProfile(false); - - OnPropertyChanged(); - } - } - - private GridLength _profileWidth; - public GridLength ProfileWidth - { - get => _profileWidth; - set - { - if (value == _profileWidth) - return; - - if (!_isLoading && Math.Abs(value.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > GlobalStaticConfiguration.FloatPointFix) // Do not save the size when collapsed - SettingsManager.Current.Traceroute_ProfileWidth = value.Value; - - _profileWidth = value; - - if (_canProfileWidthChange) - ResizeProfile(true); - - OnPropertyChanged(); - } - } - #endregion - #endregion - - #region Constructor, load settings - public TracerouteHostViewModel(IDialogCoordinator instance) - { - _dialogCoordinator = instance; - - InterTabClient = new DragablzInterTabClient(ApplicationName.Traceroute); - - TabItems = new ObservableCollection - { - new DragablzTabItem(Localization.Resources.Strings.NewTab, new TracerouteView(_tabId), _tabId) - }; - - Profiles = new CollectionViewSource { Source = ProfileManager.Groups.SelectMany(x => x.Profiles) }.View; - Profiles.GroupDescriptions.Add(new PropertyGroupDescription(nameof(ProfileInfo.Group))); - Profiles.SortDescriptions.Add(new SortDescription(nameof(ProfileInfo.Group), ListSortDirection.Ascending)); - Profiles.SortDescriptions.Add(new SortDescription(nameof(ProfileInfo.Name), ListSortDirection.Ascending)); - Profiles.Filter = o => - { - if (!(o is ProfileInfo info)) - return false; - - if (string.IsNullOrEmpty(Search)) - return info.Traceroute_Enabled; - - var search = Search.Trim(); - - // Search by: Tag=xxx (exact match, ignore case) - /* - if (search.StartsWith(ProfileManager.TagIdentifier, StringComparison.OrdinalIgnoreCase)) - return !string.IsNullOrEmpty(info.Tags) && info.Traceroute_Enabled && info.Tags.Replace(" ", "").Split(';').Any(str => search.Substring(ProfileManager.TagIdentifier.Length, search.Length - ProfileManager.TagIdentifier.Length).Equals(str, StringComparison.OrdinalIgnoreCase)); - */ - - // Search by: Name, Traceroute_Host - return info.Traceroute_Enabled && (info.Name.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1 || info.Traceroute_Host.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1); - }; - - // This will select the first entry as selected item... - SelectedProfile = Profiles.SourceCollection.Cast().Where(x => x.Traceroute_Enabled).OrderBy(x => x.Group).ThenBy(x => x.Name).FirstOrDefault(); - - ProfileManager.OnProfilesUpdated += ProfileManager_OnProfilesUpdated; - - _searchDispatcherTimer.Interval = GlobalStaticConfiguration.SearchDispatcherTimerTimeSpan; - _searchDispatcherTimer.Tick += SearchDispatcherTimer_Tick; - - LoadSettings(); - - _isLoading = false; - } - - private void LoadSettings() - { - ExpandProfileView = SettingsManager.Current.Traceroute_ExpandProfileView; - - ProfileWidth = ExpandProfileView ? new GridLength(SettingsManager.Current.Traceroute_ProfileWidth) : new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); - - _tempProfileWidth = SettingsManager.Current.Traceroute_ProfileWidth; - } - #endregion - - #region ICommand & Actions - public ICommand AddTabCommand => new RelayCommand(p => AddTabAction()); - - private void AddTabAction() - { - AddTab(); - } +using System.Collections.ObjectModel; +using System.Windows.Input; - public ICommand TraceProfileCommand => new RelayCommand(p => TraceProfileAction(), TraceProfile_CanExecute); +namespace NETworkManager.ViewModels; - private bool TraceProfile_CanExecute(object obj) - { - return !IsSearching && SelectedProfile != null; - } - - private void TraceProfileAction() - { - AddTab(SelectedProfile); - } +public class TracerouteHostViewModel : ProfileHostViewModelBase +{ + #region Variables - public ICommand AddProfileCommand => new RelayCommand(p => AddProfileAction()); + public IInterTabClient InterTabClient { get; } - private void AddProfileAction() + public string InterTabPartition + { + get; + set { - ProfileDialogManager.ShowAddProfileDialog(this, _dialogCoordinator); - } - - public ICommand EditProfileCommand => new RelayCommand(p => EditProfileAction()); + if (value == field) + return; - private void EditProfileAction() - { - ProfileDialogManager.ShowEditProfileDialog(this, _dialogCoordinator, SelectedProfile); + field = value; + OnPropertyChanged(); } + } - public ICommand CopyAsProfileCommand => new RelayCommand(p => CopyAsProfileAction()); + public ObservableCollection TabItems { get; } - private void CopyAsProfileAction() + public int SelectedTabIndex + { + get; + set { - ProfileDialogManager.ShowCopyAsProfileDialog(this, _dialogCoordinator, SelectedProfile); - } - - public ICommand DeleteProfileCommand => new RelayCommand(p => DeleteProfileAction()); + if (value == field) + return; - private void DeleteProfileAction() - { - ProfileDialogManager.ShowDeleteProfileDialog(this, _dialogCoordinator, new List { SelectedProfile }); + field = value; + OnPropertyChanged(); } + } - public ICommand EditGroupCommand => new RelayCommand(EditGroupAction); + #endregion - private void EditGroupAction(object group) - { - ProfileDialogManager.ShowEditGroupDialog(this, _dialogCoordinator, ProfileManager.GetGroup(group.ToString())); - } + #region Constructor - public ICommand ClearSearchCommand => new RelayCommand(p => ClearSearchAction()); + public TracerouteHostViewModel() + { + InterTabClient = new DragablzInterTabClient(ApplicationName.Traceroute); + InterTabPartition = nameof(ApplicationName.Traceroute); - private void ClearSearchAction() - { - Search = string.Empty; - } + var tabId = Guid.NewGuid(); - public ItemActionCallback CloseItemCommand => CloseItemAction; + TabItems = + [ + new DragablzTabItem(Strings.NewTab, new TracerouteView(tabId), tabId) + ]; - public void CloseItemAction(ItemActionCallbackArgs args) - { - ((args.DragablzItem.Content as DragablzTabItem)?.View as TracerouteView)?.CloseTab(); - } - #endregion + InitializeProfileHost(); + } - #region Methods - private void StartDelayedSearch() - { - if (!IsSearching) - { - IsSearching = true; - - _searchDispatcherTimer.Start(); - } - else - { - _searchDispatcherTimer.Stop(); - _searchDispatcherTimer.Start(); - } - } + #endregion - private void StopDelayedSearch() - { - _searchDispatcherTimer.Stop(); + #region Profile host - RefreshProfiles(); + protected override ApplicationName ApplicationName => ApplicationName.Traceroute; - IsSearching = false; - } + protected override bool IsProfileEnabled(ProfileInfo profile) => profile.Traceroute_Enabled; - private void ResizeProfile(bool dueToChangedSize) - { - _canProfileWidthChange = false; - - if (dueToChangedSize) - { - ExpandProfileView = Math.Abs(ProfileWidth.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > GlobalStaticConfiguration.FloatPointFix; - } - else - { - if (ExpandProfileView) - { - ProfileWidth = Math.Abs(_tempProfileWidth - GlobalStaticConfiguration.Profile_WidthCollapsed) < GlobalStaticConfiguration.FloatPointFix ? new GridLength(GlobalStaticConfiguration.Profile_DefaultWidthExpanded) : new GridLength(_tempProfileWidth); - } - else - { - _tempProfileWidth = ProfileWidth.Value; - ProfileWidth = new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); - } - } - - _canProfileWidthChange = true; - } + protected override string GetSearchableField(ProfileInfo profile) => profile.Traceroute_Host; - public void AddTab(string host = null) - { - _tabId++; + #endregion - TabItems.Add(new DragablzTabItem(host ?? Localization.Resources.Strings.NewTab, new TracerouteView(_tabId, host), _tabId)); + #region ICommand & Actions - SelectedTabIndex = TabItems.Count - 1; - } + public ICommand AddTabCommand => new RelayCommand(_ => AddTabAction()); - public void AddTab(ProfileInfo profile) - { - AddTab(profile.Traceroute_Host); - } + private void AddTabAction() + { + AddTab(); + } - public void OnViewVisible() - { - _isViewActive = true; + public ICommand TraceProfileCommand => new RelayCommand(_ => TraceProfileAction(), TraceProfile_CanExecute); - RefreshProfiles(); - } + private bool TraceProfile_CanExecute(object obj) + { + return !IsSearching && SelectedProfile != null; + } - public void OnViewHide() - { - _isViewActive = false; - } + private void TraceProfileAction() + { + AddTab(SelectedProfile); + } - public void RefreshProfiles() - { - if (!_isViewActive) - return; + public ItemActionCallback CloseItemCommand => CloseItemAction; - Profiles.Refresh(); - } + private void CloseItemAction(ItemActionCallbackArgs args) + { + ((args.DragablzItem.Content as DragablzTabItem)?.View as IDragablzTabItem)?.CloseTab(); + } - public void OnProfileDialogOpen() - { + #endregion - } + #region Methods - public void OnProfileDialogClose() - { + public void AddTab(string host = null) + { + var tabId = Guid.NewGuid(); - } - #endregion + TabItems.Add(new DragablzTabItem(host ?? Strings.NewTab, new TracerouteView(tabId, host), + tabId)); - #region Event - private void ProfileManager_OnProfilesUpdated(object sender, EventArgs e) - { - RefreshProfiles(); - } + SelectedTabIndex = TabItems.Count - 1; + } - private void SearchDispatcherTimer_Tick(object sender, EventArgs e) - { - StopDelayedSearch(); - } - #endregion + public void AddTab(ProfileInfo profile) + { + AddTab(profile.Traceroute_Host); } -} \ No newline at end of file + + #endregion +} diff --git a/Source/NETworkManager/ViewModels/TracerouteSettingsViewModel.cs b/Source/NETworkManager/ViewModels/TracerouteSettingsViewModel.cs index 73316fc4d8..a54947df17 100644 --- a/Source/NETworkManager/ViewModels/TracerouteSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/TracerouteSettingsViewModel.cs @@ -1,135 +1,131 @@ -using NETworkManager.Settings; +using NETworkManager.Settings; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +public class TracerouteSettingsViewModel : ViewModelBase { - public class TracerouteSettingsViewModel : ViewModelBase - { - #region Variables - private readonly bool _isLoading; + #region Variables - private int _maximumHops; - public int MaximumHops - { - get => _maximumHops; - set - { - if (value == _maximumHops) - return; - - if (!_isLoading) - SettingsManager.Current.Traceroute_MaximumHops = value; - - _maximumHops = value; - OnPropertyChanged(); - } - } + private readonly bool _isLoading; - private int _timeout; - public int Timeout + public int MaximumHops + { + get; + set { - get => _timeout; - set - { - if (value == _timeout) - return; - - if (!_isLoading) - SettingsManager.Current.Traceroute_Timeout = value; - - _timeout = value; - OnPropertyChanged(); - } - } + if (value == field) + return; - private int _buffer; - public int Buffer - { - get => _buffer; - set - { - if (value == _buffer) - return; - - if (!_isLoading) - SettingsManager.Current.Traceroute_Buffer = value; - - _buffer = value; - OnPropertyChanged(); - } + if (!_isLoading) + SettingsManager.Current.Traceroute_MaximumHops = value; + + field = value; + OnPropertyChanged(); } + } - private bool _resolveHostname; - public bool ResolveHostname + public int Timeout + { + get; + set { - get => _resolveHostname; - set - { - if (value == _resolveHostname) - return; - - if (!_isLoading) - SettingsManager.Current.Traceroute_ResolveHostname = value; - - _resolveHostname = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.Traceroute_Timeout = value; + + field = value; + OnPropertyChanged(); } + } - private bool _resolveHostnamePreferIPv4; - public bool ResolveHostnamePreferIPv4 + public int Buffer + { + get; + set { - get => _resolveHostnamePreferIPv4; - set - { - if (value == _resolveHostnamePreferIPv4) - return; - - if (!_isLoading) - SettingsManager.Current.Traceroute_ResolveHostnamePreferIPv4 = value; - - _resolveHostnamePreferIPv4 = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.Traceroute_Buffer = value; + + field = value; + OnPropertyChanged(); } + } - private bool _resolveHostnamePreferIPv6; - public bool ResolveHostnamePreferIPv6 + public bool ResolveHostname + { + get; + set { - get => _resolveHostnamePreferIPv6; - set - { - if (value == _resolveHostnamePreferIPv6) - return; - - _resolveHostnamePreferIPv6 = value; - OnPropertyChanged(); - } + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.Traceroute_ResolveHostname = value; + + field = value; + OnPropertyChanged(); } - #endregion + } - #region Constructor, load settings - public TracerouteSettingsViewModel() + public bool CheckIPApiIPGeolocation + { + get; + set { - _isLoading = true; + if (value == field) + return; - LoadSettings(); + if (!_isLoading) + SettingsManager.Current.Traceroute_CheckIPApiIPGeolocation = value; - _isLoading = false; + field = value; + OnPropertyChanged(); } + } - private void LoadSettings() + public bool ShowMap + { + get; + set { - MaximumHops = SettingsManager.Current.Traceroute_MaximumHops; - Timeout = SettingsManager.Current.Traceroute_Timeout; - Buffer = SettingsManager.Current.Traceroute_Buffer; - ResolveHostname = SettingsManager.Current.Traceroute_ResolveHostname; + if (value == field) + return; - if (SettingsManager.Current.Traceroute_ResolveHostnamePreferIPv4) - ResolveHostnamePreferIPv4 = true; - else - ResolveHostnamePreferIPv6 = true; + if (!_isLoading) + SettingsManager.Current.Traceroute_ShowMap = value; + field = value; + OnPropertyChanged(); } - #endregion } + + #endregion + + #region Constructor, load settings + + public TracerouteSettingsViewModel() + { + _isLoading = true; + + LoadSettings(); + + _isLoading = false; + } + + private void LoadSettings() + { + MaximumHops = SettingsManager.Current.Traceroute_MaximumHops; + Timeout = SettingsManager.Current.Traceroute_Timeout; + Buffer = SettingsManager.Current.Traceroute_Buffer; + ResolveHostname = SettingsManager.Current.Traceroute_ResolveHostname; + CheckIPApiIPGeolocation = SettingsManager.Current.Traceroute_CheckIPApiIPGeolocation; + ShowMap = SettingsManager.Current.Traceroute_ShowMap; + } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/TracerouteViewModel.cs b/Source/NETworkManager/ViewModels/TracerouteViewModel.cs index 23743c4d50..74c07f461a 100644 --- a/Source/NETworkManager/ViewModels/TracerouteViewModel.cs +++ b/Source/NETworkManager/ViewModels/TracerouteViewModel.cs @@ -1,475 +1,569 @@ -using System.Net; -using System.Windows.Input; -using System.Windows; +using log4net; +using MahApps.Metro.Controls; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Models; +using NETworkManager.Models.EventSystem; +using NETworkManager.Models.Export; +using NETworkManager.Models.Network; +using NETworkManager.Settings; +using NETworkManager.Utilities; +using NETworkManager.Views; using System; using System.Collections; using System.Collections.ObjectModel; -using NETworkManager.Settings; -using NETworkManager.Models.Network; -using System.Threading; -using NETworkManager.Utilities; -using System.Windows.Threading; using System.ComponentModel; -using System.Globalization; -using System.Windows.Data; using System.Linq; -using Dragablz; -using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.Controls; -using NETworkManager.Models.Export; -using NETworkManager.Views; -using NETworkManager.Models; -using NETworkManager.Models.EventSystem; +using System.Net; +using System.Threading; using System.Threading.Tasks; +using System.Windows; +using System.Windows.Data; +using System.Windows.Input; +using System.Windows.Threading; -namespace NETworkManager.ViewModels -{ - public class TracerouteViewModel : ViewModelBase - { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; +namespace NETworkManager.ViewModels; - private CancellationTokenSource _cancellationTokenSource; +/// +/// ViewModel for the Traceroute feature. +/// +public class TracerouteViewModel : ViewModelBase +{ + #region Variables + private static readonly ILog Log = LogManager.GetLogger(typeof(TracerouteViewModel)); - public readonly int TabId; - private bool _firstLoad = true; + private CancellationTokenSource _cancellationTokenSource; - private readonly bool _isLoading; + private readonly Guid _tabId; + private bool _firstLoad = true; + private bool _closed; + private bool _isLoading; - private string _host; - public string Host + /// + /// Gets or sets the host address or hostname to trace. + /// + public string Host + { + get; + set { - get => _host; - set - { - if (value == _host) - return; + if (value == field) + return; - _host = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - public ICollectionView HostHistoryView { get; } + /// + /// Gets the collection view for the host history. + /// + public ICollectionView HostHistoryView { get; } - private bool _isTraceRunning; - public bool IsTraceRunning + /// + /// Gets or sets a value indicating whether a traceroute is currently running. + /// + public bool IsRunning + { + get; + set { - get => _isTraceRunning; - set - { - if (value == _isTraceRunning) - return; + if (value == field) + return; - _isTraceRunning = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _cancelTrace; - public bool CancelTrace + /// + /// Gets or sets a value indicating whether the trace should be cancelled. + /// + public bool CancelTrace + { + get; + set { - get => _cancelTrace; - set - { - if (value == _cancelTrace) - return; + if (value == field) + return; - _cancelTrace = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private ObservableCollection _traceResults = new ObservableCollection(); - public ObservableCollection TraceResults + /// + /// Gets or sets the collection of traceroute hop results. + /// + public ObservableCollection Results + { + get; + set { - get => _traceResults; - set - { - if (Equals(value, _traceResults)) - return; + if (Equals(value, field)) + return; - _traceResults = value; - } + field = value; + OnPropertyChanged(); } + } = []; - public ICollectionView TraceResultsView { get; } + /// + /// Gets the collection view for the traceroute results. + /// + public ICollectionView ResultsView { get; } - private TracerouteHopInfo _selectedTraceResult; - public TracerouteHopInfo SelectedTraceResult + /// + /// Gets or sets the currently selected traceroute result hop. + /// + public TracerouteHopInfo SelectedResult + { + get; + set { - get => _selectedTraceResult; - set - { - if (value == _selectedTraceResult) - return; + if (value == field) + return; - _selectedTraceResult = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private IList _selectedTraceResults = new ArrayList(); - public IList SelectedTraceResults + /// + /// Gets or sets the list of currently selected traceroute result hops (for multi-selection). + /// + public IList SelectedResults + { + get; + set { - get => _selectedTraceResults; - set - { - if (Equals(value, _selectedTraceResults)) - return; + if (Equals(value, field)) + return; - _selectedTraceResults = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = new ArrayList(); - public bool ResolveHostname => SettingsManager.Current.Traceroute_ResolveHostname; + private bool _ipGeolocationRateLimitIsReached; - private bool _isStatusMessageDisplayed; - public bool IsStatusMessageDisplayed + /// + /// Gets or sets a value indicating whether the status message is displayed. + /// + public bool IsStatusMessageDisplayed + { + get; + set { - get => _isStatusMessageDisplayed; - set - { - if (value == _isStatusMessageDisplayed) - return; + if (value == field) + return; - _isStatusMessageDisplayed = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _statusMessage; - public string StatusMessage + /// + /// Gets the status message to display. + /// + public string StatusMessage + { + get; + private set { - get => _statusMessage; - set - { - if (value == _statusMessage) - return; + if (value == field) + return; - _statusMessage = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion - - #region Constructor, load settings - public TracerouteViewModel(IDialogCoordinator instance, int tabId, string host) + } + + public bool ExpandMapView + { + get; + set { - _isLoading = true; + if (value == field) + return; - _dialogCoordinator = instance; + if (!_isLoading) + SettingsManager.Current.Traceroute_ExpandMapView = value; - TabId = tabId; - Host = host; + field = value; + OnPropertyChanged(); + } + } - // Set collection view - HostHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.Traceroute_HostHistory); + /// + /// Gets whether the map row (see TracerouteView's MapRow) should be shown at all. Requires + /// both IP geolocation lookups and the map itself to be enabled in the settings - without + /// geolocation, no hop ever has a resolved Lat/Lon to plot (see TracerouteMapControl.RedrawHops), + /// so an always-empty map would just be confusing rather than useful. Computed rather than a + /// regular settings-backed property like ExpandMapView above, since it only ever changes in + /// response to a global settings change made elsewhere (the settings flyout) - see + /// SettingsManager_PropertyChanged. + /// + public bool ShowMap => + SettingsManager.Current.Traceroute_CheckIPApiIPGeolocation && SettingsManager.Current.Traceroute_ShowMap; + + #endregion + + #region Constructor, load settings + + /// + /// Initializes a new instance of the class. + /// + /// The unique identifier for the tab. + /// The initial host to trace. + public TracerouteViewModel(Guid tabId, string host) + { + ConfigurationManager.Current.TracerouteTabCount++; - // Result view - TraceResultsView = CollectionViewSource.GetDefaultView(TraceResults); - TraceResultsView.SortDescriptions.Add(new SortDescription(nameof(TracerouteHopInfo.Hop), ListSortDirection.Ascending)); + _tabId = tabId; + Host = host; - LoadSettings(); + // Set collection view + HostHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.Traceroute_HostHistory); - SettingsManager.Current.PropertyChanged += Current_PropertyChanged; + // Result view + ResultsView = CollectionViewSource.GetDefaultView(Results); + ResultsView.SortDescriptions.Add(new SortDescription(nameof(TracerouteHopInfo.Hop), + ListSortDirection.Ascending)); - _isLoading = false; - } + _isLoading = true; - public void OnLoaded() - { - if (!_firstLoad) - return; + LoadSettings(); - if (!string.IsNullOrEmpty(Host)) - StartTrace(); + _isLoading = false; - _firstLoad = false; - } + // ShowMap has no backing field of its own (see its getter) - it's recomputed from these + // two settings whenever either changes, e.g. via the settings flyout while this tab stays open. + SettingsManager.Current.PropertyChanged += SettingsManager_PropertyChanged; + } - private void LoadSettings() - { + private void SettingsManager_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + if (e.PropertyName is nameof(SettingsInfo.Traceroute_CheckIPApiIPGeolocation) + or nameof(SettingsInfo.Traceroute_ShowMap)) + OnPropertyChanged(nameof(ShowMap)); + } - } - #endregion + /// + /// Called when the view is loaded. Starts the trace if it's the first load and a host is specified. + /// + public void OnLoaded() + { + if (!_firstLoad) + return; - #region ICommands & Actions - public ICommand TraceCommand => new RelayCommand(p => TraceAction(), Trace_CanExecute); + if (!string.IsNullOrEmpty(Host)) + _ = StartTrace(); - private bool Trace_CanExecute(object paramter) => System.Windows.Application.Current.MainWindow != null && !((MetroWindow)System.Windows.Application.Current.MainWindow).IsAnyDialogOpen; + _firstLoad = false; + } - private void TraceAction() - { - if (IsTraceRunning) - StopTrace(); - else - StartTrace(); - } + private void LoadSettings() + { + ExpandMapView = SettingsManager.Current.Traceroute_ExpandMapView; + } - public ICommand RedirectDataToApplicationCommand => new RelayCommand(RedirectDataToApplicationAction); + #endregion - private void RedirectDataToApplicationAction(object name) - { - if (!(name is string appName)) - return; + #region ICommands & Actions - if (!System.Enum.TryParse(appName, out ApplicationName app)) - return; + /// + /// Gets the command to start or stop the traceroute. + /// + public ICommand TraceCommand => new RelayCommand(_ => TraceAction(), Trace_CanExecute); - var host = !string.IsNullOrEmpty(SelectedTraceResult.Hostname) ? SelectedTraceResult.Hostname : SelectedTraceResult.IPAddress.ToString(); + private bool Trace_CanExecute(object parameter) + { + return Application.Current.MainWindow != null && + !((MetroWindow)Application.Current.MainWindow)!.IsAnyDialogOpen && + !ConfigurationManager.Current.IsChildWindowOpen; + } - EventSystem.RedirectToApplication(app, host); - } + private void TraceAction() + { + if (IsRunning) + StopTrace(); + else + _ = StartTrace(); + } - public ICommand PerformDNSLookupIPAddressCommand => new RelayCommand(p => PerformDNSLookupIPAddressAction()); + /// + /// Gets the command to redirect the selected result's data to another application. + /// + public ICommand RedirectDataToApplicationCommand => new RelayCommand(RedirectDataToApplicationAction); - private void PerformDNSLookupIPAddressAction() - { - EventSystem.RedirectToApplication(ApplicationName.DNSLookup, SelectedTraceResult.IPAddress.ToString()); - } + private void RedirectDataToApplicationAction(object name) + { + if (name is not ApplicationName applicationName) + return; - public ICommand PerformDNSLookupHostnameCommand => new RelayCommand(p => PerformDNSLookupHostnameAction()); + var host = !string.IsNullOrEmpty(SelectedResult.Hostname) + ? SelectedResult.Hostname + : SelectedResult.IPAddress.ToString(); - private void PerformDNSLookupHostnameAction() - { - EventSystem.RedirectToApplication(ApplicationName.DNSLookup, SelectedTraceResult.Hostname); - } + EventSystem.RedirectToApplication(applicationName, host); + } - public ICommand CopySelectedHopCommand => new RelayCommand(p => CopySelectedHopAction()); + /// + /// Gets the command to perform a DNS lookup for the selected hop. + /// + public ICommand PerformDNSLookupCommand => new RelayCommand(PerformDNSLookupAction); - private void CopySelectedHopAction() - { - ClipboardHelper.SetClipboard(SelectedTraceResult.Hop.ToString()); - } + private void PerformDNSLookupAction(object data) + { + EventSystem.RedirectToApplication(ApplicationName.DNSLookup, data.ToString()); + } - public ICommand CopySelectedTime1Command => new RelayCommand(p => CopySelectedTime1Action()); + /// + /// Gets the command to copy the round-trip time to the clipboard. + /// + public ICommand CopyTimeToClipboardCommand => new RelayCommand(CopyTimeToClipboardAction); - private void CopySelectedTime1Action() + private void CopyTimeToClipboardAction(object timeIdentifier) + { + var time = timeIdentifier switch { - ClipboardHelper.SetClipboard(SelectedTraceResult.Time1.ToString(CultureInfo.CurrentCulture)); - } + "1" => Ping.TimeToString(SelectedResult.Status1, SelectedResult.Time1), + "2" => Ping.TimeToString(SelectedResult.Status2, SelectedResult.Time2), + "3" => Ping.TimeToString(SelectedResult.Status3, SelectedResult.Time3), + _ => "-/-" + }; - public ICommand CopySelectedTime2Command => new RelayCommand(p => CopySelectedTime2Action()); + ClipboardHelper.SetClipboard(time); + } - private void CopySelectedTime2Action() - { - ClipboardHelper.SetClipboard(SelectedTraceResult.Time2.ToString(CultureInfo.CurrentCulture)); - } + /// + /// Gets the command to export the traceroute results. + /// + public ICommand ExportCommand => new RelayCommand(_ => ExportAction()); - public ICommand CopySelectedTime3Command => new RelayCommand(p => CopySelectedTime3Action()); + private void ExportAction() + { + _ = Export(); + } - private void CopySelectedTime3Action() - { - ClipboardHelper.SetClipboard(SelectedTraceResult.Time3.ToString(CultureInfo.CurrentCulture)); - } + #endregion - public ICommand CopySelectedIPAddressCommand => new RelayCommand(p => CopySelectedIPAddressAction()); + #region Methods - private void CopySelectedIPAddressAction() - { - ClipboardHelper.SetClipboard(SelectedTraceResult.IPAddress.ToString()); - } + private void StopTrace() + { + CancelTrace = true; + _cancellationTokenSource.Cancel(); + } - public ICommand CopySelectedHostnameCommand => new RelayCommand(p => CopySelectedHostnameAction()); + private async Task StartTrace() + { + _ipGeolocationRateLimitIsReached = false; + StatusMessage = string.Empty; + IsStatusMessageDisplayed = false; + IsRunning = true; - private void CopySelectedHostnameAction() - { - ClipboardHelper.SetClipboard(SelectedTraceResult.Hostname); - } + Results.Clear(); - public ICommand ExportCommand => new RelayCommand(p => ExportAction()); + DragablzTabItem.SetTabHeader(_tabId, Host); - private void ExportAction() - { - Export(); - } - #endregion + _cancellationTokenSource?.Dispose(); + _cancellationTokenSource = new CancellationTokenSource(); - #region Methods - private void StopTrace() + // Try to parse the string into an IP-Address + if (!IPAddress.TryParse(Host, out var ipAddress)) { - CancelTrace = true; - _cancellationTokenSource.Cancel(); + var dnsResult = + await DNSClientHelper.ResolveAorAaaaAsync(Host, + SettingsManager.Current.Network_ResolveHostnamePreferIPv4); + + if (dnsResult.HasError) + { + DisplayStatusMessage(DNSClientHelper.FormatDNSClientResultError(Host, dnsResult)); + + IsRunning = false; + + return; + } + + ipAddress = dnsResult.Value; } - private async Task StartTrace() + try { - IsStatusMessageDisplayed = false; - IsTraceRunning = true; - - TraceResults.Clear(); + var traceroute = new Traceroute(new TracerouteOptions( + SettingsManager.Current.Traceroute_Timeout, + new byte[SettingsManager.Current.Traceroute_Buffer], + SettingsManager.Current.Traceroute_MaximumHops, + true, + SettingsManager.Current.Traceroute_ResolveHostname, + SettingsManager.Current.Traceroute_CheckIPApiIPGeolocation + )); - // Change the tab title (not nice, but it works) - var window = System.Windows.Application.Current.Windows.OfType().FirstOrDefault(x => x.IsActive); + traceroute.HopReceived += Traceroute_HopReceived; + traceroute.TraceComplete += Traceroute_TraceComplete; + traceroute.MaximumHopsReached += Traceroute_MaximumHopsReached; + traceroute.TraceError += Traceroute_TraceError; + traceroute.UserHasCanceled += Traceroute_UserHasCanceled; - if (window != null) - { - foreach (var tabablzControl in VisualTreeHelper.FindVisualChildren(window)) - { - tabablzControl.Items.OfType().First(x => x.Id == TabId).Header = Host; - } - } + traceroute.TraceAsync(ipAddress, _cancellationTokenSource.Token); - _cancellationTokenSource = new CancellationTokenSource(); + // Add the host to history + AddHostToHistory(Host); + } + catch (Exception ex) // This will catch any exception + { + IsRunning = false; - // Try to parse the string into an IP-Address - if (!IPAddress.TryParse(Host, out var ipAddress)) - { - ipAddress = await DnsLookupHelper.ResolveIPAddress(Host); - } + DisplayStatusMessage(ex.Message); + } + } - if (ipAddress == null) - { - TracerouteFinished(); + private Task Export() + { + var window = Application.Current.Windows.OfType().FirstOrDefault(x => x.IsActive); - StatusMessage = string.Format(Localization.Resources.Strings.CouldNotResolveIPAddressFor, Host); - IsStatusMessageDisplayed = true; + var childWindow = new ExportChildWindow(); - return; - } + var childWindowViewModel = new ExportViewModel(async instance => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; try { - var traceroute = new Traceroute - { - Timeout = SettingsManager.Current.Traceroute_Timeout, - Buffer = new byte[SettingsManager.Current.Traceroute_Buffer], - MaximumHops = SettingsManager.Current.Traceroute_MaximumHops, - DontFragement = true, - ResolveHostname = SettingsManager.Current.Traceroute_ResolveHostname - }; - - traceroute.HopReceived += Traceroute_HopReceived; - traceroute.TraceComplete += Traceroute_TraceComplete; - traceroute.MaximumHopsReached += Traceroute_MaximumHopsReached; - traceroute.UserHasCanceled += Traceroute_UserHasCanceled; - - traceroute.TraceAsync(ipAddress, _cancellationTokenSource.Token); - - // Add the host to history - AddHostToHistory(Host); + ExportManager.Export(instance.FilePath, instance.FileType, + instance.ExportAll + ? Results + : SelectedResults.Cast().ToArray()); } - catch (Exception ex) // This will catch any exception + catch (Exception ex) { - TracerouteFinished(); + Log.Error("Error while exporting data as " + instance.FileType, ex); - StatusMessage = ex.Message; - IsStatusMessageDisplayed = true; + await DialogHelper.ShowMessageAsync(window, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); } - } - private void UserHasCanceled() + SettingsManager.Current.Traceroute_ExportFileType = instance.FileType; + SettingsManager.Current.Traceroute_ExportFilePath = instance.FilePath; + }, _ => { - CancelTrace = false; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, [ + ExportFileType.Csv, ExportFileType.Xml, ExportFileType.Json + ], true, SettingsManager.Current.Traceroute_ExportFileType, + SettingsManager.Current.Traceroute_ExportFilePath); - TracerouteFinished(); - } + childWindow.Title = Strings.Export; - private void TracerouteFinished() - { - IsTraceRunning = false; - } + childWindow.DataContext = childWindowViewModel; - private async Task Export() - { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.Export - }; + ConfigurationManager.Current.IsChildWindowOpen = true; - var exportViewModel = new ExportViewModel(async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + return window.ShowChildWindowAsync(childWindow); + } - try - { - ExportManager.Export(instance.FilePath, instance.FileType, instance.ExportAll ? TraceResults : new ObservableCollection(SelectedTraceResults.Cast().ToArray())); - } - catch (Exception ex) - { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Localization.Resources.Strings.OK; + private void AddHostToHistory(string host) + { + // Create the new list + var list = ListHelper.Modify(SettingsManager.Current.Traceroute_HostHistory.ToList(), host, + SettingsManager.Current.General_HistoryListEntries); - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Error, Localization.Resources.Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); - } + // Clear the old items + SettingsManager.Current.Traceroute_HostHistory.Clear(); + OnPropertyChanged(nameof(Host)); // Raise property changed again, after the collection has been cleared - SettingsManager.Current.Traceroute_ExportFileType = instance.FileType; - SettingsManager.Current.Traceroute_ExportFilePath = instance.FilePath; - }, instance => { _dialogCoordinator.HideMetroDialogAsync(this, customDialog); }, new ExportManager.ExportFileType[] { ExportManager.ExportFileType.CSV, ExportManager.ExportFileType.XML, ExportManager.ExportFileType.JSON }, true, SettingsManager.Current.Traceroute_ExportFileType, SettingsManager.Current.Traceroute_ExportFilePath); + // Fill with the new items + list.ForEach(x => SettingsManager.Current.Traceroute_HostHistory.Add(x)); + } - customDialog.Content = new ExportDialog - { - DataContext = exportViewModel - }; + public void OnClose() + { + // Prevent multiple calls + if (_closed) + return; - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } + _closed = true; - private void AddHostToHistory(string host) - { - // Create the new list - var list = ListHelper.Modify(SettingsManager.Current.Traceroute_HostHistory.ToList(), host, SettingsManager.Current.General_HistoryListEntries); + SettingsManager.Current.PropertyChanged -= SettingsManager_PropertyChanged; - // Clear the old items - SettingsManager.Current.Traceroute_HostHistory.Clear(); - OnPropertyChanged(nameof(Host)); // Raise property changed again, after the collection has been cleared + // Stop trace + if (IsRunning) + StopTrace(); - // Fill with the new items - list.ForEach(x => SettingsManager.Current.Traceroute_HostHistory.Add(x)); - } + ConfigurationManager.Current.TracerouteTabCount--; + } - public void OnClose() - { - if (IsTraceRunning) - StopTrace(); - } - #endregion + #endregion + + #region Events - #region Events - private void Traceroute_HopReceived(object sender, TracerouteHopReceivedArgs e) + private void Traceroute_HopReceived(object sender, TracerouteHopReceivedArgs e) + { + Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(delegate { - var tracerouteInfo = TracerouteHopInfo.Parse(e); + // Check error + if (e.Args.IPGeolocationResult.HasError) + { + Log.Error( + $"ip-api.com error: {e.Args.IPGeolocationResult.ErrorMessage}, error code: {e.Args.IPGeolocationResult.ErrorCode}"); + + DisplayStatusMessage($"ip-api.com: {e.Args.IPGeolocationResult.ErrorMessage}"); + } - Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(delegate + // Check rate limit + if (!_ipGeolocationRateLimitIsReached && e.Args.IPGeolocationResult.RateLimitIsReached) { - //lock (TraceResults) - TraceResults.Add(tracerouteInfo); - })); - } + _ipGeolocationRateLimitIsReached = true; - private void Traceroute_MaximumHopsReached(object sender, MaximumHopsReachedArgs e) - { - TracerouteFinished(); + Log.Warn( + $"ip-api.com rate limit reached. Try again in {e.Args.IPGeolocationResult.RateLimitRemainingTime} seconds."); - StatusMessage = string.Format(Localization.Resources.Strings.MaximumNumberOfHopsReached, e.Hops); - IsStatusMessageDisplayed = true; - } + DisplayStatusMessage( + $"ip-api.com {string.Format(Strings.RateLimitReachedTryAgainInXSeconds, e.Args.IPGeolocationResult.RateLimitRemainingTime)}"); + } - private void Traceroute_UserHasCanceled(object sender, EventArgs e) - { - UserHasCanceled(); + Results.Add(e.Args); + })); + } - StatusMessage = Localization.Resources.Strings.CanceledByUserMessage; - IsStatusMessageDisplayed = true; - } + private void Traceroute_MaximumHopsReached(object sender, MaximumHopsReachedArgs e) + { + DisplayStatusMessage(string.Format(Strings.MaximumNumberOfHopsReached, e.Hops)); + IsRunning = false; + } - private void Traceroute_TraceComplete(object sender, EventArgs e) - { - TracerouteFinished(); - } + private void Traceroute_UserHasCanceled(object sender, EventArgs e) + { + DisplayStatusMessage(Strings.CanceledByUserMessage); + CancelTrace = false; + IsRunning = false; + } - private void Current_PropertyChanged(object sender, PropertyChangedEventArgs e) - { - switch (e.PropertyName) - { - case nameof(SettingsInfo.Traceroute_ResolveHostname): - OnPropertyChanged(nameof(ResolveHostname)); - break; - } - } - #endregion + private void Traceroute_TraceError(object sender, TracerouteErrorArgs e) + { + DisplayStatusMessage(e.ErrorMessage); + IsRunning = false; + } + + private void Traceroute_TraceComplete(object sender, EventArgs e) + { + IsRunning = false; + } + + private void DisplayStatusMessage(string message) + { + if (!string.IsNullOrEmpty(StatusMessage)) + StatusMessage += Environment.NewLine; + + StatusMessage += message; + IsStatusMessageDisplayed = true; } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/UpgradeViewModel.cs b/Source/NETworkManager/ViewModels/UpgradeViewModel.cs new file mode 100644 index 0000000000..3c5ea6956a --- /dev/null +++ b/Source/NETworkManager/ViewModels/UpgradeViewModel.cs @@ -0,0 +1,33 @@ +using NETworkManager.Documentation; +using NETworkManager.Settings; +using NETworkManager.Utilities; +using System; +using System.Windows.Input; + +namespace NETworkManager.ViewModels; + +public class UpgradeViewModel : ViewModelBase +{ + public static string Title => string.Format(Localization.Resources.Strings.UpgradedToXXX, AssemblyManager.Current.Version); + + public UpgradeViewModel(Action continueCommand) + { + ContinueCommand = new RelayCommand(_ => continueCommand(this)); + } + + public ICommand OpenWebsiteCommand => new RelayCommand(OpenWebsiteAction); + + private static void OpenWebsiteAction(object url) + { + ExternalProcessStarter.OpenUrl((string)url); + } + + public ICommand OpenChangelogCommand => new RelayCommand(OpenChangelogAction); + + private void OpenChangelogAction(object obj) + { + DocumentationManager.OpenChangelog(); + } + + public ICommand ContinueCommand { get; } +} diff --git a/Source/NETworkManager/ViewModels/ViewModelBase.cs b/Source/NETworkManager/ViewModels/ViewModelBase.cs index 05753e1f9c..e1c708d22f 100644 --- a/Source/NETworkManager/ViewModels/ViewModelBase.cs +++ b/Source/NETworkManager/ViewModels/ViewModelBase.cs @@ -1,15 +1,14 @@ -using System.ComponentModel; -using System.Runtime.CompilerServices; +using System.Windows.Input; +using NETworkManager.Utilities; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +public abstract class ViewModelBase : PropertyChangedBase { - public abstract class ViewModelBase : INotifyPropertyChanged - { - public event PropertyChangedEventHandler PropertyChanged; + public ICommand CopyDataToClipboardCommand => new RelayCommand(CopyDataToClipboardAction); - protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } + private static void CopyDataToClipboardAction(object data) + { + ClipboardHelper.SetClipboard(data.ToString()); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/WakeOnLANSettingsViewModel.cs b/Source/NETworkManager/ViewModels/WakeOnLANSettingsViewModel.cs index 94190b9f36..3c428b2dea 100644 --- a/Source/NETworkManager/ViewModels/WakeOnLANSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/WakeOnLANSettingsViewModel.cs @@ -1,45 +1,46 @@ -using NETworkManager.Settings; -using NETworkManager.Utilities; +using NETworkManager.Settings; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +public class WakeOnLANSettingsViewModel : ViewModelBase { - public class WakeOnLANSettingsViewModel : ViewModelBase - { - #region Variables - private readonly bool _isLoading; + #region Variables - private int _defaultPort; - public int DefaultPort - { - get => _defaultPort; - set - { - if (value == _defaultPort) - return; - - if (!_isLoading) - SettingsManager.Current.WakeOnLAN_Port = value; - - _defaultPort = value; - OnPropertyChanged(); - } - } - #endregion + private readonly bool _isLoading; - #region Constructor, load settings - public WakeOnLANSettingsViewModel() + public int DefaultPort + { + get; + set { - _isLoading = true; + if (value == field) + return; - LoadSettings(); + if (!_isLoading) + SettingsManager.Current.WakeOnLAN_Port = value; - _isLoading = false; + field = value; + OnPropertyChanged(); } + } - private void LoadSettings() - { - DefaultPort = SettingsManager.Current.WakeOnLAN_Port; - } - #endregion + #endregion + + #region Constructor, load settings + + public WakeOnLANSettingsViewModel() + { + _isLoading = true; + + LoadSettings(); + + _isLoading = false; } + + private void LoadSettings() + { + DefaultPort = SettingsManager.Current.WakeOnLAN_Port; + } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/WakeOnLANViewModel.cs b/Source/NETworkManager/ViewModels/WakeOnLANViewModel.cs index a43cee4f73..335d64d2f8 100644 --- a/Source/NETworkManager/ViewModels/WakeOnLANViewModel.cs +++ b/Source/NETworkManager/ViewModels/WakeOnLANViewModel.cs @@ -1,494 +1,263 @@ -using NETworkManager.Settings; -using System.Net; -using System.Windows.Input; -using MahApps.Metro.Controls.Dialogs; -using System.Windows; -using System; +using MahApps.Metro.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Models; using NETworkManager.Models.Network; -using System.ComponentModel; -using System.Windows.Data; +using NETworkManager.Profiles; +using NETworkManager.Settings; using NETworkManager.Utilities; -using System.Threading.Tasks; +using System; +using System.Collections.ObjectModel; +using System.ComponentModel; using System.Linq; -using MahApps.Metro.Controls; -using NETworkManager.Profiles; -using System.Windows.Threading; -using System.Collections.Generic; - -namespace NETworkManager.ViewModels -{ - public class WakeOnLANViewModel : ViewModelBase, IProfileManager - { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - private readonly DispatcherTimer _searchDispatcherTimer = new DispatcherTimer(); - - private readonly bool _isLoading = true; - private bool _isViewActive = true; - - private bool _isSending; - public bool IsSending - { - get => _isSending; - set - { - if (value == _isSending) - return; - - _isSending = value; - OnPropertyChanged(); - } - } +using System.Net; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Data; +using System.Windows.Input; - private string _macAddress; - public string MACAddress - { - get => _macAddress; - set - { - if (value == _macAddress) - return; +namespace NETworkManager.ViewModels; - _macAddress = value; - OnPropertyChanged(); - } - } +/// +/// ViewModel for the Wake on LAN feature. +/// +public class WakeOnLANViewModel : ProfileHostViewModelBase +{ + #region Variables - private bool _macAddressHasError; - public bool MACAddressHasError + /// + /// Gets or sets a value indicating whether the Wake on LAN operation is running. + /// + public bool IsRunning + { + get; + set { - get => _macAddressHasError; - set - { - if (value == _macAddressHasError) - return; + if (value == field) + return; - _macAddressHasError = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _broadcast; - public string Broadcast - { - get => _broadcast; - set - { - if (value == _broadcast) - return; - - _broadcast = value; - OnPropertyChanged(); - } - } + /// + /// Gets the collection view for the MAC address history. + /// + public ICollectionView MACAddressHistoryView { get; } - private bool _broadcastHasError; - public bool BroadcastHasError + /// + /// Gets or sets the MAC address to wake up. + /// + public string MACAddress + { + get; + set { - get => _broadcastHasError; - set - { - if (value == _broadcastHasError) - return; + if (value == field) + return; - _broadcastHasError = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private int _port; - public int Port - { - get => _port; - set - { - if (value == _port) - return; - - _port = value; - OnPropertyChanged(); - } - } + /// + /// Gets the collection view for the broadcast address history. + /// + public ICollectionView BroadcastHistoryView { get; } - private bool _portHasError; - public bool PortHasError + /// + /// Gets or sets the broadcast address. + /// + public string Broadcast + { + get; + set { - get => _portHasError; - set - { - if (value == _portHasError) - return; + if (value == field) + return; - _portHasError = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isStatusMessageDisplayed; - public bool IsStatusMessageDisplayed + /// + /// Gets or sets a value indicating whether the status message is displayed. + /// + public bool IsStatusMessageDisplayed + { + get; + set { - get => _isStatusMessageDisplayed; - set - { - if (value == _isStatusMessageDisplayed) - return; + if (value == field) + return; - _isStatusMessageDisplayed = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _statusMessage; - public string StatusMessage + /// + /// Gets the status message to display. + /// + public string StatusMessage + { + get; + private set { - get => _statusMessage; - set - { - if (value == _statusMessage) - return; - - _statusMessage = value; - OnPropertyChanged(); - } - } - - #region Profiles - public ICollectionView Profiles { get; } + if (value == field) + return; - private ProfileInfo _selectedProfile; - public ProfileInfo SelectedProfile - { - get => _selectedProfile; - set - { - if (value == _selectedProfile) - return; - - if (value != null && !IsSending) - { - MACAddress = value.WakeOnLAN_MACAddress; - Broadcast = value.WakeOnLAN_Broadcast; - Port = value.WakeOnLAN_OverridePort ? value.WakeOnLAN_Port : SettingsManager.Current.WakeOnLAN_Port; - } - - _selectedProfile = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _search; - public string Search + /// + /// Gets or sets the currently selected profile. Pre-fills / + /// from the profile, unless a wake-up is currently running. + /// + public override ProfileInfo SelectedProfile + { + get => base.SelectedProfile; + set { - get => _search; - set - { - if (value == _search) - return; - - _search = value; - - StartDelayedSearch(); - - OnPropertyChanged(); - } - } + if (value == base.SelectedProfile) + return; - private bool _isSearching; - public bool IsSearching - { - get => _isSearching; - set + if (value != null && !IsRunning) { - if (value == _isSearching) - return; - - _isSearching = value; - OnPropertyChanged(); + MACAddress = value.WakeOnLAN_MACAddress; + Broadcast = value.WakeOnLAN_Broadcast; } - } - - private bool _canProfileWidthChange = true; - private double _tempProfileWidth; - private bool _expandProfileView; - public bool ExpandProfileView - { - get => _expandProfileView; - set - { - if (value == _expandProfileView) - return; - - if (!_isLoading) - SettingsManager.Current.WakeOnLAN_ExpandClientView = value; - - _expandProfileView = value; - - if (_canProfileWidthChange) - ResizeClient(false); - - OnPropertyChanged(); - } + base.SelectedProfile = value; } + } - private GridLength _profileWidth; - public GridLength ProfileWidth - { - get => _profileWidth; - set - { - if (value == _profileWidth) - return; - - if (!_isLoading && Math.Abs(value.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > GlobalStaticConfiguration.FloatPointFix) // Do not save the size when collapsed - SettingsManager.Current.WakeOnLAN_ClientWidth = value.Value; - - _profileWidth = value; - - if (_canProfileWidthChange) - ResizeClient(true); - - OnPropertyChanged(); - } - } - #endregion - #endregion - - #region Constructor, load settings - public WakeOnLANViewModel(IDialogCoordinator instance) - { - _dialogCoordinator = instance; - - Profiles = new CollectionViewSource { Source = ProfileManager.Groups.SelectMany(x => x.Profiles) }.View; - Profiles.GroupDescriptions.Add(new PropertyGroupDescription(nameof(ProfileInfo.Group))); - Profiles.SortDescriptions.Add(new SortDescription(nameof(ProfileInfo.Group), ListSortDirection.Ascending)); - Profiles.SortDescriptions.Add(new SortDescription(nameof(ProfileInfo.Name), ListSortDirection.Ascending)); - Profiles.Filter = o => - { - if (!(o is ProfileInfo info)) - return false; - - if (string.IsNullOrEmpty(Search)) - return info.WakeOnLAN_Enabled; - - var search = Search.Trim(); - - // Search by: Tag=xxx (exact match, ignore case) - /* - if (search.StartsWith(ProfileManager.TagIdentifier, StringComparison.OrdinalIgnoreCase)) - return !string.IsNullOrEmpty(info.Tags) && info.WakeOnLAN_Enabled && info.Tags.Replace(" ", "").Split(';').Any(str => search.Substring(ProfileManager.TagIdentifier.Length, search.Length - ProfileManager.TagIdentifier.Length).Equals(str, StringComparison.OrdinalIgnoreCase)); - */ - - // Search by: Name, WakeOnLAN_MACAddress - return info.WakeOnLAN_Enabled && (info.Name.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1 || info.WakeOnLAN_MACAddress.Replace("-", "").Replace(":", "").IndexOf(search.Replace("-", "").Replace(":", ""), StringComparison.OrdinalIgnoreCase) > -1); - }; - - // This will select the first entry as selected item... - SelectedProfile = Profiles.SourceCollection.Cast().Where(x => x.WakeOnLAN_Enabled).OrderBy(x => x.Group).ThenBy(x => x.Name).FirstOrDefault(); - - ProfileManager.OnProfilesUpdated += ProfileManager_OnProfilesUpdated; - - _searchDispatcherTimer.Interval = GlobalStaticConfiguration.SearchDispatcherTimerTimeSpan; - _searchDispatcherTimer.Tick += SearchDispatcherTimer_Tick; - - LoadSettings(); - - _isLoading = false; - } - - private void LoadSettings() - { - Port = SettingsManager.Current.WakeOnLAN_Port; - ExpandProfileView = SettingsManager.Current.WakeOnLAN_ExpandClientView; - - ProfileWidth = ExpandProfileView ? new GridLength(SettingsManager.Current.WakeOnLAN_ClientWidth) : new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); - - _tempProfileWidth = SettingsManager.Current.WakeOnLAN_ClientWidth; - } - #endregion - - #region ICommands & Actions - public ICommand WakeUpCommand => new RelayCommand(p => WakeUpAction(), WakeUpAction_CanExecute); - - private bool WakeUpAction_CanExecute(object parameter) => Application.Current.MainWindow != null && !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && !MACAddressHasError && !BroadcastHasError && !PortHasError; - - private void WakeUpAction() - { - var info = new WakeOnLANInfo - { - MagicPacket = WakeOnLAN.CreateMagicPacket(MACAddress), - Broadcast = IPAddress.Parse(Broadcast), - Port = Port - }; - - WakeUp(info); - } - - public ICommand WakeUpProfileCommand => new RelayCommand(p => WakeUpProfileAction()); - - private void WakeUpProfileAction() - { - WakeUp(NETworkManager.Profiles.Application.WakeOnLAN.CreateInfo(SelectedProfile)); - } + #endregion - public ICommand AddProfileCommand => new RelayCommand(p => AddProfileAction()); + #region Constructor - private void AddProfileAction() - { - ProfileDialogManager.ShowAddProfileDialog(this, _dialogCoordinator); - } + /// + /// Initializes a new instance of the class. + /// + public WakeOnLANViewModel() + { + MACAddressHistoryView = + CollectionViewSource.GetDefaultView(SettingsManager.Current.WakeOnLan_MACAddressHistory); + BroadcastHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.WakeOnLan_BroadcastHistory); - public ICommand EditProfileCommand => new RelayCommand(p => EditProfileAction()); + InitializeProfileHost(); + } - private void EditProfileAction() - { - ProfileDialogManager.ShowEditProfileDialog(this, _dialogCoordinator, SelectedProfile); - } + #endregion - public ICommand CopyAsProfileCommand => new RelayCommand(p => CopyAsProfileAction()); + #region Profile host - private void CopyAsProfileAction() - { - ProfileDialogManager.ShowCopyAsProfileDialog(this, _dialogCoordinator, SelectedProfile); - } + protected override ApplicationName ApplicationName => ApplicationName.WakeOnLAN; - public ICommand DeleteProfileCommand => new RelayCommand(p => DeleteProfileAction()); + protected override bool IsProfileEnabled(ProfileInfo profile) => profile.WakeOnLAN_Enabled; - private void DeleteProfileAction() - { - ProfileDialogManager.ShowDeleteProfileDialog(this, _dialogCoordinator, new List { SelectedProfile }); - } + protected override string GetSearchableField(ProfileInfo profile) => profile.WakeOnLAN_MACAddress; - public ICommand EditGroupCommand => new RelayCommand(EditGroupAction); + #endregion - private void EditGroupAction(object group) - { - ProfileDialogManager.ShowEditGroupDialog(this, _dialogCoordinator, ProfileManager.GetGroup(group.ToString())); - } + #region ICommands & Actions - public ICommand ClearSearchCommand => new RelayCommand(p => ClearSearchAction()); + /// + /// Gets the command to wake up the target. + /// + public ICommand WakeUpCommand => new RelayCommand(_ => WakeUpAction(), WakeUpAction_CanExecute); - private void ClearSearchAction() - { - Search = string.Empty; - } - #endregion + private bool WakeUpAction_CanExecute(object parameter) + { + return Application.Current.MainWindow != null && + !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && + !ConfigurationManager.Current.IsChildWindowOpen; + } - #region Methods - private async Task WakeUp(WakeOnLANInfo info) + private void WakeUpAction() + { + var info = new WakeOnLANInfo { - IsStatusMessageDisplayed = false; - IsSending = true; - - try - { - WakeOnLAN.Send(info); + MagicPacket = WakeOnLAN.CreateMagicPacket(MACAddress), + Broadcast = IPAddress.Parse(Broadcast), + Port = SettingsManager.Current.WakeOnLAN_Port + }; - await Task.Delay(2000); // Make the user happy, let him see a reload animation (and he cannot spam the send command) + AddMACAddressToHistory(MACAddress); + AddBroadcastToHistory(Broadcast); - StatusMessage = Localization.Resources.Strings.MagicPacketSentMessage; - IsStatusMessageDisplayed = true; - } - catch (Exception ex) - { - StatusMessage = ex.Message; - IsStatusMessageDisplayed = true; - } - finally - { - IsSending = false; - } - } + _ = WakeUp(info); + } - private void StartDelayedSearch() - { - if (!IsSearching) - { - IsSearching = true; + /// + /// Gets the command to wake up the selected profile. + /// + public ICommand WakeUpProfileCommand => new RelayCommand(_ => WakeUpProfileAction()); - _searchDispatcherTimer.Start(); - } - else - { - _searchDispatcherTimer.Stop(); - _searchDispatcherTimer.Start(); - } - } + private void WakeUpProfileAction() + { + _ = WakeUp(NETworkManager.Profiles.Application.WakeOnLAN.CreateInfo(SelectedProfile)); + } - private void StopDelayedSearch() - { - _searchDispatcherTimer.Stop(); + #endregion - RefreshProfiles(); + #region Methods - IsSearching = false; - } + private async Task WakeUp(WakeOnLANInfo info) + { + IsStatusMessageDisplayed = false; + IsRunning = true; - private void ResizeClient(bool dueToChangedSize) + try { - _canProfileWidthChange = false; - - if (dueToChangedSize) - { - ExpandProfileView = Math.Abs(ProfileWidth.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > GlobalStaticConfiguration.FloatPointFix; - } - else - { - if (ExpandProfileView) - { - ProfileWidth = Math.Abs(_tempProfileWidth - GlobalStaticConfiguration.Profile_WidthCollapsed) < GlobalStaticConfiguration.FloatPointFix ? new GridLength(GlobalStaticConfiguration.Profile_DefaultWidthExpanded) : new GridLength(_tempProfileWidth); - } - else - { - _tempProfileWidth = ProfileWidth.Value; - ProfileWidth = new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); - } - } + WakeOnLAN.Send(info); - _canProfileWidthChange = true; - } - - public void OnViewVisible() - { - _isViewActive = true; + // Make the user happy, let him see a reload animation (and he cannot spam the reload command) + await Task.Delay(GlobalStaticConfiguration.ApplicationUIRefreshInterval); - RefreshProfiles(); + StatusMessage = Strings.MagicPacketSentMessage; + IsStatusMessageDisplayed = true; } - - public void OnViewHide() + catch (Exception ex) { - _isViewActive = false; + StatusMessage = ex.Message; + IsStatusMessageDisplayed = true; } - public void RefreshProfiles() - { - if (!_isViewActive) - return; - - Profiles.Refresh(); - } + IsRunning = false; + } - public void OnProfileDialogOpen() - { + private void AddMACAddressToHistory(string macAddress) + { + // Create the new list + var list = ListHelper.Modify(SettingsManager.Current.WakeOnLan_MACAddressHistory.ToList(), macAddress, + SettingsManager.Current.General_HistoryListEntries); - } + // Clear the old items + SettingsManager.Current.WakeOnLan_MACAddressHistory.Clear(); + OnPropertyChanged(nameof(MACAddress)); // Raise property changed again, after the collection has been cleared - public void OnProfileDialogClose() - { + // Fill with the new items + list.ForEach(x => SettingsManager.Current.WakeOnLan_MACAddressHistory.Add(x)); + } - } - #endregion + private void AddBroadcastToHistory(string broadcast) + { + // Create the new list + var list = ListHelper.Modify(SettingsManager.Current.WakeOnLan_BroadcastHistory.ToList(), broadcast, + SettingsManager.Current.General_HistoryListEntries); - #region Event - private void ProfileManager_OnProfilesUpdated(object sender, EventArgs e) - { - RefreshProfiles(); - } + // Clear the old items + SettingsManager.Current.WakeOnLan_BroadcastHistory.Clear(); + OnPropertyChanged(nameof(Broadcast)); // Raise property changed again, after the collection has been cleared - private void SearchDispatcherTimer_Tick(object sender, EventArgs e) - { - StopDelayedSearch(); - } - #endregion + // Fill with the new items + list.ForEach(x => SettingsManager.Current.WakeOnLan_BroadcastHistory.Add(x)); } + + #endregion } diff --git a/Source/NETworkManager/ViewModels/WebConsoleConnectViewModel.cs b/Source/NETworkManager/ViewModels/WebConsoleConnectViewModel.cs index ef7705cceb..bdf5f0a496 100644 --- a/Source/NETworkManager/ViewModels/WebConsoleConnectViewModel.cs +++ b/Source/NETworkManager/ViewModels/WebConsoleConnectViewModel.cs @@ -1,46 +1,44 @@ -using NETworkManager.Settings; -using NETworkManager.Utilities; using System; using System.ComponentModel; using System.Windows.Data; using System.Windows.Input; +using NETworkManager.Settings; +using NETworkManager.Utilities; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +public class WebConsoleConnectViewModel : ViewModelBase { - public class WebConsoleConnectViewModel : ViewModelBase + public WebConsoleConnectViewModel(Action connectCommand, + Action cancelHandler) { - public ICommand ConnectCommand { get; } - public ICommand CancelCommand { get; } + ConnectCommand = new RelayCommand(_ => connectCommand(this)); + CancelCommand = new RelayCommand(_ => cancelHandler(this)); - private string _url; - public string Url - { - get => _url; - set - { - if (value == _url) - return; - - _url = value; - OnPropertyChanged(); - } - } - - public ICollectionView UrlHistoryView { get; } - - public WebConsoleConnectViewModel(Action connectCommand, Action cancelHandler) - { - ConnectCommand = new RelayCommand(p => connectCommand(this)); - CancelCommand = new RelayCommand(p => cancelHandler(this)); + UrlHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.WebConsole_UrlHistory); - UrlHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.WebConsole_UrlHistory); + LoadSettings(); + } - LoadSettings(); - } + public ICommand ConnectCommand { get; } + public ICommand CancelCommand { get; } - private void LoadSettings() + public string Url + { + get; + set { + if (value == field) + return; + field = value; + OnPropertyChanged(); } } -} + + public ICollectionView UrlHistoryView { get; } + + private void LoadSettings() + { + } +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/WebConsoleHostViewModel.cs b/Source/NETworkManager/ViewModels/WebConsoleHostViewModel.cs index 832b270ab7..951174d9eb 100644 --- a/Source/NETworkManager/ViewModels/WebConsoleHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/WebConsoleHostViewModel.cs @@ -1,486 +1,243 @@ -using System.Collections.ObjectModel; -using NETworkManager.Controls; using Dragablz; -using System.Windows.Input; -using MahApps.Metro.Controls.Dialogs; +using MahApps.Metro.SimpleChildWindow; +using Microsoft.Web.WebView2.Core; +using NETworkManager.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Models; +using NETworkManager.Models.EventSystem; +using NETworkManager.Models.WebConsole; +using NETworkManager.Profiles; +using NETworkManager.Profiles.Application; using NETworkManager.Settings; -using System.Linq; +using NETworkManager.Utilities; using NETworkManager.Views; -using System.ComponentModel; -using System.Windows.Data; using System; -using NETworkManager.Utilities; -using System.Windows; -using NETworkManager.Profiles; -using NETworkManager.Models.WebConsole; -using System.Windows.Threading; -using NETworkManager.Models; -using NETworkManager.Models.EventSystem; -using Microsoft.Web.WebView2.Core; +using System.Collections.ObjectModel; +using System.Linq; using System.Threading.Tasks; -using System.Collections.Generic; - -namespace NETworkManager.ViewModels -{ - public class WebConsoleHostViewModel : ViewModelBase, IProfileManager - { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - private readonly DispatcherTimer _searchDispatcherTimer = new DispatcherTimer(); - - public IInterTabClient InterTabClient { get; } - public ObservableCollection TabItems { get; } - - private readonly bool _isLoading = true; - private bool _isViewActive = true; +using System.Windows; +using System.Windows.Input; - /// - /// Private variable for . - /// - private bool _isRuntimeAvailable; +namespace NETworkManager.ViewModels; - /// - /// Variable indicates if the Edge WebView2 runtime is available. - /// - public bool IsRuntimeAvailable - { - get => _isRuntimeAvailable; - set - { - if (value == _isRuntimeAvailable) - return; +public class WebConsoleHostViewModel : ProfileHostViewModelBase +{ + #region Variables - _isRuntimeAvailable = value; - OnPropertyChanged(); - } - } + public IInterTabClient InterTabClient { get; } - private int _selectedTabIndex; - public int SelectedTabIndex + public string InterTabPartition + { + get; + set { - get => _selectedTabIndex; - set - { - if (value == _selectedTabIndex) - return; + if (value == field) + return; - _selectedTabIndex = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - #region Profiles - public ICollectionView Profiles { get; } - - private ProfileInfo _selectedProfile = new ProfileInfo(); - public ProfileInfo SelectedProfile - { - get => _selectedProfile; - set - { - if (value == _selectedProfile) - return; - - _selectedProfile = value; - OnPropertyChanged(); - } - } + public ObservableCollection TabItems { get; } - private string _search; - public string Search + /// + /// Variable indicates if the Edge WebView2 runtime is available. + /// + public bool IsRuntimeAvailable + { + get; + set { - get => _search; - set - { - if (value == _search) - return; - - _search = value; - - StartDelayedSearch(); + if (value == field) + return; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isSearching; - public bool IsSearching + public int SelectedTabIndex + { + get; + set { - get => _isSearching; - set - { - if (value == _isSearching) - return; + if (value == field) + return; - _isSearching = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _canProfileWidthChange = true; - private double _tempProfileWidth; - - private bool _expandProfileView; - public bool ExpandProfileView - { - get => _expandProfileView; - set - { - if (value == _expandProfileView) - return; - - if (!_isLoading) - SettingsManager.Current.WebConsole_ExpandProfileView = value; - - _expandProfileView = value; - - if (_canProfileWidthChange) - ResizeProfile(false); + #endregion - OnPropertyChanged(); - } - } + #region Constructor - private GridLength _profileWidth; - public GridLength ProfileWidth + public WebConsoleHostViewModel() + { + try { - get => _profileWidth; - set - { - if (value == _profileWidth) - return; - - if (!_isLoading && Math.Abs(value.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > GlobalStaticConfiguration.FloatPointFix) // Do not save the size when collapsed - SettingsManager.Current.WebConsole_ProfileWidth = value.Value; - - _profileWidth = value; - - if (_canProfileWidthChange) - ResizeProfile(true); - - OnPropertyChanged(); - } + CoreWebView2Environment.GetAvailableBrowserVersionString(); + IsRuntimeAvailable = true; } - #endregion - #endregion - - #region Constructor, load settings - public WebConsoleHostViewModel(IDialogCoordinator instance) + catch (WebView2RuntimeNotFoundException) { - _dialogCoordinator = instance; - - try - { - string version = CoreWebView2Environment.GetAvailableBrowserVersionString(); - IsRuntimeAvailable = true; - } - catch (WebView2RuntimeNotFoundException) - { - IsRuntimeAvailable = false; - } - - InterTabClient = new DragablzInterTabClient(ApplicationName.WebConsole); - - TabItems = new ObservableCollection(); - - Profiles = new CollectionViewSource { Source = ProfileManager.Groups.SelectMany(x => x.Profiles) }.View; - Profiles.GroupDescriptions.Add(new PropertyGroupDescription(nameof(ProfileInfo.Group))); - Profiles.SortDescriptions.Add(new SortDescription(nameof(ProfileInfo.Group), ListSortDirection.Ascending)); - Profiles.SortDescriptions.Add(new SortDescription(nameof(ProfileInfo.Name), ListSortDirection.Ascending)); - Profiles.Filter = o => - { - if (!(o is ProfileInfo info)) - return false; - - if (string.IsNullOrEmpty(Search)) - return info.WebConsole_Enabled; - - var search = Search.Trim(); - - // Search by: Tag=xxx (exact match, ignore case) - /* - if (search.StartsWith(ProfileManager.TagIdentifier, StringComparison.OrdinalIgnoreCase)) - return !string.IsNullOrEmpty(info.Tags) && info.WebConsole_Enabled && info.Tags.Replace(" ", "").Split(';').Any(str => search.Substring(ProfileManager.TagIdentifier.Length, search.Length - ProfileManager.TagIdentifier.Length).Equals(str, StringComparison.OrdinalIgnoreCase)); - */ - - // Search by: Name, WebConsole_Url - return info.WebConsole_Enabled && (info.Name.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1 || info.WebConsole_Url.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1); - }; - - // This will select the first entry as selected item... - SelectedProfile = Profiles.SourceCollection.Cast().Where(x => x.WebConsole_Enabled).OrderBy(x => x.Group).ThenBy(x => x.Name).FirstOrDefault(); - - ProfileManager.OnProfilesUpdated += ProfileManager_OnProfilesUpdated; - - _searchDispatcherTimer.Interval = GlobalStaticConfiguration.SearchDispatcherTimerTimeSpan; - _searchDispatcherTimer.Tick += SearchDispatcherTimer_Tick; - - LoadSettings(); - - SettingsManager.Current.PropertyChanged += Current_PropertyChanged; - - _isLoading = false; + IsRuntimeAvailable = false; } - private void Current_PropertyChanged(object sender, PropertyChangedEventArgs e) - { - } + InterTabClient = new DragablzInterTabClient(ApplicationName.WebConsole); + InterTabPartition = nameof(ApplicationName.WebConsole); - private void LoadSettings() - { - ExpandProfileView = SettingsManager.Current.WebConsole_ExpandProfileView; + TabItems = []; - ProfileWidth = ExpandProfileView ? new GridLength(SettingsManager.Current.WebConsole_ProfileWidth) : new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); + InitializeProfileHost(); + } - _tempProfileWidth = SettingsManager.Current.WebConsole_ProfileWidth; - } - #endregion + #endregion - #region ICommand & Actions - public ItemActionCallback CloseItemCommand => CloseItemAction; + #region Profile host - private void CloseItemAction(ItemActionCallbackArgs args) - { - ((args.DragablzItem.Content as DragablzTabItem)?.View as WebConsoleControl)?.CloseTab(); - } + protected override ApplicationName ApplicationName => ApplicationName.WebConsole; - public ICommand WebConsole_RefreshCommand => new RelayCommand(WebConsole_RefreshAction); + protected override bool IsProfileEnabled(ProfileInfo profile) => profile.WebConsole_Enabled; - private void WebConsole_RefreshAction(object view) - { - if (view is WebConsoleControl control) - { - if (control.ReloadCommand.CanExecute(null)) - control.ReloadCommand.Execute(null); - } - } + protected override string GetSearchableField(ProfileInfo profile) => profile.WebConsole_Url; - public ICommand ConnectCommand => new RelayCommand(p => ConnectAction()); + public override void OnProfileManagerDialogOpen() + { + ConfigurationManager.OnDialogOpen(); + } - private void ConnectAction() - { - Connect(); - } + public override void OnProfileManagerDialogClose() + { + ConfigurationManager.OnDialogClose(); + } - public ICommand ConnectProfileCommand => new RelayCommand(p => ConnectProfileAction(), ConnectProfile_CanExecute); + #endregion - private bool ConnectProfile_CanExecute(object obj) - { - return !IsSearching && SelectedProfile != null; - } + #region ICommand & Actions - private void ConnectProfileAction() - { - ConnectProfile(); - } + public ItemActionCallback CloseItemCommand => CloseItemAction; - public ICommand AddProfileCommand => new RelayCommand(p => AddProfileAction()); + private void CloseItemAction(ItemActionCallbackArgs args) + { + ((args.DragablzItem.Content as DragablzTabItem)?.View as IDragablzTabItem)?.CloseTab(); + } - private void AddProfileAction() - { - ProfileDialogManager.ShowAddProfileDialog(this, _dialogCoordinator); - } + public ICommand ConnectCommand => new RelayCommand(_ => ConnectAction()); - public ICommand EditProfileCommand => new RelayCommand(p => EditProfileAction()); + private void ConnectAction() + { + _ = Connect(); + } - private void EditProfileAction() - { - ProfileDialogManager.ShowEditProfileDialog(this, _dialogCoordinator, SelectedProfile); - } + public ICommand ReloadCommand => new RelayCommand(ReloadAction); - public ICommand CopyAsProfileCommand => new RelayCommand(p => CopyAsProfileAction()); + private void ReloadAction(object view) + { + if (view is WebConsoleControl control) + if (control.ReloadCommand.CanExecute(null)) + control.ReloadCommand.Execute(null); + } - private void CopyAsProfileAction() - { - ProfileDialogManager.ShowCopyAsProfileDialog(this, _dialogCoordinator, SelectedProfile); - } + public ICommand ConnectProfileCommand => new RelayCommand(_ => ConnectProfileAction(), ConnectProfile_CanExecute); - public ICommand DeleteProfileCommand => new RelayCommand(p => DeleteProfileAction()); + private bool ConnectProfile_CanExecute(object obj) + { + return !IsSearching && SelectedProfile != null; + } - private void DeleteProfileAction() - { - ProfileDialogManager.ShowDeleteProfileDialog(this, _dialogCoordinator, new List { SelectedProfile }); - } + private void ConnectProfileAction() + { + ConnectProfile(); + } - public ICommand EditGroupCommand => new RelayCommand(EditGroupAction); + public ICommand OpenSettingsCommand => new RelayCommand(_ => OpenSettingsAction()); - private void EditGroupAction(object group) - { - ProfileDialogManager.ShowEditGroupDialog(this, _dialogCoordinator, ProfileManager.GetGroup(group.ToString())); - } + private static void OpenSettingsAction() + { + EventSystem.RedirectToSettings(); + } - public ICommand ClearSearchCommand => new RelayCommand(p => ClearSearchAction()); + public ICommand OpenWebsiteCommand => new RelayCommand(OpenWebsiteAction); - private void ClearSearchAction() - { - Search = string.Empty; - } + private static void OpenWebsiteAction(object url) + { + ExternalProcessStarter.OpenUrl((string)url); + } - public ICommand OpenSettingsCommand => new RelayCommand(p => OpenSettingsAction()); + #endregion - private static void OpenSettingsAction() - { - EventSystem.RedirectToSettings(); - } + #region Methods - public ICommand OpenWebsiteCommand => new RelayCommand(OpenWebsiteAction); + private Task Connect() + { + var childWindow = new WebConsoleConnectChildWindow(); - private static void OpenWebsiteAction(object url) + var childWindowViewModel = new WebConsoleConnectViewModel(instance => { - ExternalProcessStarter.OpenUrl((string)url); - } - #endregion + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - #region Methods - private async Task Connect() - { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.Connect - }; + ConfigurationManager.OnDialogClose(); - var connectViewModel = new WebConsoleConnectViewModel(async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - ConfigurationManager.Current.FixAirspace = false; - - // Create profile info - var info = new WebConsoleSessionInfo - { - Url = instance.Url - }; - - // Add to history - // Note: The history can only be updated after the values have been read. - // Otherwise, in some cases, incorrect values are taken over. - AddUrlToHistory(instance.Url); - - Connect(info); - }, async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - ConfigurationManager.Current.FixAirspace = false; - }); - - customDialog.Content = new WebConsoleConnectDialog + // Create profile info + var info = new WebConsoleSessionInfo { - DataContext = connectViewModel + Url = instance.Url }; - ConfigurationManager.Current.FixAirspace = true; - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } - - private void ConnectProfile() - { - Connect(NETworkManager.Profiles.Application.WebConsole.CreateSessionInfo(SelectedProfile), SelectedProfile.Name); - } + // Add to history + // Note: The history can only be updated after the values have been read. + // Otherwise, in some cases, incorrect values are taken over. + AddUrlToHistory(instance.Url); - private void Connect(WebConsoleSessionInfo sessionInfo, string header = null) + Connect(info); + }, _ => { - TabItems.Add(new DragablzTabItem(header ?? sessionInfo.Url, new WebConsoleControl(sessionInfo))); - - SelectedTabIndex = TabItems.Count - 1; - } + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - // Modify history list - private static void AddUrlToHistory(string url) - { - if (string.IsNullOrEmpty(url)) - return; + ConfigurationManager.OnDialogClose(); + }); - SettingsManager.Current.WebConsole_UrlHistory = new ObservableCollection(ListHelper.Modify(SettingsManager.Current.WebConsole_UrlHistory.ToList(), url, SettingsManager.Current.General_HistoryListEntries)); - } + childWindow.Title = Strings.Connect; - private void StartDelayedSearch() - { - if (!IsSearching) - { - IsSearching = true; + childWindow.DataContext = childWindowViewModel; - _searchDispatcherTimer.Start(); - } - else - { - _searchDispatcherTimer.Stop(); - _searchDispatcherTimer.Start(); - } - } + ConfigurationManager.Current.IsChildWindowOpen = true; - private void StopDelayedSearch() - { - _searchDispatcherTimer.Stop(); - - RefreshProfiles(); - - IsSearching = false; - } - - private void ResizeProfile(bool dueToChangedSize) - { - _canProfileWidthChange = false; - - if (dueToChangedSize) - { - ExpandProfileView = Math.Abs(ProfileWidth.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > GlobalStaticConfiguration.FloatPointFix; - } - else - { - if (ExpandProfileView) - { - ProfileWidth = Math.Abs(_tempProfileWidth - GlobalStaticConfiguration.Profile_WidthCollapsed) < GlobalStaticConfiguration.FloatPointFix ? new GridLength(GlobalStaticConfiguration.Profile_DefaultWidthExpanded) : new GridLength(_tempProfileWidth); - } - else - { - _tempProfileWidth = ProfileWidth.Value; - ProfileWidth = new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); - } - } - - _canProfileWidthChange = true; - } - - public void OnViewVisible() - { - _isViewActive = true; + ConfigurationManager.OnDialogOpen(); - RefreshProfiles(); - } - - public void OnViewHide() - { - _isViewActive = false; - } + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } - public void RefreshProfiles() - { - if (!_isViewActive) - return; + private void ConnectProfile() + { + Connect(WebConsole.CreateSessionInfo(SelectedProfile), + SelectedProfile.Name); + } - Profiles.Refresh(); - } + private void Connect(WebConsoleSessionInfo sessionInfo, string header = null) + { + var tabId = Guid.NewGuid(); - public void OnProfileDialogOpen() - { - ConfigurationManager.Current.FixAirspace = true; - } + TabItems.Add(new DragablzTabItem(header ?? sessionInfo.Url, new WebConsoleControl(tabId, sessionInfo), tabId)); - public void OnProfileDialogClose() - { - ConfigurationManager.Current.FixAirspace = false; - } - #endregion + SelectedTabIndex = TabItems.Count - 1; + } - #region Event - private void ProfileManager_OnProfilesUpdated(object sender, EventArgs e) - { - RefreshProfiles(); - } + // Modify history list + private static void AddUrlToHistory(string url) + { + if (string.IsNullOrEmpty(url)) + return; - private void SearchDispatcherTimer_Tick(object sender, EventArgs e) - { - StopDelayedSearch(); - } - #endregion + SettingsManager.Current.WebConsole_UrlHistory = new ObservableCollection( + ListHelper.Modify(SettingsManager.Current.WebConsole_UrlHistory.ToList(), url, + SettingsManager.Current.General_HistoryListEntries)); } -} \ No newline at end of file + + #endregion +} diff --git a/Source/NETworkManager/ViewModels/WebConsoleSettingsViewModel.cs b/Source/NETworkManager/ViewModels/WebConsoleSettingsViewModel.cs new file mode 100644 index 0000000000..f017858cd7 --- /dev/null +++ b/Source/NETworkManager/ViewModels/WebConsoleSettingsViewModel.cs @@ -0,0 +1,128 @@ +using MahApps.Metro.SimpleChildWindow; +using Microsoft.Web.WebView2.Core; +using NETworkManager.Localization.Resources; +using NETworkManager.Settings; +using NETworkManager.Utilities; +using NETworkManager.Views; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Input; +using System.Windows.Interop; + +namespace NETworkManager.ViewModels; + +public class WebConsoleSettingsViewModel : ViewModelBase +{ + #region Variables + + private readonly bool _isLoading; + + public bool ShowAddressBar + { + get; + set + { + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.WebConsole_ShowAddressBar = value; + + field = value; + OnPropertyChanged(); + } + } + + public bool IsStatusBarEnabled + { + get; + set + { + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.WebConsole_IsStatusBarEnabled = value; + + field = value; + OnPropertyChanged(); + } + } + + public bool IsPasswordSaveEnabled + { + get; + set + { + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.WebConsole_IsPasswordSaveEnabled = value; + + field = value; + OnPropertyChanged(); + } + } + + #endregion + + #region Constructor, load settings + + public WebConsoleSettingsViewModel() + { + _isLoading = true; + + LoadSettings(); + + _isLoading = false; + } + + private void LoadSettings() + { + ShowAddressBar = SettingsManager.Current.WebConsole_ShowAddressBar; + IsStatusBarEnabled = SettingsManager.Current.WebConsole_IsStatusBarEnabled; + IsPasswordSaveEnabled = SettingsManager.Current.WebConsole_IsPasswordSaveEnabled; + } + + #endregion + + #region ICommands & Actions + + public ICommand DeleteBrowsingDataCommand => new RelayCommand(_ => DeleteBrowsingDataAction()); + + private void DeleteBrowsingDataAction() + { + _ = DeleteBrowsingData(); + } + + #endregion + + #region Methods + + private async Task DeleteBrowsingData() + { + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, + Strings.DeleteBrowsingData, + Strings.DeleteBrowsingDataMessage, + ChildWindowIcon.Info, + Strings.Delete); + + if (!result) + return; + + // Create a temporary WebView2 instance to clear browsing data + var webView2Environment = + await CoreWebView2Environment.CreateAsync(null, GlobalStaticConfiguration.WebConsole_Cache); + + var windowHwnd = new WindowInteropHelper(Application.Current.MainWindow).Handle; + + var webView2Controller = await webView2Environment.CreateCoreWebView2ControllerAsync(windowHwnd); + + await webView2Controller.CoreWebView2.Profile.ClearBrowsingDataAsync(); + + webView2Controller.Close(); + } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/WelcomeViewModel.cs b/Source/NETworkManager/ViewModels/WelcomeViewModel.cs new file mode 100644 index 0000000000..eb5d822bb6 --- /dev/null +++ b/Source/NETworkManager/ViewModels/WelcomeViewModel.cs @@ -0,0 +1,88 @@ +using NETworkManager.Settings; +using NETworkManager.Utilities; +using System; +using System.Windows.Input; + +namespace NETworkManager.ViewModels; + +public class WelcomeViewModel : ViewModelBase +{ + public WelcomeViewModel(Action continueCommand) + { + ContinueCommand = new RelayCommand(_ => continueCommand(this)); + } + + public ICommand OpenWebsiteCommand => new RelayCommand(OpenWebsiteAction); + + private static void OpenWebsiteAction(object url) + { + ExternalProcessStarter.OpenUrl((string)url); + } + + public ICommand ContinueCommand { get; } + + public bool CheckForUpdatesAtStartup + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.Update_CheckForUpdatesAtStartup; + + public bool CheckPublicIPAddress + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.Dashboard_CheckPublicIPAddress; + + public bool CheckIPApiIPGeolocation + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.Dashboard_CheckIPApiIPGeolocation; + + public bool CheckIPApiDNSResolver + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.Dashboard_CheckIPApiDNSResolver; + + public bool PowerShellModifyGlobalProfile + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/WhoisHostViewModel.cs b/Source/NETworkManager/ViewModels/WhoisHostViewModel.cs index 03d924a484..6a1ecd6199 100644 --- a/Source/NETworkManager/ViewModels/WhoisHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/WhoisHostViewModel.cs @@ -1,376 +1,122 @@ -using System; -using System.Collections.ObjectModel; -using System.ComponentModel; -using System.Linq; -using System.Windows; -using System.Windows.Data; -using NETworkManager.Controls; using Dragablz; -using System.Windows.Input; -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.Settings; -using NETworkManager.Views; -using NETworkManager.Utilities; -using NETworkManager.Profiles; -using System.Windows.Threading; +using NETworkManager.Controls; +using NETworkManager.Localization.Resources; using NETworkManager.Models; -using System.Collections.Generic; - -namespace NETworkManager.ViewModels -{ - public class WhoisHostViewModel : ViewModelBase, IProfileManager - { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - private readonly DispatcherTimer _searchDispatcherTimer = new DispatcherTimer(); - - public IInterTabClient InterTabClient { get; } - public ObservableCollection TabItems { get; } - - private readonly bool _isLoading = true; - private bool _isViewActive = true; - - private int _tabId; - - private int _selectedTabIndex; - public int SelectedTabIndex - { - get => _selectedTabIndex; - set - { - if (value == _selectedTabIndex) - return; - - _selectedTabIndex = value; - OnPropertyChanged(); - } - } - - #region Profiles - public ICollectionView Profiles { get; } - - private ProfileInfo _selectedProfile = new ProfileInfo(); - public ProfileInfo SelectedProfile - { - get => _selectedProfile; - set - { - if (value == _selectedProfile) - return; - - _selectedProfile = value; - OnPropertyChanged(); - } - } - - private string _search; - public string Search - { - get => _search; - set - { - if (value == _search) - return; - - _search = value; - - StartDelayedSearch(); - - OnPropertyChanged(); - } - } - - private bool _isSearching; - public bool IsSearching - { - get => _isSearching; - set - { - if (value == _isSearching) - return; - - _isSearching = value; - OnPropertyChanged(); - } - } - - private bool _canProfileWidthChange = true; - private double _tempProfileWidth; - - private bool _expandProfileView; - public bool ExpandProfileView - { - get => _expandProfileView; - set - { - if (value == _expandProfileView) - return; - - if (!_isLoading) - SettingsManager.Current.Whois_ExpandProfileView = value; - - _expandProfileView = value; - - if (_canProfileWidthChange) - ResizeProfile(false); - - OnPropertyChanged(); - } - } - - private GridLength _profileWidth; - public GridLength ProfileWidth - { - get => _profileWidth; - set - { - if (value == _profileWidth) - return; - - if (!_isLoading && Math.Abs(value.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > GlobalStaticConfiguration.FloatPointFix) // Do not save the size when collapsed - SettingsManager.Current.Whois_ProfileWidth = value.Value; - - _profileWidth = value; - - if (_canProfileWidthChange) - ResizeProfile(true); - - OnPropertyChanged(); - } - } - #endregion - #endregion - - #region Constructor - public WhoisHostViewModel(IDialogCoordinator instance) - { - _dialogCoordinator = instance; - - InterTabClient = new DragablzInterTabClient(ApplicationName.Whois); - - TabItems = new ObservableCollection - { - new DragablzTabItem(Localization.Resources.Strings.NewTab, new WhoisView (_tabId), _tabId) - }; - - Profiles = new CollectionViewSource { Source = ProfileManager.Groups.SelectMany(x => x.Profiles) }.View; - Profiles.GroupDescriptions.Add(new PropertyGroupDescription(nameof(ProfileInfo.Group))); - Profiles.SortDescriptions.Add(new SortDescription(nameof(ProfileInfo.Group), ListSortDirection.Ascending)); - Profiles.SortDescriptions.Add(new SortDescription(nameof(ProfileInfo.Name), ListSortDirection.Ascending)); - Profiles.Filter = o => - { - if (!(o is ProfileInfo info)) - return false; - - if (string.IsNullOrEmpty(Search)) - return info.Whois_Enabled; - - var search = Search.Trim(); - - // Search by: Tag=xxx (exact match, ignore case) - /* - if (search.StartsWith(ProfileManager.TagIdentifier, StringComparison.OrdinalIgnoreCase)) - return !string.IsNullOrEmpty(info.Tags) && info.Whois_Enabled && info.Tags.Replace(" ", "").Split(';').Any(str => search.Substring(ProfileManager.TagIdentifier.Length, search.Length - ProfileManager.TagIdentifier.Length).Equals(str, StringComparison.OrdinalIgnoreCase)); - */ - - // Search by: Name, Whois_Domain - return info.Whois_Enabled && (info.Name.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1 || info.Whois_Domain.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1); - }; - - // This will select the first entry as selected item... - SelectedProfile = Profiles.SourceCollection.Cast().Where(x => x.Whois_Enabled).OrderBy(x => x.Group).ThenBy(x => x.Name).FirstOrDefault(); - - ProfileManager.OnProfilesUpdated += ProfileManager_OnProfilesUpdated; - - _searchDispatcherTimer.Interval = GlobalStaticConfiguration.SearchDispatcherTimerTimeSpan; - _searchDispatcherTimer.Tick += SearchDispatcherTimer_Tick; - - LoadSettings(); - - _isLoading = false; - } - - private void LoadSettings() - { - ExpandProfileView = SettingsManager.Current.Whois_ExpandProfileView; - - ProfileWidth = ExpandProfileView ? new GridLength(SettingsManager.Current.Whois_ProfileWidth) : new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); - - _tempProfileWidth = SettingsManager.Current.Whois_ProfileWidth; - } - - #endregion - - #region ICommand & Actions - public ICommand AddTabCommand => new RelayCommand(p => AddTabAction()); - - private void AddTabAction() - { - AddTab(); - } - - public ICommand QueryProfileCommand => new RelayCommand(p => QueryProfileAction(), QueryProfile_CanExecute); - - private bool QueryProfile_CanExecute(object obj) - { - return !IsSearching && SelectedProfile != null; - } +using NETworkManager.Profiles; +using NETworkManager.Utilities; +using NETworkManager.Views; +using System; +using System.Collections.ObjectModel; +using System.Windows.Input; - private void QueryProfileAction() - { - AddTab(SelectedProfile.Whois_Domain); - } +namespace NETworkManager.ViewModels; +public class WhoisHostViewModel : ProfileHostViewModelBase +{ + #region Variables - public ICommand AddProfileCommand => new RelayCommand(p => AddProfileAction()); + public IInterTabClient InterTabClient { get; } - private void AddProfileAction() + public string InterTabPartition + { + get; + set { - ProfileDialogManager.ShowAddProfileDialog(this, _dialogCoordinator); - } - - public ICommand EditProfileCommand => new RelayCommand(p => EditProfileAction()); + if (value == field) + return; - private void EditProfileAction() - { - ProfileDialogManager.ShowEditProfileDialog(this, _dialogCoordinator, SelectedProfile); + field = value; + OnPropertyChanged(); } + } - public ICommand CopyAsProfileCommand => new RelayCommand(p => CopyAsProfileAction()); + public ObservableCollection TabItems { get; } - private void CopyAsProfileAction() + public int SelectedTabIndex + { + get; + set { - ProfileDialogManager.ShowCopyAsProfileDialog(this, _dialogCoordinator, SelectedProfile); - } - - public ICommand DeleteProfileCommand => new RelayCommand(p => DeleteProfileAction()); + if (value == field) + return; - private void DeleteProfileAction() - { - ProfileDialogManager.ShowDeleteProfileDialog(this, _dialogCoordinator, new List { SelectedProfile }); + field = value; + OnPropertyChanged(); } + } - public ICommand EditGroupCommand => new RelayCommand(EditGroupAction); + #endregion - private void EditGroupAction(object group) - { - ProfileDialogManager.ShowEditGroupDialog(this, _dialogCoordinator, ProfileManager.GetGroup(group.ToString())); - } + #region Constructor - public ICommand ClearSearchCommand => new RelayCommand(p => ClearSearchAction()); + public WhoisHostViewModel() + { + InterTabClient = new DragablzInterTabClient(ApplicationName.Whois); + InterTabPartition = nameof(ApplicationName.Whois); - private void ClearSearchAction() - { - Search = string.Empty; - } + var tabId = Guid.NewGuid(); - public ItemActionCallback CloseItemCommand => CloseItemAction; + TabItems = + [ + new DragablzTabItem(Strings.NewTab, new WhoisView(tabId), tabId) + ]; - private static void CloseItemAction(ItemActionCallbackArgs args) - { - ((args.DragablzItem.Content as DragablzTabItem)?.View as WhoisView)?.CloseTab(); - } - #endregion + InitializeProfileHost(); + } - #region Methods - private void StartDelayedSearch() - { - if (!IsSearching) - { - IsSearching = true; - - _searchDispatcherTimer.Start(); - } - else - { - _searchDispatcherTimer.Stop(); - _searchDispatcherTimer.Start(); - } - } + #endregion - private void StopDelayedSearch() - { - _searchDispatcherTimer.Stop(); + #region Profile host - RefreshProfiles(); + protected override ApplicationName ApplicationName => ApplicationName.Whois; - IsSearching = false; - } + protected override bool IsProfileEnabled(ProfileInfo profile) => profile.Whois_Enabled; - private void ResizeProfile(bool dueToChangedSize) - { - _canProfileWidthChange = false; - - if (dueToChangedSize) - { - ExpandProfileView = Math.Abs(ProfileWidth.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > GlobalStaticConfiguration.FloatPointFix; - } - else - { - if (ExpandProfileView) - { - ProfileWidth = Math.Abs(_tempProfileWidth - GlobalStaticConfiguration.Profile_WidthCollapsed) < GlobalStaticConfiguration.FloatPointFix ? new GridLength(GlobalStaticConfiguration.Profile_DefaultWidthExpanded) : new GridLength(_tempProfileWidth); - } - else - { - _tempProfileWidth = ProfileWidth.Value; - ProfileWidth = new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); - } - } - - _canProfileWidthChange = true; - } + protected override string GetSearchableField(ProfileInfo profile) => profile.Whois_Domain; - private void AddTab(string domain = null) - { - _tabId++; + #endregion - TabItems.Add(new DragablzTabItem(domain ?? Localization.Resources.Strings.NewTab, new WhoisView(_tabId, domain), _tabId)); + #region ICommand & Actions - SelectedTabIndex = TabItems.Count - 1; - } + public ICommand AddTabCommand => new RelayCommand(_ => AddTabAction()); - public void OnViewVisible() - { - _isViewActive = true; + private void AddTabAction() + { + AddTab(); + } - RefreshProfiles(); - } + public ICommand QueryProfileCommand => new RelayCommand(_ => QueryProfileAction(), QueryProfile_CanExecute); - public void OnViewHide() - { - _isViewActive = false; - } + private bool QueryProfile_CanExecute(object obj) + { + return !IsSearching && SelectedProfile != null; + } - public void RefreshProfiles() - { - if (!_isViewActive) - return; + private void QueryProfileAction() + { + AddTab(SelectedProfile.Whois_Domain); + } - Profiles.Refresh(); - } + public ItemActionCallback CloseItemCommand => CloseItemAction; - public void OnProfileDialogOpen() - { + private static void CloseItemAction(ItemActionCallbackArgs args) + { + ((args.DragablzItem.Content as DragablzTabItem)?.View as IDragablzTabItem)?.CloseTab(); + } - } + #endregion - public void OnProfileDialogClose() - { + #region Methods - } - #endregion + private void AddTab(string domain = null) + { + var tabId = Guid.NewGuid(); - #region Event - private void ProfileManager_OnProfilesUpdated(object sender, EventArgs e) - { - RefreshProfiles(); - } + TabItems.Add(new DragablzTabItem(domain ?? Strings.NewTab, new WhoisView(tabId, domain), + tabId)); - private void SearchDispatcherTimer_Tick(object sender, EventArgs e) - { - StopDelayedSearch(); - } - #endregion + SelectedTabIndex = TabItems.Count - 1; } -} \ No newline at end of file + + #endregion +} diff --git a/Source/NETworkManager/ViewModels/WhoisSettingsViewModel.cs b/Source/NETworkManager/ViewModels/WhoisSettingsViewModel.cs deleted file mode 100644 index c9976fed90..0000000000 --- a/Source/NETworkManager/ViewModels/WhoisSettingsViewModel.cs +++ /dev/null @@ -1,30 +0,0 @@ -using NETworkManager.Settings; -using NETworkManager.Utilities; - -namespace NETworkManager.ViewModels -{ - public class WhoisSettingsViewModel : ViewModelBase - { - #region Variables - private readonly bool _isLoading; - - - #endregion - - #region Contructor, load settings - public WhoisSettingsViewModel() - { - _isLoading = true; - - LoadSettings(); - - _isLoading = false; - } - - private void LoadSettings() - { - - } - #endregion - } -} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/WhoisViewModel.cs b/Source/NETworkManager/ViewModels/WhoisViewModel.cs index 10c637c515..c272c874ca 100644 --- a/Source/NETworkManager/ViewModels/WhoisViewModel.cs +++ b/Source/NETworkManager/ViewModels/WhoisViewModel.cs @@ -1,260 +1,276 @@ -using NETworkManager.Models.Network; -using System; -using System.Windows.Input; -using NETworkManager.Settings; -using System.ComponentModel; -using System.Windows.Data; -using System.Linq; -using NETworkManager.Utilities; -using System.Windows; -using NETworkManager.Controls; -using Dragablz; +using log4net; using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.Models.Export; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Controls; using NETworkManager.Localization.Resources; +using NETworkManager.Models.Export; +using NETworkManager.Models.Network; +using NETworkManager.Settings; +using NETworkManager.Utilities; using NETworkManager.Views; +using System; +using System.ComponentModel; +using System.Linq; using System.Threading.Tasks; +using System.Windows; +using System.Windows.Data; +using System.Windows.Input; + +namespace NETworkManager.ViewModels; -namespace NETworkManager.ViewModels +public class WhoisViewModel : ViewModelBase { - public class WhoisViewModel : ViewModelBase - { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - - public readonly int TabId; - private bool _firstLoad = true; + #region Variables + private static readonly ILog Log = LogManager.GetLogger(typeof(WhoisViewModel)); - private readonly bool _isLoading; + private readonly Guid _tabId; + private bool _firstLoad = true; + private bool _closed; - private string _domain; - public string Domain + public string Domain + { + get; + set { - get => _domain; - set - { - if (value == _domain) - return; + if (value == field) + return; - _domain = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - public ICollectionView WebsiteUriHistoryView { get; } + public ICollectionView WebsiteUriHistoryView { get; } - private bool _isWhoisRunning; - public bool IsWhoisRunning + public bool IsRunning + { + get; + set { - get => _isWhoisRunning; - set - { - if (value == _isWhoisRunning) - return; + if (value == field) + return; - _isWhoisRunning = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _whoisResult; - public string WhoisResult + public bool IsResultVisible + { + get; + set { - get => _whoisResult; - set - { - if (value == _whoisResult) - return; + if (value == field) + return; - _whoisResult = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isStatusMessageDisplayed; - public bool IsStatusMessageDisplayed + public string Result + { + get; + set { - get => _isStatusMessageDisplayed; - set - { - if (value == _isStatusMessageDisplayed) - return; + if (value == field) + return; - _isStatusMessageDisplayed = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private string _statusMessage; - public string StatusMessage + public bool IsStatusMessageDisplayed + { + get; + set { - get => _statusMessage; - set - { - if (value == _statusMessage) - return; + if (value == field) + return; - _statusMessage = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } - #endregion + } - #region Contructor, load settings - public WhoisViewModel(IDialogCoordinator instance ,int tabId, string domain) + public string StatusMessage + { + get; + private set { - _isLoading = true; + if (value == field) + return; - _dialogCoordinator = instance; + field = value; + OnPropertyChanged(); + } + } - TabId = tabId; - Domain = domain; + #endregion - // Set collection view - WebsiteUriHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.Whois_DomainHistory); + #region Contructor, load settings - LoadSettings(); + public WhoisViewModel(Guid tabId, string domain) + { + ConfigurationManager.Current.WhoisTabCount++; - // Detect if settings have changed... - SettingsManager.Current.PropertyChanged += SettingsManager_PropertyChanged; + _tabId = tabId; + Domain = domain; - _isLoading = false; - } + // Set collection view + WebsiteUriHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.Whois_DomainHistory); - public void OnLoaded() - { - if (!_firstLoad) - return; + LoadSettings(); + } - if (!string.IsNullOrEmpty(Domain)) - Query(); + public void OnLoaded() + { + if (!_firstLoad) + return; - _firstLoad = false; - } + if (!string.IsNullOrEmpty(Domain)) + _ = Query(); - private void LoadSettings() - { + _firstLoad = false; + } - } - #endregion + private void LoadSettings() + { + } - #region ICommands & Actions - public ICommand QueryCommand => new RelayCommand(p => QueryAction(), Query_CanExecute); + #endregion - private bool Query_CanExecute(object paramter) => Application.Current.MainWindow != null && !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen; + #region ICommands & Actions - private void QueryAction() - { - Query(); - } + public ICommand QueryCommand => new RelayCommand(_ => QueryAction(), Query_CanExecute); - public ICommand ExportCommand => new RelayCommand(p => ExportAction()); + private bool Query_CanExecute(object parameter) + { + return Application.Current.MainWindow != null && + !((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen && + !ConfigurationManager.Current.IsChildWindowOpen; + } - private async Task ExportAction() - { - var customDialog = new CustomDialog - { - Title = Strings.Export - }; + private void QueryAction() + { + _ = Query(); + } - var exportViewModel = new ExportViewModel(async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + public ICommand ExportCommand => new RelayCommand(_ => ExportAction()); + + private void ExportAction() + { + _ = Export(); + } + + #endregion + + #region Methods + + private async Task Query() + { + IsStatusMessageDisplayed = false; + IsResultVisible = false; + IsRunning = true; - try - { - ExportManager.Export(instance.FilePath, WhoisResult); - } - catch (Exception ex) - { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; + Result = null; - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); - } + DragablzTabItem.SetTabHeader(_tabId, Domain); - SettingsManager.Current.Whois_ExportFileType = instance.FileType; - SettingsManager.Current.Whois_ExportFilePath = instance.FilePath; - }, instance => { _dialogCoordinator.HideMetroDialogAsync(this, customDialog); }, new ExportManager.ExportFileType[] { ExportManager.ExportFileType.TXT}, false, SettingsManager.Current.Whois_ExportFileType, SettingsManager.Current.Whois_ExportFilePath); + try + { + var whoisServer = Whois.GetWhoisServer(Domain); - customDialog.Content = new ExportDialog + if (string.IsNullOrEmpty(whoisServer)) { - DataContext = exportViewModel - }; + StatusMessage = string.Format(Strings.WhoisServerNotFoundForTheDomain, Domain); + IsStatusMessageDisplayed = true; + } + else + { + Result = await Whois.QueryAsync(Domain, whoisServer); + IsResultVisible = true; - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); + AddDomainToHistory(Domain); + } } - #endregion - - #region Methods - private async Task Query() + catch (Exception ex) { - IsStatusMessageDisplayed = false; - IsWhoisRunning = true; + StatusMessage = ex.Message; + IsStatusMessageDisplayed = true; + } - WhoisResult = null; + IsRunning = false; + } - // Change the tab title (not nice, but it works) - var window = Application.Current.Windows.OfType().FirstOrDefault(x => x.IsActive); + public void OnClose() + { + // Prevent multiple calls + if (_closed) + return; - if (window != null) - { - foreach (var tabablzControl in VisualTreeHelper.FindVisualChildren(window)) - { - tabablzControl.Items.OfType().First(x => x.Id == TabId).Header = Domain; - } - } + _closed = true; + + ConfigurationManager.Current.WhoisTabCount--; + } + + private void AddDomainToHistory(string domain) + { + // Create the new list + var list = ListHelper.Modify(SettingsManager.Current.Whois_DomainHistory.ToList(), domain, + SettingsManager.Current.General_HistoryListEntries); + + // Clear the old items + SettingsManager.Current.Whois_DomainHistory.Clear(); + OnPropertyChanged(nameof(Domain)); // Raise property changed again, after the collection has been cleared + + // Fill with the new items + list.ForEach(x => SettingsManager.Current.Whois_DomainHistory.Add(x)); + } + + private Task Export() + { + var window = Application.Current.Windows.OfType().FirstOrDefault(x => x.IsActive); + + var childWindow = new ExportChildWindow(); + + var childWindowViewModel = new ExportViewModel(async instance => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; try { - var whoisServer = Whois.GetWhoisServer(Domain); - - if (string.IsNullOrEmpty(whoisServer)) - { - StatusMessage = string.Format(Strings.WhoisServerNotFoundForTheDomain, Domain); - IsStatusMessageDisplayed = true; - } - else - { - WhoisResult = await Whois.QueryAsync(Domain, whoisServer); - - AddDomainToHistory(Domain); - } + ExportManager.Export(instance.FilePath, Result); } catch (Exception ex) { - StatusMessage = ex.Message; - IsStatusMessageDisplayed = true; - } + Log.Error("Error while exporting data as " + instance.FileType, ex); - IsWhoisRunning = false; - } + await DialogHelper.ShowMessageAsync(window, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); + } - public void OnClose() + SettingsManager.Current.Whois_ExportFileType = instance.FileType; + SettingsManager.Current.Whois_ExportFilePath = instance.FilePath; + }, _ => { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, [ + ExportFileType.Txt + ], false, SettingsManager.Current.Whois_ExportFileType, SettingsManager.Current.Whois_ExportFilePath); - } - - private void AddDomainToHistory(string websiteUri) - { - // Create the new list - var list = ListHelper.Modify(SettingsManager.Current.Whois_DomainHistory.ToList(), websiteUri, SettingsManager.Current.General_HistoryListEntries); + childWindow.Title = Strings.Export; - // Clear the old items - SettingsManager.Current.Whois_DomainHistory.Clear(); - OnPropertyChanged(nameof(Domain)); // Raise property changed again, after the collection has been cleared + childWindow.DataContext = childWindowViewModel; - // Fill with the new items - list.ForEach(x => SettingsManager.Current.Whois_DomainHistory.Add(x)); - } - #endregion + ConfigurationManager.Current.IsChildWindowOpen = true; - #region Events - private void SettingsManager_PropertyChanged(object sender, PropertyChangedEventArgs e) - { - - } - #endregion + return window.ShowChildWindowAsync(childWindow); } + + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/WiFiConnectViewModel.cs b/Source/NETworkManager/ViewModels/WiFiConnectViewModel.cs new file mode 100644 index 0000000000..7c706f9ca7 --- /dev/null +++ b/Source/NETworkManager/ViewModels/WiFiConnectViewModel.cs @@ -0,0 +1,309 @@ +using NETworkManager.Models.Network; +using NETworkManager.Utilities; +using NETworkManager.Settings; +using System; +using System.Security; +using System.Threading.Tasks; +using System.Windows.Input; + +namespace NETworkManager.ViewModels; + +public class WiFiConnectViewModel : ViewModelBase +{ + /// + /// Current WiFi adapter info and network info. + /// + public readonly (WiFiAdapterInfo AdapterInfo, WiFiNetworkInfo NetworkInfo) Options; + + /// + /// Initialize a new class with and + /// . + /// + /// which is executed on OK click. + /// which is executed on WPS click. + /// which is executed on cancel click. + /// Current WiFi adapter info and network info. + /// + /// WiFi connect mode like , + /// or . + /// + public WiFiConnectViewModel(Action okCommand, Action connectWpsCommand, + Action cancelHandler, (WiFiAdapterInfo AdapterInfo, WiFiNetworkInfo NetworkInfo) options, + WiFiConnectMode connectMode) + { + ConnectCommand = new RelayCommand(_ => okCommand(this)); + ConnectWpsCommand = new RelayCommand(_ => connectWpsCommand(this)); + CancelCommand = new RelayCommand(_ => cancelHandler(this)); + + Options = options; + ConnectMode = connectMode; + + // Get Ssid to connect to hidden network + IsSsidRequired = Options.NetworkInfo.IsHidden; + } + + /// + /// Command which is called when the Connect button is clicked. + /// + public ICommand ConnectCommand { get; } + + /// + /// Command which is called when the Connect WPS button is clicked. + /// + public ICommand ConnectWpsCommand { get; } + + /// + /// Command which is called when the cancel button is clicked. + /// + public ICommand CancelCommand { get; } + + /// + /// WiFi connect mode like , or + /// . + /// + public WiFiConnectMode ConnectMode + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Indicate if the SSID field is required. + /// This is the case for hidden networks. + /// + public bool IsSsidRequired + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// SSID of the network. + /// + public string Ssid + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Indicate if the network should be connected automatically. + /// + public bool ConnectAutomatically + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Pre-shared key as . + /// + public SecureString PreSharedKey + { + get; + set + { + if (value == field) + return; + + field = value; + + ValidatePreSharedKey(); + + OnPropertyChanged(); + } + } = new(); + + /// + /// Indicate if the Pre-shared-key field is empty. + /// + public bool IsPreSharedKeyEmpty + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = true; + + /// + /// Use credentials for EAP authentication. + /// + public bool UseCredentials + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = true; + + /// + /// Username for EAP authentication. + /// + public string Username + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Domain for EAP authentication. + /// + public string Domain + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Password as for EAP authentication. + /// + public SecureString Password + { + get; + set + { + if (value == field) + return; + + field = value; + + ValidatePassword(); + + OnPropertyChanged(); + } + } = new(); + + /// + /// Indicate if the password field is empty. + /// + public bool IsPasswordEmpty + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = true; + + /// + /// Checking if WPS is available for the network. + /// + public bool IsWpsChecking + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Indicate if WPS is available for the network. + /// + public bool IsWpsAvailable + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public async Task CheckWpsAsync() + { + // Only check if WPS is available for networks secured by Pre-shared key who are not hidden + if (ConnectMode != WiFiConnectMode.Psk || Options.NetworkInfo.IsHidden) + return; + + IsWpsChecking = true; + // Make the user happy, let him see a reload animation (and he cannot spam the reload command) + await Task.Delay(GlobalStaticConfiguration.ApplicationUIRefreshInterval / 2); + + IsWpsAvailable = + await WiFi.IsWpsAvailable(Options.AdapterInfo.WiFiAdapter, Options.NetworkInfo.AvailableNetwork); + + // Make the user happy, let him see a reload animation (and he cannot spam the reload command) + await Task.Delay(GlobalStaticConfiguration.ApplicationUIRefreshInterval / 2); + IsWpsChecking = false; + } + + /// + /// Check if the Pre-shared key is valid. + /// + private void ValidatePreSharedKey() + { + IsPreSharedKeyEmpty = PreSharedKey == null || PreSharedKey.Length == 0; + } + + /// + /// Check if the password is valid. + /// + private void ValidatePassword() + { + IsPasswordEmpty = Password == null || Password.Length == 0; + } +} diff --git a/Source/NETworkManager/ViewModels/WiFiViewModel.cs b/Source/NETworkManager/ViewModels/WiFiViewModel.cs index d18f649af9..43e2ed1c5b 100644 --- a/Source/NETworkManager/ViewModels/WiFiViewModel.cs +++ b/Source/NETworkManager/ViewModels/WiFiViewModel.cs @@ -1,637 +1,1340 @@ -using LiveCharts; -using LiveCharts.Wpf; -using MahApps.Metro.Controls.Dialogs; +using LiveChartsCore; +using LiveChartsCore.Drawing; +using LiveChartsCore.Kernel; +using LiveChartsCore.SkiaSharpView; +using LiveChartsCore.SkiaSharpView.Painting; +using LiveChartsCore.SkiaSharpView.Painting.Effects; +using log4net; +using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Controls; +using NETworkManager.Localization; +using NETworkManager.Localization.Resources; using NETworkManager.Models.Export; using NETworkManager.Models.Network; using NETworkManager.Settings; using NETworkManager.Utilities; using NETworkManager.Views; +using SkiaSharp; using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; -using System.IO; using System.Linq; using System.Threading.Tasks; +using System.Windows; using System.Windows.Data; +using System.Windows.Media; using System.Windows.Input; using System.Windows.Threading; using Windows.Devices.WiFi; +using Windows.Foundation.Metadata; +using Windows.Security.Credentials; +using Windows.System; -namespace NETworkManager.ViewModels +namespace NETworkManager.ViewModels; + +public class WiFiViewModel : ViewModelBase { - public class WiFiViewModel : ViewModelBase - { - #region Variables - private readonly IDialogCoordinator _dialogCoordinator; + #region Variables + private static readonly ILog Log = LogManager.GetLogger(typeof(WiFiViewModel)); - private readonly bool _isLoading; - private readonly DispatcherTimer _autoRefreshTimer = new DispatcherTimer(); - private bool _isTimerPaused; + private readonly bool _isLoading; + private readonly DispatcherTimer _autoRefreshTimer = new(); + private readonly DispatcherTimer _hideConnectionStatusMessageTimer = new(); - private bool _sdkContractsFailedToLoad; - public bool SDKContractsFailedToLoad + public bool SdkContractAvailable + { + get; + set { - get => _sdkContractsFailedToLoad; - set - { - if (value == _sdkContractsFailedToLoad) - return; + if (value == field) + return; - _sdkContractsFailedToLoad = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isAdaptersLoading; - public bool IsAdaptersLoading + public bool WiFiAdapterAccessEnabled + { + get; + set { - get => _isAdaptersLoading; - set - { - if (value == _isAdaptersLoading) - return; + if (value == field) + return; - _isAdaptersLoading = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private List _adapters = new List(); - public List Adapters + public bool IsAdaptersLoading + { + get; + set { - get => _adapters; - set - { - if (value == _adapters) - return; + if (value == field) + return; - _adapters = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private WiFiAdapterInfo _selectedAdapters; - public WiFiAdapterInfo SelectedAdapter + public List Adapters + { + get; + private set { - get => _selectedAdapters; - set - { - if (value == _selectedAdapters) - return; - - if (value != null) - { - if (!_isLoading) - SettingsManager.Current.WiFi_InterfaceId = value.NetworkInterfaceInfo.Id; - - Scan(value.WiFiAdapter); - } + if (value == field) + return; - _selectedAdapters = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = []; - private bool _isNetworksLoading; - public bool IsNetworksLoading + public WiFiAdapterInfo SelectedAdapter + { + get; + set { - get => _isNetworksLoading; - set + if (value == field) + return; + + if (value != null) { - if (value == _isNetworksLoading) - return; + if (!_isLoading) + SettingsManager.Current.WiFi_InterfaceId = value.NetworkInterfaceInfo.Id; - _isNetworksLoading = value; - OnPropertyChanged(); + _ = ScanAsync(value); } + + field = value; + OnPropertyChanged(); } + } - private bool _autoRefresh; - public bool AutoRefresh + public bool IsNetworksLoading + { + get; + set { - get => _autoRefresh; - set - { - if (value == _autoRefresh) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.WiFi_AutoRefresh = value; + field = value; + OnPropertyChanged(); + } + } - _autoRefresh = value; + public bool AutoRefreshEnabled + { + get; + set + { + if (value == field) + return; - // Start timer to refresh automatically - if (!_isLoading) - { - if (value) - StartAutoRefreshTimer(); - else - StopAutoRefreshTimer(); - } + if (!_isLoading) + SettingsManager.Current.WiFi_AutoRefreshEnabled = value; + + field = value; - OnPropertyChanged(); + // Start timer to refresh automatically + if (value) + { + _autoRefreshTimer.Interval = AutoRefreshTime.CalculateTimeSpan(SelectedAutoRefreshTime); + _autoRefreshTimer.Start(); } + else + { + _autoRefreshTimer.Stop(); + } + + OnPropertyChanged(); } + } - public ICollectionView AutoRefreshTimes { get; } + public ICollectionView AutoRefreshTimes { get; } - private AutoRefreshTimeInfo _selectedAutoRefreshTime; - public AutoRefreshTimeInfo SelectedAutoRefreshTime + public AutoRefreshTimeInfo SelectedAutoRefreshTime + { + get; + set { - get => _selectedAutoRefreshTime; - set - { - if (value == _selectedAutoRefreshTime) - return; - - if (!_isLoading) - SettingsManager.Current.WiFi_AutoRefreshTime = value; + if (value == field) + return; - _selectedAutoRefreshTime = value; + if (!_isLoading) + SettingsManager.Current.WiFi_AutoRefreshTime = value; - if (AutoRefresh) - ChangeAutoRefreshTimerInterval(AutoRefreshTime.CalculateTimeSpan(value)); + field = value; - OnPropertyChanged(); + if (AutoRefreshEnabled) + { + _autoRefreshTimer.Interval = AutoRefreshTime.CalculateTimeSpan(value); + _autoRefreshTimer.Start(); } + + OnPropertyChanged(); } + } - private string _search; - public string Search + public string Search + { + get; + set { - get => _search; - set - { - if (value == _search) - return; + if (value == field) + return; - _search = value; + field = value; - NetworksView.Refresh(); + NetworksView.Refresh(); - OnPropertyChanged(); - } + OnPropertyChanged(); } + } - private bool _show2dot4GHzNetworks; - public bool Show2dot4GHzNetworks + public bool Show2Dot4GHzNetworks + { + get; + set { - get => _show2dot4GHzNetworks; - set - { - if (value == _show2dot4GHzNetworks) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.WiFi_Show2dot4GHzNetworks = value; + if (!_isLoading) + SettingsManager.Current.WiFi_Show2dot4GHzNetworks = value; - _show2dot4GHzNetworks = value; + field = value; - NetworksView.Refresh(); + NetworksView.Refresh(); - OnPropertyChanged(); - } + OnPropertyChanged(); } + } - private bool _show5GHzNetworks; - public bool Show5GHzNetworks + public bool Show5GHzNetworks + { + get; + set { - get => _show5GHzNetworks; - set - { - if (value == _show5GHzNetworks) - return; + if (value == field) + return; - if (!_isLoading) - SettingsManager.Current.WiFi_Show5GHzNetworks = value; + if (!_isLoading) + SettingsManager.Current.WiFi_Show5GHzNetworks = value; - _show5GHzNetworks = value; + field = value; - NetworksView.Refresh(); + NetworksView.Refresh(); - OnPropertyChanged(); - } + OnPropertyChanged(); } + } - private ObservableCollection _networks = new ObservableCollection(); - public ObservableCollection Networks + public bool Show6GHzNetworks + { + get; + set { - get => _networks; - set - { - if (value != null && value == _networks) - return; + if (value == field) + return; - _networks = value; - OnPropertyChanged(); - } - } + if (!_isLoading) + SettingsManager.Current.WiFi_Show6GHzNetworks = value; - public ICollectionView NetworksView { get; } + field = value; - private WiFiNetworkInfo _selectedNetwork; - public WiFiNetworkInfo SelectedNetwork - { - get => _selectedNetwork; - set - { - if (value == _selectedNetwork) - return; + NetworksView.Refresh(); - _selectedNetwork = value; - OnPropertyChanged(); - } + OnPropertyChanged(); } + } - private IList _selectedNetworks = new ArrayList(); - public IList SelectedNetworks + public ObservableCollection Networks + { + get; + init { - get => _selectedNetworks; - set - { - if (Equals(value, _selectedNetworks)) - return; + if (value != null && value == field) + return; - _selectedNetworks = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = new(); - public SeriesCollection Radio1Series { get; set; } = new SeriesCollection(); - public string[] Radio1Labels { get; set; } = new string[] { " ", " ", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", " ", " " }; - public SeriesCollection Radio2Series { get; set; } = new SeriesCollection(); - public string[] Radio2Labels { get; set; } = new string[] { " ", " ", "36", "40", "44", "48", "52", "56", "60", "64", "", "", "", "", "100", "104", "108", "112", "116", "120", "124", "128", "132", "136", "140", "144", "149", "153", "157", "161", "165", " ", " " }; - public Func FormatterdBm { get; set; } = value => $"- {100 - value} dBm"; // Reverse y-axis 0 to -100 + public ICollectionView NetworksView { get; } - private bool _isStatusMessageDisplayed; - public bool IsStatusMessageDisplayed + public WiFiNetworkInfo SelectedNetwork + { + get; + set { - get => _isStatusMessageDisplayed; - set - { - if (value == _isStatusMessageDisplayed) - return; + if (value == field) + return; - _isStatusMessageDisplayed = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } - private bool _isBackgroundSearchRunning; - public bool IsBackgroundSearchRunning + public IList SelectedNetworks + { + get; + set { - get => _isBackgroundSearchRunning; - set - { - if (value == _isBackgroundSearchRunning) - return; + if (Equals(value, field)) + return; - _isBackgroundSearchRunning = value; - OnPropertyChanged(); - } + field = value; + OnPropertyChanged(); } + } = new ArrayList(); - private string _statusMessage; - public string StatusMessage + public ISeries[] Radio2Dot4GHzSeries + { + get; + private set { - get => _statusMessage; - set - { - if (value == _statusMessage) - return; + field = value; + OnPropertyChanged(); + } + } = []; - _statusMessage = value; - OnPropertyChanged(); - } + public ISeries[] Radio5GHzSeries + { + get; + private set + { + field = value; + OnPropertyChanged(); } - #endregion + } = []; - #region Constructor, load settings - public WiFiViewModel(IDialogCoordinator instance) + // 6 GHz spans a very wide range (channels 1-233). It is split into a lower (1-125) and an upper + // (129-233) chart for readability, similar to the UniFi channel view. + public ISeries[] Radio6GHzLowerSeries + { + get; + private set { - _isLoading = true; + field = value; + OnPropertyChanged(); + } + } = []; - _dialogCoordinator = instance; + public ISeries[] Radio6GHzUpperSeries + { + get; + private set + { + field = value; + OnPropertyChanged(); + } + } = []; - // Result view + search - NetworksView = CollectionViewSource.GetDefaultView(Networks); - NetworksView.SortDescriptions.Add(new SortDescription(nameof(WiFiNetworkInfo.SSID), ListSortDirection.Ascending)); - NetworksView.Filter = o => - { - if (o is WiFiNetworkInfo info) - { - if (WiFi.Is2dot4GHzNetwork(info.ChannelCenterFrequencyInKilohertz) && !Show2dot4GHzNetworks) - return false; + public Axis[] Radio2Dot4GHzXAxes { get; private set; } + public Axis[] Radio5GHzXAxes { get; private set; } + public Axis[] Radio6GHzLowerXAxes { get; private set; } + public Axis[] Radio6GHzUpperXAxes { get; private set; } - if (WiFi.Is5GHzNetwork(info.ChannelCenterFrequencyInKilohertz) && !Show5GHzNetworks) - return false; + public Axis[] Radio2Dot4GHzYAxes { get; private set; } + public Axis[] Radio5GHzYAxes { get; private set; } + public Axis[] Radio6GHzLowerYAxes { get; private set; } + public Axis[] Radio6GHzUpperYAxes { get; private set; } - if (string.IsNullOrEmpty(Search)) - return true; + public RectangularSection[] Radio2Dot4GHzSections { get; private set; } + public RectangularSection[] Radio5GHzSections { get; private set; } + public RectangularSection[] Radio6GHzLowerSections { get; private set; } + public RectangularSection[] Radio6GHzUpperSections { get; private set; } - return info.SSID.IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || info.BSSID.IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1; - } - else - { - return false; - } - }; + public WiFiChannelLegendEntry[] Radio2Dot4GHzLegend + { + get; + private set + { + field = value; + OnPropertyChanged(); + } + } = []; - AutoRefreshTimes = CollectionViewSource.GetDefaultView(AutoRefreshTime.GetDefaults); - SelectedAutoRefreshTime = AutoRefreshTimes.SourceCollection.Cast().FirstOrDefault(x => (x.Value == SettingsManager.Current.WiFi_AutoRefreshTime.Value && x.TimeUnit == SettingsManager.Current.WiFi_AutoRefreshTime.TimeUnit)); + public WiFiChannelLegendEntry[] Radio5GHzLegend + { + get; + private set + { + field = value; + OnPropertyChanged(); + } + } = []; - _autoRefreshTimer.Tick += AutoRefreshTimer_Tick; + public WiFiChannelLegendEntry[] Radio6GHzLowerLegend + { + get; + private set + { + field = value; + OnPropertyChanged(); + } + } = []; - LoadSettings(); + public WiFiChannelLegendEntry[] Radio6GHzUpperLegend + { + get; + private set + { + field = value; + OnPropertyChanged(); + } + } = []; - LoadAdapters(); + public bool IsStatusMessageDisplayed + { + get; + set + { + if (value == field) + return; - _isLoading = false; + field = value; + OnPropertyChanged(); } + } - private void LoadSettings() + public bool IsBackgroundSearchRunning + { + get; + set { - Show2dot4GHzNetworks = SettingsManager.Current.WiFi_Show2dot4GHzNetworks; - Show5GHzNetworks = SettingsManager.Current.WiFi_Show5GHzNetworks; + if (value == field) + return; + + field = value; + OnPropertyChanged(); } - #endregion + } - #region ICommands & Actions - public ICommand ReloadAdaptersCommand => new RelayCommand(p => ReloadAdapterAction(), ReloadAdapters_CanExecute); + public string StatusMessage + { + get; + private set + { + if (value == field) + return; - private bool ReloadAdapters_CanExecute(object obj) => !IsAdaptersLoading; + field = value; + OnPropertyChanged(); + } + } - private void ReloadAdapterAction() + public bool IsConnecting + { + get; + set { - ReloadAdapter(); + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - public ICommand ScanNetworksCommand => new RelayCommand(p => ScanNetworksAction(), ScanNetworks_CanExecute); + public bool IsConnectionStatusMessageDisplayed + { + get; + set + { + if (value == field) + return; - private bool ScanNetworks_CanExecute(object obj) => !IsAdaptersLoading && !IsNetworksLoading; + field = value; + OnPropertyChanged(); + } + } - private async Task ScanNetworksAction() + public string ConnectionStatusMessage + { + get; + private set { - await Scan(SelectedAdapter.WiFiAdapter, true); + if (value == field) + return; + + field = value; + OnPropertyChanged(); } + } - public ICommand ExportCommand => new RelayCommand(p => ExportAction()); + #endregion - private void ExportAction() + #region Constructor, load settings + + public WiFiViewModel() + { + _isLoading = true; + + // Set up the channel charts (axes, sections, paints) unconditionally so the chart bindings + // are never null, even on the code paths that return early below. + InitializeCharts(); + + // Check if Microsoft.Windows.SDK.Contracts is available + SdkContractAvailable = ApiInformation.IsTypePresent("Windows.Devices.WiFi.WiFiAdapter"); + + if (!SdkContractAvailable) { - Export(); + _isLoading = false; + + return; } - #endregion - #region Methods - private async Task LoadAdapters() + // Check if the access is denied and show a message + WiFiAdapterAccessEnabled = RequestAccess(); + + if (!WiFiAdapterAccessEnabled) { - IsAdaptersLoading = true; + _isLoading = false; - try - { - Adapters = await WiFi.GetAdapterAsync(); + return; + } - // Get the last selected interface, if it is still available on this machine... - if (Adapters.Count > 0) - { - var info = Adapters.FirstOrDefault(s => s.NetworkInterfaceInfo.Id.ToString() == SettingsManager.Current.WiFi_InterfaceId); + // Result view + search + NetworksView = CollectionViewSource.GetDefaultView(Networks); + NetworksView.SortDescriptions.Add(new SortDescription( + $"{nameof(WiFiNetworkInfo.AvailableNetwork)}.{nameof(WiFiNetworkInfo.AvailableNetwork.Ssid)}", + ListSortDirection.Ascending)); + NetworksView.Filter = o => + { + if (o is not WiFiNetworkInfo info) + return false; - SelectedAdapter = info ?? Adapters[0]; - } - } - catch (FileNotFoundException) // This exception is thrown, when the Microsoft.Windows.SDK.Contracts is not available... + // Filter by frequency + if ((info.Radio == WiFiRadio.GHz2dot4 && !Show2Dot4GHzNetworks) || + (info.Radio == WiFiRadio.GHz5 && !Show5GHzNetworks) || + (info.Radio == WiFiRadio.GHz6 && !Show6GHzNetworks)) { - SDKContractsFailedToLoad = true; + return false; } - IsAdaptersLoading = false; - } + // Return true if no search term is set + if (string.IsNullOrEmpty(Search)) + return true; + + // Search by SSID, authentication type, channel frequency, channel, BSSID, vendor and PHY kind + return info.AvailableNetwork.Ssid.IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || + info.NetworkAuthenticationType.IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || + $"{info.ChannelCenterFrequencyInGigahertz}".IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || + $"{info.Channel}".IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || + info.AvailableNetwork.Bssid.IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || + info.Vendor.IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 || + info.PhyKind.IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1; + }; + + // Load network adapters + _ = LoadAdaptersAsync(SettingsManager.Current.WiFi_InterfaceId); + + // Auto refresh + _autoRefreshTimer.Tick += AutoRefreshTimer_Tick; + + AutoRefreshTimes = CollectionViewSource.GetDefaultView(AutoRefreshTime.GetDefaults); + SelectedAutoRefreshTime = AutoRefreshTimes.Cast().FirstOrDefault(x => + x.Value == SettingsManager.Current.WiFi_AutoRefreshTime.Value && + x.TimeUnit == SettingsManager.Current.WiFi_AutoRefreshTime.TimeUnit); + AutoRefreshEnabled = SettingsManager.Current.WiFi_AutoRefreshEnabled; + + // Hide ConnectionStatusMessage automatically + _hideConnectionStatusMessageTimer.Interval = new TimeSpan(0, 0, 15); + _hideConnectionStatusMessageTimer.Tick += HideConnectionStatusMessageTimer_Tick; + + // Load settings + LoadSettings(); + + _isLoading = false; + } + + private void LoadSettings() + { + Show2Dot4GHzNetworks = SettingsManager.Current.WiFi_Show2dot4GHzNetworks; + Show5GHzNetworks = SettingsManager.Current.WiFi_Show5GHzNetworks; + Show6GHzNetworks = SettingsManager.Current.WiFi_Show6GHzNetworks; + } + + #endregion + + #region ICommands & Actions + + public ICommand ReloadAdaptersCommand => new RelayCommand(_ => ReloadAdapterAction(), ReloadAdapter_CanExecute); + + private bool ReloadAdapter_CanExecute(object obj) + { + return !IsAdaptersLoading && !IsNetworksLoading && !IsBackgroundSearchRunning && !AutoRefreshEnabled && !IsConnecting; + } - private async Task ReloadAdapter() + private void ReloadAdapterAction() + { + _ = LoadAdaptersAsync(SelectedAdapter?.NetworkInterfaceInfo.Id); + } + + public ICommand ScanNetworksCommand => + new RelayCommand(parameter => { _ = ScanNetworksAction(); }, ScanNetworks_CanExecute); + + private bool ScanNetworks_CanExecute(object obj) + { + return !IsAdaptersLoading && !IsNetworksLoading && !IsBackgroundSearchRunning && !AutoRefreshEnabled && !IsConnecting; + } + + private async Task ScanNetworksAction() + { + await ScanAsync(SelectedAdapter, true); + } + + public ICommand ConnectCommand => new RelayCommand(_ => ConnectAction()); + + private void ConnectAction() + { + Connect(); + } + + public ICommand DisconnectCommand => new RelayCommand(_ => DisconnectAction()); + + private void DisconnectAction() + { + Disconnect(); + } + + public ICommand ExportCommand => new RelayCommand(_ => ExportAction()); + + private void ExportAction() + { + _ = Export(); + } + + public ICommand OpenSettingsCommand => new RelayCommand(_ => OpenSettingsAction()); + + private static void OpenSettingsAction() + { + Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-location")); + } + + #endregion + + #region Methods + + /// + /// Request access to the Wi-Fi adapter. + /// + /// Fails if the access is denied. + private static bool RequestAccess() + { + try { - IsAdaptersLoading = true; + var accessStatus = WiFiAdapter.RequestAccessAsync().GetAwaiter().GetResult(); - await Task.Delay(2000); // Make the user happy, let him see a reload animation (and he cannot spam the reload command) + return accessStatus == WiFiAccessStatus.Allowed; + } + catch (Exception ex) + { + // RequestAccessAsync() can throw instead of returning a status (e.g. on Windows ARM64 + // running the emulated x64 build, see GitHub issue #3110). Log it and treat it as denied + // so the view shows the "access not available" message with the settings button instead + // of silently failing (the exception would otherwise be swallowed by the WPF binding that + // constructs this view model). + Log.Error("Error while requesting access to the WiFi adapter.", ex); + + return false; + } + } - string id = string.Empty; + private async Task LoadAdaptersAsync(string adapterId = null) + { + Log.Debug("LoadAdaptersAsync - Trying to get WiFi adapters..."); - if (SelectedAdapter != null) - id = SelectedAdapter.NetworkInterfaceInfo.Id; + IsAdaptersLoading = true; - try - { - Adapters = await WiFi.GetAdapterAsync(); + // Show a loading animation for the user + await Task.Delay(GlobalStaticConfiguration.ApplicationUIRefreshInterval); - if (Adapters.Count > 0) - SelectedAdapter = string.IsNullOrEmpty(id) ? Adapters.FirstOrDefault() : Adapters.FirstOrDefault(x => x.NetworkInterfaceInfo.Id == id); - } - catch (FileNotFoundException) // This exception is thrown, when the Microsoft.Windows.SDK.Contracts is not available... - { - SDKContractsFailedToLoad = true; - } + try + { + Adapters = await WiFi.GetAdapterAsync(); + } + catch (Exception ex) + { + Log.Error("Error trying to get WiFi adapters.", ex); - IsAdaptersLoading = false; + Adapters.Clear(); } - private async Task Scan(WiFiAdapter adapter, bool fromBackground = false) + // Check if we found any adapters + if (Adapters.Count > 0) { - if (fromBackground) + Log.Debug("LoadAdaptersAsync - Found " + Adapters.Count + " WiFi adapters."); + + // Check for previous selected adapter + if (string.IsNullOrEmpty(adapterId)) { - StatusMessage = Localization.Resources.Strings.SearchingForNetworksDots; - IsBackgroundSearchRunning = true; + Log.Debug("LoadAdaptersAsync - No previous adapter ID found. Selecting the first adapter."); + + SelectedAdapter = Adapters.FirstOrDefault(); } else { - IsStatusMessageDisplayed = false; - IsNetworksLoading = true; + Log.Debug("LoadAdaptersAsync - Previous adapter ID found. Trying to select the adapter with the ID: " + adapterId); + + SelectedAdapter = Adapters.FirstOrDefault(s => s.NetworkInterfaceInfo.Id.ToString() == adapterId) ?? + Adapters.FirstOrDefault(); } - IEnumerable networks = await WiFi.GetNetworksAsync(adapter); + Log.Debug("LoadAdaptersAsync - Selected adapter: " + SelectedAdapter?.NetworkInterfaceInfo.Name + " (" + + SelectedAdapter?.NetworkInterfaceInfo.Id + ")"); + } + else + { + Log.Debug("LoadAdaptersAsync - No WiFi adapters found."); + } - Networks.Clear(); + IsAdaptersLoading = false; + + Log.Debug("LoadAdaptersAsync - Done."); + } + + private async Task ScanAsync(WiFiAdapterInfo adapterInfo, bool refreshing = false, int delayInMs = 0) + { + Log.Debug($"ScanAsync - Scanning WiFi adapter \"{adapterInfo.NetworkInterfaceInfo.Name}\" with delay of {delayInMs} ms..."); + + if (refreshing) + { + StatusMessage = Strings.SearchingForNetworksDots; + IsBackgroundSearchRunning = true; + } + else + { + IsStatusMessageDisplayed = false; + IsNetworksLoading = true; + } + + if (delayInMs != 0) + await Task.Delay(delayInMs); - Radio1Series.Clear(); - Radio2Series.Clear(); + var statusMessage = string.Empty; - foreach (var network in networks) + try + { + var wiFiNetworkScanInfo = await WiFi.GetNetworksAsync(adapterInfo.WiFiAdapter); + + Log.Debug("ScanAsync - Scan completed. Found " + wiFiNetworkScanInfo.WiFiNetworkInfos.Count + " networks."); + + // Clear the values after the scan to make the UI smoother + Log.Debug("ScanAsync - Clearing old values..."); + Networks.Clear(); + + Log.Debug("ScanAsync - Adding new values..."); + List series2Dot4GHz = []; + List series5GHz = []; + List series6GHzLower = []; + List series6GHzUpper = []; + List legend2Dot4GHz = []; + List legend5GHz = []; + List legend6GHzLower = []; + List legend6GHzUpper = []; + + foreach (var network in wiFiNetworkScanInfo.WiFiNetworkInfos) { - // Identify hidden networks - if (string.IsNullOrEmpty(network.SSID)) - network.SSID = Localization.Resources.Strings.HiddenNetwork; + Log.Debug("ScanAsync - Add network: " + network.AvailableNetwork.Ssid + " with channel frequency: " + + network.AvailableNetwork.ChannelCenterFrequencyInKilohertz); Networks.Add(network); - if (WiFi.ConvertChannelFrequencyToGigahertz(network.ChannelCenterFrequencyInKilohertz) < 5) // 2.4 GHz - AddNetworkToRadio1Chart(network); - else - AddNetworkToRadio2Chart(network); + switch (network.Radio) + { + case WiFiRadio.GHz2dot4: + var (s24, l24) = BuildNetworkSeries(network, series2Dot4GHz.Count); + series2Dot4GHz.Add(s24); + legend2Dot4GHz.Add(l24); + break; + + case WiFiRadio.GHz5: + var (s5, l5) = BuildNetworkSeries(network, series5GHz.Count); + series5GHz.Add(s5); + legend5GHz.Add(l5); + break; + + case WiFiRadio.GHz6: + // Split by channel center into the lower (1-125) and upper (129-233) chart. + var centerChannel = FrequencyToChannelAxis( + network.ChannelCenterFrequencyInGigahertz * 1000, WiFiRadio.GHz6); + + if (centerChannel < SixGHzSplitChannel) + { + var (s6L, l6L) = BuildNetworkSeries(network, series6GHzLower.Count); + series6GHzLower.Add(s6L); + legend6GHzLower.Add(l6L); + } + else + { + var (s6U, l6U) = BuildNetworkSeries(network, series6GHzUpper.Count); + series6GHzUpper.Add(s6U); + legend6GHzUpper.Add(l6U); + } + + break; + } } - IsStatusMessageDisplayed = true; - StatusMessage = string.Format(Localization.Resources.Strings.LastScanAtX, DateTime.Now.ToLongTimeString()); - - if (fromBackground) - IsBackgroundSearchRunning = false; - else - IsNetworksLoading = false; + Radio2Dot4GHzSeries = [.. series2Dot4GHz]; + Radio5GHzSeries = [.. series5GHz]; + Radio6GHzLowerSeries = [.. series6GHzLower]; + Radio6GHzUpperSeries = [.. series6GHzUpper]; + Radio2Dot4GHzLegend = [.. legend2Dot4GHz]; + Radio5GHzLegend = [.. legend5GHz]; + Radio6GHzLowerLegend = [.. legend6GHzLower]; + Radio6GHzUpperLegend = [.. legend6GHzUpper]; + + statusMessage = string.Format(Strings.LastScanAtX, + wiFiNetworkScanInfo.Timestamp.ToLongTimeString()); } - - private ChartValues GetDefaultChartValues(WiFi.Radio radio) + catch (Exception ex) { - ChartValues values = new ChartValues(); + Log.Error($"Error while scanning WiFi adapter \"{adapterInfo.NetworkInterfaceInfo.Name}\".", ex); - for (int i = 0; i < (radio == WiFi.Radio.One ? Radio1Labels.Length : Radio2Labels.Length); i++) - values.Add(-1); + statusMessage = string.Format(Strings.ErrorWhileScanningWiFiAdapterXXXWithErrorXXX, + adapterInfo.NetworkInterfaceInfo.Name, ex.Message); - return values; + // Clear the existing old values if an error occurs + Networks.Clear(); + Radio2Dot4GHzSeries = []; + Radio5GHzSeries = []; + Radio6GHzLowerSeries = []; + Radio6GHzUpperSeries = []; + Radio2Dot4GHzLegend = []; + Radio5GHzLegend = []; + Radio6GHzLowerLegend = []; + Radio6GHzUpperLegend = []; } - - private ChartValues SetChartValues(WiFiNetworkInfo network, WiFi.Radio radio, int index) + finally { - ChartValues values = GetDefaultChartValues(radio); - - double reverseMilliwatts = 100 - (network.NetworkRssiInDecibelMilliwatts * -1); + IsStatusMessageDisplayed = true; + StatusMessage = statusMessage; - values[index - 2] = -1; - values[index - 1] = reverseMilliwatts; - values[index] = reverseMilliwatts; - values[index + 1] = reverseMilliwatts; - values[index + 2] = -1; + IsBackgroundSearchRunning = false; + IsNetworksLoading = false; - return values; + Log.Debug("ScanAsync - Done."); } + } - private void AddNetworkToRadio1Chart(WiFiNetworkInfo network) - { - int index = Array.IndexOf(Radio1Labels, $"{WiFi.GetChannelFromChannelFrequency(network.ChannelCenterFrequencyInKilohertz)}"); + /// + /// Color palette used to assign a distinct, deterministic color to each network series. + /// Assigning the stroke explicitly (instead of relying on the LiveCharts2 theme) keeps the + /// legend, the chart and the tooltip in sync. + /// + private static readonly SKColor[] ChartPalette = + [ + SKColor.Parse("#1ba1e2"), SKColor.Parse("#a4c400"), SKColor.Parse("#f0a30a"), + SKColor.Parse("#e51400"), SKColor.Parse("#6a00ff"), SKColor.Parse("#00aba9"), + SKColor.Parse("#d80073"), SKColor.Parse("#60a917"), SKColor.Parse("#fa6800"), + SKColor.Parse("#0050ef"), SKColor.Parse("#aa00ff"), SKColor.Parse("#825a2c") + ]; + + // The Y axis is plotted in 0..100 space (signal strength + 100) so the area fill drops to the + // bottom baseline; the axis labeler converts back to real dBm for display. + private const double SignalOffset = 100; + + // 2.4 GHz operating channels are 1, 2, 3, ... 14 (every channel number), labeled with the channel + private static readonly HashSet ValidChannels2Dot4GHz = BuildChannelSet(1, 14, 1); + + // 5 GHz operating channels are 36, 40, 44, ... 165 (every 4 in channel-number space), labeled with + private static readonly HashSet ValidChannels5GHz = + [ + .. BuildChannelSet(36, 64, 4), + .. BuildChannelSet(100, 165, 4) + ]; + + // 6 GHz operating channels are 1, 5, 9, ... 233 (every 4 in channel-number space), labeled with the + private static readonly HashSet ValidChannels6GHz = BuildChannelSet(1, 233, 4); + + // Channel that splits the 6 GHz band into the lower (1-125) and upper (129-233) chart. 127 sits + // cleanly between the operating channels 125 and 129. + private const int SixGHzSplitChannel = 127; + + // The 5 GHz band has a large unused range between channel 64 (UNII-2) and channel 100 + // (UNII-2 Extended). On a frequency-linear axis this would render as dead space, so it is + // compressed: channels above 64 are shifted left, leaving only a small visual gap that still + // provides room for the channel-width trapezoids. + private const int FiveGHzGapStartChannel = 64; + private const int FiveGHzGapEndChannel = 100; + private const int FiveGHzGapDisplayUnits = 16; + private const int FiveGHzGapShift = FiveGHzGapEndChannel - FiveGHzGapStartChannel - FiveGHzGapDisplayUnits; + + private static HashSet BuildChannelSet(int first, int last, int step) + { + var set = new HashSet(); - Radio1Series.Add(new LineSeries - { - Title = network.SSID, - Values = SetChartValues(network, WiFi.Radio.One, index), - PointGeometry = null, - LineSmoothness = 0 - }); - } + for (var channel = first; channel <= last; channel += step) + set.Add(channel); - private void AddNetworkToRadio2Chart(WiFiNetworkInfo network) - { - int index = Array.IndexOf(Radio2Labels, $"{WiFi.GetChannelFromChannelFrequency(network.ChannelCenterFrequencyInKilohertz)}"); + return set; + } - Radio2Series.Add(new LineSeries + /// + /// Builds axes, signal-quality sections and paints for all channel charts. Called once from + /// the constructor; the per-network series are (re)built on each scan. + /// + private void InitializeCharts() + { + var labelColor = Application.Current?.TryFindResource("MahApps.Brushes.Gray5") is SolidColorBrush gray5 + ? new SKColor(gray5.Color.R, gray5.Color.G, gray5.Color.B, gray5.Color.A) + : new SKColor(0x68, 0x68, 0x68); + + var separatorColor = Application.Current?.TryFindResource("MahApps.Brushes.Gray8") is SolidColorBrush gray8 + ? new SKColor(gray8.Color.R, gray8.Color.G, gray8.Color.B, gray8.Color.A) + : new SKColor(0x80, 0x80, 0x80); + + // (min, max) in display space. The lower bound is extended below the first channel so the + // left flank of its trapezoid reaches the baseline instead of being clipped. The 5 GHz + // upper bound is reduced because the 64..100 dead zone is compressed. + Radio2Dot4GHzXAxes = BuildXAxes(-2, 16, ValidChannels2Dot4GHz, false, labelColor); + Radio5GHzXAxes = BuildXAxes(30, 152, ValidChannels5GHz, true, labelColor); + Radio6GHzLowerXAxes = BuildXAxes(-2, 128, ValidChannels6GHz, false, labelColor); + Radio6GHzUpperXAxes = BuildXAxes(126, 236, ValidChannels6GHz, false, labelColor); + + Radio2Dot4GHzYAxes = BuildYAxes(labelColor, separatorColor); + Radio5GHzYAxes = BuildYAxes(labelColor, separatorColor); + Radio6GHzLowerYAxes = BuildYAxes(labelColor, separatorColor); + Radio6GHzUpperYAxes = BuildYAxes(labelColor, separatorColor); + + Radio2Dot4GHzSections = BuildSections(); + Radio5GHzSections = BuildSections(); + Radio6GHzLowerSections = BuildSections(); + Radio6GHzUpperSections = BuildSections(); + } + + /// + /// Builds an X-axis in channel-number space (which is linear with the channel frequency). + /// Only channels contained in are labeled; all other tick + /// positions stay blank. When is set, the 5 GHz gap shift + /// is reversed before the label lookup. + /// + private static Axis[] BuildXAxes(double min, double max, HashSet validChannels, bool applyFiveGHzGap, + SKColor labelColor) + { + return + [ + new Axis { - Title = network.SSID, - Values = SetChartValues(network, WiFi.Radio.Two, index), - PointGeometry = null, - LineSmoothness = 0 - }); - } + Name = Strings.Channel, + NamePaint = new SolidColorPaint(labelColor), + NameTextSize = 11, + MinLimit = min, + MaxLimit = max, + MinStep = 1, + ForceStepToMin = true, + Labeler = value => + { + var channel = (int)Math.Round(value); + + if (applyFiveGHzGap && channel > FiveGHzGapStartChannel) + channel += FiveGHzGapShift; + + return validChannels.Contains(channel) ? channel.ToString() : string.Empty; + }, + TextSize = 10, + Padding = new Padding(0, 4, 0, 0), + LabelsPaint = new SolidColorPaint(labelColor), + // No vertical grid lines (matches the legacy chart). + SeparatorsPaint = null + } + ]; + } - private void ChangeAutoRefreshTimerInterval(TimeSpan timeSpan) + /// + /// Builds the Y-axis (signal strength in dBm, -100..0) shared by all three channel charts. + /// + private static Axis[] BuildYAxes(SKColor labelColor, SKColor separatorColor) + { + return + [ + new Axis + { + Name = Strings.SignalStrength, + NamePaint = new SolidColorPaint(labelColor), + NameTextSize = 11, + MinLimit = 0, + MaxLimit = 100, + MinStep = 10, + ForceStepToMin = true, + // Plotted in 0..100 space; convert back to real dBm for the label. + Labeler = value => $"{(int)Math.Round(value) - (int)SignalOffset} dBm", + TextSize = 11, + Padding = new Padding(4, 0), + LabelsPaint = new SolidColorPaint(labelColor), + SeparatorsPaint = new SolidColorPaint(separatorColor) + { + StrokeThickness = 1, + PathEffect = new DashEffect([10f, 10f]) + } + } + ]; + } + + /// + /// Builds the colored signal-quality bands (Cisco/MetaGeek thresholds), identical for all + /// bands. Returns fresh instances so they are not shared between charts. + /// + private static RectangularSection[] BuildSections() + { + // Thresholds in 0..100 space (dBm + 100): -30 -> 70, -67 -> 33, -70 -> 30, -80 -> 20. + return + [ + NewSection(70, 100, "#5EA4BF"), // Excellent (>= -30 dBm) + NewSection(33, 70, "#badc58"), // Good (-67…-30 dBm) + NewSection(30, 33, "#f9ca24"), // Reliable (-70…-67 dBm) + NewSection(20, 30, "#FF970D"), // Weak (-80…-70 dBm) + NewSection(0, 20, "#A4442B") // Poor (< -80 dBm) + ]; + } + + private static RectangularSection NewSection(double yi, double yj, string color) + { + return new RectangularSection { - _autoRefreshTimer.Interval = timeSpan; - } + Yi = yi, + Yj = yj, + Fill = new SolidColorPaint(SKColor.Parse(color).WithAlpha(0x40)) + }; + } - private void StartAutoRefreshTimer() + /// + /// Builds a line series and a matching legend entry for a single network, rendered as a + /// trapezoid centered on its channel center frequency. + /// + private static (LineSeries Series, WiFiChannelLegendEntry Legend) BuildNetworkSeries(WiFiNetworkInfo network, int colorIndex) + { + var color = ChartPalette[colorIndex % ChartPalette.Length]; + + double dbm = network.AvailableNetwork.NetworkRssiInDecibelMilliwatts; + var center = ChannelNumberToDisplay( + FrequencyToChannelAxis(network.ChannelCenterFrequencyInGigahertz * 1000, network.Radio), network.Radio); + + // Channel-number space uses 5 MHz per unit, so a bandwidth in MHz spans bandwidth/5 units. + var bandwidth = network.ChannelBandwidth; + var half = bandwidth / 10.0; + var inner = half * 0.7; + const double floor = -100; // baseline in real dBm; mapped to 0 in the chart's 0..100 space + + // Dense points at 0.5-channel steps so that CompareOnlyX always finds this series when the + // mouse is anywhere inside the trapezoid, even when a narrower network shares the same area. + // With only 5 corner points the nearest point of a wide network can be far from the mouse + // while a narrower network's corner is closer, causing the wide network to be omitted from + // the tooltip despite the mouse being visually inside it. + const double step = 0.5; + var rampWidth = half - inner; // > 0 always (inner = half * 0.7) + var pointList = new List(); + + for (var x = center - half; x <= center + half + step * 0.01; x += step) { - ChangeAutoRefreshTimerInterval(AutoRefreshTime.CalculateTimeSpan(SelectedAutoRefreshTime)); + double y; + + if (x <= center - inner) + y = floor + (dbm - floor) * (x - (center - half)) / rampWidth; + else if (x >= center + inner) + y = dbm - (dbm - floor) * (x - (center + inner)) / rampWidth; + else + y = dbm; - _autoRefreshTimer.Start(); + pointList.Add(new WiFiChannelPoint(x, y, network)); } - private void StopAutoRefreshTimer() + var points = pointList.ToArray(); + + var name = network.IsHidden + ? $"{Strings.HiddenNetwork} ({network.AvailableNetwork.Bssid})" + : $"{network.AvailableNetwork.Ssid} ({network.AvailableNetwork.Bssid})"; + + var series = new LineSeries { - _autoRefreshTimer.Stop(); - } + Name = name, + Values = points, + // Plot in 0..100 space (dBm + 100) so the area fill drops to the bottom baseline. + Mapping = (point, _) => new Coordinate(point.ChannelAxis, point.Dbm + SignalOffset), + GeometrySize = 0, + LineSmoothness = 0, + Stroke = new SolidColorPaint(color) { StrokeThickness = 1.5f }, + Fill = new SolidColorPaint(color.WithAlpha(0x33)) + }; + + var wpfColor = Color.FromArgb(color.Alpha, color.Red, color.Green, color.Blue); + var legendSsid = network.IsHidden ? Strings.HiddenNetwork : network.AvailableNetwork.Ssid; + var legend = new WiFiChannelLegendEntry(new SolidColorBrush(wpfColor), legendSsid, network.AvailableNetwork.Bssid); + + return (series, legend); + } - private void PauseAutoRefreshTimer() + /// + /// Converts a channel center frequency (MHz) to channel-number space for the chart X axis. + /// This mapping is linear with frequency (5 MHz per unit). + /// + private static double FrequencyToChannelAxis(double frequencyMHz, WiFiRadio radio) + { + return radio switch { - if (!_autoRefreshTimer.IsEnabled) - return; + // Channel 14 is at 2484 MHz and does not follow the standard ch×5 + 2407 spacing. + WiFiRadio.GHz2dot4 => (int)Math.Round(frequencyMHz) == 2484 ? 14.0 : (frequencyMHz - 2407) / 5.0, + WiFiRadio.GHz5 => (frequencyMHz - 5000) / 5.0, + WiFiRadio.GHz6 => (frequencyMHz - 5950) / 5.0, + _ => 0 + }; + } - _autoRefreshTimer.Stop(); - _isTimerPaused = true; - } + /// + /// Maps a channel number to its display position on the X axis. For 5 GHz the unused + /// 64..100 range is compressed so it does not render as dead space. + /// + private static double ChannelNumberToDisplay(double channelNumber, WiFiRadio radio) + { + if (radio == WiFiRadio.GHz5 && channelNumber > FiveGHzGapStartChannel) + return channelNumber - FiveGHzGapShift; - private void ResumeAutoRefreshTimer() - { - if (!_isTimerPaused) - return; + return channelNumber; + } - _autoRefreshTimer.Start(); - _isTimerPaused = false; - } + private void Connect() + { + var selectedAdapter = SelectedAdapter; + var selectedNetwork = SelectedNetwork; - private async Task Connect() - { + var connectMode = WiFi.GetConnectMode(selectedNetwork.AvailableNetwork); - } + var childWindow = new WiFiConnectChildWindow(); - private async Task Export() + var childWindowViewModel = new WiFiConnectViewModel(async instance => { - var customDialog = new CustomDialog - { - Title = Localization.Resources.Strings.Export - }; + // Connect Open/PSK/EAP + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + var ssid = selectedNetwork.IsHidden ? instance.Ssid : selectedNetwork.AvailableNetwork.Ssid; + + // Show status message + IsConnecting = true; + ConnectionStatusMessage = string.Format(Strings.ConnectingToXXX, ssid); + IsConnectionStatusMessageDisplayed = true; + + // Connect to the network + var reconnectionKind = instance.ConnectAutomatically + ? WiFiReconnectionKind.Automatic + : WiFiReconnectionKind.Manual; + + PasswordCredential credential = new(); - var exportViewModel = new ExportViewModel(async instance => + switch (instance.ConnectMode) { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + case WiFiConnectMode.Psk: + credential.Password = SecureStringHelper.ConvertToString(instance.PreSharedKey); + break; + case WiFiConnectMode.Eap: + credential.UserName = instance.Username; - try - { - ExportManager.Export(instance.FilePath, instance.FileType, instance.ExportAll ? Networks : new ObservableCollection(SelectedNetworks.Cast().ToArray())); - } - catch (Exception ex) - { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Localization.Resources.Strings.OK; + if (!string.IsNullOrEmpty(instance.Domain)) + credential.Resource = instance.Domain; - await _dialogCoordinator.ShowMessageAsync(this, Localization.Resources.Strings.Error, Localization.Resources.Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); - } + credential.Password = SecureStringHelper.ConvertToString(instance.Password); + break; + } - SettingsManager.Current.WiFi_ExportFileType = instance.FileType; - SettingsManager.Current.WiFi_ExportFilePath = instance.FilePath; - }, instance => { _dialogCoordinator.HideMetroDialogAsync(this, customDialog); }, new ExportManager.ExportFileType[] { ExportManager.ExportFileType.CSV, ExportManager.ExportFileType.XML, ExportManager.ExportFileType.JSON }, true, SettingsManager.Current.WiFi_ExportFileType, SettingsManager.Current.WiFi_ExportFilePath); + WiFiConnectionStatus connectionResult; - customDialog.Content = new ExportDialog + if (selectedNetwork.IsHidden) + connectionResult = await WiFi.ConnectAsync(instance.Options.AdapterInfo.WiFiAdapter, + instance.Options.NetworkInfo.AvailableNetwork, reconnectionKind, credential, instance.Ssid); + else + connectionResult = await WiFi.ConnectAsync(instance.Options.AdapterInfo.WiFiAdapter, + instance.Options.NetworkInfo.AvailableNetwork, reconnectionKind, credential); + + // Done connecting + IsConnecting = false; + + // Get result + ConnectionStatusMessage = connectionResult == WiFiConnectionStatus.Success + ? string.Format(Strings.SuccessfullyConnectedToXXX, ssid) + : string.Format(Strings.CouldNotConnectToXXXReasonXXX, ssid, + ResourceTranslator.Translate(ResourceIdentifier.WiFiConnectionStatus, connectionResult)); + + // Hide message automatically + _hideConnectionStatusMessageTimer.Start(); + + // Update the Wi-Fi networks. + // Wait because an error may occur if a refresh is done directly after connecting. + await ScanAsync(SelectedAdapter, true, 5000); + }, async instance => + { + // Connect WPS + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + var ssid = selectedNetwork.IsHidden ? instance.Ssid : selectedNetwork.AvailableNetwork.Ssid; + + // Show status message + IsConnecting = true; + ConnectionStatusMessage = string.Format(Strings.ConnectingToXXX, ssid); + IsConnectionStatusMessageDisplayed = true; + + // Connect to the network + var reconnectionKind = instance.ConnectAutomatically + ? WiFiReconnectionKind.Automatic + : WiFiReconnectionKind.Manual; + + var connectionResult = await WiFi.ConnectWpsAsync( + instance.Options.AdapterInfo.WiFiAdapter, instance.Options.NetworkInfo.AvailableNetwork, + reconnectionKind); + + // Done connecting + IsConnecting = false; + + // Get result + ConnectionStatusMessage = connectionResult == WiFiConnectionStatus.Success + ? string.Format(Strings.SuccessfullyConnectedToXXX, ssid) + : string.Format(Strings.CouldNotConnectToXXXReasonXXX, ssid, + ResourceTranslator.Translate(ResourceIdentifier.WiFiConnectionStatus, connectionResult)); + + // Hide message automatically + _hideConnectionStatusMessageTimer.Start(); + + // Update the Wi-Fi networks. + // Wait because an error may occur if a refresh is done directly after connecting. + await ScanAsync(SelectedAdapter, true, 5000); + }, + _ => { - DataContext = exportViewModel - }; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, (selectedAdapter, selectedNetwork), + connectMode); - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); - } - public void OnViewVisible() + childWindow.Title = selectedNetwork.IsHidden + ? Strings.HiddenNetwork + : string.Format(Strings.ConnectToXXX, selectedNetwork.AvailableNetwork.Ssid); + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + _ = Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } + + private async void Disconnect() + { + var connectedNetwork = Networks.FirstOrDefault(x => x.IsConnected); + + WiFi.Disconnect(SelectedAdapter.WiFiAdapter); + + if (connectedNetwork != null) { - ResumeAutoRefreshTimer(); + ConnectionStatusMessage = string.Format(Strings.XXXDisconnected, + connectedNetwork.AvailableNetwork.Ssid); + IsConnectionStatusMessageDisplayed = true; + + // Hide message automatically + _hideConnectionStatusMessageTimer.Start(); } - public void OnViewHide() + // Refresh + await ScanAsync(SelectedAdapter, true, GlobalStaticConfiguration.ApplicationUIRefreshInterval); + } + + private Task Export() + { + var childWindow = new ExportChildWindow(); + + var childWindowViewModel = new ExportViewModel(async instance => { - PauseAutoRefreshTimer(); - } + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - #endregion + try + { + ExportManager.Export(instance.FilePath, instance.FileType, + instance.ExportAll + ? Networks + : new ObservableCollection(SelectedNetworks.Cast() + .ToArray())); + } + catch (Exception ex) + { + Log.Error("Error while exporting data as " + instance.FileType, ex); + + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); + } - #region Events - private async void AutoRefreshTimer_Tick(object sender, EventArgs e) + SettingsManager.Current.WiFi_ExportFileType = instance.FileType; + SettingsManager.Current.WiFi_ExportFilePath = instance.FilePath; + }, _ => { - // Stop timer... + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, [ + ExportFileType.Csv, ExportFileType.Xml, ExportFileType.Json + ], true, SettingsManager.Current.WiFi_ExportFileType, + SettingsManager.Current.WiFi_ExportFilePath); + + childWindow.Title = Strings.Export; + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); + } + + public void OnViewVisible() + { + // Temporarily stop timer... + if (AutoRefreshEnabled) _autoRefreshTimer.Stop(); + } - // Scan networks - await Scan(SelectedAdapter.WiFiAdapter, true); + public void OnViewHide() + { + // Temporarily stop timer... + if (AutoRefreshEnabled) + _autoRefreshTimer.Stop(); + } - // Restart timer... - _autoRefreshTimer.Start(); - } - private void SettingsManager_PropertyChanged(object sender, PropertyChangedEventArgs e) - { - } - #endregion + #endregion + + #region Events + + private async void AutoRefreshTimer_Tick(object sender, EventArgs e) + { + // Don't refresh if it's already loading or connecting + if (IsNetworksLoading || IsBackgroundSearchRunning || IsConnecting) + return; + + // Stop timer... + _autoRefreshTimer.Stop(); + + // Scan networks + await ScanAsync(SelectedAdapter, true); + + // Restart timer... + _autoRefreshTimer.Start(); } -} \ No newline at end of file + + private void HideConnectionStatusMessageTimer_Tick(object sender, EventArgs e) + { + _hideConnectionStatusMessageTimer.Stop(); + IsConnectionStatusMessageDisplayed = false; + } + + #endregion +} + +public record WiFiChannelLegendEntry(SolidColorBrush Color, string Ssid, string Bssid); \ No newline at end of file diff --git a/Source/NETworkManager/Views/ARPTableAddEntryDialog.xaml.cs b/Source/NETworkManager/Views/ARPTableAddEntryDialog.xaml.cs deleted file mode 100644 index 34de9e7aa1..0000000000 --- a/Source/NETworkManager/Views/ARPTableAddEntryDialog.xaml.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace NETworkManager.Views -{ - public partial class ARPTableAddEntryDialog - { - public ARPTableAddEntryDialog() - { - InitializeComponent(); - } - - private void UserControl_Loaded(object sender, System.Windows.RoutedEventArgs e) - { - // Need to be in loaded event, focusmanger won't work... - TextBoxIPAddress.Focus(); - } - } -} diff --git a/Source/NETworkManager/Views/ARPTableView.xaml b/Source/NETworkManager/Views/ARPTableView.xaml deleted file mode 100644 index c23ad78598..0000000000 --- a/Source/NETworkManager/Views/ARPTableView.xaml +++ /dev/null @@ -1,257 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/NETworkManager/Views/ARPTableView.xaml.cs b/Source/NETworkManager/Views/ARPTableView.xaml.cs deleted file mode 100644 index 1e73084489..0000000000 --- a/Source/NETworkManager/Views/ARPTableView.xaml.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Windows.Controls; -using NETworkManager.ViewModels; -using MahApps.Metro.Controls.Dialogs; - -namespace NETworkManager.Views -{ - public partial class ARPTableView - { - private readonly ARPTableViewModel _viewModel = new ARPTableViewModel(DialogCoordinator.Instance); - - public ARPTableView() - { - InitializeComponent(); - DataContext = _viewModel; - } - - private void ContextMenu_Opened(object sender, System.Windows.RoutedEventArgs e) - { - if (sender is ContextMenu menu) - menu.DataContext = _viewModel; - } - - public void OnViewHide() - { - _viewModel.OnViewHide(); - } - - public void OnViewVisible() - { - _viewModel.OnViewVisible(); - } - } -} diff --git a/Source/NETworkManager/Views/AboutView.xaml b/Source/NETworkManager/Views/AboutView.xaml index 6bd08304dd..e32b271232 100644 --- a/Source/NETworkManager/Views/AboutView.xaml +++ b/Source/NETworkManager/Views/AboutView.xaml @@ -1,22 +1,22 @@  + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:resources="clr-namespace:NETworkManager.Properties" + xmlns:mahAppsControls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro" + xmlns:documentation="clr-namespace:NETworkManager.Documentation;assembly=NETworkManager.Documentation" + xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" + xmlns:converters="clr-namespace:NETworkManager.Converters;assembly=NETworkManager.Converters" + xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" + xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:AboutViewModel}"> - + @@ -26,40 +26,116 @@ - - - + - + + - - - - - - - + + + + + + + - + - + - + - + + + + + + + + + - + - - + + - - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + + + + - - - - - - - - - - - + + + + - - + \ No newline at end of file diff --git a/Source/NETworkManager/Views/ConnectionsView.xaml.cs b/Source/NETworkManager/Views/ConnectionsView.xaml.cs index a443b1ab3f..b7648e75d7 100644 --- a/Source/NETworkManager/Views/ConnectionsView.xaml.cs +++ b/Source/NETworkManager/Views/ConnectionsView.xaml.cs @@ -1,33 +1,102 @@ -using NETworkManager.ViewModels; +using System; +using System.Collections; +using System.ComponentModel; +using System.Windows; using System.Windows.Controls; -using MahApps.Metro.Controls.Dialogs; +using System.Windows.Data; +using NETworkManager.Models.Network; +using NETworkManager.Utilities; +using NETworkManager.ViewModels; -namespace NETworkManager.Views +namespace NETworkManager.Views; + +public partial class ConnectionsView { - public partial class ConnectionsView + private readonly ConnectionsViewModel _viewModel = new(); + + public ConnectionsView() { - private readonly ConnectionsViewModel _viewModel = new ConnectionsViewModel(DialogCoordinator.Instance); + InitializeComponent(); + DataContext = _viewModel; + } - public ConnectionsView() - { - InitializeComponent(); - DataContext = _viewModel; - } + private void ContextMenu_Opened(object sender, RoutedEventArgs e) + { + if (sender is ContextMenu menu) + menu.DataContext = _viewModel; + } - private void ContextMenu_Opened(object sender, System.Windows.RoutedEventArgs e) - { - if (sender is ContextMenu menu) - menu.DataContext = _viewModel; - } + public void OnViewHide() + { + _viewModel.OnViewHide(); + } + + public void OnViewVisible() + { + _viewModel.OnViewVisible(); + } + + private void DataGrid_OnSorting(object sender, DataGridSortingEventArgs e) + { + var column = e.Column; + + var selectedComparer = -1; - public void OnViewHide() + switch (column.SortMemberPath) { - _viewModel.OnViewHide(); + case nameof(ConnectionInfo.LocalIPAddress): + selectedComparer = 0; + break; + case nameof(ConnectionInfo.RemoteIPAddress): + selectedComparer = 1; + break; + default: + return; } - public void OnViewVisible() + // Prevent the built-in sort from sorting + e.Handled = true; + + // Get the direction + var direction = column.SortDirection != ListSortDirection.Ascending + ? ListSortDirection.Ascending + : ListSortDirection.Descending; + + // Update the sort direction + e.Column.SortDirection = direction; + + // Get the view + var view = (ListCollectionView)CollectionViewSource.GetDefaultView(((DataGrid)sender).ItemsSource); + + // Sort the view + view.CustomSort = new DataGridComparer(direction, selectedComparer); + } + + public class DataGridComparer(ListSortDirection direction, int comparer = -1) : IComparer + { + public int Compare(object x, object y) { - _viewModel.OnViewVisible(); + // No comparer selected + if (comparer == -1) + return 0; + + // Get data from objects + if (x is not ConnectionInfo first || y is not ConnectionInfo second) + return 0; + + // Compare the data + return comparer switch + { + // Local IP address + 0 => direction == ListSortDirection.Ascending + ? IPAddressHelper.CompareIPAddresses(first.LocalIPAddress, second.LocalIPAddress) + : IPAddressHelper.CompareIPAddresses(second.LocalIPAddress, first.LocalIPAddress), + // Remote IP address + 1 => direction == ListSortDirection.Ascending + ? IPAddressHelper.CompareIPAddresses(first.RemoteIPAddress, second.RemoteIPAddress) + : IPAddressHelper.CompareIPAddresses(second.RemoteIPAddress, first.RemoteIPAddress), + _ => 0 + }; } } -} +} \ No newline at end of file diff --git a/Source/NETworkManager/Views/Controls/ProfileExpanderPanel.xaml b/Source/NETworkManager/Views/Controls/ProfileExpanderPanel.xaml new file mode 100644 index 0000000000..a5955d852f --- /dev/null +++ b/Source/NETworkManager/Views/Controls/ProfileExpanderPanel.xaml @@ -0,0 +1,625 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/NETworkManager/Views/Controls/ProfileExpanderPanel.xaml.cs b/Source/NETworkManager/Views/Controls/ProfileExpanderPanel.xaml.cs new file mode 100644 index 0000000000..5ea10c8ba2 --- /dev/null +++ b/Source/NETworkManager/Views/Controls/ProfileExpanderPanel.xaml.cs @@ -0,0 +1,132 @@ +using System; +using System.Collections; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; + +namespace NETworkManager.Views.Controls; + +/// +/// Reusable profile panel (search, tag filter, group list) shared by every tool view that hosts profiles. +/// Tool-specific parts (context menu, item tooltip, "run" action) are supplied by the host view through +/// dependency properties; everything else is identical across tools. +/// +public partial class ProfileExpanderPanel +{ + public static readonly DependencyProperty ProfileItemTemplateProperty = DependencyProperty.Register( + nameof(ProfileItemTemplate), typeof(DataTemplate), typeof(ProfileExpanderPanel)); + + /// + /// Gets or sets the item template used for a profile in the list (defines the tool-specific tooltip). + /// + public DataTemplate ProfileItemTemplate + { + get => (DataTemplate)GetValue(ProfileItemTemplateProperty); + set => SetValue(ProfileItemTemplateProperty, value); + } + + public static readonly DependencyProperty ProfileContextMenuExtraItemsProperty = DependencyProperty.Register( + nameof(ProfileContextMenuExtraItems), typeof(IEnumerable), typeof(ProfileExpanderPanel)); + + /// + /// Gets or sets the tool-specific menu items (commands/icons) shown at the top of the profile context + /// menu, before the always-present "Edit", "Copy as", and "Delete" items. + /// + public IEnumerable ProfileContextMenuExtraItems + { + get => (IEnumerable)GetValue(ProfileContextMenuExtraItemsProperty); + set => SetValue(ProfileContextMenuExtraItemsProperty, value); + } + + private void ContextMenu_Opened(object sender, RoutedEventArgs e) + { + // The context menu is a separate visual root (popup) and does not inherit the DataContext of the + // ListBoxItem it was opened from - fix it up here so its command bindings resolve against the + // tool's view model, same as the panel's own DataContext. + if (sender is ContextMenu menu) + menu.DataContext = DataContext; + } + + public static readonly DependencyProperty RunProfileCommandProperty = DependencyProperty.Register( + nameof(RunProfileCommand), typeof(ICommand), typeof(ProfileExpanderPanel)); + + /// + /// Gets or sets the command executed when a profile is activated (Enter key or double-click). Optional - + /// tools without a "run" action for profiles leave this unset. + /// + public ICommand RunProfileCommand + { + get => (ICommand)GetValue(RunProfileCommandProperty); + set => SetValue(RunProfileCommandProperty, value); + } + + public static readonly DependencyProperty TextBoxSearchGotFocusCommandProperty = DependencyProperty.Register( + nameof(TextBoxSearchGotFocusCommand), typeof(ICommand), typeof(ProfileExpanderPanel)); + + /// + /// Gets or sets the command executed when the search box receives focus. Optional - only used by tools + /// that pause background refreshes while the user is searching. + /// + public ICommand TextBoxSearchGotFocusCommand + { + get => (ICommand)GetValue(TextBoxSearchGotFocusCommandProperty); + set => SetValue(TextBoxSearchGotFocusCommandProperty, value); + } + + public static readonly DependencyProperty TextBoxSearchLostFocusCommandProperty = DependencyProperty.Register( + nameof(TextBoxSearchLostFocusCommand), typeof(ICommand), typeof(ProfileExpanderPanel)); + + /// + /// Gets or sets the command executed when the search box loses focus. Optional - only used by tools + /// that pause background refreshes while the user is searching. + /// + public ICommand TextBoxSearchLostFocusCommand + { + get => (ICommand)GetValue(TextBoxSearchLostFocusCommandProperty); + set => SetValue(TextBoxSearchLostFocusCommandProperty, value); + } + + public static readonly DependencyProperty ProfileContextMenuIsOpenProperty = DependencyProperty.Register( + nameof(ProfileContextMenuIsOpen), typeof(bool), typeof(ProfileExpanderPanel), + new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); + + /// + /// Gets or sets a value indicating whether the profile context menu is open. Optional - only used by + /// tools that need to suppress other behavior (e.g. auto-focusing an embedded window) while the menu is + /// open. + /// + public bool ProfileContextMenuIsOpen + { + get => (bool)GetValue(ProfileContextMenuIsOpenProperty); + set => SetValue(ProfileContextMenuIsOpenProperty, value); + } + + public static readonly DependencyProperty ProfileFilterPopupClosedCommandProperty = DependencyProperty.Register( + nameof(ProfileFilterPopupClosedCommand), typeof(ICommand), typeof(ProfileExpanderPanel)); + + /// + /// Gets or sets the command executed when the tag-filter popup closes (including an implicit close, e.g. + /// clicking away). Optional - only used by tools that mirror the popup's open state into global state. + /// + public ICommand ProfileFilterPopupClosedCommand + { + get => (ICommand)GetValue(ProfileFilterPopupClosedCommandProperty); + set => SetValue(ProfileFilterPopupClosedCommandProperty, value); + } + + public ProfileExpanderPanel() + { + InitializeComponent(); + } + + private void ListBoxItem_MouseDoubleClick(object sender, MouseButtonEventArgs e) + { + if (e.ChangedButton == MouseButton.Left) + RunProfileCommand?.Execute(null); + } + + private void PopupProfileFilter_Closed(object sender, EventArgs e) + { + ProfileFilterPopupClosedCommand?.Execute(null); + } +} diff --git a/Source/NETworkManager/Views/CredentialsChangePasswordDialog.xaml b/Source/NETworkManager/Views/CredentialsChangePasswordChildWindow.xaml similarity index 73% rename from Source/NETworkManager/Views/CredentialsChangePasswordDialog.xaml rename to Source/NETworkManager/Views/CredentialsChangePasswordChildWindow.xaml index ce7e3182d3..4ef3c381bd 100644 --- a/Source/NETworkManager/Views/CredentialsChangePasswordDialog.xaml +++ b/Source/NETworkManager/Views/CredentialsChangePasswordChildWindow.xaml @@ -1,14 +1,18 @@ - - + xmlns:simpleChildWindow="clr-namespace:MahApps.Metro.SimpleChildWindow;assembly=MahApps.Metro.SimpleChildWindow" + CloseButtonCommand="{Binding Path=CancelCommand}" + Style="{StaticResource DefaultChildWindow}" + Loaded="ChildWindow_OnLoaded" + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:CredentialsChangePasswordViewModel}"> + @@ -31,27 +35,34 @@ - + - + - + - + - + - + - + - + - - - - + - + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + \ No newline at end of file diff --git a/Source/NETworkManager/Views/DNSLookupHostView.xaml.cs b/Source/NETworkManager/Views/DNSLookupHostView.xaml.cs index 72b42b35f1..fc6e032285 100644 --- a/Source/NETworkManager/Views/DNSLookupHostView.xaml.cs +++ b/Source/NETworkManager/Views/DNSLookupHostView.xaml.cs @@ -1,48 +1,29 @@ -using System.Windows; -using System.Windows.Controls; -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.Models; using NETworkManager.ViewModels; -namespace NETworkManager.Views -{ - public partial class DNSLookupHostView - { - private readonly DNSLookupHostViewModel _viewModel = new DNSLookupHostViewModel(DialogCoordinator.Instance); - - public DNSLookupHostView() - { - InitializeComponent(); - DataContext = _viewModel; +namespace NETworkManager.Views; - InterTabController.Partition = ApplicationName.DNSLookup.ToString(); - } - - private void ContextMenu_Opened(object sender, RoutedEventArgs e) - { - if (sender is ContextMenu menu) - menu.DataContext = _viewModel; - } +public partial class DNSLookupHostView +{ + private readonly DNSLookupHostViewModel _viewModel = new(); - private void ListBoxItem_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e) - { - if (e.ChangedButton == System.Windows.Input.MouseButton.Left) - _viewModel.LookupProfileCommand.Execute(null); - } + public DNSLookupHostView() + { + InitializeComponent(); + DataContext = _viewModel; + } - public void AddTab(string host) - { - _viewModel.AddTab(host); - } + public void AddTab(string host) + { + _viewModel.AddTab(host); + } - public void OnViewHide() - { - _viewModel.OnViewHide(); - } + public void OnViewHide() + { + _viewModel.OnViewHide(); + } - public void OnViewVisible() - { - _viewModel.OnViewVisible(); - } + public void OnViewVisible() + { + _viewModel.OnViewVisible(); } } diff --git a/Source/NETworkManager/Views/DNSLookupSettingsView.xaml b/Source/NETworkManager/Views/DNSLookupSettingsView.xaml index ce4dd766fe..f1f1fb802f 100644 --- a/Source/NETworkManager/Views/DNSLookupSettingsView.xaml +++ b/Source/NETworkManager/Views/DNSLookupSettingsView.xaml @@ -1,29 +1,29 @@  + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:validators="clr-namespace:NETworkManager.Validators;assembly=NETworkManager.Validators" + xmlns:converters="clr-namespace:NETworkManager.Converters;assembly=NETworkManager.Converters" + xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" + xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" + xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" + xmlns:network="clr-namespace:NETworkManager.Models.Network;assembly=NETworkManager.Models" + xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:DNSLookupSettingsViewModel}"> - + - - + + - - - - - - - - - + + + + - + - - + + - - - + + + - - + - @@ -229,10 +220,12 @@ - + - + @@ -245,12 +238,34 @@ - - - - - + + + + + + + + + - + \ No newline at end of file diff --git a/Source/NETworkManager/Views/DNSLookupView.xaml.cs b/Source/NETworkManager/Views/DNSLookupView.xaml.cs index 29e1d92e51..b00f030485 100644 --- a/Source/NETworkManager/Views/DNSLookupView.xaml.cs +++ b/Source/NETworkManager/Views/DNSLookupView.xaml.cs @@ -1,44 +1,48 @@ -using System.Windows; +using System; +using System.Windows; using System.Windows.Controls; -using System.Windows.Controls.Primitives; -using MahApps.Metro.Controls.Dialogs; +using NETworkManager.Controls; using NETworkManager.ViewModels; -namespace NETworkManager.Views +namespace NETworkManager.Views; + +public partial class DNSLookupView : IDragablzTabItem { - public partial class DNSLookupView + private readonly DNSLookupViewModel _viewModel; + + public DNSLookupView(Guid tabId, string host = null) + { + InitializeComponent(); + + _viewModel = new DNSLookupViewModel(tabId, host); + + DataContext = _viewModel; + + Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted; + } + + public void CloseTab() + { + // Detach the app-lifetime handler so this transient tab view (and its view model) + // can be collected after the tab is closed. + Dispatcher.ShutdownStarted -= Dispatcher_ShutdownStarted; + + _viewModel.OnClose(); + } + + private void UserControl_Loaded(object sender, RoutedEventArgs e) + { + _viewModel.OnLoaded(); + } + + private void Dispatcher_ShutdownStarted(object sender, EventArgs e) + { + _viewModel.OnClose(); + } + + private void ContextMenu_Opened(object sender, RoutedEventArgs e) { - private readonly DNSLookupViewModel _viewModel; - - public DNSLookupView(int tabId, string host = null) - { - InitializeComponent(); - - _viewModel = new DNSLookupViewModel(DialogCoordinator.Instance, tabId, host); - - DataContext = _viewModel; - } - - private void UserControl_Loaded(object sender, RoutedEventArgs e) - { - _viewModel.OnLoaded(); - } - - public void CloseTab() - { - _viewModel.OnClose(); - } - - private void ContextMenu_Opened(object sender, RoutedEventArgs e) - { - if (sender is ContextMenu menu) - menu.DataContext = _viewModel; - } - - private void ColumnHeader_Click(object sender, RoutedEventArgs e) - { - if (sender is DataGridColumnHeader columnHeader) - _viewModel.SortResultByPropertyName(columnHeader.Column.SortMemberPath); - } + if (sender is ContextMenu menu) + menu.DataContext = _viewModel; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager/Views/DNSServerDialog.xaml b/Source/NETworkManager/Views/DNSServerDialog.xaml deleted file mode 100644 index 1c99eb5a33..0000000000 --- a/Source/NETworkManager/Views/DNSServerDialog.xaml +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - + + + + + + + + + + + + + @@ -143,57 +48,56 @@ - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - diff --git a/Source/NETworkManager/Views/DiscoveryProtocolView.xaml.cs b/Source/NETworkManager/Views/DiscoveryProtocolView.xaml.cs index 4b388d7cbe..35281a5be2 100644 --- a/Source/NETworkManager/Views/DiscoveryProtocolView.xaml.cs +++ b/Source/NETworkManager/Views/DiscoveryProtocolView.xaml.cs @@ -1,34 +1,24 @@ -using System.Windows.Controls; -using MahApps.Metro.Controls.Dialogs; -using System.Windows; -using NETworkManager.ViewModels; +using NETworkManager.ViewModels; -namespace NETworkManager.Views -{ - public partial class DiscoveryProtocolView - { - private readonly DiscoveryProtocolViewModel _viewModel = new DiscoveryProtocolViewModel(DialogCoordinator.Instance); +namespace NETworkManager.Views; - public DiscoveryProtocolView() - { - InitializeComponent(); - DataContext = _viewModel; - } +public partial class DiscoveryProtocolView +{ + private readonly DiscoveryProtocolViewModel _viewModel = new(); - private void ContextMenu_Opened(object sender, RoutedEventArgs e) - { - if (sender is ContextMenu menu) - menu.DataContext = _viewModel; - } + public DiscoveryProtocolView() + { + InitializeComponent(); + DataContext = _viewModel; + } - public void OnViewHide() - { - _viewModel.OnViewHide(); - } + public void OnViewHide() + { + _viewModel.OnViewHide(); + } - public void OnViewVisible() - { - _viewModel.OnViewVisible(); - } + public void OnViewVisible() + { + _viewModel.OnViewVisible(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager/Views/DropdownDialog.xaml b/Source/NETworkManager/Views/DropDownChildWindow.xaml similarity index 61% rename from Source/NETworkManager/Views/DropdownDialog.xaml rename to Source/NETworkManager/Views/DropDownChildWindow.xaml index 4e85ad84d4..23afda28c6 100644 --- a/Source/NETworkManager/Views/DropdownDialog.xaml +++ b/Source/NETworkManager/Views/DropDownChildWindow.xaml @@ -1,16 +1,22 @@ - - + xmlns:simpleChildWindow="clr-namespace:MahApps.Metro.SimpleChildWindow;assembly=MahApps.Metro.SimpleChildWindow" + xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" + xmlns:validators="clr-namespace:NETworkManager.Validators;assembly=NETworkManager.Validators" + xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" + CloseButtonCommand="{Binding Path=CancelCommand}" + Style="{StaticResource DefaultChildWindow}" + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:DropDownViewModel}"> + - - + + @@ -19,7 +25,7 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/NETworkManager/Views/FirewallView.xaml.cs b/Source/NETworkManager/Views/FirewallView.xaml.cs new file mode 100644 index 0000000000..aa92079beb --- /dev/null +++ b/Source/NETworkManager/Views/FirewallView.xaml.cs @@ -0,0 +1,74 @@ +using System; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Media; +using NETworkManager.ViewModels; + +namespace NETworkManager.Views; + +/// +/// Code-behind for the firewall view. +/// +public partial class FirewallView +{ + /// + /// View model for the view. + /// + private readonly FirewallViewModel _viewModel = new(); + + /// + /// Initialize view. + /// + public FirewallView() + { + InitializeComponent(); + DataContext = _viewModel; + } + + #region Events + /// + /// Set data context for menus. + /// + /// + /// + private void ContextMenu_Opened(object sender, RoutedEventArgs e) + { + if (sender is ContextMenu menu) + menu.DataContext = _viewModel; + } + + /// + /// Toggles the row details visibility when the expand/collapse chevron is clicked. + /// + private void ExpandRowDetails_OnClick(object sender, RoutedEventArgs e) + { + for (var visual = sender as Visual; visual != null; visual = VisualTreeHelper.GetParent(visual) as Visual) + { + if (visual is not DataGridRow row) + continue; + + row.DetailsVisibility = + row.DetailsVisibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible; + + break; + } + } + + /// + /// Offload event for toggling view to the view model. + /// + public void OnViewHide() + { + _viewModel.OnViewHide(); + } + + /// + /// Offload event for showing the view after editing settings to view model. + /// + public void OnViewVisible() + { + _viewModel.OnViewVisible(); + } + + #endregion +} diff --git a/Source/NETworkManager/Views/FirstRunDialog.xaml b/Source/NETworkManager/Views/FirstRunDialog.xaml deleted file mode 100644 index 07b0dbe4ff..0000000000 --- a/Source/NETworkManager/Views/FirstRunDialog.xaml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/NETworkManager/Views/HostsFileEditorView.xaml.cs b/Source/NETworkManager/Views/HostsFileEditorView.xaml.cs new file mode 100644 index 0000000000..95a14df957 --- /dev/null +++ b/Source/NETworkManager/Views/HostsFileEditorView.xaml.cs @@ -0,0 +1,38 @@ +using NETworkManager.ViewModels; +using System.Windows; +using System.Windows.Controls; + +namespace NETworkManager.Views; + +public partial class HostsFileEditorView +{ + private readonly HostsFileEditorViewModel _viewModel = new(); + + public HostsFileEditorView() + { + InitializeComponent(); + DataContext = _viewModel; + } + + public void OnViewHide() + { + _viewModel.OnViewHide(); + } + + public void OnViewVisible() + { + _viewModel.OnViewVisible(); + } + + private void ContextMenu_Opened(object sender, RoutedEventArgs e) + { + if (sender is ContextMenu menu) + menu.DataContext = _viewModel; + } + + private void DataGridRow_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e) + { + if (_viewModel.EditEntryCommand.CanExecute(null)) + _viewModel.EditEntryCommand.Execute(null); + } +} diff --git a/Source/NETworkManager/Views/IPAddressAndSubnetmaskDialog.xaml b/Source/NETworkManager/Views/IPAddressAndSubnetmaskChildWindow.xaml similarity index 67% rename from Source/NETworkManager/Views/IPAddressAndSubnetmaskDialog.xaml rename to Source/NETworkManager/Views/IPAddressAndSubnetmaskChildWindow.xaml index c9d0e30c89..4debe6118d 100644 --- a/Source/NETworkManager/Views/IPAddressAndSubnetmaskDialog.xaml +++ b/Source/NETworkManager/Views/IPAddressAndSubnetmaskChildWindow.xaml @@ -1,14 +1,19 @@ - - + xmlns:simpleChildWindow="clr-namespace:MahApps.Metro.SimpleChildWindow;assembly=MahApps.Metro.SimpleChildWindow" + xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" + CloseButtonCommand="{Binding Path=CancelCommand}" + Style="{StaticResource DefaultChildWindow}" + Loaded="ChildWindow_OnLoaded" + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:IPAddressAndSubnetmaskViewModel}"> + @@ -17,7 +22,7 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/NETworkManager/Views/IPApiDNSResolverWidgetView.xaml.cs b/Source/NETworkManager/Views/IPApiDNSResolverWidgetView.xaml.cs new file mode 100644 index 0000000000..ed93bf424d --- /dev/null +++ b/Source/NETworkManager/Views/IPApiDNSResolverWidgetView.xaml.cs @@ -0,0 +1,16 @@ + +using NETworkManager.ViewModels; + +namespace NETworkManager.Views; + +public partial class IPApiDNSResolverWidgetView +{ + private readonly IPApiDNSResolverWidgetViewModel _viewModel = new(); + + public IPApiDNSResolverWidgetView() + { + InitializeComponent(); + DataContext = _viewModel; + } + +} \ No newline at end of file diff --git a/Source/NETworkManager/Views/IPApiIPGeolocationWidgetView.xaml b/Source/NETworkManager/Views/IPApiIPGeolocationWidgetView.xaml new file mode 100644 index 0000000000..342b6370a9 --- /dev/null +++ b/Source/NETworkManager/Views/IPApiIPGeolocationWidgetView.xaml @@ -0,0 +1,293 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/NETworkManager/Views/IPApiIPGeolocationWidgetView.xaml.cs b/Source/NETworkManager/Views/IPApiIPGeolocationWidgetView.xaml.cs new file mode 100644 index 0000000000..2e6224f830 --- /dev/null +++ b/Source/NETworkManager/Views/IPApiIPGeolocationWidgetView.xaml.cs @@ -0,0 +1,15 @@ +using NETworkManager.ViewModels; + +namespace NETworkManager.Views; + +public partial class IPApiIPGeolocationWidgetView +{ + private readonly IPApiIPGeolocationWidgetViewModel _viewModel = new(); + + public IPApiIPGeolocationWidgetView() + { + InitializeComponent(); + DataContext = _viewModel; + } + +} \ No newline at end of file diff --git a/Source/NETworkManager/Views/IPGeolocationHostView.xaml b/Source/NETworkManager/Views/IPGeolocationHostView.xaml new file mode 100644 index 0000000000..182ce67b35 --- /dev/null +++ b/Source/NETworkManager/Views/IPGeolocationHostView.xaml @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/NETworkManager/Views/IPGeolocationHostView.xaml.cs b/Source/NETworkManager/Views/IPGeolocationHostView.xaml.cs new file mode 100644 index 0000000000..4f8813acd3 --- /dev/null +++ b/Source/NETworkManager/Views/IPGeolocationHostView.xaml.cs @@ -0,0 +1,24 @@ +using NETworkManager.ViewModels; + +namespace NETworkManager.Views; + +public partial class IPGeolocationHostView +{ + private readonly IPGeolocationHostViewModel _viewModel = new(); + + public IPGeolocationHostView() + { + InitializeComponent(); + DataContext = _viewModel; + } + + public void OnViewHide() + { + _viewModel.OnViewHide(); + } + + public void OnViewVisible() + { + _viewModel.OnViewVisible(); + } +} diff --git a/Source/NETworkManager/Views/IPGeolocationView.xaml b/Source/NETworkManager/Views/IPGeolocationView.xaml new file mode 100644 index 0000000000..084305da81 --- /dev/null +++ b/Source/NETworkManager/Views/IPGeolocationView.xaml @@ -0,0 +1,324 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + \ No newline at end of file diff --git a/Source/NETworkManager/Views/IPScannerHostView.xaml.cs b/Source/NETworkManager/Views/IPScannerHostView.xaml.cs index 7cd18ccf33..25d1d3a18d 100644 --- a/Source/NETworkManager/Views/IPScannerHostView.xaml.cs +++ b/Source/NETworkManager/Views/IPScannerHostView.xaml.cs @@ -1,55 +1,29 @@ -using MahApps.Metro.Controls.Dialogs; using NETworkManager.ViewModels; -using System.Windows; -using System.Windows.Controls; -using NETworkManager.Settings; -using NETworkManager.Profiles; -using NETworkManager.Models; -namespace NETworkManager.Views -{ - public partial class IPScannerHostView - { - private readonly IPScannerHostViewModel _viewModel = new IPScannerHostViewModel(DialogCoordinator.Instance); - - public IPScannerHostView() - { - InitializeComponent(); - DataContext = _viewModel; - - InterTabController.Partition = ApplicationName.IPScanner.ToString(); - } +namespace NETworkManager.Views; - private void ContextMenu_Opened(object sender, RoutedEventArgs e) - { - if (sender is ContextMenu menu) - menu.DataContext = _viewModel; - } - - private void ListBoxItem_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e) - { - if (e.ChangedButton == System.Windows.Input.MouseButton.Left) - _viewModel.ScanProfileCommand.Execute(null); - } +public partial class IPScannerHostView +{ + private readonly IPScannerHostViewModel _viewModel = new(); - public void AddTab(string host) - { - _viewModel.AddTab(host); - } + public IPScannerHostView() + { + InitializeComponent(); + DataContext = _viewModel; + } - public void AddTab(ProfileInfo profile) - { - _viewModel.AddTab(profile); - } + public void AddTab(string host) + { + _viewModel.AddTab(host); + } - public void OnViewHide() - { - _viewModel.OnViewHide(); - } + public void OnViewHide() + { + _viewModel.OnViewHide(); + } - public void OnViewVisible() - { - _viewModel.OnViewVisible(); - } + public void OnViewVisible() + { + _viewModel.OnViewVisible(); } } diff --git a/Source/NETworkManager/Views/IPScannerSettingsView.xaml b/Source/NETworkManager/Views/IPScannerSettingsView.xaml index 20486c6e08..3d3cc946a3 100644 --- a/Source/NETworkManager/Views/IPScannerSettingsView.xaml +++ b/Source/NETworkManager/Views/IPScannerSettingsView.xaml @@ -1,72 +1,69 @@  + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" + xmlns:validators="clr-namespace:NETworkManager.Validators;assembly=NETworkManager.Validators" + xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" + xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" + xmlns:utilities="clr-namespace:NETworkManager.Utilities;assembly=NETworkManager.Utilities" + xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:IPScannerSettingsViewModel}"> - - - - + - - - - - - + + + + + + - - - - + + + + + - + - + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + - + - - - - - - + + + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/Source/NETworkManager/Views/IPScannerSettingsView.xaml.cs b/Source/NETworkManager/Views/IPScannerSettingsView.xaml.cs index d2d367132c..ffacfa9af1 100644 --- a/Source/NETworkManager/Views/IPScannerSettingsView.xaml.cs +++ b/Source/NETworkManager/Views/IPScannerSettingsView.xaml.cs @@ -1,28 +1,27 @@ -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.ViewModels; -using System.Windows; +using System.Windows; using System.Windows.Controls; using System.Windows.Input; +using NETworkManager.ViewModels; -namespace NETworkManager.Views +namespace NETworkManager.Views; + +public partial class IPScannerSettingsView { - public partial class IPScannerSettingsView + private readonly IPScannerSettingsViewModel _viewModel = new(); + + public IPScannerSettingsView() { - private readonly IPScannerSettingsViewModel _viewModel = new IPScannerSettingsViewModel(DialogCoordinator.Instance); + InitializeComponent(); + DataContext = _viewModel; + } - public IPScannerSettingsView() - { - InitializeComponent(); - DataContext = _viewModel; - } - private void RowContextMenu_OnOpened(object sender, RoutedEventArgs e) - { - if (sender is ContextMenu menu) menu.DataContext = _viewModel; - } + private void RowContextMenu_OnOpened(object sender, RoutedEventArgs e) + { + if (sender is ContextMenu menu) menu.DataContext = _viewModel; + } - private void DataGridRow_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - _viewModel.EditCustomCommand(); - } + private void DataGridRow_MouseDoubleClick(object sender, MouseButtonEventArgs e) + { + _viewModel.EditCustomCommand(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager/Views/IPScannerView.xaml b/Source/NETworkManager/Views/IPScannerView.xaml index cf248e14be..c60cf86ed4 100644 --- a/Source/NETworkManager/Views/IPScannerView.xaml +++ b/Source/NETworkManager/Views/IPScannerView.xaml @@ -1,31 +1,38 @@  + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:converters="clr-namespace:NETworkManager.Converters;assembly=NETworkManager.Converters" + xmlns:wpfHelpers="clr-namespace:NETworkManager.Utilities.WPF;assembly=NETworkManager.Utilities.WPF" + xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" + xmlns:mahAppsControls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro" + xmlns:validators="clr-namespace:NETworkManager.Validators;assembly=NETworkManager.Validators" + xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" + xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" + xmlns:network="clr-namespace:NETworkManager.Models.Network;assembly=NETworkManager.Models" + xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" + xmlns:settings="clr-namespace:NETworkManager.Settings;assembly=NETworkManager.Settings" + xmlns:controls="clr-namespace:NETworkManager.Controls;assembly=NETworkManager.Controls" + xmlns:models="clr-namespace:NETworkManager.Models;assembly=NETworkManager.Models" + Loaded="UserControl_Loaded" + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:IPScannerViewModel}"> - - + + + + + - + + + - + + + @@ -34,7 +41,8 @@ - + @@ -51,10 +59,18 @@ - - + + - + @@ -62,34 +78,40 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/NETworkManager/Views/IPScannerView.xaml.cs b/Source/NETworkManager/Views/IPScannerView.xaml.cs index d988623b4a..322727dc1a 100644 --- a/Source/NETworkManager/Views/IPScannerView.xaml.cs +++ b/Source/NETworkManager/Views/IPScannerView.xaml.cs @@ -1,80 +1,172 @@ -using System.Windows; -using NETworkManager.ViewModels; -using MahApps.Metro.Controls.Dialogs; +using System; +using System.Collections; +using System.ComponentModel; +using System.Windows; using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Media; +using NETworkManager.Controls; +using NETworkManager.Models.Network; using NETworkManager.Utilities; +using NETworkManager.ViewModels; +using VisualTreeHelper = System.Windows.Media.VisualTreeHelper; + +namespace NETworkManager.Views; -namespace NETworkManager.Views +public partial class IPScannerView : IDragablzTabItem { - public partial class IPScannerView + private readonly IPScannerViewModel _viewModel; + + public IPScannerView(Guid tabId, string hostOrIPRange = null) { - private readonly IPScannerViewModel _viewModel; + InitializeComponent(); - public IPScannerView(int tabId, string hostOrIPRange = null) - { - InitializeComponent(); + _viewModel = new IPScannerViewModel(tabId, hostOrIPRange); - _viewModel = new IPScannerViewModel(DialogCoordinator.Instance, tabId, hostOrIPRange); + DataContext = _viewModel; - DataContext = _viewModel; + Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted; + } - Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted; - } + public void CloseTab() + { + // Detach the app-lifetime handler so this transient tab view (and its view model) + // can be collected after the tab is closed. + Dispatcher.ShutdownStarted -= Dispatcher_ShutdownStarted; - private void UserControl_Loaded(object sender, RoutedEventArgs e) - { - _viewModel.OnLoaded(); - } + _viewModel.OnClose(); + } - private void Dispatcher_ShutdownStarted(object sender, System.EventArgs e) + private void UserControl_Loaded(object sender, RoutedEventArgs e) + { + _viewModel.OnLoaded(); + } + + private void Dispatcher_ShutdownStarted(object sender, EventArgs e) + { + _viewModel.OnClose(); + } + + private void ContextMenu_Opened(object sender, RoutedEventArgs e) + { + if (sender is not ContextMenu menu) + return; + + // Set DataContext to ViewModel + menu.DataContext = _viewModel; + + // Append custom commands + var index = menu.Items.Count - 1; + + var entryFound = false; + + for (var i = 0; i < menu.Items.Count; i++) { - _viewModel.OnClose(); + if (menu.Items[i] is not MenuItem item) + continue; + + if ((string)item.Tag != "CustomCommands") + continue; + + index = i; + + entryFound = true; + + break; } - public void CloseTab() + if (!entryFound) + return; + + // Clear existing items in custom commands + ((MenuItem)menu.Items[index])?.Items.Clear(); + + // Add items to custom commands + foreach (var info in IPScannerViewModel.CustomCommands) + ((MenuItem)menu.Items[index])?.Items.Add(new MenuItem + { + Header = info.Name, + Command = _viewModel.CustomCommandCommand, + CommandParameter = info.ID + }); + } + + private void ButtonBase_OnClick(object sender, RoutedEventArgs e) + { + // Get the row from the sender + for (var visual = sender as Visual; visual != null; visual = VisualTreeHelper.GetParent(visual) as Visual) { - _viewModel.OnClose(); + if (visual is not DataGridRow row) + continue; + + row.DetailsVisibility = + row.DetailsVisibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible; + + break; } + } - private void ContextMenu_Opened(object sender, RoutedEventArgs e) - { - if (sender is ContextMenu menu) - { - // Set DataContext to ViewModel - menu.DataContext = _viewModel; + private void DataGrid_OnSorting(object sender, DataGridSortingEventArgs e) + { + var column = e.Column; - // Append custom commands - int index = menu.Items.Count - 1; + var selectedComparer = -1; - bool entryFound = false; + switch (column.SortMemberPath) + { + case $"{nameof(PingInfo)}.{nameof(PingInfo.IPAddress)}": + selectedComparer = 0; + break; + case nameof(IPScannerHostInfo.MACAddress): + selectedComparer = 1; + break; + default: + return; + } - for (int i = 0; i < menu.Items.Count; i++) - { - if (menu.Items[i] is MenuItem item) - { - if ((string)item.Tag != "CustomCommands") - continue; + // Prevent the built-in sort from sorting + e.Handled = true; - index = i; + // Get the direction + var direction = column.SortDirection != ListSortDirection.Ascending + ? ListSortDirection.Ascending + : ListSortDirection.Descending; - entryFound = true; + // Update the sort direction + e.Column.SortDirection = direction; - break; - } - } + // Get the view + var view = (ListCollectionView)CollectionViewSource.GetDefaultView(((DataGrid)sender).ItemsSource); - if (!entryFound) - return; + // Sort the view + view.CustomSort = new DataGridComparer(direction, selectedComparer); + } - // Clear existing items in custom commands - ((MenuItem)menu.Items[index]).Items.Clear(); + public class DataGridComparer(ListSortDirection direction, int comparer = -1) : IComparer + { + public int Compare(object x, object y) + { + // No comparer selected + if (comparer == -1) + return 0; - // Add items to custom commands - foreach (CustomCommandInfo info in _viewModel.CustomCommands) - { - ((MenuItem)menu.Items[index]).Items.Add(new MenuItem { Header = info.Name, Command = _viewModel.CustomCommandCommand, CommandParameter = info.ID }); - } - } + // Get data from objects + if (x is not IPScannerHostInfo first || y is not IPScannerHostInfo second) + return 0; + + // Compare the data + return comparer switch + { + // IP address + 0 => direction == ListSortDirection.Ascending + ? IPAddressHelper.CompareIPAddresses(first.PingInfo.IPAddress, second.PingInfo.IPAddress) + : IPAddressHelper.CompareIPAddresses(second.PingInfo.IPAddress, first.PingInfo.IPAddress), + // MAC address + 1 => direction == ListSortDirection.Ascending + ? MACAddressHelper.CompareMACAddresses(first.MACAddress, second.MACAddress) + : MACAddressHelper.CompareMACAddresses(second.MACAddress, first.MACAddress), + _ => 0 + }; } } -} +} \ No newline at end of file diff --git a/Source/NETworkManager/Views/ImportAdComputersChildWindow.xaml b/Source/NETworkManager/Views/ImportAdComputersChildWindow.xaml new file mode 100644 index 0000000000..44b13ea799 --- /dev/null +++ b/Source/NETworkManager/Views/ImportAdComputersChildWindow.xaml @@ -0,0 +1,265 @@ + + + + + + + + + + + + + + + + + + + + - + - - - - + + + - - - - - - - - - - + + + + + + + diff --git a/Source/NETworkManager/Views/ListenersView.xaml.cs b/Source/NETworkManager/Views/ListenersView.xaml.cs index 779a833209..f1b2eff3e1 100644 --- a/Source/NETworkManager/Views/ListenersView.xaml.cs +++ b/Source/NETworkManager/Views/ListenersView.xaml.cs @@ -1,33 +1,78 @@ -using NETworkManager.ViewModels; +using System; +using System.Collections; +using System.ComponentModel; +using System.Windows; using System.Windows.Controls; -using MahApps.Metro.Controls.Dialogs; +using System.Windows.Data; +using NETworkManager.Models.Network; +using NETworkManager.Utilities; +using NETworkManager.ViewModels; -namespace NETworkManager.Views +namespace NETworkManager.Views; + +public partial class ListenersView { - public partial class ListenersView + private readonly ListenersViewModel _viewModel = new(); + + public ListenersView() { - private readonly ListenersViewModel _viewModel = new ListenersViewModel(DialogCoordinator.Instance); + InitializeComponent(); + DataContext = _viewModel; + } - public ListenersView() - { - InitializeComponent(); - DataContext = _viewModel; - } + private void ContextMenu_Opened(object sender, RoutedEventArgs e) + { + if (sender is ContextMenu menu) + menu.DataContext = _viewModel; + } - private void ContextMenu_Opened(object sender, System.Windows.RoutedEventArgs e) - { - if (sender is ContextMenu menu) - menu.DataContext = _viewModel; - } + public void OnViewHide() + { + _viewModel.OnViewHide(); + } - public void OnViewHide() - { - _viewModel.OnViewHide(); - } + public void OnViewVisible() + { + _viewModel.OnViewVisible(); + } + + private void DataGrid_OnSorting(object sender, DataGridSortingEventArgs e) + { + var column = e.Column; + + if (column.SortMemberPath != nameof(ListenerInfo.IPAddress)) + return; + + // Prevent the built-in sort from sorting + e.Handled = true; + + // Get the direction + var direction = column.SortDirection == ListSortDirection.Ascending + ? ListSortDirection.Descending + : ListSortDirection.Ascending; - public void OnViewVisible() + // Update the sort direction + column.SortDirection = direction; + + // Get the view + var view = (ListCollectionView)CollectionViewSource.GetDefaultView(((DataGrid)sender).ItemsSource); + + // Sort the view + view.CustomSort = new DataGridComparer(direction); + } + + public class DataGridComparer(ListSortDirection direction) : IComparer + { + public int Compare(object x, object y) { - _viewModel.OnViewVisible(); + // Get data from objects + if (x is not ListenerInfo first || y is not ListenerInfo second) + return 0; + + // Compare the data + return direction == ListSortDirection.Ascending + ? IPAddressHelper.CompareIPAddresses(first.IPAddress, second.IPAddress) + : IPAddressHelper.CompareIPAddresses(second.IPAddress, first.IPAddress); } } -} +} \ No newline at end of file diff --git a/Source/NETworkManager/Views/LookupHostView.xaml b/Source/NETworkManager/Views/LookupHostView.xaml index 30a8225246..c1e4ed3747 100644 --- a/Source/NETworkManager/Views/LookupHostView.xaml +++ b/Source/NETworkManager/Views/LookupHostView.xaml @@ -1,12 +1,12 @@  + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:views="clr-namespace:NETworkManager.Views" + xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" + xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:LookupHostViewModel}"> @@ -15,4 +15,4 @@ - + \ No newline at end of file diff --git a/Source/NETworkManager/Views/LookupHostView.xaml.cs b/Source/NETworkManager/Views/LookupHostView.xaml.cs index da741eb317..6c4da5623f 100644 --- a/Source/NETworkManager/Views/LookupHostView.xaml.cs +++ b/Source/NETworkManager/Views/LookupHostView.xaml.cs @@ -1,15 +1,24 @@ using NETworkManager.ViewModels; -namespace NETworkManager.Views +namespace NETworkManager.Views; + +public partial class LookupHostView { - public partial class LookupHostView + private readonly LookupHostViewModel _viewModel = new(); + + public LookupHostView() { - private readonly LookupHostViewModel _viewModel = new LookupHostViewModel(); + InitializeComponent(); + DataContext = _viewModel; + } - public LookupHostView() - { - InitializeComponent(); - DataContext = _viewModel; - } + public void OnViewHide() + { + _viewModel.OnViewHide(); + } + + public void OnViewVisible() + { + _viewModel.OnViewVisible(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager/Views/LookupOUILookupView.xaml b/Source/NETworkManager/Views/LookupOUILookupView.xaml index 33ef7ccd9b..62f18f2d57 100644 --- a/Source/NETworkManager/Views/LookupOUILookupView.xaml +++ b/Source/NETworkManager/Views/LookupOUILookupView.xaml @@ -1,25 +1,23 @@  + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:validators="clr-namespace:NETworkManager.Validators;assembly=NETworkManager.Validators" + xmlns:converters="clr-namespace:NETworkManager.Converters;assembly=NETworkManager.Converters" + xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" + xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" + xmlns:mahAppsControls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro" + xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" + xmlns:lookup="clr-namespace:NETworkManager.Models.Lookup;assembly=NETworkManager.Models" + xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" + xmlns:controls="clr-namespace:NETworkManager.Controls;assembly=NETworkManager.Controls" + xmlns:wpfHelpers="clr-namespace:NETworkManager.Utilities.WPF;assembly=NETworkManager.Utilities.WPF" + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:LookupOUILookupViewModel}"> - + @@ -28,14 +26,14 @@ - + - + @@ -43,28 +41,37 @@ - - - - - + + - + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/NETworkManager/Views/NeighborTableView.xaml.cs b/Source/NETworkManager/Views/NeighborTableView.xaml.cs new file mode 100644 index 0000000000..90a839be56 --- /dev/null +++ b/Source/NETworkManager/Views/NeighborTableView.xaml.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections; +using System.ComponentModel; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using NETworkManager.Models.Network; +using NETworkManager.Utilities; +using NETworkManager.ViewModels; + +namespace NETworkManager.Views; + +public partial class NeighborTableView +{ + private readonly NeighborTableViewModel _viewModel = new(); + + public NeighborTableView() + { + InitializeComponent(); + DataContext = _viewModel; + } + + private void ContextMenu_Opened(object sender, RoutedEventArgs e) + { + if (sender is ContextMenu menu) + menu.DataContext = _viewModel; + } + + public void OnViewHide() + { + _viewModel.OnViewHide(); + } + + public void OnViewVisible() + { + _viewModel.OnViewVisible(); + } + + private void DataGrid_OnSorting(object sender, DataGridSortingEventArgs e) + { + var column = e.Column; + + var selectedComparer = -1; + + switch (column.SortMemberPath) + { + case nameof(NeighborInfo.IPAddress): + selectedComparer = 0; + break; + case nameof(NeighborInfo.MACAddress): + selectedComparer = 1; + break; + case nameof(NeighborInfo.InterfaceAlias): + selectedComparer = 2; + break; + case nameof(NeighborInfo.State): + selectedComparer = 3; + break; + default: + return; + } + + // Prevent the built-in sort from sorting + e.Handled = true; + + // Get the direction + var direction = column.SortDirection != ListSortDirection.Ascending + ? ListSortDirection.Ascending + : ListSortDirection.Descending; + + // Update the sort direction + e.Column.SortDirection = direction; + + // Get the view + var view = (ListCollectionView)CollectionViewSource.GetDefaultView(((DataGrid)sender).ItemsSource); + + // Sort the view + view.CustomSort = new DataGridComparer(direction, selectedComparer); + } + + public class DataGridComparer(ListSortDirection direction, int comparer = -1) : IComparer + { + public int Compare(object x, object y) + { + // No comparer selected + if (comparer == -1) + return 0; + + // Get data from objects + if (x is not NeighborInfo first || y is not NeighborInfo second) + return 0; + + return comparer switch + { + // IP address + 0 => direction == ListSortDirection.Ascending + ? IPAddressHelper.CompareIPAddresses(first.IPAddress, second.IPAddress) + : IPAddressHelper.CompareIPAddresses(second.IPAddress, first.IPAddress), + // MAC address + 1 => direction == ListSortDirection.Ascending + ? MACAddressHelper.CompareMACAddresses(first.MACAddress, second.MACAddress) + : MACAddressHelper.CompareMACAddresses(second.MACAddress, first.MACAddress), + // Interface alias + 2 => direction == ListSortDirection.Ascending + ? string.Compare(first.InterfaceAlias, second.InterfaceAlias, System.StringComparison.OrdinalIgnoreCase) + : string.Compare(second.InterfaceAlias, first.InterfaceAlias, System.StringComparison.OrdinalIgnoreCase), + // State + 3 => direction == ListSortDirection.Ascending + ? ((int)first.State).CompareTo((int)second.State) + : ((int)second.State).CompareTo((int)first.State), + _ => 0 + }; + } + } +} diff --git a/Source/NETworkManager/Views/NetworkConnectionView.xaml.cs b/Source/NETworkManager/Views/NetworkConnectionView.xaml.cs deleted file mode 100644 index 8517fb540e..0000000000 --- a/Source/NETworkManager/Views/NetworkConnectionView.xaml.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Windows; -using System.Windows.Controls; -using NETworkManager.ViewModels; - -namespace NETworkManager.Views -{ - public partial class NetworkConnectionView - { - private readonly NetworkConnectionViewModel _viewModel = new NetworkConnectionViewModel(); - - public NetworkConnectionView() - { - InitializeComponent(); - DataContext = _viewModel; - } - - private void ContextMenu_Opened(object sender, RoutedEventArgs e) - { - if (sender is ContextMenu menu) - menu.DataContext = _viewModel; - } - - public void Reload() - { - _viewModel.CheckConnection(); - } - - private void UserControl_Loaded(object sender, RoutedEventArgs e) - { - _viewModel.CheckConnection(); - } - } -} diff --git a/Source/NETworkManager/Views/NetworkConnectionView.xaml b/Source/NETworkManager/Views/NetworkConnectionWidgetView.xaml similarity index 51% rename from Source/NETworkManager/Views/NetworkConnectionView.xaml rename to Source/NETworkManager/Views/NetworkConnectionWidgetView.xaml index 388fb5099e..c7eebc6a7a 100644 --- a/Source/NETworkManager/Views/NetworkConnectionView.xaml +++ b/Source/NETworkManager/Views/NetworkConnectionWidgetView.xaml @@ -1,4 +1,4 @@ - + d:DataContext="{d:DesignInstance viewModels:NetworkConnectionWidgetViewModel}"> - + - - - - - - + + + - + - - + @@ -105,9 +111,10 @@ - + - + @@ -120,25 +127,34 @@ - + - - + + - - - + + + - - - + + + - + - + @@ -149,19 +165,48 @@ - - + - - - - - - - - - + + + + + + + + + + + + + + + + + @@ -176,21 +221,35 @@ - - + + - - - + + + - - - + + + - + + - + \ No newline at end of file diff --git a/Source/NETworkManager/Views/NetworkConnectionWidgetView.xaml.cs b/Source/NETworkManager/Views/NetworkConnectionWidgetView.xaml.cs new file mode 100644 index 0000000000..caf8c582f6 --- /dev/null +++ b/Source/NETworkManager/Views/NetworkConnectionWidgetView.xaml.cs @@ -0,0 +1,19 @@ +using NETworkManager.ViewModels; + +namespace NETworkManager.Views; + +public partial class NetworkConnectionWidgetView +{ + private readonly NetworkConnectionWidgetViewModel _viewModel = new(); + + public NetworkConnectionWidgetView() + { + InitializeComponent(); + DataContext = _viewModel; + } + + public void Check() + { + _viewModel.Check(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager/Views/NetworkInterfaceSettingsView.xaml b/Source/NETworkManager/Views/NetworkInterfaceSettingsView.xaml new file mode 100644 index 0000000000..64e1a969ee --- /dev/null +++ b/Source/NETworkManager/Views/NetworkInterfaceSettingsView.xaml @@ -0,0 +1,17 @@ + + + + + + + diff --git a/Source/NETworkManager/Views/NetworkInterfaceSettingsView.xaml.cs b/Source/NETworkManager/Views/NetworkInterfaceSettingsView.xaml.cs new file mode 100644 index 0000000000..c0ce345c91 --- /dev/null +++ b/Source/NETworkManager/Views/NetworkInterfaceSettingsView.xaml.cs @@ -0,0 +1,14 @@ +using NETworkManager.ViewModels; + +namespace NETworkManager.Views; + +public partial class NetworkInterfaceSettingsView +{ + private readonly NetworkInterfaceSettingsViewModel _viewModel = new(); + + public NetworkInterfaceSettingsView() + { + InitializeComponent(); + DataContext = _viewModel; + } +} diff --git a/Source/NETworkManager/Views/NetworkInterfaceView.xaml b/Source/NETworkManager/Views/NetworkInterfaceView.xaml index 54eac0ef56..aa1da2d67a 100644 --- a/Source/NETworkManager/Views/NetworkInterfaceView.xaml +++ b/Source/NETworkManager/Views/NetworkInterfaceView.xaml @@ -1,22 +1,25 @@  + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:network="clr-namespace:NETworkManager.Models.Network;assembly=NETworkManager.Models" + xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" + xmlns:converters="clr-namespace:NETworkManager.Converters;assembly=NETworkManager.Converters" + xmlns:controls="clr-namespace:NETworkManager.Controls;assembly=NETworkManager.Controls" + xmlns:validators="clr-namespace:NETworkManager.Validators;assembly=NETworkManager.Validators" + xmlns:mahAppsControls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro" + xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" + xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" + xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" + xmlns:settings="clr-namespace:NETworkManager.Settings;assembly=NETworkManager.Settings" + xmlns:internalControls="clr-namespace:NETworkManager.Controls" + xmlns:lvc="clr-namespace:LiveChartsCore.SkiaSharpView.WPF;assembly=LiveChartsCore.SkiaSharpView.WPF" + xmlns:profiles="clr-namespace:NETworkManager.Profiles;assembly=NETworkManager.Profiles" + xmlns:wpfHelpers="clr-namespace:NETworkManager.Utilities.WPF;assembly=NETworkManager.Utilities.WPF" + xmlns:networkManager="clr-namespace:NETworkManager" + xmlns:hostControls="clr-namespace:NETworkManager.Views.Controls" + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:NetworkInterfaceViewModel}"> @@ -24,30 +27,68 @@ + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + @@ -57,28 +98,37 @@ - + - + - - + + @@ -86,36 +136,51 @@ - + - - - - + + - - - + + + @@ -180,51 +257,324 @@ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - + + + - - - - - - - + + + + + + + @@ -469,27 +891,49 @@ - - - - - - - - - - - + + + + + + + + + + + - + - - - - + + + + @@ -501,6 +945,7 @@ + @@ -509,7 +954,8 @@ - + @@ -520,22 +966,29 @@ - + - - + + @@ -543,36 +996,51 @@ - + - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + @@ -781,19 +1408,22 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + - - - - - + + + + - - - diff --git a/Source/NETworkManager/Views/NetworkInterfaceView.xaml.cs b/Source/NETworkManager/Views/NetworkInterfaceView.xaml.cs index 80a4e92723..9dbc85db1e 100644 --- a/Source/NETworkManager/Views/NetworkInterfaceView.xaml.cs +++ b/Source/NETworkManager/Views/NetworkInterfaceView.xaml.cs @@ -1,34 +1,24 @@ -using System.Windows.Controls; -using MahApps.Metro.Controls.Dialogs; -using System.Windows; using NETworkManager.ViewModels; -namespace NETworkManager.Views -{ - public partial class NetworkInterfaceView - { - private readonly NetworkInterfaceViewModel _viewModel = new NetworkInterfaceViewModel(DialogCoordinator.Instance); +namespace NETworkManager.Views; - public NetworkInterfaceView() - { - InitializeComponent(); - DataContext = _viewModel; - } +public partial class NetworkInterfaceView +{ + private readonly NetworkInterfaceViewModel _viewModel = new(); - private void ContextMenu_Opened(object sender, RoutedEventArgs e) - { - if (sender is ContextMenu menu) - menu.DataContext = _viewModel; - } + public NetworkInterfaceView() + { + InitializeComponent(); + DataContext = _viewModel; + } - public void OnViewHide() - { - _viewModel.OnViewHide(); - } + public void OnViewHide() + { + _viewModel.OnViewHide(); + } - public void OnViewVisible() - { - _viewModel.OnViewVisible(); - } + public void OnViewVisible() + { + _viewModel.OnViewVisible(); } } diff --git a/Source/NETworkManager/Views/PingMonitorHostView.xaml b/Source/NETworkManager/Views/PingMonitorHostView.xaml index b205938f64..0d11f8f732 100644 --- a/Source/NETworkManager/Views/PingMonitorHostView.xaml +++ b/Source/NETworkManager/Views/PingMonitorHostView.xaml @@ -1,42 +1,79 @@  - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + - - + @@ -51,25 +88,40 @@ - - + + + - - + - - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - + - - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/Source/NETworkManager/Views/PingMonitorHostView.xaml.cs b/Source/NETworkManager/Views/PingMonitorHostView.xaml.cs index acbcf6b4d8..14ef172187 100644 --- a/Source/NETworkManager/Views/PingMonitorHostView.xaml.cs +++ b/Source/NETworkManager/Views/PingMonitorHostView.xaml.cs @@ -1,45 +1,30 @@ -using MahApps.Metro.Controls.Dialogs; using NETworkManager.ViewModels; -using System.Windows; -using System.Windows.Controls; -namespace NETworkManager.Views -{ - public partial class PingMonitorHostView - { - private readonly PingMonitorHostViewModel _viewModel = new PingMonitorHostViewModel(DialogCoordinator.Instance); +namespace NETworkManager.Views; - public PingMonitorHostView() - { - InitializeComponent(); - DataContext = _viewModel; - } - - private void ContextMenu_Opened(object sender, RoutedEventArgs e) - { - if (sender is ContextMenu menu) - menu.DataContext = _viewModel; - } +public partial class PingMonitorHostView +{ + private readonly PingMonitorHostViewModel _viewModel = new(); - private void ListBoxItem_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e) - { - if (e.ChangedButton == System.Windows.Input.MouseButton.Left) - _viewModel.AddHostProfileCommand.Execute(null); - } + public PingMonitorHostView() + { + InitializeComponent(); + DataContext = _viewModel; + } - public void AddHost(string host) - { - _viewModel.AddHost(host); - } + public void AddHost(string host) + { + if (_viewModel.SetHost(host)) + _ = _viewModel.Start(); + } - public void OnViewHide() - { - _viewModel.OnViewHide(); - } + public void OnViewHide() + { + _viewModel.OnViewHide(); + } - public void OnViewVisible() - { - _viewModel.OnViewVisible(); - } + public void OnViewVisible() + { + _viewModel.OnViewVisible(); } } diff --git a/Source/NETworkManager/Views/PingMonitorSettingsView.xaml b/Source/NETworkManager/Views/PingMonitorSettingsView.xaml index ffd8c5f139..0d3fc125ee 100644 --- a/Source/NETworkManager/Views/PingMonitorSettingsView.xaml +++ b/Source/NETworkManager/Views/PingMonitorSettingsView.xaml @@ -1,26 +1,71 @@  + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" + xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" + xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:PingMonitorSettingsViewModel}"> - - - - + + + + - + - - - - - - - + + + + + + + + + + + + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/Source/NETworkManager/Views/PingMonitorView.xaml.cs b/Source/NETworkManager/Views/PingMonitorView.xaml.cs index 11fc07f205..004d4e1749 100644 --- a/Source/NETworkManager/Views/PingMonitorView.xaml.cs +++ b/Source/NETworkManager/Views/PingMonitorView.xaml.cs @@ -1,45 +1,63 @@ -using NETworkManager.ViewModels; -using System; -using NETworkManager.Models.Network; -using MahApps.Metro.Controls.Dialogs; +using System; +using System.Net; +using System.Windows.Controls; +using NETworkManager.ViewModels; -namespace NETworkManager.Views +namespace NETworkManager.Views; + +public partial class PingMonitorView { - public partial class PingMonitorView + private readonly PingMonitorViewModel _viewModel; + + public PingMonitorView(Guid hostId, Action removeHostByGuid, (IPAddress ipAddress, string hostname) host, + string group) { - private readonly PingMonitorViewModel _viewModel; + InitializeComponent(); - public int HostId => _viewModel.HostId; + _viewModel = new PingMonitorViewModel(hostId, removeHostByGuid, host, group); - public PingMonitorView(int hostId, Action closeCallback, PingMonitorOptions options) - { - InitializeComponent(); + DataContext = _viewModel; + + Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted; + } - _viewModel = new PingMonitorViewModel(DialogCoordinator.Instance, hostId, closeCallback, options); + public Guid HostId => _viewModel.HostId; - DataContext = _viewModel; + public string Group => _viewModel.Group; + + public void Start() + { + _viewModel.Start(); + } - Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted; - } + public void Stop() + { + _viewModel.Stop(); + } - private void UserControl_Loaded(object sender, System.Windows.RoutedEventArgs e) - { - _viewModel.OnLoaded(); - } + /// + /// Releases resources held by the view model. Must be called when the host is removed. + /// + public void Cleanup() + { + // Release the app-lifetime subscription so this transient per-host view (and its + // view model) is not kept alive until the application shuts down. + Dispatcher.ShutdownStarted -= Dispatcher_ShutdownStarted; - public void Export() - { - _viewModel.Export(); - } + _viewModel.Cleanup(); + } - private void Dispatcher_ShutdownStarted(object sender, EventArgs e) - { - _viewModel.OnClose(); - } + private void Dispatcher_ShutdownStarted(object sender, EventArgs e) + { + Stop(); + } - public void CloseView() - { - _viewModel.OnClose(); - } + /// + /// Suppresses the host context menu while the pointer is over the chart, so a + /// right-click drag can be used to zoom into a section instead of opening the menu. + /// + private void Chart_ContextMenuOpening(object sender, ContextMenuEventArgs e) + { + e.Handled = true; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager/Views/PortProfileDialog.xaml b/Source/NETworkManager/Views/PortProfileChildWindow.xaml similarity index 79% rename from Source/NETworkManager/Views/PortProfileDialog.xaml rename to Source/NETworkManager/Views/PortProfileChildWindow.xaml index 5ad29030ab..2d17d6c0ec 100644 --- a/Source/NETworkManager/Views/PortProfileDialog.xaml +++ b/Source/NETworkManager/Views/PortProfileChildWindow.xaml @@ -1,14 +1,19 @@ - - + xmlns:simpleChildWindow="clr-namespace:MahApps.Metro.SimpleChildWindow;assembly=MahApps.Metro.SimpleChildWindow" + xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" + CloseButtonCommand="{Binding Path=CancelCommand}" + Style="{StaticResource DefaultChildWindow}" + Loaded="ChildWindow_OnLoaded" + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:PortProfileViewModel}"> + @@ -30,7 +35,8 @@ - + - + - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + \ No newline at end of file diff --git a/Source/NETworkManager/Views/PortScannerHostView.xaml.cs b/Source/NETworkManager/Views/PortScannerHostView.xaml.cs index 2d7666b2eb..30e612a289 100644 --- a/Source/NETworkManager/Views/PortScannerHostView.xaml.cs +++ b/Source/NETworkManager/Views/PortScannerHostView.xaml.cs @@ -1,55 +1,29 @@ -using MahApps.Metro.Controls.Dialogs; using NETworkManager.ViewModels; -using System.Windows; -using System.Windows.Controls; -using NETworkManager.Settings; -using NETworkManager.Profiles; -using NETworkManager.Models; -namespace NETworkManager.Views -{ - public partial class PortScannerHostView - { - private readonly PortScannerHostViewModel _viewModel = new PortScannerHostViewModel(DialogCoordinator.Instance); - - public PortScannerHostView() - { - InitializeComponent(); - DataContext = _viewModel; - - InterTabController.Partition = ApplicationName.PortScanner.ToString(); - } +namespace NETworkManager.Views; - private void ContextMenu_Opened(object sender, RoutedEventArgs e) - { - if (sender is ContextMenu menu) - menu.DataContext = _viewModel; - } - - private void ListBoxItem_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e) - { - if (e.ChangedButton == System.Windows.Input.MouseButton.Left) - _viewModel.ScanProfileCommand.Execute(null); - } +public partial class PortScannerHostView +{ + private readonly PortScannerHostViewModel _viewModel = new(); - public void AddTab(string host) - { - _viewModel.AddTab(host); - } + public PortScannerHostView() + { + InitializeComponent(); + DataContext = _viewModel; + } - public void AddTab(ProfileInfo profile) - { - _viewModel.AddTab(profile); - } + public void AddTab(string host) + { + _viewModel.AddTab(host); + } - public void OnViewHide() - { - _viewModel.OnViewHide(); - } + public void OnViewHide() + { + _viewModel.OnViewHide(); + } - public void OnViewVisible() - { - _viewModel.OnViewVisible(); - } + public void OnViewVisible() + { + _viewModel.OnViewVisible(); } } diff --git a/Source/NETworkManager/Views/PortScannerSettingsView.xaml b/Source/NETworkManager/Views/PortScannerSettingsView.xaml index 593685544a..27077b6ac8 100644 --- a/Source/NETworkManager/Views/PortScannerSettingsView.xaml +++ b/Source/NETworkManager/Views/PortScannerSettingsView.xaml @@ -1,24 +1,24 @@  + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" + xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" + xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" + xmlns:network="clr-namespace:NETworkManager.Models.Network;assembly=NETworkManager.Models" + xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:PortScannerSettingsViewModel}"> - - + + - - - - - - - - - - - - - - - - + + + + - + + + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/Source/NETworkManager/Views/PortScannerSettingsView.xaml.cs b/Source/NETworkManager/Views/PortScannerSettingsView.xaml.cs index 31c2f10574..ccc2fcd599 100644 --- a/Source/NETworkManager/Views/PortScannerSettingsView.xaml.cs +++ b/Source/NETworkManager/Views/PortScannerSettingsView.xaml.cs @@ -1,29 +1,29 @@ -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.ViewModels; -using System.Windows; +using System.Windows; using System.Windows.Controls; using System.Windows.Input; +using NETworkManager.ViewModels; -namespace NETworkManager.Views +namespace NETworkManager.Views; + +public partial class PortScannerSettingsView { - public partial class PortScannerSettingsView + private readonly PortScannerSettingsViewModel _viewModel = new(); + + public PortScannerSettingsView() { - private readonly PortScannerSettingsViewModel _viewModel = new PortScannerSettingsViewModel(DialogCoordinator.Instance); + InitializeComponent(); + DataContext = _viewModel; + } - public PortScannerSettingsView() - { - InitializeComponent(); - DataContext = _viewModel; - } - private void RowContextMenu_OnOpened(object sender, RoutedEventArgs e) - { - if (sender is ContextMenu menu) - menu.DataContext = _viewModel; - } + private void RowContextMenu_OnOpened(object sender, RoutedEventArgs e) + { + if (sender is ContextMenu menu) + menu.DataContext = _viewModel; + } - private void DataGridRow_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - _viewModel.EditPortProfile(); - } + private void DataGridRow_MouseDoubleClick(object sender, MouseButtonEventArgs e) + { + if (_viewModel.EditPortProfileCommand.CanExecute(null)) + _viewModel.EditPortProfileCommand.Execute(null); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager/Views/PortScannerView.xaml b/Source/NETworkManager/Views/PortScannerView.xaml index 4661f7c978..54bb2151fa 100644 --- a/Source/NETworkManager/Views/PortScannerView.xaml +++ b/Source/NETworkManager/Views/PortScannerView.xaml @@ -1,27 +1,26 @@  + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" + xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" + xmlns:validators="clr-namespace:NETworkManager.Validators;assembly=NETworkManager.Validators" + xmlns:converters="clr-namespace:NETworkManager.Converters;assembly=NETworkManager.Converters" + xmlns:mahappsControls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro" + xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" + xmlns:network="clr-namespace:NETworkManager.Models.Network;assembly=NETworkManager.Models" + xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" + xmlns:controls="clr-namespace:NETworkManager.Controls;assembly=NETworkManager.Controls" + xmlns:settings="clr-namespace:NETworkManager.Settings;assembly=NETworkManager.Settings" + xmlns:wpfHelpers="clr-namespace:NETworkManager.Utilities.WPF;assembly=NETworkManager.Utilities.WPF" + Loaded="UserControl_Loaded" + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:PortScannerViewModel}"> - - + + @@ -42,20 +41,28 @@ - + - + - - + + - + @@ -63,8 +70,16 @@ - - + + @@ -74,13 +89,14 @@ - - + - + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - + \ No newline at end of file diff --git a/Source/NETworkManager/Views/PowerShellHostView.xaml.cs b/Source/NETworkManager/Views/PowerShellHostView.xaml.cs index 2fbd1a1567..9c80c79016 100644 --- a/Source/NETworkManager/Views/PowerShellHostView.xaml.cs +++ b/Source/NETworkManager/Views/PowerShellHostView.xaml.cs @@ -1,62 +1,49 @@ -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.Models; using NETworkManager.ViewModels; using System.Threading.Tasks; using System.Windows; -using System.Windows.Controls; -namespace NETworkManager.Views +namespace NETworkManager.Views; + +public partial class PowerShellHostView { - public partial class PowerShellHostView + private readonly PowerShellHostViewModel _viewModel = new(); + + private bool _loaded; + + public PowerShellHostView() + { + InitializeComponent(); + DataContext = _viewModel; + } + + private void UserControl_Loaded(object sender, RoutedEventArgs e) + { + _loaded = true; + } + + public async void AddTab(string host) + { + // Wait for the interface to load, before displaying the dialog to connect a new profile... + // MahApps will throw an exception... + while (!_loaded) + await Task.Delay(250); + + if (_viewModel.IsExecutableConfigured) + _viewModel.AddTab(host); + } + + public void OnViewHide() + { + _viewModel.OnViewHide(); + } + + public void OnViewVisible() + { + _viewModel.OnViewVisible(); + } + + public void FocusEmbeddedWindow() { - private readonly PowerShellHostViewModel _viewModel = new PowerShellHostViewModel(DialogCoordinator.Instance); - - private bool _loaded; - - public PowerShellHostView() - { - InitializeComponent(); - DataContext = _viewModel; - - InterTabController.Partition = ApplicationName.PowerShell.ToString(); - } - - private void UserControl_Loaded(object sender, RoutedEventArgs e) - { - _loaded = true; - } - - private void ContextMenu_Opened(object sender, RoutedEventArgs e) - { - if (sender is ContextMenu menu) - menu.DataContext = _viewModel; - } - - private void ListBoxItem_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e) - { - if (e.ChangedButton == System.Windows.Input.MouseButton.Left) - _viewModel.ConnectProfileCommand.Execute(null); - } - - public async Task AddTab(string host) - { - // Wait for the interface to load, before displaying the dialog to connect a new profile... - // MahApps will throw an exception... - while (!_loaded) - await Task.Delay(100); - - if (_viewModel.IsConfigured) - _viewModel.AddTab(host); - } - - public void OnViewHide() - { - _viewModel.OnViewHide(); - } - - public void OnViewVisible() - { - _viewModel.OnViewVisible(); - } + _viewModel.FocusEmbeddedWindow(); } } diff --git a/Source/NETworkManager/Views/PowerShellSettingsView.xaml b/Source/NETworkManager/Views/PowerShellSettingsView.xaml index 8bab1e87e1..5d30cc99f3 100644 --- a/Source/NETworkManager/Views/PowerShellSettingsView.xaml +++ b/Source/NETworkManager/Views/PowerShellSettingsView.xaml @@ -1,32 +1,105 @@  + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" + xmlns:validators="clr-namespace:NETworkManager.Validators;assembly=NETworkManager.Validators" + xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" + xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:PowerShellSettingsViewModel}"> - - + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + + + + - - - - + \ No newline at end of file diff --git a/Source/NETworkManager/Views/ProfilesView.xaml.cs b/Source/NETworkManager/Views/ProfilesView.xaml.cs index acd199b4bc..a26627cf2e 100644 --- a/Source/NETworkManager/Views/ProfilesView.xaml.cs +++ b/Source/NETworkManager/Views/ProfilesView.xaml.cs @@ -1,47 +1,47 @@ -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.ViewModels; -using System.Windows; +using System.Windows; using System.Windows.Controls; using System.Windows.Input; +using NETworkManager.ViewModels; + +namespace NETworkManager.Views; -namespace NETworkManager.Views +public partial class ProfilesView { - public partial class ProfilesView + private readonly ProfilesViewModel _viewModel = new(); + + public ProfilesView() + { + InitializeComponent(); + DataContext = _viewModel; + } + + private void ContextMenu_Opened(object sender, RoutedEventArgs e) + { + if (sender is ContextMenu menu) + menu.DataContext = _viewModel; + } + + private void DataGridGroupsRow_MouseDoubleClick(object sender, MouseButtonEventArgs e) + { + if (e.ChangedButton == MouseButton.Left) + if (_viewModel.EditGroupCommand.CanExecute(null)) + _viewModel.EditGroupCommand.Execute(null); + } + + private void DataGridProfilesRow_MouseDoubleClick(object sender, MouseButtonEventArgs e) + { + if (e.ChangedButton == MouseButton.Left) + if (_viewModel.EditProfileCommand.CanExecute(null)) + _viewModel.EditProfileCommand.Execute(null); + } + + public void OnViewVisible() + { + _viewModel.OnViewVisible(); + } + + public void OnViewHide() { - private readonly ProfilesViewModel _viewModel = new ProfilesViewModel(DialogCoordinator.Instance); - - public ProfilesView() - { - InitializeComponent(); - DataContext = _viewModel; - } - - private void ContextMenu_Opened(object sender, RoutedEventArgs e) - { - if (sender is ContextMenu menu) - menu.DataContext = _viewModel; - } - - private void DataGridGroupsRow_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - if (e.ChangedButton == MouseButton.Left) - { - if (_viewModel.EditGroupCommand.CanExecute(null)) - _viewModel.EditGroupCommand.Execute(null); - } - } - private void DataGridProfilesRow_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - if (e.ChangedButton == MouseButton.Left) - { - if (_viewModel.EditProfileCommand.CanExecute(null)) - _viewModel.EditProfileCommand.Execute(null); - } - } - - public void Refresh() - { - _viewModel.RefreshProfiles(); - } + _viewModel.OnViewHide(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager/Views/PuTTYConnectChildWindow.xaml b/Source/NETworkManager/Views/PuTTYConnectChildWindow.xaml new file mode 100644 index 0000000000..9bde7d772c --- /dev/null +++ b/Source/NETworkManager/Views/PuTTYConnectChildWindow.xaml @@ -0,0 +1,363 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - + \ No newline at end of file diff --git a/Source/NETworkManager/Views/PuTTYHostView.xaml.cs b/Source/NETworkManager/Views/PuTTYHostView.xaml.cs index 1b55d0147a..819d3310cb 100644 --- a/Source/NETworkManager/Views/PuTTYHostView.xaml.cs +++ b/Source/NETworkManager/Views/PuTTYHostView.xaml.cs @@ -1,62 +1,49 @@ -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.Models; using NETworkManager.ViewModels; using System.Threading.Tasks; using System.Windows; -using System.Windows.Controls; -namespace NETworkManager.Views +namespace NETworkManager.Views; + +public partial class PuTTYHostView { - public partial class PuTTYHostView + private readonly PuTTYHostViewModel _viewModel = new(); + + private bool _loaded; + + public PuTTYHostView() + { + InitializeComponent(); + DataContext = _viewModel; + } + + private void UserControl_Loaded(object sender, RoutedEventArgs e) + { + _loaded = true; + } + + public async void AddTab(string host) + { + // Wait for the interface to load, before displaying the dialog to connect a new profile... + // MahApps will throw an exception... + while (!_loaded) + await Task.Delay(250); + + if (_viewModel.IsExecutableConfigured) + _viewModel.AddTab(host); + } + + public void OnViewHide() + { + _viewModel.OnViewHide(); + } + + public void OnViewVisible() + { + _viewModel.OnViewVisible(); + } + + public void FocusEmbeddedWindow() { - private readonly PuTTYHostViewModel _viewModel = new PuTTYHostViewModel(DialogCoordinator.Instance); - - private bool _loaded; - - public PuTTYHostView() - { - InitializeComponent(); - DataContext = _viewModel; - - InterTabController.Partition = ApplicationName.PuTTY.ToString(); - } - - private void UserControl_Loaded(object sender, RoutedEventArgs e) - { - _loaded = true; - } - - private void ContextMenu_Opened(object sender, RoutedEventArgs e) - { - if (sender is ContextMenu menu) - menu.DataContext = _viewModel; - } - - private void ListBoxItem_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e) - { - if (e.ChangedButton == System.Windows.Input.MouseButton.Left) - _viewModel.ConnectProfileCommand.Execute(null); - } - - public async Task AddTab(string host) - { - // Wait for the interface to load, before displaying the dialog to connect a new profile... - // MahApps will throw an exception... - while (!_loaded) - await Task.Delay(100); - - if (_viewModel.IsConfigured) - _viewModel.AddTab(host); - } - - public void OnViewHide() - { - _viewModel.OnViewHide(); - } - - public void OnViewVisible() - { - _viewModel.OnViewVisible(); - } + _viewModel.FocusEmbeddedWindow(); } } diff --git a/Source/NETworkManager/Views/PuTTYSettingsView.xaml b/Source/NETworkManager/Views/PuTTYSettingsView.xaml index 0203217cd5..40429b880f 100644 --- a/Source/NETworkManager/Views/PuTTYSettingsView.xaml +++ b/Source/NETworkManager/Views/PuTTYSettingsView.xaml @@ -1,37 +1,44 @@  + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" + xmlns:validators="clr-namespace:NETworkManager.Validators;assembly=NETworkManager.Validators" + xmlns:converters="clr-namespace:NETworkManager.Converters;assembly=NETworkManager.Converters" + xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" + xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:PuTTYSettingsViewModel}"> - - - + + + - + - + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + \ No newline at end of file diff --git a/Source/NETworkManager/Views/RemoteDesktopHostView.xaml.cs b/Source/NETworkManager/Views/RemoteDesktopHostView.xaml.cs index 829e67e0c1..d33633292b 100644 --- a/Source/NETworkManager/Views/RemoteDesktopHostView.xaml.cs +++ b/Source/NETworkManager/Views/RemoteDesktopHostView.xaml.cs @@ -1,60 +1,43 @@ -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.Models; using NETworkManager.ViewModels; using System.Threading.Tasks; using System.Windows; -using System.Windows.Controls; -namespace NETworkManager.Views +namespace NETworkManager.Views; + +public partial class RemoteDesktopHostView { - public partial class RemoteDesktopHostView + private readonly RemoteDesktopHostViewModel _viewModel = new(); + + private bool _loaded; + + public RemoteDesktopHostView() + { + InitializeComponent(); + DataContext = _viewModel; + } + + private void UserControl_Loaded(object sender, RoutedEventArgs e) + { + _loaded = true; + } + + public async void AddTab(string host) + { + // Wait for the interface to load, before displaying the dialog to connect a new Profile... + // MahApps will throw an exception... + while (!_loaded) + await Task.Delay(250); + + _viewModel.AddTab(host); + } + + public void OnViewHide() + { + _viewModel.OnViewHide(); + } + + public void OnViewVisible() { - private readonly RemoteDesktopHostViewModel _viewModel = new RemoteDesktopHostViewModel(DialogCoordinator.Instance); - - private bool _loaded; - - public RemoteDesktopHostView() - { - InitializeComponent(); - DataContext = _viewModel; - - InterTabController.Partition = ApplicationName.RemoteDesktop.ToString(); - } - - private void UserControl_Loaded(object sender, RoutedEventArgs e) - { - _loaded = true; - } - - private void ContextMenu_Opened(object sender, RoutedEventArgs e) - { - if (sender is ContextMenu menu) menu.DataContext = _viewModel; - } - - private void ListBoxItem_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e) - { - if (e.ChangedButton == System.Windows.Input.MouseButton.Left) - _viewModel.ConnectProfileCommand.Execute(null); - } - - public async Task AddTab(string host) - { - // Wait for the interface to load, before displaying the dialog to connect a new Profile... - // MahApps will throw an exception... - while (!_loaded) - await Task.Delay(100); - - _viewModel.AddTab(host); - } - - public void OnViewHide() - { - _viewModel.OnViewHide(); - } - - public void OnViewVisible() - { - _viewModel.OnViewVisible(); - } + _viewModel.OnViewVisible(); } } diff --git a/Source/NETworkManager/Views/RemoteDesktopSettingsView.xaml b/Source/NETworkManager/Views/RemoteDesktopSettingsView.xaml index 1e6a6aa813..a5fd7a44b8 100644 --- a/Source/NETworkManager/Views/RemoteDesktopSettingsView.xaml +++ b/Source/NETworkManager/Views/RemoteDesktopSettingsView.xaml @@ -1,33 +1,50 @@  + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" + xmlns:validators="clr-namespace:NETworkManager.Validators;assembly=NETworkManager.Validators" + xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" + xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" + xmlns:converters="clr-namespace:NETworkManager.Converters;assembly=NETworkManager.Converters" + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:RemoteDesktopSettingsViewModel}"> - - - - + + + + + - - - - + + + + - - + + - - + + @@ -39,7 +56,8 @@ - + @@ -50,7 +68,8 @@ - + @@ -63,11 +82,16 @@ - - + + - - + + @@ -77,59 +101,128 @@ + + - - + + - + - - - - - - + + + + + + - + \ No newline at end of file diff --git a/Source/NETworkManager/Views/RemoteDesktopSettingsView.xaml.cs b/Source/NETworkManager/Views/RemoteDesktopSettingsView.xaml.cs index dad7506474..b804d33479 100644 --- a/Source/NETworkManager/Views/RemoteDesktopSettingsView.xaml.cs +++ b/Source/NETworkManager/Views/RemoteDesktopSettingsView.xaml.cs @@ -1,15 +1,14 @@ using NETworkManager.ViewModels; -namespace NETworkManager.Views +namespace NETworkManager.Views; + +public partial class RemoteDesktopSettingsView { - public partial class RemoteDesktopSettingsView - { - private readonly RemoteDesktopSettingsViewModel _viewModel = new RemoteDesktopSettingsViewModel(); + private readonly RemoteDesktopSettingsViewModel _viewModel = new(); - public RemoteDesktopSettingsView() - { - InitializeComponent(); - DataContext = _viewModel; - } + public RemoteDesktopSettingsView() + { + InitializeComponent(); + DataContext = _viewModel; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager/Views/SNMPHostView.xaml b/Source/NETworkManager/Views/SNMPHostView.xaml index 0c1ef7b278..003dd4dfd5 100644 --- a/Source/NETworkManager/Views/SNMPHostView.xaml +++ b/Source/NETworkManager/Views/SNMPHostView.xaml @@ -1,54 +1,123 @@  + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:dragablz="clr-namespace:Dragablz;assembly=Dragablz" + xmlns:dockablz="clr-namespace:Dragablz.Dockablz;assembly=Dragablz" + xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" + xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" + xmlns:converters="clr-namespace:NETworkManager.Converters;assembly=NETworkManager.Converters" + xmlns:controls="clr-namespace:NETworkManager.Controls;assembly=NETworkManager.Controls" + xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" + xmlns:settings="clr-namespace:NETworkManager.Settings;assembly=NETworkManager.Settings" + xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" + xmlns:profiles="clr-namespace:NETworkManager.Profiles;assembly=NETworkManager.Profiles" + xmlns:wpfHelpers="clr-namespace:NETworkManager.Utilities.WPF;assembly=NETworkManager.Utilities.WPF" + xmlns:networkManager="clr-namespace:NETworkManager" + xmlns:hostControls="clr-namespace:NETworkManager.Views.Controls" + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:SNMPHostViewModel}"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/Source/NETworkManager/Views/SNMPHostView.xaml.cs b/Source/NETworkManager/Views/SNMPHostView.xaml.cs index d3c8907ce1..fb7a33a8b7 100644 --- a/Source/NETworkManager/Views/SNMPHostView.xaml.cs +++ b/Source/NETworkManager/Views/SNMPHostView.xaml.cs @@ -1,33 +1,29 @@ -using NETworkManager.Models; using NETworkManager.ViewModels; -namespace NETworkManager.Views -{ - public partial class SNMPHostView - { - private readonly SNMPHostViewModel _viewModel = new SNMPHostViewModel(); +namespace NETworkManager.Views; - public SNMPHostView() - { - InitializeComponent(); - DataContext = _viewModel; +public partial class SNMPHostView +{ + private readonly SNMPHostViewModel _viewModel = new(); - InterTabController.Partition = ApplicationName.PuTTY.ToString(); - } + public SNMPHostView() + { + InitializeComponent(); + DataContext = _viewModel; + } - public void AddTab(string host) - { - _viewModel.AddTab(host); - } + public void AddTab(string host) + { + _viewModel.AddTab(host); + } - public void OnViewHide() - { - _viewModel.OnViewHide(); - } + public void OnViewHide() + { + _viewModel.OnViewHide(); + } - public void OnViewVisible() - { - _viewModel.OnViewVisible(); - } + public void OnViewVisible() + { + _viewModel.OnViewVisible(); } } diff --git a/Source/NETworkManager/Views/CustomCommandDialog.xaml b/Source/NETworkManager/Views/SNMPOIDProfileChildWindow.xaml similarity index 63% rename from Source/NETworkManager/Views/CustomCommandDialog.xaml rename to Source/NETworkManager/Views/SNMPOIDProfileChildWindow.xaml index f3269c0149..1b6c5145b0 100644 --- a/Source/NETworkManager/Views/CustomCommandDialog.xaml +++ b/Source/NETworkManager/Views/SNMPOIDProfileChildWindow.xaml @@ -1,14 +1,20 @@ - - + xmlns:simpleChildWindow="clr-namespace:MahApps.Metro.SimpleChildWindow;assembly=MahApps.Metro.SimpleChildWindow" + xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" + CloseButtonCommand="{Binding Path=CancelCommand}" + Style="{StaticResource DefaultChildWindow}" + Loaded="ChildWindow_OnLoaded" + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:SNMPOIDProfileViewModel}"> + @@ -23,8 +29,6 @@ - - @@ -34,7 +38,8 @@ - + - - + + + + + + + + - + + + + + + - - - - + + + + - - + + @@ -25,9 +115,5 @@ - - - - \ No newline at end of file diff --git a/Source/NETworkManager/Views/SNMPSettingsView.xaml.cs b/Source/NETworkManager/Views/SNMPSettingsView.xaml.cs index a4417bc7d4..69cde43e47 100644 --- a/Source/NETworkManager/Views/SNMPSettingsView.xaml.cs +++ b/Source/NETworkManager/Views/SNMPSettingsView.xaml.cs @@ -1,15 +1,29 @@ -using NETworkManager.ViewModels; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using NETworkManager.ViewModels; -namespace NETworkManager.Views +namespace NETworkManager.Views; + +public partial class SNMPSettingsView { - public partial class SNMPSettingsView + private readonly SNMPSettingsViewModel _viewModel = new(); + + public SNMPSettingsView() { - private readonly SNMPSettingsViewModel _viewModel = new SNMPSettingsViewModel(); + InitializeComponent(); + DataContext = _viewModel; + } - public SNMPSettingsView() - { - InitializeComponent(); - DataContext = _viewModel; - } + private void RowContextMenu_OnOpened(object sender, RoutedEventArgs e) + { + if (sender is ContextMenu menu) + menu.DataContext = _viewModel; + } + + private void DataGridRow_MouseDoubleClick(object sender, MouseButtonEventArgs e) + { + if (_viewModel.EditOIDProfileCommand.CanExecute(null)) + _viewModel.EditOIDProfileCommand.Execute(null); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager/Views/SNMPView.xaml b/Source/NETworkManager/Views/SNMPView.xaml index 4b5739068b..cd62d56e7a 100644 --- a/Source/NETworkManager/Views/SNMPView.xaml +++ b/Source/NETworkManager/Views/SNMPView.xaml @@ -1,27 +1,22 @@  + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:converters="clr-namespace:NETworkManager.Converters;assembly=NETworkManager.Converters" + xmlns:controls="clr-namespace:NETworkManager.Controls;assembly=NETworkManager.Controls" + xmlns:validators="clr-namespace:NETworkManager.Validators;assembly=NETworkManager.Validators" + xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" + xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" + xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" + xmlns:network="clr-namespace:NETworkManager.Models.Network;assembly=NETworkManager.Models" + xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" + xmlns:wpfHelpers="clr-namespace:NETworkManager.Utilities.WPF;assembly=NETworkManager.Utilities.WPF" + xmlns:interactivity="http://schemas.microsoft.com/xaml/behaviors" + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:SNMPViewModel}"> - + - - @@ -38,7 +33,8 @@ - + @@ -49,6 +45,8 @@ + + @@ -61,8 +59,17 @@ - - + + @@ -71,22 +78,75 @@ - - - - - - + + + + + + + + + + + + - + - + + + + + - - + + + - + - - - - + + + + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - + + + + - + - - - + + + + + + - + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/NETworkManager/Views/SNTPLookupHostView.xaml.cs b/Source/NETworkManager/Views/SNTPLookupHostView.xaml.cs new file mode 100644 index 0000000000..1a0eaf30fe --- /dev/null +++ b/Source/NETworkManager/Views/SNTPLookupHostView.xaml.cs @@ -0,0 +1,24 @@ +using NETworkManager.ViewModels; + +namespace NETworkManager.Views; + +public partial class SNTPLookupHostView +{ + private readonly SNTPLookupHostViewModel _viewModel = new(); + + public SNTPLookupHostView() + { + InitializeComponent(); + DataContext = _viewModel; + } + + public void OnViewHide() + { + _viewModel.OnViewHide(); + } + + public void OnViewVisible() + { + _viewModel.OnViewVisible(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager/Views/SNTPLookupSettingsView.xaml b/Source/NETworkManager/Views/SNTPLookupSettingsView.xaml new file mode 100644 index 0000000000..7f2dc82fa6 --- /dev/null +++ b/Source/NETworkManager/Views/SNTPLookupSettingsView.xaml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/NETworkManager/Views/SNTPLookupSettingsView.xaml.cs b/Source/NETworkManager/Views/SNTPLookupSettingsView.xaml.cs new file mode 100644 index 0000000000..003d8f0f30 --- /dev/null +++ b/Source/NETworkManager/Views/SNTPLookupSettingsView.xaml.cs @@ -0,0 +1,29 @@ +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using NETworkManager.ViewModels; + +namespace NETworkManager.Views; + +public partial class SNTPLookupSettingsView +{ + private readonly SNTPLookupSettingsViewModel _viewModel = new(); + + public SNTPLookupSettingsView() + { + InitializeComponent(); + DataContext = _viewModel; + } + + private void ContextMenu_Opened(object sender, RoutedEventArgs e) + { + if (sender is ContextMenu menu) + menu.DataContext = _viewModel; + } + + private void DataGridRow_MouseDoubleClick(object sender, MouseButtonEventArgs e) + { + if (_viewModel.EditServerCommand.CanExecute(null)) + _viewModel.EditServerCommand.Execute(null); + } +} \ No newline at end of file diff --git a/Source/NETworkManager/Views/SNTPLookupView.xaml b/Source/NETworkManager/Views/SNTPLookupView.xaml new file mode 100644 index 0000000000..47688067a6 --- /dev/null +++ b/Source/NETworkManager/Views/SNTPLookupView.xaml @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/NETworkManager/Views/SNTPLookupView.xaml.cs b/Source/NETworkManager/Views/SNTPLookupView.xaml.cs new file mode 100644 index 0000000000..d5eba290b6 --- /dev/null +++ b/Source/NETworkManager/Views/SNTPLookupView.xaml.cs @@ -0,0 +1,43 @@ +using System; +using System.Windows; +using System.Windows.Controls; +using NETworkManager.Controls; +using NETworkManager.ViewModels; + +namespace NETworkManager.Views; + +public partial class SNTPLookupView : IDragablzTabItem +{ + private readonly SNTPLookupViewModel _viewModel; + + public SNTPLookupView(Guid tabId) + { + InitializeComponent(); + + _viewModel = new SNTPLookupViewModel(tabId); + + DataContext = _viewModel; + + Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted; + } + + public void CloseTab() + { + // Detach the app-lifetime handler so this transient tab view (and its view model) + // can be collected after the tab is closed. + Dispatcher.ShutdownStarted -= Dispatcher_ShutdownStarted; + + _viewModel.OnClose(); + } + + private void Dispatcher_ShutdownStarted(object sender, EventArgs e) + { + _viewModel.OnClose(); + } + + private void ContextMenu_Opened(object sender, RoutedEventArgs e) + { + if (sender is ContextMenu menu) + menu.DataContext = _viewModel; + } +} \ No newline at end of file diff --git a/Source/NETworkManager/Views/ServerConnectionInfoProfileChildWindow.xaml b/Source/NETworkManager/Views/ServerConnectionInfoProfileChildWindow.xaml new file mode 100644 index 0000000000..8e2cadf357 --- /dev/null +++ b/Source/NETworkManager/Views/ServerConnectionInfoProfileChildWindow.xaml @@ -0,0 +1,206 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - + + - + - - - - - + + + + + + + + + + + - - + + + + + - - - + + + + - - - - - + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + - + + + + - - - - - + - - - - - - + + - - + + - - - - - - - - - + + + + + + + + - + \ No newline at end of file diff --git a/Source/NETworkManager/Views/SubnetCalculatorSubnettingView.xaml.cs b/Source/NETworkManager/Views/SubnetCalculatorSubnettingView.xaml.cs index cfe1527aa9..6249b54769 100644 --- a/Source/NETworkManager/Views/SubnetCalculatorSubnettingView.xaml.cs +++ b/Source/NETworkManager/Views/SubnetCalculatorSubnettingView.xaml.cs @@ -1,30 +1,30 @@ -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.ViewModels; +using System; +using System.Windows; using System.Windows.Controls; +using NETworkManager.ViewModels; + +namespace NETworkManager.Views; -namespace NETworkManager.Views +public partial class SubnetCalculatorSubnettingView { - public partial class SubnetCalculatorSubnettingView - { - private readonly SubnetCalculatorSubnettingViewModel _viewModel = new SubnetCalculatorSubnettingViewModel(DialogCoordinator.Instance); + private readonly SubnetCalculatorSubnettingViewModel _viewModel = new(); - public SubnetCalculatorSubnettingView() - { - InitializeComponent(); - DataContext = _viewModel; + public SubnetCalculatorSubnettingView() + { + InitializeComponent(); + DataContext = _viewModel; - Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted; - } + Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted; + } - private void Dispatcher_ShutdownStarted(object sender, System.EventArgs e) - { - _viewModel.OnShutdown(); - } + private void Dispatcher_ShutdownStarted(object sender, EventArgs e) + { + _viewModel.OnShutdown(); + } - private void ContextMenu_Opened(object sender, System.Windows.RoutedEventArgs e) - { - if (sender is ContextMenu menu) - menu.DataContext = _viewModel; - } + private void ContextMenu_Opened(object sender, RoutedEventArgs e) + { + if (sender is ContextMenu menu) + menu.DataContext = _viewModel; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager/Views/SubnetCalculatorWideSubnetView.xaml b/Source/NETworkManager/Views/SubnetCalculatorWideSubnetView.xaml index 99bbfff3a4..c7bca85c42 100644 --- a/Source/NETworkManager/Views/SubnetCalculatorWideSubnetView.xaml +++ b/Source/NETworkManager/Views/SubnetCalculatorWideSubnetView.xaml @@ -1,20 +1,17 @@  + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:validators="clr-namespace:NETworkManager.Validators;assembly=NETworkManager.Validators" + xmlns:converters="clr-namespace:NETworkManager.Converters;assembly=NETworkManager.Converters" + xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" + xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" + xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" + xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:SubnetCalculatorWideSubnetViewModel}"> - @@ -39,16 +36,23 @@ + + + + - - - - - - - + + - + @@ -56,10 +60,17 @@ - - + + - + @@ -67,17 +78,23 @@ - - + - + - + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -446,24 +291,26 @@ - - - - + \ No newline at end of file diff --git a/Source/NETworkManager/Views/TigerVNCHostView.xaml.cs b/Source/NETworkManager/Views/TigerVNCHostView.xaml.cs index 6cdd2f69f1..d556299387 100644 --- a/Source/NETworkManager/Views/TigerVNCHostView.xaml.cs +++ b/Source/NETworkManager/Views/TigerVNCHostView.xaml.cs @@ -1,63 +1,44 @@ -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.Models; using NETworkManager.ViewModels; using System.Threading.Tasks; using System.Windows; -using System.Windows.Controls; -namespace NETworkManager.Views +namespace NETworkManager.Views; + +public partial class TigerVNCHostView { - public partial class TigerVNCHostView + private readonly TigerVNCHostViewModel _viewModel = new(); + + private bool _loaded; + + public TigerVNCHostView() + { + InitializeComponent(); + DataContext = _viewModel; + } + + private void UserControl_Loaded(object sender, RoutedEventArgs e) + { + _loaded = true; + } + + public async void AddTab(string host) + { + // Wait for the interface to load, before displaying the dialog to connect a new profile... + // MahApps will throw an exception... + while (!_loaded) + await Task.Delay(250); + + if (_viewModel.IsConfigured) + _viewModel.AddTab(host); + } + + public void OnViewHide() + { + _viewModel.OnViewHide(); + } + + public void OnViewVisible() { - private readonly TigerVNCHostViewModel _viewModel = new TigerVNCHostViewModel(DialogCoordinator.Instance); - - private bool _loaded; - - - public TigerVNCHostView() - { - InitializeComponent(); - DataContext = _viewModel; - - InterTabController.Partition = ApplicationName.TigerVNC.ToString(); - } - - private void UserControl_Loaded(object sender, RoutedEventArgs e) - { - _loaded = true; - } - - private void ContextMenu_Opened(object sender, RoutedEventArgs e) - { - if (sender is ContextMenu menu) - menu.DataContext = _viewModel; - } - - private void ListBoxItem_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e) - { - if (e.ChangedButton == System.Windows.Input.MouseButton.Left) - _viewModel.ConnectProfileCommand.Execute(null); - } - - public async Task AddTab(string host) - { - // Wait for the interface to load, before displaying the dialog to connect a new profile... - // MahApps will throw an exception... - while (!_loaded) - await Task.Delay(100); - - if (_viewModel.IsConfigured) - _viewModel.AddTab(host); - } - - public void OnViewHide() - { - _viewModel.OnViewHide(); - } - - public void OnViewVisible() - { - _viewModel.OnViewVisible(); - } + _viewModel.OnViewVisible(); } } diff --git a/Source/NETworkManager/Views/TigerVNCSettingsView.xaml b/Source/NETworkManager/Views/TigerVNCSettingsView.xaml index 5ac10aa942..f2e7adce35 100644 --- a/Source/NETworkManager/Views/TigerVNCSettingsView.xaml +++ b/Source/NETworkManager/Views/TigerVNCSettingsView.xaml @@ -1,31 +1,41 @@  + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" + xmlns:validators="clr-namespace:NETworkManager.Validators;assembly=NETworkManager.Validators" + xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" + xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:TigerVNCSettingsViewModel}"> - - + + + - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + \ No newline at end of file diff --git a/Source/NETworkManager/Views/TracerouteHostView.xaml.cs b/Source/NETworkManager/Views/TracerouteHostView.xaml.cs index 48566c3460..2805de869b 100644 --- a/Source/NETworkManager/Views/TracerouteHostView.xaml.cs +++ b/Source/NETworkManager/Views/TracerouteHostView.xaml.cs @@ -1,55 +1,35 @@ -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.ViewModels; -using System.Windows; -using System.Windows.Controls; -using NETworkManager.Settings; using NETworkManager.Profiles; -using NETworkManager.Models; - -namespace NETworkManager.Views -{ - public partial class TracerouteHostView - { - private readonly TracerouteHostViewModel _viewModel = new TracerouteHostViewModel(DialogCoordinator.Instance); - - public TracerouteHostView() - { - InitializeComponent(); - DataContext = _viewModel; +using NETworkManager.ViewModels; - InterTabController.Partition = ApplicationName.Traceroute.ToString(); - } +namespace NETworkManager.Views; - private void ContextMenu_Opened(object sender, RoutedEventArgs e) - { - if (sender is ContextMenu menu) - menu.DataContext = _viewModel; - } +public partial class TracerouteHostView +{ + private readonly TracerouteHostViewModel _viewModel = new(); - private void ListBoxItem_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e) - { - if (e.ChangedButton == System.Windows.Input.MouseButton.Left) - _viewModel.TraceProfileCommand.Execute(null); - } + public TracerouteHostView() + { + InitializeComponent(); + DataContext = _viewModel; + } - public void AddTab(string host) - { - _viewModel.AddTab(host); - } + public void AddTab(string host) + { + _viewModel.AddTab(host); + } - public void AddTab(ProfileInfo profile) - { - _viewModel.AddTab(profile); - } + public void AddTab(ProfileInfo profile) + { + _viewModel.AddTab(profile); + } - public void OnViewHide() - { - _viewModel.OnViewHide(); - } + public void OnViewHide() + { + _viewModel.OnViewHide(); + } - public void OnViewVisible() - { - _viewModel.OnViewVisible(); - } + public void OnViewVisible() + { + _viewModel.OnViewVisible(); } } diff --git a/Source/NETworkManager/Views/TracerouteSettingsView.xaml b/Source/NETworkManager/Views/TracerouteSettingsView.xaml index 359e636e50..88a6eab13d 100644 --- a/Source/NETworkManager/Views/TracerouteSettingsView.xaml +++ b/Source/NETworkManager/Views/TracerouteSettingsView.xaml @@ -1,25 +1,35 @@  + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" + xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" + xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:TracerouteSettingsViewModel}"> - - - - - - - + + + + + + + - - - - - + + + + + - + \ No newline at end of file diff --git a/Source/NETworkManager/Views/TracerouteSettingsView.xaml.cs b/Source/NETworkManager/Views/TracerouteSettingsView.xaml.cs index 6fcce9d9f4..88ddd4ffc1 100644 --- a/Source/NETworkManager/Views/TracerouteSettingsView.xaml.cs +++ b/Source/NETworkManager/Views/TracerouteSettingsView.xaml.cs @@ -1,15 +1,14 @@ using NETworkManager.ViewModels; -namespace NETworkManager.Views +namespace NETworkManager.Views; + +public partial class TracerouteSettingsView { - public partial class TracerouteSettingsView - { - private readonly TracerouteSettingsViewModel _viewModel = new TracerouteSettingsViewModel(); + private readonly TracerouteSettingsViewModel _viewModel = new(); - public TracerouteSettingsView() - { - InitializeComponent(); - DataContext = _viewModel; - } + public TracerouteSettingsView() + { + InitializeComponent(); + DataContext = _viewModel; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager/Views/TracerouteView.xaml b/Source/NETworkManager/Views/TracerouteView.xaml index 06025c50cc..f732d6dc4a 100644 --- a/Source/NETworkManager/Views/TracerouteView.xaml +++ b/Source/NETworkManager/Views/TracerouteView.xaml @@ -1,39 +1,49 @@  + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:converters="clr-namespace:NETworkManager.Converters;assembly=NETworkManager.Converters" + xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" + xmlns:validators="clr-namespace:NETworkManager.Validators;assembly=NETworkManager.Validators" + xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" + xmlns:mahAppsControls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro" + xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" + xmlns:network="clr-namespace:NETworkManager.Models.Network;assembly=NETworkManager.Models" + xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" + xmlns:controls="clr-namespace:NETworkManager.Controls;assembly=NETworkManager.Controls" + xmlns:settings="clr-namespace:NETworkManager.Settings;assembly=NETworkManager.Settings" + xmlns:models="clr-namespace:NETworkManager.Models;assembly=NETworkManager.Models" + xmlns:wpfHelpers="clr-namespace:NETworkManager.Utilities.WPF;assembly=NETworkManager.Utilities.WPF" + xmlns:internalControls="clr-namespace:NETworkManager.Controls" + Loaded="UserControl_Loaded" + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:TracerouteViewModel}"> + + - + - + + - - + + @@ -48,25 +58,38 @@ - - + + + - - - + + - - + + + + + + + + + - - - + + - + - + - + - + - + - - + + + + + + + + + + + + + + - + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/Source/NETworkManager/Views/TracerouteView.xaml.cs b/Source/NETworkManager/Views/TracerouteView.xaml.cs index 5bea0113b9..24bdd78923 100644 --- a/Source/NETworkManager/Views/TracerouteView.xaml.cs +++ b/Source/NETworkManager/Views/TracerouteView.xaml.cs @@ -1,44 +1,127 @@ using System; +using System.ComponentModel; +using System.Windows; using System.Windows.Controls; -using MahApps.Metro.Controls.Dialogs; +using System.Windows.Input; +using NETworkManager.Controls; +using NETworkManager.Settings; using NETworkManager.ViewModels; -namespace NETworkManager.Views +namespace NETworkManager.Views; + +public partial class TracerouteView : IDragablzTabItem { - public partial class TracerouteView + private readonly TracerouteViewModel _viewModel; + + private const double MapRowMinHeight = 120; + + // Fraction (not a fixed pixel value) so the cap in RouteMapGrid_SizeChanged scales with the + // window size. + private const double MapRowMaxHeightFraction = 2.0 / 3.0; + + public TracerouteView(Guid tabId, string host = null) + { + InitializeComponent(); + + _viewModel = new TracerouteViewModel(tabId, host); + + DataContext = _viewModel; + + _viewModel.PropertyChanged += ViewModel_PropertyChanged; + + Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted; + + // GridSplitter marks the event Handled once it's done resizing, so a plain XAML handler + // would never run - handledEventsToo:true is required. + MapGridSplitter.AddHandler(MouseLeftButtonUpEvent, + new MouseButtonEventHandler(MapGridSplitter_MouseLeftButtonUp), true); + } + + public void CloseTab() { - private readonly TracerouteViewModel _viewModel; + // Detach so this transient tab view can be garbage-collected after the tab is closed. + Dispatcher.ShutdownStarted -= Dispatcher_ShutdownStarted; - public TracerouteView(int tabId, string host = null) - { - InitializeComponent(); + _viewModel.PropertyChanged -= ViewModel_PropertyChanged; - _viewModel = new TracerouteViewModel(DialogCoordinator.Instance, tabId, host); + _viewModel.OnClose(); + } - DataContext = _viewModel; + private void UserControl_Loaded(object sender, RoutedEventArgs e) + { + _viewModel.OnLoaded(); - Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted; - } + // PropertyChanged only fires on an actual change, so sync the row height once here. + if (_viewModel.ShowMap && _viewModel.ExpandMapView) + ExpandMapRow(); + else + CollapseMapRowWithoutCapturingHeight(); + } - private void UserControl_Loaded(object sender, System.Windows.RoutedEventArgs e) - { - _viewModel.OnLoaded(); - } + private void RouteMapGrid_SizeChanged(object sender, SizeChangedEventArgs e) + { + // Caps how far MapGridSplitter can grow MapRow, so the results grid above always keeps + // some space too. + MapRow.MaxHeight = Math.Max(MapRowMinHeight, e.NewSize.Height * MapRowMaxHeightFraction); + } - private void Dispatcher_ShutdownStarted(object sender, EventArgs e) - { - _viewModel.OnClose(); - } + private void ViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + if (e.PropertyName is not (nameof(TracerouteViewModel.ExpandMapView) or nameof(TracerouteViewModel.ShowMap))) + return; - public void CloseTab() - { - _viewModel.OnClose(); - } + if (_viewModel.ShowMap && _viewModel.ExpandMapView) + ExpandMapRow(); + else + CollapseMapRow(); + } - private void ContextMenu_Opened(object sender, System.Windows.RoutedEventArgs e) - { - if (sender is ContextMenu menu) - menu.DataContext = _viewModel; - } + private void ExpandMapRow() + { + MapRow.Height = new GridLength(SettingsManager.Current.Traceroute_MapHeight); + MapRow.MinHeight = MapRowMinHeight; + } + + private void CollapseMapRow() + { + // Only call this once MapRow has actually been expanded - otherwise MapRow.Height is + // still just its XAML-declared default (300), which would clobber the persisted + // Traceroute_MapHeight. That's why UserControl_Loaded uses + // CollapseMapRowWithoutCapturingHeight for a tab that starts collapsed. + PersistMapRowHeight(); + + CollapseMapRowWithoutCapturingHeight(); + } + + private void CollapseMapRowWithoutCapturingHeight() + { + // MinHeight is a separate constraint from Height and must be reset too, or it would + // still reserve space MapView's collapsed toggle button doesn't need. + MapRow.Height = GridLength.Auto; + MapRow.MinHeight = 0; + } + + // GridSplitter has no DragCompleted event (unlike a Thumb) - MouseLeftButtonUp is the + // closest equivalent. + private void MapGridSplitter_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) + { + PersistMapRowHeight(); + } + + private void PersistMapRowHeight() + { + if (MapRow.Height.IsAbsolute) + SettingsManager.Current.Traceroute_MapHeight = MapRow.Height.Value; + } + + private void Dispatcher_ShutdownStarted(object sender, EventArgs e) + { + _viewModel.OnClose(); + } + + private void ContextMenu_Opened(object sender, RoutedEventArgs e) + { + if (sender is ContextMenu menu) + menu.DataContext = _viewModel; } } \ No newline at end of file diff --git a/Source/NETworkManager/Views/UpgradeChildWindow.xaml b/Source/NETworkManager/Views/UpgradeChildWindow.xaml new file mode 100644 index 0000000000..d0667d12da --- /dev/null +++ b/Source/NETworkManager/Views/UpgradeChildWindow.xaml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/Source/NETworkManager/Views/WakeOnLANView.xaml.cs b/Source/NETworkManager/Views/WakeOnLANView.xaml.cs index ab82d6becb..07e67ab28d 100644 --- a/Source/NETworkManager/Views/WakeOnLANView.xaml.cs +++ b/Source/NETworkManager/Views/WakeOnLANView.xaml.cs @@ -1,34 +1,24 @@ -using MahApps.Metro.Controls.Dialogs; using NETworkManager.ViewModels; -using System.Windows; -using System.Windows.Controls; -namespace NETworkManager.Views -{ - public partial class WakeOnLANView - { - private readonly WakeOnLANViewModel _viewModel = new WakeOnLANViewModel(DialogCoordinator.Instance); +namespace NETworkManager.Views; - public WakeOnLANView() - { - InitializeComponent(); - DataContext = _viewModel; - } +public partial class WakeOnLANView +{ + private readonly WakeOnLANViewModel _viewModel = new(); - private void ContextMenu_Opened(object sender, RoutedEventArgs e) - { - if (sender is ContextMenu menu) - menu.DataContext = _viewModel; - } + public WakeOnLANView() + { + InitializeComponent(); + DataContext = _viewModel; + } - public void OnViewHide() - { - _viewModel.OnViewHide(); - } + public void OnViewHide() + { + _viewModel.OnViewHide(); + } - public void OnViewVisible() - { - _viewModel.OnViewVisible(); - } + public void OnViewVisible() + { + _viewModel.OnViewVisible(); } } diff --git a/Source/NETworkManager/Views/WebConsoleConnectDialog.xaml b/Source/NETworkManager/Views/WebConsoleConnectChildWindow.xaml similarity index 52% rename from Source/NETworkManager/Views/WebConsoleConnectDialog.xaml rename to Source/NETworkManager/Views/WebConsoleConnectChildWindow.xaml index ff0770d786..d79a88b344 100644 --- a/Source/NETworkManager/Views/WebConsoleConnectDialog.xaml +++ b/Source/NETworkManager/Views/WebConsoleConnectChildWindow.xaml @@ -1,16 +1,19 @@ - - - - + + @@ -31,7 +34,11 @@ - + @@ -42,15 +49,17 @@ - - - + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -437,13 +278,16 @@ - - + + - + - - + \ No newline at end of file diff --git a/Source/NETworkManager/Views/WebConsoleHostView.xaml.cs b/Source/NETworkManager/Views/WebConsoleHostView.xaml.cs index 4826a1b103..2f5f3c937c 100644 --- a/Source/NETworkManager/Views/WebConsoleHostView.xaml.cs +++ b/Source/NETworkManager/Views/WebConsoleHostView.xaml.cs @@ -1,43 +1,24 @@ -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.Models; using NETworkManager.ViewModels; -using System.Windows; -using System.Windows.Controls; -namespace NETworkManager.Views -{ - public partial class WebConsoleHostView - { - private readonly WebConsoleHostViewModel _viewModel = new WebConsoleHostViewModel(DialogCoordinator.Instance); - - public WebConsoleHostView() - { - InitializeComponent(); - DataContext = _viewModel; +namespace NETworkManager.Views; - InterTabController.Partition = ApplicationName.WebConsole.ToString(); - } +public partial class WebConsoleHostView +{ + private readonly WebConsoleHostViewModel _viewModel = new(); - private void ContextMenu_Opened(object sender, RoutedEventArgs e) - { - if (sender is ContextMenu menu) - menu.DataContext = _viewModel; - } + public WebConsoleHostView() + { + InitializeComponent(); + DataContext = _viewModel; + } - private void ListBoxItem_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e) - { - if (e.ChangedButton == System.Windows.Input.MouseButton.Left) - _viewModel.ConnectProfileCommand.Execute(null); - } - - public void OnViewHide() - { - _viewModel.OnViewHide(); - } + public void OnViewHide() + { + _viewModel.OnViewHide(); + } - public void OnViewVisible() - { - _viewModel.OnViewVisible(); - } + public void OnViewVisible() + { + _viewModel.OnViewVisible(); } } diff --git a/Source/NETworkManager/Views/WebConsoleSettingsView.xaml b/Source/NETworkManager/Views/WebConsoleSettingsView.xaml new file mode 100644 index 0000000000..9eb3ebba38 --- /dev/null +++ b/Source/NETworkManager/Views/WebConsoleSettingsView.xaml @@ -0,0 +1,51 @@ + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + \ No newline at end of file diff --git a/Source/NETworkManager/Views/WhoisHostView.xaml.cs b/Source/NETworkManager/Views/WhoisHostView.xaml.cs index 31197c2124..dfda536745 100644 --- a/Source/NETworkManager/Views/WhoisHostView.xaml.cs +++ b/Source/NETworkManager/Views/WhoisHostView.xaml.cs @@ -1,43 +1,24 @@ -using System.Windows; -using System.Windows.Controls; -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.Models; using NETworkManager.ViewModels; -namespace NETworkManager.Views -{ - public partial class WhoisHostView - { - private readonly WhoisHostViewModel _viewModel = new WhoisHostViewModel(DialogCoordinator.Instance); - - public WhoisHostView() - { - InitializeComponent(); - DataContext = _viewModel; +namespace NETworkManager.Views; - InterTabController.Partition = ApplicationName.Whois.ToString(); - } - - private void ContextMenu_Opened(object sender, RoutedEventArgs e) - { - if (sender is ContextMenu menu) - menu.DataContext = _viewModel; - } +public partial class WhoisHostView +{ + private readonly WhoisHostViewModel _viewModel = new(); - private void ListBoxItem_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e) - { - if (e.ChangedButton == System.Windows.Input.MouseButton.Left) - _viewModel.QueryProfileCommand.Execute(null); - } + public WhoisHostView() + { + InitializeComponent(); + DataContext = _viewModel; + } - public void OnViewHide() - { - _viewModel.OnViewHide(); - } + public void OnViewHide() + { + _viewModel.OnViewHide(); + } - public void OnViewVisible() - { - _viewModel.OnViewVisible(); - } + public void OnViewVisible() + { + _viewModel.OnViewVisible(); } } diff --git a/Source/NETworkManager/Views/WhoisSettingsView.xaml b/Source/NETworkManager/Views/WhoisSettingsView.xaml deleted file mode 100644 index 38da7559d1..0000000000 --- a/Source/NETworkManager/Views/WhoisSettingsView.xaml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - \ No newline at end of file diff --git a/Source/NETworkManager/Views/WhoisSettingsView.xaml.cs b/Source/NETworkManager/Views/WhoisSettingsView.xaml.cs deleted file mode 100644 index 58dbde6f9f..0000000000 --- a/Source/NETworkManager/Views/WhoisSettingsView.xaml.cs +++ /dev/null @@ -1,15 +0,0 @@ -using NETworkManager.ViewModels; - -namespace NETworkManager.Views -{ - public partial class WhoisSettingsView - { - private readonly WhoisSettingsViewModel _viewModel = new WhoisSettingsViewModel(); - - public WhoisSettingsView() - { - InitializeComponent(); - DataContext = _viewModel; - } - } -} diff --git a/Source/NETworkManager/Views/WhoisView.xaml b/Source/NETworkManager/Views/WhoisView.xaml index 3fc39a9c85..06749227c7 100644 --- a/Source/NETworkManager/Views/WhoisView.xaml +++ b/Source/NETworkManager/Views/WhoisView.xaml @@ -1,33 +1,32 @@  + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:converters="clr-namespace:NETworkManager.Converters;assembly=NETworkManager.Converters" + xmlns:validators="clr-namespace:NETworkManager.Validators;assembly=NETworkManager.Validators" + xmlns:mahAppsControls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro" + xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" + xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" + xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" + xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" + xmlns:sys="clr-namespace:System;assembly=mscorlib" + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:WhoisViewModel}" + Loaded="UserControl_OnLoaded"> - + - + - - + @@ -42,8 +41,15 @@ - - + + @@ -53,15 +59,18 @@ - - + - + + + + + + + + + + + + + - - - - - - + - - + \ No newline at end of file diff --git a/Source/NETworkManager/Views/WhoisView.xaml.cs b/Source/NETworkManager/Views/WhoisView.xaml.cs index 33e09c18aa..de23752f5a 100644 --- a/Source/NETworkManager/Views/WhoisView.xaml.cs +++ b/Source/NETworkManager/Views/WhoisView.xaml.cs @@ -1,30 +1,41 @@ -using System.Windows; -using MahApps.Metro.Controls.Dialogs; +using System; +using System.Windows; +using NETworkManager.Controls; using NETworkManager.ViewModels; -namespace NETworkManager.Views +namespace NETworkManager.Views; + +public partial class WhoisView : IDragablzTabItem { - public partial class WhoisView + private readonly WhoisViewModel _viewModel; + + public WhoisView(Guid tabId, string domain = null) { - private readonly WhoisViewModel _viewModel; + InitializeComponent(); + + _viewModel = new WhoisViewModel(tabId, domain); - public WhoisView(int tabId, string domain = null) - { - InitializeComponent(); + DataContext = _viewModel; + + Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted; + } - _viewModel = new WhoisViewModel(DialogCoordinator.Instance, tabId, domain); + public void CloseTab() + { + // Detach the app-lifetime handler so this transient tab view (and its view model) + // can be collected after the tab is closed. + Dispatcher.ShutdownStarted -= Dispatcher_ShutdownStarted; - DataContext = _viewModel; - } + _viewModel.OnClose(); + } - private void UserControl_OnLoaded(object sender, RoutedEventArgs e) - { - _viewModel.OnLoaded(); - } + private void UserControl_OnLoaded(object sender, RoutedEventArgs e) + { + _viewModel.OnLoaded(); + } - public void CloseTab() - { - _viewModel.OnClose(); - } + private void Dispatcher_ShutdownStarted(object sender, EventArgs e) + { + _viewModel.OnClose(); } -} +} \ No newline at end of file diff --git a/Source/NETworkManager/Views/WiFiConnectChildWindow.xaml b/Source/NETworkManager/Views/WiFiConnectChildWindow.xaml new file mode 100644 index 0000000000..89c541fee7 --- /dev/null +++ b/Source/NETworkManager/Views/WiFiConnectChildWindow.xaml @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + - - + + + + + + + + + + \ No newline at end of file diff --git a/Source/NETworkManager/Views/WiFiView.xaml.cs b/Source/NETworkManager/Views/WiFiView.xaml.cs index ad586783b7..088a6c178a 100644 --- a/Source/NETworkManager/Views/WiFiView.xaml.cs +++ b/Source/NETworkManager/Views/WiFiView.xaml.cs @@ -1,34 +1,59 @@ -using MahApps.Metro.Controls.Dialogs; -using NETworkManager.ViewModels; +using System.Windows; using System.Windows.Controls; +using NETworkManager.ViewModels; + +namespace NETworkManager.Views; -namespace NETworkManager.Views +public partial class WiFiView { - public partial class WiFiView + private readonly WiFiViewModel _viewModel; + + private int _channelTabControlSelectedIndex = 0; + + public WiFiView() + { + _viewModel = new WiFiViewModel(); + + InitializeComponent(); + + DataContext = _viewModel; + } + + public void OnViewHide() + { + _viewModel.OnViewHide(); + } + + public void OnViewVisible() + { + _viewModel.OnViewVisible(); + } + + private void ContextMenu_Opened(object sender, RoutedEventArgs e) + { + if (sender is ContextMenu menu) + menu.DataContext = _viewModel; + } + + /// + /// Restores the previously selected channel chart tab. The content is rebuilt when switching + /// between the outer tabs, so the selection is restored from the view when the control loads. + /// + private void ChannelsTabControl_Loaded(object sender, RoutedEventArgs e) + { + if (sender is TabControl tabControl) + tabControl.SelectedIndex = _channelTabControlSelectedIndex; + } + + /// + /// Persists the selected channel chart tab. Ignores selection changes that occur while the + /// control is not yet loaded (e.g. during the initial template apply) so the saved value is + /// not overwritten with the default, and ignores bubbled events from nested selectors. + /// + private void ChannelsTabControl_SelectionChanged(object sender, SelectionChangedEventArgs e) { - private readonly WiFiViewModel _viewModel; - - public WiFiView() - { - _viewModel= new WiFiViewModel(DialogCoordinator.Instance); - InitializeComponent(); - DataContext = _viewModel; - } - - public void OnViewHide() - { - _viewModel.OnViewHide(); - } - - public void OnViewVisible() - { - _viewModel.OnViewVisible(); - } - - private void ContextMenu_Opened(object sender, System.Windows.RoutedEventArgs e) - { - if (sender is ContextMenu menu) - menu.DataContext = _viewModel; - } + if (sender is TabControl { IsLoaded: true } tabControl && + ReferenceEquals(e.OriginalSource, tabControl)) + _channelTabControlSelectedIndex = tabControl.SelectedIndex; } -} +} \ No newline at end of file diff --git a/Source/NETworkManager/app.manifest b/Source/NETworkManager/app.manifest index 9212d97ee1..3274d6a9de 100644 --- a/Source/NETworkManager/app.manifest +++ b/Source/NETworkManager/app.manifest @@ -1,26 +1,27 @@  - - - - - - - - - + + + + + + + + + - - - - + + + + + + + + + + true/pm + PerMonitorV2 + - - - - PerMonitor - true/PM - - diff --git a/Source/NETworkManager/log4net.config b/Source/NETworkManager/log4net.config new file mode 100644 index 0000000000..b3be9c74d0 --- /dev/null +++ b/Source/NETworkManager/log4net.config @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/global.json b/Source/global.json new file mode 100644 index 0000000000..0807f3c86b --- /dev/null +++ b/Source/global.json @@ -0,0 +1,7 @@ +{ + "sdk": { + "version": "10.0.302", + "rollForward": "latestFeature", + "allowPrerelease": false + } +} \ No newline at end of file diff --git a/Tests/Environments/ActiveDirectory/Create-TestAdComputers.ps1 b/Tests/Environments/ActiveDirectory/Create-TestAdComputers.ps1 new file mode 100644 index 0000000000..01b38e0e37 --- /dev/null +++ b/Tests/Environments/ActiveDirectory/Create-TestAdComputers.ps1 @@ -0,0 +1,135 @@ +<# +.SYNOPSIS + Creates test computer accounts in Active Directory for the NETworkManager AD profile import feature. + +.DESCRIPTION + Creates a configurable number of computer accounts under a target OU with the dnsHostName + attribute populated. Optionally creates the OU and disables every Nth account so the + "Exclude disabled computer accounts" filter can be exercised. + + Requires the ActiveDirectory PowerShell module (RSAT) and write permissions to the target OU. + +.PARAMETER OUPath + Distinguished name of the OU (or container) under which the computers are created. + Default: the domain's built-in Computers container (CN=Computers,). + Example: "OU=NetworkManagerTest,DC=example,DC=com" + +.PARAMETER Count + Number of computer accounts to create. Default: 25. + +.PARAMETER NamePrefix + Name prefix for the computer accounts. Default: "NM-TEST-". + +.PARAMETER DnsZone + DNS zone appended to the computer name to build dnsHostName. Default: AD domain DNS root. + +.PARAMETER CreateOU + Create the target OU if it does not exist. + +.PARAMETER DisableEvery + Disable every Nth computer account (0 = never). Useful for testing the exclude-disabled filter. + +.EXAMPLE + .\Create-TestAdComputers.ps1 -OUPath "OU=NetworkManagerTest,DC=lab,DC=local" -Count 50 -CreateOU -DisableEvery 5 + +.EXAMPLE + .\Create-TestAdComputers.ps1 -OUPath "OU=NM,DC=lab,DC=local" -Count 10 -DnsZone "lab.local" +#> + +[CmdletBinding(SupportsShouldProcess = $true)] +param( + [string]$OUPath, + + [int]$Count = 25, + + [string]$NamePrefix = "NM-TEST-", + + [string]$DnsZone, + + [switch]$CreateOU, + + [int]$DisableEvery = 0 +) + +if (-not (Get-Module -ListAvailable -Name ActiveDirectory)) { + Write-Error "ActiveDirectory module not found. Install RSAT: 'Add-WindowsCapability -Online -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0'" + exit 1 +} + +Import-Module ActiveDirectory -ErrorAction Stop + +$adDomain = $null +if (-not $DnsZone -or -not $OUPath) { + $adDomain = Get-ADDomain +} + +if (-not $DnsZone) { + $DnsZone = $adDomain.DNSRoot + Write-Verbose "Using DNS zone from current domain: $DnsZone" +} + +if (-not $OUPath) { + $OUPath = $adDomain.ComputersContainer + Write-Verbose "Using default Computers container: $OUPath" +} + +if (-not ([adsi]::Exists("LDAP://$OUPath"))) { + if ($CreateOU) { + $ouName = ($OUPath -split ',')[0] -replace '^OU=', '' + $parentPath = ($OUPath -split ',', 2)[1] + + Write-Host "Creating OU '$ouName' under '$parentPath'..." -ForegroundColor Cyan + if ($PSCmdlet.ShouldProcess($OUPath, "New-ADOrganizationalUnit")) { + New-ADOrganizationalUnit -Name $ouName -Path $parentPath -ProtectedFromAccidentalDeletion $false + } + } + else { + Write-Error "OU '$OUPath' does not exist. Use -CreateOU to create it automatically." + exit 1 + } +} + +$created = 0 +$disabled = 0 +$skipped = 0 + +for ($i = 1; $i -le $Count; $i++) { + $name = "{0}{1:D3}" -f $NamePrefix, $i + $dnsHostName = "$($name.ToLower()).$DnsZone" + $samName = "$name`$" + + if (Get-ADComputer -Filter "Name -eq '$name'" -SearchBase $OUPath -ErrorAction SilentlyContinue) { + Write-Host " [skip] $name already exists" -ForegroundColor DarkYellow + $skipped++ + continue + } + + if ($PSCmdlet.ShouldProcess($name, "New-ADComputer in $OUPath")) { + try { + New-ADComputer ` + -Name $name ` + -SAMAccountName $samName ` + -Path $OUPath ` + -DNSHostName $dnsHostName ` + -Description "NETworkManager AD import test ($(Get-Date -Format 'yyyy-MM-dd'))" ` + -Enabled $true ` + -ErrorAction Stop + + Write-Host " [ok] $name -> $dnsHostName" -ForegroundColor Green + $created++ + + if ($DisableEvery -gt 0 -and ($i % $DisableEvery -eq 0)) { + Disable-ADAccount -Identity $samName + Write-Host " disabled (every $DisableEvery)" -ForegroundColor DarkGray + $disabled++ + } + } + catch { + Write-Warning " [fail] $name : $($_.Exception.Message)" + } + } +} + +Write-Host "" +Write-Host "Done. Created: $created | Disabled: $disabled | Skipped: $skipped" -ForegroundColor Cyan +Write-Host "Search Base for NETworkManager: $OUPath" -ForegroundColor Yellow \ No newline at end of file diff --git a/Tests/Environments/ActiveDirectory/README.md b/Tests/Environments/ActiveDirectory/README.md new file mode 100644 index 0000000000..c5f31ba056 --- /dev/null +++ b/Tests/Environments/ActiveDirectory/README.md @@ -0,0 +1,59 @@ +# Active Directory Test Environment + +Helper scripts for setting up Active Directory test data for NETworkManager. + +## Scripts + +### `Create-TestAdComputers.ps1` + +Creates computer accounts in Active Directory to test NETworkManager's **AD profile import** feature (import of computer accounts as connection profiles). + +#### Requirements + +- Windows with the **ActiveDirectory** PowerShell module (RSAT) +- Domain-joined machine with write permissions to the target OU + +Install RSAT if missing: + +```powershell +Add-WindowsCapability -Online -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0 +``` + +#### Parameters + +| Parameter | Default | Description | +| --------------- | ------------------------------------- | ---------------------------------------------------------------------------- | +| `-OUPath` | Domain's built-in Computers container | Distinguished name of the target OU | +| `-Count` | `25` | Number of computer accounts to create | +| `-NamePrefix` | `NM-TEST-` | Name prefix for computer accounts | +| `-DnsZone` | AD domain DNS root | DNS zone appended to the computer name to build `dnsHostName` | +| `-CreateOU` | _(switch)_ | Create the target OU if it does not exist | +| `-DisableEvery` | `0` _(never)_ | Disable every Nth account — useful for testing the "exclude disabled" filter | + +#### Examples + +Create 25 computers in the default Computers container: + +```powershell +.\Create-TestAdComputers.ps1 +``` + +Create 50 computers in a custom OU (creates the OU if missing), disable every 5th: + +```powershell +.\Create-TestAdComputers.ps1 ` + -OUPath "OU=NetworkManagerTest,DC=lab,DC=local" ` + -Count 50 ` + -CreateOU ` + -DisableEvery 5 +``` + +Preview changes without applying them (`-WhatIf`): + +```powershell +.\Create-TestAdComputers.ps1 -OUPath "OU=NM,DC=lab,DC=local" -Count 10 -WhatIf +``` + +#### Idempotency + +The script skips accounts that already exist and reports them as `[skip]`. Re-running it is safe. diff --git a/Tests/Environments/SNMP/README.md b/Tests/Environments/SNMP/README.md new file mode 100644 index 0000000000..3629a1458e --- /dev/null +++ b/Tests/Environments/SNMP/README.md @@ -0,0 +1,75 @@ +# SNMP Test Environment + +A minimal, self-contained SNMP test environment running on Linux (Debian/Ubuntu) to test NETworkManager's SNMP features. + +> **Warning:** This configuration is intentionally insecure. Use in isolated test environments only, never in production. + +## Requirements + +- Debian / Ubuntu (tested on Ubuntu 22.04+) +- Root / `sudo` access + +## Setup + +Run the setup script to install and configure the SNMP daemon: + +```bash +sudo bash setup.sh +``` + +The script is idempotent — re-running it overwrites the configuration and resets the SNMPv3 credentials. + +To customise community strings or credentials, edit the variables at the top of `setup.sh` before running. + +## Default credentials + +| Protocol | Setting | Value | +| ------------------- | ------------- | ---------------- | +| SNMPv2c | Community | `public` | +| SNMPv3 noAuthNoPriv | Username | `noAuthUser` | +| SNMPv3 authNoPriv | Username | `authNoPrivUser` | +| SNMPv3 authNoPriv | Auth protocol | SHA-512 | +| SNMPv3 authNoPriv | Auth password | `auth123456789` | +| SNMPv3 authPriv | Username | `authPrivUser` | +| SNMPv3 authPriv | Auth protocol | SHA-512 | +| SNMPv3 authPriv | Auth password | `auth123456789` | +| SNMPv3 authPriv | Priv protocol | AES | +| SNMPv3 authPriv | Priv password | `priv987654321` | + +## Accessible OIDs + +The `systemonly` view restricts access to: + +| OID prefix | Description | +| ------------------- | ---------------------------------------------- | +| `.1.3.6.1.2.1.1` | System group (sysDescr, sysName, sysUpTime, …) | +| `.1.3.6.1.2.1.25.1` | Host resources — hrSystem group | + +## Ports + +The daemon listens on UDP port **161** for both IPv4 (`udp:161`) and IPv6 (`udp6:161`). + +## Verifying the setup + +```bash +# SNMPv2c +snmpwalk -v2c -c public localhost .1.3.6.1.2.1.1 + +# SNMPv3 – noAuthNoPriv +snmpwalk -v3 -l noAuthNoPriv -u noAuthUser localhost .1.3.6.1.2.1.1 + +# SNMPv3 – authNoPriv +snmpwalk -v3 -l authNoPriv -u authNoPrivUser \ + -a SHA-512 -A auth123456789 \ + localhost .1.3.6.1.2.1.1 + +# SNMPv3 – authPriv +snmpwalk -v3 -l authPriv -u authPrivUser \ + -a SHA-512 -A auth123456789 \ + -x AES -X priv987654321 \ + localhost .1.3.6.1.2.1.1 +``` + +## Additional configuration + +Drop extra `.conf` files into `/etc/snmp/snmpd.conf.d/` — they are included automatically by the daemon. diff --git a/Tests/Environments/SNMP/setup.sh b/Tests/Environments/SNMP/setup.sh new file mode 100644 index 0000000000..68891d623c --- /dev/null +++ b/Tests/Environments/SNMP/setup.sh @@ -0,0 +1,125 @@ +#!/usr/bin/env bash +# Sets up a minimal, insecure SNMP test environment on Debian/Ubuntu. +# Idempotent: safe to re-run; resets configuration and SNMPv3 credentials each time. +set -euo pipefail + +# ------------------------------------------------------------------------------ +# Configuration — adjust to your needs +# ------------------------------------------------------------------------------ +SYS_LOCATION="Testserver" +SYS_CONTACT="Test " + +V2C_COMMUNITY="public" + +V3_NOAUTH_USER="noAuthUser" + +V3_AUTH_USER="authNoPrivUser" +V3_AUTH_PROTOCOL="SHA-512" # MD5 | SHA | SHA-224 | SHA-256 | SHA-384 | SHA-512 +V3_AUTH_PASSWORD="auth123456789" + +V3_AUTHPRIV_USER="authPrivUser" +V3_PRIV_PROTOCOL="AES" # DES | AES +V3_PRIV_PASSWORD="priv987654321" +# ------------------------------------------------------------------------------ + +SNMPD_CONF="/etc/snmp/snmpd.conf" +SNMPD_PERSIST="/var/lib/snmp/snmpd.conf" +SNMPD_CONF_D="/etc/snmp/snmpd.conf.d" + +if [[ $EUID -ne 0 ]]; then + echo "ERROR: Run as root or with sudo." >&2 + exit 1 +fi + +echo "==> Installing packages..." +apt-get update -y -qq +apt-get install -y -qq snmp snmpd + +echo "==> Stopping snmpd..." +systemctl stop snmpd 2>/dev/null || true + +# snmpd moves 'createUser' entries into /var/lib/snmp/snmpd.conf on first start +# and removes them from the main config. Remove the persisted user so snmpd +# re-creates it from our config on the next start (idempotency). +echo "==> Resetting SNMPv3 credentials from persistent store..." +if [[ -f "$SNMPD_PERSIST" ]]; then + sed -i "/usmUser.*\"$V3_NOAUTH_USER\"/d" "$SNMPD_PERSIST" + sed -i "/usmUser.*\"$V3_AUTH_USER\"/d" "$SNMPD_PERSIST" + sed -i "/usmUser.*\"$V3_AUTHPRIV_USER\"/d" "$SNMPD_PERSIST" +fi + +echo "==> Writing $SNMPD_CONF..." +cat > "$SNMPD_CONF" << EOF +sysLocation $SYS_LOCATION +sysContact $SYS_CONTACT +sysServices 72 + +master agentx + +agentaddress udp:161,udp6:161 + +view systemonly included .1.3.6.1.2.1.1 +view systemonly included .1.3.6.1.2.1.25.1 + +# v2c +rocommunity $V2C_COMMUNITY default -V systemonly +rocommunity6 $V2C_COMMUNITY default -V systemonly + +# v3 – noAuthNoPriv (no authentication, no encryption) +createUser $V3_NOAUTH_USER +rouser $V3_NOAUTH_USER noauth -V systemonly + +# v3 – authNoPriv (authentication, no encryption) +createUser $V3_AUTH_USER $V3_AUTH_PROTOCOL $V3_AUTH_PASSWORD +rouser $V3_AUTH_USER auth -V systemonly + +# v3 – authPriv (authentication and encryption) +createUser $V3_AUTHPRIV_USER $V3_AUTH_PROTOCOL $V3_AUTH_PASSWORD $V3_PRIV_PROTOCOL $V3_PRIV_PASSWORD +rouser $V3_AUTHPRIV_USER authpriv -V systemonly + +# include all *.conf files in a directory +includeDir $SNMPD_CONF_D +EOF +chmod 600 "$SNMPD_CONF" + +echo "==> Creating $SNMPD_CONF_D (for optional extra config files)..." +mkdir -p "$SNMPD_CONF_D" + +echo "==> Enabling and starting snmpd..." +systemctl enable --quiet snmpd +systemctl start snmpd + +echo "" +if systemctl is-active --quiet snmpd; then + echo "snmpd is running." +else + echo "WARNING: snmpd did not start. Check 'journalctl -u snmpd' for details." >&2 + exit 1 +fi + +echo "" +echo "Setup complete. Credentials:" +echo "" +echo " SNMPv2c" +echo " Community string : $V2C_COMMUNITY" +echo "" +echo " SNMPv3 – noAuthNoPriv" +echo " Username : $V3_NOAUTH_USER" +echo "" +echo " SNMPv3 – authNoPriv" +echo " Username : $V3_AUTH_USER" +echo " Auth protocol : $V3_AUTH_PROTOCOL" +echo " Auth password : $V3_AUTH_PASSWORD" +echo "" +echo " SNMPv3 – authPriv" +echo " Username : $V3_AUTHPRIV_USER" +echo " Auth protocol : $V3_AUTH_PROTOCOL" +echo " Auth password : $V3_AUTH_PASSWORD" +echo " Priv protocol : $V3_PRIV_PROTOCOL" +echo " Priv password : $V3_PRIV_PASSWORD" +echo "" +echo "Verify with:" +echo " snmpwalk -v2c -c $V2C_COMMUNITY localhost .1.3.6.1.2.1.1" +echo " snmpwalk -v3 -l noAuthNoPriv -u $V3_NOAUTH_USER localhost .1.3.6.1.2.1.1" +echo " snmpwalk -v3 -l authNoPriv -u $V3_AUTH_USER -a $V3_AUTH_PROTOCOL -A $V3_AUTH_PASSWORD localhost .1.3.6.1.2.1.1" +echo " snmpwalk -v3 -l authPriv -u $V3_AUTHPRIV_USER -a $V3_AUTH_PROTOCOL -A $V3_AUTH_PASSWORD -x $V3_PRIV_PROTOCOL -X $V3_PRIV_PASSWORD localhost .1.3.6.1.2.1.1" diff --git a/Website/.gitignore b/Website/.gitignore new file mode 100644 index 0000000000..b2d6de3062 --- /dev/null +++ b/Website/.gitignore @@ -0,0 +1,20 @@ +# Dependencies +/node_modules + +# Production +/build + +# Generated files +.docusaurus +.cache-loader + +# Misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/Website/README.md b/Website/README.md new file mode 100644 index 0000000000..f06153995a --- /dev/null +++ b/Website/README.md @@ -0,0 +1,16 @@ +# NETworkManager website and documentation + +Welcome to the new [NETworkManager](https://github.com/BornToBeRoot/NETworkManager) website and documentation. + +It's build with [Docusaurus](https://docusaurus.io/), a static website generator, and is hosted on [GitHub Pages](https://pages.github.com/). + +You can help to improve the documentation by submitting a pull request. + +## Software, services and images used + +- [Docusaurus](https://docusaurus.io/) +- [GitHub Pages](https://pages.github.com/) +- [GitHub Actions Workflow](https://github.com/peaceiris/actions-gh-pages) + +- Images + - [undraw.co](https://undraw.co/) diff --git a/Website/babel.config.js b/Website/babel.config.js new file mode 100644 index 0000000000..bfd75dbdfc --- /dev/null +++ b/Website/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [require.resolve("@docusaurus/core/lib/babel/preset")], +}; diff --git a/Website/blog/2024-01-01-welcome/index.md b/Website/blog/2024-01-01-welcome/index.md new file mode 100644 index 0000000000..ae3768d651 --- /dev/null +++ b/Website/blog/2024-01-01-welcome/index.md @@ -0,0 +1,16 @@ +--- +slug: welcome +title: Welcome +description: "Welcome to the new NETworkManager website, blog and documentation. It's built with Docusaurus, a static website generator, and hosted on GitHub Pages." +authors: [borntoberoot] +tags: [welcome, docusaurus] +keywords: [NETworkManager, website, blog, documentation, Docusaurus, GitHub Pages] +--- + +Welcome to the new NETworkManager website, blog and documentation. + +It's built with [Docusaurus](https://docusaurus.io/), a static website generator, and hosted on [GitHub Pages](https://pages.github.com/). + + + +You can help to improve the documentation by submitting a [pull request](https://github.com/BornToBeRoot/NETworkManager). diff --git a/Website/blog/2024-05-24-introducing-code-signing-to-binaries/index.md b/Website/blog/2024-05-24-introducing-code-signing-to-binaries/index.md new file mode 100644 index 0000000000..36bb373b3c --- /dev/null +++ b/Website/blog/2024-05-24-introducing-code-signing-to-binaries/index.md @@ -0,0 +1,18 @@ +--- +slug: introducing-code-signing-for-binaries +title: Introducing Code Signing for Binaries +description: "Starting with NETworkManager version 2024.5.24.0, the binaries and the installer are now signed with a code signing certificate." +authors: [borntoberoot] +tags: [code-signing, binaries, installer] +keywords: [NETworkManager, code signing, binaries, installer, SignPath, certificate, security] +--- + +Starting with NETworkManager version 2024.5.24.0, the binaries and the installer are now signed with a code signing certificate. + + + +The binaries and installer are built on [AppVeyor](https://ci.appveyor.com/project/BornToBeRoot/networkmanager) directly from the [GitHub repository](https://github.com/BornToBeRoot/NETworkManager/blob/main/appveyor.yml). +Build artifacts are automatically sent to [SignPath.io](https://signpath.io/) via webhook, where they are signed after manual approval by the maintainer. +The signed binaries are then uploaded to the [GitHub releases](https://github.com/BornToBeRoot/NETworkManager/releases) page. + +Special thanks goes to [SignPath.io](https://signpath.io/) for providing free code signing and the [SignPath Foundation](https://signpath.org/) for the free code signing certificate. diff --git a/Website/blog/2025-09-06-introducing-hosts-file-editor/hosts-file-editor.gif b/Website/blog/2025-09-06-introducing-hosts-file-editor/hosts-file-editor.gif new file mode 100644 index 0000000000..5c9363bf3d Binary files /dev/null and b/Website/blog/2025-09-06-introducing-hosts-file-editor/hosts-file-editor.gif differ diff --git a/Website/blog/2025-09-06-introducing-hosts-file-editor/index.md b/Website/blog/2025-09-06-introducing-hosts-file-editor/index.md new file mode 100644 index 0000000000..9afb4b53c7 --- /dev/null +++ b/Website/blog/2025-09-06-introducing-hosts-file-editor/index.md @@ -0,0 +1,34 @@ +--- +slug: introducing-hosts-file-editor +title: Introducing Hosts File Editor +description: "NETworkManager 2025.8.10.0 introduces the Hosts File Editor. Easily manage and edit your system's hosts file in a user-friendly interface." +authors: [borntoberoot] +tags: [hosts file, dns, new feature] +keywords: [NETworkManager, hosts file, hosts editor, DNS, Windows, network tool] +--- + +NETworkManager 2025.8.10.0 introduced a new feature, the `Hosts File Editor`. You can now easily manage and edit your system's hosts file in a user-friendly interface. + +As a sysadmin or developer, you often need to modify the hosts file in order to override DNS settings for specific domains, redirect traffic, or test websites locally. + +![Hosts File Editor](./hosts-file-editor.gif) + + + +The hosts file is a plain text file used by the operating system to map hostnames to IP addresses. It is typically located at: + +- Windows: `C:\Windows\System32\drivers\etc\hosts` +- Linux: `/etc/hosts` + +Editing this file usually requires administrative privileges and can be cumbersome using traditional text editors. +With the new Hosts File Editor in NETworkManager, you can now easily add, edit, enable, disable, or delete entries +in your hosts file without needing to manually open and edit the file. + +A daily backup (up to 5 versions) of the hosts file is created automatically before any changes are applied, +allowing you to restore previous versions if needed. + +Upgrade now to the [latest version of NETworkManager](https://borntoberoot.net/NETworkManager/download) to use this feature. + +More information is available in the [official documentation](https://borntoberoot.net/NETworkManager/docs/application/hosts-file-editor). + +If you find any issues or have suggestions for improvement, please open an [issue on GitHub](https://github.com/BornToBeRoot/NETworkManager/issues). diff --git a/Website/blog/2025-10-19-streamlined-profile-management-with-tags-and-filters/index.md b/Website/blog/2025-10-19-streamlined-profile-management-with-tags-and-filters/index.md new file mode 100644 index 0000000000..725ceb9f65 --- /dev/null +++ b/Website/blog/2025-10-19-streamlined-profile-management-with-tags-and-filters/index.md @@ -0,0 +1,33 @@ +--- +slug: streamlined-profile-management-with-tags-and-filters +title: Streamlined Profile Management with Tags & Filters +description: "NETworkManager 2025.10.18.0 introduces tags and filtering for profiles. Add or remove tags to organize and quickly locate your hosts and networks." +authors: [borntoberoot] +tags: [profile management, tags, new feature] +keywords: [NETworkManager, profile management, tags, filters, network profiles, host management] +--- + +NETworkManager 2025.10.18.0 brings a streamlined approach to profile management with the introduction of Tags and Filtering. + +You can now add or remove tags directly within each profile, making it effortless to organize and quickly locate your hosts and networks. + +![Profile Tags & Filters](./profile-tags-and-filters.gif) + + + +Easily filter profiles across features using the new filter button next to the search box. + +Choose between two filter modes: + +- Match All: Display profiles containing all selected tags (e.g., `prod` and `dns`). +- Match Any: Display profiles containing at least one selected tag (e.g., `prod` or `dev`). + +Additionally, profile groups are now more manageable. Right-click any group header to access a new context menu, allowing you to expand or collapse all groups with a single click. + +These enhancements make managing large profile sets faster, cleaner, and more intuitive than ever. + +Upgrade now to the [latest version of NETworkManager](https://borntoberoot.net/NETworkManager/download) to use this feature. + +More information is available in the [official documentation](https://borntoberoot.net/NETworkManager/docs/groups-and-profiles). + +If you find any issues or have suggestions for improvement, please open an [issue on GitHub](https://github.com/BornToBeRoot/NETworkManager/issues). diff --git a/Website/blog/2025-10-19-streamlined-profile-management-with-tags-and-filters/profile-tags-and-filters.gif b/Website/blog/2025-10-19-streamlined-profile-management-with-tags-and-filters/profile-tags-and-filters.gif new file mode 100644 index 0000000000..0235241cd2 Binary files /dev/null and b/Website/blog/2025-10-19-streamlined-profile-management-with-tags-and-filters/profile-tags-and-filters.gif differ diff --git a/Website/blog/2025-10-23-improved-light-theme-readability/index.md b/Website/blog/2025-10-23-improved-light-theme-readability/index.md new file mode 100644 index 0000000000..a55f269a0e --- /dev/null +++ b/Website/blog/2025-10-23-improved-light-theme-readability/index.md @@ -0,0 +1,24 @@ +--- +slug: improved-light-theme-readability +title: Improved Light Theme Readability +description: "NETworkManager 2025.10.18.0 brings major enhancements to the light theme with improved readability, contrast, and overall user experience." +authors: [borntoberoot] +tags: [theme, ui] +keywords: [NETworkManager, light theme, dark theme, readability, UI, accessibility, theming] +--- + +The latest release of NETworkManager (version 2025.10.18.0) introduces major enhancements to the light theme, improving both readability and overall user experience. + +In this version, the code that handles theming has been completely rewritten, providing granular control over colors and styles. This allows users to fine-tune the light and dark themes independently, ensuring better contrast, visibility, and accessibility across the interface. + +The light theme has already received several improvements to enhance readability, and more adjustments are planned for future releases based on user feedback. So please don’t hesitate to share your thoughts on the [GitHub issue tracker](https://github.com/BornToBeRoot/NETworkManager/issues). + +![Preview - Light theme](./preview-light-theme.png) + + + +Upgrade now to the [latest version of NETworkManager](https://borntoberoot.net/NETworkManager/download) to use this feature. + +More information is available in the [official documentation](https://borntoberoot.net/NETworkManager/docs/settings/appearance). + +If you find any issues or have suggestions for improvement, please open an [issue on GitHub](https://github.com/BornToBeRoot/NETworkManager/issues). diff --git a/Website/blog/2025-10-23-improved-light-theme-readability/preview-light-theme.png b/Website/blog/2025-10-23-improved-light-theme-readability/preview-light-theme.png new file mode 100644 index 0000000000..bddd4469dd Binary files /dev/null and b/Website/blog/2025-10-23-improved-light-theme-readability/preview-light-theme.png differ diff --git a/Website/blog/2026-02-22-system-wide-policies-for-enterprise-deployments/index.md b/Website/blog/2026-02-22-system-wide-policies-for-enterprise-deployments/index.md new file mode 100644 index 0000000000..03751966be --- /dev/null +++ b/Website/blog/2026-02-22-system-wide-policies-for-enterprise-deployments/index.md @@ -0,0 +1,107 @@ +--- +slug: system-wide-policies-for-enterprise-deployments +title: System-Wide Policies for Enterprise Deployments +description: "NETworkManager now supports system-wide policies for centralized control over settings across all users — ideal for enterprise deployments." +authors: [borntoberoot] +tags: [policies, enterprise, settings, new feature] +keywords: [NETworkManager, system-wide policies, enterprise, deployment, Intune, SCCM, Group Policy, configuration management] +--- + +NETworkManager now supports system-wide policies, giving administrators centralized control over application settings across all users on a machine. + +![System-wide policy indicator](./system-wide-policy-indicator.png) + + + +## What Are System-Wide Policies? + +System-wide policies allow administrators to enforce specific settings for all users on a machine. These policies override user-specific settings and provide centralized control over application behavior in enterprise environments. + +When a policy is active, the corresponding setting is locked in the UI and displays a shield icon along with a message indicating that the setting is managed by an administrator. Users can see the enforced value but cannot change it. + +## How to Configure Policies + +Policies are defined in a `config.json` file placed in the application installation directory (the same folder as `NETworkManager.exe`). When this file exists, the application loads the policies at startup and applies them with precedence over user settings. An example file (`config.json.example`) is included in the application installation directory for reference. + +**File location:** + +- **Installed version**: `C:\Program Files\NETworkManager\config.json` (or your custom installation path) +- **Portable version**: Same directory as `NETworkManager.exe` + +**File format:** + +```json +{ + "Policy_Name": true +} +``` + +Property names follow the pattern `Section_SettingName`. You can find the available policy names and values in the corresponding [setting's documentation](https://borntoberoot.net/NETworkManager/docs/category/settings). + +### Example Policy + +For example, the [`Update_CheckForUpdatesAtStartup`](https://borntoberoot.net/NETworkManager/docs/settings/update) policy controls whether the application checks for new program versions on GitHub when the application is launched. The [`Profiles_FolderLocation`](https://borntoberoot.net/NETworkManager/docs/settings/profiles) and [`Settings_FolderLocation`](https://borntoberoot.net/NETworkManager/docs/settings/settings) policies allow administrators to redirect profile and settings storage to a centralized location, such as a network share or a custom local path. + +**Values:** + +- `Update_CheckForUpdatesAtStartup`: + - `true` — Force enable automatic update checks at startup for all users + - `false` — Force disable automatic update checks at startup for all users + - Omit the property — Allow users to control this setting themselves +- `Profiles_FolderLocation` / `Settings_FolderLocation`: + - Absolute path (e.g., `C:\\Path\\To\\Profiles`) + - Path with environment variables (e.g., `%UserProfile%\\NETworkManager\\Settings`) + - UNC path (e.g., `\\\\Server\\Shared\\NETworkManager\\Profiles`) + - Omit the property — Allow the default location logic to apply + +**Example `config.json`:** + +```json +{ + "Update_CheckForUpdatesAtStartup": false, + "Profiles_FolderLocation": "\\\\Server\\Shared\\NETworkManager\\Profiles", + "Settings_FolderLocation": "%UserProfile%\\NETworkManager\\Settings" +} +``` + +:::note + +- The file must be named exactly `config.json` +- The file must contain valid JSON syntax +- Changes to the file require restarting the application to take effect +- If the file doesn't exist or contains invalid JSON, it will be ignored and user settings will apply + +::: + +## Deploying Policies + +1. **Create the configuration file** — Use the `config.json.example` as a template, rename it to `config.json`, and set your desired policy values. + +2. **Deploy to installation directory** — Place the `config.json` file in the same directory as `NETworkManager.exe`. For MSI installations, this is typically `C:\Program Files\NETworkManager\`. + +3. **Deploy methods:** + - Group Policy — copy the file to the installation directory (use Group Policy preferences or a startup script) + - Configuration management tools — SCCM/ConfigMgr, Microsoft Intune, Ansible, etc. + - Scripts and deployment toolkits — PowerShell scripts, PSAppDeployToolkit + - Manual deployment — hand-copy for small-scale rollouts + +4. **Verification:** + - Launch the application + - Navigate to Settings > Update (e.g., "Check for updates at startup") + - Verify the shield icon and the administrator message appear and that the control is disabled + +:::warning + +Ensure the `config.json` file has appropriate permissions so that regular users cannot modify it. On standard installations in `Program Files`, this is automatically enforced by Windows file permissions. + +::: + +## Request More Policies + +Additional policy options will be added in future releases to provide more granular control over application behavior. If you have specific requirements for system-wide policies in your organization, please submit a feature request via the [GitHub issue tracker](https://github.com/BornToBeRoot/NETworkManager/issues/new/choose) to help us prioritize. + +Upgrade now to the [latest version of NETworkManager](https://borntoberoot.net/NETworkManager/download) to use this feature. + +More information is available in the [official documentation](https://borntoberoot.net/NETworkManager/docs/system-wide-policies). + +If you find any issues or have suggestions for improvement, please open an [issue on GitHub](https://github.com/BornToBeRoot/NETworkManager/issues). diff --git a/Website/blog/2026-02-22-system-wide-policies-for-enterprise-deployments/system-wide-policy-indicator.png b/Website/blog/2026-02-22-system-wide-policies-for-enterprise-deployments/system-wide-policy-indicator.png new file mode 100644 index 0000000000..82880711b3 Binary files /dev/null and b/Website/blog/2026-02-22-system-wide-policies-for-enterprise-deployments/system-wide-policy-indicator.png differ diff --git a/Website/blog/2026-03-04-deep-dive-fixing-dpi-scaling-for-embedded-processes-in-wpf/index.md b/Website/blog/2026-03-04-deep-dive-fixing-dpi-scaling-for-embedded-processes-in-wpf/index.md new file mode 100644 index 0000000000..9be067c5f7 --- /dev/null +++ b/Website/blog/2026-03-04-deep-dive-fixing-dpi-scaling-for-embedded-processes-in-wpf/index.md @@ -0,0 +1,284 @@ +--- +slug: deep-dive-fixing-dpi-scaling-for-embedded-processes-in-wpf +title: "Deep Dive: Fixing DPI Scaling for Embedded Processes in WPF" +description: "How NETworkManager fixes DPI scaling for embedded PowerShell and PuTTY windows in WPF using the Console API and WM_DPICHANGED." +authors: [borntoberoot] +tags: [wpf, dpi, windows, c#, win32, putty, powershell] +keywords: [WPF, DPI scaling, SetParent, PowerShell, PuTTY, Win32, WM_DPICHANGED, high DPI, multi-monitor, C#] +--- + +Modern Windows setups with multiple monitors at different scale factors (100 %, 125 %, 150 %, …) expose a hard Win32 limitation the moment you embed a foreign process window into your own application via `SetParent`. Windows simply does not forward `WM_DPICHANGED` across process boundaries. + +This article documents the investigation and the two different solutions NETworkManager uses for its embedded **PowerShell** (a console host process) and **PuTTY** (a GUI process) tabs — together with the complete, relevant C# source code. + + + +## The Embedding Technique + +NETworkManager is a C#/WPF application that uses `WindowsFormsHost` to host a native Win32 `Panel` (WinForms `Panel`), and then calls `SetParent` to re-parent a foreign process window into that panel. + +The XAML wires up the `DpiChanged` event and embeds a WinForms `Panel` as the hosting surface: + +```xml + + + +``` + +The C# code-behind then calls `SetParent` to embed the external process window: + +```csharp +// Make the external process window a child of our WinForms panel +NativeMethods.SetParent(_appWin, WindowHost.Handle); + +// Strip decorations so it looks native inside our tab +long style = (int)NativeMethods.GetWindowLong(_appWin, NativeMethods.GWL_STYLE); +style &= ~(NativeMethods.WS_CAPTION | NativeMethods.WS_POPUP | NativeMethods.WS_THICKFRAME); +NativeMethods.SetWindowLongPtr(_appWin, NativeMethods.GWL_STYLE, new IntPtr(style)); +``` + +This works fine visually — the external window appears seamlessly inside the WPF application. **But fonts never rescale when the user drags the window to a monitor with a different DPI.** + +## Why DPI Notifications Break + +WPF applications declare `PerMonitorV2` DPI awareness in their manifest. When the application's `HwndSource` (the root Win32 window) moves to a different DPI monitor, Windows walks the entire Win32 window tree within the **same process** and sends `WM_DPICHANGED` / `WM_DPICHANGED_AFTERPARENT` to every child. The `WindowsFormsHost` → `WindowHost` chain is all in-process, so it receives `DpiChanged` events correctly. + +The problem is that `_appWin` is owned by a **completely separate process** (PuTTY, conhost). From the Windows DWM compositor's perspective it is now a child window of your panel, but the DPI notification system only walks intra-process window trees. The external child window never receives any DPI message. + +## Solution A — Console Host Processes (PowerShell, cmd) + +PowerShell runs inside **conhost.exe**, the Windows console host. Unlike a GUI process, conhost exposes its font settings through the Console API (`kernel32.dll`). This is a true cross-process interface: any process can attach to an existing console and modify its font without sending any window messages. + +```csharp +// NativeMethods helpers used below +[DllImport("kernel32.dll", SetLastError = true)] +public static extern bool AttachConsole(uint dwProcessId); + +[DllImport("kernel32.dll", SetLastError = true)] +public static extern bool FreeConsole(); + +[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] +private static extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess, + uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, + uint dwFlagsAndAttributes, IntPtr hTemplateFile); + +[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] +private static extern bool GetCurrentConsoleFontEx(IntPtr hConsoleOutput, + bool bMaximumWindow, ref CONSOLE_FONT_INFOEX lpConsoleCurrentFontEx); + +[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] +private static extern bool SetCurrentConsoleFontEx(IntPtr hConsoleOutput, + bool bMaximumWindow, ref CONSOLE_FONT_INFOEX lpConsoleCurrentFontEx); +``` + +### Font rescale helper + +```csharp +/// +/// Attaches to 's console and rescales its current font +/// by using SetCurrentConsoleFontEx. +/// Works for any conhost-based console (PowerShell, cmd, etc.). +/// +public static void TryRescaleConsoleFont(uint processId, double scaleFactor) +{ + if (Math.Abs(scaleFactor - 1.0) < 0.01) + return; + + if (!AttachConsole(processId)) + return; + + const uint GENERIC_READ_WRITE = 0xC0000000u; + const uint FILE_SHARE_READ_WRITE = 3u; + const uint OPEN_EXISTING = 3u; + + var hOut = CreateFile("CONOUT$", GENERIC_READ_WRITE, FILE_SHARE_READ_WRITE, + IntPtr.Zero, OPEN_EXISTING, 0u, IntPtr.Zero); + try + { + if (hOut == INVALID_HANDLE_VALUE) + return; + try + { + var fi = new CONSOLE_FONT_INFOEX + { + cbSize = (uint)Marshal.SizeOf() + }; + if (GetCurrentConsoleFontEx(hOut, false, ref fi)) + { + fi.dwFontSize.Y = (short)Math.Max(1, + (int)Math.Round(fi.dwFontSize.Y * scaleFactor)); + fi.cbSize = (uint)Marshal.SizeOf(); + SetCurrentConsoleFontEx(hOut, false, ref fi); + } + } + finally { CloseHandle(hOut); } + } + finally { FreeConsole(); } +} +``` + +### Using it in the PowerShell control + +`WindowsFormsHost` raises `DpiChanged` when the parent WPF window moves monitors. The handler uses the `NewDpi / OldDpi` ratio to rescale the font relatively: + +```csharp +private void WindowsFormsHost_DpiChanged(object sender, DpiChangedEventArgs e) +{ + ResizeEmbeddedWindow(); + + if (!IsConnected) + return; + + // Rescale the console font using the new/old DPI ratio via the Console API. + // WM_DPICHANGED is never forwarded to cross-process child windows, + // so we use AttachConsole + SetCurrentConsoleFontEx instead. + NativeMethods.TryRescaleConsoleFont( + (uint)_process.Id, + e.NewDpi.PixelsPerInchX / e.OldDpi.PixelsPerInchX); +} +``` + +### Fixing the initial DPI baseline + +There is a subtle bug if the embedded process spawns on a **different monitor** than NETworkManager: conhost's font is scaled for *its* monitor's DPI, not ours. Every subsequent `newDpi/oldDpi` relative rescale will then compound the error. + +Fix: read `GetDpiForWindow` for both windows **before** `SetParent`, and correct the baseline immediately after embedding: + +```csharp +// Capture DPI before embedding to correct font scaling afterwards +var initialWindowDpi = NativeMethods.GetDpiForWindow(_appWin); + +NativeMethods.SetParent(_appWin, WindowHost.Handle); +// ... ShowWindow, strip styles, IsConnected = true ... + +await Task.Delay(250); +ResizeEmbeddedWindow(); + +// Correct font if conhost started at a different DPI than our panel +var currentPanelDpi = NativeMethods.GetDpiForWindow(WindowHost.Handle); +if (initialWindowDpi != currentPanelDpi) + NativeMethods.TryRescaleConsoleFont( + (uint)_process.Id, + (double)currentPanelDpi / initialWindowDpi); +``` + +`GetDpiForWindow` is available since Windows 10 version 1607: + +```csharp +[DllImport("user32.dll")] +public static extern uint GetDpiForWindow(IntPtr hWnd); +``` + +## Solution B — GUI Processes (PuTTY) + +PuTTY is a standard Win32 GUI application, not a console. The Console API does not apply. Instead, the approach is to send `WM_DPICHANGED` (0x02E0) directly to the PuTTY window, which it handles natively (requires PuTTY 0.75+ for reliable behaviour). + +`WM_DPICHANGED` carries the new DPI packed into `wParam` (LOWORD = DPI X, HIWORD = DPI Y) and a `RECT*` in `lParam` with the suggested new window rect: + +### DPI message helper + +```csharp +/// +/// Sends WM_DPICHANGED to a GUI window so it can rescale its fonts and layout. +/// WM_DPICHANGED is not reliably forwarded to cross-process child windows +/// embedded via SetParent, so we send it explicitly. +/// +public static void TrySendDpiChangedMessage(IntPtr hWnd, double oldDpi, double newDpi) +{ + if (hWnd == IntPtr.Zero) + return; + + if (Math.Abs(newDpi - oldDpi) < 0.01) + return; + + const uint WM_DPICHANGED = 0x02E0; + + var newDpiInt = (int)Math.Round(newDpi); + // HIWORD = Y DPI, LOWORD = X DPI + var wParam = (IntPtr)((newDpiInt << 16) | newDpiInt); + + // lParam must point to a RECT with the suggested new size/position. + var rect = new RECT(); + GetWindowRect(hWnd, ref rect); + + var lParam = Marshal.AllocHGlobal(Marshal.SizeOf()); + try + { + Marshal.StructureToPtr(rect, lParam, false); + SendMessage(hWnd, WM_DPICHANGED, wParam, lParam); + } + finally + { + Marshal.FreeHGlobal(lParam); + } +} +``` + +### Using it in the PuTTY control + +```csharp +private void WindowsFormsHost_DpiChanged(object sender, DpiChangedEventArgs e) +{ + ResizeEmbeddedWindow(); + + if (!IsConnected) + return; + + // Send WM_DPICHANGED explicitly to the PuTTY window with the new DPI. + // WM_DPICHANGED is never forwarded to cross-process child windows after SetParent, + // so we inject the message directly. + NativeMethods.TrySendDpiChangedMessage( + _appWin, + e.OldDpi.PixelsPerInchX, + e.NewDpi.PixelsPerInchX); +} +``` + +### Fixing the initial DPI baseline + +Same issue as PowerShell: PuTTY may start on a different monitor. Because PuTTY is a GUI process, the console API does not apply — but the explicit `WM_DPICHANGED` message works for the initial correction too: + +```csharp +// Capture DPI before embedding +var initialWindowDpi = NativeMethods.GetDpiForWindow(_appWin); + +NativeMethods.SetParent(_appWin, WindowHost.Handle); +// ... ShowWindow, strip styles, IsConnected = true ... + +await Task.Delay(250); +ResizeEmbeddedWindow(); + +// Correct DPI if PuTTY started at a different DPI than our panel +var currentPanelDpi = NativeMethods.GetDpiForWindow(WindowHost.Handle); +if (initialWindowDpi != currentPanelDpi) + NativeMethods.TrySendDpiChangedMessage(_appWin, initialWindowDpi, currentPanelDpi); +``` + +## Sizing the WindowsFormsHost at Load + +One more pitfall: `WindowsFormsHost` starts with zero size because WPF's logical pixel coordinates do not account for the system DPI. The panel's `ClientSize` must be set in **physical pixels**: + +```csharp +private void UserControl_Loaded(object sender, RoutedEventArgs e) +{ + if (_initialized) return; + + // VisualTreeHelper.GetDpi returns DpiScaleX/Y as a ratio (1.0 = 96 DPI, 1.5 = 144 DPI). + var dpi = System.Windows.Media.VisualTreeHelper.GetDpi(this); + WindowHost.Height = (int)(ActualHeight * dpi.DpiScaleY); + WindowHost.Width = (int)(ActualWidth * dpi.DpiScaleX); + + Connect().ConfigureAwait(false); + _initialized = true; +} +``` + +## Summary + +When you embed a foreign process window via `SetParent`, Windows never forwards DPI change notifications across process boundaries. For console host processes (PowerShell, cmd) use the Windows Console API (`AttachConsole` + `SetCurrentConsoleFontEx`) to rescale fonts directly; for GUI processes (PuTTY) send `WM_DPICHANGED` (0x02E0) explicitly with the new DPI packed into `wParam`. In both cases, apply an initial DPI correction after `SetParent` by comparing `GetDpiForWindow` before and after embedding, and set the `WindowsFormsHost` initial size in physical pixels using `VisualTreeHelper.GetDpi`. + +The full implementation is available in the NETworkManager source: + +- [`NETworkManager.Utilities/NativeMethods.cs`](https://github.com/BornToBeRoot/NETworkManager/blob/main/Source/NETworkManager.Utilities/NativeMethods.cs) — all P/Invoke declarations and helpers +- [`NETworkManager/Controls/PowerShellControl.xaml.cs`](https://github.com/BornToBeRoot/NETworkManager/blob/main/Source/NETworkManager/Controls/PowerShellControl.xaml.cs) — console host approach +- [`NETworkManager/Controls/PuTTYControl.xaml.cs`](https://github.com/BornToBeRoot/NETworkManager/blob/main/Source/NETworkManager/Controls/PuTTYControl.xaml.cs) — GUI process approach diff --git a/Website/blog/2026-04-30-introducing-firewall/firewall-rule.png b/Website/blog/2026-04-30-introducing-firewall/firewall-rule.png new file mode 100644 index 0000000000..890707e2cd Binary files /dev/null and b/Website/blog/2026-04-30-introducing-firewall/firewall-rule.png differ diff --git a/Website/blog/2026-04-30-introducing-firewall/firewall.png b/Website/blog/2026-04-30-introducing-firewall/firewall.png new file mode 100644 index 0000000000..d4efc00c17 Binary files /dev/null and b/Website/blog/2026-04-30-introducing-firewall/firewall.png differ diff --git a/Website/blog/2026-04-30-introducing-firewall/index.md b/Website/blog/2026-04-30-introducing-firewall/index.md new file mode 100644 index 0000000000..343b846114 --- /dev/null +++ b/Website/blog/2026-04-30-introducing-firewall/index.md @@ -0,0 +1,63 @@ +--- +slug: introducing-firewall +title: Introducing Firewall +description: "NETworkManager introduces the new Firewall feature. View, add, edit, enable, disable, and delete Windows Firewall rules managed by NETworkManager — all from a user-friendly interface." +authors: [borntoberoot] +tags: [firewall, windows firewall, security, new feature] +keywords: [NETworkManager, Windows Firewall, Windows Defender Firewall, firewall rules, inbound, outbound, network security] +--- + +NETworkManager introduces a new feature, the `Firewall`. You can now manage Windows Firewall rules created by NETworkManager directly from within the app — no more jumping between MMC snap-ins for day-to-day tasks. + +This is especially useful if you frequently spin up local services (lab environments, dev boxes, game servers, small internal tools) and need a quick and repeatable way to open or block ports, restrict traffic to specific IP ranges, or scope rules to profiles like **Domain**, **Private**, or **Public**. + +![Firewall](./firewall.png) + + + +## Manage rules safely (and without touching your system rules) + +The Firewall view intentionally focuses on rules managed by NETworkManager only. + +Every rule created via NETworkManager is stored with a `NETworkManager_` prefix in the Windows Firewall rule display name. This makes it easy to distinguish "your" rules from system-managed or third-party rules — and it allows NETworkManager to filter the list so you only see what it owns. + +## What you can do with the new Firewall feature + +- View firewall rules created by NETworkManager +- Add new inbound or outbound rules +- Edit existing rules +- Enable or disable rules quickly +- Delete rules you no longer need +- Copy or export rule information +- Refresh the list with `F5` +- Open the native Windows Firewall console (`WF.msc`) via the **Windows Firewall Settings** button + +## Add / Edit rules — with the options you actually need + +When creating or editing a rule, NETworkManager exposes the most common and important fields in a clear dialog: + +![Add rule](./firewall-rule.png) + +- **Name**: Display name of the rule (the `NETworkManager_` prefix is added automatically and hidden in the UI) +- **Enabled**: Whether the rule is active right after creation +- **Description**: Optional description of the rule +- **Direction**: Inbound / Outbound +- **Action**: Allow / Block +- **Protocol**: Any, TCP, UDP, ICMPv4, ICMPv6, GRE, L2TP +- **Local / Remote ports**: Available for TCP and UDP; multiple ports and ranges separated by `;` +- **Local / Remote addresses**: Supports single IPs, ranges, subnets (CIDR and subnet masks), and keywords such as `LocalSubnet` or `Internet` +- **Program**: Limit the rule to a specific executable (optional) +- **Interface type**: Any, Wired, Wireless, RemoteAccess +- **Network profiles**: Domain / Private / Public (at least one must be selected) + +You can find all details (including examples for port and address formats) in the [official documentation](https://borntoberoot.net/NETworkManager/docs/application/firewall). + +## Administrator privileges + +Managing firewall rules requires elevated rights. If NETworkManager is not running as administrator, the Firewall view is **read-only**. Use the **Restart as administrator** button to relaunch NETworkManager with the required privileges. + +## Try it now + +You can test this feature in the [latest pre-release of NETworkManager](https://borntoberoot.net/NETworkManager/download#pre-release). + +If you find any issues or have suggestions for improvement, please open an [issue on GitHub](https://github.com/BornToBeRoot/NETworkManager/issues). diff --git a/Website/blog/2026-05-03-introducing-neighbor-table/index.md b/Website/blog/2026-05-03-introducing-neighbor-table/index.md new file mode 100644 index 0000000000..15bd13dc0e --- /dev/null +++ b/Website/blog/2026-05-03-introducing-neighbor-table/index.md @@ -0,0 +1,64 @@ +--- +slug: introducing-neighbor-table +title: "Introducing Neighbor Table" +description: "NETworkManager introduces the Neighbor Table, replacing the ARP Table with a unified view that covers both IPv4 (ARP) and IPv6 (NDP) address-to-MAC mappings." +authors: [borntoberoot] +tags: [neighbor table, arp, ndp, ipv6, refactoring] +keywords: [NETworkManager, neighbor table, ARP table, ARP, NDP, IPv6, IPv4, MAC address, neighbor discovery, address resolution] +--- + +NETworkManager introduces the new **Neighbor Table**, replacing the **ARP Table** with a unified view that covers IP-to-MAC address mappings for both IPv4 (ARP) and IPv6 (NDP) in a single place. + +![Neighbor Table](./neighbor-table.png) + + + +## Why the change? + +The old ARP Table only surfaced IPv4 entries. Modern networks increasingly rely on IPv6, and the equivalent mechanism on IPv6 – the **Neighbor Discovery Protocol (NDP)** – was left out entirely. + +Rather than adding a separate IPv6 view, NETworkManager now provides a single **Neighbor Table** that shows both IPv4 and IPv6 neighbors side by side, reflecting what the Windows networking stack actually maintains. + +## ARP vs. NDP — what's the difference? + +**IPv4 – ARP (Address Resolution Protocol)** is a layer-2 protocol that maps IPv4 addresses to MAC addresses. When a device needs to send data to an IPv4 address, it first checks the ARP cache. If no entry is found, it broadcasts an ARP request; the target replies with its MAC address and the entry is cached. + +**IPv6 – NDP (Neighbor Discovery Protocol)** fulfills the same purpose for IPv6. Instead of broadcasts, NDP uses ICMPv6 Neighbor Solicitation and Advertisement messages sent to a solicited-node multicast address — making it more efficient and multicast-friendly. + +Both protocols are susceptible to spoofing/poisoning attacks that can manipulate cached mappings and lead to man-in-the-middle scenarios. + +## What the Neighbor Table shows + +Each row in the table represents one cached neighbor entry and includes: + +| Column | Description | +| --- | --- | +| **IP Address** | IPv4 or IPv6 address of the cached neighbor. | +| **Interface** | Human-readable name of the network interface (e.g. `Ethernet`, `Wi-Fi`). | +| **MAC Address** | Link-layer (MAC) address associated with the IP address. | +| **State** | Current reachability state (Reachable, Stale, Permanent, …). | +| **Multicast** | Indicates whether the IP address is a multicast address. | + +You can refresh the table at any time with `F5`, and right-click any row to copy or export individual values, or to delete the selected entry. + +## Adding static entries + +You can also add permanent static neighbor entries — useful for pinning a critical device's MAC address so that ARP/NDP spoofing cannot redirect its traffic. + +![Add entry](./neighbor-table-entry.png) + +Click **Add entry...** below the table, supply an IPv4 or IPv6 address, the target MAC address, and the interface — NETworkManager takes care of the rest using `New-NetNeighbor` under the hood. + +:::note + +Adding and deleting neighbor entries requires administrator privileges. If NETworkManager is not running as administrator, the view is in read-only mode. Use the **Restart as administrator** button to relaunch with elevated rights. + +::: + +## Try it now + +You can test this feature in the [latest pre-release of NETworkManager](https://borntoberoot.net/NETworkManager/download#pre-release). + +More details are available in the [official documentation](https://borntoberoot.net/NETworkManager/docs/application/neighbor-table). + +If you find any issues or have suggestions, please open an [issue on GitHub](https://github.com/BornToBeRoot/NETworkManager/issues). diff --git a/Website/blog/2026-05-03-introducing-neighbor-table/neighbor-table-entry.png b/Website/blog/2026-05-03-introducing-neighbor-table/neighbor-table-entry.png new file mode 100644 index 0000000000..e009ab4e11 Binary files /dev/null and b/Website/blog/2026-05-03-introducing-neighbor-table/neighbor-table-entry.png differ diff --git a/Website/blog/2026-05-03-introducing-neighbor-table/neighbor-table.png b/Website/blog/2026-05-03-introducing-neighbor-table/neighbor-table.png new file mode 100644 index 0000000000..3d5c554999 Binary files /dev/null and b/Website/blog/2026-05-03-introducing-neighbor-table/neighbor-table.png differ diff --git a/Website/blog/2026-05-18-import-profiles-from-active-directory/index.md b/Website/blog/2026-05-18-import-profiles-from-active-directory/index.md new file mode 100644 index 0000000000..6567687c4c --- /dev/null +++ b/Website/blog/2026-05-18-import-profiles-from-active-directory/index.md @@ -0,0 +1,62 @@ +--- +slug: import-profiles-from-active-directory +title: Import Profiles from Active Directory +description: "NETworkManager now lets you import profiles directly from Active Directory. Query computer accounts via LDAP, review the results, and bulk-import them as profiles in seconds." +authors: [borntoberoot] +tags: [profiles, active directory, import, new feature] +keywords: [NETworkManager, profile import, Active Directory, LDAP, bulk import, computer accounts, sysadmin] +--- + +NETworkManager now lets you import profiles directly from **Active Directory**. Instead of creating profiles for every machine by hand, you can query your AD for computer accounts via LDAP, review the results, and bulk-import them into any group with a single click. + + + +## The problem with large environments + +If you manage dozens or hundreds of machines, maintaining NETworkManager profiles manually is tedious. You have to add each host one by one, set the display name, pick the right group, and enable the applications you need. When machines are added or decommissioned in AD, keeping profiles in sync becomes its own maintenance burden. + +The new **Active Directory import** solves this by pulling computer accounts directly from your domain. + +## How it works + +Go to **Settings → Profiles** and click **Import**. Select **Active Directory** as the import source. A dialog opens where you configure the LDAP connection: + +![Profiles - Import Active Directory](./profiles--import-active-directory.png) + +| Field | Description | +| --- | --- | +| **Search base** | LDAP search base, e.g. `DC=domain,DC=com` | +| **Server** | Hostname or IP of the LDAP server. Leave empty to use the default domain controller. | +| **Port** | Defaults to `389` (LDAP) or `636` (LDAPS), switches automatically when **Use SSL** is toggled. | +| **Use SSL** | Connect via LDAPS (encrypted). | +| **Authentication** | Use current Windows credentials or supply a custom username and password. | +| **Exclude disabled accounts** | Skip computer accounts that are disabled in AD. | +| **Additional LDAP filter** | Narrow results further, e.g. `(operatingSystem=Windows Server*)`. | + +Click **Search** and NETworkManager queries the directory. All matching computer accounts appear in the next step. + +## Review and import + +Before anything is written, you get a full review of what will be imported: + +![Profiles - Import Review](./profiles--import-review.png) + +Each entry shows a **Status** so you know exactly what will happen: + +- **New** — not yet in NETworkManager, will be imported. +- **Already imported** — already exists as a profile from this source. Skipped by default (configurable). +- **No host** — no host address available, cannot be imported. + +On the right side you choose which **applications** to enable for the imported profiles. [Ping Monitor](https://borntoberoot.net/NETworkManager/docs/application/ping-monitor), [Remote Desktop](https://borntoberoot.net/NETworkManager/docs/application/remote-desktop), and [PowerShell](https://borntoberoot.net/NETworkManager/docs/application/powershell) are pre-selected, but you can change this before importing. + +You also pick a **target group** — either an existing one or a new name you type in on the spot. + +Click **Import** and a summary shows how many profiles were created, skipped as duplicates, and skipped due to missing host addresses. + +## Try it now + +You can test this feature in the [latest pre-release of NETworkManager](https://borntoberoot.net/NETworkManager/download#pre-release). + +More information is available in the [official documentation](https://borntoberoot.net/NETworkManager/docs/groups-and-profiles#import). + +If you find any issues or have suggestions for improvement, please open an [issue on GitHub](https://github.com/BornToBeRoot/NETworkManager/issues). diff --git a/Website/blog/2026-05-18-import-profiles-from-active-directory/profiles--import-active-directory.png b/Website/blog/2026-05-18-import-profiles-from-active-directory/profiles--import-active-directory.png new file mode 100644 index 0000000000..3055a198a5 Binary files /dev/null and b/Website/blog/2026-05-18-import-profiles-from-active-directory/profiles--import-active-directory.png differ diff --git a/Website/blog/2026-05-18-import-profiles-from-active-directory/profiles--import-review.png b/Website/blog/2026-05-18-import-profiles-from-active-directory/profiles--import-review.png new file mode 100644 index 0000000000..b8c1be02e6 Binary files /dev/null and b/Website/blog/2026-05-18-import-profiles-from-active-directory/profiles--import-review.png differ diff --git a/Website/blog/authors.yml b/Website/blog/authors.yml new file mode 100644 index 0000000000..12b1f877b6 --- /dev/null +++ b/Website/blog/authors.yml @@ -0,0 +1,5 @@ +borntoberoot: + name: BornToBeRoot + title: Maintainer of NETworkManager + url: https://github.com/BornToBeRoot + image_url: https://github.com/BornToBeRoot.png diff --git a/Website/docs/application/_category_.json b/Website/docs/application/_category_.json new file mode 100644 index 0000000000..d8a3ee9f6a --- /dev/null +++ b/Website/docs/application/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Application", + "position": 2, + "link": { + "type": "generated-index", + "description": "Features included in NETworkManager" + } +} diff --git a/Website/docs/application/aws-session-manager.md b/Website/docs/application/aws-session-manager.md new file mode 100644 index 0000000000..ffbcef408f --- /dev/null +++ b/Website/docs/application/aws-session-manager.md @@ -0,0 +1,502 @@ +--- +sidebar_position: 11 +description: "AWS Session Manager integration for NETworkManager (removed). Connect to EC2 instances using PowerShell with the AWS SSM plugin instead." +keywords: [NETworkManager, AWS Session Manager, EC2, SSM plugin, remote session, AWS] +--- + +# AWS Session Manager + +:::danger + +This feature has been removed! NETworkManager **2025.10.18.0** will be the last version to support the **AWS Session Manager** feature. + +The [AWS Session Manager Plugin](https://github.com/aws/session-manager-plugin) is not actively maintained and contains several bugs (e.g. German / Spain keyboard layout issues). The current code base was also difficult to maintain and extend, and I currently have no test environment. + +You can still use AWS Session Manager within NETworkManager with the [PowerShell](./powershell.md) feature by using the `aws ssm start-session --target ` command. + +::: + +With **AWS** (Systems Manager) **Session Manager**, you can connect to and manage an EC2 instance without opening inbound ports, running a bastion host, or managing SSH keys. The integration of AWS Session Manager with NETworkManger supports tabs and profiles for hosts. The connection can be established via a profile (double-click, Enter key or right-click `Connect`) or directly via the [connection](#connect) dialog. You can also synchronize your EC2 instances from AWS. To connect to the instances a PowerShell console is used with the AWS CLI and the AWS Session Manager plugin. The connection to the instances is established via the following command: + +```powershell +aws ssm start-session --target +``` + +:::note + +Here you can find more information about [AWS Systems Manager](https://aws.amazon.com/systems-manager/) and the documentation for [AWS Systems Manager Session Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager.html). You need to setup you AWS account to use AWS Systems Manager Session Manager. See [Prerequisites](#prerequisites) for more details. + +::: + +![AWS Session Manager](../img/aws-session-manager.png) + +:::note + +Right-click on the tab will open the context menu with the following options: + +- **Reconnect** - Restart the PowerShell console and reconnect to the AWS instance. +- **Resize** - Resize the PowerShell console to the current view size (if connected). + +::: + +## Prerequisites + +The following prerequisites must be met to use AWS Systems Manager Session Manager. + +1. [Setup AWS CLI & Session Manager plugin](#setup-aws-cli--session-manager-plugin) +2. [Setup AWS Systems Manager Session Manager](#setup-aws-systems-manager-session-manager) +3. [Setup AWS IAM user to sync and connect](#setup-aws-iam-user-to-sync-and-connect) +4. [Verify the connection](#verify-the-connection) + +### Setup AWS CLI & Session Manager plugin + +The AWS CLI and AWS Session Manager plugin is required on **your computer** to run the `aws ssm start-session` command. You can download them here: + +- [AWS CLI](https://aws.amazon.com/cli/) (direct link [Windows installer](https://awscli.amazonaws.com/AWSCLIV2.msi)) +- [AWS Session Manager plugin](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html) (direct link [Windows installer](https://s3.amazonaws.com/session-manager-downloads/plugin/latest/windows/SessionManagerPluginSetup.exe)) + +:::note + +See the AWS documentation for installation instructions. + +::: + +### Setup AWS Systems Manager Session Manager + +To connect to the instances, the AWS Systems Manager Session Manager must be configured in AWS. See their documentation for instructions on [how to set up the Session Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-getting-started.html). + +Below you will find an example configuration: + +
+ Example SSM-SessionManagerRunShell document + +:::warning + +This is an example of the AWS Systems Manager Session Manager configuration and may not be suitable for a production environment. + +::: + +Create a JOSN file with the name `SessionManagerRunShell.json` and the following content: + +```json +{ + "schemaVersion": "1.0", + "description": "Document to hold regional settings for Session Manager", + "sessionType": "Standard_Stream", + "inputs": { + "s3BucketName": "", + "s3KeyPrefix": "", + "s3EncryptionEnabled": true, + "cloudWatchLogGroupName": "", + "cloudWatchEncryptionEnabled": true, + "cloudWatchStreamingEnabled": false, + "kmsKeyId": "", + "runAsEnabled": true, + "runAsDefaultUser": "", + "idleSessionTimeout": "20", + "maxSessionDuration": "60", + "shellProfile": { + "windows": "", + "linux": "" + } + } +} +``` + +Create the document in AWS SSM via AWS CLI: + +```bash +aws ssm create-document \ + --name SSM-SessionManagerRunShell \ + --content "file://SessionManagerRunShell.json" \ + --document-type "Session" \ + --document-format JSON +``` + +
+ +
+ Example IAM role / instance profile + +:::warning + +This is an example of an IAM role/instance profile that allows access from AWS Systems Manager Session Manager to the instance and may not be suitable for a production environment. + +::: + +Create a new IAM role/instance profile with the following content: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "Service": "ec2.amazonaws.com" + }, + "Action": "sts:AssumeRole" + } + ] +} +``` + +Add an (inline) policy to the role with the following content: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "ssmmessages:CreateControlChannel", + "ssmmessages:CreateDataChannel", + "ssmmessages:OpenControlChannel", + "ssmmessages:OpenDataChannel", + "ssm:UpdateInstanceInformation" + ], + "Resource": "*" + } /*, + { + "Effect": "Allow", + "Action": [ + "logs:CreateLogStream", + "logs:PutLogEvents", + "logs:DescribeLogGroups", + "logs:DescribeLogStreams" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": [ + "s3:PutObject" + ], + "Resource": "arn:aws:s3::://*" + }, + { + "Effect": "Allow", + "Action": [ + "s3:GetEncryptionConfiguration" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": [ + "kms:Decrypt" + ], + "Resource": "" + }, + { + "Effect": "Allow", + "Action": "kms:GenerateDataKey", + "Resource": "*" + }*/ + ] +} +``` + +
+ +### Setup AWS IAM user to sync and connect + +For the snychronization of the EC2 instances and to connect to them via AWS Systems Manager Session Manager, a separate user with minimal privileges should be set up. For the synchronization from AWS EC2 the permissions `ec2:DescribeInstances` and `ec2:DescribeInstanceStatus` are required. Additionally, the user must be able to connect to the instances via AWS Systems Manager Session Manager. Below are examples of both policies: + +
+ Example sync policy + +:::warning + +This is an example of an IAM user policy to synchronize instances of AWS EC2 for NETworkManager. + +::: + +Add an (inline) policy to the user with the following content: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "AllowNETworkManagerSync", + "Effect": "Allow", + "Action": ["ec2:DescribeInstances", "ec2:DescribeInstanceStatus"], + "Resource": "*" + } + ] +} +``` + +
+ +
+ Example connect policy + +:::warning + +This is an example of an IAM user policy that allows access to EC2 instances through AWS Systems Manager Session Manager and may not be suitable for a production environment. + +::: + +Add an (inline) policy to the user with the following content: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": ["ssm:StartSession"], + "Resource": [ + "arn:aws:ec2:::instance/*", + "arn:aws:ssm:::document/SSM-SessionManagerRunShell" + ] + }, + { + "Effect": "Allow", + "Action": [ + "ssm:DescribeSessions", + "ssm:GetConnectionStatus", + "ssm:DescribeInstanceProperties", + "ec2:DescribeInstances" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": ["ssm:TerminateSession", "ssm:ResumeSession"], + "Resource": ["arn:aws:ssm:*:*:session/${aws:username}-*"] + } /*, + { + "Effect": "Allow", + "Action": ["kms:GenerateDataKey"], + "Resource": "" + }*/ + ] +} +``` + +
+ +API keys must be generated for the user and the AWS CLI must be configured (See [`aws configure`](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-quickstart.html) and [`~\.aws\credentials`](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html) file for more details). + +:::warning + +Sensitive data like the API keys are stored in plain text in the file `~\.aws\credentials`! + +::: + +### Verify the connection + +You can verify the connection to the EC2 instance through AWS Systems Manager Session Manager by opening a PowerShell and connecting to the instance through AWS CLI: + +``` +aws ssm start-session --target instance-id +``` + +## Connect + +### Instance ID + +ID of the AWS EC2 instance. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `i-0123456789abcdef0` + +### Profile + +AWS CLI profile which will be used to connect. + +**Type:** `String` + +**Default:** `Empty or from settings` + +**Example:** `dev` + +:::note + +If not set, the AWS CLI default settings are used! + +::: + +### Region + +AWS region where the instance is located. + +**Type:** `String` + +**Default:** `Empty or from settings` + +**Example:** `eu-central-1` + +:::note + +If not set, the AWS CLI default settings are used! + +::: + +## Profile + +### Instance ID + +ID of the AWS EC2 instance. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `i-0123456789abcdef0` + +### Profile + +AWS CLI profile which will be used to connect. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `dev` + +### Region + +AWS region where the instance is located. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `eu-central-1` + +## Group + +### Profile + +AWS CLI profile which will be used to connect. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `dev` + +### Region + +AWS region where the instance is located. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `eu-central-1` + +## Settings + +### Synchronize EC2 instances from AWS + +If enabled, EC2 instances are synced from AWS. In addition, the [profiles and regions](#profiles-and-regions-to-synchronize) to be synchronized must be configured. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Profiles and regions to synchronize + +Here you can specify a combination of AWS CLI profile and AWS region from where the EC2 instances should be synchronized. Multiple AWS accounts and regions are supported. + +**Type:** `List` + +| Property | Type | +| --------- | --------- | +| `Enabled` | `Boolean` | +| `Profile` | `String` | +| `Region` | `String` | + +**Default:** + +| Enabled | Profile | Region | +| ---------- | --------- | -------------- | +| `Disabled` | `default` | `eu-central-1` | +| `Disabled` | `default` | `us-east-1` | + +**Example:** + +| Enabled | Profile | Region | +| ---------- | ------- | -------------- | +| `Disabled` | `dev` | `eu-central-1` | +| `Disabled` | `dev` | `us-east-1` | +| `Disabled` | `prod` | `eu-central-1` | +| `Disabled` | `prod` | `us-east-1` | + +:::note + +Right-click on a selected profile to `edit` or `delete` it. + +You can also use the Hotkeys `F2` (`edit`) or `Del` (`delete`) on a selected profile. + +Only enabled profiles are synchronized and [`Synchronize EC2 instances from AWS`](#synchronize-ec2-instances-from-aws) must be enabled! + +::: + +### Synchronize only running EC2 instances from AWS + +If enabled, only EC2 instances are synchronized where the `instance state` is `running`. + +**Type:** `Boolean` + +**Default:** `Enabled` + +### Profile + +AWS CLI profile which will be used to connect for manually added profiles. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `dev` + +:::note + +If not set, the AWS CLI default settings are used! + +::: + +### Region + +AWS region where the instance is located for manually added profiles. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `eu-central-1` + +:::note + +If not set, the AWS CLI default settings are used! + +::: + +### File path + +Path to the PowerShell console where the AWS CLI is available. + +**Type:** `String` + +**Default:** `C:\Program Files\PowerShell\7\pwsh.exe`, `C:\Program Files (x86)\PowerShell\7\pwsh.exe` or `C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe` + +**Example:** + +- `C:\path\to\PowerShell.exe` +- `C:\path\to\pwsh.exe` + +:::note + +The `Configure` button opens the PowerShell console to configure it. + +::: diff --git a/Website/docs/application/bit-calculator.md b/Website/docs/application/bit-calculator.md new file mode 100644 index 0000000000..a375f61b9b --- /dev/null +++ b/Website/docs/application/bit-calculator.md @@ -0,0 +1,38 @@ +--- +sidebar_position: 23 +description: "Convert between data units like bits, bytes, kilobits, megabytes, and more with NETworkManager Bit Calculator. Supports binary and decimal notation." +keywords: [NETworkManager, bit calculator, data unit converter, bits to bytes, bandwidth calculator, data conversion] +--- + +# Bit Calculator + +With the **Bit Calculator** you can convert between different data units — enter a number and select the input unit to see the equivalent values in bits, bytes, kilobits, kilobytes, megabits, megabytes, and more. + +![Bit Calculator](../img/bit-calculator.png) + +### Toolbar + +| Button | Description | +|--------|-------------| +| **Export...** | Exports the information to a CSV, XML, or JSON file | + +### Context menu + +| Action | Description | +|--------|-------------| +| **Copy** | Copies the selected information to the clipboard | + +## Settings + +### Notation + +Notation used for the calculation. + +**Type:** `NETworkManager.Models.Network.BitCaluclatorNotation` + +**Default:** `Binary` + +**Possible values:** + +- `Binary` (1024) +- `Decimal` (1000) diff --git a/Website/docs/application/connections.md b/Website/docs/application/connections.md new file mode 100644 index 0000000000..870d4a0dd7 --- /dev/null +++ b/Website/docs/application/connections.md @@ -0,0 +1,30 @@ +--- +sidebar_position: 25 +description: "View all active TCP connections with source and destination endpoints and associated processes. NETworkManager Connections works like an enhanced netstat." +keywords: [NETworkManager, connections, active connections, netstat, TCP connections, network connections] +--- + +# Connections + +The **Connections** view shows all active **TCP** connections with their source and destination IP endpoints (IP address and port) and the associated process running on your computer. + +:::info + +The data shown is similar to the output of the `netstat` command. + +::: + +![Connections](../img/connections.png) + +### Context menu + +| Action | Description | +|--------|-------------| +| **Copy** | Copies the selected information to the clipboard | +| **Export...** | Exports the selected or all results to a file | + +### Keyboard shortcuts + +| Key | Action | +|-----|--------| +| `F5` | Refresh | diff --git a/Website/docs/application/dashboard.md b/Website/docs/application/dashboard.md new file mode 100644 index 0000000000..d72147c801 --- /dev/null +++ b/Website/docs/application/dashboard.md @@ -0,0 +1,112 @@ +--- +sidebar_position: 0 +description: "View the status of your network connection at a glance. The NETworkManager Dashboard monitors adapter changes and checks router and internet connectivity." +keywords: [NETworkManager, dashboard, network status, network connection, network monitoring, connectivity check] +--- + +# Dashboard + +The **Dashboard** shows the status of your computer's current network connection to provide a quick overview of the most important information. Whenever the local network adapter changes state (e.g. an Ethernet cable is plugged in, Wi-Fi or VPN connects), the dashboard checks connectivity to the router and the internet. + +![Dashboard](../img/dashboard.png) + +### Keyboard shortcuts + +| Key | Action | +|-----|--------| +| `F5` | Refresh the dashboard | + +:::note + +You may need to click into a widget first before keyboard shortcuts are recognized. + +::: + +## Settings + +### Public IPv4 address + +Public IPv4 address reachable via ICMP. + +**Type:** `String` + +**Default:** `1.1.1.1` + +### Public IPv6 address + +Public IPv6 address reachable via ICMP. + +**Type:** `String` + +**Default:** `2606:4700:4700::1111` + +### Check public IP address + +Enables or disables the resolution of the public IP address via [`api.ipify.org`](https://www.ipify.org/) and [`api6.ipify.org`](https://www.ipify.org/). + +**Type:** `Boolean` + +**Default:** `Enabled` + +### Use custom IPv4 address API + +Override the default IPv4 address API to resolve the public IP address. The API should return only a plain text IPv4 address like `xx.xx.xx.xx`. + +**Type:** `Boolean | String` + +**Default:** `Disabled | Empty` + +**Example:** + +- [`api.ipify.org`](https://api.ipify.org/) +- [`ip4.seeip.org`](https://ip4.seeip.org/) +- [`api.my-ip.io/ip`](https://api.my-ip.io/ip) + +### Use custom IPv6 address API + +Override the default IPv6 address API to resolve the public IP address. The API should return only a plain text IPv6 address like `xxxx:xx:xxx::xx`. + +**Type:** `Boolean | String` + +**Default:** `Disabled | Empty` + +**Example:** + +- [`api6.ipify.org`](https://api6.ipify.org/) + +### Check IP geolocation + +Enables or disables the resolution of the IP geolocation via [`ip-api.com`](https://ip-api.com/). + +:::note + +The free API endpoint is limited to 45 requests per minute, supports only the `http` protocol and is available for non-commercial use only. + +::: + +**Type:** `Boolean` + +**Default:** `Enabled` + +### Check DNS resolver + +Enables or disables the detection of the DNS resolver in use via [`ip-api.com`](https://ip-api.com/). + +**Type:** `Boolean` + +**Default:** `Enabled` + +## Speed Test + +The **Speed Test** widget measures the current connection's download and upload speed, latency, and jitter against [`speed.cloudflare.com`](https://speed.cloudflare.com/). The test is **user-initiated** — it does not run automatically on dashboard load. Click **Speed Test** to run a measurement. + +The result includes: + +- **Download** speed in Mbps +- **Upload** speed in Mbps +- **Latency** in ms (unloaded, 50th percentile of latency probes) +- **Jitter** in ms (average consecutive delta between latency samples) +- **ISP** — internet service provider as reported by Cloudflare +- **Server location** — Cloudflare PoP (Point of Presence) handling the test + +Before running the test, a privacy disclaimer informs the user that `speed.cloudflare.com` will receive requests with the client's IP address and network information. The disclaimer is shown again after restarting the app because acceptance is not currently persisted. See the [Cloudflare privacy policy](https://www.cloudflare.com/privacypolicy/) for details. The widget never contacts Cloudflare's telemetry endpoint (`aim.cloudflare.com/__log`). diff --git a/Website/docs/application/discovery-protocol.md b/Website/docs/application/discovery-protocol.md new file mode 100644 index 0000000000..7d66201b83 --- /dev/null +++ b/Website/docs/application/discovery-protocol.md @@ -0,0 +1,49 @@ +--- +sidebar_position: 18 +description: "Capture LLDP and CDP frames to discover connected network switches and routers. NETworkManager Discovery Protocol shows device name, port, and VLAN information." +keywords: [NETworkManager, LLDP, CDP, discovery protocol, network discovery, switch identification, VLAN] +--- + +# Discovery Protocol + +With **Discovery Protocol** you can capture LLDP (Link Layer Discovery Protocol) and CDP (Cisco Discovery Protocol) frames to see which switch or router your device is connected to. Device name, port, VLAN, and other information are shown in labeled fields. + +:::info + +The Link Layer Discovery Protocol (LLDP) is a vendor-neutral Layer 2 network protocol used by network devices, especially switches, to advertise their identity, capabilities, and neighbors on an IEEE 802 Local Area Network (LAN). If configured, LLDP messages are sent out periodically as frames with the destination MAC address of `01:80:c2:00:00:0e`. The default time interval is 30 seconds. + +The Cisco Discovery Protocol (CDP) is a proprietary Layer 2 protocol used by Cisco Systems to exchange information about network devices. If configured, CDP messages are sent out periodically as frames with the destination MAC address `01:00:0c:cc:cc:cc`. The default time interval is 60 seconds. + +::: + +:::warning + +If you are using a hypervisor like Hyper-V with a virtual switch configured as "External network" which is shared with the host where NETworkManager is running, you may not receive any packets. This is because the virtual switch does not forward the LLDP or CDP frames to the host. You may temporarily change the virtual switch to "Internal network" or "Private network" if you want to use Discovery Protocol to see which switch or router your device is connected to. You can also verify this behavior by using Wireshark. + +::: + +:::warning[Administrator privileges required] + +Without administrator privileges, capturing is not available. Use the **Restart as administrator** button to relaunch the application with elevated rights. + +::: + +![Discovery Protocol](../img/discovery-protocol.png) + +### Toolbar + +| Button | Description | +|--------|-------------| +| **Export...** | Exports the information to a CSV, XML, or JSON file | + +### Context menu + +| Action | Description | +|--------|-------------| +| **Copy** | Copies the selected information to the clipboard | + +### Keyboard shortcuts + +| Key | Action | +|-----|--------| +| `F5` / `Enter` | Start capturing | diff --git a/Website/docs/application/dns-lookup.md b/Website/docs/application/dns-lookup.md new file mode 100644 index 0000000000..c6a4a17461 --- /dev/null +++ b/Website/docs/application/dns-lookup.md @@ -0,0 +1,199 @@ +--- +sidebar_position: 7 +description: "Query DNS servers for A, AAAA, CNAME, MX, NS, PTR, and other record types. NETworkManager DNS Lookup supports custom and predefined DNS server profiles." +keywords: + [ + NETworkManager, + DNS lookup, + DNS query, + DNS records, + name resolution, + MX record, + A record, + DNS tool, + ] +--- + +# DNS Lookup + +With the **DNS Lookup** you can query DNS servers for various resource records. + +:::info + +DNS (Domain Name System) is a hierarchical naming system for computers, services, and other resources connected to the internet or a private network. It translates human-readable hostnames into IP addresses and supports various record types such as A (IPv4), AAAA (IPv6), MX (mail), CNAME (alias), NS (name server), and PTR (reverse lookup). + +::: + +![DNS Lookup](../img/dns-lookup.png) + +### Example inputs + +| Host | Type | Description | +| ---------------------------- | ------- | -------------------------------------------------------------------- | +| `server-01.borntoberoot.net` | `A` | To get the IPv4 address of the hostname. | +| `server-01.borntoberoot.net` | `AAAA` | To get the IPv6 address of the hostname. | +| `server.borntoberoot.net` | `CNAME` | To get the canonical name of the hostname. | +| `borntoberoot.net` | `MX` | To get the mail exchange servers for the domain. | +| `borntoberoot.net` | `NS` | To get the name servers for the domain. | +| `10.0.0.1` | `PTR` | To get the hostname associated with the IP address (reverse lookup). | + +| DNS server | Description | +| ---------------------- | -------------------------------------------------------------------------- | +| `[Windows DNS]` | Uses the DNS server configured in Windows. | +| `Cloudflare` (profile) | Uses Cloudflare's public DNS servers from a predefined profile. | +| `1.1.1.1:53` (input) | Uses the custom DNS server `1.1.1.1` on port `53` from the input directly. | +| `ns3.inwx.eu` (input) | Uses the custom DNS server `ns3.inwx.eu` from the input directly. | + +:::note + +Multiple inputs (host, DNS server) can be combined with a semicolon (`;`). + +Example: `server-01.borntoberoot.net; 10.0.0.1` + +::: + +The DNS server can be selected from a list of configured servers or you can enter a custom DNS server in the format `|:` (`` is optional, to use a custom port with IPv6 enclose the address in square brackets: `[]:53`). + +### Context menu + +| Action | Description | +| ------------- | ------------------------------------------------ | +| **Copy** | Copies the selected information to the clipboard | +| **Export...** | Exports the selected or all results to a file | + +## Profile + +### Inherit host from general + +Inherit the host from the general settings. + +**Type:** `Boolean` + +**Default:** `Enabled` + +:::note + +If this option is enabled, the [Host](#host) is overwritten by the host from the general settings and the [Host](#host) is disabled. + +::: + +### Host + +Hostname or IP address (or any other resource record) to query. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** + +- `server-01.borntoberoot.net` (`A` record) +- `1.1.1.1` (`PTR` record) + +## Settings + +### DNS server + +List of DNS server profiles. A profile can contain one or more DNS servers with IP address and port. + +**Type:** `List` + +**Default:** + +| Name | Server 1 | Server 2 | +| ----------------- | ----------------- | ----------------- | +| Cloudflare | `1.1.1.1:53` | `1.0.0.1:53` | +| DNS.Watch | `84.200.69.80:53` | `84.200.70.40:53` | +| Google Public DNS | `8.8.8.8:53` | `8.8.4.4:53` | +| Level3 | `209.244.0.3:53` | `209.244.0.4:53` | +| Quad9 | `9.9.9.9` | `149.112.112.112` | +| Verisign | `64.6.64.6:53` | `64.6.65.6:53` | + +:::note + +Right-click on a selected DNS server to `edit` or `delete` it. + +You can also use the Hotkeys `F2` (`edit`) or `Del` (`delete`) on a selected DNS server. + +::: + +### Add DNS suffix (primary) to hostname + +Add the primary DNS suffix to the hostname. + +**Type:** `Boolean` + +**Default:** `Enabled` + +### Use custom DNS suffix + +Add a custom DNS suffix to the hostname. + +**Type:** `Boolean | String` + +**Default:** `Disabled | Empty` + +**Example:** `Enabled | borntoberoot.net` + +### Recursion + +Use recursion for the DNS query. + +**Type:** `Boolean` + +**Default:** `Enabled` + +### Use cache + +Use the cache for the DNS query. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Query class + +DNS class to use for the query. + +**Type:** `String` + +**Default:** `IN` + +**Possible values:** + +- `CS` +- `CH` +- `HS` +- `IN` + +### Show only most common query types + +Only show the most common query types (`A`, `AAAA`, `ANY`, `CNAME`, `DNSKEY`, `MX`, `NS`, `PTR`, `SOA`, `SRV` and `TXT`) in the dropdown menu in the view. Otherwise all available query types are shown. + +**Type:** `Boolean` + +**Default:** `Enabled` + +### Use only TCP + +Only use TCP for the DNS query. DNS uses UDP by default. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Retries + +Number of retries for the DNS query after which the query is considered lost. + +**Type:** `Integer` [Min `1`, Max `10`] + +**Default:** `3` + +### Timeout (s) + +Timeout in seconds for the DNS query, after which the query is considered lost. + +**Type:** `Integer` [Min `1`, Max `15`] + +**Default:** `2` diff --git a/Website/docs/application/firewall.md b/Website/docs/application/firewall.md new file mode 100644 index 0000000000..505c6cc6ec --- /dev/null +++ b/Website/docs/application/firewall.md @@ -0,0 +1,296 @@ +--- +sidebar_position: 17 +description: "Manage Windows Firewall rules with NETworkManager. Add, edit, enable, disable, or delete inbound and outbound rules using a user-friendly interface." +keywords: [NETworkManager, Windows Firewall, firewall rules, inbound, outbound, network security, firewall management] +--- + +# Firewall + +The **Firewall** allows you to view, add, edit, enable, disable, or delete Windows Firewall rules managed by NETworkManager. Rules are identified by a `NETworkManager_` prefix in their display name so that only rules created through NETworkManager are shown in this view. + +:::info + +Windows Firewall (Windows Defender Firewall) is a built-in host-based firewall included with all versions of Windows. It filters inbound and outbound network traffic based on rules that define the protocol, port, address, program, and action (allow or block). + +::: + +:::warning[Administrator privileges required] + +Without administrator privileges, the view is read-only. Use the **Restart as administrator** button to relaunch the application with elevated rights. + +::: + +![Firewall](../img/firewall.png) + +### Toolbar + +| Button | Description | +|--------|-------------| +| **Add rule...** | Opens a dialog to create a new firewall rule | +| **Windows Firewall Settings** | Opens the Windows Firewall management console (`WF.msc`) | + +### Context menu + +| Action | Description | +|--------|-------------| +| **Enable** | Enables the selected rule | +| **Disable** | Disables the selected rule | +| **Edit** | Opens the edit dialog for the selected rule | +| **Delete** | Removes the selected rule | +| **Copy** | Copies the rule information to the clipboard | +| **Export** | Exports the rule to a file | + +### Keyboard shortcuts + +| Key | Action | +|-----|--------| +| `F5` | Refresh | +| `F2` | Edit selected rule | +| `Del` | Delete selected rule | + +## Add rule + +The **Add rule** dialog is opened by clicking the **Add rule...** button below the rule list. The same dialog (with the values pre-filled) is used to **edit** an existing rule. + +![Add rule](../img/firewall-rule.png) + +The display name of every rule created with NETworkManager is automatically prefixed with `NETworkManager_` so it can be picked up by NETworkManager on the next refresh. The prefix is hidden in the user interface. + +### Name + +Display name of the firewall rule. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `Webserver (HTTP/HTTPS)` + +:::note + +The name is required and must not be empty. Internally the rule is stored with the prefix `NETworkManager_` (e.g. `NETworkManager_Webserver (HTTP/HTTPS)`). + +::: + +### Enabled + +Whether the rule is active right after creation. + +**Type:** `Boolean` + +**Default:** `Enabled` + +### Description + +Optional description of the rule. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `Allow incoming web traffic` + +### Direction + +Traffic direction the rule applies to. + +**Type:** `NETworkManager.Models.Firewall.FirewallRuleDirection` + +**Default:** `Inbound` + +**Possible values:** + +- `Inbound` (Traffic coming into the local computer.) +- `Outbound` (Traffic leaving the local computer.) + +### Action + +Action that is performed when a packet matches the rule. + +**Type:** `NETworkManager.Models.Firewall.FirewallRuleAction` + +**Default:** `Allow` + +**Possible values:** + +- `Allow` (Permit matching traffic.) +- `Block` (Drop matching traffic.) + +### Protocol + +Network protocol the rule applies to. + +**Type:** `NETworkManager.Models.Firewall.FirewallProtocol` + +**Default:** `Any` + +**Possible values:** + +- `Any` +- `TCP` +- `UDP` +- `ICMPv4` +- `ICMPv6` +- `GRE` +- `L2TP` + +:::note + +[Local ports](#local-ports) and [Remote ports](#remote-ports) are only available when the protocol is set to `TCP` or `UDP`. + +::: + +### Local ports + +One or more local ports or port ranges the rule applies to. Multiple entries are separated by `;`. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** + +- `80` +- `80; 443` +- `8080-8090` +- `27015-27030; 27036` + +:::note + +Only available if [Protocol](#protocol) is set to `TCP` or `UDP`. + +An empty value means **Any** port. + +::: + +### Remote ports + +One or more remote ports or port ranges the rule applies to. Multiple entries are separated by `;`. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** + +- `53` +- `80; 443` +- `49152-65535` + +:::note + +Only available if [Protocol](#protocol) is set to `TCP` or `UDP`. + +An empty value means **Any** port. + +::: + +### Local addresses + +One or more local addresses the rule applies to. Multiple entries are separated by `;`. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** + +- `192.168.1.10` +- `fe80::1` +- `192.168.1.0/24` +- `10.0.0.0/255.0.0.0` +- `192.168.1.10-192.168.1.50` +- `LocalSubnet; 192.168.10.0/24` + +:::note + +An empty value means **Any** address. + +The following formats are accepted: + +- Single IPv4 / IPv6 address (e.g. `1.2.3.4`, `fe80::1`) +- IPv4 / IPv6 subnet by prefix length (e.g. `1.2.3.0/24`, `fe80::/48`) +- IPv4 subnet by subnet mask (e.g. `10.0.0.0/255.0.0.0`) +- IPv4 / IPv6 range (e.g. `1.2.3.4-1.2.3.10`, `fe80::1-fe80::9`) +- Keyword: `Any`, `LocalSubnet`, `DNS`, `DHCP`, `WINS`, `DefaultGateway`, `Internet`, `Intranet`, `IntranetRemoteAccess`, `PlayToDevice`, `CaptivePortal`. Keywords can be restricted to IPv4 or IPv6 by appending `4` or `6` (e.g. `LocalSubnet4`, `Intranet6`). + +According to Microsoft, the only keyword officially supported by `LocalAddress` is `Any`. The other keywords are intended for use with [Remote addresses](#remote-addresses). + +::: + +### Remote addresses + +One or more remote addresses the rule applies to. Multiple entries are separated by `;`. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** + +- `8.8.8.8` +- `10.0.0.0/8` +- `203.0.113.10-203.0.113.50` +- `DNS` +- `Internet; CaptivePortal` + +:::note + +An empty value means **Any** address. + +The same formats as [Local addresses](#local-addresses) are accepted (single address, subnet, range, or keyword). + +::: + +### Program + +Full path to an executable the rule applies to. When set, the rule only matches traffic to or from that program. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `C:\Program Files\GameServer\server.exe` + +:::note + +If a path is provided, the file must exist on the local computer. + +An empty value means **Any** program. + +::: + +### Interface type + +Network interface type the rule applies to. + +**Type:** `NETworkManager.Models.Firewall.FirewallInterfaceType` + +**Default:** `Any` + +**Possible values:** + +- `Any` +- `Wired` +- `Wireless` +- `RemoteAccess` + +### Network profiles + +Network profiles the rule applies to. At least one profile must be selected. + +**Type:** `Boolean[]` (Domain / Private / Public) + +**Default:** `Domain`, `Private`, `Public` (all enabled) + +**Possible values:** + +- `Domain` (Networks at a workplace that are joined to a domain.) +- `Private` (Networks at home or work where you trust the people and devices on the network.) +- `Public` (Networks in public places such as airports or coffee shops.) + +:::note + +The last enabled profile cannot be unchecked — at least one profile must remain selected. + +::: diff --git a/Website/docs/application/hosts-file-editor.md b/Website/docs/application/hosts-file-editor.md new file mode 100644 index 0000000000..32f9cf8b18 --- /dev/null +++ b/Website/docs/application/hosts-file-editor.md @@ -0,0 +1,124 @@ +--- +sidebar_position: 16 +description: "View, add, edit, enable, disable, or remove entries in the Windows hosts file. Features automatic daily backups." +keywords: [NETworkManager, hosts file editor, Windows hosts file, DNS override, hosts file management, edit hosts file] +--- + +# Hosts File Editor + +The **Hosts File Editor** allows you to view, add, edit, enable, disable, or remove entries in the local computer's `hosts` file. + +:::info + +The hosts file is a plain text file that maps hostnames to IP addresses and is checked by the operating system before querying DNS servers. It's commonly used to override DNS settings for testing websites, redirecting domains, or blocking access to certain sites. On Windows, the file is located at `C:\Windows\System32\drivers\etc\hosts` and requires administrator privileges to edit. + +Each line in the hosts file typically contains an IP address followed by one or more hostnames, separated by spaces or tabs. Lines starting with `#` are comments and ignored by the system. + +Example of a hosts file entry: + +```plain +10.8.0.10 example.borntoberoot.net # Test server not reachable via DNS +``` + +::: + +:::warning[Administrator privileges required] + +Without administrator privileges, the view is read-only. Use the **Restart as administrator** button to relaunch the application with elevated rights. + +::: + +![Hosts File Editor](../img/hosts-file-editor.png) + +:::note + +The application automatically creates a daily backup of the `hosts` file, retaining up to 5 backups in the same directory (Syntax: `hosts_backup_NETworkManager_YYYYMMDD`). + +::: + +### Toolbar + +| Button | Description | +|--------|-------------| +| **Add entry...** | Opens a dialog to add an entry to the hosts file | + +### Context menu + +| Action | Description | +|--------|-------------| +| **Enable** | Enables the selected entry | +| **Disable** | Disables the selected entry | +| **Edit** | Opens the edit dialog for the selected entry | +| **Delete** | Removes the selected entry | +| **Copy** | Copies the entry information to the clipboard | +| **Export** | Exports the entry to a file | + +### Keyboard shortcuts + +| Key | Action | +|-----|--------| +| `F5` | Refresh | +| `F2` | Edit selected entry | +| `Del` | Delete selected entry | + +## Add entry + +The **Add entry** dialog is opened by clicking the **Add entry...** button below the entry list. The same dialog (with the values pre-filled) is used to **edit** an existing entry. + +![Add entry](../img/hosts-file-editor-entry.png) + +### Enabled + +Whether the entry is active right after creation. A disabled entry is written to the `hosts` file as a comment (prefixed with `#`) and is ignored by the operating system. + +**Type:** `Boolean` + +**Default:** `Enabled` + +### IP address + +IP address the hostname(s) should resolve to. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** + +- `10.0.0.10` +- `fe80::1` + +:::note + +Both IPv4 and IPv6 addresses are accepted. The field is required and validated for a correct address format. + +::: + +### Hostname + +One or more hostnames that should resolve to the [IP address](#ip-address). Multiple hostnames are separated by a space — matching the native `hosts` file format. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** + +- `example.borntoberoot.net` +- `example.borntoberoot.net www.example.borntoberoot.net` + +:::note + +Each hostname must conform to the standard hostname / domain syntax. The field is required. + +::: + +### Comment + +Optional comment associated with the entry. The comment is written after the hostname(s) on the same line, separated by a `#`. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `Test server not reachable via DNS` diff --git a/Website/docs/application/ip-geolocation.md b/Website/docs/application/ip-geolocation.md new file mode 100644 index 0000000000..7f3f7dc416 --- /dev/null +++ b/Website/docs/application/ip-geolocation.md @@ -0,0 +1,71 @@ +--- +sidebar_position: 21 +description: "Retrieve geolocation data for public IP addresses and domain names using NETworkManager. Shows country, city, ISP, and other network information via ip-api.com." +keywords: [NETworkManager, IP geolocation, IP location, GeoIP, IP lookup, IP address location, geolocation tool] +--- + +# IP Geolocation + +With **IP Geolocation** you can retrieve geolocation information for a fully qualified domain name (FQDN) or a public IP address. + +:::info + +IP geolocation data is provided by [ip-api.com](https://ip-api.com/) and the API endpoint `http://ip-api.com/json/` is queried when the information is requested. + +::: + +:::note + +The free API endpoint is limited to 45 requests per minute, supports only the `HTTP` protocol and is available for non-commercial use only. + +::: + +![IPGeolocation](../img/ip-geolocation.png) + +### Example inputs + +| Input | Description | +|-------|-------------| +| `borntoberoot.net` | Fully qualified domain name (FQDN) | +| `1.1.1.1` | Public IP address | + +### Toolbar + +| Button | Description | +|--------|-------------| +| **Export...** | Exports the information to a CSV, XML, or JSON file | + +### Context menu + +| Action | Description | +|--------|-------------| +| **Copy** | Copies the selected information to the clipboard | + +## Profile + +### Inherit host from general + +Inherit the host from the general settings. + +**Type:** `Boolean` + +**Default:** `Enabled` + +:::note + +If this option is enabled, the [host](#host) is overwritten by the host from the general settings and the [host](#host) is disabled. + +::: + +### Host + +Host (FQDN or public IP address) to query for IP geolocation information. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** + +- `borntoberoot.net` +- `1.1.1.1` diff --git a/Website/docs/application/ip-scanner.md b/Website/docs/application/ip-scanner.md new file mode 100644 index 0000000000..25a5f33877 --- /dev/null +++ b/Website/docs/application/ip-scanner.md @@ -0,0 +1,274 @@ +--- +sidebar_position: 3 +description: "Scan for active devices in your network using ICMP and TCP port checks. NETworkManager IP Scanner supports IP ranges, CIDR subnets, and hostnames." +keywords: + [ + NETworkManager, + IP scanner, + network scanner, + ping sweep, + host discovery, + ICMP scanner, + subnet scan, + ] +--- + +# IP Scanner + +With the **IP Scanner** you can scan for active devices based on the hostname or in IP ranges that are reachable via ICMP or have a common TCP port open. + +![IP Scanner](../img/ip-scanner.png) + +### Example inputs + +| Host | Description | +| -------------------------------- | -------------------------------------------------------------------------------------------- | +| `10.0.0.1` | Single IP address (`10.0.0.1`) | +| `10.0.0.100 - 10.0.0.199` | All IP addresses in a given range (`10.0.0.100`, `10.0.0.101`, ..., `10.0.0.199`) | +| `10.0.0.0/23` | All IP addresses in a subnet (`10.0.0.0`, ..., `10.0.1.255`) | +| `10.0.0.0/255.255.254.0` | All IP addresses in a subnet (`10.0.0.0`, ..., `10.0.1.255`) | +| `10.0.[0-9,20].[1-2]` | Multiple IP addresses like (`10.0.0.1`, `10.0.0.2`, `10.0.1.1`, ...,`10.0.9.2`, `10.0.20.1`) | +| `borntoberoot.net` | Single IP address resolved from a host (`10.0.0.1`) | +| `borntoberoot.net/24` | All IP addresses in a subnet resolved from a host (`10.0.0.0`, ..., `10.0.0.255`) | +| `borntoberoot.net/255.255.255.0` | All IP addresses in a subnet resolved from a host (`10.0.0.0`, ..., `10.0.0.255`) | + +:::note + +Multiple inputs can be combined with a semicolon (`;`). + +Example: `10.0.0.0/24; 10.0.[10-20]1` + +::: + +### Toolbar + +| Button | Description | +| ----------------------- | ---------------------------------------------------------------------------------------------------------------------- | +| **Detect local subnet** | Populates the host field with the IP address and subnet mask of the current network interface to scan the local subnet | + +:::note + +The local IP address (and subnet mask) is determined by trying to route to a public IP address. If this fails (e.g. +no network connection), NETworkManager iterates over active network adapters and selects the first valid IPv4 address, +with link-local addresses (`169.254.x.x`) given lower priority. + +::: + +### Context menu + +Right-clicking a result allows forwarding device information to another tool (e.g. [Port Scanner](./port-scanner), Remote Desktop), creating a new profile, or executing a [custom command](#custom-commands). + +| Action | Description | +| ------------- | ------------------------------------------------ | +| **Copy** | Copies the selected information to the clipboard | +| **Export...** | Exports the selected or all results to a file | + +## Profile + +### Inherit host from general + +Inherit the host from the general settings. + +**Type:** `Boolean` + +**Default:** `Enabled` + +:::note + +If this option is enabled, the [Host](#host) is overwritten by the host from the general settings and the [Host](#host) is disabled. + +::: + +### Host + +Hostname or IP range to scan for active devices. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** + +- `10.0.0.0/24; 10.0.[10-20].1` +- `server-01.borntoberoot.net` + +:::note + +See also the [IP Scanner](./ip-scanner) example inputs for more information about the supported host formats. + +::: + +## Settings + +### Show unreachable IP addresses and ports + +Show the scan result for all IP addresses and ports including the ones that are not active. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Attempts + +Number of times an ICMP request is retried for each IP address if the request has timed out. + +**Type:** `Integer` [Min `1`, Max `10`] + +**Default:** `2` + +### Timeout (ms) + +Timeout in milliseconds for each ICMP request, after which the packet is considered lost. + +**Type:** `Integer` [Min `100`, Max `15000`] + +**Default:** `4000` + +### Buffer + +Size of the buffer for each ICMP request in bytes. + +**Type:** `Integer` [Min `1`, Max `65535`] + +**Default:** `32` + +### Resolve hostname + +Resolve the hostname (PTR) for each IP address. + +**Type:** `Boolean` + +**Default:** `Enabled` + +### Scan ports + +Scan each IP address for open TCP ports. + +**Type:** `Boolean` + +**Default:** `Enabled` + +### Ports + +List of TCP ports to scan for each IP address. + +**Type:** `String` + +**Default:** `22; 53; 80; 139; 389; 636; 443; 445; 3389` + +:::note + +Multiple ports and port ranges can be combined with a semicolon (e.g. `22; 80; 443`). Only common and known ports should be scanned to check if a host is reachable. Use the [Port Scanner](./port-scanner) for a detailed port scan. + +::: + +### Timeout (ms) + +Timeout in milliseconds after which a port is considered closed / timed out. + +**Type:** `Integer` [Min `100`, Max `15000`] + +**Default:** `4000` + +### Scan for NetBIOS + +Scan each IP address for NetBIOS information. + +**Type:** `Boolean` + +**Default:** `Enabled` + +### Timeout (ms) + +Timeout in milliseconds after which a NetBIOS request is considered lost. + +**Type:** `Integer` [Min `100`, Max `15000`] + +**Default:** `4000` + +### Resolve MAC address and vendor + +Resolve the MAC address and vendor for each IP address. + +**Type:** `Boolean` + +**Default:** `Enabled` + +:::note + +The MAC address is resolved via ARP (IPv4) or NDP (IPv6) from the neighbor cache. If no entry is found there, NetBIOS is used as a fallback. Because ARP and NDP are link-layer protocols, the device must be in the same subnet as the local machine. + +::: + +### Custom commands + +Custom commands that can be executed with a right click on the selected result. + +**Type:** `List` + +**Default:** + +| Name | File path | Arguments | +| --------------------- | -------------- | ------------------------------------------------- | +| Edge | `cmd.exe` | `/c start microsoft-edge:http://{{IPAddress}}/` | +| Edge (https) | `cmd.exe` | `/c start microsoft-edge:https://{{IPAddress}}/` | +| Windows Explorer (c$) | `explorer.exe` | `\\{{IPAddress}}\c$` | + +In the arguments you can use the following placeholders: + +| Placeholder | Description | +| ---------------- | ------------ | +| `{{IPAddress}}` | IP address | +| `{{Hostname}}` | Hostname | + +:::note + +Right-click on a selected custom command to `edit` or `delete` it. + +You can also use the Hotkeys `F2` (`edit`) or `Del` (`delete`) on a selected custom command. + +::: + +### Max. concurrent host threads + +Maximum number of threads used to scan for active hosts (1 thread = 1 host / IP address). + +**Type:** `Integer` [Min `1`, Max `512`] + +**Default:** `256` + +:::warning + +Too many simultaneous requests may be blocked by a firewall. You can reduce the number of threads to avoid this, but this will increase the scan time. + +Too many threads can also cause performance problems on the device. + +::: + +:::note + +This setting only changes the maximum number of concurrently executed threads per host scan. See also the [General](../settings/general#threadpool-additional-min-threads) settings to configure the application-wide thread pool. + +::: + +### Max. concurrent port threads + +Maximum number of threads that are used to scan for open ports for each host (IP address). + +**Type:** `Integer` [Min `1`, Max `10`] + +**Default:** `5` + +:::warning + +Too many simultaneous requests may be blocked by a firewall. You can reduce the number of threads to avoid this, but this will increase the scan time. + +Too many threads can also cause performance problems on the device. + +::: + +:::note + +This setting only changes the maximum number of concurrently executed threads per port scan. See also the [General](../settings/general#threadpool-additional-min-threads) settings to configure the application-wide thread pool. + +::: diff --git a/Website/docs/application/listeners.md b/Website/docs/application/listeners.md new file mode 100644 index 0000000000..71381c134f --- /dev/null +++ b/Website/docs/application/listeners.md @@ -0,0 +1,30 @@ +--- +sidebar_position: 26 +description: "View all active network listeners with IP addresses and ports on your local machine using NETworkManager. Identify which processes are listening for connections." +keywords: [NETworkManager, listeners, listening ports, open ports, network listeners, port monitoring] +--- + +# Listeners + +The **Listeners** view shows all active network listeners with their bound IP addresses and ports that are currently running on your computer. + +:::info + +A network listener is a socket bound to a specific local IP address and port that waits to receive incoming data or connections. TCP listeners accept incoming connections; UDP listeners receive datagrams. Applications use listeners to offer services over a network. + +::: + +![Listeners](../img/listeners.png) + +### Context menu + +| Action | Description | +|--------|-------------| +| **Copy** | Copies the selected information to the clipboard | +| **Export...** | Exports the selected or all results to a file | + +### Keyboard shortcuts + +| Key | Action | +|-----|--------| +| `F5` | Refresh | diff --git a/Website/docs/application/lookup.md b/Website/docs/application/lookup.md new file mode 100644 index 0000000000..0a7e536bcd --- /dev/null +++ b/Website/docs/application/lookup.md @@ -0,0 +1,47 @@ +--- +sidebar_position: 24 +description: "Search OUI manufacturer information from MAC addresses and look up port numbers with associated services and protocols using NETworkManager Lookup." +keywords: [NETworkManager, OUI lookup, MAC address lookup, port lookup, manufacturer lookup, service lookup] +--- + +# Lookup + +With **Lookup** you can search for information about [OUIs](#oui) (Organizationally Unique Identifiers) and [ports](#port). + +## OUI + +On the **OUI** tab, you can search for the manufacturer of a network interface card (NIC) by entering the first 24 bits of the MAC address. You can also search by vendor name to get all registered MAC addresses of the vendor. + +:::info + +The OUI (Organizationally Unique Identifier) is a 24-bit number assigned by the IEEE Registration Authority to identify network interface card manufacturers. It forms the first 24 bits of a MAC address. + +::: + +![Lookup - OUI](../img/lookup--oui.png) + +### Context menu + +| Action | Description | +|--------|-------------| +| **Copy** | Copies the selected information to the clipboard | +| **Export...** | Exports the selected or all results to a file | + +## Port + +On the **Port** tab, you can search for a port number to get information about the service and the protocol used by the port. You can also search by service name to get all registered port numbers of the service. + +:::info + +A port is a logical construct that identifies a specific process to which network traffic is to be forwarded. Ports are identified by a 16-bit number, known as a port number. Port numbers range from 0 to 65535, but only port numbers 0 to 1023 are designated as well-known ports. Well-known ports are those registered with IANA for common services such as HTTP (port 80), HTTPS (port 443), FTP (port 21), and SSH (port 22). + +::: + +![Lookup - Port](../img/lookup--port.png) + +### Context menu + +| Action | Description | +|--------|-------------| +| **Copy** | Copies the selected information to the clipboard | +| **Export...** | Exports the selected or all results to a file | diff --git a/Website/docs/application/neighbor-table.md b/Website/docs/application/neighbor-table.md new file mode 100644 index 0000000000..c6107b843d --- /dev/null +++ b/Website/docs/application/neighbor-table.md @@ -0,0 +1,125 @@ +--- +sidebar_position: 27 +description: "View and manage IP-to-MAC address mappings for both IPv4 (ARP) and IPv6 (NDP) with NETworkManager. Add or delete neighbor entries, filter by state, and inspect interface assignments." +keywords: [NETworkManager, neighbor table, ARP table, NDP, IPv4, IPv6, ARP cache, NDP cache, IP to MAC, MAC address, address resolution, neighbor discovery] +--- + +# Neighbor Table + +The **Neighbor Table** shows the IP-to-MAC address mappings that the operating system has cached for both IPv4 (ARP) and IPv6 (NDP). It lists all devices on the local network with which the computer has recently communicated. + +:::info + +**IPv4 – ARP (Address Resolution Protocol)** is a layer-2 protocol that maps IPv4 addresses to MAC addresses. When a device needs to send data to an IPv4 address, it first checks the ARP cache. If no entry is found it broadcasts an ARP request; the target replies with its MAC address and the entry is added to the cache. + +**IPv6 – NDP (Neighbor Discovery Protocol)** fulfills the same purpose for IPv6. Instead of broadcasts, NDP uses ICMPv6 Neighbor Solicitation and Advertisement messages sent to a solicited-node multicast address. + +Both protocols are susceptible to spoofing/poisoning attacks that can manipulate the cached mappings, which can lead to man-in-the-middle scenarios. + +::: + +:::warning[Administrator privileges required] + +Without administrator privileges, the view is read-only. Use the **Restart as administrator** button to relaunch the application with elevated rights. + +::: + +![Neighbor Table](../img/neighbor-table.png) + +### Toolbar + +| Button | Description | +|--------|-------------| +| **Add entry...** | Opens a dialog to add a permanent static neighbor entry | +| **Delete table** | Removes all dynamic entries (permanent entries are preserved) | + +### Context menu + +| Action | Description | +|--------|-------------| +| **Copy** | Copies the selected information to the clipboard | +| **Export...** | Exports the selected or all results to a file | +| **Delete** | Removes the selected entry | + +### Keyboard shortcuts + +| Key | Action | +|-----|--------| +| `F5` | Refresh | + +## Columns + +| Column | Description | +| --- | --- | +| **IP Address** | IPv4 or IPv6 address of the cached neighbor. | +| **Interface** | Human-readable name of the network interface the entry belongs to (e.g. `Ethernet`, `Wi-Fi`). | +| **MAC Address** | Link-layer (MAC) address associated with the IP address. | +| **State** | Current reachability state of the entry (see [States](#states) below). | +| **Multicast** | Indicates whether the IP address is a multicast address. | + +## States + +| State | Description | +| --- | --- | +| `Unreachable` | The neighbor is no longer reachable and the entry is about to be removed. | +| `Incomplete` | An ARP/NDP request has been sent but no reply has been received yet. | +| `Probe` | The system is actively probing the neighbor to verify reachability. | +| `Delay` | Waiting for an upper-layer protocol to confirm reachability before sending a probe. | +| `Stale` | The entry exists but has not been recently confirmed; will be verified on next use. | +| `Reachable` | The neighbor has been confirmed reachable within the last reachability timeout. | +| `Permanent` | A static entry that was manually added and will not expire. | + +## Add entry + +The **Add entry** dialog opens by clicking the **Add entry...** button. It creates a new permanent static neighbor entry that maps an IP address to a MAC address. + +![Add entry](../img/neighbor-table-entry.png) + +### IP address + +IPv4 or IPv6 address of the device. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `10.0.0.10`, `2001:db8::1` + +:::note + +Both IPv4 and IPv6 addresses are accepted. The field is required and validated for the correct address format. + +::: + +### MAC address + +MAC address of the device the [IP address](#ip-address) should be mapped to. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** + +- `00:1A:2B:3C:4D:5E` +- `00-1A-2B-3C-4D-5E` + +:::note + +The field is required and validated for a correct MAC address format. + +::: + +### Interface + +The network interface on which the entry is created. + +**Type:** `Dropdown` + +**Default:** Last used interface, or the first available interface. + +:::note + +Adding a static entry requires administrator privileges. Internally, NETworkManager uses `New-NetNeighbor` (PowerShell `NetTCPIP` module) to create the entry with state `Permanent`. + +::: diff --git a/Website/docs/application/network-interface.md b/Website/docs/application/network-interface.md new file mode 100644 index 0000000000..d1ed9e4b5d --- /dev/null +++ b/Website/docs/application/network-interface.md @@ -0,0 +1,248 @@ +--- +sidebar_position: 1 +description: "View detailed information about all network adapters, monitor bandwidth usage, and configure IP addresses and DNS servers with NETworkManager." +keywords: + [ + NETworkManager, + network interface, + network adapter, + bandwidth monitor, + IP configuration, + DNS configuration, + network settings, + ] +--- + +# Network Interface + +The **Network Interface** shows all network adapters on the computer with their most important information, such as IP addresses and DNS servers. It also lets you monitor bandwidth usage for connected adapters and configure settings such as IP addresses and DNS servers using profiles. + +## Information + +On the **Information** tab, you can see all the important details of the selected network adapter such as the configured IP addresses, DNS servers, MAC address, and more. If information such as IPv6 configuration is not available, it is hidden in the view. + +![Network Interface - Information](../img/network-interface--information.png) + +### Toolbar + +The following buttons are available at the bottom left: + +| Button | Description | +| ---------------------- | ------------------------------------------------------------------------------------------------------------ | +| **Network connections...** | Opens the `Control Panel > Network and Internet > Network Connections` window | +| **IP Scanner** | Opens the [IP Scanner](./ip-scanner) with the IPv4 address and subnet mask of the selected adapter | +| **Export...** | Exports the information to a CSV, XML, or JSON file | + +### Context menu + +| Action | Description | +| -------- | ------------------------------------------------ | +| **Copy** | Copies the selected information to the clipboard | + +## Bandwidth + +On the **Bandwidth** tab, you can monitor the currently used bandwidth of the selected network adapter. + +The chart plots the download and upload speed over time. By default it displays the last 60 seconds (see [Chart time (seconds)](#chart-time-seconds)) and scrolls automatically as new data arrives (**live mode**). + +Speeds are shown in bit/s and automatically scale to KBit/s, MBit/s, or GBit/s depending on the bandwidth in use. Hover over a value to see the equivalent in byte/s. + +Below the chart, additional statistics are displayed: the current download and upload speed, the total amount received and sent by the adapter, when the measurement started and how long it has been running, and the amount downloaded and uploaded since the measurement started. Hover over a byte value to see the exact number of bytes. + +![Network Interface - Bandwidth](../img/network-interface--bandwidth.png) + +### Chart + +You can interact with the chart to inspect past data: + +| Action | Description | +|--------|-------------| +| **Mouse wheel** | Zoom in and out on the time axis | +| **Left mouse button + drag** | Pan the chart left and right | +| **Right mouse button + drag** | Zoom into the selected section | + +When you zoom or pan, the chart leaves live mode and stops scrolling. A **Live** button then appears in the top-right corner of the chart — click it to return to live mode and resume auto-scrolling. + +:::note + +If you switch to another tool, monitoring stops and the statistics are reset when you switch back. + +::: + +## Configure + +On the **Configure** tab, you can change the configuration of the selected network adapter. In order to change the settings, the network adapter must be connected. + +The options you can set correspond to the network adapter properties `Internetprotokoll, Version 4 (TCP/IPv4) Properties` in the `Control Panel > Network and Internet > Network Connections`. These are explained in the [profiles section](#profile). + +![Network Interface - Configure](../img/network-interface--configure.png) + +:::note + +All actions on this tab require the application to be running with **administrator privileges**. If the app is not elevated, a banner is shown at the bottom with a **Restart as Administrator** button. + +::: + +### Toolbar + +| Button | Description | +| ------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | +| **Flush DNS cache** | Flushes the local DNS resolver cache (`ipconfig /flushdns`) | +| **Release & Renew > IPv4 > Release & Renew** | Releases and renews the IPv4 addresses obtained via DHCP for the selected adapter (`ipconfig /release && ipconfig /renew `) | +| **Release & Renew > IPv4 > Release** | Releases the IPv4 addresses obtained via DHCP for the selected adapter (`ipconfig /release `) | +| **Release & Renew > IPv4 > Renew** | Renews the IPv4 address via DHCP for the selected adapter (`ipconfig /renew `) | +| **Release & Renew > IPv6 > Release & Renew** | Releases and renews the IPv6 addresses obtained via DHCPv6 for the selected adapter (`ipconfig /release6 && ipconfig /renew6 `) | +| **Release & Renew > IPv6 > Release** | Releases the IPv6 addresses obtained via DHCPv6 for the selected adapter (`ipconfig /release6 `) | +| **Release & Renew > IPv6 > Renew** | Renews the IPv6 address via DHCPv6 for the selected adapter (`ipconfig /renew6 `) | +| **Additional config... > Add IPv4 address...** | Opens a dialog to add an IPv4 address with a subnet mask or CIDR to the selected adapter | +| **Additional config... > Remove IPv4 address...** | Opens a dialog to remove an IPv4 address from the selected adapter | +| **Apply** | Applies the IP and DNS configuration to the selected adapter | + +:::note + +**Add IPv4 address:** If a static IP address is added to a network adapter that is configured for DHCP, the `netsh` option `dhcpstaticipcoexistence` is also activated: + +```powershell +netsh interface ipv4 set interface interface="Ethernet" dhcpstaticipcoexistence=enabled +``` + +::: + +:::info + +The `netsh` option `dhcpstaticipcoexistence` allows the network adapter to use a static IP address and still receive DHCP options (e.g. DNS server) from the DHCP server. This is useful if you want to use a static IP address but still want to receive DNS server addresses from the DHCP server. This feature is available since Windows 10 version 1703 (Creators Update). + +::: + +:::note + +**Remove IPv4 address:** Only IPv4 addresses that are not assigned via DHCP can be removed. + +If you have previously added an additional IPv4 address to a network adapter that is configured for DHCP, the `netsh` option `dhcpstaticipcoexistence` remains active. To disable it, run the following command in an elevated PowerShell: + +```powershell +netsh interface ipv4 set interface interface="Ethernet" dhcpstaticipcoexistence=disabled +``` + +::: + +## Profile + +### Obtain an IP address automatically + +Obtain an IP address automatically from a DHCP server for the selected network adapter. + +**Type:** `Boolean` + +**Default:** `Enabled` + +:::note + +If you select this option, the [Use the following IP address](#use-the-following-ip-address) option will be disabled. + +::: + +### Use the following IP address: + +Configure a static IP address for the selected network adapter. See [IPv4 address](#ipv4-address), [Subnetmask or CIDR](#subnetmask-or-cidr) and [Default-Gateway](#default-gateway) options below for more information. + +**Type:** `Boolean` + +**Default:** `Disabled` + +:::note + +If you select this option, the [Obtain an IP address automatically](#obtain-an-ip-address-automatically) option will be disabled. + +::: + +### IPv4 address + +Static IPv4 address for the selected network adapter. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `192.168.178.20` + +### Subnetmask or CIDR + +Subnet mask or CIDR for the selected network adapter. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** + +- `/24` +- `255.255.255.0` + +### Default-Gateway + +Default gateway for the selected network adapter. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `192.168.178.1` + +### Obtain DNS server address automatically + +Obtain DNS server address automatically from a DHCP server for the selected network adapter. + +**Type:** `Boolean` + +**Default:** `Enabled` + +:::note + +If you select this option, the [Use the following DNS server addresses](#use-the-following-dns-server-addresses) option will be disabled. + +::: + +### Use the following DNS server addresses: + +Configure static DNS server addresses for the selected network adapter. See [Primary DNS server](#primary-dns-server) and [Secondary DNS server](#secondary-dns-server) options below for more information. + +**Type:** `Boolean` + +**Default:** `Disabled` + +:::note + +If you select this option, the [Obtain DNS server address automatically](#obtain-dns-server-address-automatically) option will be disabled. + +::: + +### Primary DNS server + +Primary DNS server for the selected network adapter. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `1.1.1.1` + +### Secondary DNS server + +Secondary DNS server for the selected network adapter. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `1.0.0.1` + +## Settings + +### Chart time (seconds) + +Time range in seconds displayed in the bandwidth chart. + +**Type:** `Integer` [Min `30`, Max `3600`] + +**Default:** `60` diff --git a/Website/docs/application/ping-monitor.md b/Website/docs/application/ping-monitor.md new file mode 100644 index 0000000000..a1ad0a605d --- /dev/null +++ b/Website/docs/application/ping-monitor.md @@ -0,0 +1,206 @@ +--- +sidebar_position: 5 +description: "Monitor the reachability of one or multiple hosts with continuous ICMP echo requests. NETworkManager Ping Monitor tracks uptime and latency in real time." +keywords: [NETworkManager, ping monitor, ICMP ping, host monitoring, network uptime, latency monitor, continuous ping] +--- + +# Ping Monitor + +With the **Ping Monitor** you can monitor one or multiple hosts with ICMP echo requests to determine whether each host is reachable. + +:::info + +ICMP (Internet Control Message Protocol) is a network-layer protocol used to send diagnostic and control messages. An ICMP echo request (commonly known as a ping) asks a remote host to send back an echo reply, confirming it is reachable on the network. + +::: + +![Ping Monitor](../img/ping-monitor.png) + +### Example inputs + +| Host | Description | +| -------------------------------- | ------------------------------------------------------------------------------------------ | +| `10.0.0.1` | Single IP address (`10.0.0.1`) | +| `10.0.0.100 - 10.0.0.199` | All IP addresses in a given range (`10.0.0.100`, `10.0.0.101`, ..., `10.0.0.199`) | +| `10.0.0.0/23` | All IP addresses in a subnet (`10.0.0.0`, ..., `10.0.1.255`) | +| `10.0.0.0/255.255.254.0` | All IP addresses in a subnet (`10.0.0.0`, ..., `10.0.1.255`) | +| `10.0.[0-9,20].[1-2]` | Multiple IP addresses like (`10.0.0.1`, `10.0.0.2`, `10.0.1.1`, ...,`10.0.9.2`, `10.0.20.1`) | +| `borntoberoot.net` | Single IP address resolved from a host (`10.0.0.1`) | +| `borntoberoot.net/24` | All IP addresses in a subnet resolved from a host (`10.0.0.0`, ..., `10.0.0.255`) | +| `borntoberoot.net/255.255.255.0` | All IP addresses in a subnet resolved from a host (`10.0.0.0`, ..., `10.0.0.255`) | + +:::note + +Multiple inputs can be combined with a semicolon (`;`). + +Example: `10.0.0.0/24; 10.0.[10-20]1` + +::: + +### Chart + +Each monitored host shows a latency chart over time. By default the chart displays the last 2 minutes (see [Chart time (seconds)](#chart-time-seconds)) and scrolls automatically as new results arrive (**live mode**). + +You can interact with the chart to inspect past results: + +| Action | Description | +|--------|-------------| +| **Mouse wheel** | Zoom in and out on the time axis | +| **Left mouse button + drag** | Pan the chart left and right | +| **Right mouse button + drag** | Zoom into the selected section | + +When you zoom or pan, the chart leaves live mode and stops scrolling. A **Live** button then appears in the top-right corner of the chart — click it to return to live mode and resume auto-scrolling. + +### Context menu + +Right-click a monitored host (anywhere except the chart) to open the context menu: + +| Action | Description | +|--------|-------------| +| **Export...** | Exports the results of the host to a file | + +Right-clicking an individual field (hostname, IP address, ...) instead lets you **Copy** its value to the clipboard. + +### Notifications + +When a monitored host changes its reachability state (up → down or down → up), a small notification popup can appear in the bottom-right corner of the primary screen, optionally accompanied by a system sound. + +- The popup shows a status icon (green when the host is up, red when it is down), the hostname (or the IP address as a fallback) and the current status (**Host is up** / **Host is down**). +- Multiple notifications **stack** upwards, so several hosts changing state at once are all visible. +- **Click anywhere** on a notification to bring the main window to the front. Use the **×** button to dismiss a single notification without opening the main window. +- Each notification closes automatically after a configurable [duration](#display-duration-seconds); a thin progress bar at the bottom shows the remaining time. +- To avoid noise from flapping hosts, a state change is only reported after a configurable number of consecutive successes ([Success threshold](#success-threshold)) or failures ([Failure threshold](#failure-threshold)). +- The **initial** state of a host (established when monitoring starts) never triggers a notification or sound — only later transitions do. + +:::note + +When many hosts change state at almost the same time (for example, when an uplink goes down and all hosts time out together), every host still shows its own popup, but the sound is played only once within a short interval to avoid an overlapping cacophony. + +::: + +## Profile + +### Inherit host from general + +Inherit the host from the general settings. + +**Type:** `Boolean` + +**Default:** `Enabled` + +:::note + +If this option is enabled, the [Host](#host) is overwritten by the host from the general settings and the [Host](#host) is disabled. + +::: + +### Host + +Hostname or IP address to ping. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** + +- `server-01.borntoberoot.net` +- `1.1.1.1` + +## Settings + +### Timeout (ms) + +Timeout in milliseconds for each ICMP packet, after which the packet is considered lost. + +**Type:** `Integer` [Min `100`, Max `15000`] + +**Default:** `4000` + +### Buffer + +Buffer size of the ICMP packet. + +**Type:** `Integer` [Min `1`, Max `65535`] + +**Default:** `32` + +### TTL + +Time to live of the ICMP packet. + +**Type:** `Integer` [Min `1`, Max `255`] + +**Default:** `64` + +### Don't fragment + +Don't fragment the ICMP packet. + +**Type:** `Boolean` + +**Default:** `Enabled` + +### Time (ms) to wait between each ping + +Time in milliseconds to wait between each ping. + +**Type:** `Integer` [Min `100`, Max `15000`] + +**Default:** `1000` + +### Chart time (seconds) + +Time range in seconds displayed in the latency chart. + +**Type:** `Integer` [Min `30`, Max `3600`] + +**Default:** `120` + +### Expand host view + +Expand the host view to show more information when the host is added. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Show notification popup on status change + +Show a notification popup in the bottom-right corner of the primary screen when a monitored host changes its reachability state. See [Notifications](#notifications) for details. + +**Type:** `Boolean` + +**Default:** `Enabled` + +### Play sound on status change + +Play a system sound when a monitored host changes its reachability state. This is independent of the [popup](#show-notification-popup-on-status-change) — you can enable the sound without the popup, or vice versa. + +**Type:** `Boolean` + +**Default:** `Enabled` + +### Success threshold + +Number of consecutive successful pings required before a **Host is up** notification is shown. Higher values reduce noise from flapping hosts. + +**Type:** `Integer` [Min `1`, Max `10`] + +**Default:** `1` + +### Failure threshold + +Number of consecutive failed pings (timeouts) required before a **Host is down** notification is shown. Higher values reduce noise from flapping hosts. + +**Type:** `Integer` [Min `1`, Max `10`] + +**Default:** `3` + +### Display duration (seconds) + +Time in seconds the notification popup is shown before it closes automatically. + +**Type:** `Integer` [Min `3`, Max `60`] + +**Default:** `10` diff --git a/Website/docs/application/port-scanner.md b/Website/docs/application/port-scanner.md new file mode 100644 index 0000000000..d172fa870a --- /dev/null +++ b/Website/docs/application/port-scanner.md @@ -0,0 +1,220 @@ +--- +sidebar_position: 4 +description: "Scan for open TCP ports on network hosts. NETworkManager Port Scanner supports flexible host and port range inputs for comprehensive port scanning." +keywords: + [ + NETworkManager, + port scanner, + TCP port scan, + open ports, + network security, + port checker, + port scanning tool, + ] +--- + +# Port Scanner + +With the **Port Scanner** you can scan for open TCP ports on one or multiple hosts to determine which services are running. + +:::info + +TCP (Transmission Control Protocol) is a connection-oriented transport-layer protocol. Establishing a connection requires a three-way handshake between client and server. Port scanning tests whether this handshake can be initiated on a given port, which indicates a listening service. + +::: + +![Port Scanner](../img/port-scanner.png) + +### Example inputs + +| Host | Description | +| -------------------------------- | -------------------------------------------------------------------------------------------- | +| `10.0.0.1` | Single IP address (`10.0.0.1`) | +| `10.0.0.100 - 10.0.0.199` | All IP addresses in a given range (`10.0.0.100`, `10.0.0.101`, ..., `10.0.0.199`) | +| `10.0.0.0/23` | All IP addresses in a subnet (`10.0.0.0`, ..., `10.0.1.255`) | +| `10.0.0.0/255.255.254.0` | All IP addresses in a subnet (`10.0.0.0`, ..., `10.0.1.255`) | +| `10.0.[0-9,20].[1-2]` | Multiple IP addresses like (`10.0.0.1`, `10.0.0.2`, `10.0.1.1`, ...,`10.0.9.2`, `10.0.20.1`) | +| `borntoberoot.net` | Single IP address resolved from a host (`10.0.0.1`) | +| `borntoberoot.net/24` | All IP addresses in a subnet resolved from a host (`10.0.0.0`, ..., `10.0.0.255`) | +| `borntoberoot.net/255.255.255.0` | All IP addresses in a subnet resolved from a host (`10.0.0.0`, ..., `10.0.0.255`) | + +| Port | Description | +| --------------------- | -------------------------------------------------- | +| `1-1024` | All ports in a given range (`1`, `2`, ..., `1024`) | +| `80; 443; 8080; 8443` | Multiple ports like (`80`, `443`, `8080`, `8443`) | + +:::note + +Multiple inputs can be combined with a semicolon (`;`). + +Example: `10.0.0.0/24; 10.0.[10-20]1` or `1-1024; 8080; 8443` + +::: + +### Toolbar + +| Button | Description | +| ----------------------- | ------------------------------------------------------------------------------- | +| **Select port profile** | Opens a dialog to select a pre-defined port profile to populate the ports field | + +### Context menu + +| Action | Description | +| ------------- | ------------------------------------------------ | +| **Copy** | Copies the selected information to the clipboard | +| **Export...** | Exports the selected or all results to a file | + +## Profile + +### Inherit host from general + +Inherit the host from the general settings. + +**Type:** `Boolean` + +**Default:** `Enabled` + +:::note + +If this option is enabled, the [Host](#host) is overwritten by the host from the general settings and the [Host](#host) is disabled. + +::: + +### Host + +Hostname or IP range to scan for open ports. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** + +- `server-01.borntoberoot.net` +- `1.1.1.1; 1.0.0.1` +- `10.0.0.0/24` + +:::note + +See also the [Port Scanner](./port-scanner) example inputs for more information about the supported host formats. + +::: + +### Ports + +TCP ports to scan each host for. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** + +- `1-1024` +- `80; 443; 8080; 8443` + +:::note + +See also the [Port Scanner](./port-scanner) example inputs for more information about the supported port formats. + +::: + +## Settings + +### Port profiles + +List of common TCP ports to scan for. + +**Type:** `List` + +**Default:** + +| Name | Ports | +| ----------------- | ----------------------------------- | +| DNS (via TCP) | `53` | +| NTP (via TCP) | `123` | +| Webserver | `80; 443` | +| Webserver (Other) | `80; 443; 8080; 8443` | +| Remote access | `22; 23; 3389; 5900` | +| Mailserver | `25; 110; 143; 465; 587; 993; 995` | +| Filetransfer | `20-21; 22; 989-990; 2049` | +| Database | `1433-1434; 1521; 1830; 3306; 5432` | +| SMB | `139; 445` | +| LDAP | `389; 636` | +| HTTP proxy | `3128` | + +:::note + +Right-click on a selected port profile to `edit` or `delete` it. + +You can also use the Hotkeys `F2` (`edit`) or `Del` (`delete`) on a selected port profile. + +::: + +### Show closed ports + +Show closed ports in the result list. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Timeout (ms) + +Timeout in milliseconds after which a port is considered closed / timed out. + +**Type:** `Integer` [Min `100`, Max `15000`] + +**Default:** `4000` + +### Resolve hostname + +Resolve the hostname for given IP addresses. + +**Type:** `Boolean` + +**Default:** `Enabled` + +### Max. concurrent host threads + +Maximum number of threads used to scan hosts (1 thread = 1 host). + +**Type:** `Integer` [Min `1`, Max `10`] + +**Default:** `5` + +:::warning + +Too many simultaneous requests may be blocked by a firewall. You can reduce the number of threads to avoid this, but this will increase the scan time. + +Too many threads can also cause performance problems on the device. + +::: + +:::note + +This setting only changes the maximum number of concurrently executed threads per host scan. See also the [General](../settings/general#threadpool-additional-min-threads) settings to configure the application-wide thread pool. + +::: + +### Max. concurrent port threads + +Maximum number of threads used to scan for ports for each host (1 thread = 1 port per host). + +**Type:** `Integer` [Min `1`, Max `512`] + +**Default:** `256` + +:::warning + +Too many simultaneous requests may be blocked by a firewall. You can reduce the number of threads to avoid this, but this will increase the scan time. + +Too many threads can also cause performance problems on the device. + +::: + +:::note + +This setting only changes the maximum number of concurrently executed threads per port scan. See also the [General](../settings/general#threadpool-additional-min-threads) settings to configure the application-wide thread pool. + +::: diff --git a/Website/docs/application/powershell.md b/Website/docs/application/powershell.md new file mode 100644 index 0000000000..30bec99e1d --- /dev/null +++ b/Website/docs/application/powershell.md @@ -0,0 +1,366 @@ +--- +sidebar_position: 9 +description: "Launch local or remote PowerShell consoles with tabbed sessions, profiles, and integration with WSL, AWS SSM, and K9s." +keywords: + [ + NETworkManager, + PowerShell, + PowerShell remoting, + terminal, + command line, + WSL, + K9s, + AWS SSM, + remote console, + ] +--- + +# PowerShell + +With **PowerShell** you can launch PowerShell consoles locally or connect to remote computers using [PowerShell Remoting](https://learn.microsoft.com/en-us/powershell/scripting/learn/ps101/08-powershell-remoting). You can also execute command-line applications such as `wsl`, `aws ssm`, `k9s`, or any other tool or module typically accessible from a PowerShell session. In addition, you can run PowerShell scripts directly within the console. + +The integration of PowerShell with NETworkManager supports tabs and profiles for hosts (and tools). You can launch the console / establish a connection via a profile (double-click, Enter key or right-click `Connect`) or directly via the [connection](#connect) dialog. + +:::info + +PowerShell is a command-line shell and scripting language developed by Microsoft for automating administrative tasks and managing system configurations. It provides a robust set of built-in commands and access to .NET Framework objects for efficient system administration and automation. PowerShell uses a verb-noun cmdlet syntax, giving users a consistent and predictable way to perform a wide range of operations. + +::: + +:::note + +Windows PowerShell (`powershell`) and PowerShell (`pwsh`) are supported. **Use PowerShell (`pwsh`) for the best experience.** + +Instructions for installing PowerShell (`pwsh`) can be found on the [official website](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell?). + +::: + +:::tip + +Launching a command-line application such as `wsl`, `aws ssm` or `k9s` can be done by passing the [command](#command) to the PowerShell console. + +```powershell +# Connect to WSL +wsl -d + +# Connect to an EC2 instance via AWS Session Manager +aws ssm start-session --target + +# Connect to Kubernetes +k9s +``` + +See [FAQ > PowerShell with command-line applications](../faq/powershell-cmd-apps) for more information. + +::: + +:::warning + +If Windows Terminal is installed, change the `Default terminal application` in the settings of Windows Terminal to `Windows Console Host` instead of `Windows Terminal` to use PowerShell in NETworkManager. + +::: + +![PowerShell](../img/powershell.png) + +### Tab context menu + +Right-clicking a session tab opens a context menu: + +| Action | Description | +| ------------- | ---------------------------------------------------------------------- | +| **Reconnect** | Restart the PowerShell console (and reconnect to the remote computer). | +| **Resize** | Resize the PowerShell console to the current view size (if connected). | + +## Connect + +### Remote console + +Connect to a remote computer via PowerShell Remoting. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Host + +Host name or IP address of the remote computer. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** + +- `server-01.borntoberoot.net` +- `10.0.0.10` + +:::note + +Only available if [Remote console](#remote-console) is enabled. + +::: + +### Command + +Command to execute when the PowerShell console is started locally. + +**Type:** `String` + +**Default:** [`Settings > Command`](#command-3) + +**Example:** `Set-Location ~; Get-ChildItem` + +:::note + +Only available if [Remote console](#remote-console) is disabled. + +::: + +:::tip + +Use `wsl -d ` to connect to Windows Subsystem for Linux. + +::: + +### Additional command line + +Additional command line arguments to pass to the PowerShell console when it is started. + +**Type:** `String` + +**Default:** [`Settings > Additional command line`](#additional-command-line-3) + +:::note + +`{{Host}}` can be used to insert the [Host](#host) entered above. + +::: + +### Execution policy + +Execution policy of the PowerShell console when it is started. + +**Type:** `NETworkManager.Models.PowerShell.ExecutionPolicy` + +**Default:** [`Settings > Execution policy`](#execution-policy-3) + +**Possible values:** + +- `Restricted` +- `AllSigned` +- `RemoteSigned` +- `Unrestricted` +- `Bypass` + +## Profile + +### Remote console + +Connect to a remote computer via PowerShell Remoting. + +**Type:** `Boolean` + +**Default:** `Enabled` + +### Inherit host from general + +Inherit the host from the general settings. + +**Type:** `Boolean` + +**Default:** `Enabled` + +:::note + +If this option is enabled, the [Host](#host-1) is overwritten by the host from the general settings and the [Host](#host-1) is disabled. + +::: + +### Host + +Host name or IP address of the remote computer. + +**Type:** `String` + +**Example:** + +- `server-01.borntoberoot.net` +- `10.0.0.10` + +:::note + +Only available if [Remote console](#remote-console-1) is enabled. + +::: + +### Command + +Command to execute when the PowerShell console is started locally. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `Set-Location ~; Get-ChildItem` + +:::note + +Only available if [Remote console](#remote-console-1) is disabled. + +::: + +:::tip + +Use `wsl -d ` to connect to Windows Subsystem for Linux. + +Use `k9s` or `k9s --readonly` to manage Kubernetes clusters. + +::: + +### Additional command line + +Additional command line arguments to pass to the PowerShell console when it is started. + +**Type:** `String` + +**Default:** `Empty` + +:::note + +`{{Host}}` can be used to insert the profile's host. + +::: + +### Execution policy + +Execution policy of the PowerShell console when it is started. + +**Type:** `NETworkManager.Models.PowerShell.ExecutionPolicy` + +**Default:** `RemoteSigned` + +**Possible values:** + +- `Restricted` +- `AllSigned` +- `RemoteSigned` +- `Unrestricted` +- `Bypass` + +## Group + +### Command + +Command to execute when the PowerShell console is started locally. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `Set-Location ~; Get-ChildItem` + +:::tip + +Use `wsl -d ` to connect to Windows Subsystem for Linux. + +Use `k9s` or `k9s --readonly` to manage Kubernetes clusters. + +::: + +### Additional command line + +Additional command line arguments to pass to the PowerShell console when it is started. + +**Type:** `String` + +**Default:** `Empty` + +:::note + +`{{Host}}` can be used to insert the profile's host. + +::: + +### Execution policy + +Execution policy of the PowerShell console when it is started. + +**Type:** `NETworkManager.Models.PowerShell.ExecutionPolicy` + +**Default:** `RemoteSigned` + +**Possible values:** + +- `Restricted` +- `AllSigned` +- `RemoteSigned` +- `Unrestricted` +- `Bypass` + +## Settings + +### File path + +Path to the PowerShell console. + +**Type:** `String` + +**Default:** `%ProgramFiles%\PowerShell\7\pwsh.exe`, `%ProgramFiles(x86)%\PowerShell\7\pwsh.exe` or `%windir%\System32\WindowsPowerShell\v1.0\powershell.exe` + +**Example:** + +- `C:\Program Files\PowerShell\7\pwsh.exe` + +:::note + +The `Configure` button opens the PowerShell console to configure it. + +::: + +### Command + +Default command to execute when the PowerShell console is started locally. + +**Type:** `String` + +**Default:** `Set-Location ~` + +**Example:** `Set-Location ~; Get-ChildItem` + +:::tip + +Use `wsl -d ` to connect to Windows Subsystem for Linux. + +Use `k9s` or `k9s --readonly` to manage Kubernetes clusters. + +::: + +### Additional command line + +Default additional command line arguments to pass to the PowerShell console when it is started. + +**Type:** `String` + +**Default:** `Empty` + +:::note + +`{{Host}}` can be used to insert the host. + +::: + +### Execution policy + +Default execution policy of the PowerShell console when it is started. + +**Type:** `NETworkManager.Models.PowerShell.ExecutionPolicy` + +**Default:** `RemoteSigned` + +**Possible values:** + +- `Restricted` +- `AllSigned` +- `RemoteSigned` +- `Unrestricted` +- `Bypass` diff --git a/Website/docs/application/putty.md b/Website/docs/application/putty.md new file mode 100644 index 0000000000..57e95245f0 --- /dev/null +++ b/Website/docs/application/putty.md @@ -0,0 +1,846 @@ +--- +sidebar_position: 10 +description: "Connect via SSH, Telnet, or serial port using the embedded PuTTY client in NETworkManager. Supports tabbed sessions and profile-based connections." +keywords: + [ + NETworkManager, + PuTTY, + SSH client, + Telnet, + serial port, + remote connection, + SSH manager, + ] +--- + +# PuTTY + +With **PuTTY** you can connect to a remote computer via Secure Shell (SSH) or Telnet. In addition you can connect to a local serial port. + +The integration of PuTTY with NETworkManager supports tabs and profiles for hosts. You can establish a connection via a profile (double-click, Enter key or right-click `Connect`) or directly via the [connection](#connect) dialog. + +:::info + +PuTTY is a free and open-source terminal emulator, serial console, and network file transfer tool. It supports various network protocols including SSH, Telnet, SCP, rlogin, and raw socket connections, as well as direct serial port connections. PuTTY provides session management for saving connection settings and quickly reconnecting to frequently used systems. Its lightweight and customizable design makes it a popular choice for system administrators and network engineers. + +::: + +:::note + +PuTTY must be installed on the local computer in order to use this feature. You can download the latest version of PuTTY from the [official website](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html). + +::: + +![PuTTY](../img/putty.png) + +### Tab context menu + +Right-clicking a session tab opens a context menu: + +| Action | Description | +| ------------------- | ---------------------------------------------------------------- | +| **Reconnect** | Restart PuTTY and reconnect to the remote computer. | +| **Resize** | Resize the PuTTY window to the current view size (if connected). | +| **Restart session** | Restart the PuTTY session (if connected). | + +## Connect + +### Mode + +Mode used to connect to the remote computer. + +**Type:** `NETworkManager.Models.PuTTY.ConnectionMode` + +**Default:** `SSH` + +**Possible values:** + +- `SSH` +- `Telnet` +- `Serial` +- `Rlogin` +- `RAW` + +### Host + +Hostname or IP address of the remote computer to connect to. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** + +- `server-01.borntoberoot.net` +- `10.0.0.1` + +:::note + +Only available if [Mode](#mode) is set to `SSH`, `Telnet`, `Rlogin` or `RAW`. + +::: + +### Port + +Port of the remote computer to connect to. + +**Type:** `Integer` [Min `1`, Max `65535`] + +**Default:** + +- [`Settings > SSH port`](#ssh-port) if [Mode](#mode) is set to `SSH` +- [`Settings > Telnet port`](#telnet-port) if [Mode](#mode) is set to `Telnet` +- [`Settings > Rlogin port`](#rlogin-port) if [Mode](#mode) is set to `Rlogin` +- [`Settings > RAW port`](#raw-port) if [Mode](#mode) is set to `RAW` + +:::note + +Only available if [Mode](#mode) is set to `SSH`, `Telnet`, `Rlogin` or `RAW`. + +::: + +### Serial line + +Serial line to connect to. + +**Type:** `String` + +**Default:** `COM1` + +:::note + +Only available if [Mode](#mode) is set to `Serial`. + +::: + +### Baud rate + +Baud rate to use for the serial connection. + +**Type:** `Integer` + +**Default:** `9600` + +**Possible values:** + +- `300` +- `600` +- `1200` +- `2400` +- `4800` +- `9600` +- `14400` +- `19200` +- `28800` +- `38400` +- `57600` +- `115200` +- `128000` +- `256000` +- `512000` +- `921600` + +:::note + +Only available if [Mode](#mode) is set to `Serial`. + +::: + +### Username + +Username to use for the connection. + +**Type:** `String` + +**Default:** [`Settings > Username`](#username-3) + +**Example:** `root` + +:::note + +Only available if [Mode](#mode) is set to `SSH`, `Telnet` or `Rlogin`. + +::: + +### Private key file + +Path to the private key file to use for the `SSH` connection. + +**Type:** `String` + +**Default:** [`Settings > Private key file`](#private-key-file-3) + +**Example:** `C:\Users\BornToBeRoot\Documents\id_rsa.ppk` + +:::note + +Only available if [Mode](#mode) is set to `SSH`. + +::: + +### Profile + +PuTTY profile to use for the connection. + +**Type:** `String` + +**Default:** [`Settings > Profile`](#profile-4) + +**Example:** `NETworkManager` + +:::note + +Existing PuTTY profile to use for the connection. If no profile is specified, the default profile is used. Profiles are stored in the Windows registry under `HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions`. + +::: + +### Additional command line + +Additional command line parameters to use for the connection which are appended. + +**Type:** `String` + +**Default:** [`Settings > Additional command line`](#additional-command-line-3) + +**Example:** `-pw test` + +:::note + +Additional command line parameters to use for the connection. For more information about the available parameters, see the [PuTTY documentation](https://the.earth.li/~sgtatham/putty/latest/htmldoc/Chapter3.html). + +`{{Host}}` can be used to insert the [Host](#host) entered above (not resolved if [Mode](#mode) is set to `Serial`, since there is no host in that mode). + +::: + +## Profile + +### Mode + +Mode used to connect to the remote computer. + +**Type:** `NETworkManager.Models.PuTTY.ConnectionMode` + +**Default:** `SSH` + +**Possible values:** + +- `SSH` +- `Telnet` +- `Serial` +- `Rlogin` +- `RAW` + +### Inherit host from general + +Inherit the host from the general settings. + +**Type:** `Boolean` + +**Default:** `Enabled` + +:::note + +If this option is enabled, the [Host](#host-1) is overwritten by the host from the general settings and the [Host](#host-1) is disabled. + +::: + +### Host + +Hostname or IP address of the remote computer to connect to. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** + +- `server-01.borntoberoot.net` +- `10.0.0.1` + +:::note + +Only available if [Mode](#mode-1) is set to `SSH`, `Telnet`, `Rlogin` or `RAW`. + +::: + +### Serial line + +Serial line to connect to. + +**Type:** `String` + +**Default:** `COM1` + +:::note + +Only available if [Mode](#mode-1) is set to `Serial`. + +::: + +### Port + +Port of the remote computer to connect to. + +**Type:** `Integer` [Min `1`, Max `65535`] + +**Default:** + +- [`Settings > SSH port`](#ssh-port) if [Mode](#mode-1) is set to `SSH` +- [`Settings > Telnet port`](#telnet-port) if [Mode](#mode-1) is set to `Telnet` +- [`Settings > Rlogin port`](#rlogin-port) if [Mode](#mode-1) is set to `Rlogin` +- [`Settings > RAW port`](#raw-port) if [Mode](#mode-1) is set to `RAW` + +:::note + +Only available if [Mode](#mode-1) is set to `SSH`, `Telnet`, `Rlogin` or `RAW`. + +::: + +### Baud rate + +Baud rate to use for the serial connection. + +**Type:** `Integer` + +**Default:** `9600` + +**Possible values:** + +- `300` +- `600` +- `1200` +- `2400` +- `4800` +- `9600` +- `14400` +- `19200` +- `28800` +- `38400` +- `57600` +- `115200` +- `128000` +- `256000` +- `512000` +- `921600` + +:::note + +Only available if [Mode](#mode-1) is set to `Serial`. + +::: + +### Username + +Username to use for the connection. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `root` + +:::note + +Only available if [Mode](#mode-1) is set to `SSH`, `Telnet` or `Rlogin`. + +::: + +### Private key file + +Path to the private key file to use for the `SSH` connection. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `C:\Users\BornToBeRoot\Documents\id_rsa.ppk` + +:::note + +Only available if [Mode](#mode-1) is set to `SSH`. + +::: + +### Profile + +PuTTY profile to use for the connection. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `NETworkManager` + +:::note + +Existing PuTTY profile to use for the connection. If no profile is specified, the default profile is used. Profiles are stored in the Windows registry under `HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions`. + +::: + +### Hostkey + +SSH hostkey to use for the connection. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `71:b8:f2:6e...` + +:::note + +This option overrides PuTTY's normal SSH host key caching policy by telling it exactly what host key to expect. The argument to this option should be either a host key fingerprint, or an SSH-2 public key blob. See the [PuTTY documentation](https://the.earth.li/~sgtatham/putty/0.78/htmldoc/Chapter3.html#using-general-opts) for more information. + +::: + +:::note + +Only available if [Mode](#mode-1) is set to `SSH`. + +::: + +### Enable log + +Enable logging of the connection to a file. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Log mode + +Mode used to log the connection. + +**Type:** `NETworkManager.Models.PuTTY.LogMode` + +**Default:** `Session log` + +**Possible values:** + +- `Session log` +- `SSH log` +- `SSH and Raw log` + +:::note + +See the [PuTTY documentation](https://the.earth.li/~sgtatham/putty/0.78/htmldoc/Chapter4.html#config-logging) for more information. + +::: + +:::note + +Only available if [Enable log](#enable-log) is enabled. + +::: + +### Log path + +Folder to store the log file in. + +**Type:** `String` + +**Default:** `%LocalAppData%\NETworkManager\PuTTY_Log` + +**Example:** `C:\Users\BornToBeRoot\AppData\Local\NETworkManager\PuTTY_Log` + +:::note + +Only available if [Enable log](#enable-log) is enabled. + +::: + +### Log file name + +Name of the log file. + +**Type:** `String` + +**Default:** `&H_&Y-&M-&D_&T.log` + +**Example:** `server-01_2020-01-01_12-00-00.log` + +:::note + +Only available if [Enable log](#enable-log) is enabled. + +::: + +### Additional command line + +Additional command line parameters to use for the connection which are appended. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `-pw test` + +:::note + +Additional command line parameters to use for the connection. For more information about the available parameters, see the [PuTTY documentation](https://the.earth.li/~sgtatham/putty/latest/htmldoc/Chapter3.html). + +`{{Host}}` can be used to insert the profile's host. + +::: + +## Group + +### Username + +Username to use for the connection. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `root` + +:::note + +Only available if [Mode](#mode-1) is set to `SSH`, `Telnet` or `Rlogin`. + +::: + +### Private key file + +Path to the private key file to use for the `SSH` connection. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `C:\Users\BornToBeRoot\Documents\id_rsa.ppk` + +:::note + +Only available if [Mode](#mode-1) is set to `SSH`. + +::: + +### Profile + +PuTTY profile to use for the connection. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `NETworkManager` + +:::note + +Existing PuTTY profile to use for the connection. If no profile is specified, the default profile is used. Profiles are stored in the Windows registry under `HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions`. + +::: + +### Enable log + +Enable logging of the connection to a file. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Log mode + +Mode used to log the connection. + +**Type:** `NETworkManager.Models.PuTTY.LogMode` + +**Default:** `Session log` + +**Possible values:** + +- `Session log` +- `SSH log` +- `SSH and Raw log` + +:::note + +See the [PuTTY documentation](https://the.earth.li/~sgtatham/putty/0.78/htmldoc/Chapter4.html#config-logging) for more information. + +::: + +:::note + +Only available if [Enable log](#enable-log-1) is enabled. + +::: + +### Log path + +Folder to store the log file in. + +**Type:** `String` + +**Default:** `%LocalAppData%\NETworkManager\PuTTY_Log` + +**Example:** `C:\Users\BornToBeRoot\AppData\Local\NETworkManager\PuTTY_Log` + +:::note + +Only available if [Enable log](#enable-log-1) is enabled. + +::: + +### Log file name + +Name of the log file. + +**Type:** `String` + +**Default:** `&H_&Y-&M-&D_&T.log` + +**Example:** `server-01_2020-01-01_12-00-00.log` + +:::note + +Only available if [Enable log](#enable-log-1) is enabled. + +::: + +### Additional command line + +Additional command line parameters to use for the connection which are appended. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `-pw test` + +:::note + +Additional command line parameters to use for the connection. For more information about the available parameters, see the [PuTTY documentation](https://the.earth.li/~sgtatham/putty/latest/htmldoc/Chapter3.html). + +`{{Host}}` can be used to insert the profile's host. + +::: + +## Settings + +### File path + +Path to the PuTTY executable. + +**Type:** `String` + +**Default:** `%ProgramFiles%\PuTTY\putty.exe`, `%ProgramFiles(x86)%\PuTTY\putty.exe` + +**Example:** + +- `C:\Program Files\PuTTY\putty.exe` + +:::note + +The `Configure` button opens the PuTTY application to configure it. + +::: + +### Mode + +Mode used to connect to the remote computer. + +**Type:** `NETworkManager.Models.PuTTY.ConnectionMode` + +**Default:** `SSH` + +**Possible values:** + +- `SSH` +- `Telnet` +- `Serial` +- `Rlogin` +- `RAW` + +### Username + +Username to use for the connection. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `root` + +:::note + +Only available if [Mode](#mode-2) is set to `SSH`, `Telnet` or `Rlogin`. + +::: + +### Private key file + +Path to the private key file to use for the `SSH` connection. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `C:\Users\BornToBeRoot\Documents\id_rsa.ppk` + +:::note + +Only available if [Mode](#mode-1) is set to `SSH`. + +::: + +### Profile + +PuTTY profile to use for the connection. + +**Type:** `String` + +**Default:** `NETworkManager` + +**Example:** `NETworkManager` + +:::note + +Existing PuTTY profile to use for the connection. If no profile is specified, the default profile is used. Profiles are stored in the Windows registry under `HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions`. + +::: + +### Enable log + +Enable logging of the connection to a file. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Log mode + +Mode used to log the connection. + +**Type:** `NETworkManager.Models.PuTTY.LogMode` + +**Default:** `Session log` + +**Possible values:** + +- `Session log` +- `SSH log` +- `SSH and Raw log` + +:::note + +See the [PuTTY documentation](https://the.earth.li/~sgtatham/putty/0.78/htmldoc/Chapter4.html#config-logging) for more information. + +::: + +:::note + +Only available if [Enable log](#enable-log-2) is enabled. + +::: + +### Log path + +Folder to store the log file in. + +**Type:** `String` + +**Default:** `%LocalAppData%\NETworkManager\PuTTY_Log` + +**Example:** `C:\Users\BornToBeRoot\AppData\Local\NETworkManager\PuTTY_Log` + +:::note + +Only available if [Enable log](#enable-log-2) is enabled. + +::: + +### Log file name + +Name of the log file. + +**Type:** `String` + +**Default:** `&H_&Y-&M-&D_&T.log` + +**Example:** `server-01_2020-01-01_12-00-00.log` + +:::note + +Only available if [Enable log](#enable-log-2) is enabled. + +::: + +### Additional command line + +Additional command line parameters to use for the connection which are appended. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `-pw test` + +:::note + +Additional command line parameters to use for the connection. For more information about the available parameters, see the [PuTTY documentation](https://the.earth.li/~sgtatham/putty/latest/htmldoc/Chapter3.html). + +`{{Host}}` can be used to insert the host. + +::: + +### SSH port + +Port to use for `SSH` connections. + +**Type:** `Integer` + +**Default:** `22` + +**Example:** `22` + +### Telnet port + +Port to use for `Telnet` connections. + +**Type:** `Integer` + +**Default:** `23` + +**Example:** `23` + +### Serial line + +Serial line to use for `Serial` connections. + +**Type:** `String` + +**Default:** `COM1` + +**Example:** `COM5` + +### Baud rate + +Baud rate to use for `Serial` connections. + +**Type:** `Integer` + +**Default:** `9600` + +**Example:** `115200` + +### Rlogin port + +Port to use for `Rlogin` connections. + +**Type:** `Integer` + +**Default:** `513` + +**Example:** `513` + +### RAW port + +Port to use for `RAW` connections. + +**Type:** `Integer` + +**Default:** `23` + +**Example:** `23` diff --git a/Website/docs/application/remote-desktop.md b/Website/docs/application/remote-desktop.md new file mode 100644 index 0000000000..4bc90a09e7 --- /dev/null +++ b/Website/docs/application/remote-desktop.md @@ -0,0 +1,1276 @@ +--- +sidebar_position: 8 +description: "Connect to remote computers via RDP with NETworkManager Remote Desktop. Features tabbed sessions, profile management, and fullscreen support." +keywords: + [ + NETworkManager, + remote desktop, + RDP client, + remote connection, + remote access, + Windows Remote Desktop, + RDP manager, + ] +--- + +# Remote Desktop + +With **Remote Desktop** you can connect to a remote computer using the Remote Desktop Protocol (RDP). + +:::info + +Remote Desktop Protocol (RDP) is a proprietary protocol developed by Microsoft that allows users to remotely access and control a computer or virtual machine (VM) over a network connection. It provides a secure communication channel by encrypting the data transmitted between the client and the remote computer, protecting it from unauthorized access. + +::: + +![Remote Desktop](../img/remote-desktop.png) + +### Tab context menu + +Right-clicking a session tab opens a context menu: + +| Action | Description | +| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Reconnect** | Reconnects to the remote computer (only if disconnected) | +| **Disconnect** | Disconnects from the remote computer (only if connected) | +| **Fullscreen** | Toggles fullscreen mode (only if connected and not in view only mode) | +| **Adjust screen** | Adjusts the screen size to the current view size; only available if [Display](#display) is set to `Adjust screen automatically` or `Use the current view size as screen size` (only if connected) | +| **View only** | Toggles [view only](#view-only) mode, which blocks keyboard and mouse input to the remote session while the screen keeps updating (only if connected) | +| **Keyboard shortcuts > Ctrl+Alt+Del** | Sends Ctrl+Alt+Del to the remote computer (only if connected and not in view only mode) | +| **Keyboard shortcuts > Task Manager** | Sends Ctrl+Shift+Esc to the remote computer, opening Task Manager directly (only if connected and not in view only mode) | +| **Keyboard shortcuts > Lock** | Sends Win+L to the remote computer, locking the session (only if connected and not in view only mode) | +| **Keyboard shortcuts > Show Desktop** | Sends Win+D to the remote computer, minimizing all windows (only if connected and not in view only mode) | +| **Keyboard shortcuts > Explorer** | Sends Win+E to the remote computer, opening File Explorer (only if connected and not in view only mode) | +| **Keyboard shortcuts > Run dialog** | Sends Win+R to the remote computer, opening the Run dialog (only if connected and not in view only mode) | + +## Connect + +### Host + +Host to connect to via Remote Desktop. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** + +- `server-01.borntoberoot.net` +- `10.0.0.10` +- `server-01.borntoberoot.net:3389` +- `10.0.0.10:9999` + +:::note + +You can specify a custom port as follows: `10.0.0.10:9999` + +::: + +### Use credentials + +Use credentials to authenticate with the remote computer. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Username + +Username to authenticate with the remote computer. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `Administrator` + +:::note + +Only available if [Use credentials](#use-credentials) is enabled. + +::: + +### Domain + +Domain to authenticate with the remote computer. This is optional. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `BORNTOBEROOT` + +:::note + +Only available if [Use credentials](#use-credentials) is enabled. + +::: + +### Password + +Password to authenticate with the remote computer. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `P@ssw0rd` + +:::note + +Only available if [Use credentials](#use-credentials) is enabled. + +::: + +### Admin (console) session + +Connect to the admin (console) session of the remote computer. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### View only + +Connect in view only mode. Keyboard and mouse input to the remote session is blocked while the screen keeps updating, so the session can be monitored without interacting with it. View only mode can also be toggled on the fly via the [tab context menu](#tab-context-menu). While it is active, an eye icon is shown on the tab and the **Fullscreen** action and all **Keyboard shortcuts** are disabled to prevent bypassing it. + +**Type:** `Boolean` + +**Default:** `Disabled` + +## Profile + +### Inherit host from general + +Inherit the host from the general settings. + +**Type:** `Boolean` + +**Default:** `Enabled` + +:::note + +If this option is enabled, the [Host](#host-1) is overwritten by the host from the general settings and the [Host](#host-1) is disabled. + +::: + +### Host + +Host to connect to via Remote Desktop. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** + +- `server-01.borntoberoot.net` +- `10.0.0.10` + +### Use credentials + +Use credentials to authenticate with the remote computer. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Username + +Username to authenticate with the remote computer. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `Administrator` + +:::note + +Only available if [Use credentials](#use-credentials-1) is enabled. + +::: + +### Domain + +Domain to authenticate with the remote computer. This is optional. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `BORNTOBEROOT` + +:::note + +Only available if [Use credentials](#use-credentials-1) is enabled. + +::: + +### Password + +Password to authenticate with the remote computer. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `P@ssw0rd` + +:::note + +Only available if [Use credentials](#use-credentials-1) is enabled. + +::: + +:::warning + +Passwords are stored in plain text in the profile file unless [Profile file encryption](../faq/profile-file-encryption) is enabled. + +::: + +### Admin (console) session + +Connect to the admin (console) session of the remote computer. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Display + +Display setting used for the remote desktop connection. + +**Type:** `Boolean` (`RadioButtons`) + +**Default:** `Use the current view size as screen size` + +**Possible values:** + +- `Adjust screen automatically` (Remote Desktop will adjust the screen size automatically when the window is resized.) +- `Use the current view size as screen size` (Remote Desktop will use the current view size as screen size, but will not adjust the screen size automatically when the window is resized.) +- `Fixed screen size` (Remote Desktop uses the fixed screen size selected in the drop-down list below.) + **Possible values:** + - `640x480` + - `800x600` + - `1024x768` + - `1280x720` + - `1280x768` + - `1280x800` + - `1280x1024` + - `1360x768` + - `1440x900` + - `1440x1050` + - `1680x1050` + - `1920x1080` +- `Custom screen size` (Remote Desktop uses the custom screen size that can be entered in the text fields below.) + +### Color depth + +Color depth used for the remote desktop connection. + +**Type:** `Integer` + +**Default:** `32` + +**Possible values:** + +- `15` +- `16` +- `24` +- `32` + +### Port + +Port used for the remote desktop connection. + +**Type:** `Integer` + +**Default:** `3389` + +### View only + +Block keyboard and mouse input to the remote session. When enabled, the session can be monitored without interacting with it while the screen keeps updating. The value is inherited in the order Global → Group → Profile. View only mode can also be toggled on the fly via the [tab context menu](#tab-context-menu). + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Credential Security Support Provider + +Use the Credential Security Support Provider (CredSSP) protocol to authenticate with the remote computer. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Authentication level + +Authentication level used for the remote desktop connection. + +**Type:** `Integer` + +**Default:** `2` [Min `0`, Max `3`] + +**Possible values:** + +- `0` (If server authentication fails, connect to the computer without warning.) +- `1` (If server authentication fails, do not establish a connection.) +- `2` (If server authentication fails, show a warning and allow me to connect or refuse the connection.) +- `3` (No authentication requirement is specified.) + +### Enable gateway server + +Enable the use of a gateway server for the remote desktop connection. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Server name + +Hostname of the gateway server used for the remote desktop connection. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `gateway.borntoberoot.net` + +:::note + +Only available if [Enable gateway server](#enable-gateway-server) is enabled. + +::: + +### Bypass for local addresses + +Bypass the gateway server for local addresses. + +**Type:** `Boolean` + +**Default:** `Enabled` + +:::note + +Only available if [Enable gateway server](#enable-gateway-server) is enabled. + +::: + +### Logon method + +Logon method used for the gateway server. + +**Type:** `NETworkManager.Models.RemoteDesktop.GatewayUserSelectedCredsSource` + +**Default:** `Allow me to select later` + +**Possible values:** + +`Ask for password (NTLM)` (`Userpass`) +`Smart card or Windows Hello for Business` (`Smartcard`) +`Allow me to select later` (`Any`) + +:::note + +Only available if [Enable gateway server](#enable-gateway-server) is enabled. + +::: + +### Share gateway credentials with remote computer + +Share the gateway credentials with the remote computer. + +**Type:** `Boolean` + +**Default:** `Enabled` + +:::note + +Only available if [Enable gateway server](#enable-gateway-server-2) is enabled. + +::: + +### Use gateway credentials + +Use credentials to authenticate with the gateway server. + +**Type:** `Boolean` + +**Default:** `Disabled` + +:::note + +Only available if [Enable gateway server](#enable-gateway-server) is enabled and [Logon method](#logon-method) is set to `Ask for password (NTLM)`. + +::: + +### Username + +Username to authenticate with the gateway server. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `Administrator` + +:::note + +Only available if [Enable gateway server](#enable-gateway-server) is enabled, [Logon method](#logon-method) is set to `Ask for password (NTLM)` and [Use gateway credentials](#use-gateway-credentials) is enabled. + +::: + +### Domain + +Domain to authenticate with the gateway server. This is optional. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `BORNTOBEROOT` + +:::note + +Only available if [Enable gateway server](#enable-gateway-server) is enabled, [Logon method](#logon-method) is set to `Ask for password (NTLM)` and [Use gateway credentials](#use-gateway-credentials) is enabled. + +::: + +### Password + +Password to authenticate with the gateway server. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `P@ssw0rd` + +:::note + +Only available if [Enable gateway server](#enable-gateway-server) is enabled, [Logon method](#logon-method) is set to `Ask for password (NTLM)` and [Use gateway credentials](#use-gateway-credentials) is enabled. + +::: + +:::warning + +Passwords are stored in plain text in the profile file unless [Profile file encryption](../faq/profile-file-encryption) is enabled. + +::: + +### Remote audio playback + +Configure the remote audio playback for the remote desktop connection. + +**Type:** `NETworkManager.Models.RemoteDesktop.AudioRedirectionMode` + +**Default:** `Play on remote computer` + +**Possible values:** + +- `Play on this computer` +- `Play on remote computer` +- `Do not play` + +### Remote audio recording + +Configure the remote audio recording for the remote desktop connection. + +**Type:** `NETworkManager.Models.RemoteDesktop.AudioCaptureRedirectionMode` + +**Default:** `Do not record` + +**Possible values:** + +- `Record from this computer` +- `Do not record` + +### Apply Windows key combinations + +Configure the Windows key combinations for the remote desktop connection. + +**Type:** `NETworkManager.Models.RemoteDesktop.KeyboardHookMode` + +**Default:** `On the remote computer` + +**Possible values:** + +- `On this computer` +- `On the remote computer` + +### Redirect clipboard + +Configure the clipboard redirection for the remote desktop connection. + +**Type:** `Boolean` + +**Default:** `Enabled` + +### Redirect devices + +Configure the device redirection for the remote desktop connection. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Redirect drives + +Configure the drive redirection for the remote desktop connection. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Redirect ports + +Configure the port redirection for the remote desktop connection. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Redirect smartcards + +Configure the smartcard redirection for the remote desktop connection. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Redirect printers + +Configure the printer redirection for the remote desktop connection. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Persistent bitmap caching + +Configure the persistent bitmap caching for the remote desktop connection. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Reconnect if the connection is dropped + +Automatically reconnect if the connection is dropped. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Network connection type + +Configure the network connection type for the remote desktop connection. + +**Type:** `NETworkManager.Models.RemoteDesktop.NetworkConnectionType` + +**Default:** `Detect connection quality automatically` + +**Possible values:** + +- `Detect connection quality automatically` +- `Modem (56 kbps)` +- `Low-speed broadband (256 kbps - 2 Mbps)` +- `Satellite (2 Mbps - 16 Mbps with high latency)` +- `High-speed broadband (2 Mbps - 10 Mbps)` +- `WAN (10 Mbps or higher with high latency)` +- `LAN (10 Mbps or higher)` + +## Group + +### Use credentials + +Use credentials to authenticate with the remote computer. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Username + +Username to authenticate with the remote computer. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `Administrator` + +:::note + +Only available if [Use credentials](#use-credentials-2) is enabled. + +::: + +### Domain + +Domain to authenticate with the remote computer. This is optional. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `BORNTOBEROOT` + +:::note + +Only available if [Use credentials](#use-credentials-2) is enabled. + +::: + +### Password + +Password to authenticate with the remote computer. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `P@ssw0rd` + +:::note + +Only available if [Use credentials](#use-credentials-2) is enabled. + +::: + +:::warning + +Passwords are stored in plain text in the profile file unless [Profile file encryption](../faq/profile-file-encryption) is enabled. + +::: + +### Admin (console) session + +Connect to the admin (console) session of the remote computer. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Display + +Display setting used for the remote desktop connection. + +**Type:** `Boolean` (`RadioButtons`) + +**Default:** `Use the current view size as screen size` + +**Possible values:** + +- `Adjust screen automatically` (Remote Desktop will adjust the screen size automatically when the window is resized.) +- `Use the current view size as screen size` (Remote Desktop will use the current view size as screen size, but will not adjust the screen size automatically when the window is resized.) +- `Fixed screen size` (Remote Desktop uses the fixed screen size selected in the drop-down list below.) + **Possible values:** + - `640x480` + - `800x600` + - `1024x768` + - `1280x720` + - `1280x768` + - `1280x800` + - `1280x1024` + - `1360x768` + - `1440x900` + - `1440x1050` + - `1680x1050` + - `1920x1080` +- `Custom screen size` (Remote Desktop uses the custom screen size that can be entered in the text fields below.) + +### Color depth + +Color depth used for the remote desktop connection. + +**Type:** `Integer` + +**Default:** `32` + +**Possible values:** + +- `15` +- `16` +- `24` +- `32` + +### Port + +Port used for the remote desktop connection. + +**Type:** `Integer` + +**Default:** `3389` + +### View only + +Block keyboard and mouse input to the remote session. When enabled, the session can be monitored without interacting with it while the screen keeps updating. The value is inherited in the order Global → Group → Profile. View only mode can also be toggled on the fly via the [tab context menu](#tab-context-menu). + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Credential Security Support Provider + +Use the Credential Security Support Provider (CredSSP) protocol to authenticate with the remote computer. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Authentication level + +Authentication level used for the remote desktop connection. + +**Type:** `Integer` + +**Default:** `2` [Min `0`, Max `3`] + +**Possible values:** + +- `0` (If server authentication fails, connect to the computer without warning.) +- `1` (If server authentication fails, do not establish a connection.) +- `2` (If server authentication fails, show a warning and allow me to connect or refuse the connection.) +- `3` (No authentication requirement is specified.) + +### Enable gateway server + +Enable the use of a gateway server for the remote desktop connection. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Server name + +Hostname of the gateway server used for the remote desktop connection. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `gateway.borntoberoot.net` + +:::note + +Only available if [Enable gateway server](#enable-gateway-server-1) is enabled. + +::: + +### Bypass for local addresses + +Bypass the gateway server for local addresses. + +**Type:** `Boolean` + +**Default:** `Enabled` + +:::note + +Only available if [Enable gateway server](#enable-gateway-server-1) is enabled. + +::: + +### Logon method + +Logon method used for the gateway server. + +**Type:** `NETworkManager.Models.RemoteDesktop.GatewayUserSelectedCredsSource` + +**Default:** `Allow me to select later` + +**Possible values:** + +`Ask for password (NTLM)` (`Userpass`) +`Smart card or Windows Hello for Business` (`Smartcard`) +`Allow me to select later` (`Any`) + +:::note + +Only available if [Enable gateway server](#enable-gateway-server-1) is enabled. + +::: + +### Share gateway credentials with remote computer + +Share the gateway credentials with the remote computer. + +**Type:** `Boolean` + +**Default:** `Enabled` + +:::note + +Only available if [Enable gateway server](#enable-gateway-server-2) is enabled. + +::: + +### Use gateway credentials + +Use credentials to authenticate with the gateway server. + +**Type:** `Boolean` + +**Default:** `Disabled` + +:::note + +Only available if [Enable gateway server](#enable-gateway-server-1) is enabled and [Logon method](#logon-method-1) is set to `Ask for password (NTLM)`. + +::: + +### Username + +Username to authenticate with the gateway server. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `Administrator` + +:::note + +Only available if [Enable gateway server](#enable-gateway-server-1) is enabled, [Logon method](#logon-method-1) is set to `Ask for password (NTLM)` and [Use gateway credentials](#use-gateway-credentials-1) is enabled. + +::: + +### Domain + +Domain to authenticate with the gateway server. This is optional. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `BORNTOBEROOT` + +:::note + +Only available if [Enable gateway server](#enable-gateway-server-1) is enabled, [Logon method](#logon-method-1) is set to `Ask for password (NTLM)` and [Use gateway credentials](#use-gateway-credentials-1) is enabled. + +::: + +### Password + +Password to authenticate with the gateway server. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `P@ssw0rd` + +:::note + +Only available if [Enable gateway server](#enable-gateway-server-1) is enabled, [Logon method](#logon-method-1) is set to `Ask for password (NTLM)` and [Use gateway credentials](#use-gateway-credentials-1) is enabled. + +::: + +:::warning + +Passwords are stored in plain text in the profile file unless [Profile file encryption](../faq/profile-file-encryption) is enabled. + +::: + +### Remote audio playback + +Configure the remote audio playback for the remote desktop connection. + +**Type:** `NETworkManager.Models.RemoteDesktop.AudioRedirectionMode` + +**Default:** `Play on remote computer` + +**Possible values:** + +- `Play on this computer` +- `Play on remote computer` +- `Do not play` + +### Remote audio recording + +Configure the remote audio recording for the remote desktop connection. + +**Type:** `NETworkManager.Models.RemoteDesktop.AudioCaptureRedirectionMode` + +**Default:** `Do not record` + +**Possible values:** + +- `Record from this computer` +- `Do not record` + +### Apply Windows key combinations + +Configure the Windows key combinations for the remote desktop connection. + +**Type:** `NETworkManager.Models.RemoteDesktop.KeyboardHookMode` + +**Default:** `On the remote computer` + +**Possible values:** + +- `On this computer` +- `On the remote computer` + +### Redirect clipboard + +Configure the clipboard redirection for the remote desktop connection. + +**Type:** `Boolean` + +**Default:** `Enabled` + +### Redirect devices + +Configure the device redirection for the remote desktop connection. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Redirect drives + +Configure the drive redirection for the remote desktop connection. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Redirect ports + +Configure the port redirection for the remote desktop connection. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Redirect smartcards + +Configure the smartcard redirection for the remote desktop connection. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Redirect printers + +Configure the printer redirection for the remote desktop connection. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Persistent bitmap caching + +Configure the persistent bitmap caching for the remote desktop connection. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Reconnect if the connection is dropped + +Automatically reconnect if the connection is dropped. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Network connection type + +Configure the network connection type for the remote desktop connection. + +**Type:** `NETworkManager.Models.RemoteDesktop.NetworkConnectionType` + +**Default:** `Detect connection quality automatically` + +**Possible values:** + +- `Detect connection quality automatically` +- `Modem (56 kbps)` +- `Low-speed broadband (256 kbps - 2 Mbps)` +- `Satellite (2 Mbps - 16 Mbps with high latency)` +- `High-speed broadband (2 Mbps - 10 Mbps)` +- `WAN (10 Mbps or higher with high latency)` +- `LAN (10 Mbps or higher)` + +## Settings + +### Display + +Display setting used for the remote desktop connection. + +**Type:** `Boolean` (`RadioButtons`) + +**Default:** `Use the current view size as screen size` + +**Possible values:** + +- `Adjust screen automatically` (Remote Desktop will adjust the screen size automatically when the window is resized.) +- `Use the current view size as screen size` (Remote Desktop will use the current view size as screen size, but will not adjust the screen size automatically when the window is resized.) +- `Fixed screen size` (Remote Desktop uses the fixed screen size selected in the drop-down list below.) + **Possible values:** + - `640x480` + - `800x600` + - `1024x768` + - `1280x720` + - `1280x768` + - `1280x800` + - `1280x1024` + - `1360x768` + - `1440x900` + - `1440x1050` + - `1680x1050` + - `1920x1080` +- `Custom screen size` (Remote Desktop uses the custom screen size that can be entered in the text fields below.) + +### Color depth + +Color depth used for the remote desktop connection. + +**Type:** `Integer` + +**Default:** `32` + +**Possible values:** + +- `15` +- `16` +- `24` +- `32` + +### Port + +Port used for the remote desktop connection. + +**Type:** `Integer` + +**Default:** `3389` + +### View only + +Block keyboard and mouse input to the remote session. When enabled, the session can be monitored without interacting with it while the screen keeps updating. The value is inherited in the order Global → Group → Profile. View only mode can also be toggled on the fly via the [tab context menu](#tab-context-menu). + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Credential Security Support Provider + +Use the Credential Security Support Provider (CredSSP) protocol to authenticate with the remote computer. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Authentication level + +Authentication level used for the remote desktop connection. + +**Type:** `Integer` + +**Default:** `2` [Min `0`, Max `3`] + +**Possible values:** + +- `0` (If server authentication fails, connect to the computer without warning.) +- `1` (If server authentication fails, do not establish a connection.) +- `2` (If server authentication fails, show a warning and allow me to connect or refuse the connection.) +- `3` (No authentication requirement is specified.) + +### Enable gateway server + +Enable the use of a gateway server for the remote desktop connection. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Server name + +Hostname of the gateway server used for the remote desktop connection. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `gateway.borntoberoot.net` + +:::note + +Only available if [Enable gateway server](#enable-gateway-server-2) is enabled. + +::: + +### Bypass for local addresses + +Bypass the gateway server for local addresses. + +**Type:** `Boolean` + +**Default:** `Enabled` + +:::note + +Only available if [Enable gateway server](#enable-gateway-server-2) is enabled. + +::: + +### Logon method + +Logon method used for the gateway server. + +**Type:** `NETworkManager.Models.RemoteDesktop.GatewayUserSelectedCredsSource` + +**Default:** `Allow me to select later` + +**Possible values:** + +`Ask for password (NTLM)` (`Userpass`) +`Smart card or Windows Hello for Business` (`Smartcard`) +`Allow me to select later` (`Any`) + +:::note + +Only available if [Enable gateway server](#enable-gateway-server-2) is enabled. + +::: + +### Share gateway credentials with remote computer + +Share the gateway credentials with the remote computer. + +**Type:** `Boolean` + +**Default:** `Enabled` + +:::note + +Only available if [Enable gateway server](#enable-gateway-server-2) is enabled. + +::: + +### Remote audio playback + +Configure the remote audio playback for the remote desktop connection. + +**Type:** `NETworkManager.Models.RemoteDesktop.AudioRedirectionMode` + +**Default:** `Play on remote computer` + +**Possible values:** + +- `Play on this computer` +- `Play on remote computer` +- `Do not play` + +### Remote audio recording + +Configure the remote audio recording for the remote desktop connection. + +**Type:** `NETworkManager.Models.RemoteDesktop.AudioCaptureRedirectionMode` + +**Default:** `Do not record` + +**Possible values:** + +- `Record from this computer` +- `Do not record` + +### Apply Windows key combinations + +Configure the Windows key combinations for the remote desktop connection. + +**Type:** `NETworkManager.Models.RemoteDesktop.KeyboardHookMode` + +**Default:** `On the remote computer` + +**Possible values:** + +- `On this computer` +- `On the remote computer` + +### Redirect clipboard + +Configure the clipboard redirection for the remote desktop connection. + +**Type:** `Boolean` + +**Default:** `Enabled` + +### Redirect devices + +Configure the device redirection for the remote desktop connection. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Redirect drives + +Configure the drive redirection for the remote desktop connection. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Redirect ports + +Configure the port redirection for the remote desktop connection. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Redirect smartcards + +Configure the smartcard redirection for the remote desktop connection. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Redirect printers + +Configure the printer redirection for the remote desktop connection. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Persistent bitmap caching + +Configure the persistent bitmap caching for the remote desktop connection. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Reconnect if the connection is dropped + +Automatically reconnect if the connection is dropped. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Network connection type + +Configure the network connection type for the remote desktop connection. + +**Type:** `NETworkManager.Models.RemoteDesktop.NetworkConnectionType` + +**Default:** `Detect connection quality automatically` + +**Possible values:** + +- `Detect connection quality automatically` +- `Modem (56 kbps)` +- `Low-speed broadband (256 kbps - 2 Mbps)` +- `Satellite (2 Mbps - 16 Mbps with high latency)` +- `High-speed broadband (2 Mbps - 10 Mbps)` +- `WAN (10 Mbps or higher with high latency)` +- `LAN (10 Mbps or higher)` \ No newline at end of file diff --git a/Website/docs/application/snmp.md b/Website/docs/application/snmp.md new file mode 100644 index 0000000000..d85e7a0d69 --- /dev/null +++ b/Website/docs/application/snmp.md @@ -0,0 +1,456 @@ +--- +sidebar_position: 14 +description: "Monitor and manage network devices via SNMP v1, v2c, and v3 using get, walk, and set operations with configurable security levels." +keywords: + [ + NETworkManager, + SNMP, + SNMP v3, + network monitoring, + SNMP get, + SNMP walk, + SNMP set, + network management, + ] +--- + +# SNMP + +With **SNMP** you can manage and monitor network devices using the Simple Network Management Protocol (SNMP). Version `1`, `2c` and `3` with `get`, `walk` and `set` are supported. + +:::info + +Simple Network Management Protocol (SNMP) is a standard protocol for monitoring and managing network devices. It uses UDP (port 161 for queries, port 162 for traps) and operates on a manager–agent model, where managed devices expose a Management Information Base (MIB) — a hierarchical collection of objects identified by Object Identifiers (OIDs). SNMP has three versions: SNMPv1 and SNMPv2c use community strings for authentication, while SNMPv3 adds user-based authentication and encryption. + +::: + +![SNMP](../img/snmp.png) + +### Example inputs + +| Host | Mode | Version | OID | Community | Security | Username | Auth | Auth | Priv | | +| ----------- | ------ | ------- | -------------------- | --------- | -------------- | -------- | ----- | -------- | ----- | -------- | +| `server-01` | `Get` | `V2C` | `.1.3.6.1; .1.3.6.2` | `public` | `-/-` | `-/-` | `-/-` | `-/-` | `-/-` | `-/-` | +| `10.0.0.10` | `Walk` | `V3` | `.1.3.6.1.2.1.1` | `-/-` | `NoAuthNoPriv` | `Admin` | `-/-` | `-/-` | `-/-` | `-/-` | +| `10.0.0.10` | `Walk` | `V3` | `.1.3.6.1.2.1.1` | `-/-` | `AuthNoPriv` | `Admin` | `SHA1 | S3cr3t!` | `-/-` | `-/-` | +| `10.0.0.10` | `Walk` | `V3` | `.1.3.6.1.2.1.1` | `-/-` | `AuthPriv` | `Admin` | `SHA1 | S3cr3t!` | `AES | S3cr3t%` | + +:::note + +Multiple OIDs (`.1.3.6.1.2.1.1; .1.3.6.1.2.1.2`) can be specified when using the mode `get`. + +::: + +### Context menu + +| Action | Description | +| ------------- | ----------------------------------------------- | +| **Copy** | Copy the selected information to the clipboard. | +| **Export...** | Export the selected or all results to a file. | + +## Profile + +### Inherit host from general + +Inherit the host from the general settings. + +**Type:** `Boolean` + +**Default:** `Enabled` + +:::note + +If this option is enabled, the [Host](#host) is overwritten by the host from the general settings and the [Host](#host) is disabled. + +::: + +### Host + +Host to connect to via SNMP. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** + +- `server-01.borntoberoot.net` +- `10.0.0.10` + +### OID + +OID for the `get`, `walk` or `set` SNMP request. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** + +- `.1.3.6.1.2.1.1` + +:::note + +Multiple OIDs (`.1.3.6.1.2.1.1; .1.3.6.1.2.1.2`) can be specified when using the [mode `get`](#mode). + +::: + +### Mode + +SNMP mode for the request. + +**Type:** `NETworkManager.Models.Network.SNMPMode` + +**Default:** `Get` + +**Possible values:** + +- `Get` +- `Walk` +- `Set` +- `Trap` (not implemented) +- `Inform` (not implemented) + +### Version + +SNMP version for the request. + +**Type:** `NETworkManager.Models.Network.SNMPVersion` + +**Default:** `V2C` + +**Possible values:** + +- `V1` +- `V2C` +- `V3` + +### Community + +Community for the SNMP `v1` or `v2c` request. + +**Type:** `String` + +**Default:** `Empty` + +:::note + +Only available when using [version `1` or `2c`](#version). + +::: + +:::warning + +Passwords are stored in plain text in the profile file unless [Profile file encryption](../faq/profile-file-encryption) is enabled. + +::: + +### Security + +Security for the SNMP `v3` request. + +**Type:** `NETworkManager.Models.Network.SNMPV3Security` + +**Default:** `AuthPriv` + +**Possible values:** + +- `NoAuthNoPriv` +- `AuthNoPriv` +- `AuthPriv` + +:::note + +Only available when using [version `3`](#version). + +::: + +### Username + +Username for the SNMP `v3` request. + +**Type:** `String` + +**Default:** `Empty` + +:::note + +Only available when using [version `3`](#version). + +::: + +### Auth + +Authentication for the SNMP `v3` request. + +**Type:** `NETworkManager.Models.Network.SNMPV3AuthenticationProvider` + +**Default:** `SHA1` + +**Possible values:** + +- `MD5` +- `SHA1` +- `SHA256` +- `SHA384` +- `SHA512` + +:::note + +Only available when using [version `3`](#version) and [security `AuthNoPriv` or `AuthPriv`](#security). + +::: + +:::warning + +Passwords are stored in plain text in the profile file unless [Profile file encryption](../faq/profile-file-encryption) is enabled. + +::: + +### Priv + +Privacy for the SNMP `v3` request. + +**Type:** `NETworkManager.Models.Network.SNMPV3PrivacyProvider` + +**Default:** `AES` + +**Possible values:** + +- `DES` +- `AES` (128) +- `AES192` +- `AES256` + +:::note + +Only available when using [version `3`](#version) and [security `AuthPriv`](#security). + +::: + +:::warning + +Passwords are stored in plain text in the profile file unless [Profile file encryption](../faq/profile-file-encryption) is enabled. + +::: + +## Group + +### OID + +OID for the `get`, `walk` or `set` SNMP request. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** + +- `.1.3.6.1.2.1.1` + +:::note + +Multiple OIDs (`.1.3.6.1.2.1.1; .1.3.6.1.2.1.2`) can be specified when using the [mode `get`](#mode-1). + +::: + +### Mode + +SNMP mode for the request. + +**Type:** `NETworkManager.Models.Network.SNMPMode` + +**Default:** `Get` + +**Possible values:** + +- `Get` +- `Walk` +- `Set` +- `Trap` (not implemented) +- `Inform` (not implemented) + +### Version + +SNMP version for the request. + +**Type:** `NETworkManager.Models.Network.SNMPVersion` + +**Default:** `V2C` + +**Possible values:** + +- `V1` +- `V2C` +- `V3` + +### Community + +Community for the SNMP `v1` or `v2c` request. + +**Type:** `String` + +**Default:** `Empty` + +:::note + +Only available when using [version `1` or `2c`](#version-1). + +::: + +:::warning + +Passwords are stored in plain text in the profile file unless [Profile file encryption](../faq/profile-file-encryption) is enabled. + +::: + +### Security + +Security for the SNMP `v3` request. + +**Type:** `NETworkManager.Models.Network.SNMPV3Security` + +**Default:** `AuthPriv` + +**Possible values:** + +- `NoAuthNoPriv` +- `AuthNoPriv` +- `AuthPriv` + +:::note + +Only available when using [version `3`](#version-1). + +::: + +### Username + +Username for the SNMP `v3` request. + +**Type:** `String` + +**Default:** `Empty` + +:::note + +Only available when using [version `3`](#version-1). + +::: + +### Auth + +Authentication for the SNMP `v3` request. + +**Type:** `NETworkManager.Models.Network.SNMPV3AuthenticationProvider` + +**Default:** `SHA1` + +**Possible values:** + +- `MD5` +- `SHA1` +- `SHA256` +- `SHA384` +- `SHA512` + +:::note + +Only available when using [version `3`](#version-1) and [security `AuthNoPriv` or `AuthPriv`](#security-1). + +::: + +:::warning + +Passwords are stored in plain text in the profile file unless [Profile file encryption](../faq/profile-file-encryption) is enabled. + +::: + +### Priv + +Privacy for the SNMP `v3` request. + +**Type:** `NETworkManager.Models.Network.SNMPV3PrivacyProvider` + +**Default:** `AES` + +**Possible values:** + +- `DES` +- `AES` (128) +- `AES192` +- `AES256` + +:::note + +Only available when using [version `3`](#version-1) and [security `AuthPriv`](#security-1). + +::: + +:::warning + +Passwords are stored in plain text in the profile file unless [Profile file encryption](../faq/profile-file-encryption) is enabled. + +::: + +## Settings + +### OID profiles + +List of common OIDs for the `get`, `walk` or `set` SNMP request. + +**Type:** `NETworkManager.Models.Network.SNMPOIDProfileInfo` + +**Default:** + +| Description | OID | Mode | +| --------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | ---- | +| HOST-RESOURCES-MIB | .1.3.6.1.2.1.25 | Walk | +| IF-MIB | .1.3.6.1.2.1.2 | Walk | +| IP-MIB | .1.3.6.1.2.1.4 | Walk | +| Linux - Interface names | .1.3.6.1.2.1.2.2.1.2 | Walk | +| Linux - Load (1, 5, 15 min) | .1.3.6.1.4.1.2021.10.1.3.1; .1.3.6.1.4.1.2021.10.1.3.2; .1.3.6.1.4.1.2021.10.1.3.3 | Get | +| Linux - Memory (Swap size, total RAM, RAM used, RAM free) | .1.3.6.1.4.1.2021.4.3.0; .1.3.6.1.4.1.2021.4.5.0; .1.3.6.1.4.1.2021.4.6.0; .1.3.6.1.4.1.2021.4.11.0 | Get | +| Linux - SNMP uptime | .1.3.6.1.2.1.1.3.0 | Get | +| Linux - System uptime | .1.3.6.1.2.1.25.1.1.0 | Get | +| SNMPv2-MIB (system) | .1.3.6.1.2.1.1 | Walk | +| TCP-MIB | .1.3.6.1.2.1.6 | Walk | +| UDP-MIB | .1.3.6.1.2.1.7 | Walk | +| UCD-SNMP-MIB | .1.3.6.1.4.1.2021 | Walk | + +:::note + +Right-click on a selected OID profile to `edit` or `delete` it. + +You can also use the Hotkeys `F2` (`edit`) or `Del` (`delete`) on a selected OID profile. + +::: + +### Walk mode + +Walk mode for the SNMP request. + +**Type:** `Lextm.SharpSnmpLib.Messaging.WalkMode` + +**Default:** `WithinSubtree` + +**Possible values:** + +- `Default` +- `WithinSubtree` + +### Timeout (ms) + +Timeout in milliseconds after which the SNMP request is canceled. + +**Type:** `Integer` [Min `100`, Max `900000`] + +**Default:** `60000` + +### Port + +UDP port to use for SNMP requests. + +**Type:** `Integer` [Min `1`, Max `65535`] + +**Default:** `161` diff --git a/Website/docs/application/sntp-lookup.md b/Website/docs/application/sntp-lookup.md new file mode 100644 index 0000000000..9cfa9d2522 --- /dev/null +++ b/Website/docs/application/sntp-lookup.md @@ -0,0 +1,59 @@ +--- +sidebar_position: 15 +description: "Query SNTP time servers and compare network time with your local clock. NETworkManager SNTP Lookup shows time offsets for accurate synchronization." +keywords: [NETworkManager, SNTP lookup, NTP, time server, time synchronization, network time, clock offset] +--- + +# SNTP Lookup + +With **SNTP Lookup** you can query one or more SNTP servers to get the current network time and view the offset to the local clock. + +:::info + +SNTP (Simple Network Time Protocol) is a simplified version of NTP (Network Time Protocol) used for synchronizing clocks between devices on a network. It is designed for scenarios where precise timing is not critical. SNTP servers obtain their time from upstream NTP or SNTP servers and distribute it to clients. SNTP operates over UDP and uses port 123 by default. It is widely supported by operating systems and network devices. + +::: + +![SNTP Lookup](../img/sntp-lookup.png) + +### Context menu + +| Action | Description | +|--------|-------------| +| **Copy** | Copies the selected information to the clipboard | +| **Export...** | Exports the selected or all results to a file | + +## Settings + +### SNTP servers + +List of SNTP server profiles. A profile can contain one or more SNTP servers with host/IP address and port. + +**Type:** `List` + +**Default:** + +| Name | Server(s) | +| ----------------- | ------------------------------------------------------------------------------------------------------------- | +| Cloudflare | `time.cloudflare.com:123` | +| Google Public NTP | `time.google.com:123; time1.google.com:123; time2.google.com:123; time3.google.com:123; time4.google.com:123` | +| Microsoft | `time.windows.com:123` | +| pool.ntp.org | `0.pool.ntp.org:123; 1.pool.ntp.org:123; 2.pool.ntp.org:123; 3.pool.ntp.org:123` | + +:::note + +Right-click on a selected SNTP server profile to `edit` or `delete` it. + +You can also use the Hotkeys `F2` (`edit`) or `Del` (`delete`) on a selected SNTP server profile. + +At least one SNTP server profile must exist. + +::: + +### Timeout (ms) + +Timeout in milliseconds after the SNTP request is canceled. + +**Type:** `Integer` [Min `100`, Max `15000`] + +**Default:** `4000` diff --git a/Website/docs/application/subnet-calculator.md b/Website/docs/application/subnet-calculator.md new file mode 100644 index 0000000000..eb37e315b1 --- /dev/null +++ b/Website/docs/application/subnet-calculator.md @@ -0,0 +1,72 @@ +--- +sidebar_position: 22 +description: "Calculate IPv4 and IPv6 subnets, perform subnetting and supernetting with NETworkManager Subnet Calculator. Supports CIDR and dotted-decimal notation." +keywords: [NETworkManager, subnet calculator, subnetting, supernetting, CIDR calculator, IPv4 subnet, IPv6 subnet, network calculator] +--- + +# Subnet Calculator + +With the **Subnet Calculator** you can [calculate a subnet](#calculator), [split subnets](#subnetting) and create a [wide subnet](#wide-subnet). Both IPv4 and IPv6 are supported. + +## Calculator + +On the **Calculator** tab, you can calculate a subnet by entering the IP address and the subnet mask. The subnet mask can be entered in CIDR notation. + +Example inputs: + +- `10.0.0.0/16` +- `192.168.0.0/255.255.255.0` +- `2001:db8::/32` + +![Subnet Calculator - Calculator](../img/subnet-calculator--calculator.png) + +:::note + +Right-click on the result to copy the information. + +::: + +## Subnetting + +On the **Subnetting** tab, you can split a subnet into smaller subnets. The subnet mask can be entered in CIDR notation. + +Example inputs: + +| Subnet | New subnet mask | +| --------------------------- | ----------------- | +| `10.0.0.0/16` | `/18` | +| `192.168.0.0/255.255.255.0` | `255.255.255.128` | +| `2001:db8::/32` | `/48` | + +![Subnet Calculator - Subnetting](../img/subnet-calculator--subnetting.png) + +:::note + +Right-click on the result to copy or export the information. + +::: + +## Wide Subnet + +On the **Wide Subnet** tab, you can create a wide subnet that includes both given subnets. The subnet mask can be entered in CIDR notation. + +Example inputs: + +| Subnet 1 | Subnet 2 | +| --------------------------- | ---------------- | +| `10.0.0.0/16` | `10.2.0.0/16` | +| `192.168.0.0/255.255.255.0` | `192.168.4.0/23` | + +:::note + +IPv6 is not supported. + +::: + +![Subnet Calculator - Wide Subnet](../img/subnet-calculator--wide-subnet.png) + +:::note + +Right-click on the result to copy the information. + +::: diff --git a/Website/docs/application/tigervnc.md b/Website/docs/application/tigervnc.md new file mode 100644 index 0000000000..66ae8c2791 --- /dev/null +++ b/Website/docs/application/tigervnc.md @@ -0,0 +1,145 @@ +--- +sidebar_position: 12 +description: "Connect to remote computers via VNC with tabbed sessions and hardware-accelerated Tight encoding." +keywords: + [ + NETworkManager, + TigerVNC, + VNC client, + remote desktop, + VNC connection, + remote access, + VNC viewer, + ] +--- + +# TigerVNC + +With **TigerVNC** you can connect to a remote computer via VNC. The integration of TigerVNC with NETworkManager supports tabs and profiles for hosts. The connection can be established via a profile (double-click, Enter key or right-click `Connect`) or directly via the [connection](#connect) dialog. + +:::info + +Virtual Network Computing (VNC) is a remote display protocol that allows you to control the desktop environment of a computer remotely. VNC uses the Remote Frame Buffer (RFB) protocol to transmit keyboard and mouse events from the client to the server and screen updates from the server to the client. VNC is platform-independent and supports Windows, Linux and macOS. + +::: + +:::info + +TigerVNC is a high-speed version of VNC based on the RealVNC 4 and X.org code bases. TigerVNC started as a next-generation development effort for TightVNC on Unix and Linux platforms, but it split from its parent project in early 2009 so that TightVNC could focus on Windows platforms. TigerVNC supports a variant of Tight encoding that is greatly accelerated by the use of the libjpeg-turbo JPEG codec. See [TigerVNC repository](https://github.com/TigerVNC/tigervnc/) for more details. + +::: + +:::note + +TigerVNC must be installed on the local computer in order to use this feature. You can download the latest version of TigerVNC from the [official website](https://tigervnc.org/). + +::: + +![TigerVNC](../img/tigervnc.png) + +### Tab context menu + +Right-clicking a session tab opens a context menu: + +| Action | Description | +| ------------- | ------------------------------------------------------ | +| **Reconnect** | Restart TigerVNC and reconnect to the remote computer. | + +## Connect + +### Host + +Host to connect to via VNC. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** + +- `server-01.borntoberoot.net` +- `10.0.0.10` + +### Port + +TCP port to use for the VNC connection. + +**Type:** `Integer` [Min `1`, Max `65535`] + +**Default:** [`Settings > Port`](#port-3) + +## Profile + +### Inherit host from general + +Inherit the host from the general settings. + +**Type:** `Boolean` + +**Default:** `Enabled` + +:::note + +If this option is enabled, the [Host](#host-1) is overwritten by the host from the general settings and the [Host](#host-1) is disabled. + +::: + +### Host + +Host to connect to via VNC. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** + +- `server-01.borntoberoot.net` +- `10.0.0.10` + +### Port + +TCP port to use for the VNC connection. + +**Type:** `Integer` [Min `1`, Max `65535`] + +**Default:** `5900` + +## Group + +### Port + +TCP port to use for the VNC connection. + +**Type:** `Integer` [Min `1`, Max `65535`] + +**Default:** `5900` + +## Settings + +### File path + +Path to the TigerVNC executable. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** + +- `C:\path\to\vncviewer-x.x.x.exe` +- `C:\path\to\vncviewer64-x.x.x.exe` + +:::note + +The `Configure` button opens the TigerVNC application to configure it. + +::: + +### Port + +Default TCP port to use for the VNC connection. + +**Type:** `Integer` [Min `1`, Max `65535`] + +**Default:** `5900` diff --git a/Website/docs/application/traceroute.md b/Website/docs/application/traceroute.md new file mode 100644 index 0000000000..73d6abbf76 --- /dev/null +++ b/Website/docs/application/traceroute.md @@ -0,0 +1,142 @@ +--- +sidebar_position: 6 +description: "Trace the route packets take to reach a destination host using ICMP. NETworkManager Traceroute visualizes network hops and response times." +keywords: [NETworkManager, traceroute, network hops, route tracing, network path, ICMP trace, network diagnostics] +--- + +# Traceroute + +With the **Traceroute** you can trace the route to a host using ICMP echo requests to determine the network path and each intermediate hop. + +:::info + +Traceroute works by sending ICMP packets with incrementally increasing TTL (Time to Live) values. Each router along the path decrements the TTL by one; when it reaches zero, the router discards the packet and sends back an ICMP "time exceeded" message, revealing its address. This process repeats until the destination is reached. + +::: + +![Traceroute](../img/traceroute.png) + +### Example inputs + +- `server-01.borntoberoot.net` +- `10.0.0.1` + +### Context menu + +| Action | Description | +|--------|-------------| +| **Copy** | Copies the selected information to the clipboard | +| **Export...** | Exports the selected or all results to a file | + +### Map + +Below the hop list, a **Map** visualizes each resolved hop's geolocation on an offline world map. Consecutive hops are connected with curved, directional arrows showing the path the trace took. + +:::note + +The map is only shown if [Check IP geolocation](#check-ip-geolocation) and [Show map](#show-map) are both enabled — without a resolved geolocation, there is nothing to plot a hop's marker at. + +::: + +Hover a marker to show its details (location, ISP/ASN, hostname, IP address and average round-trip time) in the bottom-right info panel. Hovering an arrow shows just the source and destination location of that segment. + +You can interact with the map: + +| Action | Description | +|--------|-------------| +| **Mouse wheel** | Zoom in and out | +| **Left mouse button + drag** | Pan the map | +| **Reset** (top-right) | Resets pan/zoom to fit the current route | + +Click the **Map** toggle in the top-left corner to collapse or expand the map. + +## Profile + +### Inherit host from general + +Inherit the host from the general settings. + +**Type:** `Boolean` + +**Default:** `Enabled` + +:::note + +If this option is enabled, the [Host](#host) is overwritten by the host from the general settings and the [Host](#host) is disabled. + +::: + +### Host + +Hostname or IP address to trace the route to. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** + +- `server-01.borntoberoot.net` +- `1.1.1.1` + +## Settings + +### Maximum hops + +Maximum number of hops to search for the target. + +**Type:** `Integer` [Min `1`, Max `255`] + +**Default:** `30` + +### Timeout (ms) + +Timeout in milliseconds for each ICMP packet, after which the packet is considered lost. + +**Type:** `Integer` [Min `100`, Max `15000`] + +**Default:** `4000` + +### Buffer + +Buffer size of the ICMP packet. + +**Type:** `Integer` [Min `1`, Max `65535`] + +**Default:** `32` + +### Resolve hostname + +Resolve the hostname of the IP address (PTR lookup) for each hop. + +**Type:** `Boolean` + +**Default:** `Enabled` + +### Check IP geolocation + +Enables or disables the resolution of the IP geolocation for each hop via [`ip-api.com`](https://ip-api.com/). + +:::note + +The free API endpoint is limited to 45 requests per minute, supports only the `http` protocol and is available for non-commercial use only. + +::: + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Show map + +Shows the [Map](#map) below the hop list. + +:::note + +Only takes effect if [Check IP geolocation](#check-ip-geolocation) is also enabled — without it, no hop has a resolved geolocation to plot. + +::: + +**Type:** `Boolean` + +**Default:** `Enabled` diff --git a/Website/docs/application/wake-on-lan.md b/Website/docs/application/wake-on-lan.md new file mode 100644 index 0000000000..6458879d63 --- /dev/null +++ b/Website/docs/application/wake-on-lan.md @@ -0,0 +1,61 @@ +--- +sidebar_position: 19 +description: "Send magic packets to wake computers from sleep or shutdown states using NETworkManager Wake on LAN. Supports custom ports and broadcast addresses." +keywords: [NETworkManager, Wake on LAN, WoL, magic packet, remote wake, power on, network wake] +--- + +# Wake on LAN + +With **Wake on LAN** you can wake up a computer in the local network from a low power state. + +:::info + +Wake on LAN uses a magic packet starting with 6 bytes with the value `0xFF` followed by 16 repetitions of the MAC address of the computer to be woken up. The magic packet is sent on layer 2 to the broadcast address via port `9/UDP` of the network where the computer is located. The computer must be in a low power state in order to detect the magic packet and wake up. + +::: + +:::note + +The computer's network interface card (NIC) must support Wake on LAN and the feature must be enabled in the BIOS. The computer must also be connected to the network via cable — Wake on LAN does not work over WLAN. You may need to configure your firewall to allow the magic packet through. + +::: + +![Wake on LAN](../img/wake-on-lan.png) + +### Example inputs + +| MAC address | Broadcast address | Note | +|-------------|-------------------|------| +| `00:11:22:33:44:55` | `192.168.0.255` | Broadcast address of a `192.168.0.0/24` network | + +## Profile + +### MAC address + +MAC address of the device to wake up. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `00:11:22:33:44:55` + +### Broadcast + +Broadcast address of the network in which the device is located. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `192.168.0.255` + +## Settings + +### Port + +UDP port on which the magic packet is sent. + +**Type:** `Integer` [Min `1`, Max `65535`] + +**Default:** `9` diff --git a/Website/docs/application/web-console.md b/Website/docs/application/web-console.md new file mode 100644 index 0000000000..03dab959f3 --- /dev/null +++ b/Website/docs/application/web-console.md @@ -0,0 +1,90 @@ +--- +sidebar_position: 13 +description: "Browse web interfaces of network devices and servers using an embedded WebView2 browser." +keywords: + [ + NETworkManager, + web console, + embedded browser, + WebView2, + network device management, + web interface, + ] +--- + +# Web Console + +The **Web Console** allows you to browse the web interface of a host (e.g. server, switch, router, or dashboard) to view information or configure it. The connection can be established via a profile (double-click, Enter key or right-click `Connect`) or directly via the [connection](#connect) dialog. + +:::note + +WebView2 must be installed on the local computer in order to use this feature. You can download the latest version of WebView2 from the [official website](https://developer.microsoft.com/de-de/microsoft-edge/webview2/). + +::: + +![WebConsole](../img/web-console.png) + +### Tab context menu + +Right-clicking a session tab opens a context menu: + +| Action | Description | +| ---------- | ------------------- | +| **Reload** | Reload the website. | + +## Connect + +URL of the website to display in the web console. + +**Type:** `String` + +**Example:** `https://pihole.borntoberoot.net/admin/` + +## Profile + +### URL + +URL of the website to display in the web console. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `https://pihole.borntoberoot.net/admin/` + +:::note + +`{{Host}}` can be used to insert the profile's host (e.g. `https://{{Host}}/`). + +::: + +## Settings + +### Show address bar + +Show or hide the navigation / address bar. + +**Type:** `Boolean` + +**Default:** `Enabled` + +### Show status bar + +Show or hide the status bar in the bottom-left corner (e.g. to show the URL on hover). + +**Type:** `Boolean` + +**Default:** `Enabled` + +### Save credentials + +Enable or disable the option to save credentials in the WebView2 browser. This will display +a dialog similar to the one in Microsoft Edge when a website requests to save the login information. + +**Type:** `Boolean` + +**Default:** `Enabled` + +### Delete browsing data + +Button to delete the browsing data (e.g. history, cookies, cache, credentials, etc.) of the current WebView2 profile. diff --git a/Website/docs/application/whois.md b/Website/docs/application/whois.md new file mode 100644 index 0000000000..42a105d76f --- /dev/null +++ b/Website/docs/application/whois.md @@ -0,0 +1,68 @@ +--- +sidebar_position: 20 +description: "Look up domain registration and ownership details from TLD Whois servers using NETworkManager. Retrieves registrar, creation date, and nameservers." +keywords: [NETworkManager, Whois, domain lookup, domain registration, Whois query, domain information, domain owner] +--- + +# Whois + +With **Whois** you can retrieve Whois information for a domain directly from the Whois server associated with the top-level domain. + +:::info + +Whois data for a domain is publicly available and provided by the domain registrar. The Whois protocol is based on TCP and uses port 43. Data is transmitted as unencrypted plain text. Because the Whois protocol is not standardized, the format of the response may vary by registrar. + +::: + +:::note + +The firewall must allow outgoing TCP connections on port 43 to the Whois server associated with the top-level domain. For example, querying `borntoberoot.net` requires access to `whois.verisign-grs.com:43`. + +::: + +:::warning + +For .de domains, DENIC no longer provides information via the Whois protocol. + +::: + +![Whois](../img/whois.png) + +### Example inputs + +| Domain | Description | +|--------|-------------| +| `borntoberoot.net` | Query Whois information for a .net domain | + +### Context menu + +| Action | Description | +|--------|-------------| +| **Copy** | Copies the selected information to the clipboard | +| **Export...** | Exports the selected or all results to a file | + +## Profile + +### Inherit host from general + +Inherit the host from the general settings. + +**Type:** `Boolean` + +**Default:** `Enabled` + +:::note + +If this option is enabled, the [domain](#domain) is overwritten by the host from the general settings and the [domain](#domain) is disabled. + +::: + +### Domain + +Domain to query for Whois information. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `borntoberoot.net` diff --git a/Website/docs/application/wifi.md b/Website/docs/application/wifi.md new file mode 100644 index 0000000000..f43bee8866 --- /dev/null +++ b/Website/docs/application/wifi.md @@ -0,0 +1,77 @@ +--- +sidebar_position: 2 +description: "Analyze available WiFi networks, including channels, signal strength, and encryption details across the 2.4, 5, and 6 GHz bands." +keywords: + [ + NETworkManager, + WiFi analyzer, + wireless networks, + WiFi channels, + signal strength, + WiFi scanner, + 5GHz, + 6GHz, + ] +--- + +# WiFi + +The **WiFi** tool shows available wireless networks, including channel, signal strength, and encryption details. + +Hidden wireless networks are shown as `Hidden Network`. + +:::info + +Wi-Fi is a wireless networking technology based on IEEE 802.11 standards. Access points periodically advertise network information (such as SSID and security capabilities), which clients can scan and display. + +::: + +## WiFi + +On the **WiFi** tab, you can select which wireless adapter is used for scanning. Results can be filtered by the 2.4 GHz, 5 GHz, and 6 GHz bands. + +In the search field, you can filter wireless networks by `SSID`, `Security`, `Frequency`, `Channel`, `BSSID (MAC Address)`, `Vendor`, and `PHY kind`. Search is case-insensitive. + +:::note + +Starting with Windows 11 24H2, you must allow access to the Wi-Fi adapter. + +Open `Windows Settings > Privacy & security > Location`, enable access for Desktop Apps / NETworkManager, then restart the application. + +::: + +![WiFi](../img/wifi.png) + +### Context menu + +| Action | Description | +| -------------- | ---------------------------------------------------------------------------------- | +| **Connect...** | Opens a dialog to connect to the selected wireless network (only if not connected) | +| **Disconnect** | Disconnects from the selected wireless network (only if connected) | +| **Export...** | Opens a dialog to export the selected or all wireless networks to a file | +| **Copy** | Copies the selected information to the clipboard | + +### Keyboard shortcuts + +| Key | Action | +| ---- | ----------------- | +| `F5` | Scan for networks | + +## Channels + +On the **Channels** tab, all wireless networks of the selected wireless adapter are displayed in a graphical view with channel, channel width, and signal strength. This helps identify overlapping wireless networks that do not originate from the same access point. + +The tab is split into two sub-tabs: + +- **2.4 & 5 GHz** — shows networks on the 2.4 GHz and 5 GHz bands in a single chart each. +- **6 GHz** — shows 6 GHz networks in two separate charts: lower channels (1–125) and upper channels (129–233). + +Each network is drawn as a proportional band reflecting its channel width (20, 40, 80, or 160 MHz), so overlapping networks can be identified more accurately. + +![WiFi - Channel](../img/wifi--channel.png) + +:::note + +Move the mouse over a network band to display details such as SSID, channel, channel width, and signal strength in a tooltip. + +::: diff --git a/Website/docs/changelog/2022-10-31-0.md b/Website/docs/changelog/2022-10-31-0.md new file mode 100644 index 0000000000..1b97e1cd64 --- /dev/null +++ b/Website/docs/changelog/2022-10-31-0.md @@ -0,0 +1,84 @@ +--- +sidebar_position: 997 +description: "Changelog for NETworkManager 2022.10.31.0 — release notes with new features, improvements, and bug fixes." +keywords: [NETworkManager, changelog, release notes, 2022.10.31.0, update] +--- + +# 2022.10.31.0 + +Version: **2022.10.31.0**
+Release date: **31.10.2022** + +| File | `SHA256` | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| [`NETworkManager_2022.10.31.0_Setup.exe`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2022.10.31.0/NETworkManager_2022.10.31.0_Setup.exe) | `18A9528247BFA1880AF61CEAA1401FCA7C8271BC6635B40BA72D77AB065867A0` | +| [`NETworkManager_2022.10.31.0_Portable.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2022.10.31.0/NETworkManager_2022.10.31.0_Portable.zip) | `7B5822191C1D8EB0DE8F223AA1AC581CFEB4ED726F652A3A8A7D0941A51BE68F` | +| [`NETworkManager_2022.10.31.0_Archive.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2022.10.31.0/NETworkManager_2022.10.31.0_Archive.zip) | `4F1B60B42A1D935B56C0F044755DD5B3EB3DAE35C75961D0CD7FFFFB87596847` | + +**System requirements** + +- Windows 10 / Server x64 (1809 or later) +- [.NET Desktop Runtime 6.x (LTS)](https://dotnet.microsoft.com/download/dotnet/6.0) +- (optional) [Microsoft Edge - WebView2 Runtime (Evergreen)](https://developer.microsoft.com/en-us/microsoft-edge/webview2/) + +## What's new? + +- **AWS (Systems Manager) Session Manager** [#1544](https://github.com/BornToBeRoot/NETworkManager/pull/1544) (See [documentation](https://borntoberoot.net/NETworkManager/docs/application/aws-session-manager) for more details) +- PowerShell & AWS Session Manager + - Added an option under `Settings > General > Appearance` to modify the global PowerShell profile(s) to match the application theme. This customizes the background of the embedded powershell and integrates it better into the application. [#1613](https://github.com/BornToBeRoot/NETworkManager/pull/1613) +- PowerShell & PuTTY + - Focus embedded window when the application has received the focus [#1515](https://github.com/BornToBeRoot/NETworkManager/pull/1515) + - Focus embedded window when application is selected again [#1515](https://github.com/BornToBeRoot/NETworkManager/pull/1515) + - Focus embedded window when switching tabs [#1515](https://github.com/BornToBeRoot/NETworkManager/pull/1515) + +## Improvements + +- IPScanner, PortScanner, DNSServers + - Generate default lists at first run [#1544](https://github.com/BornToBeRoot/NETworkManager/pull/1544) +- Port Scanner + - Add more port profiles (LDAP, HTTP proxy, Filetransfer) [#1526](https://github.com/BornToBeRoot/NETworkManager/pull/1526) +- PowerShell + - Change default path on new installations to `pwsh.exe` (Windows PowerShell is used as fallback if `pwsh.exe` is not available) [#1663](https://github.com/BornToBeRoot/NETworkManager/pull/1663) +- PuTTY + - Detect if PuTTY is installed at first run [#1542](https://github.com/BornToBeRoot/NETworkManager/pull/1542) +- Discovery Protocol + - Add local connection & local interface to output [#1533](https://github.com/BornToBeRoot/NETworkManager/pull/1533) +- Settings > Language + - Improve application restart [#1599](https://github.com/BornToBeRoot/NETworkManager/pull/1599) +- Settings > Update + - Disable ToggleSwitch `Start minimized in tray` if Autostart is disabled [#1607](https://github.com/BornToBeRoot/NETworkManager/pull/1607) +- Settings > Update + - Option to check for pre-releases added [#1574](https://github.com/BornToBeRoot/NETworkManager/pull/1574) +- Profiles > Group Dialog + - Remove checkboxes in group dialog [#1530](https://github.com/BornToBeRoot/NETworkManager/pull/1530) +- log4net added for error handling (Log file: `%LocalAppData%\NETworkManager\NETworkManager.log`) [#1539](https://github.com/BornToBeRoot/NETworkManager/pull/1539) +- Help Button + - Add links to settings pages under https://borntoberoot.net/NETworkManager/docs/category/settings [#1607](https://github.com/BornToBeRoot/NETworkManager/pull/1607) + +## Bugfixes + +- Dashboard / Status Window + - Handle null exception properly [#1510](https://github.com/BornToBeRoot/NETworkManager/pull/1510) + - Cannot set custom IPv4 API [#1613](https://github.com/BornToBeRoot/NETworkManager/pull/1613) +- Traceroute + - Hops were skipped if they did not respond to ping [#1528](https://github.com/BornToBeRoot/NETworkManager/pull/1528) +- Ping Monitor + - Allow export of all results only (hide other option in dialog as it has no effect) [#1611](https://github.com/BornToBeRoot/NETworkManager/pull/1611) +- Ping Monitor, Traceroute & SNMP + - IPv6 is now resolved when selected in the settings [#1529](https://github.com/BornToBeRoot/NETworkManager/pull/1529) +- Remote Desktop, PowerShell, PuTTY & TigerVNC + - "Unlock profile" dialog is now displayed correctly if an embedded window is already open [#1515](https://github.com/BornToBeRoot/NETworkManager/pull/1515) +- PowerShell & TigerVNC + - Embedded window is now resized correctly after the inital connect [#1515](https://github.com/BornToBeRoot/NETworkManager/pull/1515) +- Export dialog + - The "Export" button was disabled if the path contained special characters [#1611](https://github.com/BornToBeRoot/NETworkManager/pull/1611) +- Settings > Profiles + - App crash fixed when a profile file is deleted and an encrypted but locked profile file is selected [#1512](https://github.com/BornToBeRoot/NETworkManager/pull/1512) + - Reselect group/profile on refresh (e.g. if profiles page is opened again) [#1516](https://github.com/BornToBeRoot/NETworkManager/pull/1516) + - App crash fixed when no group is selected and the profile file changes [#1610](https://github.com/BornToBeRoot/NETworkManager/pull/1610) + +## Dependencies, Refactoring & Documentation + +- Code cleanup [#1515](https://github.com/BornToBeRoot/NETworkManager/pull/1515) [#1599](https://github.com/BornToBeRoot/NETworkManager/pull/1600) [#1600](https://github.com/BornToBeRoot/NETworkManager/pull/1599) +- Language files updated via [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration) +- Dependencies updated via [#dependabot](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Fdependabot) diff --git a/Website/docs/changelog/2022-12-20-0.md b/Website/docs/changelog/2022-12-20-0.md new file mode 100644 index 0000000000..c08184e6e1 --- /dev/null +++ b/Website/docs/changelog/2022-12-20-0.md @@ -0,0 +1,61 @@ +--- +sidebar_position: 996 +description: "Changelog for NETworkManager 2022.12.20.0 — release notes with new features, improvements, and bug fixes." +keywords: [NETworkManager, changelog, release notes, 2022.12.20.0, update] +--- + +# 2022.12.20.0 + +Version: **2022.12.20.0**
+Release date: **20.12.2022** + +| File | `SHA256` | +| ---------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| [`NETworkManager_2022.12.20.0_Setup.exe`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2022.12.20.0/NETworkManager_2022.12.20.0_Setup.exe) | `36F915D917DF6461CB52C1524F3E7373EC0BC40D3A48E9D28E3D02BAA416E369` | +| [`NETworkManager_2022.12.20.0_Portable.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2022.12.20.0/NETworkManager_2022.12.20.0_Portable.zip) | `5A5553BF3609749C1214B8B724857AE954C4F8881907BD0DE5F1C44E48D2CEFA` | +| [`NETworkManager_2022.12.20.0_Archive.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2022.12.20.0/NETworkManager_2022.12.20.0_Archive.zip) | `29D6EE0FD1A822E5CF45F0A175A0CECAE22C64F5551CCBB117C5EE76DC07DF61` | + +**System requirements** + +- Windows 10 / Server x64 (1809 or later) +- [.NET Desktop Runtime 6.x (LTS)](https://dotnet.microsoft.com/download/dotnet/6.0) + +## Breaking Changes + +- IP Scanner + - Custom DNS server settings have been replaced by the global application DNS settings under `Settings > Network > DNS`. [#1733](https://github.com/BornToBeRoot/NETworkManager/pull/1733) + +## What's new? + +- **Bit Calculator** [#1684](https://github.com/BornToBeRoot/NETworkManager/pull/1684) (See [documentation](https://borntoberoot.net/NETworkManager/docs/application/bit-calculator) for more details) +- Global application DNS settings under `Settings > Network > DNS` added [#1733](https://github.com/BornToBeRoot/NETworkManager/pull/1733) + +## Improvements + +- Performance of DNS resolutions improved [#1733](https://github.com/BornToBeRoot/NETworkManager/pull/1733) +- Detect new DNS servers if they have been changed e.g. by a new network connection (LAN, WLAN) or VPN connection [#1733](https://github.com/BornToBeRoot/NETworkManager/pull/1733) +- Error messages for failed DNS resolution improved [#1733](https://github.com/BornToBeRoot/NETworkManager/pull/1733) +- Check if folder exists in export dialog [#1760](https://github.com/BornToBeRoot/NETworkManager/pull/1760) +- AWS Sesdsion Manager, PowerShell, PuTTY & TigerVNC + - Validate path to required tool [#1771](https://github.com/BornToBeRoot/NETworkManager/pull/1771) +- Settings + - Remove second dialog (restart the app immediately) [#1770](https://github.com/BornToBeRoot/NETworkManager/pull/1770) +- First run dialog + - PowerShell theme added [#1761](https://github.com/BornToBeRoot/NETworkManager/pull/1761) + +## Bugfixes + +- IP Scanner & Port scanner + - Error message was not displayed when a single hostname could not be resolved [#1733](https://github.com/BornToBeRoot/NETworkManager/pull/1733) +- Fixed a bug in Dragablz that in certain circumstances locks the tab when you right-click on it and try to move it (See [#132](https://github.com/ButchersBoy/Dragablz/issues/132) & [#1702](https://github.com/BornToBeRoot/NETworkManager/issues/1702) for more details) [#1712](https://github.com/BornToBeRoot/NETworkManager/pull/1712) +- Lookup - OUI, Lookup + - Input cannot end with ";" [#1515](https://github.com/BornToBeRoot/NETworkManager/pull/1515) +- Installer + - Encoding für chinese language files fixed [#1413](https://github.com/BornToBeRoot/NETworkManager/issues/1413) [#1769](https://github.com/BornToBeRoot/NETworkManager/pull/1769) + +## Dependencies, Refactoring & Documentation + +- Language files updated via [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration) +- Dependencies updated via [#dependabot](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Fdependabot) +- Docs improved +- Code cleanup diff --git a/docs/Changelog/2022-2-22-0.md b/Website/docs/changelog/2022-2-22-0.md similarity index 53% rename from docs/Changelog/2022-2-22-0.md rename to Website/docs/changelog/2022-2-22-0.md index abe40f87be..1c8d53421f 100644 --- a/docs/Changelog/2022-2-22-0.md +++ b/Website/docs/changelog/2022-2-22-0.md @@ -1,26 +1,24 @@ --- -layout: default -title: 2022.2.22.0 -parent: Changelog -nav_order: 981 -description: "Changelog for 2022.2.22.0" -permalink: /Changelog/2022-2-22-0 +sidebar_position: 999 +description: "Changelog for NETworkManager 2022.2.22.0 — release notes with new features, improvements, and bug fixes." +keywords: [NETworkManager, changelog, release notes, 2022.2.22.0, update] --- -# Version 2022.2.22.0 -Date: **22.2.2022** +# 2022.2.22.0 -| File | Checksum [SHA256] | -|---|---| -|[Setup](https://github.com/BornToBeRoot/NETworkManager/releases/download/2022.2.22.0/NETworkManager_2022.2.22.0_Setup.exe){:target="_blank"}| `F0CF905B14622588E658977BC2E7B85042858FA4191CDAEF4F84C1BAE2DC9311` | -|[Portable](https://github.com/BornToBeRoot/NETworkManager/releases/download/2022.2.22.0/NETworkManager_2022.2.22.0_Portable.zip){:target="_blank"}| `241F02978697BAF2E8BD695671D5197C081CB44C5D52925BC30CC3CECF0A4592` | -|[Archive](https://github.com/BornToBeRoot/NETworkManager/releases/download/2022.2.22.0/NETworkManager_2022.2.22.0_Archive.zip){:target="_blank"}| `DC5FC8FF4FC61E21F9D795B39E28C8CCDEC2FD4F01323031F27D691A93563CF8` | +Version: **2022.2.22.0**
+Release date: **22.2.2022** -:warning: [BREAKING CHANGE] :warning: +| File | `SHA256` | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| [`NETworkManager_2022.2.22.0_Setup.exe`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2022.2.22.0/NETworkManager_2022.2.22.0_Setup.exe) | `F0CF905B14622588E658977BC2E7B85042858FA4191CDAEF4F84C1BAE2DC9311` | +| [`NETworkManager_2022.2.22.0_Portable.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2022.2.22.0/NETworkManager_2022.2.22.0_Portable.zip) | `241F02978697BAF2E8BD695671D5197C081CB44C5D52925BC30CC3CECF0A4592` | +| [`NETworkManager_2022.2.22.0_Archive.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2022.2.22.0/NETworkManager_2022.2.22.0_Archive.zip) | `DC5FC8FF4FC61E21F9D795B39E28C8CCDEC2FD4F01323031F27D691A93563CF8` | **Read this before upgrading from 2021.11.30.0 and earlier to 2022.2.22.0 or later!** The profile (file) has been updated and needs to be migrated: + 1. The encryption of the profile file(s) must be disabled in the currently installed version. 2. Then the update can be installed as usual. 3. At the first startup the loading of the profiles fails and a PowerShell script can be started to migrate the profiles. @@ -29,14 +27,17 @@ The profile (file) has been updated and needs to be migrated: Note: _Steps 1 and 4 can be skipped if the profiles are not encrypted._ **System requirements** + - Windows 10 / Server x64 (1809 or later) -- [.NET Desktop Runtime 6.x (LTS)](https://dotnet.microsoft.com/download/dotnet/6.0){:target="_blank"} -- [Microsoft Edge - WebView2 Runtime (Evergreen)](https://developer.microsoft.com/en-us/microsoft-edge/webview2/){:target="_blank"} +- [.NET Desktop Runtime 6.x (LTS)](https://dotnet.microsoft.com/download/dotnet/6.0) +- (optional) [Microsoft Edge - WebView2 Runtime (Evergreen)](https://developer.microsoft.com/en-us/microsoft-edge/webview2/) ## What's new? -- New Icon/Logo for the application [#1362](https://github.com/BornToBeRoot/NETworkManager/pull/1362){:target="_blank"} [#1371](https://github.com/BornToBeRoot/NETworkManager/pull/1371){:target="_blank"} -- Profiles reworked [BREAKING CHANGE] [#1236](https://github.com/BornToBeRoot/NETworkManager/pull/1236){:target="_blank"}
+ +- New Icon/Logo for the application [#1362](https://github.com/BornToBeRoot/NETworkManager/pull/1362) [#1371](https://github.com/BornToBeRoot/NETworkManager/pull/1371) +- Profiles reworked [BREAKING CHANGE] [#1236](https://github.com/BornToBeRoot/NETworkManager/pull/1236)
Group-specific settings can now be set for: + - Remote Desktop (Credentials for a group of servers, Settings) - PowerShell (Settings) - PuTTY (Settings) @@ -45,38 +46,41 @@ Note: _Steps 1 and 4 can be skipped if the profiles are not encrypted._ The inheritance works as follows: General Settings > Group settings > Profile settings (Profile overwrites group, group overwrites general settings) **The profiles are migrated with a PowerShell script when the app is executed for the first time / when the profiles are loaded. To do this, they must first be decrypted in an old version.** - + - PuTTY - - Custom profile `NETworkManager` will be added to the registry (`HCKU\Software\SimonTatham\PuTTY\Sessions\NETworkManager`) which will set the PuTTY background to the application background [#1358](https://github.com/BornToBeRoot/NETworkManager/pull/1358){:target="_blank"} [#1236](https://github.com/BornToBeRoot/NETworkManager/pull/1236){:target="_blank"} - - Add context menu button (right click on the tab) to fix the PuTTY embedded window size [#1366](https://github.com/BornToBeRoot/NETworkManager/pull/1366){:target="_blank"} - - Try to automatically fix the embedded window size after the initial connect [#1236](https://github.com/BornToBeRoot/NETworkManager/pull/1236){:target="_blank"} [#1376](https://github.com/BornToBeRoot/NETworkManager/pull/1376){:target="_blank"} - + - Custom profile `NETworkManager` will be added to the registry (`HCKU\Software\SimonTatham\PuTTY\Sessions\NETworkManager`) which will set the PuTTY background to the application background [#1358](https://github.com/BornToBeRoot/NETworkManager/pull/1358) [#1236](https://github.com/BornToBeRoot/NETworkManager/pull/1236) + - Add context menu button (right click on the tab) to fix the PuTTY embedded window size [#1366](https://github.com/BornToBeRoot/NETworkManager/pull/1366) + - Try to automatically fix the embedded window size after the initial connect [#1236](https://github.com/BornToBeRoot/NETworkManager/pull/1236) [#1376](https://github.com/BornToBeRoot/NETworkManager/pull/1376) + ## Improvements -- Profile page in settings improved [#1236](https://github.com/BornToBeRoot/NETworkManager/pull/1236){:target="_blank"} -- Validation of entries in the profile dialog improved [#1236](https://github.com/BornToBeRoot/NETworkManager/pull/1236){:target="_blank"} [#1283](https://github.com/BornToBeRoot/NETworkManager/issues/1283){:target="_blank"} -- Minimum required window size reduced to 800x600 [#1366](https://github.com/BornToBeRoot/NETworkManager/pull/1366){:target="_blank"} [#1275](https://github.com/BornToBeRoot/NETworkManager/issues/1275){:target="_blank"} -- Default history entries increased from 5 to 10 [#1372](https://github.com/BornToBeRoot/NETworkManager/issues/1372){:target="_blank"} -- Default background job time decreased from 15 to 5 minutes (save settings, profiles in background and not only when closing the application) [#1236](https://github.com/BornToBeRoot/NETworkManager/pull/1236){:target="_blank"} -- Edit group button in the profiles list is not visible when the group name is longer than the width of the profiles list [#1236](https://github.com/BornToBeRoot/NETworkManager/pull/1236){:target="_blank"} + +- Profile page in settings improved [#1236](https://github.com/BornToBeRoot/NETworkManager/pull/1236) +- Validation of entries in the profile dialog improved [#1236](https://github.com/BornToBeRoot/NETworkManager/pull/1236) [#1283](https://github.com/BornToBeRoot/NETworkManager/issues/1283) +- Minimum required window size reduced to 800x600 [#1366](https://github.com/BornToBeRoot/NETworkManager/pull/1366) [#1275](https://github.com/BornToBeRoot/NETworkManager/issues/1275) +- Default history entries increased from 5 to 10 [#1372](https://github.com/BornToBeRoot/NETworkManager/issues/1372) +- Default background job time decreased from 15 to 5 minutes (save settings, profiles in background and not only when closing the application) [#1236](https://github.com/BornToBeRoot/NETworkManager/pull/1236) +- Edit group button in the profiles list is not visible when the group name is longer than the width of the profiles list [#1236](https://github.com/BornToBeRoot/NETworkManager/pull/1236) - Port Scanner - - MySQL and PostgreSQL ports added to port profile [4334b64](https://github.com/BornToBeRoot/NETworkManager/commit/4334b649e0f73ab419e524f50c438b128288d8e3){:target="_blank"} + - MySQL and PostgreSQL ports added to port profile [4334b64](https://github.com/BornToBeRoot/NETworkManager/commit/4334b649e0f73ab419e524f50c438b128288d8e3) ## Bugfixes -- Visibility of the min/max/close button on the pulled out window fixed [#1366](https://github.com/BornToBeRoot/NETworkManager/pull/1366){:target="_blank"} -- App crash when building with SDK .NET 6.0.2 and running the app on 6.0.0 or 6.0.1 fixed [#1236](https://github.com/BornToBeRoot/NETworkManager/pull/1236){:target="_blank"} [#1381](https://github.com/BornToBeRoot/NETworkManager/issues/1381){:target="_blank"} -- App crash when renaming a profile file fixed [#1318](https://github.com/BornToBeRoot/NETworkManager/issues/1318){:target="_blank"} -- Language `zh-CN` and `zh-TW` is missing in dotnet publish. Build script changed from `dotnet` to `msbuild` [#1316](https://github.com/BornToBeRoot/NETworkManager/issues/1316){:target="_blank"} -- Remote Desktop - - Connection via Profile leads to error message "Error Code 4 (Total login limit was reached)" fixed [#1265](https://github.com/BornToBeRoot/NETworkManager/issues/1265){:target="_blank"} + +- Visibility of the min/max/close button on the pulled out window fixed [#1366](https://github.com/BornToBeRoot/NETworkManager/pull/1366) +- App crash when building with SDK .NET 6.0.2 and running the app on 6.0.0 or 6.0.1 fixed [#1236](https://github.com/BornToBeRoot/NETworkManager/pull/1236) [#1381](https://github.com/BornToBeRoot/NETworkManager/issues/1381) +- App crash when renaming a profile file fixed [#1318](https://github.com/BornToBeRoot/NETworkManager/issues/1318) +- Language `zh-CN` and `zh-TW` is missing in dotnet publish. Build script changed from `dotnet` to `msbuild` [#1316](https://github.com/BornToBeRoot/NETworkManager/issues/1316) +- Remote Desktop + - Connection via Profile leads to error message "Error Code 4 (Total login limit was reached)" fixed [#1265](https://github.com/BornToBeRoot/NETworkManager/issues/1265) - PowerShell - - Validate host input in connect dialog [#1373](https://github.com/BornToBeRoot/NETworkManager/issues/1373){:target="_blank"} + - Validate host input in connect dialog [#1373](https://github.com/BornToBeRoot/NETworkManager/issues/1373) - PuTTY - - Fixed that some arguments from the connect dialog of PuTTY (like privatekey) were not applied correctly. Fix was also applied to remote desktop, powershell, tigervnc and webconsole, even if the bug could not be reproduced there. [#1372](https://github.com/BornToBeRoot/NETworkManager/issues/1372){:target="_blank"} + - Fixed that some arguments from the connect dialog of PuTTY (like privatekey) were not applied correctly. Fix was also applied to remote desktop, powershell, tigervnc and webconsole, even if the bug could not be reproduced there. [#1372](https://github.com/BornToBeRoot/NETworkManager/issues/1372) + +## Dependencies, Refactoring & Documentation -## Other - Code refactoring, Cleanup, etc. -- Language files updated [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration){:target="_blank"} -- Dependencies updated [#dependencies](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Fdependabot){:target="_blank"} -- Update OUI list [f2f6e77](https://github.com/BornToBeRoot/NETworkManager/commit/f2f6e77e2bae2fc30f6dcfe9e9ceeb759d2e2f70){:target="_blank"} -- Update Whois list [f2f6e77](https://github.com/BornToBeRoot/NETworkManager/commit/f2f6e77e2bae2fc30f6dcfe9e9ceeb759d2e2f70){:target="_blank"} -- Update Ports list [f2f6e77](https://github.com/BornToBeRoot/NETworkManager/commit/f2f6e77e2bae2fc30f6dcfe9e9ceeb759d2e2f70){:target="_blank"} +- Language files updated via [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration) +- Dependencies updated via [#dependabot](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Fdependabot) +- Update OUI list [f2f6e77](https://github.com/BornToBeRoot/NETworkManager/commit/f2f6e77e2bae2fc30f6dcfe9e9ceeb759d2e2f70) +- Update Whois list [f2f6e77](https://github.com/BornToBeRoot/NETworkManager/commit/f2f6e77e2bae2fc30f6dcfe9e9ceeb759d2e2f70) +- Update Ports list [f2f6e77](https://github.com/BornToBeRoot/NETworkManager/commit/f2f6e77e2bae2fc30f6dcfe9e9ceeb759d2e2f70) diff --git a/Website/docs/changelog/2022-8-18-0.md b/Website/docs/changelog/2022-8-18-0.md new file mode 100644 index 0000000000..cb81bc21b1 --- /dev/null +++ b/Website/docs/changelog/2022-8-18-0.md @@ -0,0 +1,59 @@ +--- +sidebar_position: 998 +description: "Changelog for NETworkManager 2022.8.18.0 — release notes with new features, improvements, and bug fixes." +keywords: [NETworkManager, changelog, release notes, 2022.8.18.0, update] +--- + +# 2022.8.18.0 + +Version: **2022.8.18.0**
+Release date: **18.8.2022** + +| File | `SHA256` | +| -------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| [`NETworkManager_2022.8.18.0_Setup.exe`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2022.8.18.0/NETworkManager_2022.8.18.0_Setup.exe) | `F705C66072E98E011CAA1EAC3C8B085DBB58CF9476EF9E50490CE526522BA6AA` | +| [`NETworkManager_2022.8.18.0_Portable.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2022.8.18.0/NETworkManager_2022.8.18.0_Portable.zip) | `56CFA317D1123C191C443F7950A0096D0CA1F1A6D93EEB9B6C9128EFF6C3EF07` | +| [`NETworkManager_2022.8.18.0_Archive.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2022.8.18.0/NETworkManager_2022.8.18.0_Archive.zip) | `1C778ED1EF28A18315B8B5581F3BF9D14F282CE6D4521FE98F0057DAE2AFC30A` | + +**System requirements** + +- Windows 10 / Server x64 (1809 or later) +- [.NET Desktop Runtime 6.x (LTS)](https://dotnet.microsoft.com/download/dotnet/6.0) +- (optional) [Microsoft Edge - WebView2 Runtime (Evergreen)](https://developer.microsoft.com/en-us/microsoft-edge/webview2/) + +## What's new? + +- Logo / Icon changed [#1454](https://github.com/BornToBeRoot/NETworkManager/pull/1454) +- Settings + - Add support for [MahApps.Metro custom themes](https://mahapps.com/docs/themes/thememanager#creating-custom-themes). Themes can be placed in the folder `Themes` in the application root [#1462](https://github.com/BornToBeRoot/NETworkManager/pull/1462) + +## Improvements + +- Profiles + - Migration dialog improved [#1393](https://github.com/BornToBeRoot/NETworkManager/pull/1393) + - Select app when creating a profile [#1466](https://github.com/BornToBeRoot/NETworkManager/pull/1466) +- Port Scanner + - Generate Port list at first run [#1464](https://github.com/BornToBeRoot/NETworkManager/pull/1464) +- DNS Lookup + - Generate DNS server list at first run [#1464](https://github.com/BornToBeRoot/NETworkManager/pull/1464) +- PowerShell + - Resize PowerShell window [#1505](https://github.com/BornToBeRoot/NETworkManager/pull/1505) + +## Bugfixes + +- Dashboard & Status Window + - Detect local ipv6 address fixed [#1423](https://github.com/BornToBeRoot/NETworkManager/pull/1423) +- IP Scanner & OUI Lookup + - Use ieee.org instead of linuxnet.ca to generate the oui.txt [#1463](https://github.com/BornToBeRoot/NETworkManager/pull/1463) +- Remote Desktop & PuTTY + - Override host doesn't set the correct hostname [#1505](https://github.com/BornToBeRoot/NETworkManager/pull/1505) +- Profiles + - Fixed some rare cases where the profile file was overwritten [#1449](https://github.com/BornToBeRoot/NETworkManager/pull/1449) + - Header in add group dialog fixed [#1461](https://github.com/BornToBeRoot/NETworkManager/pull/1461) +- Settings + - Fix and improve settings move, import, export and reset [#1465](https://github.com/BornToBeRoot/NETworkManager/pull/1465) + +## Dependencies, Refactoring & Documentation + +- Language files updated via [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration) +- Dependencies updated via [#dependabot](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Fdependabot) diff --git a/Website/docs/changelog/2023-11-28-0.md b/Website/docs/changelog/2023-11-28-0.md new file mode 100644 index 0000000000..12b43d4b91 --- /dev/null +++ b/Website/docs/changelog/2023-11-28-0.md @@ -0,0 +1,114 @@ +--- +sidebar_position: 990 +description: "Changelog for NETworkManager 2023.11.28.0 — release notes with new features, improvements, and bug fixes." +keywords: [NETworkManager, changelog, release notes, 2023.11.28.0, update] +--- + +# 2023.11.28.0 + +Version: **2023.11.28.0**
+Release date: **28.11.2023** + +| File | `SHA256` | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| [`NETworkManager_2023.11.28.0_Setup.exe`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2023.11.28.0/NETworkManager_2023.11.28.0_Setup.exe) | `AD9D6E569BFA61F9657A6C823409E4D4B4B67CA4BD0CC5129CCBB0B673D5DF24` | +| [`NETworkManager_2023.11.28.0_Portable.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2023.11.28.0/NETworkManager_2023.11.28.0_Portable.zip) | `8D15ECE18013C07D806173E051FFA79406A6B5D6D00D1CD48F403C8BDBF7136F` | +| [`NETworkManager_2023.11.28.0_Archive.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2023.11.28.0/NETworkManager_2023.11.28.0_Archive.zip) | `39FAC00FBB16D6EFCC3AB571B42AE61C8789E500059F3ED893CE38BFA06CD189` | + +**System requirements** + +- Windows 10 / Server x64 (1809 or later) +- [.NET Desktop Runtime 8.0 (LTS) - x64](https://dotnet.microsoft.com/en-us/download/dotnet/8.0/runtime) + +## Breaking Changes + +- Migrated from .NET 6.0 (LTS) to .NET 8.0 (LTS). + Upgrade your [.NET Desktop Runtime to version 8.0 (LTS) - x64](https://dotnet.microsoft.com/en-us/download/dotnet/8.0/runtime) before you install this version. [#2560](https://github.com/BornToBeRoot/NETworkManager/pull/2560) +- Settings will be reset to default values due to refactoring [#2483](https://github.com/BornToBeRoot/NETworkManager/pull/2483) +- Profiles and settings migration (introduced in `2023.3.7.0`) from `%AppData%\NETworkManager` to `%UserProfile%\Documents\NETworkManager` removed. If you use a version before `2023.3.7.0` you have to install and start version `2023.6.27.1` before you install this version. [#2380](https://github.com/BornToBeRoot/NETworkManager/pull/2380) +- Remove profile migration script to migrate from `2021.11.30.0` and before to a later version [#2388](https://github.com/BornToBeRoot/NETworkManager/pull/2388) + +## What's new? + +- Dashboard + - Check IP geolocation added [#2392](https://github.com/BornToBeRoot/NETworkManager/pull/2392) + - Check DNS resolver added [#2392](https://github.com/BornToBeRoot/NETworkManager/pull/2392) +- Traceroute + - Check IP geolocation for each public IP address added. Feature can be enabled/disabled in settings [#2477](https://github.com/BornToBeRoot/NETworkManager/pull/2477) +- IP Geolocation added [#2522](https://github.com/BornToBeRoot/NETworkManager/pull/2522) (See [documentation](https://borntoberoot.net/NETworkManager/docs/application/ip-geolocation) for more details) + +## Experimental features + +- Run command (HotKey: Ctrl+Shift+P) added. This feature allows you to open a command field to switch between applications and pass parameters to them. + +:::info + +Experimental features can be enabled in the settings under [`Settings > Update`](/docs/settings/update#experimental-features). + +::: + +## Improvements + +- WiFi + - MAC address renamed to BSSID [#2483](https://github.com/BornToBeRoot/NETworkManager/pull/2483) + - Values of a WiFi network can now be copied to clipboard via right click context menu [#2483](https://github.com/BornToBeRoot/NETworkManager/pull/2483) +- IP Scanner + - Row can now be expanded / collapsed via button on the left side. Row is no longer expanded when selecting a row [#2483](https://github.com/BornToBeRoot/NETworkManager/pull/2483) + - Timestamp added to view and export (export format has changed for `csv`, `json` and `xml`) [#2483](https://github.com/BornToBeRoot/NETworkManager/pull/2483) + - Show status message if no reachable host was found [#2483](https://github.com/BornToBeRoot/NETworkManager/pull/2483) +- Port Scanner + - Show status message if no open port was found [#2483](https://github.com/BornToBeRoot/NETworkManager/pull/2483) +- SNMP + - Error handling improved and SNMP v3 error codes (Auth failed, etc.) added [#2547](https://github.com/BornToBeRoot/NETworkManager/pull/2547) +- Lookup - Ports + - Search by port number and protocol (e.g. `22/tcp` or `161-162/udp`) added [#2483](https://github.com/BornToBeRoot/NETworkManager/pull/2483) +- Profiles + - Add unlock button to profile views [#2538](https://github.com/BornToBeRoot/NETworkManager/pull/2538) + +## Bugfixes + +- Dashboard + - IPv6 API call fixed [#2522](https://github.com/BornToBeRoot/NETworkManager/pull/2522) +- Network Interface + - Add missing scrollviewer in configure tab [#2410](https://github.com/BornToBeRoot/NETworkManager/pull/2410) +- WiFi + - Fix an issue where the UI was broken if a WiFi adapter was found that has no assiciated network interface (e.g. if the WiFi adapter is associated with a network bridge). The WiFi adapter is now ignored [#2483](https://github.com/BornToBeRoot/NETworkManager/pull/2483) +- Port Scanner + - Port profiles can now be sorted in the settings [#2522](https://github.com/BornToBeRoot/NETworkManager/pull/2522) +- Traceroute + - Copy time to clipboard for non reachable hops fixed [#2477](https://github.com/BornToBeRoot/NETworkManager/pull/2477) + - Export to Json fixed (if ip address of a hop cannot be resolved) [#2477](https://github.com/BornToBeRoot/NETworkManager/pull/2477) +- Ping + - Copy & Export time fixed (format is now `yyyy-MM-dd HH:mm:ss.fff`) [#2483](https://github.com/BornToBeRoot/NETworkManager/pull/2483) +- DNS Lookup + - Fix a bug where the suffix is not appended [#2483](https://github.com/BornToBeRoot/NETworkManager/pull/2483) + - Server can now be sorted in the settings [#2522](https://github.com/BornToBeRoot/NETworkManager/pull/2522) +- AWS Session Manager + - Some history settings may not be saved [#2522](https://github.com/BornToBeRoot/NETworkManager/pull/2522) + - Profiles can now be sorted in the settings [#2522](https://github.com/BornToBeRoot/NETworkManager/pull/2522) +- SNMP + - Allow `.` as first character in OID (e.g. `1.3.6.1.2.1.1.1.0`) [#2483](https://github.com/BornToBeRoot/NETworkManager/pull/2483) + - SNMP profiles can now be sorted in the settings [#2522](https://github.com/BornToBeRoot/NETworkManager/pull/2522) +- SNTP Lookup + - Copy & Export time fixed (format is now `yyyy-MM-dd HH:mm:ss.fff`) [#2483](https://github.com/BornToBeRoot/NETworkManager/pull/2483) + - Server can now be sorted in the settings [#2522](https://github.com/BornToBeRoot/NETworkManager/pull/2522) +- Whois + - Allow domains with `.` at the end / improved domain validation [#2502](https://github.com/BornToBeRoot/NETworkManager/pull/2502) +- Lookup - OUI + - Don't show duplicate entries [#2483](https://github.com/BornToBeRoot/NETworkManager/pull/2483) +- Lookup - Ports + - Don't show duplicate entries [#2483](https://github.com/BornToBeRoot/NETworkManager/pull/2483) +- Profiles + - Prevent the application from crashing if a profile file cannot be loaded (profile management is then blocked) [#2464](https://github.com/BornToBeRoot/NETworkManager/pull/2464) + - Application name not translated [#2502](https://github.com/BornToBeRoot/NETworkManager/pull/2502) +- Settings + - Application name not translated [#2502](https://github.com/BornToBeRoot/NETworkManager/pull/2502) +- Allow hostnames and domains with `.` at the end / improved validation for several tools [#2502](https://github.com/BornToBeRoot/NETworkManager/pull/2502) +- Fix some focus issues when the enter key is pressed [#2483](https://github.com/BornToBeRoot/NETworkManager/pull/2483) +- PowerShell window is hidden again (e.g. configure network interface, add/remove arp entry, etc.) [#2483](https://github.com/BornToBeRoot/NETworkManager/pull/2483) + +## Dependencies, Refactoring & Documentation + +- Code cleanup & refactoring [#2388](https://github.com/BornToBeRoot/NETworkManager/pull/2388) [#2392](https://github.com/BornToBeRoot/NETworkManager/pull/2392) [#2477](https://github.com/BornToBeRoot/NETworkManager/pull/2477) [#2483](https://github.com/BornToBeRoot/NETworkManager/pull/2483) [#2502](https://github.com/BornToBeRoot/NETworkManager/pull/2502) [#2522](https://github.com/BornToBeRoot/NETworkManager/pull/2522) +- Language files updated via [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration) +- Dependencies updated via [#dependabot](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Fdependabot) diff --git a/Website/docs/changelog/2023-3-19-0.md b/Website/docs/changelog/2023-3-19-0.md new file mode 100644 index 0000000000..f4279b0f25 --- /dev/null +++ b/Website/docs/changelog/2023-3-19-0.md @@ -0,0 +1,86 @@ +--- +sidebar_position: 994 +description: "Changelog for NETworkManager 2023.3.19.0 — release notes with new features, improvements, and bug fixes." +keywords: [NETworkManager, changelog, release notes, 2023.3.19.0, update] +--- + +# 2023.3.19.0 + +Version: **2023.3.19.0**
+Release date: **19.03.2023** + +| File | `SHA256` | +| -------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| [`NETworkManager_2023.3.19.0_Setup.exe`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2023.3.19.0/NETworkManager_2023.3.19.0_Setup.exe) | `440287A5B44944D4BF5F4516EB7FEB953FE62605628DFFC8EFE9396791D388E2` | +| [`NETworkManager_2023.3.19.0_Portable.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2023.3.19.0/NETworkManager_2023.3.19.0_Portable.zip) | `C4077E5B45A792860AE5C4448ED248DEFA8A56D2081ED9949AAFF262EFA2CA4A` | +| [`NETworkManager_2023.3.19.0_Archive.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2023.3.19.0/NETworkManager_2023.3.19.0_Archive.zip) | `82983DC69D2AEC39B9A08A65F966150C49F6F30988155000DD80BE117BD2AD1C` | + +**System requirements** + +- Windows 10 / Server x64 (1809 or later) +- [.NET Desktop Runtime 6.x (LTS)](https://dotnet.microsoft.com/download/dotnet/6.0) + +## What's new? + +- IP Scanner + - Scan common ports (`22; 53; 80; 139; 389; 636; 443; 445; 3389`) to test if a host is reachable. The feature is enabled by default and can be configured and disabled in the settings. [#2026](https://github.com/BornToBeRoot/NETworkManager/pull/2026) + +## Improvements + +- (Re)loading of the profiles improved. Code has been optimized and user interface update calls have been reduced. WPF virtualizing explicitly activated. The scrollbar in the profile list is now always visible, because the size is calculated by WPF each time on mouse over. [#2014](https://github.com/BornToBeRoot/NETworkManager/pull/2014) +- Reselect profile or select first profile after (re)loading or search [#2014](https://github.com/BornToBeRoot/NETworkManager/pull/2014) +- Some designs have been improved (Error & Warning icons). [#2014](https://github.com/BornToBeRoot/NETworkManager/pull/2014) +- You can now configure the application wide [ThreadPool](https://learn.microsoft.com/en-us/dotnet/standard/threading/the-managed-thread-pool) under `Settings > General > Multithreading`, which is used for the IP scanner and the port scanner. The default value for min. threads are CPU threads + 512. Depending on the hardware, this can improve the performance of the scan. [#2026](https://github.com/BornToBeRoot/NETworkManager/pull/2026) +- **Network Interface** + - Add a button to redirect the the IPv4 address and subnetmask of the selected network interface to the IP scanner [#2046](https://github.com/BornToBeRoot/NETworkManager/pull/2046) +- **IP Scanner** + - Option added to limit the number of concurrent threads per host scan (256) & port scan (5). Increasing the values can speed up the scan, but can also lead to resource problems. [#2026](https://github.com/BornToBeRoot/NETworkManager/pull/2026) +- **Port Scanner** + - Option added to limit the number of concurrent threads per host scan (5) & port scan (256). Increasing the values can speed up the scan, but can also lead to resource problems. [#2026](https://github.com/BornToBeRoot/NETworkManager/pull/2026) +- **Web Console** + - Address bar can be hidden in the settings (default: visible) [#2070](https://github.com/BornToBeRoot/NETworkManager/pull/2070) + - Add cancel button (and `Esc` key) to stop navigation to a website [#2069](https://github.com/BornToBeRoot/NETworkManager/pull/2069) + +## Bugfixes + +- Show error message when redirecting to another application, but the application is hidden in the settings or somehow invalid [#2046](https://github.com/BornToBeRoot/NETworkManager/pull/2046) +- Group name check is now case insensitive and a group name can only be used once. If you create a group named `Test`, you cannot create a group named `test`. [#2014](https://github.com/BornToBeRoot/NETworkManager/pull/2014) +- Profile dialog + - Validate AWS Session Manager input (instance ID, profile, region) [#2025](https://github.com/BornToBeRoot/NETworkManager/pull/2025) +- **IP Scanner** + - Export to CSV fixed if `Vendor` contains a comma [#2026](https://github.com/BornToBeRoot/NETworkManager/pull/2026) +- **Port Scanner** + - Show port and protocol if service (and desciption) is not available [#2026](https://github.com/BornToBeRoot/NETworkManager/pull/2026) + - Export to CSV fixed if `Description` contains a comma [#2026](https://github.com/BornToBeRoot/NETworkManager/pull/2026) +- **PowerShell** + - ContextMenu in TabControl in a dragged out window was closed automatically due to a focus problem right after opening it [#2064](https://github.com/BornToBeRoot/NETworkManager/pull/2064) + - Resize command in TabControl context menu in a dragged out window not working [#2060](https://github.com/BornToBeRoot/NETworkManager/pull/2060) +- **PuTTY** + - ContextMenu in TabControl in a dragged out window was closed automatically due to a focus problem right after opening it [#2064](https://github.com/BornToBeRoot/NETworkManager/pull/2064) +- **AWS Session Manager** + - ContextMenu in TabControl in a dragged out window was closed automatically due to a focus problem right after opening it [#2064](https://github.com/BornToBeRoot/NETworkManager/pull/2064) + - Resize command in TabControl context menu in a dragged out window not working [#2060](https://github.com/BornToBeRoot/NETworkManager/pull/2060) +- **Web Console** + - Reload command in TabControl context menu in main window not working [#2060](https://github.com/BornToBeRoot/NETworkManager/pull/2060) + - Validate URL in the bar to prevent app crash [#2069](https://github.com/BornToBeRoot/NETworkManager/pull/2069) + - Update URL in the bar when the source (WebView2) has changed [#2069](https://github.com/BornToBeRoot/NETworkManager/pull/2069) +- **Lookup - OUI** + - Export to CSV fixed if `Vendor` contains a comma [#2026](https://github.com/BornToBeRoot/NETworkManager/pull/2026) +- **Lookup - Port** + - Export to CSV fixed if `Description` contains a comma [#2026](https://github.com/BornToBeRoot/NETworkManager/pull/2026) + +## Dependencies, Refactoring & Documentation + +- Code cleanup [#2024](https://github.com/BornToBeRoot/NETworkManager/pull/2024) [#2026](https://github.com/BornToBeRoot/NETworkManager/pull/2026) [#2060](https://github.com/BornToBeRoot/NETworkManager/pull/2060) [#2068](https://github.com/BornToBeRoot/NETworkManager/pull/2068) +- Language files updated via [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration) +- Dependencies updated via [#dependabot](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Fdependabot) +- Update OUI list [#2071](https://github.com/BornToBeRoot/NETworkManager/pull/2071) +- Update Whois list [#2071](https://github.com/BornToBeRoot/NETworkManager/pull/2071) +- Update Port list [#2071](https://github.com/BornToBeRoot/NETworkManager/pull/2071) +- Add documentation for: + - Application > Network Interface [#2047](https://github.com/BornToBeRoot/NETworkManager/pull/2047) + - Application > IP Scanner [#2029](https://github.com/BornToBeRoot/NETworkManager/pull/2029) + - Settings > General [#2028](https://github.com/BornToBeRoot/NETworkManager/pull/2028) + - Settings > Settings [#2062](https://github.com/BornToBeRoot/NETworkManager/pull/2062) + - Settings > Language [#2057](https://github.com/BornToBeRoot/NETworkManager/pull/2057) + - Settings > Update [#2051](https://github.com/BornToBeRoot/NETworkManager/pull/2051) diff --git a/Website/docs/changelog/2023-3-7-0.md b/Website/docs/changelog/2023-3-7-0.md new file mode 100644 index 0000000000..8a7bdd4769 --- /dev/null +++ b/Website/docs/changelog/2023-3-7-0.md @@ -0,0 +1,131 @@ +--- +sidebar_position: 995 +description: "Changelog for NETworkManager 2023.3.7.0 — release notes with new features, improvements, and bug fixes." +keywords: [NETworkManager, changelog, release notes, 2023.3.7.0, update] +--- + +# 2023.3.7.0 + +Version: **2023.3.7.0**
+Release date: **07.03.2023** + +| File | `SHA256` | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| [`NETworkManager_2023.3.7.0_Setup.exe`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2023.3.7.0/NETworkManager_2023.3.7.0_Setup.exe) | `26CCD741CB9F2B52056C91C94DF281C563886AC0E4799A3D167A0566448574F6` | +| [`NETworkManager_2023.3.7.0_Portable.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2023.3.7.0/NETworkManager_2023.3.7.0_Portable.zip) | `B19782CAD036F1F1A64A204EAEBC762B4B519BB4C1836DCD5405C83F8488EB29` | +| [`NETworkManager_2023.3.7.0_Archive.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2023.3.7.0/NETworkManager_2023.3.7.0_Archive.zip) | `7787FE873DD2704487A5A065EA473127C888256CCE3ADA928EEE7CB4B2BF9B6F` | + +**System requirements** + +- Windows 10 / Server x64 (1809 or later) +- [.NET Desktop Runtime 6.x (LTS)](https://dotnet.microsoft.com/download/dotnet/6.0) + +## Breaking Changes + +- Profiles + - The settings folder path can no longer be set to a custom path [#1984](https://github.com/BornToBeRoot/NETworkManager/pull/1984) +- Settings + - The profiles folder path can no longer be set to a custom path [#1984](https://github.com/BornToBeRoot/NETworkManager/pull/1984) + - Import and export of profiles is no longer supported [#1984](https://github.com/BornToBeRoot/NETworkManager/pull/1984) + +:::note + +The outdated functions were buggy, incomplete and difficult to maintain. I decided to remove them and adjust the path to the profiles and settings (See [What's new](#whats-new)). You may also perform a backup/import/export/migration by manually copying the profile or settings files (See [FAQ > Where are files stored?](../faq/file-locations#where-are-files-stored)). + +::: + +## What's new? + +- **SNTP Lookup** [#1821](https://github.com/BornToBeRoot/NETworkManager/pull/1821) (See [documentation](https://borntoberoot.net/NETworkManager/docs/application/sntp-lookup) for more details) +- Profiles and settings are now saved in the `%UserProfile%\Documents\NETworkManager` folder instead of the `%AppData%\NETworkManager` folder. If folder redirection is set up (e.g. OneDrive, Group Policy, etc.), the profiles and settings (files) are automatically transferred to other devices and may be automatically backed up depending on your configuration. I hope this will provide better support for virtual environments / terminal servers. [#1984](https://github.com/BornToBeRoot/NETworkManager/pull/1984) + +:::note + +The profiles and settings are automatically migrated to the new location when the application is started. You can check the log under `%LocalAppData%\NETworkManager\NETworkManager.log` for more details and possible errors. This does not apply to portable version. + +::: + +## Improvements + +- Move .NET runtime components and dependencies into a subfolder to simplify the installation/portable folder [#1832](https://github.com/BornToBeRoot/NETworkManager/pull/1832) +- Installer (Inno Setup) + - Uninstall previous versions of NETworkManager when installing a new version [2382f1f](https://github.com/BornToBeRoot/NETworkManager/commit/2382f1fc5e95d7165f56cb7f42c27e1e281abbf2) +- Reduce the size of the installer, portable and archive build [#1832](https://github.com/BornToBeRoot/NETworkManager/pull/1832) +- Profiles + - Show password dialog again if the password is not correct [#1962](https://github.com/BornToBeRoot/NETworkManager/pull/1962) +- DataGrid Column header design improved [#1910](https://github.com/BornToBeRoot/NETworkManager/pull/1910) +- DataGrid Columns can now be resized [#1910](https://github.com/BornToBeRoot/NETworkManager/pull/1910) +- Add text wrapping for status textboxes [#1949](https://github.com/BornToBeRoot/NETworkManager/pull/1949) +- Toggle button added to hide profile list if the profiles are locked [#1991](https://github.com/BornToBeRoot/NETworkManager/pull/1991) +- Improve input validation in groups, profiles and some tools [#2004](https://github.com/BornToBeRoot/NETworkManager/pull/2004) +- Settings > Network + - Global option added to set the prefered IP protocol (IPv4/IPv6) for DNS resolution. [#1950](https://github.com/BornToBeRoot/NETworkManager/pull/1950) +- **Network Interface** + - Release & Renew button now targets the selected interface instead of all interfaces [#1982](https://github.com/BornToBeRoot/NETworkManager/pull/1982) + - Release & Renew button now supports IPv6 [#1982](https://github.com/BornToBeRoot/NETworkManager/pull/1982) +- **WiFi** + - Improve search - you can now search for SSID, Security, Channel, BSSID (MAC address), Vendor and Phy kind [#1941](https://github.com/BornToBeRoot/NETworkManager/pull/1941) +- **IP Scanner** + - Max threads changed to to 1024 [#1927](https://github.com/BornToBeRoot/NETworkManager/pull/1927) + - Event handling when a host is found, user has canceled, etc. [#1969](https://github.com/BornToBeRoot/NETworkManager/pull/1969) + - Remove option to set the preferred IP protocol for DNS resolution (can now be set globally) [#1950](https://github.com/BornToBeRoot/NETworkManager/pull/1950) + - Create profile from IP scanner now passes the MAC address, if available [#1998](https://github.com/BornToBeRoot/NETworkManager/pull/1998) + - Edge added to custom commands (iexplore deprecated in new installations) [#2006](https://github.com/BornToBeRoot/NETworkManager/pull/2006) +- **Port Scanner** + - Add new port profiles / improve existing ones [#1909](https://github.com/BornToBeRoot/NETworkManager/pull/1909) + - New Port state "Timed out" if the timelimit is reached. [#1969](https://github.com/BornToBeRoot/NETworkManager/pull/1969) + - Select multiple port profiles with `Ctrl` or holding left mouse button [#1979](https://github.com/BornToBeRoot/NETworkManager/pull/1979) + - Remove option to set the preferred IP protocol for DNS resolution (can now be set globally) [#1950](https://github.com/BornToBeRoot/NETworkManager/pull/1950) + - Max host threads changed to to 256 [#1927](https://github.com/BornToBeRoot/NETworkManager/pull/1927) + - Max port threads changed to to 1024 [#1927](https://github.com/BornToBeRoot/NETworkManager/pull/1927) +- **Ping Monitor** + - Allow multiple hosts like `server-01.borntoberoot.net; 1.1.1.1` as input [#1933](https://github.com/BornToBeRoot/NETworkManager/pull/1933) + - Use a fixed size for the view and enable horizonal scrollbar [#1933](https://github.com/BornToBeRoot/NETworkManager/pull/1933) [#1990](https://github.com/BornToBeRoot/NETworkManager/pull/1990) + - Remove option to set the preferred IP protocol for DNS resolution (can now be set globally) [#1950](https://github.com/BornToBeRoot/NETworkManager/pull/1950) + - Display ping error in the UI (with error message as tooltip) instead of silently aborting the ping [#1993](https://github.com/BornToBeRoot/NETworkManager/pull/1993) +- **Traceroute** + - Add more validation (host, ip address) to input [#1932](https://github.com/BornToBeRoot/NETworkManager/pull/1932) + - Remove option to set the preferred IP protocol for DNS resolution (can now be set globally) [#1950](https://github.com/BornToBeRoot/NETworkManager/pull/1950) +- **DNS Lookup** + - Improve overall DNS lookup performance with multiple DNS servers and hosts [#1940](https://github.com/BornToBeRoot/NETworkManager/pull/1940) + - New dialog to add/edit DNS servers [#1960](https://github.com/BornToBeRoot/NETworkManager/pull/1960) +- **PuTTY** + - Parameter `-hostkey` is now supported and can be configured in the profile. Multiple hostkeys can be separated by a comma. [#1977](https://github.com/BornToBeRoot/NETworkManager/pull/1977) +- **SNMP** + - Remove option to set the preferred IP protocol for DNS resolution (can now be set globally) [#1950](https://github.com/BornToBeRoot/NETworkManager/pull/1950) +- **Wake on LAN** + - Update view & code cleanup [#1995](https://github.com/BornToBeRoot/NETworkManager/pull/1995) + - Add history for MAC address & broadcast [#1995](https://github.com/BornToBeRoot/NETworkManager/pull/1995) + +## Bugfixes + +- Detect if the DNS result for a query is null even when the DNS server doesn't send an error code (because some providers do not implement their DNS server correctly...) [#1949](https://github.com/BornToBeRoot/NETworkManager/pull/1949) +- Improve the error message for DNS lookup to get more details (translation is not supported) [#1949](https://github.com/BornToBeRoot/NETworkManager/pull/1949) +- Fix a UI bug in group & profile dialog if input text is to large [#2004](https://github.com/BornToBeRoot/NETworkManager/pull/2004) +- **Dashboard** + - `F5` key is now working to refresh the dashboard (again) [#1969](https://github.com/BornToBeRoot/NETworkManager/pull/1969) +- **IP Scanner** + - In some cases the IP scan is not completed, but the user interface indicates that it is completed [#1969](https://github.com/BornToBeRoot/NETworkManager/pull/1969) +- **Port Scanner** + - In some cases the IP scan is not completed, but the user interface indicates that it is completed [#1969](https://github.com/BornToBeRoot/NETworkManager/pull/1969) +- **DNS Lookup** + - Detect if the DNS result for a query is null even when the DNS server doesn't send an error code and improve the processing of the resource records answers [#1949](https://github.com/BornToBeRoot/NETworkManager/pull/1949) + - In some cases the DNS lookup is not completed, but the user interface indicates that it is completed [#1940](https://github.com/BornToBeRoot/NETworkManager/pull/1940) [#1949](https://github.com/BornToBeRoot/NETworkManager/pull/1949) + - Detect if a dns server profile with this name already exists [#1960](https://github.com/BornToBeRoot/NETworkManager/pull/1960) +- **Traceroute** + - Don't block the UI if an Exception occurs and show an error message [#1994](https://github.com/BornToBeRoot/NETworkManager/pull/1994) +- **AWS Session Manager** + - Use UTF-8 encoding for embedded PowerShell console window [#1925](https://github.com/BornToBeRoot/NETworkManager/pull/1925) +- **Discovery Protocol** + - Discovery Protocol was not working in release because a .dll was missing... Fixed by setting the dotnet RuntimeIdentfier from `win-x64` to `win10-x64` (See [PowerShell/PowerShell#7909](https://github.com/PowerShell/PowerShell/issues/7909) for more details) [#1951](https://github.com/BornToBeRoot/NETworkManager/pull/1951) + +## Dependencies, Refactoring & Documentation + +- Code cleanup [#1932](https://github.com/BornToBeRoot/NETworkManager/pull/1932) [#1949](https://github.com/BornToBeRoot/NETworkManager/pull/1940) +- Language files updated via [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration) +- Dependencies updated via [#dependabot](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Fdependabot) +- Add documentation for: [#265](https://github.com/BornToBeRoot/NETworkManager/pull/265) + - [Dashboard](https://borntoberoot.net/NETworkManager/docs/application/dashboard) + - [Network Interface](https://borntoberoot.net/NETworkManager/docs/application/network-interface) + - [WiFi](https://borntoberoot.net/NETworkManager/docs/application/wifi) + - [IP Scanner](https://borntoberoot.net/NETworkManager/docs/application/ip-scanner) diff --git a/Website/docs/changelog/2023-4-26-0.md b/Website/docs/changelog/2023-4-26-0.md new file mode 100644 index 0000000000..b50716d826 --- /dev/null +++ b/Website/docs/changelog/2023-4-26-0.md @@ -0,0 +1,86 @@ +--- +sidebar_position: 993 +description: "Changelog for NETworkManager 2023.4.26.0 — release notes with new features, improvements, and bug fixes." +keywords: [NETworkManager, changelog, release notes, 2023.4.26.0, update] +--- + +# 2023.4.26.0 + +Version: **2023.4.26.0**
+Release date: **26.04.2023** + +| File | `SHA256` | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| [`NETworkManager_2023.4.26.0_Setup.exe`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2023.4.26.0/NETworkManager_2023.4.26.0_Setup.exe) | `5276974F44D1B32E759E1AAECF60B8440164B34B501B0587DEACB367AA1FF304` | +| [`NETworkManager_2023.4.26.0_Portable.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2023.4.26.0/NETworkManager_2023.4.26.0_Portable.zip) | `D24AE09AA2179CA23EE5F49E0B2CC0477DB9583B3474241051693E243D512668` | +| [`NETworkManager_2023.4.26.0_Archive.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2023.4.26.0/NETworkManager_2023.4.26.0_Archive.zip) | `7D5D613F9E759D169747B2B89AC20D9D9ABE2874B5CF620620F471963D52247D` | + +**System requirements** + +- Windows 10 / Server x64 (1809 or later) +- [.NET Desktop Runtime 6.x (LTS)](https://dotnet.microsoft.com/download/dotnet/6.0) + +## What's new? + +- **WiFi** + - Connect to a WiFi network has been added. Supported networks / methods are `Open`, `WPS`, `WPA PSK (Pre-shared key)` and `WPA Enterprise`. To do this, right-click on a selected WiFi network to open the ContextMenu and select `Connect...`. [#2133](https://github.com/BornToBeRoot/NETworkManager/pull/2133) + - Disconnect from a WiFi network has been added. To do this, right-click on the connected WiFi network to open the ContextMenu and select `Disconnect`. [#2133](https://github.com/BornToBeRoot/NETworkManager/pull/2133) +- **Remote Desktop** + - Support for Remote Desktop Gateway server has been added [#2108](https://github.com/BornToBeRoot/NETworkManager/pull/2108) +- **SNMP** + - Profiles have been added (group & host settings). You create a new tab with pre-filled values from a profile. [#2172](https://github.com/BornToBeRoot/NETworkManager/pull/2172) + - Query can now be canceled (It's supported by the library now) [#2124](https://github.com/BornToBeRoot/NETworkManager/pull/2124) + - Common OID profiles have been added. You can now select a profile and the OID will be automatically filled in (similar to the port profiles). [#2167](https://github.com/BornToBeRoot/NETworkManager/pull/2167) + +## Improvements + +- **WiFi** + - Show current connected network [#2133](https://github.com/BornToBeRoot/NETworkManager/pull/2133) + - Bssid to channel ToolTip added [#2133](https://github.com/BornToBeRoot/NETworkManager/pull/2133) + - Show error message if scan fails (e.g. wifi adapter is unplugged while scanning) [#2133](https://github.com/BornToBeRoot/NETworkManager/pull/2133) + - Automatically refresh is now enabled if it was enabled on the last exit [#2116](https://github.com/BornToBeRoot/NETworkManager/pull/2116) +- **Remote Desktop** + - Domain added to connect dialog [#2165](https://github.com/BornToBeRoot/NETworkManager/pull/2165) + - Domain added to credentials [#2108](https://github.com/BornToBeRoot/NETworkManager/pull/2108) + - Watermark added to credentials [#2172](https://github.com/BornToBeRoot/NETworkManager/pull/2172) +- **SNMP** + - Get request can query multiple OIDs at once now [#2167](https://github.com/BornToBeRoot/NETworkManager/pull/2167) + - SHA256, SHA384 and SHA512 for SNMPv3 auth added [#2166](https://github.com/BornToBeRoot/NETworkManager/pull/2166) + - AES192 and AES256 for SNMPv3 privacy added [#2166](https://github.com/BornToBeRoot/NETworkManager/pull/2166) + - Use Regex to validate OID [#2205](https://github.com/BornToBeRoot/NETworkManager/pull/2205) +- **Connections** + - Automatically refresh is now enabled if it was enabled on the last exit [#2116](https://github.com/BornToBeRoot/NETworkManager/pull/2116) +- **Listeners** + - Automatically refresh is now enabled if it was enabled on the last exit [#2116](https://github.com/BornToBeRoot/NETworkManager/pull/2116) +- **ARP Table** + - Automatically refresh is now enabled if it was enabled on the last exit [#2116](https://github.com/BornToBeRoot/NETworkManager/pull/2116) +- Status window is now automatically closed again if it was opened by a network change event [#2105](https://github.com/BornToBeRoot/NETworkManager/pull/2105) + +## Bugfixes + +- **Remote Desktop, PowerShell, PuTTY, TigerVNC, AWS Session Manager** + - Fixed / mitigated an issue with the [AirSpace Fixer](https://www.nuget.org/packages/AirspaceFixer) if a dialog is displayed (e.g. to enter the password to unlock the profile file) directly after the application has been started [#2209](https://github.com/BornToBeRoot/NETworkManager/pull/2209) +- **AWS Session Manager** + - Fixed a possible issue if the EC2 instance sync is enabled and the profile file is not loaded (because the user hasn't entered the password yet) [#2209](https://github.com/BornToBeRoot/NETworkManager/pull/2209) +- Profiles + - OK button not disabled initially if remote desktop domain is invalid [#2165](https://github.com/BornToBeRoot/NETworkManager/pull/2165) + - OK button not disabled initially on unlock profile & decrypt profile file [#2133](https://github.com/BornToBeRoot/NETworkManager/pull/2133) + +## Dependencies, Refactoring & Documentation + +- Code cleanup [#2100](https://github.com/BornToBeRoot/NETworkManager/pull/2100) [#2172](https://github.com/BornToBeRoot/NETworkManager/pull/2172) +- Language files updated via [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration) +- Dependencies updated via [#dependabot](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Fdependabot) +- Update documentation for: + - Application > WiFi [#2133](https://github.com/BornToBeRoot/NETworkManager/pull/2133) +- Add documentation for: + - Application > Discovery Protocol [#2178](https://github.com/BornToBeRoot/NETworkManager/pull/2178) + - Application > Lookup [#2112](https://github.com/BornToBeRoot/NETworkManager/pull/2112) + - Application > Connections [#2109](https://github.com/BornToBeRoot/NETworkManager/pull/2109) + - Application > Listerers [#2109](https://github.com/BornToBeRoot/NETworkManager/pull/2109) + - Application > ARP Table [#2109](https://github.com/BornToBeRoot/NETworkManager/pull/2109) + - Settings > Window [#2105](https://github.com/BornToBeRoot/NETworkManager/pull/2105) + - Settings > Status [#2105](https://github.com/BornToBeRoot/NETworkManager/pull/2105) + - Settings > HotKeys [#2105](https://github.com/BornToBeRoot/NETworkManager/pull/2105) + - Settings > Autostart [#2105](https://github.com/BornToBeRoot/NETworkManager/pull/2105) + - Settings > Profiles [#2105](https://github.com/BornToBeRoot/NETworkManager/pull/2105) diff --git a/Website/docs/changelog/2023-6-27-0.md b/Website/docs/changelog/2023-6-27-0.md new file mode 100644 index 0000000000..a315ac626b --- /dev/null +++ b/Website/docs/changelog/2023-6-27-0.md @@ -0,0 +1,101 @@ +--- +sidebar_position: 992 +description: "Changelog for NETworkManager 2023.6.27.0 — release notes with new features, improvements, and bug fixes." +keywords: [NETworkManager, changelog, release notes, 2023.6.27.0, update] +--- + +# 2023.6.27.0 + +Version: **2023.6.27.0**
+Release date: **27.06.2023** + +| File | `SHA256` | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| [`NETworkManager_2023.6.27.0_Setup.exe`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2023.6.27.0/NETworkManager_2023.6.27.0_Setup.exe) | `664A6BA437C27415E1ED69A57CA4D4435C8EF077C1556ABC9267517A93D48C08` | +| [`NETworkManager_2023.6.27.0_Portable.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2023.6.27.0/NETworkManager_2023.6.27.0_Portable.zip) | `D356874DD353864C164B2136B893A8B798A8C236990E44F3F222EF1260FDF040` | +| [`NETworkManager_2023.6.27.0_Archive.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2023.6.27.0/NETworkManager_2023.6.27.0_Archive.zip) | `2FC80F329A5B8C9B2EA79A0C11619EB32383802F180C7CF0FA720B4064B6E0B3` | + +**System requirements** + +- Windows 10 / Server x64 (1809 or later) +- [.NET Desktop Runtime 6.x (LTS)](https://dotnet.microsoft.com/download/dotnet/6.0) + +## Breaking Changes + +- AWS Session Manager + - Setting `Default profile` changed to `Profile`. You need to set the profile again [#2299](https://github.com/BornToBeRoot/NETworkManager/pull/2299) + - Setting `Default region` changed to `Region`. You need to set the region again [#2299](https://github.com/BornToBeRoot/NETworkManager/pull/2299) + +## Improvements + +- **DNS Lookup** + - Improved validation when adding/changing DNS server profiles [#2282](https://github.com/BornToBeRoot/NETworkManager/pull/2282) +- **Remote Desktop** + - Allow `.` as domain to authenticate with local accounts [#2305](https://github.com/BornToBeRoot/NETworkManager/pull/2305) +- **PuTTY** + - Improve validation in connect, profile and group dialog [#2352](https://github.com/BornToBeRoot/NETworkManager/pull/2352) +- **TigerVNC** + - Use port from default config instead of settings if creating a new group [#2249](https://github.com/BornToBeRoot/NETworkManager/pull/2249) +- **SNTP Lookup** + - Improved validation when adding/changing SNTP server profiles [#2282](https://github.com/BornToBeRoot/NETworkManager/pull/2282) +- **Wake on LAN** + - Change default port from 7 to 9 [#2242](https://github.com/BornToBeRoot/NETworkManager/pull/2242) +- Group dialog + - Show an error next to the tab if the settings on the page contain errors [#2309](https://github.com/BornToBeRoot/NETworkManager/pull/2309) +- Profile dialog + - Show an error next to the tab if the settings on the page contain errors [#2309](https://github.com/BornToBeRoot/NETworkManager/pull/2309) + - SNMP options are now validates (same as group) [#2309](https://github.com/BornToBeRoot/NETworkManager/pull/2309) +- Log program update check & errors to the log file [#2329](https://github.com/BornToBeRoot/NETworkManager/pull/2329) + +## Bugfixes + +- **DNS Lookup** + - Fixed app crash when editing DNS server profile in some rare cases [#2282](https://github.com/BornToBeRoot/NETworkManager/pull/2282) +- **Remote Desktop** + - `Adjust screen` via Context Menu now only adjusts the screen size if `Adjust screen automatically` or `Use the current view size as the screen size` is enabled [#2318](https://github.com/BornToBeRoot/NETworkManager/pull/2318) +- **PuTTY** + - Add missing baud rates for serial connection [#2337](https://github.com/BornToBeRoot/NETworkManager/pull/2337) + - Fix wrong cli parameters passed when mode does not match (e.g. SSH key for telnet) [#2352](https://github.com/BornToBeRoot/NETworkManager/pull/2352) + - Fix wrong icon in profile context menu [#2352](https://github.com/BornToBeRoot/NETworkManager/pull/2352) +- **SNTP Lookup** + - Fix app crash when editing SNTP server profile in some rare cases [#2282](https://github.com/BornToBeRoot/NETworkManager/pull/2282) +- **Subnet Calculator** + - Fix a design issue with the calculate button in subnetting [#2230](https://github.com/BornToBeRoot/NETworkManager/pull/2230) +- [AirSpace Fixer](https://www.nuget.org/packages/AirspaceFixer) code optimized (only called if needed). This will also prevent a screenshot bug when the application is loading and a dialog is shown. [#2253](https://github.com/BornToBeRoot/NETworkManager/pull/2253) +- Group dialog + - Fix default value for Remote Desktop sreen size [#2293](https://github.com/BornToBeRoot/NETworkManager/pull/2293) + - Enable Remote Desktop `Use gateway credentials` only if logon method is set to `Userpass` [#2316](https://github.com/BornToBeRoot/NETworkManager/pull/2316) +- Profile dialog + - Fix default value for Remote Desktop sreen size [#2293](https://github.com/BornToBeRoot/NETworkManager/pull/2293) + - Enable Remote Desktop `Use gateway credentials` only if logon method is set to `Userpass` [#2316](https://github.com/BornToBeRoot/NETworkManager/pull/2316) + - Fix validation rule for TigerVNC port [#2309](https://github.com/BornToBeRoot/NETworkManager/pull/2309) +- Settings + - Settings view is now re-selected if the filter (search) is removed [#2325](https://github.com/BornToBeRoot/NETworkManager/pull/2325) + - If settings are opened again, the last selected settings view is now selected (except an application was selected that has a settings view, then the settings view of the application is selected) [#2325](https://github.com/BornToBeRoot/NETworkManager/pull/2325) + +## Deprecated + +- Profile + - Wake on LAN port, because it was inconsistent (If you select the profile, the port from the settings was used. If you right-click on the profile, the port from the profile was used) [#2220](https://github.com/BornToBeRoot/NETworkManager/pull/2220) + +## Dependencies, Refactoring & Documentation + +- Code cleanup [#2100](https://github.com/BornToBeRoot/NETworkManager/pull/2100) [#2172](https://github.com/BornToBeRoot/NETworkManager/pull/2172) [#2254](https://github.com/BornToBeRoot/NETworkManager/pull/2254) [#2325](https://github.com/BornToBeRoot/NETworkManager/pull/2325) +- Language files updated via [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration) +- Dependencies updated via [#dependabot](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Fdependabot) +- Add documentation for: + - Application > Port Scanner [#2265](https://github.com/BornToBeRoot/NETworkManager/pull/2265) + - Application > Ping Monitor [#2267](https://github.com/BornToBeRoot/NETworkManager/pull/2267) + - Application > Traceroute [#2268](https://github.com/BornToBeRoot/NETworkManager/pull/2268) + - Application > DNS Lookup [#2273](https://github.com/BornToBeRoot/NETworkManager/pull/2273) + - Application > Remote Desktop [#2293](https://github.com/BornToBeRoot/NETworkManager/pull/2293) [#2324](https://github.com/BornToBeRoot/NETworkManager/pull/2324) + - Application > PowerShell [#2249](https://github.com/BornToBeRoot/NETworkManager/pull/2249) [#2324](https://github.com/BornToBeRoot/NETworkManager/pull/2324) + - Application > PuTTY [#2324](https://github.com/BornToBeRoot/NETworkManager/pull/2324) [#2337](https://github.com/BornToBeRoot/NETworkManager/pull/2337) + - Application > TigerVNC [#2248](https://github.com/BornToBeRoot/NETworkManager/pull/2248) [#2324](https://github.com/BornToBeRoot/NETworkManager/pull/2324) + - Application > Web Console [#2244](https://github.com/BornToBeRoot/NETworkManager/pull/2244) [#2324](https://github.com/BornToBeRoot/NETworkManager/pull/2324) + - Application > SNMP [#2289](https://github.com/BornToBeRoot/NETworkManager/pull/2289) [#2293](https://github.com/BornToBeRoot/NETworkManager/pull/2293) + - Application > Wake on LAN [#2242](https://github.com/BornToBeRoot/NETworkManager/pull/2242) + - Application > Whois [#2236](https://github.com/BornToBeRoot/NETworkManager/pull/2236) + - Application > Subnet Calculator [#2233](https://github.com/BornToBeRoot/NETworkManager/pull/2233) +- Update documentation for: + - Application > AWS Session Manager [#2299](https://github.com/BornToBeRoot/NETworkManager/pull/2299) [#2324](https://github.com/BornToBeRoot/NETworkManager/pull/2324) diff --git a/Website/docs/changelog/2023-6-27-1.md b/Website/docs/changelog/2023-6-27-1.md new file mode 100644 index 0000000000..6d4d6a03a7 --- /dev/null +++ b/Website/docs/changelog/2023-6-27-1.md @@ -0,0 +1,32 @@ +--- +sidebar_position: 991 +description: "Changelog for NETworkManager 2023.6.27.1 — release notes with new features, improvements, and bug fixes." +keywords: [NETworkManager, changelog, release notes, 2023.6.27.1, update] +--- + +# 2023.6.27.1 + +Version: **2023.6.27.1**
+Release date: **27.06.2023** + +| File | `SHA256` | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| [`NETworkManager_2023.6.27.1_Setup.exe`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2023.6.27.1/NETworkManager_2023.6.27.1_Setup.exe) | `8126ED2D73CCF7E6F1C5EA5FD13A25C99DE1493F05A71C1435A956DA4409C836` | +| [`NETworkManager_2023.6.27.1_Portable.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2023.6.27.1/NETworkManager_2023.6.27.1_Portable.zip) | `49AFB59B249F760E58B20AB779D47E7FE9E39A082EB6F10601A5EF1A0D40A6B8` | +| [`NETworkManager_2023.6.27.1_Archive.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2023.6.27.1/NETworkManager_2023.6.27.1_Archive.zip) | `A9789E3BC8417875565385A4D93A8D20BD0A793EA1BAE390232B85B4BF51123D` | + +**System requirements** + +- Windows 10 / Server x64 (1809 or later) +- [.NET Desktop Runtime 6.x (LTS)](https://dotnet.microsoft.com/download/dotnet/6.0) + +## Bugfixes + +- **PuTTY** + - Session profile not applied [#2380](https://github.com/BornToBeRoot/NETworkManager/pull/2380) + +:::note + +See also the [changelog of version 2023.6.27.0](./2023-6-27-0). + +::: diff --git a/Website/docs/changelog/2024-1-6-0.md b/Website/docs/changelog/2024-1-6-0.md new file mode 100644 index 0000000000..5ce6d3368e --- /dev/null +++ b/Website/docs/changelog/2024-1-6-0.md @@ -0,0 +1,76 @@ +--- +sidebar_position: 989 +description: "Changelog for NETworkManager 2024.1.6.0 — release notes with new features, improvements, and bug fixes." +keywords: [NETworkManager, changelog, release notes, 2024.1.6.0, update] +--- + +# 2024.1.6.0 + +Version: **2024.1.6.0**
+Release date: **06.01.2024** + +| File | `SHA256` | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| [`NETworkManager_2024.1.6.0_Setup.exe`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2024.1.6.0/NETworkManager_2024.1.6.0_Setup.exe) | `6D5B590ACA3085A4D8BF849D2404C471B0B1AA606E20453FF7C312D99C1845FC` | +| [`NETworkManager_2024.1.6.0_Portable.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2024.1.6.0/NETworkManager_2024.1.6.0_Portable.zip) | `3C31F0933E3FB9A4CEFF6006710DA23DBBA5BCACAACB6167DE65B7AA02A158E7` | +| [`NETworkManager_2024.1.6.0_Archive.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2024.1.6.0/NETworkManager_2024.1.6.0_Archive.zip) | `E3AECBCCBE105D8FE4A5CC12FF293CCE2839C3F6E3262F605E798C43BC2B6498` | + +**System requirements** + +- Windows 10 / Server x64 (1809 or later) +- [.NET Desktop Runtime 8.0 (LTS) - x64](https://dotnet.microsoft.com/en-us/download/dotnet/8.0/runtime) + +## Breaking Changes + +- Website migrated from [Just-the-docs](https://github.com/just-the-docs/just-the-docs) to [Docusaurus](https://github.com/facebook/docusaurus). Links in the application have been updated [#2610](https://github.com/BornToBeRoot/NETworkManager/pull/2610)
+ Check out the new website at [https://borntoberoot.net/NETworkManager](https://borntoberoot.net/NETworkManager) + +## What's new? + +- Run Command + - Run command (HotKey: Ctrl+Shift+P) added. This feature allows you to open a command field to switch between applications (and pass parameters to them _in the future_) [#2577](https://github.com/BornToBeRoot/NETworkManager/pull/2577) +- IP Scanner + - NetBIOS resolver added to enhance the detection of hosts (e.g. if there is no ICMP response or TCP port is open) but netbios responds. It will also display the Computername if no DNS hostname is available. [#2590](https://github.com/BornToBeRoot/NETworkManager/pull/2590) +- Ping Monitor + - UI redesigned [#2573](https://github.com/BornToBeRoot/NETworkManager/pull/2573) + - Allow ranges like `192.168.0.0/24` or `10.0.[0-255].1` [#2573](https://github.com/BornToBeRoot/NETworkManager/pull/2573) +- Connections + - Resolve remote hostname, process id, process name and process path (similar to `netstat`) [#2587](https://github.com/BornToBeRoot/NETworkManager/pull/2587) + +## Improvements + +- IP Scanner + - Scan is no longer aborted if the IP of a single host in a series of hosts cannot be resolved (the host is skipped and an error is displayed) [#2573](https://github.com/BornToBeRoot/NETworkManager/pull/2573) + - Sort by IP address & MAC address improved / fixed [#2583](https://github.com/BornToBeRoot/NETworkManager/pull/2583) +- Port Scanner + - Scan is no longer aborted if the IP of a single host in a series of hosts cannot be resolved (the host is skipped and an error is displayed) [#2573](https://github.com/BornToBeRoot/NETworkManager/pull/2573) + - Hostname added to group [#2573](https://github.com/BornToBeRoot/NETworkManager/pull/2573) + - Sort improved [#2583](https://github.com/BornToBeRoot/NETworkManager/pull/2583) + - Port profile column sort fixed [#2583](https://github.com/BornToBeRoot/NETworkManager/pull/2583) +- Ping Monitor + - Scan is no longer aborted if the IP of a single host in a series of hosts cannot be resolved (the host is skipped and an error is displayed) [#2573](https://github.com/BornToBeRoot/NETworkManager/pull/2573) +- DNS Lookup + - Hostname of the nameserver added to group [#2573](https://github.com/BornToBeRoot/NETworkManager/pull/2573) + - Resolve was finished too early if a request timed [#2612](https://github.com/BornToBeRoot/NETworkManager/pull/2612) + - Sort improved [#2583](https://github.com/BornToBeRoot/NETworkManager/pull/2583) +- SNMP + OID profile column sort fixed [#2583](https://github.com/BornToBeRoot/NETworkManager/pull/2583) +- Connections + - Sort by IP address improved / fixed [#2583](https://github.com/BornToBeRoot/NETworkManager/pull/2583) +- Listeners + - Sort by IP address improved / fixed [#2583](https://github.com/BornToBeRoot/NETworkManager/pull/2583) +- ARP Table + - Sort by IP address & MAC address improved / fixed [#2583](https://github.com/BornToBeRoot/NETworkManager/pull/2583) + +## Bugfixes + +- SNMP + - Detect EndOfMibView in v1 and v2c walk [#2583](https://github.com/BornToBeRoot/NETworkManager/pull/2583) +- Lookup + - Fix sort by MAC address [#2583](https://github.com/BornToBeRoot/NETworkManager/pull/2583) + +## Dependencies, Refactoring & Documentation + +- Code cleanup & refactoring [#2583](https://github.com/BornToBeRoot/NETworkManager/pull/2583) [#2586](https://github.com/BornToBeRoot/NETworkManager/pull/2586) +- Language files updated via [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration) +- Dependencies updated via [#dependabot](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Fdependabot) diff --git a/Website/docs/changelog/2024-1-7-0.md b/Website/docs/changelog/2024-1-7-0.md new file mode 100644 index 0000000000..8e504884e2 --- /dev/null +++ b/Website/docs/changelog/2024-1-7-0.md @@ -0,0 +1,25 @@ +--- +sidebar_position: 988 +description: "Changelog for NETworkManager 2024.1.7.0 — release notes with new features, improvements, and bug fixes." +keywords: [NETworkManager, changelog, release notes, 2024.1.7.0, update] +--- + +# 2024.1.7.0 + +Version: **2024.1.7.0**
+Release date: **07.01.2024** + +| File | `SHA256` | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| [`NETworkManager_2024.1.7.0_Setup.exe`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2024.1.7.0/NETworkManager_2024.1.7.0_Setup.exe) | `FE15739018AA90674FC0E0AE1BDBFB8DC015517020439C7151C3634D936FA681` | +| [`NETworkManager_2024.1.7.0_Portable.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2024.1.7.0/NETworkManager_2024.1.7.0_Portable.zip) | `E800A0C49B360C27EF5BA3E8B962D1C96EACF41DCC8E6C257F7777579C22AB79` | +| [`NETworkManager_2024.1.7.0_Archive.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2024.1.7.0/NETworkManager_2024.1.7.0_Archive.zip) | `15DF615BE959F59C3D7C99C93BB3FA95A2C61DC7BEA6F5E22179A4C2723973A3` | + +**System requirements** + +- Windows 10 / Server x64 (1809 or later) +- [.NET Desktop Runtime 8.0 (LTS) - x64](https://dotnet.microsoft.com/en-us/download/dotnet/8.0/runtime) + +## Bugfixes + +- Tray icon context menu fixed [#2615](https://github.com/BornToBeRoot/NETworkManager/pull/2615) diff --git a/Website/docs/changelog/2024-11-11-0.md b/Website/docs/changelog/2024-11-11-0.md new file mode 100644 index 0000000000..949779a7b2 --- /dev/null +++ b/Website/docs/changelog/2024-11-11-0.md @@ -0,0 +1,50 @@ +--- +sidebar_position: 984 +description: "Changelog for NETworkManager 2024.11.11.0 — release notes with new features, improvements, and bug fixes." +keywords: [NETworkManager, changelog, release notes, 2024.11.11.0, update] +--- + +# 2024.11.11.0 + +Version: **2024.11.11.0**
+Release date: **11.11.2024** + +| File | `SHA256` | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| [`NETworkManager_2024.11.11.0_Setup.msi`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2024.11.11.0/NETworkManager_2024.11.11.0_Setup.msi) | `B3B2128F752B6CA84C9FE0B84CA279C284AEB3BB479508E546633BF34E59A125` | +| [`NETworkManager_2024.11.11.0_Portable.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2024.11.11.0/NETworkManager_2024.11.11.0_Portable.zip) | `1D0C419C71103038397F3A0E14914B3DB1194164153448BFE57E261D093D7D55` | +| [`NETworkManager_2024.11.11.0_Archive.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2024.11.11.0/NETworkManager_2024.11.11.0_Archive.zip) | `5C054ED5233207692187E1355E581F3CA226EF6BB0C551141E795C06B86832FA` | + +**System requirements** + +- Windows 10 / Server x64 (1809 or later) +- [.NET Desktop Runtime 8.0 (LTS) - x64](https://dotnet.microsoft.com/en-us/download/dotnet/8.0/runtime) + +## Breaking Changes + +## What's new? + +- Applications can now be sorted via drag & drop in the application sidebar or in the settings under `Settings > General > Applications`. [#2781](https://github.com/BornToBeRoot/NETworkManager/pull/2781) +- Profiles now have a field for a description, which is displayed together with the host name/IP address in a tooltip in the profile sidebar. [#2877](https://github.com/BornToBeRoot/NETworkManager/pull/2877) + +## Improvements + +- Applications settings under `Settings > General > Applications` redesigned and context menu added (Right-click) [#2781](https://github.com/BornToBeRoot/NETworkManager/pull/2781) + - `Set default` added (Set the startup application - available if not set) + - `Show` added (Shows the application in the main window - available if hidden) + - `Hide` added (Hides the application from the main window - available if shown) +- Groups now have a field for a description [#2877](https://github.com/BornToBeRoot/NETworkManager/pull/2877) + +## Bugfixes + +- **Ping Monitor** + + - A problem has been fixed where the ping does not start if the DNS server is not configured. This can occur if the network interface via which the Windows DNS server was configured is deactivated/disconnected. [#2876](https://github.com/BornToBeRoot/NETworkManager/pull/2876) + +- TextBox content not centered because of ScrollViewer issue. [#2763](https://github.com/BornToBeRoot/NETworkManager/pull/2763) + +## Dependencies, Refactoring & Documentation + +- Code cleanup & refactoring +- Language files updated via [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration) +- Dependencies updated via [#dependabot](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Fdependabot) diff --git a/Website/docs/changelog/2024-4-21-0.md b/Website/docs/changelog/2024-4-21-0.md new file mode 100644 index 0000000000..8d31cefc24 --- /dev/null +++ b/Website/docs/changelog/2024-4-21-0.md @@ -0,0 +1,103 @@ +--- +sidebar_position: 987 +description: "Changelog for NETworkManager 2024.4.21.0 — release notes with new features, improvements, and bug fixes." +keywords: [NETworkManager, changelog, release notes, 2024.4.21.0, update] +--- + +# 2024.4.21.0 + +Version: **2024.4.21.0**
+Release date: **21.04.2024** + +| File | `SHA256` | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| [`NETworkManager_2024.4.21.0_Setup.exe`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2024.4.21.0/NETworkManager_2024.4.21.0_Setup.exe) | `C0A49E98C788CC0C69B0AAA87D7550B7307B797A761B8913D1CDAE305FDFF666` | +| [`NETworkManager_2024.4.21.0_Portable.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2024.4.21.0/NETworkManager_2024.4.21.0_Portable.zip) | `85AB794D44FEC49A08FBD261C00689E8D50A50DF9787B85946752B1F180373B6` | +| [`NETworkManager_2024.4.21.0_Archive.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2024.4.21.0/NETworkManager_2024.4.21.0_Archive.zip) | `96DAFC53A89A86E7FF9C971F5136FD9474BF2CCB956C724EE93C10B231B25819` | + +**System requirements** + +- Windows 10 / Server x64 (1809 or later) +- [.NET Desktop Runtime 8.0 (LTS) - x64](https://dotnet.microsoft.com/en-us/download/dotnet/8.0/runtime) + +## Breaking Changes + +- **Network Interfaces** + + - Adding an additional IPv4 address to the network adapter will enable the `netsh` option `dhcpstaticipcoexistence` if the network adapter is configured to use DHCP. See [this](../application/network-interface.md#configure) for more information. [#2656](https://github.com/BornToBeRoot/NETworkManager/pull/2656) + +## What's new? + +- Tabs can now be arranged within the window using drag & drop. [#2669](https://github.com/BornToBeRoot/NETworkManager/pull/2669) + + ![Changelog #2669](../img/changelog-2669.gif) + +## Improvements + +- **Network Interfaces** + + - Export to CSV, XML and JSON added. [#2626](https://github.com/BornToBeRoot/NETworkManager/pull/2626) + +- **Ping Monitor** + + - Grouping of hosts added. Hosts are now grouped based on the profile or added to the default group. [#2645](https://github.com/BornToBeRoot/NETworkManager/pull/2645) + +- **Discovery Protocol** + + - Export to CSV, XML and JSON added. [#2626](https://github.com/BornToBeRoot/NETworkManager/pull/2626) + +- **IP Geolocation** + + - Export to CSV, XML and JSON added. [#2626](https://github.com/BornToBeRoot/NETworkManager/pull/2626) + +- **Bit Calculator** + + - Export to CSV, XML and JSON added. [#2626](https://github.com/BornToBeRoot/NETworkManager/pull/2626) + +## Bugfixes + +- **General** + + - Fix some design issues for the `Run command` button. The button is now in the right-hand title bar instead of in the center until a better solution is found. [#2651](https://github.com/BornToBeRoot/NETworkManager/pull/2651) + +- **IP Scanner** + + - `Add profile...` in dragged out tab fixed. [#2661](https://github.com/BornToBeRoot/NETworkManager/pull/2661) + - `Export...` in dragged out tab fixed. [#2661](https://github.com/BornToBeRoot/NETworkManager/pull/2661) + - Copy MAC address to clipboard fixed. [#2644](https://github.com/BornToBeRoot/NETworkManager/pull/2644) + +- **Port Scanner** + + - `Open port profiles...` in dragged out tab fixed. [#2661](https://github.com/BornToBeRoot/NETworkManager/pull/2661) + - `Export...` in dragged out tab fixed. [#2661](https://github.com/BornToBeRoot/NETworkManager/pull/2661) + +- **Traceroute** + + - `Export...` in dragged out tab fixed. [#2661](https://github.com/BornToBeRoot/NETworkManager/pull/2661) + +- **DNS Lookup** + + - `Export...` in dragged out tab fixed. [#2661](https://github.com/BornToBeRoot/NETworkManager/pull/2661) + +- **SNMP** + + - `Open OID profiles...` in dragged out tab fixed. [#2661](https://github.com/BornToBeRoot/NETworkManager/pull/2661) + - `Export...` in dragged out tab fixed. [#2661](https://github.com/BornToBeRoot/NETworkManager/pull/2661) + +- **SNTP Lookup** + + - `Export...` in dragged out tab fixed. [#2661](https://github.com/BornToBeRoot/NETworkManager/pull/2661) + +- **Whois** + + `Export...` in dragged out tab fixed. [#2661](https://github.com/BornToBeRoot/NETworkManager/pull/2661) + +- **IP Geolocation** + + - `Export...` in dragged out tab fixed. [#2661](https://github.com/BornToBeRoot/NETworkManager/pull/2661) + +## Dependencies, Refactoring & Documentation + +- Code cleanup & refactoring +- Language files updated via [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration) +- Dependencies updated via [#dependabot](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Fdependabot) diff --git a/Website/docs/changelog/2024-5-27-0.md b/Website/docs/changelog/2024-5-27-0.md new file mode 100644 index 0000000000..a3c45e3928 --- /dev/null +++ b/Website/docs/changelog/2024-5-27-0.md @@ -0,0 +1,64 @@ +--- +sidebar_position: 986 +description: "Changelog for NETworkManager 2024.5.27.0 — release notes with new features, improvements, and bug fixes." +keywords: [NETworkManager, changelog, release notes, 2024.5.27.0, update] +--- + +# 2024.5.27.0 + +Version: **2024.5.27.0**
+Release date: **24.05.2024** + +| File | `SHA256` | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| [`NETworkManager_2024.5.27.0_Setup.msi`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2024.5.27.0/NETworkManager_2024.5.27.0_Setup.msi) | `BE6A466ACD8912B21702A8D07CC45D7DEF7D177A6BFC3BDE2AB97E1DBE8E9CEA` | +| [`NETworkManager_2024.5.27.0_Portable.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2024.5.27.0/NETworkManager_2024.5.27.0_Portable.zip) | `3B5AE229CF692AA43B2F35B3FF9595E48E0D821B9CF8015E6AB3B1DA91B59B36` | +| [`NETworkManager_2024.5.27.0_Archive.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2024.5.27.0/NETworkManager_2024.5.27.0_Archive.zip) | `775AAF2BEC7434D458F9A4208B803D7E26F447EF2DEDD977030E6FA16F501BE7` | + +**System requirements** + +- Windows 10 / Server x64 (1809 or later) +- [.NET Desktop Runtime 8.0 (LTS) - x64](https://dotnet.microsoft.com/en-us/download/dotnet/8.0/runtime) + +## Breaking Changes + +- Installer has been changed from `exe` (`InnoSetup`) to `msi` (`WiX Toolset`) in order to support deep signing of the binaries. [#2705](https://github.com/BornToBeRoot/NETworkManager/pull/2705) + + :::info + + The MSI installer will attempt to automatically uninstall the previous version of NETworkManager. + + ::: + + :::warning + + The MSI installer published on 24.05.2024 (preview) had an error in the uninstall routine. If you have problems with the uninstallation or the current update, first reinstall the version [2024.4.21.0 (direct download of the setup)](https://github.com/BornToBeRoot/NETworkManager/releases/download/2024.4.21.0/NETworkManager_2024.4.21.0_Setup.exe). You can then run the MSI installation programme to update to the latest version. + + ::: + +## What's new? + +- The binaries and the installer (`.msi`) are now signed with a free code signing certificate from [SignPath Foundation](https://signpath.org/). Thanks to [SignPath.io](https://signpath.io/) for providing free code signing for open source projects. [#2705](https://github.com/BornToBeRoot/NETworkManager/pull/2705) + +## Improvements + +- **General** + + - Improve ToolTip for the application view. [#2716](https://github.com/BornToBeRoot/NETworkManager/pull/2716) + +- **WiFi** + + - Request WiFi access as described [here](https://learn.microsoft.com/en-us/windows/win32/nativewifi/wi-fi-access-location-changes) due to new Windows 11 requirements coming in fall 2024. [#2719](https://github.com/BornToBeRoot/NETworkManager/pull/2719) + +## Bugfixes + +- **WiFi** + + - Handle exception when accessing WiFi adapter is not possible. [#2719](https://github.com/BornToBeRoot/NETworkManager/pull/2719) + +## Dependencies, Refactoring & Documentation + +- Code cleanup & refactoring + - ScrollViewer / ScrollBar [#2716](https://github.com/BornToBeRoot/NETworkManager/pull/2716) +- Language files updated via [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration) +- Dependencies updated via [#dependabot](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Fdependabot) diff --git a/Website/docs/changelog/2024-6-15-0.md b/Website/docs/changelog/2024-6-15-0.md new file mode 100644 index 0000000000..cbefbc978c --- /dev/null +++ b/Website/docs/changelog/2024-6-15-0.md @@ -0,0 +1,31 @@ +--- +sidebar_position: 985 +description: "Changelog for NETworkManager 2024.6.15.0 — release notes with new features, improvements, and bug fixes." +keywords: [NETworkManager, changelog, release notes, 2024.6.15.0, update] +--- + +# 2024.6.15.0 + +Version: **2024.6.15.0**
+Release date: **15.06.2024** + +| File | `SHA256` | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| [`NETworkManager_2024.6.15.0_Setup.msi`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2024.6.15.0/NETworkManager_2024.6.15.0_Setup.msi) | `CB78E596EF0247808522B6F5883CD154BF0A8630496E2545AAF99E1B324E3D9B` | +| [`NETworkManager_2024.6.15.0_Portable.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2024.6.15.0/NETworkManager_2024.6.15.0_Portable.zip) | `2DC069D3ED82811B3FEF0FE00956AA53F6153F233A3AE08DF42104BB2BEFAD97` | +| [`NETworkManager_2024.6.15.0_Archive.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2024.6.15.0/NETworkManager_2024.6.15.0_Archive.zip) | `F1A6935D1A67014700CF2A8315E7CB8013F4084B38297E0DCB0E0C2F551E0A04` | + +**System requirements** + +- Windows 10 / Server x64 (1809 or later) +- [.NET Desktop Runtime 8.0 (LTS) - x64](https://dotnet.microsoft.com/en-us/download/dotnet/8.0/runtime) + +## Breaking Changes + +- InnoSetup uninstall routine removed from MSI installer (If you run NETworkManager version 2024.4.21.0, uninstall it manually before installing the new version OR install version 2024.6.15.0 first) + +## Dependencies, Refactoring & Documentation + +- Code cleanup & refactoring +- Language files updated via [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration) +- Dependencies updated via [#dependabot](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Fdependabot) diff --git a/Website/docs/changelog/2025-1-18-0.md b/Website/docs/changelog/2025-1-18-0.md new file mode 100644 index 0000000000..2402fdb9b0 --- /dev/null +++ b/Website/docs/changelog/2025-1-18-0.md @@ -0,0 +1,77 @@ +--- +sidebar_position: 983 +description: "Changelog for NETworkManager 2025.1.18.0 — release notes with new features, improvements, and bug fixes." +keywords: [NETworkManager, changelog, release notes, 2025.1.18.0, update] +--- + +# 2025.1.18.0 + +Version: **2025.1.18.0**
+Release date: **18.01.2025** + +| File | `SHA256` | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| [`NETworkManager_2025.1.18.0_Setup.msi`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2025.1.18.0/NETworkManager_2025.1.18.0_Setup.msi) | `0E8722AB821FDFC5079C8E914CDBC293F373F551924EFBA14CA4AF6E68B678F9` | +| [`NETworkManager_2025.1.18.0_Portable.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2025.1.18.0/NETworkManager_2025.1.18.0_Portable.zip) | `85000CC7E9892C14B3C1F7DE2D540A57E2C90CF5AE25E27960844751AADCF166` | +| [`NETworkManager_2025.1.18.0_Archive.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2025.1.18.0/NETworkManager_2025.1.18.0_Archive.zip) | `68FFC7A42F0CF27B83525BB6AE79C730C96C40A956869F5C45D60B97CCECAE74` | + +**System requirements** + +- Windows 10 / Server x64 (22H2 or later) +- [.NET Desktop Runtime 8.0 (LTS) - x64](https://dotnet.microsoft.com/en-us/download/dotnet/8.0/runtime) + +## Breaking Changes + +- Minimum supported Windows version increased to `22H2` to support: + - WiFi 6 GHz, WPA3, 802.11be [#2912](https://github.com/BornToBeRoot/NETworkManager/pull/2912) + - Remote Desktop high DPI, scaling and fast resizing [#2968](https://github.com/BornToBeRoot/NETworkManager/pull/2968) + +## What's new? + +- **WiFi** + + - 6 GHz networks are now supported. [#2912](https://github.com/BornToBeRoot/NETworkManager/pull/2912) [#2928](https://github.com/BornToBeRoot/NETworkManager/pull/2928) + - `WPA3 Personal (SAE)`, `WPA3 Enterprise` and `WPA3 Enterprise (192-bit)` are now supported. [#2912](https://github.com/BornToBeRoot/NETworkManager/pull/2912) + - `802.11be` (`EHT`) is now supported. [#2912](https://github.com/BornToBeRoot/NETworkManager/pull/2912) + +- **Remote Desktop** + + - Scale rdp session and control to support high DPI (e.g. per Monitor DPI like 125%, 150%, etc.). [#2968](https://github.com/BornToBeRoot/NETworkManager/pull/2968) + - Resizing now uses [`IMsRdpClient9::UpdateSessionDisplaySettings`]() instead of [`IMsRdpClient::Reconnect`](https://learn.microsoft.com/en-us/windows/win32/termserv/imsrdpclient8-reconnect) to support scaling and faster resizing (without the need of reconnecting). [#2968](https://github.com/BornToBeRoot/NETworkManager/pull/2968). + + :::warning + + The new features for high DPI, scaling and resizing may cause issues or doesn't work with legacy servers/clients. Please report any issues you find here: [#2911](https://github.com/BornToBeRoot/NETworkManager/issues/2911) + + ::: + +## Improvements + +- Improve ToolTips (e.g. migrate from Twitter to X, etc.), Buttons, etc. [#2955](https://github.com/BornToBeRoot/NETworkManager/pull/2955) +- **WiFi** + - Improve search, cleanup/remove some converters to make the code more readable and faster. [#2940](https://github.com/BornToBeRoot/NETworkManager/pull/2940) + +## Bugfixes + +- Horizontal scrollbar fixed for some views. [#2945](https://github.com/BornToBeRoot/NETworkManager/pull/2945) +- Fixed an issue with DPI scaling where the application was blurry if a second monitor had a different dpi setting than the main monitor. [#2941](https://github.com/BornToBeRoot/NETworkManager/pull/2941) +- Changed the Welcome dialog from `MahApps.Metro.Controls.Dialogs` to `MahApps.Metro.SimpleChildWindow`, so the main window can be dragged and resized on the first start. [#2914](https://github.com/BornToBeRoot/NETworkManager/pull/2914) + +- **WiFi** + + - Fixed a bug that caused the scan process to crash when a 6 GHz network was found. [#2912](https://github.com/BornToBeRoot/NETworkManager/pull/2912) + +- **IP Scanner** + + - Fixed two `NullReferenceException` in ICMP & NETBIOS for some IP addresses. [#2964](https://github.com/BornToBeRoot/NETworkManager/pull/2964) + +- **Remote Desktop** + + - Fixed an app crash when a reconnect was triggered while it was already trying to connect. [#2988](https://github.com/BornToBeRoot/NETworkManager/pull/2988) + +## Dependencies, Refactoring & Documentation + +- Migrated code for some loading indicators from the library [LoadingIndicators.WPF] (https://github.com/zeluisping/LoadingIndicators.WPF) to the NETworkManager repo, as the original repo looks unmaintained and has problems with MahApps.Metro version 2 and later. [#2963](https://github.com/BornToBeRoot/NETworkManager/pull/2963) +- Code cleanup & refactoring [#2940](https://github.com/BornToBeRoot/NETworkManager/pull/2940) [#2976](https://github.com/BornToBeRoot/NETworkManager/pull/2976) +- Language files updated via [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration) +- Dependencies updated via [#dependabot](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Fdependabot) diff --git a/Website/docs/changelog/2025-10-18-0.md b/Website/docs/changelog/2025-10-18-0.md new file mode 100644 index 0000000000..454ead3089 --- /dev/null +++ b/Website/docs/changelog/2025-10-18-0.md @@ -0,0 +1,56 @@ +--- +sidebar_position: 981 +description: "Changelog for NETworkManager 2025.10.18.0 — release notes with new features, improvements, and bug fixes." +keywords: [NETworkManager, changelog, release notes, 2025.10.18.0, update] +--- + +# 2025.10.18.0 + +Version: **2025.10.18.0**
+Release date: **18.10.2025** + +| File | `SHA256` | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| [`NETworkManager_2025.10.18.0_Setup.msi`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2025.10.18.0/NETworkManager_2025.10.18.0_Setup.msi) | `9F139041F24829B44183A800642CC00CC615DCFC0069227696DFAA8A308C6CF7` | +| [`NETworkManager_2025.10.18.0_Portable.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2025.10.18.0/NETworkManager_2025.10.18.0_Portable.zip) | `6DE9B68E178C5096AD0514CF2B5FA11F8C582070783EAB41C6EF1838EEBA9602` | +| [`NETworkManager_2025.10.18.0_Archive.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2025.10.18.0/NETworkManager_2025.10.18.0_Archive.zip) | `F0E684FFB1C7F03642735403D6D30F75839A3B21E698624D219964363948442F` | + +**System requirements** + +- Windows 10 / Server x64 (22H2 or later) +- [.NET Desktop Runtime 8.0 (LTS) - x64](https://dotnet.microsoft.com/en-us/download/dotnet/8.0/runtime) + +## What's new? + +**Profiles** + +- Added the ability to filter profiles by tags using the filter button next to the search field. (See this [blog post](https://borntoberoot.net/NETworkManager/blog/streamlined-profile-management-with-tags-and-filters) for more details) [#3144](https://github.com/BornToBeRoot/NETworkManager/pull/3144) [#3187](https://github.com/BornToBeRoot/NETworkManager/pull/3187) [#3194](https://github.com/BornToBeRoot/NETworkManager/pull/3194) +- Introduced a context menu for profile groups to collapse or expand all groups at once. [#3171](https://github.com/BornToBeRoot/NETworkManager/pull/3171) + +## Improvements + +- Improved light theme for enhanced readability and contrast. [#3191](https://github.com/BornToBeRoot/NETworkManager/pull/3191) +- Redesigned the settings reset dialog for a clearer and more user-friendly experience. [#3138](https://github.com/BornToBeRoot/NETworkManager/pull/3138) + +**WiFi** + +- Added documentation for Windows 11 24H2 location permission requirements. [#3148](https://github.com/BornToBeRoot/NETworkManager/pull/3148) + +## Bug Fixes + +- Fixed an issue where the status window was out of screen when a display scale other than 100% was set. [#3185](https://github.com/BornToBeRoot/NETworkManager/pull/3185) + +**Web Console** + +- Fixed a crash that occurred when clearing the browser cache. [#3169](https://github.com/BornToBeRoot/NETworkManager/pull/3169) + +**Profiles** + +- Fixed an issue where only one profile was deleted in `Settings > Profiles` when multiple profiles were selected. [#3144](https://github.com/BornToBeRoot/NETworkManager/pull/3144) [#3145](https://github.com/BornToBeRoot/NETworkManager/issues/3145) + +## Dependencies, Refactoring & Documentation + +- Documentation updated [#3187](https://github.com/BornToBeRoot/NETworkManager/pull/3187) +- Code cleanup & refactoring +- Language files updated via [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration) +- Dependencies updated via [#dependabot](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Fdependabot) [#3190](https://github.com/BornToBeRoot/NETworkManager/pull/3190) diff --git a/Website/docs/changelog/2025-8-10-0.md b/Website/docs/changelog/2025-8-10-0.md new file mode 100644 index 0000000000..f45c1f8bbf --- /dev/null +++ b/Website/docs/changelog/2025-8-10-0.md @@ -0,0 +1,130 @@ +--- +sidebar_position: 982 +description: "Changelog for NETworkManager 2025.8.10.0 — release notes with new features, improvements, and bug fixes." +keywords: [NETworkManager, changelog, release notes, 2025.8.10.0, update] +--- + +# 2025.8.10.0 + +Version: **2025.8.10.0**
+Release date: **10.08.2025** + +| File | `SHA256` | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| [`NETworkManager_2025.8.10.0_Setup.msi`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2025.8.10.0/NETworkManager_2025.8.10.0_Setup.msi) | `1F899FE5B3F4B162CACED4E933B3033734995D5CA6AD95F6BACE5BB5AB63A6AC` | +| [`NETworkManager_2025.8.10.0_Portable.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2025.8.10.0/NETworkManager_2025.8.10.0_Portable.zip) | `AA2DED2139C9D0FD39A9B20310FA1670549939FAA5E41818E6ADF6A941E98446` | +| [`NETworkManager_2025.8.10.0_Archive.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2025.8.10.0/NETworkManager_2025.8.10.0_Archive.zip) | `2CC3C48F148657AF5CCF4E45587D50964B1E9EADFD8A771EC6FD12D168134504` | + +**System requirements** + +- Windows 10 / Server x64 (22H2 or later) +- [.NET Desktop Runtime 8.0 (LTS) - x64](https://dotnet.microsoft.com/en-us/download/dotnet/8.0/runtime) + +## What's new? + +- New language Japanese (`ja-JP`) has been added. Thanks to [@coolvitto](https://github.com/coolvitto) [#3044](https://github.com/BornToBeRoot/NETworkManager/pull/3044) [#3030](https://github.com/BornToBeRoot/NETworkManager/pull/3030) [#3035](https://github.com/BornToBeRoot/NETworkManager/pull/3035) + +**Hosts File Editor** + +- New feature to display (and edit) the `hosts` file. (See this [blog post](https://borntoberoot.net/NETworkManager/blog/introducing-hosts-file-editor) and the [documentation](https://borntoberoot.net/NETworkManager/docs/application/hosts-file-editor) for more details) [#3012](https://github.com/BornToBeRoot/NETworkManager/pull/3012) [#3092](https://github.com/BornToBeRoot/NETworkManager/pull/3092) [#3094](https://github.com/BornToBeRoot/NETworkManager/pull/3094) [#3098](https://github.com/BornToBeRoot/NETworkManager/pull/3098) [#3103](https://github.com/BornToBeRoot/NETworkManager/pull/3103) + +**DNS Lookup** + +- `DNSKEY` records are now supported. [#3060](https://github.com/BornToBeRoot/NETworkManager/pull/3060) +- `SRV` records are now supported. [#3060](https://github.com/BornToBeRoot/NETworkManager/pull/3060) +- `CAA` records are now supported. [#3012](https://github.com/BornToBeRoot/NETworkManager/pull/3012) +- `MX` records now support priority. The result is now shown as `10 mail.example.com.` instead of `mail.example.com.`. [#3118](https://github.com/BornToBeRoot/NETworkManager/pull/3118) + +**Web Console** + +- Credentials can now be stored in the WebView2 browser, similar to Microsoft Edge. [#3056](https://github.com/BornToBeRoot/NETworkManager/pull/3056) +- History, cookies, cache, credentials, etc. can now be deleted via the `Delete browsing data` button in the settings. [#3056](https://github.com/BornToBeRoot/NETworkManager/pull/3056) + +## Improvements + +- Redesign welcome dialog. [#3077](https://github.com/BornToBeRoot/NETworkManager/pull/3077) +- Redesign profile dialog. [#3087](https://github.com/BornToBeRoot/NETworkManager/pull/3087) +- Redesign group dialog. [#3089](https://github.com/BornToBeRoot/NETworkManager/pull/3089) +- Redesign confirm delete dialog. [#3087](https://github.com/BornToBeRoot/NETworkManager/pull/3087) +- Redesign export dialog. [#3090](https://github.com/BornToBeRoot/NETworkManager/pull/3090) +- Add upgrade dialog when updating from a previous version. [#3077](https://github.com/BornToBeRoot/NETworkManager/pull/3077) +- Support `sha256sum` to verify the checksum of the downloaded files. (Example: `sha256sum -c NETworkManager_{VERSION}_SHA256SUMS`) + +**Network Interface** + +- Hide (outdated) IPv4/IPv6, DHCP, and DNS informations if adapter is not connected (Status is `down`). [#3114](https://github.com/BornToBeRoot/NETworkManager/pull/3114) + +**WiFi** + +- Redesign refresh button/view. [#3012](https://github.com/BornToBeRoot/NETworkManager/pull/3012) + +**DNS Lookup** + +- Record types that are not implemented are now hidden in the user interface. [#3012](https://github.com/BornToBeRoot/NETworkManager/pull/3012) + +**PowerShell** + +- Find `pwsh.exe` and `powershell.exe` executable by path, similar to `where.exe`. [#2962](https://github.com/BornToBeRoot/NETworkManager/pull/2962) + +**PuTTY** + +- Find `putty.exe` executable by path, similar to `where.exe`. [#2962](https://github.com/BornToBeRoot/NETworkManager/pull/2962) + +**AWS Session Manager** + +- Find `pwsh.exe` and `powershell.exe` executable by path, similar to `where.exe`. [#2962](https://github.com/BornToBeRoot/NETworkManager/pull/2962) + +**Web Console** + +- Setting `Show status bar` added to show or hide the status bar. [#3056](https://github.com/BornToBeRoot/NETworkManager/pull/3056) +- Setting `Save credentials` added to display a dialog to save login informations in the WebView2 browser similar to Microsoft Edge. [#3056](https://github.com/BornToBeRoot/NETworkManager/pull/3056) +- Button `Delete browsing data` added to delete the browsing data (history, cookies, cache, credentials, etc.) of the current WebView2 profile. [#3056](https://github.com/BornToBeRoot/NETworkManager/pull/3056) + +**Connections** + +- Redesign refresh button/view. [#3012](https://github.com/BornToBeRoot/NETworkManager/pull/3012) + +**Listeners** + +- Redesign refresh button/view. [#3012](https://github.com/BornToBeRoot/NETworkManager/pull/3012) + +**ARP** + +- Redesign refresh button/view. [#3012](https://github.com/BornToBeRoot/NETworkManager/pull/3012) + +**Profiles** + +- Changed the unlock dialog from `MahApps.Metro.Controls.Dialogs` to `MahApps.Metro.SimpleChildWindow`, so the main window can be dragged and resized [#3010](https://github.com/BornToBeRoot/NETworkManager/pull/3010) + +## Bugfixes + +- Fixed an issue where the profile file could be overwritten when creating a new profile file with the same name, but with another case (`Profile` exists, but `profile` is created). [#3087](https://github.com/BornToBeRoot/NETworkManager/pull/3087) +- Fixed an application crash when a profile file is renamed to another case (e.g. `Profile` to `profile`) [#3087](https://github.com/BornToBeRoot/NETworkManager/pull/3087). + +**Network Interface** + +- Re-select the network interface after a network change or configuration update. Thanks to [@Ghislain1](https://github.com/Ghislain1) [#3004](https://github.com/BornToBeRoot/NETworkManager/pull/3004) [#2962](https://github.com/BornToBeRoot/NETworkManager/pull/2962) + +**WiFi** + +- Fix filter by frequency if search is empty. [#3012](https://github.com/BornToBeRoot/NETworkManager/pull/3012) +- Reload animation fixed in some cases. [#3012](https://github.com/BornToBeRoot/NETworkManager/pull/3012) + +**PowerShell** + +- Set PowerShell console color for correct path... [#3023](https://github.com/BornToBeRoot/NETworkManager/pull/3023) + +**SNMP** + +- Fixed an issue where the ConsoleTextBox is not displayed correctly. [#3012](https://github.com/BornToBeRoot/NETworkManager/pull/3012) + +**Whois** + +- Fixed an issue where the ConsoleTextBox is not displayed correctly. [#3012](https://github.com/BornToBeRoot/NETworkManager/pull/3012) + +## Dependencies, Refactoring & Documentation + +- Code cleanup & refactoring +- Language files updated via [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration) +- Dependencies updated via [#dependabot](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Fdependabot) +- Gurubase Widget removed [#3059](https://github.com/BornToBeRoot/NETworkManager/pull/3059) diff --git a/Website/docs/changelog/2026-2-22-0.md b/Website/docs/changelog/2026-2-22-0.md new file mode 100644 index 0000000000..7647b44b04 --- /dev/null +++ b/Website/docs/changelog/2026-2-22-0.md @@ -0,0 +1,197 @@ +--- +sidebar_position: 980 +description: "Changelog for NETworkManager 2026.2.22.0 — release notes with new features, improvements, and bug fixes." +keywords: [NETworkManager, changelog, release notes, 2026.2.22.0, update] +--- + +# 2026.2.22.0 + +Version: **2026.2.22.0**
+Release date: **22.02.2026** + +| File | `SHA256` | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| [`NETworkManager_2026.2.22.0_Setup.msi`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2026.2.22.0/NETworkManager_2026.2.22.0_Setup.msi) | `AD3A107D76B9391C88C4427717F243C64309F4D66FEA9775AAB75C1CD51A2D4E` | +| [`NETworkManager_2026.2.22.0_Portable.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2026.2.22.0/NETworkManager_2026.2.22.0_Portable.zip) | `68F2B9F2908D3725633DF2CD91FE7B4D21390CE2E39457B9DBFA2AC80ABE05E8` | +| [`NETworkManager_2026.2.22.0_Archive.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2026.2.22.0/NETworkManager_2026.2.22.0_Archive.zip) | `E535D411472F45420BB3C42EDA45470BD05EECA989074ED68D9F5A4290C3711D` | + +**System requirements** + +- Windows 10 / Server x64 (22H2 or later) +- [.NET Desktop Runtime 10.0 (LTS) - x64](https://dotnet.microsoft.com/en-us/download/dotnet/10.0/runtime) + +## Breaking Changes + +- Migrated from .NET 8.0 (LTS) to .NET 10.0 (LTS). + Upgrade your [.NET Desktop Runtime to version 10.0 (LTS) - x64](https://dotnet.microsoft.com/en-us/download/dotnet/10.0/runtime) before you install this version. [#3229](https://github.com/BornToBeRoot/NETworkManager/pull/3229) + +- Starting with .NET 9.0, the behavior of `NetworkInterface.GetAllNetworkInterfaces()` changed — the API now returns all network interfaces (including virtual adapters, WAN Miniport, extensions/drivers, etc.), which can cause additional or unexpected adapters to appear in the `Network Interface` view. This is an intentional change by Microsoft; see [dotnet/runtime#122751](https://github.com/dotnet/runtime/issues/122751) for details. To reduce noise, NETworkManager maintains a blacklist of known unwanted adapters. If you encounter adapters that should be excluded, please report them via the [issue tracker](https://github.com/BornToBeRoot/NETworkManager/issues/new/choose). [#3286](https://github.com/BornToBeRoot/NETworkManager/issues/3286) [#3309](https://github.com/BornToBeRoot/NETworkManager/pull/3309) + +- `AWS Session Manager` feature has been removed. The [AWS Session Manager Plugin](https://github.com/aws/session-manager-plugin) is not actively maintained and contains several bugs (e.g. German / Spain keyboard layout issues). The current code base was also difficult to maintain and extend, and I currently have no test environment. + The Sync feature (EC2 instances -> Profiles) has been removed as well, because it was limited to AWS Session Manager only. This will be re-introduced in a future release to support multiple providers (`AWS`, `Azure`, etc.) and more features like `Ping Monitor`, `PuTTY` or `Remote Desktop`. + + :::note + + You can still use AWS Session Manager within NETworkManager with the PowerShell feature by using the `aws ssm start-session --target ` command. + + ::: + +- Profile and settings files have been migrated from `XML` to `JSON`. Existing files will be automatically converted to `JSON` on first load after the update. [#3282](https://github.com/BornToBeRoot/NETworkManager/pull/3282) [#3299](https://github.com/BornToBeRoot/NETworkManager/pull/3299) + + :::note + + Starting with this release, new profile and settings files are created in `JSON` format. Existing `XML` files will be converted automatically on first load after upgrading. Automatic support for the migration will be provided until at least `2027`; after that only `JSON` files will be supported and very old installations may require an interim update. + + The migration process creates a backup of the original files in the `Backups` subfolder of the settings and profiles directories. You can restore the originals from that folder if needed (they will work with the privous version), but it's **recommended to make a separate backup of your profile and settings files before updating**. If you encounter any issues during or after the migration, please report them via the [issue tracker](https://github.com/BornToBeRoot/NETworkManager/issues/new/choose). + + ::: + +## What's new? + +- [System-Wide Policies](../system-wide-policies.md) for enterprise deployment and management. Administrators can now configure system-wide policies via a `config.json` file in the application directory to control specific settings for all users. This allows for centralized management of application behavior in enterprise environments. [#3313](https://github.com/BornToBeRoot/NETworkManager/pull/3313) [#3326](https://github.com/BornToBeRoot/NETworkManager/pull/3326) + + Currently supported policies include (more will be added in future releases): + - Check for updates at startup (see [Update > Check for updates at startup](../settings/update.md#check-for-updates-at-startup) documentation for more information) + - Settings folder location (see [Settings > Location](../settings/settings.md#location) documentation for more information) + - Profiles folder location (see [Profiles > Location](../settings/profiles.md#location) documentation for more information) + +
+ + :::note + + If you have specific requirements for system-wide policies in your organization, please submit a feature request via the [GitHub issue tracker](https://github.com/BornToBeRoot/NETworkManager/issues/new/choose) which helps to prioritize development of new policies. + + ::: + +**Profiles** + +- Profiles folder location can now be changed by the user in the settings (see [Profiles > Location](../settings/profiles.md#location) documentation for more information). [#3340](https://github.com/BornToBeRoot/NETworkManager/pull/3340) +- Profiles folder location can now be configured via a system-wide policy, allowing administrators to enforce a specific location for all users. [#3340](https://github.com/BornToBeRoot/NETworkManager/pull/3340) + +**Settings** + +- Settings folder location can now be changed by the user in the settings (see [Settings > Location](../settings/settings.md#location) documentation for more information). [#3324](https://github.com/BornToBeRoot/NETworkManager/pull/3324) +- Settings folder location can now be configured via a system-wide policy, allowing administrators to enforce a specific location for all users. [#3324](https://github.com/BornToBeRoot/NETworkManager/pull/3324) + +**Update** + +- The update check at startup can now be configured via a system-wide policy, allowing administrators to control whether the application checks for updates (see [Update > Check for updates at startup](../settings/update.md#check-for-updates-at-startup) documentation for more information). [#3313](https://github.com/BornToBeRoot/NETworkManager/pull/3313) +- New language Ukrainian (`uk-UA`) has been added. Thanks to [@vadickkt](https://github.com/vadickkt) [#3240](https://github.com/BornToBeRoot/NETworkManager/pull/3240) +- Migrated all dialogs to child windows for improved usability and accessibility. [#3271](https://github.com/BornToBeRoot/NETworkManager/pull/3271) + +**DNS Lookup** + +- Allow direct dns server input (`|:` - `` is optional) in the lookup view in addition to select from a list of configured servers. [#3261](https://github.com/BornToBeRoot/NETworkManager/pull/3261) + + See the [DNS Lookup](../application/dns-lookup.md) documentation for more information. + +**Remote Desktop** + +- Flag to enable `Admin (console) session` added to the RDP connect, profile and group dialogs. This flag allows connecting to the console session of the remote computer. [#3216](https://github.com/BornToBeRoot/NETworkManager/pull/3216) + +## Improvements + +**Profiles** + +- Profile file format migrated from `XML` to `JSON`. The profile file will be automatically converted on first load after the update. [#3299](https://github.com/BornToBeRoot/NETworkManager/pull/3299) +- Create a daily backup of profile files before saving changes. By default, up to `10` backup files are kept in the `Backups` subfolder of the profiles directory. [#3302](https://github.com/BornToBeRoot/NETworkManager/pull/3302) +- Profile file creation flow improved — when adding a new profile you are now prompted to enable profile-file encryption to protect stored credentials and settings. [#3227](https://github.com/BornToBeRoot/NETworkManager/pull/3227) +- Profile file dialog migrated to a child window to improve usability. [#3227](https://github.com/BornToBeRoot/NETworkManager/pull/3227) +- Credential dialogs migrated to child windows to improve usability. [#3231](https://github.com/BornToBeRoot/NETworkManager/pull/3231) + +**Settings** + +- Settings file format migrated from `XML` to `JSON`. The settings file will be automatically converted on first load after the update. [#3282](https://github.com/BornToBeRoot/NETworkManager/pull/3282) +- Create a daily backup of the settings file before saving changes. By default, up to `10` backup files are kept in the `Backups` subfolder of the settings directory. [#3283](https://github.com/BornToBeRoot/NETworkManager/pull/3283) [#3302](https://github.com/BornToBeRoot/NETworkManager/pull/3302) + +**Dashboard** + +- Enhance local IP detection logic: If local IP cannot be determined via routing, now iterates over active network adapters and selects the first valid IPv4/IPv6 address (with link-local addresses (`169.254.x.x`, `fe80::..`) given lower priority). [#3296](https://github.com/BornToBeRoot/NETworkManager/pull/3296) + +**IP Scanner** + +- Improved local subnet detection: If local IP cannot be determined via routing, now iterates over active network adapters and selects the first valid IPv4 address (with link-local addresses (`169.254.x.x`) given lower priority). [#3288](https://github.com/BornToBeRoot/NETworkManager/pull/3288) + +**DNS Lookup** + +- Allow hostname as server address in addition to IP address in the add/edit server dialog. [#3261](https://github.com/BornToBeRoot/NETworkManager/pull/3261) +- Add `quad9` to the predefined DNS server list. [#3261](https://github.com/BornToBeRoot/NETworkManager/pull/3261) +- Redesign add/edit server dialog (migrated from dialog to child window). [#3261](https://github.com/BornToBeRoot/NETworkManager/pull/3261) + +**Remote Desktop** + +- Redesign RDP connect dialog (migrated from dialog to child window). [#3216](https://github.com/BornToBeRoot/NETworkManager/pull/3216) + +**PowerShell** + +- Redesign PowerShell connect dialog (migrated from dialog to child window). [#3234](https://github.com/BornToBeRoot/NETworkManager/pull/3234) + +**PuTTY** + +- Redesign PuTTY connect dialog (migrated from dialog to child window). [#3234](https://github.com/BornToBeRoot/NETworkManager/pull/3234) + +**Web Console** + +- Redesign Web Console connect dialog (migrated from dialog to child window). [#3234](https://github.com/BornToBeRoot/NETworkManager/pull/3234) + +**SNTP Lookup** + +- Redesign add/edit server dialog (migrated from dialog to child window). [#3261](https://github.com/BornToBeRoot/NETworkManager/pull/3261) + +## Bug Fixes + +**WiFi** + +- Fix potential error in export logic if some data is null. [#3291](https://github.com/BornToBeRoot/NETworkManager/pull/3291) +- Fix missing simicolon separators in CSV output. [#3291](https://github.com/BornToBeRoot/NETworkManager/pull/3291) +- Fix wrong name in xml export [#3293](https://github.com/BornToBeRoot/NETworkManager/pull/3293) + +**IP Scanner** + +- Fix race condition when scan is complete but not all results have been processed yet, causing a wrong error message to be displayed. [#3287](https://github.com/BornToBeRoot/NETworkManager/pull/3287) +- Fix potential error in export logic if some data is null. [#3290](https://github.com/BornToBeRoot/NETworkManager/pull/3290) +- Fix missing simicolon separators in CSV output. [#3290](https://github.com/BornToBeRoot/NETworkManager/pull/3290) + +**Port Scanner** + +- Fix race condition when scan is complete but not all results have been processed yet, causing a wrong error message to be displayed. [#3287](https://github.com/BornToBeRoot/NETworkManager/pull/3287) + +**Traceroute** + +- Fix potential error in export logic if some data is null. [#3291](https://github.com/BornToBeRoot/NETworkManager/pull/3291) +- Fix missing simicolon separators in CSV output. [#3291](https://github.com/BornToBeRoot/NETworkManager/pull/3291) + +**PowerShell** + +- Resolve the actual path to `pwsh.exe` under `C:\Program Files\WindowsApps\` instead of relying on the stub located at `%LocalAppData%\Microsoft\WindowsApps\`. The stub simply redirects to the real executable, and settings such as themes are applied only to the real binary via the registry. [#3246](https://github.com/BornToBeRoot/NETworkManager/pull/3246) +- The new profile filter popup introduced in version `2025.10.18.0` was instantly closed when a `PowerShell` session was opened and the respective application / view was selected. [#3219](https://github.com/BornToBeRoot/NETworkManager/pull/3219) + +**PuTTY** + +- The new profile filter popup introduced in version `2025.10.18.0` was instantly closed when a `PuTTY` session was opened and the respective application / view was selected. [#3219](https://github.com/BornToBeRoot/NETworkManager/pull/3219) + +**SNMP** + +- Fix `NullReferenceException` when no SNMP profile is selected in the DataGrid and `Return` key is pressed. [#3271](https://github.com/BornToBeRoot/NETworkManager/pull/3271) + +**SNTP Lookup** + +- Fix wrong name in xml export [#3293](https://github.com/BornToBeRoot/NETworkManager/pull/3293) + +**Subnet Calculator** + +- Fix wrong name in xml export [#3293](https://github.com/BornToBeRoot/NETworkManager/pull/3293) + +## Dependencies, Refactoring & Documentation + +- Documentation updated +- Code cleanup & refactoring + - Introduced a new DialogHelper utility to centralize creation of `OK` and `OK/Cancel` dialogs. This reduces duplication and enforces a consistent layout. [#3231](https://github.com/BornToBeRoot/NETworkManager/pull/3231) + - Migrate RegexHelper to precompiled Regex patterns for improved performance. [#3261](https://github.com/BornToBeRoot/NETworkManager/pull/3261) +- Update Ports, OUIs, Whois servers [#3274](https://github.com/BornToBeRoot/NETworkManager/pull/3274) +- Migrated existing credential and profile dialogs to use DialogHelper, improving usability, accessibility and maintainability across the app. [#3231](https://github.com/BornToBeRoot/NETworkManager/pull/3231) +- Language files updated via [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration) +- Dependencies updated via [#dependabot](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Fdependabot) +- Add Junie/Gemini 3 generated XML documentation headers for roughly half of the ViewModels. This might help with readability. [#3251](https://github.com/BornToBeRoot/NETworkManager/pull/3251) +- Generate project guidelines for Rider's coding agent Junie using itself as generator. [#3250](https://github.com/BornToBeRoot/NETworkManager/pull/3250) +- `Agents.md` file added to document the use of AI agents in the project and provide guidelines for their use. diff --git a/Website/docs/changelog/2026-7-7-0.md b/Website/docs/changelog/2026-7-7-0.md new file mode 100644 index 0000000000..d84dfb7877 --- /dev/null +++ b/Website/docs/changelog/2026-7-7-0.md @@ -0,0 +1,171 @@ +--- +sidebar_position: 979 +description: "Changelog for NETworkManager 2026.7.7.0 — release notes with new features, improvements, and bug fixes." +keywords: [NETworkManager, changelog, release notes, 2026.7.7.0, update] +--- + +# 2026.7.7.0 + +Version: **2026.7.7.0**
+Release date: **07.07.2026** + +| File | `SHA256` | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| [`NETworkManager_2026.7.7.0_Setup.msi`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2026.7.7.0/NETworkManager_2026.7.7.0_Setup.msi) | `26B4CED4ED8FF48ED10B484A7C25580F6FCE545C18643461428BBDB47D171824` | +| [`NETworkManager_2026.7.7.0_Portable.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2026.7.7.0/NETworkManager_2026.7.7.0_Portable.zip) | `39D4A17A299431079C021EB480C4B0B718B9A3C56A0A3FDCD079C89B83740290` | +| [`NETworkManager_2026.7.7.0_Archive.zip`](https://github.com/BornToBeRoot/NETworkManager/releases/download/2026.7.7.0/NETworkManager_2026.7.7.0_Archive.zip) | `12B996FA47E157DD030F405492C0F91FA65241B7630003BC3205D4DB8915182D` | + +**System requirements** + +- Windows 10 / Server x64 (22H2 or later) +- [.NET Desktop Runtime 10.0 (LTS) - x64](https://dotnet.microsoft.com/en-us/download/dotnet/10.0/runtime) + +## Breaking Changes + +- **ARP Table** has been renamed to **[Neighbor Table](../application/neighbor-table.md)**. The application list entry is automatically migrated on first launch. Other view settings (auto-refresh interval, export file type/path) reset to their defaults. [#3403](https://github.com/BornToBeRoot/NETworkManager/pull/3403) +- **IP Scanner** export: The `ARPMACAddress` and `ARPVendor` columns have been removed from CSV, XML and JSON exports. Use `MACAddress` and `Vendor` instead, which contain the same value (ARP/NDP preferred, NetBIOS as fallback). [#3403](https://github.com/BornToBeRoot/NETworkManager/pull/3403) +- **IP Scanner** custom commands: The placeholder syntax has changed from `$$ipaddress$$` / `$$hostname$$` to `{{IPAddress}}` / `{{Hostname}}`. Existing custom commands are automatically migrated on first launch. [#3511](https://github.com/BornToBeRoot/NETworkManager/pull/3511) + +## What's new? + +**Dashboard** + +- New **Speed Test** widget to measure download/upload speed, latency, and jitter against [`speed.cloudflare.com`](https://speed.cloudflare.com/). The test is user-initiated and shows download (Mbps), upload (Mbps), latency (ms), jitter (ms), ISP, and server location. A privacy disclaimer is shown before use. [#3440](https://github.com/BornToBeRoot/NETworkManager/pull/3440) + +**WiFi** + +- Added **Channel Width** column (in MHz) to the network list. Channel bandwidth is retrieved via the native `WlanApi`, bypassing the `Windows.Devices.WiFi` API limitation. Typical values: 20, 40, 80, 160 MHz. [#3462](https://github.com/BornToBeRoot/NETworkManager/pull/3462) +- The **Channels** tab now supports 6 GHz networks and is split into two sub-tabs: **2.4 & 5 GHz** and **6 GHz**. The 6 GHz view uses separate lower (channels 1–125) and upper (channels 129–233) charts for readability. [#3462](https://github.com/BornToBeRoot/NETworkManager/pull/3462) + +**PowerShell** + +- DPI scaling is now applied correctly when NETworkManager is moved to a monitor with a different DPI scaling factor. The embedded PowerShell (conhost) window now rescales its font automatically using the Windows Console API (`AttachConsole` + `SetCurrentConsoleFontEx`), bypassing the OS limitation that prevents `WM_DPICHANGED` from being forwarded to cross-process child windows. [#3352](https://github.com/BornToBeRoot/NETworkManager/pull/3352) + +**PuTTY** + +- DPI scaling is now applied correctly when NETworkManager is moved to a monitor with a different DPI scaling factor. The embedded PuTTY window now receives an explicit `WM_DPICHANGED` message with the new DPI value packed into `wParam`, since the OS does not forward this message across process boundaries after `SetParent`. [#3352](https://github.com/BornToBeRoot/NETworkManager/pull/3352) + +**Firewall** + +- New feature to quickly add, edit, enable, disable and delete NETworkManager-owned firewall rules. Managed rules are prefixed with `NETworkManager_` in the Windows Firewall. (See the [documentation](https://borntoberoot.net/NETworkManager/docs/application/firewall) for more details) [#3383](https://github.com/BornToBeRoot/NETworkManager/pull/3383) + +**[Neighbor Table](../application/neighbor-table.md)** (formerly ARP Table) + +- IPv6 (NDP) neighbor entries are now shown in addition to IPv4 (ARP). [#3403](https://github.com/BornToBeRoot/NETworkManager/pull/3403) +- New **Interface** and **State** columns (sortable, searchable). [#3403](https://github.com/BornToBeRoot/NETworkManager/pull/3403) +- Add entry dialog now accepts IPv4 and IPv6 addresses. [#3403](https://github.com/BornToBeRoot/NETworkManager/pull/3403) +- View is read-only when not running elevated; modifying the table requires elevated rights. [#3403](https://github.com/BornToBeRoot/NETworkManager/pull/3403) + +**Profiles** + +- Profiles can now be imported from **Active Directory**. Search for computers by name using an AD query, select the results, assign a group, and apply connection settings (RDP, SSH, etc.) before importing. [#3368](https://github.com/BornToBeRoot/NETworkManager/pull/3368) +- Profiles can now be imported from a **CSV file**. Select a `.csv` file (drag & drop or browse) with `Name;Host` entries and an optional description column, then select the results, assign a group, and apply connection settings (RDP, SSH, etc.) before importing. The delimiter (semicolon, comma or tab) and an optional header row are detected automatically, and re-importing the same file detects already imported entries. [#3502](https://github.com/BornToBeRoot/NETworkManager/pull/3502) + +**Ping Monitor** + +- New **status change notifications**: when a monitored host goes up or down, a stackable popup appears in the bottom-right corner of the primary screen and/or an optional system sound is played. Configurable **success** and **failure thresholds** suppress noise from flapping hosts, the initial state is established silently, and clicking a popup brings the main window to the front. When many hosts change state at once, every host still shows its own popup but the sound is played only once. (See the [documentation](https://borntoberoot.net/NETworkManager/docs/application/ping-monitor#notifications) for more details) [#3471](https://github.com/BornToBeRoot/NETworkManager/pull/3471) + +**Remote Desktop** + +- New **View only** mode to monitor a session without sending input: keyboard and mouse are blocked while the screen keeps updating. It can be enabled in the connect dialog, per profile/group, and globally (inherited Global → Group → Profile), or toggled on the fly via the tab's right-click menu. An eye icon on the tab indicates when a session is view-only, and the **Fullscreen** action and all **Keyboard shortcuts** are disabled while it is active to prevent bypassing it. [#3482](https://github.com/BornToBeRoot/NETworkManager/pull/3482) +- The tab context menu's **Keyboard shortcuts** submenu now also includes **Task Manager** (`Ctrl+Shift+Esc`), **Lock** (`Win+L`), **Show Desktop** (`Win+D`), **Explorer** (`Win+E`) and **Run dialog** (`Win+R`), in addition to the existing **Ctrl+Alt+Del**. Like Ctrl+Alt+Del, these are sent directly via scan codes into the remote session, bypassing local key interception. [#3500](https://github.com/BornToBeRoot/NETworkManager/pull/3500) + +**Language** + +- New language Luxembourgish (`lb-LU`) has been added. [#3490](https://github.com/BornToBeRoot/NETworkManager/pull/3490) + +## Improvements + +**WiFi** + +- Channel width is now visualized in the channel charts as a proportional band, making overlapping networks easier to identify. [#3462](https://github.com/BornToBeRoot/NETworkManager/pull/3462) +- Migrated the WiFi channel charts from LiveCharts to LiveCharts2. [#3462](https://github.com/BornToBeRoot/NETworkManager/pull/3462) + +**IP Scanner** + +- MAC address resolution now uses ARP (IPv4) or NDP (IPv6) from the neighbor cache, with NetBIOS as fallback. The detail panel shows a single **MAC Address** section instead of separate ARP and NetBIOS entries. [#3403](https://github.com/BornToBeRoot/NETworkManager/pull/3403) + +**Profiles** + +- **WebConsole** URL, **PowerShell** additional command line, and **PuTTY** additional command line now support a `{{Host}}` placeholder (e.g. `https://{{Host}}/`) that is resolved to the profile's host each time a connection is established, so it always reflects the current host even after later edits. For PowerShell and PuTTY, the placeholder also resolves in the ad-hoc **Connect** dialog, using the host entered there. A help icon next to each field shows the available placeholder. [#3511](https://github.com/BornToBeRoot/NETworkManager/pull/3511) +- New profiles pre-fill the **WebConsole** URL with `https://{{Host}}`, and profile import (CSV, Active Directory) can now also enable **WebConsole** for imported profiles. [#3511](https://github.com/BornToBeRoot/NETworkManager/pull/3511) + +**Dashboard** + +- Added a **Refresh** button (with animated feedback) to the **Network Connection**, **IP Geolocation**, and **DNS Resolver** widgets. The global reload button in the Status Window has been removed, as each widget now has its own. [#3447](https://github.com/BornToBeRoot/NETworkManager/pull/3447) +- Added a tooltip to the **Speed Test** widget chart showing download/upload speed values on hover. [#3449](https://github.com/BornToBeRoot/NETworkManager/pull/3449) +- Redesign Status Window to make it more compact. [#3359](https://github.com/BornToBeRoot/NETworkManager/pull/3359) + +**Network Interface** + +- Added Network Profile (domain, private, public) information to the Network Interface details view, if available. [#3383](https://github.com/BornToBeRoot/NETworkManager/pull/3383) +- Migrated the bandwidth chart from LiveCharts to LiveCharts2. Added a tooltip showing the download/upload speed on hover. [#3457](https://github.com/BornToBeRoot/NETworkManager/pull/3457) +- The bandwidth chart is now interactive: zoom with the mouse wheel, pan by dragging with the left mouse button, and zoom into a section by dragging with the right mouse button. While inspecting, the chart pauses auto-scrolling and a **Live** button returns it to live mode. The visible time window is now configurable via the new **Chart time** setting (default 60 seconds). [#3457](https://github.com/BornToBeRoot/NETworkManager/pull/3457) +- Reworked the network usage statistics: byte counts are now shown in a human-readable format (exact bytes on hover) and the speed is shown in bit/s (byte/s on hover). [#3457](https://github.com/BornToBeRoot/NETworkManager/pull/3457) +- Configuration commands now run in-process via `SMA.PowerShell.Create()` (using the same `netsh`/`ipconfig` commands as before) instead of spawning an elevated `powershell.exe` process per action. The **Configure** tab now shows a **Restart as Administrator** banner when the app is not elevated — all write operations are blocked until the app runs as admin. [#3499](https://github.com/BornToBeRoot/NETworkManager/pull/3499) +- A success message is now shown in the status bar after **Flush DNS cache**, **Release & Renew**, **Apply**, **Add IPv4 address**, and **Remove IPv4 address** complete successfully. [#3499](https://github.com/BornToBeRoot/NETworkManager/pull/3499) +- **Flush DNS cache** and **Release & Renew** buttons have been moved from the **Information** tab to the **Configure** tab, as they also require elevated rights. [#3499](https://github.com/BornToBeRoot/NETworkManager/pull/3499) + +**Ping Monitor** + +- Migrated charts from LiveCharts to LiveCharts2. Added a tooltip showing the ping time on hover. [#3449](https://github.com/BornToBeRoot/NETworkManager/pull/3449) +- The latency chart is now interactive: zoom with the mouse wheel, pan by dragging with the left mouse button, and zoom into a section by dragging with the right mouse button. While inspecting, the chart pauses auto-scrolling and a **Live** button returns it to live mode. The visible time window is now configurable via the new **Chart time** setting (default 2 minutes). [#3453](https://github.com/BornToBeRoot/NETworkManager/pull/3453) +- Export is now triggered by right-clicking a host directly (instead of the list context menu), so right-clicking the chart can be used to zoom into a section. [#3453](https://github.com/BornToBeRoot/NETworkManager/pull/3453) + +**Discovery Protocol** + +- Added support for `F5` and `Enter` keys to start capturing network packets. [#3383](https://github.com/BornToBeRoot/NETworkManager/pull/3383) +- Redesigned the "restart as admin" note to be more compact and visually consistent. [#3383](https://github.com/BornToBeRoot/NETworkManager/pull/3383) + +**Hosts File Editor** + +- Button to open the hosts file in the default text editor added. [#3383](https://github.com/BornToBeRoot/NETworkManager/pull/3383) + +## Bug Fixes + +**General** + +- Fixed the last column of various DataGrids not resizing to fill the available view width. [#3417](https://github.com/BornToBeRoot/NETworkManager/pull/3417) +- Fixed `CancellationTokenSource` leak in `IPScanner`, `PortScanner`, `Traceroute`, `PingMonitor`, `PingMonitorHost` and `SNMP` ViewModels. The previous instance was never disposed before being overwritten on each run, leaking the underlying `WaitHandle`. [#3448](https://github.com/BornToBeRoot/NETworkManager/pull/3448) +- Fixed a `Dispatcher.ShutdownStarted` handler leak in the Dragablz tab items (PowerShell, PuTTY, TigerVNC, Remote Desktop and Web Console controls, plus the IP Scanner, Port Scanner, Traceroute, DNS Lookup, IP Geolocation, SNMP, SNTP Lookup and Whois views). The handler was subscribed in the constructor but never removed, keeping each closed tab (view and view model) alive until the application exited. It is now unsubscribed in `CloseTab()`; the Web Console additionally disposes its WebView2 instance. [#3454](https://github.com/BornToBeRoot/NETworkManager/pull/3454) + +**WiFi** + +- Fixed the WiFi view silently failing to load (e.g. on Windows ARM64 running the emulated x64 build) when `WiFiAdapter.RequestAccessAsync()` threw an exception. The exception is now logged and the view shows the "access not available" message with a settings button instead of an empty tab. [#3462](https://github.com/BornToBeRoot/NETworkManager/pull/3462) + +**Port Scanner** + +- Fixed an app crash when double-clicking a port profile. [#3382](https://github.com/BornToBeRoot/NETworkManager/pull/3382) + +**PowerShell** + +- Fixed incorrect initial embedded window size on high-DPI monitors. The `WindowsFormsHost` panel now sets its initial dimensions in physical pixels using the current DPI scale factor, ensuring the PowerShell window fills the panel correctly at startup. [#3352](https://github.com/BornToBeRoot/NETworkManager/pull/3352) + +**PuTTY** + +- Fixed incorrect initial embedded window size on high-DPI monitors. The `WindowsFormsHost` panel now sets its initial dimensions in physical pixels using the current DPI scale factor, ensuring the PuTTY window fills the panel correctly at startup. [#3352](https://github.com/BornToBeRoot/NETworkManager/pull/3352) + +**Dashboard** + +- Fixed the Status Window auto-close timer firing even when the window was opened manually. The `enableCloseTimer` parameter is now respected, so a manually opened Status Window stays open while the one shown automatically on a network change still closes after the configured time. [#3471](https://github.com/BornToBeRoot/NETworkManager/pull/3471) + +**Ping Monitor** + +- Fixed the **Status change** field showing the time of day formatted as if it were a duration (e.g. `02h 30m 25s` for 14:30:25). It now correctly shows the time of the last status change as `HH:mm:ss`. [#3471](https://github.com/BornToBeRoot/NETworkManager/pull/3471) + +**Network Interface** + +- Fixed `Renew6Action` incorrectly calling `ipconfig /renew` (IPv4) instead of `ipconfig /renew6` (IPv6) when renewing the IPv6 address. [#3441](https://github.com/BornToBeRoot/NETworkManager/pull/3441) +- Bandwidth measurement now includes IPv6 traffic (previously IPv4 only), derives a time-accurate speed, and no longer crashes or shows spikes on adapter errors or interface counter resets. [#3457](https://github.com/BornToBeRoot/NETworkManager/pull/3457) + +**TigerVNC** + +- Fixed incorrect initial embedded window size on high-DPI monitors. The `WindowsFormsHost` panel now sets its initial dimensions in physical pixels using the current DPI scale factor, ensuring the TigerVNC window fills the panel correctly at startup. [#3352](https://github.com/BornToBeRoot/NETworkManager/pull/3352) + +## Dependencies, Refactoring & Documentation + +- Migrated from `LiveCharts` to `LiveCharts2` (`LiveChartsCore.SkiaSharpView.WPF`) for chart rendering. [#3449](https://github.com/BornToBeRoot/NETworkManager/pull/3449) [#3457](https://github.com/BornToBeRoot/NETworkManager/pull/3457) [#3462](https://github.com/BornToBeRoot/NETworkManager/pull/3462) +- Replace fire-and-forget `.ConfigureAwait(false)` calls with explicit discard assignments (`_ = SomeAsyncOperation()`) across command handlers, startup/load paths and profile callbacks. [#3441](https://github.com/BornToBeRoot/NETworkManager/pull/3441) +- Code cleanup & refactoring +- Language files updated via [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration) +- Dependencies updated via [#dependabot](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Fdependabot) diff --git a/Website/docs/changelog/_category_.json b/Website/docs/changelog/_category_.json new file mode 100644 index 0000000000..ac693eb140 --- /dev/null +++ b/Website/docs/changelog/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Changelog", + "position": 1, + "link": { + "type": "generated-index", + "description": "Changelog of all NETworkManager releases" + } +} diff --git a/Website/docs/changelog/next-release.md b/Website/docs/changelog/next-release.md new file mode 100644 index 0000000000..ff4313b21d --- /dev/null +++ b/Website/docs/changelog/next-release.md @@ -0,0 +1,48 @@ +--- +sidebar_position: 0 +description: "Changelog for the next NETworkManager release — upcoming features, improvements, and bug fixes." +keywords: [NETworkManager, changelog, release notes, next release, upcoming features, bug fixes] +--- + +# Next Release + +Version: **Next release**
+Release date: **xx.xx.2026** + +| File | `SHA256` | +| ---- | -------- | + +**System requirements** + +- Windows 10 / Server x64/ARM64 (22H2 or later) +- [.NET Desktop Runtime 10.0 (LTS) - x64/ARM64](https://dotnet.microsoft.com/en-us/download/dotnet/10.0/runtime) + +## Breaking Changes + +## What's new? + +- ARM64 builds are now available. [#3538](https://github.com/BornToBeRoot/NETworkManager/issues/3538) + +**Traceroute** + +- New **Map** view below the hop list, visualizing each resolved hop's geolocation on an offline world map. Consecutive hops are connected with curved, directional arrows; hovering a marker shows its location, ISP/ASN, hostname, IP address and average round-trip time, while hovering an arrow shows the source and destination location of that segment. The map supports mouse-wheel zoom and drag-to-pan, and can be collapsed via a toggle button on the map itself, similar to the Profiles panel. The map is only shown if **Check IP geolocation** and the new **Show map** setting are both enabled, since hops need a resolved geolocation to be plotted. [#3520](https://github.com/BornToBeRoot/NETworkManager/pull/3520) + +## Improvements + +- The collapsed/expanded state of profile groups (e.g. **linux-server**) is now remembered per profile file and shared across all tools, instead of resetting every time you switch tools or restart the application. [#3539](https://github.com/BornToBeRoot/NETworkManager/pull/3539) + +## Bug Fixes + +**Dashboard** + +- Fixed the **Network Connection** widget running a full connection check on every application startup, even if the Status Window or Dashboard was never opened. It now only checks when actually shown - via the tray icon, on a network change, or when the Dashboard tab is opened. [#3553](https://github.com/BornToBeRoot/NETworkManager/pull/3553) +- Fixed the DNS status (Computer/Router/Internet) in the **Network Connection** widget showing as an error when no PTR record exists for the address, which is common and expected for private IP ranges. This is now shown as informational instead of critical. [#3553](https://github.com/BornToBeRoot/NETworkManager/pull/3553) +- Fixed a race condition in the **Network Connection** widget where results from a superseded check could overwrite the results of a newer, still-running check after quickly reopening the widget. [#3553](https://github.com/BornToBeRoot/NETworkManager/pull/3553) + +## Dependencies, Refactoring & Documentation + +- Code cleanup & refactoring +- Refactored the **Network Connection** widget's check logic to reduce duplicated code and share the local IP address detection between the Computer and Router checks instead of detecting it twice. [#3553](https://github.com/BornToBeRoot/NETworkManager/pull/3553) +- Consolidated the duplicated **Profiles** side panel (search, tag filter, grouped list, context menu, add/edit/copy/delete) used across 15 tool views into a single shared control, reducing code duplication. As part of this, the profile panel's expanded/width state is now shared across all tools instead of being tracked per tool. [#3537](https://github.com/BornToBeRoot/NETworkManager/pull/3537) +- Language files updated via [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration) +- Dependencies updated via [#dependabot](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Fdependabot) diff --git a/Website/docs/commandline-arguments.md b/Website/docs/commandline-arguments.md new file mode 100644 index 0000000000..250f919213 --- /dev/null +++ b/Website/docs/commandline-arguments.md @@ -0,0 +1,95 @@ +--- +sidebar_position: 5 +description: "Use command line arguments to control NETworkManager startup behavior, reset settings, and open a specific feature on launch." +keywords: [NETworkManager, command line arguments, CLI, command line options, automation, scripting, parameters] +--- + +# Command Line Arguments + +The **Command Line Arguments** reference lists all CLI options accepted by `NETworkManager.exe`, enabling automation, scripting, and startup customization. + +## Public + +Publicly available command line arguments. + +### `--help` + +Displays the help dialog. + +**Example:** + +```powershell +NETworkManager.exe --help +``` + +### `--reset-settings` + +Resets all application settings. + +**Example:** + +```powershell +NETworkManager.exe --reset-settings +``` + +### `--application:` + +Start a specific application on startup. + +**Possible values:** + +- `Dashboard` +- `NetworkInterface` +- `WiFi` +- `IPScanner` +- `PortScanner` +- `PingMonitor` +- `Traceroute` +- `DNSLookup` +- `RemoteDesktop` +- `PowerShell` +- `PuTTY` +- `TigerVNC` +- `WebConsole` +- `SNMP` +- `SNTPLookup` +- `DiscoveryProtocol` +- `WakeOnLAN` +- `Whois` +- `IPGeolocation` +- `SubnetCalculator` +- `BitCalculator` +- `Lookup` +- `Connections` +- `Listeners` +- `ARPTable` + +**Example:** + +```powershell +NETworkManager.exe --application:PingMonitor +``` + +## Internal + +Internally used command line arguments. + +### `--autostart` + +Indicates whether the application was started automatically (via autostart). + +**Example:** + +```powershell +NETworkManager.exe --autostart +``` + +### `--restart-pid:` + +Process ID of the old application process to wait for it to end if the application is restarted. + +**Example:** + +```powershell +NETworkManager.exe --restart-pid:35674 +``` diff --git a/Website/docs/faq/_category_.json b/Website/docs/faq/_category_.json new file mode 100644 index 0000000000..689a9e74de --- /dev/null +++ b/Website/docs/faq/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "FAQ", + "position": 7, + "link": { + "type": "generated-index", + "description": "Frequently Asked Questions" + } +} diff --git a/Website/docs/faq/file-locations.md b/Website/docs/faq/file-locations.md new file mode 100644 index 0000000000..f1dc1ce69b --- /dev/null +++ b/Website/docs/faq/file-locations.md @@ -0,0 +1,43 @@ +--- +description: "Find where NETworkManager stores its files including profiles, settings, and themes for both Setup (MSI) and Portable installations." +keywords: [NETworkManager, file locations, profile location, settings location, installation path, portable path] +--- + +# File locations + +## Where are files stored? + +The setup installs the application by default in the following path: `%ProgramFiles%\NETworkManager` + +You can run the archive and portable version from anywhere (e.g. USB stick, network share, etc.). + +Profiles, settings and themes are stored in the following folders: + +| File(s) | Setup or Archiv | Portable | +| -------- | --------------------------------------------------- | ------------------------- | +| Profiles | `%UserProfile%\Documents\NETworkManager\Profiles\*` | `\Profiles\*` | +| Settings | `%UserProfile%\Documents\NETworkManager\Settings\*` | `\Settings\*` | +| Themes | `\Themes\*` | `\Themes\*` | + +:::note + +It is recommended to backup the above files on a regular basis. + +::: + +:::tip + +Use a cloud service like OneDrive or Nextcloud to sync the above folders with multiple devices or to use them as a backup. + +::: + +In addition, some files and settings, as well as the cache, are stored in the following locations: + +| File(s) | Setup, Archiv and Portable | +| ------------------- | -------------------------------------------------------------------- | +| Local settings | `%LocalAppData%\NETworkManager\NETworkManager_Url_\*` | +| Log | `%LocalAppData%\NETworkManager\NETworkManager.log` | +| PowerShell profiles | `HKCU:\Console\` | +| PuTTY log | `%LocalAppData%\NETworkManager\PuTTY_Log\*` | +| PuTTY profile | `HKCU:\Software\SimonTatham\PuTTY\Sessions\NETworkManager` | +| WebConsole cache | `%LocalAppData%\NETworkManager\WebConsole_Cache\*` | diff --git a/Website/docs/faq/powershell-cmd-apps.md b/Website/docs/faq/powershell-cmd-apps.md new file mode 100644 index 0000000000..8b767378be --- /dev/null +++ b/Website/docs/faq/powershell-cmd-apps.md @@ -0,0 +1,132 @@ +--- +description: "Learn how to extend NETworkManager's PowerShell integration to run command-line applications like WSL, K9s, iPerf, and AWS SSM using profiles." +keywords: [NETworkManager, PowerShell, command-line apps, WSL, K9s, iPerf, AWS SSM, CLI applications, local console, profiles] +--- + +# PowerShell with command-line applications + +### How do I run a command-line application in PowerShell? + +You can extend the [PowerShell](../application/powershell) integration of NETworkManager to run almost any command-line application — or PowerShell module — with your own configuration. Save the configuration as a profile (or apply it globally or to a group) to make it reusable across sessions. + +![PowerShell with command-line applications](../img/powershell-profile-cmd-apps.png) + +Create a new connection or profile with the following settings: + +- Remote console: `False` +- Command: ` ` + +```powershell + +``` + +:::tip + +This works with any application or module that can be launched from a PowerShell console — not just the examples below. + +::: + +### Which command-line applications can I use? + +The following examples show common command-line applications that can be used with a NETworkManager PowerShell profile. + + +#### K9s + +A terminal UI to interact with and manage Kubernetes clusters. + +- Remote console: `False` +- Command: `k9s` + +```powershell +# Use the default kubeconfig context +k9s + +# Use a specific kubeconfig context with read-only mode +k9s --context --readonly + +# Use a specific kubeconfig file +k9s --kubeconfig +``` + +:::note + +[K9s](https://k9scli.io/) must be installed and configured (e.g. `kubeconfig`) on your system. + +Create a separate profile for each Kubernetes cluster by passing a specific context or `kubeconfig` file. + +::: + +![PowerShell with WSL and K9s](../img/powershell-wsl-k9s.png) + +#### WSL (Windows Subsystem for Linux) + +Run a Linux distribution directly inside a PowerShell tab. + +- Remote console: `False` +- Command: `wsl -d ` + +```powershell +wsl -d +``` + +:::note + +Windows Subsystem for Linux (WSL) must be installed and enabled on your system. + +::: + +#### iPerf + +Measure network throughput between two endpoints. + +- Remote console: `False` +- Command: `iperf3 -c ` + +```powershell +# Run as client +iperf3 -c + +# Run as server +iperf3 -s +``` + +:::note + +[iPerf3](https://iperf.fr/) must be installed on your system. + +::: + +#### Exchange Online + +Connect to Exchange Online to manage mailboxes and tenant settings. + +- Remote console: `False` +- Command: `Connect-ExchangeOnline -UserPrincipalName ` + +```powershell +Connect-ExchangeOnline -UserPrincipalName +``` + +:::note + +The [ExchangeOnlineManagement](https://learn.microsoft.com/en-us/powershell/exchange/exchange-online-powershell-v2) PowerShell module must be installed on your system. + +::: + +#### AWS Session Manager + +Connect to an EC2 instance without opening an inbound SSH port. + +- Remote console: `False` +- Command: `aws ssm start-session --target ` + +```powershell +aws ssm start-session --target +``` + +:::note + +AWS CLI and the AWS Session Manager Plugin must be installed and configured to connect to EC2 instances. + +::: diff --git a/Website/docs/faq/profile-file-encryption.md b/Website/docs/faq/profile-file-encryption.md new file mode 100644 index 0000000000..46a3122022 --- /dev/null +++ b/Website/docs/faq/profile-file-encryption.md @@ -0,0 +1,40 @@ +--- +description: "Learn how NETworkManager encrypts profile files using AES-256-CBC with PBKDF2 key derivation. Understand the security model and encryption settings." +keywords: [NETworkManager, profile encryption, AES-256, PBKDF2, encrypted profiles, secure profiles, password protection] +--- + +# Profile file encryption + +### How does the profile encryption work? + +Profile files are encrypted on disk using [AES](https://docs.microsoft.com/de-de/dotnet/api/system.security.cryptography.aes) with a key size of 256 bits and a block size of 128 bits in CBC mode. The encryption key is derived from a master password using [Rfc2898DeriveBytes](https://docs.microsoft.com/en-US/dotnet/api/system.security.cryptography.rfc2898derivebytes) (PBKDF2) with 1,000,000 iterations. At runtime, passwords are stored as [SecureString](https://docs.microsoft.com/en-US/dotnet/api/system.security.securestring) once the profile file is loaded. For some functions, the password must be converted to a normal string and may remains unencrypted in memory until the garbage collector cleans them up. If you found a security issue, you can report it [here](https://github.com/BornToBeRoot/NETworkManager/security/advisories/new)! + +### How to enable profile file encryption? + +Follow these steps to enable profile file encryption: + +1. Open the settings and go to the profile section. +2. Right click on the profile file you want to encrypt. +3. Select `Encryption...` > `Enable encryption...` and set your master password. + +![Profile file encryption - Enable encryption](../img/profile-file-encryption--enable-encryption.gif) + +### How to change the master password of an encrypted profile file? + +Follow these steps to change the master password of an encrypted profile file: + +1. Open the settings and go to the profile section. +2. Right click on an encrypted profile file. +3. Select `Encryption...` > `Change Master Password...` and enter the current master password and a new master password. + +![Profile file encryption - Change master password](../img/profile-file-encryption--change-master-password.gif) + +### How to disable profile file encryption? + +Follow these steps to disable profile file encryption: + +1. Open the settings and go to the profile section. +2. Right click on an encrypted profile file. +3. Select `Encryption...` > `Disable encryption...` and enter your master password. + +![Profile file encryption - Enable encryption](../img/profile-file-encryption--disable-encryption.gif) diff --git a/Website/docs/faq/settings-priority.md b/Website/docs/faq/settings-priority.md new file mode 100644 index 0000000000..41a1bcd9ba --- /dev/null +++ b/Website/docs/faq/settings-priority.md @@ -0,0 +1,26 @@ +--- +description: "Understand how NETworkManager prioritizes settings across global, group, and profile levels. The most specific setting always takes precedence." +keywords: [NETworkManager, settings priority, settings hierarchy, global settings, group settings, profile settings, configuration priority] +--- + +# Settings Priority + +## How does NETworkManager prioritize settings across different levels (global, group, profile)? + +NETworkManager uses a clear hierarchy to apply settings, allowing you to configure profiles with flexibility and precision. Settings are prioritized across three levels, from broadest to most specific: + +1. **Global Settings** + Default settings applied across all profiles in NETworkManager unless overridden. + _Example_: A default SSH key file used for all network devices. + +2. **Group Settings** + Applied to all profiles within a specific group, overriding global settings. Use these to customize settings for a set of devices. + _Example_: A unique SSH key file for a group of servers in a data center. + +3. **Profile Settings** + Specific to an individual profile, overriding both group and global settings. Use these for fine-tuned configurations on a single device. + _Example_: A custom SSH key file for a critical server. + +Settings are applied in this order: + +**Global Settings (default) → Group Settings (overrides Global) → Profile Settings (overrides Group)** diff --git a/Website/docs/groups-and-profiles.md b/Website/docs/groups-and-profiles.md new file mode 100644 index 0000000000..69f4c8772b --- /dev/null +++ b/Website/docs/groups-and-profiles.md @@ -0,0 +1,191 @@ +--- +sidebar_position: 4 +description: "Organize hosts and networks in named groups and profiles with per-feature connection settings." +keywords: + [ + NETworkManager, + groups, + profiles, + profile management, + encrypted profiles, + host organization, + network profiles, + ] +--- + +# Groups and Profiles + +**Groups and Profiles** let you organize hosts and networks for quick access across all NETworkManager features. Settings defined in a group apply to every profile in that group; settings defined on a profile override the group defaults. See [FAQ > Settings priority](/docs/faq/settings-priority) for more information about the priority order. + +## Overview + +Groups and profiles for all features are managed on the `Profiles` tab in `Settings`. + +![Profiles - Overview](./img/profiles--overview.png) + +### Context menu + +Right-click a selected group to open the group context menu. + +| Action | Description | +| ---------- | ------------------------------- | +| **Edit** | Open the group settings dialog. | +| **Delete** | Delete the selected group. | + +Right-click a selected profile to open the profile context menu. + +| Action | Description | +| ---------- | -------------------------------------- | +| **Edit** | Open the profile settings dialog. | +| **Copy** | Create a copy of the selected profile. | +| **Delete** | Delete the selected profile. | + +### Keyboard shortcuts + +| Key | Action | +| ----- | ------------------------------------- | +| `F2` | Edit the selected group or profile. | +| `Del` | Delete the selected group or profile. | + +Inside a feature, the profile view shows only the groups and profiles enabled for that feature. + +![Profiles - Feature overview](./img/profiles--overview-feature.png) + +:::note + +The edit button for a group appears when hovering over the group header. + +::: + +### Context menu + +Right-click a selected profile to open the profile context menu. + +| Action | Description | +| ---------- | -------------------------------------- | +| **Edit** | Open the profile settings dialog. | +| **Copy** | Create a copy of the selected profile. | +| **Delete** | Delete the selected profile. | + +Right-click a group header to expand or collapse all groups. + +| Action | Description | +| ---------------- | -------------------- | +| **Expand all** | Expand all groups. | +| **Collapse all** | Collapse all groups. | + +### Keyboard shortcuts + +| Key | Action | +| ----- | ---------------------------- | +| `F2` | Edit the selected profile. | +| `Del` | Delete the selected profile. | + +## Group + +In the group settings you can define general settings and feature-specific settings. + +![Profiles - Group settings](./img/profiles--group-settings.png) + +## Profile + +In the profile settings you can define general settings and feature-specific settings. + +:::note + +Profiles are only displayed in a specific feature if they have been enabled via the checkbox. The [`Profiles` tab in `Settings`](#overview) shows all profiles regardless. + +Use **tags** to organize profiles and filter by them. For example, tag profiles as `prod` or `dns` to group related ones. You can filter by `any` or `all` tags. + +::: + +:::tip + +Some settings, such as the `host`, can be inherited from the general settings in the feature-specific settings. + +See also the profile section in the specific [feature documentation](./introduction) for more information. + +::: + +![Profiles - Profile settings](./img/profiles--profile-settings.png) + +## Import + +Profiles can be imported from an external source. To start the import, click **Import** on the [`Profiles` tab in `Settings`](#overview) and select an import source. + +The following import sources are available: + +- [Active Directory](#active-directory) +- [CSV file](#csv-file) + +### Active Directory + +Profiles can be imported from Active Directory by querying computer accounts via LDAP. After selecting **Active Directory** as the import source, configure the connection settings and click **Search**. + +![Profiles - Import Active Directory](./img/profiles--import-active-directory.png) + +| Field | Description | +| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| **Search base** | LDAP search base to query, e.g. `DC=domain,DC=com`. | +| **Server** | Hostname or IP address of the LDAP server. Leave empty to use the default domain controller. | +| **Port** | LDAP port. Defaults to `389` (LDAP) or `636` (LDAPS). Switches automatically when **Use SSL** is toggled. | +| **Use SSL** | Connect using LDAPS (encrypted). | +| **Authentication** | `Use current Windows credentials` authenticates as the logged-in user. `Use these credentials` allows specifying a custom username and password. | +| **Username** | Username for authentication. Only available when **Use these credentials** is selected. | +| **Password** | Password for authentication. Only available when **Use these credentials** is selected. | +| **Exclude disabled accounts** | Skip computer accounts that are disabled in Active Directory. | +| **Additional LDAP filter** | Optional LDAP filter to narrow down results, e.g. `(operatingSystem=Windows Server*)`. | + +Once the computers are found, proceed to [Review and import](#review-and-import) to select entries and configure import options. + +### CSV file + +Profiles can be imported from a CSV file. After selecting **CSV file** as the import source, choose the file (drag & drop it onto the path field or click the browse button) and click **Import**. + +| Field | Description | +| ------------- | ---------------------------------------------------------------- | +| **File path** | Path to the `.csv` file to import. Drag & drop or browse for it. | + +The expected format is one entry per line as `Name;Host`, with an optional third column for the description: + +```csv +Name;Host;Description +Webserver;192.168.1.10;Production web server +DC01;dc01.corp.local +Router;10.0.0.1;Core router +``` + +- A header row (e.g. `Name;Host`) is optional and detected automatically. +- The delimiter (semicolon `;`, comma `,` or tab) is detected automatically. +- The **Description** column is optional. If omitted, a default description with the import date is used. +- Entries without a host are listed but cannot be imported. +- Re-importing the same file detects already imported entries (see the **Status** column in [Review and import](#review-and-import)), based on a hash of the name and host. + +Once the file is parsed, proceed to [Review and import](#review-and-import) to select entries and configure import options. + +### Review and import + +Select the entries to import and configure the options before clicking **Import**. + +![Profiles - Import Review](./img/profiles--import-review.png) + +**Hosts** (left panel) + +| Column | Description | +| ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Name** | Computer name from the import source. | +| **Host** | Hostname used as the profile host address. | +| **Status** | `New` — not yet imported. `Already imported` — already exists as a profile from this source. `No host` — cannot be imported (no host address available). | + +**Applications** (right panel) + +Select which applications to enable for the imported profiles. [Ping Monitor](./application/ping-monitor), [Remote Desktop](./application/remote-desktop), and [PowerShell](./application/powershell) are enabled by default. + +**Options** (right panel) + +| Field | Description | +| ------------------------- | ------------------------------------------------------------------------------------------ | +| **Group** | Target group for the imported profiles. Select an existing group or type a new group name. | +| **Skip already imported** | Skip profiles that have already been imported from this source. Default is `Enabled`. | + +After clicking **Import**, a summary dialog shows how many profiles were imported, how many were skipped as duplicates, and how many were skipped because no host address was available. diff --git a/Website/docs/img/aws-session-manager.png b/Website/docs/img/aws-session-manager.png new file mode 100644 index 0000000000..cf5943e4e6 Binary files /dev/null and b/Website/docs/img/aws-session-manager.png differ diff --git a/Website/docs/img/bit-calculator.png b/Website/docs/img/bit-calculator.png new file mode 100644 index 0000000000..48adb26df8 Binary files /dev/null and b/Website/docs/img/bit-calculator.png differ diff --git a/Website/docs/img/changelog-2669.gif b/Website/docs/img/changelog-2669.gif new file mode 100644 index 0000000000..6c4963aec3 Binary files /dev/null and b/Website/docs/img/changelog-2669.gif differ diff --git a/Website/docs/img/connections.png b/Website/docs/img/connections.png new file mode 100644 index 0000000000..456c32339f Binary files /dev/null and b/Website/docs/img/connections.png differ diff --git a/Website/docs/img/dashboard.png b/Website/docs/img/dashboard.png new file mode 100644 index 0000000000..52ccde6124 Binary files /dev/null and b/Website/docs/img/dashboard.png differ diff --git a/Website/docs/img/discovery-protocol.png b/Website/docs/img/discovery-protocol.png new file mode 100644 index 0000000000..79b353a8b9 Binary files /dev/null and b/Website/docs/img/discovery-protocol.png differ diff --git a/Website/docs/img/dns-lookup.png b/Website/docs/img/dns-lookup.png new file mode 100644 index 0000000000..4e5cf52919 Binary files /dev/null and b/Website/docs/img/dns-lookup.png differ diff --git a/Website/docs/img/firewall-rule.png b/Website/docs/img/firewall-rule.png new file mode 100644 index 0000000000..890707e2cd Binary files /dev/null and b/Website/docs/img/firewall-rule.png differ diff --git a/Website/docs/img/firewall.png b/Website/docs/img/firewall.png new file mode 100644 index 0000000000..d4efc00c17 Binary files /dev/null and b/Website/docs/img/firewall.png differ diff --git a/Website/docs/img/hosts-file-editor-entry.png b/Website/docs/img/hosts-file-editor-entry.png new file mode 100644 index 0000000000..9bfb8d7e0d Binary files /dev/null and b/Website/docs/img/hosts-file-editor-entry.png differ diff --git a/Website/docs/img/hosts-file-editor.png b/Website/docs/img/hosts-file-editor.png new file mode 100644 index 0000000000..38a5af238c Binary files /dev/null and b/Website/docs/img/hosts-file-editor.png differ diff --git a/Website/docs/img/ip-geolocation.png b/Website/docs/img/ip-geolocation.png new file mode 100644 index 0000000000..7b765a4052 Binary files /dev/null and b/Website/docs/img/ip-geolocation.png differ diff --git a/Website/docs/img/ip-scanner.png b/Website/docs/img/ip-scanner.png new file mode 100644 index 0000000000..488f13a582 Binary files /dev/null and b/Website/docs/img/ip-scanner.png differ diff --git a/Website/docs/img/listeners.png b/Website/docs/img/listeners.png new file mode 100644 index 0000000000..2165312620 Binary files /dev/null and b/Website/docs/img/listeners.png differ diff --git a/Website/docs/img/lookup--oui.png b/Website/docs/img/lookup--oui.png new file mode 100644 index 0000000000..3a122a919b Binary files /dev/null and b/Website/docs/img/lookup--oui.png differ diff --git a/Website/docs/img/lookup--port.png b/Website/docs/img/lookup--port.png new file mode 100644 index 0000000000..efb2b95765 Binary files /dev/null and b/Website/docs/img/lookup--port.png differ diff --git a/Website/docs/img/neighbor-table-entry.png b/Website/docs/img/neighbor-table-entry.png new file mode 100644 index 0000000000..e009ab4e11 Binary files /dev/null and b/Website/docs/img/neighbor-table-entry.png differ diff --git a/Website/docs/img/neighbor-table.png b/Website/docs/img/neighbor-table.png new file mode 100644 index 0000000000..3d5c554999 Binary files /dev/null and b/Website/docs/img/neighbor-table.png differ diff --git a/Website/docs/img/network-interface--bandwidth.png b/Website/docs/img/network-interface--bandwidth.png new file mode 100644 index 0000000000..c0ee1d9a68 Binary files /dev/null and b/Website/docs/img/network-interface--bandwidth.png differ diff --git a/Website/docs/img/network-interface--configure.png b/Website/docs/img/network-interface--configure.png new file mode 100644 index 0000000000..cf07a2b505 Binary files /dev/null and b/Website/docs/img/network-interface--configure.png differ diff --git a/Website/docs/img/network-interface--information.png b/Website/docs/img/network-interface--information.png new file mode 100644 index 0000000000..a88bc8ed6c Binary files /dev/null and b/Website/docs/img/network-interface--information.png differ diff --git a/Website/docs/img/ping-monitor.png b/Website/docs/img/ping-monitor.png new file mode 100644 index 0000000000..769da510af Binary files /dev/null and b/Website/docs/img/ping-monitor.png differ diff --git a/Website/docs/img/port-scanner.png b/Website/docs/img/port-scanner.png new file mode 100644 index 0000000000..f7bb4ddb5e Binary files /dev/null and b/Website/docs/img/port-scanner.png differ diff --git a/Website/docs/img/powershell-profile-cmd-apps.png b/Website/docs/img/powershell-profile-cmd-apps.png new file mode 100644 index 0000000000..0e5483bf6f Binary files /dev/null and b/Website/docs/img/powershell-profile-cmd-apps.png differ diff --git a/Website/docs/img/powershell-wsl-k9s.png b/Website/docs/img/powershell-wsl-k9s.png new file mode 100644 index 0000000000..b9c0bfd024 Binary files /dev/null and b/Website/docs/img/powershell-wsl-k9s.png differ diff --git a/Website/docs/img/powershell.png b/Website/docs/img/powershell.png new file mode 100644 index 0000000000..911d0cd83a Binary files /dev/null and b/Website/docs/img/powershell.png differ diff --git a/docs/ProfileFile_ChangeMasterPassword.gif b/Website/docs/img/profile-file-encryption--change-master-password.gif similarity index 100% rename from docs/ProfileFile_ChangeMasterPassword.gif rename to Website/docs/img/profile-file-encryption--change-master-password.gif diff --git a/docs/ProfileFile_DisableEncryption.gif b/Website/docs/img/profile-file-encryption--disable-encryption.gif similarity index 100% rename from docs/ProfileFile_DisableEncryption.gif rename to Website/docs/img/profile-file-encryption--disable-encryption.gif diff --git a/docs/ProfileFile_EnableEncryption.gif b/Website/docs/img/profile-file-encryption--enable-encryption.gif similarity index 100% rename from docs/ProfileFile_EnableEncryption.gif rename to Website/docs/img/profile-file-encryption--enable-encryption.gif diff --git a/Website/docs/img/profiles--group-settings.png b/Website/docs/img/profiles--group-settings.png new file mode 100644 index 0000000000..8a60b4c79d Binary files /dev/null and b/Website/docs/img/profiles--group-settings.png differ diff --git a/Website/docs/img/profiles--import-active-directory.png b/Website/docs/img/profiles--import-active-directory.png new file mode 100644 index 0000000000..be12b80218 Binary files /dev/null and b/Website/docs/img/profiles--import-active-directory.png differ diff --git a/Website/docs/img/profiles--import-review.png b/Website/docs/img/profiles--import-review.png new file mode 100644 index 0000000000..164d786845 Binary files /dev/null and b/Website/docs/img/profiles--import-review.png differ diff --git a/Website/docs/img/profiles--overview-feature.png b/Website/docs/img/profiles--overview-feature.png new file mode 100644 index 0000000000..6f363c5db5 Binary files /dev/null and b/Website/docs/img/profiles--overview-feature.png differ diff --git a/Website/docs/img/profiles--overview.png b/Website/docs/img/profiles--overview.png new file mode 100644 index 0000000000..8f3624c0f2 Binary files /dev/null and b/Website/docs/img/profiles--overview.png differ diff --git a/Website/docs/img/profiles--profile-settings.png b/Website/docs/img/profiles--profile-settings.png new file mode 100644 index 0000000000..60e04025a0 Binary files /dev/null and b/Website/docs/img/profiles--profile-settings.png differ diff --git a/Website/docs/img/putty.png b/Website/docs/img/putty.png new file mode 100644 index 0000000000..e721a7725b Binary files /dev/null and b/Website/docs/img/putty.png differ diff --git a/Website/docs/img/remote-desktop.png b/Website/docs/img/remote-desktop.png new file mode 100644 index 0000000000..666692f81a Binary files /dev/null and b/Website/docs/img/remote-desktop.png differ diff --git a/Website/docs/img/snmp.png b/Website/docs/img/snmp.png new file mode 100644 index 0000000000..2f5a5028ec Binary files /dev/null and b/Website/docs/img/snmp.png differ diff --git a/Website/docs/img/sntp-lookup.png b/Website/docs/img/sntp-lookup.png new file mode 100644 index 0000000000..4a6340e6d6 Binary files /dev/null and b/Website/docs/img/sntp-lookup.png differ diff --git a/Website/docs/img/subnet-calculator--calculator.png b/Website/docs/img/subnet-calculator--calculator.png new file mode 100644 index 0000000000..c344a362e5 Binary files /dev/null and b/Website/docs/img/subnet-calculator--calculator.png differ diff --git a/Website/docs/img/subnet-calculator--subnetting.png b/Website/docs/img/subnet-calculator--subnetting.png new file mode 100644 index 0000000000..ea229c74ce Binary files /dev/null and b/Website/docs/img/subnet-calculator--subnetting.png differ diff --git a/Website/docs/img/subnet-calculator--wide-subnet.png b/Website/docs/img/subnet-calculator--wide-subnet.png new file mode 100644 index 0000000000..e39155dc4d Binary files /dev/null and b/Website/docs/img/subnet-calculator--wide-subnet.png differ diff --git a/Website/docs/img/system-wide-policy-indicator.png b/Website/docs/img/system-wide-policy-indicator.png new file mode 100644 index 0000000000..82880711b3 Binary files /dev/null and b/Website/docs/img/system-wide-policy-indicator.png differ diff --git a/Website/docs/img/tigervnc.png b/Website/docs/img/tigervnc.png new file mode 100644 index 0000000000..d6c38cf7db Binary files /dev/null and b/Website/docs/img/tigervnc.png differ diff --git a/Website/docs/img/traceroute.png b/Website/docs/img/traceroute.png new file mode 100644 index 0000000000..0bfaaf9049 Binary files /dev/null and b/Website/docs/img/traceroute.png differ diff --git a/Website/docs/img/wake-on-lan.png b/Website/docs/img/wake-on-lan.png new file mode 100644 index 0000000000..13181856cb Binary files /dev/null and b/Website/docs/img/wake-on-lan.png differ diff --git a/Website/docs/img/web-console.png b/Website/docs/img/web-console.png new file mode 100644 index 0000000000..bc7f6d68b0 Binary files /dev/null and b/Website/docs/img/web-console.png differ diff --git a/Website/docs/img/whois.png b/Website/docs/img/whois.png new file mode 100644 index 0000000000..38ea499d6b Binary files /dev/null and b/Website/docs/img/whois.png differ diff --git a/Website/docs/img/wifi--channel.png b/Website/docs/img/wifi--channel.png new file mode 100644 index 0000000000..012dea121f Binary files /dev/null and b/Website/docs/img/wifi--channel.png differ diff --git a/Website/docs/img/wifi.png b/Website/docs/img/wifi.png new file mode 100644 index 0000000000..2785bf16d4 Binary files /dev/null and b/Website/docs/img/wifi.png differ diff --git a/Website/docs/introduction.mdx b/Website/docs/introduction.mdx new file mode 100644 index 0000000000..4f84e5ef36 --- /dev/null +++ b/Website/docs/introduction.mdx @@ -0,0 +1,36 @@ +--- +sidebar_position: 0 +description: "Explore NETworkManager, a free open-source Windows tool with 25+ built-in network tools including IP Scanner, Port Scanner, Remote Desktop, PowerShell, and PuTTY." +keywords: [NETworkManager, network management, network tools, open source, Windows, IP scanner, port scanner, remote desktop, SSH, PuTTY, PowerShell, network troubleshooting] +--- + +import ToolChips from "@site/src/components/ToolChips"; +import tools from "@site/src/data/tools"; + +# Introduction + +NETworkManager is a powerful open-source tool for managing networks and troubleshooting network problems! + +![NETworkManager Preview](https://github.com/BornToBeRoot/NETworkManager/raw/main/Website/static/img/preview-features.gif?raw=true) + +## 🧰 Features + +NETworkManager comes with **{tools.length} built-in tools** — everything a network engineer needs, in one place. Select a tool to jump to its documentation: + + + +## 🗂️ Groups and Profiles + +Organize hosts and networks in profiles with individual settings and use them seamlessly across all features. Keep sensitive data secure with encrypted profile files, and manage different customers or environments using separate profile files. See the [Groups and Profiles](./groups-and-profiles.md) section for more information. + +## 🏢 System-Wide Policies + +Administrators can enforce specific settings for all users on a machine using system-wide policies. Policies are defined in a `config.json` file placed in the application installation directory, and override user-specific settings to provide centralized control in enterprise environments. See the [System-Wide Policies](./system-wide-policies.md) section for more information. + +## 🎨 Customization + +NETworkManager comes with dark and light themes and multiple accent colors. You can also provide custom theme files. See the [Appearance settings](./settings/appearance.md) for more information. + +## 🌐 Languages + +Thanks to the community, NETworkManager is available in more than 16 [languages](https://app.transifex.com/BornToBeRoot/NETworkManager/dashboard/). If you want to help translate NETworkManager, you can find everything to get started in the [contributing guidelines](https://github.com/BornToBeRoot/NETworkManager/blob/main/CONTRIBUTING.md). diff --git a/Website/docs/settings/_category_.json b/Website/docs/settings/_category_.json new file mode 100644 index 0000000000..9a5ce9e752 --- /dev/null +++ b/Website/docs/settings/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Settings", + "position": 3, + "link": { + "type": "generated-index", + "description": "Application wide settings of NETworkManager" + } +} diff --git a/Website/docs/settings/appearance.md b/Website/docs/settings/appearance.md new file mode 100644 index 0000000000..38895bccc4 --- /dev/null +++ b/Website/docs/settings/appearance.md @@ -0,0 +1,117 @@ +--- +sidebar_position: 2 +description: "Customize NETworkManager appearance with dark and light themes, accent colors, and custom theme files powered by MahApps.Metro." +keywords: [NETworkManager, appearance settings, dark theme, light theme, accent colors, custom theme, MahApps.Metro] +--- + +# Appearance + +### Theme + +Theme of the application which is based on [`MahApps.Metro themes`](https://mahapps.com/docs/themes/usage) + +**Type:** `String` + +**Default:** `Dark` + +**Possible values:** + +- `Dark` +- `Light` + +### Accent + +Accent of the application which is based on [`MahApps.Metro themes`](https://mahapps.com/docs/themes/usage) + +**Type:** `String` + +**Default:** `Lime` + +**Possible values:** + +- `Red` +- `Green` +- `Blue` +- `Purple` +- `Orange` +- `Lime` +- `Emerald` +- `Teal` +- `Cyan` +- `Cobalt` +- `Indigo` +- `Violet` +- `Pink` +- `Magenta` +- `Crimson` +- `Amber` +- `Yellow` +- `Brown` +- `Olive` +- `Steel` +- `Mauve` +- `Taupe` +- `Sienna` + +:::note + +If you add, change or delete a theme in the folder, you must restart the application for the changes to be applied. + +::: + +### Use custom themes + +Enables or disables the custom themes. + +**Type:** `Boolean` + +**Default:** `Disabled` + +Custom themes can be placed in the `Themes` folder in the application folder (e.g. `C:\Program Files\NETworkManager\Themes`). The file name has the format `..xaml`. For instructions on how to create custom themes, see the [MahApp.Metro documentation](https://mahapps.com/docs/themes/thememanager#creating-custom-themes). + +:::note + +Custom themes override the [`Accent`](#accent) and [`Theme`](#theme) settings. + +::: + +### Apply theme to PowerShell console + +Apply the current application theme to the PowerShell console global profile(s). + +**Type:** `Boolean` + +**Default:** `Disabled` + +If enabled, the PowerShell console global profile(s) are modified in the registry under `Computer\HKEY_CURRENT_USER\Console` (`HKCU:\Console`). This adjusts the background of the console and some other settings so that the console window integrates better with the NETworkManager application. + +The profiles are changed for the PowerShell consoles configured in the PowerShell tools. Both Windows PowerShell and PowerShell 7 and later are supported. + +Example paths under `HKCU:\Console`: + +| PowerShell path | Registry profile path | +| ----------------------------------------------------------- | ------------------------------------------------------------- | +| `C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe` | `%SystemRoot%_System32_WindowsPowerShell_v1.0_powershell.exe` | +| `C:\Program Files\PowerShell\7\pwsh.exe` | `C:_Program Files_PowerShell_7_pwsh.exe` | + +The following registry keys are created, modified or deleted in the registry profile path: + +| Name | Type | Action | Value | Value basis | +| ----------- | ------------ | ------------------- | ----------------------------------- | ----------- | +| `REG_DWORD` | `Add/Modify` | `CursorType` | `1` | `Hex` | +| `REG_DWORD` | `Add/Modify` | `FontFamiliy` | `36` | `Hex` | +| `REG_DWORD` | `Add/Modify` | `FontSize` | `120000` | `Hex` | +| `REG_DWORD` | `Add/Modify` | `FontWeight` | `400` | `Hex` | +| `REG_DWORD` | `Add/Modify` | `DefaultBackground` | `252525` (Dark) or `FFFFFF` (Light) | `Hex` | +| `REG_DWORD` | `Add/Modify` | `ColorTable00` | `252525` (Dark) or `FFFFFF` (Light) | `Hex` | +| `REG_DWORD` | `Add/Modify` | `ColorTable07` | `252525` (Dark) or `252525` (Light) | `Hex` | +| `REG_SZ` | `Add/Modify` | `FaceName` | `Consolas` | `String` | +| `REG_DWORD` | `Delete` | `ScreenColors` | | | + +If disabled, the Powershell console global profile(s) are no longer modified. But the original values are not restored. + +:::note + +Colors may not be set correctly when [`Use custom themes`](#use-custom-themes) is enabled. + +::: diff --git a/Website/docs/settings/autostart.md b/Website/docs/settings/autostart.md new file mode 100644 index 0000000000..c915042d38 --- /dev/null +++ b/Website/docs/settings/autostart.md @@ -0,0 +1,29 @@ +--- +sidebar_position: 7 +description: "Configure NETworkManager to start automatically with Windows and optionally launch minimized to the system tray." +keywords: [NETworkManager, autostart, start with Windows, auto launch, startup, minimized start] +--- + +# Autostart + +### Start with Windows (current user) + +Start the application automatically when the user logs in. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Start minimized in tray + +Start the application minimized in the tray when the user logs in. + +**Type:** `Boolean` + +**Default:** `Disabled` + +:::note + +Requires [Start with Windows (current user)](#start-with-windows-current-user) to be enabled. + +::: diff --git a/Website/docs/settings/general.md b/Website/docs/settings/general.md new file mode 100644 index 0000000000..15fcb8c1c6 --- /dev/null +++ b/Website/docs/settings/general.md @@ -0,0 +1,63 @@ +--- +sidebar_position: 0 +description: "Configure which applications appear in the NETworkManager sidebar and adjust general application behavior including thread pool settings." +keywords: [NETworkManager, general settings, sidebar configuration, application settings, thread pool] +--- + +# General + +### Applications + +Applications that are displayed in the main window in the sidebar. + +Type: `NETworkManager.Models.ApplicationInfo` + +Default: `All` + +:::note + +Applications can be sorted via drag & drop. + +Right-click on an application opens a context menu with the following options: + +- `Set default` (Set the default application that is launched on startup - available if not set) +- `Show` (Shows the application in the main window - available if hidden) +- `Hide` (Hides the application from the main window - available if shown) + +::: + +### Run background job every x-minutes + +Run a background job every x-minutes to save profiles and settings. + +Type: `Integer` + +Default: `5` [Min `0`, Max `120`] + +:::note + +The value 0 will disable the background job. Changes to this value will take effect after restarting the application. + +::: + +### Number of stored entries + +Maximum number of entries stored in the history for several application inputs. + +Type: `Integer` + +Default: `5` [Min `0`, Max `25`] + +### ThreadPool additional min. threads + +Additional [minimum number of threads](https://learn.microsoft.com/en-us/dotnet/api/system.threading.threadpool.setminthreads?view=net-7.0) of the applications [ThreadPool](https://learn.microsoft.com/en-us/dotnet/standard/threading/the-managed-thread-pool) that are created on demand, as new requests are made, before switching to an algorithm for managing thread creation and destruction. This can improve e.g. the IP scanner or port scanner. The value is added to the default settings. + +Type: `Integer` + +Default: `512` [Min `0`, Max `1024`] + +:::note + +The value 0 leaves the default settings (number of CPU threads). If the value is to high, performance problems may occur. If the value is higher than the max. threads of the ThreadPool, the max. threads will be used. Changes to this value will take effect after restarting the application. Wheter the value was set successfully can be seen in the log file under `%LocalAppData%\NETworkManager\NETworkManager.log`. + +::: diff --git a/Website/docs/settings/hotkeys.md b/Website/docs/settings/hotkeys.md new file mode 100644 index 0000000000..8a305d082d --- /dev/null +++ b/Website/docs/settings/hotkeys.md @@ -0,0 +1,17 @@ +--- +sidebar_position: 6 +description: "Configure keyboard shortcuts in NETworkManager to quickly bring the application to the foreground from the system tray." +keywords: [NETworkManager, hotkeys, keyboard shortcuts, key bindings, system tray shortcut] +--- + +# HotKeys + +### Untray / Bring to foreground + +Untray the application and bring it to the foreground. + +**Type:** `Boolean` + +**Default:** `Disabled` + +**Default Hotkey:** `ALT + STRG + O` diff --git a/Website/docs/settings/language.md b/Website/docs/settings/language.md new file mode 100644 index 0000000000..42d9c39bd4 --- /dev/null +++ b/Website/docs/settings/language.md @@ -0,0 +1,47 @@ +--- +sidebar_position: 3 +description: "Change the NETworkManager user interface language. Available in 16+ languages with community translations via Transifex." +keywords: [NETworkManager, language settings, localization, translations, multilingual, Transifex] +--- + +# Language + +### Language + +Language for the user interface of the application. + +**Type:** `NETworkManager.Localization.LocalizationInfo` + +**Default:** `English` (`en-US`) + +**Possible values:** + +- `English` (`en-US`) +- `German (Germany)` (`de-DE`) +- `Chinese (China)` (`zh-CN`) +- `Chinese (Taiwan)` (`zh-TW`) +- `Czech (Czech Republic)` (`cs-CZ`) +- `Dutch (Netherlands)` (`nl-NL`) +- `French (France)` (`fr-FR`) +- `Hungarian (Hungary)` (`hu-HU`) +- `Italian (Italy)` (`it-IT`) +- `Japanese (Japan)` (`ja-JP`) +- `Korean (South Korea)` (`ko-KR`) +- `Polish (Poland)` (`pl-PL`) +- `Portuguese (Brazil)` (`pt-BR`) +- `Russian (Russia)` (`ru-RU`) +- `Slovenian (Slovenia)` (`sl-SI`) +- `Spanish (Spain)` (`es-ES`) +- `Ukrainian (Ukraine)` (`uk-UA`) + +:::note + +The language is automatically detected based on the system language. If the language is not available, the default language is used. Changes to this value will take effect after restarting the application. + +::: + +:::info + +English and German are provided as official languages. Other languages are provided by the community. If you want to help translate the application, you can join the project on [Transifex](https://transifex.com/BornToBeRoot/NETworkManager). Please report any issues with the translations on [GitHub](https://github.com/BornToBeRoot/NETworkManager/issues/new/choose). See also the [contribution guidelines](https://github.com/BornToBeRoot/NETworkManager/blob/main/CONTRIBUTING.md). + +::: diff --git a/Website/docs/settings/network.md b/Website/docs/settings/network.md new file mode 100644 index 0000000000..9505c6cd45 --- /dev/null +++ b/Website/docs/settings/network.md @@ -0,0 +1,38 @@ +--- +sidebar_position: 4 +description: "Configure custom DNS servers used by NETworkManager for name resolution across all network tools." +keywords: [NETworkManager, network settings, DNS server configuration, custom DNS, name resolution] +--- + +# Network + +### Use custom DNS server + +Enables or disables the custom DNS server(s) for all DNS queries. If disabled, the DNS servers configured in Windows are used. If enabled, the servers configured under [DNS server(s)](#dns-servers) will be used. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### DNS server(s) + +A semicolon-separated list of IP addresses of DNS servers to be used for DNS queries when [Use custom DNS server](#use-custom-dns-server) is enabled. + +**Type:** `String` + +**Default:** `Empty` + +**Example:** `1.1.1.1; 1.0.0.1` + +### Preffered protocol when resolving hostnames: + +Set the preferred protocol when resolving hostnames. + +**Type:** `Boolean` + +**Default:** `IPv4` + +**Possible values:** + +- `IPv4` +- `IPv6` diff --git a/Website/docs/settings/profiles.md b/Website/docs/settings/profiles.md new file mode 100644 index 0000000000..1d7c26b07c --- /dev/null +++ b/Website/docs/settings/profiles.md @@ -0,0 +1,108 @@ +--- +sidebar_position: 9 +description: "Configure where NETworkManager stores profile files. Manage profile file locations for setup, portable, and custom deployment scenarios." +keywords: [NETworkManager, profile settings, profile file location, profile storage, profile management] +--- + +# Profiles + +### Location + +Folder where the application profiles are stored. + +**Type**: `String` + +**Default**: + +| Version | Path | +| -------------- | ------------------------------------------------- | +| Setup / Archiv | `%UserProfile%\Documents\NETworkManager\Profiles` | +| Portable | `\Profiles` | + +
+System-Wide Policy + +This setting can be controlled by administrators using a system-wide policy. See [System-Wide Policies](../system-wide-policies.md) for more information. + +**Policy Property:** `Profiles_FolderLocation` + +**Values:** + +- Absolute path (e.g., `C:\\Path\\To\\Profiles`) +- Path with environment variables (e.g., `%UserProfile%\\NETworkManager\\Profiles`) +- UNC path (e.g., `\\\\server\\share$\\NETworkManager\\Profiles`) +- Omit the property to allow the default location logic to apply (portable vs. non-portable) + +**Example:** + +```json +{ + "Profiles_FolderLocation": "%UserProfile%\\NETworkManager\\Profiles" +} +``` + +
+ +:::note + +**Recommendation** +It is strongly recommended to regularly back up your profile files. + +**Automatic backups** +NETworkManager automatically creates a backup of the profile file before applying any changes. See [Create daily backup](#create-daily-backup) and [Maximum number of backups](#maximum-number-of-backups) for configuration options. +- Location: `Profiles\Backups` subfolder (relative to the main configuration directory) +- Naming: timestamped (e.g. `yyyyMMddHHmmss_.json`) +- Frequency: **once per day** at most (even if multiple changes occur) +- Retention: keeps the **10 most recent backups** (default) + +**Restoring profiles** +1. Completely close NETworkManager +2. Locate the desired backup in `Profiles\Backups` +3. Copy the file(s) back to the original folder (overwrite existing files or copy them under a different name) +4. Restart the application + +::: + +### Profile files + +List of profile files. + +**Type**: `List` + +**Default**: `[Default]` + +:::note + +Right-click on a profile file to `edit`, `encrypt/decrypt` or `delete` it. + +You can also use the Hotkeys `F2` (`edit`) or `Del` (`delete`) on a selected profile file. + +Profile files can be encrypted with a master password. See [FAQ > How to enable profile file encryption?](https://borntoberoot.net/NETworkManager/docs/faq/profile-file-encryption#how-to-enable-profile-file-encryption) for more details. + +At least one profile is required and must exist. + +::: + +### Create daily backup + +Create a daily backup of the profile file before applying any changes. + +**Type**: `Boolean` + +**Default:** `Enabled` + +:::note + +Backups are stored in the `Profiles\Backups` subfolder. See [Location](#location) for more details. + +Backups are created at most once per day, even if multiple changes occur. + +::: + +### Maximum number of backups + +Maximum number of backups to keep. Older backups will be deleted automatically once a new backup is created. + +**Type:** `Integer` [Min `1`, Max `365`] + +**Default:** `10` diff --git a/Website/docs/settings/settings.md b/Website/docs/settings/settings.md new file mode 100644 index 0000000000..cc8763dead --- /dev/null +++ b/Website/docs/settings/settings.md @@ -0,0 +1,102 @@ +--- +sidebar_position: 10 +description: "Configure where NETworkManager stores its settings files. Manage settings file location and portable vs. installed deployment paths." +keywords: [NETworkManager, settings location, settings file, configuration storage, settings management] +--- + +# Settings + +### Location + +Folder where the application settings are stored. + +**Type**: `String` + +**Default**: + +| Version | Path | +| -------------- | ------------------------------------------------- | +| Setup / Archiv | `%UserProfile%\Documents\NETworkManager\Settings` | +| Portable | `\Settings` | + +
+System-Wide Policy + +This setting can be controlled by administrators using a system-wide policy. See [System-Wide Policies](../system-wide-policies.md) for more information. + +**Policy Property:** `Settings_FolderLocation` + +**Values:** + +- Absolute path (e.g., `C:\\Path\\To\\Settings`) +- Path with environment variables (e.g., `%UserProfile%\\NETworkManager\\Settings`) +- UNC path (e.g., `\\\\server\\share$\\NETworkManager\\Settings`) +- Omit the property to allow the default location logic to apply (portable vs. non-portable) + +**Example:** + +```json +{ + "Settings_FolderLocation": "%UserProfile%\\NETworkManager\\Settings" +} +``` + +
+ +:::note + +**Recommendation** +It is strongly recommended to regularly back up your settings files. + +**Automatic backups** +NETworkManager automatically creates a backup of the settings files before applying any changes. See [Create daily backup](#create-daily-backup) and [Maximum number of backups](#maximum-number-of-backups) for configuration options. + +- Location: `Settings\Backups` subfolder +- Naming: timestamped (e.g. `yyyyMMddHHmmss_Settings.json`) +- Frequency: **once per day** at most (even if multiple changes occur) +- Retention: keeps the **10 most recent backups** (default) + +**Restoring settings** + +1. Completely close NETworkManager +2. Locate the desired backup in `Settings\Backups` +3. Copy the file(s) back to the original folder (overwriting existing files) +4. Restart the application + +::: + +### Create daily backup + +Create a daily backup of the application settings before applying any changes. + +**Type**: `Boolean` + +**Default:** `Enabled` + +:::note + +Backups are stored in the `Settings\Backups` subfolder. See [Location](#location) for more details. + +Backups are created at most once per day, even if multiple changes occur. + +::: + +### Maximum number of backups + +Maximum number of backups to keep. Older backups will be deleted automatically once a new backup is created. + +**Type:** `Integer` [Min `1`, Max `365`] + +**Default:** `10` + +### Reset + +Button to reset all application settings to their default values. + +:::note + +The application will be restarted afterwards. + +Profiles are not reset. + +::: diff --git a/Website/docs/settings/status.md b/Website/docs/settings/status.md new file mode 100644 index 0000000000..019dbae397 --- /dev/null +++ b/Website/docs/settings/status.md @@ -0,0 +1,29 @@ +--- +sidebar_position: 5 +description: "Configure the NETworkManager status window that appears on network adapter changes and connectivity events." +keywords: [NETworkManager, status settings, status window, network change notification, connectivity status] +--- + +# Status + +### Show status window on network change + +Show the status window when the network changes (e.g. Ethernet cable is plugged in, WLAN or VPN is connected, etc.). + +**Type:** `Boolean` + +**Default:** `Enabled` + +### Time in seconds how long the status window is shown + +Time in seconds how long the status window is shown after the network has changed. The status window will be closed automatically after the specified time. + +**Type:** `Integer` + +**Default:** `10` + +:::note + +This will only work if [Show status window on network change](#show-status-window-on-network-change) is enabled and the status window is opened due to a network change event. + +::: diff --git a/Website/docs/settings/update.md b/Website/docs/settings/update.md new file mode 100644 index 0000000000..0716aa1441 --- /dev/null +++ b/Website/docs/settings/update.md @@ -0,0 +1,66 @@ +--- +sidebar_position: 8 +description: "Configure automatic update checks in NETworkManager. Enable or disable checking for new versions at application startup." +keywords: [NETworkManager, update settings, automatic updates, version check, software update] +--- + +# Update + +### Check for updates at startup + +Check for new program versions on GitHub when the application is launched. + +**Type:** `Boolean` + +**Default:** `Enabled` + +
+System-Wide Policy + +This setting can be controlled by administrators using a system-wide policy. See [System-Wide Policies](../system-wide-policies.md) for more information. + +**Policy Property:** `Update_CheckForUpdatesAtStartup` + +**Values:** + +- `true` - Force enable automatic update checks at startup for all users +- `false` - Force disable automatic update checks at startup for all users +- Omit the property - Allow users to control this setting themselves + +**Example:** + +```json +{ + "Update_CheckForUpdatesAtStartup": false +} +``` + +
+ +:::note + +The URL `https://api.github.com/` must be reachable to check for updates. + +::: + +### Check for pre-releases + +Check for pre-releases when checking for updates. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Experimental features + +Enable experimental features that are not yet complete. + +**Type:** `Boolean` + +**Default:** `Disabled` + +:::warning + +These features may contain bugs, crash the application, or change until release. + +::: diff --git a/Website/docs/settings/window.md b/Website/docs/settings/window.md new file mode 100644 index 0000000000..81a47ec86f --- /dev/null +++ b/Website/docs/settings/window.md @@ -0,0 +1,61 @@ +--- +sidebar_position: 1 +description: "Configure NETworkManager window behavior including minimize to system tray, close-to-tray, and startup visibility options." +keywords: [NETworkManager, window settings, system tray, minimize to tray, close behavior] +--- + +# Window + +### Minimize main window instead of terminating the application + +Minimize the main window instead of terminating the application when the close button is clicked. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Minimize to tray instead of taskbar + +Minimize the main window to the tray instead of the taskbar when the minimize (or close) button is clicked. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Confirm close + +Show a confirmation dialog when the close button is clicked. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Multiple instances + +Allow multiple instances of the application to be opened. + +**Type:** `Boolean` + +**Default:** `Disabled` + +:::warning + +Enabling this setting is not recommended. Multiple instances of the application share the same settings and profile files. The last instance to be closed may overwrite changes made by other instances. + +::: + +### Always show tray icon + +Always show the tray icon, even if the main window is visible. + +**Type:** `Boolean` + +**Default:** `Disabled` + +### Show splash screen + +Show the splash screen when the application is started. + +**Type:** `Boolean` + +**Default:** `Enabled` diff --git a/Website/docs/system-wide-policies.md b/Website/docs/system-wide-policies.md new file mode 100644 index 0000000000..929f50c0fa --- /dev/null +++ b/Website/docs/system-wide-policies.md @@ -0,0 +1,102 @@ +--- +sidebar_position: 6 +description: "Configure system-wide policies to enforce NETworkManager settings for all users in enterprise environments." +keywords: [NETworkManager, system-wide policies, enterprise deployment, Group Policy, Intune, SCCM, centralized configuration, IT administration] +--- + +# System-Wide Policies + +The **System-Wide Policies** feature lets administrators enforce specific application settings for all users on a machine. Policy values override any user-specific settings, providing centralized control over application behavior in enterprise environments. + +## Overview + +Policies are defined in a `config.json` file placed in the application installation directory (the same folder as `NETworkManager.exe`). When this file exists, the application loads the policies at startup and applies them with precedence over user settings. + +Users will see a visual indicator in the Settings UI when a setting is controlled by a system-wide policy, showing them the administrator-enforced value and preventing them from changing it. + +![System-wide policy indicator](./img/system-wide-policy-indicator.png) + +## Configuration File + +The `config.json` file uses a simple JSON structure to define policy values. An example file (`config.json.example`) is included in the application installation directory for reference. + +**File Location:** +- **Installed version**: `C:\Program Files\NETworkManager\config.json` (or your custom installation path) +- **Portable version**: Same directory as `NETworkManager.exe` + +**File Format:** + +```json +{ + "Policy_Name1": true, + "Policy_Name2": "ExampleValue" +} +``` + +**Example:** + +```json +{ + "Profiles_FolderLocation": "\\\\Server\\Shared\\NETworkManager\\Profiles", + "Settings_FolderLocation": "%UserProfile%\\NETworkManager\\Settings", + "Update_CheckForUpdatesAtStartup": false, +} +``` + +Property names follow the pattern `Section_SettingName` (see each setting's documentation). Ensure values use the correct JSON type (boolean, string, number, etc.). + +:::note + +- The file must be named exactly `config.json` +- The file must contain valid JSON syntax +- Changes to the file require restarting the application to take effect +- If the file does not exist or contains invalid JSON, it is ignored and user settings apply + +::: + +## Deployment + +For enterprise deployments: + +1. **Create the configuration file**: + - Use the `config.json.example` as a template + - Rename it to `config.json` + - Set your desired policy values (the property name for each setting is documented on each setting's page) + +2. **Deploy to installation directory**: + - Place the `config.json` file in the same directory as `NETworkManager.exe` + - For MSI installations, this is typically `C:\Program Files\NETworkManager\` + - For portable installations, place it next to the executable + +3. **Deploy methods**: + - Group Policy — copy the `config.json` file to the installation directory (use Group Policy preferences or a startup script) + - Configuration management tools — SCCM/ConfigMgr, Microsoft Intune, Ansible, etc. + - Scripts and deployment toolkits — PowerShell scripts, PSAppDeployToolkit (recommended for scripted MSI/App deployments) + - Manual deployment — hand-copy for small-scale rollouts + +4. **Verification**: + - Launch the application + - Navigate to the setting you modified (e.g., `Settings` > `Update` > **Check for updates at startup**) + - Verify the shield icon and the administrator message appear and that the control is disabled + - Confirm the displayed value matches the policy + +:::warning + +Ensure the `config.json` file has appropriate permissions so that regular users cannot modify it. On standard installations in `Program Files`, this is automatically enforced by Windows file permissions. + +::: + +## Troubleshooting + +**Policy not being applied:** +- Verify the file is named exactly `config.json` (not `config.json.txt`) +- Check that the JSON syntax is valid (use a JSON validator) +- Confirm the file is in the correct directory (same as `NETworkManager.exe`) +- Ensure the property name matches exactly (see the corresponding setting's documentation for the property name) +- Verify the value has the correct data type (e.g. boolean `true` not string `"true"`) +- Restart the application after creating or modifying the file +- Check the application logs for any error messages related to policy loading + +## Future Policies + +Additional policy options will be added in future releases to provide more granular control over application behavior. If you have specific requirements for system-wide policies in your organization, please submit a feature request via the [GitHub issue tracker](https://github.com/BornToBeRoot/NETworkManager/issues/new/choose) to help us prioritize new policy options based on user demand. diff --git a/Website/docusaurus.config.js b/Website/docusaurus.config.js new file mode 100644 index 0000000000..150aab2487 --- /dev/null +++ b/Website/docusaurus.config.js @@ -0,0 +1,256 @@ +// @ts-check +// `@type` JSDoc annotations allow editor autocompletion and type checking +// (when paired with `@ts-check`). +// There are various equivalent ways to declare your Docusaurus config. +// See: https://docusaurus.io/docs/api/docusaurus-config + +import { themes as prismThemes } from "prism-react-renderer"; + +/** @type {import('@docusaurus/types').Config} */ +const config = { + title: "NETworkManager", + tagline: + "A powerful open-source tool for managing networks and troubleshooting network problems!", + favicon: "img/favicon.ico", + + url: "https://borntoberoot.net", + baseUrl: "/NETworkManager", + + // GitHub pages deployment config. + organizationName: "BornToBeRoot", + projectName: "NETworkManager", + + trailingSlash: false, + + onBrokenLinks: "throw", + onBrokenAnchors: "throw", + + markdown: { + hooks: { + onBrokenMarkdownLinks: "throw", + }, + }, + + i18n: { + defaultLocale: "en", + locales: ["en"], + }, + + headTags: [ + { + tagName: "script", + attributes: { + type: "application/ld+json", + }, + innerHTML: JSON.stringify({ + "@context": "https://schema.org", + "@type": "SoftwareApplication", + name: "NETworkManager", + applicationCategory: "NetworkApplication", + operatingSystem: "Windows 10, Windows 11, Windows Server", + offers: { + "@type": "Offer", + price: "0", + priceCurrency: "USD", + }, + description: + "A powerful open-source tool for managing networks and troubleshooting network problems. Features IP Scanner, Port Scanner, Ping Monitor, Traceroute, DNS Lookup, Remote Desktop, PowerShell, PuTTY (SSH), and more.", + url: "https://borntoberoot.net/NETworkManager", + downloadUrl: "https://borntoberoot.net/NETworkManager/download", + author: { + "@type": "Person", + name: "BornToBeRoot", + url: "https://github.com/BornToBeRoot", + }, + license: + "https://github.com/BornToBeRoot/NETworkManager/blob/main/LICENSE", + }), + }, + ], + + presets: [ + [ + "classic", + /** @type {import('@docusaurus/preset-classic').Options} */ + ({ + docs: { + sidebarPath: "./sidebars.js", + editUrl: + "https://github.com/bornToBeRoot/NETworkManager/tree/main/Website/", + }, + blog: { + showReadingTime: true, + blogSidebarCount: "ALL", + editUrl: + "https://github.com/bornToBeRoot/NETworkManager/tree/main/Website/", + }, + theme: { + customCss: "./src/css/custom.css", + }, + }), + ], + ], + + themeConfig: + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + ({ + image: "img/social-card.png", + metadata: [ + { + name: "keywords", + content: + "NETworkManager, network manager, network tools, IP scanner, port scanner, ping monitor, traceroute, DNS lookup, remote desktop, SSH, PuTTY, PowerShell, VNC, WiFi analyzer, subnet calculator, SNMP, network troubleshooting, Windows network tool, open source", + }, + { name: "author", content: "BornToBeRoot" }, + ], + navbar: { + title: "NETworkManager", + logo: { + alt: "NETworkManager Logo", + src: "img/logo.svg", + }, + items: [ + { + to: "/download", + label: "Download", + position: "left", + }, + { + type: "docSidebar", + sidebarId: "docsSidebar", + position: "left", + label: "Docs", + }, + { + to: "/blog", + label: "Blog", + position: "left", + }, + { + href: "https://github.com/BornToBeRoot/NETworkManager?tab=readme-ov-file#-donate", + label: "Donate", + position: "right", + }, + { + href: "https://github.com/BornToBeRoot/NETworkManager", + label: "GitHub", + position: "right", + }, + ], + }, + footer: { + style: "dark", + links: [ + { + title: "Quick Links", + items: [ + { + label: "Download", + to: "/download", + }, + { + label: "Docs", + to: "/docs/introduction", + }, + { + label: "Blog", + to: "/blog", + }, + ], + }, + { + title: "Community", + items: [ + { + label: "X", + href: "https://x.com/_BornToBeRoot", + }, + ], + }, + { + title: "Contributing", + items: [ + { + label: "GitHub", + href: "https://github.com/BornToBeRoot/NETworkManager", + }, + { + label: "Transifex", + href: "https://app.transifex.com/BornToBeRoot/NETworkManager/", + }, + { + label: "Code of Conduct", + href: "https://github.com/BornToBeRoot/NETworkManager/blob/main/CODE_OF_CONDUCT.md", + }, + ], + }, + ], + copyright: `Copyright © ${new Date().getFullYear()} BornToBeRoot and Contributors. Built with Docusaurus.`, + }, + prism: { + theme: prismThemes.github, + darkTheme: prismThemes.dracula, + additionalLanguages: ["csharp", "json", "powershell"], + }, + }), + + plugins: [ + [ + // Custom redirects + "@docusaurus/plugin-client-redirects", + { + redirects: [ + { + // Redirect latest changelog to the newest version + from: ["/docs/changelog/latest"], + to: "/docs/changelog/2026-7-7-0", + }, + // Redirect pre-versions to the corresponding new versions + { + from: [ + "/docs/changelog/2026-7-16-0", + "/docs/changelog/2026-7-24-0", + ], + to: "/docs/changelog/next-release", + }, + { + from: [ + "/docs/changelog/2026-3-4-0", + "/docs/changelog/2026-4-30-0", + "/docs/changelog/2026-5-3-0", + "/docs/changelog/2026-5-18-0", + "/docs/changelog/2026-6-1-0", + "/docs/changelog/2026-6-15-0", + ], + to: "/docs/changelog/2026-7-7-0", + }, + { + from: [ + "/docs/changelog/2025-11-1-0", + "/docs/changelog/2025-11-30-0", + "/docs/changelog/2025-12-13-0", + "/docs/changelog/2025-12-20-0", + "/docs/changelog/2025-12-28-0", + "/docs/changelog/2026-2-19-0", + ], + to: "/docs/changelog/2026-2-22-0", + }, + { + from: [ + "/docs/changelog/2025-6-13-0", + "/docs/changelog/2025-7-9-0" + ], + to: "/docs/changelog/2025-8-10-0", + }, + // Redirect legacy ARP Table to Neighbor Table + { + from: ["/docs/application/arp-table"], + to: "/docs/application/neighbor-table", + }, + ], + }, + ], + ], +}; + +export default config; diff --git a/Website/package.json b/Website/package.json new file mode 100644 index 0000000000..881103eb8d --- /dev/null +++ b/Website/package.json @@ -0,0 +1,49 @@ +{ + "name": "networkmanager", + "version": "0.0.0", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "fetch-release-data": "node scripts/fetch-release-data.mjs", + "prestart": "node scripts/fetch-release-data.mjs", + "prebuild": "node scripts/fetch-release-data.mjs", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids" + }, + "dependencies": { + "@docusaurus/core": "3.10.2", + "@docusaurus/plugin-client-redirects": "^3.10.2", + "@docusaurus/preset-classic": "3.10.2", + "@mdx-js/react": "^3.1.1", + "clsx": "^2.0.0", + "prism-react-renderer": "^2.4.1", + "react": "^19.2.8", + "react-dom": "^19.2.8", + "react-image-gallery": "^2.1.2" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "3.10.2", + "@docusaurus/types": "3.10.2" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 3 chrome version", + "last 3 firefox version", + "last 5 safari version" + ] + }, + "engines": { + "node": ">=20.0" + } +} diff --git a/Website/plugins/.gitkeep b/Website/plugins/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Website/scripts/fetch-release-data.mjs b/Website/scripts/fetch-release-data.mjs new file mode 100644 index 0000000000..9e95aa9afb --- /dev/null +++ b/Website/scripts/fetch-release-data.mjs @@ -0,0 +1,233 @@ +// Pre-fetches release data at build time and writes it to src/data/*.json: +// - release.json : current stable release (version, date, downloads, checksums) +// - prerelease.json : latest pre-release (version, date, downloads, checksums) +// +// Both files use the exact same shape and are built the same way — there is +// nothing to bump by hand. Every real build overwrites them with fresh data; +// the committed JSON files are just the last known-good values checked into +// git so the repo is never without one. If the fetch fails, the build fails +// (see main() below) rather than silently deploying stale data. +// +// Why build-time instead of client-side: +// - The GitHub API (api.github.com) supports CORS but is rate limited +// (60 requests/hour per IP for unauthenticated users) — doing it per visitor +// risks hitting that limit. +// - The release asset host (release-assets.githubusercontent.com) is NOT rate +// limited but sends no Access-Control-Allow-Origin header, so a browser +// fetch() of the SHA256SUMS file is blocked by CORS. +// - Node has no CORS restriction and runs once per build, so fetching here is +// reliable, includes the checksums, and adds zero per-visitor requests. +// +// Freshness: the website is rebuilt on every published (pre-)release (see the +// `release` trigger in .github/workflows/deploy_website.yml), so the prefetched +// data stays current without any client-side requests. +import { writeFile } from "node:fs/promises"; +import { existsSync } from "node:fs"; +import { fileURLToPath } from "node:url"; +import { dirname, resolve } from "node:path"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const dataDir = resolve(__dirname, "..", "src", "data"); +const changelogDir = resolve(__dirname, "..", "docs", "changelog"); +const releasePath = resolve(dataDir, "release.json"); +const prereleasePath = resolve(dataDir, "prerelease.json"); + +const REPO = "BornToBeRoot/NETworkManager"; + +// Changelog category index — used when a release has no dedicated changelog page +// yet, so the link never points at a non-existent doc (onBrokenLinks: "throw"). +const CHANGELOG_FALLBACK = "/docs/category/changelog"; + +// Architectures shown on the download page, in display order. +const ARCHITECTURES = ["x64", "arm64"]; + +// Maps the data keys to the asset filename parts (variant suffix + extension). +// The full asset name is `NETworkManager__win-`. +const VARIANTS = { + setup: { suffix: "_Setup", ext: ".msi" }, + portable: { suffix: "_Portable", ext: ".zip" }, + archive: { suffix: "_Archive", ext: ".zip" }, +}; + +function assetFileName(version, variant, arch) { + const { suffix, ext } = VARIANTS[variant]; + return `NETworkManager_${version}${suffix}_win-${arch}${ext}`; +} + +// DEPRECATED: only exists to read releases published before the arch split +// (native ARM64 build, #3538), which shipped a single, x64-only asset with no +// "_win-" part in the name. Every release going forward uses +// assetFileName() instead. Safe to delete once no release predating #3538 is +// still linked to from the website (i.e. once release.json itself has moved +// past 2026.7.7.0). +function legacyAssetFileName(version, variant) { + const { suffix, ext } = VARIANTS[variant]; + return `NETworkManager_${version}${suffix}${ext}`; +} + +function ghHeaders() { + const headers = { + "User-Agent": "NETworkManager-website-build", + Accept: "application/vnd.github+json", + }; + // Authenticate when a token is available (CI) to raise the rate limit. + const token = process.env.GITHUB_TOKEN; + if (token) headers.Authorization = `Bearer ${token}`; + return headers; +} + +function formatDate(iso) { + const d = new Date(iso); + const dd = String(d.getDate()).padStart(2, "0"); + const mm = String(d.getMonth() + 1).padStart(2, "0"); + return `${dd}.${mm}.${d.getFullYear()}`; +} + +async function writeJson(path, data) { + await writeFile(path, JSON.stringify(data, null, 2) + "\n"); +} + +// Downloads and parses the " " SHA256SUMS asset into a +// { x64: { setup, portable, archive }, arm64: {...} } map. An architecture is +// only present if the SUMS file lists at least one asset for it — older +// releases predate ARM64 and simply won't have that key. +async function fetchChecksumMap(version) { + const url = `https://github.com/${REPO}/releases/download/${version}/NETworkManager_${version}_SHA256SUMS`; + const res = await fetch(url); + if (!res.ok) throw new Error(`HTTP ${res.status} for ${url}`); + const text = await res.text(); + + const map = {}; + for (const line of text.split(/\r?\n/)) { + const m = line.trim().match(/^([0-9a-fA-F]{64})\s+(.+)$/); + if (!m) continue; + let matched = false; + for (const arch of ARCHITECTURES) { + for (const variant of Object.keys(VARIANTS)) { + if (m[2] === assetFileName(version, variant, arch)) { + map[arch] ??= {}; + map[arch][variant] = m[1].toUpperCase(); + matched = true; + } + } + } + // DEPRECATED fallback — see legacyAssetFileName(). + if (!matched) { + for (const variant of Object.keys(VARIANTS)) { + if (m[2] === legacyAssetFileName(version, variant)) { + map.x64 ??= {}; + map.x64[variant] = m[1].toUpperCase(); + } + } + } + } + return map; +} + +// Builds { x64: { setup, portable, archive }, arm64: {...} } from the GitHub +// release assets, only including architectures that shipped at least one +// asset (older releases predate ARM64 support and won't have one). +function buildDownloads(release, version) { + const downloads = {}; + for (const variant of Object.keys(VARIANTS)) { + let matched = false; + for (const arch of ARCHITECTURES) { + const name = assetFileName(version, variant, arch); + const asset = release.assets.find((a) => a.name === name); + if (asset) { + downloads[arch] ??= {}; + downloads[arch][variant] = asset.browser_download_url; + matched = true; + } + } + // DEPRECATED fallback — see legacyAssetFileName(). + if (!matched) { + const legacyName = legacyAssetFileName(version, variant); + const asset = release.assets.find((a) => a.name === legacyName); + if (asset) { + downloads.x64 ??= {}; + downloads.x64[variant] = asset.browser_download_url; + } + } + } + return downloads; +} + +// Resolves the changelog link for a stable version: its dedicated page if the +// doc exists ("2026.2.22.0" -> /docs/changelog/2026-2-22-0), else the fallback. +function stableChangelogUrl(version) { + const slug = version.replace(/\./g, "-"); + return existsSync(resolve(changelogDir, `${slug}.md`)) + ? `/docs/changelog/${slug}` + : CHANGELOG_FALLBACK; +} + +// Builds the unified data object (download URLs + checksums + changelog link) +// from a GitHub release object. Used identically for both stable and pre-release. +async function buildData(release, changelog) { + const version = release.tag_name; + const downloads = buildDownloads(release, version); + + // Checksums are best-effort — older releases may not ship a SHA256SUMS file. + let checksums = null; + try { + checksums = await fetchChecksumMap(version); + } catch (err) { + const msg = err instanceof Error ? err.message : String(err); + console.warn(`[release-data] Checksums unavailable for ${version}: ${msg}`); + } + + return { + available: true, + version, + releaseDate: formatDate(release.published_at), + changelog, + downloads, + checksums, + }; +} + +async function updateStable(releases) { + // Newest published, non-draft, non-pre-release. + const stable = releases.find((r) => !r.draft && !r.prerelease); + if (!stable) throw new Error("No stable release found"); + await writeJson( + releasePath, + await buildData(stable, stableChangelogUrl(stable.tag_name)), + ); + console.log(`[release-data] Stable updated to ${stable.tag_name}`); +} + +async function updatePrerelease(releases) { + // The newest non-draft release; only show it if it is actually a pre-release + // (i.e. newer than the latest stable). Otherwise the section is hidden. + const latest = releases.find((r) => !r.draft); + if (!latest || !latest.prerelease) { + await writeJson(prereleasePath, { available: false }); + console.log("[release-data] No pre-release available"); + return; + } + // Pre-release changes are documented on the rolling "next release" page. + await writeJson( + prereleasePath, + await buildData(latest, "/docs/changelog/next-release"), + ); + console.log(`[release-data] Pre-release updated to ${latest.tag_name}`); +} + +async function main() { + const apiUrl = `https://api.github.com/repos/${REPO}/releases?per_page=30`; + const res = await fetch(apiUrl, { headers: ghHeaders() }); + if (!res.ok) throw new Error(`HTTP ${res.status} for ${apiUrl}`); + const releases = await res.json(); + + await updateStable(releases); + await updatePrerelease(releases); +} + +main().catch((err) => { + // Fatal: fail the build rather than silently deploying stale/wrong data. + const msg = err instanceof Error ? err.message : String(err); + console.error(`[release-data] Failed to update release data: ${msg}`); + process.exitCode = 1; +}); diff --git a/Website/sidebars.js b/Website/sidebars.js new file mode 100644 index 0000000000..21a7ce2496 --- /dev/null +++ b/Website/sidebars.js @@ -0,0 +1,8 @@ +// @ts-check + +/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ +const sidebars = { + docsSidebar: [{ type: "autogenerated", dirName: "." }], +}; + +export default sidebars; diff --git a/Website/src/components/ArchSwitcher/index.js b/Website/src/components/ArchSwitcher/index.js new file mode 100644 index 0000000000..01447ed5b4 --- /dev/null +++ b/Website/src/components/ArchSwitcher/index.js @@ -0,0 +1,31 @@ +import clsx from "clsx"; +import styles from "./styles.module.css"; + +// Segmented control to pick which CPU architecture's downloads are shown. +// Always rendered, even with a single option, so the user can see which +// architecture the download links point to. +export default function ArchSwitcher({ options, value, onChange, className }) { + return ( +
+ {options.map((option) => ( + + ))} +
+ ); +} diff --git a/Website/src/components/ArchSwitcher/styles.module.css b/Website/src/components/ArchSwitcher/styles.module.css new file mode 100644 index 0000000000..e15007fecc --- /dev/null +++ b/Website/src/components/ArchSwitcher/styles.module.css @@ -0,0 +1,33 @@ +.switcher { + display: inline-flex; + padding: 4px; + gap: 4px; + border-radius: 999px; + background: var(--ifm-color-emphasis-100); + border: 1px solid var(--ifm-color-emphasis-300); +} + +.option { + border: none; + background: transparent; + color: var(--ifm-color-emphasis-700); + font-weight: 600; + font-size: 14px; + padding: 6px 20px; + border-radius: 999px; + cursor: pointer; + transition: background 0.15s, color 0.15s; +} + +.option:hover { + color: var(--ifm-color-emphasis-900); +} + +/* Compound selector (not just .optionActive) so this reliably outranks + .option's background in specificity — production CSS minification can + reorder same-specificity rules and silently drop the active highlight. */ +.option.optionActive, +.option.optionActive:hover { + background: var(--ifm-color-primary); + color: #000; +} diff --git a/Website/src/components/CopyButton/index.js b/Website/src/components/CopyButton/index.js new file mode 100644 index 0000000000..81c73f365a --- /dev/null +++ b/Website/src/components/CopyButton/index.js @@ -0,0 +1,49 @@ +import { useEffect, useRef, useState } from "react"; +import clsx from "clsx"; +import styles from "./styles.module.css"; + +// Copies a value to the clipboard with brief visual feedback. Used for the +// SHA-256 checksums on the download cards — the hash itself is never rendered, +// which keeps the cards compact and mobile-safe. +export default function CopyButton({ + value, + idleLabel = "📋 Copy SHA-256", + copiedLabel = "✅ Copied", + className, +}) { + const [copied, setCopied] = useState(false); + const timeoutRef = useRef(null); + + useEffect(() => { + return () => { + if (timeoutRef.current) clearTimeout(timeoutRef.current); + }; + }, []); + + async function handleCopy() { + try { + await navigator.clipboard.writeText(value); + setCopied(true); + if (timeoutRef.current) clearTimeout(timeoutRef.current); + timeoutRef.current = setTimeout(() => setCopied(false), 1500); + } catch { + // Clipboard API unavailable (e.g. insecure context) — silently ignore. + } + } + + return ( + + ); +} diff --git a/Website/src/components/CopyButton/styles.module.css b/Website/src/components/CopyButton/styles.module.css new file mode 100644 index 0000000000..bf67f0d3d6 --- /dev/null +++ b/Website/src/components/CopyButton/styles.module.css @@ -0,0 +1,16 @@ +.copyButton { + margin-top: 12px; + padding: 4px 10px; + background: transparent; + border: none; + border-radius: 8px; + cursor: pointer; + font-size: 13px; + color: var(--ifm-color-emphasis-600); + transition: color 0.15s, background 0.15s; +} + +.copyButton:hover { + color: var(--ifm-color-primary); + background: var(--ifm-color-emphasis-200); +} diff --git a/Website/src/components/DownloadCard/index.js b/Website/src/components/DownloadCard/index.js new file mode 100644 index 0000000000..93fdec4220 --- /dev/null +++ b/Website/src/components/DownloadCard/index.js @@ -0,0 +1,42 @@ +import Link from "@docusaurus/Link"; +import clsx from "clsx"; +import CopyButton from "@site/src/components/CopyButton"; +import styles from "./styles.module.css"; + +// Responsive grid wrapper for a row of elements. +export function DownloadGrid({ children }) { + return
{children}
; +} + +// A single download option. `description` and `recommended` are optional, so the +// same card renders both the detailed stable variant and the compact +// pre-release variant. When a `checksum` is given, a copy button is shown. +export default function DownloadCard({ + icon, + label, + sub, + color = "primary", + description, + recommended = false, + downloadUrl, + checksum, +}) { + return ( +
+ {recommended && ★ Recommended} + +
{label}
+
{sub}
+ {description &&

{description}

} + + ⬇ Download + + {checksum && } +
+ ); +} diff --git a/Website/src/components/DownloadCard/styles.module.css b/Website/src/components/DownloadCard/styles.module.css new file mode 100644 index 0000000000..4ed88779d9 --- /dev/null +++ b/Website/src/components/DownloadCard/styles.module.css @@ -0,0 +1,74 @@ +.grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 20px; +} + +.card { + position: relative; + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + padding: 28px 22px 24px; + background: var(--ifm-color-emphasis-100); + border: 1px solid var(--ifm-color-emphasis-300); + border-radius: 16px; + transition: transform 0.15s, border-color 0.15s, box-shadow 0.15s; +} + +.card:hover { + transform: translateY(-4px); + border-color: var(--ifm-color-primary); + box-shadow: 0 12px 28px rgba(0, 0, 0, 0.12); +} + +.badge { + position: absolute; + top: 12px; + right: 12px; + background: var(--ifm-color-primary); + color: #000; + font-size: 11px; + font-weight: 700; + letter-spacing: 0.02em; + padding: 3px 10px; + border-radius: 12px; +} + +.icon { + font-size: 46px; + line-height: 1; + margin-bottom: 12px; +} + +.title { + font-size: 22px; + font-weight: 700; +} + +.sub { + font-size: 13px; + color: var(--ifm-color-emphasis-600); + margin-bottom: 14px; +} + +.description { + font-size: 14px; + color: var(--ifm-color-emphasis-700); + line-height: 1.5; + flex-grow: 1; + margin-bottom: 20px; +} + +.button { + width: 100%; + font-size: 17px; + font-weight: 600; +} + +@media only screen and (max-width: 768px) { + .grid { + grid-template-columns: 1fr; + } +} diff --git a/Website/src/components/DownloadSection/index.js b/Website/src/components/DownloadSection/index.js new file mode 100644 index 0000000000..86972f6ab1 --- /dev/null +++ b/Website/src/components/DownloadSection/index.js @@ -0,0 +1,89 @@ +import { useState } from "react"; +import release from "@site/src/data/release.json"; +import ReleaseHero from "@site/src/components/ReleaseHero"; +import ArchSwitcher from "@site/src/components/ArchSwitcher"; +import DownloadCard, { DownloadGrid } from "@site/src/components/DownloadCard"; +import styles from "./styles.module.css"; + +const VARIANTS = [ + { + key: "setup", + icon: "📦", + label: "Setup", + sub: "MSI Installer", + recommended: true, + description: + "Installs system-wide and requires administrator privileges. The best choice for most users and ideal for centralized deployment via Intune, SCCM, etc.", + color: "primary", + }, + { + key: "portable", + icon: "🎒", + label: "Portable", + sub: "ZIP Archive", + description: + "Run without installation — ideal for a USB stick or network share. Settings and profiles are stored next to the executable.", + color: "info", + }, + { + key: "archive", + icon: "🗄️", + label: "Archive", + sub: "ZIP Archive", + description: + "Like Portable, but stores settings and profiles in your Documents folder. Useful for custom deployment scenarios (e.g. Terminal Server).", + color: "info", + }, +]; + +const ARCH_LABELS = { x64: "x64", arm64: "ARM64" }; + +export default function DownloadSection() { + const { version, releaseDate, changelog, downloads, checksums } = release; + + // Only architectures that actually shipped assets for this release (older + // releases predate ARM64 and will only have "x64"). + const architectures = Object.keys(downloads); + const [arch, setArch] = useState(architectures[0]); + + const archDownloads = downloads[arch] ?? {}; + const archChecksums = checksums?.[arch]; + + return ( +
+ + +
+ ({ + key: a, + label: ARCH_LABELS[a] ?? a, + }))} + value={arch} + onChange={setArch} + /> +
+ + + {VARIANTS.filter((v) => archDownloads[v.key]).map((v) => ( + + ))} + +
+ ); +} diff --git a/Website/src/components/DownloadSection/styles.module.css b/Website/src/components/DownloadSection/styles.module.css new file mode 100644 index 0000000000..e84d935ee0 --- /dev/null +++ b/Website/src/components/DownloadSection/styles.module.css @@ -0,0 +1,9 @@ +.downloadSection { + margin: 1.5rem 0 2.5rem; +} + +.archSwitcherRow { + display: flex; + justify-content: center; + margin-bottom: 20px; +} diff --git a/Website/src/components/HomepageFeatures/index.js b/Website/src/components/HomepageFeatures/index.js new file mode 100644 index 0000000000..818307da6b --- /dev/null +++ b/Website/src/components/HomepageFeatures/index.js @@ -0,0 +1,94 @@ +import clsx from "clsx"; +import Heading from "@theme/Heading"; +import styles from "./styles.module.css"; + +const FeatureList = [ + { + title: "One Place for Everything", + Svg: require("@site/static/img/undraw-connected-world-wuay.svg").default, + description: ( + <> + Stop switching between a dozen utilities. Diagnose, connect, and manage + your entire network from a single unified interface. + + ), + }, + { + title: "Full Remote Access Built In", + Svg: require("@site/static/img/undraw-server-cluster-jwwq.svg").default, + description: ( + <> + Connect to desktops, servers, and containers directly from the app. + No separate clients to install or maintain. + + ), + }, + { + title: "Profiles That Work Everywhere", + Svg: require("@site/static/img/undraw-personal-settings-re-i6w4.svg") + .default, + description: ( + <> + Organize hosts by customer or environment. Every tool opens + pre-configured — nothing to re-enter, ever. + + ), + }, + { + title: "Enterprise-Ready", + Svg: require("@site/static/img/undraw-server-down-s-4-lk.svg").default, + description: ( + <> + MSI installer, signed binaries, Group Policy, package manager support, + and Active Directory import. Deploy it to your whole team in minutes. + + ), + }, + { + title: "Free. Open Source.", + Svg: require("@site/static/img/undraw-version-control-re-mg66.svg").default, + description: ( + <> + No license, no subscription, no telemetry. The source is on + GitHub — read it, audit it, or contribute to it. + + ), + }, +]; + +function Feature({ Svg, title, description }) { + return ( +
+
+ +
+
+ {title} +

{description}

+
+
+ ); +} + +export default function HomepageFeatures() { + const firstRow = FeatureList.slice(0, 3); + const secondRow = FeatureList.slice(3); + + // Return 2 rows with 3 columns each + return ( +
+
+
+ {firstRow.map((props, idx) => ( + + ))} +
+
+ {secondRow.map((props, idx) => ( + + ))} +
+
+
+ ); +} diff --git a/Website/src/components/HomepageFeatures/styles.module.css b/Website/src/components/HomepageFeatures/styles.module.css new file mode 100644 index 0000000000..5cf143b256 --- /dev/null +++ b/Website/src/components/HomepageFeatures/styles.module.css @@ -0,0 +1,15 @@ +.features { + display: flex; + align-items: center; + padding: 2rem 0; + width: 100%; +} + +.featureSvg { + height: 200px; + width: 200px; +} + +.featuresRowCenter { + justify-content: center; +} diff --git a/Website/src/components/LatestPrerelease/index.js b/Website/src/components/LatestPrerelease/index.js new file mode 100644 index 0000000000..752c009338 --- /dev/null +++ b/Website/src/components/LatestPrerelease/index.js @@ -0,0 +1,81 @@ +import { useState } from "react"; +import prerelease from "@site/src/data/prerelease.json"; +import ReleaseHero from "@site/src/components/ReleaseHero"; +import ArchSwitcher from "@site/src/components/ArchSwitcher"; +import DownloadCard, { DownloadGrid } from "@site/src/components/DownloadCard"; + +// Pre-release data is prefetched at build time (see scripts/fetch-release-data.mjs) +// and read statically here — no client-side GitHub request and no caching. +const VARIANTS = [ + { key: "setup", icon: "📦", label: "Setup", sub: "MSI Installer", color: "primary" }, + { key: "portable", icon: "🎒", label: "Portable", sub: "ZIP Archive", color: "info" }, + { key: "archive", icon: "🗄️", label: "Archive", sub: "ZIP Archive", color: "info" }, +]; + +const ARCH_LABELS = { x64: "x64", arm64: "ARM64" }; + +export default function LatestPrerelease() { + // Only architectures that actually shipped assets for this release (older + // releases predate ARM64 and will only have "x64"). + const architectures = prerelease.available + ? Object.keys(prerelease.downloads ?? {}) + : []; + const [arch, setArch] = useState(architectures[0]); + + if (!prerelease.available) { + return ( +

+ Currently no pre-release version available. +

+ ); + } + + const { version, releaseDate, changelog, downloads, checksums } = prerelease; + const archDownloads = downloads[arch] ?? {}; + const archChecksums = checksums?.[arch]; + + return ( + <> + + +
+
+ ({ + key: a, + label: ARCH_LABELS[a] ?? a, + }))} + value={arch} + onChange={setArch} + /> +
+ + {VARIANTS.filter((v) => archDownloads[v.key]).map((v) => ( + + ))} + +
+ + ); +} diff --git a/Website/src/components/ReleaseHero/index.js b/Website/src/components/ReleaseHero/index.js new file mode 100644 index 0000000000..af4c7c1aeb --- /dev/null +++ b/Website/src/components/ReleaseHero/index.js @@ -0,0 +1,31 @@ +import Link from "@docusaurus/Link"; +import clsx from "clsx"; +import styles from "./styles.module.css"; + +// Dark banner showing a release version + date and a changelog link. Used for +// both the stable download (full size) and the pre-release (compact, tagged). +export default function ReleaseHero({ + version, + releaseDate, + changelog, + changelogLabel, + tag, + compact = false, +}) { + return ( +
+
+
+ {version} + {tag && {tag}} +
+ Released {releaseDate} +
+ {changelog && ( + + {changelogLabel} + + )} +
+ ); +} diff --git a/Website/src/components/ReleaseHero/styles.module.css b/Website/src/components/ReleaseHero/styles.module.css new file mode 100644 index 0000000000..84df79bc35 --- /dev/null +++ b/Website/src/components/ReleaseHero/styles.module.css @@ -0,0 +1,84 @@ +.hero { + display: flex; + align-items: center; + justify-content: space-between; + flex-wrap: wrap; + gap: 16px; + padding: 22px 28px; + border-radius: 16px; + background: var(--ifm-background-dark); + color: #fff; + margin-bottom: 28px; +} + +/* Compact variant for the pre-release banner. */ +.heroCompact { + padding: 16px 22px; +} + +.heroCompact .heroVersion { + font-size: 24px; +} + +.heroInfo { + display: flex; + flex-direction: column; +} + +.heroVersionRow { + display: flex; + align-items: center; + gap: 10px; +} + +.heroTag { + padding: 2px 10px; + border-radius: 10px; + background: var(--ifm-color-warning); + color: #000; + font-size: 11px; + font-weight: 700; + letter-spacing: 0.04em; + text-transform: uppercase; +} + +.heroVersion { + font-size: 30px; + font-weight: 700; + line-height: 1.1; + color: var(--ifm-color-primary); +} + +.heroDate { + font-size: 14px; + opacity: 0.8; +} + +.heroChangelog { + background: rgba(255, 255, 255, 0.08); + border: 1px solid var(--ifm-color-primary); + border-radius: 24px; + padding: 8px 20px; + color: #fff; + font-weight: 600; + font-size: 16px; + text-decoration: none; + transition: background 0.15s, color 0.15s; +} + +.heroChangelog:hover { + background: var(--ifm-color-primary); + color: #000; + text-decoration: none; +} + +@media only screen and (max-width: 768px) { + .hero { + justify-content: center; + text-align: center; + } + + .heroInfo { + align-items: center; + } +} diff --git a/Website/src/components/ToolChips/index.js b/Website/src/components/ToolChips/index.js new file mode 100644 index 0000000000..0f245401a5 --- /dev/null +++ b/Website/src/components/ToolChips/index.js @@ -0,0 +1,22 @@ +import Link from "@docusaurus/Link"; +import tools from "@site/src/data/tools"; +import styles from "./styles.module.css"; + +// Compact, clickable chip grid of all built-in tools. Shared by the homepage +// and the docs introduction so both stay in sync with src/data/tools.js. +export default function ToolChips() { + return ( +
+ {tools.map((tool) => ( + + {tool.name} + + ))} +
+ ); +} diff --git a/Website/src/components/ToolChips/styles.module.css b/Website/src/components/ToolChips/styles.module.css new file mode 100644 index 0000000000..f1a6a4f2ed --- /dev/null +++ b/Website/src/components/ToolChips/styles.module.css @@ -0,0 +1,28 @@ +.toolChips { + display: flex; + flex-wrap: wrap; + gap: 10px; + justify-content: center; + max-width: 900px; + margin: 0 auto 32px; +} + +.toolChip { + background: var(--ifm-color-emphasis-100); + border: 1px solid var(--ifm-color-emphasis-300); + border-radius: 20px; + padding: 6px 16px; + font-size: 14px; + font-weight: 500; + color: var(--ifm-font-color-base); + white-space: nowrap; + text-decoration: none; + transition: background 0.15s, border-color 0.15s; +} + +.toolChip:hover { + background: var(--ifm-color-emphasis-200); + border-color: var(--ifm-color-primary); + color: var(--ifm-color-primary); + text-decoration: none; +} diff --git a/Website/src/components/VersionComparison/index.js b/Website/src/components/VersionComparison/index.js new file mode 100644 index 0000000000..5e5c44d5cf --- /dev/null +++ b/Website/src/components/VersionComparison/index.js @@ -0,0 +1,64 @@ +import styles from "./styles.module.css"; + +// Responsive comparison of the download variants. Renders as three columns on +// desktop and stacks vertically on mobile — unlike a markdown table, it never +// overflows the viewport and so never causes horizontal page scrolling. +const VARIANTS = [ + { + version: "Setup (MSI)", + description: ( + <> + Installs system-wide and requires administrator privileges, integrating + with Windows like any other installed app. It's the right choice for most + users and the standard way to roll NETworkManager out to many machines via + Intune, SCCM, or Group Policy (see Silent install below). Updates + install cleanly over a previous version. + + ), + location: ~\Documents\NETworkManager, + }, + { + version: "Portable (ZIP)", + description: ( + <> + Runs straight from the extracted folder — no installation and no + administrator rights required, which makes it ideal for a USB stick, a + network share, or locked-down environments. Settings and profiles are + stored next to the executable, so the whole setup travels with the folder. + To upgrade, copy your Profiles and Settings{" "} + directories into the new version. + + ), + location: "Next to the executable", + }, + { + version: "Archive (ZIP)", + description: ( + <> + Works like the Portable version — no installation required — but stores + settings and profiles in your Documents folder instead of next to the + executable. This suits custom or multi-user setups such as a Terminal + Server, where the application files stay shared while each user keeps their + own profile. Just extract it and run the executable directly. + + ), + location: ~\Documents\NETworkManager, + }, +]; + +export default function VersionComparison() { + return ( +
+ {VARIANTS.map((v) => ( +
+
{v.version}
+

{v.description}

+
+ Settings & profiles + {v.location} +
+
+ ))} +
+ ); +} diff --git a/Website/src/components/VersionComparison/styles.module.css b/Website/src/components/VersionComparison/styles.module.css new file mode 100644 index 0000000000..e05cbf9c92 --- /dev/null +++ b/Website/src/components/VersionComparison/styles.module.css @@ -0,0 +1,52 @@ +.grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 16px; + margin: 1rem 0 2rem; +} + +.card { + display: flex; + flex-direction: column; + padding: 18px 20px; + border: 1px solid var(--ifm-color-emphasis-300); + border-radius: 12px; + background: var(--ifm-color-emphasis-100); +} + +.cardTitle { + margin-bottom: 10px; + font-size: 18px; + font-weight: 700; +} + +.cardDesc { + flex-grow: 1; + margin-bottom: 14px; + font-size: 14px; + line-height: 1.55; + color: var(--ifm-color-emphasis-800); +} + +.cardSpec { + display: flex; + flex-direction: column; + gap: 2px; + padding-top: 12px; + border-top: 1px solid var(--ifm-color-emphasis-200); + font-size: 14px; +} + +.specLabel { + font-size: 11px; + font-weight: 700; + letter-spacing: 0.03em; + text-transform: uppercase; + color: var(--ifm-color-emphasis-600); +} + +@media only screen and (max-width: 768px) { + .grid { + grid-template-columns: 1fr; + } +} diff --git a/Website/src/css/custom.css b/Website/src/css/custom.css new file mode 100644 index 0000000000..f55bc3482a --- /dev/null +++ b/Website/src/css/custom.css @@ -0,0 +1,49 @@ +/** + * Any CSS included here will be global. The classic template + * bundles Infima by default. Infima is a CSS framework designed to + * work well for content-centric websites. + */ + +/* You can override the default Infima variables here. */ +:root { + --ifm-color-primary: #00d4aa; + --ifm-color-primary-dark: #00bf99; + --ifm-color-primary-darker: #00b491; + --ifm-color-primary-darkest: #009477; + --ifm-color-primary-light: #00e9bb; + --ifm-color-primary-lighter: #00f4c4; + --ifm-color-primary-lightest: #15ffd1; + + --ifm-code-font-size: 95%; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); + + /* Custom color variables */ + --ifm-background-dark: #2b3137; + + /* Custom layout variables */ + --content-max-width: 1060px; +} + +/* For readability concerns, you should choose a lighter palette in dark mode. */ +/* +[data-theme='dark'] { + --ifm-color-primary: #024959; + --ifm-color-primary-dark: #024250; + --ifm-color-primary-darker: #023e4c; + --ifm-color-primary-darkest: #01333e; + --ifm-color-primary-light: #025062; + --ifm-color-primary-lighter: #025466; + --ifm-color-primary-lightest: #035f74; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); +} +*/ + +.footer--dark { + --ifm-footer-background-color: var(--ifm-background-dark); +} + +.image { + display: block; + margin: auto; + max-width: var(--content-max-width); +} diff --git a/Website/src/data/prerelease.json b/Website/src/data/prerelease.json new file mode 100644 index 0000000000..debb165659 --- /dev/null +++ b/Website/src/data/prerelease.json @@ -0,0 +1,8 @@ +{ + "available": true, + "version": "2026.7.16.0", + "releaseDate": "16.07.2026", + "changelog": "/docs/changelog/next-release", + "downloads": {}, + "checksums": {} +} diff --git a/Website/src/data/release.json b/Website/src/data/release.json new file mode 100644 index 0000000000..1635cbea2a --- /dev/null +++ b/Website/src/data/release.json @@ -0,0 +1,8 @@ +{ + "available": true, + "version": "2026.7.7.0", + "releaseDate": "07.07.2026", + "changelog": "/docs/changelog/2026-7-7-0", + "downloads": {}, + "checksums": {} +} diff --git a/Website/src/data/tools.js b/Website/src/data/tools.js new file mode 100644 index 0000000000..86465d2695 --- /dev/null +++ b/Website/src/data/tools.js @@ -0,0 +1,46 @@ +// Single source of truth for the built-in tools list, shared by the homepage +// tool grid and the docs introduction. Sorted by sidebar_position. +// `note` (optional) is shown as a tooltip on the chip. +const tools = [ + { name: "Dashboard", to: "/docs/application/dashboard" }, + { + name: "Network Interface", + to: "/docs/application/network-interface", + note: "Information, Bandwidth, Configure", + }, + { name: "WiFi", to: "/docs/application/wifi", note: "Networks, Channels" }, + { name: "IP Scanner", to: "/docs/application/ip-scanner" }, + { name: "Port Scanner", to: "/docs/application/port-scanner" }, + { name: "Ping Monitor", to: "/docs/application/ping-monitor" }, + { name: "Traceroute", to: "/docs/application/traceroute" }, + { name: "DNS Lookup", to: "/docs/application/dns-lookup" }, + { name: "Remote Desktop", to: "/docs/application/remote-desktop" }, + { name: "PowerShell", to: "/docs/application/powershell" }, + { name: "PuTTY", to: "/docs/application/putty", note: "Requires PuTTY" }, + { name: "TigerVNC", to: "/docs/application/tigervnc", note: "Requires TigerVNC" }, + { name: "Web Console", to: "/docs/application/web-console" }, + { name: "SNMP", to: "/docs/application/snmp", note: "Get, Walk, Set" }, + { name: "SNTP Lookup", to: "/docs/application/sntp-lookup" }, + { name: "Hosts File Editor", to: "/docs/application/hosts-file-editor" }, + { name: "Firewall", to: "/docs/application/firewall" }, + { + name: "Discovery Protocol", + to: "/docs/application/discovery-protocol", + note: "LLDP, CDP", + }, + { name: "Wake on LAN", to: "/docs/application/wake-on-lan" }, + { name: "Whois", to: "/docs/application/whois" }, + { name: "IP Geolocation", to: "/docs/application/ip-geolocation" }, + { + name: "Subnet Calculator", + to: "/docs/application/subnet-calculator", + note: "Calculator, Subnetting, Supernetting", + }, + { name: "Bit Calculator", to: "/docs/application/bit-calculator" }, + { name: "Lookup", to: "/docs/application/lookup", note: "OUI, Port" }, + { name: "Connections", to: "/docs/application/connections" }, + { name: "Listeners", to: "/docs/application/listeners" }, + { name: "Neighbor Table", to: "/docs/application/neighbor-table" }, +]; + +export default tools; diff --git a/Website/src/pages/download.mdx b/Website/src/pages/download.mdx new file mode 100644 index 0000000000..cee5ec8c01 --- /dev/null +++ b/Website/src/pages/download.mdx @@ -0,0 +1,167 @@ +--- +title: Download +description: "Download NETworkManager for free — available as MSI installer, portable ZIP, or via winget and Chocolatey. Open-source network tool for Windows." +keywords: [NETworkManager download, network manager download, free network tool, Windows network manager, MSI installer, portable, winget, chocolatey] +--- + +import Link from "@docusaurus/Link"; +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +import styles from "./styles.module.css"; +import DownloadSection from "@site/src/components/DownloadSection"; +import VersionComparison from "@site/src/components/VersionComparison"; +import LatestPrerelease from "@site/src/components/LatestPrerelease"; + +# Download + + + + + +
+

🙏 Thank you for using NETworkManager!

+

+ NETworkManager is open source, free and without ads — developed in my spare time for you.
+ If you enjoy it, please consider supporting its development — whether by + leaving a star on GitHub, + making a donation, or simply sharing it with others. + Your support helps keep the project going and growing.
+ Thank you for being part of the journey! +

+ +
+ + 💖 Donate + +
+
+ +## Which version should I download? + +Each version is suited to a different scenario — here's a closer look to help you choose: + + + +## System requirements + +- 🪟 **Windows 10 / Server x64/ARM64** (22H2 or later) +- ⚙️ [**.NET Desktop Runtime 10.0 (LTS) - x64/ARM64**](https://dotnet.microsoft.com/en-us/download/dotnet/10.0/runtime) + +## Package Manager + +NETworkManager is available through the following package managers: + + + + +```powershell +winget install BornToBeRoot.NETworkManager +``` + +Source: [github.com/microsoft/winget-pkgs](https://github.com/microsoft/winget-pkgs/tree/master/manifests/b/BornToBeRoot/NETworkManager/) + + + + +```powershell +choco install networkmanager +``` + +Source: [chocolatey.org/packages/NETworkManager](https://chocolatey.org/packages/NETworkManager) + + + + +```powershell +Get-EvergreenApp -Name NETworkManager | Save-EvergreenApp -Path $env:USERPROFILE\Downloads\ +``` + +Source: [github.com/aaronparker/evergreen](https://github.com/aaronparker/evergreen) + + + + +## Verify your download + +Each download is published with a SHA-256 checksum. Use the **📋 Copy SHA-256** button on a download card to copy its expected hash, then compute the hash of the downloaded file and compare the two: + +```powershell +Get-FileHash -Path .\NETworkManager_{VERSION}_Setup_win-x64.msi -Algorithm SHA256 +``` + +The computed hash must match the copied checksum. The full list of checksums is also published on the [GitHub releases page](https://github.com/BornToBeRoot/NETworkManager/releases). + +## Silent install + +Install the Setup (MSI) silently using the following command: + +``` +.\NETworkManager_{VERSION}_Setup_win-x64.msi /quiet /norestart +``` + +## Enterprise Deployment / Policies + +NETworkManager supports system-wide policies that allow administrators to enforce specific settings for all users on a machine — for example, disabling the automatic update check at startup. Policies are defined in a `config.json` file placed in the application installation directory and can be deployed via Group Policy, Intune, SCCM, or any other configuration management tool. + +See the [System-Wide Policies](/docs/system-wide-policies) documentation for details on available policy options and how to configure them. + +## Pre-release + +Help improve NETworkManager by testing pre-release versions with the latest features and bug fixes, and reporting any issues via [GitHub Issues](https://github.com/BornToBeRoot/NETworkManager/issues/new/choose). + + + +:::warning + +Please note that pre-release versions are not as stable as regular versions and may contain more bugs. + +::: + +## Code Signing Policy + +NETworkManager uses free code signing services from [SignPath.io](https://signpath.io/) and a free code signing certificate provided by the [SignPath Foundation](https://signpath.org/) to sign all official binaries and installers, ensuring the authenticity and integrity of your downloads. + +The binaries and installers are built on [AppVeyor](https://ci.appveyor.com/project/BornToBeRoot/networkmanager) directly from the [GitHub repository](https://github.com/BornToBeRoot/NETworkManager/blob/main/appveyor.yml). After each build, the artifacts are automatically sent to [SignPath.io](https://signpath.io/) via webhook, where they are signed following manual approval by the maintainer. Once signed, the binaries are uploaded to the [GitHub releases page](https://github.com/BornToBeRoot/NETworkManager/releases). + +## Privacy Policy + +Your privacy matters. NETworkManager will not transfer any information to other networked systems unless specifically requested by the user or the person installing or operating it. + +NETworManager has integrated some optional third-party services to enhance functionality. You can choose to enable or disable these services at the first startup or later in the settings: + +- [api.github.com](https://docs.github.com/en/site-policy/privacy-policies/github-general-privacy-statement) - Check for application updates. +- [ipify.org](https://www.ipify.org/) - Retrieve the public IP address used by the client. +- [ip-api.com](https://ip-api.com/docs/legal) - Retrieve network information (e.g., geolocation, ISP, DNS resolver) used by the client. +- [speed.cloudflare.com](https://www.cloudflare.com/privacypolicy/) - Measure download/upload speed, latency and jitter. + +## License + +NETworkManager is licensed under the [GNU General Public License v3](https://github.com/BornToBeRoot/NETworkManager/blob/main/LICENSE). Library licenses are [here](https://github.com/BornToBeRoot/NETworkManager/tree/main/Source/NETworkManager.Documentation/Licenses). diff --git a/Website/src/pages/index.js b/Website/src/pages/index.js new file mode 100644 index 0000000000..54de69013a --- /dev/null +++ b/Website/src/pages/index.js @@ -0,0 +1,145 @@ +import React from "react"; +import Link from "@docusaurus/Link"; +import Layout from "@theme/Layout"; +import HomepageFeatures from "@site/src/components/HomepageFeatures"; +import ToolChips from "@site/src/components/ToolChips"; +import tools from "@site/src/data/tools"; +import release from "@site/src/data/release.json"; + +import ImageGalleryDashboard from "@site/docs/img/dashboard.png"; + +import Heading from "@theme/Heading"; +import styles from "./styles.module.css"; + +const directDownloads = release.downloads.x64; + +function HomepageHeader() { + return ( +
+
+ + NETworkManager Logo + +

+ NETworkManager +

+

+ A powerful open-source tool for managing networks and{" "} + troubleshooting network problems! +

+
+
+
+ + Download + + + GitHub + + + + GitHub Stars + + + GitHub Downloads + + +
+
+ Direct download (x64):{" "} + MSI-Setup + | + Portable +
+
+ NETworkManager Dashboard +
+
+
+ ); +} + +function ToolGrid() { + return ( +
+
+ {tools.length} Built-in Tools +

+ Everything a network engineer needs, in one place. +

+ +
+
+ ); +} + +export default function Home() { + return ( + + +
+ + +
+ See It in Action +
+ Tabs and drag & drop preview +

+ Tabs and drag & drop functionality. +

+
+
+ + ⬇ Download now + + + More screenshots in the docs → + +
+
+
+
+ ); +} diff --git a/Website/src/pages/styles.module.css b/Website/src/pages/styles.module.css new file mode 100644 index 0000000000..a8bfd0e3ee --- /dev/null +++ b/Website/src/pages/styles.module.css @@ -0,0 +1,229 @@ +table { + width: 100%; + display: table; +} + +/* ─── Hero ─────────────────────────────────────────── */ + +@keyframes jack-in-the-box { + 0% { + opacity: 0; + transform: scale(0.1) rotate(30deg); + transform-origin: center bottom; + } + 50% { + transform: rotate(-10deg); + } + 70% { + transform: rotate(3deg); + } + 100% { + opacity: 1; + transform: scale(1); + } +} + +.hero { + background-color: var(--ifm-background-dark); + padding: 48px; +} + +.heroInner { + margin: 0 auto; + max-width: 1100px; + padding: 0 20px; +} + +.heroProjectTitle { + color: #fff; + font-size: 60px; + margin: 0; +} + +.heroProjectTagline { + color: #fff; + font-size: 32px; + margin: 0; +} + +.heroTextHtml b { + color: var(--ifm-color-primary); +} + +.heroLogo { + animation-duration: 2s; + animation-name: jack-in-the-box; + float: right; + margin-top: 20px; + padding: 0 20px 20px; + height: auto; +} + +.indexCtas { + --ifm-button-size-multiplier: 1.6; + display: flex; + flex-wrap: wrap; + align-items: center; + margin-top: 24px; +} + +.indexCtas a, +.indexCtas a:hover { + color: black; +} + +.indexCtas > a:last-of-type { + margin: 20px 36px; +} + +.indexCtasGitHubButtonWrapper { + display: flex; + align-items: center; +} + +.indexCtasGitHubButton { + margin: 0.5rem; + overflow: hidden; + vertical-align: middle; +} + +.directDownloads { + margin-top: 4px; + font-size: 14px; + color: rgba(255, 255, 255, 0.7); +} + +.directDownloads a { + color: var(--ifm-color-primary); + font-weight: 600; + text-decoration: none; +} + +.directDownloads a:hover { + text-decoration: underline; +} + +.directDownloadsSep { + margin: 0 8px; + color: rgba(255, 255, 255, 0.3); +} + +/* ─── Hero screenshot ───────────────────────────────── */ + +.heroScreenshotWrapper { + margin-top: 40px; +} + +.heroScreenshot { + display: block; + width: 100%; + height: auto; + border-radius: 4px; + border: 1px solid rgba(255, 255, 255, 0.1); + box-shadow: 0 16px 48px rgba(0, 0, 0, 0.5); +} + +/* ─── Tool grid ─────────────────────────────────────── */ + +.toolGrid { + padding: 64px 0; +} + +.toolGridSubtitle { + color: var(--ifm-color-emphasis-600); + font-size: 18px; + margin-bottom: 32px; +} + +.additionalButton { + margin: 20px; + height: 44px; + width: 200px; + font-size: 18px; +} + +.thankYouCard { + margin: 2.5rem 0; + padding: 24px 28px; + border-radius: 16px; + border: 1px solid var(--ifm-color-emphasis-300); + border-left: 4px solid var(--ifm-color-primary); + background: var(--ifm-color-emphasis-100); +} + +.thankYouCard h3 { + margin-top: 0; +} + +.shieldsContainer { + text-align: center; +} + +.shields { + margin: 0rem 0.25rem; +} + +/* ─── Preview ("See It in Action") ─────────────────── */ + +.previewSingle { + margin: 32px auto 40px; + max-width: var(--content-max-width); +} + +.previewSingle img { + display: block; + width: 100%; + height: auto; + border-radius: 4px; + border: 1px solid var(--ifm-color-emphasis-200); +} + +.previewCaption { + margin-top: 10px; + font-size: 14px; + color: var(--ifm-color-emphasis-600); +} + +.previewCtas { + display: flex; + flex-wrap: wrap; + gap: 16px; + justify-content: center; +} + +/* ─── Responsive ────────────────────────────────────── */ + +@media only screen and (max-width: 768px) { + .hero { + padding-left: 20px; + padding-right: 20px; + } + + .heroInner { + padding: 0; + } + + .heroProjectTitle { + font-size: 36px; + text-align: center; + } + + .heroProjectTagline { + font-size: 24px; + text-align: center; + } + + .heroLogo { + display: block; + float: none; + margin: 0 auto; + } + + .indexCtas { + justify-content: center; + } + + .indexCtas > a { + margin: 20px 36px; + } +} diff --git a/Website/static/.nojekyll b/Website/static/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Website/static/.well-known/security.txt b/Website/static/.well-known/security.txt new file mode 100644 index 0000000000..eae3f4ab97 --- /dev/null +++ b/Website/static/.well-known/security.txt @@ -0,0 +1,10 @@ +# Security Policy for NETworkManager +# https://securitytxt.org/ + +Contact: mailto:security@borntoberoot.net +Contact: https://github.com/BornToBeRoot/NETworkManager/security/advisories/new +Contact: https://x.com/_BornToBeRoot +Expires: 2030-12-31T00:00:00.000Z +Preferred-Languages: en +Canonical: https://borntoberoot.net/NETworkManager/.well-known/security.txt +Policy: https://github.com/BornToBeRoot/NETworkManager/security/policy diff --git a/Website/static/img/favicon.ico b/Website/static/img/favicon.ico new file mode 100644 index 0000000000..14917c41bb Binary files /dev/null and b/Website/static/img/favicon.ico differ diff --git a/Website/static/img/logo.svg b/Website/static/img/logo.svg new file mode 100644 index 0000000000..f84869dcc0 --- /dev/null +++ b/Website/static/img/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Website/static/img/preview-features.gif b/Website/static/img/preview-features.gif new file mode 100644 index 0000000000..f3dfec85ee Binary files /dev/null and b/Website/static/img/preview-features.gif differ diff --git a/Website/static/img/preview-light-theme.png b/Website/static/img/preview-light-theme.png new file mode 100644 index 0000000000..bddd4469dd Binary files /dev/null and b/Website/static/img/preview-light-theme.png differ diff --git a/Website/static/img/preview-profiles.gif b/Website/static/img/preview-profiles.gif new file mode 100644 index 0000000000..dcf1b13ae8 Binary files /dev/null and b/Website/static/img/preview-profiles.gif differ diff --git a/Website/static/img/preview-tabs-drag-drop.gif b/Website/static/img/preview-tabs-drag-drop.gif new file mode 100644 index 0000000000..0270265161 Binary files /dev/null and b/Website/static/img/preview-tabs-drag-drop.gif differ diff --git a/Website/static/img/social-card.png b/Website/static/img/social-card.png new file mode 100644 index 0000000000..911d0cd83a Binary files /dev/null and b/Website/static/img/social-card.png differ diff --git a/Website/static/img/undraw-connected-world-wuay.svg b/Website/static/img/undraw-connected-world-wuay.svg new file mode 100644 index 0000000000..c2890f8cc8 --- /dev/null +++ b/Website/static/img/undraw-connected-world-wuay.svg @@ -0,0 +1 @@ +connected world \ No newline at end of file diff --git a/Website/static/img/undraw-personal-settings-re-i6w4.svg b/Website/static/img/undraw-personal-settings-re-i6w4.svg new file mode 100644 index 0000000000..431902a9f8 --- /dev/null +++ b/Website/static/img/undraw-personal-settings-re-i6w4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Website/static/img/undraw-secure-login-pdn4.svg b/Website/static/img/undraw-secure-login-pdn4.svg new file mode 100644 index 0000000000..9caac70504 --- /dev/null +++ b/Website/static/img/undraw-secure-login-pdn4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Website/static/img/undraw-server-cluster-jwwq.svg b/Website/static/img/undraw-server-cluster-jwwq.svg new file mode 100644 index 0000000000..b3ba8e90f3 --- /dev/null +++ b/Website/static/img/undraw-server-cluster-jwwq.svg @@ -0,0 +1 @@ +server_cluster \ No newline at end of file diff --git a/Website/static/img/undraw-server-down-s-4-lk.svg b/Website/static/img/undraw-server-down-s-4-lk.svg new file mode 100644 index 0000000000..60da2958a0 --- /dev/null +++ b/Website/static/img/undraw-server-down-s-4-lk.svg @@ -0,0 +1 @@ +server down \ No newline at end of file diff --git a/Website/static/img/undraw-version-control-re-mg66.svg b/Website/static/img/undraw-version-control-re-mg66.svg new file mode 100644 index 0000000000..8cd6f66e99 --- /dev/null +++ b/Website/static/img/undraw-version-control-re-mg66.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Website/static/robots.txt b/Website/static/robots.txt new file mode 100644 index 0000000000..ad4468e658 --- /dev/null +++ b/Website/static/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: https://borntoberoot.net/NETworkManager/sitemap.xml diff --git a/Website/yarn.lock b/Website/yarn.lock new file mode 100644 index 0000000000..fa22a430ff --- /dev/null +++ b/Website/yarn.lock @@ -0,0 +1,9271 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@11ty/gray-matter@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@11ty/gray-matter/-/gray-matter-1.0.0.tgz#35ee04d76b870893c053f64f659c923a7a9db2d7" + integrity sha512-7mJJl+wf1AByoT0PknQiQfOPnVNT4fevGrUBVWO4HXsnYn1aQPyRyrELYrNUFleUBM++KzMKN6QaxHPk0t/6/g== + dependencies: + js-yaml "^4.1.0" + kind-of "^6.0.3" + section-matter "^1.0.0" + strip-bom-string "^1.0.0" + +"@algolia/abtesting@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@algolia/abtesting/-/abtesting-1.5.0.tgz#3faf3770c7fcb4afcf86d9ac29d29c3cfca33441" + integrity sha512-W/ohRkbKQsqDWALJg28X15KF7Tcyg53L1MfdOkLgvkcCcofdzGHSimHHeNG05ojjFw9HK8+VPhe/Vwq4MozIJg== + dependencies: + "@algolia/client-common" "5.39.0" + "@algolia/requester-browser-xhr" "5.39.0" + "@algolia/requester-fetch" "5.39.0" + "@algolia/requester-node-http" "5.39.0" + +"@algolia/autocomplete-core@1.19.2": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz#702df67a08cb3cfe8c33ee1111ef136ec1a9e232" + integrity sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw== + dependencies: + "@algolia/autocomplete-plugin-algolia-insights" "1.19.2" + "@algolia/autocomplete-shared" "1.19.2" + +"@algolia/autocomplete-core@^1.19.2": + version "1.19.8" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.19.8.tgz#7c84c771d28643fb00d09026c05013fb97aeea23" + integrity sha512-3YEorYg44niXcm7gkft3nXYItHd44e8tmh4D33CTszPgP0QWkaLEaFywiNyJBo7UL/mqObA/G9RYuU7R8tN1IA== + dependencies: + "@algolia/autocomplete-plugin-algolia-insights" "1.19.8" + "@algolia/autocomplete-shared" "1.19.8" + +"@algolia/autocomplete-plugin-algolia-insights@1.19.2": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz#3584b625b9317e333d1ae43664d02358e175c52d" + integrity sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg== + dependencies: + "@algolia/autocomplete-shared" "1.19.2" + +"@algolia/autocomplete-plugin-algolia-insights@1.19.8": + version "1.19.8" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.8.tgz#f60d21edbe2a42e6d4e2215430733e3f51641471" + integrity sha512-ZvJWO8ZZJDpc1LNM2TTBdmQsZBLMR4rU5iNR2OYvEeFBiaf/0ESnRSSLQbryarJY4SVxtoz6A2ZtDMNM+iQEAA== + dependencies: + "@algolia/autocomplete-shared" "1.19.8" + +"@algolia/autocomplete-shared@1.19.2": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz#c0b7b8dc30a5c65b70501640e62b009535e4578f" + integrity sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w== + +"@algolia/autocomplete-shared@1.19.8": + version "1.19.8" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.8.tgz#5d723d8bdb448efbb1b0e1c7ff94cc18e5b1dc0e" + integrity sha512-h5hf2t8ejF6vlOgvLaZzQbWs5SyH2z4PAWygNAvvD/2RI29hdQ54ldUGwqVuj9Srs+n8XUKTPUqb7fvhBhQrnQ== + +"@algolia/client-abtesting@5.39.0": + version "5.39.0" + resolved "https://registry.yarnpkg.com/@algolia/client-abtesting/-/client-abtesting-5.39.0.tgz#7de7ad39e0b98b60bd25e61c113aab0d6918c80a" + integrity sha512-Vf0ZVe+qo3sHDrCinouJqlg8VoxM4Qo/KxNIqMYybkuctutfnp3kIY9OmESplOQ/9NGBthU9EG+4d5fBibWK/A== + dependencies: + "@algolia/client-common" "5.39.0" + "@algolia/requester-browser-xhr" "5.39.0" + "@algolia/requester-fetch" "5.39.0" + "@algolia/requester-node-http" "5.39.0" + +"@algolia/client-analytics@5.39.0": + version "5.39.0" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-5.39.0.tgz#be55775f09734d9031579657e182d5456e4f1924" + integrity sha512-V16ITZxYIwcv1arNce65JZmn94Ft6vKlBZ//gXw8AvIH32glJz1KcbaVAUr9p7PYlGZ/XVHP6LxDgrpNdtwgcA== + dependencies: + "@algolia/client-common" "5.39.0" + "@algolia/requester-browser-xhr" "5.39.0" + "@algolia/requester-fetch" "5.39.0" + "@algolia/requester-node-http" "5.39.0" + +"@algolia/client-common@5.39.0": + version "5.39.0" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-5.39.0.tgz#3c16868b645d6e984920ae43509726e19995042f" + integrity sha512-UCJTuwySEQeiKPWV3wruhuI/wHbDYenHzgL9pYsvh6r/u5Z+g61ip1iwdAlFp02CnywzI9O7+AQPh2ManYyHmQ== + +"@algolia/client-insights@5.39.0": + version "5.39.0" + resolved "https://registry.yarnpkg.com/@algolia/client-insights/-/client-insights-5.39.0.tgz#0d03882ec93b63346459c67bc94f782ea17f7030" + integrity sha512-s0ia8M/ZZR+iO2uLNTBrlQdEb6ZMAMcKMHckp5mcoglxrf8gHifL4LmdhGKdAxAn3UIagtqIP0RCnIymHUbm7A== + dependencies: + "@algolia/client-common" "5.39.0" + "@algolia/requester-browser-xhr" "5.39.0" + "@algolia/requester-fetch" "5.39.0" + "@algolia/requester-node-http" "5.39.0" + +"@algolia/client-personalization@5.39.0": + version "5.39.0" + resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-5.39.0.tgz#ebf29cd9aeb9cde8a33fbd954d0452ab76969f8f" + integrity sha512-vZPIt7Lw+toNsHZUiPhNIc1Z3vUjDp7nzn6AMOaPC73gEuTq2iLPNvM06CSB6aHePo5eMeJIP5YEKBUQUA/PJA== + dependencies: + "@algolia/client-common" "5.39.0" + "@algolia/requester-browser-xhr" "5.39.0" + "@algolia/requester-fetch" "5.39.0" + "@algolia/requester-node-http" "5.39.0" + +"@algolia/client-query-suggestions@5.39.0": + version "5.39.0" + resolved "https://registry.yarnpkg.com/@algolia/client-query-suggestions/-/client-query-suggestions-5.39.0.tgz#4f5d11e404f6e16712b53c79115d05ee3de65a85" + integrity sha512-jcPQr3iKTWNVli2NYHPv02aNLwixDjPCpOgMp9CZTvEiPI6Ec4jHX+oFr3LDZagOFY9e1xJhc/JrgMGGW1sHnw== + dependencies: + "@algolia/client-common" "5.39.0" + "@algolia/requester-browser-xhr" "5.39.0" + "@algolia/requester-fetch" "5.39.0" + "@algolia/requester-node-http" "5.39.0" + +"@algolia/client-search@5.39.0": + version "5.39.0" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-5.39.0.tgz#fdce8cdb4cc972a5e1faf313316b5d9f126001bf" + integrity sha512-/IYpF10BpthGZEJQZMhMqV4AqWr5avcWfZm/SIKK1RvUDmzGqLoW/+xeJVX9C8ZnNkIC8hivbIQFaNaRw0BFZQ== + dependencies: + "@algolia/client-common" "5.39.0" + "@algolia/requester-browser-xhr" "5.39.0" + "@algolia/requester-fetch" "5.39.0" + "@algolia/requester-node-http" "5.39.0" + +"@algolia/events@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@algolia/events/-/events-4.0.1.tgz#fd39e7477e7bc703d7f893b556f676c032af3950" + integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== + +"@algolia/ingestion@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@algolia/ingestion/-/ingestion-1.39.0.tgz#4e2959a830523373aa92b20e80139ca828ac03dc" + integrity sha512-IgSHKUiuecqLfBlXiuCSdRTdsO3/yvpmXrMFz8fAJ8M4QmDtHkOuD769dmybRYqsbYMHivw+lir4BgbRGMtOIQ== + dependencies: + "@algolia/client-common" "5.39.0" + "@algolia/requester-browser-xhr" "5.39.0" + "@algolia/requester-fetch" "5.39.0" + "@algolia/requester-node-http" "5.39.0" + +"@algolia/monitoring@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@algolia/monitoring/-/monitoring-1.39.0.tgz#c7292bc099351e9a63cb9c63f1531b2eba84c7b8" + integrity sha512-8Xnd4+609SKC/hqVsuFc4evFBmvA2765/4NcH+Dpr756SKPbL1BY0X8kVxlmM3YBLNqnduSQxHxpDJUK58imCA== + dependencies: + "@algolia/client-common" "5.39.0" + "@algolia/requester-browser-xhr" "5.39.0" + "@algolia/requester-fetch" "5.39.0" + "@algolia/requester-node-http" "5.39.0" + +"@algolia/recommend@5.39.0": + version "5.39.0" + resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-5.39.0.tgz#6b8ebfc05e86df0e6f499c81ad3b9025191a973f" + integrity sha512-D7Ye2Ss/5xqUkQUxKm/VqEJLt5kARd9IMmjdzlxaKhGgNlOemTay0lwBmOVFuJRp7UODjp5c9+K+B8g0ORObIw== + dependencies: + "@algolia/client-common" "5.39.0" + "@algolia/requester-browser-xhr" "5.39.0" + "@algolia/requester-fetch" "5.39.0" + "@algolia/requester-node-http" "5.39.0" + +"@algolia/requester-browser-xhr@5.39.0": + version "5.39.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.39.0.tgz#2fc3a126cda69c1ea1f0130a5bd3d1a5abdfe8f0" + integrity sha512-mgPte1ZJqpk9dkVs44J3wKAbHATvHZNlSpzhMdjMLIg/3qTycSZyDiomLiSlxE8CLsxyBAOJWnyKRHfom+Z1rg== + dependencies: + "@algolia/client-common" "5.39.0" + +"@algolia/requester-fetch@5.39.0": + version "5.39.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-fetch/-/requester-fetch-5.39.0.tgz#f470926aa005ce5b1f4728ecd645032ed2f43f91" + integrity sha512-LIrCkrxu1WnO3ev1+w6NnZ12JZL/o+2H9w6oWnZAjQZIlA/Ym6M9QHkt+OQ/SwkuoiNkW3DAo+Pi4A2V9FPtqg== + dependencies: + "@algolia/client-common" "5.39.0" + +"@algolia/requester-node-http@5.39.0": + version "5.39.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-5.39.0.tgz#537cec65ebee684fe0cec7921128c425f95ff0bd" + integrity sha512-6beG+egPwXmvhAg+m0STCj+ZssDcjrLzf4L05aKm2nGglMXSSPz0cH/rM+kVD9krNfldiMctURd4wjojW1fV0w== + dependencies: + "@algolia/client-common" "5.39.0" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" + integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== + dependencies: + "@babel/helper-validator-identifier" "^7.27.1" + js-tokens "^4.0.0" + picocolors "^1.1.1" + +"@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c" + integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw== + dependencies: + "@babel/helper-validator-identifier" "^7.28.5" + js-tokens "^4.0.0" + picocolors "^1.1.1" + +"@babel/code-frame@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.7.tgz#f2fbbfea87c44a21590ec515b778b2c26d8866e7" + integrity sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw== + dependencies: + "@babel/helper-validator-identifier" "^7.29.7" + js-tokens "^4.0.0" + picocolors "^1.1.1" + +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.27.2": + version "7.27.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.27.5.tgz#7d0658ec1a8420fc866d1df1b03bea0e79934c82" + integrity sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg== + +"@babel/compat-data@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.7.tgz#6f0237f0f36d2e51c0570a636faed9d2d0efe629" + integrity sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg== + +"@babel/core@^7.21.3", "@babel/core@^7.25.9": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.7.tgz#80c10b17248082968b57a857b91640971f2070f7" + integrity sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/generator" "^7.29.7" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helpers" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/template" "^7.29.7" + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + "@jridgewell/remapping" "^2.3.5" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.25.9", "@babel/generator@^7.27.3": + version "7.27.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.27.5.tgz#3eb01866b345ba261b04911020cbe22dd4be8c8c" + integrity sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw== + dependencies: + "@babel/parser" "^7.27.5" + "@babel/types" "^7.27.3" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + +"@babel/generator@^7.29.0": + version "7.29.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.1.tgz#d09876290111abbb00ef962a7b83a5307fba0d50" + integrity sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw== + dependencies: + "@babel/parser" "^7.29.0" + "@babel/types" "^7.29.0" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" + +"@babel/generator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.7.tgz#cca0b8827e6bcf3ba176788e7f3b180ad6db2fa3" + integrity sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ== + dependencies: + "@babel/parser" "^7.29.7" + "@babel/types" "^7.29.7" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" + +"@babel/helper-annotate-as-pure@^7.27.1": + version "7.27.3" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz#f31fd86b915fc4daf1f3ac6976c59be7084ed9c5" + integrity sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg== + dependencies: + "@babel/types" "^7.27.3" + +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.27.1", "@babel/helper-compilation-targets@^7.27.2": + version "7.27.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d" + integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== + dependencies: + "@babel/compat-data" "^7.27.2" + "@babel/helper-validator-option" "^7.27.1" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-compilation-targets@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz#7a1def704302401c47f64fa85589e974ae217042" + integrity sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g== + dependencies: + "@babel/compat-data" "^7.29.7" + "@babel/helper-validator-option" "^7.29.7" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz#5bee4262a6ea5ddc852d0806199eb17ca3de9281" + integrity sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-member-expression-to-functions" "^7.27.1" + "@babel/helper-optimise-call-expression" "^7.27.1" + "@babel/helper-replace-supers" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/traverse" "^7.27.1" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz#05b0882d97ba1d4d03519e4bce615d70afa18c53" + integrity sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + regexpu-core "^6.2.0" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.6.3", "@babel/helper-define-polyfill-provider@^0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz#15e8746368bfa671785f5926ff74b3064c291fab" + integrity sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + +"@babel/helper-globals@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" + integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== + +"@babel/helper-globals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.29.7.tgz#f04a96fbd8473241b1079243f5b3f03a3010ab7b" + integrity sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA== + +"@babel/helper-member-expression-to-functions@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz#ea1211276be93e798ce19037da6f06fbb994fa44" + integrity sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helper-module-imports@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" + integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helper-module-imports@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz#60632cbd6ffb70b22823187201116762a03e2d5c" + integrity sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw== + dependencies: + "@babel/traverse" "^7.28.6" + "@babel/types" "^7.28.6" + +"@babel/helper-module-imports@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz#ef25048a518e828d7393fac5882ddd73921d7396" + integrity sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g== + dependencies: + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/helper-module-transforms@^7.27.1": + version "7.27.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz#db0bbcfba5802f9ef7870705a7ef8788508ede02" + integrity sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg== + dependencies: + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/traverse" "^7.27.3" + +"@babel/helper-module-transforms@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz#9312d9d9e56edc35aeb6e95c25d4106b50b9eb1e" + integrity sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA== + dependencies: + "@babel/helper-module-imports" "^7.28.6" + "@babel/helper-validator-identifier" "^7.28.5" + "@babel/traverse" "^7.28.6" + +"@babel/helper-module-transforms@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz#b062747a5997ba138637201328bbff77960574ae" + integrity sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg== + dependencies: + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/helper-optimise-call-expression@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz#c65221b61a643f3e62705e5dd2b5f115e35f9200" + integrity sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw== + dependencies: + "@babel/types" "^7.27.1" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.27.1", "@babel/helper-plugin-utils@^7.8.0": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" + integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== + +"@babel/helper-plugin-utils@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz#6f13ea251b68c8532e985fd532f28741a8af9ac8" + integrity sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug== + +"@babel/helper-remap-async-to-generator@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz#4601d5c7ce2eb2aea58328d43725523fcd362ce6" + integrity sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-wrap-function" "^7.27.1" + "@babel/traverse" "^7.27.1" + +"@babel/helper-replace-supers@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz#b1ed2d634ce3bdb730e4b52de30f8cccfd692bc0" + integrity sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.27.1" + "@babel/helper-optimise-call-expression" "^7.27.1" + "@babel/traverse" "^7.27.1" + +"@babel/helper-skip-transparent-expression-wrappers@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz#62bb91b3abba8c7f1fec0252d9dbea11b3ee7a56" + integrity sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== + +"@babel/helper-string-parser@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz#7f0871d99824d23137d60f86fcf6130fd5a1b51f" + integrity sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw== + +"@babel/helper-validator-identifier@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" + integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== + +"@babel/helper-validator-identifier@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" + integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== + +"@babel/helper-validator-identifier@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz#bd87084ced0c796ec46bda492de6e83d29e89fc2" + integrity sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg== + +"@babel/helper-validator-option@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" + integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== + +"@babel/helper-validator-option@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz#cf315be940213b354eb4abcc0bd01ebe3f73bc2a" + integrity sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw== + +"@babel/helper-wrap-function@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz#b88285009c31427af318d4fe37651cd62a142409" + integrity sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ== + dependencies: + "@babel/template" "^7.27.1" + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helpers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.29.7.tgz#45abfde7548997e34376c3e69feb475cffb4a607" + integrity sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg== + dependencies: + "@babel/template" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/parser@^7.27.2", "@babel/parser@^7.27.4", "@babel/parser@^7.27.5": + version "7.27.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.5.tgz#ed22f871f110aa285a6fd934a0efed621d118826" + integrity sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg== + dependencies: + "@babel/types" "^7.27.3" + +"@babel/parser@^7.28.6", "@babel/parser@^7.29.0": + version "7.29.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.3.tgz#116f70a77958307fceac27747573032f8a62f88e" + integrity sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA== + dependencies: + "@babel/types" "^7.29.0" + +"@babel/parser@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.7.tgz#837b87387cbf5ec5530cb634b3c622f68edb9334" + integrity sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg== + dependencies: + "@babel/types" "^7.29.7" + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz#61dd8a8e61f7eb568268d1b5f129da3eee364bf9" + integrity sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/traverse" "^7.27.1" + +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz#43f70a6d7efd52370eefbdf55ae03d91b293856d" + integrity sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz#beb623bd573b8b6f3047bd04c32506adc3e58a72" + integrity sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz#e134a5479eb2ba9c02714e8c1ebf1ec9076124fd" + integrity sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/plugin-transform-optional-chaining" "^7.27.1" + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz#bb1c25af34d75115ce229a1de7fa44bf8f955670" + integrity sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/traverse" "^7.27.1" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-import-assertions@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz#88894aefd2b03b5ee6ad1562a7c8e1587496aecd" + integrity sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-syntax-import-attributes@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz#34c017d54496f9b11b61474e7ea3dfd5563ffe07" + integrity sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-syntax-jsx@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz#2f9beb5eff30fa507c5532d107daac7b888fa34c" + integrity sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-syntax-typescript@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz#5147d29066a793450f220c63fa3a9431b7e6dd18" + integrity sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz#6e2061067ba3ab0266d834a9f94811196f2aba9a" + integrity sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-async-generator-functions@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz#ca433df983d68e1375398e7ca71bf2a4f6fd89d7" + integrity sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-remap-async-to-generator" "^7.27.1" + "@babel/traverse" "^7.27.1" + +"@babel/plugin-transform-async-to-generator@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz#9a93893b9379b39466c74474f55af03de78c66e7" + integrity sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA== + dependencies: + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-remap-async-to-generator" "^7.27.1" + +"@babel/plugin-transform-block-scoped-functions@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz#558a9d6e24cf72802dd3b62a4b51e0d62c0f57f9" + integrity sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-block-scoping@^7.27.1": + version "7.27.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.5.tgz#98c37485d815533623d992fd149af3e7b3140157" + integrity sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-class-properties@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz#dd40a6a370dfd49d32362ae206ddaf2bb082a925" + integrity sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-class-static-block@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz#7e920d5625b25bbccd3061aefbcc05805ed56ce4" + integrity sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-classes@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz#03bb04bea2c7b2f711f0db7304a8da46a85cced4" + integrity sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-compilation-targets" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-replace-supers" "^7.27.1" + "@babel/traverse" "^7.27.1" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz#81662e78bf5e734a97982c2b7f0a793288ef3caa" + integrity sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/template" "^7.27.1" + +"@babel/plugin-transform-destructuring@^7.27.1", "@babel/plugin-transform-destructuring@^7.27.3": + version "7.27.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.3.tgz#3cc8299ed798d9a909f8d66ddeb40849ec32e3b0" + integrity sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-dotall-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz#aa6821de864c528b1fecf286f0a174e38e826f4d" + integrity sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-duplicate-keys@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz#f1fbf628ece18e12e7b32b175940e68358f546d1" + integrity sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz#5043854ca620a94149372e69030ff8cb6a9eb0ec" + integrity sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-dynamic-import@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz#4c78f35552ac0e06aa1f6e3c573d67695e8af5a4" + integrity sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-exponentiation-operator@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz#fc497b12d8277e559747f5a3ed868dd8064f83e1" + integrity sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-export-namespace-from@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz#71ca69d3471edd6daa711cf4dfc3400415df9c23" + integrity sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-for-of@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz#bc24f7080e9ff721b63a70ac7b2564ca15b6c40a" + integrity sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + +"@babel/plugin-transform-function-name@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz#4d0bf307720e4dce6d7c30fcb1fd6ca77bdeb3a7" + integrity sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ== + dependencies: + "@babel/helper-compilation-targets" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/traverse" "^7.27.1" + +"@babel/plugin-transform-json-strings@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz#a2e0ce6ef256376bd527f290da023983527a4f4c" + integrity sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-literals@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz#baaefa4d10a1d4206f9dcdda50d7d5827bb70b24" + integrity sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-logical-assignment-operators@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz#890cb20e0270e0e5bebe3f025b434841c32d5baa" + integrity sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-member-expression-literals@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz#37b88ba594d852418e99536f5612f795f23aeaf9" + integrity sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-modules-amd@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz#a4145f9d87c2291fe2d05f994b65dba4e3e7196f" + integrity sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA== + dependencies: + "@babel/helper-module-transforms" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-modules-commonjs@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz#8e44ed37c2787ecc23bdc367f49977476614e832" + integrity sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw== + dependencies: + "@babel/helper-module-transforms" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-modules-systemjs@^7.27.1": + version "7.29.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.4.tgz#f621105da99919c15cf4bde6fcc7346ef95e7b20" + integrity sha512-N7QmZ0xRZfjHOfZeQLJjwgX2zS9pdGHSVl/cjSGlo4dXMqvurfxXDMKY4RqEKzPozV78VMcd0lxyG13mlbKc4w== + dependencies: + "@babel/helper-module-transforms" "^7.28.6" + "@babel/helper-plugin-utils" "^7.28.6" + "@babel/helper-validator-identifier" "^7.28.5" + "@babel/traverse" "^7.29.0" + +"@babel/plugin-transform-modules-umd@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz#63f2cf4f6dc15debc12f694e44714863d34cd334" + integrity sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w== + dependencies: + "@babel/helper-module-transforms" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz#f32b8f7818d8fc0cc46ee20a8ef75f071af976e1" + integrity sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-new-target@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz#259c43939728cad1706ac17351b7e6a7bea1abeb" + integrity sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz#4f9d3153bf6782d73dd42785a9d22d03197bc91d" + integrity sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-numeric-separator@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz#614e0b15cc800e5997dadd9bd6ea524ed6c819c6" + integrity sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-object-rest-spread@^7.27.2": + version "7.27.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.3.tgz#ce130aa73fef828bc3e3e835f9bc6144be3eb1c0" + integrity sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q== + dependencies: + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-destructuring" "^7.27.3" + "@babel/plugin-transform-parameters" "^7.27.1" + +"@babel/plugin-transform-object-super@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz#1c932cd27bf3874c43a5cac4f43ebf970c9871b5" + integrity sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-replace-supers" "^7.27.1" + +"@babel/plugin-transform-optional-catch-binding@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz#84c7341ebde35ccd36b137e9e45866825072a30c" + integrity sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-optional-chaining@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz#874ce3c4f06b7780592e946026eb76a32830454f" + integrity sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + +"@babel/plugin-transform-parameters@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz#80334b54b9b1ac5244155a0c8304a187a618d5a7" + integrity sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-private-methods@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz#fdacbab1c5ed81ec70dfdbb8b213d65da148b6af" + integrity sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-private-property-in-object@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz#4dbbef283b5b2f01a21e81e299f76e35f900fb11" + integrity sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-create-class-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-property-literals@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz#07eafd618800591e88073a0af1b940d9a42c6424" + integrity sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-react-constant-elements@^7.21.3": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz#6c6b50424e749a6e48afd14cf7b92f98cb9383f9" + integrity sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-react-display-name@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.27.1.tgz#43af31362d71f7848cfac0cbc212882b1a16e80f" + integrity sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-react-jsx-development@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz#47ff95940e20a3a70e68ad3d4fcb657b647f6c98" + integrity sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.27.1" + +"@babel/plugin-transform-react-jsx@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz#1023bc94b78b0a2d68c82b5e96aed573bcfb9db0" + integrity sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-syntax-jsx" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/plugin-transform-react-pure-annotations@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz#339f1ce355eae242e0649f232b1c68907c02e879" + integrity sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-regenerator@^7.27.1": + version "7.27.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.5.tgz#0c01f4e0e4cced15f68ee14b9c76dac9813850c7" + integrity sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-regexp-modifiers@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz#df9ba5577c974e3f1449888b70b76169998a6d09" + integrity sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-reserved-words@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz#40fba4878ccbd1c56605a4479a3a891ac0274bb4" + integrity sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-runtime@^7.25.9": + version "7.27.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.27.4.tgz#dee5c5db6543313d1ae1b4b1ec122ff1e77352b9" + integrity sha512-D68nR5zxU64EUzV8i7T3R5XP0Xhrou/amNnddsRQssx6GrTLdZl1rLxyjtVZBd+v/NVX4AbTPOB5aU8thAZV1A== + dependencies: + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.11.0" + babel-plugin-polyfill-regenerator "^0.6.1" + semver "^6.3.1" + +"@babel/plugin-transform-shorthand-properties@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz#532abdacdec87bfee1e0ef8e2fcdee543fe32b90" + integrity sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-spread@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz#1a264d5fc12750918f50e3fe3e24e437178abb08" + integrity sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + +"@babel/plugin-transform-sticky-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz#18984935d9d2296843a491d78a014939f7dcd280" + integrity sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-template-literals@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz#1a0eb35d8bb3e6efc06c9fd40eb0bcef548328b8" + integrity sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-typeof-symbol@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz#70e966bb492e03509cf37eafa6dcc3051f844369" + integrity sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-typescript@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.1.tgz#d3bb65598bece03f773111e88cc4e8e5070f1140" + integrity sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-create-class-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/plugin-syntax-typescript" "^7.27.1" + +"@babel/plugin-transform-unicode-escapes@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz#3e3143f8438aef842de28816ece58780190cf806" + integrity sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-unicode-property-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz#bdfe2d3170c78c5691a3c3be934c8c0087525956" + integrity sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-unicode-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz#25948f5c395db15f609028e370667ed8bae9af97" + integrity sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-unicode-sets-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz#6ab706d10f801b5c72da8bb2548561fa04193cd1" + integrity sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/preset-env@^7.20.2", "@babel/preset-env@^7.25.9": + version "7.27.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.27.2.tgz#106e6bfad92b591b1f6f76fd4cf13b7725a7bf9a" + integrity sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ== + dependencies: + "@babel/compat-data" "^7.27.2" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-validator-option" "^7.27.1" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.27.1" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.27.1" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.27.1" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.27.1" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.27.1" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-import-assertions" "^7.27.1" + "@babel/plugin-syntax-import-attributes" "^7.27.1" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.27.1" + "@babel/plugin-transform-async-generator-functions" "^7.27.1" + "@babel/plugin-transform-async-to-generator" "^7.27.1" + "@babel/plugin-transform-block-scoped-functions" "^7.27.1" + "@babel/plugin-transform-block-scoping" "^7.27.1" + "@babel/plugin-transform-class-properties" "^7.27.1" + "@babel/plugin-transform-class-static-block" "^7.27.1" + "@babel/plugin-transform-classes" "^7.27.1" + "@babel/plugin-transform-computed-properties" "^7.27.1" + "@babel/plugin-transform-destructuring" "^7.27.1" + "@babel/plugin-transform-dotall-regex" "^7.27.1" + "@babel/plugin-transform-duplicate-keys" "^7.27.1" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.27.1" + "@babel/plugin-transform-dynamic-import" "^7.27.1" + "@babel/plugin-transform-exponentiation-operator" "^7.27.1" + "@babel/plugin-transform-export-namespace-from" "^7.27.1" + "@babel/plugin-transform-for-of" "^7.27.1" + "@babel/plugin-transform-function-name" "^7.27.1" + "@babel/plugin-transform-json-strings" "^7.27.1" + "@babel/plugin-transform-literals" "^7.27.1" + "@babel/plugin-transform-logical-assignment-operators" "^7.27.1" + "@babel/plugin-transform-member-expression-literals" "^7.27.1" + "@babel/plugin-transform-modules-amd" "^7.27.1" + "@babel/plugin-transform-modules-commonjs" "^7.27.1" + "@babel/plugin-transform-modules-systemjs" "^7.27.1" + "@babel/plugin-transform-modules-umd" "^7.27.1" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.27.1" + "@babel/plugin-transform-new-target" "^7.27.1" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.27.1" + "@babel/plugin-transform-numeric-separator" "^7.27.1" + "@babel/plugin-transform-object-rest-spread" "^7.27.2" + "@babel/plugin-transform-object-super" "^7.27.1" + "@babel/plugin-transform-optional-catch-binding" "^7.27.1" + "@babel/plugin-transform-optional-chaining" "^7.27.1" + "@babel/plugin-transform-parameters" "^7.27.1" + "@babel/plugin-transform-private-methods" "^7.27.1" + "@babel/plugin-transform-private-property-in-object" "^7.27.1" + "@babel/plugin-transform-property-literals" "^7.27.1" + "@babel/plugin-transform-regenerator" "^7.27.1" + "@babel/plugin-transform-regexp-modifiers" "^7.27.1" + "@babel/plugin-transform-reserved-words" "^7.27.1" + "@babel/plugin-transform-shorthand-properties" "^7.27.1" + "@babel/plugin-transform-spread" "^7.27.1" + "@babel/plugin-transform-sticky-regex" "^7.27.1" + "@babel/plugin-transform-template-literals" "^7.27.1" + "@babel/plugin-transform-typeof-symbol" "^7.27.1" + "@babel/plugin-transform-unicode-escapes" "^7.27.1" + "@babel/plugin-transform-unicode-property-regex" "^7.27.1" + "@babel/plugin-transform-unicode-regex" "^7.27.1" + "@babel/plugin-transform-unicode-sets-regex" "^7.27.1" + "@babel/preset-modules" "0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.11.0" + babel-plugin-polyfill-regenerator "^0.6.1" + core-js-compat "^3.40.0" + semver "^6.3.1" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.18.6", "@babel/preset-react@^7.25.9": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.27.1.tgz#86ea0a5ca3984663f744be2fd26cb6747c3fd0ec" + integrity sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-validator-option" "^7.27.1" + "@babel/plugin-transform-react-display-name" "^7.27.1" + "@babel/plugin-transform-react-jsx" "^7.27.1" + "@babel/plugin-transform-react-jsx-development" "^7.27.1" + "@babel/plugin-transform-react-pure-annotations" "^7.27.1" + +"@babel/preset-typescript@^7.21.0", "@babel/preset-typescript@^7.25.9": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz#190742a6428d282306648a55b0529b561484f912" + integrity sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-validator-option" "^7.27.1" + "@babel/plugin-syntax-jsx" "^7.27.1" + "@babel/plugin-transform-modules-commonjs" "^7.27.1" + "@babel/plugin-transform-typescript" "^7.27.1" + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.25.9": + version "7.27.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.6.tgz#ec4070a04d76bae8ddbb10770ba55714a417b7c6" + integrity sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q== + +"@babel/template@^7.27.1", "@babel/template@^7.27.2": + version "7.27.2" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" + integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/parser" "^7.27.2" + "@babel/types" "^7.27.1" + +"@babel/template@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.28.6.tgz#0e7e56ecedb78aeef66ce7972b082fce76a23e57" + integrity sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ== + dependencies: + "@babel/code-frame" "^7.28.6" + "@babel/parser" "^7.28.6" + "@babel/types" "^7.28.6" + +"@babel/template@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.29.7.tgz#4d9d4004f645cdd304de958c725162784ecac700" + integrity sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/traverse@^7.25.9", "@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3": + version "7.27.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.27.4.tgz#b0045ac7023c8472c3d35effd7cc9ebd638da6ea" + integrity sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.27.3" + "@babel/parser" "^7.27.4" + "@babel/template" "^7.27.2" + "@babel/types" "^7.27.3" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/traverse@^7.28.6", "@babel/traverse@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a" + integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== + dependencies: + "@babel/code-frame" "^7.29.0" + "@babel/generator" "^7.29.0" + "@babel/helper-globals" "^7.28.0" + "@babel/parser" "^7.29.0" + "@babel/template" "^7.28.6" + "@babel/types" "^7.29.0" + debug "^4.3.1" + +"@babel/traverse@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.7.tgz#c47b07a41b95da0907d026b5dd894d98de7d2f2d" + integrity sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/generator" "^7.29.7" + "@babel/helper-globals" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/template" "^7.29.7" + "@babel/types" "^7.29.7" + debug "^4.3.1" + +"@babel/types@^7.21.3", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.4.4": + version "7.27.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.6.tgz#a434ca7add514d4e646c80f7375c0aa2befc5535" + integrity sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + +"@babel/types@^7.28.6", "@babel/types@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" + integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.28.5" + +"@babel/types@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.7.tgz#8005e31d82712ee7adaef6e23c63b71a62770a92" + integrity sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA== + dependencies: + "@babel/helper-string-parser" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@csstools/cascade-layer-name-parser@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz#43f962bebead0052a9fed1a2deeb11f85efcbc72" + integrity sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A== + +"@csstools/color-helpers@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@csstools/color-helpers/-/color-helpers-5.0.2.tgz#82592c9a7c2b83c293d9161894e2a6471feb97b8" + integrity sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA== + +"@csstools/css-calc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@csstools/css-calc/-/css-calc-2.1.4.tgz#8473f63e2fcd6e459838dd412401d5948f224c65" + integrity sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ== + +"@csstools/css-color-parser@^3.0.10": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@csstools/css-color-parser/-/css-color-parser-3.0.10.tgz#79fc68864dd43c3b6782d2b3828bc0fa9d085c10" + integrity sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg== + dependencies: + "@csstools/color-helpers" "^5.0.2" + "@csstools/css-calc" "^2.1.4" + +"@csstools/css-parser-algorithms@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz#5755370a9a29abaec5515b43c8b3f2cf9c2e3076" + integrity sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ== + +"@csstools/css-tokenizer@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz#333fedabc3fd1a8e5d0100013731cf19e6a8c5d3" + integrity sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw== + +"@csstools/media-query-list-parser@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz#7aec77bcb89c2da80ef207e73f474ef9e1b3cdf1" + integrity sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ== + +"@csstools/postcss-cascade-layers@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.1.tgz#9640313e64b5e39133de7e38a5aa7f40dc259597" + integrity sha512-XOfhI7GShVcKiKwmPAnWSqd2tBR0uxt+runAxttbSp/LY2U16yAVPmAf7e9q4JJ0d+xMNmpwNDLBXnmRCl3HMQ== + dependencies: + "@csstools/selector-specificity" "^5.0.0" + postcss-selector-parser "^7.0.0" + +"@csstools/postcss-color-function@^4.0.10": + version "4.0.10" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-4.0.10.tgz#11ad43a66ef2cc794ab826a07df8b5fa9fb47a3a" + integrity sha512-4dY0NBu7NVIpzxZRgh/Q/0GPSz/jLSw0i/u3LTUor0BkQcz/fNhN10mSWBDsL0p9nDb0Ky1PD6/dcGbhACuFTQ== + dependencies: + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-color-mix-function@^3.0.10": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.10.tgz#8c9d0ccfae5c45a9870dd84807ea2995c7a3a514" + integrity sha512-P0lIbQW9I4ShE7uBgZRib/lMTf9XMjJkFl/d6w4EMNHu2qvQ6zljJGEcBkw/NsBtq/6q3WrmgxSS8kHtPMkK4Q== + dependencies: + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-color-mix-variadic-function-arguments@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.0.tgz#0b29cb9b4630d7ed68549db265662d41554a17ed" + integrity sha512-Z5WhouTyD74dPFPrVE7KydgNS9VvnjB8qcdes9ARpCOItb4jTnm7cHp4FhxCRUoyhabD0WVv43wbkJ4p8hLAlQ== + dependencies: + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-content-alt-text@^2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.6.tgz#548862226eac54bab0ee5f1bf3a9981393ab204b" + integrity sha512-eRjLbOjblXq+byyaedQRSrAejKGNAFued+LcbzT+LCL78fabxHkxYjBbxkroONxHHYu2qxhFK2dBStTLPG3jpQ== + dependencies: + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-exponential-functions@^2.0.9": + version "2.0.9" + resolved "https://registry.yarnpkg.com/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz#fc03d1272888cb77e64cc1a7d8a33016e4f05c69" + integrity sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw== + dependencies: + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + +"@csstools/postcss-font-format-keywords@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz#6730836eb0153ff4f3840416cc2322f129c086e6" + integrity sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw== + dependencies: + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-gamut-mapping@^2.0.10": + version "2.0.10" + resolved "https://registry.yarnpkg.com/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.10.tgz#f518d941231d721dbecf5b41e3c441885ff2f28b" + integrity sha512-QDGqhJlvFnDlaPAfCYPsnwVA6ze+8hhrwevYWlnUeSjkkZfBpcCO42SaUD8jiLlq7niouyLgvup5lh+f1qessg== + dependencies: + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + +"@csstools/postcss-gradients-interpolation-method@^5.0.10": + version "5.0.10" + resolved "https://registry.yarnpkg.com/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.10.tgz#3146da352c31142a721fdba062ac3a6d11dbbec3" + integrity sha512-HHPauB2k7Oits02tKFUeVFEU2ox/H3OQVrP3fSOKDxvloOikSal+3dzlyTZmYsb9FlY9p5EUpBtz0//XBmy+aw== + dependencies: + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-hwb-function@^4.0.10": + version "4.0.10" + resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.10.tgz#f93f3c457e6440ac37ef9b908feb5d901b417d50" + integrity sha512-nOKKfp14SWcdEQ++S9/4TgRKchooLZL0TUFdun3nI4KPwCjETmhjta1QT4ICQcGVWQTvrsgMM/aLB5We+kMHhQ== + dependencies: + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-ic-unit@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.2.tgz#7561e09db65fac8304ceeab9dd3e5c6e43414587" + integrity sha512-lrK2jjyZwh7DbxaNnIUjkeDmU8Y6KyzRBk91ZkI5h8nb1ykEfZrtIVArdIjX4DHMIBGpdHrgP0n4qXDr7OHaKA== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-initial@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz#c385bd9d8ad31ad159edd7992069e97ceea4d09a" + integrity sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg== + +"@csstools/postcss-is-pseudo-class@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.1.tgz#12041448fedf01090dd4626022c28b7f7623f58e" + integrity sha512-JLp3POui4S1auhDR0n8wHd/zTOWmMsmK3nQd3hhL6FhWPaox5W7j1se6zXOG/aP07wV2ww0lxbKYGwbBszOtfQ== + dependencies: + "@csstools/selector-specificity" "^5.0.0" + postcss-selector-parser "^7.0.0" + +"@csstools/postcss-light-dark-function@^2.0.9": + version "2.0.9" + resolved "https://registry.yarnpkg.com/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.9.tgz#9fb080188907539734a9d5311d2a1cb82531ef38" + integrity sha512-1tCZH5bla0EAkFAI2r0H33CDnIBeLUaJh1p+hvvsylJ4svsv2wOmJjJn+OXwUZLXef37GYbRIVKX+X+g6m+3CQ== + dependencies: + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-logical-float-and-clear@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz#62617564182cf86ab5d4e7485433ad91e4c58571" + integrity sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ== + +"@csstools/postcss-logical-overflow@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz#c6de7c5f04e3d4233731a847f6c62819bcbcfa1d" + integrity sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA== + +"@csstools/postcss-logical-overscroll-behavior@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz#43c03eaecdf34055ef53bfab691db6dc97a53d37" + integrity sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w== + +"@csstools/postcss-logical-resize@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz#4df0eeb1a61d7bd85395e56a5cce350b5dbfdca6" + integrity sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-logical-viewport-units@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz#016d98a8b7b5f969e58eb8413447eb801add16fc" + integrity sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ== + dependencies: + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-media-minmax@^2.0.9": + version "2.0.9" + resolved "https://registry.yarnpkg.com/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz#184252d5b93155ae526689328af6bdf3fc113987" + integrity sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig== + dependencies: + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/media-query-list-parser" "^4.0.3" + +"@csstools/postcss-media-queries-aspect-ratio-number-values@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz#f485c31ec13d6b0fb5c528a3474334a40eff5f11" + integrity sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg== + dependencies: + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/media-query-list-parser" "^4.0.3" + +"@csstools/postcss-nested-calc@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz#754e10edc6958d664c11cde917f44ba144141c62" + integrity sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A== + dependencies: + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-normalize-display-values@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.0.tgz#ecdde2daf4e192e5da0c6fd933b6d8aff32f2a36" + integrity sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-oklab-function@^4.0.10": + version "4.0.10" + resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.10.tgz#d4c23c51dd0be45e6dedde22432d7d0003710780" + integrity sha512-ZzZUTDd0fgNdhv8UUjGCtObPD8LYxMH+MJsW9xlZaWTV8Ppr4PtxlHYNMmF4vVWGl0T6f8tyWAKjoI6vePSgAg== + dependencies: + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-progressive-custom-properties@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.1.0.tgz#70c8d41b577f4023633b7e3791604e0b7f3775bc" + integrity sha512-YrkI9dx8U4R8Sz2EJaoeD9fI7s7kmeEBfmO+UURNeL6lQI7VxF6sBE+rSqdCBn4onwqmxFdBU3lTwyYb/lCmxA== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-random-function@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz#3191f32fe72936e361dadf7dbfb55a0209e2691e" + integrity sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w== + dependencies: + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + +"@csstools/postcss-relative-color-syntax@^3.0.10": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.10.tgz#daa840583969461e1e06b12e9c591e52a790ec86" + integrity sha512-8+0kQbQGg9yYG8hv0dtEpOMLwB9M+P7PhacgIzVzJpixxV4Eq9AUQtQw8adMmAJU1RBBmIlpmtmm3XTRd/T00g== + dependencies: + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-scope-pseudo-class@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz#9fe60e9d6d91d58fb5fc6c768a40f6e47e89a235" + integrity sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q== + dependencies: + postcss-selector-parser "^7.0.0" + +"@csstools/postcss-sign-functions@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz#a9ac56954014ae4c513475b3f1b3e3424a1e0c12" + integrity sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg== + dependencies: + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + +"@csstools/postcss-stepped-value-functions@^4.0.9": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz#36036f1a0e5e5ee2308e72f3c9cb433567c387b9" + integrity sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA== + dependencies: + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + +"@csstools/postcss-text-decoration-shorthand@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.2.tgz#a3bcf80492e6dda36477538ab8e8943908c9f80a" + integrity sha512-8XvCRrFNseBSAGxeaVTaNijAu+FzUvjwFXtcrynmazGb/9WUdsPCpBX+mHEHShVRq47Gy4peYAoxYs8ltUnmzA== + dependencies: + "@csstools/color-helpers" "^5.0.2" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-trigonometric-functions@^4.0.9": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz#3f94ed2e319b57f2c59720b64e4d0a8a6fb8c3b2" + integrity sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A== + dependencies: + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + +"@csstools/postcss-unset-value@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz#7caa981a34196d06a737754864baf77d64de4bba" + integrity sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA== + +"@csstools/selector-resolve-nested@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz#848c6f44cb65e3733e478319b9342b7aa436fac7" + integrity sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g== + +"@csstools/selector-specificity@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz#037817b574262134cabd68fc4ec1a454f168407b" + integrity sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw== + +"@csstools/utilities@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@csstools/utilities/-/utilities-2.0.0.tgz#f7ff0fee38c9ffb5646d47b6906e0bc8868bde60" + integrity sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ== + +"@discoveryjs/json-ext@0.5.7": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@docsearch/core@4.6.2": + version "4.6.2" + resolved "https://registry.yarnpkg.com/@docsearch/core/-/core-4.6.2.tgz#0a6fdc13b1eb12153cb19316f911479b67f7bd58" + integrity sha512-/S0e6Dj7Zcm8m9Rru49YEX49dhU11be68c+S/BCyN8zQsTTgkKzXlhRbVL5mV6lOLC2+ZRRryaTdcm070Ug2oA== + +"@docsearch/css@4.6.2": + version "4.6.2" + resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-4.6.2.tgz#986776619dccbf798176c75e858cc22f5e710bb4" + integrity sha512-fH/cn8BjEEdM2nJdjNMHIvOVYupG6AIDtFVDgIZrNzdCSj4KXr9kd+hsehqsNGYjpUjObeKYKvgy/IwCb1jZYQ== + +"@docsearch/react@^3.9.0 || ^4.3.2": + version "4.6.2" + resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-4.6.2.tgz#e6c65fb87fb943eefaa936debe6d31bb51b25056" + integrity sha512-/BbtGFtqVOGwZx0dw/UfhN/0/DmMQYnulY4iv0tPRhC2JCXv0ka/+izwt3Jzo1ZxXS/2eMvv9zHsBJOK1I9f/w== + dependencies: + "@algolia/autocomplete-core" "1.19.2" + "@docsearch/core" "4.6.2" + "@docsearch/css" "4.6.2" + +"@docusaurus/babel@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/babel/-/babel-3.10.2.tgz#4d5f8ac4d16bfe26c06f256687831787edb46e8a" + integrity sha512-aJ1hpGyvfkte3dDAfNbWM4biW4yWZBVz7TIGLZP+v+tWOBgxX3e0N5ZIXHIvmfNNXTI77pcHUx3KmtOk05Ze3Q== + dependencies: + "@babel/core" "^7.25.9" + "@babel/generator" "^7.25.9" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-runtime" "^7.25.9" + "@babel/preset-env" "^7.25.9" + "@babel/preset-react" "^7.25.9" + "@babel/preset-typescript" "^7.25.9" + "@babel/runtime" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@docusaurus/logger" "3.10.2" + "@docusaurus/utils" "3.10.2" + babel-plugin-dynamic-import-node "^2.3.3" + fs-extra "^11.1.1" + tslib "^2.6.0" + +"@docusaurus/bundler@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/bundler/-/bundler-3.10.2.tgz#323492eb0550b6a7f6e5fa6b9877cdb2c53b1be3" + integrity sha512-i0ZNcy0f0WhaOlYVgzLsWhIoEXO9kS3HRoKPtgE6vQtZUq7arKZaYdNBudr3mqCmd+TyOkwtwfHgs1ENj07r5g== + dependencies: + "@babel/core" "^7.25.9" + "@docusaurus/babel" "3.10.2" + "@docusaurus/cssnano-preset" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + babel-loader "^9.2.1" + clean-css "^5.3.3" + copy-webpack-plugin "^11.0.0" + css-loader "^6.11.0" + css-minimizer-webpack-plugin "^5.0.1" + cssnano "^6.1.2" + file-loader "^6.2.0" + html-minifier-terser "^7.2.0" + mini-css-extract-plugin "^2.9.2" + null-loader "^4.0.1" + postcss "^8.5.4" + postcss-loader "^7.3.4" + postcss-preset-env "^10.2.1" + terser-webpack-plugin "^5.3.9" + tslib "^2.6.0" + url-loader "^4.1.1" + webpack "^5.95.0" + webpackbar "^7.0.0" + +"@docusaurus/core@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-3.10.2.tgz#349cae728fc3769b3f8aef4cf538ccb79aace8d0" + integrity sha512-EYByj6nk+aD9KeVxV6Hmo2/nAAT79P21Y82ycTBOBtrmqilloIbIEhgL2/8Xpt2Jz/pgNqHAwyusOGwmbKeJmA== + dependencies: + "@docusaurus/babel" "3.10.2" + "@docusaurus/bundler" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/mdx-loader" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + boxen "^6.2.1" + chalk "^4.1.2" + chokidar "^3.5.3" + cli-table3 "^0.6.3" + combine-promises "^1.1.0" + commander "^5.1.0" + core-js "^3.31.1" + detect-port "^2.1.0" + escape-html "^1.0.3" + eta "^2.2.0" + eval "^0.1.8" + execa "^5.1.1" + fs-extra "^11.1.1" + html-tags "^3.3.1" + html-webpack-plugin "^5.6.0" + leven "^3.1.0" + lodash "^4.17.21" + open "^8.4.0" + p-map "^4.0.0" + prompts "^2.4.2" + react-helmet-async "npm:@slorber/react-helmet-async@1.3.0" + react-loadable "npm:@docusaurus/react-loadable@6.0.0" + react-loadable-ssr-addon-v5-slorber "^1.0.3" + react-router "^5.3.4" + react-router-config "^5.1.1" + react-router-dom "^5.3.4" + semver "^7.5.4" + serve-handler "^6.1.7" + tinypool "^1.0.2" + tslib "^2.6.0" + update-notifier "^6.0.2" + webpack "^5.95.0" + webpack-bundle-analyzer "^4.10.2" + webpack-dev-server "^5.2.2" + webpack-merge "^6.0.1" + +"@docusaurus/cssnano-preset@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-3.10.2.tgz#e3ac7e85585f77e8fdef95176ab7c211d1296630" + integrity sha512-4gCnHRbJLTloiwfvFAa92tgb2gI4KYhvjfQVYnEaiMO/EgvWfCo1LwytHXen+1oZAN0VAlS0JAPxp3MsvKDa3A== + dependencies: + cssnano-preset-advanced "^6.1.2" + postcss "^8.5.4" + postcss-sort-media-queries "^5.2.0" + tslib "^2.6.0" + +"@docusaurus/logger@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-3.10.2.tgz#280bed53d0eb9cdc56e896a155036207910e89c9" + integrity sha512-gSEwqtPfCAnC3ZSJY6xL7tcIfgg0vFD39jbv93eakuweyvO2864xR0K+kmKwBhkTCtWRNjuGGnb5rdmkD/ndqw== + dependencies: + chalk "^4.1.2" + tslib "^2.6.0" + +"@docusaurus/mdx-loader@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-3.10.2.tgz#3b4e7ffacff4ed856db2ec4e94c13b0a652d62eb" + integrity sha512-9Fd4V/SFjfrVQ0JH5EN0+iPWyFunvTeQE3gfyFeetqPaXMP0OylIjOw16dCuXG4NZJrYdBqwzjh18/h3gRi47w== + dependencies: + "@docusaurus/logger" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + "@mdx-js/mdx" "^3.0.0" + "@slorber/remark-comment" "^1.0.0" + escape-html "^1.0.3" + estree-util-value-to-estree "^3.0.1" + file-loader "^6.2.0" + fs-extra "^11.1.1" + image-size "^2.0.2" + mdast-util-mdx "^3.0.0" + mdast-util-to-string "^4.0.0" + rehype-raw "^7.0.0" + remark-directive "^3.0.0" + remark-emoji "^4.0.0" + remark-frontmatter "^5.0.0" + remark-gfm "^4.0.0" + stringify-object "^3.3.0" + tslib "^2.6.0" + unified "^11.0.3" + unist-util-visit "^5.0.0" + url-loader "^4.1.1" + vfile "^6.0.1" + webpack "^5.88.1" + +"@docusaurus/module-type-aliases@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-3.10.2.tgz#7c3b940c77d72e71d33a1e76f0e003b418e6163a" + integrity sha512-h/I5e4jaAhDHW4vaLENi1i2hnOEnXY1t9R+nnRTbgUl7ymVRzN/HF7dDfj8rKYGj8gfIge+Ef+iYRAMtbGvsrQ== + dependencies: + "@docusaurus/types" "3.10.2" + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router-config" "*" + "@types/react-router-dom" "*" + react-helmet-async "npm:@slorber/react-helmet-async@1.3.0" + react-loadable "npm:@docusaurus/react-loadable@6.0.0" + +"@docusaurus/plugin-client-redirects@^3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.10.2.tgz#55023f8538baf7e66ec33c49ab65879c74fd93cd" + integrity sha512-z5I5ttCXw+8y2gHVZvqAMmUw4Rb0ZzKA5eCPk87SfM/jCKOTvE24yDpPAwwipvug96ij7mOwEHXWw8G4LlWdGA== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + eta "^2.2.0" + fs-extra "^11.1.1" + lodash "^4.17.21" + tslib "^2.6.0" + +"@docusaurus/plugin-content-blog@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.10.2.tgz#2374886ec3d76e8f014e85db8c3c010de6c419be" + integrity sha512-0cbEnNKf0InmLkhj/+nVRmqEnWEoOE8Mh+2x1qOXI0qYpCnphq4RXknVJ8BvybKRXqYVvbmdMfiJSup+k4tm5w== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/mdx-loader" "3.10.2" + "@docusaurus/theme-common" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + cheerio "1.0.0-rc.12" + combine-promises "^1.1.0" + feed "^4.2.2" + fs-extra "^11.1.1" + lodash "^4.17.21" + schema-dts "^1.1.2" + srcset "^4.0.0" + tslib "^2.6.0" + unist-util-visit "^5.0.0" + utility-types "^3.10.0" + webpack "^5.88.1" + +"@docusaurus/plugin-content-docs@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.10.2.tgz#249bbc806437f227b06410ecc771eb67d8910a9a" + integrity sha512-Sqwl4FPoZBDrlY8I2VU2H8O0M91CHp9T8ToMSkTZmjvHCif+1laqfXi6sTk8IfyVS/trN5yNjcWd1bFsGB6W5Q== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/mdx-loader" "3.10.2" + "@docusaurus/module-type-aliases" "3.10.2" + "@docusaurus/theme-common" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + "@types/react-router-config" "^5.0.7" + combine-promises "^1.1.0" + fs-extra "^11.1.1" + js-yaml "^4.1.0" + lodash "^4.17.21" + schema-dts "^1.1.2" + tslib "^2.6.0" + utility-types "^3.10.0" + webpack "^5.88.1" + +"@docusaurus/plugin-content-pages@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.10.2.tgz#377c11b36a6a5e0c0c14dd9dea799f986d662ed7" + integrity sha512-h5R12sZ/vV9EPiVjvIl9YFCOwkpwXes7dQMYt3EvP6Pphu4amHxxTqWxf08Fl5DR8h+oZMbWpFTNw5vKEYfvzQ== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/mdx-loader" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + fs-extra "^11.1.1" + tslib "^2.6.0" + webpack "^5.88.1" + +"@docusaurus/plugin-css-cascade-layers@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.10.2.tgz#54edc6450b0bb95be5990ea416b4c4dc5e6bdde0" + integrity sha512-UkdvQby5OQUKWrw3lLnSTJXQ6VETaUVTuPQX9AABtmFm5h+ifEBx1OQ+LN726Q4byuwBf2ElHkf4qU4hTxdvRg== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + tslib "^2.6.0" + +"@docusaurus/plugin-debug@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-3.10.2.tgz#2452f258668bb2514085d2d5fff700457c531aad" + integrity sha512-8vbZNOSCpnsT57EY6CgN7sgRVmx3KTYwO8Uvo2pbxOyb8tbqAwtT9SslqaQ41HbA1v1hpn5RP7u5s2KvRwAFpQ== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + fs-extra "^11.1.1" + react-json-view-lite "^2.3.0" + tslib "^2.6.0" + +"@docusaurus/plugin-google-analytics@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.10.2.tgz#7a0375c5a238cd9220166d9be8afc00ba508c55d" + integrity sha512-kMHMBK9j4VAtgd5owwrRLRIi0EjkrpXlX7ePj1+y68XfVZV9I1T4S+koPDm+Hfw2TtnyHvh0uNrDvjz+DjQGVA== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + tslib "^2.6.0" + +"@docusaurus/plugin-google-gtag@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.10.2.tgz#65df25eb5fb3f2a3f2d0fba8ddd423060e09e1ca" + integrity sha512-Vt90nNFhtAChRe9+it1hcHFgFvETdSnOkL5Bma+p6E/yU2tAYrvvyk+gv+LJGM2ZUkyKuKXLRsZ2Lb0bO7+Vog== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + tslib "^2.6.0" + +"@docusaurus/plugin-google-tag-manager@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.10.2.tgz#882a24e51dc42487d2c1d4f2cde3f59c99a276cb" + integrity sha512-MLCffCldysi/R0nzJQP7ZWd0xAoGNnSTiVOo6TTR6mKVGFhE+/XArGe67ZcaZv1uytgQXoXs92VJrgVDrz80rQ== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + tslib "^2.6.0" + +"@docusaurus/plugin-sitemap@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.10.2.tgz#6c662c7df3bb7d36887f8b73f54d85dc4d36371d" + integrity sha512-PODkwg5XetLML3hU/3xpCKJUZ9cqExLaBnD/Fzzwj2VHogLeqnDisLIujae87zuze7T4mCm2A6KEqZkyiz07EQ== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + fs-extra "^11.1.1" + sitemap "^7.1.1" + tslib "^2.6.0" + +"@docusaurus/plugin-svgr@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-svgr/-/plugin-svgr-3.10.2.tgz#916fd0a5d39bf73cb621de9789cce243a7ef1754" + integrity sha512-JgfT3jWM0TJ8Uw0cEcqxHpybngQY1vlBYpuuNO+gEh5iPh5Ar+vxq/u9CFrYsWeXy48BN7Db76Pzp2edNXUQ8A== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + "@svgr/core" "8.1.0" + "@svgr/webpack" "^8.1.0" + tslib "^2.6.0" + webpack "^5.88.1" + +"@docusaurus/preset-classic@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-3.10.2.tgz#e4419c811723ab913a946c63efcc15e7f5f60a0a" + integrity sha512-a4B3VczmDl99zK0EufDQYomdJ186WDingjmDXxhN2PNPS9Ty/Y2M5CLFX1KQMRKqRTLiRDKfutzG5IY1FC/ceg== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/plugin-content-blog" "3.10.2" + "@docusaurus/plugin-content-docs" "3.10.2" + "@docusaurus/plugin-content-pages" "3.10.2" + "@docusaurus/plugin-css-cascade-layers" "3.10.2" + "@docusaurus/plugin-debug" "3.10.2" + "@docusaurus/plugin-google-analytics" "3.10.2" + "@docusaurus/plugin-google-gtag" "3.10.2" + "@docusaurus/plugin-google-tag-manager" "3.10.2" + "@docusaurus/plugin-sitemap" "3.10.2" + "@docusaurus/plugin-svgr" "3.10.2" + "@docusaurus/theme-classic" "3.10.2" + "@docusaurus/theme-common" "3.10.2" + "@docusaurus/theme-search-algolia" "3.10.2" + "@docusaurus/types" "3.10.2" + +"@docusaurus/theme-classic@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-3.10.2.tgz#a64bd600c789b33c67c30c256b07e2ca0f57e2ae" + integrity sha512-JqTSLQmqmA9uKWZsD5iwBGJ4JyKB4/yTw6PsSXVPRJG/6GAm/u+add9Iip+hvwP12/AnPNztrdxsI14NJW4KeA== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/mdx-loader" "3.10.2" + "@docusaurus/module-type-aliases" "3.10.2" + "@docusaurus/plugin-content-blog" "3.10.2" + "@docusaurus/plugin-content-docs" "3.10.2" + "@docusaurus/plugin-content-pages" "3.10.2" + "@docusaurus/theme-common" "3.10.2" + "@docusaurus/theme-translations" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + "@mdx-js/react" "^3.0.0" + clsx "^2.0.0" + copy-text-to-clipboard "^3.2.0" + infima "0.2.0-alpha.45" + lodash "^4.17.21" + nprogress "^0.2.0" + postcss "^8.5.4" + prism-react-renderer "^2.3.0" + prismjs "^1.29.0" + react-router-dom "^5.3.4" + rtlcss "^4.1.0" + tslib "^2.6.0" + utility-types "^3.10.0" + +"@docusaurus/theme-common@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-3.10.2.tgz#5cf2a8b76554b8b38c6afe8448470c411f683e5b" + integrity sha512-R9b/vMpK1yye6hNZTA6x/ivRv+at6GhxnXcxkpzCGzO1R1RwiquqiFg2wMFh6aqlJTpWRFKpFD2TzCDQcyOU0A== + dependencies: + "@docusaurus/mdx-loader" "3.10.2" + "@docusaurus/module-type-aliases" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router-config" "*" + clsx "^2.0.0" + parse-numeric-range "^1.3.0" + prism-react-renderer "^2.3.0" + tslib "^2.6.0" + utility-types "^3.10.0" + +"@docusaurus/theme-search-algolia@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.10.2.tgz#e7756d4088a7df4d11fd734bfe0e8fa28ceac1dd" + integrity sha512-1msxllyhi/5m77JukXtp5UFnUAriwZIC1oJ7MTnpQpCwLTbclJi5BK5n28CTZuSXpQN2ewbbnqRgAhMM6c6ihg== + dependencies: + "@algolia/autocomplete-core" "^1.19.2" + "@docsearch/react" "^3.9.0 || ^4.3.2" + "@docusaurus/core" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/plugin-content-docs" "3.10.2" + "@docusaurus/theme-common" "3.10.2" + "@docusaurus/theme-translations" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + algoliasearch "^5.37.0" + algoliasearch-helper "^3.26.0" + clsx "^2.0.0" + eta "^2.2.0" + fs-extra "^11.1.1" + lodash "^4.17.21" + tslib "^2.6.0" + utility-types "^3.10.0" + +"@docusaurus/theme-translations@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-3.10.2.tgz#cd649083babd12df324e7129008aaccacd4cfb13" + integrity sha512-iv20wrxnyXkY89LM3TzRlzGlt5fIGO5UnaR6UL1ZVfB9RRFjxQFQ6awDrwAc6Km8Y5gD8pInuwYPF+6/TiCxXA== + dependencies: + fs-extra "^11.1.1" + tslib "^2.6.0" + +"@docusaurus/types@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-3.10.2.tgz#9ffe35adfb4587e49158ee9e10d94b86419a5932" + integrity sha512-B6rvfwIFSapUqUJjMriZswX13K8l5Z7AcmVE6uTEJpYddQieSTR12DsGaFtcZAIDsQd4p+0WTl0Vc6jmZK0Trw== + dependencies: + "@mdx-js/mdx" "^3.0.0" + "@types/history" "^4.7.11" + "@types/mdast" "^4.0.2" + "@types/react" "*" + commander "^5.1.0" + joi "^17.9.2" + react-helmet-async "npm:@slorber/react-helmet-async@1.3.0" + utility-types "^3.10.0" + webpack "^5.95.0" + webpack-merge "^5.9.0" + +"@docusaurus/utils-common@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-3.10.2.tgz#a65fcfffafa4e15a59fe61d7ba315ee5d4c49269" + integrity sha512-x3Dz6jv6iQKBNjBmVTu8p57abMp/VNTUgKBMgRVXJc5444orBTsArv0+cdfrXTiz/VMmHfDRVkPbL7GH2B7T7w== + dependencies: + "@docusaurus/types" "3.10.2" + tslib "^2.6.0" + +"@docusaurus/utils-validation@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-3.10.2.tgz#2624b0ca6675675da2f063828115b43c9a22de47" + integrity sha512-sn8unbDfUL585NtR3cwHefPicOyaHvPaX7VD0aOg/siIxUBoKyKKaGEqzJZDS64mM43TnxurkYDtmB1wsJlZsw== + dependencies: + "@docusaurus/logger" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" + fs-extra "^11.2.0" + joi "^17.9.2" + js-yaml "^4.1.0" + lodash "^4.17.21" + tslib "^2.6.0" + +"@docusaurus/utils@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-3.10.2.tgz#d99c1ffc5c7961e912344269a8728ce2aad8b3dc" + integrity sha512-xx0W3eav2uW1NRIpuHJWNwLTC15xPNjU4Uxi9NSnd3swYC96BE3vFiT93SD8s24kmAAWNwgZwfZ2fghGZ01Lcw== + dependencies: + "@11ty/gray-matter" "^1.0.0" + "@docusaurus/logger" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils-common" "3.10.2" + escape-string-regexp "^4.0.0" + execa "^5.1.1" + file-loader "^6.2.0" + fs-extra "^11.1.1" + github-slugger "^1.5.0" + globby "^11.1.0" + jiti "^1.20.0" + js-yaml "^4.1.0" + lodash "^4.17.21" + micromatch "^4.0.5" + p-queue "^6.6.2" + prompts "^2.4.2" + resolve-pathname "^3.0.0" + tslib "^2.6.0" + url-loader "^4.1.1" + utility-types "^3.10.0" + webpack "^5.88.1" + +"@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/topo@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.3.12": + version "0.3.13" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" + integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" + integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/remapping@^2.3.5": + version "2.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1" + integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/source-map@^0.3.3": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" + integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== + +"@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@jridgewell/trace-mapping@^0.3.28": + version "0.3.31" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" + integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@jsonjoy.com/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/base64/-/base64-1.1.2.tgz#cf8ea9dcb849b81c95f14fc0aaa151c6b54d2578" + integrity sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA== + +"@jsonjoy.com/buffers@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/buffers/-/buffers-1.0.0.tgz#ade6895b7d3883d70f87b5743efaa12c71dfef7a" + integrity sha512-NDigYR3PHqCnQLXYyoLbnEdzMMvzeiCWo1KOut7Q0CoIqg9tUAPKJ1iq/2nFhc5kZtexzutNY0LFjdwWL3Dw3Q== + +"@jsonjoy.com/codegen@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz#5c23f796c47675f166d23b948cdb889184b93207" + integrity sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g== + +"@jsonjoy.com/json-pack@^1.11.0": + version "1.14.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pack/-/json-pack-1.14.0.tgz#eda5255ccdaeafb3aa811ff1ae4814790b958b4f" + integrity sha512-LpWbYgVnKzphN5S6uss4M25jJ/9+m6q6UJoeN6zTkK4xAGhKsiBRPVeF7OYMWonn5repMQbE5vieRXcMUrKDKw== + dependencies: + "@jsonjoy.com/base64" "^1.1.2" + "@jsonjoy.com/buffers" "^1.0.0" + "@jsonjoy.com/codegen" "^1.0.0" + "@jsonjoy.com/json-pointer" "^1.0.1" + "@jsonjoy.com/util" "^1.9.0" + hyperdyperid "^1.2.0" + thingies "^2.5.0" + +"@jsonjoy.com/json-pointer@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz#049cb530ac24e84cba08590c5e36b431c4843408" + integrity sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg== + dependencies: + "@jsonjoy.com/codegen" "^1.0.0" + "@jsonjoy.com/util" "^1.9.0" + +"@jsonjoy.com/util@^1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/util/-/util-1.9.0.tgz#7ee95586aed0a766b746cd8d8363e336c3c47c46" + integrity sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ== + dependencies: + "@jsonjoy.com/buffers" "^1.0.0" + "@jsonjoy.com/codegen" "^1.0.0" + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" + integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== + +"@mdx-js/mdx@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-3.1.0.tgz#10235cab8ad7d356c262e8c21c68df5850a97dc3" + integrity sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw== + dependencies: + "@types/estree" "^1.0.0" + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdx" "^2.0.0" + collapse-white-space "^2.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + estree-util-scope "^1.0.0" + estree-walker "^3.0.0" + hast-util-to-jsx-runtime "^2.0.0" + markdown-extensions "^2.0.0" + recma-build-jsx "^1.0.0" + recma-jsx "^1.0.0" + recma-stringify "^1.0.0" + rehype-recma "^1.0.0" + remark-mdx "^3.0.0" + remark-parse "^11.0.0" + remark-rehype "^11.0.0" + source-map "^0.7.0" + unified "^11.0.0" + unist-util-position-from-estree "^2.0.0" + unist-util-stringify-position "^4.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + +"@mdx-js/react@^3.0.0", "@mdx-js/react@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-3.1.1.tgz#24bda7fffceb2fe256f954482123cda1be5f5fef" + integrity sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw== + dependencies: + "@types/mdx" "^2.0.0" + +"@noble/hashes@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@peculiar/asn1-cms@^2.6.0", "@peculiar/asn1-cms@^2.7.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-cms/-/asn1-cms-2.7.0.tgz#8e0eb656f4fc85f7c621dd442fa2d298faa84984" + integrity sha512-hew63shtzzvBcSHbhm+cyAmKe6AIfinT9hzEqSPjDC6opTTMKmTkQ0gHuN2KsWlvqiKw1S/fS94fhag/FJkioQ== + dependencies: + "@peculiar/asn1-schema" "^2.7.0" + "@peculiar/asn1-x509" "^2.7.0" + "@peculiar/asn1-x509-attr" "^2.7.0" + asn1js "^3.0.6" + tslib "^2.8.1" + +"@peculiar/asn1-csr@^2.6.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-csr/-/asn1-csr-2.7.0.tgz#1a03ac03f7571ea981f5d8377c6f4510c5d43411" + integrity sha512-VVsAyGqErT9D1SY4aEqozThXMVI+ssVRiv2DDeYuvpBKLIgZ3hYs3Ay3u/VSoKq6ESFi9cf6rf3IOOzfwh7oMA== + dependencies: + "@peculiar/asn1-schema" "^2.7.0" + "@peculiar/asn1-x509" "^2.7.0" + asn1js "^3.0.6" + tslib "^2.8.1" + +"@peculiar/asn1-ecc@^2.6.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-ecc/-/asn1-ecc-2.7.0.tgz#c35b57859812ecd0c2ae7b2144855e8208c2cfee" + integrity sha512-n7KEs/Q/wrB415cxy4fHOBhegp4NdJ15fkJPwcB/3/8iNBQC2L/N7SChJPKDJPZGYH0jD4Tg4/0vnHmwghnbKw== + dependencies: + "@peculiar/asn1-schema" "^2.7.0" + "@peculiar/asn1-x509" "^2.7.0" + asn1js "^3.0.6" + tslib "^2.8.1" + +"@peculiar/asn1-pfx@^2.7.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-pfx/-/asn1-pfx-2.7.0.tgz#d00766b13ff49785684a604248e6aadd184b291f" + integrity sha512-V/nrlQVmhg7lYAsM7E13UDL5erAwFv6kCIVFqNaMIHSVi7dngcT839JkRTkQBqznMG98l2XjxYk74ZztAohZzA== + dependencies: + "@peculiar/asn1-cms" "^2.7.0" + "@peculiar/asn1-pkcs8" "^2.7.0" + "@peculiar/asn1-rsa" "^2.7.0" + "@peculiar/asn1-schema" "^2.7.0" + asn1js "^3.0.6" + tslib "^2.8.1" + +"@peculiar/asn1-pkcs8@^2.7.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.7.0.tgz#5ee602d8a9a3e0a3f09f7b008ff644a657378692" + integrity sha512-9GTl1nE8Mx1kTZ+7QyYatDyKsm34QcWRBFkY1iPvWC3X4Dona5s/tlLiQsx5WzVdZqiMBZNYT0buyw4/vbhnjw== + dependencies: + "@peculiar/asn1-schema" "^2.7.0" + "@peculiar/asn1-x509" "^2.7.0" + asn1js "^3.0.6" + tslib "^2.8.1" + +"@peculiar/asn1-pkcs9@^2.6.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.7.0.tgz#23b4eae41c2feb8df258aa69c502a70092026b0a" + integrity sha512-Bh7m+OuIaSEllPQcSd9OSp93F4ROWH7sbITWV8MI+8dwsjE5111/87VxiWVvYFKyww3vp39geLv9ENqhwWHcew== + dependencies: + "@peculiar/asn1-cms" "^2.7.0" + "@peculiar/asn1-pfx" "^2.7.0" + "@peculiar/asn1-pkcs8" "^2.7.0" + "@peculiar/asn1-schema" "^2.7.0" + "@peculiar/asn1-x509" "^2.7.0" + "@peculiar/asn1-x509-attr" "^2.7.0" + asn1js "^3.0.6" + tslib "^2.8.1" + +"@peculiar/asn1-rsa@^2.6.0", "@peculiar/asn1-rsa@^2.7.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-rsa/-/asn1-rsa-2.7.0.tgz#6dc5c78c643264dd5a251a66f1dd9a38fcbba385" + integrity sha512-/qvENQrXyTZURjMqSeofHul0JJt2sNSzSwk36pl2olkHbaioMQgrASDZAlHXl0xUlnVbHj0uGgOrBMTb5x2aJQ== + dependencies: + "@peculiar/asn1-schema" "^2.7.0" + "@peculiar/asn1-x509" "^2.7.0" + asn1js "^3.0.6" + tslib "^2.8.1" + +"@peculiar/asn1-schema@^2.6.0", "@peculiar/asn1-schema@^2.7.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.7.0.tgz#f2dcb25995ce7cac8687ba1039f043e5eff43820" + integrity sha512-W8ZfWzLmQnrcky+eh3tni4IozMdqBDiHWU0N+vve/UGjMaUs8c0L7A2oEdkBXS8rTpWDpK/aoI3DG/L/hxmxPg== + dependencies: + "@peculiar/utils" "^2.0.2" + asn1js "^3.0.6" + tslib "^2.8.1" + +"@peculiar/asn1-x509-attr@^2.7.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.7.0.tgz#5ef2a10d3a78d4763b848a2cb56db4bb6b1e082a" + integrity sha512-NS8e7SOgXipkzUPLF/sce7ukpMpWjhxYsH0n6Y+bHYo4TTxOb95Zv7hqwSuL212mj5YxovjdOKQOgH1As3E94w== + dependencies: + "@peculiar/asn1-schema" "^2.7.0" + "@peculiar/asn1-x509" "^2.7.0" + asn1js "^3.0.6" + tslib "^2.8.1" + +"@peculiar/asn1-x509@^2.6.0", "@peculiar/asn1-x509@^2.7.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-x509/-/asn1-x509-2.7.0.tgz#84793efb7819dbc9526fd6b0a4ccd86f90464b96" + integrity sha512-mUn9RRrkGDnG4ALfunDmzyRW5dg+sWCj/pfnCCqEHYbkGxEpvUt6iVJv8Yw1cyp6SWZ26ZE5oSmI5SqEaen15g== + dependencies: + "@peculiar/asn1-schema" "^2.7.0" + "@peculiar/utils" "^2.0.2" + asn1js "^3.0.6" + tslib "^2.8.1" + +"@peculiar/utils@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@peculiar/utils/-/utils-2.0.3.tgz#a27ca4c4b73652e110f19a7d16d664f458a5528e" + integrity sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ== + dependencies: + tslib "^2.8.1" + +"@peculiar/x509@^1.14.2": + version "1.14.3" + resolved "https://registry.yarnpkg.com/@peculiar/x509/-/x509-1.14.3.tgz#2c44c2b89474346afec38a0c2803ec4fb8ce959e" + integrity sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA== + dependencies: + "@peculiar/asn1-cms" "^2.6.0" + "@peculiar/asn1-csr" "^2.6.0" + "@peculiar/asn1-ecc" "^2.6.0" + "@peculiar/asn1-pkcs9" "^2.6.0" + "@peculiar/asn1-rsa" "^2.6.0" + "@peculiar/asn1-schema" "^2.6.0" + "@peculiar/asn1-x509" "^2.6.0" + pvtsutils "^1.3.6" + reflect-metadata "^0.2.2" + tslib "^2.8.1" + tsyringe "^4.10.0" + +"@pnpm/config.env-replace@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz#ab29da53df41e8948a00f2433f085f54de8b3a4c" + integrity sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w== + +"@pnpm/network.ca-file@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz#2ab05e09c1af0cdf2fcf5035bea1484e222f7983" + integrity sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA== + dependencies: + graceful-fs "4.2.10" + +"@pnpm/npm-conf@^2.1.0": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz#bb375a571a0bd63ab0a23bece33033c683e9b6b0" + integrity sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw== + dependencies: + "@pnpm/config.env-replace" "^1.1.0" + "@pnpm/network.ca-file" "^1.0.1" + config-chain "^1.1.11" + +"@polka/url@^1.0.0-next.24": + version "1.0.0-next.29" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.29.tgz#5a40109a1ab5f84d6fd8fc928b19f367cbe7e7b1" + integrity sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww== + +"@sideway/address@^4.1.5": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.5.tgz#4bc149a0076623ced99ca8208ba780d65a99b9d5" + integrity sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@sindresorhus/is@^4.6.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" + integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== + +"@sindresorhus/is@^5.2.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.6.0.tgz#41dd6093d34652cddb5d5bdeee04eafc33826668" + integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== + +"@slorber/remark-comment@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@slorber/remark-comment/-/remark-comment-1.0.0.tgz#2a020b3f4579c89dec0361673206c28d67e08f5a" + integrity sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.1.0" + micromark-util-symbol "^1.0.1" + +"@svgr/babel-plugin-add-jsx-attribute@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz#4001f5d5dd87fa13303e36ee106e3ff3a7eb8b22" + integrity sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g== + +"@svgr/babel-plugin-remove-jsx-attribute@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz#69177f7937233caca3a1afb051906698f2f59186" + integrity sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA== + +"@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz#c2c48104cfd7dcd557f373b70a56e9e3bdae1d44" + integrity sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA== + +"@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz#8fbb6b2e91fa26ac5d4aa25c6b6e4f20f9c0ae27" + integrity sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ== + +"@svgr/babel-plugin-svg-dynamic-title@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz#1d5ba1d281363fc0f2f29a60d6d936f9bbc657b0" + integrity sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og== + +"@svgr/babel-plugin-svg-em-dimensions@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz#35e08df300ea8b1d41cb8f62309c241b0369e501" + integrity sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g== + +"@svgr/babel-plugin-transform-react-native-svg@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz#90a8b63998b688b284f255c6a5248abd5b28d754" + integrity sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q== + +"@svgr/babel-plugin-transform-svg-component@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz#013b4bfca88779711f0ed2739f3f7efcefcf4f7e" + integrity sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw== + +"@svgr/babel-preset@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-8.1.0.tgz#0e87119aecdf1c424840b9d4565b7137cabf9ece" + integrity sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "8.0.0" + "@svgr/babel-plugin-remove-jsx-attribute" "8.0.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "8.0.0" + "@svgr/babel-plugin-replace-jsx-attribute-value" "8.0.0" + "@svgr/babel-plugin-svg-dynamic-title" "8.0.0" + "@svgr/babel-plugin-svg-em-dimensions" "8.0.0" + "@svgr/babel-plugin-transform-react-native-svg" "8.1.0" + "@svgr/babel-plugin-transform-svg-component" "8.0.0" + +"@svgr/core@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-8.1.0.tgz#41146f9b40b1a10beaf5cc4f361a16a3c1885e88" + integrity sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA== + dependencies: + "@babel/core" "^7.21.3" + "@svgr/babel-preset" "8.1.0" + camelcase "^6.2.0" + cosmiconfig "^8.1.3" + snake-case "^3.0.4" + +"@svgr/hast-util-to-babel-ast@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz#6952fd9ce0f470e1aded293b792a2705faf4ffd4" + integrity sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q== + dependencies: + "@babel/types" "^7.21.3" + entities "^4.4.0" + +"@svgr/plugin-jsx@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz#96969f04a24b58b174ee4cd974c60475acbd6928" + integrity sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA== + dependencies: + "@babel/core" "^7.21.3" + "@svgr/babel-preset" "8.1.0" + "@svgr/hast-util-to-babel-ast" "8.0.0" + svg-parser "^2.0.4" + +"@svgr/plugin-svgo@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz#b115b7b967b564f89ac58feae89b88c3decd0f00" + integrity sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA== + dependencies: + cosmiconfig "^8.1.3" + deepmerge "^4.3.1" + svgo "^3.0.2" + +"@svgr/webpack@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-8.1.0.tgz#16f1b5346f102f89fda6ec7338b96a701d8be0c2" + integrity sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA== + dependencies: + "@babel/core" "^7.21.3" + "@babel/plugin-transform-react-constant-elements" "^7.21.3" + "@babel/preset-env" "^7.20.2" + "@babel/preset-react" "^7.18.6" + "@babel/preset-typescript" "^7.21.0" + "@svgr/core" "8.1.0" + "@svgr/plugin-jsx" "8.1.0" + "@svgr/plugin-svgo" "8.1.0" + +"@szmarczak/http-timer@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" + integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== + dependencies: + defer-to-connect "^2.0.1" + +"@types/body-parser@*": + version "1.19.6" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.6.tgz#1859bebb8fd7dac9918a45d54c1971ab8b5af474" + integrity sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.13.tgz#adf90ce1a105e81dd1f9c61fdc5afda1bfb92956" + integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@^1.5.4": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3" + integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + +"@types/debug@^4.0.0": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" + +"@types/eslint-scope@^3.7.7": + version "3.7.7" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.1.tgz#d5795ad732ce81715f27f75da913004a56751584" + integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree-jsx@^1.0.0": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-1.0.5.tgz#858a88ea20f34fe65111f005a689fa1ebf70dc18" + integrity sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg== + dependencies: + "@types/estree" "*" + +"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.8": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz#41fec4ea20e9c7b22f024ab88a95c6bb288f51b8" + integrity sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express-serve-static-core@^4.17.21", "@types/express-serve-static-core@^4.17.33": + version "4.19.6" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz#e01324c2a024ff367d92c66f48553ced0ab50267" + integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.3.tgz#6c4bc6acddc2e2a587142e1d8be0bce20757e956" + integrity sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^5.0.0" + "@types/serve-static" "*" + +"@types/express@^4.17.25": + version "4.17.25" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.25.tgz#070c8c73a6fee6936d65c195dbbfb7da5026649b" + integrity sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "^1" + +"@types/hast@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" + integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== + dependencies: + "@types/unist" "*" + +"@types/history@^4.7.11": + version "4.7.11" + resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64" + integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== + +"@types/html-minifier-terser@^6.0.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" + integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== + +"@types/http-cache-semantics@^4.0.2": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" + integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== + +"@types/http-errors@*": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.5.tgz#5b749ab2b16ba113423feb1a64a95dcd30398472" + integrity sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg== + +"@types/http-proxy@^1.17.8": + version "1.17.16" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.16.tgz#dee360707b35b3cc85afcde89ffeebff7d7f9240" + integrity sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== + +"@types/istanbul-lib-report@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/mdast@^4.0.0", "@types/mdast@^4.0.2": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.4.tgz#7ccf72edd2f1aa7dd3437e180c64373585804dd6" + integrity sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA== + dependencies: + "@types/unist" "*" + +"@types/mdx@^2.0.0": + version "2.0.13" + resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.13.tgz#68f6877043d377092890ff5b298152b0a21671bd" + integrity sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw== + +"@types/mime@^1": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== + +"@types/ms@*": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-2.1.0.tgz#052aa67a48eccc4309d7f0191b7e41434b90bb78" + integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== + +"@types/node@*": + version "22.15.30" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.15.30.tgz#3a20431783e28dd0b0326f84ab386a2ec81d921d" + integrity sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA== + dependencies: + undici-types "~6.21.0" + +"@types/node@^17.0.5": + version "17.0.45" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" + integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== + +"@types/prismjs@^1.26.0": + version "1.26.5" + resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.5.tgz#72499abbb4c4ec9982446509d2f14fb8483869d6" + integrity sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ== + +"@types/qs@*": + version "6.14.0" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.14.0.tgz#d8b60cecf62f2db0fb68e5e006077b9178b85de5" + integrity sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ== + +"@types/range-parser@*": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== + +"@types/react-router-config@*", "@types/react-router-config@^5.0.7": + version "5.0.11" + resolved "https://registry.yarnpkg.com/@types/react-router-config/-/react-router-config-5.0.11.tgz#2761a23acc7905a66a94419ee40294a65aaa483a" + integrity sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router" "^5.1.0" + +"@types/react-router-dom@*": + version "5.3.3" + resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.3.tgz#e9d6b4a66fcdbd651a5f106c2656a30088cc1e83" + integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router" "*" + +"@types/react-router@*", "@types/react-router@^5.1.0": + version "5.1.20" + resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.20.tgz#88eccaa122a82405ef3efbcaaa5dcdd9f021387c" + integrity sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + +"@types/react@*": + version "19.1.6" + resolved "https://registry.yarnpkg.com/@types/react/-/react-19.1.6.tgz#dee39f3e1e9a7d693f156a5840570b6d57f325ea" + integrity sha512-JeG0rEWak0N6Itr6QUx+X60uQmN+5t3j9r/OVDtWzFXKaj6kD1BwJzOksD0FF6iWxZlbE1kB0q9vtnU2ekqa1Q== + dependencies: + csstype "^3.0.2" + +"@types/retry@0.12.2": + version "0.12.2" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.2.tgz#ed279a64fa438bb69f2480eda44937912bb7480a" + integrity sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow== + +"@types/sax@^1.2.1": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/sax/-/sax-1.2.7.tgz#ba5fe7df9aa9c89b6dff7688a19023dd2963091d" + integrity sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A== + dependencies: + "@types/node" "*" + +"@types/send@*": + version "0.17.5" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.5.tgz#d991d4f2b16f2b1ef497131f00a9114290791e74" + integrity sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/send@<1": + version "0.17.6" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.6.tgz#aeb5385be62ff58a52cd5459daa509ae91651d25" + integrity sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-index@^1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898" + integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== + dependencies: + "@types/express" "*" + +"@types/serve-static@*", "@types/serve-static@^1.15.5": + version "1.15.8" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.8.tgz#8180c3fbe4a70e8f00b9f70b9ba7f08f35987877" + integrity sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg== + dependencies: + "@types/http-errors" "*" + "@types/node" "*" + "@types/send" "*" + +"@types/serve-static@^1": + version "1.15.10" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.10.tgz#768169145a778f8f5dfcb6360aead414a3994fee" + integrity sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw== + dependencies: + "@types/http-errors" "*" + "@types/node" "*" + "@types/send" "<1" + +"@types/sockjs@^0.3.36": + version "0.3.36" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535" + integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== + dependencies: + "@types/node" "*" + +"@types/unist@*", "@types/unist@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" + integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== + +"@types/unist@^2.0.0": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4" + integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== + +"@types/ws@^8.5.10": + version "8.18.1" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.18.1.tgz#48464e4bf2ddfd17db13d845467f6070ffea4aa9" + integrity sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg== + dependencies: + "@types/node" "*" + +"@types/yargs-parser@*": + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== + +"@types/yargs@^17.0.8": + version "17.0.33" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" + integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== + dependencies: + "@types/yargs-parser" "*" + +"@ungap/structured-clone@^1.0.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" + integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== + +"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6" + integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== + dependencies: + "@webassemblyjs/helper-numbers" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + +"@webassemblyjs/floating-point-hex-parser@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz#fcca1eeddb1cc4e7b6eed4fc7956d6813b21b9fb" + integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== + +"@webassemblyjs/helper-api-error@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz#e0a16152248bc38daee76dd7e21f15c5ef3ab1e7" + integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== + +"@webassemblyjs/helper-buffer@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz#822a9bc603166531f7d5df84e67b5bf99b72b96b" + integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== + +"@webassemblyjs/helper-numbers@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz#dbd932548e7119f4b8a7877fd5a8d20e63490b2d" + integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.13.2" + "@webassemblyjs/helper-api-error" "1.13.2" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz#e556108758f448aae84c850e593ce18a0eb31e0b" + integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== + +"@webassemblyjs/helper-wasm-section@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz#9629dda9c4430eab54b591053d6dc6f3ba050348" + integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/wasm-gen" "1.14.1" + +"@webassemblyjs/ieee754@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz#1c5eaace1d606ada2c7fd7045ea9356c59ee0dba" + integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz#57c5c3deb0105d02ce25fa3fd74f4ebc9fd0bbb0" + integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz#917a20e93f71ad5602966c2d685ae0c6c21f60f1" + integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== + +"@webassemblyjs/wasm-edit@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz#ac6689f502219b59198ddec42dcd496b1004d597" + integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/helper-wasm-section" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-opt" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" + "@webassemblyjs/wast-printer" "1.14.1" + +"@webassemblyjs/wasm-gen@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz#991e7f0c090cb0bb62bbac882076e3d219da9570" + integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" + +"@webassemblyjs/wasm-opt@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz#e6f71ed7ccae46781c206017d3c14c50efa8106b" + integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" + +"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz#b3e13f1893605ca78b52c68e54cf6a865f90b9fb" + integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-api-error" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" + +"@webassemblyjs/wast-printer@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz#3bb3e9638a8ae5fdaf9610e7a06b4d9f9aa6fe07" + integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +accepts@~1.3.4, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-import-phases@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz#16eb850ba99a056cb7cbfe872ffb8972e18c8bd7" + integrity sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ== + +acorn-jsx@^5.0.0: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.0.0: + version "8.3.4" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== + dependencies: + acorn "^8.11.0" + +acorn@^8.0.0, acorn@^8.0.4, acorn@^8.11.0, acorn@^8.14.0, acorn@^8.15.0: + version "8.15.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" + integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== + +address@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/address/-/address-2.0.3.tgz#e910900615db3d8a20c040d4c710631062fc4ba8" + integrity sha512-XNAb/a6TCqou+TufU8/u11HCu9x1gYvOoxLwtlXgIqmkrYQADVv6ljyW2zwiPhHz9R1gItAWpuDrdJMmrOBFEA== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.0, ajv@^8.9.0: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + +algoliasearch-helper@^3.26.0: + version "3.26.0" + resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.26.0.tgz#d6e283396a9fc5bf944f365dc3b712570314363f" + integrity sha512-Rv2x3GXleQ3ygwhkhJubhhYGsICmShLAiqtUuJTUkr9uOCOXyF2E71LVT4XDnVffbknv8XgScP4U0Oxtgm+hIw== + dependencies: + "@algolia/events" "^4.0.1" + +algoliasearch@^5.37.0: + version "5.39.0" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-5.39.0.tgz#4c1b1091125c935cd3a6a0d7fc9558b82f66664d" + integrity sha512-DzTfhUxzg9QBNGzU/0kZkxEV72TeA4MmPJ7RVfLnQwHNhhliPo7ynglEWJS791rNlLFoTyrKvkapwr/P3EXV9A== + dependencies: + "@algolia/abtesting" "1.5.0" + "@algolia/client-abtesting" "5.39.0" + "@algolia/client-analytics" "5.39.0" + "@algolia/client-common" "5.39.0" + "@algolia/client-insights" "5.39.0" + "@algolia/client-personalization" "5.39.0" + "@algolia/client-query-suggestions" "5.39.0" + "@algolia/client-search" "5.39.0" + "@algolia/ingestion" "1.39.0" + "@algolia/monitoring" "1.39.0" + "@algolia/recommend" "5.39.0" + "@algolia/requester-browser-xhr" "5.39.0" + "@algolia/requester-fetch" "5.39.0" + "@algolia/requester-node-http" "5.39.0" + +ansi-align@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +ansis@^3.2.0: + version "3.17.0" + resolved "https://registry.yarnpkg.com/ansis/-/ansis-3.17.0.tgz#fa8d9c2a93fe7d1177e0c17f9eeb562a58a832d7" + integrity sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +asn1js@^3.0.6: + version "3.0.10" + resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.10.tgz#df26c874c8a8b41ca605efea47b2ad07551013dd" + integrity sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg== + dependencies: + pvtsutils "^1.3.6" + pvutils "^1.1.5" + tslib "^2.8.1" + +astring@^1.8.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/astring/-/astring-1.9.0.tgz#cc73e6062a7eb03e7d19c22d8b0b3451fd9bfeef" + integrity sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg== + +autoprefixer@^10.4.19, autoprefixer@^10.4.21: + version "10.4.21" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.21.tgz#77189468e7a8ad1d9a37fbc08efc9f480cf0a95d" + integrity sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ== + dependencies: + browserslist "^4.24.4" + caniuse-lite "^1.0.30001702" + fraction.js "^4.3.7" + normalize-range "^0.1.2" + picocolors "^1.1.1" + postcss-value-parser "^4.2.0" + +babel-loader@^9.2.1: + version "9.2.1" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.2.1.tgz#04c7835db16c246dd19ba0914418f3937797587b" + integrity sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA== + dependencies: + find-cache-dir "^4.0.0" + schema-utils "^4.0.0" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-polyfill-corejs2@^0.4.10: + version "0.4.13" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz#7d445f0e0607ebc8fb6b01d7e8fb02069b91dd8b" + integrity sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.6.4" + semver "^6.3.1" + +babel-plugin-polyfill-corejs3@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz#4e4e182f1bb37c7ba62e2af81d8dd09df31344f6" + integrity sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.3" + core-js-compat "^3.40.0" + +babel-plugin-polyfill-regenerator@^0.6.1: + version "0.6.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz#428c615d3c177292a22b4f93ed99e358d7906a9b" + integrity sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.4" + +bail@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" + integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +baseline-browser-mapping@^2.9.0: + version "2.9.19" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz#3e508c43c46d961eb4d7d2e5b8d1dd0f9ee4f488" + integrity sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg== + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +body-parser@~1.20.5: + version "1.20.6" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.6.tgz#60c789c78e0992d906da0a29d71ae01d15c1ed76" + integrity sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g== + dependencies: + bytes "~3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "~1.2.0" + http-errors "~2.0.1" + iconv-lite "~0.4.24" + on-finished "~2.4.1" + qs "~6.15.1" + raw-body "~2.5.3" + type-is "~1.6.18" + unpipe "~1.0.0" + +bonjour-service@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.3.0.tgz#80d867430b5a0da64e82a8047fc1e355bdb71722" + integrity sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA== + dependencies: + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +boxen@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-6.2.1.tgz#b098a2278b2cd2845deef2dff2efc38d329b434d" + integrity sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw== + dependencies: + ansi-align "^3.0.1" + camelcase "^6.2.0" + chalk "^4.1.2" + cli-boxes "^3.0.0" + string-width "^5.0.1" + type-fest "^2.5.0" + widest-line "^4.0.1" + wrap-ansi "^8.0.1" + +boxen@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-7.1.1.tgz#f9ba525413c2fec9cdb88987d835c4f7cad9c8f4" + integrity sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog== + dependencies: + ansi-align "^3.0.1" + camelcase "^7.0.1" + chalk "^5.2.0" + cli-boxes "^3.0.0" + string-width "^5.1.2" + type-fest "^2.13.0" + widest-line "^4.0.1" + wrap-ansi "^8.1.0" + +brace-expansion@^1.1.7: + version "1.1.18" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.18.tgz#3ce74d89885136be1535341f8c3d4425c29a5cab" + integrity sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browserslist@^4.0.0, browserslist@^4.23.0, browserslist@^4.24.0, browserslist@^4.24.4, browserslist@^4.25.0: + version "4.25.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.25.0.tgz#986aa9c6d87916885da2b50d8eb577ac8d133b2c" + integrity sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA== + dependencies: + caniuse-lite "^1.0.30001718" + electron-to-chromium "^1.5.160" + node-releases "^2.0.19" + update-browserslist-db "^1.1.3" + +browserslist@^4.28.1: + version "4.28.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.1.tgz#7f534594628c53c63101079e27e40de490456a95" + integrity sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA== + dependencies: + baseline-browser-mapping "^2.9.0" + caniuse-lite "^1.0.30001759" + electron-to-chromium "^1.5.263" + node-releases "^2.0.27" + update-browserslist-db "^1.2.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +bundle-name@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889" + integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== + dependencies: + run-applescript "^7.0.0" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2, bytes@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +bytestreamjs@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/bytestreamjs/-/bytestreamjs-2.0.1.tgz#a32947c7ce389a6fa11a09a9a563d0a45889535e" + integrity sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ== + +cacheable-lookup@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz#3476a8215d046e5a3202a9209dd13fec1f933a27" + integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== + +cacheable-request@^10.2.8: + version "10.2.14" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.14.tgz#eb915b665fda41b79652782df3f553449c406b9d" + integrity sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ== + dependencies: + "@types/http-cache-semantics" "^4.0.2" + get-stream "^6.0.1" + http-cache-semantics "^4.1.1" + keyv "^4.5.3" + mimic-response "^4.0.0" + normalize-url "^8.0.0" + responselike "^3.0.0" + +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" + +call-bound@^1.0.2, call-bound@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +camelcase@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-7.0.1.tgz#f02e50af9fd7782bc8b88a3558c32fd3a388f048" + integrity sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001718, caniuse-lite@^1.0.30001759: + version "1.0.30001769" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz#1ad91594fad7dc233777c2781879ab5409f7d9c2" + integrity sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg== + +ccount@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== + +chalk@^4.0.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^5.0.1, chalk@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.4.1.tgz#1b48bf0963ec158dce2aacf69c093ae2dd2092d8" + integrity sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w== + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +character-entities-html4@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" + integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== + +character-entities-legacy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" + integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== + +character-entities@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== + +character-reference-invalid@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" + integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== + +cheerio-select@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" + integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== + dependencies: + boolbase "^1.0.0" + css-select "^5.1.0" + css-what "^6.1.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + +cheerio@1.0.0-rc.12: + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" + integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== + dependencies: + cheerio-select "^2.1.0" + dom-serializer "^2.0.0" + domhandler "^5.0.3" + domutils "^3.0.1" + htmlparser2 "^8.0.1" + parse5 "^7.0.0" + parse5-htmlparser2-tree-adapter "^7.0.0" + +chokidar@^3.5.3, chokidar@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" + integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== + +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +clean-css@^5.2.2, clean-css@^5.3.3, clean-css@~5.3.2: + version "5.3.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd" + integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== + dependencies: + source-map "~0.6.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-boxes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" + integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== + +cli-table3@^0.6.3: + version "0.6.5" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.5.tgz#013b91351762739c16a9567c21a04632e449bf2f" + integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clsx@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + +collapse-white-space@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-2.1.0.tgz#640257174f9f42c740b40f3b55ee752924feefca" + integrity sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colord@^2.9.3: + version "2.9.3" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" + integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== + +colorette@^2.0.10: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +combine-promises@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/combine-promises/-/combine-promises-1.2.0.tgz#5f2e68451862acf85761ded4d9e2af7769c2ca6a" + integrity sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ== + +comma-separated-tokens@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== + +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +common-path-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" + integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== + +compressible@~2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.8.1.tgz#4a45d909ac16509195a9a28bd91094889c180d79" + integrity sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w== + dependencies: + bytes "3.1.2" + compressible "~2.0.18" + debug "2.6.9" + negotiator "~0.6.4" + on-headers "~1.1.0" + safe-buffer "5.2.1" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +config-chain@^1.1.11: + version "1.1.13" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +configstore@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-6.0.0.tgz#49eca2ebc80983f77e09394a1a56e0aca8235566" + integrity sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA== + dependencies: + dot-prop "^6.0.1" + graceful-fs "^4.2.6" + unique-string "^3.0.0" + write-file-atomic "^3.0.3" + xdg-basedir "^5.0.1" + +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== + +consola@^3.2.3: + version "3.4.2" + resolved "https://registry.yarnpkg.com/consola/-/consola-3.4.2.tgz#5af110145397bb67afdab77013fdc34cae590ea7" + integrity sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA== + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== + +content-disposition@~0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cookie-signature@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.7.tgz#ab5dd7ab757c54e60f37ef6550f481c426d10454" + integrity sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA== + +cookie@~0.7.1: + version "0.7.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" + integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== + +copy-text-to-clipboard@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.2.tgz#99bc79db3f2d355ec33a08d573aff6804491ddb9" + integrity sha512-T6SqyLd1iLuqPA90J5N4cTalrtovCySh58iiZDGJ6FGznbclKh4UI+FGacQSgFzwKG77W7XT5gwbVEbd9cIH1A== + +copy-webpack-plugin@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz#96d4dbdb5f73d02dd72d0528d1958721ab72e04a" + integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== + dependencies: + fast-glob "^3.2.11" + glob-parent "^6.0.1" + globby "^13.1.1" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + +core-js-compat@^3.40.0: + version "3.42.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.42.0.tgz#ce19c29706ee5806e26d3cb3c542d4cfc0ed51bb" + integrity sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ== + dependencies: + browserslist "^4.24.4" + +core-js@^3.31.1: + version "3.42.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.42.0.tgz#edbe91f78ac8cfb6df8d997e74d368a68082fe37" + integrity sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^8.1.3, cosmiconfig@^8.3.5: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== + dependencies: + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" + +cross-spawn@^7.0.3: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-random-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-4.0.0.tgz#5a3cc53d7dd86183df5da0312816ceeeb5bb1fc2" + integrity sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA== + dependencies: + type-fest "^1.0.1" + +css-blank-pseudo@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz#32020bff20a209a53ad71b8675852b49e8d57e46" + integrity sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag== + dependencies: + postcss-selector-parser "^7.0.0" + +css-declaration-sorter@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz#6dec1c9523bc4a643e088aab8f09e67a54961024" + integrity sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow== + +css-has-pseudo@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-7.0.2.tgz#fb42e8de7371f2896961e1f6308f13c2c7019b72" + integrity sha512-nzol/h+E0bId46Kn2dQH5VElaknX2Sr0hFuB/1EomdC7j+OISt2ZzK7EHX9DZDY53WbIVAR7FYKSO2XnSf07MQ== + dependencies: + "@csstools/selector-specificity" "^5.0.0" + postcss-selector-parser "^7.0.0" + postcss-value-parser "^4.2.0" + +css-loader@^6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.11.0.tgz#33bae3bf6363d0a7c2cf9031c96c744ff54d85ba" + integrity sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.33" + postcss-modules-extract-imports "^3.1.0" + postcss-modules-local-by-default "^4.0.5" + postcss-modules-scope "^3.2.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.5.4" + +css-minimizer-webpack-plugin@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz#33effe662edb1a0bf08ad633c32fa75d0f7ec565" + integrity sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg== + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" + cssnano "^6.0.1" + jest-worker "^29.4.3" + postcss "^8.4.24" + schema-utils "^4.0.1" + serialize-javascript "^6.0.1" + +css-prefers-color-scheme@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz#ba001b99b8105b8896ca26fc38309ddb2278bd3c" + integrity sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ== + +css-select@^4.1.3: + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== + dependencies: + boolbase "^1.0.0" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" + +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +css-tree@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" + integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== + dependencies: + mdn-data "2.0.30" + source-map-js "^1.0.1" + +css-tree@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.2.1.tgz#36115d382d60afd271e377f9c5f67d02bd48c032" + integrity sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA== + dependencies: + mdn-data "2.0.28" + source-map-js "^1.0.1" + +css-what@^6.0.1, css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +cssdb@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-8.3.0.tgz#940becad497b8509ad822a28fb0cfe54c969ccfe" + integrity sha512-c7bmItIg38DgGjSwDPZOYF/2o0QU/sSgkWOMyl8votOfgFuyiFKWPesmCGEsrGLxEA9uL540cp8LdaGEjUGsZQ== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-advanced@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz#82b090872b8f98c471f681d541c735acf8b94d3f" + integrity sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ== + dependencies: + autoprefixer "^10.4.19" + browserslist "^4.23.0" + cssnano-preset-default "^6.1.2" + postcss-discard-unused "^6.0.5" + postcss-merge-idents "^6.0.3" + postcss-reduce-idents "^6.0.3" + postcss-zindex "^6.0.2" + +cssnano-preset-default@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz#adf4b89b975aa775f2750c89dbaf199bbd9da35e" + integrity sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg== + dependencies: + browserslist "^4.23.0" + css-declaration-sorter "^7.2.0" + cssnano-utils "^4.0.2" + postcss-calc "^9.0.1" + postcss-colormin "^6.1.0" + postcss-convert-values "^6.1.0" + postcss-discard-comments "^6.0.2" + postcss-discard-duplicates "^6.0.3" + postcss-discard-empty "^6.0.3" + postcss-discard-overridden "^6.0.2" + postcss-merge-longhand "^6.0.5" + postcss-merge-rules "^6.1.1" + postcss-minify-font-values "^6.1.0" + postcss-minify-gradients "^6.0.3" + postcss-minify-params "^6.1.0" + postcss-minify-selectors "^6.0.4" + postcss-normalize-charset "^6.0.2" + postcss-normalize-display-values "^6.0.2" + postcss-normalize-positions "^6.0.2" + postcss-normalize-repeat-style "^6.0.2" + postcss-normalize-string "^6.0.2" + postcss-normalize-timing-functions "^6.0.2" + postcss-normalize-unicode "^6.1.0" + postcss-normalize-url "^6.0.2" + postcss-normalize-whitespace "^6.0.2" + postcss-ordered-values "^6.0.2" + postcss-reduce-initial "^6.1.0" + postcss-reduce-transforms "^6.0.2" + postcss-svgo "^6.0.3" + postcss-unique-selectors "^6.0.4" + +cssnano-utils@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-4.0.2.tgz#56f61c126cd0f11f2eef1596239d730d9fceff3c" + integrity sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ== + +cssnano@^6.0.1, cssnano@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-6.1.2.tgz#4bd19e505bd37ee7cf0dc902d3d869f6d79c66b8" + integrity sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA== + dependencies: + cssnano-preset-default "^6.1.2" + lilconfig "^3.1.1" + +csso@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/csso/-/csso-5.0.5.tgz#f9b7fe6cc6ac0b7d90781bb16d5e9874303e2ca6" + integrity sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ== + dependencies: + css-tree "~2.2.0" + +csstype@^3.0.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +debounce@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" + integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== + dependencies: + ms "^2.1.3" + +decode-named-character-reference@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz#5d6ce68792808901210dac42a8e9853511e2b8bf" + integrity sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w== + dependencies: + character-entities "^2.0.0" + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deepmerge@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +default-browser-id@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-5.0.0.tgz#a1d98bf960c15082d8a3fa69e83150ccccc3af26" + integrity sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA== + +default-browser@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.2.1.tgz#7b7ba61204ff3e425b556869ae6d3e9d9f1712cf" + integrity sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg== + dependencies: + bundle-name "^4.1.0" + default-browser-id "^5.0.0" + +defer-to-connect@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-lazy-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" + integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== + +define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +depd@2.0.0, depd@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +dequal@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +destroy@1.2.0, destroy@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +detect-port@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-2.1.0.tgz#03d72644891fa451ca5609b83107a8a0ebd03f91" + integrity sha512-epZuWb/6Q62L+nDHJc/hQAqf8pylsqgk3BpZXVBx1CDnr3nkrVNn73Uu1rXcFzkNcc+hkP3whuOg7JZYaQB65Q== + dependencies: + address "^2.0.1" + +devlop@^1.0.0, devlop@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" + integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== + dependencies: + dequal "^2.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-packet@^5.2.2: + version "5.6.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" + integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^2.5.2, domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +domutils@^3.0.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" + integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dot-prop@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" + integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== + dependencies: + is-obj "^2.0.0" + +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +duplexer@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.5.160: + version "1.5.165" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.165.tgz#477b0957e42f071905a86f7c905a9848f95d2bdb" + integrity sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw== + +electron-to-chromium@^1.5.263: + version "1.5.286" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz#142be1ab5e1cd5044954db0e5898f60a4960384e" + integrity sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +emojilib@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/emojilib/-/emojilib-2.4.0.tgz#ac518a8bb0d5f76dda57289ccb2fdf9d39ae721e" + integrity sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +emoticon@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/emoticon/-/emoticon-4.1.0.tgz#d5a156868ee173095627a33de3f1e914c3dde79e" + integrity sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + +enhanced-resolve@^5.19.0: + version "5.19.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz#6687446a15e969eaa63c2fa2694510e17ae6d97c" + integrity sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.3.0" + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +entities@^4.2.0, entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +entities@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-6.0.0.tgz#09c9e29cb79b0a6459a9b9db9efb418ac5bb8e51" + integrity sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-module-lexer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-2.0.0.tgz#f657cd7a9448dcdda9c070a3cb75e5dc1e85f5b1" + integrity sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +esast-util-from-estree@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz#8d1cfb51ad534d2f159dc250e604f3478a79f1ad" + integrity sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ== + dependencies: + "@types/estree-jsx" "^1.0.0" + devlop "^1.0.0" + estree-util-visit "^2.0.0" + unist-util-position-from-estree "^2.0.0" + +esast-util-from-js@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz#5147bec34cc9da44accf52f87f239a40ac3e8225" + integrity sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw== + dependencies: + "@types/estree-jsx" "^1.0.0" + acorn "^8.0.0" + esast-util-from-estree "^2.0.0" + vfile-message "^4.0.0" + +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-goat@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-4.0.0.tgz#9424820331b510b0666b98f7873fe11ac4aa8081" + integrity sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg== + +escape-html@^1.0.3, escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-util-attach-comments@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz#344bde6a64c8a31d15231e5ee9e297566a691c2d" + integrity sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw== + dependencies: + "@types/estree" "^1.0.0" + +estree-util-build-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz#b6d0bced1dcc4f06f25cf0ceda2b2dcaf98168f1" + integrity sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ== + dependencies: + "@types/estree-jsx" "^1.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + estree-walker "^3.0.0" + +estree-util-is-identifier-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz#0b5ef4c4ff13508b34dcd01ecfa945f61fce5dbd" + integrity sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg== + +estree-util-scope@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/estree-util-scope/-/estree-util-scope-1.0.0.tgz#9cbdfc77f5cb51e3d9ed4ad9c4adbff22d43e585" + integrity sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + +estree-util-to-js@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz#10a6fb924814e6abb62becf0d2bc4dea51d04f17" + integrity sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg== + dependencies: + "@types/estree-jsx" "^1.0.0" + astring "^1.8.0" + source-map "^0.7.0" + +estree-util-value-to-estree@^3.0.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/estree-util-value-to-estree/-/estree-util-value-to-estree-3.4.0.tgz#827122e40c3a756d3c4cf5d5d296fa06026a1a4f" + integrity sha512-Zlp+gxis+gCfK12d3Srl2PdX2ybsEA8ZYy6vQGVQTNNYLEGRQQ56XB64bjemN8kxIKXP1nC9ip4Z+ILy9LGzvQ== + dependencies: + "@types/estree" "^1.0.0" + +estree-util-visit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/estree-util-visit/-/estree-util-visit-2.0.0.tgz#13a9a9f40ff50ed0c022f831ddf4b58d05446feb" + integrity sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/unist" "^3.0.0" + +estree-walker@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +eta@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eta/-/eta-2.2.0.tgz#eb8b5f8c4e8b6306561a455e62cd7492fe3a9b8a" + integrity sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eval@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eval/-/eval-0.1.8.tgz#2b903473b8cc1d1989b83a1e7923f883eb357f85" + integrity sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw== + dependencies: + "@types/node" "*" + require-like ">= 0.1.1" + +eventemitter3@^4.0.0, eventemitter3@^4.0.4: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +express@^4.22.1: + version "4.22.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.22.2.tgz#c17ae0981e5efc24b22272f0e041c4662503b700" + integrity sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "~1.20.5" + content-disposition "~0.5.4" + content-type "~1.0.4" + cookie "~0.7.1" + cookie-signature "~1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~2.0.0" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.3.1" + fresh "~0.5.2" + http-errors "~2.0.0" + merge-descriptors "1.0.3" + methods "~1.1.2" + on-finished "~2.4.1" + parseurl "~1.3.3" + path-to-regexp "~0.1.12" + proxy-addr "~2.0.7" + qs "~6.15.1" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "~0.19.0" + serve-static "~1.16.2" + setprototypeof "1.2.0" + statuses "~2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.11, fast-glob@^3.2.9, fast-glob@^3.3.0: + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.8" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-uri@^3.0.1: + version "3.1.5" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.5.tgz#610f37419a030270430cecd68d74e3d4d96725d0" + integrity sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw== + +fastq@^1.6.0: + version "1.19.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" + integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== + dependencies: + reusify "^1.0.4" + +fault@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fault/-/fault-2.0.1.tgz#d47ca9f37ca26e4bd38374a7c500b5a384755b6c" + integrity sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ== + dependencies: + format "^0.2.0" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +feed@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/feed/-/feed-4.2.2.tgz#865783ef6ed12579e2c44bbef3c9113bc4956a7e" + integrity sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ== + dependencies: + xml-js "^1.6.11" + +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@~1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.2.tgz#1ebc2228fc7673aac4a472c310cc05b77d852b88" + integrity sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg== + dependencies: + debug "2.6.9" + encodeurl "~2.0.0" + escape-html "~1.0.3" + on-finished "~2.4.1" + parseurl "~1.3.3" + statuses "~2.0.2" + unpipe "~1.0.0" + +find-cache-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-4.0.0.tgz#a30ee0448f81a3990708f6453633c733e2f6eec2" + integrity sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg== + dependencies: + common-path-prefix "^3.0.0" + pkg-dir "^7.0.0" + +find-up@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== + dependencies: + locate-path "^7.1.0" + path-exists "^5.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +follow-redirects@^1.0.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.16.0.tgz#28474a159d3b9d11ef62050a14ed60e4df6d61bc" + integrity sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw== + +form-data-encoder@^2.1.2: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" + integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== + +format@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" + integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fraction.js@^4.3.7: + version "4.3.7" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== + +fresh@0.5.2, fresh@~0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-extra@^11.1.1, fs-extra@^11.2.0: + version "11.3.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.0.tgz#0daced136bbaf65a555a326719af931adc7a314d" + integrity sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +get-stream@^6.0.0, get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +github-slugger@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.5.0.tgz#17891bbc73232051474d68bd867a34625c955f7d" + integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regex.js@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/glob-to-regex.js/-/glob-to-regex.js-1.0.1.tgz#f71cc9cb8441471a9318626160bc8a35e1306b21" + integrity sha512-CG/iEvgQqfzoVsMUbxSJcwbG2JwyZ3naEqPkeltwl0BSS8Bp83k3xlGms+0QdWFUAwV+uvo80wNswKF6FWEkKg== + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +global-dirs@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" + integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== + dependencies: + ini "2.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globby@^13.1.1: + version "13.2.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" + integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.3.0" + ignore "^5.2.4" + merge2 "^1.4.1" + slash "^4.0.0" + +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +got@^12.1.0: + version "12.6.1" + resolved "https://registry.yarnpkg.com/got/-/got-12.6.1.tgz#8869560d1383353204b5a9435f782df9c091f549" + integrity sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ== + dependencies: + "@sindresorhus/is" "^5.2.0" + "@szmarczak/http-timer" "^5.0.1" + cacheable-lookup "^7.0.0" + cacheable-request "^10.2.8" + decompress-response "^6.0.0" + form-data-encoder "^2.1.2" + get-stream "^6.0.1" + http2-wrapper "^2.1.10" + lowercase-keys "^3.0.0" + p-cancelable "^3.0.0" + responselike "^3.0.0" + +graceful-fs@4.2.10: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-yarn@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-3.0.0.tgz#c3c21e559730d1d3b57e28af1f30d06fac38147d" + integrity sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA== + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +hast-util-from-parse5@^8.0.0: + version "8.0.3" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz#830a35022fff28c3fea3697a98c2f4cc6b835a2e" + integrity sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + devlop "^1.0.0" + hastscript "^9.0.0" + property-information "^7.0.0" + vfile "^6.0.0" + vfile-location "^5.0.0" + web-namespaces "^2.0.0" + +hast-util-parse-selector@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz#352879fa86e25616036037dd8931fb5f34cb4a27" + integrity sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-raw@^9.0.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-9.1.0.tgz#79b66b26f6f68fb50dfb4716b2cdca90d92adf2e" + integrity sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + "@ungap/structured-clone" "^1.0.0" + hast-util-from-parse5 "^8.0.0" + hast-util-to-parse5 "^8.0.0" + html-void-elements "^3.0.0" + mdast-util-to-hast "^13.0.0" + parse5 "^7.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + +hast-util-to-estree@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz#e654c1c9374645135695cc0ab9f70b8fcaf733d7" + integrity sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w== + dependencies: + "@types/estree" "^1.0.0" + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + estree-util-attach-comments "^3.0.0" + estree-util-is-identifier-name "^3.0.0" + hast-util-whitespace "^3.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + property-information "^7.0.0" + space-separated-tokens "^2.0.0" + style-to-js "^1.0.0" + unist-util-position "^5.0.0" + zwitch "^2.0.0" + +hast-util-to-jsx-runtime@^2.0.0: + version "2.3.6" + resolved "https://registry.yarnpkg.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz#ff31897aae59f62232e21594eac7ef6b63333e98" + integrity sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg== + dependencies: + "@types/estree" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + hast-util-whitespace "^3.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + property-information "^7.0.0" + space-separated-tokens "^2.0.0" + style-to-js "^1.0.0" + unist-util-position "^5.0.0" + vfile-message "^4.0.0" + +hast-util-to-parse5@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz#477cd42d278d4f036bc2ea58586130f6f39ee6ed" + integrity sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw== + dependencies: + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + +hast-util-whitespace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" + integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== + dependencies: + "@types/hast" "^3.0.0" + +hastscript@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-9.0.1.tgz#dbc84bef6051d40084342c229c451cd9dc567dff" + integrity sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w== + dependencies: + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + hast-util-parse-selector "^4.0.0" + property-information "^7.0.0" + space-separated-tokens "^2.0.0" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +history@^4.9.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" + integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== + dependencies: + "@babel/runtime" "^7.1.2" + loose-envify "^1.2.0" + resolve-pathname "^3.0.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + value-equal "^1.0.1" + +hoist-non-react-statics@^3.1.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-escaper@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +html-minifier-terser@^6.0.2: + version "6.1.0" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== + dependencies: + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" + he "^1.2.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.10.0" + +html-minifier-terser@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz#18752e23a2f0ed4b0f550f217bb41693e975b942" + integrity sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA== + dependencies: + camel-case "^4.1.2" + clean-css "~5.3.2" + commander "^10.0.0" + entities "^4.4.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.15.1" + +html-tags@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce" + integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== + +html-void-elements@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" + integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== + +html-webpack-plugin@^5.6.0: + version "5.6.3" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz#a31145f0fee4184d53a794f9513147df1e653685" + integrity sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg== + dependencies: + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +htmlparser2@^8.0.1: + version "8.0.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + entities "^4.4.0" + +http-cache-semantics@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz#205f4db64f8562b76a4ff9235aa5279839a09dd5" + integrity sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~2.0.0, http-errors@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz#36d2f65bc909c8790018dd36fb4d93da6caae06b" + integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== + dependencies: + depd "~2.0.0" + inherits "~2.0.4" + setprototypeof "~1.2.0" + statuses "~2.0.2" + toidentifier "~1.0.1" + +http-parser-js@>=0.5.1: + version "0.5.10" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.10.tgz#b3277bd6d7ed5588e20ea73bf724fcbe44609075" + integrity sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA== + +http-proxy-middleware@^2.0.9: + version "2.0.10" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.10.tgz#b2df7b705203d7a8c269ac8450cf96b00c532f94" + integrity sha512-RKzRWNPxUZqbuk3BC5mGVJbBnWgr+diEnjJexIOytFbBzDy88Fbh/YvBr3DsNrl1jYAfjWfpATEv0NO35FDuPQ== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http2-wrapper@^2.1.10: + version "2.2.1" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz#310968153dcdedb160d8b72114363ef5fce1f64a" + integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.2.0" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +hyperdyperid@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/hyperdyperid/-/hyperdyperid-1.2.0.tgz#59668d323ada92228d2a869d3e474d5a33b69e6b" + integrity sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A== + +iconv-lite@~0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +ignore@^5.2.0, ignore@^5.2.4: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +image-size@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-2.0.2.tgz#84a7b43704db5736f364bf0d1b029821299b4bdc" + integrity sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w== + +import-fresh@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-lazy@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +infima@0.2.0-alpha.45: + version "0.2.0-alpha.45" + resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.45.tgz#542aab5a249274d81679631b492973dd2c1e7466" + integrity sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +ini@^1.3.4, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inline-style-parser@0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.2.4.tgz#f4af5fe72e612839fcd453d989a586566d695f22" + integrity sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q== + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +ipaddr.js@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz#d33fa7bac284f4de7af949638c9d68157c6b92e8" + integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== + +is-alphabetical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" + integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== + +is-alphanumerical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875" + integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== + dependencies: + is-alphabetical "^2.0.0" + is-decimal "^2.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-ci@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + +is-core-module@^2.16.0: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== + dependencies: + hasown "^2.0.2" + +is-decimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" + integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-docker@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" + integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== + +is-extendable@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" + integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== + +is-inside-container@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" + integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== + dependencies: + is-docker "^3.0.0" + +is-installed-globally@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-network-error@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/is-network-error/-/is-network-error-1.3.0.tgz#2ce62cbca444abd506f8a900f39d20b898d37512" + integrity sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw== + +is-npm@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-6.0.0.tgz#b59e75e8915543ca5d881ecff864077cba095261" + integrity sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +is-wsl@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.0.tgz#e1c657e39c10090afcbedec61720f6b924c3cbd2" + integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== + dependencies: + is-inside-container "^1.0.0" + +is-yarn-global@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.4.1.tgz#b312d902b313f81e4eaf98b6361ba2b45cd694bb" + integrity sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^29.4.3: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jiti@^1.20.0: + version "1.21.7" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.7.tgz#9dd81043424a3d28458b193d965f0d18a2300ba9" + integrity sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A== + +joi@^17.9.2: + version "17.13.4" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.13.4.tgz#ad6153d97ce558eb3a3b593e0d43eab51df1c474" + integrity sha512-1RuuER6kmt8K8I3nIWvPZKi5RQCb568ZPyY4Pwjlua+yo+63ZTmIwxLZH0heBmiKN4uxjvCiarDrjaeH84xicQ== + dependencies: + "@hapi/hoek" "^9.3.0" + "@hapi/topo" "^5.1.0" + "@sideway/address" "^4.1.5" + "@sideway/formula" "^3.0.1" + "@sideway/pinpoint" "^2.0.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.3.0.tgz#d1900572a7f7cf0b5f540c83673e60bad3436592" + integrity sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q== + dependencies: + argparse "^2.0.1" + +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + +jsesc@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json5@^2.1.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +latest-version@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-7.0.0.tgz#843201591ea81a4d404932eeb61240fe04e9e5da" + integrity sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg== + dependencies: + package-json "^8.1.0" + +launch-editor@^2.14.1: + version "2.14.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.14.1.tgz#f7e0da3f58aaea03fea01074d840b5f739ed7ddc" + integrity sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA== + dependencies: + picocolors "^1.1.1" + shell-quote "^1.8.4" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +lilconfig@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" + integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +loader-runner@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.1.tgz#6c76ed29b0ccce9af379208299f07f876de737e3" + integrity sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q== + +loader-utils@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +locate-path@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== + dependencies: + p-locate "^6.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash@^4.17.20, lodash@^4.17.21: + version "4.18.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c" + integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== + +longest-streak@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" + integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== + +loose-envify@^1.0.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lowercase-keys@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" + integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +markdown-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/markdown-extensions/-/markdown-extensions-2.0.0.tgz#34bebc83e9938cae16e0e017e4a9814a8330d3c4" + integrity sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q== + +markdown-table@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.4.tgz#fe44d6d410ff9d6f2ea1797a3f60aa4d2b631c2a" + integrity sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw== + +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +mdast-util-directive@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz#f3656f4aab6ae3767d3c72cfab5e8055572ccba1" + integrity sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + ccount "^2.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + parse-entities "^4.0.0" + stringify-entities "^4.0.0" + unist-util-visit-parents "^6.0.0" + +mdast-util-find-and-replace@^3.0.0, mdast-util-find-and-replace@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz#70a3174c894e14df722abf43bc250cbae44b11df" + integrity sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg== + dependencies: + "@types/mdast" "^4.0.0" + escape-string-regexp "^5.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + +mdast-util-from-markdown@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz#4850390ca7cf17413a9b9a0fbefcd1bc0eb4160a" + integrity sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + mdast-util-to-string "^4.0.0" + micromark "^4.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-decode-string "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-stringify-position "^4.0.0" + +mdast-util-frontmatter@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz#f5f929eb1eb36c8a7737475c7eb438261f964ee8" + integrity sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + escape-string-regexp "^5.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + micromark-extension-frontmatter "^2.0.0" + +mdast-util-gfm-autolink-literal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz#abd557630337bd30a6d5a4bd8252e1c2dc0875d5" + integrity sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ== + dependencies: + "@types/mdast" "^4.0.0" + ccount "^2.0.0" + devlop "^1.0.0" + mdast-util-find-and-replace "^3.0.0" + micromark-util-character "^2.0.0" + +mdast-util-gfm-footnote@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz#7778e9d9ca3df7238cc2bd3fa2b1bf6a65b19403" + integrity sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + +mdast-util-gfm-strikethrough@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz#d44ef9e8ed283ac8c1165ab0d0dfd058c2764c16" + integrity sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz#7a435fb6223a72b0862b33afbd712b6dae878d38" + integrity sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + markdown-table "^3.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm-task-list-item@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz#e68095d2f8a4303ef24094ab642e1047b991a936" + integrity sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz#2cdf63b92c2a331406b0fb0db4c077c1b0331751" + integrity sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ== + dependencies: + mdast-util-from-markdown "^2.0.0" + mdast-util-gfm-autolink-literal "^2.0.0" + mdast-util-gfm-footnote "^2.0.0" + mdast-util-gfm-strikethrough "^2.0.0" + mdast-util-gfm-table "^2.0.0" + mdast-util-gfm-task-list-item "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-mdx-expression@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz#43f0abac9adc756e2086f63822a38c8d3c3a5096" + integrity sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-mdx-jsx@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz#fd04c67a2a7499efb905a8a5c578dddc9fdada0d" + integrity sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + ccount "^2.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + parse-entities "^4.0.0" + stringify-entities "^4.0.0" + unist-util-stringify-position "^4.0.0" + vfile-message "^4.0.0" + +mdast-util-mdx@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz#792f9cf0361b46bee1fdf1ef36beac424a099c41" + integrity sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w== + dependencies: + mdast-util-from-markdown "^2.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-mdxjs-esm@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz#019cfbe757ad62dd557db35a695e7314bcc9fa97" + integrity sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-phrasing@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz#7cc0a8dec30eaf04b7b1a9661a92adb3382aa6e3" + integrity sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w== + dependencies: + "@types/mdast" "^4.0.0" + unist-util-is "^6.0.0" + +mdast-util-to-hast@^13.0.0: + version "13.2.1" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz#d7ff84ca499a57e2c060ae67548ad950e689a053" + integrity sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@ungap/structured-clone" "^1.0.0" + devlop "^1.0.0" + micromark-util-sanitize-uri "^2.0.0" + trim-lines "^3.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + +mdast-util-to-markdown@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz#f910ffe60897f04bb4b7e7ee434486f76288361b" + integrity sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + longest-streak "^3.0.0" + mdast-util-phrasing "^4.0.0" + mdast-util-to-string "^4.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-decode-string "^2.0.0" + unist-util-visit "^5.0.0" + zwitch "^2.0.0" + +mdast-util-to-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz#7a5121475556a04e7eddeb67b264aae79d312814" + integrity sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg== + dependencies: + "@types/mdast" "^4.0.0" + +mdn-data@2.0.28: + version "2.0.28" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.28.tgz#5ec48e7bef120654539069e1ae4ddc81ca490eba" + integrity sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g== + +mdn-data@2.0.30: + version "2.0.30" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" + integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memfs@^4.43.1: + version "4.47.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.47.0.tgz#410291da6dcce89a0d6c9cab23b135231a5ed44c" + integrity sha512-Xey8IZA57tfotV/TN4d6BmccQuhFP+CqRiI7TTNdipZdZBzF2WnzUcH//Cudw6X4zJiUbo/LTuU/HPA/iC/pNg== + dependencies: + "@jsonjoy.com/json-pack" "^1.11.0" + "@jsonjoy.com/util" "^1.9.0" + glob-to-regex.js "^1.0.1" + thingies "^2.5.0" + tree-dump "^1.0.3" + tslib "^2.0.0" + +merge-descriptors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromark-core-commonmark@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz#c691630e485021a68cf28dbc2b2ca27ebf678cd4" + integrity sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg== + dependencies: + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-factory-destination "^2.0.0" + micromark-factory-label "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-factory-title "^2.0.0" + micromark-factory-whitespace "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-html-tag-name "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-directive@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz#2eb61985d1995a7c1ff7621676a4f32af29409e8" + integrity sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-factory-whitespace "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + parse-entities "^4.0.0" + +micromark-extension-frontmatter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz#651c52ffa5d7a8eeed687c513cd869885882d67a" + integrity sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg== + dependencies: + fault "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-autolink-literal@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz#6286aee9686c4462c1e3552a9d505feddceeb935" + integrity sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-footnote@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz#4dab56d4e398b9853f6fe4efac4fc9361f3e0750" + integrity sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw== + dependencies: + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-strikethrough@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz#86106df8b3a692b5f6a92280d3879be6be46d923" + integrity sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw== + dependencies: + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-table@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz#fac70bcbf51fe65f5f44033118d39be8a9b5940b" + integrity sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-tagfilter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz#f26d8a7807b5985fba13cf61465b58ca5ff7dc57" + integrity sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg== + dependencies: + micromark-util-types "^2.0.0" + +micromark-extension-gfm-task-list-item@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz#bcc34d805639829990ec175c3eea12bb5b781f2c" + integrity sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz#3e13376ab95dd7a5cfd0e29560dfe999657b3c5b" + integrity sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w== + dependencies: + micromark-extension-gfm-autolink-literal "^2.0.0" + micromark-extension-gfm-footnote "^2.0.0" + micromark-extension-gfm-strikethrough "^2.0.0" + micromark-extension-gfm-table "^2.0.0" + micromark-extension-gfm-tagfilter "^2.0.0" + micromark-extension-gfm-task-list-item "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-mdx-expression@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz#43d058d999532fb3041195a3c3c05c46fa84543b" + integrity sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + micromark-factory-mdx-expression "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-mdx-jsx@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz#ffc98bdb649798902fa9fc5689f67f9c1c902044" + integrity sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + micromark-factory-mdx-expression "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + vfile-message "^4.0.0" + +micromark-extension-mdx-md@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz#1d252881ea35d74698423ab44917e1f5b197b92d" + integrity sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ== + dependencies: + micromark-util-types "^2.0.0" + +micromark-extension-mdxjs-esm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz#de21b2b045fd2059bd00d36746081de38390d54a" + integrity sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-position-from-estree "^2.0.0" + vfile-message "^4.0.0" + +micromark-extension-mdxjs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz#b5a2e0ed449288f3f6f6c544358159557549de18" + integrity sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ== + dependencies: + acorn "^8.0.0" + acorn-jsx "^5.0.0" + micromark-extension-mdx-expression "^3.0.0" + micromark-extension-mdx-jsx "^3.0.0" + micromark-extension-mdx-md "^2.0.0" + micromark-extension-mdxjs-esm "^3.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-destination@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz#8fef8e0f7081f0474fbdd92deb50c990a0264639" + integrity sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-label@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz#5267efa97f1e5254efc7f20b459a38cb21058ba1" + integrity sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg== + dependencies: + devlop "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-mdx-expression@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz#bb09988610589c07d1c1e4425285895041b3dfa9" + integrity sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-position-from-estree "^2.0.0" + vfile-message "^4.0.0" + +micromark-factory-space@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz#c8f40b0640a0150751d3345ed885a080b0d15faf" + integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-space@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz#36d0212e962b2b3121f8525fc7a3c7c029f334fc" + integrity sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-title@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz#237e4aa5d58a95863f01032d9ee9b090f1de6e94" + integrity sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-whitespace@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz#06b26b2983c4d27bfcc657b33e25134d4868b0b1" + integrity sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-character@^1.0.0, micromark-util-character@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.2.0.tgz#4fedaa3646db249bc58caeb000eb3549a8ca5dcc" + integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg== + dependencies: + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-character@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.1.1.tgz#2f987831a40d4c510ac261e89852c4e9703ccda6" + integrity sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q== + dependencies: + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-chunked@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz#47fbcd93471a3fccab86cff03847fc3552db1051" + integrity sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-classify-character@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz#d399faf9c45ca14c8b4be98b1ea481bced87b629" + integrity sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-combine-extensions@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz#2a0f490ab08bff5cc2fd5eec6dd0ca04f89b30a9" + integrity sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg== + dependencies: + micromark-util-chunked "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-decode-numeric-character-reference@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz#fcf15b660979388e6f118cdb6bf7d79d73d26fe5" + integrity sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-decode-string@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz#6cb99582e5d271e84efca8e61a807994d7161eb2" + integrity sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-encode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz#0d51d1c095551cfaac368326963cf55f15f540b8" + integrity sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw== + +micromark-util-events-to-acorn@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz#e7a8a6b55a47e5a06c720d5a1c4abae8c37c98f3" + integrity sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg== + dependencies: + "@types/estree" "^1.0.0" + "@types/unist" "^3.0.0" + devlop "^1.0.0" + estree-util-visit "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + vfile-message "^4.0.0" + +micromark-util-html-tag-name@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz#e40403096481986b41c106627f98f72d4d10b825" + integrity sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA== + +micromark-util-normalize-identifier@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz#c30d77b2e832acf6526f8bf1aa47bc9c9438c16d" + integrity sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-resolve-all@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz#e1a2d62cdd237230a2ae11839027b19381e31e8b" + integrity sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg== + dependencies: + micromark-util-types "^2.0.0" + +micromark-util-sanitize-uri@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz#ab89789b818a58752b73d6b55238621b7faa8fd7" + integrity sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-subtokenize@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz#d8ade5ba0f3197a1cf6a2999fbbfe6357a1a19ee" + integrity sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA== + dependencies: + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-symbol@^1.0.0, micromark-util-symbol@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz#813cd17837bdb912d069a12ebe3a44b6f7063142" + integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== + +micromark-util-symbol@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz#e5da494e8eb2b071a0d08fb34f6cefec6c0a19b8" + integrity sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q== + +micromark-util-types@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" + integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== + +micromark-util-types@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.2.tgz#f00225f5f5a0ebc3254f96c36b6605c4b393908e" + integrity sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA== + +micromark@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-4.0.2.tgz#91395a3e1884a198e62116e33c9c568e39936fdb" + integrity sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA== + dependencies: + "@types/debug" "^4.0.0" + debug "^4.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromatch@^4.0.2, micromatch@^4.0.5, micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +"mime-db@>= 1.43.0 < 2", mime-db@^1.54.0: + version "1.54.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" + integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== + +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== + +mime-types@2.1.18: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== + dependencies: + mime-db "~1.33.0" + +mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime-types@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.1.tgz#b1d94d6997a9b32fd69ebaed0db73de8acb519ce" + integrity sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA== + dependencies: + mime-db "^1.54.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +mimic-response@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-4.0.0.tgz#35468b19e7c75d10f5165ea25e75a5ceea7cf70f" + integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== + +mini-css-extract-plugin@^2.9.2: + version "2.9.2" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz#966031b468917a5446f4c24a80854b2947503c5b" + integrity sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w== + dependencies: + schema-utils "^4.0.0" + tapable "^2.2.1" + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e" + integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mrmime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.1.tgz#bc3e87f7987853a54c9850eeb1f1078cd44adddc" + integrity sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.3, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +nanoid@^3.3.16: + version "3.3.16" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.16.tgz#a04d8ec4b1f10009d2d533947aefe4293737816c" + integrity sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +negotiator@~0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-emoji@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-2.2.0.tgz#1d000e3c76e462577895be1b436f4aa2d6760eb0" + integrity sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw== + dependencies: + "@sindresorhus/is" "^4.6.0" + char-regex "^1.0.2" + emojilib "^2.4.0" + skin-tone "^2.0.0" + +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== + +node-releases@^2.0.27: + version "2.0.27" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.27.tgz#eedca519205cf20f650f61d56b070db111231e4e" + integrity sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +normalize-url@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.1.tgz#9b7d96af9836577c58f5883e939365fa15623a4a" + integrity sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nprogress@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" + integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== + +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +null-loader@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/null-loader/-/null-loader-4.0.1.tgz#8e63bd3a2dd3c64236a4679428632edd0a6dbc6a" + integrity sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.3: + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.0: + version "4.1.7" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + has-symbols "^1.1.0" + object-keys "^1.1.1" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1, on-finished@^2.4.1, on-finished@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.1.0.tgz#59da4f91c45f5f989c6e4bcedc5a3b0aed70ff65" + integrity sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A== + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^10.0.3: + version "10.2.0" + resolved "https://registry.yarnpkg.com/open/-/open-10.2.0.tgz#b9d855be007620e80b6fb05fac98141fe62db73c" + integrity sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA== + dependencies: + default-browser "^5.2.1" + define-lazy-prop "^3.0.0" + is-inside-container "^1.0.0" + wsl-utils "^0.1.0" + +open@^8.4.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +opener@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + +p-cancelable@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" + integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-queue@^6.6.2: + version "6.6.2" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" + integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== + dependencies: + eventemitter3 "^4.0.4" + p-timeout "^3.2.0" + +p-retry@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-6.2.1.tgz#81828f8dc61c6ef5a800585491572cc9892703af" + integrity sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ== + dependencies: + "@types/retry" "0.12.2" + is-network-error "^1.0.0" + retry "^0.13.1" + +p-timeout@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" + +package-json@^8.1.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-8.1.1.tgz#3e9948e43df40d1e8e78a85485f1070bf8f03dc8" + integrity sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA== + dependencies: + got "^12.1.0" + registry-auth-token "^5.0.1" + registry-url "^6.0.0" + semver "^7.3.7" + +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-entities@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.2.tgz#61d46f5ed28e4ee62e9ddc43d6b010188443f159" + integrity sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw== + dependencies: + "@types/unist" "^2.0.0" + character-entities-legacy "^3.0.0" + character-reference-invalid "^2.0.0" + decode-named-character-reference "^1.0.0" + is-alphanumerical "^2.0.0" + is-decimal "^2.0.0" + is-hexadecimal "^2.0.0" + +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-numeric-range@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz#7c63b61190d61e4d53a1197f0c83c47bb670ffa3" + integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== + +parse5-htmlparser2-tree-adapter@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz#b5a806548ed893a43e24ccb42fbb78069311e81b" + integrity sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g== + dependencies: + domhandler "^5.0.3" + parse5 "^7.0.0" + +parse5@^7.0.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.3.0.tgz#d7e224fa72399c7a175099f45fc2ad024b05ec05" + integrity sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw== + dependencies: + entities "^6.0.0" + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + +path-is-inside@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-3.3.0.tgz#f7f31d32e8518c2660862b644414b6d5c63a611b" + integrity sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw== + +path-to-regexp@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.9.0.tgz#5dc0753acbf8521ca2e0f137b4578b917b10cf24" + integrity sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g== + dependencies: + isarray "0.0.1" + +path-to-regexp@~0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" + integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.2.tgz#5a942915e26b372dc0f0e6753149a16e6b1c5601" + integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA== + +pkg-dir@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-7.0.0.tgz#8f0c08d6df4476756c5ff29b3282d0bab7517d11" + integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA== + dependencies: + find-up "^6.3.0" + +pkijs@^3.3.3: + version "3.4.0" + resolved "https://registry.yarnpkg.com/pkijs/-/pkijs-3.4.0.tgz#d9164def30ff6d97be2d88966d5e36192499ca9c" + integrity sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw== + dependencies: + "@noble/hashes" "1.4.0" + asn1js "^3.0.6" + bytestreamjs "^2.0.1" + pvtsutils "^1.3.6" + pvutils "^1.1.3" + tslib "^2.8.1" + +postcss-attribute-case-insensitive@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz#0c4500e3bcb2141848e89382c05b5a31c23033a3" + integrity sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw== + dependencies: + postcss-selector-parser "^7.0.0" + +postcss-calc@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-9.0.1.tgz#a744fd592438a93d6de0f1434c572670361eb6c6" + integrity sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ== + dependencies: + postcss-selector-parser "^6.0.11" + postcss-value-parser "^4.2.0" + +postcss-clamp@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-clamp/-/postcss-clamp-4.1.0.tgz#7263e95abadd8c2ba1bd911b0b5a5c9c93e02363" + integrity sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-functional-notation@^7.0.10: + version "7.0.10" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.10.tgz#f1e9c3e4371889dcdfeabfa8515464fd8338cedc" + integrity sha512-k9qX+aXHBiLTRrWoCJuUFI6F1iF6QJQUXNVWJVSbqZgj57jDhBlOvD8gNUGl35tgqDivbGLhZeW3Ongz4feuKA== + dependencies: + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/utilities" "^2.0.0" + +postcss-color-hex-alpha@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz#5dd3eba1f8facb4ea306cba6e3f7712e876b0c76" + integrity sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w== + dependencies: + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" + +postcss-color-rebeccapurple@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz#5ada28406ac47e0796dff4056b0a9d5a6ecead98" + integrity sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ== + dependencies: + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" + +postcss-colormin@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-6.1.0.tgz#076e8d3fb291fbff7b10e6b063be9da42ff6488d" + integrity sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw== + dependencies: + browserslist "^4.23.0" + caniuse-api "^3.0.0" + colord "^2.9.3" + postcss-value-parser "^4.2.0" + +postcss-convert-values@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz#3498387f8efedb817cbc63901d45bd1ceaa40f48" + integrity sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w== + dependencies: + browserslist "^4.23.0" + postcss-value-parser "^4.2.0" + +postcss-custom-media@^11.0.6: + version "11.0.6" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz#6b450e5bfa209efb736830066682e6567bd04967" + integrity sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw== + dependencies: + "@csstools/cascade-layer-name-parser" "^2.0.5" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/media-query-list-parser" "^4.0.3" + +postcss-custom-properties@^14.0.6: + version "14.0.6" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz#1af73a650bf115ba052cf915287c9982825fc90e" + integrity sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ== + dependencies: + "@csstools/cascade-layer-name-parser" "^2.0.5" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" + +postcss-custom-selectors@^8.0.5: + version "8.0.5" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz#9448ed37a12271d7ab6cb364b6f76a46a4a323e8" + integrity sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg== + dependencies: + "@csstools/cascade-layer-name-parser" "^2.0.5" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + postcss-selector-parser "^7.0.0" + +postcss-dir-pseudo-class@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz#80d9e842c9ae9d29f6bf5fd3cf9972891d6cc0ca" + integrity sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA== + dependencies: + postcss-selector-parser "^7.0.0" + +postcss-discard-comments@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz#e768dcfdc33e0216380623652b0a4f69f4678b6c" + integrity sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw== + +postcss-discard-duplicates@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz#d121e893c38dc58a67277f75bb58ba43fce4c3eb" + integrity sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw== + +postcss-discard-empty@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz#ee39c327219bb70473a066f772621f81435a79d9" + integrity sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ== + +postcss-discard-overridden@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz#4e9f9c62ecd2df46e8fdb44dc17e189776572e2d" + integrity sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ== + +postcss-discard-unused@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz#c1b0e8c032c6054c3fbd22aaddba5b248136f338" + integrity sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA== + dependencies: + postcss-selector-parser "^6.0.16" + +postcss-double-position-gradients@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.2.tgz#185f8eab2db9cf4e34be69b5706c905895bb52ae" + integrity sha512-7qTqnL7nfLRyJK/AHSVrrXOuvDDzettC+wGoienURV8v2svNbu6zJC52ruZtHaO6mfcagFmuTGFdzRsJKB3k5Q== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" + +postcss-focus-visible@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz#1f7904904368a2d1180b220595d77b6f8a957868" + integrity sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA== + dependencies: + postcss-selector-parser "^7.0.0" + +postcss-focus-within@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz#ac01ce80d3f2e8b2b3eac4ff84f8e15cd0057bc7" + integrity sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw== + dependencies: + postcss-selector-parser "^7.0.0" + +postcss-font-variant@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz#efd59b4b7ea8bb06127f2d031bfbb7f24d32fa66" + integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== + +postcss-gap-properties@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz#d5ff0bdf923c06686499ed2b12e125fe64054fed" + integrity sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw== + +postcss-image-set-function@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz#538e94e16716be47f9df0573b56bbaca86e1da53" + integrity sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA== + dependencies: + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" + +postcss-lab-function@^7.0.10: + version "7.0.10" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-7.0.10.tgz#0537bd7245b935fc133298c8896bcbd160540cae" + integrity sha512-tqs6TCEv9tC1Riq6fOzHuHcZyhg4k3gIAMB8GGY/zA1ssGdm6puHMVE7t75aOSoFg7UD2wyrFFhbldiCMyyFTQ== + dependencies: + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/utilities" "^2.0.0" + +postcss-loader@^7.3.4: + version "7.3.4" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.3.4.tgz#aed9b79ce4ed7e9e89e56199d25ad1ec8f606209" + integrity sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A== + dependencies: + cosmiconfig "^8.3.5" + jiti "^1.20.0" + semver "^7.5.4" + +postcss-logical@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-8.1.0.tgz#4092b16b49e3ecda70c4d8945257da403d167228" + integrity sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-merge-idents@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz#7b9c31c7bc823c94bec50f297f04e3c2b838ea65" + integrity sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g== + dependencies: + cssnano-utils "^4.0.2" + postcss-value-parser "^4.2.0" + +postcss-merge-longhand@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz#ba8a8d473617c34a36abbea8dda2b215750a065a" + integrity sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w== + dependencies: + postcss-value-parser "^4.2.0" + stylehacks "^6.1.1" + +postcss-merge-rules@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz#7aa539dceddab56019469c0edd7d22b64c3dea9d" + integrity sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ== + dependencies: + browserslist "^4.23.0" + caniuse-api "^3.0.0" + cssnano-utils "^4.0.2" + postcss-selector-parser "^6.0.16" + +postcss-minify-font-values@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz#a0e574c02ee3f299be2846369211f3b957ea4c59" + integrity sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-minify-gradients@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz#ca3eb55a7bdb48a1e187a55c6377be918743dbd6" + integrity sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q== + dependencies: + colord "^2.9.3" + cssnano-utils "^4.0.2" + postcss-value-parser "^4.2.0" + +postcss-minify-params@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz#54551dec77b9a45a29c3cb5953bf7325a399ba08" + integrity sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA== + dependencies: + browserslist "^4.23.0" + cssnano-utils "^4.0.2" + postcss-value-parser "^4.2.0" + +postcss-minify-selectors@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz#197f7d72e6dd19eed47916d575d69dc38b396aff" + integrity sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ== + dependencies: + postcss-selector-parser "^6.0.16" + +postcss-modules-extract-imports@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#b4497cb85a9c0c4b5aabeb759bb25e8d89f15002" + integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== + +postcss-modules-local-by-default@^4.0.5: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz#d150f43837831dae25e4085596e84f6f5d6ec368" + integrity sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^7.0.0" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz#1bbccddcb398f1d7a511e0a2d1d047718af4078c" + integrity sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA== + dependencies: + postcss-selector-parser "^7.0.0" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-nesting@^13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-13.0.1.tgz#c405796d7245a3e4c267a9956cacfe9670b5d43e" + integrity sha512-VbqqHkOBOt4Uu3G8Dm8n6lU5+9cJFxiuty9+4rcoyRPO9zZS1JIs6td49VIoix3qYqELHlJIn46Oih9SAKo+yQ== + dependencies: + "@csstools/selector-resolve-nested" "^3.0.0" + "@csstools/selector-specificity" "^5.0.0" + postcss-selector-parser "^7.0.0" + +postcss-normalize-charset@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz#1ec25c435057a8001dac942942a95ffe66f721e1" + integrity sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ== + +postcss-normalize-display-values@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz#54f02764fed0b288d5363cbb140d6950dbbdd535" + integrity sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-positions@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz#e982d284ec878b9b819796266f640852dbbb723a" + integrity sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-repeat-style@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz#f8006942fd0617c73f049dd8b6201c3a3040ecf3" + integrity sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-string@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz#e3cc6ad5c95581acd1fc8774b309dd7c06e5e363" + integrity sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-timing-functions@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz#40cb8726cef999de984527cbd9d1db1f3e9062c0" + integrity sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-unicode@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz#aaf8bbd34c306e230777e80f7f12a4b7d27ce06e" + integrity sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg== + dependencies: + browserslist "^4.23.0" + postcss-value-parser "^4.2.0" + +postcss-normalize-url@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz#292792386be51a8de9a454cb7b5c58ae22db0f79" + integrity sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-whitespace@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz#fbb009e6ebd312f8b2efb225c2fcc7cf32b400cd" + integrity sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-opacity-percentage@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz#0b0db5ed5db5670e067044b8030b89c216e1eb0a" + integrity sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ== + +postcss-ordered-values@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz#366bb663919707093451ab70c3f99c05672aaae5" + integrity sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q== + dependencies: + cssnano-utils "^4.0.2" + postcss-value-parser "^4.2.0" + +postcss-overflow-shorthand@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz#f5252b4a2ee16c68cd8a9029edb5370c4a9808af" + integrity sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-page-break@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-3.0.4.tgz#7fbf741c233621622b68d435babfb70dd8c1ee5f" + integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== + +postcss-place@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-10.0.0.tgz#ba36ee4786ca401377ced17a39d9050ed772e5a9" + integrity sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-preset-env@^10.2.1: + version "10.2.1" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-10.2.1.tgz#e4f60ea0366ce2632524a36cf5e50bec60ba2611" + integrity sha512-mDInnlm4mYhmR0S79hNLzseW9nx4Ihd8s15K99iu6u6QhoSQgqWX9Oj6nTd/8Dz3b0T7v2JSrfnXsDfv9TFvDg== + dependencies: + "@csstools/postcss-cascade-layers" "^5.0.1" + "@csstools/postcss-color-function" "^4.0.10" + "@csstools/postcss-color-mix-function" "^3.0.10" + "@csstools/postcss-color-mix-variadic-function-arguments" "^1.0.0" + "@csstools/postcss-content-alt-text" "^2.0.6" + "@csstools/postcss-exponential-functions" "^2.0.9" + "@csstools/postcss-font-format-keywords" "^4.0.0" + "@csstools/postcss-gamut-mapping" "^2.0.10" + "@csstools/postcss-gradients-interpolation-method" "^5.0.10" + "@csstools/postcss-hwb-function" "^4.0.10" + "@csstools/postcss-ic-unit" "^4.0.2" + "@csstools/postcss-initial" "^2.0.1" + "@csstools/postcss-is-pseudo-class" "^5.0.1" + "@csstools/postcss-light-dark-function" "^2.0.9" + "@csstools/postcss-logical-float-and-clear" "^3.0.0" + "@csstools/postcss-logical-overflow" "^2.0.0" + "@csstools/postcss-logical-overscroll-behavior" "^2.0.0" + "@csstools/postcss-logical-resize" "^3.0.0" + "@csstools/postcss-logical-viewport-units" "^3.0.4" + "@csstools/postcss-media-minmax" "^2.0.9" + "@csstools/postcss-media-queries-aspect-ratio-number-values" "^3.0.5" + "@csstools/postcss-nested-calc" "^4.0.0" + "@csstools/postcss-normalize-display-values" "^4.0.0" + "@csstools/postcss-oklab-function" "^4.0.10" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/postcss-random-function" "^2.0.1" + "@csstools/postcss-relative-color-syntax" "^3.0.10" + "@csstools/postcss-scope-pseudo-class" "^4.0.1" + "@csstools/postcss-sign-functions" "^1.1.4" + "@csstools/postcss-stepped-value-functions" "^4.0.9" + "@csstools/postcss-text-decoration-shorthand" "^4.0.2" + "@csstools/postcss-trigonometric-functions" "^4.0.9" + "@csstools/postcss-unset-value" "^4.0.0" + autoprefixer "^10.4.21" + browserslist "^4.25.0" + css-blank-pseudo "^7.0.1" + css-has-pseudo "^7.0.2" + css-prefers-color-scheme "^10.0.0" + cssdb "^8.3.0" + postcss-attribute-case-insensitive "^7.0.1" + postcss-clamp "^4.1.0" + postcss-color-functional-notation "^7.0.10" + postcss-color-hex-alpha "^10.0.0" + postcss-color-rebeccapurple "^10.0.0" + postcss-custom-media "^11.0.6" + postcss-custom-properties "^14.0.6" + postcss-custom-selectors "^8.0.5" + postcss-dir-pseudo-class "^9.0.1" + postcss-double-position-gradients "^6.0.2" + postcss-focus-visible "^10.0.1" + postcss-focus-within "^9.0.1" + postcss-font-variant "^5.0.0" + postcss-gap-properties "^6.0.0" + postcss-image-set-function "^7.0.0" + postcss-lab-function "^7.0.10" + postcss-logical "^8.1.0" + postcss-nesting "^13.0.1" + postcss-opacity-percentage "^3.0.0" + postcss-overflow-shorthand "^6.0.0" + postcss-page-break "^3.0.4" + postcss-place "^10.0.0" + postcss-pseudo-class-any-link "^10.0.1" + postcss-replace-overflow-wrap "^4.0.0" + postcss-selector-not "^8.0.1" + +postcss-pseudo-class-any-link@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz#06455431171bf44b84d79ebaeee9fd1c05946544" + integrity sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q== + dependencies: + postcss-selector-parser "^7.0.0" + +postcss-reduce-idents@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz#b0d9c84316d2a547714ebab523ec7d13704cd486" + integrity sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-reduce-initial@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz#4401297d8e35cb6e92c8e9586963e267105586ba" + integrity sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw== + dependencies: + browserslist "^4.23.0" + caniuse-api "^3.0.0" + +postcss-reduce-transforms@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz#6fa2c586bdc091a7373caeee4be75a0f3e12965d" + integrity sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-replace-overflow-wrap@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz#d2df6bed10b477bf9c52fab28c568b4b29ca4319" + integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== + +postcss-selector-not@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz#f2df9c6ac9f95e9fe4416ca41a957eda16130172" + integrity sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA== + dependencies: + postcss-selector-parser "^7.0.0" + +postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.16: + version "6.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" + integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-selector-parser@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz#4d6af97eba65d73bc4d84bcb343e865d7dd16262" + integrity sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-sort-media-queries@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz#4556b3f982ef27d3bac526b99b6c0d3359a6cf97" + integrity sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA== + dependencies: + sort-css-media-queries "2.2.0" + +postcss-svgo@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-6.0.3.tgz#1d6e180d6df1fa8a3b30b729aaa9161e94f04eaa" + integrity sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g== + dependencies: + postcss-value-parser "^4.2.0" + svgo "^3.2.0" + +postcss-unique-selectors@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz#983ab308896b4bf3f2baaf2336e14e52c11a2088" + integrity sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg== + dependencies: + postcss-selector-parser "^6.0.16" + +postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss-zindex@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-6.0.2.tgz#e498304b83a8b165755f53db40e2ea65a99b56e1" + integrity sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg== + +postcss@^8.4.21, postcss@^8.4.24, postcss@^8.4.33, postcss@^8.5.4: + version "8.5.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.23.tgz#3493550116f478487298301d2c2e8dc5a56e6594" + integrity sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg== + dependencies: + nanoid "^3.3.16" + picocolors "^1.1.1" + source-map-js "^1.2.1" + +pretty-error@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== + dependencies: + lodash "^4.17.20" + renderkid "^3.0.0" + +pretty-time@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" + integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== + +prism-react-renderer@^2.3.0, prism-react-renderer@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz#ac63b7f78e56c8f2b5e76e823a976d5ede77e35f" + integrity sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig== + dependencies: + "@types/prismjs" "^1.26.0" + clsx "^2.0.0" + +prismjs@^1.29.0: + version "1.30.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.30.0.tgz#d9709969d9d4e16403f6f348c63553b19f0975a9" + integrity sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +prompts@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.6.2, prop-types@^15.7.2: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +property-information@^6.0.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.5.0.tgz#6212fbb52ba757e92ef4fb9d657563b933b7ffec" + integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== + +property-information@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-7.1.0.tgz#b622e8646e02b580205415586b40804d3e8bfd5d" + integrity sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ== + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +pupa@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-3.1.0.tgz#f15610274376bbcc70c9a3aa8b505ea23f41c579" + integrity sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug== + dependencies: + escape-goat "^4.0.0" + +pvtsutils@^1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.6.tgz#ec46e34db7422b9e4fdc5490578c1883657d6001" + integrity sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg== + dependencies: + tslib "^2.8.1" + +pvutils@^1.1.3, pvutils@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.5.tgz#84b0dea4a5d670249aa9800511804ee0b7c2809c" + integrity sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA== + +qs@~6.15.1: + version "6.15.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.2.tgz#fd55426d710403ddccc45e0f9eab16db7727ece9" + integrity sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw== + dependencies: + side-channel "^1.1.0" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@~2.5.3: + version "2.5.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.3.tgz#11c6650ee770a7de1b494f197927de0c923822e2" + integrity sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA== + dependencies: + bytes "~3.1.2" + http-errors "~2.0.1" + iconv-lite "~0.4.24" + unpipe "~1.0.0" + +rc@1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-dom@^19.2.8: + version "19.2.8" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.8.tgz#3b46b9eeda877cdff2cf13d2770fff4ae36c2ec2" + integrity sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ== + dependencies: + scheduler "^0.27.0" + +react-fast-compare@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" + integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== + +"react-helmet-async@npm:@slorber/react-helmet-async@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@slorber/react-helmet-async/-/react-helmet-async-1.3.0.tgz#11fbc6094605cf60aa04a28c17e0aab894b4ecff" + integrity sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A== + dependencies: + "@babel/runtime" "^7.12.5" + invariant "^2.2.4" + prop-types "^15.7.2" + react-fast-compare "^3.2.0" + shallowequal "^1.1.0" + +react-image-gallery@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/react-image-gallery/-/react-image-gallery-2.1.2.tgz#17bef1af1e0a5281dc86e2774db48821ce8e0ef6" + integrity sha512-H+/elQ75DwdRbGJcAd4LnGDac115YxWp6u4d2O1jThkRVJMkJuQFLPvcnhGu5YFNwqk+tywg0c4D4SuQZ0KvGA== + +react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-json-view-lite@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/react-json-view-lite/-/react-json-view-lite-2.4.1.tgz#0d06696a06aaf4a74e890302b76cf8cddcc45d60" + integrity sha512-fwFYknRIBxjbFm0kBDrzgBy1xa5tDg2LyXXBepC5f1b+MY3BUClMCsvanMPn089JbV1Eg3nZcrp0VCuH43aXnA== + +react-loadable-ssr-addon-v5-slorber@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.3.tgz#bb3791bf481222c63a5bc6b96ee23f68cb5614b9" + integrity sha512-GXfh9VLwB5ERaCsU6RULh7tkemeX15aNh6wuMEBtfdyMa7fFG8TXrhXlx1SoEK2Ty/l6XIkzzYIQmyaWW3JgdQ== + dependencies: + "@babel/runtime" "^7.10.3" + +"react-loadable@npm:@docusaurus/react-loadable@6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz#de6c7f73c96542bd70786b8e522d535d69069dc4" + integrity sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ== + dependencies: + "@types/react" "*" + +react-router-config@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/react-router-config/-/react-router-config-5.1.1.tgz#0f4263d1a80c6b2dc7b9c1902c9526478194a988" + integrity sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg== + dependencies: + "@babel/runtime" "^7.1.2" + +react-router-dom@^5.3.4: + version "5.3.4" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.4.tgz#2ed62ffd88cae6db134445f4a0c0ae8b91d2e5e6" + integrity sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + loose-envify "^1.3.1" + prop-types "^15.6.2" + react-router "5.3.4" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-router@5.3.4, react-router@^5.3.4: + version "5.3.4" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.4.tgz#8ca252d70fcc37841e31473c7a151cf777887bb5" + integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + hoist-non-react-statics "^3.1.0" + loose-envify "^1.3.1" + path-to-regexp "^1.7.0" + prop-types "^15.6.2" + react-is "^16.6.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react@^19.2.8: + version "19.2.8" + resolved "https://registry.yarnpkg.com/react/-/react-19.2.8.tgz#a80663dbb58d69c6fe3fd291d3cb324e8a7dff2d" + integrity sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw== + +readable-stream@^2.0.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +recma-build-jsx@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz#c02f29e047e103d2fab2054954e1761b8ea253c4" + integrity sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew== + dependencies: + "@types/estree" "^1.0.0" + estree-util-build-jsx "^3.0.0" + vfile "^6.0.0" + +recma-jsx@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/recma-jsx/-/recma-jsx-1.0.0.tgz#f7bef02e571a49d6ba3efdfda8e2efab48dbe3aa" + integrity sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q== + dependencies: + acorn-jsx "^5.0.0" + estree-util-to-js "^2.0.0" + recma-parse "^1.0.0" + recma-stringify "^1.0.0" + unified "^11.0.0" + +recma-parse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/recma-parse/-/recma-parse-1.0.0.tgz#c351e161bb0ab47d86b92a98a9d891f9b6814b52" + integrity sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ== + dependencies: + "@types/estree" "^1.0.0" + esast-util-from-js "^2.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +recma-stringify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/recma-stringify/-/recma-stringify-1.0.0.tgz#54632030631e0c7546136ff9ef8fde8e7b44f130" + integrity sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g== + dependencies: + "@types/estree" "^1.0.0" + estree-util-to-js "^2.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +reflect-metadata@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b" + integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== + +regenerate-unicode-properties@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz#626e39df8c372338ea9b8028d1f99dc3fd9c3db0" + integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regexpu-core@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.2.0.tgz#0e5190d79e542bf294955dccabae04d3c7d53826" + integrity sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.2.0" + regjsgen "^0.8.0" + regjsparser "^0.12.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +registry-auth-token@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.1.0.tgz#3c659047ecd4caebd25bc1570a3aa979ae490eca" + integrity sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw== + dependencies: + "@pnpm/npm-conf" "^2.1.0" + +registry-url@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-6.0.1.tgz#056d9343680f2f64400032b1e199faa692286c58" + integrity sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q== + dependencies: + rc "1.2.8" + +regjsgen@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" + integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== + +regjsparser@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.12.0.tgz#0e846df6c6530586429377de56e0475583b088dc" + integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== + dependencies: + jsesc "~3.0.2" + +rehype-raw@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-7.0.0.tgz#59d7348fd5dbef3807bbaa1d443efd2dd85ecee4" + integrity sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww== + dependencies: + "@types/hast" "^3.0.0" + hast-util-raw "^9.0.0" + vfile "^6.0.0" + +rehype-recma@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rehype-recma/-/rehype-recma-1.0.0.tgz#d68ef6344d05916bd96e25400c6261775411aa76" + integrity sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw== + dependencies: + "@types/estree" "^1.0.0" + "@types/hast" "^3.0.0" + hast-util-to-estree "^3.0.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== + +remark-directive@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/remark-directive/-/remark-directive-3.0.1.tgz#689ba332f156cfe1118e849164cc81f157a3ef0a" + integrity sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-directive "^3.0.0" + micromark-extension-directive "^3.0.0" + unified "^11.0.0" + +remark-emoji@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-4.0.1.tgz#671bfda668047689e26b2078c7356540da299f04" + integrity sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg== + dependencies: + "@types/mdast" "^4.0.2" + emoticon "^4.0.1" + mdast-util-find-and-replace "^3.0.1" + node-emoji "^2.1.0" + unified "^11.0.4" + +remark-frontmatter@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz#b68d61552a421ec412c76f4f66c344627dc187a2" + integrity sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-frontmatter "^2.0.0" + micromark-extension-frontmatter "^2.0.0" + unified "^11.0.0" + +remark-gfm@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-4.0.1.tgz#33227b2a74397670d357bf05c098eaf8513f0d6b" + integrity sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-gfm "^3.0.0" + micromark-extension-gfm "^3.0.0" + remark-parse "^11.0.0" + remark-stringify "^11.0.0" + unified "^11.0.0" + +remark-mdx@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-3.1.0.tgz#f979be729ecb35318fa48e2135c1169607a78343" + integrity sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA== + dependencies: + mdast-util-mdx "^3.0.0" + micromark-extension-mdxjs "^3.0.0" + +remark-parse@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-11.0.0.tgz#aa60743fcb37ebf6b069204eb4da304e40db45a1" + integrity sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + micromark-util-types "^2.0.0" + unified "^11.0.0" + +remark-rehype@^11.0.0: + version "11.1.2" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.1.2.tgz#2addaadda80ca9bd9aa0da763e74d16327683b37" + integrity sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + mdast-util-to-hast "^13.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +remark-stringify@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-11.0.0.tgz#4c5b01dd711c269df1aaae11743eb7e2e7636fd3" + integrity sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-to-markdown "^2.0.0" + unified "^11.0.0" + +renderkid@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" + integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^6.0.1" + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +"require-like@>= 0.1.1": + version "0.1.2" + resolved "https://registry.yarnpkg.com/require-like/-/require-like-0.1.2.tgz#ad6f30c13becd797010c468afa775c0c0a6b47fa" + integrity sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-alpn@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-pathname@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" + integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== + +resolve@^1.14.2: + version "1.22.10" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== + dependencies: + is-core-module "^2.16.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +responselike@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-3.0.0.tgz#20decb6c298aff0dbee1c355ca95461d42823626" + integrity sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg== + dependencies: + lowercase-keys "^3.0.0" + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== + +rtlcss@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/rtlcss/-/rtlcss-4.3.0.tgz#f8efd4d5b64f640ec4af8fa25b65bacd9e07cc97" + integrity sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + postcss "^8.4.21" + strip-json-comments "^3.1.1" + +run-applescript@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.1.0.tgz#2e9e54c4664ec3106c5b5630e249d3d6595c4911" + integrity sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" + integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== + +sax@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.5.0.tgz#b5549b671069b7aa392df55ec7574cf411179eb8" + integrity sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA== + +scheduler@^0.27.0: + version "0.27.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.27.0.tgz#0c4ef82d67d1e5c1e359e8fc76d3a87f045fe5bd" + integrity sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q== + +schema-dts@^1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/schema-dts/-/schema-dts-1.1.5.tgz#9237725d305bac3469f02b292a035107595dc324" + integrity sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg== + +schema-utils@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0, schema-utils@^4.0.1, schema-utils@^4.2.0, schema-utils@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.2.tgz#0c10878bf4a73fd2b1dfd14b9462b26788c806ae" + integrity sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.9.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.1.0" + +schema-utils@^4.3.3: + version "4.3.3" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.3.tgz#5b1850912fa31df90716963d45d9121fdfc09f46" + integrity sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.9.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.1.0" + +section-matter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" + integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== + dependencies: + extend-shallow "^2.0.1" + kind-of "^6.0.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + +selfsigned@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-5.5.0.tgz#4c9ab7c7c9f35f18fb6a9882c253eb0e6bd6557b" + integrity sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew== + dependencies: + "@peculiar/x509" "^1.14.2" + pkijs "^3.3.3" + +semver-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-4.0.0.tgz#3afcf5ed6d62259f5c72d0d5d50dffbdc9680df5" + integrity sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA== + dependencies: + semver "^7.3.5" + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.5, semver@^7.3.7, semver@^7.5.4: + version "7.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== + +send@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +send@~0.19.0: + version "0.19.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.1.tgz#1c2563b2ee4fe510b806b21ec46f355005a369f9" + integrity sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~2.0.0" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-javascript@^6.0.0, serialize-javascript@^6.0.1, serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + +serve-handler@^6.1.7: + version "6.1.7" + resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.7.tgz#e9bb864e87ee71e8dab874cde44d146b77e3fb78" + integrity sha512-CinAq1xWb0vR3twAv9evEU8cNWkXCb9kd5ePAHUKJBkOsUpR1wt/CvGdeca7vqumL1U5cSaeVQ6zZMxiJ3yWsg== + dependencies: + bytes "3.0.0" + content-disposition "0.5.2" + mime-types "2.1.18" + minimatch "3.1.5" + path-is-inside "1.0.2" + path-to-regexp "3.3.0" + range-parser "1.2.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@~1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== + dependencies: + encodeurl "~2.0.0" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.19.0" + +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0, setprototypeof@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.8.4: + version "1.10.0" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.10.0.tgz#482033e192e4f5c07151521ffa03400ec71b1b0f" + integrity sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA== + +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + +signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sirv@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.4.tgz#5dd9a725c578e34e449f332703eb2a74e46a29b0" + integrity sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ== + dependencies: + "@polka/url" "^1.0.0-next.24" + mrmime "^2.0.0" + totalist "^3.0.0" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +sitemap@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-7.1.2.tgz#6ce1deb43f6f177c68bc59cf93632f54e3ae6b72" + integrity sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw== + dependencies: + "@types/node" "^17.0.5" + "@types/sax" "^1.2.1" + arg "^5.0.0" + sax "^1.2.4" + +skin-tone@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/skin-tone/-/skin-tone-2.0.0.tgz#4e3933ab45c0d4f4f781745d64b9f4c208e41237" + integrity sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA== + dependencies: + unicode-emoji-modifier-base "^1.0.0" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +snake-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +sort-css-media-queries@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz#aa33cf4a08e0225059448b6c40eddbf9f1c8334c" + integrity sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA== + +source-map-js@^1.0.1, source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@~0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.0: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + +space-separated-tokens@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +srcset@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/srcset/-/srcset-4.0.0.tgz#336816b665b14cd013ba545b6fe62357f86e65f4" + integrity sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +statuses@~2.0.1, statuses@~2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" + integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== + +std-env@^3.7.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.9.0.tgz#1a6f7243b339dca4c9fd55e1c7504c77ef23e8f1" + integrity sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw== + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-entities@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.4.tgz#b3b79ef5f277cc4ac73caeb0236c5ba939b3a4f3" + integrity sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg== + dependencies: + character-entities-html4 "^2.0.0" + character-entities-legacy "^3.0.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +style-to-js@^1.0.0: + version "1.1.16" + resolved "https://registry.yarnpkg.com/style-to-js/-/style-to-js-1.1.16.tgz#e6bd6cd29e250bcf8fa5e6591d07ced7575dbe7a" + integrity sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw== + dependencies: + style-to-object "1.0.8" + +style-to-object@1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-1.0.8.tgz#67a29bca47eaa587db18118d68f9d95955e81292" + integrity sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g== + dependencies: + inline-style-parser "0.2.4" + +stylehacks@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-6.1.1.tgz#543f91c10d17d00a440430362d419f79c25545a6" + integrity sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg== + dependencies: + browserslist "^4.23.0" + postcss-selector-parser "^6.0.16" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svg-parser@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svgo@^3.0.2, svgo@^3.2.0: + version "3.3.4" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.3.4.tgz#fd2aa10ff585b3bd2b83ce3602f5582bc0718bb5" + integrity sha512-GsNRis4e8jxn2Y9ENz/8lbJ93CstG8svtMnuRaHbiF2LTJ5tK0/q3t/URPq9Zc7zVWBJnNnJMIp6bevK7bSmNg== + dependencies: + commander "^7.2.0" + css-select "^5.1.0" + css-tree "^2.3.1" + css-what "^6.1.0" + csso "^5.0.5" + picocolors "^1.0.0" + sax "^1.5.0" + +tapable@^2.0.0, tapable@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.2.tgz#ab4984340d30cb9989a490032f086dbb8b56d872" + integrity sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg== + +tapable@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.0.tgz#7e3ea6d5ca31ba8e078b560f0d83ce9a14aa8be6" + integrity sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg== + +terser-webpack-plugin@^5.3.16: + version "5.3.16" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz#741e448cc3f93d8026ebe4f7ef9e4afacfd56330" + integrity sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q== + dependencies: + "@jridgewell/trace-mapping" "^0.3.25" + jest-worker "^27.4.5" + schema-utils "^4.3.0" + serialize-javascript "^6.0.2" + terser "^5.31.1" + +terser-webpack-plugin@^5.3.9: + version "5.3.14" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz#9031d48e57ab27567f02ace85c7d690db66c3e06" + integrity sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.25" + jest-worker "^27.4.5" + schema-utils "^4.3.0" + serialize-javascript "^6.0.2" + terser "^5.31.1" + +terser@^5.10.0, terser@^5.15.1, terser@^5.31.1: + version "5.41.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.41.0.tgz#11646bba11eff72d506fbafbd0086f57173141e1" + integrity sha512-H406eLPXpZbAX14+B8psIuvIr8+3c+2hkuYzpMkoE0ij+NdsVATbA78vb8neA/eqrj7rywa2pIkdmWRsXW6wmw== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.14.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +thingies@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/thingies/-/thingies-2.5.0.tgz#5f7b882c933b85989f8466b528a6247a6881e04f" + integrity sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw== + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +tiny-invariant@^1.0.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" + integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== + +tiny-warning@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +tinypool@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.1.0.tgz#4252913ec76ef8f728f2524e2118f3bef9cf23f4" + integrity sha512-7CotroY9a8DKsKprEy/a14aCCm8jYVmR7aFy4fpkZM8sdpNJbKkixuNjgM50yCmip2ezc8z4N7k3oe2+rfRJCQ== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1, toidentifier@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +totalist@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" + integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== + +tree-dump@^1.0.3: + version "1.1.0" + resolved "https://registry.yarnpkg.com/tree-dump/-/tree-dump-1.1.0.tgz#ab29129169dc46004414f5a9d4a3c6e89f13e8a4" + integrity sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA== + +trim-lines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== + +trough@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.2.0.tgz#94a60bd6bd375c152c1df911a4b11d5b0256f50f" + integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== + +tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.6.0, tslib@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +tsyringe@^4.10.0: + version "4.10.0" + resolved "https://registry.yarnpkg.com/tsyringe/-/tsyringe-4.10.0.tgz#d0c95815d584464214060285eaaadd94aa03299c" + integrity sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw== + dependencies: + tslib "^1.9.3" + +type-fest@^1.0.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== + +type-fest@^2.13.0, type-fest@^2.5.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +undici-types@~6.21.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" + integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz#cb3173fe47ca743e228216e4a3ddc4c84d628cc2" + integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg== + +unicode-emoji-modifier-base@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz#dbbd5b54ba30f287e2a8d5a249da6c0cef369459" + integrity sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz#a0401aee72714598f739b68b104e4fe3a0cb3c71" + integrity sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +unified@^11.0.0, unified@^11.0.3, unified@^11.0.4: + version "11.0.5" + resolved "https://registry.yarnpkg.com/unified/-/unified-11.0.5.tgz#f66677610a5c0a9ee90cab2b8d4d66037026d9e1" + integrity sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA== + dependencies: + "@types/unist" "^3.0.0" + bail "^2.0.0" + devlop "^1.0.0" + extend "^3.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^6.0.0" + +unique-string@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-3.0.0.tgz#84a1c377aff5fd7a8bc6b55d8244b2bd90d75b9a" + integrity sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ== + dependencies: + crypto-random-string "^4.0.0" + +unist-util-is@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" + integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-position-from-estree@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz#d94da4df596529d1faa3de506202f0c9a23f2200" + integrity sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" + integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-stringify-position@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" + integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-visit-parents@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" + integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + +unist-util-visit@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" + integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" + integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + +update-browserslist-db@^1.2.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d" + integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + +update-notifier@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-6.0.2.tgz#a6990253dfe6d5a02bd04fbb6a61543f55026b60" + integrity sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og== + dependencies: + boxen "^7.0.0" + chalk "^5.0.1" + configstore "^6.0.0" + has-yarn "^3.0.0" + import-lazy "^4.0.0" + is-ci "^3.0.1" + is-installed-globally "^0.4.0" + is-npm "^6.0.0" + is-yarn-global "^0.4.0" + latest-version "^7.0.0" + pupa "^3.1.0" + semver "^7.3.7" + semver-diff "^4.0.0" + xdg-basedir "^5.1.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-loader@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== + +utility-types@^3.10.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.11.0.tgz#607c40edb4f258915e901ea7995607fdf319424c" + integrity sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +value-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" + integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +vfile-location@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-5.0.3.tgz#cb9eacd20f2b6426d19451e0eafa3d0a846225c3" + integrity sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg== + dependencies: + "@types/unist" "^3.0.0" + vfile "^6.0.0" + +vfile-message@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.2.tgz#c883c9f677c72c166362fd635f21fc165a7d1181" + integrity sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" + +vfile@^6.0.0, vfile@^6.0.1: + version "6.0.3" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-6.0.3.tgz#3652ab1c496531852bf55a6bac57af981ebc38ab" + integrity sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q== + dependencies: + "@types/unist" "^3.0.0" + vfile-message "^4.0.0" + +watchpack@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.5.1.tgz#dd38b601f669e0cbf567cb802e75cead82cde102" + integrity sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +web-namespaces@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" + integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== + +webpack-bundle-analyzer@^4.10.2: + version "4.10.2" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz#633af2862c213730be3dbdf40456db171b60d5bd" + integrity sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw== + dependencies: + "@discoveryjs/json-ext" "0.5.7" + acorn "^8.0.4" + acorn-walk "^8.0.0" + commander "^7.2.0" + debounce "^1.2.1" + escape-string-regexp "^4.0.0" + gzip-size "^6.0.0" + html-escaper "^2.0.2" + opener "^1.5.2" + picocolors "^1.0.0" + sirv "^2.0.3" + ws "^7.3.1" + +webpack-dev-middleware@^7.4.2: + version "7.4.5" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz#d4e8720aa29cb03bc158084a94edb4594e3b7ac0" + integrity sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA== + dependencies: + colorette "^2.0.10" + memfs "^4.43.1" + mime-types "^3.0.1" + on-finished "^2.4.1" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@^5.2.2: + version "5.2.6" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-5.2.6.tgz#3a5d41233cbb7504f814d19e59a59173fb8ae23d" + integrity sha512-HNLRmamRvVavZQ+avceZifmv8hmdUjg43t6MI4SqJDwFdW7RPQwH5vzGhDRZSX59SgfbeHhLnq3g+uooWo7pVw== + dependencies: + "@types/bonjour" "^3.5.13" + "@types/connect-history-api-fallback" "^1.5.4" + "@types/express" "^4.17.25" + "@types/express-serve-static-core" "^4.17.21" + "@types/serve-index" "^1.9.4" + "@types/serve-static" "^1.15.5" + "@types/sockjs" "^0.3.36" + "@types/ws" "^8.5.10" + ansi-html-community "^0.0.8" + bonjour-service "^1.2.1" + chokidar "^3.6.0" + colorette "^2.0.10" + compression "^1.8.1" + connect-history-api-fallback "^2.0.0" + express "^4.22.1" + graceful-fs "^4.2.6" + http-proxy-middleware "^2.0.9" + ipaddr.js "^2.1.0" + launch-editor "^2.14.1" + open "^10.0.3" + p-retry "^6.2.0" + schema-utils "^4.2.0" + selfsigned "^5.5.0" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^7.4.2" + ws "^8.18.0" + +webpack-merge@^5.9.0: + version "5.10.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" + integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== + dependencies: + clone-deep "^4.0.1" + flat "^5.0.2" + wildcard "^2.0.0" + +webpack-merge@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-6.0.1.tgz#50c776868e080574725abc5869bd6e4ef0a16c6a" + integrity sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg== + dependencies: + clone-deep "^4.0.1" + flat "^5.0.2" + wildcard "^2.0.1" + +webpack-sources@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.3.3.tgz#d4bf7f9909675d7a070ff14d0ef2a4f3c982c723" + integrity sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg== + +webpack@^5.88.1, webpack@^5.95.0: + version "5.105.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.105.0.tgz#38b5e6c5db8cbe81debbd16e089335ada05ea23a" + integrity sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw== + dependencies: + "@types/eslint-scope" "^3.7.7" + "@types/estree" "^1.0.8" + "@types/json-schema" "^7.0.15" + "@webassemblyjs/ast" "^1.14.1" + "@webassemblyjs/wasm-edit" "^1.14.1" + "@webassemblyjs/wasm-parser" "^1.14.1" + acorn "^8.15.0" + acorn-import-phases "^1.0.3" + browserslist "^4.28.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.19.0" + es-module-lexer "^2.0.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.11" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.3.1" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^4.3.3" + tapable "^2.3.0" + terser-webpack-plugin "^5.3.16" + watchpack "^2.5.1" + webpack-sources "^3.3.3" + +webpackbar@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-7.0.0.tgz#7228d32881af2392381b6514499ddea73cdf218a" + integrity sha512-aS9soqSO2iCHgqHoCrj4LbfGQUboDCYJPSFOAchEK+9psIjNrfSWW4Y0YEz67MKURNvMmfo0ycOg9d/+OOf9/Q== + dependencies: + ansis "^3.2.0" + consola "^3.2.3" + pretty-time "^1.1.0" + std-env "^3.7.0" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.5" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.5.tgz#569d22764ab21f2de20af0e74b411e8ae5a0fa46" + integrity sha512-ZL2+3c7kMBdIRCMz6l8jQMHyGVxj+UL+xVk74Ombiciboca8rHa15L86B19E5oh1pL9Ii/uj54gtsIrZGMo6zA== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +widest-line@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-4.0.1.tgz#a0fc673aaba1ea6f0a0d35b3c2795c9a9cc2ebf2" + integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== + dependencies: + string-width "^5.0.1" + +wildcard@^2.0.0, wildcard@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== + +wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +write-file-atomic@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@^7.3.1: + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== + +ws@^8.18.0: + version "8.18.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.3.tgz#b56b88abffde62791c639170400c93dcb0c95472" + integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg== + +wsl-utils@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/wsl-utils/-/wsl-utils-0.1.0.tgz#8783d4df671d4d50365be2ee4c71917a0557baab" + integrity sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw== + dependencies: + is-wsl "^3.1.0" + +xdg-basedir@^5.0.1, xdg-basedir@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" + integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== + +xml-js@^1.6.11: + version "1.6.11" + resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.11.tgz#927d2f6947f7f1c19a316dd8eea3614e8b18f8e9" + integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== + dependencies: + sax "^1.2.4" + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yocto-queue@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.2.1.tgz#36d7c4739f775b3cbc28e6136e21aa057adec418" + integrity sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg== + +zwitch@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== diff --git a/WinGet/manifests/b/BornToBeRoot/NETworkManager/2021.11.30.0/BornToBeRoot.NETworkManager.yaml b/WinGet/manifests/b/BornToBeRoot/NETworkManager/2021.11.30.0/BornToBeRoot.NETworkManager.yaml deleted file mode 100644 index 04e86f85a1..0000000000 --- a/WinGet/manifests/b/BornToBeRoot/NETworkManager/2021.11.30.0/BornToBeRoot.NETworkManager.yaml +++ /dev/null @@ -1,27 +0,0 @@ -PackageIdentifier: BornToBeRoot.NETworkManager -PackageVersion: 2021.11.30.0 -PackageName: NETworkManager -Publisher: BornToBeRoot -ShortDescription: A powerful tool for managing networks and troubleshoot network problems! -PackageUrl: https://borntoberoot.net/NETworkManager -License: GNU General Public License v3.0 -LicenseUrl: https://github.com/BornToBeRoot/NETworkManager/blob/master/LICENSE -Moniker: networkmanager -Tags: -- wifi -- ipscanner -- portscanner -- traceroute -- pingmonitor -- dns -- remotedesktop -- putty -- lldp -Installers: -- Architecture: x64 - InstallerUrl: https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.11.30.0/NETworkManager_2021.11.30.0_Setup.exe - InstallerType: inno - InstallerSha256: AFDA99002A95D78127A26ADCED00F1A86DCBDB6DA0782A761088FFBF3BFF1DF9 -PackageLocale: en-US -ManifestType: singleton -ManifestVersion: 1.0.0 diff --git a/WinGet/manifests/b/BornToBeRoot/NETworkManager/2021.5.9.0/BornToBeRoot.NETworkManager.yaml b/WinGet/manifests/b/BornToBeRoot/NETworkManager/2021.5.9.0/BornToBeRoot.NETworkManager.yaml deleted file mode 100644 index 1ffde1ee69..0000000000 --- a/WinGet/manifests/b/BornToBeRoot/NETworkManager/2021.5.9.0/BornToBeRoot.NETworkManager.yaml +++ /dev/null @@ -1,27 +0,0 @@ -PackageIdentifier: BornToBeRoot.NETworkManager -PackageVersion: 2021.5.9.0 -PackageName: NETworkManager -Publisher: BornToBeRoot -ShortDescription: A powerful tool for managing networks and troubleshoot network problems! -PackageUrl: https://borntoberoot.net/NETworkManager -License: GNU General Public License v3.0 -LicenseUrl: https://github.com/BornToBeRoot/NETworkManager/blob/master/LICENSE -Moniker: networkmanager -Tags: -- wifi -- ipscanner -- portscanner -- traceroute -- pingmonitor -- dns -- remotedesktop -- putty -- lldp -Installers: -- Architecture: x64 - InstallerUrl: https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.5.9.0/NETworkManager_2021.5.9.0_Setup.exe - InstallerType: inno - InstallerSha256: 1D44A5A07975A8364DE742E061E0D72B3DD1CC03E02F4D87103A0767E3C7F7A2 -PackageLocale: en-US -ManifestType: singleton -ManifestVersion: 1.0.0 diff --git a/WinGet/manifests/b/BornToBeRoot/NETworkManager/2021.6.26.0/BornToBeRoot.NETworkManager.yaml b/WinGet/manifests/b/BornToBeRoot/NETworkManager/2021.6.26.0/BornToBeRoot.NETworkManager.yaml deleted file mode 100644 index 8ac448243e..0000000000 --- a/WinGet/manifests/b/BornToBeRoot/NETworkManager/2021.6.26.0/BornToBeRoot.NETworkManager.yaml +++ /dev/null @@ -1,27 +0,0 @@ -PackageIdentifier: BornToBeRoot.NETworkManager -PackageVersion: 2021.6.26.0 -PackageName: NETworkManager -Publisher: BornToBeRoot -ShortDescription: A powerful tool for managing networks and troubleshoot network problems! -PackageUrl: https://borntoberoot.net/NETworkManager -License: GNU General Public License v3.0 -LicenseUrl: https://github.com/BornToBeRoot/NETworkManager/blob/master/LICENSE -Moniker: networkmanager -Tags: -- wifi -- ipscanner -- portscanner -- traceroute -- pingmonitor -- dns -- remotedesktop -- putty -- lldp -Installers: -- Architecture: x64 - InstallerUrl: https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.6.26.0/NETworkManager_2021.6.26.0_Setup.exe - InstallerType: inno - InstallerSha256: EAA8D1CC1F76FABD0C26DF70B9E23A21F9F83355D70D0FCCD43E5677A1AE7EAE -PackageLocale: en-US -ManifestType: singleton -ManifestVersion: 1.0.0 diff --git a/WinGet/manifests/b/BornToBeRoot/NETworkManager/2021.9.5.0/BornToBeRoot.NETworkManager.yaml b/WinGet/manifests/b/BornToBeRoot/NETworkManager/2021.9.5.0/BornToBeRoot.NETworkManager.yaml deleted file mode 100644 index a82644f983..0000000000 --- a/WinGet/manifests/b/BornToBeRoot/NETworkManager/2021.9.5.0/BornToBeRoot.NETworkManager.yaml +++ /dev/null @@ -1,27 +0,0 @@ -PackageIdentifier: BornToBeRoot.NETworkManager -PackageVersion: 2021.9.5.0 -PackageName: NETworkManager -Publisher: BornToBeRoot -ShortDescription: A powerful tool for managing networks and troubleshoot network problems! -PackageUrl: https://borntoberoot.net/NETworkManager -License: GNU General Public License v3.0 -LicenseUrl: https://github.com/BornToBeRoot/NETworkManager/blob/master/LICENSE -Moniker: networkmanager -Tags: -- wifi -- ipscanner -- portscanner -- traceroute -- pingmonitor -- dns -- remotedesktop -- putty -- lldp -Installers: -- Architecture: x64 - InstallerUrl: https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.9.5.0/NETworkManager_2021.9.5.0_Setup.exe - InstallerType: inno - InstallerSha256: 883188AD58FB936FCA82846A261840F67E19734C20093996CBCDA75F4CE41EAA -PackageLocale: en-US -ManifestType: singleton -ManifestVersion: 1.0.0 diff --git a/WinGet/manifests/b/BornToBeRoot/NETworkManager/2024.5.27.0/BornToBeRoot.NETworkManager.installer.yaml b/WinGet/manifests/b/BornToBeRoot/NETworkManager/2024.5.27.0/BornToBeRoot.NETworkManager.installer.yaml new file mode 100644 index 0000000000..27d3021777 --- /dev/null +++ b/WinGet/manifests/b/BornToBeRoot/NETworkManager/2024.5.27.0/BornToBeRoot.NETworkManager.installer.yaml @@ -0,0 +1,24 @@ +# Created using WinGet Automation (CLI) + +# yaml-language-server: $schema=https://aka.ms/winget-manifest.installer.1.4.0.schema.json + +PackageIdentifier: BornToBeRoot.NETworkManager +PackageVersion: 2024.5.27.0 +Installers: +- Architecture: x64 + InstallerUrl: https://github.com/BornToBeRoot/NETworkManager/releases/download/2024.5.27.0/NETworkManager_2024.5.27.0_Setup.msi + InstallerSha256: be6a466acd8912b21702a8d07cc45d7def7d177a6bfc3bde2ab97e1dbe8e9cea +ProductCode: '{e343d8ab-ed71-41d1-9784-6f6860bda078}' +ManifestType: installer +ManifestVersion: 1.5.0 +InstallerLocale: en-US +Platform: +- Windows.Desktop +InstallerType: wix +Scope: machine +InstallModes: +- interactive +- silent +- silentWithProgress +UpgradeBehavior: install +ReleaseDate: "2024-05-27" diff --git a/WinGet/manifests/b/BornToBeRoot/NETworkManager/2024.5.27.0/BornToBeRoot.NETworkManager.locale.en-US.yaml b/WinGet/manifests/b/BornToBeRoot/NETworkManager/2024.5.27.0/BornToBeRoot.NETworkManager.locale.en-US.yaml new file mode 100644 index 0000000000..3010e8f54c --- /dev/null +++ b/WinGet/manifests/b/BornToBeRoot/NETworkManager/2024.5.27.0/BornToBeRoot.NETworkManager.locale.en-US.yaml @@ -0,0 +1,32 @@ +# Created using WinGet Automation (CLI) + +# yaml-language-server: $schema=https://aka.ms/winget-manifest.defaultLocale.1.4.0.schema.json + +PackageIdentifier: BornToBeRoot.NETworkManager +PackageVersion: 2024.5.27.0 +PackageLocale: en-US +Publisher: BornToBeRoot +PublisherUrl: https://github.com/BornToBeRoot/NETworkManager +PublisherSupportUrl: https://github.com/BornToBeRoot/NETworkManager/issues +Author: BornToBeRoot +PackageName: NETworkManager +PackageUrl: https://borntoberoot.net/NETworkManager +License: GNU General Public License v3.0 +LicenseUrl: https://raw.githubusercontent.com/BornToBeRoot/NETworkManager/master/LICENSE +ShortDescription: A powerful open-source tool for managing networks and troubleshooting network problems! +Moniker: networkmanager +Tags: +- dns +- ipscanner +- lldp +- pingmonitor +- portscanner +- putty +- remotedesktop +- traceroute +- wifi +Documentations: +- DocumentUrl: https://borntoberoot.net/NETworkManager/Documentation +ManifestType: defaultLocale +ManifestVersion: 1.5.0 +ReleaseNotesUrl: https://github.com/BornToBeRoot/NETworkManager/releases/tag/2024.5.27.0 diff --git a/WinGet/manifests/b/BornToBeRoot/NETworkManager/2024.5.27.0/BornToBeRoot.NETworkManager.yaml b/WinGet/manifests/b/BornToBeRoot/NETworkManager/2024.5.27.0/BornToBeRoot.NETworkManager.yaml new file mode 100644 index 0000000000..11a1419233 --- /dev/null +++ b/WinGet/manifests/b/BornToBeRoot/NETworkManager/2024.5.27.0/BornToBeRoot.NETworkManager.yaml @@ -0,0 +1,9 @@ +# Created using WinGet Automation (CLI) + +# yaml-language-server: $schema=https://aka.ms/winget-manifest.version.1.4.0.schema.json + +PackageIdentifier: BornToBeRoot.NETworkManager +PackageVersion: 2024.5.27.0 +DefaultLocale: en-US +ManifestType: version +ManifestVersion: 1.5.0 diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000000..4c35ece2b1 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,124 @@ +image: Visual Studio 2022 +configuration: Release +platform: x64 +install: + - git submodule update --init + - ps: | + Invoke-WebRequest -Uri 'https://dot.net/v1/dotnet-install.ps1' -UseBasicParsing -OutFile "$env:temp\dotnet-install.ps1" + + # Read the required SDK version from global.json instead of hardcoding it, so Dependabot's + # weekly SDK bumps there don't silently drift out of sync with what CI installs. + $DotnetVersion = (Get-Content "$($env:APPVEYOR_BUILD_FOLDER)\Source\global.json" -Raw | ConvertFrom-Json).sdk.version + Write-Host "Installing .NET SDK $DotnetVersion (from Source\global.json)" + & $env:temp\dotnet-install.ps1 -Architecture x64 -Version $DotnetVersion -InstallDir "$env:ProgramFiles\dotnet" +before_build: + - dotnet restore %APPVEYOR_BUILD_FOLDER%\Source\NETworkManager.sln + - ps: | + # Set the version based on the current date (e.g. 2024.4.27.0) + $Date = Get-Date + $VersionString = $Date.ToString("yyyy.M.d.0") + + Write-Host "Set NETworkManager version set to $VersionString" + + # Update assembly version + $AssemblyVersionPattern = '\[assembly: AssemblyVersion\("(.*)"\)\]' + $AssemblyFileVersionPattern = '\[assembly: AssemblyFileVersion\("(.*)"\)\]' + + $AssemblyFile = "$($env:APPVEYOR_BUILD_FOLDER)\Source\GlobalAssemblyInfo.cs" + + $AssemlbyContent = Get-Content -Path $AssemblyFile -Encoding utf8 + $AssemlbyContent = $AssemlbyContent -replace $AssemblyVersionPattern, "[assembly: AssemblyVersion(""$($VersionString)"")]" + $AssemlbyContent = $AssemlbyContent -replace $AssemblyFileVersionPattern, "[assembly: AssemblyFileVersion(""$($VersionString)"")]" + $AssemlbyContent | Set-Content -Path $AssemblyFile -Encoding utf8 + + # Set setup version information + $SetupVersionString = $Date.ToString("yy.M.d") # MSI only supports major.minor.build and 255 as highest value + + Write-Host "Set NETworkManager setup version set to $SetupVersionString" + + $SetupVersionPattern = '<\?define ProductVersion="(.*)" \?>' + + $SetupFile = ".\Source\NETworkManager.Setup\Package.wxs" + + $SetupContent = Get-Content -Path "$SetupFile" -Encoding utf8 + $SetupContent = $SetupContent -replace $SetupVersionPattern, "" + $SetupContent | Set-Content -Path "$SetupFile" -Encoding utf8 + +build_script: + - ps: | + # Build the wixproj directly, not the .sln - `dotnet build` rejects -p:RuntimeIdentifier + # at the solution level (NETSDK1134). + $Architectures = @( + @{ RuntimeIdentifier = "win-x64"; Platform = "x64" }, + @{ RuntimeIdentifier = "win-arm64"; Platform = "ARM64" } + ) + + foreach ($Architecture in $Architectures) { + Write-Host "Building $($Architecture.RuntimeIdentifier)..." + + dotnet build "$($env:APPVEYOR_BUILD_FOLDER)\Source\NETworkManager.Setup\NETworkManager.Setup.wixproj" ` + --configuration Release --no-restore ` + -p:Platform=$($Architecture.Platform) -p:RuntimeIdentifier=$($Architecture.RuntimeIdentifier) -p:PlatformTarget=$($Architecture.Platform) + + if ($LASTEXITCODE -ne 0) { + throw "dotnet build failed for $($Architecture.RuntimeIdentifier) with exit code $LASTEXITCODE" + } + } + +after_build: + - ps: | + $ErrorActionPreference = "Stop" + + if($env:APPVEYOR_REPO_TAG -eq $false) { + Write-Host "Release build is skipped because no tag was found!" + return + } + + $ArtifactsPath = "$($env:APPVEYOR_BUILD_FOLDER)\Artifacts" + + # Create release folder + New-Item -Path "$ArtifactsPath" -ItemType Directory -Force | Out-Null + + # Architectures to package. RuntimeIdentifier is appended to every file name (e.g. _win-x64, _win-arm64). + $Architectures = @( + @{ RuntimeIdentifier = "win-x64"; SetupPlatform = "x64" }, + @{ RuntimeIdentifier = "win-arm64"; SetupPlatform = "ARM64" } + ) + + foreach ($Architecture in $Architectures) { + # Build path - includes the Platform segment because NETworkManager.csproj now inherits + # -p:Platform from the wixproj build, and MSBuild folds a non-AnyCPU Platform into OutputPath. + $BuildPath = "$($env:APPVEYOR_BUILD_FOLDER)\Source\NETworkManager\bin\$($Architecture.SetupPlatform)\Release\net10.0-windows10.0.22621.0\$($Architecture.RuntimeIdentifier)" + $SetupPath = "$($env:APPVEYOR_BUILD_FOLDER)\Source\NETworkManager.Setup\bin\$($Architecture.SetupPlatform)\Release\en-US\NETworkManager.Setup.msi" + + # Get version + $Version = [System.Diagnostics.FileVersionInfo]::GetVersionInfo("$($BuildPath)\NETworkManager.exe").FileVersion + + # Cleanup build + Get-ChildItem -Path "$BuildPath" -Recurse | Where-Object { $_.Name.EndsWith(".pdb") } | Remove-Item + Remove-Item -Path "$($BuildPath)\WebView2Loader.dll" + + # Create archive + Compress-Archive -Path "$($BuildPath)\*" -DestinationPath "$($ArtifactsPath)\NETworkManager_$($Version)_Archive_$($Architecture.RuntimeIdentifier).zip" + + # Create portable + New-Item -Path "$BuildPath" -Name "IsPortable.settings" -ItemType File | Out-Null + Compress-Archive -Path "$($BuildPath)\*" -DestinationPath "$($ArtifactsPath)\NETworkManager_$($Version)_Portable_$($Architecture.RuntimeIdentifier).zip" + Remove-Item -Path "$($BuildPath)\IsPortable.settings" + + # Copy setup + Move-Item -Path "$SetupPath" -Destination "$($ArtifactsPath)\NETworkManager_$($Version)_Setup_$($Architecture.RuntimeIdentifier).msi" + } + + # Create artifacts archive for signing + Compress-Archive -Path "$ArtifactsPath\*" -DestinationPath "$($ArtifactsPath).zip" + +artifacts: + - path: 'Artifacts.zip' +deploy: + - provider: Webhook + url: https://app.signpath.io/API/v1/0a191750-608c-457a-a11d-8a5433ad6491/Integrations/AppVeyor?ProjectSlug=NETworkManager&SigningPolicySlug=release-signing&ArtifactConfigurationSlug=artifacts + authorization: + secure: PF6YBkp3Gg4c9TUX4HOzgjG5FeCzq9hYMCG5Zbs6xEL3jVuWe605D+Q/x1PKtK/q2nxUGzQIvOdiWbXMnUXWQg== + on: + APPVEYOR_REPO_TAG: true diff --git a/build.ps1 b/build.ps1 deleted file mode 100644 index 7da2bffd40..0000000000 --- a/build.ps1 +++ /dev/null @@ -1,122 +0,0 @@ -$BuildPath = "$PSScriptRoot\Build" - -Set-Location -Path $PSScriptRoot - -if (Test-Path -Path $BuildPath) { - Remove-Item -Path $BuildPath -Recurse -ErrorAction Stop -} - -# Run a cleanup -& ".\cleanup.ps1" - -# Set the version based on the current date (e.g. 2021.2.15.0) -$Date = Get-Date -$Patch = 0 -$VersionString = "$($Date.Year).$($Date.Month).$($Date.Day).$Patch" - -# Set assembly version -$PatternVersion = '\[assembly: AssemblyVersion\("(.*)"\)\]' -$PatternFileVersion = '\[assembly: AssemblyFileVersion\("(.*)"\)\]' - -$AssemblyFile = "$PSScriptRoot\Source\GlobalAssemblyInfo.cs" - -$AssemlbyContent = Get-Content -Path $AssemblyFile -Encoding utf8 -$AssemlbyContent = $AssemlbyContent -replace $PatternVersion,"[assembly: AssemblyVersion(""$($VersionString)"")]" -$AssemlbyContent = $AssemlbyContent -replace $PatternFileVersion,"[assembly: AssemblyFileVersion(""$($VersionString)"")]" -$AssemlbyContent | Set-Content -Path $AssemblyFile -Encoding utf8 - -# Set inno setup version -$PatternSetupVersion = '#define MyAppVersion "(.*)"' - -$InnoSetupFile = "$PSScriptRoot\InnoSetup.iss" - -$SetupContent = Get-Content -Path $InnoSetupFile -Encoding utf8 -$SetupContent = $SetupContent -replace $PatternSetupVersion,"#define MyAppVersion ""$($VersionString)""" -$SetupContent | Set-Content -Path $InnoSetupFile -Encoding utf8 - -### Warnings ### -# CS4014 - Call is not awaited -# NU1701 - Target framework is .NET Framework -# CS1591 - Missing XML comment - -# Dotnet clean, restore, build and publish -##dotnet clean "$PSScriptRoot\Source\NETworkManager.sln" -##dotnet restore "$PSScriptRoot\Source\NETworkManager.sln" -# Issue: dotnet publish ignores zh-CN, zh-TW (https://github.com/dotnet/msbuild/issues/3897) -##dotnet publish --configuration Release --framework net6.0-windows10.0.17763.0 --runtime win10-x64 --self-contained false --output "$BuildPath\NETworkManager" "$PSScriptRoot\Source\NETworkManager\NETworkManager.csproj" -##Read-Host "Copy the missing language files and press enter" - -# Get msbuild path (docs: https://www.meziantou.net/locating-msbuild-on-a-machine.htm) -$VSwherePath = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" - -if(-not(Test-Path -Path $VSwherePath -PathType Leaf)) -{ - Write-Error "Could not find VSwhere. Is Visual Studio installed?" -ErrorAction Stop -} - -$VSwhere = & $VSwherePath -version "[16.0,18.0)" -products * -requires Microsoft.Component.MSBuild -prerelease -latest -utf8 -format json | ConvertFrom-Json -$MSBuildPath = Join-Path $VSwhere[0].installationPath "MSBuild" "Current" "Bin" "MSBuild.exe" - -# Test if we found msbuild -if(-not(Test-Path -Path $MSBuildPath -PathType Leaf)) -{ - Write-Error "Could not find msbuild. Is Visual Studio installed?" -ErrorAction Stop -} - -Start-Process -FilePath $MSBuildPath -ArgumentList "$PSScriptRoot\Source\NETworkManager.sln /restore /t:Clean,Build /p:Configuration=Release /p:TargetFramework=net6.0-windows10.0.17763.0 /p:RuntimeIdentifier=win-x64 /p:SelfContained=false /p:OutputPath=$BuildPath\NETworkManager" -Wait -NoNewWindow - -# Test if release build is available -if(-not(Test-Path -Path "$BuildPath\NETworkManager\NETworkManager.exe" -PathType Leaf)) -{ - Write-Error "Could not find release build. Is .NET SDK 6.0 or later installed?" -ErrorAction Stop -} - -# Get NETworkManager file version -$Version = [System.Diagnostics.FileVersionInfo]::GetVersionInfo("$BuildPath\NETworkManager\NETworkManager.exe").FileVersion - -# Cleanup .pdb files -Get-ChildItem -Recurse | Where-Object {$_.Name.EndsWith(".pdb")} | Remove-Item - -# Archiv Build -Compress-Archive -Path "$BuildPath\NETworkManager" -DestinationPath "$BuildPath\NETworkManager_$($Version)_Archive.zip" - -# Portable Build -New-Item -Path "$BuildPath\NETworkManager" -Name "IsPortable.settings" -ItemType File -Compress-Archive -Path "$BuildPath\NETworkManager" -DestinationPath "$BuildPath\NETworkManager_$($Version)_Portable.zip" -Remove-Item -Path "$BuildPath\NETworkManager\IsPortable.settings" - -# Installer Build -$InnoSetupPath = "${env:ProgramFiles(x86)}\Inno Setup 6" - -$InnoSetupLanguageMissing = $false - -if(-not(Test-Path -Path "$InnoSetupPath\Languages\ChineseSimplified.isl")) -{ - Write-Host "ChineseSimplified.isl not found in InnoSetup language folder.`nDownload URL: https://github.com/jrsoftware/issrc/blob/main/Files/Languages/Unofficial/ChineseSimplified.isl" -ForegroundColor Yellow - $InnoSetupLanguageMissing = $true -} - -if(-not(Test-Path -Path "$InnoSetupPath\Languages\ChineseTraditional.isl")) -{ - Write-Host "ChineseTraditional.isl not found in InnoSetup language folder.`nDownload URL: https://github.com/jrsoftware/issrc/blob/main/Files/Languages/Unofficial/ChineseTraditional.isl" -ForegroundColor Yellow - $InnoSetupLanguageMissing = $true -} - -$InnoSetupCompiler = "$InnoSetupPath\ISCC.exe" - -if(-not(Test-Path -Path $InnoSetupCompiler -PathType Leaf) -or $InnoSetupLanguageMissing) -{ - Write-Host "InnoSetup is not installed correctly. Skip installer build..." -ForegroundColor Cyan -} -else -{ - Start-Process -FilePath $InnoSetupCompiler -ArgumentList """$PSScriptRoot\InnoSetup.iss""" -NoNewWindow -Wait -} - -# SHA256 file hash -foreach($hash in Get-ChildItem -Path $BuildPath | Where-Object {$_.Name.EndsWith(".zip") -or $_.Name.EndsWith(".exe")} | Get-FileHash) -{ - "$($hash.Algorithm) | $($hash.Hash) | $([System.IO.Path]::GetFileName($hash.Path))" | Out-File -FilePath "$BuildPath\NETworkManager_$($Version)_Hash.txt" -Encoding utf8 -Append -} - -Write-Host "Build finished! All files are here: $BuildPath" -ForegroundColor Green diff --git a/docs/01_Home.md b/docs/01_Home.md deleted file mode 100644 index a5f0e68160..0000000000 --- a/docs/01_Home.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -layout: default -title: Home -nav_order: 1 -description: "A powerful tool for managing networks and troubleshoot network problems!" -permalink: / ---- - -# What is NETworkManager -NETworkManager is a powerful tool for managing networks and troubleshoot network problems! It includes a variety of tools such as an IP scanner, Port Scanner, Ping Monitor, WiFi analyzer, PuTTY/RemoteDesktop with tabs or an LLDP/CDP capture (and many [more](./Features)) in a unified user interface. - - - -The code is open source and available on [GitHub](https://github.com/BornToBeRoot/NETworkManager){:target="_blank"} published under the [GNU General Public License v3](https://github.com/BornToBeRoot/NETworkManager/blob/master/LICENSE){:target="_blank"}. This project has adopted the [code of conduct](https://github.com/BornToBeRoot/NETworkManager/blob/master/CODE_OF_CONDUCT.md){:target="_blank"} defined by the [Contributor Covenant](http://contributor-covenant.org/){:target="_blank"}. diff --git a/docs/02_Features.md b/docs/02_Features.md deleted file mode 100644 index ce58ee9425..0000000000 --- a/docs/02_Features.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -layout: default -title: Features -nav_order: 2 -description: "List of all available features in the NETworkManager" -permalink: /Features ---- - -# Features -- [Dashboard](Documentation/Application/Dashboard) -- [Network Interface](Documentation/Application/NetworkInterface) - Information, Bandwidth, Configure -- [WiFi](Documentation/Application/WiFi) - Networks, Channels -- [IP Scanner](Documentation/Application/IPScanner) -- [Port Scanner](Documentation/Application/PortScanner) -- [Ping Monitor](Documentation/Application/PingMonitor) -- [Traceroute](Documentation/Application/Traceroute) -- [DNS Lookup](Documentation/Application/DNSLookup) -- [Remote Desktop](Documentation/Application/RemoteDesktop) -- [PowerShell](Documentation/Application/PowerShell) -- [PuTTY](Documentation/Application/PuTTY) ([requires PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html){:target="_blank"}) -- [TigerVNC](Documentation/Application/TigerVNC) ([requires TigerVNC](https://tigervnc.org/){:target="_blank"}) -- [Web Console](Documentation/Application/WebConsole) ([requires Microsoft Edge - WebView2 Runtime](https://developer.microsoft.com/en-us/microsoft-edge/webview2/){:target="_blank"}) -- [SNMP](Documentation/Application/SNMP) - Get, Walk, Set -- [Discovery Protocol](Documentation/Application/DiscoveryProtocol) - LLDP, CDP -- [Wake on LAN](Documentation/Application/WakeOnLAN) -- [Whois](Documentation/Application/Whois) -- [Subnet Calculator](Documentation/Application/SubnetCalculator) - Calculator, Subnetting, Supernetting -- [Lookup](Documentation/Application/Lookup) - OUI, Port -- [Connections](Documentation/Application/Connections) -- [Listeners](Documentation/Application/Listeners) -- [ARP Table](Documentation/Application/ARPTable) - -## Profiles -Hosts can be stored in profiles, which can be used across all features. Individual settings such as the path to an SSH key can be stored here to override the group settings or global settings. The profile files can be stored encrypted on disk and protected with a master password to provide an additional layer of security for credentials. - -## Languages -NETworkManager is available in 16 languages. [Here](https://www.transifex.com/BornToBeRoot/NETworkManager/dashboard/){:target="_blank"} you can find the list with all languages and the progress of the translation. - -If you miss a language, find missing or incorrect translations, you can request a language and help to improve the translation on [Transifex](https://www.transifex.com/BornToBeRoot/NETworkManager){:target="_blank"}. - -See also the [contributing guidelines](https://github.com/BornToBeRoot/NETworkManager/blob/master/CONTRIBUTING.md){:target="_blank"} if you want to contribute to the project. \ No newline at end of file diff --git a/docs/03_Download.md b/docs/03_Download.md deleted file mode 100644 index a4516f4380..0000000000 --- a/docs/03_Download.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -layout: default -title: Download -nav_order: 3 -description: "Download of the latest available version" -permalink: /Download ---- - -# Download - -Version: **2022.2.22.0**
-Date: **22.2.2022** - -| Download | Checksum [SHA256] | -|---|---| -| | `F0CF905B14622588E658977BC2E7B85042858FA4191CDAEF4F84C1BAE2DC9311` | -| | `241F02978697BAF2E8BD695671D5197C081CB44C5D52925BC30CC3CECF0A4592` | -| | `DC5FC8FF4FC61E21F9D795B39E28C8CCDEC2FD4F01323031F27D691A93563CF8` | - -:warning: [BREAKING CHANGE] :warning: - -**Read this before upgrading from 2021.11.30.0 and earlier to 2022.2.22.0 or later!** - -The profile (file) has been updated and needs to be migrated: -1. The encryption of the profile file(s) must be disabled in the currently installed version. -2. Then the update can be installed as usual. -3. At the first startup the loading of the profiles fails and a PowerShell script can be started to migrate the profiles. -4. After the migration the encryption of the profiles can be enabled again. - -Note: _Steps 1 and 4 can be skipped if the profiles are not encrypted._ - -## System requirements -- Windows 10 / Server x64 (1809 or later) -- [.NET Desktop Runtime 6.x (LTS)](https://dotnet.microsoft.com/download/dotnet/6.0){:target="_blank"} -- [Microsoft Edge - WebView2 Runtime](https://developer.microsoft.com/en-us/microsoft-edge/webview2/){:target="_blank"} - -## Package Manager -It is also available via the package managers [Chocolatey](https://chocolatey.org/packages/NETworkManager){:target="_blank"} and [WinGet](https://github.com/microsoft/winget-pkgs/tree/master/manifests/b/BornToBeRoot/NETworkManager/){:target="_blank"}: - -``` -choco install networkmanager -# or -winget install BornToBeRoot.NETworkManager -``` - -The latest version can also be viewed and downloaded via the PowerShell module [Evergreen](https://github.com/aaronparker/evergreen){:target="_blank"}: - -``` -Get-EvergreenApp -Name NETworkManager -# or -Get-EvergreenApp -Name NETworkManager | Save-EvergreenApp -Path C:\Users\$env:Username\Downloads\ -``` - -## Silent install -The setup is created with [InnoSetup](https://jrsoftware.org/isinfo.php){:target="_blank"} and you can use all available [command line parameters](https://jrsoftware.org/ishelp/index.php?topic=setupcmdline){:target="_blank"}. Use the following parameters to perform a silent installation and create a desktop icon: - -``` -NETworkManager_20xx.xx.x_Setup.exe /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /TASKS="desktopicon" /SP- -``` diff --git a/docs/04_Changelog.md b/docs/04_Changelog.md deleted file mode 100644 index 5475ade739..0000000000 --- a/docs/04_Changelog.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -layout: default -title: Changelog -has_children: true -nav_order: 4 -description: "Changelog and download links of all available versions." -permalink: /Changelog ---- diff --git a/docs/06_Documentation.md b/docs/06_Documentation.md deleted file mode 100644 index 8f7d7f6968..0000000000 --- a/docs/06_Documentation.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -layout: default -title: Documentation -has_children: true -nav_order: 5 -description: "Documentation of the program." -permalink: /Documentation ---- \ No newline at end of file diff --git a/docs/07_FAQ.md b/docs/07_FAQ.md deleted file mode 100644 index 6893240776..0000000000 --- a/docs/07_FAQ.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -layout: default -title: FAQ -nav_order: 6 -description: "Frequently Asked Questions" -permalink: /FAQ ---- - -# Frequently Asked Questions -The documentation and the FAQ are not complete yet! Feel free to ask questions on [GitHub Discussions](https://github.com/BornToBeRoot/NETworkManager/discussions). - -## How to contribute or report an issue? -Read the [contributing guidelines](https://github.com/BornToBeRoot/NETworkManager/blob/master/CONTRIBUTING.md){:target="_blank"} and follow the instructions there. - -## How to build the project? -The project can be build with Visual Studio or with a PowerShell script. More details and the requirements can be found in the [README](https://github.com/BornToBeRoot/NETworkManager/blob/master/README.md#build){:target="_blank"}. - -## Profile, groups and settings priority -Settings in profiles overwrite group settings. Group settings overwrite global settings. -Inheritance is: General Settings > Group settings > Profile settings - -## How does the profile encryption work? -Profile files are encrypted on disk using [AES](https://docs.microsoft.com/de-de/dotnet/api/system.security.cryptography.aes?view=net-6.0){:target="_blank"} with a key size of 256 bits and a block size of 128 bits in CBC mode. The encryption key is derived from a master password using [Rfc2898DeriveBytes](https://docs.microsoft.com/en-US/dotnet/api/system.security.cryptography.rfc2898derivebytes?view=net-5.0){:target="_blank"} (PBKDF2) with 1,000,000 iterations. At runtime, passwords are stored as [SecureString](https://docs.microsoft.com/en-US/dotnet/api/system.security.securestring?view=net-5.0){:target="_blank"} once the profile file is loaded. For some functions, the password must be converted to a normal string and remains unencrypted in memory until the garbage collector cleans them up. If you found a security issue, you can report it [here](https://github.com/BornToBeRoot/NETworkManager/security/policy){:target="_blank"}! - -## How to enable profile file encryption? -Open the settings and go to the profile section. Right click on the profile file you want to encrypt. Select `Encryption...` > `Enable encryption...` and set your master password. - -![ProfileFile_EnableEncryption](ProfileFile_EnableEncryption.gif) - -## How to change the master password of an encrypted profile file? -Open the settings and go to the profile section. Right click on an encrypted profile file. Select `Encryption...` > `Change Master Password...` and enter the current master password and a new master password. - -![ProfileFile_EnableEncryption](ProfileFile_ChangeMasterPassword.gif) - -## How to disable profile file encryption? -Open the settings and go to the profile section. Right click on an encrypted profile file. Select `Encryption...` > `Disable encryption...` and enter your master password. - -![ProfileFile_DisableEncryption](ProfileFile_DisableEncryption.gif) diff --git a/docs/Changelog/2019-12-0.md b/docs/Changelog/2019-12-0.md deleted file mode 100644 index 3dbf3786df..0000000000 --- a/docs/Changelog/2019-12-0.md +++ /dev/null @@ -1,101 +0,0 @@ ---- -layout: default -title: 2019.12.0 -parent: Changelog -nav_order: 999 -description: "Changelog for version 2019.12.0" -permalink: /Changelog/2019-12-0 ---- - -# 2019.12.0 -Date: **25.12.2019** - -| File | Checksum [SHA256] -|---|---| -|[Setup](https://github.com/BornToBeRoot/NETworkManager/releases/download/2019.12.0/NETworkManager_2019.12.0_Setup.exe)| `C615367946A818B4E67632FA99937723B4006385D86F62F52842709DC35CBA1F` | -|[Portable](https://github.com/BornToBeRoot/NETworkManager/releases/download/2019.12.0/NETworkManager_2019.12.0_Portable.zip)| `1A5A16A863425D827E1C58D711C337873C4C44B914D44F3FC27E327043597078` | -|[Archive](https://github.com/BornToBeRoot/NETworkManager/releases/download/2019.12.0/NETworkManager_2019.12.0_Archive.zip)| `1942EF7B3541782CB83F37ED802E8FF98DD63579F5772D792462EACF82BE7E72` | - -**New system requirements** -- Windows 10 Build 1809 -- .NET-Framework 4.7.2 - -## What's new -- WiFi (Networks, Channels) -- Ping Monitor -- Profile - You can now add multiple profile files and select them in the window title bar in a drop down - - If you want to migrate your profile file from one of the pre-releases... copy the file `%appdata%\NETworkManager\Settings\Profiles.xml` to `%appdata%\NETworkManager\Profiles\Profiles.xml` or in the portable version from the `settings` folder into the new `profiles` folder. -- Version number changed from `Version 1.x.x.x` to `Version {year}.{month} Patch {number}` -- Credential feature removed -- Settings - Make portable feature removed - -## Improvements -- Dashboard - - New icon -- Network Interface - Bandwidth - - Measure bandwidth over time - - TooTip improved - - Legend added -- WiFi - - Channel - Signal strength sections added - - Channel - Values (signal strength / channel) are visible, even if no network has been scanned yet - - Channel - ToolTip improved -- IP Scanner - - New icon - - The selected profile can be used with the `Enter` key when the search textbox or listview is in focus - - Hostname lookup --> DNS replaced with DnsClient -- Port Scanner - - The selected profile can be used with the `Enter` key when the search textbox or listview is in focus - - Hostname lookup --> DNS replaced with DnsClient -- Ping - - The selected profile can be used with the `Enter` key when the search textbox or listview is in focus - - Hostname lookup --> DNS replaced with DnsClient -- Ping Monitor - - The selected profile can be used with the `Enter` key when the search textbox or listview is in focus - - Hostname lookup --> DNS replaced with DnsClient -- Traceroute - - Performance improved when resolving hostnames. Default DNS replaced with DnsClient for reverse lookups. - - The selected profile can be used with the `Enter` key when the search textbox or listview is in focus - - Hostname lookup --> DNS replaced with DnsClient -- DNS Lookup - - Heijden.DNS replaced with DnsClient.NET - - The selected profile can be used with the `Enter` key when the search textbox or listview is in focus -- Remote Desktop - - Animation when closing a dialog is now smooth - - Settings - Display - "Use current view size as screen size" is now default - - The selected profile can be used with the `Enter` key when the search textbox or listview is in focus -- PowerShell - - New icon - - DPI issues fixed - - Animation when closing a dialog is now smooth - - The selected profile can be used with the `Enter` key when the search textbox or listview is in focus -- PuTTY - - New icon - - Animation when closing a dialog is now smooth - - DPI issues fixed - - The selected profile can be used with the `Enter` key when the search textbox or listview is in focus -- TigerVNC - - Animation when closing a dialog is now smooth - - DPI issues fixed - - The selected profile can be used with the `Enter` key when the search textbox or listview is in focus -- HTTP Headers - - The selected profile can be used with the `Enter` key when the search textbox or listview is in focus -- Whois - - The selected profile can be used with the `Enter` key when the search textbox or listview is in focus -- Lookup - - New icon - -## Bugfixes -- IP Scanner - - Heijden.DNS replaced with DnsClient.NET #209 -- Ping Monitor - - ScrollBar fixed - -## Other - - Language files updated - - Resources (OUI, Ports, Whois) updated - - Libary Heijden.DNS removed from source - - Libary DnsClient.NET added - - Libary Microsoft.Windows.SDK.Contracts added - - Libraries updated - - Some small bugfixes and improvements diff --git a/docs/Changelog/2020-1-0.md b/docs/Changelog/2020-1-0.md deleted file mode 100644 index 6894089140..0000000000 --- a/docs/Changelog/2020-1-0.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -layout: default -title: 2020.1.0 -parent: Changelog -nav_order: 998 -description: "Changelog for version 2020.1.0" -permalink: /Changelog/2020-1-0 ---- - -# 2020.1.0 -Date: **26.01.2020** - -| File | Checksum [SHA256] -|---|---| -|[Setup](https://github.com/BornToBeRoot/NETworkManager/releases/download/2020.1.0/NETworkManager_2020.1.0_Setup.exe)| `A7BD0182269F012701D56285141A66279F41145F748539C7233C3129BE3765CB` | -|[Portable](https://github.com/BornToBeRoot/NETworkManager/releases/download/2020.1.0/NETworkManager_2020.1.0_Portable.zip)| `BEA66D1B8E1DE820B6077FD1F98ABDF5BDD4D7CD0477FC27941EFED326DCCEAD` | -|[Archive](https://github.com/BornToBeRoot/NETworkManager/releases/download/2020.1.0/NETworkManager_2020.1.0_Archive.zip)| `497C6DEFAD22B074B0E8D0E43948545128503512434C096D221D2978B1344F91` | - -## What's new? -- Discovery Protocol - Capture LLDP and/or CDP network packages and display informations like Port, Description, VLAN, etc. [#196](http://github.com/BornToBeRoot/NETworkManager/issues/196){:target="_blank"} -- Web Console added [#244](http://github.com/BornToBeRoot/NETworkManager/issues/244){:target="_blank"} -- Settings > Appearance - - Transparency feature removed. Remote Desktop, PowerShell, PuTTY and TigerVNC don't work while transparency is enabled. [#220](http://github.com/BornToBeRoot/NETworkManager/issues/220){:target="_blank"} - -## Improvements -- Network Interface > Bandwidth - - Labels / values improved in the network usage section [#235](http://github.com/BornToBeRoot/NETworkManager/issues/235){:target="_blank"} - - ToolTip improved [#219](http://github.com/BornToBeRoot/NETworkManager/issues/219){:target="_blank"} -- DNS Lookup - - Error message now shows the ip address of the dns server [#256](http://github.com/BornToBeRoot/NETworkManager/issues/256){:target="_blank"} -- Command Line Parameter added - - `--application:[Dashboard|IPScanner|etc.]` [#237](http://github.com/BornToBeRoot/NETworkManager/issues/237){:target="_blank"} -- After restarting the application, the last view is displayed again [#237](http://github.com/BornToBeRoot/NETworkManager/issues/237){:target="_blank"} -- Settings > Language - - View improved [#231](http://github.com/BornToBeRoot/NETworkManager/issues/231){:target="_blank"} -- Profiles - - Rows (profiles) should now load faster (tested with ~5k profiles) - - Search improved on slow systems with many profiles [#227](http://github.com/BornToBeRoot/NETworkManager/issues/227){:target="_blank"} - -## Bugfixes -- IP Scanner - - Context menu redirect ro Ping Monitor [#225](http://github.com/BornToBeRoot/NETworkManager/issues/225){:target="_blank"} - - Context menu icons are now correct [#257](http://github.com/BornToBeRoot/NETworkManager/issues/257){:target="_blank"} -- Traceroute - - Context menu redirect ro Ping Monitor [#225](http://github.com/BornToBeRoot/NETworkManager/issues/225){:target="_blank"} - - Context menu icons are now correct [#257](http://github.com/BornToBeRoot/NETworkManager/issues/257){:target="_blank"} -- Some bugs in the UI fixed (label, translation, placeholder, etc.) - -## Other - - Libary Microsoft.Toolkit.Wpf.UI.Controls.WebView added - - Libraries updated - - Language files updated diff --git a/docs/Changelog/2020-12-0.md b/docs/Changelog/2020-12-0.md deleted file mode 100644 index 6e60a84478..0000000000 --- a/docs/Changelog/2020-12-0.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -layout: default -title: 2020.12.0 -parent: Changelog -nav_order: 993 -description: "Changelog for version 2020.12.0" -permalink: /Changelog/2020-12-0 ---- - -# 2020.12.0 -Date: **06.12.2020** - -| File | Checksum [SHA256] | -|---|---| -|[Setup](https://github.com/BornToBeRoot/NETworkManager/releases/download/2020.12.0/NETworkManager_2020.12.0_Setup.exe){:target="_blank"}| `07B238ADC7B865AB3EB7F7C395674EB2A6C95ADCD4724317941EAB895D3E064D` | -|[Portable](https://github.com/BornToBeRoot/NETworkManager/releases/download/2020.12.0/NETworkManager_2020.12.0_Portable.zip){:target="_blank"}| `191F5A1C7E7DC59EE4B7CB17546564F69339D2963B7EC782FBE48F35C4B10C00` | -|[Archive](https://github.com/BornToBeRoot/NETworkManager/releases/download/2020.12.0/NETworkManager_2020.12.0_Archive.zip){:target="_blank"}| `0038524849EAD33A3BAA8B493A424B0416D360E54DB52E931557219C30AAE955` | - -Note: _If you've installed the preview, uninstall it first!_ - -**New system requirements** -- Windows 10 / Server (1809 or later) -- [.NET Desktop Runtime 5.0.0](https://dotnet.microsoft.com/download/dotnet/5.0){:target="_blank"} -- [Microsoft Edge - WebView2 Runtime](https://developer.microsoft.com/en-us/microsoft-edge/webview2/){:target="_blank"} - -## What's new? -- Migrated to .NET Desktop 5.0 -- Migrated to MahApps.Metro 2.x -- Migrated to WebView2 (Microsoft Edge Chromium) -- Port Scanner - - Port profiles added [#346](http://github.com/BornToBeRoot/NETworkManager/issues/346){:target="_blank"} -- Profiles - - Port Scanner - Ports are now optional [#332](http://github.com/BornToBeRoot/NETworkManager/issues/332){:target="_blank"} - -## Improvements -- SplashScreen can be disabled in the settings [#331](http://github.com/BornToBeRoot/NETworkManager/issues/331){:target="_blank"} - -## Bugfixes -- Discovery Protocol - - PowerShell fixed [#326](http://github.com/BornToBeRoot/NETworkManager/issues/326){:target="_blank"} -- Settings reset from GUI fixed [#330](http://github.com/BornToBeRoot/NETworkManager/issues/330){:target="_blank"} -- Browse folder/file button in textbox fixed [#329](http://github.com/BornToBeRoot/NETworkManager/issues/329){:target="_blank"} -- About page - - Open license folder app crash fixed [#327](http://github.com/BornToBeRoot/NETworkManager/issues/327){:target="_blank"} - -## Other -- Libraries updated -- Language files updated - - China (Taiwan) added - - Hungarian added - - Polish added -- Resources (OUI, Ports, Whois) updated -- Settings > Language - - Contributors moved to `.md` file in GitHub repo. Link added to Settings > About. diff --git a/docs/Changelog/2020-12-1.md b/docs/Changelog/2020-12-1.md deleted file mode 100644 index f339ce68fc..0000000000 --- a/docs/Changelog/2020-12-1.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -layout: default -title: 2020.12.1 -parent: Changelog -nav_order: 992 -description: "Changelog for version 2020.12.1" -permalink: /Changelog/2020-12-1 ---- - -# 2020.12.1 -Date: **14.12.2020** - -| File | Checksum [SHA256] | -|---|---| -|[Setup](https://github.com/BornToBeRoot/NETworkManager/releases/download/2020.12.1/NETworkManager_2020.12.1_Setup.exe){:target="_blank"}| `0A84BEF75A65DD457A2CDA64CDE00B3BF380D8D94D6BDB50EBC0869E31F5D2D9` | -|[Portable](https://github.com/BornToBeRoot/NETworkManager/releases/download/2020.12.1/NETworkManager_2020.12.1_Portable.zip){:target="_blank"}| `19D04BA6BBFB323F11889115489A299FE534C49AEA533030DF0F5B47AE7A722E` | -|[Archive](https://github.com/BornToBeRoot/NETworkManager/releases/download/2020.12.1/NETworkManager_2020.12.1_Archive.zip){:target="_blank"}| `0F7BF030E4C4ADA8B54DF06C52CA5F19A1E3CA854E67A8E667277544A8882509` | - -## What's new? -- Ping Monitor - - Export as CSV, XML, JSON added [#389](http://github.com/BornToBeRoot/NETworkManager/issues/389){:target="_blank"} [#287](http://github.com/BornToBeRoot/NETworkManager/issues/287){:target="_blank"} - -## Improvements -- Network Interface - - NetworkInterfaceType 53 added [#375](http://github.com/BornToBeRoot/NETworkManager/issues/375){:target="_blank"} -- About - - Version is now displayed correctly 2020.12.1 (YEAR.MONTH.PATCH) - -## Bugfixes -- DNS Lookup - - Custom dns resolver fixed [#390](http://github.com/BornToBeRoot/NETworkManager/issues/390){:target="_blank"} diff --git a/docs/Changelog/2020-12-2.md b/docs/Changelog/2020-12-2.md deleted file mode 100644 index 5f6da1dc2b..0000000000 --- a/docs/Changelog/2020-12-2.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -layout: default -title: 2020.12.2 -parent: Changelog -nav_order: 991 -description: "Changelog for version 2020.12.2" -permalink: /Changelog/2020-12-2 ---- - -# 2020.12.2 -Date: **28.12.2020** - -| File | Checksum [SHA256] | -|---|---| -|[Setup](https://github.com/BornToBeRoot/NETworkManager/releases/download/2020.12.2/NETworkManager_2020.12.2_Setup.exe){:target="_blank"}| `4F0EA9AB5969021901AA107A40B0F1C649AB2A39FFC55565DDEF318D983021F9` | -|[Portable](https://github.com/BornToBeRoot/NETworkManager/releases/download/2020.12.2/NETworkManager_2020.12.2_Portable.zip){:target="_blank"}| `7A26775C906586822AE3585CDD2FC3AD361D359D38AC591012E4CB9F82EEA8BA` | -|[Archive](https://github.com/BornToBeRoot/NETworkManager/releases/download/2020.12.2/NETworkManager_2020.12.2_Archive.zip){:target="_blank"}| `6094B2C27A279C004049D0AD083C8A23A57864FBD61616DECD2B75A9C3ABDD95` | - -## What's new? -- UI reworked / tab size reduced [#398](http://github.com/BornToBeRoot/NETworkManager/issues/398){:target="_blank"} - -## Improvements -- WiFi - - y-axis is now displayed correct (reversed -100 to 0 dBm) [#366](http://github.com/BornToBeRoot/NETworkManager/issues/366){:target="_blank"} - - Space between channel 64 and 100 added (they won't overlap anymore) [#366](http://github.com/BornToBeRoot/NETworkManager/issues/366){:target="_blank"} -- Add version to title bar [#402](http://github.com/BornToBeRoot/NETworkManager/issues/402){:target="_blank"} -- Improve title if tab is dragged out (version and application name added) [#414](http://github.com/BornToBeRoot/NETworkManager/issues/414){:target="_blank"} -- Settings\Language - - Sort languages by Official, Community and Name [#403](http://github.com/BornToBeRoot/NETworkManager/issues/403){:target="_blank"} - -## Bugfixes -- IP Scanner - - JSON export fixed it MAC address is null [#392](http://github.com/BornToBeRoot/NETworkManager/issues/392){:target="_blank"} -- WebConsole - - Fix dependency (require Edge WebView2 runtime instead if Edge Chromium) / prevent app crash [#404](http://github.com/BornToBeRoot/NETworkManager/issues/404){:target="_blank"} -- Context menu icons color fixed [#391](http://github.com/BornToBeRoot/NETworkManager/issues/391){:target="_blank"} -- Build script fixed if there are spaces in path [#384](http://github.com/BornToBeRoot/NETworkManager/issues/384){:target="_blank"} -- ToolTip background fixed for LvlCharts [#414](http://github.com/BornToBeRoot/NETworkManager/issues/414){:target="_blank"} -- Settings - - Link color/size in About and Language fixed [#391](http://github.com/BornToBeRoot/NETworkManager/issues/391){:target="_blank"} - - Groups are now translated [#279](http://github.com/BornToBeRoot/NETworkManager/issues/279){:target="_blank"} - -## Other -- Language files updated diff --git a/docs/Changelog/2020-4-0.md b/docs/Changelog/2020-4-0.md deleted file mode 100644 index 2ce42a8617..0000000000 --- a/docs/Changelog/2020-4-0.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -layout: default -title: 2020.4.0 -parent: Changelog -nav_order: 997 -description: "Changelog for version 2020.4.0" -permalink: /Changelog/2020-4-0 ---- - -# 2020.4.0 -Date: **21.04.2020** - -| File | Checksum [SHA256] -|---|---| -|[Setup](https://github.com/BornToBeRoot/NETworkManager/releases/download/2020.4.0/NETworkManager_2020.4.0_Setup.exe)| `6AA9E156ABEB79BB07574C7C076F53FE0630D69E5680A83E8E1D175E4C75E20A` | -|[Portable](https://github.com/BornToBeRoot/NETworkManager/releases/download/2020.4.0/NETworkManager_2020.4.0_Portable.zip)| `36FDC504ECD9BA7E7334131909F81CE36FB91E7FB267DA53B077F95C697B4751` | -|[Archive](https://github.com/BornToBeRoot/NETworkManager/releases/download/2020.4.0/NETworkManager_2020.4.0_Archive.zip)| `468099D5B9E8862AA6024290BD1FD375FD3A2CE9E7E4FE94AA0DDB97687E81CC` | - -## What's new? -- Code has been refactored and improved to simplify future developments. -- New documentation at https://borntoberoot.github.io/NETworkManager/ - -## Improvements -- Network Interface - - Button "Clear DNS cache" moved tab "Information" [#248](http://github.com/BornToBeRoot/NETworkManager/issues/248){:target="_blank"} - - Button "Release & Renew" moved tab "Information" [#248](http://github.com/BornToBeRoot/NETworkManager/issues/248){:target="_blank"} -- PuTTY - - PuTTY log can be enabled in the settings/profile. Session output will be saved in a file. [#278](http://github.com/BornToBeRoot/NETworkManager/issues/278){:target="_blank"} - -## Bugfixes -- Settings - - Portable modus was not displayed correctly. [#277](http://github.com/BornToBeRoot/NETworkManager/issues/277){:target="_blank"} -- Crash on Server 2019 when select WiFi fixed [#267](http://github.com/BornToBeRoot/NETworkManager/issues/267){:target="_blank"} -- Crash in IP scanner when IP address could not be detected fixed [#268](http://github.com/BornToBeRoot/NETworkManager/issues/268){:target="_blank"} - -## Other - - Libraries updated - - Language files updated - - Resources (OUI, Ports, Whois) updated - - Code cleanup [#261](http://github.com/BornToBeRoot/NETworkManager/issues/261){:target="_blank"}, [#262](http://github.com/BornToBeRoot/NETworkManager/issues/262){:target="_blank"} - diff --git a/docs/Changelog/2020-5-0.md b/docs/Changelog/2020-5-0.md deleted file mode 100644 index 0a518d731b..0000000000 --- a/docs/Changelog/2020-5-0.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -layout: default -title: 2020.5.0 -parent: Changelog -nav_order: 996 -description: "Changelog for version 2020.5.0" -permalink: /Changelog/2020-5-0 ---- - -# 2020.5.0 -Date: **11.05.2020** - -| File | Checksum [SHA256] -|---|---| -|[Setup](https://github.com/BornToBeRoot/NETworkManager/releases/download/2020.5.0/NETworkManager_2020.5.0_Setup.exe)| `B49C7C6B269F3A1B89D7F654CBEA791D4B882CD21A4D77006D5D7DFF1AA300C4` | -|[Portable](https://github.com/BornToBeRoot/NETworkManager/releases/download/2020.5.0/NETworkManager_2020.5.0_Portable.zip)| `A2684C73BBBFA2AE7AE3D59A024AA5247B64DE3C002C22B6F7AA4BEA3AC9B5CE` | -|[Archive](https://github.com/BornToBeRoot/NETworkManager/releases/download/2020.5.0/NETworkManager_2020.5.0_Archive.zip)| `9AACB3B1F0AF7D529606068E3B052C85693C9C97CB8CEBF6D4E181A29FAD06E6` | - -## What's new? -- Ping view removed [#272](http://github.com/BornToBeRoot/NETworkManager/issues/272){:target="_blank"} -- Ping Monitor - - Latency graph added [#286](http://github.com/BornToBeRoot/NETworkManager/issues/286){:target="_blank"} -- HTTP Headers removed [#276](http://github.com/BornToBeRoot/NETworkManager/issues/276){:target="_blank"} -- View improved - -## Improvements -- Network Interace - - Bandwidth graph animation disabled to increase performance - - Graph improved -- WiFi - - Channel graph animation disabled to increase performance - - Graph improved -- IP Scanner - - IPv6 support added [#283](http://github.com/BornToBeRoot/NETworkManager/issues/283){:target="_blank"} - - Statistik removed -- Port Scanner - - IPv6 support added [#283](http://github.com/BornToBeRoot/NETworkManager/issues/283){:target="_blank"} - - Statistik removed -- Traceroute - - Statistik removed -- DNS Lookup - - Statistik removed -- PuTTY - - Private key option added to settings, profile and connect dialog [#282](http://github.com/BornToBeRoot/NETworkManager/issues/282){:target="_blank"} - - Log path drag and drop support added [#285](http://github.com/BornToBeRoot/NETworkManager/issues/285){:target="_blank"} - - PuTTY profile can now contain spaces -- Command line arguments - - Help added - -## Bugfixes -- IP Scanner, Port Scanner, Ping Monitor, Traceroute, Remote Desktop, PowerShell, PuTTY, TigerVNC, WebConsole, Whois - - Disable `Enter` key while searching for profiles [#275](http://github.com/BornToBeRoot/NETworkManager/issues/275){:target="_blank"} -- DNS Lookup - - View fixed -- Ping Montitor - - Searching by Host fixed -- PuTTY - - Fixed some bugs with "Username" and "PuTTY Profile" - -## Other -- Libraries updated -- Language files updated - - Hungarian added diff --git a/docs/Changelog/2020-5-1.md b/docs/Changelog/2020-5-1.md deleted file mode 100644 index 6f17b2ef91..0000000000 --- a/docs/Changelog/2020-5-1.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -layout: default -title: 2020.5.1 -parent: Changelog -nav_order: 995 -description: "Changelog for version 2020.5.1" -permalink: /Changelog/2020-5-1 ---- - -# 2020.5.1 -Date: **12.05.2020** - -| File | Checksum [SHA256] -|---|---| -|[Setup](https://github.com/BornToBeRoot/NETworkManager/releases/download/2020.5.1/NETworkManager_2020.5.1_Setup.exe)| `EC5324009FABF9025A91352C542523B03AC0F55B4090A0E41721AED852A9F968` | -|[Portable](https://github.com/BornToBeRoot/NETworkManager/releases/download/2020.5.1/NETworkManager_2020.5.1_Portable.zip)| `FCC6962C65CDC0ED5137ACDFD23DE97801A1ED74557426BE8AD68F6DBFD366B6` | -|[Archive](https://github.com/BornToBeRoot/NETworkManager/releases/download/2020.5.1/NETworkManager_2020.5.1_Archive.zip)| `E0D10A9CA0E7DAE15C85AE58BB1350E139E8EF6B96D147B40B680AFEB6ED8E85` | - -## Bugfixes -- Subnet Calculator - - Subnetting view fixed -- Connections - - View fixed - \ No newline at end of file diff --git a/docs/Changelog/2020-9-0_preview.md b/docs/Changelog/2020-9-0_preview.md deleted file mode 100644 index d33b9bab52..0000000000 --- a/docs/Changelog/2020-9-0_preview.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -layout: default -title: 2020.9.0 [Preview] -parent: Changelog -nav_order: 994 -description: "Changelog for version 2020.5.0 preview" -permalink: /Changelog/2020-9-0-preview ---- - -# 2020.9.0 [Preview] -Date: **05.09.2020** - -| File | Checksum [SHA256] -|---|---| -|[Setup](https://github.com/BornToBeRoot/NETworkManager/releases/download/2020.9.0/NETworkManager_2020.9.0_Setup.exe)| `0EC8C1371C4D62947AE0DC70DBAA91FE105CACECD32DF4A4451C95F71D085014` | -|[Portable](https://github.com/BornToBeRoot/NETworkManager/releases/download/2020.9.0/NETworkManager_2020.9.0_Portable.zip)| `E8B60E677E65959BB11F05884F6EA9EC99F09F24ECE869A240B8361F958B4A66` | -|[Archive](https://github.com/BornToBeRoot/NETworkManager/releases/download/2020.9.0/NETworkManager_2020.9.0_Archive.zip)| `86D13E4C139132BCBA86B6F72ADA4D679C4DD303EA08643D276AE1A5DFD47C47` | - -**New system requirements** -- Windows 10 x64 -- [.NET Desktop Runtime 5.0.0-preview.8](https://dotnet.microsoft.com/download/dotnet/5.0){:target="_blank"} -- [Microsoft Edge Canary](https://www.microsoftedgeinsider.com/en-us/download){:target="_blank"} - -**Kown issues** -- Application crash on fullscreen [#325](http://github.com/BornToBeRoot/NETworkManager/issues/325){:target="_blank"} -- [More...](https://github.com/BornToBeRoot/NETworkManager/issues?q=label%3A.NET5.0-feedback+){:target="_blank"} - -## What's new? -- Migration to ~~.NET Core 3.1~~ .NET 5.0!!! (requires [.NET Desktop Runtime 5.0.0-repview.8](https://dotnet.microsoft.com/download/dotnet/5.0)) [#309](http://github.com/BornToBeRoot/NETworkManager/issues/309){:target="_blank"} -- Migration to MahApps.Metro Version 2.x -- Migration to WebView2 (requires [Microsoft Edge Canary](https://www.microsoftedgeinsider.com/en-us/download)) [#252](http://github.com/BornToBeRoot/NETworkManager/issues/252){:target="_blank"} - -## Improvements -- WebConsole - - Untrusted SSL certificates can now be accepted [#266](http://github.com/BornToBeRoot/NETworkManager/issues/266){:target="_blank"} - -## Bugfixes -- Subnet Calculator - - Subnetting - App crash fixed if subnetmask was used [#319](http://github.com/BornToBeRoot/NETworkManager/issues/319){:target="_blank"} - -## Other - - Libraries updated diff --git a/docs/Changelog/2021-1-0.md b/docs/Changelog/2021-1-0.md deleted file mode 100644 index 313c16e17b..0000000000 --- a/docs/Changelog/2021-1-0.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -layout: default -title: 2021.1.0 -parent: Changelog -nav_order: 990 -description: "Changelog for version 2021.1.0" -permalink: /Changelog/2021-1-0 ---- - -# Version 2021.1.0 -Date: **09.01.2021** - -| File | Checksum [SHA256] | -|---|---| -|[Setup](https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.1.0/NETworkManager_2021.1.0_Setup.exe){:target="_blank"}| `370FDED539C49E044209CEB6897AD76DD1E947754C0E2742FEED0658229BD3F3` | -|[Portable](https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.1.0/NETworkManager_2021.1.0_Portable.zip){:target="_blank"}| `BD6507198CC7EC5974229A58F9CB33F13CE0A33ABC2E20344DB42321C2382977` | -|[Archive](https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.1.0/NETworkManager_2021.1.0_Archive.zip){:target="_blank"}| `425517A996CE52BB2ADFF05D02537817C954329402AAE9F05773B36C61997E71` | - -Note: _Due to the migration to x64 you have to uninstall the x86 version manually in the control panel_ - -**New system requirements** -- Windows 10 / Server x64 (1809 or later) -- [.NET Desktop Runtime 5.0.0](https://dotnet.microsoft.com/download/dotnet/5.0){:target="_blank"} -- [Microsoft Edge - WebView2 Runtime](https://developer.microsoft.com/en-us/microsoft-edge/webview2/){:target="_blank"} - -## What's new? -- WiFi view reworked [#428](http://github.com/BornToBeRoot/NETworkManager/issues/428){:target="_blank"} -- Migrated to x64 -- Language `Slovenian` added [#433](http://github.com/BornToBeRoot/NETworkManager/issues/433){:target="_blank"} (Thanks to Jadran Rudec) - -## Improvements -- Build size reduced / cleanup output folder [#431](http://github.com/BornToBeRoot/NETworkManager/issues/431){:target="_blank"} -- Last selected profile is remebered after app restart [#432](http://github.com/BornToBeRoot/NETworkManager/issues/432){:target="_blank"} - -## Bugfixes -- App crash fixed if tray icon is used [#435](https://github.com/BornToBeRoot/NETworkManager/issues/435){:target="_blank"} - -## Other -- Language files updated diff --git a/docs/Changelog/2021-1-2.md b/docs/Changelog/2021-1-2.md deleted file mode 100644 index 85d4cfdb49..0000000000 --- a/docs/Changelog/2021-1-2.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -layout: default -title: 2021.1.2 -parent: Changelog -nav_order: 989 -description: "Changelog for version 2021.1.2" -permalink: /Changelog/2021-1-2 ---- - -# 2021.1.2 -Date: **26.01.2021** - -| File | Checksum [SHA256] | -|---|---| -|[Setup](https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.1.2/NETworkManager_2021.1.2_Setup.exe){:target="_blank"}| `600C5F6F57ECE66E87FD9AC5FA8024A2CE7DF156D1FA7D5D17C1809E89CC0548` | -|[Portable](https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.1.2/NETworkManager_2021.1.2_Portable.zip){:target="_blank"}| `C8CFE51FD787D56A7A4DF07EC9A1EF7F043D296E2E2F9EF2CB071D999E9DB3CD` | -|[Archive](https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.1.2/NETworkManager_2021.1.2_Archive.zip){:target="_blank"}| `5705DEFD5457625B85B3F7FD5FC64A503E231BBFC29B6BF749DB2858B14E53D3` | - -## Bugfixes -- Profiles won't load on start [#444](http://github.com/BornToBeRoot/NETworkManager/issues/444){:target="_blank"} diff --git a/docs/Changelog/2021-11-30-0.md b/docs/Changelog/2021-11-30-0.md deleted file mode 100644 index 2846076130..0000000000 --- a/docs/Changelog/2021-11-30-0.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -layout: default -title: 2021.11.30.0 -parent: Changelog -nav_order: 982 -description: "Changelog for 2021.11.30.0" -permalink: /Changelog/2021-11-30-0 ---- - -# Version 2021.11.30.0 -Date: **30.11.2021** - -| File | Checksum [SHA256] | -|---|---| -|[Setup](https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.11.30.0/NETworkManager_2021.11.30.0_Setup.exe){:target="_blank"}| `AFDA99002A95D78127A26ADCED00F1A86DCBDB6DA0782A761088FFBF3BFF1DF9` | -|[Portable](https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.11.30.0/NETworkManager_2021.11.30.0_Portable.zip){:target="_blank"}| `6EE94EDF8EEDE8D65E2143D5BF60C59CA715536D4C15E680FFB0454174D22FE1` | -|[Archive](https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.11.30.0/NETworkManager_2021.11.30.0_Archive.zip){:target="_blank"}| `5F72238031B7DB28F885BD8E74046734BDBCA37E4DFC5110ADB75EB216C50DF1` | - -**New system requirements** -- Windows 10 / Server x64 (1809 or later) -- [.NET Desktop Runtime 6.x (LTS)](https://dotnet.microsoft.com/download/dotnet/6.0){:target="_blank"} -- [Microsoft Edge - WebView2 Runtime (Evergreen)](https://developer.microsoft.com/en-us/microsoft-edge/webview2/){:target="_blank"} - -## What's new? -- Migrated to .net 6.0 - -## Improvements -- Discovery Protocol - PSDiscoveryProtocol updated to version 1.4.1 [](https://github.com/BornToBeRoot/NETworkManager/pull/1308){:target="_blank"} - -## Bugfixes -- Chinese language files are now available [#1308](https://github.com/BornToBeRoot/NETworkManager/issues/1284){:target="_blank"} -- Remote Desktop - Connection dialog now allows `host` and `host:port` [#1284](https://github.com/BornToBeRoot/NETworkManager/issues/1284){:target="_blank"} -- PowerShell/PuTTY/TigerVNC - Flickering fixed when process terminates [#1304](https://github.com/BornToBeRoot/NETworkManager/issues/1304){:target="_blank"} - -## Other -- Language files updated [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration){:target="_blank"} -- Dependencies updated [#dependencies](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Fdependabot){:target="_blank"} diff --git a/docs/Changelog/2021-2-17-0.md b/docs/Changelog/2021-2-17-0.md deleted file mode 100644 index d0fe49b071..0000000000 --- a/docs/Changelog/2021-2-17-0.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -layout: default -title: 2021.2.17.0 -parent: Changelog -nav_order: 988 -description: "Changelog for version 2021.2.17.0" -permalink: /Changelog/2021-2-17-0 ---- - -# 2021.2.17.0 -Date: **17.02.2021** - -| File | Checksum [SHA256] | -|---|---| -|[Setup](https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.2.17.0/NETworkManager_2021.2.17.0_Setup.exe){:target="_blank"}| `5BDD82CA59CC0A635559848CA183C21ED92D4D0C143625F1B367946F033E2A79` | -|[Portable](https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.2.17.0/NETworkManager_2021.2.17.0_Portable.zip){:target="_blank"}| `4D5AA9CC1A4FCE5AB80060A1009E87FA207D642B7E25A63A4DA38F9F6FD43472` | -|[Archive](https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.2.17.0/NETworkManager_2021.2.17.0_Archive.zip){:target="_blank"}| `9996197F0F58A7A23F0A78DB7336D4201F98F1C6E8CCD7D02BF97095C5A6DDA8` | - -## What's new? -- Profile files can be encrypted with a master password. Backup your profile files `%AppData%\NETworkManager\Profiles` or in `APPLICATIONROOT\Profiles` (portable version) before you use this feature. There may be some issues :) More infos in the [FAQ](https://borntoberoot.net/NETworkManager/FAQ){:target="_blank"}. You can review the changes and code here [#226](https://github.com/BornToBeRoot/NETworkManager/issues/226){:target="_blank"} [#464](https://github.com/BornToBeRoot/NETworkManager/pull/464){:target="_blank"} -- CodeQL for automated code security analysis added -- Code of conduct, security policy and contributing guidelines added [#450](https://github.com/BornToBeRoot/NETworkManager/issues/450){:target="_blank"} -- Change version number to `YEAR.MONTH.DAY.PATCH` [#474](https://github.com/BornToBeRoot/NETworkManager/issues/474){:target="_blank"} - -## Improvements -- Move profile files reworked / improved [#226](https://github.com/BornToBeRoot/NETworkManager/issues/226){:target="_blank"} [#472](https://github.com/BornToBeRoot/NETworkManager/issues/472){:target="_blank"} [#473](https://github.com/BornToBeRoot/NETworkManager/issues/473){:target="_blank"} -- Move settings improved [#472](https://github.com/BornToBeRoot/NETworkManager/issues/472){:target="_blank"} [#473](https://github.com/BornToBeRoot/NETworkManager/issues/473){:target="_blank"} - -## Bugfixes -- Prevent app crash if profile is corrupted [#270](https://github.com/BornToBeRoot/NETworkManager/issues/270){:target="_blank"} -- Prevent app crash if network interface (type 53) has no mac address [#458](https://github.com/BornToBeRoot/NETworkManager/issues/458){:target="_blank"} -- Wrong flags `sl-SI` and `zh-TW` fixed [#438](https://github.com/BornToBeRoot/NETworkManager/issues/438){:target="_blank"} -- UI improved / Link color fixed - -## Other -- Libaries updated -- Language files updated diff --git a/docs/Changelog/2021-3-14-0.md b/docs/Changelog/2021-3-14-0.md deleted file mode 100644 index 44d6647316..0000000000 --- a/docs/Changelog/2021-3-14-0.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -layout: default -title: 2021.3.14.0 -parent: Changelog -nav_order: 987 -description: "Changelog for version 2021.3.14.0" -permalink: /Changelog/2021-3-14-0 ---- - -# 2021.3.14.0 -Date: **14.03.2021** - -| File | Checksum [SHA256] | -|---|---| -|[Setup](https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.3.14.0/NETworkManager_2021.3.14.0_Setup.exe){:target="_blank"}| `B87F9E4AC704F0FF55A7A41DEA27D9A47CA160D64179A6F1FC3638A1DAFEAD2B` | -|[Portable](https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.3.14.0/NETworkManager_2021.3.14.0_Portable.zip){:target="_blank"}| `92B362B50ACC2685235DEB4002C75C6005FA2978E2B3F25B297854504A8E22F7` | -|[Archive](https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.3.14.0/NETworkManager_2021.3.14.0_Archive.zip){:target="_blank"}| `451A24B0AC8C2E63A15F5370EC2FC11E3957086BA272BDD17B00EB1D03E8E342` | - -## What's new? -- Bugfixes & improvements only - -## Improvements -- WiFi - Refresh network in background when button is clicked or autorefresh is enabled [#445](https://github.com/BornToBeRoot/NETworkManager/issues/445){:target="_blank"} -- WiFi - Display the SSID from hidden networks as "Hidden Network". This is the same way Windows displays them. [#487](https://github.com/BornToBeRoot/NETworkManager/issues/487){:target="_blank"} -- WiFi > Channel - Add refresh and autorefresh button/checkbox [#486](https://github.com/BornToBeRoot/NETworkManager/issues/486){:target="_blank"} -- Host added to profiles view - -## Bugfixes -- Documentation restructured [#568](https://github.com/BornToBeRoot/NETworkManager/issues/568){:target="_blank"} -- Network Interface - Disable `Add IPv4 address...` button if network adapter is not connected [#484](https://github.com/BornToBeRoot/NETworkManager/issues/484){:target="_blank"} -- Dialog button style fixed and button order changed [#328](https://github.com/BornToBeRoot/NETworkManager/issues/328){:target="_blank"} - -## Other -- Code refactored [#485](https://github.com/BornToBeRoot/NETworkManager/issues/485){:target="_blank"} -- Transifex Github integration added -- Language files updated - diff --git a/docs/Changelog/2021-3-28-0.md b/docs/Changelog/2021-3-28-0.md deleted file mode 100644 index f0d116dd3f..0000000000 --- a/docs/Changelog/2021-3-28-0.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -layout: default -title: 2021.3.28.0 -parent: Changelog -nav_order: 986 -description: "Changelog for version 2021.3.28.0" -permalink: /Changelog/2021-3-28-0 ---- - -# 2021.3.28.0 -Date: **28.03.2021** - -| File | Checksum [SHA256] | -|---|---| -|[Setup](https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.3.28.0/NETworkManager_2021.3.28.0_Setup.exe){:target="_blank"}| `3153DE224DA69511331C07B89CF4738914BDBE9AFEE59C5BD289E657449CCC43` | -|[Portable](https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.3.28.0/NETworkManager_2021.3.28.0_Portable.zip){:target="_blank"}| `D295B260F56416792E455AED6069ECA545F36A80B192BFE04D2D2B9D64598855` | -|[Archive](https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.3.28.0/NETworkManager_2021.3.28.0_Archive.zip){:target="_blank"}| `6C5E003DC820B75B2B7C1381F2AE2F0D3AEF13EE84F67AE6EFBC235342B94490` | - -## What's new? -- Remote Desktop - Credentials can be stored in the profile. You should encrypt the profile file in the Settings>Profile with a master password and create a backup of your profile files. [#378](https://github.com/BornToBeRoot/NETworkManager/issues/378){:target="_blank"} -- WiFi - export as CSV, XML or JSON added [#429](https://github.com/BornToBeRoot/NETworkManager/issues/429){:target="_blank"} -- Language Korean (ko-KR) added [#584](https://github.com/BornToBeRoot/NETworkManager/issues/584){:target="_blank"} - -## Improvements -- SNMP - Community/Priv/Auth text boxes replaced with password boxes [#128](https://github.com/BornToBeRoot/NETworkManager/issues/128){:target="_blank"} -- Minimum window size set to 1280x798 to display the profile dialog correct [#378](https://github.com/BornToBeRoot/NETworkManager/issues/378){:target="_blank"} - -## Bugfixes -- Profile dialog height fixed [#594](https://github.com/BornToBeRoot/NETworkManager/issues/594){:target="_blank"} -- Dialog button FontSize fixed [MahApps/MahApps.Metro#594](https://github.com/MahApps/MahApps.Metro/issues/4069){:target="_blank"} -- ContextMenu sub menu border brush fixed [#324](https://github.com/BornToBeRoot/NETworkManager/issues/324){:target="_blank"} -- Design of some buttons fixed [#591](https://github.com/BornToBeRoot/NETworkManager/issues/591){:target="_blank"} -- SNMP v3 priv min length removed due to a change in the lib [#128](https://github.com/BornToBeRoot/NETworkManager/issues/128){:target="_blank"} -- More string in the about view added to the translation strings [#440](https://github.com/BornToBeRoot/NETworkManager/issues/440){:target="_blank"} - -## Other -- Code refactored / cleanup - - async void with async task replaced [#383](https://github.com/BornToBeRoot/NETworkManager/issues/383){:target="_blank"} -- Percent completed in the settings\language removed, because the statistics are broken and hard to maintain since the transifex github integration was added [#584](https://github.com/BornToBeRoot/NETworkManager/issues/584){:target="_blank"} diff --git a/docs/Changelog/2021-5-9-0.md b/docs/Changelog/2021-5-9-0.md deleted file mode 100644 index a1a3f46811..0000000000 --- a/docs/Changelog/2021-5-9-0.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -layout: default -title: 2021.5.9.0 -parent: Changelog -nav_order: 985 -description: "Changelog for version 2021.5.9.0" -permalink: /Changelog/2021-5-9-0 ---- - -# Version 2021.5.9.0 -Date: **09.05.2021** - -| File | Checksum [SHA256] | -|---|---| -|[Setup](https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.5.9.0/NETworkManager_2021.5.9.0_Setup.exe){:target="_blank"}| `1D44A5A07975A8364DE742E061E0D72B3DD1CC03E02F4D87103A0767E3C7F7A2` | -|[Portable](https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.5.9.0/NETworkManager_2021.5.9.0_Portable.zip){:target="_blank"}| `ED3DC6DFC111A3261DC6BF3F3D2820E0A1FF96ECF48A3C7DFBF3454A39694848` | -|[Archive](https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.5.9.0/NETworkManager_2021.5.9.0_Archive.zip){:target="_blank"}| `DD0B800EA55B97BA0A6B3A5884D62FCE2C4E74EAB1CCE01163823EBD30DC9B4E` | - -## What's new? -- Dashboard and Status window redesigned and IPv6 added [#463](https://github.com/BornToBeRoot/NETworkManager/issues/463){:target="_blank"} - -## Improvements -- Discovery Protocol script updated and more values added [#772](https://github.com/BornToBeRoot/NETworkManager/issues/772){:target="_blank"} - -## Bugfixes -- Fix app crash on Discovery Protocol view [#707](https://github.com/BornToBeRoot/NETworkManager/issues/707){:target="_blank"} -- Fix values in Discovery Protocol [#772](https://github.com/BornToBeRoot/NETworkManager/issues/772){:target="_blank"} -- Fix NetEventSession (if session is opened / crashed) in Discovery Protocol [#241](https://github.com/BornToBeRoot/NETworkManager/issues/241){:target="_blank"} -- App crash fixed when Remote Desktop is opened from a differnet view [#767](https://github.com/BornToBeRoot/NETworkManager/issues/767){:target="_blank"} - -## Other -- Language files updated [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration){:target="_blank"} -- Dependencies updated [#dependencies](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Fdependabot){:target="_blank"} diff --git a/docs/Changelog/2021-6-26-0.md b/docs/Changelog/2021-6-26-0.md deleted file mode 100644 index 5afd646ad3..0000000000 --- a/docs/Changelog/2021-6-26-0.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -layout: default -title: 2021.6.26.0 -parent: Changelog -nav_order: 984 -description: "Changelog for version 2021.6.26.0" -permalink: /Changelog/2021-6-26-0 ---- - -# Version 2021.6.26.0 -Date: **26.06.2021** - -| File | Checksum [SHA256] | -|---|---| -|[Setup](https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.6.26.0/NETworkManager_2021.6.26.0_Setup.exe){:target="_blank"}| `EAA8D1CC1F76FABD0C26DF70B9E23A21F9F83355D70D0FCCD43E5677A1AE7EAE` | -|[Portable](https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.6.26.0/NETworkManager_2021.6.26.0_Portable.zip){:target="_blank"}| `02A98625966C6229E4EC23463B3B7607365668CC1B63F47D563C26FF764710CE` | -|[Archive](https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.6.26.0/NETworkManager_2021.6.26.0_Archive.zip){:target="_blank"}| `3C23B74EEBC8CF113D8F536F6D9D2BBC6CB3CCF1BABEF0275B9101D84A45ADDB` | - -## What's new? -- Network Interface - Remove IPv4 address added [#212](https://github.com/BornToBeRoot/NETworkManager/issues/212){:target="_blank"} -- NETworkManager is now available on WinGet `winget install BornToBeRoot.NETworkManager` - -## Bugfixes -- Dashbaord - Regex for IPv4 fixed [#841](https://github.com/BornToBeRoot/NETworkManager/issues/841){:target="_blank"} -- IP Scanner - Custom commands fixed [2e53b292f1dca7808fed509aa9ac39e009a3030f](https://github.com/BornToBeRoot/NETworkManager/commit/2e53b292f1dca7808fed509aa9ac39e009a3030f){:target="_blank"} -- Remote Desktop - Add disconnect reason 4 [#845](https://github.com/BornToBeRoot/NETworkManager/issues/845){:target="_blank"} -- Close/Minimize/Maximize buttons not visible in light theme - -## Other -- Language files updated [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration){:target="_blank"} -- Dependencies updated [#dependencies](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Fdependabot){:target="_blank"} diff --git a/docs/Changelog/2021-9-5-0.md b/docs/Changelog/2021-9-5-0.md deleted file mode 100644 index 5751e17cc4..0000000000 --- a/docs/Changelog/2021-9-5-0.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -layout: default -title: 2021.9.5.0 -parent: Changelog -nav_order: 983 -description: "Changelog for version 2021.9.5.0" -permalink: /Changelog/2021-9-5-0 ---- - -# Version 2021.9.5.0 -Date: **05.09.2021** - -| File | Checksum [SHA256] | -|---|---| -|[Setup](https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.9.5.0/NETworkManager_2021.9.5.0_Setup.exe){:target="_blank"}| `883188AD58FB936FCA82846A261840F67E19734C20093996CBCDA75F4CE41EAA` | -|[Portable](https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.9.5.0/NETworkManager_2021.9.5.0_Portable.zip){:target="_blank"}| `F186755939FC2A5A07C2D5BDED59128189D16968FD61DF8E17C100E181B3C39D` | -|[Archive](https://github.com/BornToBeRoot/NETworkManager/releases/download/2021.9.5.0/NETworkManager_2021.9.5.0_Archive.zip){:target="_blank"}| `E9680A1C52270A5B2AB192AADE08563CB3509CDCD3EF3F9BA2603CE3BB84DF45` | - -## What's new? -- Czech added [#1221](https://github.com/BornToBeRoot/NETworkManager/pull/1221){:target="_blank"} -- Chinese added to InnoSetup [#1224](https://github.com/BornToBeRoot/NETworkManager/pull/1224){:target="_blank"} - -## Improvements -- Remote Desktop - Connection dialog now allows `hostname:port` [#1214](https://github.com/BornToBeRoot/NETworkManager/issues/1214){:target="_blank"} - -## Bugfixes -- Remote Desktop - Settings when connecting without profile are now applied [#1214](https://github.com/BornToBeRoot/NETworkManager/issues/1214){:target="_blank"} - -## Other -- Language files updated [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration){:target="_blank"} -- Dependencies updated [#dependencies](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Fdependabot){:target="_blank"} diff --git a/docs/Changelog/next-release.md b/docs/Changelog/next-release.md deleted file mode 100644 index e7cabe7566..0000000000 --- a/docs/Changelog/next-release.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -layout: default -title: Next release -parent: Changelog -nav_order: 1 -description: "Changelog for next release" -permalink: /Changelog/next-release ---- - -# Next release - -**System requirements** -- Windows 10 / Server x64 (1809 or later) -- [.NET Desktop Runtime 6.x (LTS)](https://dotnet.microsoft.com/download/dotnet/6.0){:target="_blank"} -- [Microsoft Edge - WebView2 Runtime (Evergreen)](https://developer.microsoft.com/en-us/microsoft-edge/webview2/){:target="_blank"} - -## What's new? -- - -## Improvements -- Profile migration dialog improved [#1393](https://github.com/BornToBeRoot/NETworkManager/pull/1393){:target="_blank"} - -## Bugfixes -- - -## Other -- Language files updated [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration){:target="_blank"} -- Dependencies updated [#dependencies](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Fdependabot){:target="_blank"} diff --git a/docs/Documentation/01_Application.md b/docs/Documentation/01_Application.md deleted file mode 100644 index 1311f39b68..0000000000 --- a/docs/Documentation/01_Application.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -layout: default -title: Application -parent: Documentation -has_children: true -nav_order: 1 -description: "Documentation of all applications." -permalink: /Documentation/Application ---- \ No newline at end of file diff --git a/docs/Documentation/01_Application/01_Dashboard.md b/docs/Documentation/01_Application/01_Dashboard.md deleted file mode 100644 index a3636e4310..0000000000 --- a/docs/Documentation/01_Application/01_Dashboard.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -layout: default -title: Dashboard -parent: Application -grand_parent: Documentation -nav_order: 1 -description: "" -permalink: /Documentation/Application/Dashboard ---- - -# Dashboard -The dashboard checks automatically and whenever the status of the local network adapters changes (network cable plugged in, WLAN connected, etc.) whether there is a connection to the router and the Internet. - -![Dashboard](01_Dashboard.png) - -## Settings - -### Public IPv4 address -A public IPv4 address that is reachable via ICMP. - -**Default** -``` -1.1.1.1 -``` - -### Public IPv6 address -A public IPv6 address that is reachable via ICMP. - -**Default** -``` -2606:4700:4700::1111 -``` - -### Check public IP address -Enables or disables the resolution of the public IP address via [`api.ipify.org`](https://www.ipify.org/){:target="_blank"} and [`api6.ipify.org`](https://www.ipify.org/){:target="_blank"}. - -**Default** -``` -Enabled -``` - -### Use custom IPv4 address API -Override the default IPv4 address API to resolve the public IP address. The API should return only a plain text IPv4 address like `xx.xx.xx.xx`. - -**Default** -``` -Disabled -``` - -**Examples Values** -- [`api.ipify.org`](https://api.ipify.org/){:target="_blank"} -- [`ip4.seeip.org`](https://ip4.seeip.org/){:target="_blank"} -- [`api.my-ip.io/ip`](https://api.my-ip.io/ip){:target="_blank"} - -### Use custom IPv6 address API -Override the default IPv6 address API to resolve the public IP address. The API should return only a plain text IPv6 address like `xxxx:xx:xxx::xx`. - -**Default** -``` -Disabled -``` - -**Examples Values** -- [`api6.ipify.org`](https://api6.ipify.org/){:target="_blank"} \ No newline at end of file diff --git a/docs/Documentation/01_Application/01_Dashboard.png b/docs/Documentation/01_Application/01_Dashboard.png deleted file mode 100644 index db46b4cde5..0000000000 Binary files a/docs/Documentation/01_Application/01_Dashboard.png and /dev/null differ diff --git a/docs/Documentation/01_Application/02_NetworkInterface.md b/docs/Documentation/01_Application/02_NetworkInterface.md deleted file mode 100644 index ac29f938c2..0000000000 --- a/docs/Documentation/01_Application/02_NetworkInterface.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -layout: default -title: Network Interface -parent: Application -grand_parent: Documentation -nav_order: 2 -description: "" -permalink: /Documentation/Application/NetworkInterface ---- - -# Network Interface -The tool **Network Interface** detects all network adapter of the computer with the most important information (like IP addresses, DNS servers etc.). The bandwidth of the connected network adapter can be monitored and the configuration can be changed via profiles. - -## Information -In the Information view, you can see all the important details of the selected network adapter such as the configured IP addresses, DNS servers, MAC address, and more. If information such as IPv6 configuration is not available, it is hidden in the view. - -![NetworkInterface_Information](02_NetworkInterface_Information.png) - -## Bandwidth -The bandwith of the selected network adapter is monitored as long as the tool **Network Interface** is selected. If you switch to another tool, the monitoring is paused and will be reset once you switch back again. - -You can see the current download and upload speed in Bit/s (B/s). Depending on the bandwith you are using its automatically adjusting to KBit/s (KB/s), MBit/s (MB/s) or GBit/s (GB/s). It also displays since when the bandwidth is measured and how much has been downloaded and uploaded since then. - -![NetworkInterface_Bandwidth](02_NetworkInterface_Bandwidth.png) - -## Configure - -In the configuration view you can change the configuration of the selected network adapter. To change the settings, the network adapter must be connected. The options you can set correspond to the network adapter properties `Internetprotokoll, Version 4 (TCP/IPv4) Properties` in the `Control Panel > Network and Internet > Network Connections`. These are explained in the [profiles section](#profile). Clicking the **Apply** button will launch an elevated PowerShell to configure the network adapter. - -The **Add IPv4-address...** button will open a dialog where you can enter an additional IPv4 address and a subnetmask. If you click the the **Add** button, it willbe assigned to the selected network adapter. - -![NetworkInterface_Configure](02_NetworkInterface_Configure.png) - -## Profile \ No newline at end of file diff --git a/docs/Documentation/01_Application/02_NetworkInterface_Bandwidth.png b/docs/Documentation/01_Application/02_NetworkInterface_Bandwidth.png deleted file mode 100644 index 8ee6a07a36..0000000000 Binary files a/docs/Documentation/01_Application/02_NetworkInterface_Bandwidth.png and /dev/null differ diff --git a/docs/Documentation/01_Application/02_NetworkInterface_Configure.png b/docs/Documentation/01_Application/02_NetworkInterface_Configure.png deleted file mode 100644 index 5aab1774de..0000000000 Binary files a/docs/Documentation/01_Application/02_NetworkInterface_Configure.png and /dev/null differ diff --git a/docs/Documentation/01_Application/02_NetworkInterface_Information.png b/docs/Documentation/01_Application/02_NetworkInterface_Information.png deleted file mode 100644 index f24b09ea90..0000000000 Binary files a/docs/Documentation/01_Application/02_NetworkInterface_Information.png and /dev/null differ diff --git a/docs/Documentation/01_Application/03_WiFi.md b/docs/Documentation/01_Application/03_WiFi.md deleted file mode 100644 index 90883ecbb6..0000000000 --- a/docs/Documentation/01_Application/03_WiFi.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -layout: default -title: WiFi -parent: Application -grand_parent: Documentation -nav_order: 3 -description: "" -permalink: /Documentation/Application/WiFi ---- - -# WiFi -The WiFi shows all available wireless networks with additional details such as channel, signal strength or the type of encryption used. - -Hidden wireless networks are displayed as `Hidden Network`. - -## WiFi - -You can select which wireless network adapter is used to scan for wireless networks. Wireless networks can be filtered by 2.4 Ghz, 5 Ghz and the SSID. - -Due to limitations of the `Windows.Devices.WiFi` API the channel bandwidth cannot be detected. - -![WiFi](03_WiFi.png) - -## Channels - -In the channels view, all wireless networks are displayed graphically, with channel and signal strength. This can be useful to identify overlapping wireless networks that are not from the same access point. - -You can move the mouse over the channel to display all wireless networks that occupy this channel. - -![WiFi_Channel](03_WiFi_Channel.png) \ No newline at end of file diff --git a/docs/Documentation/01_Application/03_WiFi.png b/docs/Documentation/01_Application/03_WiFi.png deleted file mode 100644 index 9dd26e856b..0000000000 Binary files a/docs/Documentation/01_Application/03_WiFi.png and /dev/null differ diff --git a/docs/Documentation/01_Application/03_WiFi_Channel.png b/docs/Documentation/01_Application/03_WiFi_Channel.png deleted file mode 100644 index 3d776828c4..0000000000 Binary files a/docs/Documentation/01_Application/03_WiFi_Channel.png and /dev/null differ diff --git a/docs/Documentation/01_Application/04_IPScanner.md b/docs/Documentation/01_Application/04_IPScanner.md deleted file mode 100644 index f7f9554e3b..0000000000 --- a/docs/Documentation/01_Application/04_IPScanner.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -layout: default -title: IP Scanner -parent: Application -grand_parent: Documentation -nav_order: 4 -description: "" -permalink: /Documentation/Application/IPScanner ---- - -# IP Scanner - -![IPScanner](04_IPScanner.png) - -## Profile - -## Settings \ No newline at end of file diff --git a/docs/Documentation/01_Application/04_IPScanner.png b/docs/Documentation/01_Application/04_IPScanner.png deleted file mode 100644 index 8fef43518c..0000000000 Binary files a/docs/Documentation/01_Application/04_IPScanner.png and /dev/null differ diff --git a/docs/Documentation/01_Application/05_PortScanner.md b/docs/Documentation/01_Application/05_PortScanner.md deleted file mode 100644 index 6d0eb9b63c..0000000000 --- a/docs/Documentation/01_Application/05_PortScanner.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -layout: default -title: Port Scanner -parent: Application -grand_parent: Documentation -nav_order: 5 -description: "" -permalink: /Documentation/Application/PortScanner ---- - -# Port Scanner - -![PortScanner](05_PortScanner.png) - -## Profile - -## Settings \ No newline at end of file diff --git a/docs/Documentation/01_Application/05_PortScanner.png b/docs/Documentation/01_Application/05_PortScanner.png deleted file mode 100644 index 653e6d836b..0000000000 Binary files a/docs/Documentation/01_Application/05_PortScanner.png and /dev/null differ diff --git a/docs/Documentation/01_Application/06_PingMonitor.md b/docs/Documentation/01_Application/06_PingMonitor.md deleted file mode 100644 index 3e27c5b79f..0000000000 --- a/docs/Documentation/01_Application/06_PingMonitor.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -layout: default -title: Ping Monitor -parent: Application -grand_parent: Documentation -nav_order: 6 -description: "" -permalink: /Documentation/Application/PingMonitor ---- - -# Ping Monitor - -![PingMonitor](06_PingMonitor.png) - -## Profile - -## Settings \ No newline at end of file diff --git a/docs/Documentation/01_Application/06_PingMonitor.png b/docs/Documentation/01_Application/06_PingMonitor.png deleted file mode 100644 index 2225cf9f22..0000000000 Binary files a/docs/Documentation/01_Application/06_PingMonitor.png and /dev/null differ diff --git a/docs/Documentation/01_Application/07_Traceroute.md b/docs/Documentation/01_Application/07_Traceroute.md deleted file mode 100644 index e12fbb4296..0000000000 --- a/docs/Documentation/01_Application/07_Traceroute.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -layout: default -title: Traceroute -parent: Application -grand_parent: Documentation -nav_order: 7 -description: "" -permalink: /Documentation/Application/Traceroute ---- - -# Traceroute - -![Traceroute](07_Traceroute.png) - -## Profile - -## Settings \ No newline at end of file diff --git a/docs/Documentation/01_Application/07_Traceroute.png b/docs/Documentation/01_Application/07_Traceroute.png deleted file mode 100644 index 7916c148bf..0000000000 Binary files a/docs/Documentation/01_Application/07_Traceroute.png and /dev/null differ diff --git a/docs/Documentation/01_Application/08_DNSLookup.md b/docs/Documentation/01_Application/08_DNSLookup.md deleted file mode 100644 index dbd3417110..0000000000 --- a/docs/Documentation/01_Application/08_DNSLookup.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -layout: default -title: DNS Lookup -parent: Application -grand_parent: Documentation -nav_order: 8 -description: "" -permalink: /Documentation/Application/DNSLookup ---- - -# DNS Lookup - -![DNSLookup](08_DNSLookup.png) - -## Profile - -## Settings \ No newline at end of file diff --git a/docs/Documentation/01_Application/08_DNSLookup.png b/docs/Documentation/01_Application/08_DNSLookup.png deleted file mode 100644 index 9e8e85230f..0000000000 Binary files a/docs/Documentation/01_Application/08_DNSLookup.png and /dev/null differ diff --git a/docs/Documentation/01_Application/09_RemoteDesktop.md b/docs/Documentation/01_Application/09_RemoteDesktop.md deleted file mode 100644 index 07ee92f7fa..0000000000 --- a/docs/Documentation/01_Application/09_RemoteDesktop.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -layout: default -title: Remote Desktop -parent: Application -grand_parent: Documentation -nav_order: 9 -description: "" -permalink: /Documentation/Application/RemoteDesktop ---- - - -# Remote Desktop - -![RemoteDesktop](09_RemoteDesktop.png) - -## Profile - -## Settings \ No newline at end of file diff --git a/docs/Documentation/01_Application/09_RemoteDesktop.png b/docs/Documentation/01_Application/09_RemoteDesktop.png deleted file mode 100644 index 5413156520..0000000000 Binary files a/docs/Documentation/01_Application/09_RemoteDesktop.png and /dev/null differ diff --git a/docs/Documentation/01_Application/10_PowerShell.md b/docs/Documentation/01_Application/10_PowerShell.md deleted file mode 100644 index 1bb9a8760d..0000000000 --- a/docs/Documentation/01_Application/10_PowerShell.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -layout: default -title: PowerShell -parent: Application -grand_parent: Documentation -nav_order: 10 -description: "" -permalink: /Documentation/Application/PowerShell ---- - - -# PowerShell - -![PowerShell](10_PowerShell.png) - -## Profile - -## Settings \ No newline at end of file diff --git a/docs/Documentation/01_Application/10_PowerShell.png b/docs/Documentation/01_Application/10_PowerShell.png deleted file mode 100644 index aa898039be..0000000000 Binary files a/docs/Documentation/01_Application/10_PowerShell.png and /dev/null differ diff --git a/docs/Documentation/01_Application/11_PuTTY.md b/docs/Documentation/01_Application/11_PuTTY.md deleted file mode 100644 index 5bd119297c..0000000000 --- a/docs/Documentation/01_Application/11_PuTTY.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -layout: default -title: PuTTY -parent: Application -grand_parent: Documentation -nav_order: 11 -description: "" -permalink: /Documentation/Application/PuTTY ---- - - -# PuTTY - -![PuTTY](11_PuTTY.png) - -## Profile - -## Settings \ No newline at end of file diff --git a/docs/Documentation/01_Application/11_PuTTY.png b/docs/Documentation/01_Application/11_PuTTY.png deleted file mode 100644 index f0ba0c782a..0000000000 Binary files a/docs/Documentation/01_Application/11_PuTTY.png and /dev/null differ diff --git a/docs/Documentation/01_Application/12_TigerVNC.md b/docs/Documentation/01_Application/12_TigerVNC.md deleted file mode 100644 index d57134ec99..0000000000 --- a/docs/Documentation/01_Application/12_TigerVNC.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: default -title: TigerVNC -parent: Application -grand_parent: Documentation -nav_order: 12 -description: "" -permalink: /Documentation/Application/TigerVNC ---- - - -# TigerVNC - -You can download TigerVNC from the [offical site](https://tigervnc.org/){:target="_blank"}. - -The path to `vncviewer-x.x.x.exe` or` vncviewer64-x.x.x.exe` must be added in the settings. - -![TigerVNC](12_TigerVNC.png) - -## Profile - -## Settings \ No newline at end of file diff --git a/docs/Documentation/01_Application/12_TigerVNC.png b/docs/Documentation/01_Application/12_TigerVNC.png deleted file mode 100644 index 3a57faa394..0000000000 Binary files a/docs/Documentation/01_Application/12_TigerVNC.png and /dev/null differ diff --git a/docs/Documentation/01_Application/13_WebConsole.md b/docs/Documentation/01_Application/13_WebConsole.md deleted file mode 100644 index 498a6ee306..0000000000 --- a/docs/Documentation/01_Application/13_WebConsole.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -layout: default -title: WebConsole -parent: Application -grand_parent: Documentation -nav_order: 13 -description: "" -permalink: /Documentation/Application/WebConsole ---- - -# Web Console - -![WebConsole](13_WebConsole.png) - -## Profile \ No newline at end of file diff --git a/docs/Documentation/01_Application/13_WebConsole.png b/docs/Documentation/01_Application/13_WebConsole.png deleted file mode 100644 index 94a081b970..0000000000 Binary files a/docs/Documentation/01_Application/13_WebConsole.png and /dev/null differ diff --git a/docs/Documentation/01_Application/14_SNMP.md b/docs/Documentation/01_Application/14_SNMP.md deleted file mode 100644 index 73c4ab0844..0000000000 --- a/docs/Documentation/01_Application/14_SNMP.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -layout: default -title: SNMP -parent: Application -grand_parent: Documentation -nav_order: 14 -description: "" -permalink: /Documentation/Application/SNMP ---- - -# SNMP - -![SNMP](14_SNMP.png) - -## Settings - diff --git a/docs/Documentation/01_Application/14_SNMP.png b/docs/Documentation/01_Application/14_SNMP.png deleted file mode 100644 index 6c0a124d01..0000000000 Binary files a/docs/Documentation/01_Application/14_SNMP.png and /dev/null differ diff --git a/docs/Documentation/01_Application/15_DiscoveryProtocol.md b/docs/Documentation/01_Application/15_DiscoveryProtocol.md deleted file mode 100644 index 88cb75d211..0000000000 --- a/docs/Documentation/01_Application/15_DiscoveryProtocol.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -layout: default -title: Discovery Protocol -parent: Application -grand_parent: Documentation -nav_order: 15 -description: "" -permalink: /Documentation/Application/DiscoveryProtocol ---- - - -# Discovery Protocol - -![DiscoveryProtocol](15_DiscoveryProtocol.png) \ No newline at end of file diff --git a/docs/Documentation/01_Application/15_DiscoveryProtocol.png b/docs/Documentation/01_Application/15_DiscoveryProtocol.png deleted file mode 100644 index f18975c530..0000000000 Binary files a/docs/Documentation/01_Application/15_DiscoveryProtocol.png and /dev/null differ diff --git a/docs/Documentation/01_Application/16_WakeOnLAN.md b/docs/Documentation/01_Application/16_WakeOnLAN.md deleted file mode 100644 index 061bad203d..0000000000 --- a/docs/Documentation/01_Application/16_WakeOnLAN.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -layout: default -title: Wake on LAN -parent: Application -grand_parent: Documentation -nav_order: 16 -description: "" -permalink: /Documentation/Application/WakeOnLAN ---- - -# Wake on LAN - -![WakeOnLAN](16_WakeOnLAN.png) - -## Profile - -## Settings \ No newline at end of file diff --git a/docs/Documentation/01_Application/16_WakeOnLAN.png b/docs/Documentation/01_Application/16_WakeOnLAN.png deleted file mode 100644 index e9dd336e2b..0000000000 Binary files a/docs/Documentation/01_Application/16_WakeOnLAN.png and /dev/null differ diff --git a/docs/Documentation/01_Application/17_Whois.md b/docs/Documentation/01_Application/17_Whois.md deleted file mode 100644 index 61f40eba64..0000000000 --- a/docs/Documentation/01_Application/17_Whois.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -layout: default -title: Whois -parent: Application -grand_parent: Documentation -nav_order: 17 -description: "" -permalink: /Documentation/Application/Whois ---- - -# Whois - -![Whois](17_Whois.png) - -## Profile \ No newline at end of file diff --git a/docs/Documentation/01_Application/17_Whois.png b/docs/Documentation/01_Application/17_Whois.png deleted file mode 100644 index a734daeaca..0000000000 Binary files a/docs/Documentation/01_Application/17_Whois.png and /dev/null differ diff --git a/docs/Documentation/01_Application/18_SubnetCalculator.md b/docs/Documentation/01_Application/18_SubnetCalculator.md deleted file mode 100644 index 8a6d345156..0000000000 --- a/docs/Documentation/01_Application/18_SubnetCalculator.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -layout: default -title: Subnet Calculator -parent: Application -grand_parent: Documentation -nav_order: 18 -description: "" -permalink: /Documentation/Application/SubnetCalculator ---- - -# Subnet Calculator - -## Calculator - -![SubnetCalculator_Calculator](18_SubnetCalculator_Calculator.png) - -## Subnetting - -![SubnetCalculator_Subnetting](18_SubnetCalculator_Subnetting.png) - -## Wide Subnet - -![SubnetCalculator_WideSubnet](18_SubnetCalculator_WideSubnet.png) \ No newline at end of file diff --git a/docs/Documentation/01_Application/18_SubnetCalculator_Calculator.png b/docs/Documentation/01_Application/18_SubnetCalculator_Calculator.png deleted file mode 100644 index 8b34fefd8c..0000000000 Binary files a/docs/Documentation/01_Application/18_SubnetCalculator_Calculator.png and /dev/null differ diff --git a/docs/Documentation/01_Application/18_SubnetCalculator_Subnetting.png b/docs/Documentation/01_Application/18_SubnetCalculator_Subnetting.png deleted file mode 100644 index 3ebf84fac7..0000000000 Binary files a/docs/Documentation/01_Application/18_SubnetCalculator_Subnetting.png and /dev/null differ diff --git a/docs/Documentation/01_Application/18_SubnetCalculator_WideSubnet.png b/docs/Documentation/01_Application/18_SubnetCalculator_WideSubnet.png deleted file mode 100644 index 96604eabd0..0000000000 Binary files a/docs/Documentation/01_Application/18_SubnetCalculator_WideSubnet.png and /dev/null differ diff --git a/docs/Documentation/01_Application/19_Lookup.md b/docs/Documentation/01_Application/19_Lookup.md deleted file mode 100644 index c6b166ba3a..0000000000 --- a/docs/Documentation/01_Application/19_Lookup.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -layout: default -title: Lookup -parent: Application -grand_parent: Documentation -nav_order: 19 -description: "" -permalink: /Documentation/Application/Lookup ---- - -# Lookup - -## OUI - -![Lookup_OUI](19_Lookup_OUI.png) - -## Port - -![Lookup_Port](19_Lookup_Port.png) \ No newline at end of file diff --git a/docs/Documentation/01_Application/19_Lookup_OUI.png b/docs/Documentation/01_Application/19_Lookup_OUI.png deleted file mode 100644 index aa3ad235a8..0000000000 Binary files a/docs/Documentation/01_Application/19_Lookup_OUI.png and /dev/null differ diff --git a/docs/Documentation/01_Application/19_Lookup_Port.png b/docs/Documentation/01_Application/19_Lookup_Port.png deleted file mode 100644 index 1d0a620ba2..0000000000 Binary files a/docs/Documentation/01_Application/19_Lookup_Port.png and /dev/null differ diff --git a/docs/Documentation/01_Application/20_Connections.md b/docs/Documentation/01_Application/20_Connections.md deleted file mode 100644 index 14744dee06..0000000000 --- a/docs/Documentation/01_Application/20_Connections.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -layout: default -title: Conections -parent: Application -grand_parent: Documentation -nav_order: 20 -description: "" -permalink: /Documentation/Application/Connections ---- - -# Connections - -![Connections](20_Connections.png) \ No newline at end of file diff --git a/docs/Documentation/01_Application/20_Connections.png b/docs/Documentation/01_Application/20_Connections.png deleted file mode 100644 index a0b913b3e3..0000000000 Binary files a/docs/Documentation/01_Application/20_Connections.png and /dev/null differ diff --git a/docs/Documentation/01_Application/21_Listeners.md b/docs/Documentation/01_Application/21_Listeners.md deleted file mode 100644 index af4cb7f181..0000000000 --- a/docs/Documentation/01_Application/21_Listeners.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -layout: default -title: Listeners -parent: Application -grand_parent: Documentation -nav_order: 21 -description: "" -permalink: /Documentation/Application/Listeners ---- - -# Listeners - -![Listeners](21_Listeners.png) \ No newline at end of file diff --git a/docs/Documentation/01_Application/21_Listeners.png b/docs/Documentation/01_Application/21_Listeners.png deleted file mode 100644 index 9e0c4326ab..0000000000 Binary files a/docs/Documentation/01_Application/21_Listeners.png and /dev/null differ diff --git a/docs/Documentation/01_Application/22_ARPTable.md b/docs/Documentation/01_Application/22_ARPTable.md deleted file mode 100644 index 8b9b061374..0000000000 --- a/docs/Documentation/01_Application/22_ARPTable.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -layout: default -title: ARP Table -parent: Application -grand_parent: Documentation -nav_order: 22 -description: "" -permalink: /Documentation/Application/ARPTable ---- -# ARP Table - -![ARPTable](22_ARPTable.png) \ No newline at end of file diff --git a/docs/Documentation/01_Application/22_ARPTable.png b/docs/Documentation/01_Application/22_ARPTable.png deleted file mode 100644 index d2f800d22e..0000000000 Binary files a/docs/Documentation/01_Application/22_ARPTable.png and /dev/null differ diff --git a/docs/Documentation/02_CommandLine.md b/docs/Documentation/02_CommandLine.md deleted file mode 100644 index de9f0c00ca..0000000000 --- a/docs/Documentation/02_CommandLine.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -layout: default -title: Command line -parent: Documentation -has_children: true -nav_order: 2 -description: "" -permalink: /Documentation/CommandLine ---- \ No newline at end of file diff --git a/docs/Documentation/02_CommandLine/01_CommandLineArgs.md b/docs/Documentation/02_CommandLine/01_CommandLineArgs.md deleted file mode 100644 index 18ecd8d427..0000000000 --- a/docs/Documentation/02_CommandLine/01_CommandLineArgs.md +++ /dev/null @@ -1,86 +0,0 @@ ---- -layout: default -title: Command line arguments -parent: Command line -grand_parent: Documentation -nav_order: 1 -description: "Documentation of the command line arguments." -permalink: /Documentation/CommandLine/CommandLineArguments ---- - -# Command line arguments - -## Public -Publicly available command line arguments. - -### `--help` -Displays the help dialog. - -**Example** -``` -NETworkManager.exe --help -``` - -### `--reset-settings` -Resets all application settings. - -**Example** -``` -NETworkManager.exe --reset-settings -``` - -### `--application:` -Start a specific application on startup. - -**Possible values** - - `Dashboard` - - `NetworkInterface` - - `WiFi` - - `IPScanner` - - `PortScanner` - - `PingMonitor` - - `Traceroute` - - `DNSLookup` - - `RemoteDesktop` - - `PowerShell` - - `PuTTY` - - `TigerVNC` - - `WebConsole` - - `SNMP` - - `DiscoveryProtocol` - - `WakeOnLAN` - - `Whois` - - `SubnetCalculator` - - `Lookup` - - `Connections` - - `Listeners` - - `ARPTable` - -**Default** -``` -None -``` - -**Example** -``` -NETworkManager.exe --application:PingMonitor -``` - -## Internal -Internally used command line arguments. - -### `--autostart` -Indicates whether the application was started by autostart. - -**Example** -``` -NETworkManager.exe --autostart -``` - -### `--restart-pid:` -Passed when the application is restarted to wait for the old process to end. - -**Example** -``` -NETworkManager.exe --restart-pid:35674 -``` \ No newline at end of file diff --git a/docs/Logo.png b/docs/Logo.png deleted file mode 100644 index 72f9d866a1..0000000000 Binary files a/docs/Logo.png and /dev/null differ diff --git a/docs/Preview.gif b/docs/Preview.gif deleted file mode 100644 index 08377f2e52..0000000000 Binary files a/docs/Preview.gif and /dev/null differ diff --git a/docs/_config.yml b/docs/_config.yml deleted file mode 100644 index 8c153d2134..0000000000 --- a/docs/_config.yml +++ /dev/null @@ -1,23 +0,0 @@ -title: "NETworkManager" -description: "A powerful tool for managing networks and troubleshoot network problems!" -baseurl: "/NETworkManager" -url: "https://borntoberoot.net" -logo: "Logo.png" -remote_theme: "pmarsceill/just-the-docs" -color_scheme: "dark" -search_enabled: false -aux_links: - "View on GitHub": - - "//github.com/BornToBeRoot/NETworkManager" -aux_links_new_tab: true -heading_anchors: true -back_to_top: true -back_to_top_text: "Back to top" -gh_edit_link: true -gh_edit_link_text: "Edit this page on GitHub." -gh_edit_repository: "https://github.com/BornToBeRoot/NETworkManager" -gh_edit_branch: "master" -gh_edit_source: docs -gh_edit_view_mode: "tree" -plugins: - - jemoji \ No newline at end of file diff --git a/docs/_includes/footer_custom.html b/docs/_includes/footer_custom.html deleted file mode 100644 index 914a8511e3..0000000000 --- a/docs/_includes/footer_custom.html +++ /dev/null @@ -1 +0,0 @@ -Developed and maintained by BornToBeRoot with the help of the Community. \ No newline at end of file diff --git a/docs/_sass/color_schemes/custom.scss b/docs/_sass/color_schemes/custom.scss deleted file mode 100644 index 9fd8e8c573..0000000000 --- a/docs/_sass/color_schemes/custom.scss +++ /dev/null @@ -1,17 +0,0 @@ -$body-background-color: #17191a; -$sidebar-color: #17191a; -$border-color: $grey-dk-250; - -$body-text-color: $grey-lt-300; -$body-heading-color: $grey-lt-000; -$nav-child-link-color: $grey-dk-000; -$search-result-preview-color: #17191a; - -$link-color: #007bff; -$btn-primary-color: #007bff; -$base-button-color: $grey-dk-250; - -$code-background-color: #202020; -$search-background-color: #202020; -$table-background-color: #202020; -$feedback-color: darken($sidebar-color, 3%); \ No newline at end of file diff --git a/global.json b/global.json deleted file mode 100644 index 1df2464ee1..0000000000 --- a/global.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "sdk": { - "version": "6.0.200", - "rollForward": "latestMajor" - } -}